במאמר הזה מוסבר איך להתאים אישית את הגדרת ה-DNS באשכול Standard של Google Kubernetes Engine (GKE) על ידי החלפת kube-dns שמנוהל על ידי GKE בפריסה משלכם. כך יש לכם יותר שליטה בספק ה-DNS של האשכול. לדוגמה, אתם יכולים:
- כוונון עדין של משאבי המעבד (CPU) והזיכרון לרכיבי DNS.
- שימוש בגרסת תמונה ספציפית
kube-dns. - פריסת ספק DNS חלופי, כמו CoreDNS, שעומד במפרט ה-DNS של Kubernetes.
המסמך הזה רלוונטי רק לאשכולות רגילים. Google מנהלת את הגדרות ה-DNS באשכולות Autopilot. כדי להבין טוב יותר את ספקי ה-DNS ב-GKE, אפשר לעיין במאמרים מידע על איתור שירותים וkube-dns.
שימו לב: אם אתם מפעילים פריסת DNS בהתאמה אישית, אתם אחראים לתחזוקה השוטפת שלה. הפעולות האלה כוללות לוודא שקובצי האימג' של הקונטיינרים של kube-dns ושל הכלי להתאמת קנה מידה אוטומטית מעודכנים לגרסאות העדכניות ביותר ולתיקוני האבטחה העדכניים ביותר.
כדי למצוא את התמונות המומלצות העדכניות, בודקים את הפריסה kube-dns שמוגדרת כברירת מחדל במרחב השמות kube-system של אשכול GKE.
המסמך הזה מיועד למשתמשי GKE, כולל מפתחים, אדמינים וארכיטקטים. מידע נוסף על תפקידים נפוצים ומשימות לדוגמה ב- Google Cloudזמין במאמר תפקידים נפוצים של משתמשי GKE ומשימות.
במסמך הזה אנחנו יוצאים מנקודת הנחה שאתם מכירים את הנושאים הבאים:
- Kubernetes Service.
- שירותים מרובי-אשכולות.
- מידע על איתור שירותים
- זיהוי שירותים ו-DNS ב-GKE
- מידע על Cloud DNS
הגדרת פריסה מותאמת אישית של kube-dns
בקטע הזה מוסבר איך להחליף את kube-dns שמנוהל על ידי GKE בפריסה משלכם.
יצירה ופריסה של קובץ מניפסט בהתאמה אישית
שומרים את קובץ המניפסט הבא
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 המותאם אישית.מחילים את המניפסט על האשכול:
kubectl create -f custom-kube-dns.yaml
הפחתה בהתאם לעומס של kube-dns
כדי למנוע קונפליקטים, משביתים את הפריסות kube-dns ו-kube-dns-autoscaler שמנוהלות על ידי GKE על ידי שינוי קנה המידה שלהן לאפס רפליקות:
kubectl scale deployment --replicas=0 kube-dns-autoscaler kube-dns --namespace=kube-system
הגדרה של קנה מידה אוטומטי בהתאמה אישית
כברירת מחדל, kube-dns-autoscaler משנה את גודל הפריסה של kube-dns ב-GKE. אם ספק ה-DNS המותאם אישית שלכם דורש התאמה אוטומטית לעומס (autoscaling), אתם צריכים לפרוס מידרוג אוטומטי נפרד ולהעניק לו הרשאות לשנות את פריסת ה-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-autoscalerמחליפים את
DNS_DEPLOYMENT_NAMEבשדהresourceNamesובשדהcommandבשם של פריסת ה-DNS המותאמת אישית.מחילים את המניפסט על האשכול:
kubectl create -f custom-dns-autoscaler.yaml
אימות הפריסה
מוודאים ש-DNS Pods בהתאמה אישית פועלים:
kubectl get pods -n kube-system -l k8s-app=kube-dns
בגלל שהרחבתם את הפריסה של kube-dns שמנוהלת על ידי GKE לאפס רפליקות, רק פודים מהפריסה המותאמת אישית שלכם מופיעים בפלט. מוודאים שהסטטוס שלהם הוא Running.
שחזור kube-dns שמנוהל על ידי GKE
אם פרסתם הגדרת kube-dns בהתאמה אישית ואתם רוצים לחזור להגדרת ברירת המחדל שמנוהלת על ידי GKE, אתם צריכים למחוק את המשאבים בהתאמה אישית ולהפעיל מחדש את הפריסה המנוהלת של kube-dns.
כדי לשחזר את kube-dns שמנוהל על ידי GKE:
מוחקים את הפריסה המותאמת אישית
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 שיצרתם עבור הפריסה בהתאמה אישית.
משחזרים את
kube-dns-autoscalerשמנוהל על ידי GKE. מריצים את הפקודה הבאה כדי לשנות את קנה המידה של הפריסה שלkube-dns-autoscalerבחזרה לשכפול אחד: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הפלט צריך להראות שה-Pods שמנוהלים על ידי GKE נמצאים במצב
Running.kube-dns
המאמרים הבאים
- סקירה כללית על DNS מנוהל ב-GKE
- במאמר DNS for Services and Pods (מערכת DNS לשירותים ול-Pods) מופיעה סקירה כללית על השימוש ב-DNS באשכולות Kubernetes.