실습
Custom DNS Entry
NGINX 서비스 생성
cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx --- apiVersion: v1 kind: Service metadata: name: nginx spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 EOF
Pod 생성
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: alpine spec: containers: - name: alpine image: praqma/network-multitool command: [ "sleep" ] args: [ "infinity" ] EOF
위에서 생성한 Pod가 사용하는 DNS 서버 정보 확인
kubectl exec alpine -- dig
로컬 DNS 설정 정보 확인
kubectl exec alpine -- cat /etc/resolv.conf
DNS 서버 상세 정보 확인
kubectl exec alpine -- \ bash -c 'DNS_SERVER=$(cat /etc/resolv.conf | grep nameserver | awk "{print \$2}");dig @$DNS_SERVER -x $DNS_SERVER'
CURL 명령어로 위에서 생성한 Service의 FQDN로 접근
kubectl exec alpine -- \ curl -s nginx.default.svc.cluster.local
CURL 명령어로 에서 생성한 Service의 이름으로 접근
kubectl exec alpine -- \ curl -s nginx
CURL 명령어로 에서 생성한 Service의 이름로 Namespace 이름을 추가하고 접근
kubectl exec alpine -- \ curl -s nginx.default
kube-system Namespace 안에 있는 kube-dns Service 확인
kubectl -n kube-system get svc kube-dns
위에서 확인한 Service의 Selector 조건 확인
kubectl -n kube-system get svc kube-dns \ -o=jsonpath='{.spec.selector}' | jq
k8s-app Label을 가진 Pod 확인
kubectl get pod -l k8s-app --all-namespaces
k8s-app=kube-dns Label을 가진 Pod 확인
kubectl get pod -l k8s-app=kube-dns --all-namespaces
coredns
Pod 상세 내용 확인kubectl -n kube-system get pod \ $(kubectl get pod -l k8s-app=kube-dns -o=jsonpath='{.items[0].metadata.name}' -n kube-system) -o yaml
kube-system Namespace 안에 있는 ConfigMap 확인
kubectl -n kube-system get configmap
coredns ConfigMap 상세 내용 확인
kubectl -n kube-system get configmaps coredns -o yaml
CoreDNS 설정파일 수정
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ConfigMap metadata: name: coredns namespace: kube-system labels: eks.amazonaws.com/component: coredns k8s-app: kube-dns data: Corefile: | .:53 { rewrite stop { name regex (.*)\.test\.io {1}.default.svc.cluster.local answer name (.*)\.default\.svc\.cluster\.local {1}.test.io } errors 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 } EOF
CoreDNS Pod 재생성
{ kubectl -n kube-system scale deployment coredns --replicas=0 kubectl -n kube-system scale deployment coredns --replicas=2 }
CoreDNS에 추가한 Rewrite 규칙 확인
kubectl exec alpine -- dig nginx.test.io
nginx Service의 주소 확인
kubectl get svc nginx
CoreDNS에 추가한 Rewrite 규칙 테스트
kubectl exec alpine -- curl -s nginx.test.io
새로운 데모 웹서버 배포
{ kubectl create deploy web --image=httpd kubectl expose deploy web --port 80 }
CoreDNS에 추가한 Rewrite 규칙 테스트
kubectl exec alpine -- curl -s web.test.io
생성한 리소스 삭제
{ kubectl delete deploy nginx web kubectl delete svc nginx web kubectl delete pod alpine }
CoreDNS 설정파일 원복
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ConfigMap metadata: name: coredns namespace: kube-system labels: eks.amazonaws.com/component: coredns k8s-app: kube-dns data: Corefile: | .:53 { errors 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 } EOF
CoreDNS Pod 재생성
{ kubectl -n kube-system scale deployment coredns --replicas=0 kubectl -n kube-system scale deployment coredns --replicas=2 }
ExternalDNS
Node에 부여된 Label을 통해서 EKS 클러스터 이름 확인하고 환경변수로 저장
{ export CLUSTER_NAME=$(kubectl get node \ -o=jsonpath='{.items[0].metadata.labels.alpha\.eksctl\.io\/cluster-name}') echo $CLUSTER_NAME }
ServiceAccount 생성
eksctl create iamserviceaccount \ --cluster $CLUSTER_NAME \ --namespace=kube-system \ --name=external-dns \ --attach-policy-arn=arn:aws:iam::aws:policy/AmazonRoute53FullAccess \ --override-existing-serviceaccounts \ --approve
Helm 차트 리포지토리 추가
{ helm repo add external-dns https://kubernetes-sigs.github.io/external-dns/ helm repo update }
ExternalDNS 설치
helm install external-dns external-dns/external-dns -n kube-system \ --set serviceAccount.create=false \ --set serviceAccount.name=external-dns
배포된 구성요소 확인
kubectl -n kube-system get all -l app.kubernetes.io/name=external-dns
ExternalDNS 로그 확인
kubectl -n kube-system logs deploy/external-dns
Last updated