Запуск и публикация приложения
В этом руководстве вы узнаете, как развернуть приложение в кластере 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. Подготовьте виртуальную машину
Подключитесь к ВМ по SSH.
Инициализируйте профиль MWS CLI:
bashmws init --vm-saУстановите утилиту командной строки
kubectl.Получите kubeconfig:
bashmws mk8s get-kubeconfig --name <имя кластера>Убедитесь, что кластер доступен:
bashkubectl cluster-infoЕсли конфигурация настроена правильно, вы получите такой ответ:
bashKubernetes 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.1. Разверните приложение
Создайте пространство имен для размещения приложения:
bashkubectl create namespace test-redisПереключите контекст на созданное пространство:
bashkubectl config set-context --current --namespace test-redisПодготовьте манифест для развертывания приложения. Для этого выполните команду, которая сохранит готовый манифест в файл
redis-app.yaml:yamlcat <<EOF> ./redis-app.yaml apiVersion: v1 kind: ConfigMap metadata: name: redis-config data: redis.conf: "" --- apiVersion: apps/v1 kind: StatefulSet metadata: name: redis spec: selector: matchLabels: app: redis serviceName: redis template: metadata: labels: app: redis spec: containers: - command: - redis-server - "/redis-master/redis.conf" env: - name: MASTER value: "true" image: redis:7 imagePullPolicy: IfNotPresent resources: limits: memory: 256Mi cpu: 100m name: redis ports: - containerPort: 6379 name: redis protocol: TCP volumeMounts: - mountPath: /data name: data-volume - mountPath: /redis-master name: config volumes: - configMap: name: redis-config name: config volumeClaimTemplates: - apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-volume spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 1Gi EOFПримените манифест:
bashkubectl apply -f ./redis-app.yamlУбедитесь, что под приложения запущен и работает:
bashkubectl get pods -l app=redisОжидаемый результат:
bashNAME READY STATUS RESTARTS AGE redis-0 1/1 Running 0 2m
2.2. Настройте сервис ClusterIP
Подготовьте манифест сервиса ClusterIP, необходимый для сетевой связности внутри кластера и адресации внутренних сервисов. Для этого выполните команду, которая сохранит готовый манифест в файл
redis-clusterip.yaml:yamlcat <<EOF> ./redis-clusterip.yaml apiVersion: v1 kind: Service metadata: name: redis-clusterip labels: app: redis spec: selector: app: redis ports: - name: redis port: 6379 protocol: TCP type: ClusterIP EOFПримените манифест:
bashkubectl apply -f ./redis-clusterip.yamlУбедитесь, что сервис успешно создан:
bashkubectl get svc redis-clusteripОжидаемый результат:
bashNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE redis-clusterip ClusterIP 10.222.81.207 <none> 6379/TCP 9s
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. Разверните внутренний балансировщик
Зарезервируйте внутренний статический IP-адрес с именем
redis-internal-ipв подсети, указанной при создании кластера Managed Kubernetes. В этом примере используется IP-адрес192.168.0.98.Подготовьте манифест для внутреннего балансировщика. Для этого выполните команду, которая сохранит готовый манифест в файл
redis-lbinternal.yaml:yamlcat <<EOF> ./redis-lbinternal.yaml apiVersion: v1 kind: Service metadata: name: redis-lbinternal labels: app: redis annotations: mk8s.mws.ru/load-balancer-internal-ip-name: redis-internal-ip spec: selector: app: redis ports: - name: redis port: 6379 protocol: TCP type: LoadBalancer EOFПримените манифест:
bashkubectl apply -f ./redis-lbinternal.yamlУбедитесь, что балансировщик успешно создан:
bashkubectl get svc redis-lbinternalОжидаемый результат:
bashNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE redis-lbinternal LoadBalancer 10.222.90.76 192.168.0.98 6379:31125/TCP 67sПроверьте подключение к приложению с виртуальной машины:
Установите утилиту
redis-tools:bashsudo apt update && sudo apt install -y redis-toolsПодключитесь к приложению, используя созданный ранее статический IP-адрес и стандартный порт
6379:bashredis-cli -h 192.168.0.98 -p 6379Получите информацию о сервере с помощью команды
info server, после чего завершите сессию с помощью командыquit.
В результате вы получили приложение, доступное через балансировщик нагрузки только во внутренней подсети облака. Чтобы опубликовать приложение в интернете, перейдите к следующему шагу и разверните внешний балансировщик нагрузки.
4. Разверните и протестируйте внешний балансировщик
4.1. Создайте внешний балансировщик
При развертывании внешнего балансировщика вы можете использовать как динамический, так и статический внешний IP-адрес.
Создайте внешний балансировщик нагрузки:
4.2. Настройте и протестируйте работу внешнего балансировщика
Создайте правило файрвола со следующими параметрами:
- Направление трафика —
Ingress. - Действие в рамках правила —
Allow. - Источник трафика —
0.0.0.0/0. - Назначение трафика — CIDR подсети, в которой расположен кластер Managed Kubernetes. Например,
192.168.0.0/16. - Протокол —
TCP. - Порт — TCP-порт балансировщика, полученный в предыдущем шаге. Например,
31896. - Опция Активировать правило сразу после сохранения — включена.
Проверьте подключение к приложению с виртуальной машины через интернет:
Установите утилиту
redis-tools, если она еще не установлена:bashsudo apt update && sudo apt install -y redis-toolsПодключитесь к приложению, используя полученный ранее внешний IP-адрес и стандартный порт
6379:bashredis-cli -h <внешний IP-адрес> -p 6379Пример команды для статического внешнего IP-адреса:
bashredis-cli -h 2.59.81.140 -p 6379Получите информацию о сервере с помощью команды
info server, после чего завершите сессию с помощью командыquit.
Удалите ресурсы
В руководстве были созданы ресурсы, которые могут тарифицироваться. Если вы не планируете использовать их, удалите:
- внутренний и внешний IP-адреса;