커스텀 kube-dns 배포 설정

이 문서에서는 기본 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를 자체 배포로 바꾸는 방법을 설명합니다.

커스텀 매니페스트 만들기 및 배포

  1. 다음 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-config
    

    DNS_DEPLOYMENT_NAME을 커스텀 DNS 배포의 이름으로 바꿉니다.

  2. 클러스터에 매니페스트를 적용합니다.

    kubectl create -f custom-kube-dns.yaml
    

GKE 관리형 kube-dns 축소

충돌을 방지하려면 GKE 관리형 kube-dnskube-dns-autoscaler 배포를 복제본 0개로 확장하여 사용 중지합니다.

kubectl scale deployment --replicas=0 kube-dns-autoscaler kube-dns --namespace=kube-system

커스텀 자동 확장 처리 구성

기본 kube-dns-autoscaler는 GKE 관리형 kube-dns 배포만 확장합니다. 커스텀 DNS 제공업체에 자동 확장이 필요한 경우 별도의 자동 확장 처리를 배포하고 커스텀 DNS 배포를 수정할 수 있는 권한을 부여해야 합니다.

  1. 다음 매니페스트를 만들고 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-autoscaler
    

    resourceNames 필드와 command 필드의 DNS_DEPLOYMENT_NAME을 커스텀 DNS 배포의 이름으로 바꿉니다.

  2. 클러스터에 매니페스트를 적용합니다.

    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를 복원합니다.

  1. 커스텀 kube-dns 배포 및 자동 확장 처리를 삭제합니다. 매니페스트를 custom-kube-dns.yamlcustom-dns-autoscaler.yaml로 저장한 경우 다음 명령어를 실행하여 리소스를 삭제합니다.

    kubectl delete -f custom-dns-autoscaler.yaml
    kubectl delete -f custom-kube-dns.yaml
    

    매니페스트를 저장하지 않은 경우 커스텀 배포를 위해 만든 배포, ClusterRole, ClusterRoleBinding을 수동으로 삭제합니다.

  2. GKE 관리형 kube-dns-autoscaler를 복원합니다. 다음 명령어를 실행하여 kube-dns-autoscaler 배포를 복제본 1개로 다시 확장합니다.

    kubectl scale deployment --replicas=1 kube-dns-autoscaler --namespace=kube-system
    

    이 명령어는 관리형 kube-dns-autoscaler를 다시 사용 설정합니다. 그러면 관리형 kube-dns 배포가 클러스터 크기에 적합한 복제본 수로 자동 확장됩니다.

  3. 복원을 확인합니다.

    kube-dnskube-dns-autoscaler 포드가 올바르게 실행되고 있는지 확인합니다.

    kubectl get pods -n kube-system -l k8s-app=kube-dns
    

    출력에 GKE 관리형 kube-dns 포드가 Running 상태로 표시되어야 합니다.

다음 단계

  • GKE가 관리형 DNS를 제공하는 방법에 대한 개요 읽기
  • 서비스 및 pod의 DNS를 참조하여 Kubernetes 클러스터에서 DNS가 사용되는 방식에 대한 일반적인 개요 알아보기