注意:
- 本教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure 免费套餐。
- 它使用 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 插件、Private Kubernetes API 端点、Private Worker 节点和 Public Load Balancers 的集群。
-
示例 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 操作的应用程序或云池部署任何网络服务。
任务 1:创建新的 Kubernetes 集群并验证组件
-
单击汉堡菜单。

- 单击开发人员服务。
- 单击 Kubernetes 集群 (OKE) 。

-
单击创建集群。

- 选择快速创建。
- 单击提交。

-
在创建群集(快速)页中,输入以下信息。
- 输入集群名称。
- 选择区间。
- 选择 Kubernetes 版本。
- 选择 Kubernetes API 端点作为公共端点。
- 选择要管理的节点类型。
- 向下滚动。

- 选择 Kubernetes Worker 节点作为专用 worker 。
- 向下滚动。

- 将节点计数(Worker 节点)保留为默认 3 。
- 单击下一步。

- 查看群集参数。
- 向下滚动。

- 查看节点池参数。
- 向下滚动。

- 请勿选中 Create a Basic cluster 复选框。
- 单击创建集群。

-
检查所创建的不同组件的状态。

- 确保一切都有一个绿色的检查。
- 单击关闭。

- 复查状态是否为正在创建。
- 向下滚动。

-
查看群集和节点池创建状态。正在创建 Kubernetes 控制集群,稍后将创建 worker 节点池。

-
几分钟后,成功创建了 Kubernetes 控制集群。

-
现在将创建 worker 节点池。

-
几分钟后,成功创建 Worker 节点池。

- 单击节点池。
- 请注意,池中的 worker 节点仍在创建。
- 单击 worker 节点的 3 。

-
请注意,所有节点都处于未就绪状态。

-
几分钟后,它们将就绪。

Kubernetes 控制集群和 worker 节点在 Oracle Cloud Infrastructure (OCI) 中完全部署和配置。我们称之为 Oracle Cloud Infrastructure Container Engine for Kubernetes。
任务 2:验证 OCI 控制台中部署的 Kubernetes 集群组件
当我们使用 OKE 创建 Kubernetes 集群时,将在 OCI 中创建一些资源来支持此部署。
第一个也是最重要的资源是虚拟云网络 (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 网关。

- 单击安全列表可查看安全列表,这些安全列表可以是入站或出站规则,以保护子网之间的连接。
- 请注意,有三个安全列表,一个用于 Kubernetes worker 节点连接保护,第二个用于 Kubernetes API 端点保护,第三个用于 Kubernetes 服务保护。

- 单击 NAT Gateways 查看 NAT 网关,该网关将使用专用子网提供 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 Services Network 中的所有区域服务DHCP 选项 • DNS 类型设置为“互联网”和“VCN 解析器” -
子网:
资源 范例 Kubernetes API 端点的公共子网 用途:Kubernetes API 端点,具有以下属性:
•类型:区域
• CIDR 块:10.0.0.0/28
•路由表:OKE-public-routetable-IH-OKE-CLUSTER-af593850a
•子网访问:公共
• DNS 解析:已选择
• DHCP 选项:默认
•安全列表:OKE-k8sApiEndpoint-quick-IH-OKE-CLUSTER-af593850aWorker 节点的专用子网 用途:具有以下属性的工作节点:
•类型:区域
• CIDR 块:10.0.10.0/24
•路由表:不适用
•子网访问:专用
• DNS 解析:已选择
• DHCP 选项:默认
•安全列表:OKE-nodeseclist-quick-IH-OKE-CLUSTER-af593850a云池的专用子网 用途:具有以下属性的云池:
•类型:区域
• CIDR 块:10.96.0.0/16
•路由表:OKE-private-routetable-IH-OKE-CLUSTER-af593850a
•子网访问:专用
• DNS 解析:已选择
• DHCP 选项:默认
•安全列表:N/A服务负载平衡器的公共子网 用途:具有以下属性的负载平衡器:
•类型:区域
• CIDR 块:10.0.20.0/24
•路由表:OKE-private-routetable-IH-OKE-CLUSTER-af593850a
•子网访问:公共
• DNS 解析:已选择
• DHCP 选项:默认
•安全列表:OKE-svclbseclist-quick-IH-OKE-CLUSTER-af593850a -
路由表:
资源 范例 公共 Kubernetes API 端点子网络的路由表 用途:rouetable-Kubernetes API 端点,其中定义了一个路由规则如下:
•目标 CIDR 块:0.0.0.0/0
•目标类型:Internet 网关
•目标:OKE-igw-quick-IH-OKE-CLUSTER-af593850a专用云池子网的路由表 用途:rouetable-pods,其中定义了如下两个路由规则:
•传输到 Internet 的流量规则:
ok 目的地 CIDR 块:0.0.0.0/0
ok 目标类型:NAT 网关
ok-ngw-quick-IH-OKE-CLUSTER-af593850a
•传输到 OCI 服务的规则:
ok 目的地:Oracle Services Network 中的所有区域服务
目标类型:服务网关
目标:OKE-sgw-quick-IH-OKE-CLUSTER-af593850a公共负载平衡器子网的路由表 用途:可路由的服务负载平衡器,其中定义了一个路由规则如下:
•目标 CIDR 块:0.0.0.0/0
•目标类型:Internet 网关
•目标:OKE-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 ICMP 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 ICMP 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 ICMP 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 ICMP 3, 4 以下项的 ICMP 流量:3、4 目的地无法访问:需要碎片化但设置了“不碎片化” 路径发现 无 Oracle 服务网络中的所有 AMS 服务 TCP 全部 443 以下端口的 TCP 流量:443 HTTPS 允许节点与 OKE 进行通信,以确保正确的启动和持续运行 无 0.0.0.0/0 ICMP 3, 4 以下项的 ICMP 流量:3、4 目的地无法访问:需要碎片化但设置了“不碎片化” 从 Kubernetes 控制层访问 ICMP 无 0.0.0.0/0 所有协议 所有端口的所有流量 Worker 节点访问 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 Clusters (OKE) 。单击在任务 1 中创建的 Kubernetes 集群。

- 向下滚动。
- 单击快速启动。

-
单击访问集群。

- 选择 Cloud Shell 访问。
- 单击复制可复制命令以允许访问 Kubernetes 集群。
- 单击 Launch Cloud Shell(启动 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
- 请注意,以前的输出已清除,但在向上滚动时仍可访问。
- 单击“minimize(最小化)”图标可最小化 OCI Cloud Shell 窗口。

-
单击 Close(关闭)以关闭 Access Your Cluster(访问群集)窗口。

建立连接以使用 OCI Cloud Shell 在 OKE 集群上执行管理。

任务 4:使用 kubectl 部署示例 Nginx 应用程序
-
运行以下命令:
- 记下用于获取 Kubernetes 版本的命令。
- 记下用于部署示例应用程序的命令。
- 单击还原以还原 OCI Cloud Shell 窗口。

-
运行以下命令以获取 Kubernetes 版本。
kubectl version
-
运行以下命令以验证当前部署的云池或应用程序。
kubectl get pods请注意,未找到资源。

-
运行以下命令以部署新的样例应用程序。
kubectl create -f https://k8s.io/examples/application/deployment.yaml
-
运行以下命令以验证当前部署的云池或应用程序。
kubectl get pods -
请注意,存在处于 RUNNING 状态的云池。这意味着我们刚刚部署的应用程序正在运行。

-
运行以下命令以获取用于访问应用程序的 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:清理 Pod 和命名空间
我们在默认名称空间 (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



-
运行以下命令以删除默认名称空间中的所有部署或云池。
kubectl delete --all deployments --namespace=default -
使用以下命令验证是否删除了部署或云池。
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-02