使用Ansible模块创建GKE集群失败问题求助
问题背景
此前使用Ansible的google.cloud.gcp_container_cluster模块创建GKE集群一直正常,近期Jenkins构建突然失败,报错信息如下:
fatal: [localhost]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3.9"}, "changed": false, "msg": "GCP returned error: {'error': {'code': 400, 'message': 'Cluster_ipv4_cidr=192.168.8.0/21 and cluster_secondary_range_name=ndev-pods cannot be specified at the same time.', 'status': 'INVALID_ARGUMENT', '}}
出错的Ansible集群配置片段:
name: "Create a GKE cluster" google.cloud.gcp_container_cluster: name: "{{ name }}" initial_node_count: "{{ initial_node_count }}" location: "{{ gcp_zone }}" project: "{{ gcp_project }}" release_channel: channel: "{{ channel}}" ip_allocation_policy: cluster_ipv4_cidr_block: "{{ cluster_ipv4_cidr_block}}" cluster_secondary_range_name: "{{ cluster_secondary_range_name}}" services_ipv4_cidr_block: "{{ services_ipv4_cidr_block}}" services_secondary_range_name: "{{ services_secondary_range_name}}"
错误原因
GCP的GKE集群IP分配规则明确:cluster_ipv4_cidr_block(手动指定Pod CIDR块)与cluster_secondary_range_name(使用VPC子网预定义二级范围)是互斥配置项,不能同时设置。同理,services_ipv4_cidr_block和services_secondary_range_name也不能并存。
之前构建正常的可能原因:
- 早期GCP API对该互斥规则校验不严格
- 此前变量配置中其中一项为空值,未触发冲突
- 近期GCP API或Ansible模块更新后,校验逻辑收紧
解决方案
根据你的网络规划需求二选一:
方案1:使用VPC子网预定义二级范围(推荐共享VPC场景)
删除手动指定的CIDR块配置,仅保留二级范围名称:
ip_allocation_policy: cluster_secondary_range_name: "{{ cluster_secondary_range_name}}" services_secondary_range_name: "{{ services_secondary_range_name}}"
需确保cluster_secondary_range_name对应的VPC子网二级范围已预先创建,且IP段满足集群Pod数量需求。
方案2:手动指定CIDR块(适用于独立VPC或自定义IP规划)
删除二级范围名称配置,仅保留手动指定的CIDR:
ip_allocation_policy: cluster_ipv4_cidr_block: "{{ cluster_ipv4_cidr_block}}" services_ipv4_cidr_block: "{{ services_ipv4_cidr_block}}"
注意:指定的CIDR块不能与VPC内其他资源IP段冲突,且大小需匹配集群规模(cluster_ipv4_cidr_block建议至少/21以支持足够Pod数量)。
额外检查项
- 确认Jenkins加载的
variables.json中,互斥变量未同时被赋值 - 若因模块版本更新导致兼容性问题,可固定google.cloud集合版本:
ansible-galaxy collection install google.cloud==1.0.2 # 替换为之前正常工作的版本号
内容的提问来源于stack exchange,提问作者Zama Ques

