Существуют различные способы развертывания готового к работе кластера Kubernetes.
В этой статье мы сосредоточимся на развертывании кластера Kubernetes производственного класса с Ansible и Kubespray.
Kubespray представляет собой набор поейбуков Ansible Playbook, инвентаризации, средств обеспечения для общих задач управления конфигурацией кластеров OS / Kubernetes.
С помощью Kubespray вы можете быстро развернуть высокодоступный кластер Kubernetes на AWS, GCE, Azure, OpenStack, vSphere, Packet (bare metal) или голом железе.
Он поддерживает большинство популярных дистрибутивов Linux, таких как Debian, Ubuntu, CentOS, RHEL, Fedora, CoreOS, openSUSE и Oracle Linux 7.
Шаг 1: Подготовка инфраструктуры
Вам нужно начать с создания виртуальных машин / серверов, используемых во время развертывания кластера Kubernetes.
Это включает в себя выбор дистрибутива Linux по вашему выбору.
В моей установке я буду использовать CentOS 7 в качестве базовой ОС для всех развертываний.
$ openstack flavor list
list+----+-----------+-------+------+-----------+-------+-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+-----------+-------+------+-----------+-------+-----------+
| 0 | m1.tiny | 1024 | 10 | 0 | 1 | True |
| 1 | m1.small | 2048 | 20 | 0 | 1 | True |
| 2 | m1.medium | 4096 | 20 | 0 | 2 | True |
| 3 | m1.large | 8192 | 40 | 0 | 4 | True |
| 4 | m1.xlarge | 16384 | 40 | 0 | 4 | True |
+----+-----------+-------+------+-----------+-------+-----------+
for i in master0 master1 master2 worker0 worker1; do
openstack server create \
--image CentOS-7 \
--key-name jmutai \
--flavor m1.medium \
--security-group 7fffea2a-b756-473a-a13a-219dd0f1913a \
--network private \
$i
done
$ openstack server list
+--------------------------------------+-------------------+--------+-----------------------------------+----------+-----------+
| ID | Name | Status | Networks | Image | Flavor |
+--------------------------------------+-------------------+--------+-----------------------------------+----------+-----------+
| 5eba57c8-859c-4edb-92d3-ba76d38b56d0 | worker1 | ACTIVE | private=10.10.1.122 | CentOS-7 | m1.medium |
| 72a63616-2ba0-4542-82eb-a64acb093216 | worker0 | ACTIVE | private=10.10.1.146 | CentOS-7 | m1.medium |
| b445424c-364f-4667-9de1-559282e23ce1 | master2 | ACTIVE | private=10.10.1.134 | CentOS-7 | m1.medium |
| 6a20fa48-8ae8-4a30-a301-af32dbb67277 | master1 | ACTIVE | private=10.10.1.194 | CentOS-7 | m1.medium |
| 29ad13aa-261f-47e8-8ba5-9350f8c09847 | master0 | ACTIVE | private=10.10.1.126 | CentOS-7 | m1.medium |
+--------------------------------------+-------------------+--------+-----------------------------------+----------+-----------+
Шаг 2: клон проекта kubespray
Клон проекта репозитория:
$ git clone https://github.com/kubernetes-sigs/kubespray.git
Cloning into 'kubespray'...
remote: Enumerating objects: 17, done.
remote: Counting objects: 100% (17/17), done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 38488 (delta 2), reused 2 (delta 0), pack-reused 38471
Receiving objects: 100% (38488/38488), 11.06 MiB | 548.00 KiB/s, done.
Resolving deltas: 100% (21473/21473), done.
Перейдите в каталог проекта:
$ cd kubespray
Шаг 3: Подготовьте Локальный компьютер
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py --user
Шаг 4. Создайте файл инвентаризации кластера Kubernetes и установите зависимости
Файл инвентари состоит из 3 групп:
- kube-node: список узлов kubernetes, где будут работать поды.
- kube-master: список серверов, на которых будут работать основные компоненты kubernetes (apiserver, scheduler, controller).
- etcd: список серверов для создания сервера etcd. У вас должно быть как минимум 3 сервера для отработки отказа.
Есть также две специальные группы:
- Calico-RR: Для продвинутых случаев сети Calico
- Bastion: настройте хост-бастион, если ваши узлы не доступны напрямую
Создайте файл инвентаризации:
cp -rfp inventory/sample inventory/mycluster
Определите свой файл инвентари с IP-адресами вашего сервера и сопоставьте его с правильным назначением узла.
master0 ansible_host=10.10.1.126 ip=10.10.1.126
master1 ansible_host=10.10.1.194 ip=10.10.1.194
master2 ansible_host=10.10.1.134 ip=10.10.1.134
worker0 ansible_host=10.10.1.146 ip=10.10.1.146
worker1 ansible_host=10.10.1.122 ip=10.10.1.122
# ## configure a bastion host if your nodes are not directly reachable
# bastion ansible_host=x.x.x.x ansible_user=some_user
[kube-master]
master0
master1
master2
[etcd]
master0
master1
master2
[kube-node]
worker0
worker1
[calico-rr]
[k8s-cluster:children]
kube-master
kube-node
calico-rr
$ sudo tee -a /etc/hosts <<EOF
10.10.1.126 master0
10.10.1.194 master1
10.10.1.134 master2
10.10.1.146 worker0
10.10.1.122 worker1
EOF
$ eval `ssh-agent -s` && ssh-add Agent pid 4516 Enter passphrase for /home/centos/.ssh/id_rsa: Identity added: /home/centos/.ssh/id_rsa (/home/centos/.ssh/id_rsa)
Установить зависимости из файла require.txt
pip install --user -r requirements.txt
$ ansible --version
ansible 2.7.12
config file = /home/centos/kubespray/ansible.cfg
configured module search path = [u'/home/centos/kubespray/library']
ansible python module location = /home/centos/.local/lib/python2.7/site-packages/ansible
executable location = /home/centos/.local/bin/ansible
python version = 2.7.5 (default, Jun 20 2019, 20:27:34) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
cat inventory/mycluster/group_vars/all/all.yml
cat inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml
Шаг 5: Разверните кластер Kubernetes с помощью Kubespray Ansible Playbook
Теперь запустите playbook, чтобы развернуть готовый Kubernetes с Ansible.
Обратите внимание, что целевые серверы должны иметь доступ к Интернету для получения образов Docker.
Начните новый сеанс tmux.
tmux new -s kubespray
Запустите развертывание, выполнив команду:
ansible-playbook -i inventory/mycluster/inventory.ini --become \
--user=centos --become-user=root cluster.yml
Замените centos на удаленного пользователя, и ansible будет подключаться к узлам через него.
Вы не должны получить невыполненное задание при исполнении.
$ sudo su - # kubectl config get-clusters NAME cluster.local # kubectl cluster-info Kubernetes master is running at https://10.10.1.126:6443 coredns is running at https://10.10.1.126:6443/api/v1/namespaces/kube-system/services/coredns:dns/proxy kubernetes-dashboard is running at https://10.10.1.126:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. # kubectl config view apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://10.10.1.126:6443 name: cluster.local contexts: - context: cluster: cluster.local user: kubernetes-admin name: kubernetes-admin@cluster.local current-context: kubernetes-admin@cluster.local kind: Config preferences: {} users: - name: kubernetes-admin user: client-certificate-data: REDACTED client-key-data: REDACTED # kubectl get nodes NAME STATUS ROLES AGE VERSION master0 Ready master 23m v1.15.3 master1 Ready master 22m v1.15.3 master2 Ready master 22m v1.15.3 worker0 Ready 22m v1.15.3 worker1 Ready 22m v1.15.3 # kubectl get endpoints -n kube-system NAME ENDPOINTS AGE coredns 10.233.97.1:53,10.233.98.2:53,10.233.97.1:53 + 3 more… 78m kube-controller-manager 80m kube-scheduler 80m kubernetes-dashboard 10.233.110.1:8443
# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-55c59dd474-fn7fj 1/1 Running 0 69m
calico-node-5fjcp 1/1 Running 1 69m
calico-node-9rt6v 1/1 Running 1 69m
calico-node-cx472 1/1 Running 1 69m
calico-node-v7db8 1/1 Running 0 69m
calico-node-x2cwz 1/1 Running 1 69m
coredns-74c9d4d795-bsqk5 1/1 Running 0 68m
coredns-74c9d4d795-bv5qh 1/1 Running 0 69m
dns-autoscaler-7d95989447-ccpf4 1/1 Running 0 69m
kube-apiserver-master0 1/1 Running 0 70m
kube-apiserver-master1 1/1 Running 0 70m
kube-apiserver-master2 1/1 Running 0 70m
kube-controller-manager-master0 1/1 Running 0 70m
kube-controller-manager-master1 1/1 Running 0 70m
kube-controller-manager-master2 1/1 Running 0 70m
kube-proxy-6mvwq 1/1 Running 0 70m
kube-proxy-cp7f9 1/1 Running 0 70m
kube-proxy-fkmqk 1/1 Running 0 70m
kube-proxy-nlmsk 1/1 Running 0 70m
kube-proxy-pzwjh 1/1 Running 0 70m
kube-scheduler-master0 1/1 Running 0 70m
kube-scheduler-master1 1/1 Running 0 70m
kube-scheduler-master2 1/1 Running 0 70m
kubernetes-dashboard-7c547b4c64-q92qk 1/1 Running 0 69m
nginx-proxy-worker0 1/1 Running 0 70m
nginx-proxy-worker1 1/1 Running 0 70m
nodelocaldns-6pjn8 1/1 Running 0 69m
nodelocaldns-74lwl 1/1 Running 0 69m
nodelocaldns-95ztp 1/1 Running 0 69m
nodelocaldns-mx26s 1/1 Running 0 69m
nodelocaldns-nmqbq 1/1 Running 0
Шаг 6: Настройте балансировщик нагрузки HAProxy
Давайте настроим внешний балансировщик нагрузки (LB) для предоставления доступа внешним клиентам, в то время как внутренний LB принимает клиентские подключения только к локальному узлу.
Установите пакет HAProxy на сервере, который вы используете в качестве балансировщика нагрузки.
sudo yum -y install haproxy
Настройте внутренние серверы для API.
listen k8s-apiserver-https
bind *:6443
option ssl-hello-chk
mode tcp
balance roundrobin
timeout client 3h
timeout server 3h
server master0 10.10.1.126:6443
server master1 10.10.1.194:6443
server master2 10.10.1.134:6443
Запустите и включите службу haproxy.
sudo systemctl enable --now haproxy
Посмотрим статус сервиса.
$ systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2019-09-08 15:47:44 EAT; 37s ago
Main PID: 23051 (haproxy-systemd)
CGroup: /system.slice/haproxy.service
├─23051 /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
├─23052 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
└─23053 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
Sep 08 15:47:44 envoy-nginx.novalocal systemd[1]: Started HAProxy Load Balancer.
Sep 08 15:47:44 envoy-nginx.novalocal haproxy-systemd-wrapper[23051]: haproxy-systemd-wrapper: executing /usr/sbin/haproxy -f /etc/haproxy/...d -Ds
Sep 08 15:47:44 envoy-nginx.novalocal haproxy-systemd-wrapper[23051]: [WARNING] 250/154744 (23052) : parsing [/etc/haproxy/haproxy.cfg:45] ...log'.
Sep 08 15:47:44 envoy-nginx.novalocal haproxy-systemd-wrapper[23051]: [WARNING] 250/154744 (23052) : config : 'option forwardfor' ignored f...mode.
Hint: Some lines were ellipsized, use -l to show in full.
Разрешим служебный порт на брандмауэре.
$ sudo firewall-cmd --add-port=6443/tcp --permanent
$ sudo firewall-cmd --reload
Чтобы подключиться к API-серверу, внешние клиенты могут использовать настроенный нами балансировщик нагрузки.
Добавьте файл конфигурации kube из каталога /etc/kubernetes/admin.conf на главном сервере.
$ scp root@master0_IP:/etc/kubernetes/admin.conf kubespray.conf
$ export KUBECONFIG=./kubespray.conf
$ kubectl --insecure-skip-tls-verify get nodes
NAME STATUS ROLES AGE VERSION
master0 Ready master 92m v1.15.3
master1 Ready master 91m v1.15.3
master2 Ready master 91m v1.15.3
worker0 Ready <none> 90m v1.15.3
worker1 Ready <none> 90m v1.15.3
Масштабируемый кластер Kubernetes
- Добавьте новый рабочий узел в свой инвентарь в соответствующей группе
- Запустите команду ansible-playbook:
ansible-playbook -i inventory/mycluster/inventory.ini --become \
--user=centos --become-user=root -v cluster.yml
Доступ к админской панели Kubernetes
Если задана переменная dashboard_enabled (по умолчанию – true), вы можете получить доступ к панели инструментов Kubernetes по следующему URL-адресу.
Вам будет предложено ввести учетные данные:
https://first_master:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login
Или используйте команду kubectl proxy, чтобы создать прокси-сервер между вашей машиной и сервером Kubernetes API.
По умолчанию он доступен только локально (с компьютера, который его запустил).
Сначала давайте проверим, правильно ли настроен kubectl и имеет ли он доступ к кластеру.
$ kubectl cluster-info
Запустите локальный прокси-сервер.
$ kubectl proxy Starting to serve on 127.0.0.1:8001