如何在GKE集群中启用准入控制器?用于排查Nginx-Ingress问题
GKE中启用准入控制器的相关说明
首先明确回答:GKE完全支持准入控制器,不过根据控制器类型不同,启用和配置方式有所区别,下面针对你的场景详细说明:
一、GKE默认启用的准入控制器
GKE托管集群默认已经启用了一批标准的准入控制器,比如:
NamespaceLifecycleLimitRangerServiceAccountDefaultStorageClassDefaultTolerationSeconds
这些控制器无需手动启用,直接生效。如果需要使用更复杂的校验或修改逻辑(比如针对Ingress资源的自定义校验),你可以部署自定义准入Webhook(MutatingAdmissionWebhook或ValidatingAdmissionWebhook),这在GKE标准集群中是完全支持的。
二、为什么gcloud container clusters create没有相关选项
你提到在创建集群的命令参数里找不到启用准入控制器的选项,这是因为准入控制器的配置大多是在集群创建后进行的:
- 对于GKE托管集群,你无法直接修改
kube-apiserver的启动参数来添加内置准入控制器(谷歌会管理核心组件的配置); - 自定义准入Webhook是作为独立的Kubernetes资源部署的,不需要在集群创建阶段指定,而是后续通过
kubectl或API来配置。
三、为服务账号配置准入控制器的操作思路
如果你是想让服务账号的资源操作受准入控制器管控,或者部署准入控制器时使用服务账号来运行,参考以下步骤:
1. 部署准入Webhook服务(以Validating Webhook为例)
首先创建运行Webhook的服务账号,并赋予必要的RBAC权限:
# 服务账号 apiVersion: v1 kind: ServiceAccount metadata: name: nginx-ingress-admission namespace: kube-system # ClusterRole,允许Webhook读取Ingress资源 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: nginx-ingress-admission-role rules: - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] verbs: ["get", "list", "watch"] # 绑定权限到服务账号 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: nginx-ingress-admission-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: nginx-ingress-admission-role subjects: - kind: ServiceAccount name: nginx-ingress-admission namespace: kube-system
然后部署Webhook的Deployment和Service(你可以直接使用Nginx Ingress官方的准入控制器镜像,无需自行开发)。
2. 创建准入Webhook配置
最后创建ValidatingAdmissionWebhook资源,指定触发规则(比如针对Ingress资源的创建/更新操作),并指向你的Webhook服务:
apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingAdmissionWebhook metadata: name: nginx-ingress-admission-webhook webhooks: - name: ingress-validation.nginx.io rules: - apiGroups: ["networking.k8s.io"] apiVersions: ["v1"] operations: ["CREATE", "UPDATE"] resources: ["ingresses"] clientConfig: service: namespace: kube-system name: nginx-ingress-admission-service caBundle: <你的CA证书内容> admissionReviewVersions: ["v1"] sideEffects: None
四、注意事项
- 如果你使用的是GKE Autopilot集群,部分资源配置会有更严格的限制,但你创建的这种标准集群(使用
n1-standard-1实例)对自定义准入Webhook完全支持; - 准入Webhook需要使用HTTPS,所以你需要生成并配置CA证书,确保kube-apiserver能信任Webhook服务;
- Nginx Ingress官方本身就提供了配套的准入控制器,你可以直接通过官方Helm chart部署,其中已经包含了服务账号、RBAC权限和Webhook配置,无需手动编写上述资源。
内容的提问来源于stack exchange,提问作者Kalle Richter
相关产品推荐
相关产品推荐

