주:
- 이 자습서에서는 Oracle Cloud에 액세스해야 합니다. 무료 계정에 등록하려면 Oracle Cloud Infrastructure Free Tier 시작하기를 참조하십시오.
- Oracle Cloud Infrastructure 자격 증명, 테넌시 및 구획에 예제 값을 사용합니다. 실습을 완료했으면 이러한 값을 자신의 클라우드 환경과 관련된 값으로 대체하십시오.
Oracle Cloud Infrastructure Kubernetes Engine을 사용하여 Terraform으로 Kubernetes 클러스터 배포
소개
Oracle Cloud Infrastructure Kubernetes Engine(OCI Kubernetes Engine 또는 OKE)에서 Terraform을 사용하여 Kubernetes를 배포하면 클라우드에서 컨테이너화된 애플리케이션을 관리하는 간소화되고 확장 가능한 접근 방식이 제공됩니다. Oracle Cloud Infrastructure 관리형 Kubernetes 서비스인 OKE는 Kubernetes 클러스터의 배포, 관리 및 확장을 간소화합니다.
코드형 인프라(IaC) 도구인 Terraform을 사용하면 OKE 클러스터의 프로비저닝 및 구성을 자동화하여 일관성과 효율성을 보장할 수 있습니다. 이 조합을 통해 반복 가능한 배포, 인프라 버전 지정 및 간편한 업데이트를 수행할 수 있으므로, Oracle Cloud Infrastructure 에코시스템을 활용하려는 클라우드 네이티브 및 DevOps 중심 팀에 이상적입니다.
이 사용지침서에서는 Terraform을 사용하여 OCI OKE에 매우 구체적인 Kubernetes 아키텍처를 배포하려고 합니다.
다음 구성요소를 배치하려고 합니다.
- 인터넷 게이트웨이
- NAT 게이트웨이
- 서비스 게이트웨이
- 7 x 서브넷(전용 및 공용)
- 노드 풀 2개
- 4 x 작업자 노드(인스턴스)
- 배스천(인스턴스)
- 연산자(인스턴스)
목표
- OKE를 사용하여 Terraform을 사용하여 Kubernetes 클러스터를 배치합니다.
필요 조건
- Terraform을 사용하여 OCI에 객체를 배포하려면 먼저 Terraform 스크립트를 인증하고 실행하기 위한 환경을 준비해야 합니다. 자세한 내용은 작업 2: 인증을 위한 환경 준비 및 Terraform 스크립트 실행을 참조하십시오.
작업 1: Terraform 스크립트를 사용하여 저장소 복제
-
terraform-oci-oke
저장소를 terraform-oci-oke에서 복제합니다.- 이 튜토리얼을 작성할 때 최신 버전은
5.1.8
입니다. - 전체 저장소를 사용하여 전체 zip 파일을 다운로드하거나
git clone
명령을 사용하여 저장소를 복제할 수 있습니다. - 5.1.8 분기에 액세스하려면 버전을 누릅니다.
- 5.1.8 분기에 있습니다.
- docs 폴더를 누릅니다.
- 이 튜토리얼을 작성할 때 최신 버전은
-
src 폴더를 누릅니다.
-
SUMMARY.md 파일을 누릅니다.
-
Getting Started를 누릅니다.
- 아직 5.1.8 브랜치에 있으며, 코드 버전에 따라 다른 유형의 설명서 단계가 다른 브랜치에 포함될 수 있습니다.
- 시작하기 페이지에 있으며 이 페이지는 제목에 표시되는 내용을 정확히 수행합니다.
다음 출력에서는 시작하기 페이지를 사용하여 이 자습서를 생성하는 방법을 볼 수 있습니다.
-
git clone
명령을 실행하여 저장소를 복제합니다.iwhooge@iwhooge-mac ~ % git clone https://github.com/oracle-terraform-modules/terraform-oci-oke.git tfoke
-
다음 명령을 실행하여 폴더를 저장소 폴더로 변경합니다.
-
다음 명령을 실행하여 폴더 내용을 나열합니다.
-
Repository의 모든 파일을 볼 수 있습니다.
-
다음 내용으로 이 디렉토리 내에
providers.tf
파일을 생성합니다.providers.tf
:provider "oci" { fingerprint = var.api_fingerprint private_key_path = var.api_private_key_path region = var.region tenancy_ocid = var.tenancy_id user_ocid = var.user_id } provider "oci" { fingerprint = var.api_fingerprint private_key_path = var.api_private_key_path region = var.home_region tenancy_ocid = var.tenancy_id user_ocid = var.user_id alias = "home" }
- 다음 명령을 실행하여 폴더 내용을 나열합니다.
providers.tf
파일이 생성됩니다.
-
다음 명령을 실행하여 Terraform을 초기화하고 필요한 모듈을 업그레이드합니다.
iwhooge@iwhooge-mac tfoke % terraform init --upgrade
-
Terraform has been successfully Initialized 메시지가 표시됩니다.
-
terraform.tfvars
파일을 생성하려면 다음 정보를 사용할 수 있는지 확인하십시오. 이 정보는 작업 2: 인증을 위한 환경 준비 및 Terraform 스크립트 실행 단계에 설명된 대로 검색할 수 있습니다.테넌시 OCID ocid1.tenancy.oc1..aaaaaaaaXXX 사용자 OCID ocid1.user.oc1..aaaaaaaaXXX 지문 30:XXX 영역 me-abudhabi-1 프라이빗 키 경로 ~/.oci/4-4-2023-rsa-key.pem 컴파트먼트 OCID ocid1.compartment.oc1..aaaaaaaaXXX -
다음 내용으로 이 디렉토리 내에
terraform.tfvars
파일을 생성해야 합니다.terraform.tfvars
:# Identity and access parameters api_fingerprint = "30:XXX" api_private_key_path = "~/.oci/4-4-2023-rsa-key.pem" home_region = "me-abudhabi-1" region = "me-abudhabi-1" tenancy_id = "ocid1.tenancy.oc1..aaaaaaaaXXX" user_id = "ocid1.user.oc1..aaaaaaaaXXX" # general oci parameters compartment_id = "ocid1.compartment.oc1..aaaaaaaaXXX" timezone = "Australia/Sydney" # ssh keys ssh_private_key_path = "~/.ssh/id_rsa" ssh_public_key_path = "~/.ssh/id_rsa.pub" # networking create_vcn = true assign_dns = true lockdown_default_seclist = true vcn_cidrs = ["10.0.0.0/16"] vcn_dns_label = "oke" vcn_name = "oke" # Subnets subnets = { bastion = { newbits = 13, netnum = 0, dns_label = "bastion", create="always" } operator = { newbits = 13, netnum = 1, dns_label = "operator", create="always" } cp = { newbits = 13, netnum = 2, dns_label = "cp", create="always" } int_lb = { newbits = 11, netnum = 16, dns_label = "ilb", create="always" } pub_lb = { newbits = 11, netnum = 17, dns_label = "plb", create="always" } workers = { newbits = 2, netnum = 1, dns_label = "workers", create="always" } pods = { newbits = 2, netnum = 2, dns_label = "pods", create="always" } } # bastion create_bastion = true bastion_allowed_cidrs = ["0.0.0.0/0"] bastion_user = "opc" # operator create_operator = true operator_install_k9s = true # iam create_iam_operator_policy = "always" create_iam_resources = true create_iam_tag_namespace = false // true/*false create_iam_defined_tags = false // true/*false tag_namespace = "oke" use_defined_tags = false // true/*false # cluster create_cluster = true cluster_name = "oke" cni_type = "flannel" kubernetes_version = "v1.29.1" pods_cidr = "10.244.0.0/16" services_cidr = "10.96.0.0/16" # Worker pool defaults worker_pool_size = 0 worker_pool_mode = "node-pool" # Worker defaults await_node_readiness = "none" worker_pools = { np1 = { shape = "VM.Standard.E4.Flex", ocpus = 2, memory = 32, size = 1, boot_volume_size = 50, kubernetes_version = "v1.29.1" } np2 = { shape = "VM.Standard.E4.Flex", ocpus = 2, memory = 32, size = 3, boot_volume_size = 150, kubernetes_version = "v1.30.1" } } # Security allow_node_port_access = false allow_worker_internet_access = true allow_worker_ssh_access = true control_plane_allowed_cidrs = ["0.0.0.0/0"] control_plane_is_public = false load_balancers = "both" preferred_load_balancer = "public"
- 다음 명령을 실행하여 폴더 내용을 나열합니다.
terraform.tfvars
파일이 생성됩니다.
작업 2: Terraform 적용 실행 및 필요한 리소스(VCN, 서브넷 등)를 사용하여 OKE 클러스터 1개 생성
-
다음 명령을 실행하여 Terraform을 사용하여 OKE에서 Kubernetes 클러스터 배치를 계획합니다.
iwhooge@iwhooge-mac tfoke % terraform plan
- 이 Terraform 코드는 77개의 객체를 배포합니다.
terraform apply
명령을 실행합니다.
-
다음 명령을 실행하여 Terraform을 사용하여 OKE에서 Kubernetes 클러스터 배치를 적용합니다.
iwhooge@iwhooge-mac tfoke % terraform apply
- 이 Terraform 코드는 77개의 객체를 배포합니다.
yes
를 입력하여 배치를 계속합니다.
배치가 완료되면 적용이 완료되었다는 메시지가 표시됩니다.
-
참조에 필요한 유용한 정보와 함께 제공된 출력을 확인합니다.
출력:
apiserver_private_host = "10.0.0.22" availability_domains = tomap({ "1" = "cAtJ:ME-ABUDHABI-1-AD-1" }) bastion_id = "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkxxxxxx5chephxjadkxqa2ekxksb5gokj4q" bastion_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaxxxxxxxxxxxy5qm22odw7by37h77ki6cosoqd7pzwq" bastion_public_ip = "129.151.149.237" bastion_subnet_cidr = "10.0.0.0/29" bastion_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaxxxxxxxxxxxxxxxxmyzp6f2czibfr6534evfkt7m2a" cluster_endpoints = tomap({ "kubernetes" = "" "private_endpoint" = "10.0.0.22:6443" "public_endpoint" = "" "vcn_hostname_endpoint" = "cbyedhyevbq.cp.oke.oraclevcn.com:6443" }) cluster_id = "ocid1.cluster.oc1.me-abudhabi-1.aaaaaaaxxxxxxxxxxxxx57gz5q26hmpzkbcbyedhyevbq" control_plane_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaaaavxvgoewcgxxxxxxxxxxxxx6psycdz6zz5gaf6re4kcxa" control_plane_subnet_cidr = "10.0.0.16/29" control_plane_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaajvvpdmuixxxxxxxxxxxjkpx77hqu3v2s4qilnp56a" dynamic_group_ids = tolist([ "ocid1.dynamicgroup.oc1..aaaaaaaafsikvwgexxxxxxxxx5tx2u4c2s2eic4sslwyabva", ]) ig_route_table_id = "ocid1.routetable.oc1.me-abudhabi-1.aaaaaaaalxxxxxxxxxxxxxxcyzrl2af4ihrkhcjttu2w7aq" int_lb_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaaaanwppaafc7fyiwcoyhjxxxxxxxxxxxxxxxxx6a6752l7547gxg7ea" int_lb_subnet_cidr = "10.0.2.0/27" int_lb_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaawo5xmcwwbzk3gxxxxxxxxxxxxxxxxxxjjfllbvsdauaq" lpg_all_attributes = {} nat_route_table_id = "ocid1.routetable.oc1.me-abudhabi-1.aaaaaaaapqn3uqtszdcxxxxxxxxxxxxxxxxxliwveow232xgffigq" operator_id = "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkbrwsac5exxxxxxxxxxxxxxxxxxxxxxxrfdxsjdfzmq56jja" operator_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaaaao5kh3z3eaf4zhbtxixxxxxxxxxxxxxxxxxxxxxevyds3cbrjqzthv5ja" operator_private_ip = "10.0.0.14" operator_subnet_cidr = "10.0.0.8/29" operator_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaa6vnirazbox2edmtnxrzhxxxxxxxxxxxxxxxxxxxishk7556iw6zyq" pod_subnet_cidr = "10.0.128.0/18" pod_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaasfnwg3lnyphk5h275r46ksi3xxxxxxxxxxxxxxxxxxxxxxxqz25iwkcinxa" policy_statements = tolist([ "Allow dynamic-group oke-operator-lccwyk to MANAGE clusters in compartment id ocid1.compartment.oc1..aaaaaaaa323ijv54zwkwbz2hhr2nnqoywlpxxxxxxxxxxxxxxxxxxxxxxxtecokaq4h4a", ]) pub_lb_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaaaae5stez5u26g6x75dy5nf72mfcixxxxxxxxxxxxxxxxxxxxxxxx2nwkwv5nkaa" pub_lb_subnet_cidr = "10.0.2.32/27" pub_lb_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaagr5j2l6tu3rmroejg6t4nrixxxxxxxxxx6oar6xcirvq" ssh_to_bastion = "ssh -i ~/.ssh/id_rsa opc@129.xxx.xxx.xxx" ssh_to_operator = "ssh -o ProxyCommand='ssh -W %h:%p -i ~/.ssh/id_rsa opc@129.xxx.xxx.xxx' -i ~/.ssh/id_rsa opc@10.0.0.14" state_id = "lccwyk" vcn_id = "ocid1.vcn.oc1.me-abudhabi-1.amaaaaaapkbrwsaatndqrw3xq7e7krqfxxxxxxxxxxxxxxxpywz4qvhida" worker_nsg_id = "ocid1.networksecuritygroup.oc1.me-abudhabi-1.aaaaaaaazbpfavygiv4xy3khfi7cxunixxxxxxxxxxxxxxxxjvsm6jqtja" worker_pool_ids = { "np1" = "ocid1.nodepool.oc1.me-abudhabi-1.aaaaaaaauo57ekyoiiaif25gq7uwrpxxxxxxxxxxxxxxpsnygeam7t2wa" "np2" = "ocid1.nodepool.oc1.me-abudhabi-1.aaaaaaaa7423cp6zyntxwxokol3kmdxxxxxxxxxxxxx3wnayv2xq6nyq" } worker_pool_ips = { "np1" = { "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkbrwsac3t3smjsyxjgen4zqjpxxxxxxxxxxxxx663igu7cznla" = "10.0.90.37" } "np2" = { "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkbrwsac2eayropnzgazrxxxxxxxxxxxxxxxxpiykrq4r5pbga" = "10.0.125.238" "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkbrwsace4aup47ukjcedxxxxxxxxxxxxxxxxxx2hdxbsyiitva" = "10.0.92.136" "ocid1.instance.oc1.me-abudhabi-1.anqxkljrpkbrwsacojjri4b7qsaxxxxxxxxxxxxxxxxxnarf75ejv7a2a" = "10.0.111.157" } } worker_subnet_cidr = "10.0.64.0/18" worker_subnet_id = "ocid1.subnet.oc1.me-abudhabi-1.aaaaaaaarrnazbrmwbiyl3ljmdxhgmxxxxxxxxxxxxxxxxxxxv3wtgmiucnsa" iwhooge@iwhooge-mac tfoke %
작업 3: OCI 콘솔에서 Terraform 배치 확인
OCI 콘솔로 이동하여 다음 Terraform 배치를 확인합니다.
-
OCI Kubernetes 엔진 클러스터
-
OCI 콘솔로 이동합니다.
- 개발자 서비스로 이동하고 Kubernetes 클러스터(OKE)를 누릅니다.
- 작업 2에서 생성된 oke Kubernetes 클러스터를 누릅니다.
-
아래로.
- 노드 풀을 누릅니다.
- np1 노드 풀을 누릅니다.
-
아래로.
-
np1 노드 풀에는 워커 노드가 하나 있습니다.
-
이전 페이지로 이동하여 np2 노드 풀을 누릅니다.
-
아래로.
-
np2 노드 풀에는 세 개의 워커 노드가 있습니다.
-
-
인스턴스
-
OCI 콘솔로 이동합니다.
- Compute로 이동하고 Instances를 누릅니다.
- Kubernetes 클러스터의 4개 작업자 노드를 검토합니다.
- Kubernetes 클러스터의 운영자를 검토합니다.
- Kubernetes 클러스터의 bastion 호스트를 검토합니다.
-
-
가상 클라우드 네트워크
-
OCI 콘솔로 이동하여 네트워킹, 가상 클라우드 네트워크로 이동하고 연결 VCN을 누릅니다.
-
서브넷을 누르면 Kubernetes 클러스터의 7개 서브넷이 모두 표시됩니다.
-
다음 이미지는 Terraform 스크립트를 사용하여 지금까지 생성한 항목을 보여줍니다.
-
작업 4: 배스천 및 연산자를 사용하여 접속 확인
출력 결과에는 Terraform 배포가 완료되면 Kubernetes 환경에 연결하는 몇 가지 명령이 표시됩니다.
-
다음 명령을 실행하여 배스천 호스트에 연결합니다.
ssh_to_bastion = "ssh -i ~/.ssh/id_rsa opc@129.xxx.xxx.xxx"
-
다음 명령을 실행하여 배스천 호스트를 통해 Kubernetes 연산자에 접속합니다.
ssh_to_operator = "ssh -o ProxyCommand='ssh -W %h:%p -i ~/.ssh/id_rsa opc@129.xxx.xxx.xxx' -i ~/.ssh/id_rsa opc@10.0.0.14"
-
운영자로부터 Kubernetes 클러스터를 관리할 것입니다. yes를 두 번 입력하고
kubectl get nodes
명령을 실행하여 Kubernetes Worker 노드를 가져옵니다. -
SSH 접속 측면에서 쉽게 만들려면
~/.ssh/config
파일에 다음 추가 명령을 추가합니다.Host bastion47 HostName 129.xxx.xxx.xxx user opc IdentityFile ~/.ssh/id_rsa UserKnownHostsFile /dev/null StrictHostKeyChecking=no TCPKeepAlive=yes ServerAliveInterval=50 Host operator47 HostName 10.0.0.14 user opc IdentityFile ~/.ssh/id_rsa ProxyJump bastion47 UserKnownHostsFile /dev/null StrictHostKeyChecking=no TCPKeepAlive=yes ServerAliveInterval=50
다음 내용을
~/.ssh/config
파일에 추가한 후 SSH 명령에서 간단한 이름을 사용할 수 있습니다.iwhooge@iwhooge-mac tfoke % ssh operator47
작업 5: Terraform을 사용하여 Kubernetes 클러스터 삭제
-
terraform destroy
명령을 실행하여 OKE에서 Kubernetes 클러스터를 삭제합니다.iwhooge@iwhooge-mac tfoke % terraform destroy
-
yes를 입력합니다.
삭제 프로세스가 완료되면 삭제가 완료되었다는 메시지가 표시됩니다.
다음 단계
Terraform을 사용하여 OCI Kubernetes Engine에 Kubernetes 클러스터를 배포하면 클라우드에서 컨테이너화된 애플리케이션을 관리할 수 있는 효율적이고 자동화되며 확장 가능한 솔루션을 제공합니다.
Terraform의 IaC 기능을 활용하여 Kubernetes 클러스터가 일관되게 배포되고 시간이 지남에 따라 쉽게 유지 관리 또는 업데이트할 수 있도록 보장합니다.
이 통합은 프로세스를 간소화하여 더 나은 버전 관리, 자동화된 확장 및 반복 가능한 인프라 설정을 가능하게 합니다. 단일 클러스터를 관리하든 환경 전반에 걸쳐 확장하든, 이 접근 방식은 팀이 Oracle Cloud Infrastructure에서 안정성과 용이성을 갖춘 Kubernetes 워크로드를 관리할 수 있도록 지원합니다.
확인
- 작성자 - Iwan Hoogendoorn(OCI 네트워크 전문가)
추가 학습 자원
docs.oracle.com/learn에서 다른 실습을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하세요. 또한 Oracle Learning Explorer가 되려면 education.oracle.com/learning-explorer을 방문하십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Deploy a Kubernetes Cluster with Terraform using Oracle Cloud Infrastructure Kubernetes Engine
G18105-01
October 2024