Межкластерное соединение (Alpha)

Поддерживается настройка межкластерного соединения между кластерами с одинаковым сетевым режимом Kube-OVN, чтобы поды в кластерах могли взаимодействовать друг с другом. Cluster Interconnect Controller — это расширяемый компонент, предоставляемый Kube-OVN, который отвечает за сбор сетевой информации между разными кластерами и соединение сетей нескольких кластеров путем выдачи маршрутов.

Содержание

Предварительные требования

  • CIDR подсетей разных кластеров не должны пересекаться.

  • Необходим набор машин, доступных по IP для kube-ovn-controller каждого кластера, для развертывания контроллеров межкластерного соединения.

  • Для каждого кластера должен существовать набор машин, доступных kube-ovn-controller по IP для межкластерного соединения, которые впоследствии будут использоваться в качестве шлюзовых узлов.

  • Эта функция доступна только для VPC по умолчанию, пользовательские VPC не могут использовать функцию межсоединения.

Построен контроллер подключения Multi-node Kube-OVN

Доступны три метода развертывания: Deploy deployment (поддерживается в платформе с версии v3.16.0 и выше), Docker deployment и Containerd deployment.

Deploy Deployment

Примечание: Этот метод развертывания поддерживается в платформе с версии v3.16.0 и выше.

Шаги выполнения

  1. Выполните следующую команду на Master-узле кластера, чтобы получить скрипт установки install-ic-server.sh.

    wget https://github.com/kubeovn/kube-ovn/blob/release-1.12/dist/images/install-ic-server.sh
  2. Откройте скрипт в текущем каталоге и измените параметры следующим образом.

    REGISTRY="kubeovn"
    VERSION=""

    Измените параметры на следующие:

    REGISTRY="<адрес репозитория образов Kube-OVN>"   ## Например: REGISTRY="registry.alauda.cn:60080/acp/"
    VERSION="<версия Kube-OVN>"   ## Например: VERSION="v1.9.25"
  3. Сохраните скрипт и выполните его следующей командой.

    sh install-ic-server.sh

Docker и Containerd Deployment

  1. Выберите три и более узлов в любом кластере для развертывания Interconnected Controller. В этом примере подготовлено три узла.

  2. Выберите любой узел в качестве Leader и выполните команды в соответствии с выбранным методом развертывания.

    Примечание: Перед настройкой проверьте наличие каталога ovn в /etc. Если его нет, создайте его командой mkdir /etc/ovn.

    • Команды для Docker deployment

      Примечание: Выполните команду docker images | grep ovn, чтобы получить адрес образа Kube-OVN.

      • Команда для Leader-узла:

        docker run \
        --name=ovn-ic-db \
        -d \
        --env "ENABLE_OVN_LEADER_CHECK=false" \
        --network=host \
        --restart=always \
        --privileged=true \
        -v /etc/ovn/:/etc/ovn \
        -v /var/run/ovn:/var/run/ovn \
        -v /var/log/ovn:/var/log/ovn \
        -e LOCAL_IP="<IP-адрес текущего узла>" \   ## Например: -e LOCAL_IP="192.168.39.37"
        -e NODE_IPS="<IP-адреса всех узлов через запятую>" \   ## Например: -e NODE_IPS="192.168.39.22,192.168.39.24,192.168.39.37"
        <адрес репозитория образов> bash start-ic-db.sh    ## Например: 192.168.39.10:60080/acp/kube-ovn:v1.8.8 bash start-ic-db.sh
      • Команды для остальных двух узлов:

        docker run \
        --name=ovn-ic-db \
        -d \
        --env "ENABLE_OVN_LEADER_CHECK=false" \
        --network=host \
        --restart=always \
        --privileged=true \
        -v /etc/ovn/:/etc/ovn \
        -v /var/run/ovn:/var/run/ovn \
        -v /var/log/ovn:/var/log/ovn \
        -e LOCAL_IP="<IP-адрес текущего узла>" \   ## Например: -e LOCAL_IP="192.168.39.24"
        -e LEADER_IP="<IP-адрес Leader-узла>" \  ## Например: -e LEADER_IP="192.168.39.37"
        -e NODE_IPS="<IP-адреса всех узлов через запятую>" \   ## Например: -e NODE_IPS="192.168.39.22,192.168.39.24,192.168.39.37"
        <адрес репозитория образов> bash start-ic-db.sh   ## Например: 192.168.39.10:60080/acp/kube-ovn:v1.8.8  bash start-ic-db.sh
    • Команды для Containerd deployment

      Примечание: Выполните команду crictl images | grep ovn, чтобы получить адрес образа Kube-OVN.

      • Команда для Leader-узла:

        ctr -n k8s.io run \
        -d \
        --env "ENABLE_OVN_LEADER_CHECK=false" \
        --net-host \
        --privileged \
        --mount="type=bind,src=/etc/ovn/,dst=/etc/ovn,options=rbind:rw" \
        --mount="type=bind,src=/var/run/ovn,dst=/var/run/ovn,options=rbind:rw" \
        --mount="type=bind,src=/var/log/ovn,dst=/var/log/ovn,options=rbind:rw" \
        --env="NODE_IPS=<IP-адреса всех узлов через запятую>" \   ## Например: --env="NODE_IPS="192.168.178.97,192.168.181.93,192.168.177.192""
        --env="LOCAL_IP=<IP-адрес текущего узла>" \   ## Например: --env="LOCAL_IP="192.168.178.97""
        <адрес репозитория образов> ovn-ic-db bash start-ic-db.sh   ## Например: registry.alauda.cn:60080/acp/kube-ovn:v1.9.25 ovn-ic-db bash start-ic-db.sh
      • Команды для остальных двух узлов:

        ctr -n k8s.io run \
        -d \
        --env "ENABLE_OVN_LEADER_CHECK=false" \
        --net-host \
        --privileged \
        --mount="type=bind,src=/etc/ovn/,dst=/etc/ovn,options=rbind:rw" \
        --mount="type=bind,src=/var/run/ovn,dst=/var/run/ovn,options=rbind:rw" \
        --mount="type=bind,src=/var/log/ovn,dst=/var/log/ovn,options=rbind:rw" \
        --env="NODE_IPS=<IP-адреса всех узлов через запятую>" \   ## Например: --env="NODE_IPS="192.168.178.97,192.168.181.93,192.168.177.192"" \
        --env="LOCAL_IP=<IP-адрес текущего узла>" \   ## Например: --env="LOCAL_IP="192.168.181.93""
        --env="LEADER_IP=<IP-адрес Leader-узла>" \   ## Например: --env="LEADER_IP="192.168.178.97""
        <адрес репозитория образов> ovn-ic-db bash start-ic-db.sh   ## Например: registry.alauda.cn:60080/acp/kube-ovn:v1.9.25 ovn-ic-db bash start-ic-db.sh

Развертывание контроллера межкластерного соединения в глобальном кластере

На любом управляющем узле глобального кластера замените параметры согласно комментариям и выполните следующую команду для создания ресурса ConfigMap.

Примечание: Для корректной работы ConfigMap с именем ovn-ic в глобальном кластере не разрешается изменять. Если необходимо изменить параметры, удалите ConfigMap и корректно настройте его заново перед применением.

cat << EOF |kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: ovn-ic
  namespace: cpaas-system
data:
  ic-db-host: "192.168.39.22,192.168.39.24,192.168.39.37"   # Адрес узлов, где расположен контроллер межкластерного соединения, в данном случае локальные IP трёх узлов с контроллером
  ic-nb-port: "6645"            # Порт nb контроллера межкластерного соединения, по умолчанию 6645
  ic-sb-port: "6646"            # Порт sb контроллера межкластерного соединения, по умолчанию 6646
EOF

Присоединение к межкластерному соединению

Добавление кластера с сетевым режимом Kube-OVN в межкластерное соединение.

Предварительные условия

Созданные подсети, ovn-default и подсети для присоединения в кластере не должны конфликтовать с сегментами других кластеров в группе межкластерного соединения.

Порядок действий

  1. В левой навигационной панели нажмите Clusters > Cluster of clusters.

  2. Нажмите на имя кластера, который нужно добавить в межкластерное соединение.

  3. В правом верхнем углу нажмите Options > Cluster Interconnect.

  4. Нажмите Join the cluster interconnect.

  5. Выберите шлюзовый узел для кластера.

  6. Нажмите Join.

Соответствующие операции

Обновление информации о шлюзовом узле в межсоединённом кластере

Обновление информации о шлюзовых узлах кластера, которые уже присоединились к группе межкластерного соединения.

Порядок действий

  1. В левой навигационной панели нажмите Clusters > Cluster of clusters.

  2. Нажмите на имя кластера, для которого нужно обновить информацию о шлюзовом узле.

  3. В правом верхнем углу нажмите Operations > Cluster Interconnect.

  4. Нажмите Update Gateway Node для кластера, информацию о шлюзовом узле которого нужно обновить.

  5. Повторно выберите шлюзовый узел для кластера.

  6. Нажмите Update.

Выход из межкластерного соединения

Кластер, который присоединился к группе межкластерного соединения, выходит из межкластерного соединения, при этом разрывается связь между подами этого кластера и подами внешних кластеров.

Порядок действий

  1. В левой навигационной панели нажмите Clusters > Cluster of clusters.

  2. Нажмите на имя кластера, который нужно вывести из эксплуатации.

  3. В правом верхнем углу нажмите Options > Cluster Interconnect.

  4. Нажмите Exit cluster interconnection для кластера, из которого хотите выйти.

  5. Введите имя кластера корректно.

  6. Нажмите Exit.

Очистка остатков межсоединённого кластера

Если кластер удаляется без выхода из межкластерного соединения, на контроллере могут остаться некоторые остаточные данные. При попытке повторно создать кластер на этих узлах и присоединить его к межкластерному соединению могут возникать ошибки. Подробную информацию об ошибках можно посмотреть в логе /var/log/ovn/ovn-ic.log контроллера (kube-ovn-controller). Некоторые сообщения об ошибках могут содержать:

transaction error: {"details":"Transaction causes multiple rows in xxxxxx"}

Шаги выполнения

  1. Выйдите из межкластерного соединения для кластера, который нужно присоединить.

  2. Выполните скрипт очистки в контейнере или pod.

    Скрипт очистки можно выполнить напрямую либо в контейнере ovn-ic-db, либо в pod ovn-ic-controller. Выберите один из следующих способов:

    Способ 1: Выполнение в контейнере ovn-ic-db

    • Войдите в контейнер ovn-ic-db и выполните очистку следующими командами.

      ctr -n k8s.io task exec -t --exec-id ovn-ic-db ovn-ic-db /bin/bash

      Затем выполните одну из следующих команд очистки:

      • Очистка по имени исходного кластера. Замените <cluster-name> на имя исходного кластера:

        ./clean-ic-az-db.sh <cluster-name>
      • Очистка по имени любого узла исходного кластера. Замените <node-name> на имя любого узла исходного кластера:

        ./clean-ic-az-db.sh <node-name>

    Способ 2: Выполнение в pod ovn-ic-controller

    • Войдите в pod ovn-ic-controller и выполните очистку следующими командами.

      kubectl -n kube-system exec -ti $(kubectl get pods -n kube-system -l app=ovn-ic-controller -o custom-columns=NAME:.metadata.name --no-headers) -- /bin/bash

      Затем выполните одну из следующих команд очистки:

      • Очистка по имени исходного кластера. Замените <cluster-name> на имя исходного кластера:

        ./clean-ic-az-db.sh <cluster-name>
      • Очистка по имени любого узла исходного кластера. Замените <node-name> на имя любого узла исходного кластера:

        ./clean-ic-az-db.sh <node-name>

Удаление межсоединённого кластера

Примечание: Шаг 1Шаг 3 необходимо выполнить на всех рабочих кластерах, присоединившихся к межсоединённому кластеру.

Шаги выполнения

  1. Выйдите из межкластерного соединения. Есть два способа выхода, выберите подходящий.
    • Удалите ConfigMap с именем ovn-ic-config в рабочем кластере командой:

      kubectl -n kube-system delete cm ovn-ic-config
    • Выйдите из межкластерного соединения через операции платформы.

  2. Войдите в Leader Pod ovn-central следующей командой.

    kubectl -n kube-system exec -ti $(kubectl get pods -n kube-system -lovn-nb-leader=true -o custom-columns=NAME:.metadata.name --no-headers) -- /bin/bash
  3. Очистите логический коммутатор ts следующей командой.
    ovn-nbctl ls-del ts
  4. Войдите на узел, где развернут контроллер, и удалите контроллер.

    • Команды для Docker:

      docker stop ovn-ic-db
      docker rm ovn-ic-db
    • Команды для Containerd:

      ctr -n k8s.io task kill ovn-ic-db
      ctr -n k8s.io containers rm ovn-ic-db
  5. Удалите ConfigMap с именем ovn-ic в глобальном кластере следующей командой.

    kubectl delete cm ovn-ic -n cpaas-system

Настройка высокой доступности шлюза кластера

Чтобы настроить высокодоступный шлюз кластера после присоединения к межкластерному соединению, выполните следующие шаги:

  1. Войдите в кластер, который нужно преобразовать в высокодоступный шлюз, и выполните команду для изменения поля enable-ic на false.

    Примечание: Изменение поля enable-ic на false прервет межкластерное соединение до тех пор, пока оно снова не будет установлено в true.

    kubectl edit cm ovn-ic-config -n kube-system
  2. Измените конфигурацию шлюзовых узлов, обновив поле gw-nodes, разделяя узлы английскими запятыми; также измените поле enable-ic на true.

    kubectl edit cm ovn-ic-config -n kube-system
    
    # Пример конфигурации
    apiVersion: v1
    data:
      auto-route: "true"
      az-name: docker
      enable-ic: "true"
      gw-nodes: 192.168.188.234,192.168.189.54
      ic-db-host: 192.168.178.97
      ic-nb-port: "6645"
      ic-sb-port: "6646"
    kind: ConfigMap
    metadata:
      creationTimestamp: "2023-06-13T08:01:16Z"
      name: ovn-ic-config
      namespace: kube-system
      resourceVersion: "99671"
      uid: 6163790a-ad9d-4d07-ba82-195b11244983
  3. Перейдите в Pod в кластере ovn-central и выполните команду ovn-nbctl lrp-get-gateway-chassis {имя текущего кластера}-ts, чтобы проверить, что конфигурация вступила в силу.

    ovn-nbctl lrp-get-gateway-chassis docker-ts
    
    # Пример вывода. В данном случае значения 100 и 99 — это приоритеты, чем выше значение, тем выше приоритет соответствующего шлюзового узла.
    docker-ts-71292a21-131d-492a-9f0c-0611af458950 100
    docker-ts-1de7ee15-f372-4ab9-8c85-e54d61ea18f1 99