Как другой вариант более сложного, но и более гибкого решения по установке сетевого плагина для контейнеров.
В отличии от Flannel Сalico позволяет более гибко управлять сетевыми политиками.
Подробности смотрите в документации.
Устанавливаем из манифеста.
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
Теперь, когда у нас есть сеть для подов внутри кластера, добавим поддержку 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 в созданный кластер.