开始使用 Oracle Cloud Infrastructure 中基于 Arm 的 Kubernetes 集群
此教程介绍了如何在 Oracle Cloud Infrastructure(OCI) 中创建使用 Ampere A1 计算平台的基于 ARM 的 Kubernetes 集群。您还将在 kubernetes 集群上部署常用 Web 容器 Apache Tomcat。使用本教程中的方法,您可以创建可在基于 Arm 的 kubernetes 集群和基于 x86(Intel 和 AMD)的集群之间无缝移植的应用部署。
在本教程中,您将:
创建由 Ampere A1 计算支持的 Kubernetes 集群 (OKE)。
将 Apache Tomcat 部署到集群。
创建可以在 x86 和基于 Arm 的 kubernetes 集群之间无缝移植的部署。
将 Java 应用和微服务部署到 Tomcat Web 容器。
基于 Ampere Altra CPU 的 Ampere A1 计算平台代表了正在构建可从边缘设备扩展到云数据中心的负载的企业和应用开发人员的代差。此平台的独特设计提供了稳定且可预测的性能,因为计算核心内没有资源争用,并且具有更强的隔离性和安全性。Oracle Cloud Infrastructure 上这种新型的计算配置提供了卓越的平台,可将 Altra CPU 的强大功能与 OCI 上服务的安全性、可扩展性和生态系统相结合。
为您的环境引入 Arm 体系结构
在应用开发过程中引入 Arm 架构时,大多数情况下,开发工作流保持不变。您当前使用的工具和流程将无缝接管,您的开发工作站设置将保持不变。这种情况的一般例外是低级别系统应用程序,它们使用高度专业化的工具针对特定的 CPU 功能。在大多数情况下,您可能需要对工作流中的构建或打包步骤进行微小的更改,以支持 Arm 体系结构。首先分析现有工作流,确定您是否有任何特定于平台的构建或打包步骤。
对于编译语言(例如
C/C++
、
Go
和
Rust
),特定于平台的构建步骤可以是编译器选项。在这些情况下,您通常会添加构建步骤来编译 Arm 的应用程序以及应用程序的 x86 版本。如果使用的是字节码语言、即时 (JIT) 编译语言或解释语言(例如 Java、JavaScript、TypeScript、Python 或 Ruby),则通常没有编译时标志或选项。这些语言不会生成特定于平台的可执行二进制文件;而是使用特定于平台的运行时,例如用于 Arm 的 Java 或 Node.js 运行时,它跨多个平台运行相同的源代码。
特定于平台的打包功能包括将应用打包为 Docker 映像、定制 VM 映像或特定于平台的部署工件。在这些情况下,您将需要使用附加步骤修改构建处理,以生成特定于 Arm 的申请包。例如,对于容器映像,您希望拥有一个用于部署在 Arm 系统的应用程序映像版本。容器映像格式支持多个架构,因此每个平台的容器运行时只能提取适当的映像并运行应用。要了解有关
多归档映像
和
如何构建映像
的更多信息,请参阅 Docker 博客。
创建基于 ARM 的 Kubernetes 集群
Container Engine for Kubernetes 简单易用,可与 OCI Cloud Shell 结合使用,无需设置本地环境即可实现完全控制。首先,您需要在 OCI 上创建新的 Kubernetes 集群。
从 Oracle Cloud 控制台的导航菜单中,转至
开发人员服务
并单击
Kubernetes 集群
。
单击
创建集群
。您可以使用
快速创建
选项使用默认值,或者使用
定制创建
选项指定高级设置。此处使用
快速创建
,因为它选择的默认值是一个很好的开始。
插图创建集群的说明
在“创建集群”页上,选择一些基本配置选项,例如要运行的 Kubernetes 版本以及集群的节点数和配置。对于本教程,为节点选择 Ampere A1 配置。
注意
:为节点选择
VM.Standard.A1.Flex
配置,如下所示。
插图创建工作流的说明
还可以为集群指定名称和区间。可见性类型指示集群中的节点是否可从 Internet 访问,例如,通过 SSH 访问。将它们保留在专用网络上并使用堡垒或跳跃公共网络上的主机来提供访问路径更为常见。在此处,我们选择使节点保持专用状态的默认值。
单击
创建集群
,工作流将开始创建所有必需的资源和集群本身。
创建支持资源后,将显示群集详细信息页面。几分钟内,将创建并激活集群。
在集群状态为“活动”后,单击
访问集群
按钮以查看访问集群的方式。
选择 Cloud Shell 选项。Cloud Shell 是功能全面的联机终端环境,与控制台集成。Cloud Shell 提供了与 Kubernetes 集群交互所需的所有工具,这是您无需配置本地开发环境即可开始使用的最快方法。
插图访问 cloudshell 的说明
您可以直接从页面启动 Cloud Shell。请注意,控制台顶部始终提供对 Cloud Shell 的访问,以供快速访问。
该页面还包括一个在 Cloud Shell 中运行的命令。此命令使用 OCI CLI 创建
kubeconfig
文件。
kubectl
等 Kubernetes 客户端可以使用配置文件来简化对集群的访问。此类文件通常称为
kubeconfig
文件。通常,此配置文件位于
~/.kube
中。单个配置文件可以包含多个群集的访问配置。
注意
已在 Cloud Shell 环境中为您安装并配置了 OCI CLI。
启动 Cloud Shell,然后复制命令并将其粘贴到 Cloud Shell 中以运行它。适用于 Kubernetes 的标准命令行客户端是 kubectl,它预先安装在 Cloud Shell 环境中。
现在,让我们检查是否可以与集群交互并查看集群节点。
将以下命令复制到 Cloud Shell 并运行它。
kubectl get nodes -o wide
您应看到与以下示例类似的输出,具体取决于集群中的节点数。请注意,内核版本显示运行 Oracle Linux for aarch64
(Arm 64 位)体系结构。
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
10.0.10.229 Ready node 3d7h v1.19.7 10.0.10.229 <none> Oracle Linux Server 7.9 5.4.17-2102.200.13.el7uek.aarch64 docker://19.3.11
10.0.10.29 Ready node 3d7h v1.19.7 10.0.10.29 <none> Oracle Linux Server 7.9 5.4.17-2102.200.13.el7uek.aarch64 docker://19.3.11
10.0.10.87 Ready node 3d7h v1.19.7 10.0.10.87 <none> Oracle Linux Server 7.9 5.4.17-2102.200.13.el7uek.aarch64 docker://19.3.11
现在,您已使用完备的 Kubernetes 集群并设置了与它进行交互的工具,因此您可以向该集群部署任何 kubernetes 负载。
无缝部署到 Kubernetes 集群
现在,您可以将容器化负载部署到基于 Arm 的 kubernetes 集群。容器映像针对特定架构而构建。Docker 或 Buildah 等容器工具提供了无缝管理这些映像及其部署情况的方法。在本示例中,您将 Apache Tomcat(常用的 Java Web 容器)部署到 kubernetes 集群。在 x86 体系结构上运行时,在 Arm 和 amd64
映像上运行时,docker 运行时会提取 arm64v8
映像。这样,我们只要为两个体系结构构建应用映像,就可以创建无缝的可移植 kubernetes 部署清单。
首先创建体系结构中性部署清单。清单不应引用任何特定于体系结构的容器,因为容器运行时能够检测正确的体系结构并提取适当的映像。要创建清单,请运行以下表名。它将创建一个名为 tomcat.yaml
的新文件。
cat <<EOF > tomcat.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
labels:
app: tomcat
spec:
replicas: 3
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:9
ports:
- containerPort: 8080
volumeMounts:
- name: app-volume
mountPath: /usr/local/tomcat/webapps/
volumes:
- name: app-volume
configMap:
name: app-bundle
apiVersion: v1
kind: Service
metadata:
name: tomcat
labels:
app: tomcat
spec:
ports:
- port: 80
name: http
targetPort: 8080
selector:
app: tomcat
type: LoadBalancer
此清单包含以下对象和操作:
名为 tomcat
且标签为 app: tomcat
的部署对象。
部署有 3 个副本。
部署中的云池具有单个容器 - tomcat:9
。请注意,清单未指定体系结构,使其在所有体系结构中都有效。Docker 将在运行时提取支持适当体系结构的映像。
Volume 对象是从 ConfigMap 创建的,并挂载到容器中。此 ConfigMap 将稍后创建,并将包含应用程序。
清单还包含服务对象,并通过 LoadBalancer 公开部署。
下载 Apache Tomcat 的示例应用程序,并将其创建为 ConfigMap。
wget https://tomcat.apache.org/tomcat-9.0-doc/appdev/sample/sample.war
kubectl create configmap app-bundle --from-file sample.war
注意使用 ConfigMap 挂载应用程序的方法仅是为了便于使用,不应用于生产应用程序。
部署清单。这将创建 kubernetes 对象,包括部署和服务。创建部署时,docker 运行时会检测到它在牙臂体系结构上运行,并自动选取 Apache Tomcat 容器的 Arm 变量。容器上部署的 Java 应用程序与平台无关,因此可以在所有体系结构中部署相同的 .war
文件。
kubectl apply -f tomcat.yaml
检查您的部署状态
kubectl get deploy,svc
您应看到类似以下内容的输出
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/tomcat 2/2 2 2 9s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d9h
service/tomcat LoadBalancer 10.96.120.212 <pending> 80:32547/TCP 9s
这表明 Tomcat 已成功部署到基于 Arm 的 kubernetes 集群上,并为 Java Web 应用程序提供服务。我们使用的部署清单与体系结构无关,可用于 x86 和基于 Arm 的集群。
您可以选择通过运行来获取详细的节点级别详细信息
kubectl get nodes -o wide
kubectl describe node <node_name>
显示有关节点的详细信息,包括在该节点上调度的体系结构和云池。
当 LoadBalancer 的外部 IP 地址可用时(这可能需要几分钟时间),您可以通过将 Web 浏览器指向 http://<your_loadbalancer_ip_address>/sample
来访问部署
访问官方 arm64v8
映像的 docker Hub 存储库,了解您可以在基于 Arm 的 kubernetes 集群上部署的更多负载。此处
更多学习资源
在 docs.oracle.com/learn 上浏览其他实验室,或者在 Oracle Learning YouTube 渠道上访问更多免费学习内容。此外,访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Get started with Arm-based Kubernetes clusters in Oracle Cloud Infrastructure
F50326-01
November 2021