注意:
- 此教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 身份证明、租户和区间示例值。完成实验室时,请将这些值替换为特定于您的云环境的值。
设置具有三个 Worker 节点的 Oracle Cloud Infrastructure Container Engine for Kubernetes
简介
在本教程中,我们将介绍如何使用 Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) 设置由 Kubernetes 控制层和数据层(节点池)组成的 Kubernetes 集群。我们还将在 Kubernetes 平台上部署和删除两个示例应用程序,以证明其工作正常。本教程将为未来的教程奠定基础,这些教程将深入了解 Kubernetes 中为容器托管应用程序提供的网络服务。
OKE 部署模型示例包括:
-
示例 1:使用 Flannel CNI 插件、公共 Kubernetes API 端点、专用 Worker 节点和公共负载平衡器的集群。
-
示例 2:使用 Flannel CNI 插件、专用 Kubernetes API 端点、专用 Worker 节点和公共负载平衡器的集群。
-
示例 3:使用 OCI CNI 插件、公共 Kubernetes API 端点、专用 Worker 节点和公共负载平衡器的集群。
-
示例 4:使用 OCI CNI 插件、专用 Kubernetes API 端点、专用 Worker 节点和公共负载平衡器的集群。
有关我们可以选择的不同 OKE 部署模型的更多信息,请参见 Example Network Resource Configurations 。
在本教程中,我们将实施示例 3 部署模型。
目标
- 我们将在 Oracle Cloud Infrastructure (OCI) 中部署完全部署和配置的 Kubernetes 控制集群和 worker 节点。这就是我们所说的 Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE)。我们将在两个不同的名称空间中部署两个示例应用程序,其中一个应用程序将使用新名称空间中的 Helm 图表进行部署。最后,我们将清理应用程序或 pod。我们不会为 Kubernetes 操作的应用程序或 pod 部署任何网络服务。
任务 1:创建新的 Kubernetes 集群并验证组件
-
单击“Hamburger(汉堡)”菜单。
- 单击开发人员服务。
- 单击 Kubernetes Clusters (OKE) 。
-
单击创建集群。
- 选择快速创建。
- 单击提交。
-
在创建集群(快速)页中,输入以下信息。
- 输入群集名称。
- 选择区间。
- 选择 Kubernetes 版本。
- 选择 Kubernetes API 端点作为公共端点。
- 选择要管理的节点类型。
- 向下滚动。
- 选择 Kubernetes Worker 节点作为 Private Worker(专用员工)。
- 向下滚动。
- 保留节点计数(Worker 节点)默认值 3 。
- 单击下一步。
- 查看群集参数。
- 向下滚动。
- 查看节点池参数。
- 向下滚动。
- 请勿选中创建基本集群复选框。
- 单击创建集群。
-
检查所创建的不同组件的状态。
- 确保所有东西都有一个绿色的支票。
- 单击关闭。
- 检查状态是否为 CREATING 。
- 向下滚动。
-
查看群集和节点池创建状态。正在创建 Kubernetes 控制集群,稍后将创建 worker 节点池。
-
几分钟后,成功创建了 Kubernetes 控制集群。
-
现在将创建 worker 节点池。
-
几分钟后,成功创建了 worker 节点池。
- 单击节点池。
- 请注意,池中的 worker 节点仍在创建。
- 单击 worker 节点的 3 。
-
请注意,所有节点都处于 Not ready 状态。
-
几分钟后,它们将处于就绪状态。
Kubernetes 控制集群和 worker 节点在 Oracle Cloud Infrastructure (OCI) 中完全部署和配置。这就是我们所谓的 Oracle Cloud Infrastructure Container Engine for Kubernetes。
任务 2:在 OCI 控制台中验证已部署的 Kubernetes 集群组件
使用 OKE 创建 Kubernetes 集群时,将在 OCI 中创建一些资源来支持此部署。
第一个也是最重要的资源是虚拟云网络 (virtual cloud network,VCN)。由于我们选择了快速创建选项,因此创建了一个专用于 OKE 的新 VCN。
-
登录到 OCI 控制台,然后导航到网络、虚拟云网络 (Virtual Cloud Networks,VCN) ,您将看到已创建的新 VCN。单击 VCN。
在 VCN 内,您将看到三个子网,一个专用子网和两个公共子网来支持 OKE 部署。
-
验证资源。
- 单击 CIDR 块/前缀可查看 VCN 的 CIDR。
- 请注意,
10.0.0.0/16
由 OCI 分配。
- 单击路由表以查看路由表。
- 请注意,创建了两个路由表:路由到专用子网,路由到公共子网。
- 单击 Internet Gateways(Internet 网关)可查看 Internet 网关,该网关将使用与 Internet 之间的公共子网提供 Internet 连接。
- 请注意,只有一个 Internet 网关。
- 单击安全列表可查看可为入站或出站规则的安全列表,以保护子网之间的连接。
- 请注意,有三个安全列表,一个用于 Kubernetes worker 节点连接保护,另一个用于 Kubernetes API 端点保护,第三个用于 Kubernetes 服务保护。
- 单击 NAT 网关可查看 NAT 网关,该网关将使用到 Internet 的专用子网提供 Internet 连接。
- 请注意,只有一个 NAT 网关。
- 单击服务网关可查看将提供对特定 Oracle 服务的专用访问的服务网关,而不向互联网网关或 NAT 网关公开数据。
- 请注意,只有一个服务网关。
- 打开 OCI 控制台,单击汉堡菜单并导航到计算、实例。
- 请注意,创建的三个实例将用作我们在部署期间指定的三个 Kubernetes worker 节点。
- 打开 OCI 控制台,单击汉堡菜单并导航到 IP Management 、 Reserved public IPs 。
- 请注意,有一个公共 IP 地址以
.166
结尾,为 Kubernetes 公共 API 端点保留。
如果我们将刚刚收集的每条信息放置在一个关系图中,则该关系图将如下图所示。
-
包含配置详细信息的表以部署 OKE
-
VCN:
资源 名称 VCN •名称:oke-vcn-quick-IH-OKE-CLUSTER-af593850a
• CIDR 块:10.0.0.0/16
• DNS 解析:已选择Internet 网关 •名称:oke-igw-quick-IH-OKE-CLUSTER-af593850a NAT 网关 •名称:oke-ngw-quick-IH-OKE-CLUSTER-af593850a 服务网关 •名称:oke-sgw-quick-IH-OKE-CLUSTER-af593850a
•服务:Oracle 服务网络中的所有区域服务DHCP 选项 • DNS 类型设置为 Internet 和 VCN 解析器 -
子网:
资源 范例 Kubernetes API 端点的公共子网 用途:具有以下属性的 Kubernetes API 端点:
•类型:区域
• CIDR 块:10.0.0.0/28
•路由表:ok-public-routetable-IH-OKE-CLUSTER-af593850a
•子网访问:公共
• DNS 解析:选定的
• DHCP 选项:默认
•安全列表:ok-k8sApiEndpoint-quick-IH-OKE-CLUSTER-af593850aWorker 节点的专用子网 用途:具有以下属性的工作节点:
•类型:区域
• CIDR 块:10.0.10.0/24
•路由表:N/A
•子网访问:专用
• DNS 解析:所选
• DHCP 选项:默认
•安全列表:ok-nodeseclist-quick-IH-OKE-CLUSTER-af593850a云池的专用子网 用途:具有以下属性的 pod:
•类型:区域
• CIDR 块:10.96.0.0/16
•路由表:ok-private-routetable-IH-OKE-CLUSTER-af593850a
•子网访问:专用
• DNS 解析:选定
• DHCP 选项:默认
•安全列表:N/A服务负载平衡器的公共子网 用途:具有以下属性的负载平衡器:
•类型:区域
• CIDR 块:10.0.20.0/24
•路由表:ok-private-routetable-IH-OKE-CLUSTER-af593850a
•子网访问:公共
• DNS 解析:选定
• DHCP 选项:默认
•安全列表:ok-svclbseclist-quick-IH-OKE-CLUSTER-af593850a -
路由表:
资源 范例 公共 Kubernetes API 端点子网的路由表 用途:routetable-Kubernetes API 端点,有一个路由规则定义如下:
•目标 CIDR 块:0.0.0.0/0
•目标类型:Internet 网关
•目标:ok-igw-quick-IH-OKE-CLUSTER-af593850a专用云池子网的路由表 目的:routetable-pods,其中定义了以下两个路由规则:
•流量到 Internet 的规则:
o 目标 CIDR 块:0.0.0.0/0
o 目标类型:NAT Gateway
oke-ngw-quick-IH-OKE-CLUSTER-af593850a
•流量到 OCI 服务的规则:
目的地:Oracle 服务网络中的所有区域服务
目标类型:服务网关
oke-sgw-quick-IH-OKE-CLUSTER-af593850a公共负载平衡器子网的路由表 目的:routetable-serviceloadbalancers,其中定义了一个路由规则如下:
•目标 CIDR 块:0.0.0.0/0
•目标类型:Internet 网关
•目标:ok-igw-quick-IH-OKE-CLUSTER-af593850a
-
-
公共 Kubernetes API 端点子网的安全列表规则
oke-k8sApiEndpoint-quick-IH-OKE-CLUSTER-af593850a
安全列表具有入站和出站规则,如下表所示。-
入站规则:
无状态 源 IP 协议 源端口范围 目的地端口范围 类型和代码 允许 说明 无 0.0.0.0/0 TCP 全部 6443 端口的 TCP 流量:6443 对 Kubernetes API 端点的外部访问 无 10.0.10.0/24 TCP 全部 6443 端口的 TCP 流量:6443 Kubernetes worker 到 Kubernetes API 端点通信 无 10.0.10.0/24 TCP 全部 12250 端口的 TCP 流量:12250 用于控制平面通信的 Kubernetes Worker 无 10.0.10.0/24 公司简介 3, 4 以下项的 ICMP 流量:3、4 目的地无法访问:需要分段但设置了“不分段” 路径搜索 -
出站规则:
无状态 目的地 IP 协议 源端口范围 目的地端口范围 类型和代码 允许 说明 无 Oracle 服务网络中的所有 AMS 服务 TCP 全部 443 端口的 TCP 流量:443 HTTPS 允许 Kubernetes 控制层与 OKE 通信 无 10.0.10.0/24 TCP 全部 全部 端口的 TCP 流量:所有 到 worker 节点的所有流量 无 10.0.10.0/24 公司简介 3, 4 以下项的 ICMP 流量:3、4 目的地无法访问:需要分段但设置了“不分段” 路径搜索
-
-
专用 Worker 节点子网的安全列表规则
oke-nodeseclist-quick-IH-OKE-CLUSTER-af593850a
安全列表具有入站和出站规则,如下表所示。入站规则:
无状态 源 IP 协议 源端口范围 目的地端口范围 类型和代码 允许 说明 无 10.0.10.0/24 所有协议 所有端口的所有流量 允许一个 worker 节点上的 pod 与其他 worker 节点上的 pod 通信 无 10.0.0.0/28 公司简介 3, 4 以下项的 ICMP 流量:3、4 目的地无法访问:需要分段但设置了“不分段” 路径搜索 无 10.0.0.0/28 TCP 全部 全部 端口的 TCP 流量:所有 从 Kubernetes 控制层进行 TCP 访问 无 0.0.0.0/0 TCP 全部 22 以下端口的 TCP 流量:22 SSH 远程登录协议 到 worker 节点的入站 SSH 流量 无 10.0.20.0/24 TCP 全部 32291 端口的 TCP 流量:32291 无 10.0.20.0/24 TCP 全部 10256 端口的 TCP 流量:10256 无 10.0.20.0/24 TCP 全部 31265 端口的 TCP 流量:31265 出站规则:
无状态 目的地 IP 协议 源端口范围 目的地端口范围 类型和代码 允许 说明 无 10.0.10.0/24 所有协议 所有端口的所有流量 允许一个 worker 节点上的 pod 与其他 worker 节点上的 pod 通信 无 10.0.0.0/28 TCP 全部 6443 端口的 TCP 流量:6443 访问 Kubernetes API 端点 无 10.0.0.0/28 TCP 全部 12250 端口的 TCP 流量:12250 用于控制平面通信的 Kubernetes Worker 无 10.0.0.0/28 公司简介 3, 4 以下项的 ICMP 流量:3、4 目的地无法访问:需要分段但设置了“不分段” 路径搜索 无 Oracle 服务网络中的所有 AMS 服务 TCP 全部 443 端口的 TCP 流量:443 HTTPS 允许节点与 OKE 通信,以确保正确启动和继续运行 无 0.0.0.0/0 公司简介 3, 4 以下项的 ICMP 流量:3、4 目的地无法访问:需要分段但设置了“不分段” 从 Kubernetes 控制层访问 ICMP 无 0.0.0.0/0 所有协议 所有端口的所有流量 员工节点访问 Internet -
公共负载平衡器子网的安全列表规则
oke-svclbseclist-quick-IH-OKE-CLUSTER-af593850a
安全列表具有入站和出站规则,如下表所示。-
入站规则:
无状态 源 IP 协议 源端口范围 目的地端口范围 类型和代码 允许 说明 无 0.0.0.0/0 TCP 全部 80 端口的 TCP 流量:80 -
出站规则:
无状态 目的地 IP 协议 源端口范围 目的地端口范围 类型和代码 允许 说明 无 10.0.10.0/24 TCP 全部 32291 端口的 TCP 流量:32291 无 10.0.10.0/24 TCP 全部 10256 端口的 TCP 流量:10256 无 10.0.10.0/24 TCP 全部 31265 端口的 TCP 流量:31265
-
任务 3:使用 CLI 验证 Kubernetes 集群是否正在运行
-
打开 OCI 控制台,单击汉堡菜单并导航到 Developer Services(开发人员服务)、Kubernetes 集群 (OKE) 。单击在任务 1 中创建的 Kubernetes 集群。
- 向下滚动。
- 单击快速入门。
-
单击访问集群。
- 选择 Cloud Shell 访问权限。
- 单击复制以复制命令以允许访问 Kubernetes 集群。
- 单击启动 Cloud Shell 。
下图显示了如何使用 OCI Cloud Shell 建立连接以对 OKE 集群执行管理。
-
OCI Cloud Shell 将启动。
将显示一些有关后台正在发生的情况的信息性消息。
在这种情况下,可以让 OCI Cloud Shell 在不同的 CPU 架构上运行。
-
单击关闭可关闭此信息性消息。
-
我们已准备好使用 OCI Cloud Shell 访问 Kubernetes 集群。
-
将上面复制的命令粘贴到此任务中。
-
运行以下命令以获取有关 Kubernetes 集群的信息。
kubectl cluster-info
-
运行以下命令以获取有关 worker 节点的信息。
kubectl get nodes
-
运行以下命令可获取有关 worker 节点的更多信息。
kubectl get nodes -o wide
-
运行以下命令以清除屏幕,然后从新屏幕开始。
clear
- 请注意,以前的输出已清除,但是在向上滚动时仍可访问。
- 单击最小化图标可最小化 OCI Cloud Shell 窗口。
-
单击 Close 关闭 Access Your Cluster 窗口。
该连接用于使用 OCI Cloud Shell 对 OKE 集群执行管理。
任务 4:使用 kubectl 部署示例 Nginx 应用程序
-
运行以下命令。
- 记下获取 Kubernetes 版本的命令。
- 记下用于部署示例应用程序的命令。
- 单击还原以还原 OCI Cloud Shell 窗口。
-
运行以下命令以获取 Kubernetes 版本。
kubectl version
-
运行以下命令以验证当前部署的 pod 或应用程序。
kubectl get pods
请注意,未找到资源。
-
运行以下命令以部署新的样例应用程序。
kubectl create -f https://k8s.io/examples/application/deployment.yaml
-
运行以下命令以验证当前部署的 pod 或应用程序。
kubectl get pods
-
请注意,存在处于 RUNNING 状态的 pod。这意味着我们刚刚部署的应用程序正在运行。
-
运行以下命令以获取用于访问应用程序的 IP 地址。
kubectl get deploy,svc
-
请注意,新部署的应用程序未分配任何 IP 地址,并且只有 Kubernetes 集群具有连接到其的具有内部 IP 地址的集群 IP 服务。
-
运行以下命令可查看新部署应用程序的连接(网络)服务。
kubectl get svc ngnix
-
请注意,没有为部署的 Nginx 应用程序部署或附加任何(网络)服务。因此,我们将无法从其他应用程序访问应用程序,或使用 Web 浏览器访问 Nginx Web 服务器中的网页。我们将在另一个教程中讨论此问题。
任务 5:使用 Helm 图表部署示例 MySQL 应用程序
-
Helm 图表是一个程序包,其中包含将应用程序部署到 Kubernetes 集群所需的所有资源。运行以下命令以:
-
为 MySQL 数据库添加 Bitnami 系统信息库。
helm repo add bitnami https://charts.bitnami.com/bitnami
-
在 Kubernetes worker 节点上部署 MySQL 数据库,同时创建新的名称空间 mysql。
helm install mysql bitnami/mysql -–namespace mysql --create-namespace
-
-
要获取已部署的应用程序,请运行以下命令。此命令将仅显示当前(默认)名称空间中的已部署应用程序。
kubectl get pods
-
请注意,当前(默认)名称空间中仅显示 Nginx 应用程序。此命令现在将在集群范围内显示已部署的应用程序(所有名称空间)。
kubectl get pods -A -w
- 请注意,Nginx 应用程序正在默认名称空间中运行。
- 请注意,MySQL 应用程序正在新的 mysql 名称空间中运行。
任务 6:清理云池和名称空间
我们在默认名称空间 (Nginx) 中部署了应用程序,在新名称空间 (MySQL) 中部署了另一个应用程序。使用 Helm 图表,让我们清理环境,以便我们可以在需要时重新开始。
-
使用以下命令获取所有 worker 节点(群集范围)。
kubectl get nodes -o wide
-
使用以下命令获取当前(默认)名称空间中正在运行的所有 pod。
kubectl get pods -o wide
-
运行以下命令以获取所有名称空间。
kubectl get namespaces
-
运行以下命令以专门获取当前(默认)名称空间中的所有正在运行的 pod。
kubectl get pods --namespace=default
-
运行以下命令以专门获取 MySQL 名称空间中所有正在运行的 pod。
kubectl get pods --namespace=mysql
-
运行以下命令以删除默认名称空间中的所有部署或 pod。
kubectl delete --all deployments --namespace=default
-
使用以下命令验证部署或 pod 是否已删除。
kubectl get pods --namespace=default
-
使用以下命令专门获取 MySQL 名称空间中正在运行的所有 pod。只是验证它是否仍然存在。
kubectl get pods --namespace=mysql
-
运行以下命令以删除所有部署或 pod 以及完整的 MySQL 名称空间。
kubectl delete namespace mysql
-
使用此命令可以收集所有名称空间,并验证是否删除了 MySQL 名称空间。
kubectl get namespaces
确认
- 作者 - Iwan Hoogendoorn(OCI 网络专家)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Set up Oracle Cloud Infrastructure Container Engine for Kubernetes with Three Worker Nodes
F95678-01
March 2024