Kubernetes 是一个强大的平台,可以在上面(或者)创建各种工具。幸运的是,针对 Kubernetes API 进行编程时有很多选择。然而,这些选项可能会让人不知所措,这可能会让潜在的开发人员没有明确的方向。
在这个系列中将重点介绍 Kubernetes 作为平台的可扩展性。我们将介绍使用 Kubernetes 平台构建解决方案时可用的不同选项,从简单的工具到使用自定义 API 类型扩展 Kubernetes。
在围绕 Kubernnetes 平台构建工具时,了解其 API 环境的架构非常重要。在我们编写任何代码之前,让我们看看无需任何编程语言即可直接探索和使用 API 对象的方法
API-first 架构
Kubernetes 集群由几个松散耦合的组件组成。集群的核心是 API 服务器,它管理代表集群状态的存储(版本化)对象的访问。
可以通过创建或改变代表 Kubernetes 不同方面的现有对象(存储在 etcd 中)以声明方式实现对 Kubernetes 集群的控制。集群组件和工具可以在协调循环中观察这些变化,并改变集群本身,直到它达到所需的状态。
使用 kubectl get 访问 API 对象
查看 Kubernetes API 对象的内容的最简单方法之一是使用kubectl get --raw
。无需其他工具即可探索集群的 API 环境。例如,可以发出以下命令来获取集群上所有 API 路径的列表:
$ kubectl get --raw /{
"path": ["/api", "/api/v1", "/apis", ..."/ui", "/ui/", "/version"]
}
使用kubectl
,可以探索所有可访问的对象以进行检查。例如,以下返回一个NodeList
资源,它是集群中表示的所有节点的集合。命令的输出通过管道传输到 Python json 包以提高可读性,如图所示(缩写)。
可以使用kubectl get
来直接检索 API 对象。例如,下面显示了表示master01
集群中节点的JSON 对象。
如果您使用过 kubectl,您已经知道可以使用它来创建新的 API 对象或更新现有 API 对象的状态。例如,让我们使用命令向 API 服务器提交一个 JSON 对象kubectl create -f
。这将导致集群安排在命名空间中部署一个 3-replica NGINX pod default
。
请注意,kubectl 可以使用 JSON 或 YAML 格式的对象。
然后我们可以使用 kubectl get — raw 来检查部署,如下所示:
直接访问API服务器
通过正确的设置,可以直接通过 HTTP 访问 API 服务器,因此您可以使用 cURL、Web 浏览器或您最喜欢的 REST 工具等工具。
使用命令kubectl proxy
如果需要直接 HTTP 访问 API 服务器,推荐的方式是使用 command kubectl proxy
。该命令设置了一个代理,允许对正在运行的 API 服务器进行授权和身份验证访问。例如,以下代码片段启动代理将所有请求转发到本地主机端口 8080 到 API 服务器:
$ kubectl proxy --port=8080 & $ Starting to serve on 127.0.0.1:8080
一旦代理运行,就可以使用您喜欢的工具通过 HTTP 访问 API 服务器。以下使用cURL
, 返回服务器上所有可用的 API 路径:
$ curl http://localhost:8080/ { "paths": [ "/api", "/api/v1", "/apis", ... "/ui", "/ui/", "/version “ ] }
正如我们之前所做的,我们可以直接获取访问资源列表或访问 API 对象,如下所示。
$ curl http://localhost:8080/api/v1/nodes { "kind": "NodeList", "apiVersion": "v1", "metadata": { "selfLink": "/api/v1/nodes", "resourceVersion": "602451" }, "items": [ { "metadata": { "name": "master01", "selfLink": "/api/v1/nodes/master01", ... ] }
还可以通过 HTTP 请求直接提交 API 对象。例如,以下提交一个 JSON 对象以创建一个名称为test-ns 的Kubernetes namespace。
$ curl http://localhost:8080/api/v1/namespaces/ -k -H "Content-Type: application/json" -XPOST -d ' { "apiVersion": "v1", "kind": "Namespace" , “metadata”:{ "name":“test-ns” } } '
直接访问服务器
如果 usingkubectl proxy
不是一个选项,您可以直接访问 API 服务器而无需代理流量。但是,这意味着您必须为服务器提供适当的授权凭据。为此,我们首先使用 kubectl 从 Kubernetes 中抓取 API 服务器地址和默认服务帐户授权令牌:
APISERVER=$(kubectl config view -o \ jsonpath='{.clusters[*].cluster.server}')TOKEN=$(kubectl get secrets \ -o jsonpath='{.items[?(@.type=="kubernetes.io/service-account-token")].data.token}' \ | base64 --decode)
然后,使用APISERVER
服务器地址和TOKEN
作为 HTTP 请求标头的一部分,如下所示:
$ curl $APISERVER/version --header "Authorization: Bearer $TOKEN" --insecure { "major": "1", "minor": "9", "gitVersion": "v1.9.2", "gitCommit": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", "gitTreeState": "clean", "buildDate": "2018-01-18T09:42:01Z", "goVersion": "go1.9.2", "compiler": "gc", "platform": “Linux/手臂” }
概括
Kubernetes 集群是由松散耦合的组件管理的 API 对象的集合。在 Kubernetes 平台上创建工具需要您了解如何以及知道从何处访问这些 API 对象。这第一篇文章提供了一种简单的方法,您可以使用这些方法来探索 Kubernetes API 对象,而无需使用任何编程语言。
接下来是什么
在接下来的文章中,我们将开始详细探索 Python、Jave 和Go如何与 Kubernetes API 一起工作。