diff --git a/content/en/_index.html b/content/en/_index.html
index 09b4f8d06a..fbdd5d5720 100644
--- a/content/en/_index.html
+++ b/content/en/_index.html
@@ -16,7 +16,7 @@ It groups containers that make up an application into logical units for easy man
{{% blocks/feature image="scalable" %}}
#### Planet Scale
-Designed on the same principles that allows Google to run billions of containers a week, Kubernetes can scale without increasing your ops team.
+Designed on the same principles that allow Google to run billions of containers a week, Kubernetes can scale without increasing your operations team.
{{% /blocks/feature %}}
@@ -43,12 +43,12 @@ Kubernetes is open source giving you the freedom to take advantage of on-premise
diff --git a/content/en/blog/_posts/2020-05-05-introducing-podtopologyspread.md b/content/en/blog/_posts/2020-05-05-introducing-podtopologyspread.md
index dfed13ca43..eab08ed299 100644
--- a/content/en/blog/_posts/2020-05-05-introducing-podtopologyspread.md
+++ b/content/en/blog/_posts/2020-05-05-introducing-podtopologyspread.md
@@ -67,7 +67,7 @@ Let's see an example of a cluster to understand this API.
As the feature name "PodTopologySpread" implies, the basic usage of this feature
is to run your workload with an absolute even manner (maxSkew=1), or relatively
even manner (maxSkew>=2). See the [official
-document](/docs/concepts/workloads/pods/pod-topology-spread-constraints/)
+document](/docs/concepts/scheduling-eviction/topology-spread-constraints/)
for more details.
In addition to this basic usage, there are some advanced usage examples that
diff --git a/content/en/blog/_posts/2020-09-30-writing-crl-scheduler/index.md b/content/en/blog/_posts/2020-09-30-writing-crl-scheduler/index.md
index 0fab185f98..dc4b97db2a 100644
--- a/content/en/blog/_posts/2020-09-30-writing-crl-scheduler/index.md
+++ b/content/en/blog/_posts/2020-09-30-writing-crl-scheduler/index.md
@@ -70,7 +70,7 @@ To correct the latter issue, we now employ a "hunt and peck" approach to removin
### 1. Upgrade to kubernetes 1.18 and make use of Pod Topology Spread Constraints
While this seems like it could have been the perfect solution, at the time of writing Kubernetes 1.18 was unavailable on the two most common managed Kubernetes services in public cloud, EKS and GKE.
-Furthermore, [pod topology spread constraints](/docs/concepts/workloads/pods/pod-topology-spread-constraints/) were still a [beta feature in 1.18](https://v1-18.docs.kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) which meant that it [wasn't guaranteed to be available in managed clusters](https://cloud.google.com/kubernetes-engine/docs/concepts/types-of-clusters#kubernetes_feature_choices) even when v1.18 became available.
+Furthermore, [pod topology spread constraints](/docs/concepts/scheduling-eviction/topology-spread-constraints/) were still a beta feature in 1.18 which meant that it [wasn't guaranteed to be available in managed clusters](https://cloud.google.com/kubernetes-engine/docs/concepts/types-of-clusters#kubernetes_feature_choices) even when v1.18 became available.
The entire endeavour was concerningly reminiscent of checking [caniuse.com](https://caniuse.com/) when Internet Explorer 8 was still around.
### 2. Deploy a statefulset _per zone_.
diff --git a/content/en/blog/_posts/2022-04-07-Kubernetes-1-24-removals-and-deprecations.md b/content/en/blog/_posts/2022-04-07-Kubernetes-1-24-removals-and-deprecations.md
index 7bc79b38d1..6428e64ad5 100644
--- a/content/en/blog/_posts/2022-04-07-Kubernetes-1-24-removals-and-deprecations.md
+++ b/content/en/blog/_posts/2022-04-07-Kubernetes-1-24-removals-and-deprecations.md
@@ -84,7 +84,7 @@ As stated earlier, there are several guides about
You can start with [Finding what container runtime are on your nodes](/docs/tasks/administer-cluster/migrating-from-dockershim/find-out-runtime-you-use/).
If your nodes are using dockershim, there are other possible Docker Engine dependencies such as
Pods or third-party tools executing Docker commands or private registries in the Docker configuration file. You can follow the
-[Check whether Dockershim deprecation affects you](/docs/tasks/administer-cluster/migrating-from-dockershim/check-if-dockershim-deprecation-affects-you/) guide to review possible
+[Check whether Dockershim removal affects you](/docs/tasks/administer-cluster/migrating-from-dockershim/check-if-dockershim-removal-affects-you/) guide to review possible
Docker Engine dependencies. Before upgrading to v1.24, you decide to either remain using Docker Engine and
[Migrate Docker Engine nodes from dockershim to cri-dockerd](/docs/tasks/administer-cluster/migrating-from-dockershim/migrate-dockershim-dockerd/) or migrate to a CRI-compatible runtime. Here's a guide to
[change the container runtime on a node from Docker Engine to containerd](/docs/tasks/administer-cluster/migrating-from-dockershim/change-runtime-containerd/).
diff --git a/content/en/docs/concepts/configuration/overview.md b/content/en/docs/concepts/configuration/overview.md
index a4dd5c5901..5dc5a64826 100644
--- a/content/en/docs/concepts/configuration/overview.md
+++ b/content/en/docs/concepts/configuration/overview.md
@@ -63,7 +63,7 @@ DNS server watches the Kubernetes API for new `Services` and creates a set of DN
## Using Labels
-- Define and use [labels](/docs/concepts/overview/working-with-objects/labels/) that identify __semantic attributes__ of your application or Deployment, such as `{ app: myapp, tier: frontend, phase: test, deployment: v3 }`. You can use these labels to select the appropriate Pods for other resources; for example, a Service that selects all `tier: frontend` Pods, or all `phase: test` components of `app: myapp`. See the [guestbook](https://github.com/kubernetes/examples/tree/master/guestbook/) app for examples of this approach.
+- Define and use [labels](/docs/concepts/overview/working-with-objects/labels/) that identify __semantic attributes__ of your application or Deployment, such as `{ app.kubernetes.io/name: MyApp, tier: frontend, phase: test, deployment: v3 }`. You can use these labels to select the appropriate Pods for other resources; for example, a Service that selects all `tier: frontend` Pods, or all `phase: test` components of `app.kubernetes.io/name: MyApp`. See the [guestbook](https://github.com/kubernetes/examples/tree/master/guestbook/) app for examples of this approach.
A Service can be made to span multiple Deployments by omitting release-specific labels from its selector. When you need to update a running service without downtime, use a [Deployment](/docs/concepts/workloads/controllers/deployment/).
diff --git a/content/en/docs/concepts/containers/runtime-class.md b/content/en/docs/concepts/containers/runtime-class.md
index 6366ee0551..cd8f74aa29 100644
--- a/content/en/docs/concepts/containers/runtime-class.md
+++ b/content/en/docs/concepts/containers/runtime-class.md
@@ -116,7 +116,7 @@ Runtime handlers are configured through containerd's configuration at
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.${HANDLER_NAME}]
```
-See containerd's [config documentation](https://github.com/containerd/cri/blob/master/docs/config.md)
+See containerd's [config documentation](https://github.com/containerd/containerd/blob/main/docs/cri/config.md)
for more details:
#### {{< glossary_tooltip term_id="cri-o" >}}
diff --git a/content/en/docs/concepts/scheduling-eviction/_index.md b/content/en/docs/concepts/scheduling-eviction/_index.md
index 21e9371f03..fd1c0bbf00 100644
--- a/content/en/docs/concepts/scheduling-eviction/_index.md
+++ b/content/en/docs/concepts/scheduling-eviction/_index.md
@@ -23,6 +23,7 @@ of terminating one or more Pods on Nodes.
* [Kubernetes Scheduler](/docs/concepts/scheduling-eviction/kube-scheduler/)
* [Assigning Pods to Nodes](/docs/concepts/scheduling-eviction/assign-pod-node/)
* [Pod Overhead](/docs/concepts/scheduling-eviction/pod-overhead/)
+* [Pod Topology Spread Constraints](/docs/concepts/scheduling-eviction/topology-spread-constraints/)
* [Taints and Tolerations](/docs/concepts/scheduling-eviction/taint-and-toleration/)
* [Scheduling Framework](/docs/concepts/scheduling-eviction/scheduling-framework)
* [Scheduler Performance Tuning](/docs/concepts/scheduling-eviction/scheduler-perf-tuning/)
diff --git a/content/en/docs/concepts/scheduling-eviction/assign-pod-node.md b/content/en/docs/concepts/scheduling-eviction/assign-pod-node.md
index db9f1d900d..9cd70f9e97 100644
--- a/content/en/docs/concepts/scheduling-eviction/assign-pod-node.md
+++ b/content/en/docs/concepts/scheduling-eviction/assign-pod-node.md
@@ -11,24 +11,27 @@ weight: 20
-You can constrain a {{< glossary_tooltip text="Pod" term_id="pod" >}} so that it can only run on particular set of
-{{< glossary_tooltip text="node(s)" term_id="node" >}}.
+You can constrain a {{< glossary_tooltip text="Pod" term_id="pod" >}} so that it is
+_restricted_ to run on particular {{< glossary_tooltip text="node(s)" term_id="node" >}},
+or to _prefer_ to run on particular nodes.
There are several ways to do this and the recommended approaches all use
[label selectors](/docs/concepts/overview/working-with-objects/labels/) to facilitate the selection.
-Generally such constraints are unnecessary, as the scheduler will automatically do a reasonable placement
+Often, you do not need to set any such constraints; the
+{{< glossary_tooltip text="scheduler" term_id="kube-scheduler" >}} will automatically do a reasonable placement
(for example, spreading your Pods across nodes so as not place Pods on a node with insufficient free resources).
However, there are some circumstances where you may want to control which node
-the Pod deploys to, for example, to ensure that a Pod ends up on a node with an SSD attached to it, or to co-locate Pods from two different
-services that communicate a lot into the same availability zone.
+the Pod deploys to, for example, to ensure that a Pod ends up on a node with an SSD attached to it,
+or to co-locate Pods from two different services that communicate a lot into the same availability zone.
You can use any of the following methods to choose where Kubernetes schedules
-specific Pods:
+specific Pods:
* [nodeSelector](#nodeselector) field matching against [node labels](#built-in-node-labels)
* [Affinity and anti-affinity](#affinity-and-anti-affinity)
* [nodeName](#nodename) field
+ * [Pod topology spread constraints](#pod-topology-spread-constraints)
## Node labels {#built-in-node-labels}
@@ -170,7 +173,7 @@ For example, consider the following Pod spec:
{{< codenew file="pods/pod-with-affinity-anti-affinity.yaml" >}}
If there are two possible nodes that match the
-`requiredDuringSchedulingIgnoredDuringExecution` rule, one with the
+`preferredDuringSchedulingIgnoredDuringExecution` rule, one with the
`label-1:key-1` label and another with the `label-2:key-2` label, the scheduler
considers the `weight` of each node and adds the weight to the other scores for
that node, and schedules the Pod onto the node with the highest final score.
@@ -337,13 +340,15 @@ null `namespaceSelector` matches the namespace of the Pod where the rule is defi
Inter-pod affinity and anti-affinity can be even more useful when they are used with higher
level collections such as ReplicaSets, StatefulSets, Deployments, etc. These
rules allow you to configure that a set of workloads should
-be co-located in the same defined topology, eg., the same node.
+be co-located in the same defined topology; for example, preferring to place two related
+Pods onto the same node.
-Take, for example, a three-node cluster running a web application with an
-in-memory cache like redis. You could use inter-pod affinity and anti-affinity
-to co-locate the web servers with the cache as much as possible.
+For example: imagine a three-node cluster. You use the cluster to run a web application
+and also an in-memory cache (such as Redis). For this example, also assume that latency between
+the web application and the memory cache should be as low as is practical. You could use inter-pod
+affinity and anti-affinity to co-locate the web servers with the cache as much as possible.
-In the following example Deployment for the redis cache, the replicas get the label `app=store`. The
+In the following example Deployment for the Redis cache, the replicas get the label `app=store`. The
`podAntiAffinity` rule tells the scheduler to avoid placing multiple replicas
with the `app=store` label on a single node. This creates each cache in a
separate node.
@@ -378,10 +383,10 @@ spec:
image: redis:3.2-alpine
```
-The following Deployment for the web servers creates replicas with the label `app=web-store`. The
-Pod affinity rule tells the scheduler to place each replica on a node that has a
-Pod with the label `app=store`. The Pod anti-affinity rule tells the scheduler
-to avoid placing multiple `app=web-store` servers on a single node.
+The following example Deployment for the web servers creates replicas with the label `app=web-store`.
+The Pod affinity rule tells the scheduler to place each replica on a node that has a Pod
+with the label `app=store`. The Pod anti-affinity rule tells the scheduler never to place
+multiple `app=web-store` servers on a single node.
```yaml
apiVersion: apps/v1
@@ -430,6 +435,10 @@ where each web server is co-located with a cache, on three separate nodes.
| *webserver-1* | *webserver-2* | *webserver-3* |
| *cache-1* | *cache-2* | *cache-3* |
+The overall effect is that each cache instance is likely to be accessed by a single client, that
+is running on the same node. This approach aims to minimize both skew (imbalanced load) and latency.
+
+You might have other reasons to use Pod anti-affinity.
See the [ZooKeeper tutorial](/docs/tutorials/stateful-application/zookeeper/#tolerating-node-failure)
for an example of a StatefulSet configured with anti-affinity for high
availability, using the same technique as this example.
@@ -468,6 +477,16 @@ spec:
The above Pod will only run on the node `kube-01`.
+## Pod topology spread constraints
+
+You can use _topology spread constraints_ to control how {{< glossary_tooltip text="Pods" term_id="Pod" >}}
+are spread across your cluster among failure-domains such as regions, zones, nodes, or among any other
+topology domains that you define. You might do this to improve performance, expected availability, or
+overall utilization.
+
+Read [Pod topology spread constraints](/docs/concepts/scheduling-eviction/topology-spread-constraints/)
+to learn more about how these work.
+
## {{% heading "whatsnext" %}}
* Read more about [taints and tolerations](/docs/concepts/scheduling-eviction/taint-and-toleration/) .
diff --git a/content/en/docs/concepts/scheduling-eviction/kube-scheduler.md b/content/en/docs/concepts/scheduling-eviction/kube-scheduler.md
index df688ded9a..c27013f6b7 100644
--- a/content/en/docs/concepts/scheduling-eviction/kube-scheduler.md
+++ b/content/en/docs/concepts/scheduling-eviction/kube-scheduler.md
@@ -83,7 +83,7 @@ of the scheduler:
## {{% heading "whatsnext" %}}
* Read about [scheduler performance tuning](/docs/concepts/scheduling-eviction/scheduler-perf-tuning/)
-* Read about [Pod topology spread constraints](/docs/concepts/workloads/pods/pod-topology-spread-constraints/)
+* Read about [Pod topology spread constraints](/docs/concepts/scheduling-eviction/topology-spread-constraints/)
* Read the [reference documentation](/docs/reference/command-line-tools-reference/kube-scheduler/) for kube-scheduler
* Read the [kube-scheduler config (v1beta3)](/docs/reference/config-api/kube-scheduler-config.v1beta3/) reference
* Learn about [configuring multiple schedulers](/docs/tasks/extend-kubernetes/configure-multiple-schedulers/)
diff --git a/content/en/docs/concepts/scheduling-eviction/node-pressure-eviction.md b/content/en/docs/concepts/scheduling-eviction/node-pressure-eviction.md
index a7724c83d9..244298d150 100644
--- a/content/en/docs/concepts/scheduling-eviction/node-pressure-eviction.md
+++ b/content/en/docs/concepts/scheduling-eviction/node-pressure-eviction.md
@@ -91,9 +91,9 @@ Some kubelet garbage collection features are deprecated in favor of eviction:
| ------------- | -------- | --------- |
| `--image-gc-high-threshold` | `--eviction-hard` or `--eviction-soft` | existing eviction signals can trigger image garbage collection |
| `--image-gc-low-threshold` | `--eviction-minimum-reclaim` | eviction reclaims achieve the same behavior |
-| `--maximum-dead-containers` | | deprecated once old logs are stored outside of container's context |
-| `--maximum-dead-containers-per-container` | | deprecated once old logs are stored outside of container's context |
-| `--minimum-container-ttl-duration` | | deprecated once old logs are stored outside of container's context |
+| `--maximum-dead-containers` | - | deprecated once old logs are stored outside of container's context |
+| `--maximum-dead-containers-per-container` | - | deprecated once old logs are stored outside of container's context |
+| `--minimum-container-ttl-duration` | - | deprecated once old logs are stored outside of container's context |
### Eviction thresholds
@@ -216,7 +216,7 @@ the kubelet frees up disk space in the following order:
If the kubelet's attempts to reclaim node-level resources don't bring the eviction
signal below the threshold, the kubelet begins to evict end-user pods.
-The kubelet uses the following parameters to determine pod eviction order:
+The kubelet uses the following parameters to determine the pod eviction order:
1. Whether the pod's resource usage exceeds requests
1. [Pod Priority](/docs/concepts/scheduling-eviction/pod-priority-preemption/)
@@ -319,7 +319,7 @@ The kubelet sets an `oom_score_adj` value for each container based on the QoS fo
{{}}
The kubelet also sets an `oom_score_adj` value of `-997` for containers in Pods that have
-`system-node-critical` {{}}
+`system-node-critical` {{}}.
{{}}
If the kubelet can't reclaim memory before a node experiences OOM, the
@@ -401,7 +401,7 @@ counted as `active_file`. If enough of these kernel block buffers are on the
active LRU list, the kubelet is liable to observe this as high resource use and
taint the node as experiencing memory pressure - triggering pod eviction.
-For more more details, see [https://github.com/kubernetes/kubernetes/issues/43916](https://github.com/kubernetes/kubernetes/issues/43916)
+For more details, see [https://github.com/kubernetes/kubernetes/issues/43916](https://github.com/kubernetes/kubernetes/issues/43916)
You can work around that behavior by setting the memory limit and memory request
the same for containers likely to perform intensive I/O activity. You will need
diff --git a/content/en/docs/concepts/scheduling-eviction/topology-spread-constraints.md b/content/en/docs/concepts/scheduling-eviction/topology-spread-constraints.md
new file mode 100644
index 0000000000..77f4d1ea55
--- /dev/null
+++ b/content/en/docs/concepts/scheduling-eviction/topology-spread-constraints.md
@@ -0,0 +1,570 @@
+---
+title: Pod Topology Spread Constraints
+content_type: concept
+weight: 40
+---
+
+
+
+
+You can use _topology spread constraints_ to control how
+{{< glossary_tooltip text="Pods" term_id="Pod" >}} are spread across your cluster
+among failure-domains such as regions, zones, nodes, and other user-defined topology
+domains. This can help to achieve high availability as well as efficient resource
+utilization.
+
+You can set [cluster-level constraints](#cluster-level-default-constraints) as a default,
+or configure topology spread constraints for individual workloads.
+
+
+
+## Motivation
+
+Imagine that you have a cluster of up to twenty nodes, and you want to run a
+{{< glossary_tooltip text="workload" term_id="workload" >}}
+that automatically scales how many replicas it uses. There could be as few as
+two Pods or as many as fifteen.
+When there are only two Pods, you'd prefer not to have both of those Pods run on the
+same node: you would run the risk that a single node failure takes your workload
+offline.
+
+In addition to this basic usage, there are some advanced usage examples that
+enable your workloads to benefit on high availability and cluster utilization.
+
+As you scale up and run more Pods, a different concern becomes important. Imagine
+that you have three nodes running five Pods each. The nodes have enough capacity
+to run that many replicas; however, the clients that interact with this workload
+are split across three different datacenters (or infrastructure zones). Now you
+have less concern about a single node failure, but you notice that latency is
+higher than you'd like, and you are paying for network costs associated with
+sending network traffic between the different zones.
+
+You decide that under normal operation you'd prefer to have a similar number of replicas
+[scheduled](/docs/concepts/scheduling-eviction/) into each infrastructure zone,
+and you'd like the cluster to self-heal in the case that there is a problem.
+
+Pod topology spread constraints offer you a declarative way to configure that.
+
+
+## `topologySpreadConstraints` field
+
+The Pod API includes a field, `spec.topologySpreadConstraints`. Here is an example:
+
+```yaml
+---
+apiVersion: v1
+kind: Pod
+metadata:
+ name: example-pod
+spec:
+ # Configure a topology spread constraint
+ topologySpreadConstraints:
+ - maxSkew:
+ minDomains: # optional; alpha since v1.24
+ topologyKey:
+ whenUnsatisfiable:
+ labelSelector:
diff --git a/content/es/docs/concepts/services-networking/network-policies.md b/content/es/docs/concepts/services-networking/network-policies.md
new file mode 100644
index 0000000000..09f65765a4
--- /dev/null
+++ b/content/es/docs/concepts/services-networking/network-policies.md
@@ -0,0 +1,287 @@
+---
+reviewers:
+- raelga
+- electrocucaracha
+title: Políticas de red (Network Policies)
+content_type: concept
+weight: 50
+---
+
+
+
+Si quieres controlar el tráfico de red a nivel de dirección IP o puerto (capa OSI 3 o 4), puedes considerar el uso de Kubernetes NetworkPolicies para las aplicaciones que corren en tu clúster. Las NetworkPolicies son una estructura enfocada en las aplicaciones que permite establecer cómo un {{< glossary_tooltip text="Pod" term_id="pod">}} puede comunicarse con otras "entidades" (utilizamos la palabra "entidad" para evitar sobrecargar términos más comunes como "Endpoint" o "Service", que tienen connotaciones específicas de Kubernetes) a través de la red. Las NetworkPolicies se aplican a uno o ambos extremos de la conexión a un Pod, sin afectar a otras conexiones.
+
+Las entidades con las que un Pod puede comunicarse son de una combinación de estos 3 tipos:
+
+1. Otros Pods permitidos (excepción: un Pod no puede bloquear el acceso a sí mismo)
+2. Namespaces permitidos
+3. Bloqueos de IP (excepción: el tráfico hacia y desde el nodo donde se ejecuta un Pod siempre está permitido, independientemente de la dirección IP del Pod o del nodo)
+
+Cuando se define una NetworkPolicy basada en Pods o Namespaces, se utiliza un {{< glossary_tooltip text="Selector" term_id="selector">}} para especificar qué tráfico se permite desde y hacia los Pod(s) que coinciden con el selector.
+
+Por otro lado, cuando se crean NetworkPolicies basadas en IP, se definen políticas basadas en bloques de IP (rangos CIDR).
+
+
+
+## Prerrequisitos
+
+Las políticas de red son implementadas por el [plugin de red](/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/). Para usar políticas de red, debes estar utilizando una solución de red que soporte NetworkPolicy. Crear un recurso NetworkPolicy sin un controlador que lo habilite no tendrá efecto alguno.
+
+
+## Dos Tipos de Aislamiento de Pod
+
+Hay dos tipos de aislamiento para un Pod: el aislamiento para la salida y el aislamiento para la entrada. Estos se refieren a las conexiones que pueden establecerse. El término "Aislamiento" en el contexto de este documento no es absoluto, sino que significa "se aplican algunas restricciones". La alternativa, "no aislado para $dirección", significa que no se aplican restricciones en la dirección descrita. Los dos tipos de aislamiento (o no) se declaran independientemente, y ambos son relevantes para una conexión de un Pod a otro.
+
+Por defecto, un Pod no está aislado para la salida; todas las conexiones salientes están permitidas. Un Pod está aislado para la salida si hay alguna NetworkPolicy con "Egress" en su `policyTypes` que seleccione el Pod; decimos que tal política se aplica al Pod para la salida. Cuando un Pod está aislado para la salida, las únicas conexiones permitidas desde el Pod son las permitidas por la lista `egress` de las NetworkPolicy que se aplique al Pod para la salida. Los valores de esas listas `egress` se combinan de forma aditiva.
+
+Por defecto, un Pod no está aislado para la entrada; todas las conexiones entrantes están permitidas. Un Pod está aislado para la entrada si hay alguna NetworkPolicy con "Ingress" en su `policyTypes` que seleccione el Pod; decimos que tal política se aplica al Pod para la entrada. Cuando un Pod está aislado para la entrada, las únicas conexiones permitidas en el Pod son las del nodo del Pod y las permitidas por la lista `ingress` de alguna NetworkPolicy que se aplique al Pod para la entrada. Los valores de esas listas de direcciones se combinan de forma aditiva.
+
+Las políticas de red no entran en conflicto; son aditivas. Si alguna política(s) se aplica a un Pod para una dirección determinada, las conexiones permitidas en esa dirección desde ese Pod es la unión de lo que permiten las políticas aplicables. Por tanto, el orden de evaluación no afecta al resultado de la política.
+
+Para que se permita una conexión desde un Pod de origen a un Pod de destino, tanto la política de salida del Pod de origen como la de entrada del Pod de destino deben permitir la conexión. Si cualquiera de los dos lados no permite la conexión, ésta no se producirá.
+
+
+## El Recurso NetworkPolicy {#networkpolicy-resource}
+
+Ver la referencia [NetworkPolicy](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#networkpolicy-v1-networking-k8s-io) para una definición completa del recurso.
+
+Un ejemplo de NetworkPolicy pudiera ser este:
+
+{{< codenew file="service/networking/networkpolicy.yaml" >}}
+
+{{< note >}}
+Enviar esto al API Server de su clúster no tendrá ningún efecto a menos que su solución de red soporte de políticas de red.
+{{< /note >}}
+
+__Campos Obligatorios__: Como con todos los otras configuraciones de Kubernetes, una NetworkPolicy
+necesita los campos `apiVersion`, `kind`, y `metadata`. Para obtener información general
+sobre cómo funcionan esos ficheros de configuración, puedes consultar
+[Configurar un Pod para usar un ConfigMap](/docs/tasks/configure-pod-container/configure-pod-configmap/),
+y [Gestión de Objetos](/docs/concepts/overview/working-with-objects/object-management).
+
+__spec__: NetworkPolicy [spec](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status) contiene toda la información necesaria para definir una política de red dado un Namespace.
+
+__podSelector__: Cada NetworkPolicy incluye un `podSelector` el cual selecciona el grupo de Pods en los cuales aplica la política. La política de ejemplo selecciona Pods con el label "role=db". Un `podSelector` vacío selecciona todos los Pods en un Namespace.
+
+__policyTypes__: Cada NetworkPolicy incluye una lista de `policyTypes` la cual puede incluir `Ingress`, `Egress`, o ambas. Los campos `policyTypes` indican si la política aplica o no al tráfico de entrada hacia el Pod seleccionado, el tráfico de salida desde el Pod seleccionado, o ambos. Si no se especifican `policyTypes` en una NetworkPolicy el valor `Ingress` será siempre aplicado por defecto y `Egress` será aplicado si la NetworkPolicy contiene alguna regla de salida.
+
+__ingress__: Cada NetworkPolicy puede incluir una lista de reglas `ingress` permitidas. Cada regla permite el tráfico con que se relaciona a ambos valores de las secciones de `from` y `ports`. La política de ejemplo contiene una única regla, la cual se relaciona con el tráfico sobre un solo puerto, desde uno de los tres orígenes definidos, el primero especificado por el valor `ipBlock`, el segundo especificado por el valor `namespaceSelector` y el tercero especificado por el `podSelector`.
+
+__egress__: Cada NetworkPolicy puede incluir una lista de reglas de `egress` permitidas. Cada regla permite el tráfico con que se relaciona a ambos valores de las secciones de `to` and `ports`. La política de ejemplo contiene una única regla, la cual se relaciona con el tráfico en un único puerto para cualquier destino en el rango de IPs `10.0.0.0/24`.
+
+Por lo tanto, la NetworkPolicy de ejemplo:
+
+1. Aísla los Pods "role=db" en el Namespace "default" para ambos tipos de tráfico ingress y egress (si ellos no están aún aislados)
+2. (Reglas Ingress) permite la conexión hacia todos los Pods en el Namespace "default" con el label "role=db" en el puerto TCP 6379 desde los siguientes orígenes:
+
+ * cualquier Pod en el Namespace "default" con el label "role=frontend"
+ * cualquier Pod en un Namespace con el label "project=myproject"
+ * La dirección IP en los rangos 172.17.0.0–172.17.0.255 y 172.17.2.0–172.17.255.255 (por ejemplo, todo el rango de IPs de 172.17.0.0/16 con excepción del 172.17.1.0/24)
+3. (Egress rules) permite conexión desde cualquier Pod en el Namespace "default" con el label "role=db" hacia CIDR 10.0.0.0/24 en el puerto TCP 5978
+
+Ver el artículo de [Declarar Network Policy](/docs/tasks/administer-clúster/declare-network-policy/) para más ejemplos.
+
+
+## Comportamiento de los selectores `to` y `from`
+
+Existen cuatro tipos de selectores que pueden ser especificados en una sección de `ingress` `from` o en una sección de `egress` `to`:
+
+__podSelector__: Este selector selecciona Pods específicos en el mismo Namespace que la NetworkPolicy para permitir el tráfico como origen de entrada o destino de salida.
+
+__namespaceSelector__: Este selector selecciona Namespaces específicos para permitir el tráfico como origen de entrada o destino de salida.
+
+__namespaceSelector__ *y* __podSelector__: Una única entrada `to`/`from` que especifica tanto `namespaceSelector` como `podSelector` selecciona Pods específicos dentro de Namespaces específicos. Es importante revisar que se utiliza la sintaxis de YAML correcta. A continuación se muestra un ejemplo de esta política:
+
+```yaml
+ ...
+ ingress:
+ - from:
+ - namespaceSelector:
+ matchLabels:
+ user: alice
+ podSelector:
+ matchLabels:
+ role: client
+ ...
+```
+
+contiene un elemento `from` permitiendo conexiones desde los Pods con el label `role=client` en Namespaces con el label `user=alice`. Por el contrario, *esta* política:
+
+```yaml
+ ...
+ ingress:
+ - from:
+ - namespaceSelector:
+ matchLabels:
+ user: alice
+ - podSelector:
+ matchLabels:
+ role: client
+ ...
+```
+
+contiene dos elementos en el array `from`, y permite conexiones desde Pods en los Namespaces con el label `role=client`, *o* desde cualquier Pod en cualquier Namespace con el label `user=alice`.
+
+En caso de duda, utilice `kubectl describe` para ver cómo Kubernetes ha interpretado la política.
+
+
+
+__ipBlock__: Este selector selecciona rangos CIDR de IP específicos para permitirlas como origen de entrada o destino de salida. Estas IPs deben ser externas al clúster, ya que las IPs de Pod son efímeras e impredecibles.
+
+Los mecanismos de entrada y salida del clúster a menudo requieren reescribir la IP de origen o destino
+de los paquetes. En los casos en los que esto ocurre, no está definido si esto ocurre antes o
+después del procesamiento de NetworkPolicy, y el comportamiento puede ser diferente para diferentes
+combinaciones de plugin de red, proveedor de nube, implementación de `Service`, etc.
+
+En el caso de la entrada, esto significa que en algunos casos se pueden filtrar paquetes
+entrantes basándose en la IP de origen real, mientras que en otros casos, la "IP de origen" sobre la que actúa la
+la NetworkPolicy actúa puede ser la IP de un `LoadBalancer` o la IP del Nodo donde este el Pod involucrado, etc.
+
+Para la salida, esto significa que las conexiones de los Pods a las IPs de `Service` que se reescriben a
+IPs externas al clúster pueden o no estar sujetas a políticas basadas en `ipBlock`.
+
+
+## Políticas por defecto
+
+Por defecto, si no existen políticas en un Namespace, se permite todo el tráfico de entrada y salida hacia y desde los Pods de ese Namespace. Los siguientes ejemplos muestran cómo cambiar el comportamiento por defecto en ese Namespace.
+
+
+### Denegar todo el tráfico de entrada por defecto
+
+Puedes crear una política que "por defecto" aisle a un Namespace del tráfico de entrada con la creación de una política que seleccione todos los Pods del Namespace pero no permite ningún tráfico de entrada en esos Pods.
+
+{{< codenew file="service/networking/network-policy-default-deny-ingress.yaml" >}}
+
+Esto asegura que incluso los Pods que no están seleccionados por ninguna otra NetworkPolicy también serán aislados del tráfico de entrada. Esta política no afecta el aislamiento en el tráfico de salida desde cualquier Pod.
+
+
+### Permitir todo el tráfico de entrada
+
+Si tu quieres permitir todo el tráfico de entrada a todos los Pods en un Namespace, puedes crear una política que explícitamente permita eso.
+
+{{< codenew file="service/networking/network-policy-allow-all-ingress.yaml" >}}
+
+Con esta política en curso, ninguna política(s) adicional puede hacer que se niegue cualquier conexión entrante a esos Pods. Esta política no tiene efecto sobre el aislamiento del tráfico de salida de cualquier Pod.
+
+
+### Denegar por defecto todo el tráfico de salida
+
+Puedes crear una política que "por defecto" aisle el tráfico de salida para un Namespace, creando una NetworkPolicy que seleccione todos los Pods pero que no permita ningún tráfico de salida desde esos Pods.
+
+{{< codenew file="service/networking/network-policy-default-deny-egress.yaml" >}}
+
+Esto asegura que incluso los Pods que no son seleccionados por ninguna otra NetworkPolicy no tengan permitido el tráfico de salida. Esta política no cambia el comportamiento de aislamiento para el tráfico de entrada de ningún Pod.
+
+
+### Permitir todo el tráfico de salida
+
+Si quieres permitir todas las conexiones desde todos los Pods de un Namespace, puedes crear una política que permita explícitamente todas las conexiones salientes de los Pods de ese Namespace.
+
+{{< codenew file="service/networking/network-policy-allow-all-egress.yaml" >}}
+
+Con esta política en vigor, ninguna política(s) adicional puede hacer que se niegue cualquier conexión de salida desde esos Pods. Esta política no tiene efecto sobre el aislamiento para el tráfico de entrada a cualquier Pod.
+
+
+### Denegar por defecto todo el tráfico de entrada y de salida
+
+Puede crear una política que "por defecto" en un Namespace impida todo el tráfico de entrada y de salida creando la siguiente NetworkPolicy en ese Namespace.
+
+{{< codenew file="service/networking/network-policy-default-deny-all.yaml" >}}
+
+Esto asegura que incluso los Pods que no son seleccionados por ninguna otra NetworkPolicy no tendrán permitido el tráfico de entrada o salida.
+
+
+## Soporte a SCTP
+
+{{< feature-state for_k8s_version="v1.20" state="stable" >}}
+
+Como característica estable, está activada por defecto. Para deshabilitar SCTP a nivel de clúster, usted (o el administrador de su clúster) tiene que deshabilitar la [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) `SCTPSupport` para el API Server con el flag `--feature-gates=SCTPSupport=false,...`.
+Cuando esta feature gate está habilitada, puede establecer el campo `protocol` de una NetworkPolicy como `SCTP`.
+
+{{< note >}}
+Debes utilizar un plugin de {{< glossary_tooltip text="CNI" term_id="cni" >}} que soporte el protocolo SCTP NetworkPolicies.
+{{< /note >}}
+
+
+## Apuntar a un rango de puertos
+
+{{< feature-state for_k8s_version="v1.22" state="beta" >}}
+
+Cuando se escribe una NetworkPolicy, se puede apuntar a un rango de puertos en lugar de un solo puerto.
+
+Esto se puede lograr con el uso del campo `endPort`, como el siguiente ejemplo:
+
+```yaml
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: multi-port-egress
+ namespace: default
+spec:
+ podSelector:
+ matchLabels:
+ role: db
+ policyTypes:
+ - Egress
+ egress:
+ - to:
+ - ipBlock:
+ cidr: 10.0.0.0/24
+ ports:
+ - protocol: TCP
+ port: 32000
+ endPort: 32768
+```
+
+La regla anterior permite que cualquier Pod con la etiqueta `role=db` en el Namespace `default` se comunique
+con cualquier IP dentro del rango `10.0.0.0/24` sobre el protocolo TCP, siempre que el puerto
+esté entre el rango 32000 y 32768.
+
+Se aplican las siguientes restricciones al utilizar este campo:
+* Como característica en estado beta, está activada por defecto. Para desactivar el campo `endPort` a nivel de clúster, usted (o su administrador de clúster) debe desactivar la [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) `NetworkPolicyEndPort`
+en el API Server con el flag `--feature-gates=NetworkPolicyEndPort=false,...`.
+* El campo `endPort` debe ser igual o mayor que el campo `port`.
+* Sólo se puede definir `endPort` si también se define `port`.
+* Ambos puertos deben ser numéricos.
+
+
+{{< note >}}
+Su clúster debe utilizar un plugin de {{< glossary_tooltip text="CNI" term_id="cni" >}} que
+soporte el campo `endPort` en las especificaciones de NetworkPolicy.
+Si su [plugin de red](/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/)
+no soporta el campo `endPort` y usted especifica una NetworkPolicy que use este campo,
+la política se aplicará sólo para el campo `port`.
+{{< /note >}}
+
+
+## Como apuntar a un Namespace usando su nombre
+
+{{< feature-state for_k8s_version="1.22" state="stable" >}}
+
+El plano de control de Kubernetes establece una etiqueta inmutable `kubernetes.io/metadata.name` en todos los
+Namespaces, siempre que se haya habilitado la [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) `NamespaceDefaultLabelName`.
+El valor de la etiqueta es el nombre del Namespace.
+
+Aunque NetworkPolicy no puede apuntar a un Namespace por su nombre con algún campo de objeto, puede utilizar la etiqueta estandarizada para apuntar a un Namespace específico.
+
+
+ ## Que no puedes hacer con políticas de red (al menos, aún no)
+
+Actualmente, en Kubernetes {{< skew currentVersion >}}, la siguiente funcionalidad no existe en la API de NetworkPolicy, pero es posible que se puedan implementar soluciones mediante componentes del sistema operativo (como SELinux, OpenVSwitch, IPTables, etc.) o tecnologías de capa 7 (Ingress controllers, implementaciones de Service Mesh) o controladores de admisión. En caso de que seas nuevo en la seguridad de la red en Kubernetes, vale la pena señalar que las siguientes historias de usuario no pueden (todavía) ser implementadas usando la API NetworkPolicy.
+
+- Forzar que el tráfico interno del clúster pase por una puerta de enlace común (esto se puede implementar con una malla de servicios u otro proxy).
+- Cualquier cosa relacionada con TLS (se puede implementar con una malla de servicios o un Ingress controllers para esto).
+- Políticas específicas de los nodos (se puede utilizar la notación CIDR para esto, pero no se puede apuntar a los nodos por sus identidades Kubernetes específicamente).
+- Apuntar Services por nombre (sin embargo, puede orientar los Pods o los Namespaces por su {{< glossary_tooltip text="labels" term_id="label" >}}, lo que suele ser una solución viable).
+- Creación o gestión de "solicitudes de políticas" que son atendidas por un tercero.
+- Políticas que por defecto son aplicadas a todos los Namespaces o Pods (hay algunas distribuciones y proyectos de Kubernetes de terceros que pueden hacer esto).
+- Consulta avanzada de políticas y herramientas de accesibilidad.
+- La capacidad de registrar los eventos de seguridad de la red (por ejemplo, las conexiones bloqueadas o aceptadas).
+- La capacidad de negar explícitamente las políticas (actualmente el modelo para NetworkPolicies es negar por defecto, con sólo la capacidad de añadir reglas de permitir).
+- La capacidad de impedir el tráfico entrante de Loopback o de Host (actualmente los Pods no pueden bloquear el acceso al host local, ni tienen la capacidad de bloquear el acceso desde su nodo residente).
+
+
+## {{% heading "whatsnext" %}}
+
+- Leer el artículo de como [Declarar de Políticas de Red](/docs/tasks/administer-clúster/declare-network-policy/) para ver más ejemplos.
+- Ver más [recetas](https://github.com/ahmetb/kubernetes-network-policy-recipes) de escenarios comunes habilitados por los recursos de las NetworkPolicy.
diff --git a/content/es/examples/service/networking/network-policy-allow-all-egress.yaml b/content/es/examples/service/networking/network-policy-allow-all-egress.yaml
new file mode 100644
index 0000000000..42b2a2a296
--- /dev/null
+++ b/content/es/examples/service/networking/network-policy-allow-all-egress.yaml
@@ -0,0 +1,11 @@
+---
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: allow-all-egress
+spec:
+ podSelector: {}
+ egress:
+ - {}
+ policyTypes:
+ - Egress
diff --git a/content/es/examples/service/networking/network-policy-allow-all-ingress.yaml b/content/es/examples/service/networking/network-policy-allow-all-ingress.yaml
new file mode 100644
index 0000000000..462912dae4
--- /dev/null
+++ b/content/es/examples/service/networking/network-policy-allow-all-ingress.yaml
@@ -0,0 +1,11 @@
+---
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: allow-all-ingress
+spec:
+ podSelector: {}
+ ingress:
+ - {}
+ policyTypes:
+ - Ingress
diff --git a/content/es/examples/service/networking/network-policy-default-deny-all.yaml b/content/es/examples/service/networking/network-policy-default-deny-all.yaml
new file mode 100644
index 0000000000..5c0086bd71
--- /dev/null
+++ b/content/es/examples/service/networking/network-policy-default-deny-all.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: default-deny-all
+spec:
+ podSelector: {}
+ policyTypes:
+ - Ingress
+ - Egress
diff --git a/content/es/examples/service/networking/network-policy-default-deny-egress.yaml b/content/es/examples/service/networking/network-policy-default-deny-egress.yaml
new file mode 100644
index 0000000000..a4659e1417
--- /dev/null
+++ b/content/es/examples/service/networking/network-policy-default-deny-egress.yaml
@@ -0,0 +1,9 @@
+---
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: default-deny-egress
+spec:
+ podSelector: {}
+ policyTypes:
+ - Egress
diff --git a/content/es/examples/service/networking/network-policy-default-deny-ingress.yaml b/content/es/examples/service/networking/network-policy-default-deny-ingress.yaml
new file mode 100644
index 0000000000..e823802487
--- /dev/null
+++ b/content/es/examples/service/networking/network-policy-default-deny-ingress.yaml
@@ -0,0 +1,9 @@
+---
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: default-deny-ingress
+spec:
+ podSelector: {}
+ policyTypes:
+ - Ingress
diff --git a/content/es/examples/service/networking/networkpolicy.yaml b/content/es/examples/service/networking/networkpolicy.yaml
new file mode 100644
index 0000000000..e91eed2f67
--- /dev/null
+++ b/content/es/examples/service/networking/networkpolicy.yaml
@@ -0,0 +1,35 @@
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: test-network-policy
+ namespace: default
+spec:
+ podSelector:
+ matchLabels:
+ role: db
+ policyTypes:
+ - Ingress
+ - Egress
+ ingress:
+ - from:
+ - ipBlock:
+ cidr: 172.17.0.0/16
+ except:
+ - 172.17.1.0/24
+ - namespaceSelector:
+ matchLabels:
+ project: myproject
+ - podSelector:
+ matchLabels:
+ role: frontend
+ ports:
+ - protocol: TCP
+ port: 6379
+ egress:
+ - to:
+ - ipBlock:
+ cidr: 10.0.0.0/24
+ ports:
+ - protocol: TCP
+ port: 5978
+
diff --git a/content/ja/docs/reference/using-api/_index.md b/content/ja/docs/reference/using-api/_index.md
index 2dff67b71f..4cf5b25a95 100644
--- a/content/ja/docs/reference/using-api/_index.md
+++ b/content/ja/docs/reference/using-api/_index.md
@@ -30,7 +30,7 @@ JSONとProtobufなどのシリアル化スキーマの変更については同
以下の説明は、両方のフォーマットをカバーしています。
APIのバージョニングとソフトウェアのバージョニングは間接的に関係しています。
-[API and release versioning proposal](https://git.k8s.io/community/contributors/design-proposals/release/versioning.md)は、APIバージョニングとソフトウェアバージョニングの関係を説明しています。
+[API and release versioning proposal](https://git.k8s.io/sig-release/release-engineering/versioning.md)は、APIバージョニングとソフトウェアバージョニングの関係を説明しています。
APIのバージョンが異なると、安定性やサポートのレベルも異なります。
各レベルの基準については、[API Changes documentation](https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md#alpha-beta-and-stable-versions)で詳しく説明しています。
diff --git a/content/ja/docs/setup/release/version-skew-policy.md b/content/ja/docs/setup/release/version-skew-policy.md
index 3e58503462..bd1875aa41 100644
--- a/content/ja/docs/setup/release/version-skew-policy.md
+++ b/content/ja/docs/setup/release/version-skew-policy.md
@@ -12,7 +12,7 @@ weight: 30
## サポートされるバージョン {#supported-versions}
-Kubernetesのバージョンは**x.y.z**の形式で表現され、**x**はメジャーバージョン、**y**はマイナーバージョン、**z**はパッチバージョンを指します。これは[セマンティック バージョニング](https://semver.org/)に従っています。詳細は、[Kubernetesのリリースバージョニング](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/release/versioning.md#kubernetes-release-versioning)を参照してください。
+Kubernetesのバージョンは**x.y.z**の形式で表現され、**x**はメジャーバージョン、**y**はマイナーバージョン、**z**はパッチバージョンを指します。これは[セマンティック バージョニング](https://semver.org/)に従っています。詳細は、[Kubernetesのリリースバージョニング](https://git.k8s.io/sig-release/release-engineering/versioning.md#kubernetes-release-versioning)を参照してください。
Kubernetesプロジェクトでは、最新の3つのマイナーリリースについてリリースブランチを管理しています ({{< skew latestVersion >}}, {{< skew prevMinorVersion >}}, {{< skew oldestMinorVersion >}})。
diff --git a/content/ko/docs/reference/access-authn-authz/authorization.md b/content/ko/docs/reference/access-authn-authz/authorization.md
index 3c9c4e2280..bd36cd0f54 100644
--- a/content/ko/docs/reference/access-authn-authz/authorization.md
+++ b/content/ko/docs/reference/access-authn-authz/authorization.md
@@ -87,7 +87,7 @@ DELETE | delete(개별 리소스), deletecollection(리소스 모음)
쿠버네티스 API 서버는 몇 가지 인가 모드 중 하나를 사용하여 요청을 승인할 수 있다.
- * **Node** - 실행되도록 스케줄된 파드에 따라 kubelet에게 권한을 부여하는 특수 목적 인가 모드. Node 인가 모드 사용에 대한 자세한 내용은 [Node 인가](/docs/reference/access-authn-authz/node/)을 참조한다.
+ * **Node** - 실행되도록 스케줄된 파드에 따라 kubelet에게 권한을 부여하는 특수 목적 인가 모드. Node 인가 모드 사용에 대한 자세한 내용은 [Node 인가](/docs/reference/access-authn-authz/node/)를 참조한다.
* **ABAC** - 속성 기반 접근 제어 (ABAC, Attribute-based access control)는 속성과 결합한 정책의 사용을 통해 사용자에게 접근 권한을 부여하는 접근 제어 패러다임을 말한다. 이 정책은 모든 유형의 속성(사용자 속성, 리소스 속성, 오브젝트, 환경 속성 등)을 사용할 수 있다. ABAC 모드 사용에 대한 자세한 내용은 [ABAC 모드](/docs/reference/access-authn-authz/abac/)를 참조한다.
* **RBAC** - 역할 기반 접근 제어(RBAC, Role-based access control)는 기업 내 개별 사용자의 역할을 기반으로 컴퓨터나 네트워크 리소스에 대한 접근을 규제하는 방식이다. 이 맥락에서 접근은 개별 사용자가 파일을 보거나 만들거나 수정하는 것과 같은 특정 작업을 수행할 수 있는 능력이다. RBAC 모드 사용에 대한 자세한 내용은 [RBAC 모드](/docs/reference/access-authn-authz/rbac/)를 참조한다.
* 지정된 RBAC(역할 기반 접근 제어)이 인가 결정을 위해 `rbac.authorization.k8s.io` API 그룹을 사용하면, 관리자가 쿠버네티스 API를 통해 권한 정책을 동적으로 구성할 수 있다.
diff --git a/content/pl/_index.html b/content/pl/_index.html
index 6d61651f02..93df2863a9 100644
--- a/content/pl/_index.html
+++ b/content/pl/_index.html
@@ -44,12 +44,12 @@ Kubernetes jako projekt open-source daje Ci wolność wyboru ⏤ skorzystaj z pr
diff --git a/content/pt-br/docs/concepts/architecture/nodes.md b/content/pt-br/docs/concepts/architecture/nodes.md
new file mode 100644
index 0000000000..b28544f40b
--- /dev/null
+++ b/content/pt-br/docs/concepts/architecture/nodes.md
@@ -0,0 +1,385 @@
+---
+title: Nós
+content_type: conceito
+weight: 10
+---
+
+
+
+O Kubernetes executa sua carga de trabalho colocando contêineres em Pods para serem executados em _Nós_. Um nó pode ser uma máquina virtual ou física, dependendo do cluster. Cada nó é gerenciado pela {{< glossary_tooltip text="camada de gerenciamento" term_id="control-plane" >}} e contém os serviços necessários para executar {{< glossary_tooltip text="Pods" term_id="pod" >}}.
+
+Normalmente, você tem vários nós em um cluster; em um ambiente de aprendizado ou limitado por recursos, você pode ter apenas um nó.
+
+Os [componentes](/docs/concepts/overview/components/#node-components) em um nó incluem o {{< glossary_tooltip text="kubelet" term_id="kubelet" >}}, um {{< glossary_tooltip text="agente de execução de contêiner" term_id="container-runtime" >}}, e o {{< glossary_tooltip text="kube-proxy" term_id="kube-proxy" >}}.
+
+
+
+## Administração
+
+Existem duas maneiras principais de adicionar Nós ao {{< glossary_tooltip text="Servidor da API" term_id="kube-apiserver" >}}:
+
+1. O kubelet em um nó se registra automaticamente na camada de gerenciamento
+2. Você (ou outro usuário humano) adiciona manualmente um objeto Nó
+
+Depois de criar um {{< glossary_tooltip text="objeto" term_id="object" >}} Nó, ou o kubelet em um nó se registra automaticamente, a camada de gerenciamento verifica se o novo objeto Nó é válido. Por exemplo, se você tentar criar um nó a partir do seguinte manifesto JSON:
+
+```json
+{
+ "kind": "Node",
+ "apiVersion": "v1",
+ "metadata": {
+ "name": "10.240.79.157",
+ "labels": {
+ "name": "my-first-k8s-node"
+ }
+ }
+}
+```
+
+O Kubernetes cria um objeto nó internamente (a representação). O Kubernetes verifica se um kubelet se registrou no servidor da API que corresponde ao campo `metadata.name` do Nó. Se o nó estiver íntegro (ou seja, todos os serviços necessários estiverem em execução), ele será elegível para executar um Pod. Caso contrário, esse nó é ignorado para qualquer atividade de cluster até que se torne íntegro.
+
+{{< note >}}
+O Kubernetes mantém o objeto nó inválido e continua verificando se ele se torna íntegro.
+
+Você, ou um {{< glossary_tooltip term_id="controller" text="controlador">}}, deve excluir explicitamente o objeto Nó para interromper essa verificação de integridade.
+{{< /note >}}
+
+O nome de um objeto nó deve ser um nome de [subdomínio válido de DNS](/docs/concepts/overview/working-with-objects/names#dns-subdomain-names).
+
+### Singularidade de nome do nó
+
+O [nome](/docs/concepts/overview/working-with-objects/names#names) identifica um nó. Dois nós não podem ter o mesmo nome ao mesmo tempo. O Kubernetes também assume que um recurso com o mesmo nome é o mesmo objeto. No caso de um nó, assume-se implicitamente que uma instância usando o mesmo nome terá o mesmo estado (por exemplo, configurações de rede, conteúdo do disco raiz) e atributos como label de nó. Isso pode levar a inconsistências se uma instância for modificada sem alterar seu nome. Se o nó precisar ser substituído ou atualizado significativamente, o objeto Nó existente precisa ser removido do servidor da API primeiro e adicionado novamente após a atualização.
+
+### Auto-registro de Nós
+
+Quando a opção `--register-node` do kubelet for verdadeira (padrão), o kubelet tentará se registrar no servidor da API. Este é o padrão preferido, usado pela maioria das distribuições.
+
+Para auto-registro, o kubelet é iniciado com as seguintes opções:
+
+- `--kubeconfig` - O caminho das credenciais para se autenticar no servidor da API.
+- `--cloud-provider` - Como comunicar com um {{< glossary_tooltip text="provedor de nuvem" term_id="cloud-provider" >}}
+ para ler metadados sobre si mesmo.
+- `--register-node` - Registrar automaticamente no servidor da API.
+- `--register-with-taints` - Registra o nó com a lista fornecida de {{< glossary_tooltip text="taints" term_id="taint" >}} (separadas por vírgula `=:`).
+
+Não funciona se o `register-node` for falso.
+
+- `--node-ip` - endereço IP do nó.
+- `--node-labels` - {{< glossary_tooltip text="Labels" term_id="label" >}} a serem adicionados ao registrar o nó
+ no cluster (consulte as restrições de label impostas pelo [plug-in de admissão NodeRestriction](/docs/reference/access-authn-authz/admission-controllers/#noderestriction)).
+- `--node-status-update-frequency` - Especifica com que frequência o kubelet publica o status do nó no servidor da API.
+
+Quando o [modo de autorização do nó](/docs/reference/access-authn-authz/node/) e o [plug-in de admissão NodeRestriction](/docs/reference/access-authn-authz/admission-controllers/#noderestriction) estão ativados, os kubelets somente estarão autorizados a criar/modificar seu próprio recurso do nó.
+
+
+{{< note >}}
+Como mencionado na seção de [singularidade do nome do nó](#singularidade-de-nome-do-no), quando a configuração do nó precisa ser atualizada, é uma boa prática registrar novamente o nó no servidor da API. Por exemplo, se o kubelet estiver sendo reiniciado com o novo conjunto de `--node-labels`, mas o mesmo nome de nó for usado, a alteração não entrará em vigor, pois os labels estão sendo definidos no registro do Nó.
+
+Pods já agendados no Nó podem ter um comportamento anormal ou causar problemas se a configuração do Nó for alterada na reinicialização do kubelet. Por exemplo, o Pod já em execução pode estar marcado diferente dos labels atribuídos ao Nó, enquanto outros Pods, que são incompatíveis com esse Pod, serão agendados com base nesse novo label. O novo registro do nó garante que todos os Pods sejam drenados e devidamente reiniciados.
+{{< /note >}}
+
+### Administração manual de nós
+
+Você pode criar e modificar objetos Nó usando o {{< glossary_tooltip text="kubectl" term_id="kubectl" >}}.
+
+Quando você quiser manualmente criar objetos Nó, defina a opção do kubelet `--register-node=false`.
+
+Você pode modificar os objetos Nó, independentemente da configuração de `--register-node`. Por exemplo, você pode definir labels em um nó existente ou marcá-lo como não disponível.
+
+Você pode usar labels nos Nós em conjunto com seletores de nós nos Pods para controlar a disponibilidade. Por exemplo, você pode restringir um Pod a ser elegível apenas para ser executado em um subconjunto dos nós disponíveis.
+
+Marcar um nó como não disponível impede que o escalonador coloque novos pods nesse nó, mas não afeta os Pods existentes no nó. Isso é útil como uma etapa preparatória antes da reinicialização de um nó ou outra manutenção.
+
+Para marcar um nó como não disponível, execute:
+
+```shell
+kubectl cordon $NODENAME
+```
+
+Consulte [Drenar um nó com segurança](/docs/tasks/administer-cluster/safely-drain-node/) para obter mais detalhes.
+
+{{< note >}}
+Os Pods que fazem parte de um {{< glossary_tooltip term_id="daemonset" >}} toleram ser executados em um nó não disponível. Os DaemonSets geralmente fornecem serviços locais de nós que devem ser executados em um Nó, mesmo que ele esteja sendo drenado de aplicativos de carga de trabalho.
+{{< /note >}}
+
+## Status do Nó
+
+O status de um nó contém as seguintes informações:
+
+* [Endereços](#addresses)
+* [Condições](#condition)
+* [Capacidade](#capacity)
+* [Informação](#info)
+
+Você pode usar o `kubectl` para visualizar o status de um nó e outros detalhes:
+
+```shell
+kubectl describe node
+```
+
+Cada seção da saída está descrita abaixo.
+
+### Endereços
+
+O uso desses campos pode mudar dependendo do seu provedor de nuvem ou configuração dedicada.
+
+* HostName: O nome do host relatado pelo `kernel` do nó. Pode ser substituído através do parâmetro kubelet `--hostname-override`.
+* ExternalIP: Geralmente, o endereço IP do nó que é roteável externamente (disponível fora do `cluster`).
+* InternalIP: Geralmente, o endereço IP do nó que é roteável somente dentro do `cluster`.
+
+### Condições {#conditions}
+
+O campo `conditions` descreve o status de todos os nós em execução. Exemplos de condições incluem:
+
+{{< table caption = "Condições do nó e uma descrição de quando cada condição se aplica." >}}
+| Condições do nó | Descrição |
+|----------------------|-------------|
+| `Ready` | `True` Se o nó estiver íntegro e pronto para aceitar pods, `False` se o nó não estiver íntegro e não estiver aceitando pods, e desconhecido `Unknown` se o controlador do nó tiver sem notícias do nó no último `node-monitor-grace-period` (o padrão é de 40 segundos) |
+| `DiskPressure` | `True` Se houver pressão sobre o tamanho do disco, ou seja, se a capacidade do disco for baixa; caso contrário `False` |
+| `MemoryPressure` | `True` Se houver pressão na memória do nó, ou seja, se a memória do nó estiver baixa; caso contrário `False` |
+| `PIDPressure` | `True` Se houver pressão sobre os processos, ou seja, se houver muitos processos no nó; caso contrário `False` |
+| `NetworkUnavailable` | `True` Se a rede do nó não estiver configurada corretamente, caso contrário `False` |
+{{< /table >}}
+
+{{< note >}}
+Se você usar as ferramentas de linha de comando para mostrar os detalhes de um nó isolado, a `Condition` inclui `SchedulingDisabled`. `SchedulingDisabled` não é uma condição na API do Kubernetes; em vez disso, os nós isolados são marcados como `Unschedulable` em suas especificações.
+{{< /note >}}
+
+Na API do Kubernetes, a condição de um nó é representada como parte do `.status` do recurso do nó. Por exemplo, a seguinte estrutura JSON descreve um nó íntegro:
+
+```json
+"conditions": [
+ {
+ "type": "Ready",
+ "status": "True",
+ "reason": "KubeletReady",
+ "message": "kubelet is posting ready status",
+ "lastHeartbeatTime": "2019-06-05T18:38:35Z",
+ "lastTransitionTime": "2019-06-05T11:41:27Z"
+ }
+]
+```
+
+Se o status da condição `Ready` permanecer desconhecido (`Unknown`) ou falso (`False`) por mais tempo do que o limite da remoção do pod (`pod-eviction-timeout`) (um argumento passado para o {{< glossary_tooltip text="kube-controller-manager" term_id="kube-controller-manager">}}), o [controlador de nó](#node-controller) acionará o {{< glossary_tooltip text="remoção iniciado pela API" term_id="api-eviction" >}} para todos os Pods atribuídos a esse nó. A duração padrão do tempo limite da remoção é de **cinco minutos**. Em alguns casos, quando o nó está inacessível, o servidor da API não consegue se comunicar com o kubelet no nó. A decisão de excluir os pods não pode ser comunicada ao kubelet até que a comunicação com o servidor da API seja restabelecida. Enquanto isso, os pods agendados para exclusão podem continuar a ser executados no nó particionado.
+
+O controlador de nós não força a exclusão dos pods até que seja confirmado que eles pararam de ser executados no cluster. Você pode ver os pods que podem estar sendo executados em um nó inacessível como estando no estado de terminando (`Terminating`) ou desconhecido (`Unknown`). Nos casos em que o Kubernetes não retirar da infraestrutura subjacente se um nó tiver deixado permanentemente um cluster, o administrador do cluster pode precisar excluir o objeto do nó manualmente. Excluir o objeto do nó do Kubernetes faz com que todos os objetos Pod em execução no nó sejam excluídos do servidor da API e libera seus nomes.
+
+Quando ocorrem problemas nos nós, a camada de gerenciamento do Kubernetes cria automaticamente [`taints`](/docs/concepts/scheduling-eviction/taint-and-toleration/) que correspondem às condições que afetam o nó. O escalonador leva em consideração as `taints` do Nó ao atribuir um Pod a um Nó. Os Pods também podem ter {{< glossary_tooltip text="tolerations" term_id="toleration" >}} que os permitem funcionar em um nó, mesmo que tenha uma `taint` específica.
+
+Consulte [Nó Taint por Condição](/pt-br/docs/concepts/scheduling-eviction/taint-and-toleration/#taints-por-condições-de-nó)
+para mais detalhes.
+
+### Capacidade e Alocável {#capacity}
+
+Descreve os recursos disponíveis no nó: CPU, memória e o número máximo de pods que podem ser agendados no nó.
+
+Os campos no bloco de capacidade indicam a quantidade total de recursos que um nó possui. O bloco alocado indica a quantidade de recursos em um nó que está disponível para ser consumido por Pods normais.
+
+Você pode ler mais sobre capacidade e recursos alocados enquanto aprende a [reservar recursos de computação](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable) em um nó.
+
+### Info
+
+Descreve informações gerais sobre o nó, como a versão do kernel, a versão do Kubernetes (versão do kubelet e kube-proxy), detalhes do tempo de execução do contêiner e qual sistema operacional o nó usa. O kubelet coleta essas informações do nó e as publica na API do Kubernetes.
+
+## Heartbeats
+
+Os `Heartbeats`, enviados pelos nós do Kubernetes, ajudam seu cluster a determinar a disponibilidade de cada nó e a agir quando as falhas forem detectadas.
+
+Para nós, existem duas formas de `heartbeats`:
+
+* atualizações para o `.status` de um Nó
+* Objetos [Lease](/docs/reference/kubernetes-api/cluster-resources/lease-v1/) dentro do {{< glossary_tooltip term_id="namespace" text="namespace">}} `kube-node-lease`. Cada nó tem um objeto de `Lease` associado.
+
+Em comparação com as atualizações no `.status` de um nó, um Lease é um recurso mais leve. O uso de Leases para `heartbeats` reduz o impacto no desempenho dessas atualizações para grandes clusters.
+
+O kubelet é responsável por criar e atualizar o `.status` dos Nós e por atualizar suas Leases relacionadas.
+
+- O kubelet atualiza o .status do nó quando há mudança de status ou se não houve atualização para um intervalo configurado. O intervalo padrão para atualizações .status para Nós é de 5 minutos, o que é muito maior do que o tempo limite padrão de 40 segundos para nós inacessíveis.
+- O kubelet cria e atualiza seu objeto `Lease` a cada 10 segundos (o intervalo de atualização padrão). As atualizações de Lease ocorrem independentemente das atualizações no `.status` do Nó. Se a atualização do `Lease` falhar, o kubelet voltará a tentativas, usando um recuo exponencial que começa em 200 milissegundos e limitado a 7 segundos.
+
+## Controlador de Nós
+
+O {{< glossary_tooltip text="controlador" term_id="controller" >}} de nós é um componente da camada de gerenciamento do Kubernetes que gerencia vários aspectos dos nós.
+
+O controlador de nó tem várias funções na vida útil de um nó. O primeiro é atribuir um bloco CIDR ao nó quando ele é registrado (se a atribuição CIDR estiver ativada).
+
+O segundo é manter a lista interna de nós do controlador de nós atualizada com a lista de máquinas disponíveis do provedor de nuvem. Ao ser executado em um ambiente de nuvem e sempre que um nó não é íntegro, o controlador de nó pergunta ao provedor de nuvem se a VM desse nó ainda está disponível. Caso contrário, o controlador de nós exclui o nó de sua lista de nós.
+
+O terceiro é monitorar a saúde dos nós. O controlador do nó é responsável por:
+
+- No caso de um nó se tornar inacessível, atualizar a condição NodeReady dentro do campo `.status` do nó. Nesse caso, o controlador do nó define a condição de pronto (`NodeReady`) como condição desconhecida (`ConditionUnknown`).
+- Se um nó permanecer inacessível: será iniciado a [remoção pela API](/docs/concepts/scheduling-eviction/api-eviction/) para todos os Pods no nó inacessível. Por padrão, o controlador do nó espera 5 minutos entre marcar o nó como condição desconhecida (`ConditionUnknown`) e enviar a primeira solicitação de remoção.
+
+O controlador de nó verifica o estado de cada nó a cada `--node-monitor-period` segundos.
+
+### Limites de taxa de remoção
+
+Na maioria dos casos, o controlador de nós limita a taxa de remoção a `--node-eviction-rate` (0,1 por padrão) por segundo, o que significa que ele não removerá pods de mais de 1 nó por 10 segundos.
+
+O comportamento de remoção do nó muda quando um nó em uma determinada zona de disponibilidade se torna não íntegro. O controlador de nós verifica qual porcentagem de nós na zona não são íntegras (a condição `NodeReady` é desconhecida `ConditionUnknown` ou falsa `ConditionFalse`) ao mesmo tempo:
+
+- Se a fração de nós não íntegros for ao menos `--unhealthy-zone-threshold` (padrão 0,55), então a taxa de remoção será reduzida.
+- Se o cluster for pequeno (ou seja, tiver número de nós menor ou igual ao valor da opção `--large-cluster-size-threshold` - padrão 50), então as remoções serão interrompidas.
+- Caso contrário, a taxa de remoção é reduzida para `--secondary-node-eviction-rate` de nós secundários (padrão 0,01) por segundo.
+
+A razão pela qual essas políticas são implementadas por zona de disponibilidade é porque a camada de gerenciamento pode perder conexão com uma zona de disponibilidade, enquanto as outras permanecem conectadas. Se o seu cluster não abranger várias zonas de disponibilidade de provedores de nuvem, o mecanismo de remoção não levará em conta a indisponibilidade por zona.
+
+Uma das principais razões para espalhar seus nós pelas zonas de disponibilidade é para que a carga de trabalho possa ser transferida para zonas íntegras quando uma zona inteira cair. Portanto, se todos os nós em uma zona não estiverem íntegros, o controlador do nó removerá na taxa normal de `--node-eviction-rate`. O caso especial é quando todas as zonas estiverem completamente insalubres (nenhum dos nós do cluster será íntegro). Nesse caso, o controlador do nó assume que há algum problema com a conectividade entre a camada de gerenciamento e os nós e não realizará nenhuma remoção. (Se houver uma interrupção e alguns nós reaparecerem, o controlador do nó expulsará os pods dos nós restantes que estiverem insalubres ou inacessíveis).
+
+O controlador de nós também é responsável por remover pods em execução nos nós com `NoExecute` taints, a menos que esses pods tolerem essa taint. O controlador de nó também adiciona as {{< glossary_tooltip text="taints" term_id="taint" >}} correspondentes aos problemas de nó, como nó inacessível ou não pronto. Isso significa que o escalonador não colocará Pods em nós não íntegros.
+
+## Rastreamento de capacidade de recursos {#node-capacity}
+
+Os objetos do nó rastreiam informações sobre a capacidade de recursos do nó: por exemplo, a quantidade de memória disponível e o número de CPUs. Os nós que se [auto-registram](#self-registration-of-nodes) relatam sua capacidade durante o registro. Se você adicionar [manualmente](#manual-node-administration) um nó, precisará definir as informações de capacidade do nó ao adicioná-lo.
+
+O {{< glossary_tooltip text="escalonador" term_id="kube-scheduler" >}} do Kubernetes garante que haja recursos suficientes para todos os Pods em um nó. O escalonador verifica se a soma das solicitações de contêineres no nó não é maior do que a capacidade do nó. Essa soma de solicitações inclui todos os contêineres gerenciados pelo kubelet, mas exclui quaisquer contêineres iniciados diretamente pelo agente de execução de contêiner e também exclui quaisquer processos executados fora do controle do kubelet.
+
+{{< note >}}
+Se você quiser reservar explicitamente recursos para processos que não sejam do Pod, consulte [reserva de recursos para daemons do sistema](/docs/tasks/administer-cluster/reserve-compute-resources/#system-reserved).
+{{< /note >}}
+
+## Topologia do Nó
+
+{{< feature-state state="alpha" for_k8s_version="v1.16" >}}
+
+Se você ativou os [recursos]](/docs/reference/command-line-tools-reference/feature-gates/) de `TopologyManager`, o kubelet pode usar dicas da topologia ao tomar decisões de atribuição de recursos. Consulte [Controle das Políticas de Gerenciamento de Topologia em um Nó](/docs/tasks/administer-cluster/topology-manager/) para obter mais informações.
+
+## Desligamento gracioso do nó {#graceful-node-shutdown}
+
+{{< feature-state state="beta" for_k8s_version="v1.21" >}}
+
+O kubelet tenta detectar o desligamento do sistema do nó e encerra os pods em execução no nó.
+
+O Kubelet garante que os pods sigam o processo normal de [término do pod](/docs/concepts/workloads/pods/)pod-lifecycle/#pod-termination) durante o desligamento do nó.
+
+O recurso de desligamento gradual do nó depende do systemd, pois aproveita os [bloqueios do inibidor do systemd](https://www.freedesktop.org/wiki/Software/systemd/inhibit/) para atrasar o desligamento do nó com uma determinada duração.
+
+O desligamento gradual do nó é controlado com [recursos](/docs/reference/command-line-tools-reference/feature-gates/) `GracefulNodeShutdown`, que é ativado por padrão na versão 1.21.
+
+Observe que, por padrão, ambas as opções de configuração descritas abaixo, `shutdownGracePeriod` and `shutdownGracePeriodCriticalPods` estão definidas como zero, não ativando assim a funcionalidade de desligamento gradual do nó. Para ativar o recurso, as duas configurações do kubelet devem ser configuradas adequadamente e definidas como valores diferentes de zero.
+
+Durante um desligamento gradual, o kubelet encerra os pods em duas fases:
+
+1. Encerra os pods regulares em execução no nó.
+2. Encerra os [pods críticos](/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/#marking-pod-as-critical) em execução no nó.
+
+O recurso de desligamento gradual do nó é configurado com duas opções [`KubeletConfiguration`](/docs/tasks/administer-cluster/kubelet-config-file/):
+
+* `shutdownGracePeriod`:
+ * Especifica a duração total pela qual o nó deve atrasar o desligamento. Este é o período de carência total para o término dos pods regulares e os [críticos](/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/#marking-pod-as-critical).
+
+* `shutdownGracePeriodCriticalPods`:
+ * Especifica a duração utlizada para encerrar [pods críticos](/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/#marking-pod-as-critical) durante um desligamento de nó. Este valor deve ser menor que `shutdownGracePeriod`.
+
+Por exemplo, se `shutdownGracePeriod=30s` e `shutdownGracePeriodCriticalPods=10s`, o kubelet atrasará o desligamento do nó em 30 segundos. Durante o desligamento, os primeiros 20 (30-10) segundos seriam reservados para encerrar gradualmente os pods normais, e os últimos 10 segundos seriam reservados para encerrar [pods críticos](/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/#marking-pod-as-critical).
+
+{{< note >}}
+Quando os pods forem removidos durante o desligamento gradual do nó, eles serão marcados como desligados. Executar o `kubectl get pods` para mostrar o status dos pods removidos como `Terminated`. E o `kubectl describe pod` indica que o pod foi removido por causa do desligamento do nó:
+
+```
+Reason: Terminated
+Message: Pod was terminated in response to imminent node shutdown.
+```
+{{< /note >}}
+
+### Desligamento gradual do nó baseado em prioridade do Pod {#pod-priority-graceful-node-shutdown}
+
+{{< feature-state state="alpha" for_k8s_version="v1.23" >}}
+
+Para fornecer mais flexibilidade durante o desligamento gradual do nó em torno da ordem de pods durante o desligamento, o desligamento gradual do nó respeita a PriorityClass dos Pods, desde que você tenha ativado esse recurso em seu cluster. O recurso permite que o cluster defina explicitamente a ordem dos pods durante o desligamento gradual do nó com base em [classes de prioridade](/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass).
+
+O recurso [Desligamento Gradual do Nó](#graceful-node-shutdown), conforme descrito acima, desliga pods em duas fases, pods não críticos, seguidos por pods críticos. Se for necessária flexibilidade adicional para definir explicitamente a ordem dos pods durante o desligamento de uma maneira mais granular, o desligamento gradual baseado na prioridade do pod pode ser usado.
+
+Quando o desligamento gradual do nó respeita as prioridades do pod, isso torna possível fazer o desligamento gradual do nó em várias fases, cada fase encerrando uma classe de prioridade específica de pods. O kubelet pode ser configurado com as fases exatas e o tempo de desligamento por fase.
+
+Assumindo as seguintes classes de prioridade de pod personalizadas em um cluster,
+
+|Nome das classes de prioridade|Valor das classes de prioridade|
+|-------------------------|------------------------|
+|`custom-class-a` | 100000 |
+|`custom-class-b` | 10000 |
+|`custom-class-c` | 1000 |
+|`regular/unset` | 0 |
+
+Na [configuração do kubelet](/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-KubeletConfiguration), as configurações para `shutdownGracePeriodByPodPriority` são semelhantes a:
+
+|Valor das classes de prioridade|Tempo de desligamento|
+|------------------------|---------------|
+| 100000 |10 segundos |
+| 10000 |180 segundos |
+| 1000 |120 segundos |
+| 0 |60 segundos |
+
+A configuração correspondente do YAML do kubelet seria:
+
+```yaml
+shutdownGracePeriodByPodPriority:
+ - priority: 100000
+ shutdownGracePeriodSeconds: 10
+ - priority: 10000
+ shutdownGracePeriodSeconds: 180
+ - priority: 1000
+ shutdownGracePeriodSeconds: 120
+ - priority: 0
+ shutdownGracePeriodSeconds: 60
+```
+
+A tabela acima implica que qualquer pod com valor `priority` >= 100000 terá apenas 10 segundos para parar qualquer pod com valor >= 10000 e < 100000 e terá 180 segundos para parar, qualquer pod com valor >= 1000 e < 10000 terá 120 segundos para parar. Finalmente, todos os outros pods terão 60 segundos para parar.
+
+Não é preciso especificar valores correspondentes para todas as classes. Por exemplo, você pode usar estas configurações:
+
+
+|Valor das classes de prioridade|Tempo de desligamento|
+|------------------------|---------------|
+| 100000 |300 segundos |
+| 1000 |120 segundos |
+| 0 |60 segundos |
+
+
+No caso acima, os pods com `custom-class-b` irão para o mesmo bucket que `custom-class-c` para desligamento.
+
+Se não houver pods em um intervalo específico, o kubelet não irá espera por pods nesse intervalo de prioridades. Em vez disso, o kubelet pula imediatamente para o próximo intervalo de valores da classe de prioridade.
+
+Se esse recurso estiver ativado e nenhuma configuração for fornecida, nenhuma ação de pedido será tomada.
+
+O uso desse recurso requer ativar os recursos `GracefulNodeShutdownBasedOnPodPriority` e definir o `ShutdownGracePeriodByPodPriority` da configuração do kubelet para a configuração desejada, contendo os valores da classe de prioridade do pod e seus respectivos períodos de desligamento.
+
+## Gerenciamento da memória swap {#swap-memory}
+
+{{< feature-state state="alpha" for_k8s_version="v1.22" >}}
+
+Antes do Kubernetes 1.22, os nós não suportavam o uso de memória swap, e um kubelet, por padrão, não iniciaria se a troca fosse detectada em um nó. A partir de 1.22, o suporte a memória swap pode ser ativado por nó.
+
+Para ativar a troca em um nó, o recursos `NodeSwap` deve estar ativado no kubelet, e a [configuração](/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-KubeletConfiguration) de comando de linha `--fail-swap-on` ou `failSwapOn` deve ser definida como falsa.
+
+{{< warning >}}
+Quando o recurso de memória swap está ativado, os dados do Kubernetes, como o conteúdo de objetos `Secret` que foram gravados no `tmpfs`, agora podem ser trocados para o disco.
+{{< /warning >}}
+
+Opcionalmente, um usuário também pode configurar `memorySwap.swapBehavior` para especificar como um nó usará memória swap. Por exemplo,
+
+```yaml
+memorySwap:
+ swapBehavior: LimitedSwap
+```
+
+As opções de configuração disponíveis para `swapBehavior` são:
+
+- `LimitedSwap`: As cargas de trabalho do Kubernetes são limitadas na quantidade de troca que podem usar. Cargas de trabalho no nó não gerenciadas pelo Kubernetes ainda podem ser trocadas.
+- `UnlimitedSwap`: As cargas de trabalho do Kubernetes podem usar tanta memória de swap quanto solicitarem, até o limite do sistema.
+
+Se a configuração do `memorySwap` não for especificada e o recurso estiver ativado, por padrão, o kubelet aplicará o mesmo comportamento que a configuração `LimitedSwap`.
+
+O comportamento da configuração `LimitedSwap` depende se o nó estiver sendo executado com v1 ou v2 de grupos de controle (também conhecidos como "cgroups"):
+
+- **cgroupsv1**: As cargas de trabalho do Kubernetes podem usar qualquer combinação de memória e swap, até o limite de memória do pod, se definido.
+- **cgroupsv2**: As cargas de trabalho do Kubernetes não podem usar memória swap.
+
+Para obter mais informações e para ajudar nos testes e fornecer feedback, consulte [KEP-2400](https://github.com/kubernetes/enhancements/issues/2400) e sua [proposta de design](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/2400-node-swap/README.md).
+
+## {{% heading "whatsnext" %}}
+
+* Saiba mais sobre [componentes](/docs/concepts/overview/components/#node-components) que compõem um nó.
+* Leia a [definição da API para um Nó](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#node-v1-core).
+* Leia a seção [Nó](https://git.k8s.io/community/contributors/design-proposals/architecture/architecture.md#the-kubernetes-node) do documento de design de arquitetura.
+* Leia sobre [taints e tolerâncias](/docs/concepts/scheduling-eviction/taint-and-toleration/).
diff --git a/content/pt-br/docs/concepts/configuration/secret.md b/content/pt-br/docs/concepts/configuration/secret.md
index 0fc63bc2e2..8b7b591ec3 100644
--- a/content/pt-br/docs/concepts/configuration/secret.md
+++ b/content/pt-br/docs/concepts/configuration/secret.md
@@ -47,16 +47,18 @@ existentes.
{{< /caution >}}
+Consulte [Segurança da informação para Secrets](#information-security-for-secrets)
+para mais detalhes.
+
-## Visão Geral de Secrets
+## Usos para Secrets
-Para utilizar um Secret, um Pod precisa referenciar o Secret.
-Um Secret pode ser utilizado em um Pod de três maneiras diferentes:
-- Como um [arquivo](#using-secrets-as-files-from-a-pod) em um
+Existem três formas principais para um Pod utilizar um Secret:
+- Como [arquivos](#using-secrets-as-files-from-a-pod) em um
{{< glossary_tooltip text="volume" term_id="volume" >}} montado em um ou mais de
seus contêineres.
-- Como uma [variável de ambiente](#using-secrets-as-environment-variables) em um
+- Como uma [variável de ambiente](#using-secrets-as-environment-variables) de um
contêiner.
- Pelo [kubelet ao baixar imagens de contêiner](#using-imagepullsecrets) para o
Pod.
@@ -65,7 +67,54 @@ A camada de gerenciamento do Kubernetes também utiliza Secrets. Por exemplo,
os [Secrets de tokens de autoinicialização](#bootstrap-token-secrets) são um
mecanismo que auxilia a automação do registro de nós.
+### Alternativas a Secrets
+
+Ao invés de utilizar um Secret para proteger dados confidenciais, você pode
+escolher uma maneira alternativa. Algumas das opções são:
+
+- se o seu componente cloud native precisa autenticar-se a outra aplicação que
+está rodando no mesmo cluster Kubernetes, você pode utilizar uma
+[ServiceAccount](/pt-br/docs/reference/access-authn-authz/authentication/#tokens-de-contas-de-serviço)
+e seus tokens para identificar seu cliente.
+- existem ferramentas fornecidas por terceiros que você pode rodar, no seu
+cluster ou externamente, que providenciam gerenciamento de Secrets. Por exemplo,
+um serviço que Pods accessam via HTTPS, que revelam um Secret se o cliente
+autenticar-se corretamente (por exemplo, utilizando um token de ServiceAccount).
+- para autenticação, você pode implementar um serviço de assinatura de
+certificados X.509 personalizado, e utilizar
+[CertificateSigningRequests](/docs/reference/access-authn-authz/certificate-signing-requests/)
+para permitir ao serviço personalizado emitir certificados a pods que os
+necessitam.
+- você pode utilizar um [plugin de dispositivo](/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/)
+para expor a um Pod específico um hardware de encriptação conectado a um nó. Por
+exemplo, você pode agendar Pods confiáveis em nós que oferecem um _Trusted
+Platform Module_, configurado em um fluxo de dados independente.
+
+Você pode também combinar duas ou mais destas opções, incluindo a opção de
+utilizar objetos do tipo Secret.
+
+Por exemplo: implemente (ou instale) um
+{{< glossary_tooltip text="operador" term_id="operator-pattern" >}}
+que solicite tokens de sessão de curta duração a um serviço externo, e crie
+Secrets baseado nestes tokens. Pods rodando no seu cluster podem fazer uso de
+tokens de sessão, e o operador garante que estes permanecem válidos. Esta
+separação significa que você pode rodar Pods que não precisam ter conhecimento
+do mecanismo exato para geração e atualização de tais tokens de sessão.
+
+## Trabalhando com Secrets
+
+### Criando um Secret
+
+Existem diversas formas de criar um Secret:
+
+- [crie um Secret utilizando o comando `kubectl`](/pt-br/docs/tasks/configmap-secret/managing-secret-using-kubectl/)
+- [crie um Secret a partir de um arquivo de configuração](/pt-br/docs/tasks/configmap-secret/managing-secret-using-config-file/)
+- [crie um Secret utilizando a ferramenta kustomize](/pt-br/docs/tasks/configmap-secret/managing-secret-using-kustomize/)
+
+#### Restrições de nomes de Secret e dados {#restriction-names-data}
+
O nome de um Secret deve ser um [subdomínio DNS válido](/pt-br/docs/concepts/overview/working-with-objects/names#dns-subdomain-names).
+
Você pode especificar o campo `data` e/ou o campo `stringData` na criação de um
arquivo de configuração de um Secret. Ambos os campos `data` e `stringData` são
opcionais. Os valores das chaves no campo `data` devem ser strings codificadas
@@ -76,394 +125,31 @@ como valores.
As chaves dos campos `data` e `stringData` devem consistir de caracteres
alfanuméricos, `-`, `_`, ou `.`. Todos os pares chave-valor no campo `stringData`
são internamente combinados com os dados do campo `data`. Se uma chave aparece
-em ambos os campos, o valor informado no campo `stringData` toma a precedência.
+em ambos os campos, o valor informado no campo `stringData` tem a precedência.
-## Tipos de Secrets {#secret-types}
+#### Limite de tamanho {#restriction-data-size}
-Ao criar um Secret, você pode especificar o seu tipo utilizando o campo `type`
-do objeto Secret, ou algumas opções de linha de comando equivalentes no comando
-`kubectl`, quando disponíveis. O campo `type` de um Secret é utilizado para
-facilitar a manipulação programática de diferentes tipos de dados confidenciais.
+Secrets individuais são limitados a 1MiB em tamanho. Esta limitação tem por
+objetivo desencorajar a criação de Secrets muito grandes que possam exaurir a
+memória do servidor da API e do kubelet. No entanto, a criação de vários Secrets
+pequenos também pode exaurir a memória. Você pode utilizar uma
+[cota de recurso](/pt-br/docs/concepts/policy/resource-quotas/) a fim de limitar
+o número de Secrets (ou outros recursos) em um namespace.
-O Kubernetes oferece vários tipos embutidos de Secret para casos de uso comuns.
-Estes tipos variam em termos de validações efetuadas e limitações que o
-Kubernetes impõe neles.
+### Editando um Secret
-| Tipo embutido | Caso de uso |
-|----------------------------------------|----------------------------------------------------|
-| `Opaque` | dados arbitrários definidos pelo usuário |
-| `kubernetes.io/service-account-token` | token de service account (conta de serviço) |
-| `kubernetes.io/dockercfg` | arquivo `~/.dockercfg` serializado |
-| `kubernetes.io/dockerconfigjson` | arquivo `~/.docker/config.json` serializado |
-| `kubernetes.io/basic-auth` | credenciais para autenticação básica (basic auth) |
-| `kubernetes.io/ssh-auth` | credenciais para autenticação SSH |
-| `kubernetes.io/tls` | dados para um cliente ou servidor TLS |
-| `bootstrap.kubernetes.io/token` | dados de token de autoinicialização |
+Você pode editar um Secret existente utilizando kubectl:
-Você pode definir e utilizar seu próprio tipo de Secret definindo o valor do
-campo `type` como uma string não-nula em um objeto Secret. Uma string em branco
-é tratada como o tipo `Opaque`. O Kubernetes não restringe nomes de tipos. No
-entanto, quando tipos embutidos são utilizados, você precisa atender a todos os
-requisitos daquele tipo.
-
-### Secrets tipo Opaque
-
-`Opaque` é o tipo predefinido de Secret quando o campo `type` não é informado
-em um arquivo de configuração. Quando um Secret é criado usando o comando
-`kubectl`, você deve usar o subcomando `generic` para indicar que um Secret é
-do tipo `Opaque`. Por exemplo, o comando a seguir cria um Secret vazio do tipo
-`Opaque`:
-```shell
-kubectl create secret generic empty-secret
-kubectl get secret empty-secret
-```
-
-O resultado será semelhante ao abaixo:
-
-```
-NAME TYPE DATA AGE
-empty-secret Opaque 0 2m6s
-```
-
-A coluna `DATA` demonstra a quantidade de dados armazenados no Secret. Neste
-caso, `0` significa que este objeto Secret está vazio.
-
-### Secrets de token de service account (conta de serviço)
-
-Secrets do tipo `kubernetes.io/service-account-token` são utilizados para
-armazenar um token que identifica uma service account (conta de serviço). Ao
-utilizar este tipo de Secret, você deve garantir que a anotação
-`kubernetes.io/service-account.name` contém um nome de uma service account
-existente. Um controlador do Kubernetes preenche outros campos, como por exemplo
-a anotação `kubernetes.io/service-account.uid` e a chave `token` no campo `data`
-com o conteúdo do token.
-
-O exemplo de configuração abaixo declara um Secret de token de service account:
-
-```yaml
-apiVersion: v1
-kind: Secret
-metadata:
- name: secret-sa-sample
- annotations:
- kubernetes.io/service-account-name: "sa-name"
-type: kubernetes.io/service-account-token
-data:
- # Você pode incluir pares chave-valor adicionais, da mesma forma que faria com
- # Secrets do tipo Opaque
- extra: YmFyCg==
-```
-
-Ao criar um {{< glossary_tooltip text="Pod" term_id="pod" >}}, o Kubernetes
-automaticamente cria um Secret de service account e automaticamente atualiza o
-seu Pod para utilizar este Secret. O Secret de token de service account contém
-credenciais para acessar a API.
-
-A criação automática e o uso de credenciais de API podem ser desativados se
-desejado. Porém, se tudo que você necessita é poder acessar o servidor da API
-de forma segura, este é o processo recomendado.
-
-Veja a documentação de
-[ServiceAccount](/docs/tasks/configure-pod-container/configure-service-account/)
-para mais informações sobre o funcionamento de service accounts. Você pode
-verificar também os campos `automountServiceAccountToken` e `serviceAccountName`
-do [`Pod`](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#pod-v1-core)
-para mais informações sobre como referenciar service accounts em Pods.
-
-### Secrets de configuração do Docker
-
-Você pode utilizar um dos tipos abaixo para criar um Secret que armazena
-credenciais para accesso a um registro de contêineres compatível com Docker
-para busca de imagens:
-- `kubernetes.io/dockercfg`
-- `kubernetes.io/dockerconfigjson`
-
-O tipo `kubernetes.io/dockercfg` é reservado para armazenamento de um arquivo
-`~/.dockercfg` serializado. Este arquivo é o formato legado para configuração
-do utilitário de linha de comando do Docker. Ao utilizar este tipo de Secret,
-é preciso garantir que o campo `data` contém uma chave `.dockercfg` cujo valor
-é o conteúdo do arquivo `~/.dockercfg` codificado no formato base64.
-
-O tipo `kubernetes.io/dockerconfigjson` foi projetado para armazenamento de um
-conteúdo JSON serializado que obedece às mesmas regras de formato que o arquivo
-`~/.docker/config.json`. Este arquivo é um formato mais moderno para o conteúdo
-do arquivo `~/.dockercfg`. Ao utilizar este tipo de Secret, o conteúdo do campo
-`data` deve conter uma chave `.dockerconfigjson` em que o conteúdo do arquivo
-`~/.docker/config.json` é fornecido codificado no formato base64.
-
-Um exemplo de um Secret do tipo `kubernetes.io/dockercfg`:
-```yaml
-apiVersion: v1
-kind: Secret
-metadata:
- name: secret-dockercfg
-type: kubernetes.io/dockercfg
-data:
- .dockercfg: |
- ""
-```
-
-{{< note >}}
-Se você não desejar fazer a codificação em formato base64, você pode utilizar o
-campo `stringData` como alternativa.
-{{< /note >}}
-
-Ao criar estes tipos de Secret utilizando um manifesto (arquivo YAML), o servidor
-da API verifica se a chave esperada existe no campo `data` e se o valor fornecido
-pode ser interpretado como um conteúdo JSON válido. O servidor da API não verifica
-se o conteúdo informado é realmente um arquivo de configuração do Docker.
-
-Quando você não tem um arquivo de configuração do Docker, ou quer utilizar o
-comando `kubectl` para criar um Secret de registro de contêineres compatível
-com o Docker, você pode executar:
-```shell
-kubectl create secret docker-registry secret-tiger-docker \
- --docker-username=tiger \
- --docker-password=pass113 \
- --docker-email=tiger@acme.com \
- --docker-server=my-registry.example:5000
-```
-
-Esse comando cria um secret do tipo `kubernetes.io/dockerconfigjson`, cujo
-conteúdo é semelhante ao exemplo abaixo:
-
-```json
-{
- "apiVersion": "v1",
- "data": {
- ".dockerconfigjson": "eyJhdXRocyI6eyJteS1yZWdpc3RyeTo1MDAwIjp7InVzZXJuYW1lIjoidGlnZXIiLCJwYXNzd29yZCI6InBhc3MxMTMiLCJlbWFpbCI6InRpZ2VyQGFjbWUuY29tIiwiYXV0aCI6ImRHbG5aWEk2Y0dGemN6RXhNdz09In19fQ=="
- },
- "kind": "Secret",
- "metadata": {
- "creationTimestamp": "2021-07-01T07:30:59Z",
- "name": "secret-tiger-docker",
- "namespace": "default",
- "resourceVersion": "566718",
- "uid": "e15c1d7b-9071-4100-8681-f3a7a2ce89ca"
- },
- "type": "kubernetes.io/dockerconfigjson"
-}
-```
-
-Se você extrair o conteúdo da chave `.dockerconfigjson`, presente no campo
-`data`, e decodificá-lo do formato base64, você irá obter o objeto JSON abaixo,
-que é uma configuração válida do Docker criada automaticamente:
-
-```json
-{
- "auths":{
- "my-registry:5000":{
- "username":"tiger",
- "password":"pass113",
- "email":"tiger@acme.com",
- "auth":"dGlnZXI6cGFzczExMw=="
- }
- }
-}
-```
-
-### Secret de autenticação básica
-
-O tipo `kubernetes.io/basic-auth` é fornecido para armazenar credenciais
-necessárias para autenticação básica. Ao utilizar este tipo de Secret, o campo
-`data` do Secret deve conter as duas chaves abaixo:
-- `username`: o usuário utilizado para autenticação;
-- `password`: a senha ou token para autenticação.
-
-Ambos os valores para estas duas chaves são textos codificados em formato base64.
-Você pode fornecer os valores como texto simples utilizando o campo `stringData`
-na criação do Secret.
-
-O arquivo YAML abaixo é um exemplo de configuração para um Secret de autenticação
-básica:
-```yaml
-apiVersion: v1
-kind: Secret
-metadata:
- name: secret-basic-auth
-type: kubernetes.io/basic-auth
-stringData:
- username: admin
- password: t0p-Secret
-```
-
-O tipo de autenticação básica é fornecido unicamente por conveniência. Você pode
-criar um Secret do tipo `Opaque` utilizado para autenticação básica. No entanto,
-utilizar o tipo embutido de Secret auxilia a unificação dos formatos das suas
-credenciais. O tipo embutido também fornece verificação de presença das chaves
-requeridas pelo servidor da API.
-
-### Secret de autenticação SSH
-
-O tipo embutido `kubernetes.io/ssh-auth` é fornecido para armazenamento de dados
-utilizados em autenticação SSH. Ao utilizar este tipo de Secret, você deve
-especificar um par de chave-valor `ssh-privatekey` no campo `data` ou no campo
-`stringData` com a credencial SSH a ser utilizada.
-
-O YAML abaixo é um exemplo de configuração para um Secret de autenticação SSH:
-
-```yaml
-apiVersion: v1
-kind: Secret
-metadata:
- name: secret-ssh-auth
-type: kubernetes.io/ssh-auth
-data:
- # os dados estão abreviados neste exemplo
- ssh-privatekey: |
- MIIEpQIBAAKCAQEAulqb/Y ...
-```
-
-O Secret de autenticação SSH é fornecido apenas para a conveniência do usuário.
-Você pode criar um Secret do tipo `Opaque` para credentials utilizadas para
-autenticação SSH. No entanto, a utilização do tipo embutido auxilia na
-unificação dos formatos das suas credenciais e o servidor da API fornece
-verificação dos campos requeridos em uma configuração de Secret.
-
-{{< caution >}}
-Chaves privadas SSH não estabelecem, por si só, uma comunicação confiável
-entre um cliente SSH e um servidor. Uma forma secundária de estabelecer
-confiança é necessária para mitigar ataques "machine-in-the-middle", como
-por exemplo um arquivo `known_hosts` adicionado a um ConfigMap.
-{{< /caution >}}
-
-### Secrets TLS
-
-O Kubernetes fornece o tipo embutido de Secret `kubernetes.io/tls` para
-armazenamento de um certificado e sua chave associada que são tipicamente
-utilizados para TLS. Estes dados são utilizados primariamente para a
-finalização TLS do recurso Ingress, mas podem ser utilizados com outros
-recursos ou diretamente por uma carga de trabalho. Ao utilizar este tipo de
-Secret, as chaves `tls.key` e `tls.crt` devem ser informadas no campo `data`
-(ou `stringData`) da configuração do Secret, embora o servidor da API não
-valide o conteúdo de cada uma destas chaves.
-
-O YAML a seguir tem um exemplo de configuração para um Secret TLS:
-```yaml
-apiVersion: v1
-kind: Secret
-metadata:
- name: secret-tls
-type: kubernetes.io/tls
-data:
- # os dados estão abreviados neste exemplo
- tls.crt: |
- MIIC2DCCAcCgAwIBAgIBATANBgkqh ...
- tls.key: |
- MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...
-```
-
-O tipo TLS é fornecido para a conveniência do usuário. Você pode criar um
-Secret do tipo `Opaque` para credenciais utilizadas para o servidor e/ou
-cliente TLS. No entanto, a utilização do tipo embutido auxilia a manter a
-consistência dos formatos de Secret no seu projeto; o servidor da API
-valida se os campos requeridos estão presentes na configuração do Secret.
-
-Ao criar um Secret TLS utilizando a ferramenta de linha de comando `kubectl`,
-você pode utilizar o subcomando `tls` conforme demonstrado no exemplo abaixo:
-```shell
-kubectl create secret tls my-tls-secret \
- --cert=path/to/cert/file \
- --key=path/to/key/file
-```
-
-O par de chaves pública/privada deve ser criado separadamente. O certificado
-de chave pública a ser utilizado no argumento `--cert` deve ser codificado em
-formato .PEM (formato DER codificado em texto base64) e deve corresponder à
-chave privada fornecida no argumento `--key`.
-A chave privada deve estar no formato de chave privada PEM não-encriptado. Em
-ambos os casos, as linhas inicial e final do formato PEM (por exemplo,
-`--------BEGIN CERTIFICATE-----` e `-------END CERTIFICATE----` para um
-certificado) *não* são incluídas.
-
-### Secret de token de autoinicialização {#bootstrap-token-secrets}
-
-Um Secret de token de autoinicialização pode ser criado especificando o tipo de
-um Secret explicitamente com o valor `bootstrap.kubernetes.io/token`. Este tipo
-de Secret é projetado para tokens utilizados durante o processo de inicialização
-de nós. Este tipo de Secret armazena tokens utilizados para assinar ConfigMaps
-conhecidos.
-
-Um Secret de token de autoinicialização é normalmente criado no namespace
-`kube-system` e nomeado na forma `bootstrap-token-`, onde
-`` é um texto com 6 caracteres contendo a identificação do token.
-
-No formato de manifesto do Kubernetes, um Secret de token de autoinicialização
-se assemelha ao exemplo abaixo:
-```yaml
-apiVersion: v1
-kind: Secret
-metadata:
- name: bootstrap-token-5emitj
- namespace: kube-system
-type: bootstrap.kubernetes.io/token
-data:
- auth-extra-groups: c3lzdGVtOmJvb3RzdHJhcHBlcnM6a3ViZWFkbTpkZWZhdWx0LW5vZGUtdG9rZW4=
- expiration: MjAyMC0wOS0xM1QwNDozOToxMFo=
- token-id: NWVtaXRq
- token-secret: a3E0Z2lodnN6emduMXAwcg==
- usage-bootstrap-authentication: dHJ1ZQ==
- usage-bootstrap-signing: dHJ1ZQ==
-```
-
-Um Secret do tipo token de autoinicialização possui as seguintes chaves no campo
-`data`:
-- `token-id`: Uma string com 6 caracteres aleatórios como identificador do
- token. Requerido.
-- `token-secret`: Uma string de 16 caracteres aleatórios como o conteúdo do
- token. Requerido.
-- `description`: Uma string contendo uma descrição do propósito para o qual este
- token é utilizado. Opcional.
-- `expiration`: Um horário absoluto UTC no formato RFC3339 especificando quando
- o token deve expirar. Opcional.
-- `usage-bootstrap-`: Um conjunto de flags booleanas indicando outros
- usos para este token de autoinicialização.
-- `auth-extra-groups`: Uma lista separada por vírgulas de nomes de grupos que
- serão autenticados adicionalmente, além do grupo `system:bootstrappers`.
-
-O YAML acima pode parecer confuso, já que os valores estão todos codificados em
-formato base64. Você pode criar o mesmo Secret utilizando este YAML:
-```yaml
-apiVersion: v1
-kind: Secret
-metadata:
- # Observe como o Secret é nomeado
- name: bootstrap-token-5emitj
- # Um Secret de token de inicialização geralmente fica armazenado no namespace
- # 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"
- # Esta identificação de token é utilizada no nome
- token-id: "5emitj"
- token-secret: "kq4gihvszzgn1p0r"
- # Este token pode ser utilizado para autenticação.
- usage-bootstrap-authentication: "true"
- # e pode ser utilizado para assinaturas
- usage-bootstrap-signing: "true"
-```
-
-## Criando um Secret
-
-Há várias formas diferentes de criar um Secret:
-- [criar um Secret utilizando o comando `kubectl`](/pt-br/docs/tasks/configmap-secret/managing-secret-using-kubectl/)
-- [criar um Secret a partir de um arquivo de configuração](/pt-br/docs/tasks/configmap-secret/managing-secret-using-config-file/)
-- [criar um Secret utilizando a ferramenta kustomize](/pt-br/docs/tasks/configmap-secret/managing-secret-using-kustomize/)
-
-## Editando um Secret
-
-Um Secret existente no cluster pode ser editado com o seguinte comando:
```shell
kubectl edit secrets mysecret
```
-Este comando abrirá o editor padrão configurado e permitirá a modificação dos
-valores codificados em base64 no campo `data`:
+Este comando abre o seu editor padrão configurado e permite a modificação dos
+valores do Secret codificados em base64 no campo `data`. Por exemplo:
+
```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
+# and an empty file will abort the edit. If an error occurs while saving this file, it will be
# reopened with the relevant failures.
#
apiVersion: v1
@@ -482,7 +168,16 @@ metadata:
type: Opaque
```
-## Utilizando Secrets
+Este manifesto de exemplo define um Secret com duas chaves no campo `data`:
+`username` and `password`.
+Os valores são strings codificadas em formato base64. No entanto, quando um
+Secret é utilizado em um Pod, o kubelet fornece os dados _decodificados_ ao Pod
+e seus contêineres.
+
+Você pode especificar muitas chaves e valores em um Secret só, ou utilizar
+muitos Secrets. Escolha a opção que for mais conveniente para o caso de uso.
+
+### Utilizando Secrets
Secrets podem ser montados como volumes de dados ou expostos como
{{< glossary_tooltip text="variáveis de ambiente" term_id="container-env-variables" >}}
@@ -491,9 +186,36 @@ utilizados por outras partes do sistema, sem serem diretamente expostos ao Pod.
Por exemplo, Secrets podem conter credenciais que outras partes do sistema devem
utilizar para interagir com sistemas externos no lugar do usuário.
+Secrets montados como volumes são verificados para garantir que o nome
+referenciado realmente é um objeto do tipo Secret. Portanto, um Secret deve ser
+criado antes de quaisquer Pods que dependem deste Secret.
+
+Se um Secret não puder ser encontrado (porque não existe, ou devido a um problema
+de conectividade com o servidor da API) o kubelet tenta periodicamente reiniciar
+aquele Pod. O kubelet também relata um evento para aquele Pod, incluindo detalhes
+do problema ao buscar o Secret.
+
+#### Secrets Opcionais {#restriction-secret-must-exist}
+
+Quando você define uma variável de ambiente em um contêiner baseada em um Secret,
+você pode especificar que o Secret em questão será _opcional_. O padrão é o
+Secret ser requerido.
+
+Nenhum dos contêineres de um Pod irão inicializar até que todos os Secrets
+requeridos estejam disponíveis.
+
+Se um Pod referencia uma chave específica em um Secret e o Secret existe, mas
+não possui a chave com o nome referenciado, o Pod falha durante a inicialização.
+
### Utilizando Secrets como arquivos em um Pod {#using-secrets-as-files-from-a-pod}
-Para consumir um Secret em um volume em um Pod:
+Se você deseja acessar dados de um Secret em um Pod, uma das formas de consumir
+esta informação é fazer com que o Kubernetes deixe o valor daquele Secret
+disponível como um arquivo dentro do sistema de arquivos de um ou mais dos
+contêineres daquele Pod.
+
+Para configurar isso:
+
1. Crie um Secret ou utilize um previamente existente. Múltiplos Pods podem
referenciar o mesmo secret.
1. Modifique sua definição de Pod para adicionar um volume na lista
@@ -509,7 +231,7 @@ diretório não utilizado onde você deseja que os Secrets apareçam.
arquivos naquele diretório. Cada chave no campo `data` se torna um nome de
arquivo no diretório especificado em `mountPath`.
-Este é um exemplo de Pod que monta um Secret em um volume:
+Este é um exemplo de Pod que monta um Secret de nome `mysecret` em um volume:
```yaml
apiVersion: v1
kind: Pod
@@ -526,20 +248,38 @@ spec:
volumes:
- name: foo
secret:
- secretName: mysecret
+ secretName: mysecret # configuração padrão; "mysecret" precisa existir
```
Cada Secret que você deseja utilizar deve ser referenciado na lista
`.spec.volumes`.
-Se existirem múltiplos contêineres em um Pod, cada um dos contêineres necessitará
-seu próprio bloco `volumeMounts`, mas somente um volume na lista `.spec.volumes`
-é necessário por Secret.
+Se existirem múltiplos contêineres em um Pod, cada um dos contêineres
+necessitará seu próprio bloco `volumeMounts`, mas somente um volume na lista
+`.spec.volumes` é necessário por Secret.
-Você pode armazenar vários arquivos em um Secret ou utilizar vários Secrets
-distintos, o que for mais conveniente.
+{{< note >}}
+Versões do Kubernetes anteriores a v1.22 criavam automaticamente credenciais
+para acesso à API do Kubernetes. Este mecanismo antigo era baseado na criação de
+Secrets com tokens que podiam então ser montados em Pods em execução.
+Em versões mais recentes, incluindo o Kubernetes v{{< skew currentVersion >}},
+credenciais para acesso à API são obtidas diretamente através da API
+[TokenRequest](/docs/reference/kubernetes-api/authentication-resources/token-request-v1/)
+e são montadas em Pods utilizando um
+[volume projetado](/docs/reference/access-authn-authz/service-accounts-admin/#bound-service-account-token-volume).
+Os tokens obtidos através deste método possuem tempo de vida limitado e são
+automaticamente invalidados quando o Pod em que estão montados é removido.
-#### Projeção de chaves de Secrets a caminhos específicos
+Você ainda pode
+[criar manualmente](/docs/tasks/configure-pod-container/configure-service-account/#manually-create-a-service-account-api-token)
+um Secret de token de service account se você precisa de um token que não expire,
+por exemplo. No entanto, o uso do subrecurso
+[TokenRequest](/docs/reference/kubernetes-api/authentication-resources/token-request-v1/)
+é recomendado para obtenção de um token para acesso à API ao invés do uso de
+Secrets de token de service account.
+{{< /note >}}
+
+#### Projeção de chaves de Secrets em caminhos específicos
Você pode também controlar os caminhos dentro do volume onde as chaves do Secret
são projetadas. Você pode utilizar o campo `.spec.volumes[].secret.items` para
@@ -568,18 +308,21 @@ spec:
```
Neste caso:
+
* O valor da chave `username` é armazenado no arquivo
-`/etc/foo/my-group/my-username` ao invés de `/etc/foo/username`.
+ `/etc/foo/my-group/my-username` ao invés de `/etc/foo/username`.
* O valor da chave `password` não é projetado no sistema de arquivos.
Se `.spec.volumes[].secret.items` for utilizado, somente chaves especificadas
na lista `items` são projetadas. Para consumir todas as chaves do Secret, deve
-haver um item para cada chave no campo `items`. Todas as chaves listadas precisam
+haver um item para cada chave no campo `items`.
+
+Se você listar as chaves explicitamente, então todas as chaves listadas precisam
existir no Secret correspondente. Caso contrário, o volume não é criado.
#### Permissões de arquivos de Secret
-Você pode trocar os bits de permissão de uma chave avulsa de Secret.
+Você pode trocar os bits de permissão POSIX de uma chave avulsa de Secret.
Se nenhuma permissão for especificada, `0644` é utilizado por padrão.
Você pode também especificar uma permissão padrão para o volume inteiro de
Secret e sobrescrever esta permissão por chave, se necessário.
@@ -607,86 +350,30 @@ spec:
Dessa forma, o Secret será montado em `/etc/foo` e todos os arquivos criados
no volume terão a permissão `0400`.
-Note que a especificação JSON não suporta notação octal. Neste caso, utilize o
-valor 256 para permissões equivalentes a 0400. Se você utilizar YAML ao invés
-de JSON para o Pod, você pode utilizar notação octal para especificar permissões
-de uma forma mais natural.
-
-Perceba que se você acessar o Pod com `kubectl exec`, você precisará seguir o
-vínculo simbólico para encontrar a permissão esperada. Por exemplo,
-
-Verifique as permissões do arquivo de Secret no pod.
-```
-kubectl exec mypod -it sh
-
-cd /etc/foo
-ls -l
-```
-
-O resultado é semelhante ao abaixo:
-```
-total 0
-lrwxrwxrwx 1 root root 15 May 18 00:18 password -> ..data/password
-lrwxrwxrwx 1 root root 15 May 18 00:18 username -> ..data/username
-```
-
-Siga o vínculo simbólico para encontrar a permissão correta do arquivo.
-```
-cd /etc/foo/..data
-ls -l
-```
-
-O resultado é semelhante ao abaixo:
-```
-total 8
--r-------- 1 root root 12 May 18 00:18 password
--r-------- 1 root root 5 May 18 00:18 username
-```
-
-Você pode também utilizar mapeamento, como no exemplo anterior, e especificar
-permissões diferentes para arquivos diferentes conforme abaixo:
-```yaml
-apiVersion: v1
-kind: Pod
-metadata:
- name: mypod
-spec:
- containers:
- - name: mypod
- image: redis
- volumeMounts:
- - name: foo
- mountPath: "/etc/foo"
- volumes:
- - name: foo
- secret:
- secretName: mysecret
- items:
- - key: username
- path: my-group/my-username
- mode: 0777
-```
-
-Neste caso, o arquivo resultante em `/etc/foo/my-group/my-username` terá as
-permissões `0777`. Se você utilizar JSON, devido às limitações do formato,
-você precisará informar as permissões em base decimal, ou o valor `511` neste
-exemplo.
-
-Note que os valores de permissões podem ser exibidos em formato decimal se você
-ler essa informação posteriormente.
+{{< note >}}
+Se você estiver definindo um Pod ou um template de Pod utilizando JSON, observe
+que a especificação JSON não suporta a notação octal. Você pode utilizar o valor
+decimal para o campo `defaultMode` (por exemplo, 0400 em base octal equivale a
+256 na base decimal).
+Se você estiver escrevendo YAML, você pode escrever o valor para `defaultMode`
+em octal.
+{{< /note >}}
#### Consumindo valores de Secrets em volumes
Dentro do contêiner que monta um volume de Secret, as chaves deste Secret
aparecem como arquivos e os valores dos Secrets são decodificados do formato
-base64 e armazenados dentro destes arquivos. Ao executar comandos dentro do
-contêiner do exemplo anterior, obteremos os seguintes resultados:
+base64 e armazenados dentro destes arquivos.
+
+Ao executar comandos dentro do contêiner do exemplo anterior, obteremos os
+seguintes resultados:
```shell
ls /etc/foo
```
O resultado é semelhante a:
+
```
username
password
@@ -697,6 +384,7 @@ cat /etc/foo/username
```
O resultado é semelhante a:
+
```
admin
```
@@ -706,6 +394,7 @@ cat /etc/foo/password
```
O resultado é semelhante a:
+
```
1f2d1e2e67df
```
@@ -715,46 +404,52 @@ dentro dos arquivos.
#### Secrets montados são atualizados automaticamente
-Quando um Secret que está sendo consumido a partir de um volume é atualizado, as
-chaves projetadas são atualizadas após algum tempo também. O kubelet verifica
-se o Secret montado está atualizado a cada sincronização periódica. No entanto,
-o kubelet utiliza seu cache local para buscar o valor corrente de um Secret. O
-tipo do cache é configurável utilizando o campo `ConfigMapAndSecretChangeDetectionStrategy`
-na estrutura [KubeletConfiguration](/docs/reference/config-api/kubelet-config.v1beta1/).
-Um Secret pode ser propagado através de um _watch_ (comportamento padrão), que
-é o sistema de propagação de mudanças incrementais em objetos do Kubernetes;
-baseado em TTL (_time to live_, ou tempo de expiração); ou redirecionando todas
-as requisições diretamente para o servidor da API.
-
-Como resultado, o tempo decorrido total entre o momento em que o Secret foi
-atualizado até o momento em que as novas chaves são projetadas nos Pods pode
-ser tão longo quanto o tempo de sincronização do kubelet somado ao tempo de
-propagação do cache, onde o tempo de propagação do cache depende do tipo de
-cache escolhido: o tempo de propagação pode ser igual ao tempo de propagação
-do _watch_, TTL do cache, ou zero, de acordo com cada um dos tipos de cache.
+Quando um volume contém dados de um Secret, e o Secret referenciado é atualizado,
+o Kubernetes rastreia a atualização e atualiza os dados no volume, utilizando
+uma abordagem de consistência eventual.
{{< note >}}
-Um contêiner que utiliza Secrets através de um ponto de montagem com a
-propriedade
-[subPath](/docs/concepts/storage/volumes#using-subpath) não recebe atualizações
-deste Secret.
+Um contêiner que utiliza Secrets através de um volume montado com a propriedade
+[`subPath`](/docs/concepts/storage/volumes#using-subpath) não recebe
+atualizações automatizadas para este Secret.
{{< /note >}}
+O kubelet mantém um cache das chaves e valores atuais dos Secrets que são
+utilizados em volumes de Pods daquele nó. Você pode configurar a forma que o
+kubelet detecta diferenças dos valores armazenados em cache. O campo
+`configMapAndSecretDetectionStrategy` na
+[configuração do kubelet](/docs/reference/config-api/kubelet-config.v1beta1/)
+controla qual estratégia o kubelet usa. A estratégia padrão é `Watch`.
+
+Atualizações em Secrets podem ser propagadas por um mecanismo de observação da
+API (estratégia padrão), baseado em cache com um tempo de expiração definido
+(_time-to-live_), ou solicitado diretamente ao servidor da API do cluster a cada
+iteração do ciclo de sincronização do kubelet.
+
+Como resultado, o atraso total entre o momento em que o Secret foi atualizado
+até o momento em que as novas chaves são projetadas no Pod pode ser tão longo
+quanto a soma do tempo de sincronização do kubelet somado ao tempo de atraso de
+propagação do cache, onde o atraso de propagação do cache depende do tipo de
+cache escolhido. Seguindo a mesma ordem listada no parágrafo anterior, estes
+valores são: atraso de propagação via _watch_, tempo de expiração configurado no
+cache (_time-to-live_, ou TTL), ou zero para solicitação direta ao servidor da
+API.
+
### Utilizando Secrets como variáveis de ambiente {#using-secrets-as-environment-variables}
Para utilizar um secret em uma {{< glossary_tooltip text="variável de ambiente" term_id="container-env-variables" >}}
em um Pod:
1. Crie um Secret ou utilize um já existente. Múltiplos Pods podem referenciar o
-mesmo Secret.
+ mesmo Secret.
1. Modifique a definição de cada contêiner do Pod em que desejar consumir o
-Secret, adicionando uma variável de ambiente para cada uma das chaves que deseja
-consumir.
-A variável de ambiente que consumir o valor da chave em questão deverá popular o
-nome do Secret e a sua chave correspondente no campo
-`env[].valueFrom.secretKeyRef`.
+ Secret, adicionando uma variável de ambiente para cada uma das chaves que
+ deseja consumir.
+ A variável de ambiente que consumir o valor da chave em questão deverá
+ popular o nome do Secret e a sua chave correspondente no campo
+ `env[].valueFrom.secretKeyRef`.
1. Modifique sua imagem de contêiner ou linha de comando de forma que o programa
-busque os valores nas variáveis de ambiente especificadas.
+ busque os valores nas variáveis de ambiente especificadas.
Este é um exemplo de um Pod que utiliza Secrets em variáveis de ambiente:
```yaml
@@ -772,18 +467,45 @@ spec:
secretKeyRef:
name: mysecret
key: username
+ optional: false # valor padrão; "mysecret" deve existir
+ # e incluir uma chave com o nome "username"
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
+ optional: false # valor padrão; "mysecret" deve existir
+ # e incluir uma chave com o nome "password"
restartPolicy: Never
```
+#### Variáveis de ambiente inválidas {#restriction-env-from-invalid}
+
+Secrets utilizados para popular variáveis de ambiente através do campo `envFrom`
+que possuem chaves consideradas inválidas para nomes de variáveis de ambiente
+têm tais chaves ignoradas. O Pod irá iniciar normalmente.
+
+Se você definir um Pod contendo um nome de variável de ambiente inválido, os
+eventos de inicialização do Pod incluirão um evento com a razão
+`InvalidVariableNames` e uma mensagem que lista as chaves inválidas ignoradas.
+O exemplo abaixo demonstra um Pod que referencia um Secret chamado `mysecret`,
+onde `mysecret` contém duas chaves inválidas: `1badkey` and `2alsobad`.
+
+```shell
+kubectl get events
+```
+
+O resultado é semelhante a:
+
+```
+LASTSEEN FIRSTSEEN COUNT NAME KIND SUBOBJECT TYPE REASON
+0s 0s 1 dapi-test-pod Pod Warning InvalidEnvironmentVariableNames kubelet, 127.0.0.1 Keys [1badkey, 2alsobad] from the EnvFrom secret default/mysecret were skipped since they are considered invalid environment variable names.
+```
+
#### Consumindo valores de Secret em variáveis de ambiente
-Dentro de um contêiner que consome um Secret em variáveis de ambiente, a chave
-do Secret aparece como uma variável de ambiente comum, contendo os dados do
+Dentro de um contêiner que consome um Secret em variáveis de ambiente, as chaves
+do Secret aparecem como variáveis de ambiente comuns, contendo os dados do
Secret decodificados do formato base64. Ao executar comandos no contêiner do
exemplo anterior, obteremos os resultados abaixo:
@@ -807,67 +529,46 @@ O resultado é semelhante a:
1f2d1e2e67df
```
-#### Variáveis de ambiente não são atualizadas após uma atualização no Secret
-
-Se um contêiner já consome um Secret em uma variável de ambiente, uma atualização
-dos valores do Secret não será refletida no contêiner a menos que o contêiner
-seja reiniciado.
-Existem ferramentas de terceiros que oferecem reinicializações automáticas
-quando Secrets são atualizados.
-
-## Secrets imutáveis {#secret-immutable}
-
-{{< feature-state for_k8s_version="v1.21" state="stable" >}}
-
-A funcionalidade do Kubernetes _Secrets e ConfigMaps imutáveis_ fornece uma
-opção para marcar Secrets e ConfigMaps individuais como imutáveis. Em clusters
-que fazem uso extensivo de Secrets (pelo menos dezenas de milhares de montagens
-únicas de Secrets em Pods), prevenir alterações aos dados dos Secrets traz as
-seguintes vantagens:
-- protege você de alterações acidentais ou indesejadas que poderiam provocar
-disrupções na execução de aplicações;
-- melhora a performance do seu cluster através da redução significativa de carga
-no kube-apiserver, devido ao fechamento de _watches_ de Secrets marcados como
-imutáveis.
-
-Esta funcionalidade é controlada pelo
-[feature gate](/docs/reference/command-line-tools-reference/feature-gates/)
-`ImmutableEphemeralVolumes`, que está habilitado por padrão desde a versão
-v1.19. Você pode criar um Secret imutável adicionando o campo `immutable` com
-o valor `true`. Por exemplo:
-```yaml
-apiVersion: v1
-kind: Secret
-metadata:
- ...
-data:
- ...
-immutable: true
-```
-
{{< note >}}
-Uma vez que um Secret ou ConfigMap seja marcado como imutável, _não_ é mais
-possível reverter esta mudança, nem alterar os conteúdos do campo `data`. Você
-pode somente apagar e recriar o Secret. Pods existentes mantém um ponto de
-montagem referenciando o Secret removido - é recomendado recriar tais Pods.
+Se um contêiner já consome um Secret em uma variável de ambiente, uma
+atualização do Secret não será detectada pelo contêiner a menos que este seja
+reiniciado. Há soluções de terceiros que fornecem a funcionalidade de
+reinicialização automática de Pods quando o valor dos Secrets mudam.
{{< /note >}}
-### Usando `imagePullSecrets` {#using-imagepullsecrets}
+### Secrets para obtenção de imagens de contêiner {#using-imagepullsecrets}
-O campo `imagePullSecrets` é uma lista de referências para Secrets no mesmo
-namespace. Você pode utilizar a lista `imagePullSecrets` para enviar Secrets
-que contém uma senha para acesso a um registro de contêineres do Docker (ou
-outros registros de contêineres) ao kubelet. O kubelet utiliza essa informação
-para baixar uma imagem privada no lugar do seu Pod.
-Veja a [API PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core)
+Se você deseja obter imagens de contêiner de um repositório privado, você
+precisa fornecer ao kubelet uma maneira de se autenticar a este repositório.
+Você pode configurar o campo `imagePullSecrets` para esta finalidade. Estes
+Secrets são configurados a nível de Pod.
+
+O campo `imagePullSecrets` de um Pod é uma lista de referências a Secrets
+no mesmo namespace que o Pod.
+Você pode utilizar `imagePullSecrets` para enviar credenciais para acesso a um
+registro de contêineres ao kubelet. O kubelet utiliza essa informação para
+baixar uma imagem privada no lugar do seu Pod.
+Veja o campo `PodSpec` na
+[referência da API de Pods](/docs/reference/kubernetes-api/workload-resources/pod-v1/#PodSpec)
para maiores detalhes sobre o campo `imagePullSecrets`.
-#### Especificando `imagePullSecrets` manualmente
+#### Usando `imagePullSecrets`
+
+O campo `imagePullSecrets` é uma lista de referências a Secrets no mesmo
+namespace.
+Você pode utilizar o campo `imagePullSecrets` para enviar um Secret que contém
+uma senha para um registro de imagens de contêiner do Docker (ou outro registro
+de imagens de contêiner). O kubelet utiliza essa informação para baixar uma
+imagem privada no lugar do seu Pod.
+Veja a [API `PodSpec`](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core)
+para mais informações sobre o campo `imagePullSecrets`.
+
+##### Especificando `imagePullSecrets` manualmente
Você pode ler sobre como especificar `imagePullSecrets` em um Pod na
[documentação de imagens de contêiner](/pt-br/docs/concepts/containers/images/#especificando-imagepullsecrets-em-um-pod).
-### Configurando `imagePullSecrets` para serem vinculados automaticamente
+##### Configurando `imagePullSecrets` para serem adicionados automaticamente
Você pode criar manualmente `imagePullSecrets` e referenciá-los em uma
ServiceAccount. Quaisquer Pods criados com esta ServiceAccount, especificada
@@ -876,68 +577,10 @@ mesmos valores existentes na service account.
Veja [adicionando `imagePullSecrets` a uma service account](/docs/tasks/configure-pod-container/configure-service-account/#add-imagepullsecrets-to-a-service-account)
para uma explicação detalhada do processo.
-## Detalhes
+### Utilizando Secrets com pods estáticos {#restriction-static-pod}
-### Restrições
-
-Referências a Secrets em volumes são validadas para garantir que o objeto
-especificado realmente existe e é um objeto do tipo Secret. Portanto, um Secret
-precisa ser criado antes de quaisquer Pods que dependam deste.
-
-Objetos Secret residem em um {{< glossary_tooltip text="namespace" term_id="namespace" >}}.
-Secrets podem ser referenciados somente por Pods no mesmo namespace.
-
-Secrets individuais são limitados ao tamanho de 1MiB. Esta limitação ter por
-objetivo desencorajar a criação de Secrets muito grandes que poderiam exaurir
-a memória do servidor da API e do kubelet. No entanto, a criação de muitos
-Secrets pequenos também pode exaurir a memória. Limites mais completos de uso
-de memória em função de Secrets é uma funcionalidade prevista para o futuro.
-
-O kubelet suporta apenas o uso de Secrets em Pods onde os Secrets são obtidos
-do servidor da API. Isso inclui quaisquer Pods criados usando o comando
-`kubectl`, ou indiretamente através de um controlador de replicação, mas não
-inclui Pods criados como resultado das flags `--manifest-url` e `--config` do
-kubelet, ou a sua API REST (estas são formas incomuns de criar um Pod).
-A `spec` de um {{< glossary_tooltip text="Pod estático" term_id="static-pod" >}}
-não pode se referir a um Secret ou a qualquer outro objeto da API.
-
-Secrets precisam ser criados antes de serem consumidos em Pods como variáveis de
-ambiente, exceto quando são marcados como opcionais. Referências a Secrets que
-não existem provocam falhas na inicialização do Pod.
-
-Referências (campo `secretKeyRef`) a chaves que não existem em um Secret nomeado
-provocam falhas na inicialização do Pod.
-
-Secrets utilizados para popular variáveis de ambiente através do campo `envFrom`
-que contém chaves inválidas para utilização como nome de uma variável de ambiente
-terão tais chaves ignoradas. O Pod inicializará normalmente. Porém, um evento
-será gerado com a razão `InvalidVariableNames` e a mensagem gerada conterá a lista
-de chaves inválidas que foram ignoradas. O exemplo abaixo demonstra um Pod que se
-refere ao Secret default/mysecret, contendo duas chaves inválidas: `1badkey` e
-`2alsobad`.
-
-```shell
-kubectl get events
-```
-
-O resultado é semelhante a:
-
-```
-LASTSEEN FIRSTSEEN COUNT NAME KIND SUBOBJECT TYPE REASON
-0s 0s 1 dapi-test-pod Pod Warning InvalidEnvironmentVariableNames kubelet, 127.0.0.1 Keys [1badkey, 2alsobad] from the EnvFrom secret default/mysecret were skipped since they are considered invalid environment variable names.
-```
-
-### Interações do ciclo de vida entre Secrets e Pods
-
-Quando um Pod é criado através de chamadas à API do Kubernetes, não há validação
-da existência de um Secret referenciado. Uma vez que um Pod seja agendado, o
-kubelet tentará buscar o valor do Secret. Se o Secret não puder ser encontrado
-porque não existe ou porque houve uma falha de comunicação temporária entre o
-kubelet e o servidor da API, o kubelet fará novas tentativas periodicamente.
-O kubelet irá gerar um evento sobre o Pod, explicando a razão pela qual o Pod
-ainda não foi inicializado. Uma vez que o Secret tenha sido encontrado, o
-kubelet irá criar e montar um volume contendo este Secret. Nenhum dos contêineres
-do Pod irá iniciar até que todos os volumes estejam montados.
+Você não pode utilizar ConfigMaps ou Secrets em
+{{< glossary_tooltip text="Pods estáticos" term_id="static-pod" >}}.
## Casos de uso
@@ -1001,10 +644,12 @@ Você também pode criar um manifesto `kustomization.yaml` com um campo
{{< caution >}}
Analise cuidadosamente antes de enviar suas próprias chaves SSH: outros usuários
-do cluster podem ter acesso a este Secret. Utilize uma service account que você
-deseje que seja acessível a todos os usuários com os quais você compartilha o
-cluster do Kubernetes em questão. Desse modo, você pode revogar esta service
-account caso os usuários sejam comprometidos.
+do cluster podem ter acesso a este Secret.
+
+Como alternativa, você pode criar uma chave SSH privada representando a
+identidade de um serviço que você deseja que seja acessível a todos os usuários
+com os quais você compartilha o cluster do Kubernetes em questão. Desse modo,
+você pode revogar esta credencial em caso de comprometimento.
{{< /caution >}}
Agora você pode criar um Pod que referencia o Secret com a chave SSH e consome-o
@@ -1074,11 +719,12 @@ secret "test-db-secret" created
{{< note >}}
Caracteres especiais como `$`, `\`, `*`, `+` e `!` serão interpretados pelo seu
-[shell](https://pt.wikipedia.org/wiki/Shell_(computa%C3%A7%C3%A3o)) e precisam de
-sequências de escape. Na maioria dos shells, a forma mais fácil de gerar sequências
-de escape para suas senhas é escrevê-las entre aspas simples (`'`). Por exemplo,
-se a sua senha for `S!B\*d$zDsb=`, você deve executar o comando da seguinte
-forma:
+[shell](https://pt.wikipedia.org/wiki/Shell_(computa%C3%A7%C3%A3o)) e precisam
+de sequências de escape.
+
+Na maioria dos shells, a forma mais fácil de gerar sequências de escape para
+suas senhas é escrevê-las entre aspas simples (`'`). Por exemplo, se a sua senha
+for `S!B\*d$zDsb=`, você deve executar o comando da seguinte forma:
```shell
kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password='S!B\*d$zDsb='
@@ -1225,9 +871,9 @@ Este volume irá conter um único arquivo, chamado `.secret-file`, e o contêine
`/etc/secret-volume/.secret-file`.
{{< note >}}
-Arquivos com nomes iniciados por um caractere de ponto são ocultos do resultado
-do comando `ls -l`. Você precisa utilizar `ls -la` para vê-los ao listar o
-conteúdo de um diretório.
+Arquivos com nomes iniciados por um caractere de ponto são ocultados do
+resultado do comando `ls -l`. Você precisa utilizar `ls -la` para vê-los ao
+listar o conteúdo de um diretório.
{{< /note >}}
### Caso de uso: Secret visível somente em um dos contêineres de um pod {#use-case-secret-visible-to-one-container-in-a-pod}
@@ -1247,103 +893,523 @@ Com essa abordagem particionada, um invasor agora precisa forçar o servidor de
aplicação a rodar comandos arbitrários, o que é mais difícil de ser feito do que
apenas ler um arquivo presente no disco.
-
+## Tipos de Secrets {#secret-types}
-## Melhores práticas
+Ao criar um Secret, você pode especificar o seu tipo utilizando o campo `type`
+do objeto Secret, ou algumas opções de linha de comando equivalentes no comando
+`kubectl`, quando disponíveis. O campo `type` de um Secret é utilizado para
+facilitar a manipulação programática de diferentes tipos de dados confidenciais.
-### Clientes que utilizam a API de Secrets
+O Kubernetes oferece vários tipos embutidos de Secret para casos de uso comuns.
+Estes tipos variam em termos de validações efetuadas e limitações que o
+Kubernetes impõe neles.
-Ao instalar aplicações que interajam com a API de Secrets, você deve limitar o
-acesso utilizando [políticas de autorização](/docs/reference/access-authn-authz/authorization/)
-como [RBAC](/docs/reference/access-authn-authz/rbac/).
+| Tipo embutido | Caso de uso |
+|----------------------------------------|----------------------------------------------------|
+| `Opaque` | dados arbitrários definidos pelo usuário |
+| `kubernetes.io/service-account-token` | token de service account (conta de serviço) |
+| `kubernetes.io/dockercfg` | arquivo `~/.dockercfg` serializado |
+| `kubernetes.io/dockerconfigjson` | arquivo `~/.docker/config.json` serializado |
+| `kubernetes.io/basic-auth` | credenciais para autenticação básica (basic auth) |
+| `kubernetes.io/ssh-auth` | credenciais para autenticação SSH |
+| `kubernetes.io/tls` | dados para um cliente ou servidor TLS |
+| `bootstrap.kubernetes.io/token` | dados de token de autoinicialização |
-Secrets frequentemente contém valores com um espectro de importância, muitos dos
-quais podem causar escalações dentro do Kubernetes (por exemplo, tokens de service
-account) e de sistemas externos. Mesmo que um aplicativo individual possa
-avaliar o poder do Secret com o qual espera interagir, outras aplicações dentro
-do mesmo namespace podem tornar estas suposições inválidas.
+Você pode definir e utilizar seu próprio tipo de Secret definindo o valor do
+campo `type` como uma string não-nula em um objeto Secret (uma string em branco
+é tratada como o tipo `Opaque`).
-Por estas razões, as requisições `watch` (observar) e `list` (listar) de
-Secrets dentro de um namespace são permissões extremamente poderosas e devem
-ser evitadas, pois a listagem de Secrets permite a clientes inspecionar os
-valores de todos os Secrets presentes naquele namespace. A habilidade de listar
-e observar todos os Secrets em um cluster deve ser reservada somente para os
-componentes mais privilegiados, que fazem parte do nível de aplicações de sistema.
+O Kubernetes não restringe nomes de tipos. No entanto, quando tipos embutidos
+são utilizados, você precisa atender a todos os requisitos daquele tipo.
-Aplicações que necessitam acessar a API de Secret devem realizar uma requisição
-`get` nos Secrets que precisam. Isto permite que administradores restrinjam o
-acesso a todos os Secrets, enquanto
-[utilizam uma lista de autorização a instâncias individuais](/docs/reference/access-authn-authz/rbac/#referring-to-resources)
-que a aplicação precise.
+Se você estiver definindo um tipo de Secret que seja para uso público, siga a
+convenção e estruture o tipo de Secret para conter o seu domínio antes do nome,
+separado por uma barra (`/`).
+Por exemplo: `cloud-hosting.example.net/cloud-api-credentials`.
-Para melhor desempenho em uma requisição `get` repetitiva, clientes podem criar
-objetos que referenciam o Secret e então utilizar a requisição `watch` neste
-novo objeto, requisitando o Secret novamente quando a referência mudar.
-Além disso, uma [API de "observação em lotes"](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/bulk_watch.md)
-para permitir a clientes observar recursos individuais também foi proposta e
-provavelmente estará disponível em versões futuras do Kubernetes.
+### Secrets tipo `Opaque`
-## Propriedades de segurança
+`Opaque` é o tipo predefinido de Secret quando o campo `type` é omitido em um
+arquivo de configuração de Secret. Quando um Secret é criado usando o comando
+`kubectl`, você deve usar o subcomando `generic` para indicar que um Secret é
+do tipo `Opaque`. Por exemplo, o comando a seguir cria um Secret vazio do tipo
+`Opaque`:
+```shell
+kubectl create secret generic empty-secret
+kubectl get secret empty-secret
+```
-### Proteções
+O resultado será semelhante ao abaixo:
-Como Secrets podem ser criados de forma independente de Pods que os utilizam,
-há menos risco de um Secret ser exposto durante o fluxo de trabalho de criação,
-visualização, e edição de Pods. O sistema pode também tomar precauções adicionais
-com Secrets, como por exemplo evitar que sejam escritos em disco quando possível.
+```
+NAME TYPE DATA AGE
+empty-secret Opaque 0 2m6s
+```
-Um Secret só é enviado para um nó se um Pod naquele nó requerê-lo. O kubelet
-armazena o Secret num sistema de arquivos `tmpfs`, de forma a evitar que o Secret
-seja escrito em armazenamento persistente. Uma vez que o Pod que depende do
-Secret é removido, o kubelet apaga sua cópia local do Secret também.
+A coluna `DATA` demonstra a quantidade de dados armazenados no Secret. Neste
+caso, `0` significa que este objeto Secret está vazio.
-Secrets de vários Pods diferentes podem existir no mesmo nó. No entanto, somente
-os Secrets que um Pod requerer estão potencialmente visíveis em seus contêineres.
+### Secrets de token de service account (conta de serviço)
+
+Secrets do tipo `kubernetes.io/service-account-token` são utilizados para
+armazenar um token que identifica uma service account (conta de serviço). Ao
+utilizar este tipo de Secret, você deve garantir que a anotação
+`kubernetes.io/service-account.name` contém um nome de uma service account
+existente. Um controlador do Kubernetes preenche outros campos, como por exemplo
+a anotação `kubernetes.io/service-account.uid` e a chave `token` no campo `data`
+com o conteúdo do token.
+
+O exemplo de configuração abaixo declara um Secret de token de service account:
+
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+ name: secret-sa-sample
+ annotations:
+ kubernetes.io/service-account-name: "sa-name"
+type: kubernetes.io/service-account-token
+data:
+ # Você pode incluir pares chave-valor adicionais, da mesma forma que faria com
+ # Secrets do tipo Opaque
+ extra: YmFyCg==
+```
+
+Ao criar um {{< glossary_tooltip text="Pod" term_id="pod" >}}, o Kubernetes
+automaticamente cria um Secret de service account e automaticamente atualiza o
+seu Pod para utilizar este Secret. O Secret de token de service account contém
+credenciais para acessar a API.
+
+A criação automática e o uso de credenciais de API podem ser desativados ou
+substituídos se desejado. Porém, se tudo que você necessita é poder acessar o
+servidor da API de forma segura, este é o processo recomendado.
+
+Veja a documentação de
+[ServiceAccount](/docs/tasks/configure-pod-container/configure-service-account/)
+para mais informações sobre o funcionamento de service accounts. Você pode
+verificar também os campos `automountServiceAccountToken` e `serviceAccountName`
+do [`Pod`](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#pod-v1-core)
+para mais informações sobre como referenciar service accounts em Pods.
+
+### Secrets de configuração do Docker
+
+Você pode utilizar um dos tipos abaixo para criar um Secret que armazena
+credenciais para accesso a um registro de contêineres para busca de imagens:
+
+- `kubernetes.io/dockercfg`
+- `kubernetes.io/dockerconfigjson`
+
+O tipo `kubernetes.io/dockercfg` é reservado para armazenamento de um arquivo
+`~/.dockercfg` serializado. Este arquivo é o formato legado para configuração
+do utilitário de linha de comando do Docker. Ao utilizar este tipo de Secret,
+é preciso garantir que o campo `data` contém uma chave `.dockercfg` cujo valor
+é o conteúdo do arquivo `~/.dockercfg` codificado no formato base64.
+
+O tipo `kubernetes.io/dockerconfigjson` foi projetado para armazenamento de um
+conteúdo JSON serializado que obedece às mesmas regras de formato que o arquivo
+`~/.docker/config.json`. Este arquivo é um formato mais moderno para o conteúdo
+do arquivo `~/.dockercfg`. Ao utilizar este tipo de Secret, o conteúdo do campo
+`data` deve conter uma chave `.dockerconfigjson` em que o conteúdo do arquivo
+`~/.docker/config.json` é fornecido codificado no formato base64.
+
+Um exemplo de um Secret do tipo `kubernetes.io/dockercfg`:
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+ name: secret-dockercfg
+type: kubernetes.io/dockercfg
+data:
+ .dockercfg: |
+ ""
+```
+
+{{< note >}}
+Se você não desejar fazer a codificação em formato base64, você pode utilizar o
+campo `stringData` como alternativa.
+{{< /note >}}
+
+Ao criar estes tipos de Secret utilizando um manifesto (arquivo YAML), o
+servidor da API verifica se a chave esperada existe no campo `data` e se o valor
+fornecido pode ser interpretado como um conteúdo JSON válido. O servidor da API
+não verifica se o conteúdo informado é realmente um arquivo de configuração do
+Docker.
+
+Quando você não tem um arquivo de configuração do Docker, ou quer utilizar o
+comando `kubectl` para criar um Secret de registro de contêineres, você pode
+rodar o comando:
+
+```shell
+kubectl create secret docker-registry secret-tiger-docker \
+ --docker-email=tiger@acme.example \
+ --docker-username=tiger \
+ --docker-password=pass1234 \
+ --docker-server=my-registry.example:5000
+```
+
+Esse comando cria um secret do tipo `kubernetes.io/dockerconfigjson`. Se você
+obtiver o conteúdo do campo `.data.dockerconfigjson` deste novo Secret e
+decodificá-lo do formato base64:
+
+```shell
+kubectl get secret secret-tiger-docker -o jsonpath='{.data.*}' | base64 -d
+```
+
+o resultado será equivalente a este documento JSON (que também é um arquivo de
+configuração válido do Docker):
+
+```json
+{
+ "auths": {
+ "my-registry.example:5000": {
+ "username": "tiger",
+ "password": "pass1234",
+ "email": "tiger@acme.example",
+ "auth": "dGlnZXI6cGFzczEyMzQ="
+ }
+ }
+}
+```
+
+{{< note >}}
+O valor do campo `auth` no exemplo acima é codificado em base64; ele está
+ofuscado mas não criptografado. Qualquer pessoa com acesso a este Secret pode
+ler o conteúdo do token _bearer_.
+{{< /note >}}
+
+### Secret de autenticação básica
+
+O tipo `kubernetes.io/basic-auth` é fornecido para armazenar credenciais
+necessárias para autenticação básica. Ao utilizar este tipo de Secret, o campo
+`data` do Secret deve conter as duas chaves abaixo:
+
+- `username`: o usuário utilizado para autenticação;
+- `password`: a senha ou token para autenticação.
+
+Ambos os valores para estas duas chaves são textos codificados em formato base64.
+Você pode fornecer os valores como texto simples utilizando o campo `stringData`
+na criação do Secret.
+
+O arquivo YAML abaixo é um exemplo de configuração para um Secret de autenticação
+básica:
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+ name: secret-basic-auth
+type: kubernetes.io/basic-auth
+stringData:
+ username: admin # required field for kubernetes.io/basic-auth
+ password: t0p-Secret # required field for kubernetes.io/basic-auth
+```
+
+O tipo de autenticação básica é fornecido unicamente por conveniência. Você pode
+criar um Secret do tipo `Opaque` utilizado para autenticação básica. No entanto,
+utilizar o tipo embutido e público de Secret (`kubernetes.io/basic-auth`)
+auxilia outras pessoas a compreenderem o propósito do seu Secret, e define uma
+convenção de expectativa de nomes de chaves
+O tipo embutido também fornece verificação dos campos requeridos pelo servidor
+da API.
+
+### Secret de autenticação SSH
+
+O tipo embutido `kubernetes.io/ssh-auth` é fornecido para armazenamento de dados
+utilizados em autenticação SSH. Ao utilizar este tipo de Secret, você deve
+especificar um par de chave-valor `ssh-privatekey` no campo `data` (ou no campo
+`stringData`) com a credencial SSH a ser utilizada.
+
+O manifesto abaixo é um exemplo de configuração para um Secret de autenticação
+SSH com um par de chaves pública/privada:
+
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+ name: secret-ssh-auth
+type: kubernetes.io/ssh-auth
+data:
+ # os dados estão abreviados neste exemplo
+ ssh-privatekey: |
+ MIIEpQIBAAKCAQEAulqb/Y ...
+```
+
+O Secret de autenticação SSH é fornecido apenas para a conveniência do usuário.
+Você pode criar um Secret do tipo `Opaque` para credentials utilizadas para
+autenticação SSH. No entanto, a utilização do tipo embutido e público de Secret
+(`kubernetes.io/ssh-auth`) auxilia outras pessoas a compreenderem o propósito do
+seu Secret, e define uma convenção de quais chaves podem ser esperadas.
+O tipo embutido também fornece verificação dos campos requeridos em uma
+configuração de Secret.
+
+{{< caution >}}
+Chaves privadas SSH não estabelecem, por si só, uma comunicação confiável
+entre um cliente SSH e um servidor. Uma forma secundária de estabelecer
+confiança é necessária para mitigar ataques _man-in-the-middle_ (MITM), como por
+exemplo um arquivo `known_hosts` adicionado a um ConfigMap.
+{{< /caution >}}
+
+### Secrets TLS
+
+O Kubernetes fornece o tipo embutido de Secret `kubernetes.io/tls` para
+armazenamento de um certificado e sua chave associada que são tipicamente
+utilizados para TLS.
+
+Uma utilização comum de Secrets TLS é a configuração de encriptação em trânsito
+para um recurso [Ingress](/docs/concepts/services-networking/ingress/), mas
+este tipo de secret pode também ser utilizado com outros recursos ou diretamente
+por uma carga de trabalho.
+
+Ao utilizar este tipo de Secret, as chaves `tls.key` e `tls.crt` devem ser
+informadas no campo `data` (ou `stringData`) da configuração do Secret, embora o
+servidor da API não valide o conteúdo de cada uma destas chaves.
+
+O YAML a seguir tem um exemplo de configuração para um Secret TLS:
+
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+ name: secret-tls
+type: kubernetes.io/tls
+data:
+ # os dados estão abreviados neste exemplo
+ tls.crt: |
+ MIIC2DCCAcCgAwIBAgIBATANBgkqh ...
+ tls.key: |
+ MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...
+```
+
+O tipo TLS é fornecido para a conveniência do usuário. Você pode criar um
+Secret do tipo `Opaque` para credenciais utilizadas para o servidor e/ou
+cliente TLS. No entanto, a utilização do tipo embutido auxilia a manter a
+consistência dos formatos de Secret no seu projeto; o servidor da API
+valida se os campos requeridos estão presentes na configuração do Secret.
+
+Ao criar um Secret TLS utilizando a ferramenta de linha de comando `kubectl`,
+você pode utilizar o subcomando `tls` conforme demonstrado no exemplo abaixo:
+```shell
+kubectl create secret tls my-tls-secret \
+ --cert=path/to/cert/file \
+ --key=path/to/key/file
+```
+
+O par de chaves pública/privada deve ser criado previamente. O certificado
+de chave pública a ser utilizado no argumento `--cert` deve ser codificado em
+formato DER conforme especificado na
+[seção 5.1 da RFC 7468](https://datatracker.ietf.org/doc/html/rfc7468#section-5.1)
+e deve corresponder à chave privada fornecida no argumento `--key`
+(PKCS #8 no formato DER;
+[seção 11 da RFC 7468](https://datatracker.ietf.org/doc/html/rfc7468#section-11)).
+
+{{< note >}}
+Um Secret kubernetes.io/tls armazena o conteúdo de chaves e certificados em
+formato DER codificado em base64. Se você tem familiaridade com o formato PEM
+para chaves privadas e certificados, o conteúdo é o mesmo do formato PEM,
+excluindo-se a primeira e a última linhas.
+
+Por exemplo, para um certificado, você **não** inclui as linhas
+`--------BEGIN CERTIFICATE-----` e `-------END CERTIFICATE----`.
+{{< /note >}}
+
+### Secret de token de autoinicialização {#bootstrap-token-secrets}
+
+Um Secret de token de autoinicialização pode ser criado especificando o tipo de
+um Secret explicitamente com o valor `bootstrap.kubernetes.io/token`. Este tipo
+de Secret é projetado para tokens utilizados durante o processo de inicialização
+de nós. Este tipo de Secret armazena tokens utilizados para assinar ConfigMaps
+conhecidos.
+
+Um Secret de token de autoinicialização é normalmente criado no namespace
+`kube-system` e nomeado na forma `bootstrap-token-`, onde
+`` é um texto com 6 caracteres contendo a identificação do token.
+
+No formato de manifesto do Kubernetes, um Secret de token de autoinicialização
+se assemelha ao exemplo abaixo:
+
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+ name: bootstrap-token-5emitj
+ namespace: kube-system
+type: bootstrap.kubernetes.io/token
+data:
+ auth-extra-groups: c3lzdGVtOmJvb3RzdHJhcHBlcnM6a3ViZWFkbTpkZWZhdWx0LW5vZGUtdG9rZW4=
+ expiration: MjAyMC0wOS0xM1QwNDozOToxMFo=
+ token-id: NWVtaXRq
+ token-secret: a3E0Z2lodnN6emduMXAwcg==
+ usage-bootstrap-authentication: dHJ1ZQ==
+ usage-bootstrap-signing: dHJ1ZQ==
+```
+
+Um Secret do tipo token de autoinicialização possui as seguintes chaves no campo
+`data`:
+
+- `token-id`: Uma string com 6 caracteres aleatórios como identificador do
+ token. Requerido.
+- `token-secret`: Uma string de 16 caracteres aleatórios como o conteúdo secreto
+ do token. Requerido.
+- `description`: Uma string contendo uma descrição do propósito para o qual este
+ token é utilizado. Opcional.
+- `expiration`: Um horário absoluto UTC no formato RFC3339 especificando quando
+ o token deve expirar. Opcional.
+- `usage-bootstrap-`: Um conjunto de flags booleanas indicando outros
+ usos para este token de autoinicialização.
+- `auth-extra-groups`: Uma lista separada por vírgulas de nomes de grupos que
+ serão autenticados adicionalmente, além do grupo `system:bootstrappers`.
+
+O YAML acima pode parecer confuso, já que os valores estão todos codificados em
+formato base64. Você pode criar o mesmo Secret utilizando este YAML:
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+ # Observe como o Secret é nomeado
+ name: bootstrap-token-5emitj
+ # Um Secret de token de inicialização geralmente fica armazenado no namespace
+ # 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"
+ # Esta identificação de token é utilizada no nome
+ token-id: "5emitj"
+ token-secret: "kq4gihvszzgn1p0r"
+ # Este token pode ser utilizado para autenticação
+ usage-bootstrap-authentication: "true"
+ # e pode ser utilizado para assinaturas
+ usage-bootstrap-signing: "true"
+```
+
+## Secrets imutáveis {#secret-immutable}
+
+{{< feature-state for_k8s_version="v1.21" state="stable" >}}
+
+O Kubernetes permite que você marque Secrets (e ConfigMaps) específicos como
+_imutáveis_. Prevenir mudanças nos dados de um Secret existente tem os seguintes
+benefícios:
+
+- protege você de alterações acidentais (ou indesejadas) que poderiam provocar
+ disrupções em aplicações.
+- em clusters com uso extensivo de Secrets (pelo menos dezenas de milhares de
+ montagens únicas de Secrets a Pods), utilizar Secrets imutáveis melhora o
+ desempenho do seu cluster através da redução significativa de carga no
+ kube-apiserver. O kubelet não precisa manter um _watch_ em Secrets que são
+ marcados como imutáveis.
+
+### Marcando um Secret como imutável {#secret-immutable-create}
+
+Você pode criar um Secret imutável adicionando o campo `immutable` com o valor
+`true` ao manifesto do Secret. Por exemplo:
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+ ...
+data:
+ ...
+immutable: true
+```
+
+Você pode também atualizar qualquer Secret mutável existente para torná-lo
+imutável.
+
+{{< note >}}
+Uma vez que um Secret ou ConfigMap seja marcado como imutável, _não_ é mais
+possível reverter esta mudança, nem alterar os conteúdos do campo `data`. Você
+pode somente apagar e recriar o Secret. Pods existentes mantém um ponto de
+montagem referenciando o Secret removido - é recomendado recriar tais Pods.
+{{< /note >}}
+
+## Informações de segurança sobre Secrets {#information-security-for-secrets}
+
+Embora ConfigMaps e Secrets funcionem de formas similares, o Kubernetes aplica
+proteções extras aos objetos Secret.
+
+Secrets frequentemente contém valores dentro de um espectro de importância,
+muitos dos quais podem provocar escalações de privilégios dentro do Kubernetes
+(por exemplo, um token de service account) e em sistemas externos. Mesmo que uma
+aplicação individual possa avaliar o poder dos Secrets com os quais espera
+interagir, outras aplicações dentro do mesmo namespace podem tornar tais
+suposições inválidas.
+
+Um Secret só é enviado a um nó se um Pod naquele nó precisa do Secret em questão.
+Para montar Secrets em Pods, o kubelet armazena uma cópia dos dados dentro de um
+sistema de arquivos `tmpfs`, de modo que os dados confidenciais não sejam
+escritos em armazenamento durável. Uma vez que o Pod que dependia do Secret seja
+removido, o kubelet apaga sua cópia local dos dados confidenciais do Secret.
+
+Um Pod pode possuir vários contêineres. Por padrão, contêineres que você define
+têm acesso somente à ServiceAccount padrão e seu Secret relacionado. Você deve
+explicitamente definir variáveis de ambiente ou mapear um volume dentro de um
+contêiner para ter acesso a qualquer outro Secret.
+
+Podem haver Secrets para vários Pods no mesmo nó. No entanto, somente os Secrets
+que um Pod requisitou estão potencialmente visíveis dentro de seus contêineres.
Portanto, um Pod não tem acesso aos Secrets de outro Pod.
-Um Pod pode conter vários contêineres. Porém, cada contêiner em um Pod precisa
-requerer o volume de Secret nos seus `volumeMounts` para que este fique visível
-dentro do contêiner. Esta característica pode ser utilizada para construir
-[partições de segurança ao nível do Pod](#use-case-secret-visible-to-one-container-in-a-pod).
+{{< warning >}}
+Quaisquer contêineres privilegiados em um nó são passíveis de acesso a todos os
+Secrets naquele nó.
+{{< /warning >}}
-Na maioria das distribuições do Kubernetes, a comunicação entre usuários e o
-servidor da API e entre servidor da API e os kubelets é protegida por SSL/TLS.
-Secrets são protegidos quando transmitidos através destes canais.
+### Recomendações de segurança para desenvolvedores
-{{< feature-state for_k8s_version="v1.13" state="beta" >}}
+- Aplicações ainda devem proteger o valor da informação confidencial após lê-la
+ de uma variável de ambiente ou volume. Por exemplo, sua aplicação deve evitar
+ imprimir os dados do Secret sem encriptação ou transmitir esta informação para
+ aplicações terceiras de confiabilidade não-estabelecida.
+- Se você estiver definindo múltiplos contêineres em um Pod, e somente um destes
+ contêineres necessita acesso a um Secret, defina o volume ou variável de
+ ambiente de maneira que os demais contêineres não tenham acesso àquele Secret.
+- Se você configurar um Secret através de um {{< glossary_tooltip text="manifesto" term_id="manifest" >}},
+ com os dados codificados em formato base64, compartilhar este arquivo ou
+ salvá-lo em um sistema de controle de versão de código-fonte significa que o
+ Secret está disponível para qualquer pessoa que pode ler o manifesto. O formato
+ base64 _não é_ um método de encriptação e não fornece nenhuma confidencialidade
+ adicional em comparação com texto puro.
+- Ao instalar aplicações que interagem com a API de Secrets, você deve limitar
+ o acesso utilizando
+ [políticas de autorização](/docs/reference/access-authn-authz/authorization/),
+ como por exemplo [RBAC](/docs/reference/access-authn-authz/rbac/).
+- Na API do Kubernetes, requisições `watch` e `list` em Secrets dentro de um
+ namespace são extremamente poderosas. Evite fornecer este acesso quando
+ possível, já que listar Secrets permite aos clientes inspecionar os valores de
+ todos os Secrets naquele namespace.
-Você pode habilitar [encriptação em disco](/docs/tasks/administer-cluster/encrypt-data/)
-em dados de Secret para evitar que estes sejam armazenados em texto plano no
-{{< glossary_tooltip term_id="etcd" >}}.
+### Recomendações de segurança para administradores de cluster
-### Riscos
+{{< caution >}}
+Um usuário que pode criar um Pod que utiliza um Secret pode também ver o valor
+daquele Secret. Mesmo que as permissões do cluster não permitam ao usuário ler
+o Secret diretamente, o mesmo usuário poderia ter acesso a criar um Pod que
+então expõe o Secret.
+{{< /caution >}}
-- No servidor da API, os dados de Secret são armazenados no
+- Restrinja a habilidade de usar as requisições `watch` e `list` para listar todos
+ os Secrets em um cluster (utilizando a API do Kubernetes) de modo que somente
+ os componentes mais privilegiados e de nível de sistema possam realizar esta
+ ação.
+- Ao instalar aplicações que interajam com a API de Secrets, você deve limitar o
+ acesso utilizando
+ [políticas de autorização](/docs/reference/access-authn-authz/authorization/),
+ como por exemplo [RBAC](/docs/reference/access-authn-authz/rbac/).
+- No servidor da API, objetos (incluindo Secrets) são persistidos no
{{< glossary_tooltip term_id="etcd" >}}; portanto:
- - Administradores devem habilitar encriptação em disco para dados do cluster
- (requer Kubernetes v1.13 ou posterior).
- - Administradores devem limitar o acesso ao etcd somente para usuários
- administradores.
- - Administradores podem desejar apagar definitivamente ou destruir discos
- previamente utilizados pelo etcd que não estiverem mais em uso.
- - Ao executar o etcd em um cluster, administradores devem garantir o uso de
- SSL/TLS para conexões ponto-a-ponto do etcd.
-- Se você configurar um Secret utilizando um arquivo de manifesto (JSON ou
- YAML) que contém os dados do Secret codificados como base64, compartilhar
- este arquivo ou salvá-lo num sistema de controle de versão de código-fonte
- compromete este Secret. Codificação base64 _não_ é um método de encriptação
- e deve ser considerada idêntica a texto plano.
-- Aplicações ainda precisam proteger o valor do Secret após lê-lo de um volume,
- como por exemplo não escrever seu valor em logs ou enviá-lo para um sistema
- não-confiável.
-- Um usuário que consegue criar um Pod que utiliza um Secret também consegue
- ler o valor daquele Secret. Mesmo que o servidor da API possua políticas para
- impedir que aquele usuário leia o valor do Secret, o usuário poderia criar um
- Pod que expõe o Secret.
+ - somente permita a administradores do sistema o acesso ao etcd (incluindo
+ acesso somente-leitura);
+ - habilite [encriptação em disco](/docs/tasks/administer-cluster/encrypt-data/)
+ para objetos Secret, de modo que os dados de tais Secrets não sejam
+ armazenados em texto plano no {{< glossary_tooltip term_id="etcd" >}};
+ - considere a destruição do armazenamento durável previamente utilizado pelo
+ etcd quando não estiver mais em uso;
+ - se houverem múltiplas instâncias do etcd em uso, garanta que o etcd esteja
+ configurado para utilizar SSL/TLS para comunicação entre instâncias.
## {{% heading "whatsnext" %}}
- Aprenda a [gerenciar Secrets utilizando `kubectl`](/pt-br/docs/tasks/configmap-secret/managing-secret-using-kubectl/)
- Aprenda a [gerenciar Secrets utilizando arquivos de configuração](/pt-br/docs/tasks/configmap-secret/managing-secret-using-config-file/)
- Aprenda a [gerenciar Secrets utilizando kustomize](/pt-br/docs/tasks/configmap-secret/managing-secret-using-kustomize/)
-- Leia a [documentação de referência da API](/docs/reference/kubernetes-api/config-and-storage-resources/secret-v1/) de `Secrets`
+- Leia a [documentação de referência da API](/docs/reference/kubernetes-api/config-and-storage-resources/secret-v1/) de Secrets
diff --git a/content/pt-br/docs/concepts/containers/runtime-class.md b/content/pt-br/docs/concepts/containers/runtime-class.md
index ee090beedc..37ee330c26 100644
--- a/content/pt-br/docs/concepts/containers/runtime-class.md
+++ b/content/pt-br/docs/concepts/containers/runtime-class.md
@@ -176,4 +176,4 @@ Pods utilizando-se desse Runtimeclass e assim contabilizar esses recursos para o
- [RuntimeClass Design](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/585-runtime-class/README.md)
- [RuntimeClass Scheduling Design](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/585-runtime-class/README.md#runtimeclass-scheduling)
- Leia mais sobre [Sobrecarga de Pods](/docs/concepts/scheduling-eviction/pod-overhead/)
-- [PodOverhead Feature Design](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20190226-pod-overhead.md)
+- [PodOverhead Feature Design](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/688-pod-overhead)
diff --git a/content/pt-br/docs/concepts/scheduling-eviction/pod-overhead.md b/content/pt-br/docs/concepts/scheduling-eviction/pod-overhead.md
index c3788b22fa..603c82d4f2 100644
--- a/content/pt-br/docs/concepts/scheduling-eviction/pod-overhead.md
+++ b/content/pt-br/docs/concepts/scheduling-eviction/pod-overhead.md
@@ -188,6 +188,6 @@ mas é esperado em uma próxima versão. Os usuários necessitarão entretanto c
* [RuntimeClass](/docs/concepts/containers/runtime-class/)
-* [PodOverhead Design](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20190226-pod-overhead.md)
+* [PodOverhead Design](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/688-pod-overhead)
diff --git a/content/pt-br/docs/concepts/storage/persistent-volumes.md b/content/pt-br/docs/concepts/storage/persistent-volumes.md
index 12ff2700fe..01d092e673 100644
--- a/content/pt-br/docs/concepts/storage/persistent-volumes.md
+++ b/content/pt-br/docs/concepts/storage/persistent-volumes.md
@@ -723,7 +723,7 @@ Se você está criando templates ou exemplos que rodam numa grande quantidade de
* Saiba mais sobre [Criando um PersistentVolume](/docs/tasks/configure-pod-container/configure-persistent-volume-storage/#create-a-persistentvolume).
* Saiba mais sobre [Criando um PersistentVolumeClaim](/docs/tasks/configure-pod-container/configure-persistent-volume-storage/#create-a-persistentvolumeclaim).
-* Leia a [documentação sobre planejamento de Armazenamento Persistente](https://git.k8s.io/community/contributors/design-proposals/storage/persistent-storage.md).
+* Leia a [documentação sobre planejamento de Armazenamento Persistente](https://git.k8s.io/design-proposals-archive/storage/persistent-storage.md).
### Referência
diff --git a/content/pt-br/docs/reference/access-authn-authz/bootstrap-tokens.md b/content/pt-br/docs/reference/access-authn-authz/bootstrap-tokens.md
index b7455e5765..e3d6327256 100644
--- a/content/pt-br/docs/reference/access-authn-authz/bootstrap-tokens.md
+++ b/content/pt-br/docs/reference/access-authn-authz/bootstrap-tokens.md
@@ -57,7 +57,7 @@ do gerenciador de controle - kube-controller-manager.
## Formato do _secret_ dos tokens de inicialização
Cada token válido possui um _secret_ no namespace `kube-system`. Você pode
-encontrar a documentação completa [aqui](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/cluster-lifecycle/bootstrap-discovery.md).
+encontrar a documentação completa [aqui](https://github.com/kubernetes/design-proposals-archive/blob/main/cluster-lifecycle/bootstrap-discovery.md).
Um _secret_ de token se parece com o exemplo abaixo:
diff --git a/content/pt-br/docs/reference/glossary/kubectl.md b/content/pt-br/docs/reference/glossary/kubectl.md
new file mode 100644
index 0000000000..d0a5e1970f
--- /dev/null
+++ b/content/pt-br/docs/reference/glossary/kubectl.md
@@ -0,0 +1,18 @@
+---
+title: Kubectl
+id: kubectl
+date: 2018-04-12
+full_link: /pt-br/docs/user-guide/kubectl-overview/
+short_description: >
+ Uma ferramenta de linha de comando para se comunicar com um cluster Kubernetes.
+
+aka:
+- kubectl
+tags:
+- tool
+- fundamental
+---
+Ferramenta de linha de comando para se comunicar com a {{< glossary_tooltip text="camada de gerenciamento" term_id="control-plane" >}} de um cluster Kubernetes usando a API do Kubernetes.
+
+
+Você pode usar `kubectl` para criar, inspecionar, atualizar e excluir objetos Kubernetes.
diff --git a/content/pt-br/docs/reference/glossary/sig.md b/content/pt-br/docs/reference/glossary/sig.md
new file mode 100644
index 0000000000..0a5911c0bf
--- /dev/null
+++ b/content/pt-br/docs/reference/glossary/sig.md
@@ -0,0 +1,19 @@
+---
+title: SIG (grupo de interesse especial)
+id: sig
+date: 2018-04-12
+full_link: https://github.com/kubernetes/community/blob/master/sig-list.md#master-sig-list
+short_description: >
+ Membros da comunidade que gerenciam coletivamente e continuamente uma parte ou projeto maior do código aberto do Kubernetes.
+
+aka:
+tags:
+- community
+---
+ {{< glossary_tooltip text="Membros da comunidade" term_id="member" >}} que gerenciam coletivamente e continuamente uma parte ou projeto maior do código aberto do Kubernetes.
+
+
+
+Os membros dentro de um grupo de interesse especial (do inglês - Special Interest Group, SIG) têm um interesse comum em contribuir em uma área específica, como arquitetura, API ou documentação. Os SIGs devem seguir as [diretrizes de governança](https://github.com/kubernetes/community/blob/master/committee-steering/governance/sig-governance.md) do SIG, mas podem ter sua própria política de contribuição e canais de comunicação.
+
+Para mais informações, consulte o repositório [kubernetes/community](https://github.com/kubernetes/community) e a lista atual de [SIGs e Grupos de Trabalho](https://github.com/kubernetes/community/blob/master/sig-list.md).
diff --git a/content/pt-br/docs/reference/glossary/userns.md b/content/pt-br/docs/reference/glossary/userns.md
new file mode 100644
index 0000000000..f8599f0743
--- /dev/null
+++ b/content/pt-br/docs/reference/glossary/userns.md
@@ -0,0 +1,24 @@
+---
+title: Namespace do usuário
+id: userns
+date: 2021-07-13
+full_link: https://man7.org/linux/man-pages/man7/user_namespaces.7.html
+short_description: >
+ Um recurso do kernel Linux para emular privilégios de superusuário para usuários sem privilégios.
+
+aka:
+tags:
+- security
+---
+
+Um recurso do kernel para emular o root. Usado para "contêineres sem root".
+
+
+
+Os namespaces do usuário são um recurso do kernel Linux que permite que um usuário não root emule privilégios de superusuário ("root"), por exemplo, para executar contêineres sem ser um superusuário fora do contêiner.
+
+O namespace do usuário é eficaz para mitigar os danos de um potencial ataque em que o adversário escapa dos limites do contêiner.
+
+No contexto de namespaces de usuário, o namespace é um recurso do kernel Linux, e não um {{< glossary_tooltip text="namespace" term_id="namespace" >}} no sentido do termo Kubernetes.
+
+
diff --git a/content/pt-br/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_create.md b/content/pt-br/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_create.md
new file mode 100644
index 0000000000..0f93f417c8
--- /dev/null
+++ b/content/pt-br/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_create.md
@@ -0,0 +1,126 @@
+
+
+
+Crie tokens de inicialização no servidor
+
+### Sinopse
+
+Este comando criará um token de inicialização. Você pode especificar os usos para este token, o "tempo de vida" e uma descrição amigável, que é opcional.
+
+O [token] é o token real para gravar. Este deve ser um token aleatório gerado com segurança da forma "[a-z0-9]{6}.[a-z0-9]{16}". Se nenhum [token] for fornecido, o kubeadm gerará um token aleatório.
+
+```
+kubeadm token create [token]
+```
+
+### Opções
+
+
+
+
+
+
+
+
+
+
--certificate-key string
+
+
+
Quando usado em conjunto com '--print-join-command', exibe a flag completa 'kubeadm join' necessária para se unir ao cluster como um nó de camada de gerenciamento. Para criar uma nova chave de certificado, você deve usar 'kubeadm init phase upload-certs --upload-certs'.
+
+
+
+
--config string
+
+
+
Caminho para o arquivo de configuração kubeadm.
+
+
+
+
--description string
+
+
+
Uma descrição amigável de como esse token é usado.
Grupos extras que este token autenticará quando usado para autenticação. Deve corresponder "\Asystem:bootstrappers:[a-z0-9:-]{0,255}[a-z0-9]\z"
+
+
+
+
-h, --help
+
+
+
ajuda para create
+
+
+
+
--print-join-command
+
+
+
Em vez de exibir apenas o token, exibe a flag completa 'kubeadm join' necessária para se associar ao cluster usando o token.
+
+
+
+
--ttl duração Padrão: 24h0m0s
+
+
+
A duração antes do token ser excluído automaticamente (por exemplo, 1s, 2m, 3h). Se definido como '0', o token nunca expirará
+
+
+
+
--usages strings Padrão: "signing,authentication"
+
+
+
Descreve as maneiras pelas quais esse token pode ser usado. Você pode passar --usages várias vezes ou fornecer uma lista de opções separada por vírgulas. Opções válidas: [signing,authentication]
O arquivo kubeconfig a ser usado para se comunicar com o cluster. Se a flag não estiver definida, um conjunto de locais predefinidos pode ser pesquisado por um arquivo kubeconfig existente.
+
+
+
+
--rootfs string
+
+
+
[EXPERIMENTAL] O caminho para o 'real' sistema de arquivos raiz do host.
+
+
+
+
diff --git a/content/pt-br/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_delete.md b/content/pt-br/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_delete.md
new file mode 100644
index 0000000000..755e35a72a
--- /dev/null
+++ b/content/pt-br/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_delete.md
@@ -0,0 +1,80 @@
+
+
+
+Excluir tokens de inicialização no servidor
+
+### Sinopse
+
+Este comando excluirá uma lista de tokens de inicialização para você.
+
+O [token-value] é um Token completo na forma "[a-z0-9]{6}.[a-z0-9]{16}" ou o ID do Token na forma "[a-z0-9]{6}" a ser excluído.
+
+```
+kubeadm token delete [token-value] ...
+```
+
+### Opções
+
+
O arquivo kubeconfig a ser usado para se comunicar com o cluster. Se a flag não estiver definida, um conjunto de locais predefinidos pode ser pesquisado por um arquivo kubeconfig existente.
+
+
+
+
--rootfs string
+
+
+
[EXPERIMENTAL] O caminho para o 'real' sistema de arquivos raiz do host.
+
+
+
+
+
+
+
diff --git a/content/pt-br/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_generate.md b/content/pt-br/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_generate.md
new file mode 100644
index 0000000000..4c51e831e3
--- /dev/null
+++ b/content/pt-br/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_generate.md
@@ -0,0 +1,82 @@
+
+
+
+Gere e exiba um token de inicialização, mas não o crie no servidor
+
+### Sinopse
+
+Este comando exibirá um token de inicialização gerado aleatoriamente que pode ser usado com os comandos "init" e "join".
+
+Você não precisa usar este comando para gerar um token. Você pode fazer isso sozinho, desde que esteja no formato "[a-z0-9]{6}.[a-z0-9]{16}". Este comando é fornecido por conveniência para gerar tokens no formato fornecido.
+
+Você também pode usar "kubeadm init" sem especificar um token e ele gerará e exibirá um para você.
+
+```
+kubeadm token generate [flags]
+```
+
+### Opções
+
+
O arquivo kubeconfig a ser usado para se comunicar com o cluster. Se a flag não estiver definida, um conjunto de locais predefinidos pode ser pesquisado por um arquivo kubeconfig existente.
+
+
+
+
--rootfs string
+
+
+
[EXPERIMENTAL] O caminho para o 'real' sistema de arquivos raiz do host.
+
+
+
+
+
+
+
diff --git a/content/pt-br/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_list.md b/content/pt-br/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_list.md
new file mode 100644
index 0000000000..2a598ed38a
--- /dev/null
+++ b/content/pt-br/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_list.md
@@ -0,0 +1,99 @@
+
+
+
+Liste tokens de inicialização no servidor
+
+### Sinopse
+
+Este comando listará todos os tokens de inicialização para você
+
+```
+kubeadm token list [flags]
+```
+
+### Opções
+
+
+
+
+
+
+
+
+
+
--allow-missing-template-keys Padrão: true
+
+
+
Se verdadeiro (true), ignora quaisquer erros nos modelos quando um campo ou chave de mapa estiver faltando no modelo. Aplica-se apenas aos formatos de saída golang e jsonpath.
+
+
+
+
-o, --experimental-output string Padrão: "text"
+
+
+
Formato de saída. Valores válidos: text|json|yaml|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file.
+
+
+
+
-h, --help
+
+
+
ajuda para list
+
+
+
+
--show-managed-fields
+
+
+
Se verdadeiro (true), mantém os managedFields ao exibir os objetos no formato JSON ou YAML.
O arquivo kubeconfig a ser usado para se comunicar com o cluster. Se a flag não estiver definida, um conjunto de locais predefinidos pode ser pesquisado por um arquivo kubeconfig existente.
+
+
+
+
--rootfs string
+
+
+
[EXPERIMENTAL] O caminho para o 'real' sistema de arquivos raiz do host.
+
+
+
+
+
+
+
diff --git a/content/pt-br/docs/reference/setup-tools/kubeadm/generated/kubeadm_version.md b/content/pt-br/docs/reference/setup-tools/kubeadm/generated/kubeadm_version.md
new file mode 100644
index 0000000000..b248ffcd05
--- /dev/null
+++ b/content/pt-br/docs/reference/setup-tools/kubeadm/generated/kubeadm_version.md
@@ -0,0 +1,72 @@
+
+
+
+Exibe a versão do kubeadm
+
+### Sinopse
+
+
+Exibe a versão do kubeadm
+
+```
+kubeadm version [flags]
+```
+
+### Opções
+
+
+
+
+
+
+
+
+
+
-h, --help
+
+
+
ajuda para version
+
+
+
+
-o, --output string
+
+
+
Formato de saída; as opções disponíveis são 'yaml', 'json' e 'short'
+
+
+
+
+
+
+
+### Opção herdada do comando superior
+
+
+
+
+
+
+
+
+
+
--rootfs string
+
+
+
[EXPERIMENTAL] O caminho para o 'real' sistema de arquivos raiz do host.
+
+
+
+
+
+
+
diff --git a/content/pt-br/docs/reference/setup-tools/kubeadm/kubeadm-token.md b/content/pt-br/docs/reference/setup-tools/kubeadm/kubeadm-token.md
new file mode 100644
index 0000000000..99fcedc04f
--- /dev/null
+++ b/content/pt-br/docs/reference/setup-tools/kubeadm/kubeadm-token.md
@@ -0,0 +1,27 @@
+---
+title: kubeadm token
+content_type: concept
+weight: 70
+---
+
+
+Os Bootstrap tokens são usados para estabelecer uma relação de confiança bidirecional entre um nó que se junta ao cluster e um nó do plano de controle, conforme descrito na [autenticação com tokens de inicialização](/docs/reference/access-authn-authz/bootstrap-tokens/).
+
+O `kubeadm init` cria um token inicial com um TTL de 24 horas. Os comandos a seguir permitem que você gerencie esse token e também crie e gerencie os novos.
+
+
+## kubeadm token create {#cmd-token-create}
+{{< include "generated/kubeadm_token_create.md" >}}
+
+## kubeadm token delete {#cmd-token-delete}
+{{< include "generated/kubeadm_token_delete.md" >}}
+
+## kubeadm token generate {#cmd-token-generate}
+{{< include "generated/kubeadm_token_generate.md" >}}
+
+## kubeadm token list {#cmd-token-list}
+{{< include "generated/kubeadm_token_list.md" >}}
+
+## {{% heading "whatsnext" %}}
+
+* [kubeadm join](/docs/reference/setup-tools/kubeadm/kubeadm-join) para inicializar um nó de carga de trabalho do Kubernetes e associá-lo ao cluster
diff --git a/content/pt-br/docs/reference/setup-tools/kubeadm/kubeadm-version.md b/content/pt-br/docs/reference/setup-tools/kubeadm/kubeadm-version.md
new file mode 100644
index 0000000000..ca2a6a84ce
--- /dev/null
+++ b/content/pt-br/docs/reference/setup-tools/kubeadm/kubeadm-version.md
@@ -0,0 +1,10 @@
+---
+title: kubeadm version
+content_type: concept
+weight: 80
+---
+
+Este comando exibe a versão do kubeadm.
+
+
+{{< include "generated/kubeadm_version.md" >}}
diff --git a/content/pt-br/includes/task-tutorial-prereqs.md b/content/pt-br/includes/task-tutorial-prereqs.md
index eb4177b4fd..66b20b849f 100644
--- a/content/pt-br/includes/task-tutorial-prereqs.md
+++ b/content/pt-br/includes/task-tutorial-prereqs.md
@@ -2,5 +2,5 @@ Você precisa de um cluster Kubernetes e a ferramenta de linha de comando kubect
precisa estar configurada para acessar o seu cluster. Se você ainda não tem um
cluster, pode criar um usando o [minikube](/docs/tasks/tools/#minikube)
ou você pode usar um dos seguintes ambientes:
-* [Katacoda](https://www.katacoda.com/courses/kubernetes/playground)
+* [Killercoda](https://killercoda.com/playgrounds/scenario/kubernetes)
* [Play with Kubernetes](http://labs.play-with-k8s.com/)
diff --git a/content/zh-cn/_index.html b/content/zh-cn/_index.html
index 71688a2e67..3594f0900d 100644
--- a/content/zh-cn/_index.html
+++ b/content/zh-cn/_index.html
@@ -60,21 +60,21 @@ Kubernetes 是开源系统,可以自由地部署在企业内部,私有云、
{{< blocks/section id="video" background-image="kub_video_banner_homepage" >}}
healthzBindAddress 字段是健康状态检查服务器提供服务时所使用的的 IP 地址和端口,
+
healthzBindAddress 字段是健康状态检查服务器提供服务时所使用的 IP 地址和端口,
默认设置为 '0.0.0.0:10256'。
@@ -77,7 +76,7 @@ defaulting to 0.0.0.0:10256
metricsBindAddress is the IP address and port for the metrics server to serve on,
defaulting to 127.0.0.1:10249 (set to 0.0.0.0 for all interfaces)
-->
-
metricsBindAddress 字段是度量值服务器提供服务时所使用的的 IP 地址和端口,
+
metricsBindAddress 字段是指标服务器提供服务时所使用的 IP 地址和端口,
默认设置为 '127.0.0.1:10249'(设置为 0.0.0.0 意味着在所有接口上提供服务)。
@@ -101,7 +100,7 @@ defaulting to 127.0.0.1:10249 (set to 0.0.0.0 for all interfaces)
Profiling handlers will be handled by metrics server.
-->
enableProfiling 字段通过 '/debug/pprof' 处理程序在 Web 界面上启用性能分析。
- 性能分析处理程序将由度量值服务器执行。
+ 性能分析处理程序将由指标服务器执行。
clusterCIDR[必需]
@@ -192,7 +191,7 @@ the range [-1000, 1000]
in order to proxy service traffic. If unspecified (0-0) then ports will be randomly chosen.
-->
udpIdleTimeout[必需]
@@ -244,8 +243,8 @@ An empty string slice is meant to select all network interfaces.
nodePortAddresses 字段是 kube-proxy 进程的
--nodeport-addresses 命令行参数设置。
此值必须是合法的 IP 段。所给的 IP 段会作为参数来选择 NodePort 类型服务所使用的接口。
- 如果有人希望将本地主机(Localhost)上的服务暴露给本地访问,同时暴露在某些其他网络接口上
- 以实现某种目标,可以使用 IP 段的列表。
+ 如果有人希望将本地主机(Localhost)上的服务暴露给本地访问,
+ 同时暴露在某些其他网络接口上以实现某种目标,可以使用 IP 段的列表。
如果此值被设置为 "127.0.0.0/8",则 kube-proxy 将仅为 NodePort
服务选择本地回路(loopback)接口。
如果此值被设置为非零的 IP 段,则 kube-proxy 会对 IP 作过滤,仅使用适用于当前节点的 IP 地址。
@@ -270,7 +269,7 @@ An empty string slice is meant to select all network interfaces.
ShowHiddenMetricsForVersion is the version for which you want to show hidden metrics.
-->