Да, мы опять ставим кластер. Но на сей раз сделаем «упор» на сети. Кластер будет устанавливаться на машины с CentOS 8.
Подготовка
На всех машинах кластера отключаем:
- swap.
- SELinux.
- Firewall.
Устанавливаем докер
curl -s https://raw.githubusercontent.com/BigKAA/youtube/master/net/01-install/00-install-docker-ce8.sh | bash
docker version
Установка кубернетес
Установка пакетов
Мастер нода
curl -s https://raw.githubusercontent.com/BigKAA/youtube/master/net/01-install/01-install-k8s-masternode-ce8.sh | bash
Worker ноды
curl -s https://raw.githubusercontent.com/BigKAA/youtube/master/net/01-install/02-install-k8s-workernode-ce8.sh | bash
Мастер нода.
Создаём конфигурационный файл для установки кластера.
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
clusterName: cluster.local
dns:
type: CoreDNS
networking:
dnsDomain: cluster.local
podSubnet: 192.168.180.0/24
serviceSubnet: 192.168.185.0/24
scheduler:
extraArgs:
bind-address: 0.0.0.0
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs # iptables
В файле определяем:
- Имя и название домена кластера.
- Сеть, используемую для выделения IP адресов для подов.
- Сеть, используемую для выделения IP адресов для сервисов.
- Программу, которая будет использоваться для NAT преобразований.
curl -s https://raw.githubusercontent.com/BigKAA/youtube/master/net/01-install/03-kube-config.yaml -o kube-config.yaml
Тестовый запуск установки, ищем ошибки.
kubeadm init --config kube-config.yaml --dry-run | less
Если все хорошо — устанавливаем мастер ноду.
kubeadm init --config kube-config.yaml
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
Смотрим что получилось
kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-218-161.kryukov.local NotReady master 2m32s v1.19.3
Worker нода
На мастер ноде получаем токен для подключения к кластеру worker ноды.
kubeadm token create --print-join-command
Запускаем установку. Токены берем из вывода предыдущей команды.
kubeadm join 192.168.218.161:6443 --token uctr1t.w80eup2o7v19r9xf \
--discovery-token-ca-cert-hash sha256:7f141f014028fed38611479249f7a744a183bde100afe141ee937967693db739
Смотрим что получилось.
kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-174-163.kryulov.local NotReady <none> 2m4s v1.19.4
ip-218-161 NotReady master 2m55s v1.19.4
ip-218-162 NotReady <none> 2m18s v1.19.4
Видим, что DNS не запустился из-за отсутствия настроенной сети внутри кластера.
Удалим все taints с узлов кластера.
kubectl taint nodes --all node-role.kubernetes.io/master-
Состояние сети по умолчанию.
Смотрим сетевые интерфейсы Linux машины. Я предпочитаю использовать классические утилиты работы с сетью, поскольку их вывод более читабелен, по сравнению с утилитой ip. Для использования этих утилит в CentOS 8 необходимо установить пакет net-tools
ifconfig -a
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:b4:98:6e:53 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.218.161 netmask 255.255.255.0 broadcast 192.168.218.255
inet6 fe80::20c:29ff:fec2:9ef5 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:c2:9e:f5 txqueuelen 1000 (Ethernet)
RX packets 281779 bytes 404543348 (385.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 86123 bytes 8976144 (8.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
kube-ipvs0: flags=130<BROADCAST,NOARP> mtu 1500
inet 192.168.185.10 netmask 255.255.255.255 broadcast 0.0.0.0
ether 46:d6:19:03:8d:4d txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 381808 bytes 74988368 (71.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 381808 bytes 74988368 (71.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
или
ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:c2:9e:f5 brd ff:ff:ff:ff:ff:ff
inet 192.168.218.161/24 brd 192.168.218.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fec2:9ef5/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:b4:98:6e:53 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
4: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default
link/ether 46:d6:19:03:8d:4d brd ff:ff:ff:ff:ff:ff
inet 192.168.185.10/32 scope global kube-ipvs0
valid_lft forever preferred_lft forever
inet 192.168.185.1/32 scope global kube-ipvs0
valid_lft forever preferred_lft forever
Смотрим сети Linux машины.
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.218.1 0.0.0.0 UG 0 0 0 ens33
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.174.0 192.168.218.160 255.255.255.0 UG 0 0 0 ens33
192.168.218.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
или
ip r s
default via 192.168.218.1 dev ens33
169.254.0.0/16 dev ens33 scope link metric 1002
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.174.0/24 via 192.168.218.160 dev ens33
192.168.218.0/24 dev ens33 proto kernel scope link src 192.168.218.161
Обратимся к докеру. Например на мастер ноде посмотрим какие сети есть в докере.
docker network ls
NETWORK ID NAME DRIVER SCOPE
9edbbcace7d0 bridge bridge local
93135ec9cba0 host host local
3eff5edcb254 none null local
Посмотрим, подробно на каждую сеть докера.
docker network inspect bridge
docker network inspect null
docker network inspect host
Исследуем сеть hosts. Посмотрим какие поды сейчас есть в кластере kubernetes. Разумеется, в вашем кластере имена подов будут отличаться.
kubectl -n kube-system get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-f9fd979d6-frz7x 0/1 Pending 0 16m <none> <none> <none> <none>
coredns-f9fd979d6-hxmwx 0/1 Pending 0 16m <none> <none> <none> <none>
etcd-ip-218-161 1/1 Running 0 17m 192.168.218.161 ip-218-161 <none> <none>
kube-apiserver-ip-218-161 1/1 Running 0 17m 192.168.218.161 ip-218-161 <none> <none>
kube-controller-manager-ip-218-161 1/1 Running 0 17m 192.168.218.161 ip-218-161 <none> <none>
kube-proxy-8z28w 1/1 Running 0 16m 192.168.218.161 ip-218-161 <none> <none>
kube-proxy-drst4 1/1 Running 0 16m 192.168.218.162 ip-218-162 <none> <none>
kube-proxy-rnkhq 1/1 Running 0 16m 192.168.174.163 ip-174-163.kryulov.local <none> <none>
kube-scheduler-ip-218-161 1/1 Running 0 17m 192.168.218.161 ip-218-161 <none> <none>
Мы видим, что поды coredns не инициализированы. Это нормально. Они не будут работать до тех пор, пока мы не добавим реализацию сетевого драйвера кубернетеса.
Остальные поды работают и имеют ip адреса, соответствующие ip адресам Linux машин. Посмотрим информацию о любом из из этих подов.
kubectl -n kube-system get pod kube-apiserver-ip-218-161 -o yaml | grep hostNetwork
hostNetwork: true
Мы уже использовали hostNetwork: true
в видео о ingress-controller, когда поды контроллера подключали напрямую к сетевому интерфейсу Linux хоста.