Содержание

Устанавливаем сетевой плагин Calico CNI+PureLB

Как другой вариант более сложного, но и более гибкого решения по установке сетевого плагина для контейнеров.
В отличии от Flannel Сalico позволяет более гибко управлять сетевыми политиками.
Подробности смотрите в документации.

Calico

Устанавливаем из манифеста.

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/<version>/manifests/tigera-operator.yaml

<version> - актуальную версию можно поглядеть тут: https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart

В скачанном файле

Скачиваем конфигурацию calico:

wget https://raw.githubusercontent.com/projectcalico/calico/<version>/manifests/custom-resources.yaml

<version> - актуальную версию можно поглядеть тут: https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart

Смотрим, какая сеть у нас прописана в кластере для pods:

kubectl cluster-info dump | grep -m 1 cluster-cidr

«–cluster-cidr=10.244.0.0/16»
(мы ее явно указывали при создании кластера)

Правим скачанный файл - custom-resources.yaml:

apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  # Configures Calico networking.
  calicoNetwork:
    bgp: Disabled
    ipPools:
    - name: default-ipv4-ippool
      blockSize: 26
      cidr: 10.244.0.0/16
      encapsulation: VXLANCrossSubnet
      natOutgoing: Enabled
      nodeSelector: all()

При необходимости, можно дополнительно поднастроить так как нужно.
Описание параметров тут: https://docs.tigera.io/calico/latest/reference/installation/api#operator.tigera.io/v1.Installation

Применяем конфигурацию:

kubectl apply -f custom-resources.yaml

Дожидаемся, пока все перейдет в статус Running:

watch kubectl -n calico-system get po

PureLB

Теперь, когда у нас есть сеть для подов внутри кластера, добавим поддержку load-balance-ра для доступа к подам из внешних сетей.

Подготавливаем:

sudo cat <<EOF | sudo tee /etc/sysctl.d/k8s_arp.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
EOF

sudo sysctl --system

net.ipv4.conf.all.arp_ignore - определяет различные режимы ответа, на входящие ARP запросы, которые производят разрешение локальных IP адресов. Возможные значения:
0 - установлено по умолчанию. Ответ производится на ARP запрос, пришедший на любой сетевой интерфейс системы, на разрешение любого целевого локального IP адреса.
1 - ответ производится в случае, если ARP запрос на разрешение IP адреса пришел на интерфейс, содержащий этот IP адрес.
2 - ответ производится в случае, если ARP запрос на разрешение IP адреса пришел на интерфейс, содержащий этот IP адрес, причем IP адрес отправителя должен находится в одной подсети целевым IP адресом.
3 - не отвечать, если IP адрес источника находится в той же сети.
4-7 - зарезервированы.
8 - не отвечать на запросы.

net.ipv4.conf.all.arp_announce - определяет, каким образом будет анонсироваться локальный IP адрес в исходящих ARP запросах:
0 - установлено по умолчанию. Используется любой локальный адрес, настроенный на любом интерфейсе.
1 - попытаться исключить локальные адреса, которые не принадлежат к подсети. в которой находится целевой IP адрес. В случае отсутствия такого локального IP адреса будет использоваться поведение за номером 2.
2 - Всегда использовать лучший локальный адрес, с которого нам удобно посылать запрос в целевую подсеть. Такой IP адрес выбирается из первичных IP адресов, находящихся в той же подсети, что и целевой IP адрес, на всех локальных интерфейсах. Если ничего подходящего нет, то будет использован первый ip адрес на интерфейсе, с которого будет произведен запрос или на всех других интерфейсах.

Устанавливаем PureLB используя helm:

helm repo add purelb https://gitlab.com/api/v4/projects/<version>/packages/helm/stable
helm repo update
helm install --create-namespace --namespace=purelb purelb purelb/purelb

<version> - актуальную версию можно поглядеть тут: https://purelb.gitlab.io/purelb/install/install/

Создаем файл конфигурации pure-conf.yaml для PureLB и Calico:

---
apiVersion: purelb.io/v1
kind: ServiceGroup
metadata:
  name: default
  namespace: purelb
spec:
  local:
    v4pools:
    - subnet: 192.168.254.0/24
      pool: 192.168.254.230-192.168.254.235
      aggregation: /32
   
---
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
  name: purelb-ipv4
spec:
  cidr: 192.168.254.0/24
  disabled: true

В которым указываем адреса, подсеть и маску которые будут выдваваться load-balancerom PureLB

И применяем его:

kubectl apply -f pure-conf.yaml

Проверяем работу сети кластера

kubectl create ns test
kubectl -n test create deployment nginx --image=nginx
kubectl -n test expose deployment nginx --type=LoadBalancer --port 80

Смотрим, какой адрес flannel выдал для нашего pod-а:

kubectl -n test get po -o wide
NAMEREADYSTATUSRESTARTSAGEIPNODENOMINATED NODEREADINESS GATES
nginx-676b6c5bbc-z67r5 1/1 Running 0 77s 10.244.235.68 k8s-worker-74 <none> <none>

ip адрес для pod-а выдан верный.

Смотрим, какой адрес выдал MetalLB в качестве внешнего:

kubectl -n test get svc 
NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE
nginx LoadBalancer 10.109.56.55 192.168.254.230 80:31402/TCP 2m

Все выдано правильно.

Далее установим Nginx-Ingress в созданный кластер.