Go不直接部署Kubernetes应用,而是通过client-go安全高效地构造合法对象并提交至API Server;需匹配版本、正确处理Replicas类型、用RBAC认证、安全注入ConfigMap/Secret、禁用CGO构建轻量镜像、Reconcile函数须非阻塞且幂等。
Go 本身不部署 Kubernetes 应用,它只负责写控制面逻辑或客户端工具;真正部署靠的是 kubectl、Helm 或 CI/CD 流水线调用 Kubernetes API —— 但 Go 可以安全、高效地与集群交互。
用 client-go 连接集群并创建 Deployment
这是最常见需求:从 Go 程序里动态创建一个 Pod 模板。关键不是“部署”,而是“构造合法对象 + 提交到 API Server”。
-
client-go必须匹配目标 Kubernetes 版本(如 v1.28 集群建议用kubernetes-1.28.0tag),否则Apply或Create可能静默失败 - 认证方式优先用 ServiceAccount + RBAC,避免硬编码
~/.kube/config;本地调试时可通过rest.InClusterConfig()(Pod 内)或clientcmd.BuildConfigFromFlags()(本地)加载 - Deployment 对象的
Spec.Replicas必须是 *int32 类型,直接写1会编译报错,得用ptr.To(int32(1))
示例片段:
dep := &appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{Name: "my-app"},
Spec: appsv1.DeploymentSpec{
Replicas: ptr.To(int32(2)),
Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"app": "my-app"}},
Template: corev1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{Labels: map[string]string{"app": "my-app"}},
Spec: corev1.PodSpec{
Containers: []corev1.Container{{
Name: "server",
Image: "my-registry/my-app:v1.2",
}},
},
},
},
}
_, err := clientset.AppsV1().Deployments("default").Create(ctx, dep, metav1.CreateOptions{})
在 Go 中安全注入 ConfigMap / Secret 到容器环境
硬编码配置或密钥到镜像里是反模式;Go 程序启动时读取 ConfigMap 或 Secret 是常规做法,但要注意权限和时机。