☸️ Разверните готовый кластер Kubernetes с помощью Ansible & Kubespray

by itisgood

Существуют различные способы развертывания готового к работе кластера 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 в качестве базовой ОС для всех развертываний.

Мои узлы master / working / etcd будут использовать m1.medium.
Это будет иметь больше ресурсов, если вы ожидаете огромной рабочей нагрузки в вашем кластере.
$ 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      |
+----+-----------+-------+------+-----------+-------+-----------+
Я создам свои виртуальные машины, используя CLI openstack.
Три узла controller / etcd и два рабочих узла.
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
Все узлы контроллера также будут запускать службу etcd. Вот мои серверы созданы.
$ 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
Этот каталог содержит файлы инвентаризации и книги воспроизведения, используемые для развертывания Kubernetes.

Шаг 3: Подготовьте Локальный компьютер

На локальном компьютере, с которого вы запускаете развертывание, вам нужно установить pip-менеджер пакетов Python.
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
Добавьте записи A в /etc/hosts на каждом узле кластера.
$ 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
Если у вашего закрытого ключа ssh есть фраза-пароль, сохраните ее перед началом развертывания.
$ 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
$ 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)]
Просмотрите и измените параметры  инвентаризации /mycluster/group_vars
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
Вы также можете проверить запуск подов в кластере в пространстве имен kube-system.
# 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
Затем мы можем настроить клиент kubectl для использования загруженного файла конфигурации через переменную среды KUBECONFIG:
$ 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

 

Возможно, вы захотите добавить workersе, master-узлы или узлы etcd в существующий кластер.
Это можно сделать, повторно запустив playbook cluster.yml, или вы можете выбрать необходимый минимум, необходимый для установки kubelet на рабочем месте и общения с мастерами.
  • Добавьте новый рабочий узел в свой инвентарь в соответствующей группе
  • Запустите команду 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

 

You may also like

Leave a Comment