4. Kubernetes基础与OKE集群创建
在OCI上交付应用之前,需要先理解Kubernetes如何描述“要运行什么”以及“如何被访问”。Kubernetes并不直接管理单个容器进程,而是通过一组声明式对象把期望状态写入集群,再由控制器持续把实际状态拉回期望状态。OKE(Oracle Container Engine for Kubernetes)是OCI提供的托管Kubernetes服务,控制平面由OCI托管,工作节点运行在用户租户的Compute实例上,因此网络、节点池和权限配置会直接影响应用能否被正确调度和访问。
核心对象:Pod、Deployment与Service
Pod是Kubernetes最小的调度单元,一个Pod可以包含一个或多个共享网络命名空间和存储卷的容器。实际生产中很少直接创建裸Pod,因为裸Pod被删除或所在节点故障后不会自动重建。更常见的做法是用控制器管理Pod,其中Deployment负责无状态应用的副本数、滚动更新和回滚。Deployment通过ReplicaSet间接管理Pod,当镜像版本变化时创建新的ReplicaSet并逐步替换旧Pod。
Service解决的是Pod IP不稳定的问题。Pod重建后IP会变化,Service为一组Pod提供稳定的虚拟IP和DNS名称,并通过标签选择器把流量转发到匹配的Pod。常见类型包括ClusterIP(仅集群内访问)、NodePort(在每个节点上开放端口)和LoadBalancer(借助OCI负载均衡器暴露到公网或私网)。在OKE中,LoadBalancer类型Service会自动创建OCI Flexible Load Balancer,因此需要关注子网和安全列表。
下面这张图展示了从Deployment到Pod再到Service的声明关系与流量路径,同时标出OKE中节点池与OCI负载均衡器的位置。
使用OCI控制台创建OKE集群
在OCI控制台中,进入“Developer Services → Kubernetes Clusters (OKE)”,点击“Create cluster”。选择“Quick create”适合快速验证,它会自动创建VCN、子网、节点池和必要的安全规则;选择“Custom create”则适合生产环境,需要自行指定VCN、子网、Pod网络和Service网络。以下以Custom create为例说明关键配置。
集群基本信息中,名称可设为oke-demo-cluster,Kubernetes版本选择当前稳定版(例如v1.28.2),集群类型选择“Public”或“Private”。若选择Private,API Server端点仅在VCN内可达,需要通过Bastion或VPN访问。网络配置中,VCN选择已有VCN或新建,API端点子网选择区域内的公共子网,Load Balancer子网选择公共子网,Pod网络和Service网络可以使用默认的10.244.0.0/16和10.96.0.0/16,需确保与VCN CIDR不重叠。
节点池配置中,节点类型选择VM.Standard.E4.Flex,OCPU和内存按应用负载设定,例如2 OCPU、16 GB内存。节点数量可设为3,并启用自动扩缩容,最小1、最大5。节点池的放置子网选择工作节点子网,通常为私有子网,节点通过NAT Gateway访问外网拉取镜像。SSH公钥用于登录节点排查问题。创建过程约需5~10分钟,状态从Creating变为Active后即可使用。
使用CLI创建OKE集群
对于可重复的交付流程,CLI更适合纳入脚本。首先确认已安装OCI CLI并完成oci setup config,然后准备集群创建参数文件。以下示例展示关键命令结构,参数值属于教学示例,实际使用时需替换为租户内的真实OCID。
# 查看可用Kubernetes版本
oci ce node-pool-options get --node-pool-option-id all
# 创建集群(简化示例)
oci ce cluster create \
--compartment-id ocid1.compartment.oc1..example \
--name oke-demo-cluster \
--vcn-id ocid1.vcn.oc1..example \
--kubernetes-version v1.28.2 \
--type BASIC_CLUSTER
# 创建节点池
oci ce node-pool create \
--cluster-id ocid1.cluster.oc1..example \
--compartment-id ocid1.compartment.oc1..example \
--name np-web \
--node-shape VM.Standard.E4.Flex \
--node-shape-config '{"ocpus":2,"memoryInGBs":16}' \
--size 3 \
--subnet-ids '["ocid1.subnet.oc1..example"]' \
--kubernetes-version v1.28.2
创建完成后,使用oci ce cluster create-kubeconfig生成kubeconfig文件,再通过kubectl get nodes确认节点已加入集群。若节点长时间处于NotReady,应检查节点子网的路由表是否指向NAT Gateway、安全列表是否允许节点与API Server通信,以及节点池的镜像版本是否与集群版本兼容。
部署示例应用并验证
集群就绪后,可以用一个Deployment和Service验证对象关系。以下YAML声明3个nginx副本,并通过LoadBalancer Service暴露到公网。
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
type: LoadBalancer
selector:
app: web
ports:
- port: 80
targetPort: 80
执行kubectl apply -f web.yaml后,用kubectl get pods -l app=web观察3个Pod是否Running,用kubectl get svc web-svc查看EXTERNAL-IP。在OKE中,该IP由OCI负载均衡器提供,首次分配可能需要几分钟。若EXTERNAL-IP长期为pending,应检查Load Balancer子网是否为公共子网、安全列表是否放行80端口,以及Service的spec.loadBalancerSourceRanges是否限制了访问来源。
节点池与网络配置要点
节点池决定了工作节点的计算资源、镜像和扩缩容策略。生产环境建议至少使用两个不同可用性域的节点池,或使用同一节点池但跨AD分布,以提高可用性。节点池的node-shape-config需要与节点镜像兼容,例如ARM架构镜像不能调度到x86节点。网络方面,Pod网络CIDR、Service CIDR和VCN CIDR三者不能重叠;若使用Flannel或OCI VCN-Native Pod Networking,Pod IP的分配方式不同,VCN-Native模式下Pod IP直接从VCN子网分配,便于与其它OCI服务直接互通。
安全列表和NSG需要放行以下关键流量:节点到API Server的6443端口、节点之间的Pod网络通信、Load Balancer到节点的NodePort范围(默认30000-32767)。若使用私有集群,还需配置Bastion或VPN才能执行kubectl。完成这些配置后,OKE集群即可作为后续应用交付的基础环境。