使用 Kubernetes API 访问集群

    你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

    要获知版本信息,请输入 .

    首次访问 Kubernetes API 时,请使用 Kubernetes 命令行工具 kubectl

    要访问集群,你需要知道集群位置并拥有访问它的凭证。 通常,当你完成入门指南时,这会自动设置完成,或者由其他人设置好集群并将凭证和位置提供给你。

    使用此命令检查 kubectl 已知的位置和凭证:

    许多 提供了使用 kubectl 的介绍。完整文档请见 kubectl 手册

    kubectl 处理对 API 服务器的定位和身份验证。如果你想通过 http 客户端(如 curlwget, 或浏览器)直接访问 REST API,你可以通过多种方式对 API 服务器进行定位和身份验证:

    1. 以代理模式运行 kubectl(推荐)。 推荐使用此方法,因为它用存储的 apiserver 位置并使用自签名证书验证 API 服务器的标识。 使用这种方法无法进行中间人(MITM)攻击。
    2. 另外,你可以直接为 HTTP 客户端提供位置和身份认证。 这适用于被代理混淆的客户端代码。 为防止中间人攻击,你需要将根证书导入浏览器。

    使用 Go 或 Python 客户端库可以在代理模式下访问 kubectl。

    使用 kubectl 代理

    下列命令使 kubectl 运行在反向代理模式下。它处理 API 服务器的定位和身份认证。

    像这样运行它:

    1. kubectl proxy --port=8080 &

    然后你可以通过 curl,wget,或浏览器浏览 API,像这样:

    1. curl http://localhost:8080/api/

    输出类似如下:

    1. {
    2. "versions": [
    3. "v1"
    4. ],
    5. "serverAddressByClientCIDRs": [
    6. {
    7. "clientCIDR": "0.0.0.0/0",
    8. "serverAddress": "10.0.1.149:443"
    9. }
    10. ]
    11. }

    不使用 kubectl 代理

    通过将身份认证令牌直接传给 API 服务器,可以避免使用 kubectl 代理,像这样:

    使用 grep/cut 方式:

    输出类似如下:

    1. {
    2. "kind": "APIVersions",
    3. "versions": [
    4. "v1"
    5. ],
    6. "serverAddressByClientCIDRs": [
    7. {
    8. "clientCIDR": "0.0.0.0/0",
    9. "serverAddress": "10.0.1.149:443"
    10. }
    11. ]
    12. }

    上面例子使用了 --insecure 标志位。这使它易受到 MITM 攻击。 当 kubectl 访问集群时,它使用存储的根证书和客户端证书访问服务器。 (已安装在 ~/.kube 目录下)。 由于集群认证通常是自签名的,因此可能需要特殊设置才能让你的 http 客户端使用根证书。

    在一些集群中,API 服务器不需要身份认证;它运行在本地,或由防火墙保护着。 对此并没有一个标准。 配置对 API 的访问 讲解了作为集群管理员可如何对此进行配置。

    Kubernetes 官方支持 Go、、Java、 、JavaScript 和 语言的客户端库。还有一些其他客户端库由对应作者而非 Kubernetes 团队提供并维护。 参考客户端库了解如何使用其他语言来访问 API 以及如何执行身份认证。

    Go 客户端

    说明: 注意 client-go 定义了自己的 API 对象,因此如果需要,请从 client-go 而不是主仓库导入 API 定义,例如 import "k8s.io/client-go/kubernetes" 是正确做法。

    Go 客户端可以使用与 kubectl 命令行工具相同的 定位和验证 API 服务器。参见这个 例子

    1. package main
    2. import (
    3. "context"
    4. "fmt"
    5. "k8s.io/client-go/kubernetes"
    6. "k8s.io/client-go/tools/clientcmd"
    7. )
    8. func main() {
    9. // 在 kubeconfig 中使用当前上下文
    10. // path-to-kubeconfig -- 例如 /root/.kube/config
    11. config, _ := clientcmd.BuildConfigFromFlags("", "<path-to-kubeconfig>")
    12. clientset, _ := kubernetes.NewForConfig(config)
    13. // 访问 API 以列出 Pod
    14. pods, _ := clientset.CoreV1().Pods("").List(context.TODO(), v1.ListOptions{})
    15. fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))
    16. }

    Python 客户端

    要使用 Python 客户端,运行下列命令: pip install kubernetes。 参见 了解更多安装选项。

    Python 客户端可以使用与 kubectl 命令行工具相同的 kubeconfig 文件 定位和验证 API 服务器。参见这个 :

    1. from kubernetes import client, config
    2. config.load_kube_config()
    3. v1=client.CoreV1Api()
    4. print("Listing pods with their IPs:")
    5. ret = v1.list_pod_for_all_namespaces(watch=False)
    6. for i in ret.items:
    7. print("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))

    Java 客户端

    要安装 ,运行:

    参阅https://github.com/kubernetes-client/java/releases 了解当前支持的版本。

    Java 客户端可以使用 kubectl 命令行所使用的 以定位 API 服务器并向其认证身份。 参看此示例

    1. package io.kubernetes.client.examples;
    2. import io.kubernetes.client.ApiClient;
    3. import io.kubernetes.client.ApiException;
    4. import io.kubernetes.client.Configuration;
    5. import io.kubernetes.client.apis.CoreV1Api;
    6. import io.kubernetes.client.models.V1Pod;
    7. import io.kubernetes.client.models.V1PodList;
    8. import io.kubernetes.client.util.ClientBuilder;
    9. import io.kubernetes.client.util.KubeConfig;
    10. import java.io.FileReader;
    11. import java.io.IOException;
    12. /**
    13. * A simple example of how to use the Java API from an application outside a kubernetes cluster
    14. *
    15. * <p>Easiest way to run this: mvn exec:java
    16. * -Dexec.mainClass="io.kubernetes.client.examples.KubeConfigFileClientExample"
    17. *
    18. */
    19. public class KubeConfigFileClientExample {
    20. public static void main(String[] args) throws IOException, ApiException {
    21. // file path to your KubeConfig
    22. String kubeConfigPath = "~/.kube/config";
    23. // loading the out-of-cluster config, a kubeconfig from file-system
    24. ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))).build();
    25. // set the global default api-client to the in-cluster one from above
    26. Configuration.setDefaultApiClient(client);
    27. // the CoreV1Api loads default api-client from global configuration.
    28. CoreV1Api api = new CoreV1Api();
    29. // invokes the CoreV1Api client
    30. V1PodList list = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null);
    31. System.out.println("Listing all pods: ");
    32. for (V1Pod item : list.getItems()) {
    33. System.out.println(item.getMetadata().getName());
    34. }
    35. }
    36. }

    .Net 客户端

    要使用.Net 客户端,运行下面的命令: dotnet add package KubernetesClient --version 1.6.1。 参见了解更多安装选项。 关于可支持的版本,参见https://github.com/kubernetes-client/csharp/releases

    .Net 客户端可以使用与 kubectl CLI 相同的 来定位并验证 API 服务器。 参见样例:

    1. using System;
    2. using k8s;
    3. namespace simple
    4. {
    5. internal class PodList
    6. {
    7. private static void Main(string[] args)
    8. {
    9. var config = KubernetesClientConfiguration.BuildDefaultConfig();
    10. IKubernetes client = new Kubernetes(config);
    11. Console.WriteLine("Starting Request!");
    12. var list = client.ListNamespacedPod("default");
    13. foreach (var item in list.Items)
    14. {
    15. Console.WriteLine(item.Metadata.Name);
    16. }
    17. if (list.Items.Count == 0)
    18. {
    19. Console.WriteLine("Empty!");
    20. }
    21. }
    22. }
    23. }

    JavaScript 客户端

    要安装 JavaScript 客户端,运行下面的命令: npm install @kubernetes/client-node。 参考了解可支持的版本。

    JavaScript 客户端可以使用 kubectl 命令行所使用的 kubeconfig 文件 以定位 API 服务器并向其认证身份。 参见:

    1. const k8s = require('@kubernetes/client-node');
    2. const kc = new k8s.KubeConfig();
    3. kc.loadFromDefault();
    4. const k8sApi = kc.makeApiClient(k8s.CoreV1Api);
    5. k8sApi.listNamespacedPod('default').then((res) => {
    6. console.log(res.body);

    Haskell 客户端

    参考 了解支持的版本。