Date: Mon, 23 Nov 2020 22:06:26 +0900
Subject: [PATCH 19/80] Add Coil CNI to networking.md
Coil is a new open-source CNI plugin for Kubernetes.
Resources:
- https://github.com/cybozu-go/coil
- https://blog.kintone.io/entry/coilv2
---
.../en/docs/concepts/cluster-administration/networking.md | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/content/en/docs/concepts/cluster-administration/networking.md b/content/en/docs/concepts/cluster-administration/networking.md
index a124d788fd..184b40c8dc 100644
--- a/content/en/docs/concepts/cluster-administration/networking.md
+++ b/content/en/docs/concepts/cluster-administration/networking.md
@@ -158,6 +158,11 @@ tables to provide per-instance subnets to each host (which is limited to 50-100
entries per VPC). In short, cni-ipvlan-vpc-k8s significantly reduces the
network complexity required to deploy Kubernetes at scale within AWS.
+### Coil
+
+[Coil](https://github.com/cybozu-go/coil) is a CNI plugin designed for ease of integration, providing flexible egress networking.
+Coil operates with a low overhead compared to bare metal, and allows you to define arbitrary egress NAT gateways for external networks.
+
### Contiv
[Contiv](https://github.com/contiv/netplugin) provides configurable networking (native l3 using BGP, overlay using vxlan, classic l2, or Cisco-SDN/ACI) for various use cases. [Contiv](https://contiv.io) is all open sourced.
@@ -311,4 +316,4 @@ to run, and in both cases, the network provides one IP address per pod - as is s
The early design of the networking model and its rationale, and some future
plans are described in more detail in the
-[networking design document](https://git.k8s.io/community/contributors/design-proposals/network/networking.md).
\ No newline at end of file
+[networking design document](https://git.k8s.io/community/contributors/design-proposals/network/networking.md).
From d38bbe24eea036fe4b8593b3507798cb89238488 Mon Sep 17 00:00:00 2001
From: bl-ue <54780737+bl-ue@users.noreply.github.com>
Date: Mon, 23 Nov 2020 16:02:21 -0500
Subject: [PATCH 20/80] Fix broken link
In content/{en, ja, ko, zh}/docs/setup/production-environment/windows/user-guide-windows-containers.md:
https://gist.github.com/{wagnerandrade => 19WAS85}/5424431
---
.../windows/user-guide-windows-containers.md | 2 +-
.../windows/user-guide-windows-containers.md | 2 +-
.../windows/user-guide-windows-containers.md | 2 +-
.../windows/user-guide-windows-containers.md | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/content/en/docs/setup/production-environment/windows/user-guide-windows-containers.md b/content/en/docs/setup/production-environment/windows/user-guide-windows-containers.md
index e28afeb9f2..b2399442eb 100644
--- a/content/en/docs/setup/production-environment/windows/user-guide-windows-containers.md
+++ b/content/en/docs/setup/production-environment/windows/user-guide-windows-containers.md
@@ -68,7 +68,7 @@ spec:
command:
- powershell.exe
- -command
- - "<#code used from https://gist.github.com/wagnerandrade/5424431#> ; $$listener = New-Object System.Net.HttpListener ; $$listener.Prefixes.Add('http://*:80/') ; $$listener.Start() ; $$callerCounts = @{} ; Write-Host('Listening at http://*:80/') ; while ($$listener.IsListening) { ;$$context = $$listener.GetContext() ;$$requestUrl = $$context.Request.Url ;$$clientIP = $$context.Request.RemoteEndPoint.Address ;$$response = $$context.Response ;Write-Host '' ;Write-Host('> {0}' -f $$requestUrl) ; ;$$count = 1 ;$$k=$$callerCounts.Get_Item($$clientIP) ;if ($$k -ne $$null) { $$count += $$k } ;$$callerCounts.Set_Item($$clientIP, $$count) ;$$ip=(Get-NetAdapter | Get-NetIpAddress); $$header='Windows Container Web Server
' ;$$callerCountsString='' ;$$callerCounts.Keys | % { $$callerCountsString+='IP {0} callerCount {1} ' -f $$ip[1].IPAddress,$$callerCounts.Item($$_) } ;$$footer='' ;$$content='{0}{1}{2}' -f $$header,$$callerCountsString,$$footer ;Write-Output $$content ;$$buffer = [System.Text.Encoding]::UTF8.GetBytes($$content) ;$$response.ContentLength64 = $$buffer.Length ;$$response.OutputStream.Write($$buffer, 0, $$buffer.Length) ;$$response.Close() ;$$responseStatus = $$response.StatusCode ;Write-Host('< {0}' -f $$responseStatus) } ; "
+ - "<#code used from https://gist.github.com/19WAS85/5424431#> ; $$listener = New-Object System.Net.HttpListener ; $$listener.Prefixes.Add('http://*:80/') ; $$listener.Start() ; $$callerCounts = @{} ; Write-Host('Listening at http://*:80/') ; while ($$listener.IsListening) { ;$$context = $$listener.GetContext() ;$$requestUrl = $$context.Request.Url ;$$clientIP = $$context.Request.RemoteEndPoint.Address ;$$response = $$context.Response ;Write-Host '' ;Write-Host('> {0}' -f $$requestUrl) ; ;$$count = 1 ;$$k=$$callerCounts.Get_Item($$clientIP) ;if ($$k -ne $$null) { $$count += $$k } ;$$callerCounts.Set_Item($$clientIP, $$count) ;$$ip=(Get-NetAdapter | Get-NetIpAddress); $$header='
Windows Container Web Server
' ;$$callerCountsString='' ;$$callerCounts.Keys | % { $$callerCountsString+='IP {0} callerCount {1} ' -f $$ip[1].IPAddress,$$callerCounts.Item($$_) } ;$$footer='' ;$$content='{0}{1}{2}' -f $$header,$$callerCountsString,$$footer ;Write-Output $$content ;$$buffer = [System.Text.Encoding]::UTF8.GetBytes($$content) ;$$response.ContentLength64 = $$buffer.Length ;$$response.OutputStream.Write($$buffer, 0, $$buffer.Length) ;$$response.Close() ;$$responseStatus = $$response.StatusCode ;Write-Host('< {0}' -f $$responseStatus) } ; "
nodeSelector:
kubernetes.io/os: windows
```
diff --git a/content/ja/docs/setup/production-environment/windows/user-guide-windows-containers.md b/content/ja/docs/setup/production-environment/windows/user-guide-windows-containers.md
index e19c795d63..9e218fae53 100644
--- a/content/ja/docs/setup/production-environment/windows/user-guide-windows-containers.md
+++ b/content/ja/docs/setup/production-environment/windows/user-guide-windows-containers.md
@@ -65,7 +65,7 @@ spec:
command:
- powershell.exe
- -command
- - "<#code used from https://gist.github.com/wagnerandrade/5424431#> ; $$listener = New-Object System.Net.HttpListener ; $$listener.Prefixes.Add('http://*:80/') ; $$listener.Start() ; $$callerCounts = @{} ; Write-Host('Listening at http://*:80/') ; while ($$listener.IsListening) { ;$$context = $$listener.GetContext() ;$$requestUrl = $$context.Request.Url ;$$clientIP = $$context.Request.RemoteEndPoint.Address ;$$response = $$context.Response ;Write-Host '' ;Write-Host('> {0}' -f $$requestUrl) ; ;$$count = 1 ;$$k=$$callerCounts.Get_Item($$clientIP) ;if ($$k -ne $$null) { $$count = $$k } ;$$callerCounts.Set_Item($$clientIP, $$count) ;$$ip=(Get-NetAdapter | Get-NetIpAddress); $$header='
Windows Container Web Server
' ;$$callerCountsString='' ;$$callerCounts.Keys | % { $$callerCountsString='IP {0} callerCount {1} ' -f $$ip[1].IPAddress,$$callerCounts.Item($$_) } ;$$footer='' ;$$content='{0}{1}{2}' -f $$header,$$callerCountsString,$$footer ;Write-Output $$content ;$$buffer = [System.Text.Encoding]::UTF8.GetBytes($$content) ;$$response.ContentLength64 = $$buffer.Length ;$$response.OutputStream.Write($$buffer, 0, $$buffer.Length) ;$$response.Close() ;$$responseStatus = $$response.StatusCode ;Write-Host('< {0}' -f $$responseStatus) } ; "
+ - "<#code used from https://gist.github.com/19WAS85/5424431#> ; $$listener = New-Object System.Net.HttpListener ; $$listener.Prefixes.Add('http://*:80/') ; $$listener.Start() ; $$callerCounts = @{} ; Write-Host('Listening at http://*:80/') ; while ($$listener.IsListening) { ;$$context = $$listener.GetContext() ;$$requestUrl = $$context.Request.Url ;$$clientIP = $$context.Request.RemoteEndPoint.Address ;$$response = $$context.Response ;Write-Host '' ;Write-Host('> {0}' -f $$requestUrl) ; ;$$count = 1 ;$$k=$$callerCounts.Get_Item($$clientIP) ;if ($$k -ne $$null) { $$count = $$k } ;$$callerCounts.Set_Item($$clientIP, $$count) ;$$ip=(Get-NetAdapter | Get-NetIpAddress); $$header='
Windows Container Web Server
' ;$$callerCountsString='' ;$$callerCounts.Keys | % { $$callerCountsString='IP {0} callerCount {1} ' -f $$ip[1].IPAddress,$$callerCounts.Item($$_) } ;$$footer='' ;$$content='{0}{1}{2}' -f $$header,$$callerCountsString,$$footer ;Write-Output $$content ;$$buffer = [System.Text.Encoding]::UTF8.GetBytes($$content) ;$$response.ContentLength64 = $$buffer.Length ;$$response.OutputStream.Write($$buffer, 0, $$buffer.Length) ;$$response.Close() ;$$responseStatus = $$response.StatusCode ;Write-Host('< {0}' -f $$responseStatus) } ; "
nodeSelector:
kubernetes.io/os: windows
```
diff --git a/content/ko/docs/setup/production-environment/windows/user-guide-windows-containers.md b/content/ko/docs/setup/production-environment/windows/user-guide-windows-containers.md
index f129386a62..bae83b73a9 100644
--- a/content/ko/docs/setup/production-environment/windows/user-guide-windows-containers.md
+++ b/content/ko/docs/setup/production-environment/windows/user-guide-windows-containers.md
@@ -65,7 +65,7 @@ spec:
command:
- powershell.exe
- -command
- - "<#code used from https://gist.github.com/wagnerandrade/5424431#> ; $$listener = New-Object System.Net.HttpListener ; $$listener.Prefixes.Add('http://*:80/') ; $$listener.Start() ; $$callerCounts = @{} ; Write-Host('Listening at http://*:80/') ; while ($$listener.IsListening) { ;$$context = $$listener.GetContext() ;$$requestUrl = $$context.Request.Url ;$$clientIP = $$context.Request.RemoteEndPoint.Address ;$$response = $$context.Response ;Write-Host '' ;Write-Host('> {0}' -f $$requestUrl) ; ;$$count = 1 ;$$k=$$callerCounts.Get_Item($$clientIP) ;if ($$k -ne $$null) { $$count += $$k } ;$$callerCounts.Set_Item($$clientIP, $$count) ;$$ip=(Get-NetAdapter | Get-NetIpAddress); $$header='
Windows Container Web Server
' ;$$callerCountsString='' ;$$callerCounts.Keys | % { $$callerCountsString+='IP {0} callerCount {1} ' -f $$ip[1].IPAddress,$$callerCounts.Item($$_) } ;$$footer='' ;$$content='{0}{1}{2}' -f $$header,$$callerCountsString,$$footer ;Write-Output $$content ;$$buffer = [System.Text.Encoding]::UTF8.GetBytes($$content) ;$$response.ContentLength64 = $$buffer.Length ;$$response.OutputStream.Write($$buffer, 0, $$buffer.Length) ;$$response.Close() ;$$responseStatus = $$response.StatusCode ;Write-Host('< {0}' -f $$responseStatus) } ; "
+ - "<#code used from https://gist.github.com/19WAS85/5424431#> ; $$listener = New-Object System.Net.HttpListener ; $$listener.Prefixes.Add('http://*:80/') ; $$listener.Start() ; $$callerCounts = @{} ; Write-Host('Listening at http://*:80/') ; while ($$listener.IsListening) { ;$$context = $$listener.GetContext() ;$$requestUrl = $$context.Request.Url ;$$clientIP = $$context.Request.RemoteEndPoint.Address ;$$response = $$context.Response ;Write-Host '' ;Write-Host('> {0}' -f $$requestUrl) ; ;$$count = 1 ;$$k=$$callerCounts.Get_Item($$clientIP) ;if ($$k -ne $$null) { $$count += $$k } ;$$callerCounts.Set_Item($$clientIP, $$count) ;$$ip=(Get-NetAdapter | Get-NetIpAddress); $$header='
Windows Container Web Server
' ;$$callerCountsString='' ;$$callerCounts.Keys | % { $$callerCountsString+='IP {0} callerCount {1} ' -f $$ip[1].IPAddress,$$callerCounts.Item($$_) } ;$$footer='' ;$$content='{0}{1}{2}' -f $$header,$$callerCountsString,$$footer ;Write-Output $$content ;$$buffer = [System.Text.Encoding]::UTF8.GetBytes($$content) ;$$response.ContentLength64 = $$buffer.Length ;$$response.OutputStream.Write($$buffer, 0, $$buffer.Length) ;$$response.Close() ;$$responseStatus = $$response.StatusCode ;Write-Host('< {0}' -f $$responseStatus) } ; "
nodeSelector:
kubernetes.io/os: windows
```
diff --git a/content/zh/docs/setup/production-environment/windows/user-guide-windows-containers.md b/content/zh/docs/setup/production-environment/windows/user-guide-windows-containers.md
index 80a470cfad..1fd7105edb 100644
--- a/content/zh/docs/setup/production-environment/windows/user-guide-windows-containers.md
+++ b/content/zh/docs/setup/production-environment/windows/user-guide-windows-containers.md
@@ -96,7 +96,7 @@ spec:
command:
- powershell.exe
- -command
- - "<#code used from https://gist.github.com/wagnerandrade/5424431#> ; $$listener = New-Object System.Net.HttpListener ; $$listener.Prefixes.Add('http://*:80/') ; $$listener.Start() ; $$callerCounts = @{} ; Write-Host('Listening at http://*:80/') ; while ($$listener.IsListening) { ;$$context = $$listener.GetContext() ;$$requestUrl = $$context.Request.Url ;$$clientIP = $$context.Request.RemoteEndPoint.Address ;$$response = $$context.Response ;Write-Host '' ;Write-Host('> {0}' -f $$requestUrl) ; ;$$count = 1 ;$$k=$$callerCounts.Get_Item($$clientIP) ;if ($$k -ne $$null) { $$count += $$k } ;$$callerCounts.Set_Item($$clientIP, $$count) ;$$ip=(Get-NetAdapter | Get-NetIpAddress); $$header='
Windows Container Web Server
' ;$$callerCountsString='' ;$$callerCounts.Keys | % { $$callerCountsString+='IP {0} callerCount {1} ' -f $$ip[1].IPAddress,$$callerCounts.Item($$_) } ;$$footer='' ;$$content='{0}{1}{2}' -f $$header,$$callerCountsString,$$footer ;Write-Output $$content ;$$buffer = [System.Text.Encoding]::UTF8.GetBytes($$content) ;$$response.ContentLength64 = $$buffer.Length ;$$response.OutputStream.Write($$buffer, 0, $$buffer.Length) ;$$response.Close() ;$$responseStatus = $$response.StatusCode ;Write-Host('< {0}' -f $$responseStatus) } ; "
+ - "<#code used from https://gist.github.com/19WAS85/5424431#> ; $$listener = New-Object System.Net.HttpListener ; $$listener.Prefixes.Add('http://*:80/') ; $$listener.Start() ; $$callerCounts = @{} ; Write-Host('Listening at http://*:80/') ; while ($$listener.IsListening) { ;$$context = $$listener.GetContext() ;$$requestUrl = $$context.Request.Url ;$$clientIP = $$context.Request.RemoteEndPoint.Address ;$$response = $$context.Response ;Write-Host '' ;Write-Host('> {0}' -f $$requestUrl) ; ;$$count = 1 ;$$k=$$callerCounts.Get_Item($$clientIP) ;if ($$k -ne $$null) { $$count += $$k } ;$$callerCounts.Set_Item($$clientIP, $$count) ;$$ip=(Get-NetAdapter | Get-NetIpAddress); $$header='
Windows Container Web Server
' ;$$callerCountsString='' ;$$callerCounts.Keys | % { $$callerCountsString+='IP {0} callerCount {1} ' -f $$ip[1].IPAddress,$$callerCounts.Item($$_) } ;$$footer='' ;$$content='{0}{1}{2}' -f $$header,$$callerCountsString,$$footer ;Write-Output $$content ;$$buffer = [System.Text.Encoding]::UTF8.GetBytes($$content) ;$$response.ContentLength64 = $$buffer.Length ;$$response.OutputStream.Write($$buffer, 0, $$buffer.Length) ;$$response.Close() ;$$responseStatus = $$response.StatusCode ;Write-Host('< {0}' -f $$responseStatus) } ; "
nodeSelector:
kubernetes.io/os: windows
```
From 30bf45ee5e65d8ddd0876738af052bd10e191173 Mon Sep 17 00:00:00 2001
From: Carl Henrik Lunde
Date: Tue, 24 Nov 2020 22:00:16 +0100
Subject: [PATCH 21/80] Update with correct AWS product name
Co-authored-by: Tim Bannister
---
.../docs/concepts/services-networking/ingress-controllers.md | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/content/en/docs/concepts/services-networking/ingress-controllers.md b/content/en/docs/concepts/services-networking/ingress-controllers.md
index f1078ddf10..73cfd6ce20 100644
--- a/content/en/docs/concepts/services-networking/ingress-controllers.md
+++ b/content/en/docs/concepts/services-networking/ingress-controllers.md
@@ -27,7 +27,7 @@ Kubernetes as a project currently supports and maintains [GCE](https://git.k8s.i
controller with [community](https://www.getambassador.io/docs) or
[commercial](https://www.getambassador.io/pro/) support from [Datawire](https://www.datawire.io/).
* [AppsCode Inc.](https://appscode.com) offers support and maintenance for the most widely used [HAProxy](https://www.haproxy.org/) based ingress controller [Voyager](https://appscode.com/products/voyager).
-* [AWS Load Balancer Controller](https://github.com/kubernetes-sigs/aws-load-balancer-controller) (formerly known as AWS ALB Ingress Controller) enables ingress using the [AWS Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/).
+* [AWS Load Balancer Controller](https://github.com/kubernetes-sigs/aws-load-balancer-controller) (formerly known as AWS ALB Ingress Controller) enables ingress using [AWS Elastic Load Balancing](https://aws.amazon.com/elasticloadbalancing/).
* [Contour](https://projectcontour.io/) is an [Envoy](https://www.envoyproxy.io/) based ingress controller
provided and supported by VMware.
* Citrix provides an [Ingress Controller](https://github.com/citrix/citrix-k8s-ingress-controller) for its hardware (MPX), virtualized (VPX) and [free containerized (CPX) ADC](https://www.citrix.com/products/citrix-adc/cpx-express.html) for [baremetal](https://github.com/citrix/citrix-k8s-ingress-controller/tree/master/deployment/baremetal) and [cloud](https://github.com/citrix/citrix-k8s-ingress-controller/tree/master/deployment) deployments.
@@ -72,4 +72,3 @@ Make sure you review your ingress controller's documentation to understand the c
* Learn more about [Ingress](/docs/concepts/services-networking/ingress/).
* [Set up Ingress on Minikube with the NGINX Controller](/docs/tasks/access-application-cluster/ingress-minikube).
-
From e97677e6de428560f32f8dd073338978861f1201 Mon Sep 17 00:00:00 2001
From: Qiming Teng
Date: Fri, 13 Nov 2020 13:46:57 +0800
Subject: [PATCH 22/80] [zh] Sync changes from English site (5)
---
...ries-to-pod-etc-hosts-with-host-aliases.md | 98 ++--
.../connect-applications-service.md | 3 +-
.../services-networking/dns-pod-service.md | 95 +++-
.../services-networking/dual-stack.md | 12 +-
.../ingress-controllers.md | 13 +-
.../concepts/services-networking/ingress.md | 17 +-
.../concepts/services-networking/service.md | 510 +++++++++---------
7 files changed, 423 insertions(+), 325 deletions(-)
diff --git a/content/zh/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases.md b/content/zh/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases.md
index 6db722eed5..4229689422 100644
--- a/content/zh/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases.md
+++ b/content/zh/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases.md
@@ -2,52 +2,62 @@
title: 使用 HostAliases 向 Pod /etc/hosts 文件添加条目
content_type: concept
weight: 60
+min-kubernetes-server-version: 1.7
---
-{{< toc >}}
+
+当 DNS 配置以及其它选项不合理的时候,通过向 Pod 的 /etc/hosts 文件中添加条目,
+可以在 Pod 级别覆盖对主机名的解析。你可以通过 PodSpec 的 HostAliases
+字段来添加这些自定义条目。
-当 DNS 配置以及其它选项不合理的时候,通过向 Pod 的 /etc/hosts 文件中添加条目,可以在 Pod 级别覆盖对主机名的解析。在 1.7 版本,用户可以通过 PodSpec 的 HostAliases 字段来添加这些自定义的条目。
-
-建议通过使用 HostAliases 来进行修改,因为该文件由 Kubelet 管理,并且可以在 Pod 创建/重启过程中被重写。
-
+建议通过使用 HostAliases 来进行修改,因为该文件由 Kubelet 管理,并且
+可以在 Pod 创建/重启过程中被重写。
## 默认 hosts 文件内容
-让我们从一个 Nginx Pod 开始,给该 Pod 分配一个 IP:
+让我们从一个 Nginx Pod 开始,该 Pod 被分配一个 IP:
```shell
kubectl run nginx --image nginx --generator=run-pod/v1
```
-```shell
+```
pod/nginx created
```
-检查Pod IP:
+检查 Pod IP:
```shell
kubectl get pods --output=wide
```
-```shell
+```
NAME READY STATUS RESTARTS AGE IP NODE
nginx 1/1 Running 0 13s 10.200.0.4 worker0
```
@@ -55,14 +65,13 @@ nginx 1/1 Running 0 13s 10.200.0.4 worker0
-
主机文件的内容如下所示:
```shell
kubectl exec nginx -- cat /etc/hosts
```
-```none
+```
# Kubernetes-managed hosts file.
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
@@ -77,63 +86,63 @@ fe00::2 ip6-allrouters
By default, the `hosts` file only includes IPv4 and IPv6 boilerplates like
`localhost` and its own hostname.
-->
-默认,hosts 文件只包含 ipv4 和 ipv6 的样板内容,像 `localhost` 和主机名称。
+默认情况下,hosts 文件只包含 IPv4 和 IPv6 的样板内容,像 `localhost` 和主机名称。
+## 通过 HostAliases 增加额外条目
-## 通过 HostAliases 增加额外的条目
-
-除了默认的样板内容,我们可以向 hosts 文件添加额外的条目,将 `foo.local`、 `bar.local` 解析为`127.0.0.1`,
-将 `foo.remote`、 `bar.remote` 解析为 `10.1.2.3`,我们可以在 `.spec.hostAliases` 下为 Pod 添加 HostAliases。
+除了默认的样板内容,我们可以向 hosts 文件添加额外的条目。
+例如,要将 `foo.local`、`bar.local` 解析为 `127.0.0.1`,
+将 `foo.remote`、 `bar.remote` 解析为 `10.1.2.3`,我们可以在
+`.spec.hostAliases` 下为 Pod 配置 HostAliases。
{{< codenew file="service/networking/hostaliases-pod.yaml" >}}
-
-可以使用以下命令启动此Pod:
+你可以使用以下命令用此配置启动 Pod:
```shell
kubectl apply -f hostaliases-pod.yaml
```
-```shell
+```
pod/hostaliases-pod created
```
-检查Pod IP 和状态:
+检查 Pod 详情,查看其 IPv4 地址和状态:
```shell
kubectl get pod --output=wide
```
-```shell
-NAME READY STATUS RESTARTS AGE IP NODE
-hostaliases-pod 0/1 Completed 0 6s 10.200.0.5 worker0
+```
+NAME READY STATUS RESTARTS AGE IP NODE
+hostaliases-pod 0/1 Completed 0 6s 10.200.0.5 worker0
```
-
hosts 文件的内容看起来类似如下这样:
```shell
kubectl logs hostaliases-pod
```
-```none
+```
# Kubernetes-managed hosts file.
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
@@ -151,30 +160,31 @@ fe00::2 ip6-allrouters
-
在最下面额外添加了一些条目。
+## 为什么 kubelet 管理 hosts 文件?
-## 为什么 Kubelet 管理 hosts文件?
+kubelet [管理](https://github.com/kubernetes/kubernetes/issues/14633) Pod
+中每个容器的 hosts 文件,避免 Docker 在容器已经启动之后去
+[修改](https://github.com/moby/moby/issues/17190) 该文件。
-kubelet [管理](https://github.com/kubernetes/kubernetes/issues/14633) Pod 中每个容器的 hosts 文件,避免 Docker 在容器已经启动之后去 [修改](https://github.com/moby/moby/issues/17190) 该文件。
-
-因为该文件是托管性质的文件,无论容器重启或 Pod 重新调度,用户修改该 hosts 文件的任何内容,都会在 Kubelet 重新安装后被覆盖。因此,不建议修改该文件的内容。
+{{< caution >}}
+
+请避免手工更改容器内的 hosts 文件内容。
+如果你对 hosts 文件做了手工修改,这些修改都会在容器退出时丢失。
+{{< /caution >}}
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 25bebe4d01..06d1744eb2 100644
--- a/content/zh/docs/concepts/services-networking/connect-applications-service.md
+++ b/content/zh/docs/concepts/services-networking/connect-applications-service.md
@@ -205,9 +205,8 @@ 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
-[CoreDNS cluster addon](http://releases.k8s.io/{{< param "githubbranch" >}}/cluster/addons/dns/coredns).
+[CoreDNS cluster addon](https://releases.k8s.io/{{< param "githubbranch" >}}/cluster/addons/dns/coredns).
-->
-
## 访问 Service
Kubernetes支持两种查找服务的主要模式: 环境变量和DNS。 前者开箱即用,而后者则需要[CoreDNS集群插件]
diff --git a/content/zh/docs/concepts/services-networking/dns-pod-service.md b/content/zh/docs/concepts/services-networking/dns-pod-service.md
index 48453424da..fc23f799ae 100644
--- a/content/zh/docs/concepts/services-networking/dns-pod-service.md
+++ b/content/zh/docs/concepts/services-networking/dns-pod-service.md
@@ -42,8 +42,7 @@ considered implementation details and are subject to change without warning.
For more up-to-date specification, see
[Kubernetes DNS-Based Service Discovery](https://github.com/kubernetes/dns/blob/master/docs/specification.md).
-->
-
-## 怎样获取 DNS 名字?
+## 哪些对象会有 DNS 名字? {#what-things-get-dns-names}
在集群中定义的每个 Service(包括 DNS 服务器自身)都会被指派一个 DNS 名称。
默认,一个客户端 Pod 的 DNS 搜索列表将包含该 Pod 自己的名字空间和集群默认域。
@@ -74,7 +73,6 @@ Services, this resolves to the set of IPs of the pods selected by the Service.
Clients are expected to consume the set or else use standard round-robin
selection from the set.
-->
-
### 服务 {#services}
#### A/AAAA 记录
@@ -117,17 +115,35 @@ Kubernetes 会为命名端口创建 SRV 记录,这些端口是普通服务或
### A/AAAA 记录
-经由 Deployment 或者 DaemonSet 所创建的所有 Pods 都会有如下 DNS
-解析项与之对应:
+一般而言,Pod 会对应如下 DNS 名字解析:
-`pod-ip-address.deployment-name.my-namespace.svc.cluster-domain.example.`
+`pod-ip-address.my-namespace.pod.cluster-domain.example`
+
+例如,对于一个位于 `default` 名字空间,IP 地址为 172.17.0.3 的 Pod,
+如果集群的域名为 `cluster.local`,则 Pod 会对应 DNS 名称:
+
+`172-17-0-3.default.pod.cluster.local`.
+
+Deployment 或通过 Service 暴露出来的 DaemonSet 所创建的 Pod 会有如下 DNS
+解析名称可用:
+
+`pod-ip-address.deployment-name.my-namespace.svc.cluster-domain.example`.
-
### Pod 的 hostname 和 subdomain 字段
当前,创建 Pod 时其主机名取自 Pod 的 `metadata.name` 值。
@@ -254,6 +269,51 @@ record unless `publishNotReadyAddresses=True` is set on the Service.
才会有与之对应的记录。
{{< /note >}}
+
+### Pod 的 setHostnameAsFQDN 字段 {#pod-sethostnameasfqdn-field}
+
+{{< feature-state for_k8s_version="v1.19" state="alpha" >}}
+
+
+**前置条件**:`SetHostnameAsFQDN`
+[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/)
+必须在 {{< glossary_tooltip text="API 服务器" term_id="kube-apiserver" >}}
+上启用。
+
+当你在 Pod 规约中设置了 `setHostnameAsFQDN: true` 时,kubelet 会将 Pod
+的全限定域名(FQDN)作为该 Pod 的主机名记录到 Pod 所在名字空间。
+在这种情况下,`hostname` 和 `hostname --fqdn` 都会返回 Pod 的全限定域名。
+
+{{< note >}}
+
+在 Linux 中,内核的主机名字段(`struct utsname` 的 `nodename` 字段)限定
+最多 64 个字符。
+
+如果 Pod 启用这一特性,而其 FQDN 超出 64 字符,Pod 的启动会失败。
+Pod 会一直出于 `Pending` 状态(通过 `kubectl` 所看到的 `ContainerCreating`),
+并产生错误事件,例如
+"Failed to construct FQDN from pod hostname and cluster domain, FQDN
+`long-FQDN` is too long (64 characters is the max, 70 characters requested)."
+(无法基于 Pod 主机名和集群域名构造 FQDN,FQDN `long-FQDN` 过长,至多 64
+字符,请求字符数为 70)。
+对于这种场景而言,改善用户体验的一种方式是创建一个
+[准入 Webhook 控制器](/zh/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks),
+在用户创建顶层对象(如 Deployment)的时候控制 FQDN 的长度。
+{{< /note >}}
+
+### Pod 的 DNS 策略 {#pod-s-dns-policy}
-- "`Default`": Pod 从运行所在的节点继承名称解析配置。
- 参考[相关讨论](/zh/docs/tasks/administer-cluster/dns-custom-nameservers/#inheriting-dns-from-the-node) 获取更多信息。
-- "`ClusterFirst`": 与配置的集群域后缀不匹配的任何 DNS 查询(例如 “www.kubernetes.io”)
+DNS 策略可以逐个 Pod 来设定。目前 Kubernetes 支持以下特定 Pod 的 DNS 策略。
+这些策略可以在 Pod 规约中的 `dnsPolicy` 字段设置:
+
+- "`Default`": Pod 从运行所在的节点继承名称解析配置。参考
+ [相关讨论](/zh/docs/tasks/administer-cluster/dns-custom-nameservers/#inheriting-dns-from-the-node)
+ 获取更多信息。
+- "`ClusterFirst`": 与配置的集群域后缀不匹配的任何 DNS 查询(例如 "www.kubernetes.io")
都将转发到从节点继承的上游名称服务器。集群管理员可能配置了额外的存根域和上游 DNS 服务器。
参阅[相关讨论](/zh/docs/tasks/administer-cluster/dns-custom-nameservers/#impacts-on-pods)
了解在这些场景中如何处理 DNS 查询的信息。
@@ -293,10 +358,10 @@ following pod-specific DNS policies. These policies are specified in the
{{< note >}}
-"`Default`" 不是默认的 DNS 策略。如果未明确指定 `dnsPolicy`,则使用 "`ClusterFirst`"。
+"Default" 不是默认的 DNS 策略。如果未明确指定 `dnsPolicy`,则使用 "ClusterFirst"。
{{< /note >}}
-公共路由和非公共路由的 IPv6 地址块的使用是可以的。提供底层
-{{< glossary_tooltip text="CNI" term_id="cni" >}} 的提供程序可以实现这种传输。
+可以使用可公共路由和非可公共路由的 IPv6 地址块,前提是下层的
+{{< glossary_tooltip text="CNI" term_id="cni" >}} 提供程序可以实现这种传输。
如果你拥有使用非公共路由 IPv6 地址的 Pod,并且希望该 Pod 到达集群外目的
(比如,公共网络),你必须为出口流量和任何响应消息设置 IP 伪装。
-[ip-masq-agent](https://github.com/kubernetes-incubator/ip-masq-agent) 可以感知双栈,
+[ip-masq-agent](https://github.com/kubernetes-sigs/ip-masq-agent) 可以感知双栈,
所以你可以在双栈集群中使用 ip-masq-agent 来进行 IP 伪装。
- * Kubenet 强制 IPv4,IPv6 的 IPs 位置报告 (`--cluster-cidr`)
+* Kubenet 强制 IPv4,IPv6 的 IPs 位置报告 (`--cluster-cidr`)
## {{% heading "whatsnext" %}}
diff --git a/content/zh/docs/concepts/services-networking/ingress-controllers.md b/content/zh/docs/concepts/services-networking/ingress-controllers.md
index 4071ea6189..6b31e610d6 100644
--- a/content/zh/docs/concepts/services-networking/ingress-controllers.md
+++ b/content/zh/docs/concepts/services-networking/ingress-controllers.md
@@ -25,7 +25,7 @@ Kubernetes as a project currently supports and maintains [GCE](https://git.k8s.i
为了让 Ingress 资源工作,集群必须有一个正在运行的 Ingress 控制器。
与作为 `kube-controller-manager` 可执行文件的一部分运行的其他类型的控制器不同,Ingress 控制器不是随集群自动启动的。
-基于此页面,您可选择最适合您的集群的 ingress 控制器实现。
+基于此页面,你可选择最适合你的集群的 ingress 控制器实现。
Kubernetes 作为一个项目,目前支持和维护 [GCE](https://git.k8s.io/ingress-gce/README.md)
和 [nginx](https://git.k8s.io/ingress-nginx/README.md) 控制器。
@@ -42,7 +42,7 @@ Kubernetes 作为一个项目,目前支持和维护 [GCE](https://git.k8s.io/i
* [Ambassador](https://www.getambassador.io/) API Gateway is an [Envoy](https://www.envoyproxy.io) based ingress
controller with [community](https://www.getambassador.io/docs) or
[commercial](https://www.getambassador.io/pro/) support from [Datawire](https://www.datawire.io/).
-* [AppsCode Inc.](https://appscode.com) offers support and maintenance for the most widely used [HAProxy](http://www.haproxy.org/) based ingress controller [Voyager](https://appscode.com/products/voyager).
+* [AppsCode Inc.](https://appscode.com) offers support and maintenance for the most widely used [HAProxy](https://www.haproxy.org/) based ingress controller [Voyager](https://appscode.com/products/voyager).
* [AWS ALB Ingress Controller](https://github.com/kubernetes-sigs/aws-alb-ingress-controller) enables ingress using the [AWS Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/).
* [Contour](https://projectcontour.io/) is an [Envoy](https://www.envoyproxy.io/) based ingress controller
provided and supported by VMware.
@@ -95,7 +95,8 @@ Kubernetes 作为一个项目,目前支持和维护 [GCE](https://git.k8s.io/i
* [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).
* [Skipper](https://opensource.zalando.com/skipper/kubernetes/ingress-controller/) HTTP router and reverse proxy for service composition, including use cases like Kubernetes Ingress, designed as a library to build your custom proxy
-* [Traefik](https://github.com/containous/traefik) is a fully featured ingress controller
+
+* [Traefik](https://github.com/traefik/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).
-->
@@ -107,9 +108,9 @@ Kubernetes 作为一个项目,目前支持和维护 [GCE](https://git.k8s.io/i
[用于 Kubernetes 的 NGINX Ingress 控制器](https://www.nginx.com/products/nginx/kubernetes-ingress-controller)
提供支持和维护。
* [Skipper](https://opensource.zalando.com/skipper/kubernetes/ingress-controller/) HTTP 路由器和反向代理,用于服务组合,包括诸如 Kubernetes Ingress 之类的用例,被设计为用于构建自定义代理的库。
-* [Traefik](https://github.com/containous/traefik) 是一个全功能的 ingress 控制器
+* [Traefik](https://github.com/traefik/traefik) 是一个全功能的 Ingress 控制器。
([Let's Encrypt](https://letsencrypt.org),secrets,http2,websocket),
- 并且它也有来自 [Containous](https://containo.us/services) 的商业支持。
+ 并且它也有来自 [Traefik Labs](https://traefik.io) 的商业支持。
{{< note >}}
-确保您查看了 ingress 控制器的文档,以了解选择它的注意事项。
+确保你查看了 ingress 控制器的文档,以了解选择它的注意事项。
{{< /note >}}
## {{% heading "whatsnext" %}}
diff --git a/content/zh/docs/concepts/services-networking/ingress.md b/content/zh/docs/concepts/services-networking/ingress.md
index 6a5cb35739..e3dd00dede 100644
--- a/content/zh/docs/concepts/services-networking/ingress.md
+++ b/content/zh/docs/concepts/services-networking/ingress.md
@@ -708,6 +708,18 @@ Name (CN), also known as a Fully Qualified Domain Name (FQDN) for `https-example
你需要确保创建的 TLS Secret 创建自包含 `sslexample.foo.com` 的公用名称(CN)的证书。
这里的公共名称也被称为全限定域名(FQDN)。
+{{< note >}}
+
+注意,默认规则上无法使用 TLS,因为需要为所有可能的子域名发放证书。
+因此,`tls` 节区的 `hosts` 的取值需要域 `rules` 节区的 `host`
+完全匹配。
+{{< /note >}}
+
{{< codenew file="service/networking/tls-example-ingress.yaml" >}}
-使用 Kubernetes,您无需修改应用程序即可使用不熟悉的服务发现机制。
+使用 Kubernetes,你无需修改应用程序即可使用不熟悉的服务发现机制。
Kubernetes 为 Pods 提供自己的 IP 地址,并为一组 Pod 提供相同的 DNS 名,
并且可以在它们之间进行负载均衡。
@@ -60,12 +60,12 @@ Enter _Services_.
Kubernetes {{< glossary_tooltip term_id="pod" text="Pod" >}} 是有生命周期的。
它们可以被创建,而且销毁之后不会再启动。
-如果您使用 {{< glossary_tooltip text="Deployment" term_id="deployment">}}
-来运行您的应用程序,则它可以动态创建和销毁 Pod。
+如果你使用 {{< glossary_tooltip text="Deployment" term_id="deployment">}}
+来运行你的应用程序,则它可以动态创建和销毁 Pod。
每个 Pod 都有自己的 IP 地址,但是在 Deployment 中,在同一时刻运行的 Pod 集合可能与稍后运行该应用程序的 Pod 集合不同。
-这导致了一个问题: 如果一组 Pod(称为“后端”)为群集内的其他 Pod(称为“前端”)提供功能,
+这导致了一个问题: 如果一组 Pod(称为“后端”)为集群内的其他 Pod(称为“前端”)提供功能,
那么前端如何找出并跟踪要连接的 IP 地址,以便前端可以使用工作量的后端部分?
进入 _Services_。
@@ -79,13 +79,13 @@ Kubernetes {{< glossary_tooltip term_id="pod" text="Pod" >}} 是有生命周期
In Kubernetes, a Service is an abstraction which defines a logical set of Pods
and a policy by which to access them (sometimes this pattern is called
a micro-service). The set of Pods targeted by a Service is usually determined
-by a {{< glossary_tooltip text="selector" term_id="selector" >}}
-(see [below](#services-without-selectors) for why you might want a Service
-_without_ a selector).
+by a {{< glossary_tooltip text="selector" term_id="selector" >}}.
+To learn about other ways to define Service endpoints,
+see [Services _without_ selectors](#services-without-selectors).
-->
Kubernetes Service 定义了这样一种抽象:逻辑上的一组 Pod,一种可以访问它们的策略 —— 通常称为微服务。
这一组 Pod 能够被 Service 访问到,通常是通过 {{< glossary_tooltip text="选择算符" term_id="selector" >}}
-(查看[下面](#services-without-selectors)了解,为什么你可能需要没有 selector 的 Service)实现的。
+要了解如何定义服务端点,请参阅[不带选择算符的服务](#services-without-selectors)。
### 云原生服务发现
-如果您想要在应用程序中使用 Kubernetes API 进行服务发现,则可以查询
+如果你想要在应用程序中使用 Kubernetes API 进行服务发现,则可以查询
{{< glossary_tooltip text="API 服务器" term_id="kube-apiserver" >}}
的 Endpoints 资源,只要服务中的 Pod 集合发生更改,Endpoints 就会被更新。
@@ -126,6 +126,8 @@ balancer in between your application and the backend Pods.
A Service in Kubernetes is a REST object, similar to a Pod. Like all of the
REST objects, you can `POST` a Service definition to the API server to create
a new instance.
+The name of a Service object must be a valid
+[DNS label name](/docs/concepts/overview/working-with-objects/names#dns-label-names).
For example, suppose you have a set of Pods that each listen on TCP port 9376
and carry a label `app=MyApp`:
@@ -135,6 +137,8 @@ and carry a label `app=MyApp`:
Service 在 Kubernetes 中是一个 REST 对象,和 Pod 类似。
像所有的 REST 对象一样,Service 定义可以基于 `POST` 方式,请求 API server 创建新的实例。
+Service 对象的名称必须是合法的
+[DNS 标签名称](/zh/docs/concepts/overview/working-with-objects/names#dns-label-names)。
例如,假定有一组 Pod,它们对外暴露了 9376 端口,同时还被打上 `app=MyApp` 标签。
@@ -200,9 +204,9 @@ Each port definition can have the same `protocol`, or a different one.
Pod 中的端口定义是有名字的,你可以在服务的 `targetPort` 属性中引用这些名称。
即使服务中使用单个配置的名称混合使用 Pod,并且通过不同的端口号提供相同的网络协议,此功能也可以使用。
这为部署和发展服务提供了很大的灵活性。
-例如,您可以更改Pods在新版本的后端软件中公开的端口号,而不会破坏客户端。
+例如,你可以更改 Pods 在新版本的后端软件中公开的端口号,而不会破坏客户端。
-服务的默认协议是TCP。 您还可以使用任何其他[受支持的协议](#protocol-support)。
+服务的默认协议是TCP。 你还可以使用任何其他[受支持的协议](#protocol-support)。
由于许多服务需要公开多个端口,因此 Kubernetes 在服务对象上支持多个端口定义。
每个端口定义可以具有相同的 `protocol`,也可以具有不同的协议。
@@ -231,7 +235,7 @@ For example:
* 希望在生产环境中使用外部的数据库集群,但测试环境使用自己的数据库。
* 希望服务指向另一个 {{< glossary_tooltip term_id="namespace" >}} 中或其它集群中的服务。
- * 您正在将工作负载迁移到 Kubernetes。 在评估该方法时,您仅在 Kubernetes 中运行一部分后端。
+ * 你正在将工作负载迁移到 Kubernetes。 在评估该方法时,你仅在 Kubernetes 中运行一部分后端。
在任何这些场景中,都能够定义没有选择算符的 Service。
实例:
@@ -254,7 +258,7 @@ created automatically. You can manually map the Service to the network address a
where it's running, by adding an Endpoint object manually:
-->
由于此服务没有选择算符,因此 *不会* 自动创建相应的 Endpoint 对象。
-您可以通过手动添加 Endpoint 对象,将服务手动映射到运行该服务的网络地址和端口:
+你可以通过手动添加 Endpoint 对象,将服务手动映射到运行该服务的网络地址和端口:
```yaml
apiVersion: v1
@@ -267,6 +271,12 @@ subsets:
ports:
- port: 9376
```
+
+Endpoints 对象的名称必须是合法的
+[DNS 子域名](/zh/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)。
-### Endpoint 切片
+### EndpointSlice
-{{< feature-state for_k8s_version="v1.16" state="alpha" >}}
+{{< feature-state for_k8s_version="v1.17" state="beta" >}}
Endpoint 切片是一种 API 资源,可以为 Endpoint 提供更可扩展的替代方案。
尽管从概念上讲与 Endpoint 非常相似,但 Endpoint 切片允许跨多个资源分布网络端点。
@@ -323,26 +333,21 @@ Endpoint 切片是一种 API 资源,可以为 Endpoint 提供更可扩展的
届时将创建其他 Endpoint 切片来存储任何其他 Endpoint。
Endpoint 切片提供了附加的属性和功能,这些属性和功能在
-[Endpoint 切片](/zh/docs/concepts/services-networking/endpoint-slices/)中有详细描述。
+[EndpointSlices](/zh/docs/concepts/services-networking/endpoint-slices/)
+中有详细描述。
-### 应用程序协议
+### 应用程序协议 {#application-protocol}
-{{< feature-state for_k8s_version="v1.18" state="alpha" >}}
+{{< feature-state for_k8s_version="v1.19" state="beta" >}}
-`appProtocol` 字段提供了一种为每个 Service 端口指定应用程序协议的方式。
-
-作为一个 alpha 特性,该字段默认未启用。要使用该字段,请启用 `ServiceAppProtocol`
-[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/)。
+`appProtocol` 字段提供了一种为每个 Service 端口指定应用协议的方式。
+此字段的取值会被映射到对应的 Endpoints 和 EndpointSlices 资源。
-
-## VIP 和 Service 代理 {#virtual-ips-and-service-proxies}
+## 虚拟 IP 和 Service 代理 {#virtual-ips-and-service-proxies}
在 Kubernetes 集群中,每个 Node 运行一个 `kube-proxy` 进程。
`kube-proxy` 负责为 Service 实现了一种 VIP(虚拟 IP)的形式,而不是
@@ -376,33 +380,17 @@ There are a few reasons for using proxying for Services:
on the DNS records could impose a high load on DNS that then becomes
difficult to manage.
-->
-
### 为什么不使用 DNS 轮询?
-时不时会有人问到,就是为什么 Kubernetes 依赖代理将入站流量转发到后端。 那其他方法呢?
-例如,是否可以配置具有多个A值(或IPv6为AAAA)的DNS记录,并依靠轮询名称解析?
+时不时会有人问到为什么 Kubernetes 依赖代理将入站流量转发到后端。那其他方法呢?
+例如,是否可以配置具有多个 A 值(或 IPv6 为 AAAA)的 DNS 记录,并依靠轮询名称解析?
使用服务代理有以下几个原因:
- * DNS 实现的历史由来已久,它不遵守记录 TTL,并且在名称查找结果到期后对其进行缓存。
- * 有些应用程序仅执行一次 DNS 查找,并无限期地缓存结果。
- * 即使应用和库进行了适当的重新解析,DNS 记录上的 TTL 值低或为零也可能会给 DNS 带来高负载,从而使管理变得困难。
-
-
-
-### 版本兼容性
-
-从 Kubernetes v1.0 开始,您已经可以使用 [用户空间代理模式](#proxy-mode-userspace)。
-Kubernetes v1.1 添加了 iptables 模式代理,在 Kubernetes v1.2 中,kube-proxy 的 iptables 模式成为默认设置。
-Kubernetes v1.8 添加了 ipvs 代理模式。
+* DNS 实现的历史由来已久,它不遵守记录 TTL,并且在名称查找结果到期后对其进行缓存。
+* 有些应用程序仅执行一次 DNS 查找,并无限期地缓存结果。
+* 即使应用和库进行了适当的重新解析,DNS 记录上的 TTL 值低或为零也可能会给
+ DNS 带来高负载,从而使管理变得困难。
-
在 `ipvs` 模式下,kube-proxy监视Kubernetes服务和端点,调用 `netlink` 接口相应地创建 IPVS 规则,
并定期将 IPVS 规则与 Kubernetes 服务和端点同步。 该控制循环可确保IPVS
状态与所需状态匹配。访问服务时,IPVS 将流量定向到后端Pod之一。
@@ -572,7 +559,7 @@ You can also set the maximum session sticky time by setting
则可以通过将 `service.spec.sessionAffinity` 设置为 "ClientIP"
(默认值是 "None"),来基于客户端的 IP 地址选择会话关联。
-您还可以通过适当设置 `service.spec.sessionAffinityConfig.clientIP.timeoutSeconds`
+你还可以通过适当设置 `service.spec.sessionAffinityConfig.clientIP.timeoutSeconds`
来设置最大会话停留时间。
(默认值为 10800 秒,即 3 小时)。
@@ -585,10 +572,10 @@ When using multiple ports for a Service, you must give all of your ports names
so that these are unambiguous.
For example:
-->
-## 多端口 Service
+## 多端口 Service {#multi-port-services}
-对于某些服务,您需要公开多个端口。
-Kubernetes 允许您在 Service 对象上配置多个端口定义。
+对于某些服务,你需要公开多个端口。
+Kubernetes 允许你在 Service 对象上配置多个端口定义。
为服务使用多个端口时,必须提供所有端口名称,以使它们无歧义。
例如:
@@ -639,7 +626,6 @@ The IP address that you choose must be a valid IPv4 or IPv6 address from within
If you try to create a Service with an invalid clusterIP address value, the API
server will return a 422 HTTP status code to indicate that there's a problem.
-->
-
## 选择自己的 IP 地址
在 `Service` 创建的请求中,可以通过设置 `spec.clusterIP` 字段来指定自己的集群 IP 地址。
@@ -673,7 +659,7 @@ For example, the Service `"redis-master"` which exposes TCP port 6379 and has be
allocated cluster IP address 10.0.0.11, produces the following environment
variables:
-->
-### 环境变量
+### 环境变量 {#environment-variables}
当 Pod 运行在 `Node` 上,kubelet 会为每个活跃的 Service 添加一组环境变量。
它同时支持 [Docker links兼容](https://docs.docker.com/userguide/dockerlinks/) 变量
@@ -704,11 +690,11 @@ If you only use DNS to discover the cluster IP for a Service, you don't need to
worry about this ordering issue.
-->
{{< note >}}
-当您具有需要访问服务的Pod时,并且您正在使用环境变量方法将端口和群集 IP 发布到客户端
+当你具有需要访问服务的 Pod 时,并且你正在使用环境变量方法将端口和集群 IP 发布到客户端
Pod 时,必须在客户端 Pod 出现 *之前* 创建服务。
否则,这些客户端 Pod 将不会设定其环境变量。
-如果仅使用 DNS 查找服务的群集 IP,则无需担心此设定问题。
+如果仅使用 DNS 查找服务的集群 IP,则无需担心此设定问题。
{{< /note >}}
### DNS
@@ -721,7 +707,14 @@ A cluster-aware DNS server, such as CoreDNS, watches the Kubernetes API for new
Services and creates a set of DNS records for each one. If DNS has been enabled
throughout your cluster then all Pods should automatically be able to resolve
Services by their DNS name.
+-->
+你可以(几乎总是应该)使用[附加组件](/zh/docs/concepts/cluster-administration/addons/)
+为 Kubernetes 集群设置 DNS 服务。
+支持集群的 DNS 服务器(例如 CoreDNS)监视 Kubernetes API 中的新服务,并为每个服务创建一组 DNS 记录。
+如果在整个集群中都启用了 DNS,则所有 Pod 都应该能够通过其 DNS 名称自动解析服务。
+
+
+例如,如果你在 Kubernetes 命名空间 `"my-ns"` 中有一个名为 `"my-service"` 的服务,
+则控制平面和 DNS 服务共同为 `"my-service.my-ns"` 创建 DNS 记录。
+`"my-ns"` 命名空间中的 Pod 应该能够通过简单地对 `my-service` 进行名称查找来找到它
+(`"my-service.my-ns"` 也可以工作)。
+其他命名空间中的 Pod 必须将名称限定为 `my-service.my-ns`。
+这些名称将解析为为服务分配的集群 IP。
+
+
-您可以(几乎总是应该)使用[附加组件](/zh/docs/concepts/cluster-administration/addons/)
-为 Kubernetes 集群设置 DNS 服务。
-
-支持群集的 DNS 服务器(例如 CoreDNS)监视 Kubernetes API 中的新服务,并为每个服务创建一组 DNS 记录。
-如果在整个群集中都启用了 DNS,则所有 Pod 都应该能够通过其 DNS 名称自动解析服务。
-
-例如,如果您在 Kubernetes 命名空间 `"my-ns"` 中有一个名为 `"my-service"` 的服务,
-则控制平面和DNS服务共同为 `"my-service.my-ns"` 创建 DNS 记录。
-`"my-ns"` 命名空间中的 Pod 应该能够通过简单地对 `my-service` 进行名称查找来找到它
-(`"my-service.my-ns"` 也可以工作)。
-
-其他命名空间中的Pod必须将名称限定为 `my-service.my-ns`。这些名称将解析为为服务分配的群集 IP。
-
Kubernetes 还支持命名端口的 DNS SRV(服务)记录。
如果 `"my-service.my-ns"` 服务具有名为 `"http"` 的端口,且协议设置为 TCP,
则可以对 `_http._tcp.my-service.my-ns` 执行 DNS SRV 查询查询以发现该端口号,
@@ -762,9 +751,9 @@ Kubernetes DNS 服务器是唯一的一种能够访问 `ExternalName` 类型的
更多关于 `ExternalName` 信息可以查看
[DNS Pod 和 Service](/zh/docs/concepts/services-networking/dns-pod-service/)。
+
+## 无头服务(Headless Services) {#headless-services}
+
有时不需要或不想要负载均衡,以及单独的 Service IP。
遇到这种情况,可以通过指定 Cluster IP(`spec.clusterIP`)的值为 `"None"`
来创建 `Headless` Service。
-您可以使用无头 Service 与其他服务发现机制进行接口,而不必与 Kubernetes 的实现捆绑在一起。
+你可以使用无头 Service 与其他服务发现机制进行接口,而不必与 Kubernetes
+的实现捆绑在一起。
对这无头 Service 并不会分配 Cluster IP,kube-proxy 不会处理它们,
而且平台也不会为它们进行负载均衡和路由。
@@ -794,8 +786,7 @@ For headless Services that define selectors, the endpoints controller creates
`Endpoints` records in the API, and modifies the DNS configuration to return
records (addresses) that point directly to the `Pods` backing the Service.
-->
-
-### 带选择算符的服务
+### 带选择算符的服务 {#with-selectors}
对定义了选择算符的无头服务,Endpoint 控制器在 API 中创建了 Endpoints 记录,
并且修改 DNS 配置返回 A 记录(地址),通过这个地址直接到达 Service 的后端 Pod 上。
@@ -807,18 +798,17 @@ For headless Services that do not define selectors, the endpoints controller doe
not create `Endpoints` records. However, the DNS system looks for and configures
either:
- * CNAME records for [`ExternalName`](#externalname)-type Services.
- * A records for any `Endpoints` that share a name with the Service, for all
- other types.
+* CNAME records for [`ExternalName`](#externalname)-type Services.
+* A records for any `Endpoints` that share a name with the Service, for all
+ other types.
-->
-
-### 无选择算符的服务
+### 无选择算符的服务 {#without-selectors}
对没有定义选择算符的无头服务,Endpoint 控制器不会创建 `Endpoints` 记录。
然而 DNS 系统会查找和配置,无论是:
- * `ExternalName` 类型 Service 的 CNAME 记录
- * 记录:与 Service 共享一个名称的任何 `Endpoints`,以及所有其它类型
+* 对于 [`ExternalName`](#external-name) 类型的服务,查找其 CNAME 记录
+* 对所有其他类型的服务,查找与 Service 名称相同的任何 `Endpoints` 的记录
-## 发布服务 —— 服务类型 {#publishing-services-service-types}
+## 发布服务(服务类型) {#publishing-services-service-types}
-对一些应用(如前端)的某些部分,可能希望通过外部 Kubernetes 集群外部 IP 地址暴露 Service。
+对一些应用的某些部分(如前端),可能希望将其暴露给 Kubernetes 集群外部
+的 IP 地址。
-Kubernetes `ServiceTypes` 允许指定一个需要的类型的 Service,默认是 `ClusterIP` 类型。
+Kubernetes `ServiceTypes` 允许指定你所需要的 Service 类型,默认是 `ClusterIP`。
`Type` 的取值以及行为如下:
- * `ClusterIP`:通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的 `ServiceType`。
- * [`NodePort`](#nodeport):通过每个 Node 上的 IP 和静态端口(`NodePort`)暴露服务。
- `NodePort` 服务会路由到 `ClusterIP` 服务,这个 `ClusterIP` 服务会自动创建。
- 通过请求 `:`,可以从集群的外部访问一个 `NodePort` 服务。
- * [`LoadBalancer`](#loadbalancer):使用云提供商的负载均衡器,可以向外部暴露服务。
- 外部的负载均衡器可以路由到 `NodePort` 服务和 `ClusterIP` 服务。
- * [`ExternalName`](#externalname):通过返回 `CNAME` 和它的值,可以将服务映射到 `externalName`
- 字段的内容(例如, `foo.bar.example.com`)。
- 没有任何类型代理被创建。
+
+* `ClusterIP`:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。
+ 这也是默认的 `ServiceType`。
+* [`NodePort`](#nodeport):通过每个节点上的 IP 和静态端口(`NodePort`)暴露服务。
+ `NodePort` 服务会路由到自动创建的 `ClusterIP` 服务。
+ 通过请求 `<节点 IP>:<节点端口>`,你可以从集群的外部访问一个 `NodePort` 服务。
+* [`LoadBalancer`](#loadbalancer):使用云提供商的负载均衡器向外部暴露服务。
+ 外部负载均衡器可以将流量路由到自动创建的 `NodePort` 服务和 `ClusterIP` 服务上。
+* [`ExternalName`](#externalname):通过返回 `CNAME` 和对应值,可以将服务映射到
+ `externalName` 字段的内容(例如,`foo.bar.example.com`)。
+ 无需创建任何类型代理。
- {{< note >}}
- 您需要 CoreDNS 1.7 或更高版本才能使用 `ExternalName` 类型。
- {{< /note >}}
+ {{< note >}}
+ 你需要 CoreDNS 1.7 或更高版本才能使用 `ExternalName` 类型。
+ {{< /note >}}
-您也可以使用 [Ingress](/zh/docs/concepts/services-networking/ingress/) 来暴露自己的服务。
-Ingress 不是服务类型,但它充当集群的入口点。
+
+你也可以使用 [Ingress](/zh/docs/concepts/services-networking/ingress/) 来暴露自己的服务。
+Ingress 不是一种服务类型,但它充当集群的入口点。
它可以将路由规则整合到一个资源中,因为它可以在同一IP地址下公开多个服务。
### NodePort 类型 {#nodeport}
-如果将 `type` 字段设置为 `NodePort`,则 Kubernetes 控制平面将在 `--service-node-port-range` 标志指定的范围内分配端口(默认值:30000-32767)。
-每个节点将那个端口(每个节点上的相同端口号)代理到您的服务中。
-您的服务在其 `.spec.ports[*].nodePort` 字段中要求分配的端口。
+如果你将 `type` 字段设置为 `NodePort`,则 Kubernetes 控制平面将在
+`--service-node-port-range` 标志指定的范围内分配端口(默认值:30000-32767)。
+每个节点将那个端口(每个节点上的相同端口号)代理到你的服务中。
+你的服务在其 `.spec.ports[*].nodePort` 字段中要求分配的端口。
-如果您想指定特定的 IP 代理端口,则可以将 kube-proxy 中的 `--nodeport-addresses`
+如果你想指定特定的 IP 代理端口,则可以将 kube-proxy 中的 `--nodeport-addresses`
标志设置为特定的 IP 块。从 Kubernetes v1.10 开始支持此功能。
该标志采用逗号分隔的 IP 块列表(例如,`10.0.0.0/8`、`192.0.2.0/25`)来指定
@@ -912,13 +905,16 @@ This means that you need to take care about possible port collisions yourself.
You also have to use a valid port number, one that's inside the range configured
for NodePort use.
-->
-例如,如果您使用 `--nodeport-addresses=127.0.0.0/8` 标志启动 kube-proxy,则 kube-proxy 仅选择 NodePort Services 的环回接口。
+例如,如果你使用 `--nodeport-addresses=127.0.0.0/8` 标志启动 kube-proxy,
+则 kube-proxy 仅选择 NodePort Services 的本地回路接口。
`--nodeport-addresses` 的默认值是一个空列表。
这意味着 kube-proxy 应该考虑 NodePort 的所有可用网络接口。
(这也与早期的 Kubernetes 版本兼容)。
-如果需要特定的端口号,则可以在 `nodePort` 字段中指定一个值。控制平面将为您分配该端口或向API报告事务失败。
-这意味着您需要自己注意可能发生的端口冲突。您还必须使用有效的端口号,该端口号在配置用于NodePort的范围内。
+如果需要特定的端口号,你可以在 `nodePort` 字段中指定一个值。
+控制平面将为你分配该端口或报告 API 事务失败。
+这意味着你需要自己注意可能发生的端口冲突。
+你还必须使用有效的端口号,该端口号在配置用于 NodePort 的范围内。
-使用 NodePort 可以让您自由设置自己的负载平衡解决方案,配置 Kubernetes 不完全支持的环境,
+使用 NodePort 可以让你自由设置自己的负载均衡解决方案,配置 Kubernetes 不完全支持的环境,
甚至直接暴露一个或多个节点的 IP。
-需要注意的是,Service 能够通过 `:spec.ports[*].nodePort` 和 `spec.clusterIp:spec.ports[*].port` 而对外可见。
+需要注意的是,Service 能够通过 `:spec.ports[*].nodePort` 和
+`spec.clusterIp:spec.ports[*].port` 而对外可见。
例如:
@@ -998,24 +995,34 @@ status:
+来自外部负载均衡器的流量将直接重定向到后端 Pod 上,不过实际它们是如何工作的,这要依赖于云提供商。
+
+对于 LoadBalancer 类型的服务,当所定义的端口不止一个时,所有端口都必须
+使用相同的协议,并且其协议必须是 `TCP`、`UDP` 和 `SCTP` 之一。
+
+
-来自外部负载均衡器的流量将直接重定向到后端 Pod 上,不过实际它们是如何工作的,这要依赖于云提供商。
-
+某些云提供商允许设置 `loadBalancerIP`。
在这些情况下,将根据用户设置的 `loadBalancerIP` 来创建负载均衡器。
-某些云提供商允许设置 `loadBalancerIP`。如果没有设置 `loadBalancerIP`,将会给负载均衡器指派一个临时 IP。
-如果设置了 `loadBalancerIP`,但云提供商并不支持这种特性,那么设置的 `loadBalancerIP` 值将会被忽略掉。
+如果没有设置 `loadBalancerIP` 字段,将会给负载均衡器指派一个临时 IP。
+如果设置了 `loadBalancerIP`,但云提供商并不支持这种特性,那么设置的
+`loadBalancerIP` 值将会被忽略掉。
{{< note >}}
-如果您使用的是 SCTP,请参阅下面有关 `LoadBalancer` 服务类型的
+如果你使用的是 SCTP,请参阅下面有关 `LoadBalancer` 服务类型的
[注意事项](#caveat-sctp-loadbalancer-service-type)。
{{< /note >}}
@@ -1028,13 +1035,16 @@ 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 >}}
-在 **Azure** 上,如果要使用用户指定的公共类型 `loadBalancerIP` ,则首先需要创建静态类型的公共IP地址资源。
-此公共IP地址资源应与群集中其他自动创建的资源位于同一资源组中。 例如,`MC_myResourceGroup_myAKSCluster_eastus`。
+在 **Azure** 上,如果要使用用户指定的公共类型 `loadBalancerIP`,则
+首先需要创建静态类型的公共 IP 地址资源。
+此公共 IP 地址资源应与集群中其他自动创建的资源位于同一资源组中。
+例如,`MC_myResourceGroup_myAKSCluster_eastus`。
-将分配的IP地址指定为 loadBalancerIP。 确保您已更新云提供程序配置文件中的 securityGroupName。
+将分配的 IP 地址设置为 loadBalancerIP。确保你已更新云提供程序配置文件中的
+securityGroupName。
有关对 `CreatingLoadBalancerFailed` 权限问题进行故障排除的信息,
-请参阅 [与Azure Kubernetes服务(AKS)负载平衡器一起使用静态IP地址](https://docs.microsoft.com/en-us/azure/aks/static-ip)
-或[通过高级网络在AKS群集上创建LoadBalancerFailed](https://github.com/Azure/AKS/issues/357)。
+请参阅 [与 Azure Kubernetes服务(AKS)负载平衡器一起使用静态 IP 地址](https://docs.microsoft.com/en-us/azure/aks/static-ip)
+或[在 AKS 集群上使用高级联网时出现 CreatingLoadBalancerFailed](https://github.com/Azure/AKS/issues/357)。
{{< /note >}}
-#### 内部负载均衡器
+#### 内部负载均衡器 {#internal-load-balancer}
在混合环境中,有时有必要在同一(虚拟)网络地址块内路由来自服务的流量。
-在水平分割 DNS 环境中,您需要两个服务才能将内部和外部流量都路由到您的端点(Endpoints)。
-您可以通过向服务添加以下注释之一来实现此目的。
-要添加的注释取决于您使用的云服务提供商。
+在水平分割 DNS 环境中,你需要两个服务才能将内部和外部流量都路由到你的端点(Endpoints)。
+你可以通过向服务添加以下注解之一来实现此目的。
+要添加的注解取决于你使用的云服务提供商。
{{< tabs name="service_tabs" >}}
{{% tab name="Default" %}}
@@ -1072,14 +1082,10 @@ metadata:
cloud.google.com/load-balancer-type: "Internal"
[...]
```
-
-将 `cloud.google.com/load-balancer-type: "internal"` 节点用于版本1.7.0至1.7.3的主服务器。
-有关更多信息,请参见[文档](https://cloud.google.com/kubernetes-engine/docs/internal-load-balancing)。
+
{{% /tab %}}
{{% tab name="AWS" %}}
+
```yaml
[...]
metadata:
@@ -1088,8 +1094,10 @@ metadata:
service.beta.kubernetes.io/aws-load-balancer-internal: "true"
[...]
```
+
{{% /tab %}}
{{% tab name="Azure" %}}
+
```yaml
[...]
metadata:
@@ -1098,8 +1106,10 @@ metadata:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
[...]
```
+
{{% /tab %}}
{{% tab name="IBM Cloud" %}}
+
```yaml
[...]
metadata:
@@ -1108,8 +1118,10 @@ metadata:
service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: "private"
[...]
```
+
{{% /tab %}}
{{% tab name="OpenStack" %}}
+
```yaml
[...]
metadata:
@@ -1118,8 +1130,10 @@ metadata:
service.beta.kubernetes.io/openstack-internal-load-balancer: "true"
[...]
```
+
{{% /tab %}}
{{% tab name="Baidu Cloud" %}}
+
```yaml
[...]
metadata:
@@ -1128,8 +1142,10 @@ metadata:
service.beta.kubernetes.io/cce-load-balancer-internal-vpc: "true"
[...]
```
+
{{% /tab %}}
{{% tab name="Tencent Cloud" %}}
+
```yaml
[...]
metadata:
@@ -1137,8 +1153,10 @@ metadata:
service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: subnet-xxxxx
[...]
```
+
{{% /tab %}}
{{% tab name="Alibaba Cloud" %}}
+
```yaml
[...]
metadata:
@@ -1146,6 +1164,7 @@ metadata:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet"
[...]
```
+
{{% /tab %}}
{{< /tabs >}}
@@ -1157,7 +1176,8 @@ annotations to a `LoadBalancer` service:
-->
### AWS TLS 支持 {#ssl-support-on-aws}
-为了对在AWS上运行的集群提供部分TLS / SSL支持,您可以向 `LoadBalancer` 服务添加三个注释:
+为了对在 AWS 上运行的集群提供 TLS/SSL 部分支持,你可以向 `LoadBalancer`
+服务添加三个注解:
```yaml
metadata:
@@ -1171,8 +1191,8 @@ The first specifies the ARN of the certificate to use. It can be either a
certificate from a third party issuer that was uploaded to IAM or one created
within AWS Certificate Manager.
-->
-
-第一个指定要使用的证书的ARN。 它可以是已上载到 IAM 的第三方颁发者的证书,也可以是在 AWS Certificate Manager 中创建的证书。
+第一个指定要使用的证书的 ARN。 它可以是已上载到 IAM 的第三方颁发者的证书,
+也可以是在 AWS Certificate Manager 中创建的证书。
```yaml
metadata:
@@ -1197,14 +1217,15 @@ modifying the headers.
In a mixed-use environment where some ports are secured and others are left unencrypted,
you can use the following annotations:
-->
-第二个注释指定 Pod 使用哪种协议。 对于 HTTPS 和 SSL,ELB 希望 Pod 使用证书通过加密连接对自己进行身份验证。
+第二个注解指定 Pod 使用哪种协议。 对于 HTTPS 和 SSL,ELB 希望 Pod 使用证书
+通过加密连接对自己进行身份验证。
HTTP 和 HTTPS 选择第7层代理:ELB 终止与用户的连接,解析标头,并在转发请求时向
`X-Forwarded-For` 标头注入用户的 IP 地址(Pod 仅在连接的另一端看到 ELB 的 IP 地址)。
TCP 和 SSL 选择第4层代理:ELB 转发流量而不修改报头。
-在某些端口处于安全状态而其他端口未加密的混合使用环境中,可以使用以下注释:
+在某些端口处于安全状态而其他端口未加密的混合使用环境中,可以使用以下注解:
```yaml
metadata:
@@ -1222,10 +1243,9 @@ be proxied HTTP.
From Kubernetes v1.9 onwards you can use [predefined AWS SSL policies](http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-security-policy-table.html) with HTTPS or SSL listeners for your Services.
To see which policies are available for use, you can use the `aws` command line tool:
-->
-
从 Kubernetes v1.9 起可以使用
[预定义的 AWS SSL 策略](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-security-policy-table.html)
-为您的服务使用 HTTPS 或 SSL 侦听器。
+为你的服务使用 HTTPS 或 SSL 侦听器。
要查看可以使用哪些策略,可以使用 `aws` 命令行工具:
```bash
@@ -1237,8 +1257,8 @@ You can then specify any one of those policies using the
"`service.beta.kubernetes.io/aws-load-balancer-ssl-negotiation-policy`"
annotation; for example:
-->
-然后,您可以使用 "`service.beta.kubernetes.io/aws-load-balancer-ssl-negotiation-policy`" 注解;
-例如:
+然后,你可以使用 "`service.beta.kubernetes.io/aws-load-balancer-ssl-negotiation-policy`"
+注解; 例如:
```yaml
metadata:
@@ -1256,8 +1276,9 @@ annotation:
-->
#### AWS 上的 PROXY 协议支持
-为了支持在 AWS 上运行的集群,启用 [PROXY 协议](https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt)。
-您可以使用以下服务注释:
+为了支持在 AWS 上运行的集群,启用
+[PROXY 协议](https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt)。
+你可以使用以下服务注解:
```yaml
metadata:
@@ -1270,7 +1291,7 @@ annotation:
Since version 1.3.0, the use of this annotation applies to all ports proxied by the ELB
and cannot be configured otherwise.
-->
-从 1.3.0 版开始,此注释的使用适用于 ELB 代理的所有端口,并且不能进行其他配置。
+从 1.3.0 版开始,此注解的使用适用于 ELB 代理的所有端口,并且不能进行其他配置。
#### AWS 上的 ELB 访问日志
-有几个注释可用于管理 AWS 上 ELB 服务的访问日志。
+有几个注解可用于管理 AWS 上 ELB 服务的访问日志。
-注释 `service.beta.kubernetes.io/aws-load-balancer-access-log-enabled` 控制是否启用访问日志。
+注解 `service.beta.kubernetes.io/aws-load-balancer-access-log-enabled` 控制是否启用访问日志。
注解 `service.beta.kubernetes.io/aws-load-balancer-access-log-emit-interval`
-控制发布访问日志的时间间隔(以分钟为单位)。您可以指定 5 分钟或 60 分钟的间隔。
+控制发布访问日志的时间间隔(以分钟为单位)。你可以指定 5 分钟或 60 分钟的间隔。
-注释 `service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-name`
+注解 `service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-name`
控制存储负载均衡器访问日志的 Amazon S3 存储桶的名称。
-注释 `service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-prefix`
+注解 `service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-prefix`
指定为 Amazon S3 存储桶创建的逻辑层次结构。
```yaml
@@ -1348,13 +1369,13 @@ specifies the logical hierarchy you created for your Amazon S3 bucket.
name: my-service
annotations:
service.beta.kubernetes.io/aws-load-balancer-access-log-enabled: "true"
- # Specifies whether access logs are enabled for the load balancer
+ # 指定是否为负载均衡器启用访问日志
service.beta.kubernetes.io/aws-load-balancer-access-log-emit-interval: "60"
- # The interval for publishing the access logs. You can specify an interval of either 5 or 60 (minutes).
+ # 发布访问日志的时间间隔。你可以将其设置为 5 分钟或 60 分钟。
service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-name: "my-bucket"
- # The name of the Amazon S3 bucket where the access logs are stored
+ # 用来存放访问日志的 Amazon S3 Bucket 名称
service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-prefix: "my-bucket-prefix/prod"
- # The logical hierarchy you created for your Amazon S3 bucket, for example `my-bucket-prefix/prod`
+ # 你为 Amazon S3 Bucket 所创建的逻辑层次结构,例如 `my-bucket-prefix/prod`
```
#### 其他 ELB 注解
-还有其他一些注释,用于管理经典弹性负载均衡器,如下所述。
+还有其他一些注解,用于管理经典弹性负载均衡器,如下所述。
```yaml
metadata:
@@ -1421,8 +1442,16 @@ There are other annotations to manage Classic Elastic Load Balancers that are de
# 此值必须小于 service.beta.kubernetes.io/aws-load-balancer-healthcheck-interval
# 默认值为 5,必须介于 2 和 60 之间
+ service.beta.kubernetes.io/aws-load-balancer-security-groups: "sg-53fae93f"
+ # 要添加到所创建的 ELB 之上的已有安全组列表。与注解
+ # service.beta.kubernetes.io/aws-load-balancer-extra-security-groups 不同,此
+ # 注解会替换掉之前指派给 ELB 的所有其他安全组
+
service.beta.kubernetes.io/aws-load-balancer-extra-security-groups: "sg-53fae93f,sg-42efd82e"
# 要添加到 ELB 上的额外安全组列表
+
+ service.beta.kubernetes.io/aws-load-balancer-target-node-labels: "ingress-gw,gw-name=public-api"
+ # 用逗号分隔的一个键-值偶对列表,用来为负载均衡器选择目标节点
```
-
{{< note >}}
NLB 仅适用于某些实例类。有关受支持的实例类型的列表,
请参见
@@ -1540,7 +1568,7 @@ the `my-service` Service in the `prod` namespace to `my.database.example.com`:
### ExternalName 类型 {#externalname}
类型为 ExternalName 的服务将服务映射到 DNS 名称,而不是典型的选择器,例如 `my-service` 或者 `cassandra`。
-您可以使用 `spec.externalName` 参数指定这些服务。
+你可以使用 `spec.externalName` 参数指定这些服务。
例如,以下 Service 定义将 `prod` 名称空间中的 `my-service` 服务映射到 `my.database.example.com`:
@@ -1578,7 +1606,7 @@ Service's `type`.
当查找主机 `my-service.prod.svc.cluster.local` 时,集群 DNS 服务返回 `CNAME` 记录,
其值为 `my.database.example.com`。
访问 `my-service` 的方式与其他服务的方式相同,但主要区别在于重定向发生在 DNS 级别,而不是通过代理或转发。
-如果以后您决定将数据库移到群集中,则可以启动其 Pod,添加适当的选择器或端点以及更改服务的 `type`。
+如果以后你决定将数据库移到集群中,则可以启动其 Pod,添加适当的选择器或端点以及更改服务的 `type`。
### Service IP 地址 {#ips-and-vips}
-不像 Pod 的 IP 地址,它实际路由到一个固定的目的地,Service 的 IP 实际上不能通过单个主机来进行应答。
-相反,我们使用 `iptables`(Linux 中的数据包处理逻辑)来定义一个虚拟IP地址(VIP),它可以根据需要透明地进行重定向。
+不像 Pod 的 IP 地址,它实际路由到一个固定的目的地,Service 的 IP 实际上
+不能通过单个主机来进行应答。
+相反,我们使用 `iptables`(Linux 中的数据包处理逻辑)来定义一个
+虚拟 IP 地址(VIP),它可以根据需要透明地进行重定向。
当客户端连接到 VIP 时,它们的流量会自动地传输到一个合适的 Endpoint。
环境变量和 DNS,实际上会根据 Service 的 VIP 和端口来进行填充。
@@ -1762,9 +1794,11 @@ of which Pods they are actually accessing.
作为一个例子,考虑前面提到的图片处理应用程序。
当创建后端 Service 时,Kubernetes master 会给它指派一个虚拟 IP 地址,比如 10.0.0.1。
假设 Service 的端口是 1234,该 Service 会被集群中所有的 `kube-proxy` 实例观察到。
-当代理看到一个新的 Service, 它会打开一个新的端口,建立一个从该 VIP 重定向到新端口的 iptables,并开始接收请求连接。
+当代理看到一个新的 Service, 它会打开一个新的端口,建立一个从该 VIP 重定向到
+新端口的 iptables,并开始接收请求连接。
-当一个客户端连接到一个 VIP,iptables 规则开始起作用,它会重定向该数据包到 "服务代理" 的端口。
+当一个客户端连接到一个 VIP,iptables 规则开始起作用,它会重定向该数据包到
+"服务代理" 的端口。
"服务代理" 选择一个后端,并将客户端的流量代理到后端上。
这意味着 Service 的所有者能够选择任何他们想使用的端口,而不存在冲突的风险。
@@ -1811,9 +1845,11 @@ through a load-balancer, though in those cases the client IP does get altered.
iptables operations slow down dramatically in large scale cluster e.g 10,000 Services.
IPVS is designed for load balancing and based on in-kernel hash tables. So you can achieve performance consistency in large number of Services from IPVS-based kube-proxy. Meanwhile, IPVS-based kube-proxy has more sophisticated load balancing algorithms (least conns, locality, weighted, persistence).
-->
-在大规模集群(例如 10000 个服务)中,iptables 操作会显着降低速度。 IPVS 专为负载平衡而设计,并基于内核内哈希表。
-因此,您可以通过基于 IPVS 的 kube-proxy 在大量服务中实现性能一致性。
-同时,基于 IPVS 的 kube-proxy 具有更复杂的负载平衡算法(最小连接,局部性,加权,持久性)。
+在大规模集群(例如 10000 个服务)中,iptables 操作会显着降低速度。 IPVS
+专为负载平衡而设计,并基于内核内哈希表。
+因此,你可以通过基于 IPVS 的 kube-proxy 在大量服务中实现性能一致性。
+同时,基于 IPVS 的 kube-proxy 具有更复杂的负载均衡算法(最小连接、局部性、
+加权、持久性)。
## API 对象
@@ -1821,57 +1857,48 @@ IPVS is designed for load balancing and based on in-kernel hash tables. So you c
Service is a top-level resource in the Kubernetes REST API. You can find more details
about the API object at: [Service API object](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#service-v1-core).
-->
-Service 是 Kubernetes REST API 中的顶级资源。您可以在以下位置找到有关A PI 对象的更多详细信息:
+Service 是 Kubernetes REST API 中的顶级资源。你可以在以下位置找到有关 API 对象的更多详细信息:
[Service 对象 API](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#service-v1-core).
## 受支持的协议 {#protocol-support}
### TCP
-{{< feature-state for_k8s_version="v1.0" state="stable" >}}
-
-您可以将 TCP 用于任何类型的服务,这是默认的网络协议。
+你可以将 TCP 用于任何类型的服务,这是默认的网络协议。
### UDP
-{{< feature-state for_k8s_version="v1.0" state="stable" >}}
-
-您可以将 UDP 用于大多数服务。 对于 type=LoadBalancer 服务,对 UDP 的支持取决于提供此功能的云提供商。
+你可以将 UDP 用于大多数服务。 对于 type=LoadBalancer 服务,对 UDP 的支持取决于提供此功能的云提供商。
### HTTP
-{{< feature-state for_k8s_version="v1.1" state="stable" >}}
-
-如果您的云提供商支持它,则可以在 LoadBalancer 模式下使用服务来设置外部 HTTP/HTTPS 反向代理,并将其转发到该服务的 Endpoints。
+如果你的云提供商支持它,则可以在 LoadBalancer 模式下使用服务来设置外部
+HTTP/HTTPS 反向代理,并将其转发到该服务的 Endpoints。
{{< note >}}
-您还可以使用 {{< glossary_tooltip text="Ingres" term_id="ingress" >}} 代替 Service 来公开 HTTP/HTTPS 服务。
+你还可以使用 {{< glossary_tooltip text="Ingres" term_id="ingress" >}} 代替
+Service 来公开 HTTP/HTTPS 服务。
{{< /note >}}
-### PROXY 协议
-{{< feature-state for_k8s_version="v1.1" state="stable" >}}
-
-
+### PROXY 协议
-如果您的云提供商支持它,
+如果你的云提供商支持它,
则可以在 LoadBalancer 模式下使用 Service 在 Kubernetes 本身之外配置负载均衡器,
-该负载均衡器将转发前缀为 [PROXY协议](https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt)
+该负载均衡器将转发前缀为
+[PROXY 协议](https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt)
的连接。
负载平衡器将发送一系列初始字节,描述传入的连接,类似于此示例
@@ -1899,19 +1928,22 @@ followed by the data from the client.
### SCTP
-{{< feature-state for_k8s_version="v1.12" state="alpha" >}}
+{{< feature-state for_k8s_version="v1.19" state="beta" >}}
+Kubernetes 支持 SCTP 作为 Service、Endpoint、EndpointSlice, NetworkPolicy
+和 Pod 定义中的 `protocol` 值。
+作为一种 Beta 特性,此功能默认是启用的。集群管理员需要在 API 服务器上使用
+`--feature-gates=SCTPSupport=false,...` 来关闭
+`SCTPSupport` [特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/)
+来在集群级别禁用 SCTP。
-作为一种 alpha 功能,Kubernetes 支持 SCTP 作为 Service、Endpoint、NetworkPolicy 和 Pod 定义中的 `protocol` 值。
-要启用此功能,集群管理员需要在 API 服务器上启用 `SCTPSupport` 特性门控,
-例如 `--feature-gates=SCTPSupport=true,...`。
-
-启用特性门控后,你可以将 Service、Endpoints、NetworkPolicy 或 Pod 的 `protocol` 字段设置为 `SCTP`。
+启用特性门控后,你可以将 Service、Endpoints、EndpointSlice、NetworkPolicy 或
+Pod 的 `protocol` 字段设置为 `SCTP`。
Kubernetes 相应地为 SCTP 关联设置网络,就像为 TCP 连接所做的一样。
-##### Service 类型为 LoadBalancer 的服务 {#caveat-sctp-loadbalancer-service-type}
-
-
+##### Service 类型为 LoadBalancer 的服务 {#caveat-sctp-loadbalancer-service-type}
{{< warning >}}
如果云提供商的负载平衡器实现支持将 SCTP 作为协议,则只能使用 `type` LoadBalancer 加上
@@ -1959,38 +1988,20 @@ SCTP is not supported on Windows based nodes.
基于 Windows 的节点不支持 SCTP。
{{< /warning >}}
+
##### 用户空间 kube-proxy {#caveat-sctp-kube-proxy-userspace}
+{{< warning >}}
-{{< warning >}}
当 kube-proxy 处于用户空间模式时,它不支持 SCTP 关联的管理。
{{< /warning >}}
-
-## 未来工作
-
-未来我们能预见到,代理策略可能会变得比简单的轮转均衡策略有更多细微的差别,比如主控节点选举或分片。
-我们也能想到,某些 Service 将具有 “真正” 的负载均衡器,这种情况下 VIP 将简化数据包的传输。
-
-Kubernetes 项目打算为 L7(HTTP)服务改进支持。
-
-Kubernetes 项目打算为 Service 实现更加灵活的请求进入模式,
-这些模式包含当前的 `ClusterIP`、`NodePort` 和 `LoadBalancer` 模式,或者更多。
-
## {{% heading "whatsnext" %}}
-
* 阅读[使用服务访问应用](/zh/docs/concepts/services-networking/connect-applications-service/)
* 阅读了解 [Ingress](/zh/docs/concepts/services-networking/ingress/)
-* 阅读了解 [端点切片](/zh/docs/concepts/services-networking/endpoint-slices/)
+* 阅读了解[端点切片(Endpoint Slices)](/zh/docs/concepts/services-networking/endpoint-slices/)
From 7260dbf1c67a090425dab9d20a826fe924767d61 Mon Sep 17 00:00:00 2001
From: jialaijun
Date: Wed, 25 Nov 2020 18:29:43 +0800
Subject: [PATCH 23/80] update the markdown file in the glossary directory.
---
content/zh/docs/reference/glossary/addons.md | 36 ++++++-----
.../glossary/admission-controller.md | 38 +++++++-----
.../reference/glossary/aggregation-layer.md | 44 +++++++------
.../zh/docs/reference/glossary/annotation.md | 38 ++++++------
.../zh/docs/reference/glossary/api-group.md | 36 ++++++-----
.../docs/reference/glossary/app-container.md | 34 +++++-----
.../glossary/application-architect.md | 35 ++++++-----
.../glossary/application-developer.md | 30 ++++-----
.../docs/reference/glossary/applications.md | 28 +++++----
.../zh/docs/reference/glossary/approver.md | 30 +++++----
.../zh/docs/reference/glossary/certificate.md | 33 +++++-----
content/zh/docs/reference/glossary/cgroup.md | 27 ++++----
content/zh/docs/reference/glossary/cidr.md | 33 +++++-----
content/zh/docs/reference/glossary/cla.md | 30 +++++----
.../glossary/cloud-controller-manager.md | 62 +++++++++++--------
.../docs/reference/glossary/cloud-provider.md | 37 ++++++-----
content/zh/docs/reference/glossary/cluster.md | 49 +++++++++------
content/zh/docs/reference/glossary/secret.md | 32 +++++-----
.../reference/glossary/security-context.md | 50 ++++++++-------
.../zh/docs/reference/glossary/selector.md | 38 ++++++------
.../reference/glossary/service-account.md | 43 +++++++------
.../docs/reference/glossary/service-broker.md | 45 ++++++++------
.../reference/glossary/service-catalog.md | 34 +++++-----
content/zh/docs/reference/glossary/service.md | 22 ++++++-
.../reference/glossary/shuffle-sharding.md | 36 ++++++-----
content/zh/docs/reference/glossary/sig.md | 33 +++++-----
.../zh/docs/reference/glossary/statefulset.md | 49 ++++++++-------
.../zh/docs/reference/glossary/static-pod.md | 32 +++++-----
.../docs/reference/glossary/storage-class.md | 38 ++++++------
content/zh/docs/reference/glossary/sysctl.md | 29 +++++----
content/zh/docs/reference/glossary/taint.md | 40 +++++++-----
.../zh/docs/reference/glossary/toleration.md | 38 +++++++-----
content/zh/docs/reference/glossary/uid.md | 30 +++++----
.../zh/docs/reference/glossary/upstream.md | 24 +++++--
.../docs/reference/glossary/volume-plugin.md | 30 ++++-----
content/zh/docs/reference/glossary/volume.md | 49 +++++++++------
content/zh/docs/reference/glossary/wg.md | 30 +++++----
.../zh/docs/reference/glossary/workload.md | 43 ++++++++-----
38 files changed, 799 insertions(+), 586 deletions(-)
diff --git a/content/zh/docs/reference/glossary/addons.md b/content/zh/docs/reference/glossary/addons.md
index 00a871a227..d24c036178 100644
--- a/content/zh/docs/reference/glossary/addons.md
+++ b/content/zh/docs/reference/glossary/addons.md
@@ -1,23 +1,10 @@
----
-title: 附加组件
-id: addons
-date: 2019-12-15
-full_link: /zh/docs/concepts/cluster-administration/addons/
-short_description: >
- 扩展 Kubernetes 功能的资源。
-
-aka:
-tags:
-- tool
----
- 扩展 Kubernetes 功能的资源。
-
+
+---
+title: Add-ons(附加组件)
+id: addons
+date: 2019-12-15
+full_link: /zh/docs/concepts/cluster-administration/addons/
+short_description: >
+ 扩展 Kubernetes 功能的资源。
+
+aka:
+tags:
+- tool
+---
+
+ 扩展 Kubernetes 功能的资源。
[安装附加组件](/docs/concepts/cluster-administration/addons/) 阐释了更多关于如何在集群内使用附加组件,并列出了一些流行的附加组件。
diff --git a/content/zh/docs/reference/glossary/admission-controller.md b/content/zh/docs/reference/glossary/admission-controller.md
index adbd681fae..d908098e93 100644
--- a/content/zh/docs/reference/glossary/admission-controller.md
+++ b/content/zh/docs/reference/glossary/admission-controller.md
@@ -1,5 +1,23 @@
+
+
+---
+title: Admission Controller(准入控制器)
id: admission-controller
date: 2019-06-28
full_link: /zh/docs/reference/access-authn-authz/admission-controllers/
@@ -12,24 +30,12 @@ tags:
---
-
在对象持久化之前拦截 Kubernetes Api 服务器请求的一段代码
+
+
+---
+title: Aggregation Layer(聚合层)
id: aggregation-layer
date: 2018-10-08
full_link: /zh/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/
@@ -13,22 +32,6 @@ tags:
- operation
---
-
+
+
-当您配置了 {{< glossary_tooltip text="Kubernetes API Server" term_id="kube-apiserver" >}} 来 [支持额外的 API](/docs/tasks/access-kubernetes-api/configure-aggregation-layer/),您就可以在 Kubernetes API 中增加 `APIService` 对象来 "申领(Claim)" 一个 URL 路径。
+当您配置了 {{< glossary_tooltip text="Kubernetes API Server" term_id="kube-apiserver" >}} 来 [支持额外的 API](/zh/docs/tasks/extend-kubernetes/configure-aggregation-layer/),您就可以在 Kubernetes API 中增加 `APIService` 对象来 "申领(Claim)" 一个 URL 路径。
diff --git a/content/zh/docs/reference/glossary/annotation.md b/content/zh/docs/reference/glossary/annotation.md
index a5da0a060f..bcac78ed00 100644
--- a/content/zh/docs/reference/glossary/annotation.md
+++ b/content/zh/docs/reference/glossary/annotation.md
@@ -1,5 +1,22 @@
+
+
+---
+title: Annotation(注解)
id: annotation
date: 2018-04-12
full_link: /zh/docs/concepts/overview/working-with-objects/annotations/
@@ -11,21 +28,6 @@ tags:
- fundamental
---
-
-
@@ -35,8 +37,8 @@ tags:
-注解中的元数据可大可小,可以是结构化的也可以是非结构化的,并且能包含标签不允许使用的字符。像工具和软件库这样的客户端可以检索这些元数据。
+注解中的元数据可大可小,可以是结构化的也可以是非结构化的,并且能包含{{< glossary_tooltip text="标签" term_id="label" >}}不允许使用的字符。像工具和软件库这样的客户端可以检索这些元数据。
diff --git a/content/zh/docs/reference/glossary/api-group.md b/content/zh/docs/reference/glossary/api-group.md
index 07c222acbe..539af603b8 100644
--- a/content/zh/docs/reference/glossary/api-group.md
+++ b/content/zh/docs/reference/glossary/api-group.md
@@ -1,3 +1,21 @@
+
+
---
title: API Group
id: api-group
@@ -11,28 +29,14 @@ tags:
- fundamental
- architecture
---
-
Kubernetes API 中的一组相关路径。
-
+
-* 阅读 [API Group](/docs/concepts/overview/kubernetes-api/#api-groups) 了解更多信息。
+* 阅读 [API Group](/zh/docs/concepts/overview/kubernetes-api/#api-groups) 了解更多信息。
diff --git a/content/zh/docs/reference/glossary/app-container.md b/content/zh/docs/reference/glossary/app-container.md
index a3238d65dd..462aca1da7 100644
--- a/content/zh/docs/reference/glossary/app-container.md
+++ b/content/zh/docs/reference/glossary/app-container.md
@@ -1,18 +1,5 @@
----
-title: 应用程序容器
-id: app-container
-date: 2019-02-12
-full_link:
-short_description: >
- 用于运行部分工作负载的容器。与初始化容器比较而言。
-
-aka:
-tags:
-- workload
----
- 应用程序容器(或 app 容器){{< glossary_tooltip text="容器" term_id="container" >}} 在 {{< glossary_tooltip text="pod" term_id="pod" >}} 中,在 {{< glossary_tooltip text="初始化容器" term_id="init-container" >}} 启动完毕后才开始启动。
-
+
+---
+title: App Container(应用程序容器)
+id: app-container
+date: 2019-02-12
+full_link:
+short_description: >
+ 用于运行部分工作负载的容器。与初始化容器比较而言。
+
+aka:
+tags:
+- workload
+---
+
+ 应用程序 {{< glossary_tooltip text="容器" term_id="container" >}} (或 app 容器)在 {{< glossary_tooltip text="pod" term_id="pod" >}} 中,在 {{< glossary_tooltip text="初始化容器" term_id="init-container" >}} 启动完毕后才开始启动。
+
+
diff --git a/content/zh/docs/reference/glossary/application-architect.md b/content/zh/docs/reference/glossary/application-architect.md
index 849d1b7685..055f6d1499 100644
--- a/content/zh/docs/reference/glossary/application-architect.md
+++ b/content/zh/docs/reference/glossary/application-architect.md
@@ -1,18 +1,5 @@
----
-title: 应用架构师
-id: application-architect
-date: 2018-04-12
-full_link:
-short_description: >
- 应用架构师是负责应用高级设计的人。
-
-aka:
-tags:
-- user-type
----
- 应用架构师是负责应用高级设计的人。
-
+
+---
+title: Application Architect(应用架构师)
+id: application-architect
+date: 2018-04-12
+full_link:
+short_description: >
+ 应用架构师是负责应用高级设计的人。
+
+aka:
+tags:
+- user-type
+---
+
+ 应用架构师是负责应用高级设计的人。
+
+
+
+---
+title: Application Developer(应用开发者)
+id: application-developer
+date: 2018-04-12
+full_link:
+short_description: >
+ 编写可以在 Kubernetes 集群上运行的应用的人。
+
+aka:
+tags:
+- user-type
+---
+
编写可以在 Kubernetes 集群上运行的应用的人。
diff --git a/content/zh/docs/reference/glossary/applications.md b/content/zh/docs/reference/glossary/applications.md
index cbff609142..67f07e793f 100644
--- a/content/zh/docs/reference/glossary/applications.md
+++ b/content/zh/docs/reference/glossary/applications.md
@@ -1,16 +1,5 @@
----
-title: 应用
-id: applications
-date: 2019-05-12
-full_link:
-short_description: >
- 各种容器化应用运行所在的层。
-aka:
-tags:
-- fundamental
----
-
+---
+title: Applications(应用)
+id: applications
+date: 2019-05-12
+full_link:
+short_description: >
+ 各种容器化应用运行所在的层。
+aka:
+tags:
+- fundamental
+---
+
各种容器化应用运行所在的层。
diff --git a/content/zh/docs/reference/glossary/approver.md b/content/zh/docs/reference/glossary/approver.md
index 879ef5e58b..b4f188e6ec 100644
--- a/content/zh/docs/reference/glossary/approver.md
+++ b/content/zh/docs/reference/glossary/approver.md
@@ -1,17 +1,5 @@
----
-title: 批准者
-id: approver
-date: 2018-04-12
-full_link:
-short_description: >
- 可以审核并批准 Kubernetes 代码贡献的人。
-
-aka:
-tags:
-- community
----
-
+---
+title: Approver(批准者)
+id: approver
+date: 2018-04-12
+full_link:
+short_description: >
+ 可以审核并批准 Kubernetes 代码贡献的人。
+
+aka:
+tags:
+- community
+---
+
可以审核并批准 Kubernetes 代码贡献的人。
diff --git a/content/zh/docs/reference/glossary/certificate.md b/content/zh/docs/reference/glossary/certificate.md
index c966aea2cb..933f19c420 100644
--- a/content/zh/docs/reference/glossary/certificate.md
+++ b/content/zh/docs/reference/glossary/certificate.md
@@ -1,5 +1,22 @@
+
+
+---
+title: Certificate(证书)
id: certificate
date: 2018-04-12
full_link: /zh/docs/tasks/tls/managing-tls-in-a-cluster/
@@ -11,20 +28,6 @@ tags:
- security
---
-
+---
+title: cgroup (控制组)
+id: cgroup
+date: 2019-06-25
+full_link:
+short_description: >
+ 一组具有可选资源隔离、审计和限制的 Linux 进程。
+
+aka:
+tags:
+- fundamental
+---
diff --git a/content/zh/docs/reference/glossary/cidr.md b/content/zh/docs/reference/glossary/cidr.md
index 7e0a97d31e..f18e1b8947 100644
--- a/content/zh/docs/reference/glossary/cidr.md
+++ b/content/zh/docs/reference/glossary/cidr.md
@@ -1,18 +1,5 @@
----
-title: CIDR
-id: cidr
-date: 2019-11-12
-full_link:
-short_description: >
- CIDR 是一种描述 IP 地址块的符号,被广泛使用于各种网络配置中。
-
-aka:
-tags:
-- networking
----
-CIDR (无类域间路由) 是一种描述 IP 地址块的符号,被广泛使用于各种网络配置中。
-
+
+---
+title: CIDR
+id: cidr
+date: 2019-11-12
+full_link:
+short_description: >
+ CIDR 是一种描述 IP 地址块的符号,被广泛使用于各种网络配置中。
+
+aka:
+tags:
+- networking
+---
+
+CIDR (无类域间路由) 是一种描述 IP 地址块的符号,被广泛使用于各种网络配置中。
+
diff --git a/content/zh/docs/reference/glossary/cla.md b/content/zh/docs/reference/glossary/cla.md
index dae58a89e6..6f917d4826 100644
--- a/content/zh/docs/reference/glossary/cla.md
+++ b/content/zh/docs/reference/glossary/cla.md
@@ -1,17 +1,5 @@
----
-title: CLA (贡献者许可协议)
-id: cla
-date: 2018-04-12
-full_link: https://github.com/kubernetes/community/blob/master/CLA.md
-short_description: >
- 贡献者对他们在开源项目中所贡献的代码的授权许可条款。
-
-aka:
-tags:
-- community
----
-
+---
+title: CLA (贡献者许可协议)
+id: cla
+date: 2018-04-12
+full_link: https://github.com/kubernetes/community/blob/master/CLA.md
+short_description: >
+ 贡献者对他们在开源项目中所贡献的代码的授权许可条款。
+
+aka:
+tags:
+- community
+---
+
{{< glossary_tooltip text="贡献者" term_id="contributor" >}} 对他们在开源项目中所贡献的代码的授权许可条款。
diff --git a/content/zh/docs/reference/glossary/cloud-controller-manager.md b/content/zh/docs/reference/glossary/cloud-controller-manager.md
index 2fcd729f57..ca2fdc8d84 100644
--- a/content/zh/docs/reference/glossary/cloud-controller-manager.md
+++ b/content/zh/docs/reference/glossary/cloud-controller-manager.md
@@ -1,5 +1,28 @@
+
+
+---
+title: Cloud Controller Manager(云控制器管理器)
id: cloud-controller-manager
date: 2018-04-12
full_link: /zh/docs/tasks/administer-cluster/running-cloud-controller/
@@ -12,36 +35,23 @@ tags:
- architecture
- operation
---
-
-
-
-云控制器管理器是 1.8 的 alpha 特性。在未来发布的版本中,这是将 Kubernetes 与任何其他云集成的最佳方式。
+Cloud Controller Manager(云控制器管理器)是指 嵌入特定云的控制逻辑的 {{< glossary_tooltip text="控制平面" term_id="control-plane" >}} 组件
+。云控制器管理器允许您链接
+聚合到云提供商的应用编程接口中,并分离出相互作用的组件
+与您的集群交互的组件。
-
-Kubernetes v1.6 包含一个新的可执行文件叫做 cloud-controller-manager。cloud-controller-manager 是一个守护进程,其中嵌入了特定于某云环境的控制环。
-这些特定于云环境的控制环最初位于 kube-controller-manager 中。
-由于云供应商的开发和发布节奏与 Kubernetes 项目不同步,将特定于供应商的代码抽象到 cloud-controller-manager 可执行文件可以允许云供应商独立于核心 Kubernetes 代码进行演进。
+通过分离Kubernates和底层云基础设置之间的互操作性逻辑,云控制器管理器组件使云提供商能够以不同于Kubernates主项目的速度进行发布新特征。
\ No newline at end of file
diff --git a/content/zh/docs/reference/glossary/cloud-provider.md b/content/zh/docs/reference/glossary/cloud-provider.md
index 0c07cd6fb8..c4ad071638 100755
--- a/content/zh/docs/reference/glossary/cloud-provider.md
+++ b/content/zh/docs/reference/glossary/cloud-provider.md
@@ -1,5 +1,22 @@
+
+
+---
+title: Cloud Provider(云供应商)
id: cloud-provider
date: 2018-04-12
short_description: >
@@ -10,22 +27,12 @@ aka:
tags:
- community
---
- 一个提供云计算平台的商业机构或其他组织。
-
+ 一个提供云计算平台的商业机构或其他组织。
+
+
@@ -42,7 +49,7 @@ such as running a Kubernetes cluster.
You can also find Kubernetes as a managed service; sometimes called
Platform as a Service, or PaaS. With managed Kubernetes, your
cloud provider is responsible for the Kubernetes control plane as well
-as the glossary_tooltip term_id="node" text="nodes" and the
+as the {{< glossary_tooltip term_id="node" text="nodes" >}} and the
infrastructure they rely on: networking, storage, and possibly other
elements such as load balancers.
-->
diff --git a/content/zh/docs/reference/glossary/cluster.md b/content/zh/docs/reference/glossary/cluster.md
index 1046f9a223..1efc4bcb5d 100644
--- a/content/zh/docs/reference/glossary/cluster.md
+++ b/content/zh/docs/reference/glossary/cluster.md
@@ -1,36 +1,47 @@
----
-title: 集群
-id: cluster
-date: 2019-06-15
-full_link:
-short_description: >
- 集群由一组被称作节点的机器组成。这些节点上运行 Kubernetes 所管理的容器化应用。集群具有至少一个工作节点和至少一个主节点。
-
-aka:
-tags:
-- fundamental
-- operation
----
-
-
-集群由一组被称作节点的机器组成。这些节点上运行 Kubernetes 所管理的容器化应用。集群具有至少一个工作节点和至少一个主节点。
+---
+title: Cluster(集群)
+id: cluster
+date: 2019-06-15
+full_link:
+short_description: >
+ 集群由一组被称作节点的机器组成。这些节点上运行 Kubernetes 所管理的容器化应用。集群具有至少一个工作节点。
+
+aka:
+tags:
+- fundamental
+- operation
+---
+
+集群由一组被称作节点的机器组成。这些节点上运行 Kubernetes 所管理的容器化应用。集群具有至少一个工作节点。
-
-工作节点托管作为应用程序组件的 Pod 。主节点管理集群中的工作节点和 Pod 。多个主节点用于为集群提供故障转移和高可用性。
+
+工作节点托管作为应用负载的组件的 Pod 。控制平面管理集群中的工作节点和 Pod 。为集群提供故障转移和高可用性,这些控制平面一般跨多主机运行,集群跨多个节点运行。
diff --git a/content/zh/docs/reference/glossary/secret.md b/content/zh/docs/reference/glossary/secret.md
index 8bbb57df6b..8dae7030f6 100644
--- a/content/zh/docs/reference/glossary/secret.md
+++ b/content/zh/docs/reference/glossary/secret.md
@@ -1,18 +1,5 @@
----
-title: Secret
-id: secret
-date: 2018-04-12
-full_link: /zh/docs/concepts/configuration/secret/
-short_description: >
- Secret 用于存储敏感信息,如密码、OAuth 令牌和 SSH 密钥。
-
-aka:
-tags:
-- core-object
-- security
----
-
+---
+title: Secret
+id: secret
+date: 2018-04-12
+full_link: /zh/docs/concepts/configuration/secret/
+short_description: >
+ Secret 用于存储敏感信息,如密码、OAuth 令牌和 SSH 密钥。
+
+aka:
+tags:
+- core-object
+- security
+---
+
+
@@ -40,6 +42,6 @@ tags:
Allows for more control over how sensitive information is used and reduces the risk of accidental exposure, including [encryption](/docs/tasks/administer-cluster/encrypt-data/#ensure-all-secrets-are-encrypted) at rest. A {{< glossary_tooltip text="Pod" term_id="pod" >}} references the secret as a file in a volume mount or by the kubelet pulling images for a pod. Secrets are great for confidential data and [ConfigMaps](/docs/tasks/configure-pod-container/configure-pod-configmap/) for non-confidential data.
-->
-Secret 允许用户对如何使用敏感信息进行更多的控制,并减少信息意外暴露的风险,包括静态[加密](/docs/tasks/administer-cluster/encrypt-data/#ensure-all-secrets-are-encrypted)。
+Secret 允许用户对如何使用敏感信息进行更多的控制,并减少信息意外暴露的风险,包括静态[encryption(加密)](/docs/tasks/administer-cluster/encrypt-data/#ensure-all-secrets-are-encrypted)。
{{< glossary_tooltip text="Pod" term_id="pod" >}} 通过挂载卷中的文件的方式引用 Secret,或者通过 kubelet 为 pod 拉取镜像时引用。
Secret 非常适合机密数据使用,而 [ConfigMaps](/docs/tasks/configure-pod-container/configure-pod-configmap/) 适用于非机密数据。
diff --git a/content/zh/docs/reference/glossary/security-context.md b/content/zh/docs/reference/glossary/security-context.md
index 31b99c635c..21f890ab3c 100644
--- a/content/zh/docs/reference/glossary/security-context.md
+++ b/content/zh/docs/reference/glossary/security-context.md
@@ -1,8 +1,23 @@
+
+
---
title: 安全上下文(Security Context)
id: security-context
date: 2018-04-12
-full_link: /docs/tasks/configure-pod-container/security-context/
+full_link: /zh/docs/tasks/configure-pod-container/security-context/
short_description: >
securityContext 字段定义 Pod 或容器的特权和访问控制设置,包括运行时 UID 和 GID。
@@ -12,32 +27,25 @@ tags:
---
+securityContext 字段定义 {{< glossary_tooltip text="Pod" term_id="pod" >}} 或 {{< glossary_tooltip text="container(容器)" term_id="container" >}} 的特权和访问控制设置。
+
+
+
-securityContext 字段定义 Pod 或容器的特权和访问控制设置,包括运行时 UID 和 GID。
-
+在一个 securityContext 字段中,可以设置进程所属用户和用户组、权限相关设置。你也可以设置安全策略(例如:SELinux、AppArmor、seccomp)
-{{< glossary_tooltip term_id="pod" >}} 或者容器中的 securityContext 字段(应用于所有容器)用于设置容器进程使用的用户(runAsUser)和组 (fsGroup)、权能字、特权设置和安全策略(SELinux/AppArmor/Seccomp)。
-
-
-
+‘PodSpec.securityContext’字段配置会应用到一个Pod中的所有的container。
\ No newline at end of file
diff --git a/content/zh/docs/reference/glossary/selector.md b/content/zh/docs/reference/glossary/selector.md
index a3dcd0b71b..c784526442 100644
--- a/content/zh/docs/reference/glossary/selector.md
+++ b/content/zh/docs/reference/glossary/selector.md
@@ -1,22 +1,10 @@
----
-title: 选择算符
-id: selector
-date: 2018-04-12
-full_link: /zh/docs/concepts/overview/working-with-objects/labels/
-short_description: >
- 选择算符允许用户通过标签对一组资源对象进行筛选过滤。
-
-aka:
-tags:
-- fundamental
----
-
+
+---
+title: Selector
+id: selector
+date: 2018-04-12
+full_link: /zh/docs/concepts/overview/working-with-objects/labels/
+short_description: >
+ Selector(选择器)允许用户通过标签对一组资源对象进行筛选过滤。
+
+aka:
+tags:
+- fundamental
+---
+
-选择算符允许用户通过标签对一组资源对象进行筛选过滤。
+Selector 允许用户通过{{< glossary_tooltip text="labels(标签)" term_id="label" >}}对一组资源对象进行筛选过滤。
-在查询资源列表时,选择算符可以通过 {{< glossary_tooltip text="标签" term_id="label" >}} 对资源进行过滤筛选。
+在查询资源列表时,选择器可以通过标签对资源进行过滤筛选。
diff --git a/content/zh/docs/reference/glossary/service-account.md b/content/zh/docs/reference/glossary/service-account.md
index 28c7ffd9b6..b3cd5c6d8e 100644
--- a/content/zh/docs/reference/glossary/service-account.md
+++ b/content/zh/docs/reference/glossary/service-account.md
@@ -1,5 +1,23 @@
+
+
+---
+title: ServiceAccount
id: service-account
date: 2018-04-12
full_link: /zh/docs/tasks/configure-pod-container/configure-service-account/
@@ -12,21 +30,6 @@ tags:
- core-object
---
-
-
-
-当 Pod 中的进程访问集群时,API 服务器将它们作为特定的服务帐户进行身份验证,例如 `default`。当您创建 Pod 时,如果您没有指定服务帐户,它将在相同的命名空间 {{< glossary_tooltip text="命名空间" term_id="namespace" >}} 中自动分配 default 服务账户。
+当 Pod 中的进程访问集群时,API 服务器将它们作为特定的服务帐户进行身份验证,例如 `default`。当您创建 Pod 时,如果您没有指定服务帐户,它将在相同的{{< glossary_tooltip text="Namespace" term_id="namespace" >}} 中自动分配 default 服务账户。
diff --git a/content/zh/docs/reference/glossary/service-broker.md b/content/zh/docs/reference/glossary/service-broker.md
index 8a017d127b..ef07e6873b 100644
--- a/content/zh/docs/reference/glossary/service-broker.md
+++ b/content/zh/docs/reference/glossary/service-broker.md
@@ -1,5 +1,22 @@
+
+
+---
+title: Service Broker(服务代理)
id: service-broker
date: 2018-04-12
full_link:
@@ -11,32 +28,24 @@ tags:
- extension
---
-
-
-由第三方提供并维护的一组{{< glossary_tooltip text="托管服务" term_id="managed-service">}} 的访问端点。
+由第三方提供并维护的一组{{< glossary_tooltip text="Managed Services(托管服务)" term_id="managed-service">}} 的访问端点。
-{{< glossary_tooltip text="服务代理" term_id="service-broker">}}会实现
+{{< glossary_tooltip text="Service Brokers(服务代理)" term_id="service-broker">}}会实现
[开放服务代理 API 规范](https://github.com/openservicebrokerapi/servicebroker/blob/v2.13/spec.md)
并为应用提供使用其托管服务的标准接口。
-[服务目录(Service Catalog)](/docs/concepts/service-catalog/)则提供一种方法,用来列举、供应和绑定服务代理商所提供的托管服务。
+[服务目录(Service Catalog)](/zh/docs/concepts/extend-kubernetes/service-catalog/)则提供一种方法,用来列举、供应和绑定服务代理商所提供的托管服务。
diff --git a/content/zh/docs/reference/glossary/service-catalog.md b/content/zh/docs/reference/glossary/service-catalog.md
index 726aff57c2..4879a35a60 100644
--- a/content/zh/docs/reference/glossary/service-catalog.md
+++ b/content/zh/docs/reference/glossary/service-catalog.md
@@ -1,18 +1,5 @@
----
-title: 服务目录
-id: service-catalog
-date: 2018-04-12
-full_link:
-short_description: >
- 服务目录是一种扩展 API,它能让 Kubernetes 集群中运行的应用易于使用外部托管的软件服务,例如云供应商提供的数据仓库服务。
-
- An extension API that enables applications running in Kubernetes clusters to easily use external managed software offerings, such as a datastore service offered by a cloud provider.
-aka:
-tags:
-- extension
----
-
+---
+title: Service Catalog
+id: service-catalog
+date: 2018-04-12
+full_link:
+short_description: >
+ Service Catalog(服务目录)是一种扩展 API,它能让 Kubernetes 集群中运行的应用易于使用外部托管的软件服务,例如云供应商提供的数据仓库服务。
+
+aka:
+tags:
+- extension
+---
+
+
-服务目录(Service Catalog)是一种扩展 API,它能让 Kubernetes 集群中运行的应用易于使用外部托管的的软件服务,例如云供应商提供的数据仓库服务。
+Service Catalog(服务目录)是一种扩展 API,它能让 Kubernetes 集群中运行的应用易于使用外部托管的的软件服务,例如云供应商提供的数据仓库服务。
@@ -39,5 +41,5 @@ tags:
It provides a way to list, provision, and bind with external {{< glossary_tooltip text="Managed Services" term_id="managed-service" >}} from {{< glossary_tooltip text="Service Brokers" term_id="service-broker" >}} without needing detailed knowledge about how those services are created or managed.
-->
-服务目录可以检索、供应、和绑定由 {{< glossary_tooltip text="服务代理人(Service Brokers)" term_id="service-broker" >}} 提供的外部 {{< glossary_tooltip text="托管服务" term_id="managed-service" >}},而无需知道那些服务具体是怎样创建和托管的。
+服务目录可以检索、供应、和绑定由 {{< glossary_tooltip text="Service Brokers(服务代理人)" term_id="service-broker" >}} 提供的外部 {{< glossary_tooltip text="Managed Services(托管服务)" term_id="managed-service" >}},而无需知道那些服务具体是怎样创建和托管的。
diff --git a/content/zh/docs/reference/glossary/service.md b/content/zh/docs/reference/glossary/service.md
index 95e3b9e007..43b89c9796 100644
--- a/content/zh/docs/reference/glossary/service.md
+++ b/content/zh/docs/reference/glossary/service.md
@@ -1,3 +1,22 @@
+
+
+
---
title: Service
id: service
@@ -11,6 +30,7 @@ tags:
- fundamental
- core-object
---
+
@@ -22,4 +42,4 @@ An abstract way to expose an application running on a set of {{< glossary_toolti
-服务所针对的Pod集(通常)由 {{< glossary_tooltip text="selector" term_id="selector" >}} 确定。 如果添加或删除了更多Pod,则与选择器匹配的Pod集将发生变化。 该服务确保可以将网络流量定向到该工作负载的当前Pod集。
+服务所针对的Pod集(通常)由 {{< glossary_tooltip text="Selector" term_id="selector" >}} 确定。 如果添加或删除了更多Pod,则与选择器匹配的Pod集将发生变化。 该服务确保可以将网络流量定向到该工作负载的当前Pod集。
diff --git a/content/zh/docs/reference/glossary/shuffle-sharding.md b/content/zh/docs/reference/glossary/shuffle-sharding.md
index 1f8d8a0990..ea59cd62b1 100644
--- a/content/zh/docs/reference/glossary/shuffle-sharding.md
+++ b/content/zh/docs/reference/glossary/shuffle-sharding.md
@@ -1,18 +1,6 @@
----
-title: 混排切片(Shuffle Sharding)
-id: shuffle-sharding
-date: 2020-03-04
-full_link:
-short_description: >
- 一种将请求指派给队列的技术,其隔离性好过对队列个数哈希取模的方式。
-
-aka:
-tags:
-- fundamental
----
-一种将请求指派给队列的技术,其隔离性好过对队列个数哈希取模的方式。
-
+
+---
+title: Shuffle Sharding(混排切片)
+id: shuffle-sharding
+date: 2020-03-04
+full_link:
+short_description: >
+ 一种将请求指派给队列的技术,其隔离性好过对队列个数哈希取模的方式。
+
+aka:
+tags:
+- fundamental
+---
+
+
+Shuffle Sharding(混排切片)是指一种将请求指派给队列的技术,其隔离性好过对队列个数哈希取模的方式。
+
diff --git a/content/zh/docs/reference/glossary/sig.md b/content/zh/docs/reference/glossary/sig.md
index a42a15b0b1..ce1cc9f1aa 100644
--- a/content/zh/docs/reference/glossary/sig.md
+++ b/content/zh/docs/reference/glossary/sig.md
@@ -1,3 +1,20 @@
+
+
---
title: SIG (特别兴趣小组)
id: sig
@@ -11,18 +28,6 @@ tags:
- community
---
-
SIG 中的成员对推进某个领域(如体系结构、API 机制构件或者文档)具有相同的兴趣。
-SIGs 必须遵从 [SIG Governance](https://github.com/kubernetes/community/blob/master/sig-governance.md) 的规定,
+SIGs 必须遵从 [governance guidelines](https://github.com/kubernetes/community/blob/master/committee-steering/governance/sig-governance.md) 的规定,
不过可以有自己的贡献策略以及通信渠道(方式)。
更多的详细信息可参阅 [kubernetes/community](https://github.com/kubernetes/community) 仓库以及
diff --git a/content/zh/docs/reference/glossary/statefulset.md b/content/zh/docs/reference/glossary/statefulset.md
index 8003a09893..1a6469672d 100644
--- a/content/zh/docs/reference/glossary/statefulset.md
+++ b/content/zh/docs/reference/glossary/statefulset.md
@@ -1,10 +1,31 @@
+
+
---
title: StatefulSet
id: statefulset
date: 2018-04-12
full_link: /zh/docs/concepts/workloads/controllers/statefulset/
short_description: >
- StatefulSet 用来管理 Deployment 和伸缩一组 Pod,并且能为这些 Pod 提供*序号和唯一性保证*。
+ StatefulSet 用来管理部署和伸缩一组 Pod,包括这些 Pod 的持久存储和持久标识符。
aka:
tags:
- fundamental
@@ -14,24 +35,9 @@ tags:
---
-
- StatefulSet 用来管理 Deployment 和扩展一组 Pod,并且能为这些 Pod 提供*序号和唯一性保证*。
+ StatefulSet 用来管理部署和伸缩一组 {{< glossary_tooltip text="Pod" term_id="pod" >}},包括这些 Pod 的持久存储和持久标识符。
@@ -39,11 +45,10 @@ tags:
Like a {{< glossary_tooltip term_id="deployment" >}}, a StatefulSet manages Pods that are based on an identical container spec. Unlike a Deployment, a StatefulSet maintains a sticky identity for each of their Pods. These pods are created from the same spec, but are not interchangeable: each has a persistent identifier that it maintains across any rescheduling.
-->
-和 {{< glossary_tooltip term_id="Deployment" >}} 相同的是,StatefulSet 管理了基于相同容器定义的一组 Pod。但和 Deployment 不同的是,StatefulSet 为它们的每个 Pod 维护了一个固定的 ID。这些 Pod 是基于相同的声明来创建的,但是不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。
+和 {{< glossary_tooltip text="Deployment" term_id="deployment" >}} 相同的是,StatefulSet 管理了基于相同容器定义的一组 Pod。但和 Deployment 不同的是,StatefulSet 为它们的每个 Pod 维护了一个固定的 ID。这些 Pod 是基于相同的声明来创建的,但是不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。
-StatefulSet 和其他控制器使用相同的工作模式。你在 StatefulSet *对象* 中定义你期望的状态,然后 StatefulSet 的 *控制器* 就会通过各种更新来达到那种你想要的状态。
-
+如果希望使用存储卷为工作负载提供持久性,可以使用状态集作为解决方案的一部分。尽管状态完整集中的单个Pod很容易出现故障,但持久的Pod标识符使得将现有卷与替换任何出现故障的新Pod相匹配变得更加容易。如果希望使用存储卷为工作负载提供持久性,可以使用状态集作为解决方案的一部分。尽管状态完整集中的单个Pod很容易出现故障,但持久的Pod标识符使得将现有卷与替换任何出现故障的新Pod相匹配变得更加容易。
diff --git a/content/zh/docs/reference/glossary/static-pod.md b/content/zh/docs/reference/glossary/static-pod.md
index 44e2a72bed..eb1c7fb7b4 100644
--- a/content/zh/docs/reference/glossary/static-pod.md
+++ b/content/zh/docs/reference/glossary/static-pod.md
@@ -1,22 +1,10 @@
----
-title: 静态 Pod
-id: static-pod
-date: 2019-02-12
-full_link: /zh/docs/tasks/configure-pod-container/static-pod/
-short_description: >
- 由特定节点上的 kubelet 守护进程直接管理的 pod。
-
-aka:
-tags:
-- fundamental
----
-
+---
+title: Static Pod
+id: static-pod
+date: 2019-02-12
+full_link: /zh/docs/tasks/configure-pod-container/static-pod/
+short_description: >
+ Static Pod(静态Pod)是指由特定节点上的 kubelet 守护进程直接管理的 pod。
+
+aka:
+tags:
+- fundamental
+---
+
+
+
+---
+title: StorageClass
+id: storageclass
+date: 2018-04-12
+full_link: /zh/docs/concepts/storage/storage-classes/
+short_description: >
+ StorageClass(存储类别) 是管理员用来描述不同的可用存储类型的一种方法。
+
+aka:
+tags:
+- core-object
+- storage
+---
+
+
-
StorageClass 是管理员用来描述不同的可用存储类型的一种方法。
@@ -40,5 +42,5 @@ tags:
StorageClasses can map to quality-of-service levels, backup policies, or to arbitrary policies determined by cluster administrators. Each StorageClass contains the fields `provisioner`, `parameters`, and `reclaimPolicy`, which are used when a {{< glossary_tooltip text="Persistent Volume" term_id="persistent-volume" >}} belonging to the class needs to be dynamically provisioned. Users can request a particular class using the name of a StorageClass object.
-->
-StorageClass 可以映射到服务质量等级(QoS)、备份策略、或者管理员随机定义的策略。每个 StorageClass 对象包含的域有 `provisioner`、 `parameters` 和 `reclaimPolicy`,属于该存储类别的 {{< glossary_tooltip text="永久卷" term_id="persistent-volume" >}} 需要动态分配时就要用到这些域参数。通过 StorageClass 对象的名称,用户可以请求他们需要的特定存储类别。
+StorageClass 可以映射到服务质量等级(QoS)、备份策略、或者管理员随机定义的策略。每个 StorageClass 对象包含的域有 `provisioner`、 `parameters` 和 `reclaimPolicy`,每个 StorageClass 对象包含字段`provisioner`、`parameters`、and `reclaimPolicy`,一般该存储类别的 {{< glossary_tooltip text="永久卷" term_id="persistent-volume" >}} 需要动态分配时就要用到这些字段参数。通过 StorageClass 对象的名称,用户可以请求他们需要的特定存储类别。
diff --git a/content/zh/docs/reference/glossary/sysctl.md b/content/zh/docs/reference/glossary/sysctl.md
index 42ed215d6d..982a1bebd7 100644
--- a/content/zh/docs/reference/glossary/sysctl.md
+++ b/content/zh/docs/reference/glossary/sysctl.md
@@ -1,3 +1,19 @@
+
+
---
title: sysctl
id: sysctl
@@ -11,20 +27,7 @@ tags:
- 工具
---
-
+---
+title: Taint(污点)
+id: taint
+date: 2019-01-11
+full_link: /docs/concepts/configuration/taint-and-toleration/
+short_description: >
+ 一个核心对象,由三个必需的属性组成:键,值和效果。Taint(污点)会阻止在节点或节点组上调度 Pod。
+
+aka:
+tags:
+- core-object
+- fundamental
+---
+
+ 一个核心对象,由三个必需的属性组成:键、值和效果。污点会阻止在{{< glossary_tooltip text="节点" term_id="node" >}}或节点组上调度 {{< glossary_tooltip text="Pods" term_id="pod" >}}。
+
+
+
污点和 {{< glossary_tooltip text="容忍度" term_id="toleration" >}} 一起工作,以确保不会将 Pod 调度到不适合的节点上。一个或多个污点应用于 {{< glossary_tooltip text="节点" term_id="node" >}}。节点应该仅能调度那些带着能与污点相匹配容忍度的 pod。
\ No newline at end of file
diff --git a/content/zh/docs/reference/glossary/toleration.md b/content/zh/docs/reference/glossary/toleration.md
index ba59aed099..5fc976241b 100644
--- a/content/zh/docs/reference/glossary/toleration.md
+++ b/content/zh/docs/reference/glossary/toleration.md
@@ -1,24 +1,10 @@
----
-title: 容忍度
-id: toleration
-date: 2019-01-11
-full_link: /docs/concepts/configuration/taint-and-toleration/
-short_description: >
- 一个核心对象,由三个必需的属性组成:key、value 和 effect。容忍度允许将 Pod 调度到具有对应污点的节点或节点组上。
-aka:
-tags:
-- core-object
-- fundamental
----
- 一个核心对象,由三个必需的属性组成:key、value 和 effect。
- 容忍度允许将 Pod 调度到具有匹配 {{< glossary_tooltip text="污点" term_id="taint" >}} 的节点或节点组上。
-
+
+---
+title: toleration(容忍度)
+id: toleration
+date: 2019-01-11
+full_link: /zh/docs/concepts/scheduling-eviction/taint-and-toleration/
+short_description: >
+ 一个核心对象,由三个必需的属性组成:key、value 和 effect。容忍度允许将 Pod 调度到具有对应污点的节点或节点组上。
+aka:
+tags:
+- core-object
+- fundamental
+---
+
+
+ 一个核心对象,由三个必需的属性组成:key、value 和 effect。容忍度允许将 Pod 调度到具有匹配 {{< glossary_tooltip text="污点" term_id="taint" >}} 的节点或节点组上。
+
+
diff --git a/content/zh/docs/reference/glossary/uid.md b/content/zh/docs/reference/glossary/uid.md
index 01805ee534..983b61cd40 100644
--- a/content/zh/docs/reference/glossary/uid.md
+++ b/content/zh/docs/reference/glossary/uid.md
@@ -1,3 +1,20 @@
+
+
---
title: UID
id: uid
@@ -11,20 +28,7 @@ tags:
- fundamental
---
-
+
---
title: Upstream (disambiguation)
id: upstream
@@ -13,15 +30,14 @@ tags:
+可以参考:核心 Kubernetes 仓库或作为当前仓库派生来源的来源仓库。
+
+
-可以参考:核心 Kubernetes 仓库或作为当前仓库派生来源的来源仓库。
-
-
-
* 在 **Kubernetes社区**:对话中通常使用 *upstream* 来表示核心 Kubernetes 代码库,也就是更广泛的 kubernetes 生态系统、其他代码或第三方工具所依赖的仓库。 例如,[社区成员](#term-member)可能会建议将某个功能特性贡献到 upstream,使其位于核心代码库中,而不是维护于插件或第三方工具中。
* 在 **GitHub** 或 **git** 中:约定是将源仓库称为 *upstream*,而派生的仓库则被视为 *downstream*。
diff --git a/content/zh/docs/reference/glossary/volume-plugin.md b/content/zh/docs/reference/glossary/volume-plugin.md
index ca4318d4ad..11e34573db 100644
--- a/content/zh/docs/reference/glossary/volume-plugin.md
+++ b/content/zh/docs/reference/glossary/volume-plugin.md
@@ -1,18 +1,5 @@
----
-title: 卷(Volume)插件
-id: volumeplugin
-date: 2018-04-12
-full_link:
-short_description: >
- 卷(Volume)插件可以让 Pod 集成存储。
-
-aka:
-tags:
-- core-object
-- storage
----
-
+---
+title: Volume Plugin(卷插件)
+id: volumeplugin
+date: 2018-04-12
+full_link:
+short_description: >
+ 卷插件可以让 Pod 集成存储。
+
+aka:
+tags:
+- core-object
+- storage
+---
+
diff --git a/content/zh/docs/reference/glossary/volume.md b/content/zh/docs/reference/glossary/volume.md
index a170f0f3b8..a3f110201a 100644
--- a/content/zh/docs/reference/glossary/volume.md
+++ b/content/zh/docs/reference/glossary/volume.md
@@ -1,5 +1,23 @@
+
+
+---
+title: Volume(卷)
id: volume
date: 2018-04-12
full_link: /zh/docs/concepts/storage/volumes/
@@ -12,32 +30,23 @@ tags:
- fundamental
---
-
+包含可被 {{< glossary_tooltip text="pod" term_id="pod" >}} 中{{< glossary_tooltip text="容器" term_id="container" >}}访问的数据的目录。
+
+
-
-包含可被 {{< glossary_tooltip text="pod" term_id="pod" >}} 中容器访问的数据的目录。
-
-
-
每个 Kubernetes 卷在所处的{{< glossary_tooltip text="pod" term_id="pod" >}} 存在期间保持存在状态。
因此,卷的生命期会超出 {{< glossary_tooltip text="pod" term_id="pod" >}} 中运行的{{< glossary_tooltip text="容器" term_id="container" >}},
并且保证{{< glossary_tooltip text="容器" term_id="container" >}}重启之后仍保留数据。
+
+更多信息可参考[storage](/zh/docs/concepts/storage/)
\ No newline at end of file
diff --git a/content/zh/docs/reference/glossary/wg.md b/content/zh/docs/reference/glossary/wg.md
index 9a42e77ab0..5fe90888d2 100644
--- a/content/zh/docs/reference/glossary/wg.md
+++ b/content/zh/docs/reference/glossary/wg.md
@@ -1,3 +1,20 @@
+
+
---
title: WG (工作组)
id: wg
@@ -11,20 +28,7 @@ tags:
- community
---
-
-
+---
+
+-->
+
+---
+title: Workload(工作负载)
+id: workloads
+date: 2019-02-13
+full_link: /zh/docs/concepts/workloads/
+short_description: >
+ 工作负载是在 Kubernetes 上运行的应用程序。
+
+aka:
+tags:
+- fundamental
+---
+
+
工作负载是在 Kubernetes 上运行的应用程序。
-
+in a {{< glossary_tooltip term_id="Deployment" >}}.
+-->
代表不同类型或部分工作负载的各种核心对象包括 DaemonSet, Deployment, Job, ReplicaSet, and StatefulSet。
例如,具有 Web 服务器和数据库的工作负载可能在一个 {{< glossary_tooltip term_id="StatefulSet" >}} 中运行数据库,而 Web 服务器运行在 {{< glossary_tooltip term_id="Deployment" >}}。
\ No newline at end of file
From f5132af21e584071054e88e9e7d9c05c547b2c24 Mon Sep 17 00:00:00 2001
From: Tim Hughes
Date: Fri, 20 Nov 2020 16:11:28 +0000
Subject: [PATCH 24/80] Updates links to Dex
---
.../en/docs/reference/access-authn-authz/authentication.md | 6 +++---
1 file 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 e2e2d5c437..a35dc4d11f 100644
--- a/content/en/docs/reference/access-authn-authz/authentication.md
+++ b/content/en/docs/reference/access-authn-authz/authentication.md
@@ -328,7 +328,7 @@ tokens on behalf of another.
Kubernetes does not provide an OpenID Connect Identity Provider.
You can use an existing public OpenID Connect Identity Provider (such as Google, or
[others](https://connect2id.com/products/nimbus-oauth-openid-connect-sdk/openid-connect-providers)).
-Or, you can run your own Identity Provider, such as CoreOS [dex](https://github.com/coreos/dex),
+Or, you can run your own Identity Provider, such as [dex](https://dexidp.io/),
[Keycloak](https://github.com/keycloak/keycloak),
CloudFoundry [UAA](https://github.com/cloudfoundry/uaa), or
Tremolo Security's [OpenUnison](https://github.com/tremolosecurity/openunison).
@@ -339,13 +339,13 @@ For an identity provider to work with Kubernetes it must:
2. Run in TLS with non-obsolete ciphers
3. Have a CA signed certificate (even if the CA is not a commercial CA or is self signed)
-A note about requirement #3 above, requiring a CA signed certificate. If you deploy your own identity provider (as opposed to one of the cloud providers like Google or Microsoft) you MUST have your identity provider's web server certificate signed by a certificate with the `CA` flag set to `TRUE`, even if it is self signed. This is due to GoLang's TLS client implementation being very strict to the standards around certificate validation. If you don't have a CA handy, you can use [this script](https://github.com/coreos/dex/blob/1ee5920c54f5926d6468d2607c728b71cfe98092/examples/k8s/gencert.sh) from the CoreOS team to create a simple CA and a signed certificate and key pair.
+A note about requirement #3 above, requiring a CA signed certificate. If you deploy your own identity provider (as opposed to one of the cloud providers like Google or Microsoft) you MUST have your identity provider's web server certificate signed by a certificate with the `CA` flag set to `TRUE`, even if it is self signed. This is due to GoLang's TLS client implementation being very strict to the standards around certificate validation. If you don't have a CA handy, you can use [this script](https://github.com/dexidp/dex/blob/master/examples/k8s/gencert.sh) from the Dex team to create a simple CA and a signed certificate and key pair.
Or you can use [this similar script](https://raw.githubusercontent.com/TremoloSecurity/openunison-qs-kubernetes/master/src/main/bash/makessl.sh) that generates SHA256 certs with a longer life and larger key size.
Setup instructions for specific systems:
- [UAA](https://docs.cloudfoundry.org/concepts/architecture/uaa.html)
-- [Dex](https://github.com/dexidp/dex/blob/master/Documentation/kubernetes.md)
+- [Dex](https://dexidp.io/docs/kubernetes/)
- [OpenUnison](https://www.tremolosecurity.com/orchestra-k8s/)
#### Using kubectl
From e1bc6ac55575447a9fd9ff0e98b8bd9e1dbe8e0e Mon Sep 17 00:00:00 2001
From: Arhell
Date: Thu, 26 Nov 2020 00:40:16 +0200
Subject: [PATCH 25/80] video block sync
---
content/ru/_index.html | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/content/ru/_index.html b/content/ru/_index.html
index e86c2bf206..aaf9f136f5 100644
--- a/content/ru/_index.html
+++ b/content/ru/_index.html
@@ -42,6 +42,11 @@ Kubernetes — это проект с открытым исходным кодо
Посетите KubeCon NA онлайн, 17-20 ноября 2020
+
+
+
+
+ Посетите KubeCon EU онлайн, 4 – 7 мая 2021
From f205837b9a4acdf4d8be29e16adcfea3944f34e8 Mon Sep 17 00:00:00 2001
From: Nate W <4453979+nate-double-u@users.noreply.github.com>
Date: Wed, 25 Nov 2020 17:29:21 -0800
Subject: [PATCH 26/80] Updating
docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes
Adding the successThreshold default value of startupProbe in the Configure Probes section.
fixes: https://github.com/kubernetes/website/issues/24049
Signed-off-by: Nate W <4453979+nate-double-u@users.noreply.github.com>
---
.../configure-liveness-readiness-startup-probes.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/content/en/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes.md b/content/en/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes.md
index e72c86255a..75d6b1e3cf 100644
--- a/content/en/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes.md
+++ b/content/en/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes.md
@@ -330,8 +330,8 @@ seconds. Minimum value is 1.
* `timeoutSeconds`: Number of seconds after which the probe times out. Defaults
to 1 second. Minimum value is 1.
* `successThreshold`: Minimum consecutive successes for the probe to be
-considered successful after having failed. Defaults to 1. Must be 1 for
-liveness. Minimum value is 1.
+considered successful after having failed. Defaults to 1. Must be 1 for liveness
+and startup Probes. Minimum value is 1.
* `failureThreshold`: When a probe fails, Kubernetes will
try `failureThreshold` times before giving up. Giving up in case of liveness probe means restarting the container. In case of readiness probe the Pod will be marked Unready.
Defaults to 3. Minimum value is 1.
From 10c09ed84953997ffb866676190bb6cde56c8f94 Mon Sep 17 00:00:00 2001
From: jialaijun
Date: Thu, 26 Nov 2020 10:34:37 +0800
Subject: [PATCH 27/80] update glossary
---
.../glossary/cloud-controller-manager.md | 32 +++++++++----------
.../docs/reference/glossary/cloud-provider.md | 24 +++++++-------
2 files changed, 27 insertions(+), 29 deletions(-)
diff --git a/content/zh/docs/reference/glossary/cloud-controller-manager.md b/content/zh/docs/reference/glossary/cloud-controller-manager.md
index ca2fdc8d84..422376a4a9 100644
--- a/content/zh/docs/reference/glossary/cloud-controller-manager.md
+++ b/content/zh/docs/reference/glossary/cloud-controller-manager.md
@@ -1,3 +1,18 @@
+---
+title: Cloud Controller Manager(云控制器管理器)
+id: cloud-controller-manager
+date: 2018-04-12
+full_link: /zh/docs/tasks/administer-cluster/running-cloud-controller/
+short_description: >
+ 云控制器管理器是 1.8 的 alpha 特性。在未来发布的版本中,这是将 Kubernetes 与任何其他云集成的最佳方式。
+
+aka:
+tags:
+- core-object
+- architecture
+- operation
+---
+
----
-title: Cloud Controller Manager(云控制器管理器)
-id: cloud-controller-manager
-date: 2018-04-12
-full_link: /zh/docs/tasks/administer-cluster/running-cloud-controller/
-short_description: >
- 云控制器管理器是 1.8 的 alpha 特性。在未来发布的版本中,这是将 Kubernetes 与任何其他云集成的最佳方式。
-aka:
-tags:
-- core-object
-- architecture
-- operation
----
----
-title: Cloud Provider(云供应商)
-id: cloud-provider
-date: 2018-04-12
-short_description: >
- 一个提供云计算平台的组织。
-
-aka:
-- 云服务供应商(Cloud Service Provider)
-tags:
-- community
----
From 7afd1bd2922762837e167a5307fca1211eff2c8e Mon Sep 17 00:00:00 2001
From: zhaojizhuang <571130360@qq.com>
Date: Thu, 26 Nov 2020 10:58:56 +0800
Subject: [PATCH 28/80] [zh]sync Add 3rd party content warning to sync Add 3rd
party content warning to Ingress Controllers concept and client-libraries
---
.../docs/reference/using-api/client-libraries.md | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/content/zh/docs/reference/using-api/client-libraries.md b/content/zh/docs/reference/using-api/client-libraries.md
index 20855fbe48..add068a61d 100644
--- a/content/zh/docs/reference/using-api/client-libraries.md
+++ b/content/zh/docs/reference/using-api/client-libraries.md
@@ -24,11 +24,11 @@ API from various programming languages.
-在使用 [Kubernetes REST API](/docs/reference/using-api/api-overview/) 编写应用程序时,
+在使用 [Kubernetes REST API](/zh/docs/reference/using-api/) 编写应用程序时,
您并不需要自己实现 API 调用和 “请求/响应” 类型。
您可以根据自己的编程语言需要选择使用合适的客户端库。
@@ -36,12 +36,12 @@ You can use a client library for the programming language you are using.
Client libraries often handle common tasks such as authentication for you.
Most client libraries can discover and use the Kubernetes Service Account to
authenticate if the API client is running inside the Kubernetes cluster, or can
-understand the [kubeconfig file](/docs/tasks/access-application-cluster/authenticate-across-clusters-kubeconfig/)
+understand the [kubeconfig file](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/)
format to read the credentials and the API Server address.
-->
客户端库通常为您处理诸如身份验证之类的常见任务。
如果 API 客户端在 Kubernetes 集群中运行,大多数客户端库可以发现并使用 Kubernetes 服务帐户进行身份验证,
-或者能够理解 [kubeconfig 文件](/docs/tasks/access-application-cluster/authenticate-across-clusters-kubeconfig/)
+或者能够理解 [kubeconfig 文件](/zh/docs/tasks/access-application-cluster/authenticate-across-clusters-kubeconfig/)
格式来读取凭据和 API 服务器地址。
以下客户端库由 [Kubernetes SIG API Machinery](https://github.com/kubernetes/community/tree/master/sig-api-machinery) 正式维护。
@@ -80,6 +80,8 @@ Machinery](https://github.com/kubernetes/community/tree/master/sig-api-machinery
-->
## 社区维护的客户端库
+{{% thirdparty-content %}}
+
`Secret` 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。
将这些信息放在 `secret` 中比放在 {{< glossary_tooltip term_id="pod" >}} 的定义或者 {{< glossary_tooltip text="容器镜像" term_id="image" >}} 中来说更加安全和灵活。
参阅 [Secret 设计文档](https://git.k8s.io/community/contributors/design-proposals/auth/secrets.md) 获取更多详细信息。
+
+Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。
+这样的信息可能会被放在 Pod 规约中或者镜像中。
+用户可以创建 Secret,同时系统也创建了一些 Secret。
+
-## Secret 概览
-
-Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。
-这样的信息可能会被放在 Pod 规约中或者镜像中。
-用户可以创建 Secret,同时系统也创建了一些 Secret。
-
-
+## Secret 概览 {#overview-of-secrets}
+
要使用 Secret,Pod 需要引用 Secret。
Pod 可以用三种方式之一来使用 Secret:
@@ -69,603 +70,624 @@ Pod 可以用三种方式之一来使用 Secret:
- 由 [kubelet 在为 Pod 拉取镜像时使用](#using-imagepullsecrets)
-### 内置 Secret
-
-#### 服务账号使用 API 凭证自动创建和附加 Secret
-
-Kubernetes 自动创建包含访问 API 凭据的 Secret,并自动修改你的 Pod 以使用此类型的 Secret。
-
-
-如果需要,可以禁用或覆盖自动创建和使用 API 凭据。
-但是,如果您需要的只是安全地访问 API 服务器,我们推荐这样的工作流程。
-
-参阅[服务账号](/zh/docs/tasks/configure-pod-container/configure-service-account/)
-文档了解关于服务账号如何工作的更多信息。
-
-
-### 创建您自己的 Secret
-
-#### 使用 `kubectl` 创建 Secret
-
-Secret 中可以包含 Pod 访问数据库时需要的用户凭证信息。
-例如,某个数据库连接字符串可能包含用户名和密码。
-你可以将用户名和密码保存在本地机器的 `./username.txt` 和 `./password.txt` 文件里。
-
-```shell
-# 创建本例中要使用的文件
-echo -n 'admin' > ./username.txt
-echo -n '1f2d1e2e67df' > ./password.txt
-```
-
-
-
-`kubectl create secret` 命令将这些文件打包到一个 Secret 中并在 API server 中创建了一个对象。
Secret 对象的名称必须是合法的 [DNS 子域名](/zh/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)。
+在为创建 Secret 编写配置文件时,你可以设置 `data` 与/或 `stringData` 字段。
+`data` 和 `stringData` 字段都是可选的。`data` 字段中所有键值都必须是 base64
+编码的字符串。如果不希望执行这种 base64 字符串的转换操作,你可以选择设置
+`stringData` 字段,其中可以使用任何字符串作为其取值。
+
+
+## Secret 的类型 {#secret-types}
+
+在创建 Secret 对象时,你可以使用
+[`Secret`](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#secret-v1-core)
+资源的 `type` 字段,或者与其等价的 `kubectl` 命令行参数(如果有的话)为其设置类型。
+Secret 的类型用来帮助编写程序处理 Secret 数据。
+
+Kubernetes 提供若干种内置的类型,用于一些常见的使用场景。
+针对这些类型,Kubernetes 所执行的合法性检查操作以及对其所实施的限制各不相同。
+
+
+| 内置类型 | 用法 |
+|--------------|-------|
+| `Opaque` | 用户定义的任意数据 |
+| `kubernetes.io/service-account-token` | 服务账号令牌 |
+| `kubernetes.io/dockercfg` | `~/.dockercfg` 文件的序列化形式 |
+| `kubernetes.io/dockerconfigjson` | `~/.docker/config.json` 文件的序列化形式 |
+| `kubernetes.io/basic-auth` | 用于基本身份认证的凭据 |
+| `kubernetes.io/ssh-auth` | 用于 SSH 身份认证的凭据 |
+| `kubernetes.io/tls` | 用于 TLS 客户端或者服务器端的数据 |
+| `bootstrap.kubernetes.io/token` | 启动引导令牌数据 |
+
+
+通过为 Secret 对象的 `type` 字段设置一个非空的字符串值,你也可以定义并使用自己
+Secret 类型。如果 `type` 值为空字符串,则被视为 `Opaque` 类型。
+Kubernetes 并不对类型的名称作任何限制。不过,如果你要使用内置类型之一,
+则你必须满足为该类型所定义的所有要求。
+
+
+### Opaque Secret
+
+当 Secret 配置文件中未作显式设定时,默认的 Secret 类型是 `Opaque`。
+当你使用 `kubectl` 来创建一个 Secret 时,你会使用 `generic` 子命令来标明
+要创建的是一个 `Opaque` 类型 Secret。
+例如,下面的命令会创建一个空的 `Opaque` 类型 Secret 对象:
```shell
-kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
-```
-
-输出类似于:
-
-```
-secret "db-user-pass" created
+kubectl create secret generic empty-secret
+kubectl get secret empty-secret
```
-默认的键名是文件名。你也可以使用 `[--from-file=[key=]source]` 参数来设置键名。
+输出类似于
-```shell
-kubectl create secret generic db-user-pass \
- --from-file=username=./username.txt \
- --from-file=password=./password.txt
+```
+NAME TYPE DATA AGE
+empty-secret Opaque 0 2m6s
```
-{{< note >}}
-特殊字符(例如 `$`、`\`、`*`、`=` 和 `!`)可能会被你的
-[Shell](https://en.wikipedia.org/wiki/Shell_(computing)) 解析,因此需要转义。
-在大多数 Shell 中,对密码进行转义的最简单方式是使用单引号(`'`)将其扩起来。
-例如,如果您的实际密码是 `S!B\*d$zDsb=` ,则应通过以下方式执行命令:
-
-```
-kubectl create secret generic dev-db-secret \
- --from-literal=username=devuser \
- --from-literal=password='S!B\*d$zDsb='
-```
-
-您无需对文件中保存(`--from-file`)的密码中的特殊字符执行转义操作。
-{{< /note >}}
-
-
-您可以这样检查刚创建的 Secret:
-
-```shell
-kubectl get secrets
-```
-
-其输出类似于:
-
-```
-NAME TYPE DATA AGE
-db-user-pass Opaque 2 51s
-```
+`DATA` 列显示 Secret 中保存的数据条目个数。
+在这个例子种,`0` 意味着我们刚刚创建了一个空的 Secret。
-你可以查看 Secret 的描述:
+### 服务账号令牌 Secret {#service-account-token-secrets}
-```shell
-kubectl describe secrets/db-user-pass
-```
+类型为 `kubernetes.io/service-account-token` 的 Secret 用来存放标识某
+服务账号的令牌。使用这种 Secret 类型时,你需要确保对象的注解
+`kubernetes.io/service-account-name` 被设置为某个已有的服务账号名称。
+某个 Kubernetes 控制器会填写 Secret 的其它字段,例如
+`kubernetes.io/service-account.uid` 注解以及 `data` 字段中的 `token`
+键值,使之包含实际的令牌内容。
-其输出类似于:
-
-```
-Name: db-user-pass
-Namespace: default
-Labels:
-Annotations:
-
-Type: Opaque
-
-Data
-====
-password.txt: 12 bytes
-username.txt: 5 bytes
-```
+下面的配置实例声明了一个服务账号令牌 Secret:
-{{< note >}}
-默认情况下,`kubectl get` 和 `kubectl describe` 避免显示密码的内容。
-这是为了防止机密被意外地暴露给旁观者或存储在终端日志中。
-{{< /note >}}
-
-
-请参阅[解码 Secret](#decoding-secret) 了解如何查看 Secret 的内容。
-
-
-#### 手动创建 Secret
-
-您也可以先以 JSON 或 YAML 格式文件创建一个 Secret,然后创建该对象。
-Secret 对象的名称必须是合法的 [DNS 子域名](/zh/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)。
-[Secret](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#secret-v1-core)
-包含两个映射:`data` 和 `stringData`。
-`data` 字段用于存储使用 base64 编码的任意数据。
-提供 `stringData` 字段是为了方便,允许您用未编码的字符串提供机密数据。
-
-
-例如,要使用 `data` 字段将两个字符串存储在 Secret 中,请按如下所示将它们转换为 base64:
-
-```shell
-echo -n 'admin' | base64
-```
-
-
-输出类似于:
-
-```
-YWRtaW4=
-```
-
-```shell
-echo -n '1f2d1e2e67df' | base64
-```
-
-
-输出类似于:
-
-```
-MWYyZDFlMmU2N2Rm
-```
-
-
-
-现在可以像这样写一个 Secret 对象:
-
```yaml
apiVersion: v1
kind: Secret
metadata:
- name: mysecret
-type: Opaque
+ name: secret-sa-sample
+ annotations:
+ kubernetes.io/service-account.name: "sa-name"
+type: kubernetes.io/service-account-token
data:
- username: YWRtaW4=
- password: MWYyZDFlMmU2N2Rm
+ # You can include additional key value pairs as you do with Opaque Secrets
+ extra: YmFyCg==
```
-
-
-使用 [`kubectl apply`](/docs/reference/generated/kubectl/kubectl-commands#apply) 创建 Secret 对象:
-
-```shell
-kubectl apply -f ./secret.yaml
-```
-
-
-输出类似于:
-
-```
-secret "mysecret" created
-```
-
-
-在某些情况下,你可能希望改用 stringData 字段。
-此字段允许您将非 base64 编码的字符串直接放入 Secret 中,
-并且在创建或更新 Secret 时将为您编码该字符串。
-
-下面的一个实践示例提供了一个参考。
-你正在部署使用 Secret 存储配置文件的应用程序,并希望在部署过程中填齐配置文件的部分内容。
-
-如果您的应用程序使用以下配置文件:
-
```yaml
-apiUrl: "https://my.api.com/api/v1"
-username: "user"
-password: "password"
+apiVersion: v1
+kind: Secret
+metadata:
+ name: secret-sa-sample
+ annotations:
+ kubernetes.io/service-account.name: "sa-name"
+type: kubernetes.io/service-account-token
+data:
+ # 你可以像 Opaque Secret 一样在这里添加额外的键/值偶对
+ extra: YmFyCg==
```
-
+
+Kubernetes 在创建 Pod 时会自动创建一个服务账号 Secret 并自动修改你的 Pod
+以使用该 Secret。该服务账号令牌 Secret 中包含了访问 Kubernetes API
+所需要的凭据。
+
+如果需要,可以禁止或者重载这种自动创建并使用 API 凭据的操作。
+不过,如果你仅仅是希望能够安全地访问 API 服务器,这是建议的工作方式。
+
+
+参考 [ServiceAccount](/zh/docs/tasks/configure-pod-container/configure-service-account/)
+文档了解服务账号的工作原理。你也可以查看
+[`Pod`](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#pod-v1-core)
+资源中的 `automountServiceAccountToken` 和 `serviceAccountName` 字段文档,了解
+从 Pod 中引用服务账号。
+
+
+### Docker 配置 Secret {#docker-config-secrets}
+
+你可以使用下面两种 `type` 值之一来创建 Secret,用以存放访问 Docker 仓库
+来下载镜像的凭据。
+
+- `kubernetes.io/dockercfg`
+- `kubernetes.io/dockerconfigjson`
+
+
+`kubernetes.io/dockercfg` 是一种保留类型,用来存放 `~/.dockercfg` 文件的
+序列化形式。该文件是配置 Docker 命令行的一种老旧形式。
+使用此 Secret 类型时,你需要确保 Secret 的 `data` 字段中包含名为
+`.dockercfg` 的主键,其对应键值是用 base64 编码的某 `~/.dockercfg`
+文件的内容。
+
+
+类型 `kubernetes.io/dockerconfigjson` 被设计用来保存 JSON 数据的序列化形式,
+该 JSON 也遵从 `~/.docker/config.json` 文件的格式规则,而后者是
+`~/.dockercfg` 的新版本格式。
+使用此 Secret 类型时,Secret 对象的 `data` 字段必须包含 `.dockerconfigjson`
+键,其键值为 base64 编码的字符串包含 `~/.docker/config.json` 文件的内容。
+
+下面是一个 `kubernetes.io/dockercfg` 类型 Secret 的示例:
```yaml
apiVersion: v1
kind: Secret
metadata:
- name: mysecret
-type: Opaque
+ name: secret-dockercfg
+type: kubernetes.io/dockercfg
+data:
+ .dockercfg: |
+ ""
+```
+
+{{< note >}}
+
+如果你不希望执行 base64 编码转换,可以使用 `stringData` 字段代替。
+{{< /note >}}
+
+
+当你使用清单文件来创建这两类 Secret 时,API 服务器会检查 `data` 字段中是否
+存在所期望的主键,并且验证其中所提供的键值是否是合法的 JSON 数据。
+不过,API 服务器不会检查 JSON 数据本身是否是一个合法的 Docker 配置文件内容。
+
+```shell
+kubectl create secret docker-registry secret-tiger-docker \
+ --docker-username=tiger \
+ --docker-password=pass113 \
+ --docker-email=tiger@acme.com
+```
+
+
+上面的命令创建一个类型为 `kubernetes.io/dockerconfigjson` 的 Secret。
+如果你对 `data` 字段中的 `.dockerconfigjson` 内容进行转储,你会得到下面的
+JSON 内容,而这一内容是一个合法的 Docker 配置文件。
+
+```json
+{
+ "auths": {
+ "https://index.docker.io/v1/": {
+ "username": "tiger",
+ "password": "pass113",
+ "email": "tiger@acme.com",
+ "auth": "dGlnZXI6cGFzczExMw=="
+ }
+ }
+}
+```
+
+
+### 基本身份认证 Secret {#basic-authentication-secret}
+
+`kubernetes.io/basic-auth` 类型用来存放用于基本身份认证所需的凭据信息。
+使用这种 Secret 类型时,Secret 的 `data` 字段必须包含以下两个键:
+
+- `username`: 用于身份认证的用户名;
+- `password`: 用于身份认证的密码或令牌。
+
+
+以上两个键的键值都是 base64 编码的字符串。
+当然你也可以在创建 Secret 时使用 `stringData` 字段来提供明文形式的内容。
+下面的 YAML 是基本身份认证 Secret 的一个示例清单:
+
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+ name: secret-basic-auth
+type: kubernetes.io/basic-auth
stringData:
- config.yaml: |-
- apiUrl: "https://my.api.com/api/v1"
- username: {{username}}
- password: {{password}}
+ username: admin
+ password: t0p-Secret
```
+提供基本身份认证类型的 Secret 仅仅是出于用户方便性考虑。
+你也可以使用 `Opaque` 类型来保存用于基本身份认证的凭据。
+不过,使用内置的 Secret 类型的有助于对凭据格式进行归一化处理,并且
+API 服务器确实会检查 Secret 配置中是否提供了所需要的主键。
-然后,您的部署工具可以在执行 `kubectl apply` 之前替换模板的 `{{username}}` 和 `{{password}}` 变量。
-stringData 是只写的便利字段。检索 Secrets 时永远不会被输出。例如,如果您运行以下命令:
+
+### SSH 身份认证 Secret {#ssh-authentication-secrets}
+
+Kubernetes 所提供的内置类型 `kubernetes.io/ssh-auth` 用来存放 SSH 身份认证中
+所需要的凭据。使用这种 Secret 类型时,你就必须在其 `data` (或 `stringData`)
+字段中提供一个 `ssh-privatekey` 键值对,作为要使用的 SSH 凭据。
+
+下面的 YAML 是一个 SSH 身份认证 Secret 的配置示例:
+
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+ name: secret-ssh-auth
+type: kubernetes.io/ssh-auth
+data:
+ # 此例中的实际数据被截断
+ ssh-privatekey: |
+ MIIEpQIBAAKCAQEAulqb/Y ...
+```
+
+
+提供 SSH 身份认证类型的 Secret 仅仅是出于用户方便性考虑。
+你也可以使用 `Opaque` 类型来保存用于 SSH 身份认证的凭据。
+不过,使用内置的 Secret 类型的有助于对凭据格式进行归一化处理,并且
+API 服务器确实会检查 Secret 配置中是否提供了所需要的主键。
+
+
+### TLS Secret
+
+Kubernetes 提供一种内置的 `kubernetes.io/tls` Secret 类型,用来存放证书
+及其相关密钥(通常用在 TLS 场合)。
+此类数据主要提供给 Ingress 资源,用以终结 TLS 链接,不过也可以用于其他
+资源或者负载。当使用此类型的 Secret 时,Secret 配置中的 `data` (或
+`stringData`)字段必须包含 `tls.key` 和 `tls.crt` 主键,尽管 API 服务器
+实际上并不会对每个键的取值作进一步的合法性检查。
+
+下面的 YAML 包含一个 TLS Secret 的配置示例:
+
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+ name: secret-tls
+type: kubernetes.io/tls
+data:
+ # 此例中的数据被截断
+ tls.crt: |
+ MIIC2DCCAcCgAwIBAgIBATANBgkqh ...
+ tls.key: |
+ MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...
+```
+
+
+提供 TLS 类型的 Secret 仅仅是出于用户方便性考虑。
+你也可以使用 `Opaque` 类型来保存用于 TLS 服务器与/或客户端的凭据。
+不过,使用内置的 Secret 类型的有助于对凭据格式进行归一化处理,并且
+API 服务器确实会检查 Secret 配置中是否提供了所需要的主键。
+
+当使用 `kubectl` 来创建 TLS Secret 时,你可以像下面的例子一样使用 `tls`
+子命令:
```shell
-kubectl get secret mysecret -o yaml
+kubectl create secret tls my-tls-secret \
+ --cert=path/to/cert/file \
+ --key=path/to/key/file
```
-输出类似于:
+这里的公钥/私钥对都必须事先已存在。用于 `--cert` 的公钥证书必须是 .PEM 编码的
+(Base64 编码的 DER 格式),且与 `--key` 所给定的私钥匹配。
+私钥必须是通常所说的 PEM 私钥格式,且未加密。对这两个文件而言,PEM 格式数据
+的第一行和最后一行(例如,证书所对应的 `--------BEGIN CERTIFICATE-----` 和
+`-------END CERTIFICATE----`)都不会包含在其中。
+
+### 启动引导令牌 Secret {#bootstrap-token-secrets}
+
+通过将 Secret 的 `type` 设置为 `bootstrap.kubernetes.io/token` 可以创建
+启动引导令牌类型的 Secret。这种类型的 Secret 被设计用来支持节点的启动引导过程。
+其中包含用来为周知的 ConfigMap 签名的令牌。
+
+
+启动引导令牌 Secret 通常创建于 `kube-system` 名字空间内,并以
+`bootstrap-token-<令牌 ID>` 的形式命名;其中 `<令牌 ID>` 是一个由 6 个字符组成
+的字符串,用作令牌的标识。
+
+以 Kubernetes 清单文件的形式,某启动引导令牌 Secret 可能看起来像下面这样:
```yaml
apiVersion: v1
kind: Secret
metadata:
- creationTimestamp: 2018-11-15T20:40:59Z
- name: mysecret
- namespace: default
- resourceVersion: "7225"
- uid: c280ad2e-e916-11e8-98f2-025000000001
-type: Opaque
+ name: bootstrap-token-5emitj
+ namespace: kube-system
+type: bootstrap.kubernetes.io/token
data:
- config.yaml: YXBpVXJsOiAiaHR0cHM6Ly9teS5hcGkuY29tL2FwaS92MSIKdXNlcm5hbWU6IHt7dXNlcm5hbWV9fQpwYXNzd29yZDoge3twYXNzd29yZH19
+ auth-extra-groups: c3lzdGVtOmJvb3RzdHJhcHBlcnM6a3ViZWFkbTpkZWZhdWx0LW5vZGUtdG9rZW4=
+ expiration: MjAyMC0wOS0xM1QwNDozOToxMFo=
+ token-id: NWVtaXRq
+ token-secret: a3E0Z2lodnN6emduMXAwcg==
+ usage-bootstrap-authentication: dHJ1ZQ==
+ usage-bootstrap-signing: dHJ1ZQ==
```
+A bootstrap type has the following keys specified under `data`:
-如果在 data 和 stringData 中都指定了某一字段,则使用 stringData 中的值。
-例如,以下是 Secret 定义:
+- `token_id`: A random 6 character string as the token identifier. Required.
+- `token-secret`: A random 16 character string as the actual token secret. Required.
+- `description1`: A human-readable string that describes what the token is
+ used for. Optional.
+- `expiration`: An absolute UTC time using RFC3339 specifying when the token
+ should be expired. Optional.
+- `usage-bootstrap-`: A boolean flag indicating additional usage for
+ the bootstrap token.
+- `auth-extra-groups`: A comma-separated list of group names that will be
+ authenticated as in addition to the `system:bootstrappers` group.
+-->
+启动引导令牌类型的 Secret 会在 `data` 字段中包含如下主键:
+
+- `token_id`:由 6 个随机字符组成的字符串,作为令牌的标识符。必需。
+- `token-secret`:由 16 个随机字符组成的字符串,包含实际的令牌机密。必需。
+- `description`:供用户阅读的字符串,描述令牌的用途。可选。
+- `expiration`:一个使用 RFC3339 来编码的 UTC 绝对时间,给出令牌要过期的时间。可选。
+- `usage-bootstrap-`:布尔类型的标志,用来标明启动引导令牌的其他用途。
+- `auth-extra-groups`:用逗号分隔的组名列表,身份认证时除被认证为
+ `system:bootstrappers` 组之外,还会被添加到所列的用户组中。
+
+
-secret 中的生成结果:
+上面的 YAML 文件可能看起来令人费解,因为其中的数值均为 base64 编码的字符串。
+实际上,你完全可以使用下面的 YAML 来创建一个一模一样的 Secret:
```yaml
apiVersion: v1
kind: Secret
metadata:
- creationTimestamp: 2018-11-15T20:46:46Z
- name: mysecret
- namespace: default
- resourceVersion: "7579"
- uid: 91460ecb-e917-11e8-98f2-025000000001
-type: Opaque
-data:
- username: YWRtaW5pc3RyYXRvcg==
+ # 注意 Secret 的命名方式
+ name: bootstrap-token-5emitj
+ # 启动引导令牌 Secret 通常位于 kube-system 名字空间
+ namespace: kube-system
+type: bootstrap.kubernetes.io/token
+stringData:
+ auth-extra-groups: "system:bootstrappers:kubeadm:default-node-token"
+ expiration: "2020-09-13T04:39:10Z"
+ # 此令牌 ID 被用于生成 Secret 名称
+ token-id: "5emitj"
+ token-secret: "kq4gihvszzgn1p0r"
+ # 此令牌还可用于 authentication (身份认证)
+ usage-bootstrap-authentication: "true"
+ # 且可用于 signing (证书签名)
+ usage-bootstrap-signing: "true"
```
-其中的 `YWRtaW5pc3RyYXRvcg==` 解码后即是 `administrator`。
+## 创建 Secret {#creating-a-secret}
+
+有几种不同的方式来创建 Secret:
+
+- [使用 `kubectl` 命令创建 Secret](/zh/docs/tasks/configmap-secret/managing-secret-using-kubectl/)
+- [使用配置文件来创建 Secret](/zh/docs/tasks/configmap-secret/managing-secret-using-config-file/)
+- [使用 kustomize 来创建 Secret](/docs/tasks/configmap-secret/managing-secret-using-kustomize/)
-data 和 stringData 的键必须由字母数字字符 '-', '\_' 或者 '.' 组成。
+## 编辑 Secret {#editing-a-secret}
-{{< note >}}
-Secret 数据在序列化为 JSON 和 YAML 时,其值被编码为 base64 字符串。
-换行符在这些字符串中是非法的,因此必须省略。
-在 Darwin/macOS 上使用 `base64` 实用程序时,用户应避免使用 `-b` 选项来分隔长行。
-相反,Linux用户 *应该* 在 `base64` 命令中添加选项 `-w 0` ,
-或者,如果 `-w` 选项不可用的情况下,执行 `base64 | tr -d '\n'`。
-{{< /note >}}
-
-
-#### 从生成器创建 Secret
-
-Kubectl 从 1.14 版本开始支持[使用 Kustomize 管理对象](/docs/tasks/manage-kubernetes-objects/kustomization/)。
-Kustomize 提供资源生成器创建 Secret 和 ConfigMaps。
-Kustomize 生成器要在当前目录内的 `kustomization.yaml` 中指定。
-生成 Secret 之后,使用 `kubectl apply` 在 API 服务器上创建对象。
-
-
-#### 从文件生成 Secret {#generating-a-secret-from-files}
-
-你可以通过定义基于文件 `./username.txt` 和 `./password.txt` 的
-`secretGenerator` 来生成一个 Secret。
-
-```shell
-cat <./kustomization.yaml
-secretGenerator:
-- name: db-user-pass
- files:
- - username.txt
- - password.txt
-EOF
-```
-
-
-应用包含 `kustomization.yaml` 目录以创建 Secret 对象。
-
-```shell
-kubectl apply -k .
-```
-
-
-输出类似于:
-
-```
-secret/db-user-pass-96mffmfh4k created
-```
-
-
-您可以检查 Secret 是否创建成功:
-
-```shell
-kubectl get secrets
-```
-
-
-输出类似于:
-
-```
-NAME TYPE DATA AGE
-db-user-pass-96mffmfh4k Opaque 2 51s
-
-$ kubectl describe secrets/db-user-pass-96mffmfh4k
-Name: db-user-pass
-Namespace: default
-Labels:
-Annotations:
-
-Type: Opaque
-
-Data
-====
-password.txt: 12 bytes
-username.txt: 5 bytes
-```
-
-
-#### 基于字符串值来创建 Secret {#generating-a-secret-from-string-literals}
-
-你可以通过定义使用字符串值 `username=admin` 和 `password=secret`
-的 `secretGenerator` 来创建 Secret。
-
-```shell
-cat <./kustomization.yaml
-secretGenerator:
-- name: db-user-pass
- literals:
- - username=admin
- - password=secret
-EOF
-```
-
-应用包含 `kustomization.yaml` 目录以创建 Secret 对象。
-
-```shell
-kubectl apply -k .
-```
-
-
-输出类似于:
-
-```
-secret/db-user-pass-dddghtt9b5 created
-```
-
-
-
-{{< note >}}
-Secret 被创建时,Secret 的名称是通过为 Secret 数据计算哈希值得到一个字符串,
-并将该字符串添加到名称之后得到的。这会确保数据被修改后,会有新的 Secret
-对象被生成。
-{{< /note >}}
-
-
-
-#### 解码 Secret {#decoding-secret}
-
-可以使用 `kubectl get secret` 命令获取 Secret。例如,获取在上一节中创建的 secret:
-
-```shell
-kubectl get secret mysecret -o yaml
-```
-
-
-输出类似于:
-
-```yaml
-apiVersion: v1
-kind: Secret
-metadata:
- creationTimestamp: 2016-01-22T18:41:56Z
- name: mysecret
- namespace: default
- resourceVersion: "164619"
- uid: cfee02d6-c137-11e5-8d73-42010af00002
-type: Opaque
-data:
- username: YWRtaW4=
- password: MWYyZDFlMmU2N2Rm
-```
-
-
-
-解码 `password` 字段:
-
-```shell
-echo 'MWYyZDFlMmU2N2Rm' | base64 --decode
-```
-
-
-输出类似于:
-
-```
-1f2d1e2e67df
-```
-
-
-#### 编辑 Secret
-
-可以通过下面的命令可以编辑一个已经存在的 secret 。
+你可以通过下面的命令编辑现有的 Secret:
```shell
kubectl edit secrets mysecret
```
-这将打开默认配置的编辑器,并允许更新 `data` 字段中的 base64 编码的 Secret 值:
+这一命令会打开默认的编辑器,允许你更新 `data` 字段中包含的
+base64 编码的 Secret 值:
-```
+```yaml
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
@@ -696,8 +718,7 @@ system, without being directly exposed to the pod. For example, they can hold
credentials that other parts of the system should use to interact with external
systems on your behalf.
-->
-
-## 使用 Secret
+## 使用 Secret {#using-secrets}
Secret 可以作为数据卷被挂载,或作为{{< glossary_tooltip text="环境变量" term_id="container-env-variables" >}}
暴露出来以供 Pod 中的容器使用。它们也可以被系统的其他部分使用,而不直接暴露在 Pod 内。
@@ -1048,71 +1069,18 @@ Secret updates.
不会收到 Secret 更新。
{{< /note >}}
-{{< feature-state for_k8s_version="v1.18" state="alpha" >}}
-
-
-Kubernetes 的 alpha 特性 _不可变的 Secret 和 ConfigMap_ 提供了一种可选配置,
-可以设置各个 Secret 和 ConfigMap 为不可变的。
-对于大量使用 Secret 的集群(至少有成千上万各不相同的 Secret 供 Pod 挂载),
-禁止变更它们的数据有下列好处:
-
-
-- 防止意外(或非预期的)更新导致应用程序中断
-- 通过将 Secret 标记为不可变来关闭 kube-apiserver 对其的监视,从而显著降低
- kube-apiserver 的负载,提升集群性能。
-
-
-使用这个特性需要启用 `ImmutableEmphemeralVolumes`
-[特性开关](/zh/docs/reference/command-line-tools-reference/feature-gates/)
-并将 Secret 或 ConfigMap 的 `immutable` 字段设置为 `true`. 例如:
-
-```yaml
-apiVersion: v1
-kind: Secret
-metadata:
- ...
-data:
- ...
-immutable: true
-```
-
-
-{{< note >}}
-一旦一个 Secret 或 ConfigMap 被标记为不可变,撤销此操作或者更改 `data` 字段的内容都是 _不_ 可能的。
-只能删除并重新创建这个 Secret。现有的 Pod 将维持对已删除 Secret 的挂载点 - 建议重新创建这些 Pod。
-{{< /note >}}
-
-
#### 以环境变量的形式使用 Secrets {#using-secrets-as-environment-variables}
将 Secret 作为 Pod 中的{{< glossary_tooltip text="环境变量" term_id="container-env-variables" >}}使用:
@@ -1149,10 +1117,10 @@ spec:
```
#### 使用来自环境变量的 Secret 值 {#consuming-secret-values-from-environment-variables}
@@ -1164,7 +1132,9 @@ This is the result of commands executed inside the container from the example ab
echo $SECRET_USERNAME
```
-
+
输出类似于:
```
@@ -1175,13 +1145,74 @@ admin
echo $SECRET_PASSWORD
```
-
+
输出类似于:
```
1f2d1e2e67df
```
+
+## 不可更改的 Secret {#secret-immutable}
+
+{{< feature-state for_k8s_version="v1.19" state="beta" >}}
+
+
+Kubernetes 的 alpha 特性 _不可变的 Secret 和 ConfigMap_ 提供了一种可选配置,
+可以设置各个 Secret 和 ConfigMap 为不可变的。
+对于大量使用 Secret 的集群(至少有成千上万各不相同的 Secret 供 Pod 挂载),
+禁止变更它们的数据有下列好处:
+
+- 防止意外(或非预期的)更新导致应用程序中断
+- 通过将 Secret 标记为不可变来关闭 kube-apiserver 对其的监视,从而显著降低
+ kube-apiserver 的负载,提升集群性能。
+
+
+这个特性通过 `ImmutableEmphemeralVolumes`
+[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/)
+来控制,从 v1.19 开始默认启用。
+你可以通过将 Secret 的 `immutable` 字段设置为 `true` 创建不可更改的 Secret。
+例如:
+
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+ ...
+data:
+ ...
+immutable: true
+```
+
+{{< note >}}
+
+一旦一个 Secret 或 ConfigMap 被标记为不可更改,撤销此操作或者更改 `data` 字段的内容都是 _不_ 可能的。
+只能删除并重新创建这个 Secret。现有的 Pod 将维持对已删除 Secret 的挂载点 - 建议重新创建这些 Pod。
+{{< /note >}}
+
+- 学习如何[使用 `kubectl` 管理 Secret](/zh/docs/tasks/configmap-secret/managing-secret-using-kubectl/)
+- 学习如何[使用配置文件管理 Secret](/zh/docs/tasks/configmap-secret/managing-secret-using-config-file/)
+- 学习如何[使用 kustomize 管理 Secret](/zh/docs/tasks/configmap-secret/managing-secret-using-kustomize/)
+
From 5cf5bf210ca8c3c0fc4d96740e1bbab19790504e Mon Sep 17 00:00:00 2001
From: Maciej Filocha
Date: Tue, 24 Nov 2020 11:13:35 +0100
Subject: [PATCH 30/80] Synchronize Polish localization 2020-11-24 part 1.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Update Polish localization up to 99bfbd5ffecfae724e2f8df3c50721eca4d55fbf.
Part 1.
Co-authored-by: Karol Pucyński <9209870+kpucynski@users.noreply.github.com>
---
.../images/kub_video_banner_homepage.jpg | Bin 1889535 -> 709415 bytes
content/pl/_index.html | 11 +-
content/pl/docs/concepts/overview/_index.md | 2 +
.../pl/docs/concepts/overview/components.md | 4 +-
.../docs/concepts/overview/kubernetes-api.md | 139 +++++++-----------
.../concepts/overview/what-is-kubernetes.md | 11 +-
content/pl/docs/contribute/_index.md | 13 +-
content/pl/docs/home/_index.md | 4 +-
.../pl/docs/home/supported-doc-versions.md | 23 +--
content/pl/docs/search.md | 5 -
content/pl/docs/tutorials/hello-minikube.md | 33 ++---
11 files changed, 96 insertions(+), 149 deletions(-)
delete mode 100644 content/pl/docs/search.md
diff --git a/content/pl/_common-resources/images/kub_video_banner_homepage.jpg b/content/pl/_common-resources/images/kub_video_banner_homepage.jpg
index 57582e493845ff480325b667f2dd26bbf0a38af8..e40d92a50363b659ea2b4eadf33e6639534e9442 100644
GIT binary patch
literal 709415
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