TheKoguryo's 기술 블로그

 Version 2024.11.15

3.2 OKE 클러스터 만들기 - Self-Managed Nodes

사전 요구 사항 확인

Cluster 요구사항

  • Control Plane Nodes 버전: 1.25 이상
  • Enhanced Cluster
  • Flannel CNI 사용 할 것 (VCN-Native Pod Networking CNI는 지원하지 않음)

Image 요구사항

OKE 클러스터 준비하기

위 요구사항에 맞게 OKE 클러스터를 준비합니다. 아래 내용은 편의상 Quick Create 모드로 클러스터를 생성시의 과정을 설명하는 내용입니다.

  1. OCI 콘솔에 로그인합니다.

  2. 좌측 상단 햄버거 메뉴에서 Developer Services > Containers & Artifacts > Kubernetes Clusters (OKE)로 이동합니다.

  3. 클러스터 생성을 위해 Create Cluster 버튼을 클릭합니다.

  4. 빠른 클러스터 생성을 위해 기본선택된 Quick Create 모드를 이용하여 생성합니다.

  5. Name

    • 예) oke-cluster-self-managed
  6. Kubernetes API Endpoint

    • Public API로 접속할 수 있게 기본 선택된 Public Endpoint를 그대로 사용
  7. Kuberentes version

    • 1.25 이상 요구됩니다. 여기서는 v1.26.7을 선택합니다.
  8. Node type: Managed를 선택합니다.

  9. Node count: 기본값인 3을 그대로 사용합니다.

  10. Next를 클릭합니다.

  11. 기본 Network type: OCI_VCN_IP_NATIVE입니다. Flannel CNI로 변경할 필요가 있습니다. 변경을 위해 아래에 Save as stack을 클릭합니다.

  12. 저장하면, Resource Manager의 Stack으로 저장됩니다.

    image-20240114204422171

  13. 저장후 클러스터 생성은 Cancel 합니다.

  14. 좌측 상단 햄버거 메뉴에서 Developer Services > Resource Manager > Stacks로 이동합니다.

  15. 저장한 Stack을 클릭합니다.

  16. Edit 아래 Edit Terrafrom configuration in code editor를 클릭합니다.

    image-20240114205242450

  17. Stack 아래에 main.tf 파일을 더블클릭합니다.

  18. CNI 설정을 OCI_VCN_IP_NATIVE에서 FLANNEL_OVERLAY로 변경합니다.

    • 수정전

      ...	
      	cluster_pod_network_options {
      		cni_type = "OCI_VCN_IP_NATIVE"
      	}
      ...	
      		node_pool_pod_network_option_details {
      			cni_type = "OCI_VCN_IP_NATIVE"
      		}
      ...		
      
    • 수정후

      ...	
      	cluster_pod_network_options {
      		cni_type = "FLANNEL_OVERLAY"
      	}
      ...	
      		node_pool_pod_network_option_details {
      			cni_type = "FLANNEL_OVERLAY"
      		}
      ...		
      
  19. Stack을 우클릭한 변경사항을 저장하고 Stack Plan을 실행합니다.

    image-20240114211313758

  20. 클라우드 콘솔에서 Stacks로 다시 이동합니다.

  21. Plan이 잘 실행된 것을 확인하고, Apply를 클릭하여 변경된 정보로 OKE 클러스터를 생성합니다.

    image-20240114212002839

  22. Apply가 완료된 것을 확인합니다.

    image-20240114213129838

  23. 요구사항에 맞는 클러스터가 준비되었습니다.

    image-20240114213748749

Self-Managed 노드를 위한 OCI IAM Dynamic Group 및 Policy 만들기

생성한 노드가 OKE 클러스터에 조인할 수 있도록 권한을 추가하는 과정입니다.

  1. Self-Managed 노드로 추가할 Compute 인스턴스를 포함하는 Dynamic Group을 만듭니다.

    • Name: 예, oke-self-managed-node-dyn-grp
    ALL {instance.compartment.id = '<compartment-ocid>'}
    
  2. 생성한 Dynamic Group을 위한 Policy를 만듭니다.

    • Name: 예, oke-self-managed-node-policy
    Allow dynamic-group oke-self-managed-node-dyn-grp to {CLUSTER_JOIN} in compartment <compartment-name>
    
    • 더 조건을 제한하기 위해서는 where 조건에 조인하려는 클러스터를 명시합니다.
    Allow dynamic-group oke-self-managed-node-dyn-grp to {CLUSTER_JOIN} in compartment <compartment-name>
    where target.cluster.id = '<cluster-ocid>'
    
Self-Managed 노드를 위한 cloud-init 스크립트 준비하기
  1. Kubernetes API private endpoint 준비

    클러스터 상세 정보에서 해당정보를 확인합니다. 단 이후 사용할 시에는 포트넘버 없이 사용합니다. 예, 10.0.0.13

    image-20240114220001890

  2. base64-encoded CA certificate 얻기

    • 아래 명령으로 확인합니다.

      oci ce cluster create-kubeconfig --cluster-id <cluster-ocid> --region <region-identifier> --file - | grep -oE "LS0t.*"
      
      • 예시

        $ oci ce cluster create-kubeconfig --cluster-id ocid1.cluster.oc1.ap-chuncheon-1.aaaaaaaa67cdjzuxf5j2s6yhdvtft6vrrfievmdx65xyqx3hncut2lfsgbja --region ap-chuncheon-1 --file - | grep -oE "LS0t.*"
        LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURpRENDQW5DZ0F3SUJBZ0lRSi9VMGN0RHpkVmN2M2hjSms......0tLS0tCg==
        
  3. 다음과 같이 cloud-init 스크립트를 준비합니다.

    #!/usr/bin/env bash
    bash /etc/oke/oke-install.sh \
      --apiserver-endpoint "<cluster-endpoint>" \
      --kubelet-ca-cert "<base64-encoded-certificate>"
    
    • 예시

      #!/usr/bin/env bash
      bash /etc/oke/oke-install.sh \
        --apiserver-endpoint "10.0.0.13" \
        --kubelet-ca-cert "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURpRENDQW5DZ0F3SUJBZ0lRSi9VMGN0RHpkVmN2M2hjSms......0tLS0tCg=="
      
Self-Managed 노드 만들기
  1. 아래 링크를 클릭하여, 사용할 Image의 OCID를 확인합니다.

  2. 좌측 상단 햄버거 메뉴에서 Compute > Compute > Instances로 이동합니다.

  3. 컴퓨트 인스턴스를 생성합니다.

    • Name: 예, instance-self-managed

    • Image:

      • Change image를 클릭합니다.
      • My images > Image OCID를 선택후 복사해둔 Image OCID를 입력합니다.

      image-20240114222938334

    • Primary VNIC information

      • OKE Worker Nodes가 위치한 VCN과 Subnet을 선택합니다.
    • Add SSH keys

      • 컴퓨트 인스턴스 접속시 사용할 SSH Key의 Public Key를 입력합니다.
    • 제일 아래 Show advanced options를 클릭

      • Management > Paste cloud-init script에 앞서 준비한 cloud-init 스크립트를 입력합니다.

        image-20240114234934823

  4. 필요한 추가 설정을 하고 컴퓨트 인스턴스를 생성합니다.

OKE Serverless 클러스터 연결하기
  1. 연결하는 방법은 기존 OKE 클러스터를 연결하는 방법과 동일합니다.

  2. 생성한 OKE 클러스터 상세 페이지로 이동하여, Access Cluster를 클릭합니다. 가이드에 따라 사용환경에서 클러스터에 연결합니다.

  3. 노드 정보를 조회해 봅니다.

    • 인스턴스 생성후 몇 분후에 클러스터에 조인된 것을 확인할 수 있습니다.

      $ kubectl get nodes
      NAME          STATUS     ROLES    AGE    VERSION
      10.0.10.106   Ready      node     100m   v1.26.7
      10.0.10.211   Ready      node     100m   v1.26.7
      10.0.10.229   NotReady   <none>   82s    v1.26.7
      10.0.10.242   Ready      node     100m   v1.26.7
      $ kubectl get nodes
      NAME          STATUS   ROLES    AGE    VERSION
      10.0.10.106   Ready    node     100m   v1.26.7
      10.0.10.211   Ready    node     100m   v1.26.7
      10.0.10.229   Ready    <none>   114s   v1.26.7
      10.0.10.242   Ready    node     100m   v1.26.7
      
    • 해당 노드를 조회해 봅니다.

      $ kubectl describe node 10.0.10.229
      Events:
        Type    Reason                   Age    From                   Message
        ----    ------                   ----   ----                   -------
        Normal  Starting                 7m52s  kube-proxy             
        Normal  Starting                 9m41s  kubelet                Starting kubelet.
        Normal  NodeHasSufficientMemory  9m41s  kubelet                Node 10.0.10.229 status is now: NodeHasSufficientMemory
        Normal  NodeHasNoDiskPressure    9m41s  kubelet                Node 10.0.10.229 status is now: NodeHasNoDiskPressure
        Normal  NodeHasSufficientPID     9m41s  kubelet                Node 10.0.10.229 status is now: NodeHasSufficientPID
        Normal  Synced                   9m40s  cloud-node-controller  Node synced successfully
        Normal  RegisteredNode           9m38s  node-controller        Node 10.0.10.229 event: Registered Node 10.0.10.229 in Controller
        Normal  NodeAllocatableEnforced  9m38s  kubelet                Updated Node Allocatable limit across pods
        Normal  NodeReady                7m55s  kubelet                Node 10.0.10.229 status is now: NodeReady
      
    • 노드의 레이블을 조회해 봅니다.

      $ kubectl get node 10.0.10.229 -o json | jq '.metadata.labels'
      {
        ...
        "displayName": "instance-self-managed",
        ...
        "oci.oraclecloud.com/node.info.byon": "true",
        ...
      }
      
    • BYON(Bring Your Own Nodes) 레이블을 조회해 봅니다.

      $ kubectl get nodes -L oci.oraclecloud.com/node.info.byon
      NAME          STATUS   ROLES    AGE    VERSION   NODE.INFO.BYON
      10.0.10.106   Ready    node     154m   v1.26.7   
      10.0.10.211   Ready    node     154m   v1.26.7   
      10.0.10.229   Ready    <none>   55m    v1.26.7   true
      10.0.10.242   Ready    node     154m   v1.26.7
      
  4. Self-Managed 노드 클러스터에 조인되었습니다. 쿠버네티스 배포 자원에 대한 제약은 따로 없으니, Managed Nodes와 동일하게, 배포하여 사용하면 됩니다.

참고


이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.

Last updated on 22 May 2023