InterSystems Kubernetes 운영자 딥스쿠버 잠수: 제2부분

에서 IRIS 인스턴스 상태를 관리하는 사용자 정의 작업자를 만드는 방법을 연구했습니다.이번에 우리는 기존의 운영사인 인터시스템스 Kubernetes 운영자(IKO)를 볼 것이다.Official documentation 배포 단계를 탐색하는 데 도움이 됩니다.

선결 조건


IRIS를 배치하려면 Kubernetes 클러스터가 필요합니다.이 예에서는 Google Kubernetes 엔진 (GKE 을 사용하기 때문에 Google 계정을 사용하여 Google Cloud 프로젝트를 설정하고 gcloud 명령행 유틸리티를 설치해야 합니다.
또한 kubectl 유틸리티를 설치해야 합니다.
$ helm version
version.BuildInfo{Version:"v3.3.4"...}
주의: Helm3에서 모든 자원이 무료는 아닙니다.
우리의 사례에서 어떤 종류의 GKE를 사용하는지는 중요하지 않다Google free tier, zonal 또는 regional.하나를 만든 후에 그룹에 연결합니다.우리는'iko 프로젝트'라는 프로젝트에'iko'라는 그룹을 만들었다.다음 텍스트에서 'iko 프로젝트' 대신 당신의 프로젝트 이름을 사용하십시오.
이 명령은 로컬 클러스터 구성에 이 클러스터를 추가합니다.
$ gcloud container clusters get-credentials iko --zone europe-west2-b --project iko-project

개인적 IKO 설치


새로 만들어진 클러스터에 IKO를 배치합니다.Kubernetes에 패키지를 설치하는 데 권장되는 방법은 Helm입니다.IKO도 예외 없이 키맵으로 설치할 수 있다. 를 선택하는 것이 더 안전합니다.
WRC 페이지Helm version 3에서 IKO를 다운로드하면 무료 개발자 계정이 없으면 만들 수 있습니다.본문을 작성할 때 최신 판본은 2.0.223.0이다.
아카이브를 다운로드하여 압축을 풉니다.우리는 패키지를 해제한 디렉터리를 현재 디렉터리라고 부른다.
도표는chart/iris 작업자 디렉터리에 있습니다.이 차트만 배포하면 배포된 크레인을 설명하는 동안 오류가 발생합니다.
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'.
따라서 Kubernetes 그룹에서 IKO 그림을 가져와야 합니다.먼저 이 이미지를 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가 이 새로운 이미지를 사용하도록 지도해야 한다.헬멧 값 파일을 편집하여 다음 작업을 수행해야 합니다.
$ vi chart/iris-operator/values.yaml
...
operator:
  registry: eu.gcr.io/iko-project
...
이제 IKO를 GKE에 배치할 예정입니다.
$ 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
InterSystems Components 무지개 묶음.시스템 간.com은 IKO 배치 기간에 만들어졌다.
지원되는 API 모드를 볼 수 있습니다.
$ kubectl get crd irisclusters.intersystems.com -oyaml | less
사용 가능한 모든 매개변수를 보는 방법 중 하나는 explain 명령을 사용하는 것입니다.
$ kubectl explain irisclusters.intersystems.com
다른 방법은 사용Custom Resource Definition이다.예를 들어, 모든 최상위 레벨 구성 설정을 보려면 다음과 같이 하십시오.
$ 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.223.0/samples 파일에서 구성 예를 볼 수 있습니다.
최소 실행 가능한 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
"""jq""회수 정책은 영구 볼륨을 삭제할 때 GCE 영구 디스크도 삭제됨을 의미합니다."Google 영구 디스크를 저장하여 Kubernetes 영구 볼륨을 삭제한 후에 생존할 수 있도록 하는 또 다른 정책 Delete 이 있습니다.사용자 정의Retain를 사용하여 이 정책 및 기타 기본값이 아닌 설정을 사용할 수 있습니다.IKO의 문서에는 StorageClass의 예가 있습니다.
이제 새로 만든 무지개를 검사해 봅시다.일반적으로 기중기까지의 유량은 서비스나 입구를 통과한다.기본적으로 IKO는 IKO의 이름을 사용하여 ClusterIP 유형의 서비스를 만듭니다.yaml 메타데이터.이름 필드:
$ kubectl get svc iko-test
NAME     TYPE      CLUSTER-IP EXTERNAL-IP PORT(S)             AGE
iko-test ClusterIP 10.40.6.33 <none>      1972/TCP,52773/TCP  14m
port forward를 사용하여 이 서비스를 호출할 수 있습니다.
$ kubectl port-forward svc/iko-test 52773
브라우저를 Create a storage class for persistent storage로 이동하고 system/SYS를 입력합니다.
익숙한 IRIS 사용자 인터페이스 (UI) 를 보게 될 것입니다.

http://localhost:52773/csp/sys/UtilHome.csp 사용자 정의 응용 프로그램


무지개 기반의 응용 프로그램으로 순수한 무지개를 교체합시다.우선, 다운로드 .여기서 우리는 완전하고 연속적인 배치는 고려하지 않고 가장 간단한 절차만 고려한다.
$ git clone https://github.com/intersystems-community/covid-19.git
$ cd covid-19
$ docker build --no-cache -t covid-19:v1 .
Google Kubernetes가 Google 클라우드에서 실행되기 때문에 Google Docker 컨테이너 레지스트리를 그림으로 저장합니다.우리는 네가 구글 클라우드에 계정이 있다고 가정하면 사진을 전송할 수 있다.아래에 설명된 명령에 프로젝트 이름을 사용합니다.
$ docker tag covid-19:v1 eu.gcr.io/iko-project/covid-19:v1
$ docker push eu.gcr.io/iko-project/covid-19:v1
우리 iko와 함께 목록에 갑시다.아마르, 그곳의 그림을 바꾸고 다시 배치해라.먼저 이전 예제를 삭제하는 것을 고려해야 합니다.
$ 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
너는 이 새 그림으로 무지개 상자를 다시 만들어야 한다.
이번에 우리는 COVID-19 application를 통해 외부 방문을 제공할 것이다.그것을 일하게 하기 위해서 우리는 Ingress Resource(선택Ingress Controller을 배치해야 한다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 (이것은 동적이지만 당신은 할 수 있습니다 make it static:

 $ 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 레코드를 만들려면 다음과 같이 하십시오.
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
약 1분 후 IRIS는 http://covid19.myardyas.club/csp/sys/UtilHome.csp(도메인 이름 기억하기)와 http://covid19.myardyas.club/dsw/index.html(이름공간 선택IRISAP)에 코로나-19 응용 프로그램을 제공한다.
참고: 위에서 HTTP IRIS 포트를 공개했습니다.nginx TCP 슈퍼서버 포트(1972 또는 51773)를 통해 공개할 필요가 있으면Exposing TCP and UDP services에서 설명을 읽을 수 있습니다.

트래픽 암호화 추가


마지막 단계는 데이터 암호화를 추가하는 것입니다.이를 위해 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: [email protected] 
    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 관리자가 IRIS 프로그램이 들어오는 것을 눈치채고 '암호화 인증서' 로 넘어갈 때까지 몇 분 기다리십시오.진행 중인 주문 및 인증서 리소스를 볼 수 있습니다.
$ 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 디렉터 및 호스팅 인증서 정보


구글은 자신의 입구 컨트롤러GCE를 지원하며,nginx 컨트롤러를 대체할 수 있다.그러나 적어도 글을 쓸 때는 이렇다는 단점도 있다.
이 밖에 cert 관리자 대신 lack of rewrite rules support를 사용할 수 있습니다.이것은 매우 편리하지만, 인증서와 새로운 경로와 같은 입구 자원 업데이트를 처음 검색하면 뚜렷한 정지를 초래할 수 있다.또한 Google managed certificates에서 말한 바와 같이 구글이 관리하는 인증서는 GCE에만 적용되고nginx에는 적용되지 않는다.

위탁 관리 증서 다음 단계


GKE 클러스터에 IRIS 기반 애플리케이션을 구축했습니다.인터넷에 공개하기 위해 입구 컨트롤러와 인증 관리자를 추가했습니다.IKO 설정이 간단하다는 점을 강조하기 위해 Iriscluster 구성을 시도했습니다. 문서에서 더 많은 설정을 읽을 수 있습니다.
단일 데이터 서버는 좋지만 ECP, 이미지, 모니터링을 추가할 때 진정한 즐거움이 시작되고 IKO도 이러한 기능을 제공한다.계속해서 저희 Kubernetes operator 시리즈에서 곧 발표될 글을 주목하고 읽어 보시기 바랍니다.

좋은 웹페이지 즐겨찾기