利用OCI免费套餐构建高可用Kubernetes集群实战指南
1. 项目概述在免费云上构建企业级K8s集群最近在技术社区里一个名为“nce/oci-free-cloud-k8s”的项目引起了我的注意。这个标题乍一看有点“黑话”的味道但拆解开来它指向了一个非常具体且极具吸引力的场景利用Oracle Cloud Infrastructure (OCI) 的永久免费套餐搭建一个功能完整的Kubernetes (K8s) 集群。对于个人开发者、初创团队或是想低成本学习、实验云原生技术的朋友来说这无疑是一个“宝藏”方案。OCI的免费套餐在业界是出了名的“慷慨”它提供了包括2台AMD架构的虚拟机VM.Standard.E2.1.Micro1个OCPU1GB内存、4台ARM架构的虚拟机VM.Standard.A1.Flex最高可配4个OCPU和24GB内存以及总计200GB的块存储等资源并且这些资源是永久免费的。这相当于为我们提供了一个几乎零成本的云上实验室。而Kubernetes作为容器编排的事实标准其学习与实践成本往往不低尤其是在云环境下的部署与管理。这个项目正是将这两者结合提供了一套自动化脚本和最佳实践让我们能在这片免费的“云土地”上快速建立起一个可用于开发、测试甚至小型生产环境的K8s集群。我花了几天时间从零开始完整地走了一遍这个项目的流程。整个过程下来我的感受是思路清晰但细节决定成败。它不仅仅是一堆命令的堆砌更涉及到云资源规划、网络配置、安全组策略、高可用架构设计等一系列在真实生产环境中也会遇到的问题。接下来我将以一名实践者的视角为你深度拆解这个项目的核心设计、实操步骤、避坑要点并分享我在此过程中积累的一手经验。2. 核心架构与资源规划解析在免费套餐的约束下搭建一个可用的K8s集群首要任务就是做好资源规划。我们不能像在付费账户里那样“任性”地开资源必须精打细算让每一分免费的资源都发挥最大价值。2.1 OCI免费套餐资源深度解读首先我们必须彻底吃透OCI免费套餐的规则这是所有设计的基石AMD计算实例 (VM.Standard.E2.1.Micro): 2台永久免费。每台配置为1个OCPU相当于1个vCPU和1GB内存。这个配置非常“迷你”单独运行稍复杂的应用都可能吃力但它非常适合作为K8s集群的控制平面Control Plane节点。因为控制平面的组件如kube-apiserver, etcd, kube-scheduler, kube-controller-manager在轻量级、非高负载的场景下1C1G是可以勉强支撑的尤其是当我们采用高可用部署时可以将负载分散。ARM计算实例 (VM.Standard.A1.Flex): 4台永久免费且核心与内存可按需组合总OCPU数不超过4个总内存不超过24GB。这是本项目的“主力军”。我们可以灵活地创建多个ARM实例例如方案A均衡型: 创建4台实例每台配置为1个OCPU和6GB内存。这4台全部作为工作节点Worker Node。方案B控制平面强化型: 创建2台ARM实例例如2OCPU4GB内存作为控制平面节点另外2台AMD实例作为工作节点。但通常AMD实例性能较弱更适合做控制平面。方案C混合型: 本项目更常见的实践是将2台AMD实例作为控制平面组建一个高可用的控制平面集群然后创建2-3台ARM实例如每台2OCPU8GB内存作为工作节点。这样既保证了控制平面的稳定性哪怕一台AMD实例宕机又为运行业务容器提供了相对充裕的ARM计算资源。块存储Block Storage: 总共200GB免费用于启动卷和附加卷。每个计算实例的默认启动卷Boot Volume占用47GB左右。这意味着如果我们创建2台AMD247≈94GB和3台ARM347≈141GB总启动卷容量就达到了235GB已经超出了免费额度。因此我们必须手动调整启动卷大小例如将每台实例的启动卷缩减到30-40GB以控制在200GB限额内。网络资源: 免费套餐包含1个VCN虚拟云网络、2个公共IP地址等。这些足够我们搭建一个具有公网入口的集群。注意OCI对免费套餐资源的“始终免费Always Free”有严格界定。你必须确保创建的实例形状Shape是VM.Standard.E2.1.Micro或VM.Standard.A1.Flex并且所在区域Region支持免费套餐如凤凰城、阿什本、法兰克福等。创建非免费形状的实例即使你在免费额度内也可能产生费用。2.2 高可用K8s集群架构设计基于上述资源一个典型的高可用架构设计如下控制平面高可用3节点: 使用2台免费的AMD实例再创建1台ARM实例最小配置如1OCPU1GB内存共同组成3节点的控制平面。这样即使一个节点故障集群的管控能力依然存在。etcd也会以集群模式运行确保配置数据不丢失。工作节点池ARM节点: 将剩余的ARM免费额度例如3台每台2OCPU8GB内存全部用作工作节点运行业务Pod。ARM架构在运行某些工作负载如Go语言编译的应用时可能有更好的能效表现。负载均衡器Load Balancer: 在OCI上创建一个免费的公共负载均衡器OCI LB在免费套餐内有每月10Mbps的免费额度将其作为Kubernetes API Server的访问端点为kube-apiserver提供高可用VIP和后续Ingress Controller的流量入口。网络规划: 在一个VCN内创建两个子网公共子网Public Subnet: 放置负载均衡器和需要公网IP的Bastion主机跳板机。私有子网Private Subnet:所有K8s节点控制平面和工作节点都必须部署在私有子网中。这是最重要的安全最佳实践之一避免将集群节点直接暴露在公网。这个架构的核心思想是利用免费资源模拟企业级生产环境的核心高可用与网络安全模式。虽然资源有限但架构理念是相通的。3. 实操部署全流程与关键技术点纸上得来终觉浅绝知此事要躬行。下面我结合nce/oci-free-cloud-k8s项目提供的脚本和手动步骤详细拆解部署过程。3.1 前期准备与环境配置在登录OCI控制台之前本地环境需要准备好“武器”。OCI CLI安装与配置这是自动化管理OCI资源的基石。# 在MacOS上安装 brew update brew install oci-cli # 在Linux上安装 bash -c $(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh) # 配置CLI这步需要交互式输入 oci setup config执行oci setup config后你需要输入Enter a location for your config [/home/username/.oci/config]: 直接回车。然后按照提示去OCI控制台的“用户设置” - “API密钥”中生成并下载你的密钥对公钥和私钥。将公钥内容粘贴到终端并指定私钥文件的路径。Terraform安装项目通常使用Terraform进行基础设施即代码IaC编排实现资源创建的自动化与可重复性。# 使用tfenv管理多版本Terraform是个好习惯 git clone https://github.com/tfutils/tfenv.git ~/.tfenv echo export PATH$HOME/.tfenv/bin:$PATH ~/.bashrc source ~/.bashrc tfenv install latest tfenv use latestSSH密钥对生成用于安全登录到创建的虚拟机实例。ssh-keygen -t rsa -b 4096 -C your_emailexample.com -f ~/.ssh/oci_k8s_id_rsa # 这会生成 ~/.ssh/oci_k8s_id_rsa私钥和 ~/.ssh/oci_k8s_id_rsa.pub公钥实操心得务必妥善保管私钥并记得在后续的Terraform变量文件或OCI实例创建配置中填入公钥内容。3.2 使用Terraform编排基础设施这是最核心的自动化步骤。项目一般会提供main.tf、variables.tf、outputs.tf等文件。修改变量定义编辑terraform.tfvars或类似的自定义变量文件这是定制你专属集群的关键。# 示例 terraform.tfvars tenancy_ocid ocid1.tenancy.oc1..aaaaaaa... user_ocid ocid1.user.oc1..aaaaaaa... fingerprint 12:34:56:78:90:ab:cd:ef:12:34:56:78:90:ab:cd:ef private_key_path /home/username/.oci/oci_api_key.pem region us-phoenix-1 # 选择支持免费套餐的区域 # 网络配置 vcn_cidr_block 10.0.0.0/16 public_subnet_cidr 10.0.1.0/24 private_subnet_cidr 10.0.2.0/24 # 实例配置 - 严格控制免费套餐形状 control_plane_shape VM.Standard.E2.1.Micro control_plane_memory_gb 1 # Micro形状内存固定此变量可能被忽略 control_plane_ocpus 1 worker_node_shape VM.Standard.A1.Flex worker_node_memory_gb 8 # 为每个工作节点分配8GB内存 worker_node_ocpus 2 # 为每个工作节点分配2个OCPU worker_node_count 3 # 创建3个工作节点 # 启动卷大小 - 关键必须控制总容量在200GB内 boot_volume_size_gb 40 # 将默认的47GB缩减到40GB public_ssh_key file(/home/username/.ssh/oci_k8s_id_rsa.pub)关键点boot_volume_size_gb必须设置且要计算好总用量控制平面节点数 工作节点数*boot_volume_size_gb 200GB。初始化与应用配置terraform init # 初始化下载OCI的Provider terraform plan # 预览将要创建的资源务必仔细核对确认形状、数量符合免费套餐 terraform apply -auto-approve # 自动创建资源terraform apply成功后会输出节点的私有IP、公共负载均衡器的IP等信息。记下这些信息后续连接集群要用。3.3 K8s集群的安装与配置基础设施就绪后就需要在这些虚拟机上安装Kubernetes。通常采用kubeadm这个官方工具。通过Bastion主机连接私有节点由于节点在私有子网我们需要通过一个在公共子网的Bastion主机跳板机进行SSH跳转。Terraform脚本通常会自动创建并配置好Bastion。# 假设Bastion的公网IP是 123.123.123.123控制平面节点的私有IP是 10.0.2.10 ssh -i ~/.ssh/oci_k8s_id_rsa -o ProxyCommandssh -W %h:%p -i ~/.ssh/oci_k8s_id_rsa opc123.123.123.123 opc10.0.2.10为了方便建议将SSH配置写入~/.ssh/config文件Host oci-bastion HostName 123.123.123.123 User opc IdentityFile ~/.ssh/oci_k8s_id_rsa Host control-plane-1 HostName 10.0.2.10 User opc IdentityFile ~/.ssh/oci_k8s_id_rsa ProxyJump oci-bastion之后就可以直接用ssh control-plane-1登录了。在所有节点上安装基础软件需要在所有节点控制平面和工作节点上执行。# 1. 关闭SwapKubernetes要求 sudo swapoff -a sudo sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstab # 永久禁用 # 2. 安装容器运行时例如containerd sudo apt-get update sudo apt-get install -y containerd sudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml # 修改 config.toml将SystemdCgroup设为true这对K8s集成更好 sudo sed -i s/SystemdCgroup false/SystemdCgroup true/ /etc/containerd/config.toml sudo systemctl restart containerd sudo systemctl enable containerd # 3. 安装kubeadm, kubelet, kubectl sudo apt-get install -y apt-transport-https ca-certificates curl curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg echo deb [signed-by/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ / | sudo tee /etc/apt/sources.list.d/kubernetes.list sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl # 防止自动更新初始化控制平面在第一个控制平面节点上执行。# 使用之前Terraform输出的负载均衡器私有IP作为控制平面端点 sudo kubeadm init --control-plane-endpoint 10.0.2.100:6443 --upload-certs --pod-network-cidr10.244.0.0/16--control-plane-endpoint: 这里应填写OCI内网负载均衡器的私有IP和端口。这是实现高可用的关键其他控制平面节点和所有工作节点都将通过这个地址连接API Server。--upload-certs: 自动上传证书方便其他控制平面节点加入。--pod-network-cidr: 指定Pod网络的CIDR需要与后续安装的网络插件如Flannel匹配。初始化成功后会输出kubeadm join命令和配置kubectl的指令。务必保存好。配置kubectl并安装网络插件mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 安装Flannel网络插件 kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml等待所有Pod变为Running状态kubectl get pods -n kube-system -w加入其他节点加入其他控制平面节点使用kubeadm init输出中那个带有--control-plane和--certificate-key的join命令在第二、第三个控制平面节点上执行。加入工作节点使用kubeadm init输出的另一个普通的join命令在所有工作节点上执行。使用kubectl get nodes查看所有节点状态等待它们都变成Ready。4. 集群组件部署与优化配置一个基础的K8s集群运行起来后还需要部署一些必要的附加组件才能让它真正“好用”。4.1 负载均衡器与Ingress Controller集成我们需要让外部流量能够访问集群内运行的服务。部署NGINX Ingress Controller这是最流行的Ingress控制器之一。# 使用Helm安装 helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update helm install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --create-namespace \ --set controller.service.typeLoadBalancer \ --set controller.service.annotations.service\.beta\.kubernetes\.io/oci-load-balancer-shapeflexible \ --set controller.service.annotations.service\.beta\.kubernetes\.io/oci-load-balancer-shape-flex-min10 \ --set controller.service.annotations.service\.beta\.kubernetes\.io/oci-load-balancer-shape-flex-max100通过typeLoadBalancerK8s会自动在OCI上创建一个新的负载均衡器LB来服务Ingress Controller。注解annotations是OCI云提供商特有的配置这里指定了LB的形状为“flexible”并设置带宽范围。重要这个新创建的LB不在免费套餐内会产生费用对于免费环境一个更经济的做法是复用之前为kube-apiserver创建的那个免费LB通过Host-based路由或不同的端口来区分API流量和业务流量。但这需要更复杂的手动配置。配置DNS与证书有了公网IP后可以将其绑定到一个域名如k8s.demo.com。为了启用HTTPS可以在集群内安装cert-manager来自动从Let‘s Encrypt申请和管理免费SSL证书。# 安装cert-manager helm repo add jetstack https://charts.jetstack.io helm repo update helm install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --version v1.13.0 \ --set installCRDstrue然后创建ClusterIssuer资源和Ingress资源时添加相应注解即可自动签发证书。4.2 存储与监控方案选型免费环境下的存储和监控需要选择轻量级方案。存储StorageClassOCI提供了块存储CSI驱动。我们可以为其创建对应的StorageClass使Pod能够动态申请持久卷PV。# oci-bv-sc.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: oci-bv provisioner: blockvolume.csi.oraclecloud.com reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer parameters: availabilityDomain: XaGi:PHX-AD-1 # 需要替换为你的可用性域名应用后Pod就可以通过PersistentVolumeClaim申请使用OCI的块存储了。注意动态创建的块存储卷是收费资源在免费套餐外。监控部署全套Prometheus Grafana对免费资源来说过于沉重。推荐使用轻量级的metrics-server用于kubectl top命令和HPA和kube-state-metrics。# 安装metrics-server kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml # 可能需要修改部署参数添加--kubelet-insecure-tls等对于日志可以使用轻量的Fluent Bit进行采集和转发到外部免费日志服务或在单个节点上运行Loki进行小规模存储。4.3 安全加固与日常维护安全无小事即使是实验环境。Pod安全策略PSP或Pod安全准入PSA在新版K8s中PSP已被废弃推荐使用Pod Security Admission。可以在命名空间级别设置基线baseline或限制restricted策略。# namespace-psa.yaml apiVersion: v1 kind: Namespace metadata: name: my-secure-app labels: pod-security.kubernetes.io/enforce: baseline pod-security.kubernetes.io/enforce-version: latest网络策略NetworkPolicy使用Calico等CNI插件Flannel默认不支持网络策略来定义Pod之间的网络访问规则实现微服务间的网络隔离。日常维护命令节点维护如果某个免费实例因OCI维护需要重启可以先将节点标记为不可调度并驱逐Podkubectl drain node-name --ignore-daemonsets --delete-emptydir-data。维护完成后再取消标记kubectl uncordon node-name。资源清理定期清理完成的Job、Evicted状态的Pod、未使用的PVC等kubectl delete jobs --field-selector status.successful1。5. 常见问题排查与性能优化实录在实操过程中我遇到了不少坑。这里把典型问题和解决方案记录下来希望能帮你节省时间。5.1 部署阶段常见问题问题1kubeadm init卡在[kubelet-check]或[control-plane]阶段。排查首先在所有节点检查kubelet服务状态sudo systemctl status kubelet。查看日志sudo journalctl -xeu kubelet。常见原因与解决容器运行时未就绪确认containerd或docker正在运行。containerd需要正确的cgroup配置。Swap未关闭再次执行sudo swapoff -a并确认/etc/fstab中swap行已被注释。防火墙/安全组规则确保OCI安全列表Security List或网络安全组NSG允许控制平面节点之间、以及节点与负载均衡器之间在端口6443API Server、2379-2380etcd、10250kubelet等上的通信。这是最容易出错的地方必须为私有子网的安全列表添加入站规则允许来自VCN CIDR如10.0.0.0/16的所有流量或至少上述端口。资源不足VM.Standard.E2.1.Micro只有1GB内存kubeadm init时可能因内存不足而失败。尝试在初始化命令中添加--ignore-preflight-errorsMem不推荐长期使用或者考虑使用一台ARM实例作为首个控制平面。问题2工作节点加入集群时失败提示error: unable to fetch server certificate或超时。排查在待加入的节点上检查能否ping通--control-plane-endpoint指定的地址负载均衡器IP。常见原因与解决负载均衡器后端集Backend Set未配置健康检查或未注册后端你需要手动在OCI控制台为kube-apiserver的负载均衡器后端集添加健康检查例如TCP:6443并将所有控制平面节点的私有IP和6443端口注册为后端服务器。证书不匹配确保所有节点的时间同步sudo chronyd -q。重新生成join token在控制平面节点执行kubeadm token create --print-join-command。5.2 运行阶段常见问题问题3Pod一直处于Pending状态kubectl describe pod显示0/1 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }。原因Pod被调度到了控制平面节点但控制平面节点默认有污点taint阻止普通Pod调度。解决方案A推荐为你的Pod添加对应的容忍toleration或者更常见的做法是只为工作节点打上工作负载标签并在Deployment中指定nodeSelector。# 给工作节点打标签 kubectl label nodes worker-node-name node-typeworker # 在Pod spec中指定 spec: nodeSelector: node-type: worker方案B移除控制平面节点的污点仅用于学习环境生产环境不推荐kubectl taint nodes control-plane-node-name node-role.kubernetes.io/control-plane-问题4部署应用后通过Ingress无法访问kubectl get ingress显示地址为空。排查检查Ingress Controller的Pod是否运行正常kubectl get pods -n ingress-nginx。查看其日志kubectl logs -n ingress-nginx -l app.kubernetes.io/componentcontroller。常见原因OCI负载均衡器配置问题检查OCI控制台Ingress Controller服务创建的LB及其后端集、监听器、路由规则是否配置正确。Ingress Class未指定或错误确保Ingress资源中指定了正确的ingressClassName例如nginx。Service端口映射错误确认Ingress中backend.service.port.number指向的端口与你的应用Service暴露的端口一致。5.3 免费环境下的性能优化技巧资源有限优化无止境。控制平面组件资源限制为kube-apiserver、kube-controller-manager、kube-scheduler等静态Pod编辑manifest文件位于/etc/kubernetes/manifests/添加resources.requests和resources.limits防止它们占用过多内存导致节点OOM内存溢出。# 例如编辑 /etc/kubernetes/manifests/kube-apiserver.yaml apiVersion: v1 kind: Pod metadata: name: kube-apiserver namespace: kube-system spec: containers: - command: - kube-apiserver ... resources: requests: memory: 256Mi cpu: 250m limits: memory: 512Mi cpu: 500m调整kubelet配置对于内存只有1GB的节点可以调整kubelet的垃圾回收阈值更激进地清理未使用的镜像和容器。# 编辑 /var/lib/kubelet/config.yaml 或通过kubelet参数 # 添加或修改以下参数 imageGCHighThresholdPercent: 85 imageGCLowThresholdPercent: 80 evictionHard: memory.available: 200Mi nodefs.available: 10%修改后重启kubeletsudo systemctl restart kubelet。选择轻量级基础镜像在构建应用镜像时使用Alpine Linux、Distroless等小型基础镜像可以显著减少镜像拉取时间和节点磁盘占用。利用Horizontal Pod Autoscaler (HPA)虽然节点数量固定但你可以为无状态应用配置HPA根据CPU/内存使用率自动调整Pod副本数在有限的节点资源内实现弹性伸缩。整个项目实践下来最大的收获不是成功搭建了一个集群而是在严格的资源限制下逼着自己去理解每一个组件的作用、每一项配置的意义以及如何权衡与取舍。这比在资源无限的云环境里“一键部署”要深刻得多。这个免费的K8s沙盒不仅是学习工具更是一个绝佳的架构思维训练场。当你成功地在上面跑起自己的第一个微服务应用并通过Ingress和证书安全地暴露到公网时那种成就感是实实在在的。最后一个小建议定期检查OCI的“成本分析”页面确保所有资源都在“始终免费”的范围内安心享受这个免费的云原生实验室。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2620874.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!