주:

Terraform을 사용하여 OKE를 사용하여 여러 OCI 지역에 여러 Kubernetes 클러스터를 배치하고 RPC를 사용하여 전체 메시 네트워크 생성

소개

이 사용지침서에서는 OKE(Oracle Cloud Infrastructure Container Engine for Kubernetes)를 사용하여 여러 Kubernetes 클러스터를 생성하는 방법에 대해 설명하고, 이러한 클러스터를 세 개의 다른 국가(지역)에 배포합니다. 배포 속도를 높이고 최소한의 구성 실수로 Kubernetes 클러스터를 일관되게 배포하기 위해 Terraform 및 일부 사용자 지정 bash 스크립트를 사용합니다.

이미지

또한 빠른 생성 메소드사용자정의 생성 메소드를 사용하여 단일 클러스터를 수동으로 배치했습니다.

이 사용지침서에서는 Oracle Cloud에 여러 Kubernetes 클러스터 배포 설명서를 기반으로 업데이트됩니다.

목표

작업 1: 토폴로지 결정(스타 대 메시)

우리는 모든 지역에 배포되는 컨테이너 기반 애플리케이션을 배포하기 위해 이러한 Kubernetes 클러스터를 구축하고 있습니다. 이러한 Kubernetes 클러스터 간 통신을 허용하려면 일종의 네트워크 통신이 필요합니다. 지금은 이 튜토리얼의 범위를 벗어나지만 몇 가지 아키텍처 결정을 미리 내려야 합니다. 이러한 결정 중 하나는 모든 지역 간의 직접적인 의사 소통을 허용할 것인지 또는 한 지역을 모든 커뮤니케이션의 허브로 사용할 것인지, 다른 지역을 스포크로 사용할 것인지 결정하는 것입니다.

스타 토폴로지: 스타 토폴로지는 단일 허브 영역을 사용하여 영역 간 통신을 허용합니다. 따라서 산호세의 Kubernetes 클러스터가 두바이의 Kubernetes 클러스터와 통신하려는 경우 암스테르담을 전송 허브로 사용합니다.

이미지

메시 토폴로지: 메시 토폴로지는 모든 영역(Kubernetes 클러스터)과 직접 통신할 수 있도록 해줍니다. 따라서 산호세의 Kubernetes 클러스터가 두바이의 Kubernetes 클러스터와 통신하려는 경우 직접 통신할 수 있습니다.

이미지

이 자습서에서는 메시 토폴로지를 구축하려고 합니다. 이 연결은 DRG 및 RPC를 사용하여 수행됩니다.

작업 2: 인증을 위해 환경 준비 및 Terraform 스크립트 실행

Terraform을 사용하기 전에 환경을 준비해야 합니다. Terraform을 사용하려면 터미널을 엽니다. 이 자습서에서는 OS X 터미널 응용 프로그램을 사용합니다.

이미지

  1. 다음 명령을 실행하여 Terraform이 설치되어 있고 경로에 추가되었으며 버전이 무엇인지 확인합니다.

    Last login: Thu Apr  4 08:50:38 on ttys000
    iwhooge@iwhooge-mac ~ % terraform -v
    zsh: command not found: terraform
    iwhooge@iwhooge-mac ~ %
    
  2. 명령을 찾을 수 없습니다. 즉, Terraform이 설치되지 않았거나 경로 변수에 추가되지 않은 것입니다.

이미지

Terraform이 설치되지 않았으므로 설치해야 합니다. Terraform을 설치할 뿐만 아니라 Terraform 애플리케이션을 배포하고 세 개의 다른 지역에 세 개의 Kubernetes 클러스터를 배포하기 위한 전체 엔드 투 엔드 스크립팅 솔루션 환경을 준비하는 데 필요한 여러 단계가 있습니다.

다음 이미지는 따라야 할 필수 작업에 대한 지침을 제공합니다.

이미지

작업 2.1: Homebrew 설치

Terraform은 다양한 방법을 사용하여 설치할 수 있습니다. 이 자습서에서는 Homebrew를 사용하여 Terraform을 설치합니다.

Homebrew는 MacOS(및 Linux)용 패키지 관리자로, 응용 프로그램을 설치하는 데 사용할 수 있으며 필요한 종속성은 apt 또는 yum와 같습니다.

작업 2.2: Homebrew를 사용하여 Terraform 설치

이 작업에서는 Homebrew를 사용하여 Terraform 패키지를 설치합니다.

작업 2.3: OCI 인증에 대한 로컬 RSA 키 생성

API 키를 사용하여 OCI에서 인증을 허용하려면 이 용도로만 새 전용 및 공용 키를 생성해야 합니다.

  1. 다음 명령을 실행하여 디렉토리를 사용자의 홈 디렉토리로 변경합니다.

    iwhooge@iwhooge-mac ~ % cd ~/
    
  2. 다음 명령을 실행하여 홈 디렉토리에 있는지 확인합니다.

    iwhooge@iwhooge-mac ~ % pwd
    
  3. 홈 디렉토리가 올바른지 확인합니다.

    /Users/iwhooge
    
  4. 다음 명령을 실행하여 OCI 인증 정보를 포함할 새 디렉토리를 생성합니다.

    iwhooge@iwhooge-mac ~ % mkdir .oci
    
  5. 다음 명령을 실행하여 개인 RSA 키를 생성합니다.

    iwhooge@iwhooge-mac ~ % openssl genrsa -out ~/.oci/4-4-2023-rsa-key.pem 2048
    Generating RSA private key, 2048 bit long modulus
    .........................................................................................................................................+++++
    ......+++++
    e is 65537 (0x10001)
    
  6. 다음 명령을 실행하여 개인 키 파일을 읽을 수 있도록 합니다.

    iwhooge@iwhooge-mac ~ % chmod 600 ~/.oci/4-4-2023-rsa-key.pem
    
  7. 다음 명령을 실행하여 개인 키에서 공용 RSA 키를 생성합니다.

    iwhooge@iwhooge-mac ~ % openssl rsa -pubout -in ~/.oci/4-4-2023-rsa-key.pem -out ~/.oci/4-4-2023-rsa-key-public.pem
    
  8. 키 쓰기가 완료되었는지 확인합니다.

    writing RSA key
    
  9. 다음 명령을 실행하여 개인 RSA 키의 내용을 확인합니다.

    iwhooge@iwhooge-mac ~ % cat ~/.oci/4-4-2023-rsa-key.pem
    
  10. 개인 RSA 키의 내용을 확인합니다.

    -----BEGIN RSA PRIVATE KEY-----
    MIIEpQIBAAKCAQEA52+LJ+gp3MAJGtXTeQ/dmqq6Xh1zufK0yurLt/0w/DuxqEsL
    RT7x+Znz6EOVLx34Ul27QnHk7bhXaDCuwInnaOTOiS97AnLuFM08tvFksglnJssA
    JsszfTzUMNf0w4wtuLsJ5oRaPbVUa01TIm6HdwKAloIKYSn6z8gcvfLLItkyvPRo
    XXX
    w3yip+Yxr1YN3LjpDbZk4WTagKWoVQzp5nrfZlyU7ToZcMpUn/fIUsI=
    -----END RSA PRIVATE KEY-----
    
  11. 다음 명령을 실행하여 공용 RSA 키의 내용을 확인합니다.

    iwhooge@iwhooge-mac ~ % cat ~/.oci/4-4-2023-rsa-key-public.pem
    
  12. 공용 RSA 키의 컨텐츠를 확인합니다.

    ----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA52+LJ+gp3MAJGtXTeQ/d
    XXX
    mtHVtjLM1ftjYlaRSG5Xl/xdKMC8LH0bxpy3XXzLmDrYCP3LrhrIG8Xmuzsji6Hw
    TQIDAQAB
    -----END PUBLIC KEY-----
    iwhooge@iwhooge-mac ~ %
    

이미지

작업 2.4: 배스천 호스트 인증에 대한 로컬 SSH 키 생성

또한 Bastion 호스트로 인증하려면 로컬 SSH 키를 만들어야 합니다. 이 키는 OCI 콘솔(API) 인증을 위해 사용 중인 또 다른 키입니다.

  1. 다음 명령을 실행하여 디렉토리를 SSH 디렉토리로 변경합니다.

    iwhooge@iwhooge-mac ~ % cd ~/.ssh/
    
  2. 다음 명령을 실행하여 사용할 수 있는 공용 및 전용 SSH 키가 있는지 확인합니다.

    iwhooge@iwhooge-mac .ssh % ls -l -a
    
  3. SSH 키 쌍이 없습니다. 이 자습서에서는 새 SSH 키 쌍을 생성합니다.

    total 16
    drwx------   4 iwhooge  staff   128 Feb  8 12:48 .
    drwxr-x---+ 30 iwhooge  staff   960 Apr  4 11:03 ..
    -rw-------@  1 iwhooge  staff  2614 Feb 28 11:49 known_hosts
    -rw-------@  1 iwhooge  staff  1773 Feb  8 12:48 known_hosts.old
    
  4. 다음 명령을 실행하여 새 SSH 키 쌍을 생성합니다.

    iwhooge@iwhooge-mac .ssh % ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/Users/iwhooge/.ssh/id_rsa):
    
  5. 암호문을 비워 두고 ENTER를 누릅니다.

    Enter passphrase (empty for no passphrase):
    
  6. 암호문을 비워 두고 ENTER를 누릅니다.

    Enter same passphrase again:
    
  7. 새 SSH 키 쌍은 제공된 위치에 저장됩니다.

    Your identification has been saved in /Users/iwhooge/.ssh/id_rsa
    Your public key has been saved in /Users/iwhooge/.ssh/id_rsa.pub
    The key fingerprint is:
    SHA256:2E7jD5Cvt0C3pArp+u5Q3BWDBDwfbtxp5T6eez75DPc iwhooge@iwhooge-mac
    The key's randomart image is:
    +---[RSA 3072]----+
    | ..o..o          |
    |  o o  o.        |
    |   = o.+         |
    | . .=.++.        |
    |  o...=.S        |
    | . . . Xoo       |
    |. o   o.*o...    |
    | o . . o+o++ .   |
    |.== . ..o=ooo E  |
    +----[SHA256]-----+
    iwhooge@iwhooge-mac .ssh %
    

이미지

작업 2.5: OCI 콘솔에서 API 키 생성 및 OCI 계정에 공용 키 추가

작업 2.6: OCI 환경에 필요한 정보 수집

API를 사용하여 OCI 인증을 위해 Terraform 파일에 대한 일부 정보를 수집해야 합니다. 대부분의 정보는 작업 2.5에서 만든 API 인증 구성 파일에 이미 제공되어 있습니다.

Kubernetes 클러스터를 배치할 구획입니다.

작업 3: Terraform 스크립트 및 파일 생성

Terraform, RSA 및 SSH 키 설정, OCI 환경(API) 구성, OCI를 통한 Terraform 인증에 필요한 모든 필수 정보 수집 등 로컬 시스템에서의 준비를 완료했습니다. 이제 Terraform 스크립트를 생성합니다.

먼저 Kubernetes 클러스터를 배포하는 영역이 구독되어 있는지 확인해야 합니다. 구독되지 않은 지역에 배포하는 경우 인증 오류가 발생하고 배포가 실패합니다.

이 자습서에서는 암스테르담, 산호세, 두바이의 세 가지 배포 영역을 사용합니다.

작업 4: Terraform 및 OKE 클러스터를 필요한 리소스(VCN, 서브넷, DRG, RPC 등)와 함께 실행

올바른 매개변수를 사용하여 Terraform 스크립트를 작성했습니다. 이제 스크립트를 실행하고 세 개의 다른 리전에 세 개의 Kubernetes 클러스터로 구성된 환경을 구축하십시오.

다음 이미지는 배스천 호스트에 대한 SSH 접속을 설정하는 위치와 배스천 호스트에서 운영자 호스트로의 SSH 접속을 설정하는 위치를 보여줍니다.

이미지

이제 서로 다른 지역에 세 개의 Kubernetes 클러스터를 배포했습니다. OCI 콘솔의 상위 레벨에서 배치된 리소스를 살펴봅니다.

작업 5: RPC 연결 설정

다양한 RPC 연결 간의 연결을 설정합니다. 먼저 다른 지역에서 검토해 보겠습니다.

모든 RPC OCID 수집

모든 DRG의 모든 영역에서 모든 원격 피어링 연결에 대해 이 프로세스를 반복하고 저장합니다.

이제 다음과 같은 원격 피어링 접속 OCID를 수집했습니다.

RPC 피어링 만들기

C1에서 C2 및 C3로 피어링을 구성합니다. 그러면 C2 및 C3 측에서 C1에 대한 피어링이 자동으로 구성되고, C2에서 C3로 피어링을 구성하면 C3 측에서 C2에 대한 피어링이 자동으로 구성됩니다.

C1 피어링(암스테르담)을 구성합니다.

C2 피어링(San Jose) 구성.

작업 6: Network Visualizer를 사용하여 RPC 연결 확인

RPC가 Network Visualizer로 올바르게 구성되었는지 확인하려면 추가 검사를 수행합니다.

  1. 왼쪽 위에 있는 햄버거 메뉴를 누릅니다.
  2. 네트워킹을 누릅니다.
  3. 네트워크 시각화 프로그램을 누릅니다.

이미지

  1. 암스테르담 지역에 접속되어 있는지 확인합니다.
  2. 암스테르담 지역은 c1입니다.
  3. 암스테르담에서 산호세와 두바이까지의 연결을 확인하십시오.

이미지

  1. 산호세 영역에 접속되어 있는지 확인합니다.
  2. San Jose 지역은 c2입니다.
  3. 산호세(San Jose)에서 암스테르담(Amsterdam)과 두바이(Dubai)로의 연결에 주목하십시오.

이미지

  1. 두바이 지역에 연결되어 있는지 확인합니다.
  2. 두바이 지역은 c3입니다.
  3. 두바이에서 암스테르담과 산호세까지의 연결을 확인하십시오.

이미지

작업 7: 배스천 및 연산자를 사용하여 접속 작업 확인

Kubernetes 클러스터(세 개의 다른 영역 모두에서)를 생성하고 RPC를 사용하여 지역을 연결했습니다. 이제 운영자 호스트를 사용하여 운영자가 Kubernetes 클러스터를 관리할 수 있는지 확인할 수 있습니다.

  1. terraform plan 명령이 완료된 후 제공된 다음 명령을 실행합니다.

    Last login: Fri Apr  5 09:10:01 on ttys000
    iwhooge@iwhooge-mac ~ % ssh -o ProxyCommand='ssh -W %h:%p -i ~/.ssh/id_rsa opc@143.47.183.243' -i ~/.ssh/id_rsa opc@10.1.0.12
    Activate the web console with: systemctl enable --now cockpit.socket
    Last login: Fri Apr  5 07:34:13 2024 from 10.1.0.2
    [opc@o-tmcntm ~]$
    
  2. 다음 명령을 실행하면 각 Kubernetes 클러스터(c1, c2 및 c3)에서 for 루프를 사용하여 반복되고 워커 노드의 상태를 검색할 수 있습니다.

    [opc@o-tmcntm ~]$ for c in c1 c2 c3; do
    >   kubectx $c
    >   kubectl get nodes
    > done
    Switched to context "c1".
    NAME           STATUS   ROLES   AGE   VERSION
    10.1.113.144   Ready    node    76m   v1.28.2
    10.1.125.54    Ready    node    76m   v1.28.2
    Switched to context "c2".
    NAME          STATUS   ROLES   AGE   VERSION
    10.2.65.174   Ready    node    78m   v1.28.2
    10.2.98.54    Ready    node    78m   v1.28.2
    Switched to context "c3".
    NAME           STATUS   ROLES   AGE   VERSION
    10.3.118.212   Ready    node    73m   v1.28.2
    10.3.127.119   Ready    node    73m   v1.28.2
    [opc@o-tmcntm ~]$
    

    운영자 호스트에 연결한 후 터미널에서 다음 명령을 실행합니다.

    for c in c1 c2 c3; do
      kubectx $c
      kubectl get nodes
    done
    
  3. Terraform 스크립트를 사용하여 배치된 모든 Kubernetes 클러스터에 대한 모든 노드의 출력을 확인합니다.

이미지

for 루프를 사용하여 kubectl get all -n kube-system 명령을 실행합니다.

[opc@o-tmcntm ~]$ for c in c1 c2 c3; do
>   kubectx $c
>   kubectl get all -n kube-system
> done
Switched to context "c1".
NAME                                       READY   STATUS    RESTARTS       AGE
pod/coredns-844b4886f-8b4k6                1/1     Running   0              118m
pod/coredns-844b4886f-g8gbm                1/1     Running   0              122m
pod/csi-oci-node-5xzdg                     1/1     Running   0              119m
pod/csi-oci-node-nsdg4                     1/1     Running   1 (118m ago)   119m
pod/kube-dns-autoscaler-74f78468bf-l9644   1/1     Running   0              122m
pod/kube-flannel-ds-5hsp7                  1/1     Running   0              119m
pod/kube-flannel-ds-wk7xl                  1/1     Running   0              119m
pod/kube-proxy-gpvv2                       1/1     Running   0              119m
pod/kube-proxy-vgtf7                       1/1     Running   0              119m
pod/proxymux-client-nt59j                  1/1     Running   0              119m
pod/proxymux-client-slk9j                  1/1     Running   0              119m

NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.101.5.5   <none>        53/UDP,53/TCP,9153/TCP   122m

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                 AGE
daemonset.apps/csi-oci-node               2         2         2       2            2           <none>                                        122m
daemonset.apps/kube-flannel-ds            2         2         2       2            2           <none>                                        122m
daemonset.apps/kube-proxy                 2         2         2       2            2           beta.kubernetes.io/os=linux                   122m
daemonset.apps/node-termination-handler   0         0         0       0            0           oci.oraclecloud.com/oke-is-preemptible=true   122m
daemonset.apps/nvidia-gpu-device-plugin   0         0         0       0            0           <none>                                        122m
daemonset.apps/proxymux-client            2         2         2       2            2           node.info.ds_proxymux_client=true             122m

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns               2/2     2            2           122m
deployment.apps/kube-dns-autoscaler   1/1     1            1           122m

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-844b4886f                2         2         2       122m
replicaset.apps/kube-dns-autoscaler-74f78468bf   1         1         1       122m
Switched to context "c2".
NAME                                       READY   STATUS    RESTARTS       AGE
pod/coredns-84bd9cd884-4fqvr               1/1     Running   0              120m
pod/coredns-84bd9cd884-lmgz2               1/1     Running   0              124m
pod/csi-oci-node-4zl9l                     1/1     Running   0              122m
pod/csi-oci-node-xjzfd                     1/1     Running   1 (120m ago)   122m
pod/kube-dns-autoscaler-59575f8674-m6j2z   1/1     Running   0              124m
pod/kube-flannel-ds-llhhq                  1/1     Running   0              122m
pod/kube-flannel-ds-sm6fg                  1/1     Running   0              122m
pod/kube-proxy-7ppw8                       1/1     Running   0              122m
pod/kube-proxy-vqfgb                       1/1     Running   0              122m
pod/proxymux-client-cnkph                  1/1     Running   0              122m
pod/proxymux-client-k5k6n                  1/1     Running   0              122m

NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.102.5.5   <none>        53/UDP,53/TCP,9153/TCP   124m

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                 AGE
daemonset.apps/csi-oci-node               2         2         2       2            2           <none>                                        124m
daemonset.apps/kube-flannel-ds            2         2         2       2            2           <none>                                        124m
daemonset.apps/kube-proxy                 2         2         2       2            2           beta.kubernetes.io/os=linux                   124m
daemonset.apps/node-termination-handler   0         0         0       0            0           oci.oraclecloud.com/oke-is-preemptible=true   124m
daemonset.apps/nvidia-gpu-device-plugin   0         0         0       0            0           <none>                                        124m
daemonset.apps/proxymux-client            2         2         2       2            2           node.info.ds_proxymux_client=true             124m

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns               2/2     2            2           124m
deployment.apps/kube-dns-autoscaler   1/1     1            1           124m

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-84bd9cd884               2         2         2       124m
replicaset.apps/kube-dns-autoscaler-59575f8674   1         1         1       124m
Switched to context "c3".
NAME                                       READY   STATUS    RESTARTS   AGE
pod/coredns-56c7ffc89c-jt85k               1/1     Running   0          115m
pod/coredns-56c7ffc89c-lsqcg               1/1     Running   0          121m
pod/csi-oci-node-gfswn                     1/1     Running   0          116m
pod/csi-oci-node-xpwbp                     1/1     Running   0          116m
pod/kube-dns-autoscaler-6b69bf765c-fxjvc   1/1     Running   0          121m
pod/kube-flannel-ds-2sqbk                  1/1     Running   0          116m
pod/kube-flannel-ds-l7sdz                  1/1     Running   0          116m
pod/kube-proxy-4qcmb                       1/1     Running   0          116m
pod/kube-proxy-zcrk4                       1/1     Running   0          116m
pod/proxymux-client-4lgg7                  1/1     Running   0          116m
pod/proxymux-client-zbcrg                  1/1     Running   0          116m

NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.103.5.5   <none>        53/UDP,53/TCP,9153/TCP   121m

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                 AGE
daemonset.apps/csi-oci-node               2         2         2       2            2           <none>                                        122m
daemonset.apps/kube-flannel-ds            2         2         2       2            2           <none>                                        121m
daemonset.apps/kube-proxy                 2         2         2       2            2           beta.kubernetes.io/os=linux                   121m
daemonset.apps/node-termination-handler   0         0         0       0            0           oci.oraclecloud.com/oke-is-preemptible=true   121m
daemonset.apps/nvidia-gpu-device-plugin   0         0         0       0            0           <none>                                        122m
daemonset.apps/proxymux-client            2         2         2       2            2           node.info.ds_proxymux_client=true             122m

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns               2/2     2            2           121m
deployment.apps/kube-dns-autoscaler   1/1     1            1           121m

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-56c7ffc89c               2         2         2       121m
replicaset.apps/kube-dns-autoscaler-6b69bf765c   1         1         1       121m
[opc@o-tmcntm ~]$

작업 8: Terraform을 사용하여 OKE 클러스터 삭제

배포에 Terraform을 사용했기 때문에 Terraform을 사용하여 전체 배포를 삭제할 수도 있습니다.

확인

추가 학습 자원

docs.oracle.com/learn에서 다른 실습을 살펴보거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하십시오. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer가 되십시오.

제품 설명서는 Oracle Help Center를 참조하십시오.