변경된'coredns'의 docker image 만들기

Ubuntu에서 install Docker


먼저 설치 Docker를 시작합니다.
이것 작업을 진행한다.
$ sudo apt-get update

$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

$ sudo apt-get update

$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
, 동작을 확인하는 동시에 Hello-world를 미리 실행합니다.
$ sudo docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

make coredns


이어 여기.를 보면서 코어DNS의 환경을 조정한다.
$ git clone https://github.com/coredns/coredns
$ cd coredns
이후 구글은 설치할 수 있지만 번거롭습니다.
$ docker run --rm -i -t -v $PWD:/v -w /v golang:1.17 make
에서 조금만 기다리면 코르덴스라는 비나리가 완성되기 때문에 가볍습니다.
명령에 대한 간단한 설명은 다음과 같습니다.
  • --rm 작업 종료 후 conainter 삭제
  • -i-t 취합-it 하지만 tty 사용할 수 있는 녀석, 대략
  • -v $PWD:/v에서 $PWDcd coredns 이후의 디렉터리를volume/vmount으로 디렉터리
  • -w /v에서 그/v를workingdirectory로run
  • golang:1.17 make에서 실제 진행make
  • mount가 집행했기 때문에 원래의 세계에서make 만들어진 비나리가 떨어졌다
  • 아주 간단해요, 좋아요.

    Docker file 편집


    이어서 이것coredns이 포함된 도커 이미지를 제작했다.
    원래의 리포지토리Dockerfile가 있기 때문에 적당히 편집합니다.
    원래 내용은 이건데, 이용한 것 같다multi-stage build.
    FROM debian:stable-slim
    
    RUN apt-get update && apt-get -uy upgrade
    RUN apt-get -y install ca-certificates && update-ca-certificates
    
    FROM scratch
    
    COPY --from=0 /etc/ssl/certs /etc/ssl/certs
    ADD coredns /coredns
    
    EXPOSE 53 53/udp
    ENTRYPOINT ["/coredns"]
    
    아마 이런 느낌의 일이겠지.
  • /etc/ssl/certs 여러 개의 인증서를 최신화하기 위해 실행update-ca-certificates
  • 용기 자체의 사이즈를 최소화하고 싶어서FROM scratch 새 이미지coredns의binaryCOPY의docker image
  • 만 준비합니다.
    그리고 이렇게 하면 안전 등급이 높지만 디버깅하기 어려운 docker 이미지입니다.구체적으로 kubectl exec -it -- bash조차도 안 된다.
    $ kubectl exec coredns-xxxxxxxxx-xxxxx -n kube-system -- bash
    error: Internal error occurred: error executing command in container: failed to exec in container: failed to start exec "a364eb42b1e435ff3290bb64b5249dea9f84a2a8a7ad3f8c94ea4639787c42c7": OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "bash": executable file not found in $PATH: unknown
    
    에 관해서는 kubectl debug 같은 수단이 있지만 이번에는 다른 방법으로 하려고 합니다.
    그리하여 2 nd stageFROM debian:stable 등으로 변경하여 더 통용되는 베이스 이미지에서 docker 이미지를 만듭니다.
    FROM debian:stable-slim
    
    RUN apt-get update && apt-get -uy upgrade
    RUN apt-get -y install ca-certificates && update-ca-certificates
    
    FROM debian:stable
    
    COPY --from=0 /etc/ssl/certs /etc/ssl/certs
    ADD coredns /coredns
    
    EXPOSE 53 53/udp
    ENTRYPOINT ["/coredns"]
    

    ACR 작성 및 AKS 연결


    여기서 ACR(Azure Contaainer Registry)을 별도로 만듭니다.
    참고docs로 절차를 진행하면 어렵지 않아요.
    해봤는데 조금 다른 부분으로az acr login--expose-tokenoption이 있을지도 몰라요.
    세부사항은 잘 모르지만 루트 권한이 없으면 원활하게 진행할 수 없기 때문sudo -s 등은 권한을 올린 후az login 집행한다.
    $ sudo -s
    # az acr login --name <acr-name> --expose-token
    
    또한 AKS와 ACR이 연결되어 있습니다.
    여기도 docs 있으니까 어렵지 않아요.
    구체적으로 말하면 한 줄이면 끝이야.
    $ az aks update -g <resource-group> -n <cluster-name> --attach-acr <acr-name>
    

    docker image의build


    응, docker build.docker tag.docker push.
    $ sudo docker build -t local/custom-coredns .
    $ sudo docker tag local/custom-coredns <acr-name>.azurecr.io/custom-coredns:v1
    $ sudo docker push <acr-name>.azurecr.io/custom-coredns:v1
    
    docker images이런 느낌이에요.
    멀티스테이지 build 중간에 남겨진 화면이 좀 미묘하네요.
    # docker images
    REPOSITORY                               TAG           IMAGE ID       CREATED        SIZE
    <acr-name>.azurecr.io/custom-coredns   v1            1234c3187e81   15 hours ago   130MB
    local/custom-coredns                     latest        1234c3187e81   15 hours ago   130MB
    <none>                                   <none>        6fd88635894d   15 hours ago   101MB
    golang                                   1.17          b6bd03a3a78e   2 weeks ago    941MB
    debian                                   stable-slim   b20702a8e984   2 weeks ago    80.4MB
    debian                                   stable        4c8dfa39e6ff   2 weeks ago    124MB
    hello-world                              latest        feb5d9fea6a5   7 months ago   13.3kB
    

    ConfigMap 만들기


    다음은 ACR로 팟을 만들고 싶은데 그 전에 corednsConfigMap을 준비해 두세요.
    안에 두 개가 있는데 두 번째 안에는 없어요.
    첫 번째에 대해서도 많이 썼고 기본적으로$ kubectl get cm coredns -n kube-system -o yaml의 내용을 답습했다.
    $ cat custom-coredns-configmap.yaml | sed 's/........-....-....-....-\(............\)/xxxxxxxx-xxxx-xxx
    x-xxxx-\1/g'
    apiVersion: v1
    data:
      Corefile: |
        .:53 {
            errors
            ready
            health
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
            }
            prometheus :9153
            forward . /etc/resolv.conf
            cache 30
            loop
            reload
            loadbalance
            import custom/*.override
        }
        import custom/*.server
    kind: ConfigMap
    metadata:
      annotations:
      labels:
        addonmanager.kubernetes.io/mode: Reconcile
        k8s-app: kube-dns
      name: coredns
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      labels:
        addonmanager.kubernetes.io/mode: EnsureExists
        k8s-app: kube-dns
      name: coredns-custom
    
    우선 이것을 kubectl apply해라.corednscoredns-custom가 있으면 문제없다.
    $ kubectl apply -f custom-coredns-configmap.yaml
    
    $ kubectl get cm
    NAME               DATA   AGE
    coredns            1      14h
    coredns-custom     0      14h
    kube-root-ca.crt   1      18h
    

    Pod 생성


    다음에 pod용yaml을 쓰세요.
    이것도 kubectl get po coredns-xxxxxxxxx-xxxxx -n kube-system -o yaml의 결과를 필요한 곳으로 자꾸 삭감하는 것이다.
    가장 중요한 수정점은 여기뿐이야.
  • .spec.containers.image ACR 클래스
  • ConfigMap 연관성은 다음과 같은 분위기일 것이다.
  • args-conf /etc/coredns/Corefile라고 쓰여 있기 때문에pod
  • 를 시작하기 위한 옵션으로 지정되었습니다
  • 이것volumeMountsmount
  • 입니다.
  • 에서 volumes에서 ConfigMap 구현
  • 이를 위한 사전 준비ConfigMap
  • $ cat custom-coredns-pod.yaml | sed 's/........-....-....-....-\(............\)/xxxxxxxx-xxxx-xxxx-xxxx
    -\1/g'
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        k8s-app: kube-dns
      name: custom-coredns
    spec:
      containers:
      - args:
        - -conf
        - /etc/coredns/Corefile
        env:
        - name: KUBERNETES_PORT_443_TCP_ADDR
          value: private-cl-aks-20220504-81d00f-feda6be9.xxxxxxxx-xxxx-xxxx-xxxx-c5c05e4746d6.privatelink.southeastasia.azmk8s.io
        - name: KUBERNETES_PORT
          value: tcp://private-cl-aks-20220504-81d00f-feda6be9.xxxxxxxx-xxxx-xxxx-xxxx-c5c05e4746d6.privatelink.southeastasia.azmk8s.io:443
        - name: KUBERNETES_PORT_443_TCP
          value: tcp://private-cl-aks-20220504-81d00f-feda6be9.xxxxxxxx-xxxx-xxxx-xxxx-c5c05e4746d6.privatelink.southeastasia.azmk8s.io:443
        - name: KUBERNETES_SERVICE_HOST
          value: private-cl-aks-20220504-81d00f-feda6be9.xxxxxxxx-xxxx-xxxx-xxxx-c5c05e4746d6.privatelink.southeastasia.azmk8s.io
        image: <acr-name>.azurecr.io/custom-coredns:v1.1
        imagePullPolicy: IfNotPresent
        name: custom-coredns
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
        volumeMounts:
        - mountPath: /etc/coredns
          name: config-volume
          readOnly: true
        - mountPath: /etc/coredns/custom
          name: custom-config-volume
          readOnly: true
        - mountPath: /tmp
          name: tmp
      restartPolicy: Always
      volumes:
      - configMap:
          defaultMode: 420
          items:
          - key: Corefile
            path: Corefile
          name: coredns
        name: config-volume
      - configMap:
          defaultMode: 420
          name: coredns-custom
          optional: true
        name: custom-config-volume
      - emptyDir: {}
        name: tmp
    
    이후에 kubectl apply만 했어요.
    $ kubectl apply -f custom-coredns-pod.yaml
    
    이pod면kubectl exec -it -- bash 괜찮아요.
    $ k exec -it custom-coredns -- bash
    root@custom-coredns:/#
    
    localhostcoredns은 DNS 캐치 서버로 이동하고 있을 테니 dig로 간단히 확인하세요.
    # apt-get update
    # apt-get install dnsutils
    # dig @localhost www.microsoft.com. +short
    www.microsoft.com-c-3.edgekey.net.
    www.microsoft.com-c-3.edgekey.net.globalredir.akadns.net.
    e13678.dscb.akamaiedge.net.
    104.83.197.169
    
    어쨌든 여기까지.

    좋은 웹페이지 즐겨찾기