3.2 OKE 클러스터 만들기 - Self-Managed Nodes
사전 요구 사항 확인
Cluster 요구사항
- Control Plane Nodes 버전: 1.25 이상
- Enhanced Cluster
- Flannel CNI 사용 할 것 (VCN-Native Pod Networking CNI는 지원하지 않음)
Image 요구사항
- 2023년 3월 28일 이후 릴리즈된 아래 이미지 중 사용
OKE 클러스터 준비하기
위 요구사항에 맞게 OKE 클러스터를 준비합니다. 아래 내용은 편의상 Quick Create 모드로 클러스터를 생성시의 과정을 설명하는 내용입니다.
-
OCI 콘솔에 로그인합니다.
-
좌측 상단 햄버거 메뉴에서 Developer Services > Containers & Artifacts > Kubernetes Clusters (OKE)로 이동합니다.
-
클러스터 생성을 위해 Create Cluster 버튼을 클릭합니다.
-
빠른 클러스터 생성을 위해 기본선택된 Quick Create 모드를 이용하여 생성합니다.
-
Name
- 예) oke-cluster-self-managed
-
Kubernetes API Endpoint
- Public API로 접속할 수 있게 기본 선택된 Public Endpoint를 그대로 사용
-
Kuberentes version
- 1.25 이상 요구됩니다. 여기서는 v1.26.7을 선택합니다.
-
Node type: Managed를 선택합니다.
-
Node count: 기본값인 3을 그대로 사용합니다.
-
Next를 클릭합니다.
-
기본 Network type: OCI_VCN_IP_NATIVE입니다. Flannel CNI로 변경할 필요가 있습니다. 변경을 위해 아래에 Save as stack을 클릭합니다.
-
저장하면, Resource Manager의 Stack으로 저장됩니다.
-
저장후 클러스터 생성은 Cancel 합니다.
-
좌측 상단 햄버거 메뉴에서 Developer Services > Resource Manager > Stacks로 이동합니다.
-
저장한 Stack을 클릭합니다.
-
Edit 아래 Edit Terrafrom configuration in code editor를 클릭합니다.
-
Stack 아래에 main.tf 파일을 더블클릭합니다.
-
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" } ...
-
-
Stack을 우클릭한 변경사항을 저장하고 Stack Plan을 실행합니다.
-
클라우드 콘솔에서 Stacks로 다시 이동합니다.
-
Plan이 잘 실행된 것을 확인하고, Apply를 클릭하여 변경된 정보로 OKE 클러스터를 생성합니다.
-
Apply가 완료된 것을 확인합니다.
-
요구사항에 맞는 클러스터가 준비되었습니다.
Self-Managed 노드를 위한 OCI IAM Dynamic Group 및 Policy 만들기
생성한 노드가 OKE 클러스터에 조인할 수 있도록 권한을 추가하는 과정입니다.
- OCI Documentation > Container Engine > Creating a Dynamic Group and a Policy for Self-Managed Nodes
-
Self-Managed 노드로 추가할 Compute 인스턴스를 포함하는 Dynamic Group을 만듭니다.
- Name: 예,
oke-self-managed-node-dyn-grp
ALL {instance.compartment.id = '<compartment-ocid>'}
- Name: 예,
-
생성한 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>'
- Name: 예,
Self-Managed 노드를 위한 cloud-init 스크립트 준비하기
-
Kubernetes API private endpoint 준비
클러스터 상세 정보에서 해당정보를 확인합니다. 단 이후 사용할 시에는 포트넘버 없이 사용합니다. 예,
10.0.0.13
-
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==
-
-
-
다음과 같이 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 노드 만들기
-
아래 링크를 클릭하여, 사용할 Image의 OCID를 확인합니다.
-
2023년 3월 28일 이후 릴리즈된 아래 이미지 중 사용
-
예시
-
쿠버네티스 버전, CPU 유형에 맞게 Image를 선택하고, Read more를 클릭합니다.
-
사용할 리전의 Image OCID를 복사해 둡니다.
-
-
-
좌측 상단 햄버거 메뉴에서 Compute > Compute > Instances로 이동합니다.
-
컴퓨트 인스턴스를 생성합니다.
-
Name: 예,
instance-self-managed
-
Image:
- Change image를 클릭합니다.
- My images > Image OCID를 선택후 복사해둔 Image OCID를 입력합니다.
-
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 스크립트를 입력합니다.
-
-
-
필요한 추가 설정을 하고 컴퓨트 인스턴스를 생성합니다.
OKE Serverless 클러스터 연결하기
-
연결하는 방법은 기존 OKE 클러스터를 연결하는 방법과 동일합니다.
-
생성한 OKE 클러스터 상세 페이지로 이동하여, Access Cluster를 클릭합니다. 가이드에 따라 사용환경에서 클러스터에 연결합니다.
-
노드 정보를 조회해 봅니다.
-
인스턴스 생성후 몇 분후에 클러스터에 조인된 것을 확인할 수 있습니다.
$ 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
-
-
Self-Managed 노드 클러스터에 조인되었습니다. 쿠버네티스 배포 자원에 대한 제약은 따로 없으니, Managed Nodes와 동일하게, 배포하여 사용하면 됩니다.
참고
이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.