利用Oracle Cloud免费资源构建高可用Kubernetes集群实战指南

发布时间:2026/5/17 10:09:09

利用Oracle Cloud免费资源构建高可用Kubernetes集群实战指南 1. 项目概述在免费云资源上构建高可用K8s集群最近在折腾一个很有意思的项目起因是想找一个能长期稳定运行、又不花钱的Kubernetes环境用来做个人项目的CI/CD流水线、微服务原型验证或者干脆就是当个“玩具”集群来练手。市面上免费的K8s服务不少但要么有严格的资源限制要么就是有时间限制比如只免费几个月。后来我把目光投向了Oracle Cloud Infrastructure的“永久免费套餐”它提供了相当慷慨的免费资源包括4个AMD计算实例和2个ARM计算实例以及100GB的块存储。这让我萌生了一个想法能不能用这些免费的资源手动搭建一个高可用的Kubernetes集群于是就有了这个“nce/oci-free-cloud-k8s”项目。这个项目的核心目标就是利用OCI的永久免费资源从零开始部署一个生产就绪级别的K8s集群。它不仅仅是把K8s跑起来那么简单而是要实现控制平面的高可用、工作节点的弹性伸缩在免费额度内、以及完整的网络、存储和监控方案。整个过程涉及从云账户和资源规划、操作系统和内核调优、Kubernetes各组件的编译与部署到网络插件选型、存储方案集成、安全加固和监控告警等一系列复杂但必要的步骤。对于想深入理解K8s底层架构、学习云原生基础设施搭建或者单纯想拥有一个免费、可控的K8s环境的开发者来说这是一个极具实践价值的项目。2. 核心需求与架构设计解析2.1 为什么选择OCI免费套餐作为基础首先得聊聊为什么是Oracle Cloud。它的永久免费套餐在资源额度上确实有吸引力4个OCPU和24GB内存的AMD VM.Standard.E2.1.Micro实例以及最多4个OCPU和24GB内存的ARM VM.Standard.A1.Flex实例可以拆分成多个小实例。此外还有200GB的块存储总容量。这些资源对于搭建一个最小化的高可用K8s集群例如3个控制平面节点2个工作节点是足够的。更重要的是“永久免费”这个承诺意味着只要不超出免费额度这个集群可以一直运行下去为个人学习和小型项目提供了稳定的基础设施。但挑战也随之而来。免费实例的性能尤其是CPU和网络I/O有限资源规格固定比如AMD实例是1个OCPU和1GB内存这要求我们在架构设计时必须精打细算不能像在付费环境那样“挥霍”。例如我们需要选择资源消耗更轻量的容器运行时、网络插件和监控方案。同时OCI免费套餐的网络模型特别是VCN和子网配置与AWS、GCP略有不同需要针对性地进行网络规划。2.2 高可用Kubernetes集群架构选型基于免费资源的限制我们采用了以下架构设计控制平面高可用使用3个AMD免费实例VM.Standard.E2.1.Micro作为控制平面节点。每个节点运行kube-apiserver、kube-controller-manager、kube-scheduler和etcd。通过负载均衡器使用OCI的免费负载均衡器或自建keepalivedhaproxy将API Server的流量分发到三个节点实现API Server层的高可用。etcd集群以奇数节点部署确保数据一致性和高可用。工作节点池使用ARM免费实例VM.Standard.A1.Flex作为工作节点。我们可以创建2个实例每个分配2个OCPU和12GB内存或者创建4个实例每个分配1个OCPU和6GB内存。ARM架构对于运行大多数Linux容器应用是兼容的且性价比更高。工作节点负责运行实际的Pod。网络方案选择Calico作为网络插件。它功能强大支持网络策略且对资源消耗相对可控。我们需要在OCI的VCN中正确配置路由表和安全列表以允许Calico的BGP或IPIP流量在节点间通信。存储方案利用OCI提供的100GB免费块存储。我们可以为需要持久化存储的应用创建PersistentVolume并配合CSI驱动如csi-oci来动态供给存储。对于不需要高性能的共享存储也可以考虑使用NFS或Ceph的轻量级部署。入口与负载均衡对于需要对外暴露的服务可以使用OCI的免费负载均衡器有10Mbps带宽限制或者使用MetalLBBGP模式需要云提供商支持在OCI中可能受限或nginx-ingress等方案在集群内部实现负载均衡。这个架构的核心思想是在严格的免费资源约束下最大化集群的可用性、功能性和可维护性。每一个组件的选型都经过了资源消耗、功能需求和社区支持度的权衡。3. 环境准备与系统配置3.1 OCI账户与资源初始化第一步是在Oracle Cloud上注册并激活“永久免费套餐”。成功之后我们需要创建以下资源隔离的虚拟云网络VCN为K8s集群创建一个独立的VCN例如CIDR为10.0.0.0/16。在这个VCN内我们需要创建两个子网控制平面子网例如10.0.1.0/24用于部署3个控制平面节点。这个子网通常不需要直接对外暴露可以设置为私有子网。工作节点子网例如10.0.2.0/24用于部署ARM工作节点。根据是否需要直接SSH访问可以设置为公有或私有子网。计算实例创建3个VM.Standard.E2.1.Micro实例AMD选择Oracle Linux 8或Ubuntu 20.04/22.04作为镜像。主机名可以设为k8s-master-01k8s-master-02k8s-master-03。确保它们被分配到“控制平面子网”。创建2个或更多VM.Standard.A1.Flex实例ARM同样选择兼容的操作系统。主机名设为k8s-worker-01k8s-worker-02。分配到“工作节点子网”。安全列表Security List这是OCI中类似安全组的概念。我们需要为K8s集群节点所在的子网配置宽松的内部通信规则以及有限的对外访问规则。关键端口包括节点间通信2379-2380(etcd)6443(kube-apiserver)10250(kubelet)10259(kube-scheduler)10257(kube-controller-manager)30000-32767(NodePort服务) 以及179(Calico BGP)。外部访问22(SSH)80和443如果通过负载均衡器暴露服务。块存储创建至少一块50GB的块存储卷用于后续作为持久化存储使用。可以挂载到某个工作节点上并格式化为ext4或xfs文件系统。注意OCI免费负载均衡器有每月10Mbps的带宽限制和10个后端服务器的限制。对于API Server的负载均衡如果担心性能或限制一个可靠的替代方案是在控制平面节点上使用keepalived和haproxy自建一个高可用的VIP。这需要额外配置一个虚拟IP并在VCN中允许VRRP协议协议号112的通信。3.2 操作系统与内核调优所有节点创建好后通过SSH登录进行统一的系统配置。以下以Oracle Linux 8为例。禁用SwapKubernetes要求禁用Swap以确保内存管理的稳定性。sudo swapoff -a # 永久禁用编辑 /etc/fstab注释掉swap相关的行 sudo sed -i /swap/s/^/#/ /etc/fstab配置防火墙如果使用firewalld需要放行K8s相关端口。更简单的做法是在实验环境中暂时禁用防火墙但在生产观念下应精确配置规则。# 方法一禁用不推荐用于长期运行 sudo systemctl stop firewalld sudo systemctl disable firewalld # 方法二配置规则推荐 sudo firewall-cmd --permanent --add-port{6443,2379-2380,10250,10251,10252,30000-32767}/tcp sudo firewall-cmd --permanent --add-port179/tcp # Calico BGP sudo firewall-cmd --reload加载内核模块并配置sysctlK8s需要一些特定的内核模块和网络参数。# 加载模块 sudo modprobe overlay sudo modprobe br_netfilter # 创建sysctl配置文件 cat EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 EOF sudo sysctl --system安装容器运行时选择containerd因为它比Docker更轻量且是K8s默认推荐的CRI。# 安装containerd sudo yum install -y containerd.io # 生成默认配置并启用Systemd Cgroup驱动与K8s保持一致 sudo containerd config default | sudo tee /etc/containerd/config.toml sudo sed -i s/SystemdCgroup false/SystemdCgroup true/ /etc/containerd/config.toml sudo systemctl enable --now containerd安装kubeadm, kubelet和kubectl使用阿里云或官方镜像源。cat EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled1 gpgcheck1 repo_gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF sudo yum install -y kubelet kubeadm kubectl --disableexcludeskubernetes sudo systemctl enable --now kubelet实操心得在ARM工作节点上上述yum源可能不适用。对于ARM架构aarch64需要寻找对应的镜像源或者从Kubernetes官方GitHub Release页面下载kubeadm、kubelet、kubectl的ARM版本二进制文件手动安装并配置服务。这是混合架构集群搭建的一个小坑点。4. 使用kubeadm部署高可用控制平面4.1 初始化第一个控制平面节点在k8s-master-01上我们使用kubeadm初始化集群。由于资源有限我们需要精心规划Pod的子网--pod-network-cidr确保不与VCN子网冲突并且为Calico预留空间。# 在 k8s-master-01 上执行 sudo kubeadm init \ --control-plane-endpoint k8s-api-vip:6443 \ # 使用负载均衡器VIP或域名 --upload-certs \ --pod-network-cidr192.168.0.0/16 \ # Calico默认使用的CIDR可根据需要修改 --image-repository registry.aliyuncs.com/google_containers # 使用国内镜像加速 # 初始化成功后配置kubectl mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config这里的关键是--control-plane-endpoint。如果我们使用OCI负载均衡器这里应该填写负载均衡器的公共IP或域名。如果使用自建的keepalivedhaproxy则填写虚拟IPVIP。--upload-certs参数会将证书加密上传方便其他控制平面节点加入。4.2 部署Pod网络插件Calico在加入其他节点之前先在第一个主节点上部署Calico。下载对应的Calico manifest文件选择与K8s版本兼容的版本例如tigera-operator。# 例如安装Calico v3.26 kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/tigera-operator.yaml # 然后安装自定义资源其中可以指定IP池CIDR需要与kubeadm初始化时一致 kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/custom-resources.yaml部署完成后使用kubectl get pods -n calico-system检查所有Pod是否运行正常。4.3 加入其他控制平面节点和工作节点加入第二个和第三个控制平面节点在k8s-master-01上执行kubeadm init时输出的命令中包含了kubeadm join命令以及--control-plane和--certificate-key参数。复制该命令分别在k8s-master-02和k8s-master-03上执行。# 在 k8s-master-02 和 k8s-master-03 上分别执行命令示例具体参数以实际输出为准 sudo kubeadm join k8s-api-vip:6443 --token token \ --discovery-token-ca-cert-hash sha256:hash \ --control-plane --certificate-key certificate-key加入后同样需要配置kubectl。加入ARM工作节点工作节点的加入命令不包含--control-plane和--certificate-key参数。同样从第一个主节点的输出中获取命令在k8s-worker-01和k8s-worker-02上执行。sudo kubeadm join k8s-api-vip:6443 --token token \ --discovery-token-ca-cert-hash sha256:hash注意事项证书密钥有效期kubeadm init生成的--certificate-key默认24小时有效。如果过期可以在第一个主节点上用kubeadm init phase upload-certs --upload-certs重新生成。节点污点控制平面节点默认有node-role.kubernetes.io/master:NoSchedule污点K8s 1.24是node-role.kubernetes.io/control-plane:NoSchedule。这意味着普通Pod不会被调度到主节点上。如果你想在免费资源下最大化利用可以考虑移除这个污点kubectl taint nodes --all node-role.kubernetes.io/master-但这不是生产环境的推荐做法。ARM节点兼容性确保在ARM节点上部署的Pod镜像支持linux/arm64架构。许多官方镜像都是多架构的但一些特定应用的镜像可能需要自己构建或寻找ARM版本。5. 关键组件部署与集群功能完善5.1 配置OCI Cloud Controller Manager (CCM)为了让K8s集群感知到OCI的云环境例如自动为LoadBalancer类型的Service创建OCI负载均衡器我们需要部署OCI Cloud Controller Manager。OCI提供了对应的Helm Chart。# 添加OCI Helm仓库 helm repo add oci https://oracle.github.io/cloud-provider-oci helm repo update # 安装OCI CCM需要提供OCI配置如区域、租户OCID、用户OCID、API密钥指纹等。 # 这些敏感信息建议通过Secret管理。 helm install oci-cloud-controller-manager oci/oci-cloud-controller-manager \ --namespace kube-system \ --set regionus-ashburn-1 \ --set tenancyIdocid1.tenancy.oc1... \ --set auth.principalTypeinstance_principal \ # 使用实例主体认证无需密钥文件 --set vcnIdocid1.vcn.oc1...使用实例主体认证Instance Principal是最安全便捷的方式它允许实例通过其元数据服务进行认证无需在集群中存储API密钥。部署CCM后创建LoadBalancer类型的Service时K8s会自动在OCI中创建对应的负载均衡器资源。5.2 部署CSI驱动实现动态存储供给OCI提供了Container Storage Interface (CSI)驱动允许K8s动态创建、挂载和管理OCI块存储卷。# 添加OCI CSI驱动Helm仓库 helm repo add oci-csi https://oracle.github.io/oci-cloud-controller-manager helm repo update # 安装CSI驱动同样推荐使用实例主体认证 helm install oci-csi-driver oci-csi/oci-csi-driver \ --namespace kube-system \ --set cloudController.regionus-ashburn-1 \ --set cloudController.auth.principalTypeinstance_principal \ --set storageClass.isDefaulttrue # 设为默认StorageClass安装成功后会创建一个名为oci或你指定的名字的StorageClass。当用户创建PersistentVolumeClaim时集群会自动在OCI中创建一块块存储并将其挂载到Pod所在的节点上。5.3 部署Ingress Controller与证书管理对外提供服务我们通常使用Ingress。nginx-ingress是一个成熟的选择。我们可以将其部署在工作节点上并通过OCI负载均衡器由CCM自动创建暴露其Service。# 使用Helm安装ingress-nginx 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上述注解指定了使用OCI的灵活负载均衡器形状最小带宽10Mbps免费额度最大100Mbps。这能有效控制成本。为了启用HTTPS我们可以使用cert-manager来自动从Let‘s Encrypt申请和续期免费证书。# 安装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使用HTTP-01或DNS-01挑战来验证域名所有权并签发证书。5.4 部署监控与告警栈轻量级方案在免费资源限制下部署完整的Prometheus Operator可能资源吃紧。我们可以选择更轻量的方案如kube-prometheus-stack的精简配置或者使用victoriametrics的单节点版本。这里以部署一个基础版Prometheus和Grafana为例# 创建监控专用的命名空间 kubectl create namespace monitoring # 部署Prometheus Server (使用ConfigMap管理配置) kubectl apply -f https://raw.githubusercontent.com/prometheus/prometheus/main/documentation/examples/prometheus-kubernetes.yml -n monitoring # 部署Node ExporterDaemonSet每个节点一个 kubectl apply -f https://raw.githubusercontent.com/prometheus/node_exporter/master/examples/kubernetes-daemonset.yaml -n monitoring # 部署Grafana helm repo add grafana https://grafana.github.io/helm-charts helm install grafana grafana/grafana \ --namespace monitoring \ --set persistence.enabledfalse \ # 免费环境可关闭持久化数据会丢失 --set adminPasswordadmin \ # 设置初始密码 --set service.typeLoadBalancer # 通过负载均衡器暴露部署后获取Grafana的LoadBalancer IP用admin/admin登录并添加Prometheus地址为http://prometheus-server.monitoring.svc.cluster.local:9090作为数据源然后导入常用的K8s集群监控仪表盘如ID为3119的仪表盘。6. 运维、问题排查与优化实践6.1 日常运维命令与状态检查集群搭建完成后以下是一些常用的运维命令查看节点状态kubectl get nodes -o wide查看所有Pod状态kubectl get pods -A查看系统组件状态kubectl get pods -n kube-system查看集群事件kubectl get events -A --sort-by.lastTimestamp查看服务kubectl get svc -A查看存储类kubectl get storageclass查看Ingresskubectl get ingress -A定期检查节点资源使用情况确保没有节点因内存或CPU压力过大而出现异常。kubectl top nodes kubectl top pods -A6.2 常见问题与排查思路在OCI免费环境运行K8s可能会遇到一些典型问题Pod一直处于Pending状态原因最常见的原因是资源不足CPU/内存或没有合适的节点污点、节点选择器。排查kubectl describe pod pod-name -n namespace查看Events部分。如果显示Insufficient cpu/memory则需要优化应用资源请求或扩容节点。如果是污点问题需要调整Pod的容忍度或节点的污点。网络问题Pod间无法通信原因Calico未正常运行或OCI安全列表规则未正确配置。排查检查Calico Pod状态kubectl get pods -n calico-system。在一个Pod内ping另一个Pod的IPkubectl exec -it pod-a -- ping pod-b-ip。检查节点间网络在节点上ping其他节点的内网IP。如果节点间不通检查OCI VCN的路由表和子网的安全列表确保10.0.0.0/16或你的VCN CIDR内部流量是允许的并且Calico所需的端口如BGP的179已开放。无法从外网访问LoadBalancer服务原因OCI负载均衡器配置问题或安全列表/网络安全组未放行流量。排查在OCI控制台检查负载均衡器的状态是否为“运行中”后端集健康检查是否通过。检查负载均衡器关联的子网的安全列表是否允许来自外网0.0.0.0/0的流量访问服务端口如80、443。检查负载均衡器的网络是否与后端实例在同一VCN或已正确对等连接。存储卷无法挂载原因CSI驱动问题或实例没有挂载卷的权限。排查检查CSI驱动Pod日志kubectl logs -f -n kube-system -l appoci-csi-controller。检查PersistentVolume和PersistentVolumeClaim的状态kubectl get pv,pvc。确认实例使用的动态组Dynamic Group和策略Policy是否正确配置赋予了实例管理块存储的权限。6.3 资源优化与成本控制技巧免费资源有限优化至关重要设置合理的资源请求和限制为每个Pod的容器设置requests和limits防止单个Pod耗尽节点资源。使用Vertical Pod AutoscalerVPA可以自动调整资源请求但部署VPA本身也有开销在极小规模集群中需权衡。利用HPA进行弹性伸缩对于无状态应用部署Horizontal Pod AutoscalerHPA根据CPU/内存使用率自动增减Pod副本数。在免费额度内我们可以设置最小副本数为1最大为2或3。选择轻量级基础镜像使用Alpine Linux、Distroless等小型基础镜像构建应用可以显著减少镜像拉取时间和节点存储占用。定期清理资源删除不再使用的Pod、Deployment、Service、PVC等资源。特别是Completed或Error状态的Job Pod以及none标签的旧镜像docker system prune或crictl rmi。监控免费额度使用情况定期登录OCI控制台查看“成本分析”和“限额、使用情况和可用性”仪表板确保没有超出免费额度尤其是块存储和负载均衡器带宽。6.4 备份与灾难恢复简易方案对于个人项目一个简单的备份方案就足够了etcd备份etcd保存了集群的所有状态。定期备份etcd数据是关键。# 在任一控制平面节点上执行 sudo ETCDCTL_API3 etcdctl \ --endpointshttps://127.0.0.1:2379 \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ --cert/etc/kubernetes/pki/etcd/server.crt \ --key/etc/kubernetes/pki/etcd/server.key \ snapshot save /opt/etcd-backup/snapshot-$(date %Y%m%d).db可以将备份文件上传到OCI对象存储有免费额度。资源声明备份使用kubectl导出关键命名空间的所有资源定义。kubectl get all,secret,configmap,pvc,ingress -n important-namespace -o yaml backup-$(date %Y%m%d).yaml恢复测试定期在测试集群中演练恢复流程确保备份有效。恢复etcd后使用kubeadm的--ignore-preflight-errorsDirAvailable--var-lib-etcd等参数进行集群恢复。通过这个项目我们不仅获得了一个免费的、高可用的Kubernetes实验环境更深入地走了一遍云原生基础设施从规划、部署到运维的完整流程。每一个步骤中的决策、踩过的坑和解决的方案都是宝贵的实战经验。这个集群完全可以作为个人学习、开发测试甚至小型生产应用的可靠平台。

相关新闻