diff --git a/content/zh/_redirects b/content/zh/_redirects new file mode 100644 index 0000000000..a38fbcc91b --- /dev/null +++ b/content/zh/_redirects @@ -0,0 +1 @@ +/zh/docs/ /zh/docs/home/ 301 diff --git a/content/zh/docs/_index.md b/content/zh/docs/_index.md index b274dc98cd..0b9545eaa6 100644 --- a/content/zh/docs/_index.md +++ b/content/zh/docs/_index.md @@ -1,5 +1,5 @@ --- -title: 主页 +title: 文档 weight: 5 --- diff --git a/content/zh/docs/concepts/workloads/controllers/daemonset.md b/content/zh/docs/concepts/workloads/controllers/daemonset.md index 7468ae1b57..5ee255fb75 100644 --- a/content/zh/docs/concepts/workloads/controllers/daemonset.md +++ b/content/zh/docs/concepts/workloads/controllers/daemonset.md @@ -1,163 +1,416 @@ --- -approvers: +reviewers: +- enisoc - erictune +- foxish +- janetkuo +- kow3ns title: DaemonSet -redirect_from: -- "/docs/admin/daemons/" -- "/docs/admin/daemons.html" +content_template: templates/concept +weight: 50 --- -{{< toc >}} + +{{% capture overview %}} + + _DaemonSet_ 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, +也会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。 -## 什么是 DaemonSet? - - _DaemonSet_ 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时,也会为他们新增一个 Pod 。 - 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。 - - + 使用 DaemonSet 的一些典型用法: - 运行集群存储 daemon,例如在每个节点上运行 `glusterd`、`ceph`。 - 在每个节点上运行日志收集 daemon,例如`fluentd`、`logstash`。 -- 在每个节点上运行监控 daemon,例如 [Prometheus Node Exporter](https://github.com/prometheus/node_exporter)、`collectd`、Datadog 代理、New Relic 代理, Ganglia `gmond`, 或 [Instana Agent](https://www.instana.com/supported-integrations/kubernetes-monitoring/)。 +- 在每个节点上运行监控 daemon,例如 [Prometheus Node Exporter](https://github.com/prometheus/node_exporter)、`collectd`、[Dynatrace OneAgent](https://www.dynatrace.com/technologies/kubernetes-monitoring/)、 [AppDynamics 代理](https://docs.appdynamics.com/display/CLOUD/Container+Visibility+with+Kubernetes)、 [Datadog 代理](https://docs.datadoghq.com/agent/kubernetes/daemonset_setup/)、[New Relic 代理](https://docs.newrelic.com/docs/integrations/kubernetes-integration/installation/kubernetes-installation-configuration), Ganglia `gmond` 或 Instana agent。 -一个简单的用法是在所有的节点上都启动一个 DaemonSet,将被作为每种类型的 daemon 使用。 -一个稍微复杂的用法是单独对每种 daemon 类型使用多个 DaemonSet,但具有不同的标志,和/或对不同硬件类型具有不同的内存、CPU要求。 + +一个简单的用法是在所有的节点上都启动一个 DaemonSet,将被作为每种类型的 daemon 使 +用。 +一个稍微复杂的用法是单独对每种 daemon 类型使用多个 DaemonSet,但具有不同的标志, +和/或对不同硬件类型具有不同的内存、CPU要求。 + +{{% /capture %}} +{{% capture body %}} -## 编写 DaemonSet 规约 + +## 编写 DaemonSet 规约 + +### 创建 DaemonSet + + +您可以在 YAML 文件中描述 DaemonSet。例如,下面的 daemonset.yaml 文件描述了一个运行 fluentd-elasticsearch Docker 镜像的 DaemonSet: + +{{< codenew file="controllers/daemonset.yaml" >}} + +* 基于 YAML 文件创建 DaemonSet: +``` +kubectl apply -f https://k8s.io/examples/controllers/daemonset.yaml +``` + + ### 必需字段 - - - -和其它所有 Kubernetes 配置一样,DaemonSet 需要 `apiVersion`、`kind` 和 `metadata` 字段。 -有关配置文件的基本信息,详见文档 [deploying applications](/docs/user-guide/deploying-applications/)、[配置容器](/docs/user-guide/configuring-containers/) 和 [资源管理](/docs/concepts/tools/kubectl/object-management-overview/) 。 +和其它所有 Kubernetes 配置一样,DaemonSet 需要 `apiVersion`、`kind` 和 `metadata` 字段。有关配置文件的基本信息,详见文档 [部署应用](/docs/user-guide/deploying-applications/)、[配置容器](/docs/tasks/) 和 [使用kubectl进行对象管理](/docs/concepts/overview/object-management-kubectl/overview/) 。 DaemonSet 也需要一个 [`.spec`](https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status) 配置段。 + ### Pod 模板 `.spec` 唯一必需的字段是 `.spec.template`。 - - -`.spec.template` 是一个 [Pod 模板](/docs/user-guide/replication-controller/#pod-template)。 -它与 [Pod](/docs/user-guide/pods) 具有相同的 schema,除了它是嵌套的,而且不具有 `apiVersion` 或 `kind` 字段。 +`.spec.template` 是一个 [Pod 模板](/docs/concepts/workloads/pods/pod-overview/#pod-templates)。它与 [Pod](/docs/concepts/workloads/pods/pod/) 具有相同的 schema,除了它是嵌套的,而且不具有 `apiVersion` 或 `kind` 字段。 除了 Pod 必需字段外,在 DaemonSet 中的 Pod 模板必须指定合理的标签(查看 [Pod Selector](#pod-selector))。 在 DaemonSet 中的 Pod 模板必须具有一个值为 `Always` 的 [`RestartPolicy`](/docs/user-guide/pod-states),或者未指定它的值,默认是 `Always`。 - - + +### Pod Selector + +`.spec.selector` 字段表示 Pod Selector,它与 [Job](/docs/concepts/jobs/run-to-completion-finite-workloads/) 的 `.spec.selector` 的作用是相同的。 + +从 Kubernetes 1.8开始,您必须指定与 `.spec.template` 的标签匹配的 pod selector。当不配置时,pod selector 将不再有默认值。selector 默认与 `kubectl apply` 不兼容。 此外,一旦创建了 DaemonSet,它的 `.spec.selector` 就不能修改。修改 pod selector 可能导致成为 孤儿Pod,并且这对用户来说是困惑的。 + + `spec.selector` 表示一个对象,它由如下两个字段组成: * `matchLabels` - 与 [ReplicationController](/docs/concepts/workloads/controllers/replicationcontroller/) 的 `.spec.selector` 的作用相同。 -* `matchExpressions` - 允许构建更加复杂的 Selector,可以通过指定 key、value 列表,以及与 key 和 value 列表相关的操作符。 - - +* `matchExpressions` - 允许构建更加复杂的 Selector,可以通过指定 key、value 列表 +,以及与 key 和 value 列表相关的操作符。 当上述两个字段都指定时,结果表示的是 AND 关系。 -如果指定了 `.spec.selector`,必须与 `.spec.template.metadata.labels` 相匹配。如果没有指定,它们默认是等价的。如果与它们配置的不匹配,则会被 API 拒绝。 - -如果 Pod 的 label 与 selector 匹配,或者直接基于其它的 DaemonSet、或者 Controller(例如 ReplicationController),也不可以创建任何 Pod。 -否则 DaemonSet Controller 将认为那些 Pod 是它创建的。Kubernetes 不会阻止这样做。一个场景是,可能希望在一个具有不同值的、用来测试用的节点上手动创建 Pod。 +如果指定了 `.spec.selector`,必须与 `.spec.template.metadata.labels` 相匹配。如果与它们配置的不匹配,则会被 API 拒绝。 +此外,您通常不应该创建任何 pods,它们的 label 与 selector 匹配,或者直接创建,或者通过另一个 DaemonSet、或者其他控制器,比如 ReplicaSet。否则,DaemonSet 控制器会认为这些 Pod 是由它创建的。Kubernetes 不会阻止你这样做。 您可能希望这样做的一种情况是在节点上手动创建具有不同值的 Pod 以进行测试。 + ### 仅在某些节点上运行 Pod -如果指定了 `.spec.template.spec.nodeSelector`,DaemonSet Controller 将在能够与 [Node Selector](/docs/concepts/configuration/assign-pod-node/) 匹配的节点上创建 Pod。 -类似这种情况,可以指定 `.spec.template.spec.affinity`,然后 DaemonSet Controller 将在能够与 [Node Affinity](/docs/concepts/configuration/assign-pod-node/) 匹配的节点上创建 Pod。 +如果指定了 `.spec.template.spec.nodeSelector`,DaemonSet Controller 将在能够与 [Node Selector](/docs/concepts/configuration/assign-pod-node/) 匹配的节点上创建 Pod。类似这种情况,可以指定 `.spec.template.spec.affinity`,然后 DaemonSet Controller 将在能够与 [node Affinity](/docs/concepts/configuration/assign-pod-node/) 匹配>的节点上创建 Pod。 如果根本就没有指定,则 DaemonSet Controller 将在所有节点上创建 Pod。 + +## 如何调度 Daemon Pods + +### 由 DaemonSet 控制器调度(从v1.12 开始默认禁用) + +正常情况下,Pod 运行在哪个机器上是由 Kubernetes 调度器来选择的。然而,由 DaemonSet Controller 创建的 Pod 已经确定了在哪个机器上(Pod 创建时指定了 `.spec.nodeName`,调度器会忽略它),因此: - DaemonSet Controller 并不关心一个节点的 [`unschedulable`](/docs/admin/node/#manual-node-administration) 字段。 - DaemonSet Controller 可以创建 Pod,即使调度器还没有启动,这对集群启动是非常有帮助的。 + +### 由默认 scheduler 调度(从v1.12开始默认开启) + +{{< feature-state state="beta" for-kubernetes-version="1.12" >}} + +DaemonSet 确保所有符合条件的节点都运行一个 Pod 的副本。通常,运行 Pod 的节点由 Kubernetes scheduler 选择。然而,DaemonSet pods 由 DaemonSet controller 创建和调度。这将引入以下问题: + + * Pod 行为的不一致性:等待调度的正常 Pod 已被创建并处于 `Pending` 状态,但 DaemonSet pods 未在 `Pending` 状态下创建。 这使用户感到困惑。 + * [Pod preemption](/docs/concepts/configuration/pod-priority-preemption/)由默认 scheduler 处理。 启用抢占后,DaemonSet 控制器将在不考虑 pod 优先级和抢占的情况下制定调度决策。 + + +`ScheduleDaemonSetPods` 允许您使用默认 scheduler 而不是 DaemonSet 控制器来调度 DaemonSets,方法是将 `NodeAffinity` 添加到 DaemonSet pods,而不是 `.spec.nodeName`。 然后使用默认 scheduler 将 pod 绑定到目标主机。 如果 DaemonSet pod的亲和节点已存在,则替换它。 DaemonSet 控制器仅在创建或修改 DaemonSet pods 时执行这些操作,并且不对 DaemonSet的 `spec.template` 进行任何更改。 + +```yaml +nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchFields: + - key: metadata.name + operator: In + values: + - target-host-name +``` + + +此外,`node.kubernetes.io/unschedulable:NoSchedule` toleration 会自动添加到 DaemonSet Pods。 在调度DaemonSet Pod 时,默认调度器会忽略 `unschedulable`节点。 + + +### Taints and Tolerations + +尽管 Daemon Pods 尊重[taints and tolerations](/docs/concepts/configuration/taint-and-toleration),根据相关特性,会自动将以下 tolerations 添加到 DaemonSet Pods 中。 + +| Toleration Key | Effect | Version | Description | +| ---------------------------------------- | ---------- | ------- | ------------------------------------------------------------ | +| `node.kubernetes.io/not-ready` | NoExecute | 1.13+ | DaemonSet pods will not be evicted when there are node problems such as a network partition. | +| `node.kubernetes.io/unreachable` | NoExecute | 1.13+ | DaemonSet pods will not be evicted when there are node problems such as a network partition. | +| `node.kubernetes.io/disk-pressure` | NoSchedule | 1.8+ | | +| `node.kubernetes.io/memory-pressure` | NoSchedule | 1.8+ | | +| `node.kubernetes.io/unschedulable` | NoSchedule | 1.12+ | DaemonSet pods tolerate unschedulable attributes by default scheduler. | +| `node.kubernetes.io/network-unavailable` | NoSchedule | 1.12+ | DaemonSet pods, who uses host network, tolerate network-unavailable attributes by default scheduler. | -## 与 Daemon Pod 通信 + +## 与 Daemon Pods 通信 与 DaemonSet 中的 Pod 进行通信,几种可能的模式如下: - **Push**:配置 DaemonSet 中的 Pod 向其它 Service 发送更新,例如统计数据库。它们没有客户端。 -- **NodeIP 和已知端口**:DaemonSet 中的 Pod 可以使用 `hostPort`,从而可以通过节点 IP 访问到 Pod。客户端能通过某种方法知道节点 IP 列表,并且基于此也可以知道端口。 -- **DNS**:创建具有相同 Pod Selector 的 [Headless Service](/docs/user-guide/services/#headless-services),然后通过使用 `endpoints` 资源或从 DNS 检索到多个 A 记录来发现 DaemonSet。 +- **NodeIP 和已知端口**:DaemonSet 中的 Pod 可以使用 `hostPort`,从而可以通过节点 IP 访问到 Pod。客户端能通过某种方法知道节点 IP 列表,并且基于此也可以知道端口 +。 +- **DNS**:创建具有相同 Pod Selector 的 [Headless Service](/docs/concepts/services-networking/service/#headless-services),然后通过使用 `endpoints` 资源或从 DNS 检索到多个 A 记录来发现 DaemonSet。 - **Service**:创建具有相同 Pod Selector 的 Service,并使用该 Service 随机访问到某个节点上的 daemon(没有办法访问到特定节点)。 + ## 更新 DaemonSet -如果修改了节点标签(Label),DaemonSet 将立刻向新匹配上的节点添加 Pod,同时删除新近不能够匹配的节点上的 Pod。 +如果修改了节点标签(Label),DaemonSet 将立刻向新匹配上的节点添加 Pod,同时删除不能够匹配的节点上的 Pod。 -我们可以修改 DaemonSet 创建的 Pod。然而,不允许对 Pod 的所有字段进行更新。当下次节点(即使具有相同的名称)被创建时,DaemonSet Controller 还会使用最初的模板。 +您可以修改 DaemonSet 创建的 Pod。然而,不允许对 Pod 的所有字段进行更新。当下次 +节点(即使具有相同的名称)被创建时,DaemonSet Controller 还会使用最初的模板。 +您可以删除一个 DaemonSet。如果使用 `kubectl` 并指定 `--cascade=false` 选项,则 Pod 将被保留在节点上。然后可以创建具有不同模板的新 DaemonSet。具有不同模板的新 DaemonSet 将能够通过标签匹配并识别所有已经存在的 Pod。它不会修改或删除它们,即使是错误匹配了 Pod 模板。通过删除 Pod 或者删除节点,可以强制创建新的 Pod。 - -可以删除一个 DaemonSet。如果使用 `kubectl` 并指定 `--cascade=false` 选项,则 Pod 将被保留在节点上。然后可以创建具有不同模板的新 DaemonSet。具有不同模板的新 DaemonSet 将能够通过标签匹配并识别所有已经存在的 Pod。它不会修改或删除它们,即使是错误匹配了 Pod 模板。通过删除 Pod 或者删除节点,可以强制创建新的 Pod。 - + 在 Kubernetes 1.6 或以后版本,可以在 DaemonSet 上 [执行滚动升级](/docs/tasks/manage-daemon/update-daemon-set/)。 -未来的 Kubernetes 版本将支持节点的可控更新。 + ## DaemonSet 的可替代选择 ### init 脚本 我们很可能希望直接在一个节点上启动 daemon 进程(例如,使用 `init`、`upstartd`、或 `systemd`)。这非常好,但基于 DaemonSet 来运行这些进程有如下一些好处: - - - 像对待应用程序一样,具备为 daemon 提供监控和管理日志的能力。 - 为 daemon 和应用程序使用相同的配置语言和工具(如 Pod 模板、`kubectl`)。 -- Kubernetes 未来版本可能会支持对 DaemonSet 创建 Pod 与节点升级工作流进行集成。 - 在资源受限的容器中运行 daemon,能够增加 daemon 和应用容器的隔离性。然而,这也实现了在容器中运行 daemon,但却不能在 Pod 中运行(例如,直接基于 Docker 启动)。 + ### 裸 Pod -可能要直接创建 Pod,同时指定其运行在特定的节点上。 -然而,DaemonSet 替换了由于任何原因被删除或终止的 Pod,例如节点失败、例行节点维护、内核升级。由于这个原因,我们应该使用 DaemonSet 而不是单独创建 Pod。 - +可能要直接创建 Pod,同时指定其运行在特定的节点上。然而,DaemonSet 替换了由于任何原因被删除或终止的 Pod,例如节点失败、例行节点维护、内核升级。由于这个原因,我们应该使用 DaemonSet 而不是单独创建 Pod。 + ### 静态 Pod 可能需要通过在一个指定目录下编写文件来创建 Pod,该目录受 Kubelet 所监视。这些 Pod 被称为 [静态 Pod](/docs/concepts/cluster-administration/static-pod/)。 -不像 DaemonSet,静态 Pod 不受 kubectl 和其它 Kubernetes API 客户端管理。静态 Pod 不依赖于 apiserver,这使得它们在集群启动的情况下非常有用。 -而且,未来静态 Pod 可能会被废弃掉。 +不像 DaemonSet,静态 Pod 不受 kubectl 和其它 Kubernetes API 客户端管理。静态 Pod 不依赖于 apiserver,这使得它们在集群启动的情况下非常有用。而且,未来静态 Pod 可能会被废弃掉。 + +### Deployments -DaemonSet 与 [Replication Controller](/docs/user-guide/replication-controller) 非常类似,它们都能创建 Pod,这些 Pod 对应的进程都不希望被终止掉(例如,Web 服务器、存储服务器)。 -为无状态的 Service 使用 Replication Controller,比如前端(Frontend)服务,实现对副本的数量进行扩缩容、平滑升级,比之于精确控制 Pod 运行在某个主机上要重要得多。 +DaemonSet 与 [Deployments](/docs/concepts/workloads/controllers/deployment/)非常类似,它们都能创建 Pod,这些 Pod 对应的进程都不希望被终止掉(例如,Web 服务器、存储服务器)。 +为无状态的 Service 使用 Deployments,比如前端 Frontend 服务,实现对副本的数量进行扩缩容、平滑升级,比基于精确控制 Pod 运行在某个主机上要重要得多。 需要 Pod 副本总是运行在全部或特定主机上,并需要先于其他 Pod 启动,当这被认为非常重要时,应该使用 Daemon Controller。 +{{% /capture %}} diff --git a/content/zh/docs/home/_index.md b/content/zh/docs/home/_index.md index 9a9d8b1e3f..76df61cbf8 100644 --- a/content/zh/docs/home/_index.md +++ b/content/zh/docs/home/_index.md @@ -2,19 +2,98 @@ title: Kubernetes 文档 layout: docsportal_home noedit: true -cid: userJourneys -css: /css/style_user_journeys.css -js: /js/user-journeys/home.js, https://use.fontawesome.com/4bcc658a89.js +class: gridPage display_browse_numbers: true linkTitle: "主页" main_menu: true weight: 10 +hide_feedback: true menu: main: title: "文档" weight: 20 post: >

通过演练,示例和参考文档了解如何使用 Kubernetes。你甚至可以帮助贡献文档

+ +overview: > + + Kubernetes 是一个开源容器编排引擎,用于容器化应用的自动化部署、扩展和管理。该项目托管在 CNCF。 + + + +cards: +- name: concepts + title: "了解基本知识" + description: "了解 Kubernetes 和其基础概念。" + button: "了解概念" + button_path: "/zh/docs/concepts" +- name: tutorials + title: "尝试 Kubernetes" + description: "按照教程学习如何在 Kubernetes 上部署应用。" + button: "查看教程" + button_path: "/zh/docs/tutorials" +- name: setup + title: "设置集群" + description: "按照你的资源情况和需求运行 Kubernetes。" + button: "设置 Kubernetes" + button_path: "/zh/docs/setup" +- name: tasks + title: "了解如何使用 Kubernetes" + description: "查看常见任务以及如何使用简单步骤执行它们。" + button: "查看任务" + button_path: "/zh/docs/tasks" +- name: reference + title: 参考 + description: 术语、命令行语法、API 资源类型和设置工具文档 + button: 查看参考 + button_path: /zh/docs/reference +- name: contribute + title: 为该文档作出贡献 + description: 任何人,无论对该项目熟悉与否,都能贡献自己的力量。 + button: 参与贡献 + button_path: /zh/docs/contribute +- name: download + title: 下载 Kubernetes + description: 如果你正在安装或升级 Kubernetes 的话,最好参考最新的发行版说明。 +- name: about + title: 关于文档 + description: 该网站包含了当前版本以及前 4 个版本的 Kubernetes 文档。 --- +title: 动态准入控制 +content_template: templates/concept +weight: 40 +--- + +{{% capture overview %}} + +[admission 控制器文档](/docs/reference/access-authn-authz/admission-controllers/) +介绍如何使用标准的插件式 admission 控制器。然而, +由于以下原因插件 admission 控制器对于所有用例来说都不够灵活: + +* 他们需要编译到 kube-apiserver 里面。 +* 它们仅在 apiserver 启动时可配置。 + +*Admission Webhooks*(1.9 版中的 beta)解决了这些限制。 +它允许 admission 控制器能被独立开发以及在运行时配置。 + +本页介绍如何使用 Admission Webhooks。 +{{% /capture %}} + +{{% capture body %}} + +### 什么是 admission webhook? + + +Admission webhooks 是 HTTP 回调,它接收 admission 请求并对它们做一些事情。 +您可以定义两种类型的 admission webhook, +[validating admission Webhook](/docs/reference/access-authn-authz/admission-controllers/#validatingadmissionwebhook) +和 +[mutating admission webhook](/docs/reference/access-authn-authz/admission-controllers/#mutatingadmissionwebhook)。 +通过 validating admission Webhook,您可以拒绝请求以执行自定义的 admission 策略。 +通过 mutating admission webhook,您可以更改请求以执行自定义的默认值。 + + +### 尝试 admission webhook + +admission webhook 本质上是集群控制平面的一部分。 您应该非常谨慎地编写和部署它们。 +如果您打算编写/部署生产级 admission webhook,请阅读[用户指南](/docs/reference/access-authn-authz/extensible-admission-controllers/#write-an-admission-webhook-server)以获取相关说明。 +在下文中,我们将介绍如何快速试验 admission webhook。 + + +### 先决条件 + +* 确保 Kubernetes 集群版本至少为 v1.9。 + +* 确保启用 MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook 控制器。 + [这里](/docs/reference/access-authn-authz/admission-controllers/#is-there-a-recommended-set-of-admission-controllers-to-use) + 是一组推荐的 admission 控制器,通常可以启用。 + +* 确保启用了`admissionregistration.k8s.io/v1beta1` API。 + + +### 编写一个admission webhook 服务器 + +请参阅 Kubernetes e2e 测试中的 +[admission webhook 服务器](https://github.com/kubernetes/kubernetes/blob/v1.13.0/test/images/webhook/main.go)实现。 + webhook 处理由 apiservers 发送的 `admissionReview` 请求,并将其决定包含在 `admissionResponse` 中发回。 + +`admissionReview` 请求可以有不同的版本(例如,`v1beta1` 或未来版本中的 `v1`)。 +webhook 可以使用 `admissionReviewVersions` 字段定义它们接受的版本。 +API 服务器将尝试在其支持的列表中使用第一个版本。 +如果 API 服务器不支持此列表中指定的任何版本,则此对象的验证将失败。 +如果 webhook 配置依然如此,则对 we​​bhook 的调用将失败并受到失败策略的控制。 + +示例 admission webhook 服务器置 `ClientAuth` 字段为 +[空](https://github.com/kubernetes/kubernetes/blob/v1.13.0/test/images/webhook/config.go#L47-L48), +默认为 `NoClientCert` 。这意味着 webhook 服务器不会验证客户端的身份,认为其是 apiservers。 +如果您需要双向 TLS 或其他方式来验证客户端,请参阅如何[验证 apiservers](#验证 apiservers)。 + + +### 部署 admission webhook 服务 + +e2e 测试中的 webhook 服务器部署在 Kubernetes 集群中,通过 [deployment API](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#deployment-v1beta1-apps)。 +该测试还创建了 [service](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#service-v1-core) 作为 webhook 服务器的前端。 +参见[代码](https://github.com/kubernetes/kubernetes/blob/v1.13.0/test/e2e/apimachinery/webhook.go#L227)。 + +您还可以在集群外部署 Webhook, +这需要相应地更新 [webhook 客户端配置](https://github.com/kubernetes/kubernetes/blob/v1.13.0/staging/src/k8s.io/api/admissionregistration/v1beta1/types.go#L247)。 + + +### 动态配置 admission webhook + +您可以通过 +[ValidatingWebhookConfiguration](https://github.com/kubernetes/kubernetes/blob/v1.13.0/staging/src/k8s.io/api/admissionregistration/v1beta1/types.go#L84) +或 +[MutatingWebhookConfiguration](https://github.com/kubernetes/kubernetes/blob/v1.13.0/staging/src/k8s.io/api/admissionregistration/v1beta1/types.go#L114) +动态配置哪些资源通过哪些 admission webhook + +以下是 `validatingWebhookConfiguration` 的示例,Mutating Webhook Configuration 类似。 + +```yaml +apiVersion: admissionregistration.k8s.io/v1beta1 +kind: ValidatingWebhookConfiguration +metadata: + name: +webhooks: +- name: + rules: + - apiGroups: + - "" + apiVersions: + - v1 + operations: + - CREATE + resources: + - pods + scope: "Namespaced" + clientConfig: + service: + namespace: + name: + caBundle: + admissionReviewVersions: + - v1beta1 + timeoutSeconds: 1 +``` + + +scope 字段指定是否只有集群范围的资源(“Cluster”)或命名空间范围的资源(“Namespaced”)才匹配此规则。 “*” 表示没有范围限制。 + +{{< note >}} +使用`clientConfig.service`时,服务器证书必须对`..svc`有效。 +{{< /note >}} + +{{< note >}} +webhook 调用的默认超时为 30 秒,但从 kubernetes 1.14 开始,您可以设置超时,并鼓励对 webhook 使用非常小的超时时间。 +如果 webhook 调用超时,则根据 webhook 的失败策略处理请求。 +{{< /note >}} + +当一个 apiserver 收到一个与 `rules` 之一匹配的请求时,apiserver 会向 `clientConfig` 中指定的 webhook 发送一个 `admissionReview` 请求。 + +创建 webhook 配置后,系统将花费几秒钟来完成新配置的生效。 + + +### 验证 apiservers + +如果您的 webhooks 需要身份验证,您可以将 apiservers 配置为使用基本身份验证,不记名令牌或证书来对 webhook 进行身份验证。 +完成配置有三个步骤。 + +* 启动apiserver时,通过 `--admission-control-config-file` 参数指定许可控制配置文件的位置。 + +* 在准入控制配置文件中,指定 MutatingAdmissionWebhook 控制器和 ValidatingAdmissionWebhook 控制器应该读取凭据的位置。 +凭证存储在 kubeConfig 文件中(是​​的,与 kubectl 使用的模式相同),因此字段名称为`kubeConfigFile`。 +以下是一个示例准入控制配置文件: + +```yaml +apiVersion: apiserver.k8s.io/v1alpha1 +kind: AdmissionConfiguration +plugins: +- name: ValidatingAdmissionWebhook + configuration: + apiVersion: apiserver.config.k8s.io/v1alpha1 + kind: WebhookAdmission + kubeConfigFile: +- name: MutatingAdmissionWebhook + configuration: + apiVersion: apiserver.config.k8s.io/v1alpha1 + kind: WebhookAdmission + kubeConfigFile: +``` + + +`admissionConfiguration` 的 shcema 在 +[这里](https://github.com/kubernetes/kubernetes/blob/v1.13.0/staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/types.go#L27). + +* 在 kubeConfig 文件中,提供凭据: + +```yaml +apiVersion: v1 +kind: Config +users: +# DNS name of webhook service, i.e., ..svc, or the URL +# of the webhook server. +- name: 'webhook1.ns1.svc' + user: + client-certificate-data: + client-key-data: +# The `name` supports using * to wildmatch prefixing segments. +- name: '*.webhook-company.org' + user: + password: + username: +# '*' is the default match. +- name: '*' + user: + token: +``` + + +当然,您需要设置 webhook 服务器来处理这些身份验证。 +{{% /capture %}} diff --git a/content/zh/docs/reference/glossary/sysctl.md b/content/zh/docs/reference/glossary/sysctl.md new file mode 100644 index 0000000000..46a6dd98f3 --- /dev/null +++ b/content/zh/docs/reference/glossary/sysctl.md @@ -0,0 +1,51 @@ +--- +title: sysctl +id: sysctl +date: 2019-02-12 +full_link: /docs/tasks/administer-cluster/sysctl-cluster/ +short_description: > + 用于获取和设置 Unix 内核参数的接口 + +aka: +tags: +- 工具 +--- + + + + + + `sysctl` 是一个半标准化的接口,用于读取或更改正在运行的 Unix 内核的属性。 + + + + + +在类 Unix 系统上, `sysctl` 既是管理员用于查看和修改这些设置的工具的名称,也是该工具所调用的系统调用的名称。 + + + +{{< glossary_tooltip text="容器" term_id="container" >}} 运行时和网络插件可能对 `sysctl` 的取值有一定的要求。 diff --git a/content/zh/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_controller-manager.md b/content/zh/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_controller-manager.md new file mode 100644 index 0000000000..06392159d5 --- /dev/null +++ b/content/zh/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_controller-manager.md @@ -0,0 +1,139 @@ + + +为控制器管理器生成要使用的 kubeconfig 文件 + + +### 概要 + + + +生成控制器管理器要使用的 kubeconfig ,并保存到 controller-manager.conf 文件中 + +``` +kubeadm init phase kubeconfig controller-manager [flags] +``` + + +### 选项 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
--apiserver-advertise-address 字符串
API Server 对外发布的当前监听地址。设置此值为 “0.0.0.0” 以使用默认网络接口的 IP 地址。
--apiserver-bind-port int32      + 默认值: 6443
要绑定到 API Server 的端口。
--cert-dir string     默认值: "/etc/kubernetes/pki"
保存和存储证书的路径。
--config string
kubeadm 配置文件的路径。警告:配置文件的使用是实验性的。
-h, --help
controller-manager 命令的帮助
--kubeconfig-dir string      + 默认值: "/etc/kubernetes"
保存 kubeconfig 的路径。
+ + + + +### 从父命令继承的选项 + + + + + + + + + + + + + + + + + +
--rootfs 字符串
[实验] 主机根文件系统的“真实”路径。
+ + + diff --git a/content/zh/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_mark-control-plane.md b/content/zh/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_mark-control-plane.md new file mode 100644 index 0000000000..7da8cbebb6 --- /dev/null +++ b/content/zh/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_mark-control-plane.md @@ -0,0 +1,111 @@ + + +将节点标记为控制平面 + + +### 概要 + + + +将节点标记为控制平面 + +``` +kubeadm init phase mark-control-plane [flags] +``` + + +### 例子 + +``` + # 将控制平面的标签和污点应用于当前节点,功能上等同于 kubeadm init 执行的操作。 + kubeadm init phase mark-control-plane --config config.yml + + # 将控制平面的标签和污点应用于特定节点 + kubeadm init phase mark-control-plane --node-name myNode +``` + + +### 选项 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
--config string
kubeadm 配置文件的路径。 警告:配置文件的使用是实验性的。
-h, --help
mark-control-plane 命令的帮助
--node-name string
指定节点名称。
+ + + + + +### 从父命令继承的选项 + + + + + + + + + + + + + + + + + +
--rootfs 字符串
主机根文件系统的“真实”路径。
+ + + diff --git a/content/zh/docs/setup/independent/create-cluster-kubeadm.md b/content/zh/docs/setup/independent/create-cluster-kubeadm.md index d1bc217ea2..b33d016833 100644 --- a/content/zh/docs/setup/independent/create-cluster-kubeadm.md +++ b/content/zh/docs/setup/independent/create-cluster-kubeadm.md @@ -458,35 +458,61 @@ kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/ ``` {{% /tab %}} - - - {{% tab name="Cilium" %}} -有关将 Cilium 与 Kubernetes 一起使用的更多信息,请参阅[关于 Kubernetes 的 Cilium 快速入门](http://docs.cilium.io/en/v1.2/kubernetes/quickinstall/) 和 [适用于 Ciliu m的 kubernetes 安装指南](http://docs.cilium.io/en/v1.2/kubernetes/install/)。 + +有关将 Cilium 与 Kubernetes 一起使用的更多信息,请参阅[适用于 Cilium 的 Kubernetes 安装指南](https://docs.cilium.io/en/stable/kubernetes/)。 + +为了使 Cilium 正确工作,您必须向 `kubeadm init` 传递 `--pod-network-cidr=10.217.0.0/16` 参数。 + +以下命令将部署 Cilium,包括其运行需要的 etcd(被 etcd operator 管理)。 + +_注意_: 如果您在单节点运行 kubeadm,您需要解除该节点的污点(untaint),以便 etcd-operator pod 能被调度到该控制节点。 + +```shell +kubectl taint nodes node-role.kubernetes.io/master:NoSchedule- +``` + +部署 Cilium,您只需执行: + +```shell +kubectl create -f https://raw.githubusercontent.com/cilium/cilium/v1.5/examples/kubernetes/1.14/cilium.yaml +``` + +一旦所有的 Cilium pod 的状态变成 `READY`,您就可以开始使用集群了。 + +```shell +$ kubectl get pods -n kube-system --selector=k8s-app=cilium +NAME READY STATUS RESTARTS AGE +cilium-drxkl 1/1 Running 0 18m +``` {{% /tab %}} diff --git a/content/zh/docs/tasks/federation/cluster.md b/content/zh/docs/tasks/federation/cluster.md new file mode 100644 index 0000000000..b63438d9d2 --- /dev/null +++ b/content/zh/docs/tasks/federation/cluster.md @@ -0,0 +1,218 @@ +--- +title: 联邦集群 +content_template: templates/task +--- + + + +{{% capture overview %}} + +{{< deprecationfilewarning >}} +{{< include "federation-deprecation-warning-note.md" >}} +{{< /deprecationfilewarning >}} + + +本指南介绍了如何在联邦控制平面中使用集群 API 资源。 + +与其他 Kubernetes 资源(例如 Deployment,Service 和 ConfigMap)不同, 集群资源仅存在于联邦上下文中,即这些请求必须提交给联邦 api-server。 + +{{% /capture %}} + +{{% capture prerequisites %}} + +* {{< include "federated-task-tutorial-prereqs.md" >}} + +* 你还应该对 [Kubernetes 的工作方式](/docs/setup/pick-right-solution/)有基本的认识。 + +{{% /capture %}} + +{{% capture steps %}} + + +## 列出集群 + +要列出联邦中可用的集群,可以使用 [kubectl](/docs/user-guide/kubectl/) 运行: + +``` shell +kubectl --context=federation get clusters +``` + +`--context=federation` 参数告诉 kubectl 将请求提交到联邦 apiserver 而不是发送给 Kubernetes 集群。如果您将其提交给 k8s 集群,您将会收到如下的错误信息: + +```the server doesn't have a resource type "clusters"``` + +如果您传递了正确的联邦上下文,但却收到错误消息: + +```No resources found.``` + +这表示您尚未将任何集群添加到联邦。 + + +## 创建联邦集群 + +在联邦中创建 `cluster` 资源意味着将其加入联邦。您也可以使用 `kubefed join` 命令实现该操作。大体上,您需要给新的集群一个名字,并指出联邦主集群对应的上下文名称。以下示例命令将集群 `gondor` 加入运行于主集群 `rivendell` 上的联邦中: + +``` shell +kubefed join gondor --host-cluster-context=rivendell +``` + +您可以在 [kubefed 指南](/docs/tutorials/federation/set-up-cluster-federation-kubefed/#adding-a-cluster-to-a-federation)的相应部分找到更多关于如何做到这一点的详细介绍。 + + + +## 删除联邦集群 + +与创建集群相反,删除集群表示将集群从联邦中退出。这可以通过 `kubefed unjoin` 完成。要删除 `gondor` 集群,只需要执行: + +``` shell +kubefed unjoin gondor --host-cluster-context=rivendell +``` + +您可以在 [kubefed 指南](/docs/tutorials/federation/set-up-cluster-federation-kubefed/#adding-a-cluster-to-a-federation)中找到更多关于 unjoin 的详细介绍。 + + +## 标记集群 + +您可以使用与其它 Kubernetes 对象相同的方式标记集群,这有助于集群分组,也可以被 ClusterSelector 利用。 + +``` shell +kubectl --context=rivendell label cluster gondor key1=value1 key2=value2 +``` + + +## ClusterSelector 注解 + +从 Kubernetes 1.7 版本开始,alpha 支持通过注解 `federation.alpha.kubernetes.io/cluster-selector` 来指示跨联邦集群的对象。*ClusterSelector* 在概念上与 `nodeSelector` 类似,但不是针对节点上的标签进行选择,而是针对联邦集群上的标签进行选择。 + +注解值必须为 JSON 格式,并且必须可以解析为 [ClusterSelector API 类型](/docs/reference/federation/v1beta1/definitions/#_v1beta1_clusterselector)。例如:`[{"key": "load", "operator": "Lt", "values": ["10"]}]`。无法正确解析的内容将引发错误并阻止将对象分发到任何联邦集群。Alpha 实现中包含 ConfigMap、Secret、Daemonset、Service 和 Ingress 类型的对象。 + +下面是一个 ClusterSelector 注解的示例,它只会选择带有 `pci=true` 且没有 `environment=test` 的集群: + +``` yaml + metadata: + annotations: + federation.alpha.kubernetes.io/cluster-selector: '[{"key": "pci", "operator": + "In", "values": ["true"]}, {"key": "environment", "operator": "NotIn", "values": + ["test"]}]' +``` + +*key* 用于匹配联邦集群上的标签名。 + +*values* 用于匹配联邦集群上的标签值。 + +可能的 *operator* 有:`In`、`NotIn`、`Exists`、`DoesNotExist`、`Gt`、`Lt`。 + +当指定 `Exists` 或 `DoesNotExist` 时,*values* 字段应为空。使用 `In` 或 `NotIn` 时,可能包含多个字符串。 + +目前,`Gt` 或 `Lt` 仅支持整数。 + + + +## 集群 API 参考 + +完整的集群 API 参考在 `federation/v1beta1` 中,更多细节可以在 [联邦 API 参考页面](/docs/reference/federation/)找到。 + +{{% /capture %}} + + diff --git a/content/zh/docs/tasks/manage-hugepages/scheduling-hugepages.md b/content/zh/docs/tasks/manage-hugepages/scheduling-hugepages.md index eb1666d873..7e6171358b 100644 --- a/content/zh/docs/tasks/manage-hugepages/scheduling-hugepages.md +++ b/content/zh/docs/tasks/manage-hugepages/scheduling-hugepages.md @@ -1,22 +1,41 @@ --- -approvers: +reviewers: - derekwaynecarr title: 管理巨页(HugePages) content_template: templates/task --- + {{% capture overview %}} -{{< feature-state state="alpha" >}} +{{< feature-state state="stable" >}} -作为 **alpha** 特性,Kubernetes 支持在 Pod 应用中使用预先分配的巨页(或称“大页面”,下文统称为“巨页”)。 本文描述了用户如何使用巨页,以及当前的限制。 + +作为 **GA** 特性,Kubernetes 支持在 Pod 应用中使用预先分配的巨页。本文描述了用户如何使用巨页,以及当前的限制。 {{% /capture %}} {{% capture prerequisites %}} -1. 为了使节点能够上报巨页容量,Kubernetes 节点必须预先分配巨页。 - 每个节点只能预先分配一种特定规格的巨页。 -1. 用户必须在整个系统中将专用的 **alpha** 特性开关 `HugePages` 设置为 true: `--feature-gates=HugePages=true`。 + +1. 为了使节点能够上报巨页容量,Kubernetes 节点必须预先分配巨页。每个节点只能预先分配一种特定规格的巨页。 节点会自动发现全部巨页资源,并作为可供调度的资源进行上报。 @@ -26,7 +45,18 @@ content_template: templates/task ## API + + 用户可以通过在容器级别的资源需求中使用资源名称 `hugepages-` 来使用巨页,其中的 size 是特定节点上支持的以整数值表示的最小二进制单位。 例如,如果节点支持 2048KiB 的页面规格, 它将暴露可供调度的资源 `hugepages-2Mi`。 与 CPU 或内存不同,巨页不支持过量使用(overcommit)。 +注意,在请求巨页资源时,还必须请求内存或 CPU 资源。 ```yaml apiVersion: v1 @@ -46,23 +76,49 @@ spec: resources: limits: hugepages-2Mi: 100Mi + memory: 100Mi + requests: + memory: 100Mi volumes: - name: hugepage emptyDir: medium: HugePages ``` -- 巨页的资源需求和限制必须相等。 该条件在指定了资源限制,而没有指定需求的情况下默认成立。 + + +- 巨页的资源请求值必须等于其限制值。该条件在指定了资源限制,而没有指定请求的情况下默认成立。 - 巨页是被隔离在 pod 作用域的,计划在将来的迭代中实现容器级别的隔离。 -- 巨页对 EmptyDir 卷提供支持,EmptyDir 卷所使用的巨页,不能够超出 pod 请求的内存容量。 +- 巨页可用于 EmptyDir 卷,不过 EmptyDir 卷所使用的巨页数量不能够超出 Pod 请求的巨页数量。 - 通过带有 `SHM_HUGETLB` 的 `shmget()` 使用巨页的应用,必须运行在一个与 `proc/sys/vm/hugetlb_shm_group` 匹配的补充组下。 +- 通过 ResourceQuota 资源,可以使用 `hugepages-` 标记控制每个命名空间下的巨页使用量, + 类似于使用 `cpu` 或 `memory` 来控制其他计算资源。 -## (待实现的)特性 + + +## 待实现的特性 - 在 pod 级别隔离的基础上,支持巨页在容器级别的隔离。 - 作为服务质量特性,保证巨页的 NUMA 局部性。 -- 支持 ResourceQuota 。 - 支持 LimitRange 。 {{% /capture %}} diff --git a/content/zh/docs/tutorials/_index.md b/content/zh/docs/tutorials/_index.md index 1928131edc..0c99aa6d98 100644 --- a/content/zh/docs/tutorials/_index.md +++ b/content/zh/docs/tutorials/_index.md @@ -17,7 +17,7 @@ content_template: templates/concept {{% capture overview %}} Kubernetes 文档的这一部分包含教程。一个教程展示了如何完成一个比单个[任务](/docs/tasks/)更大的目标。 -通常,通常一个教程有几个部分,每个部分都有一系列步骤。在浏览每个教程之前, +通常一个教程有几个部分,每个部分都有一系列步骤。在浏览每个教程之前, 您可能希望将[标准化术语表](/docs/reference/glossary/)页面添加到书签,供以后参考。 +强烈建议不要使用`联邦 v1 版本`,`联邦 v1 版本`从未达到 GA 状态,且不再处于积极开发阶段。文档仅作为历史参考。 + +有关更多信息,请参阅预期的替代品 [Kubernetes 联邦 v2 版本](https://github.com/kubernetes-sigs/federation-v2)。 \ No newline at end of file