Skip to content

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

В этом руководстве вы узнаете, как развернуть приложение в кластере 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. Подготовьте виртуальную машину

  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

Примечание

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

2. Разверните и настройте приложение

2.1. Разверните приложение

  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

2.2. Настройте сервис ClusterIP

  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

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. Разверните внутренний балансировщик

  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.1. Создайте внешний балансировщик

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

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

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.

Удалите ресурсы

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