0

剧情:

我正在一个我们有 PROD 和 ITG 设置的 kubernetes 环境中工作。ITG 设置具有多集群环境,而 PROD 设置是单集群环境。我正在尝试使用 Python 自动化一些过程,我必须处理 kubeconfig 文件,并且我正在使用kubernetes库。

问题:

PROD 的 kubeconfig 文件具有可用的“current-context”键,但ITG 的 kubeconfig 文件中缺少相同的键。

配置文件

apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: https://cluster3.url.com:3600
  name: cluster-ABC
contexts:
- context:
    cluster: cluster-LMN
    user: cluster-user
  name: cluster-LMN-context
current-context: cluster-LMN-context
kind: Config
preferences: {}
users:
- name: cluster-user
  user:
    exec:
      command: kubectl
      apiVersion: <clientauth/version>
      args:
      - kubectl-custom-plugin
      - authenticate
      - https://cluster.url.com:8080
      - --user=user
      - --token=/api/v2/session/xxxx
      - --token-expiry=1000000000
      - --force-reauth=false
      - --insecure-skip-tls-verify=true

配置

apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: https://cluster1.url.com:3600
  name: cluster-ABC
- cluster:
    insecure-skip-tls-verify: true
    server: https://cluster2.url.com:3601
  name: cluster-XYZ
contexts:
- context:
    cluster: cluster-ABC
    user: cluster-user
  name: cluster-ABC-context
- context:
    cluster: cluster-XYZ
    user: cluster-user
  name: cluster-XYZ-context
kind: Config
preferences: {}
users:
- name: cluster-user
  user:
    exec:
      command: kubectl
      apiVersion: <clientauth/version>
      args:
      - kubectl-custom-plugin
      - authenticate
      - https://cluster.url.com:8080
      - --user=user
      - --token=/api/v2/session/xxxx
      - --token-expiry=1000000000
      - --force-reauth=false
      - --insecure-skip-tls-verify=true

当我尝试使用它为 PROD 加载 kubeconfig 文件config.load_kube_config(os.path.expanduser('~/.kube/prdconfig'))时。

当我尝试使用 为 ITG 加载 kubeconfig 文件时config.load_kube_config(os.path.expanduser('~/.kube/itgconfig')),我收到以下错误:

ConfigException:无效的 kube-config 文件。C:\Users<username>/.kube/itgconfig 中的预期密钥当前上下文

尽管从错误消息中可以清楚地看出它认为 kubeconfig 文件无效,因为它没有“current-context”键。

子图:

使用 kubectl 时,缺少的“当前上下文”没有任何区别,因为我们总是可以在命令中指定上下文。但是 'load_kube_config()' 函数使得必须有“current-context”可用。

问题:

那么,“current-context”是 kubeconfig 文件中的强制键吗?

免责声明:

我对 Kubernetes 非常陌生,并且几乎没有使用它的经验。

4

1 回答 1

1

如评论中所述:如果我们想使用kubeconfigfile 默认情况下开箱即用,对于使用 kubectl 或 python 脚本的特定集群,我们可以kubeconfig通过指定将文件中的上下文之一标记为默认值current-context

关于上下文的注意事项:

contextkubeconfig 文件中is used to group access parameters以方便名称命名的元素。每个上下文都有三个参数:集群、命名空间和用户。By default, the kubectl command-line tool uses parameters from the current context to communicate with the cluster.

为了在我们的 kubeconfig 文件中将我们的上下文之一(fe dev-fronted)标记为默认上下文,请运行:

kubectl config use-context dev-fronted

现在,无论何时运行 kubectl 命令,该操作都会应用于集群和 dev-frontend 上下文中列出的命名空间。该命令将使用 dev-frontend 上下文中列出的用户的凭据

请看一下:

- Mering kubeconfig 文件

  1. 根据此链中的第一个命中确定要使用的上下文:

    如果存在,请使用 --context 命令行标志。使用合并的 kubeconfig 文件中的当前上下文。

此时允许空上下文

  1. 确定集群和用户。在这一点上,可能有也可能没有上下文。根据该链中的第一个命中确定集群和用户,该链运行两次:一次用于用户,一次用于集群:

    如果存在,请使用命令行标志:--user 或--cluster。如果上下文非空,则从上下文中获取用户或集群。

此时用户和集群可以为空。

每当我们运行kubectl未指定的命令时,current-context我们应该提供额外的配置参数来告诉 kubectl 使用哪个配置,在您的示例中它可能是 fe:

kubectl --kubeconfig=/your_directory/itgconfig get pods --context cluster-ABC-context

如前所述 - 为了简化此任务,我们可以current-contextkubeconfig文件配置中使用 configure:

kubectl config --kubeconfig=c/your_directory/itgconfig use-context cluster-ABC-context

进一步研究脚本生成的错误,我们应该注意到来自config/kube_config.py的错误:

config/kube_config.py", line 257, in set_active_context context_name = self._config['current-context']

kubernetes.config.config_exception.ConfigException:: Invalid kube-config file. Expected key current-context in ...

这是一个带有附加context="cluster-ABC-context"参数的示例:

from kubernetes import client, config

config.load_kube_config(config_file='/example/data/merged/itgconfig', context="cluster-ABC-context")

v1 = client.CoreV1Api()
print("Listing pods with their IPs:")
ret = v1.list_pod_for_all_namespaces(watch=False)
for i in ret.items:
    print("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))

...
Listing pods with their IPs:
10.200.xxx.xxx  kube-system coredns-558bd4d5db-qpzb8
192.168.xxx.xxx kube-system etcd-debian-test
...

附加信息

于 2021-08-25T09:01:32.660 回答