변경된'coredns'의 docker image 만들기
26485 단어 DockerKubernetescorednsakstech
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
에서 $PWD
즉 cd coredns
이후의 디렉터리를volume/v
mount으로 디렉터리-w /v
에서 그/v
를workingdirectory로rungolang:1.17 make
에서 실제 진행make
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 stage
FROM 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-token
option이 있을지도 몰라요.세부사항은 잘 모르지만 루트 권한이 없으면 원활하게 진행할 수 없기 때문
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로 팟을 만들고 싶은데 그 전에
coredns
용ConfigMap
을 준비해 두세요.안에 두 개가 있는데 두 번째 안에는 없어요.
첫 번째에 대해서도 많이 썼고 기본적으로
$ 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
해라.coredns
와 coredns-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
라고 쓰여 있기 때문에podvolumeMounts
mount
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:/#
localhost
중coredns
은 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
어쨌든 여기까지.
Reference
이 문제에 관하여(변경된'coredns'의 docker image 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/skmkzyk/articles/custom-coredns-pod텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)