Как увеличить диапазон CIDR pod в кластере kubernetes, развернутом с помощью kubeadm? - PullRequest
1 голос
/ 11 февраля 2020

Я развернул свой кластер с добавленным параметром --pod-network-cidr и создал новый пул ip с помощью calicoctl для изменения модулей в этом диапазоне. Проблема, с которой я столкнулся, это то, что мне нужно изменить на стороне kubernetes, чтобы изменить диапазон pod-cidr? Вносить ли изменения в сервер API, диспетчер контроллеров и планировщик, или есть только определенные c части, которые мне нужно изменить. Я пытался изменить только диспетчер контроллера, и эти плоскости управления go превратились в cra sh l oop после изменения --cluster-cidr в yaml.

Выходные данные в журналах контроллера-диспетчера ниже?

controllermanager. go: 235] ошибка запуска контроллеров: не удалось пометить cidr [192.168.0.0/24] в idx [0 ] как занятый для узла:: cidr 192.168.0.0/24 выходит за пределы диапазона кластера cidr 10.0.0.0/16

1 Ответ

1 голос
/ 12 февраля 2020

Изменение CIDR кластера не простая задача. Мне удалось воспроизвести ваш сценарий, и мне удалось изменить его, выполнив следующие действия.

Изменение пула IP

Процесс выглядит следующим образом:

  1. Установка calicoctl в виде модуля Kubernetes ( Источник )
  2. Добавление нового пула IP ( Источник ).
  3. Отключение старого пула IP. Это предотвращает выделение новых IPAM из старого пула IP, не влияя на сетевую среду существующих рабочих нагрузок.
  4. Изменить параметры узла podCIDR ( Источник )
  5. Изменить --cluster-cidr вкл kube-controller-manager.yaml на главном узле. (Кредиты OP на этом)
  6. Воссоздать все существующие рабочие нагрузки, которым был назначен адрес из старого пула IP.
  7. Удалить старый пул IP.

Давайте начнем.

В этом примере мы собираемся заменить 192.168.0.0/16 на 10.0.0.0/8.

  1. Установка calicoctl в качестве модуля Kubernetes
    $ kubectl apply -f https://docs.projectcalico.org/manifests/calicoctl.yaml
    
    Установка псевдонима:
    $ alias calicoctl="kubectl exec -i -n kube-system calicoctl /calicoctl -- "
    
  2. Добавление нового пула IP:

    calicoctl create -f -<<EOF
    apiVersion: projectcalico.org/v3
    kind: IPPool
    metadata:
      name: new-pool
    spec:
      cidr: 10.0.0.0/8
      ipipMode: Always
      natOutgoing: true
    EOF
    

    Теперь у нас должно быть два включенных пула IP, которые мы можем видеть при запуске calicoctl get ippool -o wide:

    NAME                  CIDR             NAT    IPIPMODE   DISABLED
    default-ipv4-ippool   192.168.0.0/16   true   Always     false
    new-pool              10.0.0.0/8       true   Always     false
    
  3. Отключить старый пул IP.

    Сначала сохраните определение пула IP на диск:

    calicoctl get ippool -o yaml > pool.yaml
    

    pool.yaml должно выглядеть следующим образом:

    apiVersion: projectcalico.org/v3
    items:
    - apiVersion: projectcalico.org/v3
      kind: IPPool
      metadata:
        name: default-ipv4-ippool
      spec:
        cidr: 192.168.0.0/16
        ipipMode: Always
        natOutgoing: true
    - apiVersion: projectcalico.org/v3
      kind: IPPool
      metadata:
        name: new-pool
      spec:
        cidr: 10.0.0.0/8
        ipipMode: Always
        natOutgoing: true
    

    Примечание: некоторая дополнительная спецификация кластера c информация был отредактирован для улучшения читабельности.

    Отредактируйте файл, добавив disabled: true в пул default-ipv4-ippool IP:

    apiVersion: projectcalico.org/v3
    kind: IPPool
    metadata:5
      name: default-ipv4-ippool
    spec:
      cidr: 192.168.0.0/16
      ipipMode: Always
      natOutgoing: true
      disabled: true
    

    Примените изменения:

    calicoctl apply -f pool.yaml
    

    Мы должны увидеть изменение, отраженное в выводе calicoctl get ippool -o wide:

    NAME                  CIDR             NAT    IPIPMODE   DISABLED
    default-ipv4-ippool   192.168.0.0/16   true   Always     true
    new-pool              10.0.0.0/8       true   Always     false
    
  4. Изменить узлы podCIDR Параметр:

    Переопределить podCIDR Параметр для конкретного ресурса узла k8s с новым диапазоном IP-источников, желательно с помощью следующих команд:

    $ kubectl get no kubeadm-0 -o yaml > file.yaml; sed -i "s~192.168.0.0/24~10.0.0.0/16~" file.yaml; kubectl delete no kubeadm-0 && kubectl create -f file.yaml
    $ kubectl get no kubeadm-1 -o yaml > file.yaml; sed -i "s~192.168.1.0/24~10.1.0.0/16~" file.yaml; kubectl delete no kubeadm-1 && kubectl create -f file.yaml
    $ kubectl get no kubeadm-2 -o yaml > file.yaml; sed -i "s~192.168.2.0/24~10.2.0.0/16~" file.yaml; kubectl delete no kubeadm-2 && kubectl create -f file.yaml    
    

    Мы должны были выполнить это действие для каждого имеющегося у нас узла. Обратите внимание на IP-диапазоны, они отличаются от одного узла к другому.

  5. Изменить CIDR в конфигурационном файле kubeadm-config и kube-controller-manager.yaml

Редактировать конфигурационный файл kubeadm-config и изменить podSu bnet на новый диапазон IP-адресов:

kubectl -n kube-system edit cm kubeadm-config

Также измените значение --cluster-cidr в /etc/kubernetes/manifests/kube-controller-manager.yaml, расположенном в главном узле.

$ sudo cat /etc/kubernetes/manifests/kube-controller-manager.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: kube-controller-manager
    tier: control-plane
  name: kube-controller-manager
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-controller-manager
    - --allocate-node-cidrs=true
    - --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
    - --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
    - --bind-address=127.0.0.1
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --cluster-cidr=10.0.0.0/8
    - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
    - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
    - --controllers=*,bootstrapsigner,tokencleaner
    - --kubeconfig=/etc/kubernetes/controller-manager.conf
    - --leader-elect=true
    - --node-cidr-mask-size=24
    - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
    - --root-ca-file=/etc/kubernetes/pki/ca.crt
    - --service-account-private-key-file=/etc/kubernetes/pki/sa.key
    - --service-cluster-ip-range=10.96.0.0/12
    - --use-service-account-credentials=true

Воссоздайте все существующие рабочие нагрузки, используя IP-адреса из отключенного пула. В этом примере kube-dns является единственной рабочей нагрузкой, объединенной в сеть с помощью Calico:

kubectl delete pod -n kube-system kube-dns-6f4fd4bdf-8q7zp

Проверьте, что новая рабочая нагрузка теперь имеет адрес в новом пуле IP, запустив calicoctl get wep --all-namespaces:

NAMESPACE     WORKLOAD                   NODE      NETWORKS            INTERFACE
kube-system   kube-dns-6f4fd4bdf-8q7zp   vagrant   10.0.24.8/32   cali800a63073ed

Удалить старый пул IP:

calicoctl delete pool default-ipv4-ippool

Создание его с нуля

Чтобы развернуть кластер с указанным c IP-диапазоном, используя Kubeadm и Calico, вам нужно запустить кластер с помощью --pod-network-cidr=192.168.0.0/24 (где 192.168.0.0/24 - ваш желаемый диапазон), а затем вам нужно настроить манифест Calico перед его применением в вашем fre sh кластер.

Чтобы настроить Calico перед применением, вы должны загрузить его файл yaml и изменить диапазон сети.

  1. Загрузите сетевой манифест Calico для Kubernetes.
    $ curl https://docs.projectcalico.org/manifests/calico.yaml -O
    
  2. Если вы используете модуль CIDR 192.168.0.0/24, перейдите к следующему шагу. Если вы используете другой CIDR pod, используйте следующие команды для установки переменной среды с именем POD_CIDR, содержащей ваш CIDR pod, и замените 192.168.0.0/24 в манифесте на CIDR pod.
    $ POD_CIDR="<your-pod-cidr>" \
    sed -i -e "s?192.168.0.0/16?$POD_CIDR?g" calico.yaml
    
  3. Примените манифест, используя следующую команду.
    $ kubectl apply -f calico.yaml
    
...