Перейти к содержимому

Запуск и публикация приложения

В этом руководстве вы узнаете, как развернуть приложение в кластере Managed Kubernetes, и опубликовать его внутри сети и в интернете с помощью балансировщиков нагрузки.

В качестве приложения в руководстве используется сервер Redis с постоянным хранилищем (Persistent Volume).

Чтобы развернуть и опубликовать приложение:

  1. Подготовьте виртуальную машину — она понадобится для работы с кластером через kubectl и для проверки доступности приложения.
  2. Разверните внутренний балансировщик и проверьте доступность приложения из внутренней сети облака.
  3. Разверните внешний балансировщик и проверьте доступность приложения из интернета.

Если вам больше не нужны созданные ресурсы, удалите их.

  1. Создайте NAT-шлюз для подсети, в которой будет развернут кластер Managed Kubernetes.

  2. Создайте сервисные аккаунты:

    • C именем sa-k8s и ролью mk8s.clusterAdmin — для работы группы узлов Managed Kubernetes.
    • С именем sa-vm и ролью editor — для инициализации MWS CLI на виртуальной машине и работы с утилитой kubectl.
  3. Создайте кластер Managed Kubernetes и группу узлов для него. При создании группы используйте сервисный аккаунт sa-k8s.

  4. Создайте виртуальную машину с внешним IP-адресом в той же сети, где развернут кластер Managed Kubernetes. При создании ВМ привяжите к ней сервисный аккаунт sa-vm.

  1. Инициализируйте профиль MWS CLI:

    bash
    mws init --vm-sa
  2. Установите утилиту командной строки kubectl.

  3. Получите kubeconfig:

    bash
    mws mk8s get-kubeconfig --name <имя кластера>
  4. Убедитесь, что кластер доступен:

    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
Примечание

Все последующие шаги руководства выполняйте на виртуальной машине.

  1. Создайте пространство имен для размещения приложения:

    bash
    kubectl create namespace test-redis
  2. Переключите контекст на созданное пространство:

    bash
    kubectl config set-context --current --namespace test-redis
  3. Подготовьте манифест для развертывания приложения. Для этого выполните команду, которая сохранит готовый манифест в файл redis-app.yaml:

    yaml
    cat <<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
  4. Примените манифест:

    bash
    kubectl apply -f ./redis-app.yaml
  5. Убедитесь, что под приложения запущен и работает:

    bash
    kubectl get pods -l app=redis

    Ожидаемый результат:

    bash
    NAME READY STATUS RESTARTS AGE
    redis-0 1/1 Running 0 2m
  1. Подготовьте манифест сервиса ClusterIP, необходимый для сетевой связности внутри кластера и адресации внутренних сервисов. Для этого выполните команду, которая сохранит готовый манифест в файл redis-clusterip.yaml:

    yaml
    cat <<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
  2. Примените манифест:

    bash
    kubectl apply -f ./redis-clusterip.yaml
  3. Убедитесь, что сервис успешно создан:

    bash
    kubectl get svc redis-clusterip

    Ожидаемый результат:

    bash
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    redis-clusterip ClusterIP 10.222.81.207 <none> 6379/TCP 9s

Приложение развернуто, но пока доступно только из внутренней сети кластера. Чтобы опубликовать приложение, разверните внутренний или внешний балансировщик нагрузки.

Балансировщики нагрузки имеют следующие возможности и ограничения:

  • Внутренний и внешний балансировщик могут работать одновременно. Приложение будет доступно как по внутреннему, так и по внешнему IP-адресам.

    При этом создавать балансировщики нужно с помощью двух разных манифестов, используя в каждом манифесте разные аннотации: mk8s.mws.ru/load-balancer-internal-ip-name и mk8s.mws.ru/load-balancer-external-ip-name. Если указать обе аннотации в одном манифесте, создание балансировщика завершится с ошибкой.

  • Если в манифесте балансировщика не указать ни одну аннотацию типа mk8s.mws.ru/load-balancer-*, то создастся внешний балансировщик со случайно выбранным свободным внешним IP-адресом, который есть в проекте. Если такого IP-адреса нет, он будет автоматически создан и привязан к балансировщику.

  1. Зарезервируйте внутренний статический IP-адрес с именем redis-internal-ip в подсети, указанной при создании кластера Managed Kubernetes. В этом примере используется IP-адрес 192.168.0.98.

  2. Подготовьте манифест для внутреннего балансировщика. Для этого выполните команду, которая сохранит готовый манифест в файл redis-lbinternal.yaml:

    yaml
    cat <<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
  3. Примените манифест:

    bash
    kubectl apply -f ./redis-lbinternal.yaml
  4. Убедитесь, что балансировщик успешно создан:

    bash
    kubectl get svc redis-lbinternal

    Ожидаемый результат:

    bash
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    redis-lbinternal LoadBalancer 10.222.90.76 192.168.0.98 6379:31125/TCP 67s
  5. Проверьте подключение к приложению с виртуальной машины:

    1. Установите утилиту redis-tools:

      bash
      sudo apt update && sudo apt install -y redis-tools
    2. Подключитесь к приложению, используя созданный ранее статический IP-адрес и стандартный порт 6379:

      bash
      redis-cli -h 192.168.0.98 -p 6379
    3. Получите информацию о сервере с помощью команды info server, после чего завершите сессию с помощью команды quit.

В результате вы получили приложение, доступное через балансировщик нагрузки только во внутренней подсети облака. Чтобы опубликовать приложение в интернете, перейдите к следующему шагу и разверните внешний балансировщик нагрузки.

4. Разверните и протестируйте внешний балансировщик

Заголовок раздела «4. Разверните и протестируйте внешний балансировщик»

При развертывании внешнего балансировщика вы можете использовать как динамический, так и статический внешний IP-адрес.

Создайте внешний балансировщик нагрузки:

  • Со статическим IP-адресом
  • С динамическим IP-адресом
  1. Зарезервируйте внешний статический IP-адрес с именем redis-external-ip в подсети, указанной при создании кластера Managed Kubernetes.

  2. Подготовьте манифест для внешнего балансировщика. Для этого выполните команду, которая сохранит готовый манифест в файл redis-lbexternal-fixed.yaml:

    yaml
    cat <<EOF> ./redis-lbexternal-fixed.yaml
    apiVersion: v1
    kind: Service
    metadata:
    name: redis-lbexternal-fixed
    labels:
    app: redis
    annotations:
    mk8s.mws.ru/load-balancer-external-ip-name: redis-external-ip
    spec:
    selector:
    app: redis
    ports:
    - name: redis
    port: 6379
    protocol: TCP
    type: LoadBalancer
    EOF
  3. Примените манифест:

    bash
    kubectl apply -f ./redis-lbexternal-fixed.yaml
  4. Убедитесь, что балансировщик успешно создан:

    bash
    kubectl get svc redis-lbexternal-fixed

    Ожидаемый результат:

    bash
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    redis-lbexternal-fixed LoadBalancer 10.222.115.36 2.59.81.140 6379:31896/TCP 16s
  5. Сохраните значения для внешнего IP-адреса и TCP-порта из вывода предыдущей команды, они понадобятся на следующем шаге. В примере это 2.59.81.140 и 31896.

4.2. Настройте и протестируйте работу внешнего балансировщика

Заголовок раздела «4.2. Настройте и протестируйте работу внешнего балансировщика»
  1. Создайте правило файрвола со следующими параметрами:

    • Направление трафикаIngress.
    • Действие в рамках правилаAllow.
    • Источник трафика0.0.0.0/0.
    • Назначение трафика — CIDR подсети, в которой расположен кластер Managed Kubernetes. Например, 192.168.0.0/16.
    • ПротоколTCP.
    • Порт — TCP-порт балансировщика, полученный в предыдущем шаге. Например, 31896.
    • Опция Активировать правило сразу после сохранения — включена.
  2. Проверьте подключение к приложению с виртуальной машины через интернет:

    1. Установите утилиту redis-tools, если она еще не установлена:

      bash
      sudo apt update && sudo apt install -y redis-tools
    2. Подключитесь к приложению, используя полученный ранее внешний IP-адрес и стандартный порт 6379:

      bash
      redis-cli -h <внешний IP-адрес> -p 6379

      Пример команды для статического внешнего IP-адреса:

      bash
      redis-cli -h 2.59.81.140 -p 6379
    3. Получите информацию о сервере с помощью команды info server, после чего завершите сессию с помощью команды quit.

В руководстве были созданы ресурсы, которые могут тарифицироваться. Если вы не планируете использовать их, удалите: