From 2c9690d512887730ff4d1ba5210b91fe20be42b6 Mon Sep 17 00:00:00 2001 From: Zach Corleissen Date: Thu, 1 Nov 2018 15:32:23 -0700 Subject: [PATCH 001/222] Add markthink to zh- teams (#10683) --- OWNERS_ALIASES | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES index f35c0ea831..88260d2b75 100644 --- a/OWNERS_ALIASES +++ b/OWNERS_ALIASES @@ -156,11 +156,13 @@ aliases: - haibinxie - hanjiayao - lichuqiang + - markthink - tengqm - xiangpengzhao - zhangxiaoyu-zidif sig-docs-zh-reviews: #Team Chinese docs reviews; GH: sig-docs-zh-reviews - idealhack + - markthink - tengqm - xiangpengzhao - zhangxiaoyu-zidif From a9abd82512439fb9f1f1519fe95cc916f78e671e Mon Sep 17 00:00:00 2001 From: Casey Davenport Date: Thu, 1 Nov 2018 15:35:01 -0700 Subject: [PATCH 002/222] Update version of Calico/Canal in kubeadm docs (#10802) --- .../en/docs/setup/independent/create-cluster-kubeadm.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/en/docs/setup/independent/create-cluster-kubeadm.md b/content/en/docs/setup/independent/create-cluster-kubeadm.md index e37bea2a1c..8ff6ae7e97 100644 --- a/content/en/docs/setup/independent/create-cluster-kubeadm.md +++ b/content/en/docs/setup/independent/create-cluster-kubeadm.md @@ -264,8 +264,8 @@ For more information about using Calico, see [Quickstart for Calico on Kubernete For Calico to work correctly, you need to pass `--pod-network-cidr=192.168.0.0/16` to `kubeadm init` or update the `calico.yml` file to match your Pod network. Note that Calico works on `amd64` only. ```shell -kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml -kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml +kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml +kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml ``` {{% /tab %}} @@ -275,8 +275,8 @@ Canal uses Calico for policy and Flannel for networking. Refer to the Calico doc For Canal to work correctly, `--pod-network-cidr=10.244.0.0/16` has to be passed to `kubeadm init`. Note that Canal works on `amd64` only. ```shell -kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/rbac.yaml -kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/canal.yaml +kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/canal/rbac.yaml +kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/canal/canal.yaml ``` {{% /tab %}} From b9ffbb1ebaf1fa9a2c7b755ffcb1cc04b959e082 Mon Sep 17 00:00:00 2001 From: Iain Foulds Date: Thu, 1 Nov 2018 15:39:53 -0700 Subject: [PATCH 003/222] Update naming for Azure Kubernetes Service (#10799) --- content/en/docs/setup/turnkey/azure.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/content/en/docs/setup/turnkey/azure.md b/content/en/docs/setup/turnkey/azure.md index 534f1a5536..cd46706874 100644 --- a/content/en/docs/setup/turnkey/azure.md +++ b/content/en/docs/setup/turnkey/azure.md @@ -5,25 +5,25 @@ reviewers: title: Running Kubernetes on Azure --- -## Azure Container Service +## Azure Kubernetes Service (AKS) -The [Azure Container Service](https://azure.microsoft.com/en-us/services/container-service/) offers simple -deployments of one of three open source orchestrators: DC/OS, Swarm, and Kubernetes clusters. +The [Azure Kubernetes Service)](https://azure.microsoft.com/en-us/services/kubernetes-service/) offers simple +deployments for Kubernetes clusters. -For an example of deploying a Kubernetes cluster onto Azure via the Azure Container Service: +For an example of deploying a Kubernetes cluster onto Azure via the Azure Kubernetes Service: -**[Microsoft Azure Container Service - Kubernetes Walkthrough](https://docs.microsoft.com/en-us/azure/aks/intro-kubernetes)** +**[Microsoft Azure Kubernetes Service](https://docs.microsoft.com/en-us/azure/aks/intro-kubernetes)** ## Custom Deployments: ACS-Engine -The core of the Azure Container Service is **open source** and available on GitHub for the community +The core of the Azure Kubernetes Service is **open source** and available on GitHub for the community to use and contribute to: **[ACS-Engine](https://github.com/Azure/acs-engine)**. -ACS-Engine is a good choice if you need to make customizations to the deployment beyond what the Azure Container +ACS-Engine is a good choice if you need to make customizations to the deployment beyond what the Azure Kubernetes Service officially supports. These customizations include deploying into existing virtual networks, utilizing multiple -agent pools, and more. Some community contributions to ACS-Engine may even become features of the Azure Container Service. +agent pools, and more. Some community contributions to ACS-Engine may even become features of the Azure Kubernetes Service. -The input to ACS-Engine is similar to the ARM template syntax used to deploy a cluster directly with the Azure Container Service. +The input to ACS-Engine is similar to the ARM template syntax used to deploy a cluster directly with the Azure Kubernetes Service. The resulting output is an Azure Resource Manager Template that can then be checked into source control and can then be used to deploy Kubernetes clusters into Azure. @@ -36,4 +36,3 @@ The CoreOS Tectonic Installer for Azure is **open source** and available on GitH Tectonic Installer is a good choice when you need to make cluster customizations as it is built on [Hashicorp's Terraform](https://www.terraform.io/docs/providers/azurerm/) Azure Resource Manager (ARM) provider. This enables users to customize or integrate using familiar Terraform tooling. You can get started using the [Tectonic Installer for Azure Guide](https://coreos.com/tectonic/docs/latest/install/azure/azure-terraform.html). - From eac1cb6d34d7c80ebea44bf46cde2eccdb6ba440 Mon Sep 17 00:00:00 2001 From: Pingan Date: Sat, 3 Nov 2018 01:43:25 +0800 Subject: [PATCH 004/222] remove node condition ConfigOK (#10772) --- content/en/docs/concepts/architecture/nodes.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/en/docs/concepts/architecture/nodes.md b/content/en/docs/concepts/architecture/nodes.md index f5bb11bf37..4f81dd9165 100644 --- a/content/en/docs/concepts/architecture/nodes.md +++ b/content/en/docs/concepts/architecture/nodes.md @@ -53,7 +53,6 @@ The `conditions` field describes the status of all `Running` nodes. | `PIDPressure` | `True` if pressure exists on the processes -- that is, if there are too many processes on the node; otherwise `False` | | `DiskPressure` | `True` if pressure exists on the disk size -- that is, if the disk capacity is low; otherwise `False` | | `NetworkUnavailable` | `True` if the network for the node is not correctly configured, otherwise `False` | -| `ConfigOK` | `True` if the kubelet is correctly configured, otherwise `False` | The node condition is represented as a JSON object. For example, the following response describes a healthy node. From 1749327bf19eda5c058b62605e7f4d44a3afdb17 Mon Sep 17 00:00:00 2001 From: Robert de Bock Date: Fri, 2 Nov 2018 18:44:37 +0100 Subject: [PATCH 005/222] Describe what file to edit (#10790) It was not clear where the yaml blob should be saved in. Added a single like that clears up what file to edit. --- .../docs/getting-started-guides/fedora/fedora_manual_config.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/en/docs/getting-started-guides/fedora/fedora_manual_config.md b/content/en/docs/getting-started-guides/fedora/fedora_manual_config.md index cbe029dfa2..7a338b1abc 100644 --- a/content/en/docs/getting-started-guides/fedora/fedora_manual_config.md +++ b/content/en/docs/getting-started-guides/fedora/fedora_manual_config.md @@ -124,6 +124,8 @@ KUBELET_ARGS="--cgroup-driver=systemd --kubeconfig=/etc/kubernetes/master-kubeco ``` +* Edit `/etc/kubernetes/master-kubeconfig.yaml` to contain the following information: + ```yaml kind: Config clusters: From c5b28b7e81009a7c990b83fd772fd405a9f8d8d9 Mon Sep 17 00:00:00 2001 From: Tjeerd Jan van der Molen Date: Fri, 2 Nov 2018 18:45:53 +0100 Subject: [PATCH 006/222] Update install-minikube.md (#10793) Clarify that the --vm-driver none option only works on a linux environment --- content/en/docs/tasks/tools/install-minikube.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/tasks/tools/install-minikube.md b/content/en/docs/tasks/tools/install-minikube.md index e6ad64c72b..ad6fb28f73 100644 --- a/content/en/docs/tasks/tools/install-minikube.md +++ b/content/en/docs/tasks/tools/install-minikube.md @@ -30,7 +30,7 @@ If you do not already have a hypervisor installed, install the appropriate one f [KVM](http://www.linux-kvm.org/). {{< note >}} - **Note:** Minikube also supports a `-\-vm-driver=none` option that runs the Kubernetes components on the host and not in a VM. Using this driver requires Docker, but not a hypervisor. + **Note:** Minikube also supports a `-\-vm-driver=none` option that runs the Kubernetes components on the host and not in a VM. Using this driver requires Docker and a linux environment, but not a hypervisor. {{< /note >}} * Windows: [VirtualBox](https://www.virtualbox.org/wiki/Downloads) or From 81b2562f77ee1675e4b013da970d8f5ff11f2cb4 Mon Sep 17 00:00:00 2001 From: Zach Corleissen Date: Fri, 2 Nov 2018 13:03:13 -0700 Subject: [PATCH 007/222] Enable reviews/approvers for localized site strings (#10811) Remove unintentional changes from a different branch Correct English alias --- i18n/OWNERS | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 i18n/OWNERS diff --git a/i18n/OWNERS b/i18n/OWNERS new file mode 100644 index 0000000000..7c95255902 --- /dev/null +++ b/i18n/OWNERS @@ -0,0 +1,13 @@ +# This is the directory for internationalized site strings. + +reviewers: +- sig-docs-pr-reviews +- sig-docs-ja-reviews +- sig-docs-ko-reviews +- sig-docs-zh-reviews + +approvers: +- sig-docs-en-owners +- sig-docs-ja-owners +- sig-docs-ko-owners +- sig-docs-zh-owners From 2d8bc158a21be1c057e88def1e49a116f75ce01b Mon Sep 17 00:00:00 2001 From: AdamDang Date: Sat, 3 Nov 2018 19:34:25 +0800 Subject: [PATCH 008/222] Update tools.md (#10753) --- content/zh/docs/reference/tools.md | 40 +++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/content/zh/docs/reference/tools.md b/content/zh/docs/reference/tools.md index 4fa74d6821..388187aebe 100644 --- a/content/zh/docs/reference/tools.md +++ b/content/zh/docs/reference/tools.md @@ -9,7 +9,7 @@ content_template: templates/concept --- reviewers: - janetkuo -title: 工具 +title: 宸ュ叿 content_template: templates/concept --- @@ -17,7 +17,7 @@ content_template: templates/concept Kubernetes contains several built-in tools to help you work with the Kubernetes system. --> {{% capture overview %}} -Kubernetes 包含一些内置工具,可以帮助用户更好的使用 Kubernetes 系统。 +Kubernetes 鍖呭惈涓浜涘唴缃伐鍏凤紝鍙互甯姪鐢ㄦ埛鏇村ソ鐨勪娇鐢 Kubernetes 绯荤粺銆 {{% /capture %}} {{% capture body %}} @@ -26,14 +26,14 @@ Kubernetes -[`kubectl`](/docs/tasks/tools/install-kubectl/) 是 Kubernetes 命令行工具,可以用来操控 Kubernetes 集群。 +[`kubectl`](/docs/tasks/tools/install-kubectl/) 鏄 Kubernetes 鍛戒护琛屽伐鍏凤紝鍙互鐢ㄦ潵鎿嶆帶 Kubernetes 闆嗙兢銆 ## Kubeadm -[`kubeadm`](/docs/tasks/tools/install-kubeadm/) 是一个命令行工具,可以用来在物理机、云服务器或虚拟机(目前处于 alpha 阶段)上轻松部署一个安全可靠的 Kubernetes 集群。 +[`kubeadm`](/docs/tasks/tools/install-kubeadm/) 鏄竴涓懡浠よ宸ュ叿锛屽彲浠ョ敤鏉ュ湪鐗╃悊鏈恒佷簯鏈嶅姟鍣ㄦ垨铏氭嫙鏈猴紙鐩墠澶勪簬 alpha 闃舵锛変笂杞绘澗閮ㄧ讲涓涓畨鍏ㄥ彲闈犵殑 Kubernetes 闆嗙兢銆 ## Kubefed @@ -41,7 +41,7 @@ Kubernetes [`kubefed`](/docs/tasks/federation/set-up-cluster-federation-kubefed/) is the command line tool to help you administrate your federated clusters. --> -[`kubefed`](/docs/tasks/federation/set-up-cluster-federation-kubefed/) 是一个命令行工具,可以用来帮助用户管理联邦集群。 +[`kubefed`](/docs/tasks/federation/set-up-cluster-federation-kubefed/) 鏄竴涓懡浠よ宸ュ叿锛屽彲浠ョ敤鏉ュ府鍔╃敤鎴风鐞嗚仈閭﹂泦缇ゃ ## Minikube @@ -51,7 +51,7 @@ to help you administrate your federated clusters. easy to run a single-node Kubernetes cluster locally on your workstation for development and testing purposes. --> -[`minikube`](/docs/tasks/tools/install-minikube/) 是一个可以方便用户在其工作站点本地部署一个单节点 Kubernetes 集群的工具,用于开发和测试。 +[`minikube`](/docs/tasks/tools/install-minikube/) 鏄竴涓彲浠ユ柟渚跨敤鎴峰湪鍏跺伐浣滅珯鐐规湰鍦伴儴缃蹭竴涓崟鑺傜偣 Kubernetes 闆嗙兢鐨勫伐鍏凤紝鐢ㄤ簬寮鍙戝拰娴嬭瘯銆 ## Dashboard @@ -60,7 +60,7 @@ development and testing purposes. [`Dashboard`](/docs/tasks/access-application-cluster/web-ui-dashboard/), the web-based user interface of Kubernetes, allows you to deploy containerized applications to a Kubernetes cluster, troubleshoot them, and manage the cluster and its resources itself. --> -[`Dashboard`](/docs/tasks/access-application-cluster/web-ui-dashboard/), 是 Kubernetes 基于 Web 的用户管理界面,允许用户部署容器化应用到 Kubernetes 集群,进行故障排查以及管理集群和集群资源。 +[`Dashboard`](/docs/tasks/access-application-cluster/web-ui-dashboard/), 鏄 Kubernetes 鍩轰簬 Web 鐨勭敤鎴风鐞嗙晫闈紝鍏佽鐢ㄦ埛閮ㄧ讲瀹瑰櫒鍖栧簲鐢ㄥ埌 Kubernetes 闆嗙兢锛岃繘琛屾晠闅滄帓鏌ヤ互鍙婄鐞嗛泦缇ゅ拰闆嗙兢璧勬簮銆 ## Helm @@ -68,7 +68,7 @@ to a Kubernetes cluster, troubleshoot them, and manage the cluster and its resou [`Kubernetes Helm`](https://github.com/kubernetes/helm) is a tool for managing packages of pre-configured Kubernetes resources, aka Kubernetes charts. --> -[`Kubernetes Helm`](https://github.com/kubernetes/helm) 是一个管理预先配置 Kubernetes 资源包的工具,这里的资源在 Helm 中也被称作 Kubernetes charts。 +[`Kubernetes Helm`](https://github.com/kubernetes/helm) 鏄竴涓鐞嗛鍏堥厤缃 Kubernetes 璧勬簮鍖呯殑宸ュ叿锛岃繖閲岀殑璧勬簮鍦 Helm 涓篃琚О浣 Kubernetes charts銆 -使用 Helm: +浣跨敤 Helm锛 -*查找并使用已经打包为 Kubernetes charts 的流行软件 -*分享您自己的应用作为 Kubernetes charts -*为 Kubernetes 应用创建可重复执行的构建 -*为您的 Kubernetes 清单文件提供更智能化的管理 -*管理 Helm 软件包的发布 +* 鏌ユ壘骞朵娇鐢ㄥ凡缁忔墦鍖呬负 Kubernetes charts 鐨勬祦琛岃蒋浠 +* 鍒嗕韩鎮ㄨ嚜宸辩殑搴旂敤浣滀负 Kubernetes charts +* 涓 Kubernetes 搴旂敤鍒涘缓鍙噸澶嶆墽琛岀殑鏋勫缓 +* 涓烘偍鐨 Kubernetes 娓呭崟鏂囦欢鎻愪緵鏇存櫤鑳藉寲鐨勭鐞 +* 绠$悊 Helm 杞欢鍖呯殑鍙戝竷 ## Kompose -[`Kompose`](https://github.com/kubernetes-incubator/kompose) 一个转换工具,用来帮助 Docker Compose 用户迁移至 Kubernetes。 +[`Kompose`](https://github.com/kubernetes-incubator/kompose) 涓涓浆鎹㈠伐鍏凤紝鐢ㄦ潵甯姪 Docker Compose 鐢ㄦ埛杩佺Щ鑷 Kubernetes銆 -使用 Kompose: +浣跨敤 Kompose: -* 将一个 Docker Compose 文件解释成 Kubernetes 对象 -* 将本地 Docker 开发 转变成通过 Kubernetes 来管理 -* 转换 v1 或 v2 Docker Compose `yaml` 文件 或 [分布式应用程序包](https://docs.docker.com/compose/bundles/) -{{% /capture %}} \ No newline at end of file +* 灏嗕竴涓 Docker Compose 鏂囦欢瑙i噴鎴 Kubernetes 瀵硅薄 +* 灏嗘湰鍦 Docker 寮鍙 杞彉鎴愰氳繃 Kubernetes 鏉ョ鐞 +* 杞崲 v1 鎴 v2 Docker Compose `yaml` 鏂囦欢 鎴 [鍒嗗竷寮忓簲鐢ㄧ▼搴忓寘](https://docs.docker.com/compose/bundles/) +{{% /capture %}} From 7ebdd661d7ca4ab0a868a176e287cc4be2a93f0c Mon Sep 17 00:00:00 2001 From: MengZeLee Date: Sat, 3 Nov 2018 19:37:07 +0800 Subject: [PATCH 009/222] Modified into appropriate words (#10768) * Modified into appropriate words * Modified into appropriate words --- content/en/docs/setup/independent/kubelet-integration.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/en/docs/setup/independent/kubelet-integration.md b/content/en/docs/setup/independent/kubelet-integration.md index cd56d6c4b4..9b55041733 100644 --- a/content/en/docs/setup/independent/kubelet-integration.md +++ b/content/en/docs/setup/independent/kubelet-integration.md @@ -11,8 +11,8 @@ weight: 40 {{< feature-state for_k8s_version="1.11" state="stable" >}} The lifecycle of the kubeadm CLI tool is decoupled from the -[Kubernetes Node Agent](/docs/reference/command-line-tools-reference/kubelet), which is a daemon that runs -on each Kubernetes master or Node. The kubeadm CLI tool is executed by the user when Kubernetes is +[kubelet](/docs/reference/command-line-tools-reference/kubelet), which is a daemon that runs +on each node within the Kubernetes cluster. The kubeadm CLI tool is executed by the user when Kubernetes is initialized or upgraded, whereas the kubelet is always running in the background. Since the kubelet is a daemon, it needs to be maintained by some kind of a init @@ -52,7 +52,7 @@ Virtual IPs for services are now allocated from this subnet. You also need to se by the kubelet, using the `--cluster-dns` flag. This setting needs to be the same for every kubelet on every manager and Node in the cluster. The kubelet provides a versioned, structured API object that can configure most parameters in the kubelet and push out this configuration to each running -kubelet in the cluster. This object is called **the kubelet's ComponentConfig**. +kubelet in the cluster. This object is called **the kubelet's ComponentConfig**. The ComponentConfig allows the user to specify flags such as the cluster DNS IP addresses expressed as a list of values to a camelCased key, illustrated by the following example: @@ -82,7 +82,7 @@ networking, or other host-specific parameters. The following list provides a few - Currently, the kubelet cannot automatically detects the cgroup driver used by the CRI runtime, but the value of `--cgroup-driver` must match the cgroup driver used by the CRI runtime to ensure the health of the kubelet. - + - Depending on the CRI runtime your cluster uses, you may need to specify different flags to the kubelet. For instance, when using Docker, you need to specify flags such as `--network-plugin=cni`, but if you are using an external runtime, you need to specify `--container-runtime=remote` and specify the CRI From a9d8c54e6d2b447361beaa0643b251227993aa2e Mon Sep 17 00:00:00 2001 From: June Yi Date: Sun, 4 Nov 2018 15:07:38 +0900 Subject: [PATCH 010/222] Add i18n strings for Korean translation (#10611) --- i18n/ko.toml | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 i18n/ko.toml diff --git a/i18n/ko.toml b/i18n/ko.toml new file mode 100644 index 0000000000..8a4c73197a --- /dev/null +++ b/i18n/ko.toml @@ -0,0 +1,82 @@ +# i18n strings for the Korean translation. + +[main_read_about] +other = "Read about" + +[main_read_more] +other = "雿 鞚疥赴" + +[main_github_invite] +other = "旖旍柎 炜犽矂雱ろ嫲鞀 旖旊摐 氩犾澊鞀るゼ 靷错幋氤措姅雿 甏鞁澊 鞛堨溂鞁媹旯?" + +[main_github_view_on] +other = "GitHub鞐愳劀 氤搓赴" + +[main_github_create_an_issue] +other = "鞚挫妶 靸濎劚頃橁赴" + +[main_community_explore] +other = "旎る雼堩嫲 霊橂煬氤搓赴" + +[main_kubernetes_features] +other = "炜犽矂雱ろ嫲鞀 旮半姤" + +[main_cncf_project] +other = """炜犽矂雱ろ嫲鞀る姅 CNCF graduated 頂勲鞝濏姼鞛呺媹雼.

""" + +[main_kubeweekly_signup] +other = "甑弲頃橁赴" + +[main_contribute] +other = "旮办棳頃橁赴" + +[main_edit_this_page] +other = "韼橃澊歆 韼胳頃橁赴" + +[main_page_history] +other ="韼橃澊歆 氤瓴 鞚措牓" + +[main_page_last_modified_on] +other = "斓滌 靾橃爼鞚检嫓" + +[main_by] +other = "by" + +[main_documentation_license] +other = """The Kubernetes Authors | Documentation Distributed under CC BY 4.0""" + +[main_copyright_notice] +other = """The Linux Foundation ®. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page""" + +# Labels for the docs portal home page. +[docs_label_browse] +other = "氍胳劀 霊橂煬氤搓赴" + +[docs_label_contributors] +other = "旎姼毽钒韯" + +[docs_label_users] +other = "靷毄鞛" + +[docs_label_i_am] +other = "雮橂姅..." + + + +# Community links +[community_twitter_name] +other = "Twitter" +[community_github_name] +other = "GitHub" +[community_slack_name] +other = "Slack" +[community_stack_overflow_name] +other = "Stack Overflow" +[community_forum_name] +other = "Forum" +[community_events_calendar] +other = "Events Calendar" + +# UI elements +[ui_search_placeholder] +other = "瓴靸夗晿旮" From 6d7f27ea45ea17e9f9c7a96926b1cc93b5019436 Mon Sep 17 00:00:00 2001 From: Jake Crawford Date: Sun, 4 Nov 2018 22:32:19 -0700 Subject: [PATCH 011/222] Fix typo in word repositories (#10883) --- content/en/docs/contribute/advanced.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/contribute/advanced.md b/content/en/docs/contribute/advanced.md index 1a430d6a7d..3b55e78a61 100644 --- a/content/en/docs/contribute/advanced.md +++ b/content/en/docs/contribute/advanced.md @@ -98,7 +98,7 @@ SIG Docs [reviewers](/docs/contribute/participating/#reviewers) can sponsor new contributors. After a new contributor has successfully submitted 5 substantive pull requests -to one or more Kubernetes repositiries, they are eligible to apply for +to one or more Kubernetes repositories, they are eligible to apply for [membership](/docs/contribute/participating#members) in the Kubernetes organization. The contributor's membership needs to be backed by two sponsors who are already reviewers. From 795de19c0719e0616380f6c4929b816f3dfbf987 Mon Sep 17 00:00:00 2001 From: Juan Vallejo Date: Mon, 5 Nov 2018 00:45:58 -0500 Subject: [PATCH 012/222] add note informing users of env var updates (#10819) --- content/en/docs/tasks/extend-kubectl/kubectl-plugins.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md b/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md index 72e358bb62..f671ef5231 100644 --- a/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md +++ b/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md @@ -126,6 +126,12 @@ For example, a plugin that wishes to be invoked whenever the command `kubectl fo #### Flags and argument handling +{{< note >}} +**Note:** Unlike previous versions of `kubectl`, the plugin mechanism will _not_ create any custom, plugin-specific values or environment variables to a plugin process. +This means that environment variables such as `KUBECTL_PLUGINS_CURRENT_NAMESPACE` are no longer provided to a plugin. Plugins must parse all of the arguments passed to them by a user, +and handle flag validation as part of their own implementation. For plugins written in Go, a set of utilities has been provided under [k8s.io/cli-runtime](https://github.com/kubernetes/cli-runtime) to assist with this. +{{< /note >}} + Taking our `kubectl-foo-bar-baz` plugin from the above scenario, we further explore additional cases where users invoke our plugin while providing additional flags and arguments. For example, in a situation where a user invokes the command `kubectl foo bar baz arg1 --flag=value arg2`, the plugin mechanism will first try to find the plugin with the longest possible name, which in this case would be `kubectk-foo-bar-baz-arg1`. Upon not finding that plugin, it then treats the last dash-separated value as an argument (`arg1` in this case), and attempts to find the next longest possible name, `kubectl-foo-bar-baz`. From 15518689c7317d810f81218f7cf8f17348ae5319 Mon Sep 17 00:00:00 2001 From: Wang Bing Date: Mon, 5 Nov 2018 19:35:37 +0800 Subject: [PATCH 013/222] Fix typo (#10877) --- content/en/blog/_posts/2017-10-00-Five-Days-Of-Kubernetes-18.md | 2 +- .../en/blog/_posts/2018-01-00-Extensible-Admission-Is-Beta.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/blog/_posts/2017-10-00-Five-Days-Of-Kubernetes-18.md b/content/en/blog/_posts/2017-10-00-Five-Days-Of-Kubernetes-18.md index 2e7375c861..d7011e4052 100644 --- a/content/en/blog/_posts/2017-10-00-Five-Days-Of-Kubernetes-18.md +++ b/content/en/blog/_posts/2017-10-00-Five-Days-Of-Kubernetes-18.md @@ -14,7 +14,7 @@ While many improvements have been contributed, we highlight key features in this **Day 1:** [5 Days of Kubernetes 1.8](https://kubernetes.io/blog/2017/10/five-days-of-kubernetes-18) **Day 2:** [kubeadm v1.8 Introduces Easy Upgrades for Kubernetes Clusters](https://kubernetes.io/blog/2017/10/kubeadm-v18-released) -**Day 3:** [Kuberentes v.1.8 Retrospective: It Takes a Village to Raise a Kubernetes](https://kubernetes.io/blog/2017/10/it-takes-village-to-raise-kubernetes) +**Day 3:** [Kubernetes v.1.8 Retrospective: It Takes a Village to Raise a Kubernetes](https://kubernetes.io/blog/2017/10/it-takes-village-to-raise-kubernetes) **Day 4:** [Using RBAC, Generally Available in Kubernetes v1.8](https://kubernetes.io/blog/2017/10/using-rbac-generally-available-18) **Day 5:** [Enforcing Network Policies in Kubernetes](https://kubernetes.io/blog/2017/10/enforcing-network-policies-in-kubernetes) diff --git a/content/en/blog/_posts/2018-01-00-Extensible-Admission-Is-Beta.md b/content/en/blog/_posts/2018-01-00-Extensible-Admission-Is-Beta.md index fe94dbf1b0..cc258be758 100644 --- a/content/en/blog/_posts/2018-01-00-Extensible-Admission-Is-Beta.md +++ b/content/en/blog/_posts/2018-01-00-Extensible-Admission-Is-Beta.md @@ -111,7 +111,7 @@ For the self-hosted category, a cleverly built webhook admission server and topo ### Simple, secure, portable, zero-config topology If you build your webhook admission server to also be an extension API server, it becomes possible to aggregate it as a normal API server. This has a number of advantages: -- Your webhook becomes available like any other API under default kube-apiserver service `kubernetes.default.svc` (e.g. [https://kubernetes.default.svc/apis/admission.example.com/v1/mymutatingadmissionreviews](https://kuberentes.default.svc/apis/admission.example.com/v1/mymutatingadmissionreviews)). Among other benefits, you can test using `kubectl`. +- Your webhook becomes available like any other API under default kube-apiserver service `kubernetes.default.svc` (e.g. [https://kubernetes.default.svc/apis/admission.example.com/v1/mymutatingadmissionreviews](https://kubernetes.default.svc/apis/admission.example.com/v1/mymutatingadmissionreviews)). Among other benefits, you can test using `kubectl`. - Your webhook automatically (without any config) makes use of the in-cluster authentication and authorization provided by kube-apiserver. You can restrict access to your webhook with normal RBAC rules. - Your extension API servers and kube-apiserver automatically (without any config) make use of their in-cluster credentials to communicate with the webhook. - Extension API servers do not leak their service account token to your webhook because they go through kube-apiserver, which is a secure front proxy. From d01b76d08044e213f06f567a99e127cd496178fb Mon Sep 17 00:00:00 2001 From: zhangmingld Date: Mon, 5 Nov 2018 22:17:32 +0800 Subject: [PATCH 014/222] fix word err in Disruption (#10884) --- content/en/docs/concepts/workloads/pods/disruptions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/workloads/pods/disruptions.md b/content/en/docs/concepts/workloads/pods/disruptions.md index 79b0ac00d9..3a3ecb36cf 100644 --- a/content/en/docs/concepts/workloads/pods/disruptions.md +++ b/content/en/docs/concepts/workloads/pods/disruptions.md @@ -93,7 +93,7 @@ time as frequent voluntary disruptions. We call this set of features ## How Disruption Budgets Work An Application Owner can create a `PodDisruptionBudget` object (PDB) for each application. -A PDB limits the number pods of a replicated application that are down simultaneously from +A PDB limits the number of pods of a replicated application that are down simultaneously from voluntary disruptions. For example, a quorum-based application would like to ensure that the number of replicas running is never brought below the number needed for a quorum. A web front end might want to From e0168fd8dcbfdb59e8e87b9678058d6c43cd1be9 Mon Sep 17 00:00:00 2001 From: Cody Clark Date: Mon, 5 Nov 2018 09:29:14 -0800 Subject: [PATCH 015/222] Tutorial cleanup: Delete K8s 101 and 201 (#10786) * Delete k8s201.md * Delete k8s101.md --- content/en/docs/tutorials/k8s101.md | 183 ------------------- content/en/docs/tutorials/k8s201.md | 266 ---------------------------- 2 files changed, 449 deletions(-) delete mode 100644 content/en/docs/tutorials/k8s101.md delete mode 100644 content/en/docs/tutorials/k8s201.md diff --git a/content/en/docs/tutorials/k8s101.md b/content/en/docs/tutorials/k8s101.md deleted file mode 100644 index 0dedd9f3d2..0000000000 --- a/content/en/docs/tutorials/k8s101.md +++ /dev/null @@ -1,183 +0,0 @@ ---- -reviewers: -- eparis -- mikedanese -title: Kubernetes 101 -content_template: templates/tutorial ---- - -{{% capture overview %}} - -For Kubernetes 101, we will cover kubectl, Pods, Volumes, and multiple containers. - -{{% /capture %}} - -{{% capture objectives %}} - -* What is `kubectl`. -* Manage a Pod. -* Create and mount a volume. -* Create multiple containers in a Pod. - -{{% /capture %}} - -{{% capture prerequisites %}} - -* {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} -* In order for the kubectl usage examples to work, make sure you have an example directory locally, either from [a release](https://github.com/kubernetes/kubernetes/releases) or the latest `.yaml` files located [here](https://github.com/kubernetes/website/tree/master/content/en/docs/tutorials). - -{{% /capture %}} - -{{% capture lessoncontent %}} - -## Kubectl CLI - -The easiest way to interact with Kubernetes is through the kubectl command-line interface. - -For more info about kubectl, including its usage, commands, and parameters, see [Overview of kubectl](/docs/reference/kubectl/overview/). - -For more information about installing and configuring kubectl, see [Install and Set Up kubectl](/docs/tasks/tools/install-kubectl/). - -## Pods - -In Kubernetes, a group of one or more containers is called a _Pod_. Containers in a Pod are deployed together, and are started, stopped, and replicated as a group. - -For more information, see [Pods](/docs/concepts/workloads/pods/pod/). - - -#### Pod Definition - -The simplest Pod definition describes the deployment of a single container. For example, an nginx web server Pod might be defined as: - -{{< codenew file="pods/simple-pod.yaml" >}} - -A Pod definition is a declaration of a _desired state_. Desired state is a very important concept in the Kubernetes model. Many things present a desired state to the system, and Kubernetes' ensures that the current state matches the desired state. For example, when you create a Pod and declare that the containers in it to be running. If the containers happen not to be running because of a program failure, Kubernetes continues to (re-)create the Pod in order to drive the pod to the desired state. This process continues until you delete the Pod. - -For more information, see [Kubernetes Design Documents and Proposals](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/README.md). - - -#### Pod Management - -Create a Pod containing an nginx server ([simple-pod.yaml](/examples/pods/simple-pod.yaml)): - -```shell -kubectl create -f https://k8s.io/examples/pods/simple-pod.yaml -``` - -List all Pods: - -```shell -kubectl get pods -``` - -On most providers, the Pod IPs are not externally accessible. The easiest way to test that the pod is working is to create a busybox Pod and exec commands on it remotely. For more information, see [Get a Shell to a Running Container](/docs/tasks/debug-application-cluster/get-shell-running-container/). - -If the IP of the Pod is accessible, you can access its http endpoint with wget on port 80: - -```shell -kubectl run busybox --image=busybox --restart=Never --tty -i --generator=run-pod/v1 --env "POD_IP=$(kubectl get pod nginx -o go-template='{{.status.podIP}}')" -u@busybox$ wget -qO- http://$POD_IP # Run in the busybox container -u@busybox$ exit # Exit the busybox container -``` - -```shell -kubectl delete pod busybox # Clean up the pod we created with "kubectl run" -``` - -To delete a Pod named nginx: - -```shell -kubectl delete pod nginx -``` - - -#### Volumes - -That's great for a simple static web server, but what about persistent storage? - -The container file system only lives as long as the container does. So if your app's state needs to survive relocation, reboots, and crashes, you'll need to configure some persistent storage. - -In this example you can create a Redis Pod with a named volume, and a volume mount that defines the path to mount the Volume. - -1. Define a Volume: - - ```yaml - volumes: - - name: redis-storage - emptyDir: {} - ``` - -1. Define a Volume mount within a container definition: - - ```yaml - volumeMounts: - 聽# name must match the volume name defined in volumes - 聽- name: redis-storage - # mount path within the container - mountPath: /data/redis - ``` - -Here is an example of Redis Pod definition with a persistent storage volume ([redis.yaml](/examples/pods/storage/redis.yaml)): - -{{< codenew file="pods/storage/redis.yaml" >}} - -Where: - -- The `volumeMounts` `name` is a reference to a specific `volumes` `name`. -- The `volumeMounts` `mountPath` is the path to mount the volume within the container. - -##### Volume Types - -- **EmptyDir**: Creates a new directory that exists as long as the Pod is running on the node, but it can persist across container failures and restarts. -- **HostPath**: Mounts an existing directory on the node's file system. For example (`/var/logs`). - -For more information, see [Volumes](/docs/concepts/storage/volumes/). - - -#### Multiple Containers - -{{< note >}} -**Note:** The examples below are syntactically correct, but some of the images (e.g. kubernetes/git-monitor) don't exist yet. We're working on turning these into working examples. -{{< /note >}} - - -However, often you want to have two different containers that work together. An example of this would be a web server, and a helper job that polls a git repository for new updates: - -```yaml -apiVersion: v1 -kind: Pod -metadata: - name: www -spec: - containers: - - name: nginx - image: nginx - volumeMounts: - - mountPath: /srv/www - name: www-data - readOnly: true - - name: git-monitor - image: kubernetes/git-monitor - env: - - name: GIT_REPO - value: http://github.com/some/repo.git - volumeMounts: - - mountPath: /data - name: www-data - volumes: - - name: www-data - emptyDir: {} -``` - -Note that we have also added a Volume here. In this case, the Volume is mounted into both containers. It is marked `readOnly` in the web server's case, since it doesn't need to write to the directory. - -Finally, we have also introduced an environment variable to the `git-monitor` container, which allows us to parameterize that container with the particular git repository that we want to track. - -{{% /capture %}} - -{{% capture whatsnext %}} - -Continue on to [Kubernetes 201](/docs/tutorials/k8s201/) or -for a complete application see the [guestbook example](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/guestbook/) - -{{% /capture %}} diff --git a/content/en/docs/tutorials/k8s201.md b/content/en/docs/tutorials/k8s201.md deleted file mode 100644 index 3c8b3aa8f9..0000000000 --- a/content/en/docs/tutorials/k8s201.md +++ /dev/null @@ -1,266 +0,0 @@ ---- -reviewers: -- janetkuo -- mikedanese -title: Kubernetes 201 -content_template: templates/tutorial ---- - - -{{% capture overview %}} - -For Kubernetes 201, we will pick up where 101 left off and cover some slightly more advanced topics in Kubernetes, related to application productionization, Deployment and scaling. - -If you went through [Kubernetes 101](/docs/tutorials/k8s101/), you learned about kubectl, Pods, Volumes, and multiple containers. - -{{% /capture %}} - -{{% capture objectives %}} - -* Add labels to the Pod. -* Manage a Deployment. -* Manage a Service. -* What is the health checking. - -{{% /capture %}} - -{{% capture prerequisites %}} - -* {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} -* In order for the kubectl usage examples to work, make sure you have an examples directory locally, either from [a release](https://github.com/kubernetes/kubernetes/releases) or [the source](https://github.com/kubernetes/kubernetes). - -{{% /capture %}} - -{{% capture lessoncontent %}} - -## Labels - -Having already learned about Pods and how to create them, you may be struck by an urge to create many, many Pods. Please do! But eventually you will need a system to organize these Pods into groups. The system for achieving this in Kubernetes is Labels. Labels are key-value pairs that are attached to each object in Kubernetes. Label selectors can be passed along with a RESTful `list` request to the apiserver to retrieve a list of objects which match that label selector. - -To add a label, add a labels section under metadata in the Pod definition: - -```yaml - labels: - env: test -``` - -For example, here is the nginx Pod definition with labels ([pod-nginx.yaml](/examples/pods/pod-nginx.yaml)): - -{{< codenew file="pods/pod-nginx.yaml" >}} - -Create the labeled Pod: - -```shell -kubectl create -f https://k8s.io/examples/pods/pod-nginx.yaml -``` - -List all Pods with the label `env=test`: - -```shell -kubectl get pods -l env=test -``` - -Delete the Pod by label: - -```shell -kubectl delete pod -l env=test -``` - -For more information, see [Labels](/docs/concepts/overview/working-with-objects/labels/). -They are a core concept used by two additional Kubernetes building blocks: Deployments and Services. - - -## Deployments - -Now that you know how to make awesome, multi-container, labeled Pods and you want to use them to build an application, you might be tempted to just start building a whole bunch of individual Pods, but if you do that, a whole host of operational concerns pop up. For example: how will you scale the number of Pods up or down? How will you roll out a new release? - -The answer to those questions and more is to use a [Deployment](/docs/concepts/workloads/controllers/deployment/) to manage maintaining and updating your running _Pods_. - -A Deployment object defines a Pod creation template (a "cookie-cutter" if you will) and desired replica count. The Deployment uses a label selector to identify the Pods it manages, and will create or delete Pods as needed to meet the replica count. Deployments are also used to manage safely rolling out changes to your running Pods. - -Here is a Deployment that instantiates two nginx Pods: - -{{< codenew file="application/deployment.yaml" >}} - - -### Deployment Management - -Create an nginx Deployment: - -```shell -kubectl create -f https://k8s.io/examples/application/deployment.yaml -``` - -List all Deployments: - -```shell -kubectl get deployment -``` - -List the Pods created by the Deployment: - -```shell -kubectl get pods -l app=nginx -``` - -Upgrade the nginx container from 1.7.9 to 1.8 by changing the Deployment and calling `apply`. The following config -contains the desired changes: - -{{< codenew file="application/deployment-update.yaml" >}} - -```shell -kubectl apply -f https://k8s.io/examples/application/deployment-update.yaml -``` - -Watch the Deployment create Pods with new names and delete the old Pods: - -```shell -kubectl get pods -l app=nginx -``` - -Delete the Deployment by name: - -```shell -kubectl delete deployment nginx-deployment -``` - -For more information, such as how to rollback Deployment changes to a previous version, see [_Deployments_](/docs/concepts/workloads/controllers/deployment/). - - -## Services - -Once you have a replicated set of Pods, you need an abstraction that enables connectivity between the layers of your application. For example, if you have a Deployment managing your backend jobs, you don't want to have to reconfigure your front-ends whenever you re-scale your backends. Likewise, if the Pods in your backends are scheduled (or rescheduled) onto different machines, you can't be required to re-configure your front-ends. In Kubernetes, the service abstraction achieves these goals. A service provides a way to refer to a set of Pods (selected by labels) with a single static IP address. It may also provide load balancing, if supported by the provider. - -For example, here is a service that balances across the Pods created in the previous nginx Deployment example ([service.yaml](/examples/service/nginx-service.yaml)): - -{{< codenew file="service/nginx-service.yaml" >}} - - -### Service Management - -Create an nginx Service: - -```shell -kubectl create -f https://k8s.io/examples/service/nginx-service.yaml -``` - -List all services: - -```shell -kubectl get services -``` - -On most providers, the service IPs are not externally accessible. The easiest way to test that the service is working is to create a busybox Pod and exec commands on it remotely. See the [command execution documentation](/docs/user-guide/kubectl-overview/) for details. - -Provided the service IP is accessible, you should be able to access its http endpoint with wget on the exposed port: - -```shell -export SERVICE_IP=$(kubectl get service nginx-service -o go-template='{{.spec.clusterIP}}') -export SERVICE_PORT=$(kubectl get service nginx-service -o go-template='{{(index .spec.ports 0).port}}') -``` - -Check `$SERVICE_IP` and `$SERVICE_PORT`: - -```shell -echo "$SERVICE_IP:$SERVICE_PORT" -``` - -Then, create a busybox Pod: -```shell -kubectl run busybox --generator=run-pod/v1 --image=busybox --restart=Never --tty -i --env "SERVICE_IP=$SERVICE_IP" --env "SERVICE_PORT=$SERVICE_PORT" -u@busybox$ wget -qO- http://$SERVICE_IP:$SERVICE_PORT # Run in the busybox container -u@busybox$ exit # Exit the busybox container - -kubectl delete pod busybox # Clean up the pod we created with "kubectl run" - -``` - -The service definition [exposed the Nginx Service](/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/) as port 8000 (`$SERVICE_PORT`). We can also access the service from a host running Kubernetes using that port: - -```shell -wget -qO- http://$SERVICE_IP:$SERVICE_PORT # Run on a Kubernetes host -``` - -(This works on AWS with Weave.) - -To delete the service by name: - -```shell -kubectl delete service nginx-service -``` - -When created, each service is assigned a unique IP address. This address is tied to the lifespan of the Service, and will not change while the Service is alive. Pods can be configured to talk to the service, and know that communication to the service will be automatically load-balanced out to some Pod that is a member of the set identified by the label selector in the Service. - -For more information, see [Services](/docs/concepts/services-networking/service/). - - -## Health Checking - -When I write code it never crashes, right? Sadly the [Kubernetes issues list](https://github.com/kubernetes/kubernetes/issues) indicates otherwise... - -Rather than trying to write bug-free code, a better approach is to use a management system to perform periodic health checking -and repair of your application. That way a system outside of your application itself is responsible for monitoring the -application and taking action to fix it. It's important that the system be outside of the application, since if -your application fails and the health checking agent is part of your application, it may fail as well and you'll never know. -In Kubernetes, the health check monitor is the Kubelet agent. - -### Process Health Checking - -The simplest form of health-checking is just process level health checking. The Kubelet constantly asks the Docker daemon -if the container process is still running, and if not, the container process is restarted. In all of the Kubernetes examples -you have run so far, this health checking was actually already enabled. It's on for every single container that runs in -Kubernetes. - -### Application Health Checking - -However, in many cases this low-level health checking is insufficient. Consider, for example, the following code: - -```go -lockOne := sync.Mutex{} -lockTwo := sync.Mutex{} - -go func() { - lockOne.Lock(); - lockTwo.Lock(); - ... -}() - -lockTwo.Lock(); -lockOne.Lock(); -``` - -This is a classic example of a problem in computer science known as ["Deadlock"](https://en.wikipedia.org/wiki/Deadlock). From Docker's perspective your application is -still operating and the process is still running, but from your application's perspective your code is locked up and will never respond correctly. - -To address this problem, Kubernetes supports user implemented application health-checks. These checks are performed by the -Kubelet to ensure that your application is operating correctly for a definition of "correctly" that _you_ provide. - -Currently, there are three types of application health checks that you can choose from: - - * HTTP Health Checks - The Kubelet will call a web hook. If it returns between 200 and 399, it is considered success, failure otherwise. See health check examples [here](/docs/user-guide/liveness/). - * Container Exec - The Kubelet will execute a command inside your container. If it exits with status 0 it will be considered a success. See health check examples [here](/docs/user-guide/liveness/). - * TCP Socket - The Kubelet will attempt to open a socket to your container. If it can establish a connection, the container is considered healthy, if it can't it is considered a failure. - -In all cases, if the Kubelet discovers a failure the container is restarted. - -The container health checks are configured in the `livenessProbe` section of your container config. There you can also specify an `initialDelaySeconds` that is a grace period from when the container is started to when health checks are performed, to enable your container to perform any necessary initialization. - -Here is an example config for a Pod with an HTTP health check -([pod-with-http-healthcheck.yaml](/examples/pods/probe/pod-with-http-healthcheck.yaml)): - -{{< codenew file="pods/probe/pod-with-http-healthcheck.yaml" >}} - -And here is an example config for a Pod with a TCP Socket health check -([pod-with-tcp-socket-healthcheck.yaml](/examples/pods/probe/pod-with-tcp-socket-healthcheck.yaml)): - -{{< codenew file="pods/probe/pod-with-tcp-socket-healthcheck.yaml" >}} - -For more information about health checking, see [Container Probes](/docs/user-guide/pod-states/#container-probes). - -{{% /capture %}} - -{{% capture whatsnext %}} - -For a complete application see the [guestbook example](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/guestbook/). - -{{% /capture %}} From 18343eb44b025a18eb6d39f5ae192ad81d7dd09b Mon Sep 17 00:00:00 2001 From: Karen Bradshaw Date: Mon, 5 Nov 2018 13:01:07 -0500 Subject: [PATCH 016/222] clean-up minikube toc (#10873) * clean-up minikube toc - clean-up minikube toc - clean-up localkube link * update sub-headers * added link to kubeadm - added link to kubeadm - clean-up link to kubectl config set-context --- content/en/docs/setup/minikube.md | 84 +++++++++++++++++-------------- 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/content/en/docs/setup/minikube.md b/content/en/docs/setup/minikube.md index 09ecfc62cc..8e763c777d 100644 --- a/content/en/docs/setup/minikube.md +++ b/content/en/docs/setup/minikube.md @@ -4,13 +4,18 @@ reviewers: - balopat - aaron-prindle title: Running Kubernetes Locally via Minikube +content_template: templates/concept --- +{{% capture overview %}} + Minikube is a tool that makes it easy to run Kubernetes locally. Minikube runs a single-node Kubernetes cluster inside a VM on your laptop for users looking to try out Kubernetes or develop with it day-to-day. -{{< toc >}} +{{% /capture %}} -### Minikube Features +{{% capture body %}} + +## Minikube Features * Minikube supports Kubernetes features such as: * DNS @@ -27,7 +32,7 @@ See [Installing Minikube](/docs/tasks/tools/install-minikube/). ## Quickstart -Here's a brief demo of minikube usage. +Here's a brief demo of Minikube usage. If you want to change the VM driver add the appropriate `--vm-driver=xxx` flag to `minikube start`. Minikube supports the following drivers: @@ -166,28 +171,29 @@ plugins, if required. ### Reusing the Docker daemon -When using a single VM of Kubernetes, it's really handy to reuse the minikube's built-in Docker daemon; as this means you don't have to build a docker registry on your host machine and push the image into it - you can just build inside the same docker daemon as minikube which speeds up local experiments. Just make sure you tag your Docker image with something other than 'latest' and use that tag while you pull the image. Otherwise, if you do not specify version of your image, it will be assumed as `:latest`, with pull image policy of `Always` correspondingly, which may eventually result in `ErrImagePull` as you may not have any versions of your Docker image out there in the default docker registry (usually DockerHub) yet. +When using a single VM of Kubernetes, it's really handy to reuse the Minikube's built-in Docker daemon; as this means you don't have to build a docker registry on your host machine and push the image into it - you can just build inside the same docker daemon as minikube which speeds up local experiments. Just make sure you tag your Docker image with something other than 'latest' and use that tag while you pull the image. Otherwise, if you do not specify version of your image, it will be assumed as `:latest`, with pull image policy of `Always` correspondingly, which may eventually result in `ErrImagePull` as you may not have any versions of your Docker image out there in the default docker registry (usually DockerHub) yet. To be able to work with the docker daemon on your mac/linux host use the `docker-env command` in your shell: -``` +```shell eval $(minikube docker-env) ``` + You should now be able to use docker on the command line on your host mac/linux machine talking to the docker daemon inside the minikube VM: -``` +```shell docker ps ``` On Centos 7, docker may report the following error: -``` +```shell Could not read CA certificate "/etc/docker/ca.pem": open /etc/docker/ca.pem: no such file or directory ``` -The fix is to update /etc/sysconfig/docker to ensure that minikube's environment changes are respected: +The fix is to update /etc/sysconfig/docker to ensure that Minikube's environment changes are respected: -``` +```shell < DOCKER_CERT_PATH=/etc/docker --- > if [ -z "${DOCKER_CERT_PATH}" ]; then @@ -195,19 +201,19 @@ The fix is to update /etc/sysconfig/docker to ensure that minikube's environment > fi ``` -Remember to turn off the imagePullPolicy:Always, as otherwise Kubernetes won't use images you built locally. +Remember to turn off the imagePullPolicy:Always, otherwise Kubernetes won't use images you built locally. ## Managing your Cluster ### Starting a Cluster The `minikube start` command can be used to start your cluster. -This command creates and configures a virtual machine that runs a single-node Kubernetes cluster. +This command creates and configures a Virtual Machine that runs a single-node Kubernetes cluster. This command also configures your [kubectl](/docs/user-guide/kubectl-overview/) installation to communicate with this cluster. -If you are behind a web proxy, you will need to pass this information in e.g. via +If you are behind a web proxy, you will need to pass this information to the `minikube start` command: -``` +```shell https_proxy= minikube start --docker-env http_proxy= --docker-env https_proxy= --docker-env no_proxy=192.168.99.0/24 ``` @@ -256,19 +262,19 @@ To set the `AuthorizationMode` on the `apiserver` to `RBAC`, you can use: `--ext ### Stopping a Cluster The `minikube stop` command can be used to stop your cluster. -This command shuts down the minikube virtual machine, but preserves all cluster state and data. +This command shuts down the Minikube Virtual Machine, but preserves all cluster state and data. Starting the cluster again will restore it to it's previous state. ### Deleting a Cluster The `minikube delete` command can be used to delete your cluster. -This command shuts down and deletes the minikube virtual machine. No data or state is preserved. +This command shuts down and deletes the Minikube Virtual Machine. No data or state is preserved. ## Interacting with Your Cluster ### Kubectl -The `minikube start` command creates a "[kubectl context](/docs/reference/generated/kubectl/kubectl-commands/#-em-set-context-em-)" called "minikube". -This context contains the configuration to communicate with your minikube cluster. +The `minikube start` command creates a [kubectl context](/docs/reference/generated/kubectl/kubectl-commands#-em-set-context-em-) called "minikube". +This context contains the configuration to communicate with your Minikube cluster. Minikube sets this context to default automatically, but if you need to switch back to it in the future, run: @@ -278,7 +284,7 @@ Or pass the context on each command like this: `kubectl get pods --context=minik ### Dashboard -To access the [Kubernetes Dashboard](/docs/tasks/access-application-cluster/web-ui-dashboard/), run this command in a shell after starting minikube to get the address: +To access the [Kubernetes Dashboard](/docs/tasks/access-application-cluster/web-ui-dashboard/), run this command in a shell after starting Minikube to get the address: ```shell minikube dashboard @@ -286,7 +292,7 @@ minikube dashboard ### Services -To access a service exposed via a node port, run this command in a shell after starting minikube to get the address: +To access a service exposed via a node port, run this command in a shell after starting Minikube to get the address: ```shell minikube service [-n NAMESPACE] [--url] NAME @@ -294,7 +300,7 @@ minikube service [-n NAMESPACE] [--url] NAME ## Networking -The minikube VM is exposed to the host system via a host-only IP address, that can be obtained with the `minikube ip` command. +The Minikube VM is exposed to the host system via a host-only IP address, that can be obtained with the `minikube ip` command. Any services of type `NodePort` can be accessed over that IP address, on the NodePort. To determine the NodePort for your service, you can use a `kubectl` command like this: @@ -303,13 +309,13 @@ To determine the NodePort for your service, you can use a `kubectl` command like ## Persistent Volumes Minikube supports [PersistentVolumes](/docs/concepts/storage/persistent-volumes/) of type `hostPath`. -These PersistentVolumes are mapped to a directory inside the minikube VM. +These PersistentVolumes are mapped to a directory inside the Minikube VM. The Minikube VM boots into a tmpfs, so most directories will not be persisted across reboots (`minikube stop`). However, Minikube is configured to persist files stored under the following host directories: * `/data` -* `/var/lib/localkube` +* `/var/lib/minikube` * `/var/lib/docker` Here is an example PersistentVolume config to persist data in the `/data` directory: @@ -341,19 +347,18 @@ Some drivers will mount a host folder within the VM so that you can easily share | VMware Fusion | macOS | /Users | /Users | | Xhyve | macOS | /Users | /Users | - ## Private Container Registries To access a private container registry, follow the steps on [this page](/docs/concepts/containers/images/). -We recommend you use `ImagePullSecrets`, but if you would like to configure access on the minikube VM you can place the `.dockercfg` in the `/home/docker` directory or the `config.json` in the `/home/docker/.docker` directory. +We recommend you use `ImagePullSecrets`, but if you would like to configure access on the Minikube VM you can place the `.dockercfg` in the `/home/docker` directory or the `config.json` in the `/home/docker/.docker` directory. ## Add-ons -In order to have minikube properly start or restart custom addons, -place the addons you wish to be launched with minikube in the `~/.minikube/addons` -directory. Addons in this folder will be moved to the minikube VM and -launched each time minikube is started or restarted. +In order to have Minikube properly start or restart custom addons, +place the addons you wish to be launched with Minikube in the `~/.minikube/addons` +directory. Addons in this folder will be moved to the Minikube VM and +launched each time Minikube is started or restarted. ## Using Minikube with an HTTP Proxy @@ -370,7 +375,7 @@ $ minikube start --docker-env http_proxy=http://$YOURPROXY:PORT \ --docker-env https_proxy=https://$YOURPROXY:PORT ``` -If your Virtual Machine address is 192.168.99.100, then chances are your proxy settings will prevent kubectl from directly reaching it. +If your Virtual Machine address is 192.168.99.100, then chances are your proxy settings will prevent `kubectl` from directly reaching it. To by-pass proxy configuration for this IP address, you should modify your no_proxy settings. You can do so with: ```shell @@ -385,18 +390,21 @@ $ export no_proxy=$no_proxy,$(minikube ip) ## Design -Minikube uses [libmachine](https://github.com/docker/machine/tree/master/libmachine) for provisioning VMs, and [localkube](https://git.k8s.io/minikube/pkg/localkube) (originally written and donated to this project by [RedSpread](https://github.com/redspread)) for running the cluster. +Minikube uses [libmachine](https://github.com/docker/machine/tree/master/libmachine) for provisioning VMs, and [kubeadm](https://github.com/kubernetes/kubeadm) to provision a Kubernetes cluster. -For more information about minikube, see the [proposal](https://git.k8s.io/community/contributors/design-proposals/cluster-lifecycle/local-cluster-ux.md). +For more information about Minikube, see the [proposal](https://git.k8s.io/community/contributors/design-proposals/cluster-lifecycle/local-cluster-ux.md). -## Additional Links: -* **Goals and Non-Goals**: For the goals and non-goals of the minikube project, please see our [roadmap](https://git.k8s.io/minikube/docs/contributors/roadmap.md). +## Additional Links + +* **Goals and Non-Goals**: For the goals and non-goals of the Minikube project, please see our [roadmap](https://git.k8s.io/minikube/docs/contributors/roadmap.md). * **Development Guide**: See [CONTRIBUTING.md](https://git.k8s.io/minikube/CONTRIBUTING.md) for an overview of how to send pull requests. -* **Building Minikube**: For instructions on how to build/test minikube from source, see the [build guide](https://git.k8s.io/minikube/docs/contributors/build_guide.md) -* **Adding a New Dependency**: For instructions on how to add a new dependency to minikube see the [adding dependencies guide](https://git.k8s.io/minikube/docs/contributors/adding_a_dependency.md) -* **Adding a New Addon**: For instruction on how to add a new addon for minikube see the [adding an addon guide](https://git.k8s.io/minikube/docs/contributors/adding_an_addon.md) -* **Updating Kubernetes**: For instructions on how to update kubernetes see the [updating Kubernetes guide](https://git.k8s.io/minikube/docs/contributors/updating_kubernetes.md) +* **Building Minikube**: For instructions on how to build/test Minikube from source, see the [build guide](https://git.k8s.io/minikube/docs/contributors/build_guide.md). +* **Adding a New Dependency**: For instructions on how to add a new dependency to Minikube see the [adding dependencies guide](https://git.k8s.io/minikube/docs/contributors/adding_a_dependency.md). +* **Adding a New Addon**: For instruction on how to add a new addon for Minikube see the [adding an addon guide](https://git.k8s.io/minikube/docs/contributors/adding_an_addon.md). +* **Updating Kubernetes**: For instructions on how to update Kubernetes see the [updating Kubernetes guide](https://git.k8s.io/minikube/docs/contributors/updating_kubernetes.md). ## Community -Contributions, questions, and comments are all welcomed and encouraged! minikube developers hang out on [Slack](https://kubernetes.slack.com) in the #minikube channel (get an invitation [here](http://slack.kubernetes.io/)). We also have the [kubernetes-dev Google Groups mailing list](https://groups.google.com/forum/#!forum/kubernetes-dev). If you are posting to the list please prefix your subject with "minikube: ". +Contributions, questions, and comments are all welcomed and encouraged! Minikube developers hang out on [Slack](https://kubernetes.slack.com) in the #minikube channel (get an invitation [here](http://slack.kubernetes.io/)). We also have the [kubernetes-dev Google Groups mailing list](https://groups.google.com/forum/#!forum/kubernetes-dev). If you are posting to the list please prefix your subject with "minikube: ". + +{{% /capture %}} \ No newline at end of file From a0b97a3e5d3faa8ad9f5500646600641b6c49bdf Mon Sep 17 00:00:00 2001 From: Cody Clark Date: Mon, 5 Nov 2018 11:31:11 -0800 Subject: [PATCH 017/222] Update tutorial to work with Katacoda, No Install (#10797) * Update tutorial to work with Katacoda, No Install * Update hello-minikube.md --- content/en/docs/tutorials/hello-minikube.md | 469 +++++++------------- 1 file changed, 150 insertions(+), 319 deletions(-) diff --git a/content/en/docs/tutorials/hello-minikube.md b/content/en/docs/tutorials/hello-minikube.md index f9f8867413..63f99066ce 100644 --- a/content/en/docs/tutorials/hello-minikube.md +++ b/content/en/docs/tutorials/hello-minikube.md @@ -12,47 +12,33 @@ menu: {{% capture overview %}} -The goal of this tutorial is for you to turn a simple Hello World Node.js app -into an application running on Kubernetes. The tutorial shows you how to -take code that you have developed on your machine, turn it into a Docker -container image and then run that image on [Minikube](/docs/getting-started-guides/minikube). -Minikube provides a simple way of running Kubernetes on your local machine for free. +This tutorial shows you how to run a simple Hello World Node.js app +on Kubernetes using [Minikube](/docs/getting-started-guides/minikube) and Katacoda. +Katacoda provides a free, in-browser Kubernetes environment. + +{{< note >}} +**Note:** You can also follow this tutorial if you've installed Minikube locally. +{{< /note >}} {{% /capture %}} {{% capture objectives %}} -* Run a hello world Node.js application. -* Deploy the application to Minikube. +* Deploy a hello world application to Minikube. +* Run the app. * View application logs. -* Update the application image. - {{% /capture %}} {{% capture prerequisites %}} -* For macOS, you can use [Homebrew](https://brew.sh) to install Minikube. +This tutorial provides a container image built from the following files: - {{< note >}} - **Note:** If you see the following Homebrew error when you run `brew update` after you update your computer to macOS 10.13: - - ```shell - Error: /usr/local is not writable. You should change the ownership - and permissions of /usr/local back to your user account: - sudo chown -R $(whoami) /usr/local - ``` - You can resolve the issue by reinstalling Homebrew: - ```shell - /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" - ``` - {{< /note >}} +{{< codenew language="js" file="minikube/server.js" >}} -* [NodeJS](https://nodejs.org/en/) is required to run the sample application. - -* Install Docker. On macOS, we recommend -[Docker for Mac](https://docs.docker.com/engine/installation/mac/). +{{< codenew language="conf" file="minikube/Dockerfile" >}} +For more information, read the Docker documentation for [docker build](https://docs.docker.com/engine/reference/commandline/build/) {{% /capture %}} @@ -60,150 +46,26 @@ Minikube provides a simple way of running Kubernetes on your local machine for f ## Create a Minikube cluster -This tutorial uses [Minikube](https://github.com/kubernetes/minikube) to -create a local cluster. This tutorial also assumes you are using -[Docker for Mac](https://docs.docker.com/engine/installation/mac/) -on macOS. If you are on a different platform like Linux, or using VirtualBox -instead of Docker for Mac, the instructions to install Minikube may be -slightly different. For general Minikube installation instructions, see -the [Minikube installation guide](/docs/getting-started-guides/minikube/). +1. Click **Launch Terminal** -Use Homebrew to install the latest Minikube release: -```shell -brew cask install minikube -``` + {{< kat-button >}} -Install the HyperKit driver, as described by the -[Minikube driver installation guide](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#hyperkit-driver). + {{< note >}} + **Note:** If you installed Minikube locally, run + ```shell + minikube start + ``` + {{< /note >}} -Use Homebrew to download the `kubectl` command-line tool, which you can -use to interact with Kubernetes clusters: - -```shell -brew install kubernetes-cli -``` - -Determine whether you can access sites like [https://cloud.google.com/container-registry/](https://cloud.google.com/container-registry/) directly without a proxy, by opening a new terminal and using - -```shell -curl --proxy "" https://cloud.google.com/container-registry/ -``` - -Make sure that the Docker daemon is started. You can determine if docker is running by using a command such as: - -```shell -docker images -``` - -If NO proxy is required, start the Minikube cluster: - -```shell -minikube start --vm-driver=hyperkit -``` -If a proxy server is required, use the following method to start Minikube cluster with proxy setting: - -```shell -minikube start --vm-driver=hyperkit --docker-env HTTP_PROXY=http://your-http-proxy-host:your-http-proxy-port --docker-env HTTPS_PROXY=http(s)://your-https-proxy-host:your-https-proxy-port -``` - -The `--vm-driver=hyperkit` flag specifies that you are using Docker for Mac. The -default VM driver is VirtualBox. - -Now set the Minikube context. The context is what determines which cluster -`kubectl` is interacting with. You can see all your available contexts in the -`~/.kube/config` file. - -```shell -kubectl config use-context minikube -``` - -Verify that `kubectl` is configured to communicate with your cluster: - -```shell -kubectl cluster-info -``` - -Open the Kubernetes dashboard in a browser: +2. Open the Kubernetes dashboard in a browser: ```shell minikube dashboard ``` -## Create your Node.js application +3. Katacoda environment only: At the top of the terminal pane, click the plus sign, and then click **Select port to view on Host 1**. -The next step is to write the application. Save this code in a folder named `hellonode` -with the filename `server.js`: - -{{< codenew language="js" file="minikube/server.js" >}} - -Run your application: - -```shell -node server.js -``` - -You should be able to see your "Hello World!" message at http://localhost:8080/. - -Stop the running Node.js server by pressing **Ctrl-C**. - -The next step is to package your application in a Docker container. - -## Create a Docker container image - -Create a file, also in the `hellonode` folder, named `Dockerfile`. A Dockerfile describes -the image that you want to build. You can build a Docker container image by extending an -existing image. The image in this tutorial extends an existing Node.js image. - -{{< codenew language="conf" file="minikube/Dockerfile" >}} - -This recipe for the Docker image starts from the official Node.js LTS image -found in the Docker registry, exposes port 8080, copies your `server.js` file -to the image and starts the Node.js server. - -By default, Docker will create images and store them in your local machine's Docker registry. -In this tutorial, we will not use your local machine's Docker registry; we will use the -Docker registry of the Docker daemon running _inside_ Minikube's vm instance. To point the -'docker' command to your Minikube's Docker daemon, type (unix shells): - -```shell -eval $(minikube docker-env) -``` - -or in powershell: -```shell -minikube docker-env | Invoke-Expression -``` - - - -{{< note >}} -**Note:** Later, when you no longer wish to use the Minikube host, you can undo -this change by running `eval $(minikube docker-env -u)`. -{{< /note >}} - -Build your Docker image, using the Minikube Docker daemon (mind the trailing dot): - -```shell -docker build -t hello-node:v1 . -``` - -check that the image is in Minikube's Docker registry: - -```shell -minikube ssh docker images -``` - -Output: - -```shell -REPOSITORY TAG IMAGE ID CREATED SIZE -hello-node v1 f82485ca953c 3 minutes ago 655MB -... -node 6.9.2 faaadb4aaf9b 20 months ago 655MB -``` - - -Now the Minikube VM can run the image you built. +4. Katacoda environment only: Type 30000, and then click **Display Port**. ## Create a Deployment @@ -214,59 +76,54 @@ tutorial has only one Container. A Kubernetes Pod and restarts the Pod's Container if it terminates. Deployments are the recommended way to manage the creation and scaling of Pods. -Use the `kubectl run` command to create a Deployment that manages a Pod. The -Pod runs a Container based on your `hello-node:v1` Docker image. Set the -`--image-pull-policy` flag to `Never` to always use the local image, rather than -pulling it from your Docker registry (since you haven't pushed it there): +1. Use the `kubectl run` command to create a Deployment that manages a Pod. The +Pod runs a Container based on the provided Docker image. -```shell -kubectl run hello-node --image=hello-node:v1 --port=8080 --image-pull-policy=Never -``` + ```shell + kubectl run hello-node --image=gcr.io/hello-minikube-zero-install/hello-node --port=8080 + ``` -View the Deployment: +2. View the Deployment: + ```shell + kubectl get deployments + ``` -```shell -kubectl get deployments -``` + Output: -Output: + ```shell + NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE + hello-node 1 1 1 1 1m + ``` +3. View the Pod: -```shell -NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE -hello-node 1 1 1 1 3m -``` + ```shell + kubectl get pods + ``` + Output: -View the Pod: + ```shell + NAME READY STATUS RESTARTS AGE + hello-node-5f76cf6ccf-br9b5 1/1 Running 0 1m + ``` +4. View cluster events: -```shell -kubectl get pods -``` + ```shell + kubectl get events + ``` -Output: +5. View the `kubectl` configuration: - -```shell -NAME READY STATUS RESTARTS AGE -hello-node-714049816-ztzrb 1/1 Running 0 6m -``` - -View cluster events: - -```shell -kubectl get events -``` - -View the `kubectl` configuration: - -```shell -kubectl config view -``` - -For more information about `kubectl`commands, see the -[kubectl overview](/docs/user-guide/kubectl-overview/). + ```shell + kubectl config view + ``` + + {{< note >}} + **Note:** For more information about `kubectl`commands, see the + [kubectl overview](/docs/user-guide/kubectl-overview/). + {{< /note >}} ## Create a Service @@ -275,142 +132,126 @@ Kubernetes cluster. To make the `hello-node` Container accessible from outside t Kubernetes virtual network, you have to expose the Pod as a Kubernetes [*Service*](/docs/concepts/services-networking/service/). -From your development machine, you can expose the Pod to the public internet -using the `kubectl expose` command: +1. Expose the Pod to the public internet using the `kubectl expose` command: -```shell -kubectl expose deployment hello-node --type=LoadBalancer -``` + ```shell + kubectl expose deployment hello-node --type=LoadBalancer + ``` -View the Service you just created: +2. View the Service you just created: -```shell -kubectl get services -``` + ```shell + kubectl get services + ``` -Output: + Output: -```shell -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -hello-node ClusterIP 10.0.0.71 8080/TCP 6m -kubernetes ClusterIP 10.0.0.1 443/TCP 14d -``` + ```shell + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + hello-node LoadBalancer 10.108.144.78 8080:30369/TCP 21s + kubernetes ClusterIP 10.96.0.1 443/TCP 23m + ``` -The `--type=LoadBalancer` flag indicates that you want to expose your Service -outside of the cluster. On cloud providers that support load balancers, -an external IP address would be provisioned to access the Service. On Minikube, -the `LoadBalancer` type makes the Service accessible through the `minikube service` -command. + The `--type=LoadBalancer` flag indicates that you want to expose your Service + outside of the cluster. On cloud providers that support load balancers, + an external IP address would be provisioned to access the Service. On Minikube, + the `LoadBalancer` type makes the Service accessible through the `minikube service` + command. -```shell -minikube service hello-node -``` +3. Run the following command: -This automatically opens up a browser window using a local IP address that -serves your app and shows the "Hello World" message. + ```shell + minikube service hello-node + ``` -Assuming you've sent requests to your new web service using the browser or curl, -you should now be able to see some logs: +4. Katacoda environment only: Click the plus sign, then click **Select port to view on Host 1**. -```shell -kubectl logs -``` +5. Katacoda environment only: Type in the Port number following `8080:`, and then click **Display Port**. -## Update your app - -Edit your `server.js` file to return a new message: - -```javascript -response.end('Hello World Again!'); - -``` - -Build a new version of your image (mind the trailing dot): - -```shell -docker build -t hello-node:v2 . -``` - -Update the image of your Deployment: - -```shell -kubectl set image deployment/hello-node hello-node=hello-node:v2 -``` - -Run your app again to view the new message: - -```shell -minikube service hello-node -``` + This opens up a browser window that serves your app and shows the "Hello World" message. ## Enable addons Minikube has a set of built-in addons that can be enabled, disabled and opened in the local Kubernetes environment. -First list the currently supported addons: +1. List the currently supported addons: -```shell -minikube addons list -``` + ```shell + minikube addons list + ``` -Output: + Output: -```shell -- storage-provisioner: enabled -- kube-dns: enabled -- registry: disabled -- registry-creds: disabled -- addon-manager: enabled -- dashboard: disabled -- default-storageclass: enabled -- coredns: disabled -- heapster: disabled -- efk: disabled -- ingress: disabled -``` + ```shell + - addon-manager: enabled + - coredns: disabled + - dashboard: enabled + - default-storageclass: enabled + - efk: disabled + - freshpod: disabled + - heapster: disabled + - ingress: disabled + - kube-dns: enabled + - metrics-server: disabled + - nvidia-driver-installer: disabled + - nvidia-gpu-device-plugin: disabled + - registry: disabled + - registry-creds: disabled + - storage-provisioner: enabled + ``` + {{< note >}} + **Note:** + Minikube must be running for these commands to take effect. + {{< /note >}} -Minikube must be running for these commands to take effect. To enable `heapster` addon, for example: +2. Enable an addon, for example, `heapster`: -```shell -minikube addons enable heapster -``` + ```shell + minikube addons enable heapster + ``` + + Output: -Output: + ```shell + heapster was successfully enabled + ``` -```shell -heapster was successfully enabled -``` +3. View the Pod and Service you just created: -View the Pod and Service you just created: + ```shell + kubectl get po,svc -n kube-system + ``` -```shell -kubectl get po,svc -n kube-system -``` + Output: -Output: + ```shell + NAME READY STATUS RESTARTS AGE + pod/heapster-9jttx 1/1 Running 0 26s + pod/influxdb-grafana-b29w8 2/2 Running 0 26s + pod/kube-addon-manager-minikube 1/1 Running 0 34m + pod/kube-dns-6dcb57bcc8-gv7mw 3/3 Running 0 34m + pod/kubernetes-dashboard-5498ccf677-cgspw 1/1 Running 0 34m + pod/storage-provisioner 1/1 Running 0 34m -```shell -NAME READY STATUS RESTARTS AGE -pod/heapster-zbwzv 1/1 Running 0 2m -pod/influxdb-grafana-gtht9 2/2 Running 0 2m + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + service/heapster ClusterIP 10.96.241.45 80/TCP 26s + service/kube-dns ClusterIP 10.96.0.10 53/UDP,53/TCP 34m + service/kubernetes-dashboard NodePort 10.109.29.1 80:30000/TCP 34m + service/monitoring-grafana NodePort 10.99.24.54 80:30002/TCP 26s + service/monitoring-influxdb ClusterIP 10.111.169.94 8083/TCP,8086/TCP 26s + ``` -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -service/heapster NodePort 10.0.0.52 80:31655/TCP 2m -service/monitoring-grafana NodePort 10.0.0.33 80:30002/TCP 2m -service/monitoring-influxdb ClusterIP 10.0.0.43 8083/TCP,8086/TCP 2m -``` +4. Disable `heapster`: -Open the endpoint to interacting with heapster in a browser: + ```shell + minikube addons disable heapster + ``` + + Output: -```shell -minikube addons open heapster -``` - -Output: - -```shell -Opening kubernetes service kube-system/monitoring-grafana in default browser... -``` + ```shell + heapster was successfully disabled + ``` ## Clean up @@ -421,17 +262,10 @@ kubectl delete service hello-node kubectl delete deployment hello-node ``` -Optionally, force removal of the Docker images created: - -```shell -docker rmi hello-node:v1 hello-node:v2 -f -``` - Optionally, stop the Minikube VM: ```shell minikube stop -eval $(minikube docker-env -u) ``` Optionally, delete the Minikube VM: @@ -442,7 +276,6 @@ minikube delete {{% /capture %}} - {{% capture whatsnext %}} * Learn more about [Deployment objects](/docs/concepts/workloads/controllers/deployment/). @@ -450,5 +283,3 @@ minikube delete * Learn more about [Service objects](/docs/concepts/services-networking/service/). {{% /capture %}} - - From 2a114ab08508234d9c9ee28239306da92afdf68a Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Mon, 5 Nov 2018 11:41:32 -0800 Subject: [PATCH 018/222] Revert "Add i18n/OWNERS" (#10886) * Revert "Update tutorial to work with Katacoda, No Install (#10797)" This reverts commit a0b97a3e5d3faa8ad9f5500646600641b6c49bdf. * Revert "clean-up minikube toc (#10873)" This reverts commit 18343eb44b025a18eb6d39f5ae192ad81d7dd09b. * Revert "Tutorial cleanup: Delete K8s 101 and 201 (#10786)" This reverts commit e0168fd8dcbfdb59e8e87b9678058d6c43cd1be9. * Revert "fix word err in Disruption (#10884)" This reverts commit d01b76d08044e213f06f567a99e127cd496178fb. * Revert "Fix typo (#10877)" This reverts commit 15518689c7317d810f81218f7cf8f17348ae5319. * Revert "add note informing users of env var updates (#10819)" This reverts commit 795de19c0719e0616380f6c4929b816f3dfbf987. * Revert "Fix typo in word repositories (#10883)" This reverts commit 6d7f27ea45ea17e9f9c7a96926b1cc93b5019436. * Revert "Add i18n strings for Korean translation (#10611)" This reverts commit a9d8c54e6d2b447361beaa0643b251227993aa2e. * Revert "Modified into appropriate words (#10768)" This reverts commit 7ebdd661d7ca4ab0a868a176e287cc4be2a93f0c. * Revert "Update tools.md (#10753)" This reverts commit 2d8bc158a21be1c057e88def1e49a116f75ce01b. * Revert "Enable reviews/approvers for localized site strings (#10811)" This reverts commit 81b2562f77ee1675e4b013da970d8f5ff11f2cb4. --- i18n/OWNERS | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 i18n/OWNERS diff --git a/i18n/OWNERS b/i18n/OWNERS deleted file mode 100644 index 7c95255902..0000000000 --- a/i18n/OWNERS +++ /dev/null @@ -1,13 +0,0 @@ -# This is the directory for internationalized site strings. - -reviewers: -- sig-docs-pr-reviews -- sig-docs-ja-reviews -- sig-docs-ko-reviews -- sig-docs-zh-reviews - -approvers: -- sig-docs-en-owners -- sig-docs-ja-owners -- sig-docs-ko-owners -- sig-docs-zh-owners From f850885f4c32b394f84c4676b8d14a757caaf8b6 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Tue, 6 Nov 2018 15:53:19 +0800 Subject: [PATCH 019/222] Typo fix in docker-cli-kubectl.md (#10892) kubeclt->kubectl --- content/zh/docs/user-guide/docker-cli-to-kubectl.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/user-guide/docker-cli-to-kubectl.md b/content/zh/docs/user-guide/docker-cli-to-kubectl.md index d7f243ce91..4775e97a8c 100644 --- a/content/zh/docs/user-guide/docker-cli-to-kubectl.md +++ b/content/zh/docs/user-guide/docker-cli-to-kubectl.md @@ -52,7 +52,7 @@ kubectl run [-i] [--tty] --attach --image= 涓 `docker run ...` 涓嶅悓鐨勬槸锛屽鏋滄寚瀹氫簡 `--attach` 锛屾垜浠皢杩炴帴鍒 `stdin`锛宍stdout` 鍜 `stderr`锛岃屼笉鑳芥帶鍒跺叿浣撹繛鎺ュ埌鍝釜杈撳嚭娴侊紙`docker -a ...`锛夈 鍥犱负鎴戜滑浣跨敤 Deployment 鍚姩浜嗗鍣紝濡傛灉鎮ㄧ粓姝簡杩炴帴鍒扮殑杩涚▼锛堜緥濡 `ctrl-c`锛夛紝瀹瑰櫒灏嗕細閲嶅惎锛岃繖璺 `docker run -it` 涓嶅悓銆 -濡傛灉鎯抽攢姣佽 Deployment锛堝拰瀹冪殑 pod锛夛紝鎮ㄩ渶瑕佽繍琛 `kubeclt delete deployment `銆 +濡傛灉鎯抽攢姣佽 Deployment锛堝拰瀹冪殑 pod锛夛紝鎮ㄩ渶瑕佽繍琛 `kubectl delete deployment `銆 #### docker ps From f922e3f2e9e3308204e5c1dfee6b797283f09166 Mon Sep 17 00:00:00 2001 From: Pingan Date: Tue, 6 Nov 2018 15:54:35 +0800 Subject: [PATCH 020/222] -output -> --output (#10897) --- content/en/docs/reference/kubectl/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/reference/kubectl/overview.md b/content/en/docs/reference/kubectl/overview.md index ca50170576..76f208f40e 100644 --- a/content/en/docs/reference/kubectl/overview.md +++ b/content/en/docs/reference/kubectl/overview.md @@ -135,7 +135,7 @@ Use the following sections for information about how you can format or sort the ### Formatting output -The default output format for all `kubectl` commands is the human readable plain-text format. To output details to your terminal window in a specific format, you can add either the `-o` or `-output` flags to a supported `kubectl` command. +The default output format for all `kubectl` commands is the human readable plain-text format. To output details to your terminal window in a specific format, you can add either the `-o` or `--output` flags to a supported `kubectl` command. #### Syntax From fd7a788fe7383e7f8a3d20d8d3e348dc639d3e9a Mon Sep 17 00:00:00 2001 From: Aleks Date: Tue, 6 Nov 2018 09:01:29 +0100 Subject: [PATCH 021/222] Update HAProxy ingress line (#10794) * Update HAProxy ingress line HAProxy Technologies offers support for the free available haproxy ingress controller * Updated the haproxy wording from feedback Updated the haproxy wording from feedback of @tengqm * Remove doc artefacts --- content/en/docs/concepts/services-networking/ingress.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/services-networking/ingress.md b/content/en/docs/concepts/services-networking/ingress.md index b61141909c..2eb745c867 100644 --- a/content/en/docs/concepts/services-networking/ingress.md +++ b/content/en/docs/concepts/services-networking/ingress.md @@ -95,7 +95,7 @@ In order for the Ingress resource to work, the cluster must have an Ingress cont * [Traefik](https://github.com/containous/traefik) is a fully featured ingress controller ([Let's Encrypt](https://letsencrypt.org), secrets, http2, websocket...), and it also comes with commercial support by [Containous](https://containo.us/services) * [NGINX, Inc.](https://www.nginx.com/) offers support and maintenance for the [NGINX Ingress Controller for Kubernetes](https://www.nginx.com/products/nginx/kubernetes-ingress-controller) -* [HAProxy](http://www.haproxy.org/) based ingress controller [jcmoraisjr/haproxy-ingress](https://github.com/jcmoraisjr/haproxy-ingress) which is mentioned on this blog post [HAProxy Ingress Controller for Kubernetes](https://www.haproxy.com/blog/haproxy_ingress_controller_for_kubernetes/) +* [HAProxy](http://www.haproxy.org/) based ingress controller [jcmoraisjr/haproxy-ingress](https://github.com/jcmoraisjr/haproxy-ingress) which is mentioned on this blog post [HAProxy Ingress Controller for Kubernetes](https://www.haproxy.com/blog/haproxy_ingress_controller_for_kubernetes/). [HAProxy Technologies](https://www.haproxy.com/) offers support and maintenance for HAProxy Enterprise and the ingress controller [jcmoraisjr/haproxy-ingress](https://github.com/jcmoraisjr/haproxy-ingress). * [Istio](https://istio.io/) based ingress controller [Control Ingress Traffic](https://istio.io/docs/tasks/traffic-management/ingress/) {{< note >}} From 07d043b3f174bb9cf1fe118fc606298cc90369e8 Mon Sep 17 00:00:00 2001 From: Tim Bannister Date: Tue, 6 Nov 2018 08:08:23 +0000 Subject: [PATCH 022/222] Fix typos in kubeadm impl details (#10898) (#10899) --- .../reference/setup-tools/kubeadm/implementation-details.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/en/docs/reference/setup-tools/kubeadm/implementation-details.md b/content/en/docs/reference/setup-tools/kubeadm/implementation-details.md index 09cc412595..8d846acbc7 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/implementation-details.md +++ b/content/en/docs/reference/setup-tools/kubeadm/implementation-details.md @@ -106,9 +106,9 @@ In any case the user can skip specific preflight checks (or eventually all prefl - [Error] if `ip`, `iptables`, `mount`, `nsenter` commands are not present in the command path - [warning] if `ebtables`, `ethtool`, `socat`, `tc`, `touch`, `crictl` commands are not present in the command path - [warning] if extra arg flags for API server, controller manager, scheduler contains some invalid options -- [warning] if connection to https://API.AdvertiseAddress:API.BindPort goes thought proxy -- [warning] if connection to services subnet goes thought proxy (only first address checked) -- [warning] if connection to Pods subnet goes thought proxy (only first address checked) +- [warning] if connection to https://API.AdvertiseAddress:API.BindPort goes through proxy +- [warning] if connection to services subnet goes through proxy (only first address checked) +- [warning] if connection to Pods subnet goes through proxy (only first address checked) - If external etcd is provided: - [Error] if etcd version less than 3.0.14 - [Error] if etcd certificates or keys are specified, but not provided From 2f395f1ded2fb4db43411020b23f0a01c957b73e Mon Sep 17 00:00:00 2001 From: Dennis Schridde Date: Tue, 6 Nov 2018 19:01:52 +0100 Subject: [PATCH 023/222] Fix formatting of Kubernetes Meets High Performance blog post (#10901) --- ...08-00-Kubernetes-Meets-High-Performance.md | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/content/en/blog/_posts/2017-08-00-Kubernetes-Meets-High-Performance.md b/content/en/blog/_posts/2017-08-00-Kubernetes-Meets-High-Performance.md index a8bbac6f73..6db792a6e3 100644 --- a/content/en/blog/_posts/2017-08-00-Kubernetes-Meets-High-Performance.md +++ b/content/en/blog/_posts/2017-08-00-Kubernetes-Meets-High-Performance.md @@ -16,12 +16,10 @@ In Kubernetes, the base unit of scheduling is a Pod: one or more Docker containe Traditional HPC applications often exhibit different characteristics: -- -In financial or engineering simulations, a job may be comprised of tens of thousands of short-running tasks, demanding low-latency and high-throughput scheduling to complete a simulation in an acceptable amount of time. -- -A computational fluid dynamics (CFD) problem may execute in parallel across many hundred or even thousands of nodes using a message passing library to synchronize state. This requires specialized scheduling and job management features to allocate and launch such jobs and then to checkpoint, suspend/resume or backfill them. -- -Other HPC workloads may require specialized resources like GPUs or require access to limited software licenses. Organizations may enforce policies around what types of resources can be used by whom to ensure projects are adequately resourced and deadlines are met. +- In financial or engineering simulations, a job may be comprised of tens of thousands of short-running tasks, demanding low-latency and high-throughput scheduling to complete a simulation in an acceptable amount of time. +- A computational fluid dynamics (CFD) problem may execute in parallel across many hundred or even thousands of nodes using a message passing library to synchronize state. This requires specialized scheduling and job management features to allocate and launch such jobs and then to checkpoint, suspend/resume or backfill them. +- Other HPC workloads may require specialized resources like GPUs or require access to limited software licenses. Organizations may enforce policies around what types of resources can be used by whom to ensure projects are adequately resourced and deadlines are met. + HPC workload schedulers have evolved to support exactly these kinds of workloads. Examples include [Univa Grid Engine](http://www.univa.com/products/), [IBM Spectrum LSF](https://www-03.ibm.com/systems/spectrum-computing/products/lsf/) and Altair鈥檚 [PBS Professional](http://www.pbsworks.com/PBSProduct.aspx?n=PBS-Professional&c=Overview-and-Capabilities). Sites managing HPC workloads have come to rely on capabilities like array jobs, configurable pre-emption, user, group or project based quotas and a variety of other features. ## Blurring the lines between containers and HPC @@ -36,18 +34,15 @@ While the notion of packaging a workload into a Docker container, publishing it To deal with the challenges of migrating to containers, organizations running container and HPC workloads have several options: -- -Maintain separate infrastructures +- Maintain separate infrastructures For sites with sunk investments in HPC, this may be a preferred approach. Rather than disrupt existing environments, it may be easier to deploy new containerized applications on a separate cluster and leave the HPC environment alone. The challenge is that this comes at the cost of siloed clusters, increasing infrastructure and management cost. -- -Run containerized workloads under an existing HPC workload manager +- Run containerized workloads under an existing HPC workload manager For sites running traditional HPC workloads, another approach is to use existing job submission mechanisms to launch jobs that in turn instantiate Docker containers on one or more target hosts. Sites using this approach can introduce containerized workloads with minimal disruption to their environment. Leading HPC workload managers such as [Univa Grid Engine Container Edition](http://blogs.univa.com/2016/05/new-version-of-univa-grid-engine-now-supports-docker-containers/) and [IBM Spectrum LSF](http://blogs.univa.com/2016/05/new-version-of-univa-grid-engine-now-supports-docker-containers/) are adding native support for Docker containers. [Shifter](https://github.com/NERSC/shifter) and [Singularity](http://singularity.lbl.gov/) are important open source tools supporting this type of deployment also. While this is a good solution for sites with simple requirements that want to stick with their HPC scheduler, they will not have access to native Kubernetes features, and this may constrain flexibility in managing long-running services where Kubernetes excels. -- -Use native job scheduling features in Kubernetes +- Use native job scheduling features in Kubernetes Sites less invested in existing HPC applications can use existing scheduling facilities in Kubernetes for [jobs that run to completion](https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/). While this is an option, it may be impractical for many HPC users. HPC applications are often either optimized towards massive throughput or large scale parallelism. In both cases startup and teardown latencies have a discriminating impact. Latencies that appear to be acceptable for containerized microservices today would render such applications unable to scale to the required levels. @@ -75,7 +70,4 @@ One client having success with mixed workloads is the Institute for Health Metri ![](https://lh5.googleusercontent.com/GJeP6e89r6drl72yzZM_OsZ81MYDp7Zm5xEFpItpmioian3lOp535H4jy1_eELKrzGMYr_wnjGwpK3Uku9dwg2-vqmMC1A1GrMtJc-PZR6GR6Z-fAZNJMEr_Uw3HqvWvi86mF_63XTozysaLpg) - - - For sites deploying new clusters that want access to the rich capabilities in Kubernetes but need the flexibility to run non-containerized workloads, this approach is worth a look. It offers the opportunity for sites to share infrastructure between Kubernetes and HPC workloads without disrupting existing applications and businesses processes. It also allows them to migrate their HPC workloads to use Docker containers at their own pace. From e839031292794596a40ab9af04e60b3998837279 Mon Sep 17 00:00:00 2001 From: David Rubin Date: Tue, 6 Nov 2018 19:31:11 +0100 Subject: [PATCH 024/222] Update officially supported client libraries (#10792) --- content/en/docs/reference/_index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/en/docs/reference/_index.md b/content/en/docs/reference/_index.md index 56dfb08920..b5e825bc7f 100644 --- a/content/en/docs/reference/_index.md +++ b/content/en/docs/reference/_index.md @@ -35,6 +35,8 @@ client libraries: - [Kubernetes Go client library](https://github.com/kubernetes/client-go/) - [Kubernetes Python client library](https://github.com/kubernetes-client/python) +- [Kubernetes Java client library](https://github.com/kubernetes-client/java) +- [Kubernetes JavaScript client library](https://github.com/kubernetes-client/javascript) ## CLI Reference From d65e1790ffc020129db5f5a583060d6fe318316a Mon Sep 17 00:00:00 2001 From: Luc Perkins Date: Tue, 6 Nov 2018 11:33:04 -0800 Subject: [PATCH 025/222] Add admonition type to shortcode (#9482) * Change existing admon blocks * Fix includes issue --- ...pelin-To-Process-Big-Data-On-Kubernetes.md | 4 +- ...018-04-11-migrating-the-kubernetes-blog.md | 2 +- .../concepts/architecture/cloud-controller.md | 2 +- .../en/docs/concepts/architecture/nodes.md | 6 +-- .../cluster-administration/logging.md | 16 ++++-- .../manage-deployment.md | 2 +- .../concepts/configuration/assign-pod-node.md | 10 ++-- .../manage-compute-resources-container.md | 12 +++-- .../organize-cluster-access-kubeconfig.md | 2 +- .../docs/concepts/configuration/overview.md | 6 +-- .../configuration/pod-priority-preemption.md | 33 +++++------- .../configuration/scheduler-perf-tuning.md | 6 ++- .../en/docs/concepts/configuration/secret.md | 10 ++-- .../configuration/taint-and-toleration.md | 4 +- content/en/docs/concepts/containers/images.md | 16 +++--- .../docs/concepts/containers/runtime-class.md | 6 +-- .../docs/concepts/example-concept-template.md | 4 +- .../api-extension/custom-resources.md | 4 +- .../declarative-config.md | 37 ++++++------- .../imperative-command.md | 5 +- .../imperative-config.md | 4 +- .../object-management-kubectl/overview.md | 6 +-- .../working-with-objects/common-labels.md | 2 +- .../overview/working-with-objects/labels.md | 2 +- .../concepts/policy/pod-security-policy.md | 6 +-- .../docs/concepts/policy/resource-quotas.md | 2 +- .../services-networking/dns-pod-service.md | 4 +- .../concepts/services-networking/ingress.md | 6 +-- .../concepts/services-networking/service.md | 20 ++++--- .../concepts/storage/persistent-volumes.md | 16 +++--- .../docs/concepts/storage/storage-classes.md | 16 ++++-- content/en/docs/concepts/storage/volumes.md | 52 +++++++++---------- .../workloads/controllers/cron-jobs.md | 3 +- .../controllers/jobs-run-to-completion.md | 2 +- .../controllers/replicationcontroller.md | 2 +- .../workloads/controllers/statefulset.md | 4 +- .../concepts/workloads/pods/pod-overview.md | 2 +- .../docs/concepts/workloads/pods/podpreset.md | 2 +- .../contribute/generate-ref-docs/kubectl.md | 2 - .../generate-ref-docs/kubernetes-api.md | 8 +-- .../kubernetes-components.md | 3 +- content/en/docs/contribute/intermediate.md | 13 +++-- content/en/docs/contribute/localization.md | 4 ++ content/en/docs/contribute/start.md | 4 +- .../contribute/style/content-organization.md | 4 +- .../style/hugo-shortcodes/example1.md | 2 +- .../contribute/style/hugo-shortcodes/index.md | 10 +++- .../docs/contribute/style/page-templates.md | 2 +- .../en/docs/contribute/style/style-guide.md | 26 +++++----- .../docs/contribute/style/write-new-topic.md | 4 +- .../snippets/atom-snippets.cson | 6 +-- .../fedora/flannel_multi_node_cluster.md | 8 ++- .../getting-started-guides/ubuntu/backups.md | 8 +-- .../ubuntu/decommissioning.md | 2 +- .../ubuntu/networking.md | 2 +- .../getting-started-guides/ubuntu/storage.md | 7 ++- .../getting-started-guides/ubuntu/upgrades.md | 4 +- .../ubuntu/validation.md | 4 +- .../getting-started-guides/windows/_index.md | 8 +-- .../docs/reference/access-authn-authz/abac.md | 4 +- .../admission-controllers.md | 16 +++--- .../access-authn-authz/authentication.md | 11 ++-- .../access-authn-authz/authorization.md | 11 ++-- .../access-authn-authz/bootstrap-tokens.md | 2 +- .../extensible-admission-controllers.md | 6 +-- .../docs/reference/access-authn-authz/rbac.md | 12 +++-- .../feature-gates.md | 2 +- .../kubelet-tls-bootstrapping.md | 4 +- .../reference/glossary/cluster-operator.md | 4 +- .../en/docs/reference/kubectl/conventions.md | 6 ++- .../kubectl/docker-cli-to-kubectl.md | 4 +- content/en/docs/reference/kubectl/overview.md | 7 ++- .../setup-tools/kubeadm/kubeadm-alpha.md | 4 +- .../setup-tools/kubeadm/kubeadm-init.md | 11 ++-- .../setup-tools/kubeadm/kubeadm-join.md | 3 +- .../docs/reference/using-api/api-overview.md | 6 +-- .../reference/using-api/deprecation-policy.md | 4 +- content/en/docs/setup/certificates.md | 2 +- .../en/docs/setup/custom-cloud/kubespray.md | 2 +- .../independent/create-cluster-kubeadm.md | 8 +-- .../setup/independent/high-availability.md | 25 ++++----- .../independent/setup-ha-etcd-with-kubeadm.md | 2 +- .../independent/troubleshooting-kubeadm.md | 2 +- content/en/docs/setup/minikube.md | 4 +- content/en/docs/setup/multiple-zones.md | 4 +- .../en/docs/setup/on-premises-metal/krib.md | 6 +-- content/en/docs/setup/pick-right-solution.md | 3 +- content/en/docs/setup/release/notes.md | 2 +- content/en/docs/setup/scratch.md | 4 +- content/en/docs/setup/turnkey/gce.md | 2 +- .../configure-access-multiple-clusters.md | 2 +- .../configure-cloud-provider-firewall.md | 11 ++-- .../connecting-frontend-backend.md | 12 +++-- .../create-external-load-balancer.md | 5 +- .../list-all-running-container-images.md | 2 +- ...load-balance-access-application-cluster.md | 4 +- ...port-forward-access-application-cluster.md | 2 +- .../configure-aggregation-layer.md | 2 +- .../custom-resource-definition-versioning.md | 4 +- .../configure-upgrade-etcd.md | 10 ++-- .../docs/tasks/administer-cluster/coredns.md | 2 +- .../cpu-management-policies.md | 8 +-- .../declare-network-policy.md | 4 +- .../tasks/administer-cluster/encrypt-data.md | 8 ++- .../extended-resource-node.md | 4 +- .../tasks/administer-cluster/ip-masq-agent.md | 6 ++- .../kubeadm/kubeadm-upgrade-ha.md | 3 +- .../cpu-constraint-namespace.md | 2 +- .../tasks/administer-cluster/namespaces.md | 4 +- .../administer-cluster/reconfigure-kubelet.md | 4 +- .../administer-cluster/safely-drain-node.md | 4 +- .../administer-cluster/securing-a-cluster.md | 4 +- .../tasks/administer-cluster/static-pod.md | 7 ++- .../administer-cluster/sysctl-cluster.md | 6 +-- .../tasks/administer-federation/configmap.md | 2 +- .../docs/tasks/administer-federation/hpa.md | 5 +- .../docs/tasks/administer-federation/job.md | 2 +- .../tasks/administer-federation/namespaces.md | 2 +- .../tasks/administer-federation/replicaset.md | 2 +- .../tasks/administer-federation/secret.md | 2 +- .../assign-cpu-resource.md | 2 +- .../attach-handler-lifecycle-event.md | 2 +- .../configure-persistent-volume-storage.md | 2 +- .../configure-pod-configmap.md | 10 ++-- .../configure-service-account.md | 6 +-- .../pull-image-private-registry.md | 2 +- .../quality-service-pod.md | 2 +- .../security-context.md | 6 +-- .../translate-compose-kubernetes.md | 13 +++-- .../tasks/debug-application-cluster/audit.md | 8 +-- .../core-metrics-pipeline.md | 2 +- .../tasks/debug-application-cluster/crictl.md | 2 +- .../debug-application.md | 2 +- .../debug-pod-replication-controller.md | 6 ++- .../debug-service.md | 14 +++-- .../events-stackdriver.md | 2 +- .../logging-elasticsearch-kibana.md | 2 +- .../logging-stackdriver.md | 23 +++++--- .../en/docs/tasks/example-task-template.md | 4 +- .../tasks/extend-kubectl/kubectl-plugins.md | 9 ++-- .../federation-service-discovery.md | 4 +- .../set-up-cluster-federation-kubefed.md | 17 +++--- .../set-up-coredns-provider-federation.md | 10 ++-- .../define-command-argument-container.md | 4 +- .../define-environment-variable-container.md | 2 +- .../distribute-credentials-secure.md | 9 ++-- ...nward-api-volume-expose-pod-information.md | 6 +-- ...ronment-variable-expose-pod-information.md | 2 +- .../job/automated-tasks-with-cron-jobs.md | 15 ++++-- .../manage-daemon/rollback-daemon-set.md | 2 +- .../tasks/manage-daemon/update-daemon-set.md | 5 +- .../tasks/run-application/configure-pdb.md | 6 ++- .../run-application/delete-stateful-set.md | 4 +- .../horizontal-pod-autoscale-walkthrough.md | 10 ++-- .../horizontal-pod-autoscale.md | 14 ++--- .../rolling-update-replication-controller.md | 2 +- .../install-service-catalog-using-helm.md | 2 +- .../tasks/tls/managing-tls-in-a-cluster.md | 2 +- .../en/docs/tasks/tools/install-kubectl.md | 12 +++-- .../en/docs/tasks/tools/install-minikube.md | 2 +- content/en/docs/test.md | 8 +-- .../en/docs/tutorials/clusters/apparmor.md | 12 +++-- content/en/docs/tutorials/hello-minikube.md | 8 +-- .../basic-stateful-set.md | 2 +- .../stateful-application/cassandra.md | 8 +-- .../mysql-wordpress-persistent-volume.md | 26 ++++++---- .../stateless-application/guestbook.md | 6 +-- .../en/includes/federation-current-state.md | 2 +- .../ko/docs/setup/custom-cloud/kubespray.md | 2 +- .../independent/create-cluster-kubeadm.md | 8 +-- .../setup/independent/high-availability.md | 14 ++--- .../independent/setup-ha-etcd-with-kubeadm.md | 2 +- .../independent/troubleshooting-kubeadm.md | 2 +- content/ko/docs/setup/multiple-zones.md | 6 ++- content/ko/docs/setup/scratch.md | 4 +- content/ko/docs/setup/turnkey/gce.md | 2 +- .../docs/admin/kubelet-tls-bootstrapping.md | 4 +- .../configuration/taint-and-toleration.md | 2 +- .../workloads/controllers/deployment.md | 22 ++++---- .../access-authn-authz/authorization.md | 2 +- .../create-external-load-balancer.md | 2 +- .../list-all-running-container-images.md | 2 +- ...load-balance-access-application-cluster.md | 4 +- ...port-forward-access-application-cluster.md | 2 +- .../kubeadm/kubeadm-upgrade-1-9.md | 4 +- .../administer-cluster/sysctl-cluster.md | 6 +-- .../tasks/debug-application-cluster/audit.md | 4 +- ...nward-api-volume-expose-pod-information.md | 2 +- layouts/shortcodes/caution.html | 4 +- layouts/shortcodes/note.html | 2 +- layouts/shortcodes/warning.html | 2 +- .../example-tutorial-template.md | 4 +- 192 files changed, 673 insertions(+), 543 deletions(-) diff --git a/content/en/blog/_posts/2016-03-00-Using-Spark-And-Zeppelin-To-Process-Big-Data-On-Kubernetes.md b/content/en/blog/_posts/2016-03-00-Using-Spark-And-Zeppelin-To-Process-Big-Data-On-Kubernetes.md index f730cab425..dcc9215c28 100644 --- a/content/en/blog/_posts/2016-03-00-Using-Spark-And-Zeppelin-To-Process-Big-Data-On-Kubernetes.md +++ b/content/en/blog/_posts/2016-03-00-Using-Spark-And-Zeppelin-To-Process-Big-Data-On-Kubernetes.md @@ -105,7 +105,9 @@ $ gsutil mb gs://my-spark-models ``` You鈥檒l need to change this URI to something that is unique for you. This will create a bucket that you can use in the example above. -**Note** : Computing the model and saving it is much slower than computing the model and throwing it away. This is expected. However, if you plan to reuse a model, it鈥檚 faster to compute the model and save it and then restore it each time you want to use it, rather than throw away and recompute the model each time. +{{< note >}} +Computing the model and saving it is much slower than computing the model and throwing it away. This is expected. However, if you plan to reuse a model, it鈥檚 faster to compute the model and save it and then restore it each time you want to use it, rather than throw away and recompute the model each time. +{{< /note >}} ### Using Horizontal Pod Autoscaling with Spark (Optional)  Spark is somewhat elastic to workers coming and going, which means we have an opportunity: we can use use [Kubernetes Horizontal Pod Autoscaling](http://kubernetes.io/docs/user-guide/horizontal-pod-autoscaling/) to scale-out the Spark worker pool automatically, setting a target CPU threshold for the workers and a minimum/maximum pool size. This obviates the need for having to configure the number of worker replicas manually. diff --git a/content/en/blog/_posts/2018-04-11-migrating-the-kubernetes-blog.md b/content/en/blog/_posts/2018-04-11-migrating-the-kubernetes-blog.md index a6f8dd46eb..00cc541d25 100644 --- a/content/en/blog/_posts/2018-04-11-migrating-the-kubernetes-blog.md +++ b/content/en/blog/_posts/2018-04-11-migrating-the-kubernetes-blog.md @@ -30,7 +30,7 @@ You can submit a blog post for consideration one of two ways: If you have a post that you want to remain confidential until your publish date, please submit your post via the Google form. Otherwise, you can choose your submission process based on your comfort level and preferred workflow. {{< note >}} -**Note:** Our workflow hasn't changed for confidential advance drafts. Additionally, we'll coordinate publishing for time sensitive posts to ensure that information isn't released prematurely through an open pull request. +Our workflow hasn't changed for confidential advance drafts. Additionally, we'll coordinate publishing for time sensitive posts to ensure that information isn't released prematurely through an open pull request. {{< /note >}} ### Call for reviewers diff --git a/content/en/docs/concepts/architecture/cloud-controller.md b/content/en/docs/concepts/architecture/cloud-controller.md index 191b954645..714cfe365c 100644 --- a/content/en/docs/concepts/architecture/cloud-controller.md +++ b/content/en/docs/concepts/architecture/cloud-controller.md @@ -51,7 +51,7 @@ In version 1.9, the CCM runs the following controllers from the preceding list: Additionally, it runs another controller called the PersistentVolumeLabels controller. This controller is responsible for setting the zone and region labels on PersistentVolumes created in GCP and AWS clouds. {{< note >}} -**Note:** Volume controller was deliberately chosen to not be a part of CCM. Due to the complexity involved and due to the existing efforts to abstract away vendor specific volume logic, it was decided that volume controller will not be moved to CCM. +Volume controller was deliberately chosen to not be a part of CCM. Due to the complexity involved and due to the existing efforts to abstract away vendor specific volume logic, it was decided that volume controller will not be moved to CCM. {{< /note >}} The original plan to support volumes using CCM was to use Flex volumes to support pluggable volumes. However, a competing effort known as CSI is being planned to replace Flex. diff --git a/content/en/docs/concepts/architecture/nodes.md b/content/en/docs/concepts/architecture/nodes.md index 4f81dd9165..5a4d84dc17 100644 --- a/content/en/docs/concepts/architecture/nodes.md +++ b/content/en/docs/concepts/architecture/nodes.md @@ -84,7 +84,7 @@ A Pod that does not have any tolerations gets scheduled according to the old mod tolerates the taints of a particular Node can be scheduled on that Node. {{< caution >}} -**Caution:** Enabling this feature creates a small delay between the +Enabling this feature creates a small delay between the time when a condition is observed and when a taint is created. This delay is usually less than one second, but it can increase the number of Pods that are successfully scheduled but rejected by the kubelet. {{< /caution >}} @@ -128,7 +128,7 @@ services are running -- it is eligible to run a pod. Otherwise, it is ignored for any cluster activity until it becomes valid. {{< note >}} -**Note:** Kubernetes keeps the object for the invalid node and keeps checking to see whether it becomes valid. +Kubernetes keeps the object for the invalid node and keeps checking to see whether it becomes valid. You must explicitly delete the Node object to stop this process. {{< /note >}} @@ -241,7 +241,7 @@ kubectl cordon $NODENAME ``` {{< note >}} -**Note:** Pods created by a DaemonSet controller bypass the Kubernetes scheduler +Pods created by a DaemonSet controller bypass the Kubernetes scheduler and do not respect the unschedulable attribute on a node. This assumes that daemons belong on the machine even if it is being drained of applications while it prepares for a reboot. {{< /note >}} diff --git a/content/en/docs/concepts/cluster-administration/logging.md b/content/en/docs/concepts/cluster-administration/logging.md index f64e0e0aa3..d6aa8c45de 100644 --- a/content/en/docs/concepts/cluster-administration/logging.md +++ b/content/en/docs/concepts/cluster-administration/logging.md @@ -57,7 +57,9 @@ You can use `kubectl logs` to retrieve logs from a previous instantiation of a c Everything a containerized application writes to `stdout` and `stderr` is handled and redirected somewhere by a container engine. For example, the Docker container engine redirects those two streams to [a logging driver](https://docs.docker.com/engine/admin/logging/overview), which is configured in Kubernetes to write to a file in json format. -**Note:** The Docker json logging driver treats each line as a separate message. When using the Docker logging driver, there is no direct support for multi-line messages. You need to handle multi-line messages at the logging agent level or higher. +{{< note >}} +The Docker json logging driver treats each line as a separate message. When using the Docker logging driver, there is no direct support for multi-line messages. You need to handle multi-line messages at the logging agent level or higher. +{{< /note >}} By default, if a container restarts, the kubelet keeps one terminated container with its logs. If a pod is evicted from the node, all corresponding containers are also evicted, along with their logs. @@ -81,13 +83,15 @@ When you run [`kubectl logs`](/docs/reference/generated/kubectl/kubectl-commands the basic logging example, the kubelet on the node handles the request and reads directly from the log file, returning the contents in the response. -**Note:** Currently, if some external system has performed the rotation, +{{< note >}} +Currently, if some external system has performed the rotation, only the contents of the latest log file will be available through `kubectl logs`. E.g. if there's a 10MB file, `logrotate` performs the rotation and there are two files, one 10MB in size and one empty, `kubectl logs` will return an empty response. [cosConfigureHelper]: https://github.com/kubernetes/kubernetes/blob/{{< param "githubbranch" >}}/cluster/gce/gci/configure-helper.sh +{{< /note >}} ### System component logs @@ -215,10 +219,12 @@ If the node-level logging agent is not flexible enough for your situation, you can create a sidecar container with a separate logging agent that you have configured specifically to run with your application. -**Note**: Using a logging agent in a sidecar container can lead +{{< note >}} +Using a logging agent in a sidecar container can lead to significant resource consumption. Moreover, you won't be able to access those logs using `kubectl logs` command, because they are not controlled by the kubelet. +{{< /note >}} As an example, you could use [Stackdriver](/docs/tasks/debug-application-cluster/logging-stackdriver/), which uses fluentd as a logging agent. Here are two configuration files that @@ -227,9 +233,11 @@ a [ConfigMap](/docs/tasks/configure-pod-container/configure-pod-configmap/) to c {{< codenew file="admin/logging/fluentd-sidecar-config.yaml" >}} -**Note**: The configuration of fluentd is beyond the scope of this article. For +{{< note >}} +The configuration of fluentd is beyond the scope of this article. For information about configuring fluentd, see the [official fluentd documentation](http://docs.fluentd.org/). +{{< /note >}} The second file describes a pod that has a sidecar container running fluentd. The pod mounts a volume where fluentd can pick up its configuration data. diff --git a/content/en/docs/concepts/cluster-administration/manage-deployment.md b/content/en/docs/concepts/cluster-administration/manage-deployment.md index e32fe5b8fb..0288c73efa 100644 --- a/content/en/docs/concepts/cluster-administration/manage-deployment.md +++ b/content/en/docs/concepts/cluster-administration/manage-deployment.md @@ -331,7 +331,7 @@ Currently, resources are created without this annotation, so the first invocatio All subsequent calls to `kubectl apply`, and other commands that modify the configuration, such as `kubectl replace` and `kubectl edit`, will update the annotation, allowing subsequent calls to `kubectl apply` to detect and perform deletions using a three-way diff. {{< note >}} -**Note:** To use apply, always create resource initially with either `kubectl apply` or `kubectl create --save-config`. +To use apply, always create resource initially with either `kubectl apply` or `kubectl create --save-config`. {{< /note >}} ### kubectl edit diff --git a/content/en/docs/concepts/configuration/assign-pod-node.md b/content/en/docs/concepts/configuration/assign-pod-node.md index d1d9cffc53..5a0f861654 100644 --- a/content/en/docs/concepts/configuration/assign-pod-node.md +++ b/content/en/docs/concepts/configuration/assign-pod-node.md @@ -87,7 +87,7 @@ with a standard set of labels. As of Kubernetes v1.4 these labels are * `beta.kubernetes.io/arch` {{< note >}} -**Note:** The value of these labels is cloud provider specific and is not guaranteed to be reliable. +The value of these labels is cloud provider specific and is not guaranteed to be reliable. For example, the value of `kubernetes.io/hostname` may be the same as the Node name in some environments and a different value in other environments. {{< /note >}} @@ -173,11 +173,15 @@ like node, rack, cloud provider zone, cloud provider region, etc. You express it key for the node label that the system uses to denote such a topology domain, e.g. see the label keys listed above in the section [Interlude: built-in node labels](#interlude-built-in-node-labels). -**Note:** Inter-pod affinity and anti-affinity require substantial amount of +{{< note >}} +Inter-pod affinity and anti-affinity require substantial amount of processing which can slow down scheduling in large clusters significantly. We do not recommend using them in clusters larger than several hundred nodes. +{{< /note >}} -**Note:** Pod anti-affinity requires nodes to be consistently labelled, i.e. every node in the cluster must have an appropriate label matching `topologyKey`. If some or all nodes are missing the specified `topologyKey` label, it can lead to unintended behavior. +{{< note >}} +Pod anti-affinity requires nodes to be consistently labelled, i.e. every node in the cluster must have an appropriate label matching `topologyKey`. If some or all nodes are missing the specified `topologyKey` label, it can lead to unintended behavior. +{{< /note >}} As with node affinity, there are currently two types of pod affinity and anti-affinity, called `requiredDuringSchedulingIgnoredDuringExecution` and `preferredDuringSchedulingIgnoredDuringExecution` which denote "hard" vs. "soft" requirements. diff --git a/content/en/docs/concepts/configuration/manage-compute-resources-container.md b/content/en/docs/concepts/configuration/manage-compute-resources-container.md index 86c2faa1fe..b05b2e508d 100644 --- a/content/en/docs/concepts/configuration/manage-compute-resources-container.md +++ b/content/en/docs/concepts/configuration/manage-compute-resources-container.md @@ -149,7 +149,9 @@ When using Docker: multiplied by 100. The resulting value is the total amount of CPU time that a container can use every 100ms. A container cannot use more than its share of CPU time during this interval. - {{< note >}}**Note**: The default quota period is 100ms. The minimum resolution of CPU quota is 1ms.{{}} + {{< note >}} + The default quota period is 100ms. The minimum resolution of CPU quota is 1ms. + {{}} - The `spec.containers[].resources.limits.memory` is converted to an integer, and used as the value of the @@ -317,7 +319,7 @@ Kubernetes version 1.8 introduces a new resource, _ephemeral-storage_ for managi This partition is 鈥渆phemeral鈥 and applications cannot expect any performance SLAs (Disk IOPS for example) from this partition. Local ephemeral storage management only applies for the root partition; the optional partition for image layer and writable layer is out of scope. {{< note >}} -**Note:** If an optional runtime partition is used, root partition will not hold any image layer or writable layers. +If an optional runtime partition is used, root partition will not hold any image layer or writable layers. {{< /note >}} ### Requests and limits setting for local ephemeral storage @@ -420,7 +422,7 @@ http://k8s-master:8080/api/v1/nodes/k8s-node-1/status ``` {{< note >}} -**Note**: In the preceding request, `~1` is the encoding for the character `/` +In the preceding request, `~1` is the encoding for the character `/` in the patch path. The operation path value in JSON-Patch is interpreted as a JSON-Pointer. For more details, see [IETF RFC 6901, section 3](https://tools.ietf.org/html/rfc6901#section-3). @@ -476,7 +478,7 @@ Examples of _valid_ quantities are `3`, `3000m` and `3Ki`. Examples of _invalid_ quantities are `0.5` and `1500m`. {{< note >}} -**Note:** Extended resources replace Opaque Integer Resources. +Extended resources replace Opaque Integer Resources. Users can use any domain name prefix other than `kubernetes.io` which is reserved. {{< /note >}} @@ -484,7 +486,7 @@ To consume an extended resource in a Pod, include the resource name as a key in the `spec.containers[].resources.limits` map in the container spec. {{< note >}} -**Note:** Extended resources cannot be overcommitted, so request and limit +Extended resources cannot be overcommitted, so request and limit must be equal if both are present in a container spec. {{< /note >}} diff --git a/content/en/docs/concepts/configuration/organize-cluster-access-kubeconfig.md b/content/en/docs/concepts/configuration/organize-cluster-access-kubeconfig.md index d48b600bef..8a77e153df 100644 --- a/content/en/docs/concepts/configuration/organize-cluster-access-kubeconfig.md +++ b/content/en/docs/concepts/configuration/organize-cluster-access-kubeconfig.md @@ -12,7 +12,7 @@ find the information it needs to choose a cluster and communicate with the API s of a cluster. {{< note >}} -**Note:** A file that is used to configure access to clusters is called +A file that is used to configure access to clusters is called a *kubeconfig file*. This is a generic way of referring to configuration files. It does not mean that there is a file named `kubeconfig`. {{< /note >}} diff --git a/content/en/docs/concepts/configuration/overview.md b/content/en/docs/concepts/configuration/overview.md index 932e0a93eb..b7d74b4abe 100644 --- a/content/en/docs/concepts/configuration/overview.md +++ b/content/en/docs/concepts/configuration/overview.md @@ -84,15 +84,15 @@ The [imagePullPolicy](/docs/concepts/containers/images/#updating-images) and the - `imagePullPolicy: Never`: the image is assumed to exist locally. No attempt is made to pull the image. {{< note >}} - **Note:** To make sure the container always uses the same version of the image, you can specify its [digest](https://docs.docker.com/engine/reference/commandline/pull/#pull-an-image-by-digest-immutable-identifier), for example `sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2`. The digest uniquely identifies a specific version of the image, so it is never updated by Kubernetes unless you change the digest value. +To make sure the container always uses the same version of the image, you can specify its [digest](https://docs.docker.com/engine/reference/commandline/pull/#pull-an-image-by-digest-immutable-identifier), for example `sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2`. The digest uniquely identifies a specific version of the image, so it is never updated by Kubernetes unless you change the digest value. {{< /note >}} {{< note >}} - **Note:** You should avoid using the `:latest` tag when deploying containers in production as it is harder to track which version of the image is running and more difficult to roll back properly. +You should avoid using the `:latest` tag when deploying containers in production as it is harder to track which version of the image is running and more difficult to roll back properly. {{< /note >}} {{< note >}} - **Note:** The caching semantics of the underlying image provider make even `imagePullPolicy: Always` efficient. With Docker, for example, if the image already exists, the pull attempt is fast because all image layers are cached and no image download is needed. +The caching semantics of the underlying image provider make even `imagePullPolicy: Always` efficient. With Docker, for example, if the image already exists, the pull attempt is fast because all image layers are cached and no image download is needed. {{< /note >}} ## Using kubectl diff --git a/content/en/docs/concepts/configuration/pod-priority-preemption.md b/content/en/docs/concepts/configuration/pod-priority-preemption.md index 6349a0b56a..c9b2ff7c6d 100644 --- a/content/en/docs/concepts/configuration/pod-priority-preemption.md +++ b/content/en/docs/concepts/configuration/pod-priority-preemption.md @@ -36,7 +36,7 @@ Kubernetes Version | Priority and Preemption State | Enabled by default 1.10 | alpha | no 1.11 | beta | yes -{{< warning >}} **Warning**: In a cluster where not all users are trusted, a +{{< warning >}}In a cluster where not all users are trusted, a malicious user could create pods at the highest possible priorities, causing other pods to be evicted/not get scheduled. To resolve this issue, [ResourceQuota](https://kubernetes.io/docs/concepts/policy/resource-quotas/) is @@ -71,24 +71,13 @@ Pods. ## How to disable preemption -{{< note >}} **Note**: In Kubernetes 1.11, critical pods (except DaemonSet pods, -which are still scheduled by the DaemonSet controller) rely on scheduler -preemption to be scheduled when a cluster is under resource pressure. For this -reason, you will need to run an older version of Rescheduler if you decide to -disable preemption. More on this is provided below. {{< /note >}} - -#### Option 1: Disable both Pod priority and preemption - -Disabling Pod priority disables preemption as well. In order to disable Pod -Priority, set the feature to false for API server, Scheduler, and Kubelet. -Disabling the feature on Kubelets is not vital. You can leave the feature on for -Kubelets if rolling out is hard. - -``` ---feature-gates=PodPriority=false -``` - -#### Option 2: Disable Preemption only +{{< note >}} +In Kubernetes 1.11, critical pods (except DaemonSet pods, which are +still scheduled by the DaemonSet controller) rely on scheduler preemption to be +scheduled when a cluster is under resource pressure. For this reason, you will +need to run an older version of Rescheduler if you decide to disable preemption. +More on this is provided below. +{{< /note >}} In Kubernetes 1.11 and later, preemption is controlled by a kube-scheduler flag `disablePreemption`, which is set to `false` by default. @@ -266,11 +255,13 @@ A Node is considered for preemption only when the answer to this question is yes: "If all the Pods with lower priority than the pending Pod are removed from the Node, can the pending Pod be scheduled on the Node?" -{{< note >}} **Note:** Preemption does not necessarily remove all lower-priority +{{< note >}} +Preemption does not necessarily remove all lower-priority Pods. If the pending Pod can be scheduled by removing fewer than all lower-priority Pods, then only a portion of the lower-priority Pods are removed. Even so, the answer to the preceding question must be yes. If the answer is no, -the Node is not considered for preemption. {{< /note >}} +the Node is not considered for preemption. +{{< /note >}} If a pending Pod has inter-pod affinity to one or more of the lower-priority Pods on the Node, the inter-Pod affinity rule cannot be satisfied in the absence diff --git a/content/en/docs/concepts/configuration/scheduler-perf-tuning.md b/content/en/docs/concepts/configuration/scheduler-perf-tuning.md index f0dcfa47ed..41ce9dfb1a 100644 --- a/content/en/docs/concepts/configuration/scheduler-perf-tuning.md +++ b/content/en/docs/concepts/configuration/scheduler-perf-tuning.md @@ -45,9 +45,11 @@ algorithmSource: percentageOfNodesToScore: 50 ``` -{{< note >}} **Note**: In clusters with zero or less than 50 feasible nodes, the +{{< note >}} +In clusters with zero or less than 50 feasible nodes, the scheduler still checks all the nodes, simply because there are not enough -feasible nodes to stop the scheduler's search early. {{< /note >}} +feasible nodes to stop the scheduler's search early. +{{< /note >}} **To disable this feature**, you can set `percentageOfNodesToScore` to 100. diff --git a/content/en/docs/concepts/configuration/secret.md b/content/en/docs/concepts/configuration/secret.md index b98137b871..c7ebe895c1 100644 --- a/content/en/docs/concepts/configuration/secret.md +++ b/content/en/docs/concepts/configuration/secret.md @@ -353,7 +353,7 @@ propagation delay, where cache propagation delay depends on the chosen cache typ (it equals to watch propagation delay, ttl of cache, or zero corespondingly). {{< note >}} -**Note:** A container using a Secret as a +A container using a Secret as a [subPath](/docs/concepts/storage/volumes#using-subpath) volume mount will not receive Secret updates. {{< /note >}} @@ -492,7 +492,7 @@ $ kubectl create secret generic ssh-key-secret --from-file=ssh-privatekey=/path/ ``` {{< caution >}} -**Caution:** Think carefully before sending your own ssh keys: other users of the cluster may have access to the secret. Use a service account which you want to be accessible to all the users with whom you share the Kubernetes cluster, and can revoke if they are compromised. +Think carefully before sending your own ssh keys: other users of the cluster may have access to the secret. Use a service account which you want to be accessible to all the users with whom you share the Kubernetes cluster, and can revoke if they are compromised. {{< /caution >}} @@ -544,7 +544,7 @@ $ kubectl create secret generic test-db-secret --from-literal=username=testuser secret "test-db-secret" created ``` {{< note >}} -**Note:** Special characters such as `$`, `\*`, and `!` require escaping. +Special characters such as `$`, `\*`, and `!` require escaping. If the password you are using has special characters, you need to escape them using the `\\` character. For example, if your actual password is `S!B\*d$zDsb`, you should execute the command this way: kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password=S\\!B\\\*d\\$zDsb @@ -665,7 +665,7 @@ the `dotfile-test-container` will have this file present at the path `/etc/secret-volume/.secret-file`. {{< note >}} -**Note**: Files beginning with dot characters are hidden from the output of `ls -l`; +Files beginning with dot characters are hidden from the output of `ls -l`; you must use `ls -la` to see them when listing directory contents. {{< /note >}} @@ -774,7 +774,7 @@ Pod level](#use-case-secret-visible-to-one-container-in-a-pod). single node. {{< note >}} -**Note:** As of 1.7 [encryption of secret data at rest is supported](/docs/tasks/administer-cluster/encrypt-data/). +As of 1.7 [encryption of secret data at rest is supported](/docs/tasks/administer-cluster/encrypt-data/). {{< /note >}} {{% capture whatsnext %}} diff --git a/content/en/docs/concepts/configuration/taint-and-toleration.md b/content/en/docs/concepts/configuration/taint-and-toleration.md index bb41dca5f0..074cd82c02 100644 --- a/content/en/docs/concepts/configuration/taint-and-toleration.md +++ b/content/en/docs/concepts/configuration/taint-and-toleration.md @@ -69,7 +69,7 @@ A toleration "matches" a taint if the keys are the same and the effects are the `Operator` defaults to `Equal` if not specified. {{< note >}} -**Note:** There are two special cases: +There are two special cases: * An empty `key` with operator `Exists` matches all keys, values and effects which means this will tolerate everything. @@ -230,7 +230,7 @@ added by the NodeController (or kubelet) and the normal logic for evicting pods based on the Ready NodeCondition is disabled. {{< note >}} -**Note:** To maintain the existing [rate limiting](/docs/concepts/architecture/nodes/) +To maintain the existing [rate limiting](/docs/concepts/architecture/nodes/) behavior of pod evictions due to node problems, the system actually adds the taints in a rate-limited way. This prevents massive pod evictions in scenarios such as the master becoming partitioned from the nodes. diff --git a/content/en/docs/concepts/containers/images.md b/content/en/docs/concepts/containers/images.md index c35aad845b..ed590b50d3 100644 --- a/content/en/docs/concepts/containers/images.md +++ b/content/en/docs/concepts/containers/images.md @@ -44,7 +44,7 @@ https://cs.k8s.io/?q=docker%20manifest%20(create%7Cpush%7Cannotate)&i=nope&files These commands rely on and are implemented purely on the Docker CLI. You will need to either edit the `$HOME/.docker/config.json` and set `experimental` key to `enabled` or you can just set `DOCKER_CLI_EXPERIMENTAL` environment variable to `enabled` when you call the CLI commands. {{< note >}} -**Note:** Please use Docker *18.06 or above*, versions below that either have bugs or do not support the experimental command line option. Example https://github.com/docker/cli/issues/1135 causes problems under containerd. +Please use Docker *18.06 or above*, versions below that either have bugs or do not support the experimental command line option. Example https://github.com/docker/cli/issues/1135 causes problems under containerd. {{< /note >}} If you run into trouble with uploading stale manifests, just clean up the older manifests in `$HOME/.docker/manifests` to start fresh. @@ -156,16 +156,16 @@ You can use the IBM Cloud Container Registry to deploy containers from [IBM Clou ### Configuring Nodes to Authenticate to a Private Registry {{< note >}} -**Note:** If you are running on Google Kubernetes Engine, there will already be a `.dockercfg` on each node with credentials for Google Container Registry. You cannot use this approach. +If you are running on Google Kubernetes Engine, there will already be a `.dockercfg` on each node with credentials for Google Container Registry. You cannot use this approach. {{< /note >}} {{< note >}} -**Note:** If you are running on AWS EC2 and are using the EC2 Container Registry (ECR), the kubelet on each node will +If you are running on AWS EC2 and are using the EC2 Container Registry (ECR), the kubelet on each node will manage and update the ECR login credentials. You cannot use this approach. {{< /note >}} {{< note >}} -**Note:** This approach is suitable if you can control node configuration. It +This approach is suitable if you can control node configuration. It will not work reliably on GCE, and any other cloud provider that does automatic node replacement. {{< /note >}} @@ -183,7 +183,7 @@ in the search paths list below, kubelet uses it as the credential provider when * `/.dockercfg` {{< note >}} -**Note**: You may have to set `HOME=/root` explicitly in your environment file for kubelet. +You may have to set `HOME=/root` explicitly in your environment file for kubelet. {{< /note >}} Here are the recommended steps to configuring your nodes to use a private registry. In this @@ -240,11 +240,11 @@ registry keys are added to the `.docker/config.json`. ### Pre-pulling Images {{< note >}} -**Note:** If you are running on Google Kubernetes Engine, there will already be a `.dockercfg` on each node with credentials for Google Container Registry. You cannot use this approach. +If you are running on Google Kubernetes Engine, there will already be a `.dockercfg` on each node with credentials for Google Container Registry. You cannot use this approach. {{< /note >}} {{< note >}} -**Note:** This approach is suitable if you can control node configuration. It +This approach is suitable if you can control node configuration. It will not work reliably on GCE, and any other cloud provider that does automatic node replacement. {{< /note >}} @@ -263,7 +263,7 @@ All pods will have read access to any pre-pulled images. ### Specifying ImagePullSecrets on a Pod {{< note >}} -**Note:** This approach is currently the recommended approach for Google Kubernetes Engine, GCE, and any cloud-providers +This approach is currently the recommended approach for Google Kubernetes Engine, GCE, and any cloud-providers where node creation is automated. {{< /note >}} diff --git a/content/en/docs/concepts/containers/runtime-class.md b/content/en/docs/concepts/containers/runtime-class.md index 7d0484c256..861ce41d9e 100644 --- a/content/en/docs/concepts/containers/runtime-class.md +++ b/content/en/docs/concepts/containers/runtime-class.md @@ -57,7 +57,7 @@ corresponding documentation for your CRI implementation for how to configure. As feature, not all CRIs support multiple RuntimeClasses yet. {{< note >}} -**Note:** RuntimeClass currently assumes a homogeneous node configuration across the cluster +RuntimeClass currently assumes a homogeneous node configuration across the cluster (which means that all nodes are configured the same way with respect to container runtimes). Any heterogeneity (varying configurations) must be managed independently of RuntimeClass through scheduling features (see [Assigning Pods to Nodes](/docs/concepts/configuration/assign-pod-node/)). @@ -87,11 +87,9 @@ spec: {{< note >}} - -**Note:** It is recommended that RuntimeClass write operations (create/update/patch/delete) be +It is recommended that RuntimeClass write operations (create/update/patch/delete) be restricted to the cluster administrator. This is typically the default. See [Authorization Overview](https://kubernetes.io/docs/reference/access-authn-authz/authorization/) for more details. - {{< /note >}} ### Usage diff --git a/content/en/docs/concepts/example-concept-template.md b/content/en/docs/concepts/example-concept-template.md index 6bbd6a080b..26ce263ef4 100644 --- a/content/en/docs/concepts/example-concept-template.md +++ b/content/en/docs/concepts/example-concept-template.md @@ -8,7 +8,9 @@ toc_hide: true {{% capture overview %}} -**NOTE:** Be sure to also [create an entry in the table of contents](/docs/home/contribute/write-new-topic/#creating-an-entry-in-the-table-of-contents) for your new document. +{{< note >}} +Be sure to also [create an entry in the table of contents](/docs/home/contribute/write-new-topic/#creating-an-entry-in-the-table-of-contents) for your new document. +{{< /note >}} This page explains ... diff --git a/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md b/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md index 64a7bc5416..750f19361e 100644 --- a/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md +++ b/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md @@ -91,7 +91,7 @@ Use a ConfigMap if any of the following apply: * You want to perform rolling updates via Deployment, etc, when the file is updated. {{< note >}} -**Note:** Use a [secret](/docs/concepts/configuration/secret/) for sensitive data, which is similar to a configMap but more secure. +Use a [secret](/docs/concepts/configuration/secret/) for sensitive data, which is similar to a configMap but more secure. {{< /note >}} Use a custom resource (CRD or Aggregated API) if most of the following apply: @@ -131,7 +131,7 @@ for a demonstration of how to register a new custom resource, work with instance and setup a controller to handle events. {{< note >}} -**Note:** CRD is the successor to the deprecated *ThirdPartyResource* (TPR) API, and is available as of Kubernetes 1.7. +CRD is the successor to the deprecated *ThirdPartyResource* (TPR) API, and is available as of Kubernetes 1.7. {{< /note >}} ## API server aggregation diff --git a/content/en/docs/concepts/overview/object-management-kubectl/declarative-config.md b/content/en/docs/concepts/overview/object-management-kubectl/declarative-config.md index f0c63b64bd..48025a12e1 100644 --- a/content/en/docs/concepts/overview/object-management-kubectl/declarative-config.md +++ b/content/en/docs/concepts/overview/object-management-kubectl/declarative-config.md @@ -60,7 +60,7 @@ annotation on each object. The annotation contains the contents of the object configuration file that was used to create the object. {{< note >}} -**Note:** Add the `-R` flag to recursively process directories. +Add the `-R` flag to recursively process directories. {{< /note >}} Here's an example of an object configuration file: @@ -134,7 +134,7 @@ kubectl apply -f / ``` {{< note >}} -**Note:** Add the `-R` flag to recursively process directories. +Add the `-R` flag to recursively process directories. {{< /note >}} Here's an example configuration file: @@ -148,7 +148,7 @@ kubectl apply -f https://k8s.io/examples/application/simple_deployment.yaml ``` {{< note >}} -**Note:** For purposes of illustration, the preceding command refers to a single +For purposes of illustration, the preceding command refers to a single configuration file instead of a directory. {{< /note >}} @@ -322,7 +322,7 @@ spec: ``` {{< warning >}} -**Warning:** Mixing `kubectl apply` with the imperative object configuration commands +Mixing `kubectl apply` with the imperative object configuration commands `create` and `replace` is not supported. This is because `create` and `replace` do not retain the `kubectl.kubernetes.io/last-applied-configuration` that `kubectl apply` uses to compute updates. @@ -347,12 +347,12 @@ kubectl delete -f Only use this if you know what you are doing. {{< warning >}} -**Warning:** `kubectl apply --prune` is in alpha, and backwards incompatible +`kubectl apply --prune` is in alpha, and backwards incompatible changes might be introduced in subsequent releases. {{< /warning >}} {{< warning >}} -**Warning:** You must be careful when using this command, so that you +You must be careful when using this command, so that you do not delete objects unintentionally. {{< /warning >}} @@ -373,7 +373,7 @@ kubectl apply -f --prune -l ``` {{< warning >}} -**Warning:** Apply with prune should only be run against the root directory +Apply with prune should only be run against the root directory containing the object configuration files. Running against sub-directories can cause objects to be unintentionally deleted if they are returned by the label selector query specified with `-l ` and @@ -391,10 +391,9 @@ kubectl get -f -o yaml ## How apply calculates differences and merges changes {{< caution >}} -**Caution:** A *patch* is an update operation that is scoped to specific -fields of an object instead of the entire object. -This enables updating only a specific set of fields on an object without -reading the object first. +A *patch* is an update operation that is scoped to specific fields of an object +instead of the entire object. This enables updating only a specific set of fields +on an object without reading the object first. {{< /caution >}} When `kubectl apply` updates the live configuration for an object, @@ -546,7 +545,7 @@ and merged. Primitive fields are replaced or cleared. {{< note >}} -**Note:** '-' is used for "not applicable" because the value is not used. +`-` is used for "not applicable" because the value is not used. {{< /note >}} | Field in object configuration file | Field in live object configuration | Field in last-applied-configuration | Action | @@ -561,7 +560,7 @@ Primitive fields are replaced or cleared. Fields that represent maps are merged by comparing each of the subfields or elements of the map: {{< note >}} -**Note:** '-' is used for "not applicable" because the value is not used. +`-` is used for "not applicable" because the value is not used. {{< /note >}} | Key in object configuration file | Key in live object configuration | Field in last-applied-configuration | Action | @@ -689,7 +688,7 @@ by `name`. As of Kubernetes 1.5, merging lists of primitive elements is not supported. {{< note >}} -**Note:** Which of the above strategies is chosen for a given field is controlled by +Which of the above strategies is chosen for a given field is controlled by the `patchStrategy` tag in [types.go](https://git.k8s.io/api/core/v1/types.go#L2565) If no `patchStrategy` is specified for a field of type list, then the list is replaced. @@ -900,7 +899,7 @@ Kubernetes objects should be managed using only one method at a time. Switching from one method to another is possible, but is a manual process. {{< note >}} -**Note:** It is OK to use imperative deletion with declarative management. +It is OK to use imperative deletion with declarative management. {{< /note >}} {{< comment >}} @@ -924,8 +923,10 @@ configuration involves several manual steps: 1. Manually remove the `status` field from the configuration file. - {{< note >}}**Note:** This step is optional, as `kubectl apply` does not update the status field - even if it is present in the configuration file.{{< /note >}} + {{< note >}} + This step is optional, as `kubectl apply` does not update the status field + even if it is present in the configuration file. + {{< /note >}} 1. Set the `kubectl.kubernetes.io/last-applied-configuration` annotation on the object: @@ -952,7 +953,7 @@ TODO(pwittrock): Why doesn't export remove the status field? Seems like it shou ## Defining controller selectors and PodTemplate labels {{< warning >}} -**Warning:** Updating selectors on controllers is strongly discouraged. +Updating selectors on controllers is strongly discouraged. {{< /warning >}} The recommended approach is to define a single, immutable PodTemplate label diff --git a/content/en/docs/concepts/overview/object-management-kubectl/imperative-command.md b/content/en/docs/concepts/overview/object-management-kubectl/imperative-command.md index 583bb03f52..d0cbe8c839 100644 --- a/content/en/docs/concepts/overview/object-management-kubectl/imperative-command.md +++ b/content/en/docs/concepts/overview/object-management-kubectl/imperative-command.md @@ -76,8 +76,7 @@ Setting this aspect may set different fields for different object types: - `set` : Set an aspect of an object. {{< note >}} -**Note**: In Kubernetes version 1.5, not every verb-driven command has an -associated aspect-driven command. +In Kubernetes version 1.5, not every verb-driven command has an associated aspect-driven command. {{< /note >}} The `kubectl` tool supports these additional ways to update a live object directly, @@ -95,7 +94,7 @@ You can use the `delete` command to delete an object from a cluster: - `delete /` {{< note >}} -**Note**: You can use `kubectl delete` for both imperative commands and imperative object +You can use `kubectl delete` for both imperative commands and imperative object configuration. The difference is in the arguments passed to the command. To use `kubectl delete` as an imperative command, pass the object to be deleted as an argument. Here's an example that passes a Deployment object named nginx: diff --git a/content/en/docs/concepts/overview/object-management-kubectl/imperative-config.md b/content/en/docs/concepts/overview/object-management-kubectl/imperative-config.md index f0681fd9b6..45dca86b50 100644 --- a/content/en/docs/concepts/overview/object-management-kubectl/imperative-config.md +++ b/content/en/docs/concepts/overview/object-management-kubectl/imperative-config.md @@ -34,7 +34,7 @@ for details. ## How to update objects {{< warning >}} -**Warning:** Updating objects with the `replace` command drops all +Updating objects with the `replace` command drops all parts of the spec not specified in the configuration file. This should not be used with objects whose specs are partially managed by the cluster, such as Services of type `LoadBalancer`, where @@ -115,7 +115,7 @@ kubectl replace -f _.yaml ## Defining controller selectors and PodTemplate labels {{< warning >}} -**Warning:** Updating selectors on controllers is strongly discouraged. +Updating selectors on controllers is strongly discouraged. {{< /warning >}} The recommended approach is to define a single, immutable PodTemplate label diff --git a/content/en/docs/concepts/overview/object-management-kubectl/overview.md b/content/en/docs/concepts/overview/object-management-kubectl/overview.md index fe2baf4a5d..19c8a885f2 100644 --- a/content/en/docs/concepts/overview/object-management-kubectl/overview.md +++ b/content/en/docs/concepts/overview/object-management-kubectl/overview.md @@ -15,7 +15,7 @@ approaches. ## Management techniques {{< warning >}} -**Warning:** A Kubernetes object should be managed using only one technique. Mixing +A Kubernetes object should be managed using only one technique. Mixing and matching techniques for the same object results in undefined behavior. {{< /warning >}} @@ -74,7 +74,7 @@ See the [API reference](/docs/reference/generated/kubernetes-api/{{< param "vers for more details on object definitions. {{< warning >}} -**Warning:** The imperative `replace` command replaces the existing +The imperative `replace` command replaces the existing spec with the newly provided one, dropping all changes to the object missing from the configuration file. This approach should not be used with resource types whose specs are updated independently of the configuration file. @@ -135,7 +135,7 @@ are automatically detected per-object by `kubectl`. This enables working on directories, where different operations might be needed for different objects. {{< note >}} -**Note:** Declarative object configuration retains changes made by other +Declarative object configuration retains changes made by other writers, even if the changes are not merged back to the object configuration file. This is possible by using the `patch` API operation to write only observed differences, instead of using the `replace` diff --git a/content/en/docs/concepts/overview/working-with-objects/common-labels.md b/content/en/docs/concepts/overview/working-with-objects/common-labels.md index 314bbc7bb0..d0132d92b9 100644 --- a/content/en/docs/concepts/overview/working-with-objects/common-labels.md +++ b/content/en/docs/concepts/overview/working-with-objects/common-labels.md @@ -19,7 +19,7 @@ Instead, applications are informal and described with metadata. The definition o what an application contains is loose. {{< note >}} -**Note:** These are recommended labels. They make it easier to manage applications +These are recommended labels. They make it easier to manage applications but aren't required for any core tooling. {{< /note >}} diff --git a/content/en/docs/concepts/overview/working-with-objects/labels.md b/content/en/docs/concepts/overview/working-with-objects/labels.md index 65b6430ed2..46535ab44e 100644 --- a/content/en/docs/concepts/overview/working-with-objects/labels.md +++ b/content/en/docs/concepts/overview/working-with-objects/labels.md @@ -66,7 +66,7 @@ An empty label selector (that is, one with zero requirements) selects every obje A null label selector (which is only possible for optional selector fields) selects no objects. {{< note >}} -**Note**: the label selectors of two controllers must not overlap within a namespace, otherwise they will fight with each other. +The label selectors of two controllers must not overlap within a namespace, otherwise they will fight with each other. {{< /note >}} ### _Equality-based_ requirement diff --git a/content/en/docs/concepts/policy/pod-security-policy.md b/content/en/docs/concepts/policy/pod-security-policy.md index 08cec73817..447d048271 100644 --- a/content/en/docs/concepts/policy/pod-security-policy.md +++ b/content/en/docs/concepts/policy/pod-security-policy.md @@ -230,8 +230,8 @@ Create the rolebinding to grant `fake-user` the `use` verb on the example policy: {{< note >}} -**Note:** _This is not the recommended way! See the [next section](#run-another-pod) -for the preferred approach._ +This is not the recommended way! See the [next section](#run-another-pod) +for the preferred approach. {{< /note >}} ```shell @@ -442,7 +442,7 @@ allowedHostPaths: readOnly: true # only allow read-only mounts ``` -{{< warning >}}**Warning:** There are many ways a container with unrestricted access to the host +{{< warning >}}There are many ways a container with unrestricted access to the host filesystem can escalate privileges, including reading data from other containers, and abusing the credentials of system services, such as Kubelet. diff --git a/content/en/docs/concepts/policy/resource-quotas.md b/content/en/docs/concepts/policy/resource-quotas.md index 087961b418..3374593230 100644 --- a/content/en/docs/concepts/policy/resource-quotas.md +++ b/content/en/docs/concepts/policy/resource-quotas.md @@ -202,7 +202,7 @@ field in the quota spec. A quota is matched and consumed only if `scopeSelector` in the quota spec selects the pod. {{< note >}} -**Note:** You need to enable the feature gate `ResourceQuotaScopeSelectors`before using resource quotas +You need to enable the feature gate `ResourceQuotaScopeSelectors`before using resource quotas per PriorityClass. {{< /note >}} diff --git a/content/en/docs/concepts/services-networking/dns-pod-service.md b/content/en/docs/concepts/services-networking/dns-pod-service.md index 96a62abd48..268519e833 100644 --- a/content/en/docs/concepts/services-networking/dns-pod-service.md +++ b/content/en/docs/concepts/services-networking/dns-pod-service.md @@ -149,7 +149,7 @@ The Endpoints object can specify the `hostname` for any endpoint addresses, along with its IP. {{< note >}} -**Note:** Because A records are not created for Pod names, `hostname` is required for the Pod's A record to be created. A Pod with no `hostname` but with `subdomain` only will only create the A record for the headless service (`default-subdomain.my-namespace.svc.cluster.local`), pointing to the Pod's IP address. +Because A records are not created for Pod names, `hostname` is required for the Pod's A record to be created. A Pod with no `hostname` but with `subdomain` only will only create the A record for the headless service (`default-subdomain.my-namespace.svc.cluster.local`), pointing to the Pod's IP address. {{< /note >}} ### Pod's DNS Policy @@ -176,7 +176,7 @@ following pod-specific DNS policies. These policies are specified in the See [DNS config](#dns-config) subsection below. {{< note >}} -**NOTE:** "Default" is not the default DNS policy. If `dnsPolicy` is not +"Default" is not the default DNS policy. If `dnsPolicy` is not explicitly specified, then 鈥淐lusterFirst鈥 is used. {{< /note >}} diff --git a/content/en/docs/concepts/services-networking/ingress.md b/content/en/docs/concepts/services-networking/ingress.md index 2eb745c867..6aed8a8b8f 100644 --- a/content/en/docs/concepts/services-networking/ingress.md +++ b/content/en/docs/concepts/services-networking/ingress.md @@ -99,7 +99,7 @@ In order for the Ingress resource to work, the cluster must have an Ingress cont * [Istio](https://istio.io/) based ingress controller [Control Ingress Traffic](https://istio.io/docs/tasks/traffic-management/ingress/) {{< note >}} -**Note:** Review the documentation for your controller to find its specific support policy. +Review the documentation for your controller to find its specific support policy. {{< /note >}} ## Before you begin @@ -107,7 +107,7 @@ In order for the Ingress resource to work, the cluster must have an Ingress cont The following document describes a set of cross-platform features exposed through the Ingress resource. Ideally, all Ingress controllers should fulfill this specification, but we're not there yet. We currently support and maintain [GCE](https://git.k8s.io/ingress-gce/README.md) and [nginx](https://git.k8s.io/ingress-nginx/README.md) controllers. If you use the F5 BIG-IP Controller, see [Use the BIG-IP Controller as a Kubernetes Ingress Controller](http://clouddocs.f5.com/containers/latest/kubernetes/kctlr-k8s-ingress-ctlr.html). {{< note >}} -**Note:** Make sure you review your controller's specific docs so you understand the caveats. +Make sure you review your controller's specific docs so you understand the caveats. {{< /note >}} ## Types of Ingress @@ -202,7 +202,7 @@ When it has done so, you will see the address of the loadbalancer at the Address field. {{< note >}} -**Note:** You need to create a default-http-backend [Service](/docs/concepts/services-networking/service/) if necessary. +You need to create a default-http-backend [Service](/docs/concepts/services-networking/service/) if necessary. {{< /note >}} ### Name based virtual hosting diff --git a/content/en/docs/concepts/services-networking/service.md b/content/en/docs/concepts/services-networking/service.md index 9fc2bb79b4..7b747a6a79 100644 --- a/content/en/docs/concepts/services-networking/service.md +++ b/content/en/docs/concepts/services-networking/service.md @@ -87,7 +87,7 @@ Kubernetes `Services` support `TCP`, `UDP` and `SCTP` for protocols. The defaul is `TCP`. {{< note >}} -**Note:** SCTP support is an alpha feature since Kubernetes 1.12 +SCTP support is an alpha feature since Kubernetes 1.12 {{< /note >}} ### Services without selectors @@ -132,7 +132,7 @@ subsets: ``` {{< note >}} -**Note:** The endpoint IPs may not be loopback (127.0.0.0/8), link-local +The endpoint IPs may not be loopback (127.0.0.0/8), link-local (169.254.0.0/16), or link-local multicast (224.0.0.0/24). They cannot be the cluster IPs of other Kubernetes services either because the `kube-proxy` component doesn't support virtual IPs as destination yet. @@ -212,10 +212,12 @@ options for load balancing algorithm, such as: - `sed`: shortest expected delay - `nq`: never queue -**Note:** ipvs mode assumes IPVS kernel modules are installed on the node +{{< note >}} +ipvs mode assumes IPVS kernel modules are installed on the node before running kube-proxy. When kube-proxy starts with ipvs proxy mode, kube-proxy would validate if IPVS modules are installed on the node, if it's not installed kube-proxy will fall back to iptables proxy mode. +{{< /note >}} ![Services overview diagram for ipvs proxy](/images/docs/services-ipvs-overview.svg) @@ -459,7 +461,7 @@ public IP address resource needs to be created first, and it should be in the sa group of the other automatically created resources of the cluster. For example, `MC_myResourceGroup_myAKSCluster_eastus`. Specify the assigned IP address as loadBalancerIP. Ensure that you have updated the securityGroupName in the cloud provider configuration file. For information about troubleshooting `CreatingLoadBalancerFailed` permission issues see, [Use a static IP address with the Azure Kubernetes Service (AKS) load balancer](https://docs.microsoft.com/en-us/azure/aks/static-ip) or [CreatingLoadBalancerFailed on AKS cluster with advanced networking](https://github.com/Azure/AKS/issues/357). {{< note >}} -**Note:** The support of SCTP in the cloud provider's load balancer is up to the cloud provider's +he support of SCTP in the cloud provider's load balancer is up to the cloud provider's load balancer implementation. If SCTP is not supported by the cloud provider's load balancer the Service creation request is accepted but the creation of the load balancer fails. {{< /note >}} @@ -693,7 +695,9 @@ There are other annotations to manage Classic Elastic Load Balancers that are de #### Network Load Balancer support on AWS [alpha] -**Warning:** This is an alpha feature and not recommended for production clusters yet. +{{< warning >}} +This is an alpha feature and not recommended for production clusters yet. +{{< /warning >}} Starting in version 1.9.0, Kubernetes supports Network Load Balancer (NLB). To use a Network Load Balancer on AWS, use the annotation `service.beta.kubernetes.io/aws-load-balancer-type` @@ -747,13 +751,15 @@ spec: - "143.231.0.0/16" ``` -**Note:** NLB only works with certain instance classes, see the [AWS documentation](http://docs.aws.amazon.com/elasticloadbalancing/latest/network/target-group-register-targets.html#register-deregister-targets) +{{< note >}} +NLB only works with certain instance classes, see the [AWS documentation](http://docs.aws.amazon.com/elasticloadbalancing/latest/network/target-group-register-targets.html#register-deregister-targets) for supported instance types. +{{< /note >}} ### Type ExternalName {#externalname} {{< note >}} -**NOTE:** ExternalName Services are available only with `kube-dns` version 1.7 and later. +ExternalName Services are available only with `kube-dns` version 1.7 and later. {{< /note >}} Services of type ExternalName map a service to a DNS name (specified using diff --git a/content/en/docs/concepts/storage/persistent-volumes.md b/content/en/docs/concepts/storage/persistent-volumes.md index 28fc8b4f1a..227097ba04 100644 --- a/content/en/docs/concepts/storage/persistent-volumes.md +++ b/content/en/docs/concepts/storage/persistent-volumes.md @@ -85,7 +85,7 @@ Once a user has a claim and that claim is bound, the bound PV belongs to the use The purpose of the Storage Object in Use Protection feature is to ensure that Persistent Volume Claims (PVCs) in active use by a pod and Persistent Volume (PVs) that are bound to PVCs are not removed from the system as this may result in data loss. {{< note >}} -**Note:** PVC is in active use by a pod when the pod status is `Pending` and the pod is assigned to a node or the pod status is `Running`. +PVC is in active use by a pod when the pod status is `Pending` and the pod is assigned to a node or the pod status is `Running`. {{< /note >}} When the [Storage Object in Use Protection feature](/docs/tasks/administer-cluster/storage-object-in-use-protection/) is enabled, if a user deletes a PVC in active use by a pod, the PVC is not removed immediately. PVC removal is postponed until the PVC is no longer actively used by any pods, and also if admin deletes a PV that is bound to a PVC, the PV is not removed immediately. PV removal is postponed until the PV is not bound to a PVC any more. @@ -147,7 +147,7 @@ For volume plugins that support the `Delete` reclaim policy, deletion removes bo #### Recycle {{< warning >}} -**Warning:** The `Recycle` reclaim policy is deprecated. Instead, the recommended approach is to use dynamic provisioning. +The `Recycle` reclaim policy is deprecated. Instead, the recommended approach is to use dynamic provisioning. {{< /warning >}} If supported by the underlying volume plugin, the `Recycle` reclaim policy performs a basic scrub (`rm -rf /thevolume/*`) on the volume and makes it available again for a new claim. @@ -238,7 +238,7 @@ This feature has no effect on PVCs that are not in use by a Pod or deployment. Y uses the PVC before the expansion can complete. {{< note >}} -**Note:** Expanding EBS volumes is a time consuming operation. Also, there is a per-volume quota of one modification every 6 hours. +Expanding EBS volumes is a time consuming operation. Also, there is a per-volume quota of one modification every 6 hours. {{< /note >}} @@ -377,7 +377,7 @@ Currently, only NFS and HostPath support recycling. AWS EBS, GCE PD, Azure Disk, A Kubernetes administrator can specify additional mount options for when a Persistent Volume is mounted on a node. {{< note >}} -**Note:** Not all Persistent volume types support mount options. +Not all Persistent volume types support mount options. {{< /note >}} The following volume types support mount options: @@ -495,7 +495,7 @@ the requirements are ANDed together: only a PV of the requested class and with the requested labels may be bound to the PVC. {{< note >}} -**Note:** Currently, a PVC with a non-empty `selector` can't have a PV dynamically provisioned for it. +Currently, a PVC with a non-empty `selector` can't have a PV dynamically provisioned for it. {{< /note >}} In the past, the annotation `volume.beta.kubernetes.io/storage-class` was used instead @@ -547,7 +547,7 @@ applicable. * RBD (Ceph Block Device) {{< note >}} -**Note**: Only FC and iSCSI volumes supported raw block volumes in Kubernetes 1.9. +Only FC and iSCSI volumes supported raw block volumes in Kubernetes 1.9. Support for the additional plugins was added in 1.10. {{< /note >}} @@ -605,7 +605,7 @@ spec: ``` {{< note >}} -**Note:** When adding a raw block device for a Pod, we specify the device path in the container instead of a mount path. +When adding a raw block device for a Pod, we specify the device path in the container instead of a mount path. {{< /note >}} ### Binding Block Volumes @@ -627,7 +627,7 @@ Volume binding matrix for statically provisioned volumes: | Filesystem | unspecified | BIND | {{< note >}} -**Note:** Only statically provisioned volumes are supported for alpha release. Administrators should take care to consider these values when working with raw block devices. +Only statically provisioned volumes are supported for alpha release. Administrators should take care to consider these values when working with raw block devices. {{< /note >}} ## Volume Snapshot and Restore Volume from Snapshot Support diff --git a/content/en/docs/concepts/storage/storage-classes.md b/content/en/docs/concepts/storage/storage-classes.md index 0cd7d0afbc..3aba1eee67 100644 --- a/content/en/docs/concepts/storage/storage-classes.md +++ b/content/en/docs/concepts/storage/storage-classes.md @@ -123,8 +123,10 @@ the class or PV, so mount of the PV will simply fail if one is invalid. {{< feature-state for_k8s_version="v1.12" state="beta" >}} -**Note:** This feature requires the `VolumeScheduling` feature gate to be +{{< note >}} +This feature requires the `VolumeScheduling` feature gate to be enabled. +{{< /note >}} The `volumeBindingMode` field controls when [volume binding and dynamic provisioning](/docs/concepts/storage/persistent-volumes/#provisioning) should occur. @@ -159,8 +161,10 @@ The following plugins support `WaitForFirstConsumer` with pre-created Persistent ### Allowed Topologies {{< feature-state for_k8s_version="v1.12" state="beta" >}} -**Note:** This feature requires the `VolumeScheduling` feature gate to be +{{< note >}} +This feature requires the `VolumeScheduling` feature gate to be enabled. +{{< /note >}} When a cluster operactor specifies the `WaitForFirstConsumer` volume binding mode, it is no longer necessary to restrict provisioning to specific topologies in most situations. However, @@ -232,8 +236,10 @@ parameters: encrypting the volume. If none is supplied but `encrypted` is true, a key is generated by AWS. See AWS docs for valid ARN value. -**Note:** `zone` and `zones` parameters are deprecated and replaced with +{{< note >}} +`zone` and `zones` parameters are deprecated and replaced with [allowedTopologies](#allowed-topologies) +{{< /note >}} ### GCE PD @@ -269,8 +275,10 @@ specified, Kubernetes will arbitrarily choose among the specified zones. If the `zones` parameter is omitted, Kubernetes will arbitrarily choose among zones managed by the cluster. -**Note:** `zone` and `zones` parameters are deprecated and replaced with +{{< note >}} +`zone` and `zones` parameters are deprecated and replaced with [allowedTopologies](#allowed-topologies) +{{< /note >}} ### Glusterfs diff --git a/content/en/docs/concepts/storage/volumes.md b/content/en/docs/concepts/storage/volumes.md index 5f16c2b464..7ce8c092db 100644 --- a/content/en/docs/concepts/storage/volumes.md +++ b/content/en/docs/concepts/storage/volumes.md @@ -105,7 +105,7 @@ EBS volume can be pre-populated with data, and that data can be "handed off" between Pods. {{< caution >}} -**Important:** You must create an EBS volume using `aws ec2 create-volume` or the AWS API before you can use it. +You must create an EBS volume using `aws ec2 create-volume` or the AWS API before you can use it. {{< /caution >}} There are some restrictions when using an `awsElasticBlockStore` volume: @@ -170,7 +170,7 @@ that data can be "handed off" between Pods. CephFS can be mounted by multiple writers simultaneously. {{< caution >}} -**Important:** You must have your own Ceph server running with the share exported before you can use it. +You must have your own Ceph server running with the share exported before you can use it. {{< /caution >}} See the [CephFS example](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/staging/volumes/cephfs/) for more details. @@ -215,11 +215,11 @@ Note that this path is derived from the volume's `mountPath` and the `path` keyed with `log_level`. {{< caution >}} -**Important:** You must create a [ConfigMap](/docs/tasks/configure-pod-container/configure-pod-configmap/) before you can use it. +You must create a [ConfigMap](/docs/tasks/configure-pod-container/configure-pod-configmap/) before you can use it. {{< /caution >}} {{< note >}} -**Note:** A Container using a ConfigMap as a [subPath](#using-subpath) volume mount will not +A Container using a ConfigMap as a [subPath](#using-subpath) volume mount will not receive ConfigMap updates. {{< /note >}} @@ -229,7 +229,7 @@ A `downwardAPI` volume is used to make downward API data available to applicatio It mounts a directory and writes the requested data in plain text files. {{< note >}} -**Note:** A Container using Downward API as a [subPath](#using-subpath) volume mount will not +A Container using Downward API as a [subPath](#using-subpath) volume mount will not receive Downward API updates. {{< /note >}} @@ -245,7 +245,7 @@ or different paths in each Container. When a Pod is removed from a node for any reason, the data in the `emptyDir` is deleted forever. {{< note >}} -**Note:** A Container crashing does *NOT* remove a Pod from a node, so the data in an `emptyDir` volume is safe across Container crashes. +A Container crashing does *NOT* remove a Pod from a node, so the data in an `emptyDir` volume is safe across Container crashes. {{< /note >}} Some uses for an `emptyDir` are: @@ -290,7 +290,7 @@ You can specify single or multiple target World Wide Names using the parameter targetWWNs expect that those WWNs are from multi-path connections. {{< caution >}} -**Important:** You must configure FC SAN Zoning to allocate and mask those LUNs (volumes) to the target WWNs beforehand so that Kubernetes hosts can access them. +You must configure FC SAN Zoning to allocate and mask those LUNs (volumes) to the target WWNs beforehand so that Kubernetes hosts can access them. {{< /caution >}} See the [FC example](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/staging/volumes/fibre_channel) for more details. @@ -307,7 +307,7 @@ reattached by Flocker to the node that the Pod is scheduled. This means data can be "handed off" between Pods as required. {{< caution >}} -**Important:** You must have your own Flocker installation running before you can use it. +You must have your own Flocker installation running before you can use it. {{< /caution >}} See the [Flocker example](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/staging/volumes/flocker) for more details. @@ -321,7 +321,7 @@ preserved and the volume is merely unmounted. This means that a PD can be pre-populated with data, and that data can be "handed off" between Pods. {{< caution >}} -**Important:** You must create a PD using `gcloud` or the GCE API or UI before you can use it. +You must create a PD using `gcloud` or the GCE API or UI before you can use it. {{< /caution >}} There are some restrictions when using a `gcePersistentDisk`: @@ -403,7 +403,7 @@ spec: ### gitRepo (deprecated) {#gitrepo} {{< warning >}} -**Warning:** The gitRepo volume type is deprecated. To provision a container with a git repo, mount an [EmptyDir](#emptydir) into an InitContainer that clones the repo using git, then mount the [EmptyDir](#emptydir) into the Pod's container. +The gitRepo volume type is deprecated. To provision a container with a git repo, mount an [EmptyDir](#emptydir) into an InitContainer that clones the repo using git, then mount the [EmptyDir](#emptydir) into the Pod's container. {{< /warning >}} A `gitRepo` volume is an example of what can be done as a volume plugin. It @@ -443,7 +443,7 @@ be "handed off" between Pods. GlusterFS can be mounted by multiple writers simultaneously. {{< caution >}} -**Important:** You must have your own GlusterFS installation running before you can use it. +You must have your own GlusterFS installation running before you can use it. {{< /caution >}} See the [GlusterFS example](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/staging/volumes/glusterfs) for more details. @@ -521,7 +521,7 @@ unmounted. This means that an iscsi volume can be pre-populated with data, and that data can be "handed off" between Pods. {{< caution >}} -**Important:** You must have your own iSCSI server running with the volume created before you can use it. +You must have your own iSCSI server running with the volume created before you can use it. {{< /caution >}} A feature of iSCSI is that it can be mounted as read-only by multiple consumers @@ -537,7 +537,7 @@ See the [iSCSI example](https://github.com/kubernetes/examples/tree/{{< param "g {{< feature-state for_k8s_version="v1.10" state="beta" >}} {{< note >}} -**Note:** The alpha PersistentVolume NodeAffinity annotation has been deprecated +The alpha PersistentVolume NodeAffinity annotation has been deprecated and will be removed in a future release. Existing PersistentVolumes using this annotation must be updated by the user to use the new PersistentVolume `NodeAffinity` field. @@ -610,7 +610,7 @@ provisioning yet. For an example on how to run an external local provisioner, see the [local volume provisioner user guide](https://github.com/kubernetes-incubator/external-storage/tree/master/local-volume). {{< note >}} -**Note:** The local PersistentVolume requires manual cleanup and deletion by the +The local PersistentVolume requires manual cleanup and deletion by the user if the external static provisioner is not used to manage the volume lifecycle. {{< /note >}} @@ -625,7 +625,7 @@ that data can be "handed off" between Pods. NFS can be mounted by multiple writers simultaneously. {{< caution >}} -**Important:** You must have your own NFS server running with the share exported before you can use it. +You must have your own NFS server running with the share exported before you can use it. {{< /caution >}} See the [NFS example](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/staging/volumes/nfs) for more details. @@ -782,7 +782,7 @@ option for the API server. The `path` field specifies a relative path to the mou of the projected volume. {{< note >}} -**Note:** A Container using a projected volume source as a [subPath](#using-subpath) volume mount will not +A Container using a projected volume source as a [subPath](#using-subpath) volume mount will not receive updates for those volume sources. {{< /note >}} @@ -818,7 +818,7 @@ spec: ``` {{< caution >}} -**Important:** Make sure you have an existing PortworxVolume with name `pxvol` +Make sure you have an existing PortworxVolume with name `pxvol` before using it in the Pod. {{< /caution >}} @@ -830,7 +830,7 @@ A `quobyte` volume allows an existing [Quobyte](http://www.quobyte.com) volume t be mounted into your Pod. {{< caution >}} -**Important:** You must have your own Quobyte setup running with the volumes +You must have your own Quobyte setup running with the volumes created before you can use it. {{< /caution >}} @@ -846,7 +846,7 @@ means that a RBD volume can be pre-populated with data, and that data can be "handed off" between Pods. {{< caution >}} -**Important:** You must have your own Ceph installation running before you can use RBD. +You must have your own Ceph installation running before you can use RBD. {{< /caution >}} A feature of RBD is that it can be mounted as read-only by multiple consumers @@ -866,7 +866,7 @@ volumes (or it can dynamically provision new volumes for persistent volume claim [ScaleIO Persistent Volumes](/docs/concepts/storage/persistent-volumes/#scaleio)). {{< caution >}} -**Important:** You must have an existing ScaleIO cluster already setup and +You must have an existing ScaleIO cluster already setup and running with the volumes created before you can use them. {{< /caution >}} @@ -908,11 +908,11 @@ backed by tmpfs (a RAM-backed filesystem) so they are never written to non-volatile storage. {{< caution >}} -**Important:** You must create a secret in the Kubernetes API before you can use it. +You must create a secret in the Kubernetes API before you can use it. {{< /caution >}} {{< note >}} -**Note:** A Container using a Secret as a [subPath](#using-subpath) volume mount will not +A Container using a Secret as a [subPath](#using-subpath) volume mount will not receive Secret updates. {{< /note >}} @@ -934,7 +934,7 @@ The StorageOS Container requires 64-bit Linux and has no additional dependencies A free developer license is available. {{< caution >}} -**Important:** You must run the StorageOS Container on each node that wants to +You must run the StorageOS Container on each node that wants to access StorageOS volumes or that will contribute storage capacity to the pool. For installation instructions, consult the [StorageOS documentation](https://docs.storageos.com). @@ -974,7 +974,7 @@ For more information including Dynamic Provisioning and Persistent Volume Claims ### vsphereVolume {#vspherevolume} {{< note >}} -**Prerequisite:** Kubernetes with vSphere Cloud Provider configured. For cloudprovider +Prerequisite: Kubernetes with vSphere Cloud Provider configured. For cloudprovider configuration please refer [vSphere getting started guide](https://vmware.github.io/vsphere-storage-for-kubernetes/documentation/). {{< /note >}} @@ -982,7 +982,7 @@ A `vsphereVolume` is used to mount a vSphere VMDK Volume into your Pod. The con of a volume are preserved when it is unmounted. It supports both VMFS and VSAN datastore. {{< caution >}} -**Important:** You must create VMDK using one of the following method before using with Pod. +You must create VMDK using one of the following method before using with Pod. {{< /caution >}} #### Creating a VMDK volume @@ -1274,7 +1274,7 @@ Its values are: [Linux kernel documentation](https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt) {{< caution >}} -**Caution:** `Bidirectional` mount propagation can be dangerous. It can damage +`Bidirectional` mount propagation can be dangerous. It can damage the host operating system and therefore it is allowed only in privileged Containers. Familiarity with Linux kernel behavior is strongly recommended. In addition, any volume mounts created by Containers in Pods must be destroyed diff --git a/content/en/docs/concepts/workloads/controllers/cron-jobs.md b/content/en/docs/concepts/workloads/controllers/cron-jobs.md index 3169cb13bf..602bf0d581 100644 --- a/content/en/docs/concepts/workloads/controllers/cron-jobs.md +++ b/content/en/docs/concepts/workloads/controllers/cron-jobs.md @@ -14,8 +14,9 @@ A _Cron Job_ creates [Jobs](/docs/concepts/workloads/controllers/jobs-run-to-com One CronJob object is like one line of a _crontab_ (cron table) file. It runs a job periodically on a given schedule, written in [Cron](https://en.wikipedia.org/wiki/Cron) format. + {{< note >}} -**Note:** All **CronJob** `schedule:` times are denoted in UTC. +All **CronJob** `schedule:` times are denoted in UTC. {{< /note >}} For instructions on creating and working with cron jobs, and for an example of a spec file for a cron job, see [Running automated tasks with cron jobs](/docs/tasks/job/automated-tasks-with-cron-jobs). diff --git a/content/en/docs/concepts/workloads/controllers/jobs-run-to-completion.md b/content/en/docs/concepts/workloads/controllers/jobs-run-to-completion.md index 0fc09ad537..0dbbfaabf0 100644 --- a/content/en/docs/concepts/workloads/controllers/jobs-run-to-completion.md +++ b/content/en/docs/concepts/workloads/controllers/jobs-run-to-completion.md @@ -206,7 +206,7 @@ back-off count is reset if no new failed Pods appear before the Job's next status check. {{< note >}} -**Note:** Issue [#54870](https://github.com/kubernetes/kubernetes/issues/54870) still exists for versions of Kubernetes prior to version 1.12 +Issue [#54870](https://github.com/kubernetes/kubernetes/issues/54870) still exists for versions of Kubernetes prior to version 1.12 {{< /note >}} ## Job Termination and Cleanup diff --git a/content/en/docs/concepts/workloads/controllers/replicationcontroller.md b/content/en/docs/concepts/workloads/controllers/replicationcontroller.md index d6dcb84249..daf0dfd59a 100644 --- a/content/en/docs/concepts/workloads/controllers/replicationcontroller.md +++ b/content/en/docs/concepts/workloads/controllers/replicationcontroller.md @@ -16,7 +16,7 @@ weight: 20 {{% capture overview %}} {{< note >}} -**NOTE:** A [`Deployment`](/docs/concepts/workloads/controllers/deployment/) that configures a [`ReplicaSet`](/docs/concepts/workloads/controllers/replicaset/) is now the recommended way to set up replication. +A [`Deployment`](/docs/concepts/workloads/controllers/deployment/) that configures a [`ReplicaSet`](/docs/concepts/workloads/controllers/replicaset/) is now the recommended way to set up replication. {{< /note >}} A _ReplicationController_ ensures that a specified number of pod replicas are running at any one diff --git a/content/en/docs/concepts/workloads/controllers/statefulset.md b/content/en/docs/concepts/workloads/controllers/statefulset.md index 480988cb09..0e3a4e8569 100644 --- a/content/en/docs/concepts/workloads/controllers/statefulset.md +++ b/content/en/docs/concepts/workloads/controllers/statefulset.md @@ -16,7 +16,7 @@ weight: 40 StatefulSet is the workload API object used to manage stateful applications. {{< note >}} -**Note:** StatefulSets are stable (GA) in 1.9. +StatefulSets are stable (GA) in 1.9. {{< /note >}} {{< glossary_definition term_id="statefulset" length="all" >}} @@ -144,7 +144,7 @@ Cluster Domain | Service (ns/name) | StatefulSet (ns/name) | StatefulSet Domain kube.local | foo/nginx | foo/web | nginx.foo.svc.kube.local | web-{0..N-1}.nginx.foo.svc.kube.local | web-{0..N-1} | {{< note >}} -**Note:** Cluster Domain will be set to `cluster.local` unless +Cluster Domain will be set to `cluster.local` unless [otherwise configured](/docs/concepts/services-networking/dns-pod-service/#how-it-works). {{< /note >}} diff --git a/content/en/docs/concepts/workloads/pods/pod-overview.md b/content/en/docs/concepts/workloads/pods/pod-overview.md index d08433ef39..97efcb8c8c 100644 --- a/content/en/docs/concepts/workloads/pods/pod-overview.md +++ b/content/en/docs/concepts/workloads/pods/pod-overview.md @@ -55,7 +55,7 @@ A Pod can specify a set of shared storage *volumes*. All containers in the Pod c You'll rarely create individual Pods directly in Kubernetes--even singleton Pods. This is because Pods are designed as relatively ephemeral, disposable entities. When a Pod gets created (directly by you, or indirectly by a Controller), it is scheduled to run on a Node in your cluster. The Pod remains on that Node until the process is terminated, the pod object is deleted, the pod is *evicted* for lack of resources, or the Node fails. {{< note >}} -**Note:** Restarting a container in a Pod should not be confused with restarting the Pod. The Pod itself does not run, but is an environment the containers run in and persists until it is deleted. +Restarting a container in a Pod should not be confused with restarting the Pod. The Pod itself does not run, but is an environment the containers run in and persists until it is deleted. {{< /note >}} Pods do not, by themselves, self-heal. If a Pod is scheduled to a Node that fails, or if the scheduling operation itself fails, the Pod is deleted; likewise, a Pod won't survive an eviction due to a lack of resources or Node maintenance. Kubernetes uses a higher-level abstraction, called a *Controller*, that handles the work of managing the relatively disposable Pod instances. Thus, while it is possible to use Pod directly, it's far more common in Kubernetes to manage your pods using a Controller. See [Pods and Controllers](#pods-and-controllers) for more information on how Kubernetes uses Controllers to implement Pod scaling and healing. diff --git a/content/en/docs/concepts/workloads/pods/podpreset.md b/content/en/docs/concepts/workloads/pods/podpreset.md index 6711ba2ffe..dfae21fd4f 100644 --- a/content/en/docs/concepts/workloads/pods/podpreset.md +++ b/content/en/docs/concepts/workloads/pods/podpreset.md @@ -51,7 +51,7 @@ Pods, Kubernetes modifies the Pod Spec. For changes to `Env`, `EnvFrom`, and the Pod; for changes to `Volume`, Kubernetes modifies the Pod Spec. {{< note >}} -**Note:** A Pod Preset is capable of modifying the `.spec.containers` field in a +A Pod Preset is capable of modifying the `.spec.containers` field in a Pod spec when appropriate. *No* resource definition from the Pod Preset will be applied to the `initContainers` field. {{< /note >}} diff --git a/content/en/docs/contribute/generate-ref-docs/kubectl.md b/content/en/docs/contribute/generate-ref-docs/kubectl.md index 6793c6e6b9..39fc14cf08 100644 --- a/content/en/docs/contribute/generate-ref-docs/kubectl.md +++ b/content/en/docs/contribute/generate-ref-docs/kubectl.md @@ -9,7 +9,6 @@ This page shows how to automatically generate reference pages for the commands provided by the `kubectl` tool. {{< note >}} -**Note:** This topic shows how to generate reference documentation for [kubectl commands](/docs/reference/generated/kubectl/kubectl-commands) like @@ -132,7 +131,6 @@ on how to do this, see Monitor your cherry-pick pull request until it is merged into the release branch. {{< note >}} -**Note:** Proposing a cherry pick requires that you have permission to set a label and a milestone in your pull request. If you don鈥檛 have those permissions, you will need to work with someone who can set the label and milestone for you. diff --git a/content/en/docs/contribute/generate-ref-docs/kubernetes-api.md b/content/en/docs/contribute/generate-ref-docs/kubernetes-api.md index f61e62f5cb..7dc9e813bd 100644 --- a/content/en/docs/contribute/generate-ref-docs/kubernetes-api.md +++ b/content/en/docs/contribute/generate-ref-docs/kubernetes-api.md @@ -98,7 +98,7 @@ or more comments in the Kubernetes source code. ### Making changes to comments in the source code {{< note >}} -**Note**: The following steps are an example, not a general procedure. Details +The following steps are an example, not a general procedure. Details will be different in your situation. {{< /note >}} @@ -184,7 +184,7 @@ to monitor your pull request until it has been merged. is an example of a pull request that fixes a typo in the Kubernetes source code. {{< note >}} -**Note**: It can be tricky to determine the correct source file to be changed. In the +It can be tricky to determine the correct source file to be changed. In the preceding example, the authoritative source file is under the `staging` directory in the `kubernetes/kubernetes` repository. But in your situation,the `staging` directory might not be the place to find the authoritative source. For guidance, check the @@ -208,9 +208,11 @@ commit into the release-1.9 branch. The idea is to cherry pick the commit that e the commit that has the results of running the scripts. For instructions, see [Propose a Cherry Pick](https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md). -**Note:** Proposing a cherry pick requires that you have permission to set a label and a milestone in your +{{< note >}} +Proposing a cherry pick requires that you have permission to set a label and a milestone in your pull request. If you don't have those permissions, you will need to work with someone who can set the label and milestone for you. +{{< /note >}} When you have a pull request in place for cherry picking your one commit into the release-1.9 branch, the next step is to run these scripts in the release-1.9 branch of your local environment. diff --git a/content/en/docs/contribute/generate-ref-docs/kubernetes-components.md b/content/en/docs/contribute/generate-ref-docs/kubernetes-components.md index b4f03c1e33..0ec38e8de6 100644 --- a/content/en/docs/contribute/generate-ref-docs/kubernetes-components.md +++ b/content/en/docs/contribute/generate-ref-docs/kubernetes-components.md @@ -71,7 +71,6 @@ your base directory is `$GOPATH/src/github.com/kubernetes/kubernetes.` The remaining steps refer to your base directory as ``. {{< note >}} -**Note:** If you only need to generate, but not change, the reference docs, you don't need to manually get the `kubernetes/kubernetes` repository. When you run the `update-imported-docs` tool, it automatically clones the `kubernetes/kubernetes` repository. @@ -109,7 +108,7 @@ to do this, see Monitor your cherry-pick pull request until it is merged into the release branch. {{< note >}} -**Note:** Proposing a cherry pick requires that you have permission to set a label +Proposing a cherry pick requires that you have permission to set a label and a milestone in your pull request. If you don鈥檛 have those permissions, you will need to work with someone who can set the label and milestone for you. {{< /note >}} diff --git a/content/en/docs/contribute/intermediate.md b/content/en/docs/contribute/intermediate.md index 3fed21a05b..52a9f10af3 100644 --- a/content/en/docs/contribute/intermediate.md +++ b/content/en/docs/contribute/intermediate.md @@ -12,8 +12,7 @@ This page assumes that you've read and mastered the tasks in the learn about more ways to contribute. {{< note >}} -**Note:** Some tasks require you to use the Git command line client and other -tools. +Some tasks require you to use the Git command line client and other tools. {{< /note >}} {{% /capture %}} @@ -387,11 +386,11 @@ most up-to-date version of that branch. ``` {{< note >}} -**Note:** Do not reference a Github issue or pull request by ID or URL in the -commit message. If you do, it will cause that issue or pull request to get -a notification every time the commit shows up in a new Git branch. You can -link issues and pull requests together later, in the Github UI. -{{< /note >}} + Do not reference a Github issue or pull request by ID or URL in the + commit message. If you do, it will cause that issue or pull request to get + a notification every time the commit shows up in a new Git branch. You can + link issues and pull requests together later, in the Github UI. + {{< /note >}} 5. Optionally, you can test your change by staging the site locally using the `hugo` command. See [View your changes locally](#view-your-changes-locally). diff --git a/content/en/docs/contribute/localization.md b/content/en/docs/contribute/localization.md index 7120607d2e..a586bc5410 100644 --- a/content/en/docs/contribute/localization.md +++ b/content/en/docs/contribute/localization.md @@ -29,6 +29,10 @@ Localizations must meet some requirements for workflow (*how* to localize) and o To add a new localization of the Kubernetes documentation, you'll need to update the website by modifying the [site configuration](#modify-the-site-configuration) and [directory structure](#add-a-new-localization-directory). Then you can start [translating documents](#translating-documents)! +{{< note >}} +For an example localization-related [pull request](../create-pull-request), see [this pull request](https://github.com/kubernetes/website/pull/8636) to the [Kubernetes website repo](https://github.com/kubernetes/website) adding Korean localization to the Kubernetes docs. +{{< /note >}} + Let Kubernetes SIG Docs know you're interested in creating a localization! Join the [SIG Docs Slack channel](https://kubernetes.slack.com/messages/C1J0BPD2M/). We're happy to help you get started and answer any questions you have. All localization teams must be self-sustaining with their own resources. We're happy to host your work, but we can't translate it for you. diff --git a/content/en/docs/contribute/start.md b/content/en/docs/contribute/start.md index 2ebf585efa..5d205db0d2 100644 --- a/content/en/docs/contribute/start.md +++ b/content/en/docs/contribute/start.md @@ -213,7 +213,7 @@ documentation. include more detail if appropriate. {{< note >}} -**Note**: Do not include references to other Github issues or pull +Do not include references to other Github issues or pull requests in your commit message. You can add those to the pull request description later. {{< /note >}} @@ -231,7 +231,7 @@ description later. **Create pull request**. {{< note >}} -**Note**: If you don't want to create the pull request now, you can do it +If you don't want to create the pull request now, you can do it later, by browsing to the main URL of the Kubernetes website repository or your fork's repository. The Github website will prompt you to create the pull request if it detects that you pushed a new branch to your fork. diff --git a/content/en/docs/contribute/style/content-organization.md b/content/en/docs/contribute/style/content-organization.md index 61ee7d9a3b..a89e686ac9 100644 --- a/content/en/docs/contribute/style/content-organization.md +++ b/content/en/docs/contribute/style/content-organization.md @@ -32,7 +32,7 @@ weight: 10 {{% note %}} -**Note:** For page weights, it can be smart not to use 1, 2, 3 ..., but some other interval, say 10, 20, 30... This allows you to insert pages where you want later. +For page weights, it can be smart not to use 1, 2, 3 ..., but some other interval, say 10, 20, 30... This allows you to insert pages where you want later. {{% /note %}} @@ -56,7 +56,7 @@ linkTitle: Title used in links {{% note %}} -**Note:** The above needs to be done per language. If you don't see your section in the menu, it is probably because it is not identified as a section by Hugo. Create a `_index.md` content file in the section folder. +The above needs to be done per language. If you don't see your section in the menu, it is probably because it is not identified as a section by Hugo. Create a `_index.md` content file in the section folder. {{% /note %}} ### Documentation Side Menu diff --git a/content/en/docs/contribute/style/hugo-shortcodes/example1.md b/content/en/docs/contribute/style/hugo-shortcodes/example1.md index 9ee1a0b313..fbe21a1457 100644 --- a/content/en/docs/contribute/style/hugo-shortcodes/example1.md +++ b/content/en/docs/contribute/style/hugo-shortcodes/example1.md @@ -5,5 +5,5 @@ title: Example #1 This is an **example** content file inside the **includes** leaf bundle. {{< note >}} -**Note:** Included content files can also contain shortcodes. +Included content files can also contain shortcodes. {{< /note >}} \ No newline at end of file diff --git a/content/en/docs/contribute/style/hugo-shortcodes/index.md b/content/en/docs/contribute/style/hugo-shortcodes/index.md index 8d826a4c69..9d5dc7a30e 100644 --- a/content/en/docs/contribute/style/hugo-shortcodes/index.md +++ b/content/en/docs/contribute/style/hugo-shortcodes/index.md @@ -154,7 +154,9 @@ println "This is tab 2." {{}} {{% tab name="Markdown" %}} This is **some markdown.** -{{< note >}}**Note:** It can even contain shortcodes.{{< /note >}} +{{< note >}} +It can even contain shortcodes. +{{< /note >}} {{% /tab %}} {{< tab name="HTML" >}}
@@ -170,7 +172,11 @@ Will be rendered as: {{< tabs name="tab_with_md" >}} {{% tab name="Markdown" %}} This is **some markdown.** -{{< note >}}**Note:** It can even contain shortcodes.{{< /note >}} + +{{< note >}} +It can even contain shortcodes. +{{< /note >}} + {{% /tab %}} {{< tab name="HTML" >}}
diff --git a/content/en/docs/contribute/style/page-templates.md b/content/en/docs/contribute/style/page-templates.md index 147e8f5ec7..e8563eae52 100644 --- a/content/en/docs/contribute/style/page-templates.md +++ b/content/en/docs/contribute/style/page-templates.md @@ -15,7 +15,7 @@ directory of the [`kubernetes/website`](https://github.com/kubernetes/website) repository. {{< note >}} -**Note**: Every new topic needs to use a template. If you are unsure which +Every new topic needs to use a template. If you are unsure which template to use for a new topic, start with the [concept template](#concept-template). {{< /note >}} diff --git a/content/en/docs/contribute/style/style-guide.md b/content/en/docs/contribute/style/style-guide.md index 516b57a208..8cd5e14337 100644 --- a/content/en/docs/contribute/style/style-guide.md +++ b/content/en/docs/contribute/style/style-guide.md @@ -19,7 +19,7 @@ docs, follow the instructions on {{% capture body %}} {{< note >}} -**Note:** Kubernetes documentation uses [Blackfriday Markdown Renderer](https://github.com/russross/blackfriday) along with a few [Hugo Shortcodes](/docs/home/contribute/includes/) to support glossary entries, tabs, +Kubernetes documentation uses [Blackfriday Markdown Renderer](https://github.com/russross/blackfriday) along with a few [Hugo Shortcodes](/docs/home/contribute/includes/) to support glossary entries, tabs, and representing feature state. {{< /note >}} @@ -189,7 +189,8 @@ A list of Kubernetes-specific terms and words to be used consistently across the ## Shortcodes -Hugo [Shortcodes](https://gohugo.io/content-management/shortcodes) help create different rhetorical appeal levels. Our documentation supports three different shortcodes in this category: **Note:** {{}}, **Caution:** {{}}, and **Warning:** {{}}. + +Hugo [Shortcodes](https://gohugo.io/content-management/shortcodes) help create different rhetorical appeal levels. Our documentation supports three different shortcodes in this category: **Note** {{}}, **Caution** {{}}, and **Warning** {{}}. 1. Surround the text with an opening and closing shortcode. @@ -197,7 +198,7 @@ Hugo [Shortcodes](https://gohugo.io/content-management/shortcodes) help create d ``` {{}} - **Note:** The prefix you use is the same text you use in the tag. + No need to include a prefix; the shortcode automatically provides on (Note:, Caution:, etc.). {{}} ``` @@ -205,7 +206,7 @@ Hugo [Shortcodes](https://gohugo.io/content-management/shortcodes) help create d The output is: {{< note >}} -**Note:** The prefix you choose is the same text for the tag. +The prefix you choose is the same text for the tag. {{< /note >}} ### Note @@ -216,14 +217,14 @@ For example: ``` {{}} -**Note:** You can _still_ use Markdown inside these callouts. +You can _still_ use Markdown inside these callouts. {{}} ``` The output is: {{< note >}} -**Note:** You can _still_ use Markdown inside these callouts. +You can _still_ use Markdown inside these callouts. {{< /note >}} ### Caution @@ -234,14 +235,14 @@ For example: ``` {{}} -**Caution:** The callout style only applies to the line directly above the tag. +The callout style only applies to the line directly above the tag. {{}} ``` The output is: {{< caution >}} -**Caution:** The callout style only applies to the line directly above the tag. +The callout style only applies to the line directly above the tag. {{< /caution >}} ### Warning @@ -252,7 +253,7 @@ For example: ``` {{}} -**Warning:** Beware. +Beware. {{}} ``` @@ -260,7 +261,7 @@ For example: The output is: {{< warning >}} -**Warning:** Beware. +Beware. {{< /warning >}} ### Katacoda Embedded Live Environment @@ -273,7 +274,7 @@ The Embedded Live Environment is configured to run `minikube start` and lets use as the documentation. {{< caution >}} -**Caution:** The session is limited to 15 minutes. +The session is limited to 15 minutes. {{< /caution >}} For example: @@ -306,7 +307,8 @@ The output is: 1. Preheat oven to 350藲F 1. Prepare the batter, and pour into springform pan. - {{< note >}}**Note:** Grease the pan for best results.{{< /note >}} + + {{< note >}}Grease the pan for best results.{{< /note >}} 1. Bake for 20-25 minutes or until set. diff --git a/content/en/docs/contribute/style/write-new-topic.md b/content/en/docs/contribute/style/write-new-topic.md index 5980b0d24e..4c92eb25f3 100644 --- a/content/en/docs/contribute/style/write-new-topic.md +++ b/content/en/docs/contribute/style/write-new-topic.md @@ -137,7 +137,7 @@ file located at `/content/en/examples/pods/storage/gce-volume.yaml`. ``` {{< note >}} -**Note**: To show raw Hugo shortcodes as in the above example and prevent Hugo +To show raw Hugo shortcodes as in the above example and prevent Hugo from interpreting them, use C-style comments directly after the `<` and before the `>` characters. View the code for this page for an example. {{< /note >}} @@ -155,7 +155,7 @@ kubectl create -f https://k8s.io/examples/pods/storage/gce-volume.yaml ``` {{< note >}} -**Note**: When adding new YAML files to the `/examples` directory, make +When adding new YAML files to the `/examples` directory, make sure the file is also included into the `/examples_test.go` file. The Travis CI for the Website automatically runs this test case when PRs are submitted to ensure all examples pass the tests. diff --git a/content/en/docs/doc-contributor-tools/snippets/atom-snippets.cson b/content/en/docs/doc-contributor-tools/snippets/atom-snippets.cson index 0f7b78f030..5d4573938b 100644 --- a/content/en/docs/doc-contributor-tools/snippets/atom-snippets.cson +++ b/content/en/docs/doc-contributor-tools/snippets/atom-snippets.cson @@ -90,7 +90,7 @@ 'prefix': 'anote' 'body': """ {{< note >}} - **Note**: $1 + $1 {{< /note >}} """ @@ -99,14 +99,14 @@ 'prefix': 'acaution' 'body': """ {{< caution >}} - **Caution**: $1 + $1 {{< /caution >}} """ 'Insert warning': 'prefix': 'awarning' 'body': """ {{< warning >}} - **Warning**: $1 + $1 {{< /warning >}} """ diff --git a/content/en/docs/getting-started-guides/fedora/flannel_multi_node_cluster.md b/content/en/docs/getting-started-guides/fedora/flannel_multi_node_cluster.md index 12a032bbbc..88ef0615fd 100644 --- a/content/en/docs/getting-started-guides/fedora/flannel_multi_node_cluster.md +++ b/content/en/docs/getting-started-guides/fedora/flannel_multi_node_cluster.md @@ -31,7 +31,9 @@ You need 2 or more machines with Fedora installed. } ``` -**NOTE:** Choose an IP range that is *NOT* part of the public IP address range. +{{< note >}} +Choose an IP range that is *NOT* part of the public IP address range. +{{< /note >}} Add the configuration to the etcd server on fed-master. @@ -71,7 +73,9 @@ FLANNEL_ETCD_KEY="/coreos.com/network" FLANNEL_OPTIONS="" ``` -**Note:** By default, flannel uses the interface for the default route. If you have multiple interfaces and would like to use an interface other than the default route one, you could add "-iface=" to FLANNEL_OPTIONS. For additional options, run `flanneld --help` on command line. +{{< note >}} +By default, flannel uses the interface for the default route. If you have multiple interfaces and would like to use an interface other than the default route one, you could add "-iface=" to FLANNEL_OPTIONS. For additional options, run `flanneld --help` on command line. +{{< /note >}} Enable the flannel service. diff --git a/content/en/docs/getting-started-guides/ubuntu/backups.md b/content/en/docs/getting-started-guides/ubuntu/backups.md index 226072ceb3..164949d24b 100644 --- a/content/en/docs/getting-started-guides/ubuntu/backups.md +++ b/content/en/docs/getting-started-guides/ubuntu/backups.md @@ -117,6 +117,7 @@ juju run-action new-etcd/0 restore {{% /capture %}} {{% capture discussion %}} + ## Known Limitations #### Loss of PKI warning @@ -126,10 +127,9 @@ all TLS pki will be lost. No PKI migration occurs outside of the units requesting and registering the certificates. {{< caution >}} -**Caution:** Mismanaging this configuration will result in locking yourself -out of the cluster, and can potentially break existing deployments in very -strange ways relating to x509 validation of certificates, which affects both -servers and clients. +Mismanaging this configuration will result in locking yourself out of the cluster, +and can potentially break existing deployments in very strange ways relating to x509 +validation of certificates, which affects both servers and clients. {{< /caution >}} #### Restoring from snapshot on a scaled cluster diff --git a/content/en/docs/getting-started-guides/ubuntu/decommissioning.md b/content/en/docs/getting-started-guides/ubuntu/decommissioning.md index 6eaa3c3391..04f5210251 100644 --- a/content/en/docs/getting-started-guides/ubuntu/decommissioning.md +++ b/content/en/docs/getting-started-guides/ubuntu/decommissioning.md @@ -12,7 +12,7 @@ This page shows you how to properly decommission a cluster. This page assumes you have a working Juju deployed cluster. {{< warning >}} -**Warning:** By the time you've reached this step you should have backed up your workloads and pertinent data; this section is for the complete destruction of a cluster. +By the time you've reached this step you should have backed up your workloads and pertinent data; this section is for the complete destruction of a cluster. {{< /warning >}} {{% /capture %}} diff --git a/content/en/docs/getting-started-guides/ubuntu/networking.md b/content/en/docs/getting-started-guides/ubuntu/networking.md index 843dd5f6e9..e3afca9e87 100644 --- a/content/en/docs/getting-started-guides/ubuntu/networking.md +++ b/content/en/docs/getting-started-guides/ubuntu/networking.md @@ -14,7 +14,7 @@ This page shows how the various network portions of a cluster work and how to co This page assumes you have a working Juju deployed cluster. {{< note >}} -**Note:** Note that if you deploy a cluster via conjure-up or the CDK bundles, manually deploying CNI plugins is unnecessary. +Note that if you deploy a cluster via conjure-up or the CDK bundles, manually deploying CNI plugins is unnecessary. {{< /note >}} {{% /capture %}} diff --git a/content/en/docs/getting-started-guides/ubuntu/storage.md b/content/en/docs/getting-started-guides/ubuntu/storage.md index 008df52219..8a93e53a45 100644 --- a/content/en/docs/getting-started-guides/ubuntu/storage.md +++ b/content/en/docs/getting-started-guides/ubuntu/storage.md @@ -43,8 +43,11 @@ loop loop rootfs rootfs tmpfs tmpfs ``` -> **Note**: This listing is for the Amazon Web Services public cloud. -> Different clouds may have different pool names. + +{{< note >}} +This listing is for the Amazon Web Services public cloud. Different clouds may have +different pool names. +{{< /note >}} Add a storage pool to the ceph-osd charm by NAME,SIZE,COUNT: diff --git a/content/en/docs/getting-started-guides/ubuntu/upgrades.md b/content/en/docs/getting-started-guides/ubuntu/upgrades.md index 0af5398ba2..b34108c2c0 100644 --- a/content/en/docs/getting-started-guides/ubuntu/upgrades.md +++ b/content/en/docs/getting-started-guides/ubuntu/upgrades.md @@ -11,7 +11,7 @@ This page will outline how to manage and execute a Kubernetes upgrade. This page assumes you have a working deployed cluster. {{< warning >}} -**Warning:** You should always back up all your data before attempting an upgrade. +You should always back up all your data before attempting an upgrade. Don't forget to include the workload inside your cluster! Refer to the [backup documentation](/docs/getting-started-guides/ubuntu/backups). {{< /warning >}} @@ -83,7 +83,7 @@ First you need to upgrade the masters: juju upgrade-charm kubernetes-master {{< note >}} -**Note:** Always upgrade the masters before the workers. +Always upgrade the masters before the workers. {{< /note >}} Once the latest charm is deployed, the channel for Kubernetes can be selected by issuing the following: diff --git a/content/en/docs/getting-started-guides/ubuntu/validation.md b/content/en/docs/getting-started-guides/ubuntu/validation.md index 611eed8222..c61c1ec4be 100644 --- a/content/en/docs/getting-started-guides/ubuntu/validation.md +++ b/content/en/docs/getting-started-guides/ubuntu/validation.md @@ -90,7 +90,7 @@ a deployed cluster. The following example will skip the `Flaky`, `Slow`, and juju run-action kubernetes-e2e/0 test skip='\[(Flaky|Slow|Feature:.*)\]' {{< note >}} -**Note:** The escaping of the regex due to how bash handles brackets. +The escaping of the regex due to how bash handles brackets. {{< /note >}} To see the different types of tests the Kubernetes end-to-end charm has access @@ -112,7 +112,7 @@ command, as well as a flat file on disk on the `kubernetes-e2e` unit that executed the test. {{< note >}} -**Note:** The results will only be available once the action has +The results will only be available once the action has completed the test run. End-to-end testing can be quite time consuming, often taking more than 1 hour, depending on configuration. {{< /note >}} diff --git a/content/en/docs/getting-started-guides/windows/_index.md b/content/en/docs/getting-started-guides/windows/_index.md index 5efb00af98..022e86fda3 100644 --- a/content/en/docs/getting-started-guides/windows/_index.md +++ b/content/en/docs/getting-started-guides/windows/_index.md @@ -3,7 +3,7 @@ title: Using Windows Server Containers in Kubernetes toc_hide: true --- {{< note >}} -**Note:** These instructions were recently updated based on Windows Server platform enhancements and the Kubernetes v1.9 release +These instructions were recently updated based on Windows Server platform enhancements and the Kubernetes v1.9 release {{< /note >}} Kubernetes version 1.5 introduced Alpha support for Windows Server @@ -23,7 +23,7 @@ Containers on Kubernetes include: The Kubernetes control plane (API Server, Scheduler, Controller Manager, etc) continue to run on Linux, while the kubelet and kube-proxy can be run on Windows Server 2016 or later {{< note >}} -**Note:** Windows Server Containers on Kubernetes is a Beta feature in Kubernetes v1.9 +Windows Server Containers on Kubernetes is a Beta feature in Kubernetes v1.9 {{< /note >}} ## Get Windows Binaries @@ -159,7 +159,7 @@ Note: this file assumes that a user previous created 'l2bridge' host networks on #### For 3. Open vSwitch (OVS) & Open Virtual Network (OVN) with Overlay {{< note >}} -**Note:** Fully automated setup via Ansible playbooks is [available](https://github.com/openvswitch/ovn-kubernetes/tree/master/contrib). +Fully automated setup via Ansible playbooks is [available](https://github.com/openvswitch/ovn-kubernetes/tree/master/contrib). {{< /note >}} For manual setup, continue the following steps. @@ -264,7 +264,7 @@ Because your cluster has both Linux and Windows nodes, you must explicitly set t {{< codenew file="windows/simple-pod.yaml" >}} {{< note >}} -**Note:** This example assumes you are running on Windows Server 1709, so uses the image tag to support that. If you are on a different version, you will need to update the tag. For example, if on Windows Server 2016, update to use `"image": "microsoft/iis"` which will default to that OS version. +This example assumes you are running on Windows Server 1709, so uses the image tag to support that. If you are on a different version, you will need to update the tag. For example, if on Windows Server 2016, update to use `"image": "microsoft/iis"` which will default to that OS version. {{< /note >}} ### Secrets and ConfigMaps diff --git a/content/en/docs/reference/access-authn-authz/abac.md b/content/en/docs/reference/access-authn-authz/abac.md index 67ab051408..9174027776 100644 --- a/content/en/docs/reference/access-authn-authz/abac.md +++ b/content/en/docs/reference/access-authn-authz/abac.md @@ -49,12 +49,14 @@ properties: - `/foo/*` matches all subpaths of `/foo/`. - `readonly`, type boolean, when true, means that the Resource-matching policy only applies to get, list, and watch operations, Non-resource-matching policy only applies to get operation. -**NOTES:** An unset property is the same as a property set to the zero value for its type +{{< note >}} +An unset property is the same as a property set to the zero value for its type (e.g. empty string, 0, false). However, unset should be preferred for readability. In the future, policies may be expressed in a JSON format, and managed via a REST interface. +{{< /note >}} ## Authorization Algorithm diff --git a/content/en/docs/reference/access-authn-authz/admission-controllers.md b/content/en/docs/reference/access-authn-authz/admission-controllers.md index 9eee5a89e8..95a29497eb 100644 --- a/content/en/docs/reference/access-authn-authz/admission-controllers.md +++ b/content/en/docs/reference/access-authn-authz/admission-controllers.md @@ -66,11 +66,11 @@ kube-apiserver --enable-admission-plugins=NamespaceLifecycle,LimitRanger ... ``` {{< note >}} -**Note**: Depending on the way your Kubernetes cluster is deployed and how the -API server is started, you may need to apply the settings in different ways. -For example, you may have to modify the systemd unit file if the API server is -deployed as a systemd service, you may modify the manifest file for the API -server if Kubernetes is deployed in a self-hosted way. +Depending on the way your Kubernetes cluster is deployed and how the API server is +started, you may need to apply the settings in different ways. For example, you may +have to modify the systemd unit file if the API server is deployed as a systemd +service, you may modify the manifest file for the API server if Kubernetes is deployed +in a self-hosted way. {{< /note >}} ## How do I turn off an admission controller? @@ -489,7 +489,7 @@ plugin configuration file as the node selector. Conflicts result in rejection. {{< note >}} -**Note:** PodNodeSelector allows forcing pods to run on specifically labeled nodes. Also see the PodTolerationRestriction +PodNodeSelector allows forcing pods to run on specifically labeled nodes. Also see the PodTolerationRestriction admission plugin, which allows preventing pods from running on specifically tainted nodes. {{< /note >}} @@ -498,7 +498,7 @@ admission plugin, which allows preventing pods from running on specifically tain This admission controller implements additional validations for checking incoming `PersistentVolumeClaim` resize requests. {{< note >}} -**Note:** Support for volume resizing is available as an alpha feature. Admins must set the feature gate `ExpandPersistentVolumes` +Support for volume resizing is available as an alpha feature. Admins must set the feature gate `ExpandPersistentVolumes` to `true` to enable resizing. {{< /note >}} @@ -610,7 +610,7 @@ Yes. For Kubernetes version 1.10 and later, we recommend running the following set of admission controllers using the `--enable-admission-plugins` flag (**order doesn't matter**). {{< note >}} -**Note:** `--admission-control` was deprecated in 1.10 and replaced with `--enable-admission-plugins`. +`--admission-control` was deprecated in 1.10 and replaced with `--enable-admission-plugins`. {{< /note >}} ```shell diff --git a/content/en/docs/reference/access-authn-authz/authentication.md b/content/en/docs/reference/access-authn-authz/authentication.md index 9159b7c68d..26174c0bb4 100644 --- a/content/en/docs/reference/access-authn-authz/authentication.md +++ b/content/en/docs/reference/access-authn-authz/authentication.md @@ -97,7 +97,7 @@ The token file is a csv file with a minimum of 3 columns: token, user name, user followed by optional group names. {{< note >}} -**Note:** If you have more than one group the column must be double quoted e.g. +If you have more than one group the column must be double quoted e.g. ```conf token,user,uid,"group1,group2,group3" @@ -190,7 +190,7 @@ talk to the API server. Accounts may be explicitly associated with pods using th `serviceAccountName` field of a `PodSpec`. {{< note >}} -**Note:** `serviceAccountName` is usually omitted because this is done automatically. +`serviceAccountName` is usually omitted because this is done automatically. {{< /note >}} ```yaml @@ -246,7 +246,7 @@ type: kubernetes.io/service-account-token ``` {{< note >}} -**Note:** Values are base64 encoded because secrets are always base64 encoded. +Values are base64 encoded because secrets are always base64 encoded. {{< /note >}} The signed JWT can be used as a bearer token to authenticate as the given service @@ -510,8 +510,9 @@ It is designed for use in combination with an authenticating proxy, which sets t * `--requestheader-username-headers` Required, case-insensitive. Header names to check, in order, for the user identity. The first header containing a value is used as the username. * `--requestheader-group-headers` 1.6+. Optional, case-insensitive. "X-Remote-Group" is suggested. Header names to check, in order, for the user's groups. All values in all specified headers are used as group names. * `--requestheader-extra-headers-prefix` 1.6+. Optional, case-insensitive. "X-Remote-Extra-" is suggested. Header prefixes to look for to determine extra information about the user (typically used by the configured authorization plugin). Any headers beginning with any of the specified prefixes have the prefix removed. The remainder of the header name is lowercased and [percent-decoded](https://tools.ietf.org/html/rfc3986#section-2.1) and becomes the extra key, and the header value is the extra value. + {{< note >}} -**Note:** Prior to 1.11.3 (and 1.10.7, 1.9.11), the extra key could only contain characters which were [legal in HTTP header labels](https://tools.ietf.org/html/rfc7230#section-3.2.6). +Prior to 1.11.3 (and 1.10.7, 1.9.11), the extra key could only contain characters which were [legal in HTTP header labels](https://tools.ietf.org/html/rfc7230#section-3.2.6). {{< /note >}} For example, with this configuration: @@ -601,7 +602,7 @@ The following HTTP headers can be used to performing an impersonation request: * `Impersonate-Extra-( extra name )`: A dynamic header used to associate extra fields with the user. Optional. Requires "Impersonate-User". In order to be preserved consistently, `( extra name )` should be lower-case, and any characters which aren't [legal in HTTP header labels](https://tools.ietf.org/html/rfc7230#section-3.2.6) MUST be utf8 and [percent-encoded](https://tools.ietf.org/html/rfc3986#section-2.1). {{< note >}} -**Note:** Prior to 1.11.3 (and 1.10.7, 1.9.11), `( extra name )` could only contain characters which were [legal in HTTP header labels](https://tools.ietf.org/html/rfc7230#section-3.2.6). +Prior to 1.11.3 (and 1.10.7, 1.9.11), `( extra name )` could only contain characters which were [legal in HTTP header labels](https://tools.ietf.org/html/rfc7230#section-3.2.6). {{< /note >}} An example set of headers: diff --git a/content/en/docs/reference/access-authn-authz/authorization.md b/content/en/docs/reference/access-authn-authz/authorization.md index 09212d0a63..366fbefe21 100644 --- a/content/en/docs/reference/access-authn-authz/authorization.md +++ b/content/en/docs/reference/access-authn-authz/authorization.md @@ -168,12 +168,11 @@ secrets the user cannot themselves read, or that run under a service account with different/greater permissions. {{< caution >}} -**Caution:** System administrators, use care when granting access to pod -creation. A user granted permission to create pods (or controllers that create -pods) in the namespace can: read all secrets in the namespace; read all config -maps in the namespace; and impersonate any service account in the namespace and -take any action the account could take. This applies regardless of authorization -mode. +System administrators, use care when granting access to pod creation. A user +granted permission to create pods (or controllers that create pods) in the +namespace can: read all secrets in the namespace; read all config maps in the +namespace; and impersonate any service account in the namespace and take any +action the account could take. This applies regardless of authorization mode. {{< /caution >}} {{% /capture %}} diff --git a/content/en/docs/reference/access-authn-authz/bootstrap-tokens.md b/content/en/docs/reference/access-authn-authz/bootstrap-tokens.md index 736461481d..a4b0e5073d 100644 --- a/content/en/docs/reference/access-authn-authz/bootstrap-tokens.md +++ b/content/en/docs/reference/access-authn-authz/bootstrap-tokens.md @@ -179,7 +179,7 @@ verify the JWS using the `HS256` scheme (HMAC-SHA256) with the full token (e.g. is used. {{< warning >}} -**Warning:** Any party with a bootstrapping token can create a valid signature for that +Any party with a bootstrapping token can create a valid signature for that token. When using ConfigMap signing it's discouraged to share the same token with many clients, since a compromised client can potentially man-in-the middle another client relying on the signature to bootstrap TLS trust. diff --git a/content/en/docs/reference/access-authn-authz/extensible-admission-controllers.md b/content/en/docs/reference/access-authn-authz/extensible-admission-controllers.md index 518e57ef89..4d6fde6a00 100644 --- a/content/en/docs/reference/access-authn-authz/extensible-admission-controllers.md +++ b/content/en/docs/reference/access-authn-authz/extensible-admission-controllers.md @@ -120,7 +120,7 @@ webhooks: ``` {{< note >}} -**Note:** When using `clientConfig.service`, the server cert must be valid for +When using `clientConfig.service`, the server cert must be valid for `..svc`. {{< /note >}} @@ -132,7 +132,7 @@ After you create the webhook configuration, the system will take a few seconds to honor the new configuration. {{< note >}} -**Note:** When the webhook plugin is deployed into the Kubernetes cluster as a +When the webhook plugin is deployed into the Kubernetes cluster as a service, it has to expose its service on the 443 port. The communication between the API server and the webhook service may fail if a different port is used. @@ -228,7 +228,7 @@ admission controller), or to inject defaults (e.g., the admission controller), etc. {{< note >}} -**Note:** If your use case does not involve mutating objects, consider using +If your use case does not involve mutating objects, consider using external admission webhooks, as they have better performance. {{< /note >}} diff --git a/content/en/docs/reference/access-authn-authz/rbac.md b/content/en/docs/reference/access-authn-authz/rbac.md index ca674e9343..719164c5ec 100644 --- a/content/en/docs/reference/access-authn-authz/rbac.md +++ b/content/en/docs/reference/access-authn-authz/rbac.md @@ -807,7 +807,7 @@ In order from most secure to least secure, the approaches are: If an application does not specify a `serviceAccountName`, it uses the "default" service account. - {{< note >}}**Note:** Permissions given to the "default" service + {{< note >}}Permissions given to the "default" service account are available to any pod in the namespace that does not specify a `serviceAccountName`.{{< /note >}} @@ -823,7 +823,7 @@ In order from most secure to least secure, the approaches are: Many [add-ons](/docs/concepts/cluster-administration/addons/) currently run as the "default" service account in the `kube-system` namespace. To allow those add-ons to run with super-user access, grant cluster-admin permissions to the "default" service account in the `kube-system` namespace. - {{< note >}}**Note:** Enabling this means the `kube-system` + {{< note >}}Enabling this means the `kube-system` namespace contains secrets that grant super-user access to the API.{{< /note >}} @@ -863,9 +863,11 @@ In order from most secure to least secure, the approaches are: If you don't care about partitioning permissions at all, you can grant super-user access to all service accounts. - {{< warning >}}**Warning:** This allows any user with read access + {{< warning >}} + This allows any user with read access to secrets or the ability to create a pod to access super-user - credentials.{{< /warning >}} + credentials. + {{< /warning >}} ```shell kubectl create clusterrolebinding serviceaccounts-cluster-admin \ @@ -909,7 +911,7 @@ in the server logs, you can remove the ABAC authorizer. You can replicate a permissive policy using RBAC role bindings. {{< warning >}} -**Warning:** The following policy allows **ALL** service accounts to act as cluster administrators. +The following policy allows **ALL** service accounts to act as cluster administrators. Any application running in a container receives service account credentials automatically, and could perform any action against the API, including viewing secrets and modifying permissions. This is not a recommended policy. diff --git a/content/en/docs/reference/command-line-tools-reference/feature-gates.md b/content/en/docs/reference/command-line-tools-reference/feature-gates.md index e001488653..99ac76530e 100644 --- a/content/en/docs/reference/command-line-tools-reference/feature-gates.md +++ b/content/en/docs/reference/command-line-tools-reference/feature-gates.md @@ -147,7 +147,7 @@ A *Beta* feature means: that can be upgraded independently, you may be able to relax this restriction. {{< note >}} -**Note:** Please do try *Beta* features and give feedback on them! +Please do try *Beta* features and give feedback on them! After they exit beta, it may not be practical for us to make more changes. {{< /note >}} diff --git a/content/en/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping.md b/content/en/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping.md index 192cf963d2..551726cf10 100644 --- a/content/en/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping.md +++ b/content/en/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping.md @@ -221,7 +221,7 @@ specified by `--kubeconfig`. The certificate and key file will be placed in the directory specified by `--cert-dir`. {{< note >}} -**Note:** The following flags are required to enable this bootstrapping when starting the kubelet: +The following flags are required to enable this bootstrapping when starting the kubelet: ``` --bootstrap-kubeconfig="/path/to/bootstrap/kubeconfig" @@ -251,7 +251,7 @@ certificate. To enable this feature pass the following flag to the kubelet: ``` {{< note >}} -**Note:** The CSR approving controllers implemented in core Kubernetes do not +The CSR approving controllers implemented in core Kubernetes do not approve node serving certificates for [security reasons](https://github.com/kubernetes/community/pull/1982). To use `RotateKubeletServerCertificate` operators need to run a custom approving diff --git a/content/en/docs/reference/glossary/cluster-operator.md b/content/en/docs/reference/glossary/cluster-operator.md index f006ebe319..c897343830 100755 --- a/content/en/docs/reference/glossary/cluster-operator.md +++ b/content/en/docs/reference/glossary/cluster-operator.md @@ -16,5 +16,7 @@ tags: Their primary responsibility is keeping a cluster up and running, which may involve periodic maintenance activities or upgrades.
-**NOTE:** Cluster operators are different from the [Operator pattern](https://coreos.com/operators) that extends the Kubernetes API. +{{< note >}} +Cluster operators are different from the [Operator pattern](https://coreos.com/operators) that extends the Kubernetes API. +{{< /note >}} diff --git a/content/en/docs/reference/kubectl/conventions.md b/content/en/docs/reference/kubectl/conventions.md index 05ae60a048..47890bf6fc 100644 --- a/content/en/docs/reference/kubectl/conventions.md +++ b/content/en/docs/reference/kubectl/conventions.md @@ -50,12 +50,14 @@ If you do not specify a generator flag, other flags prompt you to use a specific | Job | `--restart=OnFailure` | `--restart=OnFailure` | `--restart=OnFailure` OR `--restart=Never` | N/A | | Cron Job | `--schedule=` | N/A | N/A | N/A | -**Note:** These flags use a default generator only when you have not specified -any flag. This means that when you combine `--generator` with other flags the generator that you specified later does not change. For example, in a cluster v1.4, if you initially specify +{{< note >}} +These flags use a default generator only when you have not specified any flag. +This means that when you combine `--generator` with other flags the generator that you specified later does not change. For example, in a cluster v1.4, if you initially specify `--restart=Always`, a Deployment is created; if you later specify `--restart=Always` and `--generator=run/v1`, a Replication Controller is created. This enables you to pin to a specific behavior with the generator, even when the default generator is changed later. +{{< /note >}} The flags set the generator in the following order: first the schedule flag then restart policy and finally the generator. diff --git a/content/en/docs/reference/kubectl/docker-cli-to-kubectl.md b/content/en/docs/reference/kubectl/docker-cli-to-kubectl.md index 6373155102..25c91e374e 100644 --- a/content/en/docs/reference/kubectl/docker-cli-to-kubectl.md +++ b/content/en/docs/reference/kubectl/docker-cli-to-kubectl.md @@ -36,7 +36,7 @@ deployment "nginx-app" created ``` {{< note >}} -**Note:** `kubectl` commands print the type and name of the resource created or mutated, which can then be used in subsequent commands. You can expose a new Service after a Deployment is created. +`kubectl` commands print the type and name of the resource created or mutated, which can then be used in subsequent commands. You can expose a new Service after a Deployment is created. {{< /note >}} ```shell @@ -222,7 +222,7 @@ $ kubectl get po -l run=nginx-app ``` {{< note >}} -**Note:** When you use kubectl, you don't delete the pod directly.You have to first delete the Deployment that owns the pod. If you delete the pod directly, the Deployment recreates the pod. +When you use kubectl, you don't delete the pod directly.You have to first delete the Deployment that owns the pod. If you delete the pod directly, the Deployment recreates the pod. {{< /note >}} ## docker login diff --git a/content/en/docs/reference/kubectl/overview.md b/content/en/docs/reference/kubectl/overview.md index 76f208f40e..4d67d8f897 100644 --- a/content/en/docs/reference/kubectl/overview.md +++ b/content/en/docs/reference/kubectl/overview.md @@ -45,7 +45,10 @@ where `command`, `TYPE`, `NAME`, and `flags` are: Example: `$ kubectl get pod -f ./pod.yaml` * `flags`: Specifies optional flags. For example, you can use the `-s` or `--server` flags to specify the address and port of the Kubernetes API server.
-**Important**: Flags that you specify from the command line override default values and any corresponding environment variables. + +{{< caution >}} +Flags that you specify from the command line override default values and any corresponding environment variables. +{{< /caution >}} If you need help, just run `kubectl help` from the terminal window. @@ -299,7 +302,7 @@ $ kubectl describe pods --include-uninitialized=false ``` {{< note >}} -**Note:** The `kubectl get` command is usually used for retrieving one or more +The `kubectl get` command is usually used for retrieving one or more resources of the same resource type. It features a rich set of flags that allows you to customize the output format using the `-o` or `--output` flag, for example. You can specify the `-w` or `--watch` flag to start watching updates to a particular diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-alpha.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-alpha.md index ba29459a2a..68c14d99d4 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-alpha.md +++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-alpha.md @@ -145,7 +145,7 @@ You can install all the available addons with the `all` subcommand, or install them selectively. {{< note >}} -**Note:** If `kubeadm` is invoked with `--feature-gates=CoreDNS=false`, kube-dns is installed. +If `kubeadm` is invoked with `--feature-gates=CoreDNS=false`, kube-dns is installed. {{< /note >}} {{< tabs name="tab-addon" >}} @@ -158,7 +158,7 @@ install them selectively. ## kubeadm alpha phase self-hosting {#cmd-phase-self-hosting} {{< caution >}} -**Caution:** Self-hosting is an alpha feature. See [kubeadm init](/docs/reference/setup-tools/kubeadm/kubeadm-init/) documentation for self-hosting limitations. +Self-hosting is an alpha feature. See [kubeadm init](/docs/reference/setup-tools/kubeadm/kubeadm-init/) documentation for self-hosting limitations. {{< /caution >}} {{< tabs name="tab-self-hosting" >}} diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init.md index 69eba78cfb..ad95ac1e83 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init.md +++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init.md @@ -92,8 +92,7 @@ following steps: ### Using kubeadm init with a configuration file {#config-file} {{< caution >}} -**Caution:** The config file is -still considered alpha and may change in future versions. +The config file is still considered alpha and may change in future versions. {{< /caution >}} It's possible to configure `kubeadm init` with a configuration file instead of command @@ -284,14 +283,10 @@ configured in the kubelet via static files. To create a self-hosted cluster, pass the flag `--feature-gates=SelfHosting=true` to `kubeadm init`. {{< caution >}} -**Caution:** `SelfHosting` is an alpha feature. It is deprecated in 1.12 +`SelfHosting` is an alpha feature. It is deprecated in 1.12 and will be removed in 1.13. {{< /caution >}} -{{< warning >}} -**Warning:** See self-hosted caveats and limitations. -{{< /warning >}} - #### Caveats Self-hosting in 1.8 has some important limitations. In particular, a @@ -309,7 +304,7 @@ authorization configuration for your cluster, and may not be appropriate for your environment. {{< caution >}} -**Caution:** `StoreCertsInSecrets` is an alpha feature. It is deprecated in 1.12 +`StoreCertsInSecrets` is an alpha feature. It is deprecated in 1.12 and will be removed in 1.13. {{< /caution >}} diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-join.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-join.md index c0882d0b01..2fb074626b 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-join.md +++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-join.md @@ -204,8 +204,7 @@ These commands should be run after `kubeadm init` but before `kubeadm join`. ### Using kubeadm join with a configuration file {#config-file} {{< caution >}} -**Caution:** The config file is -still considered alpha and may change in future versions. +The config file is still considered alpha and may change in future versions. {{< /caution >}} It's possible to configure `kubeadm join` with a configuration file instead of command diff --git a/content/en/docs/reference/using-api/api-overview.md b/content/en/docs/reference/using-api/api-overview.md index 2d38030e3f..38baa5aa92 100644 --- a/content/en/docs/reference/using-api/api-overview.md +++ b/content/en/docs/reference/using-api/api-overview.md @@ -40,7 +40,7 @@ The version is set at the API level rather than at the resource or field level t The JSON and Protobuf serialization schemas follow the same guidelines for schema changes. The following descriptions cover both formats. {{< note >}} -**Note:** The API versioning and software versioning are indirectly related. The [API and release +The API versioning and software versioning are indirectly related. The [API and release versioning proposal](https://git.k8s.io/community/contributors/design-proposals/release/versioning.md) describes the relationship between API versioning and software versioning. {{< /note >}} @@ -64,7 +64,7 @@ Here's a summary of each level: - The software is recommended for only non-business-critical uses because of potential for incompatible changes in subsequent releases. If you have multiple clusters which can be upgraded independently, you may be able to relax this restriction. {{< note >}} -**Note:** Try the beta features and provide feedback. After the features exit beta, it may not be practical to make more changes. +Try the beta features and provide feedback. After the features exit beta, it may not be practical to make more changes. {{< /note >}} - Stable: @@ -97,7 +97,7 @@ on the apiserver. `--runtime-config` accepts comma separated values. For example The flag accepts comma separated set of key=value pairs describing runtime configuration of the apiserver. {{< note >}} -**Note:** When you enable or disable groups or resources, you need to restart the apiserver and controller-manager +When you enable or disable groups or resources, you need to restart the apiserver and controller-manager to pick up the `--runtime-config` changes. {{< /note >}} diff --git a/content/en/docs/reference/using-api/deprecation-policy.md b/content/en/docs/reference/using-api/deprecation-policy.md index 565eb038ea..31cc4a6db2 100644 --- a/content/en/docs/reference/using-api/deprecation-policy.md +++ b/content/en/docs/reference/using-api/deprecation-policy.md @@ -57,7 +57,7 @@ can not be removed from that version or have its behavior significantly changed, regardless of track. {{< note >}} -**Note:** For historical reasons, there are 2 "monolithic" API groups - "core" (no +For historical reasons, there are 2 "monolithic" API groups - "core" (no group name) and "extensions". Resources will incrementally be moved from these legacy API groups into more domain-specific API groups. {{< /note >}} @@ -90,7 +90,7 @@ no less than:** This covers the maximum supported version skew of 2 releases. {{< note >}} -**Note:** Until [#52185](https://github.com/kubernetes/kubernetes/issues/52185) is +Until [#52185](https://github.com/kubernetes/kubernetes/issues/52185) is resolved, no API versions that have been persisted to storage may be removed. Serving REST endpoints for those versions may be disabled (subject to the deprecation timelines in this document), but the API server must remain capable diff --git a/content/en/docs/setup/certificates.md b/content/en/docs/setup/certificates.md index 3fffec6fcc..dc93af997f 100644 --- a/content/en/docs/setup/certificates.md +++ b/content/en/docs/setup/certificates.md @@ -30,7 +30,7 @@ Kubernetes requires PKI for the following operations: * Client and server certificates for the [front-proxy][proxy] {{< note >}} -**Note:** `front-proxy` certificates are required only if you run kube-proxy to support [an extension API server](/docs/tasks/access-kubernetes-api/setup-extension-api-server/). +`front-proxy` certificates are required only if you run kube-proxy to support [an extension API server](/docs/tasks/access-kubernetes-api/setup-extension-api-server/). {{< /note >}} etcd also implements mutual TLS to authenticate clients and peers. diff --git a/content/en/docs/setup/custom-cloud/kubespray.md b/content/en/docs/setup/custom-cloud/kubespray.md index 11671b501c..b181b087e9 100644 --- a/content/en/docs/setup/custom-cloud/kubespray.md +++ b/content/en/docs/setup/custom-cloud/kubespray.md @@ -103,7 +103,7 @@ You can upgrade your cluster by running the upgrade-cluster playbook. For more i You can reset your nodes and wipe out all components installed with Kubespray via the [reset playbook](https://github.com/kubernetes-incubator/kubespray/blob/master/reset.yml). {{< caution >}} -**Caution:** When running the reset playbook, be sure not to accidentally target your production cluster! +When running the reset playbook, be sure not to accidentally target your production cluster! {{< /caution >}} ## Feedback diff --git a/content/en/docs/setup/independent/create-cluster-kubeadm.md b/content/en/docs/setup/independent/create-cluster-kubeadm.md index 8ff6ae7e97..1b40c1acca 100644 --- a/content/en/docs/setup/independent/create-cluster-kubeadm.md +++ b/content/en/docs/setup/independent/create-cluster-kubeadm.md @@ -99,7 +99,7 @@ timeframe; which also applies to `kubeadm`. See ["Installing kubeadm"](/docs/setup/independent/install-kubeadm/). {{< note >}} -**Note:** If you have already installed kubeadm, run `apt-get update && +If you have already installed kubeadm, run `apt-get update && apt-get upgrade` or `yum update` to get the latest version of kubeadm. When you upgrade, the kubelet restarts every few seconds as it waits in a crashloop for @@ -228,7 +228,7 @@ created, and deleted with the `kubeadm token` command. See the ### Installing a pod network add-on {#pod-network} {{< caution >}} -**Caution:** This section contains important information about installation and deployment order. Read it carefully before proceeding. +This section contains important information about installation and deployment order. Read it carefully before proceeding. {{< /caution >}} You must install a pod network add-on so that your pods can communicate with @@ -465,7 +465,7 @@ The output is similar to this: ``` {{< note >}} -**Note:** To specify an IPv6 tuple for `:`, IPv6 address must be enclosed in square brackets, for example: `[fd00::101]:2073`. +To specify an IPv6 tuple for `:`, IPv6 address must be enclosed in square brackets, for example: `[fd00::101]:2073`. {{< /note >}} The output should look something like: @@ -498,7 +498,7 @@ kubectl --kubeconfig ./admin.conf get nodes ``` {{< note >}} -**Note:** The example above assumes SSH access is enabled for root. If that is not the +The example above assumes SSH access is enabled for root. If that is not the case, you can copy the `admin.conf` file to be accessible by some other user and `scp` using that other user instead. diff --git a/content/en/docs/setup/independent/high-availability.md b/content/en/docs/setup/independent/high-availability.md index 226409b48f..d88e419269 100644 --- a/content/en/docs/setup/independent/high-availability.md +++ b/content/en/docs/setup/independent/high-availability.md @@ -22,9 +22,9 @@ with upgrading your clusters, for example. We encourage you to try either approa and provide feedback. {{< caution >}} -**Caution**: This page does not address running your cluster on a cloud provider. -In a cloud environment, neither approach documented here works with Service objects -of type LoadBalancer, or with dynamic PersistentVolumes. +This page does not address running your cluster on a cloud provider. In a cloud +environment, neither approach documented here works with Service objects of type +LoadBalancer, or with dynamic PersistentVolumes. {{< /caution >}} {{% /capture %}} @@ -49,9 +49,8 @@ For the external etcd cluster only, you also need: - Three additional machines for etcd members {{< note >}} -**Note**: The following examples run Calico as the Pod networking provider. If -you run another networking provider, make sure to replace any default values as -needed. +The following examples run Calico as the Pod networking provider. If you run another +networking provider, make sure to replace any default values as needed. {{< /note >}} {{% /capture %}} @@ -61,8 +60,7 @@ needed. ## First steps for both methods {{< note >}} -**Note**: All commands in this guide on any control plane or etcd node should be -run as root. +All commands in this guide on any control plane or etcd node should be run as root. {{< /note >}} - Find your pod CIDR. For details, see [the CNI network @@ -102,9 +100,8 @@ run as root. ### Create load balancer for kube-apiserver {{< note >}} -**Note**: There are many configurations for load balancers. The following -example is only one option. Your cluster requirements may need a -different configuration. +There are many configurations for load balancers. The following example is only one +option. Your cluster requirements may need a different configuration. {{< /note >}} 1. Create a kube-apiserver load balancer with a name that resolves to DNS. @@ -140,7 +137,7 @@ different configuration. ### Bootstrap the first stacked control plane node {{< note >}} -**Note**: Optionally replace `stable` with a different version of Kubernetes, for example `v1.12.0`. +Optionally replace `stable` with a different version of Kubernetes, for example `v1.12.0`. {{< /note >}} 1. Create a `kubeadm-config.yaml` template file: @@ -217,7 +214,7 @@ done ``` {{< note >}} -**Note**: Remember that your config may differ from this example. +Remember that your config may differ from this example. {{< /note >}} ### Add the second stacked control plane node @@ -439,7 +436,7 @@ done 1. Create a `kubeadm-config.yaml`: {{< note >}} -**Note**: Optionally replace `stable` with a different version of Kubernetes, for example `v1.11.3`. +Optionally replace `stable` with a different version of Kubernetes, for example `v1.11.3`. {{< /note >}} apiVersion: kubeadm.k8s.io/v1alpha3 diff --git a/content/en/docs/setup/independent/setup-ha-etcd-with-kubeadm.md b/content/en/docs/setup/independent/setup-ha-etcd-with-kubeadm.md index 9e312d5464..2d5ea7c059 100644 --- a/content/en/docs/setup/independent/setup-ha-etcd-with-kubeadm.md +++ b/content/en/docs/setup/independent/setup-ha-etcd-with-kubeadm.md @@ -38,7 +38,7 @@ The general approach is to generate all certs on one node and only distribute the *necessary* files to the other nodes. {{< note >}} -**Note:** kubeadm contains all the necessary crytographic machinery to generate +kubeadm contains all the necessary crytographic machinery to generate the certificates described below; no other cryptographic tooling is required for this example. {{< /note >}} diff --git a/content/en/docs/setup/independent/troubleshooting-kubeadm.md b/content/en/docs/setup/independent/troubleshooting-kubeadm.md index 1f5878efac..70a29a3f94 100644 --- a/content/en/docs/setup/independent/troubleshooting-kubeadm.md +++ b/content/en/docs/setup/independent/troubleshooting-kubeadm.md @@ -259,7 +259,7 @@ kubectl -n kube-system get deployment coredns -o yaml | \ ``` {{< warning >}} -**Warning**: Disabling SELinux or setting `allowPrivilegeEscalation` to `true` can compromise +Disabling SELinux or setting `allowPrivilegeEscalation` to `true` can compromise the security of your cluster. {{< /warning >}} diff --git a/content/en/docs/setup/minikube.md b/content/en/docs/setup/minikube.md index 8e763c777d..aa2143e4c3 100644 --- a/content/en/docs/setup/minikube.md +++ b/content/en/docs/setup/minikube.md @@ -337,7 +337,9 @@ spec: ## Mounted Host Folders Some drivers will mount a host folder within the VM so that you can easily share files between the VM and host. These are not configurable at the moment and different for the driver and OS you are using. -**Note:** Host folder sharing is not implemented in the KVM driver yet. +{{< note >}} +Host folder sharing is not implemented in the KVM driver yet. +{{< /note >}} | Driver | OS | HostFolder | VM | | --- | --- | --- | --- | diff --git a/content/en/docs/setup/multiple-zones.md b/content/en/docs/setup/multiple-zones.md index 5256d703b0..81d4a32ded 100644 --- a/content/en/docs/setup/multiple-zones.md +++ b/content/en/docs/setup/multiple-zones.md @@ -199,12 +199,14 @@ kubectl create -f - <}} +For version 1.3+ Kubernetes will distribute dynamic PV claims across the configured zones. For version 1.2, dynamic persistent volumes were always created in the zone of the cluster master (here us-central1-a / us-west-2a); that issue ([#23330](https://github.com/kubernetes/kubernetes/issues/23330)) was addressed in 1.3+. +{{< /note >}} Now lets validate that Kubernetes automatically labeled the zone & region the PV was created in. diff --git a/content/en/docs/setup/on-premises-metal/krib.md b/content/en/docs/setup/on-premises-metal/krib.md index e37376e464..4438b6a7e0 100644 --- a/content/en/docs/setup/on-premises-metal/krib.md +++ b/content/en/docs/setup/on-premises-metal/krib.md @@ -11,7 +11,7 @@ This guide helps to install a Kubernetes cluster hosted on bare metal with [Digi Digital Rebar Provision (DRP) is an integrated Golang DHCP, bare metal provisioning (PXE/iPXE) and workflow automation platform. While [DRP can be used to invoke](https://provision.readthedocs.io/en/tip/doc/integrations/ansible.html) [kubespray](../kubespray), it also offers a self-contained Kubernetes installation known as [KRIB (Kubernetes Rebar Integrated Bootstrap)](https://github.com/digitalrebar/provision-content/tree/master/krib). {{< note >}} -**Note:** KRIB is not a _stand-alone_ installer: Digital Rebar templates drive a standard *[kubeadm](/docs/admin/kubeadm/)* configuration that manages the Kubernetes installation with the [Digital Rebar cluster pattern](https://provision.readthedocs.io/en/tip/doc/arch/cluster.html#rs-cluster-pattern) to elect leaders _without external supervision_. +KRIB is not a _stand-alone_ installer: Digital Rebar templates drive a standard *[kubeadm](/docs/admin/kubeadm/)* configuration that manages the Kubernetes installation with the [Digital Rebar cluster pattern](https://provision.readthedocs.io/en/tip/doc/arch/cluster.html#rs-cluster-pattern) to elect leaders _without external supervision_. {{< /note >}} @@ -43,7 +43,7 @@ Upload the KRIB Content bundle (or build from [source](https://github.com/digita ### (3/5) Start your cluster deployment {{< note >}} -**Note:** KRIB documentation is dynamically generated from the source and will be more up to date than this guide. +KRIB documentation is dynamically generated from the source and will be more up to date than this guide. {{< /note >}} Following the [KRIB documentation](https://provision.readthedocs.io/en/tip/doc/content-packages/krib.html), create a Profile for your cluster and assign your target servers into the cluster Profile. The Profile must set `krib\cluster-name` and `etcd\cluster-name` Params to be the name of the Profile. Cluster configuration choices can be made by adding additional Params to the Profile; however, safe defaults are provided for all Params. @@ -86,7 +86,7 @@ You can add servers into your cluster by adding the cluster Profile to the serve You can reset your cluster and wipe out all configuration and TLS certificates using the `krib-reset-cluster` Workflow on any of the servers in the cluster. {{< caution >}} -**Caution:** When running the reset Workflow, be sure not to accidentally target your production cluster! +When running the reset Workflow, be sure not to accidentally target your production cluster! {{< /caution >}} ## Feedback diff --git a/content/en/docs/setup/pick-right-solution.md b/content/en/docs/setup/pick-right-solution.md index 1686f43f4c..1fed1a600c 100644 --- a/content/en/docs/setup/pick-right-solution.md +++ b/content/en/docs/setup/pick-right-solution.md @@ -226,9 +226,8 @@ Agile Stacks | Terraform | CoreOS | multi-support | [docs](https://www.a IBM Cloud Kubernetes Service | | Ubuntu | calico | [docs](https://console.bluemix.net/docs/containers/container_index.html) | Commercial Digital Rebar | kubeadm | any | metal | [docs](/docs/setup/on-premises-metal/krib/) | Community ([@digitalrebar](https://github.com/digitalrebar)) - {{< note >}} -**Note:** The above table is ordered by version test/used in nodes, followed by support level. +The above table is ordered by version test/used in nodes, followed by support level. {{< /note >}} ### Definition of columns diff --git a/content/en/docs/setup/release/notes.md b/content/en/docs/setup/release/notes.md index 45f6f83ae1..b834dbb885 100644 --- a/content/en/docs/setup/release/notes.md +++ b/content/en/docs/setup/release/notes.md @@ -556,7 +556,7 @@ filename | sha256 hash * The PodShareProcessNamespace feature to configure PID namespace sharing within a pod has been promoted to beta. ([#66507](https://github.com/kubernetes/kubernetes/pull/66507), [@verb](https://github.com/verb)) * `kubectl create {clusterrole,role}`'s `--resources` flag supports asterisk to specify all resources. ([#62945](https://github.com/kubernetes/kubernetes/pull/62945), [@nak3](https://github.com/nak3)) * Bump up version number of debian-base, debian-hyperkube-base and debian-iptables. ([#67026](https://github.com/kubernetes/kubernetes/pull/67026), [@satyasm](https://github.com/satyasm)) - * Also updates dependencies of users of debian-base. + * Also updates dependencies of users of debian-base. * debian-base version 0.3.1 is already available. * DynamicProvisioningScheduling and VolumeScheduling is now supported for Azure managed disks. Feature gates DynamicProvisioningScheduling and VolumeScheduling should be enabled before using this feature. ([#67121](https://github.com/kubernetes/kubernetes/pull/67121), [@feiskyer](https://github.com/feiskyer)) * kube-apiserver now includes all registered API groups in discovery, including registered extension API group/versions for unavailable extension API servers. ([#66932](https://github.com/kubernetes/kubernetes/pull/66932), [@nilebox](https://github.com/nilebox)) diff --git a/content/en/docs/setup/scratch.md b/content/en/docs/setup/scratch.md index 8645a487ab..3068e24865 100644 --- a/content/en/docs/setup/scratch.md +++ b/content/en/docs/setup/scratch.md @@ -487,11 +487,11 @@ You will need to run one or more instances of etcd. - Not highly available, but easy to restore - Run one etcd instance, with its log written to a directory backed by durable storage (RAID, GCE PD). - {{< note >}}**Note:** May result in operations outages in case of + {{< note >}}May result in operations outages in case of instance outage. {{< /note >}} - Highly available - Run 3 or 5 etcd instances with non durable storage. - {{< note >}}**Note:** Log can be written to non-durable storage + {{< note >}}Log can be written to non-durable storage because storage is replicated.{{< /note >}} See [cluster-troubleshooting](/docs/admin/cluster-troubleshooting/) for more discussion on factors affecting cluster diff --git a/content/en/docs/setup/turnkey/gce.md b/content/en/docs/setup/turnkey/gce.md index 85d659c47e..90618e1dac 100644 --- a/content/en/docs/setup/turnkey/gce.md +++ b/content/en/docs/setup/turnkey/gce.md @@ -96,7 +96,7 @@ gcloud components install kubectl ``` {{< note >}} -**Note:** The kubectl version bundled with `gcloud` may be older than the one +The kubectl version bundled with `gcloud` may be older than the one downloaded by the get.k8s.io install script. See [Installing kubectl](/docs/tasks/kubectl/install/) document to see how you can set up the latest `kubectl` on your workstation. {{< /note >}} diff --git a/content/en/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md b/content/en/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md index 236e91bc8d..ee4bd7a8c3 100644 --- a/content/en/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md +++ b/content/en/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md @@ -13,7 +13,7 @@ one or more configuration files, you can quickly switch between clusters by usin `kubectl config use-context` command. {{< note >}} -**Note:** A file that is used to configure access to a cluster is sometimes called +A file that is used to configure access to a cluster is sometimes called a *kubeconfig file*. This is a generic way of referring to configuration files. It does not mean that there is a file named `kubeconfig`. {{< /note >}} diff --git a/content/en/docs/tasks/access-application-cluster/configure-cloud-provider-firewall.md b/content/en/docs/tasks/access-application-cluster/configure-cloud-provider-firewall.md index 4684387872..1c9e130aee 100644 --- a/content/en/docs/tasks/access-application-cluster/configure-cloud-provider-firewall.md +++ b/content/en/docs/tasks/access-application-cluster/configure-cloud-provider-firewall.md @@ -84,12 +84,11 @@ gcloud compute firewall-rules create my-rule --allow=tcp: ``` {{< note >}} -**Note**: GCE firewalls are defined per-vm, rather than per-ip -address. This means that when you open a firewall for a service's ports, -anything that serves on that port on that VM's host IP address may potentially -serve traffic. Note that this is not a problem for other Kubernetes services, -as they listen on IP addresses that are different than the host node's external -IP address. +GCE firewalls are defined per-vm, rather than per-ip address. This means that +when you open a firewall for a service's ports, anything that serves on that +port on that VM's host IP address may potentially serve traffic. Note that this +is not a problem for other Kubernetes services, as they listen on IP addresses +that are different than the host node's external IP address. Consider: diff --git a/content/en/docs/tasks/access-application-cluster/connecting-frontend-backend.md b/content/en/docs/tasks/access-application-cluster/connecting-frontend-backend.md index c1e7b4a2ba..a447e85d16 100644 --- a/content/en/docs/tasks/access-application-cluster/connecting-frontend-backend.md +++ b/content/en/docs/tasks/access-application-cluster/connecting-frontend-backend.md @@ -148,11 +148,13 @@ deployment.apps/frontend created service/frontend created ``` -{{< note >}}**Note:** The nginx configuration is baked into the -[container image](/examples/service/access/Dockerfile). -A better way to do this would be to use a -[ConfigMap](/docs/tasks/configure-pod-container/configure-pod-configmap/), so -you can change the configuration more easily.{{< /note >}} +{{< note >}} +The nginx configuration is baked into the [container +image](/examples/service/access/Dockerfile). A better way to do this would +be to use a +[ConfigMap](/docs/tasks/configure-pod-container/configure-pod-configmap/), +so that you can change the configuration more easily. +{{< /note >}} ### Interact with the frontend Service diff --git a/content/en/docs/tasks/access-application-cluster/create-external-load-balancer.md b/content/en/docs/tasks/access-application-cluster/create-external-load-balancer.md index b79dcb02ed..22c601d3d1 100644 --- a/content/en/docs/tasks/access-application-cluster/create-external-load-balancer.md +++ b/content/en/docs/tasks/access-application-cluster/create-external-load-balancer.md @@ -108,8 +108,9 @@ which should produce output like this: The IP address is listed next to `LoadBalancer Ingress`. {{< note >}} -**Note**: If you are running your service on Minikube, you can find the assigned IP address and port with: +If you are running your service on Minikube, you can find the assigned IP address and port with: {{< /note >}} + ```bash minikube service example-service --url ``` @@ -181,7 +182,7 @@ compared to the `service.spec.externalTrafficPolicy` field. The values match as * "Global" for annotation <-> "Cluster" for field {{< note >}} -**Note:** This feature is not currently implemented for all cloudproviders/environments. +This feature is not currently implemented for all cloudproviders/environments. {{< /note >}} Known issues: diff --git a/content/en/docs/tasks/access-application-cluster/list-all-running-container-images.md b/content/en/docs/tasks/access-application-cluster/list-all-running-container-images.md index 0b6c1fb8e4..caf20d7f2e 100644 --- a/content/en/docs/tasks/access-application-cluster/list-all-running-container-images.md +++ b/content/en/docs/tasks/access-application-cluster/list-all-running-container-images.md @@ -63,7 +63,7 @@ The jsonpath is interpreted as follows: - `.image`: get the image {{< note >}} -**Note:** When fetching a single Pod by name, e.g. `kubectl get pod nginx`, +When fetching a single Pod by name, e.g. `kubectl get pod nginx`, the `.items[*]` portion of the path should be omitted because a single Pod is returned instead of a list of items. {{< /note >}} diff --git a/content/en/docs/tasks/access-application-cluster/load-balance-access-application-cluster.md b/content/en/docs/tasks/access-application-cluster/load-balance-access-application-cluster.md index d45cf2493d..29058660b8 100644 --- a/content/en/docs/tasks/access-application-cluster/load-balance-access-application-cluster.md +++ b/content/en/docs/tasks/access-application-cluster/load-balance-access-application-cluster.md @@ -71,7 +71,7 @@ load-balanced access to an application running in a cluster. command. {{< note >}} - **Note:** If you are using Minikube, you don't get an external IP address. The + If you are using Minikube, you don't get an external IP address. The external IP address remains in the pending state. {{< /note >}} @@ -90,7 +90,7 @@ load-balanced access to an application running in a cluster. Hello Kubernetes! {{< note >}} - **Note:** If you are using Minikube, enter these commands: + If you are using Minikube, enter these commands: {{< /note >}} kubectl cluster-info diff --git a/content/en/docs/tasks/access-application-cluster/port-forward-access-application-cluster.md b/content/en/docs/tasks/access-application-cluster/port-forward-access-application-cluster.md index 8c3fda3cea..a303b9a878 100644 --- a/content/en/docs/tasks/access-application-cluster/port-forward-access-application-cluster.md +++ b/content/en/docs/tasks/access-application-cluster/port-forward-access-application-cluster.md @@ -137,7 +137,7 @@ is running the Redis server. With this connection in place you can use your local workstation to debug the database that is running in the pod. {{< warning >}} -**Warning**: Due to known limitations, port forward today only works for TCP protocol. +Due to known limitations, port forward today only works for TCP protocol. The support to UDP protocol is being tracked in [issue 47862](https://github.com/kubernetes/kubernetes/issues/47862). {{< /warning >}} diff --git a/content/en/docs/tasks/access-kubernetes-api/configure-aggregation-layer.md b/content/en/docs/tasks/access-kubernetes-api/configure-aggregation-layer.md index 2781881e1b..87fa9bd717 100644 --- a/content/en/docs/tasks/access-kubernetes-api/configure-aggregation-layer.md +++ b/content/en/docs/tasks/access-kubernetes-api/configure-aggregation-layer.md @@ -19,7 +19,7 @@ Configuring the [aggregation layer](/docs/concepts/api-extension/apiserver-aggre {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} {{< note >}} -**Note:** There are a few setup requirements for getting the aggregation layer working in your environment to support mutual TLS auth between the proxy and extension apiservers. Kubernetes and the kube-apiserver have multiple CAs, so make sure that the proxy is signed by the aggregation layer CA and not by something else, like the master CA. +There are a few setup requirements for getting the aggregation layer working in your environment to support mutual TLS auth between the proxy and extension apiservers. Kubernetes and the kube-apiserver have multiple CAs, so make sure that the proxy is signed by the aggregation layer CA and not by something else, like the master CA. {{< /note >}} {{% /capture %}} diff --git a/content/en/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definition-versioning.md b/content/en/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definition-versioning.md index 11d22745c7..ecf3ec0038 100644 --- a/content/en/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definition-versioning.md +++ b/content/en/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definition-versioning.md @@ -15,8 +15,8 @@ level of your CustomResourceDefinitions. It also describes how to upgrade an object from one version to another. {{< note >}} -**Note**: All specified versions must use the same schema. The is no schema -conversion between versions. +All specified versions must use the same schema. There is no schema conversion +between versions. {{< /note >}} {{% /capture %}} diff --git a/content/en/docs/tasks/administer-cluster/configure-upgrade-etcd.md b/content/en/docs/tasks/administer-cluster/configure-upgrade-etcd.md index bd0f59d948..0e5a553571 100644 --- a/content/en/docs/tasks/administer-cluster/configure-upgrade-etcd.md +++ b/content/en/docs/tasks/administer-cluster/configure-upgrade-etcd.md @@ -105,7 +105,7 @@ For example, consider key pairs `k8sclient.key` and `k8sclient.cert` that are tr Once etcd is configured correctly, only clients with valid certificates can access it. To give Kubernetes API server the access, configure it with the flags `--etcd-certfile=k8sclient.cert`,`--etcd-keyfile=k8sclient.key` and `--etcd-cafile=ca.cert`. {{< note >}} -**Note**: etcd authentication is not currently supported by Kubernetes. For more information, see the related issue [Support Basic Auth for Etcd v2](https://github.com/kubernetes/kubernetes/issues/23398). +etcd authentication is not currently supported by Kubernetes. For more information, see the related issue [Support Basic Auth for Etcd v2](https://github.com/kubernetes/kubernetes/issues/23398). {{< /note >}} ## Replacing a failed etcd member @@ -212,7 +212,7 @@ The upgrade procedure described in this document assumes that either: etcd cluster. During the time the etcd cluster is shut down, the Kubernetes API Server will be read only. {{< warning >}} -**Warning**: Deviations from the assumptions are untested by continuous +Deviations from the assumptions are untested by continuous integration, and deviations might create undesirable consequences. Additional information about operating an etcd cluster is available [from the etcd maintainers](https://github.com/coreos/etcd/tree/master/Documentation). {{< /warning >}} @@ -264,7 +264,7 @@ but the rollback tool has these limitations: * Rollback doesn鈥檛 preserve resource versions of objects stored in etcd. {{< warning >}} -**Warning**: If the data is not kept in `application/json` format (see [Upgrade +If the data is not kept in `application/json` format (see [Upgrade Procedure](#upgrade-procedure)), you will lose the option to roll back to etcd 2.2. {{< /warning >}} @@ -276,7 +276,7 @@ resource versions. Since both the kubelet and kube-proxy use the watch API, a rollback might require restarting all Kubernetes components on all nodes. {{< note >}} -**Note**: At the time of writing, both Kubelet and KubeProxy are using 鈥渞esource +At the time of writing, both Kubelet and KubeProxy are using 鈥渞esource version鈥 only for watching (i.e. are not using resource versions for anything else). And both are using reflector and/or informer frameworks for watching (i.e. they don鈥檛 send watch requests themselves). Both those frameworks if they @@ -390,7 +390,7 @@ STORAGE_MEDIA_TYPE=application/json ``` {{< note >}} -**Note:** This procedure upgrades from 2.x to 3.x. Version `3.0.17` is not recommended for running in production (see [prerequisites](#prerequisites) for minimum recommended etcd versions). +This procedure upgrades from 2.x to 3.x. Version `3.0.17` is not recommended for running in production (see [prerequisites](#prerequisites) for minimum recommended etcd versions). {{< /note >}} ## Notes for etcd Version 2.2.1 diff --git a/content/en/docs/tasks/administer-cluster/coredns.md b/content/en/docs/tasks/administer-cluster/coredns.md index e0d6c30e3b..e314f490e7 100644 --- a/content/en/docs/tasks/administer-cluster/coredns.md +++ b/content/en/docs/tasks/administer-cluster/coredns.md @@ -52,7 +52,7 @@ your existing Corefile will be retained. ## Installing kube-dns instead of CoreDNS with kubeadm {{< note >}} -**Note:** In Kubernetes 1.11, CoreDNS has graduated to General Availability (GA) +In Kubernetes 1.11, CoreDNS has graduated to General Availability (GA) and is installed by default. {{< /note >}} diff --git a/content/en/docs/tasks/administer-cluster/cpu-management-policies.md b/content/en/docs/tasks/administer-cluster/cpu-management-policies.md index c5b2a029d8..313e468636 100644 --- a/content/en/docs/tasks/administer-cluster/cpu-management-policies.md +++ b/content/en/docs/tasks/administer-cluster/cpu-management-policies.md @@ -75,16 +75,16 @@ The `static` policy allows containers in `Guaranteed` pods with integer CPU using the [cpuset cgroup controller](https://www.kernel.org/doc/Documentation/cgroup-v1/cpusets.txt). {{< note >}} -**Note:** System services such as the container runtime and the kubelet itself can continue to run on these exclusive CPUs. 聽The exclusivity only extends to other pods. +System services such as the container runtime and the kubelet itself can continue to run on these exclusive CPUs. 聽The exclusivity only extends to other pods. {{< /note >}} {{< note >}} -**Note:** The alpha version of this policy does not guarantee static +The alpha version of this policy does not guarantee static exclusive allocations across Kubelet restarts. {{< /note >}} {{< note >}} -**Note:** CPU Manager doesn't support offlining and onlining of +CPU Manager doesn't support offlining and onlining of CPUs at runtime. Also, if the set of online CPUs changes on the node, the node must be drained and CPU manager manually reset by deleting the state file `cpu_manager_state` in the kubelet root directory. @@ -102,7 +102,7 @@ both part of a `Guaranteed` pod and have integer CPU `requests` are assigned exclusive CPUs. {{< note >}} -**Note:** The kubelet requires a CPU reservation greater than zero be made +The kubelet requires a CPU reservation greater than zero be made using either `--kube-reserved` and/or `--system-reserved` when the static policy is enabled. This is because zero CPU reservation would allow the shared pool to become empty. diff --git a/content/en/docs/tasks/administer-cluster/declare-network-policy.md b/content/en/docs/tasks/administer-cluster/declare-network-policy.md index db27d97ce5..3ea02e0ed4 100644 --- a/content/en/docs/tasks/administer-cluster/declare-network-policy.md +++ b/content/en/docs/tasks/administer-cluster/declare-network-policy.md @@ -21,7 +21,9 @@ Make sure you've configured a network provider with network policy support. Ther * [Romana](/docs/tasks/administer-cluster/network-policy-provider/romana-network-policy/) * [Weave Net](/docs/tasks/administer-cluster/network-policy-provider/weave-network-policy/) -**Note**: The above list is sorted alphabetically by product name, not by recommendation or preference. This example is valid for a Kubernetes cluster using any of these providers. +{{< note >}} +The above list is sorted alphabetically by product name, not by recommendation or preference. This example is valid for a Kubernetes cluster using any of these providers. +{{< /note >}} {{% /capture %}} {{% capture steps %}} diff --git a/content/en/docs/tasks/administer-cluster/encrypt-data.md b/content/en/docs/tasks/administer-cluster/encrypt-data.md index b7b5eec380..e06ceda9f8 100644 --- a/content/en/docs/tasks/administer-cluster/encrypt-data.md +++ b/content/en/docs/tasks/administer-cluster/encrypt-data.md @@ -66,9 +66,11 @@ resources from storage each provider that matches the stored data attempts to de order. If no provider can read the stored data due to a mismatch in format or secret key, an error is returned which prevents clients from accessing that resource. -**IMPORTANT:** If any resource is not readable via the encryption config (because keys were changed), +{{< caution >}} +If any resource is not readable via the encryption config (because keys were changed), the only recourse is to delete that key from the underlying etcd directly. Calls that attempt to read that resource will fail until it is deleted or a valid decryption key is provided. +{{< /caution >}} ### Providers: @@ -113,7 +115,9 @@ To create a new secret perform the following steps: 3. Set the `--experimental-encryption-provider-config` flag on the `kube-apiserver` to point to the location of the config file. 4. Restart your API server. -**IMPORTANT:** Your config file contains keys that can decrypt content in etcd, so you must properly restrict permissions on your masters so only the user who runs the kube-apiserver can read it. +{{< caution >}} +Your config file contains keys that can decrypt content in etcd, so you must properly restrict permissions on your masters so only the user who runs the kube-apiserver can read it. +{{< /caution >}} ## Verifying that data is encrypted diff --git a/content/en/docs/tasks/administer-cluster/extended-resource-node.md b/content/en/docs/tasks/administer-cluster/extended-resource-node.md index 7eb65c3251..6b65cd875f 100644 --- a/content/en/docs/tasks/administer-cluster/extended-resource-node.md +++ b/content/en/docs/tasks/administer-cluster/extended-resource-node.md @@ -74,10 +74,12 @@ curl --header "Content-Type: application/json-patch+json" \ http://localhost:8001/api/v1/nodes//status ``` -**Note**: In the preceding request, `~1` is the encoding for the character / in +{{< note >}} +In the preceding request, `~1` is the encoding for the character / in the patch path. The operation path value in JSON-Patch is interpreted as a JSON-Pointer. For more details, see [IETF RFC 6901](https://tools.ietf.org/html/rfc6901), section 3. +{{< /note >}} The output shows that the Node has a capacity of 4 dongles: diff --git a/content/en/docs/tasks/administer-cluster/ip-masq-agent.md b/content/en/docs/tasks/administer-cluster/ip-masq-agent.md index 25d114d139..6133d160c4 100644 --- a/content/en/docs/tasks/administer-cluster/ip-masq-agent.md +++ b/content/en/docs/tasks/administer-cluster/ip-masq-agent.md @@ -73,14 +73,16 @@ kubectl label nodes my-node beta.kubernetes.io/masq-agent-ds-ready=true More information can be found in the ip-masq-agent documentation [here](https://github.com/kubernetes-incubator/ip-masq-agent) In most cases, the default set of rules should be sufficient; however, if this is not the case for your cluster, you can create and apply a [ConfigMap](/docs/tasks/configure-pod-container/configure-pod-configmap/) to customize the IP ranges that are affected. For example, to allow only 10.0.0.0/8 to be considered by the ip-masq-agent, you can create the following [ConfigMap](/docs/tasks/configure-pod-container/configure-pod-configmap/) in a file called "config". -**Note:** It is important that the file is called config since, by default, that will be used as the key for lookup by the ip-masq-agent: + +{{< note >}} +It is important that the file is called config since, by default, that will be used as the key for lookup by the ip-masq-agent: ``` nonMasqueradeCIDRs: - 10.0.0.0/8 resyncInterval: 60s - ``` +{{< /note >}} Run the following command to add the config map to your cluster: diff --git a/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha.md b/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha.md index 9e08a7262b..de9296644f 100644 --- a/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha.md +++ b/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha.md @@ -24,8 +24,7 @@ Before proceeding: - Check the prerequisites for [Upgrading/downgrading kubeadm clusters between v1.11 to v1.12](/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-1-12/). {{< note >}} -**Note**: All commands on any control plane or etcd node should be -run as root. +All commands on any control plane or etcd node should be run as root. {{< /note >}} {{% /capture %}} diff --git a/content/en/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace.md b/content/en/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace.md index d840b61371..249265300f 100644 --- a/content/en/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace.md +++ b/content/en/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace.md @@ -82,7 +82,7 @@ CPU request and limit to the Container. * Verify that the Container specifies a CPU limit that is less than or equal to 800 millicpu. {{< note >}} -**Note:** When creating a `LimitRange` object, you can specify limits on huge-pages +When creating a `LimitRange` object, you can specify limits on huge-pages or GPUs as well. However, when both `default` and `defaultRequest` are specified on these resources, the two values must be the same. {{< /note >}} diff --git a/content/en/docs/tasks/administer-cluster/namespaces.md b/content/en/docs/tasks/administer-cluster/namespaces.md index 0e24a21dc9..ce1ebbce3d 100644 --- a/content/en/docs/tasks/administer-cluster/namespaces.md +++ b/content/en/docs/tasks/administer-cluster/namespaces.md @@ -106,7 +106,9 @@ More information on `finalizers` can be found in the namespace [design doc](http $ kubectl delete namespaces ``` -**WARNING, this deletes _everything_ under the namespace!** +{{< warning >}} +This deletes _everything_ under the namespace! +{{< /warning >}} This delete is asynchronous, so for a time you will see the namespace in the `Terminating` state. diff --git a/content/en/docs/tasks/administer-cluster/reconfigure-kubelet.md b/content/en/docs/tasks/administer-cluster/reconfigure-kubelet.md index 5d2a1f615d..f984c4c5fd 100644 --- a/content/en/docs/tasks/administer-cluster/reconfigure-kubelet.md +++ b/content/en/docs/tasks/administer-cluster/reconfigure-kubelet.md @@ -14,7 +14,7 @@ allows you to change the configuration of each Kubelet in a live Kubernetes cluster by deploying a ConfigMap and configuring each Node to use it. {{< warning >}} -**Warning:** All Kubelet configuration parameters can be changed dynamically, +All Kubelet configuration parameters can be changed dynamically, but this is unsafe for some parameters. Before deciding to change a parameter dynamically, you need a strong understanding of how that change will affect your cluster's behavior. Always carefully test configuration changes on a small set @@ -69,7 +69,7 @@ This document only describes a single Node consuming each ConfigMap. Keep in mind that it is also valid for multiple Nodes to consume the same ConfigMap. {{< warning >}} -**Warning:** While it is *possible* to change the configuration by +While it is *possible* to change the configuration by updating the ConfigMap in-place, this causes all Kubelets configured with that ConfigMap to update simultaneously. It is much safer to treat ConfigMaps as immutable by convention, aided by `kubectl`'s `--append-hash` option, diff --git a/content/en/docs/tasks/administer-cluster/safely-drain-node.md b/content/en/docs/tasks/administer-cluster/safely-drain-node.md index cea4c00af0..2cb77e3149 100644 --- a/content/en/docs/tasks/administer-cluster/safely-drain-node.md +++ b/content/en/docs/tasks/administer-cluster/safely-drain-node.md @@ -37,10 +37,12 @@ hardware maintenance, etc.). Safe evictions allow the pod's containers to [gracefully terminate](/docs/concepts/workloads/pods/pod/#termination-of-pods) and will respect the `PodDisruptionBudgets` you have specified. -**Note:** By default `kubectl drain` will ignore certain system pods on the node +{{< note >}} +By default `kubectl drain` will ignore certain system pods on the node that cannot be killed; see the [kubectl drain](/docs/reference/generated/kubectl/kubectl-commands/#drain) documentation for more details. +{{< /note >}} When `kubectl drain` returns successfully, that indicates that all of the pods (except the ones excluded as described in the previous paragraph) diff --git a/content/en/docs/tasks/administer-cluster/securing-a-cluster.md b/content/en/docs/tasks/administer-cluster/securing-a-cluster.md index 0512f8b09a..36de25de82 100644 --- a/content/en/docs/tasks/administer-cluster/securing-a-cluster.md +++ b/content/en/docs/tasks/administer-cluster/securing-a-cluster.md @@ -165,10 +165,12 @@ credentials from the API servers to their etcd server, such as mutual auth via T and it is often recommended to isolate the etcd servers behind a firewall that only the API servers may access. -**CAUTION:** Allowing other components within the cluster to access the master etcd instance with +{{< caution >}} +Allowing other components within the cluster to access the master etcd instance with read or write access to the full keyspace is equivalent to granting cluster-admin access. Using separate etcd instances for non-master components or using etcd ACLs to restrict read and write access to a subset of the keyspace is strongly recommended. +{{< /caution >}} ### Enable audit logging diff --git a/content/en/docs/tasks/administer-cluster/static-pod.md b/content/en/docs/tasks/administer-cluster/static-pod.md index 87dad377cd..1499c6b14a 100644 --- a/content/en/docs/tasks/administer-cluster/static-pod.md +++ b/content/en/docs/tasks/administer-cluster/static-pod.md @@ -100,11 +100,10 @@ Labels from the static pod are propagated into the mirror-pod and can be used as Notice we cannot delete the pod with the API server (e.g. via [`kubectl`](/docs/user-guide/kubectl/) command), kubelet simply won't remove it. -{{}} -**Note**: Make sure the kubelet has permission to create the mirror pod in the API server. -If not, the creation request is rejected by the API server. See +{{< note >}} +Make sure the kubelet has permission to create the mirror pod in the API server. If not, the creation request is rejected by the API server. See [PodSecurityPolicy](/docs/concepts/policy/pod-security-policy/). -{{}} +{{< /note >}} ```shell [joe@my-master ~] $ kubectl delete pod static-web-my-node1 diff --git a/content/en/docs/tasks/administer-cluster/sysctl-cluster.md b/content/en/docs/tasks/administer-cluster/sysctl-cluster.md index 46dc23cdf1..3fadc04540 100644 --- a/content/en/docs/tasks/administer-cluster/sysctl-cluster.md +++ b/content/en/docs/tasks/administer-cluster/sysctl-cluster.md @@ -58,7 +58,7 @@ The following sysctls are supported in the _safe_ set: - `net.ipv4.tcp_syncookies`. {{< note >}} -**Note**: The example `net.ipv4.tcp_syncookies` is not namespaced on Linux kernel version 4.4 or lower. +The example `net.ipv4.tcp_syncookies` is not namespaced on Linux kernel version 4.4 or lower. {{< /note >}} This list will be extended in future Kubernetes versions when the kubelet @@ -141,7 +141,7 @@ spec: {{% capture discussion %}} {{< warning >}} -**Warning**: Due to their nature of being _unsafe_, the use of _unsafe_ sysctls +Due to their nature of being _unsafe_, the use of _unsafe_ sysctls is at-your-own-risk and can lead to severe problems like wrong behavior of containers, resource shortage or complete breakage of a node. {{< /warning >}} @@ -184,7 +184,7 @@ Do not configure these two fields such that there is overlap, meaning that a given sysctl is both allowed and forbidden. {{< warning >}} -**Warning**: If you whitelist unsafe sysctls via the `allowedUnsafeSysctls` field +If you whitelist unsafe sysctls via the `allowedUnsafeSysctls` field in a PodSecurityPolicy, any pod using such a sysctl will fail to start if the sysctl is not whitelisted via the `--allowed-unsafe-sysctls` kubelet flag as well on that node. diff --git a/content/en/docs/tasks/administer-federation/configmap.md b/content/en/docs/tasks/administer-federation/configmap.md index cae4847081..4123b4ab22 100644 --- a/content/en/docs/tasks/administer-federation/configmap.md +++ b/content/en/docs/tasks/administer-federation/configmap.md @@ -81,7 +81,7 @@ kubectl --context=federation-cluster delete configmap ``` {{< note >}} -**Note:** Deleting a Federated ConfigMap does not delete the corresponding ConfigMaps from underlying clusters. You must delete the underlying ConfigMaps manually. +Deleting a Federated ConfigMap does not delete the corresponding ConfigMaps from underlying clusters. You must delete the underlying ConfigMaps manually. {{< /note >}} {{% /capture %}} diff --git a/content/en/docs/tasks/administer-federation/hpa.md b/content/en/docs/tasks/administer-federation/hpa.md index 5ca0363e1c..496a7032a6 100644 --- a/content/en/docs/tasks/administer-federation/hpa.md +++ b/content/en/docs/tasks/administer-federation/hpa.md @@ -87,7 +87,7 @@ max replicas on the federated HPA object, and the sum of minimum replicas will b than or equal to the minimum specified on the federated HPA object. {{< note >}} -**Note:** A particular cluster cannot have a minimum replica sum of 0. +A particular cluster cannot have a minimum replica sum of 0. {{< /note >}} ### Spreading HPA min and max replicas in underlying clusters @@ -125,8 +125,9 @@ in the previous section. You can delete a federated HPA as you would delete a Kubernetes HPA; however, for a federated HPA, you must send the request to the federation API server instead of to a specific Kubernetes cluster. + {{< note >}} -**Note:** For the federated resource to be deleted from all underlying clusters, [cascading deletion](/docs/concepts/cluster-administration/federation/#cascading-deletion) should be used. +For the federated resource to be deleted from all underlying clusters, [cascading deletion](/docs/concepts/cluster-administration/federation/#cascading-deletion) should be used. {{< /note >}} For example, you can do that using `kubectl` by running: diff --git a/content/en/docs/tasks/administer-federation/job.md b/content/en/docs/tasks/administer-federation/job.md index cf631f5154..d495d1e42e 100644 --- a/content/en/docs/tasks/administer-federation/job.md +++ b/content/en/docs/tasks/administer-federation/job.md @@ -99,7 +99,7 @@ kubectl --context=federation-cluster delete job myjob ``` {{< note >}} -**Note:** Deleting a federated job will not delete the +Deleting a federated job will not delete the corresponding jobs from underlying clusters. You must delete the underlying jobs manually. {{< /note >}} diff --git a/content/en/docs/tasks/administer-federation/namespaces.md b/content/en/docs/tasks/administer-federation/namespaces.md index df60610814..bf8cd84c35 100644 --- a/content/en/docs/tasks/administer-federation/namespaces.md +++ b/content/en/docs/tasks/administer-federation/namespaces.md @@ -84,7 +84,7 @@ As in Kubernetes, deleting a federated Namespace will delete all resources in th Namespace from the federation control plane. {{< note >}} -**Note:** At this point, deleting a federated Namespace will not delete the corresponding Namespace, or resources in those Namespaces, from underlying clusters. Users must delete them manually. We intend to fix this in the future. +At this point, deleting a federated Namespace will not delete the corresponding Namespace, or resources in those Namespaces, from underlying clusters. Users must delete them manually. We intend to fix this in the future. {{< /note >}} {{% /capture %}} diff --git a/content/en/docs/tasks/administer-federation/replicaset.md b/content/en/docs/tasks/administer-federation/replicaset.md index 7741f8a85c..932abd7095 100644 --- a/content/en/docs/tasks/administer-federation/replicaset.md +++ b/content/en/docs/tasks/administer-federation/replicaset.md @@ -124,7 +124,7 @@ kubectl --context=federation-cluster delete rs myrs ``` {{< note >}} -**Note:** At this point, deleting a federated ReplicaSet will not delete the corresponding ReplicaSets from underlying clusters. You must delete the underlying ReplicaSets manually. We intend to fix this in the future. +At this point, deleting a federated ReplicaSet will not delete the corresponding ReplicaSets from underlying clusters. You must delete the underlying ReplicaSets manually. We intend to fix this in the future. {{< /note >}} {{% /capture %}} diff --git a/content/en/docs/tasks/administer-federation/secret.md b/content/en/docs/tasks/administer-federation/secret.md index dc5b0e3d6c..a553e0562e 100644 --- a/content/en/docs/tasks/administer-federation/secret.md +++ b/content/en/docs/tasks/administer-federation/secret.md @@ -87,7 +87,7 @@ kubectl --context=federation-cluster delete secret mysecret ``` {{< note >}} -**Note:** At this point, deleting a federated secret will not delete the corresponding secrets from underlying clusters. You must delete the underlying secrets manually. We intend to fix this in the future. +At this point, deleting a federated secret will not delete the corresponding secrets from underlying clusters. You must delete the underlying secrets manually. We intend to fix this in the future. {{< /note >}} {{% /capture %}} diff --git a/content/en/docs/tasks/configure-pod-container/assign-cpu-resource.md b/content/en/docs/tasks/configure-pod-container/assign-cpu-resource.md index 3fac646141..516e33d1ed 100644 --- a/content/en/docs/tasks/configure-pod-container/assign-cpu-resource.md +++ b/content/en/docs/tasks/configure-pod-container/assign-cpu-resource.md @@ -120,7 +120,7 @@ cpu-demo 974m Recall that by setting `-cpu "2"`, you configured the Container to attempt to use 2 CPUs, but the Container is only being allowed to use about 1 CPU. The Container CPU use is being throttled, because the Container is attempting to use more CPU resources than its limit. {{< note >}} -**Note:** Another possible explanation for the CPU throttling is that the Node might not have +Another possible explanation for the CPU throttling is that the Node might not have enough CPU resources available. Recall that the prerequisites for this exercise require each of your Nodes to have at least 1 CPU. If your Container runs on a Node that has only 1 CPU, the Container cannot use more than 1 CPU regardless of the CPU limit specified for the Container. diff --git a/content/en/docs/tasks/configure-pod-container/attach-handler-lifecycle-event.md b/content/en/docs/tasks/configure-pod-container/attach-handler-lifecycle-event.md index 85dc63d6ab..3c461a2ecb 100644 --- a/content/en/docs/tasks/configure-pod-container/attach-handler-lifecycle-event.md +++ b/content/en/docs/tasks/configure-pod-container/attach-handler-lifecycle-event.md @@ -77,7 +77,7 @@ unless the Pod's grace period expires. For more details, see [Termination of Pods](/docs/user-guide/pods/#termination-of-pods). {{< note >}} -**Note**: Kubernetes only sends the preStop event when a Pod is *terminated*. +Kubernetes only sends the preStop event when a Pod is *terminated*. This means that the preStop hook is not invoked when the Pod is *completed*. This limitation is tracked in [issue #55087](https://github.com/kubernetes/kubernetes/issues/55807). {{< /note >}} diff --git a/content/en/docs/tasks/configure-pod-container/configure-persistent-volume-storage.md b/content/en/docs/tasks/configure-pod-container/configure-persistent-volume-storage.md index f770eacfbc..cc3f7a3fde 100644 --- a/content/en/docs/tasks/configure-pod-container/configure-persistent-volume-storage.md +++ b/content/en/docs/tasks/configure-pod-container/configure-persistent-volume-storage.md @@ -189,7 +189,7 @@ annotation or the Pod鈥檚 specification, is applied to the first process run in each Container. {{< note >}} -**Note**: When a Pod consumes a PersistentVolume, the GIDs associated with the +When a Pod consumes a PersistentVolume, the GIDs associated with the PersistentVolume are not present on the Pod resource itself. {{< /note >}} diff --git a/content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md b/content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md index 651b72e65d..a34de6eb45 100644 --- a/content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md +++ b/content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md @@ -388,7 +388,7 @@ metadata: ## Configure all key-value pairs in a ConfigMap as container environment variables {{< note >}} - **Note:** This functionality is available in Kubernetes v1.6 and later. + This functionality is available in Kubernetes v1.6 and later. {{< /note >}} 1. Create a ConfigMap containing multiple key-value pairs. @@ -516,7 +516,7 @@ special.type ``` {{< caution >}} -**Caution:** If there are some files in the `/etc/config/` directory, they will be deleted. +If there are some files in the `/etc/config/` directory, they will be deleted. {{< /caution >}} ### Add ConfigMap data to a specific path in the Volume @@ -563,7 +563,7 @@ basis. The [Secrets](/docs/concepts/configuration/secret/#using-secrets-as-files When a ConfigMap already being consumed in a volume is updated, projected keys are eventually updated as well. Kubelet is checking whether the mounted ConfigMap is fresh on every periodic sync. However, it is using its local ttl-based cache for getting the current value of the ConfigMap. As a result, the total delay from the moment when the ConfigMap is updated to the moment when new keys are projected to the pod can be as long as kubelet sync period + ttl of ConfigMaps cache in kubelet. {{< note >}} -**Note:** A container using a ConfigMap as a +A container using a ConfigMap as a [subPath](/docs/concepts/storage/volumes/#using-subpath) volume will not receive ConfigMap updates. {{< /note >}} @@ -577,7 +577,7 @@ ConfigMap updates. The ConfigMap API resource stores configuration data as key-value pairs. The data can be consumed in pods or provide the configurations for system components such as controllers. ConfigMap is similar to [Secrets](/docs/concepts/configuration/secret/), but provides a means of working with strings that don't contain sensitive information. Users and system components alike can store configuration data in ConfigMap. {{< note >}} -**Note:** ConfigMaps should reference properties files, not replace them. Think of the ConfigMap as representing something similar to the Linux `/etc` directory and its contents. For example, if you create a [Kubernetes Volume](/docs/concepts/storage/volumes/) from a ConfigMap, each data item in the ConfigMap is represented by an individual file in the volume. +ConfigMaps should reference properties files, not replace them. Think of the ConfigMap as representing something similar to the Linux `/etc` directory and its contents. For example, if you create a [Kubernetes Volume](/docs/concepts/storage/volumes/) from a ConfigMap, each data item in the ConfigMap is represented by an individual file in the volume. {{< /note >}} The ConfigMap's `data` field contains the configuration data. As shown in the example below, this can be simple -- like individual properties defined using `--from-literal` -- or complex -- like configuration files or JSON blobs defined using `--from-file`. @@ -618,7 +618,7 @@ data: This includes pods created via the Kubelet's --manifest-url flag, --config flag, or the Kubelet REST API. {{< note >}} - **Note:** These are not commonly-used ways to create pods. + These are not commonly-used ways to create pods. {{< /note >}} {{% /capture %}} diff --git a/content/en/docs/tasks/configure-pod-container/configure-service-account.md b/content/en/docs/tasks/configure-pod-container/configure-service-account.md index 62992829cd..1777b5e41a 100644 --- a/content/en/docs/tasks/configure-pod-container/configure-service-account.md +++ b/content/en/docs/tasks/configure-pod-container/configure-service-account.md @@ -15,7 +15,7 @@ A service account provides an identity for processes that run in a Pod. [Cluster Admin Guide to Service Accounts](/docs/reference/access-authn-authz/service-accounts-admin/).* {{< note >}} -**Note:** This document describes how service accounts behave in a cluster set up +This document describes how service accounts behave in a cluster set up as recommended by the Kubernetes project. Your cluster administrator may have customized the behavior in your cluster, in which case this documentation may not apply. @@ -175,7 +175,7 @@ token: ... ``` {{< note >}} -**Note:** The content of `token` is elided here. +The content of `token` is elided here. {{< /note >}} ## Add ImagePullSecrets to a service account @@ -254,7 +254,7 @@ TODO: Test and explain how to use additional non-K8s secrets with an existing se {{< feature-state for_k8s_version="v1.12" state="beta" >}} {{< note >}} -**Note:** This ServiceAccountTokenVolumeProjection is __beta__ in 1.12 and +This ServiceAccountTokenVolumeProjection is __beta__ in 1.12 and enabled by passing all of the following flags to the API server: * `--service-account-issuer` diff --git a/content/en/docs/tasks/configure-pod-container/pull-image-private-registry.md b/content/en/docs/tasks/configure-pod-container/pull-image-private-registry.md index e998baa6a1..836d89c0c4 100644 --- a/content/en/docs/tasks/configure-pod-container/pull-image-private-registry.md +++ b/content/en/docs/tasks/configure-pod-container/pull-image-private-registry.md @@ -53,7 +53,7 @@ The output contains a section similar to this: ``` {{< note >}} -**Note:** If you use a Docker credentials store, you won't see that `auth` entry but a `credsStore` entry with the name of the store as value. +If you use a Docker credentials store, you won't see that `auth` entry but a `credsStore` entry with the name of the store as value. {{< /note >}} ## Create a Secret in the cluster that holds your authorization token diff --git a/content/en/docs/tasks/configure-pod-container/quality-service-pod.md b/content/en/docs/tasks/configure-pod-container/quality-service-pod.md index 9062515fa2..8b344a9c6b 100644 --- a/content/en/docs/tasks/configure-pod-container/quality-service-pod.md +++ b/content/en/docs/tasks/configure-pod-container/quality-service-pod.md @@ -84,7 +84,7 @@ spec: ``` {{< note >}} -**Note:** If a Container specifies its own memory limit, but does not specify a memory request, Kubernetes +If a Container specifies its own memory limit, but does not specify a memory request, Kubernetes automatically assigns a memory request that matches the limit. Similarly, if a Container specifies its own CPU limit, but does not specify a CPU request, Kubernetes automatically assigns a CPU request that matches the limit. diff --git a/content/en/docs/tasks/configure-pod-container/security-context.md b/content/en/docs/tasks/configure-pod-container/security-context.md index a89e0dfa53..e7a3f6dd99 100644 --- a/content/en/docs/tasks/configure-pod-container/security-context.md +++ b/content/en/docs/tasks/configure-pod-container/security-context.md @@ -299,7 +299,7 @@ See [capability.h](https://github.com/torvalds/linux/blob/master/include/uapi/li for definitions of the capability constants. {{< note >}} -**Note:** Linux capability constants have the form `CAP_XXX`. But when you list capabilities in your Container manifest, you must omit the `CAP_` portion of the constant. For example, to add `CAP_SYS_TIME`, include `SYS_TIME` in your list of capabilities. +Linux capability constants have the form `CAP_XXX`. But when you list capabilities in your Container manifest, you must omit the `CAP_` portion of the constant. For example, to add `CAP_SYS_TIME`, include `SYS_TIME` in your list of capabilities. {{< /note >}} ## Assign SELinux labels to a Container @@ -318,7 +318,7 @@ securityContext: ``` {{< note >}} -**Note:** To assign SELinux labels, the SELinux security module must be loaded on the host operating system. +To assign SELinux labels, the SELinux security module must be loaded on the host operating system. {{< /note >}} ## Discussion @@ -339,7 +339,7 @@ need to set the `level` section. This sets the label given to all Containers in the Pod as well as the Volumes. {{< warning >}} -**Warning:** After you specify an MCS label for a Pod, all Pods with the same label can access the Volume. If you need inter-Pod protection, you must assign a unique MCS label to each Pod. +After you specify an MCS label for a Pod, all Pods with the same label can access the Volume. If you need inter-Pod protection, you must assign a unique MCS label to each Pod. {{< /warning >}} {{% /capture %}} diff --git a/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md b/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md index 316854b476..5713c69c53 100644 --- a/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md +++ b/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md @@ -296,7 +296,9 @@ INFO OpenShift file "foo-imagestream.yaml" created INFO OpenShift file "foo-buildconfig.yaml" created ``` -**Note**: If you are manually pushing the Openshift artifacts using ``oc create -f``, you need to ensure that you push the imagestream artifact before the buildconfig artifact, to workaround this Openshift issue: https://github.com/openshift/origin/issues/4518 . +{{< note >}} +If you are manually pushing the Openshift artifacts using ``oc create -f``, you need to ensure that you push the imagestream artifact before the buildconfig artifact, to workaround this Openshift issue: https://github.com/openshift/origin/issues/4518 . +{{< /note >}} ## `kompose up` @@ -335,6 +337,7 @@ pod/frontend-2768218532-cs5t5 1/1 Running 0 4m pod/redis-master-1432129712-63jn8 1/1 Running 0 4m pod/redis-slave-2504961300-nve7b 1/1 Running 0 4m ``` + **Note**: - You must have a running Kubernetes cluster with a pre-configured kubectl context. @@ -550,7 +553,9 @@ The currently supported options are: | kompose.service.type | nodeport / clusterip / loadbalancer | | kompose.service.expose| true / hostname | -**Note**: `kompose.service.type` label should be defined with `ports` only, otherwise `kompose` will fail. +{{< note >}} +The `kompose.service.type` label should be defined with `ports` only, otherwise `kompose` will fail. +{{< /note >}} ## Restart @@ -563,7 +568,9 @@ If you want to create normal pods without controllers you can use `restart` cons | `on-failure` | Pod | `OnFailure` | | `no` | Pod | `Never` | -**Note**: controller object could be `deployment` or `replicationcontroller`, etc. +{{< note >}} +The controller object could be `deployment` or `replicationcontroller`, etc. +{{< /note >}} For e.g. `pival` service will become pod down here. This container calculated value of `pi`. diff --git a/content/en/docs/tasks/debug-application-cluster/audit.md b/content/en/docs/tasks/debug-application-cluster/audit.md index 10f8161f26..a46fec98e9 100644 --- a/content/en/docs/tasks/debug-application-cluster/audit.md +++ b/content/en/docs/tasks/debug-application-cluster/audit.md @@ -46,8 +46,8 @@ Each request can be recorded with an associated "stage". The known stages are: - `Panic` - Events generated when a panic occurred. {{< note >}} -**Note** The audit logging feature increases the memory consumption of the API -server because some context required for auditing is stored for each request. +The audit logging feature increases the memory consumption of the API server +because some context required for auditing is stored for each request. Additionally, memory consumption depends on the audit logging configuration. {{< /note >}} @@ -102,7 +102,7 @@ In both cases, audit events structure is defined by the API in the [`v1`][auditing-api]. {{< note >}} -**Note:** In case of patches, request body is a JSON array with patch operations, not a JSON object +In case of patches, request body is a JSON array with patch operations, not a JSON object with an appropriate Kubernetes API object. For example, the following request body is a valid patch request to `/apis/batch/v1/namespaces/some-namespace/jobs/some-job-name`. @@ -216,7 +216,7 @@ In this example, we will use fluentd to split audit events by different namespac 1. install [fluentd][fluentd_install_doc], fluent-plugin-forest and fluent-plugin-rewrite-tag-filter in the kube-apiserver node {{< note >}} -**Note:** Fluent-plugin-forest and fluent-plugin-rewrite-tag-filter are plugins for fluentd. You can get details about plugin installation from [fluentd plugin-management][fluentd_plugin_management_doc]. +Fluent-plugin-forest and fluent-plugin-rewrite-tag-filter are plugins for fluentd. You can get details about plugin installation from [fluentd plugin-management][fluentd_plugin_management_doc]. {{< /note >}} 1. create a config file for fluentd diff --git a/content/en/docs/tasks/debug-application-cluster/core-metrics-pipeline.md b/content/en/docs/tasks/debug-application-cluster/core-metrics-pipeline.md index e44f98c90d..18033665e9 100644 --- a/content/en/docs/tasks/debug-application-cluster/core-metrics-pipeline.md +++ b/content/en/docs/tasks/debug-application-cluster/core-metrics-pipeline.md @@ -34,7 +34,7 @@ The API is defined in [k8s.io/metrics](https://github.com/kubernetes/metrics/blo repository. You can find more information about the API there. {{< note >}} -**Note:** The API requires metrics server to be deployed in the cluster. Otherwise it will be not available. +The API requires metrics server to be deployed in the cluster. Otherwise it will be not available. {{< /note >}} ## Metrics Server diff --git a/content/en/docs/tasks/debug-application-cluster/crictl.md b/content/en/docs/tasks/debug-application-cluster/crictl.md index 7c8afeee5a..4f91efb8a4 100644 --- a/content/en/docs/tasks/debug-application-cluster/crictl.md +++ b/content/en/docs/tasks/debug-application-cluster/crictl.md @@ -67,7 +67,7 @@ debug: true The following examples show some `crictl` commands and example output. {{< warning >}} -**Warning:** If you use `crictl` to create pod sandboxes or containers on a running +If you use `crictl` to create pod sandboxes or containers on a running Kubernetes cluster, the Kubelet will eventually delete them. `crictl` is not a general purpose workflow tool, but a tool that is useful for debugging. {{< /warning >}} diff --git a/content/en/docs/tasks/debug-application-cluster/debug-application.md b/content/en/docs/tasks/debug-application-cluster/debug-application.md index cedfa0384c..94adc0578c 100644 --- a/content/en/docs/tasks/debug-application-cluster/debug-application.md +++ b/content/en/docs/tasks/debug-application-cluster/debug-application.md @@ -84,7 +84,7 @@ $ kubectl exec ${POD_NAME} -c ${CONTAINER_NAME} -- ${CMD} ${ARG1} ${ARG2} ... ${ ``` {{< note >}} -**Note:** `-c ${CONTAINER_NAME}` is optional. You can omit it for Pods that only contain a single container. +`-c ${CONTAINER_NAME}` is optional. You can omit it for Pods that only contain a single container. {{< /note >}} As an example, to look at the logs from a running Cassandra pod, you might run diff --git a/content/en/docs/tasks/debug-application-cluster/debug-pod-replication-controller.md b/content/en/docs/tasks/debug-application-cluster/debug-pod-replication-controller.md index 3bbf3eb670..806347eff0 100644 --- a/content/en/docs/tasks/debug-application-cluster/debug-pod-replication-controller.md +++ b/content/en/docs/tasks/debug-application-cluster/debug-pod-replication-controller.md @@ -112,8 +112,10 @@ Alternately, you can run commands inside that container with `exec`: kubectl exec ${POD_NAME} -c ${CONTAINER_NAME} -- ${CMD} ${ARG1} ${ARG2} ... ${ARGN} ``` -{{< note >}}**Note:** `-c ${CONTAINER_NAME}` is optional. You can omit it for pods that -only contain a single container.{{< /note >}} +{{< note >}} +`-c ${CONTAINER_NAME}` is optional. You can omit it for pods that +only contain a single container. +{{< /note >}} As an example, to look at the logs from a running Cassandra pod, you might run: diff --git a/content/en/docs/tasks/debug-application-cluster/debug-service.md b/content/en/docs/tasks/debug-application-cluster/debug-service.md index 3e470a11e3..3ca54205b9 100644 --- a/content/en/docs/tasks/debug-application-cluster/debug-service.md +++ b/content/en/docs/tasks/debug-application-cluster/debug-service.md @@ -79,7 +79,7 @@ deployment.apps/hostnames created `kubectl` commands will print the type and name of the resource created or mutated, which can then be used in subsequent commands. {{< note >}} -**Note:** This is the same as if you started the `Deployment` with the following YAML: +This is the same as if you started the `Deployment` with the following YAML: ```yaml apiVersion: apps/v1 @@ -214,7 +214,10 @@ The "cluster.local" is your cluster domain, which COULD be different in your own cluster. You can also try this from a `Node` in the cluster: -{{< note >}}**Note:** 10.0.0.10 is my DNS `Service`, yours might be different){{< /note >}} + +{{< note >}} +10.0.0.10 is my DNS `Service`, yours might be different). +{{< /note >}} ```shell u@node$ nslookup hostnames.default.svc.cluster.local 10.0.0.10 @@ -383,8 +386,11 @@ as the `Service` selecting for `run=hostnames`, but the `Deployment` specifying At this point, we know that your `Service` exists and has selected your `Pods`. Let's check that the `Pods` are actually working - we can bypass the `Service` -mechanism and go straight to the `Pods`. -{{< note >}}**Note:** These commands use the `Pod` port (9376), rather than the `Service` port (80).{{< /note >}} +mechanism and go straight to the `Pods`. + +{{< note >}} +These commands use the `Pod` port (9376), rather than the `Service` port (80). +{{< /note >}} ```shell u@pod$ wget -qO- 10.244.0.5:9376 diff --git a/content/en/docs/tasks/debug-application-cluster/events-stackdriver.md b/content/en/docs/tasks/debug-application-cluster/events-stackdriver.md index 1c612bf526..9f81b3ee90 100644 --- a/content/en/docs/tasks/debug-application-cluster/events-stackdriver.md +++ b/content/en/docs/tasks/debug-application-cluster/events-stackdriver.md @@ -25,7 +25,7 @@ This article describes a solution that exports Kubernetes events to Stackdriver Logging, where they can be processed and analyzed. {{< note >}} -**Note:** It is not guaranteed that all events happening in a cluster will be +It is not guaranteed that all events happening in a cluster will be exported to Stackdriver. One possible scenario when events will not be exported is when event exporter is not running (e.g. during restart or upgrade). In most cases it's fine to use events for purposes like setting up diff --git a/content/en/docs/tasks/debug-application-cluster/logging-elasticsearch-kibana.md b/content/en/docs/tasks/debug-application-cluster/logging-elasticsearch-kibana.md index ebd03d84d2..93ae3c38dd 100644 --- a/content/en/docs/tasks/debug-application-cluster/logging-elasticsearch-kibana.md +++ b/content/en/docs/tasks/debug-application-cluster/logging-elasticsearch-kibana.md @@ -18,7 +18,7 @@ them using [Kibana](https://www.elastic.co/products/kibana), as an alternative t Stackdriver Logging when running on GCE. {{< note >}} -**Note:** You cannot automatically deploy Elasticsearch and Kibana in the Kubernetes cluster hosted on Google Kubernetes Engine. You have to deploy them manually. +You cannot automatically deploy Elasticsearch and Kibana in the Kubernetes cluster hosted on Google Kubernetes Engine. You have to deploy them manually. {{< /note >}} {{% /capture %}} diff --git a/content/en/docs/tasks/debug-application-cluster/logging-stackdriver.md b/content/en/docs/tasks/debug-application-cluster/logging-stackdriver.md index 378d5c6b33..1a5bc4e8e6 100644 --- a/content/en/docs/tasks/debug-application-cluster/logging-stackdriver.md +++ b/content/en/docs/tasks/debug-application-cluster/logging-stackdriver.md @@ -12,7 +12,7 @@ Before reading this page, it's highly recommended to familiarize yourself with the [overview of logging in Kubernetes](/docs/concepts/cluster-administration/logging). {{< note >}} -**Note:** By default, Stackdriver logging collects only your container's standard output and +By default, Stackdriver logging collects only your container's standard output and standard error streams. To collect any logs your application writes to a file (for example), see the [sidecar approach](/docs/concepts/cluster-administration/logging#sidecar-container-with-a-logging-agent) in the Kubernetes logging overview. @@ -52,7 +52,7 @@ consider starting a cluster without a pre-configured logging solution and then d Stackdriver Logging agents to the running cluster. {{< warning >}} -**Warning:** The Stackdriver logging daemon has known issues on platforms other +The Stackdriver logging daemon has known issues on platforms other than Google Kubernetes Engine. Proceed at your own risk. {{< /warning >}} @@ -88,9 +88,11 @@ than Google Kubernetes Engine. Proceed at your own risk. kubectl label node $NODE_NAME beta.kubernetes.io/fluentd-ds-ready=true ``` - {{< note >}}**Note:** If a node fails and has to be recreated, you must re-apply the label to + {{< note >}} + If a node fails and has to be recreated, you must re-apply the label to the recreated node. To make this easier, you can use Kubelet's command-line parameter - for applying node labels in your node startup script.{{< /note >}} + for applying node labels in your node startup script. + {{< /note >}} 1. Deploy a `ConfigMap` with the logging agent configuration by running the following command: @@ -263,8 +265,12 @@ In this case you need to be able to change the parameters of `DaemonSet` and `Co If you're using GKE and Stackdriver Logging is enabled in your cluster, you cannot change its configuration, because it's managed and supported by GKE. However, you can disable the default integration and deploy your own. -{{< note >}}**Note:** You will have to support and maintain a newly deployed configuration -yourself: update the image and configuration, adjust the resources and so on.{{< /note >}} + +{{< note >}} +You will have to support and maintain a newly deployed configuration +yourself: update the image and configuration, adjust the resources and so on. +{{< /note >}} + To disable the default logging integration, use the following command: ``` @@ -325,7 +331,10 @@ kubectl get cm fluentd-gcp-config --namespace kube-system -o yaml > fluentd-gcp- Then in the value for the key `containers.input.conf` insert a new filter right after the `source` section. -{{< note >}}**Note:** Order is important.{{< /note >}} + +{{< note >}} +Order is important. +{{< /note >}} Updating `ConfigMap` in the apiserver is more complicated than updating `DaemonSet`. It's better to consider `ConfigMap` to be immutable. Then, in order to update the configuration, you should diff --git a/content/en/docs/tasks/example-task-template.md b/content/en/docs/tasks/example-task-template.md index 285a832500..256a5638e1 100644 --- a/content/en/docs/tasks/example-task-template.md +++ b/content/en/docs/tasks/example-task-template.md @@ -8,7 +8,9 @@ toc_hide: true {{% capture overview %}} -**NOTE:** Be sure to also [create an entry in the table of contents](/docs/home/contribute/write-new-topic/#creating-an-entry-in-the-table-of-contents) for your new document. +{{< note >}} +Be sure to also [create an entry in the table of contents](/docs/home/contribute/write-new-topic/#creating-an-entry-in-the-table-of-contents) for your new document. +{{< /note >}} This page shows how to ... diff --git a/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md b/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md index f671ef5231..ee777c5600 100644 --- a/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md +++ b/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md @@ -18,9 +18,10 @@ of plugins as a means of utilizing these building blocks to create more complex {{% capture prerequisites %}} -You need to have a working `kubectl` binary installed. +You need to have a working `kubectl` binary installed. + {{< note >}} -**Note:** Plugins were officially introduced as an alpha feature in the v1.8.0 release. They have been re-worked in the v1.12.0 release to support a wider range of use-cases. So, while some parts of the plugins feature were already available in previous versions, a `kubectl` version of 1.12.0 or later is recommended if you are following these docs. +Plugins were officially introduced as an alpha feature in the v1.8.0 release. They have been re-worked in the v1.12.0 release to support a wider range of use-cases. So, while some parts of the plugins feature were already available in previous versions, a `kubectl` version of 1.12.0 or later is recommended if you are following these docs. {{< /note >}} Until a GA version is released, plugins should be considered unstable, and their underlying mechanism is prone to change. @@ -34,7 +35,7 @@ Until a GA version is released, plugins should be considered unstable, and their A plugin is nothing more than a standalone executable file, whose name begins with `kubectl-`. To install a plugin, simply move this executable file to anywhere on your PATH. {{< note >}} -**Note:** Kubernetes does not provide a package manager or anything similar to install or update plugins. It is your responsibility to ensure that plugin executables have a filename that begins with `kubectl-`, and that they are placed somewhere on your PATH. +Kubernetes does not provide a package manager or anything similar to install or update plugins. It is your responsibility to ensure that plugin executables have a filename that begins with `kubectl-`, and that they are placed somewhere on your PATH. {{< /note >}} ### Discovering plugins @@ -127,7 +128,7 @@ For example, a plugin that wishes to be invoked whenever the command `kubectl fo #### Flags and argument handling {{< note >}} -**Note:** Unlike previous versions of `kubectl`, the plugin mechanism will _not_ create any custom, plugin-specific values or environment variables to a plugin process. +Unlike previous versions of `kubectl`, the plugin mechanism will _not_ create any custom, plugin-specific values or environment variables to a plugin process. This means that environment variables such as `KUBECTL_PLUGINS_CURRENT_NAMESPACE` are no longer provided to a plugin. Plugins must parse all of the arguments passed to them by a user, and handle flag validation as part of their own implementation. For plugins written in Go, a set of utilities has been provided under [k8s.io/cli-runtime](https://github.com/kubernetes/cli-runtime) to assist with this. {{< /note >}} diff --git a/content/en/docs/tasks/federation/federation-service-discovery.md b/content/en/docs/tasks/federation/federation-service-discovery.md index 6a8138193b..b80a6d8d22 100644 --- a/content/en/docs/tasks/federation/federation-service-discovery.md +++ b/content/en/docs/tasks/federation/federation-service-discovery.md @@ -135,7 +135,7 @@ Events: ``` {{< note >}} -**Note:** The 'LoadBalancer Ingress' addresses of your Federated Service +The 'LoadBalancer Ingress' addresses of your Federated Service correspond with the 'LoadBalancer Ingress' addresses of all of the underlying Kubernetes services (once these have been allocated - this may take a few seconds). For inter-cluster and inter-cloud-provider @@ -222,7 +222,7 @@ nginx.mynamespace.myfederation.svc.europe-west1-d.example.com. CNAME 180 ``` {{< note >}} -**Note:** If your Federation is configured to use AWS Route53, you can use one of the equivalent AWS tools, for example: +If your Federation is configured to use AWS Route53, you can use one of the equivalent AWS tools, for example: ``` shell $ aws route53 list-hosted-zones diff --git a/content/en/docs/tasks/federation/set-up-cluster-federation-kubefed.md b/content/en/docs/tasks/federation/set-up-cluster-federation-kubefed.md index e6db7c3c31..739d143931 100644 --- a/content/en/docs/tasks/federation/set-up-cluster-federation-kubefed.md +++ b/content/en/docs/tasks/federation/set-up-cluster-federation-kubefed.md @@ -44,7 +44,7 @@ Download the client tarball corresponding to the particular release and extract the binaries in the tarball: {{< note >}} -**Note:** Until Kubernetes version `1.8.x` the federation project was +Until Kubernetes version `1.8.x` the federation project was maintained as part of the [core kubernetes repo](https://github.com/kubernetes/kubernetes). Between Kubernetes releases `1.8` and `1.9`, the federation project moved into a separate [federation repo](https://github.com/kubernetes/federation), where it is @@ -59,7 +59,7 @@ curl -LO https://storage.googleapis.com/kubernetes-release/release/${RELEASE-VER tar -xzvf kubernetes-client-linux-amd64.tar.gz ``` {{< note >}} -**Note:** The `RELEASE-VERSION` variable should either be set to or replaced with the actual version needed. +The `RELEASE-VERSION` variable should either be set to or replaced with the actual version needed. {{< /note >}} Copy the extracted binary to one of the directories in your `$PATH` @@ -78,7 +78,7 @@ tar -xzvf federation-client-linux-amd64.tar.gz ``` {{< note >}} -**Note:** The `RELEASE-VERSION` variable should be replaced with one of the release versions available at [federation release page](https://github.com/kubernetes/federation/releases). +The `RELEASE-VERSION` variable should be replaced with one of the release versions available at [federation release page](https://github.com/kubernetes/federation/releases). {{< /note >}} Copy the extracted binary to one of the directories in your `$PATH` @@ -179,7 +179,7 @@ modify a Google Kubernetes Engine cluster directly to add this scope, but you ca new node pool for your cluster and delete the old one. {{< note >}} -**Note:** This will cause pods in the cluster to be rescheduled. +This will cause pods in the cluster to be rescheduled. {{< /note >}} To add the new node pool, run: @@ -200,8 +200,9 @@ gcloud container node-pools delete default-pool --cluster gke-cluster `kubefed init` sets up the federation control plane in the host cluster and also adds an entry for the federation API server in your local kubeconfig. + {{< note >}} -**Note:** In the beta release of Kubernetes 1.6, `kubefed init` does not automatically set the current context to the +In the beta release of Kubernetes 1.6, `kubefed init` does not automatically set the current context to the newly deployed federation. You can set the current context manually by running: ```shell @@ -466,7 +467,7 @@ A new context has now been added to your kubeconfig named `fellowship` (after th {{< note >}} -**Note:** The name that you provide to the `join` command is used as the joining cluster's identity in federation. This name should adhere to the rules described in the [identifiers doc](/docs/concepts/overview/working-with-objects/names/). If the context +The name that you provide to the `join` command is used as the joining cluster's identity in federation. This name should adhere to the rules described in the [identifiers doc](/docs/concepts/overview/working-with-objects/names/). If the context corresponding to your joining cluster conforms to these rules, you can use the same name in the join command. Otherwise, you must choose a different name for your cluster's identity. {{< /note >}} @@ -515,7 +516,7 @@ kubefed join noldor --host-cluster-context=rivendell --secret-name=11kingdom ``` {{< note >}} -**Note:** If your cluster name does not conform to the DNS subdomain name specification, all you need to do is supply the secret name using the `--secret-name` flag. `kubefed join` automatically creates the secret for you. +If your cluster name does not conform to the DNS subdomain name specification, all you need to do is supply the secret name using the `--secret-name` flag. `kubefed join` automatically creates the secret for you. {{< /note >}} ### `kube-dns` configuration @@ -555,7 +556,7 @@ kubectl delete ns federation-system --context=rivendell ``` {{< note >}} -**Note:** `rivendell` is the host cluster name. Replace that name with the appropriate name in your configuration. +`rivendell` is the host cluster name. Replace that name with the appropriate name in your configuration. {{< /note >}} {{% /capture %}} diff --git a/content/en/docs/tasks/federation/set-up-coredns-provider-federation.md b/content/en/docs/tasks/federation/set-up-coredns-provider-federation.md index acfb9bf58b..b2379f79b9 100644 --- a/content/en/docs/tasks/federation/set-up-coredns-provider-federation.md +++ b/content/en/docs/tasks/federation/set-up-coredns-provider-federation.md @@ -118,15 +118,19 @@ coredns-provider.conf has below format: - `zones` is the federation domain for which CoreDNS is authoritative and is same as --dns-zone-name flag of `kubefed init`. - `coredns-endpoints` is the endpoint to access CoreDNS server. This is an optional parameter introduced from v1.7 onwards. -{{< note >}}**Note**: *plugins.etcd.zones in CoreDNS configuration and --dns-zone-name flag to kubefed init should match.*{{< /note >}} +{{< note >}} +`plugins.etcd.zones` in the CoreDNS configuration and the `--dns-zone-name` flag to `kubefed init` should match. +{{< /note >}} ## Setup CoreDNS server in nameserver resolv.conf chain -*Note: The following section applies only to versions prior to v1.7 +{{< note >}} +The following section applies only to versions prior to v1.7 and will be automatically taken care of if the `coredns-endpoints` parameter is configured in `coredns-provider.conf` as described in -section above.* +section above. +{{< /note >}} Once the federation control plane is deployed and federated clusters are joined to the federation, you need to add the CoreDNS server to the diff --git a/content/en/docs/tasks/inject-data-application/define-command-argument-container.md b/content/en/docs/tasks/inject-data-application/define-command-argument-container.md index d920dacdfb..64fc918206 100644 --- a/content/en/docs/tasks/inject-data-application/define-command-argument-container.md +++ b/content/en/docs/tasks/inject-data-application/define-command-argument-container.md @@ -35,7 +35,7 @@ If you define args, but do not define a command, the default command is used with your new arguments. {{< note >}} -**Note:** the `command` field corresponds to `entrypoint` in some container +The `command` field corresponds to `entrypoint` in some container runtimes. Refer to the [Notes](#notes) below. {{< /note >}} @@ -85,7 +85,7 @@ and [Secrets](/docs/concepts/configuration/secret/). {{< note >}} -**Note:** The environment variable appears in parentheses, `"$(VAR)"`. This is +The environment variable appears in parentheses, `"$(VAR)"`. This is required for the variable to be expanded in the `command` or `args` field. {{< /note >}} diff --git a/content/en/docs/tasks/inject-data-application/define-environment-variable-container.md b/content/en/docs/tasks/inject-data-application/define-environment-variable-container.md index 89263d8661..f43c4cdc22 100644 --- a/content/en/docs/tasks/inject-data-application/define-environment-variable-container.md +++ b/content/en/docs/tasks/inject-data-application/define-environment-variable-container.md @@ -79,7 +79,7 @@ Pod: 1. To exit the shell, enter `exit`. {{< note >}} -**Note:** The environment variables set using the `env` or `envFrom` field +The environment variables set using the `env` or `envFrom` field will override any environment variables specified in the container image. {{< /note >}} diff --git a/content/en/docs/tasks/inject-data-application/distribute-credentials-secure.md b/content/en/docs/tasks/inject-data-application/distribute-credentials-secure.md index 8e4f45d87c..3a086bd622 100644 --- a/content/en/docs/tasks/inject-data-application/distribute-credentials-secure.md +++ b/content/en/docs/tasks/inject-data-application/distribute-credentials-secure.md @@ -42,9 +42,10 @@ username and password: ```shell kubectl create -f https://k8s.io/docs/tasks/inject-data-application/secret.yaml ``` -{{< note >}} -**Note:** If you want to skip the Base64 encoding step, you can create a Secret by using the `kubectl create secret` command: -{{< /note >}} + {{< note >}} + If you want to skip the Base64 encoding step, you can create a Secret by using the `kubectl create secret` command: + {{< /note >}} + ```shell kubectl create secret generic test-secret --from-literal=username='my-app' --from-literal=password='39528$vdg7Jb' ``` @@ -79,7 +80,7 @@ username and password: {{< note >}} -**Note:** If you want to skip the Base64 encoding step, you can create a Secret +If you want to skip the Base64 encoding step, you can create a Secret by using the `kubectl create secret` command: {{< /note >}} diff --git a/content/en/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information.md b/content/en/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information.md index b3a3cca0f7..47e997e88c 100644 --- a/content/en/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information.md +++ b/content/en/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information.md @@ -49,7 +49,7 @@ The second element specifies that the value of the Pod's `annotations` field should be stored in a file named `annotations`. {{< note >}} -**Note:** The fields in this example are Pod fields. They are not +The fields in this example are Pod fields. They are not fields of the Container in the Pod. {{< /note >}} @@ -139,7 +139,7 @@ atomically using [rename(2)](http://man7.org/linux/man-pages/man2/rename.2.html). {{< note >}} -**Note:** A container using Downward API as a +A container using Downward API as a [subPath](/docs/concepts/storage/volumes/#using-subpath) volume mount will not receive Downward API updates. {{< /note >}} @@ -221,7 +221,7 @@ In addition, the following information is available through * `metadata.annotations` - all of the pod鈥檚 annotations, formatted as `annotation-key="escaped-annotation-value"` with one annotation per line {{< note >}} -**Note:** If CPU and memory limits are not specified for a Container, the +If CPU and memory limits are not specified for a Container, the Downward API defaults to the node allocatable value for CPU and memory. {{< /note >}} diff --git a/content/en/docs/tasks/inject-data-application/environment-variable-expose-pod-information.md b/content/en/docs/tasks/inject-data-application/environment-variable-expose-pod-information.md index cb82dd3758..2c543b1d6f 100644 --- a/content/en/docs/tasks/inject-data-application/environment-variable-expose-pod-information.md +++ b/content/en/docs/tasks/inject-data-application/environment-variable-expose-pod-information.md @@ -48,7 +48,7 @@ variable gets its value from the Pod's `spec.nodeName` field. Similarly, the other environment variables get their names from Pod fields. {{< note >}} -**Note:** The fields in this example are Pod fields. They are not fields of the +The fields in this example are Pod fields. They are not fields of the Container in the Pod. {{< /note >}} diff --git a/content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md b/content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md index 4834e7ee91..df359ab7de 100644 --- a/content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md +++ b/content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md @@ -14,9 +14,11 @@ These automated jobs run like [Cron](https://en.wikipedia.org/wiki/Cron) tasks o Cron jobs are useful for creating periodic and recurring tasks, like running backups or sending emails. Cron jobs can also schedule individual tasks for a specific time, such as if you want to schedule a job for a low activity period. -**Note:** CronJob resource in `batch/v2alpha1` API group has been deprecated starting from cluster version 1.8. +{{< note >}} +CronJob resource in `batch/v2alpha1` API group has been deprecated starting from cluster version 1.8. You should switch to using `batch/v1beta1`, instead, which is enabled by default in the API server. Examples in this document use `batch/v1beta1` in all examples. +{{< /note >}} Cron jobs have limitations and idiosyncrasies. For example, in certain circumstances, a single cron job can create multiple jobs. @@ -123,7 +125,9 @@ and [using kubectl to manage resources](/docs/user-guide/working-with-resources) A cron job config also needs a [`.spec` section](https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status). -**Note:** All modifications to a cron job, especially its `.spec`, are applied only to the following runs. +{{< note >}} +All modifications to a cron job, especially its `.spec`, are applied only to the following runs. +{{< /note >}} ### Schedule @@ -139,8 +143,9 @@ The format also includes extended `vixie cron` step values. As explained in the > ``0,2,4,6,8,10,12,14,16,18,20,22''). Steps are also permitted after an > asterisk, so if you want to say ``every two hours'', just use ``*/2''. - -**Note:** The question mark (`?`) in the schedule has the same meaning as an asterisk `*`, that is, it stands for any of available value for a given field. +{{< note >}} +The question mark (`?`) in the schedule has the same meaning as an asterisk `*`, that is, it stands for any of available value for a given field. +{{< /note >}} ### Job Template @@ -187,7 +192,7 @@ This setting does not apply to already started executions. Defaults to false. {{< caution >}} -**Caution:** Executions that are suspended during their scheduled time count as missed jobs. +Executions that are suspended during their scheduled time count as missed jobs. When `.spec.suspend` changes from `true` to `false` on an existing cron job without a [starting deadline](#starting-deadline), the missed jobs are scheduled immediately. {{< /caution >}} diff --git a/content/en/docs/tasks/manage-daemon/rollback-daemon-set.md b/content/en/docs/tasks/manage-daemon/rollback-daemon-set.md index fbd57b98c0..b522ecc8ed 100644 --- a/content/en/docs/tasks/manage-daemon/rollback-daemon-set.md +++ b/content/en/docs/tasks/manage-daemon/rollback-daemon-set.md @@ -140,7 +140,7 @@ previous revision through other commands, such as `kubectl edit` or `kubectl apply`. {{< note >}} -**Note:** DaemonSet revisions only roll forward. That is to say, after a +DaemonSet revisions only roll forward. That is to say, after a rollback completes, the revision number (`.revision` field) of the `ControllerRevision` being rolled back to will advance. For example, if you have revision 1 and 2 in the system, and roll back from revision 2 to revision diff --git a/content/en/docs/tasks/manage-daemon/update-daemon-set.md b/content/en/docs/tasks/manage-daemon/update-daemon-set.md index d2cd15cdcd..4b380f772d 100644 --- a/content/en/docs/tasks/manage-daemon/update-daemon-set.md +++ b/content/en/docs/tasks/manage-daemon/update-daemon-set.md @@ -159,9 +159,10 @@ kubectl get pods -l = -o wide ``` Once you've found those nodes, delete some non-DaemonSet pods from the node to -make room for new DaemonSet pods. +make room for new DaemonSet pods. + {{< note >}} -**Note:** This will cause service disruption when deleted pods are not controlled by any controllers or pods are not +This will cause service disruption when deleted pods are not controlled by any controllers or pods are not replicated. This does not respect [PodDisruptionBudget](/docs/tasks/configure-pod-container/configure-pod-disruption-budget/) either. {{< /note >}} diff --git a/content/en/docs/tasks/run-application/configure-pdb.md b/content/en/docs/tasks/run-application/configure-pdb.md index 7c291da37d..36a06dedda 100644 --- a/content/en/docs/tasks/run-application/configure-pdb.md +++ b/content/en/docs/tasks/run-application/configure-pdb.md @@ -91,7 +91,7 @@ of the number of pods from that set that can be unavailable after the eviction. It can be either an absolute number or a percentage. {{< note >}} -**Note:** For versions 1.8 and earlier: When creating a `PodDisruptionBudget` +For versions 1.8 and earlier: When creating a `PodDisruptionBudget` object using the `kubectl` command line tool, the `minAvailable` field has a default value of 1 if neither `minAvailable` nor `maxUnavailable` is specified. {{< /note >}} @@ -117,12 +117,14 @@ of the desired replicas are unhealthy. In typical usage, a single budget would be used for a collection of pods managed by a controller鈥攆or example, the pods in a single ReplicaSet or StatefulSet. -**Note:** A disruption budget does not truly guarantee that the specified +{{< note >}} +A disruption budget does not truly guarantee that the specified number/percentage of pods will always be up. For example, a node that hosts a pod from the collection may fail when the collection is at the minimum size specified in the budget, thus bringing the number of available pods from the collection below the specified size. The budget can only protect against voluntary evictions, not all causes of unavailability. +{{< /note >}} A `maxUnavailable` of 0% (or 0) or a `minAvailable` of 100% (or equal to the number of replicas) may block node drains entirely. This is permitted as per the diff --git a/content/en/docs/tasks/run-application/delete-stateful-set.md b/content/en/docs/tasks/run-application/delete-stateful-set.md index 564d18114e..7c2db63971 100644 --- a/content/en/docs/tasks/run-application/delete-stateful-set.md +++ b/content/en/docs/tasks/run-application/delete-stateful-set.md @@ -59,7 +59,9 @@ kubectl delete pods -l app=myapp Deleting the Pods in a StatefulSet will not delete the associated volumes. This is to ensure that you have the chance to copy data off the volume before deleting it. Deleting the PVC after the pods have left the [terminating state](/docs/concepts/workloads/pods/pod/#termination-of-pods) might trigger deletion of the backing Persistent Volumes depending on the storage class and reclaim policy. You should never assume ability to access a volume after claim deletion. -**Note: Use caution when deleting a PVC, as it may lead to data loss.** +{{< note >}} +Use caution when deleting a PVC, as it may lead to data loss. +{{< /note >}} ### Complete deletion of a StatefulSet diff --git a/content/en/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md b/content/en/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md index ce32d26691..39ab3fd150 100644 --- a/content/en/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md +++ b/content/en/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md @@ -130,9 +130,11 @@ NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE php-apache 7 7 7 7 19m ``` -**Note** Sometimes it may take a few minutes to stabilize the number of replicas. -Since the amount of load is not controlled in any way it may happen that the final number of replicas will -differ from this example. +{{< note >}} +It may take a few minutes to stabilize the number of replicas. Since the amount +of load is not controlled in any way it may happen that the final number of replicas +will differ from this example. +{{< /note >}} ## Stop load @@ -156,7 +158,7 @@ php-apache 1 1 1 1 27m Here CPU utilization dropped to 0, and so HPA autoscaled the number of replicas back down to 1. {{< note >}} -**Note** autoscaling the replicas may take a few minutes. +Autoscaling the replicas may take a few minutes. {{< /note >}} {{% /capture %}} diff --git a/content/en/docs/tasks/run-application/horizontal-pod-autoscale.md b/content/en/docs/tasks/run-application/horizontal-pod-autoscale.md index c3fd52981a..47e22881a0 100644 --- a/content/en/docs/tasks/run-application/horizontal-pod-autoscale.md +++ b/content/en/docs/tasks/run-application/horizontal-pod-autoscale.md @@ -222,11 +222,11 @@ upscale delay. The default value is 5 minutes (`5m0s`). {{< note >}} -**Note**: When tuning these parameter values, a cluster operator should be aware of -the possible consequences. If the delay (cooldown) value is set too long, there -could be complaints that the Horizontal Pod Autoscaler is not responsive to workload -changes. However, if the delay value is set too short, the scale of the replicas set -may keep thrashing as usual. +When tuning these parameter values, a cluster operator should be aware of the possible +consequences. If the delay (cooldown) value is set too long, there could be complaints +that the Horizontal Pod Autoscaler is not responsive to workload changes. However, if +the delay value is set too short, the scale of the replicas set may keep thrashing as +usual. {{< /note >}} ## Support for multiple metrics @@ -238,10 +238,12 @@ proposed scales will be used as the new scale. ## Support for custom metrics -**Note**: Kubernetes 1.2 added alpha support for scaling based on application-specific metrics using special annotations. +{{< note >}} +Kubernetes 1.2 added alpha support for scaling based on application-specific metrics using special annotations. Support for these annotations was removed in Kubernetes 1.6 in favor of the new autoscaling API. While the old method for collecting custom metrics is still available, these metrics will not be available for use by the Horizontal Pod Autoscaler, and the former annotations for specifying which custom metrics to scale on are no longer honored by the Horizontal Pod Autoscaler controller. +{{< /note >}} Kubernetes 1.6 adds support for making use of custom metrics in the Horizontal Pod Autoscaler. You can add custom metrics for the Horizontal Pod Autoscaler to use in the `autoscaling/v2beta2` API. diff --git a/content/en/docs/tasks/run-application/rolling-update-replication-controller.md b/content/en/docs/tasks/run-application/rolling-update-replication-controller.md index 63db0a2ac0..e0ace5c4c9 100644 --- a/content/en/docs/tasks/run-application/rolling-update-replication-controller.md +++ b/content/en/docs/tasks/run-application/rolling-update-replication-controller.md @@ -9,7 +9,7 @@ weight: 80 {{% capture overview %}} {{< note >}} -**Note**: The preferred way to create a replicated application is to use a +The preferred way to create a replicated application is to use a [Deployment](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#deployment-v1-apps), which in turn uses a [ReplicaSet](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#replicaset-v1-apps). diff --git a/content/en/docs/tasks/service-catalog/install-service-catalog-using-helm.md b/content/en/docs/tasks/service-catalog/install-service-catalog-using-helm.md index 5b5c7e562d..728d7a8950 100644 --- a/content/en/docs/tasks/service-catalog/install-service-catalog-using-helm.md +++ b/content/en/docs/tasks/service-catalog/install-service-catalog-using-helm.md @@ -68,7 +68,7 @@ AUTHORIZATION_MODE=Node,RBAC hack/local-up-cluster.sh -O By default, `helm init` installs the Tiller Pod into the `kube-system` namespace, with Tiller configured to use the `default` service account. {{< note >}} -**NOTE:** If you used the `--tiller-namespace` or `--service-account` flags when running `helm init`, the `--serviceaccount` flag in the following command needs to be adjusted to reference the appropriate namespace and ServiceAccount name. +If you used the `--tiller-namespace` or `--service-account` flags when running `helm init`, the `--serviceaccount` flag in the following command needs to be adjusted to reference the appropriate namespace and ServiceAccount name. {{< /note >}} Configure Tiller to have `cluster-admin` access: diff --git a/content/en/docs/tasks/tls/managing-tls-in-a-cluster.md b/content/en/docs/tasks/tls/managing-tls-in-a-cluster.md index dba3f0e142..2180f05d36 100644 --- a/content/en/docs/tasks/tls/managing-tls-in-a-cluster.md +++ b/content/en/docs/tasks/tls/managing-tls-in-a-cluster.md @@ -50,7 +50,7 @@ The following section demonstrates how to create a TLS certificate for a Kubernetes service accessed through DNS. {{< note >}} -**Note:** This tutorial uses CFSSL: Cloudflare's PKI and TLS toolkit [click here](https://blog.cloudflare.com/introducing-cfssl/) to know more. +This tutorial uses CFSSL: Cloudflare's PKI and TLS toolkit [click here](https://blog.cloudflare.com/introducing-cfssl/) to know more. {{< /note >}} ## Download and install CFSSL diff --git a/content/en/docs/tasks/tools/install-kubectl.md b/content/en/docs/tasks/tools/install-kubectl.md index e7f78b98cd..165c6e1586 100644 --- a/content/en/docs/tasks/tools/install-kubectl.md +++ b/content/en/docs/tasks/tools/install-kubectl.md @@ -106,7 +106,7 @@ If you are on Windows and using [Powershell Gallery](https://www.powershellgalle ``` {{< note >}} -**Note:** If you do not specify a `DownloadLocation`, `kubectl` will be installed in the user's temp Directory. + If you do not specify a `DownloadLocation`, `kubectl` will be installed in the user's temp Directory. {{< /note >}} The installer creates `$HOME/.kube` and instructs it to create a config file @@ -118,7 +118,7 @@ If you are on Windows and using [Powershell Gallery](https://www.powershellgalle ``` {{< note >}} -**Note:** Updating the installation is performed by rerunning the two commands listed in step 1. + Updating the installation is performed by rerunning the two commands listed in step 1. {{< /note >}} ## Install with Chocolatey on Windows @@ -153,9 +153,13 @@ If you are on Windows and using [Chocolatey](https://chocolatey.org) package man ``` 6. Configure kubectl to use a remote Kubernetes cluster: - New-Item config -type file + + ``` + New-Item config -type file + ``` + {{< note >}} - **Note:** Edit the config file with a text editor of your choice, such as Notepad. + Edit the config file with a text editor of your choice, such as Notepad. {{< /note >}} ## Download as part of the Google Cloud SDK diff --git a/content/en/docs/tasks/tools/install-minikube.md b/content/en/docs/tasks/tools/install-minikube.md index ad6fb28f73..ca56e7ef26 100644 --- a/content/en/docs/tasks/tools/install-minikube.md +++ b/content/en/docs/tasks/tools/install-minikube.md @@ -30,7 +30,7 @@ If you do not already have a hypervisor installed, install the appropriate one f [KVM](http://www.linux-kvm.org/). {{< note >}} - **Note:** Minikube also supports a `-\-vm-driver=none` option that runs the Kubernetes components on the host and not in a VM. Using this driver requires Docker and a linux environment, but not a hypervisor. + Minikube also supports a `-\-vm-driver=none` option that runs the Kubernetes components on the host and not in a VM. Using this driver requires Docker and a linux environment, but not a hypervisor. {{< /note >}} * Windows: [VirtualBox](https://www.virtualbox.org/wiki/Downloads) or diff --git a/content/en/docs/test.md b/content/en/docs/test.md index 3866154477..e7faf57d12 100644 --- a/content/en/docs/test.md +++ b/content/en/docs/test.md @@ -157,7 +157,7 @@ $ echo 'Tab lists may contain code blocks!' Nested header tags may also be included. {{< warning >}} -**Note**: Headers within tab lists will not appear in the Table of Contents. +Headers within tab lists will not appear in the Table of Contents. {{< /warning >}} {{% /tab %}} @@ -321,7 +321,7 @@ A sidebar offsets text visually, but without the visual prominence of Admonitions (notes, warnings, etc) use Hugo shortcodes. {{< note >}} -**Note:** Notes catch the reader's attention without a sense of urgency. +Notes catch the reader's attention without a sense of urgency. You can have multiple paragraphs and block-level elements inside an admonition. @@ -329,12 +329,12 @@ You can have multiple paragraphs and block-level elements inside an admonition. {{< /note >}} {{< caution >}} -**Caution:** The reader should proceed with caution. +The reader should proceed with caution. {{< /caution >}} {{< warning >}} -**Warning:** Warnings point out something that could cause harm if ignored. +Warnings point out something that could cause harm if ignored. {{< /warning >}} diff --git a/content/en/docs/tutorials/clusters/apparmor.md b/content/en/docs/tutorials/clusters/apparmor.md index 9102185c38..ec35b1b3e1 100644 --- a/content/en/docs/tutorials/clusters/apparmor.md +++ b/content/en/docs/tutorials/clusters/apparmor.md @@ -65,9 +65,11 @@ Make sure: If the Kubelet contains AppArmor support (>= v1.4), it will refuse to run a Pod with AppArmor options if the kernel module is not enabled. - **Note:** Ubuntu carries many AppArmor patches that have not been merged into the upstream Linux - kernel, including patches that add additional hooks and features. Kubernetes has only been - tested with the upstream version, and does not promise support for other features. + {{< note >}} + Ubuntu carries many AppArmor patches that have not been merged into the upstream Linux + kernel, including patches that add additional hooks and features. Kubernetes has only been + tested with the upstream version, and does not promise support for other features. + {{< /note >}} 3. Container runtime is Docker -- Currently the only Kubernetes-supported container runtime that also supports AppArmor is Docker. As more runtimes add AppArmor support, the options will be @@ -117,9 +119,11 @@ gke-test-default-pool-239f5d02-xwux: kubelet is posting ready status. AppArmor e ## Securing a Pod -**Note:** AppArmor is currently in beta, so options are specified as annotations. Once support graduates to +{{< note >}} +AppArmor is currently in beta, so options are specified as annotations. Once support graduates to general availability, the annotations will be replaced with first-class fields (more details in [Upgrade path to GA](#upgrade-path-to-general-availability)). +{{< /note >}} AppArmor profiles are specified *per-container*. To specify the AppArmor profile to run a Pod container with, add an annotation to the Pod's metadata: diff --git a/content/en/docs/tutorials/hello-minikube.md b/content/en/docs/tutorials/hello-minikube.md index 63f99066ce..6ce214c717 100644 --- a/content/en/docs/tutorials/hello-minikube.md +++ b/content/en/docs/tutorials/hello-minikube.md @@ -17,7 +17,7 @@ on Kubernetes using [Minikube](/docs/getting-started-guides/minikube) and Kataco Katacoda provides a free, in-browser Kubernetes environment. {{< note >}} -**Note:** You can also follow this tutorial if you've installed Minikube locally. +You can also follow this tutorial if you've installed Minikube locally. {{< /note >}} {{% /capture %}} @@ -51,7 +51,8 @@ For more information, read the Docker documentation for [docker build](https://d {{< kat-button >}} {{< note >}} - **Note:** If you installed Minikube locally, run + If you installed Minikube locally, run + ```shell minikube start ``` @@ -121,7 +122,7 @@ Pod runs a Container based on the provided Docker image. ``` {{< note >}} - **Note:** For more information about `kubectl`commands, see the + For more information about `kubectl`commands, see the [kubectl overview](/docs/user-guide/kubectl-overview/). {{< /note >}} @@ -200,7 +201,6 @@ Minikube has a set of built-in addons that can be enabled, disabled and opened i - storage-provisioner: enabled ``` {{< note >}} - **Note:** Minikube must be running for these commands to take effect. {{< /note >}} diff --git a/content/en/docs/tutorials/stateful-application/basic-stateful-set.md b/content/en/docs/tutorials/stateful-application/basic-stateful-set.md index 490d14ed83..93fee4e210 100644 --- a/content/en/docs/tutorials/stateful-application/basic-stateful-set.md +++ b/content/en/docs/tutorials/stateful-application/basic-stateful-set.md @@ -284,7 +284,7 @@ web-1 ``` {{< note >}} -**Note:** If you instead see 403 Forbidden responses for the above curl command, +If you instead see 403 Forbidden responses for the above curl command, you will need to fix the permissions of the directory mounted by the `volumeMounts` (due to a [bug when using hostPath volumes](https://github.com/kubernetes/kubernetes/issues/2630)) with: diff --git a/content/en/docs/tutorials/stateful-application/cassandra.md b/content/en/docs/tutorials/stateful-application/cassandra.md index f1cd0c0d46..7313f8c0e0 100644 --- a/content/en/docs/tutorials/stateful-application/cassandra.md +++ b/content/en/docs/tutorials/stateful-application/cassandra.md @@ -48,13 +48,13 @@ To complete this tutorial, you should already have a basic familiarity with [Pod * Have a supported Kubernetes cluster running {{< note >}} -**Note:** Please read the [getting started guides](/docs/setup/pick-right-solution/) if you do not already have a cluster. +Please read the [getting started guides](/docs/setup/pick-right-solution/) if you do not already have a cluster. {{< /note >}} ### Additional Minikube Setup Instructions {{< caution >}} -**Caution:** [Minikube](/docs/getting-started-guides/minikube/) defaults to 1024MB of memory and 1 CPU. Running Minikube with the default resource configuration results in insufficient resource errors during this tutorial. To avoid these errors, start Minikube with the following settings: +[Minikube](/docs/getting-started-guides/minikube/) defaults to 1024MB of memory and 1 CPU. Running Minikube with the default resource configuration results in insufficient resource errors during this tutorial. To avoid these errors, start Minikube with the following settings: ```shell minikube start --memory 5120 --cpus=4 @@ -101,7 +101,7 @@ Service creation failed if anything else is returned. Read [Debug Services](/doc The StatefulSet manifest, included below, creates a Cassandra ring that consists of three Pods. {{< note >}} -**Note:** This example uses the default provisioner for Minikube. Please update the following StatefulSet for the cloud you are working with. +This example uses the default provisioner for Minikube. Please update the following StatefulSet for the cloud you are working with. {{< /note >}} {{< codenew file="application/cassandra/cassandra-statefulset.yaml" >}} @@ -228,7 +228,7 @@ Use `kubectl edit` to modify the size of a Cassandra StatefulSet. Deleting or scaling a StatefulSet down does not delete the volumes associated with the StatefulSet. This setting is for your safety because your data is more valuable than automatically purging all related StatefulSet resources. {{< warning >}} -**Warning:** Depending on the storage class and reclaim policy, deleting the *PersistentVolumeClaims* may cause the associated volumes to also be deleted. Never assume you鈥檒l be able to access data if its volume claims are deleted. +Depending on the storage class and reclaim policy, deleting the *PersistentVolumeClaims* may cause the associated volumes to also be deleted. Never assume you鈥檒l be able to access data if its volume claims are deleted. {{< /warning >}} 1. Run the following commands (chained together into a single command) to delete everything in the Cassandra `StatefulSet`: diff --git a/content/en/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume.md b/content/en/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume.md index acebf69d6e..63b6b032db 100644 --- a/content/en/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume.md +++ b/content/en/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume.md @@ -12,11 +12,11 @@ This tutorial shows you how to deploy a WordPress site and a MySQL database usin A [PersistentVolume](/docs/concepts/storage/persistent-volumes/) (PV) is a piece of storage in the cluster that has been manually provisioned by an administrator, or dynamically provisioned by Kubernetes using a [StorageClass](/docs/concepts/storage/storage-classes). A [PersistentVolumeClaim](/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) (PVC) is a request for storage by a user that can be fulfilled by a PV. PersistentVolumes and PersistentVolumeClaims are independent from Pod lifecycles and preserve data through restarting, rescheduling, and even deleting Pods. {{< warning >}} -**Warning:** This deployment is not suitable for production use cases, as it uses single instance WordPress and MySQL Pods. Consider using [WordPress Helm Chart](https://github.com/kubernetes/charts/tree/master/stable/wordpress) to deploy WordPress in production. +This deployment is not suitable for production use cases, as it uses single instance WordPress and MySQL Pods. Consider using [WordPress Helm Chart](https://github.com/kubernetes/charts/tree/master/stable/wordpress) to deploy WordPress in production. {{< /warning >}} {{< note >}} -**Note:** The files provided in this tutorial are using GA Deployment APIs and are specific to kubernetes version 1.9 and later. If you wish to use this tutorial with an earlier version of Kubernetes, please update the API version appropriately, or reference earlier versions of this tutorial. +The files provided in this tutorial are using GA Deployment APIs and are specific to kubernetes version 1.9 and later. If you wish to use this tutorial with an earlier version of Kubernetes, please update the API version appropriately, or reference earlier versions of this tutorial. {{< /note >}} {{% /capture %}} @@ -53,15 +53,15 @@ Many cluster environments have a default StorageClass installed. When a Storage When a PersistentVolumeClaim is created, a PersistentVolume is dynamically provisioned based on the StorageClass configuration. {{< warning >}} -**Warning:** In local clusters, the default StorageClass uses the `hostPath` provisioner. `hostPath` volumes are only suitable for development and testing. With `hostPath` volumes, your data lives in `/tmp` on the node the Pod is scheduled onto and does not move between nodes. If a Pod dies and gets scheduled to another node in the cluster, or the node is rebooted, the data is lost. +In local clusters, the default StorageClass uses the `hostPath` provisioner. `hostPath` volumes are only suitable for development and testing. With `hostPath` volumes, your data lives in `/tmp` on the node the Pod is scheduled onto and does not move between nodes. If a Pod dies and gets scheduled to another node in the cluster, or the node is rebooted, the data is lost. {{< /warning >}} {{< note >}} -**Note:** If you are bringing up a cluster that needs to use the `hostPath` provisioner, the `--enable-hostpath-provisioner` flag must be set in the `controller-manager` component. +If you are bringing up a cluster that needs to use the `hostPath` provisioner, the `--enable-hostpath-provisioner` flag must be set in the `controller-manager` component. {{< /note >}} {{< note >}} -**Note:** If you have a Kubernetes cluster running on Google Kubernetes Engine, please follow [this guide](https://cloud.google.com/kubernetes-engine/docs/tutorials/persistent-disk). +If you have a Kubernetes cluster running on Google Kubernetes Engine, please follow [this guide](https://cloud.google.com/kubernetes-engine/docs/tutorials/persistent-disk). {{< /note >}} ## Create a Secret for MySQL Password @@ -89,7 +89,7 @@ A [Secret](/docs/concepts/configuration/secret/) is an object that stores a piec ``` {{< note >}} -**Note:** To protect the Secret from exposure, neither `get` nor `describe` show its contents. +To protect the Secret from exposure, neither `get` nor `describe` show its contents. {{< /note >}} ## Deploy MySQL @@ -124,7 +124,9 @@ The following manifest describes a single-instance MySQL Deployment. The MySQL c kubectl get pods ``` - {{< note >}}**Note:** It can take up to a few minutes for the Pod's Status to be `RUNNING`.{{< /note >}} + {{< note >}} + It can take up to a few minutes for the Pod's Status to be `RUNNING`. + {{< /note >}} The response should be like this: @@ -151,7 +153,9 @@ The following manifest describes a single-instance WordPress Deployment and Serv kubectl get pvc ``` - {{< note >}}**Note:** It can take up to a few minutes for the PVs to be provisioned and bound.{{< /note >}} + {{< note >}} + It can take up to a few minutes for the PVs to be provisioned and bound. + {{< /note >}} The response should be like this: @@ -173,7 +177,9 @@ The following manifest describes a single-instance WordPress Deployment and Serv wordpress ClusterIP 10.0.0.89 80:32406/TCP 4m ``` - {{< note >}}**Note:** Minikube can only expose Services through `NodePort`. The EXTERNAL-IP is always pending.{{< /note >}} + {{< note >}} + Minikube can only expose Services through `NodePort`. The EXTERNAL-IP is always pending. + {{< /note >}} 4. Run the following command to get the IP Address for the WordPress Service: @@ -194,7 +200,7 @@ The following manifest describes a single-instance WordPress Deployment and Serv ![wordpress-init](https://raw.githubusercontent.com/kubernetes/examples/master/mysql-wordpress-pd/WordPress.png) {{< warning >}} -**Warning:** Do not leave your WordPress installation on this page. If another user finds it, they can set up a website on your instance and use it to serve malicious content.

Either install WordPress by creating a username and password or delete your instance. +Do not leave your WordPress installation on this page. If another user finds it, they can set up a website on your instance and use it to serve malicious content.

Either install WordPress by creating a username and password or delete your instance. {{< /warning >}} {{% /capture %}} diff --git a/content/en/docs/tutorials/stateless-application/guestbook.md b/content/en/docs/tutorials/stateless-application/guestbook.md index 1b65910f27..2d82a7a045 100644 --- a/content/en/docs/tutorials/stateless-application/guestbook.md +++ b/content/en/docs/tutorials/stateless-application/guestbook.md @@ -70,7 +70,7 @@ The manifest file, included below, specifies a Deployment controller that runs a ``` {{< note >}} -**Note:** Replace POD-NAME with the name of your Pod. +Replace POD-NAME with the name of your Pod. {{< /note >}} ### Creating the Redis Master Service @@ -100,7 +100,7 @@ The guestbook applications needs to communicate to the Redis master to write its ``` {{< note >}} -**Note:** This manifest file creates a Service named `redis-master` with a set of labels that match the labels previously defined, so the Service routes network traffic to the Redis master Pod. +This manifest file creates a Service named `redis-master` with a set of labels that match the labels previously defined, so the Service routes network traffic to the Redis master Pod. {{< /note >}} @@ -200,7 +200,7 @@ The `redis-slave` and `redis-master` Services you applied are only accessible wi If you want guests to be able to access your guestbook, you must configure the frontend Service to be externally visible, so a client can request the Service from outside the container cluster. Minikube can only expose Services through `NodePort`. {{< note >}} -**Note:** Some cloud providers, like Google Compute Engine or Google Kubernetes Engine, support external load balancers. If your cloud provider supports load balancers and you want to use it, simply delete or comment out `type: NodePort`, and uncomment `type: LoadBalancer`. +Some cloud providers, like Google Compute Engine or Google Kubernetes Engine, support external load balancers. If your cloud provider supports load balancers and you want to use it, simply delete or comment out `type: NodePort`, and uncomment `type: LoadBalancer`. {{< /note >}} {{< codenew file="application/guestbook/frontend-service.yaml" >}} diff --git a/content/en/includes/federation-current-state.md b/content/en/includes/federation-current-state.md index 97d26cf075..d04fda15e0 100644 --- a/content/en/includes/federation-current-state.md +++ b/content/en/includes/federation-current-state.md @@ -1 +1 @@ -**Note:** `Federation V1`, the current Kubernetes federation API which reuses the Kubernetes API resources 'as is', is currently considered alpha for many of its features. There is no clear path to evolve the API to GA; however, there is a `Federation V2` effort in progress to implement a dedicated federation API apart from the Kubernetes API. The details are available at [sig-multicluster community page](https://github.com/kubernetes/community/tree/master/sig-multicluster). +`Federation V1`, the current Kubernetes federation API which reuses the Kubernetes API resources 'as is', is currently considered alpha for many of its features. There is no clear path to evolve the API to GA; however, there is a `Federation V2` effort in progress to implement a dedicated federation API apart from the Kubernetes API. The details are available at [sig-multicluster community page](https://github.com/kubernetes/community/tree/master/sig-multicluster). diff --git a/content/ko/docs/setup/custom-cloud/kubespray.md b/content/ko/docs/setup/custom-cloud/kubespray.md index 11671b501c..b181b087e9 100644 --- a/content/ko/docs/setup/custom-cloud/kubespray.md +++ b/content/ko/docs/setup/custom-cloud/kubespray.md @@ -103,7 +103,7 @@ You can upgrade your cluster by running the upgrade-cluster playbook. For more i You can reset your nodes and wipe out all components installed with Kubespray via the [reset playbook](https://github.com/kubernetes-incubator/kubespray/blob/master/reset.yml). {{< caution >}} -**Caution:** When running the reset playbook, be sure not to accidentally target your production cluster! +When running the reset playbook, be sure not to accidentally target your production cluster! {{< /caution >}} ## Feedback diff --git a/content/ko/docs/setup/independent/create-cluster-kubeadm.md b/content/ko/docs/setup/independent/create-cluster-kubeadm.md index f658956e1b..c867a11024 100644 --- a/content/ko/docs/setup/independent/create-cluster-kubeadm.md +++ b/content/ko/docs/setup/independent/create-cluster-kubeadm.md @@ -97,7 +97,7 @@ timeframe; which also applies to `kubeadm`. See ["Installing kubeadm"](/docs/setup/independent/install-kubeadm/). {{< note >}} -**Note:** If you have already installed kubeadm, run `apt-get update && +If you have already installed kubeadm, run `apt-get update && apt-get upgrade` or `yum update` to get the latest version of kubeadm. When you upgrade, the kubelet restarts every few seconds as it waits in a crashloop for @@ -226,7 +226,7 @@ created, and deleted with the `kubeadm token` command. See the ### Installing a pod network add-on {#pod-network} {{< caution >}} -**Caution:** This section contains important information about installation and deployment order. Read it carefully before proceeding. +This section contains important information about installation and deployment order. Read it carefully before proceeding. {{< /caution >}} You must install a pod network add-on so that your pods can communicate with @@ -467,7 +467,7 @@ The output is similar to this: ``` {{< note >}} -**Note:** To specify an IPv6 tuple for `:`, IPv6 address must be enclosed in square brackets, for example: `[fd00::101]:2073`. +To specify an IPv6 tuple for `:`, IPv6 address must be enclosed in square brackets, for example: `[fd00::101]:2073`. {{< /note >}} The output should look something like: @@ -500,7 +500,7 @@ kubectl --kubeconfig ./admin.conf get nodes ``` {{< note >}} -**Note:** The example above assumes SSH access is enabled for root. If that is not the +The example above assumes SSH access is enabled for root. If that is not the case, you can copy the `admin.conf` file to be accessible by some other user and `scp` using that other user instead. diff --git a/content/ko/docs/setup/independent/high-availability.md b/content/ko/docs/setup/independent/high-availability.md index d7cde10d82..363f29cf0b 100644 --- a/content/ko/docs/setup/independent/high-availability.md +++ b/content/ko/docs/setup/independent/high-availability.md @@ -20,7 +20,7 @@ with upgrading your clusters, for example. We encourage you to try either approa and provide feedback. {{< caution >}} -**Caution**: This page does not address running your cluster on a cloud provider. +This page does not address running your cluster on a cloud provider. In a cloud environment, neither approach documented here works with Service objects of type LoadBalancer, or with dynamic PersistentVolumes. {{< /caution >}} @@ -47,7 +47,7 @@ For the external etcd cluster only, you also need: - Three additional machines for etcd members {{< note >}} -**Note**: The following examples run Calico as the Pod networking provider. If +The following examples run Calico as the Pod networking provider. If you run another networking provider, make sure to replace any default values as needed. {{< /note >}} @@ -59,7 +59,7 @@ needed. ## First steps for both methods {{< note >}} -**Note**: All commands in this guide on any control plane or etcd node should be +All commands in this guide on any control plane or etcd node should be run as root. {{< /note >}} @@ -100,7 +100,7 @@ run as root. ### Create load balancer for kube-apiserver {{< note >}} -**Note**: There are many configurations for load balancers. The following +There are many configurations for load balancers. The following example is only one option. Your cluster requirements may need a different configuration. {{< /note >}} @@ -138,7 +138,7 @@ different configuration. ### Bootstrap the first stacked control plane node {{< note >}} -**Note**: Optionally replace `stable` with a different version of Kubernetes, for example `v1.12.0`. +Optionally replace `stable` with a different version of Kubernetes, for example `v1.12.0`. {{< /note >}} 1. Create a `kubeadm-config.yaml` template file: @@ -215,7 +215,7 @@ done ``` {{< note >}} -**Note**: Remember that your config may differ from this example. +Remember that your config may differ from this example. {{< /note >}} ### Add the second stacked control plane node @@ -435,7 +435,7 @@ done 1. Create a `kubeadm-config.yaml`: {{< note >}} -**Note**: Optionally replace `stable` with a different version of Kubernetes, for example `v1.11.3`. +Optionally replace `stable` with a different version of Kubernetes, for example `v1.11.3`. {{< /note >}} apiVersion: kubeadm.k8s.io/v1alpha3 diff --git a/content/ko/docs/setup/independent/setup-ha-etcd-with-kubeadm.md b/content/ko/docs/setup/independent/setup-ha-etcd-with-kubeadm.md index 2b53adbfa3..634df68995 100644 --- a/content/ko/docs/setup/independent/setup-ha-etcd-with-kubeadm.md +++ b/content/ko/docs/setup/independent/setup-ha-etcd-with-kubeadm.md @@ -36,7 +36,7 @@ The general approach is to generate all certs on one node and only distribute the *necessary* files to the other nodes. {{< note >}} -**Note:** kubeadm contains all the necessary crytographic machinery to generate +kubeadm contains all the necessary crytographic machinery to generate the certificates described below; no other cryptographic tooling is required for this example. {{< /note >}} diff --git a/content/ko/docs/setup/independent/troubleshooting-kubeadm.md b/content/ko/docs/setup/independent/troubleshooting-kubeadm.md index 8a66795d50..950ea7bd23 100644 --- a/content/ko/docs/setup/independent/troubleshooting-kubeadm.md +++ b/content/ko/docs/setup/independent/troubleshooting-kubeadm.md @@ -255,7 +255,7 @@ kubectl -n kube-system get deployment coredns -o yaml | \ ``` {{< warning >}} -**Warning**: Disabling SELinux or setting `allowPrivilegeEscalation` to `true` can compromise +Disabling SELinux or setting `allowPrivilegeEscalation` to `true` can compromise the security of your cluster. {{< /warning >}} diff --git a/content/ko/docs/setup/multiple-zones.md b/content/ko/docs/setup/multiple-zones.md index ea1d053fc3..0feb902f09 100644 --- a/content/ko/docs/setup/multiple-zones.md +++ b/content/ko/docs/setup/multiple-zones.md @@ -195,14 +195,16 @@ kubectl create -f - <}} +For version 1.3+ Kubernetes will distribute dynamic PV claims across the configured zones. For version 1.2, dynamic persistent volumes were always created in the zone of the cluster master (here us-central1-a / us-west-2a); that issue ([#23330](https://github.com/kubernetes/kubernetes/issues/23330)) was addressed in 1.3+. +{{< /note >}} -Now lets validate that Kubernetes automatically labeled the zone & region the PV was created in. +Now let's validate that Kubernetes automatically labeled the zone & region the PV was created in. ```shell > kubectl get pv --show-labels diff --git a/content/ko/docs/setup/scratch.md b/content/ko/docs/setup/scratch.md index ea0c97c8fc..20edb1feb3 100644 --- a/content/ko/docs/setup/scratch.md +++ b/content/ko/docs/setup/scratch.md @@ -483,11 +483,11 @@ You will need to run one or more instances of etcd. - Not highly available, but easy to restore - Run one etcd instance, with its log written to a directory backed by durable storage (RAID, GCE PD). - {{< note >}}**Note:** May result in operations outages in case of + {{< note >}}May result in operations outages in case of instance outage. {{< /note >}} - Highly available - Run 3 or 5 etcd instances with non durable storage. - {{< note >}}**Note:** Log can be written to non-durable storage + {{< note >}}Log can be written to non-durable storage because storage is replicated.{{< /note >}} See [cluster-troubleshooting](/docs/admin/cluster-troubleshooting/) for more discussion on factors affecting cluster diff --git a/content/ko/docs/setup/turnkey/gce.md b/content/ko/docs/setup/turnkey/gce.md index a69675a40e..153414a1a9 100644 --- a/content/ko/docs/setup/turnkey/gce.md +++ b/content/ko/docs/setup/turnkey/gce.md @@ -91,7 +91,7 @@ gcloud components install kubectl ``` {{< note >}} -**Note:** The kubectl version bundled with `gcloud` may be older than the one +The kubectl version bundled with `gcloud` may be older than the one downloaded by the get.k8s.io install script. See [Installing kubectl](/docs/tasks/kubectl/install/) document to see how you can set up the latest `kubectl` on your workstation. {{< /note >}} diff --git a/content/zh/docs/admin/kubelet-tls-bootstrapping.md b/content/zh/docs/admin/kubelet-tls-bootstrapping.md index e195748965..92c3b2270c 100644 --- a/content/zh/docs/admin/kubelet-tls-bootstrapping.md +++ b/content/zh/docs/admin/kubelet-tls-bootstrapping.md @@ -186,11 +186,13 @@ kubectl config set-credentials kubelet-bootstrap --token=${BOOTSTRAP_TOKEN} --ku When starting the kubelet, if the file specified by `--kubeconfig` does not exist, the bootstrap kubeconfig is used to request a client certificate from the API server. On approval of the certificate request and receipt back by the kubelet, a kubeconfig file referencing the generated key and obtained certificate is written to the path specified by `--kubeconfig`. The certificate and key file will be placed in the directory specified by `--cert-dir`. -**Note:** The following flags are required to enable this bootstrapping when starting the kubelet: +{{< note >}} +The following flags are required to enable this bootstrapping when starting the kubelet: ``` --bootstrap-kubeconfig="/path/to/bootstrap/kubeconfig" ``` +{{< /note >}} Additionally, in 1.7 the kubelet implements __alpha__ features for enabling rotation of both its client and/or serving certs. These can be enabled through the respective `RotateKubeletClientCertificate` and `RotateKubeletServerCertificate` feature diff --git a/content/zh/docs/concepts/configuration/taint-and-toleration.md b/content/zh/docs/concepts/configuration/taint-and-toleration.md index a3c0eda8dd..388bb057c0 100755 --- a/content/zh/docs/concepts/configuration/taint-and-toleration.md +++ b/content/zh/docs/concepts/configuration/taint-and-toleration.md @@ -357,7 +357,7 @@ based on the Ready NodeCondition is disabled. {{< note >}} **娉ㄦ剰锛** 濡傛灉鎮ㄥ湪 Minikube 涓婅繍琛屾湇鍔★紝鎮ㄥ彲浠ラ氳繃浠ヤ笅鍛戒护鎵惧埌鍒嗛厤鐨 IP 鍦板潃鍜岀鍙o細 {{< /note >}} diff --git a/content/zh/docs/tasks/access-application-cluster/list-all-running-container-images.md b/content/zh/docs/tasks/access-application-cluster/list-all-running-container-images.md index a376b4c098..fb3850c3b0 100644 --- a/content/zh/docs/tasks/access-application-cluster/list-all-running-container-images.md +++ b/content/zh/docs/tasks/access-application-cluster/list-all-running-container-images.md @@ -102,7 +102,7 @@ jsonpath 瑙i噴濡備笅锛 {{< note >}} diff --git a/content/zh/docs/tasks/access-application-cluster/load-balance-access-application-cluster.md b/content/zh/docs/tasks/access-application-cluster/load-balance-access-application-cluster.md index 3308069220..b653c5aecb 100644 --- a/content/zh/docs/tasks/access-application-cluster/load-balance-access-application-cluster.md +++ b/content/zh/docs/tasks/access-application-cluster/load-balance-access-application-cluster.md @@ -109,7 +109,7 @@ load-balanced access to an application running in a cluster. {{< note >}} **娉ㄦ剰锛** 濡傛灉鎮ㄤ娇鐢 Minikube锛岄偅涔堟偍灏嗕笉浼氳幏寰楀閮 IP 鍦板潃銆傚閮 IP 鍦板潃灏嗕繚鎸 pending 鐘舵併 @@ -139,7 +139,7 @@ load-balanced access to an application running in a cluster. {{< note >}} **娉ㄦ剰锛** 濡傛灉鎮ㄤ娇鐢 Minikube锛岃緭鍏ヤ互涓嬪懡浠わ細 {{< /note >}} diff --git a/content/zh/docs/tasks/access-application-cluster/port-forward-access-application-cluster.md b/content/zh/docs/tasks/access-application-cluster/port-forward-access-application-cluster.md index 6bccf05cda..13eb4b1f49 100644 --- a/content/zh/docs/tasks/access-application-cluster/port-forward-access-application-cluster.md +++ b/content/zh/docs/tasks/access-application-cluster/port-forward-access-application-cluster.md @@ -200,7 +200,7 @@ local workstation to debug the database that is running in the pod. {{< warning >}} diff --git a/content/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-1-9.md b/content/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-1-9.md index 56dae7aa97..6cde6e07cc 100644 --- a/content/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-1-9.md +++ b/content/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-1-9.md @@ -54,7 +54,7 @@ Before proceeding: {{< caution >}} **娉ㄦ剰:** 鐢变簬瀹瑰櫒鐨勫叿浣撳搱甯屽兼敼鍙樹簡锛屾墍鏈夌殑瀹瑰櫒鍦ㄥ崌绾т箣鍚庝細閲嶆柊鍚姩銆 @@ -98,7 +98,7 @@ chmod a+rx /usr/bin/kubeadm {{< caution >}} **娉ㄦ剰**: 绀轰緥涓殑 `net.ipv4.tcp_syncookies` 鍦↙inux 鍐呮牳 4.4 鎴栨洿浣庣殑鐗堟湰涓槸鏃犲懡鍚嶇┖闂寸殑銆 {{< /note >}} @@ -226,7 +226,7 @@ spec: {{< warning >}} @@ -299,7 +299,7 @@ given sysctl is both allowed and forbidden. {{< warning >}} @@ -174,7 +174,7 @@ In both cases, audit events structure is defined by the API in the {{< note >}} diff --git a/content/zh/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information.md b/content/zh/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information.md index a230f57afd..80e134d95e 100644 --- a/content/zh/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information.md +++ b/content/zh/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information.md @@ -184,7 +184,7 @@ kubectl exec -it kubernetes-downwardapi-volume-example-2 -- sh * Pod鐨勬敞閲 {{< note >}} -**Note:** 濡傛灉瀹瑰櫒鏈寚瀹欳PU鍜宮emory limits锛屽垯Downward API榛樿涓鸿妭鐐瑰彲鍒嗛厤鍊笺 +濡傛灉瀹瑰櫒鏈寚瀹欳PU鍜宮emory limits锛屽垯Downward API榛樿涓鸿妭鐐瑰彲鍒嗛厤鍊笺 {{< /note >}} ## 鎶曞皠瀵嗛挜鍒版寚瀹氳矾寰勫苟涓旀寚瀹氭枃浠舵潈闄 diff --git a/layouts/shortcodes/caution.html b/layouts/shortcodes/caution.html index 4bc88c05fb..f31d09a273 100644 --- a/layouts/shortcodes/caution.html +++ b/layouts/shortcodes/caution.html @@ -1,3 +1,3 @@
-
{{ .Inner | markdownify }}
-
+
Caution: {{ .Inner | markdownify }}
+ \ No newline at end of file diff --git a/layouts/shortcodes/note.html b/layouts/shortcodes/note.html index 7c096dd8e4..745ef5e6b3 100644 --- a/layouts/shortcodes/note.html +++ b/layouts/shortcodes/note.html @@ -1,3 +1,3 @@
-
{{ .Inner | markdownify }}
+
Note: {{ .Inner | markdownify }}
diff --git a/layouts/shortcodes/warning.html b/layouts/shortcodes/warning.html index 6b4ea6a3dc..b90f76d49c 100644 --- a/layouts/shortcodes/warning.html +++ b/layouts/shortcodes/warning.html @@ -1,3 +1,3 @@
-
{{ .Inner | markdownify }}
+
Warning: {{ .Inner | markdownify }}
diff --git a/static/example-templates/example-tutorial-template.md b/static/example-templates/example-tutorial-template.md index 5795140d87..ec2b70cc8e 100644 --- a/static/example-templates/example-tutorial-template.md +++ b/static/example-templates/example-tutorial-template.md @@ -7,7 +7,9 @@ content_template: templates/tutorial {{% capture overview %}} -**NOTE:** Be sure to also [create an entry in the table of contents](/docs/home/contribute/write-new-topic/#creating-an-entry-in-the-table-of-contents) for your new document. +{{< note >}} +Be sure to also [create an entry in the table of contents](/docs/home/contribute/write-new-topic/#creating-an-entry-in-the-table-of-contents) for your new document. +{{< /note >}} This page shows how to ... From 08d0e1b93cca7cc1d3f2d68ffa497f28b2f00e0c Mon Sep 17 00:00:00 2001 From: William Morgan Date: Thu, 8 Nov 2018 01:17:10 +0800 Subject: [PATCH 026/222] add "grpc load balancing on kubernetes without tears" blog post (#10891) * add grpc load balancing with linkerd blog post * remove date from filenames I can follow instructions. * update links with new date-less paths * Update grpc-load-balancing-with-linkerd.md --- .../grpc-load-balancing-with-linkerd.md | 172 ++++++++++++++++++ ...df1031c-cdd1-4164-8e91-00f2d941e93f.io.png | Bin 0 -> 33987 bytes ...o-8d2e53ef-b133-4aa0-9551-7e36a880c553.png | Bin 0 -> 21413 bytes ...ee81-144c-4eac-b73d-871bbf0ea22e.57.42.png | Bin 0 -> 123656 bytes ...6100-afc1-4a08-a01c-16da391756dd.34.36.png | Bin 0 -> 120411 bytes ...0448-5424-4e47-9828-20032de868b5.08.38.png | Bin 0 -> 88193 bytes ...o-09aff9d7-1c98-4a0a-9184-9998ed83a531.png | Bin 0 -> 22662 bytes 7 files changed, 172 insertions(+) create mode 100644 content/en/blog/_posts/grpc-load-balancing-with-linkerd.md create mode 100644 static/images/blog/grpc-load-balancing-with-linkerd/Linkerd-8df1031c-cdd1-4164-8e91-00f2d941e93f.io.png create mode 100644 static/images/blog/grpc-load-balancing-with-linkerd/Mono-8d2e53ef-b133-4aa0-9551-7e36a880c553.png create mode 100644 static/images/blog/grpc-load-balancing-with-linkerd/Screenshot2018-11-0116-24b8ee81-144c-4eac-b73d-871bbf0ea22e.57.42.png create mode 100644 static/images/blog/grpc-load-balancing-with-linkerd/Screenshot2018-11-0116-c4d86100-afc1-4a08-a01c-16da391756dd.34.36.png create mode 100644 static/images/blog/grpc-load-balancing-with-linkerd/Screenshot2018-11-0212-15ed0448-5424-4e47-9828-20032de868b5.08.38.png create mode 100644 static/images/blog/grpc-load-balancing-with-linkerd/Stereo-09aff9d7-1c98-4a0a-9184-9998ed83a531.png diff --git a/content/en/blog/_posts/grpc-load-balancing-with-linkerd.md b/content/en/blog/_posts/grpc-load-balancing-with-linkerd.md new file mode 100644 index 0000000000..25739268c9 --- /dev/null +++ b/content/en/blog/_posts/grpc-load-balancing-with-linkerd.md @@ -0,0 +1,172 @@ +--- +layout: blog +title: 'gRPC Load Balancing on Kubernetes without Tears' +date: 2018-11-07 +--- + +**Author**: William Morgan (Buoyant) + +Many new gRPC users are surprised to find that Kubernetes's default load +balancing often doesn't work out of the box with gRPC. For example, here's what +happens when you take a [simple gRPC Node.js microservices +app](https://github.com/sourishkrout/nodevoto) and deploy it on Kubernetes: + +![](/images/blog/grpc-load-balancing-with-linkerd/Screenshot2018-11-0116-c4d86100-afc1-4a08-a01c-16da391756dd.34.36.png) + +While the `voting` service displayed here has several pods, it's clear from +Kubernetes's CPU graphs that only one of the pods is actually doing any +work—because only one of the pods is receiving any traffic. Why? + +In this blog post, we describe why this happens, and how you can easily fix it +by adding gRPC load balancing to any Kubernetes app with +[Linkerd](https://linkerd.io), a [CNCF](https://cncf.io) service mesh and service sidecar. + +# Why does gRPC need special load balancing? + +First, let's understand why we need to do something special for gRPC. + +gRPC is an increasingly common choice for application developers. Compared to +alternative protocols such as JSON-over-HTTP, gRPC can provide some significant +benefits, including dramatically lower (de)serialization costs, automatic type +checking, formalized APIs, and less TCP management overhead. + +However, gRPC also breaks the standard connection-level load balancing, +including what's provided by Kubernetes. This is because gRPC is built on +HTTP/2, and HTTP/2 is designed to have a single long-lived TCP connection, +across which all requests are *multiplexed*—meaning multiple requests can be +active on the same connection at any point in time. Normally, this is great, as +it reduces the overhead of connection management. However, it also means that +(as you might imagine) connection-level balancing isn't very useful. Once the +connection is established, there's no more balancing to be done. All requests +will get pinned to a single destination pod, as shown below: + +![](/images/blog/grpc-load-balancing-with-linkerd/Mono-8d2e53ef-b133-4aa0-9551-7e36a880c553.png) + +# Why doesn't this affect HTTP/1.1? + +The reason why this problem doesn't occur in HTTP/1.1, which also has the +concept of long-lived connections, is because HTTP/1.1 has several features +that naturally result in cycling of TCP connections. Because of this, +connection-level balancing is "good enough", and for most HTTP/1.1 apps we +don't need to do anything more. + +To understand why, let's take a deeper look at HTTP/1.1. In contrast to HTTP/2, +HTTP/1.1 cannot multiplex requests. Only one HTTP request can be active at a +time per TCP connection. The client makes a request, e.g. `GET /foo`, and then +waits until the server responds. While that request-response cycle is +happening, no other requests can be issued on that connection. + +Usually, we want lots of requests happening in parallel. Therefore, to have +concurrent HTTP/1.1 requests, we need to make multiple HTTP/1.1 connections, +and issue our requests across all of them. Additionally, long-lived HTTP/1.1 +connections typically expire after some time, and are torn down by the client +(or server). These two factors combined mean that HTTP/1.1 requests typically +cycle across multiple TCP connections, and so connection-level balancing works. + +# So how do we load balance gRPC? + +Now back to gRPC. Since we can't balance at the connection level, in order to +do gRPC load balancing, we need to shift from connection balancing to *request* +balancing. In other words, we need to open an HTTP/2 connection to each +destination, and balance *requests* across these connections, as shown below: + +![](/images/blog/grpc-load-balancing-with-linkerd/Stereo-09aff9d7-1c98-4a0a-9184-9998ed83a531.png) + +In network terms, this means we need to make decisions at L5/L7 rather than +L3/L4, i.e. we need to understand the protocol sent over the TCP connections. + +How do we accomplish this? There are a couple options. First, our application +code could manually maintain its own load balancing pool of destinations, and +we could configure our gRPC client to [use this load balancing +pool](https://godoc.org/google.golang.org/grpc/balancer). This approach gives +us the most control, but it can be very complex in environments like Kubernetes +where the pool changes over time as Kubernetes reschedules pods. Our +application would have to watch the Kubernetes API and keep itself up to date +with the pods. + +Alternatively, in Kubernetes, we could deploy our app as [headless +services](https://kubernetes.io/docs/concepts/services-networking/service/#headless-services). +In this case, Kubernetes [will create multiple A +records](https://kubernetes.io/docs/concepts/services-networking/service/#headless-services) +in the DNS entry for the service. If our gRPC client is sufficiently advanced, +it can automatically maintain the load balancing pool from those DNS entries. +But this approach restricts us to certain gRPC clients, and it's rarely +possible to only use headless services. + +Finally, we can take a third approach: use a lightweight proxy. + +# gRPC load balancing on Kubernetes with Linkerd + +[Linkerd](https://linkerd.io) is a [CNCF](https://cncf.io)-hosted *service +mesh* for Kubernetes. Most relevant to our purposes, Linkerd also functions as +a *service sidecar*, where it can be applied to a single service—even without +cluster-wide permissions. What this means is that when we add Linkerd to our +service, it adds a tiny, ultra-fast proxy to each pod, and these proxies watch +the Kubernetes API and do gRPC load balancing automatically. Our deployment +then looks like this: + +![](/images/blog/grpc-load-balancing-with-linkerd/Linkerd-8df1031c-cdd1-4164-8e91-00f2d941e93f.io.png) + +Using Linkerd has a couple advantages. First, it works with services written in +any language, with any gRPC client, and any deployment model (headless or not). +Because Linkerd's proxies are completely transparent, they auto-detect HTTP/2 +and HTTP/1.x and do L7 load balancing, and they pass through all other traffic +as pure TCP. This means that everything will *just work.* + +Second, Linkerd's load balancing is very sophisticated. Not only does Linkerd +maintain a watch on the Kubernetes API and automatically update the load +balancing pool as pods get rescheduled, Linkerd uses an *exponentially-weighted +moving average* of response latencies to automatically send requests to the +fastest pods. If one pod is slowing down, even momentarily, Linkerd will shift +traffic away from it. This can reduce end-to-end tail latencies. + +Finally, Linkerd's Rust-based proxies are incredibly fast and small. They +introduce <1ms of p99 latency and require <10mb of RSS per pod, meaning that +the impact on system performance will be negligible. + +# gRPC Load Balancing in 60 seconds + +Linkerd is very easy to try. Just follow the steps in the [Linkerd Getting +Started Instructions](https://linkerd.io/2/getting-started/)—install the +CLI on your laptop, install the control plane on your cluster, and "mesh" your +service (inject the proxies into each pod). You'll have Linkerd running on your +service in no time, and should see proper gRPC balancing immediately. + +Let's take a look at our sample `voting` service again, this time after +installing Linkerd: + +![](/images/blog/grpc-load-balancing-with-linkerd/Screenshot2018-11-0116-24b8ee81-144c-4eac-b73d-871bbf0ea22e.57.42.png) + +As we can see, the CPU graphs for all pods are active, indicating that all pods +are now taking traffic—without having to change a line of code. Voila, +gRPC load balancing as if by magic! + +Linkerd also gives us built-in traffic-level dashboards, so we don't even need +to guess what's happening from CPU charts any more. Here's a Linkerd graph +that's showing the success rate, request volume, and latency percentiles of +each pod: + +![](/images/blog/grpc-load-balancing-with-linkerd/Screenshot2018-11-0212-15ed0448-5424-4e47-9828-20032de868b5.08.38.png) + +We can see that each pod is getting around 5 RPS. We can also see that, while +we've solved our load balancing problem, we still have some work to do on our +success rate for this service. (The demo app is built with an intentional +failure—as an exercise to the reader, see if you can figure it out by +using the Linkerd dashboard!) + +# Wrapping it up + +If you're interested in a dead simple way to add gRPC load balancing to your +Kubernetes services, regardless of what language it's written in, what gRPC +client you're using, or how it's deployed, you can use Linkerd to add gRPC load +balancing in a few commands. + +There's a lot more to Linkerd, including security, reliability, and debugging +and diagnostics features, but those are topics for future blog posts. + +Want to learn more? We鈥檇 love to have you join our rapidly-growing community! +Linkerd is a [CNCF](https://cncf.io) project, [hosted on +GitHub](https://github.com/linkerd/linkerd2), and has a thriving community +on [Slack](https://slack.linkerd.io), [Twitter](https://twitter.com/linkerd), +and the [mailing lists](https://lists.cncf.io/g/cncf-linkerd-users). Come and +join the fun! diff --git a/static/images/blog/grpc-load-balancing-with-linkerd/Linkerd-8df1031c-cdd1-4164-8e91-00f2d941e93f.io.png b/static/images/blog/grpc-load-balancing-with-linkerd/Linkerd-8df1031c-cdd1-4164-8e91-00f2d941e93f.io.png new file mode 100644 index 0000000000000000000000000000000000000000..eb538a22166a2dea4a05ba8375337fcf7273b96f GIT binary patch literal 33987 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

*Z?h(X6;gzxaboXRRV@V14cA~g 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 K(Mn;%fd2<#8X>m; literal 0 HcmV?d00001 diff --git a/static/images/blog/grpc-load-balancing-with-linkerd/Mono-8d2e53ef-b133-4aa0-9551-7e36a880c553.png b/static/images/blog/grpc-load-balancing-with-linkerd/Mono-8d2e53ef-b133-4aa0-9551-7e36a880c553.png new file mode 100644 index 0000000000000000000000000000000000000000..c49c8cca2d0e854be11ac65b88432cccf8f09b12 GIT binary patch literal 21413 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�x|LX;3A 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 literal 0 HcmV?d00001 diff --git a/static/images/blog/grpc-load-balancing-with-linkerd/Screenshot2018-11-0116-24b8ee81-144c-4eac-b73d-871bbf0ea22e.57.42.png b/static/images/blog/grpc-load-balancing-with-linkerd/Screenshot2018-11-0116-24b8ee81-144c-4eac-b73d-871bbf0ea22e.57.42.png new file mode 100644 index 0000000000000000000000000000000000000000..f043541de72bdac7bbb68f8d52ac20be46144da0 GIT binary patch literal 123656 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

WBhaG{hH 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
  • {5O>#k;;mMGiM(@33y2*m&*4!bD8wl56t zhvX0X&*fg0Itt2oT2OdD3%i`l;;qeuCV$MkQD|0ZfuyKaV_=7Gs(gbNn3Z;^Q4m3X zpY8BR6!alq7#HVi%i>zP?0=>QY%oK85is(XjkNDu`WmIw}O&jq@c+y>@86>hdRi|NKpC zL?TUiZ6wZxQT$Wvhr2G*u~vE?v`Wu#f*yJ}YEMW|&Z5bitflmyToVZN66xdF`>fy0 zE@EQYrZewwIGq5mw~--$H$=3YeFlZu4g|t z&9m$J5_7?f55IHOLMkN9e$2@@+59j;3thtJ>2yWkk5c75{gd6eZlo?gVZ+lL&072E z8V^npss=tR{i6mCIGmiCyxo1df1!CCWvkDwbGL`5L&CMzjZxa5a2B17tqHo51dDS# z{+^-m!#(zF_UI28qQBIU3K&UUL1qKWmCrfCg<}y>{5YH1ds5%-dIOb7R=Rg#j=pNFBDYUnQXBii>T&^&B94t12cU>{4ZO1vGUcf^T{AkNbn!ly*GPD z!jG*4){R~DB%u53AdsrPEjKvo1mT{1$5VXt-*!?>FtPUlrNeQJ(_aJ{jb-zxf@G%9 z4p5%Ud~?(qLNn`bPYA|IDfW2(ED|9a+(7pqeNvBH(ai4Jxk_yt((A+0%6g;u4DUyC zC_hng>oJG|WOIP-E0F8AR>QrIy@ni4hD&>Oc7;mM-LWh+o^ib7s=!#wtepr19bw z@UF(|hESy*}N_}gdijqTv=YouJ z3wP{Ep}|adE3?Hvgiy!Qc&9oE*F$xWc{kxh@FiukFFBX^@{!TEkoCcYg=!!|&92~- zBu7I1orr4^uj}X+o)xHIe8?H5kK$m0LOeqIbF%tDs!2&O*+JEqgY6LZ2f|>96d;3c zSYDbGbw@1y7&XfcnCC>4yr`-}&N>Is<|gS6gFZtwV~YzdV0kb#?9}!L)Ze3B=lJ$n zzP#&=eU&I_x<4t-N~|l|DZnd|`Ci1Ui}xRA8`$8)KpM#;<#%*^ETEvM-+wl?!-08g z$*Aw9!Gdc5Iz2W2!MaF;_vz!(M@m;I5QH08bQ7YTClx!m`7YTsBl@VaL#V*nKnbp7 zjpSut@`t*VK!n@V>s^P9BsIix7K-9E3@KsgmjxhP|8va-R4v3SPv`4KB0-mR=Y@YSZWQa$ER>FMfT8tjEvy%Acu*n-YqY{*)Twc#IZ&IqZ-8f|I6%L`sQDuZiu5 z4tK*4Y?8~>7lA&*s{FZ=3N$uTcdrC{Y5WJ)w4GcjfEr1h#}v2j(+)XNiAm>%jn9)d zlsi~(dMXZwZhOr8mOYl#5QH+&trrbL5{HE^9)$YmQt|aYw=u#_rY|}C-$8n?3CjC7 zE_NXOJRtXi!nt>;=7w$SP@$@EE4U7-CqvAL%KAPRY-}~&DQdrb(Vt8rg5Xq@NfmPF zG@8Z>iwyBAS2B`Iq>pR{BtrRX9<}Ip-mPx##x08C4ioCV~#)Aqbzg$YW(oHH+g0ic78f*1^ZGGxenoZ=Aa6LH3LyqPlwrs!SVcXHlWh1np%WszXPJQ z=-DY1YHqWjjH!@7xFPfr0;@{8UU)IYM*(WmZoy` zE+YXC6N06EE+T5+x4eiNVYa9tzlA(YVPs~ws`XNN=bV$GD5TQrkqeszeR{tN>@FCM z(A#SLSnTrsa>t{-Lwr^D=RpL& zI|tNW;T9j=N>RS9r{>AxpU>`lYBrEgOm-_HO6xc z3)lF72gEIq&`cIJz$@R~xWj((P3si0GHL8!v2L`kq?rz~@x-f5-~OR#RwEc`Z`%54>Qc}yrhL4|!b-(QHiDIXJ#Wq@p}UxeQAkam1K66@H*{xu_-5 z;>;&`#HH0tq7Dz*(!dg$jf6Vz{wVe`5Kt@*Ecx$?2=EP=c(O|VVXmaDAdgRBfnaAk z>!emUb9sd0BpW$k{!u?{;WtM?NpFkXgo?x@DM^(iI~XXScuF@En#T@S7bpf9&(h>! z*=Of-zMTYl4NO*oE-&aYze8q?NI*F%Q`tk&&2&fTw71`m$5DfkaSU9nI zP8oN=;;pBC+DfEd-jslQwAe~PH<+Uy6Lrt9=6*z&WGOzz9z*=_5KGIr8fog%<#C7f zzr`gPYIWy1#rTq}>HP*;?25pHe(oxj{)PZuqQt!LdE8p^>*GkQ2P5?@wT6?$BccDaN~JYA_Sj93DRR}t?0#XudgI8Y*Di9fKY`RgY}$HY`e z&#YPfS?Kv(yoH&L?t?eDNV#oy??`kg z;gFW1qQTBuy;Uj|nV`9C9)-S3fD-nzIL`aSFyPxZ?AshEj;t&9(%|BTzk5muZv{%n zD1SZ#SpbLb%YNZkC3^=4m`=wTHFar%mFjGVy-~4wz*J`1^!j*&qVWRsrMZh2-@9`( z8Lo!Nae_cs&HiRaeHf4kZ>hg=-*=PcnsvQrM8M@Cmx_5vmQOr)W7Uz@g_bTbcI|2obU{Y^QC#pF( zwgNQAc7U^G;_J)PupbPPp;I#;oiTa1++lM*)>v>^^D?>I9<&GSH3K;Mp5H|--nC1y zBH6DFfffuXPWMmQ020{_Ik_ByAFmz z-iO!)SpaQyN1AlU7*D`MmZ(G_nLLf=4sP{@f*S&~Zlsx>&wq;JY?^kk|KpqV-yRdC zUuG+G8MgW(69FVewW94-s|iRU*#Q>ugoai3;XH4UB-o_cI+(@jP?hWzpiCIvdnAPJ z``=*|qmRoqYx?$It}@@^0BxE&wQQ0>XADy$C=5LEzK6Ix??%%W$V&q2!o^6DLS%mO zvYbJoDDxcf&9ftgSS;mlm)0^*fy;&#D9v7f2;8amGEF`<%Ml*>rd4u-xaNgoQ@!CY zj$qJz)u_3>PCp~peDrMBPh=X?Nq8L*-i4Q7{Rj%AN$Ir(>ShL z2rf8XX-VaXF6Bs+HW}zCUS$33Aje`yum_wF=GN(VNosx2_c^S;RL42gDUd8y%`We z^F+XASfbhSfc)Lbpc{;gXINqY{9rW@$qnR41TL%CI~2E2QHVkKZm9z{+xX#MKQ(;@ z#+dL_n7Ko7@UYpoMPheE{O~$X?+XTJE50KpfKAnm0~T=(*4_lGL{B{$6oXu3;x~0? znbh(ubk1Z~7SH4BcG#Y{bxq!~c`d9}vadu=j^-Qltsa^JK~*~)TUs;YYMt|)*~BpW z5DAKz9XY+tJi^N4e{tR3hE}W*79X0!IUO>6Fz(+7nfx zY>+*egHTyObp*_+;J=cwv>6|Vc|?8BTkzKl*sX3e`#glUUQd3dw)$KiW`TQt2MD89 z&9WkPCB29}*F{wXp`al$wtc-w4tD^>xa7AA9XcX@XAaOW#Crw+NDQelD z4eH8C#+KMs?ruKnCPTX*>qNcoE>3823w-qNv14@t?#OmGgYD8@CkNV#*xa#14XhIQ8&+eIhI&4xCEyY zK8i9jX7gj6;IiT2dd^?+LFR!5j_q(O;sYf*BaC0hk(ZF@N^_g7pO$Ox{Vx^uhJIm2 zeW8x4v{`FUAi2nb`ZY2%R1%j_H693T4Wgh?S!P(Sd`@(tzxIcwvC7M0VkXtbMt!}a z@pVPc7)fSgJ0*>7YM%0o_{zuf@ir{@8|Ljn?4ffD?UFH0$kYaF+8qD)ViT%TI zy|sO3)i1;(>MmSe9aTo{hA+E#U_v9d+vO3ou!keli-8j(h2 zdqyNoSk%IzeAwAoZ^g0D=zSMs-z5HW=n=lT`e*TA@jy&JGRUvwvrpBeissjsi?W(_pBjJllG)yDq-)-x!cFQTQsqm zv?!0+?0zl&t{FdjH!OHnwK&7_p8y2#*e+%#NeUe{5}V7PfykyHU9v3y0`vXxY-(DA z3lgzl+qB5mN8QW+kFB=~inD8@Z5vN;lHeLNxVuAecemi~?h**@uEE{i-Q6u{M9z#-?i4W=9pvFA`NofA-LdJa3ja@*}k|bfFGqQ_$StUKj&7?=V$gt z^_GX+a2eyUS8zScrthiFiQgYz1{&1?f%MCV9+#c_B-Kbi5_hrH6uzIZ*6E*!q1afk zGFk=?j(pJ3?M2D1t{zK+BW6)%FPY%Rj(oORKlTGg4nz-g(L{8Qd@A|c9k?0R5S z3+4D<=PS36T|D#+eKE*>wN2y-G+sh})3qN!Zw!R#Mmd|RH=ncmOT;Zgq^yq#pD{t{ zvh?!ypq&^IxAX&ol=(y;ZLRg}1Q>6eJ=_|3l3!jwPD=lLOF$>whE!Jzy-S{FN9zy% zCUz`@U~8YmH4X0J6O$i=?54^dOs+vrJ*eGI23`f2hengME8=AtqEWg4DX~nOSnQp4 z#^QePX+WQR9gCA7{_mK^f(+N*_Nd}GfY@*Ci(7>1Joftv#`+WCK;*#=n!^MqoVunX zu;W`_$l8sQ4ry_zo>eaz4`64D*Kz*KCLA40aID$i#5P7t~Ypj&1t(UHI^mx?kG-Y!RQ_ z1`k)p)>N4EqRtIsF`KA)-st$U_&wWK3-7&nbuMx8N~DV&|K018=8VS%S9lG%HKqmQ zS`qdzskvU<+>u&4JAHOsWgW1Lusb&OiZBsfIo9GMO&-aa!@89-A(&s&A-+5}pgqE| z;-@{xRAVG!q_aeg=bFX8J3+k5EWFfphpQK!kBmeBqzj$J>%s1`y2fXxS#4#T=DVCC z_Shhvtv1z({Q1z@t~|Glp!Py+gfyX@0%Ear!KO-BtWEcO{2r6c-#+ck(L;$&BMzd} zqV$Y9qhV4e8_Uc>RdJ~c1gfQ)fWzPK2U_n5V+3vEsu<2wr{o&$EA5b!B|p$2Zn{{n zv_N;gO+fnOH-BOP4X$NXf6a$pJ z0&x%p6$w$S8vzClloL(MoBjKP+ncnucIu=~k{WR4yd_fZ!l#DXcsfL%lNZT;efuD) zx#vK~`3lRqnTl5RLXj}}Mnw0UahMZdrI*5$%6JYw^pA}rp2`Dhyu)qVn@>5p$2>AX z$~d|9u7YsU%ZGC@cf4XBh`2v_X~%r;Q4*1B)?NF)sEhMqg%(k_v}|zC-k~=3C?cI$^K^IHxyKqb@ea@FdgBPk4O%T>}LT-gclp zs-t{P0e2$Mz6ltI15wcFxg|LOR_RNN`M%;2_TtZWG{+xVR$#chp17co|4I?b>#iLn z-rbpvmJPw}3lxK~;9q*Y2nsQ+t3b5nsieEwBJ2LSCv$BcM|ENEGwd>GzdZ}3-yNF~ zB7~#HN_6p2Ev+CXUM;p{>$o`ZX)H00%pKjmw#F^*aEVW3At85bC0EEU4jDe9Vtt@+k&AzVVEtxF1rIGGf6 zHv1oI(^f4nh^7}-;*eA6kjBNVhpfca(I%=cqlvd?Aa)}{Ed}iUzQQ$fHfp$^{JXXz zM>~qYIg&7YWLo_`6aTDjP}*dx!pK$=eQb_S42(EazL~94EliZ!jnP0xy36=GE|qW&HJD zG|8dYcGxq_5&K}r!5Dlar{lglFLu!Kui(Tn!Gpb~Pc!1Xf3M=HbBXo|F!;redOnZFbqG9n%ZAqW zaBbW~w7?h$z_#!Evz`(~T{Ly~=?COe(W{O>UTPql+Do?U&Bz`{fq-R>0&cmPc1`+& zvNmUG7MJ~5F~RiK`7;DjBE-vH^8T2P?K*9)=Tqa9B|Z13>!Eclun;JDkU&@Kw5Hf{ z5a0=1qwvvEz0f8}em!u&=KU3cc*?`T7BheubFZtc{k?!HYji?(AxwEVDgfTR2vA<# ztj$I#a5B%QQ(LEKv~v8*9e9fmny3Ow*rY3KG}K7nVHe|=$>`q%$tnLDHn3H5p{BKf) z^a-2P_30v=3drdqkEX&_6?PV%g!*1~g-WUGM=XW!UuvC(c0cWg(s-D$aGBTEUpghy zUN-3&UUrQyCkyxvBO}Cpa3+++e@?S(_EvRG+7CB4Yk}TH1W?d=#n%DG1G8n0&_)9& z>akyx-%jig%~%-vub^NNtHqc1tC0{~Fj$VsT34=hT>p`661-d2!N5${7-b`W-V&sd zI}kwBQv&#QS)=o?wfNxM5Cr1dp=~_sT_(6~~EoZRC8ci;l_%dQ|`}H6%q}W9W zG@`#?28xX+hCDJEF&<}z6Q$(f!snj5Wjh!b@dvY=!F+_FKB!7~USg8EvRqU&_t=H* zGJwnQ0-OuuMOMLH!{0)gYRDyz+_S_=L;NzKp|a;?v{hJPXTvOZpXq(K(iqz$QMc0* zWMBCBcEzO>_%T^tg&{=VhytS-d~|#Ylq1CodF2(CZ>iJbQ%RWhpI6bm16}${#m^xU z!J|+!%X;BWl=$eHEqKqd;_vULe0pp~HWEchT}PI3e4H9Xf06FC-Jgz%#6Sjqwm^Fd z^&S?`Vk&RAO!Ao&C048JMTIn%3XIquxSs}ZL4)6B#U-L9`)jU`{Vu)H!m)~r4-cDv z{hBZeud-ZGY4w$Uw;u$XnjMy(H9>_n9_1E_@1^k33Uw_RR$LR|%NAVY5x-|QF$CgW z-IHA)6pTf#NHYT0F%%as?dww!|7%IdB3la=rn(Y>L!Aw)BqAV@N-zARu`-^rESquR zB5sz2PeJvFvQy^S~u0^*S7QP_;h>@yZOG-sY@z zs3^@qe|X*Zmx(L#v+rAU;5>@4;xts&a=-eA&vbO=g}unF!)8qzzbSi|8<@9WnQ1V$ zsOY|v>4ohno>Z@pqf!be^(=CFR_Kg;O7z~iYFRWT^mGhyvdyN_xt`xA;S%@0arb|D zj?9ErmE$87o8)M$;JKfag;K+>$Ky*v|KWF%t4}Z1v+>7gWmdOumgO?E2}EYC*?DuG zLZz0yslZfk*m)23g3x1dT8Kk8TmMraZ!+sxE$hF!MkjOFE3s~P`>mOc$hlYCINKqd z)_$kp4(s(@e4KIw8MPvB++9B_xjHf-teWU=V83}0_ITP3 zW6gj)_7g$}PvF@N(D&`YcbqMR>=A%U{&jLUlhH6(;)i+xj6NwIE`cBB0f6K$5we~Q z;pD?~XXmm24#V|cJN@3GmTiNIb_l+UdU;^A(8=5LMN@?qz_DNO_!?Y_gtKJ?X~+#Y ztOjO(6)eUa>iDi=Bm~8?-9G2u5#Vec;W;`mLR`#%RnM`MGEvJZ0TW7T{Mz;Y%+KuQ za}z6eyFQ6;(&UhvRoN>+?U(hD?Bwl5)k&QgT+7Jny<-i>q)++?xU(IVFM6X@froeT zs8<_qa9I3M$emY_w(}eUtg!UQ@k2L9a}&s)Ixp!~p8Wlr$heZHuaF-ZAYW#(-ocY7 ztgU-4X2H%XFLAZ$!DrK1Ja8?Oog(tAAYZ+i;lu02`&-qm=@T6lwWQ|!gFB{H z;g{^pv`;810AlLV+dxuzy0ax7Mw4gV%7jKW+kcf(z8tHhgk7hK{&`h){l(n9kB4C4 zxc3D0a&W5f!*;;izCtwr2m7Z8Z>|d*QG;54O@davm4wl~1)K(eT+=XH)VA zpj3LV-84K_HJX1NkopAZfHB-`GG8#^^qIbLcoy+ZdfsT3JNNO;Z8&eEZ{~)4(|xMb zzCU$ls^67Q?K1APTB~J^lMB$zam;P`?#*mGs>N-TDf!H&p-w{rYdmU6cpCHl-yASN zX?5%@+BT_#@H|FIY<~pB1as`L&(Szua*K_+I`FjBdJmLof2I=l19T~+wMQ+sKgykr zF+8!$jq~SujwBsMph3f5&qg-Qj^i$Dfvnbflcwc<;LKrPp}^sI#=3$=OF4keS@rMw zWy7$p!n3v8w`F$x!RAM;~7pJU3cFi8a*wlYqdnlkj4_&QNG7q zdGd^+=NZZe;UCY(5s>b(1%KYJ&n7)E41Z_%O5X8T1|JVBKD34_$ zO@+w4b@%y!nQPdz)FYVvx5#Mv-0EnGu%l6KY4g7YQpT&Oo+Co(YH1=w3nxiGYzqz? z5N*>samM>tP()Zt71ioz3P%Qme_)sjcGBba)L73H7)^?5j-K-=aq&-}=&)1HB zOrtee1~iIyA{`yRNS7B|DHzy=!Ry&N>EgY>7DJ>gRccwj2*kNRXWJ&v$?{IP*)Oh` zuCz5D6{e5-{C*IJ_Rjg)`l$=z*w2nskpFpQ3R(+?RFJmk3jCC&Jl5HSsF%17x>8t! zu?~sGTOWIOUs+|0LtKTwE#j}~B72QhvSz3d(2V*FO(-ue(=t2sl85-2NRhu%Isq9c zmVDYZrdfX~s4jW{_K5lOpENZ{UuucDw>~VW3$yHulzt8vfOKWJY??EXN6uu?CZ~+6 zqdY_qTPmzek1J-oTn4RVYUFdG)EXOFN%p|3dyhrQ$iz*A__5gqM{mp}qX{Sv<)Pzu zysj_Dtlh$>bK@5Gk(b0C5 z+sZ`xLv@^*5fA~Z<*zdOu(;nu+Epy@<}~s?Qkyvjtp96h+$-@FC`bP$VdHiOdo-te zd+`VEwxi%^OC@v8Lp-=t8jkvt*ZZ88gaYH5-$p8^y;PQ->-$n10TYXqY6azN*cB*N zR1^o|SZBjHI?8;u#yibh#A#9m_dATW&b4BJ-aX<tmqq+$IyNWE-XM0LQ=Td%;ULWy_( zj3l35K)9#*FT8j*~7X<1@sftaCm{x06nC08;3wHyxzKJ zmbPqy0sJVnN^J&mIRbCv^q0NR35W9<>j*iG)RI}fp1*BoYfIJQaNtvH89Na^E2*Kb^p~Z+@IcToqyh6El91TJ;WD&EP(^67~J?llWJcdSa*;v zLn13;mwB(pnS1s9TO&VX>t5!yBg!wwp(ck0MOLjK5i*3dLK2__uSU0a+j8;artbh! zrj4>`nxdh^zjTo`6CGZ&t$sOHF~)Zi*nS0NF_O4l6=2E)hG-SSwFz3RSA82SD*x67SUfWFI>Pw|M!j7a3S9DGQSc$n>Bg8a z*mz$YWqUzi_UwCqP3vJ|!Xz%q&nC~)o9Rl0`#a$6tz(SL-C!pCtCy?%*?@TMXH>_9 zdMcl9t8~kgM$1k(g~7Y9S?G7v+Yd+y>*)FN3mGLaOET ziF~}Xdy0t>ndQfG8~j+6Lq$240I>^lbDd~Yyp)_ZMXCjVvs@RV z5`^zXuB<~hnDXx^7M~=@q}UzWAE}VDVqTMkg#h&%1d78IM_$8@{}k*S{EI9*$Lx{H z!B8*KFt(pA&4B3QN6Uq$*I8_&K>uAr0Dj25o9;}=0j3%1&!gW6b2rR%U?i;GwD=_; zjw2t(kI0YU#$Nn8L`XDsBw=^@sFp;I)!y%&$T@?idhNN`hr%&OMUt?X#i%M{n?Z+O?p zdsnW*b8m`+E5OEhP(tr;@xUIEFo4O`&?+n+}3R)Sym=_n`6JEq(vq+ z<~F#^Nq%%v7}rTrbdJg^qYCRf*ILqVb36{|?&HzfUZB|4o}rA*NGgRqOK9`Duh_s} z9+P)B7287v^O`A%M8VghVM3>pK1@QAa}&r31Ik^Midv`F3O<21i-cU6umiBrKUY7|7{>*03`$|Dr>IZGf*#7qP)9T*E1>;@uckp8IvjJJ$F}Qt4e{ zG(!@3So-6$`Eur3*f6|K~{`%Ho&(}+jV0nWF2x0fM%A(P|$>HuCJ@kv4LCFexX_cB7lZ2XY1 zkoaJkgfxeal@)U00i_UT`PCrGFJTOGmSvYpMdM~m|Lx(cTuKE+PE@1gy8X}!989P= zR43M-dz3@r(jl?=j}#Yk(hzx4G)4a7ay*D}-+FRxHUwhnhL!xQs;m&VdK4AH8V(fJ zPbg$h)0`$k!+qgK!~(-;lS*DAsGVse>$~oK0-uJZ9I!{CW9O zQ0e8ZBDh4@H8+s&&;uJqi=R`RSIIP3lM~d=OMgAjpWc+1#!?}cJPe8S!fr#^@Dk`l zLq|Eo<%H6|R@fNAt(>?na|Q$PtMiw;sZXlYQHp`PMrs22msVn#?20|Orc>qJe-)+2 z)jTcdbKMi+&=|@(5P9A|Jm>tL=I7b9czL=UIl49`hEV8Y^22JCyt0x zh%75x2tTO9?LP=^LQh{`MqyD=Q6%7yM_}uRyF~jfDRItGZhs01=-6LEZizm|jCPyO zI|6<^q+}Kx>xi7p`%B>SS0VWH2a-GIwIw7Z;6#VQ>41b_P@>goxvjDdTr#q|=7P)2 z`;Wl6+Hco5OBAKWL zl2u~+7pULAN!JbKjOct~LLV02tL9$QWHXYZFgXqJ^eng_4!4S|(;OJ@+**#a4IC)- zrIHd;jScYHzi1 zbbw6>;y=Ql$3w^XBBu(^#m`Hx9~o2JRhW)G7Xw^xDNt=FY10crd&JyzCb zXKU?%%HokB!tiToYj=NUh{~;Yd{+qjaYJkCQVr47Z50)##T`Yq*X;bLpRFnYD#2g1G|8J*aV9*TkO`KihZ*iI#uhRSd(gj;ac%K5641 z>EwE|L96F^y_tgr#0s=x*vLVc{QQQIt#yN)Yvd)~B@8^e;Guo@IQj1Gv7rRo@PG-h zsAS6@L&aXZXKAq*hvv+gf=C)g(1aP0+z`a;4ndkacN=WU4uPv8h}!&YG346cSv*Yq z4EVCo!h__)L4rR#wX30?(G@Z|Q?<~e~^PmzIo-OLYAHEy< zf|ERGZa2VrHmr2^_QZX^Tnuu(4mUydT3UzG@xtjX=hJ5G0C$@bo`Y+M8Qvcle95DR z_BLKKMK4n?JNCA)nx z?{R9cr@|4Jx^KI;_rKITUjD-9y>`HsVU>HnJj?YLx$&E|5UO?E^OR$XKIcA@-COVy z3o*@Fon^gsa|Gt;h92Aak34++A*3_%J@vL0#{J-4J3SyT;v;{w5(Ie{16f=05Yr=! z*iOtkn6-E|9{6Glzh_Hld@1rLbaaec+{BYXbJc}$Q=gh8<9UH1+X5oTRLIz){(_P{ z!#&W;@rHe3FlaD7F}@%j&ozErSvKv@&0*^|^3JY)elgI2ZNGc7-c{tkKD>sSK81vo zuE*222v@HRv-zO6(4ECWdIh{GicZAP9db|^mACaF%$%xo_96ZvP)(`%U{Ba6_o0WL zGJ1+tLHqvRh!d zp-(@!sOe}jRr9LFh%G4jdo?=~N2uul&u=Oe&-$<6s&M^OzZnH2S17!4q+TQ-rrzlA zt7J6KKR%)=CJ}zN%350zeoDt&EakDaVfUth)ApJ^Eq0>dZ5r{O$8K@%ZBrkGH3GTt zY}Y9L_SPrttHW${(@$=&*MW8X5{==w$ zy&cu8v4y>2m+3YyD=YEz5%m#`dayl%a`z`DM;c$1R(@t(LGV4ND5yOdynKT5nzVHC zG23J;p>@>a)%j_pia^YQ!DKvJpUuWl$YvHLvE{ z@zT^_)ao8ie%p+Kk$;uqj3kXM&Sz;T=vixR)~%<0;ZZ|Ww6)iY;YawZGF7Bwt9FMV zhjr0dzu|UL?%vB^A8@#JnuQb9EZu)i(zpQOxqA0rMTghGdAo;U2QK?{*f zPkE>=Hk5kIkdHkL>GOoGkKsP+GHjjSC(IXdo7{y@;VS5G^%ta;8C9%+e464)fajf| z;?lDbdVXnZ@LS{ z{emoirdF7%r;e(AE(ej&KEDV?SLmxxgcDL1e>9h$rVbIfKN#GMvSH<$CQ|#r@--j^ z)o`*>CtZmp_ID39GWH(;QK z-9c<^(K6T~W|OYl3xQk?*It8yVFPZt2eoa!>mu_#=%>C-w!tE=fPe%#bW<~`QcfrS zV(2#z%O5T*+ypRMA}s>)+46^zX6@k>>)Gb$N;pH{cnWhv#`xTq^gB@<(PDbN);%1X z&k+RsJOsh9G8V)0(W@WL_f%Z+lZW=UY#`z1&Hs`<;Mg-hed;=kCi1y@!Fb_Du@5#J z;nR{ZhR>gOMB@HZ}nUe3OHwVnS;OAMi@gM$y1 zqR^q^^lL$~E>1iF=r_+tp-Kz{C|e`Ehn$B z)f)IVo=c4OqP{?c(#}AWAB|gWLkk0zd-d$B%iyN_?7zV2MfuT9Chw^?gJ-_uq^30d zriO--tkBheabWS@K2nq@8}Hq01<(MW>-0?)=M#eve3QW;E7i~9!c1`8eE{r|?^K_a z8~m90?_J`u{QOEWh{A%RIS|b_U}^JR@EQV*P|^S`n`QH{GU}XiDTZ}eFM#55KPZmY zz@(+GDpz;bYbuaflLC|3A3TWxC+eYP&Dyd|pUJ<`;%APbL_$Trt`KyBjnU;Vs_ao< zIv~PO+|t{LwR`dt;=mGq=e}x;R*J+$r zZU8WyK5(eQqthT)57;YDS9iqc8ooi5fT9($TUtI5QiwHi=1`rtvpp~BF#ZZoNM zn#F!=B}L8oGogPVn;8k~3kWVQ{V0b@udkK%r;1|omE$HlpFRRJn)kOG!OL`fM;h3*&DCN9mCOgDx>)U zV5BhoNYqJ&#%i7z3g>=`ArRc>$Zk$(ngdRj);U~w-=|Tf8OCt1-|d9cv#~NbDJk#y z3;zN)+n-oMY-fLD!g2heK6gw109ZkHhG+!giI4l&r_Yli!+UGt!hx9=R)pza2M^$S zi&Q6MevE(|m$T`=9Rv$5aS)7tL_@QHNpSl!p48Z}uIgs(%%KRTu92VJPJbx*jG-Kr z>h>?;hoDjqg(VQ84yg~&cL?7VOTG;lCxxi|%k_^YPIV~Pl5(p;BCLKq46&bJ)MhHH zWl~2irkj!GPlTTdSw2x9A+JvFhVk?75UKp6 zjeI4V9VL>H!g~9Nk`lGxO?MXIE0Dg?=$}RZMX(bXlEBaZ8GV6@%`RkQ<9|pr*p0cZ zM`Qu^1LyGJ6)#8--Hs4RuX%B75rtCEayoMDSIa|A1GiABgGhAO+8bldAiA`5%!3`P z2RdvyyF0kyJl@6^UU_KMy1(*fN z^r(VA-URa++Hj6f5nV;ma^d_w9OoltadrK&O2R)ZSop4JItvlFPSLB{L8B?j2l&^Y zZ2zMz@xX*lT4cOwiquEue9-@9%Lp4p3KWQeBDZy%$3POF*QJpJIH9rf>BdMijK5Mp z4$Odeseg z7*07wlIQHg2geNZyjw={a{F4&m`OCv{~KrlmI_(BJFY~P5b1?2(2HP3tOSI>jx}R{ zSrj2cZ~a5(eSkc&xN~9D=h0v;I|Jir0XK(8{SBj~#DPc|f_;JgYZCSU=os2iDEJ44 zHU^r*G(CdxJTjH~Ea%UcpCr+gGCo}#OK?gPIOKeRoAov}CEL9G{=e6JU_mU`v*ZX-vQ{QrYC#6X2|=1@uh^GcH8 zBay7Aw3OEDG86 zBS4xxhLhCkVDeNeB=g^R#k_FD;hKh5B#Ty0?5FXJS<5mJgm!=Ise4OC4HDyns3r{hDLDziZ>WtyTB+xv;jt`oSvLgT^GuH!z#v2vdCD?MV}B4B|2Vpf zQ8ypG@{4f`7+gL+9k&MpZm@E%?#nwr?4Z+MM~R1;EA+Z_RVy@&aT#|}Qu^F^d52I0Qy;6ZjFB1jR)c^dE!O(FbP#&hb0hkF+`OCVV_}>Cf|``QpIb#LW4X zt9jbc?n=+MdonUImqohICKGAKLzVVZk6i$Uoi9^!UkeFpOsD$#GJU+#f}C<6X!)$b zEqt{uXPRSF;!EZpFW(U7{>Pj2IS`$iAdPLtcnte%+JQeAO92uU#9;wU0_v$acwJyG zORe=9n@-M>Y!nyhM}wFwvmGp9miL_oCpb1#U^o;70*hTnMiZ%xPnT31X!hsAR+2ZAV&bo{2*zxSgN94;3E!>Bq^_lZ?rBFoVZPd7)3U>wFh8jo{U zz{tm^Gs6oslC+t@2~Kz3Z^VCqBw%mn+36-&1vC15(M2yDj2H{1HY7AX(j;-lzF8HH z+?}oMJsxB?y~OB0Y4lWey|pGD)z8VsgMU6&la&ykVDhcwW@j7tTD=W}2XLze=e{z6w{NLwH&jOIbX z=2*?KSoGPZLYT1 z>^2!rN3$Y=YH5IV5C{YW?>pJ58%!o}TEG$yqxaYQWEB1vd0lWCi*lGgrt4*o9(EDn z5B^Wr{F_P#J3p=b#PZ$1a7wk;%heE*;UFSZ*hgh0&<_eZ1}p^4i* zknua6Es%m?-~!VqQv6Pb@+}`xd#Zi4v6m`9GW~U z93*q+=2OG*PXlp$j&6piFC;4OET>g;?rz#$qTPCdhVxvP6%C?DWPTO56KV>!q!ybm z`|SVue-_Hr(v?xRoK}pJN1}ahNLs+VhY1u0mvP1+aRY@|8m-20(m>pWjVis(PA02m zh7S&?K(EUO7VBe7%X!|sD?NI@m#mk@yA39cWM+e*kx|876!JtrE4DbFET*!cj%36Fjpm&}y=QB|o4~p*NJpvbL{k zJ*I-nXEvQoAf}~0wyGQ$7)XNK1`BlRA?Cn>sxfd)r_C36zXKRdZGC~|g+7&Pnj2*B z(wL))C-Cc=h!-6X$g*O#X;8dDY#2b5Z!y(Tqw>-0&9-9UT4A!ZPqcelMLQK}o@;cf zh{EMJclNmFuw8OiU^^vEtM?mXf#~tF^NIr%vU_mXIev0PCDV^Yxt`+%z+e0u9K979 znVe)>pgdO1cWP;ADI^Em+X6})AXETce&4=u7j4H0zR36eBKf0?CWb||pF>SU!*cXJ zoOL+et9sKDtby7C8(-qLpOKSy;(lF!d{K?>PFFzS5K7wW;~$c!7z3(*mPLC+9ZO_N z(K$P*Ohl2u`;XRr0g~D74~Y!yDuF75!nUI_i-2>fA)OMun#Jen!ofp;mCHgQkjA~+uK zE3OGs*G(|$!)9aADGrqrtc(JH*C*j+fk-M&#H7*I-$Ha|IX)hv@6wLBj3tZ{QJ&}U z+Xarq%hdik+X4HWouORB?*ZQ8Xd?&>OkXC!;MNkk!p~AHN3gGeBkJ)t`+p=W1e~^0 zJ)A@zX~Vw20S}Ci@GNkdu0&B;(-oj`5^+cLOVuMxdd}$xEWSi!fZNu-j5*vOJ|s-9 zB1T)MZfr(H$)4J|FpTZP-4$4sITq3l!t;Z2;=xcSqBWd>rgn?wG)cHQTbuGjYjhER zh=Hy}HQMg|jZsup>iwvaa$ECh2!YrDsv6=4gf*|{T>?wuo%5pSp+3cMKvYj4+!&bI zGjJ!d#|8VXIwHV$*4UO{;2D7?fZOU(emhq)7#7^U^Zm{@C{IYV_s=})$PU<4MiGud z%M?mLb@n}N$%krtt=2evM$niCEYpIj?1%Xjhna(F+HHGpKib>N|9}1jP7$#q(cySb z)x*`^DJ3dMs4lgV8BRLqPtL^A8?+9$^xqgoj9D+MaKtVxFD_!5Fq0(JR3I=9zY~*j zWw0g^S{yEDQ32cZMiS3;m`-oGw{|TID;GB}@P|M4N1~fCUT0-dF`k4&B`7WsdysFOKn91_vQ&-;M~7{hEr_@&TpV z=%?;vJEG18p*us*?jBu(Arv0SgGd_`VYp8pcuaK&o}K=6gQEx?Ha%#;-i0&+8L{n? z2i|Q-ExqVLmQHA{>%%V9Zh)i{)l7MqY|!Yr?+K2tD}2NCHq^KO=oy=!VQrOzUrb-O zWQc_bUc$lX%zLNCkB}1RY6gci?c77p0eYGy6k_8GRRm-d4y{W=-l1PT7E-9 zJ!Ms$tMz;|EJp0`E-3=yek(CkB;!hEzNqjyWI};`S#_t<{@lPA;c-#?@6h285+T)F z;N>A1jYRYZ^~x^W^f`^n$+MCrdbM-Lryb^L%u}Pi(ee41RNCBIA~fN|QK1O%;xO5r zE!BURzy7?Gh*GGHzs~tJ;Odej!;N66FB8_DhX#w@jZk`*CD12fY;1604iwuf79O%~ zd#~M~z0Qpv4fXopIyWtV_Xo zuHCJU1nAuQ&^q-3OM1Q?MkdCRZS5|qohB%6aW{;L)Br4KH(VE+Y8b$S|1kG~ zb5g{&pDnQ_Y9)aSC6qz2_vCOd9e>}9ovXMvEK%2CE_fsLc#)R$dG0B)hHmY^L)}fd zU6_ln1rosIAN&G2+*4xAPE|pBkubskeW_VE;8GqKH_gJLVgsVN&Q&T@ zlqA`ywRq9^$lhBH1ci7TYv})xnCkY2+5s_>0DDZHD9&;HZwI01kyA)n?JRi2}?3 z0tKG9F6GH$g}hW#URM$AEq5|#IzV^%r9fapXVGw?VP%W~?|hap{?%*2VkcWe_~${y z@s$RtZ-3ASiqUW+!;$fw1XmkI#*PI0<_4c1>q6kJcli|fdRTnq)=SMe@I5-4;N;YF zaAwII5c|(dJ(Jr{-24uYzUYL8mqnT6IyKx{nmskph74VUE;Ayygz2%J+PxczaiYe1f7@m#e}g@-QP4@Yk#@vGb%%%*WC{? zYj$#Hy}>?unFfRugjPnw!IVgLeS7d>y73n4i!jDRjTW?D%$vV8msWC3b+os&=lwa! zN1p>_9s){$(}_bgr?Pytyv}NV#J?GzFJnUj`uP|AFUM|5w168S-$oGgwgR^&1Jt@6v%8atcfS0AS?FJxIWGe8lLfB6?|T2rW;J2;7>|-Xh{d0xKKl$ zVW}xATWQ%rysf18mfFlm-$Zw4aJ!zqd46UR`FKoGFHvgaL_^c0R#q+MaBukg4 z<`C_tWlBlT_uQQnV#s`w94f@D1S`;W>;O~-jL2Ni+%t&1g|9d&w~>(yknBki(o4A?G>CF>G%wlM)#-i3n~AU-4RFp0q=)5}9yv z#n2r2`dEX`uCdr|Vu^TjwS1&ZL%G*V{fI;&eR8t+lq@*?l}Vt0(QroA(U!XdKZfbi zNx2VdAXCg0!JVh>8*Mk%O0A!g3I`|hkrCe#+=>>ZhA2ixe#OkH=xGK+J|y-r+GJ@> zsBLibrc*KjVw8$dsb&xBmYwfGg~;GR%7eq|1h(w2XH){kqlE0Y5%{3Sc=hUeVdg+hy)Wm?$=^M^&kWOA}T>{>AbmHX=r&-#m4r*^4d&iC^00^{xW+OyNWSe!cZR9JuKzF3Fv^Pg8!7xO8EIDP)2T zV7%}GQ^&S*B1tDl+qOqG#ew&S`#?(WcsXYQmge63F_=V$sb%!pHZ4!i*J{PozeJX& z>D2k*1kx>bkD94xIuCeX!<}K@>ex?-@f!Ga^HQ6Zs>NcL2Rd`N=>@QG$SIt%Q^pJn7mVB+&sUFW@ zyz}!QWduk}W?6XYZCAKftagc8uKo_Rl1Ta|24}lUqa1A@5n&JLRToR{TXZ)4%Z-nC zw`zb`MALGKOLe5$>%>eN^V`4&F270@I1YX4HyLFoqi`)I!UlMu>YqW2H3I;BQOFKd zL~UgpaRYFBF@x@IViFnPrmK|-0v1IaT3lJI^>(FOj_KCVy9d`Krz1sK-wI*P9#(eT zUkdBJWA?53KZ50p;^y@k&JPV$-n24Nx*LZTY6nzm8!e@k<>ljCee#P0bB~XXbbJIG zan@7ZL^wzQz17nl?t=_REBoeu(gw_V9K$b*4yw`j^`@qjCB78<6wXS7yh_=^*TMjWFk72ukYP-H{onW^vI&= z5^LuHrZsU}eu*ibVenOTD+vCm7OETT)3`2|)_JO1be13~Xy(_yxDAbbwUDgY3hxrH z&QnKDqcUM&<;9C|;Y2!}oG++8LXSyzBm1%Qv~90b1GfRHp`?z=s8(0S@lO^kpQmnt z^h>)?XQPyw`+npelfA`nEB^ZUh>eOeo~u!Z$0u4TV9mu{46n-%M(bsZg>~Kvr!lpP z_}}46!#$oZi3aJ;^JTVFK>vf}kwWh<<&yxL-zQ3H*zhT%u}Mf!AQm9)7=t zFqR*0fe7L2_j8jwu{?hqA01xeov!QXfR?_dcar&6(@P6Wv z9vo2DP@4J;#_c{@hYBINJh8;F449MIHe5zn9_PS2@>*+qtExd0Pob;#og(tw<_gnX zcaW!9UH3U(sPb8tP>N7ry&&iD&NOL+Z_POgKg5~sQY?p^gJc}Ei;oF)1}-i$U8Q!> z%(UzMEE;K%B^XMNt$f5%+;-8aN7O7Ll>~UlE-0KbY z99U^W(Nb^4Msl8-<@Fi022!GRqd5p|czy0g(U_C4!zaWq>RK|Pbo%}^v<6ZjgsHYH zS|=a@4RskKvWwb<72Jt62P+Ia6i(MVT-Y$}rC$tg-7g%EL9z~T8E7*FkY=>iKQeeq zV=fUojx*M}&HQqI54^Vq`(t=ON0WnOG6#Tsz=AU~y?Kq~6h%sn zwH@Rb)Mt;Rm14o%TVIdDrGT1jbKG3G4iX*Bj(Ul|p*wYGF<(_aw#m3hnbzJ@oZ$Fh?ZIm*vRZ=c<^{l-6IuS*6^!g%^S|{|-sy=ZJ zM^qb8;0zNXm(p^_Ha~4#C&V?*yXl-%7}jZ?No5%Gy3A;!m&)C?cEi2QSIvU2aH`U8 zebhV(kDrddvl!rTS}qicY-VUc3q`Mwddm!j6hfXivI{Wo#`n>lgZ)For=*Ox8Ueo1 zYHTTKmo{fCZqdZMJTRAgwJM!~z}bcvHpuyv0|mSiar?Lyo9c>uOwUANbvTFxrEk6r zMnURtSyBc^nfj0V;mX8(p8JxJ2oVU8b%c1%VUia8dlD}TX#xs`M?dqkUd=G!mKcY_ zuD;D=!!N279cw=^U=$lVCt7k_!c2XwaHR?^P7w}}T^xmYCI4gG+kUzdkaft@F%(1c0lX)z4c*fe@4e$qn`z={C6rzi5rIKkIJbDENLU0lG zW2vpf{l6k%;Fv^&cD6pVbOpTkU$7_Y_Ix#i3>M7Vo(x$7JC%)1=j}r{(y=uIG!!c7 zZF{(|o18Mea^QcXU^K<>PawF*xwo!qC8FB^BrEard}ficzH)$I*1A=AvYyoqwx|1@ zE+y~7mntlo8nu=Vi9KvhvwVcDO@@|@gr5J}g1Y?u)7i$cEXecT<|%YWMLV(S-=3Db zR!y)6A(BAck_Ga-kJL^GwjXm z+3dBxYdz2B*~V^8>Nm=`64t6URKpuPY|;1$I~X_Mo!OgyRjhyTR~`H%-3}QaDk|ju zIU>71zNlmyZJIi9e=cCDP*uA)&<5+3Pga07<7iu(-kptL@TEhTl2E^g8|o$N^wpzm z=j>_cxXzz5wZZ&2dE<*9GP?-lzN>?+DFg-9vPHZb4E6(t65KgIwOa3<;D{cuAjVSbuxcnAL)T;0EaS=UyL4u`dF2UD4VQMqiH8I-v!gb``Xtw8 z==1nKmp0w{+l#9ejCw;XO|lcw$2F-a7PwrG_qX~9(Fm}T@5K80ScYANJa7{tczf-* z<3fTI4cGdpcajXe2Y4j^hOuwM{l35?^o*vWeB+f(3r|YfTxS%mVy*!jN3;Sz*e%b+ z7bd1*oxY%I+-Hc04Hl>=@cV>6cQ$?VVHkRMJx#)INw)#RnpsmYQtl|8! zKS#N2s)jdnf66%3{$boI}yyzP61YQ1#i zKJ>2c+wUf|BiyokBDc)|D;vg+Uyi26(Z7GnU8pSPW*Vv9Ru+UlavX3QcOhrK0g!?N(Be0JLn7`R+*G7xdd+tPIFz6 z#@A%S|4gfMO+GFWUh4+5zdQS@sAi#8v+qG^xKP#QzuA{vijCixM-nVBC@G_S5Q@;g zP?)3*S94g! z#+IbF_sKu#17q;Gq=wO=ej3ose*%G^Zm6jd)XT2F>H`e*4+z^G43t{m(9F_byJVh7adfFSM_DzTQWFeI6W@JKikDTGsrA8_bW z#5Zt=qX05kwe0WGRWZu!Gu~fE&VR_ob@PZV7m(Z{7;B^XAX8G{xG~`rw95+9#WZ-QGuDUi>!92GNIf;M@rd z>3sBt#YyoADB5QQG%tzm`7^egCoG+12$?S|S#zCxXN1jEdB!QH_3zhiS6dC6>=`Z? zhT3!S463uDL|=NCx;-vr7Ju$0ZBrm<^f+{0ZfsJ{94{IRk36=wxzU=uIZNNA5nu6y268JZ;_2OvR+5T~ zr0zX>*G0?-G8SfBAm+vJlTmGjvHJDL)PCOoblQ+F7t%z@wsQEs3}(s)-^vGVrxn-g zft`tRZu6ucaUYE5-ke`q;yI^(MPp<>ps8046q31kjxPV4o+lJtzbbrpS6Ei%6^7L> z1r1#wzAr8*=Q<)e2qokh<3T6n?_lCer9(IDw81Un7WrBC>(WoQkoVUfEsstqClfO> z_gGjRYBvv_4l|FQRWnE4z@>{Vi}4w|O>1(hWNx1;$KoU0=ZBo5V6in+BM?LDb(@c! zPHJR>wV)}~BEvr#FI9EuWih1N5MCE)?J`r%S=JZ7IB%K7df|G9e{0Hr|0@!H5su6` zKUkt0eW3c7tL@3?L2GUIB)wIF)`z`mBjx z3ToG-xttb{D=$Lxw6D^W$0zYkA2K>lW5mhCb)&8_-9Gx-X3v|FF(6l{3QAU;| z$!o)Q2Vy7Z*QC=-WplB3+(xYt7<0?#&o?)f5CqEVt@;P=xglJo5xi1rSLg3Nj(L_F zm_J@JX1)rjHye!)-aqxHA9S2T7VtZk{Qhd_x0Ed^#oc|)qI^#E% zowgUl?l2mlYjC&qq48{(#7=3TH{)(Vei?76z|U|QR3-Q13d`E+u)~7Ln@bLum5x45 zjDwFvAX;^kWThZ>@b`PySvUJ8ndAP}rokChAe>a!UiDqL>tLNQ}go5AI(s?~Vah1;di@ zJ(<}8%o-_EYg0zbB>2?<)eoozHiXpA`?`wJnkNj?swSbf=&|tL>Rk+xx%nUorS5{# zQCVGG-M0r&XekvOBGx}K@n1stBx6;V+Jcna|J3}CO=OhE{`~yFEJL`Uwsdnb`burFP%Ohk1Q8nc?7AxWG}c({$OKdjUg`^XgP5KbPFtFB-_o`86_9t^0}|}45tj`f61Hm zq;6Lm9l;l=JGzV*?DkVAKS{077)_`Z`k&t!9N}D}d0O4MajN`d)1@QTHk{RjTV_P= zQybq;iVGN8>|Vy4EGaRptHE;V2@x}?e@~pLm53TkBz6Jh{n4H61{g9}QjF`*63N(* zh@cB;wnWoqEixO5rVds5I&pRDy&utOq$Z1x#B>iZpNLiF72Azr7Um96x+UEiU5WrP zQ&kKJhZ$Ruj1$74j(24id027Xgz==D%|cxgy)yw9BHQyVm+p^B;d2RmLL^H?hP28j zT_c%>`w(}+)yEnjQX|*y)C}Ep9No@2SC75r{qPN z^=&)u$0+Y)xx|;W%UhFVP8^BX} zP^=9+=|9A)sgVZOFJMG0 zh^%tFqRAJcI90SE(Uj>Rlu`HI+kE$7&*u&94=z}6q-A}{-f5JT&9zkiNE4Atu3$Od zPqX(YBkc0fz1%uwY_;vtei~nq(Z6n+Po&X)BkTD($0!dPyTLWDN}#)E=L^L1_1jVe z+XAZQKEemtrh+G>)}WkDF<6a9q4^fso6sYBF`o2{zP7|J65PE-Hns$c-iyt%<sl%p2r>1fX3K7r4Qd&a^_K31>AoODZU zzVruZMKQRf@mBeEaj6+ppf$7}`v`T7E*sRRuUO}FdS-Nn(xG4TW1HhVdy9+-H^j9# z_W25F2zv^o@)NjOMA>@MKN;w`Tbb)~D`cLjq;#a5m(=GrRTSE&-;I5Yqnk&j(lO*| zwF2|Ac4ED|VwCs%(jL?Velr$gj=l`{QP=G*hG%|IR^MuLWC)(9LeqE6(D$roMidl4 zh*hGgde%Jn8kA9mC+%TI%Dcfq^qE(3CFLn{NS~u`#`jVk@5UYBk|A2Dz6xT)6R6`H zKc6I2h?XnBU-|G?|ASnZt~qOdQ>W?m5ncomT^Z}wAnsRqp*}nh)#LA{MgvP<3nezt z=efs!sg>1YyB^MS3b5^B@CgvP3l-y=A6zr8T_6^SZ=B>d%1c3SB3_qIA0FNQab%Aw zxqOCd=f)-%RZ%#k%*5)SUS+$Nzuibg!F55f!>V!2FScGYIlZ&Hu8hSD4!rH2s%O>7 z!@t8xtO~KHTALr#v{-3v52zmy|93((xI=J0f`9CU=78*H^uq=sOb8y7Z;H$ z>5Jjj(8Il|*%N>7OAw(@!9>QPaVJNYR%IRyqQ@3EZ-FgB07+!gaiC z+ZfEempP%G3MDRTGp`bTaR;|v1v2O}{2+h?L_JLeNI$1qGiN9f^11<xU%%u4rs zP*nyYB-(GlQW_?M6e^#ec>}7d>|;^DsU#_-hh<%|KUnGG<^1csB$( zDt25-OmQDyOUG{3rg-n8Q5EROp0FuNlkZ07@ZWX&yFa!8Y&EvVH^wZA0ji@_iw~QQ z1ul!$+*wiqU0=Chc_m$1N{W3lXw#{i#X;s*gJt?0S78_{YTRQ>z;Ir18ed6zNF>uM zR)3^?zhaJ7T4MN6er^NePS)ZPM$@Uo?O3nDc3oXtrK8L{Ot3j5jsP5e;g%2b%2 z8(FaAPCYSSsesuXj}UHt`_^2O#r3aoE3w*}L)%MOcK0wFlP$Vo8MCXPY2aPHJ7clf zdZ`B$W-0={iJFK2Qbjn5N z{-h}8jky*$5TcnAKb>))&~f2*^3NB+4KJ-@I7)ad7NJ|2AisJ3Mk3%vXh}<8NDb^=Tl~s4WShqRbZ(Z?@&yX* z4v!<*LJLSqTYe@+ZGHkJ5VrX?rfdSjyxL}=0Wl8`XHTwxvGN&f9Kr4_=p1eO+)qSQ z#vpI28q}0Sq%LS+`c(kT&ld&ZbWW@9HX3H_i|aBb_Cz|fx-g?_Pgzl=9i9T}u)y(p#}})a*@# z#I*OB-usNVfS}gF13dA1q7#mC95Isk{h!s89zFI_ez6H(c ztf=GcPPUQ1k09c=%I^6BGY&5pKd2Z#c3sZIIal9ORUp*9uCBj)=_ zuST}g_KeG0H%gh&jZXgJs6ZZK95(d5wiC`5SD(I=H|`J%A>vVL=gA7HmlaiG#(o%o zrAuhnDCht3GWIhDneFoxSP_$DS6{aMe&TfX5j*jZP-ZqBE2fPug|nTms5nhQwzaDn z=H=BGgfSh+*aIwk1nbgEDV%-^%};RuIIRASEjdxpA#0F3ZDCI|t2j({z}<{BV22`& zV`QK26=Wr5Jsw)t6(I&d+|vIHE*7LcgJlvIX#+13^)o|`GDe(=HgJI*;g&YFLkBUP zszRqQZcQ5gGDaL8bU;(as~8TBsOWCJT2KJgz?iyFYC+?V83|>E3#6E=59TF#r)yi)I1}rB4on>8cd&S@NM8jT)4T#!B@G}R!>>q;x@v0_Gy{V2pWHFx8SkP& z9fAN}f?8FHGO&VolejyYEzOY7fWm{#ASd9T@>#j*lQts8DZ0`Ze=3O$<(CSv{`R!) zHAwgpxI7LhStI#1XoxBCZ_VjjIdC8v`{c~<=T5^0sUeBj`>M>5;~fn_5KchymA4@e zu>knf?XLe7?qqVo6QMr7*uzKUG%@bMUnG_s)=y_H$;eoIjvp^k&mACrdJ6X<@@ z(#42V2Z58sr!;u{1V5twM11>tDq7qhB)3_rPoy4f9e&N=+K4*rAc8g~VVE3Y>yOzW zDTojzkTgrDr+o5NXA%_I4u#{ zdwb(z?5s)1mdV!;a@^&p(!i5|xZ$AzaaZDLO=KklpNy@|g+vXu zlTFO_h~=H#%w<~Co!T0wvP}kkDIelb8NEG6u^SSjEf~5<8Fh<6bJ~~O^>SIXoHx6H~mt`oBF0b)O z@)vFL{Wm=)VRur3`ASZ3M&$62Uundsgnn45D$#}9S7d9XwmoHFIK7uMpOrpyD}=ZG zqg&Nny<+Sr&mzqCYn+76Utz4wf@nhv!Kd^HrM602Si~iC$iZ%J_s=LkI}G|;wyoyo zwwXx>;`zDk1GI0odnt0l^iku+Vj>R3dQwXDaCOstzmh)6vi$Bt%gVV-_Y_@b|5Jh))u8??=vS+seuIf;Gy+; ztTN2H1<1~O^0Oau2qy{Ud3Yp8rEdS^pWgQK)~nA5kUHdePB{}{(GUPe@8`qdE81ket++D8=3mG-`mkcOydwSAKy54~7 zwM=WmoiD_`-OJOoNZjAt=ut3R-ba1)-KP4AQ_@OTYEH&;5TQrs~4qdcg5{*vGfZNGC-}>`$nh!w7fYz;CpOBg}VpOLxc-f-I?Grp*I8yT*AZ)};omf*bik z)=u$sJ?zTdcw$a3cljj#`o{Sx&>X*llE;Y-_`%rsw{jpO9Mt;v)kx?$teYI$?q|m> zK%$L8rq>P;v$7`|ihZuy9qtcRrVW=-cHNYQMGwH^#hA(QQGw=%4Y8Ecq?flSk8=e7 z{7s%+a5(3m3va*>zXhmG-sv#0pVCKJATV9dFUcf4{C9t?*MB44f?uC9ms;W20}q}u z2oc09Ze=Hc3bJ~7xIG8-IB81S1VBgw;I^$d8BO7q{ZguBEN*?g)W~H%h&y?X?V#jq zFfDY_LZhkY6ygg+8dWPsdA*R*S=2pHItDLMelW%rXc7M{D=p=@o3F9dT{!I$0b-3N zmn4GmPk=FBg4e~4w!x`xqjSDurm%LDyq0Y+DzO+88R7R6b^y?>aRIKWa24r6S<(rZ zD_npTGl75Y*hcft*jxGk`Y(n+#Omxe5Dq?N5N|(q_|R8I+BiBJJNHncc<^0`3bFD5 zZ;enbF7<1B{MTEC2>lAh0gpC`zxkMA{;Lbb8V#Wz+{;MC_g=Wbhk#4%CGciYLsOrY zR$u=6<~KU!bcPoVJ>acskBJg{(t3%!MEC}@5+UjC3)T}7SYAE8fceMysCIS`pjOc@ zH+v)%WO@(se7kvm0k_Ƚ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

    dO;P`|Me8GLl-1jga9BAwo$lf5@0q`4`w{ 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 literal 0 HcmV?d00001 diff --git a/static/images/blog/grpc-load-balancing-with-linkerd/Screenshot2018-11-0212-15ed0448-5424-4e47-9828-20032de868b5.08.38.png b/static/images/blog/grpc-load-balancing-with-linkerd/Screenshot2018-11-0212-15ed0448-5424-4e47-9828-20032de868b5.08.38.png new file mode 100644 index 0000000000000000000000000000000000000000..15d9993f65ef014c2b378cbc3014e2f6b8ad2d40 GIT binary patch literal 88193 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ͬB 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 N0#8>zmvv4FO#oSvV#xpi literal 0 HcmV?d00001 diff --git a/static/images/blog/grpc-load-balancing-with-linkerd/Stereo-09aff9d7-1c98-4a0a-9184-9998ed83a531.png b/static/images/blog/grpc-load-balancing-with-linkerd/Stereo-09aff9d7-1c98-4a0a-9184-9998ed83a531.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0fb447d077d2afecb5a71ca0e9505e84e930f5 GIT binary patch literal 22662 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 literal 0 HcmV?d00001 From 0cbcf91878b0e55da0299a6ba116ccd8d6f6cbec Mon Sep 17 00:00:00 2001 From: AdamDang Date: Thu, 8 Nov 2018 10:52:06 +0800 Subject: [PATCH 027/222] Typo fix: Kubeernetes->Kubernetes (#10921) Kubeernetes->Kubernetes Typo fix: Kubernets->Kubernetes Typo fix: Kubernets->Kubernetes --- content/zh/docs/tasks/manage-gpus/scheduling-gpus.md | 2 +- .../mysql-wordpress-persistent-volume.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/zh/docs/tasks/manage-gpus/scheduling-gpus.md b/content/zh/docs/tasks/manage-gpus/scheduling-gpus.md index 45d4b8d443..8bdb5bce40 100644 --- a/content/zh/docs/tasks/manage-gpus/scheduling-gpus.md +++ b/content/zh/docs/tasks/manage-gpus/scheduling-gpus.md @@ -170,7 +170,7 @@ spec: - 灏嗗紩鍏ユ洿濂界殑 API 浠ュ彲鎵╁睍鐨勬柟寮忔彁渚涘拰浣跨敤鍔犻熷櫒 -- Kubernets 灏嗕細鑷姩纭繚搴旂敤鍦ㄤ娇鐢 GPU 鏃跺緱鍒版渶浣虫ц兘 +- Kubernetes 灏嗕細鑷姩纭繚搴旂敤鍦ㄤ娇鐢 GPU 鏃跺緱鍒版渶浣虫ц兘 - 绫讳技璁块棶 CUDA 搴撹繖绉嶅叧閿殑鍙敤鎬ч棶棰樺皢寰楀埌瑙e喅 diff --git a/content/zh/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume.md b/content/zh/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume.md index 030d2c24e5..3ce1c6f775 100644 --- a/content/zh/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume.md +++ b/content/zh/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume.md @@ -6,9 +6,9 @@ approvers: --- -鏈ず渚嬫弿杩颁簡濡備綍鍦 Kubeernetes 涓婃寔涔呭寲瀹夎 [WordPress](https://wordpress.org/) 鍜 -[MySQL](https://www.mysql.com/) 銆傚湪杩欎釜瀹夎閲屾垜浠皢浣跨敤瀹樻柟鐨 [mysql](https://registry.hub.docker.com/_/mysql/) 鍜 -[wordpress](https://registry.hub.docker.com/_/wordpress/) 闀滃儚锛圵ordPress 闀滃儚鍖呭惈涓涓 Apache 鏈嶅姟锛夈 +鏈ず渚嬫弿杩颁簡濡備綍鍦 Kubernetes 涓婃寔涔呭寲瀹夎 [WordPress](https://wordpress.org/) 鍜 +[MySQL](https://www.mysql.com/) 銆傚湪杩欎釜瀹夎閲屾垜浠皢浣跨敤瀹樻柟鐨 [MySQL](https://registry.hub.docker.com/_/mysql/) 鍜 +[WordPress](https://registry.hub.docker.com/_/wordpress/) 闀滃儚锛圵ordPress 闀滃儚鍖呭惈涓涓 Apache 鏈嶅姟锛夈 灞曠ず鐨 Kubernetes 姒傚康锛 From 273ae81ff35a1cd8dbc519d9c8c35359d9d64181 Mon Sep 17 00:00:00 2001 From: Leah Hanson Date: Wed, 7 Nov 2018 18:53:40 -0800 Subject: [PATCH 028/222] Correct formatting of note on creating a secret. (#10919) Note should not be code-formatted and command should be inside note block. Signed-off-by: Leah Hanson --- .../distribute-credentials-secure.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/en/docs/tasks/inject-data-application/distribute-credentials-secure.md b/content/en/docs/tasks/inject-data-application/distribute-credentials-secure.md index 3a086bd622..7b17ba4368 100644 --- a/content/en/docs/tasks/inject-data-application/distribute-credentials-secure.md +++ b/content/en/docs/tasks/inject-data-application/distribute-credentials-secure.md @@ -42,13 +42,13 @@ username and password: ```shell kubectl create -f https://k8s.io/docs/tasks/inject-data-application/secret.yaml ``` + {{< note >}} - If you want to skip the Base64 encoding step, you can create a Secret by using the `kubectl create secret` command: + If you want to skip the Base64 encoding step, you can create a Secret by using the `kubectl create secret` command: + ```shell + kubectl create secret generic test-secret --from-literal=username='my-app' --from-literal=password='39528$vdg7Jb' + ``` {{< /note >}} - - ```shell - kubectl create secret generic test-secret --from-literal=username='my-app' --from-literal=password='39528$vdg7Jb' - ``` 1. View information about the Secret: From 0347d2388f59325fd9e8c2de2c2ac3ed1407362d Mon Sep 17 00:00:00 2001 From: Silvia Teresa Sandy Martinez Date: Thu, 8 Nov 2018 11:57:43 +0100 Subject: [PATCH 029/222] =?UTF-8?q?Added=20feature-gates=20deprecation=20g?= =?UTF-8?q?uidelines=20and=20policy=20as=20per=20discussi=E2=80=A6=20(#102?= =?UTF-8?q?94)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added feature-gates deprecation guidelines and policy as per discussion: SIG-architecture meeting * Update deprecation-policy.md Fixes and initial feedback incorporated. * Removed unneeded sentence Removed complicated sentence that is better phrased one sentence later. * Incorporated feedback - Sept 22nd. Re-structured following key ideas from the feedback. * Fixed nits 7th October Fixed nits 7th October * Incorporated feedback Oct 25th Incorporated 'invocation triggers warning' and what to do when disabling a no-op. * fixed "tide" Announced for completed * Incorporated feedback from sig docs --- .../reference/using-api/deprecation-policy.md | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/content/en/docs/reference/using-api/deprecation-policy.md b/content/en/docs/reference/using-api/deprecation-policy.md index 31cc4a6db2..a6a8f190cd 100644 --- a/content/en/docs/reference/using-api/deprecation-policy.md +++ b/content/en/docs/reference/using-api/deprecation-policy.md @@ -365,6 +365,56 @@ This applies only to significant, user-visible behaviors which impact the correctness of applications running on Kubernetes or that impact the administration of Kubernetes clusters, and which are being removed entirely. +An exception to the above rule is _feature gates_. Feature gates are key=value +pairs that allow for users to enable/disable experimental features. + +Feature gates are intended to cover the development life cycle of a feature - they +are not intended to be long-term APIs. As such, they are expected to be deprecated +and removed after a feature becomes GA or is dropped. + +As a feature moves through the stages, the associated feature gate evolves. +The feature life cycle matched to its corresponding feature gate is: + + * Alpha: the feature gate is disabled by default and can be enabled by the user. + * Beta: the feature gate is enabled by default and can be disabled by the user. + * GA: the feature gate is deprecated (see ["Deprecation"](#deprecation)) and becomes + non-operational. + * GA, deprecation window complete: the feature gate is removed and calls to it are + no longer accepted. + +### Deprecation + +Features can be removed at any point in the life cycle prior to GA. When features are +removed prior to GA, their associated feature gates are also deprecated. + +When an invocation tries to disable a non-operational feature gate, the call fails in order +to avoid unsupported scenarios that might otherwise run silently. + +In some cases, removing pre-GA features requires considerable time. Feature gates can remain +operational until their associated feature is fully removed, at which point the feature gate +itself can be deprecated. + +When removing a feature gate for a GA feature also requires considerable time, calls to +feature gates may remain operational if the feature gate has no effect on the feature, +and if the feature gate causes no errors. + +Features intended to be disabled by users should include a mechanism for disabling the +feature in the associated feature gate. + +Versioning for feature gates is different from the previously discussed components, +therefore the rules for deprecation are as follows: + +**Rule #8: Feature gates must be deprecated when the corresponding feature they control +transitions a lifecycle stage as follows. Feature gates must function for no less than:** + + * **Beta feature to GA: 6 months or 2 releases (whichever is longer)** + * **Beta feature to EOL: 3 months or 1 release (whichever is longer)** + * **Alpha feature to EOL: 0 releases** + +**Rule #9: Deprecated feature gates must respond with a warning when used. When a feature gate +is deprecated it must be documented in both in the release notes and the corresponding CLI help. +Both warnings and documentation must indicate whether a feature gate is non-operational.** + ## Exceptions No policy can cover every possible situation. This policy is a living From 6c0d7300d54117484c7b12da5528e8618511dd21 Mon Sep 17 00:00:00 2001 From: David Xia Date: Thu, 8 Nov 2018 07:44:05 -0500 Subject: [PATCH 030/222] Remove redundant "Note:" prefixes (#10920) Hugo shortcodes already create prefixes as [explained here][1]. [1]: https://github.com/kubernetes/website/blob/master/content/en/docs/contribute/style/style-guide.md#shortcodes --- .../workloads/controllers/deployment.md | 28 +++++++++---------- content/ko/docs/setup/pick-right-solution.md | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/content/en/docs/concepts/workloads/controllers/deployment.md b/content/en/docs/concepts/workloads/controllers/deployment.md index be407b6ce1..c738991a8c 100644 --- a/content/en/docs/concepts/workloads/controllers/deployment.md +++ b/content/en/docs/concepts/workloads/controllers/deployment.md @@ -20,7 +20,7 @@ A _Deployment_ controller provides declarative updates for [Pods](/docs/concepts You describe a _desired state_ in a Deployment object, and the Deployment controller changes the actual state to the desired state at a controlled rate. You can define Deployments to create new ReplicaSets, or to remove existing Deployments and adopt all their resources with new Deployments. {{< note >}} -**Note:** You should not manage ReplicaSets owned by a Deployment. All the use cases should be covered by manipulating the Deployment object. Consider opening an issue in the main Kubernetes repository if your use case is not covered below. +You should not manage ReplicaSets owned by a Deployment. All the use cases should be covered by manipulating the Deployment object. Consider opening an issue in the main Kubernetes repository if your use case is not covered below. {{< /note >}} {{% /capture %}} @@ -57,7 +57,7 @@ In this example: as long as the Pod template itself satisfies the rule. {{< note >}} - **Note:** `matchLabels` is a map of {key,value} pairs. A single {key,value} in the `matchLabels` map + `matchLabels` is a map of {key,value} pairs. A single {key,value} in the `matchLabels` map is equivalent to an element of `matchExpressions`, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. {{< /note >}} @@ -78,7 +78,7 @@ kubectl create -f https://k8s.io/examples/controllers/nginx-deployment.yaml ``` {{< note >}} -**Note:** You may specify the `--record` flag to write the command executed in the resource annotation `kubernetes.io/change-cause`. It is useful for future instrospection, for example to see the commands executed in each Deployment revision. +You may specify the `--record` flag to write the command executed in the resource annotation `kubernetes.io/change-cause`. It is useful for future instrospection, for example to see the commands executed in each Deployment revision. {{< /note >}} Next, run `kubectl get deployments`. The output is similar to the following: @@ -145,14 +145,14 @@ nginx-deployment-2035384211-qqcnn 1/1 Running 0 18s app The created ReplicaSet ensures that there are three `nginx` Pods running at all times. {{< note >}} -**Note:** You must specify an appropriate selector and Pod template labels in a Deployment (in this case, +You must specify an appropriate selector and Pod template labels in a Deployment (in this case, `app: nginx`). Do not overlap labels or selectors with other controllers (including other Deployments and StatefulSets). Kubernetes doesn't stop you from overlapping, and if multiple controllers have overlapping selectors those controllers might conflict and behave unexpectedly. {{< /note >}} ### Pod-template-hash label {{< note >}} -**Note:** Do not change this label. +Do not change this label. {{< /note >}} The `pod-template-hash` label is added by the Deployment controller to every ReplicaSet that a Deployment creates or adopts. @@ -163,7 +163,7 @@ and in any existing Pods that the ReplicaSet might have. ## Updating a Deployment {{< note >}} -**Note:** A Deployment's rollout is triggered if and only if the Deployment's pod template (that is, `.spec.template`) +A Deployment's rollout is triggered if and only if the Deployment's pod template (that is, `.spec.template`) is changed, for example if the labels or container images of the template are updated. Other updates, such as scaling the Deployment, do not trigger a rollout. {{< /note >}} @@ -307,7 +307,7 @@ In any case, if you need to perform a label selector update, exercise great caut all of the implications. {{< note >}} -**Note:** In API version `apps/v1`, a Deployment's label selector is immutable after it gets created. +In API version `apps/v1`, a Deployment's label selector is immutable after it gets created. {{< /note >}} * Selector additions require the pod template labels in the Deployment spec to be updated with the new label too, @@ -326,7 +326,7 @@ By default, all of the Deployment's rollout history is kept in the system so tha (you can change that by modifying revision history limit). {{< note >}} -**Note:** A Deployment's revision is created when a Deployment's rollout is triggered. This means that the +A Deployment's revision is created when a Deployment's rollout is triggered. This means that the new revision is created if and only if the Deployment's pod template (`.spec.template`) is changed, for example if you update the labels or container images of the template. Other updates, such as scaling the Deployment, do not create a Deployment revision, so that you can facilitate simultaneous manual- or auto-scaling. @@ -373,7 +373,7 @@ nginx-deployment-3066724191-08mng 0/1 ImagePullBackOff 0 6s ``` {{< note >}} -**Note:** The Deployment controller will stop the bad rollout automatically, and will stop scaling up the new +The Deployment controller will stop the bad rollout automatically, and will stop scaling up the new ReplicaSet. This depends on the rollingUpdate parameters (`maxUnavailable` specifically) that you have specified. Kubernetes by default sets the value to 25%. {{< /note >}} @@ -681,7 +681,7 @@ nginx-3926361531 3 3 3 28s ``` {{< note >}} -**Note:** You cannot rollback a paused Deployment until you resume it. +You cannot rollback a paused Deployment until you resume it. {{< /note >}} ## Deployment status @@ -754,13 +754,13 @@ attributes to the Deployment's `.status.conditions`: See the [Kubernetes API conventions](https://git.k8s.io/community/contributors/devel/api-conventions.md#typical-status-properties) for more information on status conditions. {{< note >}} -**Note:** Kubernetes will take no action on a stalled Deployment other than to report a status condition with +Kubernetes will take no action on a stalled Deployment other than to report a status condition with `Reason=ProgressDeadlineExceeded`. Higher level orchestrators can take advantage of it and act accordingly, for example, rollback the Deployment to its previous version. {{< /note >}} {{< note >}} -**Note:** If you pause a Deployment, Kubernetes does not check progress against your specified deadline. You can +If you pause a Deployment, Kubernetes does not check progress against your specified deadline. You can safely pause a Deployment in the middle of a rollout and resume without triggering the condition for exceeding the deadline. {{< /note >}} @@ -865,7 +865,7 @@ this Deployment you want to retain. The rest will be garbage-collected in the ba it is 10. {{< note >}} -**Note:** Explicitly setting this field to 0, will result in cleaning up all the history of your Deployment +Explicitly setting this field to 0, will result in cleaning up all the history of your Deployment thus that Deployment will not be able to roll back. {{< /note >}} @@ -916,7 +916,7 @@ from `.spec.template` or if the total number of such Pods exceeds `.spec.replica Pods with `.spec.template` if the number of Pods is less than the desired number. {{< note >}} -**Note:** You should not create other pods whose labels match this selector, either directly, by creating +You should not create other pods whose labels match this selector, either directly, by creating another Deployment, or by creating another controller such as a ReplicaSet or a ReplicationController. If you do so, the first Deployment thinks that it created these other pods. Kubernetes does not stop you from doing this. {{< /note >}} diff --git a/content/ko/docs/setup/pick-right-solution.md b/content/ko/docs/setup/pick-right-solution.md index 5ce3aefad8..c70064e9f0 100644 --- a/content/ko/docs/setup/pick-right-solution.md +++ b/content/ko/docs/setup/pick-right-solution.md @@ -217,7 +217,7 @@ IBM Cloud Kubernetes Service | | Ubuntu | calico | [docs](https://console.bluemi {{< note >}} -**Note:** The above table is ordered by version test/used in nodes, followed by support level. +The above table is ordered by version test/used in nodes, followed by support level. {{< /note >}} ### 鞐 鞝曥潣 From 80f1d579124b10378faf802463d099067f7e59b0 Mon Sep 17 00:00:00 2001 From: Karen Bradshaw Date: Thu, 8 Nov 2018 12:43:55 -0500 Subject: [PATCH 031/222] toc clean-up (#10918) --- content/en/docs/reference/kubectl/overview.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/content/en/docs/reference/kubectl/overview.md b/content/en/docs/reference/kubectl/overview.md index 4d67d8f897..ee9d9d493b 100644 --- a/content/en/docs/reference/kubectl/overview.md +++ b/content/en/docs/reference/kubectl/overview.md @@ -3,9 +3,17 @@ reviewers: - bgrant0607 - hw-qiaolei title: Overview of kubectl +content_template: templates/concept +weight: 20 --- -`kubectl` is a command line interface for running commands against Kubernetes clusters. This overview covers `kubectl` syntax, describes the command operations, and provides common examples. For details about each command, including all the supported flags and subcommands, see the [kubectl](/docs/reference/generated/kubectl/kubectl-commands/) reference documentation. For installation instructions see [installing kubectl](/docs/tasks/kubectl/install/). +{{% capture overview %}} +Kubectl is a command line interface for running commands against Kubernetes clusters. +This overview covers `kubectl` syntax, describes the command operations, and provides common examples. For details about each command, including all the supported flags and subcommands, see the [kubectl](/docs/reference/generated/kubectl/kubectl-commands/) reference documentation. For installation instructions see [installing kubectl](/docs/tasks/kubectl/install/). + +{{% /capture %}} + +{{% capture body %}} ## Syntax @@ -434,6 +442,10 @@ Current user: plugins-user To find out more about plugins, take a look at the [example cli plugin](https://github.com/kubernetes/sample-cli-plugin). -## Next steps +{{% /capture %}} + +{{% capture whatsnext %}} Start using the [kubectl](/docs/reference/generated/kubectl/kubectl-commands/) commands. + +{{% /capture %}} \ No newline at end of file From cdffeb267f3a30d61b28d4626d50954d668f89b1 Mon Sep 17 00:00:00 2001 From: TaoBeier Date: Fri, 9 Nov 2018 01:45:30 +0800 Subject: [PATCH 032/222] Rename experimental-bootstrap-token-auth to enable-bootstrap-token-auth (#10907) Signed-off-by: Jintao Zhang --- content/en/docs/reference/access-authn-authz/authentication.md | 2 +- content/zh/docs/admin/bootstrap-tokens.md | 2 +- content/zh/docs/admin/kube-apiserver.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/content/en/docs/reference/access-authn-authz/authentication.md b/content/en/docs/reference/access-authn-authz/authentication.md index 26174c0bb4..1828be30b2 100644 --- a/content/en/docs/reference/access-authn-authz/authentication.md +++ b/content/en/docs/reference/access-authn-authz/authentication.md @@ -137,7 +137,7 @@ Authorization: Bearer 781292.db7bc3a58fc5f07e ``` You must enable the Bootstrap Token Authenticator with the -`--experimental-bootstrap-token-auth` flag on the API Server. You must enable +`--enable-bootstrap-token-auth` flag on the API Server. You must enable the TokenCleaner controller via the `--controllers` flag on the Controller Manager. This is done with something like `--controllers=*,tokencleaner`. `kubeadm` will do this for you if you are using it to bootstrap a cluster. diff --git a/content/zh/docs/admin/bootstrap-tokens.md b/content/zh/docs/admin/bootstrap-tokens.md index 4dfae1b856..ced000932d 100644 --- a/content/zh/docs/admin/bootstrap-tokens.md +++ b/content/zh/docs/admin/bootstrap-tokens.md @@ -32,7 +32,7 @@ Bootstrapping](/docs/admin/kubelet-tls-bootstrapping/) 绯荤粺杩涜宸ヤ綔銆 鎵鏈変笌鍚姩寮曞浠ょ墝鐩稿叧鐨勭壒鎬у湪 Kubernetes v1.6 鐗堟湰涓粯璁ら兘鏄鐢ㄧ殑銆 -浣犲彲浠ュ湪 API 鏈嶅姟鍣ㄤ笂閫氳繃 `--experimental-bootstrap-token-auth` 鍙傛暟鍚敤鍚姩寮曞浠ょ墝銆 +浣犲彲浠ュ湪 API 鏈嶅姟鍣ㄤ笂閫氳繃 `--enable-bootstrap-token-auth` 鍙傛暟鍚敤鍚姩寮曞浠ょ墝銆 浣犲彲浠ヨ缃帶鍒剁鐞嗗櫒鐨 `--controllers` 鍙傛暟鏉ュ惎鐢ㄥ惎鍔ㄥ紩瀵间护鐗岀浉鍏崇殑鎺у埗鍣紝渚嬪 `--controllers=*,tokencleaner,bootstrapsigner` 銆 鍦ㄤ娇鐢 `kubeadm` 鏃讹紝杩欐槸鑷姩瀹屾垚鐨勩 diff --git a/content/zh/docs/admin/kube-apiserver.md b/content/zh/docs/admin/kube-apiserver.md index d1009c71ab..53b9836812 100644 --- a/content/zh/docs/admin/kube-apiserver.md +++ b/content/zh/docs/admin/kube-apiserver.md @@ -104,7 +104,7 @@ kube-apiserver --event-ttl duration 浜嬩欢椹荤暀鏃堕棿銆傦紙榛樿鍊1h0m0s) - --experimental-bootstrap-token-auth 鍚敤姝ら夐」浠ュ厑璁'kube-system'鍛藉悕绌洪棿涓殑'bootstrap.kubernetes.io/token'绫诲瀷瀵嗛挜鍙互琚敤浜嶵LS鐨勫惎鍔ㄨ璇併 + --enable-bootstrap-token-auth 鍚敤姝ら夐」浠ュ厑璁'kube-system'鍛藉悕绌洪棿涓殑'bootstrap.kubernetes.io/token'绫诲瀷瀵嗛挜鍙互琚敤浜嶵LS鐨勫惎鍔ㄨ璇併 --experimental-encryption-provider-config string 鍖呭惈鍔犲瘑鎻愪緵绋嬪簭鐨勯厤缃殑鏂囦欢锛岃鍔犲瘑鎻愪緵绋嬪簭琚敤浜庡湪etcd涓繚瀛樺瘑閽ャ From 656a8373f051940fd50fd97c30657580bcee0b1d Mon Sep 17 00:00:00 2001 From: bhack Date: Thu, 8 Nov 2018 18:47:00 +0100 Subject: [PATCH 033/222] Update Kompose version (#10908) --- .../configure-pod-container/translate-compose-kubernetes.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md b/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md index 5713c69c53..87cf2ef2f0 100644 --- a/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md +++ b/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md @@ -33,13 +33,13 @@ Kompose is released via GitHub on a three-week cycle, you can see all current re ```sh # Linux -curl -L https://github.com/kubernetes/kompose/releases/download/v1.1.0/kompose-linux-amd64 -o kompose +curl -L https://github.com/kubernetes/kompose/releases/download/v1.16.0/kompose-linux-amd64 -o kompose # macOS -curl -L https://github.com/kubernetes/kompose/releases/download/v1.1.0/kompose-darwin-amd64 -o kompose +curl -L https://github.com/kubernetes/kompose/releases/download/v1.16.0/kompose-darwin-amd64 -o kompose # Windows -curl -L https://github.com/kubernetes/kompose/releases/download/v1.1.0/kompose-windows-amd64.exe -o kompose.exe +curl -L https://github.com/kubernetes/kompose/releases/download/v1.16.0/kompose-windows-amd64.exe -o kompose.exe chmod +x kompose sudo mv ./kompose /usr/local/bin/kompose From d929d4fff4776b88215aa2f73c45c93f82ce380b Mon Sep 17 00:00:00 2001 From: MengZeLee Date: Fri, 9 Nov 2018 01:48:30 +0800 Subject: [PATCH 034/222] Fix wrong parameters (#10905) --- content/en/docs/setup/independent/install-kubeadm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/setup/independent/install-kubeadm.md b/content/en/docs/setup/independent/install-kubeadm.md index 2b4413ea8d..cbf1c8ebb4 100644 --- a/content/en/docs/setup/independent/install-kubeadm.md +++ b/content/en/docs/setup/independent/install-kubeadm.md @@ -226,7 +226,7 @@ If you are using a different CRI, you have to modify the file `/etc/default/kubelet` with your `cgroup-driver` value, like so: ```bash -KUBELET_KUBEADM_EXTRA_ARGS=--cgroup-driver= +KUBELET_EXTRA_ARGS=--cgroup-driver= ``` This file will be used by `kubeadm init` and `kubeadm join` to source extra From c34ef23f3c0595011432011083d724b2bebc651a Mon Sep 17 00:00:00 2001 From: Zach Corleissen Date: Thu, 8 Nov 2018 10:51:39 -0800 Subject: [PATCH 035/222] Add blog post for l10n update (#10874) * Add blog post for l10n update Minor tweaks More minor tweakS Still more tweaks Yet more tweaks typo fix Add link to Shanghai KC+CNC Change date to 8 Nov * Update 2018-11-08-kubernetes-docs-update-i18n.md * Update 2018-11-08-kubernetes-docs-update-i18n.md --- .../2018-11-08-kubernetes-docs-update-i18n.md | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 content/en/blog/_posts/2018-11-08-kubernetes-docs-update-i18n.md diff --git a/content/en/blog/_posts/2018-11-08-kubernetes-docs-update-i18n.md b/content/en/blog/_posts/2018-11-08-kubernetes-docs-update-i18n.md new file mode 100644 index 0000000000..1cf40bd820 --- /dev/null +++ b/content/en/blog/_posts/2018-11-08-kubernetes-docs-update-i18n.md @@ -0,0 +1,58 @@ +--- +layout: blog +title: 'Kubernetes Docs Updates, International Edition' +date: 2018-11-08 +--- + +**Author**: Zach Corleissen (Linux Foundation) + +As a co-chair of SIG Docs, I'm excited to share that Kubernetes docs have a fully mature workflow for localization (l10n). + +## Abbreviations galore + +L10n is an abbreviation for _localization_. + +I18n is an abbreviation for _internationalization_. + +I18n is [what you do](https://www.w3.org/International/questions/qa-i18n) to make l10n easier. L10n is a fuller, more comprehensive process than translation (_t9n_). + +## Why localization matters + +The goal of SIG Docs is to make Kubernetes easier to use for as many people as possible. + +One year ago, we looked at whether it was possible to host the output of a Chinese team working independently to translate the Kubernetes docs. After many conversations (including experts on OpenStack l10n), [much transformation](https://kubernetes.io/blog/2018/05/05/hugo-migration/), and [renewed commitment to easier localization](https://github.com/kubernetes/website/pull/10485), we realized that open source documentation is, like open source software, an ongoing exercise at the edges of what's possible. + +Consolidating workflows, language labels, and team-level ownership may seem like simple improvements, but these features make l10n scalable for increasing numbers of l10n teams. While SIG Docs continues to iterate improvements, we've paid off a significant amount of technical debt and streamlined l10n in a single workflow. That's great for the future as well as the present. + +## Consolidated workflow + +Localization is now consolidated in the [kubernetes/website](https://github.com/kubernetes/website) repository. We've configured the Kubernetes CI/CD system, [Prow](https://github.com/kubernetes/test-infra/tree/master/prow), to handle automatic language label assignment as well as team-level PR review and approval. + +### Language labels + +Prow automatically applies language labels based on file path. Thanks to SIG Docs contributor [June Yi](https://github.com/kubernetes/test-infra/pull/9835), folks can also manually assign language labels in pull request (PR) comments. For example, when left as a comment on an issue or PR, this command assigns the label `language/ko` (Korean). + + +``` +/language ko +``` + +These repo labels let reviewers filter for PRs and issues by language. For example, you can now filter the k/website dashboard for [PRs with Chinese content](https://github.com/kubernetes/website/pulls?utf8=%E2%9C%93&q=is%3Aopen+is%3Apr+label%3Alanguage%2Fzh). + +### Team review + +L10n teams can now review and approve their own PRs. For example, review and approval permissions for English are [assigned in an OWNERS file](https://github.com/kubernetes/website/blob/master/content/en/OWNERS) in the top subfolder for English content. + +Adding `OWNERS` files to subdirectories lets localization teams review and approve changes without requiring a rubber stamp approval from reviewers who may lack fluency. + +## What's next + +We're looking forward to the [doc sprint in Shanghai](https://kccncchina2018english.sched.com/event/HVb2/contributor-summit-doc-sprint-additional-registration-required) to serve as a resource for the Chinese l10n team. + +We're excited to continue supporting the Japanese and Korean l10n teams, who are making excellent progress. + +If you're interested in localizing Kubernetes for your own language or region, check out our [guide to localizing Kubernetes docs](https://kubernetes.io/docs/contribute/localization/) and reach out to a [SIG Docs chair](https://github.com/kubernetes/community/tree/master/sig-docs#leadership) for support. + +### Get involved with SIG Docs + +If you're interested in Kubernetes documentation, come to a SIG Docs [weekly meeting](https://github.com/kubernetes/community/tree/master/sig-docs#meetings), or join [#sig-docs in Kubernetes Slack](https://kubernetes.slack.com/messages/C1J0BPD2M/details/). From e74e9394cdf94ee149b2d95a1740d4218457cee7 Mon Sep 17 00:00:00 2001 From: Cody Clark Date: Thu, 8 Nov 2018 11:13:04 -0800 Subject: [PATCH 036/222] Fix numbered lists (#10887) * Fix numbered lists * Update hello-minikube.md * Update hello-minikube.md * Update hello-minikube.md * Update hello-minikube.md * Update hello-minikube.md * Update hello-minikube.md * Update hello-minikube.md * remove redundant note labels --- content/en/docs/tutorials/hello-minikube.md | 228 ++++++++++---------- 1 file changed, 108 insertions(+), 120 deletions(-) diff --git a/content/en/docs/tutorials/hello-minikube.md b/content/en/docs/tutorials/hello-minikube.md index 6ce214c717..203d209652 100644 --- a/content/en/docs/tutorials/hello-minikube.md +++ b/content/en/docs/tutorials/hello-minikube.md @@ -48,21 +48,15 @@ For more information, read the Docker documentation for [docker build](https://d 1. Click **Launch Terminal** - {{< kat-button >}} + {{< kat-button >}} - {{< note >}} - If you installed Minikube locally, run - - ```shell - minikube start - ``` - {{< /note >}} + {{< note >}}If you installed Minikube locally, run `minikube start`.{{< /note >}} 2. Open the Kubernetes dashboard in a browser: -```shell -minikube dashboard -``` + ```shell + minikube dashboard + ``` 3. Katacoda environment only: At the top of the terminal pane, click the plus sign, and then click **Select port to view on Host 1**. @@ -80,51 +74,48 @@ recommended way to manage the creation and scaling of Pods. 1. Use the `kubectl run` command to create a Deployment that manages a Pod. The Pod runs a Container based on the provided Docker image. - ```shell - kubectl run hello-node --image=gcr.io/hello-minikube-zero-install/hello-node --port=8080 - ``` + ```shell + kubectl run hello-node --image=gcr.io/hello-minikube-zero-install/hello-node --port=8080 + ``` 2. View the Deployment: - ```shell - kubectl get deployments - ``` + ```shell + kubectl get deployments + ``` - Output: + Output: - ```shell - NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE - hello-node 1 1 1 1 1m - ``` + ```shell + NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE + hello-node 1 1 1 1 1m + ``` 3. View the Pod: - ```shell - kubectl get pods - ``` - Output: + ```shell + kubectl get pods + ``` + Output: - ```shell - NAME READY STATUS RESTARTS AGE - hello-node-5f76cf6ccf-br9b5 1/1 Running 0 1m - ``` + ```shell + NAME READY STATUS RESTARTS AGE + hello-node-5f76cf6ccf-br9b5 1/1 Running 0 1m + ``` 4. View cluster events: - ```shell - kubectl get events - ``` + ```shell + kubectl get events + ``` 5. View the `kubectl` configuration: - ```shell - kubectl config view - ``` + ```shell + kubectl config view + ``` - {{< note >}} - For more information about `kubectl`commands, see the - [kubectl overview](/docs/user-guide/kubectl-overview/). - {{< /note >}} + {{< note >}}For more information about `kubectl`commands, see the [kubectl overview](/docs/user-guide/kubectl-overview/).{{< /note >}} ## Create a Service @@ -135,41 +126,41 @@ Kubernetes [*Service*](/docs/concepts/services-networking/service/). 1. Expose the Pod to the public internet using the `kubectl expose` command: - ```shell - kubectl expose deployment hello-node --type=LoadBalancer - ``` + ```shell + kubectl expose deployment hello-node --type=LoadBalancer + ``` 2. View the Service you just created: - ```shell - kubectl get services - ``` + ```shell + kubectl get services + ``` - Output: + Output: - ```shell - NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE - hello-node LoadBalancer 10.108.144.78 8080:30369/TCP 21s - kubernetes ClusterIP 10.96.0.1 443/TCP 23m - ``` + ```shell + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + hello-node LoadBalancer 10.108.144.78 8080:30369/TCP 21s + kubernetes ClusterIP 10.96.0.1 443/TCP 23m + ``` - The `--type=LoadBalancer` flag indicates that you want to expose your Service - outside of the cluster. On cloud providers that support load balancers, - an external IP address would be provisioned to access the Service. On Minikube, - the `LoadBalancer` type makes the Service accessible through the `minikube service` - command. + The `--type=LoadBalancer` flag indicates that you want to expose your Service + outside of the cluster. On cloud providers that support load balancers, + an external IP address would be provisioned to access the Service. On Minikube, + the `LoadBalancer` type makes the Service accessible through the `minikube service` + command. 3. Run the following command: - ```shell - minikube service hello-node - ``` + ```shell + minikube service hello-node + ``` -4. Katacoda environment only: Click the plus sign, then click **Select port to view on Host 1**. +4. Katacoda environment only: Click the plus sign, and then click **Select port to view on Host 1**. 5. Katacoda environment only: Type in the Port number following `8080:`, and then click **Display Port**. - This opens up a browser window that serves your app and shows the "Hello World" message. + This opens up a browser window that serves your app and shows the "Hello World" message. ## Enable addons @@ -177,81 +168,78 @@ Minikube has a set of built-in addons that can be enabled, disabled and opened i 1. List the currently supported addons: - ```shell - minikube addons list - ``` + ```shell + minikube addons list + ``` - Output: - - ```shell - - addon-manager: enabled - - coredns: disabled - - dashboard: enabled - - default-storageclass: enabled - - efk: disabled - - freshpod: disabled - - heapster: disabled - - ingress: disabled - - kube-dns: enabled - - metrics-server: disabled - - nvidia-driver-installer: disabled - - nvidia-gpu-device-plugin: disabled - - registry: disabled - - registry-creds: disabled - - storage-provisioner: enabled - ``` - {{< note >}} - Minikube must be running for these commands to take effect. - {{< /note >}} + Output: + ```shell + addon-manager: enabled + coredns: disabled + dashboard: enabled + default-storageclass: enabled + efk: disabled + freshpod: disabled + heapster: disabled + ingress: disabled + kube-dns: enabled + metrics-server: disabled + nvidia-driver-installer: disabled + nvidia-gpu-device-plugin: disabled + registry: disabled + registry-creds: disabled + storage-provisioner: enabled + ``` + 2. Enable an addon, for example, `heapster`: - ```shell - minikube addons enable heapster - ``` + ```shell + minikube addons enable heapster + ``` - Output: + Output: - ```shell - heapster was successfully enabled - ``` + ```shell + heapster was successfully enabled + ``` 3. View the Pod and Service you just created: - ```shell - kubectl get po,svc -n kube-system - ``` + ```shell + kubectl get pod,svc -n kube-system + ``` - Output: + Output: - ```shell - NAME READY STATUS RESTARTS AGE - pod/heapster-9jttx 1/1 Running 0 26s - pod/influxdb-grafana-b29w8 2/2 Running 0 26s - pod/kube-addon-manager-minikube 1/1 Running 0 34m - pod/kube-dns-6dcb57bcc8-gv7mw 3/3 Running 0 34m - pod/kubernetes-dashboard-5498ccf677-cgspw 1/1 Running 0 34m - pod/storage-provisioner 1/1 Running 0 34m + ```shell + NAME READY STATUS RESTARTS AGE + pod/heapster-9jttx 1/1 Running 0 26s + pod/influxdb-grafana-b29w8 2/2 Running 0 26s + pod/kube-addon-manager-minikube 1/1 Running 0 34m + pod/kube-dns-6dcb57bcc8-gv7mw 3/3 Running 0 34m + pod/kubernetes-dashboard-5498ccf677-cgspw 1/1 Running 0 34m + pod/storage-provisioner 1/1 Running 0 34m - NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE - service/heapster ClusterIP 10.96.241.45 80/TCP 26s - service/kube-dns ClusterIP 10.96.0.10 53/UDP,53/TCP 34m - service/kubernetes-dashboard NodePort 10.109.29.1 80:30000/TCP 34m - service/monitoring-grafana NodePort 10.99.24.54 80:30002/TCP 26s - service/monitoring-influxdb ClusterIP 10.111.169.94 8083/TCP,8086/TCP 26s - ``` + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + service/heapster ClusterIP 10.96.241.45 80/TCP 26s + service/kube-dns ClusterIP 10.96.0.10 53/UDP,53/TCP 34m + service/kubernetes-dashboard NodePort 10.109.29.1 80:30000/TCP 34m + service/monitoring-grafana NodePort 10.99.24.54 80:30002/TCP 26s + service/monitoring-influxdb ClusterIP 10.111.169.94 8083/TCP,8086/TCP 26s + ``` 4. Disable `heapster`: - ```shell - minikube addons disable heapster - ``` + ```shell + minikube addons disable heapster + ``` - Output: + Output: - ```shell - heapster was successfully disabled - ``` + ```shell + heapster was successfully disabled + ``` ## Clean up From 23d434254cc92eb8b7afd1ad0bdd4d8fd2ce8854 Mon Sep 17 00:00:00 2001 From: Bily Zhang Date: Fri, 9 Nov 2018 03:18:30 +0800 Subject: [PATCH 037/222] Fix typos: functionizing -> functionalizing (#10925) Signed-off-by: mooncake --- content/en/docs/sitemap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/sitemap.md b/content/en/docs/sitemap.md index a65bd4f01b..133f426a6b 100644 --- a/content/en/docs/sitemap.md +++ b/content/en/docs/sitemap.md @@ -38,7 +38,7 @@ function mainLogic() } function populateDropdowns() { - // Keeping mainLogic() brief by functionizing the initialization of the + // Keeping mainLogic() brief by functionalizing the initialization of the // drop-down filter boxes for(i=0;i Date: Fri, 9 Nov 2018 05:22:33 +0800 Subject: [PATCH 038/222] fix typo (#10814) From 71656718c93e25602ba18c99302507306b61689c Mon Sep 17 00:00:00 2001 From: Pingan Date: Sat, 10 Nov 2018 01:14:06 +0800 Subject: [PATCH 039/222] Remove redundant feature state (#10933) --- .../en/docs/concepts/configuration/pod-priority-preemption.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/en/docs/concepts/configuration/pod-priority-preemption.md b/content/en/docs/concepts/configuration/pod-priority-preemption.md index c9b2ff7c6d..7ee796191d 100644 --- a/content/en/docs/concepts/configuration/pod-priority-preemption.md +++ b/content/en/docs/concepts/configuration/pod-priority-preemption.md @@ -9,7 +9,6 @@ weight: 70 {{% capture overview %}} -{{< feature-state for_k8s_version="1.8" state="alpha" >}} {{< feature-state for_k8s_version="1.11" state="beta" >}} [Pods](/docs/user-guide/pods) can have _priority_. Priority indicates the From f555cbd467ffeaec706650dbe3376ff3edef6fd4 Mon Sep 17 00:00:00 2001 From: Steve Wong Date: Sat, 10 Nov 2018 11:35:35 -0800 Subject: [PATCH 040/222] Add VMware Cloud PKS to solutions list (#10900) --- content/en/docs/setup/pick-right-solution.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/en/docs/setup/pick-right-solution.md b/content/en/docs/setup/pick-right-solution.md index 1fed1a600c..482821bb77 100644 --- a/content/en/docs/setup/pick-right-solution.md +++ b/content/en/docs/setup/pick-right-solution.md @@ -76,6 +76,8 @@ a Kubernetes cluster from scratch. * [Stackpoint.io](https://stackpoint.io) provides Kubernetes infrastructure automation and management for multiple public clouds. +* [VMware Cloud PKS](https://cloud.vmware.com/vmware-cloud-pks) is an enterprise Kubernetes-as-a-Service offering in the VMware Cloud Services portfolio that provides easy to use, secure by default, cost effective, SaaS-based Kubernetes clusters. + ## Turnkey Cloud Solutions These solutions allow you to create Kubernetes clusters on a range of Cloud IaaS providers with only a @@ -225,6 +227,7 @@ Alibaba Cloud Container Service For Kubernetes | ROS | CentOS | flannel/T Agile Stacks | Terraform | CoreOS | multi-support | [docs](https://www.agilestacks.com/products/kubernetes) | Commercial IBM Cloud Kubernetes Service | | Ubuntu | calico | [docs](https://console.bluemix.net/docs/containers/container_index.html) | Commercial Digital Rebar | kubeadm | any | metal | [docs](/docs/setup/on-premises-metal/krib/) | Community ([@digitalrebar](https://github.com/digitalrebar)) +VMware Cloud PKS | | Photon OS | Canal | [docs](https://docs.vmware.com/en/VMware-Kubernetes-Engine/index.html) | Commercial {{< note >}} The above table is ordered by version test/used in nodes, followed by support level. From cc763d469215749801c300e7542c77408c6dd5c5 Mon Sep 17 00:00:00 2001 From: Bily Zhang Date: Sun, 11 Nov 2018 11:55:00 +0800 Subject: [PATCH 041/222] Fix typos: kubele -> kubelet (#10947) Signed-off-by: mooncake --- .../zh/docs/concepts/architecture/master-node-communication.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/concepts/architecture/master-node-communication.md b/content/zh/docs/concepts/architecture/master-node-communication.md index f99d9ed47a..45b2d08d59 100644 --- a/content/zh/docs/concepts/architecture/master-node-communication.md +++ b/content/zh/docs/concepts/architecture/master-node-communication.md @@ -43,7 +43,7 @@ Master 缁勪欢閫氳繃闈炲畨鍏紙娌℃湁鍔犲瘑鎴栬璇侊級绔彛鍜岄泦缇ょ殑 apiser ### apiserver -> kubelet -浠 apiserver 鍒 kubelet 鐨勮繛鎺ョ敤浜庤幏鍙 pods 鏃ュ織銆佽繛鎺ワ紙閫氳繃 kubectl锛夎繍琛屼腑鐨 pods锛屼互鍙婁娇鐢 kubele 鐨勭鍙h浆鍙戝姛鑳姐傝繖浜涜繛鎺ョ粓姝簬 kubelet 鐨 HTTPS endpoint銆 +浠 apiserver 鍒 kubelet 鐨勮繛鎺ョ敤浜庤幏鍙 pods 鏃ュ織銆佽繛鎺ワ紙閫氳繃 kubectl锛夎繍琛屼腑鐨 pods锛屼互鍙婁娇鐢 kubelet 鐨勭鍙h浆鍙戝姛鑳姐傝繖浜涜繛鎺ョ粓姝簬 kubelet 鐨 HTTPS endpoint銆 榛樿鐨勶紝apiserver 涓嶄細楠岃瘉 kubelet 鐨勬湇鍔¤瘉涔︼紝杩欎細瀵艰嚧杩炴帴閬埌涓棿浜烘敾鍑伙紝鍥犺屽湪涓嶅彲淇℃垨鍏叡缃戠粶涓婃槸涓嶅畨鍏ㄧ殑銆 From aa4ea8d95bff51c3de4032f2fbb778dba78644bb Mon Sep 17 00:00:00 2001 From: Bily Zhang Date: Sun, 11 Nov 2018 11:56:21 +0800 Subject: [PATCH 042/222] Fix issues in content (#10943) * Fix issues in content Signed-off-by: mooncake * rollback file --- content/en/docs/concepts/policy/pod-security-policy.md | 2 +- content/en/docs/tasks/extend-kubectl/kubectl-plugins.md | 2 +- .../en/docs/tasks/run-application/horizontal-pod-autoscale.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/content/en/docs/concepts/policy/pod-security-policy.md b/content/en/docs/concepts/policy/pod-security-policy.md index 447d048271..e1c15890d3 100644 --- a/content/en/docs/concepts/policy/pod-security-policy.md +++ b/content/en/docs/concepts/policy/pod-security-policy.md @@ -457,7 +457,7 @@ root filesystem (i.e. no writable layer). ### Flexvolume drivers -This specifies a whiltelist of Flexvolume drivers that are allowed to be used +This specifies a whitelist of Flexvolume drivers that are allowed to be used by flexvolume. An empty list or nil means there is no restriction on the drivers. Please make sure [`volumes`](#volumes-and-file-systems) field contains the `flexVolume` volume type; no Flexvolume driver is allowed otherwise. diff --git a/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md b/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md index ee777c5600..cfbaea033c 100644 --- a/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md +++ b/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md @@ -191,7 +191,7 @@ The command from the above example, can be invoked using either a dash (`-`) or $ kubectl foo-bar I am a plugin with a dash in my name -# it can also be inovked using an underscore +# it can also be invoked using an underscore $ kubectl foo_bar I am a plugin with a dash in my name ``` diff --git a/content/en/docs/tasks/run-application/horizontal-pod-autoscale.md b/content/en/docs/tasks/run-application/horizontal-pod-autoscale.md index 47e22881a0..1859a19e99 100644 --- a/content/en/docs/tasks/run-application/horizontal-pod-autoscale.md +++ b/content/en/docs/tasks/run-application/horizontal-pod-autoscale.md @@ -159,7 +159,7 @@ replica counts is chosen. If any of those metrics cannot be converted into a desired replica count (e.g. due to an error fetching the metrics from the metrics APIs), scaling is skipped. -Finally, just before HPA scales the target, the scale reccomendation is recorded. The +Finally, just before HPA scales the target, the scale recommendation is recorded. The controller considers all recommendations within a configurable window choosing the highest recommendation from within that window. This value can be configured using the `--horizontal-pod-autoscaler-downscale-stabilization-window` flag, which defaults to 5 minutes. This means that scaledowns will occur gradually, smoothing out the impact of rapidly From e68f05793f5cf348d4deb0a91dc0fb963f7ed2ce Mon Sep 17 00:00:00 2001 From: Shuo Li Date: Sun, 11 Nov 2018 14:29:21 +0800 Subject: [PATCH 043/222] zh_trans_docs_concepts_index (#10744) --- content/zh/docs/concepts/_index.md | 123 +++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 content/zh/docs/concepts/_index.md diff --git a/content/zh/docs/concepts/_index.md b/content/zh/docs/concepts/_index.md new file mode 100644 index 0000000000..891e8b764a --- /dev/null +++ b/content/zh/docs/concepts/_index.md @@ -0,0 +1,123 @@ + + +--- +title: 姒傚康 +main_menu: true +content_template: templates/concept +weight: 40 +--- + +{{% capture overview %}} + + + +姒傚康閮ㄥ垎鍙互甯姪浣犱簡瑙 Kubernetes 鐨勫悇涓粍鎴愰儴鍒嗕互鍙 Kubernetes 鐢ㄦ潵琛ㄧず闆嗙兢鐨勪竴浜涙娊璞℃蹇碉紝骞跺府鍔╀綘鏇村姞娣卞叆鐨勭悊瑙 Kubernetes 鏄浣曞伐浣滅殑銆 + +{{% /capture %}} + +{{% capture body %}} + + + +## 姒傝堪 + + + +瑕佷娇鐢 Kubernetes锛屼綘闇瑕佺敤 *Kubernetes API 瀵硅薄*鏉ユ弿杩伴泦缇ょ殑*棰勬湡鐘舵侊紙desired state锛*锛氬寘鎷綘闇瑕佽繍琛岀殑搴旂敤鎴栬呰礋杞斤紝瀹冧滑浣跨敤鐨勯暅鍍忋佸壇鏈暟锛屼互鍙婃墍闇缃戠粶鍜岀鐩樿祫婧愮瓑绛夈備綘鍙互浣跨敤鍛戒护琛屽伐鍏 `kubectl` 鏉ヨ皟鐢 Kubernetes API 鍒涘缓瀵硅薄锛岄氳繃鎵鍒涘缓鐨勮繖浜涘璞℃潵閰嶇疆棰勬湡鐘舵併備綘涔熷彲浠ョ洿鎺ヨ皟鐢 Kubernetes API 鍜岄泦缇よ繘琛屼氦浜掞紝璁剧疆鎴栬呬慨鏀归鏈熺姸鎬併 + + + +涓鏃︿綘璁剧疆浜嗕綘鎵闇鐨勭洰鏍囩姸鎬侊紝*Kubernetes 鎺у埗闈紙control plane锛* 浼氫績鎴愰泦缇ょ殑褰撳墠鐘舵佺鍚堝叾棰勬湡鐘舵併備负姝わ紝Kubernetes 浼氳嚜鍔ㄦ墽琛屽悇绫讳换鍔★紝姣斿杩愯鎴栬呴噸鍚鍣ㄣ佽皟鏁寸粰瀹氬簲鐢ㄧ殑鍓湰鏁扮瓑绛夈侹ubernetes 鎺у埗闈㈢敱涓缁勮繍琛屽湪闆嗙兢涓婄殑杩涚▼缁勬垚锛 + + + +* **Kubernetes 涓绘帶缁勪欢锛圡aster锛** 鍖呭惈涓変釜杩涚▼锛岄兘杩愯鍦ㄩ泦缇や腑鐨勬煇涓妭涓婏紝閫氬父杩欎釜鑺傜偣琚О涓 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 鐨勭綉缁滄湇鍔′唬鐞嗗埌姣忎釜鑺傜偣涓娿 + + + +## Kubernetes 瀵硅薄 + + + +Kubernetes 鍖呭惈鑻ュ共鎶借薄鐢ㄦ潵琛ㄧず绯荤粺鐘舵侊紝鍖呮嫭锛氬凡閮ㄧ讲鐨勫鍣ㄥ寲搴旂敤鍜岃礋杞姐佷笌瀹冧滑鐩稿叧鐨勭綉缁滃拰纾佺洏璧勬簮浠ュ強鏈夊叧闆嗙兢姝e湪杩愯鐨勫叾浠栨搷浣滅殑淇℃伅銆傝繖浜涙娊璞′娇鐢 Kubernetes API 瀵硅薄鏉ヨ〃绀恒傚弬闃 [Kubernetes瀵硅薄姒傝堪](/docs/concepts/abstractions/overview/)浠ヤ簡瑙h缁嗕俊鎭 + + + +鍩烘湰鐨 Kubernetes 瀵硅薄鍖呮嫭锛 + +* [Pod](/docs/concepts/workloads/pods/pod-overview/) +* [Service](/docs/concepts/services-networking/service/) +* [Volume](/docs/concepts/storage/volumes/) +* [Namespace](/docs/concepts/overview/working-with-objects/namespaces/) + + + +鍙﹀锛孠ubernetes 鍖呭惈澶ч噺鐨勮绉颁綔*鎺у埗鍣紙controllers锛*鐨勯珮绾ф娊璞°傛帶鍒跺櫒鍩轰簬鍩烘湰瀵硅薄鏋勫缓骞舵彁渚涢澶栫殑鍔熻兘鍜屾柟渚夸娇鐢ㄧ殑鐗规с傚叿浣撳寘鎷細 + +* [ReplicaSet](/docs/concepts/workloads/controllers/replicaset/) +* [Deployment](/docs/concepts/workloads/controllers/deployment/) +* [StatefulSet](/docs/concepts/workloads/controllers/statefulset/) +* [DaemonSet](/docs/concepts/workloads/controllers/daemonset/) +* [Job](/docs/concepts/workloads/controllers/jobs-run-to-completion/) + + + +## Kubernetes 鎺у埗闈 + + + +鍏充簬 Kubernetes 鎺у埗骞抽潰鐨勫悇涓儴鍒嗭紝锛堝 Kubernetes 涓绘帶缁勪欢鍜 kubelet 杩涚▼锛岀鐞嗙潃 Kubernetes 濡備綍涓庝綘鐨勯泦缇よ繘琛岄氫俊銆傛帶鍒跺钩闈㈢淮鎶ょ潃绯荤粺涓墍鏈夌殑 Kubernetes 瀵硅薄鐨勭姸鎬佽褰曪紝骞朵笖閫氳繃杩炵画鐨勬帶鍒跺惊鐜潵绠$悊杩欎簺瀵硅薄鐨勭姸鎬併傚湪浠讳竴鐨勭粰瀹氭椂闂寸偣锛屾帶鍒堕潰鐨勬帶鍒剁幆閮借兘鍝嶅簲闆嗙兢涓殑鍙樺寲锛屽苟涓旇绯荤粺涓墍鏈夊璞$殑瀹為檯鐘舵佷笌浣犳彁渚涚殑棰勬湡鐘舵佺浉鍖归厤銆 + + + +姣斿锛 褰撲綘閫氳繃 Kubernetes API 鍒涘缓涓涓 Deployment 瀵硅薄锛屼綘灏变负绯荤粺澧炲姞浜嗕竴涓柊鐨勭洰鏍囩姸鎬併侹ubernetes 鎺у埗骞抽潰璁板綍鐫瀵硅薄鐨勫垱寤猴紝骞跺惎鍔ㄥ繀瑕佺殑搴旂敤鐒跺悗灏嗗畠浠皟搴﹁嚦闆嗙兢鏌愪釜鑺傜偣涓婃潵鎵ц浣犵殑鎸囦护锛屼互姝ゆ潵淇濇寔闆嗙兢鐨勫疄闄呯姸鎬佸拰鐩爣鐘舵佺殑鍖归厤銆 + + + +### Kubernetes Master 鑺傜偣 + + + +Kubernetes master 鑺傜偣璐熻矗缁存姢闆嗙兢鐨勭洰鏍囩姸鎬併傚綋浣犺涓 Kubernetes 閫氫俊鏃讹紝浣跨敤濡 `kubectl` 鐨勫懡浠よ宸ュ叿锛屽氨鍙互鐩存帴涓 Kubernetes master 鑺傜偣杩涜閫氫俊銆 + + + +> "master" 鏄寚绠$悊闆嗙兢鐘舵佺殑涓缁勮繘绋嬬殑闆嗗悎銆傞氬父杩欎簺杩涚▼閮借窇鍦ㄩ泦缇や腑涓涓崟鐙殑鑺傜偣涓婏紝骞朵笖杩欎釜鑺傜偣琚О涓 master 鑺傜偣銆俶aster 鑺傜偣涔熷彲浠ユ墿灞曞壇鏈暟锛屾潵鑾峰彇鏇村ソ鐨勬ц兘鍙婂啑浣欍 + + + +### Kubernetes Node 鑺傜偣 + + + +闆嗙兢涓殑 node 鑺傜偣锛堣櫄鎷熸満銆佺墿鐞嗘満绛夌瓑锛夐兘鏄敤鏉ヨ繍琛屼綘鐨勫簲鐢ㄥ拰浜戝伐浣滄祦鐨勬満鍣ㄣ侹ubernetes master 鑺傜偣鎺у埗鎵鏈 node 鑺傜偣锛涗綘寰堝皯闇瑕佸拰 node 鑺傜偣杩涜鐩存帴閫氫俊銆 + + + +#### 瀵硅薄鍏冩暟鎹 + + +* [娉ㄩ噴](/docs/concepts/overview/working-with-objects/annotations/) + +{{% /capture %}} + +{{% capture whatsnext %}} + + + +濡傛灉浣犳兂缂栧啓涓涓蹇甸〉闈紝璇峰弬闃匸浣跨敤椤甸潰妯℃澘](/docs/home/contribute/page-templates/)鑾峰彇鏇村鏈夊叧姒傚康椤甸潰绫诲瀷鍜屾蹇垫ā鏉跨殑淇℃伅銆 + +{{% /capture %}} From e992177e2c210ce3540ca990f28849350d6decfd Mon Sep 17 00:00:00 2001 From: Liuduii <1693291525@qq.com> Date: Mon, 12 Nov 2018 09:21:29 +0800 Subject: [PATCH 044/222] Remove some extra Spaces (#10949) --- .../2018-04-04-fixing-subpath-volume-vulnerability.md | 2 +- content/en/docs/concepts/storage/volumes.md | 6 +++--- .../en/docs/concepts/workloads/controllers/deployment.md | 2 +- content/en/docs/getting-started-guides/windows/_index.md | 2 +- .../access-authn-authz/service-accounts-admin.md | 4 ++-- .../docs/reference/glossary/cloud-controller-manager.md | 2 +- .../setup-tools/kubeadm/implementation-details.md | 8 ++++---- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/content/en/blog/_posts/2018-04-04-fixing-subpath-volume-vulnerability.md b/content/en/blog/_posts/2018-04-04-fixing-subpath-volume-vulnerability.md index 9dd1a4759c..b7a25e7473 100644 --- a/content/en/blog/_posts/2018-04-04-fixing-subpath-volume-vulnerability.md +++ b/content/en/blog/_posts/2018-04-04-fixing-subpath-volume-vulnerability.md @@ -137,7 +137,7 @@ However, this design is prone to the classic time-of-check-to-time-of-use ([TOCT We went a bit wild with this idea: -* Create a working directory under the kubelet鈥檚 pod directory. Let鈥檚 call it `dir1`. +* Create a working directory under the kubelet鈥檚 pod directory. Let鈥檚 call it `dir1`. * Bind mount the base volume to under the working directory, `dir1/volume`. * Chroot to the working directory `dir1`. * Inside the chroot, bind mount `volume/subpath` to `subpath`. This ensures that any symlinks get resolved to inside the chroot environment. diff --git a/content/en/docs/concepts/storage/volumes.md b/content/en/docs/concepts/storage/volumes.md index 7ce8c092db..3820394deb 100644 --- a/content/en/docs/concepts/storage/volumes.md +++ b/content/en/docs/concepts/storage/volumes.md @@ -1191,16 +1191,16 @@ persistent volume: - `controllerPublishSecretRef`: A reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI `ControllerPublishVolume` and `ControllerUnpublishVolume` calls. This field is - optional, and may be empty if no secret is required. If the secret object + optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed. - `nodeStageSecretRef`: A reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI - `NodeStageVolume` call. This field is optional, and may be empty if no secret + `NodeStageVolume` call. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed. - `nodePublishSecretRef`: A reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI - `NodePublishVolume` call. This field is optional, and may be empty if no + `NodePublishVolume` call. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed. diff --git a/content/en/docs/concepts/workloads/controllers/deployment.md b/content/en/docs/concepts/workloads/controllers/deployment.md index c738991a8c..3a2455c930 100644 --- a/content/en/docs/concepts/workloads/controllers/deployment.md +++ b/content/en/docs/concepts/workloads/controllers/deployment.md @@ -74,7 +74,7 @@ In this example: To create this Deployment, run the following command: ```shell -kubectl create -f https://k8s.io/examples/controllers/nginx-deployment.yaml +kubectl create -f https://k8s.io/examples/controllers/nginx-deployment.yaml ``` {{< note >}} diff --git a/content/en/docs/getting-started-guides/windows/_index.md b/content/en/docs/getting-started-guides/windows/_index.md index 022e86fda3..5243a6ccfb 100644 --- a/content/en/docs/getting-started-guides/windows/_index.md +++ b/content/en/docs/getting-started-guides/windows/_index.md @@ -365,7 +365,7 @@ Some of these limitations will be addressed by the community in future releases - Under the networking models of L3 or Host GW, Kubernetes Services are inaccessible to Windows nodes due to a Windows issue. This is not an issue if using OVN/OVS for networking. - Windows kubelet.exe may fail to start when running on Windows Server under VMware Fusion [issue 57110](https://github.com/kubernetes/kubernetes/pull/57124) - Flannel and Weavenet are not yet supported -- Some .Net Core applications expect environment variables with a colon (`:`) in the name. Kubernetes currently does not allow this. Replace colon (`:`) with double underscore (`__`) as documented [here](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?tabs=basicconfiguration#configuration-by-environment). +- Some .Net Core applications expect environment variables with a colon (`:`) in the name. Kubernetes currently does not allow this. Replace colon (`:`) with double underscore (`__`) as documented [here](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?tabs=basicconfiguration#configuration-by-environment). - As cgroups are not supported on windows, kubelet.exe should be started with the following additional arguments `--cgroups-per-qos=false --enforce-node-allocatable=""` [issue 61716](https://github.com/kubernetes/kubernetes/issues/61716) ## Next steps and resources diff --git a/content/en/docs/reference/access-authn-authz/service-accounts-admin.md b/content/en/docs/reference/access-authn-authz/service-accounts-admin.md index 932f9fb225..7e030903bc 100644 --- a/content/en/docs/reference/access-authn-authz/service-accounts-admin.md +++ b/content/en/docs/reference/access-authn-authz/service-accounts-admin.md @@ -23,14 +23,14 @@ incomplete features are referred to in order to better describe service accounts Kubernetes distinguishes between the concept of a user account and a service account for a number of reasons: - - User accounts are for humans. Service accounts are for processes, which + - User accounts are for humans. Service accounts are for processes, which run in pods. - User accounts are intended to be global. Names must be unique across all namespaces of a cluster, future user resource will not be namespaced. Service accounts are namespaced. - Typically, a cluster's User accounts might be synced from a corporate database, where new user account creation requires special privileges and - is tied to complex business processes. Service account creation is intended + is tied to complex business processes. Service account creation is intended to be more lightweight, allowing cluster users to create service accounts for specific tasks (i.e. principle of least privilege). - Auditing considerations for humans and service accounts may differ. diff --git a/content/en/docs/reference/glossary/cloud-controller-manager.md b/content/en/docs/reference/glossary/cloud-controller-manager.md index 0962c0c359..9a818ff93e 100755 --- a/content/en/docs/reference/glossary/cloud-controller-manager.md +++ b/content/en/docs/reference/glossary/cloud-controller-manager.md @@ -16,5 +16,5 @@ tags: -Kubernetes v1.6 contains a new binary called cloud-controller-manager. cloud-controller-manager is a daemon that embeds cloud-specific control loops. These cloud-specific control loops were originally in the kube-controller-manager. Since cloud providers develop and release at a different pace compared to the Kubernetes project, abstracting the provider-specific code to the cloud-controller-manager binary allows cloud vendors to evolve independently from the core Kubernetes code. +Kubernetes v1.6 contains a new binary called cloud-controller-manager. cloud-controller-manager is a daemon that embeds cloud-specific control loops. These cloud-specific control loops were originally in the kube-controller-manager. Since cloud providers develop and release at a different pace compared to the Kubernetes project, abstracting the provider-specific code to the cloud-controller-manager binary allows cloud vendors to evolve independently from the core Kubernetes code. diff --git a/content/en/docs/reference/setup-tools/kubeadm/implementation-details.md b/content/en/docs/reference/setup-tools/kubeadm/implementation-details.md index 8d846acbc7..867c17691e 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/implementation-details.md +++ b/content/en/docs/reference/setup-tools/kubeadm/implementation-details.md @@ -86,7 +86,7 @@ In any case the user can skip specific preflight checks (or eventually all prefl - [error] if not Kernel 3.10+ or 4+ with specific KernelSpec - [error] if required cgroups subsystem aren't in set up - if using docker: - - [warning/error] if Docker service does not exist, if it is disabled, if it is not active. + - [warning/error] if Docker service does not exist, if it is disabled, if it is not active. - [error] if Docker endpoint does not exist or does not work - [warning] if docker version >17.03 - If using other cri engine: @@ -200,7 +200,7 @@ Static Pod manifest share a set of common properties: of using Pod Priority and Preemption when ready) - `hostNetwork: true` is set on all static Pods to allow control plane startup before a network is configured; as a consequence: * The `address` that the controller-manager and the scheduler use to refer the API server is `127.0.0.1` - * If using a local etcd server, `etcd-servers` address will be set to `127.0.0.1:2379` + * If using a local etcd server, `etcd-servers` address will be set to `127.0.0.1:2379` - Leader election is enabled for both the controller-manager and the scheduler - Controller-manager and the scheduler will reference kubeconfig files with their respective, unique identities - All static Pods gets any extra flags specified by the user as described in [passing custom arguments to control plane components](/docs/reference/setup-tools/kubeadm/kubeadm-init/#custom-args) @@ -224,7 +224,7 @@ The static Pod manifest for the API server is affected by following parameters p - The `service-cluster-ip-range` to use for services - If an external etcd server is specified, the `etcd-servers` address and related TLS settings (`etcd-cafile`, `etcd-certfile`, `etcd-keyfile`); if an external etcd server is not be provided, a local etcd will be used (via host network) - - If a cloud provider is specified, the corresponding `--cloud-provider` is configured, together with the `--cloud-config` path + - If a cloud provider is specified, the corresponding `--cloud-provider` is configured, together with the `--cloud-config` path if such file exists (this is experimental, alpha and will be removed in a future version) - If kubeadm is invoked with `--feature-gates=HighAvailability`, the flag `--endpoint-reconciler-type=lease` is set, thus enabling automatic reconciliation of endpoints for the internal API server VIP @@ -277,7 +277,7 @@ The static Pod manifest for the API server is affected by following parameters p setting: - `--allocate-node-cidrs=true` - `--cluster-cidr` and `--node-cidr-mask-size` flags according to the given CIDR - - If a cloud provider is specified, the corresponding `--cloud-provider` is specified, together with the `--cloud-config` path + - If a cloud provider is specified, the corresponding `--cloud-provider` is specified, together with the `--cloud-config` path if such configuration file exists (this is experimental, alpha and will be removed in a future version) Other flags that are set unconditionally are: From b17c9018f1b796a306a6b688ef577cdedfd2b1d1 Mon Sep 17 00:00:00 2001 From: Clyde D'Souza Date: Mon, 12 Nov 2018 14:22:50 +1300 Subject: [PATCH 045/222] Fixed typo (#10950) Removed extra parenthesis ')' from linked item. --- content/en/docs/setup/turnkey/azure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/setup/turnkey/azure.md b/content/en/docs/setup/turnkey/azure.md index cd46706874..028bab47b7 100644 --- a/content/en/docs/setup/turnkey/azure.md +++ b/content/en/docs/setup/turnkey/azure.md @@ -7,7 +7,7 @@ title: Running Kubernetes on Azure ## Azure Kubernetes Service (AKS) -The [Azure Kubernetes Service)](https://azure.microsoft.com/en-us/services/kubernetes-service/) offers simple +The [Azure Kubernetes Service](https://azure.microsoft.com/en-us/services/kubernetes-service/) offers simple deployments for Kubernetes clusters. For an example of deploying a Kubernetes cluster onto Azure via the Azure Kubernetes Service: From 8d8c55a8d5739204ed2a534c7918979ed1916d2e Mon Sep 17 00:00:00 2001 From: Stig Otnes Kolstad Date: Mon, 12 Nov 2018 02:39:51 +0100 Subject: [PATCH 046/222] Disable line wrapping base64 output (#10724) --- content/en/docs/reference/kubectl/cheatsheet.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/reference/kubectl/cheatsheet.md b/content/en/docs/reference/kubectl/cheatsheet.md index 3d2a703f0a..e7cef38ef1 100644 --- a/content/en/docs/reference/kubectl/cheatsheet.md +++ b/content/en/docs/reference/kubectl/cheatsheet.md @@ -110,8 +110,8 @@ metadata: name: mysecret type: Opaque data: - password: $(echo -n "s33msi4" | base64) - username: $(echo -n "jane" | base64) + password: $(echo -n "s33msi4" | base64 -w0) + username: $(echo -n "jane" | base64 -w0) EOF ``` From 897c02e36ec2cfdf2bb9313061173e55f22fdd1d Mon Sep 17 00:00:00 2001 From: Kevin Morgan Date: Sun, 11 Nov 2018 19:05:26 -0800 Subject: [PATCH 047/222] Update for clarity (#10909) We receive a lot of customer queries around HPA not communicating with metrics-server where the core issue is that metrics-server is not installed. Feedback has been that this wasn't explicitly clear, suggesting this change in wording to assist. --- .../run-application/horizontal-pod-autoscale-walkthrough.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/content/en/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md b/content/en/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md index 39ab3fd150..8cdf150782 100644 --- a/content/en/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md +++ b/content/en/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md @@ -25,9 +25,8 @@ This document walks you through an example of enabling Horizontal Pod Autoscaler This example requires a running Kubernetes cluster and kubectl, version 1.2 or later. [metrics-server](https://github.com/kubernetes-incubator/metrics-server/) monitoring needs to be deployed in the cluster -to provide metrics via the resource metrics API, as Horizontal Pod Autoscaler uses this API to collect metrics -(if you followed [getting started on GCE guide](/docs/setup/turnkey/gce/), -metrics-server monitoring will be turned-on by default). +to provide metrics via the resource metrics API, as Horizontal Pod Autoscaler uses this API to collect metrics. The instructions for deploying this are on the GitHub repository of [metrics-server](https://github.com/kubernetes-incubator/metrics-server/), if you followed [getting started on GCE guide](/docs/setup/turnkey/gce/), +metrics-server monitoring will be turned-on by default. To specify multiple resource metrics for a Horizontal Pod Autoscaler, you must have a Kubernetes cluster and kubectl at version 1.6 or later. Furthermore, in order to make use of custom metrics, your cluster From 8a099ce6a90cda542a7306a618fc94ab73aa0dce Mon Sep 17 00:00:00 2001 From: W Technologist Date: Mon, 12 Nov 2018 12:06:51 +0900 Subject: [PATCH 048/222] add missing pictures in the Chinese homepage (#10952) --- content/zh/_index.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/zh/_index.html b/content/zh/_index.html index 0a8a7aa613..3c932e4a95 100644 --- a/content/zh/_index.html +++ b/content/zh/_index.html @@ -6,7 +6,7 @@ cid: "home"

    -
    +
    images/flower.png

    Kubernetes 鏄敤浜庤嚜鍔ㄩ儴缃诧紝鎵╁睍鍜岀鐞嗗鍣ㄥ寲搴旂敤绋嬪簭鐨勫紑婧愮郴缁熴

    @@ -14,7 +14,7 @@ cid: "home"
    -
    +
    images/scalable.png

    鏄熼檯灏哄害

    @@ -22,7 +22,7 @@ cid: "home"
    -
    +
    images/blocks.png

    姘镐笉杩囨椂

    @@ -30,7 +30,7 @@ cid: "home"
    -
    +
    images/suitcase.png

    闅忓杩愯

    From 499ef50c761b7852c9864c38df530625341f1658 Mon Sep 17 00:00:00 2001 From: Zach Corleissen Date: Tue, 13 Nov 2018 10:38:39 +0800 Subject: [PATCH 049/222] Add sprint organizers temporarily to sig-docs-zh-owners (#10972) --- OWNERS_ALIASES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES index 88260d2b75..3d2217fd5f 100644 --- a/OWNERS_ALIASES +++ b/OWNERS_ALIASES @@ -152,6 +152,10 @@ aliases: - gochist - ianychoi sig-docs-zh-owners: #Team Chinese docs localization; GH: sig-docs-zh-owners + - bradtopol + - chenopis + - lucperkins + - zacharysarah - dchen1107 - haibinxie - hanjiayao From 7994529a27a59e13c4c9e7b066b23ab15dd7ac93 Mon Sep 17 00:00:00 2001 From: chenrui Date: Tue, 13 Nov 2018 10:53:39 +0800 Subject: [PATCH 050/222] Create `i18n/zh.toml` (#10975) --- i18n/zh.toml | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 i18n/zh.toml diff --git a/i18n/zh.toml b/i18n/zh.toml new file mode 100644 index 0000000000..71ceda4815 --- /dev/null +++ b/i18n/zh.toml @@ -0,0 +1,82 @@ +# i18n strings for the English (main) site. + +[main_read_about] +other = "Read about" + +[main_read_more] +other = "浜嗚В鏇村" + +[main_github_invite] +other = "鎯宠淇敼 Kubernetes 鐨勬牳蹇冩簮浠g爜" + +[main_github_view_on] +other = "鍦 GitHub 涓婃煡鐪" + +[main_github_create_an_issue] +other = "鍒涘缓 GitHub issue" + +[main_community_explore] +other = "浜嗚В绀惧尯" + +[main_kubernetes_features] +other = "Kubernetes 鐗规" + +[main_cncf_project] +other = """鎴戜滑鏄 CNCF 姣曚笟椤圭洰

    """ + +[main_kubeweekly_signup] +other = "璁㈤槄" + +[main_contribute] +other = "璐$尞" + +[main_edit_this_page] +other = "淇敼鏈〉闈" + +[main_page_history] +other ="椤甸潰鍘嗗彶" + +[main_page_last_modified_on] +other = "椤甸潰鏈鍚庝竴娆′慨鏀逛簬" + +[main_by] +other = "by" + +[main_documentation_license] +other = """The Kubernetes Authors | Documentation Distributed under CC BY 4.0""" + +[main_copyright_notice] +other = """The Linux Foundation ®. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page""" + +# Labels for the docs portal home page. +[docs_label_browse] +other = "鏌ラ槄鏂囨。" + +[docs_label_contributors] +other = "璐$尞鑰" + +[docs_label_users] +other = "鐢ㄦ埛" + +[docs_label_i_am] +other = "鎴戞槸..." + + + +# Community links +[community_twitter_name] +other = "Twitter" +[community_github_name] +other = "GitHub" +[community_slack_name] +other = "Slack" +[community_stack_overflow_name] +other = "Stack Overflow" +[community_forum_name] +other = "Forum" +[community_events_calendar] +other = "Events Calendar" + +# UI elements +[ui_search_placeholder] +other = "鎼滅储" From d95a36a9afc23fd4eaa7b14d8e1c7ed008295941 Mon Sep 17 00:00:00 2001 From: Luc Perkins Date: Tue, 13 Nov 2018 11:31:45 +0800 Subject: [PATCH 051/222] Modify top comment in zh.toml (#10977) --- i18n/zh.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/zh.toml b/i18n/zh.toml index 71ceda4815..079e7dc2f6 100644 --- a/i18n/zh.toml +++ b/i18n/zh.toml @@ -1,4 +1,4 @@ -# i18n strings for the English (main) site. +# i18n strings for the Chinese version of the site (https://kubernetes.io/zh/) [main_read_about] other = "Read about" From 28828ede59ad0b0e4e217cc6c90494b7e9c14d9a Mon Sep 17 00:00:00 2001 From: chenrui Date: Tue, 13 Nov 2018 11:45:24 +0800 Subject: [PATCH 052/222] Add Chinese language alternatives setting (#10976) * Add Chinese language alternatives setting * Add timestamp format (`YYYY-MM-DD`) for the blog Add comment for lang alternative config * Remove comments --- config.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config.toml b/config.toml index 92f1eee421..28c98f51e8 100644 --- a/config.toml +++ b/config.toml @@ -157,3 +157,7 @@ contentDir = "content/no" time_format_blog = "02.01.2006" # A list of language codes to look for untranslated content, ordered from left to right. language_alternatives = ["en"] + +[languages.zh.params] +time_format_blog = "2006.01.02" +language_alternatives = ["en"] From 10cdddada9b178136f4da641e167b5d213566223 Mon Sep 17 00:00:00 2001 From: Zach Corleissen Date: Tue, 13 Nov 2018 16:04:36 +0800 Subject: [PATCH 053/222] Remove shanghai sprint owners (#10973) * Add sprint organizers temporarily to sig-docs-zh-owners * Remove temporary sprint owners From 11b98542965407ff4b341809e5fff0e12992d7c7 Mon Sep 17 00:00:00 2001 From: shavidissa Date: Wed, 14 Nov 2018 06:48:20 +0530 Subject: [PATCH 054/222] Corrected a minor issue in linking to Slack (#10967) The current document had a minor issue: " Ask for sponsorship in the #sig-docs channel on the Kubernetes Slack instance](https://kubernetes.slack.com) " I am assuming you wanted to link #sig-docs channel on the Kubernetes Slack instance to https://kubernetes.slack.com. Therefore, corrected it. --- content/en/docs/contribute/participating.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/contribute/participating.md b/content/en/docs/contribute/participating.md index 1783bd9aac..029f3bf746 100644 --- a/content/en/docs/contribute/participating.md +++ b/content/en/docs/contribute/participating.md @@ -84,7 +84,7 @@ in the Kubernetes organization. Follow these steps: 1. Find two reviewers or approvers to [sponsor](/docs/contribute/advanced#sponsor-a-new-contributor) your membership. - Ask for sponsorship in the #sig-docs channel on the + Ask for sponsorship in the [#sig-docs channel on the Kubernetes Slack instance](https://kubernetes.slack.com) or on the [SIG Docs mailing list](https://groups.google.com/forum/#!forum/kubernetes-sig-docs). From 5992f5180ab824812ac71bef0af9ac5bffe630e6 Mon Sep 17 00:00:00 2001 From: Eyal Levin Date: Wed, 14 Nov 2018 03:24:15 +0200 Subject: [PATCH 055/222] Minor text edit (#10981) Using "The" indicates that the question mark was already discussed previously, which is not the case. --- content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md b/content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md index df359ab7de..364908f01a 100644 --- a/content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md +++ b/content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md @@ -144,7 +144,7 @@ The format also includes extended `vixie cron` step values. As explained in the > asterisk, so if you want to say ``every two hours'', just use ``*/2''. {{< note >}} -The question mark (`?`) in the schedule has the same meaning as an asterisk `*`, that is, it stands for any of available value for a given field. +A question mark (`?`) in the schedule has the same meaning as an asterisk `*`, that is, it stands for any of available value for a given field. {{< /note >}} ### Job Template From 08dc520a41398d3376bfbeed351b6bf7b60e8a3d Mon Sep 17 00:00:00 2001 From: Chao Wang Date: Wed, 14 Nov 2018 09:25:50 +0800 Subject: [PATCH 056/222] remove community.yml (#10955) --- data/imported.yml | 11 ----------- static/_redirects | 5 ----- update-imported-docs/README.md | 2 +- update-imported-docs/community.yml | 14 -------------- 4 files changed, 1 insertion(+), 31 deletions(-) delete mode 100644 data/imported.yml delete mode 100644 update-imported-docs/community.yml diff --git a/data/imported.yml b/data/imported.yml deleted file mode 100644 index dee00131d6..0000000000 --- a/data/imported.yml +++ /dev/null @@ -1,11 +0,0 @@ -bigheader: "Imported Docs" -abstract: "Docs imported from other Kubernetes SIGs and repos." -toc: -- docs/imported/index.md - -- title: Community - section: - - docs/imported/community/guide.md - - docs/imported/community/devel.md - - docs/imported/community/mentoring.md - - docs/imported/community/keps.md diff --git a/static/_redirects b/static/_redirects index ca52e79e85..ad55118a43 100644 --- a/static/_redirects +++ b/static/_redirects @@ -213,11 +213,6 @@ /docs/imported/release/notes/ /docs/setup/release/notes/ 301 -/docs/imported/community/devel/ /docs/community/devel/ 301 -/docs/imported/community/keps/ /docs/commuinty/keps/ 301 -/docs/imported/community/guide/ /docs/community/guide/ 301 -/docs/imported/community/mentoring/ /docs/commuinty/mentoring/ 301 - /docs/reference/deprecation-policy/ /docs/reference/using-api/deprecation-policy/ 301 /docs/reference/federation/v1beta1/definitions/ /docs/reference/federation/extensions/v1beta1/definitions/ 301 /docs/reference/federation/v1beta1/operations/ /docs/reference/federation/extensions/v1beta1/operations/ 301 diff --git a/update-imported-docs/README.md b/update-imported-docs/README.md index ffd0480217..ea1820cf4b 100644 --- a/update-imported-docs/README.md +++ b/update-imported-docs/README.md @@ -65,4 +65,4 @@ given command or a short script to generate the docs from within a repo. To fix relative links within your imported files, set the repo config's `gen-absolute-links` property to `true`. You can find an example of this in -[`community.yml`](community.yml). +[`release.yml`](release.yml). diff --git a/update-imported-docs/community.yml b/update-imported-docs/community.yml deleted file mode 100644 index 9834200093..0000000000 --- a/update-imported-docs/community.yml +++ /dev/null @@ -1,14 +0,0 @@ -repos: -- name: community - remote: https://github.com/kubernetes/community.git - branch: master - gen-absolute-links: true - files: - - src: contributors/devel/README.md - dst: content/en/docs/community/devel.md - - src: contributors/guide/README.md - dst: content/en/docs/community/guide.md - - src: mentoring/README.md - dst: content/en/docs/community/mentoring.md - - src: keps/0001-kubernetes-enhancement-proposal-process.md - dst: content/en/docs/community/keps.md From 08dd5440d758aa3833320a75fbb41ec5f636be26 Mon Sep 17 00:00:00 2001 From: "Chenrui.He" Date: Wed, 14 Nov 2018 09:27:24 +0800 Subject: [PATCH 057/222] To prevent downtime for the api-server, when the two commands are run in far seccession (#10961) --- content/en/docs/setup/independent/high-availability.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/setup/independent/high-availability.md b/content/en/docs/setup/independent/high-availability.md index d88e419269..74beb0aa93 100644 --- a/content/en/docs/setup/independent/high-availability.md +++ b/content/en/docs/setup/independent/high-availability.md @@ -289,9 +289,9 @@ Remember that your config may differ from this example. export CP1_IP=10.0.0.8 export CP1_HOSTNAME=cp1 + kubeadm alpha phase etcd local --config kubeadm-config.yaml export KUBECONFIG=/etc/kubernetes/admin.conf kubectl exec -n kube-system etcd-${CP0_HOSTNAME} -- etcdctl --ca-file /etc/kubernetes/pki/etcd/ca.crt --cert-file /etc/kubernetes/pki/etcd/peer.crt --key-file /etc/kubernetes/pki/etcd/peer.key --endpoints=https://${CP0_IP}:2379 member add ${CP1_HOSTNAME} https://${CP1_IP}:2380 - kubeadm alpha phase etcd local --config kubeadm-config.yaml ``` - This command causes the etcd cluster to become unavailable for a From 76c65a841854fff6d30dc77dba2511143c344dc4 Mon Sep 17 00:00:00 2001 From: June Yi Date: Wed, 14 Nov 2018 10:36:06 +0900 Subject: [PATCH 058/222] Use absolute URLs and avoid aliases in the tutorial (#10924) --- .../tutorials/kubernetes-basics/_index.html | 26 +++++++++---------- .../create-cluster/cluster-interactive.html | 2 +- .../create-cluster/cluster-intro.html | 2 +- .../deploy-app/deploy-interactive.html | 2 +- .../deploy-app/deploy-intro.html | 2 +- .../explore/explore-interactive.html | 2 +- .../explore/explore-intro.html | 4 +-- .../expose/expose-interactive.html | 2 +- .../expose/expose-intro.html | 2 +- .../scale/scale-interactive.html | 2 +- .../kubernetes-basics/scale/scale-intro.html | 2 +- .../update/update-intro.html | 2 +- 12 files changed, 25 insertions(+), 25 deletions(-) diff --git a/content/en/docs/tutorials/kubernetes-basics/_index.html b/content/en/docs/tutorials/kubernetes-basics/_index.html index a609220ff8..39a7f9a56f 100644 --- a/content/en/docs/tutorials/kubernetes-basics/_index.html +++ b/content/en/docs/tutorials/kubernetes-basics/_index.html @@ -45,25 +45,25 @@ weight: 10
    @@ -73,25 +73,25 @@ weight: 10
    @@ -102,7 +102,7 @@ weight: 10 diff --git a/content/en/docs/tutorials/kubernetes-basics/create-cluster/cluster-interactive.html b/content/en/docs/tutorials/kubernetes-basics/create-cluster/cluster-interactive.html index 345ea02669..7cd1ce456b 100644 --- a/content/en/docs/tutorials/kubernetes-basics/create-cluster/cluster-interactive.html +++ b/content/en/docs/tutorials/kubernetes-basics/create-cluster/cluster-interactive.html @@ -25,7 +25,7 @@ weight: 20
    diff --git a/content/en/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro.html b/content/en/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro.html index 61048abee3..11b790a4ce 100644 --- a/content/en/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro.html +++ b/content/en/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro.html @@ -96,7 +96,7 @@ weight: 10 diff --git a/content/en/docs/tutorials/kubernetes-basics/deploy-app/deploy-interactive.html b/content/en/docs/tutorials/kubernetes-basics/deploy-app/deploy-interactive.html index 1906fe2040..7636f8ea94 100644 --- a/content/en/docs/tutorials/kubernetes-basics/deploy-app/deploy-interactive.html +++ b/content/en/docs/tutorials/kubernetes-basics/deploy-app/deploy-interactive.html @@ -29,7 +29,7 @@ weight: 20
    diff --git a/content/en/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro.html b/content/en/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro.html index c0108fa9c0..5b52ad102b 100644 --- a/content/en/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro.html +++ b/content/en/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro.html @@ -103,7 +103,7 @@ weight: 10 diff --git a/content/en/docs/tutorials/kubernetes-basics/explore/explore-interactive.html b/content/en/docs/tutorials/kubernetes-basics/explore/explore-interactive.html index 1677c8fcfa..ac23bbf61b 100644 --- a/content/en/docs/tutorials/kubernetes-basics/explore/explore-interactive.html +++ b/content/en/docs/tutorials/kubernetes-basics/explore/explore-interactive.html @@ -29,7 +29,7 @@ weight: 20
    diff --git a/content/en/docs/tutorials/kubernetes-basics/explore/explore-intro.html b/content/en/docs/tutorials/kubernetes-basics/explore/explore-intro.html index 094636f039..ea4404b9d6 100644 --- a/content/en/docs/tutorials/kubernetes-basics/explore/explore-intro.html +++ b/content/en/docs/tutorials/kubernetes-basics/explore/explore-intro.html @@ -108,7 +108,7 @@ weight: 10

    Troubleshooting with kubectl

    -

    In Module 2, you used Kubectl command-line interface. You'll continue to use it in Module 3 to get information about deployed applications and their environments. The most common operations can be done with the following kubectl commands:

    +

    In Module 2, you used Kubectl command-line interface. You'll continue to use it in Module 3 to get information about deployed applications and their environments. The most common operations can be done with the following kubectl commands:

    • kubectl get - list resources
    • kubectl describe - show detailed information about a resource
    • @@ -131,7 +131,7 @@ weight: 10 diff --git a/content/en/docs/tutorials/kubernetes-basics/expose/expose-interactive.html b/content/en/docs/tutorials/kubernetes-basics/expose/expose-interactive.html index c467e38d8d..9e1605c518 100644 --- a/content/en/docs/tutorials/kubernetes-basics/expose/expose-interactive.html +++ b/content/en/docs/tutorials/kubernetes-basics/expose/expose-interactive.html @@ -26,7 +26,7 @@ weight: 20
    diff --git a/content/en/docs/tutorials/kubernetes-basics/expose/expose-intro.html b/content/en/docs/tutorials/kubernetes-basics/expose/expose-intro.html index c9258ba4ba..27f36adaf5 100644 --- a/content/en/docs/tutorials/kubernetes-basics/expose/expose-intro.html +++ b/content/en/docs/tutorials/kubernetes-basics/expose/expose-intro.html @@ -104,7 +104,7 @@ weight: 10
    diff --git a/content/en/docs/tutorials/kubernetes-basics/scale/scale-interactive.html b/content/en/docs/tutorials/kubernetes-basics/scale/scale-interactive.html index a1ff2f35e3..8c6da7c579 100644 --- a/content/en/docs/tutorials/kubernetes-basics/scale/scale-interactive.html +++ b/content/en/docs/tutorials/kubernetes-basics/scale/scale-interactive.html @@ -26,7 +26,7 @@ weight: 20
  • diff --git a/content/en/docs/tutorials/kubernetes-basics/scale/scale-intro.html b/content/en/docs/tutorials/kubernetes-basics/scale/scale-intro.html index 0b4191e15b..18773dc6bc 100644 --- a/content/en/docs/tutorials/kubernetes-basics/scale/scale-intro.html +++ b/content/en/docs/tutorials/kubernetes-basics/scale/scale-intro.html @@ -109,7 +109,7 @@ weight: 10 diff --git a/content/en/docs/tutorials/kubernetes-basics/update/update-intro.html b/content/en/docs/tutorials/kubernetes-basics/update/update-intro.html index 9db375508f..211c8d550d 100644 --- a/content/en/docs/tutorials/kubernetes-basics/update/update-intro.html +++ b/content/en/docs/tutorials/kubernetes-basics/update/update-intro.html @@ -125,7 +125,7 @@ weight: 10 From 2f3cf662b1f97c271335e0777471283c52d4f63d Mon Sep 17 00:00:00 2001 From: Daniel M Barlow Date: Wed, 14 Nov 2018 02:37:41 +0100 Subject: [PATCH 059/222] Rename 'Reusing Docker' section (#10885) May make it easier to see the importance of this section --- content/en/docs/setup/minikube.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/setup/minikube.md b/content/en/docs/setup/minikube.md index aa2143e4c3..418c4944b9 100644 --- a/content/en/docs/setup/minikube.md +++ b/content/en/docs/setup/minikube.md @@ -169,7 +169,7 @@ This will use an alternative minikube ISO image containing both rkt, and Docker, See [DRIVERS](https://git.k8s.io/minikube/docs/drivers.md) for details on supported drivers and how to install plugins, if required. -### Reusing the Docker daemon +### Use local images by re-using the Docker daemon When using a single VM of Kubernetes, it's really handy to reuse the Minikube's built-in Docker daemon; as this means you don't have to build a docker registry on your host machine and push the image into it - you can just build inside the same docker daemon as minikube which speeds up local experiments. Just make sure you tag your Docker image with something other than 'latest' and use that tag while you pull the image. Otherwise, if you do not specify version of your image, it will be assumed as `:latest`, with pull image policy of `Always` correspondingly, which may eventually result in `ErrImagePull` as you may not have any versions of your Docker image out there in the default docker registry (usually DockerHub) yet. From 7975b282da40a50889aaec7bc4655f3fc9f50e1d Mon Sep 17 00:00:00 2001 From: William Zhang Date: Wed, 14 Nov 2018 09:39:15 +0800 Subject: [PATCH 060/222] Fix the link to repo kubernetes/cloud-provider (#10912) Signed-off-by: William Zhang --- .../administer-cluster/developing-cloud-controller-manager.md | 4 ++-- .../docs/tasks/administer-cluster/running-cloud-controller.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/content/en/docs/tasks/administer-cluster/developing-cloud-controller-manager.md b/content/en/docs/tasks/administer-cluster/developing-cloud-controller-manager.md index 6f0eaf9662..f533c80869 100644 --- a/content/en/docs/tasks/administer-cluster/developing-cloud-controller-manager.md +++ b/content/en/docs/tasks/administer-cluster/developing-cloud-controller-manager.md @@ -16,9 +16,9 @@ can develop their features independently from the core Kubernetes release cycles {{< feature-state for_k8s_version="1.8" state="alpha" >}} -Before going into how to build your own cloud controller manager, some background on how it works under the hood is helpful. The cloud controller manager is code from `kube-controller-manager` utilizing Go interfaces to allow implementations from any cloud to be plugged in. Most of the scaffolding and generic controller implementations will be in core, but it will always exec out to the cloud interfaces it is provided, so long as the [cloud provider interface](https://github.com/kubernetes/kubernetes/blob/master/pkg/cloudprovider/cloud.go#L29-L50) is satisfied. +Before going into how to build your own cloud controller manager, some background on how it works under the hood is helpful. The cloud controller manager is code from `kube-controller-manager` utilizing Go interfaces to allow implementations from any cloud to be plugged in. Most of the scaffolding and generic controller implementations will be in core, but it will always exec out to the cloud interfaces it is provided, so long as the [cloud provider interface](https://github.com/kubernetes/cloud-provider/blob/master/cloud.go#L42-L62) is satisfied. -To dive a little deeper into implementation details, all cloud controller managers will import packages from Kubernetes core, the only difference being each project will register their own cloud providers by calling [cloudprovider.RegisterCloudProvider](https://github.com/kubernetes/kubernetes/blob/master/pkg/cloudprovider/plugins.go#L42-L52) where a global variable of available cloud providers is updated. +To dive a little deeper into implementation details, all cloud controller managers will import packages from Kubernetes core, the only difference being each project will register their own cloud providers by calling [cloudprovider.RegisterCloudProvider](https://github.com/kubernetes/cloud-provider/blob/master/plugins.go#L56-L66) where a global variable of available cloud providers is updated. {{% /capture %}} diff --git a/content/en/docs/tasks/administer-cluster/running-cloud-controller.md b/content/en/docs/tasks/administer-cluster/running-cloud-controller.md index 3abad0465b..e84a5a2813 100644 --- a/content/en/docs/tasks/administer-cluster/running-cloud-controller.md +++ b/content/en/docs/tasks/administer-cluster/running-cloud-controller.md @@ -13,7 +13,7 @@ content_template: templates/concept Kubernetes v1.6 introduced a new binary called `cloud-controller-manager`. `cloud-controller-manager` is a daemon that embeds cloud-specific control loops. These cloud-specific control loops were originally in the `kube-controller-manager`. Since cloud providers develop and release at a different pace compared to the Kubernetes project, abstracting the provider-specific code to the `cloud-controller-manager` binary allows cloud vendors to evolve independently from the core Kubernetes code. -The `cloud-controller-manager` can be linked to any cloud provider that satisfies [cloudprovider.Interface](https://git.k8s.io/kubernetes/pkg/cloudprovider/cloud.go). For backwards compatibility, the [cloud-controller-manager](https://github.com/kubernetes/kubernetes/tree/master/cmd/cloud-controller-manager) provided in the core Kubernetes project uses the same cloud libraries as `kube-controller-manager`. Cloud providers already supported in Kubernetes core are expected to use the in-tree cloud-controller-manager to transition out of Kubernetes core. In future Kubernetes releases, all cloud controller managers will be developed outside of the core Kubernetes project managed by sig leads or cloud vendors. +The `cloud-controller-manager` can be linked to any cloud provider that satisfies [cloudprovider.Interface](https://github.com/kubernetes/cloud-provider/blob/master/cloud.go). For backwards compatibility, the [cloud-controller-manager](https://github.com/kubernetes/kubernetes/tree/master/cmd/cloud-controller-manager) provided in the core Kubernetes project uses the same cloud libraries as `kube-controller-manager`. Cloud providers already supported in Kubernetes core are expected to use the in-tree cloud-controller-manager to transition out of Kubernetes core. In future Kubernetes releases, all cloud controller managers will be developed outside of the core Kubernetes project managed by sig leads or cloud vendors. {{% /capture %}} From 8359d2013c3c5d075cacdaaf0de05d9dc314132b Mon Sep 17 00:00:00 2001 From: Kenichi Omichi Date: Tue, 13 Nov 2018 17:40:50 -0800 Subject: [PATCH 061/222] Remove unnecessary kubelet as upgraded package (#10941) The first step of [1], kubeadm is necessary to be upgraded because we need to run kubeadm upgrade plan. Then, the line shows `upgrade kubeadm:`. However, the commandline contains kubelet also. That seens copy&paste mistake and unnecessary. This removes it. In addition, the format of another tab is broken. This fixes it also by naming another tab. [1]: https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-1-12/#upgrade-the-control-plane --- .../administer-cluster/kubeadm/kubeadm-upgrade-1-12.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-1-12.md b/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-1-12.md index 6be3b687bf..934717cd91 100644 --- a/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-1-12.md +++ b/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-1-12.md @@ -40,13 +40,13 @@ This page explains how to upgrade a Kubernetes cluster created with `kubeadm` fr {{< tabs name="k8s_install" >}} {{% tab name="Ubuntu, Debian or HypriotOS" %}} apt-get update - apt-get upgrade -y kubelet kubeadm + apt-get upgrade -y kubeadm {{% /tab %}} {{% tab name="CentOS, RHEL or Fedora" %}} yum upgrade -y kubeadm --disableexcludes=kubernetes {{% /tab %}} {{< /tabs >}} - + 1. Verify that the download works and has the expected version: ```shell @@ -227,7 +227,7 @@ This page explains how to upgrade a Kubernetes cluster created with `kubeadm` fr 1. Upgrade the Kubernetes package version on each `$NODE` node by running the Linux package manager for your distribution: - {{< tabs name="k8s_install" >}} + {{< tabs name="k8s_upgrade" >}} {{% tab name="Ubuntu, Debian or HypriotOS" %}} apt-get update apt-get upgrade -y kubelet kubeadm From f15d772569c0dbec691dbff2270751fb38ade8ea Mon Sep 17 00:00:00 2001 From: Pingan Date: Wed, 14 Nov 2018 09:42:24 +0800 Subject: [PATCH 062/222] Mark rkt as deprecated in kubelet flags(--container-runtime) (#10895) --- .../en/docs/reference/command-line-tools-reference/kubelet.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/reference/command-line-tools-reference/kubelet.md b/content/en/docs/reference/command-line-tools-reference/kubelet.md index de1111982f..8002767a65 100644 --- a/content/en/docs/reference/command-line-tools-reference/kubelet.md +++ b/content/en/docs/reference/command-line-tools-reference/kubelet.md @@ -244,7 +244,7 @@ kubelet [flags] --container-runtime string - The container runtime to use. Possible values: 'docker', 'rkt'. (default "docker") + The container runtime to use. Possible values: 'docker', 'remote', 'rkt(deprecated)'. (default "docker") @@ -286,7 +286,7 @@ kubelet [flags] --cpu-manager-policy string - CPU Manager policy to use. Possible values: 'none', 'static'. Default: 'none' (default "none") + CPU Manager policy to use. Possible values: 'none', 'static'. (default "none") From 420685b9761d901faa4f18f9745de06b10600727 Mon Sep 17 00:00:00 2001 From: Patrick Lang Date: Tue, 13 Nov 2018 17:43:59 -0800 Subject: [PATCH 063/222] Fix Makefile and README for make docker-serve on Windows (#10810) --- Makefile | 2 +- README.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 366671f09f..aaa092ba10 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ DOCKER = docker HUGO_VERSION = 0.49 DOCKER_IMAGE = kubernetes-hugo -DOCKER_RUN = $(DOCKER) run --rm --interactive --tty --volume $(PWD):/src +DOCKER_RUN = $(DOCKER) run --rm --interactive --tty --volume $(CURDIR):/src NODE_BIN = node_modules/.bin NETLIFY_FUNC = $(NODE_BIN)/netlify-lambda diff --git a/README.md b/README.md index 9824646028..e27e13a492 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ For more information about contributing to the Kubernetes documentation, see: The recommended way to run the Kubernetes website locally is to run a specialized [Docker](https://docker.com) image that includes the [Hugo](https://gohugo.io) static site generator. +> If you are running on Windows, you'll need a few more tools which you can install with [Chocolatey](https://chocolatey.org). `choco install make` + > If you'd prefer to run the website locally without Docker, see [Running the site locally using Hugo](#running-the-site-locally-using-hugo) below. If you have Docker [up and running](https://www.docker.com/get-started), build the `kubernetes-hugo` Docker image locally: From 4514602b29eadad9cd37245010e4c49daa789d27 Mon Sep 17 00:00:00 2001 From: erganzi <41982810+erganzi@users.noreply.github.com> Date: Wed, 14 Nov 2018 10:04:23 +0800 Subject: [PATCH 064/222] Update debug-service.md (#10760) -q is quiet, nothing will output. --- .../en/docs/tasks/debug-application-cluster/debug-service.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/content/en/docs/tasks/debug-application-cluster/debug-service.md b/content/en/docs/tasks/debug-application-cluster/debug-service.md index 3ca54205b9..29a3cb047b 100644 --- a/content/en/docs/tasks/debug-application-cluster/debug-service.md +++ b/content/en/docs/tasks/debug-application-cluster/debug-service.md @@ -126,8 +126,9 @@ have another `Pod` that consumes this `Service` by name you would get something like: ```shell -u@pod$ wget -qO- hostnames -wget: bad address 'hostname' +u@pod$ wget -O- hostnames +Resolving hostnames (hostnames)... failed: Name or service not known. +wget: unable to resolve host address 'hostnames' ``` So the first thing to check is whether that `Service` actually exists: From b38adb00751c7a19dcd4b21e59f707fd57931ae4 Mon Sep 17 00:00:00 2001 From: Karen Bradshaw Date: Wed, 14 Nov 2018 17:25:39 -0500 Subject: [PATCH 065/222] update, remove third party resource links (#11001) --- .../extend-kubernetes/api-extension/custom-resources.md | 8 ++++---- .../custom-resources/custom-resource-definitions.md | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md b/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md index 750f19361e..3e0c5ba392 100644 --- a/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md +++ b/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md @@ -240,9 +240,9 @@ When you add a custom resource, you can access it using: {{% /capture %}} {{% capture whatsnext %}} -* Learn how to [Extend the Kubernetes API with the aggregation layer](/docs/concepts/api-extension/apiserver-aggregation/). -* Learn how to [Extend the Kubernetes API with CustomResourceDefinition](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/). -* Learn how to [Migrate a ThirdPartyResource to CustomResourceDefinition](/docs/tasks/access-kubernetes-api/migrate-third-party-resource/). -{{% /capture %}} +* Learn how to [Extend the Kubernetes API with the aggregation layer](/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/). +* Learn how to [Extend the Kubernetes API with CustomResourceDefinition](/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/). + +{{% /capture %}} \ No newline at end of file diff --git a/content/en/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions.md b/content/en/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions.md index 887bc30552..93478fb7d8 100644 --- a/content/en/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions.md +++ b/content/en/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions.md @@ -686,8 +686,10 @@ crontabs/my-new-cron-object 3s {{% /capture %}} {{% capture whatsnext %}} -* Learn how to [Migrate a ThirdPartyResource to CustomResourceDefinition](/docs/tasks/access-kubernetes-api/migrate-third-party-resource/). + * See [CustomResourceDefinition](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#customresourcedefinition-v1beta1-apiextensions-k8s-io). + * Serve [multiple versions](/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definition-versioning/) of a - CustomResourceDefinition + CustomResourceDefinition. + {{% /capture %}} From cb11cce55c67c3fe8a4daca0569f53864167e230 Mon Sep 17 00:00:00 2001 From: Nikhita Raghunath Date: Thu, 15 Nov 2018 03:57:09 +0530 Subject: [PATCH 066/222] Update current state of features for custom resources (#10994) --- .../extend-kubernetes/api-extension/custom-resources.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md b/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md index 3e0c5ba392..5eabfb07a1 100644 --- a/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md +++ b/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md @@ -171,13 +171,13 @@ Aggregated APIs offer more advanced API features and customization of other feat | ------- | ----------- | ---- | -------------- | | Validation | Help users prevent errors and allow you to evolve your API independently of your clients. These features are most useful when there are many clients who can't all update at the same time. | Yes. Most validation can be specified in the CRD using [OpenAPI v3.0 validation](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#validation). Any other validations supported by addition of a [Validating Webhook](/docs/reference/access-authn-authz/admission-controllers/#validatingadmissionwebhook-alpha-in-1-8-beta-in-1-9). | Yes, arbitrary validation checks | | Defaulting | See above | Yes, via a [Mutating Webhook](/docs/reference/access-authn-authz/admission-controllers/#mutatingadmissionwebhook-beta-in-1-9); Planned, via CRD OpenAPI schema. | Yes | -| Multi-versioning | Allows serving the same object through two API versions. Can help ease API changes like renaming fields. Less important if you control your client versions. | No, but planned | Yes | +| Multi-versioning | Allows serving the same object through two API versions. Can help ease API changes like renaming fields. Less important if you control your client versions. | [Yes](/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definition-versioning) | Yes | | Custom Storage | If you need storage with a different performance mode (for example, time-series database instead of key-value store) or isolation for security (for example, encryption secrets or different | No | Yes | | Custom Business Logic | Perform arbitrary checks or actions when creating, reading, updating or deleting an object | Yes, using [Webhooks](/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks). | Yes | | Scale Subresource | Allows systems like HorizontalPodAutoscaler and PodDisruptionBudget interact with your new resource | [Yes](https://kubernetes.io/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#scale-subresource) | Yes | | Status Subresource |
    • Finer-grained access control: user writes spec section, controller writes status section.
    • Allows incrementing object Generation on custom resource data mutation (requires separate spec and status sections in the resource)
    | [Yes](https://kubernetes.io/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#status-subresource) | Yes | | Other Subresources | Add operations other than CRUD, such as "logs" or "exec". | No | Yes | -| strategic-merge-patch | The new endpoints support PATCH with `Content-Type: application/strategic-merge-patch+json`. Useful for updating objects that may be modified both locally, and by the server. For more information, see ["Update API Objects in Place Using kubectl patch"](/docs/tasks/run-application/update-api-object-kubectl-patch/) | No, but similar functionality planned | Yes | +| strategic-merge-patch | The new endpoints support PATCH with `Content-Type: application/strategic-merge-patch+json`. Useful for updating objects that may be modified both locally, and by the server. For more information, see ["Update API Objects in Place Using kubectl patch"](/docs/tasks/run-application/update-api-object-kubectl-patch/) | No | Yes | | Protocol Buffers | The new resource supports clients that want to use Protocol Buffers | No | Yes | | OpenAPI Schema | Is there an OpenAPI (swagger) schema for the types that can be dynamically fetched from the server? Is the user protected from misspelling field names by ensuring only allowed fields are set? Are types enforced (in other words, don't put an `int` in a `string` field?) | No, but planned | Yes | From 8879db8080cfa42b75dc27821848056545fa4745 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Aillet Date: Wed, 14 Nov 2018 23:28:39 +0100 Subject: [PATCH 067/222] Add Container lifecycle hooks to glossary (#10984) * Add Container lifecycle hooks to glossary * Add container definition tooltip * Fixes after review --- .../glossary/container-lifecycle-hooks.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 content/en/docs/reference/glossary/container-lifecycle-hooks.md diff --git a/content/en/docs/reference/glossary/container-lifecycle-hooks.md b/content/en/docs/reference/glossary/container-lifecycle-hooks.md new file mode 100644 index 0000000000..527e2f3e6e --- /dev/null +++ b/content/en/docs/reference/glossary/container-lifecycle-hooks.md @@ -0,0 +1,18 @@ +--- +title: Container Lifecycle Hooks +id: container-lifecycle-hooks +date: 2018-10-08 +full_link: /docs/concepts/containers/container-lifecycle-hooks/ +short_description: > + The lifecycle hooks expose events in the container management lifecycle and let the user run code when the events occur. + +aka: +tags: +- extension +--- + The lifecycle hooks expose events in the {{< glossary_tooltip text="Container" term_id="container" >}}container management lifecycle and let the user run code when the events occur. + + + +Two hooks are exposed to Containers: PostStart which executes immediately after a container is created and PreStop which is blocking and is called immediately before a container is terminated. + From cb8aae1b0dbeb6a75e7f735dceb4e762232ffa45 Mon Sep 17 00:00:00 2001 From: Indradhanush Gupta Date: Wed, 14 Nov 2018 14:34:12 -0800 Subject: [PATCH 068/222] Fix instructions to start minikube with RBAC (#11002) When starting minikube with `--extra-config=apiserver.Authorization.Mode=RBAC`, the apiserver container exits with the following error: ``` error: unknown flag: --Authorization.Mode ``` Starting it with `--extra-config=apiserver.authorization-mode=RBAC` instead fixes the issue. --- content/en/docs/setup/minikube.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/setup/minikube.md b/content/en/docs/setup/minikube.md index 418c4944b9..7f1cc4e4b8 100644 --- a/content/en/docs/setup/minikube.md +++ b/content/en/docs/setup/minikube.md @@ -258,7 +258,7 @@ To change the `MaxPods` setting to 5 on the Kubelet, pass this flag: `--extra-co This feature also supports nested structs. To change the `LeaderElection.LeaderElect` setting to `true` on the scheduler, pass this flag: `--extra-config=scheduler.LeaderElection.LeaderElect=true`. -To set the `AuthorizationMode` on the `apiserver` to `RBAC`, you can use: `--extra-config=apiserver.Authorization.Mode=RBAC`. +To set the `AuthorizationMode` on the `apiserver` to `RBAC`, you can use: `--extra-config=apiserver.authorization-mode=RBAC`. ### Stopping a Cluster The `minikube stop` command can be used to stop your cluster. From ccac3c19b851d9da8c18dbd1d6d75ece2e4faea0 Mon Sep 17 00:00:00 2001 From: Karen Bradshaw Date: Wed, 14 Nov 2018 17:59:56 -0500 Subject: [PATCH 069/222] clean up conventions toc (#10939) - clean up toc - update with a table --- .../en/docs/reference/kubectl/conventions.md | 40 ++++++++++++------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/content/en/docs/reference/kubectl/conventions.md b/content/en/docs/reference/kubectl/conventions.md index 47890bf6fc..3e6f2d4c99 100644 --- a/content/en/docs/reference/kubectl/conventions.md +++ b/content/en/docs/reference/kubectl/conventions.md @@ -3,17 +3,22 @@ title: kubectl Usage Conventions reviewers: - bgrant0607 - janetkuo +content_template: templates/concept --- -{{< toc >}} +{{% capture overview %}} +Recommended usage conventions for `kubectl`. +{{% /capture %}} + +{{% capture body %}} ## Using `kubectl` in Reusable Scripts For a stable output in a script: -* Request one of the machine-oriented output forms, such as `-o name`, `-o json`, `-o yaml`, `-o go-template`, or `-o jsonpath` +* Request one of the machine-oriented output forms, such as `-o name`, `-o json`, `-o yaml`, `-o go-template`, or `-o jsonpath`. * Fully-qualify the version. For example, `jobs.v1.batch/myjob`. This will ensure that kubectl does not use its default version that can change over time. -* Specify `--generator` to pin to a specific behavior forever when you use generator-based commands such as `kubectl run` or `kubectl expose` +* Specify the `--generator` flag to pin to a specific behavior when you use generator-based commands such as `kubectl run` or `kubectl expose`. * Don't rely on context, preferences, or other implicit states. ## Best Practices @@ -30,15 +35,21 @@ For `kubectl run` to satisfy infrastructure as code: #### Generators -You can generate the following resources in `kubectl run`using `--generator` flag: +You can create the following resources using `kubectl run` with the `--generator` flag: -* Pod - use `run-pod/v1`. -* Replication controller - use `run/v1`. -* Deployment - use `extensions/v1beta1` and for an endpoint - use `deployment/v1beta1` (default). -* Deployment - use `apps/v1beta1` and for an endpoint - use `deployment/apps.v1beta1` (recommended). -* Job - use `job/v1`. -* CronJob - use `batch/v1beta1`and for an endpoint - use `cronjob/v1beta1`(default). -* CronJob - use`batch/v2alpha1` and for an endpoint - use `cronjob/v2alpha1` (deprecated). +| Resource | kubectl command | +|---------------------------------|---------------------------------------------------| +| Pod | `kubectl run --generator=run-pod/v1` | +| Replication controller | `kubectl run --generator=run/v1` | +| Deployment | `kubectl run --generator=extensions/v1beta1` | +| -for an endpoint (default) | `kubectl run --generator=deployment/v1beta1` | +| Deployment | `kubectl run --generator=apps/v1beta1` | +| -for an endpoint (recommended) | `kubectl run --generator=deployment/apps.v1beta1` | +| Job | `kubectl run --generator=job/v1` | +| CronJob | `kubectl run --generator=batch/v1beta1` | +| -for an endpoint (default) | `kubectl run --generator=cronjob/v1beta1` | +| CronJob | `kubectl run --generator=batch/v2alpha1` | +| -for an endpoint (deprecated) | `kubectl run --generator=cronjob/v2alpha1` | If you do not specify a generator flag, other flags prompt you to use a specific generator. The following table lists the flags that force you to use specific generators, depending on the version of the cluster: @@ -59,12 +70,13 @@ This enables you to pin to a specific behavior with the generator, even when the default generator is changed later. {{< /note >}} -The flags set the generator in the following order: first the schedule flag then restart policy and finally the generator. +The flags set the generator in the following order: first the `--schedule` flag, then the `--restart` policy flag, and finally the `--generator` flag. -To check the final resource that was created, use `--dry-run` +To check the final resource that was created, use the `--dry-run` flag, which provides the object to be submitted to the cluster. - ### `kubectl apply` * You can use `kubectl apply` to create or update resources. However, to update a resource you should have created the resource by using `kubectl apply` or `kubectl create --save-config`. For more information about using kubectl apply to update resources, see [Managing Resources](/docs/concepts/cluster-administration/manage-deployment/#kubectl-apply). + +{{% /capture %}} \ No newline at end of file From 73190caecac87182bceb8b163080e465e08a808e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Este-Gracias?= Date: Thu, 15 Nov 2018 01:14:02 +0100 Subject: [PATCH 070/222] Fix typo (#10993) --- content/en/docs/concepts/workloads/controllers/deployment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/workloads/controllers/deployment.md b/content/en/docs/concepts/workloads/controllers/deployment.md index 3a2455c930..80c81863c4 100644 --- a/content/en/docs/concepts/workloads/controllers/deployment.md +++ b/content/en/docs/concepts/workloads/controllers/deployment.md @@ -78,7 +78,7 @@ kubectl create -f https://k8s.io/examples/controllers/nginx-deployment.yaml ``` {{< note >}} -You may specify the `--record` flag to write the command executed in the resource annotation `kubernetes.io/change-cause`. It is useful for future instrospection, for example to see the commands executed in each Deployment revision. +You may specify the `--record` flag to write the command executed in the resource annotation `kubernetes.io/change-cause`. It is useful for future introspection, for example to see the commands executed in each Deployment revision. {{< /note >}} Next, run `kubectl get deployments`. The output is similar to the following: From d9cfd8b6f3049c07eb8dcb37e86ba5bafa9bcf9e Mon Sep 17 00:00:00 2001 From: Mumshad Mannambeth Date: Thu, 15 Nov 2018 09:15:14 +0800 Subject: [PATCH 071/222] Add KodeKloud online training for CKAD Preparation course (#10991) * Add KodeKloud online training * Add KodeKloud online training --- content/en/docs/tutorials/online-training/overview.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/en/docs/tutorials/online-training/overview.md b/content/en/docs/tutorials/online-training/overview.md index e82722fbd2..99f7d748ae 100644 --- a/content/en/docs/tutorials/online-training/overview.md +++ b/content/en/docs/tutorials/online-training/overview.md @@ -25,6 +25,8 @@ Here are some of the sites that offer online training for Kubernetes: * [Kubernetes the Hard Way (LinuxAcademy.com)](https://linuxacademy.com/linux/training/course/name/kubernetes-the-hard-way) +* [Certified Kubernetes Application Developer Preparation Course (KodeKloud.com)](https://kodekloud.com/p/kubernetes-certification-course) + {{% /capture %}} From 4f1198c270210ab42363ed320f053c79561111c0 Mon Sep 17 00:00:00 2001 From: shavidissa Date: Thu, 15 Nov 2018 06:46:48 +0530 Subject: [PATCH 072/222] Minor change (#10990) Minor typo: Content template to concept template. --- content/en/docs/contribute/style/page-templates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/contribute/style/page-templates.md b/content/en/docs/contribute/style/page-templates.md index e8563eae52..7c2229ad99 100644 --- a/content/en/docs/contribute/style/page-templates.md +++ b/content/en/docs/contribute/style/page-templates.md @@ -75,7 +75,7 @@ To write a new concept page, create a Markdown file in a subdirectory of the An example of a published topic that uses the concept template is [Annotations](/docs/concepts/overview/working-with-objects/annotations/). The -page you are currently reading also uses the content template. +page you are currently reading also uses the concept template. ## Task template From 3d8f4a2e73a5dea758af1acc42c12d0986652e23 Mon Sep 17 00:00:00 2001 From: Jay Date: Wed, 14 Nov 2018 17:39:18 -0800 Subject: [PATCH 073/222] Kubernetes Repository URL HTTPS (#10983) --- content/en/docs/tasks/tools/install-kubectl.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/tasks/tools/install-kubectl.md b/content/en/docs/tasks/tools/install-kubectl.md index 165c6e1586..b5151a4d2e 100644 --- a/content/en/docs/tasks/tools/install-kubectl.md +++ b/content/en/docs/tasks/tools/install-kubectl.md @@ -28,7 +28,7 @@ Here are a few methods to install kubectl. {{< tab name="Ubuntu, Debian or HypriotOS" codelang="bash" >}} sudo apt-get update && sudo apt-get install -y apt-transport-https curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - -echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list +echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list sudo apt-get update sudo apt-get install -y kubectl {{< /tab >}} From d69f6b23535d3f1575b9da842e9e6d2a790fd412 Mon Sep 17 00:00:00 2001 From: nepomucen Date: Thu, 15 Nov 2018 02:45:18 +0100 Subject: [PATCH 074/222] Fix missing selector subcommand (#10982) For accuracy the second command "kubectl set" in the pipeline under the example`s breakdown should contain subcommand: selector --- .../overview/object-management-kubectl/imperative-command.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/overview/object-management-kubectl/imperative-command.md b/content/en/docs/concepts/overview/object-management-kubectl/imperative-command.md index d0cbe8c839..38b194d2a4 100644 --- a/content/en/docs/concepts/overview/object-management-kubectl/imperative-command.md +++ b/content/en/docs/concepts/overview/object-management-kubectl/imperative-command.md @@ -136,7 +136,7 @@ kubectl create service clusterip my-svc --clusterip="None" -o yaml --dry-run | k ``` 1. The `kubectl create service -o yaml --dry-run` command creates the configuration for the Service, but prints it to stdout as YAML instead of sending it to the Kubernetes API server. -1. The `kubectl set --local -f - -o yaml` command reads the configuration from stdin, and writes the updated configuration to stdout as YAML. +1. The `kubectl set selector --local -f - -o yaml` command reads the configuration from stdin, and writes the updated configuration to stdout as YAML. 1. The `kubectl create -f -` command creates the object using the configuration provided via stdin. ## Using `--edit` to modify objects before creation From ecfdcf643fea76e889ac8cb99ac394184b026102 Mon Sep 17 00:00:00 2001 From: hintss Date: Wed, 14 Nov 2018 18:01:44 -0800 Subject: [PATCH 075/222] Fix 3 links that were pointing at blog.kubernetes.io (#10731) * fix 3 links that were pointing at the old blog URL * Fix the 4th blog link --- content/en/blog/_posts/2018-07-18-11-ways-not-to-get-hacked.md | 2 +- content/en/docs/concepts/workloads/pods/pod-overview.md | 2 +- .../services-networking/connect-applications-service.md | 2 +- .../communicate-containers-same-pod-shared-volume.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/en/blog/_posts/2018-07-18-11-ways-not-to-get-hacked.md b/content/en/blog/_posts/2018-07-18-11-ways-not-to-get-hacked.md index b88fcc0c18..36e12c87fe 100644 --- a/content/en/blog/_posts/2018-07-18-11-ways-not-to-get-hacked.md +++ b/content/en/blog/_posts/2018-07-18-11-ways-not-to-get-hacked.md @@ -50,7 +50,7 @@ Autoscaling Kubernetes nodes was historically difficult, as each node requires a -Kubernetes' ABAC (Attribute Based Access Control) has been [superseded by RBAC](http://blog.kubernetes.io/2017/04/rbac-support-in-kubernetes.html) since release 1.6, and should not be enabled on the API server. Use RBAC instead: +Kubernetes' ABAC (Attribute Based Access Control) has been [superseded by RBAC](http://kubernetes.io/blog/2017/04/rbac-support-in-kubernetes.html) since release 1.6, and should not be enabled on the API server. Use RBAC instead: ``` --authorization-mode=RBAC diff --git a/content/en/docs/concepts/workloads/pods/pod-overview.md b/content/en/docs/concepts/workloads/pods/pod-overview.md index 97efcb8c8c..8bb3f68504 100644 --- a/content/en/docs/concepts/workloads/pods/pod-overview.md +++ b/content/en/docs/concepts/workloads/pods/pod-overview.md @@ -25,7 +25,7 @@ Pods in a Kubernetes cluster can be used in two main ways: * **Pods that run a single container**. The "one-container-per-Pod" model is the most common Kubernetes use case; in this case, you can think of a Pod as a wrapper around a single container, and Kubernetes manages the Pods rather than the containers directly. * **Pods that run multiple containers that need to work together**. A Pod might encapsulate an application composed of multiple co-located containers that are tightly coupled and need to share resources. These co-located containers might form a single cohesive unit of service--one container serving files from a shared volume to the public, while a separate "sidecar" container refreshes or updates those files. The Pod wraps these containers and storage resources together as a single manageable entity. -The [Kubernetes Blog](http://blog.kubernetes.io) has some additional information on Pod use cases. For more information, see: +The [Kubernetes Blog](http://kubernetes.io/blog) has some additional information on Pod use cases. For more information, see: * [The Distributed System Toolkit: Patterns for Composite Containers](https://kubernetes.io/blog/2015/06/the-distributed-system-toolkit-patterns) * [Container Design Patterns](https://kubernetes.io/blog/2016/06/container-design-patterns) diff --git a/content/zh/docs/concepts/services-networking/connect-applications-service.md b/content/zh/docs/concepts/services-networking/connect-applications-service.md index fca03618e2..ae8609a469 100644 --- a/content/zh/docs/concepts/services-networking/connect-applications-service.md +++ b/content/zh/docs/concepts/services-networking/connect-applications-service.md @@ -26,7 +26,7 @@ Kubernetes 鍋囪 Pod 鍙笌鍏跺畠 Pod 閫氫俊锛屼笉绠″畠浠湪鍝釜涓绘満涓 杩欒〃鏄庝簡鍦 Pod 鍐呯殑瀹瑰櫒閮借兘澶熻繛鎺ュ埌鏈湴鐨勬瘡涓鍙o紝闆嗙兢涓殑鎵鏈 Pod 涓嶉渶瑕侀氳繃 NAT 杞崲灏辫兘澶熶簰鐩哥湅鍒般 鏂囨。鐨勫墿浣欓儴鍒嗗皢璇﹁堪濡備綍鍦ㄤ竴涓綉缁滄ā鍨嬩箣涓婅繍琛屽彲闈犵殑鏈嶅姟銆 -璇ユ寚鍗椾娇鐢ㄤ竴涓畝鍗曠殑 Nginx server 鏉ユ紨绀哄苟璇佹槑璋堝埌鐨勬蹇点傚悓鏍风殑鍘熷垯涔熶綋鐜板湪涓涓洿鍔犲畬鏁寸殑 [Jenkins CI 搴旂敤](http://blog.kubernetes.io/2015/07/strong-simple-ssl-for-kubernetes.html) 涓 +璇ユ寚鍗椾娇鐢ㄤ竴涓畝鍗曠殑 Nginx server 鏉ユ紨绀哄苟璇佹槑璋堝埌鐨勬蹇点傚悓鏍风殑鍘熷垯涔熶綋鐜板湪涓涓洿鍔犲畬鏁寸殑 [Jenkins CI 搴旂敤](http://kubernetes.io/blog/2015/07/strong-simple-ssl-for-kubernetes.html) 涓 diff --git a/content/zh/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume.md b/content/zh/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume.md index f18d916d10..13e8ad28c3 100644 --- a/content/zh/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume.md +++ b/content/zh/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume.md @@ -165,7 +165,7 @@ Pod 鑳芥湁澶氫釜瀹瑰櫒鐨勪富瑕佸師鍥犳槸涓轰簡鏀寔杈呭姪搴旂敤锛坔elper applic * 鏇村瀛︿範鍐呭 -[娣峰悎瀹瑰櫒鐨勬柟寮廬(http://blog.kubernetes.io/2015/06/the-distributed-system-toolkit-patterns.html)銆 +[娣峰悎瀹瑰櫒鐨勬柟寮廬(http://kubernetes.io/blog/2015/06/the-distributed-system-toolkit-patterns.html)銆 From f866725ba81deb3d5593dcf00612e1d10296e112 Mon Sep 17 00:00:00 2001 From: Liuduii <1693291525@qq.com> Date: Thu, 15 Nov 2018 07:00:36 -0600 Subject: [PATCH 076/222] Update 2016-07-00-Cross-Cluster-Services.md (#11009) --- content/en/blog/_posts/2016-07-00-Cross-Cluster-Services.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/blog/_posts/2016-07-00-Cross-Cluster-Services.md b/content/en/blog/_posts/2016-07-00-Cross-Cluster-Services.md index 58b9e67573..c5b0356d21 100644 --- a/content/en/blog/_posts/2016-07-00-Cross-Cluster-Services.md +++ b/content/en/blog/_posts/2016-07-00-Cross-Cluster-Services.md @@ -328,7 +328,7 @@ Standard Kubernetes service cluster-IP's already ensure that non-responsive indi We'd love to hear feedback on Kubernetes Cross Cluster Services. To join the community: -- Post issues or feature requests on [GitHub](https://github.com/kubernetes/kubernetes/tree/master/federation) +- Post issues or feature requests on [GitHub](https://github.com/kubernetes/kubernetes/tree/release-1.8/federation) - Join us in the #federation channel on [Slack](https://kubernetes.slack.com/messages/sig-federation) - Participate in the [Cluster Federation SIG](https://groups.google.com/forum/#!forum/kubernetes-sig-federation) From b2c893ee22afb8656ee373356bb1325192e15c01 Mon Sep 17 00:00:00 2001 From: Chao Wang Date: Thu, 15 Nov 2018 21:25:03 +0800 Subject: [PATCH 077/222] fix the display of Downloading Kubernetes title in docs/setup (#11012) --- content/en/docs/setup/{ => release}/building-from-source.md | 0 content/en/docs/setup/release/notes.md | 3 +++ data/setup.yml | 4 ++-- static/_redirects | 2 -- 4 files changed, 5 insertions(+), 4 deletions(-) rename content/en/docs/setup/{ => release}/building-from-source.md (100%) diff --git a/content/en/docs/setup/building-from-source.md b/content/en/docs/setup/release/building-from-source.md similarity index 100% rename from content/en/docs/setup/building-from-source.md rename to content/en/docs/setup/release/building-from-source.md diff --git a/content/en/docs/setup/release/notes.md b/content/en/docs/setup/release/notes.md index b834dbb885..b7301f7e58 100644 --- a/content/en/docs/setup/release/notes.md +++ b/content/en/docs/setup/release/notes.md @@ -1,3 +1,6 @@ +--- +title: v1.12 Release Notes +--- - [v1.12.0-rc.2](#v1120-rc2) - [Downloads for v1.12.0-rc.2](#downloads-for-v1120-rc2) diff --git a/data/setup.yml b/data/setup.yml index aaa35dfa62..f7cd2ffee0 100644 --- a/data/setup.yml +++ b/data/setup.yml @@ -6,9 +6,9 @@ toc: - docs/setup/pick-right-solution.md - title: Downloading Kubernetes - landing_page: /docs/imported/release/notes/ + landing_page: /docs/setup/release/notes/ section: - - docs/imported/release/notes.md + - docs/setup/release/notes.md - docs/setup/building-from-source.md - title: Version 1.10 Troubleshooting diff --git a/static/_redirects b/static/_redirects index ad55118a43..3b412d0832 100644 --- a/static/_redirects +++ b/static/_redirects @@ -211,8 +211,6 @@ /docs/home/contribute/blog-post/ /docs/contribute/start/ 301 /docs/home/contribute/write-new-topic/ /docs/contribute/style/write-new-topic/ 301 -/docs/imported/release/notes/ /docs/setup/release/notes/ 301 - /docs/reference/deprecation-policy/ /docs/reference/using-api/deprecation-policy/ 301 /docs/reference/federation/v1beta1/definitions/ /docs/reference/federation/extensions/v1beta1/definitions/ 301 /docs/reference/federation/v1beta1/operations/ /docs/reference/federation/extensions/v1beta1/operations/ 301 From e91aba3b45bb133467d3babcdbd9f73d21691083 Mon Sep 17 00:00:00 2001 From: Chao Wang Date: Thu, 15 Nov 2018 21:33:54 +0800 Subject: [PATCH 078/222] cleanup k8s101/201 resource left (#11008) --- .../user-journeys/users/application-developer/foundational.md | 4 ---- .../docs/user-journeys/users/cluster-operator/foundational.md | 2 -- data/tutorials.yml | 4 ---- static/_redirects | 2 -- 4 files changed, 12 deletions(-) diff --git a/content/en/docs/user-journeys/users/application-developer/foundational.md b/content/en/docs/user-journeys/users/application-developer/foundational.md index d5e72dd3b6..02e84a4dd5 100644 --- a/content/en/docs/user-journeys/users/application-developer/foundational.md +++ b/content/en/docs/user-journeys/users/application-developer/foundational.md @@ -248,10 +248,6 @@ The Kubernetes documentation is rich in detail. Here's a curated list of resourc * {{< link text="Hello Minikube" url="/docs/tutorials/stateless-application/hello-minikube/" >}} *(Runs on Mac only)* -* {{< link text="Kubernetes 101" url="/docs/user-guide/walkthrough/" >}} - -* {{< link text="Kubernetes 201" url="/docs/user-guide/walkthrough/k8s201/" >}} - * {{< link text="Kubernetes object management" url="/docs/tutorials/object-management-kubectl/object-management/" >}} ### What's next diff --git a/content/en/docs/user-journeys/users/cluster-operator/foundational.md b/content/en/docs/user-journeys/users/cluster-operator/foundational.md index 08d00300ca..d943a0e0cc 100644 --- a/content/en/docs/user-journeys/users/cluster-operator/foundational.md +++ b/content/en/docs/user-journeys/users/cluster-operator/foundational.md @@ -87,8 +87,6 @@ Some additional resources for getting information about your cluster and how it ### Tutorials * [Kubernetes Basics](/docs/tutorials/kubernetes-basics/) -* [Kubernetes 101](/docs/user-guide/walkthrough/) - kubectl command line interface and Pods -* [Kubernetes 201](/docs/user-guide/walkthrough/k8s201/) - labels, deployments, services, and health checking * [Configuring Redis with a ConfigMap](/docs/tutorials/configuration/configure-redis-using-configmap/) * Stateless Applications * [Deploying PHP Guestbook with Redis](/docs/tutorials/stateless-application/guestbook/) diff --git a/data/tutorials.yml b/data/tutorials.yml index 88217396f1..8bb60c071c 100644 --- a/data/tutorials.yml +++ b/data/tutorials.yml @@ -41,10 +41,6 @@ toc: path: https://www.edx.org/course/introduction-kubernetes-linuxfoundationx-lfs158x# - title: Hello Minikube path: /docs/tutorials/stateless-application/hello-minikube/ -- title: Kubernetes 101 - path: /docs/user-guide/walkthrough/ -- title: Kubernetes 201 - path: /docs/user-guide/walkthrough/k8s201/ - title: Configuration landing_page: /docs/tutorials/configuration/configure-redis-using-configmap/ section: diff --git a/static/_redirects b/static/_redirects index 3b412d0832..2321118b5f 100644 --- a/static/_redirects +++ b/static/_redirects @@ -482,8 +482,6 @@ /docs/user-guide/update-dem/ /docs/tasks/run-application/rolling-update-replication-controller/ 301 /docs/user-guide/update-demo/ /docs/tasks/run-application/rolling-update-replication-controller/ 301 /docs/user-guide/volumes/ /docs/concepts/storage/volumes/ 301 -/docs/user-guide/walkthrough/ /docs/tutorials/k8s101/ 301 -/docs/user-guide/walkthrough/k8s201/ /docs/tutorials/k8s201/ 301 /docs/user-guide/working-with-resources/ /docs/concepts/overview/object-management-kubectl/overview/ 301 /docs/whatisk8s/ /docs/concepts/overview/what-is-kubernetes/ 301 From 210b5ddb092ccbd48923b89dfd72cc6eb2a4bf4d Mon Sep 17 00:00:00 2001 From: shavidissa Date: Fri, 16 Nov 2018 20:01:12 +0530 Subject: [PATCH 079/222] Copy-edit based on the style guide (#11003) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Copy-edit based on the style guide Made the following changes: - Used present tense. - Removed latin phrases - {{< tab name=鈥淐ontent File #1鈥 include=鈥渆xample1鈥 />}} was not shown as code. Updated it. - Copy-edited the description for include under Tabs. * Updated the text based on the comments --- .../contribute/style/hugo-shortcodes/index.md | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/content/en/docs/contribute/style/hugo-shortcodes/index.md b/content/en/docs/contribute/style/hugo-shortcodes/index.md index 9d5dc7a30e..3161588996 100644 --- a/content/en/docs/contribute/style/hugo-shortcodes/index.md +++ b/content/en/docs/contribute/style/hugo-shortcodes/index.md @@ -14,7 +14,7 @@ Read more about shortcodes in the [Hugo documentation](https://gohugo.io/content {{% capture body %}} ## Feature state -In a markdown page (.md file) on this site, you can add a shortcode to display version and state of the documented feature. +In a markdown page (`.md` file) on this site, you can add a shortcode to display version and state of the documented feature. ### Feature state demo @@ -24,7 +24,7 @@ Below is a demo of the feature state snippet, which displays the feature as stab {{}} ``` -Will render to: +Renders to: {{< feature-state for_k8s_version="v1.10" state="stable" >}} @@ -37,8 +37,6 @@ The valid values for `state` are: ### Feature state code -Below is the template code for each available feature state. - The displayed Kubernetes version defaults to that of the page or the site. This can be changed by passing the for_k8s_version shortcode parameter. ```` @@ -92,14 +90,14 @@ Renders to: ## Glossary -You can reference glossary terms with an inclusion that will automatically update and replace content with the relevant links from [our glossary](/docs/reference/glossary/). When the term is moused-over by someone -using the online documentation, the glossary entry will display a tooltip. +You can reference glossary terms with an inclusion that automatically updates and replaces content with the relevant links from [our glossary](/docs/reference/glossary/). When the term is moused-over by someone +using the online documentation, the glossary entry displays a tooltip. The raw data for glossary terms is stored at [https://github.com/kubernetes/website/tree/master/content/en/docs/reference/glossary](https://github.com/kubernetes/website/tree/master/content/en/docs/reference/glossary), with a content file for each glossary term. ### Glossary Demo -For example, the following include within the markdown will render to {{< glossary_tooltip text="cluster" term_id="cluster" >}} with a tooltip: +For example, the following include within the markdown renders to {{< glossary_tooltip text="cluster" term_id="cluster" >}} with a tooltip: ````liquid {{}} @@ -113,9 +111,8 @@ The `tabs` shortcode takes these parameters: * `name`: The name as shown on the tab. * `codelang`: If you provide inner content to the `tab` shortcode, you can tell Hugo what code language to use for highlighting. -* `include`: The file to include in the tab. If the tab lives in a Hugo [leaf bundle](https://gohugo.io/content-management/page-bundles/#leaf-bundles), the file -- which can be any MIME type supported by Hugo -- will be looked up in the bundle itself. If not, the content page to include will be looked up relative to the current. Note that with the `include` you will not have any shortcode inner content and must use the self-closing syntax, e.g. {{}}. Non-content files will be code-highlighted. The language to use will be taken from the filename if not provided in `codelang`. - -* If your inner content is markdown, you must use `%`-delimiter to surorund the tab, e.g. `{{%/* tab name="Tab 1" %}}This is **markdown**{{% /tab */%}}` +* `include`: The file to include in the tab. If the tab lives in a Hugo [leaf bundle](https://gohugo.io/content-management/page-bundles/#leaf-bundles), the file -- which can be any MIME type supported by Hugo -- is looked up in the bundle itself. If not, the content page that needs to be included is looked up relative to the current page. Note that with the `include`, you do not have any shortcode inner content and must use the self-closing syntax. For example, {{}}. The language needs to be specified under `codelang` or the language is taken based on the file name. Non-content files are code-highlighted by default. +* If your inner content is markdown, you must use the `%`-delimiter to surround the tab. For example, `{{%/* tab name="Tab 1" %}}This is **markdown**{{% /tab */%}}` * You can combine the variations mentioned above inside a tab set. Below is a demo of the tabs shortcode. @@ -137,7 +134,7 @@ println "This is tab 2." {{< /tabs */>}} ``` -Will be rendered as: +Renders to: {{< tabs name="tab_with_code" >}} {{< tab name="Tab 1" codelang="bash" >}} @@ -167,7 +164,7 @@ It can even contain shortcodes. {{< /tabs */>}} ``` -Will be rendered as: +Renders to: {{< tabs name="tab_with_md" >}} {{% tab name="Markdown" %}} @@ -196,7 +193,7 @@ It can even contain shortcodes. {{< /tabs */>}} ``` -Will be rendered as: +Renders to: {{< tabs name="tab_with_file_include" >}} {{< tab name="Content File #1" include="example1" />}} From 6aa48f841e202800c1a826b4ddc4a0297f9f5ad3 Mon Sep 17 00:00:00 2001 From: Chao Wang Date: Fri, 16 Nov 2018 22:58:44 +0800 Subject: [PATCH 080/222] fix bad request for community file (#10963) --- data/user-personas/contributors/code-contributor.yaml | 4 ++-- data/user-personas/contributors/community-contributor.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/user-personas/contributors/code-contributor.yaml b/data/user-personas/contributors/code-contributor.yaml index a578d7fac4..24f007faf8 100644 --- a/data/user-personas/contributors/code-contributor.yaml +++ b/data/user-personas/contributors/code-contributor.yaml @@ -5,11 +5,11 @@ index: 0 foundational: - label: "Read the Developer Guide" icon: fa-book - url: "/docs/community/devel/" + url: "https://github.com/kubernetes/community/blob/master/contributors/devel/README.md" intermediate: - label: "Learn about the Kubernetes Enhancement Proposal (KEP) process" icon: fa-upload - url: "/docs/community/keps/" + url: "https://github.com/kubernetes/community/blob/master/keps/0001-kubernetes-enhancement-proposal-process.md" - label: "Understand the API conventions" icon: fa-map-o url: "https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md" diff --git a/data/user-personas/contributors/community-contributor.yaml b/data/user-personas/contributors/community-contributor.yaml index 217162d9af..417e0d5b90 100644 --- a/data/user-personas/contributors/community-contributor.yaml +++ b/data/user-personas/contributors/community-contributor.yaml @@ -5,10 +5,10 @@ index: 1 foundational: - label: "Contribute to the Kubernetes OSS project" icon: fa-users - url: "/docs/community/guide/" + url: "https://github.com/kubernetes/community/blob/master/contributors/guide/README.md" - label: "Find out about mentoring initiatives" icon: fa-graduation-cap - url: "/docs/community/mentoring/" + url: "https://github.com/kubernetes/community/blob/master/mentoring/README.md" intermediate: - label: "Apply for community membership as a member, reviewer, approver, owner, or maintainer" icon: fa-user-plus From cfb257146f7415c545d4736141f3f3b49764a97f Mon Sep 17 00:00:00 2001 From: shavidissa Date: Fri, 16 Nov 2018 20:30:23 +0530 Subject: [PATCH 081/222] Copy-edit (#10966) - The intro section had repeated text on visiting the community page. Refactored this content. - Minor changes to content. - Added links to Slack and the SIG docs mailing list. --- content/en/docs/contribute/_index.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/content/en/docs/contribute/_index.md b/content/en/docs/contribute/_index.md index 688a2c6160..c7f191e5c1 100644 --- a/content/en/docs/contribute/_index.md +++ b/content/en/docs/contribute/_index.md @@ -13,18 +13,14 @@ we're happy to have your help! Anyone can contribute, whether you're new to the project or you've been around a long time, and whether you self-identify as a developer, an end user, or someone who just can't stand seeing typos. -For more ways to get involved in the Kubernetes community or to learn about us, -also visit the [Kubernetes community site](/community/). - -Looking for the [style guide](/docs/contribute/style/style-guide/) or the -[Kubernetes Community site](/community/)? -{{% /capture %}} +For more ways to get involved in the Kubernetes community or to learn about us, visit the [Kubernetes community site](/community/). +For information on the Kubernetes documentation style guide, see the [style guide](/docs/contribute/style/style-guide/). {{% capture body %}} -## Types of contributor +## Types of contributors -- A _member_ of the Kubernetes organization has [signed the CLA](/docs/contribute/start#sign-the-cla) +- A _member_ of the Kubernetes organization who has [signed the CLA](/docs/contribute/start#sign-the-cla) and contributed some time and effort to the project. See [Community membership](https://github.com/kubernetes/community/blob/master/community-membership.md) for specific criteria for membership. @@ -33,8 +29,8 @@ Looking for the [style guide](/docs/contribute/style/style-guide/) or the added to the appropriate Github group and `OWNERS` files in the Github repository, by a SIG Docs Approver. - A SIG Docs _approver_ is a member in good standing who has shown a continued - commitment to the project and is granted the ability to merge pull requests - and thus to publish content on behalf of the Kubernetes organization. + commitment to the project. An approver can merge pull requests + and publish content on behalf of the Kubernetes organization. Approvers can also represent SIG Docs in the larger Kubernetes community. Some of the duties of a SIG Docs approver, such as coordinating a release, require a significant time commitment. @@ -54,7 +50,7 @@ documentation, but it should help you get started. - File actionable bugs - [Member](/docs/contribute/start/) - Improve existing docs - - Bring up ideas for improvement on Slack or SIG docs mailing list + - Bring up ideas for improvement on [Slack](http://slack.k8s.io/) or the [SIG docs mailing list](https://groups.google.com/forum/#!forum/kubernetes-sig-docs) - Improve docs accessibility - Provide non-binding feedback on PRs - Write a blog post or case study From 41319e8059ab4e6e7b5fd51361cbf6d29ad96aa6 Mon Sep 17 00:00:00 2001 From: Rohit Agarwal Date: Fri, 16 Nov 2018 07:02:02 -0800 Subject: [PATCH 082/222] Update NVIDIA GPU instructions for GCP (#10970) --- .../en/docs/tasks/manage-gpus/scheduling-gpus.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/content/en/docs/tasks/manage-gpus/scheduling-gpus.md b/content/en/docs/tasks/manage-gpus/scheduling-gpus.md index 51f94a255d..91ae88bb8e 100644 --- a/content/en/docs/tasks/manage-gpus/scheduling-gpus.md +++ b/content/en/docs/tasks/manage-gpus/scheduling-gpus.md @@ -116,29 +116,32 @@ kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1. Report issues with this device plugin to [NVIDIA/k8s-device-plugin](https://github.com/NVIDIA/k8s-device-plugin). -#### NVIDIA GPU device plugin used by GKE/GCE +#### NVIDIA GPU device plugin used by GCE -The [NVIDIA GPU device plugin used by GKE/GCE](https://github.com/GoogleCloudPlatform/container-engine-accelerators/tree/master/cmd/nvidia_gpu) +The [NVIDIA GPU device plugin used by GCE](https://github.com/GoogleCloudPlatform/container-engine-accelerators/tree/master/cmd/nvidia_gpu) doesn't require using nvidia-docker and should work with any container runtime that is compatible with the Kubernetes Container Runtime Interface (CRI). It's tested on [Container-Optimized OS](https://cloud.google.com/container-optimized-os/) and has experimental code for Ubuntu from 1.9 onwards. -On your 1.9 cluster, you can use the following commands to install the NVIDIA drivers and device plugin: +On your 1.12 cluster, you can use the following commands to install the NVIDIA drivers and device plugin: ``` # Install NVIDIA drivers on Container-Optimized OS: -kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/k8s-1.9/daemonset.yaml +kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/stable/daemonset.yaml # Install NVIDIA drivers on Ubuntu (experimental): -kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/k8s-1.9/nvidia-driver-installer/ubuntu/daemonset.yaml +kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/stable/nvidia-driver-installer/ubuntu/daemonset.yaml # Install the device plugin: -kubectl create -f https://raw.githubusercontent.com/kubernetes/kubernetes/release-1.9/cluster/addons/device-plugins/nvidia-gpu/daemonset.yaml +kubectl create -f https://raw.githubusercontent.com/kubernetes/kubernetes/release-1.12/cluster/addons/device-plugins/nvidia-gpu/daemonset.yaml ``` Report issues with this device plugin and installation method to [GoogleCloudPlatform/container-engine-accelerators](https://github.com/GoogleCloudPlatform/container-engine-accelerators). +Instructions for using NVIDIA GPUs on GKE are +[here](https://cloud.google.com/kubernetes-engine/docs/how-to/gpus) + ## Clusters containing different types of NVIDIA GPUs If different nodes in your cluster have different types of NVIDIA GPUs, then you From 7875c405440fb8743e668811c0ca9076cd8e5a58 Mon Sep 17 00:00:00 2001 From: Aivars Sterns Date: Fri, 16 Nov 2018 17:05:11 +0200 Subject: [PATCH 083/222] Update kubespray.md (#10992) * Update kubespray.md Add note about vault discontinuation and upgrade ansible minimal requirements * fix typo --- content/en/docs/setup/custom-cloud/kubespray.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/en/docs/setup/custom-cloud/kubespray.md b/content/en/docs/setup/custom-cloud/kubespray.md index b181b087e9..7e993ee8c5 100644 --- a/content/en/docs/setup/custom-cloud/kubespray.md +++ b/content/en/docs/setup/custom-cloud/kubespray.md @@ -6,7 +6,7 @@ content_template: templates/concept {{% capture overview %}} This quickstart helps to install a Kubernetes cluster hosted on GCE, Azure, OpenStack, AWS, vSphere, Oracle Cloud Infrastructure (Experimental) or Baremetal with [Kubespray](https://github.com/kubernetes-incubator/kubespray). - + Kubespray is a composition of [Ansible](http://docs.ansible.com/) playbooks, [inventory](https://github.com/kubernetes-incubator/kubespray/blob/master/docs/ansible.md), provisioning tools, and domain knowledge for generic OS/Kubernetes clusters configuration management tasks. Kubespray provides: * a highly available cluster @@ -32,7 +32,7 @@ To choose a tool which best fits your use case, read [this comparison](https://g Provision servers with the following [requirements](https://github.com/kubernetes-incubator/kubespray#requirements): -* **Ansible v2.4 (or newer) and python-netaddr is installed on the machine that will run Ansible commands** +* **Ansible v2.5 (or newer) and python-netaddr is installed on the machine that will run Ansible commands** * **Jinja 2.9 (or newer) is required to run the Ansible Playbooks** * The target servers must have **access to the Internet** in order to pull docker images * The target servers are configured to allow **IPv4 forwarding** @@ -64,7 +64,7 @@ Kubespray provides the ability to customize many aspects of the deployment: * docker * rkt * cri-o -* Certificate generation methods +* Certificate generation methods (**Vault being discontinued**) Kubespray customizations can be made to a [variable file](http://docs.ansible.com/ansible/playbooks_variables.html). If you are just getting started with Kubespray, consider using the Kubespray defaults to deploy your cluster and explore Kubernetes. From 34b6eef1b8987cf1358eca703cef25fec269210a Mon Sep 17 00:00:00 2001 From: June Yi Date: Sat, 17 Nov 2018 00:06:50 +0900 Subject: [PATCH 084/222] Add Korean language alternatives setting (#10996) --- config.toml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/config.toml b/config.toml index 28c98f51e8..5b6f888bc7 100644 --- a/config.toml +++ b/config.toml @@ -139,6 +139,10 @@ languageName = "涓枃 Chinese" weight = 2 contentDir = "content/zh" +[languages.zh.params] +time_format_blog = "2006.01.02" +language_alternatives = ["en"] + [languages.ko] title = "Kubernetes" description = "Production-Grade Container Orchestration" @@ -146,6 +150,10 @@ languageName = "頃滉淡鞏 Korean" weight = 3 contentDir = "content/ko" +[languages.ko.params] +time_format_blog = "2006.01.02" +language_alternatives = ["en"] + [languages.no] title = "Kubernetes" description = "Production-Grade Container Orchestration" @@ -158,6 +166,3 @@ time_format_blog = "02.01.2006" # A list of language codes to look for untranslated content, ordered from left to right. language_alternatives = ["en"] -[languages.zh.params] -time_format_blog = "2006.01.02" -language_alternatives = ["en"] From cb88b43438d0aa2878a10231bb8696c75c91a453 Mon Sep 17 00:00:00 2001 From: hongkunyoo Date: Sat, 17 Nov 2018 02:16:57 +0900 Subject: [PATCH 085/222] Adding name arguement in kubeadm-config.yaml (#10948) In AWS cloud platform, omitting the name while initializing etcd cluster causes "Couldn't find local name "$HOSTNAME in the initial cluster configuration" It seems that the etcd tries to find short hostname, not the FQDN hostname. To avoid this, passing the name explicitly to etcd configuration solved the problem. [related issue1](https://github.com/coreos/bugs/issues/2054) [related issue2](https://github.com/kubernetes/kubeadm/issues/653) --- content/en/docs/setup/independent/high-availability.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/en/docs/setup/independent/high-availability.md b/content/en/docs/setup/independent/high-availability.md index 74beb0aa93..6c49266ff3 100644 --- a/content/en/docs/setup/independent/high-availability.md +++ b/content/en/docs/setup/independent/high-availability.md @@ -151,6 +151,7 @@ Optionally replace `stable` with a different version of Kubernetes, for example etcd: local: extraArgs: + name: "CP0_HOSTNAME" listen-client-urls: "https://127.0.0.1:2379,https://CP0_IP:2379" advertise-client-urls: "https://CP0_IP:2379" listen-peer-urls: "https://CP0_IP:2380" @@ -230,6 +231,7 @@ Remember that your config may differ from this example. etcd: local: extraArgs: + name: "CP1_HOSTNAME" listen-client-urls: "https://127.0.0.1:2379,https://CP1_IP:2379" advertise-client-urls: "https://CP1_IP:2379" listen-peer-urls: "https://CP1_IP:2380" @@ -320,6 +322,7 @@ Remember that your config may differ from this example. etcd: local: extraArgs: + name: "CP2_HOSTNAME" listen-client-urls: "https://127.0.0.1:2379,https://CP2_IP:2379" advertise-client-urls: "https://CP2_IP:2379" listen-peer-urls: "https://CP2_IP:2380" From a24381103a5c0d04b060396d5f75e4088e671de5 Mon Sep 17 00:00:00 2001 From: shavidissa Date: Fri, 16 Nov 2018 23:52:21 +0530 Subject: [PATCH 086/222] Minor updates (#11021) - Added a missing full stop. - Separated the details on the --type flag under the respective section. - Linked to the page on setting up Minikube locally. - Introduced the VM abbreviation when used for the first time on the page. --- content/en/docs/tutorials/hello-minikube.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/content/en/docs/tutorials/hello-minikube.md b/content/en/docs/tutorials/hello-minikube.md index 203d209652..e4449ae3da 100644 --- a/content/en/docs/tutorials/hello-minikube.md +++ b/content/en/docs/tutorials/hello-minikube.md @@ -17,7 +17,7 @@ on Kubernetes using [Minikube](/docs/getting-started-guides/minikube) and Kataco Katacoda provides a free, in-browser Kubernetes environment. {{< note >}} -You can also follow this tutorial if you've installed Minikube locally. +You can also follow this tutorial if you've installed [Minikube locally](/docs/tasks/tools/install-minikube/). {{< /note >}} {{% /capture %}} @@ -38,7 +38,7 @@ This tutorial provides a container image built from the following files: {{< codenew language="conf" file="minikube/Dockerfile" >}} -For more information, read the Docker documentation for [docker build](https://docs.docker.com/engine/reference/commandline/build/) +For more information on the `docker build` command, read the [Docker documentation](https://docs.docker.com/engine/reference/commandline/build/). {{% /capture %}} @@ -129,6 +129,9 @@ Kubernetes [*Service*](/docs/concepts/services-networking/service/). ```shell kubectl expose deployment hello-node --type=LoadBalancer ``` + + The `--type=LoadBalancer` flag indicates that you want to expose your Service + outside of the cluster. 2. View the Service you just created: @@ -144,8 +147,7 @@ Kubernetes [*Service*](/docs/concepts/services-networking/service/). kubernetes ClusterIP 10.96.0.1 443/TCP 23m ``` - The `--type=LoadBalancer` flag indicates that you want to expose your Service - outside of the cluster. On cloud providers that support load balancers, + On cloud providers that support load balancers, an external IP address would be provisioned to access the Service. On Minikube, the `LoadBalancer` type makes the Service accessible through the `minikube service` command. @@ -250,7 +252,7 @@ kubectl delete service hello-node kubectl delete deployment hello-node ``` -Optionally, stop the Minikube VM: +Optionally, stop the Minikube virtual machine (VM): ```shell minikube stop From 905588105a4f9353602622b6e62445fa4cd3d478 Mon Sep 17 00:00:00 2001 From: Quy Le Ngoc Date: Sat, 17 Nov 2018 01:24:00 +0700 Subject: [PATCH 087/222] Fix typo in kubectl-plugins.md (#11015) `kubectk-foo-bar-baz-arg1` => `kubectl-foo-bar-baz-arg1` --- content/en/docs/tasks/extend-kubectl/kubectl-plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md b/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md index cfbaea033c..9932ff8143 100644 --- a/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md +++ b/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md @@ -135,7 +135,7 @@ and handle flag validation as part of their own implementation. For plugins writ Taking our `kubectl-foo-bar-baz` plugin from the above scenario, we further explore additional cases where users invoke our plugin while providing additional flags and arguments. For example, in a situation where a user invokes the command `kubectl foo bar baz arg1 --flag=value arg2`, the plugin mechanism will first try to find the plugin with the longest possible name, which in this case -would be `kubectk-foo-bar-baz-arg1`. Upon not finding that plugin, it then treats the last dash-separated value as an argument (`arg1` in this case), and attempts to find the next longest possible name, `kubectl-foo-bar-baz`. +would be `kubectl-foo-bar-baz-arg1`. Upon not finding that plugin, it then treats the last dash-separated value as an argument (`arg1` in this case), and attempts to find the next longest possible name, `kubectl-foo-bar-baz`. Upon finding a plugin with this name, it then invokes that plugin, passing all args and flags after its name to the plugin executable. Example: From 2c3438919ccc399378b4c97e3663246f9b60455a Mon Sep 17 00:00:00 2001 From: Will Beason Date: Fri, 16 Nov 2018 10:25:57 -0800 Subject: [PATCH 088/222] Fix ResourceQuota doc (#11016) We don't support multiple ResourceQuota definitions in the same namespace. --- content/en/docs/concepts/policy/resource-quotas.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/policy/resource-quotas.md b/content/en/docs/concepts/policy/resource-quotas.md index 3374593230..e3be95b50c 100644 --- a/content/en/docs/concepts/policy/resource-quotas.md +++ b/content/en/docs/concepts/policy/resource-quotas.md @@ -27,7 +27,7 @@ Resource quotas work like this: - Different teams work in different namespaces. Currently this is voluntary, but support for making this mandatory via ACLs is planned. -- The administrator creates one or more `ResourceQuotas` for each namespace. +- The administrator creates one `ResourceQuota` for each namespace. - Users create resources (pods, services, etc.) in the namespace, and the quota system tracks usage to ensure it does not exceed hard resource limits defined in a `ResourceQuota`. - If creating or updating a resource violates a quota constraint, the request will fail with HTTP From bcae10b195ea1bab9be57b2404d3ffde17b216dc Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Fri, 16 Nov 2018 13:27:41 -0500 Subject: [PATCH 089/222] Fix vsphere node name docs (#11017) --- .../docs/concepts/cluster-administration/cloud-providers.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/en/docs/concepts/cluster-administration/cloud-providers.md b/content/en/docs/concepts/cluster-administration/cloud-providers.md index e3c7f153af..7a607b4262 100644 --- a/content/en/docs/concepts/cluster-administration/cloud-providers.md +++ b/content/en/docs/concepts/cluster-administration/cloud-providers.md @@ -358,7 +358,9 @@ Note that the Kubernetes Node name must match the Photon VM name (or if `overrid ### Node Name -The VSphere cloud provider uses the hostname of the node (as determined by the kubelet or overridden with `--hostname-override`) as the name of the Kubernetes Node object. +The VSphere cloud provider uses the detected hostname of the node (as determined by the kubelet) as the name of the Kubernetes Node object. + +The `--hostname-override` parameter is ignored by the VSphere cloud provider. ## IBM Cloud Kubernetes Service From 3154c260e9c0c272a4b5c9b6d6e2c0488c181e9e Mon Sep 17 00:00:00 2001 From: yanghaichao12 Date: Sat, 17 Nov 2018 02:29:24 +0800 Subject: [PATCH 090/222] Fix an error in custom-resources.md (#11020) --- .../extend-kubernetes/api-extension/custom-resources.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md b/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md index 5eabfb07a1..614b0b60e2 100644 --- a/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md +++ b/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md @@ -110,7 +110,7 @@ Kubernetes provides two ways to add custom resources to your cluster: - CRDs are simple and can be created without any programming. - [API Aggregation](/docs/concepts/api-extension/apiserver-aggregation/) requires programming, but allows more control over API behaviors like how data is stored and conversion between API versions. -Kubernetes provides these two options to meet the needs of different users, so that neither ease of use nor flexibility are compromised. +Kubernetes provides these two options to meet the needs of different users, so that neither ease of use nor flexibility is compromised. Aggregated APIs are subordinate APIServers that sit behind the primary API server, which acts as a proxy. This arrangement is called [API Aggregation](/docs/concepts/api-extension/apiserver-aggregation/) (AA). To users, it simply appears that the Kubernetes API is extended. @@ -245,4 +245,4 @@ When you add a custom resource, you can access it using: * Learn how to [Extend the Kubernetes API with CustomResourceDefinition](/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/). -{{% /capture %}} \ No newline at end of file +{{% /capture %}} From 1dd231b8c340d3ab76b3aa6d2692bab7dce5cca4 Mon Sep 17 00:00:00 2001 From: JoeWrightss <42261994+JoeWrightss@users.noreply.github.com> Date: Sat, 17 Nov 2018 02:31:17 +0800 Subject: [PATCH 091/222] fix typo error: Paricipate -> Participate (#11025) --- ...User.md => 2015-03-00-Participate-In-Kubernetes-User.md} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename content/en/blog/_posts/{2015-03-00-Paricipate-In-Kubernetes-User.md => 2015-03-00-Participate-In-Kubernetes-User.md} (87%) diff --git a/content/en/blog/_posts/2015-03-00-Paricipate-In-Kubernetes-User.md b/content/en/blog/_posts/2015-03-00-Participate-In-Kubernetes-User.md similarity index 87% rename from content/en/blog/_posts/2015-03-00-Paricipate-In-Kubernetes-User.md rename to content/en/blog/_posts/2015-03-00-Participate-In-Kubernetes-User.md index a6ebc9d572..49055c6c90 100644 --- a/content/en/blog/_posts/2015-03-00-Paricipate-In-Kubernetes-User.md +++ b/content/en/blog/_posts/2015-03-00-Participate-In-Kubernetes-User.md @@ -1,8 +1,8 @@ --- -title: " Paricipate in a Kubernetes User Experience Study " +title: " Participate in a Kubernetes User Experience Study " date: 2015-03-31 -slug: paricipate-in-kubernetes-user -url: /blog/2015/03/Paricipate-In-Kubernetes-User +slug: participate-in-kubernetes-user +url: /blog/2015/03/Participate-In-Kubernetes-User --- We need your help in shaping the future of Kubernetes and Google Container Engine, and we'd love to have you participate in a remote UX research study to help us learn about your experiences!  If you're interested in participating, we invite you to take [this brief survey](http://goo.gl/AXFFMs) to see if you qualify. If you鈥檙e selected to participate, we鈥檒l follow up with you directly. From 28f02d5121967dd2a352e4d730e0b0a95a562e3c Mon Sep 17 00:00:00 2001 From: CaoShuFeng <1033798960@qq.com> Date: Sat, 17 Nov 2018 03:05:29 +0800 Subject: [PATCH 092/222] fix audit config format (#9970) --- .../tasks/debug-application-cluster/audit.md | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/content/en/docs/tasks/debug-application-cluster/audit.md b/content/en/docs/tasks/debug-application-cluster/audit.md index a46fec98e9..8e0b43e66c 100644 --- a/content/en/docs/tasks/debug-application-cluster/audit.md +++ b/content/en/docs/tasks/debug-application-cluster/audit.md @@ -329,24 +329,22 @@ different users into different files. 1. create a [kubeconfig file](/docs/tasks/access-application-cluster/authenticate-across-clusters-kubeconfig/) for kube-apiserver webhook audit backend - ```none - $ cat < /etc/kubernetes/audit-webhook-kubeconfig - apiVersion: v1 - clusters: - - cluster: - server: http://:8888 - name: logstash - contexts: - - context: - cluster: logstash - user: "" - name: default-context - current-context: default-context - kind: Config - preferences: {} - users: [] - EOF - ``` + $ cat < /etc/kubernetes/audit-webhook-kubeconfig + apiVersion: v1 + clusters: + - cluster: + server: http://:8888 + name: logstash + contexts: + - context: + cluster: logstash + user: "" + name: default-context + current-context: default-context + kind: Config + preferences: {} + users: [] + EOF 1. start kube-apiserver with the following options: From 62608749e1dd3f850b3481507e15322c9490fcdb Mon Sep 17 00:00:00 2001 From: Takuya N Date: Sat, 17 Nov 2018 04:21:09 +0900 Subject: [PATCH 093/222] Fix customized CSS for case study (#10531) Signed-off-by: Takuya Noguchi --- static/css/style_amadeus.css | 36 ++++------------------- static/css/style_ancestry.css | 38 ++++-------------------- static/css/style_blablacar.css | 36 ++++------------------- static/css/style_blackrock.css | 31 +++----------------- static/css/style_box.css | 48 ++++++------------------------ static/css/style_buffer.css | 46 +++++------------------------ static/css/style_crowdfire.css | 45 +++++++--------------------- static/css/style_golfnow.css | 52 +++++++-------------------------- static/css/style_haufegroup.css | 37 +++++------------------ static/css/style_huawei.css | 43 +++++++-------------------- static/css/style_peardeck.css | 52 +++++++-------------------------- static/css/style_wink.css | 51 +++++++------------------------- static/css/style_zalando.css | 36 ++++------------------- 13 files changed, 101 insertions(+), 450 deletions(-) diff --git a/static/css/style_amadeus.css b/static/css/style_amadeus.css index 7a91c4f692..2e64000832 100644 --- a/static/css/style_amadeus.css +++ b/static/css/style_amadeus.css @@ -65,7 +65,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:repeat; @@ -83,7 +82,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background: url('/images/CaseStudy_amadeus_banner3.jpg'); background-size:100% auto; } @@ -97,7 +95,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background: url('/images/CaseStudy_amadeus_banner4.jpg'); background-size:100% auto; } @@ -111,7 +108,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:35px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -122,9 +118,8 @@ h1 { font-weight:300; color:#ffffff; width:70%; - padding-left:15%; - float:left; text-align:center; + margin:0 auto; } .banner3text { @@ -132,8 +127,8 @@ h1 { font-weight:300; color:#ffffff; width:75%; - padding-left:13%; text-align:center; + margin:0 auto; } .banner4text { @@ -141,8 +136,8 @@ h1 { font-weight:300; color:#ffffff; width:65%; - padding-left:17%; text-align:center; + margin:0 auto; } .banner5text { @@ -150,9 +145,8 @@ h1 { font-weight:300; color:#ffffff; width:68%; - padding-left:16%; - float:left; text-align:center; + margin:0 auto; } @@ -188,14 +182,11 @@ hr { border-bottom:0px solid; width:100%; opacity:0.5; - color:#aaaaaa; + background-color:#999999; height:1px; } .col1 { - width: 42%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:100; color:#606060; @@ -206,10 +197,8 @@ hr { } .col2 { - width: 45%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -225,7 +214,6 @@ hr { margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:22px; color:#606060; letter-spacing:0.03em; @@ -239,8 +227,6 @@ hr { margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; - } h4 { @@ -293,9 +279,6 @@ h1 { } .col1 { - width: 95%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:300; color:#606060; @@ -305,12 +288,10 @@ h1 { } .col2 { - width: 95%; padding-top:2%; padding-bottom:5%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -339,7 +320,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -353,8 +333,7 @@ h1 { font-size:16px; letter-spacing:0.03em; line-height:23px; - width:90%; - float:left; + width:100%; background: url('/images/CaseStudy_amadeus_banner3.jpg'); } @@ -368,7 +347,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background: url('/images/CaseStudy_amadeus_banner4.jpg'); } @@ -382,7 +360,6 @@ h1 { letter-spacing:0.03em; line-height:23px; width:100%; - float:left; background:none; background-color:#666666; } @@ -395,7 +372,6 @@ h1 { padding-left:5%; padding-bottom:1%; padding-top:1%; - float:left; text-align:center; color:#ffffff; } diff --git a/static/css/style_ancestry.css b/static/css/style_ancestry.css index 03abb4e7e7..844e232002 100644 --- a/static/css/style_ancestry.css +++ b/static/css/style_ancestry.css @@ -57,7 +57,6 @@ h1 { font-size:19px; letter-spacing:0.03em; line-height:28px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -75,7 +74,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background: url('/images/CaseStudy_ancestry_banner3.jpg'); background-size:100% auto; } @@ -89,7 +87,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background: url('/images/CaseStudy_ancestry_banner4.jpg'); background-size:100% auto; } @@ -103,7 +100,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -114,9 +110,8 @@ h1 { font-weight:300; color:#ffffff; width:65%; - padding-left:17%; - float:left; text-align:center; + margin:0 auto; } .banner3text { @@ -124,8 +119,8 @@ h1 { font-weight:300; color:#ffffff; width:70%; - padding-left:15%; text-align:center; + margin:0 auto; } .banner4text { @@ -133,8 +128,8 @@ h1 { font-weight:300; color:#ffffff; width:70%; - padding-left:15%; text-align:center; + margin:0 auto; } .banner5text { @@ -142,9 +137,8 @@ h1 { font-weight:300; color:#ffffff; width:65%; - padding-left:16%; - float:left; text-align:center; + margin:0 auto; } @@ -180,15 +174,11 @@ hr { border-bottom:0px solid; width:100%; opacity:0.5; - color:#aaaaaa; + background-color:#999999; height:1px; } .col1 { - width: 40%; - padding-left:5%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:100; color:#606060; @@ -199,10 +189,8 @@ hr { } .col2 { - width: 40%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -218,7 +206,6 @@ hr { margin-bottom:6%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:22px; color:#606060; letter-spacing:0.03em; @@ -232,8 +219,6 @@ hr { margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; - } h4 { @@ -280,10 +265,6 @@ h1 { } .col1 { - width: 90%; - padding-left:5%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:300; color:#606060; @@ -293,13 +274,10 @@ h1 { } .col2 { - width: 90%; - padding-left:5%; padding-top:5%; padding-bottom:5%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -329,7 +307,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -344,7 +321,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background: url('CaseStudy_ancestry_banner3.jpg'); } @@ -358,7 +334,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background: url('CaseStudy_ancestry_banner4.jpg'); } @@ -372,7 +347,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -383,7 +357,6 @@ h1 { color:#ffffff; width:80%; padding-left:10%; - float:left; text-align:center; color:#ffffff; } @@ -416,7 +389,6 @@ h1 { color:#ffffff; width:80%; padding-left:10%; - float:left; text-align:center; color:#ffffff; } diff --git a/static/css/style_blablacar.css b/static/css/style_blablacar.css index 4956644e33..e0ed7c3d67 100755 --- a/static/css/style_blablacar.css +++ b/static/css/style_blablacar.css @@ -64,7 +64,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background-color:#666666; background-repeat:repeat; position: relative; @@ -82,7 +81,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background: url('/images/CaseStudy_blablacar_banner3.jpg'); background-size:100% auto; } @@ -96,7 +94,6 @@ h1 { font-size:25px; letter-spacing:0.03em; line-height:34px; - float:left; background: url('/images/CaseStudy_blablacar_banner4.jpg'); background-size:100% auto; } @@ -110,7 +107,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -121,9 +117,8 @@ h1 { font-weight:300; color:#ffffff; width:65%; - padding-left:18%; - float:left; text-align:center; + margin:0 auto; z-index: 1; padding-top: 2%; } @@ -133,8 +128,8 @@ h1 { font-weight:300; color:#ffffff; width:75%; - padding-left:13%; text-align:center; + margin:0 auto; } .banner4text { @@ -142,8 +137,8 @@ h1 { font-weight:300; color:#ffffff; width:65%; - padding-left:17%; text-align:center; + margin:0 auto; } .banner5text { @@ -151,9 +146,8 @@ h1 { font-weight:300; color:#ffffff; width:68%; - padding-left:16%; - float:left; text-align:center; + margin:0 auto; } @@ -189,14 +183,11 @@ hr { border-bottom:0px solid; width:100%; opacity:0.5; - color:#aaaaaa; + background-color:#999999; height:1px; } .col1 { - width: 45%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:100; color:#606060; @@ -207,10 +198,8 @@ hr { } .col2 { - width: 38%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -226,7 +215,6 @@ hr { margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:22px; color:#606060; letter-spacing:0.03em; @@ -240,8 +228,6 @@ hr { margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; - } h4 { @@ -294,9 +280,6 @@ h1 { } .col1 { - width: 95%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:300; color:#606060; @@ -306,12 +289,10 @@ h1 { } .col2 { - width: 95%; padding-top:2%; padding-bottom:5%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -340,7 +321,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -354,8 +334,7 @@ h1 { font-size:16px; letter-spacing:0.03em; line-height:23px; - width:90%; - float:left; + width:100%; background: url('/images/CaseStudy_blablacar_banner3.jpg'); } @@ -369,7 +348,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background: url('/images/CaseStudy_blablacar_banner4.jpg'); } @@ -383,7 +361,6 @@ h1 { letter-spacing:0.03em; line-height:23px; width:100%; - float:left; background:none; background-color:#666666; } @@ -396,7 +373,6 @@ h1 { padding-left:5%; padding-bottom:1%; padding-top:1%; - float:left; text-align:center; color:#ffffff; } diff --git a/static/css/style_blackrock.css b/static/css/style_blackrock.css index f93c971ccd..0d5d988f71 100644 --- a/static/css/style_blackrock.css +++ b/static/css/style_blackrock.css @@ -65,7 +65,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:repeat; @@ -83,7 +82,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background: url('/images/CaseStudy_blackrock_banner3.jpg'); background-size:100% auto; } @@ -97,7 +95,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background: url('/images/CaseStudy_blackrock_banner4.jpg'); background-size:100% auto; } @@ -111,7 +108,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:35px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -122,9 +118,8 @@ h1 { font-weight:300; color:#ffffff; width:65%; - padding-left:18%; - float:left; text-align:center; + margin:0 auto; } .banner3text { @@ -150,9 +145,8 @@ h1 { font-weight:300; color:#ffffff; width:68%; - padding-left:16%; - float:left; text-align:center; + margin:0 auto; } @@ -188,14 +182,11 @@ hr { border-bottom:0px solid; width:100%; opacity:0.5; - color:#aaaaaa; + background-color:#999999; height:1px; } .col1 { - width: 42%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:100; color:#606060; @@ -206,10 +197,8 @@ hr { } .col2 { - width: 45%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -225,7 +214,6 @@ hr { margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:22px; color:#606060; letter-spacing:0.03em; @@ -239,7 +227,6 @@ hr { margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; } @@ -293,9 +280,6 @@ h1 { } .col1 { - width: 95%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:300; color:#606060; @@ -305,12 +289,10 @@ h1 { } .col2 { - width: 95%; padding-top:2%; padding-bottom:5%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -339,7 +321,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -353,8 +334,7 @@ h1 { font-size:16px; letter-spacing:0.03em; line-height:23px; - width:90%; - float:left; + width:100%; background: url('/images/CaseStudy_blackrock_banner3.jpg'); } @@ -368,7 +348,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background: url('/images/CaseStudy_blackrock_banner4.jpg'); } @@ -382,7 +361,6 @@ h1 { letter-spacing:0.03em; line-height:23px; width:100%; - float:left; background:none; background-color:#666666; } @@ -395,7 +373,6 @@ h1 { padding-left:5%; padding-bottom:1%; padding-top:1%; - float:left; text-align:center; color:#ffffff; } diff --git a/static/css/style_box.css b/static/css/style_box.css index 56e0be4126..594a94a30d 100644 --- a/static/css/style_box.css +++ b/static/css/style_box.css @@ -62,7 +62,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -78,7 +77,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background: url('/images/CaseStudy_box_banner3.jpg'); background-size:100% auto; } @@ -92,7 +90,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background: url('/images/CaseStudy_box_banner4.jpg'); background-size:100% auto; } @@ -106,7 +103,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -117,9 +113,8 @@ h1 { font-weight:300; color:#ffffff; width:60%; - padding-left:19%; - float:left; text-align:center; + margin:0 auto; } .banner3text { @@ -127,8 +122,8 @@ h1 { font-weight:300; color:#ffffff; width:55%; - padding-left:21%; text-align:center; + margin:0 auto; } .banner4text { @@ -136,8 +131,8 @@ h1 { font-weight:300; color:#ffffff; width:55%; - padding-left:21%; text-align:center; + margin:0 auto; } .banner5text { @@ -145,9 +140,8 @@ h1 { font-weight:300; color:#ffffff; width:60%; - padding-left:19%; - float:left; text-align:center; + margin:0 auto; } @@ -184,16 +178,11 @@ hr { border-bottom:0px solid; width:100%; opacity:0.5; - color:#aaaaaa; + background-color:#999999; height:1px; } .col1 { - -width: 38%; -padding-left:5%; -padding-right:8%; -float:left; font-family:"Roboto", sans-serif; font-weight:100; color:#606060; @@ -204,11 +193,8 @@ font-size:14px; } .col2 { - -width: 44%; font-family:"Roboto", sans-serif; font-weight:300; -float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -226,7 +212,6 @@ font-size:14px; margin-bottom:6%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:22px; color:#606060; letter-spacing:0.03em; @@ -240,8 +225,6 @@ font-size:14px; margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; - } h4 { @@ -288,10 +271,6 @@ h1 { } .col1 { - width: 100%; - padding-left:5%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:300; color:#606060; @@ -301,13 +280,10 @@ h1 { } .col2 { - width: 100%; - padding-left:5%; padding-top:5%; padding-bottom:5%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -337,7 +313,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -352,7 +327,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background: url('/images/CaseStudy_box_banner3.jpg'); } @@ -366,7 +340,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background: url('/images/CaseStudy_box_banner4.jpg'); } @@ -381,7 +354,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -391,9 +363,8 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; - float:left; text-align:center; + margin:0 auto; color:#ffffff; } @@ -402,8 +373,8 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; text-align:center; + margin:0 auto; } .banner3text { @@ -411,8 +382,8 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; text-align:center; + margin:0 auto; } .banner5text { @@ -420,9 +391,8 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; - float:left; text-align:center; + margin:0 auto; color:#ffffff; } diff --git a/static/css/style_buffer.css b/static/css/style_buffer.css index af0fa5214c..7a5eb51914 100755 --- a/static/css/style_buffer.css +++ b/static/css/style_buffer.css @@ -61,7 +61,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -79,7 +78,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background: url('/images/CaseStudy_buffer_banner1.jpg'); background-size:100% auto; } @@ -93,7 +91,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background: url('/images/CaseStudy_buffer_banner4.jpg'); background-size:100% auto; } @@ -107,7 +104,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -118,9 +114,8 @@ h1 { font-weight:300; color:#ffffff; width:60%; - padding-left:19%; - float:left; text-align:center; + margin:0 auto; } .banner3text { @@ -128,8 +123,8 @@ h1 { font-weight:300; color:#ffffff; width:70%; - padding-left:15%; text-align:center; + margin:0 auto; } .banner4text { @@ -137,8 +132,8 @@ h1 { font-weight:300; color:#ffffff; width:55%; - padding-left:21%; text-align:center; + margin:0 auto; } .banner5text { @@ -146,9 +141,8 @@ h1 { font-weight:300; color:#ffffff; width:60%; - padding-left:19%; - float:left; text-align:center; + margin:0 auto; } @@ -185,16 +179,11 @@ hr { border-bottom:0px solid; width:100%; opacity:0.5; - color:#aaaaaa; + background-color:#999999; height:1px; } .col1 { - -width: 38%; -padding-left:5%; -padding-right:8%; -float:left; font-family:"Roboto", sans-serif; font-weight:100; color:#606060; @@ -205,11 +194,8 @@ font-size:14px; } .col2 { - -width: 44%; font-family:"Roboto", sans-serif; font-weight:300; -float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -227,7 +213,6 @@ font-size:14px; margin-bottom:6%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:22px; color:#606060; letter-spacing:0.03em; @@ -241,8 +226,6 @@ font-size:14px; margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; - } h4 { @@ -289,10 +272,6 @@ h1 { } .col1 { - width: 100%; - padding-left:5%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:300; color:#606060; @@ -302,13 +281,10 @@ h1 { } .col2 { - width: 100%; - padding-left:5%; padding-top:5%; padding-bottom:5%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -338,7 +314,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -355,8 +330,7 @@ h1 { width:80%; padding-left:15%; padding-right:10%; - float:left; - background: url('/images/CaseStudy_buffer_banner1.jpg); + background: url('/images/CaseStudy_buffer_banner1.jpg'); } .banner4 { @@ -369,7 +343,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background: url('/images/CaseStudy_buffer_banner4.jpg'); } @@ -384,7 +357,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -395,7 +367,6 @@ h1 { color:#ffffff; width:80%; padding-left:10%; - float:left; text-align:center; color:#ffffff; } @@ -417,8 +388,8 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; text-align:center; + margin:0 auto; } .banner5text { @@ -426,9 +397,8 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; - float:left; text-align:center; + margin:0 auto; color:#ffffff; } diff --git a/static/css/style_crowdfire.css b/static/css/style_crowdfire.css index fbfff0c5d4..0e661cf46f 100644 --- a/static/css/style_crowdfire.css +++ b/static/css/style_crowdfire.css @@ -65,7 +65,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:repeat; @@ -83,7 +82,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background: url('/images/CaseStudy_crowdfire_banner3.jpg'); background-size:100% auto; } @@ -97,7 +95,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background: url('/images/CaseStudy_crowdfire_banner4.jpg'); background-size:100% auto; } @@ -111,7 +108,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:35px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -122,9 +118,8 @@ h1 { font-weight:300; color:#ffffff; width:65%; - padding-left:18%; - float:left; text-align:center; + margin:0 auto; } .banner3text { @@ -132,8 +127,8 @@ h1 { font-weight:300; color:#ffffff; width:75%; - padding-left:13%; text-align:center; + margin:0 auto; } .banner4text { @@ -141,8 +136,8 @@ h1 { font-weight:300; color:#ffffff; width:65%; - padding-left:17%; text-align:center; + margin:0 auto; } .banner5text { @@ -150,9 +145,8 @@ h1 { font-weight:300; color:#ffffff; width:68%; - padding-left:16%; - float:left; text-align:center; + margin:0 auto; } @@ -188,14 +182,11 @@ hr { border-bottom:0px solid; width:100%; opacity:0.5; - color:#aaaaaa; + background-color:#999999; height:1px; } .col1 { - width: 48%; - padding-right:5%; - float:left; font-family:"Roboto", sans-serif; font-weight:100; color:#606060; @@ -206,10 +197,8 @@ hr { } .col2 { - width: 42%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -225,7 +214,6 @@ hr { margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:22px; color:#606060; letter-spacing:0.03em; @@ -239,8 +227,6 @@ hr { margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; - } h4 { @@ -293,9 +279,6 @@ h1 { } .col1 { - width: 95%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:300; color:#606060; @@ -305,12 +288,10 @@ h1 { } .col2 { - width: 95%; padding-top:2%; padding-bottom:5%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -339,7 +320,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -353,8 +333,7 @@ h1 { font-size:16px; letter-spacing:0.03em; line-height:23px; - width:90%; - float:left; + width:100%; background: url('/images/CaseStudy_crowdfire_banner3.jpg'); } @@ -368,7 +347,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background: url('/images/CaseStudy_crowdfire_banner4.jpg'); } @@ -382,7 +360,6 @@ h1 { letter-spacing:0.03em; line-height:23px; width:100%; - float:left; background:none; background-color:#666666; } @@ -392,12 +369,11 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; padding-bottom:1%; padding-top:1%; - float:left; text-align:center; color:#ffffff; + margin:0 auto; } .banner3text { @@ -405,10 +381,10 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; padding-top:5%; padding-bottom:5%; text-align:center; + margin:0 auto; } .banner4text { @@ -416,11 +392,10 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; - padding-right:10%; padding-top:3%; padding-bottom:3%; text-align:center; + margin:0 auto; } .banner5text { @@ -428,10 +403,10 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; padding-top:3%; padding-bottom:3%; text-align:center; + margin:0 auto; } .fullcol { diff --git a/static/css/style_golfnow.css b/static/css/style_golfnow.css index bbe4056098..fe7d22727b 100644 --- a/static/css/style_golfnow.css +++ b/static/css/style_golfnow.css @@ -61,7 +61,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -79,7 +78,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background: url('/images/CaseStudy_golfnow_banner3.jpg'); background-size:100% auto; } @@ -93,7 +91,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background: url('/images/CaseStudy_golfnow_banner4.jpg'); background-size:100% auto; } @@ -107,7 +104,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -118,9 +114,8 @@ h1 { font-weight:300; color:#ffffff; width:60%; - padding-left:19%; - float:left; text-align:center; + margin:0 auto; } .banner3text { @@ -128,8 +123,8 @@ h1 { font-weight:300; color:#ffffff; width:70%; - padding-left:15%; text-align:center; + margin:0 auto; } .banner4text { @@ -137,8 +132,8 @@ h1 { font-weight:300; color:#ffffff; width:55%; - padding-left:21%; text-align:center; + margin:0 auto; } .banner5text { @@ -146,9 +141,8 @@ h1 { font-weight:300; color:#ffffff; width:60%; - padding-left:19%; - float:left; text-align:center; + margin:0 auto; } @@ -185,16 +179,11 @@ hr { border-bottom:0px solid; width:100%; opacity:0.5; - color:#aaaaaa; + background-color:#999999; height:1px; } .col1 { - -width: 38%; -padding-left:5%; -padding-right:8%; -float:left; font-family:"Roboto", sans-serif; font-weight:100; color:#606060; @@ -205,11 +194,8 @@ font-size:14px; } .col2 { - -width: 44%; font-family:"Roboto", sans-serif; font-weight:300; -float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -227,7 +213,6 @@ font-size:14px; margin-bottom:6%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:22px; color:#606060; letter-spacing:0.03em; @@ -241,8 +226,6 @@ font-size:14px; margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; - } h4 { @@ -289,10 +272,6 @@ h1 { } .col1 { - width: 100%; - padding-left:5%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:300; color:#606060; @@ -302,13 +281,10 @@ h1 { } .col2 { - width: 100%; - padding-left:5%; padding-top:5%; padding-bottom:5%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -338,7 +314,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -353,9 +328,7 @@ h1 { letter-spacing:0.03em; line-height:24px; width:80%; - padding-left:15%; - padding-right:10%; - float:left; + margin:0 auto; background: url('/images/CaseStudy_golfnow_banner3.jpg'); } @@ -369,7 +342,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background: url('/images/CaseStudy_golfnow_banner4.jpg'); } @@ -384,7 +356,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -394,9 +365,8 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; - float:left; text-align:center; + margin:0 auto; color:#ffffff; } @@ -405,11 +375,10 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:2%; - padding-right:10%; padding-top:5%; padding-bottom:5%; text-align:center; + margin:0 auto; } .banner4text { @@ -417,8 +386,8 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; text-align:center; + margin:0 auto; } .banner5text { @@ -426,9 +395,8 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; - float:left; text-align:center; + margin:0 auto; color:#ffffff; } diff --git a/static/css/style_haufegroup.css b/static/css/style_haufegroup.css index 1a8dc502fd..fab6e79572 100644 --- a/static/css/style_haufegroup.css +++ b/static/css/style_haufegroup.css @@ -65,7 +65,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:repeat; @@ -83,7 +82,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background: url('/images/CaseStudy_haufegroup_banner3.jpg'); background-size:100% auto; } @@ -97,7 +95,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background: url('/images/CaseStudy_haufegroup_banner4.jpg'); background-size:100% auto; } @@ -111,7 +108,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -122,9 +118,8 @@ h1 { font-weight:300; color:#ffffff; width:60%; - padding-left:20%; - float:left; text-align:center; + margin:0 auto; } .banner3text { @@ -132,8 +127,8 @@ h1 { font-weight:300; color:#ffffff; width:70%; - padding-left:15%; text-align:center; + margin:0 auto; } .banner4text { @@ -141,8 +136,8 @@ h1 { font-weight:300; color:#ffffff; width:65%; - padding-left:17%; text-align:center; + margin:0 auto; } .banner5text { @@ -150,9 +145,8 @@ h1 { font-weight:300; color:#ffffff; width:68%; - padding-left:16%; - float:left; text-align:center; + margin:0 auto; } @@ -188,14 +182,11 @@ hr { border-bottom:0px solid; width:100%; opacity:0.5; - color:#aaaaaa; + background-color:#999999; height:1px; } .col1 { - width: 43%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:100; color:#606060; @@ -206,10 +197,8 @@ hr { } .col2 { - width: 41%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -225,7 +214,6 @@ hr { margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:22px; color:#606060; letter-spacing:0.03em; @@ -239,8 +227,6 @@ hr { margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; - } h4 { @@ -293,9 +279,6 @@ h1 { } .col1 { - width: 95%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:300; color:#606060; @@ -305,12 +288,10 @@ h1 { } .col2 { - width: 95%; padding-top:2%; padding-bottom:5%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -339,7 +320,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -354,7 +334,7 @@ h1 { letter-spacing:0.03em; line-height:23px; width:90%; - float:left; + margin:0 auto; background: url('/images/CaseStudy_haufegroup_banner3.jpg'); } @@ -368,7 +348,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background: url('/images/CaseStudy_haufegroup_banner4.jpg'); } @@ -382,7 +361,6 @@ h1 { letter-spacing:0.03em; line-height:23px; width:100%; - float:left; background:none; background-color:#666666; } @@ -392,10 +370,9 @@ h1 { font-weight:300; color:#ffffff; width:90%; - padding-left:5%; padding-bottom:1%; padding-top:1%; - float:left; + margin:0 auto; text-align:center; color:#ffffff; } diff --git a/static/css/style_huawei.css b/static/css/style_huawei.css index a1c86aec41..0d13e76b72 100644 --- a/static/css/style_huawei.css +++ b/static/css/style_huawei.css @@ -65,7 +65,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:repeat; @@ -83,7 +82,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background: url('/images/CaseStudy_huawei_banner3.jpg'); background-size:100% auto; } @@ -97,7 +95,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background: url('/images/CaseStudy_huawei_banner4.jpg'); background-size:100% auto; } @@ -111,7 +108,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:35px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -122,9 +118,8 @@ h1 { font-weight:300; color:#ffffff; width:65%; - padding-left:18%; - float:left; text-align:center; + margin:0 auto; } .banner3text { @@ -132,8 +127,8 @@ h1 { font-weight:300; color:#ffffff; width:75%; - padding-left:13%; text-align:center; + margin:0 auto; } .banner4text { @@ -141,8 +136,8 @@ h1 { font-weight:300; color:#ffffff; width:65%; - padding-left:17%; text-align:center; + margin:0 auto; } .banner5text { @@ -150,9 +145,8 @@ h1 { font-weight:300; color:#ffffff; width:68%; - padding-left:16%; - float:left; text-align:center; + margin:0 auto; } @@ -188,14 +182,11 @@ hr { border-bottom:0px solid; width:100%; opacity:0.5; - color:#aaaaaa; + background-color:#999999; height:1px; } .col1 { - width: 42%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:100; color:#606060; @@ -206,10 +197,8 @@ hr { } .col2 { - width: 45%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -225,7 +214,6 @@ hr { margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:22px; color:#606060; letter-spacing:0.03em; @@ -239,7 +227,6 @@ hr { margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; } @@ -293,9 +280,6 @@ h1 { } .col1 { - width: 95%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:300; color:#606060; @@ -305,12 +289,10 @@ h1 { } .col2 { - width: 95%; padding-top:2%; padding-bottom:5%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -339,7 +321,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -353,8 +334,7 @@ h1 { font-size:16px; letter-spacing:0.03em; line-height:23px; - width:90%; - float:left; + width:100%; background: url('/images/CaseStudy_huawei_banner3.jpg'); } @@ -368,7 +348,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background: url('/images/CaseStudy_huawei_banner4.jpg'); } @@ -382,7 +361,6 @@ h1 { letter-spacing:0.03em; line-height:23px; width:100%; - float:left; background:none; background-color:#666666; } @@ -392,11 +370,10 @@ h1 { font-weight:300; color:#ffffff; width:90%; - padding-left:5%; padding-bottom:1%; padding-top:1%; - float:left; text-align:center; + margin:0 auto; color:#ffffff; } @@ -405,10 +382,10 @@ h1 { font-weight:300; color:#ffffff; width:90%; - padding-left:5%; padding-top:5%; padding-bottom:5%; text-align:center; + margin:0 auto; } .banner4text { @@ -416,10 +393,10 @@ h1 { font-weight:300; color:#ffffff; width:90%; - padding-left:5%; padding-top:3%; padding-bottom:3%; text-align:center; + margin:0 auto; } .banner5text { @@ -427,10 +404,10 @@ h1 { font-weight:300; color:#ffffff; width:90%; - padding-left:5%; padding-top:3%; padding-bottom:3%; text-align:center; + margin:0 auto; } .fullcol { diff --git a/static/css/style_peardeck.css b/static/css/style_peardeck.css index b3ae92f9b6..f0cb5b9bdc 100644 --- a/static/css/style_peardeck.css +++ b/static/css/style_peardeck.css @@ -61,7 +61,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -79,7 +78,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background: url('/images/CaseStudy_peardeck_banner1.jpg'); background-size:100% auto; } @@ -93,7 +91,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background: url('/images/CaseStudy_peardeck_banner2.jpg'); background-size:100% auto; } @@ -107,7 +104,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -118,9 +114,8 @@ h1 { font-weight:300; color:#ffffff; width:60%; - padding-left:19%; - float:left; text-align:center; + margin:0 auto; } .banner3text { @@ -128,8 +123,8 @@ h1 { font-weight:300; color:#ffffff; width:70%; - padding-left:15%; text-align:center; + margin:0 auto; } .banner4text { @@ -137,8 +132,8 @@ h1 { font-weight:300; color:#ffffff; width:55%; - padding-left:21%; text-align:center; + margin:0 auto; } .banner5text { @@ -146,9 +141,8 @@ h1 { font-weight:300; color:#ffffff; width:60%; - padding-left:19%; - float:left; text-align:center; + margin:0 auto; } @@ -185,16 +179,11 @@ hr { border-bottom:0px solid; width:100%; opacity:0.5; - color:#aaaaaa; + background-color:#999999; height:1px; } .col1 { - -width: 38%; -padding-left:5%; -padding-right:8%; -float:left; font-family:"Roboto", sans-serif; font-weight:100; color:#606060; @@ -205,11 +194,8 @@ font-size:14px; } .col2 { - -width: 44%; font-family:"Roboto", sans-serif; font-weight:300; -float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -227,7 +213,6 @@ font-size:14px; margin-bottom:6%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:22px; color:#606060; letter-spacing:0.03em; @@ -241,7 +226,6 @@ font-size:14px; margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; } @@ -289,10 +273,6 @@ h1 { } .col1 { - width: 100%; - padding-left:5%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:300; color:#606060; @@ -302,13 +282,10 @@ h1 { } .col2 { - width: 100%; - padding-left:5%; padding-top:5%; padding-bottom:5%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -338,7 +315,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -352,10 +328,7 @@ h1 { font-size:18px; letter-spacing:0.03em; line-height:24px; - width:80%; - padding-left:15%; - padding-right:10%; - float:left; + width:100%; background: url('/images/CaseStudy_peardeck_banner3.jpg'); } @@ -369,7 +342,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background: url('/images/CaseStudy_peardeck_banner2.jpg'); } @@ -384,7 +356,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -394,9 +365,8 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; - float:left; text-align:center; + margin:0 auto; color:#ffffff; } @@ -405,11 +375,10 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:2%; - padding-right:10%; padding-top:5%; padding-bottom:5%; text-align:center; + margin:0 auto; } .banner4text { @@ -417,8 +386,8 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; text-align:center; + margin:0 auto; } .banner5text { @@ -426,9 +395,8 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; - float:left; text-align:center; + margin:0 auto; color:#ffffff; } diff --git a/static/css/style_wink.css b/static/css/style_wink.css index 08a044933f..2b2203aeef 100755 --- a/static/css/style_wink.css +++ b/static/css/style_wink.css @@ -56,7 +56,6 @@ h1 { font-size:19px; letter-spacing:0.03em; line-height:28px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -74,7 +73,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background: url('/images/CaseStudy_wink_banner3.jpg'); background-size:100% auto; } @@ -88,7 +86,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background: url('/images/CaseStudy_wink_banner4.jpg'); background-size:100% auto; } @@ -102,7 +99,6 @@ h1 { font-size:21px; letter-spacing:0.03em; line-height:32px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -113,9 +109,8 @@ h1 { font-weight:300; color:#ffffff; width:62%; - padding-left:18%; - float:left; text-align:center; + margin:0 auto; } .banner3text { @@ -123,8 +118,8 @@ h1 { font-weight:300; color:#ffffff; width:70%; - padding-left:15%; text-align:center; + margin:0 auto; } .banner4text { @@ -132,8 +127,8 @@ h1 { font-weight:300; color:#ffffff; width:60%; - padding-left:20%; text-align:center; + margin:0 auto; } .banner5text { @@ -141,9 +136,8 @@ h1 { font-weight:300; color:#ffffff; width:65%; - padding-left:16%; - float:left; text-align:center; + margin:0 auto; } @@ -180,16 +174,11 @@ hr { border-bottom:0px solid; width:100%; opacity:0.5; - color:#aaaaaa; + background-color:#999999; height:1px; } .col1 { - -width: 38%; -padding-left:5%; -padding-right:8%; -float:left; font-family:"Roboto", sans-serif; font-weight:100; color:#606060; @@ -200,11 +189,8 @@ font-size:14px; } .col2 { - -width: 44%; font-family:"Roboto", sans-serif; font-weight:300; -float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -220,7 +206,6 @@ font-size:14px; margin-bottom:6%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:22px; color:#606060; letter-spacing:0.03em; @@ -234,8 +219,6 @@ font-size:14px; margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; - } h4 { @@ -282,10 +265,6 @@ h1 { } .col1 { - width: 100%; - padding-left:5%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:300; color:#606060; @@ -295,13 +274,10 @@ h1 { } .col2 { - width: 100%; - padding-left:5%; padding-top:5%; padding-bottom:5%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -331,7 +307,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -345,10 +320,9 @@ h1 { font-size:18px; letter-spacing:0.03em; line-height:24px; - width:80%; + width:100%; padding-left:15%; padding-right:10%; - float:left; background: url('/images/CaseStudy_wink_banner3.jpg'); } @@ -362,7 +336,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background: url('/images/CaseStudy_wink_banner4.jpg'); } @@ -377,7 +350,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -387,9 +359,8 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; - float:left; text-align:center; + margin:0 auto; color:#ffffff; } @@ -398,11 +369,10 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:2%; - padding-right:10%; padding-top:5%; padding-bottom:5%; text-align:center; + margin:0 auto; } .banner4text { @@ -410,8 +380,8 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; text-align:center; + margin:0 auto; } .banner5text { @@ -419,9 +389,8 @@ h1 { font-weight:300; color:#ffffff; width:80%; - padding-left:10%; - float:left; text-align:center; + margin:0 auto; color:#ffffff; } diff --git a/static/css/style_zalando.css b/static/css/style_zalando.css index d39a553759..baac353876 100644 --- a/static/css/style_zalando.css +++ b/static/css/style_zalando.css @@ -65,7 +65,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:repeat; @@ -83,7 +82,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background: url('/images/CaseStudy_zalando_banner3.jpg'); background-size:100% auto; } @@ -97,7 +95,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:34px; - float:left; background: url('/images/CaseStudy_zalando_banner4.jpg'); background-size:100% auto; } @@ -111,7 +108,6 @@ h1 { font-size:24px; letter-spacing:0.03em; line-height:35px; - float:left; background-size:100% auto; background-color:#666666; background-repeat:no-repeat; @@ -122,9 +118,8 @@ h1 { font-weight:300; color:#ffffff; width:70%; - padding-left:15%; - float:left; text-align:center; + margin:0 auto; } .banner3text { @@ -132,8 +127,8 @@ h1 { font-weight:300; color:#ffffff; width:75%; - padding-left:13%; text-align:center; + margin:0 auto; } .banner4text { @@ -141,8 +136,8 @@ h1 { font-weight:300; color:#ffffff; width:65%; - padding-left:17%; text-align:center; + margin:0 auto; } .banner5text { @@ -150,9 +145,8 @@ h1 { font-weight:300; color:#ffffff; width:68%; - padding-left:16%; - float:left; text-align:center; + margin:0 auto; } @@ -188,14 +182,11 @@ hr { border-bottom:0px solid; width:100%; opacity:0.5; - color:#aaaaaa; + background-color:#999999; height:1px; } .col1 { - width: 45%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:100; color:#606060; @@ -206,10 +197,8 @@ hr { } .col2 { - width: 40%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -225,7 +214,6 @@ hr { margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:22px; color:#606060; letter-spacing:0.03em; @@ -239,8 +227,6 @@ hr { margin-bottom:4%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; - } h4 { @@ -293,9 +279,6 @@ h1 { } .col1 { - width: 95%; - padding-right:8%; - float:left; font-family:"Roboto", sans-serif; font-weight:300; color:#606060; @@ -305,12 +288,10 @@ h1 { } .col2 { - width: 95%; padding-top:2%; padding-bottom:5%; font-family:"Roboto", sans-serif; font-weight:300; - float:left; line-height:20px; color:#606060; letter-spacing:0.03em; @@ -339,7 +320,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background:none; background-color:#666666; } @@ -353,8 +333,7 @@ h1 { font-size:16px; letter-spacing:0.03em; line-height:23px; - width:90%; - float:left; + width:100%; background: url('/images/CaseStudy_zalando_banner3.jpg'); } @@ -368,7 +347,6 @@ h1 { letter-spacing:0.03em; line-height:24px; width:100%; - float:left; background: url('/images/CaseStudy_zalando_banner4.jpg'); } @@ -382,7 +360,6 @@ h1 { letter-spacing:0.03em; line-height:23px; width:100%; - float:left; background:none; background-color:#666666; } @@ -395,7 +372,6 @@ h1 { padding-left:5%; padding-bottom:1%; padding-top:1%; - float:left; text-align:center; color:#ffffff; } From 95953bbe8e154ce4c71a11d2eaea90768031fffa Mon Sep 17 00:00:00 2001 From: Luc Perkins Date: Sat, 17 Nov 2018 03:22:53 +0800 Subject: [PATCH 094/222] Remove resources/ folder from Git (#10561) --- .gitignore | 1 + ...s_a6e533854c4de092afe9278041939937.content | 1943 ---------------- ...sass_a6e533854c4de092afe9278041939937.json | 1 - ...s_a6e533854c4de092afe9278041939937.content | 1946 ----------------- ...sass_a6e533854c4de092afe9278041939937.json | 1 - 5 files changed, 1 insertion(+), 3891 deletions(-) delete mode 100644 resources/_gen/assets/sass/cn/sass/styles.sass_a6e533854c4de092afe9278041939937.content delete mode 100644 resources/_gen/assets/sass/cn/sass/styles.sass_a6e533854c4de092afe9278041939937.json delete mode 100644 resources/_gen/assets/sass/sass/styles.sass_a6e533854c4de092afe9278041939937.content delete mode 100644 resources/_gen/assets/sass/sass/styles.sass_a6e533854c4de092afe9278041939937.json diff --git a/.gitignore b/.gitignore index e78fa72d9a..ebf3b38926 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ nohup.out # Hugo output public/ +resources/ # User-specific editorconfig files .editorconfig diff --git a/resources/_gen/assets/sass/cn/sass/styles.sass_a6e533854c4de092afe9278041939937.content b/resources/_gen/assets/sass/cn/sass/styles.sass_a6e533854c4de092afe9278041939937.content deleted file mode 100644 index 4ea962f457..0000000000 --- a/resources/_gen/assets/sass/cn/sass/styles.sass_a6e533854c4de092afe9278041939937.content +++ /dev/null @@ -1,1943 +0,0 @@ -html, body { - margin: 0; - padding: 0; } - -input, button { - outline: none; } - -button { - cursor: pointer; } - -ul, li { - list-style: none; } - -ul { - margin: 0; - padding: 0; } - -a { - text-decoration: none; } - -.clear { - display: block; - clear: both; } - -.light-text { - color: white; } - -.right { - float: right; } - -.left { - float: left; } - -.center { - text-align: center; } - -*, .button { - box-sizing: border-box; - font-family: "Roboto", sans-serif; - background: none; - margin: 0; - border: 0; } - -body { - font-family: "Roboto", sans-serif; } - -h1, h2, h5, p { - font-weight: 300; } - -h3, h4 { - font-weight: 400; } - -html, body { - margin: 0; - padding: 0; } - -input, button { - outline: none; } - -button { - cursor: pointer; } - -ul, li { - list-style: none; } - -ul { - margin: 0; - padding: 0; } - -a { - text-decoration: none; } - -.clear { - display: block; - clear: both; } - -.light-text { - color: white; } - -.right { - float: right; } - -.left { - float: left; } - -.center { - text-align: center; } - -h1 { - font-size: 32px; - line-height: 40px; } - -h2 { - font-size: 28px; - line-height: 60px; } - -h3 { - font-size: 24px; - line-height: 32px; } - -h4 { - font-size: 20px; - line-height: 40px; } - -h5 { - font-size: 16px; - line-height: 36px; } - -p { - font-size: 14px; - line-height: 22px; } - -section, header, #vendorStrip { - padding-left: 20px; - padding-right: 20px; } - section main, header main, #vendorStrip main { - width: 100%; - max-width: 100%; } - -header { - height: 80px; } - -.nav-buttons { - height: 80px; - line-height: 80px; } - .nav-buttons .button + * { - margin-left: 30px; } - -#hamburger { - width: 50px; - height: 50px; } - -#mainNav { - padding: 140px 0 30px; } - #mainNav h5 { - margin-bottom: 1em; } - #mainNav h3 { - margin-bottom: 0.6em; } - #mainNav .nav-box { - width: 20%; } - #mainNav .nav-box + .nav-box { - margin-left: calc(20% / 3); } - #mainNav main + main { - margin-top: 60px; } - #mainNav .left .button { - height: 50px; - line-height: 50px; - font-size: 18px; } - -.open-nav #tryKubernetes, .y-enough #tryKubernetes { - margin-left: 30px; } - -#hero { - padding-top: 80px; } - -#docs #hero h1, #docs #hero h5 { - padding-left: 20px; - padding-right: 20px; } - -#vendorStrip { - height: 88px; - line-height: 88px; - font-size: 16px; } - -body { - background-color: white; } - -section { - position: relative; - background-color: white; } - -section main, header main, footer main { - position: relative; - margin: auto; } - -p { - font-size: 14px; - font-weight: 400; } - -.button { - display: inline-block; - border-radius: 6px; - padding: 0 20px; - line-height: 40px; - color: white; - background-color: #3371e3; - text-decoration: none; } - -#cellophane { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - display: none; } - -header { - position: fixed; - top: 0; - left: 0; - width: 100%; - z-index: 8888; - background-color: transparent; - box-shadow: 0 0 0 transparent; - overflow: hidden; - transition: 0.3s; - text-align: center; } - -.logo { - position: relative; - float: left; - display: block; - width: 180px; - height: 88px; - top: 0; - left: 0; - transform: none; - background-image: url(/images/nav_logo.svg); - background-size: contain; - background-position: center center; - background-repeat: no-repeat; } - -#docs .flyout-button { - position: fixed; - top: 20px; - left: 20px; - width: 50px; - height: 50px; - background-image: url(/images/toc_icon.png); - background-position: center center; - background-repeat: no-repeat; - background-size: auto; - border-radius: 50%; - transition: 0.3s; - z-index: 99999; } - -#docs.open-nav .flyout-button { - display: none; } - -#docs .logo { - position: absolute; - top: 40px; - left: 50%; - transform: translate(-50%, -50%); - display: block; - width: 45px; - height: 44px; - background-image: url(/images/favicon.png); } - -#docs.flip-nav .flyout-button { - background-image: url(/images/toc_icon_grey.png); } - -.nav-buttons { - float: right; } - -#viewDocs, #tryKubernetes { - display: none; } - -#viewDocs { - border: 2px solid white; - background-color: transparent; - transition: 0.3s; } - #viewDocs:hover { - background-color: white; - color: #303030; } - -#tryKubernetes { - width: 0; - padding: 0 0; - border: 1px solid transparent; - background-color: transparent; - text-align: center; - white-space: nowrap; - vertical-align: middle; - overflow: hidden; - transition: 0.3s; } - -#hamburger { - display: inline-block; - position: relative; - vertical-align: middle; - padding: 0; - border: 0; - background: none; } - #hamburger div, #hamburger:before, #hamburger:after { - position: absolute; - left: 15%; - width: 70%; - height: 2px; - background-color: #3371e3; - transition: 0.3s; - content: ""; } - #hamburger div { - top: calc(50% - 1px); } - #hamburger:before { - top: 24%; } - #hamburger:after { - bottom: 24%; } - #hamburger:hover div, #hamburger:hover:before, #hamburger:hover:after { - background-color: white; } - -#mainNav h5 { - color: #3371e3; - font-weight: normal; } - -#mainNav main { - white-space: nowrap; - overflow: hidden; - clear: both; } - -#mainNav .nav-box { - float: left; - white-space: normal; } - -#mainNav h3 a { - color: #3371e3; - text-decoration: none; } - -ul.global-nav { - display: none; } - ul.global-nav li { - display: inline-block; - margin-right: 14px; } - ul.global-nav li a { - color: #fff; - font-weight: 400; - padding: 0; - position: relative; } - ul.global-nav li a.active:after { - position: absolute; - width: 100%; - height: 2px; - content: ''; - bottom: -4px; - left: 0; - background: #fff; } - ul.global-nav li a .ui-icon { - filter: brightness(0) invert(1); } - ul.global-nav li ul { - display: none; - position: fixed; - top: 40px; - text-align: left; } - ul.global-nav li ul li { - display: block; - height: 28px; } - ul.global-nav li ul li a { - background: #303030; - color: #fff; - padding: 7px; } - ul.global-nav li ul li:last-child a { - border-radius: 7px; } - ul.global-nav li:hover ul { - display: block; } - -.flip-nav ul.global-nav li a, -.open-nav ul.global-nav li a { - color: #303030; } - -.flip-nav ul.global-nav li a .ui-icon { - filter: brightness(0); } - -.flip-nav ul.global-nav li ul li a { - background: #fff; - color: #303030; } - -.flip-nav ul.global-nav li a.active:after, -.flip-nav ul.global-nav li ul li a.active:after, -.open-nav ul.global-nav li a.active:after { - background: #3371e3; } - -.flip-nav header { - background-color: white; } - -.open-nav body { - overflow: hidden; } - -.open-nav #cellophane { - display: block; - z-index: 9998; } - -.open-nav header { - background-color: #e8e8e8; - z-index: 9999; } - -.open-nav #hamburger div { - opacity: 0; } - -.open-nav #hamburger:before, .open-nav #hamburger:after { - left: 12px; - transform-origin: 0 1px; } - -.open-nav #hamburger:before { - transform: rotate(45deg); } - -.open-nav #hamburger:after { - transform: rotate(-45deg); } - -.open-nav #tryKubernetes, .y-enough #tryKubernetes { - width: 150px; - background-color: #3371e3; - border-color: #3371e3; } - -.flip-nav header, .open-nav header { - box-shadow: 0 1px 2px #4c4c4c; } - -.flip-nav #viewDocs, .open-nav #viewDocs { - border-color: #303030; - color: #303030; } - .flip-nav #viewDocs:hover, .open-nav #viewDocs:hover { - border-color: #3371e3; - background-color: #3371e3; - color: white; } - -.flip-nav #hamburger:hover div, .flip-nav #hamburger:hover:before, .flip-nav #hamburger:hover:after, .open-nav #hamburger:hover div, .open-nav #hamburger:hover:before, .open-nav #hamburger:hover:after { - background-color: #303030; } - -#hero { - background-image: url(/images/texture.png); - background-color: #303030; - text-align: center; - padding-left: 0; - padding-right: 0; - margin-bottom: 0; - position: relative; } - #hero.bot-bar:after { - display: block; - margin-bottom: -20px; - height: 8px; - width: 100%; - background-color: rgba(255, 255, 255, 0.1); - content: ''; } - #hero.no-sub h5 { - display: none; } - #hero.no-sub h1 { - margin-bottom: 20px; } - -#home #hero:after { - display: none; } - -#vendorStrip { - position: relative; - background-color: rgba(255, 255, 255, 0.1); - font-weight: 100; - white-space: nowrap; - text-align: center; } - #vendorStrip li a { - color: rgba(255, 255, 255, 0.5); } - #vendorStrip li a.YAH { - color: white; - position: relative; } - -footer { - width: 100%; - background-image: url(/images/texture.png); - background-color: #303030; } - footer main { - padding: 20px 0; } - footer nav a { - width: 100%; - text-align: center; - display: inline-block; - margin: 10px 0; - font-size: 24px; - font-weight: 300; - color: white; - text-decoration: none; } - footer .social { - margin: 20px 0; } - footer .social div { - text-align: center; - margin-bottom: 20px; } - footer .social div:last-child { - margin: 30px 0; } - footer .social span { - display: block; - margin-bottom: 8px; } - footer .social input { - text-align: center; } - -#search, #wishField { - background-color: transparent; - padding: 10px; - font-size: 16px; - font-weight: 100; - color: white; - border: 1px solid white; - transition: 0.3s; } - #search:focus, #wishField:focus { - background-color: #f7f7f7; - color: #303030; } - -.social a { - display: inline-block; - background-image: url(/images/social_sprite.png); - background-repeat: no-repeat; - background-size: auto; - width: 50px; - height: 50px; - border-radius: 5px; - margin-right: 10px; } - .social a:hover { - background-color: #fff; } - .social a span { - position: absolute; - display: block; - height: 0; - overflow: hidden; } - .social a.button { - background-image: none; - width: auto; - height: auto; } - .social a.button:hover { - color: #3371e3; } - -a.twitter { - background-position: 0 0; } - a.twitter:hover { - background-position: 0 100%; } - -a.stack-overflow { - background-position: -50px 0; } - a.stack-overflow:hover { - background-position: -50px 100%; } - -a.slack { - background-position: -100px 0; } - a.slack:hover { - background-position: -100px 100%; } - -a.github { - background-position: -150px 0; } - a.github:hover { - background-position: -150px 100%; } - -a.mailing-list { - background-position: -200px 0; } - a.mailing-list:hover { - background-position: -200px 100%; } - -a.calendar { - background-position: -250px 0; } - a.calendar:hover { - background-position: -250px 100%; } - -#viewDocs { - display: none; } - -section { - background-color: white; } - -#hero { - background-color: #303030; } - #hero h5 { - margin: 20px 0; - line-height: 28px; } - -#vendorStrip { - position: relative; } - #vendorStrip ul { - float: left; } - #vendorStrip li { - display: inline-block; - height: 100%; } - #vendorStrip a { - display: block; - height: 100%; - color: white; - font-size: 0.75em; - font-weight: bold; } - #vendorStrip li + li { - margin-left: 0; } - -#docs #vendorStrip { - line-height: 44px; } - #docs #vendorStrip ul { - float: none; } - #docs #vendorStrip #searchBox { - float: none; - display: block; - width: 80%; - margin: 0 auto; - height: 44px; - line-height: 44px; - position: relative; } - #docs #vendorStrip #searchBox:before { - position: absolute; - width: 15px; - height: 15px; - content: ''; - right: 8px; - top: 7px; - background-image: url(/images/search-icon.svg); - background-repeat: no-repeat; - background-size: 100% 100%; - z-index: 1; } - #docs #vendorStrip #search { - width: 100%; - padding: 0 10px; - height: 30px; - line-height: 30px; - font-size: 16px; - vertical-align: top; - background: #fff; - border: none; - border-radius: 4px; - position: relative; } - -#encyclopedia { - position: relative; - padding: 50px 20px 20px 20px; - overflow: hidden; - font-size: 14px; } - #encyclopedia > div { - height: 100%; } - -#docsToc { - position: fixed; - background-color: white; - top: 0; - left: 0; - width: 0; - height: 100vh; - overflow: hidden; - padding: 50px 0; - z-index: 999999; - transition: 0.3s; } - #docsToc .yah > .title { - background-color: #f7f7f7; - border-left: 3px solid #3371e3; - padding: 7.5px 10px 7.5px 18px; - margin-left: -3px; - color: #3371e3; } - -.open-toc body { - overflow: hidden; } - -.open-toc #docsToc { - padding: 50px 20px; - width: 400px; - max-width: 100vw; - overflow-y: auto; } - -.pi-accordion > .container:first-child > .item:first-child > .title:first-child { - padding-left: 0; - font-size: 1.5em; - font-weight: 700; } - -.pi-accordion > .container:first-child > .item.yah:first-child > .title:first-child { - margin-left: -20px !important; } - -.pi-accordion .item { - overflow: hidden; } - -.pi-accordion .title { - color: #303030; - position: relative; - padding: 7.5px 10px 7.5px 18px; - cursor: pointer; - transition: 0.3s; } - .pi-accordion .title:hover { - color: #3371e3; } - -.pi-accordion a.item > .title { - color: black; } - .pi-accordion a.item > .title:hover { - color: #3371e3; } - -.pi-accordion div.item > .title:before { - content: ""; - position: absolute; - top: 12px; - left: 2px; - border-style: solid; - border-width: 5px 0 5px 8px; - border-color: transparent transparent transparent #3371e3; - transform: rotate(0deg); - transition: 0.3s; } - -.pi-accordion .wrapper { - position: relative; - width: 100%; - transition: height 0.3s; } - -.pi-accordion .content { - padding-left: 20px; - opacity: 0; - transition: 0.3s; } - -.pi-accordion .item.on > .title:before { - transform: rotate(90deg); } - -.pi-accordion .item.on > .wrapper > .content { - opacity: 1; } - -dt { - margin-bottom: 8px; } - -dd { - margin-bottom: 16px; } - -.pi-pushmenu { - display: none; - position: fixed; - top: 0; - width: 100%; - height: 100%; - opacity: 0; - transition: opacity 0.3s; } - .pi-pushmenu.on { - opacity: 1; } - .pi-pushmenu .overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.4); } - .pi-pushmenu .sled { - position: absolute; - top: 0; - width: 0; - height: 100%; - background-color: white; - overflow: auto; - transition: 0.3s; } - .pi-pushmenu.on .sled { - width: 400px; - max-width: 100vw; } - .pi-pushmenu .top-bar { - height: 0; - line-height: 60px; - background-color: #444; } - .pi-pushmenu ul { - margin-top: 25px; } - .pi-pushmenu li { - position: relative; - display: block; - width: 100%; - min-height: 45px; - padding: 0 60px 0 20px; - border-bottom: 1px solid #cccccc; } - .pi-pushmenu a { - display: inline-block; - width: 100%; - height: 45px; - line-height: 45px; - font-family: "Roboto", sans-serif; - font-size: 20px; - color: #3371e3; } - .pi-pushmenu .button { - background: none; - padding: 0; } - .pi-pushmenu ul ul { - padding: 0 20px; } - .pi-pushmenu ul ul li { - min-height: 40px; } - .pi-pushmenu ul ul a { - height: 40px; - line-height: 40px; - font-size: 18px; - color: #555555; } - -.push-menu-close-button { - position: absolute; - top: 0; - right: 0; - width: 50px; - height: 50px; } - .push-menu-close-button:before, .push-menu-close-button:after { - content: ""; - position: absolute; - top: calc(50% - 1px); - left: 25%; - width: 50%; - height: 2px; - background-color: black; } - .push-menu-close-button:before { - transform: rotate(45deg); } - .push-menu-close-button:after { - transform: rotate(-45deg); } - -#docsContent { - position: relative; - float: right; - width: 100%; } - #docsContent * + h2, #docsContent * + h3, #docsContent * + h4, #docsContent * + h5, #docsContent * + h6 { - margin-top: 30px; } - #docsContent h1, #docsContent h2, #docsContent h3, #docsContent h4, #docsContent h5, #docsContent h6 { - line-height: normal; - font-weight: 500; - margin-bottom: 30px; - padding-bottom: 10px; } - #docsContent h1:before, #docsContent h2:before, #docsContent h3:before, #docsContent h4:before, #docsContent h5:before, #docsContent h6:before { - display: block; - content: " "; - margin-top: -100px; - height: 100px; - visibility: hidden; } - #docsContent h1, #docsContent h2 { - border-bottom: 1px solid #cccccc; } - #docsContent h1 { - font-size: 32px; - padding-right: 60px; } - #docsContent h2 { - font-size: 28px; } - #docsContent h3 { - font-size: 24px; - font-weight: 300; - margin-bottom: 5px; } - #docsContent h4 { - font-size: 20px; - margin-bottom: 0px; } - #docsContent h5, #docsContent h6 { - font-size: 16px; - font-weight: 500; } - #docsContent p { - font-size: 16px; - font-weight: 300; - line-height: 1.75em; } - #docsContent p + p { - margin-top: 10px; } - #docsContent code { - display: inline-block; - box-sizing: border-box; - background-color: #f7f7f7; - color: #303030; - font-family: "Roboto Mono", monospace; - vertical-align: baseline; - font-size: 14px; - font-weight: bold; - padding: 2px 4px; } - #docsContent a code { - color: #3371e3; - text-decoration: underline; } - #docsContent pre .pi, #docsContent pre .s { - margin: 0; - padding: 0; } - #docsContent .highlight code span, #docsContent code, #docsContent pre code { - font-family: "Roboto Mono", monospace; } - #docsContent code, #docsContent pre code { - color: #303030; } - #docsContent pre code { - padding: 0; } - #docsContent pre { - background-color: #f7f7f7; - display: block; - margin: 20px 0; - padding: 15px; - position: relative; - overflow-x: auto; } - #docsContent h1 code, #docsContent h2 code, #docsContent h3 code, #docsContent h4 code, #docsContent h5 code, #docsContent h6 code { - font-size: inherit; - background-color: transparent; } - #docsContent .includecode { - table-layout: fixed; } - #docsContent .includecode, #docsContent .includecode th, #docsContent .includecode td { - padding: 0 !important; } - #docsContent .includecode th { - text-align: right !important; - padding: 10px !important; } - #docsContent .includecode th a, #docsContent .includecode th a code { - color: white !important; - background-color: transparent !important; } - #docsContent .includecode pre { - margin: 0 !important; } - #docsContent ul li { - list-style: disc; } - #docsContent ol li { - list-style: decimal; } - #docsContent ul, #docsContent ol { - margin: 20px 0; - padding-left: 30px; - font-weight: 300; } - #docsContent ul ul, #docsContent ol ol, #docsContent ul ol, #docsContent ol ul { - margin: 0.75em 0; } - #docsContent li { - margin-bottom: 0.75em; - font-size: 16px; - line-height: 1.75em; } - #docsContent table { - width: 100%; - border: 1px solid #ccc; - border-spacing: 0; - margin-top: 30px; - margin-bottom: 30px; } - #docsContent thead, #docsContent tr:nth-child(even) { - background-color: #f7f7f7; } - #docsContent thead { - background-color: #555; - color: white; } - #docsContent th, #docsContent td { - padding: 8px; - text-align: left; - margin: 0; } - #docsContent th { - font-weight: normal; } - #docsContent td { - font-size: 0.85em; } - #docsContent #editPageButton { - position: absolute; - top: -25px; - right: 5px; - width: 50px; - height: 50px; - line-height: 50px; - border-radius: 50%; - white-space: nowrap; - text-indent: 50px; - overflow: hidden; - background: #3371e3 url(/images/icon-pencil.svg) no-repeat; - background-position: 12px 10px; - background-size: 29px 29px; } - #docsContent #markdown-toc, #docsContent #TableOfContents { - margin-bottom: 20px; } - #docsContent #markdown-toc ul, #docsContent #markdown-toc li, #docsContent #TableOfContents ul, #docsContent #TableOfContents li { - list-style: disc; - color: #3371e3; } - #docsContent #markdown-toc ul, #docsContent #TableOfContents ul { - padding: 0 15px; - margin: 0; } - #docsContent #markdown-toc li, #docsContent #TableOfContents li { - padding: 0; - line-height: 1.5em; - margin-bottom: 0; } - #docsContent #markdown-toc a, #docsContent #TableOfContents a { - position: relative; - color: #3371e3; - font-weight: 700; } - #docsContent img { - max-width: 100%; } - #docsContent #TableOfContents > ul > li { - list-style: none; } - #docsContent #TableOfContents ul, #docsContent #TableOfContents li { - list-style: disk; } - -.fixed footer { - position: fixed; - bottom: 0; } - -#miceType { - clear: both; - font-size: 11px; - line-height: 18px; - color: #aaa; } - -html.search #docsContent { - position: relative; - float: none; - width: 90%; - max-width: 850px; - margin: 0 auto; } - html.search #docsContent #editPageButton { - display: none; } - html.search #docsContent table { - border: 0; - margin-bottom: 0; } - html.search #docsContent td { - padding: 0; } - html.search #docsContent h1 { - margin-bottom: 0; - border-bottom: 0; - padding-bottom: 0; - padding-left: 8px; } - -#home.flip-nav .logo, #home.open-nav .logo { - background-image: url(/images/nav_logo2.svg); } - -#home #hero { - margin-bottom: 0; - padding-bottom: 1px; } - #home #hero main { - padding: 0 10px; - margin-bottom: 30px; } - #home #hero #vendorStrip { - display: none; } - -#oceanNodes { - padding-top: 60px; - padding-bottom: 60px; } - #oceanNodes a { - color: #3371e3; } - #oceanNodes main { - margin-bottom: 60px; - min-height: 160px; } - #oceanNodes .image-wrapper { - max-width: 75%; - margin: 0 auto 20px; - text-align: center; } - #oceanNodes .image-wrapper img { - width: 100%; - max-width: 160px; } - #oceanNodes main:first-child .image-wrapper { - max-width: 100%; } - #oceanNodes main:first-child .image-wrapper img { - max-width: 491px; } - #oceanNodes h3 { - margin-bottom: 30px; } - -#video { - height: 200px; } - -#video { - width: 100%; - position: relative; - background-position: center center; - background-size: cover; } - #video > .light-text { - display: none; - position: absolute; - top: 50%; - left: 75%; - width: 525px; - padding-right: 80px; - transform: translate(-50%, -50%); - color: white; } - #video h2 { - font-size: 32px; - line-height: 44px; - margin-bottom: 20px; } - #video p { - margin-bottom: 20px; } - #video #desktopKCButton { - position: relative; - font-size: 18px; - background-color: #303030; - border-radius: 8px; - color: #ffffff; - padding: 20px 10px 20px 10px; } - #video #desktopShowVideoButton { - position: relative; - font-size: 24px; - background-color: white; - border-radius: 8px; - color: #3371e3; - padding: 15px 30px 15px 80px; - margin-bottom: 15px; } - #video #desktopShowVideoButton:before { - content: ""; - position: absolute; - position: absolute; - top: 50%; - left: 40px; - transform: translate(-50%, -50%); - width: 0; - height: 0; - border-style: solid; - border-width: 10px 0 10px 20px; - border-color: transparent transparent transparent #3371e3; } - #video #mobileShowVideoButton { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 80px; - height: 80px; - border-radius: 50%; - background-color: transparent; - border: 5px solid rgba(255, 255, 255, 0.2); - overflow: visible; } - #video #mobileShowVideoButton:after { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - left: 40px; - content: ""; - width: 0; - height: 0; - border-style: solid; - border-width: 20px 0 20px 30px; - border-color: transparent transparent transparent #ffffff; } - -#videoPlayer { - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - background-color: rgba(0, 0, 0, 0.9); - display: none; } - #videoPlayer iframe { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 80vw; - height: 45vw; - max-width: 142.22222222vh; - max-height: 80vh; } - #videoPlayer #closeButton { - position: absolute; - top: 20px; - right: 20px; - width: 50px; - height: 50px; - border: 2px solid transparent; - transition: 0.3s; } - #videoPlayer #closeButton:before, #videoPlayer #closeButton:after { - content: ""; - position: absolute; - top: calc(50% - 1px); - left: 10%; - width: 80%; - height: 2px; - background-color: white; } - #videoPlayer #closeButton:before { - transform: rotate(45deg); } - #videoPlayer #closeButton:after { - transform: rotate(-45deg); } - #videoPlayer #closeButton:hover { - border-color: white; } - -#cncf { - padding-top: 60px; - padding-bottom: 140px; - background-image: url(/images/cncf-color.png); - background-position: center 100px; - background-repeat: no-repeat; - background-size: 300px; } - -#kubeweekly { - background-color: #f7f7f7; - padding: 60px; - background-size: auto; - font-family: "Roboto Mono", monospace !important; - font-size: 24px; - font-weight: bold; } - #kubeweekly h5 { - font-size: 20px; } - -.subscribe-button { - border-radius: 6px; - padding: 0 20px; - line-height: 31px; - color: white; - background-color: #3371e3; - text-decoration: none; - font-size: 14px; } - -#features { - padding-top: 140px; - background-color: #f7f7f7; - background-image: url(/images/wheel.png); - background-position: center 60px; - background-repeat: no-repeat; - background-size: auto; } - -.feature-box { - width: 100%; - overflow: hidden; - clear: both; } - .feature-box h4 { - line-height: normal; - margin-bottom: 15px; } - .feature-box > div:first-child { - float: left; } - .feature-box > div:last-child { - float: right; } - -#features h3 { - margin-bottom: 20px; } - -#features .feature-box { - margin-bottom: 0; } - #features .feature-box > div { - width: 100%; - margin-bottom: 40px; } - -#community.open-nav .logo, #community.flip-nav .logo, .gridPage.open-nav .logo, .gridPage.flip-nav .logo { - background-image: url(/images/nav_logo2.svg); } - -#community #hero, .gridPage #hero { - padding-bottom: 20px; } - -#community #mainContent, .gridPage #mainContent { - padding: 20px 0; } - #community #mainContent main, .gridPage #mainContent main { - max-width: none; } - #community #mainContent a, .gridPage #mainContent a { - color: #3371e3; } - #community #mainContent .content, .gridPage #mainContent .content { - margin-bottom: 30px; - padding: 30px 0; } - #community #mainContent .content h1, #community #mainContent .content h2, #community #mainContent .content h3, #community #mainContent .content h4, #community #mainContent .content h5, #community #mainContent .content h6, #community #mainContent .content p, .gridPage #mainContent .content h1, .gridPage #mainContent .content h2, .gridPage #mainContent .content h3, .gridPage #mainContent .content h4, .gridPage #mainContent .content h5, .gridPage #mainContent .content h6, .gridPage #mainContent .content p { - line-height: normal; - max-width: 1200px; - padding: 0 20px; - margin: 0 auto 20px; } - #community #mainContent .content:nth-child(even), .gridPage #mainContent .content:nth-child(even) { - background-color: #f7f7f7; } - #community #mainContent .company-logos, .gridPage #mainContent .company-logos { - text-align: center; - max-width: 1200px; - margin: 0 auto; } - #community #mainContent .company-logos img, .gridPage #mainContent .company-logos img { - width: auto; - margin: 10px; - background-color: #f7f7f7; } - #community #mainContent .partner-logos, .gridPage #mainContent .partner-logos { - text-align: center; - max-width: 1200px; - margin: 0 auto; } - #community #mainContent .partner-logos img, .gridPage #mainContent .partner-logos img { - width: auto; - margin: 10px; - background-color: #ffffff; - box-shadow: 0 5px 5px rgba(0, 0, 0, 0.24), 0 0 5px rgba(0, 0, 0, 0.12); } - #community #mainContent #calendarMeetings, .gridPage #mainContent #calendarMeetings { - position: relative; - width: 80vw; - height: 60vw; - max-width: 1200px; - max-height: 900px; - margin: 20px auto; } - #community #mainContent #calendarEvents, .gridPage #mainContent #calendarEvents { - position: relative; - width: 80vw; - height: 30vw; - max-width: 1200px; - max-height: 450px; - margin: 20px auto; } - #community #mainContent iframe, .gridPage #mainContent iframe { - position: absolute; - border: 0; - width: 100%; - height: 100%; } - -.ui-icon { - display: inline-block !important; } - -#feature-state-dialog-link { - text-decoration: none !important; - padding: 5px !important; } - #feature-state-dialog-link a:visited { - color: #454545 !important; } - #feature-state-dialog-link a code { - display: inline-block !important; - box-sizing: border-box !important; - background-color: #f7f7f7 !important; - color: #303030 !important; - font-family: "Roboto Mono", monospace !important; - vertical-align: baseline !important; - font-size: 14px !important; - font-weight: bold !important; - padding: 0px 4px !important; } - -#feature-state-dialog { - background: #fff !important; - border: 1px solid #ddd !important; - padding: 0.5em 1em !important; } - #feature-state-dialog ul, #feature-state-dialog li { - list-style: disc !important; - margin: 4px 12px !important; } - #feature-state-dialog p { - margin: 8px 0px !important; } - #feature-state-dialog code { - display: inline-block !important; - box-sizing: border-box !important; - background-color: #f7f7f7 !important; - color: #303030 !important; - font-family: "Roboto Mono", monospace !important; - vertical-align: baseline !important; - font-size: 14px !important; - font-weight: bold !important; - padding: 0px 4px !important; } - -.ui-dialog { - background: #f7f7f7 !important; - padding: 0.5em; } - -.ui-dialog-content { - position: relative; - float: right; - width: 100%; } - .ui-dialog-content * + h2, .ui-dialog-content * + h3, .ui-dialog-content * + h4, .ui-dialog-content * + h5, .ui-dialog-content * + h6 { - margin-top: 30px; } - .ui-dialog-content h1, .ui-dialog-content h2, .ui-dialog-content h3, .ui-dialog-content h4, .ui-dialog-content h5, .ui-dialog-content h6 { - line-height: normal; - font-weight: 500; - margin-bottom: 30px; - padding-bottom: 10px; } - .ui-dialog-content h1:before, .ui-dialog-content h2:before, .ui-dialog-content h3:before, .ui-dialog-content h4:before, .ui-dialog-content h5:before, .ui-dialog-content h6:before { - display: block; - content: " "; - margin-top: -100px; - height: 100px; - visibility: hidden; } - .ui-dialog-content h1, .ui-dialog-content h2 { - border-bottom: 1px solid #cccccc; } - .ui-dialog-content h1 { - font-size: 32px; - padding-right: 60px; } - .ui-dialog-content h2 { - font-size: 28px; } - .ui-dialog-content h3 { - font-size: 24px; - font-weight: 300; - margin-bottom: 5px; } - .ui-dialog-content h4 { - font-size: 20px; - margin-bottom: 0px; } - .ui-dialog-content h5, .ui-dialog-content h6 { - font-size: 16px; - font-weight: 500; } - .ui-dialog-content p { - font-size: 16px; - font-weight: 300; - line-height: 1.75em; } - .ui-dialog-content p + p { - margin-top: 10px; } - .ui-dialog-content code { - display: inline-block; - box-sizing: border-box; - background-color: #f7f7f7; - color: #303030; - font-family: "Roboto Mono", monospace; - vertical-align: baseline; - font-size: 14px; - font-weight: bold; - padding: 2px 4px; } - .ui-dialog-content a code { - color: #3371e3; - text-decoration: underline; } - .ui-dialog-content pre .pi, .ui-dialog-content pre .s { - margin: 0; - padding: 0; } - .ui-dialog-content .highlight code span, .ui-dialog-content code, .ui-dialog-content pre code { - font-family: "Roboto Mono", monospace; } - .ui-dialog-content code, .ui-dialog-content pre code { - color: #303030; } - .ui-dialog-content pre code { - padding: 0; } - .ui-dialog-content pre { - background-color: #f7f7f7; - display: block; - margin: 20px 0; - padding: 15px; - position: relative; - overflow-x: auto; } - .ui-dialog-content h1 code, .ui-dialog-content h2 code, .ui-dialog-content h3 code, .ui-dialog-content h4 code, .ui-dialog-content h5 code, .ui-dialog-content h6 code { - font-family: inherit; - font-size: inherit; - background-color: transparent; } - .ui-dialog-content .includecode { - table-layout: fixed; } - .ui-dialog-content .includecode, .ui-dialog-content .includecode th, .ui-dialog-content .includecode td { - padding: 0 !important; } - .ui-dialog-content .includecode th { - text-align: right !important; - padding: 10px !important; } - .ui-dialog-content .includecode th a, .ui-dialog-content .includecode th a code { - color: white !important; - background-color: transparent !important; } - .ui-dialog-content .includecode pre { - margin: 0 !important; } - .ui-dialog-content ul li { - list-style: disc; } - .ui-dialog-content ol li { - list-style: decimal; } - .ui-dialog-content ul, .ui-dialog-content ol { - margin: 20px 0; - padding-left: 30px; - font-weight: 300; } - .ui-dialog-content ul ul, .ui-dialog-content ol ol, .ui-dialog-content ul ol, .ui-dialog-content ol ul { - margin: 0.75em 0; } - .ui-dialog-content li { - margin-bottom: 0.75em; - font-size: 16px; - line-height: 1.75em; } - .ui-dialog-content table { - width: 100%; - border: 1px solid #ccc; - border-spacing: 0; - margin-top: 30px; - margin-bottom: 30px; } - .ui-dialog-content thead, .ui-dialog-content tr:nth-child(even) { - background-color: #f7f7f7; } - .ui-dialog-content thead { - background-color: #555; - color: white; } - .ui-dialog-content th, .ui-dialog-content td { - padding: 8px; - text-align: left; - margin: 0; } - .ui-dialog-content th { - font-weight: normal; } - .ui-dialog-content td { - font-size: 0.85em; } - .ui-dialog-content #editPageButton { - position: absolute; - top: -25px; - right: 5px; - width: 50px; - height: 50px; - line-height: 50px; - border-radius: 50%; - white-space: nowrap; - text-indent: 50px; - overflow: hidden; - background: #3371e3 url(/images/icon-pencil.svg) no-repeat; - background-position: 12px 10px; - background-size: 29px 29px; } - .ui-dialog-content #markdown-toc { - margin-bottom: 20px; } - .ui-dialog-content #markdown-toc ul, .ui-dialog-content #markdown-toc li { - list-style: disc; - color: #3371e3; } - .ui-dialog-content #markdown-toc ul { - padding: 0 15px; - margin: 0; } - .ui-dialog-content #markdown-toc li { - padding: 0; - line-height: 1.5em; - margin-bottom: 0; } - .ui-dialog-content #markdown-toc a { - position: relative; - color: #3371e3; - font-weight: 700; } - .ui-dialog-content img { - max-width: 100%; } - .ui-dialog-content a { - text-decoration: underline; } - -.ui-dialog-buttonpane { - background: #f7f7f7 !important; } - -.ui-widget-header { - background: transparent !important; - background-color: transparent !important; - border: 0px !important; } - -.ui-tabs ul, .ui-tabs ol, .ui-tabs li { - padding: 0px !important; - list-style: none !important; - margin-bottom: 0px !important; - margin-left: 4px !important; } - -.ui-tabs-panel ul li { - list-style: disc !important; } - -.ui-tabs-panel ol li { - list-style: decimal !important; } - -.ui-widget-content { - border: 0px !important; } - .ui-widget-content table { - margin: 0px !important; } - -.ui-tabs .ui-tabs-panel { - border: 1px solid #ccc !important; } - -.ui-tabs-anchor { - text-decoration: none !important; } - -#talkToUs h3, #talkToUs h4 { - text-align: center; } - -#talkToUs h3 { - margin-bottom: 15px; } - -#talkToUs h4 { - line-height: normal; - margin-bottom: 50px; } - #talkToUs h4 br { - display: none; } - -#talkToUs #bigSocial { - overflow: hidden; } - #talkToUs #bigSocial div { - width: 100%; - float: left; - padding: 30px; - padding-top: 110px; - background-position: center top; - background-size: auto; - background-repeat: no-repeat; } - #talkToUs #bigSocial div:nth-child(1) { - background-image: url(/images/twitter_icon.png); } - #talkToUs #bigSocial div:nth-child(2) { - background-image: url(/images/github_icon.png); } - #talkToUs #bigSocial div:nth-child(3) { - background-image: url(/images/slack_icon.png); } - #talkToUs #bigSocial div:nth-child(4) { - background-image: url(/images/stackoverflow_icon.png); } - #talkToUs #bigSocial div + div { - margin-top: 20px; - margin-left: 0; } - #talkToUs #bigSocial a { - display: inline-block; - color: #3371e3; - font-size: 24px; - font-weight: 400; - text-decoration: none; - margin-bottom: 15px; } - #talkToUs #bigSocial a, #talkToUs #bigSocial p { - text-align: center; - width: 100%; } - -#home #talkToUs main { - padding: 30px 0; } - -#home #talkToUs h5 { - font-size: 20px; } - -#home #caseStudiesWrapper { - position: relative; - text-align: center; - margin-bottom: 30px; } - #home #caseStudiesWrapper img { - padding-bottom: 1rem; } - #home #caseStudiesWrapper div { - position: relative; - display: inline-block; - vertical-align: top; - width: 100%; - min-height: 230px; - margin-bottom: 60px; - padding-right: 1rem; - background-position: top center; } - #home #caseStudiesWrapper p { - font-size: 20px; } - #home #caseStudiesWrapper a { - position: absolute; - bottom: -30px; - left: 50%; - transform: translateX(-50%); - color: #3371e3; - font-weight: 400; } - -/* Google Search */ -.cse .gsc-control-cse, .gsc-control-cse { - padding: 0; } - -.gsc-control-cse table, .gsc-control-cse-en table { - margin: 0px !important; } - -.gsc-above-wrapper-area { - border-bottom: 0; } - -/* Bing Search */ -#bing-results-container { - margin-top: 30px; - margin-left: 20px; } - -.bing-result { - margin-bottom: 20px; } - -.bing-result-name a { - font-size: 16px; - color: #0000CC; } - -.bing-result-url { - color: #008000; - font-size: 13px; } - -.bing-result-snippet { - color: #000; - font-size: 11px; } - -#bing-pagination-container { - margin: 10px; - margin-left: 20px; } - -.bing-page-anchor { - text-decoration: none !important; - cursor: pointer; - color: #0000CC; - margin-right: 8px; } - -@media screen and (min-width: 750px) { - h1 { - font-size: 32px; - line-height: 40px; } - h2 { - font-size: 28px; - line-height: 60px; } - h3 { - font-size: 24px; - line-height: 32px; } - h4 { - font-size: 20px; - line-height: 40px; } - h5 { - font-size: 16px; - line-height: 36px; } - p { - font-size: 14px; - line-height: 22px; } - section, header, #vendorStrip { - padding-left: 20px; - padding-right: 20px; } - section main, header main, #vendorStrip main { - width: 100%; - max-width: 100%; } - header { - height: 80px; } - .nav-buttons { - height: 80px; - line-height: 80px; } - .nav-buttons .button + * { - margin-left: 30px; } - #hamburger { - width: 50px; - height: 50px; } - #mainNav { - padding: 140px 0 30px; } - #mainNav h5 { - margin-bottom: 1em; } - #mainNav h3 { - margin-bottom: 0.6em; } - #mainNav .nav-box { - width: 20%; } - #mainNav .nav-box + .nav-box { - margin-left: calc(20% / 3); } - #mainNav main + main { - margin-top: 60px; } - #mainNav .left .button { - height: 50px; - line-height: 50px; - font-size: 18px; } - .open-nav #tryKubernetes, .y-enough #tryKubernetes { - margin-left: 30px; } - #hero { - padding-top: 80px; } - #docs #hero h1, #docs #hero h5 { - padding-left: 20px; - padding-right: 20px; } - #vendorStrip { - height: 88px; - line-height: 88px; - font-size: 16px; } - p { - font-size: 16px; - line-height: 24px; - letter-spacing: 0.1px; } - h1 { - font-size: 36px; - line-height: 44px; } - h3 { - font-size: 28px; - line-height: 36px; } - h4 { - font-size: 24px; - line-height: 40px; } - #home #viewDocs, #home #tryKubernetes { - display: inline-block; } - #vendorStrip { - display: block; - text-align: center; } - #vendorStrip img { - max-height: 24px; - vertical-align: middle; - margin: 0 30px; } - #docs #vendorStrip li a { - font-size: 1em; - font-weight: normal; } - #docs #vendorStrip li li + li { - margin-left: 60px; } - #oceanNodes h3 { - text-align: left; - margin-bottom: 18px; } - #oceanNodes main { - position: relative; - clear: both; - display: table; } - #oceanNodes main .content { - display: table-cell; - position: relative; - vertical-align: middle; } - #oceanNodes main .image-wrapper { - position: absolute; - top: 50%; - max-width: 25%; - max-height: 100%; - transform: translateY(-50%); } - #oceanNodes main:nth-child(odd) { - padding-right: 210px; } - #oceanNodes main:nth-child(odd) .image-wrapper { - right: 0; } - #oceanNodes main:nth-child(even) { - padding-left: 210px; } - #oceanNodes main:nth-child(even) .image-wrapper { - left: 0; } - #oceanNodes main:nth-child(1) { - padding-right: 0; } - #oceanNodes main:nth-child(1) h3, #oceanNodes main:nth-child(1) p { - text-align: center; } - #oceanNodes main:nth-child(1) .image-wrapper { - position: relative; - display: block; - float: none; - max-width: 100%; - transform: none; } - #oceanNodes main:nth-child(1) .content { - display: block; } - #oceanNodes main img { - width: 100%; } - #video { - height: 400px; - display: block; } - #video > .light-text { - display: block; } - #mobileShowVideoButton { - display: none; } - #features { - padding-bottom: 60px; } - #features .feature-box { - margin-bottom: 30px; } - #features .feature-box:last-child { - margin-bottom: 0; } - #features h3 { - margin-bottom: 40px; } - #features .feature-box > div { - width: 45%; - margin-bottom: 0; } - #talkToUs #bigSocial div { - width: calc(50% - 15px); } - #talkToUs #bigSocial div + div { - margin-top: 0; } - #talkToUs #bigSocial div:nth-child(2) { - margin-left: 20px; } - #talkToUs #bigSocial div:nth-child(3) { - margin-top: 20px; } - #talkToUs #bigSocial div:nth-child(4) { - margin-top: 20px; - margin-left: 20px; } - #talkToUs #bigSocial a { - display: inline-block; - color: #3371e3; - font-weight: 400; - text-decoration: none; } - footer nav { - text-align: center; } - footer nav a { - width: 30%; - padding: 0 20px; } - footer .social { - text-align: center; } - footer .social div { - display: inline-block; } - footer .social div:last-child { - display: block; - margin: 0; } - footer .social span { - display: inline-block; - margin-right: 10px; } - footer .social input { - text-align: left; } - #home #caseStudiesWrapper div { - width: 48%; } } - -@media screen and (min-width: 1025px) { - #hamburger { - display: none; } - ul.global-nav { - display: inline-block; } - #docs #vendorStrip #searchBox:before { - top: 15px; } - #vendorStrip { - height: 44px; - line-height: 44px; } - #vendorStrip li a.YAH:after { - content: ""; - display: block; - position: absolute; - left: 0; - bottom: 0; - width: 100%; - height: 4px; - background-color: #3371e3; } - #vendorStrip #searchBox { - float: right; } - #home #hero #vendorStrip { - display: block; } - #docs #hero h1, #docs #hero h5 { - text-align: left; } - #docs #hero #vendorStrip ul { - float: left; } - #docs #hero #vendorStrip #searchBox { - float: right; - width: 250px; } - #docs #hero #vendorStrip #search { - vertical-align: middle; } - #docs .flyout-button { - display: none; } - #docs .logo { - position: relative; - float: left; - display: block; - width: 180px; - height: 88px; - top: 0; - left: 0; - transform: none; - background-image: url(../images/nav_logo.svg); } - #docs.flip-nav .logo, #docs.open-nav .logo { - background-image: url(../images/nav_logo2.svg); } - #encyclopedia { - padding: 50px 50px 100px 100px; - clear: both; } - #docsToc { - position: relative; - float: left; - padding: 0 20px; - left: 0; - width: 350px; - z-index: auto; } - #docsToc .push-menu-close-button { - display: none; } - #docsContent { - width: calc(100% - 400px); } - #docsContent #editPageButton { - right: -25px; } - section main, header main, footer main { - max-width: 1200px; } - header, #vendorStrip, #encyclopedia, #hero h1, #hero h5, #docs #hero h1, #docs #hero h5, - #community #hero h1, .gridPage #hero h1, #community #hero h5, .gridPage #hero h5 { - padding-left: 100px; - padding-right: 100px; } - #vendorStrip { - padding-right: 10px; } - #home section main, #home header main, #home footer main { - max-width: 1000px; } - #oceanNodes main { - position: relative; - max-width: 830px; } - #oceanNodes main:nth-child(1) { - max-width: 1000px; - padding-right: 475px; } - #oceanNodes main:nth-child(1) h3, #oceanNodes main:nth-child(1) p { - text-align: left; } - #oceanNodes main:nth-child(1) .image-wrapper { - position: absolute; - max-width: 48%; - transform: translateY(-50%); } - #oceanNodes main:nth-child(1) .image-wrapper img { - max-width: 425px; } - #video { - height: 550px; - position: relative; - background-position: center center; - background-size: cover; } - #talkToUs h4 br { - display: block; } - #talkToUs #bigSocial div { - width: calc(25% - 18px); } - #talkToUs #bigSocial div + div { - margin-left: 20px; } - footer { - width: 100%; - background-image: url(../images/texture.png); - background-color: #303030; } - footer main { - padding: 20px 0; } - footer nav { - overflow: hidden; - margin-bottom: 20px; } - footer nav a { - width: 16.65%; - float: left; - font-size: 24px; - font-weight: 300; - white-space: nowrap; } - footer .social { - padding: 0 30px; - max-width: 1200px; } - footer .social div { - float: left; } - footer .social div:last-child { - float: right; } - #search, #wishField { - background-color: transparent; - padding: 10px; - font-size: 16px; - font-weight: 100; - color: white; - border: 1px solid white; - transition: 0.3s; } - #search:focus, #wishField:focus { - background-color: #f7f7f7; - color: #303030; } - .social a { - display: inline-block; - background-image: url(../images/social_sprite.png); - background-repeat: no-repeat; - background-size: auto; - width: 50px; - height: 50px; - border-radius: 5px; - margin-right: 10px; } - .social a:hover { - background-color: #fff; } - .social a span { - position: absolute; - display: block; - height: 0; - overflow: hidden; } - a.twitter { - background-position: 0 0; } - a.twitter:hover { - background-position: 0 100%; } - a.stack-overflow { - background-position: -50px 0; } - a.stack-overflow:hover { - background-position: -50px 100%; } - a.slack { - background-position: -100px 0; } - a.slack:hover { - background-position: -100px 100%; } - a.github { - background-position: -150px 0; } - a.github:hover { - background-position: -150px 100%; } - a.mailing-list { - background-position: -200px 0; } - a.mailing-list:hover { - background-position: -200px 100%; } - a.calendar { - background-position: -250px 0; } - a.calendar:hover { - background-position: -250px 100%; } - #community #hero, .gridPage #hero { - text-align: left; } - #community #hero h1, .gridPage #hero h1 { - padding: 20px 100px; } - #community #tryKubernetes, .gridPage #tryKubernetes { - width: auto; - background-color: #3371e3; - padding: 0 20px; } - #bigSocial div { - width: calc(25% - 18px); } - #home #caseStudiesWrapper div { - width: 24%; - min-height: 260px; } } - -@media screen and (min-width: 1300px) { - #vendorStrip { - padding-right: 100px; } } - -@media screen and (min-width: 456px) { - #vendorStrip li + li { - margin-left: 20px; } } diff --git a/resources/_gen/assets/sass/cn/sass/styles.sass_a6e533854c4de092afe9278041939937.json b/resources/_gen/assets/sass/cn/sass/styles.sass_a6e533854c4de092afe9278041939937.json deleted file mode 100644 index 081a4beb86..0000000000 --- a/resources/_gen/assets/sass/cn/sass/styles.sass_a6e533854c4de092afe9278041939937.json +++ /dev/null @@ -1 +0,0 @@ -{"Target":"css/styles.css","MediaType":"text/css","Data":{}} \ No newline at end of file diff --git a/resources/_gen/assets/sass/sass/styles.sass_a6e533854c4de092afe9278041939937.content b/resources/_gen/assets/sass/sass/styles.sass_a6e533854c4de092afe9278041939937.content deleted file mode 100644 index fbbc79a5e5..0000000000 --- a/resources/_gen/assets/sass/sass/styles.sass_a6e533854c4de092afe9278041939937.content +++ /dev/null @@ -1,1946 +0,0 @@ -html, body { - margin: 0; - padding: 0; } - -input, button { - outline: none; } - -button { - cursor: pointer; } - -ul, li { - list-style: none; } - -ul { - margin: 0; - padding: 0; } - -a { - text-decoration: none; } - -.clear { - display: block; - clear: both; } - -.light-text { - color: white; } - -.right { - float: right; } - -.left { - float: left; } - -.center { - text-align: center; } - -*, .button { - box-sizing: border-box; - font-family: "Roboto", sans-serif; - background: none; - margin: 0; - border: 0; } - -body { - font-family: "Roboto", sans-serif; } - -h1, h2, h5, p { - font-weight: 300; } - -h3, h4 { - font-weight: 400; } - -html, body { - margin: 0; - padding: 0; } - -input, button { - outline: none; } - -button { - cursor: pointer; } - -ul, li { - list-style: none; } - -ul { - margin: 0; - padding: 0; } - -a { - text-decoration: none; } - -.clear { - display: block; - clear: both; } - -.light-text { - color: white; } - -.right { - float: right; } - -.left { - float: left; } - -.center { - text-align: center; } - -h1 { - font-size: 32px; - line-height: 40px; } - -h2 { - font-size: 28px; - line-height: 60px; } - -h3 { - font-size: 24px; - line-height: 32px; } - -h4 { - font-size: 20px; - line-height: 40px; } - -h5 { - font-size: 16px; - line-height: 36px; } - -p { - font-size: 14px; - line-height: 22px; } - -section, header, #vendorStrip { - padding-left: 20px; - padding-right: 20px; } - section main, header main, #vendorStrip main { - width: 100%; - max-width: 100%; } - -header { - height: 80px; } - -.nav-buttons { - height: 80px; - line-height: 80px; } - .nav-buttons .button + * { - margin-left: 30px; } - -#hamburger { - width: 50px; - height: 50px; } - -#mainNav { - padding: 140px 0 30px; } - #mainNav h5 { - margin-bottom: 1em; } - #mainNav h3 { - margin-bottom: 0.6em; } - #mainNav .nav-box { - width: 20%; } - #mainNav .nav-box + .nav-box { - margin-left: calc(20% / 3); } - #mainNav main + main { - margin-top: 60px; } - #mainNav .left .button { - height: 50px; - line-height: 50px; - font-size: 18px; } - -.open-nav #tryKubernetes, .y-enough #tryKubernetes { - margin-left: 30px; } - -#hero { - padding-top: 80px; } - -#docs #hero h1, #docs #hero h5 { - padding-left: 20px; - padding-right: 20px; } - -#vendorStrip { - height: 88px; - line-height: 88px; - font-size: 16px; } - -body { - background-color: white; } - -section { - position: relative; - background-color: white; } - -section main, header main, footer main { - position: relative; - margin: auto; } - -p { - font-size: 14px; - font-weight: 400; } - -.button { - display: inline-block; - border-radius: 6px; - padding: 0 20px; - line-height: 40px; - color: white; - background-color: #3371e3; - text-decoration: none; } - -#cellophane { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - display: none; } - -header { - position: fixed; - top: 0; - left: 0; - width: 100%; - z-index: 8888; - background-color: transparent; - box-shadow: 0 0 0 transparent; - overflow: hidden; - transition: 0.3s; - text-align: center; } - -.logo { - position: relative; - float: left; - display: block; - width: 180px; - height: 88px; - top: 0; - left: 0; - transform: none; - background-image: url(/images/nav_logo.svg); - background-size: contain; - background-position: center center; - background-repeat: no-repeat; } - -#docs .flyout-button { - position: fixed; - top: 20px; - left: 20px; - width: 50px; - height: 50px; - background-image: url(/images/toc_icon.png); - background-position: center center; - background-repeat: no-repeat; - background-size: auto; - border-radius: 50%; - transition: 0.3s; - z-index: 99999; } - -#docs.open-nav .flyout-button { - display: none; } - -#docs .logo { - position: absolute; - top: 40px; - left: 50%; - transform: translate(-50%, -50%); - display: block; - width: 45px; - height: 44px; - background-image: url(/images/favicon.png); } - -#docs.flip-nav .flyout-button { - background-image: url(/images/toc_icon_grey.png); } - -.nav-buttons { - float: right; } - -#viewDocs, #tryKubernetes { - display: none; } - -#viewDocs { - border: 2px solid white; - background-color: transparent; - transition: 0.3s; } - #viewDocs:hover { - background-color: white; - color: #303030; } - -#tryKubernetes { - width: 0; - padding: 0 0; - border: 1px solid transparent; - background-color: transparent; - text-align: center; - white-space: nowrap; - vertical-align: middle; - overflow: hidden; - transition: 0.3s; } - -#hamburger { - display: inline-block; - position: relative; - vertical-align: middle; - padding: 0; - border: 0; - background: none; } - #hamburger div, #hamburger:before, #hamburger:after { - position: absolute; - left: 15%; - width: 70%; - height: 2px; - background-color: #3371e3; - transition: 0.3s; - content: ""; } - #hamburger div { - top: calc(50% - 1px); } - #hamburger:before { - top: 24%; } - #hamburger:after { - bottom: 24%; } - #hamburger:hover div, #hamburger:hover:before, #hamburger:hover:after { - background-color: white; } - -#mainNav h5 { - color: #3371e3; - font-weight: normal; } - -#mainNav main { - white-space: nowrap; - overflow: hidden; - clear: both; } - -#mainNav .nav-box { - float: left; - white-space: normal; } - -#mainNav h3 a { - color: #3371e3; - text-decoration: none; } - -ul.global-nav { - display: none; } - ul.global-nav li { - display: inline-block; - margin-right: 14px; } - ul.global-nav li a { - color: #fff; - font-weight: 400; - padding: 0; - position: relative; } - ul.global-nav li a.active:after { - position: absolute; - width: 100%; - height: 2px; - content: ''; - bottom: -4px; - left: 0; - background: #fff; } - ul.global-nav li a .ui-icon { - filter: brightness(0) invert(1); } - ul.global-nav li ul { - display: none; - position: fixed; - top: 40px; - text-align: left; } - ul.global-nav li ul li { - display: block; - height: 28px; } - ul.global-nav li ul li a { - background: #303030; - color: #fff; - padding: 7px; } - ul.global-nav li ul li:last-child a { - border-radius: 7px; } - ul.global-nav li:hover ul { - display: block; } - -.flip-nav ul.global-nav li a, -.open-nav ul.global-nav li a { - color: #303030; } - -.flip-nav ul.global-nav li a .ui-icon { - filter: brightness(0); } - -.flip-nav ul.global-nav li ul li a { - background: #fff; - color: #303030; } - -.flip-nav ul.global-nav li a.active:after, -.flip-nav ul.global-nav li ul li a.active:after, -.open-nav ul.global-nav li a.active:after { - background: #3371e3; } - -.flip-nav header { - background-color: white; } - -.open-nav body { - overflow: hidden; } - -.open-nav #cellophane { - display: block; - z-index: 9998; } - -.open-nav header { - background-color: #e8e8e8; - z-index: 9999; } - -.open-nav #hamburger div { - opacity: 0; } - -.open-nav #hamburger:before, .open-nav #hamburger:after { - left: 12px; - transform-origin: 0 1px; } - -.open-nav #hamburger:before { - transform: rotate(45deg); } - -.open-nav #hamburger:after { - transform: rotate(-45deg); } - -.open-nav #tryKubernetes, .y-enough #tryKubernetes { - width: 150px; - background-color: #3371e3; - border-color: #3371e3; } - -.flip-nav header, .open-nav header { - box-shadow: 0 1px 2px #4c4c4c; } - -.flip-nav #viewDocs, .open-nav #viewDocs { - border-color: #303030; - color: #303030; } - .flip-nav #viewDocs:hover, .open-nav #viewDocs:hover { - border-color: #3371e3; - background-color: #3371e3; - color: white; } - -.flip-nav #hamburger:hover div, .flip-nav #hamburger:hover:before, .flip-nav #hamburger:hover:after, .open-nav #hamburger:hover div, .open-nav #hamburger:hover:before, .open-nav #hamburger:hover:after { - background-color: #303030; } - -#hero { - background-image: url(/images/texture.png); - background-color: #303030; - text-align: center; - padding-left: 0; - padding-right: 0; - margin-bottom: 0; - position: relative; } - #hero.bot-bar:after { - display: block; - margin-bottom: -20px; - height: 8px; - width: 100%; - background-color: rgba(255, 255, 255, 0.1); - content: ''; } - #hero.no-sub h5 { - display: none; } - #hero.no-sub h1 { - margin-bottom: 20px; } - -#home #hero:after { - display: none; } - -#vendorStrip { - position: relative; - background-color: rgba(255, 255, 255, 0.1); - font-weight: 100; - white-space: nowrap; - text-align: center; } - #vendorStrip li a { - color: rgba(255, 255, 255, 0.5); } - #vendorStrip li a.YAH { - color: white; - position: relative; } - -footer { - width: 100%; - background-image: url(/images/texture.png); - background-color: #303030; } - footer main { - padding: 20px 0; } - footer nav a { - width: 100%; - text-align: center; - display: inline-block; - margin: 10px 0; - font-size: 24px; - font-weight: 300; - color: white; - text-decoration: none; } - footer .social { - margin: 20px 0; } - footer .social div { - text-align: center; - margin-bottom: 20px; } - footer .social div:last-child { - margin: 30px 0; } - footer .social span { - display: block; - margin-bottom: 8px; } - footer .social input { - text-align: center; } - -#search, #wishField { - background-color: transparent; - padding: 10px; - font-size: 16px; - font-weight: 100; - color: white; - border: 1px solid white; - transition: 0.3s; } - #search:focus, #wishField:focus { - background-color: #f7f7f7; - color: #303030; } - -.social a { - display: inline-block; - background-image: url(/images/social_sprite.png); - background-repeat: no-repeat; - background-size: auto; - width: 50px; - height: 50px; - border-radius: 5px; - margin-right: 10px; } - .social a:hover { - background-color: #fff; } - .social a span { - position: absolute; - display: block; - height: 0; - overflow: hidden; } - .social a.button { - background-image: none; - width: auto; - height: auto; } - .social a.button:hover { - color: #3371e3; } - -a.twitter { - background-position: 0 0; } - a.twitter:hover { - background-position: 0 100%; } - -a.stack-overflow { - background-position: -50px 0; } - a.stack-overflow:hover { - background-position: -50px 100%; } - -a.slack { - background-position: -100px 0; } - a.slack:hover { - background-position: -100px 100%; } - -a.github { - background-position: -150px 0; } - a.github:hover { - background-position: -150px 100%; } - -a.mailing-list { - background-position: -200px 0; } - a.mailing-list:hover { - background-position: -200px 100%; } - -a.calendar { - background-position: -250px 0; } - a.calendar:hover { - background-position: -250px 100%; } - -#viewDocs { - display: none; } - -section { - background-color: white; } - -#hero { - background-color: #303030; } - #hero h5 { - margin: 20px 0; - line-height: 28px; } - -#vendorStrip { - position: relative; } - #vendorStrip ul { - float: left; } - #vendorStrip li { - display: inline-block; - height: 100%; } - #vendorStrip a { - display: block; - height: 100%; - color: white; - font-size: 0.75em; - font-weight: bold; } - #vendorStrip li + li { - margin-left: 0; } - -#docs #vendorStrip { - line-height: 44px; - max-width: 100%; - overflow-x: scroll; } - #docs #vendorStrip ul { - float: none; } - #docs #vendorStrip #searchBox { - float: none; - display: block; - width: 80%; - margin: 0 auto; - height: 44px; - line-height: 44px; - position: relative; } - #docs #vendorStrip #searchBox:before { - position: absolute; - width: 15px; - height: 15px; - content: ''; - right: 8px; - top: 7px; - background-image: url(/images/search-icon.svg); - background-repeat: no-repeat; - background-size: 100% 100%; - z-index: 1; } - #docs #vendorStrip #search { - width: 100%; - padding: 0 10px; - height: 30px; - line-height: 30px; - font-size: 16px; - vertical-align: top; - background: #fff; - border: none; - border-radius: 4px; - position: relative; } - -#encyclopedia { - position: relative; - padding: 50px 20px 20px 20px; - overflow: hidden; - font-size: 14px; } - #encyclopedia > div { - height: 100%; } - -#docsToc { - position: fixed; - background-color: white; - top: 0; - left: 0; - width: 0; - height: 100vh; - overflow: hidden; - padding: 50px 0; - z-index: 999999; - transition: 0.3s; } - #docsToc .yah > .title { - background-color: #f7f7f7; - border-left: 3px solid #3371e3; - padding: 7.5px 10px 7.5px 18px; - margin-left: -3px; - color: #3371e3; } - -.open-toc body { - overflow: hidden; } - -.open-toc #docsToc { - padding: 50px 20px; - width: 400px; - max-width: 100vw; - overflow-y: auto; } - -.pi-accordion > .container:first-child > .item:first-child > .title:first-child { - padding-left: 0; - font-size: 1.5em; - font-weight: 700; } - -.pi-accordion > .container:first-child > .item.yah:first-child > .title:first-child { - margin-left: -20px !important; } - -.pi-accordion .item { - overflow: hidden; } - -.pi-accordion .title { - color: #303030; - position: relative; - padding: 7.5px 10px 7.5px 18px; - cursor: pointer; - transition: 0.3s; } - .pi-accordion .title:hover { - color: #3371e3; } - -.pi-accordion a.item > .title { - color: black; } - .pi-accordion a.item > .title:hover { - color: #3371e3; } - -.pi-accordion div.item > .title:before { - content: ""; - position: absolute; - top: 12px; - left: 2px; - border-style: solid; - border-width: 5px 0 5px 8px; - border-color: transparent transparent transparent #3371e3; - transform: rotate(0deg); - transition: 0.3s; } - -.pi-accordion .wrapper { - position: relative; - width: 100%; - transition: height 0.3s; } - -.pi-accordion .content { - padding-left: 20px; - opacity: 0; - transition: 0.3s; } - -.pi-accordion .item.on > .title:before { - transform: rotate(90deg); } - -.pi-accordion .item.on > .wrapper > .content { - opacity: 1; } - -dt { - margin-bottom: 8px; } - -dd { - margin-bottom: 16px; } - -.pi-pushmenu { - display: none; - position: fixed; - top: 0; - width: 100%; - height: 100%; - opacity: 0; - transition: opacity 0.3s; } - .pi-pushmenu.on { - opacity: 1; } - .pi-pushmenu .overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.4); } - .pi-pushmenu .sled { - position: absolute; - top: 0; - width: 0; - height: 100%; - background-color: white; - overflow: auto; - transition: 0.3s; } - .pi-pushmenu.on .sled { - width: 400px; - max-width: 100vw; } - .pi-pushmenu .top-bar { - height: 0; - line-height: 60px; - background-color: #444; } - .pi-pushmenu ul { - margin-top: 25px; } - .pi-pushmenu li { - position: relative; - display: block; - width: 100%; - min-height: 45px; - padding: 0 60px 0 20px; - border-bottom: 1px solid #cccccc; } - .pi-pushmenu a { - display: inline-block; - width: 100%; - height: 45px; - line-height: 45px; - font-family: "Roboto", sans-serif; - font-size: 20px; - color: #3371e3; } - .pi-pushmenu .button { - background: none; - padding: 0; } - .pi-pushmenu ul ul { - padding: 0 20px; } - .pi-pushmenu ul ul li { - min-height: 40px; } - .pi-pushmenu ul ul a { - height: 40px; - line-height: 40px; - font-size: 18px; - color: #555555; } - -.push-menu-close-button { - position: absolute; - top: 0; - right: 0; - width: 50px; - height: 50px; } - .push-menu-close-button:before, .push-menu-close-button:after { - content: ""; - position: absolute; - top: calc(50% - 1px); - left: 25%; - width: 50%; - height: 2px; - background-color: black; } - .push-menu-close-button:before { - transform: rotate(45deg); } - .push-menu-close-button:after { - transform: rotate(-45deg); } - -#docsContent { - position: relative; - float: right; - width: 100%; } - #docsContent * + h2, #docsContent * + h3, #docsContent * + h4, #docsContent * + h5, #docsContent * + h6 { - margin-top: 30px; } - #docsContent h1, #docsContent h2, #docsContent h3, #docsContent h4, #docsContent h5, #docsContent h6 { - line-height: normal; - font-weight: 500; - margin-bottom: 30px; - padding-bottom: 10px; } - #docsContent h1:before, #docsContent h2:before, #docsContent h3:before, #docsContent h4:before, #docsContent h5:before, #docsContent h6:before { - display: block; - content: " "; - margin-top: -100px; - height: 100px; - visibility: hidden; } - #docsContent h1, #docsContent h2 { - border-bottom: 1px solid #cccccc; } - #docsContent h1 { - font-size: 32px; - padding-right: 60px; } - #docsContent h2 { - font-size: 28px; } - #docsContent h3 { - font-size: 24px; - font-weight: 300; - margin-bottom: 5px; } - #docsContent h4 { - font-size: 20px; - margin-bottom: 0px; } - #docsContent h5, #docsContent h6 { - font-size: 16px; - font-weight: 500; } - #docsContent p { - font-size: 16px; - font-weight: 300; - line-height: 1.75em; } - #docsContent p + p { - margin-top: 10px; } - #docsContent code { - display: inline-block; - box-sizing: border-box; - background-color: #f7f7f7; - color: #303030; - font-family: "Roboto Mono", monospace; - vertical-align: baseline; - font-size: 14px; - font-weight: bold; - padding: 2px 4px; } - #docsContent a code { - color: #3371e3; - text-decoration: underline; } - #docsContent pre .pi, #docsContent pre .s { - margin: 0; - padding: 0; } - #docsContent .highlight code span, #docsContent code, #docsContent pre code { - font-family: "Roboto Mono", monospace; } - #docsContent code, #docsContent pre code { - color: #303030; } - #docsContent pre code { - padding: 0; } - #docsContent pre { - background-color: #f7f7f7; - display: block; - margin: 20px 0; - padding: 15px; - position: relative; - overflow-x: auto; } - #docsContent h1 code, #docsContent h2 code, #docsContent h3 code, #docsContent h4 code, #docsContent h5 code, #docsContent h6 code { - font-size: inherit; - background-color: transparent; } - #docsContent .includecode { - table-layout: fixed; } - #docsContent .includecode, #docsContent .includecode th, #docsContent .includecode td { - padding: 0 !important; } - #docsContent .includecode th { - text-align: right !important; - padding: 10px !important; } - #docsContent .includecode th a, #docsContent .includecode th a code { - color: white !important; - background-color: transparent !important; } - #docsContent .includecode pre { - margin: 0 !important; } - #docsContent ul li { - list-style: disc; } - #docsContent ol li { - list-style: decimal; } - #docsContent ul, #docsContent ol { - margin: 20px 0; - padding-left: 30px; - font-weight: 300; } - #docsContent ul ul, #docsContent ol ol, #docsContent ul ol, #docsContent ol ul { - margin: 0.75em 0; } - #docsContent li { - margin-bottom: 0.75em; - font-size: 16px; - line-height: 1.75em; } - #docsContent table { - width: 100%; - border: 1px solid #ccc; - border-spacing: 0; - margin-top: 30px; - margin-bottom: 30px; } - #docsContent thead, #docsContent tr:nth-child(even) { - background-color: #f7f7f7; } - #docsContent thead { - background-color: #555; - color: white; } - #docsContent th, #docsContent td { - padding: 8px; - text-align: left; - margin: 0; } - #docsContent th { - font-weight: normal; } - #docsContent td { - font-size: 0.85em; } - #docsContent #editPageButton { - position: absolute; - top: -25px; - right: 5px; - width: 50px; - height: 50px; - line-height: 50px; - border-radius: 50%; - white-space: nowrap; - text-indent: 50px; - overflow: hidden; - background: #3371e3 url(/images/icon-pencil.svg) no-repeat; - background-position: 12px 10px; - background-size: 29px 29px; } - #docsContent #markdown-toc, #docsContent #TableOfContents { - margin-bottom: 20px; } - #docsContent #markdown-toc ul, #docsContent #markdown-toc li, #docsContent #TableOfContents ul, #docsContent #TableOfContents li { - list-style: disc; - color: #3371e3; } - #docsContent #markdown-toc ul, #docsContent #TableOfContents ul { - padding: 0 15px; - margin: 0; } - #docsContent #markdown-toc li, #docsContent #TableOfContents li { - padding: 0; - line-height: 1.5em; - margin-bottom: 0; } - #docsContent #markdown-toc a, #docsContent #TableOfContents a { - position: relative; - color: #3371e3; - font-weight: 700; } - #docsContent img { - max-width: 100%; } - #docsContent #TableOfContents > ul > li { - list-style: none; } - #docsContent #TableOfContents ul, #docsContent #TableOfContents li { - list-style: disk; } - -.fixed footer { - position: fixed; - bottom: 0; } - -#miceType { - clear: both; - font-size: 11px; - line-height: 18px; - color: #aaa; } - -html.search #docsContent { - position: relative; - float: none; - width: 90%; - max-width: 850px; - margin: 0 auto; } - html.search #docsContent #editPageButton { - display: none; } - html.search #docsContent table { - border: 0; - margin-bottom: 0; } - html.search #docsContent td { - padding: 0; } - html.search #docsContent h1 { - margin-bottom: 0; - border-bottom: 0; - padding-bottom: 0; - padding-left: 8px; } - -#home.flip-nav .logo, #home.open-nav .logo { - background-image: url(/images/nav_logo2.svg); } - -#home #hero { - margin-bottom: 0; - padding-bottom: 1px; } - #home #hero main { - padding: 0 10px; - margin-bottom: 30px; } - #home #hero #vendorStrip { - display: none; } - -#oceanNodes { - padding-top: 60px; - padding-bottom: 60px; } - #oceanNodes a { - color: #3371e3; } - #oceanNodes main { - margin-bottom: 60px; - min-height: 160px; } - #oceanNodes .image-wrapper { - max-width: 75%; - margin: 0 auto 20px; - text-align: center; } - #oceanNodes .image-wrapper img { - width: 100%; - max-width: 160px; } - #oceanNodes main:first-child .image-wrapper { - max-width: 100%; } - #oceanNodes main:first-child .image-wrapper img { - max-width: 491px; } - #oceanNodes h3 { - margin-bottom: 30px; } - -#video { - height: 200px; } - -#video { - width: 100%; - position: relative; - background-position: center center; - background-size: cover; } - #video > .light-text { - display: none; - position: absolute; - top: 50%; - left: 75%; - width: 525px; - padding-right: 80px; - transform: translate(-50%, -50%); - color: white; } - #video h2 { - font-size: 32px; - line-height: 44px; - margin-bottom: 20px; } - #video p { - margin-bottom: 20px; } - #video #desktopKCButton { - position: relative; - font-size: 18px; - background-color: #303030; - border-radius: 8px; - color: #ffffff; - padding: 20px 10px 20px 10px; } - #video #desktopShowVideoButton { - position: relative; - font-size: 24px; - background-color: white; - border-radius: 8px; - color: #3371e3; - padding: 15px 30px 15px 80px; - margin-bottom: 15px; } - #video #desktopShowVideoButton:before { - content: ""; - position: absolute; - position: absolute; - top: 50%; - left: 40px; - transform: translate(-50%, -50%); - width: 0; - height: 0; - border-style: solid; - border-width: 10px 0 10px 20px; - border-color: transparent transparent transparent #3371e3; } - #video #mobileShowVideoButton { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 80px; - height: 80px; - border-radius: 50%; - background-color: transparent; - border: 5px solid rgba(255, 255, 255, 0.2); - overflow: visible; } - #video #mobileShowVideoButton:after { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - left: 40px; - content: ""; - width: 0; - height: 0; - border-style: solid; - border-width: 20px 0 20px 30px; - border-color: transparent transparent transparent #ffffff; } - -#videoPlayer { - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - background-color: rgba(0, 0, 0, 0.9); - display: none; } - #videoPlayer iframe { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 80vw; - height: 45vw; - max-width: 142.22222222vh; - max-height: 80vh; } - #videoPlayer #closeButton { - position: absolute; - top: 20px; - right: 20px; - width: 50px; - height: 50px; - border: 2px solid transparent; - transition: 0.3s; } - #videoPlayer #closeButton:before, #videoPlayer #closeButton:after { - content: ""; - position: absolute; - top: calc(50% - 1px); - left: 10%; - width: 80%; - height: 2px; - background-color: white; } - #videoPlayer #closeButton:before { - transform: rotate(45deg); } - #videoPlayer #closeButton:after { - transform: rotate(-45deg); } - #videoPlayer #closeButton:hover { - border-color: white; } - -#cncf { - padding-top: 60px; - padding-bottom: 140px; - background-image: url(/images/cncf-color.png); - background-position: center 100px; - background-repeat: no-repeat; - background-size: 300px; } - -#kubeweekly { - background-color: #f7f7f7; - padding: 60px; - background-size: auto; - font-family: "Roboto Mono", monospace !important; - font-size: 24px; - font-weight: bold; } - #kubeweekly h5 { - font-size: 20px; } - -.subscribe-button { - border-radius: 6px; - padding: 0 20px; - line-height: 31px; - color: white; - background-color: #3371e3; - text-decoration: none; - font-size: 14px; } - -#features { - padding-top: 140px; - background-color: #f7f7f7; - background-image: url(/images/wheel.png); - background-position: center 60px; - background-repeat: no-repeat; - background-size: auto; } - -.feature-box { - width: 100%; - overflow: hidden; - clear: both; } - .feature-box h4 { - line-height: normal; - margin-bottom: 15px; } - .feature-box > div:first-child { - float: left; } - .feature-box > div:last-child { - float: right; } - -#features h3 { - margin-bottom: 20px; } - -#features .feature-box { - margin-bottom: 0; } - #features .feature-box > div { - width: 100%; - margin-bottom: 40px; } - -#community.open-nav .logo, #community.flip-nav .logo, .gridPage.open-nav .logo, .gridPage.flip-nav .logo { - background-image: url(/images/nav_logo2.svg); } - -#community #hero, .gridPage #hero { - padding-bottom: 20px; } - -#community #mainContent, .gridPage #mainContent { - padding: 20px 0; } - #community #mainContent main, .gridPage #mainContent main { - max-width: none; } - #community #mainContent a, .gridPage #mainContent a { - color: #3371e3; } - #community #mainContent .content, .gridPage #mainContent .content { - margin-bottom: 30px; - padding: 30px 0; } - #community #mainContent .content h1, #community #mainContent .content h2, #community #mainContent .content h3, #community #mainContent .content h4, #community #mainContent .content h5, #community #mainContent .content h6, #community #mainContent .content p, .gridPage #mainContent .content h1, .gridPage #mainContent .content h2, .gridPage #mainContent .content h3, .gridPage #mainContent .content h4, .gridPage #mainContent .content h5, .gridPage #mainContent .content h6, .gridPage #mainContent .content p { - line-height: normal; - max-width: 1200px; - padding: 0 20px; - margin: 0 auto 20px; } - #community #mainContent .content:nth-child(even), .gridPage #mainContent .content:nth-child(even) { - background-color: #f7f7f7; } - #community #mainContent .company-logos, .gridPage #mainContent .company-logos { - text-align: center; - max-width: 1200px; - margin: 0 auto; } - #community #mainContent .company-logos img, .gridPage #mainContent .company-logos img { - width: auto; - margin: 10px; - background-color: #f7f7f7; } - #community #mainContent .partner-logos, .gridPage #mainContent .partner-logos { - text-align: center; - max-width: 1200px; - margin: 0 auto; } - #community #mainContent .partner-logos img, .gridPage #mainContent .partner-logos img { - width: auto; - margin: 10px; - background-color: #ffffff; - box-shadow: 0 5px 5px rgba(0, 0, 0, 0.24), 0 0 5px rgba(0, 0, 0, 0.12); } - #community #mainContent #calendarMeetings, .gridPage #mainContent #calendarMeetings { - position: relative; - width: 80vw; - height: 60vw; - max-width: 1200px; - max-height: 900px; - margin: 20px auto; } - #community #mainContent #calendarEvents, .gridPage #mainContent #calendarEvents { - position: relative; - width: 80vw; - height: 30vw; - max-width: 1200px; - max-height: 450px; - margin: 20px auto; } - #community #mainContent iframe, .gridPage #mainContent iframe { - position: absolute; - border: 0; - width: 100%; - height: 100%; } - -.ui-icon { - display: inline-block !important; } - -#feature-state-dialog-link { - text-decoration: none !important; - padding: 5px !important; } - #feature-state-dialog-link a:visited { - color: #454545 !important; } - #feature-state-dialog-link a code { - display: inline-block !important; - box-sizing: border-box !important; - background-color: #f7f7f7 !important; - color: #303030 !important; - font-family: "Roboto Mono", monospace !important; - vertical-align: baseline !important; - font-size: 14px !important; - font-weight: bold !important; - padding: 0px 4px !important; } - -#feature-state-dialog { - background: #fff !important; - border: 1px solid #ddd !important; - padding: 0.5em 1em !important; } - #feature-state-dialog ul, #feature-state-dialog li { - list-style: disc !important; - margin: 4px 12px !important; } - #feature-state-dialog p { - margin: 8px 0px !important; } - #feature-state-dialog code { - display: inline-block !important; - box-sizing: border-box !important; - background-color: #f7f7f7 !important; - color: #303030 !important; - font-family: "Roboto Mono", monospace !important; - vertical-align: baseline !important; - font-size: 14px !important; - font-weight: bold !important; - padding: 0px 4px !important; } - -.ui-dialog { - background: #f7f7f7 !important; - padding: 0.5em; } - -.ui-dialog-content { - position: relative; - float: right; - width: 100%; } - .ui-dialog-content * + h2, .ui-dialog-content * + h3, .ui-dialog-content * + h4, .ui-dialog-content * + h5, .ui-dialog-content * + h6 { - margin-top: 30px; } - .ui-dialog-content h1, .ui-dialog-content h2, .ui-dialog-content h3, .ui-dialog-content h4, .ui-dialog-content h5, .ui-dialog-content h6 { - line-height: normal; - font-weight: 500; - margin-bottom: 30px; - padding-bottom: 10px; } - .ui-dialog-content h1:before, .ui-dialog-content h2:before, .ui-dialog-content h3:before, .ui-dialog-content h4:before, .ui-dialog-content h5:before, .ui-dialog-content h6:before { - display: block; - content: " "; - margin-top: -100px; - height: 100px; - visibility: hidden; } - .ui-dialog-content h1, .ui-dialog-content h2 { - border-bottom: 1px solid #cccccc; } - .ui-dialog-content h1 { - font-size: 32px; - padding-right: 60px; } - .ui-dialog-content h2 { - font-size: 28px; } - .ui-dialog-content h3 { - font-size: 24px; - font-weight: 300; - margin-bottom: 5px; } - .ui-dialog-content h4 { - font-size: 20px; - margin-bottom: 0px; } - .ui-dialog-content h5, .ui-dialog-content h6 { - font-size: 16px; - font-weight: 500; } - .ui-dialog-content p { - font-size: 16px; - font-weight: 300; - line-height: 1.75em; } - .ui-dialog-content p + p { - margin-top: 10px; } - .ui-dialog-content code { - display: inline-block; - box-sizing: border-box; - background-color: #f7f7f7; - color: #303030; - font-family: "Roboto Mono", monospace; - vertical-align: baseline; - font-size: 14px; - font-weight: bold; - padding: 2px 4px; } - .ui-dialog-content a code { - color: #3371e3; - text-decoration: underline; } - .ui-dialog-content pre .pi, .ui-dialog-content pre .s { - margin: 0; - padding: 0; } - .ui-dialog-content .highlight code span, .ui-dialog-content code, .ui-dialog-content pre code { - font-family: "Roboto Mono", monospace; } - .ui-dialog-content code, .ui-dialog-content pre code { - color: #303030; } - .ui-dialog-content pre code { - padding: 0; } - .ui-dialog-content pre { - background-color: #f7f7f7; - display: block; - margin: 20px 0; - padding: 15px; - position: relative; - overflow-x: auto; } - .ui-dialog-content h1 code, .ui-dialog-content h2 code, .ui-dialog-content h3 code, .ui-dialog-content h4 code, .ui-dialog-content h5 code, .ui-dialog-content h6 code { - font-family: inherit; - font-size: inherit; - background-color: transparent; } - .ui-dialog-content .includecode { - table-layout: fixed; } - .ui-dialog-content .includecode, .ui-dialog-content .includecode th, .ui-dialog-content .includecode td { - padding: 0 !important; } - .ui-dialog-content .includecode th { - text-align: right !important; - padding: 10px !important; } - .ui-dialog-content .includecode th a, .ui-dialog-content .includecode th a code { - color: white !important; - background-color: transparent !important; } - .ui-dialog-content .includecode pre { - margin: 0 !important; } - .ui-dialog-content ul li { - list-style: disc; } - .ui-dialog-content ol li { - list-style: decimal; } - .ui-dialog-content ul, .ui-dialog-content ol { - margin: 20px 0; - padding-left: 30px; - font-weight: 300; } - .ui-dialog-content ul ul, .ui-dialog-content ol ol, .ui-dialog-content ul ol, .ui-dialog-content ol ul { - margin: 0.75em 0; } - .ui-dialog-content li { - margin-bottom: 0.75em; - font-size: 16px; - line-height: 1.75em; } - .ui-dialog-content table { - width: 100%; - border: 1px solid #ccc; - border-spacing: 0; - margin-top: 30px; - margin-bottom: 30px; } - .ui-dialog-content thead, .ui-dialog-content tr:nth-child(even) { - background-color: #f7f7f7; } - .ui-dialog-content thead { - background-color: #555; - color: white; } - .ui-dialog-content th, .ui-dialog-content td { - padding: 8px; - text-align: left; - margin: 0; } - .ui-dialog-content th { - font-weight: normal; } - .ui-dialog-content td { - font-size: 0.85em; } - .ui-dialog-content #editPageButton { - position: absolute; - top: -25px; - right: 5px; - width: 50px; - height: 50px; - line-height: 50px; - border-radius: 50%; - white-space: nowrap; - text-indent: 50px; - overflow: hidden; - background: #3371e3 url(/images/icon-pencil.svg) no-repeat; - background-position: 12px 10px; - background-size: 29px 29px; } - .ui-dialog-content #markdown-toc { - margin-bottom: 20px; } - .ui-dialog-content #markdown-toc ul, .ui-dialog-content #markdown-toc li { - list-style: disc; - color: #3371e3; } - .ui-dialog-content #markdown-toc ul { - padding: 0 15px; - margin: 0; } - .ui-dialog-content #markdown-toc li { - padding: 0; - line-height: 1.5em; - margin-bottom: 0; } - .ui-dialog-content #markdown-toc a { - position: relative; - color: #3371e3; - font-weight: 700; } - .ui-dialog-content img { - max-width: 100%; } - .ui-dialog-content a { - text-decoration: underline; } - -.ui-dialog-buttonpane { - background: #f7f7f7 !important; } - -.ui-widget-header { - background: transparent !important; - background-color: transparent !important; - border: 0px !important; } - -.ui-tabs ul, .ui-tabs ol, .ui-tabs li { - padding: 0px !important; - list-style: none !important; - margin-bottom: 0px !important; - margin-left: 4px !important; } - -.ui-tabs-panel ul li { - list-style: disc !important; } - -.ui-tabs-panel ol li { - list-style: decimal !important; } - -.ui-widget-content { - border: 0px !important; } - .ui-widget-content table { - margin: 0px !important; } - -.ui-tabs .ui-tabs-panel { - border: 1px solid #ccc !important; } - -.ui-tabs-anchor { - text-decoration: none !important; } - -#talkToUs h3, #talkToUs h4 { - text-align: center; } - -#talkToUs h3 { - margin-bottom: 15px; } - -#talkToUs h4 { - line-height: normal; - margin-bottom: 50px; } - #talkToUs h4 br { - display: none; } - -#talkToUs #bigSocial { - overflow: hidden; } - #talkToUs #bigSocial div { - width: 100%; - float: left; - padding: 30px; - padding-top: 110px; - background-position: center top; - background-size: auto; - background-repeat: no-repeat; } - #talkToUs #bigSocial div:nth-child(1) { - background-image: url(/images/twitter_icon.png); } - #talkToUs #bigSocial div:nth-child(2) { - background-image: url(/images/github_icon.png); } - #talkToUs #bigSocial div:nth-child(3) { - background-image: url(/images/slack_icon.png); } - #talkToUs #bigSocial div:nth-child(4) { - background-image: url(/images/stackoverflow_icon.png); } - #talkToUs #bigSocial div + div { - margin-top: 20px; - margin-left: 0; } - #talkToUs #bigSocial a { - display: inline-block; - color: #3371e3; - font-size: 24px; - font-weight: 400; - text-decoration: none; - margin-bottom: 15px; } - #talkToUs #bigSocial a, #talkToUs #bigSocial p { - text-align: center; - width: 100%; } - -#home #talkToUs main { - padding: 30px 0; } - -#home #talkToUs h5 { - font-size: 20px; } - -#home #caseStudiesWrapper { - position: relative; - text-align: center; - margin-bottom: 30px; } - #home #caseStudiesWrapper img { - padding-bottom: 1rem; } - #home #caseStudiesWrapper div { - position: relative; - display: inline-block; - vertical-align: top; - width: 100%; - min-height: 230px; - margin-bottom: 60px; - padding-right: 1rem; - background-position: top center; } - #home #caseStudiesWrapper p { - font-size: 20px; } - #home #caseStudiesWrapper a { - position: absolute; - bottom: -30px; - left: 50%; - transform: translateX(-50%); - color: #3371e3; - font-weight: 400; } - -/* Google Search */ -.cse .gsc-control-cse, .gsc-control-cse { - padding: 0; } - -.gsc-control-cse table, .gsc-control-cse-en table { - margin: 0px !important; } - -.gsc-above-wrapper-area { - border-bottom: 0; } - -/* Bing Search */ -#bing-results-container { - margin-top: 30px; - margin-left: 20px; } - -.bing-result { - margin-bottom: 20px; } - -.bing-result-name a { - font-size: 16px; - color: #0000CC; } - -.bing-result-url { - color: #008000; - font-size: 13px; } - -.bing-result-snippet { - color: #000; - font-size: 11px; } - -#bing-pagination-container { - margin: 10px; - margin-left: 20px; } - -.bing-page-anchor { - text-decoration: none !important; - cursor: pointer; - color: #0000CC; - margin-right: 8px; } - -@media screen and (min-width: 750px) { - h1 { - font-size: 32px; - line-height: 40px; } - h2 { - font-size: 28px; - line-height: 60px; } - h3 { - font-size: 24px; - line-height: 32px; } - h4 { - font-size: 20px; - line-height: 40px; } - h5 { - font-size: 16px; - line-height: 36px; } - p { - font-size: 14px; - line-height: 22px; } - section, header, #vendorStrip { - padding-left: 20px; - padding-right: 20px; } - section main, header main, #vendorStrip main { - width: 100%; - max-width: 100%; } - header { - height: 80px; } - .nav-buttons { - height: 80px; - line-height: 80px; } - .nav-buttons .button + * { - margin-left: 30px; } - #hamburger { - width: 50px; - height: 50px; } - #mainNav { - padding: 140px 0 30px; } - #mainNav h5 { - margin-bottom: 1em; } - #mainNav h3 { - margin-bottom: 0.6em; } - #mainNav .nav-box { - width: 20%; } - #mainNav .nav-box + .nav-box { - margin-left: calc(20% / 3); } - #mainNav main + main { - margin-top: 60px; } - #mainNav .left .button { - height: 50px; - line-height: 50px; - font-size: 18px; } - .open-nav #tryKubernetes, .y-enough #tryKubernetes { - margin-left: 30px; } - #hero { - padding-top: 80px; } - #docs #hero h1, #docs #hero h5 { - padding-left: 20px; - padding-right: 20px; } - #vendorStrip { - height: 88px; - line-height: 88px; - font-size: 16px; } - p { - font-size: 16px; - line-height: 24px; - letter-spacing: 0.1px; } - h1 { - font-size: 36px; - line-height: 44px; } - h3 { - font-size: 28px; - line-height: 36px; } - h4 { - font-size: 24px; - line-height: 40px; } - #home #viewDocs, #home #tryKubernetes { - display: inline-block; } - #vendorStrip { - display: block; - text-align: center; } - #vendorStrip img { - max-height: 24px; - vertical-align: middle; - margin: 0 30px; } - #docs #vendorStrip li a { - font-size: 1em; - font-weight: normal; } - #docs #vendorStrip li li + li { - margin-left: 60px; } - #oceanNodes h3 { - text-align: left; - margin-bottom: 18px; } - #oceanNodes main { - position: relative; - clear: both; - display: table; - height: 160px; } - #oceanNodes main .content { - display: table-cell; - position: relative; - vertical-align: middle; } - #oceanNodes main .image-wrapper { - position: absolute; - top: 50%; - max-width: 25%; - max-height: 100%; - transform: translateY(-50%); } - #oceanNodes main:nth-child(odd) { - padding-right: 210px; } - #oceanNodes main:nth-child(odd) .image-wrapper { - right: 0; } - #oceanNodes main:nth-child(even) { - padding-left: 210px; } - #oceanNodes main:nth-child(even) .image-wrapper { - left: 0; } - #oceanNodes main:nth-child(1) { - padding-right: 0; } - #oceanNodes main:nth-child(1) h3, #oceanNodes main:nth-child(1) p { - text-align: center; } - #oceanNodes main:nth-child(1) .image-wrapper { - position: relative; - display: block; - float: none; - max-width: 100%; - transform: none; } - #oceanNodes main:nth-child(1) .content { - display: block; } - #oceanNodes main img { - width: 100%; } - #video { - height: 400px; - display: block; } - #video > .light-text { - display: block; } - #mobileShowVideoButton { - display: none; } - #features { - padding-bottom: 60px; } - #features .feature-box { - margin-bottom: 30px; } - #features .feature-box:last-child { - margin-bottom: 0; } - #features h3 { - margin-bottom: 40px; } - #features .feature-box > div { - width: 45%; - margin-bottom: 0; } - #talkToUs #bigSocial div { - width: calc(50% - 15px); } - #talkToUs #bigSocial div + div { - margin-top: 0; } - #talkToUs #bigSocial div:nth-child(2) { - margin-left: 20px; } - #talkToUs #bigSocial div:nth-child(3) { - margin-top: 20px; } - #talkToUs #bigSocial div:nth-child(4) { - margin-top: 20px; - margin-left: 20px; } - #talkToUs #bigSocial a { - display: inline-block; - color: #3371e3; - font-weight: 400; - text-decoration: none; } - footer nav { - text-align: center; } - footer nav a { - width: 30%; - padding: 0 20px; } - footer .social { - text-align: center; } - footer .social div { - display: inline-block; } - footer .social div:last-child { - display: block; - margin: 0; } - footer .social span { - display: inline-block; - margin-right: 10px; } - footer .social input { - text-align: left; } - #home #caseStudiesWrapper div { - width: 48%; } } - -@media screen and (min-width: 1025px) { - #hamburger { - display: none; } - ul.global-nav { - display: inline-block; } - #docs #vendorStrip #searchBox:before { - top: 15px; } - #vendorStrip { - height: 44px; - line-height: 44px; } - #vendorStrip li a.YAH:after { - content: ""; - display: block; - position: absolute; - left: 0; - bottom: 0; - width: 100%; - height: 4px; - background-color: #3371e3; } - #vendorStrip #searchBox { - float: right; } - #home #hero #vendorStrip { - display: block; } - #docs #hero h1, #docs #hero h5 { - text-align: left; } - #docs #hero #vendorStrip ul { - float: left; } - #docs #hero #vendorStrip #searchBox { - float: right; - width: 250px; } - #docs #hero #vendorStrip #search { - vertical-align: middle; } - #docs .flyout-button { - display: none; } - #docs .logo { - position: relative; - float: left; - display: block; - width: 180px; - height: 88px; - top: 0; - left: 0; - transform: none; - background-image: url(../images/nav_logo.svg); } - #docs.flip-nav .logo, #docs.open-nav .logo { - background-image: url(../images/nav_logo2.svg); } - #encyclopedia { - padding: 50px 50px 100px 100px; - clear: both; } - #docsToc { - position: relative; - float: left; - padding: 0 20px; - left: 0; - width: 350px; - z-index: auto; } - #docsToc .push-menu-close-button { - display: none; } - #docsContent { - width: calc(100% - 400px); } - #docsContent #editPageButton { - right: -25px; } - section main, header main, footer main { - max-width: 1200px; } - header, #vendorStrip, #encyclopedia, #hero h1, #hero h5, #docs #hero h1, #docs #hero h5, - #community #hero h1, .gridPage #hero h1, #community #hero h5, .gridPage #hero h5 { - padding-left: 100px; - padding-right: 100px; } - #vendorStrip { - padding-right: 10px; } - #home section main, #home header main, #home footer main { - max-width: 1000px; } - #oceanNodes main { - position: relative; - max-width: 830px; } - #oceanNodes main:nth-child(1) { - max-width: 1000px; - padding-right: 475px; } - #oceanNodes main:nth-child(1) h3, #oceanNodes main:nth-child(1) p { - text-align: left; } - #oceanNodes main:nth-child(1) .image-wrapper { - position: absolute; - max-width: 48%; - transform: translateY(-50%); } - #oceanNodes main:nth-child(1) .image-wrapper img { - max-width: 425px; } - #video { - height: 550px; - position: relative; - background-position: center center; - background-size: cover; } - #talkToUs h4 br { - display: block; } - #talkToUs #bigSocial div { - width: calc(25% - 18px); } - #talkToUs #bigSocial div + div { - margin-left: 20px; } - footer { - width: 100%; - background-image: url(../images/texture.png); - background-color: #303030; } - footer main { - padding: 20px 0; } - footer nav { - overflow: hidden; - margin-bottom: 20px; } - footer nav a { - width: 16.65%; - float: left; - font-size: 24px; - font-weight: 300; - white-space: nowrap; } - footer .social { - padding: 0 30px; - max-width: 1200px; } - footer .social div { - float: left; } - footer .social div:last-child { - float: right; } - #search, #wishField { - background-color: transparent; - padding: 10px; - font-size: 16px; - font-weight: 100; - color: white; - border: 1px solid white; - transition: 0.3s; } - #search:focus, #wishField:focus { - background-color: #f7f7f7; - color: #303030; } - .social a { - display: inline-block; - background-image: url(../images/social_sprite.png); - background-repeat: no-repeat; - background-size: auto; - width: 50px; - height: 50px; - border-radius: 5px; - margin-right: 10px; } - .social a:hover { - background-color: #fff; } - .social a span { - position: absolute; - display: block; - height: 0; - overflow: hidden; } - a.twitter { - background-position: 0 0; } - a.twitter:hover { - background-position: 0 100%; } - a.stack-overflow { - background-position: -50px 0; } - a.stack-overflow:hover { - background-position: -50px 100%; } - a.slack { - background-position: -100px 0; } - a.slack:hover { - background-position: -100px 100%; } - a.github { - background-position: -150px 0; } - a.github:hover { - background-position: -150px 100%; } - a.mailing-list { - background-position: -200px 0; } - a.mailing-list:hover { - background-position: -200px 100%; } - a.calendar { - background-position: -250px 0; } - a.calendar:hover { - background-position: -250px 100%; } - #community #hero, .gridPage #hero { - text-align: left; } - #community #hero h1, .gridPage #hero h1 { - padding: 20px 100px; } - #community #tryKubernetes, .gridPage #tryKubernetes { - width: auto; - background-color: #3371e3; - padding: 0 20px; } - #bigSocial div { - width: calc(25% - 18px); } - #home #caseStudiesWrapper div { - width: 24%; - min-height: 260px; } } - -@media screen and (min-width: 1300px) { - #vendorStrip { - padding-right: 100px; } } - -@media screen and (min-width: 456px) { - #vendorStrip li + li { - margin-left: 20px; } } diff --git a/resources/_gen/assets/sass/sass/styles.sass_a6e533854c4de092afe9278041939937.json b/resources/_gen/assets/sass/sass/styles.sass_a6e533854c4de092afe9278041939937.json deleted file mode 100644 index 081a4beb86..0000000000 --- a/resources/_gen/assets/sass/sass/styles.sass_a6e533854c4de092afe9278041939937.json +++ /dev/null @@ -1 +0,0 @@ -{"Target":"css/styles.css","MediaType":"text/css","Data":{}} \ No newline at end of file From a0fd05ce41b97be9086f2de3f42dd06e14ab78bb Mon Sep 17 00:00:00 2001 From: Bernat Moix Date: Fri, 16 Nov 2018 20:27:50 +0100 Subject: [PATCH 095/222] Fix typo in ip-masq-agent user guide (#11023) --- content/en/docs/tasks/administer-cluster/ip-masq-agent.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/en/docs/tasks/administer-cluster/ip-masq-agent.md b/content/en/docs/tasks/administer-cluster/ip-masq-agent.md index 6133d160c4..cd7c90ac75 100644 --- a/content/en/docs/tasks/administer-cluster/ip-masq-agent.md +++ b/content/en/docs/tasks/administer-cluster/ip-masq-agent.md @@ -4,7 +4,7 @@ content_template: templates/task --- {{% capture overview %}} -This page shows how to configure and enable the ip-masq-agent. +This page shows how to configure and enable the ip-masq-agent. {{% /capture %}} {{% capture prerequisites %}} @@ -23,7 +23,7 @@ The ip-masq-agent configures iptables rules to hide a pod's IP address behind th * **NAT (Network Address Translation)** Is a method of remapping one IP address to another by modifying either the source and/or destination address information in the IP header. Typically performed by a device doing IP routing. * **Masquerading** - A form of NAT that is typically used to perform a many to one address translation, where multiple source IP addresses are masked behind a single address, which is typically the device doing the IP routing. In Kubernetes this is the Node's IP address. + A form of NAT that is typically used to perform a many to one address translation, where multiple source IP addresses are masked behind a single address, which is typically the device doing the IP routing. In Kubernetes this is the Node's IP address. * **CIDR (Classless Inter-Domain Routing)** Based on the variable-length subnet masking, allows specifying arbitrary-length prefixes. CIDR introduced a new method of representation for IP addresses, now commonly known as **CIDR notation**, in which an address or routing prefix is written with a suffix indicating the number of bits of the prefix, such as 192.168.2.0/24. * **Link Local** @@ -90,13 +90,13 @@ Run the following command to add the config map to your cluster: kubectl create configmap ip-masq-agent --from-file=config --namespace=kube-system ``` -This will update a file located at */etc/config/ip-masq-agent* which is periodically checked every *resyscInterval* and applied to the cluster node. +This will update a file located at */etc/config/ip-masq-agent* which is periodically checked every *resyncInterval* and applied to the cluster node. After the resync interval has expired, you should see the iptables rules reflect your changes: ``` iptables -t nat -L IP-MASQ-AGENT Chain IP-MASQ-AGENT (1 references) -target prot opt source destination +target prot opt source destination RETURN all -- anywhere 169.254.0.0/16 /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL RETURN all -- anywhere 10.0.0.0/8 /* ip-masq-agent: cluster-local MASQUERADE all -- anywhere anywhere /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL From c174445858514e50d051ed33c7402add40f1ec30 Mon Sep 17 00:00:00 2001 From: yanghaichao12 Date: Sat, 17 Nov 2018 03:34:26 +0800 Subject: [PATCH 096/222] Fix some errro in kubelet.md (#11010) --- .../en/docs/reference/command-line-tools-reference/kubelet.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/reference/command-line-tools-reference/kubelet.md b/content/en/docs/reference/command-line-tools-reference/kubelet.md index 8002767a65..29a3ff6eea 100644 --- a/content/en/docs/reference/command-line-tools-reference/kubelet.md +++ b/content/en/docs/reference/command-line-tools-reference/kubelet.md @@ -945,7 +945,7 @@ kubelet [flags] --registry-burst int32 - Maximum size of a bursty pulls, temporarily allows pulls to burst to this number, while still not exceeding registry-qps. Only used if --registry-qps > 0 (default 10) + Maximum size of bursty pulls, temporarily allows pulls to burst to this number, while still not exceeding registry-qps. Only used if --registry-qps > 0 (default 10) @@ -1113,7 +1113,7 @@ kubelet [flags] --tls-cipher-suites stringSlice - Comma-separated list of cipher suites for the server. If omitted, the default Go cipher suites will be use. Possible values: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_RC4_128_SHA + Comma-separated list of cipher suites for the server. If omitted, the default Go cipher suites will be used. Possible values: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_RC4_128_SHA From 2bfdd42aa71ffc44376a78205c6917a8d3a736a7 Mon Sep 17 00:00:00 2001 From: Adam Connelly Date: Fri, 16 Nov 2018 19:37:48 +0000 Subject: [PATCH 097/222] Added documentation about stringData (#10938) * Added documentation about stringData I've added some documentation about the stringData field, including a simple example showing how it can be used. * fixup! Added documentation about stringData * fixup! Added documentation about stringData --- .../en/docs/concepts/configuration/secret.md | 116 ++++++++++++++++-- 1 file changed, 107 insertions(+), 9 deletions(-) diff --git a/content/en/docs/concepts/configuration/secret.md b/content/en/docs/concepts/configuration/secret.md index c7ebe895c1..4201c2d5a4 100644 --- a/content/en/docs/concepts/configuration/secret.md +++ b/content/en/docs/concepts/configuration/secret.md @@ -102,19 +102,24 @@ See [decoding a secret](#decoding-a-secret) for how to see the contents. #### Creating a Secret Manually -You can also create a secret object in a file first, -in json or yaml format, and then create that object. +You can also create a Secret in a file first, in json or yaml format, +and then create that object. The +[Secret](/docs/reference/generated/kubernetes-api/v1.12/#secret-v1-core) contains two maps: +data and stringData. The data field is used to store arbitrary data, encoded using +base64. The stringData field is provided for convenience, and allows you to provide +secret data as unencoded strings. -Each item must be base64 encoded: +For example, to store two strings in a Secret using the data field, convert +them to base64 as follows: ```shell -$ echo -n 'admin' | base64 +echo -n 'admin' | base64 YWRtaW4= -$ echo -n '1f2d1e2e67df' | base64 +echo -n '1f2d1e2e67df' | base64 MWYyZDFlMmU2N2Rm ``` -Now write a secret object that looks like this: +Write a Secret that looks like this: ```yaml apiVersion: v1 @@ -127,15 +132,108 @@ data: password: MWYyZDFlMmU2N2Rm ``` -The data field is a map. Its keys must consist of alphanumeric characters, '-', '_' or '.'. The values are arbitrary data, encoded using base64. - -Create the secret using [`kubectl create`](/docs/reference/generated/kubectl/kubectl-commands#create): +Now create the Secret using [`kubectl create`](/docs/reference/generated/kubectl/kubectl-commands#create): ```shell $ kubectl create -f ./secret.yaml secret "mysecret" created ``` +For certain scenarios, you may wish to use the stringData field instead. This +field allows you to put a non-base64 encoded string directly into the Secret, +and the string will be encoded for you when the Secret is created or updated. + +A practical example of this might be where you are deploying an application +that uses a Secret to store a configuration file, and you want to populate +parts of that configuration file during your deployment process. + +If your application uses the following configuration file: + +```yaml +apiUrl: "https://my.api.com/api/v1" +username: "user" +password: "password" +``` + +You could store this in a Secret using the following: + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: mysecret +type: Opaque +stringData: + config.yaml: |- + apiUrl: "https://my.api.com/api/v1" + username: {{username}} + password: {{password}} +``` + +Your deployment tool could then replace the `{{username}}` and `{{password}}` +template variables before running `kubectl create`. + +stringData is a write-only convenience field. It is never output when +retrieving Secrets. For example, if you run the following command: + +```shell +kubectl get secret mysecret -o yaml +``` + +The output will be similar to: + +```yaml +apiVersion: v1 +data: + config.yaml: YXBpVXJsOiAiaHR0cHM6Ly9teS5hcGkuY29tL2FwaS92MSIKdXNlcm5hbWU6IHt7dXNlcm5hbWV9fQpwYXNzd29yZDoge3twYXNzd29yZH19 +kind: Secret +metadata: + creationTimestamp: 2018-11-15T20:40:59Z + name: mysecret + namespace: default + resourceVersion: "7225" + selfLink: /api/v1/namespaces/default/secrets/mysecret + uid: c280ad2e-e916-11e8-98f2-025000000001 +type: Opaque +``` + +If a field is specified in both data and stringData, the value from stringData +is used. For example, the following Secret definition: + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: mysecret +type: Opaque +data: + username: YWRtaW4= +stringData: + username: administrator +``` + +Results in the following secret: + +```yaml +apiVersion: v1 +data: + username: YWRtaW5pc3RyYXRvcg== +kind: Secret +metadata: + creationTimestamp: 2018-11-15T20:46:46Z + name: mysecret + namespace: default + resourceVersion: "7579" + selfLink: /api/v1/namespaces/default/secrets/mysecret + uid: 91460ecb-e917-11e8-98f2-025000000001 +type: Opaque +``` + +Where `YWRtaW5pc3RyYXRvcg==` decodes to `administrator`. + +The keys of data and stringData must consist of alphanumeric characters, +'-', '_' or '.'. + **Encoding Note:** The serialized JSON and YAML values of secret data are encoded as base64 strings. Newlines are not valid within these strings and must be omitted. When using the `base64` utility on Darwin/macOS users should avoid From 6f3b8cbd9b62d1b1d2568d8075acbac005c2123a Mon Sep 17 00:00:00 2001 From: Sandeep Rajan Date: Fri, 16 Nov 2018 15:35:38 -0500 Subject: [PATCH 098/222] Update documentation on CoreDNS (#10923) * update documentation on CoreDNS * Update dns-custom-nameservers.md Fixed nit noted in comments and cleaned up a few more things while I was in there. This whole topic needs a complete redo, but this PR is an iterative improvment. Thanks! --- .../connect-applications-service.md | 4 ++-- .../setup/independent/troubleshooting-kubeadm.md | 3 +++ content/en/docs/setup/turnkey/gce.md | 2 +- .../en/docs/tasks/administer-cluster/coredns.md | 5 +++++ .../administer-cluster/dns-custom-nameservers.md | 16 +++++++--------- 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/content/en/docs/concepts/services-networking/connect-applications-service.md b/content/en/docs/concepts/services-networking/connect-applications-service.md index c01eb8c68f..ae0160ad9f 100644 --- a/content/en/docs/concepts/services-networking/connect-applications-service.md +++ b/content/en/docs/concepts/services-networking/connect-applications-service.md @@ -122,7 +122,7 @@ about the [service proxy](/docs/concepts/services-networking/service/#virtual-ip Kubernetes supports 2 primary modes of finding a Service - environment variables and DNS. The former works out of the box while the latter requires the -[kube-dns cluster addon](http://releases.k8s.io/{{< param "githubbranch" >}}/cluster/addons/dns/kube-dns/README.md). +[CoreDNS cluster addon](http://releases.k8s.io/{{< param "githubbranch" >}}/cluster/addons/dns/coredns). ### Environment Variables @@ -178,7 +178,7 @@ kube-dns ClusterIP 10.0.0.10 53/UDP,53/TCP 8m If it isn't running, you can [enable it](http://releases.k8s.io/{{< param "githubbranch" >}}/cluster/addons/dns/README.md#how-do-i-configure-it). The rest of this section will assume you have a Service with a long lived IP -(my-nginx), and a DNS server that has assigned a name to that IP (the kube-dns +(my-nginx), and a DNS server that has assigned a name to that IP (the CoreDNS cluster addon), so you can talk to the Service from any pod in your cluster using standard methods (e.g. gethostbyname). Let's run another curl application to test this: diff --git a/content/en/docs/setup/independent/troubleshooting-kubeadm.md b/content/en/docs/setup/independent/troubleshooting-kubeadm.md index 70a29a3f94..a5ab81a62c 100644 --- a/content/en/docs/setup/independent/troubleshooting-kubeadm.md +++ b/content/en/docs/setup/independent/troubleshooting-kubeadm.md @@ -258,6 +258,9 @@ kubectl -n kube-system get deployment coredns -o yaml | \ kubectl apply -f - ``` +Another cause for CoreDNS to have `CrashLoopBackOff` is when a CoreDNS Pod deployed in Kubernetes detects a loop. [A number of workarounds](https://github.com/coredns/coredns/tree/master/plugin/loop#troubleshooting-loops-in-kubernetes-clusters) +are available to avoid Kubernetes trying to restart the CoreDNS Pod every time CoreDNS detects the loop and exits. + {{< warning >}} Disabling SELinux or setting `allowPrivilegeEscalation` to `true` can compromise the security of your cluster. diff --git a/content/en/docs/setup/turnkey/gce.md b/content/en/docs/setup/turnkey/gce.md index 90618e1dac..752a8785c0 100644 --- a/content/en/docs/setup/turnkey/gce.md +++ b/content/en/docs/setup/turnkey/gce.md @@ -134,11 +134,11 @@ You'll see a list of pods that looks something like this (the name specifics wil ```shell NAMESPACE NAME READY STATUS RESTARTS AGE +kube-system coredns-5f4fbb68df-mc8z8 1/1 Running 0 15m kube-system fluentd-cloud-logging-kubernetes-minion-63uo 1/1 Running 0 14m kube-system fluentd-cloud-logging-kubernetes-minion-c1n9 1/1 Running 0 14m kube-system fluentd-cloud-logging-kubernetes-minion-c4og 1/1 Running 0 14m kube-system fluentd-cloud-logging-kubernetes-minion-ngua 1/1 Running 0 14m -kube-system kube-dns-v5-7ztia 3/3 Running 0 15m kube-system kube-ui-v1-curt1 1/1 Running 0 15m kube-system monitoring-heapster-v5-ex4u3 1/1 Running 1 15m kube-system monitoring-influx-grafana-v1-piled 2/2 Running 0 15m diff --git a/content/en/docs/tasks/administer-cluster/coredns.md b/content/en/docs/tasks/administer-cluster/coredns.md index e314f490e7..db6d1881f6 100644 --- a/content/en/docs/tasks/administer-cluster/coredns.md +++ b/content/en/docs/tasks/administer-cluster/coredns.md @@ -63,6 +63,11 @@ value to `false`: kubeadm init --feature-gates=CoreDNS=false ``` +## Tuning CoreDNS + +When resource utilisation is a concern, it may be useful to tune the configuration of CoreDNS. For more details, check out the +[documentation on scaling CoreDNS]((https://github.com/coredns/deployment/blob/master/kubernetes/Scaling_CoreDNS.md)). + {{% /capture %}} {{% capture whatsnext %}} diff --git a/content/en/docs/tasks/administer-cluster/dns-custom-nameservers.md b/content/en/docs/tasks/administer-cluster/dns-custom-nameservers.md index 2d3c921ea5..5902964d58 100644 --- a/content/en/docs/tasks/administer-cluster/dns-custom-nameservers.md +++ b/content/en/docs/tasks/administer-cluster/dns-custom-nameservers.md @@ -103,10 +103,10 @@ The Corefile configuration includes the following [plugins](https://coredns.io/p * [proxy](https://coredns.io/plugins/proxy/): Any queries that are not within the cluster domain of Kubernetes will be forwarded to predefined resolvers (/etc/resolv.conf). * [cache](https://coredns.io/plugins/cache/): This enables a frontend cache. * [loop](https://coredns.io/plugins/loop/): Detects simple forwarding loops and halts the CoreDNS process if a loop is found. -* [reload](https://coredns.io/plugins/reload): Allows automatic reload of a changed Corefile. -* [loadbalance](https://coredns.io/plugins/loadbalance): This is a round-robin DNS loadbalancer by randomizing the order of A, AAAA, and MX records in the answer. +* [reload](https://coredns.io/plugins/reload): Allows automatic reload of a changed Corefile. After you edit the ConfigMap configuration, allow two minutes for your changes to take effect. +* [loadbalance](https://coredns.io/plugins/loadbalance): This is a round-robin DNS loadbalancer that randomizes the order of A, AAAA, and MX records in the answer. -We can modify the default behavior by modifying this configmap. +You can modify the default CoreDNS behavior by modifying the ConfigMap. ### Configuration of Stub-domain and upstream nameserver using CoreDNS @@ -132,7 +132,7 @@ proxy . 172.16.0.1 upstream 172.16.0.1 ``` -So, the final ConfigMap along with the default `Corefile` configuration will look like: +The final ConfigMap along with the default `Corefile` configuration looks like: ```yaml apiVersion: v1 @@ -307,9 +307,9 @@ data: ## CoreDNS configuration equivalent to kube-dns -CoreDNS supports all the functionalities and more that is provided by kube-dns. +CoreDNS supports the features of kube-dns and more. A ConfigMap created for kube-dns to support `StubDomains`and `upstreamNameservers` translates to the `proxy` plugin in CoreDNS. -Similarly, the `Federation` plugin translates to the `federation` plugin in CoreDNS. +Similarly, the `Federations` plugin in kube-dns translates to the `federation` plugin in CoreDNS. ### Example @@ -380,12 +380,10 @@ The complete Corefile with the default plugins: } ``` -In Kubernetes version 1.10 and later, kubeadm supports automatic translation of the CoreDNS ConfigMap from the kube-dns ConfigMap. - ## Migration to CoreDNS To migrate from kube-dns to CoreDNS, [a detailed blog](https://coredns.io/2018/05/21/migration-from-kube-dns-to-coredns/) is available to help users adapt CoreDNS in place of kube-dns. -A cluster administrator can also migrate using [the deploy script](https://github.com/coredns/deployment/blob/master/kubernetes/deploy.sh), which will also help you translate the kube-dns configmap to the equivalent CoreDNS one. +A cluster administrator can also migrate using [the deploy script](https://github.com/coredns/deployment/blob/master/kubernetes/deploy.sh). ## What's next - [Debugging DNS Resolution](/docs/tasks/administer-cluster/dns-debugging-resolution/). From fe46040b2e91b6c1f9fab62683ef2956c8a2ee52 Mon Sep 17 00:00:00 2001 From: Joseph Heck Date: Fri, 16 Nov 2018 12:37:21 -0800 Subject: [PATCH 099/222] rewrite of ingress (#10958) * rewrite of ingress - reset and rewritten to provide more clarity and directness on what ingress is and does. * cleanup from review - also normalized Ingress -> ingress through-out --- .../concepts/services-networking/ingress.md | 265 +++++++++++------- 1 file changed, 161 insertions(+), 104 deletions(-) diff --git a/content/en/docs/concepts/services-networking/ingress.md b/content/en/docs/concepts/services-networking/ingress.md index 6aed8a8b8f..ef79cc759d 100644 --- a/content/en/docs/concepts/services-networking/ingress.md +++ b/content/en/docs/concepts/services-networking/ingress.md @@ -13,48 +13,90 @@ weight: 40 {{% capture body %}} ## Terminology -Throughout this doc you will see a few terms that are sometimes used interchangeably elsewhere, that might cause confusion. This section attempts to clarify them. +For the sake of clarity, this guide defines the following terms: * Node: A single virtual or physical machine in a Kubernetes cluster. * Cluster: A group of nodes firewalled from the internet, that are the primary compute resources managed by Kubernetes. * Edge router: A router that enforces the firewall policy for your cluster. This could be a gateway managed by a cloud provider or a physical piece of hardware. -* Cluster network: A set of links, logical or physical, that facilitate communication within a cluster according to the [Kubernetes networking model](/docs/concepts/cluster-administration/networking/). Examples of a Cluster network include Overlays such as [flannel](https://github.com/coreos/flannel#flannel) or SDNs such as [OVS](https://www.openvswitch.org/). +* Cluster network: A set of links, logical or physical, that facilitate communication within a cluster according to the [Kubernetes networking model](/docs/concepts/cluster-administration/networking/). * Service: A Kubernetes [Service](/docs/concepts/services-networking/service/) that identifies a set of pods using label selectors. Unless mentioned otherwise, Services are assumed to have virtual IPs only routable within the cluster network. ## What is Ingress? -Typically, services and pods have IPs only routable by the cluster network. All traffic that ends up at an edge router is either dropped or forwarded elsewhere. Conceptually, this might look like: +Ingress, added in Kubernetes v1.1, exposes HTTP and HTTPS routes from outside the cluster to +{{< link text="services" url="/docs/concepts/services-networking/service/" >}} within the cluster. +Traffic routing is controlled by rules defined on the ingress resource. ```none internet | - ------------ - [ Services ] -``` - -An Ingress is a collection of rules that allow inbound connections to reach the cluster services. - -``` - internet - | [ Ingress ] --|-----|-- [ Services ] ``` -It can be configured to give services externally-reachable URLs, load balance traffic, terminate SSL, offer name based virtual hosting, and more. Users request ingress by POSTing the Ingress resource to the API server. An [Ingress controller](#ingress-controllers) is responsible for fulfilling the Ingress, usually with a loadbalancer, though it may also configure your edge router or additional frontends to help handle the traffic in an HA manner. +An ingress can be configured to give services externally-reachable URLs, load balance traffic, terminate SSL, and offer name based virtual hosting. An [ingress controller](#ingress-controllers) is responsible for fulfilling the ingress, usually with a loadbalancer, though it may also configure your edge router or additional frontends to help handle the traffic. + +An ingress does not expose arbitrary ports or protocols. Exposing services other than HTTP and HTTPS to the internet typically +uses a service of type [Service.Type=NodePort](/docs/concepts/services-networking/service/#nodeport) or +[Service.Type=LoadBalancer](/docs/concepts/services-networking/service/#loadbalancer). ## Prerequisites -Before you start using the Ingress resource, there are a few things you should understand. The Ingress is a beta resource, not available in any Kubernetes release prior to 1.1. You need an Ingress controller to satisfy an Ingress, simply creating the resource will have no effect. +{{< feature-state for_k8s_version="v1.1" state="beta" >}} -GCE/Google Kubernetes Engine deploys an ingress controller on the master. You can deploy any number of custom ingress controllers in a pod. You must annotate each ingress with the appropriate class, as indicated [here](https://git.k8s.io/ingress-nginx/docs/user-guide/multiple-ingress.md#multiple-ingress-controllers) and [here](https://git.k8s.io/ingress-gce/examples/PREREQUISITES.md#ingress-class). +Before you start using an ingress, there are a few things you should understand. The ingress is a beta resource. You will need an ingress controller to satisfy an ingress, simply creating the resource will have no effect. -Make sure you review the [beta limitations](https://github.com/kubernetes/ingress-gce/blob/master/BETA_LIMITATIONS.md#glbc-beta-limitations) of this controller. In environments other than GCE/Google Kubernetes Engine, you need to [deploy a controller](https://git.k8s.io/ingress-nginx/README.md) as a pod. +GCE/Google Kubernetes Engine deploys an [ingress controller](#ingress-controllers) on the master. Review the +[beta limitations](https://github.com/kubernetes/ingress-gce/blob/master/BETA_LIMITATIONS.md#glbc-beta-limitations) +of this controller if you are using GCE/GKE. + +In environments other than GCE/Google Kubernetes Engine, you may need to +[deploy an ingress controller](https://kubernetes.github.io/ingress-nginx/deploy/). There are a number of +[ingress controller](#ingress-controllers) you may choose from. + +## Ingress controllers + +In order for the ingress resource to work, the cluster must have an ingress controller running. This is unlike other types of controllers, which run as part of the `kube-controller-manager` binary, and are typically started automatically with a cluster. Choose the ingress controller implementation that best fits your cluster. + +* Kubernetes as a project currently supports and maintains [GCE](https://git.k8s.io/ingress-gce/README.md) and + [nginx](https://git.k8s.io/ingress-nginx/README.md) controllers. + +Additional controllers include: + +* [Contour](https://github.com/heptio/contour) is an [Envoy](https://www.envoyproxy.io) based ingress controller + provided and supported by Heptio. +* F5 Networks provides [support and maintenance](https://support.f5.com/csp/article/K86859508) + for the [F5 BIG-IP Controller for Kubernetes](http://clouddocs.f5.com/products/connectors/k8s-bigip-ctlr/latest). +* [HAProxy](http://www.haproxy.org/) based ingress controller + [jcmoraisjr/haproxy-ingress](https://github.com/jcmoraisjr/haproxy-ingress) which is mentioned on the blog post + [HAProxy Ingress Controller for Kubernetes](https://www.haproxy.com/blog/haproxy_ingress_controller_for_kubernetes/). + [HAProxy Technologies](https://www.haproxy.com/) offers support and maintenance for HAProxy Enterprise and + the ingress controller [jcmoraisjr/haproxy-ingress](https://github.com/jcmoraisjr/haproxy-ingress). +* [Istio](https://istio.io/) based ingress controller + [Control Ingress Traffic](https://istio.io/docs/tasks/traffic-management/ingress/). +* [Kong](https://konghq.com/) offers [community](https://discuss.konghq.com/c/kubernetes) or + [commercial](https://konghq.com/api-customer-success/) support and maintenance for the + [Kong Ingress Controllerfor Kubernetes](https://konghq.com/blog/kubernetes-ingress-controller-for-kong/). +* [NGINX, Inc.](https://www.nginx.com/) offers support and maintenance for the + [NGINX Ingress Controller for Kubernetes](https://www.nginx.com/products/nginx/kubernetes-ingress-controller). +* [Traefik](https://github.com/containous/traefik) is a fully featured ingress controller + ([Let's Encrypt](https://letsencrypt.org), secrets, http2, websocket), and it also comes with commercial + support by [Containous](https://containo.us/services). + +{{< note >}} +Review the documentation for your controller to find its specific support policy. +{{< /note >}} + +You may deploy [any number of ingress controllers](https://git.k8s.io/ingress-nginx/docs/user-guide/multiple-ingress.md#multiple-ingress-controllers) within a cluster. +When you create an ingress, you should annotate each ingress with the appropriate +[`ingress-class`](https://git.k8s.io/ingress-gce/examples/PREREQUISITES.md#ingress-class) to indicate which ingress +controller should be used if more than one exists within your cluster. +If you do not define a class, your cloud provider may use a default ingress provider. ## The Ingress Resource -A minimal Ingress might look like: +A minimal ingress example: ```yaml apiVersion: extensions/v1beta1 @@ -73,41 +115,41 @@ spec: servicePort: 80 ``` -*POSTing this to the API server will have no effect if you have not configured an [Ingress controller](#ingress-controllers).* + __Lines 1-6__: As with all other Kubernetes resources, an ingress needs `apiVersion`, `kind`, and `metadata` fields. + For general information about working with config files, see [deploying applications](/docs/tasks/run-application/run-stateless-application-deployment/), [configuring containers](/docs/tasks/configure-pod-container/configure-pod-configmap/), [managing resources](/docs/concepts/cluster-administration/manage-deployment/). + Ingress frequently uses annotations to configure some options depending on the ingress controller, an example of which + is the [rewrite-target annotation](https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/rewrite/README.md). + Different [ingress controller](#ingress-controllers) support different annotations. Review the documentation for + the ingress controller you are using to learn which annotations are supported and valid options. -__Lines 1-6__: As with all other Kubernetes config, an Ingress needs `apiVersion`, `kind`, and `metadata` fields. For general information about working with config files, see [deploying applications](/docs/tasks/run-application/run-stateless-application-deployment/), [configuring containers](/docs/tasks/configure-pod-container/configure-pod-configmap/), [managing resources](/docs/concepts/cluster-administration/manage-deployment/) and [ingress configuration rewrite](https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/rewrite/README.md). +__Lines 7-9__: Ingress [spec](https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status) +has all the information needed to configure a loadbalancer or proxy server. Most importantly, it +contains a list of rules matched against all incoming requests. Ingress resource only supports rules +for directing http traffic. -__Lines 7-9__: Ingress [spec](https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status) has all the information needed to configure a loadbalancer or proxy server. Most importantly, it contains a list of rules matched against all incoming requests. Currently the Ingress resource only supports http rules. +__Lines 10-11__: Each http rule contains the following information: -__Lines 10-11__: Each http rule contains the following information: A host (e.g.: foo.bar.com, defaults to * in this example), a list of paths (e.g.: /testpath) each of which has an associated backend (test:80). Both the host and path must match the content of an incoming request before the loadbalancer directs traffic to the backend. +* An optional host. In this example, no host is specified, so the rule will apply to all inbound + HTTP traffic through the IP address that will be connected. If a host is provided, for example: + foo.bar.com, the rules will apply on to that host) +* a list of paths (e.g.: /testpath) each of which has an associated backend defined with a `serivceName` + and `servicePort`. Both the host and path must match the content of an incoming request before the + loadbalancer directs traffic to the referenced service. -__Lines 12-14__: A backend is a service:port combination as described in the [services doc](/docs/concepts/services-networking/service/). Ingress traffic is typically sent directly to the endpoints matching a backend. +__Lines 12-14__: A backend is a service:port combination as described in the [services doc](/docs/concepts/services-networking/service/). +Ingress traffic is typically sent directly to the endpoints matching a backend. -__Global Parameters__: For the sake of simplicity the example Ingress has no global parameters, see the [API reference](https://releases.k8s.io/{{< param "githubbranch" >}}/staging/src/k8s.io/api/extensions/v1beta1/types.go) for a full definition of the resource. One can specify a global default backend in the absence of which requests that don't match a path in the spec are sent to the default backend of the Ingress controller. - -## Ingress controllers - -In order for the Ingress resource to work, the cluster must have an Ingress controller running. This is unlike other types of controllers, which typically run as part of the `kube-controller-manager` binary, and which are typically started automatically as part of cluster creation. Choose the ingress controller implementation that best fits your cluster, or implement a new ingress controller. - -* Kubernetes currently supports and maintains [GCE](https://git.k8s.io/ingress-gce/README.md) and [nginx](https://git.k8s.io/ingress-nginx/README.md) controllers. -* F5 Networks provides [support and maintenance](https://support.f5.com/csp/article/K86859508) for the [F5 BIG-IP Controller for Kubernetes](http://clouddocs.f5.com/products/connectors/k8s-bigip-ctlr/latest). -* [Kong](https://konghq.com/) offers [community](https://discuss.konghq.com/c/kubernetes) or [commercial](https://konghq.com/api-customer-success/) support and maintenance for the [Kong Ingress Controller for Kubernetes](https://konghq.com/blog/kubernetes-ingress-controller-for-kong/) -* [Traefik](https://github.com/containous/traefik) is a fully featured ingress controller -([Let's Encrypt](https://letsencrypt.org), secrets, http2, websocket...), and it also comes with commercial support by [Containous](https://containo.us/services) -* [NGINX, Inc.](https://www.nginx.com/) offers support and maintenance for the [NGINX Ingress Controller for Kubernetes](https://www.nginx.com/products/nginx/kubernetes-ingress-controller) -* [HAProxy](http://www.haproxy.org/) based ingress controller [jcmoraisjr/haproxy-ingress](https://github.com/jcmoraisjr/haproxy-ingress) which is mentioned on this blog post [HAProxy Ingress Controller for Kubernetes](https://www.haproxy.com/blog/haproxy_ingress_controller_for_kubernetes/). [HAProxy Technologies](https://www.haproxy.com/) offers support and maintenance for HAProxy Enterprise and the ingress controller [jcmoraisjr/haproxy-ingress](https://github.com/jcmoraisjr/haproxy-ingress). -* [Istio](https://istio.io/) based ingress controller [Control Ingress Traffic](https://istio.io/docs/tasks/traffic-management/ingress/) - -{{< note >}} -Review the documentation for your controller to find its specific support policy. -{{< /note >}} +A default backend is often configured in an ingress controller that will service any requests that don't match a path in the spec. ## Before you begin -The following document describes a set of cross-platform features exposed through the Ingress resource. Ideally, all Ingress controllers should fulfill this specification, but we're not there yet. We currently support and maintain [GCE](https://git.k8s.io/ingress-gce/README.md) and [nginx](https://git.k8s.io/ingress-nginx/README.md) controllers. If you use the F5 BIG-IP Controller, see [Use the BIG-IP Controller as a Kubernetes Ingress Controller](http://clouddocs.f5.com/containers/latest/kubernetes/kctlr-k8s-ingress-ctlr.html). +Ideally, all ingress controllers should fulfill this specification, but the various ingress +controllers operate slightly differently. The Kubernetes project supports and maintain +[GCE](https://git.k8s.io/ingress-gce/README.md) and [nginx](https://git.k8s.io/ingress-nginx/README.md) +ingress controllers. {{< note >}} -Make sure you review your controller's specific docs so you understand the caveats. +Make sure you review your [ingress controller](#ingress-controllers)'s specific docs to understand the caveats. {{< /note >}} ## Types of Ingress @@ -115,8 +157,8 @@ Make sure you review your controller's specific docs so you understand the cavea ### Single Service Ingress There are existing Kubernetes concepts that allow you to expose a single Service -(see [alternatives](#alternatives)), however you can do so through an Ingress -as well, by specifying a *default backend* with no rules. +(see [alternatives](#alternatives)). You can also do this with an ingress by specifying a +*default backend* with no rules. {{< codenew file="service/networking/ingress.yaml" >}} @@ -131,29 +173,32 @@ NAME HOSTS ADDRESS PORTS AGE test-ingress * 107.178.254.228 80 59s ``` -Where `107.178.254.228` is the IP allocated by the Ingress controller to satisfy -this Ingress. +Where `107.178.254.228` is the IP allocated by the ingress controller to satisfy +this ingress. + +{{< note >}} +Ingress controllers and load balancers may take a minute or two to allocate an IP address. Until that time you +will often see the address listed as ``. +{{< /note >}} ### Simple fanout -As described previously, Pods within kubernetes have IPs only visible on the -cluster network, so we need something at the edge accepting ingress traffic and -proxying it to the right endpoints. This component is usually a highly available -loadbalancer. An Ingress allows you to keep the number of loadbalancers down +A fanout configuration routes traffic from a single IP address to more than one service, based on the HTTP URI being requested. + An ingress allows you to keep the number of loadbalancers down to a minimum. For example, a setup like: ```shell -foo.bar.com -> 178.91.123.132 -> / foo s1:80 - / bar s2:80 +foo.bar.com -> 178.91.123.132 -> / foo service1:4200 + / bar service2:8080 ``` -would require an Ingress such as: +would require an ingress such as: ```yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: - name: test + name: simple-fanout-example annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: @@ -163,22 +208,22 @@ spec: paths: - path: /foo backend: - serviceName: s1 - servicePort: 80 + serviceName: service1 + servicePort: 4200 - path: /bar backend: - serviceName: s2 - servicePort: 80 + serviceName: service2 + servicePort: 8080 ``` -When you create the Ingress with `kubectl create -f`: +When you create the ingress with `kubectl create -f`: ```shell -kubectl describe ingress test +kubectl describe ingress simple-fanout-example ``` ```shell -Name: test +Name: simple-fanout-example Namespace: default Address: 178.91.123.132 Default backend: default-http-backend:80 (10.8.2.3:8080) @@ -186,8 +231,8 @@ Rules: Host Path Backends ---- ---- -------- foo.bar.com - /foo s1:80 (10.8.0.90:80) - /bar s2:80 (10.8.0.91:80) + /foo service1:4200 (10.8.0.90:4200) + /bar service2:8080 (10.8.0.91:8080) Annotations: nginx.ingress.kubernetes.io/rewrite-target: / Events: @@ -196,18 +241,19 @@ Events: Normal ADD 22s loadbalancer-controller default/test ``` -The Ingress controller will provision an implementation specific loadbalancer -that satisfies the Ingress, as long as the services (`s1`, `s2`) exist. +The ingress controller will provision an implementation specific loadbalancer +that satisfies the ingress, as long as the services (`s1`, `s2`) exist. When it has done so, you will see the address of the loadbalancer at the Address field. {{< note >}} -You need to create a default-http-backend [Service](/docs/concepts/services-networking/service/) if necessary. +Depending on the [ingress controller](#ingress-controllers) you are using, you may need to +create a default-http-backend [Service](/docs/concepts/services-networking/service/). {{< /note >}} ### Name based virtual hosting -Name-based virtual hosts use multiple host names for the same IP address. +Name-based virtual hosts support routing HTTP traffic to multiple host names at the same IP address. ```none foo.bar.com --| |-> foo.bar.com s1:80 @@ -215,45 +261,45 @@ foo.bar.com --| |-> foo.bar.com s1:80 bar.foo.com --| |-> bar.foo.com s2:80 ``` -The following Ingress tells the backing loadbalancer to route requests based on +The following ingress tells the backing loadbalancer to route requests based on the [Host header](https://tools.ietf.org/html/rfc7230#section-5.4). ```yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: - name: test + name: name-virtual-host-ingress spec: rules: - host: foo.bar.com http: paths: - backend: - serviceName: s1 + serviceName: service1 servicePort: 80 - host: bar.foo.com http: paths: - backend: - serviceName: s2 + serviceName: service2 servicePort: 80 ``` -__Default Backends__: An Ingress with no rules, like the one shown in the previous +__Default Backends__: An ingress with no rules, like the one shown in the previous section, sends all traffic to a single default backend. You can use the same technique to tell a loadbalancer where to find your website's 404 page, by specifying a set of rules *and* a default backend. Traffic is routed to your -default backend if none of the Hosts in your Ingress match the Host in the +default backend if none of the Hosts in your ingress match the Host in the request header, and/or none of the paths match the URL of the request. ### TLS -You can secure an Ingress by specifying a [secret](/docs/concepts/configuration/secret) -that contains a TLS private key and certificate. Currently the Ingress only +You can secure an ingress by specifying a [secret](/docs/concepts/configuration/secret) +that contains a TLS private key and certificate. Currently the ingress only supports a single TLS port, 443, and assumes TLS termination. If the TLS -configuration section in an Ingress specifies different hosts, they will be +configuration section in an ingress specifies different hosts, they will be multiplexed on the same port according to the hostname specified through the -SNI TLS extension (provided the Ingress controller supports SNI). The TLS secret +SNI TLS extension (provided the ingress controller supports SNI). The TLS secret must contain keys named `tls.crt` and `tls.key` that contain the certificate and private key to use for TLS, e.g.: @@ -264,46 +310,54 @@ data: tls.key: base64 encoded key kind: Secret metadata: - name: testsecret + name: testsecret-tls namespace: default type: Opaque ``` -Referencing this secret in an Ingress will tell the Ingress controller to -secure the channel from the client to the loadbalancer using TLS: +Referencing this secret in an ingress will tell the ingress controller to +secure the channel from the client to the loadbalancer using TLS. You need to make +sure the TLS secret you created came from a certificate that contains a CN +for `sslexample.foo.com`. ```yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: - name: no-rules-map + name: tls-example-ingress spec: tls: - - secretName: testsecret - backend: - serviceName: s1 - servicePort: 80 + - hosts: sslexample.foo.com + secretName: testsecret-tls + rules: + - host: sslexample.foo.com + http: + paths: + - path: / + backend: + serviceName: service1 + servicePort: 80 ``` -Note that there is a gap between TLS features supported by various Ingress +{{< note >}} +There is a gap between TLS features supported by various ingress controllers. Please refer to documentation on [nginx](https://git.k8s.io/ingress-nginx/README.md#https), [GCE](https://git.k8s.io/ingress-gce/README.md#frontend-https), or any other -platform specific Ingress controller to understand how TLS works in your environment. +platform specific ingress controller to understand how TLS works in your environment. +{{< /note >}} ### Loadbalancing -An Ingress controller is bootstrapped with some load balancing policy settings -that it applies to all Ingress, such as the load balancing algorithm, backend +An ingress controller is bootstrapped with some load balancing policy settings +that it applies to all ingress, such as the load balancing algorithm, backend weight scheme, and others. More advanced load balancing concepts (e.g. persistent sessions, dynamic weights) are not yet exposed through the -Ingress. You can still get these features through the +ingress. You can still get these features through the [service loadbalancer](https://github.com/kubernetes/ingress-nginx). - With time, we plan to distill load balancing patterns that are applicable -cross platform into the Ingress resource. It's also worth noting that even though health checks are not exposed directly -through the Ingress, there exist parallel concepts in Kubernetes such as +through the ingress, there exist parallel concepts in Kubernetes such as [readiness probes](/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/) which allow you to achieve the same end result. Please review the controller specific docs to see how they handle health checks ( @@ -312,7 +366,7 @@ specific docs to see how they handle health checks ( ## Updating an Ingress -Say you'd like to add a new Host to an existing Ingress, you can update it by editing the resource: +To update an existing ingress to add a new Host, you can update it by editing the resource: ```shell kubectl describe ingress test @@ -362,7 +416,8 @@ spec: .. ``` -Saving the yaml will update the resource in the API server, which should tell the Ingress controller to reconfigure the loadbalancer. +Saving the yaml will update the resource in the API server, which should tell the +ingress controller to reconfigure the loadbalancer. ```shell kubectl describe ingress test @@ -388,28 +443,30 @@ Events: Normal ADD 45s loadbalancer-controller default/test ``` -You can achieve the same by invoking `kubectl replace -f` on a modified Ingress yaml file. +You can achieve the same by invoking `kubectl replace -f` on a modified ingress yaml file. ## Failing across availability zones -Techniques for spreading traffic across failure domains differs between cloud providers. Please check the documentation of the relevant Ingress controller for details. Please refer to the federation [doc](/docs/concepts/cluster-administration/federation/) for details on deploying Ingress in a federated cluster. +Techniques for spreading traffic across failure domains differs between cloud providers. +Please check the documentation of the relevant [ingress controller](#ingress-controllers) for +details. You can also refer to the [federation documentation](/docs/concepts/cluster-administration/federation/) +for details on deploying ingress in a federated cluster. ## Future Work -* Various modes of HTTPS/TLS support (e.g.: SNI, re-encryption) -* Requesting an IP or Hostname via claims -* Combining L4 and L7 Ingress -* More Ingress controllers - -Please track the [L7 and Ingress proposal](https://github.com/kubernetes/kubernetes/pull/12827) for more details on the evolution of the resource, and the [Ingress repository](https://github.com/kubernetes/ingress/tree/master) for more details on the evolution of various Ingress controllers. +Track [SIG Network](https://github.com/kubernetes/community/tree/master/sig-network) +for more details on the evolution of the ingress and related resources. You may also track the +[ingress repository](https://github.com/kubernetes/ingress/tree/master) for more details on the +evolution of various ingress controllers. ## Alternatives -You can expose a Service in multiple ways that don't directly involve the Ingress resource: +You can expose a Service in multiple ways that don't directly involve the ingress resource: * Use [Service.Type=LoadBalancer](/docs/concepts/services-networking/service/#loadbalancer) * Use [Service.Type=NodePort](/docs/concepts/services-networking/service/#nodeport) * Use a [Port Proxy](https://git.k8s.io/contrib/for-demos/proxy-to-service) + {{% /capture %}} {{% capture whatsnext %}} From 9d5eae7b79535ce285d79e0cf0a4b7489a7eb63b Mon Sep 17 00:00:00 2001 From: Qiming Date: Sat, 17 Nov 2018 06:12:00 +0800 Subject: [PATCH 100/222] Rename block entries as workaround for content types (#10625) As reported by issue #8953, we currently cannot properly handle dots in the file name for blogs. These dots are causing problems in links for many pages. This PR renames the blog entries to remove dots in file names. Closes: #8953 --- ...sing-Kubernetes-New-Multi-Zone-Clusters-aka-Ubernetes-Lite.md} | 0 ...netes-1-2-And-Simplifying-Advanced-Networking-With-Ingress.md} | 0 ...pgrades-Plus-Easier-Application-Deployment-And-Management-.md} | 0 ...ubernetes-1.3.md => 2016-07-00-Five-Days-Of-Kubernetes-1-3.md} | 0 ...ernetes-1-3-Bridging-Cloud-Native-And-Enterprise-Workloads.md} | 0 ...ubernetes-1-4-Making-It-Easy-To-Run-On-Kuberentes-Anywhere.md} | 0 ...0-00-Production-Kubernetes-Dashboard-UI-1-4-improvements_3.md} | 0 ...-1.5.md => 2016-12-00-Cluster-Federation-In-Kubernetes-1-5.md} | 0 ...ubernetes-1.5.md => 2016-12-00-Five-Days-Of-Kubernetes-1-5.md} | 0 ... 2016-12-00-Kubernetes-1-5-Supporting-Production-Workloads.md} | 0 ...ubernetes-1.6.md => 2017-03-00-Five-Days-Of-Kubernetes-1-6.md} | 0 ...7-03-00-Kubernetes-1-6-Multi-User-Multi-Workloads-At-Scale.md} | 0 ...1.6.md => 2017-03-00-Scalability-Updates-In-Kubernetes-1-6.md} | 0 ...urity-Hardening-Stateful-Application-Extensibility-Updates.md} | 0 ...26-kubernetes-1-10-stabilizing-storage-security-networking.md} | 0 ...cing-Kubeflow-0.1.md => 2018-05-04-Announcing-Kubeflow-0-1.md} | 0 ...ment.md => 2018-06-26-kubernetes-1-11-release-announcement.md} | 0 ...terview.md => 2018-07-16-kubernetes-1-11-release-interview.md} | 0 ...8-09-18-2018-linkerd-2.0.md => 2018-09-18-2018-linkerd-2-0.md} | 0 ...ment.md => 2018-09-27-kubernetes-1-12-release-announcement.md} | 0 20 files changed, 0 insertions(+), 0 deletions(-) rename content/en/blog/_posts/{2016-03-00-Building-Highly-Available-Applications-Using-Kubernetes-New-Multi-Zone-Clusters-A.K.A-Ubernetes-Lite.md => 2016-03-00-Building-Highly-Available-Applications-Using-Kubernetes-New-Multi-Zone-Clusters-aka-Ubernetes-Lite.md} (100%) rename content/en/blog/_posts/{2016-03-00-Kubernetes-1.2-And-Simplifying-Advanced-Networking-With-Ingress.md => 2016-03-00-Kubernetes-1-2-And-Simplifying-Advanced-Networking-With-Ingress.md} (100%) rename content/en/blog/_posts/{2016-03-00-Kubernetes-1.2-Even-More-Performance-Upgrades-Plus-Easier-Application-Deployment-And-Management-.md => 2016-03-00-Kubernetes-1-2-Even-More-Performance-Upgrades-Plus-Easier-Application-Deployment-And-Management-.md} (100%) rename content/en/blog/_posts/{2016-07-00-Five-Days-Of-Kubernetes-1.3.md => 2016-07-00-Five-Days-Of-Kubernetes-1-3.md} (100%) rename content/en/blog/_posts/{2016-07-00-Kubernetes-1.3-Bridging-Cloud-Native-And-Enterprise-Workloads.md => 2016-07-00-Kubernetes-1-3-Bridging-Cloud-Native-And-Enterprise-Workloads.md} (100%) rename content/en/blog/_posts/{2016-09-00-Kubernetes-1.4-Making-It-Easy-To-Run-On-Kuberentes-Anywhere.md => 2016-09-00-Kubernetes-1-4-Making-It-Easy-To-Run-On-Kuberentes-Anywhere.md} (100%) rename content/en/blog/_posts/{2016-10-00-Production-Kubernetes-Dashboard-UI-1.4-improvements_3.md => 2016-10-00-Production-Kubernetes-Dashboard-UI-1-4-improvements_3.md} (100%) rename content/en/blog/_posts/{2016-12-00-Cluster-Federation-In-Kubernetes-1.5.md => 2016-12-00-Cluster-Federation-In-Kubernetes-1-5.md} (100%) rename content/en/blog/_posts/{2016-12-00-Five-Days-Of-Kubernetes-1.5.md => 2016-12-00-Five-Days-Of-Kubernetes-1-5.md} (100%) rename content/en/blog/_posts/{2016-12-00-Kubernetes-1.5-Supporting-Production-Workloads.md => 2016-12-00-Kubernetes-1-5-Supporting-Production-Workloads.md} (100%) rename content/en/blog/_posts/{2017-03-00-Five-Days-Of-Kubernetes-1.6.md => 2017-03-00-Five-Days-Of-Kubernetes-1-6.md} (100%) rename content/en/blog/_posts/{2017-03-00-Kubernetes-1.6-Multi-User-Multi-Workloads-At-Scale.md => 2017-03-00-Kubernetes-1-6-Multi-User-Multi-Workloads-At-Scale.md} (100%) rename content/en/blog/_posts/{2017-03-00-Scalability-Updates-In-Kubernetes-1.6.md => 2017-03-00-Scalability-Updates-In-Kubernetes-1-6.md} (100%) rename content/en/blog/_posts/{2017-06-00-Kubernetes-1.7-Security-Hardening-Stateful-Application-Extensibility-Updates.md => 2017-06-00-Kubernetes-1-7-Security-Hardening-Stateful-Application-Extensibility-Updates.md} (100%) rename content/en/blog/_posts/{2018-03-26-kubernetes-1.10-stabilizing-storage-security-networking.md => 2018-03-26-kubernetes-1-10-stabilizing-storage-security-networking.md} (100%) rename content/en/blog/_posts/{2018-05-04-Announcing-Kubeflow-0.1.md => 2018-05-04-Announcing-Kubeflow-0-1.md} (100%) rename content/en/blog/_posts/{2018-06-26-kubernetes-1.11-release-announcement.md => 2018-06-26-kubernetes-1-11-release-announcement.md} (100%) rename content/en/blog/_posts/{2018-07-16-kubernetes-1.11-release-interview.md => 2018-07-16-kubernetes-1-11-release-interview.md} (100%) rename content/en/blog/_posts/{2018-09-18-2018-linkerd-2.0.md => 2018-09-18-2018-linkerd-2-0.md} (100%) rename content/en/blog/_posts/{2018-09-27-kubernetes-1.12-release-announcement.md => 2018-09-27-kubernetes-1-12-release-announcement.md} (100%) diff --git a/content/en/blog/_posts/2016-03-00-Building-Highly-Available-Applications-Using-Kubernetes-New-Multi-Zone-Clusters-A.K.A-Ubernetes-Lite.md b/content/en/blog/_posts/2016-03-00-Building-Highly-Available-Applications-Using-Kubernetes-New-Multi-Zone-Clusters-aka-Ubernetes-Lite.md similarity index 100% rename from content/en/blog/_posts/2016-03-00-Building-Highly-Available-Applications-Using-Kubernetes-New-Multi-Zone-Clusters-A.K.A-Ubernetes-Lite.md rename to content/en/blog/_posts/2016-03-00-Building-Highly-Available-Applications-Using-Kubernetes-New-Multi-Zone-Clusters-aka-Ubernetes-Lite.md diff --git a/content/en/blog/_posts/2016-03-00-Kubernetes-1.2-And-Simplifying-Advanced-Networking-With-Ingress.md b/content/en/blog/_posts/2016-03-00-Kubernetes-1-2-And-Simplifying-Advanced-Networking-With-Ingress.md similarity index 100% rename from content/en/blog/_posts/2016-03-00-Kubernetes-1.2-And-Simplifying-Advanced-Networking-With-Ingress.md rename to content/en/blog/_posts/2016-03-00-Kubernetes-1-2-And-Simplifying-Advanced-Networking-With-Ingress.md diff --git a/content/en/blog/_posts/2016-03-00-Kubernetes-1.2-Even-More-Performance-Upgrades-Plus-Easier-Application-Deployment-And-Management-.md b/content/en/blog/_posts/2016-03-00-Kubernetes-1-2-Even-More-Performance-Upgrades-Plus-Easier-Application-Deployment-And-Management-.md similarity index 100% rename from content/en/blog/_posts/2016-03-00-Kubernetes-1.2-Even-More-Performance-Upgrades-Plus-Easier-Application-Deployment-And-Management-.md rename to content/en/blog/_posts/2016-03-00-Kubernetes-1-2-Even-More-Performance-Upgrades-Plus-Easier-Application-Deployment-And-Management-.md diff --git a/content/en/blog/_posts/2016-07-00-Five-Days-Of-Kubernetes-1.3.md b/content/en/blog/_posts/2016-07-00-Five-Days-Of-Kubernetes-1-3.md similarity index 100% rename from content/en/blog/_posts/2016-07-00-Five-Days-Of-Kubernetes-1.3.md rename to content/en/blog/_posts/2016-07-00-Five-Days-Of-Kubernetes-1-3.md diff --git a/content/en/blog/_posts/2016-07-00-Kubernetes-1.3-Bridging-Cloud-Native-And-Enterprise-Workloads.md b/content/en/blog/_posts/2016-07-00-Kubernetes-1-3-Bridging-Cloud-Native-And-Enterprise-Workloads.md similarity index 100% rename from content/en/blog/_posts/2016-07-00-Kubernetes-1.3-Bridging-Cloud-Native-And-Enterprise-Workloads.md rename to content/en/blog/_posts/2016-07-00-Kubernetes-1-3-Bridging-Cloud-Native-And-Enterprise-Workloads.md diff --git a/content/en/blog/_posts/2016-09-00-Kubernetes-1.4-Making-It-Easy-To-Run-On-Kuberentes-Anywhere.md b/content/en/blog/_posts/2016-09-00-Kubernetes-1-4-Making-It-Easy-To-Run-On-Kuberentes-Anywhere.md similarity index 100% rename from content/en/blog/_posts/2016-09-00-Kubernetes-1.4-Making-It-Easy-To-Run-On-Kuberentes-Anywhere.md rename to content/en/blog/_posts/2016-09-00-Kubernetes-1-4-Making-It-Easy-To-Run-On-Kuberentes-Anywhere.md diff --git a/content/en/blog/_posts/2016-10-00-Production-Kubernetes-Dashboard-UI-1.4-improvements_3.md b/content/en/blog/_posts/2016-10-00-Production-Kubernetes-Dashboard-UI-1-4-improvements_3.md similarity index 100% rename from content/en/blog/_posts/2016-10-00-Production-Kubernetes-Dashboard-UI-1.4-improvements_3.md rename to content/en/blog/_posts/2016-10-00-Production-Kubernetes-Dashboard-UI-1-4-improvements_3.md diff --git a/content/en/blog/_posts/2016-12-00-Cluster-Federation-In-Kubernetes-1.5.md b/content/en/blog/_posts/2016-12-00-Cluster-Federation-In-Kubernetes-1-5.md similarity index 100% rename from content/en/blog/_posts/2016-12-00-Cluster-Federation-In-Kubernetes-1.5.md rename to content/en/blog/_posts/2016-12-00-Cluster-Federation-In-Kubernetes-1-5.md diff --git a/content/en/blog/_posts/2016-12-00-Five-Days-Of-Kubernetes-1.5.md b/content/en/blog/_posts/2016-12-00-Five-Days-Of-Kubernetes-1-5.md similarity index 100% rename from content/en/blog/_posts/2016-12-00-Five-Days-Of-Kubernetes-1.5.md rename to content/en/blog/_posts/2016-12-00-Five-Days-Of-Kubernetes-1-5.md diff --git a/content/en/blog/_posts/2016-12-00-Kubernetes-1.5-Supporting-Production-Workloads.md b/content/en/blog/_posts/2016-12-00-Kubernetes-1-5-Supporting-Production-Workloads.md similarity index 100% rename from content/en/blog/_posts/2016-12-00-Kubernetes-1.5-Supporting-Production-Workloads.md rename to content/en/blog/_posts/2016-12-00-Kubernetes-1-5-Supporting-Production-Workloads.md diff --git a/content/en/blog/_posts/2017-03-00-Five-Days-Of-Kubernetes-1.6.md b/content/en/blog/_posts/2017-03-00-Five-Days-Of-Kubernetes-1-6.md similarity index 100% rename from content/en/blog/_posts/2017-03-00-Five-Days-Of-Kubernetes-1.6.md rename to content/en/blog/_posts/2017-03-00-Five-Days-Of-Kubernetes-1-6.md diff --git a/content/en/blog/_posts/2017-03-00-Kubernetes-1.6-Multi-User-Multi-Workloads-At-Scale.md b/content/en/blog/_posts/2017-03-00-Kubernetes-1-6-Multi-User-Multi-Workloads-At-Scale.md similarity index 100% rename from content/en/blog/_posts/2017-03-00-Kubernetes-1.6-Multi-User-Multi-Workloads-At-Scale.md rename to content/en/blog/_posts/2017-03-00-Kubernetes-1-6-Multi-User-Multi-Workloads-At-Scale.md diff --git a/content/en/blog/_posts/2017-03-00-Scalability-Updates-In-Kubernetes-1.6.md b/content/en/blog/_posts/2017-03-00-Scalability-Updates-In-Kubernetes-1-6.md similarity index 100% rename from content/en/blog/_posts/2017-03-00-Scalability-Updates-In-Kubernetes-1.6.md rename to content/en/blog/_posts/2017-03-00-Scalability-Updates-In-Kubernetes-1-6.md diff --git a/content/en/blog/_posts/2017-06-00-Kubernetes-1.7-Security-Hardening-Stateful-Application-Extensibility-Updates.md b/content/en/blog/_posts/2017-06-00-Kubernetes-1-7-Security-Hardening-Stateful-Application-Extensibility-Updates.md similarity index 100% rename from content/en/blog/_posts/2017-06-00-Kubernetes-1.7-Security-Hardening-Stateful-Application-Extensibility-Updates.md rename to content/en/blog/_posts/2017-06-00-Kubernetes-1-7-Security-Hardening-Stateful-Application-Extensibility-Updates.md diff --git a/content/en/blog/_posts/2018-03-26-kubernetes-1.10-stabilizing-storage-security-networking.md b/content/en/blog/_posts/2018-03-26-kubernetes-1-10-stabilizing-storage-security-networking.md similarity index 100% rename from content/en/blog/_posts/2018-03-26-kubernetes-1.10-stabilizing-storage-security-networking.md rename to content/en/blog/_posts/2018-03-26-kubernetes-1-10-stabilizing-storage-security-networking.md diff --git a/content/en/blog/_posts/2018-05-04-Announcing-Kubeflow-0.1.md b/content/en/blog/_posts/2018-05-04-Announcing-Kubeflow-0-1.md similarity index 100% rename from content/en/blog/_posts/2018-05-04-Announcing-Kubeflow-0.1.md rename to content/en/blog/_posts/2018-05-04-Announcing-Kubeflow-0-1.md diff --git a/content/en/blog/_posts/2018-06-26-kubernetes-1.11-release-announcement.md b/content/en/blog/_posts/2018-06-26-kubernetes-1-11-release-announcement.md similarity index 100% rename from content/en/blog/_posts/2018-06-26-kubernetes-1.11-release-announcement.md rename to content/en/blog/_posts/2018-06-26-kubernetes-1-11-release-announcement.md diff --git a/content/en/blog/_posts/2018-07-16-kubernetes-1.11-release-interview.md b/content/en/blog/_posts/2018-07-16-kubernetes-1-11-release-interview.md similarity index 100% rename from content/en/blog/_posts/2018-07-16-kubernetes-1.11-release-interview.md rename to content/en/blog/_posts/2018-07-16-kubernetes-1-11-release-interview.md diff --git a/content/en/blog/_posts/2018-09-18-2018-linkerd-2.0.md b/content/en/blog/_posts/2018-09-18-2018-linkerd-2-0.md similarity index 100% rename from content/en/blog/_posts/2018-09-18-2018-linkerd-2.0.md rename to content/en/blog/_posts/2018-09-18-2018-linkerd-2-0.md diff --git a/content/en/blog/_posts/2018-09-27-kubernetes-1.12-release-announcement.md b/content/en/blog/_posts/2018-09-27-kubernetes-1-12-release-announcement.md similarity index 100% rename from content/en/blog/_posts/2018-09-27-kubernetes-1.12-release-announcement.md rename to content/en/blog/_posts/2018-09-27-kubernetes-1-12-release-announcement.md From f7d235cf644b1e50863e03a81f6965ea6f206d79 Mon Sep 17 00:00:00 2001 From: Karen Bradshaw Date: Fri, 16 Nov 2018 17:38:29 -0500 Subject: [PATCH 101/222] update ol ul li bullet to disc (#10714) * update ol ul li bullet to disc - update ol ul li bullet to disc - move note out of list so that list numbers are correct - fix typo * futher clean-up --- .../setup/independent/high-availability.md | 12 +- sass/_base.sass | 2 +- static/css/case-study-styles.css | 2047 +---------------- static/css/styles.css | 1949 +--------------- 4 files changed, 11 insertions(+), 3999 deletions(-) diff --git a/content/en/docs/setup/independent/high-availability.md b/content/en/docs/setup/independent/high-availability.md index 6c49266ff3..e2b6f7b5dc 100644 --- a/content/en/docs/setup/independent/high-availability.md +++ b/content/en/docs/setup/independent/high-availability.md @@ -137,7 +137,7 @@ option. Your cluster requirements may need a different configuration. ### Bootstrap the first stacked control plane node {{< note >}} -Optionally replace `stable` with a different version of Kubernetes, for example `v1.12.0`. +Optionally replace the string `stable` with a different version of Kubernetes, for example `v1.12.0`. {{< /note >}} 1. Create a `kubeadm-config.yaml` template file: @@ -431,6 +431,10 @@ done ### Set up the first control plane node +{{< note >}} +Optionally replace the string `stable` with a different version of Kubernetes, for example `v1.11.3`. +{{< /note >}} + 1. Extract the etcd certificates mkdir -p /etc/kubernetes/pki @@ -438,10 +442,6 @@ done 1. Create a `kubeadm-config.yaml`: -{{< note >}} -Optionally replace `stable` with a different version of Kubernetes, for example `v1.11.3`. -{{< /note >}} - apiVersion: kubeadm.k8s.io/v1alpha3 kind: ClusterConfiguration kubernetesVersion: stable @@ -470,7 +470,7 @@ Optionally replace `stable` with a different version of Kubernetes, for example - `ETCD_2_IP` 1. Run `kubeadm init --config kubeadm-config.yaml` -1. Copy the output join commamnd. +1. Copy the output from the join command ### Copy required files to the correct locations diff --git a/sass/_base.sass b/sass/_base.sass index 0ea6413527..cfe7049b20 100644 --- a/sass/_base.sass +++ b/sass/_base.sass @@ -917,7 +917,7 @@ dd list-style: disc ol ul li - list-style: none + list-style: disc ol li list-style: decimal diff --git a/static/css/case-study-styles.css b/static/css/case-study-styles.css index 39fcd22428..a5e59d3e9b 100644 --- a/static/css/case-study-styles.css +++ b/static/css/case-study-styles.css @@ -1,2045 +1,2 @@ -html, body { - margin: 0; - padding: 0; } - -input, button { - outline: none; } - -button { - cursor: pointer; } - -ul, li { - list-style: none; } - -ul { - margin: 0; - padding: 0; } - -a { - text-decoration: none; } - -.clear { - display: block; - clear: both; } - -.light-text { - color: white; } - -.right { - float: right; } - -.left { - float: left; } - -.center { - text-align: center; } - -*, .button { - box-sizing: border-box; - font-family: "Roboto", sans-serif; - background: none; - margin: 0; - border: 0; } - -body { - font-family: "Roboto", sans-serif; } - -h1, h2, h5, p { - font-weight: 300; } - -h3, h4 { - font-weight: 400; } - -html, body { - margin: 0; - padding: 0; } - -input, button { - outline: none; } - -button { - cursor: pointer; } - -ul, li { - list-style: none; } - -ul { - margin: 0; - padding: 0; } - -a { - text-decoration: none; } - -.clear { - display: block; - clear: both; } - -.light-text { - color: white; } - -.right { - float: right; } - -.left { - float: left; } - -.center { - text-align: center; } - -h1 { - font-size: 32px; - line-height: 40px; } - -h2 { - font-size: 28px; - line-height: 60px; } - -h3 { - font-size: 24px; - line-height: 32px; } - -h4 { - font-size: 20px; - line-height: 40px; } - -h5 { - font-size: 16px; - line-height: 36px; } - -p { - font-size: 14px; - line-height: 22px; } - -section, header, #vendorStrip { - padding-left: 20px; - padding-right: 20px; } - section main, header main, #vendorStrip main { - width: 100%; - max-width: 100%; } - -header { - height: 80px; } - -.nav-buttons { - height: 80px; - line-height: 80px; } - .nav-buttons .button + * { - margin-left: 30px; } - -#hamburger { - width: 50px; - height: 50px; } - -#mainNav { - padding: 140px 0 30px; } - #mainNav h5 { - margin-bottom: 1em; } - #mainNav h3 { - margin-bottom: 0.6em; } - #mainNav .nav-box { - width: 20%; } - #mainNav .nav-box + .nav-box { - margin-left: calc(20% / 3); } - #mainNav main + main { - margin-top: 60px; } - #mainNav .left .button { - height: 50px; - line-height: 50px; - font-size: 18px; } - -.open-nav #tryKubernetes, .y-enough #tryKubernetes { - margin-left: 30px; } - -#hero { - padding-top: 80px; } - -#docs #hero h1, #docs #hero h5 { - padding-left: 20px; - padding-right: 20px; } - -#vendorStrip { - height: 88px; - line-height: 88px; - font-size: 16px; } - -body { - background-color: white; } - -section { - position: relative; - background-color: white; } - -section main, header main, footer main { - position: relative; - margin: auto; } - -p { - font-size: 14px; - font-weight: 400; } - -.button { - display: inline-block; - border-radius: 6px; - padding: 0 20px; - line-height: 40px; - color: white; - background-color: #3371e3; - text-decoration: none; } - -#cellophane { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - display: none; } - -header { - position: fixed; - top: 0; - left: 0; - width: 100%; - z-index: 8888; - background-color: transparent; - box-shadow: 0 0 0 transparent; - overflow: hidden; - transition: 0.3s; - text-align: center; } - -.logo { - position: relative; - float: left; - display: block; - width: 180px; - height: 88px; - top: 0; - left: 0; - transform: none; - background-image: url(/images/nav_logo.svg); - background-size: contain; - background-position: center center; - background-repeat: no-repeat; } - -#docs .flyout-button { - position: fixed; - top: 20px; - left: 20px; - width: 50px; - height: 50px; - background-image: url(/images/toc_icon.png); - background-position: center center; - background-repeat: no-repeat; - background-size: auto; - border-radius: 50%; - transition: 0.3s; - z-index: 99999; } - -#docs.open-nav .flyout-button { - display: none; } - -#docs .logo { - position: absolute; - top: 40px; - left: 50%; - transform: translate(-50%, -50%); - display: block; - width: 45px; - height: 44px; - background-image: url(/images/favicon.png); } - -#docs.flip-nav .flyout-button { - background-image: url(/images/toc_icon_grey.png); } - -.nav-buttons { - float: right; } - -#viewDocs, #tryKubernetes { - display: none; } - -#viewDocs { - border: 2px solid white; - background-color: transparent; - transition: 0.3s; } - #viewDocs:hover { - background-color: white; - color: #303030; } - -#tryKubernetes { - width: 0; - padding: 0 0; - border: 1px solid transparent; - background-color: transparent; - text-align: center; - white-space: nowrap; - vertical-align: middle; - overflow: hidden; - transition: 0.3s; } - -#hamburger { - display: inline-block; - position: relative; - vertical-align: middle; - padding: 0; - border: 0; - background: none; } - #hamburger div, #hamburger:before, #hamburger:after { - position: absolute; - left: 15%; - width: 70%; - height: 2px; - background-color: #3371e3; - transition: 0.3s; - content: ""; } - #hamburger div { - top: calc(50% - 1px); } - #hamburger:before { - top: 24%; } - #hamburger:after { - bottom: 24%; } - #hamburger:hover div, #hamburger:hover:before, #hamburger:hover:after { - background-color: white; } - -#mainNav h5 { - color: #3371e3; - font-weight: normal; } - -#mainNav main { - white-space: nowrap; - overflow: hidden; - clear: both; } - -#mainNav .nav-box { - float: left; - white-space: normal; } - -#mainNav h3 a { - color: #3371e3; - text-decoration: none; } - -ul.global-nav { - display: none; } - ul.global-nav li { - display: inline-block; - margin-right: 14px; } - ul.global-nav li a { - color: #fff; - font-weight: 400; - padding: 0; - position: relative; } - ul.global-nav li a.active:after { - position: absolute; - width: 100%; - height: 2px; - content: ''; - bottom: -4px; - left: 0; - background: #fff; } - ul.global-nav li a .ui-icon { - filter: brightness(0) invert(1); } - ul.global-nav li ul { - display: none; - position: fixed; - top: 40px; - text-align: left; } - ul.global-nav li ul li { - display: block; - height: 28px; } - ul.global-nav li ul li a { - background: #303030; - color: #fff; - padding: 7px; } - ul.global-nav li ul li:last-child a { - border-radius: 7px; } - ul.global-nav li:hover ul { - display: block; } - -.flip-nav ul.global-nav li a, .open-nav ul.global-nav li a { - color: #303030; } - .flip-nav ul.global-nav li a .ui-icon, .open-nav ul.global-nav li a .ui-icon { - filter: brightness(0); } - -.flip-nav ul.global-nav li ul li a { - background: #fff; - color: #303030; } - -.flip-nav ul.global-nav li a.active:after, .flip-nav ul.global-nav li ul li a.active:after, .open-nav ul.global-nav li a.active:after { - background: #3371e3; } - -.flip-nav header { - background-color: white; } - -.open-nav body { - overflow: hidden; } - -.open-nav #cellophane { - display: block; - z-index: 9998; } - -.open-nav header { - background-color: #e8e8e8; - z-index: 9999; } - -.open-nav #hamburger div { - opacity: 0; } - -.open-nav #hamburger:before, .open-nav #hamburger:after { - left: 12px; - transform-origin: 0 1px; } - -.open-nav #hamburger:before { - transform: rotate(45deg); } - -.open-nav #hamburger:after { - transform: rotate(-45deg); } - -.open-nav #tryKubernetes, .y-enough #tryKubernetes { - width: auto; - padding: 0 20px; - background-color: #3371e3; - border-color: #3371e3; } - -.flip-nav header, .open-nav header { - box-shadow: 0 1px 2px #4c4c4c; } - -.flip-nav #viewDocs, .open-nav #viewDocs { - border-color: #303030; - color: #303030; } - .flip-nav #viewDocs:hover, .open-nav #viewDocs:hover { - border-color: #3371e3; - background-color: #3371e3; - color: white; } - -.flip-nav #hamburger:hover div, .flip-nav #hamburger:hover:before, .flip-nav #hamburger:hover:after, .open-nav #hamburger:hover div, .open-nav #hamburger:hover:before, .open-nav #hamburger:hover:after { - background-color: #303030; } - -#hero { - background-image: url(/images/texture.png); - background-color: #303030; - text-align: center; - padding-left: 0; - padding-right: 0; - margin-bottom: 0; - position: relative; } - #hero.bot-bar:after { - display: block; - margin-bottom: -20px; - height: 8px; - width: 100%; - background-color: rgba(255, 255, 255, 0.1); - content: ''; } - #hero.no-sub h5 { - display: none; } - #hero.no-sub h1 { - margin-bottom: 20px; } - -#home #hero:after { - display: none; } - -#vendorStrip { - position: relative; - background-color: rgba(255, 255, 255, 0.1); - font-weight: 100; - white-space: nowrap; - text-align: center; } - #vendorStrip li a { - color: rgba(255, 255, 255, 0.5); } - #vendorStrip li a.YAH { - color: white; - position: relative; } - -footer { - width: 100%; - background-image: url(/images/texture.png); - background-color: #303030; } - footer main { - padding: 20px 0; } - footer nav a { - width: 100%; - text-align: center; - display: inline-block; - margin: 10px 0; - font-size: 24px; - font-weight: 300; - color: white; - text-decoration: none; } - footer .social { - margin: 20px 0; } - footer .social div { - text-align: center; - margin-bottom: 20px; } - footer .social div:last-child { - margin: 30px 0; } - footer .social span { - display: block; - margin-bottom: 8px; } - footer .social input { - text-align: center; } - -#search, #wishField { - background-color: transparent; - padding: 10px; - font-size: 16px; - font-weight: 100; - color: white; - border: 1px solid white; - transition: 0.3s; } - #search:focus, #wishField:focus { - background-color: #f7f7f7; - color: #303030; } - -.social a { - display: inline-block; - background-image: url(/images/social_sprite.png); - background-repeat: no-repeat; - background-size: auto; - width: 50px; - height: 50px; - border-radius: 5px; - margin-right: 10px; } - .social a:hover { - background-color: #fff; } - .social a span { - position: absolute; - display: block; - height: 0; - overflow: hidden; } - .social a.button { - background-image: none; - width: auto; - height: auto; } - .social a.button:hover { - color: #3371e3; } - -a.twitter { - background-position: 0 0; } - a.twitter:hover { - background-position: 0 100%; } - -a.stack-overflow { - background-position: -50px 0; } - a.stack-overflow:hover { - background-position: -50px 100%; } - -a.slack { - background-position: -100px 0; } - a.slack:hover { - background-position: -100px 100%; } - -a.github { - background-position: -150px 0; } - a.github:hover { - background-position: -150px 100%; } - -a.mailing-list { - background-position: -200px 0; } - a.mailing-list:hover { - background-position: -200px 100%; } - -a.calendar { - background-position: -250px 0; } - a.calendar:hover { - background-position: -250px 100%; } - -#viewDocs { - display: none; } - -section { - background-color: white; } - -#hero { - background-color: #303030; } - #hero h5 { - margin: 20px 0; - line-height: 28px; } - -#vendorStrip { - position: relative; } - #vendorStrip ul { - float: left; } - #vendorStrip li { - display: inline-block; - height: 100%; } - #vendorStrip a { - display: block; - height: 100%; - color: white; - font-size: 0.75em; - font-weight: bold; } - #vendorStrip li + li { - margin-left: 0; } - -#docs #vendorStrip { - line-height: 44px; - max-width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; } - #docs #vendorStrip ul { - float: none; } - #docs #vendorStrip #searchBox { - float: none; - display: block; - width: 80%; - margin: 0 auto; - height: 44px; - line-height: 44px; - position: relative; } - #docs #vendorStrip #searchBox:before { - position: absolute; - width: 15px; - height: 15px; - content: ''; - right: 8px; - top: 7px; - background-image: url(/images/search-icon.svg); - background-repeat: no-repeat; - background-size: 100% 100%; - z-index: 1; } - #docs #vendorStrip #search { - width: 100%; - padding: 0 10px; - height: 30px; - line-height: 30px; - font-size: 16px; - vertical-align: top; - background: #fff; - border: none; - border-radius: 4px; - position: relative; } - -#encyclopedia { - position: relative; - padding: 50px 20px 20px 20px; - overflow: hidden; - font-size: 14px; } - #encyclopedia > div { - height: 100%; } - -#docsToc { - position: fixed; - background-color: white; - top: 0; - left: 0; - width: 0; - height: 100vh; - overflow: hidden; - padding: 50px 0; - z-index: 999999; - transition: 0.3s; } - #docsToc .yah > .title { - background-color: #f7f7f7; - border-left: 3px solid #3371e3; - padding: 7.5px 10px 7.5px 18px; - margin-left: -3px; - color: #3371e3; } - -.open-toc body { - overflow: hidden; } - -.open-toc #docsToc { - padding: 50px 20px; - width: 400px; - max-width: 100vw; - overflow-y: auto; } - -.pi-accordion > .container:first-child > .item:first-child > .title:first-child { - padding-left: 0; - font-size: 1.5em; - font-weight: 700; } - -.pi-accordion > .container:first-child > .item.yah:first-child > .title:first-child { - margin-left: -20px !important; } - -.pi-accordion .item { - overflow: hidden; } - -.pi-accordion .title { - color: #303030; - position: relative; - padding: 7.5px 10px 7.5px 18px; - cursor: pointer; - transition: 0.3s; } - .pi-accordion .title:hover { - color: #3371e3; } - -.pi-accordion a.item > .title { - color: black; } - .pi-accordion a.item > .title:hover { - color: #3371e3; } - -.pi-accordion div.item > .title:before { - content: ""; - position: absolute; - top: 12px; - left: 2px; - border-style: solid; - border-width: 5px 0 5px 8px; - border-color: transparent transparent transparent #3371e3; - transform: rotate(0deg); - transition: 0.3s; } - -.pi-accordion .wrapper { - position: relative; - width: 100%; - transition: height 0.3s; } - -.pi-accordion .content { - padding-left: 20px; - opacity: 0; - transition: 0.3s; } - -.pi-accordion .item.on > .title:before { - transform: rotate(90deg); } - -.pi-accordion .item.on > .wrapper > .content { - opacity: 1; } - -dt { - margin-bottom: 8px; } - -dd { - margin-bottom: 16px; } - -.pi-pushmenu { - display: none; - position: fixed; - top: 0; - width: 100%; - height: 100%; - opacity: 0; - transition: opacity 0.3s; } - .pi-pushmenu.on { - opacity: 1; } - .pi-pushmenu .overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.4); } - .pi-pushmenu .sled { - position: absolute; - top: 0; - width: 0; - height: 100%; - background-color: white; - overflow: auto; - transition: 0.3s; } - .pi-pushmenu.on .sled { - width: 400px; - max-width: 100vw; } - .pi-pushmenu .top-bar { - height: 0; - line-height: 60px; - background-color: #444; } - .pi-pushmenu ul { - margin-top: 25px; } - .pi-pushmenu li { - position: relative; - display: block; - width: 100%; - min-height: 45px; - padding: 0 60px 0 20px; - border-bottom: 1px solid #cccccc; } - .pi-pushmenu a { - display: inline-block; - width: 100%; - height: 45px; - line-height: 45px; - font-family: "Roboto", sans-serif; - font-size: 20px; - color: #3371e3; } - .pi-pushmenu .button { - background: none; - padding: 0; } - .pi-pushmenu ul ul { - padding: 0 20px; } - .pi-pushmenu ul ul li { - min-height: 40px; } - .pi-pushmenu ul ul a { - height: 40px; - line-height: 40px; - font-size: 18px; - color: #555555; } - -.push-menu-close-button { - position: absolute; - top: 0; - right: 0; - width: 50px; - height: 50px; } - .push-menu-close-button:before, .push-menu-close-button:after { - content: ""; - position: absolute; - top: calc(50% - 1px); - left: 25%; - width: 50%; - height: 2px; - background-color: black; } - .push-menu-close-button:before { - transform: rotate(45deg); } - .push-menu-close-button:after { - transform: rotate(-45deg); } - -#docsContent { - position: relative; - float: right; - width: 100%; } - #docsContent * + h2, #docsContent * + h3, #docsContent * + h4, #docsContent * + h5, #docsContent * + h6 { - margin-top: 30px; } - #docsContent h1, #docsContent h2, #docsContent h3, #docsContent h4, #docsContent h5, #docsContent h6 { - line-height: normal; - font-weight: 500; - margin-bottom: 30px; - padding-bottom: 10px; } - #docsContent h1:before, #docsContent h2:before, #docsContent h3:before, #docsContent h4:before, #docsContent h5:before, #docsContent h6:before { - display: block; - content: " "; - margin-top: -100px; - height: 100px; - visibility: hidden; } - #docsContent h1, #docsContent h2 { - border-bottom: 1px solid #cccccc; } - #docsContent h1 { - font-size: 32px; - padding-right: 60px; } - #docsContent h2 { - font-size: 28px; } - #docsContent h3 { - font-size: 24px; - font-weight: 300; - margin-bottom: 5px; } - #docsContent h4 { - font-size: 20px; - margin-bottom: 0px; } - #docsContent h5, #docsContent h6 { - font-size: 16px; - font-weight: 500; } - #docsContent p { - font-size: 16px; - font-weight: 300; - line-height: 1.75em; } - #docsContent p + p { - margin-top: 10px; } - #docsContent code { - display: inline-block; - box-sizing: border-box; - background-color: #f7f7f7; - color: #303030; - font-family: "Roboto Mono", monospace; - vertical-align: baseline; - font-size: 14px; - font-weight: bold; - padding: 2px 4px; } - #docsContent a code { - color: #3371e3; - text-decoration: underline; } - #docsContent pre .pi, #docsContent pre .s { - margin: 0; - padding: 0; } - #docsContent .highlight code span, #docsContent code, #docsContent pre code { - font-family: "Roboto Mono", monospace; } - #docsContent code, #docsContent pre code { - color: #303030; } - #docsContent pre code { - padding: 0; } - #docsContent pre { - background-color: #f7f7f7; - display: block; - margin: 20px 0; - padding: 15px; - position: relative; - overflow-x: auto; } - #docsContent h1 code, #docsContent h2 code, #docsContent h3 code, #docsContent h4 code, #docsContent h5 code, #docsContent h6 code { - font-size: inherit; - background-color: transparent; } - #docsContent .includecode { - table-layout: fixed; } - #docsContent .includecode, #docsContent .includecode th, #docsContent .includecode td { - padding: 0 !important; } - #docsContent .includecode th { - text-align: right !important; - padding: 10px !important; } - #docsContent .includecode th a, #docsContent .includecode th a code { - color: white !important; - background-color: transparent !important; } - #docsContent .includecode pre { - margin: 0 !important; } - #docsContent ul li { - list-style: disc; } - #docsContent ol ul li { - list-style: none; } - #docsContent ol li { - list-style: decimal; } - #docsContent ul, #docsContent ol { - margin: 20px 0; - padding-left: 30px; - font-weight: 300; } - #docsContent ul ul, #docsContent ol ol, #docsContent ul ol, #docsContent ol ul { - margin: 0.75em 0; } - #docsContent li { - margin-bottom: 0.75em; - font-size: 16px; - line-height: 1.75em; } - #docsContent table { - width: 100%; - border: 1px solid #ccc; - border-spacing: 0; - margin-top: 30px; - margin-bottom: 30px; } - #docsContent thead, #docsContent tr:nth-child(even) { - background-color: #f7f7f7; } - #docsContent thead { - background-color: #555; - color: white; } - #docsContent th, #docsContent td { - padding: 8px; - text-align: left; - margin: 0; } - #docsContent th { - font-weight: normal; } - #docsContent td { - font-size: 0.85em; } - #docsContent #editPageButton { - position: absolute; - top: -25px; - right: 5px; - width: 50px; - height: 50px; - line-height: 50px; - border-radius: 50%; - white-space: nowrap; - text-indent: 50px; - overflow: hidden; - background: #3371e3 url(/images/icon-pencil.svg) no-repeat; - background-position: 12px 10px; - background-size: 29px 29px; } - #docsContent #markdown-toc, #docsContent #TableOfContents { - margin-bottom: 20px; } - #docsContent #markdown-toc ul, #docsContent #markdown-toc li, #docsContent #TableOfContents ul, #docsContent #TableOfContents li { - list-style: disc; - color: #3371e3; } - #docsContent #markdown-toc ul, #docsContent #TableOfContents ul { - padding: 0 15px; - margin: 0; } - #docsContent #markdown-toc li, #docsContent #TableOfContents li { - padding: 0; - line-height: 1.5em; - margin-bottom: 0; } - #docsContent #markdown-toc a, #docsContent #TableOfContents a { - position: relative; - color: #3371e3; - font-weight: 700; } - #docsContent img { - max-width: 100%; } - #docsContent #TableOfContents > ul > li { - list-style: none; } - #docsContent #TableOfContents ul, #docsContent #TableOfContents li { - list-style: disk; } - -.fixed footer { - position: fixed; - bottom: 0; } - -#miceType { - clear: both; - font-size: 11px; - line-height: 18px; - color: #aaa; } - -html.search #docsContent { - position: relative; - float: none; - width: 90%; - max-width: 850px; - margin: 0 auto; } - html.search #docsContent #editPageButton { - display: none; } - html.search #docsContent table { - border: 0; - margin-bottom: 0; } - html.search #docsContent td { - padding: 0; } - html.search #docsContent h1 { - margin-bottom: 0; - border-bottom: 0; - padding-bottom: 0; - padding-left: 8px; } - -#home.flip-nav .logo, #home.open-nav .logo { - background-image: url(/images/nav_logo2.svg); } - -#home #hero { - margin-bottom: 0; - padding-bottom: 1px; } - #home #hero main { - padding: 0 10px; - margin-bottom: 30px; } - #home #hero #vendorStrip { - display: none; } - -#oceanNodes { - padding-top: 60px; - padding-bottom: 60px; } - #oceanNodes a { - color: #3371e3; } - #oceanNodes main { - margin-bottom: 60px; - min-height: 160px; } - #oceanNodes .image-wrapper { - max-width: 75%; - margin: 0 auto 20px; - text-align: center; } - #oceanNodes .image-wrapper img { - width: 100%; - max-width: 160px; } - #oceanNodes main:first-child .image-wrapper { - max-width: 100%; } - #oceanNodes main:first-child .image-wrapper img { - max-width: 491px; } - #oceanNodes h3 { - margin-bottom: 30px; } - -#video { - height: 200px; } - -#video { - width: 100%; - position: relative; - background-position: center center; - background-size: cover; } - #video > .light-text { - display: none; - position: absolute; - top: 50%; - left: 75%; - width: 525px; - padding-right: 80px; - transform: translate(-50%, -50%); - color: white; } - #video h2 { - font-size: 32px; - line-height: 44px; - margin-bottom: 20px; } - #video p { - margin-bottom: 20px; } - #video #desktopKCButton { - position: relative; - font-size: 18px; - background-color: #303030; - border-radius: 8px; - color: #ffffff; - padding: 20px 10px 20px 10px; } - #video #desktopShowVideoButton { - position: relative; - font-size: 24px; - background-color: white; - border-radius: 8px; - color: #3371e3; - padding: 15px 30px 15px 80px; - margin-bottom: 15px; } - #video #desktopShowVideoButton:before { - content: ""; - position: absolute; - position: absolute; - top: 50%; - left: 40px; - transform: translate(-50%, -50%); - width: 0; - height: 0; - border-style: solid; - border-width: 10px 0 10px 20px; - border-color: transparent transparent transparent #3371e3; } - #video #mobileShowVideoButton { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 80px; - height: 80px; - border-radius: 50%; - background-color: transparent; - border: 5px solid rgba(255, 255, 255, 0.2); - overflow: visible; } - #video #mobileShowVideoButton:after { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - left: 40px; - content: ""; - width: 0; - height: 0; - border-style: solid; - border-width: 20px 0 20px 30px; - border-color: transparent transparent transparent #ffffff; } - -#videoPlayer { - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - background-color: rgba(0, 0, 0, 0.9); - display: none; } - #videoPlayer iframe { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 80vw; - height: 45vw; - max-width: 142.22222vh; - max-height: 80vh; } - #videoPlayer #closeButton { - position: absolute; - top: 20px; - right: 20px; - width: 50px; - height: 50px; - border: 2px solid transparent; - transition: 0.3s; } - #videoPlayer #closeButton:before, #videoPlayer #closeButton:after { - content: ""; - position: absolute; - top: calc(50% - 1px); - left: 10%; - width: 80%; - height: 2px; - background-color: white; } - #videoPlayer #closeButton:before { - transform: rotate(45deg); } - #videoPlayer #closeButton:after { - transform: rotate(-45deg); } - #videoPlayer #closeButton:hover { - border-color: white; } - -#cncf { - padding-top: 60px; - padding-bottom: 140px; - background-image: url(/images/cncf-color.png); - background-position: center 100px; - background-repeat: no-repeat; - background-size: 300px; } - -#kubeweekly { - background-color: #f7f7f7; - padding-top: 60px; - padding-bottom: 140px; - background-size: auto; - font-family: "Roboto Mono", monospace !important; - font-size: 24px; - font-weight: bold; } - #kubeweekly h5 { - font-size: 20px; } - -.subscribe-button { - border-radius: 6px; - padding: 0 20px; - line-height: 31px; - color: white; - background-color: blue; - text-decoration: none; - font-size: 14px; } - -#features { - padding-top: 140px; - background-color: #f7f7f7; - background-image: url(/images/wheel.png); - background-position: center 60px; - background-repeat: no-repeat; - background-size: auto; } - -.feature-box { - width: 100%; - overflow: hidden; - clear: both; } - .feature-box h4 { - line-height: normal; - margin-bottom: 15px; } - .feature-box > div:first-child { - float: left; } - .feature-box > div:last-child { - float: right; } - -#features h3 { - margin-bottom: 20px; } - -#features .feature-box { - margin-bottom: 0; } - #features .feature-box > div { - width: 100%; - margin-bottom: 40px; } - -#community.open-nav .logo, #community.flip-nav .logo, .gridPage.open-nav .logo, .gridPage.flip-nav .logo { - background-image: url(/images/nav_logo2.svg); } - -#community #hero, .gridPage #hero { - padding-bottom: 20px; } - -#community #mainContent, .gridPage #mainContent { - padding: 20px 0; } - #community #mainContent main, .gridPage #mainContent main { - max-width: none; } - #community #mainContent a, .gridPage #mainContent a { - color: #3371e3; } - #community #mainContent .content, .gridPage #mainContent .content { - margin-bottom: 30px; - padding: 30px 0; } - #community #mainContent .content h1, #community #mainContent .content h2, #community #mainContent .content h3, #community #mainContent .content h4, #community #mainContent .content h5, #community #mainContent .content h6, #community #mainContent .content p, .gridPage #mainContent .content h1, .gridPage #mainContent .content h2, .gridPage #mainContent .content h3, .gridPage #mainContent .content h4, .gridPage #mainContent .content h5, .gridPage #mainContent .content h6, .gridPage #mainContent .content p { - line-height: normal; - max-width: 1200px; - padding: 0 20px; - margin: 0 auto 20px; } - #community #mainContent .content:nth-child(even), .gridPage #mainContent .content:nth-child(even) { - background-color: #f7f7f7; } - #community #mainContent .company-logos, .gridPage #mainContent .company-logos { - text-align: center; - max-width: 1200px; - margin: 0 auto; } - #community #mainContent .company-logos img, .gridPage #mainContent .company-logos img { - width: auto; - margin: 10px; - background-color: #f7f7f7; } - #community #mainContent .partner-logos, .gridPage #mainContent .partner-logos { - text-align: center; - max-width: 1200px; - margin: 0 auto; } - #community #mainContent .partner-logos img, .gridPage #mainContent .partner-logos img { - width: auto; - margin: 10px; - background-color: #ffffff; - box-shadow: 0 5px 5px rgba(0, 0, 0, 0.24), 0 0 5px rgba(0, 0, 0, 0.12); } - #community #mainContent #calendarMeetings, .gridPage #mainContent #calendarMeetings { - position: relative; - width: 80vw; - height: 60vw; - max-width: 1200px; - max-height: 900px; - margin: 20px auto; } - #community #mainContent #calendarEvents, .gridPage #mainContent #calendarEvents { - position: relative; - width: 80vw; - height: 30vw; - max-width: 1200px; - max-height: 450px; - margin: 20px auto; } - #community #mainContent iframe, .gridPage #mainContent iframe { - position: absolute; - border: 0; - width: 100%; - height: 100%; } - -.ui-icon { - display: inline-block !important; } - -#feature-state-dialog-link { - text-decoration: none !important; - padding: 5px !important; } - #feature-state-dialog-link a:visited { - color: #454545 !important; } - #feature-state-dialog-link a code { - display: inline-block !important; - box-sizing: border-box !important; - background-color: #f7f7f7 !important; - color: #303030 !important; - font-family: "Roboto Mono", monospace !important; - vertical-align: baseline !important; - font-size: 14px !important; - font-weight: bold !important; - padding: 0px 4px !important; } - -#feature-state-dialog { - background: #fff !important; - border: 1px solid #ddd !important; - padding: 0.5em 1em !important; } - #feature-state-dialog ul, #feature-state-dialog li { - list-style: disc !important; - margin: 4px 12px !important; } - #feature-state-dialog p { - margin: 8px 0px !important; } - #feature-state-dialog code { - display: inline-block !important; - box-sizing: border-box !important; - background-color: #f7f7f7 !important; - color: #303030 !important; - font-family: "Roboto Mono", monospace !important; - vertical-align: baseline !important; - font-size: 14px !important; - font-weight: bold !important; - padding: 0px 4px !important; } - -.ui-dialog { - background: #f7f7f7 !important; - padding: 0.5em; } - -.ui-dialog-content { - position: relative; - float: right; - width: 100%; } - .ui-dialog-content * + h2, .ui-dialog-content * + h3, .ui-dialog-content * + h4, .ui-dialog-content * + h5, .ui-dialog-content * + h6 { - margin-top: 30px; } - .ui-dialog-content h1, .ui-dialog-content h2, .ui-dialog-content h3, .ui-dialog-content h4, .ui-dialog-content h5, .ui-dialog-content h6 { - line-height: normal; - font-weight: 500; - margin-bottom: 30px; - padding-bottom: 10px; } - .ui-dialog-content h1:before, .ui-dialog-content h2:before, .ui-dialog-content h3:before, .ui-dialog-content h4:before, .ui-dialog-content h5:before, .ui-dialog-content h6:before { - display: block; - content: " "; - margin-top: -100px; - height: 100px; - visibility: hidden; } - .ui-dialog-content h1, .ui-dialog-content h2 { - border-bottom: 1px solid #cccccc; } - .ui-dialog-content h1 { - font-size: 32px; - padding-right: 60px; } - .ui-dialog-content h2 { - font-size: 28px; } - .ui-dialog-content h3 { - font-size: 24px; - font-weight: 300; - margin-bottom: 5px; } - .ui-dialog-content h4 { - font-size: 20px; - margin-bottom: 0px; } - .ui-dialog-content h5, .ui-dialog-content h6 { - font-size: 16px; - font-weight: 500; } - .ui-dialog-content p { - font-size: 16px; - font-weight: 300; - line-height: 1.75em; } - .ui-dialog-content p + p { - margin-top: 10px; } - .ui-dialog-content code { - display: inline-block; - box-sizing: border-box; - background-color: #f7f7f7; - color: #303030; - font-family: "Roboto Mono", monospace; - vertical-align: baseline; - font-size: 14px; - font-weight: bold; - padding: 2px 4px; } - .ui-dialog-content a code { - color: #3371e3; - text-decoration: underline; } - .ui-dialog-content pre .pi, .ui-dialog-content pre .s { - margin: 0; - padding: 0; } - .ui-dialog-content .highlight code span, .ui-dialog-content code, .ui-dialog-content pre code { - font-family: "Roboto Mono", monospace; } - .ui-dialog-content code, .ui-dialog-content pre code { - color: #303030; } - .ui-dialog-content pre code { - padding: 0; } - .ui-dialog-content pre { - background-color: #f7f7f7; - display: block; - margin: 20px 0; - padding: 15px; - position: relative; - overflow-x: auto; } - .ui-dialog-content h1 code, .ui-dialog-content h2 code, .ui-dialog-content h3 code, .ui-dialog-content h4 code, .ui-dialog-content h5 code, .ui-dialog-content h6 code { - font-family: inherit; - font-size: inherit; - background-color: transparent; } - .ui-dialog-content .includecode { - table-layout: fixed; } - .ui-dialog-content .includecode, .ui-dialog-content .includecode th, .ui-dialog-content .includecode td { - padding: 0 !important; } - .ui-dialog-content .includecode th { - text-align: right !important; - padding: 10px !important; } - .ui-dialog-content .includecode th a, .ui-dialog-content .includecode th a code { - color: white !important; - background-color: transparent !important; } - .ui-dialog-content .includecode pre { - margin: 0 !important; } - .ui-dialog-content ul li { - list-style: disc; } - .ui-dialog-content ol li { - list-style: decimal; } - .ui-dialog-content ul, .ui-dialog-content ol { - margin: 20px 0; - padding-left: 30px; - font-weight: 300; } - .ui-dialog-content ul ul, .ui-dialog-content ol ol, .ui-dialog-content ul ol, .ui-dialog-content ol ul { - margin: 0.75em 0; } - .ui-dialog-content li { - margin-bottom: 0.75em; - font-size: 16px; - line-height: 1.75em; } - .ui-dialog-content table { - width: 100%; - border: 1px solid #ccc; - border-spacing: 0; - margin-top: 30px; - margin-bottom: 30px; } - .ui-dialog-content thead, .ui-dialog-content tr:nth-child(even) { - background-color: #f7f7f7; } - .ui-dialog-content thead { - background-color: #555; - color: white; } - .ui-dialog-content th, .ui-dialog-content td { - padding: 8px; - text-align: left; - margin: 0; } - .ui-dialog-content th { - font-weight: normal; } - .ui-dialog-content td { - font-size: 0.85em; } - .ui-dialog-content #editPageButton { - position: absolute; - top: -25px; - right: 5px; - width: 50px; - height: 50px; - line-height: 50px; - border-radius: 50%; - white-space: nowrap; - text-indent: 50px; - overflow: hidden; - background: #3371e3 url(/images/icon-pencil.svg) no-repeat; - background-position: 12px 10px; - background-size: 29px 29px; } - .ui-dialog-content #markdown-toc { - margin-bottom: 20px; } - .ui-dialog-content #markdown-toc ul, .ui-dialog-content #markdown-toc li { - list-style: disc; - color: #3371e3; } - .ui-dialog-content #markdown-toc ul { - padding: 0 15px; - margin: 0; } - .ui-dialog-content #markdown-toc li { - padding: 0; - line-height: 1.5em; - margin-bottom: 0; } - .ui-dialog-content #markdown-toc a { - position: relative; - color: #3371e3; - font-weight: 700; } - .ui-dialog-content img { - max-width: 100%; } - .ui-dialog-content a { - text-decoration: underline; } - -.ui-dialog-buttonpane { - background: #f7f7f7 !important; } - -.ui-widget-header { - background: transparent !important; - background-color: transparent !important; - border: 0px !important; } - -.ui-tabs ul, .ui-tabs ol, .ui-tabs li { - padding: 0px !important; - list-style: none !important; - margin-bottom: 0px !important; - margin-left: 4px !important; } - -.ui-tabs-panel ul li { - list-style: disc !important; } - -.ui-tabs-panel ol li { - list-style: decimal !important; } - -.ui-widget-content { - border: 0px !important; } - .ui-widget-content table { - margin: 0px !important; } - -.ui-tabs .ui-tabs-panel { - border: 1px solid #ccc !important; } - -.ui-tabs-anchor { - text-decoration: none !important; } - -#talkToUs h3, #talkToUs h4 { - text-align: center; } - -#talkToUs h3 { - margin-bottom: 15px; } - -#talkToUs h4 { - line-height: normal; - margin-bottom: 50px; } - #talkToUs h4 br { - display: none; } - -#talkToUs #bigSocial { - overflow: hidden; } - #talkToUs #bigSocial div { - width: 100%; - float: left; - padding: 30px; - padding-top: 110px; - background-position: center top; - background-size: auto; - background-repeat: no-repeat; } - #talkToUs #bigSocial div:nth-child(1) { - background-image: url(/images/twitter_icon.png); } - #talkToUs #bigSocial div:nth-child(2) { - background-image: url(/images/github_icon.png); } - #talkToUs #bigSocial div:nth-child(3) { - background-image: url(/images/slack_icon.png); } - #talkToUs #bigSocial div:nth-child(4) { - background-image: url(/images/stackoverflow_icon.png); } - #talkToUs #bigSocial div + div { - margin-top: 20px; - margin-left: 0; } - #talkToUs #bigSocial a { - display: inline-block; - color: #3371e3; - font-size: 24px; - font-weight: 400; - text-decoration: none; - margin-bottom: 15px; } - #talkToUs #bigSocial a, #talkToUs #bigSocial p { - text-align: center; - width: 100%; } - -#home #talkToUs main { - padding: 30px 0; } - -#home #talkToUs h5 { - font-size: 20px; } - -#home #caseStudiesWrapper { - position: relative; - text-align: center; - margin-bottom: 30px; } - #home #caseStudiesWrapper img { - padding-bottom: 1rem; } - #home #caseStudiesWrapper div { - position: relative; - display: inline-block; - vertical-align: top; - width: 100%; - min-height: 230px; - margin-bottom: 60px; - padding-right: 1rem; - background-position: top center; } - #home #caseStudiesWrapper p { - font-size: 20px; } - #home #caseStudiesWrapper a { - position: absolute; - bottom: -30px; - left: 50%; - transform: translateX(-50%); - color: #3371e3; - font-weight: 400; } - -/* Google Search */ -.cse .gsc-control-cse, .gsc-control-cse { - padding: 0; } - -.gsc-control-cse table, .gsc-control-cse-en table { - margin: 0px !important; } - -.gsc-above-wrapper-area { - border-bottom: 0; } - -/* Bing Search */ -#bing-results-container { - margin-top: 30px; - margin-left: 20px; } - -.bing-result { - margin-bottom: 20px; } - -.bing-result-name a { - font-size: 16px; - color: #0000CC; } - -.bing-result-url { - color: #008000; - font-size: 13px; } - -.bing-result-snippet { - color: #000; - font-size: 11px; } - -#bing-pagination-container { - margin: 10px; - margin-left: 20px; } - -.bing-page-anchor { - text-decoration: none !important; - cursor: pointer; - color: #0000CC; - margin-right: 8px; } - -hr { - background-color: #999999; } - -h2 { - margin-bottom: 15px !important; } - -.subhead { - padding-bottom: 2% !important; - padding-top: 0% !important; } - -.details { - margin-left: 1.9%; - padding-right: 5%; - font-size: 16px !important; - padding-bottom: 2% !important; } - -.section1 { - margin-bottom: 3%; } - .section1 .cols { - width: 80% !important; - margin-left: 6.8%; - padding-top: 1.5%; } - .section1 .cols .col1 { - width: 52% !important; - font-weight: 300 !important; } - .section1 .cols .col2 { - width: 46% !important; } - -.banner2text { - width: 63%; - padding-top: 10%; - padding-left: 0% !important; - float: initial !important; - text-align: center; - margin: 0 auto; - position: relative; } - -.banner3text, .banner4text, .banner5text { - width: 63%; - padding-left: 0% !important; - float: initial !important; - text-align: center; - margin: 0 auto; - position: relative; } - -.fullcol { - float: initial !important; } - -body footer { - background-color: #585858 !important; } - -.section1 { - float: left !important; } - -.banner1 { - padding-left: 11.9% !important; } - -.banner2 { - float: initial !important; - padding-bottom: 2% !important; } - -footer { - padding: 0% 7%; } - -.banner4, .banner3, .banner5 { - float: initial !important; } - -@media screen and (max-width: 910px) { - .banner2text { - width: 47%; - padding-top: 45%; } - .details { - margin-left: 0%; - margin-bottom: 3%; } - .subhead { - padding-bottom: 0% !important; - padding-top: 0% !important; } - .banner3 { - width: 100% !important; } } - -@media screen and (max-width: 780px) { - .section1 .cols { - width: 100% !important; - margin-left: 0%; - padding-top: 5%; } - .section1 .cols .col1, .section1 .cols .col2 { - width: 100% !important; - margin-left: 0% !important; } - .fullcol { - width: 90% !important; - margin-left: 5% !important; } - .banner1 { - padding-left: 10% !important; - margin-bottom: 6% !important; } - .banner2text { - padding-top: 60% !important; - padding-bottom: 2% !important; } } - -@media screen and (min-width: 750px) { - h1 { - font-size: 32px; - line-height: 40px; } - h2 { - font-size: 28px; - line-height: 60px; } - h3 { - font-size: 24px; - line-height: 32px; } - h4 { - font-size: 20px; - line-height: 40px; } - h5 { - font-size: 16px; - line-height: 36px; } - p { - font-size: 14px; - line-height: 22px; } - section, header, #vendorStrip { - padding-left: 20px; - padding-right: 20px; } - section main, header main, #vendorStrip main { - width: 100%; - max-width: 100%; } - header { - height: 80px; } - .nav-buttons { - height: 80px; - line-height: 80px; } - .nav-buttons .button + * { - margin-left: 30px; } - #hamburger { - width: 50px; - height: 50px; } - #mainNav { - padding: 140px 0 30px; } - #mainNav h5 { - margin-bottom: 1em; } - #mainNav h3 { - margin-bottom: 0.6em; } - #mainNav .nav-box { - width: 20%; } - #mainNav .nav-box + .nav-box { - margin-left: calc(20% / 3); } - #mainNav main + main { - margin-top: 60px; } - #mainNav .left .button { - height: 50px; - line-height: 50px; - font-size: 18px; } - .open-nav #tryKubernetes, .y-enough #tryKubernetes { - margin-left: 30px; } - #hero { - padding-top: 80px; } - #docs #hero h1, #docs #hero h5 { - padding-left: 20px; - padding-right: 20px; } - #vendorStrip { - height: 88px; - line-height: 88px; - font-size: 16px; } - p { - font-size: 16px; - line-height: 24px; - letter-spacing: 0.1px; } - h1 { - font-size: 36px; - line-height: 44px; } - h3 { - font-size: 28px; - line-height: 36px; } - h4 { - font-size: 24px; - line-height: 40px; } - #home #viewDocs, #home #tryKubernetes { - display: inline-block; } - #vendorStrip { - display: block; - text-align: center; } - #vendorStrip img { - max-height: 24px; - vertical-align: middle; - margin: 0 30px; } - #docs #vendorStrip li a { - font-size: 1em; - font-weight: normal; } - #docs #vendorStrip li li + li { - margin-left: 60px; } - #oceanNodes h3 { - text-align: left; - margin-bottom: 18px; } - #oceanNodes main { - position: relative; - clear: both; - display: table; - height: 160px; } - #oceanNodes main .content { - display: table-cell; - position: relative; - vertical-align: middle; } - #oceanNodes main .image-wrapper { - position: absolute; - top: 50%; - max-width: 25%; - max-height: 100%; - transform: translateY(-50%); } - #oceanNodes main:nth-child(odd) { - padding-right: 210px; } - #oceanNodes main:nth-child(odd) .image-wrapper { - right: 0; } - #oceanNodes main:nth-child(even) { - padding-left: 210px; } - #oceanNodes main:nth-child(even) .image-wrapper { - left: 0; } - #oceanNodes main:nth-child(1) { - padding-right: 0; } - #oceanNodes main:nth-child(1) h3, #oceanNodes main:nth-child(1) p { - text-align: center; } - #oceanNodes main:nth-child(1) .image-wrapper { - position: relative; - display: block; - float: none; - max-width: 100%; - transform: none; } - #oceanNodes main:nth-child(1) .content { - display: block; } - #oceanNodes main img { - width: 100%; } - #video { - height: 400px; - display: block; } - #video > .light-text { - display: block; } - #mobileShowVideoButton { - display: none; } - #features { - padding-bottom: 60px; } - #features .feature-box { - margin-bottom: 30px; } - #features .feature-box:last-child { - margin-bottom: 0; } - #features h3 { - margin-bottom: 40px; } - #features .feature-box > div { - width: 45%; - margin-bottom: 0; } - #talkToUs #bigSocial div { - width: calc(50% - 15px); } - #talkToUs #bigSocial div + div { - margin-top: 0; } - #talkToUs #bigSocial div:nth-child(2) { - margin-left: 20px; } - #talkToUs #bigSocial div:nth-child(3) { - margin-top: 20px; } - #talkToUs #bigSocial div:nth-child(4) { - margin-top: 20px; - margin-left: 20px; } - #talkToUs #bigSocial a { - display: inline-block; - color: #3371e3; - font-weight: 400; - text-decoration: none; } - footer nav { - text-align: center; } - footer nav a { - width: 30%; - padding: 0 20px; } - footer .social { - text-align: center; } - footer .social div { - display: inline-block; } - footer .social div:last-child { - display: block; - margin: 0; } - footer .social span { - display: inline-block; - margin-right: 10px; } - footer .social input { - text-align: left; } - #home #caseStudiesWrapper div { - width: 48%; } } - -@media screen and (min-width: 1025px) { - #hamburger { - display: none; } - ul.global-nav { - display: inline-block; } - #docs #vendorStrip #searchBox:before { - top: 15px; } - #vendorStrip { - height: 44px; - line-height: 44px; } - #vendorStrip li a.YAH:after { - content: ""; - display: block; - position: absolute; - left: 0; - bottom: 0; - width: 100%; - height: 4px; - background-color: #3371e3; } - #vendorStrip #searchBox { - float: right; } - #home #hero #vendorStrip { - display: block; } - #docs #hero h1, #docs #hero h5 { - text-align: left; } - #docs #hero #vendorStrip ul { - float: left; } - #docs #hero #vendorStrip #searchBox { - float: right; - width: 250px; } - #docs #hero #vendorStrip #search { - vertical-align: middle; } - #docs .flyout-button { - display: none; } - #docs .logo { - position: relative; - float: left; - display: block; - width: 180px; - height: 88px; - top: 0; - left: 0; - transform: none; - background-image: url(../images/nav_logo.svg); } - #docs.flip-nav .logo, #docs.open-nav .logo { - background-image: url(../images/nav_logo2.svg); } - #encyclopedia { - padding: 50px 50px 100px 100px; - clear: both; } - #docsToc { - position: relative; - float: left; - padding: 0 20px; - left: 0; - width: 350px; - z-index: auto; } - #docsToc .push-menu-close-button { - display: none; } - #docsContent { - width: calc(100% - 400px); } - #docsContent #editPageButton { - right: -25px; } - section main, header main, footer main { - max-width: 1200px; } - header, #vendorStrip, #encyclopedia, #hero h1, #hero h5, #docs #hero h1, #docs #hero h5, - #community #hero h1, .gridPage #hero h1, #community #hero h5, .gridPage #hero h5 { - padding-left: 100px; - padding-right: 100px; } - #vendorStrip { - padding-right: 10px; } - #home section main, #home header main, #home footer main { - max-width: 1000px; } - #oceanNodes main { - position: relative; - max-width: 830px; } - #oceanNodes main:nth-child(1) { - max-width: 1000px; - padding-right: 475px; } - #oceanNodes main:nth-child(1) h3, #oceanNodes main:nth-child(1) p { - text-align: left; } - #oceanNodes main:nth-child(1) .image-wrapper { - position: absolute; - max-width: 48%; - transform: translateY(-50%); } - #oceanNodes main:nth-child(1) .image-wrapper img { - max-width: 425px; } - #video { - height: 550px; - position: relative; - background-position: center center; - background-size: cover; } - #talkToUs h4 br { - display: block; } - #talkToUs #bigSocial div { - width: calc(25% - 18px); } - #talkToUs #bigSocial div + div { - margin-left: 20px; } - footer { - width: 100%; - background-image: url(../images/texture.png); - background-color: #303030; } - footer main { - padding: 20px 0; } - footer nav { - overflow: hidden; - margin-bottom: 20px; } - footer nav a { - width: 16.65%; - float: left; - font-size: 24px; - font-weight: 300; - white-space: nowrap; } - footer .social { - padding: 0 30px; - max-width: 1200px; } - footer .social div { - float: left; } - footer .social div:last-child { - float: right; } - #search, #wishField { - background-color: transparent; - padding: 10px; - font-size: 16px; - font-weight: 100; - color: white; - border: 1px solid white; - transition: 0.3s; } - #search:focus, #wishField:focus { - background-color: #f7f7f7; - color: #303030; } - .social a { - display: inline-block; - background-image: url(../images/social_sprite.png); - background-repeat: no-repeat; - background-size: auto; - width: 50px; - height: 50px; - border-radius: 5px; - margin-right: 10px; } - .social a:hover { - background-color: #fff; } - .social a span { - position: absolute; - display: block; - height: 0; - overflow: hidden; } - a.twitter { - background-position: 0 0; } - a.twitter:hover { - background-position: 0 100%; } - a.stack-overflow { - background-position: -50px 0; } - a.stack-overflow:hover { - background-position: -50px 100%; } - a.slack { - background-position: -100px 0; } - a.slack:hover { - background-position: -100px 100%; } - a.github { - background-position: -150px 0; } - a.github:hover { - background-position: -150px 100%; } - a.mailing-list { - background-position: -200px 0; } - a.mailing-list:hover { - background-position: -200px 100%; } - a.calendar { - background-position: -250px 0; } - a.calendar:hover { - background-position: -250px 100%; } - #community #hero, .gridPage #hero { - text-align: left; } - #community #hero h1, .gridPage #hero h1 { - padding: 20px 100px; } - #community #tryKubernetes, .gridPage #tryKubernetes { - width: auto; - background-color: #3371e3; - padding: 0 20px; } - #bigSocial div { - width: calc(25% - 18px); } - #home #caseStudiesWrapper div { - width: 24%; - min-height: 260px; } } - -@media screen and (min-width: 1300px) { - #vendorStrip { - padding-right: 100px; } } - -@media screen and (min-width: 456px) { - #vendorStrip li + li { - margin-left: 20px; } } +html,body{margin:0;padding:0}input,button{outline:none}button{cursor:pointer}ul,li{list-style:none}ul{margin:0;padding:0}a{text-decoration:none}.clear{display:block;clear:both}.light-text{color:#fff}.right{float:right}.left{float:left}.center{text-align:center}*,.button{box-sizing:border-box;font-family:"Roboto",sans-serif;background:none;margin:0;border:0}body{font-family:"Roboto",sans-serif}h1,h2,h5,p{font-weight:300}h3,h4{font-weight:400}html,body{margin:0;padding:0}input,button{outline:none}button{cursor:pointer}ul,li{list-style:none}ul{margin:0;padding:0}a{text-decoration:none}.clear{display:block;clear:both}.light-text{color:#fff}.right{float:right}.left{float:left}.center{text-align:center}h1{font-size:32px;line-height:40px}h2{font-size:28px;line-height:60px}h3{font-size:24px;line-height:32px}h4{font-size:20px;line-height:40px}h5{font-size:16px;line-height:36px}p{font-size:14px;line-height:22px}section,header,#vendorStrip{padding-left:20px;padding-right:20px}section main,header main,#vendorStrip main{width:100%;max-width:100%}header{height:80px}.nav-buttons{height:80px;line-height:80px}.nav-buttons .button+*{margin-left:30px}#hamburger{width:50px;height:50px}#mainNav{padding:140px 0 30px}#mainNav h5{margin-bottom:1em}#mainNav h3{margin-bottom:.6em}#mainNav .nav-box{width:20%}#mainNav .nav-box+.nav-box{margin-left:calc(20% / 3)}#mainNav main+main{margin-top:60px}#mainNav .left .button{height:50px;line-height:50px;font-size:18px}.open-nav #tryKubernetes,.y-enough #tryKubernetes{margin-left:30px}#hero{padding-top:80px}#docs #hero h1,#docs #hero h5{padding-left:20px;padding-right:20px}#vendorStrip{height:88px;line-height:88px;font-size:16px}body{background-color:#fff}section{position:relative;background-color:#fff}section main,header main,footer main{position:relative;margin:auto}p{font-size:14px;font-weight:400}.button{display:inline-block;border-radius:6px;padding:0 20px;line-height:40px;color:#fff;background-color:#3371e3;text-decoration:none}#cellophane{position:fixed;top:0;left:0;width:100%;height:100%;display:none}header{position:fixed;top:0;left:0;width:100%;z-index:8888;background-color:transparent;box-shadow:0 0 0 transparent;overflow:hidden;transition:.3s;text-align:center}.logo{position:relative;float:left;display:block;width:180px;height:88px;top:0;left:0;transform:none;background-image:url(/images/nav_logo.svg);background-size:contain;background-position:center center;background-repeat:no-repeat}#docs .flyout-button{position:fixed;top:20px;left:20px;width:50px;height:50px;background-image:url(/images/toc_icon.png);background-position:center center;background-repeat:no-repeat;background-size:auto;border-radius:50%;transition:.3s;z-index:99999}#docs.open-nav .flyout-button{display:none}#docs .logo{position:absolute;top:40px;left:50%;transform:translate(-50%, -50%);display:block;width:45px;height:44px;background-image:url(/images/favicon.png)}#docs.flip-nav .flyout-button{background-image:url(/images/toc_icon_grey.png)}.nav-buttons{float:right}#viewDocs,#tryKubernetes{display:none}#viewDocs{border:2px solid #fff;background-color:transparent;transition:.3s}#viewDocs:hover{background-color:#fff;color:#303030}#tryKubernetes{width:0;padding:0 0;border:1px solid transparent;background-color:transparent;text-align:center;white-space:nowrap;vertical-align:middle;overflow:hidden;transition:.3s}#hamburger{display:inline-block;position:relative;vertical-align:middle;padding:0;border:0;background:none}#hamburger div,#hamburger:before,#hamburger:after{position:absolute;left:15%;width:70%;height:2px;background-color:#3371e3;transition:.3s;content:""}#hamburger div{top:calc(50% - 1px)}#hamburger:before{top:24%}#hamburger:after{bottom:24%}#hamburger:hover div,#hamburger:hover:before,#hamburger:hover:after{background-color:#fff}#mainNav h5{color:#3371e3;font-weight:normal}#mainNav main{white-space:nowrap;overflow:hidden;clear:both}#mainNav .nav-box{float:left;white-space:normal}#mainNav h3 a{color:#3371e3;text-decoration:none}ul.global-nav{display:none}ul.global-nav li{display:inline-block;margin-right:14px}ul.global-nav li a{color:#fff;font-weight:400;padding:0;position:relative}ul.global-nav li a.active:after{position:absolute;width:100%;height:2px;content:"";bottom:-4px;left:0;background:#fff}ul.global-nav li a .ui-icon{filter:brightness(0) invert(1)}ul.global-nav li ul{display:none;position:fixed;top:40px;text-align:left}ul.global-nav li ul li{display:block;height:28px}ul.global-nav li ul li a{background:#303030;color:#fff;padding:7px}ul.global-nav li ul li:last-child a{border-radius:7px}ul.global-nav li:hover ul{display:block}.flip-nav ul.global-nav li a,.open-nav ul.global-nav li a{color:#303030}.flip-nav ul.global-nav li a .ui-icon,.open-nav ul.global-nav li a .ui-icon{filter:brightness(0)}.flip-nav ul.global-nav li ul li a{background:#fff;color:#303030}.flip-nav ul.global-nav li a.active:after,.flip-nav ul.global-nav li ul li a.active:after,.open-nav ul.global-nav li a.active:after{background:#3371e3}.flip-nav header{background-color:#fff}.open-nav body{overflow:hidden}.open-nav #cellophane{display:block;z-index:9998}.open-nav header{background-color:#e8e8e8;z-index:9999}.open-nav #hamburger div{opacity:0}.open-nav #hamburger:before,.open-nav #hamburger:after{left:12px;transform-origin:0 1px}.open-nav #hamburger:before{transform:rotate(45deg)}.open-nav #hamburger:after{transform:rotate(-45deg)}.open-nav #tryKubernetes,.y-enough #tryKubernetes{width:auto;padding:0 20px;background-color:#3371e3;border-color:#3371e3}.flip-nav header,.open-nav header{box-shadow:0 1px 2px #4c4c4c}.flip-nav #viewDocs,.open-nav #viewDocs{border-color:#303030;color:#303030}.flip-nav #viewDocs:hover,.open-nav #viewDocs:hover{border-color:#3371e3;background-color:#3371e3;color:#fff}.flip-nav #hamburger:hover div,.flip-nav #hamburger:hover:before,.flip-nav #hamburger:hover:after,.open-nav #hamburger:hover div,.open-nav #hamburger:hover:before,.open-nav #hamburger:hover:after{background-color:#303030}#hero{background-image:url(/images/texture.png);background-color:#303030;text-align:center;padding-left:0;padding-right:0;margin-bottom:0;position:relative}#hero.bot-bar:after{display:block;margin-bottom:-20px;height:8px;width:100%;background-color:rgba(255,255,255,0.1);content:""}#hero.no-sub h5{display:none}#hero.no-sub h1{margin-bottom:20px}#home #hero:after{display:none}#vendorStrip{position:relative;background-color:rgba(255,255,255,0.1);font-weight:100;white-space:nowrap;text-align:center}#vendorStrip li a{color:rgba(255,255,255,0.5)}#vendorStrip li a.YAH{color:#fff;position:relative}footer{width:100%;background-image:url(/images/texture.png);background-color:#303030}footer main{padding:20px 0}footer nav a{width:100%;text-align:center;display:inline-block;margin:10px 0;font-size:24px;font-weight:300;color:#fff;text-decoration:none}footer .social{margin:20px 0}footer .social div{text-align:center;margin-bottom:20px}footer .social div:last-child{margin:30px 0}footer .social span{display:block;margin-bottom:8px}footer .social input{text-align:center}#search,#wishField{background-color:transparent;padding:10px;font-size:16px;font-weight:100;color:#fff;border:1px solid #fff;transition:.3s}#search:focus,#wishField:focus{background-color:#f7f7f7;color:#303030}.social a{display:inline-block;background-image:url(/images/social_sprite.png);background-repeat:no-repeat;background-size:auto;width:50px;height:50px;border-radius:5px;margin-right:10px}.social a:hover{background-color:#fff}.social a span{position:absolute;display:block;height:0;overflow:hidden}.social a.button{background-image:none;width:auto;height:auto}.social a.button:hover{color:#3371e3}a.twitter{background-position:0 0}a.twitter:hover{background-position:0 100%}a.stack-overflow{background-position:-50px 0}a.stack-overflow:hover{background-position:-50px 100%}a.slack{background-position:-100px 0}a.slack:hover{background-position:-100px 100%}a.github{background-position:-150px 0}a.github:hover{background-position:-150px 100%}a.mailing-list{background-position:-200px 0}a.mailing-list:hover{background-position:-200px 100%}a.calendar{background-position:-250px 0}a.calendar:hover{background-position:-250px 100%}#viewDocs{display:none}section{background-color:#fff}#hero{background-color:#303030}#hero h5{margin:20px 0;line-height:28px}#vendorStrip{position:relative}#vendorStrip ul{float:left}#vendorStrip li{display:inline-block;height:100%}#vendorStrip a{display:block;height:100%;color:#fff;font-size:.75em;font-weight:bold}#vendorStrip li+li{margin-left:0}#docs #vendorStrip{line-height:44px;max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}#docs #vendorStrip ul{float:none}#docs #vendorStrip #searchBox{float:none;display:block;width:80%;margin:0 auto;height:44px;line-height:44px;position:relative}#docs #vendorStrip #searchBox:before{position:absolute;width:15px;height:15px;content:"";right:8px;top:7px;background-image:url(/images/search-icon.svg);background-repeat:no-repeat;background-size:100% 100%;z-index:1}#docs #vendorStrip #search{width:100%;padding:0 10px;height:30px;line-height:30px;font-size:16px;vertical-align:top;background:#fff;border:none;border-radius:4px;position:relative}#encyclopedia{position:relative;padding:50px 20px 20px 20px;overflow:hidden;font-size:14px}#encyclopedia>div{height:100%}#docsToc{position:fixed;background-color:#fff;top:0;left:0;width:0;height:100vh;overflow:hidden;padding:50px 0;z-index:999999;transition:.3s}#docsToc .yah>.title{background-color:#f7f7f7;border-left:3px solid #3371e3;padding:7.5px 10px 7.5px 18px;margin-left:-3px;color:#3371e3}.open-toc body{overflow:hidden}.open-toc #docsToc{padding:50px 20px;width:400px;max-width:100vw;overflow-y:auto}.pi-accordion>.container:first-child>.item:first-child>.title:first-child{padding-left:0;font-size:1.5em;font-weight:700}.pi-accordion>.container:first-child>.item.yah:first-child>.title:first-child{margin-left:-20px !important}.pi-accordion .item{overflow:hidden}.pi-accordion .title{color:#303030;position:relative;padding:7.5px 10px 7.5px 18px;cursor:pointer;transition:.3s}.pi-accordion .title:hover{color:#3371e3}.pi-accordion a.item>.title{color:#000}.pi-accordion a.item>.title:hover{color:#3371e3}.pi-accordion div.item>.title:before{content:"";position:absolute;top:12px;left:2px;border-style:solid;border-width:5px 0 5px 8px;border-color:transparent transparent transparent #3371e3;transform:rotate(0deg);transition:.3s}.pi-accordion .wrapper{position:relative;width:100%;transition:height .3s}.pi-accordion .content{padding-left:20px;opacity:0;transition:.3s}.pi-accordion .item.on>.title:before{transform:rotate(90deg)}.pi-accordion .item.on>.wrapper>.content{opacity:1}dt{margin-bottom:8px}dd{margin-bottom:16px}.pi-pushmenu{display:none;position:fixed;top:0;width:100%;height:100%;opacity:0;transition:opacity .3s}.pi-pushmenu.on{opacity:1}.pi-pushmenu .overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4)}.pi-pushmenu .sled{position:absolute;top:0;width:0;height:100%;background-color:#fff;overflow:auto;transition:.3s}.pi-pushmenu.on .sled{width:400px;max-width:100vw}.pi-pushmenu .top-bar{height:0;line-height:60px;background-color:#444}.pi-pushmenu ul{margin-top:25px}.pi-pushmenu li{position:relative;display:block;width:100%;min-height:45px;padding:0 60px 0 20px;border-bottom:1px solid #ccc}.pi-pushmenu a{display:inline-block;width:100%;height:45px;line-height:45px;font-family:"Roboto",sans-serif;font-size:20px;color:#3371e3}.pi-pushmenu .button{background:none;padding:0}.pi-pushmenu ul ul{padding:0 20px}.pi-pushmenu ul ul li{min-height:40px}.pi-pushmenu ul ul a{height:40px;line-height:40px;font-size:18px;color:#555}.push-menu-close-button{position:absolute;top:0;right:0;width:50px;height:50px}.push-menu-close-button:before,.push-menu-close-button:after{content:"";position:absolute;top:calc(50% - 1px);left:25%;width:50%;height:2px;background-color:#000}.push-menu-close-button:before{transform:rotate(45deg)}.push-menu-close-button:after{transform:rotate(-45deg)}#docsContent{position:relative;float:right;width:100%}#docsContent *+h2,#docsContent *+h3,#docsContent *+h4,#docsContent *+h5,#docsContent *+h6{margin-top:30px}#docsContent h1,#docsContent h2,#docsContent h3,#docsContent h4,#docsContent h5,#docsContent h6{line-height:normal;font-weight:500;margin-bottom:30px;padding-bottom:10px}#docsContent h1:before,#docsContent h2:before,#docsContent h3:before,#docsContent h4:before,#docsContent h5:before,#docsContent h6:before{display:block;content:" ";margin-top:-100px;height:100px;visibility:hidden}#docsContent h1,#docsContent h2{border-bottom:1px solid #ccc}#docsContent h1{font-size:32px;padding-right:60px}#docsContent h2{font-size:28px}#docsContent h3{font-size:24px;font-weight:300;margin-bottom:5px}#docsContent h4{font-size:20px;margin-bottom:0px}#docsContent h5,#docsContent h6{font-size:16px;font-weight:500}#docsContent p{font-size:16px;font-weight:300;line-height:1.75em}#docsContent p+p{margin-top:10px}#docsContent code{display:inline-block;box-sizing:border-box;background-color:#f7f7f7;color:#303030;font-family:"Roboto Mono",monospace;vertical-align:baseline;font-size:14px;font-weight:bold;padding:2px 4px}#docsContent a code{color:#3371e3;text-decoration:underline}#docsContent pre .pi,#docsContent pre .s{margin:0;padding:0}#docsContent .highlight code span,#docsContent code,#docsContent pre code{font-family:"Roboto Mono",monospace}#docsContent code,#docsContent pre code{color:#303030}#docsContent pre code{padding:0}#docsContent pre{background-color:#f7f7f7;display:block;margin:20px 0;padding:15px;position:relative;overflow-x:auto}#docsContent h1 code,#docsContent h2 code,#docsContent h3 code,#docsContent h4 code,#docsContent h5 code,#docsContent h6 code{font-size:inherit;background-color:transparent}#docsContent .includecode{table-layout:fixed}#docsContent .includecode,#docsContent .includecode th,#docsContent .includecode td{padding:0 !important}#docsContent .includecode th{text-align:right !important;padding:10px !important}#docsContent .includecode th a,#docsContent .includecode th a code{color:#fff !important;background-color:transparent !important}#docsContent .includecode pre{margin:0 !important}#docsContent ul li{list-style:disc}#docsContent ol ul li{list-style:disc}#docsContent ol li{list-style:decimal}#docsContent ul,#docsContent ol{margin:20px 0;padding-left:30px;font-weight:300}#docsContent ul ul,#docsContent ol ol,#docsContent ul ol,#docsContent ol ul{margin:.75em 0}#docsContent li{margin-bottom:.75em;font-size:16px;line-height:1.75em}#docsContent table{width:100%;border:1px solid #ccc;border-spacing:0;margin-top:30px;margin-bottom:30px}#docsContent thead,#docsContent tr:nth-child(even){background-color:#f7f7f7}#docsContent thead{background-color:#555;color:#fff}#docsContent th,#docsContent td{padding:8px;text-align:left;margin:0}#docsContent th{font-weight:normal}#docsContent td{font-size:.85em}#docsContent #editPageButton{position:absolute;top:-25px;right:5px;width:50px;height:50px;line-height:50px;border-radius:50%;white-space:nowrap;text-indent:50px;overflow:hidden;background:#3371e3 url(/images/icon-pencil.svg) no-repeat;background-position:12px 10px;background-size:29px 29px}#docsContent #markdown-toc,#docsContent #TableOfContents{margin-bottom:20px}#docsContent #markdown-toc ul,#docsContent #markdown-toc li,#docsContent #TableOfContents ul,#docsContent #TableOfContents li{list-style:disc;color:#3371e3}#docsContent #markdown-toc ul,#docsContent #TableOfContents ul{padding:0 15px;margin:0}#docsContent #markdown-toc li,#docsContent #TableOfContents li{padding:0;line-height:1.5em;margin-bottom:0}#docsContent #markdown-toc a,#docsContent #TableOfContents a{position:relative;color:#3371e3;font-weight:700}#docsContent img{max-width:100%}#docsContent #TableOfContents>ul>li{list-style:none}#docsContent #TableOfContents ul,#docsContent #TableOfContents li{list-style:disk}.fixed footer{position:fixed;bottom:0}#miceType{clear:both;font-size:11px;line-height:18px;color:#aaa}html.search #docsContent{position:relative;float:none;width:90%;max-width:850px;margin:0 auto}html.search #docsContent #editPageButton{display:none}html.search #docsContent table{border:0;margin-bottom:0}html.search #docsContent td{padding:0}html.search #docsContent h1{margin-bottom:0;border-bottom:0;padding-bottom:0;padding-left:8px}#home.flip-nav .logo,#home.open-nav .logo{background-image:url(/images/nav_logo2.svg)}#home #hero{margin-bottom:0;padding-bottom:1px}#home #hero main{padding:0 10px;margin-bottom:30px}#home #hero #vendorStrip{display:none}#oceanNodes{padding-top:60px;padding-bottom:60px}#oceanNodes a{color:#3371e3}#oceanNodes main{margin-bottom:60px;min-height:160px}#oceanNodes .image-wrapper{max-width:75%;margin:0 auto 20px;text-align:center}#oceanNodes .image-wrapper img{width:100%;max-width:160px}#oceanNodes main:first-child .image-wrapper{max-width:100%}#oceanNodes main:first-child .image-wrapper img{max-width:491px}#oceanNodes h3{margin-bottom:30px}#video{height:200px}#video{width:100%;position:relative;background-position:center center;background-size:cover}#video>.light-text{display:none;position:absolute;top:50%;left:75%;width:525px;padding-right:80px;transform:translate(-50%, -50%);color:#fff}#video h2{font-size:32px;line-height:44px;margin-bottom:20px}#video p{margin-bottom:20px}#video #desktopKCButton{position:relative;font-size:18px;background-color:#303030;border-radius:8px;color:#fff;padding:20px 10px 20px 10px}#video #desktopShowVideoButton{position:relative;font-size:24px;background-color:#fff;border-radius:8px;color:#3371e3;padding:15px 30px 15px 80px;margin-bottom:15px}#video #desktopShowVideoButton:before{content:"";position:absolute;position:absolute;top:50%;left:40px;transform:translate(-50%, -50%);width:0;height:0;border-style:solid;border-width:10px 0 10px 20px;border-color:transparent transparent transparent #3371e3}#video #mobileShowVideoButton{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:80px;height:80px;border-radius:50%;background-color:transparent;border:5px solid rgba(255,255,255,0.2);overflow:visible}#video #mobileShowVideoButton:after{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);left:40px;content:"";width:0;height:0;border-style:solid;border-width:20px 0 20px 30px;border-color:transparent transparent transparent #fff}#videoPlayer{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:rgba(0,0,0,0.9);display:none}#videoPlayer iframe{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:80vw;height:45vw;max-width:142.2222222222vh;max-height:80vh}#videoPlayer #closeButton{position:absolute;top:20px;right:20px;width:50px;height:50px;border:2px solid transparent;transition:.3s}#videoPlayer #closeButton:before,#videoPlayer #closeButton:after{content:"";position:absolute;top:calc(50% - 1px);left:10%;width:80%;height:2px;background-color:#fff}#videoPlayer #closeButton:before{transform:rotate(45deg)}#videoPlayer #closeButton:after{transform:rotate(-45deg)}#videoPlayer #closeButton:hover{border-color:#fff}#cncf{padding-top:60px;padding-bottom:140px;background-image:url(/images/cncf-color.png);background-position:center 100px;background-repeat:no-repeat;background-size:300px}#kubeweekly{background-color:#f7f7f7;padding-top:60px;padding-bottom:140px;background-size:auto;font-family:"Roboto Mono",monospace !important;font-size:24px;font-weight:bold}#kubeweekly h5{font-size:20px}.subscribe-button{border-radius:6px;padding:0 20px;line-height:31px;color:#fff;background-color:blue;text-decoration:none;font-size:14px}#features{padding-top:140px;background-color:#f7f7f7;background-image:url(/images/wheel.png);background-position:center 60px;background-repeat:no-repeat;background-size:auto}.feature-box{width:100%;overflow:hidden;clear:both}.feature-box h4{line-height:normal;margin-bottom:15px}.feature-box>div:first-child{float:left}.feature-box>div:last-child{float:right}#features h3{margin-bottom:20px}#features .feature-box{margin-bottom:0}#features .feature-box>div{width:100%;margin-bottom:40px}#community.open-nav .logo,#community.flip-nav .logo,.gridPage.open-nav .logo,.gridPage.flip-nav .logo{background-image:url(/images/nav_logo2.svg)}#community #hero,.gridPage #hero{padding-bottom:20px}#community #mainContent,.gridPage #mainContent{padding:20px 0}#community #mainContent main,.gridPage #mainContent main{max-width:none}#community #mainContent a,.gridPage #mainContent a{color:#3371e3}#community #mainContent .content,.gridPage #mainContent .content{margin-bottom:30px;padding:30px 0}#community #mainContent .content h1,#community #mainContent .content h2,#community #mainContent .content h3,#community #mainContent .content h4,#community #mainContent .content h5,#community #mainContent .content h6,#community #mainContent .content p,.gridPage #mainContent .content h1,.gridPage #mainContent .content h2,.gridPage #mainContent .content h3,.gridPage #mainContent .content h4,.gridPage #mainContent .content h5,.gridPage #mainContent .content h6,.gridPage #mainContent .content p{line-height:normal;max-width:1200px;padding:0 20px;margin:0 auto 20px}#community #mainContent .content:nth-child(even),.gridPage #mainContent .content:nth-child(even){background-color:#f7f7f7}#community #mainContent .company-logos,.gridPage #mainContent .company-logos{text-align:center;max-width:1200px;margin:0 auto}#community #mainContent .company-logos img,.gridPage #mainContent .company-logos img{width:auto;margin:10px;background-color:#f7f7f7}#community #mainContent .partner-logos,.gridPage #mainContent .partner-logos{text-align:center;max-width:1200px;margin:0 auto}#community #mainContent .partner-logos img,.gridPage #mainContent .partner-logos img{width:auto;margin:10px;background-color:#fff;box-shadow:0 5px 5px rgba(0,0,0,0.24),0 0 5px rgba(0,0,0,0.12)}#community #mainContent #calendarMeetings,.gridPage #mainContent #calendarMeetings{position:relative;width:80vw;height:60vw;max-width:1200px;max-height:900px;margin:20px auto}#community #mainContent #calendarEvents,.gridPage #mainContent #calendarEvents{position:relative;width:80vw;height:30vw;max-width:1200px;max-height:450px;margin:20px auto}#community #mainContent iframe,.gridPage #mainContent iframe{position:absolute;border:0;width:100%;height:100%}.ui-icon{display:inline-block !important}#feature-state-dialog-link{text-decoration:none !important;padding:5px !important}#feature-state-dialog-link a:visited{color:#454545 !important}#feature-state-dialog-link a code{display:inline-block !important;box-sizing:border-box !important;background-color:#f7f7f7 !important;color:#303030 !important;font-family:"Roboto Mono",monospace !important;vertical-align:baseline !important;font-size:14px !important;font-weight:bold !important;padding:0px 4px !important}#feature-state-dialog{background:#fff !important;border:1px solid #ddd !important;padding:.5em 1em !important}#feature-state-dialog ul,#feature-state-dialog li{list-style:disc !important;margin:4px 12px !important}#feature-state-dialog p{margin:8px 0px !important}#feature-state-dialog code{display:inline-block !important;box-sizing:border-box !important;background-color:#f7f7f7 !important;color:#303030 !important;font-family:"Roboto Mono",monospace !important;vertical-align:baseline !important;font-size:14px !important;font-weight:bold !important;padding:0px 4px !important}.ui-dialog{background:#f7f7f7 !important;padding:.5em}.ui-dialog-content{position:relative;float:right;width:100%}.ui-dialog-content *+h2,.ui-dialog-content *+h3,.ui-dialog-content *+h4,.ui-dialog-content *+h5,.ui-dialog-content *+h6{margin-top:30px}.ui-dialog-content h1,.ui-dialog-content h2,.ui-dialog-content h3,.ui-dialog-content h4,.ui-dialog-content h5,.ui-dialog-content h6{line-height:normal;font-weight:500;margin-bottom:30px;padding-bottom:10px}.ui-dialog-content h1:before,.ui-dialog-content h2:before,.ui-dialog-content h3:before,.ui-dialog-content h4:before,.ui-dialog-content h5:before,.ui-dialog-content h6:before{display:block;content:" ";margin-top:-100px;height:100px;visibility:hidden}.ui-dialog-content h1,.ui-dialog-content h2{border-bottom:1px solid #ccc}.ui-dialog-content h1{font-size:32px;padding-right:60px}.ui-dialog-content h2{font-size:28px}.ui-dialog-content h3{font-size:24px;font-weight:300;margin-bottom:5px}.ui-dialog-content h4{font-size:20px;margin-bottom:0px}.ui-dialog-content h5,.ui-dialog-content h6{font-size:16px;font-weight:500}.ui-dialog-content p{font-size:16px;font-weight:300;line-height:1.75em}.ui-dialog-content p+p{margin-top:10px}.ui-dialog-content code{display:inline-block;box-sizing:border-box;background-color:#f7f7f7;color:#303030;font-family:"Roboto Mono",monospace;vertical-align:baseline;font-size:14px;font-weight:bold;padding:2px 4px}.ui-dialog-content a code{color:#3371e3;text-decoration:underline}.ui-dialog-content pre .pi,.ui-dialog-content pre .s{margin:0;padding:0}.ui-dialog-content .highlight code span,.ui-dialog-content code,.ui-dialog-content pre code{font-family:"Roboto Mono",monospace}.ui-dialog-content code,.ui-dialog-content pre code{color:#303030}.ui-dialog-content pre code{padding:0}.ui-dialog-content pre{background-color:#f7f7f7;display:block;margin:20px 0;padding:15px;position:relative;overflow-x:auto}.ui-dialog-content h1 code,.ui-dialog-content h2 code,.ui-dialog-content h3 code,.ui-dialog-content h4 code,.ui-dialog-content h5 code,.ui-dialog-content h6 code{font-family:inherit;font-size:inherit;background-color:transparent}.ui-dialog-content .includecode{table-layout:fixed}.ui-dialog-content .includecode,.ui-dialog-content .includecode th,.ui-dialog-content .includecode td{padding:0 !important}.ui-dialog-content .includecode th{text-align:right !important;padding:10px !important}.ui-dialog-content .includecode th a,.ui-dialog-content .includecode th a code{color:#fff !important;background-color:transparent !important}.ui-dialog-content .includecode pre{margin:0 !important}.ui-dialog-content ul li{list-style:disc}.ui-dialog-content ol li{list-style:decimal}.ui-dialog-content ul,.ui-dialog-content ol{margin:20px 0;padding-left:30px;font-weight:300}.ui-dialog-content ul ul,.ui-dialog-content ol ol,.ui-dialog-content ul ol,.ui-dialog-content ol ul{margin:.75em 0}.ui-dialog-content li{margin-bottom:.75em;font-size:16px;line-height:1.75em}.ui-dialog-content table{width:100%;border:1px solid #ccc;border-spacing:0;margin-top:30px;margin-bottom:30px}.ui-dialog-content thead,.ui-dialog-content tr:nth-child(even){background-color:#f7f7f7}.ui-dialog-content thead{background-color:#555;color:#fff}.ui-dialog-content th,.ui-dialog-content td{padding:8px;text-align:left;margin:0}.ui-dialog-content th{font-weight:normal}.ui-dialog-content td{font-size:.85em}.ui-dialog-content #editPageButton{position:absolute;top:-25px;right:5px;width:50px;height:50px;line-height:50px;border-radius:50%;white-space:nowrap;text-indent:50px;overflow:hidden;background:#3371e3 url(/images/icon-pencil.svg) no-repeat;background-position:12px 10px;background-size:29px 29px}.ui-dialog-content #markdown-toc{margin-bottom:20px}.ui-dialog-content #markdown-toc ul,.ui-dialog-content #markdown-toc li{list-style:disc;color:#3371e3}.ui-dialog-content #markdown-toc ul{padding:0 15px;margin:0}.ui-dialog-content #markdown-toc li{padding:0;line-height:1.5em;margin-bottom:0}.ui-dialog-content #markdown-toc a{position:relative;color:#3371e3;font-weight:700}.ui-dialog-content img{max-width:100%}.ui-dialog-content a{text-decoration:underline}.ui-dialog-buttonpane{background:#f7f7f7 !important}.ui-widget-header{background:transparent !important;background-color:transparent !important;border:0px !important}.ui-tabs ul,.ui-tabs ol,.ui-tabs li{padding:0px !important;list-style:none !important;margin-bottom:0px !important;margin-left:4px !important}.ui-tabs-panel ul li{list-style:disc !important}.ui-tabs-panel ol li{list-style:decimal !important}.ui-widget-content{border:0px !important}.ui-widget-content table{margin:0px !important}.ui-tabs .ui-tabs-panel{border:1px solid #ccc !important}.ui-tabs-anchor{text-decoration:none !important}#talkToUs h3,#talkToUs h4{text-align:center}#talkToUs h3{margin-bottom:15px}#talkToUs h4{line-height:normal;margin-bottom:50px}#talkToUs h4 br{display:none}#talkToUs #bigSocial{overflow:hidden}#talkToUs #bigSocial div{width:100%;float:left;padding:30px;padding-top:110px;background-position:center top;background-size:auto;background-repeat:no-repeat}#talkToUs #bigSocial div:nth-child(1){background-image:url(/images/twitter_icon.png)}#talkToUs #bigSocial div:nth-child(2){background-image:url(/images/github_icon.png)}#talkToUs #bigSocial div:nth-child(3){background-image:url(/images/slack_icon.png)}#talkToUs #bigSocial div:nth-child(4){background-image:url(/images/stackoverflow_icon.png)}#talkToUs #bigSocial div+div{margin-top:20px;margin-left:0}#talkToUs #bigSocial a{display:inline-block;color:#3371e3;font-size:24px;font-weight:400;text-decoration:none;margin-bottom:15px}#talkToUs #bigSocial a,#talkToUs #bigSocial p{text-align:center;width:100%}#home #talkToUs main{padding:30px 0}#home #talkToUs h5{font-size:20px}#home #caseStudiesWrapper{position:relative;text-align:center;margin-bottom:30px}#home #caseStudiesWrapper img{padding-bottom:1rem}#home #caseStudiesWrapper div{position:relative;display:inline-block;vertical-align:top;width:100%;min-height:230px;margin-bottom:60px;padding-right:1rem;background-position:top center}#home #caseStudiesWrapper p{font-size:20px}#home #caseStudiesWrapper a{position:absolute;bottom:-30px;left:50%;transform:translateX(-50%);color:#3371e3;font-weight:400}.cse .gsc-control-cse,.gsc-control-cse{padding:0}.gsc-control-cse table,.gsc-control-cse-en table{margin:0px !important}.gsc-above-wrapper-area{border-bottom:0}#bing-results-container{margin-top:30px;margin-left:20px}.bing-result{margin-bottom:20px}.bing-result-name a{font-size:16px;color:#00c}.bing-result-url{color:green;font-size:13px}.bing-result-snippet{color:#000;font-size:11px}#bing-pagination-container{margin:10px;margin-left:20px}.bing-page-anchor{text-decoration:none !important;cursor:pointer;color:#00c;margin-right:8px}hr{background-color:#999}h2{margin-bottom:15px !important}.subhead{padding-bottom:2% !important;padding-top:0% !important}.details{margin-left:1.9%;padding-right:5%;font-size:16px !important;padding-bottom:2% !important}.section1{margin-bottom:3%}.section1 .cols{width:80% !important;margin-left:6.8%;padding-top:1.5%}.section1 .cols .col1{width:52% !important;font-weight:300 !important}.section1 .cols .col2{width:46% !important}.banner2text{width:63%;padding-top:10%;padding-left:0% !important;float:initial !important;text-align:center;margin:0 auto;position:relative}.banner3text,.banner4text,.banner5text{width:63%;padding-left:0% !important;float:initial !important;text-align:center;margin:0 auto;position:relative}.fullcol{float:initial !important}body footer{background-color:#585858 !important}.section1{float:left !important}.banner1{padding-left:11.9% !important}.banner2{float:initial !important;padding-bottom:2% !important}footer{padding:0% 7%}.banner4,.banner3,.banner5{float:initial !important}@media screen and (max-width: 910px){.banner2text{width:47%;padding-top:45%}.details{margin-left:0%;margin-bottom:3%}.subhead{padding-bottom:0% !important;padding-top:0% !important}.banner3{width:100% !important}}@media screen and (max-width: 780px){.section1 .cols{width:100% !important;margin-left:0%;padding-top:5%}.section1 .cols .col1,.section1 .cols .col2{width:100% !important;margin-left:0% !important}.fullcol{width:90% !important;margin-left:5% !important}.banner1{padding-left:10% !important;margin-bottom:6% !important}.banner2text{padding-top:60% !important;padding-bottom:2% !important}}@media screen and (min-width: 750px){h1{font-size:32px;line-height:40px}h2{font-size:28px;line-height:60px}h3{font-size:24px;line-height:32px}h4{font-size:20px;line-height:40px}h5{font-size:16px;line-height:36px}p{font-size:14px;line-height:22px}section,header,#vendorStrip{padding-left:20px;padding-right:20px}section main,header main,#vendorStrip main{width:100%;max-width:100%}header{height:80px}.nav-buttons{height:80px;line-height:80px}.nav-buttons .button+*{margin-left:30px}#hamburger{width:50px;height:50px}#mainNav{padding:140px 0 30px}#mainNav h5{margin-bottom:1em}#mainNav h3{margin-bottom:.6em}#mainNav .nav-box{width:20%}#mainNav .nav-box+.nav-box{margin-left:calc(20% / 3)}#mainNav main+main{margin-top:60px}#mainNav .left .button{height:50px;line-height:50px;font-size:18px}.open-nav #tryKubernetes,.y-enough #tryKubernetes{margin-left:30px}#hero{padding-top:80px}#docs #hero h1,#docs #hero h5{padding-left:20px;padding-right:20px}#vendorStrip{height:88px;line-height:88px;font-size:16px}p{font-size:16px;line-height:24px;letter-spacing:.1px}h1{font-size:36px;line-height:44px}h3{font-size:28px;line-height:36px}h4{font-size:24px;line-height:40px}#home #viewDocs,#home #tryKubernetes{display:inline-block}#vendorStrip{display:block;text-align:center}#vendorStrip img{max-height:24px;vertical-align:middle;margin:0 30px}#docs #vendorStrip li a{font-size:1em;font-weight:normal}#docs #vendorStrip li li+li{margin-left:60px}#oceanNodes h3{text-align:left;margin-bottom:18px}#oceanNodes main{position:relative;clear:both;display:table;height:160px}#oceanNodes main .content{display:table-cell;position:relative;vertical-align:middle}#oceanNodes main .image-wrapper{position:absolute;top:50%;max-width:25%;max-height:100%;transform:translateY(-50%)}#oceanNodes main:nth-child(odd){padding-right:210px}#oceanNodes main:nth-child(odd) .image-wrapper{right:0}#oceanNodes main:nth-child(even){padding-left:210px}#oceanNodes main:nth-child(even) .image-wrapper{left:0}#oceanNodes main:nth-child(1){padding-right:0}#oceanNodes main:nth-child(1) h3,#oceanNodes main:nth-child(1) p{text-align:center}#oceanNodes main:nth-child(1) .image-wrapper{position:relative;display:block;float:none;max-width:100%;transform:none}#oceanNodes main:nth-child(1) .content{display:block}#oceanNodes main img{width:100%}#video{height:400px;display:block}#video>.light-text{display:block}#mobileShowVideoButton{display:none}#features{padding-bottom:60px}#features .feature-box{margin-bottom:30px}#features .feature-box:last-child{margin-bottom:0}#features h3{margin-bottom:40px}#features .feature-box>div{width:45%;margin-bottom:0}#talkToUs #bigSocial div{width:calc(50% - 15px)}#talkToUs #bigSocial div+div{margin-top:0}#talkToUs #bigSocial div:nth-child(2){margin-left:20px}#talkToUs #bigSocial div:nth-child(3){margin-top:20px}#talkToUs #bigSocial div:nth-child(4){margin-top:20px;margin-left:20px}#talkToUs #bigSocial a{display:inline-block;color:#3371e3;font-weight:400;text-decoration:none}footer nav{text-align:center}footer nav a{width:30%;padding:0 20px}footer .social{text-align:center}footer .social div{display:inline-block}footer .social div:last-child{display:block;margin:0}footer .social span{display:inline-block;margin-right:10px}footer .social input{text-align:left}#home #caseStudiesWrapper div{width:48%}}@media screen and (min-width: 1025px){#hamburger{display:none}ul.global-nav{display:inline-block}#docs #vendorStrip #searchBox:before{top:15px}#vendorStrip{height:44px;line-height:44px}#vendorStrip li a.YAH:after{content:"";display:block;position:absolute;left:0;bottom:0;width:100%;height:4px;background-color:#3371e3}#vendorStrip #searchBox{float:right}#home #hero #vendorStrip{display:block}#docs #hero h1,#docs #hero h5{text-align:left}#docs #hero #vendorStrip ul{float:left}#docs #hero #vendorStrip #searchBox{float:right;width:250px}#docs #hero #vendorStrip #search{vertical-align:middle}#docs .flyout-button{display:none}#docs .logo{position:relative;float:left;display:block;width:180px;height:88px;top:0;left:0;transform:none;background-image:url(../images/nav_logo.svg)}#docs.flip-nav .logo,#docs.open-nav .logo{background-image:url(../images/nav_logo2.svg)}#encyclopedia{padding:50px 50px 100px 100px;clear:both}#docsToc{position:relative;float:left;padding:0 20px;left:0;width:350px;z-index:auto}#docsToc .push-menu-close-button{display:none}#docsContent{width:calc(100% - 400px)}#docsContent #editPageButton{right:-25px}section main,header main,footer main{max-width:1200px}header,#vendorStrip,#encyclopedia,#hero h1,#hero h5,#docs #hero h1,#docs #hero h5,#community #hero h1,.gridPage #hero h1,#community #hero h5,.gridPage #hero h5{padding-left:100px;padding-right:100px}#vendorStrip{padding-right:10px}#home section main,#home header main,#home footer main{max-width:1000px}#oceanNodes main{position:relative;max-width:830px}#oceanNodes main:nth-child(1){max-width:1000px;padding-right:475px}#oceanNodes main:nth-child(1) h3,#oceanNodes main:nth-child(1) p{text-align:left}#oceanNodes main:nth-child(1) .image-wrapper{position:absolute;max-width:48%;transform:translateY(-50%)}#oceanNodes main:nth-child(1) .image-wrapper img{max-width:425px}#video{height:550px;position:relative;background-position:center center;background-size:cover}#talkToUs h4 br{display:block}#talkToUs #bigSocial div{width:calc(25% - 18px)}#talkToUs #bigSocial div+div{margin-left:20px}footer{width:100%;background-image:url(../images/texture.png);background-color:#303030}footer main{padding:20px 0}footer nav{overflow:hidden;margin-bottom:20px}footer nav a{width:16.65%;float:left;font-size:24px;font-weight:300;white-space:nowrap}footer .social{padding:0 30px;max-width:1200px}footer .social div{float:left}footer .social div:last-child{float:right}#search,#wishField{background-color:transparent;padding:10px;font-size:16px;font-weight:100;color:#fff;border:1px solid #fff;transition:.3s}#search:focus,#wishField:focus{background-color:#f7f7f7;color:#303030}.social a{display:inline-block;background-image:url(../images/social_sprite.png);background-repeat:no-repeat;background-size:auto;width:50px;height:50px;border-radius:5px;margin-right:10px}.social a:hover{background-color:#fff}.social a span{position:absolute;display:block;height:0;overflow:hidden}a.twitter{background-position:0 0}a.twitter:hover{background-position:0 100%}a.stack-overflow{background-position:-50px 0}a.stack-overflow:hover{background-position:-50px 100%}a.slack{background-position:-100px 0}a.slack:hover{background-position:-100px 100%}a.github{background-position:-150px 0}a.github:hover{background-position:-150px 100%}a.mailing-list{background-position:-200px 0}a.mailing-list:hover{background-position:-200px 100%}a.calendar{background-position:-250px 0}a.calendar:hover{background-position:-250px 100%}#community #hero,.gridPage #hero{text-align:left}#community #hero h1,.gridPage #hero h1{padding:20px 100px}#community #tryKubernetes,.gridPage #tryKubernetes{width:auto;background-color:#3371e3;padding:0 20px}#bigSocial div{width:calc(25% - 18px)}#home #caseStudiesWrapper div{width:24%;min-height:260px}}@media screen and (min-width: 1300px){#vendorStrip{padding-right:100px}}@media screen and (min-width: 456px){#vendorStrip li+li{margin-left:20px}} +/*# sourceMappingURL=case-study-styles.css.map */ diff --git a/static/css/styles.css b/static/css/styles.css index 641c0c581b..4e0b2a1e06 100644 --- a/static/css/styles.css +++ b/static/css/styles.css @@ -1,1947 +1,2 @@ -html, body { - margin: 0; - padding: 0; } - -input, button { - outline: none; } - -button { - cursor: pointer; } - -ul, li { - list-style: none; } - -ul { - margin: 0; - padding: 0; } - -a { - text-decoration: none; } - -.clear { - display: block; - clear: both; } - -.light-text { - color: white; } - -.right { - float: right; } - -.left { - float: left; } - -.center { - text-align: center; } - -*, .button { - box-sizing: border-box; - font-family: "Roboto", sans-serif; - background: none; - margin: 0; - border: 0; } - -body { - font-family: "Roboto", sans-serif; } - -h1, h2, h5, p { - font-weight: 300; } - -h3, h4 { - font-weight: 400; } - -html, body { - margin: 0; - padding: 0; } - -input, button { - outline: none; } - -button { - cursor: pointer; } - -ul, li { - list-style: none; } - -ul { - margin: 0; - padding: 0; } - -a { - text-decoration: none; } - -.clear { - display: block; - clear: both; } - -.light-text { - color: white; } - -.right { - float: right; } - -.left { - float: left; } - -.center { - text-align: center; } - -h1 { - font-size: 32px; - line-height: 40px; } - -h2 { - font-size: 28px; - line-height: 60px; } - -h3 { - font-size: 24px; - line-height: 32px; } - -h4 { - font-size: 20px; - line-height: 40px; } - -h5 { - font-size: 16px; - line-height: 36px; } - -p { - font-size: 14px; - line-height: 22px; } - -section, header, #vendorStrip { - padding-left: 20px; - padding-right: 20px; } - section main, header main, #vendorStrip main { - width: 100%; - max-width: 100%; } - -header { - height: 80px; } - -.nav-buttons { - height: 80px; - line-height: 80px; } - .nav-buttons .button + * { - margin-left: 30px; } - -#hamburger { - width: 50px; - height: 50px; } - -#mainNav { - padding: 140px 0 30px; } - #mainNav h5 { - margin-bottom: 1em; } - #mainNav h3 { - margin-bottom: 0.6em; } - #mainNav .nav-box { - width: 20%; } - #mainNav .nav-box + .nav-box { - margin-left: calc(20% / 3); } - #mainNav main + main { - margin-top: 60px; } - #mainNav .left .button { - height: 50px; - line-height: 50px; - font-size: 18px; } - -.open-nav #tryKubernetes, .y-enough #tryKubernetes { - margin-left: 30px; } - -#hero { - padding-top: 80px; } - -#docs #hero h1, #docs #hero h5 { - padding-left: 20px; - padding-right: 20px; } - -#vendorStrip { - height: 88px; - line-height: 88px; - font-size: 16px; } - -body { - background-color: white; } - -section { - position: relative; - background-color: white; } - -section main, header main, footer main { - position: relative; - margin: auto; } - -p { - font-size: 14px; - font-weight: 400; } - -.button { - display: inline-block; - border-radius: 6px; - padding: 0 20px; - line-height: 40px; - color: white; - background-color: #3371e3; - text-decoration: none; } - -#cellophane { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - display: none; } - -header { - position: fixed; - top: 0; - left: 0; - width: 100%; - z-index: 8888; - background-color: transparent; - box-shadow: 0 0 0 transparent; - overflow: hidden; - transition: 0.3s; - text-align: center; } - -.logo { - position: relative; - float: left; - display: block; - width: 180px; - height: 88px; - top: 0; - left: 0; - transform: none; - background-image: url(/images/nav_logo.svg); - background-size: contain; - background-position: center center; - background-repeat: no-repeat; } - -#docs .flyout-button { - position: fixed; - top: 20px; - left: 20px; - width: 50px; - height: 50px; - background-image: url(/images/toc_icon.png); - background-position: center center; - background-repeat: no-repeat; - background-size: auto; - border-radius: 50%; - transition: 0.3s; - z-index: 99999; } - -#docs.open-nav .flyout-button { - display: none; } - -#docs .logo { - position: absolute; - top: 40px; - left: 50%; - transform: translate(-50%, -50%); - display: block; - width: 45px; - height: 44px; - background-image: url(/images/favicon.png); } - -#docs.flip-nav .flyout-button { - background-image: url(/images/toc_icon_grey.png); } - -.nav-buttons { - float: right; } - -#viewDocs, #tryKubernetes { - display: none; } - -#viewDocs { - border: 2px solid white; - background-color: transparent; - transition: 0.3s; } - #viewDocs:hover { - background-color: white; - color: #303030; } - -#tryKubernetes { - width: 0; - padding: 0 0; - border: 1px solid transparent; - background-color: transparent; - text-align: center; - white-space: nowrap; - vertical-align: middle; - overflow: hidden; - transition: 0.3s; } - -#hamburger { - display: inline-block; - position: relative; - vertical-align: middle; - padding: 0; - border: 0; - background: none; } - #hamburger div, #hamburger:before, #hamburger:after { - position: absolute; - left: 15%; - width: 70%; - height: 2px; - background-color: #3371e3; - transition: 0.3s; - content: ""; } - #hamburger div { - top: calc(50% - 1px); } - #hamburger:before { - top: 24%; } - #hamburger:after { - bottom: 24%; } - #hamburger:hover div, #hamburger:hover:before, #hamburger:hover:after { - background-color: white; } - -#mainNav h5 { - color: #3371e3; - font-weight: normal; } - -#mainNav main { - white-space: nowrap; - overflow: hidden; - clear: both; } - -#mainNav .nav-box { - float: left; - white-space: normal; } - -#mainNav h3 a { - color: #3371e3; - text-decoration: none; } - -ul.global-nav { - display: none; } - ul.global-nav li { - display: inline-block; - margin-right: 14px; } - ul.global-nav li a { - color: #fff; - font-weight: 400; - padding: 0; - position: relative; } - ul.global-nav li a.active:after { - position: absolute; - width: 100%; - height: 2px; - content: ''; - bottom: -4px; - left: 0; - background: #fff; } - ul.global-nav li a .ui-icon { - filter: brightness(0) invert(1); } - ul.global-nav li ul { - display: none; - position: fixed; - top: 40px; - text-align: left; } - ul.global-nav li ul li { - display: block; - height: 28px; } - ul.global-nav li ul li a { - background: #303030; - color: #fff; - padding: 7px; } - ul.global-nav li ul li:last-child a { - border-radius: 7px; } - ul.global-nav li:hover ul { - display: block; } - -.flip-nav ul.global-nav li a, .open-nav ul.global-nav li a { - color: #303030; } - .flip-nav ul.global-nav li a .ui-icon, .open-nav ul.global-nav li a .ui-icon { - filter: brightness(0); } - -.flip-nav ul.global-nav li ul li a { - background: #fff; - color: #303030; } - -.flip-nav ul.global-nav li a.active:after, .flip-nav ul.global-nav li ul li a.active:after, .open-nav ul.global-nav li a.active:after { - background: #3371e3; } - -.flip-nav header { - background-color: white; } - -.open-nav body { - overflow: hidden; } - -.open-nav #cellophane { - display: block; - z-index: 9998; } - -.open-nav header { - background-color: #e8e8e8; - z-index: 9999; } - -.open-nav #hamburger div { - opacity: 0; } - -.open-nav #hamburger:before, .open-nav #hamburger:after { - left: 12px; - transform-origin: 0 1px; } - -.open-nav #hamburger:before { - transform: rotate(45deg); } - -.open-nav #hamburger:after { - transform: rotate(-45deg); } - -.open-nav #tryKubernetes, .y-enough #tryKubernetes { - width: auto; - padding: 0 20px; - background-color: #3371e3; - border-color: #3371e3; } - -.flip-nav header, .open-nav header { - box-shadow: 0 1px 2px #4c4c4c; } - -.flip-nav #viewDocs, .open-nav #viewDocs { - border-color: #303030; - color: #303030; } - .flip-nav #viewDocs:hover, .open-nav #viewDocs:hover { - border-color: #3371e3; - background-color: #3371e3; - color: white; } - -.flip-nav #hamburger:hover div, .flip-nav #hamburger:hover:before, .flip-nav #hamburger:hover:after, .open-nav #hamburger:hover div, .open-nav #hamburger:hover:before, .open-nav #hamburger:hover:after { - background-color: #303030; } - -#hero { - background-image: url(/images/texture.png); - background-color: #303030; - text-align: center; - padding-left: 0; - padding-right: 0; - margin-bottom: 0; - position: relative; } - #hero.bot-bar:after { - display: block; - margin-bottom: -20px; - height: 8px; - width: 100%; - background-color: rgba(255, 255, 255, 0.1); - content: ''; } - #hero.no-sub h5 { - display: none; } - #hero.no-sub h1 { - margin-bottom: 20px; } - -#home #hero:after { - display: none; } - -#vendorStrip { - position: relative; - background-color: rgba(255, 255, 255, 0.1); - font-weight: 100; - white-space: nowrap; - text-align: center; } - #vendorStrip li a { - color: rgba(255, 255, 255, 0.5); } - #vendorStrip li a.YAH { - color: white; - position: relative; } - -footer { - width: 100%; - background-image: url(/images/texture.png); - background-color: #303030; } - footer main { - padding: 20px 0; } - footer nav a { - width: 100%; - text-align: center; - display: inline-block; - margin: 10px 0; - font-size: 24px; - font-weight: 300; - color: white; - text-decoration: none; } - footer .social { - margin: 20px 0; } - footer .social div { - text-align: center; - margin-bottom: 20px; } - footer .social div:last-child { - margin: 30px 0; } - footer .social span { - display: block; - margin-bottom: 8px; } - footer .social input { - text-align: center; } - -#search, #wishField { - background-color: transparent; - padding: 10px; - font-size: 16px; - font-weight: 100; - color: white; - border: 1px solid white; - transition: 0.3s; } - #search:focus, #wishField:focus { - background-color: #f7f7f7; - color: #303030; } - -.social a { - display: inline-block; - background-image: url(/images/social_sprite.png); - background-repeat: no-repeat; - background-size: auto; - width: 50px; - height: 50px; - border-radius: 5px; - margin-right: 10px; } - .social a:hover { - background-color: #fff; } - .social a span { - position: absolute; - display: block; - height: 0; - overflow: hidden; } - .social a.button { - background-image: none; - width: auto; - height: auto; } - .social a.button:hover { - color: #3371e3; } - -a.twitter { - background-position: 0 0; } - a.twitter:hover { - background-position: 0 100%; } - -a.stack-overflow { - background-position: -50px 0; } - a.stack-overflow:hover { - background-position: -50px 100%; } - -a.slack { - background-position: -100px 0; } - a.slack:hover { - background-position: -100px 100%; } - -a.github { - background-position: -150px 0; } - a.github:hover { - background-position: -150px 100%; } - -a.mailing-list { - background-position: -200px 0; } - a.mailing-list:hover { - background-position: -200px 100%; } - -a.calendar { - background-position: -250px 0; } - a.calendar:hover { - background-position: -250px 100%; } - -#viewDocs { - display: none; } - -section { - background-color: white; } - -#hero { - background-color: #303030; } - #hero h5 { - margin: 20px 0; - line-height: 28px; } - -#vendorStrip { - position: relative; } - #vendorStrip ul { - float: left; } - #vendorStrip li { - display: inline-block; - height: 100%; } - #vendorStrip a { - display: block; - height: 100%; - color: white; - font-size: 0.75em; - font-weight: bold; } - #vendorStrip li + li { - margin-left: 0; } - -#docs #vendorStrip { - line-height: 44px; - max-width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; } - #docs #vendorStrip ul { - float: none; } - #docs #vendorStrip #searchBox { - float: none; - display: block; - width: 80%; - margin: 0 auto; - height: 44px; - line-height: 44px; - position: relative; } - #docs #vendorStrip #searchBox:before { - position: absolute; - width: 15px; - height: 15px; - content: ''; - right: 8px; - top: 7px; - background-image: url(/images/search-icon.svg); - background-repeat: no-repeat; - background-size: 100% 100%; - z-index: 1; } - #docs #vendorStrip #search { - width: 100%; - padding: 0 10px; - height: 30px; - line-height: 30px; - font-size: 16px; - vertical-align: top; - background: #fff; - border: none; - border-radius: 4px; - position: relative; } - -#encyclopedia { - position: relative; - padding: 50px 20px 20px 20px; - overflow: hidden; - font-size: 14px; } - #encyclopedia > div { - height: 100%; } - -#docsToc { - position: fixed; - background-color: white; - top: 0; - left: 0; - width: 0; - height: 100vh; - overflow: hidden; - padding: 50px 0; - z-index: 999999; - transition: 0.3s; } - #docsToc .yah > .title { - background-color: #f7f7f7; - border-left: 3px solid #3371e3; - padding: 7.5px 10px 7.5px 18px; - margin-left: -3px; - color: #3371e3; } - -.open-toc body { - overflow: hidden; } - -.open-toc #docsToc { - padding: 50px 20px; - width: 400px; - max-width: 100vw; - overflow-y: auto; } - -.pi-accordion > .container:first-child > .item:first-child > .title:first-child { - padding-left: 0; - font-size: 1.5em; - font-weight: 700; } - -.pi-accordion > .container:first-child > .item.yah:first-child > .title:first-child { - margin-left: -20px !important; } - -.pi-accordion .item { - overflow: hidden; } - -.pi-accordion .title { - color: #303030; - position: relative; - padding: 7.5px 10px 7.5px 18px; - cursor: pointer; - transition: 0.3s; } - .pi-accordion .title:hover { - color: #3371e3; } - -.pi-accordion a.item > .title { - color: black; } - .pi-accordion a.item > .title:hover { - color: #3371e3; } - -.pi-accordion div.item > .title:before { - content: ""; - position: absolute; - top: 12px; - left: 2px; - border-style: solid; - border-width: 5px 0 5px 8px; - border-color: transparent transparent transparent #3371e3; - transform: rotate(0deg); - transition: 0.3s; } - -.pi-accordion .wrapper { - position: relative; - width: 100%; - transition: height 0.3s; } - -.pi-accordion .content { - padding-left: 20px; - opacity: 0; - transition: 0.3s; } - -.pi-accordion .item.on > .title:before { - transform: rotate(90deg); } - -.pi-accordion .item.on > .wrapper > .content { - opacity: 1; } - -dt { - margin-bottom: 8px; } - -dd { - margin-bottom: 16px; } - -.pi-pushmenu { - display: none; - position: fixed; - top: 0; - width: 100%; - height: 100%; - opacity: 0; - transition: opacity 0.3s; } - .pi-pushmenu.on { - opacity: 1; } - .pi-pushmenu .overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.4); } - .pi-pushmenu .sled { - position: absolute; - top: 0; - width: 0; - height: 100%; - background-color: white; - overflow: auto; - transition: 0.3s; } - .pi-pushmenu.on .sled { - width: 400px; - max-width: 100vw; } - .pi-pushmenu .top-bar { - height: 0; - line-height: 60px; - background-color: #444; } - .pi-pushmenu ul { - margin-top: 25px; } - .pi-pushmenu li { - position: relative; - display: block; - width: 100%; - min-height: 45px; - padding: 0 60px 0 20px; - border-bottom: 1px solid #cccccc; } - .pi-pushmenu a { - display: inline-block; - width: 100%; - height: 45px; - line-height: 45px; - font-family: "Roboto", sans-serif; - font-size: 20px; - color: #3371e3; } - .pi-pushmenu .button { - background: none; - padding: 0; } - .pi-pushmenu ul ul { - padding: 0 20px; } - .pi-pushmenu ul ul li { - min-height: 40px; } - .pi-pushmenu ul ul a { - height: 40px; - line-height: 40px; - font-size: 18px; - color: #555555; } - -.push-menu-close-button { - position: absolute; - top: 0; - right: 0; - width: 50px; - height: 50px; } - .push-menu-close-button:before, .push-menu-close-button:after { - content: ""; - position: absolute; - top: calc(50% - 1px); - left: 25%; - width: 50%; - height: 2px; - background-color: black; } - .push-menu-close-button:before { - transform: rotate(45deg); } - .push-menu-close-button:after { - transform: rotate(-45deg); } - -#docsContent { - position: relative; - float: right; - width: 100%; } - #docsContent * + h2, #docsContent * + h3, #docsContent * + h4, #docsContent * + h5, #docsContent * + h6 { - margin-top: 30px; } - #docsContent h1, #docsContent h2, #docsContent h3, #docsContent h4, #docsContent h5, #docsContent h6 { - line-height: normal; - font-weight: 500; - margin-bottom: 30px; - padding-bottom: 10px; } - #docsContent h1:before, #docsContent h2:before, #docsContent h3:before, #docsContent h4:before, #docsContent h5:before, #docsContent h6:before { - display: block; - content: " "; - margin-top: -100px; - height: 100px; - visibility: hidden; } - #docsContent h1, #docsContent h2 { - border-bottom: 1px solid #cccccc; } - #docsContent h1 { - font-size: 32px; - padding-right: 60px; } - #docsContent h2 { - font-size: 28px; } - #docsContent h3 { - font-size: 24px; - font-weight: 300; - margin-bottom: 5px; } - #docsContent h4 { - font-size: 20px; - margin-bottom: 0px; } - #docsContent h5, #docsContent h6 { - font-size: 16px; - font-weight: 500; } - #docsContent p { - font-size: 16px; - font-weight: 300; - line-height: 1.75em; } - #docsContent p + p { - margin-top: 10px; } - #docsContent code { - display: inline-block; - box-sizing: border-box; - background-color: #f7f7f7; - color: #303030; - font-family: "Roboto Mono", monospace; - vertical-align: baseline; - font-size: 14px; - font-weight: bold; - padding: 2px 4px; } - #docsContent a code { - color: #3371e3; - text-decoration: underline; } - #docsContent pre .pi, #docsContent pre .s { - margin: 0; - padding: 0; } - #docsContent .highlight code span, #docsContent code, #docsContent pre code { - font-family: "Roboto Mono", monospace; } - #docsContent code, #docsContent pre code { - color: #303030; } - #docsContent pre code { - padding: 0; } - #docsContent pre { - background-color: #f7f7f7; - display: block; - margin: 20px 0; - padding: 15px; - position: relative; - overflow-x: auto; } - #docsContent h1 code, #docsContent h2 code, #docsContent h3 code, #docsContent h4 code, #docsContent h5 code, #docsContent h6 code { - font-size: inherit; - background-color: transparent; } - #docsContent .includecode { - table-layout: fixed; } - #docsContent .includecode, #docsContent .includecode th, #docsContent .includecode td { - padding: 0 !important; } - #docsContent .includecode th { - text-align: right !important; - padding: 10px !important; } - #docsContent .includecode th a, #docsContent .includecode th a code { - color: white !important; - background-color: transparent !important; } - #docsContent .includecode pre { - margin: 0 !important; } - #docsContent ul li { - list-style: disc; } - #docsContent ol ul li { - list-style: none; } - #docsContent ol li { - list-style: decimal; } - #docsContent ul, #docsContent ol { - margin: 20px 0; - padding-left: 30px; - font-weight: 300; } - #docsContent ul ul, #docsContent ol ol, #docsContent ul ol, #docsContent ol ul { - margin: 0.75em 0; } - #docsContent li { - margin-bottom: 0.75em; - font-size: 16px; - line-height: 1.75em; } - #docsContent table { - width: 100%; - border: 1px solid #ccc; - border-spacing: 0; - margin-top: 30px; - margin-bottom: 30px; } - #docsContent thead, #docsContent tr:nth-child(even) { - background-color: #f7f7f7; } - #docsContent thead { - background-color: #555; - color: white; } - #docsContent th, #docsContent td { - padding: 8px; - text-align: left; - margin: 0; } - #docsContent th { - font-weight: normal; } - #docsContent td { - font-size: 0.85em; } - #docsContent #editPageButton { - position: absolute; - top: -25px; - right: 5px; - width: 50px; - height: 50px; - line-height: 50px; - border-radius: 50%; - white-space: nowrap; - text-indent: 50px; - overflow: hidden; - background: #3371e3 url(/images/icon-pencil.svg) no-repeat; - background-position: 12px 10px; - background-size: 29px 29px; } - #docsContent #markdown-toc, #docsContent #TableOfContents { - margin-bottom: 20px; } - #docsContent #markdown-toc ul, #docsContent #markdown-toc li, #docsContent #TableOfContents ul, #docsContent #TableOfContents li { - list-style: disc; - color: #3371e3; } - #docsContent #markdown-toc ul, #docsContent #TableOfContents ul { - padding: 0 15px; - margin: 0; } - #docsContent #markdown-toc li, #docsContent #TableOfContents li { - padding: 0; - line-height: 1.5em; - margin-bottom: 0; } - #docsContent #markdown-toc a, #docsContent #TableOfContents a { - position: relative; - color: #3371e3; - font-weight: 700; } - #docsContent img { - max-width: 100%; } - #docsContent #TableOfContents > ul > li { - list-style: none; } - #docsContent #TableOfContents ul, #docsContent #TableOfContents li { - list-style: disk; } - -.fixed footer { - position: fixed; - bottom: 0; } - -#miceType { - clear: both; - font-size: 11px; - line-height: 18px; - color: #aaa; } - -html.search #docsContent { - position: relative; - float: none; - width: 90%; - max-width: 850px; - margin: 0 auto; } - html.search #docsContent #editPageButton { - display: none; } - html.search #docsContent table { - border: 0; - margin-bottom: 0; } - html.search #docsContent td { - padding: 0; } - html.search #docsContent h1 { - margin-bottom: 0; - border-bottom: 0; - padding-bottom: 0; - padding-left: 8px; } - -#home.flip-nav .logo, #home.open-nav .logo { - background-image: url(/images/nav_logo2.svg); } - -#home #hero { - margin-bottom: 0; - padding-bottom: 1px; } - #home #hero main { - padding: 0 10px; - margin-bottom: 30px; } - #home #hero #vendorStrip { - display: none; } - -#oceanNodes { - padding-top: 60px; - padding-bottom: 60px; } - #oceanNodes a { - color: #3371e3; } - #oceanNodes main { - margin-bottom: 60px; - min-height: 160px; } - #oceanNodes .image-wrapper { - max-width: 75%; - margin: 0 auto 20px; - text-align: center; } - #oceanNodes .image-wrapper img { - width: 100%; - max-width: 160px; } - #oceanNodes main:first-child .image-wrapper { - max-width: 100%; } - #oceanNodes main:first-child .image-wrapper img { - max-width: 491px; } - #oceanNodes h3 { - margin-bottom: 30px; } - -#video { - height: 200px; } - -#video { - width: 100%; - position: relative; - background-position: center center; - background-size: cover; } - #video > .light-text { - display: none; - position: absolute; - top: 50%; - left: 75%; - width: 525px; - padding-right: 80px; - transform: translate(-50%, -50%); - color: white; } - #video h2 { - font-size: 32px; - line-height: 44px; - margin-bottom: 20px; } - #video p { - margin-bottom: 20px; } - #video #desktopKCButton { - position: relative; - font-size: 18px; - background-color: #303030; - border-radius: 8px; - color: #ffffff; - padding: 20px 10px 20px 10px; } - #video #desktopShowVideoButton { - position: relative; - font-size: 24px; - background-color: white; - border-radius: 8px; - color: #3371e3; - padding: 15px 30px 15px 80px; - margin-bottom: 15px; } - #video #desktopShowVideoButton:before { - content: ""; - position: absolute; - position: absolute; - top: 50%; - left: 40px; - transform: translate(-50%, -50%); - width: 0; - height: 0; - border-style: solid; - border-width: 10px 0 10px 20px; - border-color: transparent transparent transparent #3371e3; } - #video #mobileShowVideoButton { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 80px; - height: 80px; - border-radius: 50%; - background-color: transparent; - border: 5px solid rgba(255, 255, 255, 0.2); - overflow: visible; } - #video #mobileShowVideoButton:after { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - left: 40px; - content: ""; - width: 0; - height: 0; - border-style: solid; - border-width: 20px 0 20px 30px; - border-color: transparent transparent transparent #ffffff; } - -#videoPlayer { - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - background-color: rgba(0, 0, 0, 0.9); - display: none; } - #videoPlayer iframe { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 80vw; - height: 45vw; - max-width: 142.22222vh; - max-height: 80vh; } - #videoPlayer #closeButton { - position: absolute; - top: 20px; - right: 20px; - width: 50px; - height: 50px; - border: 2px solid transparent; - transition: 0.3s; } - #videoPlayer #closeButton:before, #videoPlayer #closeButton:after { - content: ""; - position: absolute; - top: calc(50% - 1px); - left: 10%; - width: 80%; - height: 2px; - background-color: white; } - #videoPlayer #closeButton:before { - transform: rotate(45deg); } - #videoPlayer #closeButton:after { - transform: rotate(-45deg); } - #videoPlayer #closeButton:hover { - border-color: white; } - -#cncf { - padding-top: 60px; - padding-bottom: 140px; - background-image: url(/images/cncf-color.png); - background-position: center 100px; - background-repeat: no-repeat; - background-size: 300px; } - -#kubeweekly { - background-color: #f7f7f7; - padding-top: 60px; - padding-bottom: 140px; - background-size: auto; - font-family: "Roboto Mono", monospace !important; - font-size: 24px; - font-weight: bold; } - #kubeweekly h5 { - font-size: 20px; } - -.subscribe-button { - border-radius: 6px; - padding: 0 20px; - line-height: 31px; - color: white; - background-color: blue; - text-decoration: none; - font-size: 14px; } - -#features { - padding-top: 140px; - background-color: #f7f7f7; - background-image: url(/images/wheel.png); - background-position: center 60px; - background-repeat: no-repeat; - background-size: auto; } - -.feature-box { - width: 100%; - overflow: hidden; - clear: both; } - .feature-box h4 { - line-height: normal; - margin-bottom: 15px; } - .feature-box > div:first-child { - float: left; } - .feature-box > div:last-child { - float: right; } - -#features h3 { - margin-bottom: 20px; } - -#features .feature-box { - margin-bottom: 0; } - #features .feature-box > div { - width: 100%; - margin-bottom: 40px; } - -#community.open-nav .logo, #community.flip-nav .logo, .gridPage.open-nav .logo, .gridPage.flip-nav .logo { - background-image: url(/images/nav_logo2.svg); } - -#community #hero, .gridPage #hero { - padding-bottom: 20px; } - -#community #mainContent, .gridPage #mainContent { - padding: 20px 0; } - #community #mainContent main, .gridPage #mainContent main { - max-width: none; } - #community #mainContent a, .gridPage #mainContent a { - color: #3371e3; } - #community #mainContent .content, .gridPage #mainContent .content { - margin-bottom: 30px; - padding: 30px 0; } - #community #mainContent .content h1, #community #mainContent .content h2, #community #mainContent .content h3, #community #mainContent .content h4, #community #mainContent .content h5, #community #mainContent .content h6, #community #mainContent .content p, .gridPage #mainContent .content h1, .gridPage #mainContent .content h2, .gridPage #mainContent .content h3, .gridPage #mainContent .content h4, .gridPage #mainContent .content h5, .gridPage #mainContent .content h6, .gridPage #mainContent .content p { - line-height: normal; - max-width: 1200px; - padding: 0 20px; - margin: 0 auto 20px; } - #community #mainContent .content:nth-child(even), .gridPage #mainContent .content:nth-child(even) { - background-color: #f7f7f7; } - #community #mainContent .company-logos, .gridPage #mainContent .company-logos { - text-align: center; - max-width: 1200px; - margin: 0 auto; } - #community #mainContent .company-logos img, .gridPage #mainContent .company-logos img { - width: auto; - margin: 10px; - background-color: #f7f7f7; } - #community #mainContent .partner-logos, .gridPage #mainContent .partner-logos { - text-align: center; - max-width: 1200px; - margin: 0 auto; } - #community #mainContent .partner-logos img, .gridPage #mainContent .partner-logos img { - width: auto; - margin: 10px; - background-color: #ffffff; - box-shadow: 0 5px 5px rgba(0, 0, 0, 0.24), 0 0 5px rgba(0, 0, 0, 0.12); } - #community #mainContent #calendarMeetings, .gridPage #mainContent #calendarMeetings { - position: relative; - width: 80vw; - height: 60vw; - max-width: 1200px; - max-height: 900px; - margin: 20px auto; } - #community #mainContent #calendarEvents, .gridPage #mainContent #calendarEvents { - position: relative; - width: 80vw; - height: 30vw; - max-width: 1200px; - max-height: 450px; - margin: 20px auto; } - #community #mainContent iframe, .gridPage #mainContent iframe { - position: absolute; - border: 0; - width: 100%; - height: 100%; } - -.ui-icon { - display: inline-block !important; } - -#feature-state-dialog-link { - text-decoration: none !important; - padding: 5px !important; } - #feature-state-dialog-link a:visited { - color: #454545 !important; } - #feature-state-dialog-link a code { - display: inline-block !important; - box-sizing: border-box !important; - background-color: #f7f7f7 !important; - color: #303030 !important; - font-family: "Roboto Mono", monospace !important; - vertical-align: baseline !important; - font-size: 14px !important; - font-weight: bold !important; - padding: 0px 4px !important; } - -#feature-state-dialog { - background: #fff !important; - border: 1px solid #ddd !important; - padding: 0.5em 1em !important; } - #feature-state-dialog ul, #feature-state-dialog li { - list-style: disc !important; - margin: 4px 12px !important; } - #feature-state-dialog p { - margin: 8px 0px !important; } - #feature-state-dialog code { - display: inline-block !important; - box-sizing: border-box !important; - background-color: #f7f7f7 !important; - color: #303030 !important; - font-family: "Roboto Mono", monospace !important; - vertical-align: baseline !important; - font-size: 14px !important; - font-weight: bold !important; - padding: 0px 4px !important; } - -.ui-dialog { - background: #f7f7f7 !important; - padding: 0.5em; } - -.ui-dialog-content { - position: relative; - float: right; - width: 100%; } - .ui-dialog-content * + h2, .ui-dialog-content * + h3, .ui-dialog-content * + h4, .ui-dialog-content * + h5, .ui-dialog-content * + h6 { - margin-top: 30px; } - .ui-dialog-content h1, .ui-dialog-content h2, .ui-dialog-content h3, .ui-dialog-content h4, .ui-dialog-content h5, .ui-dialog-content h6 { - line-height: normal; - font-weight: 500; - margin-bottom: 30px; - padding-bottom: 10px; } - .ui-dialog-content h1:before, .ui-dialog-content h2:before, .ui-dialog-content h3:before, .ui-dialog-content h4:before, .ui-dialog-content h5:before, .ui-dialog-content h6:before { - display: block; - content: " "; - margin-top: -100px; - height: 100px; - visibility: hidden; } - .ui-dialog-content h1, .ui-dialog-content h2 { - border-bottom: 1px solid #cccccc; } - .ui-dialog-content h1 { - font-size: 32px; - padding-right: 60px; } - .ui-dialog-content h2 { - font-size: 28px; } - .ui-dialog-content h3 { - font-size: 24px; - font-weight: 300; - margin-bottom: 5px; } - .ui-dialog-content h4 { - font-size: 20px; - margin-bottom: 0px; } - .ui-dialog-content h5, .ui-dialog-content h6 { - font-size: 16px; - font-weight: 500; } - .ui-dialog-content p { - font-size: 16px; - font-weight: 300; - line-height: 1.75em; } - .ui-dialog-content p + p { - margin-top: 10px; } - .ui-dialog-content code { - display: inline-block; - box-sizing: border-box; - background-color: #f7f7f7; - color: #303030; - font-family: "Roboto Mono", monospace; - vertical-align: baseline; - font-size: 14px; - font-weight: bold; - padding: 2px 4px; } - .ui-dialog-content a code { - color: #3371e3; - text-decoration: underline; } - .ui-dialog-content pre .pi, .ui-dialog-content pre .s { - margin: 0; - padding: 0; } - .ui-dialog-content .highlight code span, .ui-dialog-content code, .ui-dialog-content pre code { - font-family: "Roboto Mono", monospace; } - .ui-dialog-content code, .ui-dialog-content pre code { - color: #303030; } - .ui-dialog-content pre code { - padding: 0; } - .ui-dialog-content pre { - background-color: #f7f7f7; - display: block; - margin: 20px 0; - padding: 15px; - position: relative; - overflow-x: auto; } - .ui-dialog-content h1 code, .ui-dialog-content h2 code, .ui-dialog-content h3 code, .ui-dialog-content h4 code, .ui-dialog-content h5 code, .ui-dialog-content h6 code { - font-family: inherit; - font-size: inherit; - background-color: transparent; } - .ui-dialog-content .includecode { - table-layout: fixed; } - .ui-dialog-content .includecode, .ui-dialog-content .includecode th, .ui-dialog-content .includecode td { - padding: 0 !important; } - .ui-dialog-content .includecode th { - text-align: right !important; - padding: 10px !important; } - .ui-dialog-content .includecode th a, .ui-dialog-content .includecode th a code { - color: white !important; - background-color: transparent !important; } - .ui-dialog-content .includecode pre { - margin: 0 !important; } - .ui-dialog-content ul li { - list-style: disc; } - .ui-dialog-content ol li { - list-style: decimal; } - .ui-dialog-content ul, .ui-dialog-content ol { - margin: 20px 0; - padding-left: 30px; - font-weight: 300; } - .ui-dialog-content ul ul, .ui-dialog-content ol ol, .ui-dialog-content ul ol, .ui-dialog-content ol ul { - margin: 0.75em 0; } - .ui-dialog-content li { - margin-bottom: 0.75em; - font-size: 16px; - line-height: 1.75em; } - .ui-dialog-content table { - width: 100%; - border: 1px solid #ccc; - border-spacing: 0; - margin-top: 30px; - margin-bottom: 30px; } - .ui-dialog-content thead, .ui-dialog-content tr:nth-child(even) { - background-color: #f7f7f7; } - .ui-dialog-content thead { - background-color: #555; - color: white; } - .ui-dialog-content th, .ui-dialog-content td { - padding: 8px; - text-align: left; - margin: 0; } - .ui-dialog-content th { - font-weight: normal; } - .ui-dialog-content td { - font-size: 0.85em; } - .ui-dialog-content #editPageButton { - position: absolute; - top: -25px; - right: 5px; - width: 50px; - height: 50px; - line-height: 50px; - border-radius: 50%; - white-space: nowrap; - text-indent: 50px; - overflow: hidden; - background: #3371e3 url(/images/icon-pencil.svg) no-repeat; - background-position: 12px 10px; - background-size: 29px 29px; } - .ui-dialog-content #markdown-toc { - margin-bottom: 20px; } - .ui-dialog-content #markdown-toc ul, .ui-dialog-content #markdown-toc li { - list-style: disc; - color: #3371e3; } - .ui-dialog-content #markdown-toc ul { - padding: 0 15px; - margin: 0; } - .ui-dialog-content #markdown-toc li { - padding: 0; - line-height: 1.5em; - margin-bottom: 0; } - .ui-dialog-content #markdown-toc a { - position: relative; - color: #3371e3; - font-weight: 700; } - .ui-dialog-content img { - max-width: 100%; } - .ui-dialog-content a { - text-decoration: underline; } - -.ui-dialog-buttonpane { - background: #f7f7f7 !important; } - -.ui-widget-header { - background: transparent !important; - background-color: transparent !important; - border: 0px !important; } - -.ui-tabs ul, .ui-tabs ol, .ui-tabs li { - padding: 0px !important; - list-style: none !important; - margin-bottom: 0px !important; - margin-left: 4px !important; } - -.ui-tabs-panel ul li { - list-style: disc !important; } - -.ui-tabs-panel ol li { - list-style: decimal !important; } - -.ui-widget-content { - border: 0px !important; } - .ui-widget-content table { - margin: 0px !important; } - -.ui-tabs .ui-tabs-panel { - border: 1px solid #ccc !important; } - -.ui-tabs-anchor { - text-decoration: none !important; } - -#talkToUs h3, #talkToUs h4 { - text-align: center; } - -#talkToUs h3 { - margin-bottom: 15px; } - -#talkToUs h4 { - line-height: normal; - margin-bottom: 50px; } - #talkToUs h4 br { - display: none; } - -#talkToUs #bigSocial { - overflow: hidden; } - #talkToUs #bigSocial div { - width: 100%; - float: left; - padding: 30px; - padding-top: 110px; - background-position: center top; - background-size: auto; - background-repeat: no-repeat; } - #talkToUs #bigSocial div:nth-child(1) { - background-image: url(/images/twitter_icon.png); } - #talkToUs #bigSocial div:nth-child(2) { - background-image: url(/images/github_icon.png); } - #talkToUs #bigSocial div:nth-child(3) { - background-image: url(/images/slack_icon.png); } - #talkToUs #bigSocial div:nth-child(4) { - background-image: url(/images/stackoverflow_icon.png); } - #talkToUs #bigSocial div + div { - margin-top: 20px; - margin-left: 0; } - #talkToUs #bigSocial a { - display: inline-block; - color: #3371e3; - font-size: 24px; - font-weight: 400; - text-decoration: none; - margin-bottom: 15px; } - #talkToUs #bigSocial a, #talkToUs #bigSocial p { - text-align: center; - width: 100%; } - -#home #talkToUs main { - padding: 30px 0; } - -#home #talkToUs h5 { - font-size: 20px; } - -#home #caseStudiesWrapper { - position: relative; - text-align: center; - margin-bottom: 30px; } - #home #caseStudiesWrapper img { - padding-bottom: 1rem; } - #home #caseStudiesWrapper div { - position: relative; - display: inline-block; - vertical-align: top; - width: 100%; - min-height: 230px; - margin-bottom: 60px; - padding-right: 1rem; - background-position: top center; } - #home #caseStudiesWrapper p { - font-size: 20px; } - #home #caseStudiesWrapper a { - position: absolute; - bottom: -30px; - left: 50%; - transform: translateX(-50%); - color: #3371e3; - font-weight: 400; } - -/* Google Search */ -.cse .gsc-control-cse, .gsc-control-cse { - padding: 0; } - -.gsc-control-cse table, .gsc-control-cse-en table { - margin: 0px !important; } - -.gsc-above-wrapper-area { - border-bottom: 0; } - -/* Bing Search */ -#bing-results-container { - margin-top: 30px; - margin-left: 20px; } - -.bing-result { - margin-bottom: 20px; } - -.bing-result-name a { - font-size: 16px; - color: #0000CC; } - -.bing-result-url { - color: #008000; - font-size: 13px; } - -.bing-result-snippet { - color: #000; - font-size: 11px; } - -#bing-pagination-container { - margin: 10px; - margin-left: 20px; } - -.bing-page-anchor { - text-decoration: none !important; - cursor: pointer; - color: #0000CC; - margin-right: 8px; } - -@media screen and (min-width: 750px) { - h1 { - font-size: 32px; - line-height: 40px; } - h2 { - font-size: 28px; - line-height: 60px; } - h3 { - font-size: 24px; - line-height: 32px; } - h4 { - font-size: 20px; - line-height: 40px; } - h5 { - font-size: 16px; - line-height: 36px; } - p { - font-size: 14px; - line-height: 22px; } - section, header, #vendorStrip { - padding-left: 20px; - padding-right: 20px; } - section main, header main, #vendorStrip main { - width: 100%; - max-width: 100%; } - header { - height: 80px; } - .nav-buttons { - height: 80px; - line-height: 80px; } - .nav-buttons .button + * { - margin-left: 30px; } - #hamburger { - width: 50px; - height: 50px; } - #mainNav { - padding: 140px 0 30px; } - #mainNav h5 { - margin-bottom: 1em; } - #mainNav h3 { - margin-bottom: 0.6em; } - #mainNav .nav-box { - width: 20%; } - #mainNav .nav-box + .nav-box { - margin-left: calc(20% / 3); } - #mainNav main + main { - margin-top: 60px; } - #mainNav .left .button { - height: 50px; - line-height: 50px; - font-size: 18px; } - .open-nav #tryKubernetes, .y-enough #tryKubernetes { - margin-left: 30px; } - #hero { - padding-top: 80px; } - #docs #hero h1, #docs #hero h5 { - padding-left: 20px; - padding-right: 20px; } - #vendorStrip { - height: 88px; - line-height: 88px; - font-size: 16px; } - p { - font-size: 16px; - line-height: 24px; - letter-spacing: 0.1px; } - h1 { - font-size: 36px; - line-height: 44px; } - h3 { - font-size: 28px; - line-height: 36px; } - h4 { - font-size: 24px; - line-height: 40px; } - #home #viewDocs, #home #tryKubernetes { - display: inline-block; } - #vendorStrip { - display: block; - text-align: center; } - #vendorStrip img { - max-height: 24px; - vertical-align: middle; - margin: 0 30px; } - #docs #vendorStrip li a { - font-size: 1em; - font-weight: normal; } - #docs #vendorStrip li li + li { - margin-left: 60px; } - #oceanNodes h3 { - text-align: left; - margin-bottom: 18px; } - #oceanNodes main { - position: relative; - clear: both; - display: table; - height: 160px; } - #oceanNodes main .content { - display: table-cell; - position: relative; - vertical-align: middle; } - #oceanNodes main .image-wrapper { - position: absolute; - top: 50%; - max-width: 25%; - max-height: 100%; - transform: translateY(-50%); } - #oceanNodes main:nth-child(odd) { - padding-right: 210px; } - #oceanNodes main:nth-child(odd) .image-wrapper { - right: 0; } - #oceanNodes main:nth-child(even) { - padding-left: 210px; } - #oceanNodes main:nth-child(even) .image-wrapper { - left: 0; } - #oceanNodes main:nth-child(1) { - padding-right: 0; } - #oceanNodes main:nth-child(1) h3, #oceanNodes main:nth-child(1) p { - text-align: center; } - #oceanNodes main:nth-child(1) .image-wrapper { - position: relative; - display: block; - float: none; - max-width: 100%; - transform: none; } - #oceanNodes main:nth-child(1) .content { - display: block; } - #oceanNodes main img { - width: 100%; } - #video { - height: 400px; - display: block; } - #video > .light-text { - display: block; } - #mobileShowVideoButton { - display: none; } - #features { - padding-bottom: 60px; } - #features .feature-box { - margin-bottom: 30px; } - #features .feature-box:last-child { - margin-bottom: 0; } - #features h3 { - margin-bottom: 40px; } - #features .feature-box > div { - width: 45%; - margin-bottom: 0; } - #talkToUs #bigSocial div { - width: calc(50% - 15px); } - #talkToUs #bigSocial div + div { - margin-top: 0; } - #talkToUs #bigSocial div:nth-child(2) { - margin-left: 20px; } - #talkToUs #bigSocial div:nth-child(3) { - margin-top: 20px; } - #talkToUs #bigSocial div:nth-child(4) { - margin-top: 20px; - margin-left: 20px; } - #talkToUs #bigSocial a { - display: inline-block; - color: #3371e3; - font-weight: 400; - text-decoration: none; } - footer nav { - text-align: center; } - footer nav a { - width: 30%; - padding: 0 20px; } - footer .social { - text-align: center; } - footer .social div { - display: inline-block; } - footer .social div:last-child { - display: block; - margin: 0; } - footer .social span { - display: inline-block; - margin-right: 10px; } - footer .social input { - text-align: left; } - #home #caseStudiesWrapper div { - width: 48%; } } - -@media screen and (min-width: 1025px) { - #hamburger { - display: none; } - ul.global-nav { - display: inline-block; } - #docs #vendorStrip #searchBox:before { - top: 15px; } - #vendorStrip { - height: 44px; - line-height: 44px; } - #vendorStrip li a.YAH:after { - content: ""; - display: block; - position: absolute; - left: 0; - bottom: 0; - width: 100%; - height: 4px; - background-color: #3371e3; } - #vendorStrip #searchBox { - float: right; } - #home #hero #vendorStrip { - display: block; } - #docs #hero h1, #docs #hero h5 { - text-align: left; } - #docs #hero #vendorStrip ul { - float: left; } - #docs #hero #vendorStrip #searchBox { - float: right; - width: 250px; } - #docs #hero #vendorStrip #search { - vertical-align: middle; } - #docs .flyout-button { - display: none; } - #docs .logo { - position: relative; - float: left; - display: block; - width: 180px; - height: 88px; - top: 0; - left: 0; - transform: none; - background-image: url(../images/nav_logo.svg); } - #docs.flip-nav .logo, #docs.open-nav .logo { - background-image: url(../images/nav_logo2.svg); } - #encyclopedia { - padding: 50px 50px 100px 100px; - clear: both; } - #docsToc { - position: relative; - float: left; - padding: 0 20px; - left: 0; - width: 350px; - z-index: auto; } - #docsToc .push-menu-close-button { - display: none; } - #docsContent { - width: calc(100% - 400px); } - #docsContent #editPageButton { - right: -25px; } - section main, header main, footer main { - max-width: 1200px; } - header, #vendorStrip, #encyclopedia, #hero h1, #hero h5, #docs #hero h1, #docs #hero h5, - #community #hero h1, .gridPage #hero h1, #community #hero h5, .gridPage #hero h5 { - padding-left: 100px; - padding-right: 100px; } - #vendorStrip { - padding-right: 10px; } - #home section main, #home header main, #home footer main { - max-width: 1000px; } - #oceanNodes main { - position: relative; - max-width: 830px; } - #oceanNodes main:nth-child(1) { - max-width: 1000px; - padding-right: 475px; } - #oceanNodes main:nth-child(1) h3, #oceanNodes main:nth-child(1) p { - text-align: left; } - #oceanNodes main:nth-child(1) .image-wrapper { - position: absolute; - max-width: 48%; - transform: translateY(-50%); } - #oceanNodes main:nth-child(1) .image-wrapper img { - max-width: 425px; } - #video { - height: 550px; - position: relative; - background-position: center center; - background-size: cover; } - #talkToUs h4 br { - display: block; } - #talkToUs #bigSocial div { - width: calc(25% - 18px); } - #talkToUs #bigSocial div + div { - margin-left: 20px; } - footer { - width: 100%; - background-image: url(../images/texture.png); - background-color: #303030; } - footer main { - padding: 20px 0; } - footer nav { - overflow: hidden; - margin-bottom: 20px; } - footer nav a { - width: 16.65%; - float: left; - font-size: 24px; - font-weight: 300; - white-space: nowrap; } - footer .social { - padding: 0 30px; - max-width: 1200px; } - footer .social div { - float: left; } - footer .social div:last-child { - float: right; } - #search, #wishField { - background-color: transparent; - padding: 10px; - font-size: 16px; - font-weight: 100; - color: white; - border: 1px solid white; - transition: 0.3s; } - #search:focus, #wishField:focus { - background-color: #f7f7f7; - color: #303030; } - .social a { - display: inline-block; - background-image: url(../images/social_sprite.png); - background-repeat: no-repeat; - background-size: auto; - width: 50px; - height: 50px; - border-radius: 5px; - margin-right: 10px; } - .social a:hover { - background-color: #fff; } - .social a span { - position: absolute; - display: block; - height: 0; - overflow: hidden; } - a.twitter { - background-position: 0 0; } - a.twitter:hover { - background-position: 0 100%; } - a.stack-overflow { - background-position: -50px 0; } - a.stack-overflow:hover { - background-position: -50px 100%; } - a.slack { - background-position: -100px 0; } - a.slack:hover { - background-position: -100px 100%; } - a.github { - background-position: -150px 0; } - a.github:hover { - background-position: -150px 100%; } - a.mailing-list { - background-position: -200px 0; } - a.mailing-list:hover { - background-position: -200px 100%; } - a.calendar { - background-position: -250px 0; } - a.calendar:hover { - background-position: -250px 100%; } - #community #hero, .gridPage #hero { - text-align: left; } - #community #hero h1, .gridPage #hero h1 { - padding: 20px 100px; } - #community #tryKubernetes, .gridPage #tryKubernetes { - width: auto; - background-color: #3371e3; - padding: 0 20px; } - #bigSocial div { - width: calc(25% - 18px); } - #home #caseStudiesWrapper div { - width: 24%; - min-height: 260px; } } - -@media screen and (min-width: 1300px) { - #vendorStrip { - padding-right: 100px; } } - -@media screen and (min-width: 456px) { - #vendorStrip li + li { - margin-left: 20px; } } +html,body{margin:0;padding:0}input,button{outline:none}button{cursor:pointer}ul,li{list-style:none}ul{margin:0;padding:0}a{text-decoration:none}.clear{display:block;clear:both}.light-text{color:#fff}.right{float:right}.left{float:left}.center{text-align:center}*,.button{box-sizing:border-box;font-family:"Roboto",sans-serif;background:none;margin:0;border:0}body{font-family:"Roboto",sans-serif}h1,h2,h5,p{font-weight:300}h3,h4{font-weight:400}html,body{margin:0;padding:0}input,button{outline:none}button{cursor:pointer}ul,li{list-style:none}ul{margin:0;padding:0}a{text-decoration:none}.clear{display:block;clear:both}.light-text{color:#fff}.right{float:right}.left{float:left}.center{text-align:center}h1{font-size:32px;line-height:40px}h2{font-size:28px;line-height:60px}h3{font-size:24px;line-height:32px}h4{font-size:20px;line-height:40px}h5{font-size:16px;line-height:36px}p{font-size:14px;line-height:22px}section,header,#vendorStrip{padding-left:20px;padding-right:20px}section main,header main,#vendorStrip main{width:100%;max-width:100%}header{height:80px}.nav-buttons{height:80px;line-height:80px}.nav-buttons .button+*{margin-left:30px}#hamburger{width:50px;height:50px}#mainNav{padding:140px 0 30px}#mainNav h5{margin-bottom:1em}#mainNav h3{margin-bottom:.6em}#mainNav .nav-box{width:20%}#mainNav .nav-box+.nav-box{margin-left:calc(20% / 3)}#mainNav main+main{margin-top:60px}#mainNav .left .button{height:50px;line-height:50px;font-size:18px}.open-nav #tryKubernetes,.y-enough #tryKubernetes{margin-left:30px}#hero{padding-top:80px}#docs #hero h1,#docs #hero h5{padding-left:20px;padding-right:20px}#vendorStrip{height:88px;line-height:88px;font-size:16px}body{background-color:#fff}section{position:relative;background-color:#fff}section main,header main,footer main{position:relative;margin:auto}p{font-size:14px;font-weight:400}.button{display:inline-block;border-radius:6px;padding:0 20px;line-height:40px;color:#fff;background-color:#3371e3;text-decoration:none}#cellophane{position:fixed;top:0;left:0;width:100%;height:100%;display:none}header{position:fixed;top:0;left:0;width:100%;z-index:8888;background-color:transparent;box-shadow:0 0 0 transparent;overflow:hidden;transition:.3s;text-align:center}.logo{position:relative;float:left;display:block;width:180px;height:88px;top:0;left:0;transform:none;background-image:url(/images/nav_logo.svg);background-size:contain;background-position:center center;background-repeat:no-repeat}#docs .flyout-button{position:fixed;top:20px;left:20px;width:50px;height:50px;background-image:url(/images/toc_icon.png);background-position:center center;background-repeat:no-repeat;background-size:auto;border-radius:50%;transition:.3s;z-index:99999}#docs.open-nav .flyout-button{display:none}#docs .logo{position:absolute;top:40px;left:50%;transform:translate(-50%, -50%);display:block;width:45px;height:44px;background-image:url(/images/favicon.png)}#docs.flip-nav .flyout-button{background-image:url(/images/toc_icon_grey.png)}.nav-buttons{float:right}#viewDocs,#tryKubernetes{display:none}#viewDocs{border:2px solid #fff;background-color:transparent;transition:.3s}#viewDocs:hover{background-color:#fff;color:#303030}#tryKubernetes{width:0;padding:0 0;border:1px solid transparent;background-color:transparent;text-align:center;white-space:nowrap;vertical-align:middle;overflow:hidden;transition:.3s}#hamburger{display:inline-block;position:relative;vertical-align:middle;padding:0;border:0;background:none}#hamburger div,#hamburger:before,#hamburger:after{position:absolute;left:15%;width:70%;height:2px;background-color:#3371e3;transition:.3s;content:""}#hamburger div{top:calc(50% - 1px)}#hamburger:before{top:24%}#hamburger:after{bottom:24%}#hamburger:hover div,#hamburger:hover:before,#hamburger:hover:after{background-color:#fff}#mainNav h5{color:#3371e3;font-weight:normal}#mainNav main{white-space:nowrap;overflow:hidden;clear:both}#mainNav .nav-box{float:left;white-space:normal}#mainNav h3 a{color:#3371e3;text-decoration:none}ul.global-nav{display:none}ul.global-nav li{display:inline-block;margin-right:14px}ul.global-nav li a{color:#fff;font-weight:400;padding:0;position:relative}ul.global-nav li a.active:after{position:absolute;width:100%;height:2px;content:"";bottom:-4px;left:0;background:#fff}ul.global-nav li a .ui-icon{filter:brightness(0) invert(1)}ul.global-nav li ul{display:none;position:fixed;top:40px;text-align:left}ul.global-nav li ul li{display:block;height:28px}ul.global-nav li ul li a{background:#303030;color:#fff;padding:7px}ul.global-nav li ul li:last-child a{border-radius:7px}ul.global-nav li:hover ul{display:block}.flip-nav ul.global-nav li a,.open-nav ul.global-nav li a{color:#303030}.flip-nav ul.global-nav li a .ui-icon,.open-nav ul.global-nav li a .ui-icon{filter:brightness(0)}.flip-nav ul.global-nav li ul li a{background:#fff;color:#303030}.flip-nav ul.global-nav li a.active:after,.flip-nav ul.global-nav li ul li a.active:after,.open-nav ul.global-nav li a.active:after{background:#3371e3}.flip-nav header{background-color:#fff}.open-nav body{overflow:hidden}.open-nav #cellophane{display:block;z-index:9998}.open-nav header{background-color:#e8e8e8;z-index:9999}.open-nav #hamburger div{opacity:0}.open-nav #hamburger:before,.open-nav #hamburger:after{left:12px;transform-origin:0 1px}.open-nav #hamburger:before{transform:rotate(45deg)}.open-nav #hamburger:after{transform:rotate(-45deg)}.open-nav #tryKubernetes,.y-enough #tryKubernetes{width:auto;padding:0 20px;background-color:#3371e3;border-color:#3371e3}.flip-nav header,.open-nav header{box-shadow:0 1px 2px #4c4c4c}.flip-nav #viewDocs,.open-nav #viewDocs{border-color:#303030;color:#303030}.flip-nav #viewDocs:hover,.open-nav #viewDocs:hover{border-color:#3371e3;background-color:#3371e3;color:#fff}.flip-nav #hamburger:hover div,.flip-nav #hamburger:hover:before,.flip-nav #hamburger:hover:after,.open-nav #hamburger:hover div,.open-nav #hamburger:hover:before,.open-nav #hamburger:hover:after{background-color:#303030}#hero{background-image:url(/images/texture.png);background-color:#303030;text-align:center;padding-left:0;padding-right:0;margin-bottom:0;position:relative}#hero.bot-bar:after{display:block;margin-bottom:-20px;height:8px;width:100%;background-color:rgba(255,255,255,0.1);content:""}#hero.no-sub h5{display:none}#hero.no-sub h1{margin-bottom:20px}#home #hero:after{display:none}#vendorStrip{position:relative;background-color:rgba(255,255,255,0.1);font-weight:100;white-space:nowrap;text-align:center}#vendorStrip li a{color:rgba(255,255,255,0.5)}#vendorStrip li a.YAH{color:#fff;position:relative}footer{width:100%;background-image:url(/images/texture.png);background-color:#303030}footer main{padding:20px 0}footer nav a{width:100%;text-align:center;display:inline-block;margin:10px 0;font-size:24px;font-weight:300;color:#fff;text-decoration:none}footer .social{margin:20px 0}footer .social div{text-align:center;margin-bottom:20px}footer .social div:last-child{margin:30px 0}footer .social span{display:block;margin-bottom:8px}footer .social input{text-align:center}#search,#wishField{background-color:transparent;padding:10px;font-size:16px;font-weight:100;color:#fff;border:1px solid #fff;transition:.3s}#search:focus,#wishField:focus{background-color:#f7f7f7;color:#303030}.social a{display:inline-block;background-image:url(/images/social_sprite.png);background-repeat:no-repeat;background-size:auto;width:50px;height:50px;border-radius:5px;margin-right:10px}.social a:hover{background-color:#fff}.social a span{position:absolute;display:block;height:0;overflow:hidden}.social a.button{background-image:none;width:auto;height:auto}.social a.button:hover{color:#3371e3}a.twitter{background-position:0 0}a.twitter:hover{background-position:0 100%}a.stack-overflow{background-position:-50px 0}a.stack-overflow:hover{background-position:-50px 100%}a.slack{background-position:-100px 0}a.slack:hover{background-position:-100px 100%}a.github{background-position:-150px 0}a.github:hover{background-position:-150px 100%}a.mailing-list{background-position:-200px 0}a.mailing-list:hover{background-position:-200px 100%}a.calendar{background-position:-250px 0}a.calendar:hover{background-position:-250px 100%}#viewDocs{display:none}section{background-color:#fff}#hero{background-color:#303030}#hero h5{margin:20px 0;line-height:28px}#vendorStrip{position:relative}#vendorStrip ul{float:left}#vendorStrip li{display:inline-block;height:100%}#vendorStrip a{display:block;height:100%;color:#fff;font-size:.75em;font-weight:bold}#vendorStrip li+li{margin-left:0}#docs #vendorStrip{line-height:44px;max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}#docs #vendorStrip ul{float:none}#docs #vendorStrip #searchBox{float:none;display:block;width:80%;margin:0 auto;height:44px;line-height:44px;position:relative}#docs #vendorStrip #searchBox:before{position:absolute;width:15px;height:15px;content:"";right:8px;top:7px;background-image:url(/images/search-icon.svg);background-repeat:no-repeat;background-size:100% 100%;z-index:1}#docs #vendorStrip #search{width:100%;padding:0 10px;height:30px;line-height:30px;font-size:16px;vertical-align:top;background:#fff;border:none;border-radius:4px;position:relative}#encyclopedia{position:relative;padding:50px 20px 20px 20px;overflow:hidden;font-size:14px}#encyclopedia>div{height:100%}#docsToc{position:fixed;background-color:#fff;top:0;left:0;width:0;height:100vh;overflow:hidden;padding:50px 0;z-index:999999;transition:.3s}#docsToc .yah>.title{background-color:#f7f7f7;border-left:3px solid #3371e3;padding:7.5px 10px 7.5px 18px;margin-left:-3px;color:#3371e3}.open-toc body{overflow:hidden}.open-toc #docsToc{padding:50px 20px;width:400px;max-width:100vw;overflow-y:auto}.pi-accordion>.container:first-child>.item:first-child>.title:first-child{padding-left:0;font-size:1.5em;font-weight:700}.pi-accordion>.container:first-child>.item.yah:first-child>.title:first-child{margin-left:-20px !important}.pi-accordion .item{overflow:hidden}.pi-accordion .title{color:#303030;position:relative;padding:7.5px 10px 7.5px 18px;cursor:pointer;transition:.3s}.pi-accordion .title:hover{color:#3371e3}.pi-accordion a.item>.title{color:#000}.pi-accordion a.item>.title:hover{color:#3371e3}.pi-accordion div.item>.title:before{content:"";position:absolute;top:12px;left:2px;border-style:solid;border-width:5px 0 5px 8px;border-color:transparent transparent transparent #3371e3;transform:rotate(0deg);transition:.3s}.pi-accordion .wrapper{position:relative;width:100%;transition:height .3s}.pi-accordion .content{padding-left:20px;opacity:0;transition:.3s}.pi-accordion .item.on>.title:before{transform:rotate(90deg)}.pi-accordion .item.on>.wrapper>.content{opacity:1}dt{margin-bottom:8px}dd{margin-bottom:16px}.pi-pushmenu{display:none;position:fixed;top:0;width:100%;height:100%;opacity:0;transition:opacity .3s}.pi-pushmenu.on{opacity:1}.pi-pushmenu .overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4)}.pi-pushmenu .sled{position:absolute;top:0;width:0;height:100%;background-color:#fff;overflow:auto;transition:.3s}.pi-pushmenu.on .sled{width:400px;max-width:100vw}.pi-pushmenu .top-bar{height:0;line-height:60px;background-color:#444}.pi-pushmenu ul{margin-top:25px}.pi-pushmenu li{position:relative;display:block;width:100%;min-height:45px;padding:0 60px 0 20px;border-bottom:1px solid #ccc}.pi-pushmenu a{display:inline-block;width:100%;height:45px;line-height:45px;font-family:"Roboto",sans-serif;font-size:20px;color:#3371e3}.pi-pushmenu .button{background:none;padding:0}.pi-pushmenu ul ul{padding:0 20px}.pi-pushmenu ul ul li{min-height:40px}.pi-pushmenu ul ul a{height:40px;line-height:40px;font-size:18px;color:#555}.push-menu-close-button{position:absolute;top:0;right:0;width:50px;height:50px}.push-menu-close-button:before,.push-menu-close-button:after{content:"";position:absolute;top:calc(50% - 1px);left:25%;width:50%;height:2px;background-color:#000}.push-menu-close-button:before{transform:rotate(45deg)}.push-menu-close-button:after{transform:rotate(-45deg)}#docsContent{position:relative;float:right;width:100%}#docsContent *+h2,#docsContent *+h3,#docsContent *+h4,#docsContent *+h5,#docsContent *+h6{margin-top:30px}#docsContent h1,#docsContent h2,#docsContent h3,#docsContent h4,#docsContent h5,#docsContent h6{line-height:normal;font-weight:500;margin-bottom:30px;padding-bottom:10px}#docsContent h1:before,#docsContent h2:before,#docsContent h3:before,#docsContent h4:before,#docsContent h5:before,#docsContent h6:before{display:block;content:" ";margin-top:-100px;height:100px;visibility:hidden}#docsContent h1,#docsContent h2{border-bottom:1px solid #ccc}#docsContent h1{font-size:32px;padding-right:60px}#docsContent h2{font-size:28px}#docsContent h3{font-size:24px;font-weight:300;margin-bottom:5px}#docsContent h4{font-size:20px;margin-bottom:0px}#docsContent h5,#docsContent h6{font-size:16px;font-weight:500}#docsContent p{font-size:16px;font-weight:300;line-height:1.75em}#docsContent p+p{margin-top:10px}#docsContent code{display:inline-block;box-sizing:border-box;background-color:#f7f7f7;color:#303030;font-family:"Roboto Mono",monospace;vertical-align:baseline;font-size:14px;font-weight:bold;padding:2px 4px}#docsContent a code{color:#3371e3;text-decoration:underline}#docsContent pre .pi,#docsContent pre .s{margin:0;padding:0}#docsContent .highlight code span,#docsContent code,#docsContent pre code{font-family:"Roboto Mono",monospace}#docsContent code,#docsContent pre code{color:#303030}#docsContent pre code{padding:0}#docsContent pre{background-color:#f7f7f7;display:block;margin:20px 0;padding:15px;position:relative;overflow-x:auto}#docsContent h1 code,#docsContent h2 code,#docsContent h3 code,#docsContent h4 code,#docsContent h5 code,#docsContent h6 code{font-size:inherit;background-color:transparent}#docsContent .includecode{table-layout:fixed}#docsContent .includecode,#docsContent .includecode th,#docsContent .includecode td{padding:0 !important}#docsContent .includecode th{text-align:right !important;padding:10px !important}#docsContent .includecode th a,#docsContent .includecode th a code{color:#fff !important;background-color:transparent !important}#docsContent .includecode pre{margin:0 !important}#docsContent ul li{list-style:disc}#docsContent ol ul li{list-style:disc}#docsContent ol li{list-style:decimal}#docsContent ul,#docsContent ol{margin:20px 0;padding-left:30px;font-weight:300}#docsContent ul ul,#docsContent ol ol,#docsContent ul ol,#docsContent ol ul{margin:.75em 0}#docsContent li{margin-bottom:.75em;font-size:16px;line-height:1.75em}#docsContent table{width:100%;border:1px solid #ccc;border-spacing:0;margin-top:30px;margin-bottom:30px}#docsContent thead,#docsContent tr:nth-child(even){background-color:#f7f7f7}#docsContent thead{background-color:#555;color:#fff}#docsContent th,#docsContent td{padding:8px;text-align:left;margin:0}#docsContent th{font-weight:normal}#docsContent td{font-size:.85em}#docsContent #editPageButton{position:absolute;top:-25px;right:5px;width:50px;height:50px;line-height:50px;border-radius:50%;white-space:nowrap;text-indent:50px;overflow:hidden;background:#3371e3 url(/images/icon-pencil.svg) no-repeat;background-position:12px 10px;background-size:29px 29px}#docsContent #markdown-toc,#docsContent #TableOfContents{margin-bottom:20px}#docsContent #markdown-toc ul,#docsContent #markdown-toc li,#docsContent #TableOfContents ul,#docsContent #TableOfContents li{list-style:disc;color:#3371e3}#docsContent #markdown-toc ul,#docsContent #TableOfContents ul{padding:0 15px;margin:0}#docsContent #markdown-toc li,#docsContent #TableOfContents li{padding:0;line-height:1.5em;margin-bottom:0}#docsContent #markdown-toc a,#docsContent #TableOfContents a{position:relative;color:#3371e3;font-weight:700}#docsContent img{max-width:100%}#docsContent #TableOfContents>ul>li{list-style:none}#docsContent #TableOfContents ul,#docsContent #TableOfContents li{list-style:disk}.fixed footer{position:fixed;bottom:0}#miceType{clear:both;font-size:11px;line-height:18px;color:#aaa}html.search #docsContent{position:relative;float:none;width:90%;max-width:850px;margin:0 auto}html.search #docsContent #editPageButton{display:none}html.search #docsContent table{border:0;margin-bottom:0}html.search #docsContent td{padding:0}html.search #docsContent h1{margin-bottom:0;border-bottom:0;padding-bottom:0;padding-left:8px}#home.flip-nav .logo,#home.open-nav .logo{background-image:url(/images/nav_logo2.svg)}#home #hero{margin-bottom:0;padding-bottom:1px}#home #hero main{padding:0 10px;margin-bottom:30px}#home #hero #vendorStrip{display:none}#oceanNodes{padding-top:60px;padding-bottom:60px}#oceanNodes a{color:#3371e3}#oceanNodes main{margin-bottom:60px;min-height:160px}#oceanNodes .image-wrapper{max-width:75%;margin:0 auto 20px;text-align:center}#oceanNodes .image-wrapper img{width:100%;max-width:160px}#oceanNodes main:first-child .image-wrapper{max-width:100%}#oceanNodes main:first-child .image-wrapper img{max-width:491px}#oceanNodes h3{margin-bottom:30px}#video{height:200px}#video{width:100%;position:relative;background-position:center center;background-size:cover}#video>.light-text{display:none;position:absolute;top:50%;left:75%;width:525px;padding-right:80px;transform:translate(-50%, -50%);color:#fff}#video h2{font-size:32px;line-height:44px;margin-bottom:20px}#video p{margin-bottom:20px}#video #desktopKCButton{position:relative;font-size:18px;background-color:#303030;border-radius:8px;color:#fff;padding:20px 10px 20px 10px}#video #desktopShowVideoButton{position:relative;font-size:24px;background-color:#fff;border-radius:8px;color:#3371e3;padding:15px 30px 15px 80px;margin-bottom:15px}#video #desktopShowVideoButton:before{content:"";position:absolute;position:absolute;top:50%;left:40px;transform:translate(-50%, -50%);width:0;height:0;border-style:solid;border-width:10px 0 10px 20px;border-color:transparent transparent transparent #3371e3}#video #mobileShowVideoButton{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:80px;height:80px;border-radius:50%;background-color:transparent;border:5px solid rgba(255,255,255,0.2);overflow:visible}#video #mobileShowVideoButton:after{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);left:40px;content:"";width:0;height:0;border-style:solid;border-width:20px 0 20px 30px;border-color:transparent transparent transparent #fff}#videoPlayer{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:rgba(0,0,0,0.9);display:none}#videoPlayer iframe{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:80vw;height:45vw;max-width:142.2222222222vh;max-height:80vh}#videoPlayer #closeButton{position:absolute;top:20px;right:20px;width:50px;height:50px;border:2px solid transparent;transition:.3s}#videoPlayer #closeButton:before,#videoPlayer #closeButton:after{content:"";position:absolute;top:calc(50% - 1px);left:10%;width:80%;height:2px;background-color:#fff}#videoPlayer #closeButton:before{transform:rotate(45deg)}#videoPlayer #closeButton:after{transform:rotate(-45deg)}#videoPlayer #closeButton:hover{border-color:#fff}#cncf{padding-top:60px;padding-bottom:140px;background-image:url(/images/cncf-color.png);background-position:center 100px;background-repeat:no-repeat;background-size:300px}#kubeweekly{background-color:#f7f7f7;padding-top:60px;padding-bottom:140px;background-size:auto;font-family:"Roboto Mono",monospace !important;font-size:24px;font-weight:bold}#kubeweekly h5{font-size:20px}.subscribe-button{border-radius:6px;padding:0 20px;line-height:31px;color:#fff;background-color:blue;text-decoration:none;font-size:14px}#features{padding-top:140px;background-color:#f7f7f7;background-image:url(/images/wheel.png);background-position:center 60px;background-repeat:no-repeat;background-size:auto}.feature-box{width:100%;overflow:hidden;clear:both}.feature-box h4{line-height:normal;margin-bottom:15px}.feature-box>div:first-child{float:left}.feature-box>div:last-child{float:right}#features h3{margin-bottom:20px}#features .feature-box{margin-bottom:0}#features .feature-box>div{width:100%;margin-bottom:40px}#community.open-nav .logo,#community.flip-nav .logo,.gridPage.open-nav .logo,.gridPage.flip-nav .logo{background-image:url(/images/nav_logo2.svg)}#community #hero,.gridPage #hero{padding-bottom:20px}#community #mainContent,.gridPage #mainContent{padding:20px 0}#community #mainContent main,.gridPage #mainContent main{max-width:none}#community #mainContent a,.gridPage #mainContent a{color:#3371e3}#community #mainContent .content,.gridPage #mainContent .content{margin-bottom:30px;padding:30px 0}#community #mainContent .content h1,#community #mainContent .content h2,#community #mainContent .content h3,#community #mainContent .content h4,#community #mainContent .content h5,#community #mainContent .content h6,#community #mainContent .content p,.gridPage #mainContent .content h1,.gridPage #mainContent .content h2,.gridPage #mainContent .content h3,.gridPage #mainContent .content h4,.gridPage #mainContent .content h5,.gridPage #mainContent .content h6,.gridPage #mainContent .content p{line-height:normal;max-width:1200px;padding:0 20px;margin:0 auto 20px}#community #mainContent .content:nth-child(even),.gridPage #mainContent .content:nth-child(even){background-color:#f7f7f7}#community #mainContent .company-logos,.gridPage #mainContent .company-logos{text-align:center;max-width:1200px;margin:0 auto}#community #mainContent .company-logos img,.gridPage #mainContent .company-logos img{width:auto;margin:10px;background-color:#f7f7f7}#community #mainContent .partner-logos,.gridPage #mainContent .partner-logos{text-align:center;max-width:1200px;margin:0 auto}#community #mainContent .partner-logos img,.gridPage #mainContent .partner-logos img{width:auto;margin:10px;background-color:#fff;box-shadow:0 5px 5px rgba(0,0,0,0.24),0 0 5px rgba(0,0,0,0.12)}#community #mainContent #calendarMeetings,.gridPage #mainContent #calendarMeetings{position:relative;width:80vw;height:60vw;max-width:1200px;max-height:900px;margin:20px auto}#community #mainContent #calendarEvents,.gridPage #mainContent #calendarEvents{position:relative;width:80vw;height:30vw;max-width:1200px;max-height:450px;margin:20px auto}#community #mainContent iframe,.gridPage #mainContent iframe{position:absolute;border:0;width:100%;height:100%}.ui-icon{display:inline-block !important}#feature-state-dialog-link{text-decoration:none !important;padding:5px !important}#feature-state-dialog-link a:visited{color:#454545 !important}#feature-state-dialog-link a code{display:inline-block !important;box-sizing:border-box !important;background-color:#f7f7f7 !important;color:#303030 !important;font-family:"Roboto Mono",monospace !important;vertical-align:baseline !important;font-size:14px !important;font-weight:bold !important;padding:0px 4px !important}#feature-state-dialog{background:#fff !important;border:1px solid #ddd !important;padding:.5em 1em !important}#feature-state-dialog ul,#feature-state-dialog li{list-style:disc !important;margin:4px 12px !important}#feature-state-dialog p{margin:8px 0px !important}#feature-state-dialog code{display:inline-block !important;box-sizing:border-box !important;background-color:#f7f7f7 !important;color:#303030 !important;font-family:"Roboto Mono",monospace !important;vertical-align:baseline !important;font-size:14px !important;font-weight:bold !important;padding:0px 4px !important}.ui-dialog{background:#f7f7f7 !important;padding:.5em}.ui-dialog-content{position:relative;float:right;width:100%}.ui-dialog-content *+h2,.ui-dialog-content *+h3,.ui-dialog-content *+h4,.ui-dialog-content *+h5,.ui-dialog-content *+h6{margin-top:30px}.ui-dialog-content h1,.ui-dialog-content h2,.ui-dialog-content h3,.ui-dialog-content h4,.ui-dialog-content h5,.ui-dialog-content h6{line-height:normal;font-weight:500;margin-bottom:30px;padding-bottom:10px}.ui-dialog-content h1:before,.ui-dialog-content h2:before,.ui-dialog-content h3:before,.ui-dialog-content h4:before,.ui-dialog-content h5:before,.ui-dialog-content h6:before{display:block;content:" ";margin-top:-100px;height:100px;visibility:hidden}.ui-dialog-content h1,.ui-dialog-content h2{border-bottom:1px solid #ccc}.ui-dialog-content h1{font-size:32px;padding-right:60px}.ui-dialog-content h2{font-size:28px}.ui-dialog-content h3{font-size:24px;font-weight:300;margin-bottom:5px}.ui-dialog-content h4{font-size:20px;margin-bottom:0px}.ui-dialog-content h5,.ui-dialog-content h6{font-size:16px;font-weight:500}.ui-dialog-content p{font-size:16px;font-weight:300;line-height:1.75em}.ui-dialog-content p+p{margin-top:10px}.ui-dialog-content code{display:inline-block;box-sizing:border-box;background-color:#f7f7f7;color:#303030;font-family:"Roboto Mono",monospace;vertical-align:baseline;font-size:14px;font-weight:bold;padding:2px 4px}.ui-dialog-content a code{color:#3371e3;text-decoration:underline}.ui-dialog-content pre .pi,.ui-dialog-content pre .s{margin:0;padding:0}.ui-dialog-content .highlight code span,.ui-dialog-content code,.ui-dialog-content pre code{font-family:"Roboto Mono",monospace}.ui-dialog-content code,.ui-dialog-content pre code{color:#303030}.ui-dialog-content pre code{padding:0}.ui-dialog-content pre{background-color:#f7f7f7;display:block;margin:20px 0;padding:15px;position:relative;overflow-x:auto}.ui-dialog-content h1 code,.ui-dialog-content h2 code,.ui-dialog-content h3 code,.ui-dialog-content h4 code,.ui-dialog-content h5 code,.ui-dialog-content h6 code{font-family:inherit;font-size:inherit;background-color:transparent}.ui-dialog-content .includecode{table-layout:fixed}.ui-dialog-content .includecode,.ui-dialog-content .includecode th,.ui-dialog-content .includecode td{padding:0 !important}.ui-dialog-content .includecode th{text-align:right !important;padding:10px !important}.ui-dialog-content .includecode th a,.ui-dialog-content .includecode th a code{color:#fff !important;background-color:transparent !important}.ui-dialog-content .includecode pre{margin:0 !important}.ui-dialog-content ul li{list-style:disc}.ui-dialog-content ol li{list-style:decimal}.ui-dialog-content ul,.ui-dialog-content ol{margin:20px 0;padding-left:30px;font-weight:300}.ui-dialog-content ul ul,.ui-dialog-content ol ol,.ui-dialog-content ul ol,.ui-dialog-content ol ul{margin:.75em 0}.ui-dialog-content li{margin-bottom:.75em;font-size:16px;line-height:1.75em}.ui-dialog-content table{width:100%;border:1px solid #ccc;border-spacing:0;margin-top:30px;margin-bottom:30px}.ui-dialog-content thead,.ui-dialog-content tr:nth-child(even){background-color:#f7f7f7}.ui-dialog-content thead{background-color:#555;color:#fff}.ui-dialog-content th,.ui-dialog-content td{padding:8px;text-align:left;margin:0}.ui-dialog-content th{font-weight:normal}.ui-dialog-content td{font-size:.85em}.ui-dialog-content #editPageButton{position:absolute;top:-25px;right:5px;width:50px;height:50px;line-height:50px;border-radius:50%;white-space:nowrap;text-indent:50px;overflow:hidden;background:#3371e3 url(/images/icon-pencil.svg) no-repeat;background-position:12px 10px;background-size:29px 29px}.ui-dialog-content #markdown-toc{margin-bottom:20px}.ui-dialog-content #markdown-toc ul,.ui-dialog-content #markdown-toc li{list-style:disc;color:#3371e3}.ui-dialog-content #markdown-toc ul{padding:0 15px;margin:0}.ui-dialog-content #markdown-toc li{padding:0;line-height:1.5em;margin-bottom:0}.ui-dialog-content #markdown-toc a{position:relative;color:#3371e3;font-weight:700}.ui-dialog-content img{max-width:100%}.ui-dialog-content a{text-decoration:underline}.ui-dialog-buttonpane{background:#f7f7f7 !important}.ui-widget-header{background:transparent !important;background-color:transparent !important;border:0px !important}.ui-tabs ul,.ui-tabs ol,.ui-tabs li{padding:0px !important;list-style:none !important;margin-bottom:0px !important;margin-left:4px !important}.ui-tabs-panel ul li{list-style:disc !important}.ui-tabs-panel ol li{list-style:decimal !important}.ui-widget-content{border:0px !important}.ui-widget-content table{margin:0px !important}.ui-tabs .ui-tabs-panel{border:1px solid #ccc !important}.ui-tabs-anchor{text-decoration:none !important}#talkToUs h3,#talkToUs h4{text-align:center}#talkToUs h3{margin-bottom:15px}#talkToUs h4{line-height:normal;margin-bottom:50px}#talkToUs h4 br{display:none}#talkToUs #bigSocial{overflow:hidden}#talkToUs #bigSocial div{width:100%;float:left;padding:30px;padding-top:110px;background-position:center top;background-size:auto;background-repeat:no-repeat}#talkToUs #bigSocial div:nth-child(1){background-image:url(/images/twitter_icon.png)}#talkToUs #bigSocial div:nth-child(2){background-image:url(/images/github_icon.png)}#talkToUs #bigSocial div:nth-child(3){background-image:url(/images/slack_icon.png)}#talkToUs #bigSocial div:nth-child(4){background-image:url(/images/stackoverflow_icon.png)}#talkToUs #bigSocial div+div{margin-top:20px;margin-left:0}#talkToUs #bigSocial a{display:inline-block;color:#3371e3;font-size:24px;font-weight:400;text-decoration:none;margin-bottom:15px}#talkToUs #bigSocial a,#talkToUs #bigSocial p{text-align:center;width:100%}#home #talkToUs main{padding:30px 0}#home #talkToUs h5{font-size:20px}#home #caseStudiesWrapper{position:relative;text-align:center;margin-bottom:30px}#home #caseStudiesWrapper img{padding-bottom:1rem}#home #caseStudiesWrapper div{position:relative;display:inline-block;vertical-align:top;width:100%;min-height:230px;margin-bottom:60px;padding-right:1rem;background-position:top center}#home #caseStudiesWrapper p{font-size:20px}#home #caseStudiesWrapper a{position:absolute;bottom:-30px;left:50%;transform:translateX(-50%);color:#3371e3;font-weight:400}.cse .gsc-control-cse,.gsc-control-cse{padding:0}.gsc-control-cse table,.gsc-control-cse-en table{margin:0px !important}.gsc-above-wrapper-area{border-bottom:0}#bing-results-container{margin-top:30px;margin-left:20px}.bing-result{margin-bottom:20px}.bing-result-name a{font-size:16px;color:#00c}.bing-result-url{color:green;font-size:13px}.bing-result-snippet{color:#000;font-size:11px}#bing-pagination-container{margin:10px;margin-left:20px}.bing-page-anchor{text-decoration:none !important;cursor:pointer;color:#00c;margin-right:8px}@media screen and (min-width: 750px){h1{font-size:32px;line-height:40px}h2{font-size:28px;line-height:60px}h3{font-size:24px;line-height:32px}h4{font-size:20px;line-height:40px}h5{font-size:16px;line-height:36px}p{font-size:14px;line-height:22px}section,header,#vendorStrip{padding-left:20px;padding-right:20px}section main,header main,#vendorStrip main{width:100%;max-width:100%}header{height:80px}.nav-buttons{height:80px;line-height:80px}.nav-buttons .button+*{margin-left:30px}#hamburger{width:50px;height:50px}#mainNav{padding:140px 0 30px}#mainNav h5{margin-bottom:1em}#mainNav h3{margin-bottom:.6em}#mainNav .nav-box{width:20%}#mainNav .nav-box+.nav-box{margin-left:calc(20% / 3)}#mainNav main+main{margin-top:60px}#mainNav .left .button{height:50px;line-height:50px;font-size:18px}.open-nav #tryKubernetes,.y-enough #tryKubernetes{margin-left:30px}#hero{padding-top:80px}#docs #hero h1,#docs #hero h5{padding-left:20px;padding-right:20px}#vendorStrip{height:88px;line-height:88px;font-size:16px}p{font-size:16px;line-height:24px;letter-spacing:.1px}h1{font-size:36px;line-height:44px}h3{font-size:28px;line-height:36px}h4{font-size:24px;line-height:40px}#home #viewDocs,#home #tryKubernetes{display:inline-block}#vendorStrip{display:block;text-align:center}#vendorStrip img{max-height:24px;vertical-align:middle;margin:0 30px}#docs #vendorStrip li a{font-size:1em;font-weight:normal}#docs #vendorStrip li li+li{margin-left:60px}#oceanNodes h3{text-align:left;margin-bottom:18px}#oceanNodes main{position:relative;clear:both;display:table;height:160px}#oceanNodes main .content{display:table-cell;position:relative;vertical-align:middle}#oceanNodes main .image-wrapper{position:absolute;top:50%;max-width:25%;max-height:100%;transform:translateY(-50%)}#oceanNodes main:nth-child(odd){padding-right:210px}#oceanNodes main:nth-child(odd) .image-wrapper{right:0}#oceanNodes main:nth-child(even){padding-left:210px}#oceanNodes main:nth-child(even) .image-wrapper{left:0}#oceanNodes main:nth-child(1){padding-right:0}#oceanNodes main:nth-child(1) h3,#oceanNodes main:nth-child(1) p{text-align:center}#oceanNodes main:nth-child(1) .image-wrapper{position:relative;display:block;float:none;max-width:100%;transform:none}#oceanNodes main:nth-child(1) .content{display:block}#oceanNodes main img{width:100%}#video{height:400px;display:block}#video>.light-text{display:block}#mobileShowVideoButton{display:none}#features{padding-bottom:60px}#features .feature-box{margin-bottom:30px}#features .feature-box:last-child{margin-bottom:0}#features h3{margin-bottom:40px}#features .feature-box>div{width:45%;margin-bottom:0}#talkToUs #bigSocial div{width:calc(50% - 15px)}#talkToUs #bigSocial div+div{margin-top:0}#talkToUs #bigSocial div:nth-child(2){margin-left:20px}#talkToUs #bigSocial div:nth-child(3){margin-top:20px}#talkToUs #bigSocial div:nth-child(4){margin-top:20px;margin-left:20px}#talkToUs #bigSocial a{display:inline-block;color:#3371e3;font-weight:400;text-decoration:none}footer nav{text-align:center}footer nav a{width:30%;padding:0 20px}footer .social{text-align:center}footer .social div{display:inline-block}footer .social div:last-child{display:block;margin:0}footer .social span{display:inline-block;margin-right:10px}footer .social input{text-align:left}#home #caseStudiesWrapper div{width:48%}}@media screen and (min-width: 1025px){#hamburger{display:none}ul.global-nav{display:inline-block}#docs #vendorStrip #searchBox:before{top:15px}#vendorStrip{height:44px;line-height:44px}#vendorStrip li a.YAH:after{content:"";display:block;position:absolute;left:0;bottom:0;width:100%;height:4px;background-color:#3371e3}#vendorStrip #searchBox{float:right}#home #hero #vendorStrip{display:block}#docs #hero h1,#docs #hero h5{text-align:left}#docs #hero #vendorStrip ul{float:left}#docs #hero #vendorStrip #searchBox{float:right;width:250px}#docs #hero #vendorStrip #search{vertical-align:middle}#docs .flyout-button{display:none}#docs .logo{position:relative;float:left;display:block;width:180px;height:88px;top:0;left:0;transform:none;background-image:url(../images/nav_logo.svg)}#docs.flip-nav .logo,#docs.open-nav .logo{background-image:url(../images/nav_logo2.svg)}#encyclopedia{padding:50px 50px 100px 100px;clear:both}#docsToc{position:relative;float:left;padding:0 20px;left:0;width:350px;z-index:auto}#docsToc .push-menu-close-button{display:none}#docsContent{width:calc(100% - 400px)}#docsContent #editPageButton{right:-25px}section main,header main,footer main{max-width:1200px}header,#vendorStrip,#encyclopedia,#hero h1,#hero h5,#docs #hero h1,#docs #hero h5,#community #hero h1,.gridPage #hero h1,#community #hero h5,.gridPage #hero h5{padding-left:100px;padding-right:100px}#vendorStrip{padding-right:10px}#home section main,#home header main,#home footer main{max-width:1000px}#oceanNodes main{position:relative;max-width:830px}#oceanNodes main:nth-child(1){max-width:1000px;padding-right:475px}#oceanNodes main:nth-child(1) h3,#oceanNodes main:nth-child(1) p{text-align:left}#oceanNodes main:nth-child(1) .image-wrapper{position:absolute;max-width:48%;transform:translateY(-50%)}#oceanNodes main:nth-child(1) .image-wrapper img{max-width:425px}#video{height:550px;position:relative;background-position:center center;background-size:cover}#talkToUs h4 br{display:block}#talkToUs #bigSocial div{width:calc(25% - 18px)}#talkToUs #bigSocial div+div{margin-left:20px}footer{width:100%;background-image:url(../images/texture.png);background-color:#303030}footer main{padding:20px 0}footer nav{overflow:hidden;margin-bottom:20px}footer nav a{width:16.65%;float:left;font-size:24px;font-weight:300;white-space:nowrap}footer .social{padding:0 30px;max-width:1200px}footer .social div{float:left}footer .social div:last-child{float:right}#search,#wishField{background-color:transparent;padding:10px;font-size:16px;font-weight:100;color:#fff;border:1px solid #fff;transition:.3s}#search:focus,#wishField:focus{background-color:#f7f7f7;color:#303030}.social a{display:inline-block;background-image:url(../images/social_sprite.png);background-repeat:no-repeat;background-size:auto;width:50px;height:50px;border-radius:5px;margin-right:10px}.social a:hover{background-color:#fff}.social a span{position:absolute;display:block;height:0;overflow:hidden}a.twitter{background-position:0 0}a.twitter:hover{background-position:0 100%}a.stack-overflow{background-position:-50px 0}a.stack-overflow:hover{background-position:-50px 100%}a.slack{background-position:-100px 0}a.slack:hover{background-position:-100px 100%}a.github{background-position:-150px 0}a.github:hover{background-position:-150px 100%}a.mailing-list{background-position:-200px 0}a.mailing-list:hover{background-position:-200px 100%}a.calendar{background-position:-250px 0}a.calendar:hover{background-position:-250px 100%}#community #hero,.gridPage #hero{text-align:left}#community #hero h1,.gridPage #hero h1{padding:20px 100px}#community #tryKubernetes,.gridPage #tryKubernetes{width:auto;background-color:#3371e3;padding:0 20px}#bigSocial div{width:calc(25% - 18px)}#home #caseStudiesWrapper div{width:24%;min-height:260px}}@media screen and (min-width: 1300px){#vendorStrip{padding-right:100px}}@media screen and (min-width: 456px){#vendorStrip li+li{margin-left:20px}} +/*# sourceMappingURL=styles.css.map */ From a6913a97ab3cd63de164d9dfb6fd1faca5dccb84 Mon Sep 17 00:00:00 2001 From: Zheng Xi Zhou Date: Sat, 17 Nov 2018 16:11:53 +0800 Subject: [PATCH 102/222] Change `ReplicationController` to `ReplicaSets` (#11011) `ReplicaSets` is more recommended for manipulating pods than `ReplicationController`. --- content/zh/docs/concepts/services-networking/service.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/concepts/services-networking/service.md b/content/zh/docs/concepts/services-networking/service.md index 8e873a2ff9..6e9705b221 100644 --- a/content/zh/docs/concepts/services-networking/service.md +++ b/content/zh/docs/concepts/services-networking/service.md @@ -10,7 +10,7 @@ redirect_from: Kubernetes [`Pod`](/docs/user-guide/pods) 鏄湁鐢熷懡鍛ㄦ湡鐨勶紝瀹冧滑鍙互琚垱寤猴紝涔熷彲浠ヨ閿姣侊紝鐒惰屼竴鏃﹁閿姣佺敓鍛藉氨姘歌繙缁撴潫銆 -閫氳繃 [`ReplicationController`](/docs/user-guide/replication-controller) 鑳藉鍔ㄦ佸湴鍒涘缓鍜岄攢姣 `Pod`锛堜緥濡傦紝闇瑕佽繘琛屾墿缂╁锛屾垨鑰呮墽琛 [婊氬姩鍗囩骇](/docs/user-guide/kubectl/v1.7/#rolling-update)锛夈 +閫氳繃 [`ReplicaSets`](/docs/concepts/workloads/controllers/replicaset/) 鑳藉鍔ㄦ佸湴鍒涘缓鍜岄攢姣 `Pod`锛堜緥濡傦紝闇瑕佽繘琛屾墿缂╁锛屾垨鑰呮墽琛 [婊氬姩鍗囩骇](/docs/user-guide/kubectl/v1.7/#rolling-update)锛夈 姣忎釜 `Pod` 閮戒細鑾峰彇瀹冭嚜宸辩殑 IP 鍦板潃锛屽嵆浣胯繖浜 IP 鍦板潃涓嶆绘槸绋冲畾鍙緷璧栫殑銆 杩欎細瀵艰嚧涓涓棶棰橈細鍦 Kubernetes 闆嗙兢涓紝濡傛灉涓缁 `Pod`锛堢О涓 backend锛変负鍏跺畠 `Pod` 锛堢О涓 frontend锛夋彁渚涙湇鍔★紝閭d箞閭d簺 frontend 璇ュ浣曞彂鐜帮紝骞惰繛鎺ュ埌杩欑粍 `Pod` 涓殑鍝簺 backend 鍛紵 From f7ed1eee55bfb03b42e4ae25d12c4dfd7a529d53 Mon Sep 17 00:00:00 2001 From: wangyamei Date: Sun, 18 Nov 2018 09:37:37 +0800 Subject: [PATCH 103/222] delete-stateful-set (#10817) --- .../run-application/delete-stateful-set.md | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 content/zh/docs/tasks/run-application/delete-stateful-set.md diff --git a/content/zh/docs/tasks/run-application/delete-stateful-set.md b/content/zh/docs/tasks/run-application/delete-stateful-set.md new file mode 100644 index 0000000000..11f4ae3f22 --- /dev/null +++ b/content/zh/docs/tasks/run-application/delete-stateful-set.md @@ -0,0 +1,133 @@ +--- +reviewers: +- bprashanth +- erictune +- foxish +- janetkuo +- smarterclayton +title: 鍒犻櫎 StatefulSet +content_template: templates/task +weight: 60 +--- + +{{% capture overview %}} + + +鏈枃浠嬬粛濡備綍鍒犻櫎 StatefulSet銆 + +{{% /capture %}} + +{{% capture prerequisites %}} + + +* 鏈枃鍋囪鍦ㄦ偍鐨勯泦缇や笂宸茬粡杩愯浜嗙敱 StatefulSet 鍒涘缓鐨勫簲鐢ㄣ + +{{% /capture %}} + +{{% capture steps %}} + +## 鍒犻櫎 StatefulSet + + +鎮ㄥ彲浠ュ儚鍒犻櫎 Kubernetes 涓殑鍏朵粬璧勬簮涓鏍峰垹闄 StatefulSet锛氫娇鐢 `kubectl delete` 鍛戒护锛屽苟鎸夋枃浠舵垨鑰呭悕瀛楁寚瀹 StatefulSet銆 + +```shell +kubectl delete -f +``` + +```shell +kubectl delete statefulsets +``` + + +鍒犻櫎 StatefulSet 涔嬪悗锛屾偍鍙兘闇瑕佸崟鐙垹闄ゅ叧鑱旂殑鏃犲ご鏈嶅姟銆 + +```shell +kubectl delete service +``` + + +閫氳繃 kubectl 鍒犻櫎 StatefulSet 浼氬皢鍏剁缉瀹逛负0锛屽洜姝ゅ垹闄ゅ睘浜庡畠鐨勬墍鏈塸ods銆 +濡傛灉鎮ㄥ彧鎯冲垹闄 StatefulSet 鑰屼笉鍒犻櫎 pods锛屼娇鐢 `--cascade=false`銆 + +```shell +kubectl delete -f --cascade=false +``` + + +閫氳繃灏 `--cascade=false` 浼犻掔粰 `kubectl delete`锛屽湪鍒犻櫎 StatefulSet 瀵硅薄涔嬪悗锛孲tatefulSet 绠$悊鐨 pods 浼氳淇濈暀涓嬫潵銆傚鏋 pods 鏈変竴涓爣绛 `app=myapp`锛屽垯鍙互鎸夌収濡備笅鏂瑰紡鍒犻櫎瀹冧滑锛 + +```shell +kubectl delete pods -l app=myapp +``` + +### Persistent Volumes + + +鍒犻櫎 StatefulSet 绠$悊鐨 pods 骞朵笉浼氬垹闄ゅ叧鑱旂殑鍗枫傝繖鏄负浜嗙‘淇濇偍鏈夋満浼氬湪鍒犻櫎鍗蜂箣鍓嶄粠鍗蜂腑澶嶅埗鏁版嵁銆傚湪pods绂诲紑[缁堟鐘舵乚(/docs/concepts/workloads/pods/pod/#termination-of-pods)鍚庡垹闄 PVC 鍙兘浼氳Е鍙戝垹闄ゆ敮鎸佺殑 Persistent Volumes锛屽叿浣撳彇鍐充簬瀛樺偍绫诲拰鍥炴敹绛栫暐銆傚0鏄庡垹闄ゅ悗锛屾偍姘歌繙涓嶅簲璇ュ亣璁捐兘澶熻闂嵎銆 + + +**娉ㄦ剰锛氬垹闄 PVC 鏃惰璋ㄦ厧锛屽洜涓鸿繖鍙兘浼氬鑷存暟鎹涪澶便** + + +### 瀹屽叏鍒犻櫎 StatefulSet + + +瑕佺畝鍗曞湴鍒犻櫎 StatefulSet 涓殑鎵鏈夊唴瀹癸紝鍖呮嫭鍏宠仈鐨 pods锛屾偍鍙兘闇瑕佽繍琛屼竴绯诲垪绫讳技浜庝互涓嬪唴瀹圭殑鍛戒护锛 + +```shell +grace=$(kubectl get pods --template '{{.spec.terminationGracePeriodSeconds}}') +kubectl delete statefulset -l app=myapp +sleep $grace +kubectl delete pvc -l app=myapp + +``` + + +鍦ㄤ笂闈㈢殑渚嬪瓙涓紝pods 鐨勬爣绛句负 `app=myapp`锛涢傚綋鍦版浛鎹㈡偍鑷繁鐨勬爣绛俱 + + +### 寮哄埗鍒犻櫎 StatefulSet 绫诲瀷鐨 pods + + +濡傛灉鎮ㄥ彂鐜 StatefulSet 涓殑鏌愪簺 pods 闀挎椂闂村浜 'Terminating' 鎴栬 'Unknown' 鐘舵侊紝鍒欏彲鑳介渶瑕佹墜鍔ㄥ共棰勪互寮哄埗浠 apiserver 涓垹闄 pods銆傝繖鏄竴椤规綔鍦ㄧ殑鍗遍櫓浠诲姟銆傝缁嗕俊鎭闃呰[鍒犻櫎 StatefulSet 绫诲瀷鐨 Pods](/docs/tasks/manage-stateful-set/delete-pods/)銆 + +{{% /capture %}} + +{{% capture whatsnext %}} + + +浜嗚В鏇村鏈夊叧[寮哄埗鍒犻櫎 StatefulSet 绫诲瀷鐨 Pods](/docs/tasks/run-application/force-delete-stateful-set-pod/)銆 + +{{% /capture %}} + + From 1d9698d079ab192ef4847c50ef2c80371b2c6fe3 Mon Sep 17 00:00:00 2001 From: JoeWrightss <42261994+JoeWrightss@users.noreply.github.com> Date: Sun, 18 Nov 2018 10:20:40 +0800 Subject: [PATCH 104/222] Typo fix "availabe" -> "available" (#11036) fix "availabe" -> "available" in line 13 --- .../_posts/2016-11-00-Bringing-Kubernetes-Support-To-Azure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/blog/_posts/2016-11-00-Bringing-Kubernetes-Support-To-Azure.md b/content/en/blog/_posts/2016-11-00-Bringing-Kubernetes-Support-To-Azure.md index d2a2c935de..a02144b95d 100644 --- a/content/en/blog/_posts/2016-11-00-Bringing-Kubernetes-Support-To-Azure.md +++ b/content/en/blog/_posts/2016-11-00-Bringing-Kubernetes-Support-To-Azure.md @@ -10,7 +10,7 @@ With more than a thousand people coming to [KubeCon](http://events.linuxfoundati Today, Microsoft [announced](https://azure.microsoft.com/en-us/blog/azure-container-service-the-cloud-s-most-open-option-for-containers/) the next step in Kubernetes on Azure: the introduction of Kubernetes as a supported orchestrator in Azure Container Service (ACS). It鈥檚 been really exciting for me to join the ACS team and help build this new addition. The integration of Kubernetes into ACS means that with a few clicks in the Azure portal, or by running a single command in the new python-based Azure command line tool, you will be able to create a fully functional Kubernetes cluster that is integrated with the rest of your Azure resources. -Kubernetes is availabe in public preview in Azure Container Service today. Community participation has always been an important part of the Kubernetes experience. Over the next few months, I hope you鈥檒l join us and provide your feedback on the experience as we bring it to general availability. +Kubernetes is available in public preview in Azure Container Service today. Community participation has always been an important part of the Kubernetes experience. Over the next few months, I hope you鈥檒l join us and provide your feedback on the experience as we bring it to general availability. In the spirit of community, we are also excited to announce a new open source project: [ACS Engine](https://github.com/azure/acs-engine). The goal of ACS Engine is to provide an open, community driven location to develop and share best practices for orchestrating containers on Azure. All of our knowledge of running containers in Azure has been captured in that repository, and we look forward to improving and extending it as we move forward with the community. Going forward, the templates in ACS Engine will be the basis for clusters deployed via the ACS API, and thus community driven improvements, features and more will have a natural path into the Azure Container Service. We鈥檙e excited to invite you to join us in improving ACS. Prior to the creation of ACS Engine, customers with unique requirements not supported by the ACS API needed to maintain variations on our templates. While these differences start small, they grew larger over time as the mainline template was improved and users also iterated their templates. These differences and drift really impact the ability for users to collaborate, since their templates are all different. Without the ability to share and collaborate, it鈥檚 difficult to form a community since every user is siloed in their own variant. From eb2177c1bf49c034e036b957816cd433a0f0d05a Mon Sep 17 00:00:00 2001 From: AdamDang Date: Sun, 18 Nov 2018 18:24:34 +0800 Subject: [PATCH 105/222] zh_trans: add manage-resources/_index.md (#11048) zh_trans: add manage-resources/_index.md --- .../administer-cluster/manage-resources/_index.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 content/zh/docs/tasks/administer-cluster/manage-resources/_index.md diff --git a/content/zh/docs/tasks/administer-cluster/manage-resources/_index.md b/content/zh/docs/tasks/administer-cluster/manage-resources/_index.md new file mode 100644 index 0000000000..cdc4c457a5 --- /dev/null +++ b/content/zh/docs/tasks/administer-cluster/manage-resources/_index.md @@ -0,0 +1,12 @@ + + +--- +title: 绠$悊鍐呭瓨锛孋PU 鍜 API 璧勬簮 +weight: 20 +--- + From a3febf53dc824818e5a7eccace7ffee41543ff50 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Sun, 18 Nov 2018 21:33:46 +0800 Subject: [PATCH 106/222] zh_trans: add configure-pod-container/_index.md zh_trans: add configure-pod-container/_index.md --- .../zh/docs/tasks/configure-pod-container/_index.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 content/zh/docs/tasks/configure-pod-container/_index.md diff --git a/content/zh/docs/tasks/configure-pod-container/_index.md b/content/zh/docs/tasks/configure-pod-container/_index.md new file mode 100644 index 0000000000..2e7dd9a95a --- /dev/null +++ b/content/zh/docs/tasks/configure-pod-container/_index.md @@ -0,0 +1,12 @@ + + +--- +title: "閰嶇疆 Pod 鍜 瀹瑰櫒" +weight: 20 +--- + From cbd79c8609b16fe0c23bede2b76603b60a54a877 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Sun, 18 Nov 2018 21:42:49 +0800 Subject: [PATCH 107/222] zh_trans: add federation/_index.md zh_trans: add federation/_index.md --- content/zh/docs/tasks/federation/_index.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 content/zh/docs/tasks/federation/_index.md diff --git a/content/zh/docs/tasks/federation/_index.md b/content/zh/docs/tasks/federation/_index.md new file mode 100644 index 0000000000..4885914869 --- /dev/null +++ b/content/zh/docs/tasks/federation/_index.md @@ -0,0 +1,12 @@ + + +--- +title: "鑱旈偊 - 鍦ㄥ涓泦缇や笂杩愯涓涓簲鐢" +weight: 120 +--- + From 24990169470488e26e0efba73b561d041d8d0229 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Sun, 18 Nov 2018 21:50:20 +0800 Subject: [PATCH 108/222] zh_trans: add job/_index.md zh_trans: add job/_index.md --- content/zh/docs/tasks/job/_index.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 content/zh/docs/tasks/job/_index.md diff --git a/content/zh/docs/tasks/job/_index.md b/content/zh/docs/tasks/job/_index.md new file mode 100644 index 0000000000..92bcf81909 --- /dev/null +++ b/content/zh/docs/tasks/job/_index.md @@ -0,0 +1,12 @@ + + +--- +title: "杩愯浠诲姟" +weight: 50 +--- + From 608cad5a3361f7562912a11d9cf20e069fc74f76 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Sun, 18 Nov 2018 23:55:45 +0800 Subject: [PATCH 109/222] zh_trans: add automated-tasks-with-cron-jobs.md zh_trans: add job/automated-tasks-with-cron-jobs.md --- .../job/automated-tasks-with-cron-jobs.md | 361 ++++++++++++++++++ 1 file changed, 361 insertions(+) create mode 100644 content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md diff --git a/content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md b/content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md new file mode 100644 index 0000000000..531284e8b3 --- /dev/null +++ b/content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md @@ -0,0 +1,361 @@ + + +--- +reviewers: +- chenopis + +title: 浣跨敤 CronJob 杩愯鑷姩鍖栦换鍔 +content_template: templates/task +weight: 10 +--- + +{{% capture overview %}} + + + +浣犲彲浠ュ埄鐢 [CronJobs](/docs/concepts/workloads/controllers/cron-jobs) 鎵ц鍩轰簬鏃堕棿璋冨害鐨勪换鍔°傝繖浜涜嚜鍔ㄥ寲浠诲姟鍜 Linux 鎴栬 Unix 绯荤粺鐨 [Cron](https://en.wikipedia.org/wiki/Cron) 浠诲姟绫讳技銆 + +CronJobs 鍦ㄥ垱寤哄懆鏈熸т互鍙婇噸澶嶆х殑浠诲姟鏃跺緢鏈夊府鍔╋紝渚嬪鎵ц澶囦唤鎿嶄綔鎴栬呭彂閫侀偖浠躲侰ronJobs涔熷彲浠ュ湪鐗瑰畾鏃堕棿璋冨害鍗曚釜浠诲姟锛屼緥濡備綘鎯宠皟搴︿綆娲昏穬鍛ㄦ湡鐨勪换鍔° + +{{< note >}} + +鍦╜batch/v2alpha1` API 缁勪腑锛 CronJob 璧勬簮浠庨泦缇ょ増鏈1.8寮濮嬪凡缁忚鍘绘帀浜嗐備綘搴旇鍒囨崲鍒癭batch/v1beta1`锛屽湪杩欓噷鐨凙PI 鏈嶅姟鍣ㄤ腑鏄粯璁ゅ紑鍚殑銆傛湰鏂囦腑鐨勬墍鏈夌ず渚嬩娇鐢ㄤ簡`batch/v1beta1`銆 +{{< /note >}} + + + +CronJobs鏈変竴浜涢檺鍒跺拰鐗圭偣銆 +渚嬪锛屽湪鐗瑰畾鐘跺喌涓嬶紝涓涓崟鐙殑cron job鍙互鍒涘缓澶氫釜浠诲姟銆 +鍥犳锛屼换鍔″簲璇ユ槸骞傜瓑鐨勩 +鏌ョ湅鏇村闄愬埗锛岃鍙傝僛CronJobs](/docs/concepts/workloads/controllers/cron-jobs). + +{{% /capture %}} + +{{% capture prerequisites %}} + +* {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + + +* 浣犻渶瑕佷竴涓増鏈 >=1.8 涓斿伐浣滄甯哥殑 Kubernetes 闆嗙兢銆傚浜庢洿鏃╃殑鐗堟湰锛 <1.8 锛夛紝浣犻渶瑕佸API 鏈嶅姟鍣ㄨ缃 `--runtime-config=batch/v2alpha1=true` 鏉ュ紑鍚 `batch/v2alpha1` API锛(鏇村淇℃伅璇锋煡鐪 [涓轰綘鐨勯泦缇ゅ紑鍚垨鍏抽棴 API 鐗堟湰](/docs/admin/cluster-management/#turn-on-or-off-an-api-version-for-your-cluster) +), 鐒跺悗閲嶅惎 API 鏈嶅姟鍣ㄥ拰鎺у埗绠$悊鍣ㄣ + +{{% /capture %}} + +{{% capture steps %}} + + + +## 鍒涘缓 CronJob + +Cron Job闇瑕佷竴涓厤缃枃浠躲 +鏈緥涓 Cron Job 鐨刞.spec` 閰嶇疆鏂囦欢姣忓垎閽熸墦鍗板嚭褰撳墠鏃堕棿鍜屼竴涓棶濂戒俊鎭細 + +{{< codenew file="application/job/cronjob.yaml" >}} + + + +鎯宠杩愯绀轰緥鐨 CronJob锛屽彲浠ヤ笅杞界ず渚嬫枃浠跺苟鎵ц鍛戒护锛 + +```shell +$ kubectl create -f ./cronjob.yaml +cronjob "hello" created +``` + + + +鎴栬呬綘涔熷彲浠ヤ娇鐢 `kubectl run` 鏉ュ垱寤轰竴涓 CronJob 鑰屼笉闇瑕佺紪鍐欏畬鏁寸殑閰嶇疆锛 + +```shell +$ kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster" +cronjob "hello" created +``` + + + +鍒涘缓濂紺ronJob鍚庯紝浣跨敤涓嬮潰鐨勫懡浠ゆ潵鑾峰彇鍏剁姸鎬侊細 + +```shell +$ kubectl get cronjob hello +NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE +hello */1 * * * * False 0 +``` + + + +灏卞儚浣犱粠鍛戒护杩斿洖缁撴灉鐪嬪埌鐨勯偅鏍凤紝CronJob杩樻病鏈夎皟搴︽垨鎵ц浠讳綍浠诲姟銆傚ぇ绾﹂渶瑕佷竴鍒嗛挓浠诲姟鎵嶈兘鍒涘缓濂姐 + +```shell +$ kubectl get jobs --watch +NAME DESIRED SUCCESSFUL AGE +hello-4111706356 1 1 2s +``` + + + +鐜板湪浣犲凡缁忕湅鍒颁簡涓涓繍琛屼腑鐨勪换鍔¤ 鈥渉ello鈥 CronJob璋冨害銆備綘鍙互鍋滄鐩戣杩欎釜浠诲姟锛岀劧鍚庡啀娆℃煡鐪婥ronJob灏辫兘鐪嬪埌瀹冭皟搴︿换鍔★細 + +```shell +$ kubectl get cronjob hello +NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE +hello */1 * * * * False 0 Mon, 29 Aug 2016 14:34:00 -0700 +``` + + + +浣犲簲璇ヨ兘鐪嬪埌 鈥渉ello鈥 CronJob 鍦 `LAST-SCHEDULE` 澹版槑鐨勬椂闂寸偣鎴愬姛鐨勮皟搴︿簡涓娆′换鍔°傛湁0涓椿璺冪殑浠诲姟鎰忓懗鐫浠诲姟鎵ц瀹屾瘯鎴栬繖鎵ц澶辫触銆 + +鐜板湪锛屾壘鍒版渶鍚庝竴娆¤皟搴︿换鍔″垱寤虹殑 Pod 骞舵煡鐪嬩竴涓 Pod 鐨勬爣鍑嗚緭鍑恒傝娉ㄦ剰浠诲姟鍚嶇О鍜 Pod 鍚嶇О鏄笉鍚岀殑銆 + + +```shell +# Replace "hello-4111706356" with the job name in your system +$ pods=$(kubectl get pods --selector=job-name=hello-4111706356 --output=jsonpath={.items..metadata.name}) + +$ echo $pods +hello-4111706356-o9qcm + +$ kubectl logs $pods +Mon Aug 29 21:34:09 UTC 2016 +Hello from the Kubernetes cluster +``` + + + +## 鍒犻櫎 CronJob + +褰撲綘涓嶅啀闇瑕丆ronJob鏃讹紝鍙互鐢 `kubectl delete cronjob` 鍒犳帀瀹冿細 + +```shell +$ kubectl delete cronjob hello +cronjob "hello" deleted +``` + + +鍒犻櫎 CronJob 浼氭竻闄ゅ畠鍒涘缓鐨勬墍鏈変换鍔″拰 Pod锛屽苟闃绘瀹冨垱寤洪澶栫殑浠诲姟銆備綘鍙互鏌ラ槄鍒犻櫎浠诲姟鐨勬洿澶氫俊鎭 [鍨冨溇鏀堕泦](/docs/concepts/workloads/controllers/garbage-collection/)銆 + + + +## 缂栧啓CronJob澹版槑淇℃伅 + +鍍 Kubernetes 鐨勫叾浠栭厤缃竴鏍凤紝CronJob闇瑕 `apiVersion`, `kind`, and `metadata` 鍩熴傞厤缃枃浠剁殑涓鑸俊鎭紝璇峰弬鑰 [閮ㄧ讲搴旂敤](/docs/user-guide/deploying-applications) 鍜 [浣跨敤kubectl绠$悊璧勬簮](/docs/user-guide/working-with-resources). + +CronJob 閰嶇疆涔熼渶瑕佸寘鎷琜`.spec`](https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status). + +{{< note >}} + +瀵笴ronJob鐨勬墍鏈夋敼鍔紝鐗瑰埆鏄畠鐨 `.spec`锛屽彧鏈夊湪涓嬮潰鐨勬墽琛屼腑搴旂敤銆 +{{< /note >}} + + + +### 璋冨害 + +`.spec.schedule` 鏄 `.spec` 闇瑕佺殑鍩熴傚畠浣跨敤浜 [Cron](https://en.wikipedia.org/wiki/Cron) 鏍煎紡涓诧紝渚嬪 `0 * * * *` or `@hourly` 锛屽仛涓哄畠鐨勪换鍔¤鍒涘缓鍜屾墽琛岀殑璋冨害鏃堕棿銆 + + + +璇ユ牸寮忎篃鍖呭惈浜嗘墿灞曠殑 `vixie cron` 姝ラ暱鍊笺俒FreeBSD 鎵嬪唽](https://www.freebsd.org/cgi/man.cgi?crontab%285%29)涓В閲婂涓: + + + +> 姝ラ暱鍙鐢ㄤ簬鑼冨洿缁勫悎銆傝寖鍥村悗闈㈠甫鏈 ``/<鏁板瓧>'' 鍙互澹版槑鑼冨洿鍐呯殑姝ュ箙鏁板笺 +> 渚嬪锛宍`0-23/2'' 鍙鐢ㄥ湪灏忔椂鍩熸潵澹版槑鍛戒护鍦ㄥ叾浠栨暟鍊肩殑灏忔椂鏁版墽琛岋紙 V7 鏍囧噯涓搴旂殑鏂规硶鏄痐`0,2,4,6,8,10,12,14,16,18,20,22''锛夈 +> 姝ラ暱涔熷彲浠ユ斁鍦ㄩ氶厤绗﹀悗闈紝鍥犳濡傛灉浣犳兂琛ㄨ揪 ``姣忎袱灏忔椂''锛屽氨鐢 ``*/2'' 銆 + +{{< note >}} + +璋冨害涓殑闂彿 (`?`) 鍜屾槦鍙 `*` 鍚箟鐩稿悓锛岃〃绀虹粰瀹氬煙鐨勪换浣曞彲鐢ㄥ笺 +{{< /note >}} + + + +### 浠诲姟妯$増 + +`.spec.jobTemplate`鏄换鍔$殑妯$増锛屽畠鏄繀椤荤殑銆傚畠鍜 [Job](/docs/concepts/workloads/controllers/jobs-run-to-completion/)鐨勮娉曞畬鍏ㄤ竴鏍凤紝闄や簡瀹冩槸宓屽鐨勬病鏈 `apiVersion` 鍜 `kind`銆 +缂栧啓浠诲姟鐨 `.spec` 锛岃鍙傝 [缂栧啓浠诲姟鐨凷pec](/docs/concepts/workloads/controllers/jobs-run-to-completion/#writing-a-job-spec)銆 + + + +### 寮濮嬬殑鏈鍚庢湡闄 + +`.spec.startingDeadlineSeconds` 鍩熸槸鍙夌殑銆 +瀹冭〃绀轰换鍔″鏋滅敱浜庢煇绉嶅師鍥犻敊杩囦簡璋冨害鏃堕棿锛屽紑濮嬭浠诲姟鐨勬埅姝㈡椂闂寸殑绉掓暟銆傝繃浜嗘埅姝㈡椂闂达紝CronJob灏变笉浼氬紑濮嬩换鍔° +涓嶆弧瓒宠繖绉嶆渶鍚庢湡闄愮殑浠诲姟浼氳缁熻涓哄け璐ヤ换鍔°傚鏋滆鍩熸病鏈夊0鏄庯紝閭d换鍔″氨娌℃湁鏈鍚庢湡闄愩 + + + +CronJob 鎺у埗鍣ㄤ細缁熻閿欒繃浜嗗灏戞璋冨害銆傚鏋滈敊杩囦簡100娆′互涓婄殑璋冨害锛孋ronJob灏变笉鍐嶈皟搴︿簡銆傚綋娌℃湁璁剧疆 `.spec.startingDeadlineSeconds` 鏃讹紝CronJob鎺у埗鍣ㄧ粺璁′粠`status.lastScheduleTime`鍒板綋鍓嶇殑璋冨害閿欒繃娆℃暟銆 +渚嬪涓涓狢ronJob鏈熸湜姣忓垎閽熸墽琛屼竴娆★紝`status.lastScheduleTime`鏄 5:00am锛屼絾鐜板湪鏄 7:00am銆傞偅鎰忓懗鐫120娆¤皟搴﹁閿欒繃浜嗭紝鎵浠 CronJob灏嗕笉鍐嶈璋冨害銆 +濡傛灉璁剧疆浜 `.spec.startingDeadlineSeconds` 鍩(闈炵┖)锛孋ronJob 鎺у埗鍣ㄧ粺璁′粠 `.spec.startingDeadlineSeconds` 鍒板綋鍓嶆椂闂撮敊杩囦簡澶氬皯娆′换鍔° +渚嬪璁剧疆浜 `200`锛屽畠浼氱粺璁¤繃鍘200绉掑唴閿欒繃浜嗗灏戞璋冨害銆傚湪閭g鎯呭喌涓嬶紝濡傛灉杩囧幓200绉掑唴閿欒繃浜嗚秴杩100娆$殑璋冨害锛孋ronJob灏变笉鍐嶈皟搴︺ + + + +### 閲嶅彔瑙勫垯 + +`.spec.concurrencyPolicy` 涔熸槸鍙夌殑銆傚畠澹版槑浜咰ronJob鍒涘缓鐨勪换鍔¢噸鍙犲彂鐢熸椂濡備綍澶勭悊銆俿pec 浠呰兘澹版槑涓嬪垪瑙勫垯涓殑涓绉嶏細 + +* `Allow` (榛樿)锛欳ronJob鍏佽閲嶅彔鎵ц浠诲姟銆 +* `Forbid`锛 CronJob涓嶅厑璁搁噸鍙犳墽琛屼换鍔★紱濡傛灉鏂颁换鍔$殑鎵ц鏃堕棿鍒颁簡鑰岃佷换鍔℃病鏈夋墽琛屽畬锛孋ronJob浼氬拷鐣ユ柊浠诲姟鐨勬墽琛屻 +* `Replace`锛氬鏋滄柊浠诲姟鐨勬墽琛屾椂闂村埌浜嗚岃佷换鍔℃病鏈夋墽琛屽畬锛孋ronJob浼氱敤鏂颁换鍔℃浛鎹㈠綋鍓嶆鍦ㄨ繍琛岀殑浠诲姟銆 + +璇锋敞鎰忥紝閲嶅彔瑙勫垯浠呴傜敤浜庣浉鍚孋ronJob鍒涘缓鐨勪换鍔°傚鏋滄湁澶氫釜CronJob锛屽畠浠浉搴旂殑浠诲姟鎬绘槸鍏佽閲嶅彔鎵ц鐨勩 + + + +### 鎸傝捣 + +`.spec.suspend`鍩熶篃鏄彲閫夌殑銆傚鏋滆缃负 `true` 锛屽悗缁彂鐢熺殑鎵ц閮戒細鎸傝捣銆傝繖涓缃宸茬粡寮濮嬬殑鎵ц涓嶈捣浣滅敤銆傞粯璁ゆ槸鍏抽棴鐨勩 + +{{< caution >}} + +鍦ㄨ皟搴︽椂闂村唴鎸傝捣鐨勬墽琛岄兘浼氳缁熻涓洪敊杩囩殑浠诲姟銆傚綋 `.spec.suspend` 浠 `true` 鏀逛负 `false` 鏃讹紝涓旀病鏈 [寮濮嬬殑鏈鍚庢湡闄怾(#starting-deadline)锛岄敊杩囩殑浠诲姟浼氳绔嬪嵆璋冨害銆 +{{< /caution >}} + + + +### 浠诲姟鍘嗗彶闄愬埗 + +`.spec.successfulJobsHistoryLimit` 鍜 `.spec.failedJobsHistoryLimit`鏄彲閫夌殑銆 +杩欎袱涓煙澹版槑浜嗘湁澶氬皯鎵ц瀹屾垚鍜屽け璐ョ殑浠诲姟浼氳淇濈暀銆 +榛樿璁剧疆涓3鍜1銆傞檺鍒惰缃负0浠h〃鐩稿簲绫诲瀷鐨勪换鍔″畬鎴愬悗涓嶄細淇濈暀銆 + +{{% /capture %}} From 901441a0ec6a6e954cb79d73b07cb912205aa4ec Mon Sep 17 00:00:00 2001 From: AdamDang Date: Mon, 19 Nov 2018 09:00:52 +0800 Subject: [PATCH 110/222] zh_trans: add inject-data-application/_index.md (#11056) * zh_trans: add inject-data-application/_index.md zh_trans: add inject-data-application/_index.md * Update _index.md --- .../zh/docs/tasks/inject-data-application/_index.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 content/zh/docs/tasks/inject-data-application/_index.md diff --git a/content/zh/docs/tasks/inject-data-application/_index.md b/content/zh/docs/tasks/inject-data-application/_index.md new file mode 100644 index 0000000000..c979d4d97f --- /dev/null +++ b/content/zh/docs/tasks/inject-data-application/_index.md @@ -0,0 +1,13 @@ + + +--- +title: "缁欏簲鐢ㄦ敞鍏ユ暟鎹" +weight: 30 +--- + + From d9550a836a9aaa8bcb831e66419496be95e494a4 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Mon, 19 Nov 2018 09:47:13 +0800 Subject: [PATCH 111/222] zh_trans: add dminister-federation/_index.md (#11051) * zh_trans: add dminister-federation/_index.md zh_trans: add dminister-federation/_index.md * Update _index.md --- .../zh/docs/tasks/administer-federation/_index.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 content/zh/docs/tasks/administer-federation/_index.md diff --git a/content/zh/docs/tasks/administer-federation/_index.md b/content/zh/docs/tasks/administer-federation/_index.md new file mode 100644 index 0000000000..1ab6c7e5d6 --- /dev/null +++ b/content/zh/docs/tasks/administer-federation/_index.md @@ -0,0 +1,12 @@ + + +--- +title: "鑱旈偊锛氬湪澶氫釜闆嗙兢涓婅繍琛屼竴涓簲鐢" +weight: 160 +--- + From c8050aa0d9d6708be2d2e55e18430309e502a94c Mon Sep 17 00:00:00 2001 From: Stig Otnes Kolstad Date: Mon, 19 Nov 2018 03:19:23 +0100 Subject: [PATCH 112/222] Update scratch.md (#11038) The files are automatically extracted after downloading in release v1.12.2. --- content/en/docs/setup/scratch.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/content/en/docs/setup/scratch.md b/content/en/docs/setup/scratch.md index 3068e24865..80b0dbf6ac 100644 --- a/content/en/docs/setup/scratch.md +++ b/content/en/docs/setup/scratch.md @@ -167,10 +167,8 @@ You can use a Kubernetes binary release (recommended) or build your Kubernetes b Download the [latest binary release](https://github.com/kubernetes/kubernetes/releases/latest) and unzip it. Server binary tarballs are no longer included in the Kubernetes final tarball, so you will need to locate and run -`./kubernetes/cluster/get-kube-binaries.sh` to download the client and server binaries. -Then locate `./kubernetes/server/kubernetes-server-linux-amd64.tar.gz` and unzip *that*. -Then, within the second set of unzipped files, locate `./kubernetes/server/bin`, which contains -all the necessary binaries. +`./kubernetes/cluster/get-kube-binaries.sh` to download and extract the client and server binaries. +Then locate `./kubernetes/server/bin`, which contains all the necessary binaries. #### Selecting Images From 4f6f159dcb99f48bf52024c64c8c5be9a8189507 Mon Sep 17 00:00:00 2001 From: Benedikt Franke Date: Mon, 19 Nov 2018 03:26:08 +0100 Subject: [PATCH 113/222] The FlexVolume plugin supports ReadWriteMany depending on the driver (#11014) I was able to successfully use https://github.com/juliohm1978/kubernetes-cifs-volumedriver to mount a SMB share from multiple nodes. The current docs are misleading, as it is generally possible. --- content/en/docs/concepts/storage/persistent-volumes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/storage/persistent-volumes.md b/content/en/docs/concepts/storage/persistent-volumes.md index 227097ba04..fb2e725359 100644 --- a/content/en/docs/concepts/storage/persistent-volumes.md +++ b/content/en/docs/concepts/storage/persistent-volumes.md @@ -335,7 +335,7 @@ In the CLI, the access modes are abbreviated to: | CephFS | ✓ | ✓ | ✓ | | Cinder | ✓ | - | - | | FC | ✓ | ✓ | - | -| Flexvolume | ✓ | ✓ | - | +| Flexvolume | ✓ | ✓ | depends on the driver | | Flocker | ✓ | - | - | | GCEPersistentDisk | ✓ | ✓ | - | | Glusterfs | ✓ | ✓ | ✓ | From 9b1d77e07f874cbce028dcb4b78244aaa54b5169 Mon Sep 17 00:00:00 2001 From: Karen Bradshaw Date: Sun, 18 Nov 2018 21:27:56 -0500 Subject: [PATCH 114/222] clean-up jsonpath additional functions list (#11027) --- content/en/docs/reference/kubectl/jsonpath.md | 58 ++++++++++++------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/content/en/docs/reference/kubectl/jsonpath.md b/content/en/docs/reference/kubectl/jsonpath.md index 8f111f2875..74fcea92fb 100644 --- a/content/en/docs/reference/kubectl/jsonpath.md +++ b/content/en/docs/reference/kubectl/jsonpath.md @@ -1,18 +1,32 @@ --- title: JSONPath Support +content_template: templates/concept +weight: 25 --- -JSONPath template is composed of JSONPath expressions enclosed by {}. -And we add three functions in addition to the original JSONPath syntax: +{{% capture overview %}} +Kubectl supports JSONPath template. +{{% /capture %}} -1. The `$` operator is optional since the expression always starts from the root object by default. -2. We can use `""` to quote text inside JSONPath expressions. -3. We can use `range` operator to iterate lists. -4. We can use negative slice indices to step backwards through a list. Negative indices do not "wrap around" a list. They are valid as long as `-index + listLength >= 0`. +{{% capture body %}} -The result object is printed as its String() function. +JSONPath template is composed of JSONPath expressions enclosed by curly braces {}. +Kubectl uses JSONPath expressions to filter on specific fields in the JSON object and format the output. +In addition to the original JSONPath template syntax, the following functions and syntax are valid: -Given the input: +1. Use double quotes to quote text inside JSONPath expressions. +2. Use the `range`, `end` operators to iterate lists. +3. Use negative slice indices to step backwards through a list. Negative indices do not "wrap around" a list and are valid as long as `-index + listLength >= 0`. + +{{< note >}} + +- The `$` operator is optional since the expression always starts from the root object by default. + +- The result object is printed as its String() function. + +{{< /note >}} + +Given the JSON input: ```json { @@ -51,20 +65,20 @@ Given the input: } ``` -Function | Description | Example | Result ----------|--------------------|--------------------|------------------ -text | the plain text | kind is {.kind} | kind is List -@ | the current object | {@} | the same as input -. or [] | child operator | {.kind} or {['kind']}| List -.. | recursive descent | {..name} | 127.0.0.1 127.0.0.2 myself e2e -\* | wildcard. Get all objects| {.items[*].metadata.name} | [127.0.0.1 127.0.0.2] -[start:end :step] | subscript operator | {.users[0].name}| myself -[,] | union operator | {.items[*]['metadata.name', 'status.capacity']} | 127.0.0.1 127.0.0.2 map[cpu:4] map[cpu:8] -?() | filter | {.users[?(@.name=="e2e")].user.password} | secret -range, end | iterate list | {range .items[*]}[{.metadata.name}, {.status.capacity}] {end} | [127.0.0.1, map[cpu:4]] [127.0.0.2, map[cpu:8]] -'' | quote interpreted string | {range .items[*]}{.metadata.name}{'\t'}{end} | 127.0.0.1 127.0.0.2 +Function | Description | Example | Result +------------------|---------------------------|---------------------------------------------------------------|------------------ +text | the plain text | kind is {.kind} | kind is List +@ | the current object | {@} | the same as input +. or [] | child operator | {.kind} or {['kind']} | List +.. | recursive descent | {..name} | 127.0.0.1 127.0.0.2 myself e2e +\* | wildcard. Get all objects | {.items[*].metadata.name} | [127.0.0.1 127.0.0.2] +[start:end :step] | subscript operator | {.users[0].name} | myself +[,] | union operator | {.items[*]['metadata.name', 'status.capacity']} | 127.0.0.1 127.0.0.2 map[cpu:4] map[cpu:8] +?() | filter | {.users[?(@.name=="e2e")].user.password} | secret +range, end | iterate list | {range .items[*]}[{.metadata.name}, {.status.capacity}] {end} | [127.0.0.1, map[cpu:4]] [127.0.0.2, map[cpu:8]] +'' | quote interpreted string | {range .items[*]}{.metadata.name}{'\t'}{end} | 127.0.0.1 127.0.0.2 -Below are some examples using jsonpath: +Examples using `kubectl` and JSONPath expressions: ```shell $ kubectl get pods -o json @@ -80,3 +94,5 @@ On Windows, you must _double_ quote any JSONPath template that contains spaces ( C:\> kubectl get pods -o=jsonpath="{range .items[*]}{.metadata.name}{'\t'}{.status.startTime}{'\n'}{end}" C:\> kubectl get pods -o=jsonpath="{range .items[*]}{.metadata.name}{\"\t\"}{.status.startTime}{\"\n\"}{end}" ``` + +{{% /capture %}} \ No newline at end of file From d02fc8de3f9dca27716f0c9b09bd6e15db384ee4 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Mon, 19 Nov 2018 10:29:44 +0800 Subject: [PATCH 115/222] zh_trans: add debug-application-cluster/_index.md (#11054) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * zh_trans: add debug-application-cluster/_index.md zh_trans: add debug-application-cluster/_index.md * minor fix minor fix * minor fix , 鏀逛负 銆 --- .../docs/tasks/debug-application-cluster/_index.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 content/zh/docs/tasks/debug-application-cluster/_index.md diff --git a/content/zh/docs/tasks/debug-application-cluster/_index.md b/content/zh/docs/tasks/debug-application-cluster/_index.md new file mode 100644 index 0000000000..d78ae89c63 --- /dev/null +++ b/content/zh/docs/tasks/debug-application-cluster/_index.md @@ -0,0 +1,12 @@ + + +--- +title: "鐩戞帶銆佹棩蹇楀拰鎺掗敊" +weight: 80 +--- + From 8790759a24d7b9b060faac5557d9c2f92e17958e Mon Sep 17 00:00:00 2001 From: Anastas Dancha Date: Mon, 19 Nov 2018 05:36:34 +0300 Subject: [PATCH 116/222] add examples using "rollout" (#10583) * add examples using "rollout" since "rolling-update" is deprecated, add example using "rollout" * better deprecation reference Referenced version where `rolling-update` was deprecated Separated `rollout` example into it's own block --- .../en/docs/reference/kubectl/cheatsheet.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/content/en/docs/reference/kubectl/cheatsheet.md b/content/en/docs/reference/kubectl/cheatsheet.md index e7cef38ef1..0f42751f7c 100644 --- a/content/en/docs/reference/kubectl/cheatsheet.md +++ b/content/en/docs/reference/kubectl/cheatsheet.md @@ -163,12 +163,20 @@ kubectl get events --sort-by=.metadata.creationTimestamp ## Updating Resources +As of version 1.11 `rolling-update` have been deprecated (see [CHANGELOG-1.11.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.11.md)), use `rollout` instead. + ```bash -kubectl rolling-update frontend-v1 -f frontend-v2.json # Rolling update pods of frontend-v1 -kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2 # Change the name of the resource and update the image -kubectl rolling-update frontend --image=image:v2 # Update the pods image of frontend -kubectl rolling-update frontend-v1 frontend-v2 --rollback # Abort existing rollout in progress -cat pod.json | kubectl replace -f - # Replace a pod based on the JSON passed into stdin +kubectl set image deployment/frontend www=image:v2 # Rolling update "www" containers of "frontend" deployment, updating the image +kubectl rollout undo deployment/frontend # Rollback to the previous deployment +kubectl rollout status -w deployment/frontend # Watch rolling update status of "frontend" deployment until completion + +# deprecated starting version 1.11 +kubectl rolling-update frontend-v1 -f frontend-v2.json # (deprecated) Rolling update pods of frontend-v1 +kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2 # (deprecated) Change the name of the resource and update the image +kubectl rolling-update frontend --image=image:v2 # (deprecated) Update the pods image of frontend +kubectl rolling-update frontend-v1 frontend-v2 --rollback # (deprecated) Abort existing rollout in progress + +cat pod.json | kubectl replace -f - # Replace a pod based on the JSON passed into std # Force replace, delete and then re-create the resource. Will cause a service outage. kubectl replace --force -f ./pod.json From b5a09f68deb473c2acb277adb1aaa54616eb94f1 Mon Sep 17 00:00:00 2001 From: Cliff Burdick <30670611+cliffburdick@users.noreply.github.com> Date: Sun, 18 Nov 2018 18:38:22 -0800 Subject: [PATCH 117/222] Fixing yaml (#10541) The current YAML doesn't work since hugepages requires you to include memory and/or CPU limits as well, or you get the error: "HugePages require cpu or memory". --- .../en/docs/tasks/manage-hugepages/scheduling-hugepages.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/content/en/docs/tasks/manage-hugepages/scheduling-hugepages.md b/content/en/docs/tasks/manage-hugepages/scheduling-hugepages.md index e8bb5ef319..82b3c34d27 100644 --- a/content/en/docs/tasks/manage-hugepages/scheduling-hugepages.md +++ b/content/en/docs/tasks/manage-hugepages/scheduling-hugepages.md @@ -33,7 +33,9 @@ Huge pages can be consumed via container level resource requirements using the resource name `hugepages-`, where size is the most compact binary notation using integer values supported on a particular node. For example, if a node supports 2048KiB page sizes, it will expose a schedulable resource -`hugepages-2Mi`. Unlike CPU or memory, huge pages do not support overcommit. +`hugepages-2Mi`. Unlike CPU or memory, huge pages do not support overcommit. Note +that when requesting hugepage resources, either memory or CPU resources must +be requested as well. ```yaml apiVersion: v1 @@ -53,6 +55,9 @@ spec: resources: limits: hugepages-2Mi: 100Mi + memory: 100Mi + requests: + memory: 100Mi volumes: - name: hugepage emptyDir: From b82bf962039d98889f9e5806bafaaae57255ac70 Mon Sep 17 00:00:00 2001 From: adisky Date: Mon, 19 Nov 2018 08:10:10 +0530 Subject: [PATCH 118/222] Redirect to decoding a secret (#10594) In this Document Encrypting Secret data at REST, the example to verify decrypt secret is bit confusing, on running $ kubectl describe secret secret1 -n default "should match mykey: mydata" never match because data is enoded, This commit redirects it to decoding the secret --- content/en/docs/tasks/administer-cluster/encrypt-data.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/en/docs/tasks/administer-cluster/encrypt-data.md b/content/en/docs/tasks/administer-cluster/encrypt-data.md index e06ceda9f8..405b1aa96f 100644 --- a/content/en/docs/tasks/administer-cluster/encrypt-data.md +++ b/content/en/docs/tasks/administer-cluster/encrypt-data.md @@ -146,7 +146,8 @@ program to retrieve the contents of your secret. kubectl describe secret secret1 -n default ``` - should match `mykey: mydata` + should match `mykey: bXlkYXRh`, mydata is encoded, check [decoding a secret](/docs/concepts/configuration/secret#decoding-a-secret) to + completely decode the secret. ## Ensure all secrets are encrypted From 51c602d017c4613dadafa73b03597437b048d8ea Mon Sep 17 00:00:00 2001 From: Takuya N Date: Mon, 19 Nov 2018 11:41:58 +0900 Subject: [PATCH 119/222] Use hugo in Travis CI pipeline (#10606) Signed-off-by: Takuya Noguchi --- .travis.yml | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/.travis.yml b/.travis.yml index d55f55fd40..750acaefd2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,20 +2,33 @@ language: go go: - 1.10.2 -# Don't want default ./... here: -install: -- export PATH=$GOPATH/bin:$PATH -- mkdir -p $HOME/gopath/src/k8s.io -- mv $TRAVIS_BUILD_DIR $HOME/gopath/src/k8s.io/website && cd $HOME/gopath/src/k8s.io/website +env: + - HUGO_VERSION=0.49 -# Make sure we are testing against the correct branch -- pushd $GOPATH/src/k8s.io && git clone https://github.com/kubernetes/kubernetes && popd -- pushd $GOPATH/src/k8s.io/kubernetes && git checkout release-1.11 && popd -- cp -L -R $GOPATH/src/k8s.io/kubernetes/vendor/ $GOPATH/src/ -- rm -r $GOPATH/src/k8s.io/kubernetes/vendor/ +jobs: + include: + - name: "Testing examples" + # Don't want default ./... here: + install: + - export PATH=$GOPATH/bin:$PATH + - mkdir -p $HOME/gopath/src/k8s.io + - mv $TRAVIS_BUILD_DIR $HOME/gopath/src/k8s.io/website && cd $HOME/gopath/src/k8s.io/website -# Fetch additional dependencies to run the tests in examples/examples_test.go -- go get -t -v k8s.io/website/content/en/examples + # Make sure we are testing against the correct branch + - pushd $GOPATH/src/k8s.io && git clone https://github.com/kubernetes/kubernetes && popd + - pushd $GOPATH/src/k8s.io/kubernetes && git checkout release-1.11 && popd + - cp -L -R $GOPATH/src/k8s.io/kubernetes/vendor/ $GOPATH/src/ + - rm -r $GOPATH/src/k8s.io/kubernetes/vendor/ -script: -- go test -v k8s.io/website/content/en/examples + # Fetch additional dependencies to run the tests in examples/examples_test.go + - go get -t -v k8s.io/website/content/en/examples + script: + - go test -v k8s.io/website/content/en/examples + - name: "Hugo build" + install: + - curl -L https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-64bit.tar.gz | tar -xz + - mkdir -p ${TRAVIS_HOME}/bin + - mv hugo ${TRAVIS_HOME}/bin + - export PATH=${TRAVIS_HOME}/bin:$PATH + script: + - hugo From 6b819a8eb5b7464eb536e0f0d91b597c9f2d45b0 Mon Sep 17 00:00:00 2001 From: congfairy Date: Mon, 19 Nov 2018 11:06:11 +0800 Subject: [PATCH 120/222] zh_trans:kubeadm_alpha_phase_addon.md (#11061) --- .../generated/kubeadm_alpha_phase_addon.md | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_addon.md diff --git a/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_addon.md b/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_addon.md new file mode 100644 index 0000000000..fa33cd6463 --- /dev/null +++ b/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_addon.md @@ -0,0 +1,55 @@ + + +瀹夎鎵闇鎻掍欢浠ラ氳繃涓娆℃ф祴璇 + +### 绠浠 + +姝ゅ懡浠や笉鑳藉崟鐙繍琛屻傝鍙傞槄鍙敤瀛愬懡浠ゅ垪琛ㄣ + +### 閫夐」 + + + + + + + + + + + + + + + + + + +
    -h, --help
    addon甯姪
    + From 91bc09fd68d5fd393bc6bfdde575097e6124a100 Mon Sep 17 00:00:00 2001 From: congfairy Date: Mon, 19 Nov 2018 13:23:22 +0800 Subject: [PATCH 121/222] zh_trans_kubeadm_alpha_phase_selfhosting.md (#11040) * zh_trans_kubeadm_alpha_phase_selfhosting.md * zh_trans:kubeadm_alpha_phase_selfhosting.md --- .../kubeadm_alpha_phase_selfhosting.md | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_selfhosting.md diff --git a/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_selfhosting.md b/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_selfhosting.md new file mode 100644 index 0000000000..6911a607dc --- /dev/null +++ b/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_selfhosting.md @@ -0,0 +1,56 @@ + + + +鍦╯elf-hosted妯″紡涓嬪垱寤簁ubeadm闆嗙兢 + +### 绠浠 + + +姝ゅ懡浠や笉鑳藉崟鐙繍琛屻傝鍙傞槄鍙敤瀛愬懡浠ゅ垪琛ㄣ + +### 閫夐」 + + + + + + + + + + + + + + + + + + +
    -h, --help
    selfhosting甯姪
    + From 9f8f3fe43fe56a74f11e2b3643154e3b04baccca Mon Sep 17 00:00:00 2001 From: congfairy Date: Mon, 19 Nov 2018 14:33:34 +0800 Subject: [PATCH 122/222] zh_trans:kubeadm_alpha_phase_kubeconfig_user.md (#11067) * zh_trans:kubeadm_alpha_phase_kubeconfig_user.md * Update kubeadm_alpha_phase_kubeconfig_user.md --- .../kubeadm_alpha_phase_kubeconfig_user.md | 222 ++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_kubeconfig_user.md diff --git a/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_kubeconfig_user.md b/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_kubeconfig_user.md new file mode 100644 index 0000000000..30c259021d --- /dev/null +++ b/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_kubeconfig_user.md @@ -0,0 +1,222 @@ + + + +涓哄叾浠栫敤鎴疯緭鍑簁ubeconfig鏂囦欢 + +### 绠浠 + + +涓哄叾浠栫敤鎴疯緭鍑簁ubeconfig鏂囦欢銆 + +Alpha鍏嶈矗澹版槑锛氭鍛戒护鐩墠鏄痑lpha鐗堟湰銆 + +``` +kubeadm alpha phase kubeconfig鐢ㄦ埛[flags] +``` +### 渚嬪瓙 + +``` + 锛冧负鍚嶄负foo鐨勫叾浠栫敤鎴疯緭鍑簁ubeconfig鏂囦欢 + kubeadm alpha phase kubeconfig user --client-name=foo +``` + +### 閫夐」 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    --apiserver-advertise-address string
    鍙互璁块棶API鏈嶅姟鍣ㄧ殑IP鍦板潃
    --apiserver-bind-port int32     Default: 6443
    鍙互璁块棶API鏈嶅姟鍣ㄧ殑绔彛鍙峰湴鍧
    --cert-dir string     Default: "/etc/kubernetes/pki"
    璇佷功瀛樺偍鐨勮矾寰
    --client-name string
    鐢ㄦ埛鍚嶃傚鏋滃垱寤轰簡瀹㈡埛绔瘉涔︼紝瀹冨皢琚敤浣淐N銆
    -h, --help
    甯姪
    --kubeconfig-dir string     Default: "/etc/kubernetes"
    淇濆瓨kubeconfig鏂囦欢鐨勮矾寰
    --org stringSlice
    瀹㈡埛绔瘉涔︾殑缁勭粐銆傚鏋滃垱寤轰簡瀹㈡埛绔瘉涔︼紝瀹冨皢鐢ㄤ綔O銆
    --token string
    搴旇鐢ㄤ綔姝ubeconfig鐨勮韩浠介獙璇佹満鍒剁殑浠ょ墝锛岃屼笉鏄鎴风璇佷功銆
    + + + +### 浠庣埗鍛戒护缁ф壙鐨勯夐」 + + + + + + + + + + + + + + + + +
    --rootfs string
    [EXPERIMENTAL] 瀹夸富鏈烘牴鏂囦欢绯荤粺鐨勮矾寰勩
    + + + From 0ba188f5da7acca77d01ae80e35f785c2da7a3ed Mon Sep 17 00:00:00 2001 From: Qiming Date: Mon, 19 Nov 2018 14:48:53 +0800 Subject: [PATCH 123/222] Revert "zh_trans:kubeadm_alpha_phase_kubeconfig_user.md (#11067)" This reverts commit 9f8f3fe43fe56a74f11e2b3643154e3b04baccca. From 166927c5807a9c5235653133fcf2794c71d5e7f2 Mon Sep 17 00:00:00 2001 From: Qiming Date: Mon, 19 Nov 2018 14:48:53 +0800 Subject: [PATCH 124/222] Revert "zh_trans_kubeadm_alpha_phase_selfhosting.md (#11040)" This reverts commit 91bc09fd68d5fd393bc6bfdde575097e6124a100. --- .../kubeadm_alpha_phase_selfhosting.md | 56 ------------------- 1 file changed, 56 deletions(-) delete mode 100644 content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_selfhosting.md diff --git a/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_selfhosting.md b/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_selfhosting.md deleted file mode 100644 index 6911a607dc..0000000000 --- a/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_selfhosting.md +++ /dev/null @@ -1,56 +0,0 @@ - - - -鍦╯elf-hosted妯″紡涓嬪垱寤簁ubeadm闆嗙兢 - -### 绠浠 - - -姝ゅ懡浠や笉鑳藉崟鐙繍琛屻傝鍙傞槄鍙敤瀛愬懡浠ゅ垪琛ㄣ - -### 閫夐」 - - - - - - - - - - - - - - - - - - -
    -h, --help
    selfhosting甯姪
    - From c7eae631605183c936dae82cbf94c1ec58202cd0 Mon Sep 17 00:00:00 2001 From: Qiming Date: Mon, 19 Nov 2018 14:51:25 +0800 Subject: [PATCH 125/222] Revert "zh_trans:kubeadm_alpha_phase_kubeconfig_user.md (#11067)" This reverts commit 9f8f3fe43fe56a74f11e2b3643154e3b04baccca. From 6800d24ec248f5d7dbdb45b91d8f26b01b9e946e Mon Sep 17 00:00:00 2001 From: Qiming Date: Mon, 19 Nov 2018 14:51:25 +0800 Subject: [PATCH 126/222] Revert "zh_trans_kubeadm_alpha_phase_selfhosting.md (#11040)" This reverts commit 91bc09fd68d5fd393bc6bfdde575097e6124a100. From ebbcd2e926af1fd03755065903cef24f0aacf594 Mon Sep 17 00:00:00 2001 From: Qiming Date: Mon, 19 Nov 2018 14:51:25 +0800 Subject: [PATCH 127/222] Revert "zh_trans:kubeadm_alpha_phase_addon.md (#11061)" This reverts commit 6b819a8eb5b7464eb536e0f0d91b597c9f2d45b0. --- .../generated/kubeadm_alpha_phase_addon.md | 55 ------------------- 1 file changed, 55 deletions(-) delete mode 100644 content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_addon.md diff --git a/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_addon.md b/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_addon.md deleted file mode 100644 index fa33cd6463..0000000000 --- a/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_addon.md +++ /dev/null @@ -1,55 +0,0 @@ - - -瀹夎鎵闇鎻掍欢浠ラ氳繃涓娆℃ф祴璇 - -### 绠浠 - -姝ゅ懡浠や笉鑳藉崟鐙繍琛屻傝鍙傞槄鍙敤瀛愬懡浠ゅ垪琛ㄣ - -### 閫夐」 - - - - - - - - - - - - - - - - - - -
    -h, --help
    addon甯姪
    - From 810f3a910cb47c7c1e79a8dd4d56e86df6699f2b Mon Sep 17 00:00:00 2001 From: Qiming Teng Date: Mon, 19 Nov 2018 07:03:03 +0000 Subject: [PATCH 128/222] Manual revert 11067 --- .../kubeadm_alpha_phase_kubeconfig_user.md | 222 ------------------ 1 file changed, 222 deletions(-) delete mode 100644 content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_kubeconfig_user.md diff --git a/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_kubeconfig_user.md b/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_kubeconfig_user.md deleted file mode 100644 index 30c259021d..0000000000 --- a/content/cn/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_phase_kubeconfig_user.md +++ /dev/null @@ -1,222 +0,0 @@ - - - -涓哄叾浠栫敤鎴疯緭鍑簁ubeconfig鏂囦欢 - -### 绠浠 - - -涓哄叾浠栫敤鎴疯緭鍑簁ubeconfig鏂囦欢銆 - -Alpha鍏嶈矗澹版槑锛氭鍛戒护鐩墠鏄痑lpha鐗堟湰銆 - -``` -kubeadm alpha phase kubeconfig鐢ㄦ埛[flags] -``` -### 渚嬪瓙 - -``` - 锛冧负鍚嶄负foo鐨勫叾浠栫敤鎴疯緭鍑簁ubeconfig鏂囦欢 - kubeadm alpha phase kubeconfig user --client-name=foo -``` - -### 閫夐」 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    --apiserver-advertise-address string
    鍙互璁块棶API鏈嶅姟鍣ㄧ殑IP鍦板潃
    --apiserver-bind-port int32     Default: 6443
    鍙互璁块棶API鏈嶅姟鍣ㄧ殑绔彛鍙峰湴鍧
    --cert-dir string     Default: "/etc/kubernetes/pki"
    璇佷功瀛樺偍鐨勮矾寰
    --client-name string
    鐢ㄦ埛鍚嶃傚鏋滃垱寤轰簡瀹㈡埛绔瘉涔︼紝瀹冨皢琚敤浣淐N銆
    -h, --help
    甯姪
    --kubeconfig-dir string     Default: "/etc/kubernetes"
    淇濆瓨kubeconfig鏂囦欢鐨勮矾寰
    --org stringSlice
    瀹㈡埛绔瘉涔︾殑缁勭粐銆傚鏋滃垱寤轰簡瀹㈡埛绔瘉涔︼紝瀹冨皢鐢ㄤ綔O銆
    --token string
    搴旇鐢ㄤ綔姝ubeconfig鐨勮韩浠介獙璇佹満鍒剁殑浠ょ墝锛岃屼笉鏄鎴风璇佷功銆
    - - - -### 浠庣埗鍛戒护缁ф壙鐨勯夐」 - - - - - - - - - - - - - - - - -
    --rootfs string
    [EXPERIMENTAL] 瀹夸富鏈烘牴鏂囦欢绯荤粺鐨勮矾寰勩
    - - - From 074666cd3ba51b9899ab93f6ab6f6985e619dbf7 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Mon, 19 Nov 2018 15:32:37 +0800 Subject: [PATCH 129/222] Update automated-tasks-with-cron-jobs.md --- .../job/automated-tasks-with-cron-jobs.md | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md b/content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md index 531284e8b3..be09342c12 100644 --- a/content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md +++ b/content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md @@ -37,7 +37,8 @@ CronJob resource in `batch/v2alpha1` API group has been deprecated starting from You should switch to using `batch/v1beta1`, instead, which is enabled by default in the API server. Examples in this document use `batch/v1beta1` in all examples. --> -鍦╜batch/v2alpha1` API 缁勪腑锛 CronJob 璧勬簮浠庨泦缇ょ増鏈1.8寮濮嬪凡缁忚鍘绘帀浜嗐備綘搴旇鍒囨崲鍒癭batch/v1beta1`锛屽湪杩欓噷鐨凙PI 鏈嶅姟鍣ㄤ腑鏄粯璁ゅ紑鍚殑銆傛湰鏂囦腑鐨勬墍鏈夌ず渚嬩娇鐢ㄤ簡`batch/v1beta1`銆 +浠庨泦缇ょ増鏈1.8寮濮嬶紝`batch/v2alpha1` API 缁勪腑鐨 CronJob 璧勬簮宸茬粡琚簾寮冦 +浣犲簲璇ュ垏鎹㈠埌API 鏈嶅姟鍣ㄩ粯璁ゅ惎鐢ㄧ殑 `batch/v1beta1` API 缁勩傛湰鏂囦腑鐨勬墍鏈夌ず渚嬩娇鐢ㄤ簡`batch/v1beta1`銆 {{< /note >}} -CronJobs鏈変竴浜涢檺鍒跺拰鐗圭偣銆 -渚嬪锛屽湪鐗瑰畾鐘跺喌涓嬶紝涓涓崟鐙殑cron job鍙互鍒涘缓澶氫釜浠诲姟銆 +CronJobs 鏈変竴浜涢檺鍒跺拰鐗圭偣銆 +渚嬪锛屽湪鐗瑰畾鐘跺喌涓嬶紝鍚屼竴涓 CronJob 鍙互鍒涘缓澶氫釜浠诲姟銆 鍥犳锛屼换鍔″簲璇ユ槸骞傜瓑鐨勩 -鏌ョ湅鏇村闄愬埗锛岃鍙傝僛CronJobs](/docs/concepts/workloads/controllers/cron-jobs). +鏌ョ湅鏇村闄愬埗锛岃鍙傝僛CronJobs](/docs/concepts/workloads/controllers/cron-jobs)銆 {{% /capture %}} @@ -81,8 +82,8 @@ This example cron job config `.spec` file prints the current time and a hello me ## 鍒涘缓 CronJob -Cron Job闇瑕佷竴涓厤缃枃浠躲 -鏈緥涓 Cron Job 鐨刞.spec` 閰嶇疆鏂囦欢姣忓垎閽熸墦鍗板嚭褰撳墠鏃堕棿鍜屼竴涓棶濂戒俊鎭細 +CronJob闇瑕佷竴涓厤缃枃浠躲 +鏈緥涓 CronJob 鐨刞.spec` 閰嶇疆鏂囦欢姣忓垎閽熸墦鍗板嚭褰撳墠鏃堕棿鍜屼竴涓棶濂戒俊鎭細 {{< codenew file="application/job/cronjob.yaml" >}} @@ -154,7 +155,7 @@ Now, find the pods that the last scheduled job created and view the standard out Note that the job name and pod name are different. --> -浣犲簲璇ヨ兘鐪嬪埌 鈥渉ello鈥 CronJob 鍦 `LAST-SCHEDULE` 澹版槑鐨勬椂闂寸偣鎴愬姛鐨勮皟搴︿簡涓娆′换鍔°傛湁0涓椿璺冪殑浠诲姟鎰忓懗鐫浠诲姟鎵ц瀹屾瘯鎴栬繖鎵ц澶辫触銆 +浣犲簲璇ヨ兘鐪嬪埌 鈥渉ello鈥 CronJob 鍦 `LAST-SCHEDULE` 澹版槑鐨勬椂闂寸偣鎴愬姛鐨勮皟搴︿簡涓娆′换鍔°傛湁0涓椿璺冪殑浠诲姟鎰忓懗鐫浠诲姟鎵ц瀹屾瘯鎴栬呮墽琛屽け璐ャ 鐜板湪锛屾壘鍒版渶鍚庝竴娆¤皟搴︿换鍔″垱寤虹殑 Pod 骞舵煡鐪嬩竴涓 Pod 鐨勬爣鍑嗚緭鍑恒傝娉ㄦ剰浠诲姟鍚嶇О鍜 Pod 鍚嶇О鏄笉鍚岀殑銆 @@ -190,7 +191,7 @@ Deleting the cron job removes all the jobs and pods it created and stops it from You can read more about removing jobs in [garbage collection](/docs/concepts/workloads/controllers/garbage-collection/). --> -鍒犻櫎 CronJob 浼氭竻闄ゅ畠鍒涘缓鐨勬墍鏈変换鍔″拰 Pod锛屽苟闃绘瀹冨垱寤洪澶栫殑浠诲姟銆備綘鍙互鏌ラ槄鍒犻櫎浠诲姟鐨勬洿澶氫俊鎭 [鍨冨溇鏀堕泦](/docs/concepts/workloads/controllers/garbage-collection/)銆 +鍒犻櫎 CronJob 浼氭竻闄ゅ畠鍒涘缓鐨勬墍鏈変换鍔″拰 Pod锛屽苟闃绘瀹冨垱寤洪澶栫殑浠诲姟銆備綘鍙互鏌ラ槄 [鍨冨溇鏀堕泦](/docs/concepts/workloads/controllers/garbage-collection/)銆 -瀵笴ronJob鐨勬墍鏈夋敼鍔紝鐗瑰埆鏄畠鐨 `.spec`锛屽彧鏈夊湪涓嬮潰鐨勬墽琛屼腑搴旂敤銆 +瀵笴ronJob鐨勬墍鏈夋敼鍔紝鐗瑰埆鏄畠鐨 `.spec`锛屽彧浼氬奖鍝嶅皢鏉ョ殑杩愯瀹炰緥銆 {{< /note >}} -### 璋冨害 +### 鏃堕棿瀹夋帓 `.spec.schedule` 鏄 `.spec` 闇瑕佺殑鍩熴傚畠浣跨敤浜 [Cron](https://en.wikipedia.org/wiki/Cron) 鏍煎紡涓诧紝渚嬪 `0 * * * *` or `@hourly` 锛屽仛涓哄畠鐨勪换鍔¤鍒涘缓鍜屾墽琛岀殑璋冨害鏃堕棿銆 @@ -313,15 +314,15 @@ Note that concurrency policy only applies to the jobs created by the same cron j If there are multiple cron jobs, their respective jobs are always allowed to run concurrently. --> -### 閲嶅彔瑙勫垯 +### 骞跺彂鎬ц鍒 -`.spec.concurrencyPolicy` 涔熸槸鍙夌殑銆傚畠澹版槑浜咰ronJob鍒涘缓鐨勪换鍔¢噸鍙犲彂鐢熸椂濡備綍澶勭悊銆俿pec 浠呰兘澹版槑涓嬪垪瑙勫垯涓殑涓绉嶏細 +`.spec.concurrencyPolicy` 涔熸槸鍙夌殑銆傚畠澹版槑浜咰ronJob鍒涘缓鐨勪换鍔℃墽琛屾椂鍙戠敓閲嶅彔濡備綍澶勭悊銆俿pec 浠呰兘澹版槑涓嬪垪瑙勫垯涓殑涓绉嶏細 -* `Allow` (榛樿)锛欳ronJob鍏佽閲嶅彔鎵ц浠诲姟銆 -* `Forbid`锛 CronJob涓嶅厑璁搁噸鍙犳墽琛屼换鍔★紱濡傛灉鏂颁换鍔$殑鎵ц鏃堕棿鍒颁簡鑰岃佷换鍔℃病鏈夋墽琛屽畬锛孋ronJob浼氬拷鐣ユ柊浠诲姟鐨勬墽琛屻 +* `Allow` (榛樿)锛欳ronJob鍏佽骞跺彂浠诲姟鎵ц銆 +* `Forbid`锛 CronJob涓嶅厑璁稿苟鍙戜换鍔℃墽琛岋紱濡傛灉鏂颁换鍔$殑鎵ц鏃堕棿鍒颁簡鑰岃佷换鍔℃病鏈夋墽琛屽畬锛孋ronJob浼氬拷鐣ユ柊浠诲姟鐨勬墽琛屻 * `Replace`锛氬鏋滄柊浠诲姟鐨勬墽琛屾椂闂村埌浜嗚岃佷换鍔℃病鏈夋墽琛屽畬锛孋ronJob浼氱敤鏂颁换鍔℃浛鎹㈠綋鍓嶆鍦ㄨ繍琛岀殑浠诲姟銆 -璇锋敞鎰忥紝閲嶅彔瑙勫垯浠呴傜敤浜庣浉鍚孋ronJob鍒涘缓鐨勪换鍔°傚鏋滄湁澶氫釜CronJob锛屽畠浠浉搴旂殑浠诲姟鎬绘槸鍏佽閲嶅彔鎵ц鐨勩 +璇锋敞鎰忥紝骞跺彂鎬ц鍒欎粎閫傜敤浜庣浉鍚孋ronJob鍒涘缓鐨勪换鍔°傚鏋滄湁澶氫釜CronJob锛屽畠浠浉搴旂殑浠诲姟鎬绘槸鍏佽骞跺彂鎵ц鐨勩 + +--- +title: 瀹夎缃戠粶瑙勫垯椹卞姩 +weight: 30 +--- From 07d156a48331ad1b12741d73db48f9c3ab31429b Mon Sep 17 00:00:00 2001 From: yanghaichao12 Date: Mon, 19 Nov 2018 16:35:58 +0800 Subject: [PATCH 131/222] Fix some errors in certificates.md (#11075) --- .../en/docs/concepts/cluster-administration/certificates.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/en/docs/concepts/cluster-administration/certificates.md b/content/en/docs/concepts/cluster-administration/certificates.md index 48592dc7c3..40e4fb922c 100644 --- a/content/en/docs/concepts/cluster-administration/certificates.md +++ b/content/en/docs/concepts/cluster-administration/certificates.md @@ -34,7 +34,7 @@ manually through `easyrsa`, `openssl` or `cfssl`. that is specified as the `--service-cluster-ip-range` argument for both the API server and the controller manager component. The argument `--days` is used to set the number of days after which the certificate expires. - The sample below also assume that you are using `cluster.local` as the default + The sample below also assumes that you are using `cluster.local` as the default DNS domain name. ./easyrsa --subject-alt-name="IP:${MASTER_IP},"\ @@ -71,7 +71,7 @@ manually through `easyrsa`, `openssl` or `cfssl`. with real values before saving this to a file (e.g. `csr.conf`). Note that the value for `MASTER_CLUSTER_IP` is the service cluster IP for the API server as described in previous subsection. - The sample below also assume that you are using `cluster.local` as the default + The sample below also assumes that you are using `cluster.local` as the default DNS domain name. [ req ] @@ -186,7 +186,7 @@ Finally, add the same parameters into the API server start parameters. server as shown below. Be sure to replace the values in angle brackets with real values you want to use. The `MASTER_CLUSTER_IP` is the service cluster IP for the API server as described in previous subsection. - The sample below also assume that you are using `cluster.local` as the default + The sample below also assumes that you are using `cluster.local` as the default DNS domain name. { From 3ef3427128a918bb6866aa3351ab7b95c615ca08 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Mon, 19 Nov 2018 16:49:05 +0800 Subject: [PATCH 132/222] Update automated-tasks-with-cron-jobs.md --- .../job/automated-tasks-with-cron-jobs.md | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md b/content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md index be09342c12..6739e2f780 100644 --- a/content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md +++ b/content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md @@ -29,7 +29,7 @@ Cron jobs can also schedule individual tasks for a specific time, such as if you 浣犲彲浠ュ埄鐢 [CronJobs](/docs/concepts/workloads/controllers/cron-jobs) 鎵ц鍩轰簬鏃堕棿璋冨害鐨勪换鍔°傝繖浜涜嚜鍔ㄥ寲浠诲姟鍜 Linux 鎴栬 Unix 绯荤粺鐨 [Cron](https://en.wikipedia.org/wiki/Cron) 浠诲姟绫讳技銆 -CronJobs 鍦ㄥ垱寤哄懆鏈熸т互鍙婇噸澶嶆х殑浠诲姟鏃跺緢鏈夊府鍔╋紝渚嬪鎵ц澶囦唤鎿嶄綔鎴栬呭彂閫侀偖浠躲侰ronJobs涔熷彲浠ュ湪鐗瑰畾鏃堕棿璋冨害鍗曚釜浠诲姟锛屼緥濡備綘鎯宠皟搴︿綆娲昏穬鍛ㄦ湡鐨勪换鍔° +CronJobs 鍦ㄥ垱寤哄懆鏈熸т互鍙婇噸澶嶆х殑浠诲姟鏃跺緢鏈夊府鍔╋紝渚嬪鎵ц澶囦唤鎿嶄綔鎴栬呭彂閫侀偖浠躲侰ronJobs 涔熷彲浠ュ湪鐗瑰畾鏃堕棿璋冨害鍗曚釜浠诲姟锛屼緥濡備綘鎯宠皟搴︿綆娲昏穬鍛ㄦ湡鐨勪换鍔° {{< note >}} 浠庨泦缇ょ増鏈1.8寮濮嬶紝`batch/v2alpha1` API 缁勪腑鐨 CronJob 璧勬簮宸茬粡琚簾寮冦 -浣犲簲璇ュ垏鎹㈠埌API 鏈嶅姟鍣ㄩ粯璁ゅ惎鐢ㄧ殑 `batch/v1beta1` API 缁勩傛湰鏂囦腑鐨勬墍鏈夌ず渚嬩娇鐢ㄤ簡`batch/v1beta1`銆 +浣犲簲璇ュ垏鎹㈠埌 API 鏈嶅姟鍣ㄩ粯璁ゅ惎鐢ㄧ殑 `batch/v1beta1` API 缁勩傛湰鏂囦腑鐨勬墍鏈夌ず渚嬩娇鐢ㄤ簡`batch/v1beta1`銆 {{< /note >}} -* 浣犻渶瑕佷竴涓増鏈 >=1.8 涓斿伐浣滄甯哥殑 Kubernetes 闆嗙兢銆傚浜庢洿鏃╃殑鐗堟湰锛 <1.8 锛夛紝浣犻渶瑕佸API 鏈嶅姟鍣ㄨ缃 `--runtime-config=batch/v2alpha1=true` 鏉ュ紑鍚 `batch/v2alpha1` API锛(鏇村淇℃伅璇锋煡鐪 [涓轰綘鐨勯泦缇ゅ紑鍚垨鍏抽棴 API 鐗堟湰](/docs/admin/cluster-management/#turn-on-or-off-an-api-version-for-your-cluster) +* 浣犻渶瑕佷竴涓増鏈 >=1.8 涓斿伐浣滄甯哥殑 Kubernetes 闆嗙兢銆傚浜庢洿鏃╃殑鐗堟湰锛 <1.8 锛夛紝浣犻渶瑕佸 API 鏈嶅姟鍣ㄨ缃 `--runtime-config=batch/v2alpha1=true` 鏉ュ紑鍚 `batch/v2alpha1` API锛(鏇村淇℃伅璇锋煡鐪 [涓轰綘鐨勯泦缇ゅ紑鍚垨鍏抽棴 API 鐗堟湰](/docs/admin/cluster-management/#turn-on-or-off-an-api-version-for-your-cluster) ), 鐒跺悗閲嶅惎 API 鏈嶅姟鍣ㄥ拰鎺у埗绠$悊鍣ㄣ {{% /capture %}} @@ -82,7 +82,7 @@ This example cron job config `.spec` file prints the current time and a hello me ## 鍒涘缓 CronJob -CronJob闇瑕佷竴涓厤缃枃浠躲 +CronJob 闇瑕佷竴涓厤缃枃浠躲 鏈緥涓 CronJob 鐨刞.spec` 閰嶇疆鏂囦欢姣忓垎閽熸墦鍗板嚭褰撳墠鏃堕棿鍜屼竴涓棶濂戒俊鎭細 {{< codenew file="application/job/cronjob.yaml" >}} @@ -113,7 +113,7 @@ cronjob "hello" created After creating the cron job, get its status using this command: --> -鍒涘缓濂紺ronJob鍚庯紝浣跨敤涓嬮潰鐨勫懡浠ゆ潵鑾峰彇鍏剁姸鎬侊細 +鍒涘缓濂 CronJob 鍚庯紝浣跨敤涓嬮潰鐨勫懡浠ゆ潵鑾峰彇鍏剁姸鎬侊細 ```shell $ kubectl get cronjob hello @@ -126,7 +126,7 @@ As you can see from the results of the command, the cron job has not scheduled o Watch for the job to be created in around one minute: --> -灏卞儚浣犱粠鍛戒护杩斿洖缁撴灉鐪嬪埌鐨勯偅鏍凤紝CronJob杩樻病鏈夎皟搴︽垨鎵ц浠讳綍浠诲姟銆傚ぇ绾﹂渶瑕佷竴鍒嗛挓浠诲姟鎵嶈兘鍒涘缓濂姐 +灏卞儚浣犱粠鍛戒护杩斿洖缁撴灉鐪嬪埌鐨勯偅鏍凤紝CronJob 杩樻病鏈夎皟搴︽垨鎵ц浠讳綍浠诲姟銆傚ぇ绾﹂渶瑕佷竴鍒嗛挓浠诲姟鎵嶈兘鍒涘缓濂姐 ```shell $ kubectl get jobs --watch @@ -139,7 +139,7 @@ Now you've seen one running job scheduled by the "hello" cron job. You can stop watching the job and view the cron job again to see that it scheduled the job: --> -鐜板湪浣犲凡缁忕湅鍒颁簡涓涓繍琛屼腑鐨勪换鍔¤ 鈥渉ello鈥 CronJob璋冨害銆備綘鍙互鍋滄鐩戣杩欎釜浠诲姟锛岀劧鍚庡啀娆℃煡鐪婥ronJob灏辫兘鐪嬪埌瀹冭皟搴︿换鍔★細 +鐜板湪浣犲凡缁忕湅鍒颁簡涓涓繍琛屼腑鐨勪换鍔¤ 鈥渉ello鈥 CronJob 璋冨害銆備綘鍙互鍋滄鐩戣杩欎釜浠诲姟锛岀劧鍚庡啀娆℃煡鐪 CronJob 灏辫兘鐪嬪埌瀹冭皟搴︿换鍔★細 ```shell $ kubectl get cronjob hello @@ -180,7 +180,7 @@ When you don't need a cron job any more, delete it with `kubectl delete cronjob` ## 鍒犻櫎 CronJob -褰撲綘涓嶅啀闇瑕丆ronJob鏃讹紝鍙互鐢 `kubectl delete cronjob` 鍒犳帀瀹冿細 +褰撲綘涓嶅啀闇瑕 CronJob 鏃讹紝鍙互鐢 `kubectl delete cronjob` 鍒犳帀瀹冿細 ```shell $ kubectl delete cronjob hello @@ -203,9 +203,9 @@ and [using kubectl to manage resources](/docs/user-guide/working-with-resources) A cron job config also needs a [`.spec` section](https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status). --> -## 缂栧啓CronJob澹版槑淇℃伅 +## 缂栧啓 CronJob 澹版槑淇℃伅 -鍍 Kubernetes 鐨勫叾浠栭厤缃竴鏍凤紝CronJob闇瑕 `apiVersion`銆 `kind`銆 鍜 `metadata` 鍩熴傞厤缃枃浠剁殑涓鑸俊鎭紝璇峰弬鑰 [閮ㄧ讲搴旂敤](/docs/user-guide/deploying-applications) 鍜 [浣跨敤 kubectl 绠$悊璧勬簮](/docs/user-guide/working-with-resources). +鍍 Kubernetes 鐨勫叾浠栭厤缃竴鏍凤紝CronJob 闇瑕 `apiVersion`銆 `kind`銆 鍜 `metadata` 鍩熴傞厤缃枃浠剁殑涓鑸俊鎭紝璇峰弬鑰 [閮ㄧ讲搴旂敤](/docs/user-guide/deploying-applications) 鍜 [浣跨敤 kubectl 绠$悊璧勬簮](/docs/user-guide/working-with-resources). CronJob 閰嶇疆涔熼渶瑕佸寘鎷琜`.spec`](https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status). @@ -213,7 +213,7 @@ CronJob 閰嶇疆涔熼渶瑕佸寘鎷琜`.spec`](https://git.k8s.io/community/contributors -瀵笴ronJob鐨勬墍鏈夋敼鍔紝鐗瑰埆鏄畠鐨 `.spec`锛屽彧浼氬奖鍝嶅皢鏉ョ殑杩愯瀹炰緥銆 +瀵 CronJob 鐨勬墍鏈夋敼鍔紝鐗瑰埆鏄畠鐨 `.spec`锛屽彧浼氬奖鍝嶅皢鏉ョ殑杩愯瀹炰緥銆 {{< /note >}} -CronJob 鎺у埗鍣ㄤ細缁熻閿欒繃浜嗗灏戞璋冨害銆傚鏋滈敊杩囦簡100娆′互涓婄殑璋冨害锛孋ronJob灏变笉鍐嶈皟搴︿簡銆傚綋娌℃湁璁剧疆 `.spec.startingDeadlineSeconds` 鏃讹紝CronJob鎺у埗鍣ㄧ粺璁′粠`status.lastScheduleTime`鍒板綋鍓嶇殑璋冨害閿欒繃娆℃暟銆 -渚嬪涓涓狢ronJob鏈熸湜姣忓垎閽熸墽琛屼竴娆★紝`status.lastScheduleTime`鏄 5:00am锛屼絾鐜板湪鏄 7:00am銆傞偅鎰忓懗鐫120娆¤皟搴﹁閿欒繃浜嗭紝鎵浠 CronJob灏嗕笉鍐嶈璋冨害銆 +CronJob 鎺у埗鍣ㄤ細缁熻閿欒繃浜嗗灏戞璋冨害銆傚鏋滈敊杩囦簡100娆′互涓婄殑璋冨害锛孋ronJob 灏变笉鍐嶈皟搴︿簡銆傚綋娌℃湁璁剧疆 `.spec.startingDeadlineSeconds` 鏃讹紝CronJob 鎺у埗鍣ㄧ粺璁′粠`status.lastScheduleTime`鍒板綋鍓嶇殑璋冨害閿欒繃娆℃暟銆 +渚嬪涓涓 CronJob 鏈熸湜姣忓垎閽熸墽琛屼竴娆★紝`status.lastScheduleTime`鏄 5:00am锛屼絾鐜板湪鏄 7:00am銆傞偅鎰忓懗鐫120娆¤皟搴﹁閿欒繃浜嗭紝鎵浠 CronJob 灏嗕笉鍐嶈璋冨害銆 濡傛灉璁剧疆浜 `.spec.startingDeadlineSeconds` 鍩(闈炵┖)锛孋ronJob 鎺у埗鍣ㄧ粺璁′粠 `.spec.startingDeadlineSeconds` 鍒板綋鍓嶆椂闂撮敊杩囦簡澶氬皯娆′换鍔° -渚嬪璁剧疆浜 `200`锛屽畠浼氱粺璁¤繃鍘200绉掑唴閿欒繃浜嗗灏戞璋冨害銆傚湪閭g鎯呭喌涓嬶紝濡傛灉杩囧幓200绉掑唴閿欒繃浜嗚秴杩100娆$殑璋冨害锛孋ronJob灏变笉鍐嶈皟搴︺ +渚嬪璁剧疆浜 `200`锛屽畠浼氱粺璁¤繃鍘200绉掑唴閿欒繃浜嗗灏戞璋冨害銆傚湪閭g鎯呭喌涓嬶紝濡傛灉杩囧幓200绉掑唴閿欒繃浜嗚秴杩100娆$殑璋冨害锛孋ronJob 灏变笉鍐嶈皟搴︺ + +--- +title: 涓哄懡鍚嶇┖闂撮厤缃粯璁ょ殑鍐呭瓨璇锋眰鍜岄檺鍒 +content_template: templates/task +weight: 10 +--- + +{{% capture overview %}} + + + +鏈枃浠嬬粛鎬庢牱缁欏懡鍚嶇┖闂撮厤缃粯璁ょ殑鍐呭瓨璇锋眰鍜岄檺鍒躲傚鏋滃湪涓涓湁榛樿鍐呭瓨闄愬埗鐨勫懡鍚嶇┖闂村垱寤哄鍣紝璇ュ鍣ㄦ病鏈夊0鏄庤嚜宸辩殑鍐呭瓨闄愬埗鏃讹紝灏嗕細琚寚瀹氶粯璁ゅ唴瀛橀檺鍒躲侹ubernetes 杩樹负鏌愪簺鎯呭喌鎸囧畾浜嗛粯璁ょ殑鍐呭瓨璇锋眰锛屾湰绔犲悗闈細杩涜浠嬬粛銆 + +{{% /capture %}} + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + + + +浣犵殑闆嗙兢涓殑姣忎釜鑺傜偣蹇呴』鑷冲皯鏈2 GiB鐨勫唴瀛樸 + +{{% /capture %}} + +{{% capture steps %}} + + + +## 鍒涘缓鍛藉悕绌洪棿 + + + +鍒涘缓涓涓懡鍚嶇┖闂达紝浠ヤ究鏈粌涔犱腑鎵寤虹殑璧勬簮涓庨泦缇ょ殑鍏朵綑璧勬簮鐩搁殧绂汇 + +```shell +kubectl create namespace default-mem-example +``` + + + +## 鍒涘缓 LimitRange 鍜 Pod + + + +杩欓噷缁欏嚭浜嗕竴涓檺鍒惰寖鍥村璞$殑閰嶇疆鏂囦欢銆傝閰嶇疆澹版槑浜嗕竴涓粯璁ょ殑鍐呭瓨璇锋眰鍜屼竴涓粯璁ょ殑鍐呭瓨闄愬埗銆 + +{{< codenew file="admin/resource/memory-defaults.yaml" >}} + + + +鍦 default-mem-example 鍛藉悕绌洪棿鍒涘缓闄愬埗鑼冨洿锛 + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/memory-defaults.yaml --namespace=default-mem-example +``` + + + +鐜板湪锛屽鏋滃湪 default-mem-example 鍛藉悕绌洪棿鍒涘缓瀹瑰櫒锛屽苟涓旇瀹瑰櫒娌℃湁澹版槑鑷繁鐨勫唴瀛樿姹傚拰闄愬埗鍊硷紝瀹冨皢琚寚瀹氫竴涓粯璁ょ殑鍐呭瓨璇锋眰256 MiB鍜屼竴涓粯璁ょ殑鍐呭瓨闄愬埗512 Mib銆 + +{{< codenew file="admin/resource/memory-defaults-pod.yaml" >}} + + + +鍒涘缓 Pod + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/memory-defaults-pod.yaml --namespace=default-mem-example +``` + + + +鏌ョ湅 Pod 鐨勮鎯咃細 + +```shell +kubectl get pod default-mem-demo --output=yaml --namespace=default-mem-example +``` + + + +杈撳嚭鍐呭鏄剧ず璇od鐨勫鍣ㄦ湁涓涓256 MiB鐨勫唴瀛樿姹傚拰涓涓512 MiB鐨勫唴瀛橀檺鍒躲傝繖浜涢兘鏄檺鍒惰寖鍥村0鏄庣殑榛樿鍊笺 + +```shell +containers: +- image: nginx + imagePullPolicy: Always + name: default-mem-demo-ctr + resources: + limits: + memory: 512Mi + requests: + memory: 256Mi +``` + + + +鍒犻櫎浣犵殑 Pod锛 + +```shell +kubectl delete pod default-mem-demo --namespace=default-mem-example +``` + + + +## 澹版槑瀹瑰櫒鐨勯檺鍒惰屼笉澹版槑瀹冪殑璇锋眰浼氭庝箞鏍凤紵 + + + +杩欓噷缁欏嚭浜嗗寘鍚竴涓鍣ㄧ殑 Pod 鐨勯厤缃枃浠躲傝瀹瑰櫒澹版槑浜嗗唴瀛橀檺鍒讹紝鑰屾病鏈夊0鏄庡唴瀛樿姹傦細 + +{{< codenew file="admin/resource/memory-defaults-pod-2.yaml" >}} + + + +鍒涘缓 Pod锛 + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/memory-defaults-pod-2.yaml --namespace=default-mem-example +``` + + + +鏌ョ湅 Pod 鐨勮鎯咃細 + +```shell +kubectl get pod default-mem-demo-2 --output=yaml --namespace=default-mem-example +``` + + + +杈撳嚭缁撴灉鏄剧ず瀹瑰櫒鐨勫唴瀛樿姹傝璁剧疆涓哄畠鐨勫唴瀛橀檺鍒剁浉鍚岀殑鍊笺傛敞鎰忚瀹瑰櫒娌℃湁琚寚瀹氶粯璁ょ殑鍐呭瓨璇锋眰鍊256Mi銆 + +``` +resources: + limits: + memory: 1Gi + requests: + memory: 1Gi +``` + + + +## 澹版槑瀹瑰櫒鐨勫唴瀛樿姹傝屼笉澹版槑鍐呭瓨闄愬埗浼氭庝箞鏍凤紵 + + + +杩欓噷缁欏嚭浜嗕竴涓寘鍚竴涓鍣ㄧ殑 Pod 鐨勯厤缃枃浠躲傝瀹瑰櫒澹版槑浜嗗唴瀛樿姹傦紝浣嗘病鏈夊唴瀛橀檺鍒讹細 + +{{< codenew file="admin/resource/memory-defaults-pod-3.yaml" >}} + + + +鍒涘缓 Pod锛 + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/memory-defaults-pod-3.yaml --namespace=default-mem-example +``` + + + +鏌ョ湅 Pod 澹版槑锛 + +```shell +kubectl get pod default-mem-demo-3 --output=yaml --namespace=default-mem-example +``` + + + +杈撳嚭缁撴灉鏄剧ず璇ュ鍣ㄧ殑鍐呭瓨璇锋眰琚缃负浜嗗鍣ㄩ厤缃枃浠朵腑澹版槑鐨勬暟鍊笺傚鍣ㄧ殑鍐呭瓨闄愬埗琚缃负512Mi锛屽嵆鍛藉悕绌洪棿鐨勯粯璁ゅ唴瀛橀檺鍒躲 + +``` +resources: + limits: + memory: 512Mi + requests: + memory: 128Mi +``` + + + +## 璁剧疆榛樿鍐呭瓨闄愬埗鍜岃姹傜殑鍔ㄦ満 + + + +濡傛灉浣犵殑鍛藉悕绌洪棿鏈夎祫婧愰厤棰濓紝閭d箞榛樿鍐呭瓨闄愬埗鏄緢鏈夊府鍔╃殑銆備笅闈㈡槸涓涓緥瀛愶紝閫氳繃璧勬簮閰嶉涓哄懡鍚嶇┖闂磋缃袱椤圭害鏉燂細 + + + +* 杩愯鍦ㄥ懡鍚嶇┖闂翠腑鐨勬瘡涓鍣ㄥ繀椤绘湁鑷繁鐨勫唴瀛橀檺鍒躲 +* 鍛藉悕绌洪棿涓墍鏈夊鍣ㄧ殑鍐呭瓨浣跨敤閲忎箣鍜屼笉鑳借秴杩囧0鏄庣殑闄愬埗鍊笺 + + + +濡傛灉涓涓鍣ㄦ病鏈夊0鏄庤嚜宸辩殑鍐呭瓨闄愬埗锛屼細琚寚瀹氶粯璁ら檺鍒讹紝鐒跺悗瀹冩墠浼氳鍏佽鍦ㄩ檺瀹氫簡閰嶉鐨勫懡鍚嶇┖闂翠腑杩愯銆 + +{{% /capture %}} + +{{% capture whatsnext %}} + + + +### 闆嗙兢绠$悊鍛樺弬鑰 + + + +* [涓哄懡鍚嶇┖闂撮厤缃粯璁ょ殑 CPU 璇锋眰鍜岄檺鍒禲(/docs/tasks/administer-cluster/cpu-default-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃渶灏忓拰鏈澶у唴瀛橀檺鍒禲(/docs/tasks/administer-cluster/memory-constraint-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃渶灏忓拰鏈澶 CPU 闄愬埗](/docs/tasks/administer-cluster/cpu-constraint-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃唴瀛樺拰 CPU 閰嶉](/docs/tasks/administer-cluster/quota-memory-cpu-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃 Pod 閰嶉](/docs/tasks/administer-cluster/quota-pod-namespace/) + +* [涓 API 瀵硅薄閰嶇疆閰嶉](/docs/tasks/administer-cluster/quota-api-object/) + + + +### 搴旂敤寮鍙戣呭弬鑰 + + + +* [涓哄鍣ㄥ拰 Pod 鍒嗛厤鍐呭瓨璧勬簮](/docs/tasks/configure-pod-container/assign-memory-resource/) + +* [涓哄鍣ㄥ拰 Pod 鍒嗛厤 CPU 璧勬簮](/docs/tasks/configure-pod-container/assign-cpu-resource/) + +* [涓 Pod 閰嶇疆鏈嶅姟鏁伴噺](/docs/tasks/configure-pod-container/quality-service-pod/) + +{{% /capture %}} + + diff --git a/content/zh/examples/admin/resource/memory-defaults-pod-2.yaml b/content/zh/examples/admin/resource/memory-defaults-pod-2.yaml new file mode 100644 index 0000000000..aa80610d84 --- /dev/null +++ b/content/zh/examples/admin/resource/memory-defaults-pod-2.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Pod +metadata: + name: default-mem-demo-2 +spec: + containers: + - name: default-mem-demo-2-ctr + image: nginx + resources: + limits: + memory: "1Gi" diff --git a/content/zh/examples/admin/resource/memory-defaults-pod-3.yaml b/content/zh/examples/admin/resource/memory-defaults-pod-3.yaml new file mode 100644 index 0000000000..09ee8b39a9 --- /dev/null +++ b/content/zh/examples/admin/resource/memory-defaults-pod-3.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Pod +metadata: + name: default-mem-demo-3 +spec: + containers: + - name: default-mem-demo-3-ctr + image: nginx + resources: + requests: + memory: "128Mi" diff --git a/content/zh/examples/admin/resource/memory-defaults-pod.yaml b/content/zh/examples/admin/resource/memory-defaults-pod.yaml new file mode 100644 index 0000000000..ce7a50fb55 --- /dev/null +++ b/content/zh/examples/admin/resource/memory-defaults-pod.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Pod +metadata: + name: default-mem-demo +spec: + containers: + - name: default-mem-demo-ctr + image: nginx diff --git a/content/zh/examples/admin/resource/memory-defaults.yaml b/content/zh/examples/admin/resource/memory-defaults.yaml new file mode 100644 index 0000000000..b98a5ae262 --- /dev/null +++ b/content/zh/examples/admin/resource/memory-defaults.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: LimitRange +metadata: + name: mem-limit-range +spec: + limits: + - default: + memory: 512Mi + defaultRequest: + memory: 256Mi + type: Container From c405c01039566c91f00c3d15a88943d400d1bce3 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Mon, 19 Nov 2018 21:00:52 +0800 Subject: [PATCH 141/222] zh-trans: Add manage-resources/cpu-default-namespace.md (#11043) * zh-trans: Add manage-resources/cpu-default-namespace.md zh-trans: Add manage-resources/cpu-default-namespace.md Add manage-resources/cpu-default-namespace.md Add manage-resources/cpu-default-namespace.md * Create cpu-defaults.yaml * Create cpu-defaults-pod.yaml * Create cpu-defaults-pod-2.yaml * Create cpu-defaults-pod-3.yaml --- .../manage-resources/cpu-default-namespace.md | 317 ++++++++++++++++++ .../admin/resource/cpu-defaults-pod-2.yaml | 11 + .../admin/resource/cpu-defaults-pod-3.yaml | 11 + .../admin/resource/cpu-defaults-pod.yaml | 8 + .../examples/admin/resource/cpu-defaults.yaml | 11 + 5 files changed, 358 insertions(+) create mode 100644 content/zh/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace.md create mode 100644 content/zh/examples/admin/resource/cpu-defaults-pod-2.yaml create mode 100644 content/zh/examples/admin/resource/cpu-defaults-pod-3.yaml create mode 100644 content/zh/examples/admin/resource/cpu-defaults-pod.yaml create mode 100644 content/zh/examples/admin/resource/cpu-defaults.yaml diff --git a/content/zh/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace.md b/content/zh/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace.md new file mode 100644 index 0000000000..ea2a22c746 --- /dev/null +++ b/content/zh/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace.md @@ -0,0 +1,317 @@ + + +--- +title: 涓哄懡鍚嶇┖闂撮厤缃粯璁ょ殑CPU璇锋眰鍜岄檺鍒 +content_template: templates/task +weight: 20 +--- + +{{% capture overview %}} + + +鏈珷浠嬬粛鎬庢牱涓哄懡鍚嶇┖闂撮厤缃粯璁ょ殑 CPU 璇锋眰鍜岄檺鍒躲 +涓涓 Kubernetes 闆嗙兢鍙鍒掑垎涓哄涓懡鍚嶇┖闂淬傚鏋滃湪閰嶇疆浜 CPU 闄愬埗鐨勫懡鍚嶇┖闂村垱寤哄鍣紝骞朵笖璇ュ鍣ㄦ病鏈夊0鏄庤嚜宸辩殑 CPU 闄愬埗锛岄偅涔堣繖涓鍣ㄤ細琚寚瀹氶粯璁ょ殑 CPU 闄愬埗銆侹ubernetes 鍦ㄤ竴浜涚壒瀹氭儏鍐佃繕浼氭寚瀹 CPU 璇锋眰锛屾湰鏂囧悗缁珷鑺傚皢浼氬鍏惰繘琛岃В閲娿 +{{% /capture %}} + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} +{{% /capture %}} + +{{% capture steps %}} + + + +## 鍒涘缓鍛藉悕绌洪棿 + + + +鍒涘缓涓涓懡鍚嶇┖闂达紝浠ヤ究鏈粌涔犱腑鍒涘缓鐨勮祫婧愬拰闆嗙兢鐨勫叾浣欓儴鍒嗙浉闅旂銆 + +```shell +kubectl create namespace default-cpu-example +``` + + + +鍒涘缓 LimitRange 鍜 Pod + + + +杩欓噷缁欏嚭浜 LimitRange 瀵硅薄鐨勯厤缃枃浠躲傝閰嶇疆澹版槑浜嗕竴涓粯璁ょ殑 CPU 璇锋眰鍜屼竴涓粯璁ょ殑 CPU 闄愬埗銆 + +{{< codenew file="admin/resource/cpu-defaults.yaml" >}} + + + +鍦ㄥ懡鍚嶇┖闂 default-cpu-example 涓垱寤 LimitRange 瀵硅薄锛 + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/cpu-defaults.yaml --namespace=default-cpu-example +``` + + + +鐜板湪濡傛灉鍦 default-cpu-example 鍛藉悕绌洪棿鍒涘缓涓涓鍣紝璇ュ鍣ㄦ病鏈夊0鏄庤嚜宸辩殑 CPU 璇锋眰鍜岄檺鍒舵椂锛屽皢浼氱粰瀹冩寚瀹氶粯璁ょ殑 CPU 璇锋眰0.5鍜岄粯璁ょ殑 CPU 闄愬埗鍊1. + +杩欓噷缁欏嚭浜嗗寘鍚竴涓鍣ㄧ殑 Pod 鐨勯厤缃枃浠躲傝瀹瑰櫒娌℃湁澹版槑 CPU 璇锋眰鍜岄檺鍒躲 + +{{< codenew file="admin/resource/cpu-defaults-pod.yaml" >}} + + + +鍒涘缓 Pod銆 + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/cpu-defaults-pod.yaml --namespace=default-cpu-example +``` + + + +鏌ョ湅璇 Pod 鐨勫0鏄庯細 + +```shell +kubectl get pod default-cpu-demo --output=yaml --namespace=default-cpu-example +``` + + + +杈撳嚭鏄剧ず璇 Pod 鐨勫鍣ㄦ湁涓涓500 millicpus鐨 CPU 璇锋眰鍜屼竴涓1 cpu鐨 CPU 闄愬埗銆傝繖浜涙槸 LimitRange 澹版槑鐨勯粯璁ゅ笺 + +```shell +containers: +- image: nginx + imagePullPolicy: Always + name: default-cpu-demo-ctr + resources: + limits: + cpu: "1" + requests: + cpu: 500m +``` + + + +## 浣犲彧澹版槑瀹瑰櫒鐨勯檺鍒讹紝鑰屼笉澹版槑璇锋眰浼氭庝箞鏍凤紵 + + + +杩欐槸鍖呭惈涓涓鍣ㄧ殑 Pod 鐨勯厤缃枃浠躲傝瀹瑰櫒澹版槑浜 CPU 闄愬埗锛岃屾病鏈夊0鏄 CPU 璇锋眰銆 + +{{< codenew file="admin/resource/cpu-defaults-pod-2.yaml" >}} + + + +鍒涘缓 Pod + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/cpu-defaults-pod-2.yaml --namespace=default-cpu-example +``` + + + +鏌ョ湅 Pod 鐨勫0鏄庯細 + +``` +kubectl get pod default-cpu-demo-2 --output=yaml --namespace=default-cpu-example +``` + + + +杈撳嚭鏄剧ず璇ュ鍣ㄧ殑 CPU 璇锋眰鍜 CPU 闄愬埗璁剧疆鐩稿悓銆傛敞鎰忚瀹瑰櫒娌℃湁琚寚瀹氶粯璁ょ殑 CPU 璇锋眰鍊0.5 cpu銆 + +``` +resources: + limits: + cpu: "1" + requests: + cpu: "1" +``` + + + +## 浣犲彧澹版槑瀹瑰櫒鐨勮姹傦紝鑰屼笉澹版槑瀹冪殑闄愬埗浼氭庝箞鏍凤紵 + + + +杩欓噷缁欏嚭浜嗗寘鍚竴涓鍣ㄧ殑 Pod 鐨勯厤缃枃浠躲傝瀹瑰櫒澹版槑浜 CPU 璇锋眰锛岃屾病鏈夊0鏄 CPU 闄愬埗銆 + +{{< codenew file="admin/resource/cpu-defaults-pod-3.yaml" >}} + + + +鍒涘缓 Pod锛 + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/cpu-defaults-pod-3.yaml --namespace=default-cpu-example +``` + + + +鏌ョ湅 Pod 鐨勫0鏄庯細 + +``` +kubectl get pod default-cpu-demo-3 --output=yaml --namespace=default-cpu-example +``` + + + +缁撴灉鏄剧ず璇ュ鍣ㄧ殑 CPU 璇锋眰琚缃负瀹瑰櫒閰嶇疆鏂囦欢涓0鏄庣殑鏁板笺傚鍣ㄧ殑CPU闄愬埗琚缃负1 cpu锛屽嵆璇ュ懡鍚嶇┖闂寸殑榛樿 CPU 闄愬埗鍊笺 + +``` +resources: + limits: + cpu: "1" + requests: + cpu: 750m +``` + + + +## 榛樿 CPU 闄愬埗鍜岃姹傜殑鍔ㄦ満 + + + +濡傛灉浣犵殑鍛藉悕绌洪棿鏈変竴涓猍璧勬簮閰嶉](/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/),閭d箞鏈変竴涓粯璁ょ殑 CPU 闄愬埗鏄湁甯姪鐨勩傝繖閲屾湁涓ゆ潯璧勬簮閰嶉寮哄姞缁欏懡鍚嶇┖闂寸殑闄愬埗锛 + +* 鍛藉悕绌洪棿涓繍琛岀殑姣忎釜瀹瑰櫒蹇呴』鏈夎嚜宸辩殑 CPU 闄愬埗銆 +* 鍛藉悕绌洪棿涓墍鏈夊鍣ㄤ娇鐢ㄧ殑 CPU 鎬诲拰涓嶈兘瓒呰繃涓涓0鏄庡笺 + +濡傛灉瀹瑰櫒娌℃湁澹版槑鑷繁鐨 CPU 闄愬埗锛屽皢浼氱粰瀹冧竴涓粯璁ら檺鍒讹紝杩欐牱瀹冨氨鑳借鍏佽杩愯鍦ㄤ竴涓湁閰嶉闄愬埗鐨勫懡鍚嶇┖闂翠腑銆 + +{{% /capture %}} + +{{% capture whatsnext %}} + + + +### 闆嗙兢绠$悊鍛樺弬鑰 + + + +* [涓哄懡鍚嶇┖闂撮厤缃粯璁ゅ唴瀛樿姹傚拰闄愬埗](/docs/tasks/administer-cluster/memory-default-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃唴瀛橀檺鍒剁殑鏈灏忓煎拰鏈澶у糫(/docs/tasks/administer-cluster/memory-constraint-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃瓹PU闄愬埗鐨勬渶灏忓煎拰鏈澶у糫(/docs/tasks/administer-cluster/cpu-constraint-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃唴瀛樺拰CPU閰嶉](/docs/tasks/administer-cluster/quota-memory-cpu-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃甈od閰嶉](/docs/tasks/administer-cluster/quota-pod-namespace/) + +* [涓篈PI瀵硅薄閰嶇疆閰嶉](/docs/tasks/administer-cluster/quota-api-object/) + + + +### 搴旂敤寮鍙戣呭弬鑰 + + + +* [涓哄鍣ㄥ拰Pod鍒嗛厤鍐呭瓨璧勬簮](/docs/tasks/configure-pod-container/assign-memory-resource/) + +* [涓哄鍣ㄥ拰Pod鍒嗛厤CPU璧勬簮](/docs/tasks/configure-pod-container/assign-cpu-resource/) + +* [涓篜od閰嶇疆Service鏁伴噺](/docs/tasks/configure-pod-container/quality-service-pod/) + +{{% /capture %}} + + diff --git a/content/zh/examples/admin/resource/cpu-defaults-pod-2.yaml b/content/zh/examples/admin/resource/cpu-defaults-pod-2.yaml new file mode 100644 index 0000000000..9ca216dee1 --- /dev/null +++ b/content/zh/examples/admin/resource/cpu-defaults-pod-2.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Pod +metadata: + name: default-cpu-demo-2 +spec: + containers: + - name: default-cpu-demo-2-ctr + image: nginx + resources: + limits: + cpu: "1" diff --git a/content/zh/examples/admin/resource/cpu-defaults-pod-3.yaml b/content/zh/examples/admin/resource/cpu-defaults-pod-3.yaml new file mode 100644 index 0000000000..214cdee34b --- /dev/null +++ b/content/zh/examples/admin/resource/cpu-defaults-pod-3.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Pod +metadata: + name: default-cpu-demo-3 +spec: + containers: + - name: default-cpu-demo-3-ctr + image: nginx + resources: + requests: + cpu: "0.75" diff --git a/content/zh/examples/admin/resource/cpu-defaults-pod.yaml b/content/zh/examples/admin/resource/cpu-defaults-pod.yaml new file mode 100644 index 0000000000..56b06d9a69 --- /dev/null +++ b/content/zh/examples/admin/resource/cpu-defaults-pod.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Pod +metadata: + name: default-cpu-demo +spec: + containers: + - name: default-cpu-demo-ctr + image: nginx diff --git a/content/zh/examples/admin/resource/cpu-defaults.yaml b/content/zh/examples/admin/resource/cpu-defaults.yaml new file mode 100644 index 0000000000..b53d297181 --- /dev/null +++ b/content/zh/examples/admin/resource/cpu-defaults.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: LimitRange +metadata: + name: cpu-limit-range +spec: + limits: + - default: + cpu: 1 + defaultRequest: + cpu: 0.5 + type: Container From 9ceb6650d6b31979be536d9b7fd5214ac370f7e5 Mon Sep 17 00:00:00 2001 From: yongsong you Date: Tue, 20 Nov 2018 02:21:47 +0800 Subject: [PATCH 142/222] add a missing step in kubeadm-upgrade flow. (#10722) In case of external etcd, we should also modify `kubeadm-config.yaml` to set `api.advertiseAddress` to the local node's IP address. --- .../docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha.md b/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha.md index de9296644f..860ff92cdf 100644 --- a/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha.md +++ b/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha.md @@ -176,6 +176,8 @@ Get a copy of the kubeadm config used to create this cluster. The config should kubectl get configmap -n kube-system kubeadm-config -o jsonpath={.data.MasterConfiguration} > kubeadm-config.yaml ``` +Open the file in an editor and set `api.advertiseAddress` to the local node's IP address. + Now run the upgrade on each control plane node one at a time. ``` From 486f5d01b01044c356c57427664d9c1a8d937685 Mon Sep 17 00:00:00 2001 From: Joseph Heck Date: Mon, 19 Nov 2018 10:23:49 -0800 Subject: [PATCH 143/222] making list of hosts under TLS more explicit, fixes #11065 (#11066) --- content/en/docs/concepts/services-networking/ingress.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/en/docs/concepts/services-networking/ingress.md b/content/en/docs/concepts/services-networking/ingress.md index ef79cc759d..94030ebb3c 100644 --- a/content/en/docs/concepts/services-networking/ingress.md +++ b/content/en/docs/concepts/services-networking/ingress.md @@ -327,7 +327,8 @@ metadata: name: tls-example-ingress spec: tls: - - hosts: sslexample.foo.com + - hosts: + - sslexample.foo.com secretName: testsecret-tls rules: - host: sslexample.foo.com From cc6a7fdc4e345d41eff245e3b321f25c3e24ac67 Mon Sep 17 00:00:00 2001 From: JoeWrightss <42261994+JoeWrightss@users.noreply.github.com> Date: Tue, 20 Nov 2018 05:03:29 +0800 Subject: [PATCH 144/222] fix typo and update punctuation (#11028) --- ...-Weekly-Kubernetes-Community-Hangout_11.md | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/content/en/blog/_posts/2015-04-00-Weekly-Kubernetes-Community-Hangout_11.md b/content/en/blog/_posts/2015-04-00-Weekly-Kubernetes-Community-Hangout_11.md index 12b880dc61..3228a3bf5a 100644 --- a/content/en/blog/_posts/2015-04-00-Weekly-Kubernetes-Community-Hangout_11.md +++ b/content/en/blog/_posts/2015-04-00-Weekly-Kubernetes-Community-Hangout_11.md @@ -8,95 +8,95 @@ Every week the Kubernetes contributing community meet virtually over Google Hang Agenda: -* kubectl tooling, rolling update, deployments, imperative commands -* Downward API / env. substitution, and maybe preconditions/dependencies +* kubectl tooling, rolling update, deployments, imperative commands. +* Downward API / env. substitution, and maybe preconditions/dependencies. **Notes from meeting:** 1\. kubectl improvements -* make it simpler to use, finish rolling update, higher-level deployment concepts +* make it simpler to use, finish rolling update, higher-level deployment concepts. * rolling update * today - * can replace one rc by another rc specified by a file + * can replace one rc by another rc specified by a file. - * no explicit support for rollback, can sort of do it by doing rolling update to old version + * no explicit support for rollback, can sort of do it by doing rolling update to old version. - * we keep annotations on rcs to keep track of desired # instances; won't work for rollback case b/c not symmetric + * we keep annotations on rcs to keep track of desired # instances; won't work for rollback case b/c not symmetric. - * need immutable image ids; currently no uuid that corresponds to image,version so if someone pushes on top you'll re-pull that; in API server we should translate images into uuids (as close to edge as possible) + * need immutable image ids; currently no uuid that corresponds to image,version so if someone pushes on top you'll re-pull that; in API server we should translate images into uuids (as close to edge as possible). - * would be nice to auto-gen new rc instead of having user update it (e.g. when change image tag for container, etc.; currently need to change rc name and label value; could automate generating new rc) + * would be nice to auto-gen new rc instead of having user update it (e.g. when change image tag for container, etc.; currently need to change rc name and label value; could automate generating new rc). - * treating rcs as pets vs. cattle + * treating rcs as pets vs. cattle. * "roll me from v1 to v2" (or v2 to v1) - good enough for most people. don't care about record of what happened in the past. * we're providing the module ansible can call to make something happen. - * how do you keep track of multiple templates; today we use multiple RCs + * how do you keep track of multiple templates; today we use multiple RCs. - * if we had a deployment controller ; deployment config spawns pos that runs rolling update; trigger is level-based update of image repository + * if we had a deployment controller; deployment config spawns pos that runs rolling update; trigger is level-based update of image repository. - * alternative short-term proposal: create new rc as clone of old one, futz with counts so new one is old one and vv, bring prev-named one (pet) down to zero and bring it back up with new template (this is very similar to how Borg does job updates) - * is it worthwhile if we want to have the deployments anyway? yes b/c we have lots of concepts already; need to simplify + * alternative short-term proposal: create new rc as clone of old one, futz with counts so new one is old one and vv, bring prev-named one (pet) down to zero and bring it back up with new template (this is very similar to how Borg does job updates). + * is it worthwhile if we want to have the deployments anyway? Yes b/c we have lots of concepts already; need to simplify. - * deployment controller keeps track of multiple templates which is what you need for rolling updates and canaries + * deployment controller keeps track of multiple templates which is what you need for rolling updates and canaries. * only reason for new thing is to move the process into the server instead of the client? - * may not need to make it an API object; should provide experience where it's not an API object and is just something client side + * may not need to make it an API object; should provide experience where it's not an API object and is just something client side. - * need an experience now so need to do it in client because object won't land before 1.0 + * need an experience now so need to do it in client because object won't land before 1.0. - * having simplified experience for people who only want to enageg w/ RCs + * having simplified experience for people who only want to enageg w/ RCs. * how does rollback work: ctrl-c, rollout v2 v1. rollback pattern can be in person's head. 2 kinds of rollback: i'm at steady state and want to go back, and i've got canary deployment and hit ctrl-c how do i get rid of the canary deployment (e.g. new is failing). ctrl-c might not work. delete canary controller and its pods. wish there was a command to also delete pods (there is -- kbectl stop). argument for not reusing name: when you move fwd you can stop the new thing and you're ok, vs. if you replace the old one and you've created a copy if you hit ctrl-c you don't have anything you can stop. but you could wait to flip the name until the end, use naming convention so can figure out what is going on, etc. - * two different experiences: (1) i'm using version control, have version history of last week rollout this week, rolling update with two files -> create v2, ??? v1, don't have a pet - moved into world of version control where have cumulative history and; (1) imperative kubectl v1 v2 where sys takes care of details, that's where we use the snapshot pattern + * two different experiences: (1) i'm using version control, have version history of last week rollout this week, rolling update with two files -> create v2, ??? v1, don't have a pet - moved into world of version control where have cumulative history and; (1) imperative kubectl v1 v2 where sys takes care of details, that's where we use the snapshot pattern. * other imperative commands * run-container (or just run): spec command on command line which makes it more similar to docker run; but not multi-container pods. - * \--forever vs. not (one shot exec via simple commad) + * \--forever vs. not (one shot exec via simple command). * would like it go interactive - run -it and runs in cluster but you have interactive terminal to your process. * how do command line args work. could say --image multiple times. will cobra support? in openshift we have clever syntax for grouping arguments together. doesn't work for real structured parameters. - * alternative: create pod; add container add container ...; run pod -- build and don't run object until 'run pod' + * alternative: create pod; add container add container ...; run pod -- build and don't run object until 'run pod'. - * \-- to separate container args + * \-- to separate container args. - * create a pod, mutate it before you run it - like initializer pattern + * create a pod, mutate it before you run it - like initializer pattern. * kind discovery - * if we have run and sometimes it creates an rc and sometimes it doesn't, how does user know what to delete if they want to delete whatever they created with run + * if we have run and sometimes it creates an rc and sometimes it doesn't, how does user know what to delete if they want to delete whatever they created with run. - * bburns has proposal for don't specify kind if you do command like stop, delete; let kubectl figure it out + * bburns has proposal for don't specify kind if you do command like stop, delete; let kubectl figure it out. - * alternative: allow you to define alias from name to set of resource types, eg. delete all which would follow that alias (all could mean everything in some namespace, or unscoped, etc.) - someone explicitly added something to a set vs. accidentally showed up like nodes + * alternative: allow you to define alias from name to set of resource types, eg. delete all which would follow that alias (all could mean everything in some namespace, or unscoped, etc.) - someone explicitly added something to a set vs. accidentally showed up like nodes. * would like to see extended to allow tools to specify their own aliases (not just users); e.g. resize can say i can handle RCs, delete can say I can handle everything, et.c so we can automatically do these things w/o users have to specify stuff. but right mechanism. - * resourcebuilder has conept of doing that kind of expansion depending on how we fit in targeted commands. for instance if you want to add a volume to pods and rcs, you need something to go find the pod template and change it. there's the search part of it (delete nginx -> you have to figure out what object they are referring to) and then command can say i got a pod i know what to do with a pod. + * resourcebuilder has concept of doing that kind of expansion depending on how we fit in targeted commands. for instance if you want to add a volume to pods and rcs, you need something to go find the pod template and change it. there's the search part of it (delete nginx -> you have to figure out what object they are referring to) and then command can say i got a pod i know what to do with a pod. * alternative heuristic: what if default target of all commands was deployments. kubectl run -> deployment. too much work, easier to clean up existing CLI. leave door open for that. macro objects OK but a lot more work to make that work. eventually will want index to make these efficient. could rely more on swagger to tell us types. 2\. paul/downward api: env substitution - * create ad-hoc env var like strings, e.g. k8s_pod_name that would get sub'd by system in objects - * allow people to create env vars that refer to fields of k8s objects w/o query api from inside their container; in some caes enables query api from their container (e.g. pass obj names, namespaces); e.g. sidecar containers need this for pulling things from api server + * create ad-hoc env var like strings, e.g. k8s_pod_name that would get sub'd by system in objects. + * allow people to create env vars that refer to fields of k8s objects w/o query api from inside their container; in some cases enables query api from their container (e.g. pass obj names, namespaces); e.g. sidecar containers need this for pulling things from api server. * another proposal similar: instead of env var like names, have JSON-path-like syntax for referring to object field names; e.g. $.[metadata.name][1] to refer to name of current object, maybe have some syntax for referring to related objects like node that a pod is on. advantage of JSON path-like syntax is that it's less ad hoc. disadvantage is that you can only refer to things that are fields of objects. * for both, if you populate env vars then you have drawback that fields only set when container is created. but least degree of coupling -- off the shelf containers, containers don't need to know how to talk to k8s API. keeps the k8s concepts in the control plane. * we were converging on JSON path like approach. but need prototype or at least deeper proposal to demo. * paul: one variant is for env vars in addition to value field have different sources which is where you would plug in e.g. syntax you use to describe a field of an object; another source would be a source that described info about the host. have partial prototype. clean separation between what's in image vs. control plane. could use source idea for volume plugin. - * use case: provide info for sidecar container to contact API server - * use case: pass down unique identifiers or things like using UID as nique identifier - * clayton: for rocket or gce metadata service being available for every pod for more sophisticated things; most containers want to find endpoint of service, + * use case: provide info for sidecar container to contact API server. + * use case: pass down unique identifiers or things like using UID as unique identifier. + * clayton: for rocket or gce metadata service being available for every pod for more sophisticated things; most containers want to find endpoint of service. 3\. preconditions/dependencies @@ -104,8 +104,8 @@ Agenda: * infer automatically if we ask people to declare which env vars they wanted, or have dep mech at pod or rc or obj level to say this obj doesn't become active until this other thing exists. * can use event hook? only app owner knows their dependency or when service is ready to serve. * one proposal is to use pre-start hook. another is precondition probe - pre-start hook could do a probe. does anything respond when i hit this svc address or ip, then probe fails. could be implemented in pre-start hook. more useful than post-start. is part of rkt spec. has stages 0, 1, 2. hard to do in docker today, easy in rocket. -* pre-start hook in container: how will affect readiness probe since the container might have a lock until some arbitrary condition is met if you implement with prestart hook. there has to be some compensation on when kubelet runs readiness/liveness probes if you have a hook. systemd has timeouts around the stages of process lifecycle. -* if we go to black box model of container pre-start makes sense; if container spec becomes more descriptive of process model like systemd, then does kubelet need to know more about process model to do the right thing +* pre-start hook in container: how will affect readiness probe since the container might have a lock until some arbitrary condition is met if you implement with prestart hook. there has to be some compensation on when kubelet runs readiness/liveness probes if you have a hook. Systemd has timeouts around the stages of process lifecycle. +* if we go to black box model of container pre-start makes sense; if container spec becomes more descriptive of process model like systemd, then does kubelet need to know more about process model to do the right thing. * ideally msg from inside the container to say i've done all of my pre-start actions. sdnotify for systemd does this. you tell systemd that you're done, it will communicate to other deps that you're alive. * but... someone could just implement preconds inside their container. makes it easier to adapt an app w/o having to change their image. alternative is just have a pattern how they do it themselves but we don't do it for them. From d3eaeef3fc2f3362355686f2f5ae18a1bbd63552 Mon Sep 17 00:00:00 2001 From: Qiming Date: Tue, 20 Nov 2018 05:05:13 +0800 Subject: [PATCH 145/222] Reorder concepts sections (#11032) Order after this PR: overview: 20 architecture: 30 containers: 40 workloads: 50 service-networking: 60 storage: 70 configuration: 80 policy: 90 cluster-administration: 100 extend-kubernetes: 110 Closes: #8570 --- content/en/docs/concepts/cluster-administration/_index.md | 4 ++-- content/en/docs/concepts/configuration/_index.md | 2 +- content/en/docs/concepts/containers/_index.md | 2 +- content/en/docs/concepts/extend-kubernetes/_index.md | 2 +- content/en/docs/concepts/policy/_index.md | 2 +- content/en/docs/concepts/services-networking/_index.md | 2 +- content/en/docs/concepts/storage/_index.md | 2 +- content/en/docs/concepts/workloads/_index.md | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/content/en/docs/concepts/cluster-administration/_index.md b/content/en/docs/concepts/cluster-administration/_index.md index cdef77a4dd..72af40feec 100755 --- a/content/en/docs/concepts/cluster-administration/_index.md +++ b/content/en/docs/concepts/cluster-administration/_index.md @@ -1,5 +1,5 @@ --- -title: "Compute, Storage, and Networking Extensions" -weight: 30 +title: "Cluster Administration" +weight: 100 --- diff --git a/content/en/docs/concepts/configuration/_index.md b/content/en/docs/concepts/configuration/_index.md index 00cf8e8c0f..1635c2a5bf 100755 --- a/content/en/docs/concepts/configuration/_index.md +++ b/content/en/docs/concepts/configuration/_index.md @@ -1,5 +1,5 @@ --- title: "Configuration" -weight: 70 +weight: 80 --- diff --git a/content/en/docs/concepts/containers/_index.md b/content/en/docs/concepts/containers/_index.md index 5800f8a310..ad442f3ab3 100755 --- a/content/en/docs/concepts/containers/_index.md +++ b/content/en/docs/concepts/containers/_index.md @@ -1,5 +1,5 @@ --- title: "Containers" -weight: 50 +weight: 40 --- diff --git a/content/en/docs/concepts/extend-kubernetes/_index.md b/content/en/docs/concepts/extend-kubernetes/_index.md index db04ba3e77..93d955441d 100644 --- a/content/en/docs/concepts/extend-kubernetes/_index.md +++ b/content/en/docs/concepts/extend-kubernetes/_index.md @@ -1,4 +1,4 @@ --- title: Extending Kubernetes -weight: 40 +weight: 110 --- diff --git a/content/en/docs/concepts/policy/_index.md b/content/en/docs/concepts/policy/_index.md index 4305fa559d..41d91de546 100755 --- a/content/en/docs/concepts/policy/_index.md +++ b/content/en/docs/concepts/policy/_index.md @@ -1,5 +1,5 @@ --- title: "Policies" -weight: 160 +weight: 90 --- diff --git a/content/en/docs/concepts/services-networking/_index.md b/content/en/docs/concepts/services-networking/_index.md index f4c379d88c..eea2c65b33 100755 --- a/content/en/docs/concepts/services-networking/_index.md +++ b/content/en/docs/concepts/services-networking/_index.md @@ -1,5 +1,5 @@ --- title: "Services, Load Balancing, and Networking" -weight: 80 +weight: 60 --- diff --git a/content/en/docs/concepts/storage/_index.md b/content/en/docs/concepts/storage/_index.md index 8d38e78dd6..7e0dd19b12 100755 --- a/content/en/docs/concepts/storage/_index.md +++ b/content/en/docs/concepts/storage/_index.md @@ -1,5 +1,5 @@ --- title: "Storage" -weight: 90 +weight: 70 --- diff --git a/content/en/docs/concepts/workloads/_index.md b/content/en/docs/concepts/workloads/_index.md index 702bdc6ee9..ca394ebd00 100644 --- a/content/en/docs/concepts/workloads/_index.md +++ b/content/en/docs/concepts/workloads/_index.md @@ -1,5 +1,5 @@ --- title: "Workloads" -weight: 60 +weight: 50 --- From 9a34fa470dae6c533a32b07af1ef324712c54375 Mon Sep 17 00:00:00 2001 From: Karen Bradshaw Date: Mon, 19 Nov 2018 20:54:07 -0500 Subject: [PATCH 146/222] fix typo ref contrib (#11096) --- .../kubernetes-components.md | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/content/en/docs/contribute/generate-ref-docs/kubernetes-components.md b/content/en/docs/contribute/generate-ref-docs/kubernetes-components.md index 0ec38e8de6..b19f060714 100644 --- a/content/en/docs/contribute/generate-ref-docs/kubernetes-components.md +++ b/content/en/docs/contribute/generate-ref-docs/kubernetes-components.md @@ -12,7 +12,6 @@ reference documentation for tools and components in the {{% /capture %}} - {{% capture prerequisites %}} * You need a machine that is running Linux or macOS. @@ -36,7 +35,6 @@ information, see {{% /capture %}} - {{% capture steps %}} ## Getting two repositories @@ -115,9 +113,8 @@ need to work with someone who can set the label and milestone for you. ## Overview of update-imported-docs -The website repository contains a `update-imported-docs` tool under the -`kubernetes/website/update-imported-docs/` directory that performs the -following steps: +The `update-imported-docs` tool is located in the `kubernetes/website/update-imported-docs/` +directory. The tool performs the following steps: 1. Clones the related repositories specified in a configuration file. For the purpose of generating reference docs, the repositories that are cloned by @@ -134,8 +131,8 @@ to `kubernetes/website`. ## Customizing the config file -Open `/update-imported-docs/reference.yaml` for editing. -Do not change the content for the `generate-command` entry unless you undertand +Open `/update-imported-docs/reference.yml` for editing. +Do not change the content for the `generate-command` entry unless you understand what it is doing and need to change the specified release branch. ```shell @@ -159,8 +156,9 @@ repos: make comp ``` -The `update-imported-docs` tool uses `src` and `dst` fields in a configuration -to decide the source and target location for doc files to be copied. +In reference.yml, the `files` field is a list of `src` and `dst` fields. The `src` field +specifies the location of a generated Markdown file, and the `dst` field specifies +where to copy this file in the cloned `kubernetes/website` repository. For example: ```yaml @@ -240,6 +238,4 @@ topics will be visible in the * [Generating Reference Documentation for the Kubernetes API](/docs/home/contribute/generated-reference/kubernetes-api/) * [Generating Reference Documentation for the Kubernetes Federation API](/docs/home/contribute/generated-reference/federation-api/) -{{% /capture %}} - - +{{% /capture %}} \ No newline at end of file From 2e6b158841c7d1e5985c90d337d17c50fc9e8847 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Tue, 20 Nov 2018 10:07:20 +0800 Subject: [PATCH 147/222] Create cronjob.yaml --- .../zh/examples/application/job/cronjob.yaml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 content/zh/examples/application/job/cronjob.yaml diff --git a/content/zh/examples/application/job/cronjob.yaml b/content/zh/examples/application/job/cronjob.yaml new file mode 100644 index 0000000000..c9d3893027 --- /dev/null +++ b/content/zh/examples/application/job/cronjob.yaml @@ -0,0 +1,18 @@ +apiVersion: batch/v1beta1 +kind: CronJob +metadata: + name: hello +spec: + schedule: "*/1 * * * *" + jobTemplate: + spec: + template: + spec: + containers: + - name: hello + image: busybox + args: + - /bin/sh + - -c + - date; echo Hello from the Kubernetes cluster + restartPolicy: OnFailure From 090695a109d488495656c29b84d0e59acac013c4 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Tue, 20 Nov 2018 11:08:13 +0800 Subject: [PATCH 148/222] zx-trans: add pods/_index.md (#11090) zx-trans: add pods/_index.md --- content/zh/docs/concepts/workloads/pods/_index.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 content/zh/docs/concepts/workloads/pods/_index.md diff --git a/content/zh/docs/concepts/workloads/pods/_index.md b/content/zh/docs/concepts/workloads/pods/_index.md new file mode 100644 index 0000000000..3b714c7ff5 --- /dev/null +++ b/content/zh/docs/concepts/workloads/pods/_index.md @@ -0,0 +1,12 @@ + + +--- +title: "Pods" +weight: 10 +--- + From 58737dff9b1d85da207c05821410f24974e3d036 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Tue, 20 Nov 2018 11:16:10 +0800 Subject: [PATCH 149/222] zh-trans: add workloads/controllers/_index (#11089) zh-trans: add workloads/controllers/_index --- .../zh/docs/concepts/workloads/controllers/_index.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 content/zh/docs/concepts/workloads/controllers/_index.md diff --git a/content/zh/docs/concepts/workloads/controllers/_index.md b/content/zh/docs/concepts/workloads/controllers/_index.md new file mode 100644 index 0000000000..87407c0336 --- /dev/null +++ b/content/zh/docs/concepts/workloads/controllers/_index.md @@ -0,0 +1,11 @@ + + +--- +title: "鎺у埗鍣" +weight: 20 +--- From 1a32c06228ca9e8c1cdbd0e53869365577a0ffa6 Mon Sep 17 00:00:00 2001 From: Qiming Date: Tue, 20 Nov 2018 11:32:34 +0800 Subject: [PATCH 150/222] Delete cronjob.yaml --- .../zh/examples/apllication/job/cronjob.yaml | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 content/zh/examples/apllication/job/cronjob.yaml diff --git a/content/zh/examples/apllication/job/cronjob.yaml b/content/zh/examples/apllication/job/cronjob.yaml deleted file mode 100644 index c9d3893027..0000000000 --- a/content/zh/examples/apllication/job/cronjob.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: batch/v1beta1 -kind: CronJob -metadata: - name: hello -spec: - schedule: "*/1 * * * *" - jobTemplate: - spec: - template: - spec: - containers: - - name: hello - image: busybox - args: - - /bin/sh - - -c - - date; echo Hello from the Kubernetes cluster - restartPolicy: OnFailure From 27ce5a8c8f605e7ef734f3f0501d13591adbf580 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Tue, 20 Nov 2018 11:32:49 +0800 Subject: [PATCH 151/222] zh-trans: Add manage-resources/cpu-constraint-namespace.md (#11042) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * zh-trans: Add zh/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace.md zh-trans: Add zh/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace.md * Fixes due to review. Fixes due to review. * fix due to review 鏈涓-銆嬪仛涓 * Update cpu-constraint-namespace.md * Create cpu-constraints.yaml * Create cpu-constraints-pod.yaml * Create cpu-constraints-pod-2.yaml * Create cpu-constraints-pod-3.yaml * Create cpu-constraints-pod-4.yaml * Update cpu-constraint-namespace.md --- .../cpu-constraint-namespace.md | 462 ++++++++++++++++++ .../admin/resource/cpu-constraints-pod-2.yaml | 13 + .../admin/resource/cpu-constraints-pod-3.yaml | 13 + .../admin/resource/cpu-constraints-pod-4.yaml | 8 + .../admin/resource/cpu-constraints-pod.yaml | 13 + .../admin/resource/cpu-constraints.yaml | 11 + 6 files changed, 520 insertions(+) create mode 100644 content/zh/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace.md create mode 100644 content/zh/examples/admin/resource/cpu-constraints-pod-2.yaml create mode 100644 content/zh/examples/admin/resource/cpu-constraints-pod-3.yaml create mode 100644 content/zh/examples/admin/resource/cpu-constraints-pod-4.yaml create mode 100644 content/zh/examples/admin/resource/cpu-constraints-pod.yaml create mode 100644 content/zh/examples/admin/resource/cpu-constraints.yaml diff --git a/content/zh/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace.md b/content/zh/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace.md new file mode 100644 index 0000000000..41f6af4b29 --- /dev/null +++ b/content/zh/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace.md @@ -0,0 +1,462 @@ + + +--- +title: 涓哄懡鍚嶇┖闂撮厤缃瓹PU鏈灏忓拰鏈澶ч檺鍒 +content_template: templates/task +weight: 40 +--- + + +{{% capture overview %}} + + + +鏈珷浠嬬粛鍛藉悕绌洪棿涓彲浠ヨ瀹瑰櫒鍜孭od浣跨敤鐨凜PU璧勬簮鐨勬渶灏忓拰鏈澶у笺備綘鍙互閫氳繃 [LimitRange](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#limitrange-v1-core) 瀵硅薄澹版槑 CPU 鐨勬渶灏忓拰鏈澶у. 濡傛灉 Pod 涓嶈兘婊¤冻 LimitRange 鐨勯檺鍒讹紝瀹冨氨涓嶈兘鍦ㄥ懡鍚嶇┖闂翠腑鍒涘缓銆 + +{{% /capture %}} + + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + + + +浣犵殑闆嗙兢涓瘡涓妭鐐硅嚦灏戣鏈1涓狢PU銆 + +{{% /capture %}} + + +{{% capture steps %}} + + + +## 鍒涘缓鍛藉悕绌洪棿 + +鍒涘缓涓涓懡鍚嶇┖闂达紝浠ヤ究鏈粌涔犱腑鍒涘缓鐨勮祫婧愬拰闆嗙兢鐨勫叾浣欒祫婧愮浉闅旂銆 + +```shell +kubectl create namespace constraints-cpu-example +``` + + + +## 鍒涘缓 LimitRange 鍜 Pod + +杩欓噷缁欏嚭浜 LimitRange 鐨勯厤缃枃浠讹細 + +{{< codenew file="admin/resource/cpu-constraints.yaml" >}} + + + +鍒涘缓 LimitRange: + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/cpu-constraints.yaml --namespace=constraints-cpu-example +``` + + + +鏌ョ湅 LimitRange 璇︽儏锛 + +```shell +kubectl get limitrange cpu-min-max-demo-lr --output=yaml --namespace=constraints-cpu-example +``` + + + +杈撳嚭缁撴灉鏄剧ず CPU 鐨勬渶灏忓拰鏈澶ч檺鍒剁鍚堥鏈熴備絾闇瑕佹敞鎰忕殑鏄紝灏界浣犲湪 LimitRange 鐨勯厤缃枃浠朵腑浣犳病鏈夊0鏄庨粯璁ゅ硷紝榛樿鍊间篃浼氳鑷姩鍒涘缓銆 + +```yaml +limits: +- default: + cpu: 800m + defaultRequest: + cpu: 800m + max: + cpu: 800m + min: + cpu: 200m + type: Container +``` + + + +鐜板湪涓嶇浠涔堟椂鍊欏湪 constraints-cpu-example 鍛藉悕绌洪棿涓垱寤哄鍣紝Kubernetes 閮戒細鎵ц涓嬮潰杩欎簺姝ラ锛 + +* 濡傛灉瀹瑰櫒娌℃湁澹版槑鑷繁鐨 CPU 璇锋眰鍜岄檺鍒讹紝灏嗕负瀹瑰櫒鎸囧畾榛樿 CPU 璇锋眰鍜岄檺鍒躲 + +* 鏍告煡瀹瑰櫒澹版槑鐨 CPU 璇锋眰纭繚鍏跺ぇ浜庢垨鑰呯瓑浜200 millicpu銆 + +* 鏍告煡瀹瑰櫒澹版槑鐨 CPU 闄愬埗纭繚鍏跺皬浜庢垨鑰呯瓑浜800 millicpu銆 + + +{{< note >}} 褰撳垱寤 LimitRange 瀵硅薄鏃讹紝浣犱篃鍙互澹版槑 huge-page 鍜 GPU 鐨勯檺鍒躲傚綋杩欎簺璧勬簮鍚屾椂澹版槑浜 'default' 鍜 鈥榙efaultRequest鈥 鍙傛暟鏃讹紝涓や釜鍙傛暟鍊煎繀椤荤浉鍚屻 {{< /note >}} + + + + + + + +杩欓噷缁欏嚭浜嗗寘鍚竴涓鍣ㄧ殑 Pod 鐨勯厤缃枃浠躲傝瀹瑰櫒澹版槑浜500 millicpu鐨 CPU 璇锋眰鍜800 millicpu鐨 CPU 闄愬埗銆傝繖浜涘弬鏁版弧瓒充簡 LimitRange 瀵硅薄瑙勫畾鐨 CPU 鏈灏忓拰鏈澶ч檺鍒躲 + +{{< codenew file="admin/resource/cpu-constraints-pod.yaml" >}} + + + +鍒涘缓Pod锛 + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/cpu-constraints-pod.yaml --namespace=constraints-cpu-example +``` + + + +纭涓涓 Pod 涓殑瀹瑰櫒鍦ㄨ繍琛岋細 + +```shell +kubectl get pod constraints-cpu-demo --namespace=constraints-cpu-example +``` + + + +鏌ョ湅 Pod 鐨勮鎯咃細 + +```shell +kubectl get pod constraints-cpu-demo --output=yaml --namespace=constraints-cpu-example +``` + + + +杈撳嚭缁撴灉琛ㄦ槑瀹瑰櫒鐨 CPU 璇锋眰涓500 millicpu锛孋PU闄愬埗涓800 millicpu銆傝繖浜涘弬鏁版弧瓒 LimitRange 瑙勫畾鐨勯檺鍒惰寖鍥淬 + +```yaml +resources: + limits: + cpu: 800m + requests: + cpu: 500m +``` + + + +## 鍒犻櫎 Pod + +```shell +kubectl delete pod constraints-cpu-demo --namespace=constraints-cpu-example +``` + + + +## 灏濊瘯鍒涘缓涓涓秴杩囨渶澶 CPU 闄愬埗鐨 Pod + +杩欓噷缁欏嚭浜嗗寘鍚竴涓鍣ㄧ殑 Pod 鐨勯厤缃枃浠躲傚鍣ㄥ0鏄庝簡500 millicpu鐨凜PU璇锋眰鍜1.5 cpu鐨 CPU 闄愬埗銆 + +{{< codenew file="admin/resource/cpu-constraints-pod-2.yaml" >}} + + + +灏濊瘯鍒涘缓 Pod锛 + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-2.yaml --namespace=constraints-cpu-example +``` + + + +杈撳嚭缁撴灉琛ㄦ槑 Pod 娌℃湁鍒涘缓鎴愬姛锛屽洜涓哄鍣ㄥ0鏄庣殑 CPU 闄愬埗澶ぇ浜嗭細 + +``` +Error from server (Forbidden): error when creating "examples/admin/resource/cpu-constraints-pod-2.yaml": +pods "constraints-cpu-demo-2" is forbidden: maximum cpu usage per Container is 800m, but limit is 1500m. +``` + + + +## 灏濊瘯鍒涘缓涓涓笉婊¤冻鏈灏 CPU 璇锋眰鐨 Pod + +杩欓噷缁欏嚭浜嗗寘鍚竴涓鍣ㄧ殑 Pod 鐨勯厤缃枃浠躲傝瀹瑰櫒澹版槑浜100 millicpu鐨 CPU 璇锋眰鍜800 millicpu鐨 CPU 闄愬埗銆 + +{{< codenew file="admin/resource/cpu-constraints-pod-3.yaml" >}} + + + +灏濊瘯鍒涘缓 Pod锛 + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-3.yaml --namespace=constraints-cpu-example +``` + + + +杈撳嚭缁撴灉鏄剧ず Pod 娌℃湁鍒涘缓鎴愬姛锛屽洜涓哄鍣ㄥ0鏄庣殑 CPU 璇锋眰澶皬浜嗭細 + +``` +Error from server (Forbidden): error when creating "examples/admin/resource/cpu-constraints-pod-3.yaml": +pods "constraints-cpu-demo-4" is forbidden: minimum cpu usage per Container is 200m, but request is 100m. +``` + + + +## 鍒涘缓涓涓病鏈夊0鏄嶤PU璇锋眰鍜孋PU闄愬埗鐨凱od + +杩欓噷缁欏嚭浜嗗寘鍚竴涓鍣ㄧ殑Pod鐨勯厤缃枃浠躲傝瀹瑰櫒娌℃湁澹版槑CPU璇锋眰鍜孋PU闄愬埗銆 + +{{< codenew file="admin/resource/cpu-constraints-pod-4.yaml" >}} + + + +鍒涘缓 Pod锛 + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-4.yaml --namespace=constraints-cpu-example +``` + + + +鏌ョ湅 Pod 鐨勮鎯咃細 + +``` +kubectl get pod constraints-cpu-demo-4 --namespace=constraints-cpu-example --output=yaml +``` + + + +杈撳嚭缁撴灉鏄剧ず Pod 鐨勫鍣ㄦ湁涓800 millicpu鐨 CPU 璇锋眰鍜800 millicpu鐨 CPU 闄愬埗銆傚鍣ㄦ椂鎬庢牱寰楀埌閭d簺鍊肩殑鍛紵 + +```yaml +resources: + limits: + cpu: 800m + requests: + cpu: 800m +``` + + + +鍥犱负浣犵殑瀹瑰櫒娌℃湁澹版槑鑷繁鐨 CPU 璇锋眰鍜岄檺鍒讹紝LimitRange 缁欏畠鎸囧畾浜哰榛樿鐨凜PU璇锋眰鍜岄檺鍒禲(/docs/tasks/administer-cluster/cpu-default-namespace/) + + + +姝ゆ椂锛屼綘鐨勫鍣ㄥ彲鑳借繍琛屼篃鍙兘娌℃湁杩愯銆傚洖鎯充竴涓嬶紝鏈换鍔$殑鍏堝喅鏉′欢鏄綘鐨勮妭鐐硅鏈1 涓 CPU銆傚鏋滀綘鐨勬瘡涓妭鐐逛粎鏈1涓 CPU锛岄偅涔堝彲鑳芥病鏈変换浣曚竴涓妭鐐瑰彲浠ユ弧瓒800 millicpu鐨 CPU 璇锋眰銆傚鏋滀綘鍦ㄧ敤鐨勮妭鐐规伆濂芥湁涓や釜 CPU锛岄偅涔堜綘鎵嶅彲鑳芥湁瓒冲鐨 CPU鏉ユ弧瓒800 millicpu鐨勮姹傘 + +``` +kubectl delete pod constraints-cpu-demo-4 --namespace=constraints-cpu-example +``` + + + +## CPU 鏈灏忓拰鏈澶ч檺鍒剁殑寮哄埗鎵ц + +鍙湁褰揚od鍒涘缓鎴栬呮洿鏂版椂锛孡imitRange涓哄懡鍚嶇┖闂磋瀹氱殑CPU鏈灏忓拰鏈澶ч檺鍒舵墠浼氳寮哄埗鎵ц銆傚鏋滀綘瀵筁imitRange杩涜淇敼锛岄偅涓嶄細褰卞搷姝ゅ墠鍒涘缓鐨凱od銆 + + + +## 鏈灏忓拰鏈澶 CPU 闄愬埗鑼冨洿鐨勫姩鏈 + + + +浣滀负闆嗙兢绠$悊鍛橈紝浣犲彲鑳芥兂璁惧畾 Pod 鍙互浣跨敤鐨 CPU 璧勬簮闄愬埗銆備緥濡傦細 + + + +* 闆嗙兢涓殑姣忎釜鑺傜偣鏈変袱涓 CPU銆備綘涓嶆兂鎺ュ彈浠讳綍璇锋眰瓒呰繃2涓 CPU 鐨 Pod锛屽洜涓洪泦缇や腑娌℃湁鑺傜偣鍙互鏀寔杩欑璇锋眰銆 + +* 浣犵殑鐢熶骇鍜屽紑鍙戦儴闂ㄥ叡浜竴涓泦缇ゃ備綘鎯冲厑璁哥敓浜у伐浣滆礋杞芥秷鑰3涓 CPU锛岃屽紑鍙戝伐浣滆礋杞界殑娑堣楅檺鍒朵负1涓 CPU銆備綘涓虹敓浜у拰寮鍙戝垱寤轰笉鍚岀殑鍛藉悕绌洪棿锛屽苟涓斾綘涓烘瘡涓懡鍚嶇┖闂撮兘搴旂敤浜 CPU 闄愬埗銆 + + + +## 鐜娓呯悊 + +鍒犻櫎浣犵殑鍛藉悕绌洪棿锛 + +```shell +kubectl delete namespace constraints-cpu-example +``` + +{{% /capture %}} + +{{% capture whatsnext %}} + + + +### 闆嗙兢绠$悊鍛樺弬鑰冿細 + +* [涓哄懡鍚嶇┖闂撮厤缃粯璁ゅ唴瀛樿姹傚拰闄愬埗](/docs/tasks/administer-cluster/memory-default-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃唴瀛橀檺鍒剁殑鏈灏忓煎拰鏈澶у糫(/docs/tasks/administer-cluster/memory-constraint-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃瓹PU闄愬埗鐨勬渶灏忓煎拰鏈澶у糫(/docs/tasks/administer-cluster/cpu-constraint-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃唴瀛樺拰CPU閰嶉](/docs/tasks/administer-cluster/quota-memory-cpu-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃甈od閰嶉](/docs/tasks/administer-cluster/quota-pod-namespace/) + +* [涓篈PI瀵硅薄閰嶇疆閰嶉](/docs/tasks/administer-cluster/quota-api-object/) + + + +### 搴旂敤寮鍙戣呭弬鑰冿細 + +* [涓哄鍣ㄥ拰Pod鍒嗛厤鍐呭瓨璧勬簮](/docs/tasks/configure-pod-container/assign-memory-resource/) + +* [涓哄鍣ㄥ拰Pod鍒嗛厤CPU璧勬簮](/docs/tasks/configure-pod-container/assign-cpu-resource/) + +* [涓篜od閰嶇疆Service鏁伴噺](/docs/tasks/configure-pod-container/quality-service-pod/) + +{{% /capture %}} + + + + + diff --git a/content/zh/examples/admin/resource/cpu-constraints-pod-2.yaml b/content/zh/examples/admin/resource/cpu-constraints-pod-2.yaml new file mode 100644 index 0000000000..b5c7348f26 --- /dev/null +++ b/content/zh/examples/admin/resource/cpu-constraints-pod-2.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Pod +metadata: + name: constraints-cpu-demo-2 +spec: + containers: + - name: constraints-cpu-demo-2-ctr + image: nginx + resources: + limits: + cpu: "1.5" + requests: + cpu: "500m" diff --git a/content/zh/examples/admin/resource/cpu-constraints-pod-3.yaml b/content/zh/examples/admin/resource/cpu-constraints-pod-3.yaml new file mode 100644 index 0000000000..896d98ec2f --- /dev/null +++ b/content/zh/examples/admin/resource/cpu-constraints-pod-3.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Pod +metadata: + name: constraints-cpu-demo-4 +spec: + containers: + - name: constraints-cpu-demo-4-ctr + image: nginx + resources: + limits: + cpu: "800m" + requests: + cpu: "100m" diff --git a/content/zh/examples/admin/resource/cpu-constraints-pod-4.yaml b/content/zh/examples/admin/resource/cpu-constraints-pod-4.yaml new file mode 100644 index 0000000000..3c102158db --- /dev/null +++ b/content/zh/examples/admin/resource/cpu-constraints-pod-4.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Pod +metadata: + name: constraints-cpu-demo-4 +spec: + containers: + - name: constraints-cpu-demo-4-ctr + image: vish/stress diff --git a/content/zh/examples/admin/resource/cpu-constraints-pod.yaml b/content/zh/examples/admin/resource/cpu-constraints-pod.yaml new file mode 100644 index 0000000000..7db23f26c8 --- /dev/null +++ b/content/zh/examples/admin/resource/cpu-constraints-pod.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Pod +metadata: + name: constraints-cpu-demo +spec: + containers: + - name: constraints-cpu-demo-ctr + image: nginx + resources: + limits: + cpu: "800m" + requests: + cpu: "500m" diff --git a/content/zh/examples/admin/resource/cpu-constraints.yaml b/content/zh/examples/admin/resource/cpu-constraints.yaml new file mode 100644 index 0000000000..6fc4239027 --- /dev/null +++ b/content/zh/examples/admin/resource/cpu-constraints.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: LimitRange +metadata: + name: cpu-min-max-demo-lr +spec: + limits: + - max: + cpu: "800m" + min: + cpu: "200m" + type: Container From 703336cacd0d0cbf8061d86252b59b2a670e4e2c Mon Sep 17 00:00:00 2001 From: Daniel Bastos Date: Tue, 20 Nov 2018 01:34:24 -0200 Subject: [PATCH 152/222] Improve overall sentence clearness and understanding (#11102) --- content/en/docs/concepts/services-networking/service.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/concepts/services-networking/service.md b/content/en/docs/concepts/services-networking/service.md index 7b747a6a79..02aa47ff5d 100644 --- a/content/en/docs/concepts/services-networking/service.md +++ b/content/en/docs/concepts/services-networking/service.md @@ -324,8 +324,8 @@ DNS server watches the Kubernetes API for new `Services` and creates a set of DNS records for each. If DNS has been enabled throughout the cluster then all `Pods` should be able to do name resolution of `Services` automatically. -For example, if you have a `Service` called `"my-service"` in Kubernetes -`Namespace` `"my-ns"` a DNS record for `"my-service.my-ns"` is created. `Pods` +For example, if you have a `Service` called `"my-service"` in a Kubernetes +`Namespace` called `"my-ns"`, a DNS record for `"my-service.my-ns"` is created. `Pods` which exist in the `"my-ns"` `Namespace` should be able to find it by simply doing a name lookup for `"my-service"`. `Pods` which exist in other `Namespaces` must qualify the name as `"my-service.my-ns"`. The result of these name lookups is the From db774186b57e1cd9a9cc766a313533b95a2b7337 Mon Sep 17 00:00:00 2001 From: gparvind Date: Tue, 20 Nov 2018 10:25:24 +0530 Subject: [PATCH 153/222] yaml code formatting fix for v1.12.0-rc.1 changelog (#11105) --- content/en/docs/setup/release/notes.md | 147 +++++++++++++------------ 1 file changed, 77 insertions(+), 70 deletions(-) diff --git a/content/en/docs/setup/release/notes.md b/content/en/docs/setup/release/notes.md index b7301f7e58..c79d745f1b 100644 --- a/content/en/docs/setup/release/notes.md +++ b/content/en/docs/setup/release/notes.md @@ -167,76 +167,83 @@ filename | sha256 hash ### Action Required * Service events are now added in azure-cloud-provider for easily identify the underground errors of Azure API. ([#68212](https://github.com/kubernetes/kubernetes/pull/68212), [@feiskyer](https://github.com/feiskyer)) - * Action required: The following clusterrole and clusterrolebinding should be applied: - * kind: List - * apiVersion: v1 - * items: - * - apiVersion: rbac.authorization.k8s.io/v1 - * kind: ClusterRole - * metadata: - * labels: - * kubernetes.io/cluster-service: "true" - * name: system:azure-cloud-provider - * rules: - * - apiGroups: [""] - * resources: ["events"] - * verbs: - * - create - * - patch - * - update - * - apiVersion: rbac.authorization.k8s.io/v1 - * kind: ClusterRoleBinding - * metadata: - * labels: - * kubernetes.io/cluster-service: "true" - * name: system:azure-cloud-provider - * roleRef: - * apiGroup: rbac.authorization.k8s.io - * kind: ClusterRole - * name: system:azure-cloud-provider - * subjects: - * - kind: ServiceAccount - * name: azure-cloud-provider - * namespace: kube-system - * If the clusterrole with same has already been provisioned (e.g. for accessing azurefile secrets), then the above yaml should be merged togather, e.g. - * kind: List - * apiVersion: v1 - * items: - * - apiVersion: rbac.authorization.k8s.io/v1 - * kind: ClusterRole - * metadata: - * labels: - * kubernetes.io/cluster-service: "true" - * name: system:azure-cloud-provider - * rules: - * - apiGroups: [""] - * resources: ["events"] - * verbs: - * - create - * - patch - * - update - * - apiGroups: [""] - * resources: ["secrets"] - * verbs: - * - get - * - create - * - apiVersion: rbac.authorization.k8s.io/v1 - * kind: ClusterRoleBinding - * metadata: - * labels: - * kubernetes.io/cluster-service: "true" - * name: system:azure-cloud-provider - * roleRef: - * apiGroup: rbac.authorization.k8s.io - * kind: ClusterRole - * name: system:azure-cloud-provider - * subjects: - * - kind: ServiceAccount - * name: azure-cloud-provider - * namespace: kube-system - * - kind: ServiceAccount - * name: persistent-volume-binder - * namespace: kube-system + * Action required: The following clusterrole and clusterrolebinding should be applied: + + ```yaml + kind: List + apiVersion: v1 + items: + - apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRole + metadata: + labels: + kubernetes.io/cluster-service: "true" + name: system:azure-cloud-provider + rules: + - apiGroups: [""] + resources: ["events"] + verbs: + - create + - patch + - update + - apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRoleBinding + metadata: + labels: + kubernetes.io/cluster-service: "true" + name: system:azure-cloud-provider + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:azure-cloud-provider + subjects: + - kind: ServiceAccount + name: azure-cloud-provider + namespace: kube-system + ``` + + * If the clusterrole with same has already been provisioned (e.g. for accessing azurefile secrets), then the above yaml should be merged together, e.g. + + ```yaml + kind: List + apiVersion: v1 + items: + - apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRole + metadata: + labels: + kubernetes.io/cluster-service: "true" + name: system:azure-cloud-provider + rules: + - apiGroups: [""] + resources: ["events"] + verbs: + - create + - patch + - update + - apiGroups: [""] + resources: ["secrets"] + verbs: + - get + - create + - apiVersion: rbac.authorization.k8s.io/v1 + kind: ClusterRoleBinding + metadata: + labels: + kubernetes.io/cluster-service: "true" + name: system:azure-cloud-provider + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:azure-cloud-provider + subjects: + - kind: ServiceAccount + name: azure-cloud-provider + namespace: kube-system + - kind: ServiceAccount + name: persistent-volume-binder + namespace: kube-system + ``` ### Other notable changes From 6fb9a555a771836091f5fd4c815987e9aa2b943c Mon Sep 17 00:00:00 2001 From: AdamDang Date: Tue, 20 Nov 2018 13:30:21 +0800 Subject: [PATCH 154/222] zh-trans: add memory-constraint-namespace.md (#11045) * zh-trans: add memory-constraint-namespace.md zh-trans: add memory-constraint-namespace.md * Update memory-constraint-namespace.md * Create memory-constraints.yaml * Create memory-constraints-pod.yaml * Create memory-constraints-pod-2.yaml * Create memory-constraints-pod-3.yaml * Create memory-constraints-pod-4.yaml --- .../memory-constraint-namespace.md | 447 ++++++++++++++++++ .../resource/memory-constraints-pod-2.yaml | 13 + .../resource/memory-constraints-pod-3.yaml | 13 + .../resource/memory-constraints-pod-4.yaml | 9 + .../resource/memory-constraints-pod.yaml | 13 + .../admin/resource/memory-constraints.yaml | 11 + 6 files changed, 506 insertions(+) create mode 100644 content/zh/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace.md create mode 100644 content/zh/examples/admin/resource/memory-constraints-pod-2.yaml create mode 100644 content/zh/examples/admin/resource/memory-constraints-pod-3.yaml create mode 100644 content/zh/examples/admin/resource/memory-constraints-pod-4.yaml create mode 100644 content/zh/examples/admin/resource/memory-constraints-pod.yaml create mode 100644 content/zh/examples/admin/resource/memory-constraints.yaml diff --git a/content/zh/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace.md b/content/zh/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace.md new file mode 100644 index 0000000000..84149f2b1e --- /dev/null +++ b/content/zh/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace.md @@ -0,0 +1,447 @@ + + +--- +title: 閰嶇疆鍛藉悕绌洪棿鐨勬渶灏忓拰鏈澶у唴瀛樼害鏉 +content_template: templates/task +weight: 30 +--- + +{{% capture overview %}} + + + +姝ら〉闈粙缁嶅浣曡缃湪鍛藉悕绌洪棿涓繍琛岀殑瀹瑰櫒浣跨敤鐨勫唴瀛樼殑鏈灏忓煎拰鏈澶у笺 鎮ㄥ彲浠ュ湪 [LimitRange](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#limitrange-v1-core)瀵硅薄涓寚瀹氭渶灏忓拰鏈澶у唴瀛樺笺 濡傛灉 Pod 涓嶆弧瓒 LimitRange 鏂藉姞鐨勭害鏉燂紝鍒欐棤娉曞湪鍛藉悕绌洪棿涓垱寤哄畠銆 + +{{% /capture %}} + + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + + + +闆嗙兢涓瘡涓妭鐐瑰繀椤昏嚦灏戣鏈1 GiB 鐨勫唴瀛樸 + +{{% /capture %}} + + +{{% capture steps %}} + + + +## 鍒涘缓鍛藉悕绌洪棿 + +鍒涘缓涓涓懡鍚嶇┖闂达紝浠ヤ究鍦ㄦ缁冧範涓垱寤虹殑璧勬簮涓庣兢闆嗙殑鍏朵綑璧勬簮闅旂銆 + +```shell +kubectl create namespace constraints-mem-example +``` + + + +## 鍒涘缓 LimitRange 鍜 Pod + +涓嬮潰鏄 LimitRange 鐨勯厤缃枃浠讹細 + + +{{< codenew file="admin/resource/memory-constraints.yaml" >}} + + + +鍒涘缓 LimitRange: + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/memory-constraints.yaml --namespace=constraints-mem-example +``` + + + +鏌ョ湅 LimitRange 鐨勮鎯咃細 + +```shell +kubectl get limitrange mem-min-max-demo-lr --namespace=constraints-mem-example --output=yaml +``` + + + +杈撳嚭鏄剧ず棰勬湡鐨勬渶灏忓拰鏈澶у唴瀛樼害鏉熴 浣嗚娉ㄦ剰锛屽嵆浣挎偍娌℃湁鍦 LimitRange 鐨勯厤缃枃浠朵腑鎸囧畾榛樿鍊硷紝涔熶細鑷姩鍒涘缓瀹冧滑銆 + +``` + limits: + - default: + memory: 1Gi + defaultRequest: + memory: 1Gi + max: + memory: 1Gi + min: + memory: 500Mi + type: Container +``` + + + +鐜板湪锛屽彧瑕佸湪 constraints-mem-example 鍛藉悕绌洪棿涓垱寤哄鍣紝Kubernetes 灏变細鎵ц涓嬮潰鐨勬楠わ細 + +* 濡傛灉 Container 鏈寚瀹氳嚜宸辩殑鍐呭瓨璇锋眰鍜岄檺鍒讹紝灏嗕负瀹冩寚瀹氶粯璁ょ殑鍐呭瓨璇锋眰鍜岄檺鍒躲 + +* 楠岃瘉 Container 鐨勫唴瀛樿姹傛槸鍚﹀ぇ浜庢垨绛変簬500 MiB銆 + +* 楠岃瘉 Container 鐨勫唴瀛橀檺鍒舵槸鍚﹀皬浜庢垨绛変簬1 GiB銆 + +杩欓噷缁欏嚭浜嗗寘鍚竴涓 Container 鐨 Pod 閰嶇疆鏂囦欢銆侰ontainer 澹版槑浜600 MiB 鐨勫唴瀛樿姹傚拰800 MiB 鐨勫唴瀛橀檺鍒讹紝 杩欎簺婊¤冻浜 LimitRange 鏂藉姞鐨勬渶灏忓拰鏈澶у唴瀛樼害鏉熴 + +{{< codenew file="admin/resource/memory-constraints-pod.yaml" >}} + + + +鍒涘缓 Pod锛 + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/memory-constraints-pod.yaml --namespace=constraints-mem-example +``` + + + +纭涓 Pod 涓殑瀹瑰櫒鍦ㄨ繍琛岋細 + +```shell +kubectl get pod constraints-mem-demo --namespace=constraints-mem-example +``` + + + +鏌ョ湅 Pod 璇︽儏锛 + +```shell +kubectl get pod constraints-mem-demo --output=yaml --namespace=constraints-mem-example +``` + + + +杈撳嚭缁撴灉鏄剧ず瀹瑰櫒鐨勫唴瀛樿姹備负600 MiB锛屽唴瀛橀檺鍒朵负800 MiB銆傝繖浜涙弧瓒充簡 LimitRange 璁惧畾鐨勯檺鍒惰寖鍥淬 + +```yaml +resources: + limits: + memory: 800Mi + requests: + memory: 600Mi +``` + + + +鍒犻櫎浣犲垱寤虹殑 Pod锛 + +```shell +kubectl delete pod constraints-mem-demo --namespace=constraints-mem-example +``` + + + +## 灏濊瘯鍒涘缓涓涓秴杩囨渶澶у唴瀛橀檺鍒剁殑 Pod + +杩欓噷缁欏嚭浜嗗寘鍚竴涓鍣ㄧ殑 Pod 鐨勯厤缃枃浠躲傚鍣ㄥ0鏄庝簡800 MiB 鐨勫唴瀛樿姹傚拰1.5 GiB 鐨勫唴瀛橀檺鍒躲 + +{{< codenew file="admin/resource/memory-constraints-pod-2.yaml" >}} + + + +灏濊瘯鍒涘缓 Pod: + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/memory-constraints-pod-2.yaml --namespace=constraints-mem-example +``` + + + +杈撳嚭缁撴灉鏄剧ず Pod 娌℃湁鍒涘缓鎴愬姛锛屽洜涓哄鍣ㄥ0鏄庣殑鍐呭瓨闄愬埗澶ぇ浜嗭細 + +``` +Error from server (Forbidden): error when creating "examples/admin/resource/memory-constraints-pod-2.yaml": +pods "constraints-mem-demo-2" is forbidden: maximum memory usage per Container is 1Gi, but limit is 1536Mi. +``` + + + +## 灏濊瘯鍒涘缓涓涓笉婊¤冻鏈灏忓唴瀛樿姹傜殑 Pod + +杩欓噷缁欏嚭浜嗗寘鍚竴涓鍣ㄧ殑 Pod 鐨勯厤缃枃浠躲傚鍣ㄥ0鏄庝簡100 MiB 鐨勫唴瀛樿姹傚拰800 MiB 鐨勫唴瀛橀檺鍒躲 + +{{< codenew file="admin/resource/memory-constraints-pod-3.yaml" >}} + + + +灏濊瘯鍒涘缓 Pod锛 + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/memory-constraints-pod-3.yaml --namespace=constraints-mem-example +``` + + + +杈撳嚭缁撴灉鏄剧ず Pod 娌℃湁鍒涘缓鎴愬姛锛屽洜涓哄鍣ㄥ0鏄庣殑鍐呭瓨璇锋眰澶皬浜嗭細 + +``` +Error from server (Forbidden): error when creating "examples/admin/resource/memory-constraints-pod-3.yaml": +pods "constraints-mem-demo-3" is forbidden: minimum memory usage per Container is 500Mi, but request is 100Mi. +``` + + + +## 鍒涘缓涓涓病鏈夊0鏄庡唴瀛樿姹傚拰闄愬埗鐨 Pod + +杩欓噷缁欏嚭浜嗗寘鍚竴涓鍣ㄧ殑 Pod 鐨勯厤缃枃浠躲傚鍣ㄦ病鏈夊0鏄庡唴瀛樿姹傦紝涔熸病鏈夊0鏄庡唴瀛橀檺鍒躲 + +{{< codenew file="admin/resource/memory-constraints-pod-4.yaml" >}} + + + +鍒涘缓 Pod锛 + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/memory-constraints-pod-4.yaml --namespace=constraints-mem-example +``` + + + +鏌ョ湅 Pod 璇︽儏锛 + +``` +kubectl get pod constraints-mem-demo-4 --namespace=constraints-mem-example --output=yaml +``` + + + +杈撳嚭缁撴灉鏄剧ず Pod 鐨勫唴瀛樿姹備负1 GiB锛屽唴瀛橀檺鍒朵负1 GiB銆傚鍣ㄦ庢牱鑾峰緱鍝簺鏁板煎憿锛 + +``` +resources: + limits: + memory: 1Gi + requests: + memory: 1Gi +``` + + + +鍥犱负浣犵殑瀹瑰櫒娌℃湁澹版槑鑷繁鐨勫唴瀛樿姹傚拰闄愬埗锛屽畠浠 LimitRange 閭i噷鑾峰緱浜哰榛樿鐨勫唴瀛樿姹傚拰闄愬埗](/docs/tasks/administer-cluster/memory-default-namespace/)銆 + + + +姝ゆ椂锛屼綘鐨勫鍣ㄥ彲鑳借繍琛岃捣鏉ヤ篃鍙兘娌℃湁杩愯璧锋潵銆傚洖鎯充竴涓嬫垜浠湰娆′换鍔$殑鍏堝喅鏉′欢鏄綘鐨勬瘡涓妭鐐归兘鑷冲皯鏈1 GiB 鐨勫唴瀛樸傚鏋滀綘鐨勬瘡涓妭鐐归兘鍙湁1 GiB 鐨勫唴瀛橈紝閭e皢娌℃湁涓涓妭鐐规嫢鏈夎冻澶熺殑鍙垎閰嶅唴瀛樻潵婊¤冻1 GiB 鐨勫唴瀛樿姹傘 + +鍒犻櫎浣犵殑 Pod锛 + +``` +kubectl delete pod constraints-mem-demo-4 --namespace=constraints-mem-example +``` + + + +## 寮哄埗鎵ц鍐呭瓨鏈灏忓拰鏈澶ч檺鍒 + +LimitRange 涓哄懡鍚嶇┖闂磋瀹氱殑鏈灏忓拰鏈澶у唴瀛橀檺鍒跺彧鏈夊湪 Pod 鍒涘缓鍜屾洿鏂版椂鎵嶄細寮哄埗鎵ц銆傚鏋滀綘鏇存柊 LimitRange锛屽畠涓嶄細褰卞搷姝ゅ墠鍒涘缓鐨 Pod銆 + + + +## 璁剧疆鍐呭瓨鏈灏忓拰鏈澶ч檺鍒剁殑鍔ㄥ洜 + + + +鍋氫负闆嗙兢绠$悊鍛橈紝浣犲彲鑳芥兂瑙勫畾 Pod 鍙互浣跨敤鐨勫唴瀛樻婚噺闄愬埗銆備緥濡傦細 + +* 闆嗙兢鐨勬瘡涓妭鐐规湁2 GB 鍐呭瓨銆備綘涓嶆兂鎺ュ彈浠讳綍璇锋眰瓒呰繃2 GB 鐨 Pod锛屽洜涓洪泦缇や腑娌℃湁鑺傜偣鍙互婊¤冻銆 + + + +## 鏁版嵁娓呯悊 + +鍒犻櫎浣犵殑鍛藉悕绌洪棿锛 + +```shell +kubectl delete namespace constraints-mem-example +``` + +{{% /capture %}} + +{{% capture whatsnext %}} + + + +### 闆嗙兢绠$悊鍛樺弬鑰 + +* [涓哄懡鍚嶇┖闂撮厤缃粯璁ゅ唴瀛樿姹傚拰闄愬埗](/docs/tasks/administer-cluster/memory-default-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃唴瀛橀檺鍒剁殑鏈灏忓煎拰鏈澶у糫(/docs/tasks/administer-cluster/memory-constraint-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃 CPU 闄愬埗鐨勬渶灏忓煎拰鏈澶у糫(/docs/tasks/administer-cluster/cpu-constraint-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃唴瀛樺拰 CPU 閰嶉](/docs/tasks/administer-cluster/quota-memory-cpu-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃 Pod 閰嶉](/docs/tasks/administer-cluster/quota-pod-namespace/) + +* [涓 API 瀵硅薄閰嶇疆閰嶉](/docs/tasks/administer-cluster/quota-api-object/) + + + +### 搴旂敤寮鍙戣呭弬鑰 + +* [涓哄鍣ㄥ拰 Pod 鍒嗛厤鍐呭瓨璧勬簮](/docs/tasks/configure-pod-container/assign-memory-resource/) + +* [涓哄鍣ㄥ拰 Pod 鍒嗛厤 CPU 璧勬簮](/docs/tasks/configure-pod-container/assign-cpu-resource/) + +* [涓 Pod 閰嶇疆 Service 鏁伴噺](/docs/tasks/configure-pod-container/quality-service-pod/) + +{{% /capture %}} + + + + + diff --git a/content/zh/examples/admin/resource/memory-constraints-pod-2.yaml b/content/zh/examples/admin/resource/memory-constraints-pod-2.yaml new file mode 100644 index 0000000000..0b1ae569c4 --- /dev/null +++ b/content/zh/examples/admin/resource/memory-constraints-pod-2.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Pod +metadata: + name: constraints-mem-demo-2 +spec: + containers: + - name: constraints-mem-demo-2-ctr + image: nginx + resources: + limits: + memory: "1.5Gi" + requests: + memory: "800Mi" diff --git a/content/zh/examples/admin/resource/memory-constraints-pod-3.yaml b/content/zh/examples/admin/resource/memory-constraints-pod-3.yaml new file mode 100644 index 0000000000..f97cd4a8ac --- /dev/null +++ b/content/zh/examples/admin/resource/memory-constraints-pod-3.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Pod +metadata: + name: constraints-mem-demo-3 +spec: + containers: + - name: constraints-mem-demo-3-ctr + image: nginx + resources: + limits: + memory: "800Mi" + requests: + memory: "100Mi" diff --git a/content/zh/examples/admin/resource/memory-constraints-pod-4.yaml b/content/zh/examples/admin/resource/memory-constraints-pod-4.yaml new file mode 100644 index 0000000000..657530c41e --- /dev/null +++ b/content/zh/examples/admin/resource/memory-constraints-pod-4.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Pod +metadata: + name: constraints-mem-demo-4 +spec: + containers: + - name: constraints-mem-demo-4-ctr + image: nginx + diff --git a/content/zh/examples/admin/resource/memory-constraints-pod.yaml b/content/zh/examples/admin/resource/memory-constraints-pod.yaml new file mode 100644 index 0000000000..06954d10d6 --- /dev/null +++ b/content/zh/examples/admin/resource/memory-constraints-pod.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Pod +metadata: + name: constraints-mem-demo +spec: + containers: + - name: constraints-mem-demo-ctr + image: nginx + resources: + limits: + memory: "800Mi" + requests: + memory: "600Mi" diff --git a/content/zh/examples/admin/resource/memory-constraints.yaml b/content/zh/examples/admin/resource/memory-constraints.yaml new file mode 100644 index 0000000000..3a2924c032 --- /dev/null +++ b/content/zh/examples/admin/resource/memory-constraints.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: LimitRange +metadata: + name: mem-min-max-demo-lr +spec: + limits: + - max: + memory: 1Gi + min: + memory: 500Mi + type: Container From 0b05bbbbc7dcf4861bdcb26a30e87707029ed060 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Tue, 20 Nov 2018 13:31:55 +0800 Subject: [PATCH 155/222] zh_trans: add quota-memory-cpu-namespace.md (#11047) * zh_trans: add quota-memory-cpu-namespace.md zh_trans: add quota-memory-cpu-namespace.md * Create quota-mem-cpu.yaml * Create quota-mem-cpu-pod.yaml * Create quota-mem-cpu-pod-2.yaml * Fixes due to review --- .../quota-memory-cpu-namespace.md | 306 ++++++++++++++++++ .../admin/resource/quota-mem-cpu-pod-2.yaml | 16 + .../admin/resource/quota-mem-cpu-pod.yaml | 16 + .../admin/resource/quota-mem-cpu.yaml | 10 + 4 files changed, 348 insertions(+) create mode 100644 content/zh/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace.md create mode 100644 content/zh/examples/admin/resource/quota-mem-cpu-pod-2.yaml create mode 100644 content/zh/examples/admin/resource/quota-mem-cpu-pod.yaml create mode 100644 content/zh/examples/admin/resource/quota-mem-cpu.yaml diff --git a/content/zh/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace.md b/content/zh/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace.md new file mode 100644 index 0000000000..146d5edf13 --- /dev/null +++ b/content/zh/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace.md @@ -0,0 +1,306 @@ + + +--- +title: 涓哄懡鍚嶇┖闂撮厤缃唴瀛樺拰 CPU 閰嶉 +content_template: templates/task +weight: 50 +--- + + +{{% capture overview %}} + + + +鏈枃浠嬬粛鎬庢牱涓哄懡鍚嶇┖闂磋缃鍣ㄥ彲鐢ㄧ殑鍐呭瓨鍜 CPU 鎬婚噺銆備綘鍙互閫氳繃 [ResourceQuota](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#resourcequota-v1-core) +瀵硅薄璁剧疆閰嶉. + + +{{% /capture %}} + + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + + + +闆嗙兢涓瘡涓妭鐐硅嚦灏戞湁1 GiB鐨勫唴瀛樸 + +{{% /capture %}} + + +{{% capture steps %}} + + + +## 鍒涘缓鍛藉悕绌洪棿 + +鍒涘缓涓涓懡鍚嶇┖闂达紝浠ヤ究鏈粌涔犱腑鍒涘缓鐨勮祫婧愬拰闆嗙兢鐨勫叾浣欓儴鍒嗙浉闅旂銆 + +```shell +kubectl create namespace quota-mem-cpu-example +``` + + + +## 鍒涘缓 ResourceQuota + +杩欓噷缁欏嚭涓涓 ResourceQuota 瀵硅薄鐨勯厤缃枃浠讹細 + +{{< codenew file="admin/resource/quota-mem-cpu.yaml" >}} + + + +鍒涘缓 ResourceQuota + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/quota-mem-cpu.yaml --namespace=quota-mem-cpu-example +``` + + + +鏌ョ湅 ResourceQuota 璇︽儏锛 + +```shell +kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml +``` + + + +ResourceQuota 鍦 quota-mem-cpu-example 鍛藉悕绌洪棿涓缃簡濡備笅瑕佹眰锛 + +* 姣忎釜瀹瑰櫒蹇呴』鏈夊唴瀛樿姹傚拰闄愬埗锛屼互鍙 CPU 璇锋眰鍜岄檺鍒躲 +* 鎵鏈夊鍣ㄧ殑鍐呭瓨璇锋眰鎬诲拰涓嶈兘瓒呰繃1 GiB銆 +* 鎵鏈夊鍣ㄧ殑鍐呭瓨闄愬埗鎬诲拰涓嶈兘瓒呰繃2 GiB銆 +* 鎵鏈夊鍣ㄧ殑 CPU 璇锋眰鎬诲拰涓嶈兘瓒呰繃1 cpu銆 +* 鎵鏈夊鍣ㄧ殑 CPU 闄愬埗鎬诲拰涓嶈兘瓒呰繃2 cpu銆 + + + +## 鍒涘缓 Pod + +杩欓噷缁欏嚭 Pod 鐨勯厤缃枃浠讹細 + +{{< codenew file="admin/resource/quota-mem-cpu-pod.yaml" >}} + + + + +鍒涘缓 Pod锛 + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/quota-mem-cpu-pod.yaml --namespace=quota-mem-cpu-example +``` + + + +妫鏌ヤ笅 Pod 涓殑瀹瑰櫒鍦ㄨ繍琛岋細 + +``` +kubectl get pod quota-mem-cpu-demo --namespace=quota-mem-cpu-example +``` + + + +鍐嶆煡鐪 ResourceQuota 鐨勮鎯咃細 + +``` +kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml +``` + + + +杈撳嚭缁撴灉鏄剧ず浜嗛厤棰濅互鍙婃湁澶氬皯閰嶉宸茬粡琚娇鐢ㄣ備綘鍙互鐪嬪埌 Pod 鐨勫唴瀛樺拰 CPU 璇锋眰鍊煎強闄愬埗鍊兼病鏈夎秴杩囬厤棰濄 + +``` +status: + hard: + limits.cpu: "2" + limits.memory: 2Gi + requests.cpu: "1" + requests.memory: 1Gi + used: + limits.cpu: 800m + limits.memory: 800Mi + requests.cpu: 400m + requests.memory: 600Mi +``` + + + +## 灏濊瘯鍒涘缓绗簩涓 Pod + +杩欓噷缁欏嚭浜嗙浜屼釜 Pod 鐨勯厤缃枃浠讹細 + +{{< codenew file="admin/resource/quota-mem-cpu-pod-2.yaml" >}} + + + +閰嶇疆鏂囦欢涓紝浣犲彲浠ョ湅鍒 Pod 鐨勫唴瀛樿姹備负700 MiB銆傝娉ㄦ剰鏂扮殑鍐呭瓨璇锋眰涓庡凡缁忎娇鐢ㄧ殑鍐呭瓨璇锋眰鍙拰瓒呰繃浜嗗唴瀛樿姹傜殑閰嶉銆600 MiB + 700 MiB > 1 GiB銆 + +灏濊瘯鍒涘缓 Pod锛 + +```shell +kubectl create -f https://k8s.io/examples/admin/resource/quota-mem-cpu-pod-2.yaml --namespace=quota-mem-cpu-example +``` + + + +绗簩涓 Pod 涓嶈兘琚垱寤烘垚鍔熴傝緭鍑虹粨鏋滄樉绀哄垱寤虹浜屼釜 Pod 浼氬鑷村唴瀛樿姹傛婚噺瓒呰繃鍐呭瓨璇锋眰閰嶉銆 + +``` +Error from server (Forbidden): error when creating "examples/admin/resource/quota-mem-cpu-pod-2.yaml": +pods "quota-mem-cpu-demo-2" is forbidden: exceeded quota: mem-cpu-demo, +requested: requests.memory=700Mi,used: requests.memory=600Mi, limited: requests.memory=1Gi +``` + + + +## 璁ㄨ + +濡備綘鍦ㄦ湰缁冧範涓墍瑙侊紝浣犲彲浠ョ敤 ResourceQuota 闄愬埗鍛藉悕绌洪棿涓墍鏈夊鍣ㄧ殑鍐呭瓨璇锋眰鎬婚噺銆傚悓鏍蜂綘涔熷彲浠ラ檺鍒跺唴瀛橀檺鍒舵婚噺銆丆PU 璇锋眰鎬婚噺銆丆PU 闄愬埗鎬婚噺銆 + +濡傛灉浣犳兂瀵瑰崟涓鍣ㄨ屼笉鏄墍鏈夊鍣ㄨ繘琛岄檺鍒讹紝灏辫浣跨敤 [LimitRange](/docs/tasks/administer-cluster/memory-constraint-namespace/)銆 + + + +## 鏁版嵁娓呯悊 + +鍒犻櫎浣犵殑鍛藉悕绌洪棿锛 + +```shell +kubectl delete namespace quota-mem-cpu-example +``` + +{{% /capture %}} + +{{% capture whatsnext %}} + + + +### 闆嗙兢绠$悊鍛樺弬鑰 + +* [涓哄懡鍚嶇┖闂撮厤缃粯璁ゅ唴瀛樿姹傚拰闄愬埗](/docs/tasks/administer-cluster/memory-default-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃唴瀛橀檺鍒剁殑鏈灏忓煎拰鏈澶у糫(/docs/tasks/administer-cluster/memory-constraint-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃 CPU 闄愬埗鐨勬渶灏忓煎拰鏈澶у糫(/docs/tasks/administer-cluster/cpu-constraint-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃唴瀛樺拰 CPU 閰嶉](/docs/tasks/administer-cluster/quota-memory-cpu-namespace/) + +* [涓哄懡鍚嶇┖闂撮厤缃 Pod 閰嶉](/docs/tasks/administer-cluster/quota-pod-namespace/) + +* [涓 API 瀵硅薄閰嶇疆閰嶉](/docs/tasks/administer-cluster/quota-api-object/) + + + +### 搴旂敤寮鍙戣呭弬鑰 + +* [涓哄鍣ㄥ拰 Pod 鍒嗛厤鍐呭瓨璧勬簮](/docs/tasks/configure-pod-container/assign-memory-resource/) + +* [涓哄鍣ㄥ拰 Pod 鍒嗛厤CPU璧勬簮](/docs/tasks/configure-pod-container/assign-cpu-resource/) + +* [涓 Pod 閰嶇疆 Service 鏁伴噺](/docs/tasks/configure-pod-container/quality-service-pod/) + +{{% /capture %}} + + + + + diff --git a/content/zh/examples/admin/resource/quota-mem-cpu-pod-2.yaml b/content/zh/examples/admin/resource/quota-mem-cpu-pod-2.yaml new file mode 100644 index 0000000000..22726c600a --- /dev/null +++ b/content/zh/examples/admin/resource/quota-mem-cpu-pod-2.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Pod +metadata: + name: quota-mem-cpu-demo-2 +spec: + containers: + - name: quota-mem-cpu-demo-2-ctr + image: redis + resources: + limits: + memory: "1Gi" + cpu: "800m" + requests: + memory: "700Mi" + cpu: "400m" + diff --git a/content/zh/examples/admin/resource/quota-mem-cpu-pod.yaml b/content/zh/examples/admin/resource/quota-mem-cpu-pod.yaml new file mode 100644 index 0000000000..ba27bf5ccf --- /dev/null +++ b/content/zh/examples/admin/resource/quota-mem-cpu-pod.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Pod +metadata: + name: quota-mem-cpu-demo +spec: + containers: + - name: quota-mem-cpu-demo-ctr + image: nginx + resources: + limits: + memory: "800Mi" + cpu: "800m" + requests: + memory: "600Mi" + cpu: "400m" + diff --git a/content/zh/examples/admin/resource/quota-mem-cpu.yaml b/content/zh/examples/admin/resource/quota-mem-cpu.yaml new file mode 100644 index 0000000000..5c4bcd81b8 --- /dev/null +++ b/content/zh/examples/admin/resource/quota-mem-cpu.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: ResourceQuota +metadata: + name: mem-cpu-demo +spec: + hard: + requests.cpu: "1" + requests.memory: 1Gi + limits.cpu: "2" + limits.memory: 2Gi From 59c47128073867c65db23717d1982bd5ed278846 Mon Sep 17 00:00:00 2001 From: Kayce Basques Date: Tue, 20 Nov 2018 05:44:49 -0800 Subject: [PATCH 156/222] add feedback widget to bottom of docs (#11037) --- content/en/docs/home/_index.md | 1 + layouts/docs/baseof.html | 46 + sass/_base.sass | 16 + static/css/case-study-styles.css | 2644 +++++++++++++++++++++++++- static/css/case-study-styles.css.map | 8 +- static/css/styles.css | 2514 +++++++++++++++++++++++- static/css/styles.css.map | 8 +- 7 files changed, 5219 insertions(+), 18 deletions(-) diff --git a/content/en/docs/home/_index.md b/content/en/docs/home/_index.md index 7f6b94a122..c385c17780 100644 --- a/content/en/docs/home/_index.md +++ b/content/en/docs/home/_index.md @@ -11,6 +11,7 @@ display_browse_numbers: true linkTitle: "Home" main_menu: true weight: 10 +hide_feedback: true menu: main: title: "Documentation" diff --git a/layouts/docs/baseof.html b/layouts/docs/baseof.html index 1d353c7f7b..6e8dcd7e85 100644 --- a/layouts/docs/baseof.html +++ b/layouts/docs/baseof.html @@ -16,6 +16,52 @@ {{ block "side-menu" . }}{{ end }}
    {{ block "content" . }}{{ end }} + {{ if not .Params.hide_feedback }} +

    Feedback

    + + + + + + {{ end }}
    - +

    Code of Conduct

    The Kubernetes community values respect and inclusiveness, and @@ -46,8 +37,8 @@ cid: community an event or meeting, in Slack, or in another communication mechanism, reach out to the Kubernetes Code of Conduct Committee conduct@kubernetes.io. - Your anonymity will be protected.

    -

    + Your anonymity will be protected. +

    From b8b71b6845a88989184e17d9939312398c3a044f Mon Sep 17 00:00:00 2001 From: RA489 Date: Mon, 26 Nov 2018 12:03:51 +0530 Subject: [PATCH 190/222] fix ssh-tunneling link (#11299) * Update master-node-communication.md * Update master-node-communication.md --- .../en/docs/concepts/architecture/master-node-communication.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/architecture/master-node-communication.md b/content/en/docs/concepts/architecture/master-node-communication.md index 0314197bc4..7c6b3a9f1c 100644 --- a/content/en/docs/concepts/architecture/master-node-communication.md +++ b/content/en/docs/concepts/architecture/master-node-communication.md @@ -77,7 +77,7 @@ To verify this connection, use the `--kubelet-certificate-authority` flag to provide the apiserver with a root certificate bundle to use to verify the kubelet's serving certificate. -If that is not possible, use [SSH tunneling](/docs/concepts/architecture/master-node-communication/#ssh-tunnels) +If that is not possible, use [SSH tunneling](/docs/tasks/access-application-cluster/port-forward-access-application-cluster/) between the apiserver and kubelet if required to avoid connecting over an untrusted or public network. From 26368ca74bffc4e0298cce2b809bbac0fe37805a Mon Sep 17 00:00:00 2001 From: Linus Lee <708863861@qq.com> Date: Mon, 26 Nov 2018 22:05:40 +0800 Subject: [PATCH 191/222] Fix concept directory display problem (#11317) --- content/zh/docs/concepts/_index.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/content/zh/docs/concepts/_index.md b/content/zh/docs/concepts/_index.md index 891e8b764a..dae8d1bb9c 100644 --- a/content/zh/docs/concepts/_index.md +++ b/content/zh/docs/concepts/_index.md @@ -1,10 +1,3 @@ - - --- title: 姒傚康 main_menu: true @@ -12,6 +5,13 @@ content_template: templates/concept weight: 40 --- + + {{% capture overview %}} From 7c04f85d15d23a2ae71e052bf82b41c0f196e63e Mon Sep 17 00:00:00 2001 From: Orlando Date: Mon, 26 Nov 2018 19:42:52 -0600 Subject: [PATCH 192/222] Fix typo on serviceName (#11329) --- content/en/docs/concepts/services-networking/ingress.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/services-networking/ingress.md b/content/en/docs/concepts/services-networking/ingress.md index 9af5f44794..b6d52c6376 100644 --- a/content/en/docs/concepts/services-networking/ingress.md +++ b/content/en/docs/concepts/services-networking/ingress.md @@ -139,7 +139,7 @@ Each http rule contains the following information: * An optional host. In this example, no host is specified, so the rule will apply to all inbound HTTP traffic through the IP address that will be connected. If a host is provided, for example: foo.bar.com, the rules will apply on to that host. -* a list of paths (e.g.: /testpath) each of which has an associated backend defined with a `serivceName` +* a list of paths (e.g.: /testpath) each of which has an associated backend defined with a `serviceName` and `servicePort`. Both the host and path must match the content of an incoming request before the loadbalancer will direct traffic to the referenced service. * A backend is a combination of service and port names as described in the From 14eb3e0e929803b8ebbf5339b5c9b55daef10284 Mon Sep 17 00:00:00 2001 From: zqm19941101 Date: Tue, 27 Nov 2018 12:34:10 +0800 Subject: [PATCH 193/222] fix typo: controlle->controller (#11342) --- .../_posts/2015-12-00-Creating-Raspberry-Pi-Cluster-Running.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/blog/_posts/2015-12-00-Creating-Raspberry-Pi-Cluster-Running.md b/content/en/blog/_posts/2015-12-00-Creating-Raspberry-Pi-Cluster-Running.md index 4589efaa51..cabd719e49 100644 --- a/content/en/blog/_posts/2015-12-00-Creating-Raspberry-Pi-Cluster-Running.md +++ b/content/en/blog/_posts/2015-12-00-Creating-Raspberry-Pi-Cluster-Running.md @@ -69,7 +69,7 @@ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -a17784253dd2 gcr.io/google\_containers/hyperkube-arm:v1.1.2 "/hyperkube controlle" 2 hours ago Up 2 hours k8s\_controller-manager.7042038a\_k8s-master-127.0.0.1\_default\_43160049df5e3b1c5ec7bcf23d4b97d0\_2174a7c3 +a17784253dd2 gcr.io/google\_containers/hyperkube-arm:v1.1.2 "/hyperkube controller" 2 hours ago Up 2 hours k8s\_controller-manager.7042038a\_k8s-master-127.0.0.1\_default\_43160049df5e3b1c5ec7bcf23d4b97d0\_2174a7c3 a0fb6a169094 gcr.io/google\_containers/hyperkube-arm:v1.1.2 "/hyperkube scheduler" 2 hours ago Up 2 hours k8s\_scheduler.d905fc61\_k8s-master-127.0.0.1\_default\_43160049df5e3b1c5ec7bcf23d4b97d0\_511945f8 From 28c96996c129709e47582931b283d97f3b810c42 Mon Sep 17 00:00:00 2001 From: hongkunyoo Date: Tue, 27 Nov 2018 13:51:52 +0900 Subject: [PATCH 194/222] Fix typo on service.md (#11345) * he --> The * my-service.prod.svc.CLUSTER --> my-service.prod.svc.cluster.local --- content/en/docs/concepts/services-networking/service.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/concepts/services-networking/service.md b/content/en/docs/concepts/services-networking/service.md index 5badb351e0..37cc723539 100644 --- a/content/en/docs/concepts/services-networking/service.md +++ b/content/en/docs/concepts/services-networking/service.md @@ -461,7 +461,7 @@ public IP address resource needs to be created first, and it should be in the sa group of the other automatically created resources of the cluster. For example, `MC_myResourceGroup_myAKSCluster_eastus`. Specify the assigned IP address as loadBalancerIP. Ensure that you have updated the securityGroupName in the cloud provider configuration file. For information about troubleshooting `CreatingLoadBalancerFailed` permission issues see, [Use a static IP address with the Azure Kubernetes Service (AKS) load balancer](https://docs.microsoft.com/en-us/azure/aks/static-ip) or [CreatingLoadBalancerFailed on AKS cluster with advanced networking](https://github.com/Azure/AKS/issues/357). {{< note >}} -he support of SCTP in the cloud provider's load balancer is up to the cloud provider's +The support of SCTP in the cloud provider's load balancer is up to the cloud provider's load balancer implementation. If SCTP is not supported by the cloud provider's load balancer the Service creation request is accepted but the creation of the load balancer fails. {{< /note >}} @@ -778,7 +778,7 @@ spec: externalName: my.database.example.com ``` -When looking up the host `my-service.prod.svc.CLUSTER`, the cluster DNS service +When looking up the host `my-service.prod.svc.cluster.local`, the cluster DNS service will return a `CNAME` record with the value `my.database.example.com`. Accessing `my-service` works in the same way as other Services but with the crucial difference that redirection happens at the DNS level rather than via proxying or From 5cd6a43042212eff8431d625b162118c1149056f Mon Sep 17 00:00:00 2001 From: Ruben Orduz Date: Tue, 27 Nov 2018 00:09:34 -0500 Subject: [PATCH 195/222] rename ha upgrade doc to match non ha version (#11327) Signed-off-by: Ruben Orduz --- .../kubeadm/{kubeadm-upgrade-ha.md => kubeadm-upgrade-ha-1-12.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename content/en/docs/tasks/administer-cluster/kubeadm/{kubeadm-upgrade-ha.md => kubeadm-upgrade-ha-1-12.md} (100%) diff --git a/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha.md b/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha-1-12.md similarity index 100% rename from content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha.md rename to content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha-1-12.md From 9b34a25b5d5161fb95a041579436e8fdb9a30eca Mon Sep 17 00:00:00 2001 From: Tongyao Si Date: Tue, 27 Nov 2018 13:14:31 +0800 Subject: [PATCH 196/222] Fix typo (#11300) From 9c537212342c247b3f0e44337822a4ff006147e6 Mon Sep 17 00:00:00 2001 From: Ernesto Hegi Date: Tue, 27 Nov 2018 05:16:15 +0000 Subject: [PATCH 197/222] Update expose-intro.html (#11309) Replaces the word fungible with an easier to read synonym like exchangeable. --- .../docs/tutorials/kubernetes-basics/expose/expose-intro.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/tutorials/kubernetes-basics/expose/expose-intro.html b/content/en/docs/tutorials/kubernetes-basics/expose/expose-intro.html index 27f36adaf5..c0288c5ddb 100644 --- a/content/en/docs/tutorials/kubernetes-basics/expose/expose-intro.html +++ b/content/en/docs/tutorials/kubernetes-basics/expose/expose-intro.html @@ -28,7 +28,7 @@ weight: 10

    Overview of Kubernetes Services

    -

    Kubernetes Pods are mortal. Pods in fact have a lifecycle. When a worker node dies, the Pods running on the Node are also lost. A ReplicationController might then dynamically drive the cluster back to desired state via creation of new Pods to keep your application running. As another example, consider an image-processing backend with 3 replicas. Those replicas are fungible; the front-end system should not care about backend replicas or even if a Pod is lost and recreated. That said, each Pod in a Kubernetes cluster has a unique IP address, even Pods on the same Node, so there needs to be a way of automatically reconciling changes among Pods so that your applications continue to function.

    +

    Kubernetes Pods are mortal. Pods in fact have a lifecycle. When a worker node dies, the Pods running on the Node are also lost. A ReplicationController might then dynamically drive the cluster back to desired state via creation of new Pods to keep your application running. As another example, consider an image-processing backend with 3 replicas. Those replicas are exchangeable; the front-end system should not care about backend replicas or even if a Pod is lost and recreated. That said, each Pod in a Kubernetes cluster has a unique IP address, even Pods on the same Node, so there needs to be a way of automatically reconciling changes among Pods so that your applications continue to function.

    A Service in Kubernetes is an abstraction which defines a logical set of Pods and a policy by which to access them. Services enable a loose coupling between dependent Pods. A Service is defined using YAML (preferred) or JSON, like all Kubernetes objects. The set of Pods targeted by a Service is usually determined by a LabelSelector (see below for why you might want a Service without including selector in the spec).

    From 307ad134adb42abd615acc7b7af9af23a21bd610 Mon Sep 17 00:00:00 2001 From: Chao Wang Date: Tue, 27 Nov 2018 13:49:46 +0800 Subject: [PATCH 198/222] fix the Feature Gates status (#11339) --- .../feature-gates.md | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/content/en/docs/reference/command-line-tools-reference/feature-gates.md b/content/en/docs/reference/command-line-tools-reference/feature-gates.md index 21f8c7c183..9726848ee2 100644 --- a/content/en/docs/reference/command-line-tools-reference/feature-gates.md +++ b/content/en/docs/reference/command-line-tools-reference/feature-gates.md @@ -38,13 +38,17 @@ different Kubernetes components. | `APIListChunking` | `true` | Beta | 1.9 | | | `APIResponseCompression` | `false` | Alpha | 1.7 | | | `AppArmor` | `true` | Beta | 1.4 | | -| `AttachVolumeLimit` | `true` | Alpha | 1.11 | | +| `AttachVolumeLimit` | `true` | Alpha | 1.11 | 1.11 | +| `AttachVolumeLimit` | `true` | Beta | 1.12 | | | `BlockVolume` | `false` | Alpha | 1.9 | | +| `CPUCFSQuotaPeriod` | `false` | Alpha | 1.12 | | | `CPUManager` | `false` | Alpha | 1.8 | 1.9 | | `CPUManager` | `true` | Beta | 1.10 | | | `CRIContainerLogRotation` | `false` | Alpha | 1.10 | 1.10 | | `CRIContainerLogRotation` | `true` | Beta| 1.11 | | -| `CSIBlockVolume` | `false` | Alpha | 1.11 | 1.11 | +| `CSIBlockVolume` | `false` | Alpha | 1.11 | | +| `CSIDriverRegistry` | `false` | Alpha | 1.12 | | +| `CSINodeInfo` | `false` | Alpha | 1.12 | | | `CSIPersistentVolume` | `false` | Alpha | 1.9 | 1.9 | | `CSIPersistentVolume` | `true` | Beta | 1.10 | | | `CustomPodDNS` | `false` | Alpha | 1.9 | 1.9 | @@ -81,6 +85,7 @@ different Kubernetes components. | `MountPropagation` | `false` | Alpha | 1.8 | 1.9 | | `MountPropagation` | `true` | Beta | 1.10 | 1.11 | | `MountPropagation` | `true` | GA | 1.12 | | +| `NodeLease` | `false` | Alpha | 1.12 | | | `PersistentLocalVolumes` | `false` | Alpha | 1.7 | 1.9 | | `PersistentLocalVolumes` | `true` | Beta | 1.10 | | | `PodPriority` | `false` | Alpha | 1.8 | | @@ -88,11 +93,14 @@ different Kubernetes components. | `PodReadinessGates` | `true` | Beta | 1.12 | | | `PodShareProcessNamespace` | `false` | Alpha | 1.10 | | | `PodShareProcessNamespace` | `true` | Beta | 1.12 | | +| `ProcMountType` | `false` | Alpha | 1.12 | | | `PVCProtection` | `false` | Alpha | 1.9 | 1.9 | -| `ReadOnlyAPIDataVolumes` | `true` | Deprecated | 1.10 | | | `ResourceLimitsPriorityFunction` | `false` | Alpha | 1.9 | | +| `ResourceQuotaScopeSelectors` | `false` | Alpha | 1.11 | 1.11 | +| `ResourceQuotaScopeSelectors` | `true` | Beta | 1.12 | | | `RotateKubeletClientCertificate` | `true` | Beta | 1.7 | | -| `RotateKubeletServerCertificate` | `false` | Alpha | 1.7 | | +| `RotateKubeletServerCertificate` | `false` | Alpha | 1.7 | 1.11 | +| `RotateKubeletServerCertificate` | `true` | Beta | 1.12 | | | `RunAsGroup` | `false` | Alpha | 1.10 | | | `RuntimeClass` | `false` | Alpha | 1.12 | | | `SCTPSupport` | `false` | Alpha | 1.12 | | @@ -117,6 +125,7 @@ different Kubernetes components. | `VolumeScheduling` | `false` | Alpha | 1.9 | 1.9 | | `VolumeScheduling` | `true` | Beta | 1.10 | | | `VolumeSubpathEnvExpansion` | `false` | Alpha | 1.11 | | +| `VolumeSnapshotDataSource` | `false` | Alpha | 1.12 | | | `ScheduleDaemonSetPods` | `true` | Beta | 1.12 | | ## Using a Feature @@ -175,9 +184,12 @@ Each feature gate is designed for enabling/disabling a specific feature: - `BlockVolume`: Enable the definition and consumption of raw block devices in Pods. See [Raw Block Volume Support](/docs/concepts/storage/persistent-volumes/#raw-block-volume-support) for more details. +- `CPUCFSQuotaPeriod`: Enable nodes to change CPUCFSQuotaPeriod. - `CPUManager`: Enable container level CPU affinity support, see [CPU Management Policies](/docs/tasks/administer-cluster/cpu-management-policies/). - `CRIContainerLogRotation`: Enable container log rotation for cri container runtime. - `CSIBlockVolume`: Enable external CSI volume drivers to support block storage. See the [`csi` raw block volume support](/docs/concepts/storage/volumes/#csi-raw-block-volume-support) documentation for more details. +- `CSIDriverRegistry`: Enable all logic related to the CSIDriver API object in csi.storage.k8s.io. +- `CSINodeInfo`: Enable all logic related to the CSINodeInfo API object in csi.storage.k8s.io. - `CSIPersistentVolume`: Enable discovering and mounting volumes provisioned through a [CSI (Container Storage Interface)](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/storage/container-storage-interface.md) compatible volume plugin. @@ -221,21 +233,22 @@ Each feature gate is designed for enabling/disabling a specific feature: - `MountContainers`: Enable using utility containers on host as the volume mounter. - `MountPropagation`: Enable sharing volume mounted by one container to other containers or pods. For more details, please see [mount propagation](/docs/concepts/storage/volumes/#mount-propagation). +- `NodeLease`: Enable the new Lease API to report node heartbeats, which could be used as a node health signal. - `PersistentLocalVolumes`: Enable the usage of `local` volume type in Pods. Pod affinity has to be specified if requesting a `local` volume. - `PodPriority`: Enable the descheduling and preemption of Pods based on their [priorities](/docs/concepts/configuration/pod-priority-preemption/). - `PodReadinessGates`: Enable the setting of `PodReadinessGate` field for extending Pod readiness evaluation. For more details, please see [Pod readiness gate](/docs/concepts/workloads/pods/pod-lifecycle/#pod-readiness-gate). +- `ProcMountType`: Enables control over ProcMountType for containers. - `PVCProtection`: Enable the prevention of a PersistentVolumeClaim (PVC) from being deleted when it is still used by any Pod. More details can be found [here](/docs/tasks/administer-cluster/storage-object-in-use-protection/). -- `ReadOnlyAPIDataVolumes`: Set Secret, ConfigMap, DownwardAPI and projected volumes to be mounted in read-only mode. - This gate exists only for backward compatibility. It will be removed in 1.11 release. - `ResourceLimitsPriorityFunction`: Enable a scheduler priority function that assigns a lowest possible score of 1 to a node that satisfies at least one of the input Pod's cpu and memory limits. The intent is to break ties between nodes with same scores. +- `ResourceQuotaScopeSelectors`: Enable resource quota scope selectors. - `RotateKubeletClientCertificate`: Enable the rotation of the client TLS certificate on the kubelet. See [kubelet configuration](/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/#kubelet-configuration) for more details. - `RotateKubeletServerCertificate`: Enable the rotation of the server TLS certificate on the kubelet. @@ -267,4 +280,6 @@ Each feature gate is designed for enabling/disabling a specific feature: PersistentVolumeClaim (PVC) binding aware of scheduling decisions. It also enables the usage of [`local`](/docs/concepts/storage/volumes/#local) volume type when used together with the `PersistentLocalVolumes` feature gate. +- `VolumeSnapshotDataSource`: Enable volume snapshot data source support. + {{% /capture %}} From bfefb311b926d1d57d13637218926a6bcd421b1a Mon Sep 17 00:00:00 2001 From: chenDT Date: Tue, 27 Nov 2018 17:29:22 +0800 Subject: [PATCH 199/222] fix some 404 errors (#11352) --- .../extend-kubernetes/api-extension/custom-resources.md | 6 +++--- .../en/docs/concepts/extend-kubernetes/service-catalog.md | 2 +- .../access-kubernetes-api/configure-aggregation-layer.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md b/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md index 614b0b60e2..0c1fe13a37 100644 --- a/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md +++ b/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md @@ -108,11 +108,11 @@ Use a custom resource (CRD or Aggregated API) if most of the following apply: Kubernetes provides two ways to add custom resources to your cluster: - CRDs are simple and can be created without any programming. -- [API Aggregation](/docs/concepts/api-extension/apiserver-aggregation/) requires programming, but allows more control over API behaviors like how data is stored and conversion between API versions. +- [API Aggregation](/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/) requires programming, but allows more control over API behaviors like how data is stored and conversion between API versions. Kubernetes provides these two options to meet the needs of different users, so that neither ease of use nor flexibility is compromised. -Aggregated APIs are subordinate APIServers that sit behind the primary API server, which acts as a proxy. This arrangement is called [API Aggregation](/docs/concepts/api-extension/apiserver-aggregation/) (AA). To users, it simply appears that the Kubernetes API is extended. +Aggregated APIs are subordinate APIServers that sit behind the primary API server, which acts as a proxy. This arrangement is called [API Aggregation](/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/) (AA). To users, it simply appears that the Kubernetes API is extended. CRDs allow users to create new types of resources without adding another APIserver. You do not need to understand API Aggregation to use CRDs. @@ -138,7 +138,7 @@ CRD is the successor to the deprecated *ThirdPartyResource* (TPR) API, and is av Usually, each resource in the Kubernetes API requires code that handles REST requests and manages persistent storage of objects. The main Kubernetes API server handles built-in resources like *pods* and *services*, and can also handle custom resources in a generic way through [CRDs](#customresourcedefinitions). -The [aggregation layer](/docs/concepts/api-extension/apiserver-aggregation/) allows you to provide specialized +The [aggregation layer](/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/) allows you to provide specialized implementations for your custom resources by writing and deploying your own standalone API server. The main API server delegates requests to you for the custom resources that you handle, making them available to all of its clients. diff --git a/content/en/docs/concepts/extend-kubernetes/service-catalog.md b/content/en/docs/concepts/extend-kubernetes/service-catalog.md index f1b0bbeb56..35d181d998 100644 --- a/content/en/docs/concepts/extend-kubernetes/service-catalog.md +++ b/content/en/docs/concepts/extend-kubernetes/service-catalog.md @@ -32,7 +32,7 @@ The application can simply use it as a service. Service Catalog uses the [Open service broker API](https://github.com/openservicebrokerapi/servicebroker) to communicate with service brokers, acting as an intermediary for the Kubernetes API Server to negotiate the initial provisioning and retrieve the credentials necessary for the application to use a managed service. -It is implemented as an extension API server and a controller, using etcd for storage. It also uses the [aggregation layer](/docs/concepts/api-extension/apiserver-aggregation/) available in Kubernetes 1.7+ to present its API. +It is implemented as an extension API server and a controller, using etcd for storage. It also uses the [aggregation layer](/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/) available in Kubernetes 1.7+ to present its API.
    diff --git a/content/en/docs/tasks/access-kubernetes-api/configure-aggregation-layer.md b/content/en/docs/tasks/access-kubernetes-api/configure-aggregation-layer.md index 87fa9bd717..223dfb67e4 100644 --- a/content/en/docs/tasks/access-kubernetes-api/configure-aggregation-layer.md +++ b/content/en/docs/tasks/access-kubernetes-api/configure-aggregation-layer.md @@ -10,7 +10,7 @@ weight: 10 {{% capture overview %}} -Configuring the [aggregation layer](/docs/concepts/api-extension/apiserver-aggregation/) allows the Kubernetes apiserver to be extended with additional APIs, which are not part of the core Kubernetes APIs. +Configuring the [aggregation layer](/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/) allows the Kubernetes apiserver to be extended with additional APIs, which are not part of the core Kubernetes APIs. {{% /capture %}} From c3e5b565daae9890658df75e7128cfc3f9cba008 Mon Sep 17 00:00:00 2001 From: Pingan Date: Wed, 28 Nov 2018 20:55:28 +0800 Subject: [PATCH 200/222] unneed to use flag --all (#11372) --- content/en/docs/reference/kubectl/docker-cli-to-kubectl.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/reference/kubectl/docker-cli-to-kubectl.md b/content/en/docs/reference/kubectl/docker-cli-to-kubectl.md index 25c91e374e..0925992ef8 100644 --- a/content/en/docs/reference/kubectl/docker-cli-to-kubectl.md +++ b/content/en/docs/reference/kubectl/docker-cli-to-kubectl.md @@ -75,7 +75,7 @@ CONTAINER ID IMAGE COMMAND CREATED kubectl: ```shell -$ kubectl get po -a +$ kubectl get po NAME READY STATUS RESTARTS AGE nginx-app-8df569cb7-4gd89 1/1 Running 0 3m ubuntu 0/1 Completed 0 20s @@ -294,4 +294,4 @@ Grafana is running at https://108.59.85.141/api/v1/namespaces/kube-system/servic Heapster is running at https://108.59.85.141/api/v1/namespaces/kube-system/services/monitoring-heapster/proxy InfluxDB is running at https://108.59.85.141/api/v1/namespaces/kube-system/services/monitoring-influxdb/proxy ``` -{{% /capture %}} \ No newline at end of file +{{% /capture %}} From 898ec8f2677f9eb5e03941b330935a9bf98ebfeb Mon Sep 17 00:00:00 2001 From: Debugging Sparrow Date: Wed, 28 Nov 2018 22:02:09 +0900 Subject: [PATCH 201/222] Update cluster-intro.html (#11373) Added comma(,) to avoid ambiguity of a sentence. --- .../kubernetes-basics/create-cluster/cluster-intro.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ko/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro.html b/content/ko/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro.html index c18bbceef9..576686ae6f 100644 --- a/content/ko/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro.html +++ b/content/ko/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro.html @@ -33,7 +33,7 @@ weight: 10 炜犽矂雱ろ嫲鞀れ潣 於旍儊頇旊悳 臧滊厫鞚 韱淀暣 臧滊硠 毹胳嫚鞐 鞏诫Г鞚挫 鞎婈碃 旎厡鞚措剤頇旊悳 鞎犿攲毽紑鞚挫厴鞚 韥措煬鞀ろ劙鞐 氚绊彫頃 靾 鞛堧嫟. 鞚措爣瓴 靸堧鞖 氚绊彫 氇嵏鞚 頇滌毄頃橂牑氅, 鞎犿攲毽紑鞚挫厴鞚 臧滊硠 順胳姢韸胳棎 瓴绊暕霅橃 鞎婋姅 氚╈嫕鞙茧 韺偆歆頃 頃勳殧臧 鞛堧嫟. 歃, 旎厡鞚措剤頇 頃挫暭 頃滊嫟. 旎厡鞚措剤頇旊悳 鞎犿攲毽紑鞚挫厴鞚 順胳姢韸胳棎 - 毵れ毎 旯婌澊 韱淀暕霅 韺偆歆搿滌崹 韸轨爼 毹胳嫚鞐 歆侅爲 靹れ箻霅橂姅 鞓堨爠鞚 氚绊彫 氇嵏氤措嫟 鞙犾棸頃橁碃 臧鞖╈劚鞚 雴掚嫟. + 毵れ毎 旯婌澊 韱淀暕霅 韺偆歆搿滌崹, 韸轨爼 毹胳嫚鞐 歆侅爲 靹れ箻霅橂姅 鞓堨爠鞚 氚绊彫 氇嵏氤措嫟 鞙犾棸頃橁碃 臧鞖╈劚鞚 雴掚嫟. 炜犽矂雱ろ嫲鞀る姅 鞎犿攲毽紑鞚挫厴 旎厡鞚措剤毳 韥措煬鞀ろ劙鞐 攵勳偘鞁滍偆瓿 鞀れ紑欷勲頃橂姅 鞚检潉 氤措嫟 須湪鞝侅溂搿 鞛愲彊頇旐暅雼. 炜犽矂雱ろ嫲鞀る姅 鞓ろ攬靻岇姢 頂岆灚韽检澊瓿 鞖挫榿 靾橃鞚 鞎堨爼靹膘潉 臧臁岆嫟. From 51efca2f76d43b26a67cb24c3b1f68cd842fbc52 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 28 Nov 2018 05:10:28 -0800 Subject: [PATCH 202/222] Blog Issue triage (#11371) * Blog Issue triage SIG-Docs decided that we only maintain blog entires <1 year in age. Updating our triage guidelines to reflect this. * Fix typo, link markup, two misplaced modifiers --- content/en/docs/contribute/intermediate.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/content/en/docs/contribute/intermediate.md b/content/en/docs/contribute/intermediate.md index 52a9f10af3..ec01687ddb 100644 --- a/content/en/docs/contribute/intermediate.md +++ b/content/en/docs/contribute/intermediate.md @@ -37,7 +37,7 @@ that one person does all of them all of the time. In any given week, a specific docs approver volunteers to do initial triage and review of [pull requests and issues](#triage-and-categorize-issues). This person is the "PR Wrangler" for the week. The schedule is maintained using the -[PR Wrangler scheduler(https://github.com/kubernetes/website/wiki/PR-Wranglers). +[PR Wrangler scheduler](https://github.com/kubernetes/website/wiki/PR-Wranglers). To be added to this list, attend the weekly SIG Docs meeting and volunteer. Even if you are not on the schedule for the current week, you can still review pull requests (PRs) that are not already under active review. @@ -527,7 +527,7 @@ In any given week, a specific docs approver volunteers to do initial on this list, attend the weekly SIG Docs meeting and volunteer. Even if you are not on the schedule for the current week, you can still review PRs. -People in SIG Docs are only responsible for triaging and categorizing +People in SIG Docs are responsible only for triaging and categorizing documentation issues. General website issues are also filed in the `kubernetes/website` repository. @@ -625,6 +625,13 @@ resolve the issue. Dead links in the API and Kubectl docs are automation issues and should be assigned a P1 until the problem can be fully understood. All other dead links are issues that need to be manually fixed and can be assigned a P3. +#### Blog issues + +[Kubernetes Blog](https://kubernetes.io/blog/) entries are expected to become +outdated over time, so we maintain only blog entries that are less than one year old. +If an issue is related to a blog entry that is more than one year old, it should be closed +without fixing. + #### Support requests or code bug reports Some issues opened for docs are instead issues with the underlying code, or From 3b742cdfd3a414451f8791cc2dda55561bc9284d Mon Sep 17 00:00:00 2001 From: Ashish Billore Date: Wed, 28 Nov 2018 22:20:40 +0900 Subject: [PATCH 203/222] Updated 'exec' description (#11365) Minor updates to 'exec' operation's description, completed it with '.' --- content/en/docs/reference/kubectl/overview.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/reference/kubectl/overview.md b/content/en/docs/reference/kubectl/overview.md index ee9d9d493b..00febd560a 100644 --- a/content/en/docs/reference/kubectl/overview.md +++ b/content/en/docs/reference/kubectl/overview.md @@ -77,7 +77,7 @@ Operation | Syntax | Description `delete` | `kubectl delete (-f FILENAME \| TYPE [NAME \| /NAME \| -l label \| --all]) [flags]` | Delete resources either from a file, stdin, or specifying label selectors, names, resource selectors, or resources. `describe` | `kubectl describe (-f FILENAME \| TYPE [NAME_PREFIX \| /NAME \| -l label]) [flags]` | Display the detailed state of one or more resources. `edit` | `kubectl edit (-f FILENAME \| TYPE NAME \| TYPE/NAME) [flags]` | Edit and update the definition of one or more resources on the server by using the default editor. -`exec` | `kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]]` | Execute a command against a container in a pod, +`exec` | `kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]]` | Execute a command against a container in a pod. `explain` | `kubectl explain [--include-extended-apis=true] [--recursive=false] [flags]` | Get documentation of various resources. For instance pods, nodes, services, etc. `expose` | `kubectl expose (-f FILENAME \| TYPE NAME \| TYPE/NAME) [--port=port] [--protocol=TCP\|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type] [flags]` | Expose a replication controller, service, or pod as a new Kubernetes service. `get` | `kubectl get (-f FILENAME \| TYPE [NAME \| /NAME \| -l label]) [--watch] [--sort-by=FIELD] [[-o \| --output]=OUTPUT_FORMAT] [flags]` | List one or more resources. @@ -448,4 +448,4 @@ To find out more about plugins, take a look at the [example cli plugin](https:// Start using the [kubectl](/docs/reference/generated/kubectl/kubectl-commands/) commands. -{{% /capture %}} \ No newline at end of file +{{% /capture %}} From 2067cf868cdc2b4a5aea268e00b87de2cbd9f20b Mon Sep 17 00:00:00 2001 From: Avi Deitcher Date: Wed, 28 Nov 2018 17:18:57 +0200 Subject: [PATCH 204/222] Further updates to TLS Bootstrapping (#11258) * Further updates to TLS Bootstrapping * Further updates --- .../kubelet-tls-bootstrapping.md | 101 +++++------------- 1 file changed, 27 insertions(+), 74 deletions(-) diff --git a/content/en/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping.md b/content/en/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping.md index 7d861e08eb..d5f479ff44 100644 --- a/content/en/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping.md +++ b/content/en/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping.md @@ -123,12 +123,12 @@ of provisioning. Bootstrap tokens are a simpler and more easily managed method to authenticate kubelets, and do not require any additional flags when starting kube-apiserver. Using bootstrap tokens is currently __beta__ as of Kubernetes version 1.12. -Whichever method you choose, the requirement is that the kubelet be able to authenticate as a user in the `system:bootstrappers` group. This group -serves two purposes: +Whichever method you choose, the requirement is that the kubelet be able to authenticate as a user with the rights to: -1. Will be granted rights to create and retrieve CSRs. -2. Used in the controller-manager configuration to scope -approvals in the default approval controller, if automatic approval is enabled. +1. create and retrieve CSRs +2. be automatically approved to request node client certificates, if automatic approval is enabled. + +A kubelet authenticating using bootstrap tokens is authenticated as a user in the group `system:bootstrappers`, which is the standard method to use. As this feature matures, you should ensure tokens are bound to a Role Based Access Control (RBAC) policy @@ -185,9 +185,9 @@ systemd unit file perhaps) to enable the token file. See docs further details. ### Authorize kubelet to create CSR -Now that the bootstrapping node is _authenticated_ as part of the `system:bootstrappers` group, it needs to be _authorized_ to create a certificate signing request (CSR) as well as retrieve it when done. Fortunately, Kubernetes ships with a `ClusterRole` with precisely these (and just these) permissions, `system:node-bootstrappers`. +Now that the bootstrapping node is _authenticated_ as part of the `system:bootstrappers` group, it needs to be _authorized_ to create a certificate signing request (CSR) as well as retrieve it when done. Fortunately, Kubernetes ships with a `ClusterRole` with precisely these (and just these) permissions, `system:node-bootstrapper`. -To do this, you just need to create a `ClusterRoleBinding` that binds the `system:bootstrappers` group to the cluster role `system:node-bootstrappers`. +To do this, you just need to create a `ClusterRoleBinding` that binds the `system:bootstrappers` group to the cluster role `system:node-bootstrapper`. ``` # enable bootstrapping nodes to create CSR @@ -201,7 +201,7 @@ subjects: apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole - name: system:node-bootstrappers + name: system:node-bootstrapper apiGroup: rbac.authorization.k8s.io ``` @@ -220,7 +220,7 @@ In order for the controller-manager to sign certificates, it needs the following * access to the "kuberetes CA key and certificate" that you created and distributed * enabling CSR signing -#### Access to key and certificate +### Access to key and certificate As described earlier, you need to create a Kubernetes CA key and certificate, and distribute it to the master nodes. These will be used by the controller-manager to sign the kubelet certificates. @@ -246,7 +246,7 @@ The validity duration of signed certificates can be configured with flag: --experimental-cluster-signing-duration ``` -#### Approval +### Approval In order to approve CSRs, you need to tell the controller-manager that it is acceptable to approve them. This is done by granting RBAC permissions to the correct group. @@ -255,13 +255,7 @@ There are two distinct sets of permissions: * `nodeclient`: If a node is creating a new certificate for a node, then it does not have a certificate yet. It is authenticating using one of the tokens listed above, and thus is part of the group `system:bootstrappers`. * `selfnodeclient`: If a node is renewing its certificate, then it already has a certificate (by definition), which it uses continuously to authenticate as part of the group `system:nodes`. -How you enable these permissions depends on which version of Kubernetes, you are running: v1.8+ or below v1.8. - -##### Approval 1.8 -If you are running Kubernetes v1.8 or higher, Kubernetes ships with a `ClusterRole` that has the right to sign certificates. - -To enable the kubelet to request and receive a new certificate, create a `ClusterRoleBinding` that binds the group in which the bootstrapping node is a member `system:bootstrappers` to the `ClusterRole` that -grants it permission, `system:certificates.k8s.io:certificatesigningrequests:nodeclient`: +To enable the kubelet to request and receive a new certificate, create a `ClusterRoleBinding` that binds the group in which the bootstrapping node is a member `system:bootstrappers` to the `ClusterRole` that grants it permission, `system:certificates.k8s.io:certificatesigningrequests:nodeclient`: ```yml # Approve all CSRs for the group "system:bootstrappers" @@ -279,7 +273,7 @@ roleRef: apiGroup: rbac.authorization.k8s.io ``` -To enable the kubelet to renew certificate, create a `ClusterRoleBinding` that binds the group in which the fully functioning node is a member `system:nodes` to the `ClusterRole` that +To enable the kubelet to renew its own client certificate, create a `ClusterRoleBinding` that binds the group in which the fully functioning node is a member `system:nodes` to the `ClusterRole` that grants it permission, `system:certificates.k8s.io:certificatesigningrequests:selfnodeclient`: ```yml @@ -298,16 +292,9 @@ roleRef: apiGroup: rbac.authorization.k8s.io ``` -##### Approval Below 1.8 -If you are running Kubernetes before v1.8, you will need to create _both_ the `ClusterRole`s _and_ the `ClusterRoleBinding`. +**Note: Kubernetes Below 1.8**: If you are running an earlier version of Kubernetes, notably a version below 1.8, then the cluster roles referenced above do not ship by default. You will have to create them yourself _in addition to_ the `ClusterRoleBindings` listed. -The differences from 1.8 and above are: - -* You must create a `ClusterRole` with the correct permissions -* You cannot create a role with the names used in 1.8 and above `system:certificates.k8s.io:certificatesigningrequests:nodeclient` and `system:certificates.k8s.io:certificatesigningrequests:selfnodeclient` as those are reserved -* Your `ClusterRoleBinding` will have a different name in its `roleRef` because of the different `ClusterRole` name. - -The `ClusterRole`s you require are: +To create the `ClusterRole`s: ```yml # A ClusterRole which instructs the CSR approver to approve a user requesting @@ -315,7 +302,7 @@ The `ClusterRole`s you require are: kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: - name: approve-node-client-csr + name: system:certificates.k8s.io:certificatesigningrequests:nodeclient rules: - apiGroups: ["certificates.k8s.io"] resources: ["certificatesigningrequests/nodeclient"] @@ -326,50 +313,13 @@ rules: kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: - name: approve-node-client-renewal-csr + name: system:certificates.k8s.io:certificatesigningrequests:selfnodeclient rules: - apiGroups: ["certificates.k8s.io"] resources: ["certificatesigningrequests/selfnodeclient"] verbs: ["create"] ``` -To enable the kubelet to request and receive a new certificate, create a `ClusterRoleBinding` that binds the group in which the bootstrapping node is a member `system:bootstrappers` to the `ClusterRole` you created that grants it permission, `approve-node-client-csr`: - -```yml -# Approve all CSRs for the group "system:bootstrappers" -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: auto-approve-csrs-for-group -subjects: -- kind: Group - name: system:bootstrappers - apiGroup: rbac.authorization.k8s.io -roleRef: - kind: ClusterRole - name: approve-node-client-csr - apiGroup: rbac.authorization.k8s.io -``` - -To enable the kubelet to renew certificate, create a `ClusterRoleBinding` that binds the group in which the fully functioning node is a member `system:nodes` to the `ClusterRole` you created that -grants it permission, `approve-node-client-renewal-csr`: - -```yml -# Approve renewal CSRs for the group "system:nodes" -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: auto-approve-renewals-for-nodes -subjects: -- kind: Group - name: system:nodes - apiGroup: rbac.authorization.k8s.io -roleRef: - kind: ClusterRole - name: approve-node-client-renewal-csr - apiGroup: rbac.authorization.k8s.io -``` - The `csrapproving` controller that ships as part of [kube-controller-manager](/docs/admin/kube-controller-manager/) and is enabled @@ -389,7 +339,7 @@ The kubelet requires the following configuration to bootstrap: * A path to store the key and certificate it generates (optional, can use default) * A path to a `kubeconfig` file that does not yet exist; it will place the bootstrapped config file here -* A path to a bootstrap `kubeconfig` file to provide the bootstrap token and URL for the server +* A path to a bootstrap `kubeconfig` file to provide the URL for the server and bootstrap credentials, e.g. a bootstrap token * Optional: instructions to rotate certificates The bootstrap `kubeconfig` should be in a path available to the kubelet, for example `/var/lib/kubelet/bootstrap-kubeconfig`. @@ -424,6 +374,7 @@ The important elements to note are: * `token`: the token to use The format of the token does not matter, as long as it matches what kube-apiserver expects. In the above example, we used a bootstrap token. +As stated earlier, _any_ valid authentication method can be used, not just tokens. Because the bootstrap `kubeconfig` _is_ a standard `kubeconfig`, you can use `kubectl` to generate it. To create the above example file: @@ -457,6 +408,7 @@ To secure these, the kubelet can do one of: * use provided key and certificate, via the `--tls-private-key-file` and `--tls-cert-file` flags * create self-signed key and certificate, if a key and certificate are not provided +* request serving certificates from the cluster server, via the CSR API The client certificate provided by TLS bootstrapping is signed, by default, for `client auth` only, and thus cannot be used as serving certificates, or `server auth`. @@ -494,15 +446,16 @@ reasons](https://github.com/kubernetes/community/pull/1982). To use controller, or manually approve the serving certificate requests. {{< /note >}} -## kube-proxy +## Other authenticating components All of TLS bootstrapping described in this document relates to the kubelet. However, -kube-proxy needs to run on every node, and requires the ability to authenticate to kube-apiserver. +other components may need to communicate directly with kube-apiserver. Notable is kube-proxy, which +is part of the Kubernetes control plane and runs on every node, but may also include other components such as monitoring or networking. -You have several options for generating kube-proxy certificates: +Like the kubelet, these other components also require a method of authenticating to kube-apiserver. +You have several options for generating these credentials: -* The old way: Create annd distribute certificates the same way you did for kubelet before TLS bootstrapping -* Share: Ideally, we do not share certificates. However, since both the kubelet and kube-proxy run on the same node and function together, you may consider sharing the bootstrapped kubelet certificates with kube-proxy. Be aware, however, that when the certificates expire and rotate, kubelet alone may be aware of and reload the updated certificates. kube-proxy may have the old certificates loaded in memory and may have failures in authentication. -* DaemonSet: Since the kubelet itself is loaded on each node, and is sufficient to start base services, you can run kube-proxy not as a standalone process, but rather as a daemonset in the `kube-system` namespace. Since it will be in-cluster, you can give it a proper service account with appropriate permissions to perform its activities. This may be the simplest way to configure kube-proxy. +* The old way: Create and distribute certificates the same way you did for kubelet before TLS bootstrapping +* DaemonSet: Since the kubelet itself is loaded on each node, and is sufficient to start base services, you can run kube-proxy and other node-specific services not as a standalone process, but rather as a daemonset in the `kube-system` namespace. Since it will be in-cluster, you can give it a proper service account with appropriate permissions to perform its activities. This may be the simplest way to configure such services. ## kubectl approval @@ -526,7 +479,7 @@ Although Kubernetes supports running control plane master components like kube-a The reason for this limitation is that the kubelet attempts to bootstrap communication with kube-apiserver _before_ starting any pods, even static ones define on disk and referenced via the kubelet option `--pod-manifest-path=`. Trying to do both TLS Bootstrapping and master components in kubelet leads to a race condition: kubelet needs to communicate to kube-apiserver to request certificates, yet requires those certificates to be available to start kube-apiserver. -A fix for this issue is in progress [here](https://github.com/kubernetes/kubernetes/pull/71174). +An issue is open referencing this [here](https://github.com/kubernetes/kubernetes/issues/68686). From 795c418633525760bb5b3e3f5ad3c36e4ebe9183 Mon Sep 17 00:00:00 2001 From: Joost Hietbrink Date: Wed, 28 Nov 2018 16:46:01 +0100 Subject: [PATCH 205/222] Updated ingress.md (#11213) Typo serivceName. --- content/en/docs/concepts/services-networking/ingress.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/en/docs/concepts/services-networking/ingress.md b/content/en/docs/concepts/services-networking/ingress.md index b6d52c6376..8b5638939c 100644 --- a/content/en/docs/concepts/services-networking/ingress.md +++ b/content/en/docs/concepts/services-networking/ingress.md @@ -136,10 +136,10 @@ for directing HTTP traffic. Each http rule contains the following information: -* An optional host. In this example, no host is specified, so the rule will apply to all inbound - HTTP traffic through the IP address that will be connected. If a host is provided, for example: - foo.bar.com, the rules will apply on to that host. -* a list of paths (e.g.: /testpath) each of which has an associated backend defined with a `serviceName` +* An optional host. In this example, no host is specified, so the rule applies to all inbound + HTTP traffic through the IP address is specified. If a host is provided (for example, + foo.bar.com), the rules apply to that host. +* a list of paths (for example, /testpath), each of which has an associated backend defined with a `serviceName` and `servicePort`. Both the host and path must match the content of an incoming request before the loadbalancer will direct traffic to the referenced service. * A backend is a combination of service and port names as described in the From 09e07c9f211ebc5c0801bbaa1d9669b9c7315c5b Mon Sep 17 00:00:00 2001 From: Zhou Tao Date: Wed, 28 Nov 2018 23:53:31 +0800 Subject: [PATCH 206/222] fix non-existing "CloudProvider Interface" link (#10953) minor change, just get 404 error when clicking the url and try to fix it. --- content/en/docs/concepts/architecture/cloud-controller.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/architecture/cloud-controller.md b/content/en/docs/concepts/architecture/cloud-controller.md index 714cfe365c..de79d9d52c 100644 --- a/content/en/docs/concepts/architecture/cloud-controller.md +++ b/content/en/docs/concepts/architecture/cloud-controller.md @@ -109,7 +109,7 @@ The PersistentVolumeLabels controller moves the cloud-dependent functionality of ## Plugin mechanism -The cloud controller manager uses Go interfaces to allow implementations from any cloud to be plugged in. Specifically, it uses the CloudProvider Interface defined [here](https://github.com/kubernetes/kubernetes/blob/master/pkg/cloudprovider/cloud.go). +The cloud controller manager uses Go interfaces to allow implementations from any cloud to be plugged in. Specifically, it uses the CloudProvider Interface defined [here](https://github.com/kubernetes/kubernetes/tree/master/pkg/cloudprovider). The implementation of the four shared controllers highlighted above, and some scaffolding along with the shared cloudprovider interface, will stay in the Kubernetes core. Implementations specific to cloud providers will be built outside of the core and implement interfaces defined in the core. From 333f8183f8cdf966f095aaa4a454c50ba10b6245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20M=2E=20Cust=C3=B3dio?= Date: Wed, 28 Nov 2018 16:33:39 +0000 Subject: [PATCH 207/222] Fix the "my-scheduler-as-kube-scheduler" ClusterRoleBinding. (#11112) Signed-off-by: Bruno Custodio --- content/en/examples/admin/sched/my-scheduler.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/examples/admin/sched/my-scheduler.yaml b/content/en/examples/admin/sched/my-scheduler.yaml index ab0c385cd6..3e51d12721 100644 --- a/content/en/examples/admin/sched/my-scheduler.yaml +++ b/content/en/examples/admin/sched/my-scheduler.yaml @@ -14,7 +14,7 @@ subjects: namespace: kube-system roleRef: kind: ClusterRole - name: kube-scheduler + name: system:kube-scheduler apiGroup: rbac.authorization.k8s.io --- apiVersion: apps/v1 From 59503364756a9e33ca5793c0813c2868bf584e1e Mon Sep 17 00:00:00 2001 From: Ashley Schuett Date: Wed, 28 Nov 2018 16:56:45 -0500 Subject: [PATCH 208/222] update link to CloudProvider Interface (#11228) --- content/en/docs/concepts/architecture/cloud-controller.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/architecture/cloud-controller.md b/content/en/docs/concepts/architecture/cloud-controller.md index de79d9d52c..82f791ff1f 100644 --- a/content/en/docs/concepts/architecture/cloud-controller.md +++ b/content/en/docs/concepts/architecture/cloud-controller.md @@ -109,7 +109,7 @@ The PersistentVolumeLabels controller moves the cloud-dependent functionality of ## Plugin mechanism -The cloud controller manager uses Go interfaces to allow implementations from any cloud to be plugged in. Specifically, it uses the CloudProvider Interface defined [here](https://github.com/kubernetes/kubernetes/tree/master/pkg/cloudprovider). +The cloud controller manager uses Go interfaces to allow implementations from any cloud to be plugged in. Specifically, it uses the CloudProvider Interface defined [here](https://github.com/kubernetes/cloud-provider/blob/9b77dc1c384685cb732b3025ed5689dd597a5971/cloud.go#L42-L62). The implementation of the four shared controllers highlighted above, and some scaffolding along with the shared cloudprovider interface, will stay in the Kubernetes core. Implementations specific to cloud providers will be built outside of the core and implement interfaces defined in the core. From f527728f7f44e1cda95cb9dd5139ef9f9ec6e83d Mon Sep 17 00:00:00 2001 From: Wang Bing Date: Thu, 29 Nov 2018 10:05:40 +0800 Subject: [PATCH 209/222] Add pigletfly(WangBing) as a sig-docs-zh-reviewer (#11370) --- OWNERS_ALIASES | 1 + 1 file changed, 1 insertion(+) diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES index 3d2217fd5f..7f485f5a10 100644 --- a/OWNERS_ALIASES +++ b/OWNERS_ALIASES @@ -170,6 +170,7 @@ aliases: - tengqm - xiangpengzhao - zhangxiaoyu-zidif + - pigletfly sig-federation: #Team: Federation; e.g. Federated Clusters - csbell sig-gcp: #Google Cloud Platform; GH: sig-gcp-pr-reviews From 4b6a0427cb133759b6c6de1febd96c9b000c34b8 Mon Sep 17 00:00:00 2001 From: lIuDuI <1693291525@qq.com> Date: Thu, 29 Nov 2018 13:20:22 +0800 Subject: [PATCH 210/222] fix Improper translation (#11384) --- content/zh/includes/federation-current-state.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/includes/federation-current-state.md b/content/zh/includes/federation-current-state.md index 86ce125337..b07a0cb779 100644 --- a/content/zh/includes/federation-current-state.md +++ b/content/zh/includes/federation-current-state.md @@ -2,4 +2,4 @@ `Federation V1`, the current Kubernetes federation API which reuses the Kubernetes API resources 'as is', is currently considered alpha for many of its features. There is no clear path to evolve the API to GA; however, there is a `Federation V2` effort in progress to implement a dedicated federation API apart from the Kubernetes API. The details are available at [sig-multicluster community page](https://github.com/kubernetes/community/tree/master/sig-multicluster). --> -`鑱旈偊 V1`锛 鏄綋鍓嶇殑 Kubernetes 鑱旈偊 API锛 瀹'鍘熸牱'閲嶇敤 Kubernetes API 璧勬簮锛 鍏惰澶氱壒鎬х洰鍓嶈璁や负鏄 alpha銆 娌℃湁鏄庣‘鐨勯斿緞灏 API 鍙戝睍鎴 GA锛 鐒惰岋紝 闄や簡 Kubernetes API 涔嬪锛 杩樻湁涓涓 `鑱旈偊 V2` 姝e湪鍔姏瀹炵幇涓撶敤鐨勮仈閭 API銆傝缁嗕俊鎭彲鍦 [sig-multicluster community page](https://github.com/kubernetes/community/tree/master/sig-multicluster) 椤甸潰鑾峰緱銆 +`Federation V1`锛 鏄綋鍓嶇殑 Kubernetes 鑱旈偊 API锛 瀹'鍘熸牱'閲嶇敤 Kubernetes API 璧勬簮锛 鍏惰澶氱壒鎬х洰鍓嶈璁や负鏄 alpha銆 娌℃湁鏄庣‘鐨勯斿緞灏 API 鍙戝睍鎴 GA锛 鐒惰岋紝 闄や簡 Kubernetes API 涔嬪锛 杩樻湁涓涓 `Federation V2` 姝e湪鍔姏瀹炵幇涓撶敤鐨勮仈閭 API銆傝缁嗕俊鎭彲鍦 [sig-multicluster community page](https://github.com/kubernetes/community/tree/master/sig-multicluster) 椤甸潰鑾峰緱銆 From daeb18f1835b3de412a9eccbdc17cb817dfe2010 Mon Sep 17 00:00:00 2001 From: chenrui Date: Thu, 29 Nov 2018 18:29:54 +0800 Subject: [PATCH 211/222] Add rui to sig-docs-zh team (#11391) --- OWNERS_ALIASES | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES index 7f485f5a10..33478be27b 100644 --- a/OWNERS_ALIASES +++ b/OWNERS_ALIASES @@ -128,7 +128,7 @@ aliases: - tfogo - zacharysarah - zparnold - sig-docs-en-reviews: #Team: Documentation; GH: sig-docs-pr-reviews + sig-docs-en-reviews: #Team: Documentation; GH: sig-docs-pr-reviews - jimangel - rajakavitha1 - stewart-yu @@ -138,7 +138,7 @@ aliases: - cstoku - nasa9084 - tnir - sig-docs-ja-reviews: #Team: Japanese docs PR reviews; GH:sig-docs-ja-reviews + sig-docs-ja-reviews: #Team: Japanese docs PR reviews; GH:sig-docs-ja-reviews - cstoku - makocchi-git - MasayaAoyama @@ -154,6 +154,7 @@ aliases: sig-docs-zh-owners: #Team Chinese docs localization; GH: sig-docs-zh-owners - bradtopol - chenopis + - chenrui333 - lucperkins - zacharysarah - dchen1107 @@ -165,6 +166,7 @@ aliases: - xiangpengzhao - zhangxiaoyu-zidif sig-docs-zh-reviews: #Team Chinese docs reviews; GH: sig-docs-zh-reviews + - chenrui333 - idealhack - markthink - tengqm From f16d26c375bc7edc58e96c2b7d5689a9565fb3cd Mon Sep 17 00:00:00 2001 From: Bastian Hofmann Date: Thu, 29 Nov 2018 14:26:27 +0100 Subject: [PATCH 212/222] Add SysEleven MetaKube as hosted solution (#11393) --- content/en/docs/setup/pick-right-solution.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/en/docs/setup/pick-right-solution.md b/content/en/docs/setup/pick-right-solution.md index e10262ae0f..a043c749a9 100644 --- a/content/en/docs/setup/pick-right-solution.md +++ b/content/en/docs/setup/pick-right-solution.md @@ -76,6 +76,8 @@ a Kubernetes cluster from scratch. * [Stackpoint.io](https://stackpoint.io) provides Kubernetes infrastructure automation and management for multiple public clouds. +* [SysEleven MetaKube](https://www.syseleven.io/products-services/managed-kubernetes/) offers managed Kubernetes as a service powered on our OpenStack public cloud. It includes lifecycle management, administration dashboards, monitoring, autoscaling and much more. + * [VMware Cloud PKS](https://cloud.vmware.com/vmware-cloud-pks) is an enterprise Kubernetes-as-a-Service offering in the VMware Cloud Services portfolio that provides easy to use, secure by default, cost effective, SaaS-based Kubernetes clusters. ## Turnkey Cloud Solutions From 47d8c9a9fd21faadf1ce13bbf3a0f6a0ca6bc10f Mon Sep 17 00:00:00 2001 From: chenrui Date: Thu, 29 Nov 2018 21:28:01 +0800 Subject: [PATCH 213/222] Remove redundant close tags and little bit formatting (#11389) --- content/en/partners/_index.html | 34 +++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/content/en/partners/_index.html b/content/en/partners/_index.html index 6bcc3a7813..e8f87478dc 100644 --- a/content/en/partners/_index.html +++ b/content/en/partners/_index.html @@ -10,9 +10,36 @@ cid: partners
    Kubernetes works with partners to create a strong, vibrant codebase that supports a spectrum of complementary platforms.
    -
    Kubernetes Certified Service Providers

    Vetted service providers with deep experience helping enterprises successfully adopt Kubernetes.




    Interested in becoming a KCSP?
    -
    Certified Kubernetes Distributions, Hosted Platforms, and Installers
    Software conformance ensures that every vendor鈥檚 version of Kubernetes supports the required APIs.




    Interested in becoming Certified Kubernetes?
    -
    Kubernetes Training Partners

    Vetted training providers who have deep experience in cloud native technology training.





    Interested in becoming a KTP?
    +
    +
    +
    + Kubernetes Certified Service Providers +
    +
    Vetted service providers with deep experience helping enterprises successfully adopt Kubernetes. +


    + +

    Interested in becoming a KCSP? +
    +
    +
    +
    +
    + Certified Kubernetes Distributions, Hosted Platforms, and Installers +
    Software conformance ensures that every vendor鈥檚 version of Kubernetes supports the required APIs. +


    + +

    Interested in becoming Certified Kubernetes? +
    +
    +
    +
    +
    Kubernetes Training Partners
    +
    Vetted training providers who have deep experience in cloud native technology training. +



    + +

    Interested in becoming a KTP? +
    +
    -
    From a81ba11b3501961df1635d2a426013c67b718b36 Mon Sep 17 00:00:00 2001 From: Kishore Chekuru <34727777+kchekuru@users.noreply.github.com> Date: Thu, 29 Nov 2018 16:28:46 -0500 Subject: [PATCH 214/222] Update what-is-kubernetes.md (#11399) fat is offensive --- content/en/docs/concepts/overview/what-is-kubernetes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/overview/what-is-kubernetes.md b/content/en/docs/concepts/overview/what-is-kubernetes.md index f086ab21f5..014d4945c0 100644 --- a/content/en/docs/concepts/overview/what-is-kubernetes.md +++ b/content/en/docs/concepts/overview/what-is-kubernetes.md @@ -182,7 +182,7 @@ Summary of container benefits: hardware to running an application on an OS using logical resources. * **Loosely coupled, distributed, elastic, liberated [micro-services](https://martinfowler.com/articles/microservices.html)**: Applications are broken into smaller, independent pieces and can - be deployed and managed dynamically -- not a fat monolithic stack + be deployed and managed dynamically -- not a monolithic stack running on one big single-purpose machine. * **Resource isolation**: Predictable application performance. From d1df4b643710ecb7ddd26e687b2cd9e1638a757f Mon Sep 17 00:00:00 2001 From: Zach Corleissen Date: Thu, 29 Nov 2018 19:36:59 -0800 Subject: [PATCH 215/222] Add guidelines for working with localized content (#11415) Clarify about where to look for specific l10n tasks More accurate link pointer Update link for upstream contributions --- content/en/docs/contribute/intermediate.md | 12 ++++++++++++ content/en/docs/contribute/localization.md | 2 +- content/en/docs/contribute/start.md | 15 +++++++++------ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/content/en/docs/contribute/intermediate.md b/content/en/docs/contribute/intermediate.md index ec01687ddb..0a21ae1ddc 100644 --- a/content/en/docs/contribute/intermediate.md +++ b/content/en/docs/contribute/intermediate.md @@ -806,6 +806,18 @@ content. See [Localization](/docs/contribute/localization/) and ask on the [kubernetes-sig-docs mailing list](https://groups.google.com/forum/#!forum/kubernetes-sig-docs) or in `#sig-docs` on Slack if you are interested in helping out. +### Working with localized content + +Follow these guidelines for working with localized content: + +- Limit PRs to a single language. + + Each language has its own reviewers and approvers. + +- Reviewers, verify that PRs contain changes to only one language. + + If a PR contains changes to source in more than one language, ask the PR contributor to open separate PRs for each language. + {{% /capture %}} {{% capture whatsnext %}} diff --git a/content/en/docs/contribute/localization.md b/content/en/docs/contribute/localization.md index a586bc5410..6e73492a14 100644 --- a/content/en/docs/contribute/localization.md +++ b/content/en/docs/contribute/localization.md @@ -203,7 +203,7 @@ For more information about working from forks or directly from the repository, s ### Upstream contributions -SIG Docs welcomes upstream contributions and corrections to the English source! Open a [pull request](https://kubernetes.io/docs/contribute/start/#improve-existing-content) (from a fork) with any updates. +SIG Docs welcomes [upstream contributions and corrections](/docs/contribute/intermediate#localize-content) to the English source. {{% /capture %}} diff --git a/content/en/docs/contribute/start.md b/content/en/docs/contribute/start.md index 5d205db0d2..ee49c00022 100644 --- a/content/en/docs/contribute/start.md +++ b/content/en/docs/contribute/start.md @@ -24,12 +24,7 @@ code repositories, refer to ## The basics about our docs -The Kubernetes documentation is written in Markdown and processed and deployed -using Hugo. The source is in Github at -[https://github.com/kubernetes/website](https://github.com/kubernetes/website). -Most of the documentation source is stored in `/content/en/docs/`. Some of the -reference documentation is automatically generated from scripts in the -`update-imported-docs/` directory. +The Kubernetes documentation is written in Markdown and processed and deployed using Hugo. The source is in Github at [https://github.com/kubernetes/website](https://github.com/kubernetes/website). Most of the documentation source is stored in `/content/en/docs/`. Some of the reference documentation is automatically generated from scripts in the `update-imported-docs/` directory. You can file issues, edit content, and review changes from others, all from the Github website. You can also use Github's embedded history and search tools. @@ -70,6 +65,14 @@ We make use of the standard Hugo shortcodes, as well as a few that are custom to the Kubernetes documentation. See [Custom Hugo shortcodes](/docs/contribute/style/hugo-shortcodes/) for information about how to use them. +### Multiple languages + +Documentation source is available in multiple languages in `/content/`. Each language has its own folder with a two-letter code determined by the [ISO 639-1 standard](https://www.loc.gov/standards/iso639-2/php/code_list.php). For example, English documentation source is stored in `/content/en/docs/`. + +For more information about contributing to documentation in multiple languages, see ["Localize content"](/docs/contribute/intermediate#localize-content) in the intermediate contributing guide. + +If you're interested in starting a new localization, see ["Localization"](/docs/contribute/localization/). + ## File actionable issues Anyone with a Github account can file an issue (bug report) against the From 28c2089c8d229b600bce5a66510fe1da3d61b80d Mon Sep 17 00:00:00 2001 From: hongkunyoo Date: Fri, 30 Nov 2018 13:53:20 +0900 Subject: [PATCH 216/222] Update on pod-priority-preemption.md (#11418) * number Pods --> number of Pods * add comma(,) for clarity. --- .../en/docs/concepts/configuration/pod-priority-preemption.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/concepts/configuration/pod-priority-preemption.md b/content/en/docs/concepts/configuration/pod-priority-preemption.md index 7ee796191d..909b5c01ab 100644 --- a/content/en/docs/concepts/configuration/pod-priority-preemption.md +++ b/content/en/docs/concepts/configuration/pod-priority-preemption.md @@ -241,7 +241,7 @@ priority Pods to zero or a small number. #### PodDisruptionBudget is supported, but not guaranteed! A [Pod Disruption Budget (PDB)](/docs/concepts/workloads/pods/disruptions/) -allows application owners to limit the number Pods of a replicated application +allows application owners to limit the number of Pods of a replicated application that are down simultaneously from voluntary disruptions. Kubernetes 1.9 supports PDB when preempting Pods, but respecting PDB is best effort. The Scheduler tries to find victims whose PDB are not violated by preemption, but if no such victims @@ -329,7 +329,7 @@ than the victims. If preemption happens in such scenarios, please file an issue. When pods are preempted, they receive their requested graceful termination period, which is by default 30 seconds, but it can be any different value as -specified in the PodSpec. If the victim Pods do not terminate within this period +specified in the PodSpec. If the victim Pods do not terminate within this period, they are force-terminated. Once all the victims go away, the preemptor Pod can be scheduled. From d459ee4265b19f20bebc1f80a89d204958e60e34 Mon Sep 17 00:00:00 2001 From: Pingan Date: Fri, 30 Nov 2018 18:06:59 +0800 Subject: [PATCH 217/222] fix broken link for KubeletConfiguration (#11423) --- content/en/docs/concepts/configuration/secret.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/configuration/secret.md b/content/en/docs/concepts/configuration/secret.md index 4201c2d5a4..cac58727d7 100644 --- a/content/en/docs/concepts/configuration/secret.md +++ b/content/en/docs/concepts/configuration/secret.md @@ -442,7 +442,7 @@ When a secret being already consumed in a volume is updated, projected keys are Kubelet is checking whether the mounted secret is fresh on every periodic sync. However, it is using its local cache for getting the current value of the Secret. The type of the cache is configurable using the (`ConfigMapAndSecretChangeDetectionStrategy` field in -[KubeletConfiguration struct](https://github.com/kubernetes/kubernetes/blob/{{< param "docsbranch" >}}/pkg/kubelet/apis/kubeletconfig/v1beta1/types.go)). +[KubeletConfiguration struct](https://github.com/kubernetes/kubernetes/blob/{{< param "docsbranch" >}}/staging/src/k8s.io/kubelet/config/v1beta1/types.go)). It can be either propagated via watch (default), ttl-based, or simply redirecting all requests to directly kube-apiserver. As a result, the total delay from the moment when the Secret is updated to the moment From 1fca2fe97e723a39c2f6ecdeac413ab60db4d042 Mon Sep 17 00:00:00 2001 From: Ashish Billore Date: Sat, 1 Dec 2018 00:31:17 +0900 Subject: [PATCH 218/222] Updated list all pods with -o wide comment (#11394) Minor updates to the comment of: // List all pods in plain-text output format and include additional information (such as node name). $ kubectl get pods -o wide --- content/en/docs/reference/kubectl/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/reference/kubectl/overview.md b/content/en/docs/reference/kubectl/overview.md index 00febd560a..25388fdf80 100644 --- a/content/en/docs/reference/kubectl/overview.md +++ b/content/en/docs/reference/kubectl/overview.md @@ -273,7 +273,7 @@ $ kubectl create -f // List all pods in plain-text output format. $ kubectl get pods -// List all pods in plain-text output format and includes additional information (such as node name). +// List all pods in plain-text output format and include additional information (such as node name). $ kubectl get pods -o wide // List the replication controller with the specified name in plain-text output format. Tip: You can shorten and replace the 'replicationcontroller' resource type with the alias 'rc'. From 1e933a1a964568e77b271d63853f4a19fc9ac6af Mon Sep 17 00:00:00 2001 From: David Somers-Harris Date: Sat, 1 Dec 2018 05:51:59 +0900 Subject: [PATCH 219/222] replace `run` with `create deployment` (#11392) * replace `run` with `create deployment` because `kubectl run` is deprecated * korean * removing ko files --- content/en/docs/tutorials/hello-minikube.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/tutorials/hello-minikube.md b/content/en/docs/tutorials/hello-minikube.md index e4449ae3da..11e04c12fc 100644 --- a/content/en/docs/tutorials/hello-minikube.md +++ b/content/en/docs/tutorials/hello-minikube.md @@ -71,11 +71,11 @@ tutorial has only one Container. A Kubernetes Pod and restarts the Pod's Container if it terminates. Deployments are the recommended way to manage the creation and scaling of Pods. -1. Use the `kubectl run` command to create a Deployment that manages a Pod. The +1. Use the `kubectl create` command to create a Deployment that manages a Pod. The Pod runs a Container based on the provided Docker image. ```shell - kubectl run hello-node --image=gcr.io/hello-minikube-zero-install/hello-node --port=8080 + kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node --port=8080 ``` 2. View the Deployment: From 1feb401ea2db1484435fb45ddbcd75ba41f9ebda Mon Sep 17 00:00:00 2001 From: June Yi Date: Sat, 1 Dec 2018 15:54:14 +0900 Subject: [PATCH 220/222] Resolve conflicts against dev-1.13 for /ko contents (#11439) --- content/ko/docs/setup/pick-right-solution.md | 140 +++++++++---------- 1 file changed, 69 insertions(+), 71 deletions(-) diff --git a/content/ko/docs/setup/pick-right-solution.md b/content/ko/docs/setup/pick-right-solution.md index c70064e9f0..0ff7c2c136 100644 --- a/content/ko/docs/setup/pick-right-solution.md +++ b/content/ko/docs/setup/pick-right-solution.md @@ -6,21 +6,20 @@ content_template: templates/concept {{% capture overview %}} -Kubernetes can run on various platforms: from your laptop, to VMs on a cloud provider, to a rack of -bare metal servers. The effort required to set up a cluster varies from running a single command to -crafting your own customized cluster. Use this guide to choose a solution that fits your needs. +炜犽矂雱ろ嫲鞀る姅 霝╉儜攵韯 韥措澕鞖半摐 瓿店笁鞛愳潣 VM霌, 氩犾柎氅旐儓 靹滊矂 霝欔箤歆 雼れ枒頃 頂岆灚韽检棎靹 鞛戨彊 臧電ロ晿雼. +韥措煬鞀ろ劙 甑劚鞚 鞙勴暣 頃勳殧頃 雲鸽牓鞚 頃橂倶鞚 雼澕 氇呺牴鞏措ゼ 鞁ろ枆鞁滍偆電 靾橃鞐愳劀 歆侅爲 鞛愳嫚毵岇潣 毵烄钉順 韥措煬鞀ろ劙毳 靹鸽皜頃橁矊 毵岆摐電 靾橃鞐 鞚措ゴ旮瓣箤歆 雼れ枒頃橂嫟. +鞎岆鞚 靻旊(靺橃潉 靹犿儩頃橁赴 鞙勴暣靹 鞚 臧鞚措摐毳 靷毄頃橃瀽. -If you just want to "kick the tires" on Kubernetes, use the [local Docker-based solutions](#local-machine-solutions). +炜犽矂雱ろ嫲鞀るゼ 鞁滊弰頃措炒旮半ゼ 鞗愴暅雼る┐, [搿滌滑 Docker 旮半皹鞚 靻旊(靺榏(#搿滌滑-毹胳嫚-靻旊(靺)鞚 靷毄頃橃瀽. -When you are ready to scale up to more machines and higher availability, a [hosted solution](#hosted-solutions) is the easiest to create and maintain. +雿 毵庫潃 毹胳嫚瓿 雴掛潃 臧鞖╈劚鞙茧 頇曥灔頃 欷牍勱皜 霅橃棃雼る┐, [順胳姢韸 霅 靻旊(靺榏(#順胳姢韸-霅-靻旊(靺)鞚 靸濎劚頃橁碃 鞙犾頃橁赴鞐 臧鞛 靿诫嫟. -[Turnkey cloud solutions](#turnkey-cloud-solutions) require only a few commands to create -and cover a wide range of cloud providers. [On-Premises turnkey cloud solutions](#on-premises-turnkey-cloud-solutions) have the simplicity of the turnkey cloud solution combined with the security of your own private network. +[韯错偆 韥措澕鞖半摐 靻旊(靺榏(#韯错偆-韥措澕鞖半摐-靻旊(靺)鞚 韥措澕鞖半摐 瓿店笁鞛愲摛鞚 雱撿潃 氩旍渼毳 雼る(瓿 靸濎劚頃橁赴 鞙勴暣靹 鞎疥皠鞚 氇呺牴鞏搓皜 頃勳殧頃橂嫟. +[鞓-頂勲爤氙胳姢 韯错偆 韥措澕鞖半摐 靻旊(靺榏(#鞓-頂勲爤氙胳姢-韯错偆-韥措澕鞖半摐-靻旊(靺)鞚 頂勲澕鞚措箺 雱ろ姼鞗岉伂鞚 氤挫晥瓿 瓴绊暕霅 韯错偆 韥措澕鞖半摐 靻旊(靺橃潣 雼垳頃潉 臧歆勲嫟. -If you already have a way to configure hosting resources, use [kubeadm](/docs/setup/independent/create-cluster-kubeadm/) to easily bring up a cluster with a single command per machine. +順胳姢韺呿暅 鞛愳洂鞚 甑劚頃橂姅 氚╇矔鞚 鞚措 臧歆瓿 鞛堧嫟氅, 毹胳嫚 雼 雼澕 氇呺牴鞏措 韥措煬鞀ろ劙毳 毵岆摛鞏措偞旮 鞙勴暣靹 [kubeadm](/docs/setup/independent/create-cluster-kubeadm/)鞚 靷毄頃橃瀽. -[Custom solutions](#custom-solutions) vary from step-by-step instructions to general advice for setting up -a Kubernetes cluster from scratch. +[靷毄鞛 歆鞝 靻旊(靺榏(#靷毄鞛-歆鞝-靻旊(靺)鞚 雼硠氤 歆旃秬韯 炜犽矂雱ろ嫲鞀 韥措煬鞀ろ劙毳 觳橃潓攵韯 靹れ爼頃橁赴 鞙勴暅 鞚茧皹鞝侅澑 臁办柛旯岇 雼れ枒頃橂嫟. {{% /capture %}} @@ -28,52 +27,53 @@ a Kubernetes cluster from scratch. ## 搿滌滑 毹胳嫚 靻旊(靺 -* [Minikube](/docs/setup/minikube/) is the recommended method for creating a local, single-node Kubernetes cluster for development and testing. Setup is completely automated and doesn't require a cloud provider account. +* [Minikube](/docs/setup/minikube/)電 臧滊皽瓿 韰岇姢韸鸽ゼ 鞙勴暅 雼澕 雲鸽摐 炜犽矂雱ろ嫲鞀 韥措煬鞀ろ劙毳 搿滌滑鞐 靸濎劚頃橁赴 鞙勴暅 頃橂倶鞚 氚╇矔鞚措嫟. 靹れ箻電 鞕勳爠頌 鞛愲彊頇 霅橃柎 鞛堦碃, 韥措澕鞖半摐 瓿店笁鞛 瓿勳爼 鞝曤炒臧 頃勳殧頃橃 鞎婋嫟. -* [IBM Cloud Private-CE (Community Edition)](https://github.com/IBM/deploy-ibm-cloud-private) can use VirtualBox on your machine to deploy Kubernetes to one or more VMs for development and test scenarios. Scales to full multi-node cluster. +* [microk8s](https://microk8s.io/)電 臧滊皽瓿 韰岇姢韸鸽ゼ 鞙勴暅 炜犽矂雱ろ嫲鞀 斓滌嫚 氩勳爠鞚 雼澕 氇呺牴鞏措 搿滌滑 毹胳嫚 靸侅潣 靹れ箻毳 鞝滉车頃滊嫟. 靹れ箻電 鞁犾啀頃橁碃 牍犽ゴ氅(~30齑) 雼澕 氇呺牴鞏措 Istio毳 韽暔頃 毵庫潃 頂岆煬攴胳澑鞚 歆鞗愴暅雼. -* [IBM Cloud Private-CE (Community Edition) on Linux Containers](https://github.com/HSBawa/icp-ce-on-linux-containers) is a Terraform/Packer/BASH based Infrastructure as Code (IaC) scripts to create a seven node (1 Boot, 1 Master, 1 Management, 1 Proxy and 3 Workers) LXD cluster on Linux Host. +* [IBM Cloud Private-CE (Community Edition)](https://github.com/IBM/deploy-ibm-cloud-private)電 臧滊皽瓿 韰岇姢韸 鞁滊倶毽槫毳 鞙勴暣 1臧 霕愲姅 雿 毵庫潃 VM鞐 炜犽矂雱ろ嫲鞀るゼ 氚绊彫頃橁赴 鞙勴暣靹 毹胳嫚鞚 VirtualBox毳 靷毄頃 靾 鞛堧嫟. 鞚措姅 鞝勳泊 氅韹 雲鸽摐 韥措煬鞀ろ劙搿 頇曥灔頃 靾 鞛堧嫟. -* [Kubeadm-dind](https://github.com/kubernetes-sigs/kubeadm-dind-cluster) is a multi-node (while minikube is single-node) Kubernetes cluster which only requires a docker daemon. It uses docker-in-docker technique to spawn the Kubernetes cluster. +* [IBM Cloud Private-CE (Community Edition) on Linux Containers](https://github.com/HSBawa/icp-ce-on-linux-containers)電 Terraform/Packer/BASH 旮半皹鞚 毽垍鞀 順胳姢韸 靸侅潣 LXD 韥措煬鞀ろ劙鞐 7臧滌潣 雲鸽摐(攵韸 1臧, 毵堨姢韯 1臧, 甏毽 1臧, 頂勲鞁 1臧 攴鸽Μ瓿 鞗岇护 3臧)毳 靸濎劚頃橁赴 鞙勴暅 Infrastructure as Code (IaC) 鞀ろ伂毽巾姼鞚措嫟. -* [Ubuntu on LXD](/docs/getting-started-guides/ubuntu/local/) supports a nine-instance deployment on localhost. +* [Kubeadm-dind](https://github.com/kubernetes-sigs/kubeadm-dind-cluster)電 頃橂倶鞚 docker 雿半鞚 頃勳殧頃 氅韹 雲鸽摐 炜犽矂雱ろ嫲鞀 韥措煬鞀ろ劙鞚措嫟.(minikube電 雼澕 雲鸽摐鞚措嫟.) 韥措煬鞀ろ劙 靸濎劚鞚 鞙勴暣靹 docker-in-docker 旮办垹鞚 靷毄頃滊嫟. + +* [Ubuntu on LXD](/docs/getting-started-guides/ubuntu/local/)電 搿滌滑 順胳姢韸胳棎靹 9臧滌潣 鞚胳姢韯挫姢 氚绊彫毳 歆鞗愴暅雼. ## 順胳姢韸 霅 靻旊(靺 -* [AppsCode.com](https://appscode.com/products/cloud-deployment/) provides managed Kubernetes clusters for various public clouds, including AWS and Google Cloud Platform. +* [AppsCode.com](https://appscode.com/products/cloud-deployment/)電 AWS鞕 Google Cloud Platform鞚 韽暔頃橃棳 雼れ枒頃 韻茧笖毽 韥措澕鞖半摐鞚 甏毽槙 炜犽矂雱ろ嫲鞀 韥措煬鞀ろ劙毳 鞝滉车頃滊嫟. -* [APPUiO](https://appuio.ch) runs an OpenShift public cloud platform, supporting any Kubernetes workload. Additionally APPUiO offers Private Managed OpenShift Clusters, running on any public or private cloud. +* [APPUiO](https://appuio.ch)電 炜犽矂雱ろ嫲鞀 鞗岉伂搿滊摐毳 歆鞗愴晿電 OpenShift 韻茧笖毽 韥措澕鞖半摐 頂岆灚韽检潉 甑彊頃滊嫟. 瓴岆嫟臧 APPUiO電 韻茧笖毽 霕愲姅 頂勲澕鞚措箺 韥措澕鞖半摐鞐愳劀 甑彊 欷戩澑 頂勲澕鞚措箺 OpenShift 韥措煬鞀ろ劙 甏毽ゼ 鞝滉车頃滊嫟. -* [Amazon Elastic Container Service for Kubernetes](https://aws.amazon.com/eks/) offers managed Kubernetes service. +* [Amazon Elastic Container Service for Kubernetes](https://aws.amazon.com/eks/)電 甏毽槙 炜犽矂雱ろ嫲鞀 靹滊箘鞀るゼ 鞝滉车頃滊嫟. -* [Azure Kubernetes Service](https://azure.microsoft.com/services/container-service/) offers managed Kubernetes clusters. +* [Azure Kubernetes Service](https://azure.microsoft.com/services/container-service/)電 甏毽槙 炜犽矂雱ろ嫲鞀 韥措煬鞀ろ劙毳 鞝滉车頃滊嫟. -* [Giant Swarm](https://giantswarm.io/product/) offers managed Kubernetes clusters in their own datacenter, on-premises, or on public clouds. +* [Giant Swarm](https://giantswarm.io/product/)鞚 鞓-頂勲爤氙胳姢 霕愲姅 韻茧笖毽 韥措澕鞖半摐 雿办澊韯办劶韯 雮挫棎靹 甏毽槙 炜犽矂雱ろ嫲鞀 韥措煬鞀ろ劙毳 鞝滉车頃滊嫟. -* [Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine/) offers managed Kubernetes clusters. +* [Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine/)鞚 甏毽槙 炜犽矂雱ろ嫲鞀 韥措煬鞀ろ劙毳 鞝滉车頃滊嫟. -* [IBM Cloud Kubernetes Service](https://console.bluemix.net/docs/containers/container_index.html) offers managed Kubernetes clusters with isolation choice, operational tools, integrated security insight into images and containers, and integration with Watson, IoT, and data. +* [IBM Cloud Kubernetes Service](https://console.bluemix.net/docs/containers/container_index.html)電 甏毽槙 炜犽矂雱ろ嫲鞀 韥措煬鞀ろ劙毳 鞝滉车頃滊嫟. 攴胳檧 頃粯 瓴╇Μ 膦呺, 鞖挫榿 霃勱惮, 鞚措歆鞕 旎厡鞚措剤 韱淀暕霅 氤挫晥 韱奠鞍霠, Watson, IoT, 雿办澊韯办檧鞚 韱淀暕霃 鞝滉车頃滊嫟. -* [Kubermatic](https://www.loodse.com) provides managed Kubernetes clusters for various public clouds, including AWS and Digital Ocean, as well as on-premises with OpenStack integration. +* [Kubermatic](https://www.loodse.com)電 AWS鞕 Digital Ocean鞚 韽暔頃 雼れ枒頃 韻茧笖毽 韥措澕鞖半摐肟愲 鞎勲媹霛 鞓-頂勲爤氙胳姢 靸侅潣 OpenStack 韱淀暕鞚 鞙勴暅 甏毽槙 炜犽矂雱ろ嫲鞀 韥措煬鞀ろ劙毳 鞝滉车頃滊嫟. -* [Kublr](https://kublr.com) offers enterprise-grade secure, scalable, highly reliable Kubernetes clusters on AWS, Azure, GCP, and on-premise. It includes out-of-the-box backup and disaster recovery, multi-cluster centralized logging and monitoring, and built-in alerting. +* [Kublr](https://kublr.com)電 AWS, Azure, GCP 氚 鞓-頂勲爤氙胳姢鞐愳劀 旮办梾 靾橃鞚 鞎堨爠頃橁碃, 頇曥灔 臧電ロ晿氅, 鞁犽靹 雴掛潃 炜犽矂雱ろ嫲鞀 韥措煬鞀ろ劙毳 鞝滉车頃滊嫟. 鞐赴鞐愲姅 歃夓嫓 靷毄 臧電ロ暅 氚膘梾 氚 鞛暣 氤店惮, 欷戩暀 歆戩鞁 雼れ 韥措煬鞀ろ劙 搿滉箙 氚 氇媹韯半, 雮挫灔 瓴疥碃 靹滊箘鞀り皜 韽暔霅滊嫟. -* [Madcore.Ai](https://madcore.ai) is devops-focused CLI tool for deploying Kubernetes infrastructure in AWS. Master, auto-scaling group nodes with spot-instances, ingress-ssl-lego, Heapster, and Grafana. +* [Madcore.Ai](https://madcore.ai)電 AWS鞐愳劀 炜犽矂雱ろ嫲鞀 鞚疙攧霛茧ゼ 氚绊彫頃橁赴 鞙勴暅 devops 欷戩嫭鞚 CLI 霃勱惮鞚措嫟. 霕愴暅 毵堨姢韯, 鞀ろ専 鞚胳姢韯挫姢 攴鸽9 雲鸽摐 鞓ろ啝-鞀れ紑鞚茧, ingress-ssl-lego, Heapster, Grafana毳 歆鞗愴暅雼. -* [OpenShift Dedicated](https://www.openshift.com/dedicated/) offers managed Kubernetes clusters powered by OpenShift. +* [OpenShift Dedicated](https://www.openshift.com/dedicated/)電 OpenShift鞚 甏毽槙 炜犽矂雱ろ嫲鞀 韥措煬鞀ろ劙毳 鞝滉车頃滊嫟. -* [OpenShift Online](https://www.openshift.com/features/) provides free hosted access for Kubernetes applications. +* [OpenShift Online](https://www.openshift.com/features/)鞚 炜犽矂雱ろ嫲鞀 鞎犿攲毽紑鞚挫厴鞚 鞙勴暣 順胳姢韸 霅 氍措 鞝戧芳鞚 鞝滉车頃滊嫟. -* [Oracle Container Engine for Kubernetes](https://docs.us-phoenix-1.oraclecloud.com/Content/ContEng/Concepts/contengoverview.htm) is a fully-managed, scalable, and highly available service that you can use to deploy your containerized applications to the cloud. +* [Oracle Container Engine for Kubernetes](https://docs.us-phoenix-1.oraclecloud.com/Content/ContEng/Concepts/contengoverview.htm)電 旎厡鞚措剤 鞎犿攲毽紑鞚挫厴鞚 韥措澕鞖半摐鞐 氚绊彫頃橂姅 雿 靷毄頃 靾 鞛堧姅 鞕勲步頃橁矊 甏毽悩瓿, 頇曥灔 臧電ロ晿氅, 臧鞖╈劚鞚 雴掛潃 靹滊箘鞀れ澊雼. -* [Platform9](https://platform9.com/products/kubernetes/) offers managed Kubernetes on-premises or on any public cloud, and provides 24/7 health monitoring and alerting. (Kube2go, a web-UI driven Kubernetes cluster deployment service Platform9 released, has been integrated to Platform9 Sandbox.) +* [Platform9](https://platform9.com/products/kubernetes/)電 鞓-頂勲爤氙胳姢 霕愲姅 氇摖 韻茧笖毽 韥措澕鞖半摐鞐愳劀 甏毽槙 炜犽矂雱ろ嫲鞀るゼ 鞝滉车頃滊嫟. 霕愴暅, 24/7 靸來儨 氇媹韯半 氚 鞎岆瀸 氚 瓴疥碃 靹滊箘鞀るゼ 鞝滉车頃滊嫟.(Kube2go電 鞗 UI 旮半皹鞚 炜犽矂雱ろ嫲鞀 韥措煬鞀ろ劙 氚绊彫 靹滊箘鞀れ澑 Platform9臧 Platform9 Sandbox鞐 韱淀暕霅 順曧儨搿 於滌嫓霅橃棃雼.) -* [Stackpoint.io](https://stackpoint.io) provides Kubernetes infrastructure automation and management for multiple public clouds. +* [Stackpoint.io](https://stackpoint.io)電 雼れ 韻茧笖毽 韥措澕鞖半摐鞐愳劀 炜犽矂雱ろ嫲鞀 鞚疙攧霛 鞛愲彊頇 氚 甏毽 旮半姤鞚 鞝滉车頃滊嫟. ## 韯错偆 韥措澕鞖半摐 靻旊(靺 -These solutions allow you to create Kubernetes clusters on a range of Cloud IaaS providers with only a -few commands. These solutions are actively developed and have active community support. +雼れ潓 靻旊(靺橂摛鞚 韥措澕鞖半摐 IaaS 瓿店笁鞛愳潣 氩旍渼鞐愳劀 氇 鞎 霅橂姅 氇呺牴鞏措 炜犽矂雱ろ嫲鞀 韥措煬鞀ろ劙毳 靸濎劚鞚 項堨毄頃滊嫟. 鞚措煬頃 靻旊(靺橃潃 頇滊皽頌 臧滊皽霅橃棃瓿 頇滊皽頃 旎る雼堩嫲 歆鞗愳潉 頃滊嫟. * [Agile Stacks](https://www.agilestacks.com/products/kubernetes) * [Alibaba Cloud](/docs/setup/turnkey/alibaba-cloud/) @@ -91,47 +91,45 @@ few commands. These solutions are actively developed and have active community s * [Madcore.Ai](https://madcore.ai/) * [Oracle Container Engine for K8s](https://docs.us-phoenix-1.oraclecloud.com/Content/ContEng/Concepts/contengprerequisites.htm) * [Pivotal Container Service](https://pivotal.io/platform/pivotal-container-service) +* [Giant Swarm](https://giantswarm.io) * [Rancher 2.0](https://rancher.com/docs/rancher/v2.x/en/) * [Stackpoint.io](/docs/setup/turnkey/stackpoint/) * [Tectonic by CoreOS](https://coreos.com/tectonic) ## 鞓-頂勲爤氙胳姢 韯错偆 韥措澕鞖半摐 靻旊(靺 -These solutions allow you to create Kubernetes clusters on your internal, secure, cloud network with only a -few commands. + +雼れ潓 靻旊(靺橂摛鞚 氇 鞎 霅橂姅 氇呺牴鞏措ゼ 靷毄頃橃棳 雮措秬鞚 鞎堨爠頃 韥措澕鞖半摐 雱ろ姼鞗岉伂鞐愳劀 炜犽矂雱ろ嫲鞀 韥措煬鞀ろ劙毳 靸濎劚頃 靾 鞛堧嫟. * [Agile Stacks](https://www.agilestacks.com/products/kubernetes) * [APPUiO](https://appuio.ch) +* [GKE On-Prem | Google Cloud](https://cloud.google.com/gke-on-prem/) * [IBM Cloud Private](https://www.ibm.com/cloud-computing/products/ibm-cloud-private/) * [Kontena Pharos](https://kontena.io/pharos/) * [Kubermatic](https://www.loodse.com) * [Kublr](https://kublr.com/) * [Pivotal Container Service](https://pivotal.io/platform/pivotal-container-service) +* [Giant Swarm](https://giantswarm.io) * [Rancher 2.0](https://rancher.com/docs/rancher/v2.x/en/) * [SUSE CaaS Platform](https://www.suse.com/products/caas-platform) * [SUSE Cloud Application Platform](https://www.suse.com/products/cloud-application-platform/) ## 靷毄鞛 歆鞝 靻旊(靺 -Kubernetes can run on a wide range of Cloud providers and bare-metal environments, and with many -base operating systems. +炜犽矂雱ろ嫲鞀る姅 雱撿潃 氩旍渼鞚 韥措澕鞖半摐 瓿店笁鞛愳檧 氩犾柎氅旐儓 頇橁步鞐愳劀, 攴鸽Μ瓿 毵庫潃 旮半皹 鞖挫榿 觳挫牅鞐愳劀 霃欖瀾頃 靾 鞛堧嫟. -If you can find a guide below that matches your needs, use it. It may be a little out of date, but -it will be easier than starting from scratch. If you do want to start from scratch, either because you -have special requirements, or just because you want to understand what is underneath a Kubernetes -cluster, try the [Getting Started from Scratch](/docs/setup/scratch/) guide. +頃勳殧鞐 毵炿姅 臧鞚措摐毳 鞎勲灅鞐愳劀 彀眷晿雼る┐, 攴戈矁鞚 靷毄頃橃瀽. 鞎疥皠 甑嫕鞚 靾橂弰 鞛堨毵, 觳橃潓攵韯 鞁滌瀾頃橂姅 瓴冸炒雼 雿 靿毟 瓴冹澊雼. +韸闺硠頃 鞖旉惮靷暛鞚 鞛堦赴 霑岆鞐, 霕愲姅 雼 炜犽矂雱ろ嫲鞀 韥措煬鞀ろ劙鞚 鞎勲灅鞐 氍挫棁鞚 鞛堧姅歆毳 鞚错暣頃橁赴 鞗愴晿旮 霑岆鞐 +觳橃潓攵韯 鞁滌瀾頃橁赴毳 鞗愴暅雼る┐, [毵 觳橃潓攵韯 鞁滌瀾頃橁赴](/docs/setup/scratch/) 臧鞚措摐毳 鞁滊弰頃橂澕. -If you are interested in supporting Kubernetes on a new platform, see -[Writing a Getting Started Guide](https://git.k8s.io/community/contributors/devel/writing-a-getting-started-guide.md). +靸堧鞖 頂岆灚韽检棎靹 炜犽矂雱ろ嫲鞀 歆鞗愴晿電 瓴冹棎 甏鞁澊 鞛堧嫟氅, [Writing a Getting Started Guide](https://git.k8s.io/community/contributors/devel/writing-a-getting-started-guide.md) 臧鞚措摐毳 彀戈碃頃橂澕. ### 鞚茧皹 -If you already have a way to configure hosting resources, use -[kubeadm](/docs/setup/independent/create-cluster-kubeadm/) to easily bring up a cluster -with a single command per machine. +順胳姢韺呿暅 毽唽鞀るゼ 甑劚頃橂姅 氚╇矔鞚 鞚措 鞎岅碃 鞛堧嫟氅, [kubeadm](/docs/setup/independent/create-cluster-kubeadm/)鞚 靷毄頃橂┐ 毹胳嫚雼 雼澕 氇呺牴鞏措 靿疥矊 韥措煬鞀ろ劙毳 臧歆瓿 鞓 靾 鞛堧嫟. ### 韥措澕鞖半摐 -These solutions are combinations of cloud providers and operating systems not covered by the above solutions. +雼れ潓 靻旊(靺橃潃 鞙勳潣 靻旊(靺橃棎靹 雼る(歆 鞎婋姅 韥措澕鞖半摐 瓿店笁鞛愳檧 鞖挫榿觳挫牅鞚 臁绊暕鞚措嫟. * [CoreOS on AWS or GCE](/docs/setup/custom-cloud/coreos/) * [Gardener](https://gardener.cloud/) @@ -142,34 +140,35 @@ These solutions are combinations of cloud providers and operating systems not co ### 鞓-頂勲爤氙胳姢 VM -* [CloudStack](/docs/setup/on-premises-vm/cloudstack/) (uses Ansible, CoreOS and flannel) -* [Fedora (Multi Node)](/docs/getting-started-guides/fedora/flannel_multi_node_cluster/) (uses Fedora and flannel) +* [CloudStack](/docs/setup/on-premises-vm/cloudstack/) (Ansible, CoreOS鞕 flannel毳 靷毄) +* [Fedora (Multi Node)](/docs/getting-started-guides/fedora/flannel_multi_node_cluster/) (Fedora鞕 flannel毳 靷毄) * [oVirt](/docs/setup/on-premises-vm/ovirt/) -* [Vagrant](/docs/setup/custom-cloud/coreos/) (uses CoreOS and flannel) -* [VMware](/docs/setup/custom-cloud/coreos/) (uses CoreOS and flannel) +* [Vagrant](/docs/setup/custom-cloud/coreos/) (CoreOS鞕 flannel毳 靷毄) +* [VMware](/docs/setup/custom-cloud/coreos/) (CoreOS鞕 flannel毳 靷毄) * [VMware vSphere](https://vmware.github.io/vsphere-storage-for-kubernetes/documentation/) -* [VMware vSphere, OpenStack, or Bare Metal](/docs/getting-started-guides/ubuntu/) (uses Juju, Ubuntu and flannel) +* [VMware vSphere, OpenStack, or Bare Metal](/docs/getting-started-guides/ubuntu/) (Juju, Ubuntu鞕 flannel毳 靷毄) ### 氩犾柎 氅旐儓 * [CoreOS](/docs/setup/custom-cloud/coreos/) +* [Digital Rebar](/docs/setup/on-premises-metal/krib/) * [Fedora (Single Node)](/docs/getting-started-guides/fedora/fedora_manual_config/) * [Fedora (Multi Node)](/docs/getting-started-guides/fedora/flannel_multi_node_cluster/) * [Kubernetes on Ubuntu](/docs/getting-started-guides/ubuntu/) ### 韱淀暕 -These solutions provide integration with third-party schedulers, resource managers, and/or lower level platforms. +雼れ潓 靻旊(靺橂摛鞚 韮靷 鞀れ紑欷勲煬, 鞛愳洂 甏毽瀽, 雮潃 霠堧波鞚 頂岆灚韽检潣 韱淀暕鞚 鞝滉车頃滊嫟. * [DCOS](/docs/setup/on-premises-vm/dcos/) - * Community Edition DCOS uses AWS - * Enterprise Edition DCOS supports cloud hosting, on-premises VMs, and bare metal + * Community Edition DCOS電 AWS毳 靷毄頃滊嫟. + * Enterprise Edition DCOS電 韥措澕鞖半摐 順胳姢韺, 鞓-頂勲爤氙胳姢 VM, 氩犾柎氅旐儓鞚 歆鞗愴暅雼. ## 靻旊(靺 響 -Below is a table of all of the solutions listed above. +鞎勲灅電 鞙勳棎 毽姢韸 霅 氇摖 靻旊(靺橃潣 響滌澊雼. -IaaS Provider | Config. Mgmt. | OS | Networking | Docs | Support Level +IaaS 瓿店笁鞛 | 甑劚 甏毽 | OS | 雱ろ姼鞗岉偣 | 氍胳劀 | 歆鞗 霠堧波 -------------------- | ------------ | ------ | ---------- | --------------------------------------------- | ---------------------------- any | any | multi-support | any CNI | [docs](/docs/setup/independent/create-cluster-kubeadm/) | Project ([SIG-cluster-lifecycle](https://git.k8s.io/community/sig-cluster-lifecycle)) Google Kubernetes Engine | | | GCE | [docs](https://cloud.google.com/kubernetes-engine/docs/) | Commercial @@ -214,29 +213,28 @@ any | [Gardener Cluster-Operator](https://kubernetes.io/blog/20 Alibaba Cloud Container Service For Kubernetes | ROS | CentOS | flannel/Terway | [docs](https://www.aliyun.com/product/containerservice) | Commercial Agile Stacks | Terraform | CoreOS | multi-support | [docs](https://www.agilestacks.com/products/kubernetes) | Commercial IBM Cloud Kubernetes Service | | Ubuntu | calico | [docs](https://console.bluemix.net/docs/containers/container_index.html) | Commercial +Digital Rebar | kubeadm | any | metal | [docs](/docs/setup/on-premises-metal/krib/) | Community ([@digitalrebar](https://github.com/digitalrebar)) {{< note >}} -The above table is ordered by version test/used in nodes, followed by support level. +鞙勳潣 響滊姅 氩勳爠 韰岇姢韸/靷毄霅 雲鸽摐鞚 歆鞗 霠堧波鞚 旮办鞙茧 鞝曤牞霅滊嫟. {{< /note >}} ### 鞐 鞝曥潣 -* **IaaS Provider** is the product or organization which provides the virtual or physical machines (nodes) that Kubernetes runs on. -* **OS** is the base operating system of the nodes. -* **Config. Mgmt.** is the configuration management system that helps install and maintain Kubernetes on the +* **IaaS 瓿店笁鞛**電 炜犽矂雱ろ嫲鞀り皜 甑彊霅橂姅 臧靸 霕愲姅 氍茧Μ鞝 毹胳嫚(雲鸽摐)毳 鞝滉车頃橂姅 鞝滍拡 霕愲姅 臁办鞚措嫟. +* **OS**電 雲鸽摐鞚 旮半掣 鞖挫榿 觳挫牅鞚措嫟. +* **甑劚 甏毽**電 雲鸽摐鞐愳劀 炜犽矂雱ろ嫲鞀るゼ 靹れ箻頃橁碃 鞙犾 甏毽晿電 雿 霃勳泙鞚 霅橂姅 甑劚 甏毽 鞁滌姢韰滌澊雼. nodes. -* **Networking** is what implements the [networking model](/docs/concepts/cluster-administration/networking/). Those with networking type - _none_ may not support more than a single node, or may support multiple VM nodes in a single physical node. -* **Conformance** indicates whether a cluster created with this configuration has passed the project's conformance - tests for supporting the API and base features of Kubernetes v1.0.0. -* **Support Levels** - * **Project**: Kubernetes committers regularly use this configuration, so it usually works with the latest release - of Kubernetes. - * **Commercial**: A commercial offering with its own support arrangements. - * **Community**: Actively supported by community contributions. May not work with recent releases of Kubernetes. - * **Inactive**: Not actively maintained. Not recommended for first-time Kubernetes users, and may be removed. -* **Notes** has other relevant information, such as the version of Kubernetes used. +* **雱ろ姼鞗岉偣**鞚 [雱ろ姼鞗岉偣 氇嵏](/docs/concepts/cluster-administration/networking/)鞚 甑槃頃橂姅 瓴冹澊雼. 雱ろ姼鞗岉伂 鞙犿槙鞚 + _none_鞚 雲鸽摐電 雼澕 雲鸽摐 鞚挫儊鞚 歆鞗愴晿歆 鞎婈卑雮, 雼澕 氍茧Μ 雲鸽摐鞐愳劀 鞐煬 VM 雲鸽摐毳 歆鞗愴暊 靾 鞛堧嫟. +* **鞝來暕靹**鞚 氇呾嫓霅 甑劚鞙茧 靸濎劚霅 韥措煬鞀ろ劙臧 炜犽矂雱ろ嫲鞀 v1.0.0鞚 API 氚 旮半掣 旮半姤鞚 歆鞗愴晿電旍鞚 頂勲鞝濏姼 鞝來暕靹 韰岇姢韸 韱店臣 鞐秬毳 雮橅儉雮鸽嫟. +* **歆鞗 霠堧波** + * **頂勲鞝濏姼**: 炜犽矂雱ろ嫲鞀 旎る韯半姅 順勳灛 甑劚鞚 鞝曣赴鞝侅溂搿 靷毄頃橂瘈搿, 鞚茧皹鞝侅溂搿 斓滌嫚 炜犽矂雱ろ嫲鞀 毽措Μ歃堨檧 頃粯 霃欖瀾頃滊嫟. + * **靸侅梾鞖**: 鞛愳泊 歆鞗 瓿勳暯鞚 臧歆 靸侅梾鞖 鞝滍拡. + * **旎る雼堩嫲**: 旎る雼堩嫲 旮办棳毳 氚旐儠鞙茧 頇滊皽頃橁矊 歆鞗. 炜犽矂雱ろ嫲鞀 斓滌嫚 毽措Μ歃堨棎電 鞛戨彊頃橃 鞎婌潉 靾橂弰 鞛堧嫟. + * **牍勴櫆靹**: 順勳灛 鞙犾霅橃 鞎婋姅雼. 炜犽矂雱ろ嫲鞀 斓滌磮 靷毄鞛愳棎瓴 甓岇灔頃橃 鞎婌溂氅, 靷牅霅 靾橂弰 鞛堧嫟. +* **彀戈碃**電 靷毄霅 炜犽矂雱ろ嫲鞀 氩勳爠 臧欖潃 旮绊儉 甏霠 鞝曤炒臧 鞛堧嫟. From 0c987f419f9f8d92ff3ae68eec48c813af31f1ad Mon Sep 17 00:00:00 2001 From: chenDT Date: Mon, 3 Dec 2018 11:17:02 +0800 Subject: [PATCH 221/222] fix Minikube 404 error. (#11461) --- content/en/includes/task-tutorial-prereqs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/includes/task-tutorial-prereqs.md b/content/en/includes/task-tutorial-prereqs.md index 6f1407fe45..76e9a1698b 100644 --- a/content/en/includes/task-tutorial-prereqs.md +++ b/content/en/includes/task-tutorial-prereqs.md @@ -1,7 +1,7 @@ You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using -[Minikube](/docs/getting-started-guides/minikube), +[Minikube](/docs/setup/minikube), or you can use one of these Kubernetes playgrounds: * [Katacoda](https://www.katacoda.com/courses/kubernetes/playground) From b1dde5578c00c2bf34dd2112fa1be22c2421aaba Mon Sep 17 00:00:00 2001 From: Zach Corleissen Date: Mon, 3 Dec 2018 09:21:23 -0800 Subject: [PATCH 222/222] Add temporary owners for 1.13 release (#11453) --- OWNERS_ALIASES | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES index 33478be27b..7aee5b8a70 100644 --- a/OWNERS_ALIASES +++ b/OWNERS_ALIASES @@ -138,6 +138,7 @@ aliases: - cstoku - nasa9084 - tnir + - zacharysarah sig-docs-ja-reviews: #Team: Japanese docs PR reviews; GH:sig-docs-ja-reviews - cstoku - makocchi-git @@ -147,6 +148,10 @@ aliases: sig-docs-ko-owners: #Team Korean docs localization; GH: sig-docs-ko-owners - ClaudiaJKang - gochist + - bradamant3 # Temporary for 1.13 release + - jimangel # Temporary for 1.13 release + - tfogo # Temporary for 1.13 release + - zacharysarah sig-docs-ko-reviews: #Team Korean docs reviews; GH: sig-docs-ko-reviews - ClaudiaJKang - gochist @@ -155,16 +160,19 @@ aliases: - bradtopol - chenopis - chenrui333 - - lucperkins - - zacharysarah - dchen1107 - haibinxie - hanjiayao - lichuqiang + - lucperkins - markthink - tengqm - xiangpengzhao + - zacharysarah - zhangxiaoyu-zidif + - bradamant3 # Temporary for 1.13 release + - jimangel # Temporary for 1.13 release + - tfogo # Temporary for 1.13 release sig-docs-zh-reviews: #Team Chinese docs reviews; GH: sig-docs-zh-reviews - chenrui333 - idealhack