Questa pagina spiega come eseguire un deployment personalizzato di kube-dns per i cluster in modalità Standard di Google Kubernetes Engine (GKE). Questa pagina non si applica a GKE Autopilot, dove Google gestisce kube-dns.
Panoramica
Per configurare CPU, memoria e altri parametri kube-dns, devi eseguire un deployment personalizzato e disabilitare il deployment fornito da GKE. Puoi anche eseguire un deployment personalizzato di Core DNS o qualsiasi altro provider DNS che segue la specifica DNS di Kubernetes utilizzando le istruzioni in questa pagina.
Per saperne di più su come GKE implementa il Service Discovery, vedi Service Discovery e DNS.
Creazione di un deployment personalizzato
Crea un manifest di deployment per kube-dns, Core DNS o altro provider DNS.
Il seguente manifest kube-dns di esempio include il flag
-q
per registrare i risultati delle query. Salva il file manifest con il nomecustom-kube-dns.yaml
.apiVersion: apps/v1 kind: Deployment metadata: name: DNS_DEPLOYMENT_NAME namespace: kube-system annotations: deployment.kubernetes.io/revision: "1" k8s-app: kube-dns 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.17.3 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.17.3 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.17.3 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
Sostituisci
DNS_DEPLOYMENT_NAME
con un nome per il deployment personalizzato di kube-dns.Applica il manifest al cluster:
kubectl create -f custom-kube-dns.yaml
Verifica che i pod siano in esecuzione:
kubectl get pods -n kube-system -l=k8s-app=kube-dns
L'output è simile al seguente, mostrando i pod kube-dns personalizzati:
NAME READY STATUS RESTARTS AGE custom-kube-dns-5685645b44-kzs8w 3/3 Running 0 22h
Il nuovo deployment ha lo stesso selettore di kube-dns, il che significa che i pod usano lo stesso indirizzo IP del servizio kube-dns per comunicare con i pod che eseguono il deployment kube-dns personalizzato.
Al termine di questo passaggio, devi seguire i passaggi nella sezione successiva per fare lo scale down di kube-dns.
Scalabilità verso il basso di kube-dns
Disabilita kube-dns gestito da GKE scalando a zero il deployment e il gestore della scalabilità automatica di kube-dns utilizzando il seguente comando:
kubectl scale deployment --replicas=0 kube-dns-autoscaler --namespace=kube-system
kubectl scale deployment --replicas=0 kube-dns --namespace=kube-system
Creazione di un gestore della scalabilità automatica personalizzato
Se il tuo DNS personalizzato richiede la scalabilità automatica, devi configurare ed eseguire il deployment di un gestore della scalabilità automatica separato. kube-dns-autoscaler scala solo il deployment kube-dns predefinito sul cluster. Devi inoltre configurare un ClusterRole personalizzato per il gestore della scalabilità automatica e aggiungere le autorizzazioni per modificare i deployment kube-dns personalizzati.
Crea un manifest ClusterRole e Deployment per il gestore della scalabilità automatica e salvalo come
custom-dns-autoscaler.yaml
: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 annotations: seccomp.security.alpha.kubernetes.io/pod: 'docker/default' spec: priorityClassName: system-cluster-critical securityContext: supplementalGroups: [ 65534 ] fsGroup: 65534 nodeSelector: kubernetes.io/os: linux containers: - name: autoscaler image: registry.k8s.io/cluster-proportional-autoscaler-amd64:1.7.1 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
Applica il manifest al cluster:
kubectl create -f custom-dns-autoscaler.yaml
Passaggi successivi
- Leggi una panoramica di come GKE fornisce il DNS gestito.
- Leggi l'articolo DNS per servizi e pod per una panoramica generale sull'utilizzo del DNS nei cluster Kubernetes.