====== Kubernetes: CentOS-8 ====== Кластер будет устанавливаться на машины с 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 В файле определяем: * Имя и название домена кластера. * Сеть, используемую для выделения 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.cluster.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.cluster.local NotReady 2m4s v1.19.4 ip-218-161 NotReady master 2m55s v1.19.4 ip-218-162 NotReady 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 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 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 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 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 mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 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: 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: 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: 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: 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 coredns-f9fd979d6-hxmwx 0/1 Pending 0 16m etcd-ip-218-161 1/1 Running 0 17m 192.168.218.161 ip-218-161 kube-apiserver-ip-218-161 1/1 Running 0 17m 192.168.218.161 ip-218-161 kube-controller-manager-ip-218-161 1/1 Running 0 17m 192.168.218.161 ip-218-161 kube-proxy-8z28w 1/1 Running 0 16m 192.168.218.161 ip-218-161 kube-proxy-drst4 1/1 Running 0 16m 192.168.218.162 ip-218-162 kube-proxy-rnkhq 1/1 Running 0 16m 192.168.174.163 ip-174-163.cluster.local kube-scheduler-ip-218-161 1/1 Running 0 17m 192.168.218.161 ip-218-161 Мы видим, что поды 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 хоста.