이 문서에서는 기본 GKE 관리형 kube-dns를 자체 배포로 바꿔 Google Kubernetes Engine (GKE) 표준 클러스터에서 DNS 설정을 맞춤설정하는 방법을 설명합니다. 이렇게 하면 클러스터의 DNS 제공업체를 더 세부적으로 관리할 수 있습니다. 예를 들어 다음을 할 수 있습니다.
- DNS 구성요소의 CPU 및 메모리 리소스를 미세 조정합니다.
- 특정
kube-dns이미지 버전을 사용합니다. - Kubernetes DNS 사양을 준수하는 CoreDNS와 같은 대체 DNS 제공업체를 배포합니다.
이 문서는 표준 클러스터에만 적용됩니다. Google은 Autopilot 클러스터에서 DNS 구성을 관리합니다. GKE의 DNS
제공업체에 대한 자세한 내용은 서비스
검색 및
kube-dns 정보를 참조하세요.
주의: 커스텀 DNS 배포를 실행하는 경우 지속적인 유지보수는 사용자의 책임입니다. 여기에는 kube-dns 및 자동 확장 처리 컨테이너 이미지가 최신 버전 및 보안 패치로 최신 상태인지 확인하는 작업이 포함됩니다.
최신 권장 이미지를 찾으려면 GKE 클러스터의 kube-system 네임스페이스에서 기본 kube-dns 배포를 검사하세요.
이 문서는 개발자, 관리자, 설계자를 비롯한 GKE 사용자를 위한 것입니다. 의 일반적인 역할과 예시 태스크에 대한 자세한 내용은 일반 GKE 사용자 역할과 태스크를 참조하세요. Google Cloud
이 문서에서는 다음 사항을 잘 알고 있다고 가정합니다.
커스텀 kube-dns 배포 설정
이 섹션에서는 GKE 관리형 kube-dns를 자체 배포로 바꾸는 방법을 설명합니다.
커스텀 매니페스트 만들기 및 배포
다음
Deployment매니페스트를custom-kube-dns.yaml로 저장합니다. 이 매니페스트는kube-dns를 사용합니다.apiVersion: apps/v1 kind: Deployment metadata: name: DNS_DEPLOYMENT_NAME namespace: kube-system labels: k8s-app: kube-dns annotations: deployment.kubernetes.io/revision: "1" spec: selector: matchLabels: k8s-app: kube-dns strategy: rollingUpdate: maxSurge: 10% maxUnavailable: 0 type: RollingUpdate template: metadata: creationTimestamp: null labels: k8s-app: kube-dns spec: containers: - name: kubedns image: registry.k8s.io/dns/k8s-dns-kube-dns:1.22.28 resources: limits: memory: '170Mi' requests: cpu: 100m memory: '70Mi' livenessProbe: httpGet: path: /healthcheck/kubedns port: 10054 scheme: HTTP initialDelaySeconds: 60 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5 readinessProbe: httpGet: path: /readiness port: 8081 scheme: HTTP initialDelaySeconds: 3 timeoutSeconds: 5 args: - --domain=cluster.local. - --dns-port=10053 - --config-dir=/kube-dns-config - --v=2 env: - name: PROMETHEUS_PORT value: "10055" ports: - containerPort: 10053 name: dns-local protocol: UDP - containerPort: 10053 name: dns-tcp-local protocol: TCP - containerPort: 10055 name: metrics protocol: TCP volumeMounts: - name: kube-dns-config mountPath: /kube-dns-config securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true runAsUser: 1001 runAsGroup: 1001 - name: dnsmasq image: registry.k8s.io/dns/k8s-dns-dnsmasq-nanny:1.22.28 livenessProbe: httpGet: path: /healthcheck/dnsmasq port: 10054 scheme: HTTP initialDelaySeconds: 60 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5 args: - -v=2 - -logtostderr - -configDir=/etc/k8s/dns/dnsmasq-nanny - -restartDnsmasq=true - -- - -k - --cache-size=1000 - --no-negcache - --dns-forward-max=1500 - --log-facility=- - --server=/cluster.local/127.0.0.1#10053 - --server=/in-addr.arpa/127.0.0.1#10053 - --server=/ip6.arpa/127.0.0.1#10053 ports: - containerPort: 53 name: dns protocol: UDP - containerPort: 53 name: dns-tcp protocol: TCP resources: requests: cpu: 150m memory: 20Mi volumeMounts: - name: kube-dns-config mountPath: /etc/k8s/dns/dnsmasq-nanny securityContext: capabilities: drop: - all add: - NET_BIND_SERVICE - SETGID - name: sidecar image: registry.k8s.io/dns/k8s-dns-sidecar:1.22.28 livenessProbe: httpGet: path: /metrics port: 10054 scheme: HTTP initialDelaySeconds: 60 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5 args: - --v=2 - --logtostderr - --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local,5,SRV - --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local,5,SRV ports: - containerPort: 10054 name: metrics protocol: TCP resources: requests: memory: 20Mi cpu: 10m securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true runAsUser: 1001 runAsGroup: 1001 dnsPolicy: Default restartPolicy: Always schedulerName: default-scheduler securityContext: {} serviceAccount: kube-dns serviceAccountName: kube-dns terminationGracePeriodSeconds: 30 tolerations: - key: CriticalAddonsOnly operator: Exists volumes: - configMap: defaultMode: 420 name: kube-dns optional: true name: kube-dns-configDNS_DEPLOYMENT_NAME을 커스텀 DNS 배포의 이름으로 바꿉니다.클러스터에 매니페스트를 적용합니다.
kubectl create -f custom-kube-dns.yaml
GKE 관리형 kube-dns 축소
충돌을 방지하려면 GKE 관리형 kube-dns 및
kube-dns-autoscaler 배포를 복제본 0개로 확장하여 사용 중지합니다.
kubectl scale deployment --replicas=0 kube-dns-autoscaler kube-dns --namespace=kube-system
커스텀 자동 확장 처리 구성
기본 kube-dns-autoscaler는 GKE 관리형
kube-dns 배포만 확장합니다. 커스텀 DNS 제공업체에 자동 확장이 필요한 경우 별도의 자동 확장 처리를 배포하고 커스텀 DNS 배포를 수정할 수 있는 권한을 부여해야 합니다.
다음 매니페스트를 만들고
custom-dns-autoscaler.yaml로 저장합니다.apiVersion: v1 kind: ConfigMap metadata: name: custom-dns-autoscaler namespace: kube-system data: linear: |- { "coresPerReplica": 256, "nodesPerReplica": 16, "preventSinglePointFailure": true } --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: system:custom-dns-autoscaler roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:custom-dns-autoscaler subjects: - kind: ServiceAccount name: kube-dns-autoscaler namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: system:custom-dns-autoscaler rules: - apiGroups: - "" resources: - nodes verbs: - list - watch - apiGroups: - apps resourceNames: - DNS_DEPLOYMENT_NAME resources: - deployments/scale verbs: - get - update - apiGroups: - "" resources: - configmaps verbs: - get - create --- apiVersion: apps/v1 kind: Deployment metadata: name: custom-dns-autoscaler namespace: kube-system labels: k8s-app: custom-dns-autoscaler spec: selector: matchLabels: k8s-app: custom-dns-autoscaler template: metadata: labels: k8s-app: custom-dns-autoscaler spec: priorityClassName: system-cluster-critical securityContext: seccompProfile: type: RuntimeDefault supplementalGroups: [ 65534 ] fsGroup: 65534 nodeSelector: kubernetes.io/os: linux containers: - name: autoscaler image: registry.k8s.io/autoscaling/cluster-proportional-autoscaler:1.8.9 resources: requests: cpu: "20m" memory: "10Mi" command: - /cluster-proportional-autoscaler - --namespace=kube-system - --configmap=custom-dns-autoscaler - --target=Deployment/DNS_DEPLOYMENT_NAME - --default-params={"linear":{"coresPerReplica":256,"nodesPerReplica":16,"preventSinglePointFailure":true}} - --logtostderr=true - --v=2 tolerations: - key: "CriticalAddonsOnly" operator: "Exists" serviceAccountName: kube-dns-autoscalerresourceNames필드와command필드의DNS_DEPLOYMENT_NAME을 커스텀 DNS 배포의 이름으로 바꿉니다.클러스터에 매니페스트를 적용합니다.
kubectl create -f custom-dns-autoscaler.yaml
배포를 확인합니다.
커스텀 DNS 포드가 실행 중인지 확인합니다.
kubectl get pods -n kube-system -l k8s-app=kube-dns
GKE 관리형 kube-dns 배포를 복제본 0개로 확장했으므로 커스텀 배포의 포드만 출력에 표시됩니다. 상태가 Running인지 확인합니다.
GKE 관리형 kube-dns 복원
커스텀 kube-dns 구성을 배포하고 기본 GKE 관리형 설정으로 되돌려야 하는 경우 커스텀 리소스를 삭제하고 관리형 kube-dns 배포를 다시 사용 설정해야 합니다.
다음 단계에 따라 GKE 관리형 kube-dns를 복원합니다.
커스텀
kube-dns배포 및 자동 확장 처리를 삭제합니다. 매니페스트를custom-kube-dns.yaml및custom-dns-autoscaler.yaml로 저장한 경우 다음 명령어를 실행하여 리소스를 삭제합니다.kubectl delete -f custom-dns-autoscaler.yaml kubectl delete -f custom-kube-dns.yaml매니페스트를 저장하지 않은 경우 커스텀 배포를 위해 만든 배포, ClusterRole, ClusterRoleBinding을 수동으로 삭제합니다.
GKE 관리형
kube-dns-autoscaler를 복원합니다. 다음 명령어를 실행하여kube-dns-autoscaler배포를 복제본 1개로 다시 확장합니다.kubectl scale deployment --replicas=1 kube-dns-autoscaler --namespace=kube-system이 명령어는 관리형
kube-dns-autoscaler를 다시 사용 설정합니다. 그러면 관리형kube-dns배포가 클러스터 크기에 적합한 복제본 수로 자동 확장됩니다.복원을 확인합니다.
kube-dns및kube-dns-autoscaler포드가 올바르게 실행되고 있는지 확인합니다.kubectl get pods -n kube-system -l k8s-app=kube-dns출력에 GKE 관리형
kube-dns포드가Running상태로 표시되어야 합니다.
다음 단계
- GKE가 관리형 DNS를 제공하는 방법에 대한 개요 읽기
- 서비스 및 pod의 DNS를 참조하여 Kubernetes 클러스터에서 DNS가 사용되는 방식에 대한 일반적인 개요 알아보기