Запуск и публикация приложения
В этом руководстве вы узнаете, как развернуть приложение в кластере Managed Kubernetes, и опубликовать его внутри сети и в интернете с помощью балансировщиков нагрузки.
В качестве приложения в руководстве используется сервер Redis с постоянным хранилищем (Persistent Volume).
Чтобы развернуть и опубликовать приложение:
- Подготовьте виртуальную машину — она понадобится для работы с кластером через
kubectlи для проверки доступности приложения. - Разверните внутренний балансировщик и проверьте доступность приложения из внутренней сети облака.
- Разверните внешний балансировщик и проверьте доступность приложения из интернета.
Если вам больше не нужны созданные ресурсы, удалите их.
Перед началом работы
Заголовок раздела «Перед началом работы»Создайте NAT-шлюз для подсети, в которой будет развернут кластер Managed Kubernetes.
- C именем
sa-k8sи рольюmk8s.clusterAdmin— для работы группы узлов Managed Kubernetes. - С именем
sa-vmи рольюeditor— для инициализации MWS CLI на виртуальной машине и работы с утилитойkubectl.
Создайте кластер Managed Kubernetes и группу узлов для него. При создании группы используйте сервисный аккаунт
sa-k8s.Создайте виртуальную машину с внешним IP-адресом в той же сети, где развернут кластер Managed Kubernetes. При создании ВМ привяжите к ней сервисный аккаунт
sa-vm.
1. Подготовьте виртуальную машину
Заголовок раздела «1. Подготовьте виртуальную машину»Подключитесь к ВМ по SSH.
Инициализируйте профиль MWS CLI:
bash mws init --vm-saУстановите утилиту командной строки
kubectl.Получите kubeconfig:
bash mws mk8s get-kubeconfig --name <имя кластера>Убедитесь, что кластер доступен:
bash kubectl cluster-infoЕсли конфигурация настроена правильно, вы получите такой ответ:
bash Kubernetes control plane is running at https://<IP-адрес кластера>KubeDNS is running at https://<IP-адрес кластера>/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
2. Разверните и настройте приложение
Заголовок раздела «2. Разверните и настройте приложение»2.1. Разверните приложение
Заголовок раздела «2.1. Разверните приложение»Создайте пространство имен для размещения приложения:
bash kubectl create namespace test-redisПереключите контекст на созданное пространство:
bash kubectl config set-context --current --namespace test-redisПодготовьте манифест для развертывания приложения. Для этого выполните команду, которая сохранит готовый манифест в файл
redis-app.yaml:yaml cat <<EOF> ./redis-app.yamlapiVersion: v1kind: ConfigMapmetadata:name: redis-configdata:redis.conf: ""---apiVersion: apps/v1kind: StatefulSetmetadata:name: redisspec:selector:matchLabels:app: redisserviceName: redistemplate:metadata:labels:app: redisspec:containers:- command:- redis-server- "/redis-master/redis.conf"env:- name: MASTERvalue: "true"image: redis:7imagePullPolicy: IfNotPresentresources:limits:memory: 256Micpu: 100mname: redisports:- containerPort: 6379name: redisprotocol: TCPvolumeMounts:- mountPath: /dataname: data-volume- mountPath: /redis-mastername: configvolumes:- configMap:name: redis-configname: configvolumeClaimTemplates:- apiVersion: v1kind: PersistentVolumeClaimmetadata:name: data-volumespec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 1GiEOFПримените манифест:
bash kubectl apply -f ./redis-app.yamlУбедитесь, что под приложения запущен и работает:
bash kubectl get pods -l app=redisОжидаемый результат:
bash NAME READY STATUS RESTARTS AGEredis-0 1/1 Running 0 2m
2.2. Настройте сервис ClusterIP
Заголовок раздела «2.2. Настройте сервис ClusterIP»Подготовьте манифест сервиса ClusterIP, необходимый для сетевой связности внутри кластера и адресации внутренних сервисов. Для этого выполните команду, которая сохранит готовый манифест в файл
redis-clusterip.yaml:yaml cat <<EOF> ./redis-clusterip.yamlapiVersion: v1kind: Servicemetadata:name: redis-clusteriplabels:app: redisspec:selector:app: redisports:- name: redisport: 6379protocol: TCPtype: ClusterIPEOFПримените манифест:
bash kubectl apply -f ./redis-clusterip.yamlУбедитесь, что сервис успешно создан:
bash kubectl get svc redis-clusteripОжидаемый результат:
bash NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEredis-clusterip ClusterIP 10.222.81.207 <none> 6379/TCP 9s
2.3. Выберите тип балансировщика
Заголовок раздела «2.3. Выберите тип балансировщика»Приложение развернуто, но пока доступно только из внутренней сети кластера. Чтобы опубликовать приложение, разверните внутренний или внешний балансировщик нагрузки.
Балансировщики нагрузки имеют следующие возможности и ограничения:
Внутренний и внешний балансировщик могут работать одновременно. Приложение будет доступно как по внутреннему, так и по внешнему IP-адресам.
При этом создавать балансировщики нужно с помощью двух разных манифестов, используя в каждом манифесте разные аннотации:
mk8s.mws.ru/load-balancer-internal-ip-nameиmk8s.mws.ru/load-balancer-external-ip-name. Если указать обе аннотации в одном манифесте, создание балансировщика завершится с ошибкой.Если в манифесте балансировщика не указать ни одну аннотацию типа
mk8s.mws.ru/load-balancer-*, то создастся внешний балансировщик со случайно выбранным свободным внешним IP-адресом, который есть в проекте. Если такого IP-адреса нет, он будет автоматически создан и привязан к балансировщику.
3. Разверните внутренний балансировщик
Заголовок раздела «3. Разверните внутренний балансировщик»Зарезервируйте внутренний статический IP-адрес с именем
redis-internal-ipв подсети, указанной при создании кластера Managed Kubernetes. В этом примере используется IP-адрес192.168.0.98.Подготовьте манифест для внутреннего балансировщика. Для этого выполните команду, которая сохранит готовый манифест в файл
redis-lbinternal.yaml:yaml cat <<EOF> ./redis-lbinternal.yamlapiVersion: v1kind: Servicemetadata:name: redis-lbinternallabels:app: redisannotations:mk8s.mws.ru/load-balancer-internal-ip-name: redis-internal-ipspec:selector:app: redisports:- name: redisport: 6379protocol: TCPtype: LoadBalancerEOFПримените манифест:
bash kubectl apply -f ./redis-lbinternal.yamlУбедитесь, что балансировщик успешно создан:
bash kubectl get svc redis-lbinternalОжидаемый результат:
bash NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEredis-lbinternal LoadBalancer 10.222.90.76 192.168.0.98 6379:31125/TCP 67sПроверьте подключение к приложению с виртуальной машины:
Установите утилиту
redis-tools:bash sudo apt update && sudo apt install -y redis-toolsПодключитесь к приложению, используя созданный ранее статический IP-адрес и стандартный порт
6379:bash redis-cli -h 192.168.0.98 -p 6379Получите информацию о сервере с помощью команды
info server, после чего завершите сессию с помощью командыquit.
В результате вы получили приложение, доступное через балансировщик нагрузки только во внутренней подсети облака. Чтобы опубликовать приложение в интернете, перейдите к следующему шагу и разверните внешний балансировщик нагрузки.
4. Разверните и протестируйте внешний балансировщик
Заголовок раздела «4. Разверните и протестируйте внешний балансировщик»4.1. Создайте внешний балансировщик
Заголовок раздела «4.1. Создайте внешний балансировщик»При развертывании внешнего балансировщика вы можете использовать как динамический, так и статический внешний IP-адрес.
Создайте внешний балансировщик нагрузки:
- Со статическим IP-адресом
- С динамическим IP-адресом
Зарезервируйте внешний статический IP-адрес с именем
redis-external-ipв подсети, указанной при создании кластера Managed Kubernetes.Подготовьте манифест для внешнего балансировщика. Для этого выполните команду, которая сохранит готовый манифест в файл
redis-lbexternal-fixed.yaml:yaml cat <<EOF> ./redis-lbexternal-fixed.yamlapiVersion: v1kind: Servicemetadata:name: redis-lbexternal-fixedlabels:app: redisannotations:mk8s.mws.ru/load-balancer-external-ip-name: redis-external-ipspec:selector:app: redisports:- name: redisport: 6379protocol: TCPtype: LoadBalancerEOFПримените манифест:
bash kubectl apply -f ./redis-lbexternal-fixed.yamlУбедитесь, что балансировщик успешно создан:
bash kubectl get svc redis-lbexternal-fixedОжидаемый результат:
bash NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEredis-lbexternal-fixed LoadBalancer 10.222.115.36 2.59.81.140 6379:31896/TCP 16sСохраните значения для внешнего IP-адреса и TCP-порта из вывода предыдущей команды, они понадобятся на следующем шаге. В примере это
2.59.81.140и31896.
4.2. Настройте и протестируйте работу внешнего балансировщика
Заголовок раздела «4.2. Настройте и протестируйте работу внешнего балансировщика»Создайте правило файрвола со следующими параметрами:
- Направление трафика —
Ingress. - Действие в рамках правила —
Allow. - Источник трафика —
0.0.0.0/0. - Назначение трафика — CIDR подсети, в которой расположен кластер Managed Kubernetes. Например,
192.168.0.0/16. - Протокол —
TCP. - Порт — TCP-порт балансировщика, полученный в предыдущем шаге. Например,
31896. - Опция Активировать правило сразу после сохранения — включена.
Проверьте подключение к приложению с виртуальной машины через интернет:
Установите утилиту
redis-tools, если она еще не установлена:bash sudo apt update && sudo apt install -y redis-toolsПодключитесь к приложению, используя полученный ранее внешний IP-адрес и стандартный порт
6379:bash redis-cli -h <внешний IP-адрес> -p 6379Пример команды для статического внешнего IP-адреса:
bash redis-cli -h 2.59.81.140 -p 6379Получите информацию о сервере с помощью команды
info server, после чего завершите сессию с помощью командыquit.
Удалите ресурсы
Заголовок раздела «Удалите ресурсы»В руководстве были созданы ресурсы, которые могут тарифицироваться. Если вы не планируете использовать их, удалите:
- внутренний и внешний IP-адреса;