注意:
- 本教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure 免费套餐。
- 它对 Oracle Cloud Infrastructure 身份证明、租户和区间使用示例值。完成实验室后,请使用特定于云环境的那些值替换这些值。
使用 Oracle Cloud Infrastructure Kubernetes Engine 使用 Terraform 部署 Kubernetes 集群
简介
在 Oracle Cloud Infrastructure Kubernetes Engine(OCI Kubernetes Engine 或 OKE)上使用 Terraform 部署 Kubernetes 提供了一种简化的可扩展方法来管理云端容器化应用。OKE 是 Oracle Cloud Infrastructure 托管的 Kubernetes 服务,可简化 Kubernetes 集群的部署、管理和扩展。
通过使用基础设施即代码 (IaC) 工具 Terraform,您可以自动预配和配置 OKE 集群,从而确保一致性和效率。此组合支持可重复部署、基础设施版本控制和轻松更新,非常适合希望利用 Oracle Cloud Infrastructure 生态系统的云原生团队和 DevOps 团队。
在本教程中,我们将使用 Terraform 在 OCI OKE 上部署一个非常具体的 Kubernetes 架构。
我们将部署以下组件:
- Internet 网关
- NAT 网关
- 服务网关
- 7 个子网(专用和公共)
- 2 个节点池
- 4 个 Worker 节点(实例)
- 堡垒(实例)
- 运算符(实例)
目标
- 使用 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 文件。
-
单击开始。
- 请注意,您仍位于 5.1.8 分支中,其他分支可能包含不同类型的文档步骤,具体取决于代码版本。
- 请注意,您位于入门页上,此页将完全按照标题所述执行操作。
在以下输出中,您可以看到如何使用入门页创建本教程。
-
运行
git clone
命令以克隆系统信息库。iwhooge@iwhooge-mac ~ % git clone https://github.com/oracle-terraform-modules/terraform-oci-oke.git tfoke
-
运行以下命令将文件夹更改为存储库文件夹。
-
运行以下命令以列出文件夹的内容。
-
您可以查看资料档案库的所有文件。
-
在此目录中创建包含以下内容的
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 应用并创建一个具有必要资源的 OKE 集群(VCN、子网等)
-
运行以下命令以使用 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 控制台。
- 导航到 Developer Services(开发人员服务),然后单击 Kubernetes 集群 (OKE) 。
- 单击在任务 2 中创建的 oke Kubernetes 集群。
-
向下滚动。
- 单击 Node pools 。
- 单击 np1 节点池。
-
向下滚动。
-
请注意,np1 节点池中有一个 worker 节点。
-
转到上一页并单击 np2 节点池。
-
向下滚动。
-
请注意,np2 节点池中有三个 worker 节点。
-
-
实例
-
转到 OCI 控制台。
- 导航到计算,然后单击实例。
- 查看 Kubernetes 集群的四个 worker 节点。
- 查看 Kubernetes 集群的运算符。
- 查看 Kubernetes 集群所属的 bastion 主机。
-
-
虚拟云网络
-
转到 OCI 控制台,导航到网络和虚拟云网络,然后单击注销 VCN。
-
单击子网,您可以查看 Kubernetes 集群的所有七个子网。
-
下图说明了到目前为止我们使用 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 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Deploy a Kubernetes Cluster with Terraform using Oracle Cloud Infrastructure Kubernetes Engine
G18107-01
October 2024