Kubernetes API 服务器

vec*_*tar 2 python kubernetes

所以我刚刚开始使用 Kubernetes API 服务器,我尝试了这个例子:

from kubernetes import client, config
def main():
    # Configs can be set in Configuration class directly or using helper
    # utility. If no argument provided, the config will be loaded from
    # default location.
    config.load_kube_config()

    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))
if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

这有效,但它返回了我本地 minikube 上的 pod,我想在这里获取 kubernetes 服务器上的 pod: http://192.168.237.115:8080 我该怎么做?

当我这样做时kubectl config view,我得到了这个:

apiVersion: v1
clusters:
- cluster:
    certificate-authority: /home/piyush/.minikube/ca.crt
    server: https://192.168.99.100:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /home/piyush/.minikube/apiserver.crt
    client-key: /home/piyush/.minikube/apiserver.key
Run Code Online (Sandbox Code Playgroud)

我知道这是针对我设置的本地集群。我想知道如何修改它以向 kubernetes 服务器发出 api 请求http://192.168.237.115:8080

小智 6

我有两个解决方案给你:

  1. [首选] 配置您的 kubectl(即 ~/.kube/config)文件。在 kubectl 与您的集群一起工作后,python 客户端应该自动与load_kube_config. kubectl 的配置请看这里:https ://kubernetes.io/docs/tasks/administer-cluster/share-configuration/

  2. 可以直接配置python客户端。有关完整的配置列表,请查看:https : //github.com/kubernetes-client/python-base/blob/8704ce39c241f3f184d01833dcbaf1d1fb14a2dc/configuration.py#L48

您可能需要为您的客户端设置其中一些配置以连接到您的集群。例如,如果您没有启用任何证书或 SSL:

from kubernetes import client, configuration
def main():
    configuration.host = "http://192.168.237.115:8080"
    configuration.api_key_prefix['authorization'] = "Bearer"
    configuration..api_key['authorization'] = "YOUR_TOKEN"
    v1 = client.CoreV1Api()
    ...
Run Code Online (Sandbox Code Playgroud)

您可能需要设置其他配置,例如用户名、api_key 等。这就是为什么我认为如果您遵循第一个解决方案会更容易。


小智 5

您实际上可以创建一个简单的 api 包装器。这样你就可以通过不同的yaml配置文件,我想可能有不同的主机

import yaml

from kubernetes import client
from kubernetes.client import Configuration
from kubernetes.config import kube_config


class K8s(object):
    def __init__(self, configuration_yaml):
        self.configuration_yaml = configuration_yaml
        self._configuration_yaml = None

    @property
    def config(self):
        with open(self.configuration_yaml, 'r') as f:
            if self._configuration_yaml is None:
                self._configuration_yaml = yaml.load(f)
        return self._configuration_yaml

    @property
    def client(self):
        k8_loader = kube_config.KubeConfigLoader(self.config)
        call_config = type.__call__(Configuration)
        k8_loader.load_and_set(call_config)
        Configuration.set_default(call_config)
        return client.CoreV1Api()


# Instantiate your kubernetes class and pass in config
kube_one = K8s(configuration_yaml='~/.kube/config1')
kube_one.client.list_pod_for_all_namespaces(watch=False)

kube_two = K8s(configuration_yaml='~/.kube/config2')
kube_two.client.list_pod_for_all_namespaces(watch=False)
Run Code Online (Sandbox Code Playgroud)

也是 libcloud 中的另一个简洁参考。https://github.com/apache/libcloud/blob/trunk/libcloud/container/drivers/kubernetes.py

祝你好运!希望这可以帮助!:)