腾讯云轻量服务器折腾 K3s 实录 (续)ArgoCD 部署避坑指南上回说到我们在腾讯云的 4G 轻量服务器上成功把 K3s 跑起来了并打通了外网kubectl的直连。今天这篇我们继续推进实战部署 GitOps 的核心控制面 ——ArgoCD。本以为有了 K8s 集群装个 ArgoCD 只是kubectl apply一把梭的事结果依然是“步步惊心”。这里把遇到的两个巨坑和终极解法记录下来。坑一ArgoCD CRD 文件过大导致 Annotation 溢出报错按照官方文档我们满心欢喜地敲下安装命令kubectl create namespace argocd kubectl apply-nargocd-fhttps://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml结果终端直接糊了一长串红字The CustomResourceDefinition applicationsets.argoproj.io is invalid: metadata.annotations: Too long: may not be more than 262144 bytes原因分析K8s 默认的kubectl apply使用的是Client-Side Apply (客户端应用)模式。它会非常实诚地把你整个 YAML 文件的内容塞进这个对象的last-applied-configuration注解 (Annotation) 里。偏偏 ArgoCD 的核心 CRD比如 ApplicationSet的声明文件巨大无比轻轻松松突破了 K8s 注解长度 256KB 的硬性限制直接被 API Server 拒收了。终极解法使用 Server-Side Apply既然客户端算不过来就把合并的压力丢给服务端。只需要在命令里加一个--server-side参数让 K8s 的 API Server 自己去处理状态合并kubectl apply --server-side-nargocd-fhttps://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml敲下这行命令看着屏幕刷刷刷地输出serverside-applied简直强迫症福音。坑二国内网络拉取沙盒镜像 (Pause) 失败导致 Pod 卡死资源对象虽然建好了但我通过kubectl get pods -n argocd一看所有的 Pod 像木头一样死死卡在ContainerCreating状态十几分钟一动不动。用describe命令深挖日志发现了老熟人Failed to pull image rancher/mirrored-pause:3.6... dial tcp 162.125.x.x:443: connect: connection refused原因分析这是国内云主机的通病。K3s/K8s 在启动任何 Pod 之前都需要先从 Docker Hub 拉取基础的沙盒镜像pause 镜像。但目前国内直连registry-1.docker.io基本被掐断连最底层的环境都初始化不了业务镜像更是没戏。终极解法给 K3s 配置国内容器镜像加速器注意K3s 底层用的是 containerd而不是 Docker所以不要去改/etc/docker/daemon.json。你需要登录到服务器上直接修改 K3s 的镜像配置表# 写入国内镜像加速源 (例如 DaoCloud, 南大源等)catEOF|sudotee/etc/rancher/k3s/registries.yamlmirrors: docker.io: endpoint: - https://docker.m.daocloud.io - https://docker.nju.edu.cn - https://registry.docker-cn.com EOF# 重启 K3s 让配置生效sudosystemctl restart k3sK3s 重启速度极快通常不到两秒。重启完成后被卡住的 Pod 就像久旱逢甘霖一样瞬间开始拉取镜像状态全部变为Running。收尾与效果验证当所有 Pod 都跑起来后为了方便在外面通过浏览器直接访问 ArgoCD 的炫酷界面我们直接把它原本内部的 ClusterIP 服务改成 NodePort并固定映射到30080端口# 暴露 NodePortkubectl patch svc argocd-server-nargocd-p{spec: {type: NodePort, ports: [{port: 443, nodePort: 30080}]}}# 窃取初始的超级管理员密码kubectl-nargocd get secret argocd-initial-admin-secret-ojsonpath{.data.password}|base64 -d;echo最后记得去腾讯云控制台的安全组里把TCP 30080端口放通。打开浏览器访问https://你的公网IP:30080忽略证书警告输入admin和刚拿到的密码。看到 ArgoCD 后台界面的那一刻所有的折腾都值了下一篇我们将继续向这台 4G 战舰里塞入 Kong 网关数据面真正把 GitOps 闭环跑通。敬请期待
腾讯云轻量服务器折腾 K3s 实录 (续):ArgoCD 部署避坑指南
腾讯云轻量服务器折腾 K3s 实录 (续)ArgoCD 部署避坑指南上回说到我们在腾讯云的 4G 轻量服务器上成功把 K3s 跑起来了并打通了外网kubectl的直连。今天这篇我们继续推进实战部署 GitOps 的核心控制面 ——ArgoCD。本以为有了 K8s 集群装个 ArgoCD 只是kubectl apply一把梭的事结果依然是“步步惊心”。这里把遇到的两个巨坑和终极解法记录下来。坑一ArgoCD CRD 文件过大导致 Annotation 溢出报错按照官方文档我们满心欢喜地敲下安装命令kubectl create namespace argocd kubectl apply-nargocd-fhttps://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml结果终端直接糊了一长串红字The CustomResourceDefinition applicationsets.argoproj.io is invalid: metadata.annotations: Too long: may not be more than 262144 bytes原因分析K8s 默认的kubectl apply使用的是Client-Side Apply (客户端应用)模式。它会非常实诚地把你整个 YAML 文件的内容塞进这个对象的last-applied-configuration注解 (Annotation) 里。偏偏 ArgoCD 的核心 CRD比如 ApplicationSet的声明文件巨大无比轻轻松松突破了 K8s 注解长度 256KB 的硬性限制直接被 API Server 拒收了。终极解法使用 Server-Side Apply既然客户端算不过来就把合并的压力丢给服务端。只需要在命令里加一个--server-side参数让 K8s 的 API Server 自己去处理状态合并kubectl apply --server-side-nargocd-fhttps://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml敲下这行命令看着屏幕刷刷刷地输出serverside-applied简直强迫症福音。坑二国内网络拉取沙盒镜像 (Pause) 失败导致 Pod 卡死资源对象虽然建好了但我通过kubectl get pods -n argocd一看所有的 Pod 像木头一样死死卡在ContainerCreating状态十几分钟一动不动。用describe命令深挖日志发现了老熟人Failed to pull image rancher/mirrored-pause:3.6... dial tcp 162.125.x.x:443: connect: connection refused原因分析这是国内云主机的通病。K3s/K8s 在启动任何 Pod 之前都需要先从 Docker Hub 拉取基础的沙盒镜像pause 镜像。但目前国内直连registry-1.docker.io基本被掐断连最底层的环境都初始化不了业务镜像更是没戏。终极解法给 K3s 配置国内容器镜像加速器注意K3s 底层用的是 containerd而不是 Docker所以不要去改/etc/docker/daemon.json。你需要登录到服务器上直接修改 K3s 的镜像配置表# 写入国内镜像加速源 (例如 DaoCloud, 南大源等)catEOF|sudotee/etc/rancher/k3s/registries.yamlmirrors: docker.io: endpoint: - https://docker.m.daocloud.io - https://docker.nju.edu.cn - https://registry.docker-cn.com EOF# 重启 K3s 让配置生效sudosystemctl restart k3sK3s 重启速度极快通常不到两秒。重启完成后被卡住的 Pod 就像久旱逢甘霖一样瞬间开始拉取镜像状态全部变为Running。收尾与效果验证当所有 Pod 都跑起来后为了方便在外面通过浏览器直接访问 ArgoCD 的炫酷界面我们直接把它原本内部的 ClusterIP 服务改成 NodePort并固定映射到30080端口# 暴露 NodePortkubectl patch svc argocd-server-nargocd-p{spec: {type: NodePort, ports: [{port: 443, nodePort: 30080}]}}# 窃取初始的超级管理员密码kubectl-nargocd get secret argocd-initial-admin-secret-ojsonpath{.data.password}|base64 -d;echo最后记得去腾讯云控制台的安全组里把TCP 30080端口放通。打开浏览器访问https://你的公网IP:30080忽略证书警告输入admin和刚拿到的密码。看到 ArgoCD 后台界面的那一刻所有的折腾都值了下一篇我们将继续向这台 4G 战舰里塞入 Kong 网关数据面真正把 GitOps 闭环跑通。敬请期待