Статьи

Автоматический перезапуск модулей в контроллере репликации кластера Kubernetes

Ключевой особенностью Kubernetes является его способность поддерживать «желаемое состояние» с помощью объявленных примитивов. Контроллеры репликации — это ключевая концепция, которая помогает достичь этого состояния.

Контроллер репликации обеспечивает одновременное выполнение заданного количества «реплик» модуля. Если их будет слишком много, это убьет некоторых. Если их будет слишком мало, начнется больше.

Контроллер репликации

Давайте посмотрим, как раскрутить контроллер репликации с двумя репликами модуля. Затем мы убьем один модуль и посмотрим, как Kubernetes автоматически запустит другой модуль.

Начать Kubernetes Cluster

  1. Самый простой способ запустить кластер Kubernetes в Mac OS — это использовать Vagrant :
    1
    2
    export KUBERNETES_PROVIDER=vagrant
    curl -sS https://get.k8s.io | bash
  2. Кроме того, Kubernetes можно загрузить с github.com/GoogleCloudPlatform/kubernetes/releases/download/v1.0.0/kubernetes.tar.gz , а кластер можно запустить как:
    1
    2
    3
    cd kubernetes
    export KUBERNETES_PROVIDER=vagrant
    cluster/kube-up.sh

Запустите и проверьте контроллер репликации и модули

  1. Все файлы конфигурации, необходимые Kubernetes для запуска контроллера репликации, находятся в проекте kubernetes-java-sample . Клонировать рабочее пространство:
    1
    git clone https://github.com/arun-gupta/kubernetes-java-sample.git
  2. Запустите контроллер репликации, который имеет две реплики модуля, каждая с контейнером WildFly:
    1
    2
    ./cluster/kubectl.sh create -f ~/workspaces/kubernetes-java-sample/wildfly-rc.yaml
    replicationcontrollers/wildfly-rc

    Используемый файл конфигурации показан:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: wildfly-rc
      labels:
        name: wildfly
    spec:
      replicas: 2
      template:
        metadata:
          labels:
            name: wildfly
        spec:
          containers:
          - name: wildfly-rc-pod
            image: jboss/wildfly
            ports:
            - containerPort: 8080

    Здесь используется изображение WildFly Docker по умолчанию.

  3. Получить статус стручков:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    ./cluster/kubectl.sh get -w po
    NAME               READY     STATUS    RESTARTS   AGE
    wildfly-rc-15xg5   0/1       Pending   0          2s
    wildfly-rc-d5fbs   0/1       Pending   0          2s
    NAME               READY     STATUS    RESTARTS   AGE
    wildfly-rc-15xg5   0/1       Pending   0          5s
    wildfly-rc-d5fbs   0/1       Pending   0         5s
    wildfly-rc-d5fbs   0/1       Running   0         8s
    wildfly-rc-15xg5   0/1       Running   0         8s
    wildfly-rc-d5fbs   1/1       Running   0         15s
    wildfly-rc-15xg5   1/1       Running   0         15s

    Обратите внимание: -w обновляет статус всякий раз, когда происходит изменение. Статус изменится с «Ожидание» на «Выполнено» и затем «Готов к приему запросов»

  4. Получить статус контроллера репликации:
    1
    2
    3
    ./cluster/kubectl.sh get rc
    CONTROLLER   CONTAINER(S)     IMAGE(S)        SELECTOR       REPLICAS
    wildfly-rc   wildfly-rc-pod   jboss/wildfly   name=wildfly   2

    Если запущено несколько контроллеров репликации, вы можете запросить этот конкретный контроллер, используя метку:

    1
    2
    3
    ./cluster/kubectl.sh get rc -l name=wildfly
    CONTROLLER   CONTAINER(S)     IMAGE(S)        SELECTOR       REPLICAS
    wildfly-rc   wildfly-rc-pod   jboss/wildfly   name=wildfly   2
  5. Получить имя запущенных модулей:
    1
    2
    3
    4
    ./cluster/kubectl.sh get po
    NAME               READY     STATUS    RESTARTS   AGE
    wildfly-rc-15xg5   1/1       Running   0          36m
    wildfly-rc-d5fbs   1/1       Running   0          36m
  6. Найти IP-адрес каждого модуля (используя имя):
    1
    2
    ./cluster/kubectl.sh get -o template po wildfly-rc-15xg5 --template={{.status.podIP}}
    10.246.1.18

    И другого стручка:

    1
    2
    ./cluster/kubectl.sh get -o template po wildfly-rc-d5fbs --template={{.status.podIP}}
    10.246.1.19
  7. IP-адрес модуля доступен только внутри кластера. Войдите в систему minion для доступа к главной странице WildFly, размещенной в контейнерах:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    kubernetes> vagrant ssh minion-1
    Last login: Tue Jul 14 21:35:12 2015 from 10.0.2.2
    [vagrant@kubernetes-minion-1 ~]$ curl http://10.246.1.18:8080
    <!--
      ~ JBoss, Home of Professional Open Source.
    . . .
    </div>
    </body>
    </html>
    [vagrant@kubernetes-minion-1 ~]$ curl http://10.246.1.19:8080
    <!--
      ~ JBoss, Home of Professional Open Source.
      ~ Copyright (c) 2014, Red Hat, Inc., and individual contributors
    . . .
    </div>
    </body>
    </html>

Автоматический перезапуск стручков

Давайте удалим модуль и посмотрим, как автоматически создается новый модуль.

01
02
03
04
05
06
07
08
09
10
kubernetes> ./cluster/kubectl.sh delete po wildfly-rc-15xg5
pods/wildfly-rc-15xg5
kubernetes> ./cluster/kubectl.sh get -w po
NAME               READY     STATUS    RESTARTS   AGE
wildfly-rc-0xoms   0/1       Pending   0          2s
wildfly-rc-d5fbs   1/1       Running   0          48m
NAME               READY     STATUS    RESTARTS   AGE
wildfly-rc-0xoms   0/1       Pending   0          11s
wildfly-rc-0xoms   0/1       Running   0         13s
wildfly-rc-0xoms   1/1       Running   0         21s

Обратите внимание, как стручок с именем wildfly-rc-15xg5 был удален, и был создан новый стручок с именем wildfly-rc-0xoms .

Наконец, удалите контроллер репликации:

1
kubectl.sh create -f ~/workspaces/kubernetes-java-sample/wildfly-rc.yaml

Последние файлы конфигурации и подробные инструкции находятся по адресу kubernetes-java-sample .

В реальном мире вы обычно оборачиваете этот контроллер репликации в службу и интерфейс с помощью балансировщика нагрузки. Но это тема для другого блога!

Наслаждайтесь!