Содержание
Устанавливаем сетевой плагин 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
NAME | READY | STATUS | RESTARTS | AGE | IP | NODE | NOMINATED NODE | READINESS 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
NAME | TYPE | CLUSTER-IP | EXTERNAL-IP | PORT(S) | AGE |
---|---|---|---|---|---|
nginx | LoadBalancer | 10.109.56.55 | 192.168.254.230 | 80:31402/TCP | 2m |
Все выдано правильно.
Далее установим Nginx-Ingress в созданный кластер.