Docker Desktop + k8s 환경에서 local 이미지를 사용하는 방법
지난 글의 실습을,
ASP.NET Core 프로젝트를 AKS/k8s에 올리는 과정
; https://www.sysnet.pe.kr/2/0/12931
AKS가 아닌 로컬로 구성한 k8s에서,
Docker Desktop for Windows에서 DockerDesktopVM 기반의 Kubernetes 구성
; https://www.sysnet.pe.kr/2/0/12575
하면 어떻게 될까요? 일단, Docekrfile을 빌드하면서 로컬 docker에 이미지가 등록될 것입니다.
C:\temp> docker images
REPOSITORY              TAG      IMAGE ID       CREATED         SIZE
dotnet_razor31_sample   latest   8eb103dc1d37   6 days ago      240MB
그런 다음 로컬 docker에 등록된 image 경로를 가리키는 yaml 파일을 이용해,
apiVersion: apps/v1
kind: Deployment
metadata:
  name: net-razor31-sample
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dotnet-razor31-sample
  template:
    metadata:
      labels:
        app: dotnet-razor31-sample
    spec:
      containers:
      - name: dotnet-razor31-sample
        image: dotnet_razor31_sample
        ports:
        - containerPort: 80
        env:
        - name: ASPNETCORE_URLS
          value: "http://+:80"
---
apiVersion: v1
kind: Service
metadata:
  name: dotnet-razor31-sample
spec:
  type: LoadBalancer
  ports:
  - port: 13502
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    app: dotnet-razor31-sample
k8s에 올리면,
c:\temp> kubectl apply -f test.yaml
deployment.apps/net-razor31-sample created
service/dotnet-razor31-sample created
이렇게 (시간에 따라) 
ErrImagePull/ImagePullBackOff 오류가 발생합니다.
c:\temp> kubectl get pod
NAME                                  READY   STATUS         RESTARTS   AGE
net-razor31-sample-6dc4fd6d49-t7fxx   0/1     ErrImagePull   0          8s
c:\temp> kubectl get pod
NAME                                  READY   STATUS             RESTARTS   AGE
net-razor31-sample-6dc4fd6d49-t7fxx   0/1     ImagePullBackOff   0          35s
왜냐하면, 기본적으로 k8s는 docker hub에서 이미지를 받아오려 하기 때문입니다. 이에 대한 해법이 다음의 글에 나오는데요. ^^
Docker for Mac - Kubernetes - reference local image
; https://stackoverflow.com/questions/50739405/docker-for-mac-kubernetes-reference-local-image
따라서 local의 docker로 변경하고 싶다면 별도로 "imagePullPolicy: Never" 설정을 추가해야 합니다.
...[생략]...
    spec:
      containers:
      - name: dotnet-razor31-sample
        image: dotnet_razor31_sample
        imagePullPolicy: Never
        ports:
        - containerPort: 80
        env:
        - name: ASPNETCORE_URLS
          value: "http://+:80"
...[생략]...
만약 yaml을 경유하지 않고 "kubectl run"으로 실행하는 경우라면 해당 옵션을 지정해도 됩니다.
c:\temp> kubectl run my-test --image=dotnet_razor31_sample --image-pull-policy=Never
// pod 삭제
// kubectl delete pod my-test
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]