ansible. Role 10. Установка Kubernetes

Thank you for reading this post, don't forget to subscribe!

Дан­ная роль уста­нав­ли­ва­ет кла­стер kubernetes со сле­ду­ю­щей схе­мой работы:

коли­че­ство масте­ров и вор­ке­ров  уста­нав­ли­ва­ет­ся в фай­ле /etc/ansible/hosts
так­же необ­хо­ди­мо задать про­ис­хо­дит ли уста­нов­ка через прок­си сер­вер, иии всё. даль­ше роль всё сде­ла­ет сама, ника­ких допол­ни­тель­ных пра­вок не нуж­но. Ниже я поста­ра­юсь опи­сать каж­дый плей­бук, что дела­ет, зачем - по подробнее.

нач­нёмссс:

созда­ём струк­ту­ру директорий:
mkdir -p /etc/ansible/{playbooks/roles_play,roles/kubernetes/{handlers,tasks,templates}}

cat /etc/ansible/roles/kubernetes/handlers/main.yml
[codesyntax lang="php"]

[/codesyntax]

рас­смот­рим шаблоны:

cat /etc/ansible/roles/kubernetes/templates/config.json
дан­ный шаб­лон необ­хо­дим что­бы изнут­ри кон­тей­не­ра был доступ до прокси:
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/templates/http-proxy.conf
дан­ный кон­фиг необ­хо­дим что­бы докер мог выка­чи­вать обра­зы через прокси:
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/templates/docker-proxy.sh
дан­ный скрипт костыль необ­хо­дим что­бы после добав­ле­ния http-proxy.conf  из NO_PROXY уда­лить квад­рат­ные скоб­ки [] с ними рабо­та­ет некорректно
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/templates/daemon.json
необ­хо­дим для рабо­ты kubernetes
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/templates/etcd.conf
шаб­лон необ­хо­дим для уста­нов­ки etcd, коли­че­ство узлов ука­зы­ва­ет­ся толь­ко в /etc/ansible/hosts в груп­пе kubermaster
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/templates/haproxy.cfg
шаб­лон для уста­нов­ки haproxy коли­че­ство узлов ука­зы­ва­ет­ся толь­ко в /etc/ansible/hosts в груп­пе kubermaster (так как прок­си­ру­ет­ся на мастера)
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/templates/k8s.conf
это для сет­ки надо
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/templates/kubernetes.repo
репозиторий
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/templates/rsyslog.conf
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/templates/shell-for-kuber.sh
дан­ный скрипт\костыль пар­сит вывод ини­ци­а­ции кубе­ра и запи­сы­ва­ет токе­ны для масте­ра и воркера
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/templates/kub.yaml
с дан­но­го фай­ла запус­ка­ет­ся ини­ци­а­ция кла­сте­ра, масте­ра зада­ют­ся через хосто­вой файл в груп­пе kubermaster
[codesyntax lang="php"]

[/codesyntax]

с шаб­ло­на­ми закончили.

cat /etc/ansible/roles/kubernetes/tasks/main.yml
[codesyntax lang="php"]

[/codesyntax]

ну и пой­дём по списку:

cat /etc/ansible/roles/kubernetes/tasks/proxy-add.yml
добав­ля­ем прок­си если уста­нов­ка через него будет идти.
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/tasks/add-to-hosts.yml
добав­ля­ем хосты на все ноды:
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/tasks/DISABLE-selinux-swap.yml
отклю­ча­ем selinux и swap
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/tasks/install-repo.yml
добав­ля­ем репозитории
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/tasks/preinstall.yml
дела­ем пре­ин­сталл стан­дарт­ных паке­тов yum-utils yum-plugin-priorities device-mapper-persistent-data lvm2 python2-pip rsyslog ntp. Настра­и­ва­ем вре­мя, копи­ру­ем шаб­лон k8s.conf для сети, настра­и­ва­ем rsyslog добав­ля­ем кон­фиг из шаблона
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/tasks/install-docker.yml
ста­вим docker и доку­чи docker-compose, из шаб­ло­на ста­вим daemon.json
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/tasks/docker_proxy.yaml
если необ­хо­ди­ма рабо­та через proxy, то этот плей­бук доба­вит такую возможность:
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/tasks/etcd.yml
ста­вим etcd на масте­ра (груп­па kubermaster) поэто­му реко­мен­ду­ем мини­мум 3 чтоб у etcd был кворум
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/tasks/haproxy.yml
ста­вим haproxy что­бы он рас­ки­ды­вал запро­сы с вор­ке­ров на масте­ра (по умол­ча­нию всё летит на сер­вак с кото­ро­го ини­ци­и­ро­ва­ли кла­стер кубе­ра) ста­вит­ся хапрок­си толь­ко на груп­пу kuberworker
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/tasks/proxy-delete-environment.yml
дан­ный плей­бук нужен для уда­ле­ния прокси(если уста­нов­ка про­из­во­дит­ся через него) из environment, т.е. из пере­мен­ной окру­же­ния $PATH, это надо чтоб кла­стер kubernetes нор­маль­но инициировался
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/tasks/kubernetes.yml
в дан­ном плей­бу­ке про­ис­хо­дит ини­ци­а­ция кла­сте­ра kubernetes, рас­смот­рим каж­дую часть подробнее:
- name: Set var from first inventory
здесь мы запи­сы­ва­ем в пере­мен­ную first_master_ip - пер­вый ip адрес из груп­пы kubermaster с него и будет про­из­во­дит­ся инициация.
- name: install default packages for kubernetes
ста­вим все необ­хо­ди­мые пакеты
- name: Start and enable kubelet
сра­зу стар­ту­ем, добав­ля­ем в автозапуск
- name: Delete config files if exist on {{first_master_ip}}
если сер­ве­ре с кото­ро­го про­из­во­дим уста­нов­ку есть фай­лы: /root/kub-new.yaml /root/kub.yaml  то уда­ля­ем их
- name: Copy template /etc/ansible/roles/kubernetes/templates/kub.yaml to the first master {{first_master_ip}}
копи­ру­ем файл для ини­ци­а­ции из шаблона
- name: Copy bash script /etc/ansible/roles/kubernetes/templates/shell-for-kuber.sh for parse init kuber text to the master {{first_master_ip}}
копи­ру­ем костыль для пар­син­га вывода
- name: reconfigure /root/kub.yaml to /root/kub-new.yaml on the {{first_master_ip}}
так как наш вари­ант kub.yaml более ста­рый (но про­стой в наби­ва­нии масте­ров мы копи­ру­ем имен­но его) после запус­ка­ем рекон­фи­гу­ра­цию под новый вид
- name: INITIAL KUBERNETES CLUSTER
ини­ци­и­ру­ем кла­стер кубер­не­ти­са и запи­сы­ва­ем всё в пере­мен­ную result_of_initial
- name: Create file token.txt
созда­ём файл куда будет запи­сан вывод из  result_of_initial
- name: Copy facts of initial kubernetes to files /root/token.txt
запи­сы­ва­ем в token.txt вывод ини­ци­а­ции result_of_initial
- name: Run bash script /root/shell-for-kuber.sh to parse result of initial kubernetes
пар­сим вывод
- name: Set var token from kubermaster /root/token-master.txt
запи­сы­ва­ем в пере­мен­ную token_kubermaster токен для мастеров
- name: Set var token from kuberworker /root/token-worker.txt
запи­сы­ва­ем в пере­мен­ную token_kuberworker токен для воркеров
- name: create home, copy admin.conf, chown owner of /root/.kube/
созда­ём струк­ту­ру ката­ло­гов и копи­ру­ем необ­хо­ди­мые конфиги
- name: Delete files with result of initial, tokens and bash script on the {{first_master_ip}}
уда­ля­ем наши шаб­ло­ны скрип­ты кото­рые более не нуж­ны (чистим за собой)
[codesyntax lang="php"]

[/codesyntax]

 

cat /etc/ansible/roles/kubernetes/tasks/copy-key.yml
тут копи­ру­ют­ся клю­чи сге­не­ри­ро­ван­ные при ини­ци­а­ции kubernetes, сна­ча­ла на тач­ку с анси­б­лом, а потом на остальные
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/roles/kubernetes/tasks/kubernetes-master-worker.yml
тут про­ис­хо­дит добав­ле­ние масте­ров и вор­ке­ров, ещё ска­чи­ва­ет­ся сет­ка calico и деп­ло­ит­ся, но после того как всё добав­ле­но, похо­ду не успе­ва­ет одуп­лить­ся  и деп­лой не про­хо­дит поэто­му при­хо­дит­ся потом руч­ка­ми захо­дить и запускать:
kubectl apply -f /root/calico.yaml
[codesyntax lang="php"]

[/codesyntax]

 

cat /etc/ansible/roles/kubernetes/tasks/proxy-delete.yml
уда­ля­ем после уста­нов­ки проксю
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/hosts
сюда добав­ля­ем наши хосты
[codesyntax lang="php"]

[/codesyntax]

cat /etc/ansible/playbooks/roles_play/kubernetes.yml
с дан­но­го плей­бу­ка запус­ка­ем роль
[codesyntax lang="php"]

[/codesyntax]

запус­ка­ем сле­ду­ю­щим образом:
ansible-playbook -u ansible /etc/ansible/playbooks/roles_play/kubernetes.yml

поль­зо­ва­тель ansible есте­ствен­но дол­жен быть добав­лен на всех тач­ках и иметь пол­ные пра­ва из под sudo

Если необ­хо­ди­мо про­те­стить рабо­ту через прок­си сер­вер, то на каж­дую тач­ку кида­ем этот скрипт:

скрипт iptables для бло­ки­ро­ва­ния досту­пов во внешку.
[codesyntax lang="php"]

[/codesyntax]