Это наверное самый простой вариант сетевого плагина (CNI) для кластера kubernet.
Flannel отвечает за предоставление сети 3 уровня между несколькими узлами в кластере. Flannel не контролирует, как контейнеры подключаются к хосту, а только то, как трафик передается между хостами. В нем отсутствуют сетевые политики и управления трафиком.
Трафик между нодами по умолчанию инкапсулируется в VXLAN. Но поддерживаются и другие типы инкапсуляции, включая WireGuard.
Скачиваем:
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
Смотрим, какая сеть у нас прописана в кластере для pods:
kubectl cluster-info dump | grep -m 1 cluster-cidr
«–cluster-cidr=10.244.0.0/16»
(мы ее явно указывали при создании кластера)
ищем в скаченном файле kube-flannel.yml раздел сетевой настройки и указываем ту же самую сеть, что в кластере:
net-conf.json: | { "Network": "10.244.0.0/16", "EnableNFTables": false, "Backend": { "Type": "vxlan" } }
там же, при желании, можно указать тип backend-а инкапсуляции трафика.
Теперь можно применить настройки:
kubectl apply -f kube-flannel.yml
после установки сетевого плагина кластер перейдет в состояние Ready:
kebectl get nodes
NAME | STATUS | ROLES | AGE | VERSION |
---|---|---|---|---|
k8s-master-71 | Ready | control-plane | 1h | v1.31.1 |
k8s-master-72 | Ready | control-plane | 1h | v1.31.1 |
k8s-master-73 | Ready | control-plane | 1h | v1.31.1 |
k8s-worker-74 | Ready | <none> | 1h | v1.31.1 |
k8s-worker-75 | Ready | <none> | 1h | v1.31.1 |
Теперь, когда у нас есть сеть для подов внутри кластера, добавим поддержку load-balance-ра для доступа к подам из внешних сетей.
MetalLB самый простой (по моему мнению) вариант для кластеров kubernet.
Хотя он поддерживает BGP протокол, при котором достигается реальная балансировка (multipath) трафика между нодами, в простейшем случае мы будет использовать только L2.
Сначала подготовим arp кластера, что бы MetalLB мог слать ARP анонсы при изменении адреса:
Открываем конфиг кластера для редактирования:
kubectl edit configmap -n kube-system kube-proxy
Находим следующие строки и правим их как указано:
apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration ipvs: strictARP: true <= вот это поправить
По другому, это можно сделать так:
kubectl get configmap kube-proxy -n kube-system -o yaml | \ sed -e "s/strictARP: false/strictARP: true/" | \ kubectl apply -f - -n kube-system
Теперь установим манифест:
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/<VERSION>/config/manifests/metallb-native.yaml
<VERSION> - актуальную версию можно поглядеть на сайте: https://metallb.universe.tf/installation/
Ну и теперь, надо немного настроить MetalLB.
Создаем файлик со следующей конфигурацией:
Во первых, укажем ip pool из которого будем выдавать адреса и во вторых, укажем, что надо посылать ARP для этого пула адресов:
--- apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: my-pool namespace: metallb-system spec: addresses: - 192.168.254.230-192.168.254.235 --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: my-l2-advert namespace: metallb-system spec: ipAddressPools: - my-pool
Про остальные параметры конфигурации (а так же, про конфигурацию анонсов BGP префиксов) можно почитать: https://metallb.universe.tf/configuration/
Применим этот файлик:
kubectl apply -f <ConfigFileName>
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-qzwkw | 1/1 | Running | 0 | 77s | 10.244.4.3 | 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.108.23.11 | 192.168.254.230 | 80:31402/TCP | 1m |
Все выдано правильно.
Далее установим Nginx-Ingress в созданный кластер.