我有以下 Python 代码:
- 部署 GKE(Google Kubernetes 引擎) 簇
~/.kube/config
使用服务器生成的值构建客户端访问文件.master_auth.password
&.master_auth.username
来自get_cluster()
(Google Cloud 容器库)- 与 Kubernetes 集群交互
我之前使用的是 Kubernetes 1.11 版,但是 2019 年 12 月 9 日该版本已从 GKE 中删除,因此我切换到了 1.12 版。
自从我升级到 1.12 版后,与 kubernetes 的交互就停止了,出现以下错误:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/usr/local/lib/python3.7/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/usr/local/lib/python3.7/site-packages/mypackage/__main__.py", line 89, in <module>
function(**function_args)
File "/usr/local/lib/python3.7/site-packages/mypackage/env.py", line 50, in create
kubernetes.config.load_kube_config(config_file=mypackage.googlecloud.kubernetesengine.config)
File "/usr/local/lib/python3.7/site-packages/kubernetes/config/kube_config.py", line 649, in load_kube_config
loader.load_and_set(config)
File "/usr/local/lib/python3.7/site-packages/kubernetes/config/kube_config.py", line 462, in load_and_set
self._load_cluster_info()
File "/usr/local/lib/python3.7/site-packages/kubernetes/config/kube_config.py", line 428, in _load_cluster_info
file_base_path=base_path).as_file()
File "/usr/local/lib/python3.7/site-packages/kubernetes/config/kube_config.py", line 101, in __init__
self._data = obj[data_key_name]
File "/usr/local/lib/python3.7/site-packages/kubernetes/config/kube_config.py", line 499, in __getitem__
% (key, self.name))
kubernetes.config.config_exception.ConfigException: Invalid kube-config file. Expected key username in /root/.kube/config/{'name': 'my-user', 'user': {'username': None, 'password': None}}/user
事实证明我的 python 代码是~/.kube/config
用空的username
&构建的password
,因为get_cluster()
方法不再返回username
&password
master_auth
。
使用命令没有成功gcloud container clusters describe
,字段masterAuth
仍然几乎是空的。
为什么 GKE 服务器不再发送这些信息?
答案1
从加强集群的安全性:
注意:对于使用 GKE 1.12 及更高版本创建的集群,基本身份验证和客户端证书颁发默认处于禁用状态。
本指南建议禁用集群的客户端证书和静态密码身份验证方法。鉴于默认设置已切换为禁用,将来可能无法再启用基本身份验证,因此您可能需要调查是否可以重新设计应用程序以使用不同的身份验证/授权方法。
答案2
我在集群创建时指定了username
&password
我自己,它解决了该问题:
import google.cloud.container_v1
client = google.cloud.container_v1.ClusterManagerClient()
client.create_cluster(
# see https://github.com/googleapis/google-cloud-python/issues/8692#issuecomment-512442117
project_id=None,
zone=None,
#
cluster={
"name": "name",
"master_auth": {
"username": my_username,
"password": my_password
}
...
}
)
现在服务器已恢复.master_auth.username
正常.master_auth.password
运行get_cluster()
。