본문 바로가기
개발

[K8s] no basic auth credential 에러

by seaweed_one 2023. 11. 2.
728x90

클러스터 구축 중 katib 의 mysql 파드가 정상적으로 생성되지 않는 문제가 발생했습니다.
 

발생 에러 

발생한 에러는 no basic auth credential 에러입니다.
현재 환경에서는 Nexus Repository 를 구성해 운영하고 그곳에서 이미지를 pull 하게 됩니다.
그런데 아래 이벤트를 확인하시면 image registry에 접근할 수 없다는 에러를 확인할 수 있습니다.

Events:                                                                                                           │
│   Type     Reason                  Age                  From                     Message                          │
│   ----     ------                  ----                 ----                     -------                          │
│   Warning  FailedScheduling        11m                  default-scheduler        0/3 nodes are available: 3 pod h │
│ as unbound immediate PersistentVolumeClaims.                                                                      │
│   Warning  FailedScheduling        11m                  default-scheduler        0/3 nodes are available: 3 pod h │
│ as unbound immediate PersistentVolumeClaims.                                                                      │
│   Normal   Scheduled               11m                  default-scheduler        Successfully assigned kubeflow/k │
│ atib-mysql-5fbcfd878c-8gc7m to 66-140-w1-dev                                                                      │
│   Normal   SuccessfulAttachVolume  11m                  attachdetach-controller  AttachVolume.Attach succeeded fo │
│ r volume "pvc-d8c5593a-9caf-4bb3-b245-8f8ed01aa3e7"                                                               │
│   Warning  Failed                  10m (x6 over 11m)    kubelet                  Error: ImagePullBackOff          │
│   Normal   Pulling                 9m58s (x4 over 11m)  kubelet                  Pulling image "192.168.4.65:5000 │
│ /kubeflowkatib/mysql:seaweed.v1.1"                                                                                   │
│   Warning  Failed                  9m58s (x4 over 11m)  kubelet                  Failed to pull image "192.168.4. │
│ 65:5000/kubeflowkatib/mysql:seaweed.v1.1": rpc error: code = Unknown desc = Error response from daemon: Head "http:/ │
│ /192.168.4.65:5000/v2/kubeflowkatib/mysql/manifests/seaweed.v1.1": no basic auth credentials                         │
│   Warning  Failed                  9m58s (x4 over 11m)  kubelet                  Error: ErrImagePull              │
│   Normal   BackOff                 78s (x44 over 11m)   kubelet                  Back-off pulling image "192.168. │
│ 4.65:5000/kubeflowkatib/mysql:seaweedv1.1"

 


권한 검증

정말 권한이 없는지 검증을 해보겠습니다.
먼저 docker 에 로그인을 수행해봅니다.

docker login 

저는 ~/.docker/config.js 파일을 이용하고 있는데, 로그인 수행 시 인증 키가 등록됩니다.

vi ~/.docker/config.js


{
        "auths": {
                "192.168.4.65:5000": {
                        "auth": "YourAuthCode=="
                }
        }
}
~

 
해당 파일을 이용해 docker 에 로그인을 수행해봅니다.

[root@66-140-m-dev bin]# docker login 192.168.4.65:5000
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

 
아래 명령어를 통해서 접속 정보 확인도 가능합니다.
 

check secret 

[root@66-140-m-dev .docker]# kubectl get secret docker-login --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
{
        "auths": {
                "192.168.4.65:5000": {
                        "auth": "YourAuthCode=="
                }
        }

 
 

pull image

이번엔 docker pull 명령어를 이용해 직접 이미지를 당겨 확인해보겠습니다.

[root@66-140-m-dev ~]# docker pull 192.168.4.65:5000/kubeflowkatib/mysql:seaweed.v1.1
seaweeda.v1.1: Pulling from kubeflowkatib/mysql
Digest: sha256:44f98f4dd825a945d2a6a4b7b2f14127b5d07c5aaa07d9d232c2b58936fb76dc
Status: Image is up to date for 192.168.4.65:5000/kubeflowkatib/mysql:seaweed.v1.1
192.168.4.65:5000/kubeflowkatib/mysql:seaweed.v1.1

 
pull 이 정상적으로 이루어지는 것을 확인할 수 있습니다.
 


yaml 확인 

secret 과 image 에 문제가 없다면 yaml 파일을 확인해야겠습니다.
결과적으로 저의 경우는 yaml 파일에 쿠버네티스에서 도커 레지스트리에 접근하기 위한 secret 이 빠져 발생하는 에러였습니다.
해서 image pull 을 위한 secret 을 추가해주었습니다.

      imagePullSecrets: 
      - name: docker-login

 
spec 하위에 추가된 것을 확인하실 수 있습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    katib.kubeflow.org/component: mysql
  name: katib-mysql
  namespace: kubeflow
spec:
  replicas: 1
  selector:
    matchLabels:
      katib.kubeflow.org/component: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      annotations:
        sidecar.istio.io/inject: "false"
      labels:
        katib.kubeflow.org/component: mysql
    spec:
      imagePullSecrets:  # 추가 
      - name: docker-login # 추가 
      containers:
      - args:
        - --datadir
        - /var/lib/mysql/datadir
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              key: MYSQL_ROOT_PASSWORD
              name: katib-mysql-secrets
        - name: MYSQL_ALLOW_EMPTY_PASSWORD
          value: "true"
        - name: MYSQL_DATABASE
          value: katib
        image: {{repository.address}}/kubeflowkatib/mysql:seaweed.v1.1

 
secret 추가 후 파드가 정상적으로 생성되었습니다.

 
 


 
추가로 혹시나 시크릿 생성 테스트를 해보고싶으신 분들은 아래와 같이 진행하시면 됩니다.

# create secret
[root@66-140-m-dev .docker]# kubectl create secret generic regcred \
> --from-file=.dockerconfigjson=/root/.docker/config.json \
> --type=kubernetes.io/dockerconfigjson
secret/regcred created
 
 
# get secret info 
[root@66-140-m-dev .docker]# kubectl get secret testsecret --output=yaml
apiVersion: v1
data:
  .dockerconfigjson: ewoJImF1dGhzIjogewTIuMTY4LjQuNjU6NTAwMCI6IHsSdGFXNDZNKCQl9Cgl9Cn0=
kind: Secret
metadata:
  creationTimestamp: "2023-10-27T04:25:50Z"
  name: regcred
  namespace: default
  resourceVersion: "21121"
  uid: 0fbc006d-e6a3-42fa-9ffe-21504625d
type: kubernetes.io/dockerconfigjson

 
 
 

728x90