【问题标题】:Kubernetes API serverKubernetes API 服务器
【发布时间】:2018-05-18 05:05:28
【问题描述】:

所以我刚刚开始使用 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()

这有效,但它返回了我本地 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

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

【问题讨论】:

    标签: python kubernetes


    【解决方案1】:

    您实际上可以创建一个简单的 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)
    

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

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

    【讨论】:

      【解决方案2】:

      我有两个解决方案:

      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()
          ...
      

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

      【讨论】:

        【解决方案3】:

        config.load_kube_config()context 作为参数。如果通过None(默认),则将使用当前上下文。您当前的上下文可能是您的 minikube。

        请看这里: https://github.com/kubernetes-incubator/client-python/blob/436351b027df2673869ee00e0ff5589e6b3e2b7d/kubernetes/config/kube_config.py#L283

        config.load_kube_config(context='some context')

        如果您不熟悉 Kubernetes 上下文, Kubernetes 将您的配置存储在~/.kube/config(默认位置)下。在其中,您将找到您可能有权访问的每个集群的上下文定义。一个名为 current-context 的字段定义了您当前的上下文。

        您可以发出以下命令:

        kubectl config current-context 查看当前上下文

        kubectl config view查看所有配置

        【讨论】:

          【解决方案4】:

          你能给我看看文件~/.kube/config

          如果您更新其中的 API 服务器,python 模块 kubernetes 将自动选择您指定的新 API 服务器。

          - cluster:
              certificate-authority: [Update real ca.crt here]
              server: http://192.168.237.115:8080
          

          ~/.kube/config 还有其他变化,你最好直接从远程 kubernetes 服务器获取配置。

          成功配置远程 kubernetes API 服务器后,您应该可以运行 kubectl 并获取部署、守护进程等。

          那你应该可以用 python kubernetes SDK 运行了

          【讨论】:

          • 这就是我做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
          • 我知道我必须修改它来添加集群。但是我应该赋予证书颁发机构什么价值?
          • 能否先更新原问题中的配置文件?
          • 谁是kubernetes admin,你可以问问。通常配置文件在 kubernete 服务器的/etc/kuberentes 下。自己挖吧。
          • 好的,我知道我必须传递 kube 配置文件。这个给服务器apiVersion: v1 kind: Config clusters: - name: local cluster: certificate-authority: /etc/kubernetes/ssl/ca.pem server: http://127.0.0.1:8080 users: - name: kubelet user: client-certificate: /etc/kubernetes/ssl/node-node1.pem client-key: /etc/kubernetes/ssl/node-node1-key.pem contexts: - context: cluster: local user: kubelet name: kubelet-cluster.local current-context: kubelet-cluster.local 只改服务器地址可以直接用吗?
          猜你喜欢
          • 2021-06-25
          • 2019-08-23
          • 2019-08-29
          • 1970-01-01
          • 2021-05-05
          • 2016-05-02
          • 1970-01-01
          • 2020-04-03
          • 2021-05-18
          相关资源
          最近更新 更多