From 13fa2cf8b0f448a5130a42a78ae6a077bde1b8db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=90=E8=87=A3=20Chengchen?= <2803470+it2911@users.noreply.github.com> Date: Sun, 22 Sep 2019 18:51:22 +0900 Subject: [PATCH] 1. Add _index file to cooncepts root, containers, extend-kubernetes, overview, policy and services-networking folders. (#16494) 2. Fix up containers, extend-kubernetes, overview, policy and services-networking files. Add the lost files and sync them with en version documents. --- content/zh/docs/concepts/_index.md | 12 +- content/zh/docs/concepts/containers/_index.md | 4 + .../containers/container-lifecycle-hooks.md | 229 +++++++++++++++ .../docs/concepts/extend-kubernetes/_index.md | 4 + .../extend-kubernetes/api-extension/_index.md | 4 + .../api-extension/apiserver-aggregation.md | 73 +++++ .../compute-storage-net/_index.md | 4 + .../compute-storage-net/network-plugins.md | 273 ++++++++++++++++++ content/zh/docs/concepts/overview/_index.md | 2 +- .../docs/concepts/overview/kubernetes-api.md | 262 +++++++++++++---- .../overview/working-with-objects/_index.md | 0 .../working-with-objects/annotations.md | 164 +++++++++++ .../working-with-objects/common-labels.md | 259 +++++++++++++++++ .../working-with-objects/field-selectors.md | 106 +++++++ .../kubernetes-objects.md | 88 +++++- .../working-with-objects/namespaces.md | 219 ++++++++++++++ content/zh/docs/concepts/policy/_index.md | 11 + .../concepts/services-networking/_index.md | 11 + .../ingress-controllers.md | 126 ++++++++ 19 files changed, 1779 insertions(+), 72 deletions(-) create mode 100644 content/zh/docs/concepts/containers/_index.md create mode 100644 content/zh/docs/concepts/containers/container-lifecycle-hooks.md create mode 100644 content/zh/docs/concepts/extend-kubernetes/_index.md create mode 100644 content/zh/docs/concepts/extend-kubernetes/api-extension/_index.md create mode 100644 content/zh/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation.md create mode 100644 content/zh/docs/concepts/extend-kubernetes/compute-storage-net/_index.md create mode 100644 content/zh/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins.md mode change 100755 => 100644 content/zh/docs/concepts/overview/_index.md mode change 100755 => 100644 content/zh/docs/concepts/overview/working-with-objects/_index.md create mode 100644 content/zh/docs/concepts/overview/working-with-objects/annotations.md create mode 100644 content/zh/docs/concepts/overview/working-with-objects/common-labels.md create mode 100644 content/zh/docs/concepts/overview/working-with-objects/field-selectors.md create mode 100644 content/zh/docs/concepts/overview/working-with-objects/namespaces.md create mode 100644 content/zh/docs/concepts/policy/_index.md create mode 100644 content/zh/docs/concepts/services-networking/_index.md create mode 100644 content/zh/docs/concepts/services-networking/ingress-controllers.md diff --git a/content/zh/docs/concepts/_index.md b/content/zh/docs/concepts/_index.md index 6059a0544e..59de4ca192 100644 --- a/content/zh/docs/concepts/_index.md +++ b/content/zh/docs/concepts/_index.md @@ -28,7 +28,7 @@ weight: 40 -要使用 Kubernetes,你需要用 *Kubernetes API 对象* 来描述集群的*预期状态(desired state)* :包括你需要运行的应用或者负载,它们使用的镜像、副本数,以及所需网络和磁盘资源等等。你可以使用命令行工具 `kubectl` 来调用 Kubernetes API 创建对象,通过所创建的这些对象来配置预期状态。你也可以直接调用 Kubernetes API 和集群进行交互,设置或者修改预期状态。 +要使用 Kubernetes,你需要用 *Kubernetes API 对象* 来描述集群的 *预期状态(desired state)* :包括你需要运行的应用或者负载,它们使用的镜像、副本数,以及所需网络和磁盘资源等等。你可以使用命令行工具 `kubectl` 来调用 Kubernetes API 创建对象,通过所创建的这些对象来配置预期状态。你也可以直接调用 Kubernetes API 和集群进行交互,设置或者修改预期状态。 @@ -39,7 +39,7 @@ weight: 40 * **[kubelet](/docs/admin/kubelet/)**, which communicates with the Kubernetes Master. * **[kube-proxy](/docs/admin/kube-proxy/)**, a network proxy which reflects Kubernetes networking services on each node. --> -* **Kubernetes 主控组件(Master)** 包含三个进程,都运行在集群中的某个节上,通常这个节点被称为 master 节点。这些进程包括:[kube-apiserver](/docs/admin/kube-apiserver/)、[kube-controller-manager](/docs/admin/kube-controller-manager/)和[kube-scheduler](/docs/admin/kube-scheduler/)。 +* **Kubernetes 主控组件(Master)** 包含三个进程,都运行在集群中的某个节上,通常这个节点被称为 master 节点。这些进程包括:[kube-apiserver](/docs/admin/kube-apiserver/)、[kube-controller-manager](/docs/admin/kube-controller-manager/) 和 [kube-scheduler](/docs/admin/kube-scheduler/)。 * 集群中的每个非 master 节点都运行两个进程: * **[kubelet](/docs/admin/kubelet/)**,和 master 节点进行通信。 * **[kube-proxy](/docs/admin/kube-proxy/)**,一种网络代理,将 Kubernetes 的网络服务代理到每个节点上。 @@ -50,7 +50,7 @@ weight: 40 -Kubernetes 包含若干抽象用来表示系统状态,包括:已部署的容器化应用和负载、与它们相关的网络和磁盘资源以及有关集群正在运行的其他操作的信息。这些抽象使用 Kubernetes API 对象来表示。参阅 [Kubernetes对象概述](/docs/concepts/abstractions/overview/)以了解详细信息。 +Kubernetes 包含若干抽象用来表示系统状态,包括:已部署的容器化应用和负载、与它们相关的网络和磁盘资源以及有关集群正在运行的其他操作的信息。这些抽象使用 Kubernetes API 对象来表示。参阅 [Kubernetes 对象概述](/docs/concepts/abstractions/overview/)以了解详细信息。 @@ -77,7 +77,7 @@ Kubernetes 包含若干抽象用来表示系统状态,包括:已部署的容 -关于 Kubernetes 控制平面的各个部分,(如 Kubernetes 主控组件和 kubelet 进程,管理着 Kubernetes 如何与你的集群进行通信。控制平面维护着系统中所有的 Kubernetes 对象的状态记录,并且通过连续的控制循环来管理这些对象的状态。在任一的给定时间点,控制面的控制环都能响应集群中的变化,并且让系统中所有对象的实际状态与你提供的预期状态相匹配。 +关于 Kubernetes 控制平面的各个部分,(如 Kubernetes 主控组件和 kubelet 进程),管理着 Kubernetes 如何与你的集群进行通信。控制平面维护着系统中所有的 Kubernetes 对象的状态记录,并且通过连续的控制循环来管理这些对象的状态。在任意的给定时间点,控制面的控制环都能响应集群中的变化,并且让系统中所有对象的实际状态与你提供的预期状态相匹配。 @@ -93,7 +93,7 @@ Kubernetes master 节点负责维护集群的目标状态。当你要与 Kuberne -> "master" 是指管理集群状态的一组进程的集合。通常这些进程都跑在集群中一个单独的节点上,并且这个节点被称为 master 节点。master 节点也可以扩展副本数,来获取更好的性能及冗余。 +> "master" 是指管理集群状态的一组进程的集合。通常这些进程都跑在集群中一个单独的节点上,并且这个节点被称为 master 节点。master 节点也可以扩展副本数,来获取更好的可用性及冗余。 @@ -108,7 +108,7 @@ Kubernetes master 节点负责维护集群的目标状态。当你要与 Kuberne #### 对象元数据 -* [注释](/docs/concepts/overview/working-with-objects/annotations/) +* [注解](/docs/concepts/overview/working-with-objects/annotations/) {{% /capture %}} diff --git a/content/zh/docs/concepts/containers/_index.md b/content/zh/docs/concepts/containers/_index.md new file mode 100644 index 0000000000..bd322c2129 --- /dev/null +++ b/content/zh/docs/concepts/containers/_index.md @@ -0,0 +1,4 @@ +--- +title: "容器" +weight: 50 +--- \ No newline at end of file diff --git a/content/zh/docs/concepts/containers/container-lifecycle-hooks.md b/content/zh/docs/concepts/containers/container-lifecycle-hooks.md new file mode 100644 index 0000000000..3bb349cb4f --- /dev/null +++ b/content/zh/docs/concepts/containers/container-lifecycle-hooks.md @@ -0,0 +1,229 @@ +--- +reviewers: +- mikedanese +- thockin +title: 容器生命周期钩子 +content_template: templates/concept +weight: 30 +--- + + + +{{% capture overview %}} + + +这个页面描述了 kubelet 管理的容器如何使用容器生命周期钩子框架来运行在其管理生命周期中由事件触发的代码。 + +{{% /capture %}} + + +{{% capture body %}} + + + +## 概述 + + +类似于许多具有生命周期钩子组件的编程语言框架,例如Angular,Kubernetes为容器提供了生命周期钩子。 +钩子使容器能够了解其管理生命周期中的事件,并在执行相应的生命周期钩子时运行在处理程序中实现的代码。 + + + +## 容器钩子 + + +有两个钩子暴露在容器中: + +`PostStart` + + +这个钩子在创建容器之后立即执行。 +但是,不能保证钩子会在容器入口点之前执行。 +没有参数传递给处理程序。 + +`PreStop` + + + +在容器终止之前是否立即调用此钩子,取决于 API 的请求或者管理事件,类似活动探针故障、资源抢占、资源竞争等等。 如果容器已经完全处于终止或者完成状态,则对 preStop 钩子的调用将失败。 +它是阻塞的,同时也是同步的,因此它必须在删除容器的调用之前完成。 +没有参数传递给处理程序。 + + +有关终止行为的更详细描述,请参见[终止 Pod](/docs/concepts/workloads/pods/pod/#termination-of-pods)。 + + + +### 钩子处理程序的实现 + + +容器可以通过实现和注册该钩子的处理程序来访问该钩子。 +针对容器,有两种类型的钩子处理程序可供实现: + + + +* Exec - 执行一个特定的命令,例如 `pre-stop.sh`,在容器的 cgroups 和名称空间中。 +命令所消耗的资源根据容器进行计算。 +* HTTP - 对容器上的特定端点执行 HTTP 请求。 + + + +### 钩子处理程序执行 + + +当调用容器生命周期管理钩子时,Kubernetes 管理系统在为该钩子注册的容器中执行处理程序。 + + +钩子处理程序调用在包含容器的 Pod 上下文中是同步的。 +这意味着对于 `PostStart` 钩子,容器入口点和钩子异步触发。 +但是,如果钩子运行或挂起的时间太长,则容器无法达到 `running` 状态。 + + +行为与 `PreStop` 钩子的行为类似。 +如果钩子在执行过程中挂起,Pod 阶段将保持在 `Terminating` 状态,并在 Pod 结束的 `terminationGracePeriodSeconds` 之后被杀死。 +如果 `PostStart` 或 `PreStop` 钩子失败,它会杀死容器。 + + +用户应该使他们的钩子处理程序尽可能的轻量级。 +但也需要考虑长时间运行的命令也很有用的情况,比如在停止容器之前保存状态。 + + + +### 钩子寄送保证 + + +钩子的寄送应该是*至少一次*,这意味着对于任何给定的事件,例如 `PostStart` 或 `PreStop`,钩子可以被调用多次。 +如何正确处理,是钩子实现所要考虑的问题。 + + +通常情况下,只会进行单次寄送。 +例如,如果 HTTP 钩子接收器宕机,无法接收流量,则不会尝试重新发送。 +然而,偶尔也会发生重复寄送的可能。 +例如,如果 kubelet 在发送钩子的过程中重新启动,钩子可能会在 kubelet 恢复后重新发送。 + + + +### 调试钩子处理程序 + + +钩子处理程序的日志不会在 Pod 事件中公开。 +如果处理程序由于某种原因失败,它将播放一个事件。 +对于 `PostStart`,这是 `FailedPostStartHook` 事件,对于 `PreStop`,这是 `FailedPreStopHook` 事件。 +您可以通过运行 `kubectl describe pod ` 命令来查看这些事件。 +下面是运行这个命令的一些事件输出示例: + +``` +Events: + FirstSeen LastSeen Count From SubobjectPath Type Reason Message + --------- -------- ----- ---- ------------- -------- ------ ------- + 1m 1m 1 {default-scheduler } Normal Scheduled Successfully assigned test-1730497541-cq1d2 to gke-test-cluster-default-pool-a07e5d30-siqd + 1m 1m 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Pulling pulling image "test:1.0" + 1m 1m 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Created Created container with docker id 5c6a256a2567; Security:[seccomp=unconfined] + 1m 1m 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Pulled Successfully pulled image "test:1.0" + 1m 1m 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Started Started container with docker id 5c6a256a2567 + 38s 38s 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Killing Killing container with docker id 5c6a256a2567: PostStart handler: Error executing in Docker Container: 1 + 37s 37s 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Killing Killing container with docker id 8df9fdfd7054: PostStart handler: Error executing in Docker Container: 1 + 38s 37s 2 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "main" with RunContainerError: "PostStart handler: Error executing in Docker Container: 1" + 1m 22s 2 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Warning FailedPostStartHook +``` + +{{% /capture %}} + +{{% capture whatsnext %}} + + + +* 了解更多关于[容器环境](/docs/concepts/containers/container-environment-variables/)。 +* 获取实践经验[将处理程序附加到容器生命周期事件](/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/)。 + +{{% /capture %}} diff --git a/content/zh/docs/concepts/extend-kubernetes/_index.md b/content/zh/docs/concepts/extend-kubernetes/_index.md new file mode 100644 index 0000000000..44a8ee8361 --- /dev/null +++ b/content/zh/docs/concepts/extend-kubernetes/_index.md @@ -0,0 +1,4 @@ +--- +title: 扩展 Kubernetes +weight: 40 +--- \ No newline at end of file diff --git a/content/zh/docs/concepts/extend-kubernetes/api-extension/_index.md b/content/zh/docs/concepts/extend-kubernetes/api-extension/_index.md new file mode 100644 index 0000000000..206de59684 --- /dev/null +++ b/content/zh/docs/concepts/extend-kubernetes/api-extension/_index.md @@ -0,0 +1,4 @@ +--- +title: 扩展 Kubernetes API +weight: 20 +--- \ No newline at end of file diff --git a/content/zh/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation.md b/content/zh/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation.md new file mode 100644 index 0000000000..11dc1e423a --- /dev/null +++ b/content/zh/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation.md @@ -0,0 +1,73 @@ + + +--- +title: 通过聚合层扩展 Kubernetes API +reviewers: +- lavalamp +- cheftako +- chenopis +content_template: templates/concept +weight: 10 +--- + +{{% capture overview %}} + + + +聚合层允许 Kubernetes 通过额外的 API 进行扩展,而不局限于 Kubernetes 核心 API 提供的功能。 + +{{% /capture %}} + +{{% capture body %}} + + + +## 概述 + +聚合层使您的集群可以安装其他 Kubernetes 风格的 API。这些 API 可以是预编译的、第三方的解决方案提供的例如[service-catalog](https://github.com/kubernetes-incubator/service-catalog/blob/master/README.md)、或者用户创建的类似[apiserver-builder](https://github.com/kubernetes-incubator/apiserver-builder/blob/master/README.md)一样的API可以帮助你上手。 + + + +1.7 版本中,聚合层在 kube-apiserver 进程内运行。在扩展资源注册之前,聚合层不做任何事情。要注册 API,用户必须添加一个 APIService 对象,用它来申领 Kubernetes API 中的 URL 路径。自此以后,聚合层将会把发给该 API 路径的所有内容(例如 /apis/myextension.mycompany.io/v1/…)代理到已注册的 APIService。 + + + +正常情况下,APIService 会实现为运行于集群中某 Pod 内的 extension-apiserver。如果需要对增加的资源进行动态管理,extension-apiserver 经常需要和一个或多个控制器一起使用。因此,apiserver-builder 同时提供用来管理新资源的 API 框架和控制器框架。另外一个例子,当安装了 service-catalog 时,它会为自己提供的服务提供 extension-apiserver 和控制器。 + +{{% /capture %}} + +{{% capture whatsnext %}} + + + +* 阅读[配置聚合层](/docs/tasks/access-kubernetes-api/configure-aggregation-layer/) 文档,了解如何在自己的环境中启用聚合器(aggregator)。 +* 然后[安装扩展的 api-server](/docs/tasks/access-kubernetes-api/setup-extension-api-server/) 来开始使用聚合层。 +* 也可以学习怎样 [使用客户资源定义扩展 Kubernetes API](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/)。 + +{{% /capture %}} + + diff --git a/content/zh/docs/concepts/extend-kubernetes/compute-storage-net/_index.md b/content/zh/docs/concepts/extend-kubernetes/compute-storage-net/_index.md new file mode 100644 index 0000000000..f442ce7faf --- /dev/null +++ b/content/zh/docs/concepts/extend-kubernetes/compute-storage-net/_index.md @@ -0,0 +1,4 @@ +--- +title: 计算、存储和网络扩展 +weight: 30 +--- \ No newline at end of file diff --git a/content/zh/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins.md b/content/zh/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins.md new file mode 100644 index 0000000000..506539c3be --- /dev/null +++ b/content/zh/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins.md @@ -0,0 +1,273 @@ +--- +title: 网络插件 +content_template: templates/concept +weight: 10 +--- + + + +{{% capture overview %}} + +{{< feature-state state="alpha" >}} + +{{< warning >}}Alpha 特性迅速变化。{{< /warning >}} + + +Kubernetes中的网络插件有几种类型: + +* CNI 插件: 遵守 appc/CNI 规约,为互操作性设计。 +* Kubenet 插件:使用 `bridge` 和 `host-local` CNI 插件实现了基本的 `cbr0`。 + +{{% /capture %}} + +{{% capture body %}} + + +## 安装 + +kubelet 有一个单独的默认网络插件,以及一个对整个集群通用的默认网络。 +它在启动时探测插件,记住找到的内容,并在 pod 生命周期的适当时间执行所选插件(这仅适用于 Docker,因为 rkt 管理自己的 CNI 插件)。 +在使用插件时,需要记住两个 Kubelet 命令行参数: + +* `cni-bin-dir`: Kubelet 在启动时探测这个目录中的插件 +* `network-plugin`: 要使用的网络插件来自 `cni-bin-dir`。它必须与从插件目录探测到的插件报告的名称匹配。对于 CNI 插件,其值为 "cni"。 + + +## 网络插件要求 + +除了提供[`NetworkPlugin` 接口](https://github.com/kubernetes/kubernetes/tree/{{< param "fullversion" >}}/pkg/kubelet/dockershim/network/plugins.go)来配置和清理 pod 网络之外,该插件还可能需要对 kube-proxy 的特定支持。 +iptables 代理显然依赖于 iptables,插件可能需要确保 iptables 能够监控容器的网络通信。 +例如,如果插件将容器连接到 Linux 网桥,插件必须将 `net/bridge/bridge-nf-call-iptables` 系统参数设置为`1`,以确保 iptables 代理正常工作。 +如果插件不使用 Linux 网桥(而是类似于 Open vSwitch 或者其它一些机制),它应该确保为代理对容器通信执行正确的路由。 + +默认情况下,如果未指定 kubelet 网络插件,则使用 `noop` 插件,该插件设置 `net/bridge/bridge-nf-call-iptables=1`,以确保简单的配置(如带网桥的 Docker )与 iptables 代理正常工作。 + + +### CNI + +通过给 Kubelet 传递 `--network-plugin=cni` 命令行选项来选择 CNI 插件。 +Kubelet 从 `--cni-conf-dir` (默认是 `/etc/cni/net.d`) 读取文件并使用该文件中的 CNI 配置来设置每个 pod 的网络。 +CNI 配置文件必须与 [CNI 规约](https://github.com/containernetworking/cni/blob/master/SPEC.md#network-configuration)匹配,并且配置引用的任何所需的 CNI 插件都必须存在于 `--cni-bin-dir`(默认是 `/opt/cni/bin`)。 + +如果这个目录中有多个 CNI 配置文件,则使用按文件名的字典顺序排列的第一个配置文件。 + +除了配置文件指定的 CNI 插件外,Kubernetes 还需要标准的 CNI [`lo`](https://github.com/containernetworking/plugins/blob/master/plugins/main/loopback/loopback.go) 插件,最低版本是0.2.0。 + + +#### 支持 hostPort + +CNI 网络插件支持 `hostPort`。 您可以使用官方 [portmap](https://github.com/containernetworking/plugins/tree/master/plugins/meta/portmap) +插件,它由 CNI 插件团队提供,或者使用您自己的带有 portMapping 功能的插件。 + +如果你想要启动 `hostPort` 支持,则必须在 `cni-conf-dir` 指定 `portMappings capability`。 +例如: + +```json +{ + "name": "k8s-pod-network", + "cniVersion": "0.3.0", + "plugins": [ + { + "type": "calico", + "log_level": "info", + "datastore_type": "kubernetes", + "nodename": "127.0.0.1", + "ipam": { + "type": "host-local", + "subnet": "usePodCidr" + }, + "policy": { + "type": "k8s" + }, + "kubernetes": { + "kubeconfig": "/etc/cni/net.d/calico-kubeconfig" + } + }, + { + "type": "portmap", + "capabilities": {"portMappings": true} + } + ] +} +``` + + +#### 支持流量整形 + +CNI 网络插件还支持 pod 入口和出口流量整形。 +您可以使用 CNI 插件团队提供的 [bandwidth](https://github.com/containernetworking/plugins/tree/master/plugins/meta/bandwidth) 插件, +也可以使用您自己的具有带宽控制功能的插件。 + +如果您想要启用流量整形支持,你必须将 `bandwidth` 插件添加到 CNI 配置文件 +(默认是 `/etc/cni/net.d`)。 + +```json +{ + "name": "k8s-pod-network", + "cniVersion": "0.3.0", + "plugins": [ + { + "type": "calico", + "log_level": "info", + "datastore_type": "kubernetes", + "nodename": "127.0.0.1", + "ipam": { + "type": "host-local", + "subnet": "usePodCidr" + }, + "policy": { + "type": "k8s" + }, + "kubernetes": { + "kubeconfig": "/etc/cni/net.d/calico-kubeconfig" + } + }, + { + "type": "bandwidth", + "capabilities": {"bandwidth": true} + } + ] +} +``` + +现在,您可以将 `kubernetes.io/ingress-bandwidth` 和 `kubernetes.io/egress-bandwidth` 注解添加到 pod 中。 +例如: + +```yaml +apiVersion: v1 +kind: Pod +metadata: + annotations: + kubernetes.io/ingress-bandwidth: 1M + kubernetes.io/egress-bandwidth: 1M +... +``` + + +### kubenet + +Kubenet 是一个非常基本的、简单的网络插件,仅适用于 Linux。 +它本身并不实现更高级的功能,如跨节点网络或网络策略。 +它通常与云驱动一起使用,云驱动为节点间或单节点环境中的通信设置路由规则。 + +Kubenet 创建名为 `cbr0` 的网桥,并为每个 pod 创建了一个 veth 对,每个 pod 的主机端都连接到 `cbr0`。 +这个 veth 对的 pod 端会被分配一个 IP 地址,该 IP 地址隶属于节点所被分配的 IP 地址范围内。节点的 IP 地址范围则通过配置或控制器管理器来设置。 +`cbr0` 被分配一个 MTU,该 MTU 匹配主机上已启用的正常接口的最小 MTU。 + +使用此插件还需要一些其他条件: + +* 需要标准的 CNI `bridge`、`lo` 以及 `host-local` 插件,最低版本是0.2.0。Kubenet 首先在 `/opt/cni/bin` 中搜索它们。 指定 `cni-bin-dir` 以提供其它的搜索路径。首次找到的匹配将生效。 +* Kubelet 必须和 `--network-plugin=kubenet` 参数一起运行,才能启用该插件。 +* Kubelet 还应该和 `--non-masquerade-cidr=` 参数一起运行,以确保超出此范围的 IP 流量将使用 IP 伪装。 +* 节点必须被分配一个 IP 子网,通过kubelet 命令行的 `--pod-cidr` 选项或控制器管理器的命令行选项 `--allocate-node-cidrs=true --cluster-cidr=` 来设置。 + + +### 自定义 MTU(使用 kubenet) + +要获得最佳的网络性能,必须确保 MTU 的取值配置正确。 +网络插件通常会尝试推断出一个合理的 MTU,但有时候这个逻辑不会产生一个最优的 MTU。 +例如,如果 Docker 网桥或其他接口有一个小的 MTU, kubenet 当前将选择该 MTU。 +或者如果您正在使用 IPSEC 封装,则必须减少 MTU,并且这种计算超出了大多数网络插件的能力范围。 + +如果需要,您可以使用 `network-plugin-mtu` kubelet 选项显式的指定 MTU。 +例如:在 AWS 上 `eth0` MTU 通常是 9001,因此您可以指定 `--network-plugin-mtu=9001`。 +如果您正在使用 IPSEC ,您可以减少它以允许封装开销,例如 `--network-plugin-mtu=8873`。 + +此选项会传递给网络插件; 当前 **仅 kubenet 支持 `network-plugin-mtu`**。 + + +## 使用总结 + +* `--network-plugin=cni` 用来表明我们要使用 `cni` 网络插件,实际的 CNI 插件可执行文件位于 `--cni-bin-dir`(默认是 `/opt/cni/bin`)下, CNI 插件配置位于 `--cni-conf-dir`(默认是 `/etc/cni/net.d`)下。 +* `--network-plugin=kubenet` 用来表明我们要使用 `kubenet` 网络插件,CNI `bridge` 和 `host-local` 插件位于 `/opt/cni/bin` 或 `cni-bin-dir` 中。 +* `--network-plugin-mtu=9001` 指定了我们使用的 MTU,当前仅被 `kubenet` 网络插件使用。 + +{{% /capture %}} + +{{% capture whatsnext %}} + +{{% /capture %}} diff --git a/content/zh/docs/concepts/overview/_index.md b/content/zh/docs/concepts/overview/_index.md old mode 100755 new mode 100644 index 9ab3e94ae4..dd4f784acd --- a/content/zh/docs/concepts/overview/_index.md +++ b/content/zh/docs/concepts/overview/_index.md @@ -1,4 +1,4 @@ --- -title: "概述" +title: 概述 weight: 20 --- \ No newline at end of file diff --git a/content/zh/docs/concepts/overview/kubernetes-api.md b/content/zh/docs/concepts/overview/kubernetes-api.md index 9a920f043f..da235a945c 100644 --- a/content/zh/docs/concepts/overview/kubernetes-api.md +++ b/content/zh/docs/concepts/overview/kubernetes-api.md @@ -1,103 +1,265 @@ --- -title: Kubernetes API +title: The Kubernetes API +content_template: templates/concept weight: 30 +card: + name: concepts + weight: 30 --- -# Kubernetes API 概述 +{{% capture overview %}} + [API协议文档](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md)描述了主系统和API概念。 -[API参考文档](https://kubernetes.io/docs/reference)描述了API整体规范。 +[API参考文档](/docs/reference)描述了API整体规范。 -[访问文档](https://kubernetes.io/docs/admin/accessing-the-api)讨论了通过远程访问API的相关问题。 +[访问文档](/docs/admin/accessing-the-api)讨论了通过远程访问API的相关问题。 -Kubernetes API是系统描述性配置的基础。 [Kubectl](https://kubernetes.io/docs/user-guide/kubectl/) 命令行工具被用于创建、更新、删除、获取API对象。 +Kubernetes API是系统描述性配置的基础。 [Kubectl](/docs/user-guide/kubectl/) 命令行工具被用于创建、更新、删除、获取API对象。 Kubernetes 通过API资源存储自己序列化状态(现在存储在[etcd](https://coreos.com/docs/distributed-configuration/getting-started-with-etcd/))。 Kubernetes 被分成多个组件,各部分通过API相互交互。 +{{% /capture %}} + + +{{% capture body %}} + + ## API 变更 根据经验,任何成功的系统都需要随着新的用例出现或现有用例发生变化的情况下,进行相应的进化与调整。因此,我们希望Kubernetes API也可以保持持续的进化和调整。同时,在较长一段时间内,我们也希望与现有客户端版本保持良好的向下兼容性。一般情况下,增加新的API资源和资源字段不会导致向下兼容性问题发生;但如果是需要删除一个已有的资源或者字段,那么必须通过[API废弃流程](/docs/reference/deprecation-policy/)来进行。 -参考[API变更文档](https://git.k8s.io/community/contributors/devel/api_changes.md),了解兼容性变更的要素以及如何变更API的流程。 +参考[API变更文档](https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md),了解兼容性变更的要素以及如何变更API的流程。 -## API Swagger 定义 + -Kubernetes从1.4版本开始,也支持通过 [**`/swagger.json`**](https://git.k8s.io/kubernetes/api/openapi-spec/swagger.json) 来访问 OpenAPI 形式给出的API文档。在我们将 Swagger v1.2 切换到 OpenAPI (aka Swagger v2.0) 期间,一部分工具(如 kubectl 与 swagger-ui )会继续使用 1.2 版本规范。Kubernetes 1.5 版本中的 OpenAPI 规范是 Beta 版本。 +## OpenAPI 和 API Swagger 定义 + +完整的 API 细节被记录在 [OpenAPI](https://www.openapis.org/). + +随着 Kubernetes 1.10 版本的正式启用,Kubernetes API 服务通过 `/openapi/v2` 接口提供 OpenAPI 规范。 +通过设置 HTTP 标头的规定了请求的结构。 + +Header | Possible Values +------ | --------------- +Accept | `application/json`, `application/com.github.proto-openapi.spec.v2@v1.0+protobuf` (the default content-type is `application/json` for `*/*` or not passing this header) +Accept-Encoding | `gzip` (not passing this header is acceptable) + + + +在1.14版本之前,区分结构的接口通过(`/swagger.json`, `/swagger-2.0.0.json`, `/swagger-2.0.0.pb-v1`, `/swagger-2.0.0.pb-v1.gz`) +提供不同格式的 OpenAPI 规范。但是这些接口已经被废弃,并且已经在 Kubernetes 1.14 中被删除。 + +**获取 OpenAPI 规范的例子**: + +1.10 之前 | 从 1.10 开始 +----------- | ----------------------------- +GET /swagger.json | GET /openapi/v2 **Accept**: application/json +GET /swagger-2.0.0.pb-v1 | GET /openapi/v2 **Accept**: application/com.github.proto-openapi.spec.v2@v1.0+protobuf +GET /swagger-2.0.0.pb-v1.gz | GET /openapi/v2 **Accept**: application/com.github.proto-openapi.spec.v2@v1.0+protobuf **Accept-Encoding**: gzip + + Kubernetes实现了另一种基于Protobuf的序列化格式,该格式主要用于集群内通信,并在[设计方案](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/protobuf.md)中进行了说明,每个模式的IDL文件位于定义API对象的Go软件包中。 +在 1.14 版本之前, Kubernetes apiserver 也提供 API 服务用于返回 +[Swagger v1.2](http://swagger.io/) Kubernetes API 规范通过 `/swaggerapi` 接口. +但是这个接口已经被废弃,并且在 Kubernetes 1.14 中已经被移除。 + + ## API 版本 -为了使删除字段或者重构资源表示更加容易,Kubernetes 支持多个API版本。每一个版本都在不同API路径下,例如 **`/api/v1`** 或者 **`/apis/extensions/v1beta1`**。 +为了使删除字段或者重构资源表示更加容易,Kubernetes 支持 +多个API版本。每一个版本都在不同API路径下,例如 `/api/v1` 或者 +`/apis/extensions/v1beta1`。 + + 我们选择在API级别进行版本化,而不是在资源或字段级别进行版本化,以确保API提供清晰,一致的系统资源和行为视图,并控制对已废止的API和/或实验性API的访问。 JSON和Protobuf序列化模式遵循架构更改的相同准则 - 下面的所有描述都同时适用于这两种格式。 -请注意,API版本控制和软件版本控制只有间接相关性。 [API和发行版本建议](https://git.k8s.io/community/contributors/design-proposals/release/versioning.md)描述了API版本与软件版本之间的关系。 +请注意,API版本控制和软件版本控制只有间接相关性。 + [API和发行版本建议](https://git.k8s.io/community/contributors/design-proposals/release/versioning.md) 描述了API版本与软件版本之间的关系。 -不同的API版本名称意味着不同级别的软件稳定性和支持程度。 每个级别的标准在[API变更文档](https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md#alpha-beta-and-stable-versions)中有更详细的描述。 内容主要概括如下: + -* Alpha 测试版本: +不同的API版本名称意味着不同级别的软件稳定性和支持程度。 每个级别的标准在[API变更文档](https://git.k8s.io/community/contributors/devel/api_changes.md#alpha-beta-and-stable-versions)中有更详细的描述。 内容主要概括如下: - * 版本名称包含了 **`alpha`** (例如:**`v1alpha1`**)。 + +- Alpha 测试版本: + - 版本名称包含了 **`alpha`** (例如:**`v1alpha1`**)。 + - 可能是有缺陷的。启用该功能可能会带来隐含的问题,默认情况是关闭的。 + - 支持的功能可能在没有通知的情况下随时删除。 + - API的更改可能会带来兼容性问题,但是在后续的软件发布中不会有任何通知。 + - 由于bugs风险的增加和缺乏长期的支持,推荐在短暂的集群测试中使用。 +- Beta 测试版本: + - 版本名称包含了 **`beta`** (例如: **`v2beta3`**)。 + - 代码已经测试过。启用该功能被认为是安全的,功能默认已启用。 + - 所有已支持的功能不会被删除,细节可能会发生变化。 + - 对象的模式和/或语义可能会在后续的beta测试版或稳定版中以不兼容的方式进行更改。 发生这种情况时,我们将提供迁移到下一个版本的说明。 这可能需要删除、编辑和重新创建API对象。执行编辑操作时需要谨慎行事,这可能需要停用依赖该功能的应用程序。 + - 建议仅用于非业务关键型用途,因为后续版本中可能存在不兼容的更改。 如果您有多个可以独立升级的集群,则可以放宽此限制。 + - **请尝试我们的 beta 版本功能并且给出反馈!一旦他们退出 beta 测试版,我们可能不会做出更多的改变。** +- 稳定版本: + - 版本名称是 **`vX`**,其中 **`X`** 是整数。 + - 功能的稳定版本将出现在许多后续版本的发行软件中。 - * 可能是有缺陷的。启用该功能可能会带来隐含的问题,默认情况是关闭的。 + ## API 组 -为了更容易地扩展Kubernetes API,我们实现了[*`API组`*](https://git.k8s.io/community/contributors/design-proposals/api-machinery/api-group.md)。 API组在REST路径和序列化对象的 **`apiVersion`** 字段中指定。 +为了更容易地扩展Kubernetes API,我们实现了[*`API组`*](https://git.k8s.io/community/contributors/design-proposals/api-machinery/api-group.md)。 +API组在REST路径和序列化对象的 **`apiVersion`** 字段中指定。 + + 目前有几个API组正在使用中: -1. 核心组(通常被称为遗留组)位于REST路径 **`/api/v1`** 并使用 **`apiVersion:v1`**。 +1. 核心组(通常被称为遗留组)位于REST路径 `/api/v1` 并使用 `apiVersion:v1`。 -1. 指定的组位于REST路径 **`/apis/$GROUP_NAME/$VERSION`**,并使用 **`apiVersion:$GROUP_NAME/$VERSION`**(例如 **`apiVersion:batch/v1`**)。 在[Kubernetes API参考](https://kubernetes.io/docs/reference/)中可以看到支持的API组的完整列表。 +1. 指定的组位于REST路径 `/apis/$GROUP_NAME/$VERSION`,并使用 `apiVersion:$GROUP_NAME/$VERSION` + (例如 `apiVersion:batch/v1`)。 在[Kubernetes API参考](/docs/reference/)中可以看到支持的API组的完整列表。 -社区支持使用以下两种方式来提供自定义资源对API进行扩展[自定义资源](https://kubernetes.io/docs/concepts/api-extension/custom-resources/): + -1. 即将推出:需要全套Kubernetes API语义的用户可以实现自己的apiserver,并使用[聚合器](https://git.k8s.io/community/contributors/design-proposals/api-machinery/aggregated-api-servers.md)为客户提供无缝的服务。 +社区支持使用以下两种方式来提供自定义资源对API进行扩展[自定义资源](/docs/concepts/api-extension/custom-resources/): + +1. [CustomResourceDefinition](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/) + 适用于具有非常基本的CRUD需求的用户。 + +1. 需要全套Kubernetes API语义的用户可以实现自己的apiserver, + 并使用[聚合器](/docs/tasks/access-kubernetes-api/configure-aggregation-layer/) + 为客户提供无缝的服务。 + + ## 启用 API 组 -某些资源和API组默认情况下处于启用状态。 可以通过在apiserver上设置 **`--runtime-config`** 来启用或禁用它们。 **`--runtime-config`** 接受逗号分隔的值。 例如:要禁用batch/v1,请设置**`--runtime-config=batch/v1=false`**,以启用batch/v2alpha1,请设置**`--runtime-config=batch/v2alpha1`**。 该标志接受描述apiserver的运行时配置的逗号分隔的一组键值对。 +某些资源和API组默认情况下处于启用状态。 可以通过在apiserver上设置 `--runtime-config` 来启用或禁用它们。 +`--runtime-config` 接受逗号分隔的值。 +例如:要禁用batch/v1,请设置 `--runtime-config=batch/v1=false`,以启用batch/v2alpha1,请设置`--runtime-config=batch/v2alpha1`。 +该标志接受描述apiserver的运行时配置的逗号分隔的一组键值对。 -重要:启用或禁用组或资源需要重新启动apiserver和控制器管理器来使得 **`--runtime-config`** 更改生效。 +重要:启用或禁用组或资源需要重新启动apiserver和控制器管理器来使得 `--runtime-config` 更改生效。 + + ## 启用组中资源 -DaemonSets,Deployments,HorizontalPodAutoscalers,Ingress,Jobs和ReplicaSets是默认启用的。 其他扩展资源可以通过在apiserver上设置 **`--runtime-config`** 来启用。**`--runtime-config`** 接受逗号分隔的值。 +DaemonSets,Deployments,HorizontalPodAutoscalers,Ingress,Jobs 和 ReplicaSets是默认启用的。 +其他扩展资源可以通过在apiserver上设置 `--runtime-config` 来启用。 +`--runtime-config` 接受逗号分隔的值。 例如:要禁用 Deployment 和 Ingress, +请设置 `--runtime-config=extensions/v1beta1/deployments=false,extensions/v1beta1/ingress=false` -例如:要禁用 Deployment 和 Ingress,请设置 **`--runtime-config=extensions/v1beta1/deployments=false,extensions/v1beta1/ingress=false`** +{{% /capture %}} diff --git a/content/zh/docs/concepts/overview/working-with-objects/_index.md b/content/zh/docs/concepts/overview/working-with-objects/_index.md old mode 100755 new mode 100644 diff --git a/content/zh/docs/concepts/overview/working-with-objects/annotations.md b/content/zh/docs/concepts/overview/working-with-objects/annotations.md new file mode 100644 index 0000000000..9f8a04df75 --- /dev/null +++ b/content/zh/docs/concepts/overview/working-with-objects/annotations.md @@ -0,0 +1,164 @@ +--- +title: 注解 +content_template: templates/concept +weight: 50 +--- + + + +{{% capture overview %}} + +你可以使用 Kubernetes 注解为对象附加任意的非标识的元数据。客户端程序(例如工具和库)能够获取这些元数据信息。 + +{{% /capture %}} + +{{% capture body %}} +## 为对象附加元数据 + + +您可以使用标签或注解将元数据附加到 Kubernetes 对象。 +标签可以用来选择对象和查找满足某些条件的对象集合。 相反,注解不用于标识和选择对象。 +注解中的元数据,可以很小,也可以很大,可以是结构化的,也可以是非结构化的,能够包含标签不允许的字符。 + + + + +注解和标签一样,是键/值对: + + +```json +"metadata": { + "annotations": { + "key1" : "value1", + "key2" : "value2" + } +} +``` + +以下是一些例子,用来说明哪些信息可以使用注解来记录: + + +* 由声明性配置所管理的字段。 + 将这些字段附加为注解,能够将它们与客户端或服务端设置的默认值、自动生成的字段以及通过自动调整大小或自动伸缩系统设置的字段区分开来。 + + + +* 构建、发布或镜像信息(如时间戳、发布 ID、Git 分支、PR 数量、镜像哈希、仓库地址)。 + + + +* 指向日志记录、监控、分析或审计仓库的指针。 + + + +* 可用于调试目的的客户端库或工具信息:例如,名称、版本和构建信息。 + + + +* 用户或者工具/系统的来源信息,例如来自其他生态系统组件的相关对象的 URL。 + + + +* 推出的轻量级工具的元数据信息:例如,配置或检查点。 + + + +* 负责人员的电话或呼机号码,或指定在何处可以找到该信息的目录条目,如团队网站。 + + + + +从用户到最终运行的指令,以修改行为或使用非标准功能。 + + +您可以将这类信息存储在外部数据库或目录中而不使用注解,但这样做就使得开发人员很难生成用于部署、管理、自检的客户端共享库和工具。 + + + + +## 语法和字符集 +_注解_ 存储的形式是键/值对。有效的注解键分为两部分:可选的前缀和名称,以斜杠(`/`)分隔。 名称段是必需项,并且必须在63个字符以内,以字母数字字符(`[a-z0-9A-Z]`)开头和结尾,并允许使用破折号(`-`),下划线(`_`),点(`.`)和字母数字。 前缀是可选的。 如果指定,则前缀必须是DNS子域:一系列由点(`.`)分隔的DNS标签,总计不超过253个字符,后跟斜杠(`/`)。 +如果省略前缀,则假定注释键对用户是私有的。 由系统组件添加的注释(例如,`kube-scheduler`,`kube-controller-manager`,`kube-apiserver`,`kubectl` 或其他第三方组件),必须为终端用户添加注释前缀。 + +```yaml + +apiVersion: v1 +kind: Pod +metadata: + name: annotations-demo + annotations: + imageregistry: "https://hub.docker.com/" +spec: + containers: + - name: nginx + image: nginx:1.7.9 + ports: + - containerPort: 80 + +``` + +{{% /capture %}} + +{{% capture whatsnext %}} +进一步了解[标签和选择器](/docs/concepts/overview/working-with-objects/labels/)。 + +{{% /capture %}} diff --git a/content/zh/docs/concepts/overview/working-with-objects/common-labels.md b/content/zh/docs/concepts/overview/working-with-objects/common-labels.md new file mode 100644 index 0000000000..f1b3575c45 --- /dev/null +++ b/content/zh/docs/concepts/overview/working-with-objects/common-labels.md @@ -0,0 +1,259 @@ +--- +title: 推荐使用的标签 +content_template: templates/concept +--- + + +{{% capture overview %}} + +除了 kubectl 和 dashboard 之外,您可以其他工具来可视化和管理 Kubernetes 对象。 +一组通用的标签可以让多个工具之间互操作,用所有工具都能理解的通用方式描述对象。 + + +除了支持工具外,推荐的标签还以一种可以查询的方式描述了应用程序。 + +{{% /capture %}} + +{{% capture body %}} + +元数据围绕 _应用(application)_ 的概念进行组织。Kubernetes 不是 +平台即服务(PaaS),没有或强制执行正式的应用程序概念。 +相反,应用程序是非正式的,并使用元数据进行描述。应用程序包含的定义是松散的。 + +{{< note >}} + +这些是推荐的标签。它们使管理应用程序变得更容易但不是任何核心工具所必需的。 +{{< /note >}} + + +共享标签和注解都使用同一个前缀:`app.kubernetes.io`。没有前缀的标签是用户私有的。共享前缀可以确保共享标签不会干扰用户自定义的标签。 + + +## 标签 +为了充分利用这些标签,应该在每个资源对象上都使用它们。 + + +| 键 | 描述 | 示例 | 类型 | +| ----------------------------------- | --------------------- | -------- | ---- | +| `app.kubernetes.io/name` | 应用程序的名称 | `mysql` | 字符串 | +| `app.kubernetes.io/instance` | 用于唯一确定应用实例的名称 | `wordpress-abcxzy` | 字符串 | +| `app.kubernetes.io/version` | 应用程序的当前版本(例如,语义版本,修订版哈希等) | `5.7.21` | 字符串 | +| `app.kubernetes.io/component` | 架构中的组件 | `database` | 字符串 | +| `app.kubernetes.io/part-of` | 此级别的更高级别应用程序的名称 | `wordpress` | 字符串 | +| `app.kubernetes.io/managed-by` | 用于管理应用程序的工具 | `helm` | 字符串 | + +为说明这些标签的实际使用情况,请看下面的 StatefulSet 对象: + +```yaml +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + app.kubernetes.io/name: mysql + app.kubernetes.io/instance: wordpress-abcxzy + app.kubernetes.io/version: "5.7.21" + app.kubernetes.io/component: database + app.kubernetes.io/part-of: wordpress + app.kubernetes.io/managed-by: helm +``` + + +## 应用和应用实例 + +应用可以在 Kubernetes 集群中安装一次或多次。在某些情况下,可以安装在同一命名空间中。例如,可以不止一次地为不同的站点安装不同的 wordpress。 + +应用的名称和实例的名称是分别记录的。例如,某 WordPress 实例的 `app.kubernetes.io/name` 为 `wordpress`,而其实例名称表现为 `app.kubernetes.io/instance` 的属性值 `wordpress-abcxzy`。这使应用程序和应用程序的实例成为可能是可识别的。应用程序的每个实例都必须具有唯一的名称。 + + +## 示例 + + +为了说明使用这些标签的不同方式,以下示例具有不同的复杂性。 + + +### 一个简单的无状态服务 + + +考虑使用 `Deployment` 和 `Service` 对象部署的简单无状态服务的情况。以下两个代码段表示如何以最简单的形式使用标签。 + + +下面的 `Deployment` 用于监督运行应用本身的 pods。 +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/name: myservice + app.kubernetes.io/instance: myservice-abcxzy +... +``` + + +下面的 `Service` 用于暴露应用。 +```yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: myservice + app.kubernetes.io/instance: myservice-abcxzy +... +``` + + +### 带有一个数据库的 Web 应用程序 + + +考虑一个稍微复杂的应用:一个使用 Helm 安装的 Web 应用(WordPress),其中 +使用了数据库(MySQL)。以下代码片段说明用于部署此应用程序的对象的开始。 + +以下 `Deployment` 的开头用于 WordPress: + + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/name: wordpress + app.kubernetes.io/instance: wordpress-abcxzy + app.kubernetes.io/version: "4.9.4" + app.kubernetes.io/managed-by: helm + app.kubernetes.io/component: server + app.kubernetes.io/part-of: wordpress +... +``` + + +这个 `Service` 用于暴露 WordPress: + +```yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: wordpress + app.kubernetes.io/instance: wordpress-abcxzy + app.kubernetes.io/version: "4.9.4" + app.kubernetes.io/managed-by: helm + app.kubernetes.io/component: server + app.kubernetes.io/part-of: wordpress +... +``` + + +MySQL 作为一个 `StatefulSet` 暴露,包含它和它所属的较大应用程序的元数据: +```yaml +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + app.kubernetes.io/name: mysql + app.kubernetes.io/instance: wordpress-abcxzy + app.kubernetes.io/managed-by: helm + app.kubernetes.io/component: database + app.kubernetes.io/part-of: wordpress + app.kubernetes.io/version: "5.7.21" +... +``` + + +`Service` 用于将 MySQL 作为 WordPress 的一部分暴露: +```yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: mysql + app.kubernetes.io/instance: wordpress-abcxzy + app.kubernetes.io/managed-by: helm + app.kubernetes.io/component: database + app.kubernetes.io/part-of: wordpress + app.kubernetes.io/version: "5.7.21" +... +``` + + +使用 MySQL `StatefulSet` 和 `Service`,您会注意到有关 MySQL 和 Wordpress 的信息,包括更广泛的应用程序。 + +{{% /capture %}} diff --git a/content/zh/docs/concepts/overview/working-with-objects/field-selectors.md b/content/zh/docs/concepts/overview/working-with-objects/field-selectors.md new file mode 100644 index 0000000000..c44acf5aa6 --- /dev/null +++ b/content/zh/docs/concepts/overview/working-with-objects/field-selectors.md @@ -0,0 +1,106 @@ +--- +title: 字段选择器 +weight: 60 +--- + + + +字段选择器允许您根据一个或多个资源字段的值[筛选 Kubernetes 资源](/docs/concepts/overview/working-with-objects/kubernetes-objects)。 +下面是一些使用字段选择器查询的例子: + + +* `metadata.name=my-service` +* `metadata.namespace!=default` +* `status.phase=Pending` + +下面这个 `kubectl` 命令将筛选出[`status.phase`](/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase)字段值为 `Running` 的所有 Pod: + + +```shell +$ kubectl get pods --field-selector status.phase=Running +``` + +{{< note >}} + +字段选择器本质上是资源*过滤器*。默认情况下,字段选择器/过滤器是未被应用的,这意味着指定类型的所有资源都会被筛选出来。 +这使得以下的两个 `kubectl` 查询是等价的: + + +```shell +$ kubectl get pods +$ kubectl get pods --field-selector "" +``` +{{< /note >}} + +## 支持的字段 + + +不同的 Kubernetes 资源类型支持不同的字段选择器。 +所有资源类型都支持 `metadata.name` 和 `metadata.namespace` 字段。 +使用不被支持的字段选择器会产生错误,例如: + + +```shell +$ kubectl get ingress --field-selector foo.bar=baz +Error from server (BadRequest): Unable to find "ingresses" that match label selector "", field selector "foo.bar=baz": "foo.bar" is not a known field selector: only "metadata.name", "metadata.namespace" +``` + +## 支持的运算符 + + +您可以使用 `=`、`==`和 `!=` 对字段选择器进行运算(`=` 和 `==` 的意义是相同的)。 +例如,下面这个 `kubectl` 命令将筛选所有不属于 `default` 名称空间的 Kubernetes Service: + + +```shell +$ kubectl get services --all-namespaces --field-selector metadata.namespace!=default +``` + +## 链式选择器 + + +同[标签](/docs/concepts/overview/working-with-objects/labels)和其他选择器一样,字段选择器可以通过使用逗号分隔的列表组成一个选择链。 +下面这个 `kubectl` 命令将筛选 `status.phase` 字段不等于 `Running` 同时 `spec.restartPolicy` 字段等于 `Always` 的所有 Pod: + + +```shell +$ kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always +``` + +## 多种资源类型 + + +您能够跨多种资源类型来使用字段选择器。 +下面这个 `kubectl` 命令将筛选出所有不在 `default` 命名空间中的 StatefulSet 和 Service: + + +```shell +$ kubectl get statefulsets,services --field-selector metadata.namespace!=default +``` diff --git a/content/zh/docs/concepts/overview/working-with-objects/kubernetes-objects.md b/content/zh/docs/concepts/overview/working-with-objects/kubernetes-objects.md index 14c85b0862..b835dc9b6b 100644 --- a/content/zh/docs/concepts/overview/working-with-objects/kubernetes-objects.md +++ b/content/zh/docs/concepts/overview/working-with-objects/kubernetes-objects.md @@ -5,18 +5,25 @@ redirect_from: - "/docs/concepts/abstractions/overview/" - "/docs/concepts/abstractions/overview.html" content_template: templates/concept -weight: 10 --- {{% capture overview %}} - + 本页说明了 Kubernetes 对象在 Kubernetes API 中是如何表示的,以及如何在 `.yaml` 格式的文件中表示。 {{% /capture %}} {{% capture body %}} + ## 理解 Kubernetes 对象 @@ -26,14 +33,21 @@ weight: 10 * 可以被应用使用的资源 * 关于应用运行时表现的策略,比如重启策略、升级策略,以及容错策略 + Kubernetes 对象是 “目标性记录” —— 一旦创建对象,Kubernetes 系统将持续工作以确保对象存在。通过创建对象,本质上是在告知 Kubernetes 系统,所需要的集群工作负载看起来是什么样子的,这就是 Kubernetes 集群的 **期望状态(Desired State)**。 -操作 Kubernetes 对象 —— 无论是创建、修改,或者删除 —— 需要使用 [Kubernetes API](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md)。比如,当使用 `kubectl` 命令行接口时,CLI 会执行必要的 Kubernetes API 调用,也可以在程序中直接调用 Kubernetes API。为了实现该目标,Kubernetes 当前提供了一个 `golang` [客户端库](https://github.com/kubernetes/client-go) -,其它语言库(例如[Python](https://github.com/kubernetes-incubator/client-python))也正在开发中。 +操作 Kubernetes 对象 —— 无论是创建、修改,或者删除 —— 需要使用 [Kubernetes API](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md)。比如,当使用 `kubectl` 命令行接口时,CLI 会执行必要的 Kubernetes API 调用,也可以在程序中使用 [客户端库](/docs/reference/using-api/client-libraries/) 直接调用 Kubernetes API。 + ### 对象规约(Spec)与状态(Status) @@ -41,16 +55,28 @@ Kubernetes 对象是 “目标性记录” —— 一旦创建对象,Kubernete *spec* 是必需的,它描述了对象的 *期望状态(Desired State)* —— 希望对象所具有的特征。 *status* 描述了对象的 *实际状态(Actual State)* ,它是由 Kubernetes 系统提供和更新的。在任何时刻,Kubernetes 控制面一直努力地管理着对象的实际状态以与期望状态相匹配。 - + 例如,Kubernetes Deployment 对象能够表示运行在集群中的应用。 当创建 Deployment 时,可能需要设置 Deployment 的规约,以指定该应用需要有 3 个副本在运行。 Kubernetes 系统读取 Deployment 规约,并启动我们所期望的该应用的 3 个实例 —— 更新状态以与规约相匹配。 如果那些实例中有失败的(一种状态变更),Kubernetes 系统通过修正来响应规约和状态之间的不一致 —— 这种情况,会启动一个新的实例来替换。 + + 关于对象 spec、status 和 metadata 的更多信息,查看 [Kubernetes API 约定](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md)。 + ### 描述 Kubernetes 对象 @@ -61,22 +87,40 @@ Kubernetes 系统读取 Deployment 规约,并启动我们所期望的该应用 这里有一个 `.yaml` 示例文件,展示了 Kubernetes Deployment 的必需字段和对象规约: -{{< code file="nginx-deployment.yaml" >}} +{{< codenew file="application/deployment.yaml" >}} -使用类似于上面的 `.yaml` 文件来创建 Deployment,一种方式是使用 `kubectl` 命令行接口(CLI)中的 [`kubectl create`](/docs/user-guide/kubectl/v1.7/#create) 命令,将 `.yaml` 文件作为参数。下面是一个示例: + + +使用类似于上面的 `.yaml` 文件来创建 Deployment,一种方式是使用 `kubectl` 命令行接口(CLI)中的 +[`kubectl apply`](/docs/reference/generated/kubectl/kubectl-commands#apply) 命令, +将 `.yaml` 文件作为参数。下面是一个示例: ```shell -$ kubectl create -f docs/user-guide/nginx-deployment.yaml --record +kubectl apply -f https://k8s.io/examples/application/deployment.yaml --record ``` - + 输出类似如下这样: ```shell -deployment "nginx-deployment" created +deployment.apps/nginx-deployment created ``` + ### 必需字段 @@ -86,13 +130,27 @@ deployment "nginx-deployment" created * `kind` - 想要创建的对象的类型 * `metadata` - 帮助识别对象唯一性的数据,包括一个 `name` 字符串、UID 和可选的 `namespace` + - -也需要提供对象的 `spec` 字段。对象 `spec` 的精确格式对每个 Kubernetes 对象来说是不同的,包含了特定于该对象的嵌套字段。[Kubernetes API 参考](/docs/api/)能够帮助我们找到任何我们想创建的对象的 spec 格式。 - +也需要提供对象的 `spec` 字段。对象 `spec` 的精确格式对每个 Kubernetes 对象来说是不同的,包含了特定于该对象的嵌套字段。[Kubernetes API 参考](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/)能够帮助我们找到任何我们想创建的对象的 spec 格式。 +例如,可以从 +[这里](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core) +查看 `Pod` 的 `spec` 格式, +并且可以从 +[这里](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#deploymentspec-v1-apps) +查看 `Deployment` 的 `spec` 格式。 {{% /capture %}} {{% capture whatsnext %}} + -* 了解最重要的基本 Kubernetes 对象,例如 [Pod](/docs/concepts/abstractions/pod/)。 +* 了解最重要的基本 Kubernetes 对象,例如 [Pod](/docs/concepts/workloads/pods/pod-overview/)。 {{% /capture %}} diff --git a/content/zh/docs/concepts/overview/working-with-objects/namespaces.md b/content/zh/docs/concepts/overview/working-with-objects/namespaces.md new file mode 100644 index 0000000000..1d71404e85 --- /dev/null +++ b/content/zh/docs/concepts/overview/working-with-objects/namespaces.md @@ -0,0 +1,219 @@ +--- +title: 命名空间 +content_template: templates/concept +weight: 30 +--- + + +{{% capture overview %}} + +Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 +这些虚拟集群被称为命名空间。 + + +{{% /capture %}} + + +{{% capture body %}} + +## 何时使用多个命名空间 + + +命名空间适用于存在很多跨多个团队或项目的用户的场景。 +对于只有几到几十个用户的集群,根本不需要创建或考虑命名空间。当您需要命名空间提供的特性时,请开始使用它们。 + + +命名空间为名称提供了一个范围。 +资源的名称需要在命名空间内是惟一的,但不能跨命名空间。命名空间不能嵌套在另外一个命名空间内,而且每个 Kubernetes +资源只能属于一个命名空间。 + + +命名空间是在多个用户之间划分集群资源的一种方法(通过[资源配额](/docs/concepts/policy/resource-quotas/))。 + + +在 Kubernetes 未来版本中,相同命名空间中的对象默认将具有相同的访问控制策略。 + + +不需要使用多个命名空间来分隔轻微不同的资源,例如同一软件的不同版本: +使用[标签](/docs/user-guide/labels)来区分同一命名空间中的不同资源。 + + +## 使用命名空间 + + +命名空间的创建和删除已在[命名空间的管理指南文档](/docs/admin/namespaces)中进行了描述。 + + +### 查看命名空间 + + +您可以使用以下命令列出集群中现存的命名空间: + + +```shell +$ kubectl get namespace +``` +``` +NAME STATUS AGE +default Active 1d +kube-system Active 1d +kube-public Active 1d +``` + +Kubernetes 会创建三个初始命名空间: + + + * `default` 没有指明使用其它命名空间的对象所使用的默认命名空间 + * `kube-system` Kubernetes 系统创建对象所使用的命名空间 + * `kube-public` 这个命名空间是自动创建的,所有用户(包括未经过身份验证的用户)都可以读取它。这个命名空间主要用于集群使用,以防某些资源在整个集群中应该是可见和可读的。这个命名空间的公共方面只是一种约定,而不是要求。 + +### 为请求设置命名空间 + + +要为当前的请求设定一个命名空间,请使用 `--namespace` 参数。 + + +例如: + + +```shell +kubectl run nginx --image=nginx --namespace= +kubectl get pods --namespace= +``` + +### 设置命名空间首选项 + + +您可以永久保存该上下文中所有后续 kubectl 命令使用的命名空间。 + + +```shell +kubectl config set-context --current --namespace= +# Validate it +kubectl config view | grep namespace: +``` + +## 命名空间和 DNS + + +当您创建一个[服务](/docs/user-guide/services)时,Kubernetes 会创建一个相应的[DNS 条目](/docs/concepts/services-networking/dns-pod-service/)。 + + +该条目的形式是 `..svc.cluster.local`, +这意味着如果容器只使用 ``,它将被解析到本地命名空间的服务。 +这对于跨多个命名空间(如开发、分级和生产)使用相同的配置非常有用。 +如果您希望跨命名空间访问,则需要使用完全限定域名(FQDN)。 + + +## 并非所有对象都在命名空间中 + + +大多数 kubernetes 资源(例如 Pod、服务、副本控制器等)都位于某些命名空间中。 +但是命名空间资源本身并不在命名空间中。 + + +而且底层资源,例如[节点](/docs/admin/node)和持久化卷不属于任何命名空间。 + + +查看哪些 Kubernetes 资源在命名空间中,哪些不在命名空间中: + + +```shell +# In a namespace +kubectl api-resources --namespaced=true + +# Not in a namespace +kubectl api-resources --namespaced=false +``` + +{{% /capture %}} + +{{% capture whatsnext %}} + + +* 了解相关内容 [创建一个新的命名空间](/docs/tasks/administer-cluster/namespaces/#creating-a-new-namespace). +* 了解相关内容 [删除一个命名空间](/docs/tasks/administer-cluster/namespaces/#deleting-a-namespace). +{{% /capture %}} + diff --git a/content/zh/docs/concepts/policy/_index.md b/content/zh/docs/concepts/policy/_index.md new file mode 100644 index 0000000000..a724a7dd47 --- /dev/null +++ b/content/zh/docs/concepts/policy/_index.md @@ -0,0 +1,11 @@ +--- +title: "策略" +weight: 160 +--- + + diff --git a/content/zh/docs/concepts/services-networking/_index.md b/content/zh/docs/concepts/services-networking/_index.md new file mode 100644 index 0000000000..905f25af01 --- /dev/null +++ b/content/zh/docs/concepts/services-networking/_index.md @@ -0,0 +1,11 @@ +--- +title: "服务、负载均衡和联网" +weight: 80 +--- + + diff --git a/content/zh/docs/concepts/services-networking/ingress-controllers.md b/content/zh/docs/concepts/services-networking/ingress-controllers.md new file mode 100644 index 0000000000..f9e416028c --- /dev/null +++ b/content/zh/docs/concepts/services-networking/ingress-controllers.md @@ -0,0 +1,126 @@ +--- +title: Ingress 控制器 +content_template: templates/concept +weight: 40 +--- + + +{{% capture overview %}} + + + +为了让 Ingress 资源工作,集群必须有一个正在运行的 Ingress 控制器。 + +与其他类型的控制器不同,它们是作为 `kube-controller-manager` 二进制文件的一部分运行的,而 Ingress 控制器不是随集群自动启动的。 +通过此页面可选择最适合您的集群的 ingress 控制器实现。 + +Kubernetes 作为一个项目,目前支持和维护 [GCE](https://git.k8s.io/ingress-gce/README.md) 和 + [nginx](https://git.k8s.io/ingress-nginx/README.md) 控制器。 + +{{% /capture %}} + +{{% capture body %}} + + + +## 其他控制器 + +* [Ambassador](https://www.getambassador.io/) API 网关, 一个基于 [Envoy](https://www.envoyproxy.io) 的 ingress + 控制器,有着来自 [Datawire](https://www.datawire.io/) [社区](https://www.getambassador.io/docs)或[商业](https://www.getambassador.io/pro/)的支持。 +* [AppsCode Inc.](https://appscode.com) 为最广泛使用的基于 [HAProxy](http://www.haproxy.org/) 的 ingress 控制器 [Voyager](https://appscode.com/products/voyager) 提供支持和维护. +* [Contour](https://github.com/heptio/contour) 是一个基于 [Envoy](https://www.envoyproxy.io) 的 ingress 控制器,它由 Heptio 提供和支持。 +* Citrix 为其硬件(MPX),虚拟化(VPX)和 [免费容器化 (CPX) ADC](https://www.citrix.com/products/citrix-adc/cpx-express.html) 提供了一个 [Ingress 控制器](https://github.com/citrix/citrix-k8s-ingress-controller),用于[裸金属](https://github.com/citrix/citrix-k8s-ingress-controller/tree/master/deployment/baremetal)和[云](https://github.com/citrix/citrix-k8s-ingress-controller/tree/master/deployment)部署。 +* F5 Networks 为 [用于 Kubernetes 的 F5 BIG-IP 控制器](http://clouddocs.f5.com/products/connectors/k8s-bigip-ctlr/latest)提供[支持和维护](https://support.f5.com/csp/article/K86859508)。 +* [Gloo](https://gloo.solo.io) 是一个开源的基于 [Envoy](https://www.envoyproxy.io) 的 ingress 控制器,它提供了 API 网关功能,有着来自 [solo.io](https://www.solo.io) 的企业级支持。 +* 基于 [HAProxy](http://www.haproxy.org/) 的 ingress 控制器 + [jcmoraisjr/haproxy-ingress](https://github.com/jcmoraisjr/haproxy-ingress), + [用于 Kubernetes 的 HAProxy Ingress 控制器](https://www.haproxy.com/blog/haproxy_ingress_controller_for_kubernetes/)这篇博文提到它。 + [HAProxy Technologies](https://www.haproxy.com/) 为 HAProxy 企业版和 + ingress 控制器 [jcmoraisjr/haproxy-ingress](https://github.com/jcmoraisjr/haproxy-ingress) 提供支持和维护。 +* 基于 [Istio](https://istio.io/) 的 ingress 控制器[控制 Ingress 流量](https://istio.io/docs/tasks/traffic-management/ingress/)。 +* [Kong](https://konghq.com/) 为[用于 Kubernetes 的 Kong Ingress 控制器](https://github.com/Kong/kubernetes-ingress-controller) 提供[社区](https://discuss.konghq.com/c/kubernetes)或[商业](https://konghq.com/kong-enterprise/)支持和维护。 +* [NGINX, Inc.](https://www.nginx.com/) 为[用于 Kubernetes 的 NGINX Ingress 控制器](https://www.nginx.com/products/nginx/kubernetes-ingress-controller)提供支持和维护。 +* [Traefik](https://github.com/containous/traefik) 是一个全功能的 ingress 控制器 + ([Let's Encrypt](https://letsencrypt.org),secrets,http2,websocket),并且它也有来自 [Containous](https://containo.us/services) 的商业支持。 + + +## 使用多个 Ingress 控制器 + +你可以在集群中部署[任意数量的 ingress 控制器](https://git.k8s.io/ingress-nginx/docs/user-guide/multiple-ingress.md#multiple-ingress-controllers)。 +创建 ingress 时,应该使用适当的 +[`ingress.class`](https://git.k8s.io/ingress-gce/docs/faq/README.md#how-do-i-run-multiple-ingress-controllers-in-the-same-cluster) 注解每个 ingress +以表明在集群中如果有多个 ingress 控制器时,应该使用哪个 ingress 控制器。 + +如果不定义 `ingress.class`,云提供商可能使用默认的 ingress 控制器。 + +理想情况下,所有 ingress 控制器都应满足此规范,但各种 ingress 控制器的操作略有不同。 + +{{< note >}} + +确保您查看了 ingress 控制器的文档,以了解选择它的注意事项。 +{{< /note >}} + +{{% /capture %}} + +{{% capture whatsnext %}} + + + +* 了解更多关于 [Ingress](/docs/concepts/services-networking/ingress/)。 +* [在 Minikube 上使用 NGINX 控制器安装 Ingress](/docs/tasks/access-application-cluster/ingress-minikube)。 +{{% /capture %}}