Рубрики
Uncategorized

Intersystems Kubernetes Deep Dive: часть 2

В предыдущей статье мы смотрели один из способов создать пользовательский оператор, который управляет Iris Insta … Теги с DevOps, Intersystems, Kubernetes.

В Предыдущая статья Мы смотрели один из способов создать пользовательский оператор, который управляет состоянием экземпляра IRIS. На этот раз мы собираемся взглянуть на готовый оператор, межсистемы Kubernetes Operator (IKO). Официальная документация поможет нам навигаться по шагам развертывания.

Предварительные условия

Чтобы развернуть IRIS, нам нужны кластер Kubernetes. В этом примере мы будем использовать Google Kubernetes Engine ( GKE ), поэтому нам нужно будет использовать учетную запись Google, создать проект Google Cloud, и установить GCloud и kubectl Утилиты командной строки.

Вам также нужно будет установить Helm3 утилита:

$ helm version
version.BuildInfo{Version:"v3.3.4"...}

Примечание : Имейте в виду, что на Бесплатный ярус Google Не все ресурсы бесплатны.

В нашем случае не имеет значения, какой тип GKE мы используем — зонал , региональный или частный . После того, как мы создаем один, давайте подключаемся к кластеру. Мы создали кластер под названием «IKO» в проекте под названием «IKO-Project». Используйте свое собственное название проекта вместо «IKO-Project» в более позднем тексте.

Эта команда добавляет этот кластер на наши локальные кластеры конфигурации:

$ gcloud container clusters get-credentials iko --zone europe-west2-b --project iko-project

Установите Ико

Давайте развернум IKO в наш недавно созданный кластер. Рекомендуемый способ установки пакетов в Kubernetes использует руль. IKO не является исключением и может быть установлено как хелма. Выберите Helm версия 3 как это более безопасно.

Скачать IKO с Page WRC Компоненты межсистемы Создание бесплатной учетной записи разработчика, если у вас уже нет. На момент написания новейшая версия — 2.0.223.0 Отказ

Скачайте архив и распакуйте его. Мы будем ссылаться на распакованный каталог как текущий каталог.

Диаграмма в Диаграмма/ирис-оператор каталог. Если вы просто развертываете этот график, вы получите ошибку при описании развернутых стручков:

Failed to pull image "intersystems/iris-operator:2.0.0.223.0": rpc error:
code = Unknown desc = Error response from daemon:
pull access denied for intersystems/iris-operator,
repository does not exist or may require 'docker login'.

Итак, вам нужно сделать изображение IKO, доступное из кластера Kubernetes. Давайте нажимаем это изображение в реестр контейнера Google:

$ docker load -i image/iris_operator-2.0.0.223.0-docker.tgz
$ docker tag intersystems/iris-operator:2.0.0.223.0 eu.gcr.io/iko-project/iris-operator:2.0.0.223.0
$ docker push eu.gcr.io/iko-project/iris-operator:2.0.0.223.0

После этого нам нужно направить IKO использовать это новое изображение. Вы должны сделать это, отредактировав файл значений HELM:

$ vi chart/iris-operator/values.yaml
...
operator:
  registry: eu.gcr.io/iko-project
...

Теперь мы готовы развернуть Ико в ГК:

$ helm upgrade iko chart/iris-operator --install --namespace iko --create-namespace

$ helm ls --all-namespaces --output json | jq '.[].status'
"deployed"

$ kubectl -n iko get pods # Should be Running with Readiness 1/1

Давайте посмотрим на журналы IKO:

$ kubectl -n iko logs -f --tail 100 -l app=iris-operator
…
I1212 17:10:38.119363 1 secure_serving.go:116] Serving securely on [::]:8443
I1212 17:10:38.122306 1 operator.go:77] Starting Iris operator

Пользовательское определение ресурсов irisclusters.intersystems.com был создан во время развертывания ИКО. Вы можете посмотреть на схему API, которая она поддерживает, хотя это довольно долго:

$ kubectl get crd irisclusters.intersystems.com -oyaml | less

Один из способов взглянуть на все доступные параметры — использовать команду «Объяснить»:

$ kubectl explain irisclusters.intersystems.com

Другой способ использует jq. . Например, просмотр всех настроек конфигурации верхнего уровня:

$ kubectl get crd irisclusters.intersystems.com -ojson | jq '.spec.versions[].schema.openAPIV3Schema.properties.spec.properties | to_entries[] | .key'
"configSource"
"licenseKeySecret"
"passwordHash"
"serviceTemplate"
"topology"

Используя JQ таким способом (просмотр полей конфигурации и их свойства), мы можем узнать следующую структуру конфигурации:

configSource
  name
licenseKeySecret
  name
passwordHash
serviceTemplate
  metadata
    annotations
  spec
    clusterIP
    externalIPs
    externalTrafficPolicy
    healthCheckNodePort
    loadBalancerIP
    loadBalancerSourceRanges
    ports
    type
topology
  arbiter
    image
    podTemplate
      controller
        annotations
      metadata
        annotations
      spec
        affinity
          nodeAffinity
            preferredDuringSchedulingIgnoredDuringExecution
            requiredDuringSchedulingIgnoredDuringExecution
          podAffinity
            preferredDuringSchedulingIgnoredDuringExecution
            requiredDuringSchedulingIgnoredDuringExecution
          podAntiAffinity
            preferredDuringSchedulingIgnoredDuringExecution
            requiredDuringSchedulingIgnoredDuringExecution
        args
        env
        imagePullSecrets
        initContainers
        lifecycle
        livenessProbe
        nodeSelector
        priority
        priorityClassName
        readinessProbe
        resources
        schedulerName
        securityContext
        serviceAccountName
        tolerations
    preferredZones
    updateStrategy
      rollingUpdate
      type    
  compute
    image
    podTemplate
      controller
        annotations
      metadata
        annotations
      spec
        affinity
          nodeAffinity
            preferredDuringSchedulingIgnoredDuringExecution
            requiredDuringSchedulingIgnoredDuringExecution
          podAffinity
            preferredDuringSchedulingIgnoredDuringExecution
            requiredDuringSchedulingIgnoredDuringExecution
          podAntiAffinity
            preferredDuringSchedulingIgnoredDuringExecution
            requiredDuringSchedulingIgnoredDuringExecution
        args
        env
        imagePullSecrets
        initContainers
        lifecycle
        livenessProbe
        nodeSelector
        priority
        priorityClassName
        readinessProbe
        resources
          limits
          requests
        schedulerName
        securityContext
        serviceAccountName
        tolerations
    preferredZones
    replicas
    storage
      accessModes
      dataSource
        apiGroup
        kind
        name
      resources
        limits
        requests
      selector
      storageClassName
      volumeMode
      volumeName
    updateStrategy
      rollingUpdate
      type
  data
    image
    mirrored
    podTemplate
      controller
        annotations
      metadata
        annotations
      spec
        affinity
          nodeAffinity
            preferredDuringSchedulingIgnoredDuringExecution
            requiredDuringSchedulingIgnoredDuringExecution
          podAffinity
            preferredDuringSchedulingIgnoredDuringExecution
            requiredDuringSchedulingIgnoredDuringExecution
          podAntiAffinity
            preferredDuringSchedulingIgnoredDuringExecution
            requiredDuringSchedulingIgnoredDuringExecution
        args
        env
        imagePullSecrets
        initContainers
        lifecycle
        livenessProbe
        nodeSelector
        priority
        priorityClassName
        readinessProbe
        resources
          limits
          requests
        schedulerName
        securityContext
        serviceAccountName
        tolerations
    preferredZones
    shards
    storage
      accessModes
      dataSource
        apiGroup
        kind
        name
      resources
        limits
        requests
      selector
      storageClassName
      volumeMode
      volumeName
    updateStrategy
      rollingUpdate
      type

Есть так много настроек, но вам не нужно их устанавливать. По умолчанию подходят. Вы можете увидеть примеры конфигурации в файле Iris_operator-2.0.0.223.0/образцы Отказ

Чтобы запустить минимальную жизнеспособную IRIS, нам нужно указать только несколько настроек, например, приложение на основе IRIS (или IRIS), размер хранения и лицензионный ключ.

Примечание О лицензионном ключ: мы будем использовать IRIS сообщества, поэтому нам не нужен ключ. Мы не можем просто опустить этот параметр, но можем создать секрет, содержащий псевдо-лицензию. Лицензия Секретное поколение простое:

 $ touch iris.key # remember that a real license file is used in the most cases
 $ kubectl create secret generic iris-license --from-file=iris.key

Описание ириса понятно IKO:

$ cat iko.yaml
apiVersion: intersystems.com/v1alpha1
kind: IrisCluster
metadata:
  name: iko-test
spec:
  passwordHash: '' # use a default password SYS
  licenseKeySecret:
    name: iris-license # use a Secret name bolded above
  topology:
    data:
      image: intersystemsdc/iris-community:2020.4.0.524.0-zpm # Take a community IRIS
      storage:
        resources:
          requests:
            storage: 10Gi

Отправьте это проявление в кластер:

$ kubectl apply -f iko.yaml

$ kubectl get iriscluster
NAME       DATA COMPUTE MIRRORED STATUS   AGE
iko-test 1                       Creating 76s

$ kubectl -n iko logs -f --tail 100 -l app=iris-operator
db.Spec.Topology.Data.Shards = 0
I1219 15:55:57.989032 1 iriscluster.go:39] Sync/Add/Update for IrisCluster default/iko-test
I1219 15:55:58.016618 1 service.go:19] Creating Service default/iris-svc.
I1219 15:55:58.051228 1 service.go:19] Creating Service default/iko-test.
I1219 15:55:58.216363 1 statefulset.go:22] Creating StatefulSet default/iko-test-data.

Мы видим, что некоторые ресурсы (обслуживание, состояние состояния) будут созданы в кластере в пространстве имен «по умолчанию».

Через несколько секунд вы должны увидеть IRIS POD в пространстве имен «по умолчанию»:

$ kubectl get po -w
NAME            READY STATUS             RESTARTS AGE
iko-test-data-0 0/1   ContainerCreating  0        2m10s

Подождите немного, пока изображение ириса не будет натянута, то пока состояние не станет готовым и готовым становится 1/1. Вы можете проверить, какой тип диска был создан:

$ kubectl get pv
NAME                                     CAPACITY ACCESS MODES  RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-b356a943-219e-4685-9140-d911dea4c106 10Gi     RWO    Delete Bound   default/iris-data-iko-test-data-0 standard 5m

ReClaim Policy « Удалить » означает, что при удалении постоянного тома настойчивый диск, постоянный диск GCE также будет удален. Есть еще одна политика, — Сохранить «Это позволяет вам сэкономить упорные диски Google, чтобы выжить на постоянных томах выживания Cubernetes. Вы можете определить пользовательский StorageClass Чтобы использовать эту политику и другие настройки не по умолчанию. Пример присутствует в документации IKO: Создайте класс хранения для постоянного хранения Отказ

Теперь давайте проверим нашу недавно созданную ирису. В общем, трафик к стручкам проходит через услуги или вход. По умолчанию IKO создает услугу типа Clusterip с именем от IKO.YAML metadata.name поле:

$ kubectl get svc iko-test
NAME     TYPE      CLUSTER-IP EXTERNAL-IP PORT(S)             AGE
iko-test ClusterIP 10.40.6.33       1972/TCP,52773/TCP  14m

Мы можем назвать эту услугу, используя порту вперед:

$ kubectl port-forward svc/iko-test 52773

Перемещаться по браузеру на http://localhost: 52773/csp/sys/utilhome.csp и введите _system/sys.

Вы должны увидеть знакомый пользовательский интерфейс Iris (UI).

Пользовательское приложение

Давайте заменим чистую радужку с помощью приложения на основе IRIS. Сначала скачайте Приложение Covid-19 Отказ Мы не будем рассмотреть полное непрерывное развертывание здесь, просто минимальные шаги:

$ git clone https://github.com/intersystems-community/covid-19.git
$ cd covid-19
$ docker build --no-cache -t covid-19:v1 .

Поскольку наши Kubernetes работают в облаке Google, давайте будем использовать реестр контейнера Google Docker в качестве хранилища изображения. Здесь мы предполагаем, что у вас есть учетная запись в облако Google, позволяющее нажать изображения. Используйте свое собственное имя проекта в указанных ниже командах:

$ docker tag covid-19:v1 eu.gcr.io/iko-project/covid-19:v1
$ docker push eu.gcr.io/iko-project/covid-19:v1

Пойдем в каталог с iko.yaml, измените изображение там и перераспределите его. Вы должны сначала рассмотреть возможность удаления предыдущего примера:

$ cat iko.yaml
...  
  data:
    image: eu.gcr.io/iko-project/covid-19:v1
...
$ kubectl delete -f iko.yaml
$ kubectl -n iko delete deploy -l app=iris-operator
$ kubectl delete pvc iris-data-iko-test-data-0
$ kubectl apply -f iko.yaml

Вы должны воссоздать Iris Pod с этим новым изображением.

На этот раз давайте предоставляем внешний доступ через Входной ресурс Отказ Чтобы сделать это работать, мы должны развернуть Контроллер входа (Выберите Nginx для его гибкости). Чтобы обеспечить шифрование трафика (TLS), мы также добавим еще один компонент — Cert-Manager Отказ

Чтобы установить оба этих компонента, мы используем Helm Tool , версия 3.

$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

$ helm upgrade nginx-ingress  \
  --namespace nginx-ingress   \
  ingress-nginx/ingress-nginx \
  --install                   \
  --atomic                    \
  --version 3.7.0             \
  --create-namespace

Посмотрите на службу NGINX IP (это динамично, но вы можете сделать его статическим ):

 $ kubectl -n nginx-ingress get svc
 NAME                                   TYPE         CLUSTER-IP   EXTERNAL-IP PORT(S) AGE
 nginx-ingress-ingress-nginx-controller LoadBalancer 10.40.0.103  xx.xx.xx.xx 80:32032/TCP,443:32374/TCP 88s

Примечание : Ваш IP будет отличаться.

Перейдите в свой домен регистратор и создайте доменное имя для этого IP. Например, создайте A-Record:

covid19.myardyas.club = xx.xx.xx.xx

Некоторое время пройдет до тех пор, пока эта новая запись не распространяется на DNS-серверы. Конечный результат должен быть похож на:

$ dig +short covid19.myardyas.club
xx.xx.xx.xx

Имея развернутый контроллер входа, нам теперь нужно создать сам ресурс входа (используйте свое собственное доменное имя):

$ cat ingress.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: iko-test
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    certmanager.k8s.io/cluster-issuer: lets-encrypt-production # Cert manager will be deployed below
spec:
  rules:
  - host: covid19.myardyas.club
    http:
      paths:
      - backend:
          serviceName: iko-test
          servicePort: 52773
        path: /
  tls:
  - hosts:
    - covid19.myardyas.club
    secretName: covid19.myardyas.club

$ kubectl apply -f ingress.yaml

Через минуту или около того, IRIS должен быть доступен на http://covid19.myardyas.club/csp/sys/utilhome.csp (Не забудьте использовать ваше доменное имя) и приложение COVID-19 в http://covid19.myardyas.club/dsw/index.html (Выберите пространство имен IrisApp).

Примечание : Выше мы выставили порт HTTP Iris. Если вам нужно выставить через Super-серверный порт Nginx TCP (1972 или 51773), вы можете прочитать инструкции по адресу Выставление услуг TCP и UDP Отказ

Добавить шифрование трафика

Последний шаг — добавить шифрование трафика. Давайте разверним Cert-Manager для этого:

$ kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/v0.10.0/deploy/manifests/00-crds.yaml

$ helm upgrade cert-manager \
  --namespace cert-manager  \
  jetstack/cert-manager     \
  --install                 \
  --atomic                  \
  --version v0.10.0         \
  --create-namespace

$ cat lets-encrypt-production.yaml
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
  name: lets-encrypt-production
spec:
  acme:
    # Set your email. Let's Encrypt will send notifications about certificates expiration
    email: mvhoma@gmail.com 
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: lets-encrypt-production
    solvers:
    - http01:
        ingress:
          class: nginx

$ kubectl apply -f lets-encrypt-production.yaml

Подождите несколько минут до тех пор, пока Cert-Manager отмечает приложение Iris-Application и уходит, чтобы зашифровать для сертификата. Вы можете наблюдать за заказ и ресурсами сертификата в процессе:

$ kubectl get order
NAME                             STATE AGE
covid19.myardyas.club-3970469834 valid 52s

$ kubectl get certificate
NAME                  READY SECRET                AGE
covid19.myardyas.club True  covid19.myardyas.club 73s

На этот раз вы можете посетить более защищенную версию сайта — https://covid19.myardyas.club/dsw/index.html :

О на родном контроллере Google Ingress и управляемые сертификаты

Google поддерживает свой собственный контроллер входа, GCE , который вы можете использовать вместо контроллера Nginx. Тем не менее, у него есть некоторые недостатки, например, Отсутствие переписывания правил поддержки , по крайней мере, в момент написания.

Кроме того, вы можете использовать Google Управляемые сертификаты вместо Cert-Manager. Это удобно, но начальное поиск сертификата и любых обновлений входных ресурсов (например, новый путь) вызывает ощутимое время простоя. Кроме того, управляемые Google сертификаты работают только с GCE, а не с Nginx, как отмечено в Управляемые сертификаты Отказ

Следующие шаги

Мы развернули приложение на основе IRIS в кластер GKE. Чтобы разоблачить его в Интернет, мы добавили контроллер входа и менеджер сертификации. Мы пробовали конфигурацию Iriscluster, чтобы выделить, что настройка IKO проста. Вы можете прочитать о большем количестве настроек Используя оператор Intersystems Kubernetes документация.

Один сервер данных хорош, но настоящая забавность начинается, когда мы добавляем ECP, зеркалирование и мониторинг, которые также доступны с IKO. Оставайтесь настроенными и прочитайте предстоящую статью в наших серии оператора Kubernetes, чтобы приблизить зеркальное отображение.

Оригинал: «https://dev.to/intersystems/intersystems-kubernetes-operator-deep-dive-part-2-d7m»