Автоматичне масштабування служби DNS в кластері

Ця сторінка показує, як увімкнути та налаштувати автоматичне масштабування служби DNS у вашому кластері Kubernetes.

Перш ніж ви розпочнете

  • Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:

    Для перевірки версії введіть kubectl version.

  • Цей посібник передбачає, що ваші вузли використовують архітектуру процесора AMD64 або Intel 64.

  • Переконайтеся, що DNS Kubernetes увімкнений.

Визначте, чи вже увімкнуто горизонтальне автоматичне масштабування DNS

Перегляньте Deploymentʼи у вашому кластері у просторі імен kube-system:

kubectl get deployment --namespace=kube-system

Вивід схожий на такий:

NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
...
kube-dns-autoscaler    1/1     1            1           ...
...

Якщо ви бачите "kube-dns-autoscaler" у виводі, горизонтальне автоматичне масштабування DNS вже увімкнено, і ви можете перейти до Налаштування параметрів автоматичного масштабування.

Отримайте імʼя вашого Deployment DNS

Перегляньте Deployment DNS у вашому кластері у просторі імен kube-system:

kubectl get deployment -l k8s-app=kube-dns --namespace=kube-system

Вивід схожий на такий:

NAME      READY   UP-TO-DATE   AVAILABLE   AGE
...
coredns   2/2     2            2           ...
...

Якщо ви не бачите Deployment для DNS-служб, ви також можете знайти його за ім'ям:

kubectl get deployment --namespace=kube-system

і пошукайте Deployment з назвою coredns або kube-dns.

Ваша ціль масштабування:

Deployment/<імʼя вашого розгортання>

де <ім'я вашого розгортання> — це імʼя вашого Deployment DNS. Наприклад, якщо імʼя вашого Deployment для DNS — coredns, ваша ціль масштабування — Deployment/coredns.

Увімкніть горизонтальне автоматичне масштабування DNS

У цьому розділі ви створюєте нове Deployment. Podʼи в Deployment працюють з контейнером на основі образу cluster-proportional-autoscaler-amd64.

Створіть файл з назвою dns-horizontal-autoscaler.yaml з таким вмістом:

kind: ServiceAccount
apiVersion: v1
metadata:
  name: kube-dns-autoscaler
  namespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: system:kube-dns-autoscaler
rules:
  - apiGroups: [""]
    resources: ["nodes"]
    verbs: ["list", "watch"]
  - apiGroups: [""]
    resources: ["replicationcontrollers/scale"]
    verbs: ["get", "update"]
  - apiGroups: ["apps"]
    resources: ["deployments/scale", "replicasets/scale"]
    verbs: ["get", "update"]
# Remove the configmaps rule once below issue is fixed:
# kubernetes-incubator/cluster-proportional-autoscaler#16
  - apiGroups: [""]
    resources: ["configmaps"]
    verbs: ["get", "create"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: system:kube-dns-autoscaler
subjects:
  - kind: ServiceAccount
    name: kube-dns-autoscaler
    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: system:kube-dns-autoscaler
  apiGroup: rbac.authorization.k8s.io

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kube-dns-autoscaler
  namespace: kube-system
  labels:
    k8s-app: kube-dns-autoscaler
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    matchLabels:
      k8s-app: kube-dns-autoscaler
  template:
    metadata:
      labels:
        k8s-app: kube-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/cpa/cluster-proportional-autoscaler:1.8.4
        resources:
            requests:
                cpu: "20m"
                memory: "10Mi"
        command:
          - /cluster-proportional-autoscaler
          - --namespace=kube-system
          - --configmap=kube-dns-autoscaler
          # Should keep target in sync with cluster/addons/dns/kube-dns.yaml.base
          - --target=<SCALE_TARGET>
          # When cluster is using large nodes(with more cores), "coresPerReplica" should dominate.
          # If using small nodes, "nodesPerReplica" should dominate.
          - --default-params={"linear":{"coresPerReplica":256,"nodesPerReplica":16,"preventSinglePointFailure":true,"includeUnschedulableNodes":true}}
          - --logtostderr=true
          - --v=2
      tolerations:
      - key: "CriticalAddonsOnly"
        operator: "Exists"
      serviceAccountName: kube-dns-autoscaler

У файлі замініть <SCALE_TARGET> на вашу ціль масштабування.

Перейдіть в теку, яка містить ваш файл конфігурації, та введіть цю команду для створення Deployment:

kubectl apply -f dns-horizontal-autoscaler.yaml

Вивід успішної команди:

deployment.apps/kube-dns-autoscaler created

Тепер горизонтальне автоматичне масштабування DNS увімкнено.

Налаштування параметрів автоматичного масштабування DNS

Перевірте, що існує ConfigMap kube-dns-autoscaler:

kubectl get configmap --namespace=kube-system

Вивід схожий на такий:

NAME                  DATA      AGE
...
kube-dns-autoscaler   1

     ...
...

Змініть дані в ConfigMap:

kubectl edit configmap kube-dns-autoscaler --namespace=kube-system

Знайдіть цей рядок:

linear: '{"coresPerReplica":256,"min":1,"nodesPerReplica":16}'

Змініть поля відповідно до ваших потреб. Поле "min" вказує на мінімальну кількість резервних DNS. Фактична кількість резервних копій обчислюється за цією формулою:

replicas = max( ceil( cores × 1/coresPerReplica ) , ceil( nodes × 1/nodesPerReplica ) )

Зверніть увагу, що значення як coresPerReplica, так і nodesPerReplica — це числа з комою.

Ідея полягає в тому, що, коли кластер використовує вузли з багатьма ядрами, coresPerReplica домінує. Коли кластер використовує вузли з меншою кількістю ядер, домінує nodesPerReplica.

Існують інші підтримувані шаблони масштабування. Докладні відомості див. у cluster-proportional-autoscaler.

Вимкніть горизонтальне автоматичне масштабування DNS

Існують декілька варіантів налаштування горизонтального автоматичного масштабування DNS. Який варіант використовувати залежить від різних умов.

Опція 1: Зменшити масштаб розгортання kube-dns-autoscaler до 0 резервних копій

Цей варіант працює для всіх ситуацій. Введіть цю команду:

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

Вивід:

deployment.apps/kube-dns-autoscaler scaled

Перевірте, що кількість резервних копій дорівнює нулю:

kubectl get rs --namespace=kube-system

Вивід показує 0 в колонках DESIRED та CURRENT:

NAME                                  DESIRED   CURRENT   READY   AGE
...
kube-dns-autoscaler-6b59789fc8        0         0         0       ...
...

Опція 2: Видаліть розгортання kube-dns-autoscaler

Цей варіант працює, якщо kube-dns-autoscaler знаходиться під вашим контролем, що означає, що його ніхто не буде знову створювати:

kubectl delete deployment kube-dns-autoscaler --namespace=kube-system

Вивід:

deployment.apps "kube-dns-autoscaler" deleted

Опція 3: Видаліть файл маніфесту kube-dns-autoscaler з майстер-вузла

Цей варіант працює, якщо kube-dns-autoscaler знаходиться під контролем (застарілий) Addon Manager, і ви маєте права запису на майстер-вузол.

Увійдіть на майстер-вузол та видаліть відповідний файл маніфесту. Загальний шлях для цього kube-dns-autoscaler:

/etc/kubernetes/addons/dns-horizontal-autoscaler/dns-horizontal-autoscaler.yaml

Після видалення файлу маніфесту Addon Manager видалить розгортання kube-dns-autoscaler.

Розуміння того, як працює горизонтальне автоматичне масштабування DNS

  • Застосунок cluster-proportional-autoscaler розгортається окремо від служби DNS.

  • Pod автомасштабування працює клієнтом, який опитує сервер API Kubernetes для отримання кількості вузлів та ядер у кластері.

  • Обчислюється та застосовується бажана кількість резервних копій на основі поточних запланованих вузлів та ядер та заданих параметрів масштабування.

  • Параметри масштабування та точки даних надаються через ConfigMap Podʼу автомасштабування, і він оновлює свою таблицю параметрів щоразу під час періодичного опитування, щоб вона була актуальною з найновішими бажаними параметрами масштабування.

  • Зміни параметрів масштабування дозволені без перебудови або перезапуску Podʼа автомасштабування.

  • Автомасштабування надає інтерфейс контролера для підтримки двох шаблонів керування: linear та ladder.

Що далі

Змінено June 20, 2024 at 12:44 PM PST: Sync changest from andygol/k8s-website (36d05bc8a1)