在Ubuntu中安装Kubernetes并使用GitLab CI进行部署

💡 原文中文,约6400字,阅读约需16分钟。
📝

内容提要

本文介绍在Ubuntu上安装Kubernetes并通过GitLab CI实现自动部署:关闭swap、启用IPv4转发,安装kubelet、kubeadm、kubectl,配置containerd国内镜像与私有仓库;Master节点用kubeadm init初始化并安装Calico网络插件,Worker节点加入集群;在GitLab Runner安装kubectl并配置kubeconfig,通过.gitlab-ci.yml自动部署。

🔎

延伸解读

国内环境下的镜像与仓库适配

文章针对国内网络环境做了多处适配:containerd 配置中将 pause 镜像替换为阿里云地址,kubeadm 初始化时指定阿里云镜像仓库,并为 HTTP 私有仓库配置了 insecure 跳过 TLS 验证。这些操作能减少镜像拉取失败,但需注意私有仓库地址和端口需按实际环境替换,且 insecure 方式仅建议在受信任的内网中使用。

集群初始化的关键参数与常见疏漏

kubeadm init 时必须携带 --pod-network-cidr 和 --image-repository 参数,否则容易出现镜像拉取失败或网络插件无法正常工作。文章还提醒在初始化前清理旧集群残留(如 /etc/kubernetes、/var/lib/etcd 等),并预拉镜像、为 pause 镜像打上官方标签,这些步骤能避免因镜像标签不匹配导致的启动问题。

GitLab CI 自动部署的权限与触发设计

部署 job 通过 File 类型变量 KUBECONFIG_FILE 注入 kubeconfig,并设置 KUBECONFIG 环境变量供 kubectl 使用。该 job 仅在流水线计划调度触发时执行,其他触发来源跳过,适合定时或手动触发的部署场景。需确保 GitLab Runner 用户对 kubeconfig 文件有读取权限,且 kubectl 已安装。

Q&A

在Ubuntu上安装Kubernetes前,所有节点必须执行哪些前置操作?

必须关闭swap并启用IPv4数据包转发。关闭swap:sudo swapoff -a 和 sudo sed -i '/swap/s/^/#/' /etc/fstab。启用IPv4转发:创建/etc/sysctl.d/k8s.conf文件,添加net.ipv4.ip_forward = 1,然后执行sudo sysctl --system,并用sysctl net.ipv4.ip_forward验证。

如何安装kubelet、kubeadm和kubectl?

更新apt索引并安装依赖:sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl gpg。添加Kubernetes apt仓库:下载签名密钥并保存到/etc/apt/keyrings/kubernetes-apt-keyring.gpg,然后添加仓库源。最后执行sudo apt-get update && sudo apt-get install -y kubelet kubeadm kubectl,并用sudo apt-mark hold锁定版本。

如何配置containerd以使用国内镜像和HTTP私有仓库?

备份并重新生成containerd配置:sudo cp /etc/containerd/config.toml /etc/containerd/config.toml.bak 和 sudo containerd config default | sudo tee /etc/containerd/config.toml。修改pause镜像为阿里云:sudo sed -i 's#registry.k8s.io/pause#registry.aliyuncs.com/google_containers/pause#g' /etc/containerd/config.toml,并启用SystemdCgroup:sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml。对于HTTP私有仓库,编辑/etc/containerd/config.toml,在[plugins.'io.containerd.cri.v1.images'.registry]下添加mirrors和configs配置,指定endpoint和insecure_skip_verify = true。最后重启containerd。

Master节点初始化Kubernetes集群的步骤是什么?

先清理旧集群:sudo kubeadm reset -f,删除相关目录并重置iptables。预拉镜像:sudo kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.37.0。给pause镜像打官方标签:sudo ctr -n k8s.io images tag registry.aliyuncs.com/google_containers/pause:3.10.2 registry.k8s.io/pause:3.10.2。执行初始化:sudo kubeadm init --apiserver-advertise-address=10.150.12.160 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.37.0 --pod-network-cidr=192.168.0.0/16。保存输出的join命令,并配置kubectl权限。

如何安装Calico网络插件并验证集群?

下载Calico yaml并应用:curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.32.2/manifests/calico.yaml 和 kubectl apply -f calico.yaml。监控Pod状态:kubectl get pods -n kube-system -w,等待calico-node和calico-kube-controllers变为Running。检查节点状态:kubectl get nodes,节点应从NotReady变为Ready。集群验证:kubectl get nodes查看节点状态,kubectl get cs查看组件状态,并创建测试Pod:kubectl create deployment nginx --image=nginx。

如何通过GitLab CI自动部署应用到Kubernetes集群?

在GitLab Runner服务器上安装kubectl,并将kubeconfig复制到/home/gitlab-runner/.kube/config,设置权限。在GitLab项目的Settings > CI/CD > Variables中添加File类型变量KUBECONFIG_FILE(内容为kubeconfig文件)。在.gitlab-ci.yml中定义k8s-deploy job,仅当流水线由schedule触发时执行。script中导出KUBECONFIG=${KUBECONFIG_FILE},然后执行kubectl cluster-info验证连接,最后kubectl apply -f k8s-deployment-${DEPLOYMENT_ENV}.yaml --validate=false进行部署。DEPLOYMENT_ENV变量对应不同环境。

🏷️

标签

➡️

继续阅读