В Предыдущая статья Мы смотрели один из способов создать пользовательский оператор, который управляет состоянием экземпляра 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.331972/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»