Создаем сервера на основе Ubuntu 20.04
Отключаем iptables (ufw, netfilter-persistent), apparmor
Сгенерировать, если его ещё нет, ssh ключ:
ssh-keygen
Установить ssh ключ на машины кластера.
ssh-copy-id master1 ssh-copy-id master2 ssh-copy-id master3 ssh-copy-id worker1 ssh-copy-id worker2 ssh-copy-id worker3
git clone https://github.com/kubernetes-sigs/kubespray/ cd kubespray/inventory cp -r sample cluster cd cluster
Перейдите в директорию inventory.
Скопируйте пример конфигурации кластера sample в cluster.
Перейдите в директорию cluster и отредактируйте файл inventory.ini
Пример файла:
[all] master1.server.local ansible_host=10.1.0.1 ansible_user=root master2.server.local ansible_host=10.1.0.2 ansible_user=root master3.server.local ansible_host=10.1.0.3 ansible_user=root worker1.server.local ansible_host=10.1.0.4 ansible_user=root worker2.server.local ansible_host=10.1.0.5 ansible_user=root worker3.server.local ansible_host=10.1.0.6 ansible_user=root [kube_control_plane] master1.server.local master2.server.local master3.server.local [etcd] master1.server.local master2.server.local master3.server.local [kube_node] worker1.server.local worker2.server.local worker3.server.local [calico_rr] [k8s-cluster:children] kube_control_plane kube_node calico_rr
Остальные параметры будем изменять в файлах в директории group_vars.
для использования type:LoadBalancer и при отсутствии аннотаций балансировщиков, предлагаемых провайдером, используем MetalLB в режиме layer2 https://metallb.universe.tf/concepts/layer2/ В этом случае очень много ньюансов установки, для некоторых провайдеров понадобится отключение режима контроля источника iptables, где-то необходимо будет на маршрутизатора править настройки и т.д. Поэтому установка MetalLB сугубо опциональна.
Переходим в корень kubespray и запускаем установку кластера. Для этого в системе должны быть установлены интерпретатор python и pip.
pip install -r requirements.txt ansible-playbook -i inventory/cluster/inventory.ini cluster.yml
После установки на ноде master1 можно посмотреть состояние кластера.
kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION master1.server.local Ready master1,master 25m v1.20.2 10.1.0.1 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 master2.server.local Ready master2,master 25m v1.20.2 10.1.0.2 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 master3.server.local Ready master3,master 24m v1.20.2 10.1.0.3 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 worker1.server.local Ready <none> 22m v1.20.2 10.1.0.4 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 worker2.server.local Ready <none> 22m v1.20.2 10.1.0.5 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 worker3.server.local Ready <none> 13m v1.20.2 10.1.0.6 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64
Для просмотра контейнеров на ноде, используем docker
docker ps IMAGE CREATED STATE NAME ATTEMPT POD ID 43154ddb57a83 15 minutes ago Running kube-proxy 0 a5bda83433ae1 ed2c44fbdd78b 15 minutes ago Running kube-scheduler 0 512d577e92ad5 a27166429d98e 15 minutes ago Running kube-controller-manager 0 4f6fa61c307dc 90f9d984ec9a3 23 minutes ago Running node-cache 0 f7d86f788f4eb cb12d94b194b3 23 minutes ago Running calico-node 0 794808481e7ae a8c2fdb8bf76e 26 minutes ago Running kube-apiserver 0 55baeed8da067 d1985d4043858 26 minutes ago Running etcd 0 b43a297393ef9 kubectl get pods --all-namespaces POD ID CREATED STATE NAME NAMESPACE ATTEMPT RUNTIME a5bda83433ae1 15 minutes ago Ready kube-proxy-xbqkc kube-system 0 (default) 512d577e92ad5 15 minutes ago Ready kube-scheduler-control1.server.local kube-system 0 (default) 4f6fa61c307dc 15 minutes ago Ready kube-controller-manager-control1.server.local kube-system 0 (default) f7d86f788f4eb 23 minutes ago Ready nodelocaldns-szggp kube-system 0 (default) 794808481e7ae 23 minutes ago Ready calico-node-kxlpj kube-system 0 (default) 55baeed8da067 27 minutes ago Ready kube-apiserver-control1.server.local kube-system 0 (default) b43a297393ef9 27 minutes ago Ready etcd-control1.server.local kube-system 0 (default)
Установите в bash автодополнение для команд kubectl:
source <(kubectl completion bash) echo "source <(kubectl completion bash)">> ~/.bashrc