ArgoCD를 설치한 뒤 GitLab 저장소를 읽게 하려면 먼저 DNS 경로를 정리해야 했음.
작업 PC나 DGX 호스트에서 /etc/hosts를 잡아도, Kubernetes Pod 안에서는 그대로 먹히지 않음.
Pod는 보통 클러스터 안의 CoreDNS를 통해 이름을 해석함.
즉, ArgoCD repo-server Pod가 gitlab.yeonghoon.kim을 찾을 때는 DGX 호스트의 /etc/hosts가 아니라 Kubernetes CoreDNS를 봄.
GitLab과 Registry는 Kubernetes 안에 있는 서비스가 아니라 DGX 호스트 위 Docker 컨테이너로 동작 중.
DGX host spark-e51d
IP: 192.168.200.100
Docker container
- GitLab
- Registry
Kubernetes cluster
- ArgoCD repo-server
- app Pod
- CoreDNS
그래서 Kubernetes 안에서는 GitLab/Registry 도메인을 외부 DNS로 보내지 않고 내부 IP로 고정해서 보게 만듦.
gitlab.yeonghoon.kim
registry.yeonghoon.kim
-> 192.168.200.100
먼저 현재 CoreDNS 설정 확인.
# 현재 CoreDNS ConfigMap에 GitLab/Registry 내부 hosts override가 있는지 확인한다.
kubectl -n kube-system get configmap coredns \
-o go-template='{{.data.Corefile}}{{"\n"}}' | grep -E 'gitlab\.yeonghoon\.kim|registry\.yeonghoon\.kim|192\.168\.200\.100' || true
CoreDNS는 클러스터 전체 DNS에 영향을 주므로 수정 전 백업.
# 현재 CoreDNS ConfigMap을 DGX host 사용자 홈에 백업한다.
kubectl -n kube-system get configmap coredns -o yaml \
> /home/ioniere/coredns.before-dgx-override.yaml
chmod 600 /home/ioniere/coredns.before-dgx-override.yaml
CoreDNS override 적용.
# 클러스터 내부에서 GitLab/Registry 도메인이 DGX host IP로 해석되도록 CoreDNS override를 적용한다.
set -e
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
hosts {
192.168.200.100 gitlab.yeonghoon.kim registry.yeonghoon.kim
fallthrough
}
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30 {
disable success cluster.local
disable denial cluster.local
}
loop
reload
loadbalance
}
EOF
hosts 블록은 /etc/hosts와 비슷한 역할.
다만 호스트 OS의 /etc/hosts가 아니라 Kubernetes Pod DNS 기준으로 적용되는 설정.
fallthrough는 여기에 없는 이름은 원래 CoreDNS 흐름대로 넘기라는 뜻.
CoreDNS와 ArgoCD repo-server 재시작.
# CoreDNS와 ArgoCD repo-server를 재시작하고 rollout 완료를 기다린다.
kubectl -n kube-system rollout restart deployment/coredns
kubectl -n kube-system rollout status deployment/coredns --timeout=120s
kubectl -n argocd rollout restart deployment/argocd-repo-server
kubectl -n argocd rollout status deployment/argocd-repo-server --timeout=180s
Pod 안에서 DNS 확인.
# repo-server Pod 안에서 GitLab 도메인이 DGX host IP로 해석되는지 확인한다.
kubectl -n argocd exec deployment/argocd-repo-server -- getent hosts gitlab.yeonghoon.kim
# repo-server Pod 안에서 Registry 도메인이 DGX host IP로 해석되는지 확인한다.
kubectl -n argocd exec deployment/argocd-repo-server -- getent hosts registry.yeonghoon.kim
정상 기준.
192.168.200.100 gitlab.yeonghoon.kim
192.168.200.100 registry.yeonghoon.kim
DNS가 맞아도 SSH host key를 신뢰하지 못하면 ArgoCD가 GitLab repo를 읽지 못함.
그래서 GitLab SSH 공개 host key를 ArgoCD known_hosts에 등록.
# GitLab SSH 공개 host key를 ArgoCD known_hosts ConfigMap에 등록한다.
ssh-keyscan -p 2224 gitlab.yeonghoon.kim 2>/dev/null | \
kubectl -n argocd create configmap argocd-ssh-known-hosts-cm \
--from-file=ssh_known_hosts=/dev/stdin \
--dry-run=client -o yaml | \
kubectl -n argocd apply -f -
kubectl -n argocd rollout restart deployment/argocd-repo-server
kubectl -n argocd rollout status deployment/argocd-repo-server --timeout=180s
여기서 등록하는 건 SSH private key가 아님.
접속 대상 서버의 공개 host key라서 Secret이 아니라 ConfigMap으로 관리함.
정리하면 이 작업은 ArgoCD와 Pod가 GitLab/Registry를 외부 공개 DNS가 아니라 내부 DGX 호스트 IP로 찾게 만드는 작업.
호스트 /etc/hosts로는 Pod 내부 DNS를 해결할 수 없어서 CoreDNS override를 사용함.