Search

minikube-replace-docker-desktop

https://novemberde.github.io/post/2021/09/02/podman-minikube/
이 글을 읽고 회사 개발 계정 메일로 오던 도커에서 프로모 코드 뿌리는, 확인 안하던, 메일들이 생각났다.
역시 도커 데스크탑이 유료로 바뀌니 주는 할인 코드였고 마침 쿠버네티스에 대한 관심도가 마구마구 오르는 시기라 호기롭게 위 포스팅을 따라하였다.
도커 데스크탑을 삭제하고 minikube 와 kompose 설치, 기존 docker-compose 파일을 변환해서 apply 까지 마쳤다. 마침 대상으로 해본 docker-compose 의 이미지들은 어차피 로컬(맥)에선 잘 안도는거라, 컨테이너가 잘 띄워졌는지 확인하진 않았다(솔직히 쿠버네티스도 컨테이너를 띄우는가? 도커를 대체한다니깐 그러지 않을까? 라고 확신 없는 생각하고 말았다). kubectl get po -A 를 단순히 docker ps 정도로만 생각하고 명령 결과를 잘 확인하지 않았다..
❯ kubectl get po -ANAMESPACE NAME READY STATUS RESTARTS AGEdefault aaaa-798b5fdf96-bhz8n 0/1 ErrImagePull 0 89sdefault bbbb-58d984c8cd-kg742 0/1 ImagePullBackOff 0 89sdefault cccc-7c7f9d769-fnzr9 0/1 ErrImagePull 0 89sdefault dddd-8b5f8d488-whxbk 0/1 ImagePullBackOff 0 89sdefault eeee-fd4fdb5c6-nntg9 0/1 ImagePullBackOff 0 89sdefault ffff-5868c455f7-szbp7 0/1 ImagePullBackOff 0 89sdefault gggg-6bff9d66d6-c8mbd 0/1 ImagePullBackOff 0 88sdefault hhhh-c9b8fc96-r7hnh 0/1 ImagePullBackOff 0 88sdefault iiii-5859b7b695-hmxg6 0/1 ImagePullBackOff 0 88sdefault jjjj-7698798d95-k5ksf 0/1 ImagePullBackOff 0 88sdefault kkkk-648c7649c-nq8dz 0/1 ImagePullBackOff 0 88sdefault llll-94999f75-dnbqn 0/1 ImagePullBackOff 0 87sdefault mmmm-6f5576c8f4-thvpq 0/1 ErrImagePull 0 87sdefault nnnn-switch-8686568675-cw2xl 0/1 ImagePullBackOff 0 87skube-system coredns-78fcd69978-ql5p2 1/1 Running 0 5d5hkube-system etcd-minikube 1/1 Running 0 5d5hkube-system kube-apiserver-minikube 1/1 Running 0 5d5hkube-system kube-controller-manager-minikube 1/1 Running 0 5d5hkube-system kube-proxy-6l6hc 1/1 Running 0 5d5hkube-system kube-scheduler-minikube 1/1 Running 0 5d5hkube-system storage-provisioner 1/1 Running 2 (15h ago) 5d5h
Shell
복사

ErrImagePull

그리고 다음날 로컬에서 직접 필요한 컨테이너를 올려 사용해보기로 했다. 회사에선 아직 컨테이너를 축소판 우분투 호스트정도로 쓰고 있어서 SSH 서버를 설치하고 접속해서 쓴다. 어제와 같이 해당하는 docker-compose 를 변환하고 apply 했으나 접속되지 않았다. 그제서야 STATUS 탭의 ErrImagePull 이 눈에 들어왔다.
별 삽질할것 없이, ‘아 우리 이미지 도커 허브에 프라이빗 레폰데 접근을 못하나보다’ 라고 딱 생각이 들었다. 몇몇 컨테이너(정확힌 파드다)는 백오프로 빠져 대기하고 있다(ImagePullBackOff).
정확히 이걸 해결하기 위한 문서가 있었다. “커맨드 라인에서 자격 증명을 통하여 시크릿 생성하기”을 따라 회사 도커 허브 계정 정보로 새 시크릿을 만들었다.
kubectl create secret docker-registry docker-login --docker-server=https://index.docker.io/v1/ --docker-username=회사도커허브계정 --docker-password=비밀번호 --docker-email=dev@cre.ma # 생성kubectl get secret docker-login --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode | jq # 확인
Shell
복사
그리고 yml 설정에 imagePullSecrets 를 추가한다. 여기서 소위 통빡을 발휘했다. CKA 강의를 구매해서 본격적으로 쿠버네티스를 배울 생각은 있었으나, 지금의 이 도커 컨테이너 띄우는걸 공부 후로 미룰 순 없었다. 변환 전 docker-compose 랑 변환 후 설정을 비교해보면 대충 감이 올거라 생각했다.
변경 전 docker-compose 는 비교적 간단하게 서비스(services) 하나를 띄우는 설정인데(파일은 회사거라 생략함), 이 부분이 변경 후 Deployment 부분이 된거 같다. 그리고 문서와 비교해보며 spec.template.spec 의 키로 추가해주었다. 이번엔 apply 후 컨테이너 상태가 Running 이 됐다.:
❯ kubectl get podsNAME READY STATUS RESTARTS AGEdddd-768768d4b5-php5p 1/1 Running 0 22m
Shell
복사

접속 실패

아마 컨테이너는 잘 올라간것으로 보이나 SSH 로 접속은 실패했다. 이 컨테이너는 SSH 접속을 하기 위해 브릿지 네트워크를 사용하고, 호스트의 20122 포트로 자신의 22 포트를 포워딩하여 SSH 접속을 하게 설정됐다:
Host 컨테이너호스트명 ForwardAgent yes User ubuntu IdentityFile 키파일경로 StrictHostKeyChecking no Hostname 127.0.0.1 Port 20122
Shell
복사
apply 시 쿠버네티스에서 파드 외에 서비스라는것도 만들던게 기억났다. 설정 파일 내용을 보니 게스트 22 -> 호스트 20122 로 포트포워딩한다는 내용 같았고 그럼 접속이 되어야 하는게 아닌가 의문이 들었다:
... - apiVersion: v1 kind: Service metadata: ... spec: ports: - name: "20122" port: 20122 targetPort: 22 ......
YAML
복사
디버깅이나 로그를 보는것도 어려울거 같았다. 서비스란 키워드로 문서를 검색하다 “서비스와 애플리케이션 연결하기” 문서를 발견했다. 이와 같은 방법으로 생성한 파드의 IP 를 확인했고 서비스마다 IP 가 할당됨을 알았다.
SSH 설정의 IP로 바꿨는데 이번엔 명령이 hang 걸리고 Opertaion timed out 이 발생했다. ‘connect to pod over ssh’ 같은 키워드로 구글링 하니 죄다 ssh 가 아닌 exec bash 로 붙으면 된다는 글이 많았다. 이것에 대해선 지금 자세히 알아보기로 하진 않았다.

결론

쿠버네티스에 대한 깊이 있는 이해 없이, 맥에서 도커 데스크탑을 대체하며 몇가지 허들을 넘었다. 또 마침 CKA 자격증 공부를 시작하며 미리 로컬에 명령을 간단하게 날려 볼 수 있는 환경 구성을 해두게 됐다. 이게 서로 상호작용하여, 초반 강의를 들으니 위 작업을 하며 몇가지 헤맸던 것들이 어렴풋이 이해 가기도 한다. 정확한 이해 없이 통빡으로 넘겨 찍은 부분은 확실히 이해해야겠다. 하지만 docker(compose) 설정에서 쿠버네티스 설정으로 변환도 잘 호환 되는거 같고, 도커를 주 컨테이너 엔진으로 쓰는 쿠버네티스의 디자인이 깔끔한거 같아 벌써 기대가 된다.

몇 가지 팁과 글에서 빠진 삽질

필요 없는, ErrImagePull/ImagePullBackOff 인 컨테이너를 삭제하기 위해 kubectl delete pods --all 실행
하지만 다시 만들어지는데 kubectl delete deployments --all 로 삭제
이 과정에서 실수로 kubectl delete nodes --all 도 하여 kube-system 네임스페이스의 마스터 노드가 삭제됐다
minikube start 로 다시 띄워주면 된다