使用 Kubernetes API 创建应用详解(1)

84 阅读3分钟

image.png

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 包以提高可读性,如图所示(缩写)。

image.png

可以使用kubectl get来直接检索 API 对象。例如,下面显示了表示master01集群中节点的JSON 对象。

image.png

如果您使用过 kubectl,您已经知道可以使用它来创建新的 API 对象或更新现有 API 对象的状态。例如,让我们使用命令向 API 服务器提交一个 JSON 对象kubectl create -f。这将导致集群安排在命名空间中部署一个 3-replica NGINX pod default

image.png

请注意,kubectl 可以使用 JSON 或 YAML 格式的对象。

然后我们可以使用 kubectl get — raw 来检查部署,如下所示:

image.png

直接访问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 一起工作。