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, in cui Google gestisce kube-dns.
Panoramica
Per configurare la CPU, la memoria e altri parametri di kube-dns, devi eseguire un deployment personalizzato e disattivare il deployment fornito da GKE. Puoi anche eseguire un deployment personalizzato di Core DNS o di qualsiasi altro provider DNS che segue la specifica DNS di Kubernetes utilizzando le istruzioni riportate in questa pagina.
Per saperne di più su come GKE implementa Service Discovery, consulta Service Discovery e DNS.
Creazione di un deployment personalizzato
Crea un manifest di deployment per kube-dns, Core DNS o un altro provider DNS.
Il seguente manifest kube-dns di esempio include il flag
-q
per registrare i risultati delle query. Salva il file manifest comecustom-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 la personalizzazione Deployment 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 utilizzano lo stesso indirizzo IP del servizio kube-dns per comunicare con i pod che esegue 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.
Fare lo scale down di kube-dns
Disabilita kube-dns gestito da GKE scalando kube-dns Esegui il deployment e il gestore della scalabilità automatica su zero 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 variatore automatico separato. kube-dns-autoscaler scala solo il modello kube-dns predefinito Deployment sul cluster. Devi anche configurare un oggetto ClusterRole personalizzato per il gestore della scalabilità automatica e aggiungere autorizzazioni per modificare i deployment di kube-dns personalizzati.
Crea un manifest ClusterRole e Deployment per il gestore della scalabilità automatica e salva il manifest 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 delle funzionalità offerte da GKE DNS gestito.
- Letto DNS per servizi e pod per una panoramica generale dell'uso del DNS nei cluster Kubernetes.