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负载均衡器的位置。

OKE 中 Deployment → Pod → Service 的声明关系与流量路径 外部客户端 公网 / 私网请求 OCI Flexible LB 由 LoadBalancer Service 自动创建 监听 80 / 443 Service (ClusterIP) selector: app=web port 80 → targetPort 8080 Deployment: web replicas: 3 image: nginx:1.25 ReplicaSet 维持 3 个 Pod 副本 OKE 节点池 (Node Pool) VM.Standard.E4.Flex · 2 OCPU / 16 GB · 3 节点 Worker Node 1 Pod web-1 Pod web-2 Worker Node 2 Pod web-3 Worker Node 3 (可调度,当前无 web Pod) HTTP 转发 Endpoints 创建/管理 调度 label selector: app=web 关键关系 • Deployment 声明期望副本数与镜像版本 • Service 通过标签选择器动态发现 Pod • Pod 重建后 IP 变化,Service 虚拟 IP 保持稳定

使用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是否限制了访问来源。

OKE的LoadBalancer Service默认创建Flexible Load Balancer,计费按带宽和时长计算。测试完成后可删除Service以释放负载均衡器,避免持续产生费用。

节点池与网络配置要点

节点池决定了工作节点的计算资源、镜像和扩缩容策略。生产环境建议至少使用两个不同可用性域的节点池,或使用同一节点池但跨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集群即可作为后续应用交付的基础环境。