InterSystems Kubernetes 운영자 딥스쿠버 잠수: 제2부분
                                            
                                                
                                                
                                                
                                                
                                                
                                                 19528 단어  devopskubernetesintersystems
                    
선결 조건
IRIS를 배치하려면 Kubernetes 클러스터가 필요합니다.이 예에서는 Google Kubernetes 엔진 (GKE 을 사용하기 때문에 Google 계정을 사용하여 Google Cloud 프로젝트를 설정하고 gcloud 명령행 유틸리티를 설치해야 합니다.
또한 kubectl 유틸리티를 설치해야 합니다.
$ helm version
version.BuildInfo{Version:"v3.3.4"...}
우리의 사례에서 어떤 종류의 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'.
$ 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
$ 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
$ 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
지원되는 API 모드를 볼 수 있습니다.
$ kubectl get crd irisclusters.intersystems.com -oyaml | less
$ kubectl explain irisclusters.intersystems.com
$ kubectl get crd irisclusters.intersystems.com -ojson | jq '.spec.versions[].schema.openAPIV3Schema.properties.spec.properties | to_entries[] | .key'
"configSource"
"licenseKeySecret"
"passwordHash"
"serviceTemplate"
"topology"
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를 실행하려면 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
$ 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
$ 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
이제 새로 만든 무지개를 검사해 봅시다.일반적으로 기중기까지의 유량은 서비스나 입구를 통과한다.기본적으로 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
$ kubectl port-forward svc/iko-test 52773
익숙한 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 .
$ docker tag covid-19:v1 eu.gcr.io/iko-project/covid-19:v1
$ docker push eu.gcr.io/iko-project/covid-19:v1
$ 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
 $ 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를 위한 도메인을 만듭니다.예를 들어, A 레코드를 만들려면 다음과 같이 하십시오.
covid19.myardyas.club = xx.xx.xx.xx
$ 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
참고: 위에서 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
$ 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
 
 네이티브 Google Ingress 디렉터 및 호스팅 인증서 정보
구글은 자신의 입구 컨트롤러GCE를 지원하며,nginx 컨트롤러를 대체할 수 있다.그러나 적어도 글을 쓸 때는 이렇다는 단점도 있다.
이 밖에 cert 관리자 대신 lack of rewrite rules support를 사용할 수 있습니다.이것은 매우 편리하지만, 인증서와 새로운 경로와 같은 입구 자원 업데이트를 처음 검색하면 뚜렷한 정지를 초래할 수 있다.또한 Google managed certificates에서 말한 바와 같이 구글이 관리하는 인증서는 GCE에만 적용되고nginx에는 적용되지 않는다.
위탁 관리 증서 다음 단계
GKE 클러스터에 IRIS 기반 애플리케이션을 구축했습니다.인터넷에 공개하기 위해 입구 컨트롤러와 인증 관리자를 추가했습니다.IKO 설정이 간단하다는 점을 강조하기 위해 Iriscluster 구성을 시도했습니다. 문서에서 더 많은 설정을 읽을 수 있습니다.
단일 데이터 서버는 좋지만 ECP, 이미지, 모니터링을 추가할 때 진정한 즐거움이 시작되고 IKO도 이러한 기능을 제공한다.계속해서 저희 Kubernetes operator 시리즈에서 곧 발표될 글을 주목하고 읽어 보시기 바랍니다.
Reference
이 문제에 관하여(InterSystems Kubernetes 운영자 딥스쿠버 잠수: 제2부분), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/intersystems/intersystems-kubernetes-operator-deep-dive-part-2-d7m텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)