Написать Ansible playbook, который выполняет следующие шаги:
- Создать нового пользователя cloudru с паролем cloudpass
- Разрешить авторизацию через ssh по ключу
- Запретить логин по ssh от root
- Скопировать публичный ключ для пользователя cloudru
- Для написания и проверки плейбука использовалась UTM c ОС Ubuntu Server 22.04.3.
- Пароль пользователя был захэширован через mkpasswd с использованием SHA-512.
- Данные пользователя были занесены в
playbook/users.json
, что при желании позволило бы легко расширить область действия плейбука на нескольких пользователей.
Веб-приложение на Python, слушает порт 8000 и в реализует 3 метода:
- GET
/hostname
- имя хоста, на котором запущено приложение - GET
/author
- начение переменной окружения $AUTHOR - GET
/id
- возвращает значение переменной окружения $UUID
Так же был добавлен еще один метод /health
для осуществления Readiness-пробы.
Написать Dockerfile для приложения в соответствии с best-practice.
Было создано два image, которые были выгружены на DockerHub, откуда их забирает kubernetes:
- 1-ый для архитектуры
AMD64
(x86_64
). - 2-ой для архитектуры
ARM64
(AArch64
).
Написать манифест для запуска приложения в Kubernetes.
Требования:
- Отдельный namespace
- Deployment с 3 репликами
- Сервис типа ClusterIP
- Readiness- и Liveness- пробы
- Переменная
UUID
должна содержать uid пода в кластере
Сервис типа ClusterIP предполагает что доступ к подам будет только внутри кластера.
Для проверки работоспособности внутри, удобно использовать curl
:
# Чтобы узнать ClusterIP
$ kubectl get svc
# Попадаем внутрь VM (кластер поднимался локально на minikube)
$ minikube ssh
$ curl "<cluster-ip>:<service-port>/author"
# или напрямую к поду:
$ сurl "<pod-ip>:<pod-port>/id"
Для доступа к кластеру извне, необходимо либо сменить тип сервиса на
nodePort
/LoadBalancer
, либо использовать Ingress.
Написать Helm чарт, в котором через values.yaml можно задать:
- Имя образа, запускаемого в поде
- Количество реплик приложения
- Значение переменной
AUTHOR
Также были добавлены переменные для изменения порта приложения и для изменения имени namespace.