В предыдущей статье мы рассмотрели базовую установку кластера Kubernetes. В данной статье мы хотим рассмотреть дальнейшую настройку, а именно:
- Добавление и удаление ноды
- Работа с helm
- Установка prometheus
- Обновление кластера Kubernetes до более высокой версии
По результатам работ из предыдущей статьи у нас остались 3 ноды.
Адресация нод (виртуальных машин):
- k8s-1 ip 10.15.73.41
- k8s-3 ip 10.15.73.42
- k8s-3 ip 10.15.73.43
Добавим еще одну — k8s-3 ip 10.15.73.44. Пока идет установка ОС на новой ноде, возвращаемся к ноде, откуда мы делали ранее все действия (k8s-1) и выполняем подготовительные действия.
Редактируем файл /etc/hosts и прописываем соответствие IP нашей новой ВМ:
10.15.73.44 k8s-4
Редактируем файл хостов для Ansible:
[root@k8s-1 ~]# nano /etc/ansible/hosts
Добавляем строчку:
k8s-3 ip 10.15.73.44
Итоговый вид будет следующим:
[k8sservers] k8s-1 k8s-2 k8s-3 k8s-4
Копируем ключ на удаленный сервер. Выполняем команду:
[root@k8s-1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-4
Проверяем подключение:
[root@k8s-1 aws]# ssh k8s-4 [root@k8s-4 ~]# exit logout Connection to k8s-4 closed.
Выполняем ранее созданный плейбук с указанием хоста, на который будет применятся плейбук:
[root@k8s-1 aws]# ansible-playbook /root/pb1.yml -l k8s-4
После выполнения нода готова для добавления в кластер. Редактируем файл /root/kubespray/inventory/sample/inventory.ini добавляем новую ноду k8s-4:
[root@k8s-1 ]# nano /root/kubespray/inventory/sample/inventory.ini k8s-1 ansible_ssh_host=10.15.73.41 ip=10.15.73.41 k8s-2 ansible_ssh_host=10.15.73.42 ip=10.15.73.42 k8s-3 ansible_ssh_host=10.15.73.43 ip=10.15.73.43 k8s-4 ansible_ssh_host=10.15.73.44 ip=10.15.73.44 [kube-master] k8s-1 [etcd] k8s-1 k8s-2 k8s-3 [kube-node] k8s-2 k8s-3 k8s-4 [k8s-cluster:children] kube-node kube-master [root@k8s-1 ]# ansible-playbook -u root -b -i /root/kubespray/inventory/sample/inventory.ini /root/kubespray/scale.yml
После выполнения команды не должно быть ошибок — это означает что нода добавилась корректно. Проверяем статус нод:
[root@k8s-1 kubespray]# kubectl get nodes
Вешаем лейбл на ноду k8s-4:
[root@k8s-1 ]# kubectl label node k8s-4 node-role.kubernetes.io/node=
Меняем значения ниже в файле inventory/sample/group_vars/k8s-cluster/addons.yml:
helm_enabled: true # устанавливаем helm на ноды local_volume_provisioner_enabled: true # активируем local volume provisioner ingress_nginx_enabled: true # активируем ingress controller
Проверяем:
[root@k8s-1 kubespray] kubectl get pod -A
Мы должны увидеть ingress-nginx-controller и local-volume-provisioner.
Добавляем репозитории helm:
[root@k8s-1 ~]#helm repo add "stable" "https://charts.helm.sh/stable" [root@k8s-1 ~]#helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
Создаем неймспейс kube-prometheus-stack:
[root@k8s-1 ~]# kubectl create namespace kube-prometheus-stack
Устанавливаем Prometheus и Grafana:
[root@k8s-1 ~]# helm install prometheus-community/kube-prometheus-stack --generate-name -n kube-prometheus-stack
Проверяем установку:
[root@k8s-1 ~]# helm list
Создаем файл ingress-grafana-prometheus.yml следующего содержания:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: test namespace: kube-prometheus-stack spec: rules: - host: grafana.test.local http: paths: - backend: serviceName: kube-prometheus-stack-1612340877-grafana servicePort: 80
Применяем:
[root@k8s-1 ~]# kubectl create -f ingress-grafana-prometheus.yml
Добавляем в хосты той машины откуда будем проверять следующее доменное имя (либо можно использовать заранее созданную на DNS сервере A запись grafana.test.local).
10.15.73.42 grafana.test.local 10.15.73.43 grafana.test.local 10.15.73.44 grafana.test.local
Если все сделано правильно и по ходу установки не было ошибок проверяем вход по адресу http://grafana.test.local. На этом установка закончена.
username: admin password: prom-operator
Выполним удаление одной из нод. Пусть это будет нода k8s-2. Выполняем команду удаления которая описана в официальной документации kuberspray:
[root@k8s-1 ~]# ansible-playbook -i inventory/sample/inventory.ini remove-node.yml -e node=k8s-2
Здесь мы указываем путь к файлу конфигурации и ноду которую будем удалять, для самого удаления используется плейбук remove-node.yml.
После выполнения команды проверяем статус нод:
[root@k8s-]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-1 Ready master 83d v1.16.14 k8s-3 Ready node 83d v1.16.14 k8s-4 Ready node 8d v1.16.14
Удаляем информацию о ноде из файла инвентаризации inventory/sample/inventory.ini. Не забываем также, что у нас должно быть нечетное количество нод ectd.
[root@k8s-1 kubespray]# cat inventory/sample/inventory.ini k8s-1 ansible_ssh_host=10.15.73.41 ip=10.15.73.41 k8s-3 ansible_ssh_host=10.15.73.43 ip=10.15.73.43 k8s-4 ansible_ssh_host=10.15.73.44 ip=10.15.73.44 [kube-master] k8s-1 [etcd] k8s-1 k8s-3 k8s-4 [kube-node] k8s-3 k8s-4 [k8s-cluster:children] kube-node kube-master
Выполняем обновление кластера с учетом новых нод ectd:
[root@k8s-1 kubespray]# ansible-playbook cluster.yml -i inventory/sample/inventory.ini
Выполним обновление до версии v1.17.17. Указываем файл инвентаризации и необходимую версию. Обновление выполняем через upgrade-cluster.yml.
[root@k8s-1 kubespray]# ansible-playbook upgrade-cluster.yml -b -i inventory/sample/inventory.ini -e kube_version=v1.17.7
Ожидаем выполнения всех операций и проверяем версию:
[root@k8s-1 kubespray]# kubectl version Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.7", GitCommit:"b4455102ef392bf7d594ef96b97a4caa79d729d9", GitTreeState:"clean", BuildDate:"2020-06-17T11:39:47Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.7", GitCommit:"b4455102ef392bf7d594ef96b97a4caa79d729d9", GitTreeState:"clean", BuildDate:"2020-06-17T11:32:20Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
[root@k8s-1 kubespray]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-1 Ready master 83d v1.17.7 k8s-3 Ready node 83d v1.17.7 k8s-4 Ready node 8d v1.17.7
Мы можем помочь в настройке k8s и поддержке кластера. Оставьте заявку!