- Цели:
- Этапы выполнения:
- Что необходимо для сдачи задания?
- Как правильно задавать вопросы дипломному руководителю?
Перед началом работы над дипломным заданием изучите Инструкция по экономии облачных ресурсов.
- Подготовить облачную инфраструктуру на базе облачного провайдера Яндекс.Облако.
- Запустить и сконфигурировать Kubernetes кластер.
- Установить и настроить систему мониторинга.
- Настроить и автоматизировать сборку тестового приложения с использованием Docker-контейнеров.
- Настроить CI для автоматической сборки и тестирования.
- Настроить CD для автоматического развёртывания приложения.
Для начала необходимо подготовить облачную инфраструктуру в ЯО при помощи Terraform.
Особенности выполнения:
- Бюджет купона ограничен, что следует иметь в виду при проектировании инфраструктуры и использовании ресурсов; Для облачного k8s используйте региональный мастер(неотказоустойчивый). Для self-hosted k8s минимизируйте ресурсы ВМ и долю ЦПУ. В обоих вариантах используйте прерываемые ВМ для worker nodes.
- Следует использовать версию Terraform не старше 1.5.x .
Предварительная подготовка к установке и запуску Kubernetes кластера.
-
Создайте сервисный аккаунт, который будет в дальнейшем использоваться Terraform для работы с инфраструктурой с необходимыми и достаточными правами. Не стоит использовать права суперпользователя
-
Подготовьте backend для Terraform: backends/configuration а. Рекомендуемый вариант: S3 bucket в созданном ЯО аккаунте(создание бакета через TF) б. Альтернативный вариант: Terraform Cloud
-
Создайте VPC с подсетями в разных зонах доступности.
-
Убедитесь, что теперь вы можете выполнить команды
terraform destroyиterraform applyбез дополнительных ручных действий. -
В случае использования Terraform Cloud в качестве backend убедитесь, что применение изменений успешно проходит, используя web-интерфейс Terraform cloud.
Ожидаемые результаты:
- Terraform сконфигурирован и создание инфраструктуры посредством Terraform возможно без дополнительных ручных действий.
- Полученная конфигурация инфраструктуры является предварительной, поэтому в ходе дальнейшего выполнения задания возможны изменения.
На этом этапе необходимо создать Kubernetes кластер на базе предварительно созданной инфраструктуры. Требуется обеспечить доступ к ресурсам из Интернета.
Это можно сделать двумя способами:
- Рекомендуемый вариант: самостоятельная установка Kubernetes кластера.
а. При помощи Terraform подготовить как минимум 3 виртуальных машины Compute Cloud для создания Kubernetes-кластера. Тип виртуальной машины следует выбрать самостоятельно с учётом требовании к производительности и стоимости. Если в дальнейшем поймете, что необходимо сменить тип инстанса, используйте Terraform для внесения изменений.
б. Подготовить ansible конфигурации, можно воспользоваться, например Kubespray
в. Задеплоить Kubernetes на подготовленные ранее инстансы, в случае нехватки каких-либо ресурсов вы всегда можете создать их при помощи Terraform. - Альтернативный вариант: воспользуйтесь сервисом Yandex Managed Service for Kubernetes
а. С помощью terraform resource для kubernetes создать региональный мастер kubernetes с размещением нод в разных 3 подсетях б. С помощью terraform resource для kubernetes node group
Выбран деплой через kubespray:
ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root cluster.yml
[WARNING]: Skipping callback plugin 'ara_default', unable to load
PLAY [localhost] *****************************************************************
Tuesday 02 July 2024 08:45:39 +0000 (0:00:00.103) 0:00:00.103 **********
TASK [Check 2.11.0 <= Ansible version < 2.13.0] **********************************
ok: [localhost] => {
"changed": false,
"msg": "All assertions passed"
}
Tuesday 02 July 2024 08:45:39 +0000 (0:00:00.027) 0:00:00.130 **********
TASK [Check that python netaddr is installed] ************************************
ok: [localhost] => {
"changed": false,
"msg": "All assertions passed"
}
Tuesday 02 July 2024 08:45:39 +0000 (0:00:00.078) 0:00:00.209 **********
TASK [Check that jinja is not too old (install via pip)] *************************
ok: [localhost] => {
"changed": false,
"msg": "All assertions passed"
}
...
Tuesday 02 July 2024 09:46:39 +0000 (0:00:00.065) 0:13:46.912 **********
Tuesday 02 July 2024 09:46:39 +0000 (0:00:00.034) 0:13:46.947 **********
Tuesday 02 July 2024 09:46:40 +0000 (0:00:00.035) 0:13:46.982 **********
PLAY RECAP ***********************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
master : ok=757 changed=108 unreachable=0 failed=0 skipped=1264 rescued=0 ignored=8
worker1 : ok=541 changed=80 unreachable=0 failed=0 skipped=782 rescued=0 ignored=2
worker2 : ok=541 changed=82 unreachable=0 failed=0 skipped=782 rescued=0 ignored=2
Tuesday 02 July 2024 09:46:40 +0000 (0:00:00.080) 0:13:47.062 **********
===============================================================================
kubernetes/kubeadm : Join to cluster ------------------------------------- 39.50s
network_plugin/calico : Wait for calico kubeconfig to be created --------- 33.67s
download : download_file | Validate mirrors ------------------------------ 25.93s
kubernetes/control-plane : kubeadm | Initialize first master ------------- 24.01s
download : download_container | Download image if required --------------- 18.69s
download : download_container | Download image if required --------------- 18.16s
etcd : Gen_certs | Write etcd member/admin and kube_control_plane clinet certs to other etcd nodes -- 16.29s
download : download_container | Download image if required --------------- 15.50s
download : download_container | Download image if required --------------- 14.83s
kubernetes/node : install | Copy kubelet binary from download dir -------- 13.77s
download : download_container | Download image if required --------------- 13.35s
network_plugin/calico : Calico | Copy calicoctl binary from download dir -- 11.89s
kubernetes-apps/ansible : Kubernetes Apps | Start Resources -------------- 11.35s
kubernetes/preinstall : Preinstall | wait for the apiserver to be running --- 9.79s
download : download_container | Download image if required ---------------- 9.38s
download : download_container | Download image if required ---------------- 9.29s
download : download_container | Download image if required ---------------- 8.74s
download : download_container | Download image if required ---------------- 6.84s
kubernetes/node : Pre-upgrade | check if kubelet container exists --------- 6.37s
container-engine/containerd : containerd | Unpack containerd archive ------ 6.24sОжидаемый результат:
- Работоспособный Kubernetes кластер.
kubectl get no -A
NAME STATUS ROLES AGE VERSION
master Ready control-plane 4m41s v1.24.6
worker1 Ready <none> 3m26s v1.24.6
worker2 Ready <none> 3m26s v1.24.6- В файле
~/.kube/configнаходятся данные для доступа к кластеру.
vim ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBD...==
server: https://158.160.146.180: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: LS0tLS1CRUdJTiBDRVJUS...==
client-key-data: LS0tLS1CRUdJTiBSU0EgU...==- Команда
kubectl get pods --all-namespacesотрабатывает без ошибок.
kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-node-9lqnt 1/1 Running 0 2m40s
kube-system calico-node-fcvwn 1/1 Running 0 2m40s
kube-system calico-node-mz6rw 1/1 Running 0 2m40s
kube-system coredns-74d6c5659f-4t99r 1/1 Running 0 94s
kube-system coredns-74d6c5659f-pwcfz 1/1 Running 0 87s
kube-system dns-autoscaler-59b8867c86-wbd7k 1/1 Running 0 90s
kube-system kube-apiserver-master 1/1 Running 1 4m20s
kube-system kube-controller-manager-master 1/1 Running 1 4m21s
kube-system kube-proxy-jkx96 1/1 Running 0 3m10s
kube-system kube-proxy-s8hsx 1/1 Running 0 3m10s
kube-system kube-proxy-sj8wj 1/1 Running 0 3m10s
kube-system kube-scheduler-master 1/1 Running 1 4m20s
kube-system nginx-proxy-worker1 1/1 Running 0 119s
kube-system nginx-proxy-worker2 1/1 Running 0 116s
kube-system nodelocaldns-fcrch 1/1 Running 0 89s
kube-system nodelocaldns-hxzhp 1/1 Running 0 89s
kube-system nodelocaldns-ktjjf 1/1 Running 0 89sДля перехода к следующему этапу необходимо подготовить тестовое приложение, эмулирующее основное приложение разрабатываемое вашей компанией.
Способ подготовки:
- Рекомендуемый вариант:
а. Создайте отдельный git репозиторий с простым nginx конфигом, который будет отдавать статические данные.
б. Подготовьте Dockerfile для создания образа приложения. - Альтернативный вариант:
а. Используйте любой другой код, главное, чтобы был самостоятельно создан Dockerfile.
Ожидаемый результат:
- Git репозиторий с тестовым приложением и Dockerfile.
- Регистри с собранным docker image. В качестве регистри может быть DockerHub или Yandex Container Registry, созданный также с помощью terraform.
Уже должны быть готовы конфигурации для автоматического создания облачной инфраструктуры и поднятия Kubernetes кластера.
Теперь необходимо подготовить конфигурационные файлы для настройки нашего Kubernetes кластера.
Цель:
- Задеплоить в кластер prometheus, grafana, alertmanager, экспортер основных метрик Kubernetes.
- Задеплоить тестовое приложение, например, nginx сервер отдающий статическую страницу.
Способ выполнения:
- Воспользовать пакетом kube-prometheus, который уже включает в себя Kubernetes оператор для grafana, prometheus, alertmanager и node_exporter. При желании можете собрать все эти приложения отдельно.
- Для организации конфигурации использовать qbec, основанный на jsonnet. Обратите внимание на имеющиеся функции для интеграции helm конфигов и helm charts
- Если на первом этапе вы не воспользовались Terraform Cloud, то задеплойте и настройте в кластере atlantis для отслеживания изменений инфраструктуры. Альтернативный вариант 3 задания: вместо Terraform Cloud или atlantis настройте на автоматический запуск и применение конфигурации terraform из вашего git-репозитория в выбранной вами CI-CD системе при любом комите в main ветку. Предоставьте скриншоты работы пайплайна из CI/CD системы.
Ожидаемый результат:
Выбрано разворачивание через kube-prometheus-stack:
kubectl create namespace monitoring
namespace/monitoring created
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack -n monitoring
NAME: kube-prometheus-stack
LAST DEPLOYED: Tue Jul 2 09:53:18 2024
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
kubectl --namespace monitoring get pods -l "release=kube-prometheus-stack"
Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.
kubectl expose service kube-prometheus-stack-grafana --type=NodePort --target-port=3000 --name=grafana-node-port-service -n monitoring
service/grafana-node-port-service exposed- Git репозиторий с конфигурационными файлами для настройки Kubernetes.
- Http доступ к web интерфейсу grafana.
- Дашборды в grafana отображающие состояние Kubernetes кластера.
- Http доступ к тестовому приложению.
Осталось настроить ci/cd систему для автоматической сборки docker image и деплоя приложения при изменении кода.
Цель:
-
Автоматическая сборка docker образа при коммите в репозиторий с тестовым приложением.
-
Автоматический деплой нового docker образа.
Можно использовать teamcity, jenkins, GitLab CI или GitHub Actions.
Ожидаемый результат:
- Интерфейс ci/cd сервиса доступен по http.
- При любом коммите в репозиторие с тестовым приложением происходит сборка и отправка в регистр Docker образа.
- При создании тега (например, v1.0.0) происходит сборка и отправка с соответствующим label в регистри, а также деплой соответствующего Docker образа в кластер Kubernetes.
- Репозиторий с конфигурационными файлами Terraform и готовность продемонстрировать создание всех ресурсов с нуля.
Репозиторий с конфигурацией Terraform
- Пример pull request с комментариями созданными atlantis'ом или снимки экрана из Terraform Cloud или вашего CI-CD-terraform pipeline.
- Репозиторий с конфигурацией ansible, если был выбран способ создания Kubernetes кластера при помощи ansible.
Конфигурация hosts.yaml для ansible kubespray
- Репозиторий с Dockerfile тестового приложения и ссылка на собранный docker image.
- Репозиторий с конфигурацией Kubernetes кластера.
- Ссылка на тестовое приложение и веб интерфейс Grafana с данными доступа.
Интерфейс Grafana логин/пароль по-умолчанию
- Все репозитории рекомендуется хранить на одном ресурсе (github, gitlab)










