diff --git a/content/en/_index.html b/content/en/_index.html index 08ff1658d4..e5b4f1922c 100644 --- a/content/en/_index.html +++ b/content/en/_index.html @@ -46,7 +46,7 @@ Kubernetes is open source giving you the freedom to take advantage of on-premise


- Attend KubeCon in Boston on November 17-20, 2020 + Attend KubeCon NA virtually on November 17-20, 2020
diff --git a/content/en/docs/concepts/cluster-administration/flow-control.md b/content/en/docs/concepts/cluster-administration/flow-control.md index 2380fa6a40..2d2abb7b26 100644 --- a/content/en/docs/concepts/cluster-administration/flow-control.md +++ b/content/en/docs/concepts/cluster-administration/flow-control.md @@ -162,6 +162,31 @@ are built in and may not be overwritten: that only matches the `catch-all` FlowSchema will be rejected with an HTTP 429 error. +## Health check concurrency exemption + +The suggested configuration gives no special treatment to the health +check requests on kube-apiservers from their local kubelets --- which +tend to use the secured port but supply no credentials. With the +suggested config, these requests get assigned to the `global-default` +FlowSchema and the corresponding `global-default` priority level, +where other traffic can crowd them out. + +If you add the following additional FlowSchema, this exempts those +requests from rate limiting. + +{{< caution >}} + +Making this change also allows any hostile party to then send +health-check requests that match this FlowSchema, at any volume they +like. If you have a web traffic filter or similar external security +mechanism to protect your cluster's API server from general internet +traffic, you can configure rules to block any health check requests +that originate from outside your cluster. + +{{< /caution >}} + +{{< codenew file="priority-and-fairness/health-for-strangers.yaml" >}} + ## Resources The flow control API involves two kinds of resources. [PriorityLevelConfigurations](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#prioritylevelconfiguration-v1alpha1-flowcontrol-apiserver-k8s-io) diff --git a/content/en/docs/concepts/containers/images.md b/content/en/docs/concepts/containers/images.md index ee21a00526..e136da173a 100644 --- a/content/en/docs/concepts/containers/images.md +++ b/content/en/docs/concepts/containers/images.md @@ -259,7 +259,7 @@ EOF This needs to be done for each pod that is using a private registry. However, setting of this field can be automated by setting the imagePullSecrets -in a [ServiceAccount](/docs/tasks/configure-pod-container/configure-service-accounts/) resource. +in a [ServiceAccount](/docs/tasks/configure-pod-container/configure-service-account/) resource. Check [Add ImagePullSecrets to a Service Account](/docs/tasks/configure-pod-container/configure-service-account/#add-imagepullsecrets-to-a-service-account) for detailed instructions. diff --git a/content/en/docs/concepts/extend-kubernetes/extend-cluster.md b/content/en/docs/concepts/extend-kubernetes/extend-cluster.md index 7f5fe11807..76c72e74e4 100644 --- a/content/en/docs/concepts/extend-kubernetes/extend-cluster.md +++ b/content/en/docs/concepts/extend-kubernetes/extend-cluster.md @@ -97,7 +97,7 @@ This diagram shows the extension points in a Kubernetes system. 1. Users often interact with the Kubernetes API using `kubectl`. [Kubectl plugins](/docs/tasks/extend-kubectl/kubectl-plugins/) extend the kubectl binary. They only affect the individual user's local environment, and so cannot enforce site-wide policies. 2. The apiserver handles all requests. Several types of extension points in the apiserver allow authenticating requests, or blocking them based on their content, editing content, and handling deletion. These are described in the [API Access Extensions](/docs/concepts/extend-kubernetes/#api-access-extensions) section. 3. The apiserver serves various kinds of *resources*. *Built-in resource kinds*, like `pods`, are defined by the Kubernetes project and can't be changed. You can also add resources that you define, or that other projects have defined, called *Custom Resources*, as explained in the [Custom Resources](/docs/concepts/extend-kubernetes/#user-defined-types) section. Custom Resources are often used with API Access Extensions. -4. The Kubernetes scheduler decides which nodes to place pods on. There are several ways to extend scheduling. These are described in the [Scheduler Extensions](/docs/concepts/overview/extending#scheduler-extensions) section. +4. The Kubernetes scheduler decides which nodes to place pods on. There are several ways to extend scheduling. These are described in the [Scheduler Extensions](/docs/concepts/extend-kubernetes/#scheduler-extensions) section. 5. Much of the behavior of Kubernetes is implemented by programs called Controllers which are clients of the API-Server. Controllers are often used in conjunction with Custom Resources. 6. The kubelet runs on servers, and helps pods appear like virtual servers with their own IPs on the cluster network. [Network Plugins](/docs/concepts/extend-kubernetes/#network-plugins) allow for different implementations of pod networking. 7. The kubelet also mounts and unmounts volumes for containers. New types of storage can be supported via [Storage Plugins](/docs/concepts/extend-kubernetes/#storage-plugins). diff --git a/content/en/docs/concepts/services-networking/network-policies.md b/content/en/docs/concepts/services-networking/network-policies.md index 93d798ce37..66e1a4fb39 100644 --- a/content/en/docs/concepts/services-networking/network-policies.md +++ b/content/en/docs/concepts/services-networking/network-policies.md @@ -8,8 +8,6 @@ content_type: concept weight: 50 --- -{{< toc >}} - A network policy is a specification of how groups of {{< glossary_tooltip text="pods" term_id="pod">}} are allowed to communicate with each other and other network endpoints. diff --git a/content/en/docs/concepts/storage/persistent-volumes.md b/content/en/docs/concepts/storage/persistent-volumes.md index 132e397e75..4933513929 100644 --- a/content/en/docs/concepts/storage/persistent-volumes.md +++ b/content/en/docs/concepts/storage/persistent-volumes.md @@ -254,6 +254,16 @@ FlexVolume resize is possible only when the underlying driver supports resize. Expanding EBS volumes is a time-consuming operation. Also, there is a per-volume quota of one modification every 6 hours. {{< /note >}} +#### Recovering from Failure when Expanding Volumes + +If expanding underlying storage fails, the cluster administrator can manually recover the Persistent Volume Claim (PVC) state and cancel the resize requests. Otherwise, the resize requests are continuously retried by the controller without administrator intervention. + +1. Mark the PersistentVolume(PV) that is bound to the PersistentVolumeClaim(PVC) with `Retain` reclaim policy. +2. Delete the PVC. Since PV has `Retain` reclaim policy - we will not loose any data when we recreate the PVC. +3. Delete the `claimRef` entry from PV specs, so as new PVC can bind to it. This should make the PV `Available`. +4. Re-create the PVC with smaller size than PV and set `volumeName` field of the PVC to the name of the PV. This should bind new PVC to existing PV. +5. Don't forget to restore the reclaim policy of the PV. + ## Types of Persistent Volumes diff --git a/content/en/docs/concepts/workloads/pods/_index.md b/content/en/docs/concepts/workloads/pods/_index.md index c7408721b7..90dd7b5618 100644 --- a/content/en/docs/concepts/workloads/pods/_index.md +++ b/content/en/docs/concepts/workloads/pods/_index.md @@ -19,7 +19,7 @@ A _Pod_ (as in a pod of whales or pea pod) is a group of one or more for how to run the containers. A Pod's contents are always co-located and co-scheduled, and run in a shared context. A Pod models an application-specific "logical host": it contains one or more application -containers which are relatively tightly coupled. +containers which are relatively tightly coupled. In non-cloud contexts, applications executed on the same physical or virtual machine are analogous to cloud applications executed on the same logical host. As well as application containers, a Pod can contain @@ -51,7 +51,7 @@ with shared namespaces and shared filesystem volumes. Usually you don't need to create Pods directly, even singleton Pods. Instead, create them using workload resources such as {{< glossary_tooltip text="Deployment" term_id="deployment" >}} or {{< glossary_tooltip text="Job" term_id="job" >}}. -If your Pods need to track state, consider the +If your Pods need to track state, consider the {{< glossary_tooltip text="StatefulSet" term_id="statefulset" >}} resource. Pods in a Kubernetes cluster are used in two main ways: @@ -65,7 +65,7 @@ Pods in a Kubernetes cluster are used in two main ways: tightly coupled and need to share resources. These co-located containers form a single cohesive unit of service—for example, one container serving data stored in a shared volume to the public, while a separate _sidecar_ container - refreshes or updates those files. + refreshes or updates those files. The Pod wraps these containers, storage resources, and an ephemeral network identity together as a single unit. @@ -190,7 +190,7 @@ changing existing code. ## Resource sharing and communication Pods enable data sharing and communication among their constituent -containters. +containers. ### Storage in Pods {#pod-storage} @@ -257,8 +257,8 @@ but cannot be controlled from there. * Lean about [RuntimeClass](/docs/concepts/containers/runtime-class/) and how you can use it to configure different Pods with different container runtime configurations. * Read about [Pod topology spread constraints](/docs/concepts/workloads/pods/pod-topology-spread-constraints/). -* Read about [PodDisruptionBudget](https://kubernetes.io/docs/concepts/workloads/pods/disruptions/) and how you can use it to manage application availability during disruptions. -* Pod is a top-level resource in the Kubernetes REST API. +* Read about [PodDisruptionBudget](/docs/concepts/workloads/pods/disruptions/) and how you can use it to manage application availability during disruptions. +* Pod is a top-level resource in the Kubernetes REST API. The [Pod](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#pod-v1-core) object definition describes the object in detail. * [The Distributed System Toolkit: Patterns for Composite Containers](https://kubernetes.io/blog/2015/06/the-distributed-system-toolkit-patterns) explains common layouts for Pods with more than one container. diff --git a/content/en/docs/concepts/workloads/pods/pod-lifecycle.md b/content/en/docs/concepts/workloads/pods/pod-lifecycle.md index 2b292d376d..35fbb562bf 100644 --- a/content/en/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/en/docs/concepts/workloads/pods/pod-lifecycle.md @@ -78,7 +78,7 @@ Here are the possible values for `phase`: Value | Description :-----|:----------- -`Pending` | The Pod has been accepted by the Kubernetes cluster, but one or more of the containers has not been set up and made ready to run. This includes time a Pod spends waiting to bescheduled as well as the time spent downloading container images over the network. +`Pending` | The Pod has been accepted by the Kubernetes cluster, but one or more of the containers has not been set up and made ready to run. This includes time a Pod spends waiting to be scheduled as well as the time spent downloading container images over the network. `Running` | The Pod has been bound to a node, and all of the containers have been created. At least one container is still running, or is in the process of starting or restarting. `Succeeded` | All containers in the Pod have terminated in success, and will not be restarted. `Failed` | All containers in the Pod have terminated, and at least one container has terminated in failure. That is, the container either exited with non-zero status or was terminated by the system. @@ -392,7 +392,7 @@ An example flow: ### Forced Pod termination {#pod-termination-forced} {{< caution >}} -Forced deletions can be potentially disruptiove for some workloads and their Pods. +Forced deletions can be potentially disruptive for some workloads and their Pods. {{< /caution >}} By default, all deletes are graceful within 30 seconds. The `kubectl delete` command supports diff --git a/content/en/docs/concepts/workloads/pods/pod-topology-spread-constraints.md b/content/en/docs/concepts/workloads/pods/pod-topology-spread-constraints.md index 9982ac7240..259acc8a18 100644 --- a/content/en/docs/concepts/workloads/pods/pod-topology-spread-constraints.md +++ b/content/en/docs/concepts/workloads/pods/pod-topology-spread-constraints.md @@ -160,10 +160,10 @@ There are some implicit conventions worth noting here: - Nodes without `topologySpreadConstraints[*].topologyKey` present will be bypassed. It implies that: - 1. the Pods located on those nodes do not impact `maxSkew` calculation - in the above example, suppose "node1" does not have label "zone", then the 2 Pods will be disregarded, hence the incomingPod will be scheduled into "zoneA". + 1. the Pods located on those nodes do not impact `maxSkew` calculation - in the above example, suppose "node1" does not have label "zone", then the 2 Pods will be disregarded, hence the incoming Pod will be scheduled into "zoneA". 2. the incoming Pod has no chances to be scheduled onto this kind of nodes - in the above example, suppose a "node5" carrying label `{zone-typo: zoneC}` joins the cluster, it will be bypassed due to the absence of label key "zone". -- Be aware of what will happen if the incomingPod’s `topologySpreadConstraints[*].labelSelector` doesn’t match its own labels. In the above example, if we remove the incoming Pod’s labels, it can still be placed onto "zoneB" since the constraints are still satisfied. However, after the placement, the degree of imbalance of the cluster remains unchanged - it’s still zoneA having 2 Pods which hold label {foo:bar}, and zoneB having 1 Pod which holds label {foo:bar}. So if this is not what you expect, we recommend the workload’s `topologySpreadConstraints[*].labelSelector` to match its own labels. +- Be aware of what will happen if the incoming Pod’s `topologySpreadConstraints[*].labelSelector` doesn’t match its own labels. In the above example, if we remove the incoming Pod’s labels, it can still be placed onto "zoneB" since the constraints are still satisfied. However, after the placement, the degree of imbalance of the cluster remains unchanged - it’s still zoneA having 2 Pods which hold label {foo:bar}, and zoneB having 1 Pod which holds label {foo:bar}. So if this is not what you expect, we recommend the workload’s `topologySpreadConstraints[*].labelSelector` to match its own labels. - If the incoming Pod has `spec.nodeSelector` or `spec.affinity.nodeAffinity` defined, nodes not matching them will be bypassed. diff --git a/content/en/docs/contribute/_index.md b/content/en/docs/contribute/_index.md index cd1b03efd4..8616f77afb 100644 --- a/content/en/docs/contribute/_index.md +++ b/content/en/docs/contribute/_index.md @@ -53,7 +53,7 @@ roles and permissions. - Read the [Contribution overview](/docs/contribute/new-content/overview/) to learn about the different ways you can contribute. -- Check [kubernetes/website issues list](/https://github.com/kubernetes/website/issues/) +- Check [`kubernetes/website` issues list](https://github.com/kubernetes/website/issues/) for issues that make good entry points. - [Open a pull request using GitHub](/docs/contribute/new-content/open-a-pr/#changes-using-github) to existing documentation and learn more about filing issues in GitHub. diff --git a/content/en/docs/reference/_index.md b/content/en/docs/reference/_index.md index af25359434..06eeb347d8 100644 --- a/content/en/docs/reference/_index.md +++ b/content/en/docs/reference/_index.md @@ -35,7 +35,7 @@ client libraries: ## CLI Reference * [kubectl](/docs/reference/kubectl/overview/) - Main CLI tool for running commands and managing Kubernetes clusters. - * [JSONPath](/docs/reference/kubectl/jsonpath/) - Syntax guide for using [JSONPath expressions](http://goessner.net/articles/JsonPath/) with kubectl. + * [JSONPath](/docs/reference/kubectl/jsonpath/) - Syntax guide for using [JSONPath expressions](https://goessner.net/articles/JsonPath/) with kubectl. * [kubeadm](/docs/reference/setup-tools/kubeadm/kubeadm/) - CLI tool to easily provision a secure Kubernetes cluster. ## Components Reference @@ -50,6 +50,8 @@ client libraries: ## Design Docs -An archive of the design docs for Kubernetes functionality. Good starting points are [Kubernetes Architecture](https://git.k8s.io/community/contributors/design-proposals/architecture/architecture.md) and [Kubernetes Design Overview](https://git.k8s.io/community/contributors/design-proposals). +An archive of the design docs for Kubernetes functionality. Good starting points are +[Kubernetes Architecture](https://git.k8s.io/community/contributors/design-proposals/architecture/architecture.md) and +[Kubernetes Design Overview](https://git.k8s.io/community/contributors/design-proposals). diff --git a/content/en/docs/reference/access-authn-authz/_index.md b/content/en/docs/reference/access-authn-authz/_index.md index d4966d99a5..4e1bff0818 100644 --- a/content/en/docs/reference/access-authn-authz/_index.md +++ b/content/en/docs/reference/access-authn-authz/_index.md @@ -1,5 +1,4 @@ --- title: Accessing the API weight: 20 -toc-hide: true --- \ No newline at end of file diff --git a/content/en/docs/reference/access-authn-authz/abac.md b/content/en/docs/reference/access-authn-authz/abac.md index 3810942660..99fce41aba 100644 --- a/content/en/docs/reference/access-authn-authz/abac.md +++ b/content/en/docs/reference/access-authn-authz/abac.md @@ -18,7 +18,7 @@ Attribute-based access control (ABAC) defines an access control paradigm whereby To enable `ABAC` mode, specify `--authorization-policy-file=SOME_FILENAME` and `--authorization-mode=ABAC` on startup. -The file format is [one JSON object per line](http://jsonlines.org/). There +The file format is [one JSON object per line](https://jsonlines.org/). There should be no enclosing list or map, just one map per line. Each line is a "policy object", where each such object is a map with the following @@ -127,7 +127,7 @@ up the verbosity: {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"group": "system:unauthenticated", "readonly": true, "nonResourcePath": "*"}} ``` -[Complete file example](http://releases.k8s.io/{{< param "githubbranch" >}}/pkg/auth/authorizer/abac/example_policy_file.jsonl) +[Complete file example](https://releases.k8s.io/{{< param "githubbranch" >}}/pkg/auth/authorizer/abac/example_policy_file.jsonl) ## A quick note on service accounts diff --git a/content/en/docs/reference/access-authn-authz/admission-controllers.md b/content/en/docs/reference/access-authn-authz/admission-controllers.md index 7e1f8ced66..fda7119caf 100644 --- a/content/en/docs/reference/access-authn-authz/admission-controllers.md +++ b/content/en/docs/reference/access-authn-authz/admission-controllers.md @@ -25,8 +25,8 @@ is authenticated and authorized. The controllers consist of the `kube-apiserver` binary, and may only be configured by the cluster administrator. In that list, there are two special controllers: MutatingAdmissionWebhook and ValidatingAdmissionWebhook. These execute the -mutating and validating (respectively) [admission control -webhooks](/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks) +mutating and validating (respectively) +[admission control webhooks](/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks) which are configured in the API. Admission controllers may be "validating", "mutating", or both. Mutating @@ -351,7 +351,10 @@ plugins: {{% /tab %}} {{< /tabs >}} -The ImagePolicyWebhook config file must reference a [kubeconfig](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/) formatted file which sets up the connection to the backend. It is required that the backend communicate over TLS. +The ImagePolicyWebhook config file must reference a +[kubeconfig](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/) +formatted file which sets up the connection to the backend. +It is required that the backend communicate over TLS. The kubeconfig file's cluster field must point to the remote service, and the user field must contain the returned authorizer. @@ -371,7 +374,8 @@ users: client-key: /path/to/key.pem # key matching the cert ``` -For additional HTTP configuration, refer to the [kubeconfig](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/) documentation. +For additional HTTP configuration, refer to the +[kubeconfig](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/) documentation. #### Request Payloads @@ -454,7 +458,8 @@ your Kubernetes deployment, you MUST use this admission controller to enforce th be used to apply default resource requests to Pods that don't specify any; currently, the default LimitRanger applies a 0.1 CPU requirement to all Pods in the `default` namespace. -See the [limitRange design doc](https://git.k8s.io/community/contributors/design-proposals/resource-management/admission_control_limit_range.md) and the [example of Limit Range](/docs/tasks/configure-pod-container/limit-range/) for more details. +See the [limitRange design doc](https://git.k8s.io/community/contributors/design-proposals/resource-management/admission_control_limit_range.md) +and the [example of Limit Range](/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/) for more details. ### MutatingAdmissionWebhook {#mutatingadmissionwebhook} @@ -731,16 +736,30 @@ for more information. ### SecurityContextDeny {#securitycontextdeny} -This admission controller will deny any pod that attempts to set certain escalating [SecurityContext](/docs/user-guide/security-context) fields. This should be enabled if a cluster doesn't utilize [pod security policies](/docs/user-guide/pod-security-policy) to restrict the set of values a security context can take. +This admission controller will deny any pod that attempts to set certain escalating +[SecurityContext](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#securitycontext-v1-core) +fields, as shown in the +[Configure a Security Context for a Pod or Container](/docs/tasks/configure-pod-container/security-context/) +task. +This should be enabled if a cluster doesn't utilize +[pod security policies](/docs/concepts/policy/pod-security-policy/) +to restrict the set of values a security context can take. ### ServiceAccount {#serviceaccount} -This admission controller implements automation for [serviceAccounts](/docs/user-guide/service-accounts). +This admission controller implements automation for +[serviceAccounts](/docs/tasks/configure-pod-container/configure-service-account/). We strongly recommend using this admission controller if you intend to make use of Kubernetes `ServiceAccount` objects. ### StorageObjectInUseProtection -The `StorageObjectInUseProtection` plugin adds the `kubernetes.io/pvc-protection` or `kubernetes.io/pv-protection` finalizers to newly created Persistent Volume Claims (PVCs) or Persistent Volumes (PV). In case a user deletes a PVC or PV the PVC or PV is not removed until the finalizer is removed from the PVC or PV by PVC or PV Protection Controller. Refer to the [Storage Object in Use Protection](/docs/concepts/storage/persistent-volumes/#storage-object-in-use-protection) for more detailed information. +The `StorageObjectInUseProtection` plugin adds the `kubernetes.io/pvc-protection` or `kubernetes.io/pv-protection` +finalizers to newly created Persistent Volume Claims (PVCs) or Persistent Volumes (PV). +In case a user deletes a PVC or PV the PVC or PV is not removed until the finalizer is removed +from the PVC or PV by PVC or PV Protection Controller. +Refer to the +[Storage Object in Use Protection](/docs/concepts/storage/persistent-volumes/#storage-object-in-use-protection) +for more detailed information. ### TaintNodesByCondition {#taintnodesbycondition} diff --git a/content/en/docs/reference/access-authn-authz/authentication.md b/content/en/docs/reference/access-authn-authz/authentication.md index 9d6e7b3327..bd936615a8 100644 --- a/content/en/docs/reference/access-authn-authz/authentication.md +++ b/content/en/docs/reference/access-authn-authz/authentication.md @@ -20,13 +20,24 @@ This page provides an overview of authenticating. All Kubernetes clusters have two categories of users: service accounts managed by Kubernetes, and normal users. -Normal users are assumed to be managed by an outside, independent service. An -admin distributing private keys, a user store like Keystone or Google Accounts, -even a file with a list of usernames and passwords. In this regard, _Kubernetes -does not have objects which represent normal user accounts._ Normal users -cannot be added to a cluster through an API call. +It is assumed that a cluster-independent service manages normal users in the following ways: -Even though normal user cannot be added via an API call, but any user that presents a valid certificate signed by the cluster’s certificate authority (CA) is considered authenticated. In this configuration, Kubernetes determines the username from the common name field in the ‘subject’ of the cert (e.g., “/CN=bob”). From there, the role based access control (RBAC) sub-system would determine whether the user is authorized to perform a specific operation on a resource. You can refer to [creating user certificate request](/docs/reference/access-authn-authz/certificate-signing-requests/#user-csr) for more details about this. +- an administrator distributing private keys +- a user store like Keystone or Google Accounts +- a file with a list of usernames and passwords + +In this regard, _Kubernetes does not have objects which represent normal user +accounts._ Normal users cannot be added to a cluster through an API call. + +Even though normal user cannot be added via an API call, but any user that +presents a valid certificate signed by the cluster’s certificate authority +(CA) is considered authenticated. In this configuration, Kubernetes determines +the username from the common name field in the ‘subject’ of the cert (e.g., +“/CN=bob”). From there, the role based access control (RBAC) sub-system would +determine whether the user is authorized to perform a specific operation on a +resource. For more details, refer to the normal users topic in +[certificate request](/docs/reference/access-authn-authz/certificate-signing-requests/#normal-user) +for more details about this. In contrast, service accounts are users managed by the Kubernetes API. They are bound to specific namespaces, and created automatically by the API server or @@ -315,8 +326,12 @@ wish to utilize multiple OAuth clients should explore providers which support th tokens on behalf of another. Kubernetes does not provide an OpenID Connect Identity Provider. -You can use an existing public OpenID Connect Identity Provider (such as Google, or [others](http://connect2id.com/products/nimbus-oauth-openid-connect-sdk/openid-connect-providers)). -Or, you can run your own Identity Provider, such as CoreOS [dex](https://github.com/coreos/dex), [Keycloak](https://github.com/keycloak/keycloak), CloudFoundry [UAA](https://github.com/cloudfoundry/uaa), or Tremolo Security's [OpenUnison](https://github.com/tremolosecurity/openunison). +You can use an existing public OpenID Connect Identity Provider (such as Google, or +[others](https://connect2id.com/products/nimbus-oauth-openid-connect-sdk/openid-connect-providers)). +Or, you can run your own Identity Provider, such as CoreOS [dex](https://github.com/coreos/dex), +[Keycloak](https://github.com/keycloak/keycloak), +CloudFoundry [UAA](https://github.com/cloudfoundry/uaa), or +Tremolo Security's [OpenUnison](https://github.com/tremolosecurity/openunison). For an identity provider to work with Kubernetes it must: @@ -400,7 +415,7 @@ Webhook authentication is a hook for verifying bearer tokens. * `--authentication-token-webhook-config-file` a configuration file describing how to access the remote webhook service. * `--authentication-token-webhook-cache-ttl` how long to cache authentication decisions. Defaults to two minutes. -The configuration file uses the [kubeconfig](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/) +The configuration file uses the [kubeconfig](/docs/concepts/configuration/organize-cluster-access-kubeconfig/) file format. Within the file, `clusters` refers to the remote service and `users` refers to the API server webhook. An example would be: diff --git a/content/en/docs/reference/access-authn-authz/authorization.md b/content/en/docs/reference/access-authn-authz/authorization.md index 74c433b8ee..db668f818a 100644 --- a/content/en/docs/reference/access-authn-authz/authorization.md +++ b/content/en/docs/reference/access-authn-authz/authorization.md @@ -138,8 +138,6 @@ field of the returned object is the result of the query. ```bash kubectl create -f - -o yaml << EOF -``` -``` apiVersion: authorization.k8s.io/v1 kind: SelfSubjectAccessReview spec: @@ -149,7 +147,10 @@ spec: verb: create namespace: dev EOF +``` +The generated `SelfSubjectAccessReview` is: +``` apiVersion: authorization.k8s.io/v1 kind: SelfSubjectAccessReview metadata: diff --git a/content/en/docs/reference/access-authn-authz/extensible-admission-controllers.md b/content/en/docs/reference/access-authn-authz/extensible-admission-controllers.md index a9db3b00eb..a3f4f9c5b9 100644 --- a/content/en/docs/reference/access-authn-authz/extensible-admission-controllers.md +++ b/content/en/docs/reference/access-authn-authz/extensible-admission-controllers.md @@ -589,7 +589,7 @@ Example of a response to forbid a request, customizing the HTTP status code and When allowing a request, a mutating admission webhook may optionally modify the incoming object as well. This is done using the `patch` and `patchType` fields in the response. The only currently supported `patchType` is `JSONPatch`. -See [JSON patch](http://jsonpatch.com/) documentation for more details. +See [JSON patch](https://jsonpatch.com/) documentation for more details. For `patchType: JSONPatch`, the `patch` field contains a base64-encoded array of JSON patch operations. As an example, a single patch operation that would set `spec.replicas` would be `[{"op": "add", "path": "/spec/replicas", "value": 3}]` diff --git a/content/en/docs/reference/access-authn-authz/service-accounts-admin.md b/content/en/docs/reference/access-authn-authz/service-accounts-admin.md index 6d2cf76573..df653a206f 100644 --- a/content/en/docs/reference/access-authn-authz/service-accounts-admin.md +++ b/content/en/docs/reference/access-authn-authz/service-accounts-admin.md @@ -10,8 +10,8 @@ weight: 50 --- -This is a Cluster Administrator guide to service accounts. It assumes knowledge of -the [User Guide to Service Accounts](/docs/user-guide/service-accounts). +This is a Cluster Administrator guide to service accounts. You should be familiar with +[configuring Kubernetes service accounts](/docs/tasks/configure-pod-container/configure-service-account/). Support for authorization and user accounts is planned but incomplete. Sometimes incomplete features are referred to in order to better describe service accounts. diff --git a/content/en/docs/reference/command-line-tools-reference/_index.md b/content/en/docs/reference/command-line-tools-reference/_index.md index 5bcfe659c0..6698fe66c0 100644 --- a/content/en/docs/reference/command-line-tools-reference/_index.md +++ b/content/en/docs/reference/command-line-tools-reference/_index.md @@ -1,5 +1,4 @@ --- title: Command line tools reference weight: 60 -toc-hide: true --- diff --git a/content/en/docs/reference/command-line-tools-reference/feature-gates.md b/content/en/docs/reference/command-line-tools-reference/feature-gates.md index a2d2e08506..806d7a2021 100644 --- a/content/en/docs/reference/command-line-tools-reference/feature-gates.md +++ b/content/en/docs/reference/command-line-tools-reference/feature-gates.md @@ -417,11 +417,11 @@ Each feature gate is designed for enabling/disabling a specific feature: - `CustomResourceDefaulting`: Enable CRD support for default values in OpenAPI v3 validation schemas. - `CustomResourcePublishOpenAPI`: Enables publishing of CRD OpenAPI specs. - `CustomResourceSubresources`: Enable `/status` and `/scale` subresources - on resources created from [CustomResourceDefinition](/docs/concepts/api-extension/custom-resources/). + on resources created from [CustomResourceDefinition](/docs/concepts/extend-kubernetes/api-extension/custom-resources/). - `CustomResourceValidation`: Enable schema based validation on resources created from - [CustomResourceDefinition](/docs/concepts/api-extension/custom-resources/). + [CustomResourceDefinition](/docs/concepts/extend-kubernetes/api-extension/custom-resources/). - `CustomResourceWebhookConversion`: Enable webhook-based conversion - on resources created from [CustomResourceDefinition](/docs/concepts/api-extension/custom-resources/). + on resources created from [CustomResourceDefinition](/docs/concepts/extend-kubernetes/api-extension/custom-resources/). troubleshoot a running Pod. - `DisableAcceleratorUsageMetrics`: [Disable accelerator metrics collected by the kubelet](/docs/concepts/cluster-administration/monitoring.md). - `DevicePlugins`: Enable the [device-plugins](/docs/concepts/cluster-administration/device-plugins/) @@ -475,6 +475,9 @@ Each feature gate is designed for enabling/disabling a specific feature: - `LegacyNodeRoleBehavior`: When disabled, legacy behavior in service load balancers and node disruption will ignore the `node-role.kubernetes.io/master` label in favor of the feature-specific labels provided by `NodeDisruptionExclusion` and `ServiceNodeExclusion`. - `LocalStorageCapacityIsolation`: Enable the consumption of [local ephemeral storage](/docs/concepts/configuration/manage-compute-resources-container/) and also the `sizeLimit` property of an [emptyDir volume](/docs/concepts/storage/volumes/#emptydir). - `LocalStorageCapacityIsolationFSQuotaMonitoring`: When `LocalStorageCapacityIsolation` is enabled for [local ephemeral storage](/docs/concepts/configuration/manage-compute-resources-container/) and the backing filesystem for [emptyDir volumes](/docs/concepts/storage/volumes/#emptydir) supports project quotas and they are enabled, use project quotas to monitor [emptyDir volume](/docs/concepts/storage/volumes/#emptydir) storage consumption rather than filesystem walk for better performance and accuracy. + [local ephemeral storage](/docs/concepts/configuration/manage-resources-containers/) and the backing filesystem for + [emptyDir volumes](/docs/concepts/storage/volumes/#emptydir) supports project quotas and they are enabled, use project quotas to monitor + [emptyDir volume](/docs/concepts/storage/volumes/#emptydir) storage consumption rather than filesystem walk for better performance and accuracy. - `MountContainers`: Enable using utility containers on host as the volume mounter. - `MountPropagation`: Enable sharing volume mounted by one container to other containers or pods. For more details, please see [mount propagation](/docs/concepts/storage/volumes/#mount-propagation). diff --git a/content/en/docs/reference/glossary/cri-o.md b/content/en/docs/reference/glossary/cri-o.md index a2c61e6984..d94e0eaf15 100644 --- a/content/en/docs/reference/glossary/cri-o.md +++ b/content/en/docs/reference/glossary/cri-o.md @@ -17,7 +17,7 @@ A tool that lets you use OCI container runtimes with Kubernetes CRI. CRI-O is an implementation of the {{< glossary_tooltip term_id="cri" >}} to enable using {{< glossary_tooltip text="container" term_id="container" >}} runtimes that are compatible with the Open Container Initiative (OCI) -[runtime spec](http://www.github.com/opencontainers/runtime-spec). +[runtime spec](https://www.github.com/opencontainers/runtime-spec). Deploying CRI-O allows Kubernetes to use any OCI-compliant runtime as the container runtime for running {{< glossary_tooltip text="Pods" term_id="pod" >}}, and to fetch diff --git a/content/en/docs/reference/glossary/managed-service.md b/content/en/docs/reference/glossary/managed-service.md index 61ac76aabd..186588252c 100755 --- a/content/en/docs/reference/glossary/managed-service.md +++ b/content/en/docs/reference/glossary/managed-service.md @@ -14,4 +14,9 @@ tags: -Some examples of Managed Services are AWS EC2, Azure SQL Database, and GCP Pub/Sub, but they can be any software offering that can be used by an application. [Service Catalog](/docs/concepts/service-catalog/) provides a way to list, provision, and bind with Managed Services offered by {{< glossary_tooltip text="Service Brokers" term_id="service-broker" >}}. +Some examples of Managed Services are AWS EC2, Azure SQL Database, and +GCP Pub/Sub, but they can be any software offering that can be used by an application. +[Service Catalog](/docs/concepts/extend-kubernetes/service-catalog/) provides a way to +list, provision, and bind with Managed Services offered by +{{< glossary_tooltip text="Service Brokers" term_id="service-broker" >}}. + diff --git a/content/en/docs/reference/glossary/platform-developer.md b/content/en/docs/reference/glossary/platform-developer.md index ed9a5fa1b7..ed961c27f2 100755 --- a/content/en/docs/reference/glossary/platform-developer.md +++ b/content/en/docs/reference/glossary/platform-developer.md @@ -14,5 +14,10 @@ tags: -A platform developer may, for example, use [Custom Resources](/docs/concepts/api-extension/custom-resources/) or [Extend the Kubernetes API with the aggregation layer](/docs/concepts/api-extension/apiserver-aggregation/) to add functionality to their instance of Kubernetes, specifically for their application. Some Platform Developers are also {{< glossary_tooltip text="contributors" term_id="contributor" >}} and develop extensions which are contributed to the Kubernetes community. Others develop closed-source commercial or site-specific extensions. +A platform developer may, for example, use [Custom Resources](/docs/concepts/extend-Kubernetes/api-extension/custom-resources/) or +[Extend the Kubernetes API with the aggregation layer](/docs/concepts/extend-Kubernetes/api-extension/apiserver-aggregation/) +to add functionality to their instance of Kubernetes, specifically for their application. +Some Platform Developers are also {{< glossary_tooltip text="contributors" term_id="contributor" >}} and +develop extensions which are contributed to the Kubernetes community. +Others develop closed-source commercial or site-specific extensions. diff --git a/content/en/docs/reference/glossary/service-broker.md b/content/en/docs/reference/glossary/service-broker.md index 84fc8367a1..d35ea3d688 100755 --- a/content/en/docs/reference/glossary/service-broker.md +++ b/content/en/docs/reference/glossary/service-broker.md @@ -14,4 +14,9 @@ tags: -{{< glossary_tooltip text="Service Brokers" term_id="service-broker" >}} implement the [Open Service Broker API spec](https://github.com/openservicebrokerapi/servicebroker/blob/v2.13/spec.md) and provide a standard interface for applications to use their Managed Services. [Service Catalog](/docs/concepts/service-catalog/) provides a way to list, provision, and bind with Managed Services offered by Service Brokers. +{{< glossary_tooltip text="Service Brokers" term_id="service-broker" >}} implement the +[Open Service Broker API spec](https://github.com/openservicebrokerapi/servicebroker/blob/v2.13/spec.md) +and provide a standard interface for applications to use their Managed Services. +[Service Catalog](/docs/concepts/extend-kubernetes/service-catalog/) provides a way to +list, provision, and bind with Managed Services offered by Service Brokers. + diff --git a/content/en/docs/reference/issues-security/_index.md b/content/en/docs/reference/issues-security/_index.md index ec7a38abe1..530e98bf61 100644 --- a/content/en/docs/reference/issues-security/_index.md +++ b/content/en/docs/reference/issues-security/_index.md @@ -1,5 +1,4 @@ --- title: Kubernetes Issues and Security weight: 10 -toc-hide: true --- \ No newline at end of file diff --git a/content/en/docs/reference/kubectl/cheatsheet.md b/content/en/docs/reference/kubectl/cheatsheet.md index dda75574a9..71f7e6d3f7 100644 --- a/content/en/docs/reference/kubectl/cheatsheet.md +++ b/content/en/docs/reference/kubectl/cheatsheet.md @@ -204,6 +204,13 @@ kubectl get events --sort-by=.metadata.creationTimestamp # Compares the current state of the cluster against the state that the cluster would be in if the manifest was applied. kubectl diff -f ./my-manifest.yaml + +# Produce a period-delimited tree of all keys returned for nodes +# Helpful when locating a key within a complex nested JSON structure +kubectl get nodes -o json | jq -c 'path(..)|[.[]|tostring]|join(".")' + +# Produce a period-delimited tree of all keys returned for pods, etc +kubectl get pods -o json | jq -c 'path(..)|[.[]|tostring]|join(".")' ``` ## Updating Resources diff --git a/content/en/docs/reference/kubectl/overview.md b/content/en/docs/reference/kubectl/overview.md index 66d63c4b93..a9177da9f5 100644 --- a/content/en/docs/reference/kubectl/overview.md +++ b/content/en/docs/reference/kubectl/overview.md @@ -10,11 +10,16 @@ card: --- -The kubectl command line tool lets you control Kubernetes clusters. For configuration, `kubectl` looks for a file named `config` in the `$HOME/.kube` directory. You can specify other [kubeconfig](/docs/concepts/configuration/organize-cluster-access-kubeconfig/) files by setting the KUBECONFIG environment variable or by setting the [`--kubeconfig`](/docs/concepts/configuration/organize-cluster-access-kubeconfig/) flag. - -This overview covers `kubectl` syntax, describes the command operations, and provides common examples. For details about each command, including all the supported flags and subcommands, see the [kubectl](/docs/reference/generated/kubectl/kubectl-commands/) reference documentation. For installation instructions see [installing kubectl](/docs/tasks/kubectl/install/). - +The kubectl command line tool lets you control Kubernetes clusters. +For configuration, `kubectl` looks for a file named `config` in the `$HOME/.kube` directory. +You can specify other [kubeconfig](/docs/concepts/configuration/organize-cluster-access-kubeconfig/) +files by setting the KUBECONFIG environment variable or by setting the +[`--kubeconfig`](/docs/concepts/configuration/organize-cluster-access-kubeconfig/) flag. +This overview covers `kubectl` syntax, describes the command operations, and provides common examples. +For details about each command, including all the supported flags and subcommands, see the +[kubectl](/docs/reference/generated/kubectl/kubectl-commands/) reference documentation. +For installation instructions see [installing kubectl](/docs/tasks/tools/install-kubectl/). @@ -28,9 +33,12 @@ kubectl [command] [TYPE] [NAME] [flags] where `command`, `TYPE`, `NAME`, and `flags` are: -* `command`: Specifies the operation that you want to perform on one or more resources, for example `create`, `get`, `describe`, `delete`. +* `command`: Specifies the operation that you want to perform on one or more resources, +for example `create`, `get`, `describe`, `delete`. -* `TYPE`: Specifies the [resource type](#resource-types). Resource types are case-insensitive and you can specify the singular, plural, or abbreviated forms. For example, the following commands produce the same output: +* `TYPE`: Specifies the [resource type](#resource-types). Resource types are case-insensitive and + you can specify the singular, plural, or abbreviated forms. + For example, the following commands produce the same output: ```shell kubectl get pod pod1 @@ -208,11 +216,13 @@ In this example, the following command outputs the details for a single pod as a kubectl get pod web-pod-13je7 -o yaml ``` -Remember: See the [kubectl](/docs/user-guide/kubectl/) reference documentation for details about which output format is supported by each command. +Remember: See the [kubectl](/docs/reference/kubectl/kubectl/) reference documentation +for details about which output format is supported by each command. #### Custom columns -To define custom columns and output only the details that you want into a table, you can use the `custom-columns` option. You can choose to define the custom columns inline or use a template file: `-o custom-columns=` or `-o custom-columns-file=`. +To define custom columns and output only the details that you want into a table, you can use the `custom-columns` option. +You can choose to define the custom columns inline or use a template file: `-o custom-columns=` or `-o custom-columns-file=`. ##### Examples @@ -496,12 +506,8 @@ kubectl whoami Current user: plugins-user ``` - - - ## {{% heading "whatsnext" %}} - * Start using the [kubectl](/docs/reference/generated/kubectl/kubectl-commands/) commands. * To find out more about plugins, take a look at the [example cli plugin](https://github.com/kubernetes/sample-cli-plugin). diff --git a/content/en/docs/reference/setup-tools/_index.md b/content/en/docs/reference/setup-tools/_index.md index f1c2f4370c..3988d6485e 100644 --- a/content/en/docs/reference/setup-tools/_index.md +++ b/content/en/docs/reference/setup-tools/_index.md @@ -1,5 +1,4 @@ --- title: Setup tools reference weight: 50 -toc-hide: true --- diff --git a/content/en/docs/reference/setup-tools/kubeadm/_index.md b/content/en/docs/reference/setup-tools/kubeadm/_index.md index 6863791207..32c5c6f0a2 100755 --- a/content/en/docs/reference/setup-tools/kubeadm/_index.md +++ b/content/en/docs/reference/setup-tools/kubeadm/_index.md @@ -1,5 +1,30 @@ --- title: "Kubeadm" weight: 10 -toc-hide: true +no_list: true +content_type: concept +card: + name: reference + weight: 40 --- + +Kubeadm is a tool built to provide `kubeadm init` and `kubeadm join` as best-practice “fast paths” for creating Kubernetes clusters. + +kubeadm performs the actions necessary to get a minimum viable cluster up and running. By design, it cares only about bootstrapping, not about provisioning machines. Likewise, installing various nice-to-have addons, like the Kubernetes Dashboard, monitoring solutions, and cloud-specific addons, is not in scope. + +Instead, we expect higher-level and more tailored tooling to be built on top of kubeadm, and ideally, using kubeadm as the basis of all deployments will make it easier to create conformant clusters. + +## How to install + +To install kubeadm, see the [installation guide](/docs/setup/production-environment/tools/kubeadm/install-kubeadm). + +## {{% heading "whatsnext" %}} + +* [kubeadm init](/docs/reference/setup-tools/kubeadm/kubeadm-init) to bootstrap a Kubernetes control-plane node +* [kubeadm join](/docs/reference/setup-tools/kubeadm/kubeadm-join) to bootstrap a Kubernetes worker node and join it to the cluster +* [kubeadm upgrade](/docs/reference/setup-tools/kubeadm/kubeadm-upgrade) to upgrade a Kubernetes cluster to a newer version +* [kubeadm config](/docs/reference/setup-tools/kubeadm/kubeadm-config) if you initialized your cluster using kubeadm v1.7.x or lower, to configure your cluster for `kubeadm upgrade` +* [kubeadm token](/docs/reference/setup-tools/kubeadm/kubeadm-token) to manage tokens for `kubeadm join` +* [kubeadm reset](/docs/reference/setup-tools/kubeadm/kubeadm-reset) to revert any changes made to this host by `kubeadm init` or `kubeadm join` +* [kubeadm version](/docs/reference/setup-tools/kubeadm/kubeadm-version) to print the kubeadm version +* [kubeadm alpha](/docs/reference/setup-tools/kubeadm/kubeadm-alpha) to preview a set of features made available for gathering feedback from the community diff --git a/content/en/docs/reference/setup-tools/kubeadm/implementation-details.md b/content/en/docs/reference/setup-tools/kubeadm/implementation-details.md index cb42a34df9..6abc42c131 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/implementation-details.md +++ b/content/en/docs/reference/setup-tools/kubeadm/implementation-details.md @@ -15,7 +15,6 @@ However, it might not be obvious _how_ kubeadm does that. This document provides additional details on what happen under the hood, with the aim of sharing knowledge on Kubernetes cluster best practices. - ## Core design principles @@ -518,6 +517,7 @@ Please note that: - The automatic CSR approval is managed by the csrapprover controller, according with configuration done the `kubeadm init` process ### (optional) Write init kubelet configuration + {{< feature-state for_k8s_version="v1.9" state="alpha" >}} If kubeadm is invoked with `--feature-gates=DynamicKubeletConfig`: @@ -530,5 +530,3 @@ If kubeadm is invoked with `--feature-gates=DynamicKubeletConfig`: Please note that: 1. To make dynamic kubelet configuration work, flag `--dynamic-config-dir=/var/lib/kubelet/config/dynamic` should be specified in `/etc/systemd/system/kubelet.service.d/10-kubeadm.conf` - - diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-alpha.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-alpha.md index c2356ed966..21a6e628a8 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-alpha.md +++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-alpha.md @@ -3,8 +3,10 @@ reviewers: - luxas - jbeda title: kubeadm alpha +content_type: concept weight: 90 --- + {{< caution >}} `kubeadm alpha` provides a preview of a set of features made available for gathering feedback from the community. Please try it out and give us feedback! @@ -67,7 +69,6 @@ Use the following command to enable the DynamicKubeletConfiguration feature. {{< tab name="enable-dynamic" include="generated/kubeadm_alpha_kubelet_config_enable-dynamic.md" />}} {{< /tabs >}} - ## kubeadm alpha selfhosting pivot {#cmd-selfhosting} The subcommand `pivot` can be used to convert a static Pod-hosted control plane into a self-hosted one. @@ -79,8 +80,8 @@ The subcommand `pivot` can be used to convert a static Pod-hosted control plane {{< tab name="pivot" include="generated/kubeadm_alpha_selfhosting_pivot.md" />}} {{< /tabs >}} +## {{% heading "whatsnext" %}} -## What's next * [kubeadm init](/docs/reference/setup-tools/kubeadm/kubeadm-init/) to bootstrap a Kubernetes control-plane node * [kubeadm join](/docs/reference/setup-tools/kubeadm/kubeadm-join/) to connect a node to the cluster * [kubeadm reset](/docs/reference/setup-tools/kubeadm/kubeadm-reset/) to revert any changes made to this host by `kubeadm init` or `kubeadm join` diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-config.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-config.md index a4b0e501d8..655f9ec875 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-config.md +++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-config.md @@ -6,6 +6,7 @@ title: kubeadm config content_type: concept weight: 50 --- + During `kubeadm init`, kubeadm uploads the `ClusterConfiguration` object to your cluster in a ConfigMap called `kubeadm-config` in the `kube-system` namespace. This configuration is then read during @@ -19,30 +20,31 @@ In Kubernetes v1.13.0 and later to list/pull kube-dns images instead of the Core the `--config` method described [here](/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-addon) has to be used. - - ## kubeadm config view {#cmd-config-view} + {{< include "generated/kubeadm_config_view.md" >}} ## kubeadm config print init-defaults {#cmd-config-print-init-defaults} + {{< include "generated/kubeadm_config_print_init-defaults.md" >}} ## kubeadm config print join-defaults {#cmd-config-print-join-defaults} + {{< include "generated/kubeadm_config_print_join-defaults.md" >}} ## kubeadm config migrate {#cmd-config-migrate} + {{< include "generated/kubeadm_config_migrate.md" >}} ## kubeadm config images list {#cmd-config-images-list} + {{< include "generated/kubeadm_config_images_list.md" >}} ## kubeadm config images pull {#cmd-config-images-pull} + {{< include "generated/kubeadm_config_images_pull.md" >}} - - ## {{% heading "whatsnext" %}} * [kubeadm upgrade](/docs/reference/setup-tools/kubeadm/kubeadm-upgrade/) to upgrade a Kubernetes cluster to a newer version - diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init-phase.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init-phase.md index e3fe8c543c..289767e1e1 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init-phase.md +++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init-phase.md @@ -1,7 +1,9 @@ --- title: kubeadm init phase weight: 90 +content_type: concept --- + `kubeadm init phase` enables you to invoke atomic steps of the bootstrap process. Hence, you can let kubeadm do some of the work and you can fill in the gaps if you wish to apply customization. @@ -80,7 +82,6 @@ Use the following phase to create a local etcd instance based on a static Pod fi {{< tab name="local" include="generated/kubeadm_init_phase_etcd_local.md" />}} {{< /tabs >}} - ## kubeadm init phase upload-config {#cmd-phase-upload-config} You can use this command to upload the kubeadm configuration to your cluster. @@ -93,7 +94,6 @@ Alternatively, you can use [kubeadm config](/docs/reference/setup-tools/kubeadm/ {{< tab name="kubelet" include="generated/kubeadm_init_phase_upload-config_kubelet.md" />}} {{< /tabs >}} - ## kubeadm init phase upload-certs {#cmd-phase-upload-certs} Use the following phase to upload control-plane certificates to the cluster. @@ -103,7 +103,6 @@ By default the certs and encryption key expire after two hours. {{< tab name="upload-certs" include="generated/kubeadm_init_phase_upload-certs.md" />}} {{< /tabs >}} - ## kubeadm init phase mark-control-plane {#cmd-phase-mark-control-plane} Use the following phase to label and taint the node with the `node-role.kubernetes.io/master=""` key-value pair. @@ -112,7 +111,6 @@ Use the following phase to label and taint the node with the `node-role.kubernet {{< tab name="mark-control-plane" include="generated/kubeadm_init_phase_mark-control-plane.md" />}} {{< /tabs >}} - ## kubeadm init phase bootstrap-token {#cmd-phase-bootstrap-token} Use the following phase to configure bootstrap tokens. @@ -156,7 +154,8 @@ Please note that kube-dns usage with kubeadm is deprecated as of v1.18 and will For more details on each field in the `v1beta2` configuration you can navigate to our [API reference pages.] (https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2) -## What's next +## {{% heading "whatsnext" %}} + * [kubeadm init](/docs/reference/setup-tools/kubeadm/kubeadm-init/) to bootstrap a Kubernetes control-plane node * [kubeadm join](/docs/reference/setup-tools/kubeadm/kubeadm-join/) to connect a node to the cluster * [kubeadm reset](/docs/reference/setup-tools/kubeadm/kubeadm-reset/) to revert any changes made to this host by `kubeadm init` or `kubeadm join` diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init.md index 54729065c6..997240399e 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init.md +++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init.md @@ -9,12 +9,12 @@ weight: 20 This command initializes a Kubernetes control-plane node. - {{< include "generated/kubeadm_init.md" >}} ### Init workflow {#init-workflow} + `kubeadm init` bootstraps a Kubernetes control-plane node by executing the following steps: @@ -166,7 +166,7 @@ to download the certificates when additional control-plane nodes are joining, by The following phase command can be used to re-upload the certificates after expiration: -``` +```shell kubeadm init phase upload-certs --upload-certs --certificate-key=SOME_VALUE --config=SOME_YAML_FILE ``` @@ -175,7 +175,7 @@ If the flag `--certificate-key` is not passed to `kubeadm init` and The following command can be used to generate a new key on demand: -``` +```shell kubeadm alpha certs certificate-key ``` @@ -226,26 +226,26 @@ token distribution for easier automation. To implement this automation, you must know the IP address that the control-plane node will have after it is started, or use a DNS name or an address of a load balancer. -1. Generate a token. This token must have the form `<6 character string>.<16 - character string>`. More formally, it must match the regex: - `[a-z0-9]{6}\.[a-z0-9]{16}`. +1. Generate a token. This token must have the form `<6 character string>.<16 + character string>`. More formally, it must match the regex: + `[a-z0-9]{6}\.[a-z0-9]{16}`. - kubeadm can generate a token for you: + kubeadm can generate a token for you: - ```shell + ```shell kubeadm token generate - ``` + ``` -1. Start both the control-plane node and the worker nodes concurrently with this token. - As they come up they should find each other and form the cluster. The same - `--token` argument can be used on both `kubeadm init` and `kubeadm join`. +1. Start both the control-plane node and the worker nodes concurrently with this token. + As they come up they should find each other and form the cluster. The same + `--token` argument can be used on both `kubeadm init` and `kubeadm join`. -1. Similar can be done for `--certificate-key` when joining additional control-plane - nodes. The key can be generated using: +1. Similar can be done for `--certificate-key` when joining additional control-plane + nodes. The key can be generated using: - ```shell - kubeadm alpha certs certificate-key - ``` + ```shell + kubeadm alpha certs certificate-key + ``` Once the cluster is up, you can grab the admin credentials from the control-plane node at `/etc/kubernetes/admin.conf` and use that to talk to the cluster. @@ -255,8 +255,6 @@ it does not allow the root CA hash to be validated with `--discovery-token-ca-cert-hash` (since it's not generated when the nodes are provisioned). For details, see the [kubeadm join](/docs/reference/setup-tools/kubeadm/kubeadm-join/). - - ## {{% heading "whatsnext" %}} * [kubeadm init phase](/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/) to understand more about @@ -264,4 +262,3 @@ provisioned). For details, see the [kubeadm join](/docs/reference/setup-tools/ku * [kubeadm join](/docs/reference/setup-tools/kubeadm/kubeadm-join/) to bootstrap a Kubernetes worker node and join it to the cluster * [kubeadm upgrade](/docs/reference/setup-tools/kubeadm/kubeadm-upgrade/) to upgrade a Kubernetes cluster to a newer version * [kubeadm reset](/docs/reference/setup-tools/kubeadm/kubeadm-reset/) to revert any changes made to this host by `kubeadm init` or `kubeadm join` - diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-join-phase.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-join-phase.md index c26c0a2e4b..c41054b543 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-join-phase.md +++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-join-phase.md @@ -1,7 +1,9 @@ --- title: kubeadm join phase weight: 90 +content_type: concept --- + `kubeadm join phase` enables you to invoke atomic steps of the join process. Hence, you can let kubeadm do some of the work and you can fill in the gaps if you wish to apply customization. @@ -56,7 +58,8 @@ Using this phase you can join a node as a control-plane instance. {{< tab name="mark-control-plane" include="generated/kubeadm_join_phase_control-plane-join_mark-control-plane.md" />}} {{< /tabs >}} -## What's next +## {{% heading "whatsnext" %}} + * [kubeadm init](/docs/reference/setup-tools/kubeadm/kubeadm-init/) to bootstrap a Kubernetes control-plane node * [kubeadm join](/docs/reference/setup-tools/kubeadm/kubeadm-join/) to connect a node to the cluster * [kubeadm reset](/docs/reference/setup-tools/kubeadm/kubeadm-reset/) to revert any changes made to this host by `kubeadm init` or `kubeadm join` diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-join.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-join.md index d83fb98436..28d489cfb6 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-join.md +++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-join.md @@ -9,7 +9,6 @@ weight: 30 This command initializes a Kubernetes worker node and joins it to the cluster. - {{< include "generated/kubeadm_join.md" >}} @@ -105,18 +104,18 @@ if the `kubeadm init` command was called with `--upload-certs`. **Advantages:** - - Allows bootstrapping nodes to securely discover a root of trust for the - control-plane node even if other worker nodes or the network are compromised. +- Allows bootstrapping nodes to securely discover a root of trust for the + control-plane node even if other worker nodes or the network are compromised. - - Convenient to execute manually since all of the information required fits - into a single `kubeadm join` command that is easy to copy and paste. +- Convenient to execute manually since all of the information required fits + into a single `kubeadm join` command that is easy to copy and paste. **Disadvantages:** - - The CA hash is not normally known until the control-plane node has been provisioned, - which can make it more difficult to build automated provisioning tools that - use kubeadm. By generating your CA in beforehand, you may workaround this - limitation. +- The CA hash is not normally known until the control-plane node has been provisioned, + which can make it more difficult to build automated provisioning tools that + use kubeadm. By generating your CA in beforehand, you may workaround this + limitation. #### Token-based discovery without CA pinning @@ -134,18 +133,18 @@ kubeadm join --token abcdef.1234567890abcdef --discovery-token-unsafe-skip-ca-ve **Advantages:** - - Still protects against many network-level attacks. +- Still protects against many network-level attacks. - - The token can be generated ahead of time and shared with the control-plane node and - worker nodes, which can then bootstrap in parallel without coordination. This - allows it to be used in many provisioning scenarios. +- The token can be generated ahead of time and shared with the control-plane node and + worker nodes, which can then bootstrap in parallel without coordination. This + allows it to be used in many provisioning scenarios. **Disadvantages:** - - If an attacker is able to steal a bootstrap token via some vulnerability, - they can use that token (along with network-level access) to impersonate the - control-plane node to other bootstrapping nodes. This may or may not be an appropriate - tradeoff in your environment. +- If an attacker is able to steal a bootstrap token via some vulnerability, + they can use that token (along with network-level access) to impersonate the + control-plane node to other bootstrapping nodes. This may or may not be an appropriate + tradeoff in your environment. #### File or HTTPS-based discovery @@ -158,21 +157,21 @@ In case the discovery file does not contain credentials, the TLS discovery token **Example `kubeadm join` commands:** - - `kubeadm join --discovery-file path/to/file.conf` (local file) +- `kubeadm join --discovery-file path/to/file.conf` (local file) - - `kubeadm join --discovery-file https://url/file.conf` (remote HTTPS URL) +- `kubeadm join --discovery-file https://url/file.conf` (remote HTTPS URL) **Advantages:** - - Allows bootstrapping nodes to securely discover a root of trust for the - control-plane node even if the network or other worker nodes are compromised. +- Allows bootstrapping nodes to securely discover a root of trust for the + control-plane node even if the network or other worker nodes are compromised. **Disadvantages:** - - Requires that you have some way to carry the discovery information from - the control-plane node to the bootstrapping nodes. If the discovery file contains credentials - you must keep it secret and transfer it over a secure channel. This might be possible with your - cloud provider or provisioning tool. +- Requires that you have some way to carry the discovery information from + the control-plane node to the bootstrapping nodes. If the discovery file contains credentials + you must keep it secret and transfer it over a secure channel. This might be possible with your + cloud provider or provisioning tool. ### Securing your installation even more {#securing-more} @@ -194,7 +193,9 @@ After that, `kubeadm join` will block until the admin has manually approved the ```shell kubectl get csr ``` + The output is similar to this: + ``` NAME AGE REQUESTOR CONDITION node-csr-c69HXe7aYcqkS1bKmH4faEnHAWxn6i2bHZ2mD04jZyQ 18s system:bootstrap:878f07 Pending @@ -203,7 +204,9 @@ node-csr-c69HXe7aYcqkS1bKmH4faEnHAWxn6i2bHZ2mD04jZyQ 18s system:bootstra ```shell kubectl certificate approve node-csr-c69HXe7aYcqkS1bKmH4faEnHAWxn6i2bHZ2mD04jZyQ ``` + The output is similar to this: + ``` certificatesigningrequest "node-csr-c69HXe7aYcqkS1bKmH4faEnHAWxn6i2bHZ2mD04jZyQ" approved ``` @@ -211,7 +214,9 @@ certificatesigningrequest "node-csr-c69HXe7aYcqkS1bKmH4faEnHAWxn6i2bHZ2mD04jZyQ" ```shell kubectl get csr ``` + The output is similar to this: + ``` NAME AGE REQUESTOR CONDITION node-csr-c69HXe7aYcqkS1bKmH4faEnHAWxn6i2bHZ2mD04jZyQ 1m system:bootstrap:878f07 Approved,Issued @@ -232,7 +237,9 @@ it off regardless. Doing so will disable the ability to use the `--discovery-tok ```shell kubectl -n kube-public get cm cluster-info -o yaml | grep "kubeconfig:" -A11 | grep "apiVersion" -A10 | sed "s/ //" | tee cluster-info.yaml ``` + The output is similar to this: + ``` apiVersion: v1 kind: Config @@ -276,11 +283,8 @@ kubeadm config print join-defaults For details on individual fields in `JoinConfiguration` see [the godoc](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm#JoinConfiguration). - - ## {{% heading "whatsnext" %}} * [kubeadm init](/docs/reference/setup-tools/kubeadm/kubeadm-init/) to bootstrap a Kubernetes control-plane node * [kubeadm token](/docs/reference/setup-tools/kubeadm/kubeadm-token/) to manage tokens for `kubeadm join` * [kubeadm reset](/docs/reference/setup-tools/kubeadm/kubeadm-reset/) to revert any changes made to this host by `kubeadm init` or `kubeadm join` - diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-reset-phase.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-reset-phase.md index 663bb67e24..95c8ea129f 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-reset-phase.md +++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-reset-phase.md @@ -1,7 +1,9 @@ --- title: kubeadm reset phase weight: 90 +content_type: concept --- + `kubeadm reset phase` enables you to invoke atomic steps of the node reset process. Hence, you can let kubeadm do some of the work and you can fill in the gaps if you wish to apply customization. @@ -47,7 +49,8 @@ Using this phase you can perform cleanup on this node. {{< tab name="cleanup-node" include="generated/kubeadm_reset_phase_cleanup-node.md" />}} {{< /tabs >}} -## What's next +## {{% heading "whatsnext" %}} + * [kubeadm init](/docs/reference/setup-tools/kubeadm/kubeadm-init/) to bootstrap a Kubernetes control-plane node * [kubeadm join](/docs/reference/setup-tools/kubeadm/kubeadm-join/) to connect a node to the cluster * [kubeadm reset](/docs/reference/setup-tools/kubeadm/kubeadm-reset/) to revert any changes made to this host by `kubeadm init` or `kubeadm join` diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-reset.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-reset.md index 2664283daa..93d5ce0cbb 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-reset.md +++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-reset.md @@ -9,7 +9,6 @@ weight: 60 Performs a best effort revert of changes made by `kubeadm init` or `kubeadm join`. - {{< include "generated/kubeadm_reset.md" >}} @@ -36,9 +35,7 @@ etcdctl del "" --prefix See the [etcd documentation](https://github.com/coreos/etcd/tree/master/etcdctl) for more information. - ## {{% heading "whatsnext" %}} * [kubeadm init](/docs/reference/setup-tools/kubeadm/kubeadm-init/) to bootstrap a Kubernetes control-plane node * [kubeadm join](/docs/reference/setup-tools/kubeadm/kubeadm-join/) to bootstrap a Kubernetes worker node and join it to the cluster - diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-token.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-token.md index 92a187bb92..6edb87557d 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-token.md +++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-token.md @@ -14,8 +14,6 @@ the cluster and a control-plane node, as described in [authenticating with boots `kubeadm init` creates an initial token with a 24-hour TTL. The following commands allow you to manage such a token and also to create and manage new ones. - - ## kubeadm token create {#cmd-token-create} {{< include "generated/kubeadm_token_create.md" >}} @@ -29,8 +27,6 @@ such a token and also to create and manage new ones. ## kubeadm token list {#cmd-token-list} {{< include "generated/kubeadm_token_list.md" >}} - ## {{% heading "whatsnext" %}} * [kubeadm join](/docs/reference/setup-tools/kubeadm/kubeadm-join/) to bootstrap a Kubernetes worker node and join it to the cluster - diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-upgrade-phase.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-upgrade-phase.md index 6224a18e0e..a7f4b6d1a6 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-upgrade-phase.md +++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-upgrade-phase.md @@ -1,6 +1,7 @@ --- title: kubeadm upgrade phase weight: 90 +content_type: concept --- In v1.15.0, kubeadm introduced preliminary support for `kubeadm upgrade node` phases. Phases for other `kubeadm upgrade` sub-commands such as `apply`, could be added in the @@ -18,7 +19,8 @@ be called on a primary control-plane node. {{< tab name="kubelet-config" include="generated/kubeadm_upgrade_node_phase_kubelet-config.md" />}} {{< /tabs >}} -## What's next +## {{% heading "whatsnext" %}} + * [kubeadm init](/docs/reference/setup-tools/kubeadm/kubeadm-init/) to bootstrap a Kubernetes control-plane node * [kubeadm join](/docs/reference/setup-tools/kubeadm/kubeadm-join/) to connect a node to the cluster * [kubeadm reset](/docs/reference/setup-tools/kubeadm/kubeadm-reset/) to revert any changes made to this host by `kubeadm init` or `kubeadm join` diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-upgrade.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-upgrade.md index 71483aa1d6..5796e7aec7 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-upgrade.md +++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-upgrade.md @@ -47,8 +47,6 @@ reports of unexpected results. {{< include "generated/kubeadm_upgrade_node.md" >}} - ## {{% heading "whatsnext" %}} * [kubeadm config](/docs/reference/setup-tools/kubeadm/kubeadm-config/) if you initialized your cluster using kubeadm v1.7.x or lower, to configure your cluster for `kubeadm upgrade` - diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-version.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-version.md index a4b57e796c..aabd8dd656 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-version.md +++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-version.md @@ -9,7 +9,5 @@ weight: 80 This command prints the version of kubeadm. - {{< include "generated/kubeadm_version.md" >}} - diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm.md deleted file mode 100644 index 8c16518bb2..0000000000 --- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -reviewers: -- luxas -- jbeda -title: Overview of kubeadm -weight: 10 -card: - name: reference - weight: 40 ---- -Kubeadm is a tool built to provide `kubeadm init` and `kubeadm join` as best-practice “fast paths” for creating Kubernetes clusters. - -kubeadm performs the actions necessary to get a minimum viable cluster up and running. By design, it cares only about bootstrapping, not about provisioning machines. Likewise, installing various nice-to-have addons, like the Kubernetes Dashboard, monitoring solutions, and cloud-specific addons, is not in scope. - -Instead, we expect higher-level and more tailored tooling to be built on top of kubeadm, and ideally, using kubeadm as the basis of all deployments will make it easier to create conformant clusters. - -## How to install - -To install kubeadm, see the [installation guide](/docs/setup/production-environment/tools/kubeadm/install-kubeadm). - -## What's next - -* [kubeadm init](/docs/reference/setup-tools/kubeadm/kubeadm-init) to bootstrap a Kubernetes control-plane node -* [kubeadm join](/docs/reference/setup-tools/kubeadm/kubeadm-join) to bootstrap a Kubernetes worker node and join it to the cluster -* [kubeadm upgrade](/docs/reference/setup-tools/kubeadm/kubeadm-upgrade) to upgrade a Kubernetes cluster to a newer version -* [kubeadm config](/docs/reference/setup-tools/kubeadm/kubeadm-config) if you initialized your cluster using kubeadm v1.7.x or lower, to configure your cluster for `kubeadm upgrade` -* [kubeadm token](/docs/reference/setup-tools/kubeadm/kubeadm-token) to manage tokens for `kubeadm join` -* [kubeadm reset](/docs/reference/setup-tools/kubeadm/kubeadm-reset) to revert any changes made to this host by `kubeadm init` or `kubeadm join` -* [kubeadm version](/docs/reference/setup-tools/kubeadm/kubeadm-version) to print the kubeadm version -* [kubeadm alpha](/docs/reference/setup-tools/kubeadm/kubeadm-alpha) to preview a set of features made available for gathering feedback from the community diff --git a/content/en/docs/reference/using-api/_index.md b/content/en/docs/reference/using-api/_index.md index c6bbb2831b..9d6b7c4e36 100644 --- a/content/en/docs/reference/using-api/_index.md +++ b/content/en/docs/reference/using-api/_index.md @@ -1,5 +1,4 @@ --- title: Using the Kubernetes API weight: 10 -toc-hide: true --- \ No newline at end of file diff --git a/content/en/docs/reference/using-api/api-overview.md b/content/en/docs/reference/using-api/api-overview.md index c0adee3bdb..529c6fc799 100644 --- a/content/en/docs/reference/using-api/api-overview.md +++ b/content/en/docs/reference/using-api/api-overview.md @@ -84,7 +84,7 @@ Currently, there are several API groups in use: * The named groups are at REST path `/apis/$GROUP_NAME/$VERSION`, and use `apiVersion: $GROUP_NAME/$VERSION` (for example, `apiVersion: batch/v1`). You can find the full list of supported API groups in [Kubernetes API reference](/docs/reference/). -The two paths that support extending the API with [custom resources](/docs/concepts/api-extension/custom-resources/) are: +The two paths that support extending the API with [custom resources](/docs/concepts/extend-kubernetes/api-extension/custom-resources/) are: - [CustomResourceDefinition](/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/) for basic CRUD needs. diff --git a/content/en/docs/reference/using-api/client-libraries.md b/content/en/docs/reference/using-api/client-libraries.md index 1531b2c5df..c4d7e5ea24 100644 --- a/content/en/docs/reference/using-api/client-libraries.md +++ b/content/en/docs/reference/using-api/client-libraries.md @@ -19,13 +19,13 @@ You can use a client library for the programming language you are using. Client libraries often handle common tasks such as authentication for you. Most client libraries can discover and use the Kubernetes Service Account to authenticate if the API client is running inside the Kubernetes cluster, or can -understand the [kubeconfig file](/docs/tasks/access-application-cluster/authenticate-across-clusters-kubeconfig/) +understand the [kubeconfig file](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/) format to read the credentials and the API Server address. ## Officially-supported Kubernetes client libraries -The following client libraries are officially maintained by [Kubernetes SIG API -Machinery](https://github.com/kubernetes/community/tree/master/sig-api-machinery). +The following client libraries are officially maintained by +[Kubernetes SIG API Machinery](https://github.com/kubernetes/community/tree/master/sig-api-machinery). | Language | Client Library | Sample Programs | diff --git a/content/en/docs/reference/using-api/deprecation-policy.md b/content/en/docs/reference/using-api/deprecation-policy.md index 08d55416be..ba322d42b5 100644 --- a/content/en/docs/reference/using-api/deprecation-policy.md +++ b/content/en/docs/reference/using-api/deprecation-policy.md @@ -289,8 +289,7 @@ API versions are supported in a series of subsequent releases. ### REST resources (aka API objects) Consider a hypothetical REST resource named Widget, which was present in API v1 -in the above timeline, and which needs to be deprecated. We -[document](/docs/reference/deprecation-policy/) and +in the above timeline, and which needs to be deprecated. We document and [announce](https://groups.google.com/forum/#!forum/kubernetes-announce) the deprecation in sync with release X+1. The Widget resource still exists in API version v1 (deprecated) but not in v2alpha1. The Widget resource continues to diff --git a/content/en/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm.md b/content/en/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm.md index 11ddaaf8f8..b707828cc9 100644 --- a/content/en/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm.md +++ b/content/en/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm.md @@ -29,6 +29,9 @@ when using kubeadm to set up a kubernetes cluster. document assumes these default ports. However, they are configurable through the kubeadm config file. * Each host must [have docker, kubelet, and kubeadm installed](/docs/setup/production-environment/tools/kubeadm/install-kubeadm/). +* Each host should have access to the Kubernetes container image registry (`k8s.gcr.io`) or list/pull the required etcd image using +`kubeadm config images list/pull`. This guide will setup etcd instances as +[static pods](/docs/tasks/configure-pod-container/static-pod/) managed by a kubelet. * Some infrastructure to copy files between hosts. For example `ssh` and `scp` can satisfy this requirement. diff --git a/content/en/docs/setup/production-environment/turnkey/gce.md b/content/en/docs/setup/production-environment/turnkey/gce.md index 3ea666eb7c..78386161a6 100644 --- a/content/en/docs/setup/production-environment/turnkey/gce.md +++ b/content/en/docs/setup/production-environment/turnkey/gce.md @@ -122,7 +122,7 @@ kube-system kube-ui ClusterIP 10.0.0.3 ... ``` -Similarly, you can take a look at the set of [pods](/docs/concepts/workloads/pods/pod/) that were created during cluster startup. +Similarly, you can take a look at the set of [pods](/docs/concepts/workloads/pods/) that were created during cluster startup. You can do this via the ```shell diff --git a/content/en/docs/tasks/access-application-cluster/access-cluster.md b/content/en/docs/tasks/access-application-cluster/access-cluster.md index 39ad8b4b7e..d05de37f34 100644 --- a/content/en/docs/tasks/access-application-cluster/access-cluster.md +++ b/content/en/docs/tasks/access-application-cluster/access-cluster.md @@ -8,9 +8,6 @@ content_type: concept This topic discusses multiple ways to interact with clusters. - - - ## Accessing for the first time with kubectl @@ -29,8 +26,9 @@ Check the location and credentials that kubectl knows about with this command: kubectl config view ``` -Many of the [examples](/docs/user-guide/kubectl-cheatsheet) provide an introduction to using -kubectl and complete documentation is found in the [kubectl manual](/docs/user-guide/kubectl-overview). +Many of the [examples](/docs/reference/kubectl/cheatsheet/) provide an introduction to using +kubectl and complete documentation is found in the +[kubectl manual](/docs/reference/kubectl/overview/). ## Directly accessing the REST API @@ -165,7 +163,7 @@ client libraries. * To get the library, run the following command: `go get k8s.io/client-go@kubernetes-`, see [INSTALL.md](https://github.com/kubernetes/client-go/blob/master/INSTALL.md#for-the-casual-user) for detailed installation instructions. See [https://github.com/kubernetes/client-go](https://github.com/kubernetes/client-go#compatibility-matrix) to see which versions are supported. * Write an application atop of the client-go clients. Note that client-go defines its own API objects, so if needed, please import API definitions from client-go rather than from the main repository, e.g., `import "k8s.io/client-go/kubernetes"` is correct. -The Go client can use the same [kubeconfig file](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/) +The Go client can use the same [kubeconfig file](/docs/concepts/configuration/organize-cluster-access-kubeconfig/) as the kubectl CLI does to locate and authenticate to the apiserver. See this [example](https://git.k8s.io/client-go/examples/out-of-cluster-client-configuration/main.go). If the application is deployed as a Pod in the cluster, please refer to the [next section](#accessing-the-api-from-a-pod). @@ -174,7 +172,7 @@ If the application is deployed as a Pod in the cluster, please refer to the [nex To use [Python client](https://github.com/kubernetes-client/python), run the following command: `pip install kubernetes`. See [Python Client Library page](https://github.com/kubernetes-client/python) for more installation options. -The Python client can use the same [kubeconfig file](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/) +The Python client can use the same [kubeconfig file](/docs/concepts/configuration/organize-cluster-access-kubeconfig/) as the kubectl CLI does to locate and authenticate to the apiserver. See this [example](https://github.com/kubernetes-client/python/tree/master/examples). ### Other languages @@ -219,7 +217,9 @@ In each case, the credentials of the pod are used to communicate securely with t The previous section was about connecting the Kubernetes API server. This section is about connecting to other services running on Kubernetes cluster. In Kubernetes, the -[nodes](/docs/admin/node), [pods](/docs/user-guide/pods) and [services](/docs/user-guide/services) all have +[nodes](/docs/concepts/architecture/nodes/), +[pods](/docs/concepts/workloads/pods/) and +[services](/docs/concepts/services-networking/service/) all have their own IPs. In many cases, the node IPs, pod IPs, and some service IPs on a cluster will not be routable, so they will not be reachable from a machine outside the cluster, such as your desktop machine. @@ -230,7 +230,7 @@ You have several options for connecting to nodes, pods and services from outside - Access services through public IPs. - Use a service with type `NodePort` or `LoadBalancer` to make the service reachable outside - the cluster. See the [services](/docs/user-guide/services) and + the cluster. See the [services](/docs/concepts/services-networking/service/) and [kubectl expose](/docs/reference/generated/kubectl/kubectl-commands/#expose) documentation. - Depending on your cluster environment, this may just expose the service to your corporate network, or it may expose it to the internet. Think about whether the service being exposed is secure. diff --git a/content/en/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume.md b/content/en/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume.md index 1d00516d28..95066ac612 100644 --- a/content/en/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume.md +++ b/content/en/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume.md @@ -7,19 +7,14 @@ weight: 110 This page shows how to use a Volume to communicate between two Containers running -in the same Pod. See also how to allow processes to communicate by [sharing process namespace](/docs/tasks/configure-pod-container/share-process-namespace/) between containers. - - - +in the same Pod. See also how to allow processes to communicate by +[sharing process namespace](/docs/tasks/configure-pod-container/share-process-namespace/) +between containers. ## {{% heading "prerequisites" %}} - {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} - - - ## Creating a Pod that runs two Containers @@ -103,14 +98,15 @@ The output is similar to this: Recall that the debian Container created the `index.html` file in the nginx root directory. Use `curl` to send a GET request to the nginx server: - root@two-containers:/# curl localhost +``` +root@two-containers:/# curl localhost +``` The output shows that nginx serves a web page written by the debian container: - Hello from the debian container - - - +``` +Hello from the debian container +``` @@ -128,20 +124,14 @@ The Volume in this exercise provides a way for Containers to communicate during the life of the Pod. If the Pod is deleted and recreated, any data stored in the shared Volume is lost. - - - ## {{% heading "whatsnext" %}} -* Learn more about -[patterns for composite containers](https://kubernetes.io/blog/2015/06/the-distributed-system-toolkit-patterns). +* Learn more about [patterns for composite containers](https://kubernetes.io/blog/2015/06/the-distributed-system-toolkit-patterns). -* Learn about -[composite containers for modular architecture](http://www.slideshare.net/Docker/slideshare-burns). +* Learn about [composite containers for modular architecture](https://www.slideshare.net/Docker/slideshare-burns). -* See -[Configuring a Pod to Use a Volume for Storage](/docs/tasks/configure-pod-container/configure-volume-storage/). +* See [Configuring a Pod to Use a Volume for Storage](/docs/tasks/configure-pod-container/configure-volume-storage/). * See [Configure a Pod to share process namespace between containers in a Pod](/docs/tasks/configure-pod-container/share-process-namespace/) @@ -149,7 +139,3 @@ the shared Volume is lost. * See [Pod](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#pod-v1-core). - - - - diff --git a/content/en/docs/tasks/access-application-cluster/connecting-frontend-backend.md b/content/en/docs/tasks/access-application-cluster/connecting-frontend-backend.md index 0ce827185c..725afbfb89 100644 --- a/content/en/docs/tasks/access-application-cluster/connecting-frontend-backend.md +++ b/content/en/docs/tasks/access-application-cluster/connecting-frontend-backend.md @@ -11,33 +11,21 @@ microservice. The backend microservice is a hello greeter. The frontend and backend are connected using a Kubernetes {{< glossary_tooltip term_id="service" >}} object. - - - ## {{% heading "objectives" %}} - * Create and run a microservice using a {{< glossary_tooltip term_id="deployment" >}} object. * Route traffic to the backend using a frontend. * Use a Service object to connect the frontend application to the backend application. - - - ## {{% heading "prerequisites" %}} +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} -* {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} - -* This task uses - [Services with external load balancers](/docs/tasks/access-application-cluster/create-external-load-balancer/), which - require a supported environment. If your environment does not - support this, you can use a Service of type - [NodePort](/docs/concepts/services-networking/service/#nodeport) instead. - - - +This task uses +[Services with external load balancers](/docs/tasks/access-application-cluster/create-external-load-balancer/), which +require a supported environment. If your environment does not support this, you can use a Service of type +[NodePort](/docs/concepts/services-networking/service/#nodeport) instead. @@ -153,8 +141,8 @@ service/frontend created ``` {{< note >}} -The nginx configuration is baked into the [container -image](/examples/service/access/Dockerfile). A better way to do this would +The nginx configuration is baked into the +[container image](/examples/service/access/Dockerfile). A better way to do this would be to use a [ConfigMap](/docs/tasks/configure-pod-container/configure-pod-configmap/), so that you can change the configuration more easily. @@ -203,27 +191,22 @@ The output shows the message generated by the backend: {"message":"Hello"} ``` - - ## {{% heading "cleanup" %}} - To delete the Services, enter this command: - kubectl delete services frontend hello +```shell +kubectl delete services frontend hello +``` To delete the Deployments, the ReplicaSets and the Pods that are running the backend and frontend applications, enter this command: - kubectl delete deployment frontend hello - - +```shell +kubectl delete deployment frontend hello +``` ## {{% heading "whatsnext" %}} - * Learn more about [Services](/docs/concepts/services-networking/service/) * Learn more about [ConfigMaps](/docs/tasks/configure-pod-container/configure-pod-configmap/) - - - diff --git a/content/en/docs/tasks/access-application-cluster/ingress-minikube.md b/content/en/docs/tasks/access-application-cluster/ingress-minikube.md index a0c68ff682..6310d15851 100644 --- a/content/en/docs/tasks/access-application-cluster/ingress-minikube.md +++ b/content/en/docs/tasks/access-application-cluster/ingress-minikube.md @@ -6,7 +6,7 @@ weight: 100 -An [Ingress](/docs/concepts/services-networking/ingress/) is an API object that defines rules which allow external access +An [Ingress](/docs/concepts/services-networking/ingress/) is an API object that defines rules which allow external access to services in a cluster. An [Ingress controller](/docs/concepts/services-networking/ingress-controllers/) fulfills the rules set in the Ingress. This page shows you how to set up a simple Ingress which routes requests to Service web or web2 depending on the HTTP URI. @@ -41,7 +41,7 @@ This page shows you how to set up a simple Ingress which routes requests to Serv ```shell minikube addons enable ingress ``` - + 1. Verify that the NGINX Ingress controller is running ```shell @@ -71,31 +71,31 @@ This page shows you how to set up a simple Ingress which routes requests to Serv ``` Output: - + ```shell deployment.apps/web created ``` -1. Expose the Deployment: +1. Expose the Deployment: ```shell kubectl expose deployment web --type=NodePort --port=8080 ``` - - Output: - + + Output: + ```shell service/web exposed ``` - + 1. Verify the Service is created and is available on a node port: ```shell kubectl get service web - ``` - + ``` + Output: - + ```shell NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web NodePort 10.104.133.249 8080:31637/TCP 12m @@ -106,24 +106,24 @@ This page shows you how to set up a simple Ingress which routes requests to Serv ```shell minikube service web --url ``` - + Output: - + ```shell http://172.17.0.15:31637 ``` - + {{< note >}}Katacoda environment only: at the top of the terminal panel, click the plus sign, and then click **Select port to view on Host 1**. Enter the NodePort, in this case `31637`, and then click **Display Port**.{{< /note >}} - + Output: - + ```shell Hello, world! Version: 1.0.0 Hostname: web-55b8c6998d-8k564 ``` - - You can now access the sample app via the Minikube IP address and NodePort. The next step lets you access + + You can now access the sample app via the Minikube IP address and NodePort. The next step lets you access the app using the Ingress resource. ## Create an Ingress resource @@ -132,37 +132,39 @@ The following file is an Ingress resource that sends traffic to your Service via 1. Create `example-ingress.yaml` from the following file: - apiVersion: networking.k8s.io/v1beta1 - kind: Ingress - metadata: - name: example-ingress - annotations: - nginx.ingress.kubernetes.io/rewrite-target: /$1 - spec: - rules: - - host: hello-world.info - http: - paths: - - path: / - backend: - serviceName: web - servicePort: 8080 + ```yaml + apiVersion: networking.k8s.io/v1beta1 + kind: Ingress + metadata: + name: example-ingress + annotations: + nginx.ingress.kubernetes.io/rewrite-target: /$1 + spec: + rules: + - host: hello-world.info + http: + paths: + - path: / + backend: + serviceName: web + servicePort: 8080 + ``` 1. Create the Ingress resource by running the following command: - + ```shell kubectl apply -f example-ingress.yaml ``` - + Output: - + ```shell ingress.networking.k8s.io/example-ingress created ``` -1. Verify the IP address is set: +1. Verify the IP address is set: - ```shell + ```shell kubectl get ingress ``` @@ -173,7 +175,7 @@ The following file is an Ingress resource that sends traffic to your Service via example-ingress hello-world.info 172.17.0.15 80 38s ``` -1. Add the following line to the bottom of the `/etc/hosts` file. +1. Add the following line to the bottom of the `/etc/hosts` file. {{< note >}}If you are running Minikube locally, use `minikube ip` to get the external IP. The IP address displayed within the ingress list will be the internal IP.{{< /note >}} @@ -190,7 +192,7 @@ The following file is an Ingress resource that sends traffic to your Service via ``` Output: - + ```shell Hello, world! Version: 1.0.0 @@ -207,26 +209,26 @@ The following file is an Ingress resource that sends traffic to your Service via kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0 ``` Output: - + ```shell deployment.apps/web2 created ``` - + 1. Expose the Deployment: ```shell kubectl expose deployment web2 --port=8080 --type=NodePort ``` - Output: - + Output: + ```shell service/web2 exposed ``` - + ## Edit Ingress -1. Edit the existing `example-ingress.yaml` and add the following lines: +1. Edit the existing `example-ingress.yaml` and add the following lines: ```yaml - path: /v2 @@ -241,7 +243,8 @@ The following file is an Ingress resource that sends traffic to your Service via kubectl apply -f example-ingress.yaml ``` - Output: + Output: + ```shell ingress.networking/example-ingress configured ``` @@ -255,6 +258,7 @@ The following file is an Ingress resource that sends traffic to your Service via ``` Output: + ```shell Hello, world! Version: 1.0.0 @@ -268,6 +272,7 @@ The following file is an Ingress resource that sends traffic to your Service via ``` Output: + ```shell Hello, world! Version: 2.0.0 diff --git a/content/en/docs/tasks/access-application-cluster/list-all-running-container-images.md b/content/en/docs/tasks/access-application-cluster/list-all-running-container-images.md index d1e1ba1568..3a8983eec8 100644 --- a/content/en/docs/tasks/access-application-cluster/list-all-running-container-images.md +++ b/content/en/docs/tasks/access-application-cluster/list-all-running-container-images.md @@ -9,15 +9,10 @@ weight: 100 This page shows how to use kubectl to list all of the Container images for Pods running in a cluster. - - ## {{% heading "prerequisites" %}} - {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} - - In this exercise you will use kubectl to fetch all of the Pods @@ -30,14 +25,14 @@ of Containers for each. - Format the output to include only the list of Container image names using `-o jsonpath={..image}`. This will recursively parse out the `image` field from the returned json. - - See the [jsonpath reference](/docs/user-guide/jsonpath/) + - See the [jsonpath reference](/docs/reference/kubectl/jsonpath/) for further information on how to use jsonpath. - Format the output using standard tools: `tr`, `sort`, `uniq` - Use `tr` to replace spaces with newlines - Use `sort` to sort the results - Use `uniq` to aggregate image counts -```sh +```shell kubectl get pods --all-namespaces -o jsonpath="{..image}" |\ tr -s '[[:space:]]' '\n' |\ sort |\ @@ -52,7 +47,7 @@ field within the Pod. This ensures the correct field is retrieved even when the field name is repeated, e.g. many fields are called `name` within a given item: -```sh +```shell kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" ``` @@ -74,7 +69,7 @@ Pod is returned instead of a list of items. The formatting can be controlled further by using the `range` operation to iterate over elements individually. -```sh +```shell kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\ sort ``` @@ -84,7 +79,7 @@ sort To target only Pods matching a specific label, use the -l flag. The following matches only Pods with labels matching `app=nginx`. -```sh +```shell kubectl get pods --all-namespaces -o=jsonpath="{..image}" -l app=nginx ``` @@ -93,7 +88,7 @@ kubectl get pods --all-namespaces -o=jsonpath="{..image}" -l app=nginx To target only pods in a specific namespace, use the namespace flag. The following matches only Pods in the `kube-system` namespace. -```sh +```shell kubectl get pods --namespace kube-system -o jsonpath="{..image}" ``` @@ -102,27 +97,14 @@ kubectl get pods --namespace kube-system -o jsonpath="{..image}" As an alternative to jsonpath, Kubectl supports using [go-templates](https://golang.org/pkg/text/template/) for formatting the output: - -```sh +```shell kubectl get pods --all-namespaces -o go-template --template="{{range .items}}{{range .spec.containers}}{{.image}} {{end}}{{end}}" ``` - - - - - - - - ## {{% heading "whatsnext" %}} - ### Reference -* [Jsonpath](/docs/user-guide/jsonpath/) reference guide +* [Jsonpath](/docs/reference/kubectl/jsonpath/) reference guide * [Go template](https://golang.org/pkg/text/template/) reference guide - - - diff --git a/content/en/docs/tasks/access-application-cluster/web-ui-dashboard.md b/content/en/docs/tasks/access-application-cluster/web-ui-dashboard.md index 6d7c1cced2..7bfcf03ebd 100644 --- a/content/en/docs/tasks/access-application-cluster/web-ui-dashboard.md +++ b/content/en/docs/tasks/access-application-cluster/web-ui-dashboard.md @@ -14,15 +14,19 @@ card: -Dashboard is a web-based Kubernetes user interface. You can use Dashboard to deploy containerized applications to a Kubernetes cluster, troubleshoot your containerized application, and manage the cluster resources. You can use Dashboard to get an overview of applications running on your cluster, as well as for creating or modifying individual Kubernetes resources (such as Deployments, Jobs, DaemonSets, etc). For example, you can scale a Deployment, initiate a rolling update, restart a pod or deploy new applications using a deploy wizard. +Dashboard is a web-based Kubernetes user interface. +You can use Dashboard to deploy containerized applications to a Kubernetes cluster, +troubleshoot your containerized application, and manage the cluster resources. +You can use Dashboard to get an overview of applications running on your cluster, +as well as for creating or modifying individual Kubernetes resources +(such as Deployments, Jobs, DaemonSets, etc). +For example, you can scale a Deployment, initiate a rolling update, restart a pod +or deploy new applications using a deploy wizard. Dashboard also provides information on the state of Kubernetes resources in your cluster and on any errors that may have occurred. ![Kubernetes Dashboard UI](/images/docs/ui-dashboard.png) - - - ## Deploying the Dashboard UI @@ -35,8 +39,10 @@ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/a ## Accessing the Dashboard UI - -To protect your cluster data, Dashboard deploys with a minimal RBAC configuration by default. Currently, Dashboard only supports logging in with a Bearer Token. To create a token for this demo, you can follow our guide on [creating a sample user](https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md). +To protect your cluster data, Dashboard deploys with a minimal RBAC configuration by default. +Currently, Dashboard only supports logging in with a Bearer Token. +To create a token for this demo, you can follow our guide on +[creating a sample user](https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md). {{< warning >}} The sample user created in the tutorial will have administrative privileges and is for educational purposes only. @@ -59,13 +65,17 @@ Kubeconfig Authentication method does NOT support external identity providers or ## Welcome view -When you access Dashboard on an empty cluster, you'll see the welcome page. This page contains a link to this document as well as a button to deploy your first application. In addition, you can view which system applications are running by default in the `kube-system` [namespace](/docs/tasks/administer-cluster/namespaces/) of your cluster, for example the Dashboard itself. +When you access Dashboard on an empty cluster, you'll see the welcome page. +This page contains a link to this document as well as a button to deploy your first application. +In addition, you can view which system applications are running by default in the `kube-system` +[namespace](/docs/tasks/administer-cluster/namespaces/) of your cluster, for example the Dashboard itself. ![Kubernetes Dashboard welcome page](/images/docs/ui-dashboard-zerostate.png) ## Deploying containerized applications -Dashboard lets you create and deploy a containerized application as a Deployment and optional Service with a simple wizard. You can either manually specify application details, or upload a YAML or JSON file containing application configuration. +Dashboard lets you create and deploy a containerized application as a Deployment and optional Service with a simple wizard. +You can either manually specify application details, or upload a YAML or JSON file containing application configuration. Click the **CREATE** button in the upper right corner of any page to begin. @@ -73,17 +83,29 @@ Click the **CREATE** button in the upper right corner of any page to begin. The deploy wizard expects that you provide the following information: -- **App name** (mandatory): Name for your application. A [label](/docs/concepts/overview/working-with-objects/labels/) with the name will be added to the Deployment and Service, if any, that will be deployed. +- **App name** (mandatory): Name for your application. + A [label](/docs/concepts/overview/working-with-objects/labels/) with the name will be + added to the Deployment and Service, if any, that will be deployed. - The application name must be unique within the selected Kubernetes [namespace](/docs/tasks/administer-cluster/namespaces/). It must start with a lowercase character, and end with a lowercase character or a number, and contain only lowercase letters, numbers and dashes (-). It is limited to 24 characters. Leading and trailing spaces are ignored. + The application name must be unique within the selected Kubernetes [namespace](/docs/tasks/administer-cluster/namespaces/). + It must start with a lowercase character, and end with a lowercase character or a number, + and contain only lowercase letters, numbers and dashes (-). It is limited to 24 characters. + Leading and trailing spaces are ignored. -- **Container image** (mandatory): The URL of a public Docker [container image](/docs/concepts/containers/images/) on any registry, or a private image (commonly hosted on the Google Container Registry or Docker Hub). The container image specification must end with a colon. +- **Container image** (mandatory): + The URL of a public Docker [container image](/docs/concepts/containers/images/) on any registry, + or a private image (commonly hosted on the Google Container Registry or Docker Hub). + The container image specification must end with a colon. -- **Number of pods** (mandatory): The target number of Pods you want your application to be deployed in. The value must be a positive integer. +- **Number of pods** (mandatory): The target number of Pods you want your application to be deployed in. + The value must be a positive integer. - A [Deployment](/docs/concepts/workloads/controllers/deployment/) will be created to maintain the desired number of Pods across your cluster. + A [Deployment](/docs/concepts/workloads/controllers/deployment/) will be created to + maintain the desired number of Pods across your cluster. -- **Service** (optional): For some parts of your application (e.g. frontends) you may want to expose a [Service](/docs/concepts/services-networking/service/) onto an external, maybe public IP address outside of your cluster (external Service). +- **Service** (optional): For some parts of your application (e.g. frontends) you may want to expose a + [Service](/docs/concepts/services-networking/service/) onto an external, + maybe public IP address outside of your cluster (external Service). {{< note >}} For external Services, you may need to open up one or more ports to do so. @@ -91,13 +113,22 @@ The deploy wizard expects that you provide the following information: Other Services that are only visible from inside the cluster are called internal Services. - Irrespective of the Service type, if you choose to create a Service and your container listens on a port (incoming), you need to specify two ports. The Service will be created mapping the port (incoming) to the target port seen by the container. This Service will route to your deployed Pods. Supported protocols are TCP and UDP. The internal DNS name for this Service will be the value you specified as application name above. + Irrespective of the Service type, if you choose to create a Service and your container listens + on a port (incoming), you need to specify two ports. + The Service will be created mapping the port (incoming) to the target port seen by the container. + This Service will route to your deployed Pods. Supported protocols are TCP and UDP. + The internal DNS name for this Service will be the value you specified as application name above. If needed, you can expand the **Advanced options** section where you can specify more settings: -- **Description**: The text you enter here will be added as an [annotation](/docs/concepts/overview/working-with-objects/annotations/) to the Deployment and displayed in the application's details. +- **Description**: The text you enter here will be added as an + [annotation](/docs/concepts/overview/working-with-objects/annotations/) + to the Deployment and displayed in the application's details. -- **Labels**: Default [labels](/docs/concepts/overview/working-with-objects/labels/) to be used for your application are application name and version. You can specify additional labels to be applied to the Deployment, Service (if any), and Pods, such as release, environment, tier, partition, and release track. +- **Labels**: Default [labels](/docs/concepts/overview/working-with-objects/labels/) to be used + for your application are application name and version. + You can specify additional labels to be applied to the Deployment, Service (if any), and Pods, + such as release, environment, tier, partition, and release track. Example: @@ -108,66 +139,111 @@ If needed, you can expand the **Advanced options** section where you can specify track=stable ``` -- **Namespace**: Kubernetes supports multiple virtual clusters backed by the same physical cluster. These virtual clusters are called [namespaces](/docs/tasks/administer-cluster/namespaces/). They let you partition resources into logically named groups. +- **Namespace**: Kubernetes supports multiple virtual clusters backed by the same physical cluster. + These virtual clusters are called [namespaces](/docs/tasks/administer-cluster/namespaces/). + They let you partition resources into logically named groups. - Dashboard offers all available namespaces in a dropdown list, and allows you to create a new namespace. The namespace name may contain a maximum of 63 alphanumeric characters and dashes (-) but can not contain capital letters. - Namespace names should not consist of only numbers. If the name is set as a number, such as 10, the pod will be put in the default namespace. + Dashboard offers all available namespaces in a dropdown list, and allows you to create a new namespace. + The namespace name may contain a maximum of 63 alphanumeric characters and dashes (-) but can not contain capital letters. + Namespace names should not consist of only numbers. + If the name is set as a number, such as 10, the pod will be put in the default namespace. - In case the creation of the namespace is successful, it is selected by default. If the creation fails, the first namespace is selected. + In case the creation of the namespace is successful, it is selected by default. + If the creation fails, the first namespace is selected. -- **Image Pull Secret**: In case the specified Docker container image is private, it may require [pull secret](/docs/concepts/configuration/secret/) credentials. +- **Image Pull Secret**: + In case the specified Docker container image is private, it may require + [pull secret](/docs/concepts/configuration/secret/) credentials. - Dashboard offers all available secrets in a dropdown list, and allows you to create a new secret. The secret name must follow the DNS domain name syntax, for example `new.image-pull.secret`. The content of a secret must be base64-encoded and specified in a [`.dockercfg`](/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod) file. The secret name may consist of a maximum of 253 characters. + Dashboard offers all available secrets in a dropdown list, and allows you to create a new secret. + The secret name must follow the DNS domain name syntax, for example `new.image-pull.secret`. + The content of a secret must be base64-encoded and specified in a + [`.dockercfg`](/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod) file. + The secret name may consist of a maximum of 253 characters. In case the creation of the image pull secret is successful, it is selected by default. If the creation fails, no secret is applied. -- **CPU requirement (cores)** and **Memory requirement (MiB)**: You can specify the minimum [resource limits](/docs/tasks/configure-pod-container/limit-range/) for the container. By default, Pods run with unbounded CPU and memory limits. +- **CPU requirement (cores)** and **Memory requirement (MiB)**: + You can specify the minimum [resource limits](/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/) + for the container. By default, Pods run with unbounded CPU and memory limits. -- **Run command** and **Run command arguments**: By default, your containers run the specified Docker image's default [entrypoint command](/docs/tasks/inject-data-application/define-command-argument-container/). You can use the command options and arguments to override the default. +- **Run command** and **Run command arguments**: + By default, your containers run the specified Docker image's default + [entrypoint command](/docs/tasks/inject-data-application/define-command-argument-container/). + You can use the command options and arguments to override the default. -- **Run as privileged**: This setting determines whether processes in [privileged containers](/docs/user-guide/pods/#privileged-mode-for-pod-containers) are equivalent to processes running as root on the host. Privileged containers can make use of capabilities like manipulating the network stack and accessing devices. +- **Run as privileged**: This setting determines whether processes in + [privileged containers](/docs/concepts/workloads/pods/#privileged-mode-for-containers) + are equivalent to processes running as root on the host. + Privileged containers can make use of capabilities like manipulating the network stack and accessing devices. -- **Environment variables**: Kubernetes exposes Services through [environment variables](/docs/tasks/inject-data-application/environment-variable-expose-pod-information/). You can compose environment variable or pass arguments to your commands using the values of environment variables. They can be used in applications to find a Service. Values can reference other variables using the `$(VAR_NAME)` syntax. +- **Environment variables**: Kubernetes exposes Services through + [environment variables](/docs/tasks/inject-data-application/environment-variable-expose-pod-information/). + You can compose environment variable or pass arguments to your commands using the values of environment variables. + They can be used in applications to find a Service. + Values can reference other variables using the `$(VAR_NAME)` syntax. ### Uploading a YAML or JSON file -Kubernetes supports declarative configuration. In this style, all configuration is stored in YAML or JSON configuration files using the Kubernetes [API](/docs/concepts/overview/kubernetes-api/) resource schemas. +Kubernetes supports declarative configuration. +In this style, all configuration is stored in YAML or JSON configuration files +using the Kubernetes [API](/docs/concepts/overview/kubernetes-api/) resource schemas. -As an alternative to specifying application details in the deploy wizard, you can define your application in YAML or JSON files, and upload the files using Dashboard. +As an alternative to specifying application details in the deploy wizard, +you can define your application in YAML or JSON files, and upload the files using Dashboard. ## Using Dashboard Following sections describe views of the Kubernetes Dashboard UI; what they provide and how can they be used. ### Navigation -When there are Kubernetes objects defined in the cluster, Dashboard shows them in the initial view. By default only objects from the _default_ namespace are shown and this can be changed using the namespace selector located in the navigation menu. +When there are Kubernetes objects defined in the cluster, Dashboard shows them in the initial view. +By default only objects from the _default_ namespace are shown and +this can be changed using the namespace selector located in the navigation menu. Dashboard shows most Kubernetes object kinds and groups them in a few menu categories. #### Admin Overview -For cluster and namespace administrators, Dashboard lists Nodes, Namespaces and Persistent Volumes and has detail views for them. Node list view contains CPU and memory usage metrics aggregated across all Nodes. The details view shows the metrics for a Node, its specification, status, allocated resources, events and pods running on the node. +For cluster and namespace administrators, Dashboard lists Nodes, Namespaces and Persistent Volumes and has detail views for them. +Node list view contains CPU and memory usage metrics aggregated across all Nodes. +The details view shows the metrics for a Node, its specification, status, +allocated resources, events and pods running on the node. #### Workloads -Shows all applications running in the selected namespace. The view lists applications by workload kind (e.g., Deployments, Replica Sets, Stateful Sets, etc.) and each workload kind can be viewed separately. The lists summarize actionable information about the workloads, such as the number of ready pods for a Replica Set or current memory usage for a Pod. -Detail views for workloads show status and specification information and surface relationships between objects. For example, Pods that Replica Set is controlling or New Replica Sets and Horizontal Pod Autoscalers for Deployments. +Shows all applications running in the selected namespace. +The view lists applications by workload kind (e.g., Deployments, Replica Sets, Stateful Sets, etc.) +and each workload kind can be viewed separately. +The lists summarize actionable information about the workloads, +such as the number of ready pods for a Replica Set or current memory usage for a Pod. + +Detail views for workloads show status and specification information and +surface relationships between objects. +For example, Pods that Replica Set is controlling or New Replica Sets and Horizontal Pod Autoscalers for Deployments. #### Services -Shows Kubernetes resources that allow for exposing services to external world and discovering them within a cluster. For that reason, Service and Ingress views show Pods targeted by them, internal endpoints for cluster connections and external endpoints for external users. + +Shows Kubernetes resources that allow for exposing services to external world and +discovering them within a cluster. +For that reason, Service and Ingress views show Pods targeted by them, +internal endpoints for cluster connections and external endpoints for external users. #### Storage + Storage view shows Persistent Volume Claim resources which are used by applications for storing data. #### Config Maps and Secrets -Shows all Kubernetes resources that are used for live configuration of applications running in clusters. The view allows for editing and managing config objects and displays secrets hidden by default. + +Shows all Kubernetes resources that are used for live configuration of applications running in clusters. +The view allows for editing and managing config objects and displays secrets hidden by default. #### Logs viewer -Pod lists and detail pages link to a logs viewer that is built into Dashboard. The viewer allows for drilling down logs from containers belonging to a single Pod. + +Pod lists and detail pages link to a logs viewer that is built into Dashboard. +The viewer allows for drilling down logs from containers belonging to a single Pod. ![Logs viewer](/images/docs/ui-dashboard-logs-view.png) - - ## {{% heading "whatsnext" %}} diff --git a/content/en/docs/tasks/administer-cluster/access-cluster-api.md b/content/en/docs/tasks/administer-cluster/access-cluster-api.md index 659c8d777c..5c94dceffc 100644 --- a/content/en/docs/tasks/administer-cluster/access-cluster-api.md +++ b/content/en/docs/tasks/administer-cluster/access-cluster-api.md @@ -6,13 +6,10 @@ content_type: task This page shows how to access clusters using the Kubernetes API. - ## {{% heading "prerequisites" %}} - {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} - ## Accessing the Kubernetes API @@ -170,7 +167,7 @@ client-go defines its own API objects, so if needed, import API definitions from {{< /note >}} -The Go client can use the same [kubeconfig file](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/) +The Go client can use the same [kubeconfig file](/docs/concepts/configuration/organize-cluster-access-kubeconfig/) as the kubectl CLI does to locate and authenticate to the API server. See this [example](https://git.k8s.io/client-go/examples/out-of-cluster-client-configuration/main.go): ```golang @@ -199,7 +196,7 @@ If the application is deployed as a Pod in the cluster, see [Accessing the API f To use [Python client](https://github.com/kubernetes-client/python), run the following command: `pip install kubernetes` See [Python Client Library page](https://github.com/kubernetes-client/python) for more installation options. -The Python client can use the same [kubeconfig file](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/) +The Python client can use the same [kubeconfig file](/docs/concepts/configuration/organize-cluster-access-kubeconfig/) as the kubectl CLI does to locate and authenticate to the API server. See this [example](https://github.com/kubernetes-client/python/blob/master/examples/out_of_cluster_config.py): ```python @@ -229,7 +226,7 @@ mvn install See [https://github.com/kubernetes-client/java/releases](https://github.com/kubernetes-client/java/releases) to see which versions are supported. -The Java client can use the same [kubeconfig file](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/) +The Java client can use the same [kubeconfig file](/docs/concepts/configuration/organize-cluster-access-kubeconfig/) as the kubectl CLI does to locate and authenticate to the API server. See this [example](https://github.com/kubernetes-client/java/blob/master/examples/src/main/java/io/kubernetes/client/examples/KubeConfigFileClientExample.java): ```java @@ -283,7 +280,7 @@ public class KubeConfigFileClientExample { To use [dotnet client](https://github.com/kubernetes-client/csharp), run the following command: `dotnet add package KubernetesClient --version 1.6.1` See [dotnet Client Library page](https://github.com/kubernetes-client/csharp) for more installation options. See [https://github.com/kubernetes-client/csharp/releases](https://github.com/kubernetes-client/csharp/releases) to see which versions are supported. -The dotnet client can use the same [kubeconfig file](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/) +The dotnet client can use the same [kubeconfig file](/docs/concepts/configuration/organize-cluster-access-kubeconfig/) as the kubectl CLI does to locate and authenticate to the API server. See this [example](https://github.com/kubernetes-client/csharp/blob/master/examples/simple/PodList.cs): ```csharp @@ -318,7 +315,7 @@ namespace simple To install [JavaScript client](https://github.com/kubernetes-client/javascript), run the following command: `npm install @kubernetes/client-node`. See [https://github.com/kubernetes-client/javascript/releases](https://github.com/kubernetes-client/javascript/releases) to see which versions are supported. -The JavaScript client can use the same [kubeconfig file](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/) +The JavaScript client can use the same [kubeconfig file](/docs/concepts/configuration/organize-cluster-access-kubeconfig/) as the kubectl CLI does to locate and authenticate to the API server. See this [example](https://github.com/kubernetes-client/javascript/blob/master/examples/example.js): ```javascript @@ -338,7 +335,7 @@ k8sApi.listNamespacedPod('default').then((res) => { See [https://github.com/kubernetes-client/haskell/releases](https://github.com/kubernetes-client/haskell/releases) to see which versions are supported. -The [Haskell client](https://github.com/kubernetes-client/haskell) can use the same [kubeconfig file](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/) +The [Haskell client](https://github.com/kubernetes-client/haskell) can use the same [kubeconfig file](/docs/concepts/configuration/organize-cluster-access-kubeconfig/) as the kubectl CLI does to locate and authenticate to the API server. See this [example](https://github.com/kubernetes-client/haskell/blob/master/kubernetes-client/example/App.hs): ```haskell @@ -388,7 +385,7 @@ While running in a Pod, the Kubernetes apiserver is accessible via a Service nam do this automatically. The recommended way to authenticate to the API server is with a -[service account](/docs/user-guide/service-accounts) credential. By default, a Pod +[service account](/docs/tasks/configure-pod-container/configure-service-account/) credential. By default, a Pod is associated with a service account, and a credential (token) for that service account is placed into the filesystem tree of each container in that Pod, at `/var/run/secrets/kubernetes.io/serviceaccount/token`. diff --git a/content/en/docs/tasks/administer-cluster/access-cluster-services.md b/content/en/docs/tasks/administer-cluster/access-cluster-services.md index 979a75a162..c318a3df35 100644 --- a/content/en/docs/tasks/administer-cluster/access-cluster-services.md +++ b/content/en/docs/tasks/administer-cluster/access-cluster-services.md @@ -17,7 +17,8 @@ This page shows how to connect to services running on the Kubernetes cluster. ## Accessing services running on the cluster -In Kubernetes, [nodes](/docs/admin/node), [pods](/docs/user-guide/pods) and [services](/docs/user-guide/services) all have +In Kubernetes, [nodes](/docs/concepts/architecture/nodes/), +[pods](/docs/concepts/workloads/pods/) and [services](/docs/concepts/services-networking/service/) all have their own IPs. In many cases, the node IPs, pod IPs, and some service IPs on a cluster will not be routable, so they will not be reachable from a machine outside the cluster, such as your desktop machine. @@ -28,7 +29,7 @@ You have several options for connecting to nodes, pods and services from outside - Access services through public IPs. - Use a service with type `NodePort` or `LoadBalancer` to make the service reachable outside - the cluster. See the [services](/docs/user-guide/services) and + the cluster. See the [services](/docs/concepts/services-networking/service/) and [kubectl expose](/docs/reference/generated/kubectl/kubectl-commands/#expose) documentation. - Depending on your cluster environment, this may just expose the service to your corporate network, or it may expose it to the internet. Think about whether the service being exposed is secure. diff --git a/content/en/docs/tasks/administer-cluster/cluster-management.md b/content/en/docs/tasks/administer-cluster/cluster-management.md index 7cbab3aa2c..ecbae2a4b3 100644 --- a/content/en/docs/tasks/administer-cluster/cluster-management.md +++ b/content/en/docs/tasks/administer-cluster/cluster-management.md @@ -13,9 +13,6 @@ upgrading your cluster's master and worker nodes, performing node maintenance (e.g. kernel upgrades), and upgrading the Kubernetes API version of a running cluster. - - - ## Creating and configuring a Cluster @@ -81,24 +78,33 @@ Different providers, and tools, will manage upgrades differently. It is recomme * [Digital Rebar](https://provision.readthedocs.io/en/tip/doc/content-packages/krib.html) * ... -To upgrade a cluster on a platform not mentioned in the above list, check the order of component upgrade on the [Skewed versions](/docs/setup/release/version-skew-policy/#supported-component-upgrade-order) page. +To upgrade a cluster on a platform not mentioned in the above list, check the order of component upgrade on the +[Skewed versions](/docs/setup/release/version-skew-policy/#supported-component-upgrade-order) page. ## Resizing a cluster -If your cluster runs short on resources you can easily add more machines to it if your cluster is running in [Node self-registration mode](/docs/admin/node/#self-registration-of-nodes). -If you're using GCE or Google Kubernetes Engine it's done by resizing the Instance Group managing your Nodes. It can be accomplished by modifying number of instances on `Compute > Compute Engine > Instance groups > your group > Edit group` [Google Cloud Console page](https://console.developers.google.com) or using gcloud CLI: +If your cluster runs short on resources you can easily add more machines to it if your cluster +is running in [Node self-registration mode](/docs/concepts/architecture/nodes/#self-registration-of-nodes). +If you're using GCE or Google Kubernetes Engine it's done by resizing the Instance Group managing your Nodes. +It can be accomplished by modifying number of instances on +`Compute > Compute Engine > Instance groups > your group > Edit group` +[Google Cloud Console page](https://console.developers.google.com) or using gcloud CLI: ```shell gcloud compute instance-groups managed resize kubernetes-node-pool --size=42 --zone=$ZONE ``` -The Instance Group will take care of putting appropriate image on new machines and starting them, while the Kubelet will register its Node with the API server to make it available for scheduling. If you scale the instance group down, system will randomly choose Nodes to kill. +The Instance Group will take care of putting appropriate image on new machines and starting them, +while the Kubelet will register its Node with the API server to make it available for scheduling. +If you scale the instance group down, system will randomly choose Nodes to kill. In other environments you may need to configure the machine yourself and tell the Kubelet on which machine API server is running. ### Resizing an Azure Kubernetes Service (AKS) cluster -Azure Kubernetes Service enables user-initiated resizing of the cluster from either the CLI or the Azure Portal and is described in the [Azure AKS documentation](https://docs.microsoft.com/en-us/azure/aks/scale-cluster). +Azure Kubernetes Service enables user-initiated resizing of the cluster from either the CLI or +the Azure Portal and is described in the +[Azure AKS documentation](https://docs.microsoft.com/en-us/azure/aks/scale-cluster). ### Cluster autoscaling @@ -106,7 +112,8 @@ Azure Kubernetes Service enables user-initiated resizing of the cluster from eit If you are using GCE or Google Kubernetes Engine, you can configure your cluster so that it is automatically rescaled based on pod needs. -As described in [Compute Resource](/docs/concepts/configuration/manage-compute-resources-container/), users can reserve how much CPU and memory is allocated to pods. +As described in [Compute Resource](/docs/concepts/configuration/manage-resources-containers/), +users can reserve how much CPU and memory is allocated to pods. This information is used by the Kubernetes scheduler to find a place to run the pod. If there is no node that has enough free capacity (or doesn't match other pod requirements) then the pod has to wait until some pods are terminated or a new node is added. @@ -185,7 +192,8 @@ kubectl uncordon $NODENAME If you deleted the node's VM instance and created a new one, then a new schedulable node resource will be created automatically (if you're using a cloud provider that supports -node discovery; currently this is only Google Compute Engine, not including CoreOS on Google Compute Engine using kube-register). See [Node](/docs/admin/node) for more details. +node discovery; currently this is only Google Compute Engine, not including CoreOS on Google Compute Engine using kube-register). +See [Node](/docs/concepts/architecture/nodes/) for more details. ## Advanced Topics diff --git a/content/en/docs/tasks/administer-cluster/dns-custom-nameservers.md b/content/en/docs/tasks/administer-cluster/dns-custom-nameservers.md index 9fb0452ddc..437e58f39e 100644 --- a/content/en/docs/tasks/administer-cluster/dns-custom-nameservers.md +++ b/content/en/docs/tasks/administer-cluster/dns-custom-nameservers.md @@ -50,7 +50,7 @@ and more. For more information, see [DNS for Services and Pods](/docs/concepts/s If a Pod's `dnsPolicy` is set to `default`, it inherits the name resolution configuration from the node that the Pod runs on. The Pod's DNS resolution should behave the same as the node. -But see [Known issues](/docs/tasks/debug-application-cluster/dns-debugging-resolution/#known-issues). +But see [Known issues](/docs/tasks/administer-cluster/dns-debugging-resolution/#known-issues). If you don't want this, or if you want a different DNS config for pods, you can use the kubelet's `--resolv-conf` flag. Set this flag to "" to prevent Pods from diff --git a/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade.md b/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade.md index 61c37d390b..f58b689f72 100644 --- a/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade.md +++ b/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade.md @@ -27,11 +27,8 @@ The upgrade workflow at high level is the following: 1. Upgrade additional control plane nodes. 1. Upgrade worker nodes. - - ## {{% heading "prerequisites" %}} - - You need to have a kubeadm Kubernetes cluster running version 1.18.0 or later. - [Swap must be disabled](https://serverfault.com/questions/684771/best-way-to-disable-swap-in-linux). - The cluster should use a static control plane and etcd pods or external etcd. @@ -46,8 +43,6 @@ The upgrade workflow at high level is the following: or between PATCH versions of the same MINOR. That is, you cannot skip MINOR versions when you upgrade. For example, you can upgrade from 1.y to 1.y+1, but not from 1.y to 1.y+2. - - ## Determine which version to upgrade to diff --git a/content/en/docs/tasks/administer-cluster/network-policy-provider/romana-network-policy.md b/content/en/docs/tasks/administer-cluster/network-policy-provider/romana-network-policy.md index df6adcd39f..93312e199e 100644 --- a/content/en/docs/tasks/administer-cluster/network-policy-provider/romana-network-policy.md +++ b/content/en/docs/tasks/administer-cluster/network-policy-provider/romana-network-policy.md @@ -10,14 +10,9 @@ weight: 40 This page shows how to use Romana for NetworkPolicy. - - ## {{% heading "prerequisites" %}} - -Complete steps 1, 2, and 3 of the [kubeadm getting started guide](/docs/getting-started-guides/kubeadm/). - - +Complete steps 1, 2, and 3 of the [kubeadm getting started guide](/docs/reference/setup-tools/kubeadm/kubeadm/). @@ -33,13 +28,10 @@ To apply network policies use one of the following: * [Example of Romana network policy](https://github.com/romana/core/blob/master/doc/policy.md). * The NetworkPolicy API. - - ## {{% heading "whatsnext" %}} - -Once you have installed Romana, you can follow the [Declare Network Policy](/docs/tasks/administer-cluster/declare-network-policy/) to try out Kubernetes NetworkPolicy. - - +Once you have installed Romana, you can follow the +[Declare Network Policy](/docs/tasks/administer-cluster/declare-network-policy/) +to try out Kubernetes NetworkPolicy. diff --git a/content/en/docs/tasks/administer-cluster/network-policy-provider/weave-network-policy.md b/content/en/docs/tasks/administer-cluster/network-policy-provider/weave-network-policy.md index a9d15f40a6..b6b562620a 100644 --- a/content/en/docs/tasks/administer-cluster/network-policy-provider/weave-network-policy.md +++ b/content/en/docs/tasks/administer-cluster/network-policy-provider/weave-network-policy.md @@ -10,14 +10,10 @@ weight: 50 This page shows how to use Weave Net for NetworkPolicy. - - ## {{% heading "prerequisites" %}} - -You need to have a Kubernetes cluster. Follow the [kubeadm getting started guide](/docs/getting-started-guides/kubeadm/) to bootstrap one. - - +You need to have a Kubernetes cluster. Follow the +[kubeadm getting started guide](/docs/reference/setup-tools/kubeadm/kubeadm/) to bootstrap one. @@ -25,7 +21,10 @@ You need to have a Kubernetes cluster. Follow the [kubeadm getting started guide Follow the [Integrating Kubernetes via the Addon](https://www.weave.works/docs/net/latest/kube-addon/) guide. -The Weave Net addon for Kubernetes comes with a [Network Policy Controller](https://www.weave.works/docs/net/latest/kube-addon/#npc) that automatically monitors Kubernetes for any NetworkPolicy annotations on all namespaces and configures `iptables` rules to allow or block traffic as directed by the policies. +The Weave Net addon for Kubernetes comes with a +[Network Policy Controller](https://www.weave.works/docs/net/latest/kube-addon/#npc) +that automatically monitors Kubernetes for any NetworkPolicy annotations on all +namespaces and configures `iptables` rules to allow or block traffic as directed by the policies. ## Test the installation @@ -49,13 +48,10 @@ weave-net-pmw8w 2/2 Running 0 9d Each Node has a weave Pod, and all Pods are `Running` and `2/2 READY`. (`2/2` means that each Pod has `weave` and `weave-npc`.) - - ## {{% heading "whatsnext" %}} - -Once you have installed the Weave Net addon, you can follow the [Declare Network Policy](/docs/tasks/administer-cluster/declare-network-policy/) to try out Kubernetes NetworkPolicy. If you have any question, contact us at [#weave-community on Slack or Weave User Group](https://github.com/weaveworks/weave#getting-help). - - - +Once you have installed the Weave Net addon, you can follow the +[Declare Network Policy](/docs/tasks/administer-cluster/declare-network-policy/) +to try out Kubernetes NetworkPolicy. If you have any question, contact us at +[#weave-community on Slack or Weave User Group](https://github.com/weaveworks/weave#getting-help). diff --git a/content/en/docs/tasks/administer-cluster/out-of-resource.md b/content/en/docs/tasks/administer-cluster/out-of-resource.md index a9d2ee3702..10ef986b8c 100644 --- a/content/en/docs/tasks/administer-cluster/out-of-resource.md +++ b/content/en/docs/tasks/administer-cluster/out-of-resource.md @@ -16,9 +16,6 @@ are low. This is especially important when dealing with incompressible compute resources, such as memory or disk space. If such resources are exhausted, nodes become unstable. - - - ## Eviction Policy @@ -53,8 +50,7 @@ like `free -m`. This is important because `free -m` does not work in a container, and if users use the [node allocatable](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable) feature, out of resource decisions are made local to the end user Pod part of the cgroup hierarchy as well as the -root node. This -[script](/docs/tasks/administer-cluster/out-of-resource/memory-available.sh) +root node. This [script](/docs/tasks/administer-cluster/memory-available.sh) reproduces the same set of steps that the `kubelet` performs to calculate `memory.available`. The `kubelet` excludes inactive_file (i.e. # of bytes of file-backed memory on inactive LRU list) from its calculation as it assumes that diff --git a/content/en/docs/tasks/administer-cluster/securing-a-cluster.md b/content/en/docs/tasks/administer-cluster/securing-a-cluster.md index 323f5b0a48..090e292966 100644 --- a/content/en/docs/tasks/administer-cluster/securing-a-cluster.md +++ b/content/en/docs/tasks/administer-cluster/securing-a-cluster.md @@ -56,7 +56,9 @@ an integrated [Role-Based Access Control (RBAC)](/docs/reference/access-authn-au set of permissions bundled into roles. These permissions combine verbs (get, create, delete) with resources (pods, services, nodes) and can be namespace or cluster scoped. A set of out of the box roles are provided that offer reasonable default separation of responsibility depending on what -actions a client might want to perform. It is recommended that you use the [Node](/docs/reference/access-authn-authz/node/) and [RBAC](/docs/reference/access-authn-authz/rbac/) authorizers together, in combination with the +actions a client might want to perform. It is recommended that you use the +[Node](/docs/reference/access-authn-authz/node/) and +[RBAC](/docs/reference/access-authn-authz/rbac/) authorizers together, in combination with the [NodeRestriction](/docs/reference/access-authn-authz/admission-controllers/#noderestriction) admission plugin. As with authentication, simple and broad roles may be appropriate for smaller clusters, but as @@ -79,7 +81,7 @@ Kubelets expose HTTPS endpoints which grant powerful control over the node and c Production clusters should enable Kubelet authentication and authorization. -Consult the [Kubelet authentication/authorization reference](/docs/admin/kubelet-authentication-authorization) for more information. +Consult the [Kubelet authentication/authorization reference](/docs/reference/command-line-tools-reference/kubelet-authentication-authorization) for more information. ## Controlling the capabilities of a workload or user at runtime @@ -252,9 +254,8 @@ are not encrypted or an attacker gains read access to etcd. ### Receiving alerts for security updates and reporting vulnerabilities Join the [kubernetes-announce](https://groups.google.com/forum/#!forum/kubernetes-announce) -group for emails about security announcements. See the [security reporting](/security/) +group for emails about security announcements. See the +[security reporting](/docs/reference/issues-security/security/) page for more on how to report vulnerabilities. - - diff --git a/content/en/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes.md b/content/en/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes.md index 1630708182..6d5363ee58 100644 --- a/content/en/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes.md +++ b/content/en/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes.md @@ -8,7 +8,7 @@ weight: 110 This page shows how to configure liveness, readiness and startup probes for containers. -The [kubelet](/docs/admin/kubelet/) uses liveness probes to know when to +The [kubelet](/docs/reference/command-line-tools-reference/kubelet/) uses liveness probes to know when to restart a container. For example, liveness probes could catch a deadlock, where an application is running, but unable to make progress. Restarting a container in such a state can help to make the application more available diff --git a/content/en/docs/tasks/configure-pod-container/configure-persistent-volume-storage.md b/content/en/docs/tasks/configure-pod-container/configure-persistent-volume-storage.md index 6ff6c21530..60e45804c9 100644 --- a/content/en/docs/tasks/configure-pod-container/configure-persistent-volume-storage.md +++ b/content/en/docs/tasks/configure-pod-container/configure-persistent-volume-storage.md @@ -29,13 +29,11 @@ PersistentVolume. {{< glossary_tooltip text="kubectl" term_id="kubectl" >}} command-line tool must be configured to communicate with your cluster. If you do not already have a single-node cluster, you can create one by using -[Minikube](/docs/getting-started-guides/minikube). +[Minikube](/docs/setup/learning-environment/minikube/). * Familiarize yourself with the material in [Persistent Volumes](/docs/concepts/storage/persistent-volumes/). - - ## Create an index.html file on your Node diff --git a/content/en/docs/tasks/configure-pod-container/configure-service-account.md b/content/en/docs/tasks/configure-pod-container/configure-service-account.md index f1b1e22db9..e3f97dd5ce 100644 --- a/content/en/docs/tasks/configure-pod-container/configure-service-account.md +++ b/content/en/docs/tasks/configure-pod-container/configure-service-account.md @@ -39,10 +39,14 @@ When they do, they are authenticated as a particular Service Account (for exampl When you create a pod, if you do not specify a service account, it is automatically assigned the `default` service account in the same namespace. -If you get the raw json or yaml for a pod you have created (for example, `kubectl get pods/ -o yaml`), you can see the `spec.serviceAccountName` field has been [automatically set](/docs/user-guide/working-with-resources/#resources-are-automatically-modified). +If you get the raw json or yaml for a pod you have created (for example, `kubectl get pods/ -o yaml`), +you can see the `spec.serviceAccountName` field has been +[automatically set](/docs/concepts/overview/working-with-objects/object-management/). -You can access the API from inside a pod using automatically mounted service account credentials, as described in [Accessing the Cluster](/docs/user-guide/accessing-the-cluster/#accessing-the-api-from-a-pod). -The API permissions of the service account depend on the [authorization plugin and policy](/docs/reference/access-authn-authz/authorization/#authorization-modules) in use. +You can access the API from inside a pod using automatically mounted service account credentials, as described in +[Accessing the Cluster](/docs/tasks/access-application-cluster/access-cluster). +The API permissions of the service account depend on the +[authorization plugin and policy](/docs/reference/access-authn-authz/authorization/#authorization-modules) in use. In version 1.6+, you can opt out of automounting API credentials for a service account by setting `automountServiceAccountToken: false` on the service account: diff --git a/content/en/docs/tasks/configure-pod-container/security-context.md b/content/en/docs/tasks/configure-pod-container/security-context.md index ede2952a97..10afee8640 100644 --- a/content/en/docs/tasks/configure-pod-container/security-context.md +++ b/content/en/docs/tasks/configure-pod-container/security-context.md @@ -243,7 +243,7 @@ exit ## Set capabilities for a Container -With [Linux capabilities](http://man7.org/linux/man-pages/man7/capabilities.7.html), +With [Linux capabilities](https://man7.org/linux/man-pages/man7/capabilities.7.html), you can grant certain privileges to a process without granting all the privileges of the root user. To add or remove Linux capabilities for a Container, include the `capabilities` field in the `securityContext` section of the Container manifest. diff --git a/content/en/docs/tasks/extend-kubernetes/configure-multiple-schedulers.md b/content/en/docs/tasks/extend-kubernetes/configure-multiple-schedulers.md index b14777111e..b0e272afa0 100644 --- a/content/en/docs/tasks/extend-kubernetes/configure-multiple-schedulers.md +++ b/content/en/docs/tasks/extend-kubernetes/configure-multiple-schedulers.md @@ -9,7 +9,8 @@ weight: 20 -Kubernetes ships with a default scheduler that is described [here](/docs/admin/kube-scheduler/). +Kubernetes ships with a default scheduler that is described +[here](/docs/reference/command-line-tools-reference/kube-scheduler/). If the default scheduler does not suit your needs you can implement your own scheduler. Not just that, you can even run multiple schedulers simultaneously alongside the default scheduler and instruct Kubernetes what scheduler to use for each of your pods. Let's @@ -20,16 +21,10 @@ document. Please refer to the kube-scheduler implementation in [pkg/scheduler](https://github.com/kubernetes/kubernetes/tree/{{< param "githubbranch" >}}/pkg/scheduler) in the Kubernetes source directory for a canonical example. - - - ## {{% heading "prerequisites" %}} - {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} - - ## Package the scheduler @@ -83,7 +78,7 @@ Note also that we created a dedicated service account `my-scheduler` and bind th `system:kube-scheduler` to it so that it can acquire the same privileges as `kube-scheduler`. Please see the -[kube-scheduler documentation](/docs/admin/kube-scheduler/) for +[kube-scheduler documentation](/docs/reference/command-line-tools-reference/kube-scheduler/) for detailed description of other command line arguments. ## Run the second scheduler in the cluster @@ -100,6 +95,7 @@ Verify that the scheduler pod is running: ```shell kubectl get pods --namespace=kube-system ``` + ``` NAME READY STATUS RESTARTS AGE .... @@ -125,8 +121,10 @@ The control plane creates the lock objects for you, but the namespace must alrea You can use the `kube-system` namespace. {{< /note >}} -If RBAC is enabled on your cluster, you must update the `system:kube-scheduler` cluster role. Add your scheduler name to the resourceNames of the rule applied for `endpoints` and `leases` resources, as in the following example: -``` +If RBAC is enabled on your cluster, you must update the `system:kube-scheduler` cluster role. +Add your scheduler name to the resourceNames of the rule applied for `endpoints` and `leases` resources, as in the following example: + +```shell kubectl edit clusterrole system:kube-scheduler ``` @@ -134,10 +132,11 @@ kubectl edit clusterrole system:kube-scheduler ## Specify schedulers for pods -Now that our second scheduler is running, let's create some pods, and direct them to be scheduled by either the default scheduler or the one we just deployed. In order to schedule a given pod using a specific scheduler, we specify the name of the +Now that our second scheduler is running, let's create some pods, and direct them +to be scheduled by either the default scheduler or the one we just deployed. +In order to schedule a given pod using a specific scheduler, we specify the name of the scheduler in that pod spec. Let's look at three examples. - - Pod spec without any scheduler name {{< codenew file="admin/sched/pod1.yaml" >}} @@ -147,9 +146,9 @@ scheduler in that pod spec. Let's look at three examples. Save this file as `pod1.yaml` and submit it to the Kubernetes cluster. -```shell -kubectl create -f pod1.yaml -``` + ```shell + kubectl create -f pod1.yaml + ``` - Pod spec with `default-scheduler` @@ -160,9 +159,9 @@ kubectl create -f pod1.yaml Save this file as `pod2.yaml` and submit it to the Kubernetes cluster. -```shell -kubectl create -f pod2.yaml -``` + ```shell + kubectl create -f pod2.yaml + ``` - Pod spec with `my-scheduler` @@ -174,17 +173,15 @@ kubectl create -f pod2.yaml Save this file as `pod3.yaml` and submit it to the Kubernetes cluster. -```shell -kubectl create -f pod3.yaml -``` + ```shell + kubectl create -f pod3.yaml + ``` Verify that all three pods are running. -```shell -kubectl get pods -``` - - + ```shell + kubectl get pods + ``` @@ -206,4 +203,3 @@ verify that the pods were scheduled by the desired schedulers. kubectl get events ``` - diff --git a/content/en/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definition-versioning.md b/content/en/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definition-versioning.md index 4d50a9fed9..71ca43d530 100644 --- a/content/en/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definition-versioning.md +++ b/content/en/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definition-versioning.md @@ -13,19 +13,15 @@ This page explains how to add versioning information to [CustomResourceDefinitions](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#customresourcedefinition-v1beta1-apiextensions), to indicate the stability level of your CustomResourceDefinitions or advance your API to a new version with conversion between API representations. It also describes how to upgrade an object from one version to another. - - ## {{% heading "prerequisites" %}} {{< include "task-tutorial-prereqs.md" >}} -You should have a initial understanding of [custom resources](/docs/concepts/api-extension/custom-resources/). +You should have a initial understanding of [custom resources](/docs/concepts/extend-kubernetes/api-extension/custom-resources/). {{< version-check >}} - - ## Overview @@ -374,7 +370,9 @@ conversions that call an external service in case a conversion is required. For * Watch is created in one version but the changed object is stored in another version. * custom resource PUT request is in a different version than storage version. -To cover all of these cases and to optimize conversion by the API server, the conversion requests may contain multiple objects in order to minimize the external calls. The webhook should perform these conversions independently. +To cover all of these cases and to optimize conversion by the API server, +the conversion requests may contain multiple objects in order to minimize the external calls. +The webhook should perform these conversions independently. ### Write a conversion webhook server @@ -385,7 +383,12 @@ that is validated in a Kubernetes e2e test. The webhook handles the results wrapped in `ConversionResponse`. Note that the request contains a list of custom resources that need to be converted independently without changing the order of objects. -The example server is organized in a way to be reused for other conversions. Most of the common code are located in the [framework file](https://github.com/kubernetes/kubernetes/tree/v1.15.0/test/images/crd-conversion-webhook/converter/framework.go) that leaves only [one function](https://github.com/kubernetes/kubernetes/blob/v1.15.0/test/images/crd-conversion-webhook/converter/example_converter.go#L29-L80) to be implemented for different conversions. +The example server is organized in a way to be reused for other conversions. +Most of the common code are located in the +[framework file](https://github.com/kubernetes/kubernetes/tree/v1.15.0/test/images/crd-conversion-webhook/converter/framework.go) +that leaves only +[one function](https://github.com/kubernetes/kubernetes/blob/v1.15.0/test/images/crd-conversion-webhook/converter/example_converter.go#L29-L80) +to be implemented for different conversions. {{< note >}} The example conversion webhook server leaves the `ClientAuth` field @@ -398,12 +401,17 @@ how to [authenticate API servers](/docs/reference/access-authn-authz/extensible- #### Permissible mutations -A conversion webhook must not mutate anything inside of `metadata` of the converted object other than `labels` and `annotations`. Attempted changes to `name`, `UID` and `namespace` are rejected and fail the request which caused the conversion. All other changes are just ignored. +A conversion webhook must not mutate anything inside of `metadata` of the converted object +other than `labels` and `annotations`. +Attempted changes to `name`, `UID` and `namespace` are rejected and fail the request +which caused the conversion. All other changes are just ignored. ### Deploy the conversion webhook service -Documentation for deploying the conversion webhook is the same as for the [admission webhook example service](/docs/reference/access-authn-authz/extensible-admission-controllers/#deploy_the_admission_webhook_service). -The assumption for next sections is that the conversion webhook server is deployed to a service named `example-conversion-webhook-server` in `default` namespace and serving traffic on path `/crdconvert`. +Documentation for deploying the conversion webhook is the same as for the +[admission webhook example service](/docs/reference/access-authn-authz/extensible-admission-controllers/#deploy_the_admission_webhook_service). +The assumption for next sections is that the conversion webhook server is deployed to a service +named `example-conversion-webhook-server` in `default` namespace and serving traffic on path `/crdconvert`. {{< note >}} When the webhook server is deployed into the Kubernetes cluster as a @@ -639,7 +647,7 @@ at the subpath "/my-path", and to verify the TLS connection against the ServerNa {{< tabs name="CustomResourceDefinition_versioning_example_4" >}} {{% tab name="apiextensions.k8s.io/v1" %}} ```yaml -apiVersion: apiextensions.k8s.io/v1b +apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition ... spec: diff --git a/content/en/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions.md b/content/en/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions.md index 78b55b58dc..834c6983f7 100644 --- a/content/en/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions.md +++ b/content/en/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions.md @@ -16,7 +16,6 @@ This page shows how to install a into the Kubernetes API by creating a [CustomResourceDefinition](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#customresourcedefinition-v1beta1-apiextensions). - ## {{% heading "prerequisites" %}} @@ -24,9 +23,7 @@ into the Kubernetes API by creating a * Make sure your Kubernetes cluster has a master version of 1.16.0 or higher to use `apiextensions.k8s.io/v1`, or 1.7.0 or higher for `apiextensions.k8s.io/v1beta1`. -* Read about [custom resources](/docs/concepts/api-extension/custom-resources/). - - +* Read about [custom resources](/docs/concepts/extend-kubernetes/api-extension/custom-resources/). @@ -427,7 +424,9 @@ spec: The field `someRandomField` has been pruned. -Note that the `kubectl create` call uses `--validate=false` to skip client-side validation. Because the [OpenAPI validation schemas are also published](/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#publish-validation-schema-in-openapi-v2) to kubectl, it will also check for unknown fields and reject those objects long before they are sent to the API server. +Note that the `kubectl create` call uses `--validate=false` to skip client-side validation. +Because the [OpenAPI validation schemas are also published](/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#publish-validation-schema-in-openapi-v2) +to kubectl, it will also check for unknown fields and reject those objects long before they are sent to the API server. ### Controlling pruning @@ -533,11 +532,14 @@ allOf: With one of those specification, both an integer and a string validate. -In [Validation Schema Publishing](/docs/tasks/extend-kubernetes/custom-resources/extend-api-custom-resource-definitions/#publish-validation-schema-in-openapi-v2), `x-kubernetes-int-or-string: true` is unfolded to one of the two patterns shown above. +In [Validation Schema Publishing](/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#publish-validation-schema-in-openapi-v2), +`x-kubernetes-int-or-string: true` is unfolded to one of the two patterns shown above. ### RawExtension -RawExtensions (as in `runtime.RawExtension` defined in [k8s.io/apimachinery](https://github.com/kubernetes/apimachinery/blob/03ac7a9ade429d715a1a46ceaa3724c18ebae54f/pkg/runtime/types.go#L94)) holds complete Kubernetes objects, i.e. with `apiVersion` and `kind` fields. +RawExtensions (as in `runtime.RawExtension` defined in +[k8s.io/apimachinery](https://github.com/kubernetes/apimachinery/blob/03ac7a9ade429d715a1a46ceaa3724c18ebae54f/pkg/runtime/types.go#L94)) +holds complete Kubernetes objects, i.e. with `apiVersion` and `kind` fields. It is possible to specify those embedded objects (both completely without constraints or partially specified) by setting `x-kubernetes-embedded-resource: true`. For example: @@ -569,8 +571,6 @@ See [Custom resource definition versioning](/docs/tasks/extend-kubernetes/custom for more information about serving multiple versions of your CustomResourceDefinition and migrating your objects from one version to another. - - ## Advanced topics diff --git a/content/en/docs/tasks/inject-data-application/define-environment-variable-container.md b/content/en/docs/tasks/inject-data-application/define-environment-variable-container.md index d75d930c56..cbc3c45260 100644 --- a/content/en/docs/tasks/inject-data-application/define-environment-variable-container.md +++ b/content/en/docs/tasks/inject-data-application/define-environment-variable-container.md @@ -9,17 +9,10 @@ weight: 20 This page shows how to define environment variables for a container in a Kubernetes Pod. - - - ## {{% heading "prerequisites" %}} - {{< include "task-tutorial-prereqs.md" >}} - - - ## Define an environment variable for a container @@ -123,13 +116,10 @@ spec: Upon creation, the command `echo Warm greetings to The Most Honorable Kubernetes` is run on the container. - - ## {{% heading "whatsnext" %}} - * Learn more about [environment variables](/docs/tasks/inject-data-application/environment-variable-expose-pod-information/). -* Learn about [using secrets as environment variables](/docs/user-guide/secrets/#using-secrets-as-environment-variables). +* Learn about [using secrets as environment variables](/docs/concepts/configuration/secret/#using-secrets-as-environment-variables). * See [EnvVarSource](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#envvarsource-v1-core). diff --git a/content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md b/content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md index e5f0d3a6b7..693e730a09 100644 --- a/content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md +++ b/content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md @@ -128,8 +128,8 @@ You can read more about removing jobs in [garbage collection](/docs/concepts/wor ## Writing a Cron Job Spec As with all other Kubernetes configs, a cron job needs `apiVersion`, `kind`, and `metadata` fields. For general -information about working with config files, see [deploying applications](/docs/user-guide/deploying-applications), -and [using kubectl to manage resources](/docs/user-guide/working-with-resources) documents. +information about working with config files, see [deploying applications](/docs/tasks/run-application/run-stateless-application-deployment/), +and [using kubectl to manage resources](/docs/concepts/overview/working-with-objects/object-management/) documents. A cron job config also needs a [`.spec` section](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status). @@ -142,7 +142,8 @@ All modifications to a cron job, especially its `.spec`, are applied only to the The `.spec.schedule` is a required field of the `.spec`. It takes a [Cron](https://en.wikipedia.org/wiki/Cron) format string, such as `0 * * * *` or `@hourly`, as schedule time of its jobs to be created and executed. -The format also includes extended `vixie cron` step values. As explained in the [FreeBSD manual](https://www.freebsd.org/cgi/man.cgi?crontab%285%29): +The format also includes extended `vixie cron` step values. As explained in the +[FreeBSD manual](https://www.freebsd.org/cgi/man.cgi?crontab%285%29): > Step values can be used in conjunction with ranges. Following a range > with `/` specifies skips of the number's value through the diff --git a/content/en/docs/tasks/job/coarse-parallel-processing-work-queue.md b/content/en/docs/tasks/job/coarse-parallel-processing-work-queue.md index 346fbdda8d..1bbb49a256 100644 --- a/content/en/docs/tasks/job/coarse-parallel-processing-work-queue.md +++ b/content/en/docs/tasks/job/coarse-parallel-processing-work-queue.md @@ -17,25 +17,20 @@ from a task queue, completes it, deletes it from the queue, and exits. Here is an overview of the steps in this example: 1. **Start a message queue service.** In this example, we use RabbitMQ, but you could use another - one. In practice you would set up a message queue service once and reuse it for many jobs. + one. In practice you would set up a message queue service once and reuse it for many jobs. 1. **Create a queue, and fill it with messages.** Each message represents one task to be done. In - this example, a message is just an integer that we will do a lengthy computation on. + this example, a message is just an integer that we will do a lengthy computation on. 1. **Start a Job that works on tasks from the queue**. The Job starts several pods. Each pod takes - one task from the message queue, processes it, and repeats until the end of the queue is reached. - - - + one task from the message queue, processes it, and repeats until the end of the queue is reached. ## {{% heading "prerequisites" %}} Be familiar with the basic, -non-parallel, use of [Job](/docs/concepts/jobs/run-to-completion-finite-workloads/). +non-parallel, use of [Job](/docs/concepts/workloads/controllers/job/). {{< include "task-tutorial-prereqs.md" >}} - - ## Starting a message queue service @@ -304,7 +299,7 @@ do not need to modify your "worker" program to be aware that there is a work que It does require that you run a message queue service. If running a queue service is inconvenient, you may -want to consider one of the other [job patterns](/docs/concepts/jobs/run-to-completion-finite-workloads/#job-patterns). +want to consider one of the other [job patterns](/docs/concepts/workloads/controllers/job/#job-patterns). This approach creates a pod for every work item. If your work items only take a few seconds, though, creating a Pod for every work item may add a lot of overhead. Consider another diff --git a/content/en/docs/tasks/job/fine-parallel-processing-work-queue.md b/content/en/docs/tasks/job/fine-parallel-processing-work-queue.md index f502113c8f..7f3c30121e 100644 --- a/content/en/docs/tasks/job/fine-parallel-processing-work-queue.md +++ b/content/en/docs/tasks/job/fine-parallel-processing-work-queue.md @@ -16,31 +16,24 @@ from a task queue, processes it, and repeats until the end of the queue is reach Here is an overview of the steps in this example: 1. **Start a storage service to hold the work queue.** In this example, we use Redis to store - our work items. In the previous example, we used RabbitMQ. In this example, we use Redis and - a custom work-queue client library because AMQP does not provide a good way for clients to - detect when a finite-length work queue is empty. In practice you would set up a store such - as Redis once and reuse it for the work queues of many jobs, and other things. + our work items. In the previous example, we used RabbitMQ. In this example, we use Redis and + a custom work-queue client library because AMQP does not provide a good way for clients to + detect when a finite-length work queue is empty. In practice you would set up a store such + as Redis once and reuse it for the work queues of many jobs, and other things. 1. **Create a queue, and fill it with messages.** Each message represents one task to be done. In - this example, a message is just an integer that we will do a lengthy computation on. + this example, a message is just an integer that we will do a lengthy computation on. 1. **Start a Job that works on tasks from the queue**. The Job starts several pods. Each pod takes - one task from the message queue, processes it, and repeats until the end of the queue is reached. - - - + one task from the message queue, processes it, and repeats until the end of the queue is reached. ## {{% heading "prerequisites" %}} {{< include "task-tutorial-prereqs.md" >}} - - Be familiar with the basic, -non-parallel, use of [Job](/docs/concepts/jobs/run-to-completion-finite-workloads/). - - +non-parallel, use of [Job](/docs/concepts/workloads/controllers/job/). @@ -227,14 +220,13 @@ Working on lemon As you can see, one of our pods worked on several work units. - - ## Alternatives If running a queue service or modifying your containers to use a work queue is inconvenient, you may -want to consider one of the other [job patterns](/docs/concepts/jobs/run-to-completion-finite-workloads/#job-patterns). +want to consider one of the other +[job patterns](/docs/concepts/workloads/controllers/job/#job-patterns). If you have a continuous stream of background processing work to run, then consider running your background workers with a `ReplicaSet` instead, diff --git a/content/en/docs/tasks/job/parallel-processing-expansion.md b/content/en/docs/tasks/job/parallel-processing-expansion.md index 3477be2650..e92fa9f5bb 100644 --- a/content/en/docs/tasks/job/parallel-processing-expansion.md +++ b/content/en/docs/tasks/job/parallel-processing-expansion.md @@ -17,12 +17,10 @@ The sample Jobs process each item simply by printing a string then pausing. See [using Jobs in real workloads](#using-jobs-in-real-workloads) to learn about how this pattern fits more realistic use cases. - ## {{% heading "prerequisites" %}} - You should be familiar with the basic, -non-parallel, use of [Job](/docs/concepts/jobs/run-to-completion-finite-workloads/). +non-parallel, use of [Job](/docs/concepts/workloads/controllers/job/). {{< include "task-tutorial-prereqs.md" >}} @@ -33,12 +31,11 @@ To follow the advanced templating example, you need a working installation of library for Python. Once you have Python set up, you can install Jinja2 by running: + ```shell pip install --user jinja2 ``` - - ## Create Jobs based on a template @@ -305,7 +302,7 @@ If you plan to create a large number of Job objects, you may find that: on Jobs: the API server permanently rejects some of your requests when you create a great deal of work in one batch. -There are other [job patterns](/docs/concepts/jobs/run-to-completion-finite-workloads/#job-patterns) +There are other [job patterns](/docs/concepts/workloads/controllers/job/#job-patterns) that you can use to process large amounts of work without creating very many Job objects. diff --git a/content/en/docs/tasks/manage-daemon/update-daemon-set.md b/content/en/docs/tasks/manage-daemon/update-daemon-set.md index b9168ed098..f9e35cb0f5 100644 --- a/content/en/docs/tasks/manage-daemon/update-daemon-set.md +++ b/content/en/docs/tasks/manage-daemon/update-daemon-set.md @@ -10,17 +10,10 @@ weight: 10 This page shows how to perform a rolling update on a DaemonSet. - - - ## {{% heading "prerequisites" %}} - * The DaemonSet rolling update feature is only supported in Kubernetes version 1.6 or later. - - - ## DaemonSet Update Strategy @@ -164,7 +157,7 @@ make room for new DaemonSet pods. {{< note >}} This will cause service disruption when deleted pods are not controlled by any controllers or pods are not -replicated. This does not respect [PodDisruptionBudget](/docs/tasks/configure-pod-container/configure-pod-disruption-budget/) +replicated. This does not respect [PodDisruptionBudget](/docs/tasks/run-application/configure-pdb/) either. {{< /note >}} diff --git a/content/en/docs/tasks/tls/manual-rotation-of-ca-certificates.md b/content/en/docs/tasks/tls/manual-rotation-of-ca-certificates.md index a55ff3b5fd..9d7516aeef 100644 --- a/content/en/docs/tasks/tls/manual-rotation-of-ca-certificates.md +++ b/content/en/docs/tasks/tls/manual-rotation-of-ca-certificates.md @@ -14,53 +14,54 @@ This page shows how to manually rotate the certificate authority (CA) certificat - For more information about authentication in Kubernetes, see [Authenticating](/docs/reference/access-authn-authz/authentication). -- For more information about best practices for CA certificates, see [Single root CA](docs/setup/best-practices/certificates/#single-root-ca). +- For more information about best practices for CA certificates, see [Single root CA](/docs/setup/best-practices/certificates/#single-root-ca). ## Rotate the CA certificates manually {{< caution >}} - Make sure to back up your certificate directory along with configuration files and any other necessary files. -This approach assumes operation of the Kubernetes control plane in a HA configuration with multiple API servers. Graceful termination of the API server is also assumed so clients can cleanly disconnect from one API server and reconnect to another. +This approach assumes operation of the Kubernetes control plane in a HA configuration with multiple API servers. +Graceful termination of the API server is also assumed so clients can cleanly disconnect from one API server and reconnect to another. Configurations with a single API server will experience unavailability while the API server is being restarted. - {{< /caution >}} -1. Distribute the new CA certificates and private keys (ex: `ca.crt`, `ca.key`, `front-proxy-ca.crt`, and `front-proxy-ca.key`) to all your control plane nodes in the Kubernetes certificates directory. +1. Distribute the new CA certificates and private keys + (ex: `ca.crt`, `ca.key`, `front-proxy-ca.crt`, and `front-proxy-ca.key`) + to all your control plane nodes in the Kubernetes certificates directory. 1. Update *Kubernetes controller manager's* `--root-ca-file` to include both old and new CA and restart controller manager. - Any service account created after this point will get secrets that include both old and new CAs. + Any service account created after this point will get secrets that include both old and new CAs. - {{< note >}} - - Remove the flag `--client-ca-file` from the *Kubernetes controller manager* configuration. You can also replace the existing client CA file or change this configuration item to reference a new, updated CA. [Issue 1350](https://github.com/kubernetes/kubeadm/issues/1350) tracks an issue with *Kubernetes controller manager* being unable to accept a CA bundle. - - {{< /note >}} + {{< note >}} + Remove the flag `--client-ca-file` from the *Kubernetes controller manager* configuration. + You can also replace the existing client CA file or change this configuration item to reference a new, updated CA. + [Issue 1350](https://github.com/kubernetes/kubeadm/issues/1350) tracks an issue with *Kubernetes controller manager* being unable to accept a CA bundle. + {{< /note >}} 1. Update all service account tokens to include both old and new CA certificates. - If any pods are started before new CA is used by API servers, they will get this update and trust both old and new CAs. + If any pods are started before new CA is used by API servers, they will get this update and trust both old and new CAs. - ```shell - base64_encoded_ca="$(base64 )" + ```shell + base64_encoded_ca="$(base64 )" - for namespace in $(kubectl get ns --no-headers | awk '{print $1}'); do - for token in $(kubectl get secrets --namespace "$namespace" --field-selector type=kubernetes.io/service-account-token -o name); do - kubectl get $token --namespace "$namespace" -o yaml | \ - /bin/sed "s/\(ca.crt:\).*/\1 ${base64_encoded_ca}" | \ - kubectl apply -f - - done - done - ``` + for namespace in $(kubectl get ns --no-headers | awk '{print $1}'); do + for token in $(kubectl get secrets --namespace "$namespace" --field-selector type=kubernetes.io/service-account-token -o name); do + kubectl get $token --namespace "$namespace" -o yaml | \ + /bin/sed "s/\(ca.crt:\).*/\1 ${base64_encoded_ca}" | \ + kubectl apply -f - + done + done + ``` 1. Restart all pods using in-cluster configs (ex: kube-proxy, coredns, etc) so they can use the updated certificate authority data from *ServiceAccount* secrets. - * Make sure coredns, kube-proxy and other pods using in-cluster configs are working as expected. + * Make sure coredns, kube-proxy and other pods using in-cluster configs are working as expected. 1. Append the both old and new CA to the file against `--client-ca-file` and `--kubelet-certificate-authority` flag in the `kube-apiserver` configuration. @@ -68,77 +69,88 @@ Configurations with a single API server will experience unavailability while the 1. Update certificates for user accounts by replacing the content of `client-certificate-data` and `client-key-data` respectively. - For information about creating certificates for individual user accounts, see [Configure certificates for user accounts](/docs/setup/best-practices/certificates/#configure-certificates-for-user-accounts). + For information about creating certificates for individual user accounts, see + [Configure certificates for user accounts](/docs/setup/best-practices/certificates/#configure-certificates-for-user-accounts). - Additionally, update the `certificate-authority-data` section in the kubeconfig files, respectively with Base64-encoded old and new certificate authority data + Additionally, update the `certificate-authority-data` section in the kubeconfig files, + respectively with Base64-encoded old and new certificate authority data 1. Follow below steps in a rolling fashion. - 1. Restart any other *[aggregated api servers](/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/)* or *webhook handlers* to trust the new CA certificates. + 1. Restart any other *[aggregated api servers](/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/)* + or *webhook handlers* to trust the new CA certificates. - 1. Restart the kubelet by update the file against `clientCAFile` in kubelet configuration and `certificate-authority-data` in kubelet.conf to use both the old and new CA on all nodes. + 1. Restart the kubelet by update the file against `clientCAFile` in kubelet configuration and + `certificate-authority-data` in kubelet.conf to use both the old and new CA on all nodes. - If your kubelet is not using client certificate rotation update `client-certificate-data` and `client-key-data` in kubelet.conf on all nodes along with the kubelet client certificate file usually found in `/var/lib/kubelet/pki`. + If your kubelet is not using client certificate rotation update `client-certificate-data` and + `client-key-data` in kubelet.conf on all nodes along with the kubelet client certificate file + usually found in `/var/lib/kubelet/pki`. - 1. Restart API servers with the certificates (`apiserver.crt`, `apiserver-kubelet-client.crt` and `front-proxy-client.crt`) signed by new CA. You can use the existing private keys or new private keys. If you changed the private keys then update these in the Kubernetes certificates directory as well. + 1. Restart API servers with the certificates (`apiserver.crt`, `apiserver-kubelet-client.crt` and + `front-proxy-client.crt`) signed by new CA. + You can use the existing private keys or new private keys. + If you changed the private keys then update these in the Kubernetes certificates directory as well. - Since the pod trusts both old and new CAs, there will be a momentarily disconnection after which the pod's kube client will reconnect to the new API server that uses the certificate signed by the new CA. + Since the pod trusts both old and new CAs, there will be a momentarily disconnection + after which the pod's kube client will reconnect to the new API server + that uses the certificate signed by the new CA. - * Restart Scheduler to use the new CAs. + * Restart Scheduler to use the new CAs. - * Make sure control plane components logs no TLS errors. + * Make sure control plane components logs no TLS errors. - {{< note >}} + {{< note >}} + To generate certificates and private keys for your cluster using the `openssl` command line tool, see [Certificates (`openssl`)](/docs/concepts/cluster-administration/certificates/#openssl). + You can also use [`cfssl`](/docs/concepts/cluster-administration/certificates/#cfssl). + {{< /note >}} - To generate certificates and private keys for your cluster using the `openssl` command line tool, see [Certificates (`openssl`)](/docs/concepts/cluster-administration/certificates/#openssl). - You can also use [`cfssl`](/docs/concepts/cluster-administration/certificates/#cfssl). + 1. Annotate any Daemonsets and Deployments to trigger pod replacement in a safer rolling fashion. - {{< /note >}} + Example: - 1. Annotate any Daemonsets and Deployments to trigger pod replacement in a safer rolling fashion. + ```shell + for namespace in $(kubectl get namespace -o jsonpath='{.items[*].metadata.name}'); do + for name in $(kubectl get deployments -n $namespace -o jsonpath='{.items[*].metadata.name}'); do + kubectl patch deployment -n ${namespace} ${name} -p '{"spec":{"template":{"metadata":{"annotations":{"ca-rotation": "1"}}}}}'; + done + for name in $(kubectl get daemonset -n $namespace -o jsonpath='{.items[*].metadata.name}'); do + kubectl patch daemonset -n ${namespace} ${name} -p '{"spec":{"template":{"metadata":{"annotations":{"ca-rotation": "1"}}}}}'; + done + done + ``` - Example: - - ```shell - for namespace in $(kubectl get namespace -o jsonpath='{.items[*].metadata.name}'); do - for name in $(kubectl get deployments -n $namespace -o jsonpath='{.items[*].metadata.name}'); do - kubectl patch deployment -n ${namespace} ${name} -p '{"spec":{"template":{"metadata":{"annotations":{"ca-rotation": "1"}}}}}'; - done - for name in $(kubectl get daemonset -n $namespace -o jsonpath='{.items[*].metadata.name}'); do - kubectl patch daemonset -n ${namespace} ${name} -p '{"spec":{"template":{"metadata":{"annotations":{"ca-rotation": "1"}}}}}'; - done - done - ``` - - {{< note >}} - - To limit the number of concurrent disruptions that your application experiences, see [configure pod disruption budget](docs/tasks/run-application/configure-pdb/). - - {{< /note >}} + {{< note >}} + To limit the number of concurrent disruptions that your application experiences, + see [configure pod disruption budget](/docs/tasks/run-application/configure-pdb/). + {{< /note >}} 1. If your cluster is using bootstrap tokens to join nodes, update the ConfigMap `cluster-info` in the `kube-public` namespace with new CA. - ```shell - base64_encoded_ca="$(base64 /etc/kubernetes/pki/ca.crt)" + ```shell + base64_encoded_ca="$(base64 /etc/kubernetes/pki/ca.crt)" - kubectl get cm/cluster-info --namespace kube-public -o yaml | \ - /bin/sed "s/\(certificate-authority-data:\).*/\1 ${base64_encoded_ca}" | \ - kubectl apply -f - - ``` + kubectl get cm/cluster-info --namespace kube-public -o yaml | \ + /bin/sed "s/\(certificate-authority-data:\).*/\1 ${base64_encoded_ca}" | \ + kubectl apply -f - + ``` 1. Verify the cluster functionality. - 1. Validate the logs from control plane components, along with the kubelet and the kube-proxy are not throwing any tls errors, see [looking at the logs](/docs/tasks/debug-application-cluster/debug-cluster/#looking-at-logs). + 1. Validate the logs from control plane components, along with the kubelet and the + kube-proxy are not throwing any tls errors, see + [looking at the logs](/docs/tasks/debug-application-cluster/debug-cluster/#looking-at-logs). - 1. Validate logs from any aggregated api servers and pods using in-cluster config. + 1. Validate logs from any aggregated api servers and pods using in-cluster config. 1. Once the cluster functionality is successfully verified: - 1. Update all service account tokens to include new CA certificate only. + 1. Update all service account tokens to include new CA certificate only. - * All pods using an in-cluster kubeconfig will eventually need to be restarted to pick up the new SA secret for the old CA to be completely untrusted. + * All pods using an in-cluster kubeconfig will eventually need to be restarted to pick up the new SA secret for the old CA to be completely untrusted. - 1. Restart the control plane components by removing the old CA from the kubeconfig files and the files against `--client-ca-file`, `--root-ca-file` flags resp. + 1. Restart the control plane components by removing the old CA from the kubeconfig files and the files against `--client-ca-file`, `--root-ca-file` flags resp. + + 1. Restart kubelet by removing the old CA from file against the `clientCAFile` flag and kubelet kubeconfig file. - 1. Restart kubelet by removing the old CA from file against the `clientCAFile` flag and kubelet kubeconfig file. diff --git a/content/en/docs/tasks/tools/install-kubectl.md b/content/en/docs/tasks/tools/install-kubectl.md index 22b960751f..e3d6c0aa9c 100644 --- a/content/en/docs/tasks/tools/install-kubectl.md +++ b/content/en/docs/tasks/tools/install-kubectl.md @@ -310,7 +310,12 @@ You can install kubectl as part of the Google Cloud SDK. ## Verifying kubectl configuration -In order for kubectl to find and access a Kubernetes cluster, it needs a [kubeconfig file](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/), which is created automatically when you create a cluster using [kube-up.sh](https://github.com/kubernetes/kubernetes/blob/master/cluster/kube-up.sh) or successfully deploy a Minikube cluster. By default, kubectl configuration is located at `~/.kube/config`. +In order for kubectl to find and access a Kubernetes cluster, it needs a +[kubeconfig file](/docs/concepts/configuration/organize-cluster-access-kubeconfig/), +which is created automatically when you create a cluster using +[kube-up.sh](https://github.com/kubernetes/kubernetes/blob/master/cluster/kube-up.sh) +or successfully deploy a Minikube cluster. +By default, kubectl configuration is located at `~/.kube/config`. Check that kubectl is properly configured by getting the cluster state: @@ -518,5 +523,7 @@ compinit * [Install Minikube](/docs/tasks/tools/install-minikube/) * See the [getting started guides](/docs/setup/) for more about creating clusters. * [Learn how to launch and expose your application.](/docs/tasks/access-application-cluster/service-access-application-cluster/) -* If you need access to a cluster you didn't create, see the [Sharing Cluster Access document](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/). +* If you need access to a cluster you didn't create, see the + [Sharing Cluster Access document](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/). * Read the [kubectl reference docs](/docs/reference/kubectl/kubectl/) + diff --git a/content/en/docs/tutorials/hello-minikube.md b/content/en/docs/tutorials/hello-minikube.md index f0aa44369e..901e0063cf 100644 --- a/content/en/docs/tutorials/hello-minikube.md +++ b/content/en/docs/tutorials/hello-minikube.md @@ -118,7 +118,7 @@ Pod runs a Container based on the provided Docker image. ``` {{< note >}} - For more information about `kubectl`commands, see the [kubectl overview](/docs/user-guide/kubectl-overview/). +For more information about `kubectl` commands, see the [kubectl overview](/docs/reference/kubectl/overview/). {{< /note >}} ## Create a Service diff --git a/content/en/docs/tutorials/services/source-ip.md b/content/en/docs/tutorials/services/source-ip.md index 588010494c..3bdf9d492f 100644 --- a/content/en/docs/tutorials/services/source-ip.md +++ b/content/en/docs/tutorials/services/source-ip.md @@ -412,7 +412,7 @@ protocol between the loadbalancer and backend to communicate the true client IP such as the HTTP [Forwarded](https://tools.ietf.org/html/rfc7239#section-5.2) or [X-FORWARDED-FOR](https://en.wikipedia.org/wiki/X-Forwarded-For) headers, or the -[proxy protocol](http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt). +[proxy protocol](https://www.haproxy.org/download/1.5/doc/proxy-protocol.txt). Load balancers in the second category can leverage the feature described above by creating an HTTP health check pointing at the port stored in the `service.spec.healthCheckNodePort` field on the Service. diff --git a/content/en/docs/tutorials/stateful-application/cassandra.md b/content/en/docs/tutorials/stateful-application/cassandra.md index 3fa56b26ea..72d3f928a8 100644 --- a/content/en/docs/tutorials/stateful-application/cassandra.md +++ b/content/en/docs/tutorials/stateful-application/cassandra.md @@ -7,9 +7,13 @@ weight: 30 --- -This tutorial shows you how to run [Apache Cassandra](http://cassandra.apache.org/) on Kubernetes. Cassandra, a database, needs persistent storage to provide data durability (application _state_). In this example, a custom Cassandra seed provider lets the database discover new Cassandra instances as they join the Cassandra cluster. +This tutorial shows you how to run [Apache Cassandra](https://cassandra.apache.org/) on Kubernetes. +Cassandra, a database, needs persistent storage to provide data durability (application _state_). +In this example, a custom Cassandra seed provider lets the database discover new Cassandra instances as they join the Cassandra cluster. -*StatefulSets* make it easier to deploy stateful applications into your Kubernetes cluster. For more information on the features used in this tutorial, see [StatefulSet](/docs/concepts/workloads/controllers/statefulset/). +*StatefulSets* make it easier to deploy stateful applications into your Kubernetes cluster. +For more information on the features used in this tutorial, see +[StatefulSet](/docs/concepts/workloads/controllers/statefulset/). {{< note >}} Cassandra and Kubernetes both use the term _node_ to mean a member of a cluster. In this @@ -38,12 +42,17 @@ new Cassandra Pods as they appear inside your Kubernetes cluster. {{< include "task-tutorial-prereqs.md" >}} -To complete this tutorial, you should already have a basic familiarity with {{< glossary_tooltip text="Pods" term_id="pod" >}}, {{< glossary_tooltip text="Services" term_id="service" >}}, and {{< glossary_tooltip text="StatefulSets" term_id="StatefulSet" >}}. +To complete this tutorial, you should already have a basic familiarity with +{{< glossary_tooltip text="Pods" term_id="pod" >}}, +{{< glossary_tooltip text="Services" term_id="service" >}}, and +{{< glossary_tooltip text="StatefulSets" term_id="StatefulSet" >}}. ### Additional Minikube setup instructions {{< caution >}} -[Minikube](/docs/getting-started-guides/minikube/) defaults to 1024MiB of memory and 1 CPU. Running Minikube with the default resource configuration results in insufficient resource errors during this tutorial. To avoid these errors, start Minikube with the following settings: +[Minikube](/docs/setup/learning-environment/minikube/) defaults to 1024MiB of memory and 1 CPU. +Running Minikube with the default resource configuration results in insufficient resource +errors during this tutorial. To avoid these errors, start Minikube with the following settings: ```shell minikube start --memory 5120 --cpus=4 @@ -51,11 +60,11 @@ minikube start --memory 5120 --cpus=4 {{< /caution >}} - ## Creating a headless Service for Cassandra {#creating-a-cassandra-headless-service} -In Kubernetes, a {{< glossary_tooltip text="Service" term_id="service" >}} describes a set of {{< glossary_tooltip text="Pods" term_id="pod" >}} that perform the same task. +In Kubernetes, a {{< glossary_tooltip text="Service" term_id="service" >}} describes a set of +{{< glossary_tooltip text="Pods" term_id="pod" >}} that perform the same task. The following Service is used for DNS lookups between Cassandra Pods and clients within your cluster: @@ -83,14 +92,17 @@ NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cassandra ClusterIP None 9042/TCP 45s ``` -If you don't see a Service named `cassandra`, that means creation failed. Read [Debug Services](/docs/tasks/debug-application-cluster/debug-service/) for help troubleshooting common issues. +If you don't see a Service named `cassandra`, that means creation failed. Read +[Debug Services](/docs/tasks/debug-application-cluster/debug-service/) +for help troubleshooting common issues. ## Using a StatefulSet to create a Cassandra ring The StatefulSet manifest, included below, creates a Cassandra ring that consists of three Pods. {{< note >}} -This example uses the default provisioner for Minikube. Please update the following StatefulSet for the cloud you are working with. +This example uses the default provisioner for Minikube. +Please update the following StatefulSet for the cloud you are working with. {{< /note >}} {{< codenew file="application/cassandra/cassandra-statefulset.yaml" >}} @@ -182,7 +194,8 @@ Use `kubectl edit` to modify the size of a Cassandra StatefulSet. kubectl edit statefulset cassandra ``` - This command opens an editor in your terminal. The line you need to change is the `replicas` field. The following sample is an excerpt of the StatefulSet file: + This command opens an editor in your terminal. The line you need to change is the `replicas` field. + The following sample is an excerpt of the StatefulSet file: ```yaml # Please edit the object below. Lines beginning with a '#' will be ignored, @@ -225,10 +238,12 @@ Use `kubectl edit` to modify the size of a Cassandra StatefulSet. ## {{% heading "cleanup" %}} -Deleting or scaling a StatefulSet down does not delete the volumes associated with the StatefulSet. This setting is for your safety because your data is more valuable than automatically purging all related StatefulSet resources. +Deleting or scaling a StatefulSet down does not delete the volumes associated with the StatefulSet. +This setting is for your safety because your data is more valuable than automatically purging all related StatefulSet resources. {{< warning >}} -Depending on the storage class and reclaim policy, deleting the *PersistentVolumeClaims* may cause the associated volumes to also be deleted. Never assume you’ll be able to access data if its volume claims are deleted. +Depending on the storage class and reclaim policy, deleting the *PersistentVolumeClaims* may cause the associated volumes +to also be deleted. Never assume you’ll be able to access data if its volume claims are deleted. {{< /warning >}} 1. Run the following commands (chained together into a single command) to delete everything in the Cassandra StatefulSet: diff --git a/content/en/docs/tutorials/stateful-application/zookeeper.md b/content/en/docs/tutorials/stateful-application/zookeeper.md index 3c8e70b783..eaba068b6f 100644 --- a/content/en/docs/tutorials/stateful-application/zookeeper.md +++ b/content/en/docs/tutorials/stateful-application/zookeeper.md @@ -15,25 +15,23 @@ weight: 40 This tutorial demonstrates running [Apache Zookeeper](https://zookeeper.apache.org) on Kubernetes using [StatefulSets](/docs/concepts/workloads/controllers/statefulset/), -[PodDisruptionBudgets](/docs/concepts/workloads/pods/disruptions/#specifying-a-poddisruptionbudget), -and [PodAntiAffinity](/docs/user-guide/node-selection/#inter-pod-affinity-and-anti-affinity-beta-feature). - +[PodDisruptionBudgets](/docs/concepts/workloads/pods/disruptions/#pod-disruption-budget), +and [PodAntiAffinity](/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity). ## {{% heading "prerequisites" %}} - Before starting this tutorial, you should be familiar with the following Kubernetes concepts. -- [Pods](/docs/user-guide/pods/single-container/) +- [Pods](/docs/concepts/workloads/pods/) - [Cluster DNS](/docs/concepts/services-networking/dns-pod-service/) - [Headless Services](/docs/concepts/services-networking/service/#headless-services) - [PersistentVolumes](/docs/concepts/storage/volumes/) - [PersistentVolume Provisioning](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/staging/persistent-volume-provisioning/) - [StatefulSets](/docs/concepts/workloads/controllers/statefulset/) -- [PodDisruptionBudgets](/docs/concepts/workloads/pods/disruptions/#specifying-a-poddisruptionbudget) -- [PodAntiAffinity](/docs/user-guide/node-selection/#inter-pod-affinity-and-anti-affinity-beta-feature) -- [kubectl CLI](/docs/user-guide/kubectl/) +- [PodDisruptionBudgets](/docs/concepts/workloads/pods/disruptions/#pod-disruption-budget) +- [PodAntiAffinity](/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity) +- [kubectl CLI](/docs/reference/kubectl/kubectl/) You will require a cluster with at least four nodes, and each node requires at least 2 CPUs and 4 GiB of memory. In this tutorial you will cordon and drain the cluster's nodes. **This means that the cluster will terminate and evict all Pods on its nodes, and the nodes will temporarily become unschedulable.** You should use a dedicated cluster for this tutorial, or you should ensure that the disruption you cause will not interfere with other tenants. @@ -75,7 +73,7 @@ ZooKeeper servers keep their entire state machine in memory, and write every mut The manifest below contains a [Headless Service](/docs/concepts/services-networking/service/#headless-services), a [Service](/docs/concepts/services-networking/service/), -a [PodDisruptionBudget](/docs/concepts/workloads/pods/disruptions//#specifying-a-poddisruptionbudget), +a [PodDisruptionBudget](/docs/concepts/workloads/pods/disruptions/#pod-disruption-budgets), and a [StatefulSet](/docs/concepts/workloads/controllers/statefulset/). {{< codenew file="application/zookeeper/zookeeper.yaml" >}} @@ -127,7 +125,7 @@ zk-2 1/1 Running 0 40s ``` The StatefulSet controller creates three Pods, and each Pod has a container with -a [ZooKeeper](http://www-us.apache.org/dist/zookeeper/stable/) server. +a [ZooKeeper](https://www-us.apache.org/dist/zookeeper/stable/) server. ### Facilitating Leader Election @@ -502,7 +500,7 @@ The command used to start the ZooKeeper servers passed the configuration as comm ### Configuring Logging One of the files generated by the `zkGenConfig.sh` script controls ZooKeeper's logging. -ZooKeeper uses [Log4j](http://logging.apache.org/log4j/2.x/), and, by default, +ZooKeeper uses [Log4j](https://logging.apache.org/log4j/2.x/), and, by default, it uses a time and size based rolling file appender for its logging configuration. Use the command below to get the logging configuration from one of Pods in the `zk` `StatefulSet`. @@ -524,7 +522,10 @@ log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n ``` -This is the simplest possible way to safely log inside the container. Because the applications write logs to standard out, Kubernetes will handle log rotation for you. Kubernetes also implements a sane retention policy that ensures application logs written to standard out and standard error do not exhaust local storage media. +This is the simplest possible way to safely log inside the container. +Because the applications write logs to standard out, Kubernetes will handle log rotation for you. +Kubernetes also implements a sane retention policy that ensures application logs written to +standard out and standard error do not exhaust local storage media. Use [`kubectl logs`](/docs/reference/generated/kubectl/kubectl-commands/#logs) to retrieve the last 20 log lines from one of the Pods. @@ -679,7 +680,7 @@ statefulset.apps/zk rolled back ### Handling Process Failure -[Restart Policies](/docs/user-guide/pod-states/#restartpolicy) control how +[Restart Policies](/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy) control how Kubernetes handles process failures for the entry point of the container in a Pod. For Pods in a `StatefulSet`, the only appropriate `RestartPolicy` is Always, and this is the default value. For stateful applications you should **never** override @@ -832,7 +833,9 @@ domains to ensure availability. To avoid an outage, due to the loss of an individual machine, best practices preclude co-locating multiple instances of the application on the same machine. -By default, Kubernetes may co-locate Pods in a `StatefulSet` on the same node. For the three server ensemble you created, if two servers are on the same node, and that node fails, the clients of your ZooKeeper service will experience an outage until at least one of the Pods can be rescheduled. +By default, Kubernetes may co-locate Pods in a `StatefulSet` on the same node. +For the three server ensemble you created, if two servers are on the same node, and that node fails, +the clients of your ZooKeeper service will experience an outage until at least one of the Pods can be rescheduled. You should always provision additional capacity to allow the processes of critical systems to be rescheduled in the event of node failures. If you do so, then the @@ -978,7 +981,8 @@ pod "zk-1" deleted node "kubernetes-node-ixsl" drained ``` -The `zk-1` Pod cannot be scheduled because the `zk` `StatefulSet` contains a `PodAntiAffinity` rule preventing co-location of the Pods, and as only two nodes are schedulable, the Pod will remain in a Pending state. +The `zk-1` Pod cannot be scheduled because the `zk` `StatefulSet` contains a `PodAntiAffinity` rule preventing +co-location of the Pods, and as only two nodes are schedulable, the Pod will remain in a Pending state. ```shell kubectl get pods -w -l app=zk @@ -1119,9 +1123,10 @@ kubectl uncordon kubernetes-node-ixsl node "kubernetes-node-ixsl" uncordoned ``` -You can use `kubectl drain` in conjunction with `PodDisruptionBudgets` to ensure that your services remain available during maintenance. If drain is used to cordon nodes and evict pods prior to taking the node offline for maintenance, services that express a disruption budget will have that budget respected. You should always allocate additional capacity for critical services so that their Pods can be immediately rescheduled. - - +You can use `kubectl drain` in conjunction with `PodDisruptionBudgets` to ensure that your services remain available during maintenance. +If drain is used to cordon nodes and evict pods prior to taking the node offline for maintenance, +services that express a disruption budget will have that budget respected. +You should always allocate additional capacity for critical services so that their Pods can be immediately rescheduled. ## {{% heading "cleanup" %}} diff --git a/content/en/docs/tutorials/stateless-application/guestbook.md b/content/en/docs/tutorials/stateless-application/guestbook.md index f321d5391a..2b6eef90fa 100644 --- a/content/en/docs/tutorials/stateless-application/guestbook.md +++ b/content/en/docs/tutorials/stateless-application/guestbook.md @@ -365,7 +365,7 @@ Deleting the Deployments and Services also deletes any running Pods. Use labels ## {{% heading "whatsnext" %}} -* Add [ELK logging and monitoring](../guestbook-logs-metrics-with-elk/) to your Guestbook application +* Add [ELK logging and monitoring](/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk/) to your Guestbook application * Complete the [Kubernetes Basics](/docs/tutorials/kubernetes-basics/) Interactive Tutorials * Use Kubernetes to create a blog using [Persistent Volumes for MySQL and Wordpress](/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/#visit-your-new-wordpress-blog) * Read more about [connecting applications](/docs/concepts/services-networking/connect-applications-service/) diff --git a/content/en/examples/priority-and-fairness/health-for-strangers.yaml b/content/en/examples/priority-and-fairness/health-for-strangers.yaml new file mode 100644 index 0000000000..79ee80ab17 --- /dev/null +++ b/content/en/examples/priority-and-fairness/health-for-strangers.yaml @@ -0,0 +1,20 @@ +apiVersion: flowcontrol.apiserver.k8s.io/v1alpha1 +kind: FlowSchema +metadata: + name: health-for-strangers +spec: + matchingPrecedence: 1000 + priorityLevelConfiguration: + name: exempt + rules: + - nonResourceRules: + - nonResourceURLs: + - "/healthz" + - "/livez" + - "/readyz" + verbs: + - "*" + subjects: + - kind: Group + group: + name: system:unauthenticated diff --git a/content/es/docs/concepts/overview/components.md b/content/es/docs/concepts/overview/components.md index 0ca6f3126c..64622eeb66 100644 --- a/content/es/docs/concepts/overview/components.md +++ b/content/es/docs/concepts/overview/components.md @@ -83,7 +83,7 @@ reglas de red en el anfitrión y haciendo reenvío de conexiones. ### Runtime de contenedores -El {{< glossary_definition term_id="container-runtime" text="runtime de los contenedores" >}} es el software responsable de ejecutar los contenedores. Kubernetes soporta varios de +El {{< glossary_tooltip term_id="container-runtime" text="runtime de los contenedores" >}} es el software responsable de ejecutar los contenedores. Kubernetes soporta varios de ellos: [Docker](http://www.docker.com), [containerd](https://containerd.io), [cri-o](https://cri-o.io/), [rktlet](https://github.com/kubernetes-incubator/rktlet) y cualquier implementación de la interfaz de runtime de contenedores de Kubernetes, o [Kubernetes CRI](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-node/container-runtime-interface.md). ## Addons diff --git a/content/fr/docs/reference/glossary/reviewer.md b/content/fr/docs/reference/glossary/reviewer.md new file mode 100644 index 0000000000..7f2e66b1cb --- /dev/null +++ b/content/fr/docs/reference/glossary/reviewer.md @@ -0,0 +1,17 @@ +--- +title: Reviewer +id: reviewer +date: 2018-04-12 +full_link: +short_description: > + Une personne qui examine la qualité et l'exactitude du code sur une partie du projet. + +aka: +tags: +- community +--- + Une personne qui examine la qualité et l'exactitude du code sur une partie du projet. + + + +Les réviseurs connaissent bien la base de code (codebase) et les principes d'ingénierie logicielle. Le statut du réviseur est limité à une partie de la base de code. diff --git a/content/it/docs/concepts/containers/_index.md b/content/it/docs/concepts/containers/_index.md index 2ae51e8f39..4c510e9ef2 100755 --- a/content/it/docs/concepts/containers/_index.md +++ b/content/it/docs/concepts/containers/_index.md @@ -1,4 +1,30 @@ --- -title: "Containers" +title: Containers weight: 40 +description: La tecnologia per distribuire un'applicazione insieme con le dipendenze necessarie per la sua esecuzione. +content_type: concept +no_list: true --- + + + +Ogni _container_ che viene eseguito è riproducibile; la pratica di includere le dipendenze all'interno di ciascuno _container_ permette di ottenere sempre lo stesso risultato ad ogni esecuzione del medesimo _container_. + +I _Container_ permettono di disaccoppiare le applicazioni dall'infrastruttura del host su cui vengono eseguite. Questo approccio rende più facile il _deployment_ su cloud o sitemi operativi differenti tra loro. + + + +## Immagine di container +L'[immagine di un container](/docs/concepts/containers/images/) e' un pacchetto software che contiene tutto ciò che serve per eseguire un'applicazione: il codice sorgente e ciascun _runtime_ necessario, librerie applicative e di sistema, e le impostazioni predefinite per ogni configurazione necessaria. + +Un _container_ è immutabile per definizione: non è possibile modificare il codice di un _container_ in esecuzione. Se si ha un'applicazione containerizzata e la si vuole modificare, si deve costruire un nuovo _container_ che includa il cambiamento desiderato, e quindi ricreare il _container_ partendo dalla nuova immagine aggiornata. + +## Container runtimes + +{{< glossary_definition term_id="container-runtime" length="all" >}} + +## {{% heading "whatsnext" %}} + +* Leggi in merito [immagine di container](/docs/concepts/containers/images/) +* Leggi in merito [Pods](/docs/concepts/workloads/pods/) + diff --git a/content/ja/_index.html b/content/ja/_index.html index 7d01d366b7..a42c9484f9 100644 --- a/content/ja/_index.html +++ b/content/ja/_index.html @@ -41,13 +41,12 @@ Kubernetesはオープンソースなので、オンプレミスやパブリッ

-
- 2020年4月のKubeCon アムステルダムに参加する + 2020年8月17日-20日のKubeCon EUバーチャルに参加する



- 2020年7月のKubeCon 上海に参加する + 2020年11月17日-20日のKubeCon NAバーチャルに参加する
diff --git a/content/ja/docs/concepts/_index.md b/content/ja/docs/concepts/_index.md index 0f03287083..1e22892eca 100644 --- a/content/ja/docs/concepts/_index.md +++ b/content/ja/docs/concepts/_index.md @@ -19,14 +19,14 @@ Kubernetesを機能させるには、*Kubernetes API オブジェクト* を使 一旦desired state (望ましい状態)を設定すると、Pod Lifecycle Event Generator([PLEG](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node/pod-lifecycle-event-generator.md))を使用した*Kubernetes コントロールプレーン*が機能し、クラスターの現在の状態をdesired state (望ましい状態)に一致させます。そのためにKubernetesはさまざまなタスク(たとえば、コンテナの起動または再起動、特定アプリケーションのレプリカ数のスケーリング等)を自動的に実行します。Kubernetesコントロールプレーンは、クラスターで実行されている以下のプロセスで構成されています。 -* **Kubernetes Master** :[kube-apiserver](/docs/admin/kube-apiserver/)、[kube-controller-manager](/docs/admin/kube-controller-manager/)、[kube-scheduler](/docs/admin/kube-scheduler/) の3プロセスの集合です。これらのプロセスはクラスター内の一つのノード上で実行されます。実行ノードはマスターノードとして指定します。 +* **Kubernetes Master**: [kube-apiserver](/docs/admin/kube-apiserver/)、[kube-controller-manager](/docs/admin/kube-controller-manager/)、[kube-scheduler](/docs/admin/kube-scheduler/) の3プロセスの集合です。これらのプロセスはクラスター内の一つのノード上で実行されます。実行ノードはマスターノードとして指定します。 * クラスター内の個々の非マスターノードは、それぞれ2つのプロセスを実行します。 - * **[kubelet](/docs/admin/kubelet/)**, Kubernetes Masterと通信します。 - * **[kube-proxy](/docs/admin/kube-proxy/)**, 各ノードのKubernetesネットワークサービスを反映するネットワークプロキシです。 + * **[kubelet](/docs/admin/kubelet/)**: Kubernetes Masterと通信します。 + * **[kube-proxy](/docs/admin/kube-proxy/)**: 各ノードのKubernetesネットワークサービスを反映するネットワークプロキシです。 -## Kubernetesオブジェクト +## Kubernetesオブジェクト {#kubernetes-objects} -Kubernetesには、デプロイ済みのコンテナ化されたアプリケーションやワークロード、関連するネットワークとディスクリソース、クラスターが何をしているかに関するその他の情報といった、システムの状態を表現する抽象が含まれています。これらの抽象は、Kubernetes APIのオブジェクトによって表現されます。詳細については、[Kubernetesオブジェクトについて知る](/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/)をご覧ください。 +Kubernetesには、デプロイ済みのコンテナ化されたアプリケーションやワークロード、関連するネットワークとディスクリソース、クラスターが何をしているかに関するその他の情報といった、システムの状態を表現する抽象が含まれています。これらの抽象は、Kubernetes APIのオブジェクトによって表現されます。詳細については、[Kubernetesオブジェクトについて知る](/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/#kubernetes-objects)をご覧ください。 基本的なKubernetesのオブジェクトは次のとおりです。 @@ -43,7 +43,7 @@ Kubernetesには、[コントローラー](/docs/concepts/architecture/controlle * [ReplicaSet](/ja/docs/concepts/workloads/controllers/replicaset/) * [Job](/docs/concepts/workloads/controllers/jobs-run-to-completion/) -## Kubernetesコントロールプレーン +## Kubernetesコントロールプレーン {#kubernetes-control-plane} Kubernetesマスターや kubeletプロセスといったKubernetesコントロールプレーンのさまざまなパーツは、Kubernetesがクラスターとどのように通信するかを統制します。コントロールプレーンはシステム内のすべてのKubernetesオブジェクトの記録を保持し、それらのオブジェクトの状態を管理するために継続的制御ループを実行します。コントロールプレーンの制御ループは常にクラスターの変更に反応し、システム内のすべてのオブジェクトの実際の状態が、指定した状態に一致するように動作します。 diff --git a/content/ja/docs/concepts/architecture/_index.md b/content/ja/docs/concepts/architecture/_index.md index d81eeab89c..b8906ee100 100644 --- a/content/ja/docs/concepts/architecture/_index.md +++ b/content/ja/docs/concepts/architecture/_index.md @@ -1,4 +1,4 @@ --- -title: "Kubernetesのアーキテクチャ" +title: "クラスターのアーキテクチャ" weight: 30 --- diff --git a/content/ja/docs/concepts/architecture/cloud-controller.md b/content/ja/docs/concepts/architecture/cloud-controller.md index d722ced7a6..8cf85db09b 100644 --- a/content/ja/docs/concepts/architecture/cloud-controller.md +++ b/content/ja/docs/concepts/architecture/cloud-controller.md @@ -1,14 +1,14 @@ --- title: クラウドコントローラーマネージャーとそのコンセプト content_type: concept -weight: 30 +weight: 40 --- -クラウドコントローラマネージャー(CCM)のコンセプト(バイナリと混同しないでください)は、もともとクラウドベンダー固有のソースコードと、Kubernetesのコアソースコードを独立して進化させることが出来るように作られました。クラウドコントローラーマネージャーは、Kubernetesコントローラーマネージャー、APIサーバー、そしてスケジューラーのような他のマスターコンポーネントと並行して動きます。またKubernetesのアドオンとしても動かすことができ、その場合はKubernetes上で動きます。 +クラウドコントローラマネージャー(CCM)のコンセプト(バイナリと混同しないでください)は、もともとクラウドベンダー固有のソースコードと、Kubernetesのコアソースコードを独立して進化させることができるように作られました。クラウドコントローラーマネージャーは、Kubernetesコントローラーマネージャー、APIサーバー、そしてスケジューラーのような他のマスターコンポーネントと並行して動きます。またKubernetesのアドオンとしても動かすことができ、その場合はKubernetes上で動きます。 -クラウドコントローラーマネージャーの設計は「プラグインメカニズム」をベースにしています。そうすることで、新しいクラウドプロバイダーがプラグインを使ってKubernetesと簡単に統合出来るようになります。新しいクラウドプロバイダーに向けてKubernetesのオンボーディングを行ったり、古いモデルを利用しているクラウドプロバイダーに、新しいCCMモデルに移行させるような計画があります。 +クラウドコントローラーマネージャーの設計は「プラグインメカニズム」をベースにしています。そうすることで、新しいクラウドプロバイダーがプラグインを使ってKubernetesと簡単に統合できるようになります。新しいクラウドプロバイダーに向けてKubernetesのオンボーディングを行ったり、古いモデルを利用しているクラウドプロバイダーに、新しいCCMモデルに移行させるような計画があります。 このドキュメントでは、クラウドコントローラーマネージャーの背景にあるコンセプトと、それに関連する機能の詳細について話します。 @@ -52,7 +52,7 @@ CCMは、Kubernetesコントローラーマネージャー(KCM)からいくつ ボリュームコントローラーは、意図的にCCMの一部になっていません。複雑さと、ベンダー固有のボリュームロジックを抽象化するのに費やした労力を考え、CCMの一部に移行しないことが決定されました。 {{< /note >}} -CCMを使ったボリュームをサポートする元の計画は、プラガブルなボリュームをサポートするため、Flexボリュームを使うことでした。しかし、競合しているCSIとして知られている機能が、Flexを置き換える予定です。 +CCMを使ったボリュームをサポートする元の計画は、プラガブルなボリュームをサポートするため、[Flex](/docs/concepts/storage/volumes/#flexVolume)ボリュームを使うことでした。しかし、競合している[CSI](/docs/concepts/storage/volumes/#csi)として知られている機能が、Flexを置き換える予定です。 これらのダイナミクスを考慮し、我々はCSIが利用できるようになるまで、間を取った暫定措置を取ることにしました。 @@ -79,11 +79,11 @@ CCMの大半の機能は、KCMから派生しています。前セクション #### ルートコントローラー -ルートコントローラーは、クラスタ内の異なるノード上で稼働しているコンテナが相互に通信出来るように、クラウド内のルートを適切に設定する責務を持ちます。ルートコントローラーはGoogle Compute Engineのクラスターのみに該当します。 +ルートコントローラーは、クラスタ内の異なるノード上で稼働しているコンテナが相互に通信できるように、クラウド内のルートを適切に設定する責務を持ちます。ルートコントローラーはGoogle Compute Engineのクラスターのみに該当します。 #### サービスコントローラー -サービスコントローラーは、サービスの作成、更新、そして削除イベントの待ち受けに責務を持ちます。Kubernetes内のサービスの現在の状態を、クラウド上のロードバランサー(ELB、Google LB、またOracle Cloud Infrastructure LBなど)に反映するための設定を行います。更に、クラウドロードバランサーのバックエンドが最新の状態になっていることを保証します。 +サービスコントローラーは、サービスの作成、更新、そして削除イベントの待ち受けに責務を持ちます。Kubernetes内のサービスの現在の状態を、クラウド上のロードバランサー(ELB、Google LB、またOracle Cloud Infrastructure LBなど)に反映するための設定を行います。さらに、クラウドロードバランサーのバックエンドが最新の状態になっていることを保証します。 ### 2. Kubelet @@ -93,7 +93,7 @@ CCMの大半の機能は、KCMから派生しています。前セクション ## プラグインメカニズム -クラウドコントローラーマネージャーは、Goのインターフェースを利用してクラウドの実装をプラグイン化出来るようにしています。具体的には、[こちら](https://github.com/kubernetes/cloud-provider/blob/9b77dc1c384685cb732b3025ed5689dd597a5971/cloud.go#L42-L62)で定義されているクラウドプロバイダーインターフェースを利用しています。 +クラウドコントローラーマネージャーは、Goのインターフェースを利用してクラウドの実装をプラグイン化できるようにしています。具体的には、[こちら](https://github.com/kubernetes/cloud-provider/blob/9b77dc1c384685cb732b3025ed5689dd597a5971/cloud.go#L42-L62)で定義されているクラウドプロバイダーインターフェースを利用しています。 上で強調した4つの共有コントローラーの実装、そしていくつかの共有クラウドプロバイダーインターフェースと一部の連携機能は、Kubernetesのコアにとどまります。クラウドプロバイダー特有の実装はコア機能外で構築され、コア機能内で定義されたインターフェースを実装します。 @@ -223,13 +223,18 @@ rules: 下記のクラウドプロバイダーがCCMを実装しています: -* [Digital Ocean](https://github.com/digitalocean/digitalocean-cloud-controller-manager) -* [Oracle](https://github.com/oracle/oci-cloud-controller-manager) -* [Azure](https://github.com/kubernetes/cloud-provider-azure) -* [GCP](https://github.com/kubernetes/cloud-provider-gcp) +* [Alibaba Cloud](https://github.com/kubernetes/cloud-provider-alibaba-cloud) * [AWS](https://github.com/kubernetes/cloud-provider-aws) +* [Azure](https://github.com/kubernetes/cloud-provider-azure) * [BaiduCloud](https://github.com/baidu/cloud-provider-baiducloud) +* [DigitalOcean](https://github.com/digitalocean/digitalocean-cloud-controller-manager) +* [GCP](https://github.com/kubernetes/cloud-provider-gcp) +* [Hetzner](https://github.com/hetznercloud/hcloud-cloud-controller-manager) * [Linode](https://github.com/linode/linode-cloud-controller-manager) +* [OpenStack](https://github.com/kubernetes/cloud-provider-openstack) +* [Oracle](https://github.com/oracle/oci-cloud-controller-manager) +* [TencentCloud](https://github.com/TencentCloud/tencentcloud-cloud-controller-manager) + ## クラスター管理 diff --git a/content/ja/docs/concepts/architecture/controller.md b/content/ja/docs/concepts/architecture/controller.md new file mode 100644 index 0000000000..0a13635fe8 --- /dev/null +++ b/content/ja/docs/concepts/architecture/controller.md @@ -0,0 +1,90 @@ +--- +title: コントローラー +content_type: concept +weight: 30 +--- + + + +ロボット工学やオートメーションの分野において、 _制御ループ_ とは、あるシステムの状態を制御する終了状態のないループのことです。 + +ここでは、制御ループの一例として、部屋の中にあるサーモスタットを挙げます。 + +あなたが温度を設定すると、それはサーモスタットに *目的の状態(desired state)* を伝えることになります。実際の部屋の温度は *現在の状態* です。サーモスタットは、装置をオンまたはオフにすることによって、現在の状態を目的の状態に近づけるように動作します。 + +{{< glossary_definition term_id="controller" length="short">}} + + + +## コントローラーパターン + +コントローラーは少なくとも1種類のKubernetesのリソースを監視します。これらの[オブジェクト](/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/#kubernetes-objects)には目的の状態を表すspecフィールドがあります。リソースのコントローラーは、現在の状態を目的の状態に近づける責務を持ちます。 + +コントローラーは自分自身でアクションを実行する場合もありますが、Kubernetesではコントローラーが{{< glossary_tooltip text="APIサーバー" term_id="kube-apiserver" >}}に意味のある副作用を持つメッセージを送信することが一般的です。以下では、このような例を見ていきます。 + +{{< comment >}} +ネームスペースコントローラーなどの一部のビルトインのコントローラーは、specのないオブジェクトに対して作用します。簡単のため、このページではそのような詳細な説明は省略します。 +{{< /comment >}} + +### APIサーバー経由でコントロールする + +{{< glossary_tooltip term_id="job" >}}コントローラーはKubernetesのビルトインのコントローラーの一例です。ビルトインのコントローラーは、クラスターのAPIサーバーとやりとりをして状態を管理します。 + +Jobは、1つ以上の{{< glossary_tooltip term_id="pod" >}}を起動して、タスクを実行した後に停止する、Kubernetesのリソースです。 + +(1度[スケジュール](/ja/docs/concepts/scheduling-eviction/)されると、Podオブジェクトはkubeletに対する目的の状態の一部になります。) + +Jobコントローラーが新しいタスクを見つけると、その処理が完了するように、クラスター上のどこかで、一連のNode上のkubeletが正しい数のPodを実行することを保証します。ただし、Jobコントローラーは、自分自身でPodやコンテナを実行することはありません。代わりに、APIサーバーに対してPodの作成や削除を依頼します。{{< glossary_tooltip text="コントロールプレーン" term_id="control-plane" >}}上の他のコンポーネントが(スケジュールして実行するべき新しいPodが存在するという)新しい情報を基に動作することによって、最終的に目的の処理が完了します。 + +新しいJobが作成されたとき、目的の状態は、そのJobが完了することです。JobコントローラーはそのJobに対する現在の状態を目的の状態に近づけるようにします。つまり、そのJobが行ってほしい処理を実行するPodを作成し、Jobが完了に近づくようにします。 + +コントローラーは、コントローラーを設定するオブジェクトも更新します。たとえば、あるJobが完了した場合、Jobコントローラーは、Jobオブジェクトに`Finished`というマークを付けます。 + +(これは、部屋が設定温度になったことを示すために、サーモスタットがランプを消灯するのに少し似ています。) + +### 直接的なコントロール + +Jobとは対照的に、クラスターの外部に変更を加える必要があるコントローラーもあります。 + +たとえば、クラスターに十分な数の{{< glossary_tooltip text="Node" term_id="node" >}}が存在することを保証する制御ループの場合、そのコントローラーは、必要に応じて新しいNodeをセットアップするために、現在のクラスターの外部とやりとりをする必要があります。 + +外部の状態とやりとりをするコントローラーは、目的の状態をAPIサーバーから取得した後、外部のシステムと直接通信し、現在の状態を目的の状態に近づけます。 + +(クラスター内のノードを水平にスケールさせるコントローラーが実際に存在します。詳しくは、[クラスターのオートスケーリング](/docs/tasks/administer-cluster/cluster-management/#cluster-autoscaling)を読んでください。) + +## 目的の状態 vs 現在の状態 {#desired-vs-current} + +Kubernetesはシステムに対してクラウドネイティブな見方をするため、常に変化し続けるような状態を扱えるように設計されています。 + +処理を実行したり、制御ループが故障を自動的に修正したりしているどの時点でも、クラスターは変化中である可能性があります。つまり、クラスターは決して安定した状態にならない可能性があるということです。 + +コントローラーがクラスターのために実行されていて、有用な変更が行われるのであれば、全体的な状態が安定しているかどうかは問題にはなりません。 + +## 設計 + +設計理念として、Kubernetesは多数のコントローラーを使用しており、各コントローラーはクラスターの状態の特定の側面をそれぞれ管理しています。最もよくあるパターンは、特定の制御ループ(コントローラー)が目的の状態として1種類のリソースを使用し、目的の状態を実現することを管理するために別の種類のリソースを用意するというものです。 + +相互にリンクされた単一のモノリシックな制御ループよりは、複数の単純なコントローラーが存在する方が役に立ちます。コントローラーは故障することがあるため、Kubernetesは故障を許容するように設計されています。 + +たとえば、Jobのコントローラーは、Jobオブジェクト(新しい処理を見つけるため)およびPodオブジェクト(Jobを実行し、処理が完了したか確認するため)を監視します。この場合、なにか別のものがJobを作成し、JobコントローラーはPodを作成します。 + +{{< note >}} +同じ種類のオブジェクトを作成または更新するコントローラーが、複数存在する場合があります。実際には、Kubernetesコントローラーは、自分が制御するリソースに関連するリソースにのみ注意を払うように作られています。 + +たとえば、DeploymentとJobがありますが、これらは両方ともPodを作成するものです。しかし、JobコントローラーはDeploymentが作成したPodを削除することはありません。各コントローラーが2つのPodを区別できる情報({{< glossary_tooltip term_id="label" text="ラベル" >}})が存在するためです。 +{{< /note >}} + +## コントローラーを実行する方法 {#running-controllers} + +Kubernetesには、{{< glossary_tooltip term_id="kube-controller-manager" >}}内部で動作する一組のビルトインのコントローラーが用意されています。これらビルトインのコントローラーは、コアとなる重要な振る舞いを提供します。 + +DeploymentコントローラーとJobコントローラーは、Kubernetes自体の一部として同梱されているコントローラーの例です(それゆえ「ビルトイン」のコントローラーと呼ばれます)。Kubernetesは回復性のあるコントロールプレーンを実行できるようにしているため、ビルトインのコントローラーの一部が故障しても、コントロールプレーンの別の部分が作業を引き継いでくれます。 + +Kubernetesを拡張するためにコントロールプレーンの外で動作するコントローラーもあります。もし望むなら、新しいコントローラーを自分で書くこともできます。自作のコントローラーをPodセットとして動作させたり、Kubernetesの外部で動作させることもできます。どのような動作方法が最も適しているかは、そのコントローラーがどのようなことを行うのかに依存します。 + +## {{% heading "whatsnext" %}} + +* [Kubernetesコントロールプレーン](/ja/docs/concepts/#kubernetes-control-plane)について読む +* 基本的な[Kubernetesオブジェクト](/ja/docs/concepts/#kubernetes-objects)について学ぶ +* [Kubernetes API](/ja/docs/concepts/overview/kubernetes-api/)について学ぶ +* 自分でコントローラーを書きたい場合は、「Kubernetesを拡張する」の[エクステンションパターン](/ja/docs/concepts/extend-kubernetes/extend-cluster/#extension-patterns)を読んでください。 diff --git a/content/ja/docs/concepts/architecture/master-node-communication.md b/content/ja/docs/concepts/architecture/master-node-communication.md index 14f0678a20..e15d1187ad 100644 --- a/content/ja/docs/concepts/architecture/master-node-communication.md +++ b/content/ja/docs/concepts/architecture/master-node-communication.md @@ -6,8 +6,8 @@ weight: 20 -本ドキュメントでは、KubernetesにおけるMaster(実態はAPIサーバー)及びクラスター間のコミュニケーション経路についてまとめます。 -この文書の目的は、信頼できないネットワーク上(またはクラウドプロバイダ上の完全にパブリックなIP上)でクラスタを実行できるように、ユーザーがインストールをカスタマイズしてネットワーク構成を強化できるようにすることです。 +本ドキュメントでは、KubernetesにおけるMaster(実態はAPIサーバー)およびクラスター間のコミュニケーション経路についてまとめます。 +この文書の目的は、信頼できないネットワーク上(またはクラウドプロバイダ上の完全にパブリックなIP上)でクラスタを実行できるように、ユーザーがインストールをカスタマイズしてネットワーク構成を強化できるようにすることです。 @@ -16,8 +16,8 @@ weight: 20 ## クラスターからマスターへの通信 -クラスターからマスターへのすべての通信経路は、APIサーバーで終端します(他のマスターコンポーネントはどれもリモートサービスを公開するように設計されていません)。 -一般的には、1つ以上の形式のクライアント[認証](/docs/reference/access-authn-authz/authentication/)が有効になっている状態で、APIサーバーはセキュアなHTTPSポート(443)でリモート接続をlistenするように構成されています。 +クラスターからマスターへのすべての通信経路は、APIサーバーで終端します(他のマスターコンポーネントはどれもリモートサービスを公開するように設計されていません)。 +一般的には、1つ以上の形式のクライアント[認証](/docs/reference/access-authn-authz/authentication/)が有効になっている状態で、APIサーバーはセキュアなHTTPSポート(443)でリモート接続をlistenするように構成されています。 特に[匿名のリクエスト](/docs/reference/access-authn-authz/authentication/#anonymous-requests)または[サービスアカウントトークン](/docs/reference/access-authn-authz/authentication/#service-account-tokens)が許可されている場合は、1つまたは複数の[認証](/docs/reference/access-authn-authz/authorization/)を有効にする必要があります。 ノードには、有効なクライアント認証情報を使って安全にAPIサーバーに接続できるように、クラスターのパブリックなルート証明書をプロビジョニングする必要があります。 @@ -26,15 +26,15 @@ kubeletのクライアント証明書を自動プロビジョニングする方 APIサーバーに接続したいPodは、サービスアカウントを利用することで接続を安全にすることができます。そうすることで、Podが作成されたときにKubernetesがパブリックなルート証明書と有効なBearer TokenをPodに自動的に挿入します。 -`kubernetes`サービスには(すべてのネームスペースで)、APIサーバー上のHTTPSエンドポイントに(kube-proxy経由で)リダイレクトされる仮想IPアドレスが設定されています。 +`kubernetes`サービスには(すべてのネームスペースで)、APIサーバー上のHTTPSエンドポイントに(kube-proxy経由で)リダイレクトされる仮想IPアドレスが設定されています。 マスターコンポーネントは、セキュアなポートを介してクラスターAPIサーバーとも通信します。 -その結果、クラスター(ノードとそのノードで実行されているPod)からマスターへの接続はデフォルトで保護され、信頼できないネットワークやパブリックネットワークを介して実行できます。 +その結果、クラスター(ノードとそのノードで実行されているPod)からマスターへの接続はデフォルトで保護され、信頼できないネットワークやパブリックネットワークを介して実行できます。 ## マスターからクラスターへの通信 -マスター(APIサーバー)からクラスターへの通信には、2つの主要な通信経路があります。 +マスター(APIサーバー)からクラスターへの通信には、2つの主要な通信経路があります。 1つ目は、APIサーバーからクラスター内の各ノードで実行されるkubeletプロセスへの通信です。 2つ目は、APIサーバーのプロキシ機能を介した、APIサーバーから任意のノード、Pod、またはサービスへのアクセスです。 @@ -43,7 +43,7 @@ APIサーバーに接続したいPodは、サービスアカウントを利用 APIサーバーからkubeletへの接続は以下の目的で使用されます: * Podのログを取得する - * 実行中のPodに(kubectlを通して)接続する + * 実行中のPodに(kubectlを通して)接続する * kubeletのポート転送機能を提供する これらの接続は、kubeletのHTTPSエンドポイントで終了します。 @@ -64,7 +64,7 @@ API URL内のノード、Pod、またはサービス名に`https:`を付ける ### SSHトンネル Kubernetesはマスターからクラスターへの通信経路を保護するためにSSHトンネルをサポートしています。 -この設定では、APIサーバーはクラスター内の各ノード(ポート22でlistenしているsshサーバーに接続)へのSSHトンネルを開始し、トンネルを介してkubelet、ノード、Pod、またはサービス宛てのすべてのトラフィックを渡します。 +この設定では、APIサーバーはクラスター内の各ノード(ポート22でlistenしているsshサーバーに接続)へのSSHトンネルを開始し、トンネルを介してkubelet、ノード、Pod、またはサービス宛てのすべてのトラフィックを渡します。 このトンネルにより、ノードが実行されているネットワークの外部にトラフィックが公開されないようにします。 SSHトンネルは現在非推奨なので、自分がしていることが分からない限り、使用しないでください。この通信チャネルに代わるものが設計されています。 diff --git a/content/ja/docs/concepts/architecture/nodes.md b/content/ja/docs/concepts/architecture/nodes.md index d5631319a7..1c3d47c019 100644 --- a/content/ja/docs/concepts/architecture/nodes.md +++ b/content/ja/docs/concepts/architecture/nodes.md @@ -43,7 +43,6 @@ kubectl describe node <ノード名> | ノードのCondition | 概要 | |----------------|-------------| -| `OutOfDisk` | 新しいPodを追加するために必要なディスク容量が足りない場合に`True`になります。それ以外のときは`False`です。 | | `Ready` | ノードの状態がHealthyでPodを配置可能な場合に`True`になります。ノードの状態に問題があり、Podが配置できない場合に`False`になります。ノードコントローラーが、`node-monitor-grace-period`で設定された時間内(デフォルトでは40秒)に該当ノードと疎通できない場合、`Unknown`になります。 | | `MemoryPressure` | ノードのメモリが圧迫されているときに`True`になります。圧迫とは、メモリの空き容量が少ないことを指します。それ以外のときは`False`です。 | | `PIDPressure` | プロセスが圧迫されているときに`True`になります。圧迫とは、プロセス数が多すぎることを指します。それ以外のときは`False`です。 | @@ -69,18 +68,9 @@ Ready conditionが`pod-eviction-timeout`に設定された時間を超えても` バージョン1.5よりも前のKubernetesでは、ノードコントローラーはAPIサーバーから到達不能なそれらのPodを[強制削除](/ja/docs/concepts/workloads/pods/pod/#podの強制削除)していました。しかしながら、1.5以降では、ノードコントローラーはクラスター内でPodが停止するのを確認するまでは強制的に削除しないようになりました。到達不能なノード上で動いているPodは`Terminating`または`Unknown`のステータスになります。Kubernetesが基盤となるインフラストラクチャーを推定できない場合、クラスター管理者は手動でNodeオブジェクトを削除する必要があります。KubernetesからNodeオブジェクトを削除すると、そのノードで実行されているすべてのPodオブジェクトがAPIサーバーから削除され、それらの名前が解放されます。 -バージョン1.12において、`TaintNodesByCondition`機能がBetaに昇格し、それによってノードのライフサイクルコントローラーがconditionを表した[taint](/docs/concepts/configuration/taint-and-toleration/)を自動的に生成するようになりました。 -同様に、スケジューラーがPodを配置するノードを検討する際、ノードのtaintとPodのtolerationsを見るかわりにconditionを無視するようになりました。 +ノードのライフサイクルコントローラーがconditionを表した[taint](/docs/concepts/configuration/taint-and-toleration/)を自動的に生成します。 -ユーザーは、古いスケジューリングモデルか、新しくてより柔軟なスケジューリングモデルのどちらかを選択できるようになりました。 -上記のtolerationがないPodは古いスケジュールモデルに従ってスケジュールされます。しかし、特定のノードのtaintを許容するPodについては、条件に合ったノードにスケジュールすることができます。 - -{{< caution >}} - -この機能を有効にすると、conditionが観測されてからtaintが作成されるまでの間にわずかな遅延が発生します。 -この遅延は通常1秒未満ですが、正常にスケジュールされているが、kubeletによって配置を拒否されたPodの数が増える可能性があります。 - -{{< /caution >}} +スケジューラーがPodをノードに割り当てる際、ノードのtaintを考慮します。Podが許容するtaintは例外です。 ### CapacityとAllocatable {#capacity} @@ -91,7 +81,7 @@ allocatableブロックは、通常のPodによって消費されるノード上 CapacityとAllocatableについて深く知りたい場合は、ノード上でどのように[コンピュートリソースが予約されるか](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable)を読みながら学ぶことができます。 -### Info +### Info {#info} カーネルのバージョン、Kubernetesのバージョン(kubeletおよびkube-proxyのバージョン)、(使用されている場合)Dockerのバージョン、OS名など、ノードに関する一般的な情報です。 この情報はノードからkubeletを通じて取得されます。 @@ -114,6 +104,7 @@ CapacityとAllocatableについて深く知りたい場合は、ノード上で ``` Kubernetesは内部的にNodeオブジェクトを作成し、 `metadata.name`フィールドに基づくヘルスチェックによってノードを検証します。ノードが有効な場合、つまり必要なサービスがすべて実行されている場合は、Podを実行する資格があります。それ以外の場合、該当ノードが有効になるまではいかなるクラスターの活動に対しても無視されます。 +Nodeオブジェクトの名前は有効な[DNSサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)である必要があります。 {{< note >}} Kubernetesは無効なノードのためにオブジェクトを保存し、それをチェックし続けます。 @@ -136,9 +127,19 @@ Kubernetesは無効なノードのためにオブジェクトを保存し、そ ノードが到達不能(例えば、ノードがダウンしているなどので理由で、ノードコントローラーがハートビートの受信を停止した場合)になると、ノードコントローラーは、NodeStatusのNodeReady conditionをConditionUnknownに変更する役割があります。その後も該当ノードが到達不能のままであった場合、Graceful Terminationを使って全てのPodを退役させます。デフォルトのタイムアウトは、ConditionUnknownの報告を開始するまで40秒、その後Podの追い出しを開始するまで5分に設定されています。 ノードコントローラーは、`--node-monitor-period`に設定された秒数ごとに各ノードの状態をチェックします。 -バージョン1.13よりも前のKubernetesにおいて、NodeStatusはノードからのハートビートでした。Kubernetes 1.13から、NodeLeaseがアルファ機能として導入されました(Feature Gate `NodeLease`, [KEP-0009](https://github.com/kubernetes/community/blob/master/keps/sig-node/0009-node-heartbeat.md))。 +#### ハートビート +ハートビートは、Kubernetesノードから送信され、ノードが利用可能か判断するのに役立ちます。 +2つのハートビートがあります:`NodeStatus`の更新と[Lease object](/docs/reference/generated/kubernetes-api/{{< latest-version >}}#lease-v1-coordination-k8s-io)です。 +各ノードは`kube-node-lease`という{{< glossary_tooltip term_id="namespace" text="namespace">}}に関連したLeaseオブジェクトを持ちます。 +Leaseは軽量なリソースで、クラスターのスケールに応じてノードのハートビートにおけるパフォーマンスを改善します。 + +kubeletが`NodeStatus`とLeaseオブジェクトの作成および更新を担当します。 + +- kubeletは、ステータスに変化があったり、設定した間隔の間に更新がない時に`NodeStatus`を更新します。`NodeStatus`更新のデフォルト間隔は5分です。(到達不能の場合のデフォルトタイムアウトである40秒よりもはるかに長いです) +- kubeletは10秒間隔(デフォルトの更新間隔)でLeaseオブジェクトの生成と更新を実施します。Leaseの更新は`NodeStatus`の更新とは独立されて行われます。Leaseの更新が失敗した場合、kubeletは200ミリ秒から始まり7秒を上限とした指数バックオフでリトライします。 + +#### 信頼性 -NodeLeaseが有効になっている場合、各ノードは `kube-node-lease`というNamespaceに関連付けられた`Lease`オブジェクトを持ち、ノードによって定期的に更新されます。NodeStatusとNodeLeaseの両方がノードからのハートビートとして扱われます。NodeLeaseは頻繁に更新されますが、NodeStatusはノードからマスターへの変更があるか、または十分な時間が経過した場合にのみ報告されます(デフォルトは1分で、到達不能の場合のデフォルトタイムアウトである40秒よりも長いです)。NodeLeaseはNodeStatusよりもはるかに軽量であるため、スケーラビリティとパフォーマンスの両方の観点においてノードのハートビートのコストを下げます。 Kubernetes 1.4では、マスターに問題が発生した場合の対処方法を改善するように、ノードコントローラーのロジックをアップデートしています(マスターのネットワークに問題があるため) バージョン1.4以降、ノードコントローラーは、Podの退役について決定する際に、クラスター内のすべてのノードの状態を調べます。 @@ -201,6 +202,11 @@ DaemonSetコントローラーによって作成されたPodはKubernetesスケ これは、再起動の準備中にアプリケーションからアプリケーションが削除されている場合でも、デーモンがマシンに属していることを前提としているためです。 {{< /note >}} +{{< caution >}} +`kubectl cordon`はノードに'unschedulable'としてマークします。それはロードバランサーのターゲットリストからノードを削除するという +サービスコントローラーの副次的な効果をもたらします。これにより、ロードバランサトラフィックの流入をcordonされたノードから効率的に除去する事ができます。 +{{< /caution >}} + ### ノードのキャパシティ ノードのキャパシティ(CPUの数とメモリの量)はNodeオブジェクトの一部です。 @@ -213,6 +219,11 @@ Kubernetesスケジューラーは、ノード上のすべてのPodに十分な Pod以外のプロセス用にリソースを明示的に予約したい場合は、このチュートリアルに従って[Systemデーモン用にリソースを予約](/docs/tasks/administer-cluster/reserve-compute-resources/#system-reserved)してください。 +## ノードのトポロジー + +{{< feature-state state="alpha" >}} +`TopologyManager`の[フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)を有効にすると、 +kubeletはリソースの割当を決定する際にトポロジーのヒントを利用できます。 ## APIオブジェクト @@ -220,3 +231,7 @@ NodeはKubernetesのREST APIにおけるトップレベルのリソースです [Node APIオブジェクト](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#node-v1-core). +## {{% heading "whatsnext" %}} + +* [ノードコンポーネント](/ja/docs/concepts/overview/components/#node-components)について読む。 +* ノードレベルのトポロジーについて読む: [ノードのトポロジー管理ポリシーを制御する](/docs/tasks/administer-cluster/topology-manager/) diff --git a/content/ja/docs/concepts/cluster-administration/cluster-administration-overview.md b/content/ja/docs/concepts/cluster-administration/cluster-administration-overview.md index 49e00df3a0..5d85797649 100644 --- a/content/ja/docs/concepts/cluster-administration/cluster-administration-overview.md +++ b/content/ja/docs/concepts/cluster-administration/cluster-administration-overview.md @@ -16,13 +16,13 @@ Kubernetesクラスターの計画、セットアップ、設定の例を知る ガイドを選択する前に、いくつかの考慮事項を挙げます。 - - ユーザーのコンピューター上でKubernetesを試したいでしょうか、それとも高可用性のあるマルチノードクラスターを構築したいでしょうか? あなたのニーズにあったディストリビューションを選択してください。 + - ユーザーのコンピューター上でKubernetesを試したいでしょうか、それとも高可用性のあるマルチノードクラスターを構築したいでしょうか?あなたのニーズにあったディストリビューションを選択してください。 - **もしあなたが高可用性を求める場合**、 [複数ゾーンにまたがるクラスター](/docs/concepts/cluster-administration/federation/)の設定について学んでください。 - - [Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine/)のような**ホストされているKubernetesクラスター**を使用するのか、それとも**自分自身でクラスターをホストするのでしょうか**? - - 使用するクラスターは**オンプレミス**なのか、それとも**クラウド (IaaS)**でしょうか? Kubernetesはハイブリッドクラスターを直接サポートしていません。その代わりユーザーは複数のクラスターをセットアップできます。 - - Kubernetesを**"ベアメタル"なハードウェア** 上で稼働させますか? それとも**仮想マシン (VMs)** 上で稼働させますか? + - [Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine/)のような**ホストされているKubernetesクラスター**を使用するのか、それとも**自分自身でクラスターをホストするのでしょうか**? + - 使用するクラスターは**オンプレミス**なのか、それとも**クラウド(IaaS)** でしょうか?Kubernetesはハイブリッドクラスターを直接サポートしていません。その代わりユーザーは複数のクラスターをセットアップできます。 + - Kubernetesを **「ベアメタル」なハードウェア**上で稼働させますか?それとも**仮想マシン(VMs)** 上で稼働させますか? - **もしオンプレミスでKubernetesを構築する場合**、どの[ネットワークモデル](/ja/docs/concepts/cluster-administration/networking/)が最適か検討してください。 - - **ただクラスターを稼働させたいだけ**でしょうか、それとも**Kubernetesプロジェクトのコードの開発**を行いたいでしょうか? もし後者の場合、開発が進行中のディストリビューションを選択してください。いくつかのディストリビューションはバイナリリリースのみ使用していますが、多くの選択肢があります。 + - **ただクラスターを稼働させたいだけ**でしょうか、それとも**Kubernetesプロジェクトのコードの開発**を行いたいでしょうか?もし後者の場合、開発が進行中のディストリビューションを選択してください。いくつかのディストリビューションはバイナリリリースのみ使用していますが、多くの選択肢があります。 - クラスターを稼働させるのに必要な[コンポーネント](/ja/docs/concepts/overview/components/)についてよく理解してください。 注意: 全てのディストリビューションがアクティブにメンテナンスされている訳ではありません。最新バージョンのKubernetesでテストされたディストリビューションを選択してください。 diff --git a/content/ja/docs/concepts/cluster-administration/controller-metrics.md b/content/ja/docs/concepts/cluster-administration/controller-metrics.md deleted file mode 100644 index d77f5bdf44..0000000000 --- a/content/ja/docs/concepts/cluster-administration/controller-metrics.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: コントローラーマネージャーの指標 -content_type: concept -weight: 100 ---- - - -コントローラーマネージャーの指標は、コントローラー内部のパフォーマンスについての重要で正確な情報と、クラウドコントローラーの状態についての情報を提供します。 - - - - -## コントローラーマネージャーの指標とは何か - -コントローラーマネージャーの指標は、コントローラー内部のパフォーマンスについての重要で正確な情報と、クラウドコントローラーの状態についての情報を提供します。 -これらの指標にはgo_routineのカウントなどの一般的なGo言語ランタイムの指標と、etcdのリクエストレイテンシまたはCloudprovider(AWS、GCE、OpenStack)APIのレイテンシといったコントローラー固有の指標が含まれていて、クラスターの状態を測定するために利用できます。 - -Kubernetes 1.7からGCE、AWS、Vsphere、OpenStackのストレージ操作の詳細なCloudproviderの指標が利用可能になりました。 -これらの指標は永続的ボリュームの操作状況を監視するために利用できます。 - -たとえば、GCEの場合にはこれらの指標は次のように呼び出されます。 - -``` -cloudprovider_gce_api_request_duration_seconds { request = "instance_list"} -cloudprovider_gce_api_request_duration_seconds { request = "disk_insert"} -cloudprovider_gce_api_request_duration_seconds { request = "disk_delete"} -cloudprovider_gce_api_request_duration_seconds { request = "attach_disk"} -cloudprovider_gce_api_request_duration_seconds { request = "detach_disk"} -cloudprovider_gce_api_request_duration_seconds { request = "list_disk"} -``` - - - -## 設定 - -クラスターではコントローラーマネージャーの指標はコントローラーマネージャーが実行されているホストの`http://localhost:10252/metrics`から取得可能です。 - -この指標は[prometheusフォーマット](https://prometheus.io/docs/instrumenting/exposition_formats/)で出力され人間が読める形式になっています。 - -本番環境ではこれらの指標を定期的に収集し、なんらかの時系列データベースで使用できるようにprometheusやその他の指標のスクレイパーを構成することが推奨されます。 - - diff --git a/content/ja/docs/concepts/cluster-administration/networking.md b/content/ja/docs/concepts/cluster-administration/networking.md index 2ec89adc4d..53b899dc32 100644 --- a/content/ja/docs/concepts/cluster-administration/networking.md +++ b/content/ja/docs/concepts/cluster-administration/networking.md @@ -81,7 +81,7 @@ Details on how the AOS system works can be accessed here: http://www.apstra.com/ [AWS VPC CNI](https://github.com/aws/amazon-vpc-cni-k8s)は、Kubernetesクラスター向けの統合されたAWS Virtual Private Cloud(VPC)ネットワーキングを提供します。このCNIプラグインは、高いスループットと可用性、低遅延、および最小のネットワークジッタを提供します。さらに、ユーザーは、Kubernetesクラスターを構築するための既存のAWS VPCネットワーキングとセキュリティのベストプラクティスを適用できます。これには、ネットワークトラフィックの分離にVPCフローログ、VPCルーティングポリシー、およびセキュリティグループを使用する機能が含まれます。 -このCNIプラグインを使用すると、Kubernetes PodはVPCネットワーク上と同じIPアドレスをPod内に持つことができます。CNIはAWS Elastic Networking Interfaces(ENI)を各Kubernetesノードに割り当て、ノード上のPodに各ENIのセカンダリIP範囲を使用します。このCNIには、Podの起動時間を短縮するためのENIとIPアドレスの事前割り当ての制御が含まれており、最大2,000ノードの大規模クラスターが可能です。 +このCNIプラグインを使用すると、Kubernetes PodはVPCネットワーク上と同じIPアドレスをPod内に持つことができます。CNIはAWS Elastic Networking Interface(ENI)を各Kubernetesノードに割り当て、ノード上のPodに各ENIのセカンダリIP範囲を使用します。このCNIには、Podの起動時間を短縮するためのENIとIPアドレスの事前割り当ての制御が含まれており、最大2,000ノードの大規模クラスターが可能です。 さらに、このCNIは[ネットワークポリシーの適用のためにCalico](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/calico.html)と一緒に実行できます。AWS VPC CNIプロジェクトは、[GitHubのドキュメント](https://github.com/aws/amazon-vpc-cni-k8s)とともにオープンソースで公開されています。 @@ -89,7 +89,7 @@ Details on how the AOS system works can be accessed here: http://www.apstra.com/ [Azure CNI](https://docs.microsoft.com/en-us/azure/virtual-network/container-networking-overview) is an [open source](https://github.com/Azure/azure-container-networking/blob/master/docs/cni.md) plugin that integrates Kubernetes Pods with an Azure Virtual Network (also known as VNet) providing network performance at par with VMs. Pods can connect to peered VNet and to on-premises over Express Route or site-to-site VPN and are also directly reachable from these networks. Pods can access Azure services, such as storage and SQL, that are protected by Service Endpoints or Private Link. You can use VNet security policies and routing to filter Pod traffic. The plugin assigns VNet IPs to Pods by utilizing a pool of secondary IPs pre-configured on the Network Interface of a Kubernetes node. Azure CNI is available natively in the [Azure Kubernetes Service (AKS)] (https://docs.microsoft.com/en-us/azure/aks/configure-azure-cni). - + ### Big Cloud Fabric from Big Switch Networks @@ -289,4 +289,3 @@ to run, and in both cases, the network provides one IP address per pod - as is s ネットワークモデルの初期設計とその根拠、および将来の計画については、[ネットワーク設計ドキュメント](https://git.k8s.io/community/contributors/design-proposals/network/networking.md)で詳細に説明されています。 - diff --git a/content/ja/docs/concepts/configuration/assign-pod-node.md b/content/ja/docs/concepts/configuration/assign-pod-node.md index 7a6c27a1e5..fc05700e28 100644 --- a/content/ja/docs/concepts/configuration/assign-pod-node.md +++ b/content/ja/docs/concepts/configuration/assign-pod-node.md @@ -7,7 +7,7 @@ weight: 30 -[Pod](/ja/docs/concepts/workloads/pods/pod/)が稼働する[Node](/ja/docs/concepts/architecture/nodes/)を特定のものに指定したり、優先条件を指定して制限することができます。 +{{< glossary_tooltip text="Pod" term_id="pod" >}}が稼働する{{< glossary_tooltip text="Node" term_id="node" >}}を特定のものに指定したり、優先条件を指定して制限することができます。 これを実現するためにはいくつかの方法がありますが、推奨されている方法は[ラベルでの選択](/ja/docs/concepts/overview/working-with-objects/labels/)です。 スケジューラーが最適な配置を選択するため、一般的にはこのような制限は不要です(例えば、複数のPodを別々のNodeへデプロイしたり、Podを配置する際にリソースが不十分なNodeにはデプロイされないことが挙げられます)が、 SSDが搭載されているNodeにPodをデプロイしたり、同じアベイラビリティーゾーン内で通信する異なるサービスのPodを同じNodeにデプロイする等、柔軟な制御が必要なこともあります。 @@ -27,7 +27,7 @@ SSDが搭載されているNodeにPodをデプロイしたり、同じアベイ ### ステップ0: 前提条件 -この例では、KubernetesのPodに関して基本的な知識を有していることと、[Kubernetesクラスターのセットアップ](https://github.com/kubernetes/kubernetes#documentation)がされていることが前提となっています。 +この例では、KubernetesのPodに関して基本的な知識を有していることと、[Kubernetesクラスターのセットアップ](/ja/docs/setup/)がされていることが前提となっています。 ### ステップ1: Nodeへのラベルの付与 @@ -63,17 +63,20 @@ nodeSelectorを以下のように追加します: `kubectl apply -f https://k8s.io/examples/pods/pod-nginx.yaml`により、Podは先ほどラベルを付与したNodeへスケジュールされます。 `kubectl get pods -o wide`で表示される"NODE"の列から、PodがデプロイされているNodeを確認することができます。 -## 補足: ビルトインNodeラベル +## 補足: ビルトインNodeラベル {#built-in-node-labels} 明示的に[付与](#step-one-attach-label-to-the-node)するラベルの他に、事前にNodeへ付与されているものもあります。 以下のようなラベルが該当します。 -* `kubernetes.io/hostname` -* `failure-domain.beta.kubernetes.io/zone` -* `failure-domain.beta.kubernetes.io/region` -* `beta.kubernetes.io/instance-type` -* `kubernetes.io/os` -* `kubernetes.io/arch` +* [`kubernetes.io/hostname`](/docs/reference/kubernetes-api/labels-annotations-taints/#kubernetes-io-hostname) +* [`failure-domain.beta.kubernetes.io/zone`](/docs/reference/kubernetes-api/labels-annotations-taints/#failure-domainbetakubernetesiozone) +* [`failure-domain.beta.kubernetes.io/region`](/docs/reference/kubernetes-api/labels-annotations-taints/#failure-domainbetakubernetesioregion) +* [`topology.kubernetes.io/zone`](/docs/reference/kubernetes-api/labels-annotations-taints/#topologykubernetesiozone) +* [`topology.kubernetes.io/region`](/docs/reference/kubernetes-api/labels-annotations-taints/#topologykubernetesiozone) +* [`beta.kubernetes.io/instance-type`](/docs/reference/kubernetes-api/labels-annotations-taints/#beta-kubernetes-io-instance-type) +* [`node.kubernetes.io/instance-type`](/docs/reference/kubernetes-api/labels-annotations-taints/#nodekubernetesioinstance-type) +* [`kubernetes.io/os`](/docs/reference/kubernetes-api/labels-annotations-taints/#kubernetes-io-os) +* [`kubernetes.io/arch`](/docs/reference/kubernetes-api/labels-annotations-taints/#kubernetes-io-arch) {{< note >}} これらのラベルは、クラウドプロバイダー固有であり、確実なものではありません。 @@ -88,131 +91,127 @@ Nodeにラベルを付与することで、Podは特定のNodeやNodeグルー これは、安全性が損なわれたNodeがkubeletの認証情報をNodeのオブジェクトに設定したり、スケジューラーがそのようなNodeにデプロイすることを防ぎます。 `NodeRestriction`プラグインは、kubeletが`node-restriction.kubernetes.io/`プレフィックスを有するラベルの設定や上書きを防ぎます。 -Nodeの隔離にラベルのプレフィックスを使用するためには、以下の3点を確認してください。 +Nodeの隔離にラベルのプレフィックスを使用するためには、以下のようにします。 -1. NodeRestrictionを使用するため、Kubernetesのバージョンがv1.11以上であること。 -2. [Node authorizer](/docs/reference/access-authn-authz/node/)を使用していることと、[NodeRestriction admission plugin](/docs/reference/access-authn-authz/admission-controllers/#noderestriction)が有効になっていること。 -3. Nodeに`node-restriction.kubernetes.io/` プレフィックスのラベルを付与し、そのラベルがnode selectorに指定されていること。 +1. [Node authorizer](/docs/reference/access-authn-authz/node/)を使用していることと、[NodeRestriction admission plugin](/docs/reference/access-authn-authz/admission-controllers/#noderestriction)が_有効_になっていること。 +2. Nodeに`node-restriction.kubernetes.io/` プレフィックスのラベルを付与し、そのラベルがnode selectorに指定されていること。 例えば、`example.com.node-restriction.kubernetes.io/fips=true` または `example.com.node-restriction.kubernetes.io/pci-dss=true`のようなラベルです。 -## Affinity と Anti-Affinity {#affinity-and-anti-affinity} +## アフィニティとアンチアフィニティ {#affinity-and-anti-affinity} `nodeSelector`はPodの稼働を特定のラベルが付与されたNodeに制限する最も簡単な方法です。 -Affinity/Anti-Affinityでは、より柔軟な指定方法が提供されています。 +アフィニティ/アンチアフィニティでは、より柔軟な指定方法が提供されています。 拡張機能は以下の通りです。 -1. 様々な指定方法がある ("AND条件"に限らない) -2. 必須条件ではなく優先条件を指定でき、条件を満たさない場合でもPodをスケジュールさせることができる -3. Node自体のラベルではなく、Node(または他のトポロジカルドメイン)上で稼働している他のPodのラベルに対して条件を指定することができ、そのPodと同じ、または異なるドメインで稼働させることができる +1. アフィニティ/アンチアフィニティという用語はとても表現豊かです。この用語は論理AND演算で作成された完全一致だけではなく、より多くのマッチングルールを提供します。 +2. 必須条件ではなく優先条件を指定でき、条件を満たさない場合でもPodをスケジュールさせることができます。 +3. Node自体のラベルではなく、Node(または他のトポロジカルドメイン)上で稼働している他のPodのラベルに対して条件を指定することができ、そのPodと同じ、または異なるドメインで稼働させることができます。 -Affinityは"Node Affinity"と"Inter-Pod Affinity/Anti-Affinity"の2種類から成ります。 -Node affinityは`nodeSelector`(前述の2つのメリットがあります)に似ていますが、Inter-Pod Affinity/Anti-Affinityは、上記の3番目の機能に記載している通り、NodeのラベルではなくPodのラベルに対して制限をかけます。 +アフィニティは"Nodeアフィニティ"と"Pod間アフィニティ/アンチアフィニティ"の2種類から成ります。 +Nodeアフィニティは`nodeSelector`(前述の2つのメリットがあります)に似ていますが、Pod間アフィニティ/アンチアフィニティは、上記の3番目の機能に記載している通り、NodeのラベルではなくPodのラベルに対して制限をかけます。 -`nodeSelector`は問題なく使用することができますが、Node affinityは`nodeSelector`で指定できる条件を全て実現できるため、将来的には推奨されなくなります。 +### Nodeアフィニティ -### Node Affinity +Nodeアフィニティは概念的には、NodeのラベルによってPodがどのNodeにスケジュールされるかを制限する`nodeSelector`と同様です。 -Node Affinityはα機能としてKubernetesのv1.2から導入されました。 -Node Affinityは概念的には、NodeのラベルによってPodがどのNodeにスケジュールされるかを制限する`nodeSelector`と同様です。 - -現在は2種類のNode Affinityがあり、`requiredDuringSchedulingIgnoredDuringExecution`と`preferredDuringSchedulingIgnoredDuringExecution`です。 +現在は2種類のNodeアフィニティがあり、`requiredDuringSchedulingIgnoredDuringExecution`と`preferredDuringSchedulingIgnoredDuringExecution`です。 前者はNodeにスケジュールされるPodが条件を満たすことが必須(`nodeSelector`に似ていますが、より柔軟に条件を指定できます)であり、後者は条件を指定できますが保証されるわけではなく、優先的に考慮されます。 "IgnoredDuringExecution"の意味するところは、`nodeSelector`の機能と同様であり、Nodeのラベルが変更され、Podがその条件を満たさなくなった場合でも PodはそのNodeで稼働し続けるということです。 -将来的には、`requiredDuringSchedulingIgnoredDuringExecution`に、PodのNode Affinityに記された必須要件を満たさなくなったNodeからそのPodを退避させることができる機能を備えた`requiredDuringSchedulingRequiredDuringExecution`が提供される予定です。 +将来的には、`requiredDuringSchedulingIgnoredDuringExecution`に、PodのNodeアフィニティに記された必須要件を満たさなくなったNodeからそのPodを退避させることができる機能を備えた`requiredDuringSchedulingRequiredDuringExecution`が提供される予定です。 それぞれの使用例として、 `requiredDuringSchedulingIgnoredDuringExecution` は、"インテルCPUを供えたNode上でPodを稼働させる"、 `preferredDuringSchedulingIgnoredDuringExecution`は、"ゾーンXYZでPodの稼働を試みますが、実現不可能な場合には他の場所で稼働させる" といった方法が挙げられます。 -Node Affinityは、PodSpecの`affinity`フィールドにある`nodeAffinity`フィールドで特定します。 +Nodeアフィニティは、PodSpecの`affinity`フィールドにある`nodeAffinity`フィールドで特定します。 -Node Affinityを使用したPodの例を以下に示します: +Nodeアフィニティを使用したPodの例を以下に示します: {{< codenew file="pods/pod-with-node-affinity.yaml" >}} -このNode Affinityでは、Podはキーが`kubernetes.io/e2e-az-name`、値が`e2e-az1`または`e2e-az2`のラベルが付与されたNodeにしか配置されません。 +このNodeアフィニティでは、Podはキーが`kubernetes.io/e2e-az-name`、値が`e2e-az1`または`e2e-az2`のラベルが付与されたNodeにしか配置されません。 加えて、キーが`another-node-label-key`、値が`another-node-label-value`のラベルが付与されたNodeが優先されます。 この例ではオペレーター`In`が使われています。 -Node Affinityでは、`In`、`NotIn`、`Exists`、`DoesNotExist`、`Gt`、`Lt`のオペレーターが使用できます。 -`NotIn`と`DoesNotExist`はNode Anti-Affinity、またはPodを特定のNodeにスケジュールさせない場合に使われる[Taints](/docs/concepts/configuration/taint-and-toleration/)に使用します。 +Nodeアフィニティでは、`In`、`NotIn`、`Exists`、`DoesNotExist`、`Gt`、`Lt`のオペレーターが使用できます。 +`NotIn`と`DoesNotExist`はNodeアンチアフィニティ、またはPodを特定のNodeにスケジュールさせない場合に使われる[Taints](/docs/concepts/configuration/taint-and-toleration/)に使用します。 `nodeSelector`と`nodeAffinity`の両方を指定した場合、Podは**両方の**条件を満たすNodeにスケジュールされます。 -`nodeAffinity`内で複数の`nodeSelectorTerms`を指定した場合、Podは**いずれかの**`nodeSelectorTerms`を満たしたNodeへスケジュールされます。 +`nodeAffinity`内で複数の`nodeSelectorTerms`を指定した場合、Podは**全ての**`nodeSelectorTerms`を満たしたNodeへスケジュールされます。 -`nodeSelectorTerms`内で複数の`matchExpressions`を指定した場合にはPodは**全ての**`matchExpressions`を満たしたNodeへスケジュールされます。 +`nodeSelectorTerms`内で複数の`matchExpressions`を指定した場合にはPodは**いずれかの**`matchExpressions`を満たしたNodeへスケジュールされます。 PodがスケジュールされたNodeのラベルを削除したり変更しても、Podは削除されません。 -言い換えると、AffinityはPodをスケジュールする際にのみ考慮されます。 +言い換えると、アフィニティはPodをスケジュールする際にのみ考慮されます。 `preferredDuringSchedulingIgnoredDuringExecution`内の`weight`フィールドは、1から100の範囲で指定します。 -全ての必要条件(リソースやRequiredDuringScheduling Affinity等)を満たしたNodeに対して、スケジューラーはそのNodeがMatchExpressionsを満たした場合に、このフィルードの"weight"を加算して合計を計算します。 +全ての必要条件(リソースやRequiredDuringSchedulingアフィニティ等)を満たしたNodeに対して、スケジューラーはそのNodeがMatchExpressionsを満たした場合に、このフィルードの"weight"を加算して合計を計算します。 このスコアがNodeの他の優先機能のスコアと組み合わせれ、最も高いスコアを有したNodeが優先されます。 -### Inter-Pod Affinity/Anti-Affinity +### Pod間アフィニティとアンチアフィニティ -Inter-Pod AffinityとAnti-Affinityは、Nodeのラベルではなく、すでにNodeで稼働しているPodのラベルに従ってPodがスケジュールされるNodeを制限します。 -このポリシーは、"XにてルールYを満たすPodがすでに稼働している場合、このPodもXで稼働させる(Anti-Affinityの場合は稼働させない)"という形式です。 +Pod間アフィニティとアンチアフィニティは、Nodeのラベルではなく、すでにNodeで稼働しているPodのラベルに従ってPodがスケジュールされるNodeを制限します。 +このポリシーは、"XにてルールYを満たすPodがすでに稼働している場合、このPodもXで稼働させる(アンチアフィニティの場合は稼働させない)"という形式です。 Yはnamespaceのリストで指定したLabelSelectorで表されます。 Nodeと異なり、Podはnamespaceで区切られているため(それゆえPodのラベルも暗黙的にnamespaceで区切られます)、Podのラベルを指定するlabel selectorは、どのnamespaceにselectorを適用するかを指定する必要があります。 概念的に、XはNodeや、ラック、クラウドプロバイダゾーン、クラウドプロバイダのリージョン等を表すトポロジードメインです。 -これらを表すためにシステムが使用するNode Labelのキーである`topologyKey`を使うことで、トポロジードメインを指定することができます。 +これらを表すためにシステムが使用するNodeラベルのキーである`topologyKey`を使うことで、トポロジードメインを指定することができます。 先述のセクション[補足: ビルトインNodeラベル](#interlude-built-in-node-labels)にてラベルの例が紹介されています。 {{< note >}} -Inter-Pod AffinityとAnti-Affinityは、大規模なクラスター上で使用する際にスケジューリングを非常に遅くする恐れのある多くの処理を要します。 +Pod間アフィニティとアンチアフィニティは、大規模なクラスター上で使用する際にスケジューリングを非常に遅くする恐れのある多くの処理を要します。 そのため、数百台以上のNodeから成るクラスターでは使用することを推奨されません。 {{< /note >}} {{< note >}} -Pod Anti-Affinityは、Nodeに必ずラベルが付与されている必要があります。 -例えば、クラスターの全てのNodeが、`topologyKey`で指定されたものに合致する適切なラベルが必要になります。 +Podのアンチアフィニティは、Nodeに必ずラベルが付与されている必要があります。 +言い換えると、クラスターの全てのNodeが、`topologyKey`で指定されたものに合致する適切なラベルが必要になります。 それらが付与されていないNodeが存在する場合、意図しない挙動を示すことがあります。 {{< /note >}} -Node Affinityと同様に、Pod AffinityとPod Anti-Affinityにも必須条件と優先条件を示す`requiredDuringSchedulingIgnoredDuringExecution`と`preferredDuringSchedulingIgnoredDuringExecution`があります。 -前述のNode Affinityのセクションを参照してください。 -`requiredDuringSchedulingIgnoredDuringExecution`を指定するAffinityの使用例は、"Service AのPodとService BのPodが密に通信する際、それらを同じゾーンで稼働させる場合"です。 -また、`preferredDuringSchedulingIgnoredDuringExecution`を指定するAnti-Affinityの使用例は、"ゾーンをまたいでPodのサービスを稼働させる場合"(Podの数はゾーンの数よりも多いため、必須条件を指定すると合理的ではありません)です。 +Nodeアフィニティと同様に、PodアフィニティとPodアンチアフィニティにも必須条件と優先条件を示す`requiredDuringSchedulingIgnoredDuringExecution`と`preferredDuringSchedulingIgnoredDuringExecution`があります。 +前述のNodeアフィニティのセクションを参照してください。 +`requiredDuringSchedulingIgnoredDuringExecution`を指定するアフィニティの使用例は、"Service AのPodとService BのPodが密に通信する際、それらを同じゾーンで稼働させる場合"です。 +また、`preferredDuringSchedulingIgnoredDuringExecution`を指定するアンチアフィニティの使用例は、"ゾーンをまたいでPodのサービスを稼働させる場合"(Podの数はゾーンの数よりも多いため、必須条件を指定すると合理的ではありません)です。 -Inter-Pod Affinityは、PodSpecの`affinity`フィールド内に`podAffinity`で指定し、Inter-Pod Anti-Affinityは、`podAntiAffinity`で指定します。 +Pod間アフィニティは、PodSpecの`affinity`フィールド内に`podAffinity`で指定し、Pod間アンチアフィニティは、`podAntiAffinity`で指定します。 -#### Pod Affinityを使用したPodの例 +#### Podアフィニティを使用したPodの例 {{< codenew file="pods/pod-with-pod-affinity.yaml" >}} -このPodのAffifnityは、Pod AffinityとPod Anti-Affinityを1つずつ定義しています。 +このPodのアフィニティは、PodアフィニティとPodアンチアフィニティを1つずつ定義しています。 この例では、`podAffinity`に`requiredDuringSchedulingIgnoredDuringExecution`、`podAntiAffinity`に`preferredDuringSchedulingIgnoredDuringExecution`が設定されています。 -Pod Affinityは、「キーが"security"、値が"S1"のラベルが付与されたPodが少なくとも1つは稼働しているNodeが同じゾーンにあれば、PodはそのNodeにスケジュールされる」という条件を指定しています(より正確には、キーが"security"、値が"S1"のラベルが付与されたPodが稼働しており、キーが`failure-domain.beta.kubernetes.io/zone`、値がVであるNodeが少なくとも1つはある状態で、 +Podアフィニティは、「キーが"security"、値が"S1"のラベルが付与されたPodが少なくとも1つは稼働しているNodeが同じゾーンにあれば、PodはそのNodeにスケジュールされる」という条件を指定しています(より正確には、キーが"security"、値が"S1"のラベルが付与されたPodが稼働しており、キーが`failure-domain.beta.kubernetes.io/zone`、値がVであるNodeが少なくとも1つはある状態で、 Node Nがキー`failure-domain.beta.kubernetes.io/zone`、値Vのラベルを持つ場合に、PodはNode Nで稼働させることができます)。 -Pod Anti-Affinityは、「すでにあるNode上で、キーが"security"、値が"S2"であるPodが稼働している場合に、Podを可能な限りそのNode上で稼働させない」という条件を指定しています +Podアンチアフィニティは、「すでにあるNode上で、キーが"security"、値が"S2"であるPodが稼働している場合に、Podを可能な限りそのNode上で稼働させない」という条件を指定しています (`topologyKey`が`failure-domain.beta.kubernetes.io/zone`であった場合、キーが"security"、値が"S2"であるであるPodが稼働しているゾーンと同じゾーン内のNodeにはスケジュールされなくなります)。 -Pod AffinityとPod Anti-Affinityや、`requiredDuringSchedulingIgnoredDuringExecution`と`preferredDuringSchedulingIgnoredDuringExecution`に関する他の使用例は[デザインドック](https://git.k8s.io/community/contributors/design-proposals/scheduling/podaffinity.md)を参照してください。 +PodアフィニティとPodアンチアフィニティや、`requiredDuringSchedulingIgnoredDuringExecution`と`preferredDuringSchedulingIgnoredDuringExecution`に関する他の使用例は[デザインドック](https://git.k8s.io/community/contributors/design-proposals/scheduling/podaffinity.md)を参照してください。 -Pod AffinityとPod Anti-Affinityで使用できるオペレーターは、`In`、`NotIn`、 `Exists`、 `DoesNotExist`です。 +PodアフィニティとPodアンチアフィニティで使用できるオペレーターは、`In`、`NotIn`、 `Exists`、 `DoesNotExist`です。 原則として、`topologyKey`には任意のラベルとキーが使用できます。 しかし、パフォーマンスやセキュリティの観点から、以下の制約があります: -1. Affinityと、`requiredDuringSchedulingIgnoredDuringExecution`を指定したPod Anti-Affinityでは、`topologyKey`を指定しないことは許可されていません。 -2. `requiredDuringSchedulingIgnoredDuringExecution`を指定したPod Anti-Affinityでは、`kubernetes.io/hostname`の`topologyKey`を制限するため、アドミッションコントローラー`LimitPodHardAntiAffinityTopology`が導入されました。 +1. アフィニティと、`requiredDuringSchedulingIgnoredDuringExecution`を指定したPodアンチアフィニティは、`topologyKey`を指定しないことは許可されていません。 +2. `requiredDuringSchedulingIgnoredDuringExecution`を指定したPodアンチアフィニティでは、`kubernetes.io/hostname`の`topologyKey`を制限するため、アドミッションコントローラー`LimitPodHardAntiAffinityTopology`が導入されました。 トポロジーをカスタマイズする場合には、アドミッションコントローラーを修正または無効化する必要があります。 -3. `preferredDuringSchedulingIgnoredDuringExecution`を指定したPod Anti-Affinityでは、`topologyKey`を指定しなかった場合、"全てのトポロジー"と解釈されます("全てのトポロジー"とは、ここでは`kubernetes.io/hostname`、`failure-domain.beta.kubernetes.io/zone`、`failure-domain.beta.kubernetes.io/region`を合わせたものを意味します)。 +3. `preferredDuringSchedulingIgnoredDuringExecution`を指定したPodアンチアフィニティでは、`topologyKey`を省略することはできません。 4. 上記の場合を除き、`topologyKey` は任意のラベルとキーを指定することができあます。 `labelSelector`と`topologyKey`に加え、`labelSelector`が合致すべき`namespaces`のリストを特定することも可能です(これは`labelSelector`と`topologyKey`を定義することと同等です)。 -省略した場合や空の場合は、AffinityとAnti-Affinityが定義されたPodのnamespaceがデフォルトで設定されます。 +省略した場合や空の場合は、アフィニティとアンチアフィニティが定義されたPodのnamespaceがデフォルトで設定されます。 -`requiredDuringSchedulingIgnoredDuringExecution`が指定されたAffinityとAnti-Affinityでは、`matchExpressions`に記載された全ての条件が満たされるNodeにPodがスケジュールされます。 +`requiredDuringSchedulingIgnoredDuringExecution`が指定されたアフィニティとアンチアフィニティでは、`matchExpressions`に記載された全ての条件が満たされるNodeにPodがスケジュールされます。 #### 実際的なユースケース -Inter-Pod AffinityとAnti-Affinityは、ReplicaSet、StatefulSet、Deploymentなどのより高レベルなコレクションと併せて使用すると更に有用です。 +Pod間アフィニティとアンチアフィニティは、ReplicaSet、StatefulSet、Deploymentなどのより高レベルなコレクションと併せて使用するとさらに有用です。 Workloadが、Node等の定義された同じトポロジーに共存させるよう、簡単に設定できます。 @@ -325,7 +324,7 @@ web-server-1287567482-s330j 1/1 Running 0 7m 10.192.3 ##### 同じNodeに共存させない場合 上記の例では `PodAntiAffinity`を`topologyKey: "kubernetes.io/hostname"`と合わせて指定することで、redisクラスター内の2つのインスタンスが同じホストにデプロイされない場合を扱いました。 -同様の方法で、Anti-Affinityを用いて高可用性を実現したStatefulSetの使用例は[ZooKeeper tutorial](/docs/tutorials/stateful-application/zookeeper/#tolerating-node-failure)を参照してください。 +同様の方法で、アンチアフィニティを用いて高可用性を実現したStatefulSetの使用例は[ZooKeeper tutorial](/docs/tutorials/stateful-application/zookeeper/#tolerating-node-failure)を参照してください。 ## nodeName @@ -338,7 +337,7 @@ web-server-1287567482-s330j 1/1 Running 0 7m 10.192.3 `nodeName`を使用することによる制約は以下の通りです: - その名前のNodeが存在しない場合、Podは起動されす、自動的に削除される場合があります。 -- その名前のNodeにPodを稼働させるためのリソースがない場合、Podの起動は失敗し、理由はOutOfmemoryやOutOfcpuになります。 +- その名前のNodeにPodを稼働させるためのリソースがない場合、Podの起動は失敗し、理由は例えばOutOfmemoryやOutOfcpuになります。 - クラウド上のNodeの名前は予期できず、変更される可能性があります。 `nodeName`を指定したPodの設定ファイルの例を示します: @@ -364,8 +363,9 @@ spec: [Taints](/docs/concepts/configuration/taint-and-toleration/)を使うことで、NodeはPodを追い出すことができます。 -[Node Affinity](https://git.k8s.io/community/contributors/design-proposals/scheduling/nodeaffinity.md)と -[Inter-Pod Affinity/Anti-Affinity](https://git.k8s.io/community/contributors/design-proposals/scheduling/podaffinity.md) -には、Taintsの要点に関して様々な背景が紹介されています。 - +[Nodeアフィニティ](https://git.k8s.io/community/contributors/design-proposals/scheduling/nodeaffinity.md)と +[Pod間アフィニティ/アンチアフィニティ](https://git.k8s.io/community/contributors/design-proposals/scheduling/podaffinity.md) +のデザインドキュメントには、これらの機能の追加のバックグラウンドの情報が記載されています。 +一度PodがNodeに割り当たると、kubeletはPodを起動してノード内のリソースを確保します。 +[トポロジーマネージャー](/docs/tasks/administer-cluster/topology-manager/)はNodeレベルのリソース割り当てを決定する際に関与します。 diff --git a/content/ja/docs/concepts/configuration/manage-resources-containers.md b/content/ja/docs/concepts/configuration/manage-resources-containers.md new file mode 100644 index 0000000000..f94513b8e7 --- /dev/null +++ b/content/ja/docs/concepts/configuration/manage-resources-containers.md @@ -0,0 +1,629 @@ +--- +title: コンテナのリソース管理 +content_type: concept +weight: 40 +feature: + title: 自動ビンパッキング + description: > + 可用性を犠牲にすることなく、リソース要件やその他の制約に基づいてコンテナを自動的に配置します。リソース利用率の向上と、リソースの節約のために、クリティカルなワークロードとベストエフォートなワークロードを混在させます。 +--- + + + +{{< glossary_tooltip term_id="pod" >}}を指定する際に、{{< glossary_tooltip text="コンテナ" term_id="container" >}}が必要とする各リソースの量をオプションで指定することができます。 +指定する最も一般的なリソースはCPUとメモリ(RAM)ですが、他にもあります。 + +Pod内のコンテナのリソース*要求*を指定すると、スケジューラはこの情報を使用して、どのNodeにPodを配置するかを決定します。コンテナに*制限*ソースを指定すると、kubeletはその制限を適用し、実行中のコンテナが設定した制限を超えてリソースを使用することができないようにします。また、kubeletは、少なくともそのシステムリソースのうち、*要求*の量を、そのコンテナが使用するために特別に確保します。 + + + +## 要求と制限 + +Podが動作しているNodeに利用可能なリソースが十分にある場合、そのリソースの`要求`が指定するよりも多くのリソースをコンテナが使用することが許可されます +ただし、コンテナはそのリソースの`制限`を超えて使用することはできません。 + +たとえば、コンテナに256MiBの`メモリー`要求を設定し、そのコンテナが8GiBのメモリーを持つNodeにスケジュールされたPod内に存在し、他のPodが存在しない場合、コンテナはより多くのRAMを使用しようとする可能性があります。 + +そのコンテナに4GiBの`メモリー`制限を設定すると、kubelet(および{{< glossary_tooltip text="コンテナランタイム" term_id="container-runtime" >}}) が制限を適用します。ランタイムは、コンテナーが設定済みのリソース制限を超えて使用するのを防ぎます。例えば、コンテナ内のプロセスが、許容量を超えるメモリを消費しようとすると、システムカーネルは、メモリ不足(OOM)エラーで、割り当てを試みたプロセスを終了します。 + +制限は、違反が検出されるとシステムが介入するように事後的に、またはコンテナーが制限を超えないようにシステムが防ぐように強制的に、実装できます。 +異なるランタイムは、同じ制限を実装するために異なる方法をとることができます。 + +## リソースタイプ + +*CPU*と*メモリー*はいずれも*リソースタイプ*です。リソースタイプには基本単位があります。 +CPUは計算処理を表し、[Kubernetes CPUs](#meaning-of-cpu)の単位で指定されます。 +メモリはバイト単位で指定されます。 +Kubernetes v1.14以降を使用している場合は、*huge page*リソースを指定することができます。 +Huge PageはLinux固有の機能であり、Nodeのカーネルはデフォルトのページサイズよりもはるかに大きいメモリブロックを割り当てます。 + +たとえば、デフォルトのページサイズが4KiBのシステムでは、`hugepages-2Mi: 80Mi`という制限を指定できます。 +コンテナが40を超える2MiBの巨大ページ(合計80 MiB)を割り当てようとすると、その割り当ては失敗します。 + +{{< note >}} +`hugepages-*`リソースをオーバーコミットすることはできません。 +これは`memory`や`cpu`リソースとは異なります。 +{{< /note >}} + +CPUとメモリーは、まとめて*コンピュートリソース*または単に*リソース*と呼ばれます。 +コンピューティングリソースは、要求され、割り当てられ、消費され得る測定可能な量です。 +それらは[API resources](/docs/concepts/overview/kubernetes-api/)とは異なります。 +Podや[Services](/docs/concepts/services-networking/service/)などのAPIリソースは、Kubernetes APIサーバーを介して読み取りおよび変更できるオブジェクトです。 + +## Podとコンテナのリソース要求と制限 + +Podの各コンテナは、次の1つ以上を指定できます。 + +* `spec.containers[].resources.limits.cpu` +* `spec.containers[].resources.limits.memory` +* `spec.containers[].resources.limits.hugepages-` +* `spec.containers[].resources.requests.cpu` +* `spec.containers[].resources.requests.memory` +* `spec.containers[].resources.requests.hugepages-` + +要求と制限はそれぞれのコンテナでのみ指定できますが、このPodリソースの要求と制限の関係性について理解すると便利です。 +特定のリソースタイプの*Podリソース要求/制限*は、Pod内の各コンテナに対するそのタイプのリソース要求/制限の合計です。 + +## Kubernetesにおけるリソースの単位 + +### CPUの意味 + +CPUリソースの制限と要求は、*cpu*単位で測定されます。 +Kuberenetesにおける1つのCPUは、クラウドプロバイダーの**1 vCPU/コア**およびベアメタルのインテルプロセッサーの**1 ハイパースレッド**に相当します。 + +要求を少数で指定することもできます。 +`spec.containers[].resources.requests.cpu`が`0.5`のコンテナは、1CPUを要求するコンテナの半分のCPUが保証されます。 +`0.1`という表現は`100m`という表現と同等であり、`100ミリCPU`と読み替えることができます。 +`100ミリコア`という表現も、同じことを意味しています。 +`0.1`のような小数点のある要求はAPIによって`100m`に変換され、`1m`より細かい精度は許可されません。 +このため、`100m`の形式が推奨されます。 + +CPUは常に相対量としてではなく、絶対量として要求されます。 +0.1は、シングルコア、デュアルコア、あるいは48コアマシンのどのCPUに対してでも、同一の量を要求します。 + +### メモリーの意味 + +`メモリー`の制限と要求はバイト単位で測定されます。 +E、P、T、G、M、Kのいずれかのサフィックスを使用して、メモリーを整数または固定小数点整数として表すことができます。 +また、Ei、Pi、Ti、Gi、Mi、Kiのような2の累乗の値を使用することもできます。 +たとえば、以下はほぼ同じ値を表しています。 + +```shell +128974848, 129e6, 129M, 123Mi +``` + +例を見てみましょう。 +次のPodには2つのコンテナがあります。 +各コンテナには、0.25cpuおよび64MiB(226バイト)のメモリー要求と、0.5cpuおよび128MiBのメモリー制限があります +Podには0.5cpuと128MiBのメモリー要求があり、1cpuと256MiBのメモリ制限があると言えます。 + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: frontend +spec: + containers: + - name: db + image: mysql + env: + - name: MYSQL_ROOT_PASSWORD + value: "password" + resources: + requests: + memory: "64Mi" + cpu: "250m" + limits: + memory: "128Mi" + cpu: "500m" + - name: wp + image: wordpress + resources: + requests: + memory: "64Mi" + cpu: "250m" + limits: + memory: "128Mi" + cpu: "500m" +``` + +## リソース要求を含むPodがどのようにスケジュールされるか + +Podを作成すると、KubernetesスケジューラーはPodを実行するNodeを選択します。 +各Nodeには、リソースタイプごとに最大容量があります。それは、Podに提供できるCPUとメモリの量です。 +スケジューラーは、リソースタイプごとに、スケジュールされたコンテナのリソース要求の合計がNodeの容量より少ないことを確認します。 +Node上の実際のメモリーまたはCPUリソースの使用率は非常に低いですが、容量チェックが失敗した場合、スケジューラーはNodeにPodを配置しないことに注意してください。 +これにより、例えば日々のリソース要求のピーク時など、リソース利用が増加したときに、Nodeのリソース不足から保護されます。 + +## リソース制限のあるPodがどのように実行されるか + +kubeletがPodのコンテナを開始すると、CPUとメモリーの制限がコンテナランタイムに渡されます。 + +Dockerを使用する場合: + +- `spec.containers[].resources.requests.cpu`は、潜在的に小数であるコア値に変換され、1024倍されます。 + `docker run`コマンドの[`--cpu-shares`](https://docs.docker.com/engine/reference/run/#cpu-share-constraint)フラグの値は、この数値と2のいずれか大きい方が用いられます。 + +- `spec.containers[].resources.limits.cpu`はミリコアの値に変換され、100倍されます。 + 結果の値は、コンテナが100ミリ秒ごとに使用できるCPU時間の合計です。 + コンテナは、この間隔の間、CPU時間の占有率を超えて使用することはできません。 + + {{< note >}} + デフォルトのクォータ期間は100ミリ秒です。 + CPUクォータの最小分解能は1ミリ秒です。 + {{}} + +- `spec.containers[].resources.limits.memory`は整数に変換され、`docker run`コマンドの[`--memory`](https://docs.docker.com/engine/reference/run/#/user-memory-constraints)フラグの値として使用されます。 + +コンテナがメモリー制限を超過すると、終了する場合があります。 +コンテナが再起動可能である場合、kubeletは他のタイプのランタイム障害と同様にコンテナを再起動します。 + +コンテナがメモリー要求を超過すると、Nodeのメモリーが不足するたびにそのPodが排出される可能性があります。 + +コンテナは、長時間にわたってCPU制限を超えることが許可される場合と許可されない場合があります。 +ただし、CPUの使用量が多すぎるために、コンテナが強制終了されることはありません。 + +コンテナをスケジュールできないか、リソース制限が原因で強制終了されているかどうかを確認するには、[トラブルシューティング](#troubleshooting)のセクションを参照してください。 + +### コンピュートリソースとメモリーリソースの使用量を監視する + +Podのリソース使用量は、Podのステータスの一部として報告されます。 + +オプションの[監視ツール](/docs/tasks/debug-application-cluster/resource-usage-monitoring/)がクラスターにおいて利用可能な場合、Podのリソース使用量は[メトリクスAPI](/docs/tasks/debug-application-cluster/resource-metrics-pipeline/#the-metrics-api)から直接、もしくは監視ツールから取得できます。 + +## ローカルのエフェメラルストレージ + + +{{< feature-state for_k8s_version="v1.10" state="beta" >}} + +Nodeには、ローカルに接続された書き込み可能なデバイス、または場合によってはRAMによってサポートされるローカルのエフェメラルストレージがあります。 +"エフェメラル"とは、耐久性について長期的な保証がないことを意味します。 + +Podは、スクラッチ領域、キャッシュ、ログ用にエフェメラルなローカルストレージを使用しています。 +kubeletは、ローカルのエフェメラルストレージを使用して、Podにスクラッチ領域を提供し、[`emptyDir`](https://kubernetes.io/docs/concepts/storage/volumes/#emptydir) {{< glossary_tooltip term_id="volume" text="ボリューム" >}}をコンテナにマウントできます。 + +また、kubeletはこの種類のストレージを使用して、[Nodeレベルのコンテナログ](/docs/concepts/cluster-administration/logging/#logging-at-the-node-level)、コンテナイメージ、実行中のコンテナの書き込み可能なレイヤーを保持します。 + +{{< caution >}} +Nodeに障害が発生すると、そのエフェメラルストレージ内のデータが失われる可能性があります。 +アプリケーションは、ローカルのエフェメラルストレージにパフォーマンスのサービス品質保証(ディスクのIOPSなど)を期待することはできません。 +{{< /caution >}} + +ベータ版の機能として、Kubernetesでは、Podが消費するローカルのエフェメラルストレージの量を追跡、予約、制限することができます。 + +### ローカルエフェメラルストレージの設定 + +Kubernetesは、Node上のローカルエフェメラルストレージを構成する2つの方法をサポートしています。 +{{< tabs name="local_storage_configurations" >}} +{{% tab name="シングルファイルシステム" %}} +この構成では、さまざまな種類のローカルのエフェメラルデータ(`emptyDir`ボリュームや、書き込み可能なレイヤー、コンテナイメージ、ログなど)をすべて1つのファイルシステムに配置します。 +kubeletを構成する最も効果的な方法は、このファイルシステムをKubernetes(kubelet)データ専用にすることです。 + +kubeletは[Nodeレベルのコンテナログ](/docs/concepts/cluster-administration/logging/#logging-at-the-node-level)も書き込み、これらをエフェメラルなローカルストレージと同様に扱います。 + +kubeletは、設定されたログディレクトリ(デフォルトでは`/var/log`)内のファイルにログを書き出し、ローカルに保存された他のデータのベースディレクトリ(デフォルトでは`/var/lib/kubelet`)を持ちます。 + +通常、`/var/lib/kubelet`と`/var/log`はどちらもシステムルートファイルシステムにあり、kubeletはそのレイアウトを考慮して設計されています。 + +Nodeには、Kubernetesに使用されていない他のファイルシステムを好きなだけ持つことができます。 +{{% /tab %}} +{{% tab name="2ファイルシステム" %}} +Node上にファイルシステムがありますが、このファイルシステムは、ログや`emptyDir`ボリュームなど、実行中のPodの一時的なデータに使用されます。 +このファイルシステムは、例えばKubernetesに関連しないシステムログなどの他のデータに使用することができ、ルートファイルシステムとすることさえ可能です。 + +また、kubeletは[ノードレベルのコンテナログ](/docs/concepts/cluster-administration/logging/#logging-at-the-node-level)を最初のファイルシステムに書き込み、これらをエフェメラルなローカルストレージと同様に扱います。 + +また、別の論理ストレージデバイスでバックアップされた別のファイルシステムを使用することもできます。 +この設定では、コンテナイメージレイヤーと書き込み可能なレイヤーを配置するようにkubeletに指示するディレクトリは、この2番目のファイルシステム上にあります。 + +最初のファイルシステムは、コンテナイメージレイヤーや書き込み可能なレイヤーを保持していません。 + +Nodeには、Kubernetesに使用されていない他のファイルシステムを好きなだけ持つことができます。 +{{% /tab %}} +{{< /tabs >}} + +kubeletは、ローカルストレージの使用量を測定できます。 +これは、以下の条件で提供されます。 + +- `LocalStorageCapacityIsolation`[フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)が有効になっています。(デフォルトでオンになっています。) +- そして、ローカルのエフェメラルストレージ用にサポートされている構成の1つを使用してNodeをセットアップします。 + +別の構成を使用している場合、kubeletはローカルのエフェメラルストレージにリソース制限を適用しません。 + +{{< note >}} +kubeletは、`tmpfs`のemptyDirボリュームをローカルのエフェメラルストレージとしてではなく、コンテナメモリーとして追跡します。 +{{< /note >}} + +### ローカルのエフェメラルストレージの要求と制限設定 + +ローカルのエフェメラルストレージを管理するためには_ephemeral-storage_パラメーターを利用することができます。 +Podの各コンテナは、次の1つ以上を指定できます。 +* `spec.containers[].resources.limits.ephemeral-storage` +* `spec.containers[].resources.requests.ephemeral-storage` + +`ephemeral-storage`の制限と要求はバイト単位で記します。 +ストレージは、次のいずれかの接尾辞を使用して、通常の整数または固定小数点整数として表すことができます。 +E、P、T、G、M、K。Ei、Pi、Ti、Gi、Mi、Kiの2のべき乗を使用することもできます。 +たとえば、以下はほぼ同じ値を表しています。 + +```shell +128974848, 129e6, 129M, 123Mi +``` + +次の例では、Podに2つのコンテナがあります。 +各コンテナには、2GiBのローカルのエフェメラルストレージ要求があります。 +各コンテナには、4GiBのローカルのエフェメラルストレージ制限があります。 +したがって、Podには4GiBのローカルのエフェメラルストレージの要求と、8GiBのローカルのエフェメラルストレージ制限があります。 + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: frontend +spec: + containers: + - name: db + image: mysql + env: + - name: MYSQL_ROOT_PASSWORD + value: "password" + resources: + requests: + ephemeral-storage: "2Gi" + limits: + ephemeral-storage: "4Gi" + - name: wp + image: wordpress + resources: + requests: + ephemeral-storage: "2Gi" + limits: + ephemeral-storage: "4Gi" +``` + +### エフェメラルストレージを要求するPodのスケジュール方法 + +Podを作成すると、KubernetesスケジューラーはPodを実行するNodeを選択します。 +各Nodeには、Podに提供できるローカルのエフェメラルストレージの上限があります。 +詳細については、[Node割り当て可能](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable)を参照してください。 + +スケジューラーは、スケジュールされたコンテナのリソース要求の合計がNodeの容量より少なくなるようにします。 + +### エフェメラルストレージの消費管理 {#resource-emphemeralstorage-consumption} + +kubeletがローカルのエフェメラルストレージをリソースとして管理している場合、kubeletはストレージの使用量を測定します + +- _tmpfs_`emptyDir`ボリュームを除く`emptyDir`ボリューム +- Nodeレベルのログを保持するディレクトリ +- 書き込み可能なコンテナレイヤー + +Podが許可するよりも多くのエフェメラルストレージを使用している場合、kubeletはPodの排出をトリガーするシグナルを設定します。 + +コンテナレベルの分離の場合、コンテナの書き込み可能なレイヤーとログ使用量がストレージの制限を超えると、kubeletはPodに排出のマークを付けます。 +Podレベルの分離の場合、kubeletはPod内のコンテナの制限を合計し、Podの全体的なストレージ制限を計算します。 +このケースでは、すべてのコンテナからのローカルのエフェメラルストレージの使用量とPodの`emptyDir`ボリュームの合計がPod全体のストレージ制限を超過する場合、 +kubeletはPodをまた排出対象としてマークします。 + +{{< caution >}} +kubeletがローカルのエフェメラルストレージを測定していない場合、ローカルストレージの制限を超えるPodは、ローカルストレージのリソース制限に違反しても排出されません。 + +ただし、書き込み可能なコンテナレイヤー、Nodeレベルのログ、または`emptyDir`ボリュームのファイルシステムスペースが少なくなると、Nodeはローカルストレージが不足していると汚染{{< glossary_tooltip text="taints" term_id="taint" >}}し、この汚染は、汚染を特に許容しないPodの排出をトリガーします。 + +ローカルのエフェメラルストレージについては、サポートされている[設定](#configurations-for-local-ephemeral-storage)をご覧ください。 +{{< /caution >}} + +kubeletはPodストレージの使用状況を測定するさまざまな方法をサポートしています + +{{< tabs name="resource-emphemeralstorage-measurement" >}} +{{% tab name="定期スキャン" %}} +kubeletは、`emptyDir`ボリューム、コンテナログディレクトリ、書き込み可能なコンテナレイヤーをスキャンする定期的なスケジュールチェックを実行します。 + +スキャンは、使用されているスペースの量を測定します。 + +{{< note >}} +このモードでは、kubeletは削除されたファイルのために、開いているファイルディスクリプタを追跡しません。 + +あなた(またはコンテナ)が`emptyDir`ボリューム内にファイルを作成した後、何かがそのファイルを開き、そのファイルが開かれたままの状態でファイルを削除した場合、削除されたファイルのinodeはそのファイルを閉じるまで残りますが、kubeletはそのスペースを使用中として分類しません。 +{{< /note >}} +{{% /tab %}} +{{% tab name="ファイルシステムプロジェクトクォータ" %}} + +{{< feature-state for_k8s_version="v1.15" state="alpha" >}} + +プロジェクトクォータは、ファイルシステム上のストレージ使用量を管理するためのオペレーティングシステムレベルの機能です。 +Kubernetesでは、プロジェクトクォータを有効にしてストレージの使用状況を監視することができます。 +ノード上の`emptyDir`ボリュームをバックアップしているファイルシステムがプロジェクトクォータをサポートしていることを確認してください。 +例えば、XFSやext4fsはプロジェクトクォータを提供しています。 + +{{< note >}} +プロジェクトクォータはストレージの使用状況を監視しますが、制限を強制するものではありません。 +{{< /note >}} + +Kubernetesでは、`1048576`から始まるプロジェクトIDを使用します。 +使用するプロジェクトIDは`/etc/projects`と`/etc/projid`に登録されます。 +この範囲のプロジェクトIDをシステム上で別の目的で使用する場合は、それらのプロジェクトIDを`/etc/projects`と`/etc/projid`に登録し、 +Kubernetesが使用しないようにする必要があります。 + +クォータはディレクトリスキャンよりも高速で正確です。 +ディレクトリがプロジェクトに割り当てられると、ディレクトリ配下に作成されたファイルはすべてそのプロジェクト内に作成され、カーネルはそのプロジェクト内のファイルによって使用されているブロックの数を追跡するだけです。 +ファイルが作成されて削除されても、開いているファイルディスクリプタがあれば、スペースを消費し続けます。 +クォータトラッキングはそのスペースを正確に記録しますが、ディレクトリスキャンは削除されたファイルが使用するストレージを見落としてしまいます。 + +プロジェクトクォータを使用する場合は、次のことを行う必要があります。 + +* kubelet設定で、`LocalocalStorpactionCapactionIsolationFSQuotaMonitoring=true`[フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gate/)を有効にします。 + +* ルートファイルシステム(またはオプションのランタイムファイルシステム))がプロジェクトクォータを有効にしていることを確認してください。 + すべてのXFSファイルシステムはプロジェクトクォータをサポートしています。 + ext4ファイルシステムでは、ファイルシステムがマウントされていない間は、プロジェクトクォータ追跡機能を有効にする必要があります。 + ```bash + # ext4の場合、/dev/block-deviceがマウントされていません + sudo tune2fs -O project -Q prjquota /dev/block-device + ``` + +* ルートファイルシステム(またはオプションのランタイムファイルシステム)がプロジェクトクォータを有効にしてマウントされていることを確認してください。 + XFSとext4fsの両方で、マウントオプションは`prjquota`という名前になっています。 + +{{% /tab %}} +{{< /tabs >}} + +## 拡張リソース + +拡張リソースは`kubernetes.io`ドメインの外で完全に修飾されたリソース名です。 +これにより、クラスタオペレータはKubernetesに組み込まれていないリソースをアドバタイズし、ユーザはそれを利用することができるようになります。 + +拡張リソースを使用するためには、2つのステップが必要です。 +第一に、クラスタオペレーターは拡張リソースをアドバタイズする必要があります。 +第二に、ユーザーはPodで拡張リソースを要求する必要があります。 + +### 拡張リソースの管理 + +#### Nodeレベルの拡張リソース + +Nodeレベルの拡張リソースはNodeに関連付けられています。 + +##### デバイスプラグイン管理のリソース +各Nodeにデバイスプラグインで管理されているリソースをアドバタイズする方法については、[デバイスプラグイン](/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/)を参照してください。 + +##### その他のリソース +新しいNodeレベルの拡張リソースをアドバタイズするには、クラスタオペレータはAPIサーバに`PATCH`HTTPリクエストを送信し、クラスタ内のNodeの`status.capacity`に利用可能な量を指定します。 +この操作の後、ノードの`status.capacity`には新しいリソースが含まれます。 +`status.allocatable`フィールドは、kubeletによって非同期的に新しいリソースで自動的に更新されます。 +スケジューラはPodの適合性を評価する際にNodeの`status.allocatable`値を使用するため、Nodeの容量に新しいリソースを追加してから、そのNodeでリソースのスケジューリングを要求する最初のPodが現れるまでには、短い遅延が生じる可能性があることに注意してください。 + +**例:** + +以下は、`curl`を使用して、Masterが`k8s-master`であるNode`k8s-node-1`で5つの`example.com/foo`リソースを示すHTTPリクエストを作成する方法を示す例です。 + +```shell +curl --header "Content-Type: application/json-patch+json" \ +--request PATCH \ +--data '[{"op": "add", "path": "/status/capacity/example.com~1foo", "value": "5"}]' \ +http://k8s-master:8080/api/v1/nodes/k8s-node-1/status +``` + +{{< note >}} +上記のリクエストでは、`~1`はパッチパス内の文字`/`のエンコーディングです。 +JSON-Patchの操作パス値は、JSON-Pointerとして解釈されます。 +詳細については、[IETF RFC 6901, section 3](https://tools.ietf.org/html/rfc6901#section-3)を参照してください。 +{{< /note >}} + +#### クラスターレベルの拡張リソース + +クラスターレベルの拡張リソースはノードに関連付けられていません。 +これらは通常、リソース消費とリソースクォータを処理するスケジューラー拡張機能によって管理されます。 + +[スケジューラーポリシー構成](https://github.com/kubernetes/kubernetes/blob/release-1.10/pkg/scheduler/api/v1/types.go#L31)では。スケジューラー拡張機能によって扱われる拡張リソースを指定できます。 + +**例:** + +次のスケジューラーポリシーの構成は、クラスターレベルの拡張リソース"example.com/foo"がスケジューラー拡張機能によって処理されることを示しています。 + +- スケジューラーは、Podが"example.com/foo"を要求した場合にのみ、Podをスケジューラー拡張機能に送信します。 +- `ignoredByScheduler`フィールドは、スケジューラがその`PodFitsResources`述語で"example.com/foo"リソースをチェックしないことを指定します。 + +```json +{ + "kind": "Policy", + "apiVersion": "v1", + "extenders": [ + { + "urlPrefix":"", + "bindVerb": "bind", + "managedResources": [ + { + "name": "example.com/foo", + "ignoredByScheduler": true + } + ] + } + ] +} +``` + +### 拡張リソースの消費 + +ユーザーは、CPUやメモリのようにPodのスペックで拡張されたリソースを消費できます。 +利用可能な量以上のリソースが同時にPodに割り当てられないように、スケジューラーがリソースアカウンティングを行います。 + +APIサーバーは、拡張リソースの量を整数の値で制限します。 +有効な数量の例は、`3`、`3000m`、`3Ki`です。 +無効な数量の例は、`0.5`、`1500m`です。 + +{{< note >}} +拡張リソースは不透明な整数リソースを置き換えます。 +ユーザーは、予約済みの`kubernetes.io`以外のドメイン名プレフィックスを使用できます。 +{{< /note >}} + +Podで拡張リソースを消費するには、コンテナ名の`spec.containers[].resources.limits`マップにキーとしてリソース名を含めます。 + +{{< note >}} +拡張リソースはオーバーコミットできないので、コンテナスペックに要求と制限の両方が存在する場合は等しくなければなりません。 +{{< /note >}} + +Podは、CPU、メモリ、拡張リソースを含むすべてのリソース要求が満たされた場合にのみスケジュールされます。 +リソース要求が満たされない限り、Podは`PENDING`状態のままです。 + +**例:** + +下のPodはCPUを2つ、"example.com/foo"(拡張リソース)を1つ要求しています。 + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: my-pod +spec: + containers: + - name: my-container + image: myimage + resources: + requests: + cpu: 2 + example.com/foo: 1 + limits: + example.com/foo: 1 +``` + +## トラブルシューティング + +### failedSchedulingイベントメッセージが表示され、Podが保留中になる + +スケジューラーがPodが収容されるNodeを見つけられない場合、場所が見つかるまでPodはスケジュールされないままになります。 +スケジューラーがPodの場所を見つけられないたびに、次のようなイベントが生成されます。 + +```shell +kubectl describe pod frontend | grep -A 3 Events +``` +``` +Events: + FirstSeen LastSeen Count From Subobject PathReason Message + 36s 5s 6 {scheduler } FailedScheduling Failed for reason PodExceedsFreeCPU and possibly others +``` + +前述の例では、"frontend"という名前のPodは、Node上のCPUリソースが不足しているためにスケジューリングに失敗しています。 +同様のエラーメッセージは、メモリー不足による失敗を示唆することもあります(PodExceedsFreeMemory)。 +一般的に、このタイプのメッセージでPodが保留されている場合は、いくつか試すべきことがあります。 + +- クラスタにNodeを追加します。 +- 不要なポッドを終了して、保留中のPodのためのスペースを空けます。 +- PodがすべてのNodeよりも大きくないことを確認してください。 + 例えば、すべてのNodeが`cpu: 1`の容量を持っている場合、`cpu: 1.1`を要求するPodは決してスケジューリングされません。 + +Nodeの容量や割り当て量は`kubectl describe nodes`コマンドで調べることができる。 +例えば、以下のようになる。 + +```shell +kubectl describe nodes e2e-test-node-pool-4lw4 +``` +``` +Name: e2e-test-node-pool-4lw4 +[ ... lines removed for clarity ...] +Capacity: + cpu: 2 + memory: 7679792Ki + pods: 110 +Allocatable: + cpu: 1800m + memory: 7474992Ki + pods: 110 +[ ... lines removed for clarity ...] +Non-terminated Pods: (5 in total) + Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits + --------- ---- ------------ ---------- --------------- ------------- + kube-system fluentd-gcp-v1.38-28bv1 100m (5%) 0 (0%) 200Mi (2%) 200Mi (2%) + kube-system kube-dns-3297075139-61lj3 260m (13%) 0 (0%) 100Mi (1%) 170Mi (2%) + kube-system kube-proxy-e2e-test-... 100m (5%) 0 (0%) 0 (0%) 0 (0%) + kube-system monitoring-influxdb-grafana-v4-z1m12 200m (10%) 200m (10%) 600Mi (8%) 600Mi (8%) + kube-system node-problem-detector-v0.1-fj7m3 20m (1%) 200m (10%) 20Mi (0%) 100Mi (1%) +Allocated resources: + (Total limits may be over 100 percent, i.e., overcommitted.) + CPU Requests CPU Limits Memory Requests Memory Limits + ------------ ---------- --------------- ------------- + 680m (34%) 400m (20%) 920Mi (12%) 1070Mi (14%) +``` + +前述の出力では、Podが1120m以上のCPUや6.23Gi以上のメモリーを要求した場合、そのPodはNodeに収まらないことがわかります。 + +`Pods`セクションを見れば、どのPodがNode上でスペースを占有しているかがわかります。 + +システムデーモンが利用可能なリソースの一部を使用しているため、Podに利用可能なリソースの量はNodeの容量よりも少なくなっています。 +`allocatable`フィールド[NodeStatus](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#nodestatus-v1-core)は、Podに利用可能なリソースの量を与えます。 +詳細については、[ノード割り当て可能なリソース](https://git.k8s.io/community/contributors/design-proposals/node/node-allocatable.md)を参照してください。 + +[リソースクォータ](/docs/concepts/policy/resource-quotas/)機能は、消費できるリソースの総量を制限するように設定することができます。 +名前空間と組み合わせて使用すると、1つのチームがすべてのリソースを占有するのを防ぐことができます。 + +### コンテナが終了した + +コンテナはリソース不足のため、終了する可能性があります。 +コンテナがリソース制限に達したために強制終了されているかどうかを確認するには、対象のPodで`kubectl describe pod`を呼び出します。 + +```shell +kubectl describe pod simmemleak-hra99 +``` +``` +Name: simmemleak-hra99 +Namespace: default +Image(s): saadali/simmemleak +Node: kubernetes-node-tf0f/10.240.216.66 +Labels: name=simmemleak +Status: Running +Reason: +Message: +IP: 10.244.2.75 +Replication Controllers: simmemleak (1/1 replicas created) +Containers: + simmemleak: + Image: saadali/simmemleak + Limits: + cpu: 100m + memory: 50Mi + State: Running + Started: Tue, 07 Jul 2015 12:54:41 -0700 + Last Termination State: Terminated + Exit Code: 1 + Started: Fri, 07 Jul 2015 12:54:30 -0700 + Finished: Fri, 07 Jul 2015 12:54:33 -0700 + Ready: False + Restart Count: 5 +Conditions: + Type Status + Ready False +Events: + FirstSeen LastSeen Count From SubobjectPath Reason Message + Tue, 07 Jul 2015 12:53:51 -0700 Tue, 07 Jul 2015 12:53:51 -0700 1 {scheduler } scheduled Successfully assigned simmemleak-hra99 to kubernetes-node-tf0f + Tue, 07 Jul 2015 12:53:51 -0700 Tue, 07 Jul 2015 12:53:51 -0700 1 {kubelet kubernetes-node-tf0f} implicitly required container POD pulled Pod container image "k8s.gcr.io/pause:0.8.0" already present on machine + Tue, 07 Jul 2015 12:53:51 -0700 Tue, 07 Jul 2015 12:53:51 -0700 1 {kubelet kubernetes-node-tf0f} implicitly required container POD created Created with docker id 6a41280f516d + Tue, 07 Jul 2015 12:53:51 -0700 Tue, 07 Jul 2015 12:53:51 -0700 1 {kubelet kubernetes-node-tf0f} implicitly required container POD started Started with docker id 6a41280f516d + Tue, 07 Jul 2015 12:53:51 -0700 Tue, 07 Jul 2015 12:53:51 -0700 1 {kubelet kubernetes-node-tf0f} spec.containers{simmemleak} created Created with docker id 87348f12526a +``` + +上記の例では、`Restart Count:5`はPodの`simmemleak`コンテナが終了して、5回再起動したことを示しています。 + +`-o go-template=...`オプションを指定して、`kubectl get pod`を呼び出し、以前に終了したコンテナのステータスを取得できます。 + +```shell +kubectl get pod -o go-template='{{range.status.containerStatuses}}{{"Container Name: "}}{{.name}}{{"\r\nLastState: "}}{{.lastState}}{{end}}' simmemleak-hra99 +``` +``` +Container Name: simmemleak +LastState: map[terminated:map[exitCode:137 reason:OOM Killed startedAt:2015-07-07T20:58:43Z finishedAt:2015-07-07T20:58:43Z containerID:docker://0e4095bba1feccdfe7ef9fb6ebffe972b4b14285d5acdec6f0d3ae8a22fad8b2]] +``` + +`reason:OOM Killed`が原因でコンテナが終了したことがわかります。`OOM`はメモリー不足を表します。 + + +## {{% heading "whatsnext" %}} + +* [コンテナとPodへのメモリーリソースの割り当て](/docs/tasks/configure-pod-container/assign-memory-resource/)ハンズオンを行う + +* [コンテナとPodへのCPUリソースの割り当て](/docs/tasks/configure-pod-container/assign-cpu-resource/)ハンズオンを行う + +* 要求と制限の違いの詳細については、[リソースQoS](https://git.k8s.io/community/contributors/design-proposals/node/resource-qos.md)を参照する + +* [コンテナ](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#container-v1-core)APIリファレンスを読む + +* [リソース要求](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#resourcerequirements-v1-core)APIリファレンスを読む + +* XFSの[プロジェクトクォータ](http://xfs.org/docs/xfsdocs-xml-dev/XFS_User_Guide/tmp/en-US/html/xfs-quotas.html)について読む diff --git a/content/ja/docs/concepts/configuration/overview.md b/content/ja/docs/concepts/configuration/overview.md index 791582e11b..2a5dfc4a51 100644 --- a/content/ja/docs/concepts/configuration/overview.md +++ b/content/ja/docs/concepts/configuration/overview.md @@ -27,11 +27,11 @@ weight: 10 - よりよいイントロスペクションのために、オブジェクトの説明をアノテーションに入れましょう。 -## "真っ裸"のPod に対する ReplicaSet、Deployment、およびJob +## "真っ裸"のPod に対する ReplicaSet、Deployment、およびJob {#naked-pods-vs-replicasets-deployments-and-jobs} - 可能な限り、"真っ裸"のPod([ReplicaSet](/ja/docs/concepts/workloads/controllers/replicaset/)や[Deployment](/ja/docs/concepts/workloads/controllers/deployment/)にバインドされていないPod)は使わないでください。Nodeに障害が発生した場合、これらのPodは再スケジュールされません。 - 明示的に[`restartPolicy: Never`](/ja/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy)を使いたいシーンを除いて、DeploymentはPodを直接作成するよりもほとんど常に望ましい方法です。Deploymentには、希望する数のPodが常に使用可能であることを確認するためにReplicaSetを作成したり、Podを置き換えるための戦略(RollingUpdateなど)を指定したりできます。[Job](/docs/concepts/workloads/controllers/jobs-run-to-completion/)のほうが適切な場合もあるかもしれません。 + 明示的に[`restartPolicy: Never`](/ja/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy)を使いたいシーンを除いて、DeploymentはPodを直接作成するよりもほとんど常に望ましい方法です。Deploymentには、希望する数のPodが常に使用可能であることを確認するためにReplicaSetを作成したり、Podを置き換えるための戦略(RollingUpdateなど)を指定したりできます。[Job](/docs/concepts/workloads/controllers/jobs-run-to-completion/)のほうが適切な場合もあるかもしれません。 ## Service @@ -81,7 +81,7 @@ weight: 10 - `imagePullPolicy: Never`: 常にローカルでイメージを探そうとします。ない場合にもイメージはpullしません。 {{< note >}} -コンテナが常に同じバージョンのイメージを使用するようにするためには、そのコンテナイメージの[ダイジェスト](https://docs.docker.com/engine/reference/commandline/pull/#pull-an-image-by-digest-immutable-identifier)を指定することができます(例:`sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2`)。このダイジェストはイメージの特定のバージョンを一意に識別するため、ダイジェスト値を変更しない限り、Kubernetesによって更新されることはありません。 +コンテナが常に同じバージョンのイメージを使用するようにするためには、そのコンテナイメージの[ダイジェスト](https://docs.docker.com/engine/reference/commandline/pull/#pull-an-image-by-digest-immutable-identifier)を指定することができます。`:`を`@`で置き換えます(例:`image@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2`)。このダイジェストはイメージの特定のバージョンを一意に識別するため、ダイジェスト値を変更しない限り、Kubernetesによって更新されることはありません。 {{< /note >}} {{< note >}} @@ -89,7 +89,7 @@ weight: 10 {{< /note >}} {{< note >}} -ベースイメージのプロバイダーのキャッシュセマンティクスにより、`imagePullPolicy:Always`もより効率的になります。たとえば、Dockerでは、イメージが既に存在する場合すべてのイメージレイヤーがキャッシュされ、イメージのダウンロードが不要であるため、pullが高速になります。 +ベースイメージのプロバイダーのキャッシュセマンティクスにより、`imagePullPolicy:Always`もより効率的になります。たとえば、Dockerでは、イメージがすでに存在する場合すべてのイメージレイヤーがキャッシュされ、イメージのダウンロードが不要であるため、pullが高速になります。 {{< /note >}} ## kubectlの使い方 diff --git a/content/ja/docs/concepts/containers/container-lifecycle-hooks.md b/content/ja/docs/concepts/containers/container-lifecycle-hooks.md index 627c95b4c0..13ad6f2578 100644 --- a/content/ja/docs/concepts/containers/container-lifecycle-hooks.md +++ b/content/ja/docs/concepts/containers/container-lifecycle-hooks.md @@ -30,7 +30,7 @@ Angularなどのコンポーネントライフサイクルフックを持つ多 `PreStop` -このフックは、liveness probeの失敗、プリエンプション、リソース競合などのAPI要求または管理イベントが原因でコンテナが終了する直前に呼び出されます。コンテナが既に終了状態または完了状態にある場合、preStopフックの呼び出しは失敗します。 +このフックは、liveness probeの失敗、プリエンプション、リソース競合などのAPI要求または管理イベントが原因でコンテナが終了する直前に呼び出されます。コンテナがすでに終了状態または完了状態にある場合、preStopフックの呼び出しは失敗します。 これはブロッキング、つまり同期的であるため、コンテナを削除するための呼び出しを送信する前に完了する必要があります。 ハンドラーにパラメーターは渡されません。 @@ -80,7 +80,7 @@ Angularなどのコンポーネントライフサイクルフックを持つ多 ``` Events: - FirstSeen LastSeen Count From SubobjectPath Type Reason Message + FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 1m 1m 1 {default-scheduler } Normal Scheduled Successfully assigned test-1730497541-cq1d2 to gke-test-cluster-default-pool-a07e5d30-siqd 1m 1m 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Pulling pulling image "test:1.0" diff --git a/content/ja/docs/concepts/containers/runtime-class.md b/content/ja/docs/concepts/containers/runtime-class.md index 6ea1f1e4e1..bd6cc59c49 100644 --- a/content/ja/docs/concepts/containers/runtime-class.md +++ b/content/ja/docs/concepts/containers/runtime-class.md @@ -26,11 +26,10 @@ RuntimeClassはコンテナランタイムの設定を選択するための機 ### セットアップ -RuntimeClass機能のFeature Gateが有効になっていることを確認してください(デフォルトで有効です)。Feature Gateを有効にする方法については、[Feature -Gates](/docs/reference/command-line-tools-reference/feature-gates/)を参照してください。 -その`RuntimeClass`のFeature GateはApiServerとkubeletのどちらも有効になっていなければなりません。 +RuntimeClass機能のフィーチャーゲートが有効になっていることを確認してください(デフォルトで有効です)。フィーチャーゲートを有効にする方法については、[フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)を参照してください。 +その`RuntimeClass`のフィーチャーゲートはApiServerとkubeletのどちらも有効になっていなければなりません。 -1. ノード上でCRI実装を設定する。(ランタイムに依存) +1. ノード上でCRI実装を設定する。(ランタイムに依存) 2. 対応するRuntimeClassリソースを作成する。 #### 1. ノード上でCRI実装を設定する。 @@ -39,8 +38,8 @@ RuntimeClassを通じて利用可能な設定はContainer Runtime Interface (CRI ユーザーの環境のCRI実装の設定方法は、対応するドキュメント([下記](#cri-configuration))を参照ください。 {{< note >}} -RuntimeClassは現時点において、クラスター全体で同じ種類のNode設定であることを仮定しています。(これは全てのNodeがコンテナランタイムに関して同じ方法で構成されていることを意味します)。 -設定が異なるNodeに関しては、スケジューリング機能を通じてRuntimeClassとは独立して管理されなくてはなりません。([PodをNodeに割り当てる方法](/ja/docs/concepts/configuration/assign-pod-node/)を参照して下さい)。 +RuntimeClassは、クラスター全体で同じ種類のノード設定であることを仮定しています。(これは全てのノードがコンテナランタイムに関して同じ方法で構成されていることを意味します)。 +設定が異なるノードをサポートするには、[スケジューリング](#scheduling)を参照してください。 {{< /note >}} RuntimeClassの設定は、RuntimeClassによって参照される`ハンドラー`名を持ちます。そのハンドラーは正式なDNS-1123に準拠する形式のラベルでなくてはなりません(英数字 + `-`の文字で構成されます)。 @@ -60,6 +59,9 @@ metadata: handler: myconfiguration # 対応するCRI設定 ``` +RuntimeClassオブジェクトの名前は[DNSサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)に従う必要があります。 + + {{< note >}} RuntimeClassの書き込み操作(create/update/patch/delete)はクラスター管理者のみに制限されることを推奨します。 これはたいていデフォルトで有効となっています。さらなる詳細に関しては[Authorization @@ -94,7 +96,7 @@ CRIランタイムのセットアップに関するさらなる詳細は、[CRI Kubernetesのビルトインのdockershim CRIは、ランタイムハンドラーをサポートしていません。 -#### [containerd](https://containerd.io/) +#### {{< glossary_tooltip term_id="containerd" >}} ランタイムハンドラーは、`/etc/containerd/config.toml`にあるcontainerdの設定ファイルにより設定されます。 正しいハンドラーは、その`runtime`セクションで設定されます。 @@ -106,20 +108,49 @@ Kubernetesのビルトインのdockershim CRIは、ランタイムハンドラ containerdの設定に関する詳細なドキュメントは下記を参照してください。 https://github.com/containerd/cri/blob/master/docs/config.md -#### [cri-o](https://cri-o.io/) +#### {{< glossary_tooltip term_id="cri-o" >}} -ランタイムハンドラーは、`/etc/crio/crio.conf`にあるcri-oの設定ファイルにより設定されます。 +ランタイムハンドラーは、`/etc/crio/crio.conf`にあるCRI-Oの設定ファイルにより設定されます。 正しいハンドラーは[crio.runtime -table](https://github.com/kubernetes-sigs/cri-o/blob/master/docs/crio.conf.5.md#crioruntime-table)で設定されます。 +table](https://github.com/cri-o/cri-o/blob/master/docs/crio.conf.5.md#crioruntime-table)で設定されます。 ``` [crio.runtime.runtimes.${HANDLER_NAME}] runtime_path = "${PATH_TO_BINARY}" ``` -cri-oの設定に関する詳細なドキュメントは下記を参照してください。 -https://github.com/kubernetes-sigs/cri-o/blob/master/cmd/crio/config.go +CRI-Oの[設定に関するドキュメント][100]の詳細は下記を参照してください。 +[100]: https://raw.githubusercontent.com/cri-o/cri-o/9f11d1d/docs/crio.conf.5.md + +### スケジューリング {#scheduling} + +{{< feature-state for_k8s_version="v1.16" state="beta" >}} + +Kubernetes 1.16では、RuntimeClassは`scheduling`フィールドを使ったクラスター内での異なる設定をサポートしています。 +このフィールドによって、設定されたRuntimeClassをサポートするノードに対してPodがスケジュールされることを保証できます。 +スケジューリングをサポートするためにはRuntimeClass [アドミッションコントローラー][]を有効にしなければなりません。(1.16ではデフォルトです) + +特定のRuntimeClassをサポートしているノードへPodが配置されることを保証するために、各ノードは`runtimeclass.scheduling.nodeSelector`フィールドによって選択される共通のラベルを持つべきです。 +RuntimeClassのnodeSelectorはアドミッション機能によりPodのnodeSelectorに統合され、効率よくノードを選択します。 +もし設定が衝突した場合は、Pod作成は拒否されるでしょう。 + +もしサポートされているノードが他のRuntimeClassのPodが稼働しないようにtaint付与されていた場合、RuntimeClassに対して`tolerations`を付与することができます。 +`nodeSelector`と同様に、tolerationsはPodのtolerationsにアドミッション機能によって統合され、効率よく許容されたノードを選択します。 + +ノードの選択とtolerationsについての詳細は[ノード上へのPodのスケジューリング](/ja/docs/concepts/configuration/assign-pod-node/)を参照してください。 + +[アドミッションコントローラー]: /docs/reference/access-authn-authz/admission-controllers/ + +### Podオーバーヘッド + +{{< feature-state for_k8s_version="v1.16" state="alpha" >}} + +Kubernetes 1.16ではRuntimeClassは[`PodOverhead`](/docs/concepts/configuration/pod-overhead/)機能の一部である、Podが稼働する時に関連するオーバーヘッドを指定することをサポートしています。 +`PodOverhead`を使うためには、PodOverhead[フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)を有効にしなければなりません。(デフォルトではoffです) + +PodのオーバーヘッドはRuntimeClass内の`Overhead`フィールドによって定義されます。 +このフィールドを使用することで、RuntimeClassを使用して稼働するPodのオーバーヘッドを指定することができ、Kubernetes内部で使用されるオーバーヘッドを確保することができます。 ### RutimeClassをα版からβ版にアップグレードする @@ -140,3 +171,9 @@ RuntimeClassのβ版の機能は、下記の変更点を含みます。 - `runtimeHandler`の指定がないか、もしくは空文字の場合や、ハンドラー名に`.`文字列が使われている場合はα版のRuntimeClassにおいてもはや有効ではありません。正しい形式のハンドラー設定に変更しなくてはなりません(先ほど記載した内容を確認ください)。 +### 参考文献 + +- [RuntimeClassデザイン](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/runtime-class.md) +- [RuntimeClassスケジューリングデザイン](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/runtime-class-scheduling.md) +- [Podオーバーヘッド](/docs/concepts/configuration/pod-overhead/)のコンセプトを読む +- [PodOverhead機能デザイン](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20190226-pod-overhead.md) diff --git a/content/ja/docs/concepts/extend-kubernetes/api-extension/custom-resources.md b/content/ja/docs/concepts/extend-kubernetes/api-extension/custom-resources.md index 41f96a20ce..c05b35cdbc 100644 --- a/content/ja/docs/concepts/extend-kubernetes/api-extension/custom-resources.md +++ b/content/ja/docs/concepts/extend-kubernetes/api-extension/custom-resources.md @@ -1,7 +1,7 @@ --- title: カスタムリソース content_type: concept -weight: 20 +weight: 10 --- @@ -24,7 +24,7 @@ weight: 20 カスタムリソースそれ自身は、単純に構造化データを格納、取り出す機能を提供します。カスタムリソースを *カスタムコントローラー* と組み合わせることで、カスタムリソースは真の _宣言的API_ を提供します。 -[宣言的API](/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/#kubernetesオブジェクトを理解する)は、リソースのあるべき状態を _宣言_ または指定することを可能にし、Kubernetesオブジェクトの現在の状態を、あるべき状態に同期し続けるように動きます。 +[宣言的API](/ja/docs/concepts/overview/kubernetes-api/)は、リソースのあるべき状態を _宣言_ または指定することを可能にし、Kubernetesオブジェクトの現在の状態を、あるべき状態に同期し続けるように動きます。 コントローラーは、構造化データをユーザーが指定したあるべき状態と解釈し、その状態を管理し続けます。 稼働しているクラスターのライフサイクルとは無関係に、カスタムコントローラーをデプロイ、更新することが可能です。カスタムコントローラーはあらゆるリソースと連携できますが、カスタムリソースと組み合わせると特に効果を発揮します。[オペレーターパターン](https://coreos.com/blog/introducing-operators.html)は、カスタムリソースとカスタムコントローラーの組み合わせです。カスタムコントローラーにより、特定アプリケーションのドメイン知識を、Kubernetes APIの拡張に変換することができます。 @@ -67,7 +67,7 @@ APIが宣言的ではない兆候として、次のものがあります: - APIをオブジェクトとして簡単に表現できない - 停止している処理を処理ID、もしくは処理オブジェクトで表現することを選択している -## ConfigMapとカスタムリソースのどちらを使うべきか? +## ConfigMapとカスタムリソースのどちらを使うべきか? 下記のいずれかに該当する場合は、ConfigMapを使ってください: @@ -99,7 +99,7 @@ Kubernetesは、クラスターへカスタムリソースを追加する2つの Kubernetesは、さまざまなユーザーのニーズを満たすためにこれら2つのオプションを提供しており、使いやすさや柔軟性が損なわれることはありません。 -アグリゲートAPIは、プロキシーとして機能するプライマリAPIサーバーの背後にある、下位のAPIServerです。このような配置は[APIアグリゲーション](/ja/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/) (AA)と呼ばれています。ユーザーにとっては、単にAPIサーバーが拡張されているように見えます。 +アグリゲートAPIは、プロキシーとして機能するプライマリAPIサーバーの背後にある、下位のAPIServerです。このような配置は[APIアグリゲーション](/ja/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/)(AA)と呼ばれています。ユーザーにとっては、単にAPIサーバーが拡張されているように見えます。 CRDでは、APIサーバーの追加なしに、ユーザーが新しい種類のリソースを作成できます。CRDを使うには、APIアグリゲーションを理解する必要はありません。 @@ -108,6 +108,7 @@ CRDでは、APIサーバーの追加なしに、ユーザーが新しい種類 ## CustomResourceDefinition [CustomResourceDefinition](/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/)APIリソースは、カスタムリソースを定義します。CRDオブジェクトを定義することで、指定した名前、スキーマで新しいカスタムリソースが作成されます。Kubernetes APIは、作成したカスタムリソースのストレージを提供、および処理します。 +CRDオブジェクトの名前は[DNSサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names/#dns-subdomain-names)に従わなければなりません。 これはカスタムリソースを処理するために、独自のAPIサーバーを書くことから解放してくれますが、一般的な性質として[APIサーバーアグリゲーション](#APIサーバーアグリゲーション)と比べると、柔軟性に欠けます。 @@ -115,7 +116,7 @@ CRDでは、APIサーバーの追加なしに、ユーザーが新しい種類 ## APIサーバーアグリゲーション -通常、Kubernetes APIの各リソースは、RESTリクエストとオブジェクトの永続的なストレージを管理するためのコードが必要です。メインのKubernetes APIサーバーは *Pod* や *Service* のようなビルトインのリソースを処理し、また[CRD](#customresourcedefinition)を通じて、同じ方法でカスタムリソースも管理できます。 +通常、Kubernetes APIの各リソースは、RESTリクエストとオブジェクトの永続的なストレージを管理するためのコードが必要です。メインのKubernetes APIサーバーは *Pod* や *Service* のようなビルトインのリソースを処理し、またカスタムリソースも[CRD](#customresourcedefinition)を通じて同じように管理することができます。 [アグリゲーションレイヤー](/ja/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/)は、独自のスタンドアローンAPIサーバーを書き、デプロイすることで、カスタムリソースに特化した実装の提供を可能にします。メインのAPIサーバーが、処理したいカスタムリソースへのリクエストを委譲することで、他のクライアントからも利用できるようにします。 @@ -134,7 +135,7 @@ CRDは、アグリゲートAPIと比べ、簡単に作れます。 | CRD | アグリゲートAPI | | -------------------------- | --------------- | -| プログラミングが不要で、ユーザーはCRDコントローラーとしてどの言語でも選択可能 | Go言語でプログラミングし、バイナリとイメージの作成が必要。ユーザーはCRDコントローラーとしてどの言語でも選択可能 | +| プログラミングが不要で、ユーザーはCRDコントローラーとしてどの言語でも選択可能 | Go言語でプログラミングし、バイナリとイメージの作成が必要 | | 追加のサービスは不要。カスタムリソースはAPIサーバーで処理される | 追加のサービス作成が必要で、障害が発生する可能性がある | | CRDが作成されると、継続的なサポートは無い。バグ修正は通常のKubernetesマスターのアップグレードで行われる | 定期的にアップストリームからバグ修正の取り込み、リビルド、そしてアグリゲートAPIサーバーの更新が必要かもしれない | | 複数バージョンのAPI管理は不要。例えば、あるリソースを操作するクライアントを管理していた場合、APIのアップグレードと一緒に更新される | 複数バージョンのAPIを管理しなければならない。例えば、世界中に共有されている拡張機能を開発している場合 | @@ -146,16 +147,16 @@ CRDは、アグリゲートAPIと比べ、簡単に作れます。 | 機能 | 詳細 | CRD | アグリゲートAPI | | ---- | ---- | --- | --------------- | | バリデーション | エラーを予防し、クライアントと無関係にAPIを発達させることができるようになる。これらの機能は多数のクライアントがおり、同時に全てを更新できないときに最も効果を発揮する | はい、ほとんどのバリデーションは[OpenAPI v3.0 validation](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#validation)で、CRDに指定できる。その他のバリデーションは[Webhookのバリデーション](/docs/reference/access-authn-authz/admission-controllers/#validatingadmissionwebhook-alpha-in-1-8-beta-in-1-9)によりサポートされている | はい、任意のバリデーションが可能 | -| デフォルト設定 | 上記を参照 | はい、[OpenAPI v3.0 validation](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#defaulting)の`default`キーワード(1.16でベータ)、または[Mutating Webhook](/docs/reference/access-authn-authz/admission-controllers/#mutatingadmissionwebhook-beta-in-1-9)を通じて可能 | はい | +| デフォルト設定 | 上記を参照 | はい、[OpenAPI v3.0 validation](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#defaulting)の`default`キーワード(1.17でGA)、または[Mutating Webhook](/docs/reference/access-authn-authz/admission-controllers/#mutatingadmissionwebhook)を通じて可能 (ただし、この方法は古いオブジェクトをetcdから読み込む場合には動きません) | はい | | 複数バージョニング | 同じオブジェクトを、違うAPIバージョンで利用可能にする。フィールドの名前を変更するなどのAPIの変更を簡単に行うのに役立つ。クライアントのバージョンを管理する場合、重要性は下がる | [はい](/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definition-versioning) | はい | | カスタムストレージ | 異なる性能のストレージが必要な場合(例えば、キーバリューストアの代わりに時系列データベース)または、セキュリティの分離(例えば、機密情報の暗号化、その他)| いいえ | はい | | カスタムビジネスロジック | オブジェクトが作成、読み込み、更新、また削除されるときに任意のチェック、アクションを実行する| はい、[Webhooks](/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks)を利用 | はい | | サブリソースのスケール | HorizontalPodAutoscalerやPodDisruptionBudgetなどのシステムが、新しいリソースと連携できるようにする | [はい](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#scale-subresource) | はい | -| サブリソースの状態 |
  • より詳細なアクセスコントロール: ユーザーがspecセクションに書き込み、コントローラーがstatusセクションに書き込む
  • カスタムリソースのデータ変換時にオブジェクトの世代を上げられるようにする(リソースがspecと、statusでセクションが分離している必要がある)
| [はい](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#status-subresource) | はい | +| サブリソースの状態 | ユーザーがspecセクションに書き込み、コントローラーがstatusセクションに書き込む際に、より詳細なアクセスコントロールができるようにする。カスタムリソースのデータ変換時にオブジェクトの世代を上げられるようにする(リソース内のspecとstatusでセクションが分離している必要がある) | [はい](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#status-subresource) | はい | | その他のサブリソース | "logs"や"exec"のような、CRUD以外の処理の追加 | いいえ | はい | | strategic-merge-patch |`Content-Type: application/strategic-merge-patch+json`で、PATCHをサポートする新しいエンドポイント。ローカル、サーバー、どちらでも更新されうるオブジェクトに有用。さらなる情報は["APIオブジェクトをkubectl patchで決まった場所で更新"](/docs/tasks/run-application/update-api-object-kubectl-patch/)を参照 | いいえ | はい | | プロトコルバッファ | プロトコルバッファを使用するクライアントをサポートする新しいリソース | いいえ | はい | -| OpenAPIスキーマ | サーバーから動的に取得できる型のOpenAPI(スワッガー)スキーマはあるか、許可されたフィールドのみが設定されるようにすることで、ユーザーはフィールド名のスペルミスから保護されているか、型は強制されているか(言い換えると、「文字列」フィールドに「int」を入れさせない) | はい、[OpenAPI v3.0 validation](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#validation) スキーマがベース(1.16でGA) | はい | +| OpenAPIスキーマ | サーバーから動的に取得できる型のOpenAPI(Swagger)スキーマはあるか、許可されたフィールドのみが設定されるようにすることで、ユーザーはフィールド名のスペルミスから保護されているか、型は強制されているか(言い換えると、「文字列」フィールドに「int」を入れさせない) | はい、[OpenAPI v3.0 validation](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#validation) スキーマがベース(1.16でGA) | はい | ### 一般的な機能 @@ -174,7 +175,7 @@ CRD、またはアグリゲートAPI、どちらを使ってカスタムリソ | ファイナライザー | 外部リソースの削除が終わるまで、拡張リソースの削除をブロック | | Admission Webhooks | 拡張リソースの作成/更新/削除処理時に、デフォルト値の設定、バリデーションを実施 | | UI/CLI 表示 | kubectl、ダッシュボードで拡張リソースを表示 | -| 未設定 vs 空設定 | クライアントは、フィールドの未設定とゼロ値を区別することができる | +| 未設定 対 空設定 | クライアントは、フィールドの未設定とゼロ値を区別することができる | | クライアントライブラリーの生成 | Kubernetesは、一般的なクライアントライブラリーと、タイプ固有のクライアントライブラリーを生成するツールを提供 | | ラベルとアノテーション | ツールがコアリソースとカスタムリソースの編集方法を知っているオブジェクト間で、共通のメタデータを提供 | @@ -184,7 +185,7 @@ CRD、またはアグリゲートAPI、どちらを使ってカスタムリソ ### サードパーティのコードと新しい障害点 -CRDを作成しても、勝手に新しい障害点が追加されてしまうことはありませんが(たとえば、サードパーティのコードをAPIサーバーで実行することによって)、パッケージ(たとえば、チャート)またはその他のインストールバンドルには、多くの場合、CRDと新しいカスタムリソースのビジネスロジックを実装するサードパーティコードが入ったDeploymentが含まれます。 +CRDを作成しても、勝手に新しい障害点が追加されてしまうことはありませんが(たとえば、サードパーティのコードをAPIサーバーで実行することによって)、パッケージ(たとえば、Chart)またはその他のインストールバンドルには、多くの場合、CRDと新しいカスタムリソースのビジネスロジックを実装するサードパーティコードが入ったDeploymentが含まれます。 アグリゲートAPIサーバーのインストールすると、常に新しいDeploymentが付いてきます。 @@ -220,5 +221,3 @@ Kubernetesの[クライアントライブラリー](/docs/reference/using-api/cl * [Kubernetes APIをアグリゲーションレイヤーで拡張する方法](/ja/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/)について学ぶ * [Kubernetes APIをCustomResourceDefinitionで拡張する方法](/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/)について学ぶ - - diff --git a/content/ja/docs/concepts/extend-kubernetes/extend-cluster.md b/content/ja/docs/concepts/extend-kubernetes/extend-cluster.md index dad9190345..a1a1af7c6b 100644 --- a/content/ja/docs/concepts/extend-kubernetes/extend-cluster.md +++ b/content/ja/docs/concepts/extend-kubernetes/extend-cluster.md @@ -32,7 +32,7 @@ Kubernetesは柔軟な設定が可能で、高い拡張性を持っています ホスティングされたKubernetesサービスやマネージドなKubernetesでは、フラグと設定ファイルが常に変更できるとは限りません。変更可能な場合でも、通常はクラスターの管理者のみが変更できます。また、それらは将来のKubernetesバージョンで変更される可能性があり、設定変更にはプロセスの再起動が必要になるかもしれません。これらの理由により、この方法は他の選択肢が無いときにのみ利用するべきです。 -[ResourceQuota](/docs/concepts/policy/resource-quotas/)、[PodSecurityPolicy](/docs/concepts/policy/pod-security-policy/)、[NetworkPolicy](/docs/concepts/services-networking/network-policies/)、そしてロールベースアクセス制御([RBAC](/docs/reference/access-authn-authz/rbac/))といった *ビルトインポリシーAPI* は、ビルトインのKubernetes APIです。APIは通常、ホスティングされたKubernetesサービスやマネージドなKubernetesで利用されます。これらは宣言的で、Podのような他のKubernetesリソースと同じ慣例に従っています。そのため、新しいクラスターの設定は繰り返し再利用することができ、アプリケーションと同じように管理することが可能です。更に、安定版(stable)を利用している場合、他のKubernetes APIのような[定義済みのサポートポリシー](/docs/reference/deprecation-policy/)を利用することができます。これらの理由により、この方法は、適切な用途の場合、 *設定ファイル* や *フラグ* よりも好まれます。 +[ResourceQuota](/docs/concepts/policy/resource-quotas/)、[PodSecurityPolicy](/docs/concepts/policy/pod-security-policy/)、[NetworkPolicy](/docs/concepts/services-networking/network-policies/)、そしてロールベースアクセス制御([RBAC](/docs/reference/access-authn-authz/rbac/))といった *ビルトインポリシーAPI* は、ビルトインのKubernetes APIです。APIは通常、ホスティングされたKubernetesサービスやマネージドなKubernetesで利用されます。これらは宣言的で、Podのような他のKubernetesリソースと同じ慣例に従っています。そのため、新しいクラスターの設定は繰り返し再利用することができ、アプリケーションと同じように管理することが可能です。さらに、安定版(stable)を利用している場合、他のKubernetes APIのような[定義済みのサポートポリシー](/docs/reference/deprecation-policy/)を利用することができます。これらの理由により、この方法は、適切な用途の場合、 *設定ファイル* や *フラグ* よりも好まれます。 ## エクステンション @@ -42,7 +42,7 @@ Kubernetesは柔軟な設定が可能で、高い拡張性を持っています ほとんどのクラスター管理者は、ホスティングされている、またはディストリビューションとしてのKubernetesを使っているでしょう。 結果として、ほとんどのKubernetesユーザーは既存のエクステンションを使えばよいため、新しいエクステンションを書く必要は無いと言えます。 -## エクステンションパターン +## エクステンションパターン {#extension-patterns} Kubernetesは、クライアントのプログラムを書くことで自動化ができるようにデザインされています。 Kubernetes APIに読み書きをするどのようなプログラムも、役に立つ自動化機能を提供することができます。 @@ -57,8 +57,8 @@ Kubernetes上でうまく動くクライアントプログラムを書くため 呼び出されるサービスは *Webhookバックエンド* と呼ばれます。コントローラーのように、Webhookも障害点を追加します。 Webhookのモデルでは、Kubernetesは外部のサービスを呼び出します。 -*バイナリプラグイン* モデルでは、Kubernetesはバイナリ(プログラム)を実行します。 -バイナリプラグインはkubelet(例、[FlexVolumeプラグイン](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-storage/flexvolume.md)、[ネットワークプラグイン](/docs/concepts/cluster-administration/network-plugins/))、またkubectlで利用されています。 +*バイナリプラグイン* モデルでは、Kubernetesはバイナリ(プログラム)を実行します。 +バイナリプラグインはkubelet(例、[FlexVolumeプラグイン](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-storage/flexvolume.md)、[ネットワークプラグイン](/docs/concepts/cluster-administration/network-plugins/))、またkubectlで利用されています。 下図は、それぞれの拡張ポイントが、Kubernetesのコントロールプレーンとどのように関わっているかを示しています。 @@ -103,7 +103,7 @@ Webhookのモデルでは、Kubernetesは外部のサービスを呼び出しま ### ビルトインリソースの変更 -カスタムリソースを追加し、KubernetesAPIを拡張する場合、新たに追加されたリソースは常に新しいAPIグループに分類されます。既存のAPIグループを置き換えたり、変更することはできません。APIを追加することは直接、既存のAPI(例、Pod)の振る舞いに影響を与えることは無いですが、APIアクセスエクステンションの場合、その可能性があります。 +カスタムリソースを追加し、KubernetesAPIを拡張する場合、新たに追加されたリソースは常に新しいAPIグループに分類されます。既存のAPIグループを置き換えたり、変更することはできません。APIを追加することは直接、既存のAPI(例、Pod)の振る舞いに影響を与えることは無いですが、APIアクセスエクステンションの場合、その可能性があります。 ### APIアクセスエクステンション @@ -111,7 +111,7 @@ Webhookのモデルでは、Kubernetesは外部のサービスを呼び出しま これらの各ステップごとに拡張ポイントが用意されています。 -Kubdernetesはいくつかのビルトイン認証方式をサポートしています。それは認証プロキシの後ろに配置することも可能で、認可ヘッダーを通じて(Webhookの)検証のために外部サービスにトークンを送ることもできます。全てのこれらの方法は[認証ドキュメント](/docs/reference/access-authn-authz/authentication/)でカバーされています。 +Kubdernetesはいくつかのビルトイン認証方式をサポートしています。それは認証プロキシの後ろに配置することも可能で、認可ヘッダーを通じて(Webhookの)検証のために外部サービスにトークンを送ることもできます。全てのこれらの方法は[認証ドキュメント](/docs/reference/access-authn-authz/authentication/)でカバーされています。 ### 認証 @@ -138,7 +138,7 @@ Kubernetesはいくつかのビルトイン認証方式と、それらが要件 ### デバイスプラグイン -[デバイスプラグイン](/docs/concepts/cluster-administration/device-plugins/)を通じて、ノードが新たなノードのリソース(CPU、メモリなどのビルトインのものに加え)を見つけることを可能にします。 +[デバイスプラグイン](/docs/concepts/cluster-administration/device-plugins/)を通じて、ノードが新たなノードのリソース(CPU、メモリなどのビルトインのものに加え)を見つけることを可能にします。 ### ネットワークプラグイン @@ -150,7 +150,7 @@ Kubernetesはいくつかのビルトイン認証方式と、それらが要件 これはかなりの大きな作業で、ほとんど全てのKubernetesユーザーはスケジューラーを変更する必要はありません。 -スケジューラは[Webhook](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/scheduling/scheduler_extender.md)もサポートしており、Webhookバックエンド(スケジューラーエクステンション)を通じてPodを配置するために選択されたノードをフィルタリング、優先度付けすることが可能です。 +スケジューラは[Webhook](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/scheduling/scheduler_extender.md)もサポートしており、Webhookバックエンド(スケジューラーエクステンション)を通じてPodを配置するために選択されたノードをフィルタリング、優先度付けすることが可能です。 diff --git a/content/ja/docs/concepts/extend-kubernetes/operator.md b/content/ja/docs/concepts/extend-kubernetes/operator.md index 0448510a4f..507463359d 100644 --- a/content/ja/docs/concepts/extend-kubernetes/operator.md +++ b/content/ja/docs/concepts/extend-kubernetes/operator.md @@ -24,7 +24,7 @@ Kubernetes上でワークロードを稼働させている人は、しばしば ## Kubernetesにおけるオペレーター Kubernetesは自動化のために設計されています。追加の作業、設定無しに、Kubernetesのコア機能によって多数のビルトインされた自動化機能が提供されます。 -ワークロードのデプロイ及び稼働を自動化するためにKubernetesを使うことができます。 *更に* Kubernetesがそれをどのように行うかの自動化も可能です。 +ワークロードのデプロイおよび稼働を自動化するためにKubernetesを使うことができます。 *さらに* Kubernetesがそれをどのように行うかの自動化も可能です。 Kubernetesの{{< glossary_tooltip text="コントローラー" term_id="controller" >}}コンセプトは、Kubernetesのソースコードを修正すること無く、クラスターの振る舞いを拡張することを可能にします。 オペレーターはKubernetes APIのクライアントで、[Custom Resource](/docs/concepts/api-extension/custom-resources/)にとっての、コントローラーのように振る舞います。 diff --git a/content/ja/docs/concepts/overview/components.md b/content/ja/docs/concepts/overview/components.md index bdc341d591..a70f3d2e97 100644 --- a/content/ja/docs/concepts/overview/components.md +++ b/content/ja/docs/concepts/overview/components.md @@ -9,7 +9,7 @@ card: Kubernetesをデプロイすると、クラスターが展開されます。 -{{< glossary_definition term_id="cluster" length="all" prepend="クラスターは、">}} +{{< glossary_definition term_id="cluster" length="all" prepend="Kubernetesクラスターは、">}} このドキュメントでは、Kubernetesクラスターが機能するために必要となるさまざまなコンポーネントの概要を説明します。 @@ -21,12 +21,11 @@ Kubernetesをデプロイすると、クラスターが展開されます。 -## マスターコンポーネント +## コントロールプレーンコンポーネント -マスターコンポーネントは、クラスターのコントロールプレーンを提供します。 -マスターコンポーネントは、クラスターに関する全体的な決定(スケジューリングなど)を行います。また、クラスターイベントの検出および応答を行います(たとえば、deploymentの`replicas`フィールドが満たされていない場合に、新しい {{< glossary_tooltip text="pod" term_id="pod">}} を起動する等)。 +コントロールプレーンコンポーネントは、クラスターに関する全体的な決定(スケジューリングなど)を行います。また、クラスターイベントの検出および応答を行います(たとえば、deploymentの`replicas`フィールドが満たされていない場合に、新しい {{< glossary_tooltip text="Pod" term_id="pod">}} を起動する等)。 -マスターコンポーネントはクラスター内のどのマシンでも実行できますが、シンプルにするため、セットアップスクリプトは通常、すべてのマスターコンポーネントを同じマシンで起動し、そのマシンではユーザーコンテナを実行しません。 +コントロールプレーンコンポーネントはクラスター内のどのマシンでも実行できますが、シンプルにするため、セットアップスクリプトは通常、すべてのコントロールプレーンコンポーネントを同じマシンで起動し、そのマシンではユーザーコンテナを実行しません。 マルチマスター VMセットアップの例については、[高可用性クラスターの構築](/docs/admin/high-availability/) を参照してください。 ### kube-apiserver @@ -68,7 +67,7 @@ cloud-controller-managerを使用すると、クラウドベンダーのコー * サービスコントローラー:クラウドプロバイダーのロードバランサーの作成、更新、削除を行います。 * ボリュームコントローラー:ボリュームを作成、アタッチ、マウントしたり、クラウドプロバイダーとやり取りしてボリュームを調整したりします。 -## ノードコンポーネント +## ノードコンポーネント {#node-components} ノードコンポーネントはすべてのノードで実行され、稼働中のPodの管理やKubernetesの実行環境を提供します。 @@ -117,6 +116,6 @@ Kubernetesによって開始されたコンテナは、DNS検索にこのDNSサ * [ノード](/ja/docs/concepts/architecture/nodes/)について学ぶ * [コントローラー](/docs/concepts/architecture/controller/)について学ぶ -* [kube-scheduler](/ja/docs/concepts/scheduling/kube-scheduler/)について学ぶ +* [kube-scheduler](/ja/docs/concepts/scheduling-eviction/kube-scheduler/)について学ぶ * etcdの公式 [ドキュメント](https://etcd.io/docs/)を読む diff --git a/content/ja/docs/concepts/overview/kubernetes-api.md b/content/ja/docs/concepts/overview/kubernetes-api.md index 4e21db1633..5d95929bef 100644 --- a/content/ja/docs/concepts/overview/kubernetes-api.md +++ b/content/ja/docs/concepts/overview/kubernetes-api.md @@ -3,7 +3,7 @@ reviewers: title: Kubernetes API content_type: concept weight: 30 -card: +card: name: concepts weight: 30 --- @@ -16,7 +16,7 @@ APIエンドポイント、リソースタイプ、そしてサンプルは[API APIへの外部からのアクセスは、[APIアクセス制御ドキュメント](/docs/reference/access-authn-authz/controlling-access/)に記載されています。 -Kubernetes APIは、システムの宣言的設定スキーマの基礎としても機能します。[kubectl](/docs/reference/kubectl/overview/)コマンドラインツールから、APIオブジェクトを作成、更新、削除、取得することが出来ます。 +Kubernetes APIは、システムの宣言的設定スキーマの基礎としても機能します。[kubectl](/docs/reference/kubectl/overview/)コマンドラインツールから、APIオブジェクトを作成、更新、削除、取得することができます。 また、Kubernetesは、シリアライズされた状態を(現在は[etcd](https://coreos.com/docs/distributed-configuration/getting-started-with-etcd/)に)APIリソースの単位で保存しています。 @@ -30,7 +30,7 @@ Kubernetesそれ自身は複数のコンポーネントから構成されてお 我々の経験上、成功を収めているどのようなシステムも、新しいユースケースへの対応、既存の変更に合わせ、成長し変わっていく必要があります。したがって、Kubernetesにも継続的に変化、成長することを期待しています。一方で、長期間にわたり、既存のクライアントとの互換性を損なわないようにする予定です。一般的に、新しいAPIリソースとリソースフィールドは頻繁に追加されることが予想されます。リソース、フィールドの削除は、[API廃止ポリシー](/docs/reference/using-api/deprecation-policy/)への準拠を必要とします。 -何が互換性のある変更を意味するか、またAPIをどのように変更するかは、[API変更ドキュメント](https://git.k8s.io/community/contributors/devel/api_changes.md)に詳解されています。 +何が互換性のある変更を意味するか、またAPIをどのように変更するかは、[API変更ドキュメント](https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md)に詳解されています。 ## OpenAPIとSwaggerの定義 @@ -41,10 +41,10 @@ Kubernetes 1.10から、KubernetesAPIサーバーは`/openapi/v2`のエンドポ ヘッダ | 設定可能な値 ------ | --------------- -Accept | `application/json`, `application/com.github.proto-openapi.spec.v2@v1.0+protobuf` (デフォルトのcontent-typeは、`*/*`に対して`application/json`か、もしくはこのヘッダーを送信しません) -Accept-Encoding | `gzip` (このヘッダーを送信しないことも許容されています) +Accept | `application/json`, `application/com.github.proto-openapi.spec.v2@v1.0+protobuf` (デフォルトのcontent-typeは、`*/*`に対して`application/json`か、もしくはこのヘッダーを送信しません) +Accept-Encoding | `gzip` (このヘッダーを送信しないことも許容されています) -1.14より前のバージョンでは、フォーマット分離エンドポイント(`/swagger.json`, `/swagger-2.0.0.json`, `/swagger-2.0.0.pb-v1`, `/swagger-2.0.0.pb-v1.gz`)が、OpenAPI仕様を違うフォーマットで提供しています。これらのエンドポイントは非推奨となっており、Kubernetes1.14で削除される予定です。 +1.14より前のバージョンでは、フォーマット分離エンドポイント(`/swagger.json`, `/swagger-2.0.0.json`, `/swagger-2.0.0.pb-v1`, `/swagger-2.0.0.pb-v1.gz`)が、OpenAPI仕様を違うフォーマットで提供しています。これらのエンドポイントは非推奨となっており、Kubernetes1.14で削除されました。 **OpenAPI仕様の取得サンプル**: @@ -57,7 +57,7 @@ GET /swagger-2.0.0.pb-v1.gz | GET /openapi/v2 **Accept**: application/com.github Kubernetesは、他の手段として主にクラスター間の連携用途向けのAPIに、Protocol buffersをベースにしたシリアライズフォーマットを実装しており、そのフォーマットの概要は[デザイン提案](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/protobuf.md)に記載されています。また各スキーマのIDFファイルは、APIオブジェクトを定義しているGoパッケージ内に配置されています。 また、1.14より前のバージョンのKubernetesAPIサーバーでは、[Swagger v1.2](http://swagger.io/)をベースにしたKubernetes仕様を、`/swaggerapi`で公開しています。 -このエンドポイントは非推奨となっており、Kubernetes1.14で削除される予定です。 +このエンドポイントは非推奨となっており、Kubernetes1.14で削除されました。 ## APIバージョニング @@ -67,16 +67,16 @@ APIが、システムリソースと動作について明確かつ一貫した APIとソフトウエアのバージョニングは、間接的にしか関連していないことに注意してください。[APIとリリースバージョニング提案](https://git.k8s.io/community/contributors/design-proposals/release/versioning.md)で、APIとソフトウェアのバージョニングの関連について記載しています。 -異なるバージョンのAPIは、異なるレベル(版)の安定性とサポートを持っています。それぞれのレベル(版)の基準は、[API変更ドキュメント](https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md#alpha-beta-and-stable-versions)に詳細が記載されています。下記に簡潔にまとめます: +異なるバージョンのAPIでは、安定性やサポートのレベルも変わります。各レベルの詳細な条件は、[API変更ドキュメント](https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md#alpha-beta-and-stable-versions)に記載されています。下記に簡潔にまとめます: -- アルファレベル(版): - - バージョン名に`alpha`を含みます(例、`v1alpha1`)。 +- アルファレベル(版): + - バージョン名に`alpha`を含みます(例、`v1alpha1`)。 - バグが多いかもしれません。アルファ機能の有効化がバグを顕在化させるかもしれません。デフォルトでは無効となっています。 - アルファ機能のサポートは、いつでも通知無しに取りやめられる可能性があります。 - ソフトウェアリリース後、APIが通知無しに互換性が無い形で変更される可能性があります。 - バグが増えるリスク、また長期サポートが無いことから、短期間のテスト用クラスターでの利用を推奨します。 -- ベータレベル(版): - - バージョン名に`beta`を含みます(例、`v2beta3`)。 +- ベータレベル(版): + - バージョン名に`beta`を含みます(例、`v2beta3`)。 - コードは十分にテストされています。ベータ機能の有効化は安全だと考えられます。デフォルトで有効化されています。 - 全体的な機能のサポートは取りやめられませんが、詳細は変更される可能性があります。 - オブジェクトのスキーマ、意味はその後のベータ、安定版リリースで互換性が無い形で変更される可能性があります。その場合、次のバージョンへアップデートするための手順を提供します。その手順ではAPIオブジェクトの削除、修正、再作成が必要になるかもしれません。修正のプロセスは多少の検討が必要になるかもしれません。これは、この機能を利用しているアプリケーションでダウンタイムが必要になる可能性があるためです。 @@ -93,24 +93,24 @@ APIグループは、RESTのパスとシリアライズされたオブジェク 現在、いくつかのAPIグループが利用されています: -1. *core* グループ(度々、*legacy group* と呼ばれます)は、`/api/v1`というRESTのパスで、`apiVersion: v1`を使います。 +1. *core* グループ(たびたび、*legacy group* と呼ばれます)は、`/api/v1`というRESTのパスで、`apiVersion: v1`を使います。 -1. 名前付きのグループは、`/apis/$GROUP_NAME/$VERSION`というRESTのパスで、`apiVersion: $GROUP_NAME/$VERSION`(例、`apiVersion: batch/v1`)を使います。サポートされているAPIグループの全リストは、[Kubernetes APIリファレンス](/docs/reference/)を参照してください。 +1. 名前付きのグループは、`/apis/$GROUP_NAME/$VERSION`というRESTのパスで、`apiVersion: $GROUP_NAME/$VERSION`(例、`apiVersion: batch/v1`)を使います。サポートされているAPIグループの全リストは、[Kubernetes APIリファレンス](/docs/reference/)を参照してください。 [カスタムリソース](/docs/concepts/api-extension/custom-resources/)でAPIを拡張するために、2つの方法がサポートされています: 1. [カスタムリソース定義](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/)は、とても基本的なCRUDが必要なユーザー向けです。 1. 独自のAPIサーバーを実装可能な、フルセットのKubernetes APIが必要なユーザーは、[アグリゲーター](/docs/tasks/access-kubernetes-api/configure-aggregation-layer/)を使い、クライアントにシームレスな形で拡張を行います。 -## APIグループの有効化 +## APIグループの有効化、無効化 いくつかのリソースとAPIグループはデフォルトで有効になっています。それらは、APIサーバーの`--runtime-config`設定で、有効化、無効化できます。`--runtime-config`は、カンマ区切りの複数の値を設定可能です。例えば、batch/v1を無効化する場合、`--runtime-config=batch/v1=false`をセットし、batch/v2alpha1を有効化する場合、`--runtime-config=batch/v2alpha1`をセットします。このフラグは、APIサーバーのランタイム設定を表すkey=valueのペアを、カンマ区切りで指定したセットを指定可能です。 -重要: APIグループ、リソースの有効化、無効化は、`--runtime-config`の変更を反映するため、APIサーバーとコントローラーマネージャーの再起動が必要です。 +{{< note >}}APIグループ、リソースの有効化、無効化は、`--runtime-config`の変更を反映するため、APIサーバーとコントローラーマネージャーの再起動が必要です。{{< /note >}} -## APIグループのリソースの有効化 - -DaemonSets、Deployments、HorizontalPodAutoscalers、Ingresses、JobsReplicaSets、そしてReplicaSetsはデフォルトで有効です。 -その他の拡張リソースは、APIサーバーの`--runtime-config`を設定することで有効化できます。`--runtime-config`はカンマ区切りの複数の値を設定可能です。例えば、deploymentsとingressを無効化する場合、`--runtime-config=extensions/v1beta1/deployments=false,extensions/v1beta1/ingresses=false`と設定します。 +## APIグループextensions/v1beta1に含まれる特定のリソースの有効化 +APIグループ`extensions/v1beta1`に含まれるDaemonSets、Deployments、StatefulSet、NetworkPolicies、PodSecurityPolicies、ReplicaSetsはデフォルトで無効にされています。 +例えば、deploymentとdaemonsetを有効にするには、`--runtime-config=extensions/v1beta1/deployments=true,extensions/v1beta1/daemonsets=true`と設定します。 +{{< note >}}リソースを個別に有効化、無効化することは歴史的な理由によりAPIグループ`extensions/v1beta1`に含まれるリソースに限りサポートされています。{{< /note >}} diff --git a/content/ja/docs/concepts/overview/what-is-kubernetes.md b/content/ja/docs/concepts/overview/what-is-kubernetes.md index 1b90ef4a3f..5f2f4bbf18 100644 --- a/content/ja/docs/concepts/overview/what-is-kubernetes.md +++ b/content/ja/docs/concepts/overview/what-is-kubernetes.md @@ -1,8 +1,11 @@ --- +reviewers: title: Kubernetesとは何か? +description: > + Kubernetesは、宣言的な構成管理と自動化を促進し、コンテナ化されたワークロードやサービスを管理するための、ポータブルで拡張性のあるオープンソースのプラットフォームです。Kubernetesは巨大で急速に成長しているエコシステムを備えており、それらのサービス、サポート、ツールは幅広い形で利用可能です。 content_type: concept weight: 10 -card: +card: name: concepts weight: 10 --- @@ -12,94 +15,76 @@ card: -Kubernetesは、宣言的な構成管理と自動化を促進し、コンテナ化されたワークロードやサービスを管理するための、ポータブルで拡張性のあるオープンソースプラットホームです。 +Kubernetesは、宣言的な構成管理と自動化を促進し、コンテナ化されたワークロードやサービスを管理するための、ポータブルで拡張性のあるオープンソースのプラットフォームです。Kubernetesは巨大で急速に成長しているエコシステムを備えており、それらのサービス、サポート、ツールは幅広い形で利用可能です。 -Kubernetesは膨大で、急速に成長しているエコシステムを備えており、それらのサービス、サポート、ツールは幅広い形で利用可能です。 +Kubernetesの名称は、ギリシャ語に由来し、操舵手やパイロットを意味しています。Googleは2014年にKubernetesプロジェクトをオープンソース化しました。Kubernetesは、本番環境で大規模なワークロードを稼働させた[Googleの15年以上の経験](/blog/2015/04/borg-predecessor-to-kubernetes/)と、コミュニティからの最高のアイディアや実践を組み合わせています。 -Googleは2014年にKubernetesプロジェクトをオープンソース化しました。Kubernetesは[Googleが大規模な本番ワークロードを動かしてきた10年半の経験](https://research.google.com/pubs/pub43438.html)と、コミュニティから得られた最善のアイデア、知見に基づいています。 +## 過去を振り返ってみると -## なぜKubernetesが必要で、どんなことができるのか? +過去を振り返って、Kubernetesがなぜこんなに便利なのかを見てみましょう。 -Kubernetesには多くの機能があります。考えられるものとしては +![Deployment evolution](/images/docs/Container_Evolution.svg) -- コンテナ基盤 -- マイクロサービス基盤 -- ポータブルなクラウド基盤 +**仮想化ができる前の時代におけるデプロイ (Traditional deployment):** 初期の頃は、組織は物理サーバー上にアプリケーションを実行させていました。物理サーバー上でアプリケーションのリソース制限を設定する方法がなかったため、リソースの割当問題が発生していました。例えば、複数のアプリケーションを実行させた場合、ひとつのアプリケーションがリソースの大半を消費してしまうと、他のアプリケーションのパフォーマンスが低下してしまうことがありました。この解決方法は、それぞれのアプリケーションを別々の物理サーバーで動かすことでした。しかし、リソースが十分に活用できなかったため、拡大しませんでした。また組織にとって多くの物理サーバーを維持することは費用がかかりました。 -など、他にもいろいろ +**仮想化を使ったデプロイ (Virtualized deployment):** ひとつの解決方法として、仮想化が導入されました。1台の物理サーバーのCPU上で、複数の仮想マシン(VM)を実行させることができるようになりました。仮想化によりアプリケーションをVM毎に隔離する事ができ、ひとつのアプリケーションの情報が他のアプリケーションから自由にアクセスさせないといったセキュリティレベルを提供することができます。 -Kubernetesは、**コンテナを中心とした**管理基盤です。ユーザーワークロードの代表格であるコンピューティング、ネットワーキング、ストレージインフラストラクチャのオーケストレーションを行います。それによって、Platform as a Service(PaaS)の簡単さの大部分を、Infrastructure as a Service(IaaS)の柔軟さとともに提供し、インフラストラクチャプロバイダの垣根を超えたポータビリティを実現します。 +仮想化により、物理サーバー内のリソース使用率が向上し、アプリケーションの追加や更新が容易になり、ハードウェアコストの削減などスケーラビリティが向上します。仮想化を利用すると、物理リソースのセットを使い捨て可能な仮想マシンのクラスターとして提示することができます。 -## Kubernetesが基盤になるってどういうこと? +各VMは、仮想ハードウェア上で各自のOSを含んだ全コンポーネントを実行する完全なマシンです。 -Kubernetesが多くの機能を提供すると言いつつも、新しい機能から恩恵を受ける新しいシナリオは常にあります。アプリケーション固有のワークフローを効率化して開発者のスピードを早めることができます。最初は許容できるアドホックなオーケストレーションでも、大規模で堅牢な自動化が必要となることはしばしばあります。これが、Kubernetesがアプリケーションのデプロイ、拡張、および管理を容易にするために、コンポーネントとツールのエコシステムを構築するための基盤としても機能するように設計された理由です。 +**コンテナを使ったデプロイ (Container deployment):** コンテナはVMと似ていますが、アプリケーション間でオペレーティング・システム(OS)を共有できる緩和された分離特性を持っています。そのため、コンテナは軽量だといわれます。VMと同じように、コンテナは各自のファイルシステム、CPU、メモリー、プロセス空間等を持っています。基盤のインフラストラクチャから分離されているため、クラウドやOSディストリビューションを越えて移動することが可能です。 -[ラベル](/ja/docs/concepts/overview/working-with-objects/labels/)を使用すると、ユーザーは自分のリソースを整理できます。[アノテーション](/ja/docs/concepts/overview/working-with-objects/annotations/)を使用すると、ユーザーは自分のワークフローを容易にし、管理ツールが状態をチェックするための簡単な方法を提供するためにカスタムデータを使ってリソースを装飾できるようになります。 +コンテナは、その他にも次のようなメリットを提供するため、人気が高まっています。 -さらに、[Kubernetesコントロールプレーン](/ja/docs/concepts/overview/components/)は、開発者やユーザーが使える[API](/docs/reference/using-api/api-overview/)の上で成り立っています。ユーザーは[スケジューラー](https://github.com/kubernetes/community/blob/{{< param "githubbranch" >}}/contributors/devel/scheduler.md)などの独自のコントローラーを、汎用の[コマンドラインツール](/docs/user-guide/kubectl-overview/)で使える[独自のAPI](/docs/concepts/api-extension/custom-resources/)を持たせて作成することができます。 +* アジャイルアプリケーションの作成とデプロイ: VMイメージの利用時と比較して、コンテナイメージ作成の容易さと効率性が向上します。 +* 継続的な開発、インテグレーションとデプロイ: 信頼できる頻繁なコンテナイメージのビルドと、素早く簡単にロールバックすることが可能なデプロイを提供します。(イメージが不変であれば) +* 開発者と運用者の関心を分離: アプリケーションコンテナイメージの作成は、デプロイ時ではなく、ビルド/リリース時に行います。それによって、インフラストラクチャとアプリケーションを分離します。 +* 可観測性はOSレベルの情報とメトリクスだけではなく、アプリケーションの稼働状態やその他の警告も表示します。 +* 開発、テスト、本番環境を越えた環境の一貫性: クラウドで実行させるのと同じようにノートPCでも実行させる事ができます。 +* クラウドとOSディストリビューションの可搬性: Ubuntu、RHEL、CoreOS上でも、オンプレミスも、主要なパブリッククラウドでも、それ以外のどんな環境でも、実行できます。 +* アプリケーション中心の管理: 仮想マシン上でOSを実行するから、論理リソースを使用してOS上でアプリケーションを実行するへと抽象度のレベルを向上させます。 +* 疎結合、分散化、拡張性、柔軟性のあるマイクロサービス: アプリケーションを小さく、同時にデプロイと管理が可能な独立した部品に分割されます。1台の大きな単一目的のマシン上に実行するモノリシックなスタックではありません。 +* リソースの分割: アプリケーションのパフォーマンスが予測可能です。 +* リソースの効率的な利用: 高い効率性と集約性が可能です。 -この[デザイン](https://git.k8s.io/community/contributors/design-proposals/architecture/architecture.md)によって、他の多くのシステムがKubernetes上で構築できるようになりました。 +## Kubernetesが必要な理由と提供する機能 {#why-you-need-kubernetes-and-what-can-it-do} -## Kubernetesにないこと +コンテナは、アプリケーションを集約して実行する良い方法です。本番環境では、アプリケーションを実行しダウンタイムが発生しないように、コンテナを管理する必要があります。例えば、コンテナがダウンした場合、他のコンテナを起動する必要があります。このような動作がシステムに組込まれていると、管理が簡単になるのではないでしょうか? -Kubernetesは伝統的な何でも入りのPaaSシステムではありません。Kubernetesはハードウェアレベルではなくコンテナレベルで動作するため、PaaS製品が提供するような、共通のいくつかの一般的に適用可能な機能(デプロイ、拡張、負荷分散、ログ記録、監視など)を提供します。ただし、Kubernetesはモノリシックではなく、これらのデフォルトのソリューションは任意に脱着可能です。Kubernetesは開発者の基盤を構築するための構成要素を提供しますが、重要な場合はユーザーの選択と柔軟性を維持します。 +そこを助けてくれるのがKubernetesです! Kubernetesは分散システムを弾力的に実行するフレームワークを提供してくれます。あなたのアプリケーションのためにスケーリングとフェイルオーバーの面倒を見てくれて、デプロイのパターンなどを提供します。例えば、Kubernetesはシステムにカナリアデプロイを簡単に管理することができます。 + +Kubernetesは以下を提供します。 + +* **サービスディスカバリーと負荷分散** +Kubernetesは、DNS名または独自のIPアドレスを使ってコンテナを公開することができます。コンテナへのトラフィックが多い場合は、Kubernetesは負荷分散し、ネットワークトラフィックを振り分けることができるたため、デプロイが安定します。 +* **ストレージ オーケストレーション** +Kubernetesは、ローカルストレージやパブリッククラウドプロバイダーなど、選択したストレージシステムを自動でマウントすることができます。 +* **自動化されたロールアウトとロールバック** +Kubernetesを使うとデプロイしたコンテナのあるべき状態を記述することができ、制御されたスピードで実際の状態をあるべき状態に変更することができます。例えば、アプリケーションのデプロイのために、新しいコンテナの作成や既存コンテナの削除、新しいコンテナにあらゆるリソースを適用する作業を、Kubernetesで自動化できます。 +* **自動ビンパッキング** +コンテナ化されたタスクを実行するノードのクラスターをKubernetesへ提供します。各コンテナがどれくらいCPUやメモリー(RAM)を必要とするのかをKubernetesに宣言することができます。Kubernetesはコンテナをノードにあわせて調整することができ、リソースを最大限に活用してくれます。 +* **自己修復** +Kubernetesは、処理が失敗したコンテナを再起動し、コンテナを入れ替え、定義したヘルスチェックに応答しないコンテナを強制終了します。処理の準備ができるまでは、クライアントに通知しません。 +* **機密情報と構成管理** +Kubernetesは、パスワードやOAuthトークン、SSHキーのよう機密の情報を保持し、管理することができます。機密情報をデプロイし、コンテナイメージを再作成することなくアプリケーションの構成情報を更新することができます。スタック構成の中で機密情報を晒してしまうこともありません。 + +## Kubernetesにないもの + +Kubernetesは、従来型の全部入りなPaaS(Platform as a Service)のシステムではありません。Kubernetesはハードウェアレベルではなく、コンテナレベルで動作するため、デプロイ、スケーリング、負荷分散、ロギングやモニタリングといったPasSが提供するのと共通の機能をいくつか提供しています。また一方、Kubernetesはモノリシックでなく、標準のソリューションは選択が自由で、追加と削除が容易な構成になっています。Kubernetesは開発プラットフォーム構築のためにビルディングブロックを提供しますが、重要な部分はユーザーの選択と柔軟性を維持しています。 Kubernetesは... -* サポートするアプリケーションの種類を限定しません。Kubernetesはステートレス、ステートフル、およびデータ処理ワークロードなど、非常に多様なワークロードをサポートするように作られています。アプリケーションをコンテナ内で実行できる場合は、Kubernetes上でもうまく動作するはずです。 -* ソースコードのデプロイやアプリケーションのビルドを行いません。継続的インテグレーション、デリバリー、デプロイ(CI/CD)ワークフローは、技術選定がそうであるように、組織の文化や好みによって決まるからです。 -* ミドルウェア(例: message buses)、データ処理フレームワーク(例: Spark)、データベース(例: mysql)、キャッシュ、クラスターストレージシステム(例: Ceph) のような、アプリケーションレベルの機能は組み込みでは提供しません。これらのコンポーネントはKubernetesの上で動作できますし、Open Service Brokerのようなポータブルメカニズムを経由してKubernetes上のアプリケーションからアクセスすることもできます。 -* ロギング、モニタリング、アラーティングソリューションへの指示は行いません。概念実証(PoC)としていくつかのインテグレーション、およびメトリックを収集およびエクスポートするためのメカニズムを提供します。 -* 設定言語/システム(例: jsonnet)を提供も強制もしません。任意の形式の宣言仕様の対象となる可能性がある宣言APIを提供します。 -* 包括的なインフラ構成、保守、管理、またはセルフヒーリングシステムを提供、導入しません。 - -さらに、Kubernetesは単なる *オーケストレーションシステム* ではありません。実際、オーケストレーションは不要です。*オーケストレーション* の技術的定義は、定義されたワークフローの実行です。最初にA、次にB、次にCを実行します。対照的に、Kubernetesは現在の状態を提供された望ましい状態に向かって継続的に推進する一連の独立した構成可能な制御プロセスで構成されます。AからCへのアクセス方法は関係ありません。集中管理も必要ありません。これにより、使いやすく、より強力で、堅牢で、回復力があり、そして拡張性のあるシステムが得られます。 - -## なぜコンテナなのか? - -なぜコンテナを使うべきかの理由をお探しですか? - -![なぜコンテナなのか?](/images/docs/why_containers.svg) - -アプリケーションをデプロイするための古い方法は、オペレーティングシステムのパッケージマネージャを使用してアプリケーションをホストにインストールすることでした。これには、アプリケーションの実行ファイル、構成、ライブラリ、ライフサイクルがそれぞれ、またホストOS自身と絡み合うというデメリットがありました。予測可能なロールアウトとロールバックを実現するために、不変の仮想マシンイメージを作成することもできますが、VMは重く、移植性がありません。 - -新しい方法は、ハードウェア仮想化ではなく、オペレーティングシステムレベルの仮想化に基づいてコンテナを展開することです。各コンテナは互いに、そしてホストから隔離されています。また、独自のファイルシステムを持ち、お互いのプロセスを見ることができず、計算リソースの使用量を制限することができます。これはVMよりも構築が簡単で、基盤となるインフラストラクチャとホストのファイルシステムから分離されているため、クラウドやOSのディストリビューション間で移植性があります。 - -コンテナは小さくて速いので、1つのアプリケーションを各コンテナイメージにまとめることができます。この1対1のアプリケーションとイメージの関係により、コンテナの利点が完全に引き出されます。コンテナを使用すると、各アプリケーションを残りのアプリケーションスタックと合成したり、本番インフラストラクチャ環境と結合したりする必要がないため、不変のコンテナイメージをデプロイ時ではなく、ビルド時またはリリース時に作成できます。ビルド/リリース時にコンテナイメージを生成することで、開発から運用に一貫した環境を持ち込むことができます。同様に、コンテナはVMよりもはるかに透過的であるため、監視と管理が容易になります。これは、コンテナのプロセスライフサイクルがコンテナ内のプロセススーパーバイザによって隠されるのではなく、インフラストラクチャによって管理される場合に特に当てはまります。最後に、コンテナごとに1つのアプリケーションを使用すると、コンテナの管理はアプリケーションのデプロイ管理と同等になります。 - -コンテナの利点をまとめると: - -* **アジャイルなアプリケーション作成とデプロイ**: - VMイメージの使用と比べ、コンテナイメージ作成は容易で効率も高いです。 -* **継続的な開発、インテグレーション、デプロイ**: - 迅速で簡単なロールバックで、信頼性の高い頻繁なコンテナイメージのビルドとデプロイを提供します(イメージの不変性にもよります)。 -* **開発と運用の懸念を分離**: - デプロイ時ではなくビルド時またはリリース時にアプリケーションのコンテナイメージを作成することで、アプリケーションをインフラストラクチャから切り離します。 -* **可観測性** - OSレベルの情報や測定基準だけでなく、アプリケーションの正常性やその他のシグナルも明確にします。 -* **開発、テスト、本番環境に跨った環境の一貫性**: - 手元のノートPC上でも、クラウド上と同じように動作します。 -* **クラウドとOSディストリビューションの移植性**: - Ubuntu、RHEL、CoreOS、オンプレミス、Google Kubernetes Engine、その他のどこでも動作します。 -* **アプリケーション中心の管理**: - 仮想ハードウェア上でのOS実行から、論理リソースを使用したOS上でのアプリケーション実行へと、抽象度のレベルを上げます。 -* **疎結合で、分散された、伸縮自在の遊離した[マイクロサービス](https://martinfowler.com/articles/microservices.html)**: - アプリケーションは小さな独立した欠片に分割され、動的に配置および管理できます。1つの大きな単一目的のマシンで実行されるモノリシックなスタックではありません。 -* **リソース分割**: - アプリケーションパフォーマンスが予測可能です。 -* **リソースの効率利用**: - 高効率で高密度です。 - -## Kubernetesってどういう意味?K8sって何? - -**Kubernetes** という名前はギリシャ語で *操舵手* や *パイロット* という意味があり、*知事* や[サイバネティックス](http://www.etymonline.com/index.php?term=cybernetics)の語源にもなっています。*K8s* は、8文字の「ubernete」を「8」に置き換えた略語です。 - +* サポートするアプリケーションの種類を制限しません。Kubernetesは、スレートレス、ステートフルやデータ処理のワークロードなど、非常に多様なワークロードをサポートすることを目的としています。アプリケーションがコンテナで実行できるのであれば、Kubernetes上で問題なく実行できるはずです。 +* ソースコードのデプロイやアプリケーションのビルドは行いません。継続的なインテグレーション、デリバリー、デプロイ(CI/CD)のワークフローは、技術的な要件だけでなく組織の文化や好みで決められます。 +* ミドルウェア(例:メッセージバス)、データ処理フレームワーク(例:Spark)、データベース(例:MySQL)、キャッシュ、クラスターストレージシステム(例:Ceph)といったアプリケーションレベルの機能を組み込んで提供しません。それらのコンポーネントは、Kubernetes上で実行することもできますし、[Open Service Broker](https://openservicebrokerapi.org/)のようなポータブルメカニズムを経由してKubernetes上で実行されるアプリケーションからアクセスすることも可能です。 +* ロギング、モニタリングやアラートを行うソリューションは指定しません。PoCとしていくつかのインテグレーションとメトリクスを収集し出力するメカニズムを提供します。 +* 構成言語/システム(例:Jsonnet)の提供も指示もしません。任意の形式の宣言型仕様の対象となる可能性のある宣言型APIを提供します。 +* 統合的なマシンの構成、メンテナンス、管理、または自己修復を行うシステムは提供も採用も行いません。 +* さらに、Kubernetesは単なるオーケストレーションシステムではありません。実際には、オーケストレーションの必要性はありません。オーケストレーションの技術的な定義は、「最初にAを実行し、次にB、その次にCを実行」のような定義されたワークフローの実行です。対照的にKubernetesは、現在の状態から提示されたあるべき状態にあわせて継続的に維持するといった、独立していて構成可能な制御プロセスのセットを提供します。AからCへどのように移行するかは問題ではありません。集中管理も必要ありません。これにより、使いやすく、より強力で、堅牢で、弾力性と拡張性があるシステムが実現します。 ## {{% heading "whatsnext" %}} -* [はじめる](/docs/setup/)準備はできましたか? -* さらなる詳細については、[Kubernetesのドキュメント](/ja/docs/home/)を御覧ください。 - - - +* [Kubernetesのコンポーネント](/ja/docs/concepts/overview/components/)を御覧ください。 +* [はじめる](/ja/docs/setup/)準備はできましたか? diff --git a/content/ja/docs/concepts/overview/working-with-objects/kubernetes-objects.md b/content/ja/docs/concepts/overview/working-with-objects/kubernetes-objects.md index 16d1bdd27a..48cbed282a 100644 --- a/content/ja/docs/concepts/overview/working-with-objects/kubernetes-objects.md +++ b/content/ja/docs/concepts/overview/working-with-objects/kubernetes-objects.md @@ -2,7 +2,7 @@ title: Kubernetesオブジェクトを理解する content_type: concept weight: 10 -card: +card: name: concepts weight: 40 --- @@ -12,31 +12,31 @@ card: -## Kubernetesオブジェクトを理解する +## Kubernetesオブジェクトを理解する {#kubernetes-objects} -*Kubernetesオブジェクト* は、Kubernetes上で永続的なエンティティです。Kubernetesはこれらのエンティティを使い、クラスターの状態を表現します。具体的に言うと、下記のような内容が表現出来ます: +*Kubernetesオブジェクト* は、Kubernetes上で永続的なエンティティです。Kubernetesはこれらのエンティティを使い、クラスターの状態を表現します。具体的に言うと、下記のような内容が表現できます: -* どのようなコンテナ化されたアプリケーションが稼働しているか(またそれらはどのノード上で動いているか) +* どのようなコンテナ化されたアプリケーションが稼働しているか(またそれらはどのノード上で動いているか) * それらのアプリケーションから利用可能なリソース * アプリケーションがどのように振る舞うかのポリシー、例えば再起動、アップグレード、耐障害性ポリシーなど -Kubernetesオブジェクトは"意図の記録"です。一度オブジェクトを作成すると、Kubernetesは常にそのオブジェクトが存在し続けるように動きます。オブジェクトを作成することで、Kubernetesに対し効果的にあなたのクラスターのワークロードがこのようになっていて欲しいと伝えているのです。これが、あなたのクラスターの**望ましい状態**です。 +Kubernetesオブジェクトは「意図の記録」です。一度オブジェクトを作成すると、Kubernetesは常にそのオブジェクトが存在し続けるように動きます。オブジェクトを作成することで、Kubernetesに対し効果的にあなたのクラスターのワークロードがこのようになっていて欲しいと伝えているのです。これが、あなたのクラスターの**望ましい状態**です。 Kubernetesオブジェクトを操作するには、作成、変更、または削除に関わらず[Kubernetes API](/ja/docs/concepts/overview/kubernetes-api/)を使う必要があるでしょう。例えば`kubectl`コマンドラインインターフェースを使った場合、このCLIが処理に必要なKubernetes API命令を、あなたに代わり発行します。あなたのプログラムから[クライアントライブラリ](/docs/reference/using-api/client-libraries/)を利用し、直接Kubernetes APIを利用することも可能です。 -### オブジェクトのspec(仕様)とstatus(状態) +### オブジェクトのspec(仕様)とstatus(状態) ほとんどのKubernetesオブジェクトは、オブジェクトの設定を管理する2つの入れ子になったオブジェクトのフィールドを持っています。それはオブジェクト *`spec`* とオブジェクト *`status`* です。`spec`を持っているオブジェクトに関しては、オブジェクト作成時に`spec`を設定する必要があり、望ましい状態としてオブジェクトに持たせたい特徴を記述する必要があります。 `status` オブジェクトはオブジェクトの *現在の状態* を示し、その情報はKubernetesとそのコンポーネントにより提供、更新されます。Kubernetes{{< glossary_tooltip text="コントロールプレーン" term_id="control-plane" >}}は、あなたから指定された望ましい状態と現在の状態が一致するよう常にかつ積極的に管理をします。 -例えば、KubernetesのDeploymentはクラスター上で稼働するアプリケーションを表現するオブジェクトです。Deploymentを作成するとき、アプリケーションの複製を3つ稼働させるようDeploymentのspecで指定するかもしれません。KubernetesはDeploymentのspecを読み取り、指定されたアプリケーションを3つ起動し、現在の状態がspecに一致するようにします。もしこれらのインスタンスでどれかが落ちた場合(statusが変わる)、Kubernetesはspecと、statusの違いに反応し、修正しようとします。この場合は、落ちたインスタンスの代わりのインスタンスを立ち上げます。 +例えば、KubernetesのDeploymentはクラスター上で稼働するアプリケーションを表現するオブジェクトです。Deploymentを作成するとき、アプリケーションの複製を3つ稼働させるようDeploymentのspecで指定するかもしれません。KubernetesはDeploymentのspecを読み取り、指定されたアプリケーションを3つ起動し、現在の状態がspecに一致するようにします。もしこれらのインスタンスでどれかが落ちた場合(statusが変わる)、Kubernetesはspecと、statusの違いに反応し、修正しようとします。この場合は、落ちたインスタンスの代わりのインスタンスを立ち上げます。 spec、status、metadataに関するさらなる情報は、[Kubernetes API Conventions](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md)をご確認ください。 ### Kubernetesオブジェクトを記述する -Kubernetesでオブジェクトを作成する場合、オブジェクトの基本的な情報(例えば名前)と共に、望ましい状態を記述したオブジェクトのspecを渡さなければいけません。KubernetesAPIを利用しオブジェクトを作成する場合(直接APIを呼ぶか、`kubectl`を利用するかに関わらず)、APIリクエストはそれらの情報をJSON形式でリクエストのBody部に含んでいなければなりません。 +Kubernetesでオブジェクトを作成する場合、オブジェクトの基本的な情報(例えば名前)と共に、望ましい状態を記述したオブジェクトのspecを渡さなければいけません。KubernetesAPIを利用しオブジェクトを作成する場合(直接APIを呼ぶか、`kubectl`を利用するかに関わらず)、APIリクエストはそれらの情報をJSON形式でリクエストのBody部に含んでいなければなりません。 ここで、KubernetesのDeploymentに必要なフィールドとオブジェクトのspecを記載した`.yaml`ファイルの例を示します: @@ -63,7 +63,7 @@ Kubernetesオブジェクトを`.yaml`ファイルに記載して作成する場 * `metadata` - オブジェクトを一意に特定するための情報、文字列の`name`、`UID`、また任意の`namespace`が該当する * `spec` - オブジェクトの望ましい状態 -`spec`の正確なフォーマットは、Kubernetesオブジェクトごとに異なり、オブジェクトごとに特有な入れ子のフィールドを持っています。[Kubernetes API リファレンス](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/)が、Kubernetesで作成出来る全てのオブジェクトに関するspecのフォーマットを探すのに役立ちます。 +`spec`の正確なフォーマットは、Kubernetesオブジェクトごとに異なり、オブジェクトごとに特有な入れ子のフィールドを持っています。[Kubernetes API リファレンス](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/)が、Kubernetesで作成できる全てのオブジェクトに関するspecのフォーマットを探すのに役立ちます。 例えば、`Pod`オブジェクトに関する`spec`のフォーマットは[PodSpec v1 core](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core)を、また`Deployment`オブジェクトに関する`spec`のフォーマットは[DeploymentSpec v1 apps](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#deploymentspec-v1-apps)をご確認ください。 diff --git a/content/ja/docs/concepts/overview/working-with-objects/labels.md b/content/ja/docs/concepts/overview/working-with-objects/labels.md index 95442bdf4c..c7ebacf360 100644 --- a/content/ja/docs/concepts/overview/working-with-objects/labels.md +++ b/content/ja/docs/concepts/overview/working-with-objects/labels.md @@ -185,7 +185,7 @@ kubectl get pods -l 'environment in (production),tier in (frontend)' ``` すでに言及したように、*集合ベース* の要件は、*等価ベース* の要件より表現力があります。 -例えば、値に対する_OR_ オペレーターを実装して以下のように書けます。 +例えば、値に対する _OR_ オペレーターを実装して以下のように書けます。 ```shell kubectl get pods -l 'environment in (production, qa)' diff --git a/content/ja/docs/concepts/overview/working-with-objects/namespaces.md b/content/ja/docs/concepts/overview/working-with-objects/namespaces.md index 1286e3c667..1b66e046f1 100644 --- a/content/ja/docs/concepts/overview/working-with-objects/namespaces.md +++ b/content/ja/docs/concepts/overview/working-with-objects/namespaces.md @@ -78,7 +78,7 @@ kubectl config view --minify | grep namespace: ## NamespaceとDNS ユーザーが[Service](/ja/docs/concepts/services-networking/service/)を作成するとき、Serviceは対応する[DNSエントリ](/ja/docs/concepts/services-networking/dns-pod-service/)を作成します。 -このエントリは`..svc.cluster.local`という形式になり,これはもしあるコンテナがただ``を指定していた場合、Namespace内のローカルのServiceに対して名前解決されます。 +このエントリは`..svc.cluster.local`という形式になり、これはもしあるコンテナがただ``を指定していた場合、Namespace内のローカルのServiceに対して名前解決されます。 これはデベロップメント、ステージング、プロダクションといって複数のNamespaceをまたいで同じ設定を使う時に効果的です。 もしユーザーがNamespaceをまたいでアクセスしたい時、 完全修飾ドメイン名(FQDN)を指定する必要があります。 diff --git a/content/ja/docs/concepts/overview/working-with-objects/object-management.md b/content/ja/docs/concepts/overview/working-with-objects/object-management.md index bbf0085cf1..49092c6dea 100644 --- a/content/ja/docs/concepts/overview/working-with-objects/object-management.md +++ b/content/ja/docs/concepts/overview/working-with-objects/object-management.md @@ -63,7 +63,7 @@ kubectl create deployment nginx --image nginx ## 命令型オブジェクト設定 -命令型オブジェクト設定では、kubectlコマンドに処理内容(create、replaceなど)、任意のフラグ、そして最低1つのファイル名を指定します。 +命令型オブジェクト設定では、kubectlコマンドに処理内容(create、replaceなど)、任意のフラグ、そして最低1つのファイル名を指定します。 指定されたファイルは、YAMLまたはJSON形式でオブジェクトの全ての定義情報を含んでいなければいけません。 オブジェクト定義の詳細は、[APIリファレンス](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/)を参照してください。 @@ -150,7 +150,7 @@ kubectl apply -R -f configs/ 命令型オブジェクト設定手法に対する長所: - 現行オブジェクトに直接行われた変更が、それらが設定ファイルに反映されていなかったとしても、保持されます -- 宣言型オブジェクト設定は、ディレクトリごとの処理をより良くサポートしており、自動的にオブジェクトごとに操作のタイプ(作成、パッチ、削除)を検出します +- 宣言型オブジェクト設定は、ディレクトリごとの処理をより良くサポートしており、自動的にオブジェクトごとに操作のタイプ(作成、パッチ、削除)を検出します 命令型オブジェクト設定手法に対する短所: @@ -163,9 +163,9 @@ kubectl apply -R -f configs/ - [命令型コマンドを利用したKubernetesオブジェクトの管理](/docs/tasks/manage-kubernetes-objects/imperative-command/) -- [オブジェクト設定(命令型)を利用したKubernetesオブジェクトの管理](/docs/tasks/manage-kubernetes-objects/imperative-config/) -- [オブジェクト設定(宣言型)を利用したKubernetesオブジェクトの管理](/docs/tasks/manage-kubernetes-objects/declarative-config/) -- [Kustomize(宣言型)を利用したKubernetesオブジェクトの管理](/docs/tasks/manage-kubernetes-objects/kustomization/) +- [オブジェクト設定(命令型)を利用したKubernetesオブジェクトの管理](/docs/tasks/manage-kubernetes-objects/imperative-config/) +- [オブジェクト設定(宣言型)を利用したKubernetesオブジェクトの管理](/docs/tasks/manage-kubernetes-objects/declarative-config/) +- [Kustomize(宣言型)を利用したKubernetesオブジェクトの管理](/docs/tasks/manage-kubernetes-objects/kustomization/) - [Kubectlコマンドリファレンス](/docs/reference/generated/kubectl/kubectl-commands/) - [Kubectl Book](https://kubectl.docs.kubernetes.io) - [Kubernetes APIリファレンス](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/) diff --git a/content/ja/docs/concepts/policy/limit-range.md b/content/ja/docs/concepts/policy/limit-range.md new file mode 100644 index 0000000000..656ba98a12 --- /dev/null +++ b/content/ja/docs/concepts/policy/limit-range.md @@ -0,0 +1,57 @@ +--- +title: Limit Range +content_type: concept +weight: 10 +--- + + + +デフォルトでは、コンテナは、Kubernetesクラスター上の[計算リソース](/docs/concepts/configuration/manage-resources-containers/)の消費を制限されずに実行されます。リソースクォータを利用すれば、クラスター管理者はリソースの消費と作成を{{< glossary_tooltip text="名前空間" term_id="namespace" >}}ベースで制限することができます。名前空間内では、Podやコンテナは名前空間のリソースクォータで定義された範囲内でできるだけ多くのCPUとメモリーを消費できてしまうため、1つのPodまたはコンテナが利用可能なすべてのリソースを専有してしまう恐れがあります。LimitRangeを利用すれば、このような名前空間内での(Podやコンテナへの)リソースの割り当てを制限するポリシーを定めることができます。 + + + +*LimitRange*を利用すると、次のような制約を課せるようになります。 + +- 名前空間内のPodまたはコンテナごとに、計算リソースの使用量の最小値と最大値を強制する。 +- 名前空間内のPersistentVolumeClaimごとに、ストレージリクエストの最小値と最大値を強制する。 +- 名前空間内で、リソースのrequestとlimitの割合を強制する。 +- 名前空間内の計算リソースのデフォルトのrequest/limitの値を設定して、実行時にコンテナに自動的に注入する。 + +## LimitRangeを有効にする + +Kubernetes 1.10以降では、LimitRangeのサポートはデフォルトで有効になりました。 + +LimitRangeが特定の名前空間内で強制されるのは、その名前空間内にLimitRangeオブジェクトが存在する場合です。 + +LimitRangeオブジェクトの名前は、有効な[DNSサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)でなければなりません。 + +### Limit Rangeの概要 + +- 管理者は、1つの名前空間に1つのLimitRangeを作成します。 +- ユーザーは、Pod、コンテナ、PersistentVolumeClaimのようなリソースを名前空間内に作成します。 +- `LimitRanger`アドミッションコントローラーは、計算リソース要求が設定されていないすべてのPodとコンテナに対して、デフォルト値と制限値を強制します。そして、リソースの使用量を追跡し、名前空間内に存在するすべてのLimitRangeで定義された最小値、最大値、割合を外れないことを保証します。 +- LimitRangeの制約を破るようなリソース(Pod、コンテナ、PersistentVolumeClaim)の作成や更新を行うと、APIサーバーへのリクエストがHTTPステータスコード`403 FORBIDDEN`で失敗し、破られた制約を説明するメッセージが返されます。 +- 名前空間内でLimitRangeが`cpu`や`memory`などの計算リソースに対して有効になっている場合、ユーザーはrequestsやlimitsに値を指定しなければなりません。指定しなかった場合、システムはPodの作成を拒否する可能性があります。 +- LimitRangeの検証は、Podのアドミッションステージでのみ発生し、実行中のPodでは発生しません。 + +以下は、LimitRangeを使用して作成できるポリシーの例です。 + +- 8GiBのRAMと16コアのCPUの容量がある2ノードのクラスター上で、名前空間内のPodに対して、CPUには100mのrequestと最大500mのlimitの制約を課し、メモリーには200Miのrequestと600Miのlimitの制約を課す。 +- Spec内のrequestsにcpuやmemoryを指定せずに起動したコンテナに対して、CPUにはデフォルトで150mのlimitとrequestを、メモリーにはデフォルトで300Miのrequestをそれぞれ定義する。 + +名前空間のlimitの合計が、Podやコンテナのlimitの合計よりも小さくなる場合、リソースの競合が起こる可能性があります。その場合、コンテナやPodは作成されません。 + +LimitRangeに対する競合や変更は、すでに作成済みのリソースに対しては影響しません。 + +## {{% heading "whatsnext" %}} + +より詳しい情報は、[LimitRangerの設計ドキュメント](https://git.k8s.io/community/contributors/design-proposals/resource-management/admission_control_limit_range.md)を参照してください。 + +制限の使用例については、以下のページを読んでください。 + +- [名前空間ごとにCPUの最小値と最大値の制約を設定する方法](/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/)。 +- [名前空間ごとにメモリーの最小値と最大値の制約を設定する方法](/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/)。 +- [名前空間ごとにCPUのRequestとLimitのデフォルト値を設定する方法](/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/)。 +- [名前空間ごとにメモリーのRequestとLimitのデフォルト値を設定する方法](/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/)。 +- [名前空間ごとにストレージ消費量の最小値と最大値を設定する方法](/docs/tasks/administer-cluster/limit-storage-consumption/#limitrange-to-limit-requests-for-storage)。 +- [名前空間ごとのクォータを設定する詳細な例](/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/)。 diff --git a/content/ja/docs/concepts/scheduling-eviction/_index.md b/content/ja/docs/concepts/scheduling-eviction/_index.md new file mode 100644 index 0000000000..37b8e9507f --- /dev/null +++ b/content/ja/docs/concepts/scheduling-eviction/_index.md @@ -0,0 +1,8 @@ +--- +title: "スケジューリングと退避" +weight: 90 +description: > + Kubernetesにおいてスケジューリングとは、稼働させたいPodをNodeにマッチさせ、kubeletが実行できるようにすることを指します。 + 退避とは、リソース不足のNodeで1つ以上のPodを積極的に停止させるプロセスです。 +--- + diff --git a/content/ja/docs/concepts/scheduling/kube-scheduler.md b/content/ja/docs/concepts/scheduling-eviction/kube-scheduler.md similarity index 96% rename from content/ja/docs/concepts/scheduling/kube-scheduler.md rename to content/ja/docs/concepts/scheduling-eviction/kube-scheduler.md index 4e7d14284d..513b7d48a1 100644 --- a/content/ja/docs/concepts/scheduling/kube-scheduler.md +++ b/content/ja/docs/concepts/scheduling-eviction/kube-scheduler.md @@ -104,7 +104,7 @@ kube-schedulerは、デフォルトで用意されているスケジューリン - `ImageLocalityPriority`: すでにPodに対するコンテナイメージをローカルにキャッシュしているNodeを優先します。 -- `ServiceSpreadingPriority`: このポリシーの目的は、特定のServiceに対するバックエンドのPodが、それぞれ異なるNodeで実行されるようにすることです。このポリシーではServiceのバックエンドのPodが既に実行されていないNode上にスケジュールするように優先します。これによる結果として、Serviceは単体のNode障害に対してより耐障害性が高まります。 +- `ServiceSpreadingPriority`: このポリシーの目的は、特定のServiceに対するバックエンドのPodが、それぞれ異なるNodeで実行されるようにすることです。このポリシーではServiceのバックエンドのPodがすでに実行されていないNode上にスケジュールするように優先します。これによる結果として、Serviceは単体のNode障害に対してより耐障害性が高まります。 - `CalculateAntiAffinityPriorityMap`: このポリシーは[PodのAnti-Affinity](/ja/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity)の実装に役立ちます。 @@ -113,7 +113,7 @@ kube-schedulerは、デフォルトで用意されているスケジューリン ## {{% heading "whatsnext" %}} -* [スケジューラーのパフォーマンスチューニング](/docs/concepts/scheduling/scheduler-perf-tuning/)を参照してください。 +* [スケジューラーのパフォーマンスチューニング](/ja/docs/concepts/scheduling-eviction/scheduler-perf-tuning/)を参照してください。 * [Podトポロジーの分散制約](/docs/concepts/workloads/pods/pod-topology-spread-constraints/)を参照してください。 * kube-schedulerの[リファレンスドキュメント](/docs/reference/command-line-tools-reference/kube-scheduler/)を参照してください。 * [複数のスケジューラーの設定](/docs/tasks/administer-cluster/configure-multiple-schedulers/)について学んでください。 diff --git a/content/ja/docs/concepts/scheduling/scheduler-perf-tuning.md b/content/ja/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md similarity index 88% rename from content/ja/docs/concepts/scheduling/scheduler-perf-tuning.md rename to content/ja/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md index 2a096295a1..7adfe28827 100644 --- a/content/ja/docs/concepts/scheduling/scheduler-perf-tuning.md +++ b/content/ja/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md @@ -8,9 +8,9 @@ weight: 70 {{< feature-state for_k8s_version="1.14" state="beta" >}} -[kube-scheduler](/docs/concepts/scheduling/kube-scheduler/#kube-scheduler)はKubernetesのデフォルトのスケジューラーです。クラスター内のノード上にPodを割り当てる責務があります。 +[kube-scheduler](/ja/docs/concepts/scheduling-eviction/kube-scheduler/#kube-scheduler)はKubernetesのデフォルトのスケジューラーです。クラスター内のノード上にPodを割り当てる責務があります。 -クラスター内に存在するノードで、Podのスケジューリング要求を満たすものはPodに対して_割り当て可能_ なノードと呼ばれます。スケジューラーはPodに対する割り当て可能なノードをみつけ、それらの割り当て可能なノードにスコアをつけます。その中から最も高いスコアのノードを選択し、Podに割り当てるためのいくつかの関数を実行します。スケジューラーは_Binding_ と呼ばれる処理中において、APIサーバーに対して割り当てが決まったノードの情報を通知します。 +クラスター内に存在するノードで、Podのスケジューリング要求を満たすものはPodに対して*割り当て可能*なノードと呼ばれます。スケジューラーはPodに対する割り当て可能なノードをみつけ、それらの割り当て可能なノードにスコアをつけます。その中から最も高いスコアのノードを選択し、Podに割り当てるためのいくつかの関数を実行します。スケジューラーは*Binding*と呼ばれる処理中において、APIサーバーに対して割り当てが決まったノードの情報を通知します。 このページでは、大規模のKubernetesクラスターにおけるパフォーマンス最適化のためのチューニングについて説明します。 @@ -35,11 +35,11 @@ algorithmSource: percentageOfNodesToScore: 50 ``` -{{< note >}} +{{< note >}} 割り当て可能なノードが50未満のクラスターにおいては、割り当て可能なノードの探索を止めるほどノードが多くないため、スケジューラーは全てのノードをチェックします。 {{< /note >}} -**この機能を無効にするためには**、`percentageOfNodesToScore`を100に設定してください。 +**この機能を無効にするためには**、`percentageOfNodesToScore`を100に設定してください。 ### percentageOfNodesToScoreのチューニング diff --git a/content/ja/docs/concepts/scheduling-eviction/taint-and-toleration.md b/content/ja/docs/concepts/scheduling-eviction/taint-and-toleration.md new file mode 100644 index 0000000000..90930357a8 --- /dev/null +++ b/content/ja/docs/concepts/scheduling-eviction/taint-and-toleration.md @@ -0,0 +1,221 @@ +--- +title: TaintとToleration +content_type: concept +weight: 40 +--- + + + +[_Nodeアフィニティ_](/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity)は +{{< glossary_tooltip text="Pod" term_id="pod" >}}の属性であり、ある{{< glossary_tooltip text="Node" term_id="node" >}}群を*引きつけます*(優先条件または必須条件)。反対に _taint_ はNodeがある種のPodを排除できるようにします。 + +_toleration_ はPodに適用され、一致するtaintが付与されたNodeへPodがスケジューリングされることを認めるものです。ただしそのNodeへ必ずスケジューリングされるとは限りません。 + +taintとtolerationは組になって機能し、Podが不適切なNodeへスケジューリングされないことを保証します。taintはNodeに一つまたは複数個付与することができます。これはそのNodeがtaintを許容しないPodを受け入れるべきではないことを示します。 + + + + +## コンセプト + +Nodeにtaintを付与するには[kubectl taint](/docs/reference/generated/kubectl/kubectl-commands#taint)コマンドを使用します。 +例えば、次のコマンドは + +```shell +kubectl taint nodes node1 key=value:NoSchedule +``` + +`node1`にtaintを設定します。このtaintのキーは`key`、値は`value`、taintの効果は`NoSchedule`です。 +これは`node1`にはPodに合致するtolerationがなければスケジューリングされないことを意味します。 + +上記のコマンドで付与したtaintを外すには、下記のコマンドを使います。 +```shell +kubectl taint nodes node1 key:NoSchedule- +``` + +PodのtolerationはPodSpecの中に指定します。下記のtolerationはどちらも、上記の`kubectl taint`コマンドで追加したtaintと合致するため、どちらのtolerationが設定されたPodも`node1`へスケジューリングされることができます。 + +```yaml +tolerations: +- key: "key" + operator: "Equal" + value: "value" + effect: "NoSchedule" +``` + +```yaml +tolerations: +- key: "key" + operator: "Exists" + effect: "NoSchedule" +``` + +tolerationを設定したPodの例を示します。 + +{{< codenew file="pods/pod-with-toleration.yaml" >}} + +`operator`のデフォルトは`Equal`です。 + +tolerationがtaintと合致するのは、`key`と`effect`が同一であり、さらに下記の条件のいずれかを満たす場合です。 + +* `operator`が`Exists`(`value`を指定すべきでない場合) +* `operator`が`Equal`であり、かつ`value`が同一である場合 + +{{< note >}} + +2つ特殊な場合があります。 + +空の`key`と演算子`Exists`は全ての`key`、`value`、`effect`と一致するため、すべてのtaintと合致します。 + +空の`effect`は`key`が一致する全てのeffectと合致します。 + +{{< /note >}} + +上記の例では`effect`に`NoSchedule`を指定しました。代わりに、`effect`に`PreferNoSchedule`を指定することができます。 +これは`NoSchedule`の「ソフトな」バージョンであり、システムはtaintに対応するtolerationが設定されていないPodがNodeへ配置されることを避けようとしますが、必須の条件とはしません。3つ目の`effect`の値として`NoExecute`がありますが、これについては後述します。 + +同一のNodeに複数のtaintを付与することや、同一のPodに複数のtolerationを設定することができます。 +複数のtaintやtolerationが設定されている場合、Kubernetesはフィルタのように扱います。最初はNodeの全てのtaintがある状態から始め、Podが対応するtolerationを持っているtaintは無視され外されていきます。無視されずに残ったtaintが効果を及ぼします。 +具体的には、 + +* effect `NoSchedule`のtaintが無視されず残った場合、KubernetesはそのPodをNodeへスケジューリングしません。 +* effect `NoSchedule`のtaintは残らず、effect `PreferNoSchedule`のtaintは残った場合、KubernetesはそのNodeへのスケジューリングをしないように試みます。 +* effect `NoExecute`のtaintが残った場合、既に稼働中のPodはそのNodeから排除され、まだ稼働していないPodはスケジューリングされないようになります。 + +例として、下記のようなtaintが付与されたNodeを考えます。 + +```shell +kubectl taint nodes node1 key1=value1:NoSchedule +kubectl taint nodes node1 key1=value1:NoExecute +kubectl taint nodes node1 key2=value2:NoSchedule +``` + +Podには2つのtolerationが設定されています。 + +```yaml +tolerations: +- key: "key1" + operator: "Equal" + value: "value1" + effect: "NoSchedule" +- key: "key1" + operator: "Equal" + value: "value1" + effect: "NoExecute" +``` + +この例では、3つ目のtaintと合致するtolerationがないため、PodはNodeへはスケジューリングされません。 +しかし、これらのtaintが追加された時点で、そのNodeでPodが稼働していれば続けて稼働することが可能です。 これは、Podのtolerationと合致しないtaintは3つあるtaintのうちの3つ目のtaintのみであり、それが`NoSchedule`であるためです。 + +一般に、effect `NoExecute`のtaintがNodeに追加されると、合致するtolerationが設定されていないPodは即時にNodeから排除され、合致するtolerationが設定されたPodが排除されることは決してありません。 +しかし、effect`NoExecute`に対するtolerationは`tolerationSeconds`フィールドを任意で指定することができ、これはtaintが追加された後にそのNodeにPodが残る時間を示します。例えば、 + +```yaml +tolerations: +- key: "key1" + operator: "Equal" + value: "value1" + effect: "NoExecute" + tolerationSeconds: 3600 +``` + +この例のPodが稼働中で、対応するtaintがNodeへ追加された場合、PodはそのNodeに3600秒残り、その後排除されます。仮にtaintがそれよりも前に外された場合、Podは排除されません。 + +## ユースケースの例 + +taintとtolerationは、実行されるべきではないNodeからPodを遠ざけたり、排除したりするための柔軟な方法です。いくつかのユースケースを示します。 + +* **専有Node**: あるNode群を特定のユーザーに専有させたい場合、そのNode群へtaintを追加し(`kubectl taint nodes nodename dedicated=groupName:NoSchedule`) 対応するtolerationをPodへ追加します(これを実現する最も容易な方法はカスタム +[アドミッションコントローラー](/docs/reference/access-authn-authz/admission-controllers/)を書くことです)。 +tolerationが設定されたPodはtaintの設定された(専有の)Nodeと、クラスターにあるその他のNodeの使用が認められます。もしPodが必ず専有Node*のみ*を使うようにしたい場合は、taintと同様のラベルをそのNode群に設定し(例: `dedicated=groupName`)、アドミッションコントローラーはNodeアフィニティを使ってPodが`dedicated=groupName`のラベルの付いたNodeへスケジューリングすることが必要であるということも設定する必要があります。 + +* **特殊なハードウェアを備えるNode**: クラスターの中の少数のNodeが特殊なハードウェア(例えばGPU)を備える場合、そのハードウェアを必要としないPodがスケジューリングされないようにして、後でハードウェアを必要とするPodができたときの余裕を確保したいことがあります。 +これは特殊なハードウェアを持つNodeにtaintを追加(例えば `kubectl taint nodes nodename special=true:NoSchedule` または +`kubectl taint nodes nodename special=true:PreferNoSchedule`)して、ハードウェアを使用するPodに対応するtolerationを追加することで可能です。 +専有Nodeのユースケースと同様に、tolerationを容易に適用する方法はカスタム +[アドミッションコントローラー](/docs/reference/access-authn-authz/admission-controllers/)を使うことです。 +例えば、特殊なハードウェアを表すために[拡張リソース](/docs/concepts/configuration/manage-compute-resources-container/#extended-resources) +を使い、ハードウェアを備えるNodeに拡張リソースの名称のtaintを追加して、 +[拡張リソースtoleration](/docs/reference/access-authn-authz/admission-controllers/#extendedresourcetoleration) +アドミッションコントローラーを実行することが推奨されます。Nodeにはtaintが付与されているため、tolerationのないPodはスケジューリングされません。しかし拡張リソースを要求するPodを作成しようとすると、`拡張リソースtoleration` アドミッションコントローラーはPodに自動的に適切なtolerationを設定し、Podはハードウェアを備えるNodeへスケジューリングされます。 +これは特殊なハードウェアを備えたNodeではそれを必要とするPodのみが稼働し、Podに対して手作業でtolerationを追加しなくて済むようにします。 + +* **taintを基にした排除**: Nodeに問題が起きたときにPodごとに排除する設定を行うことができます。次のセクションにて説明します。 + +## taintを基にした排除 + +{{< feature-state for_k8s_version="v1.18" state="stable" >}} + +上述したように、effect `NoExecute`のtaintはNodeで実行中のPodに次のような影響を与えます。 + + * 対応するtolerationのないPodは即座に除外される + * 対応するtolerationがあり、それに`tolerationSeconds`が指定されていないPodは残り続ける + * 対応するtolerationがあり、それに`tolerationSeconds`が指定されているPodは指定された間、残される + +Nodeコントローラーは特定の条件を満たす場合に自動的にtaintを追加します。 +組み込まれているtaintは下記の通りです。 + + * `node.kubernetes.io/not-ready`: Nodeの準備ができていない場合。これはNodeCondition `Ready`が`False`である場合に対応します。 + * `node.kubernetes.io/unreachable`: NodeがNodeコントローラーから到達できない場合。これはNodeCondition`Ready`が`Unknown`の場合に対応します。 + * `node.kubernetes.io/out-of-disk`: Nodeのディスクの空きがない場合。 + * `node.kubernetes.io/memory-pressure`: Nodeのメモリーが不足している場合。 + * `node.kubernetes.io/disk-pressure`: Nodeのディスクが不足している場合。 + * `node.kubernetes.io/network-unavailable`: Nodeのネットワークが利用できない場合。 + * `node.kubernetes.io/unschedulable`: Nodeがスケジューリングできない場合。 + * `node.cloudprovider.kubernetes.io/uninitialized`: kubeletが外部のクラウド事業者により起動されたときに設定されるtaintで、このNodeは利用不可能であることを示します。cloud-controller-managerによるコントローラーがこのNodeを初期化した後にkubeletはこのtaintを外します。 + +Nodeから追い出すときには、Nodeコントローラーまたはkubeletは関連するtaintを`NoExecute`効果の状態で追加します。 +不具合のある状態から通常の状態へ復帰した場合は、kubeletまたはNodeコントローラーは関連するtaintを外すことができます。 + +{{< note >}} +コントロールプレーンは新しいtaintをNodeに加えるレートを制限しています。 +このレート制限は一度に多くのNodeが到達不可能になった場合(例えばネットワークの断絶)に、退役させられるNodeの数を制御します。 +{{< /note >}} + +Podに`tolerationSeconds`を指定することで不具合があるか応答のないNodeに残る時間を指定することができます。 + +例えば、ローカルの状態を多数持つアプリケーションとネットワークが分断された場合を考えます。ネットワークが復旧して、Podを排除しなくて済むことを見込んで、長時間Nodeから排除されないようにしたいこともあるでしょう。 +この場合Podに設定するtolerationは次のようになります。 + +```yaml +tolerations: +- key: "node.kubernetes.io/unreachable" + operator: "Exists" + effect: "NoExecute" + tolerationSeconds: 6000 +``` + +{{< note >}} +Kubernetesはユーザーまたはコントローラーが明示的に指定しない限り、自動的に`node.kubernetes.io/not-ready`と`node.kubernetes.io/unreachable`に対するtolerationを`tolerationSeconds=300`にて設定します。 + +自動的に設定されるtolerationは、taintに対応する問題がNodeで検知されても5分間はそのNodeにPodが残されることを意味します。 +{{< /note >}} + +[DaemonSet](/docs/concepts/workloads/controllers/daemonset/)のPodは次のtaintに対して`NoExecute`のtolerationが`tolerationSeconds`を指定せずに設定されます。 + + * `node.kubernetes.io/unreachable` + * `node.kubernetes.io/not-ready` + +これはDaemonSetのPodはこれらの問題によって排除されないことを保証します。 + +## 条件によるtaintの付与 + +NodeのライフサイクルコントローラーはNodeの状態に応じて`NoSchedule`効果のtaintを付与します。 +スケジューラーはNodeの状態ではなく、taintを確認します。 +Nodeに何がスケジューリングされるかは、そのNodeの状態に影響されないことを保証します。ユーザーは適切なtolerationをPodに付与することで、どの種類のNodeの問題を無視するかを選ぶことができます。 + +DaemonSetのコントローラーは、DaemonSetが中断されるのを防ぐために自動的に次の`NoSchedule`tolerationを全てのDaemonSetに付与します。 + + * `node.kubernetes.io/memory-pressure` + * `node.kubernetes.io/disk-pressure` + * `node.kubernetes.io/out-of-disk` (*重要なPodのみ*) + * `node.kubernetes.io/unschedulable` (1.10またはそれ以降) + * `node.kubernetes.io/network-unavailable` (*ホストネットワークのみ*) + +これらのtolerationを追加することは後方互換性を保証します。DaemonSetに任意のtolerationを加えることもできます。 + + +## {{% heading "whatsnext" %}} + +* [リソース枯渇の対処](/docs/tasks/administer-cluster/out-of-resource/)とどのような設定ができるかについてを読む +* [Podの優先度](/docs/concepts/configuration/pod-priority-preemption/)を読む diff --git a/content/ja/docs/concepts/scheduling/_index.md b/content/ja/docs/concepts/scheduling/_index.md deleted file mode 100644 index c428c68198..0000000000 --- a/content/ja/docs/concepts/scheduling/_index.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "スケジューリング" -weight: 90 ---- - diff --git a/content/ja/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases.md b/content/ja/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases.md new file mode 100644 index 0000000000..5c89abf5e7 --- /dev/null +++ b/content/ja/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases.md @@ -0,0 +1,118 @@ +--- +title: HostAliasesを使用してPodの/etc/hostsにエントリーを追加する +content_type: concept +weight: 60 +min-kubernetes-server-version: 1.7 +--- + + + + +Podの`/etc/hosts`ファイルにエントリーを追加すると、DNSやその他の選択肢を利用できない場合に、Podレベルでホスト名の名前解決を上書きできるようになります。このようなカスタムエントリーは、PodSpecのHostAliasesフィールドに追加できます。 + +HostAliasesを使用せずにファイルを修正することはおすすめできません。このファイルはkubeletが管理しており、Podの作成や再起動時に上書きされる可能性があるためです。 + + + + +## デフォルトのhostsファイルの内容 + +Nginx Podを実行すると、Pod IPが割り当てられます。 + +```shell +kubectl run nginx --image nginx +``` + +``` +pod/nginx created +``` + +Pod IPを確認します。 + +```shell +kubectl get pods --output=wide +``` + +``` +NAME READY STATUS RESTARTS AGE IP NODE +nginx 1/1 Running 0 13s 10.200.0.4 worker0 +``` + +hostsファイルの内容は次のようになります。 + +```shell +kubectl exec nginx -- cat /etc/hosts +``` + +``` +# Kubernetes-managed hosts file. +127.0.0.1 localhost +::1 localhost ip6-localhost ip6-loopback +fe00::0 ip6-localnet +fe00::0 ip6-mcastprefix +fe00::1 ip6-allnodes +fe00::2 ip6-allrouters +10.200.0.4 nginx +``` + +デフォルトでは、`hosts`ファイルには、`localhost`やPod自身のホスト名などのIPv4とIPv6のボイラープレートだけが含まれています。 + +## 追加エントリーをhostAliasesに追加する + +デフォルトのボイラープレートに加えて、`hosts`ファイルに追加エントリーを追加できます。たとえば、`foo.local`と`bar.local`を`127.0.0.1`に、`foo.remote`と`bar.remote`を`10.1.2.3`にそれぞれ解決するためには、PodのHostAliasesを`.spec.hostAliases`以下に設定します。 + +{{< codenew file="service/networking/hostaliases-pod.yaml" >}} + +この設定を使用したPodを開始するには、次のコマンドを実行します。 + +```shell +kubectl apply -f https://k8s.io/examples/service/networking/hostaliases-pod.yaml +``` + +``` +pod/hostaliases-pod created +``` + +Podの詳細情報を表示して、IPv4アドレスと状態を確認します。 + +```shell +kubectl get pod --output=wide +``` + +``` +NAME READY STATUS RESTARTS AGE IP NODE +hostaliases-pod 0/1 Completed 0 6s 10.200.0.5 worker0 +``` + +`hosts`ファイルの内容は次のようになります。 + +```shell +kubectl logs hostaliases-pod +``` + +``` +# Kubernetes-managed hosts file. +127.0.0.1 localhost +::1 localhost ip6-localhost ip6-loopback +fe00::0 ip6-localnet +fe00::0 ip6-mcastprefix +fe00::1 ip6-allnodes +fe00::2 ip6-allrouters +10.200.0.5 hostaliases-pod + +# Entries added by HostAliases. +127.0.0.1 foo.local bar.local +10.1.2.3 foo.remote bar.remote +``` + +ファイルの最後に追加エントリーが指定されています。 + +## kubeletがhostsファイルを管理するのはなぜですか? {#why-does-kubelet-manage-the-hosts-file} + +kubeletがPodの各コンテナの`hosts`ファイルを[管理する](https://github.com/kubernetes/kubernetes/issues/14633)のは、コンテナ起動後にDockerがファイルを[編集する](https://github.com/moby/moby/issues/17190)のを防ぐためです。 + +{{< caution >}} +コンテナ内部でhostsファイルを手動で変更するのは控えてください。 + +hostsファイルを手動で変更すると、コンテナが終了したときに変更が失われてしまいます。 +{{< /caution >}} diff --git a/content/ja/docs/concepts/services-networking/dual-stack.md b/content/ja/docs/concepts/services-networking/dual-stack.md new file mode 100644 index 0000000000..4dd77cf2bb --- /dev/null +++ b/content/ja/docs/concepts/services-networking/dual-stack.md @@ -0,0 +1,100 @@ +--- +title: IPv4/IPv6デュアルスタック +feature: + title: IPv4/IPv6デュアルスタック + description: > + IPv4およびIPv6のアドレスをPodとServiceに割り当てる +content_type: concept +weight: 70 +--- + + + +{{< feature-state for_k8s_version="v1.16" state="alpha" >}} + + IPv4/IPv6デュアルスタックを利用すると、IPv4とIPv6のアドレスの両方を{{< glossary_tooltip text="Pod" term_id="pod" >}}および{{< glossary_tooltip text="Service" term_id="service" >}}に指定できるようになります。 + + KubernetesクラスターでIPv4/IPv6デュアルスタックのネットワークを有効にすれば、クラスターはIPv4とIPv6のアドレスの両方を同時に割り当てることをサポートするようになります。 + + + +## サポートされている機能 + +KubernetesクラスターでIPv4/IPv6デュアルスタックを有効にすると、以下の機能が提供されます。 + + * デュアルスタックのPodネットワーク(PodごとにIPv4とIPv6のアドレスが1つずつ割り当てられます) + * IPv4およびIPv6が有効化されたService(各Serviceは1つのアドレスファミリーでなければなりません) + * IPv4およびIPv6インターフェイスを経由したPodのクラスター外向きの(たとえば、インターネットへの)ルーティング + +## 前提条件 + +IPv4/IPv6デュアルスタックのKubernetesクラスターを利用するには、以下の前提条件を満たす必要があります。 + + * Kubernetesのバージョンが1.16以降である + * プロバイダーがデュアルスタックのネットワークをサポートしている(クラウドプロバイダーなどが、ルーティング可能なIPv4/IPv6ネットワークインターフェイスが搭載されたKubernetesを提供可能である) + * ネットワークプラグインがデュアルスタックに対応している(KubenetやCalicoなど) + +## IPv4/IPv6デュアルスタックを有効にする + +IPv4/IPv6デュアルスタックを有効にするには、クラスターの関連コンポーネントで`IPv6DualStack`[フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)を有効にして、デュアルスタックのクラスターネットワークの割り当てを以下のように設定します。 + + * kube-apiserver: + * `--feature-gates="IPv6DualStack=true"` + * kube-controller-manager: + * `--feature-gates="IPv6DualStack=true"` + * `--cluster-cidr=,` + * `--service-cluster-ip-range=,` + * `--node-cidr-mask-size-ipv4|--node-cidr-mask-size-ipv6` デフォルトのサイズは、IPv4では/24、IPv6では/64です + * kubelet: + * `--feature-gates="IPv6DualStack=true"` + * kube-proxy: + * `--cluster-cidr=,` + * `--feature-gates="IPv6DualStack=true"` + +{{< note >}} +IPv4 CIDRの例: `10.244.0.0/16` (自分のクラスターのアドレス範囲を指定してください) + +IPv6 CIDRの例: `fdXY:IJKL:MNOP:15::/64` (これはフォーマットを示すための例であり、有効なアドレスではありません。詳しくは[RFC 4193](https://tools.ietf.org/html/rfc4193)を参照してください) + +{{< /note >}} + +## Service + +クラスターでIPv4/IPv6デュアルスタックのネットワークを有効にした場合、IPv4またはIPv6のいずれかのアドレスを持つ{{< glossary_tooltip text="Service" term_id="service" >}}を作成できます。Serviceのcluster IPのアドレスファミリーは、Service上に`.spec.ipFamily`フィールドを設定することで選択できます。このフィールドを設定できるのは、新しいServiceの作成時のみです。`.spec.ipFamily`フィールドの指定はオプションであり、{{< glossary_tooltip text="Service" term_id="service" >}}と{{< glossary_tooltip text="Ingress" term_id="ingress" >}}でIPv4とIPv6を有効にする予定がある場合にのみ使用するべきです。このフィールドの設定は、[外向きのトラフィック](#egress-traffic)に対する要件には含まれません。 + +{{< note >}} +クラスターのデフォルトのアドレスファミリーは、kube-controller-managerに`--service-cluster-ip-range`フラグで設定した、最初のservice cluster IPの範囲のアドレスファミリーです。 +{{< /note >}} + +`.spec.ipFamily`は、次のいずれかに設定できます。 + + * `IPv4`: APIサーバーは`ipv4`の`service-cluster-ip-range`の範囲からIPアドレスを割り当てます + * `IPv6`: APIサーバーは`ipv6`の`service-cluster-ip-range`の範囲からIPアドレスを割り当てます + +次のServiceのspecには`ipFamily`フィールドが含まれていません。Kubernetesは、最初に設定した`service-cluster-ip-range`の範囲からこのServiceにIPアドレス(別名「cluster IP」)を割り当てます。 + +{{< codenew file="service/networking/dual-stack-default-svc.yaml" >}} + +次のServiceのspecには`ipFamily`フィールドが含まれています。Kubernetesは、最初に設定した`service-cluster-ip-range`の範囲からこのServiceにIPv6のアドレス(別名「cluster IP」)を割り当てます。 + +{{< codenew file="service/networking/dual-stack-ipv6-svc.yaml" >}} + +比較として次のServiceのspecを見ると、このServiceには最初に設定した`service-cluster-ip-range`の範囲からIPv4のアドレス(別名「cluster IP」)が割り当てられます。 + +{{< codenew file="service/networking/dual-stack-ipv4-svc.yaml" >}} + +### Type LoadBalancer + +IPv6が有効になった外部ロードバランサーをサポートしているクラウドプロバイダーでは、`type`フィールドに`LoadBalancer`を指定し、`ipFamily`フィールドに`IPv6`を指定することにより、クラウドロードバランサーをService向けにプロビジョニングできます。 + +## 外向きのトラフィック {#egress-traffic} + +パブリックおよび非パブリックでのルーティングが可能なIPv6アドレスのブロックを利用するためには、クラスターがベースにしている{{< glossary_tooltip text="CNI" term_id="cni" >}}プロバイダーがIPv6の転送を実装している必要があります。もし非パブリックでのルーティングが可能なIPv6アドレスを使用するPodがあり、そのPodをクラスター外の送信先(例:パブリックインターネット)に到達させたい場合、外向きのトラフィックと応答の受信のためにIPマスカレードを設定する必要があります。[ip-masq-agent](https://github.com/kubernetes-incubator/ip-masq-agent)はデュアルスタックに対応しているため、デュアルスタックのクラスター上でのIPマスカレードにはip-masq-agentが利用できます。 + +## 既知の問題 + + * Kubenetは、IPv4,IPv6の順番にIPを報告することを強制します(--cluster-cidr) + +## {{% heading "whatsnext" %}} + +* [IPv4/IPv6デュアルスタックのネットワークを検証する](/docs/tasks/network/validate-dual-stack) diff --git a/content/ja/docs/concepts/services-networking/ingress-controllers.md b/content/ja/docs/concepts/services-networking/ingress-controllers.md new file mode 100644 index 0000000000..f19d21ef43 --- /dev/null +++ b/content/ja/docs/concepts/services-networking/ingress-controllers.md @@ -0,0 +1,57 @@ +--- +title: Ingressコントローラー +reviewers: +content_type: concept +weight: 40 +--- + + + +Ingressリソースが動作するためには、クラスターでIngressコントローラーが実行されている必要があります。 + +`kube-controller-manager`バイナリの一部として実行される他のタイプのコントローラーとは異なり、Ingressコントローラーはクラスターで自動的に起動されません。このページを使用して、クラスターに最適なIngressコントローラーの実装を選択してください。 + +プロジェクトとしてのKubernetesは現在、[GCE](https://git.k8s.io/ingress-gce/README.md)と[nginx](https://git.k8s.io/ingress-nginx/README.md)のコントローラーをサポートし、保守しています。 + + + + + +## 追加のコントローラー {#additional-controllers} + +* [AKS Application Gateway Ingress Controller](https://github.com/Azure/application-gateway-kubernetes-ingress)は[Azure Application Gateway](https://docs.microsoft.com/azure/application-gateway/overview)を利用して[AKSクラスター](https://docs.microsoft.com/azure/aks/kubernetes-walkthrough-portal)でIngressを実行可能にするIngressコントローラーです。 +* [Ambassador](https://www.getambassador.io/) API Gatewayは[Envoy](https://www.envoyproxy.io)ベースのIngressコントローラーで、[Datawire](https://www.datawire.io/)による[コミュニティ版](https://www.getambassador.io/docs)または[商用版](https://www.getambassador.io/pro/)のサポートがあります。 +* [AppsCode Inc.](https://appscode.com)では、最も広く使用されている[HAProxy](http://www.haproxy.org/)ベースのIngressコントローラーである[Voyager](https://appscode.com/products/voyager)のサポートと保守を提供しています。 +* [AWS ALB Ingress Controller](https://github.com/kubernetes-sigs/aws-alb-ingress-controller)は[AWS Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/)を使用したIngressを有効にします。 +* [Contour](https://projectcontour.io/)は、VMwareが提供し、サポートしている[Envoy](https://www.envoyproxy.io/)ベースのIngressコントローラーです。 +* Citrixは、[ベアメタル](https://github.com/citrix/citrix-k8s-ingress-controller/tree/master/deployment/baremetal)と[クラウド](https://github.com/citrix/citrix-k8s-ingress-controller/tree/master/deployment)のデプロイ用に、ハードウェア(MPX)、仮想化(VPX)、[フリーコンテナ化(CPX) ADC](https://www.citrix.com/products/citrix-adc/cpx-express.html)用の[Ingressコントローラー](https://github.com/citrix/citrix-k8s-ingress-controller)を提供しています。 +* F5 Networksは[F5 BIG-IP Controller for Kubernetes](http://clouddocs.f5.com/products/connectors/k8s-bigip-ctlr/latest)の[サポートと保守](https://support.f5.com/csp/article/K86859508)を提供しています。 +* [Gloo](https://gloo.solo.io)は[Envoy](https://www.envoyproxy.io)をベースにしたオープンソースのIngressコントローラーで、[solo.io](https://www.solo.io)からのエンタープライズサポートでAPI Gateway機能を提供しています。 +* [HAProxy Ingress](https://haproxy-ingress.github.io)は、HAProxy用の高度にカスタマイズ可能なコミュニティ主導のIngressコントローラーです。 +* [HAProxy Technologies](https://www.haproxy.com/)は[HAProxy Ingress Controller for Kubernetes](https://github.com/haproxytech/kubernetes-ingress)のサポートと保守を提供しています。[公式ドキュメント](https://www.haproxy.com/documentation/hapee/1-9r1/traffic-management/kubernetes-ingress-controller/)を参照してください。 +* [Istio](https://istio.io/)ベースのIngressコントローラー[Control Ingress Traffic](https://istio.io/docs/tasks/traffic-management/ingress/)。 +* [Kong](https://konghq.com/)は、[Kong Ingress Controller for Kubernetes](https://github.com/Kong/kubernetes-ingress-controller)の[コミュニティ版](https://discuss.konghq.com/c/kubernetes)と[商用版]](https://konghq.com/kong-enterprise/)のサポートと保守を提供しています。 +* [NGINX, Inc.](https://www.nginx.com/)は[NGINX Ingress Controller for Kubernetes](https://www.nginx.com/products/nginx/kubernetes-ingress-controller)のサポートと保守を提供しています。 +* [Skipper](https://opensource.zalando.com/skipper/kubernetes/ingress-controller/)は、カスタムプロキシーを構築するためのライブラリーとして設計された、Kubernetes Ingressなどのユースケースを含む、サービス構成用のHTTPルーターとリバースプロキシーです。 +* [Traefik](https://github.com/containous/traefik)はフル機能([Let's Encrypt](https://letsencrypt.org), secrets, http2, websocket)のIngressコントローラーで、[Containous](https://containo.us/services)による商用サポートもあります。 + +## 複数のIngressコントローラーの使用 {#using-multiple-ingress-controllers} + +[Ingressコントローラーは、好きな数だけ](https://git.k8s.io/ingress-nginx/docs/user-guide/multiple-ingress.md#multiple-ingress-controllers))クラスターにデプロイすることができます。Ingressを作成する際には、クラスター内に複数のIngressコントローラーが存在する場合にどのIngressコントローラーを使用するかを示すために適切な[`ingress.class`](https://git.k8s.io/ingress-gce/docs/faq/README.md#how-do-i-run-multiple-ingress-controllers-in-the-same-cluster)のアノテーションを指定します。 + +クラスを定義しない場合、クラウドプロバイダーはデフォルトのIngressコントローラーを使用する場合があります。 + +理想的には、すべてのIngressコントローラーはこの仕様を満たすべきですが、いくつかのIngressコントローラーはわずかに異なる動作をします。 + + +{{< note >}} +Ingressコントローラーのドキュメントを確認して、選択する際の注意点を理解してください。 +{{< /note >}} + + + +## {{% heading "whatsnext" %}} + + +* [Ingress](/ja/docs/concepts/services-networking/ingress/)の詳細 +* [Set up Ingress on Minikube with the NGINX Controller](/docs/tasks/access-application-cluster/ingress-minikube) diff --git a/content/ja/docs/concepts/workloads/controllers/cron-jobs.md b/content/ja/docs/concepts/workloads/controllers/cron-jobs.md index acc1ff3722..60e8e68370 100644 --- a/content/ja/docs/concepts/workloads/controllers/cron-jobs.md +++ b/content/ja/docs/concepts/workloads/controllers/cron-jobs.md @@ -46,7 +46,7 @@ Cannot determine if job needs to be started. Too many missed start time (> 100). 例として、CronJobが`08:30:00`を開始時刻として1分ごとに新しいJobをスケジュールするように設定され、`startingDeadlineSeconds`フィールドが設定されていない場合を想定します。CronJobコントローラーが`08:29:00` から`10:21:00`の間にダウンしていた場合、スケジューリングを逃したジョブの数が100を超えているため、ジョブは開始されません。 -このコンセプトを更に掘り下げるために、CronJobが`08:30:00`から1分ごとに新しいJobを作成し、`startingDeadlineSeconds`が200秒に設定されている場合を想定します。CronJobコントローラーが前回の例と同じ期間(`08:29:00` から`10:21:00`まで)にダウンしている場合でも、10:22:00時点でJobはまだ動作しています。このようなことは、過去200秒間(言い換えると、3回の失敗)に何回スケジュールが間に合わなかったをコントローラーが確認するときに発生します。これは最後にスケジュールされた時間から今までのものではありません。 +このコンセプトをさらに掘り下げるために、CronJobが`08:30:00`から1分ごとに新しいJobを作成し、`startingDeadlineSeconds`が200秒に設定されている場合を想定します。CronJobコントローラーが前回の例と同じ期間(`08:29:00` から`10:21:00`まで)にダウンしている場合でも、10:22:00時点でJobはまだ動作しています。このようなことは、過去200秒間(言い換えると、3回の失敗)に何回スケジュールが間に合わなかったをコントローラーが確認するときに発生します。これは最後にスケジュールされた時間から今までのものではありません。 CronJobはスケジュールに一致するJobの作成にのみ関与するのに対して、JobはJobが示すPod管理を担います。 diff --git a/content/ja/docs/concepts/workloads/controllers/deployment.md b/content/ja/docs/concepts/workloads/controllers/deployment.md index 8fae6041e8..f3b210ff4a 100644 --- a/content/ja/docs/concepts/workloads/controllers/deployment.md +++ b/content/ja/docs/concepts/workloads/controllers/deployment.md @@ -3,7 +3,7 @@ title: Deployment feature: title: 自動化されたロールアウトとロールバック description: > - Kubernetesはアプリケーションや設定への変更を段階的に行い、アプリケーションの状態を監視しながら、全てのインスタンスが同時停止しないようにします。更新に問題が起きたとき、Kubernetesは変更のロールバックを行います。進化を続けるDeploymnetのエコシステムを活用してください。 + Kubernetesはアプリケーションや設定への変更を段階的に行い、アプリケーションの状態を監視しながら、全てのインスタンスが同時停止しないようにします。更新に問題が起きたとき、Kubernetesは変更のロールバックを行います。進化を続けるDeploymentのエコシステムを活用してください。 content_type: concept weight: 30 @@ -1001,7 +1001,7 @@ Deploymentのセレクターに一致するラベルを持つPodを直接作成 Deploymentのリビジョン履歴は、Deploymentが管理するReplicaSetに保持されています。 -`.spec.revisionHistoryLimit`はオプションのフィールドで、ロールバック可能な古いReplicaSetの数を指定します。この古いReplicaSetは`etcd`内のリソースを消費し、`kubectl get rs`の出力結果を見にくくします。Deploymentの各リビジョンの設定はReplicaSetに保持されます。このため一度古いReplicaSetが削除されると、そのリビジョンのDeploymentにロールバックすることができなくなります。デフォルトでは10もの古いReplicaSetが保持されます。しかし、この値の最適値は新しいDeploymnetの更新頻度と安定性に依存します。 +`.spec.revisionHistoryLimit`はオプションのフィールドで、ロールバック可能な古いReplicaSetの数を指定します。この古いReplicaSetは`etcd`内のリソースを消費し、`kubectl get rs`の出力結果を見にくくします。Deploymentの各リビジョンの設定はReplicaSetに保持されます。このため一度古いReplicaSetが削除されると、そのリビジョンのDeploymentにロールバックすることができなくなります。デフォルトでは10もの古いReplicaSetが保持されます。しかし、この値の最適値は新しいDeploymentの更新頻度と安定性に依存します。 さらに詳しく言うと、この値を0にすると、0のレプリカを持つ古い全てのReplicaSetが削除されます。このケースでは、リビジョン履歴が完全に削除されているため新しいDeploymentのロールアウトを完了することができません。 diff --git a/content/ja/docs/concepts/workloads/controllers/job.md b/content/ja/docs/concepts/workloads/controllers/job.md new file mode 100644 index 0000000000..4a3849ee1e --- /dev/null +++ b/content/ja/docs/concepts/workloads/controllers/job.md @@ -0,0 +1,387 @@ +--- +title: Job +content_type: concept +feature: + title: バッチ実行 + description: > + Kubernetesはサービスに加えて、バッチやCIのワークロードを管理し、必要に応じて失敗したコンテナを置き換えることができます。 +weight: 60 +--- + + + +Jobは1つ以上のPodを作成し、指定された数のPodが正常に終了することを保証します。 +JobはPodの正常終了を追跡します。正常終了が指定された回数に達すると、そのタスク(つまりJob)は完了します。Jobを削除すると、そのJobが作成したPodがクリーンアップされます。 + +簡単な例としては、1つのPodを確実に実行して完了させるために、1つのJobオブジェクトを作成することです。 +ノードのハードウェア障害やノードの再起動などにより最初のPodが失敗したり削除されたりした場合、Jobオブジェクトは新たなPodを立ち上げます。 + +また、Jobを使用して複数のPodを並行して実行することもできます。 + + + + + + +## Jobの実行例 + +ここでは、Jobの設定例を示します。πの値を2000桁目まで計算して出力します。 +完了までに10秒程度かかります。 + +{{< codenew file="controllers/job.yaml" >}} + +このコマンドで例を実行できます。 + +```shell +kubectl apply -f https://kubernetes.io/examples/controllers/job.yaml +``` +``` +job.batch/pi created +``` + +Jobのステータスは、`kubectl`を用いて確認します。 + +```shell +kubectl describe jobs/pi +``` +``` +Name: pi +Namespace: default +Selector: controller-uid=c9948307-e56d-4b5d-8302-ae2d7b7da67c +Labels: controller-uid=c9948307-e56d-4b5d-8302-ae2d7b7da67c + job-name=pi +Annotations: kubectl.kubernetes.io/last-applied-configuration: + {"apiVersion":"batch/v1","kind":"Job","metadata":{"annotations":{},"name":"pi","namespace":"default"},"spec":{"backoffLimit":4,"template":... +Parallelism: 1 +Completions: 1 +Start Time: Mon, 02 Dec 2019 15:20:11 +0200 +Completed At: Mon, 02 Dec 2019 15:21:16 +0200 +Duration: 65s +Pods Statuses: 0 Running / 1 Succeeded / 0 Failed +Pod Template: + Labels: controller-uid=c9948307-e56d-4b5d-8302-ae2d7b7da67c + job-name=pi + Containers: + pi: + Image: perl + Port: + Host Port: + Command: + perl + -Mbignum=bpi + -wle + print bpi(2000) + Environment: + Mounts: + Volumes: +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal SuccessfulCreate 14m job-controller Created pod: pi-5rwd7 +``` + +Jobの完了したPodを表示するには、`kubectl get pods`を使います。 + +あるJobに属するすべてのPodの一覧を機械可読な形式で出力するには、次のようなコマンドを使います。 + +```shell +pods=$(kubectl get pods --selector=job-name=pi --output=jsonpath='{.items[*].metadata.name}') +echo $pods +``` +``` +pi-5rwd7 +``` + +ここでのセレクターは、Jobのセレクターと同じです。`--output = jsonpath`オプションは、返されたリストの各Podから名前だけを取得する式を指定します。 + + +いずれかのPodの標準出力を表示します。 + +```shell +kubectl logs $pods +``` +出力例は以下の通りです。 +```shell +3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901 +``` + +## Jobの仕様の作成 + +他のすべてのKubernetesの設定と同様に、Jobには`apiVersion`、` kind`、および`metadata`フィールドが必要です。 +その名前は有効な[DNSサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)である必要があります。 + +Jobには[`.spec`セクション](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status)も必要です。 + +### Podテンプレート + +`.spec.template`は、`.spec`の唯一の必須フィールドです。 + +`.spec.template`は[Podテンプレート](/ja/docs/concepts/workloads/pods/#pod-templates)です。 +ネストされており、`apiVersion`や`kind`ないことを除けば、{{< glossary_tooltip text="Pod" term_id="pod" >}}とまったく同じスキーマを持ちます。 + +Podの必須フィールドに加えて、JobのPodテンプレートでは、適切なラベル([Podセレクター](#pod-selector)参照)と適切な再起動ポリシーを指定しなければなりません。 + +`Never`または`OnFailure`と等しい[`RestartPolicy`](/ja/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy)のみが許可されます。 + +### Podセレクター {#pod-selector} + +`.spec.selector`フィールドはオプションです。ほとんどの場合、指定すべきではありません。 +セクション「[独自のPodセレクターの指定](#specifying-your-own-pod-selector)」を参照してください。 + + +### Jobの並列実行 {#parallel-jobs} + +Jobとして実行するのに適したタスクは、大きく分けて3つあります。 + +1. 非並列Job + - 通常は、Podが失敗しない限り、1つのPodのみが起動されます。 + - そのPodが正常に終了するとすぐにJobが完了します。 +2. *固定の完了数*を持つ並列Job + - `.spec.completions`に、0以外の正の値を指定します。 + - Jobはタスク全体を表し、1から`.spec.completions`の範囲内の各値に対して、1つの成功したPodがあれば完了です。 + - **まだ実装されていません**が、各Podには、1から`.spec.completions`の範囲内で異なるインデックスが渡されます。 +3. *ワークキュー*を持つ並列Job + - `.spec.completions`は指定しません。デフォルトは`.spec.parallelism`です。 + - Podは、それぞれが何を処理するか決定するために、 Pod間または外部サービス間で調整する必要があります。例えば、あるPodはワークキューから最大N個のアイテムのバッチを取得します。 + - 各Podはすべてのピアが完了したかどうか、つまりJob全体が完了したかどうかを、独立して判断できます。 + - Jobの _任意の_ Podが正常終了すると、新しいPodは作成されません。 + - 少なくとも1つのPodが正常終了し、すべてのPodが終了すると、Jobは正常に完了します。 + - Podが正常終了した後は、他のPodがこのタスクの処理を行ったり、出力を書き込んだりしてはなりません。それらはすべて終了する必要があります。 + +_非並列_ Jobの場合、`.spec.completions`と`.spec.parallelism`の両方を未設定のままにすることができます。両方が設定されていない場合、どちらもデフォルトで1になります。 + +_ワークキュー_ を持つJobの場合、`.spec.completions`を未設定のままにし、`.spec.parallelism`を非負整数にする必要があります。 + + +様々な種類のJobを利用する方法の詳細については、セクション「[Jobのパターン](#job-patterns)」をご覧ください。 + +#### 並列処理の制御 + +並列処理数(`.spec.parallelism`)については、任意の非負整数を設定できます。 +指定しない場合、デフォルトで1になります。 +0を指定した場合、並列処理数が増えるまで、Jobは実質的に一時停止されます。 + +以下に挙げる様々な理由から、実際の並列処理数(任意の時点で実行されるPodの数)が、要求された数より多い場合と少ない場合があります。 + +- _固定完了数_ を持つJobの場合、並行して実行されるPodの実際の数は、残りの完了数を超えることはありません。`.spec.parallelism`の大きい値は事実上無視されます。 +- _ワークキュー_ を持つJobの場合、Podが成功しても新しいPodは開始されません。ただし、残りのPodは完了できます。 +- Jobコントローラー({{< glossary_tooltip term_id="controller" >}})が反応する時間がない場合も考えられます。 +- Jobコントローラーが何らかの理由(`ResourceQuota`がない、権限がないなど)でPodの作成に失敗した場合、要求された数よりも少ないPod数になる可能性があります。 +- Jobコントローラーは、同じJob内で以前のPodが過剰に失敗したために、新しいPodの作成を調整する場合があります。 +- Podをグレースフルにシャットダウンした場合、停止までに時間がかかります。 + +## Podおよびコンテナの障害の処理 + +Pod内のコンテナは、その中のプロセスが0以外の終了コードで終了した、またはメモリー制限を超えたためにコンテナが強制終了されたなど、さまざまな理由で失敗する可能性があります。これが発生し、`.spec.template.spec.restartPolicy = "OnFailure"`であ場合、Podはノードに残りますが、コンテナは再実行されます。したがって、プログラムはローカルで再起動するケースを処理するか、`.spec.template.spec.restartPolicy = "Never"`を指定する必要があります。 +`restartPolicy`の詳細な情報は、[Podのライフサイクル](/ja/docs/concepts/workloads/pods/pod-lifecycle/#example-states)を参照してください。 + +さまざまな理由で、Pod全体が失敗することもあります。例えば、Podが(ノードのアップグレード、再起動、削除などにより)ノードから切り離された場合や、Podのコンテナが失敗して`.spec.template.spec.restartPolicy = "Never"`が設定されている場合などです。Podが失敗した場合、Jobコントローラーは新しいPodを開始します。つまり、アプリケーションは新しいPodで再起動されたケースを処理する必要があります。特に、前の実行によって発生した一時ファイル、ロック、不完全な出力などに対する処理が必要です。 + +たとえ`.spec.parallelism = 1`、`.spec.completions = 1`、`.spec.template.spec.restartPolicy = "Never"`を指定しても、同じプログラムが2回起動される場合があることに注意してください。 + +`.spec.parallelism`と`.spec.completions`の両方を1より大きい値に指定した場合は、複数のPodが同時に実行される可能性があります。したがって、Podは同時実行性にも対応する必要があります。 + +### Pod Backoff Failure Policy + +構成の論理エラーなどが原因で、ある程度の再試行後にJobを失敗させたい場合があります。 +そのためには、`.spec.backoffLimit`を設定して、Jobが失敗したと見なすまでの再試行回数を指定します。デフォルトでは6に設定されています。 +失敗したPodは、6分を上限とする指数バックオフ遅延(10秒、20秒、40秒...)に従って、Jobコントローラーにより再作成されます。 +JobのPodが削除されるか、Jobの他のPodがその時間に失敗することなく成功すると、バックオフカウントがリセットされます。 + +{{< note >}} +Jobに`restartPolicy = "OnFailure"`がある場合、Jobのバックオフ制限に達すると、Jobを実行しているコンテナが終了することに注意してください。これにより、Jobの実行可能ファイルのデバッグがより困難になる可能性があります。Jobのデバッグするまたはロギングシステムを使用する場合は、`restartPolicy = "Never"`を設定して、失敗したJobからの出力が誤って失われないようにすることをお勧めします。 +{{< /note >}} + +## Jobの終了とクリーンアップ + +Jobが完了すると、Podは作成されなくなりますが、Podの削除も行われません。それらを保持しておくと、完了したPodのログを表示して、エラー、警告、またはその他の診断の出力を確認できます。 +Jobオブジェクトは完了後も残るため、ステータスを表示できます。ステータスを確認した後、古いJobを削除するのはユーザーの責任です。`kubectl`(例えば`kubectl delete jobs/pi`や`kubectl delete -f ./job.yaml`)を用いてJobを削除してください。`kubectl`でJobを削除すると、Jobが作成したすべてのPodも削除されます。 + +デフォルトでは、Podが失敗する(`restartPolicy=Never`)かコンテナがエラーで終了する(`restartPolicy=OnFailure`)場合を除き、Jobは中断されずに実行されます。その時点でJobは上記の`.spec.backoffLimit`に従います。`.spec.backoffLimit`に達すると、Jobは失敗としてマークされ、実行中のPodはすべて終了されます。 + +Jobを終了する別の方法は、アクティブな期限を設定することです。 +これを行うには、Jobの`.spec.activeDeadlineSeconds`フィールドを秒数に設定します +`activeDeadlineSeconds`は、作成されたPodの数に関係なく、Jobの期間に適用されます。 +Jobが`activeDeadlineSeconds`に到達すると、実行中のすべてのPodが終了し、Jobのステータスは`type: Failed`および`reason: DeadlineExceeded`となります。 + +Jobの`.spec.activeDeadlineSeconds`は、`.spec.backoffLimit`よりも優先されることに注意してください。したがって、1つ以上の失敗したPodを再試行しているJobは、`backoffLimit`にまだ達していない場合でも、`activeDeadlineSeconds`で指定された制限時間に達すると、追加のPodをデプロイしません。 + +以下に例を挙げます。 + +```yaml +apiVersion: batch/v1 +kind: Job +metadata: + name: pi-with-timeout +spec: + backoffLimit: 5 + activeDeadlineSeconds: 100 + template: + spec: + containers: + - name: pi + image: perl + command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] + restartPolicy: Never +``` + +Job内のJobの仕様と[Podテンプレートの仕様](/ja/docs/concepts/workloads/pods/init-containers/#detailed-behavior)の両方に`activeDeadlineSeconds`フィールドがあることに注意してください。このフィールドが適切なレベルに設定されていることを確認してください。 + +`restartPolicy`はPodに適用され、Job自体には適用されないことに注意してください。Jobのステータスが`type: Failed`になると、Jobの自動再起動は行われません。 +つまり、 `.spec.activeDeadlineSeconds`と`.spec.backoffLimit`でアクティブ化されるJob終了のメカニズムは、手作業での介入が必要になるような永続的なJobの失敗を引き起こします。 + +## 終了したJobの自動クリーンアップ + +終了したJobは、通常、もう必要ありません。それらをシステム内に保持すると、APIサーバーに負担がかかります。[CronJobs](/ja/docs/concepts/workloads/controllers/cron-jobs/)などの上位レベルのコントローラーによってJobが直接管理されている場合、指定された容量ベースのクリーンアップポリシーに基づいて、JobをCronJobsでクリーンアップできます。 + +### 終了したJobのTTLメカニズム + +{{< feature-state for_k8s_version="v1.12" state="alpha" >}} + +完了したJob(`Complete`または`Failed`)を自動的にクリーンアップする別の方法は、[TTLコントローラー](/ja/docs/concepts/workloads/controllers/ttlafterfinished/)が提供するTTLメカニズムを使用して、完了したリソースを指定することです。Jobの`.spec.ttlSecondsAfterFinished`フィールドに指定します。 + +TTLコントローラーがJobをクリーンアップすると、Jobが連鎖的に削除されます。つまり、Podなどの依存オブジェクトがJobとともに削除されます。Jobが削除されるとき、ファイナライザーなどのライフサイクル保証が優先されることに注意してください。 + +例は以下の通りです。 + +```yaml +apiVersion: batch/v1 +kind: Job +metadata: + name: pi-with-ttl +spec: + ttlSecondsAfterFinished: 100 + template: + spec: + containers: + - name: pi + image: perl + command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] + restartPolicy: Never +``` + +Job`pi-with-ttl`は、Jobが終了してから`100`秒後に自動的に削除される。 + +フィールドが`0`に設定されている場合は、Jobは終了後すぐに自動的に削除されます。フィールドが設定されていない場合は、このJobは終了後にTTLコントローラーによってクリーンアップされません。 + +このTTLメカニズムはアルファ版であり、`TTLAfterFinished`フィーチャーゲートであることに注意してください。詳細は[TTLコントローラー](/ja/docs/concepts/workloads/controllers/ttlafterfinished/)のドキュメントを参照してください。 + +## Jobのパターン {#job-patterns} + +Jobオブジェクトは、Podの信頼性の高い並列実行をサポートするために使用できます。Jobオブジェクトは、科学的コンピューティングで一般的に見られるような、密接に通信する並列プロセスをサポートするようには設計されていません。しかし、独立しているが関連性のある*ワークアイテム*の集合の並列処理はサポートしています。 + +例えば送信する電子メール、レンダリングするフレーム、トランスコードするファイル、スキャンするNoSQLデータベースのキーの範囲などです。 + +複雑なシステムでは、複数の異なるワークアイテムの集合があるかもしれません。ここでは、ユーザーがまとめて管理したい作業項目の1つの集合(バッチJob)を考えています。 + +並列計算にはいくつかのパターンがあり、それぞれ長所と短所があります。 +トレードオフは以下の通りです。 + +- 各ワークアイテムに1つのJobオブジェクトを使用する場合と、すべてのワークアイテムに1つのJobオブジェクトを使用する場合を比較すると、後者の方がワークアイテムの数が多い場合に適しています。前者では、ユーザーとシステムが大量のJobオブジェクトを管理するためのオーバーヘッドが発生します。 +- 作成されたPodの数がワークアイテムの数に等しい場合と、各Podが複数のワークアイテムを処理する場合を比較すると、前者の方が一般的に既存のコードやコンテナへの変更が少ないです。後者は上記の項目と同様の理由で、大量のワークアイテムを処理するのに適しています。 +- いくつかのアプローチでは、ワークキューを使用します。これはキューサービスを実行している必要があり、既存のプログラムやコンテナを変更してワークキューを使用するようにする必要があります。他のアプローチは、既存のコンテナ化されたアプリケーションに適応するのがさらに容易です。 + +ここでは、上記のトレードオフに対応するものを、2から4列目にまとめています。 +パターン名は、例とより詳細な説明へのリンクでもあります。 + +| パターン名 | 単一のJobオブジェクト | ワークアイテムよりPodが少ないか? | アプリをそのまま使用するか? | Kube 1.1で動作するか? | +| ----------------------------------------------------------------------------------------------- |:-----------------:|:---------------------------:|:-------------------:|:-------------------:| +| [Jobテンプレートを拡張する](/ja/docs/tasks/job/parallel-processing-expansion/) | | | ✓ | ✓ | +| [ワークアイテムごとにPodでキューを作成する](/ja/docs/tasks/job/coarse-parallel-processing-work-queue/) | ✓ | | 場合による | ✓ | +| [Pod数が可変であるキューを作成する](/ja/docs/tasks/job/fine-parallel-processing-work-queue/) | ✓ | ✓ | | ✓ | +| 単一のJob静的な処理を割り当てる | ✓ | | ✓ | | + +完了数を`.spec.completions`で指定すると、Jobコントローラーが作成した各Podは同じ[`spec`](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status)を持ちます。つまり、あるタスクを実行するすべてのPodは、同じコマンドラインと同じイメージ、同じボリューム、そして(ほぼ)同じ環境変数を持ちます。これらのパターンは、Podが異なる処理を行うように配置するための様々な方法です。 + +以下の表では、パターンごとに必要な`.spec.parallelism`と`.spec.completions`の設定を示します。 +ここで、`W`はワークアイテム数とします。 + +| パターン名 | `.spec.completions` | `.spec.parallelism` | +| ----------------------------------------------------------------------------------------------- |:-------------------:|:--------------------:| +| [Jobテンプレートを拡張する](/ja/docs/tasks/job/parallel-processing-expansion/) | 1 | 1とする必要あり | +| [ワークアイテムごとにPodでキューを作成する](/ja/docs/tasks/job/coarse-parallel-processing-work-queue/) | W | 任意 | +| [Pod数が可変であるキューを作成する](/ja/docs/tasks/job/fine-parallel-processing-work-queue/) | 1 | 任意 | +| 単一のJob静的な処理を割り当てる | W | 任意 | + + +## 高度な使用方法 + +### 独自のPodセレクターを指定する {#specifying-your-own-pod-selector} + +通常、Jobオブジェクトを作成する際には`.spec.selector`を指定しません。 +システムのデフォルトのロジックで、Jobの作成時にこのフィールドを追加します。 +セレクターの値は、他のJobと重複しないように選択されます。 + +しかし、場合によっては、この自動的に設定されるセレクターを上書きする必要があるかもしれません。 +これを行うには、Jobの`.spec.selector`を指定します。 + +これを行う際には十分に注意が必要です。もし指定したラベルセレクターが、そのJobのPodに対して固有でなく、無関係なPodにマッチする場合、無関係なJobのPodが削除されたり、このJobが他のPodを完了したものとしてカウントしたり、一方または両方のJobがPodの作成や完了まで実行を拒否することがあります。 +もし固有でないセレクターを選択した場合は、他のコントローラー(例えばレプリケーションコントローラーなど)やそのPodも予測不能な動作をする可能性があります。Kubernetesは`.spec.selector`を指定する際のミスを防ぐことはできません。 + +ここでは、この機能を使いたくなるようなケースの例をご紹介します。 +`old`というJobがすでに実行されているとします。既存のPodを実行し続けたいが、作成した残りのPodには別のPodテンプレートを使用し、Jobには新しい名前を付けたいとします。 +これらのフィールドは更新が不可能であるため、Jobを更新することはできません。 +そのため、`kubectl delete jobs/old --cascade=false`を使って、`old`というJobを削除し、一方で _そのPodは実行したまま_ にします。 +削除する前に、どのセレクターを使っているかメモしておきます。 + +``` +kubectl get job old -o yaml +``` +``` +kind: Job +metadata: + name: old + ... +spec: + selector: + matchLabels: + controller-uid: a8f3d00d-c6d2-11e5-9f87-42010af00002 + ... +``` +次に`new`という名前の新しいJobを作成し、同じセレクターを明示的に指定します。 +既存のPodには`controller-uid=a8f3d00d-c6d2-11e5-9f87-42010af00002`というラベルが付いているので、それらも同様にJob`new`で制御されます。 + +システムが自動的に生成するセレクターを使用していないので、新しいJobでは`manualSelector: true`を指定する必要があります。 + +``` +kind: Job +metadata: + name: new + ... +spec: + manualSelector: true + selector: + matchLabels: + controller-uid: a8f3d00d-c6d2-11e5-9f87-42010af00002 + ... +``` + +新しいJob自体は`a8f3d00d-c6d2-11e5-9f87-42010af00002`とは異なるuidを持つでしょう。 +`manualSelector: true`を設定すると、あなたが何をしているかを知っていることをシステムに伝え、この不一致を許容するようにします。 + +## 代替案 + +### ベアPod + +Podが実行されているノードが再起動したり障害が発生したりすると、Podは終了し、再起動されません。しかし、Jobは終了したPodを置き換えるために新しいPodを作成します。 +このため、アプリケーションが単一のPodしか必要としない場合でも、ベアPodではなくJobを使用することをお勧めします。 + +### レプリケーションコントローラー + +Jobは[レプリケーションコントローラー](/ja/docs/user-guide/replication-controller)を補完するものです。 +レプリケーションコントローラーは終了が予想されないPod(例えばWebサーバー)を管理し、Jobは終了が予想されるPod(例えばバッチタスク)を管理します。 + +[Podのライフサイクル](/ja/docs/concepts/workloads/pods/pod-lifecycle/)で説明したように、`Job`は`RestartPolicy`が`OnFailure`または`Never`と等しいPodに対して*のみ*適切です。 +(注意: `RestartPolicy`が設定されていない場合、デフォルト値は`Always`です。) + +### 単一のJobでコントローラーPodを起動 + +もう一つのパターンは、単一のJobでPodを作成し、そのPodが他のPodを作成し、それらのPodに対するカスタムコントローラーのように動作するというものです。これは最も柔軟性がありますが、始めるのがやや複雑で、Kubernetesとの統合性が低いかもしれません。 + +このパターンの例として、Podを起動してスクリプトを実行するJobがSparkマスターコントローラー([Sparkの例](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/staging/spark/README.md)を参照)を起動し、Sparkドライバーを実行してからクリーンアップするというものがあります。 + +このアプローチの利点は、全体的なプロセスがJobオブジェクトが完了する保証を得ながらも、どのようなPodが作成され、どのように作業が割り当てられるかを完全に制御できることです。 + +## Cron Job {#cron-jobs} + +Unixのツールである`cron`と同様に、指定した日時に実行されるJobを作成するために、[`CronJob`](/ja/docs/concepts/workloads/controllers/cron-jobs/)を使用することができます。 diff --git a/content/ja/docs/concepts/workloads/controllers/ttlafterfinished.md b/content/ja/docs/concepts/workloads/controllers/ttlafterfinished.md index e663d5b9c9..d1b1cc3354 100644 --- a/content/ja/docs/concepts/workloads/controllers/ttlafterfinished.md +++ b/content/ja/docs/concepts/workloads/controllers/ttlafterfinished.md @@ -29,7 +29,7 @@ TTLコントローラーは、そのリソースが終了したあと指定し TTL秒はいつでもセット可能です。下記はJobの`.spec.ttlSecondsAfterFinished`フィールドのセットに関するいくつかの例です。 * Jobがその終了後にいくつか時間がたった後に自動的にクリーンアップできるように、そのリソースマニフェストにこの値を指定します。 -* この新しい機能を適用させるために、存在していて既に終了したリソースに対してこのフィールドをセットします。 +* この新しい機能を適用させるために、存在していてすでに終了したリソースに対してこのフィールドをセットします。 * リソース作成時に、このフィールドを動的にセットするために、[管理webhookの変更](/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks)をさせます。クラスター管理者は、終了したリソースに対して、このTTLポリシーを強制するために使うことができます。 * リソースが終了した後に、このフィールドを動的にセットしたり、リソースステータスやラベルなどの値に基づいて異なるTTL値を選択するために、[管理webhookの変更](/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks)をさせます。 diff --git a/content/ja/docs/concepts/workloads/pods/init-containers.md b/content/ja/docs/concepts/workloads/pods/init-containers.md index 5d285b15d8..3486c55219 100644 --- a/content/ja/docs/concepts/workloads/pods/init-containers.md +++ b/content/ja/docs/concepts/workloads/pods/init-containers.md @@ -8,7 +8,7 @@ weight: 40 このページでは、Initコンテナについて概観します。Initコンテナとは、{{< glossary_tooltip text="Pod" term_id="pod" >}}内でアプリケーションコンテナの前に実行される特別なコンテナです。 Initコンテナにはアプリケーションコンテナのイメージに存在しないセットアップスクリプトやユーティリティーを含めることができます。 -Initコンテナは、Podの仕様のうち`containers`という配列(これがアプリケーションコンテナを示します)と並べて指定します。 +Initコンテナは、Podの仕様のうち`containers`という配列(これがアプリケーションコンテナを示します)と並べて指定します。 ## Initコンテナを理解する {#understanding-init-containers} @@ -202,7 +202,7 @@ myapp-pod 1/1 Running 0 9m このシンプルな例を独自のInitコンテナを作成する際の参考にしてください。[次の項目](#what-s-next)にさらに詳細な使用例に関するリンクがあります。 -## Initコンテナのふるまいに関する詳細 {#Detailed behavior} +## Initコンテナのふるまいに関する詳細 {#detailed-behavior} Podの起動時において、各Initコンテナはネットワークとボリュームが初期化されたのちに順番に起動します。各Initコンテナは次のInitコンテナが起動する前に正常に終了しなくてはなりません。もしあるInitコンテナがランタイムもしくはエラーにより起動失敗した場合、そのPodの`restartPolicy`の値に従ってリトライされます。しかし、もしPodの`restartPolicy`が`Always`に設定されていた場合、Initコンテナの`restartPolicy`は`OnFailure`が適用されます。 @@ -213,7 +213,7 @@ Podは全てのInitコンテナが完了するまで`Ready`状態となりませ Initコンテナの仕様の変更は、コンテナイメージのフィールドのみに制限されています。 Initコンテナのイメージフィールド値を変更すると、そのPodは再起動されます。 -Initコンテナは何度も再起動およびリトライ可能なため、べき等(Idempotent)である必要があります。特に、`EmptyDirs`にファイルを書き込むコードは、書き込み先のファイルがすでに存在している可能性を考慮に入れる必要があります。 +Initコンテナは何度も再起動およびリトライ可能なため、べき等(Idempotent)である必要があります。特に、`EmptyDirs`にファイルを書き込むコードは、書き込み先のファイルがすでに存在している可能性を考慮に入れる必要があります。 Initコンテナはアプリケーションコンテナの全てのフィールドを持っています。しかしKubernetesは、Initコンテナが完了と異なる状態を定義できないため`readinessProbe`が使用されることを禁止しています。これはバリデーションの際に適用されます。 @@ -230,11 +230,11 @@ Initコンテナの順序と実行を考えるとき、リソースの使用に * リソースに対する全てのアプリケーションコンテナのリクエスト/リミットの合計 * リソースに対する有効なinitリクエスト/リミット * スケジューリングは有効なリクエスト/リミットに基づいて実行されます。つまり、InitコンテナはPodの生存中には使用されない初期化用のリソースを確保することができます。 -* Podの*有効なQos(quality of service)ティアー* は、Initコンテナとアプリケーションコンテナで同様です。 +* Podの*有効なQoS(quality of service)ティアー* は、Initコンテナとアプリケーションコンテナで同様です。 クォータとリミットは有効なPodリクエストとリミットに基づいて適用されます。 -Podレベルのコントロールグループ(cgroups)は、スケジューラーと同様に、有効なPodリクエストとリミットに基づいています。 +Podレベルのコントロールグループ(cgroups)は、スケジューラーと同様に、有効なPodリクエストとリミットに基づいています。 ### Podの再起動の理由 {#pod-restart-reasons} @@ -250,4 +250,3 @@ Podレベルのコントロールグループ(cgroups)は、スケジュー * [Initコンテナを含むPodの作成](/docs/tasks/configure-pod-container/configure-pod-initialization/#creating-a-pod-that-has-an-init-container)方法について学ぶ。 * [Initコンテナのデバッグ](/ja/docs/tasks/debug-application-cluster/debug-init-containers/)を行う方法について学ぶ。 - diff --git a/content/ja/docs/concepts/workloads/pods/pod-overview.md b/content/ja/docs/concepts/workloads/pods/pod-overview.md index 1917d6adf2..76e8f11a62 100644 --- a/content/ja/docs/concepts/workloads/pods/pod-overview.md +++ b/content/ja/docs/concepts/workloads/pods/pod-overview.md @@ -1,5 +1,5 @@ --- -title: Podについての概観(Pod Overview) +title: Podの概観 content_type: concept weight: 10 card: @@ -8,7 +8,7 @@ card: --- -このページでは、Kubernetesのオブジェクトモデルにおいて、デプロイ可能な最小単位のオブジェクトである`Pod`に関して概観します。 +このページでは、Kubernetesのオブジェクトモデルにおいて、デプロイ可能な最小単位のオブジェクトである`Pod`に関して説明します。 @@ -62,7 +62,7 @@ Podは、Podによって構成されたコンテナ群のために2種類の共 ## Podを利用する ユーザーはまれに、Kubenetes内で独立したPodを直接作成する場合があります(シングルトンPodなど)。 -これはPodが比較的、一時的な使い捨てエンティティとしてデザインされているためです。Podが作成された時(ユーザーによって直接的、またはコントローラーによって間接的に作成された場合)、ユーザーのクラスター内の単一の{{< glossary_tooltip term_id="node" >}}上で稼働するようにスケジューリングされます。そのPodはプロセスが停止されたり、Podオブジェクトが削除されたり、Podがリソースの欠如のために*追い出され* たり、ノードが故障するまでノード上に残り続けます。 +これはPodが比較的、一時的な使い捨てエンティティとしてデザインされているためです。Podが作成された時(ユーザーによって直接的、またはコントローラーによって間接的に作成された場合)、ユーザーのクラスター内の単一の{{< glossary_tooltip term_id="node" >}}上で稼働するようにスケジューリングされます。そのPodはプロセスが停止されたり、Podオブジェクトが削除されたり、Podがリソースの欠如のために*追い出され* たり、ノードが故障するまでノード上に残り続けます。 {{< note >}} 単一のPod内でのコンテナを再起動することと、そのPodを再起動することを混同しないでください。Podはそれ自体は実行されませんが、コンテナが実行される環境であり、削除されるまで存在し続けます。 @@ -111,7 +111,7 @@ spec: ## {{% heading "whatsnext" %}} -* [Pod](/ja/docs/concepts/workloads/pods/pod/)について更に学びましょう +* [Pod](/ja/docs/concepts/workloads/pods/pod/)についてさらに学びましょう * Podの振る舞いに関して学ぶには下記を参照してください * [Podの停止](/ja/docs/concepts/workloads/pods/pod/#termination-of-pods) * [Podのライフサイクル](/ja/docs/concepts/workloads/pods/pod-lifecycle/) diff --git a/content/ja/docs/concepts/workloads/pods/pod.md b/content/ja/docs/concepts/workloads/pods/pod.md index e46e5cad9e..fbb003c21b 100644 --- a/content/ja/docs/concepts/workloads/pods/pod.md +++ b/content/ja/docs/concepts/workloads/pods/pod.md @@ -16,7 +16,7 @@ _Pod_ は、Kubernetesで作成および管理できる、デプロイ可能な ## Podとは -_Pod_ は(クジラの小群やエンドウ豆のさやのように)、共有のストレージ/ネットワークを持つ1つ以上のコンテナ(例えばDockerコンテナ)、およびコンテナを実行する方法についての仕様です。Pod内のコンテナ群は常に同じ場所に配置され、協調してスケジューリングされ、共通のコンテキストで実行されます。Podは、アプリケーション固有の「論理ホスト」――やや密に結合した1つ以上のアプリケーション・コンテナを含むもの――をモデル化します。コンテナ以前の世界では、同じ物理または仮想マシン上で実行されることが、同じ論理ホスト上で実行されることを意味するでしょう。 +_Pod_ は(クジラの小群やエンドウ豆のさやのように)、共有のストレージ/ネットワークを持つ1つ以上のコンテナ(例えばDockerコンテナ)、およびコンテナを実行する方法についての仕様です。Pod内のコンテナ群は常に同じ場所に配置され、協調してスケジューリングされ、共通のコンテキストで実行されます。Podは、アプリケーション固有の「論理ホスト」――やや密に結合した1つ以上のアプリケーション・コンテナを含むもの――をモデル化します。コンテナ以前の世界では、同じ物理または仮想マシン上で実行されることが、同じ論理ホスト上で実行されることを意味するでしょう。 Kubernetesは、Dockerだけでなくより多くのコンテナ・ランタイムをサポートしていますが、Dockerは最もよく知られているランタイムであり、Dockerの用語を使ってPodを説明することが可能です。 @@ -24,7 +24,7 @@ Pod内では、Linux namespaceやcgroupなどのDockerコンテナを分離す Podのコンテキスト内で、個々のアプリケーションに更なる分離が適用されることがあります。 Pod内のコンテナはIPアドレスとポートの空間を共有し、 `localhost` を通じてお互いを見つけることができます 。 -また、SystemVセマフォやPOSIX共有メモリなどの標準のプロセス間通信(IPC)を使用して互いに通信することもできます。 +また、SystemVセマフォやPOSIX共有メモリなどの標準のプロセス間通信(IPC)を使用して互いに通信することもできます。 異なるPodのコンテナは異なるIPアドレスを持ち、[特別な設定](/docs/concepts/policy/pod-security-policy/)がなければIPCでは通信できません。 これらのコンテナは通常、Pod IPアドレスを介して互いに通信します。 @@ -33,18 +33,18 @@ Pod内のアプリケーションからアクセスできる共有ボリュー [Docker](https://www.docker.com/)の用語でいえば、Podは共有namespaceと共有[ボリューム](/docs/concepts/storage/volumes/)を持つDockerコンテナのグループとしてモデル化されています。 -個々のアプリケーションコンテナと同様に、Podは(永続的ではなく)比較的短期間の存在と捉えられます。 -[Podのライフサイクル](/ja/docs/concepts/workloads/pods/pod-lifecycle/)で説明しているように、Podが作成されると、一意のID(UID)が割り当てられ、(再起動ポリシーに従って)終了または削除されるまでNodeで実行されるようにスケジュールされます。 +個々のアプリケーションコンテナと同様に、Podは(永続的ではなく)比較的短期間の存在と捉えられます。 +[Podのライフサイクル](/ja/docs/concepts/workloads/pods/pod-lifecycle/)で説明しているように、Podが作成されると、一意のID(UID)が割り当てられ、(再起動ポリシーに従って)終了または削除されるまでNodeで実行されるようにスケジュールされます。 Nodeが停止した場合、そのNodeにスケジュールされたPodは、タイムアウト時間の経過後に削除されます。 -特定のPod(UIDで定義)は新しいNodeに「再スケジュール」されません。 -代わりに、必要に応じて同じ名前で、新しいUIDを持つ同一のPodに置き換えることができます(詳細については[ReplicationController](/docs/concepts/workloads/controllers/replicationcontroller/)を参照してください)。 +特定のPod(UIDで定義)は新しいNodeに「再スケジュール」されません。 +代わりに、必要に応じて同じ名前で、新しいUIDを持つ同一のPodに置き換えることができます(詳細については[ReplicationController](/docs/concepts/workloads/controllers/replicationcontroller/)を参照してください)。 -ボリュームなど、Podと同じ存続期間を持つものがあると言われる場合、それは(そのUIDを持つ)Podが存在する限り存在することを意味します。 -そのPodが何らかの理由で削除された場合、たとえ同じ代替物が作成されたとしても、関連するもの(例えばボリューム)も同様に破壊されて再作成されます。 +ボリュームなど、Podと同じ存続期間を持つものがあると言われる場合、それは(そのUIDを持つ)Podが存在する限り存在することを意味します。 +そのPodが何らかの理由で削除された場合、たとえ同じ代替物が作成されたとしても、関連するもの(例えばボリューム)も同様に破壊されて再作成されます。 {{< figure src="/images/docs/pod.svg" title="Podの図" width="50%" >}} -*file puller(ファイル取得コンテナ)とWebサーバーを含むマルチコンテナのPod。コンテナ間の共有ストレージとして永続ボリュームを使用している。* +*file puller(ファイル取得コンテナ)とWebサーバーを含むマルチコンテナのPod。コンテナ間の共有ストレージとして永続ボリュームを使用している。* ## Podを用いる動機 @@ -53,13 +53,13 @@ Nodeが停止した場合、そのNodeにスケジュールされたPodは、タ Podは、まとまったサービスの単位を形成する複数の協調プロセスのパターンをモデル化したものです。 構成要素であるアプリケーションの集まりよりも高いレベルの抽象化を提供することによって、アプリケーションのデプロイと管理を単純化します。 Podは、デプロイや水平スケーリング、レプリケーションの単位として機能します。 -Pod内のコンテナに対しては、同じ場所への配置(共同スケジューリング)、命運の共有(つまり停止)、協調レプリケーション、リソース共有や依存関係の管理が自動的に取り扱われます。 +Pod内のコンテナに対しては、同じ場所への配置(共同スケジューリング)、命運の共有(つまり停止)、協調レプリケーション、リソース共有や依存関係の管理が自動的に取り扱われます。 ### リソース共有と通信 Podは、構成要素間でのデータ共有および通信を可能にします。 -Pod内のアプリケーションはすべて同じネットワーク名前空間(同じIPおよびポートスペース)を使用するため、 `localhost` としてお互いを「見つけて」通信できます。 +Pod内のアプリケーションはすべて同じネットワーク名前空間(同じIPおよびポートスペース)を使用するため、 `localhost` としてお互いを「見つけて」通信できます。 このため、Pod内のアプリケーションはそれぞれ使用するポートを調整する必要があります。 各Podは、他の物理コンピュータやPodと自由に通信するためのフラットな共有ネットワーク空間上にIPアドレスを持ちます。 @@ -71,7 +71,7 @@ Podで実行されるアプリケーションコンテナの定義に加えて ## Podの用途 -Podは、垂直に統合されたアプリケーションスタック(例:LAMP)をホストするために使用できます。 +Podは、垂直に統合されたアプリケーションスタック(例:LAMP)をホストするために使用できます。 しかし、Podを使う主な動機は、次のように同じ場所に配置され、共に管理されるヘルパープログラムをサポートすることです。 * コンテンツ管理システム(CMS)、ファイルやデータのローダー、ローカルのキャッシュマネージャーなど @@ -83,11 +83,11 @@ Podは、垂直に統合されたアプリケーションスタック(例:LA 個々のPodは、一般に、同じアプリケーションの複数のインスタンスを実行することを目的としていません。 詳細については、[The Distributed System ToolKit: Patterns for -Composite Containers](https://kubernetes.io/blog/2015/06/the-distributed-system-toolkit-patterns)(分散システムツールキット:複合コンテナのパターン)を参照してください。 +Composite Containers](https://kubernetes.io/blog/2015/06/the-distributed-system-toolkit-patterns)(分散システムツールキット:複合コンテナのパターン)を参照してください。 ## 考えられる代替案 -_単一の(Docker)コンテナで複数のプログラムを実行しないのはなぜですか?_ +_単一の(Docker)コンテナで複数のプログラムを実行しないのはなぜですか?_ 1. 透明性のため。Pod内のコンテナをインフラストラクチャから見えるようにすることで、インフラストラクチャはプロセス管理やリソース監視などのサービスをコンテナに提供できます。 これは、ユーザーに多くの便益を提供します。 @@ -97,13 +97,13 @@ Kubernetesはいつか個々のコンテナのライブアップデートをサ 1. 使いやすさのため。ユーザーは独自のプロセスマネージャーを実行する必要はありません。シグナルや終了コードの伝播などについて心配する必要はありません。 1. 効率のため。インフラストラクチャがより責任を負うため、コンテナはより軽量になります。 -_アフィニティ(結合性、親和性)ベースのコンテナの共同スケジューリングをサポートしないのはなぜですか?_ +_アフィニティ(結合性、親和性)ベースのコンテナの共同スケジューリングをサポートしないのはなぜですか?_ このアプローチによって、コンテナの共同配置は提供されるでしょう。 しかし、リソース共有やIPC、保証された命運の共有、および簡素化された管理といったPodの利点のほとんどは提供されないでしょう。 -## Podの耐久性(またはその欠如) +## Podの耐久性(またはその欠如) {#pod-durability} Podは、耐久性のある存在として扱われることを意図していません。 スケジューリングの失敗や、Nodeの故障には耐えられません。 @@ -128,7 +128,7 @@ Podは、以下のことを容易にするためにプリミティブとして ## Podの終了 {#termination-of-pods} -Podは、クラスター内のNodeで実行中のプロセスを表すため、不要になったときにそれらのプロセスを正常に終了できるようにすることが重要です(対照的なケースは、KILLシグナルで強制終了され、クリーンアップする機会がない場合)。 +Podは、クラスター内のNodeで実行中のプロセスを表すため、不要になったときにそれらのプロセスを正常に終了できるようにすることが重要です(対照的なケースは、KILLシグナルで強制終了され、クリーンアップする機会がない場合)。 ユーザーは削除を要求可能であるべきで、プロセスがいつ終了するかを知ることができなければなりませんが、削除が最終的に完了することも保証できるべきです。 ユーザーがPodの削除を要求すると、システムはPodが強制終了される前に意図された猶予期間を記録し、各コンテナのメインプロセスにTERMシグナルが送信されます。 猶予期間が終了すると、プロセスにKILLシグナルが送信され、PodはAPIサーバーから削除されます。 @@ -136,17 +136,17 @@ Podは、クラスター内のNodeで実行中のプロセスを表すため、 フローの例は下のようになります。 -1. ユーザーがデフォルトの猶予期間(30秒)でPodを削除するコマンドを送信する +1. ユーザーがデフォルトの猶予期間(30秒)でPodを削除するコマンドを送信する 1. APIサーバー内のPodは、猶予期間を越えるとPodが「死んでいる」と見なされるように更新される 1. クライアントのコマンドに表示されたとき、Podは「終了中」と表示される -1. (3と同時に)Kubeletは、2の期間が設定されたためにPodが終了中となったことを認識すると、Podのシャットダウン処理を開始する +1. (3と同時に)Kubeletは、2の期間が設定されたためにPodが終了中となったことを認識すると、Podのシャットダウン処理を開始する 1. Pod内のコンテナの1つが[preStopフック](/docs/concepts/containers/container-lifecycle-hooks/#hook-details)を定義している場合は、コンテナの内側で呼び出される。 - 猶予期間が終了した後も `preStop`フックがまだ実行されている場合は、一度だけ猶予期間を延長して(2秒)、ステップ2が呼び出される。`preStop`フックが完了するまでにより長い時間が必要な場合は、`terminationGracePeriodSeconds`を変更する必要がある。 + 猶予期間が終了した後も `preStop`フックがまだ実行されている場合は、一度だけ猶予期間を延長して(2秒)、ステップ2が呼び出される。`preStop`フックが完了するまでにより長い時間が必要な場合は、`terminationGracePeriodSeconds`を変更する必要がある。 1. コンテナにTERMシグナルが送信される。Pod内のすべてのコンテナが同時にTERMシグナルを受信するわけではなく、シャットダウンの順序が問題になる場合はそれぞれに `preStop` フックが必要になることがある -1. (3と同時に)Podはサービスを提供するエンドポイントのリストから削除され、ReplicationControllerの実行中のPodの一部とは見なされなくなる。 -ゆっくりとシャットダウンするPodは、(サービスプロキシのような)ロードバランサーがローテーションからそれらを削除するので、トラフィックを処理し続けることはできない +1. (3と同時に)Podはサービスを提供するエンドポイントのリストから削除され、ReplicationControllerの実行中のPodの一部とは見なされなくなる。 +ゆっくりとシャットダウンするPodは、(サービスプロキシのような)ロードバランサーがローテーションからそれらを削除するので、トラフィックを処理し続けることはできない 1. 猶予期間が終了すると、Pod内でまだ実行中のプロセスはSIGKILLで強制終了される -1. Kubeletは猶予期間を0(即時削除)に設定することでAPIサーバー上のPodの削除を終了する。 +1. Kubeletは猶予期間を0(即時削除)に設定することでAPIサーバー上のPodの削除を終了する。 PodはAPIから消え、クライアントからは見えなくなる デフォルトでは、すべての削除は30秒以内に正常に行われます。 @@ -186,5 +186,3 @@ spec.containers[0].securityContext.privileged: forbidden '<*>(0xc20b222db0)true' PodはKubernetes REST APIのトップレベルのリソースです。 APIオブジェクトの詳細については、[Pod APIオブジェクト](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#pod-v1-core)を参照してください 。 - - diff --git a/content/ja/docs/contribute/_index.md b/content/ja/docs/contribute/_index.md index 8491c85dc4..008b575e1a 100644 --- a/content/ja/docs/contribute/_index.md +++ b/content/ja/docs/contribute/_index.md @@ -32,7 +32,7 @@ Kubernetesのドキュメントは、GitHubのリポジトリーにあります ## 貢献するためのベストプラクティス - 明快で意味のあるGitコミットメッセージを書いてください。 -- PRがマージされたときにissueを参照し、自動的にissueをクローズする_Github Special Keywords_を必ず含めるようにしてください。 +- PRがマージされたときにissueを参照し、自動的にissueをクローズする _Github Special Keywords_ を必ず含めるようにしてください。 - タイプミスの修正や、スタイルの変更、文法の変更などのような小さな変更をPRに加える場合は、比較的小さな変更のためにコミットの数が増えすぎないように、コミットはまとめてください。 - あなたがコードを変更をした理由を示し、レビュアーがあなたのPRを理解するのに十分な情報を確保した適切なPR説明を、必ず含めるようにしてください。 - 追加文献 : diff --git a/content/ja/docs/home/_index.md b/content/ja/docs/home/_index.md index fda3c24817..7f8837ce60 100644 --- a/content/ja/docs/home/_index.md +++ b/content/ja/docs/home/_index.md @@ -18,7 +18,7 @@ menu: description: > Kubernetesは、コンテナ化されたアプリケーションの展開、スケーリング、また管理を自動化するためのオープンソースコンテナプラットフォームです。このオープンソースプロジェクトは、Cloud Native Computing Foundationによってホストされています。 overview: > - Kubernetesは、コンテナ化されたアプリケーションの展開、スケーリング、また管理を自動化するためのオープンソースコンテナプラットフォームです。このオープンソースプロジェクトは、Cloud Native Computing Foundationによってホストされています(CNCF)。 + Kubernetesは、コンテナ化されたアプリケーションの展開、スケーリング、また管理を自動化するためのオープンソースコンテナプラットフォームです。このオープンソースプロジェクトは、Cloud Native Computing Foundationによってホストされています(CNCF)。 cards: - name: concepts title: "基本を理解する" @@ -52,7 +52,7 @@ cards: button_path: /docs/reference - name: contribute title: "ドキュメントにコントリビュートする" - description: "プロジェクトに不慣れでも、長い間関わっていたとしても、誰でもコントリビュートすることが出来ます。" + description: "プロジェクトに不慣れでも、長い間関わっていたとしても、誰でもコントリビュートすることができます。" button: "ドキュメントにコントリビュートする" button_path: /docs/contribute - name: download diff --git a/content/ja/docs/home/supported-doc-versions.md b/content/ja/docs/home/supported-doc-versions.md index a4c9ac18ce..0ca6fcee64 100644 --- a/content/ja/docs/home/supported-doc-versions.md +++ b/content/ja/docs/home/supported-doc-versions.md @@ -9,7 +9,7 @@ card: -本ウェブサイトでは、現行版とその直前4バージョンのKubernetesドキュメントを含んでいます。 +本ウェブサイトには、現行版とその直前4バージョンのKubernetesドキュメントがあります。 @@ -17,8 +17,7 @@ card: ## 現行版 -現在のバージョンは -[{{< param "version" >}}](/). +現在のバージョンは[{{< param "version" >}}](/)です。 ## 以前のバージョン diff --git a/content/ja/docs/reference/access-authn-authz/authentication.md b/content/ja/docs/reference/access-authn-authz/authentication.md new file mode 100644 index 0000000000..297bcce9d0 --- /dev/null +++ b/content/ja/docs/reference/access-authn-authz/authentication.md @@ -0,0 +1,711 @@ +--- +title: 認証 +content_type: concept +weight: 10 +--- + + +このページでは、認証の概要について説明します。 + + + +## Kubernetesにおけるユーザー + +すべてのKubernetesクラスターには、2種類のユーザーがあります。Kubernetesによって管理されるサービスアカウントと、通常のユーザーです。 + +通常のユーザーは外部の独立したサービスが管理することを想定しています。秘密鍵を配布する管理者、KeystoneやGoogle Accountsのようなユーザーストア、さらにはユーザー名とパスワードのリストを持つファイルなどです。この点において、_Kubernetesは通常のユーザーアカウントを表すオブジェクトを持ちません。_ APIコールを介して、通常のユーザーをクラスターに追加することはできません。 + +対照的に、サービスアカウントはKubernetes APIによって管理されるユーザーです。サービスアカウントは特定の名前空間にバインドされており、APIサーバーによって自動的に作成されるか、APIコールによって手動で作成されます。サービスアカウントは、`Secrets`として保存された資格情報の集合に紐付けられています。これをPodにマウントすることで、クラスター内のプロセスがKubernetes APIと通信できるようにします。 + +APIリクエストは、通常のユーザーかサービスアカウントに紐付けられているか、[匿名リクエスト](#anonymous-requests)として扱われます。つまり、ワークステーションで`kubectl`を入力する人間のユーザーから、ノード上の`kubelets`やコントロールプレーンのメンバーまで、クラスター内外の全てのプロセスは、APIサーバーへのリクエストを行う際に認証を行うか匿名ユーザーとして扱われる必要があります。 + +## 認証戦略 + +Kubernetesは、クライアント証明書、Bearerトークン、認証プロキシー、HTTP Basic認証を使い、認証プラグインを通してAPIリクエストを認証します。APIサーバーにHTTPリクエストが送信されると、プラグインは以下の属性をリクエストに関連付けようとします。 + +* ユーザー名: エンドユーザーを識別する文字列です。一般的にな値は、`kube-admin`や`jane@example.com`です。 +* UID: エンドユーザーを識別する文字列であり、ユーザー名よりも一貫性と一意性を持たせようとするものです。 +* グループ: 各要素がユーザーの役割を示すような意味を持つ文字列の集合です。`system:masters`や`devops-team`といった値が一般的です。 +* 追加フィールド: 認証者が有用と思われる追加情報を保持する文字列のリストに対する、文字列のマップです。 + +すべての値は認証システムに対して非透過であり、[認可機能](/docs/reference/access-authn-authz/authorization/)が解釈した場合にのみ意味を持ちます。 + + +一度に複数の認証方法を有効にすることができます。通常は、以下のように少なくとも2つの方法を使用するべきです。 + + - サービスアカウント用のサービスアカウントトークン + - ユーザー認証のための、少なくとも1つの他の方法 + +複数の認証モジュールが有効化されている場合、リクエストの認証に成功した最初のモジュールが、評価が簡略化します。APIサーバーは、認証の実行順序を保証しません。 + +`system:authenticated`グループには、すべての認証済みユーザーのグループのリストが含まれます。 + +他の認証プロトコル(LDAP、SAML、Kerberos、X509スキームなど)との統合は、[認証プロキシー](#authenticating-proxy)や[認証Webhook](#webhook-token-authentication)を使用して実施できます。 + + +### X509クライアント証明書 + +クライアント証明書認証は、APIサーバーに`--client-ca-file=SOMEFILE`オプションを渡すことで有効になります。参照されるファイルには、APIサーバーに提示されたクライアント証明書を検証するために使用する1つ以上の認証局が含まれている必要があります。クライアント証明書が提示され、検証された場合、サブジェクトのCommon Nameがリクエストのユーザー名として使用されます。Kubernetes1.4時点では、クライアント証明書は、証明書のOrganizationフィールドを使用して、ユーザーのグループメンバーシップを示すこともできます。あるユーザーに対して複数のグループメンバーシップを含めるには、証明書に複数のOrganizationフィールドを含めます。 + +例えば、証明書署名要求を生成するために、`openssl`コマンドラインツールを使用します。 + +``` bash +openssl req -new -key jbeda.pem -out jbeda-csr.pem -subj "/CN=jbeda/O=app1/O=app2" +``` + +これにより、"app1"と"app2"の2つのグループに属するユーザー名"jbeda"の証明書署名要求が作成されます。 + +クライアント証明書の生成方法については、[証明書の管理](/docs/concepts/cluster-administration/certificates/)を参照してください。 + +### 静的なトークンファイル + +コマンドラインで`--token-auth-file=SOMEFILE`オプションを指定すると、APIサーバーはファイルからBearerトークンを読み込みます。現在のところ、トークンの有効期限は無く、APIサーバーを再起動しない限りトークンのリストを変更することはできません。 + +トークンファイルは、トークン、ユーザー名、ユーザーUIDの少なくとも3つの列を持つcsvファイルで、その後にオプションでグループ名が付きます。 + +{{< note >}} +複数のグループがある場合はダブルクォートで囲む必要があります。 + +```conf +token,user,uid,"group1,group2,group3" +``` +{{< /note >}} + +#### リクエストにBearerトークンを含める {#putting-a-bearer-token-in-a-request} + +HTTPクライアントからBearerトークン認証を利用する場合、APIサーバーは`Bearer THETOKEN`という値を持つ`Authorization`ヘッダーを待ち受けます。Bearerトークンは、HTTPのエンコーディングとクォート機能を利用してHTTPヘッダーの値に入れることができる文字列でなければなりません。例えば、Bearerトークンが`31ada4fd-adec-460c-809a-9e56ceb75269`であれば、HTTPのヘッダを以下のようにします。 + +```http +Authorization: Bearer 31ada4fd-adec-460c-809a-9e56ceb75269 +``` + +### ブートストラップトークン + +{{< feature-state for_k8s_version="v1.18" state="stable" >}} + +新しいクラスタの効率的なブートストラップを可能にするために、Kubernetesには*ブートストラップトークン*と呼ばれる動的に管理されたBearerトークンタイプが含まれています。これらのトークンは、`kube-system`名前空間にSecretsとして格納され、動的に管理したり作成したりすることができます。コントローラーマネージャーには、TokenCleanerコントローラーが含まれており、ブートストラップトークンの有効期限が切れると削除します。 + +トークンの形式は`[a-z0-9]{6}.[a-z0-9]{16}`です。最初のコンポーネントはトークンIDであり、第2のコンポーネントはToken Secretです。以下のように、トークンをHTTPヘッダーに指定します。 + +```http +Authorization: Bearer 781292.db7bc3a58fc5f07e +``` + +APIサーバーの`--enable-bootstrap-token-auth`フラグで、Bootstrap Token Authenticatorを有効にする必要があります。TokenCleanerコントローラーを有効にするには、コントローラーマネージャーの`--controllers`フラグを使います。`--controllers=*,tokencleaner`のようにして行います。クラスターをブートストラップするために`kubeadm`を使用している場合は、`kubeadm`がこれを代行してくれます。 + +認証機能は`system:bootstrap:`という名前で認証します。これは`system:bootstrappers`グループに含まれます。名前とグループは意図的に制限されており、ユーザーがブートストラップ後にこれらのトークンを使わないようにしています。ユーザー名とグループは、クラスタのブートストラップをサポートする適切な認可ポリシーを作成するために使用され、`kubeadm`によって使用されます。 + +ブートストラップトークンの認証機能やコントローラーについての詳細な説明、`kubeadm`でこれらのトークンを管理する方法については、[ブートストラップトークン](/docs/reference/access-authn-authz/bootstrap-tokens/)を参照してください。 + +### 静的なパスワードファイル + +APIサーバーに`--basic-auth-file=SOMEFILE`オプションを渡すことで、Basic認証を有効にすることができます。現在のところ、Basic認証の認証情報は有効期限が無く、APIサーバーを再起動しない限りパスワードを変更することはできません。よりセキュアなモードをさらに使いやすくするための改良が完了するまでの間、現時点では利便性のためにBasic認証がサポートされていることに注意してください。 + +Basic認証ファイルは、トークン、ユーザー名、ユーザーIDの少なくとも3つの列を持つcsvファイルです。 +Kubernetesのバージョン1.6以降では、オプションとしてカンマ区切りのグループ名を含む4列目を指定することができます。複数のグループがある場合は、4列目の値をダブルクォート(")で囲む必要があります。以下の例を参照してください。 + +```conf +password,user,uid,"group1,group2,group3" +``` + +HTTPクライアントからBasic認証を利用する場合、APIサーバーは`Basic BASE64ENCODED(USER:PASSWORD)`の値を持つ`Authorization`ヘッダーを待ち受けます。 + +### サービスアカウントトークン + +サービスアカウントは、自動的に有効化される認証機能で、署名されたBearerトークンを使ってリクエストを検証します。このプラグインは、オプションとして2つのフラグを取ります。 + +* `--service-account-key-file`: Bearerトークンに署名するためのPEMエンコードされた鍵を含むファイルです。指定しない場合は、APIサーバーのTLS秘密鍵が使われます。 +* `--service-account-lookup`: 有効にすると、APIから削除されたトークンは取り消されます。 + +サービスアカウントは通常、APIサーバーによって自動的に作成され、`ServiceAccount`[Admission Controller](/docs/reference/access-authn-authz/admission-controllers/)を介してクラスター内のPodに関連付けられます。Bearerトークンは、Podのよく知られた場所にマウントされ、これによりクラスター内のプロセスがAPIサーバー通信できるようになります。アカウントは`PodSpec`の`serviceAccountName`フィールドを使って、明示的にPodに関連付けることができます。 + +{{< note >}} +自動で行われるため、通常`serviceAccountName`は省略します。 +{{< /note >}} + +```yaml +apiVersion: apps/v1 # このapiVersionは、Kubernetes1.9時点で適切です +kind: Deployment +metadata: + name: nginx-deployment + namespace: default +spec: + replicas: 3 + template: + metadata: + # ... + spec: + serviceAccountName: bob-the-bot + containers: + - name: nginx + image: nginx:1.14.2 +``` + +サービスアカウントのBearerトークンは、クラスター外で使用するために完全に有効であり、Kubernetes APIと通信したい長期的なジョブのアイデンティティを作成するために使用することができます。サービスアカウントを手動で作成するには、単に`kubectl create serviceaccount (NAME)`コマンドを使用します。これにより、現在の名前空間にサービスアカウントと関連するSecretが作成されます。 + + +```bash +kubectl create serviceaccount jenkins +``` + +```none +serviceaccount "jenkins" created +``` + +以下のように、関連するSecretを確認できます。 + +```bash +kubectl get serviceaccounts jenkins -o yaml +``` + +```yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + # ... +secrets: +- name: jenkins-token-1yvwg +``` + +作成されたSecretは、APIサーバーのパブリック認証局と署名されたJSON Web Token(JWT)を保持します。 + +```bash +kubectl get secret jenkins-token-1yvwg -o yaml +``` + +```yaml +apiVersion: v1 +data: + ca.crt: (base64でエンコードされたAPIサーバーの認証局) + namespace: ZGVmYXVsdA== + token: (base64でエンコードされたBearerトークン) +kind: Secret +metadata: + # ... +type: kubernetes.io/service-account-token +``` + +{{< note >}} +Secretは常にbase64でエンコードされるため、これらの値もbase64でエンコードされています。 +{{< /note >}} + +署名されたJWTは、与えられたサービスアカウントとして認証するためのBearerトークンとして使用できます。トークンをリクエストに含める方法については、[リクエストにBearerトークンを含める](#putting-a-bearer-token-in-a-request)を参照してください。通常、これらのSecretはAPIサーバーへのクラスタ内アクセス用にPodにマウントされますが、クラスター外からも使用することができます。 + +サービスアカウントは、ユーザー名`system:serviceaccount:(NAMESPACE):(SERVICEACCOUNT)`で認証され、グループ`system:serviceaccounts`と`system:serviceaccounts:(NAMESPACE)`に割り当てられます。 + +警告: サービスアカウントトークンはSecretに保持されているため、Secretにアクセスできるユーザーは誰でもサービスアカウントとして認証することができます。サービスアカウントに権限を付与したり、Secretの読み取り機能を付与したりする際には注意が必要です。 + +### OpenID Connectトークン +[OpenID Connect](https://openid.net/connect/)は、Azure Active Directory、Salesforce、Googleなど、いくつかのOAuth2プロバイダーでサポートされているOAuth2の一種です。 +このプロトコルのOAuth2の主な拡張機能は、[ID Token](https://openid.net/specs/openid-connect-core-1_0.html#IDToken)と呼ばれる、アクセストークンとアクセストークンと一緒に返される追加フィールドです。 +このトークンは、ユーザーの電子メールなどのよく知られたフィールドを持つJSON Web Token(JWT)であり、サーバーによって署名されています。トークンをリクエストに含める方法については、[リクエストにBearerトークンを含める](#putting-a-bearer-token-in-a-request)を参照してください。 + +![Kubernetes OpenID Connect Flow](/images/docs/admin/k8s_oidc_login.svg) + +1. IDプロバイダーにログインします +2. IDプロバイダーは、`access_token`、`id_token`、`refresh_token`を提供します +3. `kubectl`を使う場合は、`--token`フラグで`id_token`を使うか、`kubeconfig`に直接追加してください +4. `kubectl`は、`id_token`をAuthorizationと呼ばれるヘッダーでAPIサーバーに送ります +5. APIサーバーは、設定で指定された証明書と照合することで、JWT署名が有効であることを確認します +6. `id_token`の有効期限が切れていないことを確認します +7. ユーザーが認可されていることを確認します +8. 認可されると、APIサーバーは`kubectl`にレスポンスを返します +9. `kubectl`はユーザーにフィードバックを提供します + +自分が誰であるかを確認するために必要なデータはすべて`id_token`の中にあるので、KubernetesはIDプロバイダーと通信する必要がありません。すべてのリクエストがステートレスであるモデルでは、これは非常に認証のためのスケーラブルなソリューションを提供します。一方で、以下のようにいくつか課題があります。 + +1. Kubernetesには、認証プロセスを起動するための"Webインターフェース"がありません。クレデンシャルを収集するためのブラウザやインターフェースがないため、まずIDプロバイダに認証を行う必要があります。 +2. `id_token`は、取り消すことができません。これは証明書のようなもので、有効期限が短い(数分のみ)必要があるので、数分ごとに新しいトークンを取得しなければならないのは非常に面倒です。 +3. Kubernetesダッシュボードへの認証において、`kubectl proxy`コマンドや`id_token`を注入するリバースプロキシーを使う以外に、簡単な方法はありません。 + + +#### APIサーバーの設定 + +プラグインを有効にするには、APIサーバーで以下のフラグを設定します。 + +| パラメーター | 説明 | 例 | 必須か | +| --------- | ----------- | ------- | ------- | +| `--oidc-issuer-url` | APIサーバーが公開署名鍵を発見できるようにするプロバイダーのURLです。 `https://`スキームを使用するURLのみが受け入れられます。これは通常、"https://accounts.google.com"や"https://login.salesforce.com"のようにパスを持たないプロバイダのディスカバリーURLです。このURLは、`.well-known/openid-configuration`の下のレベルを指す必要があります。 | ディスカバリーURLが`https://accounts.google.com/.well-known/openid-configuration`である場合、値は`https://accounts.google.com`とします。 | はい | +| `--oidc-client-id` | すべてのトークンが発行されなければならないクライアントIDです。 | kubernetes | はい | +| `--oidc-username-claim` | ユーザー名として使用するJWTのクレームを指定します。デフォルトでは`sub`が使用されますが、これはエンドユーザーの一意の識別子であることが期待されます。管理者はプロバイダーに応じて`email`や`name`などの他のクレームを選択することができます。ただし、他のプラグインとの名前の衝突を防ぐために、`email`以外のクレームには、プレフィックスとして発行者のURLが付けられます。 | sub | いいえ | +| `--oidc-username-prefix` | 既存の名前(`system:`ユーザーなど)との衝突を防ぐために、ユーザー名の前にプレフィックスを付加します。例えば`oidc:`という値は、`oidc:jane.doe`のようなユーザー名を生成します。このフラグが指定されておらず、`--oidc-username-claim`が`email`以外の値である場合、プレフィックスのデフォルトは`(Issuer URL)#`で、`(Issuer URL)`は`--oidc-issuer-url`の値です。すべてのプレフィックスを無効にするためには、`-`という値を使用できます。 | `oidc:` | いいえ | +| `--oidc-groups-claim` | ユーザーのグループとして使用するJWTのクレームです。クレームがある場合は、文字列の配列である必要があります。 | groups | いいえ | +| `--oidc-groups-prefix` | 既存の名前(`system:`グループなど)との衝突を防ぐために、グループ名の前にプレフィックスを付加します。例えば`oidc:`という値は、`oidc:engineering`や`oidc:infra`のようなグループ名を生成します。 | `oidc:` | いいえ | +| `--oidc-required-claim` | IDトークンの中の必須クレームを記述するkey=valueのペアです。設定されている場合、クレームが一致する値でIDトークンに存在することが検証されます。このフラグを繰り返して複数のクレームを指定します。 | `claim=value` | いいえ | +| `--oidc-ca-file` | IDプロバイダーのWeb証明書に署名した認証局の証明書へのパスです。デフォルトはホストのルート認証局が指定されます。 | `/etc/kubernetes/ssl/kc-ca.pem` | いいえ | + +重要なのは、APIサーバーはOAuth2クライアントではなく、ある単一の発行者を信頼するようにしか設定できないことです。これにより、サードパーティーに発行されたクレデンシャルを信頼せずに、Googleのようなパブリックプロバイダーを使用することができます。複数のOAuthクライアントを利用したい管理者は、`azp`クレームをサポートしているプロバイダや、あるクライアントが別のクライアントに代わってトークンを発行できるような仕組みを検討する必要があります。 + +KubernetesはOpenID Connect IDプロバイダーを提供していません。既存のパブリックなOpenID Connect IDプロバイダー(Googleや[その他](http://connect2id.com/products/nimbus-oauth-openid-connect-sdk/openid-connect-providers)など)を使用できます。もしくは、CoreOS [dex](https://github.com/coreos/dex)、[Keycloak](https://github.com/keycloak/keycloak)、CloudFoundry[UAA](https://github.com/cloudfoundry/uaa)、Tremolo Securityの[OpenUnison](https://github.com/tremolosecurity/openunison)など、独自のIDプロバイダーを実行することもできます。 + +IDプロバイダーがKubernetesと連携するためには、以下のことが必要です。 + +1. すべてではないが、[OpenID Connect Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html)をサポートしていること +2. 廃れていない暗号を用いたTLSで実行されていること +3. 認証局が署名した証明書を持っていること(認証局が商用ではない場合や、自己署名の場合も可) + +上述の要件#3、認証局署名付き証明書を必要とすることについて、注意事項があります。GoogleやMicrosoftなどのクラウドプロバイダーではなく、独自のIDプロバイダーをデプロイする場合は、たとえ自己署名されていても、`CA`フラグが`TRUE`に設定されている証明書によって署名されたIDプロバイダーのWebサーバー証明書を持っていなければなりません。これは、Go言語のTLSクライアント実装が、証明書検証に関する標準に対して非常に厳格であるためです。認証局をお持ちでない場合は、CoreOSチームの[このスクリプト](https://github.com/coreos/dex/blob/1ee5920c54f5926d6468d2607c728b71cfe98092/examples/k8s/gencert.sh)を使用して、シンプルな認証局と署名付きの証明書と鍵のペアを作成することができます。 +または、[この類似のスクリプト](https://raw.githubusercontent.com/TremoloSecurity/openunison-qs-kubernetes/master/src/main/bash/makessl.sh)を使って、より寿命が長く、よりキーサイズの大きいSHA256証明書を生成できます。 + +特定のシステム用のセットアップ手順は、以下を参照してください。 + +- [UAA](https://docs.cloudfoundry.org/concepts/architecture/uaa.html) +- [Dex](https://github.com/dexidp/dex/blob/master/Documentation/kubernetes.md) +- [OpenUnison](https://www.tremolosecurity.com/orchestra-k8s/) + +#### kubectlの使用 + +##### 選択肢1 - OIDC認証機能 + +最初の選択肢は、kubectlの`oidc`認証機能を利用することです。これはすべてのリクエストのBearerトークンとして`id_token`を設定し、有効期限が切れるとトークンを更新します。プロバイダーにログインした後、kubectlを使って`id_token`、`refresh_token`、`client_id`、`client_secret`を追加してプラグインを設定します。 + +リフレッシュトークンのレスポンスの一部として`id_token`を返さないプロバイダーは、このプラグインではサポートされていないので、以下の"選択肢2"を使用してください。 + +```bash +kubectl config set-credentials USER_NAME \ + --auth-provider=oidc \ + --auth-provider-arg=idp-issuer-url=( issuer url ) \ + --auth-provider-arg=client-id=( your client id ) \ + --auth-provider-arg=client-secret=( your client secret ) \ + --auth-provider-arg=refresh-token=( your refresh token ) \ + --auth-provider-arg=idp-certificate-authority=( path to your ca certificate ) \ + --auth-provider-arg=id-token=( your id_token ) +``` + +例として、IDプロバイダーに認証した後に以下のコマンドを実行します。 + +```bash +kubectl config set-credentials mmosley \ + --auth-provider=oidc \ + --auth-provider-arg=idp-issuer-url=https://oidcidp.tremolo.lan:8443/auth/idp/OidcIdP \ + --auth-provider-arg=client-id=kubernetes \ + --auth-provider-arg=client-secret=1db158f6-177d-4d9c-8a8b-d36869918ec5 \ + --auth-provider-arg=refresh-token=q1bKLFOyUiosTfawzA93TzZIDzH2TNa2SMm0zEiPKTUwME6BkEo6Sql5yUWVBSWpKUGphaWpxSVAfekBOZbBhaEW+VlFUeVRGcluyVF5JT4+haZmPsluFoFu5XkpXk5BXqHega4GAXlF+ma+vmYpFcHe5eZR+slBFpZKtQA= \ + --auth-provider-arg=idp-certificate-authority=/root/ca.pem \ + --auth-provider-arg=id-token=eyJraWQiOiJDTj1vaWRjaWRwLnRyZW1vbG8ubGFuLCBPVT1EZW1vLCBPPVRybWVvbG8gU2VjdXJpdHksIEw9QXJsaW5ndG9uLCBTVD1WaXJnaW5pYSwgQz1VUy1DTj1rdWJlLWNhLTEyMDIxNDc5MjEwMzYwNzMyMTUyIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL29pZGNpZHAudHJlbW9sby5sYW46ODQ0My9hdXRoL2lkcC9PaWRjSWRQIiwiYXVkIjoia3ViZXJuZXRlcyIsImV4cCI6MTQ4MzU0OTUxMSwianRpIjoiMm96US15TXdFcHV4WDlHZUhQdy1hZyIsImlhdCI6MTQ4MzU0OTQ1MSwibmJmIjoxNDgzNTQ5MzMxLCJzdWIiOiI0YWViMzdiYS1iNjQ1LTQ4ZmQtYWIzMC0xYTAxZWU0MWUyMTgifQ.w6p4J_6qQ1HzTG9nrEOrubxIMb9K5hzcMPxc9IxPx2K4xO9l-oFiUw93daH3m5pluP6K7eOE6txBuRVfEcpJSwlelsOsW8gb8VJcnzMS9EnZpeA0tW_p-mnkFc3VcfyXuhe5R3G7aa5d8uHv70yJ9Y3-UhjiN9EhpMdfPAoEB9fYKKkJRzF7utTTIPGrSaSU6d2pcpfYKaxIwePzEkT4DfcQthoZdy9ucNvvLoi1DIC-UocFD8HLs8LYKEqSxQvOcvnThbObJ9af71EwmuE21fO5KzMW20KtAeget1gnldOosPtz1G5EwvaQ401-RPQzPGMVBld0_zMCAwZttJ4knw +``` + +これは以下のような構成になります。 + +```yaml +users: +- name: mmosley + user: + auth-provider: + config: + client-id: kubernetes + client-secret: 1db158f6-177d-4d9c-8a8b-d36869918ec5 + id-token: eyJraWQiOiJDTj1vaWRjaWRwLnRyZW1vbG8ubGFuLCBPVT1EZW1vLCBPPVRybWVvbG8gU2VjdXJpdHksIEw9QXJsaW5ndG9uLCBTVD1WaXJnaW5pYSwgQz1VUy1DTj1rdWJlLWNhLTEyMDIxNDc5MjEwMzYwNzMyMTUyIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL29pZGNpZHAudHJlbW9sby5sYW46ODQ0My9hdXRoL2lkcC9PaWRjSWRQIiwiYXVkIjoia3ViZXJuZXRlcyIsImV4cCI6MTQ4MzU0OTUxMSwianRpIjoiMm96US15TXdFcHV4WDlHZUhQdy1hZyIsImlhdCI6MTQ4MzU0OTQ1MSwibmJmIjoxNDgzNTQ5MzMxLCJzdWIiOiI0YWViMzdiYS1iNjQ1LTQ4ZmQtYWIzMC0xYTAxZWU0MWUyMTgifQ.w6p4J_6qQ1HzTG9nrEOrubxIMb9K5hzcMPxc9IxPx2K4xO9l-oFiUw93daH3m5pluP6K7eOE6txBuRVfEcpJSwlelsOsW8gb8VJcnzMS9EnZpeA0tW_p-mnkFc3VcfyXuhe5R3G7aa5d8uHv70yJ9Y3-UhjiN9EhpMdfPAoEB9fYKKkJRzF7utTTIPGrSaSU6d2pcpfYKaxIwePzEkT4DfcQthoZdy9ucNvvLoi1DIC-UocFD8HLs8LYKEqSxQvOcvnThbObJ9af71EwmuE21fO5KzMW20KtAeget1gnldOosPtz1G5EwvaQ401-RPQzPGMVBld0_zMCAwZttJ4knw + idp-certificate-authority: /root/ca.pem + idp-issuer-url: https://oidcidp.tremolo.lan:8443/auth/idp/OidcIdP + refresh-token: q1bKLFOyUiosTfawzA93TzZIDzH2TNa2SMm0zEiPKTUwME6BkEo6Sql5yUWVBSWpKUGphaWpxSVAfekBOZbBhaEW+VlFUeVRGcluyVF5JT4+haZmPsluFoFu5XkpXk5BXq + name: oidc +``` +`id_token`の有効期限が切れると、`kubectl`は`refresh_token`と`client_secret`を用いて`id_token`の更新しようとします。`refresh_token`と`id_token`の新しい値は、`.kube/config`に格納されます。 + +##### 選択肢2 - `--token`オプションの使用 + +`kubectl`コマンドでは、`--token`オプションを使ってトークンを渡すことができる。以下のように、このオプションに`id_token`をコピーして貼り付けるだけです。 + +```bash +kubectl --token=eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL21sYi50cmVtb2xvLmxhbjo4MDQzL2F1dGgvaWRwL29pZGMiLCJhdWQiOiJrdWJlcm5ldGVzIiwiZXhwIjoxNDc0NTk2NjY5LCJqdGkiOiI2RDUzNXoxUEpFNjJOR3QxaWVyYm9RIiwiaWF0IjoxNDc0NTk2MzY5LCJuYmYiOjE0NzQ1OTYyNDksInN1YiI6Im13aW5kdSIsInVzZXJfcm9sZSI6WyJ1c2VycyIsIm5ldy1uYW1lc3BhY2Utdmlld2VyIl0sImVtYWlsIjoibXdpbmR1QG5vbW9yZWplZGkuY29tIn0.f2As579n9VNoaKzoF-dOQGmXkFKf1FMyNV0-va_B63jn-_n9LGSCca_6IVMP8pO-Zb4KvRqGyTP0r3HkHxYy5c81AnIh8ijarruczl-TK_yF5akjSTHFZD-0gRzlevBDiH8Q79NAr-ky0P4iIXS8lY9Vnjch5MF74Zx0c3alKJHJUnnpjIACByfF2SCaYzbWFMUNat-K1PaUk5-ujMBG7yYnr95xD-63n8CO8teGUAAEMx6zRjzfhnhbzX-ajwZLGwGUBT4WqjMs70-6a7_8gZmLZb2az1cZynkFRj2BaCkVT3A2RrjeEwZEtGXlMqKJ1_I2ulrOVsYx01_yD35-rw get nodes +``` + + +### Webhookトークン認証 {#webhook-token-authentication} + +Webhook認証は、Bearerトークンを検証するためのフックです。 + +* `--authentication-token-webhook-config-file`: リモートのWebhookサービスへのアクセス方法を記述した設定ファイルです +* `--authentication-token-webhook-cache-ttl`: 認証をキャッシュする時間を決定します。デフォルトは2分です + +設定ファイルは、[kubeconfig](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/)のファイル形式を使用します。 +ファイル内で、`clusters`はリモートサービスを、`users`はAPIサーバーのWebhookを指します。例えば、以下のようになります。 + +```yaml +# Kubernetes APIのバージョン +apiVersion: v1 +# APIオブジェクトの種類 +kind: Config +# clustersは、リモートサービスを指します。 +clusters: + - name: name-of-remote-authn-service + cluster: + certificate-authority: /path/to/ca.pem # リモートサービスを検証するためのCA + server: https://authn.example.com/authenticate # クエリするリモートサービスのURL。'https'を使用する必要があります。 + +# usersは、APIサーバーのWebhook設定を指します。 +users: + - name: name-of-api-server + user: + client-certificate: /path/to/cert.pem # Webhookプラグインを使うための証明書 + client-key: /path/to/key.pem # 証明書に合致する鍵 + +# kubeconfigファイルにはコンテキストが必要です。APIサーバー用のものを用意してください。 +current-context: webhook +contexts: +- context: + cluster: name-of-remote-authn-service + user: name-of-api-sever + name: webhook +``` + +クライアントが[上記](#putting-a-bearer-token-in-a-request)のようにBearerトークンを使用してAPIサーバーとの認証を試みた場合、認証Webhookはトークンを含むJSONでシリアライズされた`authentication.k8s.io/v1beta1` `TokenReview`オブジェクトをリモートサービスにPOSTします。Kubernetesはそのようなヘッダーが不足しているリクエストを作成しようとはしません。 + +Webhook APIオブジェクトは、他のKubernetes APIオブジェクトと同じように、[Versioning Compatibility Rule](/docs/concepts/overview/kubernetes-api/)に従うことに注意してください。実装者は、ベータオブジェクトで保証される互換性が緩いことに注意し、正しいデシリアライゼーションが使用されるようにリクエストの"apiVersion"フィールドを確認する必要があります。さらにAPIサーバーは、API拡張グループ`authentication.k8s.io/v1beta1`を有効にしなければなりません(`--runtime config=authentication.k8s.io/v1beta1=true`)。 + +POSTボディは、以下の形式になります。 + +```json +{ + "apiVersion": "authentication.k8s.io/v1beta1", + "kind": "TokenReview", + "spec": { + "token": "(Bearerトークン)" + } +} +``` + +リモートサービスはログインの成功を示すために、リクエストの`status`フィールドを埋めることが期待されます。レスポンスボディの`spec`フィールドは無視され、省略することができます。Bearerトークンの検証に成功すると、以下のようにBearerトークンが返されます。 + +```json +{ + "apiVersion": "authentication.k8s.io/v1beta1", + "kind": "TokenReview", + "status": { + "authenticated": true, + "user": { + "username": "janedoe@example.com", + "uid": "42", + "groups": [ + "developers", + "qa" + ], + "extra": { + "extrafield1": [ + "extravalue1", + "extravalue2" + ] + } + } + } +} +``` + +リクエストに失敗した場合は、以下のように返されます。 + +```json +{ + "apiVersion": "authentication.k8s.io/v1beta1", + "kind": "TokenReview", + "status": { + "authenticated": false + } +} +``` + +HTTPステータスコードは、追加のエラーコンテキストを提供するために使うことができます。 + + +### 認証プロキシー {#authenticating-proxy} + +APIサーバーは、`X-Remote-User`のようにリクエストヘッダの値からユーザーを識別するように設定することができます。 +これは、リクエストヘッダの値を設定する認証プロキシーと組み合わせて使用するために設計です。 + +* `--requestheader-username-headers`: 必須であり、大文字小文字を区別しません。ユーザーのIDをチェックするためのヘッダー名を順番に指定します。値を含む最初のヘッダーが、ユーザー名として使われます。 +* `--requestheader-group-headers`: バージョン1.6以降で任意であり、大文字小文字を区別しません。"X-Remote-Group"を推奨します。ユーザーのグループをチェックするためのヘッダー名を順番に指定します。指定されたヘッダーの全ての値が、グループ名として使われます。 +* `--requestheader-extra-headers-prefix` バージョン1.6以降で任意であり、大文字小文字を区別しません。"X-Remote-Extra-"を推奨します。ユーザーに関する追加情報を判断するために検索するヘッダーのプレフィックスです。通常、設定された認可プラグインによって使用されます。指定されたプレフィックスのいずれかで始まるヘッダーは、プレフィックスが削除されます。ヘッダー名の残りの部分は小文字化され[パーセントデコーディング](https://tools.ietf.org/html/rfc3986#section-2.1)されて追加のキーとなり、ヘッダーの値が追加の値となります。 + +{{< note >}} +1.11.3(および1.10.7、1.9.11)よりも前のバージョンでは、追加のキーには[HTTPヘッダーラベルで使用可能な文字](https://tools.ietf.org/html/rfc7230#section-3.2.6)のみを含めることができました。 +{{< /note >}} + +例えば、このような設定を行います。 + +``` +--requestheader-username-headers=X-Remote-User +--requestheader-group-headers=X-Remote-Group +--requestheader-extra-headers-prefix=X-Remote-Extra- +``` + +以下のようなリクエストを考えます。 + +```http +GET / HTTP/1.1 +X-Remote-User: fido +X-Remote-Group: dogs +X-Remote-Group: dachshunds +X-Remote-Extra-Acme.com%2Fproject: some-project +X-Remote-Extra-Scopes: openid +X-Remote-Extra-Scopes: profile +``` + +このリクエストは、このユーザー情報を取得します。 + +```yaml +name: fido +groups: +- dogs +- dachshunds +extra: + acme.com/project: + - some-project + scopes: + - openid + - profile +``` + +ヘッダーのスプーフィングを防ぐため、認証プロキシーはリクエストヘッダーがチェックされる前に、指定された認証局に対する検証のために有効なクライアント証明書をAPIサーバーへ提示する必要があります。 + + +* `--requestheader-client-ca-file`: 必須です。PEMエンコードされた証明書バンドルです。有効なクライアント証明書を提示し、リクエストヘッダーでユーザー名がチェックされる前に、指定されたファイル内の認証局に対して検証する必要があります。 +* `--requestheader-allowed-names`: 任意です。Common Name(CN)の値のリストです。設定されている場合、リクエストヘッダーでユーザー名がチェックされる前に、指定されたリストのCNを持つ有効なクライアント証明書を提示する必要があります。空の場合は、任意のCNが許可されます。 + + +## 匿名リクエスト {#anonymous-requests} + +この機能を有効にすると、他の設定された認証方法で拒否されなかったリクエストは匿名リクエストとして扱われ、 `system:anonymous`というユーザー名と`system:unauthenticated`というグループが与えられます。 + +例えば、トークン認証が設定されており、匿名アクセスが有効になっているサーバー上で、無効なBearerトークンを提供するリクエストは`401 Unauthorized`エラーを受け取ります。Bearerトークンを提供しないリクエストは匿名リクエストとして扱われます。 + +バージョン1.5.1から1.5.xでは、匿名アクセスはデフォルトでは無効になっており、APIサーバーに `--anonymous-auth=true`オプションを渡すことで有効にすることができます。 + +バージョン1.6以降では、`AlwaysAllow`以外の認証モードが使用されている場合、匿名アクセスがデフォルトで有効であり、`--anonymous-auth=false`オプションをAPIサーバーに渡すことで無効にできます。 +1.6以降、ABACおよびRBAC認可機能は、`system:anonymous`ユーザーまたは`system:unauthenticated`グループの明示的な認証を必要とするようになったため、`*`ユーザーまたは`*`グループへのアクセスを許可する従来のポリシールールには匿名ユーザーは含まれません。 + +## ユーザーの偽装 + +ユーザーは偽装ヘッダーを使って別のユーザーとして振る舞うことができます。これにより、リクエストが認証したユーザー情報を手動で上書きすることが可能です。例えば、管理者はこの機能を使って一時的に別のユーザーに偽装、リクエストが拒否されたかどうかを確認することで認可ポリシーをデバッグすることができます。 + +偽装リクエストは最初にリクエスト中のユーザーとして認証を行い、次に偽装ユーザー情報に切り替えます。 + +* ユーザーは、認証情報と偽装ヘッダーを使ってAPIコールを行います。 +* APIサーバーはユーザーを認証します。 +* APIサーバーは、認証されたユーザーが偽装した権限を持っていることを確認します。 +* リクエストされたユーザー情報は、偽装した値に置き換えられます。 +* リクエストが評価され、認可は偽装されたユーザー情報に基づいて実行されます。 + +偽装リクエストを実行する際には、以下のHTTPヘッダを使用することができます。 + +* `Impersonate-User`: ユーザー名を指定します。このユーザーとして振る舞います。 +* `Impersonate-Group`: グループ名を指定します。このグループとして振る舞います。複数回指定して複数のグループを設定することができます。任意であり、"Impersonate-User"が必要です。 +* `Impersonate-Extra-( extra name )`: 追加フィールドをユーザーに関連付けるために使用される動的なヘッダーです。任意であり、"Impersonate-User"が必要です。一貫して保存されるためには、`( extra name )`は小文字である必要があり、[HTTPヘッダーラベルで使用可能な文字](https://tools.ietf.org/html/rfc7230#section-3.2.6)以外の文字は、UTF-8であり、[パーセントエンコーディング](https://tools.ietf.org/html/rfc3986#section-2.1)されている必要があります. + +{{< note >}} +1.11.3(および1.10.7、1.9.11)よりも前のバージョンでは、`( extra name )`には[HTTPヘッダーラベルで使用可能な文字](https://tools.ietf.org/html/rfc7230#section-3.2.6)のみを含めることができました。 +{{< /note >}} + +以下が、ヘッダーの例です。 + +```http +Impersonate-User: jane.doe@example.com +Impersonate-Group: developers +Impersonate-Group: admins +Impersonate-Extra-dn: cn=jane,ou=engineers,dc=example,dc=com +Impersonate-Extra-acme.com%2Fproject: some-project +Impersonate-Extra-scopes: view +Impersonate-Extra-scopes: development +``` + +`kubectl`を使う場合は、`--as`フラグに`Impersonate-User`ヘッダーを、`--as-group`フラグに`Impersonate-Group`ヘッダーを設定します。 + + +```bash +kubectl drain mynode +``` + +```none +Error from server (Forbidden): User "clark" cannot get nodes at the cluster scope. (get nodes mynode) +``` + +`--as`フラグと`--as-group`フラグを設定します。 + +```bash +kubectl drain mynode --as=superman --as-group=system:masters +``` + +```none +node/mynode cordoned +node/mynode drained +``` + +ユーザー、グループ、または追加フィールドを偽装するために、偽装ユーザーは偽装される属性の種類("user"、"group"など)に対して、"偽装した"操作を行う能力を持っている必要があります。RBAC認可プラグインが有効なクラスターの場合、以下のClusterRoleは、ユーザーとグループの偽装ヘッダーを設定するために必要なルールを網羅しています。 + +```yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: impersonator +rules: +- apiGroups: [""] + resources: ["users", "groups", "serviceaccounts"] + verbs: ["impersonate"] +``` + +追加フィールドは、"userextras"リソースのサブリソースとして評価されます。ユーザーが追加フィールド"scopes"に偽装ヘッダーを使用できるようにするには、ユーザーに以下のようなロールを付与する必要があります。 + +```yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: scopes-impersonator +rules: +# "Impersonate-Extra-scopes"ヘッダーを設定できます。 +- apiGroups: ["authentication.k8s.io"] + resources: ["userextras/scopes"] + verbs: ["impersonate"] +``` + +偽装ヘッダーの値は、リソースが取り得る`resourceNames`の集合を制限することで、管理することもできます。 + +```yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: limited-impersonator +rules: +# "jane.doe@example.com"というユーザーを偽装できます。 +- apiGroups: [""] + resources: ["users"] + verbs: ["impersonate"] + resourceNames: ["jane.doe@example.com"] + +# "developers"と"admins"というグループを偽装できます。 +- apiGroups: [""] + resources: ["groups"] + verbs: ["impersonate"] + resourceNames: ["developers","admins"] + +# "view"と"development"を値に持つ"scopes"という追加フィールドを偽装できます。 +- apiGroups: ["authentication.k8s.io"] + resources: ["userextras/scopes"] + verbs: ["impersonate"] + resourceNames: ["view", "development"] +``` + +## client-goクレデンシャルプラグイン + +{{< feature-state for_k8s_version="v1.11" state="beta" >}} + +`k8s.io/client-go`と、それを使用する`kubectl`や`kubelet`のようなツールは、外部コマンドを実行してユーザーの認証情報を受け取ることができます。 + +この機能は`k8s.io/client-go`がネイティブにサポートしていない認証プロトコル(LDAP、Kerberos、OAuth2、SAMLなど)とクライアントサイドで統合するためのものです。プラグインはプロトコル固有のロジックを実装し、使用する不透明なクレデンシャルを返します。ほとんどすべてのクレデンシャルプラグインのユースケースでは、クライアントプラグインが生成するクレデンシャルフォーマットを解釈するために、[Webhookトークン認証](#webhook-token-authentication)をサポートするサーバーサイドコンポーネントが必要です。 + +### 使用例 + +ある組織は、LDAPクレデンシャルをユーザー固有の署名済みトークンと交換する外部サービスを実行すると仮定します。このサービスは、トークンを検証するために[Webhookトークン認証](#webhook-token-authentication)リクエストに応答することもできます。ユーザーはワークステーションにクレデンシャルプラグインをインストールする必要があります。 + +以下のようにして、APIに対して認証を行います。 + +* ユーザーは`kubectl`コマンドを発行します。 +* クレデンシャルプラグインは、LDAPクレデンシャルの入力をユーザーに要求し、クレデンシャルを外部サービスとトークンと交換します。 +* クレデンシャルプラグインはトークンを`client-go`に返します。これはAPIサーバーに対するBearerトークンとして使用されます。 +* APIサーバーは、[Webhookトークン認証](#webhook-token-authentication)を使用して、`TokenReview`を外部サービスに送信します。 +* 外部サービスはトークンの署名を検証し、ユーザーのユーザー名とグループを返します。 + +### 設定 + +クレデンシャルプラグインの設定は、userフィールドの一部として[kubectlの設定ファイル](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/)で行います。 + +```yaml +apiVersion: v1 +kind: Config +users: +- name: my-user + user: + exec: + # 実行するコマンドです。必須です。 + command: "example-client-go-exec-plugin" + + # ExecCredentialsリソースをデコードする際に使用するAPIのバージョン。必須です。 + # + # プラグインが返すAPIのバージョンは、ここに記載されているバージョンと一致しなければなりません + # + # 複数のバージョンをサポートするツール(client.authentication.k8s.io/v1alpha1など)と統合するには、 + # 環境変数を設定するか、execプラグインが期待するバージョンを示す引数をツールに渡します。 + apiVersion: "client.authentication.k8s.io/v1beta1" + + # プラグインを実行する際に設定する環境変数です。任意です。 + env: + - name: "FOO" + value: "bar" + + # プラグインを実行する際に渡す引数です。任意です。 + args: + - "arg1" + - "arg2" +clusters: +- name: my-cluster + cluster: + server: "https://172.17.4.100:6443" + certificate-authority: "/etc/kubernetes/ca.pem" +contexts: +- name: my-cluster + context: + cluster: my-cluster + user: my-user +current-context: my-cluster +``` + +相対的なコマンドパスは、設定ファイルのディレクトリーからの相対的なものとして解釈されます。KUBECONFIGが`/home/jane/kubeconfig`に設定されていて、execコマンドが`./bin/example-client-go-exec-plugin`の場合、バイナリー`/home/jane/bin/example-client-go-exec-plugin`が実行されます。 + +```yaml +- name: my-user + user: + exec: + # kubeconfigのディレクトリーへの相対パス + command: "./bin/example-client-go-exec-plugin" + apiVersion: "client.authentication.k8s.io/v1beta1" +``` + +### 入出力フォーマット + +実行されたコマンドは`ExecCredential`オブジェクトを`stdout`に出力します。`k8s.io/client-go`は`status`で返された認証情報を用いて、Kubernetes APIに対して認証を行ういます。 + +対話的なセッションから実行する場合、`stdin`はプラグインに直接公開されます。プラグインは[TTYチェック](https://godoc.org/golang.org/x/crypto/ssh/terminal#IsTerminal)を使って、対話的にユーザーにプロンプトを出すことが適切かどうかを判断する必要があります。 + +Bearerトークンのクレデンシャルを使用するために、プラグインは`ExecCredential`のステータスにトークンを返します。 + +```json +{ + "apiVersion": "client.authentication.k8s.io/v1beta1", + "kind": "ExecCredential", + "status": { + "token": "my-bearer-token" + } +} +``` + +あるいは、PEMエンコードされたクライアント証明書と鍵を返して、TLSクライアント認証を使用することもできます。 +プラグインが後続の呼び出しで異なる証明書と鍵を返すと、`k8s.io/client-go`はサーバーとの既存の接続を閉じて、新しいTLSハンドシェイクを強制します + +指定された場合、`clientKeyData`と`clientCertificateData`両方が存在しなければなりません。 + +`clientCertificateData`には、サーバーに送信するための中間証明書を含めることができます。 + +```json +{ + "apiVersion": "client.authentication.k8s.io/v1beta1", + "kind": "ExecCredential", + "status": { + "clientCertificateData": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----", + "clientKeyData": "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----" + } +} +``` + +オプションで、レスポンスにはRFC3339のタイムスタンプとしてフォーマットされたクレデンシャルの有効期限を含めることができます。有効期限の有無には、以下のような影響あります。 + +- 有効期限が含まれている場合、BearerトークンとTLSクレデンシャルは有効期限に達するまで、またはサーバーがHTTPステータスコード401で応答したとき、またはプロセスが終了するまでキャッシュされます。 +- 有効期限が省略された場合、BearerトークンとTLSクレデンシャルはサーバーがHTTPステータスコード401で応答したとき、またはプロセスが終了するまでキャッシュされます。 + +```json +{ + "apiVersion": "client.authentication.k8s.io/v1beta1", + "kind": "ExecCredential", + "status": { + "token": "my-bearer-token", + "expirationTimestamp": "2018-03-05T17:30:20-08:00" + } +} +``` diff --git a/content/ja/docs/reference/glossary/cncf.md b/content/ja/docs/reference/glossary/cncf.md new file mode 100755 index 0000000000..85e6f60f0a --- /dev/null +++ b/content/ja/docs/reference/glossary/cncf.md @@ -0,0 +1,20 @@ +--- +title: Cloud Native Computing Foundation (CNCF) +id: cncf +date: 2019-05-26 +full_link: https://cncf.io/ +short_description: > + Cloud Native Computing Foundation + +aka: +tags: +- community +--- + Cloud Native Computing Foundation (CNCF)は、持続可能なエコシステムを構築し、マイクロサービスアーキテクチャの一部としてコンテナをオーケストレーションする[プロジェクト](https://www.cncf.io/projects/)を中心としたコミュニティを育成します。 + +KubernetesはCNCFプロジェクトです。 + + + +CNCFは[Linux Foundation](https://www.linuxfoundation.org/)のサブファウンデーションです。 +CNCFの使命は、クラウドネイティブコンピューティングをユビキタスにすることです。 diff --git a/content/ja/docs/reference/glossary/container.md b/content/ja/docs/reference/glossary/container.md index 616405a720..480934867a 100644 --- a/content/ja/docs/reference/glossary/container.md +++ b/content/ja/docs/reference/glossary/container.md @@ -4,14 +4,14 @@ id: container date: 2018-04-12 full_link: /docs/concepts/overview/what-is-kubernetes/#why-containers short_description: > - 軽量でポータブルなソフトウェアとそのすべての依存関係が含まれている実行可能なイメージ + 軽量でポータブルなソフトウェアとそのすべての依存関係が含まれている実行可能なイメージです。 aka: tags: - fundamental - workload --- - 軽量でポータブルなソフトウェアとそのすべての依存関係が含まれている実行可能なイメージ + 軽量でポータブルなソフトウェアとそのすべての依存関係が含まれている実行可能なイメージです。 diff --git a/content/ja/docs/reference/glossary/deployment.md b/content/ja/docs/reference/glossary/deployment.md index d3483b58fb..569cbbd6a1 100755 --- a/content/ja/docs/reference/glossary/deployment.md +++ b/content/ja/docs/reference/glossary/deployment.md @@ -4,7 +4,7 @@ id: deployment date: 2018-04-12 full_link: /ja/docs/concepts/workloads/controllers/deployment/ short_description: > - 複製されたアプリケーションを管理するAPIオブジェクト。 + 複製されたアプリケーションを管理するAPIオブジェクトです。 aka: tags: @@ -12,7 +12,7 @@ tags: - core-object - workload --- - 複製されたアプリケーションを管理するAPIオブジェクト。 + 複製されたアプリケーションを管理するAPIオブジェクトです。 diff --git a/content/ja/docs/reference/glossary/image.md b/content/ja/docs/reference/glossary/image.md new file mode 100755 index 0000000000..c677808747 --- /dev/null +++ b/content/ja/docs/reference/glossary/image.md @@ -0,0 +1,17 @@ +--- +title: イメージ +id: image +date: 2018-04-12 +full_link: +short_description: > + アプリケーションの実行に必要なソフトウェアのセットを持つ、保存されたコンテナの実体です。 + +aka: +tags: +- fundamental +--- + アプリケーションの実行に必要なソフトウェアのセットを持つ、保存された{{< glossary_tooltip text="コンテナ" term_id="container" >}}の実体です。 + + + +コンテナレジストリに格納し、ローカルシステムにプルして、アプリケーションとして実行できるようにするソフトウェアをパッケージ化する方法です。イメージに含まれているメタデータは、実行する実行可能ファイル、作成者、およびその他の情報を示すことができます。 diff --git a/content/ja/docs/reference/glossary/index.md b/content/ja/docs/reference/glossary/index.md index eb6d2c00fd..1f0da77b5e 100755 --- a/content/ja/docs/reference/glossary/index.md +++ b/content/ja/docs/reference/glossary/index.md @@ -1,5 +1,5 @@ --- -title: Standardized Glossary +title: 標準化用語集 layout: glossary noedit: true default_active_tag: fundamental @@ -7,6 +7,6 @@ weight: 5 card: name: reference weight: 10 - title: Glossary + title: 用語集 --- diff --git a/content/ja/docs/reference/glossary/name.md b/content/ja/docs/reference/glossary/name.md index 48c4ca4db9..214f3d571e 100755 --- a/content/ja/docs/reference/glossary/name.md +++ b/content/ja/docs/reference/glossary/name.md @@ -14,5 +14,5 @@ tags: -同じ種類のオブジェクトは、同じ名前を同時に持つことは出来ません。しかし、オブジェクトを削除することで、旧オブジェクトと同じ名前で新しいオブジェクトを作成できます。 +同じ種類のオブジェクトは、同じ名前を同時に持つことはできません。しかし、オブジェクトを削除することで、旧オブジェクトと同じ名前で新しいオブジェクトを作成できます。 diff --git a/content/ja/docs/reference/glossary/persistent-volume-claim.md b/content/ja/docs/reference/glossary/persistent-volume-claim.md index 7366429a24..021c998def 100644 --- a/content/ja/docs/reference/glossary/persistent-volume-claim.md +++ b/content/ja/docs/reference/glossary/persistent-volume-claim.md @@ -6,13 +6,13 @@ full_link: /docs/concepts/storage/persistent-volumes/ short_description: > コンテナ内でボリュームとしてマウントするためにPersistentVolume内で定義されたストレージリソースを要求します。 -aka: +aka: tags: - core-object - storage --- {{< glossary_tooltip text="コンテナ" term_id="container" >}}内でボリュームとしてマウントするために{{< glossary_tooltip text="PersistentVolume" term_id="persistent-volume" >}}内で定義されたストレージリソースを要求します。 - + -ストレージサイズ、ストレージへのアクセス制御(読み取り専用、読み取り/書き込み、排他的)、および再利用方法(保持、リサイクル、削除)を指定します。ストレージ自体の詳細はPersistentVolumeオブジェクトに記載されています。 +ストレージサイズ、ストレージへのアクセス制御(読み取り専用、読み取り/書き込み、排他的)、および再利用方法(保持、リサイクル、削除)を指定します。ストレージ自体の詳細はPersistentVolumeオブジェクトに記載されています。 diff --git a/content/ja/docs/reference/glossary/service.md b/content/ja/docs/reference/glossary/service.md index 212c3acce1..304e781b53 100755 --- a/content/ja/docs/reference/glossary/service.md +++ b/content/ja/docs/reference/glossary/service.md @@ -11,7 +11,7 @@ tags: - fundamental - core-object --- -{{< glossary_tooltip text="Pods" term_id="pod" >}}の集合で実行されているアプリケーションをネットワークサービスとして公開する抽象的な方法。 +{{< glossary_tooltip text="Pod" term_id="pod" >}}の集合で実行されているアプリケーションをネットワークサービスとして公開する抽象的な方法です。 diff --git a/content/ja/docs/reference/glossary/statefulset.md b/content/ja/docs/reference/glossary/statefulset.md index bcb947367d..1fad77bd62 100755 --- a/content/ja/docs/reference/glossary/statefulset.md +++ b/content/ja/docs/reference/glossary/statefulset.md @@ -4,7 +4,7 @@ id: statefulset date: 2018-04-12 full_link: /ja/docs/concepts/workloads/controllers/statefulset/ short_description: > - Manages the deployment and scaling of a set of Pods, *and provides guarantees about the ordering and uniqueness* of these Pods. + StatefulSetはDeploymentとPodのセットのスケーリングを管理し、それらのPodの *順序と一意性を保証* します。 aka: tags: @@ -14,7 +14,7 @@ tags: - storage --- -StatefulSetはDeploymentと{{< glossary_tooltip text="Pod" term_id="pod" >}}のセットのスケーリングの管理をし、それらのPodの*順序とユニーク性を保証* します。 +StatefulSetはDeploymentと{{< glossary_tooltip text="Pod" term_id="pod" >}}のセットのスケーリングを管理し、それらのPodの*順序と一意性を保証* します。 diff --git a/content/ja/docs/reference/glossary/volume.md b/content/ja/docs/reference/glossary/volume.md index 8ea7702e4c..6a81f84522 100644 --- a/content/ja/docs/reference/glossary/volume.md +++ b/content/ja/docs/reference/glossary/volume.md @@ -4,14 +4,14 @@ id: volume date: 2018-04-12 full_link: /docs/concepts/storage/volumes/ short_description: > - Pod内のコンテナからアクセス可能なデータを含むディレクトリ。 + Pod内のコンテナからアクセス可能なデータを含むディレクトリです。 aka: tags: - core-object - fundamental --- - {{< glossary_tooltip text="Pod" term_id="pod" >}}内の{{< glossary_tooltip text="コンテナ" term_id="container" >}}からアクセス可能なデータを含むディレクトリ。 + {{< glossary_tooltip text="Pod" term_id="pod" >}}内の{{< glossary_tooltip text="コンテナ" term_id="container" >}}からアクセス可能なデータを含むディレクトリです。 diff --git a/content/ja/docs/reference/kubectl/cheatsheet.md b/content/ja/docs/reference/kubectl/cheatsheet.md index cc1da85b76..d63654bd38 100644 --- a/content/ja/docs/reference/kubectl/cheatsheet.md +++ b/content/ja/docs/reference/kubectl/cheatsheet.md @@ -323,7 +323,7 @@ kubectl cluster-info # Kubernet kubectl cluster-info dump # 現在のクラスター状態を標準出力にダンプします kubectl cluster-info dump --output-directory=/path/to/cluster-state # 現在のクラスター状態を/path/to/cluster-stateにダンプします -# special-userキーとNoScheduleエフェクトを持つTaintが既に存在する場合、その値は指定されたとおりに置き換えられます +# special-userキーとNoScheduleエフェクトを持つTaintがすでに存在する場合、その値は指定されたとおりに置き換えられます kubectl taint nodes foo dedicated=special-user:NoSchedule ``` diff --git a/content/ja/docs/setup/_index.md b/content/ja/docs/setup/_index.md index 8ba1773f75..2d602e9300 100644 --- a/content/ja/docs/setup/_index.md +++ b/content/ja/docs/setup/_index.md @@ -49,6 +49,6 @@ Kubernetesについて学んでいる場合、Dockerベースのソリューシ 本番環境用のソリューションを評価する際には、Kubernetesクラスター(または抽象レイヤ)の運用においてどの部分を自分で管理し、どの部分をプロバイダーに任せるのかを考慮してください。 -[Certified Kubernetes](https://github.com/cncf/k8s-conformance/#certified-kubernetes)プロバイダーの一覧については、"[Partners](https://kubernetes.io/partners/#conformance)"を参照してください。 +[Certified Kubernetes](https://github.com/cncf/k8s-conformance/#certified-kubernetes)プロバイダーの一覧については、「[パートナー](https://kubernetes.io/ja/partners/#conformance)」を参照してください。 diff --git a/content/ja/docs/setup/best-practices/certificates.md b/content/ja/docs/setup/best-practices/certificates.md index ff6fe29dd1..7f67ee7006 100644 --- a/content/ja/docs/setup/best-practices/certificates.md +++ b/content/ja/docs/setup/best-practices/certificates.md @@ -72,7 +72,7 @@ CAの秘密鍵をクラスターにコピーしたくない場合、自身で全 | kube-apiserver-kubelet-client | kubernetes-ca | system:masters | client | | | front-proxy-client | kubernetes-front-proxy-ca | | client | | -[1]: クラスターに接続するIPおよびDNS名( [kubeadm][kubeadm]を使用する場合と同様、ロードバランサーのIPおよびDNS名、`kubernetes`、`kubernetes.default`、`kubernetes.default.svc`、`kubernetes.default.svc.cluster`、`kubernetes.default.svc.cluster.local`) +[1]: クラスターに接続するIPおよびDNS名( [kubeadm][kubeadm]を使用する場合と同様、ロードバランサーのIPおよびDNS名、`kubernetes`、`kubernetes.default`、`kubernetes.default.svc`、`kubernetes.default.svc.cluster`、`kubernetes.default.svc.cluster.local`) `kind`は下記の[x509の鍵用途][usage]のタイプにマッピングされます: @@ -82,7 +82,7 @@ CAの秘密鍵をクラスターにコピーしたくない場合、自身で全 | client | digital signature, key encipherment, client auth | {{< note >}} -上記に挙げられたホスト名(SAN)は、クラスターを動作させるために推奨されるものです。 +上記に挙げられたホスト名(SAN)は、クラスターを動作させるために推奨されるものです。 特別なセットアップが求められる場合、全てのサーバー証明書にSANを追加する事ができます。 {{< /note >}} diff --git a/content/ja/docs/setup/best-practices/multiple-zones.md b/content/ja/docs/setup/best-practices/multiple-zones.md index 577cc42650..3590f6fa8c 100644 --- a/content/ja/docs/setup/best-practices/multiple-zones.md +++ b/content/ja/docs/setup/best-practices/multiple-zones.md @@ -303,7 +303,7 @@ kubectl get nodes --show-labels Create the guestbook-go example, which includes an RC of size 3, running a simple web app: ```shell -find kubernetes/examples/guestbook-go/ -name '*.json' | xargs -I {} kubectl create -f {} +find kubernetes/examples/guestbook-go/ -name '*.json' | xargs -I {} kubectl apply -f {} ``` The pods should be spread across all 3 zones: diff --git a/content/ja/docs/setup/best-practices/node-conformance.md b/content/ja/docs/setup/best-practices/node-conformance.md index 129bd762ba..0db9cb4432 100644 --- a/content/ja/docs/setup/best-practices/node-conformance.md +++ b/content/ja/docs/setup/best-practices/node-conformance.md @@ -7,43 +7,35 @@ weight: 30 ## ノード適合テスト -*Node conformance test* is a containerized test framework that provides a system -verification and functionality test for a node. The test validates whether the -node meets the minimum requirements for Kubernetes; a node that passes the test -is qualified to join a Kubernetes cluster. +*ノード適合テスト* は、システムの検証とノードに対する機能テストを提供するコンテナ型のテストフレームワークです。このテストは、ノードがKubernetesの最小要件を満たしているかどうかを検証するもので、テストに合格したノードはKubernetesクラスタに参加する資格があることになります。 ## 制約 -In Kubernetes version 1.5, node conformance test has the following limitations: +Kubernetesのバージョン1.5ではノード適合テストには以下の制約があります: -* Node conformance test only supports Docker as the container runtime. +* ノード適合テストはコンテナのランタイムとしてDockerのみをサポートします。 ## ノードの前提条件 -To run node conformance test, a node must satisfy the same prerequisites as a -standard Kubernetes node. At a minimum, the node should have the following -daemons installed: +適合テストを実行するにはノードは通常のKubernetesノードと同じ前提条件を満たしている必要があります。 最低でもノードに以下のデーモンがインストールされている必要があります: -* Container Runtime (Docker) +* コンテナランタイム (Docker) * Kubelet ## ノード適合テストの実行 -To run the node conformance test, perform the following steps: +ノード適合テストを実行するには、以下の手順に従います: -1. Point your Kubelet to localhost `--api-servers="http://localhost:8080"`, -because the test framework starts a local master to test Kubelet. There are some -other Kubelet flags you may care: - * `--pod-cidr`: If you are using `kubenet`, you should specify an arbitrary CIDR - to Kubelet, for example `--pod-cidr=10.180.0.0/24`. - * `--cloud-provider`: If you are using `--cloud-provider=gce`, you should - remove the flag to run the test. +1. Kubeletをlocalhostに指定します(`--api-servers="http://localhost:8080"`)、 +このテストフレームワークはKubeletのテストにローカルマスターを起動するため、Kubeletをローカルホストに設定します(`--api-servers="http://localhost:8080"`)。他にも配慮するべきKubeletフラグがいくつかあります: + * `--pod-cidr`: `kubenet`を利用している場合は、Kubeletに任意のCIDR(例: `--pod-cidr=10.180.0.0/24`)を指定する必要があります。 + * `--cloud-provider`: `--cloud-provider=gce`を指定している場合は、テストを実行する前にこのフラグを取り除いてください。 -2. Run the node conformance test with command: +2. 以下のコマンドでノード適合テストを実行します: ```shell -# $CONFIG_DIR is the pod manifest path of your Kubelet. -# $LOG_DIR is the test output path. +# $CONFIG_DIRはKubeletのPodのマニフェストパスです。 +# $LOG_DIRはテスト出力のパスです。 sudo docker run -it --rm --privileged --net=host \ -v /:/rootfs -v $CONFIG_DIR:$CONFIG_DIR -v $LOG_DIR:/var/result \ k8s.gcr.io/node-test:0.2 @@ -51,8 +43,7 @@ sudo docker run -it --rm --privileged --net=host \ ## 他アーキテクチャ向けのノード適合テストの実行 -Kubernetes also provides node conformance test docker images for other -architectures: +Kubernetesは他のアーキテクチャ用のノード適合テストのdockerイメージを提供しています: Arch | Image | --------|:-----------------:| @@ -62,37 +53,30 @@ architectures: ## 選択したテストの実行 -To run specific tests, overwrite the environment variable `FOCUS` with the -regular expression of tests you want to run. +特定のテストを実行するには、環境変数`FOCUS`を実行したいテストの正規表現で上書きします。 ```shell sudo docker run -it --rm --privileged --net=host \ -v /:/rootfs:ro -v $CONFIG_DIR:$CONFIG_DIR -v $LOG_DIR:/var/result \ - -e FOCUS=MirrorPod \ # Only run MirrorPod test + -e FOCUS=MirrorPod \ # MirrorPodテストのみを実行します k8s.gcr.io/node-test:0.2 ``` -To skip specific tests, overwrite the environment variable `SKIP` with the -regular expression of tests you want to skip. +特定のテストをスキップするには、環境変数`SKIP`をスキップしたいテストの正規表現で上書きします。 ```shell sudo docker run -it --rm --privileged --net=host \ -v /:/rootfs:ro -v $CONFIG_DIR:$CONFIG_DIR -v $LOG_DIR:/var/result \ - -e SKIP=MirrorPod \ # Run all conformance tests but skip MirrorPod test + -e SKIP=MirrorPod \ # MirrorPodテスト以外のすべてのノード適合テストを実行します k8s.gcr.io/node-test:0.2 ``` -Node conformance test is a containerized version of [node e2e test](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-node/e2e-node-tests.md). -By default, it runs all conformance tests. +ノード適合テストは、[node e2e test](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-node/e2e-node-tests.md)のコンテナ化されたバージョンです。 +デフォルトでは、すべての適合テストが実行されます。 -Theoretically, you can run any node e2e test if you configure the container and -mount required volumes properly. But **it is strongly recommended to only run conformance -test**, because it requires much more complex configuration to run non-conformance test. +理論的には、コンテナを構成し必要なボリュームを適切にマウントすれば、どのノードのe2eテストも実行できます。しかし、不適合テストを実行するためにはより複雑な設定が必要となるため、**適合テストのみを実行することを強く推奨します**。 ## 注意事項 -* The test leaves some docker images on the node, including the node conformance - test image and images of containers used in the functionality - test. -* The test leaves dead containers on the node. These containers are created - during the functionality test. +* このテストでは、ノード適合テストイメージや機能テストで使用されるコンテナのイメージなど、いくつかのdockerイメージがノード上に残ります。 +* このテストでは、ノード上にデッドコンテナが残ります。これらのコンテナは機能テスト中に作成されます。 diff --git a/content/ja/docs/setup/learning-environment/_index.md b/content/ja/docs/setup/learning-environment/_index.md index 051413db61..fad99fb4e8 100644 --- a/content/ja/docs/setup/learning-environment/_index.md +++ b/content/ja/docs/setup/learning-environment/_index.md @@ -1,4 +1,4 @@ --- -title: 環境について学ぶ +title: 学習環境 weight: 20 --- diff --git a/content/ja/docs/setup/learning-environment/minikube.md b/content/ja/docs/setup/learning-environment/minikube.md index 1a28e49261..67b0002946 100644 --- a/content/ja/docs/setup/learning-environment/minikube.md +++ b/content/ja/docs/setup/learning-environment/minikube.md @@ -1,143 +1,257 @@ --- title: Minikubeを使用してローカル環境でKubernetesを動かす +weight: 30 content_type: concept --- + Minikubeはローカル環境でKubernetesを簡単に実行するためのツールです。Kubernetesを試したり日々の開発への使用を検討するユーザー向けに、PC上のVM内でシングルノードのKubernetesクラスタを実行することができます。 - ## Minikubeの機能 -* MinikubeのサポートするKubernetesの機能: - * DNS - * NodePorts - * ConfigMapsとSecrets - * ダッシュボード - * コンテナランタイム: Docker, [rkt](https://github.com/rkt/rkt), [CRI-O](https://cri-o.io/), [containerd](https://github.com/containerd/containerd) - * CNI (Container Network Interface) の有効化 - * Ingress +MinikubeのサポートするKubernetesの機能: + +* DNS +* NodePort +* ConfigMapとSecret +* ダッシュボード +* コンテナランタイム: Docker、[CRI-O](https://cri-o.io/)および[containerd](https://github.com/containerd/containerd) +* CNI (Container Network Interface) の有効化 +* Ingress ## インストール -[Minikubeのインストール](/ja/docs/tasks/tools/install-minikube/) を参照 +[Minikubeのインストール](/ja/docs/tasks/tools/install-minikube/)を参照してください。 ## クイックスタート -これはMinikubeの使い方の簡単なデモです。 -もしVMドライバを変更したい場合は、適切な `--vm-driver=xxx` フラグを `minikube start` に設定してください。Minikubeは以下のドライバをサポートしています。 +これはMinikubeの起動、使用、削除をローカルで実施する簡単なデモです。下記の手順に従って、Minikubeを起動し試してください。 -* virtualbox +1. Minikubeを起動し、クラスターを作成します: + + ```shell + minikube start + ``` + + 出力はこのようになります: + + ``` + Starting local Kubernetes cluster... + Running pre-create checks... + Creating machine... + Starting local Kubernetes cluster... + ``` + + 特定のKubernetesのバージョン、VM、コンテナランタイム上でクラスターを起動するための詳細は、[クラスターの起動](#starting-a-cluster)を参照してください。 + +2. kubectlを使用してクラスターと対話できるようになります。詳細は[クラスターに触れてみよう](#interacting-with-your-cluster)を参照してください。 +単純なHTTPサーバーである`echoserver`という既存のイメージを使用して、Kubernetes Deploymentを作りましょう。そして`--port`を使用して8080番ポートで公開しましょう。 + + ```shell + kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10 + ``` + + 出力はこのようになります: + + ``` + deployment.apps/hello-minikube created + ``` + +3. `hello-minikube`Deploymentに接続するために、Serviceとして公開します: + + ```shell + kubectl expose deployment hello-minikube --type=NodePort --port=8080 + ``` + + `--type=NodePort`オプションで、Serviceのタイプを指定します。 + 出力はこのようになります: + + ``` + service/hello-minikube exposed + ``` + +4. `hello-minikube`Podが起動開始されましたが、公開したService経由で接続する前にPodが起動完了になるまで待つ必要があります。 + + Podが稼働しているか確認します: + ```shell + kubectl get pod + ``` + + `STATUS`に`ContainerCreating`と表示されている場合、Podはまだ作成中です: + + ``` + NAME READY STATUS RESTARTS AGE + hello-minikube-3383150820-vctvh 0/1 ContainerCreating 0 3s + ``` + + `STATUS`に`Running`と表示されている場合、Podは稼働中です: + + ``` + NAME READY STATUS RESTARTS AGE + hello-minikube-3383150820-vctvh 1/1 Running 0 13s + ``` + +5. Serviceの詳細を確認するため、公開したServiceのURLを取得します: + + ```shell + minikube service hello-minikube --url + ``` + +6. ローカル環境のクラスターについて詳細を確認するには、出力から得たURLをブラウザー上でコピーアンドペーストしてください。 + + 出力はこのようになります: + + ``` + Hostname: hello-minikube-7c77b68cff-8wdzq + + Pod Information: + -no pod information available- + + Server values: + server_version=nginx: 1.13.3 - lua: 10008 + + Request Information: + client_address=172.17.0.1 + method=GET + real path=/ + query= + request_version=1.1 + request_scheme=http + request_uri=http://192.168.99.100:8080/ + + Request Headers: + accept=*/* + host=192.168.99.100:30674 + user-agent=curl/7.47.0 + + Request Body: + -no body in request- + ``` + + Serviceやクラスターをこれ以上稼働させない場合、削除する事ができます。 + +7. `hello-minikube`Serviceを削除します: + + ```shell + kubectl delete services hello-minikube + ``` + + 出力はこのようになります: + + ``` + service "hello-minikube" deleted + ``` + +8. `hello-minikube`Deploymentを削除します: + + ```shell + kubectl delete deployment hello-minikube + ``` + + 出力はこのようになります: + + ``` + deployment.extensions "hello-minikube" deleted + ``` + +9. ローカル環境のMinikubeクラスターを停止します: + + ```shell + minikube stop + ``` + + 出力はこのようになります: + + ``` + Stopping local Kubernetes cluster... + Stopping "minikube"... + ``` + + 詳細は[クラスターの停止](#stopping-a-cluster)を参照ください。 + +10. ローカルのMinikubeクラスターを削除します: + + ```shell + minikube delete + ``` + + 出力はこのようになります: + + ``` + Deleting "minikube" ... + The "minikube" cluster has been deleted. + ``` + + 詳細は[クラスターの削除](#deleting-a-cluster)を参照ください。 + +## クラスターの管理 + +### クラスターの起動 {#starting-a-cluster} + +`minikube start`コマンドを使用してクラスターを起動することができます。 +このコマンドはシングルノードのKubernetesクラスターを実行する仮想マシンを作成・設定します。 +また、このクラスターと通信する[kubectl](/ja/docs/reference/kubectl/overview/)のインストールも設定します。 + +{{< note >}} +もしWebプロキシーを通している場合、そのプロキシー情報を`minikube start`コマンドに渡す必要があります: + +```shell +https_proxy= minikube start --docker-env http_proxy= --docker-env https_proxy= --docker-env no_proxy=192.168.99.0/24 +``` + +残念なことに、ただ環境変数を設定するだけではうまく動作しません。 + +Minikubeは"minikube"コンテキストも作成し、そのコンテキストをデフォルト設定としてkubectlに設定します。 +あとでコンテキストを切り戻すには、このコマンドを実行してください: `kubectl config use-context minikube` +{{< /note >}} + +#### Kubernetesバージョンの指定 + +`minikube start`コマンドに`--kubernetes-version`文字列を追加することで、 +MinikubeにKubernetesの特定のバージョンを指定することができます。 +例えば、{{< param "fullversion" >}}のバージョンを実行するには以下を実行します: + +``` +minikube start --kubernetes-version {{< param "fullversion" >}} +``` + +#### VMドライバーの指定 + +もしVMドライバーを変更したい場合は、`--vm-driver=`フラグを`minikube start`に設定してください。例えば、コマンドは以下のようになります。 + +```shell +minikube start --vm-driver= +``` + +Minikubeは以下のドライバーをサポートしています: + {{< note >}} +サポートされているドライバーとプラグインのインストールの詳細については[DRIVERS](https://git.k8s.io/minikube/docs/drivers.md)を参照してください。 +{{< /note >}} + +* virtualbox * vmwarefusion * kvm2 ([driver installation](https://minikube.sigs.k8s.io/docs/drivers/#kvm2-driver)) -* kvm ([driver installation](https://minikube.sigs.k8s.io/docs/drivers/#kvm-driver)) * hyperkit ([driver installation](https://minikube.sigs.k8s.io/docs/drivers/#hyperkit-driver)) -* xhyve ([driver installation](https://minikube.sigs.k8s.io/docs/drivers/#xhyve-driver)) (非推奨) * hyperv ([driver installation](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#hyperv-driver)) -注意: 以下のIPは動的であり、変更される可能性があります。IPは `minikube ip` で取得することができます。 -* none (VMではなくホスト上でKubernetesコンポーネントを起動する。このドライバを使用するにはDocker ([docker install](https://docs.docker.com/install/linux/docker-ce/ubuntu/)) とLinux環境を必要とします) +注意: 以下のIPは動的であり、変更される可能性があります。IPは`minikube ip`で取得することができます。 +* vmware ([driver installation](https://minikube.sigs.k8s.io/docs/reference/drivers/vmware/)) (VMware unified driver) +* none (VMではなくホスト上でKubernetesコンポーネントを起動。このドライバーを使用するには{{< glossary_tooltip term_id="docker" >}}とLinux環境を必要とします) -```shell -minikube start -``` -``` -Starting local Kubernetes cluster... -Running pre-create checks... -Creating machine... -Starting local Kubernetes cluster... -``` -```shell -kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10 -``` -``` -deployment.apps/hello-minikube created -``` - -```shell -kubectl expose deployment hello-minikube --type=NodePort --port=8080 -``` -``` -service/hello-minikube exposed -``` -``` -# We have now launched an echoserver pod but we have to wait until the pod is up before curling/accessing it -# via the exposed service. -# To check whether the pod is up and running we can use the following: -kubectl get pod -``` -``` -NAME READY STATUS RESTARTS AGE -hello-minikube-3383150820-vctvh 0/1 ContainerCreating 0 3s -``` -```shell -# We can see that the pod is still being created from the ContainerCreating status -kubectl get pod -``` -``` -NAME READY STATUS RESTARTS AGE -hello-minikube-3383150820-vctvh 1/1 Running 0 13s -``` -```shell -# We can see that the pod is now Running and we will now be able to curl it: -curl $(minikube service hello-minikube --url) -``` -``` - -Hostname: hello-minikube-7c77b68cff-8wdzq - -Pod Information: - -no pod information available- - -Server values: - server_version=nginx: 1.13.3 - lua: 10008 - -Request Information: - client_address=172.17.0.1 - method=GET - real path=/ - query= - request_version=1.1 - request_scheme=http - request_uri=http://192.168.99.100:8080/ - -Request Headers: - accept=*/* - host=192.168.99.100:30674 - user-agent=curl/7.47.0 - -Request Body: - -no body in request- -``` - -```shell -kubectl delete services hello-minikube -``` -``` -service "hello-minikube" deleted -``` - -```shell -kubectl delete deployment hello-minikube -``` -``` -deployment.extensions "hello-minikube" deleted -``` - -```shell -minikube stop -``` -``` -Stopping local Kubernetes cluster... -Stopping "minikube"... -``` +{{< caution >}} +`none`ドライバーを使用する場合、一部のKubernetesのコンポーネントは特権付きのコンテナとして稼働するため、Minikube環境外に副作用をもたらします。 +この副作用から、`none`ドライバーは、個人の作業環境では推奨されません。 +{{< /caution >}} ### コンテナランタイムの代替 +下記のコンテナランタイム上でMinikubeを起動できます。 -#### containerd +{{< tabs name="container_runtimes" >}} +{{% tab name="containerd" %}} [containerd](https://github.com/containerd/containerd) をコンテナランタイムとして使用するには以下を実行してください: @@ -160,10 +274,9 @@ minikube start \ --extra-config=kubelet.image-service-endpoint=unix:///run/containerd/containerd.sock \ --bootstrapper=kubeadm ``` - -#### CRI-O - -[CRI-O](https://github.com/kubernetes-incubator/cri-o) をコンテナランタイムとして使用するには以下を実行してください: +{{% /tab %}} +{{% tab name="CRI-O" %}} +[CRI-O](https://cri-o.io/)をコンテナランタイムとして使用するには以下を実行してください: ```bash minikube start \ @@ -184,47 +297,33 @@ minikube start \ --extra-config=kubelet.image-service-endpoint=/var/run/crio.sock \ --bootstrapper=kubeadm ``` - -#### rktコンテナエンジン - -[rkt](https://github.com/rkt/rkt) をコンテナランタイムとして使用するには以下を実行してください: - -```shell -minikube start \ - --network-plugin=cni \ - --enable-default-cni \ - --container-runtime=rkt -``` - -これはrktとDockerの両方を含んだ代替のMinikubeのISOイメージを使用し、CNIネットワークを有効にします。 - -### ドライバープラグイン - -サポートされているドライバとプラグインのインストールの詳細については [DRIVERS](https://minikube.sigs.k8s.io/docs/drivers/) を参照してください。 +{{% /tab %}} +{{< /tabs >}} ### Dockerデーモンの再利用によるローカルイメージの使用 -Kubernetesの単一のVMを使用する場合、Minikube組み込みのDockerデーモンの再利用がおすすめです。ホストマシン上にDockerレジストリを構築してイメージをプッシュする必要がなく、ローカルでの実験を加速させるMinikubeと同じDockerデーモンの中に構築することができます。ただDockerイメージに'latest'以外のタグを付け、そのタグを使用してイメージをプルしてください。イメージのバージョンを指定しなければ、`Always` のプルイメージポリシーにより `:latest` と仮定され、もしデフォルトのDockerレジストリ(通常はDockerHub)にどのバージョンのDockerイメージもまだ存在しない場合には、`ErrImagePull` になる恐れがあります。 +Kubernetesの単一のVMを使用する場合、Minikube組み込みのDockerデーモンの再利用がおすすめです。ホストマシン上にDockerレジストリを構築してイメージをプッシュする必要がなく、ローカルでの実験を加速させるMinikubeと同じDockerデーモンの中に構築することができます。 -Mac/LinuxのホストでDockerデーモンを操作できるようにするには、shell内で `docker-env command` を使います: +{{< note >}} +Dockerイメージに'latest'以外のタグを付け、そのタグを使用してイメージをプルしてください。イメージのバージョンを指定しなければ`Always`のプルイメージポリシーにより`:latest`と仮定され、もしデフォルトのDockerレジストリ(通常はDockerHub)にどのバージョンのDockerイメージもまだ存在しない場合には、`ErrImagePull`になる恐れがあります。 +{{< /note >}} -```shell -eval $(minikube docker-env) -``` +Mac/LinuxのホストでDockerデーモンを操作できるようにするには、`minikube docker-env`を実行します。 -これにより、MinikubeのVM内のDockerデーモンと通信しているホストのMac/LinuxマシンのコマンドラインでDockerを使用できるようになっているはずです。 +これにより、MinikubeのVM内のDockerデーモンと通信しているホストのMac/LinuxマシンのコマンドラインでDockerを使用できるようになります: ```shell docker ps ``` +{{< note >}} CentOS 7では、Dockerが以下のエラーを出力することがあります: -```shell +``` Could not read CA certificate "/etc/docker/ca.pem": open /etc/docker/ca.pem: no such file or directory ``` -修正方法としては、/etc/sysconfig/docker を更新してMinikube環境の変更が確実に反映されるようにすることです: +修正方法としては、/etc/sysconfig/dockerを更新してMinikube環境の変更が確実に反映されるようにすることです: ```shell < DOCKER_CERT_PATH=/etc/docker @@ -233,37 +332,7 @@ Could not read CA certificate "/etc/docker/ca.pem": open /etc/docker/ca.pem: no > DOCKER_CERT_PATH=/etc/docker > fi ``` - -imagePullPolicy:Alwaysをオフにすることを忘れないでください: さもなければKubernetesはローカルに構築したイメージを使用しません。 - -## クラスターの管理 - -### クラスターの起動 - -`minikube start` コマンドはクラスターを起動することができます。 -このコマンドはシングルノードのKubernetesクラスターを実行する仮想マシンを作成・設定します。 -また、このクラスターと通信する [kubectl](/docs/user-guide/kubectl-overview/) のインストールも設定します。 - -もしWebプロキシーを通している場合、そのプロキシー情報を `minikube start` コマンドに渡す必要があります: - -```shell -https_proxy= minikube start --docker-env http_proxy= --docker-env https_proxy= --docker-env no_proxy=192.168.99.0/24 -``` - -残念なことに、ただ環境変数を設定するだけではうまく動作しません。 - -Minikubeは "minikube" コンテキストも作成し、そのコンテキストをデフォルト設定としてkubectlに設定します。 -あとでコンテキストを切り戻すには、このコマンドを実行してください: `kubectl config use-context minikube` - -#### Kubernetesバージョンの指定 - -`minikube start` コマンドに `--kubernetes-version` 文字列を追加することで、 -MinikubeにKubernetesの特定のバージョンを指定することができます。 -例えば、`v1.7.3` のバージョンを実行するには以下を実行します: - -``` -minikube start --kubernetes-version v1.7.3 -``` +{{< /note >}} ### Kubernetesの設定 @@ -293,16 +362,19 @@ Kubeletの `MaxPods` 設定を5に変更するには、このフラグを渡し `apiserver` の `AuthorizationMode` を `RABC` に設定するには、このフラグを使います: `--extra-config=apiserver.authorization-mode=RBAC`. -### クラスターの停止 +### クラスターの停止 {#stopping-a-cluster} `minikube stop` コマンドを使ってクラスターを停止することができます。 このコマンドはMinikube仮想マシンをシャットダウンしますが、すべてのクラスターの状態とデータを保存します。 クラスターを再起動すると、以前の状態に復元されます。 -### クラスターの削除 +### クラスターの削除 {#deleting-a-cluster} `minikube delete` コマンドを使ってクラスターを削除することができます。 このコマンドはMinikube仮想マシンをシャットダウンして削除します。データや状態は保存されません。 -## クラスターに触れてみよう +### minikubeのアップグレード {#upgrading-minikube} +[minikubeのアップグレード](https://minikube.sigs.k8s.io/docs/start/macos/)を参照してください。 + +## クラスターに触れてみよう {#interacting-with-your-cluster} ### Kubectl @@ -379,7 +451,7 @@ spec: | VirtualBox | Linux | /home | /hosthome | | VirtualBox | macOS | /Users | /Users | | VirtualBox | Windows | C://Users | /c/Users | -| VMware Fusion | macOS | /Users | /Users | +| VMware Fusion | macOS | /Users | /mnt/hgfs/Users | | Xhyve | macOS | /Users | /Users | ## プライベートコンテナレジストリ @@ -417,10 +489,8 @@ export no_proxy=$no_proxy,$(minikube ip) ``` ## 既知の問題 -* クラウドプロバイダーを必要とする機能はMinikubeでは動作しません - * ロードバランサー -* 複数ノードを必要とする機能 - * 高度なスケジューリングポリシー + +複数ノードを必要とする機能はMinikubeでは動作しません。 ## 設計 @@ -440,5 +510,3 @@ Minikubeの詳細については、[proposal](https://git.k8s.io/community/contr ## コミュニティ コントリビューションや質問、コメントは歓迎・奨励されています! Minikubeの開発者は[Slack](https://kubernetes.slack.com)の#minikubeチャンネルにいます(Slackへの招待状は[こちら](http://slack.kubernetes.io/))。[kubernetes-dev Google Groupsメーリングリスト](https://groups.google.com/forum/#!forum/kubernetes-dev)もあります。メーリングリストに投稿する際は件名の最初に "minikube: " をつけてください。 - - diff --git a/content/ja/docs/setup/production-environment/container-runtimes.md b/content/ja/docs/setup/production-environment/container-runtimes.md index a9604a7b59..667726bc64 100644 --- a/content/ja/docs/setup/production-environment/container-runtimes.md +++ b/content/ja/docs/setup/production-environment/container-runtimes.md @@ -25,7 +25,7 @@ Podのコンテナを実行するために、Kubernetesはコンテナランタ ### 適用性 {{< note >}} -このドキュメントはLinuxにCRIをインストールするユーザーの為に書かれています。 +このドキュメントはLinuxにCRIをインストールするユーザーのために書かれています。 他のオペレーティングシステムの場合、プラットフォーム固有のドキュメントを見つけてください。 {{< /note >}} @@ -47,38 +47,46 @@ systemdと一緒に `cgroupfs` を使用するということは、2つの異な kubeletとDockerに `cgroupfs` を使用し、ノード上で実行されている残りのプロセスに `systemd` を使用するように設定されたノードが、 リソース圧迫下で不安定になる場合があります。 -あなたのコンテナランタイムとkubeletにcgroupドライバーとしてsystemdを使用するように設定を変更することはシステムを安定させました。 +コンテナランタイムとkubeletがcgroupドライバーとしてsystemdを使用するように設定を変更することでシステムは安定します。 以下のDocker設定の `native.cgroupdriver=systemd` オプションに注意してください。 +{{< caution >}} +すでにクラスターに組み込まれているノードのcgroupドライバーを変更することは非常におすすめしません。 +kubeletが一方のcgroupドライバーを使用してPodを作成した場合、コンテナランタイムを別のもう一方のcgroupドライバーに変更すると、そのような既存のPodのPodサンドボックスを再作成しようとするとエラーが発生する可能性があります。 +kubeletを再起動しても問題は解決しないでしょう。 +ワークロードからノードを縮退させ、クラスターから削除して再び組み込むことを推奨します。 +{{< /caution >}} + ## Docker それぞれのマシンに対してDockerをインストールします。 -バージョン18.06.2が推奨されていますが、1.11、1.12、1.13、17.03、18.09についても動作が確認されています。 +バージョン19.03.4が推奨されていますが、1.13.1、17.03、17.06、17.09、18.06、18.09についても動作が確認されています。 Kubernetesのリリースノートにある、Dockerの動作確認済み最新バージョンについてもご確認ください。 システムへDockerをインストールするには、次のコマンドを実行します。 {{< tabs name="tab-cri-docker-installation" >}} -{{< tab name="Ubuntu 16.04" codelang="bash" >}} +{{< tab name="Ubuntu 16.04+" codelang="bash" >}} # Docker CEのインストール ## リポジトリをセットアップ -### aptパッケージインデックスを更新 - apt-get update - ### HTTPS越しのリポジトリの使用をaptに許可するために、パッケージをインストール - apt-get update && apt-get install apt-transport-https ca-certificates curl software-properties-common +apt-get update && apt-get install -y \ + apt-transport-https ca-certificates curl software-properties-common gnupg2 ### Docker公式のGPG鍵を追加 - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - -### dockerのaptリポジトリを追加 - add-apt-repository \ - "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ - $(lsb_release -cs) \ - stable" +### Dockerのaptリポジトリを追加 +add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) \ + stable" -## docker ceのインストール -apt-get update && apt-get install docker-ce=18.06.2~ce~3-0~ubuntu +## Docker CEのインストール +apt-get update && apt-get install -y \ + containerd.io=1.2.10-3 \ + docker-ce=5:19.03.4~3-0~ubuntu-$(lsb_release -cs) \ + docker-ce-cli=5:19.03.4~3-0~ubuntu-$(lsb_release -cs) # デーモンをセットアップ cat > /etc/docker/daemon.json <}} +CRI-OのメジャーとマイナーバージョンはKubernetesのメジャーとマイナーバージョンと一致しなければなりません。 +詳細は[CRI-O互換性表](https://github.com/cri-o/cri-o)を参照してください。 +{{< /note >}} + +### 事前準備 ```shell modprobe overlay @@ -164,33 +179,55 @@ sysctl --system ``` {{< tabs name="tab-cri-cri-o-installation" >}} -{{< tab name="Ubuntu 16.04" codelang="bash" >}} +{{< tab name="Debian" codelang="bash" >}} +# Debian Unstable/Sid +echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_Unstable/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list +wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/Debian_Unstable/Release.key -O- | sudo apt-key add - -# 必要なパッケージをインストールし、リポジトリを追加 -apt-get update -apt-get install software-properties-common +# Debian Testing +echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_Testing/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list +wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/Debian_Testing/Release.key -O- | sudo apt-key add - -add-apt-repository ppa:projectatomic/ppa -apt-get update +# Debian 10 +echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_10/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list +wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/Debian_10/Release.key -O- | sudo apt-key add - -# CRI-Oをインストール -apt-get install cri-o-1.11 +# Raspbian 10 +echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Raspbian_10/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list +wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/Raspbian_10/Release.key -O- | sudo apt-key add - +# CRI-Oのインストール +sudo apt-get install cri-o-1.17 {{< /tab >}} + +{{< tab name="Ubuntu 18.04, 19.04 and 19.10" codelang="bash" >}} +# リポジトリの設定 +. /etc/os-release +sudo sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/x${NAME}_${VERSION_ID}/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list" +wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/x${NAME}_${VERSION_ID}/Release.key -O- | sudo apt-key add - +sudo apt-get update + +# CRI-Oのインストール +sudo apt-get install cri-o-1.17 +{{< /tab >}} + {{< tab name="CentOS/RHEL 7.4+" codelang="bash" >}} +# 必要なパッケージのインストール +yum-config-manager --add-repo=https://cbs.centos.org/repos/paas7-crio-115-release/x86_64/os/ -# 必要なリポジトリを追加 -yum-config-manager --add-repo=https://cbs.centos.org/repos/paas7-crio-311-candidate/x86_64/os/ - -# CRI-Oをインストール -yum install --nogpgcheck cri-o +# CRI-Oのインストール +yum install --nogpgcheck -y cri-o +{{< /tab >}} +{{< tab name="openSUSE Tumbleweed" codelang="bash" >}} +sudo zypper install cri-o {{< /tab >}} {{< /tabs >}} ### CRI-Oの起動 ``` +systemctl daemon-reload systemctl start crio ``` @@ -205,6 +242,11 @@ systemctl start crio ### 必要な設定の追加 ```shell +cat > /etc/modules-load.d/containerd.conf <}} -{{< tab name="Ubuntu 16.04+" codelang="bash" >}} -apt-get install -y libseccomp2 +{{< tab name="Ubuntu 16.04" codelang="bash" >}} +# containerdのインストール +## リポジトリの設定 +### HTTPS越しのリポジトリの使用をaptに許可するために、パッケージをインストール +apt-get update && apt-get install -y apt-transport-https ca-certificates curl software-properties-common + +### Docker公式のGPG鍵を追加 +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - + +### Dockerのaptリポジトリの追加 +add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) \ + stable" + +## containerdのインストール +apt-get update && apt-get install -y containerd.io + +# containerdの設定 +mkdir -p /etc/containerd +containerd config default > /etc/containerd/config.toml + +# containerdの再起動 +systemctl restart containerd {{< /tab >}} {{< tab name="CentOS/RHEL 7.4+" codelang="bash" >}} -yum install -y libseccomp +# containerdのインストール +## リポジトリの設定 +### 必要なパッケージのインストール +yum install -y yum-utils device-mapper-persistent-data lvm2 + +### Dockerのリポジトリの追加 +yum-config-manager \ + --add-repo \ + https://download.docker.com/linux/centos/docker-ce.repo + +## containerdのインストール +yum update -y && yum install -y containerd.io + +# containerdの設定 +mkdir -p /etc/containerd +containerd config default > /etc/containerd/config.toml + +# containerdの再起動 +systemctl restart containerd {{< /tab >}} {{< /tabs >}} -### containerdのインストール +### systemd -[Containerdは定期的にリリース](https://github.com/containerd/containerd/releases)されますが、以下に示すコマンドで利用している値は、この手順が作成された時点での最新のバージョンにしたがって書かれています。より新しいバージョンとダウンロードするファイルのハッシュ値については[こちら](https://storage.googleapis.com/cri-containerd-release)で確認するようにしてください。 - -```shell -# 必要な環境変数をexportします。 -export CONTAINERD_VERSION="1.1.2" -export CONTAINERD_SHA256="d4ed54891e90a5d1a45e3e96464e2e8a4770cd380c21285ef5c9895c40549218" - -# containerdのtarボールをダウンロードします。 -wget https://storage.googleapis.com/cri-containerd-release/cri-containerd-${CONTAINERD_VERSION}.linux-amd64.tar.gz - -# ハッシュ値をチェックします。 -echo "${CONTAINERD_SHA256} cri-containerd-${CONTAINERD_VERSION}.linux-amd64.tar.gz" | sha256sum --check - - -# 解凍して展開します。 -tar --no-overwrite-dir -C / -xzf cri-containerd-${CONTAINERD_VERSION}.linux-amd64.tar.gz - -# containerdを起動します。 -systemctl start containerd -``` +`systemd`のcgroupドライバーを使うには、`/etc/containerd/config.toml`内で`plugins.cri.systemd_cgroup = true`を設定してください。 +kubeadmを使う場合は[kubeletのためのcgroupドライバー](/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#マスターノードのkubeletによって使用されるcgroupドライバーの設定)を手動で設定してください。 ## その他のCRIランタイム: frakti diff --git a/content/ja/docs/setup/production-environment/on-premises-vm/_index.md b/content/ja/docs/setup/production-environment/on-premises-vm/_index.md index a8dcf3523c..6de2892840 100644 --- a/content/ja/docs/setup/production-environment/on-premises-vm/_index.md +++ b/content/ja/docs/setup/production-environment/on-premises-vm/_index.md @@ -1,4 +1,4 @@ --- title: オンプレミスVM -weight: 60 +weight: 40 --- diff --git a/content/ja/docs/setup/production-environment/on-premises-vm/dcos.md b/content/ja/docs/setup/production-environment/on-premises-vm/dcos.md index a41309d23b..d869b2fe90 100644 --- a/content/ja/docs/setup/production-environment/on-premises-vm/dcos.md +++ b/content/ja/docs/setup/production-environment/on-premises-vm/dcos.md @@ -5,7 +5,7 @@ content_type: concept -Mesosphereは[DC/OS](https://mesosphere.com/product/)上にKubernetesを構築する為の簡単な選択肢を提供します。それは +Mesosphereは[DC/OS](https://mesosphere.com/product/)上にKubernetesを構築するための簡単な選択肢を提供します。それは * 純粋なアップストリームのKubernetes * シングルクリッククラスター構築 diff --git a/content/ja/docs/setup/production-environment/tools/kops.md b/content/ja/docs/setup/production-environment/tools/kops.md index e0203ca097..92899a300a 100644 --- a/content/ja/docs/setup/production-environment/tools/kops.md +++ b/content/ja/docs/setup/production-environment/tools/kops.md @@ -1,6 +1,6 @@ --- title: kopsを使ったAWS上でのKubernetesのインストール -content_type: concept +content_type: task weight: 20 --- @@ -9,35 +9,40 @@ weight: 20 This quickstart shows you how to easily install a Kubernetes cluster on AWS. It uses a tool called [`kops`](https://github.com/kubernetes/kops). -kops is an opinionated provisioning system: +kops is an automated provisioning system: * Fully automated installation * Uses DNS to identify clusters * Self-healing: everything runs in Auto-Scaling Groups -* Multiple OS support (Debian, Ubuntu 16.04 supported, CentOS & RHEL, Amazon Linux and CoreOS) - see the [images.md](https://github.com/kubernetes/kops/blob/master/docs/images.md) -* High-Availability support - see the [high_availability.md](https://github.com/kubernetes/kops/blob/master/docs/high_availability.md) +* Multiple OS support (Debian, Ubuntu 16.04 supported, CentOS & RHEL, Amazon Linux and CoreOS) - see the [images.md](https://github.com/kubernetes/kops/blob/master/docs/operations/images.md) +* High-Availability support - see the [high_availability.md](https://github.com/kubernetes/kops/blob/master/docs/operations/high_availability.md) * Can directly provision, or generate terraform manifests - see the [terraform.md](https://github.com/kubernetes/kops/blob/master/docs/terraform.md) -If your opinions differ from these you may prefer to build your own cluster using [kubeadm](/docs/admin/kubeadm/) as -a building block. kops builds on the kubeadm work. + + +## {{% heading "prerequisites" %}} + + +* You must have [kubectl](/docs/tasks/tools/install-kubectl/) installed. + +* You must [install](https://github.com/kubernetes/kops#installing) `kops` on a 64-bit (AMD64 and Intel 64) device architecture. + +* You must have an [AWS account](https://docs.aws.amazon.com/polly/latest/dg/setting-up.html), generate [IAM keys](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys) and [configure](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html#cli-quick-configuration) them. - + ## クラスタの作成 ### (1/5) kopsのインストール -#### 要件 - -You must have [kubectl](/ja/docs/tasks/tools/install-kubectl/) installed in order for kops to work. - #### インストール Download kops from the [releases page](https://github.com/kubernetes/kops/releases) (it is also easy to build from source): -On macOS: +{{< tabs name="kops_installation" >}} +{{% tab name="macOS" %}} Download the latest release with the command: @@ -45,14 +50,12 @@ Download the latest release with the command: curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-darwin-amd64 ``` -To download a specific version, replace the +To download a specific version, replace the following portion of the command with the specific kops version. ```shell $(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4) ``` -portion of the command with the specific version. - For example, to download kops version v1.15.0 type: ```shell @@ -76,8 +79,8 @@ You can also install kops using [Homebrew](https://brew.sh/). ```shell brew update && brew install kops ``` - -On Linux: +{{% /tab %}} +{{% tab name="Linux" %}} Download the latest release with the command: @@ -85,11 +88,11 @@ Download the latest release with the command: curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64 ``` -To download a specific version, replace the +To download a specific version of kops, replace the following portion of the command with the specific kops version. + ```shell $(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4) ``` -portion of the command with the specific version. For example, to download kops version v1.15.0 type: @@ -115,9 +118,13 @@ You can also install kops using [Homebrew](https://docs.brew.sh/Homebrew-on-Linu brew update && brew install kops ``` +{{% /tab %}} +{{< /tabs >}} + + ### (2/5) クラスタ用のroute53ドメインの作成 -kops uses DNS for discovery, both inside the cluster and so that you can reach the kubernetes API server +kops uses DNS for discovery, both inside the cluster and outside, so that you can reach the kubernetes API server from clients. kops has a strong opinion on the cluster name: it should be a valid DNS name. By doing so you will @@ -174,7 +181,7 @@ the S3 bucket name. ### (4/5) クラスタ設定の構築 -Run "kops create cluster" to create your cluster configuration: +Run `kops create cluster` to create your cluster configuration: `kops create cluster --zones=us-east-1c useast1.dev.example.com` @@ -213,24 +220,20 @@ for production clusters! ### 他のアドオンの参照 -See the [list of add-ons](/docs/concepts/cluster-administration/addons/) to explore other add-ons, including tools for logging, monitoring, network policy, visualization & control of your Kubernetes cluster. +See the [list of add-ons](/docs/concepts/cluster-administration/addons/) to explore other add-ons, including tools for logging, monitoring, network policy, visualization, and control of your Kubernetes cluster. ## クリーンアップ * To delete your cluster: `kops delete cluster useast1.dev.example.com --yes` -## フィードバック - -* Slack Channel: [#kops-users](https://kubernetes.slack.com/messages/kops-users/) -* [GitHub Issues](https://github.com/kubernetes/kops/issues) - ## {{% heading "whatsnext" %}} * Learn more about Kubernetes [concepts](/docs/concepts/) and [`kubectl`](/docs/user-guide/kubectl-overview/). -* Learn about `kops` [advanced usage](https://github.com/kubernetes/kops) -* See the `kops` [docs](https://github.com/kubernetes/kops) section for tutorials, best practices and advanced configuration options. +* Learn more about `kops` [advanced usage](https://kops.sigs.k8s.io/) for tutorials, best practices and advanced configuration options. +* Follow `kops` community discussions on Slack: [community discussions](https://github.com/kubernetes/kops#other-ways-to-communicate-with-the-contributors) +* Contribute to `kops` by addressing or raising an issue [GitHub Issues](https://github.com/kubernetes/kops/issues) diff --git a/content/ja/docs/setup/production-environment/tools/kubeadm/control-plane-flags.md b/content/ja/docs/setup/production-environment/tools/kubeadm/control-plane-flags.md index b4ff9024f6..b2b41f9128 100644 --- a/content/ja/docs/setup/production-environment/tools/kubeadm/control-plane-flags.md +++ b/content/ja/docs/setup/production-environment/tools/kubeadm/control-plane-flags.md @@ -35,7 +35,7 @@ kubeadmの`ClusterConfiguration`オブジェクトはAPIServer、ControllerManag 詳細は[kube-apiserverのリファレンスドキュメント](/docs/reference/command-line-tools-reference/kube-apiserver/)を参照してください。 -Example usage: +使用例: ```yaml apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration @@ -52,7 +52,7 @@ apiServer: 詳細は[kube-controller-managerのリファレンスドキュメント](/docs/reference/command-line-tools-reference/kube-controller-manager/)を参照してください。 -Example usage: +使用例: ```yaml apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration @@ -68,7 +68,7 @@ controllerManager: 詳細は[kube-schedulerのリファレンスドキュメント](/docs/reference/command-line-tools-reference/kube-scheduler/)を参照してください。 -Example usage: +使用例: ```yaml apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration diff --git a/content/ja/docs/setup/production-environment/tools/kubeadm/high-availability.md b/content/ja/docs/setup/production-environment/tools/kubeadm/high-availability.md index b9e82a7838..6b7cb8b610 100644 --- a/content/ja/docs/setup/production-environment/tools/kubeadm/high-availability.md +++ b/content/ja/docs/setup/production-environment/tools/kubeadm/high-availability.md @@ -8,16 +8,14 @@ weight: 60 このページでは、kubeadmを使用して、高可用性クラスターを作成する、2つの異なるアプローチを説明します: -- 積み重なったコントロールプレーンノードを使う方法。こちらのアプローチは、必要なインフラストラクチャーが少ないです。etcdのメンバーと、コントロールプレーンノードは同じ場所に置かれます。 +- 積層コントロールプレーンノードを使う方法。こちらのアプローチは、必要なインフラストラクチャーが少ないです。etcdのメンバーと、コントロールプレーンノードは同じ場所に置かれます。 - 外部のetcdクラスターを使う方法。こちらのアプローチには、より多くのインフラストラクチャーが必要です。コントロールプレーンノードと、etcdのメンバーは分離されます。 -先へ進む前に、どちらのアプローチがアプリケーションの要件と、環境に適合するか、慎重に検討してください。[こちらの比較](/ja/docs/setup/independent/ha-topology/)が、それぞれの利点/欠点について概説しています。 +先へ進む前に、どちらのアプローチがアプリケーションの要件と、環境に適合するか、慎重に検討してください。[こちらの比較](/ja/docs/setup/production-environment/tools/kubeadm/ha-topology/)が、それぞれの利点/欠点について概説しています。 -クラスターではKubernetesのバージョン1.12以降を使用する必要があります。また、kubeadmを使用した高可用性クラスターはまだ実験的な段階であり、将来のバージョンではもっとシンプルになることに注意してください。たとえば、クラスターのアップグレードに際し問題に遭遇するかもしれません。両方のアプローチを試し、kueadmの[issue tracker](https://github.com/kubernetes/kubeadm/issues/new)で我々にフィードバックを提供してくれることを推奨します。 +高可用性クラスターの作成で問題が発生した場合は、kueadmの[issue tracker](https://github.com/kubernetes/kubeadm/issues/new)でフィードバックを提供してください。 -alpha feature gateである`HighAvailability`はv1.12で非推奨となり、v1.13で削除されたことに留意してください。 - -[高可用性クラスターのアップグレード](/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha-1-13)も参照してください。 +[高可用性クラスターのアップグレード](/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/)も参照してください。 {{< caution >}} このページはクラウド上でクラスターを構築することには対応していません。ここで説明されているどちらのアプローチも、クラウド上で、LoadBalancerタイプのServiceオブジェクトや、動的なPersistentVolumeを利用して動かすことはできません。 @@ -30,8 +28,8 @@ alpha feature gateである`HighAvailability`はv1.12で非推奨となり、v1. どちらの方法でも、以下のインフラストラクチャーが必要です: -- master用に、[kubeadmの最小要件](/ja/docs/setup/independent/install-kubeadm/#before-you-begin)を満たす3台のマシン -- worker用に、[kubeadmの最小要件](/ja/docs/setup/independent/install-kubeadm/#before-you-begin)を満たす3台のマシン +- master用に、[kubeadmの最小要件](/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#始める前に)を満たす3台のマシン +- worker用に、[kubeadmの最小要件](/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#始める前に)を満たす3台のマシン - クラスター内のすべてのマシン間がフルにネットワーク接続可能であること(パブリック、もしくはプライベートネットワーク) - すべてのマシンにおいて、sudo権限 - あるデバイスから、システム内のすべてのノードに対しSSH接続できること @@ -41,22 +39,11 @@ alpha feature gateである`HighAvailability`はv1.12で非推奨となり、v1. - etcdメンバー用に、追加で3台のマシン -{{< note >}} -以下の例では、CalicoをPodネットワーキングプロバイダーとして使用します。別のネットワーキングプロバイダーを使用する場合、必要に応じてデフォルトの値を変更してください。 -{{< /note >}} - - ## 両手順における最初のステップ -{{< note >}} -コントロールプレーンや、etcdノードでのコマンドはすべてrootとして実行してください。 -{{< /note >}} - -- CalicoなどのいくつかのCNIネットワークプラグインは`192.168.0.0/16`のようなCIDRを必要としますが、Weaveなどは必要としません。[CNIネットワークドキュメント](/ja/docs/setup/independent/create-cluster-kubeadm/#pod-network)を参照してください。PodにCIDRを設定するには、`ClusterConfiguration`の`networking`オブジェクトに`podSubnet: 192.168.0.0/16`フィールドを設定してください。 - ### kube-apiserver用にロードバランサーを作成 {{< note >}} @@ -84,7 +71,181 @@ alpha feature gateである`HighAvailability`はv1.12で非推奨となり、v1. 1. 残りのコントロールプレーンノードを、ロードバランサーのターゲットグループに追加します。 -### SSHの設定 +## 積層コントロールプレーンとetcdノード + +### 最初のコントロールプレーンノードの手順 + +1. 最初のコントロールプレーンノードを初期化します: + + ```sh + sudo kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" --upload-certs + ``` + + - `--kubernetes-version`フラグで使用するKubernetesのバージョンを設定できます。kubeadm、kubelet、kubectl、Kubernetesのバージョンを一致させることが推奨されます。 + - `--control-plane-endpoint`フラグは、ロードバランサーのIPアドレスまたはDNS名と、ポートが設定される必要があります。 + - `--upload-certs`フラグは全てのコントロールプレーンノードで共有する必要がある証明書をクラスターにアップロードするために使用されます。代わりに、コントロールプレーンノード間で手動あるいは自動化ツールを使用して証明書をコピーしたい場合は、このフラグを削除し、以下の[証明書の手動配布](#manual-certs)のセクションを参照してください。 + + {{< note >}}`kubeadm init`の`--config`フラグと`--certificate-key`フラグは混在させることはできないため、[kubeadm configuration](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2)を使用する場合は`certificateKey`フィールドを適切な場所に追加する必要があります(`InitConfiguration`と`JoinConfiguration: controlPlane`の配下)。{{< /note >}} + + {{< note >}}CalicoなどのいくつかのCNIネットワークプラグインは`192.168.0.0/16`のようなCIDRを必要としますが、Weaveなどは必要としません。[CNIネットワークドキュメント](/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network)を参照してください。PodにCIDRを設定するには、`ClusterConfiguration`の`networking`オブジェクトに`podSubnet: 192.168.0.0/16`フィールドを設定してください。{{< /note >}} + + - このような出力がされます: + + ```sh + ... + You can now join any number of control-plane node by running the following command on each as a root: + kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866 --control-plane --certificate-key f8902e114ef118304e561c3ecd4d0b543adc226b7a07f675f56564185ffe0c07 + + Please note that the certificate-key gives access to cluster sensitive data, keep it secret! + As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use kubeadm init phase upload-certs to reload certs afterward. + + Then you can join any number of worker nodes by running the following on each as root: + kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866 + ``` + + - この出力をテキストファイルにコピーします。あとで、他のコントロールプレーンノードとワーカーノードをクラスターに参加させる際に必要です。 + + - `--upload-certs`フラグを`kubeadm init`で使用すると、プライマリコントロールプレーンの証明書が暗号化されて、`kubeadm-certs` Secretにアップロードされます。 + + - 証明書を再アップロードして新しい復号キーを生成するには、すでにクラスターに参加しているコントロールプレーンノードで次のコマンドを使用します: + + ```sh + sudo kubeadm init phase upload-certs --upload-certs + ``` + + - また、後で`join`で使用できるように、`init`中にカスタムした`--certificate-key`を指定することもできます。このようなキーを生成するには、次のコマンドを使用します: + + ```sh + kubeadm alpha certs certificate-key + ``` + + {{< note >}} + `kubeadm-certs`のSecretと復号キーは2時間で期限切れとなります。 + {{< /note >}} + + {{< caution >}} + コマンド出力に記載されているように、証明書キーはクラスターの機密データへのアクセスを提供します。秘密にしてください! + {{< /caution >}} + +1. 使用するCNIプラグインを適用します: + [こちらの手順に従い](/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network)CNIプロバイダーをインストールします。該当する場合は、kubeadmの設定で指定されたPodのCIDRに対応していることを確認してください。 + + Weave Netを使用する場合の例: + + ```sh + kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" + ``` + +1. 以下のコマンドを入力し、コンポーネントのPodが起動するのを確認します: + + ```sh + kubectl get pod -n kube-system -w + ``` + +### 残りのコントロールプレーンノードの手順 + +{{< note >}} +kubeadmバージョン1.15以降、複数のコントロールプレーンノードを並行してクラスターに参加させることができます。 +このバージョンの前は、最初のノードの初期化が完了した後でのみ、新しいコントロールプレーンノードを順番にクラスターに参加させる必要があります。 +{{< /note >}} + +追加のコントロールプレーンノード毎に、以下の手順を行います。 + +1. `kubeadm init`を最初のノードで実行した際に取得したjoinコマンドを使って、新しく追加するコントロールプレーンノードで`kubeadm join`を開始します。このようなコマンドになるはずです: + + ```sh + sudo kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866 --control-plane --certificate-key f8902e114ef118304e561c3ecd4d0b543adc226b7a07f675f56564185ffe0c07 + ``` + + - `--control-plane`フラグによって、`kubeadm join`の実行は新しいコントロールプレーンを作成します。 + - `-certificate-key ...`を指定したキーを使って、クラスターの`kubeadm-certs` Secretからダウンロードされたコントロールプレーンの証明書が復号されます。 + +## 外部のetcdノード + +外部のetcdノードを使ったクラスターの設定は、積層etcdの場合と似ていますが、最初にetcdを設定し、kubeadmの設定ファイルにetcdの情報を渡す必要があります。 + +### etcdクラスターの構築 + +1. [こちらの手順](/ja/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/)にしたがって、etcdクラスターを構築してください。 + +1. [こちらの手順](#manual-certs)にしたがって、SSHを構築してください。 + +1. 以下のファイルをクラスター内の任意のetcdノードから最初のコントロールプレーンノードにコピーしてください: + + ```sh + export CONTROL_PLANE="ubuntu@10.0.0.7" + scp /etc/kubernetes/pki/etcd/ca.crt "${CONTROL_PLANE}": + scp /etc/kubernetes/pki/apiserver-etcd-client.crt "${CONTROL_PLANE}": + scp /etc/kubernetes/pki/apiserver-etcd-client.key "${CONTROL_PLANE}": + ``` + + - `CONTROL_PLANE`の値を、最初のコントロールプレーンノードの`user@host`で置き換えます。 + +### 最初のコントロールプレーンノードの構築 + +1. 以下の内容で、`kubeadm-config.yaml`という名前の設定ファイルを作成します: + + apiVersion: kubeadm.k8s.io/v1beta2 + kind: ClusterConfiguration + kubernetesVersion: stable + controlPlaneEndpoint: "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" + etcd: + external: + endpoints: + - https://ETCD_0_IP:2379 + - https://ETCD_1_IP:2379 + - https://ETCD_2_IP:2379 + caFile: /etc/kubernetes/pki/etcd/ca.crt + certFile: /etc/kubernetes/pki/apiserver-etcd-client.crt + keyFile: /etc/kubernetes/pki/apiserver-etcd-client.key + + {{< note >}} + ここで、積層etcdと外部etcdの違いは、外部etcdの構成では`etcd`の`external`オブジェクトにetcdのエンドポイントが記述された設定ファイルが必要です。積層etcdトポロジーの場合、これは自動で管理されます。 + {{< /note >}} + + - テンプレート内の以下の変数を、クラスターに合わせて適切な値に置き換えます: + + - `LOAD_BALANCER_DNS` + - `LOAD_BALANCER_PORT` + - `ETCD_0_IP` + - `ETCD_1_IP` + - `ETCD_2_IP` + +以下の手順は、積層etcdの構築と同様です。 + +1. `sudo kubeadm init --config kubeadm-config.yaml --upload-certs`をこのノードで実行します。 + +1. 表示されたjoinコマンドを、あとで使うためにテキストファイルに書き込みます。 + +1. 使用するCNIプラグインを適用します。以下はWeave CNIの場合です: + + ```sh + kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" + ``` + +### 残りのコントロールプレーンノードの手順 + +手順は、積層etcd構築の場合と同じです: + +- 最初のコントロールプレーンノードが完全に初期化されているのを確認します。 +- テキストファイルに保存したjoinコマンドを使って、それぞれのコントロールプレーンノードをクラスターへ参加させます。コントロールプレーンノードは1台ずつクラスターへ参加させるのを推奨します。 +- `--certificate-key`で指定する復号キーは、デフォルトで2時間で期限切れになることを忘れないでください。 + +## コントロールプレーン起動後の共通タスク + +### workerのインストール + +`kubeadm init`コマンドから返されたコマンドを利用して、workerノードをクラスターに参加させることが可能です。 + +```sh +sudo kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866 +``` + +## 証明書の手動配布 {#manual-certs} + +`--upload-certs`フラグを指定して`kubeadm init`を実行しない場合、プライマリコントロールプレーンノードから他のコントロールプレーンノードへ証明書を手動でコピーする必要があります。 + +コピーを行うには多くの方法があります。次の例では`ssh`と`scp`を使用しています。 1台のマシンから全てのノードをコントロールしたいのであれば、SSHが必要です。 @@ -114,61 +275,12 @@ alpha feature gateである`HighAvailability`はv1.12で非推奨となり、v1. sudo -E -s ``` -## 積み重なったコントロールプレーンとetcdノード +1. 全てのノードでSSHを設定したら、`kubeadm init`を実行した後、最初のコントロールノードプレーンノードで次のスクリプトを実行します。このスクリプトは、最初のコントロールプレーンノードから残りのコントロールプレーンノードへ証明書ファイルをコピーします: -### 最初のコントロールプレーンノードの手順 - -1. 最初のコントロールプレーンノードで、`kubeadm-config.yaml`という設定ファイルを作成します: - - apiVersion: kubeadm.k8s.io/v1beta1 - kind: ClusterConfiguration - kubernetesVersion: stable - apiServer: - certSANs: - - "LOAD_BALANCER_DNS" - controlPlaneEndpoint: "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" - - - `kubernetesVersion`には使用するKubernetesのバージョンを設定します。この例では`stable`を使用しています。 - - `controlPlaneEndpoint` はロードバランサーのアドレスかDNSと、ポートに一致する必要があります。 - - kubeadm、kubelet、kubectlとKubernetesのバージョンを一致させることが推奨されます。 - -1. ノードがきれいな状態であることを確認します: + 次の例の、`CONTROL_PLANE_IPS`を他のコントロールプレーンノードのIPアドレスに置き換えます。 ```sh - sudo kubeadm init --config=kubeadm-config.yaml - ``` - - このような出力がされます: - - ```sh - ... - You can now join any number of machines by running the following on each node - as root: - - kubeadm join 192.168.0.200:6443 --token j04n3m.octy8zely83cy2ts --discovery-token-ca-cert-hash sha256:84938d2a22203a8e56a787ec0c6ddad7bc7dbd52ebabc62fd5f4dbea72b14d1f - ``` - -1. この出力をテキストファイルにコピーします。あとで、他のコントロールプレーンノードをクラスターに参加させる際に必要になります。 - -1. Weave CNIプラグインをapplyします: - - ```sh - kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" - ``` - -1. 以下のコマンドを入力し、コンポーネントのPodが起動するのを確認します: - - ```sh - kubectl get pod -n kube-system -w - ``` - - - 最初のコントロールプレーンノードが初期化を完了してから、新しいノードを参加させることが推奨されます。 - -1. 証明書ファイルを最初のコントロールプレーンノードから残りのノードにコピーします: - - 以下の例では、`CONTROL_PLANE_IPS`を他のコントロールプレーンノードのIPアドレスで置き換えます。 - ```sh - USER=ubuntu # 変更可能 + USER=ubuntu # 環境に合わせる CONTROL_PLANE_IPS="10.0.0.7 10.0.0.8" for host in ${CONTROL_PLANE_IPS}; do scp /etc/kubernetes/pki/ca.crt "${USER}"@$host: @@ -178,21 +290,19 @@ alpha feature gateである`HighAvailability`はv1.12で非推奨となり、v1. scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host: scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host: scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:etcd-ca.crt + # 外部のetcdノード使用時はこちらのコマンドを実行 scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:etcd-ca.key - scp /etc/kubernetes/admin.conf "${USER}"@$host: done ``` -{{< caution >}} -上のリストにある証明書だけをコピーしてください。kubeadmが、参加するコントロールプレーンノード用に、残りの証明書と必要なSANの生成を行います。間違って全ての証明書をコピーしてしまったら、必要なSANがないため、追加ノードの作成は失敗するかもしれません。 -{{< /caution >}} + {{< caution >}} + 上のリストにある証明書だけをコピーしてください。kubeadmが、参加するコントロールプレーンノード用に、残りの証明書と必要なSANの生成を行います。間違って全ての証明書をコピーしてしまったら、必要なSANがないため、追加ノードの作成は失敗するかもしれません。 + {{< /caution >}} -### 残りのコントロールプレーンノードの手順 - -1. `scp`を使用する手順で作成したファイルを移動します: +1. 次に、クラスターに参加させる残りの各コントロールプレーンノードで`kubeadm join`を実行する前に次のスクリプトを実行する必要があります。このスクリプトは、前の手順でコピーした証明書をホームディレクトリから`/etc/kubernetes/pki`へ移動します: ```sh - USER=ubuntu # 変更可能 + USER=ubuntu # 環境に合わせる mkdir -p /etc/kubernetes/pki/etcd mv /home/${USER}/ca.crt /etc/kubernetes/pki/ mv /home/${USER}/ca.key /etc/kubernetes/pki/ @@ -201,103 +311,6 @@ alpha feature gateである`HighAvailability`はv1.12で非推奨となり、v1. mv /home/${USER}/front-proxy-ca.crt /etc/kubernetes/pki/ mv /home/${USER}/front-proxy-ca.key /etc/kubernetes/pki/ mv /home/${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt + # 外部のetcdノード使用時はこちらのコマンドを実行 mv /home/${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key - mv /home/${USER}/admin.conf /etc/kubernetes/admin.conf ``` - - この手順で、`/etc/kubernetes`フォルダーに必要な全てのファイルが書き込まれます。 - -1. `kubeadm init`を最初のノードで実行した際に取得したjoinコマンドを使って、このノードで`kubeadm join`を開始します。このようなコマンドになるはずです: - - ```sh - sudo kubeadm join 192.168.0.200:6443 --token j04n3m.octy8zely83cy2ts --discovery-token-ca-cert-hash sha256:84938d2a22203a8e56a787ec0c6ddad7bc7dbd52ebabc62fd5f4dbea72b14d1f --experimental-control-plane - ``` - - `--experimental-control-plane`フラグが追加されています。このフラグは、コントロールプレーンノードのクラスターへの参加を自動化します。 - -1. 以下のコマンドをタイプし、コンポーネントのPodが起動するのを確認します: - - ```sh - kubectl get pod -n kube-system -w - ``` - -1. これらのステップを、残りのコントロールプレーンノードに対して繰り返します。 - -## 外部のetcdノード - -### etcdクラスターの構築 - -- [こちらの手順](/ja/docs/setup/independent/setup-ha-etcd-with-kubeadm/)にしたがって、etcdクラスターを構築してください。 - -### 最初のコントロールプレーンノードの構築 - -1. 以下のファイルをetcdクラスターのどれかのノードからこのノードへコピーしてください: - - ```sh - export CONTROL_PLANE="ubuntu@10.0.0.7" - +scp /etc/kubernetes/pki/etcd/ca.crt "${CONTROL_PLANE}": - +scp /etc/kubernetes/pki/apiserver-etcd-client.crt "${CONTROL_PLANE}": - +scp /etc/kubernetes/pki/apiserver-etcd-client.key "${CONTROL_PLANE}": - ``` - - - `CONTROL_PLANE`の値を、このマシンの`user@host`で置き換えます。 - -1. 以下の内容で、`kubeadm-config.yaml`という名前の設定ファイルを作成します: - - apiVersion: kubeadm.k8s.io/v1beta1 - kind: ClusterConfiguration - kubernetesVersion: stable - apiServer: - certSANs: - - "LOAD_BALANCER_DNS" - controlPlaneEndpoint: "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" - etcd: - external: - endpoints: - - https://ETCD_0_IP:2379 - - https://ETCD_1_IP:2379 - - https://ETCD_2_IP:2379 - caFile: /etc/kubernetes/pki/etcd/ca.crt - certFile: /etc/kubernetes/pki/apiserver-etcd-client.crt - keyFile: /etc/kubernetes/pki/apiserver-etcd-client.key - - - ここで、積み重なったetcdと外部etcdの違いは、kubeadmコンフィグの`etcd`に`external`フィールドを使用していることです。積み重なったetcdトポロジーの場合、これは自動で管理されます。 - - - テンプレート内の以下の変数を、クラスターに合わせて適切な値に置き換えます: - - - `LOAD_BALANCER_DNS` - - `LOAD_BALANCER_PORT` - - `ETCD_0_IP` - - `ETCD_1_IP` - - `ETCD_2_IP` - -1. `kubeadm init --config kubeadm-config.yaml`をこのノードで実行します。 - -1. 表示されたjoinコマンドを、あとで使うためにテキストファイルに書き込みます。 - -1. Weave CNIプラグインをapplyします: - - ```sh - kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" - ``` - -### 残りのコントロールプレーンノードの手順 - -残りのコントロールプレーンノードを参加させるために、[こちらの手順](#残りのコントロールプレーンノードの手順)に従います。ローカルetcdメンバーが作られないことを除いて、積み重なったetcdの構築と同じ手順です。 - -まとめると: - -- 最初のコントロールプレーンノードが完全に初期化されているのを確認します。 -- 証明書を、最初のコントロールプレーンノードから他のコントロールプレーンノードへコピーします。 -- テキストファイルに保存したjoinコマンドに`--experimental-control-plane` フラグを加えたものを使って、それぞれのコントロールプレーンノードを参加させます。 - -## コントロールプレーン起動後の共通タスク - -### Podネットワークのインストール - -Podネットワークをインストールするには、[こちらの手順に従ってください](/ja/docs/setup/independent/create-cluster-kubeadm/#pod-network)。master設定ファイルで提供したPod CIDRのどれかに一致することを確認します。 - -### workerのインストール - -`kubeadm init`コマンドから返されたコマンドを利用して、workerノードをクラスターに参加させることが可能です。workerノードには、`--experimental-control-plane`フラグを追加する必要はありません。 - - diff --git a/content/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm.md b/content/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm.md index b03166af12..155ce30fd1 100644 --- a/content/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm.md +++ b/content/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm.md @@ -1,7 +1,7 @@ --- title: kubeadmのインストール content_type: task -weight: 20 +weight: 10 card: name: setup weight: 20 @@ -11,13 +11,13 @@ card: + このページでは`kubeadm`コマンドをインストールする方法を示します。このインストール処理実行後にkubeadmを使用してクラスターを作成する方法については、[kubeadmを使用したシングルマスタークラスターの作成](/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/)を参照してください。 ## {{% heading "prerequisites" %}} - * 次のいずれかが動作しているマシンが必要です - Ubuntu 16.04+ - Debian 9+ @@ -48,6 +48,22 @@ card: 複数のネットワークアダプターがあり、Kubernetesコンポーネントにデフォルトで到達できない場合、IPルートを追加して、Kubernetesクラスターのアドレスが適切なアダプターを経由するように設定することをお勧めします。 +## iptablesがブリッジを通過するトラフィックを処理できるようにする + +Linuxノードのiptablesがブリッジを通過するトラフィックを正確に処理する要件として、`net.bridge.bridge-nf-call-iptables`を`sysctl`の設定ファイルで1に設定してください。例えば以下のようにします。 + +```bash +cat < /etc/sysctl.d/k8s.conf +net.bridge.bridge-nf-call-ip6tables = 1 +net.bridge.bridge-nf-call-iptables = 1 +EOF +sysctl --system +``` + +この手順の前に`br_netfilter`モジュールがロードされていることを確認してください。`lsmod | grep br_netfilter`を実行することで確認できます。明示的にロードするには`modprobe br_netfilter`を実行してください。 + +詳細は[ネットワークプラグインの要件](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#network-plugin-requirements)を参照してください。 + ## iptablesがnftablesバックエンドを使用しないようにする Linuxでは、カーネルのiptablesサブシステムの最新の代替品としてnftablesが利用できます。`iptables`ツールは互換性レイヤーとして機能し、iptablesのように動作しますが、実際にはnftablesを設定します。このnftablesバックエンドは現在のkubeadmパッケージと互換性がありません。(ファイアウォールルールが重複し、`kube-proxy`を破壊するためです。) @@ -55,11 +71,12 @@ Linuxでは、カーネルのiptablesサブシステムの最新の代替品と もしあなたのシステムの`iptables`ツールがnftablesバックエンドを使用している場合、これらの問題を避けるために`iptables`ツールをレガシーモードに切り替える必要があります。これは、少なくともDebian 10(Buster)、Ubuntu 19.04、Fedora 29、およびこれらのディストリビューションの新しいリリースでのデフォルトです。RHEL 8はレガシーモードへの切り替えをサポートしていないため、現在のkubeadmパッケージと互換性がありません。 {{< tabs name="iptables_legacy" >}} -{{% tab name="Debian or Ubuntu" %}} +{{% tab name="DebianまたはUbuntu" %}} ```bash # レガシーバイナリがインストールされていることを確認してください sudo apt-get install -y iptables arptables ebtables +# レガシーバージョンに切り替えてください。 sudo update-alternatives --set iptables /usr/sbin/iptables-legacy sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy sudo update-alternatives --set arptables /usr/sbin/arptables-legacy @@ -75,56 +92,66 @@ update-alternatives --set iptables /usr/sbin/iptables-legacy ## 必須ポートの確認 -### マスターノード +### コントロールプレーンノード | プロトコル | 通信の向き | ポート範囲 | 目的 | 使用者 | |-----------|------------|------------|-------------------------|---------------------------| -| TCP | Inbound | 6443* | Kubernetes API server | All | -| TCP | Inbound | 2379-2380 | etcd server client API | kube-apiserver, etcd | -| TCP | Inbound | 10250 | Kubelet API | Self, Control plane | -| TCP | Inbound | 10251 | kube-scheduler | Self | -| TCP | Inbound | 10252 | kube-controller-manager | Self | +| TCP | Inbound | 6443* | Kubernetes API server | 全て | +| TCP | Inbound | 2379-2380 | etcd server client API | kube-apiserver、etcd | +| TCP | Inbound | 10250 | Kubelet API | 自身、コントロールプレーン | +| TCP | Inbound | 10251 | kube-scheduler | 自身 | +| TCP | Inbound | 10252 | kube-controller-manager | 自身 | ### ワーカーノード -| プロトコル | 通信の向き | ポート範囲 | 目的 | 使用者 | -|-----------|------------|-------------|-------------------------|-------------------------| -| TCP | Inbound | 10250 | Kubelet API | Self, Control plane | -| TCP | Inbound | 30000-32767 | NodePort Services** | All | +| プロトコル | 通信の向き | ポート範囲 | 目的 | 使用者 | +|-----------|------------|-------------|-------------------------|---------------------------| +| TCP | Inbound | 10250 | Kubelet API | 自身、コントロールプレーン | +| TCP | Inbound | 30000-32767 | NodePort Service† | 全て | -** [NodePort Services](/ja/docs/concepts/services-networking/service/)のデフォルトのポートの範囲 +† [NodePort Service](/ja/docs/concepts/services-networking/service/)のデフォルトのポートの範囲 \*の項目は書き換え可能です。そのため、あなたが指定したカスタムポートも開いていることを確認する必要があります。 etcdポートはコントロールプレーンノードに含まれていますが、独自のetcdクラスターを外部またはカスタムポートでホストすることもできます。 -使用するPodネットワークプラグイン(以下を参照)のポートも開く必要があります。これは各Podネットワークプラグインによって異なるため、必要なポートについてはプラグインのドキュメントを参照してください。 +使用するPodネットワークプラグイン(以下を参照)のポートも開く必要があります。これは各Podネットワークプラグインによって異なるため、必要なポートについてはプラグインのドキュメントを参照してください。 ## ランタイムのインストール {#installing-runtime} -v1.6.0以降、KubernetesはデフォルトでCRI(Container Runtime Interface)の使用を有効にしています。 +Podのコンテナを実行するために、Kubernetesは{{< glossary_tooltip term_id="container-runtime" text="コンテナランタイム" >}}を使用します。 -また、v1.14.0以降、kubeadmは既知のドメインソケットのリストをスキャンして、Linuxノード上のコンテナランタイムを自動的に検出しようとします。検出可能なランタイムとソケットパスは、以下の表に記載されています。 +{{< tabs name="container_runtime" >}} +{{% tab name="Linuxノード" %}} -| ランタイム | ドメインソケット | -|------------|----------------------------------| -| Docker | /var/run/docker.sock | -| containerd | /run/containerd/containerd.sock | -| CRI-O | /var/run/crio/crio.sock | +デフォルトでは、Kubernetesは選択されたコンテナランタイムと通信するために{{< glossary_tooltip term_id="cri" text="Container Runtime Interface">}} (CRI)を使用します。 +ランタイムを指定しない場合、kubeadmはよく知られたUnixドメインソケットのリストをスキャンすることで、インストールされたコンテナランタイムの検出を試みます。 +次の表がコンテナランタイムと関連するソケットのパスリストです。 + +{{< table caption = "コンテナランタイムとソケットパス" >}} +| ランタイム | Unixドメインソケットのパス | +|------------|-----------------------------------| +| Docker | `/var/run/docker.sock` | +| containerd | `/run/containerd/containerd.sock` | +| CRI-O | `/var/run/crio/crio.sock` | +{{< /table >}} + +
Dockerとcontainerdの両方が同時に検出された場合、Dockerが優先されます。Docker 18.09にはcontainerdが同梱されており、両方が検出可能であるため、この仕様が必要です。他の2つ以上のランタイムが検出された場合、kubeadmは適切なエラーメッセージで終了します。 -Linux以外のノードでは、デフォルトで使用されるコンテナランタイムはDockerです。 +kubeletは、組み込まれた`dockershim`CRIを通してDockerと連携します。 -もしコンテナランタイムとしてDockerを選択した場合、`kebelet`内に組み込まれた`dockershim` CRIが使用されます。 +詳細は、[コンテナランタイム](/ja/docs/setup/production-environment/container-runtimes/)を参照してください。 +{{% /tab %}} +{{% tab name="その他のOS" %}} +デフォルトでは、kubeadmは{{< glossary_tooltip term_id="docker" >}}をコンテナランタイムとして使用します。 +kubeletは、組み込まれた`dockershim`CRIを通してDockerと連携します。 -その他のCRIに基づくランタイムでは以下を使用します +詳細は、[コンテナランタイム](/ja/docs/setup/production-environment/container-runtimes/)を参照してください。 +{{% /tab %}} +{{< /tabs >}} -- [containerd](https://github.com/containerd/cri) (CRI plugin built into containerd) -- [cri-o](https://cri-o.io/) -- [frakti](https://github.com/kubernetes/frakti) - -詳細は[CRIのインストール](/ja/docs/setup/production-environment/container-runtimes/)を参照してください。 ## kubeadm、kubelet、kubectlのインストール @@ -142,7 +169,7 @@ kubeadmは`kubelet`や`kubectl`をインストールまたは管理**しない** `kubectl`のインストールに関する詳細情報は、[kubectlのインストールおよびセットアップ](/ja/docs/tasks/tools/install-kubectl/)を参照してください。 {{< warning >}} -これらの手順はシステムアップグレードによるすべてのKubernetesパッケージの更新を除きます。これはkubeadmとKubernetesが[アップグレードにおける特別な注意](docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/)を必要とするからです。 +これらの手順はシステムアップグレードによるすべてのKubernetesパッケージの更新を除きます。これはkubeadmとKubernetesが[アップグレードにおける特別な注意](/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/)を必要とするからです。 {{}} バージョン差異(version skew)に関しては下記を参照してください。 @@ -151,7 +178,7 @@ kubeadmは`kubelet`や`kubectl`をインストールまたは管理**しない** * Kubeadm-specific [バージョン互換ポリシー](/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#version-skew-policy) {{< tabs name="k8s_install" >}} -{{% tab name="Ubuntu, Debian or HypriotOS" %}} +{{% tab name="Ubuntu、Debian、またはHypriotOS" %}} ```bash sudo apt-get update && sudo apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - @@ -163,7 +190,7 @@ sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl ``` {{% /tab %}} -{{% tab name="CentOS, RHEL or Fedora" %}} +{{% tab name="CentOS、RHEL、またはFedora" %}} ```bash cat < /etc/yum.repos.d/kubernetes.repo [kubernetes] @@ -175,7 +202,7 @@ repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF -# Set SELinux in permissive mode (effectively disabling it) +# SELinuxをpermissiveモードに設定する(効果的に無効化する) setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config @@ -186,23 +213,13 @@ systemctl enable --now kubelet **Note:** - - Setting SELinux in permissive mode by running `setenforce 0` and `sed ...` effectively disables it. - This is required to allow containers to access the host filesystem, which is needed by pod networks for example. - You have to do this until SELinux support is improved in the kubelet. - - Some users on RHEL/CentOS 7 have reported issues with traffic being routed incorrectly due to iptables being bypassed. You should ensure - `net.bridge.bridge-nf-call-iptables` is set to 1 in your `sysctl` config, e.g. + - `setenforce 0`および`sed ...`を実行することによりSELinuxをpermissiveモードに設定し、効果的に無効化できます。 + これはコンテナがホストのファイルシステムにアクセスするために必要です。例えば、Podのネットワークに必要とされます。 + kubeletにおけるSELinuxのサポートが改善されるまでは、これを実行しなければなりません。 - ```bash - cat < /etc/sysctl.d/k8s.conf - net.bridge.bridge-nf-call-ip6tables = 1 - net.bridge.bridge-nf-call-iptables = 1 - EOF - sysctl --system - ``` - - Make sure that the `br_netfilter` module is loaded before this step. This can be done by running `lsmod | grep br_netfilter`. To load it explicitly call `modprobe br_netfilter`. {{% /tab %}} {{% tab name="Container Linux" %}} -Install CNI plugins (required for most pod network): +CNIプラグインをインストールする(ほとんどのPodのネットワークに必要です): ```bash CNI_VERSION="v0.8.2" @@ -210,7 +227,7 @@ mkdir -p /opt/cni/bin curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-amd64-${CNI_VERSION}.tgz" | tar -C /opt/cni/bin -xz ``` -Install crictl (required for kubeadm / Kubelet Container Runtime Interface (CRI)) +crictlをインストールする (kubeadm / Kubelet Container Runtime Interface (CRI)に必要です) ```bash CRICTL_VERSION="v1.16.0" @@ -218,7 +235,7 @@ mkdir -p /opt/bin curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-amd64.tar.gz" | tar -C /opt/bin -xz ``` -Install `kubeadm`, `kubelet`, `kubectl` and add a `kubelet` systemd service: +`kubeadm`、`kubelet`、`kubectl`をインストールし`kubelet`をsystemd serviceに登録します: ```bash RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)" @@ -233,7 +250,7 @@ mkdir -p /etc/systemd/system/kubelet.service.d curl -sSL "https://raw.githubusercontent.com/kubernetes/kubernetes/${RELEASE}/build/debs/10-kubeadm.conf" | sed "s:/usr/bin:/opt/bin:g" > /etc/systemd/system/kubelet.service.d/10-kubeadm.conf ``` -Enable and start `kubelet`: +`kubelet`を有効化し起動します: ```bash systemctl enable --now kubelet @@ -243,7 +260,7 @@ systemctl enable --now kubelet kubeadmが何をすべきか指示するまで、kubeletはクラッシュループで数秒ごとに再起動します。 -## マスターノードのkubeletによって使用されるcgroupドライバーの設定 +## コントロールプレーンノードのkubeletによって使用されるcgroupドライバーの設定 Dockerを使用した場合、kubeadmは自動的にkubelet向けのcgroupドライバーを検出し、それを実行時に`/var/lib/kubelet/kubeadm-flags.env`ファイルに設定します。 @@ -255,7 +272,7 @@ KUBELET_EXTRA_ARGS=--cgroup-driver= このファイルは、kubeletの追加のユーザー定義引数を取得するために、`kubeadm init`および`kubeadm join`によって使用されます。 -CRIのcgroupドライバーが`cgroupfs`でない場合に**のみ**それを行う必要があることに注意してください。なぜなら、これは既にkubeletのデフォルト値であるためです。 +CRIのcgroupドライバーが`cgroupfs`でない場合に**のみ**それを行う必要があることに注意してください。なぜなら、これはすでにkubeletのデフォルト値であるためです。 kubeletをリスタートする方法: @@ -274,5 +291,3 @@ kubeadmで問題が発生した場合は、[トラブルシューティング](/ * [kubeadmを使用したシングルコントロールプレーンクラスターの作成](/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/) - - diff --git a/content/ja/docs/setup/production-environment/tools/kubeadm/kubelet-integration.md b/content/ja/docs/setup/production-environment/tools/kubeadm/kubelet-integration.md index 4aa6d44ecb..e061315381 100644 --- a/content/ja/docs/setup/production-environment/tools/kubeadm/kubelet-integration.md +++ b/content/ja/docs/setup/production-environment/tools/kubeadm/kubelet-integration.md @@ -8,21 +8,11 @@ weight: 80 {{< feature-state for_k8s_version="1.11" state="stable" >}} -The lifecycle of the kubeadm CLI tool is decoupled from the -[kubelet](/docs/reference/command-line-tools-reference/kubelet), which is a daemon that runs -on each node within the Kubernetes cluster. The kubeadm CLI tool is executed by the user when Kubernetes is -initialized or upgraded, whereas the kubelet is always running in the background. +kubeadm CLIツールのライフサイクルは、Kubernetesクラスター内の各ノード上で稼働するデーモンである[kubelet](/docs/reference/command-line-tools-reference/kubelet)から分離しています。kubeadm CLIツールはKubernetesを初期化またはアップグレードする際にユーザーによって実行されます。一方で、kubeletは常にバックグラウンドで稼働しています。 -Since the kubelet is a daemon, it needs to be maintained by some kind of a init -system or service manager. When the kubelet is installed using DEBs or RPMs, -systemd is configured to manage the kubelet. You can use a different service -manager instead, but you need to configure it manually. +kubeletはデーモンのため、何らかのinitシステムやサービスマネージャーで管理する必要があります。DEBパッケージやRPMパッケージからkubeletをインストールすると、systemdはkubeletを管理するように設定されます。代わりに別のサービスマネージャーを使用することもできますが、手動で設定する必要があります。 -Some kubelet configuration details need to be the same across all kubelets involved in the cluster, while -other configuration aspects need to be set on a per-kubelet basis, to accommodate the different -characteristics of a given machine, such as OS, storage, and networking. You can manage the configuration -of your kubelets manually, but [kubeadm now provides a `KubeletConfiguration` API type for managing your -kubelet configurations centrally](#configure-kubelets-using-kubeadm). +いくつかのkubeletの設定は、クラスターに含まれる全てのkubeletで同一である必要があります。一方で、特定のマシンの異なる特性(OS、ストレージ、ネットワークなど)に対応するために、kubeletごとに設定が必要なものもあります。手動で設定を管理することも可能ですが、kubeadmは[一元的な設定管理](#configure-kubelets-using-kubeadm)のための`KubeletConfiguration`APIを提供しています。 @@ -30,29 +20,19 @@ kubelet configurations centrally](#configure-kubelets-using-kubeadm). ## Kubeletの設定パターン -The following sections describe patterns to kubelet configuration that are simplified by -using kubeadm, rather than managing the kubelet configuration for each Node manually. +以下のセクションでは、kubeadmを使用したkubeletの設定パターンについて説明します。これは手動で各Nodeの設定を管理するよりも簡易に行うことができます。 -### 各kubeletにクラスターレベルの設定を配布 +### 各kubeletにクラスターレベルの設定を配布 {#propagating-cluster-level-configuration-to-each-kubelet} -You can provide the kubelet with default values to be used by `kubeadm init` and `kubeadm join` -commands. Interesting examples include using a different CRI runtime or setting the default subnet -used by services. +`kubeadm init`および`kubeadm join`コマンドを使用すると、kubeletにデフォルト値を設定することができます。興味深い例として、異なるCRIランタイムを使用したり、Serviceが使用するデフォルトのサブネットを設定したりすることができます。 -If you want your services to use the subnet `10.96.0.0/12` as the default for services, you can pass -the `--service-cidr` parameter to kubeadm: +Serviceが使用するデフォルトのサブネットとして`10.96.0.0/12`を設定する必要がある場合は、`--service-cidr`パラメーターを渡します。 ```bash kubeadm init --service-cidr 10.96.0.0/12 ``` -Virtual IPs for services are now allocated from this subnet. You also need to set the DNS address used -by the kubelet, using the `--cluster-dns` flag. This setting needs to be the same for every kubelet -on every manager and Node in the cluster. The kubelet provides a versioned, structured API object -that can configure most parameters in the kubelet and push out this configuration to each running -kubelet in the cluster. This object is called **the kubelet's ComponentConfig**. -The ComponentConfig allows the user to specify flags such as the cluster DNS IP addresses expressed as -a list of values to a camelCased key, illustrated by the following example: +これによってServiceの仮想IPはこのサブネットから割り当てられるようになりました。また、`--cluster-dns`フラグを使用し、kubeletが用いるDNSアドレスを設定する必要もあります。この設定はクラスター内の全てのマネージャーとNode上で同一である必要があります。kubeletは、**kubeletのComponentConfig**と呼ばれる、バージョン管理と構造化されたAPIオブジェクトを提供します。これはkubelet内のほとんどのパラメーターを設定し、その設定をクラスター内で稼働中の各kubeletへ適用することを可能にします。以下の例のように、キャメルケースのキーに値のリストとしてクラスターDNS IPアドレスなどのフラグを指定することができます。 ```yaml apiVersion: kubelet.config.k8s.io/v1beta1 @@ -61,109 +41,72 @@ clusterDNS: - 10.96.0.10 ``` -For more details on the ComponentConfig have a look at [this section](#configure-kubelets-using-kubeadm). +ComponentConfigの詳細については、[このセクション](#configure-kubelets-using-kubeadm)をご覧ください -### インスタンス固有の設定内容を適用 +### インスタンス固有の設定内容を適用 {#providing-instance-specific-configuration-details} -Some hosts require specific kubelet configurations, due to differences in hardware, operating system, -networking, or other host-specific parameters. The following list provides a few examples. +いくつかのホストでは、ハードウェア、オペレーティングシステム、ネットワーク、その他ホスト固有のパラメータの違いのため、特定のkubeletの設定を必要とします。以下にいくつかの例を示します。 -- The path to the DNS resolution file, as specified by the `--resolv-conf` kubelet - configuration flag, may differ among operating systems, or depending on whether you are using - `systemd-resolved`. If this path is wrong, DNS resolution will fail on the Node whose kubelet - is configured incorrectly. +- DNS解決ファイルへのパスは`--resolv-conf`フラグで指定することができますが、オペレーティングシステムや`systemd-resolved`を使用するかどうかによって異なる場合があります。このパスに誤りがある場合、そのNode上でのDNS解決は失敗します。 +- クラウドプロバイダーを使用していない場合、Node APIオブジェクト`.metadata.name`はデフォルトでマシンのホスト名に設定されます。異なるNode名を指定する必要がある場合には、`--hostname-override`フラグによってこの挙動を書き換えることができます。 +- 現在のところ、kubletはCRIランタイムが使用するcgroupドライバを自動で検知することができませんが、kubeletの稼働を保証するためには、`--cgroup-driver`の値はCRIランタイムが使用するcgroupドライバに一致していなければなりません。 +- クラスターが使用するCRIランタイムによっては、異なるフラグを指定する必要があるかもしれません。例えば、Dockerを使用している場合には、`--network-plugin=cni`のようなフラグを指定する必要があります。外部のランタイムを使用している場合には、`--container-runtime=remote`と指定し、`--container-runtime-endpoint=`のようにCRIエンドポイントを指定する必要があります。 -- The Node API object `.metadata.name` is set to the machine's hostname by default, - unless you are using a cloud provider. You can use the `--hostname-override` flag to override the - default behavior if you need to specify a Node name different from the machine's hostname. +これらのフラグは、systemdなどのサービスマネージャー内のkubeletの設定によって指定することができます。 -- Currently, the kubelet cannot automatically detects the cgroup driver used by the CRI runtime, - but the value of `--cgroup-driver` must match the cgroup driver used by the CRI runtime to ensure - the health of the kubelet. +## kubeadmを使用したkubeletの設定 {#configure-kubelets-using-kubeadm} -- Depending on the CRI runtime your cluster uses, you may need to specify different flags to the kubelet. - For instance, when using Docker, you need to specify flags such as `--network-plugin=cni`, but if you - are using an external runtime, you need to specify `--container-runtime=remote` and specify the CRI - endpoint using the `--container-runtime-path-endpoint=`. +`kubeadm ... --config some-config-file.yaml`のように、カスタムの`KubeletConfiguration`APIオブジェクトを設定ファイルを介して渡すことで、kubeadmによって起動されるkubeletに設定を反映することができます。 -You can specify these flags by configuring an individual kubelet's configuration in your service manager, -such as systemd. +`kubeadm config print init-defaults --component-configs KubeletConfiguration`を実行することによって、この構造体の全てのデフォルト値を確認することができます。 -## kubeadmを使用したkubeletの設定 - -It is possible to configure the kubelet that kubeadm will start if a custom `KubeletConfiguration` -API object is passed with a configuration file like so `kubeadm ... --config some-config-file.yaml`. - -By calling `kubeadm config print init-defaults --component-configs KubeletConfiguration` you can -see all the default values for this structure. - -Also have a look at the [API reference for the -kubelet ComponentConfig](https://godoc.org/k8s.io/kubernetes/pkg/kubelet/apis/config#KubeletConfiguration) -for more information on the individual fields. +また、各フィールドの詳細については、[kubelet ComponentConfigに関するAPIリファレンス](https://godoc.org/k8s.io/kubernetes/pkg/kubelet/apis/config#KubeletConfiguration)を参照してください。 ### `kubeadm init`実行時の流れ -When you call `kubeadm init`, the kubelet configuration is marshalled to disk -at `/var/lib/kubelet/config.yaml`, and also uploaded to a ConfigMap in the cluster. The ConfigMap -is named `kubelet-config-1.X`, where `.X` is the minor version of the Kubernetes version you are -initializing. A kubelet configuration file is also written to `/etc/kubernetes/kubelet.conf` with the -baseline cluster-wide configuration for all kubelets in the cluster. This configuration file -points to the client certificates that allow the kubelet to communicate with the API server. This -addresses the need to -[propagate cluster-level configuration to each kubelet](#propagating-cluster-level-configuration-to-each-kubelet). +`kubeadm init`を実行した場合、kubeletの設定は`/var/lib/kubelet/config.yaml`に格納され、クラスターのConfigMapにもアップロードされます。ConfigMapは`kubelet-config-1.X`という名前で、`.X`は初期化するKubernetesのマイナーバージョンを表します。またこの設定ファイルは、クラスタ内の全てのkubeletのために、クラスター全体設定の基準と共に`/etc/kubernetes/kubelet.conf`にも書き込まれます。この設定ファイルは、kubeletがAPIサーバと通信するためのクライアント証明書を指し示します。これは、[各kubeletにクラスターレベルの設定を配布](#propagating-cluster-level-configuration-to-each-kubelet)することの必要性を示しています。 -To address the second pattern of -[providing instance-specific configuration details](#providing-instance-specific-configuration-details), -kubeadm writes an environment file to `/var/lib/kubelet/kubeadm-flags.env`, which contains a list of -flags to pass to the kubelet when it starts. The flags are presented in the file like this: +二つ目のパターンである、[インスタンス固有の設定内容を適用](#providing-instance-specific-configuration-details)するために、kubeadmは環境ファイルを`/var/lib/kubelet/kubeadm-flags.env`へ書き出します。このファイルは以下のように、kubelet起動時に渡されるフラグのリストを含んでいます。 ```bash KUBELET_KUBEADM_ARGS="--flag1=value1 --flag2=value2 ..." ``` -In addition to the flags used when starting the kubelet, the file also contains dynamic -parameters such as the cgroup driver and whether to use a different CRI runtime socket -(`--cri-socket`). +kubelet起動時に渡されるフラグに加えて、このファイルはcgroupドライバーや異なるCRIランタイムソケットを使用するかどうか(`--cri-socket`)といった動的なパラメータも含みます。 -After marshalling these two files to disk, kubeadm attempts to run the following two -commands, if you are using systemd: +これら二つのファイルがディスク上に格納されると、systemdを使用している場合、kubeadmは以下の二つのコマンドを実行します。 ```bash systemctl daemon-reload && systemctl restart kubelet ``` -If the reload and restart are successful, the normal `kubeadm init` workflow continues. +リロードと再起動に成功すると、通常の`kubeadm init`のワークフローが続きます。 ### `kubeadm join`実行時の流れ -When you run `kubeadm join`, kubeadm uses the Bootstrap Token credential to perform -a TLS bootstrap, which fetches the credential needed to download the -`kubelet-config-1.X` ConfigMap and writes it to `/var/lib/kubelet/config.yaml`. The dynamic -environment file is generated in exactly the same way as `kubeadm init`. +`kubeadm join`を実行した場合、kubeadmはBootstrap Token証明書を使用してTLS bootstrapを行い、ConfigMap`kubelet-config-1.X`をダウンロードするために必要なクレデンシャルを取得し、`/var/lib/kubelet/config.yaml`へ書き込みます。動的な環境ファイルは、`kubeadm init`の場合と全く同様の方法で生成されます。 -Next, `kubeadm` runs the following two commands to load the new configuration into the kubelet: +次に、`kubeadm`は、kubeletに新たな設定を読み込むために、以下の二つのコマンドを実行します。 ```bash systemctl daemon-reload && systemctl restart kubelet ``` -After the kubelet loads the new configuration, kubeadm writes the -`/etc/kubernetes/bootstrap-kubelet.conf` KubeConfig file, which contains a CA certificate and Bootstrap -Token. These are used by the kubelet to perform the TLS Bootstrap and obtain a unique -credential, which is stored in `/etc/kubernetes/kubelet.conf`. When this file is written, the kubelet -has finished performing the TLS Bootstrap. +kubeletが新たな設定を読み込むと、kubeadmは、KubeConfigファイル`/etc/kubernetes/bootstrap-kubelet.conf`を書き込みます。これは、CA証明書とBootstrap Tokenを含みます。これらはkubeletがTLS Bootstrapを行い`/etc/kubernetes/kubelet.conf`に格納されるユニークなクレデンシャルを取得するために使用されます。ファイルが書き込まれると、kubeletはTLS Bootstrapを終了します。 -## kubelet用のsystemdファイル +## kubelet用のsystemdファイル {#the-kubelet-drop-in-file-for-systemd} -The configuration file installed by the kubeadm DEB or RPM package is written to -`/etc/systemd/system/kubelet.service.d/10-kubeadm.conf` and is used by systemd. +`kubeadm`には、systemdがどのようにkubeletを実行するかを指定した設定ファイルが同梱されています。 +kubeadm CLIコマンドは決してこのsystemdファイルには触れないことに注意してください。 + +kubeadmの[DEBパッケージ](https://github.com/kubernetes/kubernetes/blob/master/build/debs/10-kubeadm.conf)または[RPMパッケージ](https://github.com/kubernetes/kubernetes/blob/master/build/rpms/10-kubeadm.conf)によってインストールされたこの設定ファイルは、`/etc/systemd/system/kubelet.service.d/10-kubeadm.conf`に書き込まれ、systemdで使用されます。基本的な`kubelet.service`([RPM用](https://github.com/kubernetes/release/blob/master/cmd/kubepkg/templates/latest/rpm/kubelet/kubelet.service)または、 [DEB用](https://github.com/kubernetes/release/blob/master/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service))を拡張します。 ```none [Service] Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml" -# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating +# This is a file that "kubeadm init" and "kubeadm join" generate at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, @@ -174,26 +117,23 @@ ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS ``` -This file specifies the default locations for all of the files managed by kubeadm for the kubelet. +このファイルは、kubeadmがkubelet用に管理する全ファイルが置かれるデフォルトの場所を指定します。 -- The KubeConfig file to use for the TLS Bootstrap is `/etc/kubernetes/bootstrap-kubelet.conf`, - but it is only used if `/etc/kubernetes/kubelet.conf` does not exist. -- The KubeConfig file with the unique kubelet identity is `/etc/kubernetes/kubelet.conf`. -- The file containing the kubelet's ComponentConfig is `/var/lib/kubelet/config.yaml`. -- The dynamic environment file that contains `KUBELET_KUBEADM_ARGS` is sourced from `/var/lib/kubelet/kubeadm-flags.env`. -- The file that can contain user-specified flag overrides with `KUBELET_EXTRA_ARGS` is sourced from - `/etc/default/kubelet` (for DEBs), or `/etc/sysconfig/kubelet` (for RPMs). `KUBELET_EXTRA_ARGS` - is last in the flag chain and has the highest priority in the event of conflicting settings. +- TLS Bootstrapに使用するKubeConfigファイルは`/etc/kubernetes/bootstrap-kubelet.conf`ですが、`/etc/kubernetes/kubelet.conf`が存在しない場合にのみ使用します。 +- ユニークなkublet識別子を含むKubeConfigファイルは`/etc/kubernetes/kubelet.conf`です。 +- kubeletのComponentConfigを含むファイルは`/var/lib/kubelet/config.yaml`です。 +- `KUBELET_KUBEADM_ARGS`を含む動的な環境ファイルは`/var/lib/kubelet/kubeadm-flags.env`から取得します。 +- `KUBELET_EXTRA_ARGS`によるユーザー定義のフラグの上書きを格納できるファイルは`/etc/default/kubelet`(DEBの場合)、または`/etc/sysconfig/kubelet`(RPMの場合)から取得します。`KUBELET_EXTRA_ARGS`はフラグの連なりの最後に位置し、優先度が最も高いです。 ## Kubernetesバイナリとパッケージの内容 -The DEB and RPM packages shipped with the Kubernetes releases are: +Kubernetesに同梱されるDEB、RPMのパッケージは以下の通りです。 -| Package name | Description | +| パッケージ名 | 説明 | |--------------|-------------| -| `kubeadm` | Installs the `/usr/bin/kubeadm` CLI tool and the [kubelet drop-in file](#the-kubelet-drop-in-file-for-systemd) for the kubelet. | -| `kubelet` | Installs the kubelet binary in `/usr/bin` and CNI binaries in `/opt/cni/bin`. | -| `kubectl` | Installs the `/usr/bin/kubectl` binary. | -| `cri-tools` | Installs the `/usr/bin/crictl` binary from the [cri-tools git repository](https://github.com/kubernetes-incubator/cri-tools). | - +| `kubeadm` | `/usr/bin/kubeadm`CLIツールと、[kubelet用のsystemdファイル](#the-kubelet-drop-in-file-for-systemd)をインストールします。 | +| `kubelet` | kubeletバイナリを`/usr/bin`に、CNIバイナリを`/opt/cni/bin`にインストールします。 | +| `kubectl` | `/usr/bin/kubectl`バイナリをインストールします。 | +| `kubernetes-cni` | 公式のCNIバイナリを`/opt/cni/bin`ディレクトリにインストールします。 | +| `cri-tools` | `/usr/bin/crictl`バイナリを[cri-tools gitリポジトリ](https://github.com/kubernetes-incubator/cri-tools)からインストールします。 | diff --git a/content/ja/docs/setup/production-environment/tools/kubeadm/self-hosting.md b/content/ja/docs/setup/production-environment/tools/kubeadm/self-hosting.md index 08f9efe0b8..a7bee37727 100644 --- a/content/ja/docs/setup/production-environment/tools/kubeadm/self-hosting.md +++ b/content/ja/docs/setup/production-environment/tools/kubeadm/self-hosting.md @@ -8,7 +8,7 @@ weight: 100 ### Self-hosting the Kubernetes control plane {#self-hosting} -As of 1.8, you can experimentally create a _self-hosted_ Kubernetes control +kubeadm allows you to experimentally create a _self-hosted_ Kubernetes control plane. This means that key components such as the API server, controller manager, and scheduler run as [DaemonSet pods](/ja/docs/concepts/workloads/controllers/daemonset/) configured via the Kubernetes API instead of [static pods](/docs/tasks/administer-cluster/static-pod/) diff --git a/content/ja/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm.md b/content/ja/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm.md index 90725de1d4..0d73dc2df6 100644 --- a/content/ja/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm.md +++ b/content/ja/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm.md @@ -6,6 +6,14 @@ weight: 70 +{{< note >}} +While kubeadm is being used as the management tool for external etcd nodes +in this guide, please note that kubeadm does not plan to support certificate rotation +or upgrades for such nodes. The long term plan is to empower the tool +[etcdadm](https://github.com/kubernetes-sigs/etcdadm) to manage these +aspects. +{{< /note >}} + Kubeadm defaults to running a single member etcd cluster in a static pod managed by the kubelet on the control plane node. This is not a high availability setup as the etcd cluster contains only one member and cannot sustain any members @@ -52,7 +60,8 @@ this example. cat << EOF > /etc/systemd/system/kubelet.service.d/20-etcd-service-manager.conf [Service] ExecStart= - ExecStart=/usr/bin/kubelet --address=127.0.0.1 --pod-manifest-path=/etc/kubernetes/manifests + # Replace "systemd" with the cgroup driver of your container runtime. The default value in the kubelet is "cgroupfs". + ExecStart=/usr/bin/kubelet --address=127.0.0.1 --pod-manifest-path=/etc/kubernetes/manifests --cgroup-driver=systemd Restart=always EOF @@ -81,7 +90,7 @@ this example. HOST=${ETCDHOSTS[$i]} NAME=${NAMES[$i]} cat << EOF > /tmp/${HOST}/kubeadmcfg.yaml - apiVersion: "kubeadm.k8s.io/v1beta1" + apiVersion: "kubeadm.k8s.io/v1beta2" kind: ClusterConfiguration etcd: local: @@ -241,15 +250,17 @@ this example. ```sh docker run --rm -it \ --net host \ - -v /etc/kubernetes:/etc/kubernetes quay.io/coreos/etcd:${ETCD_TAG} etcdctl \ - --cert-file /etc/kubernetes/pki/etcd/peer.crt \ - --key-file /etc/kubernetes/pki/etcd/peer.key \ - --ca-file /etc/kubernetes/pki/etcd/ca.crt \ - --endpoints https://${HOST0}:2379 cluster-health + -v /etc/kubernetes:/etc/kubernetes k8s.gcr.io/etcd:${ETCD_TAG} etcdctl \ + --cert /etc/kubernetes/pki/etcd/peer.crt \ + --key /etc/kubernetes/pki/etcd/peer.key \ + --cacert /etc/kubernetes/pki/etcd/ca.crt \ + --endpoints https://${HOST0}:2379 endpoint health --cluster ... - cluster is healthy + https://[HOST0 IP]:2379 is healthy: successfully committed proposal: took = 16.283339ms + https://[HOST1 IP]:2379 is healthy: successfully committed proposal: took = 19.44402ms + https://[HOST2 IP]:2379 is healthy: successfully committed proposal: took = 35.926451ms ``` - - Set `${ETCD_TAG}` to the version tag of your etcd image. For example `v3.2.24`. + - Set `${ETCD_TAG}` to the version tag of your etcd image. For example `3.4.3-0`. To see the etcd image and tag that kubeadm uses execute `kubeadm config images list --kubernetes-version ${K8S_VERSION}`, where `${K8S_VERSION}` is for example `v1.17.0` - Set `${HOST0}`to the IP address of the host you are testing. diff --git a/content/ja/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm.md b/content/ja/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm.md index 669cc3a302..8e9067a4eb 100644 --- a/content/ja/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm.md +++ b/content/ja/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm.md @@ -1,7 +1,7 @@ --- title: kubeadmのトラブルシューティング content_type: concept -weight: 90 +weight: 20 --- @@ -152,7 +152,7 @@ Unable to connect to the server: x509: certificate signed by unknown authority ( - Verify that the `$HOME/.kube/config` file contains a valid certificate, and regenerate a certificate if necessary. The certificates in a kubeconfig file - are base64 encoded. The `base64 -d` command can be used to decode the certificate + are base64 encoded. The `base64 --decode` command can be used to decode the certificate and `openssl x509 -text -noout` can be used for viewing the certificate information. - Unset the `KUBECONFIG` environment variable using: @@ -170,6 +170,7 @@ Unable to connect to the server: x509: certificate signed by unknown authority ( ```sh mv $HOME/.kube $HOME/.kube.bak + mkdir $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` @@ -197,15 +198,15 @@ Error from server: Get https://10.19.0.41:10250/containerLogs/default/mysql-ddc6 ``` - This may be due to Kubernetes using an IP that can not communicate with other IPs on the seemingly same subnet, possibly by policy of the machine provider. -- Digital Ocean assigns a public IP to `eth0` as well as a private one to be used internally as anchor for their floating IP feature, yet `kubelet` will pick the latter as the node's `InternalIP` instead of the public one. +- DigitalOcean assigns a public IP to `eth0` as well as a private one to be used internally as anchor for their floating IP feature, yet `kubelet` will pick the latter as the node's `InternalIP` instead of the public one. - Use `ip addr show` to check for this scenario instead of `ifconfig` because `ifconfig` will not display the offending alias IP address. Alternatively an API endpoint specific to Digital Ocean allows to query for the anchor IP from the droplet: + Use `ip addr show` to check for this scenario instead of `ifconfig` because `ifconfig` will not display the offending alias IP address. Alternatively an API endpoint specific to DigitalOcean allows to query for the anchor IP from the droplet: ```sh curl http://169.254.169.254/metadata/v1/interfaces/public/0/anchor_ipv4/address ``` - The workaround is to tell `kubelet` which IP to use using `--node-ip`. When using Digital Ocean, it can be the public one (assigned to `eth0`) or the private one (assigned to `eth1`) should you want to use the optional private network. The [`KubeletExtraArgs` section of the kubeadm `NodeRegistrationOptions` structure](https://github.com/kubernetes/kubernetes/blob/release-1.13/cmd/kubeadm/app/apis/kubeadm/v1beta1/types.go) can be used for this. + The workaround is to tell `kubelet` which IP to use using `--node-ip`. When using DigitalOcean, it can be the public one (assigned to `eth0`) or the private one (assigned to `eth1`) should you want to use the optional private network. The [`KubeletExtraArgs` section of the kubeadm `NodeRegistrationOptions` structure](https://github.com/kubernetes/kubernetes/blob/release-1.13/cmd/kubeadm/app/apis/kubeadm/v1beta1/types.go) can be used for this. Then restart `kubelet`: @@ -306,16 +307,56 @@ The tracking issue for this problem is [here](https://github.com/kubernetes/kube *Note: This [issue](https://github.com/kubernetes/kubeadm/issues/1358) only applies to tools that marshal kubeadm types (e.g. to a YAML configuration file). It will be fixed in kubeadm API v1beta2.* -By default, kubeadm applies the `role.kubernetes.io/master:NoSchedule` taint to control-plane nodes. +By default, kubeadm applies the `node-role.kubernetes.io/master:NoSchedule` taint to control-plane nodes. If you prefer kubeadm to not taint the control-plane node, and set `InitConfiguration.NodeRegistration.Taints` to an empty slice, the field will be omitted when marshalling. When the field is omitted, kubeadm applies the default taint. There are at least two workarounds: -1. Use the `role.kubernetes.io/master:PreferNoSchedule` taint instead of an empty slice. [Pods will get scheduled on masters](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/), unless other nodes have capacity. +1. Use the `node-role.kubernetes.io/master:PreferNoSchedule` taint instead of an empty slice. [Pods will get scheduled on masters](/docs/concepts/configuration/taint-and-toleration/), unless other nodes have capacity. 2. Remove the taint after kubeadm init exits: ```bash -kubectl taint nodes NODE_NAME role.kubernetes.io/master:NoSchedule- +kubectl taint nodes NODE_NAME node-role.kubernetes.io/master:NoSchedule- + ``` + +## `/usr` is mounted read-only on nodes {#usr-mounted-read-only} + +On Linux distributions such as Fedora CoreOS, the directory `/usr` is mounted as a read-only filesystem. +For [flex-volume support](https://github.com/kubernetes/community/blob/ab55d85/contributors/devel/sig-storage/flexvolume.md), +Kubernetes components like the kubelet and kube-controller-manager use the default path of +`/usr/libexec/kubernetes/kubelet-plugins/volume/exec/`, yet the flex-volume directory _must be writeable_ +for the feature to work. + +To workaround this issue you can configure the flex-volume directory using the kubeadm +[configuration file](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2). + +On the primary control-plane Node (created using `kubeadm init`) pass the following +file using `--config`: + +```yaml +apiVersion: kubeadm.k8s.io/v1beta2 +kind: InitConfiguration +nodeRegistration: + kubeletExtraArgs: + volume-plugin-dir: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/" +--- +apiVersion: kubeadm.k8s.io/v1beta2 +kind: ClusterConfiguration +controllerManager: + extraArgs: + flex-volume-plugin-dir: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/" ``` +On joining Nodes: + +```yaml +apiVersion: kubeadm.k8s.io/v1beta2 +kind: JoinConfiguration +nodeRegistration: + kubeletExtraArgs: + volume-plugin-dir: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/" +``` + +Alternatively, you can modify `/etc/fstab` to make the `/usr` mount writeable, but please +be advised that this is modifying a design principle of the Linux distribution. diff --git a/content/ja/docs/setup/production-environment/tools/kubespray.md b/content/ja/docs/setup/production-environment/tools/kubespray.md index 921ab0e3d8..6c02ca5374 100644 --- a/content/ja/docs/setup/production-environment/tools/kubespray.md +++ b/content/ja/docs/setup/production-environment/tools/kubespray.md @@ -6,22 +6,22 @@ weight: 30 -This quickstart helps to install a Kubernetes cluster hosted on GCE, Azure, OpenStack, AWS, vSphere, Oracle Cloud Infrastructure (Experimental) or Baremetal with [Kubespray](https://github.com/kubernetes-incubator/kubespray). +This quickstart helps to install a Kubernetes cluster hosted on GCE, Azure, OpenStack, AWS, vSphere, Packet (bare metal), Oracle Cloud Infrastructure (Experimental) or Baremetal with [Kubespray](https://github.com/kubernetes-sigs/kubespray). -Kubespray is a composition of [Ansible](http://docs.ansible.com/) playbooks, [inventory](https://github.com/kubernetes-incubator/kubespray/blob/master/docs/ansible.md), provisioning tools, and domain knowledge for generic OS/Kubernetes clusters configuration management tasks. Kubespray provides: +Kubespray is a composition of [Ansible](http://docs.ansible.com/) playbooks, [inventory](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/ansible.md), provisioning tools, and domain knowledge for generic OS/Kubernetes clusters configuration management tasks. Kubespray provides: * a highly available cluster * composable attributes * support for most popular Linux distributions * Container Linux by CoreOS - * Debian Jessie, Stretch, Wheezy + * Debian Buster, Jessie, Stretch, Wheezy * Ubuntu 16.04, 18.04 - * CentOS/RHEL 7 - * Fedora/CentOS Atomic - * openSUSE Leap 42.3/Tumbleweed + * CentOS/RHEL/Oracle Linux 7 + * Fedora 28 + * openSUSE Leap 15 * continuous integration tests -To choose a tool which best fits your use case, read [this comparison](https://github.com/kubernetes-incubator/kubespray/blob/master/docs/comparisons.md) to [kubeadm](/docs/admin/kubeadm/) and [kops](../kops). +To choose a tool which best fits your use case, read [this comparison](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/comparisons.md) to [kubeadm](/docs/admin/kubeadm/) and [kops](/docs/setup/production-environment/tools/kops/). @@ -31,11 +31,11 @@ To choose a tool which best fits your use case, read [this comparison](https://g ### (1/5) 下地の要件の確認 -Provision servers with the following [requirements](https://github.com/kubernetes-incubator/kubespray#requirements): +Provision servers with the following [requirements](https://github.com/kubernetes-sigs/kubespray#requirements): -* **Ansible v2.5 (or newer) and python-netaddr is installed on the machine that will run Ansible commands** +* **Ansible v2.7.8 and python-netaddr is installed on the machine that will run Ansible commands** * **Jinja 2.9 (or newer) is required to run the Ansible Playbooks** -* The target servers must have **access to the Internet** in order to pull docker images +* The target servers must have access to the Internet in order to pull docker images. Otherwise, additional configuration is required ([See Offline Environment](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/offline-environment.md)) * The target servers are configured to allow **IPv4 forwarding** * **Your ssh key must be copied** to all the servers part of your inventory * The **firewalls are not managed**, you'll need to implement your own rules the way you used to. in order to avoid any issue during deployment you should disable your firewall @@ -44,12 +44,13 @@ Provision servers with the following [requirements](https://github.com/kubernete Kubespray provides the following utilities to help provision your environment: * [Terraform](https://www.terraform.io/) scripts for the following cloud providers: - * [AWS](https://github.com/kubernetes-incubator/kubespray/tree/master/contrib/terraform/aws) - * [OpenStack](https://github.com/kubernetes-incubator/kubespray/tree/master/contrib/terraform/openstack) + * [AWS](https://github.com/kubernetes-sigs/kubespray/tree/master/contrib/terraform/aws) + * [OpenStack](https://github.com/kubernetes-sigs/kubespray/tree/master/contrib/terraform/openstack) + * [Packet](https://github.com/kubernetes-sigs/kubespray/tree/master/contrib/terraform/packet) ### (2/5) インベントリファイルの用意 -After you provision your servers, create an [inventory file for Ansible](http://docs.ansible.com/ansible/intro_inventory.html). You can do this manually or via a dynamic inventory script. For more information, see "[Building your own inventory](https://github.com/kubernetes-incubator/kubespray/blob/master/docs/getting-started.md#building-your-own-inventory)". +After you provision your servers, create an [inventory file for Ansible](http://docs.ansible.com/ansible/intro_inventory.html). You can do this manually or via a dynamic inventory script. For more information, see "[Building your own inventory](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/getting-started.md#building-your-own-inventory)". ### (3/5) クラスタ作成の計画 @@ -58,14 +59,14 @@ Kubespray provides the ability to customize many aspects of the deployment: * Choice deployment mode: kubeadm or non-kubeadm * CNI (networking) plugins * DNS configuration -* Choice of control plane: native/binary or containerized with docker or rkt +* Choice of control plane: native/binary or containerized * Component versions * Calico route reflectors * Component runtime options - * docker - * rkt - * cri-o -* Certificate generation methods (**Vault being discontinued**) + * {{< glossary_tooltip term_id="docker" >}} + * {{< glossary_tooltip term_id="containerd" >}} + * {{< glossary_tooltip term_id="cri-o" >}} +* Certificate generation methods Kubespray customizations can be made to a [variable file](http://docs.ansible.com/ansible/playbooks_variables.html). If you are just getting started with Kubespray, consider using the Kubespray defaults to deploy your cluster and explore Kubernetes. @@ -73,18 +74,18 @@ Kubespray customizations can be made to a [variable file](http://docs.ansible.co Next, deploy your cluster: -Cluster deployment using [ansible-playbook](https://github.com/kubernetes-incubator/kubespray/blob/master/docs/getting-started.md#starting-custom-deployment). +Cluster deployment using [ansible-playbook](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/getting-started.md#starting-custom-deployment). ```shell ansible-playbook -i your/inventory/inventory.ini cluster.yml -b -v \ --private-key=~/.ssh/private_key ``` -Large deployments (100+ nodes) may require [specific adjustments](https://github.com/kubernetes-incubator/kubespray/blob/master/docs/large-deployments.md) for best results. +Large deployments (100+ nodes) may require [specific adjustments](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/large-deployments.md) for best results. ### (5/5) デプロイの確認 -Kubespray provides a way to verify inter-pod connectivity and DNS resolve with [Netchecker](https://github.com/kubernetes-incubator/kubespray/blob/master/docs/netcheck.md). Netchecker ensures the netchecker-agents pods can resolve DNS requests and ping each over within the default namespace. Those pods mimic similar behavior of the rest of the workloads and serve as cluster health indicators. +Kubespray provides a way to verify inter-pod connectivity and DNS resolve with [Netchecker](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/netcheck.md). Netchecker ensures the netchecker-agents pods can resolve DNS requests and ping each over within the default namespace. Those pods mimic similar behavior of the rest of the workloads and serve as cluster health indicators. ## クラスタの操作 @@ -92,16 +93,16 @@ Kubespray provides additional playbooks to manage your cluster: _scale_ and _upg ### クラスタのスケール -You can add worker nodes from your cluster by running the scale playbook. For more information, see "[Adding nodes](https://github.com/kubernetes-incubator/kubespray/blob/master/docs/getting-started.md#adding-nodes)". -You can remove worker nodes from your cluster by running the remove-node playbook. For more information, see "[Remove nodes](https://github.com/kubernetes-incubator/kubespray/blob/master/docs/getting-started.md#remove-nodes)". +You can add worker nodes from your cluster by running the scale playbook. For more information, see "[Adding nodes](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/getting-started.md#adding-nodes)". +You can remove worker nodes from your cluster by running the remove-node playbook. For more information, see "[Remove nodes](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/getting-started.md#remove-nodes)". ### クラスタのアップグレード -You can upgrade your cluster by running the upgrade-cluster playbook. For more information, see "[Upgrades](https://github.com/kubernetes-incubator/kubespray/blob/master/docs/upgrades.md)". +You can upgrade your cluster by running the upgrade-cluster playbook. For more information, see "[Upgrades](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/upgrades.md)". ## クリーンアップ -You can reset your nodes and wipe out all components installed with Kubespray via the [reset playbook](https://github.com/kubernetes-incubator/kubespray/blob/master/reset.yml). +You can reset your nodes and wipe out all components installed with Kubespray via the [reset playbook](https://github.com/kubernetes-sigs/kubespray/blob/master/reset.yml). {{< caution >}} When running the reset playbook, be sure not to accidentally target your production cluster! @@ -109,14 +110,13 @@ When running the reset playbook, be sure not to accidentally target your product ## フィードバック -* Slack Channel: [#kubespray](https://kubernetes.slack.com/messages/kubespray/) -* [GitHub Issues](https://github.com/kubernetes-incubator/kubespray/issues) +* Slack Channel: [#kubespray](https://kubernetes.slack.com/messages/kubespray/) (You can get your invite [here](http://slack.k8s.io/)) +* [GitHub Issues](https://github.com/kubernetes-sigs/kubespray/issues) ## {{% heading "whatsnext" %}} -Check out planned work on Kubespray's [roadmap](https://github.com/kubernetes-incubator/kubespray/blob/master/docs/roadmap.md). - +Check out planned work on Kubespray's [roadmap](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/roadmap.md). diff --git a/content/ja/docs/setup/production-environment/turnkey/_index.md b/content/ja/docs/setup/production-environment/turnkey/_index.md index c39cd2a714..6b9dabb7ab 100644 --- a/content/ja/docs/setup/production-environment/turnkey/_index.md +++ b/content/ja/docs/setup/production-environment/turnkey/_index.md @@ -1,4 +1,4 @@ --- title: ターンキークラウドソリューション -weight: 40 +weight: 30 --- diff --git a/content/ja/docs/setup/production-environment/turnkey/alibaba-cloud.md b/content/ja/docs/setup/production-environment/turnkey/alibaba-cloud.md index f8323743cf..4506e9cba0 100644 --- a/content/ja/docs/setup/production-environment/turnkey/alibaba-cloud.md +++ b/content/ja/docs/setup/production-environment/turnkey/alibaba-cloud.md @@ -4,9 +4,9 @@ title: Alibaba CloudでKubernetesを動かす ## Alibaba Cloud Container Service -[Alibaba Cloud Container Service](https://www.alibabacloud.com/product/container-service)はAlibaba Cloud ECSインスタンスのクラスター上でDockerアプリケーションを起動して管理します。著名なオープンソースのコンテナオーケストレーターであるDocker SwarmおよびKubernetesをサポートしています。 +[Alibaba Cloud Container Service](https://www.alibabacloud.com/product/container-service)はAlibaba Cloud ECSインスタンスのクラスター上もしくはサーバーレスの形態でDockerアプリケーションを起動して管理します。著名なオープンソースのコンテナオーケストレーターであるDocker SwarmおよびKubernetesをサポートしています。 -クラスターの構築と管理を簡素化する為に、[Alibaba Cloud Container Serviceの為のKubernetesサポート](https://www.alibabacloud.com/product/kubernetes)を使用します。[Kubernetes walk-through](https://www.alibabacloud.com/help/doc-detail/86737.htm)に従ってすぐに始めることができ、中国語の[Alibaba CloudにおけるKubernetesサポートの為のチュートリアル](https://yq.aliyun.com/teams/11/type_blog-cid_200-page_1)もあります。 +クラスターの構築と管理を簡素化するために、[Alibaba Cloud Container ServiceのためのKubernetesサポート](https://www.alibabacloud.com/product/kubernetes)を使用します。[Kubernetes walk-through](https://www.alibabacloud.com/help/doc-detail/86737.htm)に従ってすぐに始めることができ、中国語の[Alibaba CloudにおけるKubernetesサポートのためのチュートリアル](https://yq.aliyun.com/teams/11/type_blog-cid_200-page_1)もあります。 カスタムバイナリもしくはオープンソースKubernetesを使用する場合は、以下の手順に従って下さい。 @@ -14,4 +14,4 @@ title: Alibaba CloudでKubernetesを動かす [Alibaba Cloudプロバイダーが実装されたKubernetesのソースコード](https://github.com/AliyunContainerService/kubernetes)はオープンソースであり、GitHubから入手可能です。 -さらなる情報は英語の[Kubernetesのクイックデプロイメント - Alibaba CloudのVPC環境](https://www.alibabacloud.com/forum/read-830)および[中国語](https://yq.aliyun.com/articles/66474)をご覧下さい。 +さらなる情報は英語の[Kubernetesのクイックデプロイメント - Alibaba CloudのVPC環境](https://www.alibabacloud.com/forum/read-830)をご覧下さい。 diff --git a/content/ja/docs/setup/production-environment/turnkey/aws.md b/content/ja/docs/setup/production-environment/turnkey/aws.md index ebbb93160d..1fc53a1f28 100644 --- a/content/ja/docs/setup/production-environment/turnkey/aws.md +++ b/content/ja/docs/setup/production-environment/turnkey/aws.md @@ -16,7 +16,7 @@ AWS上でKubernetesクラスターを作成するには、AWSからアクセス ### サポートされているプロダクショングレードのツール -* [conjure-up](/docs/getting-started-guides/ubuntu/)はUbuntu上でネイティブなAWSインテグレーションを用いてKubernetesクラスターを作成するオープンソースのインストーラーです。 +* [conjure-up](https://docs.conjure-up.io/stable/en/cni/k8s-and-aws)はUbuntu上でネイティブなAWSインテグレーションを用いてKubernetesクラスターを作成するオープンソースのインストーラーです。 * [Kubernetes Operations](https://github.com/kubernetes/kops) - プロダクショングレードなKubernetesのインストール、アップグレード、管理が可能です。AWS上のDebian、Ubuntu、CentOS、RHELをサポートしています。 diff --git a/content/ja/docs/setup/production-environment/turnkey/icp.md b/content/ja/docs/setup/production-environment/turnkey/icp.md index 79783a6364..9d1a0a17b3 100644 --- a/content/ja/docs/setup/production-environment/turnkey/icp.md +++ b/content/ja/docs/setup/production-environment/turnkey/icp.md @@ -35,9 +35,9 @@ IBM Cloud Private can also run on the AWS cloud platform by using Terraform. To ## Azure上でのIBM Cloud Private -You can enable Microsoft Azure as a cloud provider for IBM Cloud Private deployment and take advantage of all the IBM Cloud Private features on the Azure public cloud. For more information, see [IBM Cloud Private on Azure](https://www.ibm.com/support/knowledgecenter/SSBS6K_3.1.2/supported_environments/azure_overview.html). +You can enable Microsoft Azure as a cloud provider for IBM Cloud Private deployment and take advantage of all the IBM Cloud Private features on the Azure public cloud. For more information, see [IBM Cloud Private on Azure](https://www.ibm.com/support/knowledgecenter/SSBS6K_3.2.0/supported_environments/azure_overview.html). -## Red Hat OpenShift上でのIBM Cloud Private +## Red Hat OpenShiftを用いたIBM Cloud Private You can deploy IBM certified software containers that are running on IBM Cloud Private onto Red Hat OpenShift. @@ -49,7 +49,7 @@ Integration capabilities: * Integrated core platform services, such as monitoring, metering, and logging * IBM Cloud Private uses the OpenShift image registry -For more information see, [IBM Cloud Private on OpenShift](https://www.ibm.com/support/knowledgecenter/SSBS6K_3.1.2/supported_environments/openshift/overview.html). +For more information see, [IBM Cloud Private on OpenShift](https://www.ibm.com/support/knowledgecenter/SSBS6K_3.2.0/supported_environments/openshift/overview.html). ## VirtualBox上でのIBM Cloud Private diff --git a/content/ja/docs/setup/production-environment/turnkey/stackpoint.md b/content/ja/docs/setup/production-environment/turnkey/stackpoint.md deleted file mode 100644 index 47711bf4d8..0000000000 --- a/content/ja/docs/setup/production-environment/turnkey/stackpoint.md +++ /dev/null @@ -1,187 +0,0 @@ ---- -title: Stackpoint.ioを利用して複数のクラウド上でKubernetesを動かす -content_type: concept ---- - - - -[StackPointCloud](https://stackpoint.io/) is the universal control plane for Kubernetes Anywhere. StackPointCloud allows you to deploy and manage a Kubernetes cluster to the cloud provider of your choice in 3 steps using a web-based interface. - - - - - -## AWS - -To create a Kubernetes cluster on AWS, you will need an Access Key ID and a Secret Access Key from AWS. - -1. Choose a Provider - - a. Log in to [stackpoint.io](https://stackpoint.io) with a GitHub, Google, or Twitter account. - - b. Click **+ADD A CLUSTER NOW**. - - c. Click to select Amazon Web Services (AWS). - -1. Configure Your Provider - - a. Add your Access Key ID and a Secret Access Key from AWS. Select your default StackPointCloud SSH keypair, or click **ADD SSH KEY** to add a new keypair. - - b. Click **SUBMIT** to submit the authorization information. - -1. Configure Your Cluster - - Choose any extra options you may want to include with your cluster, then click **SUBMIT** to create the cluster. - -1. Run the Cluster - - You can monitor the status of your cluster and suspend or delete it from [your stackpoint.io dashboard](https://stackpoint.io/#/clusters). - - For information on using and managing a Kubernetes cluster on AWS, [consult the Kubernetes documentation](/docs/getting-started-guides/aws/). - - -## GCE - -To create a Kubernetes cluster on GCE, you will need the Service Account JSON Data from Google. - -1. Choose a Provider - - a. Log in to [stackpoint.io](https://stackpoint.io) with a GitHub, Google, or Twitter account. - - b. Click **+ADD A CLUSTER NOW**. - - c. Click to select Google Compute Engine (GCE). - -1. Configure Your Provider - - a. Add your Service Account JSON Data from Google. Select your default StackPointCloud SSH keypair, or click **ADD SSH KEY** to add a new keypair. - - b. Click **SUBMIT** to submit the authorization information. - -1. Configure Your Cluster - - Choose any extra options you may want to include with your cluster, then click **SUBMIT** to create the cluster. - -1. Run the Cluster - - You can monitor the status of your cluster and suspend or delete it from [your stackpoint.io dashboard](https://stackpoint.io/#/clusters). - - For information on using and managing a Kubernetes cluster on GCE, [consult the Kubernetes documentation](/docs/getting-started-guides/gce/). - - -## Google Kubernetes Engine - -To create a Kubernetes cluster on Google Kubernetes Engine, you will need the Service Account JSON Data from Google. - -1. Choose a Provider - - a. Log in to [stackpoint.io](https://stackpoint.io) with a GitHub, Google, or Twitter account. - - b. Click **+ADD A CLUSTER NOW**. - - c. Click to select Google Kubernetes Engine. - -1. Configure Your Provider - - a. Add your Service Account JSON Data from Google. Select your default StackPointCloud SSH keypair, or click **ADD SSH KEY** to add a new keypair. - - b. Click **SUBMIT** to submit the authorization information. - -1. Configure Your Cluster - - Choose any extra options you may want to include with your cluster, then click **SUBMIT** to create the cluster. - -1. Run the Cluster - - You can monitor the status of your cluster and suspend or delete it from [your stackpoint.io dashboard](https://stackpoint.io/#/clusters). - - For information on using and managing a Kubernetes cluster on Google Kubernetes Engine, consult [the official documentation](/ja/docs/home/). - - -## DigitalOcean - -To create a Kubernetes cluster on DigitalOcean, you will need a DigitalOcean API Token. - -1. Choose a Provider - - a. Log in to [stackpoint.io](https://stackpoint.io) with a GitHub, Google, or Twitter account. - - b. Click **+ADD A CLUSTER NOW**. - - c. Click to select DigitalOcean. - -1. Configure Your Provider - - a. Add your DigitalOcean API Token. Select your default StackPointCloud SSH keypair, or click **ADD SSH KEY** to add a new keypair. - - b. Click **SUBMIT** to submit the authorization information. - -1. Configure Your Cluster - - Choose any extra options you may want to include with your cluster, then click **SUBMIT** to create the cluster. - -1. Run the Cluster - - You can monitor the status of your cluster and suspend or delete it from [your stackpoint.io dashboard](https://stackpoint.io/#/clusters). - - For information on using and managing a Kubernetes cluster on DigitalOcean, consult [the official documentation](/ja/docs/home/). - - -## Microsoft Azure - -To create a Kubernetes cluster on Microsoft Azure, you will need an Azure Subscription ID, Username/Email, and Password. - -1. Choose a Provider - - a. Log in to [stackpoint.io](https://stackpoint.io) with a GitHub, Google, or Twitter account. - - b. Click **+ADD A CLUSTER NOW**. - - c. Click to select Microsoft Azure. - -1. Configure Your Provider - - a. Add your Azure Subscription ID, Username/Email, and Password. Select your default StackPointCloud SSH keypair, or click **ADD SSH KEY** to add a new keypair. - - b. Click **SUBMIT** to submit the authorization information. - -1. Configure Your Cluster - - Choose any extra options you may want to include with your cluster, then click **SUBMIT** to create the cluster. - -1. Run the Cluster - - You can monitor the status of your cluster and suspend or delete it from [your stackpoint.io dashboard](https://stackpoint.io/#/clusters). - - For information on using and managing a Kubernetes cluster on Azure, [consult the Kubernetes documentation](/docs/getting-started-guides/azure/). - - -## Packet - -To create a Kubernetes cluster on Packet, you will need a Packet API Key. - -1. Choose a Provider - - a. Log in to [stackpoint.io](https://stackpoint.io) with a GitHub, Google, or Twitter account. - - b. Click **+ADD A CLUSTER NOW**. - - c. Click to select Packet. - -1. Configure Your Provider - - a. Add your Packet API Key. Select your default StackPointCloud SSH keypair, or click **ADD SSH KEY** to add a new keypair. - - b. Click **SUBMIT** to submit the authorization information. - -1. Configure Your Cluster - - Choose any extra options you may want to include with your cluster, then click **SUBMIT** to create the cluster. - -1. Run the Cluster - - You can monitor the status of your cluster and suspend or delete it from [your stackpoint.io dashboard](https://stackpoint.io/#/clusters). - - For information on using and managing a Kubernetes cluster on Packet, consult [the official documentation](/ja/docs/home/). - - diff --git a/content/ja/docs/setup/production-environment/windows/flannel-master-kubeclt-get-pods.png b/content/ja/docs/setup/production-environment/windows/flannel-master-kubeclt-get-pods.png deleted file mode 100644 index 73da333fcf..0000000000 Binary files a/content/ja/docs/setup/production-environment/windows/flannel-master-kubeclt-get-pods.png and /dev/null differ diff --git a/content/ja/docs/setup/production-environment/windows/flannel-master-kubectl-get-ds.png b/content/ja/docs/setup/production-environment/windows/flannel-master-kubectl-get-ds.png deleted file mode 100644 index cda9353316..0000000000 Binary files a/content/ja/docs/setup/production-environment/windows/flannel-master-kubectl-get-ds.png and /dev/null differ diff --git a/content/ja/docs/setup/production-environment/windows/intro-windows-in-kubernetes.md b/content/ja/docs/setup/production-environment/windows/intro-windows-in-kubernetes.md index ab0181fd49..c821fca425 100644 --- a/content/ja/docs/setup/production-environment/windows/intro-windows-in-kubernetes.md +++ b/content/ja/docs/setup/production-environment/windows/intro-windows-in-kubernetes.md @@ -1,73 +1,72 @@ --- -title: Intro to Windows support in Kubernetes +title: KubernetesのWindowsサポート概要 content_type: concept weight: 65 --- -Windows applications constitute a large portion of the services and applications that run in many organizations. [Windows containers](https://aka.ms/windowscontainers) provide a modern way to encapsulate processes and package dependencies, making it easier to use DevOps practices and follow cloud native patterns for Windows applications. Kubernetes has become the defacto standard container orchestrator, and the release of Kubernetes 1.14 includes production support for scheduling Windows containers on Windows nodes in a Kubernetes cluster, enabling a vast ecosystem of Windows applications to leverage the power of Kubernetes. Organizations with investments in Windows-based applications and Linux-based applications don't have to look for separate orchestrators to manage their workloads, leading to increased operational efficiencies across their deployments, regardless of operating system. +Windowsアプリケーションは、多くの組織で実行されているサービスやアプリケーションの大部分を占めています。[Windowsコンテナ](https://aka.ms/windowscontainers)は、プロセスとパッケージの依存関係を一つにまとめる最新の方法を提供し、DevOpsプラクティスの使用とWindowsアプリケーションのクラウドネイティブパターンの追求を容易にします。Kubernetesは事実上、標準的なコンテナオーケストレータになりました。Kubernetes 1.14のリリースでは、Kubernetesクラスター内のWindowsノードでWindowsコンテナをスケジューリングする本番環境サポートが含まれたので、Windowsアプリケーションの広大なエコシステムにおいて、Kubernetesを有効的に活用できます。WindowsベースのアプリケーションとLinuxベースのアプリケーションに投資している組織は、ワークロードを管理する個別のオーケストレーターが不要となるため、オペレーティングシステムに関係なくアプリケーション全体の運用効率が向上します。 -## Windows containers in Kubernetes +## KubernetesのWindowsコンテナ -To enable the orchestration of Windows containers in Kubernetes, simply include Windows nodes in your existing Linux cluster. Scheduling Windows containers in [Pods](/ja/docs/concepts/workloads/pods/pod-overview/) on Kubernetes is as simple and easy as scheduling Linux-based containers. +KubernetesでWindowsコンテナのオーケストレーションを有効にする方法は、既存のLinuxクラスターにWindowsノードを含めるだけです。Kubernetesの[Pod](/ja/docs/concepts/workloads/pods/pod-overview/)でWindowsコンテナをスケジュールすることは、Linuxベースのコンテナをスケジュールするのと同じくらいシンプルで簡単です。 -In order to run Windows containers, your Kubernetes cluster must include multiple operating systems, with control plane nodes running Linux and workers running either Windows or Linux depending on your workload needs. Windows Server 2019 is the only Windows operating system supported, enabling [Kubernetes Node](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/architecture/architecture.md#the-kubernetes-node) on Windows (including kubelet, [container runtime](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/containerd), and kube-proxy). For a detailed explanation of Windows distribution channels see the [Microsoft documentation](https://docs.microsoft.com/en-us/windows-server/get-started-19/servicing-channels-19). +Windowsコンテナを実行するには、Kubernetesクラスターに複数のオペレーティングシステムを含める必要があります。コントロールプレーンノードはLinux、ワーカーノードはワークロードのニーズに応じてWindowsまたはLinuxで実行します。Windows Server 2019は、サポートされている唯一のWindowsオペレーティングシステムであり、Windows (kubelet、[コンテナランタイム](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/containerd)、kube-proxyを含む)で[Kubernetesノード](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/architecture/architecture.md#the-kubernetes-node)を有効にします。Windowsディストリビューションチャンネルの詳細については、[Microsoftのドキュメント](https://docs.microsoft.com/en-us/windows-server/get-started-19/servicing-channels-19)を参照してください。 {{< note >}} -The Kubernetes control plane, including the [master components](/ja/docs/concepts/overview/components/), continues to run on Linux. There are no plans to have a Windows-only Kubernetes cluster. +[マスターコンポーネント](/ja/docs/concepts/overview/components/)を含むKubernetesコントロールプレーンは、Linuxで実行し続けます。WindowsのみのKubernetesクラスターを導入する計画はありません。 {{< /note >}} - {{< note >}} -In this document, when we talk about Windows containers we mean Windows containers with process isolation. Windows containers with [Hyper-V isolation](https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/hyperv-container) is planned for a future release. +このドキュメントでは、Windowsコンテナについて説明する場合、プロセス分離のWindowsコンテナを意味します。[Hyper-V分離](https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/hyperv-container)のWindowsコンテナは、将来リリースが計画されています。 {{< /note >}} -## Supported Functionality and Limitations +## サポートされている機能と制限 -### Supported Functionality +### サポートされている機能 -#### Compute +#### コンピュート -From an API and kubectl perspective, Windows containers behave in much the same way as Linux-based containers. However, there are some notable differences in key functionality which are outlined in the limitation section. +APIとkubectlの観点から見ると、WindowsコンテナはLinuxベースのコンテナとほとんど同じように動作します。ただし、制限セクションで概説されている主要な機能には、いくつかの顕著な違いがあります。 -Let's start with the operating system version. Refer to the following table for Windows operating system support in Kubernetes. A single heterogeneous Kubernetes cluster can have both Windows and Linux worker nodes. Windows containers have to be scheduled on Windows nodes and Linux containers on Linux nodes. +オペレーティングシステムのバージョンから始めましょう。KubernetesのWindowsオペレーティングシステムのサポートについては、次の表を参照してください。単一の混成Kubernetesクラスターは、WindowsとLinuxの両方のワーカーノードを持つことができます。WindowsコンテナはWindowsノードで、LinuxコンテナはLinuxノードでスケジュールする必要があります。 -| Kubernetes version | Host OS version (Kubernetes Node) | | | +| Kubernetes バージョン | ホストOS バージョン (Kubernetes ノード) | | | | --- | --- | --- | --- | | | *Windows Server 1709* | *Windows Server 1803* | *Windows Server 1809/Windows Server 2019* | -| *Kubernetes v1.14* | Not Supported | Not Supported| Supported for Windows Server containers Builds 17763.* with Docker EE-basic 18.09 | +| *Kubernetes v1.14* | サポートされていません | サポートされていません| Windows Server containers Builds 17763.* と Docker EE-basic 18.09 がサポートされています | {{< note >}} -We don't expect all Windows customers to update the operating system for their apps frequently. Upgrading your applications is what dictates and necessitates upgrading or introducing new nodes to the cluster. For the customers that chose to upgrade their operating system for containers running on Kubernetes, we will offer guidance and step-by-step instructions when we add support for a new operating system version. This guidance will include recommended upgrade procedures for upgrading user applications together with cluster nodes. Windows nodes adhere to Kubernetes [version-skew policy](/ja/docs/setup/release/version-skew-policy/) (node to control plane versioning) the same way as Linux nodes do today. +すべてのWindowsユーザーがアプリのオペレーティングシステムを頻繁に更新することは望んでいません。アプリケーションのアップグレードは、クラスターに新しいノードをアップグレードまたは導入することを要求する必要があります。Kubernetesで実行されているコンテナのオペレーティングシステムをアップグレードすることを選択したユーザーには、新しいオペレーティングシステムバージョンのサポート追加時に、ガイダンスと段階的な指示を提供します。このガイダンスには、クラスターノードと共にアプリケーションをアップグレードするための推奨アップグレード手順が含まれます。Windowsノードは、現在のLinuxノードと同じように、Kubernetes[バージョンスキューポリシー](/ja/docs/setup/release/version-skew-policy/)(ノードからコントロールプレーンのバージョン管理)に準拠しています。 {{< /note >}} {{< note >}} -The Windows Server Host Operating System is subject to the [Windows Server ](https://www.microsoft.com/en-us/cloud-platform/windows-server-pricing) licensing. The Windows Container images are subject to the [Supplemental License Terms for Windows containers](https://docs.microsoft.com/en-us/virtualization/windowscontainers/images-eula). +Windows Serverホストオペレーティングシステムには、[Windows Server](https://www.microsoft.com/en-us/cloud-platform/windows-server-pricing)ライセンスが適用されます。Windowsコンテナイメージには、[Windowsコンテナの追加ライセンス条項](https://docs.microsoft.com/en-us/virtualization/windowscontainers/images-eula)ライセンスが提供されます。 {{< /note >}} {{< note >}} -Windows containers with process isolation have strict compatibility rules, [where the host OS version must match the container base image OS version](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility). Once we support Windows containers with Hyper-V isolation in Kubernetes, the limitation and compatibility rules will change. +プロセス分離のWindowsコンテナには、[ホストOSのバージョンはコンテナのベースイメージのOSバージョンと一致する必要がある](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility)という厳格な互換性ルールがあります。KubernetesでHyper-V分離のWindowsコンテナをサポートする際には、制限と互換性ルールが変更されます。 {{< /note >}} -Key Kubernetes elements work the same way in Windows as they do in Linux. In this section, we talk about some of the key workload enablers and how they map to Windows. +Kubernetesの主要な要素は、WindowsでもLinuxと同じように機能します。このセクションでは、主要なワークロードイネーブラーのいくつかと、それらがWindowsにどのようにマップされるかについて説明します。 * [Pods](/ja/docs/concepts/workloads/pods/pod-overview/) - A Pod is the basic building block of Kubernetes–the smallest and simplest unit in the Kubernetes object model that you create or deploy. The following Pod capabilities, properties and events are supported with Windows containers: + Podは、Kubernetesにおける最も基本的な構成要素です。人間が作成またはデプロイするKubernetesオブジェクトモデルの中で最小かつ最もシンプルな単位です。WindowsとLinuxのコンテナを同じPodにデプロイすることはできません。Pod内のすべてのコンテナは、各ノードが特定のプラットフォームとアーキテクチャを表す単一のノードにスケジュールされます。次のPod機能、プロパティ、およびイベントがWindowsコンテナでサポートされています。: - * Single or multiple containers per Pod with process isolation and volume sharing - * Pod status fields - * Readiness and Liveness probes - * postStart & preStop container lifecycle events - * ConfigMap, Secrets: as environment variables or volumes + * プロセス分離とボリューム共有を備えたPodごとの単一または複数のコンテナ + * Podステータスフィールド + * ReadinessとLiveness Probe + * postStartとpreStopコンテナのライフサイクルイベント + * 環境変数またはボリュームとしてのConfigMap、 Secrets * EmptyDir - * Named pipe host mounts - * Resource limits + * 名前付きパイプホストマウント + * リソース制限 * [Controllers](/ja/docs/concepts/workloads/controllers/) - Kubernetes controllers handle the desired state of Pods. The following workload controllers are supported with Windows containers: + Kubernetesコントローラは、Podの望ましい状態を処理します。次のワークロードコントローラーは、Windowsコンテナでサポートされています。: * ReplicaSet * ReplicationController @@ -78,322 +77,340 @@ Key Kubernetes elements work the same way in Windows as they do in Linux. In thi * CronJob * [Services](/ja/docs/concepts/services-networking/service/) - A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them - sometimes called a micro-service. You can use services for cross-operating system connectivity. In Windows, services can utilize the following types, properties and capabilities: + Kubernetes Serviceは、Podの論理セットとPodにアクセスするためのポリシーを定義する抽象概念です。マイクロサービスと呼ばれることもあります。オペレーティングシステム間の接続にServiceを使用できます。WindowsでのServiceは、次のタイプ、プロパティと機能を利用できます。: - * Service Environment variables + * サービス環境変数 * NodePort * ClusterIP * LoadBalancer * ExternalName * Headless services -Pods, Controllers and Services are critical elements to managing Windows workloads on Kubernetes. However, on their own they are not enough to enable the proper lifecycle management of Windows workloads in a dynamic cloud native environment. We added support for the following features: +Pod、Controller、Serviceは、KubernetesでWindowsワークロードを管理するための重要な要素です。ただし、それだけでは、動的なクラウドネイティブ環境でWindowsワークロードの適切なライフサイクル管理を可能にするのに十分ではありません。次の機能のサポートを追加しました: -* Pod and container metrics -* Horizontal Pod Autoscaler support +* Podとコンテナのメトリクス +* Horizontal Pod Autoscalerサポート * kubectl Exec -* Resource Quotas -* Scheduler preemption +* リソースクォータ +* Schedulerのプリエンプション -#### Container Runtime +#### コンテナランタイム -Docker EE-basic 18.09 is required on Windows Server 2019 / 1809 nodes for Kubernetes. This works with the dockershim code included in the kubelet. Additional runtimes such as CRI-ContainerD may be supported in later Kubernetes versions. +KubernetesのWindows Server 2019/1809ノードでは、Docker EE-basic 18.09が必要です。これは、kubeletに含まれているdockershimコードで動作します。CRI-ContainerDなどの追加のランタイムは、Kubernetesの以降のバージョンでサポートされる可能性があります。 -#### Storage +#### 永続ストレージ -Kubernetes Volumes enable complex applications with data persistence and Pod volume sharing requirements to be deployed on Kubernetes. Kubernetes on Windows supports the following types of [volumes](/ja/docs/concepts/storage/volumes/): +Kubernetes[ボリューム](/docs/concepts/storage/volumes/)を使用すると、データの永続性とPodボリュームの共有要件を備えた複雑なアプリケーションをKubernetesにデプロイできます。特定のストレージバックエンドまたはプロトコルに関連付けられた永続ボリュームの管理には、ボリュームのプロビジョニング/プロビジョニング解除/サイズ変更、Kubernetesノードへのボリュームのアタッチ/デタッチ、およびデータを永続化する必要があるPod内の個別のコンテナへのボリュームのマウント/マウント解除などのアクションが含まれます。特定のストレージバックエンドまたはプロトコルに対してこれらのボリューム管理アクションを実装するコードは、Kubernetesボリューム[プラグイン](/docs/concepts/storage/volumes/#types-of-volumes)の形式で出荷されます。次の幅広いクラスのKubernetesボリュームプラグインがWindowsでサポートされています。: -* FlexVolume out-of-tree plugin with [SMB and iSCSI](https://github.com/Microsoft/K8s-Storage-Plugins/tree/master/flexvolume/windows) support -* [azureDisk](/ja/docs/concepts/storage/volumes/#azuredisk) -* [azureFile](/ja/docs/concepts/storage/volumes/#azurefile) -* [gcePersistentDisk](/ja/docs/concepts/storage/volumes/#gcepersistentdisk) +##### In-treeボリュームプラグイン +In-treeボリュームプラグインに関連付けられたコードは、コアKubernetesコードベースの一部として提供されます。In-treeボリュームプラグインのデプロイでは、追加のスクリプトをインストールしたり、個別のコンテナ化されたプラグインコンポーネントをデプロイしたりする必要はありません。これらのプラグインは、ストレージバックエンドでのボリュームのプロビジョニング/プロビジョニング解除とサイズ変更、Kubernetesノードへのボリュームのアタッチ/アタッチ解除、Pod内の個々のコンテナーへのボリュームのマウント/マウント解除を処理できます。次のIn-treeプラグインは、Windowsノードをサポートしています。: -#### Networking +* [awsElasticBlockStore](/docs/concepts/storage/volumes/#awselasticblockstore) +* [azureDisk](/docs/concepts/storage/volumes/#azuredisk) +* [azureFile](/docs/concepts/storage/volumes/#azurefile) +* [gcePersistentDisk](/docs/concepts/storage/volumes/#gcepersistentdisk) +* [vsphereVolume](/docs/concepts/storage/volumes/#vspherevolume) -Networking for Windows containers is exposed through [CNI plugins](/ja/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/). Windows containers function similarly to virtual machines in regards to networking. Each container has a virtual network adapter (vNIC) which is connected to a Hyper-V virtual switch (vSwitch). The Host Networking Service (HNS) and the Host Compute Service (HCS) work together to create containers and attach container vNICs to networks. HCS is responsible for the management of containers whereas HNS is responsible for the management of networking resources such as: +##### FlexVolume Plugins +[FlexVolume](/docs/concepts/storage/volumes/#flexVolume)プラグインに関連付けられたコードは、ホストに直接デプロイする必要があるout-of-treeのスクリプトまたはバイナリとして出荷されます。FlexVolumeプラグインは、Kubernetesノードとの間のボリュームのアタッチ/デタッチ、およびPod内の個々のコンテナとの間のボリュームのマウント/マウント解除を処理します。FlexVolumeプラグインに関連付けられた永続ボリュームのプロビジョニング/プロビジョニング解除は、通常FlexVolumeプラグインとは別の外部プロビジョニング担当者を通じて処理できます。次のFlexVolume[プラグイン](https://github.com/Microsoft/K8s-Storage-Plugins/tree/master/flexvolume/windows)は、Powershellスクリプトとしてホストにデプロイされ、Windowsノードをサポートします: -* Virtual networks (including creation of vSwitches) -* Endpoints / vNICs -* Namespaces -* Policies (Packet encapsulations, Load-balancing rules, ACLs, NAT'ing rules, etc.) +* [SMB](https://github.com/microsoft/K8s-Storage-Plugins/tree/master/flexvolume/windows/plugins/microsoft.com~smb.cmd) +* [iSCSI](https://github.com/microsoft/K8s-Storage-Plugins/tree/master/flexvolume/windows/plugins/microsoft.com~iscsi.cmd) -The following service spec types are supported: +##### CSIプラグイン + +{{< feature-state for_k8s_version="v1.16" state="alpha" >}} + +{{< glossary_tooltip text="CSI" term_id="csi" >}}プラグインに関連付けられたコードは、通常、コンテナイメージとして配布され、DaemonSetやStatefulSetなどの標準のKubernetesコンポーネントを使用してデプロイされるout-of-treeのスクリプトおよびバイナリとして出荷されます。CSIプラグインは、ボリュームのプロビジョニング/プロビジョニング解除/サイズ変更、Kubernetesノードへのボリュームのアタッチ/ボリュームからのデタッチ、Pod内の個々のコンテナへのボリュームのマウント/マウント解除、バックアップ/スナップショットとクローニングを使用した永続データのバックアップ/リストアといった、Kubernetesの幅広いボリューム管理アクションを処理します。CSIプラグインは通常、ノードプラグイン(各ノードでDaemonSetとして実行される)とコントローラープラグインで構成されます。 + +CSIノードプラグイン(特に、ブロックデバイスまたは共有ファイルシステムとして公開された永続ボリュームに関連付けられているプラ​​グイン)は、ディスクデバイスのスキャン、ファイルシステムのマウントなど、さまざまな特権操作を実行する必要があります。これらの操作は、ホストオペレーティングシステムごとに異なります。Linuxワーカーノードの場合、コンテナ化されたCSIノードプラグインは通常、特権コンテナとしてデプロイされます。Windowsワーカーノードの場合、コンテナ化されたCSIノードプラグインの特権操作は、[csi-proxy](https://github.com/kubernetes-csi/csi-proxy)を使用してサポートされます。各Windowsノードにプリインストールされている。詳細については、展開するCSIプラグインの展開ガイドを参照してください。 + +#### ネットワーキング + +Windowsコンテナのネットワークは、[CNIプラグイン](/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/)を通じて公開されます。Windowsコンテナは、ネットワークに関して仮想マシンと同様に機能します。各コンテナには、Hyper-V仮想スイッチ(vSwitch)に接続されている仮想ネットワークアダプター(vNIC)があります。Host Network Service(HNS)とHost Compute Service(HCS)は連携してコンテナを作成し、コンテナvNICをネットワークに接続します。HCSはコンテナの管理を担当するのに対し、HNSは次のようなネットワークリソースの管理を担当します。: + +* 仮想ネットワーク(vSwitchの作成を含む) +* エンドポイント/vNIC +* 名前空間 +* ポリシー(パケットのカプセル化、負荷分散ルール、ACL、NATルールなど) + +次のServiceタイプがサポートされています。: * NodePort * ClusterIP * LoadBalancer * ExternalName -Windows supports five different networking drivers/modes: L2bridge, L2tunnel, Overlay, Transparent, and NAT. In a heterogeneous cluster with Windows and Linux worker nodes, you need to select a networking solution that is compatible on both Windows and Linux. The following out-of-tree plugins are supported on Windows, with recommendations on when to use each CNI: +Windowsは、L2bridge、L2tunnel、Overlay、Transparent、NATの5つの異なるネットワークドライバー/モードをサポートしています。WindowsとLinuxのワーカーノードを持つ異種クラスターでは、WindowsとLinuxの両方で互換性のあるネットワークソリューションを選択する必要があります。以下のツリー外プラグインがWindowsでサポートされており、各CNIをいつ使用するかに関する推奨事項があります。: -| Network Driver | Description | Container Packet Modifications | Network Plugins | Network Plugin Characteristics | +| ネットワークドライバー | 説明 | コンテナパケットの変更 | ネットワークプラグイン | ネットワークプラグインの特性 | | -------------- | ----------- | ------------------------------ | --------------- | ------------------------------ | -| L2bridge | Containers are attached to an external vSwitch. Containers are attached to the underlay network, although the physical network doesn't need to learn the container MACs because they are rewritten on ingress/egress. Inter-container traffic is bridged inside the container host. | MAC is rewritten to host MAC, IP remains the same. | [win-bridge](https://github.com/containernetworking/plugins/tree/master/plugins/main/windows/win-bridge), [Azure-CNI](https://github.com/Azure/azure-container-networking/blob/master/docs/cni.md), Flannel host-gateway uses win-bridge | win-bridge uses L2bridge network mode, connects containers to the underlay of hosts, offering best performance. Requires L2 adjacency between container hosts | -| L2Tunnel | This is a special case of l2bridge, but only used on Azure. All packets are sent to the virtualization host where SDN policy is applied. | MAC rewritten, IP visible on the underlay network | [Azure-CNI](https://github.com/Azure/azure-container-networking/blob/master/docs/cni.md) | Azure-CNI allows integration of containers with Azure vNET, and allows them to leverage the set of capabilities that [Azure Virtual Network provides](https://azure.microsoft.com/en-us/services/virtual-network/). For example, securely connect to Azure services or use Azure NSGs. See [azure-cni for some examples](https://docs.microsoft.com/en-us/azure/aks/concepts-network#azure-cni-advanced-networking) | -| Overlay (Overlay networking for Windows in Kubernetes is in *alpha* stage) | Containers are given a vNIC connected to an external vSwitch. Each overlay network gets its own IP subnet, defined by a custom IP prefix.The overlay network driver uses VXLAN encapsulation. | Encapsulated with an outer header, inner packet remains the same. | [Win-overlay](https://github.com/containernetworking/plugins/tree/master/plugins/main/windows/win-overlay), Flannel VXLAN (uses win-overlay) | win-overlay should be used when virtual container networks are desired to be isolated from underlay of hosts (e.g. for security reasons). Allows for IPs to be re-used for different overlay networks (which have different VNID tags) if you are restricted on IPs in your datacenter. This option may be used when the container hosts are not L2 adjacent but have L3 connectivity | -| Transparent (special use case for [ovn-kubernetes](https://github.com/openvswitch/ovn-kubernetes)) | Requires an external vSwitch. Containers are attached to an external vSwitch which enables intra-pod communication via logical networks (logical switches and routers). | Packet is encapsulated either via [GENEVE](https://datatracker.ietf.org/doc/draft-gross-geneve/) or [STT](https://datatracker.ietf.org/doc/draft-davie-stt/) tunneling to reach pods which are not on the same host.
Packets are forwarded or dropped via the tunnel metadata information supplied by the ovn network controller.
NAT is done for north-south communication. | [ovn-kubernetes](https://github.com/openvswitch/ovn-kubernetes) | [Deploy via ansible](https://github.com/openvswitch/ovn-kubernetes/tree/master/contrib). Distributed ACLs can be applied via Kubernetes policies. IPAM support. Load-balancing can be achieved without kube-proxy. NATing is done without using iptables/netsh. | -| NAT (*not used in Kubernetes*) | Containers are given a vNIC connected to an internal vSwitch. DNS/DHCP is provided using an internal component called [WinNAT](https://blogs.technet.microsoft.com/virtualization/2016/05/25/windows-nat-winnat-capabilities-and-limitations/) | MAC and IP is rewritten to host MAC/IP. | [nat](https://github.com/Microsoft/windows-container-networking/tree/master/plugins/nat) | Included here for completeness | +| L2bridge | コンテナは外部のvSwitchに接続されます。コンテナはアンダーレイネットワークに接続されますが、物理ネットワークはコンテナのMACを上り/下りで書き換えるため、MACを学習する必要はありません。コンテナ間トラフィックは、コンテナホスト内でブリッジされます。 | MACはホストのMACに書き換えられ、IPは変わりません。| [win-bridge](https://github.com/containernetworking/plugins/tree/master/plugins/main/windows/win-bridge)、[Azure-CNI](https://github.com/Azure/azure-container-networking/blob/master/docs/cni.md)、Flannelホストゲートウェイは、win-bridgeを使用します。 | win-bridgeはL2bridgeネットワークモードを使用して、コンテナをホストのアンダーレイに接続して、最高のパフォーマンスを提供します。ノード間接続にはユーザー定義ルート(UDR)が必要です。 | +| L2Tunnel | これはl2bridgeの特殊なケースですが、Azureでのみ使用されます。すべてのパケットは、SDNポリシーが適用されている仮想化ホストに送信されます。| MACが書き換えられ、IPがアンダーレイネットワークで表示されます。 | [Azure-CNI](https://github.com/Azure/azure-container-networking/blob/master/docs/cni.md) | Azure-CNIを使用すると、コンテナをAzure vNETと統合し、[Azure Virtual Networkが提供](https://azure.microsoft.com/en-us/services/virtual-network/)する一連の機能を活用できます。たとえば、Azureサービスに安全に接続するか、Azure NSGを使用します。[azure-cniのいくつかの例](https://docs.microsoft.com/en-us/azure/aks/concepts-network#azure-cni-advanced-networking)を参照してください。| +| オーバーレイ(KubernetesのWindows用のオーバーレイネットワークは *アルファ* 段階です) | コンテナには、外部のvSwitchに接続されたvNICが付与されます。各オーバーレイネットワークは、カスタムIPプレフィックスで定義された独自のIPサブネットを取得します。オーバーレイネットワークドライバーは、VXLANを使用してカプセル化します。 | 外部ヘッダーでカプセル化されます。 | [Win-overlay](https://github.com/containernetworking/plugins/tree/master/plugins/main/windows/win-overlay)、Flannel VXLAN (win-overlayを使用) | win-overlayは、仮想コンテナーネットワークをホストのアンダーレイから分離する必要がある場合に使用する必要があります(セキュリティ上の理由など)。データセンター内のIPが制限されている場合に、(異なるVNIDタグを持つ)異なるオーバーレイネットワークでIPを再利用できるようにします。このオプションには、Windows Server 2019で[KB4489899](https://support.microsoft.com/help/4489899)が必要です。| +| 透過的([ovn-kubernetes](https://github.com/openvswitch/ovn-kubernetes)の特別な使用例) | 外部のvSwitchが必要です。コンテナは外部のvSwitchに接続され、論理ネットワーク(論理スイッチおよびルーター)を介したPod内通信を可能にします。 | パケットは、[GENEVE](https://datatracker.ietf.org/doc/draft-gross-geneve/)または[STT](https://datatracker.ietf.org/doc/draft-davie-stt/)トンネリングを介してカプセル化され、同じホスト上にないポッドに到達します。パケットは、ovnネットワークコントローラーによって提供されるトンネルメタデータ情報を介して転送またはドロップされます。NATは南北通信のために行われます。 | [ovn-kubernetes](https://github.com/openvswitch/ovn-kubernetes) | [ansible経由でデプロイ](https://github.com/openvswitch/ovn-kubernetes/tree/master/contrib)します。分散ACLは、Kubernetesポリシーを介して適用できます。 IPAMをサポートします。負荷分散は、kube-proxyなしで実現できます。 NATは、ip​​tables/netshを使用せずに行われます。 | +| NAT(*Kubernetesでは使用されません*) | コンテナには、内部のvSwitchに接続されたvNICが付与されます。DNS/DHCPは、[WinNAT](https://blogs.technet.microsoft.com/virtualization/2016/05/25/windows-nat-winnat-capabilities-and-limitations/)と呼ばれる内部コンポーネントを使用して提供されます。 | MACおよびIPはホストMAC/IPに書き換えられます。 | [nat](https://github.com/Microsoft/windows-container-networking/tree/master/plugins/nat) | 完全を期すためにここに含まれています。 | -As outlined above, the [Flannel](https://github.com/coreos/flannel) CNI [meta plugin](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel) is also supported on [Windows](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel#windows-support-experimental) via the [VXLAN network backend](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#vxlan) (**alpha support** ; delegates to win-overlay) and [host-gateway network backend](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#host-gw) (stable support; delegates to win-bridge). This plugin supports delegating to one of the reference CNI plugins (win-overlay, win-bridge), to work in conjunction with Flannel daemon on Windows (Flanneld) for automatic node subnet lease assignment and HNS network creation. This plugin reads in its own configuration file (net-conf.json), and aggregates it with the environment variables from the FlannelD generated subnet.env file. It then delegates to one of the reference CNI plugins for network plumbing, and sends the correct configuration containing the node-assigned subnet to the IPAM plugin (e.g. host-local). +上で概説したように、[Flannel](https://github.com/coreos/flannel) CNI[メタプラグイン](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel)は、[VXLANネットワークバックエンド](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#vxlan)(**アルファサポート**、win-overlayへのデリゲート)および[ホストゲートウェイネットワークバックエンド](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#host-gw)(安定したサポート、win-bridgeへのデリゲート)を介して[Windows](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel#windows-support-experimental)でもサポートされます。このプラグインは、参照CNIプラグイン(win-overlay、win-bridge)の1つへの委任をサポートし、WindowsのFlannelデーモン(Flanneld)と連携して、ノードのサブネットリースの自動割り当てとHNSネットワークの作成を行います。このプラグインは、独自の構成ファイル(cni.conf)を読み取り、FlannelDで生成されたsubnet.envファイルからの環境変数と統合します。次に、ネットワークプラミング用の参照CNIプラグインの1つに委任し、ノード割り当てサブネットを含む正しい構成をIPAMプラグイン(ホストローカルなど)に送信します。 -For the node, pod, and service objects, the following network flows are supported for TCP/UDP traffic: +Node、Pod、およびServiceオブジェクトの場合、TCP/UDPトラフィックに対して次のネットワークフローがサポートされます。: * Pod -> Pod (IP) * Pod -> Pod (Name) * Pod -> Service (Cluster IP) -* Pod -> Service (PQDN, but only if there are no ".") +* Pod -> Service (PQDN、ただし、「.」がない場合のみ) * Pod -> Service (FQDN) * Pod -> External (IP) * Pod -> External (DNS) * Node -> Pod * Pod -> Node -The following IPAM options are supported on Windows: +Windowsでは、次のIPAMオプションがサポートされています。 -* [Host-local](https://github.com/containernetworking/plugins/tree/master/plugins/ipam/host-local) -* HNS IPAM (Inbox platform IPAM, this is a fallback when no IPAM is set) -* [Azure-vnet-ipam](https://github.com/Azure/azure-container-networking/blob/master/docs/ipam.md) (for azure-cni only) +* [ホストローカル](https://github.com/containernetworking/plugins/tree/master/plugins/ipam/host-local) +* HNS IPAM (受信トレイプラットフォームIPAM、これはIPAMが設定されていない場合のフォールバック) +* [Azure-vnet-ipam](https://github.com/Azure/azure-container-networking/blob/master/docs/ipam.md)(azure-cniのみ) -### Limitations +### 制限 -#### Control Plane +#### コントロールプレーン -Windows is only supported as a worker node in the Kubernetes architecture and component matrix. This means that a Kubernetes cluster must always include Linux master nodes, zero or more Linux worker nodes, and zero or more Windows worker nodes. +Windowsは、Kubernetesアーキテクチャとコンポーネントマトリックスのワーカーノードとしてのみサポートされています。つまり、Kubernetesクラスタには常にLinuxマスターノード、0以上のLinuxワーカーノード、0以上のWindowsワーカーノードが含まれている必要があります。 -#### Compute +#### コンピュート -##### Resource management and process isolation +##### リソース管理とプロセス分離 - Linux cgroups are used as a pod boundary for resource controls in Linux. Containers are created within that boundary for network, process and file system isolation. The cgroups APIs can be used to gather cpu/io/memory stats. In contrast, Windows uses a Job object per container with a system namespace filter to contain all processes in a container and provide logical isolation from the host. There is no way to run a Windows container without the namespace filtering in place. This means that system privileges cannot be asserted in the context of the host, and thus privileged containers are not available on Windows. Containers cannot assume an identity from the host because the Security Account Manager (SAM) is separate. +Linux cgroupsは、Linuxのリソースを制御するPodの境界として使用されます。コンテナは、ネットワーク、プロセス、およびファイルシステムを分離するのために、その境界内に作成されます。cgroups APIを使用して、cpu/io/memoryの統計を収集できます。対照的に、Windowsはシステムネームスペースフィルターを備えたコンテナごとのジョブオブジェクトを使用して、コンテナ内のすべてのプロセスを格納し、ホストからの論理的な分離を提供します。ネームスペースフィルタリングを行わずにWindowsコンテナを実行する方法はありません。これは、ホストの環境ではシステム特権を主張できないため、Windowsでは特権コンテナを使用できないことを意味します。セキュリティアカウントマネージャー(SAM)が独立しているため、コンテナはホストからIDを引き受けることができません。 -##### Operating System Restrictions +##### オペレーティングシステムの制限 -Windows has strict compatibility rules, where the host OS version must match the container base image OS version. Only Windows containers with a container operating system of Windows Server 2019 are supported. Hyper-V isolation of containers, enabling some backward compatibility of Windows container image versions, is planned for a future release. +Windowsには厳密な互換性ルールがあり、ホストOSのバージョンとコンテナのベースイメージOSのバージョンは、一致する必要があります。Windows Server 2019のコンテナオペレーティングシステムを備えたWindowsコンテナのみがサポートされます。Hyper-V分離のコンテナは、Windowsコンテナのイメージバージョンに下位互換性を持たせることは、将来のリリースで計画されています。 -##### Feature Restrictions +##### 機能制限 -* TerminationGracePeriod: not implemented -* Single file mapping: to be implemented with CRI-ContainerD -* Termination message: to be implemented with CRI-ContainerD -* Privileged Containers: not currently supported in Windows containers -* HugePages: not currently supported in Windows containers -* The existing node problem detector is Linux-only and requires privileged containers. In general, we don't expect this to be used on Windows because privileged containers are not supported -* Not all features of shared namespaces are supported (see API section for more details) +* TerminationGracePeriod:実装されていません +* 単一ファイルのマッピング:CRI-ContainerDで実装されます +* 終了メッセージ:CRI-ContainerDで実装されます +* 特権コンテナ:現在Windowsコンテナではサポートされていません +* HugePages:現在Windowsコンテナではサポートされていません +* 既存のノード問題を検出する機能はLinux専用であり、特権コンテナが必要です。一般的に、特権コンテナはサポートされていないため、これがWindowsで使用されることは想定していません。 +* ネームスペース共有については、すべての機能がサポートされているわけではありません(詳細については、APIセクションを参照してください) -##### Memory Reservations and Handling +##### メモリ予約と処理 -Windows does not have an out-of-memory process killer as Linux does. Windows always treats all user-mode memory allocations as virtual, and pagefiles are mandatory. The net effect is that Windows won't reach out of memory conditions the same way Linux does, and processes page to disk instead of being subject to out of memory (OOM) termination. If memory is over-provisioned and all physical memory is exhausted, then paging can slow down performance. +Windowsには、Linuxのようなメモリ不足のプロセスキラーはありません。Windowsは常に全ユーザーモードのメモリ割り当てを仮想として扱い、ページファイルは必須です。正味の効果は、WindowsはLinuxのようなメモリ不足の状態にはならず、メモリ不足(OOM)終了の影響を受ける代わりにページをディスクに処理します。メモリが過剰にプロビジョニングされ、物理メモリのすべてが使い果たされると、ページングによってパフォーマンスが低下する可能性があります。 -Keeping memory usage within reasonable bounds is possible with a two-step process. First, use the kubelet parameters `--kubelet-reserve` and/or `--system-reserve` to account for memory usage on the node (outside of containers). This reduces [NodeAllocatable](/ja/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable)). As you deploy workloads, use resource limits (must set only limits or limits must equal requests) on containers. This also subtracts from NodeAllocatable and prevents the scheduler from adding more pods once a node is full. +2ステップのプロセスで、メモリ使用量を妥当な範囲内に保つことが可能です。まず、kubeletパラメータ`--kubelet-reserve`や`--system-reserve`を使用して、ノード(コンテナ外)でのメモリ使用量を明確にします。これにより、[NodeAllocatable](/ja/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable))が削減されます。ワークロードをデプロイするときは、コンテナにリソース制限をかけます(制限のみを設定するか、制限が要求と等しくなければなりません)。これにより、NodeAllocatableも差し引かれ、ノードのリソースがフルな状態になるとSchedulerがPodを追加できなくなります。 -A best practice to avoid over-provisioning is to configure the kubelet with a system reserved memory of at least 2GB to account for Windows, Docker, and Kubernetes processes. +過剰なプロビジョニングを回避するためのベストプラクティスは、Windows、Docker、およびKubernetesのプロセスに対応するために、最低2GBのメモリを予約したシステムでkubeletを構成することです。 -The behavior of the flags behave differently as described below: +フラグの振舞いについては、次のような異なる動作をします。: -* `--kubelet-reserve`, `--system-reserve` , and `--eviction-hard` flags update Node Allocatable -* Eviction by using `--enforce-node-allocable` is not implemented -* Eviction by using `--eviction-hard` and `--eviction-soft` are not implemented -* MemoryPressure Condition is not implemented -* There are no OOM eviction actions taken by the kubelet -* Kubelet running on the windows node does not have memory restrictions. `--kubelet-reserve` and `--system-reserve` do not set limits on kubelet or processes running on the host. This means kubelet or a process on the host could cause memory resource starvation outside the node-allocatable and scheduler +* `--kubelet-reserve`、`--system-reserve`、および`--eviction-hard`フラグはノードの割り当て可能数を更新します +* `--enforce-node-allocable`を使用した排除は実装されていません +* `--eviction-hard`および`--eviction-soft`を使用した排除は実装されていません +* MemoryPressureの制約は実装されていません +* kubeletによって実行されるOOMを排除することはありません +* Windowsノードで実行されているKubeletにはメモリ制限がありません。`--kubelet-reserve`と`--system-reserve`は、ホストで実行されているkubeletまたはプロセスに制限を設定しません。これは、ホスト上のkubeletまたはプロセスが、NodeAllocatableとSchedulerの外でメモリリソース不足を引き起こす可能性があることを意味します。 -#### Storage +#### ストレージ -Windows has a layered filesystem driver to mount container layers and create a copy filesystem based on NTFS. All file paths in the container are resolved only within the context of that container. +Windowsには、コンテナレイヤーをマウントして、NTFSに基づいて複製されたファイルシステムを作るためのレイヤー構造のファイルシステムドライバーがあります。コンテナ内のすべてのファイルパスは、そのコンテナの環境内だけで決められます。 -* Volume mounts can only target a directory in the container, and not an individual file -* Volume mounts cannot project files or directories back to the host filesystem -* Read-only filesystems are not supported because write access is always required for the Windows registry and SAM database. However, read-only volumes are supported -* Volume user-masks and permissions are not available. Because the SAM is not shared between the host & container, there's no mapping between them. All permissions are resolved within the context of the container +* ボリュームマウントは、コンテナ内のディレクトリのみを対象にすることができ、個別のファイルは対象にできません +* ボリュームマウントは、ファイルまたはディレクトリをホストファイルシステムに投影することはできません +* WindowsレジストリとSAMデータベースには常に書き込みアクセスが必要であるため、読み取り専用ファイルシステムはサポートされていません。ただし、読み取り専用ボリュームはサポートされています +* ボリュームのユーザーマスクと権限は使用できません。SAMはホストとコンテナ間で共有されないため、それらの間のマッピングはありません。すべての権限はコンテナの環境内で決められます -As a result, the following storage functionality is not supported on Windows nodes +その結果、次のストレージ機能はWindowsノードではサポートされません。 -* Volume subpath mounts. Only the entire volume can be mounted in a Windows container. -* Subpath volume mounting for Secrets -* Host mount projection -* DefaultMode (due to UID/GID dependency) -* Read-only root filesystem. Mapped volumes still support readOnly -* Block device mapping -* Memory as the storage medium -* CSI plugins which require privileged containers -* File system features like uui/guid, per-user Linux filesystem permissions -* NFS based storage/volume support -* Expanding the mounted volume (resizefs) +* ボリュームサブパスのマウント。Windowsコンテナにマウントできるのはボリューム全体だけです。 +* シークレットのサブパスボリュームのマウント +* ホストマウントプロジェクション +* DefaultMode(UID/GID依存関係による) +* 読み取り専用のルートファイルシステム。マップされたボリュームは引き続き読み取り専用をサポートします +* ブロックデバイスマッピング +* 記憶媒体としてのメモリ +* uui/guid、ユーザーごとのLinuxファイルシステム権限などのファイルシステム機能 +* NFSベースのストレージ/ボリュームのサポート +* マウントされたボリュームの拡張(resizefs) -#### Networking +#### ネットワーキング -Windows Container Networking differs in some important ways from Linux networking. The [Microsoft documentation for Windows Container Networking](https://docs.microsoft.com/en-us/virtualization/windowscontainers/container-networking/architecture) contains additional details and background. +Windowsコンテナネットワーキングは、Linuxネットワーキングとはいくつかの重要な実装方法の違いがあります。[Microsoft documentation for Windows Container Networking](https://docs.microsoft.com/en-us/virtualization/windowscontainers/container-networking/architecture)には、追加の詳細と背景があります。 -The Windows host networking networking service and virtual switch implement namespacing and can create virtual NICs as needed for a pod or container. However, many configurations such as DNS, routes, and metrics are stored in the Windows registry database rather than /etc/... files as they are on Linux. The Windows registry for the container is separate from that of the host, so concepts like mapping /etc/resolv.conf from the host into a container don't have the same effect they would on Linux. These must be configured using Windows APIs run in the context of that container. Therefore CNI implementations need to call the HNS instead of relying on file mappings to pass network details into the pod or container. +Windowsホストネットワーキングサービスと仮想スイッチはネームスペースを実装して、Podまたはコンテナの必要に応じて仮想NICを作成できます。ただし、DNS、ルート、メトリックなどの多くの構成は、Linuxのような/etc/...ファイルではなく、Windowsレジストリデータベースに保存されます。コンテナのWindowsレジストリはホストのレジストリとは別であるため、ホストからコンテナへの/etc/resolv.confのマッピングなどの概念は、Linuxの場合と同じ効果をもたらしません。これらは、そのコンテナの環境で実行されるWindows APIを使用して構成する必要があります。したがって、CNIの実装は、ファイルマッピングに依存する代わりにHNSを呼び出して、ネットワークの詳細をPodまたはコンテナに渡す必要があります。 -The following networking functionality is not supported on Windows nodes +次のネットワーク機能はWindowsノードではサポートされていません -* Host networking mode is not available for Windows pods -* Local NodePort access from the node itself fails (works for other nodes or external clients) -* Accessing service VIPs from nodes will be available with a future release of Windows Server -* Overlay networking support in kube-proxy is an alpha release. In addition, it requires [KB4482887](https://support.microsoft.com/en-us/help/4482887/windows-10-update-kb4482887) to be installed on Windows Server 2019 -* Local Traffic Policy and DSR mode -* Windows containers connected to l2bridge, l2tunnel, or overlay networks do not support communicating over the IPv6 stack. There is outstanding Windows platform work required to enable these network drivers to consume IPv6 addresses and subsequent Kubernetes work in kubelet, kube-proxy, and CNI plugins. -* Outbound communication using the ICMP protocol via the win-overlay, win-bridge, and Azure-CNI plugin. Specifically, the Windows data plane ([VFP](https://www.microsoft.com/en-us/research/project/azure-virtual-filtering-platform/)) doesn't support ICMP packet transpositions. This means: - * ICMP packets directed to destinations within the same network (e.g. pod to pod communication via ping) work as expected and without any limitations - * TCP/UDP packets work as expected and without any limitations - * ICMP packets directed to pass through a remote network (e.g. pod to external internet communication via ping) cannot be transposed and thus will not be routed back to their source - * Since TCP/UDP packets can still be transposed, one can substitute `ping ` with `curl ` to be able to debug connectivity to the outside world. +* ホストネットワーキングモードはWindows Podでは使用できません +* ノード自体からのローカルNodePortアクセスは失敗します(他のノードまたは外部クライアントで機能) +* ノードからのService VIPへのアクセスは、Windows Serverの将来のリリースで利用可能になる予定です +* kube-proxyのオーバーレイネットワーキングサポートはアルファリリースです。さらに、[KB4482887](https://support.microsoft.com/en-us/help/4482887/windows-10-update-kb4482887)がWindows Server 2019にインストールされている必要があります +* ローカルトラフィックポリシーとDSRモード +* l2bridge、l2tunnel、またはオーバーレイネットワークに接続されたWindowsコンテナは、IPv6スタックを介した通信をサポートしていません。これらのネットワークドライバーがIPv6アドレスを使用できるようにするために必要な機能として、優れたWindowsプラットフォームの機能があり、それに続いて、kubelet、kube-proxy、およびCNIプラグインといったKubernetesの機能があります。 +* win-overlay、win-bridge、およびAzure-CNIプラグインを介したICMPプロトコルを使用したアウトバウンド通信。具体的には、Windowsデータプレーン([VFP](https://www.microsoft.com/en-us/research/project/azure-virtual-filtering-platform/))は、ICMPパケットの置き換えをサポートしていません。これの意味は: + * 同じネットワーク内の宛先に向けられたICMPパケット(pingを介したPod間通信など)は期待どおりに機能し、制限はありません + * TCP/UDPパケットは期待どおりに機能し、制限はありません + * リモートネットワーク(Podからping経由の外部インターネット通信など)を通過するように指示されたICMPパケットは置き換えできないため、ソースにルーティングされません。 + * TCP/UDPパケットは引き続き置き換えできるため、`ping `を`curl `に置き換えることで、外部への接続をデバッグできます。 -These features were added in Kubernetes v1.15: +これらの機能はKubernetes v1.15で追加されました。 * `kubectl port-forward` -##### CNI Plugins +##### CNIプラグイン -* Windows reference network plugins win-bridge and win-overlay do not currently implement [CNI spec](https://github.com/containernetworking/cni/blob/master/SPEC.md) v0.4.0 due to missing "CHECK" implementation. -* The Flannel VXLAN CNI has the following limitations on Windows: +* Windowsリファレンスネットワークプラグインのwin-bridgeとwin-overlayは、[CNI仕様](https://github.com/containernetworking/cni/blob/master/SPEC.md)v0.4.0において「CHECK」実装がないため、今のところ実装されていません。 +* Flannel VXLAN CNIについては、Windowsで次の制限があります。: -1. Node-pod connectivity isn't possible by design. It's only possible for local pods with Flannel [PR 1096](https://github.com/coreos/flannel/pull/1096) -2. We are restricted to using VNI 4096 and UDP port 4789. The VNI limitation is being worked on and will be overcome in a future release (open-source flannel changes). See the official [Flannel VXLAN](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#vxlan) backend docs for more details on these parameters. +1. Node-podの直接間接続は設計上不可能です。Flannel[PR 1096](https://github.com/coreos/flannel/pull/1096)を使用するローカルPodでのみ可能です +2. VNI 4096とUDPポート4789の使用に制限されています。VNIの制限は現在取り組んでおり、将来のリリースで解決される予定です(オープンソースのflannelの変更)。これらのパラメーターの詳細については、公式の[Flannel VXLAN](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#vxlan)バックエンドのドキュメントをご覧ください。 ##### DNS {#dns-limitations} -* ClusterFirstWithHostNet is not supported for DNS. Windows treats all names with a '.' as a FQDN and skips PQDN resolution -* On Linux, you have a DNS suffix list, which is used when trying to resolve PQDNs. On Windows, we only have 1 DNS suffix, which is the DNS suffix associated with that pod's namespace (mydns.svc.cluster.local for example). Windows can resolve FQDNs and services or names resolvable with just that suffix. For example, a pod spawned in the default namespace, will have the DNS suffix **default.svc.cluster.local**. On a Windows pod, you can resolve both **kubernetes.default.svc.cluster.local** and **kubernetes**, but not the in-betweens, like **kubernetes.default** or **kubernetes.default.svc**. +* ClusterFirstWithHostNetは、DNSでサポートされていません。Windowsでは、FQDNとしてすべての名前を「.」で扱い、PQDNでの名前解決はスキップします。 +* Linuxでは、PQDNで名前解決しようとするときに使用するDNSサフィックスリストがあります。Windowsでは、1つのDNSサフィックスしかありません。これは、そのPodのNamespaceに関連付けられているDNSサフィックスです(たとえば、mydns.svc.cluster.local)。Windowsでは、そのサフィックスだけで名前解決可能なFQDNおよびServiceまたはNameでの名前解決ができます。たとえば、defaultのNamespaceで生成されたPodには、DNSサフィックス**default.svc.cluster.local**が付けられます。WindowsのPodでは、**kubernetes.default.svc.cluster.local**と**kubernetes**の両方を名前解決できますが、**kubernetes.default**や**kubernetes.default.svc**のような中間での名前解決はできません。 +* Windowsでは、複数のDNSリゾルバーを使用できます。これらには少し異なる動作が付属しているため、ネームクエリの解決には`Resolve-DNSName`ユーティリティを使用することをお勧めします。 -##### Security +##### セキュリティ -Secrets are written in clear text on the node's volume (as compared to tmpfs/in-memory on linux). This means customers have to do two things +Secretはノードのボリュームに平文テキストで書き込まれます(Linuxのtmpfs/in-memoryの比較として)。これはカスタマーが2つのことを行う必要があります -1. Use file ACLs to secure the secrets file location -2. Use volume-level encryption using [BitLocker](https://docs.microsoft.com/en-us/windows/security/information-protection/bitlocker/bitlocker-how-to-deploy-on-windows-server) +1. ファイルACLを使用してSecretファイルの場所を保護する +2. [BitLocker](https://docs.microsoft.com/en-us/windows/security/information-protection/bitlocker/bitlocker-how-to-deploy-on-windows-server)を使って、ボリュームレベルの暗号化を使用する -[RunAsUser ](/ja/docs/concepts/policy/pod-security-policy/#users-and-groups)is not currently supported on Windows. The workaround is to create local accounts before packaging the container. The RunAsUsername capability may be added in a future release. +[RunAsUser](/docs/concepts/policy/pod-security-policy/#users-and-groups)は、現在Windowsではサポートされていません。回避策は、コンテナをパッケージ化する前にローカルアカウントを作成することです。RunAsUsername機能は、将来のリリースで追加される可能性があります。 -Linux specific pod security context privileges such as SELinux, AppArmor, Seccomp, Capabilities (POSIX Capabilities), and others are not supported. +SELinux、AppArmor、Seccomp、特性(POSIX機能)のような、Linux固有のPodセキュリティ環境の権限はサポートされていません。 -In addition, as mentioned already, privileged containers are not supported on Windows. +さらに、既に述べたように特権付きコンテナは、Windowsにおいてサポートされていません。 #### API -There are no differences in how most of the Kubernetes APIs work for Windows. The subtleties around what's different come down to differences in the OS and container runtime. In certain situations, some properties on workload APIs such as Pod or Container were designed with an assumption that they are implemented on Linux, failing to run on Windows. +ほとんどのKubernetes APIがWindowsでも機能することに違いはありません。そのわずかな違いはOSとコンテナランタイムの違いによるものです。特定の状況では、PodやコンテナなどのワークロードAPIの一部のプロパティが、Linuxで実装されているが、Windowsでは実行できないことを前提に設計されています。 -At a high level, these OS concepts are different: +高いレベルで、これらOSのコンセプトに違いがります。: -* Identity - Linux uses userID (UID) and groupID (GID) which are represented as integer types. User and group names are not canonical - they are just an alias in `/etc/groups` or `/etc/passwd` back to UID+GID. Windows uses a larger binary security identifier (SID) which is stored in the Windows Security Access Manager (SAM) database. This database is not shared between the host and containers, or between containers. -* File permissions - Windows uses an access control list based on SIDs, rather than a bitmask of permissions and UID+GID -* File paths - convention on Windows is to use `\` instead of `/`. The Go IO libraries typically accept both and just make it work, but when you're setting a path or command line that's interpreted inside a container, `\` may be needed. -* Signals - Windows interactive apps handle termination differently, and can implement one or more of these: - * A UI thread handles well-defined messages including WM_CLOSE - * Console apps handle ctrl-c or ctrl-break using a Control Handler - * Services register a Service Control Handler function that can accept SERVICE_CONTROL_STOP control codes +* ID - Linuxでは、Integer型として表されるuserID(UID)とgroupID(GID)を使用します。ユーザー名とグループ名は正規ではありません - それらは、UID+GIDの背後にある`/etc/groups`または`/etc/passwd`の単なるエイリアスです。Windowsは、Windows Security Access Manager(SAM)データベースに格納されているより大きなバイナリセキュリティ識別子(SID)を使用します。このデータベースは、ホストとコンテナ間、またはコンテナ間で共有されません。 +* ファイル権限 - Windowsは、権限とUID+GIDのビットマスクではなく、SIDに基づくアクセス制御リストを使用します +* ファイルパス - Windowsの規則では、`/`ではなく`\`を使用します。Go IOライブラリは通常両方を受け入れ、それを機能させるだけですが、コンテナ内で解釈されるパスまたはコマンドラインを設定する場合、`\`が必要になる場合があります。 +* シグナル - Windowsのインタラクティブなアプリは終了を異なる方法で処理し、次の1つ以上を実装できます。: + * UIスレッドは、WM_CLOSEを含む明確に定義されたメッセージを処理します + * コンソールアプリは、コントロールハンドラーを使用してctrl-cまたはctrl-breakを処理します + * サービスは、SERVICE_CONTROL_STOP制御コードを受け入れることができるサービスコントロールハンドラー関数を登録します。 -Exit Codes follow the same convention where 0 is success, nonzero is failure. The specific error codes may differ across Windows and Linux. However, exit codes passed from the Kubernetes components (kubelet, kube-proxy) are unchanged. +終了コードは、0が成功、0以外が失敗の場合と同じ規則に従います。特定のエラーコードは、WindowsとLinuxで異なる場合があります。ただし、Kubernetesのコンポーネント(kubelet、kube-proxy)から渡される終了コードは変更されていません。 ##### V1.Container -* V1.Container.ResourceRequirements.limits.cpu and V1.Container.ResourceRequirements.limits.memory - Windows doesn't use hard limits for CPU allocations. Instead, a share system is used. The existing fields based on millicores are scaled into relative shares that are followed by the Windows scheduler. [see: kuberuntime/helpers_windows.go](https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/kuberuntime/helpers_windows.go), [see: resource controls in Microsoft docs](https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/resource-controls) - * Huge pages are not implemented in the Windows container runtime, and are not available. They require [asserting a user privilege](https://docs.microsoft.com/en-us/windows/desktop/Memory/large-page-support) that's not configurable for containers. -* V1.Container.ResourceRequirements.requests.cpu and V1.Container.ResourceRequirements.requests.memory - Requests are subtracted from node available resources, so they can be used to avoid overprovisioning a node. However, they cannot be used to guarantee resources in an overprovisioned node. They should be applied to all containers as a best practice if the operator wants to avoid overprovisioning entirely. -* V1.Container.SecurityContext.allowPrivilegeEscalation - not possible on Windows, none of the capabilities are hooked up -* V1.Container.SecurityContext.Capabilities - POSIX capabilities are not implemented on Windows -* V1.Container.SecurityContext.privileged - Windows doesn't support privileged containers -* V1.Container.SecurityContext.procMount - Windows doesn't have a /proc filesystem -* V1.Container.SecurityContext.readOnlyRootFilesystem - not possible on Windows, write access is required for registry & system processes to run inside the container -* V1.Container.SecurityContext.runAsGroup - not possible on Windows, no GID support -* V1.Container.SecurityContext.runAsNonRoot - Windows does not have a root user. The closest equivalent is ContainerAdministrator which is an identity that doesn't exist on the node. -* V1.Container.SecurityContext.runAsUser - not possible on Windows, no UID support as int. -* V1.Container.SecurityContext.seLinuxOptions - not possible on Windows, no SELinux -* V1.Container.terminationMessagePath - this has some limitations in that Windows doesn't support mapping single files. The default value is /dev/termination-log, which does work because it does not exist on Windows by default. +* V1.Container.ResourceRequirements.limits.cpuおよびV1.Container.ResourceRequirements.limits.memory - Windowsは、CPU割り当てにハード制限を使用しません。代わりに、共有システムが使用されます。ミリコアに基づく既存のフィールドは、Windowsスケジューラーによって追従される相対共有にスケーリングされます。[参照: kuberuntime/helpers_windows.go](https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/kuberuntime/helpers_windows.go)、[参照: resource controls in Microsoft docs](https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/resource-controls) + * Huge Pagesは、Windowsコンテナランタイムには実装されてないので、使用できません。コンテナに対して設定できない[ユーザー特権を主張](https://docs.microsoft.com/en-us/windows/desktop/Memory/large-page-support)する必要があります。 +* V1.Container.ResourceRequirements.requests.cpuおよびV1.Container.ResourceRequirements.requests.memory - リクエストはノードの利用可能なリソースから差し引かれるので、ノードのオーバープロビジョニングを回避するために使用できます。ただし、過剰にプロビジョニングされたノードのリソースを保証するために使用することはできません。オペレーターが完全にプロビジョニングし過ぎないようにする場合は、ベストプラクティスとしてこれらをすべてのコンテナに適用する必要があります。 +* V1.Container.SecurityContext.allowPrivilegeEscalation - Windowsでは使用できません、接続されている機能はありません +* V1.Container.SecurityContext.Capabilities - POSIX機能はWindowsでは実装されていません +* V1.Container.SecurityContext.privileged - Windowsでは特権コンテナをサポートしていません +* V1.Container.SecurityContext.procMount - Windowsでは/procファイルシステムがありません +* V1.Container.SecurityContext.readOnlyRootFilesystem - Windowsでは使用できません、レジストリおよびシステムプロセスがコンテナ内で実行するには、書き込みアクセスが必要です +* V1.Container.SecurityContext.runAsGroup - Windowsでは使用できません、GIDのサポートもありません +* V1.Container.SecurityContext.runAsNonRoot - Windowsではrootユーザーが存在しません。最も近いものは、ノードに存在しないIDであるContainerAdministratorです。 +* V1.Container.SecurityContext.runAsUser - Windowsでは使用できません。intとしてのUIDはサポートされていません。 +* V1.Container.SecurityContext.seLinuxOptions - Windowsでは使用できません、SELinuxがありません +* V1.Container.terminationMessagePath - これは、Windowsが単一ファイルのマッピングをサポートしないという点でいくつかの制限があります。デフォルト値は/dev/termination-logであり、デフォルトではWindowsに存在しないため動作します。 ##### V1.Pod -* V1.Pod.hostIPC, v1.pod.hostpid - host namespace sharing is not possible on Windows -* V1.Pod.hostNetwork - There is no Windows OS support to share the host network -* V1.Pod.dnsPolicy - ClusterFirstWithHostNet - is not supported because Host Networking is not supported on Windows. -* V1.Pod.podSecurityContext - see V1.PodSecurityContext below -* V1.Pod.shareProcessNamespace - this is a beta feature, and depends on Linux namespaces which are not implemented on Windows. Windows cannot share process namespaces or the container's root filesystem. Only the network can be shared. -* V1.Pod.terminationGracePeriodSeconds - this is not fully implemented in Docker on Windows, see: [reference](https://github.com/moby/moby/issues/25982). The behavior today is that the ENTRYPOINT process is sent CTRL_SHUTDOWN_EVENT, then Windows waits 5 seconds by default, and finally shuts down all processes using the normal Windows shutdown behavior. The 5 second default is actually in the Windows registry [inside the container](https://github.com/moby/moby/issues/25982#issuecomment-426441183), so it can be overridden when the container is built. -* V1.Pod.volumeDevices - this is a beta feature, and is not implemented on Windows. Windows cannot attach raw block devices to pods. -* V1.Pod.volumes - EmptyDir, Secret, ConfigMap, HostPath - all work and have tests in TestGrid - * V1.emptyDirVolumeSource - the Node default medium is disk on Windows. Memory is not supported, as Windows does not have a built-in RAM disk. -* V1.VolumeMount.mountPropagation - mount propagation is not supported on Windows. +* V1.Pod.hostIPC、v1.pod.hostpid - Windowsではホストのネームスペースを共有することはできません +* V1.Pod.hostNetwork - ホストのネットワークを共有するためのWindows OSサポートはありません +* V1.Pod.dnsPolicy - ClusterFirstWithHostNet - Windowsではホストネットワーキングがサポートされていないため、サポートされていません。 +* V1.Pod.podSecurityContext - 以下のV1.PodSecurityContextを参照 +* V1.Pod.shareProcessNamespace - これはベータ版の機能であり、Windowsに実装されていないLinuxのNamespace機能に依存しています。Windowsでは、プロセスのネームスペースまたはコンテナのルートファイルシステムを共有できません。共有できるのはネットワークだけです。 +* V1.Pod.terminationGracePeriodSeconds - これはWindowsのDockerに完全には実装されていません。[リファレンス](https://github.com/moby/moby/issues/25982)を参照してください。今日の動作では、ENTRYPOINTプロセスにCTRL_SHUTDOWN_EVENTが送信され、Windowsではデフォルトで5秒待機し、最後に通常のWindowsシャットダウン動作を使用してすべてのプロセスをシャットダウンします。5秒のデフォルトは、実際にはWindowsレジストリー[コンテナ内](https://github.com/moby/moby/issues/25982#issuecomment-426441183)にあるため、コンテナ作成時にオーバーライドできます。 +* V1.Pod.volumeDevices - これはベータ機能であり、Windowsには実装されていません。Windowsでは、rawブロックデバイスをPodに接続できません。 +* V1.Pod.volumes-EmptyDir、Secret、ConfigMap、HostPath - すべて動作し、TestGridにテストがあります + * V1.emptyDirVolumeSource - ノードのデフォルトのメディアはWindowsのディスクです。Windowsでは、RAMディスクが組み込まれていないため、メモリはサポートされていません。 +* V1.VolumeMount.mountPropagation - mount propagationは、Windowsではサポートされていません。 ##### V1.PodSecurityContext -None of the PodSecurityContext fields work on Windows. They're listed here for reference. +Windowsでは、PodSecurityContextフィールドはどれも機能しません。これらは参照用にここにリストされています。 -* V1.PodSecurityContext.SELinuxOptions - SELinux is not available on Windows -* V1.PodSecurityContext.RunAsUser - provides a UID, not available on Windows -* V1.PodSecurityContext.RunAsGroup - provides a GID, not available on Windows -* V1.PodSecurityContext.RunAsNonRoot - Windows does not have a root user. The closest equivalent is ContainerAdministrator which is an identity that doesn't exist on the node. -* V1.PodSecurityContext.SupplementalGroups - provides GID, not available on Windows -* V1.PodSecurityContext.Sysctls - these are part of the Linux sysctl interface. There's no equivalent on Windows. +* V1.PodSecurityContext.SELinuxOptions - SELinuxは、Windowsでは使用できません +* V1.PodSecurityContext.RunAsUser - UIDを提供しますが、Windowsでは使用できません +* V1.PodSecurityContext.RunAsGroup - GIDを提供しますが、Windowsでは使用できません +* V1.PodSecurityContext.RunAsNonRoot - Windowsにはrootユーザーがありません。最も近いものは、ノードに存在しないIDであるContainerAdministratorです。 +* V1.PodSecurityContext.SupplementalGroups - GIDを提供しますが、Windowsでは使用できません +* V1.PodSecurityContext.Sysctls - これらはLinuxのsysctlインターフェースの一部です。Windowsには同等のものはありません。 -## Getting Help and Troubleshooting {#troubleshooting} +## ヘルプとトラブルシューティングを学ぶ {#troubleshooting} -Your main source of help for troubleshooting your Kubernetes cluster should start with this [section](/ja/docs/tasks/debug-application-cluster/troubleshooting/). Some additional, Windows-specific troubleshooting help is included in this section. Logs are an important element of troubleshooting issues in Kubernetes. Make sure to include them any time you seek troubleshooting assistance from other contributors. Follow the instructions in the SIG-Windows [contributing guide on gathering logs](https://github.com/kubernetes/community/blob/master/sig-windows/CONTRIBUTING.md#gathering-logs). +Kubernetesクラスターのトラブルシューティングの主なヘルプソースは、この[セクション](/docs/tasks/debug-application-cluster/troubleshooting/)から始める必要があります。このセクションには、いくつか追加的な、Windows固有のトラブルシューティングヘルプが含まれています。ログは、Kubernetesにおけるトラブルシューティング問題の重要な要素です。他のコントリビューターからトラブルシューティングの支援を求めるときは、必ずそれらを含めてください。SIG-Windows[ログ収集に関するコントリビュートガイド](https://github.com/kubernetes/community/blob/master/sig-windows/CONTRIBUTING.md#gathering-logs)の指示に従ってください。 -1. How do I know start.ps1 completed successfully? +1. start.ps1が正常に完了したことをどのように確認できますか? - You should see kubelet, kube-proxy, and (if you chose Flannel as your networking solution) flanneld host-agent processes running on your node, with running logs being displayed in separate PowerShell windows. In addition to this, your Windows node should be listed as "Ready" in your Kubernetes cluster. + ノード上でkubelet、kube-proxy、および(ネットワーキングソリューションとしてFlannelを選択した場合)flanneldホストエージェントプロセスが実行され、実行ログが個別のPowerShellウィンドウに表示されます。これに加えて、WindowsノードがKubernetesクラスターで「Ready」として表示されているはずです。 -1. Can I configure the Kubernetes node processes to run in the background as services? +1. Kubernetesノードのプロセスをサービスとしてバックグラウンドで実行するように構成できますか? - Kubelet and kube-proxy are already configured to run as native Windows Services, offering resiliency by re-starting the services automatically in the event of failure (for example a process crash). You have two options for configuring these node components as services. + Kubeletとkube-proxyは、ネイティブのWindowsサービスとして実行するように既に構成されています、障害(例えば、プロセスのクラッシュ)が発生した場合にサービスを自動的に再起動することにより、復元性を提供します。これらのノードコンポーネントをサービスとして構成するには、2つのオプションがあります。 - 1. As native Windows Services + 1. ネイティブWindowsサービスとして - Kubelet & kube-proxy can be run as native Windows Services using `sc.exe`. + Kubeletとkube-proxyは、`sc.exe`を使用してネイティブのWindowsサービスとして実行できます。 ```powershell - # Create the services for kubelet and kube-proxy in two separate commands + # 2つの個別のコマンドでkubeletおよびkube-proxyのサービスを作成する sc.exe create binPath= " --service " - # Please note that if the arguments contain spaces, they must be escaped. + # 引数にスペースが含まれている場合は、エスケープする必要があることに注意してください。 sc.exe create kubelet binPath= "C:\kubelet.exe --service --hostname-override 'minion' " - # Start the services + # サービスを開始する Start-Service kubelet Start-Service kube-proxy - # Stop the service + # サービスを停止する Stop-Service kubelet (-Force) Stop-Service kube-proxy (-Force) - # Query the service status + # サービスの状態を問い合わせる Get-Service kubelet Get-Service kube-proxy ``` - 1. Using nssm.exe + 1. nssm.exeの使用 - You can also always use alternative service managers like [nssm.exe](https://nssm.cc/) to run these processes (flanneld, kubelet & kube-proxy) in the background for you. You can use this [sample script](https://github.com/Microsoft/SDN/tree/master/Kubernetes/flannel/register-svc.ps1), leveraging nssm.exe to register kubelet, kube-proxy, and flanneld.exe to run as Windows services in the background. + また、[nssm.exe](https://nssm.cc/)などの代替サービスマネージャーを使用して、これらのプロセス(flanneld、kubelet、kube-proxy)をバックグラウンドで実行することもできます。この[サンプルスクリプト](https://github.com/Microsoft/SDN/tree/master/Kubernetes/flannel/register-svc.ps1)を使用すると、nssm.exeを利用してkubelet、kube-proxy、flanneld.exeを登録し、Windowsサービスとしてバックグラウンドで実行できます。 ```powershell register-svc.ps1 -NetworkMode -ManagementIP -ClusterCIDR -KubeDnsServiceIP -LogDir - # NetworkMode = The network mode l2bridge (flannel host-gw, also the default value) or overlay (flannel vxlan) chosen as a network solution - # ManagementIP = The IP address assigned to the Windows node. You can use ipconfig to find this - # ClusterCIDR = The cluster subnet range. (Default value 10.244.0.0/16) - # KubeDnsServiceIP = The Kubernetes DNS service IP (Default value 10.96.0.10) - # LogDir = The directory where kubelet and kube-proxy logs are redirected into their respective output files (Default value C:\k) + # NetworkMode = ネットワークソリューションとして選択されたネットワークモードl2bridge(flannel host-gw、これもデフォルト値)またはoverlay(flannel vxlan) + # ManagementIP = Windowsノードに割り当てられたIPアドレス。 ipconfigを使用してこれを見つけることができます + # ClusterCIDR = クラスターのサブネット範囲。(デフォルト値 10.244.0.0/16) + # KubeDnsServiceIP = Kubernetes DNSサービスIP(デフォルト値 10.96.0.10) + # LogDir = kubeletおよびkube-proxyログがそれぞれの出力ファイルにリダイレクトされるディレクトリ(デフォルト値 C:\k) ``` - If the above referenced script is not suitable, you can manually configure nssm.exe using the following examples. + 上記のスクリプトが適切でない場合は、次の例を使用してnssm.exeを手動で構成できます。 ```powershell - # Register flanneld.exe + # flanneld.exeを登録する nssm install flanneld C:\flannel\flanneld.exe nssm set flanneld AppParameters --kubeconfig-file=c:\k\config --iface= --ip-masq=1 --kube-subnet-mgr=1 nssm set flanneld AppEnvironmentExtra NODE_NAME= nssm set flanneld AppDirectory C:\flannel nssm start flanneld - # Register kubelet.exe - # Microsoft releases the pause infrastructure container at mcr.microsoft.com/k8s/core/pause:1.2.0 - # For more info search for "pause" in the "Guide for adding Windows Nodes in Kubernetes" + # kubelet.exeを登録 + # マイクロソフトは、mcr.microsoft.com/k8s/core/pause:1.2.0としてポーズインフラストラクチャコンテナをリリース + # 詳細については、「KubernetesにWindowsノードを追加するためのガイド」で「pause」を検索してください nssm install kubelet C:\k\kubelet.exe nssm set kubelet AppParameters --hostname-override= --v=6 --pod-infra-container-image=mcr.microsoft.com/k8s/core/pause:1.2.0 --resolv-conf="" --allow-privileged=true --enable-debugging-handlers --cluster-dns= --cluster-domain=cluster.local --kubeconfig=c:\k\config --hairpin-mode=promiscuous-bridge --image-pull-progress-deadline=20m --cgroups-per-qos=false --log-dir= --logtostderr=false --enforce-node-allocatable="" --network-plugin=cni --cni-bin-dir=c:\k\cni --cni-conf-dir=c:\k\cni\config nssm set kubelet AppDirectory C:\k nssm start kubelet - # Register kube-proxy.exe (l2bridge / host-gw) + # kube-proxy.exeを登録する (l2bridge / host-gw) nssm install kube-proxy C:\k\kube-proxy.exe nssm set kube-proxy AppDirectory c:\k nssm set kube-proxy AppParameters --v=4 --proxy-mode=kernelspace --hostname-override=--kubeconfig=c:\k\config --enable-dsr=false --log-dir= --logtostderr=false @@ -401,7 +418,7 @@ Your main source of help for troubleshooting your Kubernetes cluster should star nssm set kube-proxy DependOnService kubelet nssm start kube-proxy - # Register kube-proxy.exe (overlay / vxlan) + # kube-proxy.exeを登録する (overlay / vxlan) nssm install kube-proxy C:\k\kube-proxy.exe nssm set kube-proxy AppDirectory c:\k nssm set kube-proxy AppParameters --v=4 --proxy-mode=kernelspace --feature-gates="WinOverlay=true" --hostname-override= --kubeconfig=c:\k\config --network-name=vxlan0 --source-vip= --enable-dsr=false --log-dir= --logtostderr=false @@ -410,68 +427,68 @@ Your main source of help for troubleshooting your Kubernetes cluster should star ``` - For initial troubleshooting, you can use the following flags in [nssm.exe](https://nssm.cc/) to redirect stdout and stderr to a output file: + 最初のトラブルシューティングでは、[nssm.exe](https://nssm.cc/)で次のフラグを使用して、stdoutおよびstderrを出力ファイルにリダイレクトできます。: ```powershell nssm set AppStdout C:\k\mysvc.log nssm set AppStderr C:\k\mysvc.log ``` - For additional details, see official [nssm usage](https://nssm.cc/usage) docs. + 詳細については、公式の[nssmの使用法](https://nssm.cc/usage)のドキュメントを参照してください。 -1. My Windows Pods do not have network connectivity +1. Windows Podにネットワーク接続がありません - If you are using virtual machines, ensure that MAC spoofing is enabled on all the VM network adapter(s). + 仮想マシンを使用している場合は、すべてのVMネットワークアダプターでMACスプーフィングが有効になっていることを確認してください。 -1. My Windows Pods cannot ping external resources +1. Windows Podが外部リソースにpingできません - Windows Pods do not have outbound rules programmed for the ICMP protocol today. However, TCP/UDP is supported. When trying to demonstrate connectivity to resources outside of the cluster, please substitute `ping ` with corresponding `curl ` commands. + 現在、Windows Podには、ICMPプロトコル用にプログラムされた送信ルールはありません。ただし、TCP/UDPはサポートされています。クラスター外のリソースへの接続を実証する場合は、`ping `に対応する`curl `コマンドに置き換えてください。 - If you are still facing problems, most likely your network configuration in [cni.conf](https://github.com/Microsoft/SDN/blob/master/Kubernetes/flannel/l2bridge/cni/config/cni.conf) deserves some extra attention. You can always edit this static file. The configuration update will apply to any newly created Kubernetes resources. + それでも問題が解決しない場合は、[cni.conf](https://github.com/Microsoft/SDN/blob/master/Kubernetes/flannel/l2bridge/cni/config/cni.conf)のネットワーク構成に値する可能性があるので、いくつかの特別な注意が必要です。この静的ファイルはいつでも編集できます。構成の更新は、新しく作成されたすべてのKubernetesリソースに適用されます。 - One of the Kubernetes networking requirements (see [Kubernetes model](/ja/docs/concepts/cluster-administration/networking/)) is for cluster communication to occur without NAT internally. To honor this requirement, there is an [ExceptionList](https://github.com/Microsoft/SDN/blob/master/Kubernetes/flannel/l2bridge/cni/config/cni.conf#L20) for all the communication where we do not want outbound NAT to occur. However, this also means that you need to exclude the external IP you are trying to query from the ExceptionList. Only then will the traffic originating from your Windows pods be SNAT'ed correctly to receive a response from the outside world. In this regard, your ExceptionList in `cni.conf` should look as follows: + Kubernetesのネットワーキング要件の1つ(参照[Kubernetesモデル](/ja/docs/concepts/cluster-administration/networking/))は、内部でNATを使用せずにクラスター通信を行うためのものです。この要件を遵守するために、すべての通信に[ExceptionList](https://github.com/Microsoft/SDN/blob/master/Kubernetes/flannel/l2bridge/cni/config/cni.conf#L20)があり、アウトバウンドNATが発生しないようにします。ただし、これは、クエリしようとしている外部IPをExceptionListから除外する必要があることも意味します。そうして初めて、Windows PodからのトラフィックがSNAT処理され、外部からの応答を受信できるようになります。この点で、`cni.conf`のExceptionListは次のようになります。: ```conf "ExceptionList": [ - "10.244.0.0/16", # Cluster subnet - "10.96.0.0/12", # Service subnet - "10.127.130.0/24" # Management (host) subnet + "10.244.0.0/16", # クラスターのサブネット + "10.96.0.0/12", # Serviceのサブネット + "10.127.130.0/24" # 管理 (ホスト) のサブネット ] ``` -1. My Windows node cannot access NodePort service +1. WindowsノードがNodePort Serviceにアクセスできません - Local NodePort access from the node itself fails. This is a known limitation. NodePort access works from other nodes or external clients. + ノード自体からのローカルNodePortアクセスは失敗します。これは既知の制限です。NodePortアクセスは、他のノードまたは外部クライアントから行えます。 -1. vNICs and HNS endpoints of containers are being deleted +1. コンテナのvNICとHNSエンドポイントが削除されています - This issue can be caused when the `hostname-override` parameter is not passed to [kube-proxy](/ja/docs/reference/command-line-tools-reference/kube-proxy/). To resolve it, users need to pass the hostname to kube-proxy as follows: + この問題は、`hostname-override`パラメータが[kube-proxy](/docs/reference/command-line-tools-reference/kube-proxy/)に渡されない場合に発生する可能性があります。これを解決するには、ユーザーは次のようにホスト名をkube-proxyに渡す必要があります。: ```powershell C:\k\kube-proxy.exe --hostname-override=$(hostname) ``` -1. With flannel my nodes are having issues after rejoining a cluster +1. flannelを使用すると、クラスターに再参加した後、ノードに問題が発生します - Whenever a previously deleted node is being re-joined to the cluster, flannelD tries to assign a new pod subnet to the node. Users should remove the old pod subnet configuration files in the following paths: + 以前に削除されたノードがクラスターに再参加するときはいつも、flannelDは新しいPodサブネットをノードに割り当てようとします。ユーザーは、次のパスにある古いPodサブネット構成ファイルを削除する必要があります。: ```powershell Remove-Item C:\k\SourceVip.json Remove-Item C:\k\SourceVipRequest.json ``` -1. After launching `start.ps1`, flanneld is stuck in "Waiting for the Network to be created" +1. `start.ps1`を起動した後、flanneldが「ネットワークが作成されるのを待っています」と表示されたままになります - There are numerous reports of this [issue which are being investigated](https://github.com/coreos/flannel/issues/1066); most likely it is a timing issue for when the management IP of the flannel network is set. A workaround is to simply relaunch start.ps1 or relaunch it manually as follows: + この[調査中の問題](https://github.com/coreos/flannel/issues/1066)に関する多数の報告があります。最も可能性が高いのは、flannelネットワークの管理IPが設定されるタイミングの問題です。回避策は、単純にstart.ps1を再起動するか、次のように手動で再起動することです。: ```powershell PS C:> [Environment]::SetEnvironmentVariable("NODE_NAME", "") PS C:> C:\flannel\flanneld.exe --kubeconfig-file=c:\k\config --iface= --ip-masq=1 --kube-subnet-mgr=1 ``` -1. My Windows Pods cannot launch because of missing `/run/flannel/subnet.env` +1. `/run/flannel/subnet.env`がないため、Windows Podを起動できません - This indicates that Flannel didn't launch correctly. You can either try to restart flanneld.exe or you can copy the files over manually from `/run/flannel/subnet.env` on the Kubernetes master to` C:\run\flannel\subnet.env` on the Windows worker node and modify the `FLANNEL_SUBNET` row to a different number. For example, if node subnet 10.244.4.1/24 is desired: + これは、Flannelが正しく起動しなかったことを示しています。 flanneld.exeの再起動を試みるか、Kubernetesマスターの`/run/flannel/subnet.env`からWindowsワーカーノードの`C:\run\flannel\subnet.env`に手動でファイルをコピーすることができます。「FLANNEL_SUBNET」行を別の番号に変更します。たとえば、ノードサブネット10.244.4.1/24が必要な場合は以下となります。: ```env FLANNEL_NETWORK=10.244.0.0/16 @@ -480,77 +497,91 @@ Your main source of help for troubleshooting your Kubernetes cluster should star FLANNEL_IPMASQ=true ``` -1. My Windows node cannot access my services using the service IP +1. WindowsノードがService IPを使用してServiceにアクセスできない - This is a known limitation of the current networking stack on Windows. Windows Pods are able to access the service IP however. + これは、Windows上の現在のネットワークスタックの既知の制限です。ただし、Windows PodはService IPにアクセスできます。 -1. No network adapter is found when starting kubelet +1. kubeletの起動時にネットワークアダプターが見つかりません - The Windows networking stack needs a virtual adapter for Kubernetes networking to work. If the following commands return no results (in an admin shell), virtual network creation — a necessary prerequisite for Kubelet to work — has failed: + WindowsネットワーキングスタックがKubernetesネットワーキングを動かすには、仮想アダプターが必要です。次のコマンドを実行しても結果が返されない場合(管理シェルで)、仮想ネットワークの作成(Kubeletが機能するために必要な前提条件)に失敗したことになります。: ```powershell Get-HnsNetwork | ? Name -ieq "cbr0" Get-NetAdapter | ? Name -Like "vEthernet (Ethernet*" ``` - Often it is worthwhile to modify the [InterfaceName](https://github.com/Microsoft/SDN/blob/master/Kubernetes/flannel/l2bridge/start.ps1#L6) parameter of the start.ps1 script, in cases where the host's network adapter isn't "Ethernet". Otherwise, consult the output of the `start-kubelet.ps1` script to see if there are errors during virtual network creation. + ホストのネットワークアダプターが「イーサネット」ではない場合、多くの場合、start.ps1スクリプトの[InterfaceName](https://github.com/microsoft/SDN/blob/master/Kubernetes/flannel/start.ps1#L6)パラメーターを修正する価値があります。そうでない場合は`start-kubelet.ps1`スクリプトの出力結果を調べて、仮想ネットワークの作成中にエラーがないか確認します。 -1. My Pods are stuck at "Container Creating" or restarting over and over +1. Podが「Container Creating」と表示されたまま動かなくなったり、何度も再起動を繰り返します - Check that your pause image is compatible with your OS version. The [instructions](https://docs.microsoft.com/en-us/virtualization/windowscontainers/kubernetes/deploying-resources) assume that both the OS and the containers are version 1803. If you have a later version of Windows, such as an Insider build, you need to adjust the images accordingly. Please refer to the Microsoft's [Docker repository](https://hub.docker.com/u/microsoft/) for images. Regardless, both the pause image Dockerfile and the sample service expect the image to be tagged as :latest. + PauseイメージがOSバージョンと互換性があることを確認してください。[説明](https://docs.microsoft.com/en-us/virtualization/windowscontainers/kubernetes/deploying-resources)では、OSとコンテナの両方がバージョン1803であると想定しています。それ以降のバージョンのWindowsを使用している場合は、Insiderビルドなどでは、それに応じてイメージを調整する必要があります。イメージについては、Microsoftの[Dockerレジストリ](https://hub.docker.com/u/microsoft/)を参照してください。いずれにしても、PauseイメージのDockerfileとサンプルサービスの両方で、イメージに:latestのタグが付けられていると想定しています。 - Starting with Kubernetes v1.14, Microsoft releases the pause infrastructure container at `mcr.microsoft.com/k8s/core/pause:1.2.0`. For more information search for "pause" in the [Guide for adding Windows Nodes in Kubernetes](../user-guide-windows-nodes). + Kubernetes v1.14以降、MicrosoftはPauseインフラストラクチャコンテナを`mcr.microsoft.com/k8s/core/pause:1.2.0`でリリースしています。詳細については、[KubernetesにWindowsノードを追加するためのガイド](../user-guide-windows-nodes)で「Pause」を検索してください。 -1. DNS resolution is not properly working +1. DNS名前解決が正しく機能していない - Check the DNS limitations for Windows in this [section](#dns-limitations). + この[セクション](#dns-limitations)でDNSの制限を確認してください。 -1. `kubectl port-forward` fails with "unable to do port forwarding: wincat not found" +1. `kubectl port-forward`が「ポート転送を実行できません:wincatが見つかりません」で失敗します - This was implemented in Kubernetes 1.15, and the pause infrastructure container `mcr.microsoft.com/k8s/core/pause:1.2.0`. Be sure to use these versions or newer ones. - If you would like to build your own pause infrastructure container, be sure to include [wincat](https://github.com/kubernetes-sigs/sig-windows-tools/tree/master/cmd/wincat) + これはKubernetes 1.15、およびPauseインフラストラクチャコンテナ`mcr.microsoft.com/k8s/core/pause:1.2.0`で実装されました。必ずこれらのバージョン以降を使用してください。 + 独自のPauseインフラストラクチャコンテナを構築する場合は、必ず[wincat](https://github.com/kubernetes-sigs/sig-windows-tools/tree/master/cmd/wincat)を含めてください。 -### Further investigation +1. Windows Serverノードがプロキシの背後にあるため、Kubernetesのインストールが失敗します -If these steps don't resolve your problem, you can get help running Windows containers on Windows nodes in Kubernetes through: + プロキシの背後にある場合は、次のPowerShell環境変数を定義する必要があります。: + ```PowerShell + [Environment]::SetEnvironmentVariable("HTTP_PROXY", "http://proxy.example.com:80/", [EnvironmentVariableTarget]::Machine) + [Environment]::SetEnvironmentVariable("HTTPS_PROXY", "http://proxy.example.com:443/", [EnvironmentVariableTarget]::Machine) + ``` -* StackOverflow [Windows Server Container](https://stackoverflow.com/questions/tagged/windows-server-container) topic -* Kubernetes Official Forum [discuss.kubernetes.io](https://discuss.kubernetes.io/) +1. `pause`コンテナとは何ですか + + Kubernetes Podでは、インフラストラクチャまたは「pause」コンテナが最初に作成され、コンテナエンドポイントをホストします。インフラストラクチャやワーカーコンテナなど、同じPodに属するコンテナは、共通のネットワークネームスペースとエンドポイント(同じIPとポートスペース)を共有します。Pauseコンテナは、ネットワーク構成を失うことなくクラッシュまたは再起動するワーカーコンテナに対応するために必要です。 + + 「pause」(インフラストラクチャ)イメージは、Microsoft Container Registry(MCR)でホストされています。`docker pull mcr.microsoft.com/k8s/core/pause:1.2.0`を使用してアクセスできます。詳細については、[DOCKERFILE](https://github.com/kubernetes-sigs/sig-windows-tools/tree/master/cmd/wincat)をご覧ください。 + +### さらなる調査 + +これらの手順で問題が解決しない場合は、次の方法で、KubernetesのWindowsノードでWindowsコンテナを実行する際のヘルプを利用できます。: + +* StackOverflow [Windows Server Container](https://stackoverflow.com/questions/tagged/windows-server-container)トピック +* Kubernetesオフィシャルフォーラム [discuss.kubernetes.io](https://discuss.kubernetes.io/) * Kubernetes Slack [#SIG-Windows Channel](https://kubernetes.slack.com/messages/sig-windows) -## Reporting Issues and Feature Requests +## IssueとFeatureリクエストの報告 -If you have what looks like a bug, or you would like to make a feature request, please use the [GitHub issue tracking system](https://github.com/kubernetes/kubernetes/issues). You can open issues on [GitHub](https://github.com/kubernetes/kubernetes/issues/new/choose) and assign them to SIG-Windows. You should first search the list of issues in case it was reported previously and comment with your experience on the issue and add additional logs. SIG-Windows Slack is also a great avenue to get some initial support and troubleshooting ideas prior to creating a ticket. +バグのようなものがある場合、またはFeatureリクエストを行う場合は、[GitHubのIssueシステム](https://github.com/kubernetes/kubernetes/issues)を使用してください。[GitHub](https://github.com/kubernetes/kubernetes/issues/new/choose)でIssueを開いて、SIG-Windowsに割り当てることができます。以前に報告された場合は、まずIssueリストを検索し、Issueについての経験をコメントして、追加のログを加える必要があります。SIG-Windows Slackは、チケットを作成する前に、初期サポートとトラブルシューティングのアイデアを得るための素晴らしい手段でもあります。 -If filing a bug, please include detailed information about how to reproduce the problem, such as: +バグを報告する場合は、問題の再現方法に関する次のような詳細情報を含めてください。: -* Kubernetes version: kubectl version -* Environment details: Cloud provider, OS distro, networking choice and configuration, and Docker version -* Detailed steps to reproduce the problem -* [Relevant logs](https://github.com/kubernetes/community/blob/master/sig-windows/CONTRIBUTING.md#gathering-logs) -* Tag the issue sig/windows by commenting on the issue with `/sig windows` to bring it to a SIG-Windows member's attention +* Kubernetesのバージョン: kubectlのバージョン +* 環境の詳細: クラウドプロバイダー、OSのディストリビューション、選択したネットワーキングと構成、およびDockerのバージョン +* 問題を再現するための詳細な手順 +* [関連するログ](https://github.com/kubernetes/community/blob/master/sig-windows/CONTRIBUTING.md#gathering-logs) +* `/sig windows`でIssueにコメントして、Issueにsig/windowsのタグを付けて、SIG-Windowsメンバーが気付くようにします ## {{% heading "whatsnext" %}} -We have a lot of features in our roadmap. An abbreviated high level list is included below, but we encourage you to view our [roadmap project](https://github.com/orgs/kubernetes/projects/8) and help us make Windows support better by [contributing](https://github.com/kubernetes/community/blob/master/sig-windows/). +ロードマップには多くの機能があります。高レベルの簡略リストを以下に示しますが、[ロードマッププロジェクト](https://github.com/orgs/kubernetes/projects/8)を見て、[貢献すること](https://github.com/kubernetes/community/blob/master/sig-windows/)によってWindowsサポートを改善することをお勧めします。 ### CRI-ContainerD -{{< glossary_tooltip term_id="containerd" >}} is another OCI-compliant runtime that recently graduated as a {{< glossary_tooltip text="CNCF" term_id="cncf" >}} project. It's currently tested on Linux, but 1.3 will bring support for Windows and Hyper-V. [[reference](https://blog.docker.com/2019/02/containerd-graduates-within-the-cncf/)] +{{< glossary_tooltip term_id="containerd" >}}は、最近{{< glossary_tooltip text="CNCF" term_id="cncf" >}}プロジェクトとして卒業した、もう1つのOCI準拠ランタイムです。現在Linuxでテストされていますが、1.3はWindowsとHyper-Vをサポートします。[[リファレンス](https://blog.docker.com/2019/02/containerd-graduates-within-the-cncf/)] -The CRI-ContainerD interface will be able to manage sandboxes based on Hyper-V. This provides a foundation where RuntimeClass could be implemented for new use cases including: +CRI-ContainerDインターフェイスは、Hyper-Vに基づいてサンドボックスを管理できるようになります。これにより、RuntimeClassを次のような新しいユースケースに実装できる基盤が提供されます: -* Hypervisor-based isolation between pods for additional security -* Backwards compatibility allowing a node to run a newer Windows Server version without requiring containers to be rebuilt -* Specific CPU/NUMA settings for a pod -* Memory isolation and reservations +* Pod間のハイパーバイザーベースの分離により、セキュリティを強化 +* 下位互換性により、コンテナの再構築を必要とせずにノードで新しいWindows Serverバージョンを実行 +* Podの特定のCPU/NUMA設定 +* メモリの分離と予約 -### Hyper-V isolation +### Hyper-V分離 -The existing Hyper-V isolation support, an experimental feature as of v1.10, will be deprecated in the future in favor of the CRI-ContainerD and RuntimeClass features mentioned above. To use the current features and create a Hyper-V isolated container, the kubelet should be started with feature gates `HyperVContainer=true` and the Pod should include the annotation `experimental.windows.kubernetes.io/isolation-type=hyperv`. In the experiemental release, this feature is limited to 1 container per Pod. +既存のHyper-V分離サポートは、v1.10の試験的な機能であり、上記のCRI-ContainerD機能とRuntimeClass機能を優先して将来廃止される予定です。現在の機能を使用してHyper-V分離コンテナを作成するには、kubeletのフィーチャーゲートを`HyperVContainer=true`で開始し、Podにアノテーション`experimental.windows.kubernetes.io/isolation-type=hyperv`を含める必要があります。実験的リリースでは、この機能はPodごとに1つのコンテナに制限されています。 ```yaml apiVersion: apps/v1 @@ -576,13 +607,11 @@ spec: - containerPort: 80 ``` -### Deployment with kubeadm and cluster API - -Kubeadm is becoming the de facto standard for users to deploy a Kubernetes cluster. Windows node support in kubeadm will come in a future release. We are also making investments in cluster API to ensure Windows nodes are properly provisioned. - -### A few other key features -* Beta support for Group Managed Service Accounts -* More CNIs -* More Storage Plugins +### kubeadmとクラスターAPIを使用したデプロイ +Kubeadmは、ユーザーがKubernetesクラスターをデプロイするための事実上の標準になりつつあります。kubeadmのWindowsノードのサポートは、将来のリリースで提供予定です。Windowsノードが適切にプロビジョニングされるように、クラスターAPIにも投資しています。 +### その他の主な機能 +* グループ管理サービスアカウントのベータサポート +* その他のCNI +* その他のストレージプラグイン diff --git a/content/ja/docs/setup/production-environment/windows/kubecluster.ps1-install.gif b/content/ja/docs/setup/production-environment/windows/kubecluster.ps1-install.gif new file mode 100644 index 0000000000..e3d94b9b54 Binary files /dev/null and b/content/ja/docs/setup/production-environment/windows/kubecluster.ps1-install.gif differ diff --git a/content/ja/docs/setup/production-environment/windows/kubecluster.ps1-join.gif b/content/ja/docs/setup/production-environment/windows/kubecluster.ps1-join.gif new file mode 100644 index 0000000000..828417d685 Binary files /dev/null and b/content/ja/docs/setup/production-environment/windows/kubecluster.ps1-join.gif differ diff --git a/content/ja/docs/setup/production-environment/windows/kubecluster.ps1-reset.gif b/content/ja/docs/setup/production-environment/windows/kubecluster.ps1-reset.gif new file mode 100644 index 0000000000..e71d40d6df Binary files /dev/null and b/content/ja/docs/setup/production-environment/windows/kubecluster.ps1-reset.gif differ diff --git a/content/ja/docs/setup/production-environment/windows/user-guide-windows-containers.md b/content/ja/docs/setup/production-environment/windows/user-guide-windows-containers.md index 24d61e8bbd..ee1ed7b9f1 100644 --- a/content/ja/docs/setup/production-environment/windows/user-guide-windows-containers.md +++ b/content/ja/docs/setup/production-environment/windows/user-guide-windows-containers.md @@ -27,44 +27,47 @@ Windows applications constitute a large portion of the services and applications To deploy a Windows container on Kubernetes, you must first create an example application. The example YAML file below creates a simple webserver application. Create a service spec named `win-webserver.yaml` with the contents below: ```yaml - apiVersion: v1 - kind: Service - metadata: - name: win-webserver - labels: - app: win-webserver - spec: - ports: - # the port that this service should serve on - - port: 80 - targetPort: 80 - selector: - app: win-webserver - type: NodePort - --- - apiVersion: extensions/v1beta1 - kind: Deployment +apiVersion: v1 +kind: Service +metadata: + name: win-webserver + labels: + app: win-webserver +spec: + ports: + # the port that this service should serve on + - port: 80 + targetPort: 80 + selector: + app: win-webserver + type: NodePort +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: win-webserver + name: win-webserver +spec: + replicas: 2 + selector: + matchLabels: + app: win-webserver + template: metadata: labels: app: win-webserver name: win-webserver spec: - replicas: 2 - template: - metadata: - labels: - app: win-webserver - name: win-webserver - spec: - containers: - - name: windowswebserver - image: mcr.microsoft.com/windows/servercore:ltsc2019 - command: + containers: + - name: windowswebserver + image: mcr.microsoft.com/windows/servercore:ltsc2019 + command: - powershell.exe - -command - - "<#code used from https://gist.github.com/wagnerandrade/5424431#> ; $$listener = New-Object System.Net.HttpListener ; $$listener.Prefixes.Add('http://*:80/') ; $$listener.Start() ; $$callerCounts = @{} ; Write-Host('Listening at http://*:80/') ; while ($$listener.IsListening) { ;$$context = $$listener.GetContext() ;$$requestUrl = $$context.Request.Url ;$$clientIP = $$context.Request.RemoteEndPoint.Address ;$$response = $$context.Response ;Write-Host '' ;Write-Host('> {0}' -f $$requestUrl) ; ;$$count = 1 ;$$k=$$callerCounts.Get_Item($$clientIP) ;if ($$k -ne $$null) { $$count += $$k } ;$$callerCounts.Set_Item($$clientIP, $$count) ;$$ip=(Get-NetAdapter | Get-NetIpAddress); $$header='

Windows Container Web Server

' ;$$callerCountsString='' ;$$callerCounts.Keys | % { $$callerCountsString+='

IP {0} callerCount {1} ' -f $$ip[1].IPAddress,$$callerCounts.Item($$_) } ;$$footer='' ;$$content='{0}{1}{2}' -f $$header,$$callerCountsString,$$footer ;Write-Output $$content ;$$buffer = [System.Text.Encoding]::UTF8.GetBytes($$content) ;$$response.ContentLength64 = $$buffer.Length ;$$response.OutputStream.Write($$buffer, 0, $$buffer.Length) ;$$response.Close() ;$$responseStatus = $$response.StatusCode ;Write-Host('< {0}' -f $$responseStatus) } ; " - nodeSelector: - kubernetes.io/os: windows + - "<#code used from https://gist.github.com/wagnerandrade/5424431#> ; $$listener = New-Object System.Net.HttpListener ; $$listener.Prefixes.Add('http://*:80/') ; $$listener.Start() ; $$callerCounts = @{} ; Write-Host('Listening at http://*:80/') ; while ($$listener.IsListening) { ;$$context = $$listener.GetContext() ;$$requestUrl = $$context.Request.Url ;$$clientIP = $$context.Request.RemoteEndPoint.Address ;$$response = $$context.Response ;Write-Host '' ;Write-Host('> {0}' -f $$requestUrl) ; ;$$count = 1 ;$$k=$$callerCounts.Get_Item($$clientIP) ;if ($$k -ne $$null) { $$count = $$k } ;$$callerCounts.Set_Item($$clientIP, $$count) ;$$ip=(Get-NetAdapter | Get-NetIpAddress); $$header='

Windows Container Web Server

' ;$$callerCountsString='' ;$$callerCounts.Keys | % { $$callerCountsString='

IP {0} callerCount {1} ' -f $$ip[1].IPAddress,$$callerCounts.Item($$_) } ;$$footer='' ;$$content='{0}{1}{2}' -f $$header,$$callerCountsString,$$footer ;Write-Output $$content ;$$buffer = [System.Text.Encoding]::UTF8.GetBytes($$content) ;$$response.ContentLength64 = $$buffer.Length ;$$response.OutputStream.Write($$buffer, 0, $$buffer.Length) ;$$response.Close() ;$$responseStatus = $$response.StatusCode ;Write-Host('< {0}' -f $$responseStatus) } ; " + nodeSelector: + kubernetes.io/os: windows ``` {{< note >}} @@ -101,6 +104,18 @@ Port mapping is also supported, but for simplicity in this example the container Windows container hosts are not able to access the IP of services scheduled on them due to current platform limitations of the Windows networking stack. Only Windows pods are able to access service IPs. {{< /note >}} +## Observability + +### Capturing logs from workloads + +Logs are an important element of observability; they enable users to gain insights into the operational aspect of workloads and are a key ingredient to troubleshooting issues. Because Windows containers and workloads inside Windows containers behave differently from Linux containers, users had a hard time collecting logs, limiting operational visibility. Windows workloads for example are usually configured to log to ETW (Event Tracing for Windows) or push entries to the application event log. [LogMonitor](https://github.com/microsoft/windows-container-tools/tree/master/LogMonitor), an open source tool by Microsoft, is the recommended way to monitor configured log sources inside a Windows container. LogMonitor supports monitoring event logs, ETW providers, and custom application logs, piping them to STDOUT for consumption by `kubectl logs `. + +Follow the instructions in the LogMonitor GitHub page to copy its binaries and configuration files to all your containers and add the necessary entrypoints for LogMonitor to push your logs to STDOUT. + +## Using configurable Container usernames + +Starting with Kubernetes v1.16, Windows containers can be configured to run their entrypoints and processes with different usernames than the image defaults. The way this is achieved is a bit different from the way it is done for Linux containers. Learn more about it [here](/docs/tasks/configure-pod-container/configure-runasusername/). + ## Managing Workload Identity with Group Managed Service Accounts Starting with Kubernetes v1.14, Windows container workloads can be configured to use Group Managed Service Accounts (GMSA). Group Managed Service Accounts are a specific type of Active Directory account that provides automatic password management, simplified service principal name (SPN) management, and the ability to delegate the management to other administrators across multiple servers. Containers configured with a GMSA can access external Active Directory Domain resources while carrying the identity configured with the GMSA. Learn more about configuring and using GMSA for Windows containers [here](/docs/tasks/configure-pod-container/configure-gmsa/). @@ -116,22 +131,114 @@ Users can ensure Windows containers can be scheduled on the appropriate host usi * kubernetes.io/os = [windows|linux] * kubernetes.io/arch = [amd64|arm64|...] -If a Pod specification does not specify a nodeSelector like `"beta.kubernetes.io/os": windows`, it is possible the Pod can be scheduled on any host, Windows or Linux. This can be problematic since a Windows container can only run on Windows and a Linux container can only run on Linux. The best practice is to use a nodeSelector. +If a Pod specification does not specify a nodeSelector like `"kubernetes.io/os": windows`, it is possible the Pod can be scheduled on any host, Windows or Linux. This can be problematic since a Windows container can only run on Windows and a Linux container can only run on Linux. The best practice is to use a nodeSelector. However, we understand that in many cases users have a pre-existing large number of deployments for Linux containers, as well as an ecosystem of off-the-shelf configurations, such as community Helm charts, and programmatic Pod generation cases, such as with Operators. In those situations, you may be hesitant to make the configuration change to add nodeSelectors. The alternative is to use Taints. Because the kubelet can set Taints during registration, it could easily be modified to automatically add a taint when running on Windows only. -For example: `--register-with-taints='os=Win1809:NoSchedule'` +For example: `--register-with-taints='os=windows:NoSchedule'` By adding a taint to all Windows nodes, nothing will be scheduled on them (that includes existing Linux Pods). In order for a Windows Pod to be scheduled on a Windows node, it would need both the nodeSelector to choose Windows, and the appropriate matching toleration. ```yaml nodeSelector: - "beta.kubernetes.io/os": windows + kubernetes.io/os: windows + node.kubernetes.io/windows-build: '10.0.17763' tolerations: - key: "os" operator: "Equal" - value: "Win1809" + value: "windows" effect: "NoSchedule" ``` +### Handling multiple Windows versions in the same cluster +The Windows Server version used by each pod must match that of the node. If you want to use multiple Windows +Server versions in the same cluster, then you should set additional node labels and nodeSelectors. + +Kubernetes 1.17 automatically adds a new label `node.kubernetes.io/windows-build` to simplify this. If you're running an older version, then it's recommended to add this label manually to Windows nodes. + +This label reflects the Windows major, minor, and build number that need to match for compatibility. Here are values used today for each Windows Server version. + +| Product Name | Build Number(s) | +|--------------------------------------|------------------------| +| Windows Server 2019 | 10.0.17763 | +| Windows Server version 1809 | 10.0.17763 | +| Windows Server version 1903 | 10.0.18362 | + + +### Simplifying with RuntimeClass + +[RuntimeClass] can be used to simplify the process of using taints and tolerations. A cluster administrator can create a `RuntimeClass` object which is used to encapsulate these taints and tolerations. + + +1. Save this file to `runtimeClasses.yml`. It includes the appropriate `nodeSelector` for the Windows OS, architecture, and version. + +```yaml +apiVersion: node.k8s.io/v1beta1 +kind: RuntimeClass +metadata: + name: windows-2019 +handler: 'docker' +scheduling: + nodeSelector: + kubernetes.io/os: 'windows' + kubernetes.io/arch: 'amd64' + node.kubernetes.io/windows-build: '10.0.17763' + tolerations: + - effect: NoSchedule + key: os + operator: Equal + value: "windows" +``` + +1. Run `kubectl create -f runtimeClasses.yml` using as a cluster administrator +1. Add `runtimeClassName: windows-2019` as appropriate to Pod specs + +For example: + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: iis-2019 + labels: + app: iis-2019 +spec: + replicas: 1 + template: + metadata: + name: iis-2019 + labels: + app: iis-2019 + spec: + runtimeClassName: windows-2019 + containers: + - name: iis + image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019 + resources: + limits: + cpu: 1 + memory: 800Mi + requests: + cpu: .1 + memory: 300Mi + ports: + - containerPort: 80 + selector: + matchLabels: + app: iis-2019 +--- +apiVersion: v1 +kind: Service +metadata: + name: iis +spec: + type: LoadBalancer + ports: + - protocol: TCP + port: 80 + selector: + app: iis-2019 +``` + +[RuntimeClass]: https://kubernetes.io/docs/concepts/containers/runtime-class/ \ No newline at end of file diff --git a/content/ja/docs/setup/production-environment/windows/user-guide-windows-nodes.md b/content/ja/docs/setup/production-environment/windows/user-guide-windows-nodes.md index 29035e15d9..6edce770c1 100644 --- a/content/ja/docs/setup/production-environment/windows/user-guide-windows-nodes.md +++ b/content/ja/docs/setup/production-environment/windows/user-guide-windows-nodes.md @@ -91,9 +91,9 @@ Once you have a Linux-based Kubernetes master node you are ready to choose a net 1. In the `net-conf.json` section of your `kube-flannel.yml`, double-check: 1. The cluster subnet (e.g. "10.244.0.0/16") is set as per your IP plan. - * VNI 4096 is set in the backend - * Port 4789 is set in the backend - 2. In the `cni-conf.json` section of your `kube-flannel.yml`, change the network name to `vxlan0`. + * VNI 4096 is set in the backend + * Port 4789 is set in the backend + 1. In the `cni-conf.json` section of your `kube-flannel.yml`, change the network name to `vxlan0`. Your `cni-conf.json` should look as follows: @@ -134,7 +134,18 @@ Once you have a Linux-based Kubernetes master node you are ready to choose a net kubectl get pods --all-namespaces ``` - ![alt_text](../flannel-master-kubeclt-get-pods.png "flannel master kubectl get pods screen capture") + The output looks like as follows: + + ``` + NAMESPACE NAME READY STATUS RESTARTS AGE + kube-system etcd-flannel-master 1/1 Running 0 1m + kube-system kube-apiserver-flannel-master 1/1 Running 0 1m + kube-system kube-controller-manager-flannel-master 1/1 Running 0 1m + kube-system kube-dns-86f4d74b45-hcx8x 3/3 Running 0 12m + kube-system kube-flannel-ds-54954 1/1 Running 0 1m + kube-system kube-proxy-Zjlxz 1/1 Running 0 1m + kube-system kube-scheduler-flannel-master 1/1 Running 0 1m + ``` Verify that the Flannel DaemonSet has the NodeSelector applied. @@ -142,13 +153,20 @@ Once you have a Linux-based Kubernetes master node you are ready to choose a net kubectl get ds -n kube-system ``` - ![alt_text](../flannel-master-kubectl-get-ds.png "flannel master kubectl get ds screen capture") + The output looks like as follows. The NodeSelector `beta.kubernetes.io/os=linux` is applied. + + ``` + NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE + kube-flannel-ds 2 2 2 2 2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux 21d + kube-proxy 2 2 2 2 2 beta.kubernetes.io/os=linux 26d + ``` #### Join Windows Worker In this section we'll cover configuring a Windows node from scratch to join a cluster on-prem. If your cluster is on a cloud you'll likely want to follow the cloud specific guides in the next section. #### Preparing a Windows Node + {{< note >}} All code snippets in Windows sections are to be run in a PowerShell environment with elevated permissions (Admin). {{< /note >}} @@ -171,9 +189,28 @@ All code snippets in Windows sections are to be run in a PowerShell environment [Environment]::SetEnvironmentVariable("HTTPS_PROXY", "http://proxy.example.com:443/", [EnvironmentVariableTarget]::Machine) ``` - If after reboot you see the following error, you need to restart the docker service manually + After reboot, you can verify that the docker service is ready with the command below. - ![alt_text](../windows-docker-error.png "windows docker error screen capture") + ```PowerShell + docker version + ``` + + If you see error message like the following, you need to start the docker service manually. + + ``` + Client: + Version: 17.06.2-ee-11 + API version: 1.30 + Go version: go1.8.7 + Git commit: 06fc007 + Built: Thu May 17 06:14:39 2018 + OS/Arch: windows / amd64 + error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.30/version: open //./pipe/docker_engine: The system c + annot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to + connect. This error may also indicate that the docker daemon is not running. + ``` + + You can start the docker service manually like below. ```PowerShell Start-Service docker @@ -220,7 +257,13 @@ wget https://raw.githubusercontent.com/Microsoft/SDN/master/Kubernetes/flannel/s {{< /note >}} ```PowerShell -.\start.ps1 -ManagementIP -NetworkMode overlay -ClusterCIDR -ServiceCIDR -KubeDnsServiceIP -LogDir +cd c:\k +.\start.ps1 -ManagementIP ` + -NetworkMode overlay ` + -ClusterCIDR ` + -ServiceCIDR ` + -KubeDnsServiceIP ` + -LogDir ``` | Parameter | Default Value | Notes | @@ -261,4 +304,3 @@ Kubeadm is becoming the de facto standard for users to deploy a Kubernetes clust Now that you've configured a Windows worker in your cluster to run Windows containers you may want to add one or more Linux nodes as well to run Linux containers. You are now ready to schedule Windows containers on your cluster. - diff --git a/content/ja/docs/setup/production-environment/windows/windows-docker-error.png b/content/ja/docs/setup/production-environment/windows/windows-docker-error.png deleted file mode 100644 index d00528c0d4..0000000000 Binary files a/content/ja/docs/setup/production-environment/windows/windows-docker-error.png and /dev/null differ diff --git a/content/ja/docs/setup/release/_index.md b/content/ja/docs/setup/release/_index.md index e930b48a08..8c812f72de 100755 --- a/content/ja/docs/setup/release/_index.md +++ b/content/ja/docs/setup/release/_index.md @@ -1,4 +1,4 @@ --- -title: "リリースノート及びバージョンスキュー" +title: "リリースノートおよびバージョンスキュー" weight: 10 --- diff --git a/content/ja/docs/setup/release/building-from-source.md b/content/ja/docs/setup/release/building-from-source.md deleted file mode 100644 index 21f056ce39..0000000000 --- a/content/ja/docs/setup/release/building-from-source.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: リリースのビルド -content_type: concept -card: - name: download - weight: 20 - title: リリースのビルド ---- - -ソースコードからリリースをビルドすることもできますし、既にビルドされたリリースをダウンロードすることも可能です。Kubernetesを開発する予定が無いのであれば、[リリースノート](/docs/setup/release/notes/)内にて既にビルドされたバージョンを使用することを推奨します。 - -Kubernetes のソースコードは[kubernetes/kubernetes](https://github.com/kubernetes/kubernetes)のリポジトリからダウンロードすることが可能です。 - - - -## ソースからのビルド - -単にソースからリリースをビルドするだけであれば、完全なGOの環境を準備する必要はなく、全てのビルドはDockerコンテナの中で行われます。 - -リリースをビルドすることは簡単です。 - -```shell -git clone https://github.com/kubernetes/kubernetes.git -cd kubernetes -make release -``` - -リリース手段の詳細な情報はkubernetes/kubernetes内の[`build`](http://releases.k8s.io/{{< param "githubbranch" >}}/build/)ディレクトリを参照して下さい。 - - diff --git a/content/ja/docs/setup/release/version-skew-policy.md b/content/ja/docs/setup/release/version-skew-policy.md index 19200d80a6..5c1a18b8ee 100644 --- a/content/ja/docs/setup/release/version-skew-policy.md +++ b/content/ja/docs/setup/release/version-skew-policy.md @@ -5,7 +5,7 @@ weight: 30 --- -このドキュメントでは、さまざまなKubernetesコンポーネント間でサポートされる最大のバージョンの差異(バージョンスキュー)について説明します。特定のクラスターデプロイツールは、バージョンの差異に追加の制限を加える場合があります。 +このドキュメントでは、さまざまなKubernetesコンポーネント間でサポートされる最大のバージョンの差異(バージョンスキュー)について説明します。特定のクラスターデプロイツールは、バージョンの差異に追加の制限を加える場合があります。 @@ -16,9 +16,10 @@ Kubernetesのバージョンは**x.y.z**の形式で表現され、**x**はメ Kubernetesプロジェクトでは、最新の3つのマイナーリリースについてリリースブランチを管理しています。 -セキュリティフィックスを含む適用可能な修正は、重大度や実行可能性によってはこれら3つのリリースブランチにバックポートされることもあります。パッチリリースは、[定期的](https://git.k8s.io/sig-release/releases/patch-releases.md#cadence)または必要に応じてこれらのブランチから分岐されます。[リリースマネージャー](https://git.k8s.io/sig-release/release-managers.md)グループがこれを決定しています。 +セキュリティフィックスを含む適用可能な修正は、重大度や実行可能性によってはこれら3つのリリースブランチにバックポートされることもあります。パッチリリースは、定期的または必要に応じてこれらのブランチから分岐されます。[パッチリリースチーム](https://github.com/kubernetes/sig-release/blob/master/release-engineering/role-handbooks/patch-release-team.md#release-timing)がこれを決定しています。パッチリリースチームは[リリースマネージャー](https://github.com/kubernetes/sig-release/blob/master/release-managers.md)の一部です。 +詳細は、[Kubernetesパッチリリース](https://github.com/kubernetes/sig-release/blob/master/releases/patch-releases.md)ページを参照してください。 -詳細は、Kubernetes[パッチリリース](https://git.k8s.io/sig-release/releases/patch-releases.md)ページを参照してください。 +マイナーリリースは約3ヶ月ごとに行われるため、マイナーリリースのブランチはそれぞれ約9ヶ月保守されます。 ## サポートされるバージョンの差異 @@ -51,7 +52,7 @@ HAクラスター内の`kube-apiserver`間にバージョンの差異がある ### kube-controller-manager、kube-scheduler、およびcloud-controller-manager -`kube-controller-manager`、`kube-scheduler`および`cloud-controller-manager`は、通信する`kube-apiserver`インスタンスよりも新しいバージョンであってはなりません。`kube-apiserver`のマイナーバージョンと一致することが期待されますが、1つ古いマイナーバージョンでも可能です(ライブアップグレードを可能にするため)。 +`kube-controller-manager`、`kube-scheduler`および`cloud-controller-manager`は、通信する`kube-apiserver`インスタンスよりも新しいバージョンであってはなりません。`kube-apiserver`のマイナーバージョンと一致することが期待されますが、1つ古いマイナーバージョンでも可能です(ライブアップグレードを可能にするため)。 例: @@ -59,17 +60,17 @@ HAクラスター内の`kube-apiserver`間にバージョンの差異がある * `kube-controller-manager`、`kube-scheduler`および`cloud-controller-manager`は**1.13**および**1.12**がサポートされます {{< note >}} -HAクラスター内の`kube-apiserver`間にバージョンの差異があり、これらのコンポーネントがクラスター内のいずれかの`kube-apiserver`と通信する場合(たとえばロードバランサーを経由して)、コンポーネントの有効なバージョンは少なくなります。 +HAクラスター内の`kube-apiserver`間にバージョンの差異があり、これらのコンポーネントがクラスター内のいずれかの`kube-apiserver`と通信する場合(たとえばロードバランサーを経由して)、コンポーネントの有効なバージョンは少なくなります。 {{< /note >}} 例: * `kube-apiserver`インスタンスが**1.13**および**1.12**であるとします -* いずれかの`kube-apiserver`インスタンスへ配信するロードバランサーと通信する`kube-controller-manager`、`kube-scheduler`および`cloud-controller-manager`は**1.12**がサポートされます(**1.13**はバージョン**1.12**の`kube-apiserver`よりも新しくなるためサポートされません) +* いずれかの`kube-apiserver`インスタンスへ配信するロードバランサーと通信する`kube-controller-manager`、`kube-scheduler`および`cloud-controller-manager`は**1.12**がサポートされます(**1.13**はバージョン**1.12**の`kube-apiserver`よりも新しくなるためサポートされません) ### kubectl -`kubectl`は`kube-apiserver`の1つ以内のバージョン(古い、または新しいもの)をサポートします。 +`kubectl`は`kube-apiserver`の1つ以内のバージョン(古い、または新しいもの)をサポートします。 例: @@ -83,25 +84,25 @@ HAクラスター内の`kube-apiserver`間にバージョンの差異がある 例: * `kube-apiserver`インスタンスが**1.13**および**1.12**であるとします -* `kubectl`は**1.13**および**1.12**がサポートされます(ほかのバージョンでは、ある`kube-apiserver`コンポーネントからマイナーバージョンが2つ以上離れる可能性があります) +* `kubectl`は**1.13**および**1.12**がサポートされます(ほかのバージョンでは、ある`kube-apiserver`コンポーネントからマイナーバージョンが2つ以上離れる可能性があります) ## サポートされるコンポーネントのアップグレード順序 -コンポーネント間でサポートされるバージョンの差異は、コンポーネントをアップグレードする順序に影響されます。このセクションでは、既存のクラスターをバージョン**1.n**から**1.(n+1)**へ移行するために、コンポーネントをアップグレードする順序を説明します。 +コンポーネント間でサポートされるバージョンの差異は、コンポーネントをアップグレードする順序に影響されます。このセクションでは、既存のクラスターをバージョン**1.n**から**1.(n+1)** へ移行するために、コンポーネントをアップグレードする順序を説明します。 ### kube-apiserver 前提条件: * シングルインスタンスのクラスターにおいて、既存の`kube-apiserver`インスタンスは**1.n**とします -* HAクラスターにおいて、既存の`kube-apiserver`は**1.n**または**1.(n+1)**とします(最新と最古の間で、最大で1つのマイナーバージョンの差異となります) -* サーバーと通信する`kube-controller-manager`、`kube-scheduler`および`cloud-controller-manager`はバージョン**1.n**とします(必ず既存のAPIサーバーのバージョンよりも新しいものでなく、かつ新しいAPIサーバーのバージョンの1つ以内のマイナーバージョンとなります) -* すべてのノードの`kubelet`インスタンスはバージョン**1.n**または**1.(n-1)**とします(必ず既存のAPIサーバーよりも新しいバージョンでなく、かつ新しいAPIサーバーのバージョンの2つ以内のマイナーバージョンとなります) +* HAクラスターにおいて、既存の`kube-apiserver`は**1.n**または**1.(n+1)** とします(最新と最古の間で、最大で1つのマイナーバージョンの差異となります) +* サーバーと通信する`kube-controller-manager`、`kube-scheduler`および`cloud-controller-manager`はバージョン**1.n**とします(必ず既存のAPIサーバーのバージョンよりも新しいものでなく、かつ新しいAPIサーバーのバージョンの1つ以内のマイナーバージョンとなります) +* すべてのノードの`kubelet`インスタンスはバージョン**1.n**または**1.(n-1)** とします(必ず既存のAPIサーバーよりも新しいバージョンでなく、かつ新しいAPIサーバーのバージョンの2つ以内のマイナーバージョンとなります) * 登録されたAdmission webhookは、新しい`kube-apiserver`インスタンスが送信するこれらのデータを扱うことができます: - * `ValidatingWebhookConfiguration`および`MutatingWebhookConfiguration`オブジェクトは、**1.(n+1)**で追加されたRESTリソースの新しいバージョンを含んで更新されます(または、v1.15から利用可能な[`matchPolicy: Equivalent`オプション](/docs/reference/access-authn-authz/extensible-admission-controllers/#matching-requests-matchpolicy)を使用してください) - * Webhookは送信されたRESTリソースの新しいバージョン、および**1.(n+1)**のバージョンで追加された新しいフィールドを扱うことができます + * `ValidatingWebhookConfiguration`および`MutatingWebhookConfiguration`オブジェクトは、**1.(n+1)** で追加されたRESTリソースの新しいバージョンを含んで更新されます(または、v1.15から利用可能な[`matchPolicy: Equivalent`オプション](/docs/reference/access-authn-authz/extensible-admission-controllers/#matching-requests-matchpolicy)を使用してください) + * Webhookは送信されたRESTリソースの新しいバージョン、および**1.(n+1)** のバージョンで追加された新しいフィールドを扱うことができます -`kube-apiserver`を**1.(n+1)**にアップグレードしてください。 +`kube-apiserver`を**1.(n+1)** にアップグレードしてください。 {{< note >}} [非推奨API](/docs/reference/using-api/deprecation-policy/)および[APIの変更ガイドライン](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api_changes.md)のプロジェクトポリシーにおいては、シングルインスタンスの場合でも`kube-apiserver`のアップグレードの際にマイナーバージョンをスキップしてはなりません。 @@ -111,17 +112,17 @@ HAクラスター内の`kube-apiserver`間にバージョンの差異がある 前提条件: -* これらのコンポーネントと通信する`kube-apiserver`インスタンスが**1.(n+1)**であること(これらのコントロールプレーンコンポーネントが、クラスター内の`kube-apiserver`インスタンスと通信できるHAクラスターでは、これらのコンポーネントをアップグレードする前にすべての`kube-apiserver`インスタンスをアップグレードしなければなりません) +* これらのコンポーネントと通信する`kube-apiserver`インスタンスが**1.(n+1)** であること(これらのコントロールプレーンコンポーネントが、クラスター内の`kube-apiserver`インスタンスと通信できるHAクラスターでは、これらのコンポーネントをアップグレードする前にすべての`kube-apiserver`インスタンスをアップグレードしなければなりません) -`kube-controller-manager`、`kube-scheduler`および`cloud-controller-manager`を**1.(n+1)**にアップグレードしてください。 +`kube-controller-manager`、`kube-scheduler`および`cloud-controller-manager`を**1.(n+1)** にアップグレードしてください。 ### kubelet 前提条件: -* `kubelet`と通信する`kube-apiserver`が**1.(n+1)**であること +* `kubelet`と通信する`kube-apiserver`が**1.(n+1)** であること -必要に応じて、`kubelet`インスタンスを**1.(n+1)**にアップグレードしてください(**1.n**や**1.(n-1)**のままにすることもできます)。 +必要に応じて、`kubelet`インスタンスを**1.(n+1)** にアップグレードしてください(**1.n**や**1.(n-1)** のままにすることもできます)。 {{< warning >}} `kube-apiserver`と2つのマイナーバージョンの`kubelet`インスタンスを使用してクラスターを実行させることは推奨されません: diff --git a/content/ja/docs/tasks/access-application-cluster/ingress-minikube.md b/content/ja/docs/tasks/access-application-cluster/ingress-minikube.md new file mode 100644 index 0000000000..563ce2478e --- /dev/null +++ b/content/ja/docs/tasks/access-application-cluster/ingress-minikube.md @@ -0,0 +1,305 @@ +--- +title: Minikube上でNGINX Ingressコントローラーを使用してIngressをセットアップする +content_type: task +weight: 100 +--- + + + +[Ingress](/ja/docs/concepts/services-networking/ingress/)とは、クラスター内のServiceに外部からのアクセスを許可するルールを定義するAPIオブジェクトです。[Ingressコントローラー](/ja/docs/concepts/services-networking/ingress-controllers/)はIngress内に設定されたルールを満たすように動作します。 + +このページでは、簡単なIngressをセットアップして、HTTPのURIに応じてwebまたはweb2というServiceにリクエストをルーティングする方法を説明します。 + + + +## {{% heading "prerequisites" %}} + + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + + + + + +## Minikubeクラスターを作成する + +1. **Launch Terminal**をクリックします。 + + {{< kat-button >}} + +1. (オプション) Minikubeをローカル環境にインストールした場合は、次のコマンドを実行します。 + + ```shell + minikube start + ``` + +## Ingressコントローラーを有効化する + +1. NGINX Ingressコントローラーを有効にするために、次のコマンドを実行します。 + + ```shell + minikube addons enable ingress + ``` + +1. NGINX Ingressコントローラーが起動したことを確認します。 + + ```shell + kubectl get pods -n kube-system + ``` + + {{< note >}} + このコマンドの実行には数分かかる場合があります。 + {{< /note >}} + + 出力は次のようになります。 + + ```shell + NAME READY STATUS RESTARTS AGE + default-http-backend-59868b7dd6-xb8tq 1/1 Running 0 1m + kube-addon-manager-minikube 1/1 Running 0 3m + kube-dns-6dcb57bcc8-n4xd4 3/3 Running 0 2m + kubernetes-dashboard-5498ccf677-b8p5h 1/1 Running 0 2m + nginx-ingress-controller-5984b97644-rnkrg 1/1 Running 0 1m + storage-provisioner 1/1 Running 0 2m + ``` + +## Hello Worldアプリをデプロイする + +1. 次のコマンドを実行して、Deploymentを作成します。 + + ```shell + kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0 + ``` + + 出力は次のようになります。 + + ```shell + deployment.apps/web created + ``` + +1. Deploymentを公開します。 + + ```shell + kubectl expose deployment web --type=NodePort --port=8080 + ``` + + 出力は次のようになります。 + + ```shell + service/web exposed + ``` + +1. Serviceが作成され、NodePort上で利用できるようになったことを確認します。 + + ```shell + kubectl get service web + ``` + + 出力は次のようになります。 + + ```shell + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + web NodePort 10.104.133.249 8080:31637/TCP 12m + ``` + +1. NodePort経由でServiceを訪問します。 + + ```shell + minikube service web --url + ``` + + 出力は次のようになります。 + + ```shell + http://172.17.0.15:31637 + ``` + + {{< note >}} + Katacoda環境の場合のみ: 上部のterminalパネルでプラスのアイコンをクリックして、**Select port to view on Host 1**(Host 1を表示するポートを選択)をクリックします。NodePort(上の例では`31637`)を入力して、**Display Port**(ポートを表示)をクリックしてください。 + {{< /note >}} + + 出力は次のようになります。 + + ```shell + Hello, world! + Version: 1.0.0 + Hostname: web-55b8c6998d-8k564 + ``` + + これで、MinikubeのIPアドレスとNodePort経由で、サンプルアプリにアクセスできるようになりました。次のステップでは、Ingressリソースを使用してアプリにアクセスできるように設定します。 + +## Ingressリソースを作成する + +以下に示すファイルは、hello-world.info経由で送られたトラフィックをServiceに送信するIngressリソースです。 + +1. 以下の内容で`example-ingress.yaml`を作成します。 + + ```yaml + apiVersion: networking.k8s.io/v1beta1 + kind: Ingress + metadata: + name: example-ingress + annotations: + nginx.ingress.kubernetes.io/rewrite-target: /$1 + spec: + rules: + - host: hello-world.info + http: + paths: + - path: / + backend: + serviceName: web + servicePort: 8080 + ``` + +1. 次のコマンドを実行して、Ingressリソースを作成します。 + + ```shell + kubectl apply -f example-ingress.yaml + ``` + + 出力は次のようになります。 + + ```shell + ingress.networking.k8s.io/example-ingress created + ``` + +1. 次のコマンドで、IPアドレスが設定されていることを確認します。 + + ```shell + kubectl get ingress + ``` + + {{< note >}} + このコマンドの実行には数分かかる場合があります。 + {{< /note >}} + + ```shell + NAME HOSTS ADDRESS PORTS AGE + example-ingress hello-world.info 172.17.0.15 80 38s + ``` + +1. 次の行を`/etc/hosts`ファイルの最後に書きます。 + + {{< note >}} + Minikubeをローカル環境で実行している場合、`minikube ip`コマンドを使用すると外部のIPが取得できます。Ingressのリスト内に表示されるIPアドレスは、内部のIPになるはずです。 + {{< /note >}} + + ``` + 172.17.0.15 hello-world.info + ``` + + この設定により、リクエストがhello-world.infoからMinikubeに送信されるようになります。 + +1. Ingressコントローラーがトラフィックを制御していることを確認します。 + + ```shell + curl hello-world.info + ``` + + 出力は次のようになります。 + + ```shell + Hello, world! + Version: 1.0.0 + Hostname: web-55b8c6998d-8k564 + ``` + + {{< note >}} + Minikubeをローカル環境で実行している場合、ブラウザからhello-world.infoにアクセスできます。 + {{< /note >}} + +## 2番目のDeploymentを作成する + +1. 次のコマンドを実行して、v2のDeploymentを作成します。 + + ```shell + kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0 + ``` + + 出力は次のようになります。 + + ```shell + deployment.apps/web2 created + ``` + +1. Deploymentを公開します。 + + ```shell + kubectl expose deployment web2 --port=8080 --type=NodePort + ``` + + 出力は次のようになります。 + + ```shell + service/web2 exposed + ``` + +## Ingressを編集する + +1. 既存の`example-ingress.yaml`を編集して、以下の行を追加します。 + + ```yaml + - path: /v2 + backend: + serviceName: web2 + servicePort: 8080 + ``` + +1. 次のコマンドで変更を適用します。 + + ```shell + kubectl apply -f example-ingress.yaml + ``` + + 出力は次のようになります。 + + ```shell + ingress.networking/example-ingress configured + ``` + +## Ingressを試す + +1. Hello Worldアプリの1番目のバージョンにアクセスします。 + + ```shell + curl hello-world.info + ``` + + 出力は次のようになります。 + + ```shell + Hello, world! + Version: 1.0.0 + Hostname: web-55b8c6998d-8k564 + ``` + +1. Hello Worldアプリの2番目のバージョンにアクセスします。 + + ```shell + curl hello-world.info/v2 + ``` + + 出力は次のようになります。 + + ```shell + Hello, world! + Version: 2.0.0 + Hostname: web2-75cd47646f-t8cjk + ``` + + {{< note >}} + Minikubeをローカル環境で実行している場合、ブラウザからhello-world.infoおよびhello-world.info/v2にアクセスできます。 + {{< /note >}} + + + + +## {{% heading "whatsnext" %}} + +* [Ingress](/ja/docs/concepts/services-networking/ingress/)についてさらに学ぶ。 +* [Ingressコントローラー](/ja/docs/concepts/services-networking/ingress-controllers/)についてさらに学ぶ。 +* [Service](/ja/docs/concepts/services-networking/service/)についてさらに学ぶ。 + + + diff --git a/content/ja/docs/tasks/access-application-cluster/list-all-running-container-images.md b/content/ja/docs/tasks/access-application-cluster/list-all-running-container-images.md new file mode 100644 index 0000000000..3d36d99539 --- /dev/null +++ b/content/ja/docs/tasks/access-application-cluster/list-all-running-container-images.md @@ -0,0 +1,112 @@ +--- +title: クラスターで実行されているすべてのコンテナイメージを一覧表示する +content_type: task +weight: 100 +--- + + + +このページでは、kubectlを使用して、クラスターで実行されているPodのすべてのコンテナイメージを一覧表示する方法を説明します。 + + + +## {{% heading "prerequisites" %}} + + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + + + + + +この演習では、kubectlを使用してクラスターで実行されているすべてのPodを取得し、出力をフォーマットしてそれぞれのコンテナの一覧を取得します。 + +## すべての名前空間のコンテナイメージを一覧表示する {#list-all-container-images-in-all-namespaces} + +- `kubectl get pods --all-namespaces`を使用して、すべての名前空間のPodを取得します +- `-o jsonpath={.. image}`を使用して、コンテナイメージ名のリストのみが含まれるように出力をフォーマットします。これは、返されたjsonの`image`フィールドを再帰的に解析します。 + - jsonpathの使い方については、[jsonpathリファレンス](/docs/user-guide/jsonpath/)を参照してください。 +- `tr`、`sort`、`uniq`などの標準ツールを使用して出力をフォーマットします。 + - `tr`を使用してスペースを改行に置換します。 + - `sort`を使用して結果を並べ替えます。 + - `uniq`を使用してイメージ数を集計します。 + +```sh +kubectl get pods --all-namespaces -o jsonpath="{..image}" |\ +tr -s '[[:space:]]' '\n' |\ +sort |\ +uniq -c +``` + +上記のコマンドは、返されるすべてのアイテムについて、`image`という名前のすべてのフィールドを再帰的に返します。 + +別の方法として、Pod内のimageフィールドへの絶対パスを使用することができます。これにより、フィールド名が繰り返されている場合でも正しいフィールドが取得されます。多くのフィールドは与えられたアイテム内で`name`と呼ばれます: + +```sh +kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" +``` + +jsonpathは次のように解釈されます: + +- `.items[*]`: 各戻り値 +- `.spec`: 仕様の取得 +- `.containers[*]`: 各コンテナ +- `.image`: イメージの取得 + +{{< note >}} +例えば`kubectl get pod nginx`のように名前を指定して単一のPodを取得する場合、アイテムのリストではなく単一のPodが返されるので、パスの`.items[*]`部分は省略してください。 +{{< /note >}} + +## Podごとにコンテナイメージを一覧表示する {#list-container-images-by-pod} + +`range`を使用して要素を個別に繰り返し処理することにより、フォーマットをさらに制御できます。 + +```sh +kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\ +sort +``` + +## Podのラベルを使用してコンテナイメージ一覧をフィルタリングする {#list-container-images-filtering-by-pod-namespace} + +特定のラベルに一致するPodのみを対象とするには、-lフラグを使用します。以下は、`app=nginx`に一致するラベルを持つPodのみに一致します。 + +```sh +kubectl get pods --all-namespaces -o=jsonpath="{..image}" -l app=nginx +``` + +## Podの名前空間でコンテナイメージ一覧をフィルタリングする {#list-container-images-filtering-by-pod-namespace} + +特定の名前空間のPodのみを対象とするには、namespaceフラグを使用します。以下は`kube-system`名前空間のPodのみに一致します。 + +```sh +kubectl get pods --namespace kube-system -o jsonpath="{..image}" +``` + +## jsonpathの代わりにgo-templateを使用してコンテナイメージを一覧表示する {#list-container-images-using-a-go-template-instead-of-jsonpath} + +jsonpathの代わりに、kubectlは[go-templates](https://golang.org/pkg/text/template/)を使用した出力のフォーマットをサポートしています: + + +```sh +kubectl get pods --all-namespaces -o go-template --template="{{range .items}}{{range .spec.containers}}{{.image}} {{end}}{{end}}" +``` + + + + + + + + + +## {{% heading "whatsnext" %}} + + +### 参照 + +* [jsonpath](/docs/user-guide/jsonpath/)参照ガイド +* [Go template](https://golang.org/pkg/text/template/)参照ガイド + + + + diff --git a/content/ja/docs/tasks/access-application-cluster/service-access-application-cluster.md b/content/ja/docs/tasks/access-application-cluster/service-access-application-cluster.md index 8b0439ec3a..1fe8e47e7b 100644 --- a/content/ja/docs/tasks/access-application-cluster/service-access-application-cluster.md +++ b/content/ja/docs/tasks/access-application-cluster/service-access-application-cluster.md @@ -23,7 +23,7 @@ weight: 60 ## {{% heading "objectives" %}} -* 2つのHellow Worldアプリケーションを稼働させる。 +* 2つのHello Worldアプリケーションを稼働させる。 * Nodeのポートを公開するServiceオブジェクトを作成する。 * 稼働しているアプリケーションにアクセスするためにServiceオブジェクトを使用する。 diff --git a/content/ja/docs/tasks/access-application-cluster/web-ui-dashboard.md b/content/ja/docs/tasks/access-application-cluster/web-ui-dashboard.md index 99585c4631..8087e5602e 100644 --- a/content/ja/docs/tasks/access-application-cluster/web-ui-dashboard.md +++ b/content/ja/docs/tasks/access-application-cluster/web-ui-dashboard.md @@ -92,12 +92,12 @@ Kubeconfigの認証方法は、外部IDプロバイダーやx509証明書ベー 例: - ```conf -release=1.0 -tier=frontend -environment=pod -track=stable -``` + ```conf + release=1.0 + tier=frontend + environment=pod + track=stable + ``` - **Namespace**: Kubernetesは、同じ物理クラスターを基盤とする複数の仮想クラスターをサポートしています。これらの仮想クラスタは[名前空間](/docs/tasks/administer-cluster/namespaces/) と呼ばれます。これにより、リソースを論理的に名前のついたグループに分割することができます。 diff --git a/content/ja/docs/tasks/administer-cluster/coredns.md b/content/ja/docs/tasks/administer-cluster/coredns.md new file mode 100644 index 0000000000..068832e852 --- /dev/null +++ b/content/ja/docs/tasks/administer-cluster/coredns.md @@ -0,0 +1,79 @@ +--- +title: サービスディスカバリーにCoreDNSを使用する +min-kubernetes-server-version: v1.9 +content_type: task +--- + + +このページでは、CoreDNSのアップグレードプロセスと、kube-dnsの代わりにCoreDNSをインストールする方法を説明します。 + + +## {{% heading "prerequisites" %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + + + + +## CoreDNSについて {#about-coredns} + +[CoreDNS](https://coredns.io)は、KubernetesクラスターDNSとして稼働させることができる柔軟で拡張可能なDNSサーバーです。Kubernetesと同様に、CoreDNSプロジェクトは{{< glossary_tooltip text="CNCF" term_id="cncf" >}}によってホストされています。 + +既存のデプロイでkube-dnsを置き換えるか、クラスターのデプロイとアップグレードを代行してくれるkubeadmのようなツールを使用することで、クラスターでkube-dnsの代わりにCoreDNSを使用することができます。 + + +## CoreDNSのインストール {#installing-coredns} + +kube-dnsの手動デプロイや置き換えについては、[CoreDNS GitHub project](https://github.com/coredns/deployment/tree/master/kubernetes)のドキュメントを参照してください。 + +## CoreDNSへの移行 {#migrating-to-coredns} + +### kubeadmを使用した既存のクラスターのアップグレード {#upgrading-an-existing-cluster-with-kubeadm} + +Kubernetesバージョン1.10以降では、`kube-dns`を使用しているクラスターを`kubeadm`を使用してアップグレードするときに、CoreDNSに移行することもできます。この場合、`kubeadm`は、`kube-dns` ConfigMapをベースにしてCoreDNS設定("Corefile")を生成し、フェデレーション、スタブドメイン、および上流のネームサーバーの設定を保持します。 + +kube-dnsからCoreDNSに移行する場合は、アップグレード時に必ず`CoreDNS`フィーチャーゲートを`true`に設定してください。たとえば、`v1.11.0`のアップグレードは次のようになります: +``` +kubeadm upgrade apply v1.11.0 --feature-gates=CoreDNS=true +``` + +Kubernetesバージョン1.13以降では、`CoreDNS`フィーチャーゲートが削除され、CoreDNSがデフォルトで使用されます。アップグレードしたクラスターでkube-dnsを使用する場合は、[こちら](/docs/reference/setup-tools/kubeadm/kubeadm-init-phase#cmd-phase-addon)のガイドに従ってください。 + +1.11以前のバージョンでは、Corefileはアップグレード中に作成されたものによって**上書き**されます。**カスタマイズしている場合は、既存のConfigMapを保存する必要があります。** 新しいConfigMapが稼働したら、カスタマイズを再適用できます。 + +Kubernetesバージョン1.11以降でCoreDNSを実行している場合、アップグレード中、既存のCorefileは保持されます。 + + +### kubeadmを使用してCoreDNSの代わりにkube-dnsをインストールする {#installing-kube-dns-instead-of-coredns-with-kubeadm} + +{{< note >}} +Kubernetes 1.11では、CoreDNSは一般利用可能(GA)にアップグレードされ、デフォルトでインストールされます。 +{{< /note >}} + +1.13以前のバージョンにkube-dnsをインストールするには、`CoreDNS`フィーチャーゲートの値を`false`に設定します: + +``` +kubeadm init --feature-gates=CoreDNS=false +``` + +バージョン1.13以降の場合は、[こちら](/docs/reference/setup-tools/kubeadm/kubeadm-init-phase#cmd-phase-addon)に記載されているガイドに従ってください。 + +## CoreDNSのアップグレード {#upgrading-coredns} + +CoreDNSはv1.9以降のKubernetesで使用できます。Kubernetesに同梱されているCoreDNSのバージョンと、CoreDNSに加えられた変更は[こちら](https://github.com/coredns/deployment/blob/master/kubernetes/CoreDNS-k8s_version.md)で確認できます。 + +CoreDNSだけをアップグレードしたい場合や、独自のカスタムイメージを使用したい場合は、CoreDNSを手動でアップグレードすることができます。スムーズなアップグレードのために役立つ[ガイドラインとウォークスルー](https://github.com/coredns/deployment/blob/master/kubernetes/Upgrading_CoreDNS.md)が用意されています。 + +## CoreDNSのチューニング {#tuning-coredns} + +リソース使用率が問題になる場合は、CoreDNSの設定を調整すると役立つ場合があります。詳細は、[CoreDNSのスケーリングに関するドキュメント](https://github.com/coredns/deployment/blob/master/kubernetes/Scaling_CoreDNS.md)を参照してください。 + + + +## {{% heading "whatsnext" %}} + + +[CoreDNS](https://coredns.io)は、`Corefile`を変更することで、kube-dnsよりも多くのユースケースをサポートするように設定することができます。詳細は[CoreDNSサイト](https://coredns.io/2017/05/08/custom-dns-entries-for-kubernetes/)を参照してください。 + + + diff --git a/content/ja/docs/tasks/administer-cluster/extended-resource-node.md b/content/ja/docs/tasks/administer-cluster/extended-resource-node.md new file mode 100644 index 0000000000..59156efd89 --- /dev/null +++ b/content/ja/docs/tasks/administer-cluster/extended-resource-node.md @@ -0,0 +1,169 @@ +--- +title: 拡張リソースをNodeにアドバタイズする +content_type: task +--- + + + +このページでは、Nodeに対して拡張リソースを指定する方法を説明します。拡張リソースを利用すると、Kubernetesにとって未知のノードレベルのリソースをクラスター管理者がアドバタイズできるようになります。 + +## {{% heading "prerequisites" %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + + + +## Nodeの名前を取得する + +```shell +kubectl get nodes +``` + +この練習で使いたいNodeを1つ選んでください。 + +## Nodeの1つで新しい拡張リソースをアドバタイズする + +Node上の新しい拡張リソースをアドバタイズするには、HTTPのPATCHリクエストをKubernetes APIサーバーに送ります。たとえば、Nodeの1つに4つのドングルが接続されているとします。以下に、4つのドングルリソースをNodeにアドバタイズするPATCHリクエストの例を示します。 + +```shell +PATCH /api/v1/nodes/<選択したNodeの名前>/status HTTP/1.1 +Accept: application/json +Content-Type: application/json-patch+json +Host: k8s-master:8080 + +[ + { + "op": "add", + "path": "/status/capacity/example.com~1dongle", + "value": "4" + } +] +``` + +Kubernetesは、ドングルとは何かも、ドングルが何に利用できるのかを知る必要もないことに注意してください。上のPATCHリクエストは、ただNodeが4つのドングルと呼ばれるものを持っているとKubernetesに教えているだけです。 + +Kubernetes APIサーバーに簡単にリクエストを送れるように、プロキシーを実行します。 + +```shell +kubectl proxy +``` + +もう1つのコマンドウィンドウを開き、HTTPのPATCHリクエストを送ります。`<選択したNodeの名前>`の部分は、選択したNodeの名前に置き換えてください。 + +```shell +curl --header "Content-Type: application/json-patch+json" \ +--request PATCH \ +--data '[{"op": "add", "path": "/status/capacity/example.com~1dongle", "value": "4"}]' \ +http://localhost:8001/api/v1/nodes/<選択したNodeの名前>/status +``` + +{{< note >}} +上のリクエストにある`~1`は、PATCHのパスにおける`/`という文字をエンコーディングしたものです。JSON-Patch内のoperationのpathはJSON-Pointerとして解釈されます。詳細については、[IETF RFC 6901](https://tools.ietf.org/html/rfc6901)のsection 3を読んでください。 +{{< /note >}} + +出力には、Nodeがキャパシティー4のdongleを持っていることが示されます。 + +``` +"capacity": { + "cpu": "2", + "memory": "2049008Ki", + "example.com/dongle": "4", +``` + +Nodeの説明を確認します。 + +``` +kubectl describe node <選択したNodeの名前> +``` + +出力には、再びdongleリソースが表示されます。 + +```yaml +Capacity: + cpu: 2 + memory: 2049008Ki + example.com/dongle: 4 +``` + +これで、アプリケーション開発者は特定の数のdongleをリクエストするPodを作成できるようになりました。詳しくは、[拡張リソースをコンテナに割り当てる](/docs/tasks/configure-pod-container/extended-resource/)を読んでください。 + +## 議論 + +拡張リソースは、メモリやCPUリソースと同様のものです。たとえば、Nodeが持っている特定の量のメモリやCPUがNode上で動作している他のすべてのコンポーネントと共有されるのと同様に、Nodeが搭載している特定の数のdongleが他のすべてのコンポーネントと共有されます。そして、アプリケーション開発者が特定の量のメモリとCPUをリクエストするPodを作成できるのと同様に、Nodeが搭載している特定の数のdongleをリクエストするPodが作成できます。 + +拡張リソースはKubernetesには詳細を意図的に公開しないため、Kubernetesは拡張リソースの実体をまったく知りません。Kubernetesが知っているのは、Nodeが特定の数の拡張リソースを持っているということだけです。拡張リソースは整数値でアドバタイズしなければなりません。たとえば、Nodeは4つのdongleをアドバタイズできますが、4.5のdongleというのはアドバタイズできません。 + +### Storageの例 + +Nodeに800GiBの特殊なディスクストレージがあるとします。この特殊なストレージの名前、たとえばexample.com/special-storageという名前の拡張リソースが作れます。そして、そのなかの一定のサイズ、たとえば100GiBのチャンクをアドバタイズできます。この場合、Nodeはexample.com/special-storageという種類のキャパシティ8のリソースを持っているとアドバタイズします。 + +```yaml +Capacity: + ... + example.com/special-storage: 8 +``` + +特殊なストレージに任意のサイズのリクエストを許可したい場合、特殊なストレージを1バイトのサイズのチャンクでアドバタイズできます。その場合、example.com/special-storageという種類の800Giのリソースとしてアドバタイズします。 + +```yaml +Capacity: + ... + example.com/special-storage: 800Gi +``` + +すると、コンテナは好きなバイト数の特殊なストレージを最大800Giまでリクエストできるようになります。 + +## クリーンアップ + +以下に、dongleのアドバタイズをNodeから削除するPATCHリクエストを示します。 + +``` +PATCH /api/v1/nodes/<選択したNodeの名前>/status HTTP/1.1 +Accept: application/json +Content-Type: application/json-patch+json +Host: k8s-master:8080 + +[ + { + "op": "remove", + "path": "/status/capacity/example.com~1dongle", + } +] +``` + +Kubernetes APIサーバーに簡単にリクエストを送れるように、プロキシーを実行します。 + +```shell +kubectl proxy +``` + +もう1つのコマンドウィンドウで、HTTPのPATCHリクエストを送ります。`<選択したNodeの名前>`の部分は、選択したNodeの名前に置き換えてください。 + +```shell +curl --header "Content-Type: application/json-patch+json" \ +--request PATCH \ +--data '[{"op": "remove", "path": "/status/capacity/example.com~1dongle"}]' \ +http://localhost:8001/api/v1/nodes/<選択したNodeの名前>/status +``` + +dongleのアドバタイズが削除されたことを検証します。 + +``` +kubectl describe node <選択したNodeの名前> | grep dongle +``` + +(出力には何も表示されないはずです) + +## {{% heading "whatsnext" %}} + +### アプリケーション開発者向け + +* [拡張リソースをコンテナに割り当てる](/ja/docs/tasks/configure-pod-container/extended-resource/) + +### クラスター管理者向け + +* [Namespaceに対してメモリの最小値と最大値の制約を設定する](/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/) +* [Namespaceに対してCPUの最小値と最大値の制約を設定する](/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/) + + + diff --git a/content/ja/docs/tasks/administer-cluster/running-cloud-controller.md b/content/ja/docs/tasks/administer-cluster/running-cloud-controller.md index e98cee60d8..9a06821517 100644 --- a/content/ja/docs/tasks/administer-cluster/running-cloud-controller.md +++ b/content/ja/docs/tasks/administer-cluster/running-cloud-controller.md @@ -9,7 +9,7 @@ content_type: concept Kubernetes v1.6では`cloud-controller-manager`という新しいバイナリが導入されました。`cloud-controller-manager`はクラウド固有の制御ループを組み込むデーモンです。これらのクラウド固有の制御ループはもともと`kube-controller-manager`にありました。クラウドプロバイダーはKubernetesプロジェクトとは異なるペースで開発およびリリースされるため、プロバイダー固有のコードを`cloud-controller-manager`バイナリに抽象化することでクラウドベンダーはKubernetesのコアのコードとは独立して開発が可能となりました。 -`cloud-controller-manager`は、[cloudprovider.Interface](https://github.com/kubernetes/cloud-provider/blob/master/cloud.go)を満たす任意のクラウドプロバイダーと接続できます。下位互換性のためにKubernetesのコアプロジェクトで提供される[cloud-controller-manager](https://github.com/kubernetes/kubernetes/tree/master/cmd/cloud-controller-manager)は`kube-controller-manager`と同じクラウドライブラリを使用します。Kubernetesのコアリポジトリで既にサポートされているクラウドプロバイダーは、Kubernetesリポジトリにあるcloud-controller-managerを使用してKubernetesのコアから移行することが期待されています。今後のKubernetesのリリースでは、すべてのクラウドコントローラーマネージャーはsigリードまたはクラウドベンダーが管理するKubernetesのコアプロジェクトの外で開発される予定です。 +`cloud-controller-manager`は、[cloudprovider.Interface](https://github.com/kubernetes/cloud-provider/blob/master/cloud.go)を満たす任意のクラウドプロバイダーと接続できます。下位互換性のためにKubernetesのコアプロジェクトで提供される[cloud-controller-manager](https://github.com/kubernetes/kubernetes/tree/master/cmd/cloud-controller-manager)は`kube-controller-manager`と同じクラウドライブラリを使用します。Kubernetesのコアリポジトリですでにサポートされているクラウドプロバイダーは、Kubernetesリポジトリにあるcloud-controller-managerを使用してKubernetesのコアから移行することが期待されています。今後のKubernetesのリリースでは、すべてのクラウドコントローラーマネージャーはsigリードまたはクラウドベンダーが管理するKubernetesのコアプロジェクトの外で開発される予定です。 @@ -24,7 +24,7 @@ Kubernetes v1.6では`cloud-controller-manager`という新しいバイナリが * クラウドの認証/認可: クラウドではAPIへのアクセスを許可するためにトークンまたはIAMルールが必要になる場合があります * kubernetesの認証/認可: cloud-controller-managerは、kubernetes apiserverと通信するためにRBACルールの設定を必要とする場合があります -* 高可用性: kube-controller-managerのように、リーダー選出を使用したクラウドコントローラーマネージャーの高可用性のセットアップが必要になる場合があります(デフォルトでオンになっています)。 +* 高可用性: kube-controller-managerのように、リーダー選出を使用したクラウドコントローラーマネージャーの高可用性のセットアップが必要になる場合があります(デフォルトでオンになっています)。 ### cloud-controller-managerを動かす @@ -35,7 +35,7 @@ cloud-controller-managerを正常に実行するにはクラスター構成に クラウドコントローラーマネージャーを使用するようにクラスターを設定するとクラスターの動作がいくつか変わることに注意してください。 -* `--cloud-provider=external`を指定したkubeletは、初期化時に`NoSchedule`の`node.cloudprovider.kubernetes.io/uninitialized`汚染を追加します。これによりノードは作業をスケジュールする前に外部のコントローラーからの2回目の初期化が必要であるとマークされます。クラウドコントローラーマネージャーが使用できない場合クラスター内の新しいノードはスケジュールできないままになることに注意してください。スケジューラーはリージョンやタイプ(高CPU、GPU、高メモリ、スポットインスタンスなど)などのノードに関するクラウド固有の情報を必要とする場合があるためこの汚染は重要です。 +* `--cloud-provider=external`を指定したkubeletは、初期化時に`NoSchedule`の`node.cloudprovider.kubernetes.io/uninitialized`汚染を追加します。これによりノードは作業をスケジュールする前に外部のコントローラーからの2回目の初期化が必要であるとマークされます。クラウドコントローラーマネージャーが使用できない場合クラスター内の新しいノードはスケジュールできないままになることに注意してください。スケジューラーはリージョンやタイプ(高CPU、GPU、高メモリ、スポットインスタンスなど)などのノードに関するクラウド固有の情報を必要とする場合があるためこの汚染は重要です。 * クラスター内のノードに関するクラウド情報はローカルメタデータを使用して取得されなくなりましたが、代わりにノード情報を取得するためのすべてのAPI呼び出しはクラウドコントローラーマネージャーを経由して行われるようになります。これはセキュリティを向上させるためにkubeletでクラウドAPIへのアクセスを制限できることを意味します。大規模なクラスターではクラスター内からクラウドのほとんどすべてのAPI呼び出しを行うため、クラウドコントローラーマネージャーがレートリミットに達するかどうかを検討する必要があります。 v1.8の時点でクラウドコントローラーマネージャーは以下を実装できます。 @@ -69,7 +69,7 @@ Kubernetesのコアリポジトリにないクラウドコントローラーマ ### ボリュームのサポート -ボリュームの統合にはkubeletとの調整も必要になるためクラウドコントローラーマネージャーは`kube-controller-manager`にあるボリュームコントローラーを実装しません。CSI(コンテナストレージインターフェイス)が進化してFlexボリュームプラグインの強力なサポートが追加されるにつれ、クラウドがボリュームと完全に統合できるようクラウドコントローラーマネージャーに必要なサポートが追加されます。Kubernetesリポジトリの外部にあるCSIボリュームプラグインの詳細については[こちら](https://github.com/kubernetes/features/issues/178)をご覧ください。 +ボリュームの統合にはkubeletとの調整も必要になるためクラウドコントローラーマネージャーは`kube-controller-manager`にあるボリュームコントローラーを実装しません。CSI(コンテナストレージインターフェイス)が進化してFlexボリュームプラグインの強力なサポートが追加されるにつれ、クラウドがボリュームと完全に統合できるようクラウドコントローラーマネージャーに必要なサポートが追加されます。Kubernetesリポジトリの外部にあるCSIボリュームプラグインの詳細については[こちら](https://github.com/kubernetes/features/issues/178)をご覧ください。 ### スケーラビリティ @@ -79,7 +79,7 @@ Kubernetesのコアリポジトリにないクラウドコントローラーマ クラウドコントローラーマネージャープロジェクトの目標はKubernetesのコアプロジェクトからクラウドに関する機能の開発を切り離すことです。残念ながら、Kubernetesプロジェクトの多くの面でクラウドプロバイダーの機能がKubernetesプロジェクトに緊密に結びついているという前提があります。そのため、この新しいアーキテクチャを採用するとクラウドプロバイダーの情報を要求する状況が発生する可能性がありますが、クラウドコントローラーマネージャーはクラウドプロバイダーへのリクエストが完了するまでその情報を返すことができない場合があります。 -これの良い例は、KubeletのTLSブートストラップ機能です。現在、TLSブートストラップはKubeletがすべてのアドレスタイプ(プライベート、パブリックなど)をクラウドプロバイダー(またはローカルメタデータサービス)に要求する能力を持っていると仮定していますが、クラウドコントローラーマネージャーは最初に初期化されない限りノードのアドレスタイプを設定できないためapiserverと通信するためにはkubeletにTLS証明書が必要です。 +これの良い例は、KubeletのTLSブートストラップ機能です。現在、TLSブートストラップはKubeletがすべてのアドレスタイプ(プライベート、パブリックなど)をクラウドプロバイダー(またはローカルメタデータサービス)に要求する能力を持っていると仮定していますが、クラウドコントローラーマネージャーは最初に初期化されない限りノードのアドレスタイプを設定できないためapiserverと通信するためにはkubeletにTLS証明書が必要です。 このイニシアチブが成熟するに連れ、今後のリリースでこれらの問題に対処するための変更が行われます。 diff --git a/content/ja/docs/tasks/configure-pod-container/assign-cpu-resource.md b/content/ja/docs/tasks/configure-pod-container/assign-cpu-resource.md index 5940705cdd..8091ded576 100644 --- a/content/ja/docs/tasks/configure-pod-container/assign-cpu-resource.md +++ b/content/ja/docs/tasks/configure-pod-container/assign-cpu-resource.md @@ -196,7 +196,7 @@ kubectl delete pod cpu-demo-2 --namespace=cpu-example クラスターで動作するコンテナにCPU要求と制限を設定することで、クラスターのノードで利用可能なCPUリソースを効率的に使用することができます。PodのCPU要求を低く保つことで、Podがスケジュールされやすくなります。CPU要求よりも大きい制限を与えることで、次の2つを実現できます: -* Podは利用可能なCPUリソースを、突発的な活動(バースト)に使用することができます。 +* Podは利用可能なCPUリソースを、突発的な活動(バースト)に使用することができます。 * バースト中のPodのCPUリソース量は、適切な量に制限されます。 diff --git a/content/ja/docs/tasks/configure-pod-container/assign-memory-resource.md b/content/ja/docs/tasks/configure-pod-container/assign-memory-resource.md index fb361dfa72..1af80012fc 100644 --- a/content/ja/docs/tasks/configure-pod-container/assign-memory-resource.md +++ b/content/ja/docs/tasks/configure-pod-container/assign-memory-resource.md @@ -97,7 +97,7 @@ resources: kubectl top pod memory-demo --namespace=mem-example ``` -この出力では、Podが約162,900,000バイト(約150MiB)のメモリーを使用していることを示しています。Podの100MiBの要求を超えていますが、200MiBの制限には収まっています。 +この出力では、Podが約162,900,000バイト(約150MiB)のメモリーを使用していることを示しています。Podの100MiBの要求を超えていますが、200MiBの制限には収まっています。 ``` NAME CPU(cores) MEMORY(bytes) @@ -278,7 +278,7 @@ kubectl delete pod memory-demo-3 --namespace=mem-example クラスターで動作するコンテナにメモリー要求と制限を設定することで、クラスターのノードで利用可能なメモリーリソースを効率的に使用することができます。Podのメモリー要求を低く保つことで、Podがスケジュールされやすくなります。メモリー要求よりも大きい制限を与えることで、次の2つを実現できます: -* Podは利用可能なメモリーを、突発的な活動(バースト)に使用することができます。 +* Podは利用可能なメモリーを、突発的な活動(バースト)に使用することができます。 * バースト中のPodのメモリー使用量は、適切な量に制限されます。 ## クリーンアップ diff --git a/content/ja/docs/tasks/configure-pod-container/assign-pods-nodes.md b/content/ja/docs/tasks/configure-pod-container/assign-pods-nodes.md new file mode 100644 index 0000000000..e2e4e1d647 --- /dev/null +++ b/content/ja/docs/tasks/configure-pod-container/assign-pods-nodes.md @@ -0,0 +1,93 @@ +--- +title: Podをノードに割り当てる +content_type: task +weight: 120 +--- + + +このページでは、KubernetesのPodをKubernetesクラスター上の特定のノードに割り当てる方法を説明します。 + +## {{% heading "prerequisites" %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + + + +## ラベルをノードに追加する + +1. クラスター内の{{< glossary_tooltip term_id="node" text="ノード" >}}のリストをラベル付きで表示します。 + + ```shell + kubectl get nodes --show-labels + ``` + + 出力は次のようになります。 + + ```shell + NAME STATUS ROLES AGE VERSION LABELS + worker0 Ready 1d v1.13.0 ...,kubernetes.io/hostname=worker0 + worker1 Ready 1d v1.13.0 ...,kubernetes.io/hostname=worker1 + worker2 Ready 1d v1.13.0 ...,kubernetes.io/hostname=worker2 + ``` +1. ノードの1つを選択して、ラベルを追加します。 + + ```shell + kubectl label nodes disktype=ssd + ``` + + ここで、``は選択したノードの名前です。 + +1. 選択したノードに`disktype=ssd`ラベルがあることを確認します。 + + ```shell + kubectl get nodes --show-labels + ``` + + 出力は次のようになります。 + + ```shell + NAME STATUS ROLES AGE VERSION LABELS + worker0 Ready 1d v1.13.0 ...,disktype=ssd,kubernetes.io/hostname=worker0 + worker1 Ready 1d v1.13.0 ...,kubernetes.io/hostname=worker1 + worker2 Ready 1d v1.13.0 ...,kubernetes.io/hostname=worker2 + ``` + + 上の出力を見ると、`worker0`に`disktype=ssd`というラベルがあることがわかります。 + +## 選択したノードにスケジューリングされるPodを作成する + +以下のPodの構成ファイルには、nodeSelectorに`disktype: ssd`を持つPodが書かれています。これにより、Podは`disktype: ssd`というラベルを持っているノードにスケジューリングされるようになります。 + +{{< codenew file="pods/pod-nginx.yaml" >}} + +1. 構成ファイルを使用して、選択したノードにスケジューリングされるPodを作成します。 + + ```shell + kubectl apply -f https://k8s.io/examples/pods/pod-nginx.yaml + ``` + +1. Podが選択したノード上で実行されているをことを確認します。 + + ```shell + kubectl get pods --output=wide + ``` + + 出力は次のようになります。 + + ```shell + NAME READY STATUS RESTARTS AGE IP NODE + nginx 1/1 Running 0 13s 10.200.0.4 worker0 + ``` + +## 特定のノードにスケジューリングされるPodを作成する + +`nodeName`という設定を使用して、Podを特定のノードにスケジューリングすることもできます。 + +{{< codenew file="pods/pod-nginx-specific-node.yaml" >}} + +構成ファイルを使用して、`foo-node`にだけスケジューリングされるPodを作成します。 + +## {{% heading "whatsnext" %}} + +* [ラベルとセレクター](/ja/docs/concepts/overview/working-with-objects/labels/)についてさらに学ぶ。 +* [ノード](/ja/docs/concepts/architecture/nodes/)についてさらに学ぶ。 diff --git a/content/ja/docs/tasks/configure-pod-container/configure-projected-volume-storage.md b/content/ja/docs/tasks/configure-pod-container/configure-projected-volume-storage.md index f8e7341bb2..c67c826c4d 100644 --- a/content/ja/docs/tasks/configure-pod-container/configure-projected-volume-storage.md +++ b/content/ja/docs/tasks/configure-pod-container/configure-projected-volume-storage.md @@ -5,7 +5,7 @@ weight: 70 --- -このページでは、[`projected`](/docs/concepts/storage/volumes/#projected)(投影)ボリュームを使用して、既存の複数のボリュームソースを同一ディレクトリ内にマウントする方法を説明します。 +このページでは、[`projected`](/docs/concepts/storage/volumes/#projected)(投影)ボリュームを使用して、既存の複数のボリュームソースを同一ディレクトリ内にマウントする方法を説明します。 現在、`secret`、`configMap`、`downwardAPI`および`serviceAccountToken`ボリュームを投影できます。 {{< note >}} diff --git a/content/ja/docs/tasks/configure-pod-container/configure-volume-storage.md b/content/ja/docs/tasks/configure-pod-container/configure-volume-storage.md index 87fa5d965e..a7bb1a0d65 100644 --- a/content/ja/docs/tasks/configure-pod-container/configure-volume-storage.md +++ b/content/ja/docs/tasks/configure-pod-container/configure-volume-storage.md @@ -87,7 +87,7 @@ weight: 50 root@redis:/data/redis# kill ``` - ここで``はRedisプロセスID(PID)です。 + ここで``はRedisプロセスID(PID)です。 1. 元の端末で、Redis Podへの変更を監視します。最終的には、このようなものが表示されます: diff --git a/content/ja/docs/tasks/configure-pod-container/extended-resource.md b/content/ja/docs/tasks/configure-pod-container/extended-resource.md new file mode 100644 index 0000000000..b056fc7389 --- /dev/null +++ b/content/ja/docs/tasks/configure-pod-container/extended-resource.md @@ -0,0 +1,124 @@ +--- +title: 拡張リソースをコンテナに割り当てる +content_type: task +weight: 40 +--- + + + +{{< feature-state state="stable" >}} + +このページでは、拡張リソースをコンテナに割り当てる方法について説明します。 + +## {{% heading "prerequisites" %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + +この練習を始める前に、[Nodeに拡張リソースをアドバタイズする](/ja/docs/tasks/administer-cluster/extended-resource-node/)の練習を行ってください。これにより、Nodeの1つがドングルリソースをアドバタイズするように設定されます。 + + + +## 拡張リソースをPodに割り当てる + +拡張リソースをリクエストするには、コンテナのマニフェストに`resources:requests`フィールドを含めます。拡張リソースは、`*.kubernetes.io/`以外の任意のドメインで完全修飾されます。有効な拡張リソース名は、`example.com/foo`という形式になります。ここで、`example.com`はあなたの組織のドメインで、`foo`は記述的なリソース名で置き換えます。 + +1つのコンテナからなるPodの構成ファイルを示します。 + +{{< codenew file="pods/resource/extended-resource-pod.yaml" >}} + +構成ファイルでは、コンテナが3つのdongleをリクエストしていることがわかります。 + +次のコマンドでPodを作成します。 + +```shell +kubectl apply -f https://k8s.io/examples/pods/resource/extended-resource-pod.yaml +``` + +Podが起動したことを確認します。 + +```shell +kubectl get pod extended-resource-demo +``` + +Podの説明を表示します。 + +```shell +kubectl describe pod extended-resource-demo +``` + +dongleのリクエストが表示されます。 + +```yaml +Limits: + example.com/dongle: 3 +Requests: + example.com/dongle: 3 +``` + +## 2つ目のPodの作成を試みる + +以下に、1つのコンテナを持つPodの構成ファイルを示します。コンテナは2つのdongleをリクエストします。 + +{{< codenew file="pods/resource/extended-resource-pod-2.yaml" >}} + +Kubernetesは、2つのdongleのリクエストを満たすことができません。1つ目のPodが、利用可能な4つのdongleのうち3つを使用してしまっているためです。 + +Podを作成してみます。 + +```shell +kubectl apply -f https://k8s.io/examples/pods/resource/extended-resource-pod-2.yaml +``` + +Podの説明を表示します。 + +```shell +kubectl describe pod extended-resource-demo-2 +``` + +出力にはPodがスケジュールできないことが示されます。2つのdongleが利用できるNodeが存在しないためです。 + +``` +Conditions: + Type Status + PodScheduled False +... +Events: + ... + ... Warning FailedScheduling pod (extended-resource-demo-2) failed to fit in any node +fit failure summary on nodes : Insufficient example.com/dongle (1) +``` + +Podのステータスを表示します。 + +```shell +kubectl get pod extended-resource-demo-2 +``` + +出力には、Podは作成されたものの、Nodeにスケジュールされなかったことが示されています。PodはPending状態になっています。 + +```yaml +NAME READY STATUS RESTARTS AGE +extended-resource-demo-2 0/1 Pending 0 6m +``` + +## クリーンアップ + +この練習で作成したPodを削除します。 + +```shell +kubectl delete pod extended-resource-demo +kubectl delete pod extended-resource-demo-2 +``` + +## {{% heading "whatsnext" %}} + +### アプリケーション開発者向け + +* [コンテナおよびPodへのメモリーリソースの割り当て](/ja/docs/tasks/configure-pod-container/assign-memory-resource/) +* [コンテナおよびPodへのCPUリソースの割り当て](/ja/docs/tasks/configure-pod-container/assign-cpu-resource/) + +### クラスター管理者向け + +* [Nodeに拡張リソースをアドバタイズする](/ja/docs/tasks/administer-cluster/extended-resource-node/) + + diff --git a/content/ja/docs/tasks/configure-pod-container/share-process-namespace.md b/content/ja/docs/tasks/configure-pod-container/share-process-namespace.md index 513da2365c..b5fd61777e 100644 --- a/content/ja/docs/tasks/configure-pod-container/share-process-namespace.md +++ b/content/ja/docs/tasks/configure-pod-container/share-process-namespace.md @@ -97,7 +97,7 @@ Podは多くのリソースを共有するため、プロセスの名前空間 ただし、一部のコンテナイメージは他のコンテナから分離されることが期待されるため、これらの違いを理解することが重要です: 1. **コンテナプロセスは PID 1ではなくなります。** - 一部のコンテナイメージは、PID 1なしで起動することを拒否し(たとえば、`systemd`を使用するコンテナ)、`kill -HUP 1`などのコマンドを実行してコンテナプロセスにシグナルを送信します。 + 一部のコンテナイメージは、PID 1なしで起動することを拒否し(たとえば、`systemd`を使用するコンテナ)、`kill -HUP 1`などのコマンドを実行してコンテナプロセスにシグナルを送信します。 共有プロセス名前空間を持つPodでは、`kill -HUP 1`はPodサンドボックスにシグナルを送ります。(上の例では`/pause`) 1. **プロセスはPod内の他のコンテナに表示されます。** diff --git a/content/ja/docs/tasks/debug-application-cluster/debug-init-containers.md b/content/ja/docs/tasks/debug-application-cluster/debug-init-containers.md index 5577881c95..fa5255ca7f 100644 --- a/content/ja/docs/tasks/debug-application-cluster/debug-init-containers.md +++ b/content/ja/docs/tasks/debug-application-cluster/debug-init-containers.md @@ -14,7 +14,7 @@ content_type: task {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} -* [Initコンテナ](/ja/docs/concepts/abstractions/init-containers/)の基本を理解しておきましょう。 +* [Initコンテナ](/ja/docs/concepts/workloads/pods/init-containers/)の基本を理解しておきましょう。 * [Initコンテナを設定](/docs/tasks/configure-pod-container/configure-pod-initialization/#creating-a-pod-that-has-an-init-container/)しておきましょう。 @@ -100,7 +100,7 @@ kubectl logs -c -## Podのステータスを理解する +## Podのステータスを理解する {#understanding-pod-status} `Init:`で始まるPodステータスはInitコンテナの実行ステータスを要約します。以下の表は、Initコンテナのデバッグ中に表示される可能性のあるステータス値の例をいくつか示しています。 diff --git a/content/ja/docs/tasks/debug-application-cluster/debug-service.md b/content/ja/docs/tasks/debug-application-cluster/debug-service.md index c4c965458b..a8332cbcfb 100644 --- a/content/ja/docs/tasks/debug-application-cluster/debug-service.md +++ b/content/ja/docs/tasks/debug-application-cluster/debug-service.md @@ -4,9 +4,7 @@ title: Serviceのデバッグ --- -新規にKubernetesをインストールした環境でかなり頻繁に発生する問題は、Serviceが適切に機能しないというものです。 -Deployment(または他のワークロードコントローラー)を通じてPodを実行し、サービスを作成したにもかかわらず、アクセスしようとしても応答がありません。 -何が問題になっているのかを理解するのに、このドキュメントがきっと役立つでしょう。 +新規にKubernetesをインストールした環境でかなり頻繁に発生する問題は、Serviceが適切に機能しないというものです。Deployment(または他のワークロードコントローラー)を通じてPodを実行し、サービスを作成したにもかかわらず、アクセスしようとしても応答がありません。何が問題になっているのかを理解するのに、このドキュメントがきっと役立つでしょう。 @@ -16,8 +14,7 @@ Deployment(または他のワークロードコントローラー)を通じ ## Pod内でコマンドを実行する -ここでの多くのステップでは、クラスターで実行されているPodが見ているものを確認する必要があります。 -これを行う最も簡単な方法は、インタラクティブなalpineのPodを実行することです。 +ここでの多くのステップでは、クラスターで実行されているPodが見ているものを確認する必要があります。これを行う最も簡単な方法は、インタラクティブなalpineのPodを実行することです。 ```none kubectl run -it --rm --restart=Never alpine --image=alpine sh @@ -27,7 +24,7 @@ kubectl run -it --rm --restart=Never alpine --image=alpine sh コマンドプロンプトが表示されない場合は、Enterキーを押してみてください。 {{< /note >}} -使用したい実行中のPodが既にある場合は、以下のようにしてそのPod内でコマンドを実行できます。 +使用したい実行中のPodがすでにある場合は、以下のようにしてそのPod内でコマンドを実行できます。 ```shell kubectl exec -c -- @@ -35,8 +32,7 @@ kubectl exec -c -- ## セットアップ -このドキュメントのウォークスルーのために、いくつかのPodを実行しましょう。 -おそらくあなた自身のServiceをデバッグしているため、あなた自身の詳細に置き換えることもできますし、これに沿って2番目のデータポイントを取得することもできます。 +このドキュメントのウォークスルーのために、いくつかのPodを実行しましょう。おそらくあなた自身のServiceをデバッグしているため、あなた自身の詳細に置き換えることもできますし、これに沿って2番目のデータポイントを取得することもできます。 ```shell kubectl run hostnames --image=k8s.gcr.io/serve_hostname \ @@ -48,7 +44,7 @@ deployment.apps/hostnames created `kubectl`コマンドは作成、変更されたリソースのタイプと名前を出力するため、この後のコマンドで使用することもできます。 -{{< note >}} + これは、次のYAMLでDeploymentを開始した場合と同じです。 ```yaml @@ -72,7 +68,6 @@ spec: ``` "run"ラベルは`kubectl run`によって、Deploymentの名前に自動的にセットされます。 -{{< /note >}} Podが実行されていることを確認できます。 @@ -86,8 +81,7 @@ hostnames-632524106-ly40y 1/1 Running 0 2m hostnames-632524106-tlaok 1/1 Running 0 2m ``` -Podが機能していることも確認できます。 -Pod IP アドレスリストを取得し、直接テストできます。 +Podが機能していることも確認できます。Pod IP アドレスリストを取得し、直接テストできます。 ```shell kubectl get pods -l run=hostnames \ @@ -117,8 +111,7 @@ hostnames-bvc05 hostnames-yp2kp ``` -この時点で期待通りの応答が得られない場合、Podが正常でないか、想定しているポートでリッスンしていない可能性があります。 -なにが起きているかを確認するために`kubectl logs`が役立ちます、Podに直接に入りデバッグする場合は `kubectl exec`が必要になります。 +この時点で期待通りの応答が得られない場合、Podが正常でないか、想定しているポートでリッスンしていない可能性があります。なにが起きているかを確認するために`kubectl logs`が役立ちます。Podに直接に入りデバッグする場合は`kubectl exec`が必要になります。 これまでにすべての計画が完了していると想定すると、Serviceが機能しない理由を調査することができます。 @@ -126,8 +119,7 @@ hostnames-yp2kp 賢明な読者は、Serviceをまだ実際に作成していないことにお気付きかと思いますが、これは意図的です。これは時々忘れられるステップであり、最初に確認すべきことです。 -存在しないServiceにアクセスしようとするとどうなるでしょうか? -このServiceを名前で利用する別のPodがあると仮定すると、次のような結果が得られます。 +存在しないServiceにアクセスしようとするとどうなるでしょうか?このServiceを名前で利用する別のPodがあると仮定すると、次のような結果が得られます。 ```shell wget -O- hostnames @@ -147,8 +139,7 @@ No resources found. Error from server (NotFound): services "hostnames" not found ``` -Serviceを作成しましょう。 -前と同様に、これはウォークスルー用です。ご自身のServiceの詳細を使用することもできます。 +Serviceを作成しましょう。前と同様に、これはウォークスルー用です。ご自身のServiceの詳細を使用することもできます。 ```shell kubectl expose deployment hostnames --port=80 --target-port=9376 @@ -169,7 +160,6 @@ hostnames ClusterIP 10.0.1.175 80/TCP 5s これで、Serviceが存在することがわかりました。 -{{< note >}} 前と同様に、これは次のようなYAMLでServiceを開始した場合と同じです。 ```yaml @@ -187,14 +177,11 @@ spec: targetPort: 9376 ``` -構成の全範囲をハイライトするため、ここで作成したServiceはPodとは異なるポート番号を使用します。 -多くの実際のServiceでは、これらのポートは同じになる場合があります。 -{{< /note >}} +構成の全範囲をハイライトするため、ここで作成したServiceはPodとは異なるポート番号を使用します。多くの実際のServiceでは、これらのポートは同じになる場合があります。 ## サービスはDNS名によって機能しているか? -クライアントがサービスを使用する最も一般的な方法の1つは、DNS名を使用することです。 -同じNamespaceのPodから次のコマンドを実行してください。 +クライアントがサービスを使用する最も一般的な方法の1つは、DNS名を使用することです。同じNamespaceのPodから次のコマンドを実行してください。 ```shell nslookup hostnames @@ -219,8 +206,7 @@ Name: hostnames.default Address 1: 10.0.1.175 hostnames.default.svc.cluster.local ``` -これが機能する場合、クロスネームスペース名を使用するようにアプリケーションを調整するか、同じNamespaceでアプリとServiceを実行する必要があります。 -これでも失敗する場合は、完全修飾名を試してください。 +これが機能する場合、クロスネームスペース名を使用するようにアプリケーションを調整するか、同じNamespaceでアプリとServiceを実行する必要があります。これでも失敗する場合は、完全修飾名を試してください。 ```shell nslookup hostnames.default.svc.cluster.local @@ -232,10 +218,7 @@ Name: hostnames.default.svc.cluster.local Address 1: 10.0.1.175 hostnames.default.svc.cluster.local ``` -ここでのサフィックス"default.svc.cluster.local"に注意してください。 -"default"は、操作しているNamespaceです。 -"svc"は、これがServiceであることを示します。 -"cluster.local"はクラスタードメインであり、あなたのクラスターでは異なる場合があります。 +ここでのサフィックス"default.svc.cluster.local"に注意してください。"default"は、操作しているNamespaceです。"svc"は、これがServiceであることを示します。"cluster.local"はクラスタードメインであり、あなたのクラスターでは異なる場合があります。 クラスター内のノードからも試すこともできます。 @@ -254,8 +237,7 @@ Name: hostnames.default.svc.cluster.local Address: 10.0.1.175 ``` -完全修飾名では検索できるのに、相対名ではできない場合、Podの`/etc/resolv.conf`ファイルが正しいことを確認する必要があります。 -Pod内から実行します。 +完全修飾名では検索できるのに、相対名ではできない場合、Podの`/etc/resolv.conf`ファイルが正しいことを確認する必要があります。Pod内から実行します。 ```shell cat /etc/resolv.conf @@ -269,25 +251,15 @@ search default.svc.cluster.local svc.cluster.local cluster.local example.com options ndots:5 ``` -nameserver行はクラスターのDNS Serviceを示さなければなりません。 -これは、`--cluster-dns`フラグで`kubelet`に渡されます。 +nameserver行はクラスターのDNS Serviceを示さなければなりません。これは、`--cluster-dns`フラグで`kubelet`に渡されます。 -`search`行には、`Service`名を見つけるための適切なサフィックスを含める必要があります。 -この場合、ローカルの`Namespace`で`Service`を見つけるためのサフィックス(`default.svc.cluster.local`)、すべての`Namespaces`で`Service`を見つけるためのサフィックス(`svc.cluster.local`)、およびクラスターのサフィックス(`cluster.local`)です。 -インストール方法によっては、その後に追加のレコードがある場合があります(合計6つまで)。 -クラスターのサフィックスは、`--cluster-domain`フラグを使用して`kubelet`に渡されます。 -このドキュメントではそれが"cluster.local"であると仮定していますが、あなたのクラスターでは異なる場合があります。 -その場合は、上記のすべてのコマンドでクラスターのサフィックスを変更する必要があります。 +`search`行には、`Service`名を見つけるための適切なサフィックスを含める必要があります。この場合、ローカルの`Namespace`で`Service`を見つけるためのサフィックス(`default.svc.cluster.local`)、すべての`Namespaces`で`Service`を見つけるためのサフィックス(`svc.cluster.local`)、およびクラスターのサフィックス(`cluster.local`)です。インストール方法によっては、その後に追加のレコードがある場合があります(合計6つまで)。クラスターのサフィックスは、`--cluster-domain`フラグを使用して`kubelet`に渡されます。このドキュメントではそれが"cluster.local"であると仮定していますが、あなたのクラスターでは異なる場合があります。その場合は、上記のすべてのコマンドでクラスターのサフィックスを変更する必要があります。 -`options`行では、DNSクライアントライブラリーが検索パスをまったく考慮しないように`ndots`を十分に高く設定する必要があります。 -Kubernetesはデフォルトでこれを5に設定します。これは、生成されるすべてのDNS名をカバーするのに十分な大きさです。 +`options`行では、DNSクライアントライブラリーが検索パスをまったく考慮しないように`ndots`を十分に高く設定する必要があります。Kubernetesはデフォルトでこれを5に設定します。これは、生成されるすべてのDNS名をカバーするのに十分な大きさです。 -### DNS名で機能するServiceはありますか? {#does-any-service-exist-in-dns} +### DNS名で機能するServiceはあるか? {#does-any-service-exist-in-dns} -上記がまだ失敗する場合、DNSルックアップがServiceに対して機能していません。 -一歩離れて、他の何が機能していないかを確認しましょう。 -KubernetesマスターのServiceは常に機能するはずです。 -Pod内から実行します。 +上記がまだ失敗する場合、DNSルックアップがServiceに対して機能していません。一歩離れて、他の何が機能していないかを確認しましょう。KubernetesマスターのServiceは常に機能するはずです。Pod内から実行します。 ```shell nslookup kubernetes.default @@ -300,12 +272,11 @@ Name: kubernetes.default Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local ``` -これが失敗する場合は、このドキュメントの [kube-proxy](#is-the-kube-proxy-working)セクションを参照するか、このドキュメントの先頭に戻って最初からやり直してください。ただし、あなた自身のServiceをデバッグするのではなく 、DNSサービスをデバッグします。 +これが失敗する場合は、このドキュメントの[kube-proxy](#is-the-kube-proxy-working)セクションを参照するか、このドキュメントの先頭に戻って最初からやり直してください。ただし、あなた自身のServiceをデバッグするのではなく、DNSサービスをデバッグします。 ## ServiceはIPでは機能するか? -DNSサービスが正しく動作できると仮定すると、次にテストするのはIPによってServiceが動作しているかどうかです。 -上述の`kubectl get`で確認できるIPに、クラスター内のPodからアクセスします。 +DNSサービスが正しく動作できると仮定すると、次にテストするのはIPによってServiceが動作しているかどうかです。上述の`kubectl get`で確認できるIPに、クラスター内のPodからアクセスします。 ```shell for i in $(seq 1 3); do @@ -321,13 +292,11 @@ hostnames-bvc05 hostnames-yp2kp ``` -Serviceが機能している場合は、正しい応答が得られるはずです。 -そうでない場合、おかしい可能性のあるものがいくつかあるため、続けましょう。 +Serviceが機能している場合は、正しい応答が得られるはずです。そうでない場合、おかしい可能性のあるものがいくつかあるため、続けましょう。 ## Serviceは正しく定義されているか? -馬鹿げているように聞こえるかもしれませんが、Serviceが正しく定義されPodのポートとマッチすることを二度、三度と確認すべきです。 -Serviceを読み返して確認しましょう。 +馬鹿げているように聞こえるかもしれませんが、Serviceが正しく定義されPodのポートとマッチすることを二度、三度と確認すべきです。Serviceを読み返して確認しましょう。 ```shell kubectl get service hostnames -o json @@ -377,8 +346,7 @@ kubectl get service hostnames -o json ## ServiceにEndpointsがあるか? -ここまで来たということは、Serviceは正しく定義され、DNSによって名前解決できることが確認できているでしょう。 -ここでは、実行したPodがServiceによって実際に選択されていることを確認しましょう。 +ここまで来たということは、Serviceは正しく定義され、DNSによって名前解決できることが確認できているでしょう。ここでは、実行したPodがServiceによって実際に選択されていることを確認しましょう。 以前に、Podが実行されていることを確認しました。再確認しましょう。 @@ -395,8 +363,7 @@ hostnames-yp2kp 1/1 Running 0 1h "AGE"列は、これらのPodが約1時間前のものであることを示しており、それらが正常に実行され、クラッシュしていないことを意味します。 -"RESTARTS"列は、これらのポッドが頻繁にクラッシュしたり、再起動されていないことを示しています。 頻繁に再起動すると、断続的な接続性の問題が発生する可能性があります。 -再起動回数が多い場合は、[ポッドをデバッグする](/ja/docs/tasks/debug-application-cluster/debug-pod-replication-controller/#podのデバッグ)を参照してください。 +"RESTARTS"列は、これらのポッドが頻繁にクラッシュしたり、再起動されていないことを示しています。頻繁に再起動すると、断続的な接続性の問題が発生する可能性があります。再起動回数が多い場合は、[ポッドをデバッグする](/ja/docs/tasks/debug-application-cluster/debug-pod-replication-controller/#podのデバッグ)を参照してください。 Kubernetesシステム内には、すべてのServiceのセレクターを評価し、結果をEndpointsオブジェクトに保存するコントロールループがあります。 @@ -407,15 +374,11 @@ NAME ENDPOINTS hostnames 10.244.0.5:9376,10.244.0.6:9376,10.244.0.7:9376 ``` -これにより、EndpointsコントローラーがServiceの正しいPodを見つけていることを確認できます。 -`ENDPOINTS`列が``の場合、Serviceの`spec.selector`フィールドが実際にPodの`metadata.labels`値を選択していることを確認する必要があります。 -よくある間違いは、タイプミスまたは他のエラー、たとえばServiceが`app=hostnames`を選択しているのにDeploymentが`run=hostnames`を指定していることです。 +これにより、EndpointsコントローラーがServiceの正しいPodを見つけていることを確認できます。`ENDPOINTS`列が``の場合、Serviceの`spec.selector`フィールドが実際にPodの`metadata.labels`値を選択していることを確認する必要があります。よくある間違いは、タイプミスまたは他のエラー、たとえばServiceが`app=hostnames`を選択しているのにDeploymentが`run=hostnames`を指定していることです。 ## Podは機能しているか? -この時点で、Serviceが存在し、Podを選択していることがわかります。 -このウォークスルーの最初に、Pod自体を確認しました。 -Podが実際に機能していることを確認しましょう。Serviceメカニズムをバイパスして、上記EndpointsにリストされているPodに直接アクセスすることができます。 +この時点で、Serviceが存在し、Podを選択していることがわかります。このウォークスルーの最初に、Pod自体を確認しました。Podが実際に機能していることを確認しましょう。Serviceメカニズムをバイパスして、上記EndpointsにリストされているPodに直接アクセスすることができます。 {{< note >}} これらのコマンドは、Serviceポート(80)ではなく、Podポート(9376)を使用します。 @@ -437,23 +400,17 @@ hostnames-bvc05 hostnames-yp2kp ``` -Endpointsリスト内の各Podは、それぞれの自身のホスト名を返すはずです。 -そうならない(または、あなた自身のPodの正しい振る舞いにならない)場合は、そこで何が起こっているのかを調査する必要があります。 +Endpointsリスト内の各Podは、それぞれの自身のホスト名を返すはずです。そうならない(または、あなた自身のPodの正しい振る舞いにならない)場合は、そこで何が起こっているのかを調査する必要があります。 ## kube-proxyは機能しているか? {#is-the-kube-proxy-working} -ここに到達したのなら、Serviceは実行され、Endpointsがあり、Podが実際にサービスを提供しています。 -この時点で、Serviceのプロキシーメカニズム全体が疑わしいです。 -ひとつひとつ確認しましょう。 +ここに到達したのなら、Serviceは実行され、Endpointsがあり、Podが実際にサービスを提供しています。この時点で、Serviceのプロキシーメカニズム全体が疑わしいです。ひとつひとつ確認しましょう。 -Serviceのデフォルト実装、およびほとんどのクラスターで使用されるものは、kube-proxyです。 -kube-proxyはそれぞれのノードで実行され、Serviceの抽象化を提供するための小さなメカニズムセットの1つを構成するプログラムです。 -クラスターがkube-proxyを使用しない場合、以下のセクションは適用されず、使用しているServiceの実装を調査する必要があります。 +Serviceのデフォルト実装、およびほとんどのクラスターで使用されるものは、kube-proxyです。kube-proxyはそれぞれのノードで実行され、Serviceの抽象化を提供するための小さなメカニズムセットの1つを構成するプログラムです。クラスターがkube-proxyを使用しない場合、以下のセクションは適用されず、使用しているServiceの実装を調査する必要があります。 ### kube-proxyは実行されているか? -`kube-proxy`がノード上で実行されていることを確認しましょう。 -ノードで実行されていれば、以下のような結果が得られるはずです。 +`kube-proxy`がノード上で実行されていることを確認しましょう。ノードで実行されていれば、以下のような結果が得られるはずです。 ```shell ps auxw | grep kube-proxy @@ -462,11 +419,7 @@ ps auxw | grep kube-proxy root 4194 0.4 0.1 101864 17696 ? Sl Jul04 25:43 /usr/local/bin/kube-proxy --master=https://kubernetes-master --kubeconfig=/var/lib/kube-proxy/kubeconfig --v=2 ``` -次に、マスターとの接続など、明らかな失敗をしていないことを確認します。 -これを行うには、ログを確認する必要があります。 -ログへのアクセス方法は、ノードのOSに依存します。 -一部のOSでは/var/log/kube-proxy.logのようなファイルですが、他のOSでは`journalctl`を使用してログにアクセスします。 -次のように表示されます。 +次に、マスターとの接続など、明らかな失敗をしていないことを確認します。これを行うには、ログを確認する必要があります。ログへのアクセス方法は、ノードのOSに依存します。一部のOSでは/var/log/kube-proxy.logのようなファイルですが、他のOSでは`journalctl`を使用してログにアクセスします。次のように表示されます。 ```none I1027 22:14:53.995134 5063 server.go:200] Running in resource-only container "/kube-proxy" @@ -483,12 +436,9 @@ I1027 22:14:54.040223 5063 proxier.go:294] Adding new service "kube-system/ku マスターに接続できないことに関するエラーメッセージが表示された場合、ノードの設定とインストール手順をダブルチェックする必要があります。 -`kube-proxy`が正しく実行できない理由の可能性の1つは、必須の`conntrack`バイナリが見つからないことです。 -これは、例えばKubernetesをスクラッチからインストールするなど、クラスターのインストール方法に依存して、一部のLinuxシステムで発生する場合があります。 -これが該当する場合は、`conntrack`パッケージを手動でインストール(例: Ubuntuでは`sudo apt install conntrack`)する必要があり、その後に再試行する必要があります。 +`kube-proxy`が正しく実行できない理由の可能性の1つは、必須の`conntrack`バイナリが見つからないことです。これは、例えばKubernetesをスクラッチからインストールするなど、クラスターのインストール方法に依存して、一部のLinuxシステムで発生する場合があります。これが該当する場合は、`conntrack`パッケージを手動でインストール(例: Ubuntuでは`sudo apt install conntrack`)する必要があり、その後に再試行する必要があります。 -kube-proxyは、いくつかのモードのいずれかで実行できます。 上記のログの`Using iptables Proxier`という行は、kube-proxyが「iptables」モードで実行されていることを示しています。 -最も一般的な他のモードは「ipvs」です。 古い「ユーザースペース」モードは、主にこれらに置き換えられました。 +kube-proxyは、いくつかのモードのいずれかで実行できます。上記のログの`Using iptables Proxier`という行は、kube-proxyが「iptables」モードで実行されていることを示しています。最も一般的な他のモードは「ipvs」です。古い「ユーザースペース」モードは、主にこれらに置き換えられました。 #### Iptables mode @@ -510,9 +460,7 @@ iptables-save | grep hostnames -A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -j KUBE-SEP-57KPRZ3JQVENLNBR ``` -各サービスのポートごとに、 `KUBE-SERVICES`に1つのルールと1つの` KUBE-SVC- `チェーンが必要です。 -Podエンドポイントごとに、その `KUBE-SVC- `に少数のルールがあり、少数のルールが含まれる1つの `KUBE-SEP- `チェーンがあるはずです。 -正確なルールは、正確な構成(NodePortとLoadBalancerを含む)に基づいて異なります。 +各サービスのポートごとに、`KUBE-SERVICES`に1つのルールと1つの` KUBE-SVC- `チェーンが必要です。Podエンドポイントごとに、その`KUBE-SVC- `に少数のルールがあり、少数のルールが含まれる1つの`KUBE-SEP- `チェーンがあるはずです。正確なルールは、正確な構成(NodePortとLoadBalancerを含む)に基づいて異なります。 #### IPVS mode @@ -532,12 +480,9 @@ TCP 10.0.1.175:80 rr ... ``` -各Serviceの各ポートに加えて、NodePort、External IP、およびLoad Balancer IPに対して、kube-proxyは仮想サーバーを作成します。 -Pod endpointごとに、対応する実サーバーが作成されます。 -この例では, サービスhostnames(`10.0.1.175:80`) は3つのendpoints(`10.244.0.5:9376`,`10.244.0.6:9376`, `10.244.0.7:9376`)を持っています。 +各Serviceの各ポートに加えて、NodePort、External IP、およびLoad Balancer IPに対して、kube-proxyは仮想サーバーを作成します。Pod endpointごとに、対応する実サーバーが作成されます。この例では、サービスhostnames(`10.0.1.175:80`)は3つのendpoints(`10.244.0.5:9376`、`10.244.0.6:9376`、`10.244.0.7:9376`)を持っています。 -IPVSプロキシーは、各Serviceアドレス(Cluster IP、External IP、NodePort IP、Load Balancer IPなど)毎の仮想サーバーと、Serviceのエンドポイントが存在する場合に対応する実サーバーを作成します。 -この例では、hostnames Service(`10.0.1.175:80`)は3つのエンドポイント(`10.244.0.5:9376`、`10.244.0.6:9376`、`10.244.0.7:9376`)を持ち、上と似た結果が得られるはずです。 +IPVSプロキシーは、各Serviceアドレス(Cluster IP、External IP、NodePort IP、Load Balancer IPなど)毎の仮想サーバーと、Serviceのエンドポイントが存在する場合に対応する実サーバーを作成します。この例では、hostnames Service(`10.0.1.175:80`)は3つのエンドポイント(`10.244.0.5:9376`、`10.244.0.6:9376`、`10.244.0.7:9376`)を持ち、上と似た結果が得られるはずです。 #### Userspace mode @@ -553,7 +498,7 @@ iptables-save | grep hostnames -A KUBE-PORTALS-HOST -d 10.0.1.175/32 -p tcp -m comment --comment "default/hostnames:default" -m tcp --dport 80 -j DNAT --to-destination 10.240.115.247:48577 ``` -サービスの各ポートには2つのルールが必要です(この例では1つだけ)-「KUBE-PORTALS-CONTAINER」と「KUBE-PORTALS-HOST」です。 +サービスの各ポートには2つのルールが必要です(この例では1つだけ)-「KUBE-PORTALS-CONTAINER」と「KUBE-PORTALS-HOST」です。 「userspace」モードを使用する必要はほとんどないので、ここでこれ以上時間を費やすことはありません。 @@ -568,11 +513,9 @@ curl 10.0.1.175:80 hostnames-0uton ``` -もしこれが失敗し、あなたがuserspaceプロキシーを使用している場合、プロキシーへの直接アクセスを試してみてください。 -もしiptablesプロキシーを使用している場合、このセクションはスキップしてください。 +もしこれが失敗し、あなたがuserspaceプロキシーを使用している場合、プロキシーへの直接アクセスを試してみてください。もしiptablesプロキシーを使用している場合、このセクションはスキップしてください。 -上記の`iptables-save`の出力を振り返り、`kube-proxy`がServiceに使用しているポート番号を抽出します。 -上記の例では"48577"です。このポートに接続してください。 +上記の`iptables-save`の出力を振り返り、`kube-proxy`がServiceに使用しているポート番号を抽出します。上記の例では"48577"です。このポートに接続してください。 ```shell curl localhost:48577 @@ -589,18 +532,13 @@ Setting endpoints for default/hostnames:default to [10.244.0.5:9376 10.244.0.6:9 これらが表示されない場合は、`-v`フラグを4に設定して`kube-proxy`を再起動してから、再度ログを確認してください。 -### エッジケース: PodがService IP経由で自身に到達できない。 {#a-pod-fails-to-reach-itself-via-the-service-ip} +### エッジケース: PodがService IP経由で自身に到達できない {#a-pod-fails-to-reach-itself-via-the-service-ip} -これはありそうに聞こえないかもしれませんが、実際には起こり、動作するはずです。 -これはネットワークが"hairpin"トラフィック用に適切に設定されていない場合、通常は`kube-proxy`が`iptables`モードで実行され、Podがブリッジネットワークに接続されている場合に発生します。 -`Kubelet`は`hairpin-mode`[フラグ](/docs/admin/kubelet/)を公開します。 -これにより、Serviceのエンドポイントが自身のServiceのVIPにアクセスしようとした場合に、自身への負荷分散を可能にします。 -`hairpin-mode`フラグは`hairpin-veth`または`promiscuous-bridge`に設定する必要があります。 +これはありそうに聞こえないかもしれませんが、実際には起こり、動作するはずです。これはネットワークが"hairpin"トラフィック用に適切に設定されていない場合、通常は`kube-proxy`が`iptables`モードで実行され、Podがブリッジネットワークに接続されている場合に発生します。`Kubelet`は`hairpin-mode`[フラグ](/docs/admin/kubelet/)を公開します。これにより、Serviceのエンドポイントが自身のServiceのVIPにアクセスしようとした場合に、自身への負荷分散を可能にします。`hairpin-mode`フラグは`hairpin-veth`または`promiscuous-bridge`に設定する必要があります。 この問題をトラブルシューティングする一般的な手順は次のとおりです。 -* `hairpin-mode`が`hairpin-veth`または`promiscuous-bridge`に設定されていることを確認します。 -次のような表示がされるはずです。この例では、`hairpin-mode`は`promiscuous-bridge`に設定されています。 +* `hairpin-mode`が`hairpin-veth`または`promiscuous-bridge`に設定されていることを確認します。次のような表示がされるはずです。この例では、`hairpin-mode`は`promiscuous-bridge`に設定されています。 ```shell ps auxw | grep kubelet @@ -609,20 +547,13 @@ ps auxw | grep kubelet root 3392 1.1 0.8 186804 65208 ? Sl 00:51 11:11 /usr/local/bin/kubelet --enable-debugging-handlers=true --config=/etc/kubernetes/manifests --allow-privileged=True --v=4 --cluster-dns=10.0.0.10 --cluster-domain=cluster.local --configure-cbr0=true --cgroup-root=/ --system-cgroups=/system --hairpin-mode=promiscuous-bridge --runtime-cgroups=/docker-daemon --kubelet-cgroups=/kubelet --babysit-daemons=true --max-pods=110 --serialize-image-pulls=false --outofdisk-transition-frequency=0 ``` -* 実際に使われている`hairpin-mode`を確認します。 -これを行うには、kubeletログを確認する必要があります。 -ログへのアクセス方法は、ノードのOSによって異なります。 -一部のOSでは/var/log/kubelet.logなどのファイルですが、他のOSでは`journalctl`を使用してログにアクセスします。 -互換性のために、実際に使われている`hairpin-mode`が`--hairpin-mode`フラグと一致しない場合があることに注意してください。 -kubelet.logにキーワード`hairpin`を含むログ行があるかどうかを確認してください。 -実際に使われている`hairpin-mode`を示す以下のようなログ行があるはずです。 +* 実際に使われている`hairpin-mode`を確認します。これを行うには、kubeletログを確認する必要があります。ログへのアクセス方法は、ノードのOSによって異なります。一部のOSでは/var/log/kubelet.logなどのファイルですが、他のOSでは`journalctl`を使用してログにアクセスします。互換性のために、実際に使われている`hairpin-mode`が`--hairpin-mode`フラグと一致しない場合があることに注意してください。kubelet.logにキーワード`hairpin`を含むログ行があるかどうかを確認してください。実際に使われている`hairpin-mode`を示す以下のようなログ行があるはずです。 ```none I0629 00:51:43.648698 3252 kubelet.go:380] Hairpin mode set to "promiscuous-bridge" ``` -* 実際に使われている`hairpin-mode`が`hairpin-veth`の場合、`Kubelet`にノードの`/sys`で操作する権限があることを確認します。 -すべてが正常に機能している場合、次のようなものが表示されます。 +* 実際に使われている`hairpin-mode`が`hairpin-veth`の場合、`Kubelet`にノードの`/sys`で操作する権限があることを確認します。すべてが正常に機能している場合、次のようなものが表示されます。 ```shell for intf in /sys/devices/virtual/net/cbr0/brif/*; do cat $intf/hairpin_mode; done @@ -634,8 +565,7 @@ for intf in /sys/devices/virtual/net/cbr0/brif/*; do cat $intf/hairpin_mode; don 1 ``` -実際に使われている`hairpin-mode`が`promiscuous-bridge`の場合、`Kubelet`にノード上のLinuxブリッジを操作する権限があることを確認してください。 -`cbr0`ブリッジが使用され適切に構成されている場合、以下が表示されます。 +実際に使われている`hairpin-mode`が`promiscuous-bridge`の場合、`Kubelet`にノード上のLinuxブリッジを操作する権限があることを確認してください。`cbr0`ブリッジが使用され適切に構成されている場合、以下が表示されます。 ```shell ifconfig cbr0 |grep PROMISC @@ -648,15 +578,9 @@ UP BROADCAST RUNNING PROMISC MULTICAST MTU:1460 Metric:1 ## 助けを求める -ここまでたどり着いたということは、とてもおかしなことが起こっています。 -Serviceは実行中で、Endpointsがあり、Podは実際にサービスを提供しています。 -DNSは動作していて、`kube-proxy`も誤動作していないようです。 -それでも、あなたのServiceは機能していません。 -おそらく私たちにお知らせ頂いた方がよいでしょう。調査をお手伝いします! +ここまでたどり着いたということは、とてもおかしなことが起こっています。Serviceは実行中で、Endpointsがあり、Podは実際にサービスを提供しています。DNSは動作していて、`kube-proxy`も誤動作していないようです。それでも、あなたのServiceは機能していません。おそらく私たちにお知らせ頂いた方がよいでしょう。調査をお手伝いします! -[Slack](/docs/troubleshooting/#slack)または -[Forum](https://discuss.kubernetes.io)または -[GitHub](https://github.com/kubernetes/kubernetes)でお問い合わせください。 +[Slack](/docs/troubleshooting/#slack)、[Forum](https://discuss.kubernetes.io)または[GitHub](https://github.com/kubernetes/kubernetes)でお問い合わせください。 diff --git a/content/ja/docs/tasks/debug-application-cluster/get-shell-running-container.md b/content/ja/docs/tasks/debug-application-cluster/get-shell-running-container.md index b6825075b8..684fa981c1 100644 --- a/content/ja/docs/tasks/debug-application-cluster/get-shell-running-container.md +++ b/content/ja/docs/tasks/debug-application-cluster/get-shell-running-container.md @@ -47,7 +47,7 @@ kubectl exec -it shell-demo -- /bin/bash ``` {{< note >}} -ダブルダッシュの記号 "--" はコマンドに渡す引数とkubectlの引数を分離します。 +ダブルダッシュの記号 `--` はコマンドに渡す引数とkubectlの引数を分離します。 {{< /note >}} diff --git a/content/ja/docs/tasks/inject-data-application/environment-variable-expose-pod-information.md b/content/ja/docs/tasks/inject-data-application/environment-variable-expose-pod-information.md new file mode 100644 index 0000000000..a6679de198 --- /dev/null +++ b/content/ja/docs/tasks/inject-data-application/environment-variable-expose-pod-information.md @@ -0,0 +1,149 @@ +--- +title: 環境変数によりコンテナにPod情報を共有する +content_type: task +weight: 30 +--- + + + +このページでは、Podが内部で実行しているコンテナに自身の情報を共有する方法を説明します。環境変数ではPodのフィールドとコンテナのフィールドを共有することができます。 + + + + +## {{% heading "prerequisites" %}} + + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + + + + + + +## Downward API {#the-downward-api} + +Podとコンテナのフィールドを実行中のコンテナに共有する方法は2つあります: + +* 環境変数 +* [ボリュームファイル](/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#the-downward-api) + +これら2つの方法を合わせて、Podとコンテナフィールドを共有する方法を*Downward API*と呼びます。 + + +## Podフィールドを環境変数の値として使用する {#use-pod-fields-as-values-for-environment-variables} + +この演習では、1つのコンテナを持つPodを作成します。Podの設定ファイルは次のとおりです: + +{{< codenew file="pods/inject/dapi-envars-pod.yaml" >}} + +設定ファイルには、5つの環境変数があります。`env`フィールドは[EnvVars](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#envvar-v1-core)の配列です。配列の最初の要素では、環境変数`MY_NODE_NAME`の値をPodの`spec.nodeName`フィールドから取得することを指定します。同様に、他の環境変数もPodのフィールドから名前を取得します。 + +{{< note >}} +この例のフィールドはPodのフィールドです。これらはPod内のコンテナのフィールドではありません。 +{{< /note >}} + +Podを作成します: + +```shell +kubectl apply -f https://k8s.io/examples/pods/inject/dapi-envars-pod.yaml +``` + +Podのコンテナが実行されていることを確認します: + +```shell +kubectl get pods +``` + +コンテナのログを表示します: + +```shell +kubectl logs dapi-envars-fieldref +``` + +出力には、選択した環境変数の値が表示されます: + +``` +minikube +dapi-envars-fieldref +default +172.17.0.4 +default +``` + +これらの値がログにある理由を確認するには、設定ファイルの`command`および`args`フィールドを確認してください。コンテナが起動すると、5つの環境変数の値が標準出力に書き込まれます。これを10秒ごとに繰り返します。 + +次に、Podで実行しているコンテナへのシェルを取得します: + +```shell +kubectl exec -it dapi-envars-fieldref -- sh +``` + +シェルで環境変数を表示します: + +```shell +/# printenv +``` + +出力は、特定の環境変数にPodフィールドの値が割り当てられていることを示しています: + +``` +MY_POD_SERVICE_ACCOUNT=default +... +MY_POD_NAMESPACE=default +MY_POD_IP=172.17.0.4 +... +MY_NODE_NAME=minikube +... +MY_POD_NAME=dapi-envars-fieldref +``` + +## コンテナフィールドを環境変数の値として使用する {#use-container-fields-as-values-for-environment-variables} + +前の演習では、環境変数の値としてPodフィールドを使用しました。次の演習では、環境変数の値としてコンテナフィールドを使用します。これは、1つのコンテナを持つPodの設定ファイルです: + +{{< codenew file="pods/inject/dapi-envars-container.yaml" >}} + +設定ファイルには、4つの環境変数があります。`env`フィールドは[EnvVars](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#envvar-v1-core)の配列です。配列の最初の要素では、環境変数`MY_CPU_REQUEST`の値を`test-container`という名前のコンテナの`requests.cpu`フィールドから取得することを指定します。同様に、他の環境変数もコンテナのフィールドから値を取得します。 + +Podを作成します: + +```shell +kubectl apply -f https://k8s.io/examples/pods/inject/dapi-envars-container.yaml +``` + +Podのコンテナが実行されていることを確認します: + +```shell +kubectl get pods +``` + +コンテナのログを表示します: + +```shell +kubectl logs dapi-envars-resourcefieldref +``` + +出力には、選択した環境変数の値が表示されます: + +``` +1 +1 +33554432 +67108864 +``` + + + +## {{% heading "whatsnext" %}} + + +* [コンテナの環境変数の定義](/ja/docs/tasks/inject-data-application/define-environment-variable-container/) +* [PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core) +* [Container](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#container-v1-core) +* [EnvVar](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#envvar-v1-core) +* [EnvVarSource](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#envvarsource-v1-core) +* [ObjectFieldSelector](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#objectfieldselector-v1-core) +* [ResourceFieldSelector](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#resourcefieldselector-v1-core) + + diff --git a/content/ja/docs/tasks/manage-gpus/scheduling-gpus.md b/content/ja/docs/tasks/manage-gpus/scheduling-gpus.md new file mode 100644 index 0000000000..b4a01a7bd7 --- /dev/null +++ b/content/ja/docs/tasks/manage-gpus/scheduling-gpus.md @@ -0,0 +1,184 @@ +--- +content_type: concept +title: GPUのスケジューリング +description: クラスター内のノードのリソースとしてGPUを設定してスケジューリングします +--- + + + +{{< feature-state state="beta" for_k8s_version="v1.10" >}} + +Kubernetesには、複数ノードに搭載されたAMDおよびNVIDIAのGPU(graphical processing unit)を管理するための**実験的な**サポートが含まれています。 + +このページでは、異なるバージョンのKubernetesを横断してGPUを使用する方法と、現時点での制限について説明します。 + + + +## デバイスプラグインを使用する + +Kubernetesでは、GPUなどの特別なハードウェアの機能にPodがアクセスできるようにするために、{{< glossary_tooltip text="デバイスプラグイン" term_id="device-plugin" >}}が実装されています。 + +管理者として、ノード上に対応するハードウェアベンダーのGPUドライバーをインストールして、以下のような対応するGPUベンダーのデバイスプラグインを実行する必要があります。 + +* [AMD](#deploying-amd-gpu-device-plugin) +* [NVIDIA](#deploying-nvidia-gpu-device-plugin) + +上記の条件を満たしていれば、Kubernetesは`amd.com/gpu`または`nvidia.com/gpu`をスケジュール可能なリソースとして公開します。 + +これらのGPUをコンテナから使用するには、`cpu`や`memory`をリクエストするのと同じように`.com/gpu`というリソースをリクエストするだけです。ただし、GPUを使用するときにはリソースのリクエストの指定方法にいくつか制限があります。 + +- GPUは`limits`セクションでのみ指定されることが想定されている。この制限は、次のことを意味します。 + * Kubernetesはデフォルトでlimitの値をrequestの値として使用するため、GPUの`requests`を省略して`limits`を指定できる。 + * GPUを`limits`と`requests`の両方で指定できるが、これら2つの値は等しくなければならない。 + * GPUの`limits`を省略して`requests`だけを指定することはできない。 +- コンテナ(およびPod)はGPUを共有しない。GPUのオーバーコミットは起こらない。 +- 各コンテナは1つ以上のGPUをリクエストできる。1つのGPUの一部だけをリクエストすることはできない。 + +以下に例を示します。 + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: cuda-vector-add +spec: + restartPolicy: OnFailure + containers: + - name: cuda-vector-add + # https://github.com/kubernetes/kubernetes/blob/v1.7.11/test/images/nvidia-cuda/Dockerfile + image: "k8s.gcr.io/cuda-vector-add:v0.1" + resources: + limits: + nvidia.com/gpu: 1 # 1 GPUをリクエストしています +``` + +### AMDのGPUデバイスプラグインをデプロイする {#deploying-amd-gpu-device-plugin} + +[AMD公式のGPUデバイスプラグイン](https://github.com/RadeonOpenCompute/k8s-device-plugin)には以下の要件があります。 + +- Kubernetesのノードに、AMDのGPUのLinuxドライバーがあらかじめインストール済みでなければならない。 + +クラスターが起動して上記の要件が満たされれば、以下のコマンドを実行することでAMDのデバイスプラグインをデプロイできます。 + +```shell +kubectl create -f https://raw.githubusercontent.com/RadeonOpenCompute/k8s-device-plugin/v1.10/k8s-ds-amdgpu-dp.yaml +``` + +このサードパーティーのデバイスプラグインに関する問題は、[RadeonOpenCompute/k8s-device-plugin](https://github.com/RadeonOpenCompute/k8s-device-plugin)で報告できます。 + +### NVIDIAのGPUデバイスプラグインをデプロイする {#deploying-nvidia-gpu-device-plugin} + +現在、NVIDIAのGPU向けのデバイスプラグインの実装は2種類あります。 + +#### NVIDIA公式のGPUデバイスプラグイン + +[NVIDIA公式のGPUデバイスプラグイン](https://github.com/NVIDIA/k8s-device-plugin)には以下の要件があります。 + +- Kubernetesのノードに、NVIDIAのドライバーがあらかじめインストール済みでなければならない。 +- Kubernetesのノードに、[nvidia-docker 2.0](https://github.com/NVIDIA/nvidia-docker)があらかじめインストール済みでなければならない。 +- KubeletはコンテナランタイムにDockerを使用しなければならない。 +- runcの代わりにDockerの[デフォルトランタイム](https://github.com/NVIDIA/k8s-device-plugin#preparing-your-gpu-nodes)として、`nvidia-container-runtime`を設定しなければならない。 +- NVIDIAのドライバーのバージョンが次の条件を満たさなければならない ~= 384.81。 + +クラスターが起動して上記の要件が満たされれば、以下のコマンドを実行することでNVIDIAのデバイスプラグインがデプロイできます。 + +```shell +kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta4/nvidia-device-plugin.yml +``` + +このサードパーティーのデバイスプラグインに関する問題は、[NVIDIA/k8s-device-plugin](https://github.com/NVIDIA/k8s-device-plugin)で報告できます。 + +#### GCEで使用されるNVIDIAのGPUデバイスプラグイン + +[GCEで使用されるNVIDIAのGPUデバイスプラグイン](https://github.com/GoogleCloudPlatform/container-engine-accelerators/tree/master/cmd/nvidia_gpu)は、nvidia-dockerを必要としないため、KubernetesのContainer Runtime Interface(CRI)と互換性のある任意のコンテナランタイムで動作するはずです。このデバイスプラグインは[Container-Optimized OS](https://cloud.google.com/container-optimized-os/)でテストされていて、1.9以降ではUbuntu向けの実験的なコードも含まれています。 + +以下のコマンドを実行すると、NVIDIAのドライバーとデバイスプラグインをインストールできます。 + +```shell +# NVIDIAドライバーをContainer-Optimized OSにインストールする +kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/stable/daemonset.yaml + +# NVIDIAドライバーをUbuntuにインストールする(実験的) +kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/stable/nvidia-driver-installer/ubuntu/daemonset.yaml + +# デバイスプラグインをインストールする +kubectl create -f https://raw.githubusercontent.com/kubernetes/kubernetes/release-1.14/cluster/addons/device-plugins/nvidia-gpu/daemonset.yaml +``` + +このサードパーティーのデバイスプラグインの使用やデプロイに関する問題は、[GoogleCloudPlatform/container-engine-accelerators](https://github.com/GoogleCloudPlatform/container-engine-accelerators)で報告できます。 + +Googleは、GKE上でNVIDIAのGPUを使用するための[手順](https://cloud.google.com/kubernetes-engine/docs/how-to/gpus)も公開しています。 + +## 異なる種類のGPUを搭載するクラスター + +クラスター上の別のノードに異なる種類のGPUが搭載されている場合、[NodeラベルとNodeセレクター](/docs/tasks/configure-pod-container/assign-pods-nodes/)を使用することで、Podを適切なノードにスケジューリングできます。 + +以下に例を示します。 + +```shell +# アクセラレーターを搭載したノードにラベルを付けます。 +kubectl label nodes accelerator=nvidia-tesla-k80 +kubectl label nodes accelerator=nvidia-tesla-p100 +``` + +## 自動的なNodeラベルの付加 {#node-labeller} + +AMDのGPUデバイスを使用している場合、[Node Labeller](https://github.com/RadeonOpenCompute/k8s-device-plugin/tree/master/cmd/k8s-node-labeller)をデプロイできます。Node Labellerは{{< glossary_tooltip text="コントローラー" term_id="controller" >}}の1種で、GPUデバイスのプロパティを持つノードに自動的にラベルを付けてくれます。 + +現在は、このコントローラーは以下のプロパティに基づいてラベルを追加できます。 + +* デバイスID(-device-id) +* VRAMのサイズ(-vram) +* SIMDの数(-simd-count) +* Compute Unitの数(-cu-count) +* ファームウェアとフィーチャーのバージョン(-firmware) +* 2文字の頭字語で表されたGPUファミリー(-family) + * SI - Southern Islands + * CI - Sea Islands + * KV - Kaveri + * VI - Volcanic Islands + * CZ - Carrizo + * AI - Arctic Islands + * RV - Raven + +```shell +kubectl describe node cluster-node-23 +``` + +``` + Name: cluster-node-23 + Roles: + Labels: beta.amd.com/gpu.cu-count.64=1 + beta.amd.com/gpu.device-id.6860=1 + beta.amd.com/gpu.family.AI=1 + beta.amd.com/gpu.simd-count.256=1 + beta.amd.com/gpu.vram.16G=1 + beta.kubernetes.io/arch=amd64 + beta.kubernetes.io/os=linux + kubernetes.io/hostname=cluster-node-23 + Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock + node.alpha.kubernetes.io/ttl: 0 + … +``` + +Node Labellerを使用すると、GPUの種類をPodのspec内で指定できます。 + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: cuda-vector-add +spec: + restartPolicy: OnFailure + containers: + - name: cuda-vector-add + # https://github.com/kubernetes/kubernetes/blob/v1.7.11/test/images/nvidia-cuda/Dockerfile + image: "k8s.gcr.io/cuda-vector-add:v0.1" + resources: + limits: + nvidia.com/gpu: 1 + nodeSelector: + accelerator: nvidia-tesla-p100 # または nvidia-tesla-k80 など +``` + +これにより、指定した種類のGPUを搭載したノードにPodがスケジューリングされることを保証できます。 diff --git a/content/ja/docs/tasks/run-application/force-delete-stateful-set-pod.md b/content/ja/docs/tasks/run-application/force-delete-stateful-set-pod.md index efa6f5a6ae..7d6830a50f 100644 --- a/content/ja/docs/tasks/run-application/force-delete-stateful-set-pod.md +++ b/content/ja/docs/tasks/run-application/force-delete-stateful-set-pod.md @@ -21,7 +21,7 @@ weight: 70 StatefulSetの通常の操作では、StatefulSet Podを強制的に削除する必要は**まったく**ありません。StatefulSetコントローラーは、StatefulSetのメンバーの作成、スケール、削除を行います。それは序数0からN-1までの指定された数のPodが生きていて準備ができていることを保証しようとします。StatefulSetは、クラスター内で実行されている特定のIDを持つ最大1つのPodがいつでも存在することを保証します。これは、StatefulSetによって提供される*最大1つの*セマンティクスと呼ばれます。 -手動による強制削除は、StatefulSetに固有の最大1つのセマンティクスに違反する可能性があるため、慎重に行う必要があります。StatefulSetを使用して、安定したネットワークIDと安定した記憶域を必要とする分散型およびクラスター型アプリケーションを実行できます。これらのアプリケーションは、固定IDを持つ固定数のメンバーのアンサンブルに依存する構成を持つことがよくあります。同じIDを持つ複数のメンバーを持つことは悲惨なことになり、データの損失につながる可能性があります(例:定足数ベースのシステムでのスプリットブレインシナリオ)。 +手動による強制削除は、StatefulSetに固有の最大1つのセマンティクスに違反する可能性があるため、慎重に行う必要があります。StatefulSetを使用して、安定したネットワークIDと安定した記憶域を必要とする分散型およびクラスター型アプリケーションを実行できます。これらのアプリケーションは、固定IDを持つ固定数のメンバーのアンサンブルに依存する構成を持つことがよくあります。同じIDを持つ複数のメンバーを持つことは悲惨なことになり、データの損失につながる可能性があります(例:定足数ベースのシステムでのスプリットブレインシナリオ)。 ## Podの削除 @@ -33,13 +33,13 @@ kubectl delete pods 上記がグレースフルターミネーションにつながるためには、`pod.Spec.TerminationGracePeriodSeconds`に0を指定しては**いけません**。`pod.Spec.TerminationGracePeriodSeconds`を0秒に設定することは安全ではなく、StatefulSet Podには強くお勧めできません。グレースフル削除は安全で、kubeletがapiserverから名前を削除する前に[Podが適切にシャットダウンする](/ja/docs/concepts/workloads/pods/pod/#termination-of-pods)ことを保証します。 -Kubernetes(バージョン1.5以降)は、Nodeにアクセスできないという理由だけでPodを削除しません。到達不能なNodeで実行されているPodは、[タイムアウト](/docs/admin/node/#node-condition)の後に`Terminating`または`Unknown`状態になります。到達不能なNode上のPodをユーザーが適切に削除しようとすると、Podはこれらの状態に入ることもあります。そのような状態のPodをapiserverから削除することができる唯一の方法は以下の通りです: +Kubernetes(バージョン1.5以降)は、Nodeにアクセスできないという理由だけでPodを削除しません。到達不能なNodeで実行されているPodは、[タイムアウト](/docs/admin/node/#node-condition)の後に`Terminating`または`Unknown`状態になります。到達不能なNode上のPodをユーザーが適切に削除しようとすると、Podはこれらの状態に入ることもあります。そのような状態のPodをapiserverから削除することができる唯一の方法は以下の通りです: * (ユーザーまたは[Node Controller](/docs/admin/node)によって)Nodeオブジェクトが削除されます。
* 応答していないNodeのkubeletが応答を開始し、Podを終了してapiserverからエントリーを削除します。
* ユーザーによりPodを強制削除します。 -推奨されるベストプラクティスは、1番目または2番目のアプローチを使用することです。Nodeが死んでいることが確認された(例えば、ネットワークから恒久的に切断された、電源が切られたなど)場合、Nodeオブジェクトを削除します。Nodeがネットワークパーティションに苦しんでいる場合は、これを解決するか、解決するのを待ちます。パーティションが回復すると、kubeletはPodの削除を完了し、apiserverでその名前を解放します。 +推奨されるベストプラクティスは、1番目または2番目のアプローチを使用することです。Nodeが死んでいることが確認された(例えば、ネットワークから恒久的に切断された、電源が切られたなど)場合、Nodeオブジェクトを削除します。Nodeがネットワークパーティションに苦しんでいる場合は、これを解決するか、解決するのを待ちます。パーティションが回復すると、kubeletはPodの削除を完了し、apiserverでその名前を解放します。 通常、PodがNode上で実行されなくなるか、管理者によってそのNodeが削除されると、システムは削除を完了します。あなたはPodを強制的に削除することでこれを無効にすることができます。 diff --git a/content/ja/docs/tasks/service-catalog/_index.md b/content/ja/docs/tasks/service-catalog/_index.md new file mode 100755 index 0000000000..a7d91e4ea7 --- /dev/null +++ b/content/ja/docs/tasks/service-catalog/_index.md @@ -0,0 +1,6 @@ +--- +title: "サービスカタログ" +description: サービスカタログ拡張APIをインストールする +weight: 150 +--- + diff --git a/content/ja/docs/tasks/service-catalog/install-service-catalog-using-sc.md b/content/ja/docs/tasks/service-catalog/install-service-catalog-using-sc.md new file mode 100644 index 0000000000..a0211e2a18 --- /dev/null +++ b/content/ja/docs/tasks/service-catalog/install-service-catalog-using-sc.md @@ -0,0 +1,68 @@ +--- +title: SCを使用したサービスカタログのインストール +content_type: task +--- + + +{{< glossary_definition term_id="service-catalog" length="all" prepend="サービスカタログは" >}} + +GCPの[Service Catalog Installer](https://github.com/GoogleCloudPlatform/k8s-service-catalog#installation)ツールを使うと、Kubernetesクラスター上にサービスカタログを簡単にインストール・アンインストールして、Google Cloudのプロジェクトに紐付けることもできます。 + +サービスカタログ自体は、Google Cloudだけではなく、どのような種類のマネージドサービスでも動作します。 + +## {{% heading "prerequisites" %}} + +* [サービスカタログ](/docs/concepts/service-catalog/)の基本概念を理解してください。 +* [Go 1.6+](https://golang.org/dl/)をインストールして、`GOPATH`を設定してください。 +* SSLに関するファイルを生成するために必要な[cfssl](https://github.com/cloudflare/cfssl)ツールをインストールしてください。 +* サービスカタログを使用するには、Kubernetesクラスターのバージョンが1.7以降である必要があります。 +* [kubectlのインストールおよびセットアップ](/ja/docs/tasks/tools/install-kubectl/)を参考に、v1.7以降のkubectlをインストールし、設定を行ってください。 +* サービスカタログをインストールするためには、kubectlのユーザーが*cluster-admin*ロールにバインドされている必要があります。正しくバインドされていることを確認するには、次のコマンドを実行します。 + + kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user= + + +## ローカル環境に`sc`をインストールする + +インストーラーは、ローカルのコンピューター上で`sc`と呼ばれるCLIツールとして実行します。 + +`go get`を使用してインストールします。 + +```shell +go get github.com/GoogleCloudPlatform/k8s-service-catalog/installer/cmd/sc +``` + +これで、`sc`が`GOPATH/bin`ディレクトリー内にインストールされたはずです。 + +## Kubernetesクラスターにサービスカタログをインストールする + +まず、すべての依存関係がインストールされていることを確認します。次のコマンドを実行してください。 + +```shell +sc check +``` + +チェックが成功したら、次のように表示されるはずです。 + +``` +Dependency check passed. You are good to go. +``` + +次に、バックアップに使用したい`storageclass`を指定して、installコマンドを実行します。 + +```shell +sc install --etcd-backup-storageclass "standard" +``` + +## サービスカタログのアンインストール + +Kubernetesクラスターからサービスカタログをアンインストールしたい場合は、`sc`ツールを使って次のコマンドを実行します。 + +```shell +sc uninstall +``` + +## {{% heading "whatsnext" %}} + +* [サービスブローカーのサンプル](https://github.com/openservicebrokerapi/servicebroker/blob/master/gettingStarted.md#sample-service-brokers)を読む。 +* [kubernetes-incubator/service-catalog](https://github.com/kubernetes-incubator/service-catalog)プロジェクトを探索する。 diff --git a/content/ja/docs/tasks/tools/install-kubectl.md b/content/ja/docs/tasks/tools/install-kubectl.md index 7c0d08d9c5..e468404469 100644 --- a/content/ja/docs/tasks/tools/install-kubectl.md +++ b/content/ja/docs/tasks/tools/install-kubectl.md @@ -5,7 +5,7 @@ weight: 10 card: name: tasks weight: 20 - title: Install kubectl + title: kubectlのインストール --- @@ -143,7 +143,7 @@ macOSで[Homebrew](https://brew.sh/)パッケージマネージャーを使用 1. インストールコマンドを実行してください: ``` - brew install kubectl + brew install kubectl ``` または @@ -186,7 +186,7 @@ macOSで[MacPorts](https://macports.org/)パッケージマネージャーを使 curl -LO https://storage.googleapis.com/kubernetes-release/release/{{< param "fullversion" >}}/bin/windows/amd64/kubectl.exe ``` - 最新の安定版を入手する際は(たとえばスクリプトで使用する場合)、[https://storage.googleapis.com/kubernetes-release/release/stable.txt](https://storage.googleapis.com/kubernetes-release/release/stable.txt)を参照してください。 + 最新の安定版を入手する際は(たとえばスクリプトで使用する場合)、[https://storage.googleapis.com/kubernetes-release/release/stable.txt](https://storage.googleapis.com/kubernetes-release/release/stable.txt)を参照してください。 2. バイナリをPATHに追加します 3. `kubectl`のバージョンがダウンロードしたものと同じであることを確認してください: @@ -202,7 +202,7 @@ macOSで[MacPorts](https://macports.org/)パッケージマネージャーを使 Windowsで[Powershell Gallery](https://www.powershellgallery.com/)パッケージマネージャーを使用していれば、Powershellでkubectlをインストールおよびアップデートすることもできます。 -1. インストールコマンドを実行してください(必ず`DownloadLocation`を指定してください): +1. インストールコマンドを実行してください(必ず`DownloadLocation`を指定してください): ``` Install-Script -Name install-kubectl -Scope CurrentUser -Force @@ -301,7 +301,7 @@ URLのレスポンスが表示されている場合は、kubectlはクラスタ The connection to the server was refused - did you specify the right host or port? ``` -たとえば、ラップトップ上(ローカル環境)でKubernetesクラスターを起動するような場合、Minikubeなどのツールを最初にインストールしてから、上記のコマンドを再実行する必要があります。 +たとえば、ラップトップ上(ローカル環境)でKubernetesクラスターを起動するような場合、Minikubeなどのツールを最初にインストールしてから、上記のコマンドを再実行する必要があります。 kubectl cluster-infoがURLレスポンスを返したにもかかわらずクラスターにアクセスできない場合は、次のコマンドで設定が正しいことを確認してください: @@ -315,7 +315,7 @@ kubectl cluster-info dump kubectlはBashおよびZshの自動補完を提供しています。これにより、入力を大幅に削減することができます。 -以下にBash(LinuxとmacOSの違いも含む)およびZshの自動補完の設定手順を示します。 +以下にBash(LinuxとmacOSの違いも含む)およびZshの自動補完の設定手順を示します。 {{< tabs name="kubectl_autocompletion" >}} @@ -325,11 +325,11 @@ kubectlはBashおよびZshの自動補完を提供しています。これによ Bashにおけるkubectlの補完スクリプトは`kubectl completion bash`コマンドで生成できます。シェル内で補完スクリプトをsourceすることでkubectlの自動補完が有効になります。 -ただし、補完スクリプトは[**bash-completion**](https://github.com/scop/bash-completion)に依存しているため、このソフトウェアを最初にインストールしておく必要があります(`type _init_completion`を実行することで、bash-completionがすでにインストールされていることを確認できます)。 +ただし、補完スクリプトは[**bash-completion**](https://github.com/scop/bash-completion)に依存しているため、このソフトウェアを最初にインストールしておく必要があります(`type _init_completion`を実行することで、bash-completionがすでにインストールされていることを確認できます)。 ### bash-completionをインストールする -bash-completionは多くのパッケージマネージャーから提供されています([こちら](https://github.com/scop/bash-completion#installation)を参照してください)。`apt-get install bash-completion`または`yum install bash-completion`などでインストールできます。 +bash-completionは多くのパッケージマネージャーから提供されています([こちら](https://github.com/scop/bash-completion#installation)を参照してください)。`apt-get install bash-completion`または`yum install bash-completion`などでインストールできます。 上記のコマンドでbash-completionの主要スクリプトである`/usr/share/bash-completion/bash_completion`が作成されます。パッケージマネージャーによっては、このファイルを`~/.bashrc`にて手動でsourceする必要があります。 @@ -382,7 +382,7 @@ Bashにおけるkubectlの補完スクリプトは`kubectl completion bash`コ ただし、補完スクリプトは[**bash-completion**](https://github.com/scop/bash-completion)に依存しているため、事前にインストールする必要があります。 {{< warning>}} -bash-completionにはv1とv2のバージョンがあり、v1はBash 3.2(macOSのデフォルト)用で、v2はBash 4.1以降向けです。kubectlの補完スクリプトはbash-completionのv1とBash 3.2では正しく**動作しません**。**bash-completion v2**および**Bash 4.1**が必要になります。したがって、macOSで正常にkubectlの補完を使用するには、Bash 4.1以降をインストールする必要があります([*手順*](https://itnext.io/upgrading-bash-on-macos-7138bd1066ba))。以下の手順では、Bash4.1以降(Bashのバージョンが4.1またはそれより新しいことを指します)を使用することを前提とします。 +bash-completionにはv1とv2のバージョンがあり、v1はBash 3.2(macOSのデフォルト)用で、v2はBash 4.1以降向けです。kubectlの補完スクリプトはbash-completionのv1とBash 3.2では正しく**動作しません**。**bash-completion v2**および**Bash 4.1**が必要になります。したがって、macOSで正常にkubectlの補完を使用するには、Bash 4.1以降をインストールする必要があります([*手順*](https://itnext.io/upgrading-bash-on-macos-7138bd1066ba))。以下の手順では、Bash4.1以降(Bashのバージョンが4.1またはそれより新しいことを指します)を使用することを前提とします。 {{< /warning >}} ### bashのアップグレード @@ -410,7 +410,7 @@ Homebrewは通常、`/usr/local/bin/bash`にインストールします。 ### bash-completionをインストールする {{< note >}} -前述のとおり、この手順ではBash 4.1以降であることが前提のため、bash-completion v2をインストールすることになります(これとは逆に、Bash 3.2およびbash-completion v1の場合ではkubectlの補完は動作しません)。 +前述のとおり、この手順ではBash 4.1以降であることが前提のため、bash-completion v2をインストールすることになります(これとは逆に、Bash 3.2およびbash-completion v1の場合ではkubectlの補完は動作しません)。 {{< /note >}} `type _init_completion`を実行することで、bash-completionがすでにインストールされていることを確認できます。ない場合は、Homebrewを使用してインストールすることもできます: @@ -452,7 +452,7 @@ export BASH_COMPLETION_COMPAT_DIR="/usr/local/etc/bash_completion.d" echo 'complete -F __start_kubectl k' >>~/.bashrc ``` -- kubectlをHomwbrewでインストールした場合([前述](#homebrewを使用してmacosへインストールする)のとおり)、kubectlの補完スクリプトはすでに`/usr/local/etc/bash_completion.d/kubectl`に格納されているでしょう。この場合、なにも操作する必要はありません。 +- kubectlをHomwbrewでインストールした場合([前述](#homebrewを使用してmacosへインストールする)のとおり)、kubectlの補完スクリプトはすでに`/usr/local/etc/bash_completion.d/kubectl`に格納されているでしょう。この場合、なにも操作する必要はありません。 {{< note >}} Homebrewでインストールしたbash-completion v2は`BASH_COMPLETION_COMPAT_DIR`ディレクトリ内のすべてのファイルをsourceするため、後者の2つの方法が機能します。 diff --git a/content/ja/docs/tasks/tools/install-minikube.md b/content/ja/docs/tasks/tools/install-minikube.md index 51e6cd8417..30b15718ca 100644 --- a/content/ja/docs/tasks/tools/install-minikube.md +++ b/content/ja/docs/tasks/tools/install-minikube.md @@ -29,7 +29,7 @@ grep -E --color 'vmx|svm' /proc/cpuinfo ``` sysctl -a | grep -E --color 'machdep.cpu.features|VMX' ``` -出力に`VMX`が表示されている場合(色付けされているはずです)、VT-x機能がマシンで有効になっています。 +出力に`VMX`が表示されている場合(色付けされているはずです)、VT-x機能がマシンで有効になっています。 {{% /tab %}} {{% tab name="Windows" %}} diff --git a/content/ja/docs/tutorials/kubernetes-basics/_index.html b/content/ja/docs/tutorials/kubernetes-basics/_index.html index 99174c2b21..3f31b8d5bc 100644 --- a/content/ja/docs/tutorials/kubernetes-basics/_index.html +++ b/content/ja/docs/tutorials/kubernetes-basics/_index.html @@ -39,7 +39,7 @@ card:

-

Kubernetesはどんなことができるの?

+

Kubernetesはどんなことができるの?

モダンなWebサービスでは、ユーザはアプリケーションが24時間365日利用可能であることを期待しており、開発者はそれらのアプリケーションの新しいバージョンを1日に数回デプロイすることを期待しています。コンテナ化は、パッケージソフトウェアがこれらの目標を達成するのを助け、アプリケーションをダウンタイムなしで簡単かつ迅速にリリース、アップデートできるようにします。Kubernetesを使用すると、コンテナ化されたアプリケーションをいつでもどこでも好きなときに実行できるようになり、それらが機能するために必要なリソースとツールを見つけやすくなります。Kubernetesは、コンテナオーケストレーションにおけるGoogleのこれまでの経験と、コミュニティから得られた最善のアイデアを組み合わせて設計された、プロダクションレディなオープンソースプラットフォームです。

diff --git a/content/ja/docs/tutorials/kubernetes-basics/deploy-app/deploy-interactive.html b/content/ja/docs/tutorials/kubernetes-basics/deploy-app/deploy-interactive.html index c9d25cd3fb..9b59db721b 100644 --- a/content/ja/docs/tutorials/kubernetes-basics/deploy-app/deploy-interactive.html +++ b/content/ja/docs/tutorials/kubernetes-basics/deploy-app/deploy-interactive.html @@ -20,7 +20,7 @@ weight: 20

- Podは、Kubernetesアプリケーションの基本的な実行単位です。各Podは、クラスターで実行されているワークロードの一部を表します。Podの詳細はこちらです。。 + Podは、Kubernetesアプリケーションの基本的な実行単位です。各Podは、クラスターで実行されているワークロードの一部を表します。Podの詳細はこちらです

diff --git a/content/ja/docs/tutorials/services/_index.md b/content/ja/docs/tutorials/services/_index.md new file mode 100755 index 0000000000..2a2a0eb7b6 --- /dev/null +++ b/content/ja/docs/tutorials/services/_index.md @@ -0,0 +1,5 @@ +--- +title: "Service" +weight: 70 +--- + diff --git a/content/ja/docs/tutorials/services/source-ip.md b/content/ja/docs/tutorials/services/source-ip.md new file mode 100644 index 0000000000..69c626d532 --- /dev/null +++ b/content/ja/docs/tutorials/services/source-ip.md @@ -0,0 +1,421 @@ +--- +title: 送信元IPを使用する +content_type: tutorial +min-kubernetes-server-version: v1.5 +--- + + + +Kubernetesクラスター内で実行されているアプリケーションは、Serviceという抽象化を経由して、他のアプリケーションや外の世界との発見や通信を行います。このドキュメントでは、異なる種類のServiceに送られたパケットの送信元IPに何が起こるのか、そして必要に応じてこの振る舞いを切り替える方法について説明します。 + +## {{% heading "prerequisites" %}} + +### 用語 + +このドキュメントでは、以下の用語を使用します。 + +{{< comment >}} +If localizing this section, link to the equivalent Wikipedia pages for +the target localization. +{{< /comment >}} + +[NAT](https://ja.wikipedia.org/wiki/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E5%A4%89%E6%8F%9B) +: ネットワークアドレス変換(network address translation) + +[送信元NAT](https://en.wikipedia.org/wiki/Network_address_translation#SNAT) +: パケットの送信元のIPを置換します。このページでは、通常ノードのIPアドレスを置換することを意味します。 + +[送信先NAT](https://en.wikipedia.org/wiki/Network_address_translation#DNAT) +: パケットの送信先のIPを置換します。このページでは、通常{{< glossary_tooltip term_id="pod" >}}のIPアドレスを置換することを意味します。 + +[VIP](/ja/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies) +: Kubernetes内のすべての{{< glossary_tooltip text="Service" term_id="service" >}}などに割り当てられる仮想IPアドレス(virtual IP address)です。 + +[kube-proxy](/ja/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies) +: すべてのノード上でServiceのVIPを管理するネットワークデーモンです。 + +### 前提条件 + +{{< include "task-tutorial-prereqs.md" >}} + +以下の例では、HTTPヘッダー経由で受け取ったリクエストの送信元IPをエコーバックする、小さなnginxウェブサーバーを使用します。次のコマンドでウェブサーバーを作成できます。 + +```shell +kubectl create deployment source-ip-app --image=k8s.gcr.io/echoserver:1.4 +``` + +出力は次のようになります。 + +``` +deployment.apps/source-ip-app created +``` + +## {{% heading "objectives" %}} + +* 単純なアプリケーションを様々な種類のService経由で公開する +* それぞれの種類のServiceがどのように送信元IPのNATを扱うかを理解する +* 送信元IPを保持することに関わるトレードオフを理解する + + + +## `Type=ClusterIP`を使用したServiceでの送信元IP + +kube-proxyが[iptablesモード](/ja/docs/concepts/services-networking/service/#proxy-mode-iptables)(デフォルト)で実行されている場合、クラスター内部からClusterIPに送られたパケットに送信元のNATが行われることは決してありません。kube-proxyが実行されているノード上で`http://localhost:10249/proxyMode`にリクエストを送って、kube-proxyのモードを問い合わせてみましょう。 + +```console +kubectl get nodes +``` + +出力は次のようになります。 + +``` +NAME STATUS ROLES AGE VERSION +kubernetes-node-6jst Ready 2h v1.13.0 +kubernetes-node-cx31 Ready 2h v1.13.0 +kubernetes-node-jj1t Ready 2h v1.13.0 +``` + +これらのノードの1つでproxyモードを取得します(kube-proxyはポート10249をlistenしています)。 + +```shell +# このコマンドは、問い合わせを行いたいノード上のシェルで実行してください。 +curl http://localhost:10249/proxyMode +``` + +出力は次のようになります。 + +``` +iptables +``` + +source IPアプリのServiceを作成することで、送信元IPが保持されているかテストできます。 + +```shell +kubectl expose deployment source-ip-app --name=clusterip --port=80 --target-port=8080 +``` + +出力は次のようになります。 + +``` +service/clusterip exposed +``` +```shell +kubectl get svc clusterip +``` + +出力は次のようになります。 + +``` +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +clusterip ClusterIP 10.0.170.92 80/TCP 51s +``` + +そして、同じクラスター上のPodから`ClusterIP`にアクセスします。 + +```shell +kubectl run busybox -it --image=busybox --restart=Never --rm +``` + +出力は次のようになります。 + +``` +Waiting for pod default/busybox to be running, status is Pending, pod ready: false +If you don't see a command prompt, try pressing enter. + +``` + +これで、Podの内部でコマンドが実行できます。 + +```shell +# このコマンドは、"kubectl run" のターミナルの内部で実行してください +ip addr +``` +``` +1: lo: mtu 65536 qdisc noqueue + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + inet6 ::1/128 scope host + valid_lft forever preferred_lft forever +3: eth0: mtu 1460 qdisc noqueue + link/ether 0a:58:0a:f4:03:08 brd ff:ff:ff:ff:ff:ff + inet 10.244.3.8/24 scope global eth0 + valid_lft forever preferred_lft forever + inet6 fe80::188a:84ff:feb0:26a5/64 scope link + valid_lft forever preferred_lft forever +``` + +そして、`wget`を使用してローカルのウェブサーバーに問い合わせます。 + +```shell +# 10.0.170.92 の部分をウェブサーバーのPodのIPv4アドレスに置き換えてください +wget -qO - 10.0.170.92 +``` +``` +CLIENT VALUES: +client_address=10.244.3.8 +command=GET +... +``` + +`client_address`は常にクライアントのPodのIPアドレスになります。これは、クライアントのPodとサーバーのPodが同じノード内にあっても異なるノードにあっても変わりません。 + +## `Type=NodePort`を使用したServiceでの送信元IP + +[`Type=NodePort`](/ja/docs/concepts/services-networking/service/#nodeport)を使用したServiceに送られたパケットは、デフォルトで送信元のNATが行われます。`NodePort` Serviceを作ることでテストできます。 + +```shell +kubectl expose deployment source-ip-app --name=nodeport --port=80 --target-port=8080 --type=NodePort +``` + +出力は次のようになります。 + +``` +service/nodeport exposed +``` + +```shell +NODEPORT=$(kubectl get -o jsonpath="{.spec.ports[0].nodePort}" services nodeport) +NODES=$(kubectl get nodes -o jsonpath='{ $.items[*].status.addresses[?(@.type=="ExternalIP")].address }') +``` + +クラウドプロバイダーで実行する場合、上に示した`nodes:nodeport`に対してファイアウォールのルールを作成する必要があるかもしれません。それでは、上で割り当てたノードポート経由で、クラスターの外部からServiceにアクセスしてみましょう。 + +```shell +for node in $NODES; do curl -s $node:$NODEPORT | grep -i client_address; done +``` + +出力は次のようになります。 + +``` +client_address=10.180.1.1 +client_address=10.240.0.5 +client_address=10.240.0.3 +``` + +これらは正しいクライアントIPではなく、クラスターのinternal IPであることがわかります。ここでは、次のようなことが起こっています。 + +* クライアントがパケットを`node2:nodePort`に送信する +* `node2`は、パケット内の送信元IPアドレスを自ノードのIPアドレスに置換する(SNAT) +* `node2`は、パケット内の送信先IPアドレスをPodのIPアドレスに置換する +* パケットはnode1にルーティングされ、endpointにルーティングされる +* Podからの応答がnode2にルーティングされて戻ってくる +* Podからの応答がクライアントに送り返される + +図で表すと次のようになります。 + +``` + client + \ ^ + \ \ + v \ + node 1 <--- node 2 + | ^ SNAT + | | ---> + v | + endpoint +``` + +クライアントのIPが失われることを回避するために、Kubernetesには[クライアントの送信元IPを保持する](/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip)機能があります。`service.spec.externalTrafficPolicy`の値を`Local`に設定すると、kube-proxyはローカルに存在するエンドポイントへのプロキシーリクエストだけをプロキシーし、他のノードへはトラフィックを転送しなくなります。このアプローチでは、オリジナルの送信元IPアドレスが保持されます。ローカルにエンドポイントが存在しない場合には、そのノードに送信されたパケットは損失します。そのため、エンドポイントに到達するパケットに適用する可能性のあるパケット処理ルールでは、送信元IPが正しいことを信頼できます。 + +次のようにして`service.spec.externalTrafficPolicy`フィールドを設定します。 + +```shell +kubectl patch svc nodeport -p '{"spec":{"externalTrafficPolicy":"Local"}}' +``` + +出力は次のようになります。 + +``` +service/nodeport patched +``` + +そして、再度テストしてみます。 + +```shell +for node in $NODES; do curl --connect-timeout 1 -s $node:$NODEPORT | grep -i client_address; done +``` + +出力は次のようになります。 + +``` +client_address=198.51.100.79 +``` + +今度は、*正しい*クライアントIPが含まれる応答が1つだけ得られました。これは、エンドポイントのPodが実行されているノードから来たものです。 + +ここでは、次のようなことが起こっています。 + +* クライアントがパケットをエンドポイントが存在しない`node2:nodePort`に送信する +* パケットが損失する +* クライアントがパケットをエンドポイントが*存在する*`node1:nodePort`に送信する +* node1は、正しい送信元IPを持つパケットをエンドポイントにルーティングする + +図で表すと次のようになります。 + +``` + client + ^ / \ + / / \ + / v X + node 1 node 2 + ^ | + | | + | v + endpoint +``` + +## `Type=LoadBalancer`を使用したServiceでの送信元IP + +[`Type=LoadBalancer`](/ja/docs/concepts/services-networking/service/#loadbalancer)を使用したServiceに送られたパケットは、デフォルトでは送信元のNATは行われません。`Ready`状態にあるすべてのスケジュール可能なKubernetesのNodeは、ロードバランサーからのトラフィックを受付可能であるためです。そのため、エンドポイントが存在しないノードにパケットが到達した場合、システムはエンドポイントが*存在する*ノードにパケットをプロシキーします。このとき、(前のセクションで説明したように)パケットの送信元IPがノードのIPに置換されます。 + +ロードバランサー経由でsource-ip-appを公開することで、これをテストできます。 + +```shell +kubectl expose deployment source-ip-app --name=loadbalancer --port=80 --target-port=8080 --type=LoadBalancer +``` + +出力は次のようになります。 + +``` +service/loadbalancer exposed +``` + +ServiceのIPアドレスを表示します。 + +```console +kubectl get svc loadbalancer +``` + +出力は次のようになります。 + +``` +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +loadbalancer LoadBalancer 10.0.65.118 203.0.113.140 80/TCP 5m +``` + +次に、Serviceのexternal-ipにリクエストを送信します。 + +```shell +curl 203.0.113.140 +``` + +出力は次のようになります。 + +``` +CLIENT VALUES: +client_address=10.240.0.5 +... +``` + +しかし、Google Kubernetes EngineやGCE上で実行している場合、同じ`service.spec.externalTrafficPolicy`フィールドを`Local`に設定すると、ロードバランサーからのトラフィックを受け付け可能なノードのリストから、Serviceエンドポイントが*存在しない*ノードが強制的に削除されます。この動作は、ヘルスチェックを意図的に失敗させることによって実現されています。 + +図で表すと次のようになります。 + +``` + client + | + lb VIP + / ^ + v / +ヘルスチェック ---> node 1 node 2 <--- ヘルスチェック + 200 <--- ^ | ---> 500 + | V + endpoint +``` + +アノテーションを設定することで動作をテストできます。 + +```shell +kubectl patch svc loadbalancer -p '{"spec":{"externalTrafficPolicy":"Local"}}' +``` + +Kubernetesにより割り当てられた`service.spec.healthCheckNodePort`フィールドをすぐに確認します。 + +```shell +kubectl get svc loadbalancer -o yaml | grep -i healthCheckNodePort +``` + +出力は次のようになります。 + +```yaml + healthCheckNodePort: 32122 +``` + +`service.spec.healthCheckNodePort`フィールドは、`/healthz`でhealth checkを配信しているすべてのノード上のポートを指しています。次のコマンドでテストできます。 + +```shell +kubectl get pod -o wide -l run=source-ip-app +``` + +出力は次のようになります。 + +``` +NAME READY STATUS RESTARTS AGE IP NODE +source-ip-app-826191075-qehz4 1/1 Running 0 20h 10.180.1.136 kubernetes-node-6jst +``` + +`curl`を使用して、さまざまなノード上の`/healthz`エンドポイントからデータを取得します。 + +```shell +# このコマンドは選んだノードのローカル上で実行してください +curl localhost:32122/healthz +``` +``` +1 Service Endpoints found +``` + +ノードが異なると、得られる結果も異なる可能性があります。 + +```shell +# このコマンドは、選んだノード上でローカルに実行してください +curl localhost:32122/healthz +``` +``` +No Service Endpoints Found +``` + +{{< glossary_tooltip text="コントロールプレーン" term_id="control-plane" >}}上で実行中のコントローラーは、クラウドのロードバランサーを割り当てる責任があります。同じコントローラーは、各ノード上のポートやパスを指すHTTPのヘルスチェックも割り当てます。エンドポイントが存在しない2つのノードがヘルスチェックに失敗するまで約10秒待った後、`curl`を使用してロードバランサーのIPv4アドレスに問い合わせます。 + +```shell +curl 203.0.113.140 +``` + +出力は次のようになります。 + +``` +CLIENT VALUES: +client_address=198.51.100.79 +... +``` + +## クロスプラットフォームのサポート + +`Type=LoadBalancer`を使用したServiceで送信元IPを保持する機能を提供しているのは一部のクラウドプロバイダだけです。実行しているクラウドプロバイダによっては、以下のように異なる方法でリクエストを満たす場合があります。 + +1. クライアントとのコネクションをプロキシーが終端し、ノードやエンドポイントとの接続には新しいコネクションが開かれる。このような場合、送信元IPは常にクラウドのロードバランサーのものになり、クライアントのIPにはなりません。 + +2. クライアントからロードバランサーのVIPに送信されたリクエストが、中間のプロキシーではなく、クライアントの送信元IPとともにノードまで到達するようなパケット転送が使用される。 + +1つめのカテゴリーのロードバランサーの場合、真のクライアントIPと通信するために、 HTTPの[Forwarded](https://tools.ietf.org/html/rfc7239#section-5.2)ヘッダーや[X-FORWARDED-FOR](https://ja.wikipedia.org/wiki/X-Forwarded-For)ヘッダー、[proxy protocol](http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt)などの、ロードバランサーとバックエンドの間で合意されたプロトコルを使用する必要があります。2つ目のカテゴリーのロードバランサーの場合、Serviceの`service.spec.healthCheckNodePort`フィールドに保存されたポートを指すHTTPのヘルスチェックを作成することで、上記の機能を活用できます。 + +## {{% heading "cleanup" %}} + +Serviceを削除します。 + +```shell +kubectl delete svc -l run=source-ip-app +``` + +Deployment、ReplicaSet、Podを削除します。 + +```shell +kubectl delete deployment source-ip-app +``` + +## {{% heading "whatsnext" %}} + +* [Service経由でアプリケーションに接続する](/ja/docs/concepts/services-networking/connect-applications-service/)方法についてさらに学ぶ。 +* [External Load Balancerを作成する](/docs/tasks/access-application-cluster/create-external-load-balancer/)方法について学ぶ。 + + diff --git a/content/ja/docs/tutorials/stateful-application/_index.md b/content/ja/docs/tutorials/stateful-application/_index.md new file mode 100755 index 0000000000..421915d42c --- /dev/null +++ b/content/ja/docs/tutorials/stateful-application/_index.md @@ -0,0 +1,5 @@ +--- +title: "ステートフルアプリケーション" +weight: 50 +--- + diff --git a/content/ja/docs/tutorials/stateful-application/basic-stateful-set.md b/content/ja/docs/tutorials/stateful-application/basic-stateful-set.md new file mode 100644 index 0000000000..d8a0acbdf6 --- /dev/null +++ b/content/ja/docs/tutorials/stateful-application/basic-stateful-set.md @@ -0,0 +1,1026 @@ +--- +title: StatefulSetの基本 +content_type: tutorial +weight: 10 +--- + + +このチュートリアルでは、{{< glossary_tooltip text="StatefulSet" term_id="statefulset" >}}を使用したアプリケーションを管理するための基本を説明します。StatefulSetのPodを作成、削除、スケール、そして更新する方法について紹介します。 + +## {{% heading "prerequisites" %}} + +このチュートリアルを始める前に、以下のKubernetesの概念について理解しておく必要があります。 + +* [Pod](/ja/docs/concepts/workloads/pods/) +* [Cluster DNS](/ja/docs/concepts/services-networking/dns-pod-service/) +* [Headless Service](/ja/docs/concepts/services-networking/service/#headless-services) +* [PersistentVolume](/ja/docs/concepts/storage/persistent-volumes/) +* [PersistentVolumeのプロビジョニング](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/staging/persistent-volume-provisioning/) +* [StatefulSet](/ja/docs/concepts/workloads/controllers/statefulset/) +* [kubectl](/docs/reference/kubectl/kubectl/)コマンドラインツール + +{{< note >}} +このチュートリアルでは、クラスターがPersistentVolumeの動的なプロビジョニングが行われるように設定されていることを前提としています。クラスターがそのように設定されていない場合、チュートリアルを始める前に1GiBのボリュームを2つ手動でプロビジョニングする必要があります。 +{{< /note >}} + +## {{% heading "objectives" %}} + +StatefulSetはステートフルアプリケーションや分散システムで使用するために存在します。しかし、Kubernetes上のステートフルアプリケーションや分散システムは、広範で複雑なトピックです。StatefulSetの基本的な機能を示すという目的のため、また、ステートフルアプリケーションを分散システムと混同しないようにするために、ここでは、Statefulsetを使用する単純なウェブアプリケーションのデプロイを行います。 + +このチュートリアルを終えると、以下のことが理解できるようになります。 + +* StatefulSetの作成方法 +* StatefulSetがどのようにPodを管理するのか +* StatefulSetの削除方法 +* StatefulSetのスケール方法 +* StatefulSetが管理するPodの更新方法 + + + +## StatefulSetを作成する {#ordered-pod-creation} + +はじめに、以下の例を使ってStatefulSetを作成しましょう。これは、コンセプトの[StatefulSet](/ja/docs/concepts/workloads/controllers/statefulset/)のページで使ったものと同じような例です。`nginx`という[headless Service](/ja/docs/concepts/services-networking/service/#headless-services)を作成し、`web`というStatefulSet内のPodのIPアドレスを公開します。 + +{{< codenew file="application/web/web.yaml" >}} + +上の例をダウンロードして、`web.yaml`という名前で保存します。 + +ここでは、ターミナルウィンドウを2つ使う必要があります。1つ目のターミナルでは、[`kubectl get`](/ja/docs/reference/generated/kubectl/kubectl-commands/#get)を使って、StatefulSetのPodの作成を監視します。 + +```shell +kubectl get pods -w -l app=nginx +``` + +2つ目のターミナルでは、[`kubectl apply`](/ja/docs/reference/generated/kubectl/kubectl-commands/#apply)を使って、`web.yaml`に定義されたheadless ServiceとStatefulSetを作成します。 + +```shell +kubectl apply -f web.yaml +``` +``` +service/nginx created +statefulset.apps/web created +``` + +上のコマンドを実行すると、2つのPodが作成され、それぞれのPodで[NGINX](https://www.nginx.com)ウェブサーバーが実行されます。`nginx`Serviceを取得してみましょう。 +```shell +kubectl get service nginx +``` +``` +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +nginx ClusterIP None 80/TCP 12s +``` +そして、`web`StatefulSetを取得して、2つのリソースの作成が成功したことも確認します。 +```shell +kubectl get statefulset web +``` +``` +NAME DESIRED CURRENT AGE +web 2 1 20s +``` + +### 順序付きPodの作成 + +_n_ 個のレプリカを持つStatefulSetは、Podをデプロイするとき、1つずつ順番に作成し、 _{0..n-1}_ という順序付けを行います。1つ目のターミナルで`kubectl get`コマンドの出力を確認しましょう。最終的に、以下の例のような出力が表示されるはずです。 + +```shell +kubectl get pods -w -l app=nginx +``` +``` +NAME READY STATUS RESTARTS AGE +web-0 0/1 Pending 0 0s +web-0 0/1 Pending 0 0s +web-0 0/1 ContainerCreating 0 0s +web-0 1/1 Running 0 19s +web-1 0/1 Pending 0 0s +web-1 0/1 Pending 0 0s +web-1 0/1 ContainerCreating 0 0s +web-1 1/1 Running 0 18s +``` + +`web-0`Podが _Running_ ([Pod Phase](/ja/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase)を参照)かつ _Ready_ ([Pod Conditions](/ja/docs/concepts/workloads/pods/pod-lifecycle/#pod-conditions)の`type`を参照)の状態になるまでは、`web-1`Podが起動していないことに注目してください。 + +## StatefulSet内のPod + +StatefulSet内のPodは、ユニークな順序インデックスと安定したネットワーク識別子を持ちます。 + +### Podの順序インデックスを確かめる + +StatefulSetのPodを取得します。 + +```shell +kubectl get pods -l app=nginx +``` +``` +NAME READY STATUS RESTARTS AGE +web-0 1/1 Running 0 1m +web-1 1/1 Running 0 1m +``` + +[StatefulSet](/ja/docs/concepts/workloads/controllers/statefulset/)のコンセプトで説明したように、StatefulSet内のPodは安定したユニークな識別子を持ちます。この識別子は、StatefulSet{{< glossary_tooltip term_id="controller" text="コントローラー">}}によって各Podに割り当てられる、ユニークな順序インデックスに基づいて付けられます。Podの名前は、`-<順序インデックス>`という形式です。`web`StatefulSetは2つのレプリカを持つため、`web-0`と`web-1`という2つのPodを作成します。 + +### 安定したネットワーク識別子の使用 + +各Podは、順序インデックスに基づいた安定したホスト名を持ちます。[`kubectl exec`](/ja/docs/reference/generated/kubectl/kubectl-commands/#exec)を使用して、各Pod内で`hostname`コマンドを実行してみましょう。 + +```shell +for i in 0 1; do kubectl exec "web-$i" -- sh -c 'hostname'; done +``` +``` +web-0 +web-1 +``` + +[`kubectl run`](/ja/docs/reference/generated/kubectl/kubectl-commands/#run)を使用して、`dnsutils`パッケージの`nslookup`コマンドを提供するコンテナを実行します。Podのホスト名に対して`nslookup`を実行すると、クラスター内のDNSアドレスが確認できます。 + +```shell +kubectl run -i --tty --image busybox:1.28 dns-test --restart=Never --rm +``` +これにより、新しいシェルが起動します。新しいシェルで、次のコマンドを実行します。 +```shell +# このコマンドは、dns-testコンテナのシェルで実行してください +nslookup web-0.nginx +``` +出力は次のようになります。 +``` +Server: 10.0.0.10 +Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local + +Name: web-0.nginx +Address 1: 10.244.1.6 + +nslookup web-1.nginx +Server: 10.0.0.10 +Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local + +Name: web-1.nginx +Address 1: 10.244.2.6 +``` + +(コンテナのシェルを終了するために、`exit`コマンドを実行してください。) + +headless serviceのCNAMEは、SRVレコードを指しています(1つのレコードがRunningかつReadyのPodに対応します)。SRVレコードは、PodのIPアドレスを含むAレコードを指します。 + +1つ目のターミナルで、StatefulSetのPodを監視します。 + +```shell +kubectl get pod -w -l app=nginx +``` +2つ目のターミナルで、[`kubectl delete`](/ja/docs/reference/generated/kubectl/kubectl-commands/#delete)を使用して、StatefulSetのすべてのPodを削除します。 + +```shell +kubectl delete pod -l app=nginx +``` +``` +pod "web-0" deleted +pod "web-1" deleted +``` + +StatefulSetがPodを再起動して、2つのPodがRunningかつReadyの状態に移行するのを待ちます。 + +```shell +kubectl get pod -w -l app=nginx +``` +``` +NAME READY STATUS RESTARTS AGE +web-0 0/1 ContainerCreating 0 0s +NAME READY STATUS RESTARTS AGE +web-0 1/1 Running 0 2s +web-1 0/1 Pending 0 0s +web-1 0/1 Pending 0 0s +web-1 0/1 ContainerCreating 0 0s +web-1 1/1 Running 0 34s +``` + +`kubectl exec`と`kubectl run`コマンドを使用して、Podのホスト名とクラスター内DNSエントリーを確認します。まず、Podのホスト名を見てみましょう。 + +```shell +for i in 0 1; do kubectl exec web-$i -- sh -c 'hostname'; done +``` +``` +web-0 +web-1 +``` +その後、次のコマンドを実行します。 +``` +kubectl run -i --tty --image busybox:1.28 dns-test --restart=Never --rm /bin/sh +``` +これにより、新しいシェルが起動します。新しいシェルで、次のコマンドを実行します。 +```shell +# このコマンドは、dns-testコンテナのシェルで実行してください +nslookup web-0.nginx +``` +出力は次のようになります。 +``` +Server: 10.0.0.10 +Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local + +Name: web-0.nginx +Address 1: 10.244.1.7 + +nslookup web-1.nginx +Server: 10.0.0.10 +Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local + +Name: web-1.nginx +Address 1: 10.244.2.8 +``` + +(コンテナのシェルを終了するために、`exit`コマンドを実行してください。) + +Podの順序インデックス、ホスト名、SRVレコード、そしてAレコード名は変化していませんが、Podに紐付けられたIPアドレスは変化する可能性があります。このチュートリアルで使用しているクラスターでは、IPアドレスは変わりました。このようなことがあるため、他のアプリケーションがStatefulSet内のPodに接続するときには、IPアドレスで指定しないことが重要です。 + +StatefulSetの有効なメンバーを探して接続する必要がある場合は、headless ServiceのCNAME(`nginx.default.svc.cluster.local`)をクエリしなければなりません。CNAMEに紐付けられたSRVレコードには、StatefulSet内のRunnningかつReadyなPodだけが含まれます。 + +アプリケーションがlivenessとreadinessをテストするコネクションのロジックをすでに実装している場合、PodのSRVレコード(`web-0.nginx.default.svc.cluster.local`、`web-1.nginx.default.svc.cluster.local`)をPodが安定しているものとして使用できます。PodがRunning and Readyな状態に移行すれば、アプリケーションはPodのアドレスを発見できるようになります。 + +### 安定したストレージへの書き込み {#writing-to-stable-storage} + +`web-0`および`web-1`のためのPersistentVolumeClaimを取得しましょう。 + +```shell +kubectl get pvc -l app=nginx +``` +出力は次のようになります。 +``` +NAME STATUS VOLUME CAPACITY ACCESSMODES AGE +www-web-0 Bound pvc-15c268c7-b507-11e6-932f-42010a800002 1Gi RWO 48s +www-web-1 Bound pvc-15c79307-b507-11e6-932f-42010a800002 1Gi RWO 48s +``` + +StatefulSetコントローラーは、2つの{{< glossary_tooltip text="PersistentVolume" term_id="persistent-volume" >}}にバインドされた2つの{{< glossary_tooltip text="PersistentVolumeClaim" term_id="persistent-volume-claim" >}}を作成しています。 + +このチュートリアルで使用しているクラスターでは、PersistentVolumeの動的なプロビジョニングが設定されているため、PersistentVolumeが自動的に作成されてバインドされています。 + +デフォルトでは、NGINXウェブサーバーは`/usr/share/nginx/html/index.html`に置かれたindexファイルを配信します。StatefulSetの`spec`内の`volumeMounts`フィールドによって、`/usr/share/nginx/html`ディレクトリがPersistentVolume上にあることが保証されます。 + +Podのホスト名を`index.html`ファイルに書き込むことで、NGINXウェブサーバーがホスト名を配信することを検証しましょう。 + +```shell +for i in 0 1; do kubectl exec "web-$i" -- sh -c 'echo "$(hostname)" > /usr/share/nginx/html/index.html'; done + +for i in 0 1; do kubectl exec -i -t "web-$i" -- curl http://localhost/; done +``` +``` +web-0 +web-1 +``` + +{{< note >}} +上記のcurlコマンドに対して代わりに**403 Forbidden**というレスポンスが返ってくる場合、`volumeMounts`でマウントしたディレクトリのパーミッションを修正する必要があります(これは、[hostPathボリュームを使用したときに起こるバグ](https://github.com/kubernetes/kubernetes/issues/2630)が原因です)。この問題に対処するには、上の`curl`コマンドを再実行する前に、次のコマンドを実行します。 + +`for i in 0 1; do kubectl exec web-$i -- chmod 755 /usr/share/nginx/html; done` +{{< /note >}} + +1つ目のターミナルで、StatefulSetのPodを監視します。 + +```shell +kubectl get pod -w -l app=nginx +``` + +2つ目のターミナルで、StatefulSetのすべてのPodを削除します。 + +```shell +kubectl delete pod -l app=nginx +``` +``` +pod "web-0" deleted +pod "web-1" deleted +``` +1つ目のターミナルで`kubectl get`コマンドの出力を確認して、すべてのPodがRunningかつReadyの状態に変わるまで待ちます。 + +```shell +kubectl get pod -w -l app=nginx +``` +``` +NAME READY STATUS RESTARTS AGE +web-0 0/1 ContainerCreating 0 0s +NAME READY STATUS RESTARTS AGE +web-0 1/1 Running 0 2s +web-1 0/1 Pending 0 0s +web-1 0/1 Pending 0 0s +web-1 0/1 ContainerCreating 0 0s +web-1 1/1 Running 0 34s +``` + +ウェブサーバーがホスト名を配信し続けていることを確認します。 + +``` +for i in 0 1; do kubectl exec -i -t "web-$i" -- curl http://localhost/; done +``` +``` +web-0 +web-1 +``` + +もし`web-0`および`web-1`が再スケジュールされたとしても、Podは同じホスト名を配信し続けます。これは、PodのPersistentVolumeClaimに紐付けられたPersistentVolumeが、Podの`volumeMounts`に再マウントされるためです。`web-0`と`web-1`がどんなノードにスケジュールされたとしても、PodのPersistentVolumeは適切なマウントポイントにマウントされます。 + +## StatefulSetをスケールする + +StatefulSetのスケールとは、レプリカ数を増減することを意味します。これは、`replicas`フィールドを更新することによって実現できます。StatefulSetのスケールには、[`kubectl scale`](/ja/docs/reference/generated/kubectl/kubectl-commands/#scale)と +[`kubectl patch`](/ja/docs/reference/generated/kubectl/kubectl-commands/#patch)のどちらも使用できます。 + +### スケールアップ + +1つ目のターミナルで、StatefulSet内のPodを監視します。 + +```shell +kubectl get pods -w -l app=nginx +``` + +2つ目のターミナルで、`kubectl scale`を使って、レプリカ数を5にスケールします。 + +```shell +kubectl scale sts web --replicas=5 +``` +``` +statefulset.apps/web scaled +``` + +1つ目のターミナルの`kubectl get`コマンドの出力を確認して、3つの追加のPodがRunningかつReadyの状態に変わるまで待ちます。 + +```shell +kubectl get pods -w -l app=nginx +``` +``` +NAME READY STATUS RESTARTS AGE +web-0 1/1 Running 0 2h +web-1 1/1 Running 0 2h +NAME READY STATUS RESTARTS AGE +web-2 0/1 Pending 0 0s +web-2 0/1 Pending 0 0s +web-2 0/1 ContainerCreating 0 0s +web-2 1/1 Running 0 19s +web-3 0/1 Pending 0 0s +web-3 0/1 Pending 0 0s +web-3 0/1 ContainerCreating 0 0s +web-3 1/1 Running 0 18s +web-4 0/1 Pending 0 0s +web-4 0/1 Pending 0 0s +web-4 0/1 ContainerCreating 0 0s +web-4 1/1 Running 0 19s +``` + +StatefulSetコントローラーはレプリカ数をスケールします。 +[StatefulSetを作成する](#ordered-pod-creation)で説明したように、StatefulSetコントローラーは各Podを順序インデックスに従って1つずつ作成し、次のPodを起動する前に、1つ前のPodがRunningかつReadyの状態になるまで待ちます。 + +### スケールダウン {#scaling-down} + +1つ目のターミナルで、StatefulSetのPodを監視します。 + +```shell +kubectl get pods -w -l app=nginx +``` + +2つ目のターミナルで、`kubectl patch`コマンドを使用して、StatefulSetを3つのレプリカにスケールダウンします。 + +```shell +kubectl patch sts web -p '{"spec":{"replicas":3}}' +``` +``` +statefulset.apps/web patched +``` + +`web-4`および`web-3`がTerminatingの状態になるまで待ちます。 + +```shell +kubectl get pods -w -l app=nginx +``` +``` +NAME READY STATUS RESTARTS AGE +web-0 1/1 Running 0 3h +web-1 1/1 Running 0 3h +web-2 1/1 Running 0 55s +web-3 1/1 Running 0 36s +web-4 0/1 ContainerCreating 0 18s +NAME READY STATUS RESTARTS AGE +web-4 1/1 Running 0 19s +web-4 1/1 Terminating 0 24s +web-4 1/1 Terminating 0 24s +web-3 1/1 Terminating 0 42s +web-3 1/1 Terminating 0 42s +``` + +### 順序付きPodを削除する + +コントローラーは、順序インデックスの逆順に1度に1つのPodを削除し、次のPodを削除する前には、各Podが完全にシャットダウンするまで待機しています。 + +StatefulSetのPersistentVolumeClaimを取得しましょう。 + +```shell +kubectl get pvc -l app=nginx +``` +``` +NAME STATUS VOLUME CAPACITY ACCESSMODES AGE +www-web-0 Bound pvc-15c268c7-b507-11e6-932f-42010a800002 1Gi RWO 13h +www-web-1 Bound pvc-15c79307-b507-11e6-932f-42010a800002 1Gi RWO 13h +www-web-2 Bound pvc-e1125b27-b508-11e6-932f-42010a800002 1Gi RWO 13h +www-web-3 Bound pvc-e1176df6-b508-11e6-932f-42010a800002 1Gi RWO 13h +www-web-4 Bound pvc-e11bb5f8-b508-11e6-932f-42010a800002 1Gi RWO 13h + +``` + +まだ、5つのPersistentVolumeClaimと5つのPersistentVolumeが残っています。[安定したストレージへの書き込み](#writing-to-stable-storage)を読むと、StatefulSetのPodが削除されても、StatefulSetのPodにマウントされたPersistentVolumeは削除されないと書かれています。このことは、StatefulSetのスケールダウンによってPodが削除された場合にも当てはまります。 + +## StatefulSetsを更新する + +Kubernetes 1.7以降では、StatefulSetコントローラーは自動アップデートをサポートしています。使われる戦略は、StatefulSet APIオブジェクトの`spec.updateStrategy`フィールドによって決まります。この機能はコンテナイメージのアップグレード、リソースのrequestsやlimits、ラベル、StatefulSet内のPodのアノテーションの更新時に利用できます。有効なアップデートの戦略は、`RollingUpdate`と`OnDelete`の2種類です。 + +`RollingUpdate`は、StatefulSetのデフォルトのアップデート戦略です。 + +### RollingUpdate + +`RollingUpdate`アップデート戦略は、StatefulSetの保証を尊重しながら、順序インデックスの逆順にStatefulSet内のすべてのPodをアップデートします。 + +`web`StatefulSetにpatchを当てて、`RollingUpdate`アップデート戦略を適用しましょう。 + +```shell +kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}' +``` +``` +statefulset.apps/web patched +``` + +1つ目のターミナルで、`web`StatefulSetに再度patchを当てて、コンテナイメージを変更します。 + +```shell +kubectl patch statefulset web --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"gcr.io/google_containers/nginx-slim:0.8"}]' +``` +``` +statefulset.apps/web patched +``` + +2つ目のターミナルで、StatefulSet内のPodを監視します。 + +```shell +kubectl get pod -l app=nginx -w +``` +出力は次のようになります。 +``` +NAME READY STATUS RESTARTS AGE +web-0 1/1 Running 0 7m +web-1 1/1 Running 0 7m +web-2 1/1 Running 0 8m +web-2 1/1 Terminating 0 8m +web-2 1/1 Terminating 0 8m +web-2 0/1 Terminating 0 8m +web-2 0/1 Terminating 0 8m +web-2 0/1 Terminating 0 8m +web-2 0/1 Terminating 0 8m +web-2 0/1 Pending 0 0s +web-2 0/1 Pending 0 0s +web-2 0/1 ContainerCreating 0 0s +web-2 1/1 Running 0 19s +web-1 1/1 Terminating 0 8m +web-1 0/1 Terminating 0 8m +web-1 0/1 Terminating 0 8m +web-1 0/1 Terminating 0 8m +web-1 0/1 Pending 0 0s +web-1 0/1 Pending 0 0s +web-1 0/1 ContainerCreating 0 0s +web-1 1/1 Running 0 6s +web-0 1/1 Terminating 0 7m +web-0 1/1 Terminating 0 7m +web-0 0/1 Terminating 0 7m +web-0 0/1 Terminating 0 7m +web-0 0/1 Terminating 0 7m +web-0 0/1 Terminating 0 7m +web-0 0/1 Pending 0 0s +web-0 0/1 Pending 0 0s +web-0 0/1 ContainerCreating 0 0s +web-0 1/1 Running 0 10s +``` + +StatefulSet内のPodは、順序インデックスの逆順に更新されました。StatefulSetコントローラーは各Podを終了させ、次のPodを更新する前に、新しいPodがRunningかつReadyの状態に変わるまで待機します。ここで、StatefulSetコントローラーは順序インデックスの前のPodがRunningかつReadyの状態になるまで次のPodの更新を始めず、現在の状態へのアップデートに失敗したPodがあった場合、そのPodをリストアすることに注意してください。 + +すでにアップデートを受け取ったPodは、アップデートされたバージョンにリストアされます。まだアップデートを受け取っていないPodは、前のバージョンにリストアされます。このような方法により、もし途中で失敗が起こっても、コントローラはアプリケーションが健全な状態を保ち続けられるようにし、更新が一貫したものになるようにします。 + +Podを取得して、コンテナイメージを確認してみましょう。 + +```shell +for p in 0 1 2; do kubectl get pod "web-$p" --template '{{range $i, $c := .spec.containers}}{{$c.image}}{{end}}'; echo; done +``` +``` +k8s.gcr.io/nginx-slim:0.8 +k8s.gcr.io/nginx-slim:0.8 +k8s.gcr.io/nginx-slim:0.8 + +``` + +現在、StatefulSet内のすべてのPodは、前のコンテナイメージを実行しています。 + +{{< note >}} +`kubectl rollout status sts/`を使って、StatefulSetへのローリングアップデートの状態を確認することもできます。 +{{< /note >}} + +#### ステージングアップデート {#staging-an-update} + +`RollingUpdate`アップデート戦略に`partition`パラメーターを使用すると、StatefulSetへのアップデートをステージングすることができます。ステージングアップデートを利用すれば、StatefulSet内のすべてのPodを現在のバージョンにしたまま、StatefulSetの`.spec.template`を変更することが可能になります。 + +`web`StatefulSetにpatchを当てて、`updateStrategy`フィールドにpartitionを追加しましょう。 + +```shell +kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate","rollingUpdate":{"partition":3}}}}' +``` +``` +statefulset.apps/web patched +``` + +StatefulSetに再度patchを当てて、コンテナイメージを変更します。 + +```shell +kubectl patch statefulset web --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"k8s.gcr.io/nginx-slim:0.7"}]' +``` +``` +statefulset.apps/web patched +``` + +StatefulSet内のPodを削除します。 + +```shell +kubectl delete pod web-2 +``` +``` +pod "web-2" deleted +``` + +PodがRunningかつReadyになるまで待ちます。 + +```shell +kubectl get pod -l app=nginx -w +``` +``` +NAME READY STATUS RESTARTS AGE +web-0 1/1 Running 0 4m +web-1 1/1 Running 0 4m +web-2 0/1 ContainerCreating 0 11s +web-2 1/1 Running 0 18s +``` + +Podのコンテナイメージを取得します。 + +```shell +kubectl get pod web-2 --template '{{range $i, $c := .spec.containers}}{{$c.image}}{{end}}' +``` +``` +k8s.gcr.io/nginx-slim:0.8 +``` + +アップデート戦略が`RollingUpdate`であっても、StatefulSetが元のコンテナを持つPodをリストアしたことがわかります。これは、Podの順序インデックスが`updateStrategy`で指定した`partition`より小さいためです。 + +#### カナリア版をロールアウトする {#rolling-out-a-canary} + +[ステージングアップデート](#staging-an-update)のときに指定した`partition`を小さくすることで、変更をテストするためのカナリア版をロールアウトできます。 + +StatefulSetにpatchを当てて、partitionを小さくします。 + +```shell +kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate","rollingUpdate":{"partition":2}}}}' +``` +``` +statefulset.apps/web patched +``` + +`web-2`がRunningかつReadyの状態になるまで待ちます。 + +```shell +kubectl get pod -l app=nginx -w +``` +``` +NAME READY STATUS RESTARTS AGE +web-0 1/1 Running 0 4m +web-1 1/1 Running 0 4m +web-2 0/1 ContainerCreating 0 11s +web-2 1/1 Running 0 18s +``` + +Podのコンテナを取得します。 + +```shell +kubectl get pod web-2 --template '{{range $i, $c := .spec.containers}}{{$c.image}}{{end}}' +``` +``` +k8s.gcr.io/nginx-slim:0.7 + +``` + +`partition`を変更すると、StatefulSetコントローラーはPodを自動的に更新します。Podの順序インデックスが`partition`以上の値であるためです。 + +`web-1`Podを削除します。 + +```shell +kubectl delete pod web-1 +``` +``` +pod "web-1" deleted +``` + +`web-1`PodがRunningかつReadyになるまで待ちます。 + +```shell +kubectl get pod -l app=nginx -w +``` +出力は次のようになります。 +``` +NAME READY STATUS RESTARTS AGE +web-0 1/1 Running 0 6m +web-1 0/1 Terminating 0 6m +web-2 1/1 Running 0 2m +web-1 0/1 Terminating 0 6m +web-1 0/1 Terminating 0 6m +web-1 0/1 Terminating 0 6m +web-1 0/1 Pending 0 0s +web-1 0/1 Pending 0 0s +web-1 0/1 ContainerCreating 0 0s +web-1 1/1 Running 0 18s +``` + +`web-1`Podのコンテナイメージを取得します。 + +```shell +kubectl get pod web-1 --template '{{range $i, $c := .spec.containers}}{{$c.image}}{{end}}' +``` +``` +k8s.gcr.io/nginx-slim:0.8 +``` + +Podの順序インデックスがpartitionよりも小さいため、`web-1`は元の設定のコンテナイメージにリストアされました。partitionを指定すると、StatefulSetの`.spec.template`が更新されたときに、順序インデックスがそれ以上の値を持つすべてのPodがアップデートされます。partitionよりも小さな順序インデックスを持つPodが削除されたり終了されたりすると、元の設定のPodにリストアされます。 + +#### フェーズロールアウト + +[カナリア版](#rolling-out-a-canary)をロールアウトするのと同じような方法でパーティションされたローリングアップデートを使用すると、フェーズロールアウト(例: 線形、幾何級数的、指数関数的ロールアウト)を実行できます。フェーズロールアウトを実行するには、コントローラーがアップデートを途中で止めてほしい順序インデックスを`partition`に設定します。 + +現在、partitionは`2`に設定されています。partitionを`0`に設定します。 + +```shell +kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate","rollingUpdate":{"partition":0}}}}' +``` +``` +statefulset.apps/web patched +``` + +StatefulSet内のすべてのPodがRunningかつReadyの状態になるまで待ちます。 + +```shell +kubectl get pod -l app=nginx -w +``` +出力は次のようになります。 +``` +NAME READY STATUS RESTARTS AGE +web-0 1/1 Running 0 3m +web-1 0/1 ContainerCreating 0 11s +web-2 1/1 Running 0 2m +web-1 1/1 Running 0 18s +web-0 1/1 Terminating 0 3m +web-0 1/1 Terminating 0 3m +web-0 0/1 Terminating 0 3m +web-0 0/1 Terminating 0 3m +web-0 0/1 Terminating 0 3m +web-0 0/1 Terminating 0 3m +web-0 0/1 Pending 0 0s +web-0 0/1 Pending 0 0s +web-0 0/1 ContainerCreating 0 0s +web-0 1/1 Running 0 3s +``` + +StatefulSet内のPodのコンテナイメージの詳細を取得します。 + +```shell +for p in 0 1 2; do kubectl get pod "web-$p" --template '{{range $i, $c := .spec.containers}}{{$c.image}}{{end}}'; echo; done +``` +``` +k8s.gcr.io/nginx-slim:0.7 +k8s.gcr.io/nginx-slim:0.7 +k8s.gcr.io/nginx-slim:0.7 +``` + +`partition`を`0`に移動することで、StatefulSetがアップデート処理を続けられるようにできます。 + +### OnDelete + +`OnDelete`アップデート戦略は、(1.6以前の)レガシーな動作を実装しています。このアップデート戦略を選択すると、StatefulSetの`.spec.template`フィールドへ変更を加えても、StatefulSetコントローラーが自動的にPodを更新しなくなります。この戦略を選択するには、`.spec.template.updateStrategy.type`に`OnDelete`を設定します。 + +## StatefulSetを削除する + +StatefulSetは、非カスケードな削除とカスケードな削除の両方をサポートしています。非カスケードな削除では、StatefulSetが削除されても、StatefulSet内のPodは削除されません。カスケードな削除では、StatefulSetとPodが一緒に削除されます。 + +### 非カスケードな削除 + +1つ目のターミナルで、StatefulSet内のPodを監視します + +``` +kubectl get pods -w -l app=nginx +``` + +[`kubectl delete`](/ja/docs/reference/generated/kubectl/kubectl-commands/#delete)を使用して、StatefulSetを削除します。このとき、`--cascade=false`パラメーターをコマンドに与えてください。このパラメーターは、Kubernetesに対して、StatefulSetだけを削除して配下のPodは削除しないように指示します。 + +```shell +kubectl delete statefulset web --cascade=false +``` +``` +statefulset.apps "web" deleted +``` + +Podを取得して、ステータスを確認します。 + +```shell +kubectl get pods -l app=nginx +``` +``` +NAME READY STATUS RESTARTS AGE +web-0 1/1 Running 0 6m +web-1 1/1 Running 0 7m +web-2 1/1 Running 0 5m +``` + +`web`が削除されても、すべてのPodはまだRunningかつReadyの状態のままです。`web-0`を削除します。 + +```shell +kubectl delete pod web-0 +``` +``` +pod "web-0" deleted +``` + +StatefulSetのPodを取得します。 + +```shell +kubectl get pods -l app=nginx +``` +``` +NAME READY STATUS RESTARTS AGE +web-1 1/1 Running 0 10m +web-2 1/1 Running 0 7m +``` + +`web`StatefulSetはすでに削除されているため、`web-0`は再起動しません。 + +1つ目のターミナルで、StatefulSetのPodを監視します。 + +```shell +kubectl get pods -w -l app=nginx +``` + +2つ目のターミナルで、StatefulSetを再作成します。もし`nginx`Serviceを削除しなかった場合(この場合は削除するべきではありませんでした)、Serviceがすでに存在することを示すエラーが表示されます。 + +```shell +kubectl apply -f web.yaml +``` +``` +statefulset.apps/web created +service/nginx unchanged +``` + +このエラーは無視してください。このメッセージは、すでに存在する _nginx_ というheadless Serviceを作成しようと試みたということを示しているだけです。 + +1つ目のターミナルで、`kubectl get`コマンドの出力を確認します。 + +```shell +kubectl get pods -w -l app=nginx +``` +``` +NAME READY STATUS RESTARTS AGE +web-1 1/1 Running 0 16m +web-2 1/1 Running 0 2m +NAME READY STATUS RESTARTS AGE +web-0 0/1 Pending 0 0s +web-0 0/1 Pending 0 0s +web-0 0/1 ContainerCreating 0 0s +web-0 1/1 Running 0 18s +web-2 1/1 Terminating 0 3m +web-2 0/1 Terminating 0 3m +web-2 0/1 Terminating 0 3m +web-2 0/1 Terminating 0 3m +``` + + `web`StatefulSetが再作成されると、最初に`web-0`を再実行します。`web-1`はすでにRunningかつReadyの状態であるため、`web-0`がRunningかつReadyの状態に移行すると、StatefulSetは単純にこのPodを選びます。StatefulSetを`replicas`を2にして再作成したため、一度`web-0`が再作成されて、`web-1`がすでにRunningかつReadyの状態であることが判明したら、`web-2`は停止されます。 + +Podのウェブサーバーが配信している`index.html`ファイルのコンテンツをもう一度見てみましょう。 + +```shell +for i in 0 1; do kubectl exec -i -t "web-$i" -- curl http://localhost/; done +``` +``` +web-0 +web-1 +``` + +たとえStatefulSetと`web-0`Podの両方が削除されても、Podは最初に`index.html`ファイルに書き込んだホスト名をまだ配信しています。これは、StatefulSetがPodに紐付けられたPersistentVolumeを削除しないためです。StatefulSetを再作成して`web-0`を再実行すると、元のPersistentVolumeが再マウントされます。 + +### カスケードな削除 + +1つ目のターミナルで、StatefulSet内のPodを監視します。 + +```shell +kubectl get pods -w -l app=nginx +``` + +2つ目のターミナルで、StatefulSetをもう一度削除します。今回は、`--cascade=false`パラメーターを省略します。 + +```shell +kubectl delete statefulset web +``` +``` +statefulset.apps "web" deleted +``` + +1つ目のターミナルで実行している`kubectl get`コマンドの出力を確認し、すべてのPodがTerminatingの状態に変わるまで待ちます。 + +```shell +kubectl get pods -w -l app=nginx +``` +``` +NAME READY STATUS RESTARTS AGE +web-0 1/1 Running 0 11m +web-1 1/1 Running 0 27m +NAME READY STATUS RESTARTS AGE +web-0 1/1 Terminating 0 12m +web-1 1/1 Terminating 0 29m +web-0 0/1 Terminating 0 12m +web-0 0/1 Terminating 0 12m +web-0 0/1 Terminating 0 12m +web-1 0/1 Terminating 0 29m +web-1 0/1 Terminating 0 29m +web-1 0/1 Terminating 0 29m + +``` + +[スケールダウン](#scaling-down)のセクションで見たように、順序インデックスの逆順に従って、Podは一度に1つずつ終了します。StatefulSetコントローラーは、次のPodを終了する前に、前のPodが完全に終了するまで待ちます。 + +{{< note >}} +カスケードな削除ではStatefulSetがPodとともに削除されますが、StatefulSetと紐付けられたheadless Serviceは削除されません。そのため、`nginx`Serviceは手動で削除する必要があります。 +{{< /note >}} + + +```shell +kubectl delete service nginx +``` +``` +service "nginx" deleted +``` + +さらにもう一度、StatefulSetとheadless Serviceを再作成します。 + +```shell +kubectl apply -f web.yaml +``` +``` +service/nginx created +statefulset.apps/web created +``` + +StatefulSet上のすべてのPodがRunningかつReadyの状態に変わったら、Pod上の`index.html`ファイルのコンテンツを取得します。 + +```shell +for i in 0 1; do kubectl exec -i -t "web-$i" -- curl http://localhost/; done +``` +``` +web-0 +web-1 +``` + +StatefulSetを完全に削除して、すべてのPodが削除されたとしても、PersistentVolumeがマウントされたPodが再生成されて、`web-0`と`web-1`はホスト名の配信を続けます。 + +最後に、`web`StatefulSetを削除します。 + +```shell +kubectl delete service nginx +``` +``` +service "nginx" deleted +``` +そして、`nginx`Serviceも削除します。 +```shell +kubectl delete statefulset web +``` +``` +statefulset "web" deleted +``` + +## Pod管理ポリシー + +分散システムによっては、StatefulSetの順序の保証が不必要であったり望ましくない場合もあります。こうしたシステムでは、一意性と同一性だけが求められます。この問題に対処するために、Kubernetes 1.7でStatefulSet APIオブジェクトに`.spec.podManagementPolicy`が導入されました。 + +### OrderedReadyのPod管理 + +`OrderedReady`のPod管理はStatefulSetのデフォルトの設定です。StatefulSetコントローラーに対して、これまでに紹介したような順序の保証を尊重するように指示します。 + +### ParallelのPod管理 + +`Parallel`のPod管理では、StatefulSetコントローラーに対して、PodがRunningかつReadyの状態や完全に停止するまで待たないように指示し、すべてのPodを並列に起動または停止させるようにします。 + +{{< codenew file="application/web/web-parallel.yaml" >}} + +上の例をダウンロードして、`web-parallel.yaml`という名前でファイルに保存してください。 + +このマニフェストは、`.spec.podManagementPolicy`が`Parallel`に設定されている以外は、前にダウンロードした`web`StatefulSetと同一です。 + +1つ目のターミナルで、StatefulSet内のPodを監視します。 + +```shell +kubectl get pod -l app=nginx -w +``` + +2つ目のターミナルで、マニフェスト内のStatefulSetとServiceを作成します。 + +```shell +kubectl apply -f web-parallel.yaml +``` +``` +service/nginx created +statefulset.apps/web created +``` + +1つ目のターミナルで実行した`kubectl get`コマンドの出力を確認します。 + +```shell +kubectl get pod -l app=nginx -w +``` +``` +NAME READY STATUS RESTARTS AGE +web-0 0/1 Pending 0 0s +web-0 0/1 Pending 0 0s +web-1 0/1 Pending 0 0s +web-1 0/1 Pending 0 0s +web-0 0/1 ContainerCreating 0 0s +web-1 0/1 ContainerCreating 0 0s +web-0 1/1 Running 0 10s +web-1 1/1 Running 0 10s +``` + +StatefulSetコントローラーは`web-0`と`web-1`を同時に起動しています。 + +2つ目のターミナルで、StatefulSetをスケールしてみます。 + +```shell +kubectl scale statefulset/web --replicas=4 +``` +``` +statefulset.apps/web scaled +``` + +`kubectl get`コマンドを実行しているターミナルの出力を確認します。 + +``` +web-3 0/1 Pending 0 0s +web-3 0/1 Pending 0 0s +web-3 0/1 Pending 0 7s +web-3 0/1 ContainerCreating 0 7s +web-2 1/1 Running 0 10s +web-3 1/1 Running 0 26s +``` + +StatefulSetが2つのPodを実行し、1つ目のPodがRunningかつReadyの状態になるのを待たずに2つ目のPodを実行しているのがわかります。 + +## {{% heading "cleanup" %}} + +2つのターミナルが開かれているはずなので、クリーンアップの一部として`kubectl`コマンドを実行する準備ができています。 + +```shell +kubectl delete sts web +# stsは、statefulsetの略です。 +``` + +`kubectl get`を監視すると、Podが削除されていく様子を確認できます。 + +```shell +kubectl get pod -l app=nginx -w +``` +``` +web-3 1/1 Terminating 0 9m +web-2 1/1 Terminating 0 9m +web-3 1/1 Terminating 0 9m +web-2 1/1 Terminating 0 9m +web-1 1/1 Terminating 0 44m +web-0 1/1 Terminating 0 44m +web-0 0/1 Terminating 0 44m +web-3 0/1 Terminating 0 9m +web-2 0/1 Terminating 0 9m +web-1 0/1 Terminating 0 44m +web-0 0/1 Terminating 0 44m +web-2 0/1 Terminating 0 9m +web-2 0/1 Terminating 0 9m +web-2 0/1 Terminating 0 9m +web-1 0/1 Terminating 0 44m +web-1 0/1 Terminating 0 44m +web-1 0/1 Terminating 0 44m +web-0 0/1 Terminating 0 44m +web-0 0/1 Terminating 0 44m +web-0 0/1 Terminating 0 44m +web-3 0/1 Terminating 0 9m +web-3 0/1 Terminating 0 9m +web-3 0/1 Terminating 0 9m +``` + +削除の間、StatefulSetはすべてのPodを並列に削除し、順序インデックスが1つ前のPodが停止するのを待つことはありません。 + +`kubectl get`コマンドを実行しているターミナルを閉じて、`nginx`Serviceを削除します。 + +```shell +kubectl delete svc nginx +``` + +{{< note >}} +このチュートリアルで使用したPersistentVolumeのための永続ストレージも削除する必要があります。 + +すべてのストレージが再利用できるようにするために、環境、ストレージの設定、プロビジョニング方法に基づいて必要な手順に従ってください。 +{{< /note >}} diff --git a/content/ja/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume.md b/content/ja/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume.md new file mode 100644 index 0000000000..7aed33777e --- /dev/null +++ b/content/ja/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume.md @@ -0,0 +1,241 @@ +--- +title: "例: Persistent Volumeを使用したWordpressとMySQLをデプロイする" +content_type: tutorial +weight: 20 +card: + name: tutorials + weight: 40 + title: "ステートフルの例: Persistent Volumeを使用したWordpress" +--- + + +このチュートリアルでは、WordPressのサイトとMySQLデータベースをMinikubeを使ってデプロイする方法を紹介します。2つのアプリケーションとも、データを保存するためにPersistentVolumeとPersistentVolumeClaimを使用します。 + +[PersistentVolume](/ja/docs/concepts/storage/persistent-volumes/)(PV)とは、管理者が手動でプロビジョニングを行うか、[StorageClass](/docs/concepts/storage/storage-classes)を使ってKubernetesによって動的にプロビジョニングされた、クラスター内のストレージの一部です。[PersistentVolumeClaim](/ja/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims)(PVC)は、PVによって満たすことができる、ユーザーによるストレージへのリクエストのことです。PersistentVolumeとPersistentVolumeClaimは、Podのライフサイクルからは独立していて、Podの再起動、Podの再スケジューリング、さらにはPodの削除が行われたとしても、その中のデータは削除されずに残ります。 + +{{< warning >}} +シングルインスタンスのWordPressとMySQLのPodを使用しているため、ここで行うデプロイは本番のユースケースには適しません。WordPressを本番環境にデプロイするときは、[WordPress Helm Chart](https://github.com/kubernetes/charts/tree/master/stable/wordpress)を使用することを検討してください。 +{{< /warning >}} + +{{< note >}} +このチュートリアルで提供されるファイルは、GAとなっているDeployment APIを使用しているため、Kubernetesバージョン1.9以降のためのものになっています。もしこのチュートリアルを古いバージョンのKubernetesで使いたい場合は、APIのバージョンを適切にアップデートするか、このチュートリアルの古いバージョンを参照してください。 +{{< /note >}} + + + +## {{% heading "objectives" %}} + +* PersistentVolumeClaimとPersistentVolumeを作成する +* 以下を含む`kustomization.yaml`を作成する + * Secret generator + * MySQLリソースの設定 + * WordPressリソースの設定 +* kustomizationディレクトリを`kubectl apply -k ./`で適用する +* クリーンアップする + + + +## {{% heading "prerequisites" %}} + + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} +このページで示された例は、`kubectl` 1.14以降で動作します。 + +以下の設定ファイルをダウンロードします。 + +1. [mysql-deployment.yaml](/examples/application/wordpress/mysql-deployment.yaml) + +1. [wordpress-deployment.yaml](/examples/application/wordpress/wordpress-deployment.yaml) + + + + + +## PersistentVolumeClaimとPersistentVolumeを作成する + +MySQLとWordpressはそれぞれ、データを保存するためのPersistentVolumeを必要とします。各PersistentVolumeClaimはデプロイの段階で作成されます。 + +多くのクラスタ環境では、デフォルトのStorageClassがインストールされています。StorageClassがPersistentVolumeClaim中で指定されていなかった場合、クラスターのデフォルトのStorageClassが代わりに使われます。 + +PersistentVolumeClaimが作成されるとき、StorageClassの設定に基づいてPersistentVolumeが動的にプロビジョニングされます。 + +{{< warning >}} +ローカルのクラスターでは、デフォルトのStorageClassには`hostPath`プロビジョナーが使われます。`hostPath`ボリュームは開発およびテストにのみ適しています。`hostPath`ボリュームでは、データはPodがスケジュールされたノード上の`/tmp`内に保存されます。そのため、もしPodが死んだり、クラスター上の他のノードにスケジュールされたり、ノードが再起動すると、データは失われます。 +{{< /warning >}} + +{{< note >}} +`hostPath`プロビジョナーを使用する必要があるクラスターを立ち上げたい場合は、`--enable-hostpath-provisioner`フラグを `controller-manager` コンポーネントで設定する必要があります。 +{{< /note >}} + +{{< note >}} +Google Kubernetes Engine上で動作するKubernetesクラスターを使っている場合は、[このガイド](https://cloud.google.com/kubernetes-engine/docs/tutorials/persistent-disk?hl=ja)に従ってください。 +{{< /note >}} + +## kustomization.yamlを作成する + +### Secret generatorを追加する + +[Secret](/docs/concepts/configuration/secret/)とは、パスワードやキーのような機密性の高いデータ片を保存するためのオブジェクトです。バージョン1.14からは、`kubectl`がkustomizationファイルを使用したKubernetesオブジェクトの管理をサポートしています。`kustomization.yaml`内のgeneratorによってSecretを作成することができます。 + +以下のコマンドを実行して、`kustomization.yaml`の中にSecret generatorを追加します。`YOUR_PASSWORD`の部分を使いたいパスワードに置換してください。 + +```shell +cat <./kustomization.yaml +secretGenerator: +- name: mysql-pass + literals: + - password=YOUR_PASSWORD +EOF +``` + +## MySQLとWordPressのためのリソースの設定を追加する + +以下のマニフェストには、シングルインスタンスのMySQLのDeploymentが書かれています。MySQLコンテナはPersistentVolumeを`/var/lib/mysql`にマウントします。`MYSQL_ROOT_PASSWORD`環境変数には、Secretから得られたデータベースのパスワードが設定されます。 + +{{< codenew file="application/wordpress/mysql-deployment.yaml" >}} + +以下のマニフェストには、シングルインスタンスのWordPressのDeploymentが書かれています。WordPressコンテナはPersistentVolumeをウェブサイトのデータファイルのために`/var/www/html`にマウントします。`WORDPRESS_DB_HOST`環境変数に上で定義したMySQLのServiceの名前を設定すると、WordPressはServiceによってデータベースにアクセスします。`WORDPRESS_DB_PASSWORD`環境変数には、kustomizeが生成したSecretから得たデータベースのパスワードが設定されます。 + + +{{< codenew file="application/wordpress/wordpress-deployment.yaml" >}} + +1. MySQLのDeploymentの設定ファイルをダウンロードします。 + + ```shell + curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml + ``` + +2. WordPressの設定ファイルをダウンロードします。 + + ```shell + curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml + ``` + +3. これらを`kustomization.yaml`ファイルに追加します。 + +```shell +cat <>./kustomization.yaml +resources: + - mysql-deployment.yaml + - wordpress-deployment.yaml +EOF +``` + +## 適用と確認 + +`kustomization.yaml`には、WordPressのサイトとMySQLデータベースのためのすべてのリソースが含まれています。次のコマンドでこのディレクトリを適用できます。 + +```shell +kubectl apply -k ./ +``` + +これで、すべてのオブジェクトが存在していることを確認できます。 + +1. 次のコマンドを実行して、Secretが存在していることを確認します。 + + ```shell + kubectl get secrets + ``` + + 結果は次のようになるはずです。 + + ```shell + NAME TYPE DATA AGE + mysql-pass-c57bb4t7mf Opaque 1 9s + ``` + +1. 次のコマンドを実行して、PersistentVolumeが動的にプロビジョニングされていることを確認します。 + + ```shell + kubectl get pvc + ``` + + {{< note >}} + PVがプロビジョニングされてバインドされるまでに、最大で数分かかる場合があります。 + {{< /note >}} + + 結果は次のようになるはずです。 + + ```shell + NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE + mysql-pv-claim Bound pvc-8cbd7b2e-4044-11e9-b2bb-42010a800002 20Gi RWO standard 77s + wp-pv-claim Bound pvc-8cd0df54-4044-11e9-b2bb-42010a800002 20Gi RWO standard 77s + ``` + +3. 次のコマンドを実行して、Podが実行中であることを確認します。 + + ```shell + kubectl get pods + ``` + + {{< note >}} + PodのStatusが`Running`の状態になる前に、最大で数分かかる場合があります。 + {{< /note >}} + + 結果は次のようになるはずです。 + + ``` + NAME READY STATUS RESTARTS AGE + wordpress-mysql-1894417608-x5dzt 1/1 Running 0 40s + ``` + +4. 次のコマンドを実行して、Serviceが実行中であることを確認します。 + + ```shell + kubectl get services wordpress + ``` + + 結果は次のようになるはずです。 + + ``` + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + wordpress ClusterIP 10.0.0.89 80:32406/TCP 4m + ``` + + {{< note >}} + MinikubeではServiceを`NodePort`経由でしか公開できません。EXTERNAL-IPは常にpendingのままになります。 + {{< /note >}} + +5. 次のコマンドを実行して、WordPress ServiceのIPアドレスを取得します。 + + ```shell + minikube service wordpress --url + ``` + + 結果は次のようになるはずです。 + + ``` + http://1.2.3.4:32406 + ``` + +6. IPアドレスをコピーして、ブラウザーで読み込み、サイトを表示しましょう。 + + WordPressによりセットアップされた次のスクリーンショットのようなページが表示されるはずです。 + + ![wordpress-init](https://raw.githubusercontent.com/kubernetes/examples/master/mysql-wordpress-pd/WordPress.png) + +{{< warning >}} +WordPressのインストールをこのページのまま放置してはいけません。もしほかのユーザーがこのページを見つけた場合、その人はインスタンス上にウェブサイトをセットアップして、悪意のあるコンテンツの配信に利用できてしまいます。

ユーザー名とパスワードを決めてWordPressをインストールするか、このインスタンスを削除してください。 +{{< /warning >}} + + + +## {{% heading "cleanup" %}} + + +1. 次のコマンドを実行して、Secret、Deployment、Service、およびPersistentVolumeClaimを削除します。 + + ```shell + kubectl delete -k ./ + ``` + + + +## {{% heading "whatsnext" %}} + + +* [イントロスペクションとデバッグ](/docs/tasks/debug-application-cluster/debug-application-introspection/)についてさらに学ぶ +* [Job](/docs/concepts/workloads/controllers/job/)についてさらに学ぶ +* [Portフォワーディング](/docs/tasks/access-application-cluster/port-forward-access-application-cluster/)についてさらに学ぶ +* [コンテナへのシェルを取得する](/ja/docs/tasks/debug-application-cluster/get-shell-running-container/)方法について学ぶ + diff --git a/content/ja/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk.md b/content/ja/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk.md new file mode 100644 index 0000000000..aac1e685cb --- /dev/null +++ b/content/ja/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk.md @@ -0,0 +1,462 @@ +--- +title: "例: PHP / Redisを使用したゲストブックの例にロギングとメトリクスを追加する" +content_type: tutorial +weight: 21 +card: + name: tutorials + weight: 31 + title: "例: PHP / Redisを使用したゲストブックの例にロギングとメトリクスを追加する" +--- + + +このチュートリアルは、[Redisを使用したPHPのゲストブック](/ja/docs/tutorials/stateless-application/guestbook)のチュートリアルを前提に作られています。Elasticが開発したログ、メトリクス、ネットワークデータを転送するオープンソースの軽量データシッパーである*Beats*を、ゲストブックと同じKubernetesクラスターにデプロイします。BeatsはElasticsearchに対してデータの収集、分析、インデックス作成を行うため、結果の運用情報をKibana上で表示・分析できるようになります。この例は、以下のコンポーネントから構成されます。 + +* [Redisを使用したPHPのゲストブック](/ja/docs/tutorials/stateless-application/guestbook)の実行中のインスタンス +* ElasticsearchとKibana +* Filebeat +* Metricbeat +* Packetbeat + + + +## {{% heading "objectives" %}} + +* Redisを使用したPHPのゲストブックを起動する。 +* kube-state-metricsをインストールする。 +* KubernetesのSecretを作成する。 +* Beatsをデプロイする。 +* ログとメトリクスのダッシュボードを表示する。 + + +## {{% heading "prerequisites" %}} + + +{{< include "task-tutorial-prereqs.md" >}} +{{< version-check >}} + +追加で以下の作業が必要です。 + +* [Redisを使用したPHPのゲストブック](/ja/docs/tutorials/stateless-application/guestbook)チュートリアルの実行。 + +* ElasticsearchとKibanaのdeploymentの実行。[Elastic Cloud上のElasticsearchサービス](https://cloud.elastic.co)を使用するか、[ファイルをダウンロード](https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-elastic-stack.html)してワークステーションやサーバー上で実行するか、または[Elastic Helm Chart](https://github.com/elastic/helm-charts)が使用できます。 + + + + + +## Redisを使用したPHPのゲストブックを起動する + +このチュートリアルは、[Redisを使用したPHPのゲストブック](/ja/docs/tutorials/stateless-application/guestbook)のチュートリアルを前提に作られています。もしゲストブックアプリケーションが実行中なら、そのアプリケーションを監視できます。もしまだ実行中のアプリケーションがなければ、ゲストブックのデプロイの手順を行い、**クリーンアップ**のステップは実行しないでください。ゲストブックが起動したら、このページに戻ってきてください。 + +## Cluster role bindingを追加する + +[クラスターレベルのrole binding](/docs/reference/access-authn-authz/rbac/#rolebinding-and-clusterrolebinding)を作成して、kube-state-metricsとBeatsをクラスターレベルで(kube-system内に)デプロイできるようにします。 + +```shell +kubectl create clusterrolebinding cluster-admin-binding \ + --clusterrole=cluster-admin --user= +``` + +## kube-state-metricsをインストールする + +Kubernetesの[*kube-state-metrics*](https://github.com/kubernetes/kube-state-metrics)は、Kubernetes APIサーバーをlistenして、オブジェクトの状態に関するメトリクスを生成する単純なサービスです。Metricbeatはこれらのメトリクスを報告します。kube-state-metricsをゲストブックが実行されているKubernetesクラスターに追加しましょう。 + +### kube-state-metricsが起動しているか確認する + +```shell +kubectl get pods --namespace=kube-system | grep kube-state +``` + +### 必要に応じてkube-state-metricsをインストールする + +```shell +git clone https://github.com/kubernetes/kube-state-metrics.git kube-state-metrics +kubectl apply -f kube-state-metrics/examples/standard +kubectl get pods --namespace=kube-system | grep kube-state-metrics +``` + +kube-state-metricsがRunningかつreadyの状態になっていることを確認します。 + +```shell +kubectl get pods -n kube-system -l app.kubernetes.io/name=kube-state-metrics +``` + +結果は次のようになります。 + +```shell +NAME READY STATUS RESTARTS AGE +kube-state-metrics-89d656bf8-vdthm 1/1 Running 0 21s +``` + +## GitHubリポジトリのElasticの例をクローンする + +```shell +git clone https://github.com/elastic/examples.git +``` + +これ以降のコマンドは`examples/beats-k8s-send-anywhere`ディレクトリ内のファイルを参照するため、カレントディレクトリを変更します。 + +```shell +cd examples/beats-k8s-send-anywhere +``` + +## KubernetesのSecretを作成する + +Kubernetesの{{< glossary_tooltip text="Secret" term_id="secret" >}}とは、パスワード、トークン、または鍵などの小さなサイズの機密データを含んだオブジェクトのことです。このような機密情報はPodのspecやイメージの中に置くことも不可能ではありませんが、Secretオブジェクトの中に置くことで、情報の使用方法を適切に制御したり、誤って公開してしまうリスクを減らすことができます。 + +{{< note >}} +ここでは2種類の手順を紹介します。1つは*セルフマネージド*な(自分のサーバーで実行中またはElastic Helm Chartを使用して構築された)ElasticsearchおよびKibanaのためのもので、もう1つは*マネージドサービス*のElastic CloudのElasticsearch Serviceのための別の手順です。このチュートリアルで使う種類のElasticsearchおよびKibanaのシステムのためのSecretだけを作成してください。 +{{< /note >}} + +{{< tabs name="tab_with_md" >}} +{{% tab name="セルフマネージド" %}} + +### セルフマネージド + +Elastic Cloud上のElasticsearch Serviceに接続する場合は、**マネージドサービス**タブに切り替えてください。 + +### クレデンシャルを設定する + +セルフマネージドのElasticsearchとKibanaへ接続する場合、KubernetesのSecretを作成するために編集するべきファイルは4つあります(セルフマネージドとは、事実上Elastic Cloud以外で実行されているElasticsearch Serviceを指します)。ファイルは次の4つです。 + +1. ELASTICSEARCH_HOSTS +1. ELASTICSEARCH_PASSWORD +1. ELASTICSEARCH_USERNAME +1. KIBANA_HOST + +これらのファイルにElasticsearchクラスターとKibanaホストの情報を設定してください。ここでは例をいくつか示します([*こちらの設定*](https://stackoverflow.com/questions/59892896/how-to-connect-from-minikube-to-elasticsearch-installed-on-host-local-developme/59892897#59892897)も参照してください)。 + +#### `ELASTICSEARCH_HOSTS` + +1. Elastic Elasticsearch Helm Chartで作成したnodeGroupの場合。 + + ```shell + ["http://elasticsearch-master.default.svc.cluster.local:9200"] + ``` + +1. Mac上で単一のElasticsearchノードが実行されており、BeatsがDocker for Macで実行中の場合。 + + ```shell + ["http://host.docker.internal:9200"] + ``` + +1. 2ノードのElasticsearchがVM上または物理ハードウェア上で実行中の場合。 + + ```shell + ["http://host1.example.com:9200", "http://host2.example.com:9200"] + ``` + +`ELASTICSEARCH_HOSTS`を編集します。 + +```shell +vi ELASTICSEARCH_HOSTS +``` + +#### `ELASTICSEARCH_PASSWORD` + +パスワードだけを書きます。空白、クォート、<>などの文字は書かないでください。 + + + +`ELASTICSEARCH_PASSWORD`を編集します。 + +```shell +vi ELASTICSEARCH_PASSWORD +``` + +#### `ELASTICSEARCH_USERNAME` + +ユーザー名だけを書きます。空白、クォート、<>などの文字は書かないでください。 + + + +`ELASTICSEARCH_USERNAME`を編集します。 + +```shell +vi ELASTICSEARCH_USERNAME +``` + +#### `KIBANA_HOST` + +1. Elastic Kibana Helm Chartで作成したKibanaインスタンスが実行中の場合。`default`というサブドメインは、default Namespaceを指します。もしHelm Chartを別のNamespaceにデプロイした場合、サブドメインは異なります。 + + ```shell + "kibana-kibana.default.svc.cluster.local:5601" + ``` + +1. Mac上でKibanaインスタンスが実行中で、BeatsがDocker for Macで実行中の場合。 + + ```shell + "host.docker.internal:5601" + ``` + +1. 2つのElasticsearchノードが、VMまたは物理ハードウェア上で実行中の場合。 + + ```shell + "host1.example.com:5601" + ``` + +`KIBANA_HOST`を編集します。 + +```shell +vi KIBANA_HOST +``` + +### KubernetesのSecretを作成する + +次のコマンドを実行すると、KubernetesのシステムレベルのNamespace(kube-system)に、たった今編集したファイルを元にSecretが作成されます。 + + kubectl create secret generic dynamic-logging \ + --from-file=./ELASTICSEARCH_HOSTS \ + --from-file=./ELASTICSEARCH_PASSWORD \ + --from-file=./ELASTICSEARCH_USERNAME \ + --from-file=./KIBANA_HOST \ + --namespace=kube-system + +{{% /tab %}} +{{% tab name="マネージドサービス" %}} + +## マネージドサービス + +このタブは、Elastic Cloud上のElasticsearch Serviceの場合のみ必要です。もしセルフマネージドのElasticsearchとKibanaのDeployment向けにSecretをすでに作成した場合、[Beatsをデプロイする](#deploy-the-beats)に進んでください。 + +### クレデンシャルを設定する + +Elastic Cloud上のマネージドElasticsearch Serviceに接続する場合、KubernetesのSecretを作成するために編集する必要があるのは、次の2つのファイルです。 + +1. ELASTIC_CLOUD_AUTH +1. ELASTIC_CLOUD_ID + +Deploymentを作成するときに、Elasticsearch Serviceのコンソールから提供された情報を設定してください。以下に例を示します。 + +#### ELASTIC_CLOUD_ID + +```shell +devk8s:ABC123def456ghi789jkl123mno456pqr789stu123vwx456yza789bcd012efg345hijj678klm901nop345zEwOTJjMTc5YWQ0YzQ5OThlN2U5MjAwYTg4NTIzZQ== +``` + +#### ELASTIC_CLOUD_AUTH + +ユーザー名、コロン(`:`)、パスワードだけを書きます。空白やクォートは書かないでください。 + +```shell +elastic:VFxJJf9Tjwer90wnfTghsn8w +``` + +### 必要なファイルを編集する + +```shell +vi ELASTIC_CLOUD_ID +vi ELASTIC_CLOUD_AUTH +``` + +### KubernetesのSecretを作成する + +次のコマンドを実行すると、KubernetesのシステムレベルのNamespace(kube-system)に、たった今編集したファイルを元にSecretが作成されます。 + + kubectl create secret generic dynamic-logging \ + --from-file=./ELASTIC_CLOUD_ID \ + --from-file=./ELASTIC_CLOUD_AUTH \ + --namespace=kube-system + + {{% /tab %}} +{{< /tabs >}} + +## Beatsをデプロイする {#deploy-the-beats} + +マニフェストファイルはBeatごとに提供されます。これらのマニフェストファイルは、上で作成したSecretを使用して、BeatsをElasticsearchおよびKibanaサーバーに接続するように設定します。 + +### Filebeatについて + +Filebeatは、Kubernetesのノードと、ノード上で実行している各Pod内のコンテナから、ログを収集します。Filebeatは{{< glossary_tooltip text="DaemonSet" term_id="daemonset" >}}としてデプロイされます。FilebeatはKubernetesクラスター上で実行されているアプリケーションを自動検出することもできます。起動時にFilebeatは既存のコンテナをスキャンし、それらに対して適切な設定を立ち上げ、その後、新しいstart/stopイベントを監視します。 + +Filebeatが、ゲストブックアプリケーションでデプロイしたRedisコンテナからRedisのログを特定・解析できるように自動検出を設定する例を示します。この設定は`filebeat-kubernetes.yaml`ファイル内にあります。 + +```yaml +- condition.contains: + kubernetes.labels.app: redis + config: + - module: redis + log: + input: + type: docker + containers.ids: + - ${data.kubernetes.container.id} + slowlog: + enabled: true + var.hosts: ["${data.host}:${data.port}"] +``` + +この設定により、Filebeatは、`app`ラベルに`redis`という文字列が含まれるコンテナを検出したときに`redis` Filebeatモジュールを適用するようになります。redisモジュールには、input typeとしてdockerを使用することで(このRedisコンテナの標準出力のストリームと関連付けられた、Kubernetesノード上のファイルを読み取ることで)コンテナから`log`ストリームを収集する機能があります。さらに、このモジュールには、コンテナのメタデータとして提供された適切なPodのホストとポートと接続することにより、Redisの`slowlog`エントリーを収集する機能もあります。 + +### Filebeatをデプロイする + +```shell +kubectl create -f filebeat-kubernetes.yaml +``` + +#### 検証する + +```shell +kubectl get pods -n kube-system -l k8s-app=filebeat-dynamic +``` + +### Metricbeatについて + +Metricbeatの自動検出はFilebeatと同じ方法で設定します。以下にMetricbeatにおけるRedisコンテナの自動検出の設定を示します。この設定は`metricbeat-kubernetes.yaml`ファイル内にあります。 + +```yaml +- condition.equals: + kubernetes.labels.tier: backend + config: + - module: redis + metricsets: ["info", "keyspace"] + period: 10s + + # Redis hosts + hosts: ["${data.host}:${data.port}"] +``` + +この設定により、Metricbeatは、`tier`ラベルに`backend`という文字列が含まれるコンテナを検出したときに`redis` Metricbeatモジュールを適用するようになります。redisモジュールには、コンテナのメタデータとして提供された適切なPodのホストとポートと接続することにより、コンテナから`info`および`keyspace`メトリクスを収集する機能があります。 + +### Metricbeatをデプロイする + +```shell +kubectl create -f metricbeat-kubernetes.yaml +``` + +#### 検証する + +```shell +kubectl get pods -n kube-system -l k8s-app=metricbeat +``` + +### Packetbeatについて + +Packetbeatの設定は、FilebeatやMetricbeatとは異なります。コンテナのラベルに対するパターンマッチを指定する代わりに、関連するプロトコルとポート番号に基づいた設定を書きます。以下に示すのは、ポート番号のサブセットです。 + +{{< note >}} +サービスを標準ポート以外で実行している場合、そのポート番号を`filebeat.yaml`内の適切なtypeに追加し、PacketbeatのDaemonSetを削除・再作成してください。 +{{< /note >}} + +```yaml +packetbeat.interfaces.device: any + +packetbeat.protocols: +- type: dns + ports: [53] + include_authorities: true + include_additionals: true + +- type: http + ports: [80, 8000, 8080, 9200] + +- type: mysql + ports: [3306] + +- type: redis + ports: [6379] + +packetbeat.flows: + timeout: 30s + period: 10s +``` + +#### Packetbeatをデプロイする + +```shell +kubectl create -f packetbeat-kubernetes.yaml +``` + +#### 検証する + +```shell +kubectl get pods -n kube-system -l k8s-app=packetbeat-dynamic +``` + +## Kibanaで表示する + +ブラウザでKibanaを開き、**Dashboard**アプリケーションを開きます。検索バーでKubernetesと入力して、KubernetesのためのMetricbeatダッシュボードを開きます。このダッシュボードでは、NodeやDeploymentなどの状態のレポートが表示されます。 + +DashboardページでPacketbeatと検索し、Packetbeat overviewを表示します。 + +同様に、ApacheおよびRedisのためのDashboardを表示します。それぞれに対してログとメトリクスのDashboardが表示されます。Apache Metricbeat dashboardには何も表示されていないはずです。Apache Filebeat dashboardを表示して、ページの最下部までスクロールしてApacheのエラーログを確認します。ログを読むと、Apacheのメトリクスが表示されない理由が分かります。 + +Metricbeatを有効にしてApacheのメトリクスを取得するには、mod-status設定ファイルを含んだConfigMapを追加してゲストブックを再デプロイすることで、server-statusを有効にします。 + +## Deploymentをスケールして新しいPodが監視されるのを確認する + +存在するDeploymentを一覧します。 + +```shell +kubectl get deployments +``` + +出力は次のようになります。 + +```shell +NAME READY UP-TO-DATE AVAILABLE AGE +frontend 3/3 3 3 3h27m +redis-master 1/1 1 1 3h27m +redis-slave 2/2 2 2 3h27m +``` + +frontendのPodを2つにスケールダウンします。 + +```shell +kubectl scale --replicas=2 deployment/frontend +``` + +出力は次のようになります。 + +```shell +deployment.extensions/frontend scaled +``` + +frontendのPodを再び3つにスケールアップします。 + +```shell +kubectl scale --replicas=3 deployment/frontend +``` + +## Kibana上で変更を表示する + +スクリーンショットを確認し、指定されたフィルターを追加して、ビューにカラムを追加します。赤い枠の右下を見ると、ScalingReplicaSetというエントリーが確認できます。そこからリストを上に見てゆくと、イメージのpull、ボリュームのマウント、Podのスタートなどのイベントが確認できます。 + +![Kibana Discover](https://raw.githubusercontent.com/elastic/examples/master/beats-k8s-send-anywhere/scaling-up.png) + +## {{% heading "cleanup" %}} + +DeploymentとServiceを削除すると、実行中のすべてのPodも削除されます。ラベルを使って複数のリソースを1つのコマンドで削除します。 + +1. 次のコマンドを実行して、すべてのPod、Deployment、Serviceを削除します。 + + ```shell + kubectl delete deployment -l app=redis + kubectl delete service -l app=redis + kubectl delete deployment -l app=guestbook + kubectl delete service -l app=guestbook + kubectl delete -f filebeat-kubernetes.yaml + kubectl delete -f metricbeat-kubernetes.yaml + kubectl delete -f packetbeat-kubernetes.yaml + kubectl delete secret dynamic-logging -n kube-system + ``` + +1. Podの一覧を問い合わせて、実行中のPodがなくなったことを確認します。 + + ```shell + kubectl get pods + ``` + + 結果は次のようになるはずです。 + + ``` + No resources found. + ``` + +## {{% heading "whatsnext" %}} + +* [リソースを監視するためのツール](/docs/tasks/debug-application-cluster/resource-usage-monitoring/)について学ぶ。 +* [ロギングのアーキテクチャ](/docs/concepts/cluster-administration/logging/)についてもっと読む。 +* [アプリケーションのイントロスペクションとデバッグ](/ja/docs/tasks/debug-application-cluster/)についてもっと読む。 +* [アプリケーションのトラブルシューティング](/docs/tasks/debug-application-cluster/resource-usage-monitoring/)についてもっと読む。 diff --git a/content/ja/docs/tutorials/stateless-application/guestbook.md b/content/ja/docs/tutorials/stateless-application/guestbook.md new file mode 100644 index 0000000000..e08abdb62c --- /dev/null +++ b/content/ja/docs/tutorials/stateless-application/guestbook.md @@ -0,0 +1,370 @@ +--- +title: "例: Redisを使用したPHPのゲストブックアプリケーションのデプロイ" +content_type: tutorial +weight: 20 +card: + name: tutorials + weight: 30 + title: "ステートレスの例: Redisを使用したPHPのゲストブック" +--- + + +このチュートリアルでは、Kubernetesと[Docker](https://www.docker.com/)を使用した、シンプルなマルチティアのウェブアプリケーションのビルドとデプロイの方法を紹介します。この例は、以下のコンポーネントから構成されています。 + +* ゲストブックのエントリーを保存するための、シングルインスタンスの[Redis](https://redis.io/)マスター +* 読み込みデータ配信用の、複数の[レプリケーションされたRedis](https://redis.io/topics/replication)インスタンス +* 複数のウェブフロントエンドのインスタンス + + + +## {{% heading "objectives" %}} + +* Redisのマスターを起動する。 +* Redisのスレーブを起動する。 +* ゲストブックのフロントエンドを起動する。 +* フロントエンドのServiceを公開して表示を確認する。 +* クリーンアップする。 + + +## {{% heading "prerequisites" %}} + + +{{< include "task-tutorial-prereqs.md" >}} + +{{< version-check >}} + + + + + +## Redisのマスターを起動する + +ゲストブックアプリケーションでは、データを保存するためにRedisを使用します。ゲストブックはRedisのマスターインスタンスにデータを書き込み、複数のRedisのスレーブインスタンスからデータを読み込みます。 + +### RedisのマスターのDeploymentを作成する + +以下のマニフェストファイルは、シングルレプリカのRedisのマスターPodを実行するDeploymentコントローラーを指定しています。 + +{{< codenew file="application/guestbook/redis-master-deployment.yaml" >}} + +1. マニフェストファイルをダウンロードしたディレクトリ内で、ターミナルウィンドウを起動します。 +1. `redis-master-deployment.yaml`ファイルから、RedisのマスターのDeploymentを適用します。 + + ```shell + kubectl apply -f https://k8s.io/examples/application/guestbook/redis-master-deployment.yaml + ``` + +1. Podのリストを問い合わせて、RedisのマスターのPodが実行中になっていることを確認します。 + + ```shell + kubectl get pods + ``` + + 結果は次のようになるはずです。 + + ```shell + NAME READY STATUS RESTARTS AGE + redis-master-1068406935-3lswp 1/1 Running 0 28s + ``` + +1. 次のコマンドを実行して、RedisのマスターのPodからログを表示します。 + + ```shell + kubectl logs -f POD-NAME + ``` + +{{< note >}} +POD-NAMEの部分を実際のPodの名前に書き換えてください。 +{{< /note >}} + +### RedisのマスターのServiceを作成する + +ゲストブックアプリケーションは、データを書き込むためにRedisのマスターと通信する必要があります。そのためには、[Service](/docs/concepts/services-networking/service/)を適用して、トラフィックをRedisのマスターのPodへプロキシーしなければなりません。Serviceは、Podにアクセスするためのポリシーを指定します。 + +{{< codenew file="application/guestbook/redis-master-service.yaml" >}} + +1. 次の`redis-master-service.yaml`から、RedisのマスターのServiceを適用します。 + + ```shell + kubectl apply -f https://k8s.io/examples/application/guestbook/redis-master-service.yaml + ``` + +1. Serviceのリストを問い合わせて、RedisのマスターのServiceが実行中になっていることを確認します。 + + ```shell + kubectl get service + ``` + + The response should be similar to this: + + ```shell + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + kubernetes ClusterIP 10.0.0.1 443/TCP 1m + redis-master ClusterIP 10.0.0.151 6379/TCP 8s + ``` + +{{< note >}} +このマニフェストファイルは、`redis-master`という名前のServiceを、前に定義したラベルにマッチする一連のラベル付きで作成します。これにより、ServiceはネットワークトラフィックをRedisのマスターのPodへとルーティングできるようになります。 +{{< /note >}} + + +## Redisのスレーブを起動する + +Redisのマスターは1つのPodですが、レプリカのRedisのスレーブを追加することで、トラフィックの需要を満たすための高い可用性を持たせることができます。 + +### RedisのスレーブのDeploymentを作成する + +Deploymentはマニフェストファイル内に書かれた設定に基づいてスケールします。ここでは、Deploymentオブジェクトは2つのレプリカを指定しています。 + +もし1つもレプリカが実行されていなければ、このDeploymentは2つのレプリカをコンテナクラスター上で起動します。逆に、もしすでに2つ以上のレプリカが実行されていれば、実行中のレプリカが2つになるようにスケールダウンします。 + +{{< codenew file="application/guestbook/redis-slave-deployment.yaml" >}} + +1. `redis-slave-deployment.yaml`ファイルから、RedisのスレーブのDeploymentを適用します。 + + ```shell + kubectl apply -f https://k8s.io/examples/application/guestbook/redis-slave-deployment.yaml + ``` + +1. Podのリストを問い合わせて、RedisのスレーブのPodが実行中になっていることを確認します。 + + ```shell + kubectl get pods + ``` + + 結果は次のようになるはずです。 + + ```shell + NAME READY STATUS RESTARTS AGE + redis-master-1068406935-3lswp 1/1 Running 0 1m + redis-slave-2005841000-fpvqc 0/1 ContainerCreating 0 6s + redis-slave-2005841000-phfv9 0/1 ContainerCreating 0 6s + ``` + +### RedisのスレーブのServiceを作成する + +ゲストブックアプリケーションは、データを読み込むためにRedisのスレーブと通信する必要があります。Redisのスレーブが発見できるようにするためには、Serviceをセットアップする必要があります。Serviceは一連のPodに対する透過的なロードバランシングを提供します。 + +{{< codenew file="application/guestbook/redis-slave-service.yaml" >}} + +1. 次の`redis-slave-service.yaml`ファイルから、RedisのスレーブのServiceを適用します。 + + ```shell + kubectl apply -f https://k8s.io/examples/application/guestbook/redis-slave-service.yaml + ``` + +1. Serviceのリストを問い合わせて、RedisのスレーブのServiceが実行中になっていることを確認します。 + + ```shell + kubectl get services + ``` + + 結果は次のようになるはずです。 + + ``` + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + kubernetes ClusterIP 10.0.0.1 443/TCP 2m + redis-master ClusterIP 10.0.0.151 6379/TCP 1m + redis-slave ClusterIP 10.0.0.223 6379/TCP 6s + ``` + +## ゲストブックのフロントエンドをセットアップして公開する + +ゲストブックアプリケーションには、HTTPリクエストをサーブするPHPで書かれたウェブフロントエンドがあります。このアプリケーションは、書き込みリクエストに対しては`redis-master` Serviceに、読み込みリクエストに対しては`redis-slave` Serviceに接続するように設定されています。 + +### ゲストブックのフロントエンドのDeploymentを作成する + +{{< codenew file="application/guestbook/frontend-deployment.yaml" >}} + +1. `frontend-deployment.yaml`ファイルから、フロントエンドのDeploymentを適用します。 + + ```shell + kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-deployment.yaml + ``` + +1. Podのリストを問い合わせて、3つのフロントエンドのレプリカが実行中になっていることを確認します。 + + ```shell + kubectl get pods -l app=guestbook -l tier=frontend + ``` + + 結果は次のようになるはずです。 + + ``` + NAME READY STATUS RESTARTS AGE + frontend-3823415956-dsvc5 1/1 Running 0 54s + frontend-3823415956-k22zn 1/1 Running 0 54s + frontend-3823415956-w9gbt 1/1 Running 0 54s + ``` + +### フロントエンドのServiceを作成する + +適用した`redis-slave`および`redis-master` Serviceは、コンテナクラスター内部からのみアクセス可能です。これは、デフォルトのServiceのtypeが[ClusterIP](/docs/concepts/services-networking/service/#publishing-services---service-types)であるためです。`ClusterIP`は、Serviceが指している一連のPodに対して1つのIPアドレスを提供します。このIPアドレスはクラスター内部からのみアクセスできます。 + +もしゲストの人にゲストブックにアクセスしてほしいのなら、フロントエンドServiceを外部から見えるように設定しなければなりません。そうすれば、クライアントはコンテナクラスターの外部からServiceにリクエストを送れるようになります。Minikubeでは、Serviceを`NodePort`でのみ公開できます。 + +{{< note >}} +一部のクラウドプロバイダーでは、Google Compute EngineやGoogle Kubernetes Engineなど、外部のロードバランサーをサポートしているものがあります。もしクラウドプロバイダーがロードバランサーをサポートしていて、それを使用したい場合は、`type: NodePort`という行を単に削除またはコメントアウトして、`type: LoadBalancer`のコメントアウトを外せば使用できます。 +{{< /note >}} + +{{< codenew file="application/guestbook/frontend-service.yaml" >}} + +1. `frontend-service.yaml`ファイルから、フロントエンドのServiceを提供します。 + + ```shell + kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-service.yaml + ``` + +1. Serviceのリストを問い合わせて、フロントエンドのServiceが実行中であることを確認します。 + + ```shell + kubectl get services + ``` + + 結果は次のようになるはずです。 + + ``` + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + frontend NodePort 10.0.0.112 80:31323/TCP 6s + kubernetes ClusterIP 10.0.0.1 443/TCP 4m + redis-master ClusterIP 10.0.0.151 6379/TCP 2m + redis-slave ClusterIP 10.0.0.223 6379/TCP 1m + ``` + +### フロントエンドのServiceを`NodePort`経由で表示する + +このアプリケーションをMinikubeやローカルのクラスターにデプロイした場合、ゲストブックを表示するためのIPアドレスを見つける必要があります。 + +1. 次のコマンドを実行すると、フロントエンドServiceに対するIPアドレスを取得できます。 + + ```shell + minikube service frontend --url + ``` + + 結果は次のようになるはずです。 + + ``` + http://192.168.99.100:31323 + ``` + +1. IPアドレスをコピーして、ブラウザー上でページを読み込み、ゲストブックを表示しましょう。 + +### フロントエンドのServiceを`LoadBalancer`経由で表示する + +もし`frontend-service.yaml`マニフェストを`type: LoadBalancer`でデプロイした場合、ゲストブックを表示するためのIPアドレスを見つける必要があります。 + +1. 次のコマンドを実行すると、フロントエンドServiceに対するIPアドレスを取得できます。 + + ```shell + kubectl get service frontend + ``` + + 結果は次のようになるはずです。 + + ``` + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + frontend ClusterIP 10.51.242.136 109.197.92.229 80:32372/TCP 1m + ``` + +1. 外部IPアドレス(EXTERNAL-IP)をコピーして、ブラウザー上でページを読み込み、ゲストブックを表示しましょう。 + +## ウェブフロントエンドをスケールする + +サーバーがDeploymentコントローラーを使用するServiceとして定義されているため、スケールアップやスケールダウンは簡単です。 + +1. 次のコマンドを実行すると、フロントエンドのPodの数をスケールアップできます。 + + ```shell + kubectl scale deployment frontend --replicas=5 + ``` + +1. Podのリストを問い合わせて、実行中のフロントエンドのPodの数を確認します。 + + ```shell + kubectl get pods + ``` + + 結果は次のようになるはずです。 + + ``` + NAME READY STATUS RESTARTS AGE + frontend-3823415956-70qj5 1/1 Running 0 5s + frontend-3823415956-dsvc5 1/1 Running 0 54m + frontend-3823415956-k22zn 1/1 Running 0 54m + frontend-3823415956-w9gbt 1/1 Running 0 54m + frontend-3823415956-x2pld 1/1 Running 0 5s + redis-master-1068406935-3lswp 1/1 Running 0 56m + redis-slave-2005841000-fpvqc 1/1 Running 0 55m + redis-slave-2005841000-phfv9 1/1 Running 0 55m + ``` + +1. 次のコマンドを実行すると、フロントエンドのPodの数をスケールダウンできます。 + + ```shell + kubectl scale deployment frontend --replicas=2 + ``` + +1. Podのリストを問い合わせて、実行中のフロントエンドのPodの数を確認します。 + + ```shell + kubectl get pods + ``` + + 結果は次のようになるはずです。 + + ``` + NAME READY STATUS RESTARTS AGE + frontend-3823415956-k22zn 1/1 Running 0 1h + frontend-3823415956-w9gbt 1/1 Running 0 1h + redis-master-1068406935-3lswp 1/1 Running 0 1h + redis-slave-2005841000-fpvqc 1/1 Running 0 1h + redis-slave-2005841000-phfv9 1/1 Running 0 1h + ``` + + + +## {{% heading "cleanup" %}} + +DeploymentとServiceを削除すると、実行中のPodも削除されます。ラベルを使用すると、複数のリソースを1つのコマンドで削除できます。 + +1. 次のコマンドを実行すると、すべてのPod、Deployment、Serviceが削除されます。 + + ```shell + kubectl delete deployment -l app=redis + kubectl delete service -l app=redis + kubectl delete deployment -l app=guestbook + kubectl delete service -l app=guestbook + ``` + + 結果は次のようになるはずです。 + + ``` + deployment.apps "redis-master" deleted + deployment.apps "redis-slave" deleted + service "redis-master" deleted + service "redis-slave" deleted + deployment.apps "frontend" deleted + service "frontend" deleted + ``` + +1. Podのリストを問い合わせて、実行中のPodが存在しないことを確認します。 + + ```shell + kubectl get pods + ``` + + 結果は次のようになるはずです。 + + ``` + No resources found. + ``` + + + +## {{% heading "whatsnext" %}} + +* ゲストブックアプリケーションに対する[ELKによるロギングとモニタリング](/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk/) +* [Kubernetesの基本](/ja/docs/tutorials/kubernetes-basics/)のインタラクティブチュートリアルを終わらせる +* Kubernetesを使って、[MySQLとWordpressのためにPersistent Volume](/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/#visit-your-new-wordpress-blog)を使用したブログを作成する +* [サービスとアプリケーションの接続](/ja/docs/concepts/services-networking/connect-applications-service/)についてもっと読む +* [リソースの管理](/docs/concepts/cluster-administration/manage-deployment/#using-labels-effectively)についてもっと読む diff --git a/content/ja/examples/pods/pod-nginx-specific-node.yaml b/content/ja/examples/pods/pod-nginx-specific-node.yaml new file mode 100644 index 0000000000..401814df92 --- /dev/null +++ b/content/ja/examples/pods/pod-nginx-specific-node.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: Pod +metadata: + name: nginx +spec: + nodeName: foo-node # 特定のノードにPodをスケジューリングする + containers: + - name: nginx + image: nginx + imagePullPolicy: IfNotPresent diff --git a/content/ja/examples/pods/pod-with-toleration.yaml b/content/ja/examples/pods/pod-with-toleration.yaml new file mode 100644 index 0000000000..79f2756a8c --- /dev/null +++ b/content/ja/examples/pods/pod-with-toleration.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: nginx + labels: + env: test +spec: + containers: + - name: nginx + image: nginx + imagePullPolicy: IfNotPresent + tolerations: + - key: "example-key" + operator: "Exists" + effect: "NoSchedule" diff --git a/content/ja/examples/service/networking/dual-stack-default-svc.yaml b/content/ja/examples/service/networking/dual-stack-default-svc.yaml new file mode 100644 index 0000000000..00ed87ba19 --- /dev/null +++ b/content/ja/examples/service/networking/dual-stack-default-svc.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: my-service +spec: + selector: + app: MyApp + ports: + - protocol: TCP + port: 80 + targetPort: 9376 \ No newline at end of file diff --git a/content/ja/examples/service/networking/dual-stack-ipv4-svc.yaml b/content/ja/examples/service/networking/dual-stack-ipv4-svc.yaml new file mode 100644 index 0000000000..a875f44d6d --- /dev/null +++ b/content/ja/examples/service/networking/dual-stack-ipv4-svc.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: my-service +spec: + ipFamily: IPv4 + selector: + app: MyApp + ports: + - protocol: TCP + port: 80 + targetPort: 9376 \ No newline at end of file diff --git a/content/ja/examples/service/networking/dual-stack-ipv6-lb-svc.yaml b/content/ja/examples/service/networking/dual-stack-ipv6-lb-svc.yaml new file mode 100644 index 0000000000..2586ec9b39 --- /dev/null +++ b/content/ja/examples/service/networking/dual-stack-ipv6-lb-svc.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: my-service + labels: + app: MyApp +spec: + ipFamily: IPv6 + type: LoadBalancer + selector: + app: MyApp + ports: + - protocol: TCP + port: 80 + targetPort: 9376 \ No newline at end of file diff --git a/content/ja/examples/service/networking/dual-stack-ipv6-svc.yaml b/content/ja/examples/service/networking/dual-stack-ipv6-svc.yaml new file mode 100644 index 0000000000..2aa0725059 --- /dev/null +++ b/content/ja/examples/service/networking/dual-stack-ipv6-svc.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: my-service +spec: + ipFamily: IPv6 + selector: + app: MyApp + ports: + - protocol: TCP + port: 80 + targetPort: 9376 \ No newline at end of file diff --git a/content/ja/training/_index.html b/content/ja/training/_index.html index 8c92ea7f22..6762f56dec 100644 --- a/content/ja/training/_index.html +++ b/content/ja/training/_index.html @@ -1,7 +1,7 @@ --- title: トレーニング bigheader: Kubernetesのトレーニングと資格 -abstract: トレーニングプログラム、資格、及びパートナーについて。 +abstract: トレーニングプログラム、資格、およびパートナーについて。 layout: basic cid: training class: training @@ -18,7 +18,7 @@ class: training

あなたのクラウドネイティブなキャリアを創る

-

Kubernetesはクラウドネイティブムーブメントの中核を担っています。Linux Foundation及びトレーニングパートナーのトレーニングを受け、認定資格を取得することで、キャリアに投資し、Kubernetesを学び、クラウドネイティブプロジェクトを成功に繋げます。

+

Kubernetesはクラウドネイティブムーブメントの中核を担っています。Linux Foundationおよびトレーニングパートナーのトレーニングを受け、認定資格を取得することで、キャリアに投資し、Kubernetesを学び、クラウドネイティブプロジェクトを成功に繋げます。

diff --git a/content/ko/case-studies/adform/index.html b/content/ko/case-studies/adform/index.html index e9a8acc7a2..be35a2d837 100644 --- a/content/ko/case-studies/adform/index.html +++ b/content/ko/case-studies/adform/index.html @@ -12,7 +12,7 @@ quote: > Kubernetes enabled the self-healing and immutable infrastructure. We can do faster releases, so our developers are really happy. They can ship our features faster than before, and that makes our clients happier. --- -
+

CASE STUDY:
Improving Performance and Morale with Cloud Native

@@ -66,7 +66,7 @@ The company has a large infrastructure: Ope
-
+
"The fact that Cloud Native Computing Foundation incubated Kubernetes was a really big point for us because it was vendor neutral. And we can see that a community really gathers around it. Everyone shares their experiences, their knowledge, and the fact that it’s open source, you can contribute."

— Edgaras Apšega, IT Systems Engineer, Adform
@@ -83,7 +83,7 @@ The first production cluster was launched in the spring of 2018, and is now up t
-
+
"Releases are really nice for them, because they just push their code to Git and that’s it. They don’t have to worry about their virtual machines anymore."

— Andrius Cibulskis, IT Systems Engineer, Adform
diff --git a/content/ko/case-studies/capital-one/index.html b/content/ko/case-studies/capital-one/index.html index 773db4869e..f95fb2acc7 100644 --- a/content/ko/case-studies/capital-one/index.html +++ b/content/ko/case-studies/capital-one/index.html @@ -5,7 +5,7 @@ cid: caseStudies css: /css/style_case_studies.css --- -
+

CASE STUDY:
Supporting Fast Decisioning Applications with Kubernetes

@@ -55,7 +55,7 @@ css: /css/style_case_studies.css
-
+
"We want to provide the tools in the same ecosystem, in a consistent way, rather than have a large custom snowflake ecosystem where every tool needs its own custom deployment. Kubernetes gives us the ability to bring all of these together, so the richness of the open source and even the license community dealing with big data can be corralled." @@ -69,7 +69,7 @@ css: /css/style_case_studies.css
-
+
With Kubernetes, "a team can come to us and we can have them up and running with a basic decisioning app in a fortnight, which before would have taken a whole quarter, if not longer. Kubernetes is a manifold productivity multiplier."
diff --git a/content/ko/case-studies/ibm/index.html b/content/ko/case-studies/ibm/index.html index 54e941c9cb..e9a78a9443 100644 --- a/content/ko/case-studies/ibm/index.html +++ b/content/ko/case-studies/ibm/index.html @@ -9,7 +9,7 @@ logo: ibm_featured_logo.svg featured: false --- -
+

CASE STUDY:
Building an Image Trust Service on Kubernetes with Notary and TUF

@@ -58,7 +58,7 @@ The availability of image signing "is a huge benefit to security-conscious custo
-
+
"Image signing is one key part of our Kubernetes container service offering, and our container registry team saw Notary as the de facto way to implement that capability in the current Docker and container ecosystem"

- Michael Hough, a software developer with the IBM Cloud Container Registry team
@@ -75,7 +75,7 @@ The availability of image signing "is a huge benefit to security-conscious custo
-
+
"With our IBM Cloud Kubernetes as-a-service offering and the admission controller we have made available, it allows both IBM services as well as customers of the IBM public cloud to use security policies to control service deployment."

- Michael Hough, a software developer with the IBM Cloud Container Registry team
diff --git a/content/ko/case-studies/ing/index.html b/content/ko/case-studies/ing/index.html index 6e2648a455..943daec2de 100644 --- a/content/ko/case-studies/ing/index.html +++ b/content/ko/case-studies/ing/index.html @@ -11,7 +11,7 @@ quote: > --- -
+

CASE STUDY:
Driving Banking Innovation with Cloud Native

@@ -58,7 +58,7 @@ quote: >
-
+
"We decided to standardize ING on a Kubernetes framework." Everything is run on premise due to banking regulations, he adds, but "we will be building an internal public cloud. We are trying to get on par with what public clouds are doing. That’s one of the reasons we got Kubernetes."

— Thijs Ebbers, Infrastructure Architect, ING
@@ -72,7 +72,7 @@ quote: >
-
+
"We have to run the complete platform of services we need, many routing from different places. We need this Kubernetes framework for deploying the containers, with all those components, monitoring, logging. It’s complex."

— Onno Van der Voort, Infrastructure Architect, ING
diff --git a/content/ko/case-studies/naic/index.html b/content/ko/case-studies/naic/index.html index d40dd19c77..3deb91e480 100644 --- a/content/ko/case-studies/naic/index.html +++ b/content/ko/case-studies/naic/index.html @@ -9,7 +9,7 @@ logo: naic_featured_logo.png featured: false --- -
+

CASE STUDY:
A Culture and Technology Transition Enabled by Kubernetes

@@ -59,7 +59,7 @@ In addition, NAIC is onboarding teams to the new platform, and those teams have
-
+
"In our experience, vendor lock-in and tooling that is highly specific results in less resilient technology with fewer minds working to solve problems and grow the community."

- Dan Barker, Chief Enterprise Architect, NAIC
@@ -77,7 +77,7 @@ As for other CNCF projects, NAIC is using Prometheus on a small scale and hopes
-
+
"We knew that Kubernetes had become the de facto standard for container orchestration. Two major factors for selecting this were the three major cloud vendors hosting their own versions and having it hosted in a neutral party as fully open source."

- Dan Barker, Chief Enterprise Architect, NAIC
diff --git a/content/ko/case-studies/nordstrom/index.html b/content/ko/case-studies/nordstrom/index.html index 5385c2473d..788453de35 100644 --- a/content/ko/case-studies/nordstrom/index.html +++ b/content/ko/case-studies/nordstrom/index.html @@ -5,7 +5,7 @@ cid: caseStudies css: /css/style_case_studies.css --- -
+

CASE STUDY:
Finding Millions in Potential Savings in a Tough Retail Climate @@ -60,7 +60,7 @@ css: /css/style_case_studies.css
-
+
"We made a bet that Kubernetes was going to take off, informed by early indicators of community support and project velocity, so we rebuilt our system with Kubernetes at the core,"
@@ -77,7 +77,7 @@ The benefits were immediate for the teams that came on board. "Teams running on
-
+
"Teams running on our Kubernetes cluster loved the fact that they had fewer issues to worry about. They didn’t need to manage infrastructure or operating systems," says Grigoriu. "Early adopters loved the declarative nature of Kubernetes. They loved the reduced surface area they had to deal with."
diff --git a/content/ko/case-studies/northwestern-mutual/index.html b/content/ko/case-studies/northwestern-mutual/index.html index dac0ef0d66..47b4bbc7be 100644 --- a/content/ko/case-studies/northwestern-mutual/index.html +++ b/content/ko/case-studies/northwestern-mutual/index.html @@ -5,7 +5,7 @@ cid: caseStudies css: /css/style_case_studies.css --- -
+

CASE STUDY:
Cloud Native at Northwestern Mutual @@ -22,7 +22,7 @@ css: /css/style_case_studies.css

Challenge

- In the spring of 2015, Northwestern Mutual acquired a fintech startup, LearnVest, and decided to take "Northwestern Mutual’s leading products and services and meld it with LearnVest’s digital experience and innovative financial planning platform," says Brad Williams, Director of Engineering for Client Experience, Northwestern Mutual. The company’s existing infrastructure had been optimized for batch workflows hosted on on-prem networks; deployments were very traditional, focused on following a process instead of providing deployment agility. "We had to build a platform that was elastically scalable, but also much more responsive, so we could quickly get data to the client website so our end-customers have the experience they expect," says Williams. + In the spring of 2015, Northwestern Mutual acquired a fintech startup, LearnVest, and decided to take "Northwestern Mutual’s leading products and services and meld it with LearnVest’s digital experience and innovative financial planning platform," says Brad Williams, Director of Engineering for Client Experience, Northwestern Mutual. The company’s existing infrastructure had been optimized for batch workflows hosted on on-prem networks; deployments were very traditional, focused on following a process instead of providing deployment agility. "We had to build a platform that was elastically scalable, but also much more responsive, so we could quickly get data to the client website so our end-customers have the experience they expect," says Williams.

Solution

The platform team came up with a plan for using the public cloud (AWS), Docker containers, and Kubernetes for orchestration. "Kubernetes gave us that base framework so teams can be very autonomous in what they’re building and deliver very quickly and frequently," says Northwestern Mutual Cloud Native Engineer Frank Greco Jr. The team also built and open-sourced Kanali, a Kubernetes-native API management tool that uses OpenTracing, Jaeger, and gRPC. @@ -53,7 +53,7 @@ In order to give the company’s 4.5 million clients the digital experience they
-
+
"Kubernetes has definitely been the right choice for us. It gave us that base framework so teams can be autonomous in what they’re building and deliver very quickly and frequently." @@ -63,12 +63,12 @@ In order to give the company’s 4.5 million clients the digital experience they
Williams and the rest of the platform team decided that the first step would be to start moving from private data centers to AWS. With a new microservice architecture in mind—and the freedom to implement what was best for the organization—they began using Docker containers. After looking into the various container orchestration options, they went with Kubernetes, even though it was still in beta at the time. "There was some debate whether we should build something ourselves, or just leverage that product and evolve with it," says Northwestern Mutual Cloud Native Engineer Frank Greco Jr. "Kubernetes has definitely been the right choice for us. It gave us that base framework so teams can be autonomous in what they’re building and deliver very quickly and frequently."

As early adopters, the team had to do a lot of work with Ansible scripts to stand up the cluster. "We had a lot of hard security requirements given the nature of our business," explains Bryan Pfremmer, App Platform Teams Manager, Northwestern Mutual. "We found ourselves running a configuration that very few other people ever tried." The client experience group was the first to use the new platform; today, a few hundred of the company’s 1,500 engineers are using it and more are eager to get on board. -The results have been dramatic. Before, infrastructure deployments could take two weeks; now, it is done in a matter of minutes. Now with a focus on Infrastructure automation, and self-service, "You can take an app to production in that same day if you want to," says Pfremmer. +The results have been dramatic. Before, infrastructure deployments could take two weeks; now, it is done in a matter of minutes. Now with a focus on Infrastructure automation, and self-service, "You can take an app to production in that same day if you want to," says Pfremmer.
-
+
"Now, developers have autonomy, they can use this whenever they want, however they want. It becomes more valuable the more instrumentation downstream that happens, as we mature in it."
diff --git a/content/ko/case-studies/ocado/index.html b/content/ko/case-studies/ocado/index.html index 6a930f945c..79ac9bf3a8 100644 --- a/content/ko/case-studies/ocado/index.html +++ b/content/ko/case-studies/ocado/index.html @@ -11,7 +11,7 @@ weight: 4 quote: > People at Ocado Technology have been quite amazed. They ask, ‘Can we do this on a Dev cluster?’ and 10 minutes later we have rolled out something that is deployed across the cluster. The speed from idea to implementation to deployment is amazing. --- -
+

CASE STUDY:
Ocado: Running Grocery Warehouses with a Cloud Native Platform

@@ -32,7 +32,7 @@ quote: >
- +

Impact

With Kubernetes, "the speed from idea to implementation to deployment is amazing," says Bryant. "I’ve seen features go from development to production inside of a week now. In the old world, a new application deployment could easily take over a month." And because there are no longer restrictive deployment windows in the warehouses, the rate of deployments has gone from as few as two per week to dozens per week. Ocado has also achieved cost savings because Kubernetes gives the team the ability to have more fine-grained resource allocation. Says DevOps Team Leader Kevin McCormack: "We have more confidence in the resource allocation/separation features of Kubernetes, so we have been able to migrate from around 10 fleet clusters to one Kubernetes cluster." The team also uses Prometheus and Grafana to visualize resource allocation, and makes the data available to developers. "The increased visibility offered by Prometheus means developers are more aware of what they are using and how their use impacts others, especially since we now have one shared cluster," says McCormack. "I’d estimate that we use about 15-25% less hardware resources to host the same applications in Kubernetes in our test environments." @@ -54,7 +54,7 @@ Bryant had already been using Kubernetes with +
"We were looking for a platform with wide adoption, and that was where the momentum was, the two paths converged, and we didn’t even go through any proof-of-concept stage. The Code for Life work served that purpose,"

- Kevin McCormack, DevOps Team Leader, Ocado
@@ -68,7 +68,7 @@ Bryant had already been using Kubernetes with
+
"The unified API of Kubernetes means this is all in one place, and it’s one flow for approval and rollout. I’ve seen features go from development to production inside of a week now. In the old world, a new application deployment could easily take over a month."

- Mike Bryant, Platform Engineer, Ocado
diff --git a/content/ko/case-studies/openAI/index.html b/content/ko/case-studies/openAI/index.html index 040f704efa..1b95ec5f35 100644 --- a/content/ko/case-studies/openAI/index.html +++ b/content/ko/case-studies/openAI/index.html @@ -5,7 +5,7 @@ cid: caseStudies css: /css/style_case_studies.css --- -
+

CASE STUDY:
Launching and Scaling Up Experiments, Made Simple

@@ -56,7 +56,7 @@ css: /css/style_case_studies.css
-
+
OpenAI’s experiments take advantage of Kubernetes’ benefits, including portability. "Because Kubernetes provides a consistent API, we can move our research experiments very easily between clusters..." @@ -69,7 +69,7 @@ css: /css/style_case_studies.css
-
+
"One of our researchers who is working on a new distributed training system has been able to get his experiment running in two or three days," says Berner. "In a week or two he scaled it out to hundreds of GPUs. Previously, that would have easily been a couple of months of work."
diff --git a/content/ko/case-studies/pearson/index.html b/content/ko/case-studies/pearson/index.html index ddb567afb3..78f70228e5 100644 --- a/content/ko/case-studies/pearson/index.html +++ b/content/ko/case-studies/pearson/index.html @@ -8,7 +8,7 @@ featured: false quote: > We’re already seeing tremendous benefits with Kubernetes—improved engineering productivity, faster delivery of applications and a simplified infrastructure. But this is just the beginning. Kubernetes will help transform the way that educational content is delivered online. --- -
+

CASE STUDY:
Reinventing the World’s Largest Education Company With Kubernetes

@@ -47,7 +47,7 @@ quote: > The team adopted Kubernetes when it was still version 1.2 and are still going strong now on 1.7; they use Terraform and Ansible to deploy it on to basic AWS primitives. "We were trying to understand how we can create value for Pearson from this technology," says Ben Somogyi, Principal Architect for the Cloud Platforms. "It turned out that Kubernetes’ benefits are huge. We’re trying to help our applications development teams that use our platform go faster, so we filled that gap with a CI/CD pipeline that builds their images for them, standardizes them, patches everything up, allows them to deploy their different environments onto the cluster, and obfuscating the details of how difficult the work underneath the covers is."
-
+
"Your internal customers need to feel like they are choosing the very best option for them. We are experiencing this first hand in the growth of adoption. We are seeing triple-digit, year-on-year growth of the service."

— Chris Jackson, Director for Cloud Platforms & SRE at Pearson
@@ -60,7 +60,7 @@ quote: > Jackson estimates they’ve achieved a 15-20% boost in productivity for developer teams who adopt the platform. They also see a reduction in the number of customer-impacting incidents. Plus, says Jackson, "Teams who were previously limited to 1-2 releases per academic year can now ship code multiple times per day!"
-
+
"Teams who were previously limited to 1-2 releases per academic year can now ship code multiple times per day!"

— Chris Jackson, Director for Cloud Platforms & SRE at Pearson
diff --git a/content/ko/case-studies/pinterest/index.html b/content/ko/case-studies/pinterest/index.html index 0aa2381aa1..e4be7031bb 100644 --- a/content/ko/case-studies/pinterest/index.html +++ b/content/ko/case-studies/pinterest/index.html @@ -11,7 +11,7 @@ quote: > --- -
+

CASE STUDY:
Pinning Its Past, Present, and Future on Cloud Native

@@ -60,7 +60,7 @@ The first phase involved moving to Docker. "Pinterest has been heavily running o
-
+
"Though Kubernetes lacked certain things we wanted, we realized that by the time we get to productionizing many of those things, we’ll be able to leverage what the community is doing."

— MICHEAL BENEDICT, PRODUCT MANAGER FOR THE CLOUD AND THE DATA INFRASTRUCTURE GROUP AT PINTEREST
@@ -75,7 +75,7 @@ At the beginning of 2018, the team began onboarding its first use case into the
-
+
"So far it’s been good, especially the elasticity around how we can configure our Jenkins workloads on Kubernetes shared cluster. That is the win we were pushing for."

— MICHEAL BENEDICT, PRODUCT MANAGER FOR THE CLOUD AND THE DATA INFRASTRUCTURE GROUP AT PINTEREST
diff --git a/content/ko/case-studies/slingtv/index.html b/content/ko/case-studies/slingtv/index.html index a11527c2d9..349ed8c2de 100644 --- a/content/ko/case-studies/slingtv/index.html +++ b/content/ko/case-studies/slingtv/index.html @@ -11,7 +11,7 @@ quote: > --- -
+

CASE STUDY:
Sling TV: Marrying Kubernetes and AI to Enable Proper Web Scale

@@ -62,7 +62,7 @@ Led by the belief that “the cloud native architectures and patterns really giv
-
+
“We needed the flexibility to enable our use case versus just a simple orchestrater. Enabling our future in a way that did not give us vendor lock-in was also a key part of our strategy. I think that is part of the Rancher value proposition.”

— Brad Linder, Cloud Native & Big Data Evangelist for Sling TV
@@ -75,7 +75,7 @@ With the emphasis on common tooling, “We are getting to the place where we can
-
+
“We have to be able to react to changes and hiccups in the matrix. It is the foundation for our ability to deliver a high-quality service for our customers."

— Brad Linder, Cloud Native & Big Data Evangelist for Sling TV
diff --git a/content/ko/case-studies/squarespace/index.html b/content/ko/case-studies/squarespace/index.html index d2b2a18c92..27340835f4 100644 --- a/content/ko/case-studies/squarespace/index.html +++ b/content/ko/case-studies/squarespace/index.html @@ -5,7 +5,7 @@ cid: caseStudies css: /css/style_case_studies.css --- -
+

CASE STUDY:
Squarespace: Gaining Productivity and Resilience with Kubernetes

@@ -51,7 +51,7 @@ Since Squarespace moved to Kubernetes, in conjunction with modernizing its netwo
-
+
After experimenting with another container orchestration platform and "breaking it in very painful ways," Lynch says, the team began experimenting with Kubernetes in mid-2016 and found that it "answered all the questions that we had." @@ -68,7 +68,7 @@ Since Squarespace moved to Kubernetes, in conjunction with modernizing its netwo
-
+
"We switched to Kubernetes, a new world....It allowed us to streamline our process, so we can now easily create an entire microservice project from templates," Lynch says. And the whole process takes only five minutes, an almost 85% reduction in time compared to their VM deployment.
diff --git a/content/ko/case-studies/workiva/index.html b/content/ko/case-studies/workiva/index.html index 95f323d5ae..1c09503bfb 100644 --- a/content/ko/case-studies/workiva/index.html +++ b/content/ko/case-studies/workiva/index.html @@ -11,7 +11,7 @@ quote: > With OpenTracing, my team was able to look at a trace and make optimization suggestions to another team without ever looking at their code. --- -
+

CASE STUDY:
Using OpenTracing to Help Pinpoint the Bottlenecks

@@ -30,12 +30,12 @@ quote: > Workiva offers a cloud-based platform for managing and reporting business data. This SaaS product, Wdesk, is used by more than 70 percent of the Fortune 500 companies. As the company made the shift from a monolith to a more distributed, microservice-based system, "We had a number of people working on this, all on different teams, so we needed to identify what the issues were and where the bottlenecks were," says Senior Software Architect MacLeod Broad. With back-end code running on Google App Engine, Google Compute Engine, as well as Amazon Web Services, Workiva needed a tracing system that was agnostic of platform. While preparing one of the company’s first products utilizing AWS, which involved a "sync and link" feature that linked data from spreadsheets built in the new application with documents created in the old application on Workiva’s existing system, Broad’s team found an ideal use case for tracing: There were circular dependencies, and optimizations often turned out to be micro-optimizations that didn’t impact overall speed.
- +

Solution

- Broad’s team introduced the platform-agnostic distributed tracing system OpenTracing to help them pinpoint the bottlenecks. + Broad’s team introduced the platform-agnostic distributed tracing system OpenTracing to help them pinpoint the bottlenecks.

Impact

Now used throughout the company, OpenTracing produced immediate results. Software Engineer Michael Davis reports: "Tracing has given us immediate, actionable insight into how to improve our service. Through a combination of seeing where each call spends its time, as well as which calls are most often used, we were able to reduce our average response time by 95 percent (from 600ms to 30ms) in a single fix." @@ -61,14 +61,14 @@ The challenges faced by Broad’s team may sound familiar to other companies tha
-
+
"A tracing system can at a glance explain an architecture, narrow down a performance bottleneck and zero in on it, and generally just help direct an investigation at a high level. Being able to do that at a glance is much faster than at a meeting or with three days of debugging, and it’s a lot faster than never figuring out the problem and just moving on."
— MACLEOD BROAD, SENIOR SOFTWARE ARCHITECT AT WORKIVA
- + Simply put, it was an ideal use case for tracing. "A tracing system can at a glance explain an architecture, narrow down a performance bottleneck and zero in on it, and generally just help direct an investigation at a high level," says Broad. "Being able to do that at a glance is much faster than at a meeting or with three days of debugging, and it’s a lot faster than never figuring out the problem and just moving on."

With Workiva’s back-end code running on Google Compute Engine as well as App Engine and AWS, Broad knew that he needed a tracing system that was platform agnostic. "We were looking at different tracing solutions," he says, "and we decided that because it seemed to be a very evolving market, we didn’t want to get stuck with one vendor. So OpenTracing seemed like the cleanest way to avoid vendor lock-in on what backend we actually had to use."

Once they introduced OpenTracing into this first use case, Broad says, "The trace made it super obvious where the bottlenecks were." Even though everyone had assumed it was Workiva’s existing code that was slowing things down, that wasn’t exactly the case. "It looked like the existing code was slow only because it was reaching out to our next-generation services, and they were taking a very long time to service all those requests," says Broad. "On the waterfall graph you can see the exact same work being done on every request when it was calling back in. So every service request would look the exact same for every response being paged out. And then it was just a no-brainer of, ‘Why is it doing all this work again?’"

@@ -78,7 +78,7 @@ Using the insight OpenTracing gave them, "My team was able to look at a trace an
-
+
"We were looking at different tracing solutions and we decided that because it seemed to be a very evolving market, we didn’t want to get stuck with one vendor. So OpenTracing seemed like the cleanest way to avoid vendor lock-in on what backend we actually had to use."
— MACLEOD BROAD, SENIOR SOFTWARE ARCHITECT AT WORKIVA
@@ -90,7 +90,7 @@ Using the insight OpenTracing gave them, "My team was able to look at a trace an Some teams were won over quickly. "Tracing has given us immediate, actionable insight into how to improve our [Workspaces] service," says Software Engineer Michael Davis. "Through a combination of seeing where each call spends its time, as well as which calls are most often used, we were able to reduce our average response time by 95 percent (from 600ms to 30ms) in a single fix."

Most of Workiva’s major products are now traced using OpenTracing, with data pushed into Google StackDriver. Even the products that aren’t fully traced have some components and libraries that are.

Broad points out that because some of the engineers were working on App Engine and already had experience with the platform’s Appstats library for profiling performance, it didn’t take much to get them used to using OpenTracing. But others were a little more reluctant. "The biggest hindrance to adoption I think has been the concern about how much latency is introducing tracing [and StackDriver] going to cost," he says. "People are also very concerned about adding middleware to whatever they’re working on. Questions about passing the context around and how that’s done were common. A lot of our Go developers were fine with it, because they were already doing that in one form or another. Our Java developers were not super keen on doing that because they’d used other systems that didn’t require that."

-But the benefits clearly outweighed the concerns, and today, Workiva’s official policy is to use tracing." +But the benefits clearly outweighed the concerns, and today, Workiva’s official policy is to use tracing." In fact, Broad believes that tracing naturally fits in with Workiva’s existing logging and metrics systems. "This was the way we presented it internally, and also the way we designed our use," he says. "Our traces are logged in the exact same mechanism as our app metric and logging data, and they get pushed the exact same way. So we treat all that data exactly the same when it’s being created and when it’s being recorded. We have one internal library that we use for logging, telemetry, analytics and tracing." @@ -98,7 +98,7 @@ In fact, Broad believes that tracing naturally fits in with Workiva’s existing
- "Tracing has given us immediate, actionable insight into how to improve our [Workspaces] service. Through a combination of seeing where each call spends its time, as well as which calls are most often used, we were able to reduce our average response time by 95 percent (from 600ms to 30ms) in a single fix."
— Michael Davis, Software Engineer, Workiva
+ "Tracing has given us immediate, actionable insight into how to improve our [Workspaces] service. Through a combination of seeing where each call spends its time, as well as which calls are most often used, we were able to reduce our average response time by 95 percent (from 600ms to 30ms) in a single fix."
— Michael Davis, Software Engineer, Workiva
diff --git a/content/ko/case-studies/ygrene/index.html b/content/ko/case-studies/ygrene/index.html index 498dc0ec73..c07443249a 100644 --- a/content/ko/case-studies/ygrene/index.html +++ b/content/ko/case-studies/ygrene/index.html @@ -12,7 +12,7 @@ quote: > We had to change some practices and code, and the way things were built, but we were able to get our main systems onto Kubernetes in a month or so, and then into production within two months. That’s very fast for a finance company. --- -
+

CASE STUDY:
Ygrene: Using Cloud Native to Bring Security and Scalability to the Finance Industry

@@ -61,7 +61,7 @@ By 2017, deployments and scalability had become pain points. The company was uti
-
+
"CNCF has been an amazing incubator for so many projects. Now we look at its webpage regularly to find out if there are any new, awesome, high-quality projects we can implement into our stack. It’s actually become a hub for us for knowing what software we need to be looking at to make our systems more secure or more scalable."

— Austin Adams, Development Manager, Ygrene Energy Fund
@@ -78,7 +78,7 @@ Notary, in particular, "has been a godsend," says Adams. "We need to know that o
-
+
"We had to change some practices and code, and the way things were built," Adams says, "but we were able to get our main systems onto Kubernetes in a month or so, and then into production within two months. That’s very fast for a finance company."
diff --git a/content/ko/docs/concepts/architecture/nodes.md b/content/ko/docs/concepts/architecture/nodes.md index 54782a20e3..7fb92302f9 100644 --- a/content/ko/docs/concepts/architecture/nodes.md +++ b/content/ko/docs/concepts/architecture/nodes.md @@ -324,7 +324,7 @@ kubelet은 `NodeStatus` 와 리스 오브젝트를 생성하고 업데이트 할 {{< feature-state state="alpha" for_k8s_version="v1.16" >}} `TopologyManager` -[기능 게이트(feature gate)](/docs/reference/command-line-tools-reference/feature-gates/)를 +[기능 게이트(feature gate)](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 활성화 시켜두면, kubelet이 리소스 할당 결정을 할 때 토폴로지 힌트를 사용할 수 있다. 자세한 내용은 [노드의 컨트롤 토폴로지 관리 정책](/docs/tasks/administer-cluster/topology-manager/)을 본다. diff --git a/content/ko/docs/concepts/cluster-administration/logging.md b/content/ko/docs/concepts/cluster-administration/logging.md index 5c7ce6cd8d..4f516ed41e 100644 --- a/content/ko/docs/concepts/cluster-administration/logging.md +++ b/content/ko/docs/concepts/cluster-administration/logging.md @@ -78,7 +78,8 @@ kubectl logs counter 전자의 접근 방식은 다른 환경에서 사용된다. 두 경우 모두, 기본적으로 로그 파일이 10MB를 초과하면 로테이션이 되도록 구성된다. -예를 들어, `kube-up.sh` 가 해당 [스크립트][cosConfigureHelper]에서 +예를 들어, `kube-up.sh` 가 해당 +[스크립트](https://github.com/kubernetes/kubernetes/blob/{{< param "githubbranch" >}}/cluster/gce/gci/configure-helper.sh)에서 GCP의 COS 이미지 로깅을 설정하는 방법에 대한 자세한 정보를 찾을 수 있다. 기본 로깅 예제에서와 같이 [`kubectl logs`](/docs/reference/generated/kubectl/kubectl-commands#logs)를 @@ -93,8 +94,6 @@ GCP의 COS 이미지 로깅을 설정하는 방법에 대한 자세한 정보를 그 후 `kubectl logs` 는 빈 응답을 반환한다. {{< /note >}} -[cosConfigureHelper]: https://github.com/kubernetes/kubernetes/blob/{{< param "githubbranch" >}}/cluster/gce/gci/configure-helper.sh - ### 시스템 컴포넌트 로그 시스템 컴포넌트에는 컨테이너에서 실행되는 것과 컨테이너에서 실행되지 않는 두 가지 유형이 있다. @@ -106,7 +105,7 @@ GCP의 COS 이미지 로깅을 설정하는 방법에 대한 자세한 정보를 systemd를 사용하는 시스템에서, kubelet과 컨테이너 런타임은 journald에 작성한다. systemd를 사용하지 않으면, `/var/log` 디렉터리의 `.log` 파일에 작성한다. 컨테이너 내부의 시스템 컴포넌트는 기본 로깅 메커니즘을 무시하고, -항상 `/var/log` 디렉터리에 기록한다. 그것은 [klog][klog] +항상 `/var/log` 디렉터리에 기록한다. 그것은 [klog](https://github.com/kubernetes/klog) 로깅 라이브러리를 사용한다. [로깅에 대한 개발 문서](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/logging.md)에서 해당 컴포넌트의 로깅 심각도(severity)에 대한 규칙을 찾을 수 있다. @@ -115,8 +114,6 @@ systemd를 사용하지 않으면, `/var/log` 디렉터리의 `.log` 파일에 로그는 매일 또는 크기가 100MB를 초과하면 `logrotate` 도구에 의해 로테이트가 되도록 구성된다. -[klog]: https://github.com/kubernetes/klog - ## 클러스터 레벨 로깅 아키텍처 쿠버네티스는 클러스터-레벨 로깅을 위한 네이티브 솔루션을 제공하지 않지만, 고려해야 할 몇 가지 일반적인 접근 방법을 고려할 수 있다. 여기 몇 가지 옵션이 있다. diff --git a/content/ko/docs/concepts/cluster-administration/monitoring.md b/content/ko/docs/concepts/cluster-administration/monitoring.md new file mode 100644 index 0000000000..440da51dd8 --- /dev/null +++ b/content/ko/docs/concepts/cluster-administration/monitoring.md @@ -0,0 +1,129 @@ +--- +title: 쿠버네티스 컨트롤 플레인에 대한 메트릭 +content_type: concept +weight: 60 +aliases: +- controller-metrics.md +--- + + + +시스템 컴포넌트 메트릭으로 내부에서 발생하는 상황을 더 잘 파악할 수 있다. 메트릭은 대시보드와 경고를 만드는 데 특히 유용하다. + +쿠버네티스 컨트롤 플레인의 메트릭은 [프로메테우스 형식](https://prometheus.io/docs/instrumenting/exposition_formats/)으로 출력되며 사람이 읽기 쉽다. + + + + + +## 쿠버네티스의 메트릭 + +대부분의 경우 메트릭은 HTTP 서버의 `/metrics` 엔드포인트에서 사용할 수 있다. 기본적으로 엔드포인트를 노출하지 않는 컴포넌트의 경우 `--bind-address` 플래그를 사용하여 활성화할 수 있다. + +해당 컴포넌트의 예는 다음과 같다. + +* {{< glossary_tooltip term_id="kube-controller-manager" text="kube-controller-manager" >}} +* {{< glossary_tooltip term_id="kube-proxy" text="kube-proxy" >}} +* {{< glossary_tooltip term_id="kube-apiserver" text="kube-apiserver" >}} +* {{< glossary_tooltip term_id="kube-scheduler" text="kube-scheduler" >}} +* {{< glossary_tooltip term_id="kubelet" text="kubelet" >}} + +프로덕션 환경에서는 이러한 메트릭을 주기적으로 수집하고 시계열 데이터베이스에서 사용할 수 있도록 +[프로메테우스 서버](https://prometheus.io/) 또는 다른 메트릭 수집기(scraper)를 구성할 수 있다. + +참고로 {{< glossary_tooltip term_id="kubelet" text="kubelet" >}}도 `/metrics/cadvisor`, `/metrics/resource` 그리고 `/metrics/probes` 엔드포인트에서 메트릭을 노출한다. 이러한 메트릭은 동일한 라이프사이클을 가지지 않는다. + +클러스터가 {{< glossary_tooltip term_id="rbac" text="RBAC" >}}을 사용하는 경우, 메트릭을 읽으려면 `/metrics` 에 접근을 허용하는 클러스터롤(ClusterRole)을 가지는 사용자, 그룹 또는 서비스어카운트(ServiceAccount)를 통한 권한이 필요하다. +예를 들면, 다음과 같다. +``` +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: prometheus +rules: + - nonResourceURLs: + - "/metrics" + verbs: + - get +``` + +## 메트릭 라이프사이클 + +알파 메트릭 → 안정적인 메트릭 → 사용 중단된 메트릭 → 히든(hidden) 메트릭 → 삭제 + +알파 메트릭은 안정성을 보장하지 않는다. 따라서 언제든지 수정되거나 삭제될 수 있다. + +안정적인 메트릭은 변경되지 않는다는 보장을 할 수 있다. 특히 안정성은 다음을 의미한다. + +* 메트릭 자체는 삭제되거나 이름이 변경되지 않는다 +* 메트릭 유형은 수정되지 않는다 + +사용 중단된 메트릭은 메트릭이 결국 삭제된다는 것을 나타낸다. 어떤 버전을 찾으려면, 해당 메트릭이 어떤 쿠버네티스 버전에서부터 사용 중단될 것인지를 고려하는 내용을 포함하는 어노테이션을 확인해야 한다. + +사용 중단되기 전에는 아래와 같다. + +``` +# HELP some_counter this counts things +# TYPE some_counter counter +some_counter 0 +``` + +사용 중단된 이후에는 아래와 같다. + +``` +# HELP some_counter (Deprecated since 1.15.0) this counts things +# TYPE some_counter counter +some_counter 0 +``` + +메트릭이 일단 숨겨지면 기본적으로 메트릭은 수집용으로 게시되지 않는다. 히든 메트릭을 사용하려면, 관련 클러스터 컴포넌트의 구성을 오버라이드(override)해야 한다. + +메트릭이 삭제되면, 메트릭이 게시되지 않는다. 오버라이드해서 이를 변경할 수 없다. + + +## 히든 메트릭 표시 + +위에서 설명한 것처럼, 관리자는 특정 바이너리의 커맨드 라인 플래그를 통해 히든 메트릭을 활성화할 수 있다. 관리자가 지난 릴리스에서 사용 중단된 메트릭의 마이그레이션을 놓친 경우 관리자를 위한 임시방편으로 사용된다. + +`show-hidden-metrics-for-version` 플래그는 해당 릴리스에서 사용 중단된 메트릭을 보여주려는 버전을 사용한다. 버전은 xy로 표시되며, 여기서 x는 메이저(major) 버전이고, y는 마이너(minor) 버전이다. 패치 릴리스에서 메트릭이 사용 중단될 수 있지만, 패치 버전은 필요하지 않다. 그 이유는 메트릭 사용 중단 정책이 마이너 릴리스에 대해 실행되기 때문이다. + +플래그는 그 값으로 이전의 마이너 버전만 사용할 수 있다. 관리자가 이전 버전을 `show-hidden-metrics-for-version` 에 설정하면 이전 버전의 모든 히든 메트릭이 생성된다. 사용 중단 메트릭 정책을 위반하기 때문에 너무 오래된 버전은 허용되지 않는다. + +1.n 버전에서 사용 중단되었다고 가정한 메트릭 `A` 를 예로 들어보겠다. 메트릭 사용 중단 정책에 따르면, 다음과 같은 결론에 도달할 수 있다. + +* `1.n` 릴리스에서는 메트릭이 사용 중단되었으며, 기본적으로 생성될 수 있다. +* `1.n+1` 릴리스에서는 기본적으로 메트릭이 숨겨져 있으며, `show-hidden-metrics-for-version=1.n` 커맨드 라인에 의해서 생성될 수 있다. +* `1.n+2` 릴리스에서는 코드베이스에서 메트릭이 제거되어야 한다. 더이상 임시방편은 존재하지 않는다. + +릴리스 `1.12` 에서 `1.13` 으로 업그레이드 중이지만, `1.12` 에서 사용 중단된 메트릭 `A` 를 사용하고 있다면, 커맨드 라인에서 `--show-hidden-metrics=1.12` 플래그로 히든 메트릭을 설정해야 하고, `1.14` 로 업그레이드하기 전에 이 메트릭을 사용하지 않도록 의존성을 제거하는 것을 기억해야 한다. + +## 컴포넌트 메트릭 + +### kube-controller-manager 메트릭 + +컨트롤러 관리자 메트릭은 컨트롤러 관리자의 성능과 상태에 대한 중요한 인사이트를 제공한다. +이러한 메트릭에는 go_routine 수와 같은 일반적인 Go 언어 런타임 메트릭과 +etcd 요청 대기 시간 또는 Cloudprovider(AWS, GCE, OpenStack) API 대기 시간과 같은 컨트롤러 특정 메트릭이 포함되어 +클러스터의 상태를 측정하는 데 사용할 수 있다. + +쿠버네티스 1.7부터 GCE, AWS, Vsphere 및 OpenStack의 스토리지 운영에 대한 상세한 Cloudprovider 메트릭을 사용할 수 있다. +이 메트릭은 퍼시스턴트 볼륨 동작의 상태를 모니터링하는 데 사용할 수 있다. + +예를 들어, GCE의 경우 이러한 메트릭을 다음과 같이 호출한다. + +``` +cloudprovider_gce_api_request_duration_seconds { request = "instance_list"} +cloudprovider_gce_api_request_duration_seconds { request = "disk_insert"} +cloudprovider_gce_api_request_duration_seconds { request = "disk_delete"} +cloudprovider_gce_api_request_duration_seconds { request = "attach_disk"} +cloudprovider_gce_api_request_duration_seconds { request = "detach_disk"} +cloudprovider_gce_api_request_duration_seconds { request = "list_disk"} +``` + + + +## {{% heading "whatsnext" %}} + +* 메트릭에 대한 [프로메테우스 텍스트 형식](https://github.com/prometheus/docs/blob/master/content/docs/instrumenting/exposition_formats.md#text-based-format)에 대해 읽어본다 +* [안정적인 쿠버네티스 메트릭](https://github.com/kubernetes/kubernetes/blob/master/test/instrumentation/testdata/stable-metrics-list.yaml) 목록을 참고한다 +* [쿠버네티스 사용 중단 정책](/docs/reference/using-api/deprecation-policy/#deprecating-a-feature-or-behavior)에 대해 읽어본다 diff --git a/content/ko/docs/concepts/configuration/configmap.md b/content/ko/docs/concepts/configuration/configmap.md index 5031b06cf5..3b339ca18f 100644 --- a/content/ko/docs/concepts/configuration/configmap.md +++ b/content/ko/docs/concepts/configuration/configmap.md @@ -225,7 +225,7 @@ kubelet은 모든 주기적인 동기화에서 마운트된 컨피그맵이 최 - immutable로 표시된 컨피그맵에 대한 감시를 중단하여, kube-apiserver의 부하를 크게 줄임으로써 클러스터의 성능을 향상시킴 이 기능을 사용하려면 `ImmutableEmphemeralVolumes` -[기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/)를 활성화하고 +[기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 활성화하고 시크릿 또는 컨피그맵의 `immutable` 필드를 `true` 로 한다. 다음은 예시이다. ```yaml apiVersion: v1 diff --git a/content/ko/docs/concepts/configuration/manage-resources-containers.md b/content/ko/docs/concepts/configuration/manage-resources-containers.md index 3c1414fcd6..42036c7da8 100644 --- a/content/ko/docs/concepts/configuration/manage-resources-containers.md +++ b/content/ko/docs/concepts/configuration/manage-resources-containers.md @@ -292,7 +292,7 @@ kubelet은 사용 중인 로컬 스토리지 양을 측정할 수 있다. 이것 제공한다. - `LocalStorageCapacityIsolation` - [기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/)(이 + [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)(이 기능이 기본적으로 설정되어 있음)를 활성화하고, - 로컬 임시 스토리지에 대한 지원되는 구성 중 하나를 사용하여 노드를 설정한다. @@ -441,7 +441,7 @@ kubelet은 각 `emptyDir` 볼륨, 컨테이너 로그 디렉터리 및 쓰기 프로젝트 쿼터를 사용하려면, 다음을 수행해야 한다. * kubelet 구성에서 `LocalStorageCapacityIsolationFSQuotaMonitoring=true` - [기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/)를 + [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 활성화한다. * 루트 파일시스템(또는 선택적인 런타임 파일시스템)에 diff --git a/content/ko/docs/concepts/configuration/pod-overhead.md b/content/ko/docs/concepts/configuration/pod-overhead.md index d4888ecbfb..2a08de53fb 100644 --- a/content/ko/docs/concepts/configuration/pod-overhead.md +++ b/content/ko/docs/concepts/configuration/pod-overhead.md @@ -32,7 +32,7 @@ _파드 오버헤드_ 는 컨테이너 리소스 요청과 상한 위에서 파 ## 파드 오버헤드 활성화하기 {#set-up} 기능 활성화를 위해 클러스터에서 -`PodOverhead` [기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/) 가 활성화 되어 있고 (1.18 버전에서는 기본적으로 활성화), +`PodOverhead` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)가 활성화되어 있고(1.18 버전에서는 기본적으로 활성화), `overhead` 필드를 정의하는 `RuntimeClass` 가 사용되고 있는지 확인해야 한다. ## 사용 예제 diff --git a/content/ko/docs/concepts/configuration/pod-priority-preemption.md b/content/ko/docs/concepts/configuration/pod-priority-preemption.md index ac39ed6c94..e0d6317b29 100644 --- a/content/ko/docs/concepts/configuration/pod-priority-preemption.md +++ b/content/ko/docs/concepts/configuration/pod-priority-preemption.md @@ -160,7 +160,7 @@ description: "이 프라이어리티 클래스는 XYZ 서비스 파드에만 사 해당 프라이어리티클래스의 파드는 비-선점될 것이다. `PreemptionPolicy` 필드를 사용하려면 `NonPreemptingPriority` -[기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/)가 +[기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)가 활성화되어야 한다. 예제 유스케이스는 데이터 과학 관련 워크로드이다. @@ -408,4 +408,3 @@ kubelet 리소스 부족 축출은 사용량이 요청을 초과하지 않는 ## {{% heading "whatsnext" %}} * 프라이어리티클래스와 관련하여 리소스쿼터 사용에 대해 [기본적으로 프라이어리티 클래스 소비 제한](/ko/docs/concepts/policy/resource-quotas/#기본적으로-우선-순위-클래스-소비-제한)을 읽어보자. - diff --git a/content/ko/docs/concepts/containers/runtime-class.md b/content/ko/docs/concepts/containers/runtime-class.md index ea661af0c6..3da41dfde0 100644 --- a/content/ko/docs/concepts/containers/runtime-class.md +++ b/content/ko/docs/concepts/containers/runtime-class.md @@ -33,7 +33,7 @@ weight: 20 ## 셋업 런타임클래스 기능 게이트가 활성화(기본값)된 것을 확인한다. -기능 게이트 활성화에 대한 설명은 [기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/)를 +기능 게이트 활성화에 대한 설명은 [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 참고한다. `RuntimeClass` 기능 게이트는 apiservers _및_ kubelets에서 활성화되어야 한다. 1. CRI 구현(implementation)을 노드에 설정(런타임에 따라서) @@ -135,9 +135,7 @@ https://github.com/containerd/cri/blob/master/docs/config.md runtime_path = "${PATH_TO_BINARY}" ``` -더 자세한 것은 CRI-O의 [설정 문서][100]를 본다. - -[100]: https://raw.githubusercontent.com/cri-o/cri-o/9f11d1d/docs/crio.conf.5.md +더 자세한 것은 CRI-O의 [설정 문서](https://raw.githubusercontent.com/cri-o/cri-o/9f11d1d/docs/crio.conf.5.md)를 본다. ## 스케줄 @@ -146,7 +144,8 @@ https://github.com/containerd/cri/blob/master/docs/config.md 쿠버네티스 v1.16 부터, 런타임 클래스는 `scheduling` 필드를 통해 이종의 클러스터 지원을 포함한다. 이 필드를 사용하면, 이 런타임 클래스를 갖는 파드가 이를 지원하는 노드로 스케줄된다는 것을 보장할 수 있다. 이 스케줄링 기능을 사용하려면, -[런타임 클래스 어드미션(admission) 컨트롤러][]를 활성화(1.16 부터 기본값)해야 한다. +[런타임 클래스 어드미션(admission) 컨트롤러](/docs/reference/access-authn-authz/admission-controllers/#runtimeclass)를 +활성화(1.16 부터 기본값)해야 한다. 파드가 지정된 런타임클래스를 지원하는 노드에 안착한다는 것을 보장하려면, 해당 노드들은 `runtimeClass.scheduling.nodeSelector` 필드에서 선택되는 공통 레이블을 가져야한다. @@ -162,15 +161,13 @@ https://github.com/containerd/cri/blob/master/docs/config.md 노드 셀렉터와 톨러레이션 설정에 대해 더 배우려면 [노드에 파드 할당](/ko/docs/concepts/scheduling-eviction/assign-pod-node/)을 참고한다. -[런타임클래스 어드미션 컨트롤러]: /docs/reference/access-authn-authz/admission-controllers/#runtimeclass - ### 파드 오버헤드 {{< feature-state for_k8s_version="v1.18" state="beta" >}} 파드 실행과 연관되는 _오버헤드_ 리소스를 지정할 수 있다. 오버헤드를 선언하면 클러스터(스케줄러 포함)가 파드와 리소스에 대한 결정을 내릴 때 처리를 할 수 있다. -PodOverhead를 사용하려면, PodOverhead [기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/) +PodOverhead를 사용하려면, PodOverhead [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/) 를 활성화 시켜야 한다. (기본으로 활성화 되어 있다.) 파드 오버헤드는 런타임 클래스에서 `overhead` 필드를 통해 정의된다. 이 필드를 사용하면, diff --git a/content/ko/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation.md b/content/ko/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation.md index 53d925f891..db2eddb3d1 100644 --- a/content/ko/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation.md +++ b/content/ko/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation.md @@ -27,7 +27,7 @@ Extension-apiserver는 kube-apiserver로 오가는 연결의 레이턴시가 낮 kube-apiserver로 부터의 디스커버리 요청은 왕복 레이턴시가 5초 이내여야 한다. extention API server가 레이턴시 요구 사항을 달성할 수 없는 경우 이를 충족할 수 있도록 변경하는 것을 고려한다. -`EnableAggregatedDiscoveryTimeout=false` [기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/)를 설정해서 타임아웃 +`EnableAggregatedDiscoveryTimeout=false` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 설정해서 타임아웃 제한을 비활성화 할 수 있다. 이 사용 중단(deprecated)된 기능 게이트는 향후 릴리스에서 제거될 예정이다. @@ -39,4 +39,3 @@ extention API server가 레이턴시 요구 사항을 달성할 수 없는 경 * 다음에, [확장 API 서버를 구성해서](/docs/tasks/extend-kubernetes/setup-extension-api-server/) 애그리게이션 레이어와 연계한다. * 또한, 어떻게 [쿠버네티스 API를 커스텀 리소스 데피니션으로 확장하는지](/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/)를 배워본다. * [API 서비스](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#apiservice-v1-apiregistration-k8s-io)의 사양을 읽어본다. - diff --git a/content/ko/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins.md b/content/ko/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins.md index bf4eb55898..bfdb7ef8c3 100644 --- a/content/ko/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins.md +++ b/content/ko/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins.md @@ -181,7 +181,7 @@ gRPC 서비스는 `/var/lib/kubelet/pod-resources/kubelet.sock` 의 유닉스 `/var/lib/kubelet/pod-resources` 를 {{< glossary_tooltip text="볼륨" term_id="volume" >}}으로 마운트해야 한다. -"PodResources 서비스"를 지원하려면 `KubeletPodResources` [기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/)를 활성화해야 한다. 쿠버네티스 1.15부터 기본적으로 활성화되어 있다. +"PodResources 서비스"를 지원하려면 `KubeletPodResources` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 활성화해야 한다. 쿠버네티스 1.15부터 기본적으로 활성화되어 있다. ## 토폴로지 관리자와 장치 플러그인 통합 @@ -229,6 +229,6 @@ pluginapi.Device{ID: "25102017", Health: pluginapi.Healthy, Topology:&pluginapi. * 장치 플러그인을 사용한 [GPU 리소스 스케줄링](/ko/docs/tasks/manage-gpus/scheduling-gpus/)에 대해 알아보기 -* 노드에서의 [확장 리소스 알리기](/docs/tasks/administer-cluster/extended-resource-node/)에 대해 배우기 +* 노드에서의 [확장 리소스 알리기](/ko/docs/tasks/administer-cluster/extended-resource-node/)에 대해 배우기 * 쿠버네티스에서 [TLS 수신에 하드웨어 가속](https://kubernetes.io/blog/2019/04/24/hardware-accelerated-ssl/tls-termination-in-ingress-controllers-using-kubernetes-device-plugins-and-runtimeclass/) 사용에 대해 읽기 * [토폴로지 관리자](/docs/tasks/adminster-cluster/topology-manager/)에 대해 알아보기 diff --git a/content/ko/docs/concepts/overview/working-with-objects/common-labels.md b/content/ko/docs/concepts/overview/working-with-objects/common-labels.md index c9125cbe3d..8abdacb09d 100644 --- a/content/ko/docs/concepts/overview/working-with-objects/common-labels.md +++ b/content/ko/docs/concepts/overview/working-with-objects/common-labels.md @@ -35,7 +35,7 @@ kubectl과 대시보드와 같은 많은 도구들로 쿠버네티스 오브젝 | Key | Description | Example | Type | | ----------------------------------- | --------------------- | -------- | ---- | | `app.kubernetes.io/name` | 애플리케이션 이름 | `mysql` | 문자열 | -| `app.kubernetes.io/instance` | 애플리케이션의 인스턴스를 식별하는 고유한 이름 | `wordpress-abcxzy` | 문자열 | +| `app.kubernetes.io/instance` | 애플리케이션의 인스턴스를 식별하는 고유한 이름 | `mysql-abcxzy` | 문자열 | | `app.kubernetes.io/version` | 애플리케이션의 현재 버전 (예: a semantic version, revision hash 등.) | `5.7.21` | 문자열 | | `app.kubernetes.io/component` | 아키텍처 내 구성요소 | `database` | 문자열 | | `app.kubernetes.io/part-of` | 이 애플리케이션의 전체 이름 | `wordpress` | 문자열 | @@ -49,7 +49,7 @@ kind: StatefulSet metadata: labels: app.kubernetes.io/name: mysql - app.kubernetes.io/instance: wordpress-abcxzy + app.kubernetes.io/instance: mysql-abcxzy app.kubernetes.io/version: "5.7.21" app.kubernetes.io/component: database app.kubernetes.io/part-of: wordpress diff --git a/content/ko/docs/concepts/policy/pod-security-policy.md b/content/ko/docs/concepts/policy/pod-security-policy.md index aa3e786af7..c0ccaea504 100644 --- a/content/ko/docs/concepts/policy/pod-security-policy.md +++ b/content/ko/docs/concepts/policy/pod-security-policy.md @@ -299,7 +299,7 @@ kubectl-user delete pod pause 약간 다르게 다시 시도해보자. ```shell -kubectl-user run pause --image=k8s.gcr.io/pause +kubectl-user create deployment pause --image=k8s.gcr.io/pause deployment "pause" created kubectl-user get pods diff --git a/content/ko/docs/concepts/services-networking/dns-pod-service.md b/content/ko/docs/concepts/services-networking/dns-pod-service.md index 46ac05bf8e..3f5a05f4ee 100644 --- a/content/ko/docs/concepts/services-networking/dns-pod-service.md +++ b/content/ko/docs/concepts/services-networking/dns-pod-service.md @@ -162,13 +162,13 @@ DNS 정책은 파드별로 설정할 수 있다. - "`Default`": 파드는 파드가 실행되고 있는 노드로부터 네임 해석 설정(the name resolution configuration)을 상속받는다. 자세한 내용은 - [관련 논의](/docs/tasks/administer-cluster/dns-custom-nameservers/#inheriting-dns-from-the-node)에서 + [관련 논의](/ko/docs/tasks/administer-cluster/dns-custom-nameservers/)에서 확인할 수 있다. - "`ClusterFirst`": "`www.kubernetes.io`"와 같이 클러스터 도메인 suffix 구성과 일치하지 않는 DNS 쿼리는 노드에서 상속된 업스트림 네임서버로 전달된다. 클러스터 관리자는 추가 스텁-도메인(stub-domain)과 업스트림 DNS 서버를 구축할 수 있다. 그러한 경우 DNS 쿼리를 어떻게 처리하는지에 대한 자세한 내용은 - [관련 논의](/docs/tasks/administer-cluster/dns-custom-nameservers/#effects-on-pods)에서 + [관련 논의](/ko/docs/tasks/administer-cluster/dns-custom-nameservers/)에서 확인할 수 있다. - "`ClusterFirstWithHostNet`": hostNetwork에서 running 상태인 파드의 경우 DNS 정책인 "`ClusterFirstWithHostNet`"을 명시적으로 설정해야 한다. @@ -272,4 +272,4 @@ options ndots:5 DNS 구성 관리에 대한 지침은 -[DNS 서비스 구성](/docs/tasks/administer-cluster/dns-custom-nameservers/)에서 확인할 수 있다. +[DNS 서비스 구성](/ko/docs/tasks/administer-cluster/dns-custom-nameservers/)에서 확인할 수 있다. diff --git a/content/ko/docs/concepts/services-networking/dual-stack.md b/content/ko/docs/concepts/services-networking/dual-stack.md index a94aaad2d1..6efe70de75 100644 --- a/content/ko/docs/concepts/services-networking/dual-stack.md +++ b/content/ko/docs/concepts/services-networking/dual-stack.md @@ -39,7 +39,7 @@ IPv4/IPv6 이중 스택 쿠버네티스 클러스터를 활용하려면 다음 ## IPv4/IPv6 이중 스택 활성화 -IPv4/IPv6 이중 스택을 활성화 하려면, 클러스터의 관련 구성요소에 대해 `IPv6DualStack` [기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/) 를 활성화 하고, 이중 스택 클러스터 네트워크 할당을 설정한다. +IPv4/IPv6 이중 스택을 활성화 하려면, 클러스터의 관련 구성요소에 대해 `IPv6DualStack` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/) 를 활성화 하고, 이중 스택 클러스터 네트워크 할당을 설정한다. * kube-apiserver: * `--feature-gates="IPv6DualStack=true"` @@ -105,5 +105,3 @@ IPv6가 활성화된 외부 로드 밸런서를 지원하는 클라우드 공급 * [IPv4/IPv6 이중 스택 확인](/docs/tasks/network/validate-dual-stack) 네트워킹 - - diff --git a/content/ko/docs/concepts/services-networking/network-policies.md b/content/ko/docs/concepts/services-networking/network-policies.md index f10552c703..adcf9f9e9a 100644 --- a/content/ko/docs/concepts/services-networking/network-policies.md +++ b/content/ko/docs/concepts/services-networking/network-policies.md @@ -99,7 +99,7 @@ __egress__: 각 네트워크폴리시에는 화이트리스트 `egress` 규칙 * 172.17.0.0–172.17.0.255 와 172.17.2.0–172.17.255.255 의 범위를 가지는 IP 주소(예: 172.17.0.0/16 전체에서 172.17.1.0/24 를 제외) 3. (이그레스 규칙)은 "role=db" 레이블이 있는 "default" 네임스페이스의 모든 파드에서 TCP 포트 5978의 CIDR 10.0.0.0/24 로의 연결을 허용한다. -자세한 설명과 추가 예시는 [네트워크 정책 선언](/docs/tasks/administer-cluster/declare-network-policy/)을 본다. +자세한 설명과 추가 예시는 [네트워크 정책 선언](/ko/docs/tasks/administer-cluster/declare-network-policy/)을 본다. ## `to` 및 `from` 셀럭터의 동작 @@ -203,7 +203,7 @@ __ipBlock__: 인그레스 소스 또는 이그레스 대상으로 허용할 IP C {{< feature-state for_k8s_version="v1.12" state="alpha" >}} -이 기능을 사용하려면 사용자(또는 클러스터 관리자가) API 서버에 `--feature-gates=SCTPSupport=true,…` 를 사용해서 `SCTPSupport` [기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/)를 활성화 해야 한다. +이 기능을 사용하려면 사용자(또는 클러스터 관리자가) API 서버에 `--feature-gates=SCTPSupport=true,…` 를 사용해서 `SCTPSupport` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 활성화 해야 한다. 기능 게이트가 활셩화 되면, 네트워크폴리시의 `protocol` 필드를 `SCTP` 로 설정할 수 있다. {{< note >}} @@ -217,5 +217,5 @@ SCTP 프로토콜 네트워크폴리시를 지원하는 {{< glossary_tooltip tex - 자세한 설명과 추가 예시는 - [네트워크 정책 선언](/docs/tasks/administer-cluster/declare-network-policy/)을 본다. + [네트워크 정책 선언](/ko/docs/tasks/administer-cluster/declare-network-policy/)을 본다. - 네트워크폴리시 리소스에서 사용되는 일반적인 시나리오는 [레시피](https://github.com/ahmetb/kubernetes-network-policy-recipes)를 본다. diff --git a/content/ko/docs/concepts/services-networking/service.md b/content/ko/docs/concepts/services-networking/service.md index 4779d0504c..429708e4bf 100644 --- a/content/ko/docs/concepts/services-networking/service.md +++ b/content/ko/docs/concepts/services-networking/service.md @@ -208,7 +208,7 @@ AppProtocol 필드는 각 서비스 포트에 사용될 애플리케이션 프 지정하는 방법을 제공한다. 알파 기능으로 이 필드는 기본적으로 활성화되어 있지 않다. 이 필드를 사용하려면, -[기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/)에서 +[기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)에서 `ServiceAppProtocol` 을 활성화해야 한다. ## 가상 IP와 서비스 프록시 diff --git a/content/ko/docs/concepts/storage/persistent-volumes.md b/content/ko/docs/concepts/storage/persistent-volumes.md index 0e418f414b..c5a09d23e9 100644 --- a/content/ko/docs/concepts/storage/persistent-volumes.md +++ b/content/ko/docs/concepts/storage/persistent-volumes.md @@ -132,7 +132,7 @@ Events: #### Delete(삭제) -`Delete` 반환 정책을 지원하는 볼륨 플러그인의 경우, 삭제는 쿠버네티스에서 퍼시스턴트볼륨 오브젝트와 외부 인프라(예: AWS EBS, GCE PD, Azure Disk 또는 Cinder 볼륨)의 관련 스토리지 자산을 모두 삭제한다. 동적으로 프로비저닝된 볼륨은 [스토리지클래스의 반환 정책](#반환-정책)을 상속하며 기본값은 `Delete`이다. 관리자는 사용자의 기대에 따라 스토리지클래스를 구성해야 한다. 그렇지 않으면 PV를 생성한 후 PV를 수정하거나 패치해야 한다. [퍼시스턴트볼륨의 반환 정책 변경](/docs/tasks/administer-cluster/change-pv-reclaim-policy/)을 참고하길 바란다. +`Delete` 반환 정책을 지원하는 볼륨 플러그인의 경우, 삭제는 쿠버네티스에서 퍼시스턴트볼륨 오브젝트와 외부 인프라(예: AWS EBS, GCE PD, Azure Disk 또는 Cinder 볼륨)의 관련 스토리지 자산을 모두 삭제한다. 동적으로 프로비저닝된 볼륨은 [스토리지클래스의 반환 정책](#반환-정책)을 상속하며 기본값은 `Delete`이다. 관리자는 사용자의 기대에 따라 스토리지클래스를 구성해야 한다. 그렇지 않으면 PV를 생성한 후 PV를 수정하거나 패치해야 한다. [퍼시스턴트볼륨의 반환 정책 변경](/ko/docs/tasks/administer-cluster/change-pv-reclaim-policy/)을 참고하길 바란다. #### Recycle(재활용) @@ -228,7 +228,7 @@ FlexVolume은 파드 재시작 시 크기를 조정할 수 있다. {{< feature-state for_k8s_version="v1.15" state="beta" >}} {{< note >}} -사용 중인 PVC 확장은 쿠버네티스 1.15 이후 버전에서는 베타로, 1.11 이후 버전에서는 알파로 제공된다. `ExpandInUsePersistentVolumes` 기능을 사용하도록 설정해야 한다. 베타 기능의 경우 여러 클러스터에서 자동으로 적용된다. 자세한 내용은 [기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/) 문서를 참고한다. +사용 중인 PVC 확장은 쿠버네티스 1.15 이후 버전에서는 베타로, 1.11 이후 버전에서는 알파로 제공된다. `ExpandInUsePersistentVolumes` 기능을 사용하도록 설정해야 한다. 베타 기능의 경우 여러 클러스터에서 자동으로 적용된다. 자세한 내용은 [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/) 문서를 참고한다. {{< /note >}} 이 경우 기존 PVC를 사용하는 파드 또는 디플로이먼트를 삭제하고 다시 만들 필요가 없다. diff --git a/content/ko/docs/concepts/storage/storage-limits.md b/content/ko/docs/concepts/storage/storage-limits.md new file mode 100644 index 0000000000..302161dbd7 --- /dev/null +++ b/content/ko/docs/concepts/storage/storage-limits.md @@ -0,0 +1,75 @@ +--- +title: 노드 별 볼륨 한도 +content_type: concept +--- + + + +이 페이지는 다양한 클라우드 공급자들이 제공하는 노드에 연결할 수 있는 +최대 볼륨 수를 설명한다. + +Google, Amazon 그리고 Microsoft와 같은 클라우드 공급자는 일반적으로 노드에 +연결할 수 있는 볼륨 수에 제한이 있다. 쿠버네티스가 이러한 제한을 +준수하는 것은 중요하다. 그렇지 않으면, 노드에서 예약된 파드가 볼륨이 +연결될 때까지 멈추고 기다릴 수 있다. + + + + + +## 쿠버네티스 기본 한도 + +쿠버네티스 스케줄러에는 노드에 연결될 수 있는 볼륨 수에 대한 +기본 한도가 있다. + + + + + + +
클라우드 서비스노드 당 최대 볼륨
Amazon Elastic Block Store (EBS)39
Google Persistent Disk16
Microsoft Azure Disk Storage16
+ +## 사용자 정의 한도 + +`KUBE_MAX_PD_VOLS` 환경 변수의 값을 설정한 후, +스케줄러를 시작하여 이러한 한도를 변경할 수 있다. +CSI 드라이버는 절차가 다를 수 있으므로, 한도를 사용자 정의하는 +방법에 대한 문서를 참고한다. + +기본 한도보다 높은 한도를 설정한 경우 주의한다. 클라우드 +공급자의 문서를 참조하여 노드가 실제로 사용자가 설정한 한도를 +지원할 수 있는지 확인한다. + +한도는 전체 클러스터에 적용되므로, 모든 노드에 영향을 준다. + +## 동적 볼륨 한도 + +{{< feature-state state="stable" for_k8s_version="v1.17" >}} + +다음 볼륨 유형에 대해 동적 볼륨 한도가 지원된다. + +- Amazon EBS +- Google Persistent Disk +- Azure Disk +- CSI + +인-트리(in-tree) 볼륨 플러그인으로 관리되는 볼륨의 경우, 쿠버네티스는 자동으로 노드 유형을 +결정하고 노드에 적절한 최대 볼륨 수를 적용한다. 예를 들면, 다음과 같다. + +*
Google Compute Engine에서는, +[노드 유형에 따라](https://cloud.google.com/compute/docs/disks/#pdnumberlimits) +최대 127개의 볼륨까지 +노드에 연결할 수 있다. + +* M5, C5, R5, T3와 Z1D 인스턴스 유형의 Amazon EBS 디스크의 경우, 쿠버네티스는 25개의 볼륨만 노드에 +연결할 수 있도록 허용한다. +Amazon Elastic Compute Cloud (EC2)의 +다른 인스턴스 유형의 경우, 쿠버네티스는 노드에 39개의 볼륨을 연결할 수 있도록 허용한다. + +* Azure에서는, 노드 유형에 따라 최대 64개의 디스크를 노드에 연결할 수 있다. 더 자세한 내용은 [Azure의 가상 머신 크기](https://docs.microsoft.com/ko-kr/azure/virtual-machines/windows/sizes)를 참고한다. + +* CSI 스토리지 드라이버가 `NodeGetInfo` 를 사용해서 노드에 대한 최대 볼륨 수를 알린다면, {{< glossary_tooltip text="kube-scheduler" term_id="kube-scheduler" >}}는 그 한도를 따른다. + +자세한 내용은 [CSI 명세](https://github.com/container-storage-interface/spec/blob/master/spec.md#nodegetinfo)를 참고한다. + +* CSI 드라이버로 마이그레이션된 인-트리 플러그인으로 관리되는 볼륨의 경우, 최대 볼륨 수는 CSI 드라이버가 보고한 개수이다. diff --git a/content/ko/docs/concepts/storage/volumes.md b/content/ko/docs/concepts/storage/volumes.md index ce31b183a4..c93cc5018e 100644 --- a/content/ko/docs/concepts/storage/volumes.md +++ b/content/ko/docs/concepts/storage/volumes.md @@ -779,7 +779,7 @@ iSCSI 볼륨와 같은)를 "클레임" 할 수 있는 방법이다. 서비스 어카운트 토큰의 프로젝션은 쿠버네티스 1.11에 기능이 도입되었고 1.12에서 베타로 승격되었다. 1.11에서 이 기능을 활성화 하려면 `TokenRequestProjection` -[기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/)를 +[기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 True로 명시적인 설정이 필요하다. #### 시크릿, downward API 그리고 configmap이 있는 파드 예시. @@ -1197,7 +1197,7 @@ spec: `subPathExpr` 필드를 사용해서 Downward API 환경 변수로부터 `subPath` 디렉터리 이름을 구성한다. -이 기능을 사용하려면 `VolumeSubpathEnvExpansion` [기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/)를 활성화 해야 한다. 쿠버네티스 1.15에서는 시작 시 기본적으로 활성화되어 있다. +이 기능을 사용하려면 `VolumeSubpathEnvExpansion` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 활성화 해야 한다. 쿠버네티스 1.15에서는 시작 시 기본적으로 활성화되어 있다. `subPath` 와 `subPathExpr` 속성은 상호 배타적이다. 이 예제는 파드가 `subPathExpr` 을 사용해서 Downward API로부터 파드 이름을 사용해서 hostPath 볼륨 `/var/log/pods` 내에 `pod1` 디렉터리를 생성한다. 호스트 디렉터리 `/var/log/pods/pod1` 은 컨테이너의 `/logs` 에 마운트 된다. diff --git a/content/ko/docs/concepts/workloads/controllers/job.md b/content/ko/docs/concepts/workloads/controllers/job.md index f203befbad..7b48a96c67 100644 --- a/content/ko/docs/concepts/workloads/controllers/job.md +++ b/content/ko/docs/concepts/workloads/controllers/job.md @@ -211,9 +211,9 @@ _작업 큐_ 잡은 `.spec.completions` 를 설정하지 않은 상태로 두고 이렇게 하려면 `.spec.backoffLimit` 에 잡을 실패로 간주하기 이전에 재시도할 횟수를 설정한다. 백오프 제한은 기본적으로 6으로 설정되어 있다. 잡과 관련한 실패한 파드는 최대 6분안에서 기하급수적으로 증가하는 백-오프 지연 (10초, 20초, 40초 ...) -한도가 되어 잡 컨트롤러에 의해 재생성 된다. 잡의 다음 상태 -확인 이전에 새로 실패한 파드가 표시되지 않으면 백 오프 -카운트가 재설정 된다. +한도가 되어 잡 컨트롤러에 의해 재생성된다. 잡의 파드가 삭제되거나 +해당 시간 동안 잡에 대한 다른 파드가 실패 없이 성공했을 때 백 오프 +카운트가 재설정된다. {{< note >}} 1.12 이전 버전의 쿠버네티스 버전에 대해 여전히 [#54870](https://github.com/kubernetes/kubernetes/issues/54870) 이슈가 있다. diff --git a/content/ko/docs/concepts/workloads/controllers/replicaset.md b/content/ko/docs/concepts/workloads/controllers/replicaset.md index 18c618a6b1..a23c3605cf 100644 --- a/content/ko/docs/concepts/workloads/controllers/replicaset.md +++ b/content/ko/docs/concepts/workloads/controllers/replicaset.md @@ -346,7 +346,7 @@ kubectl autoscale rs frontend --max=10 --min=3 --cpu-percent=50 ### 잡 -스스로 종료되는 것이 예상되는 파드의 경우에는 레플리카셋 대신 [`잡`](/docs/concepts/jobs/run-to-completion-finite-workloads/)을 이용한다 +스스로 종료되는 것이 예상되는 파드의 경우에는 레플리카셋 대신 [`잡`](/ko/docs/concepts/workloads/controllers/job/)을 이용한다 (즉, 배치 잡). ### 데몬셋 diff --git a/content/ko/docs/concepts/workloads/controllers/replicationcontroller.md b/content/ko/docs/concepts/workloads/controllers/replicationcontroller.md index 53ff69b288..c2414d9fdd 100644 --- a/content/ko/docs/concepts/workloads/controllers/replicationcontroller.md +++ b/content/ko/docs/concepts/workloads/controllers/replicationcontroller.md @@ -269,7 +269,7 @@ API 오브젝트에 대한 더 자세한 것은 ### 잡 자체적으로 제거될 것으로 예상되는 파드 (즉, 배치 잡)의 경우 -레플리케이션 컨트롤러 대신 [`잡`](/docs/concepts/jobs/run-to-completion-finite-workloads/)을 사용하라. +레플리케이션 컨트롤러 대신 [`잡`](/ko/docs/concepts/workloads/controllers/job/)을 사용하라. ### 데몬셋 diff --git a/content/ko/docs/concepts/workloads/controllers/statefulset.md b/content/ko/docs/concepts/workloads/controllers/statefulset.md index 06cdbdc5e3..d588276b25 100644 --- a/content/ko/docs/concepts/workloads/controllers/statefulset.md +++ b/content/ko/docs/concepts/workloads/controllers/statefulset.md @@ -134,6 +134,18 @@ N개의 레플리카가 있는 스테이트풀셋은 스테이트풀셋에 있 일치되는 DNS 서브도메인을 가지며, 여기서 거버닝 서비스(governing service)는 스테이트풀셋의 `serviceName` 필드에 의해 정의된다. +클러스터에서 DNS가 구성된 방식에 따라, 새로 실행된 파드의 DNS 이름을 +즉시 찾지 못할 수 있다. 이 동작은 클러스터의 다른 클라이언트가 +파드가 생성되기 전에 파드의 호스트 이름에 대한 쿼리를 이미 보낸 경우에 발생할 수 있다. +네거티브 캐싱(DNS에서 일반적)은 이전에 실패한 조회 결과가 +파드가 실행된 후에도 적어도 몇 초 동안 기억되고 재사용됨을 의미한다. + +파드를 생성한 후 즉시 파드를 검색해야 하는 경우, 몇 가지 옵션이 있다. + +- DNS 조회에 의존하지 않고 쿠버네티스 API를 직접(예를 들어 watch 사용) 쿼리한다. +- 쿠버네티스 DNS 공급자의 캐싱 시간(일반적으로 CoreDNS의 컨피그맵을 편집하는 것을 의미하며, 현재 30초 동안 캐시함)을 줄인다. + + [제한사항](#제한사항) 섹션에서 언급한 것처럼 사용자는 파드의 네트워크 신원을 책임지는 [헤드리스 서비스](/ko/docs/concepts/services-networking/service/#헤드리스-headless-서비스)를 생성할 책임이 있다. diff --git a/content/ko/docs/concepts/workloads/controllers/ttlafterfinished.md b/content/ko/docs/concepts/workloads/controllers/ttlafterfinished.md index 99d274a00d..3d110ee6c6 100644 --- a/content/ko/docs/concepts/workloads/controllers/ttlafterfinished.md +++ b/content/ko/docs/concepts/workloads/controllers/ttlafterfinished.md @@ -16,7 +16,7 @@ TTL 컨트롤러는 실행이 완료된 리소스 오브젝트의 수명을 알파(Alpha) 고지 사항: 이 기능은 현재 알파이고, kube-apiserver와 kube-controller-manager와 함께 -[기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/)로 `TTLAfterFinished` 를 활성화할 수 있다. +[기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)로 `TTLAfterFinished` 를 활성화할 수 있다. diff --git a/content/ko/docs/concepts/workloads/pods/ephemeral-containers.md b/content/ko/docs/concepts/workloads/pods/ephemeral-containers.md index 1e8a54fff9..20977e4e94 100644 --- a/content/ko/docs/concepts/workloads/pods/ephemeral-containers.md +++ b/content/ko/docs/concepts/workloads/pods/ephemeral-containers.md @@ -8,9 +8,9 @@ weight: 80 {{< feature-state state="alpha" for_k8s_version="v1.16" >}} -이 페이지는 임시 컨테이너에 대한 개요를 제공한다: 이 특별한 유형의 컨테이너는 -트러블 슈팅과 같은 사용자가 시작한 작업을 완료하기위해 기존 {{< glossary_tooltip text="파드" term_id="pod" >}} 에서 -임시적으로 실행된다. 사용자는 애플리케이션 빌드보다는 서비스를 점검할 때 임시 +이 페이지는 임시 컨테이너에 대한 개요를 제공한다: 이 특별한 유형의 컨테이너는 +트러블 슈팅과 같은 사용자가 시작한 작업을 완료하기위해 기존 {{< glossary_tooltip text="파드" term_id="pod" >}} 에서 +임시적으로 실행된다. 사용자는 애플리케이션 빌드보다는 서비스를 점검할 때 임시 컨테이너를 사용한다. {{< warning >}} @@ -82,7 +82,7 @@ API에서 특별한 `ephemeralcontainers` 핸들러를 사용해서 만들어지 {{< note >}} 이 섹션의 예시는 `EphemeralContainers` [기능 -게이트](/docs/reference/command-line-tools-reference/feature-gates/)의 +게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)의 활성화를 필요로 하고, 쿠버네티스 클라이언트와 서버는 v1.16 또는 이후의 버전이어야 한다. {{< /note >}} diff --git a/content/ko/docs/concepts/workloads/pods/init-containers.md b/content/ko/docs/concepts/workloads/pods/init-containers.md index 10baf43a7c..8d0ca2008a 100644 --- a/content/ko/docs/concepts/workloads/pods/init-containers.md +++ b/content/ko/docs/concepts/workloads/pods/init-containers.md @@ -322,4 +322,4 @@ myapp-pod 1/1 Running 0 9m * [초기화 컨테이너를 가진 파드 생성하기](/ko/docs/tasks/configure-pod-container/configure-pod-initialization/#초기화-컨테이너를-갖는-파드-생성) -* [초기화 컨테이너 디버깅](/docs/tasks/debug-application-cluster/debug-init-containers/) 알아보기 +* [초기화 컨테이너 디버깅](/ko/docs/tasks/debug-application-cluster/debug-init-containers/) 알아보기 diff --git a/content/ko/docs/concepts/workloads/pods/pod-lifecycle.md b/content/ko/docs/concepts/workloads/pods/pod-lifecycle.md index 470970f284..379266e351 100644 --- a/content/ko/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/ko/docs/concepts/workloads/pods/pod-lifecycle.md @@ -90,7 +90,7 @@ kubelet은 컨테이너에 의해서 구현된 * [HTTPGetAction](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#httpgetaction-v1-core) 은 지정한 포트 및 경로에서 컨테이너의 IP주소에 - 대한 HTTP Get 요청을 수행한다. 응답의 상태 코드가 200보다 크고 400보다 작으면 + 대한 HTTP Get 요청을 수행한다. 응답의 상태 코드가 200 이상 400 미만이면 진단이 성공한 것으로 간주한다. 각 probe는 다음 세 가지 결과 중 하나를 가진다. diff --git a/content/ko/docs/concepts/workloads/pods/pod-topology-spread-constraints.md b/content/ko/docs/concepts/workloads/pods/pod-topology-spread-constraints.md index 8a81e708dd..d92b18a1bf 100644 --- a/content/ko/docs/concepts/workloads/pods/pod-topology-spread-constraints.md +++ b/content/ko/docs/concepts/workloads/pods/pod-topology-spread-constraints.md @@ -20,7 +20,7 @@ weight: 50 를 참조한다. {{< glossary_tooltip text="API 서버" term_id="kube-apiserver" >}} **와** {{< glossary_tooltip text="스케줄러" term_id="kube-scheduler" >}}에 대해 -`EvenPodsSpread` [기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/)가 +`EvenPodsSpread` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)가 활성화되어야 한다. ### 노드 레이블 @@ -244,5 +244,3 @@ profiles: - 디플로이먼트를 스케일링 다운하면 그 결과로 파드의 분포가 불균형이 될 수 있다. - 파드와 일치하는 테인트(taint)가 된 노드가 존중된다. [이슈 80921](https://github.com/kubernetes/kubernetes/issues/80921)을 본다. - - diff --git a/content/ko/docs/contribute/_index.md b/content/ko/docs/contribute/_index.md index 9034f3d98b..714ae70f36 100644 --- a/content/ko/docs/contribute/_index.md +++ b/content/ko/docs/contribute/_index.md @@ -28,41 +28,62 @@ card: ## 시작하기 -누구든지 문서에 대한 이슈를 오픈 또는 풀 리퀘스트(PR)를 사용해서 [`kubernetes/website` GitHub 리포지터리](https://github.com/kubernetes/website)에 변경하는 기여를 할 수 있습니다. 당신이 쿠버네티스 커뮤니티에 효과적으로 기여하려면 [git](https://git-scm.com/)과 [GitHub](https://lab.github.com/)에 익숙해야 합니다. +누구든지 문서에 대한 이슈를 오픈 또는 풀 리퀘스트(PR)를 사용해서 +[`kubernetes/website` GitHub 리포지터리](https://github.com/kubernetes/website)에 +변경하는 기여를 할 수 있습니다. +쿠버네티스 커뮤니티에 효과적으로 기여하려면 +[git](https://git-scm.com/)과 +[GitHub](https://lab.github.com/)에 +익숙해야 합니다. 문서에 참여하려면 1. CNCF [Contributor License Agreement](https://github.com/kubernetes/community/blob/master/CLA.md)에 서명합니다. -2. [문서 리포지터리](https://github.com/kubernetes/website) 와 웹사이트의 [정적 사이트 생성기](https://gohugo.io)를 숙지합니다. -3. [풀 리퀘스트 열기](/ko/docs/contribute/new-content/new-content/)와 [변경 검토](/ko/docs/contribute/review/reviewing-prs/)의 기본 프로세스를 이해하도록 합니다. +1. [문서 리포지터리](https://github.com/kubernetes/website)와 웹사이트의 + [정적 사이트 생성기](https://gohugo.io)를 숙지합니다. +1. [풀 리퀘스트 열기](/ko/docs/contribute/new-content/new-content/)와 + [변경 검토](/ko/docs/contribute/review/reviewing-prs/)의 + 기본 프로세스를 이해하도록 합니다. 일부 작업에는 쿠버네티스 조직에서 더 많은 신뢰와 더 많은 접근이 필요할 수 있습니다. 역할과 권한에 대한 자세한 내용은 -[SIG Docs 참여](/ko/docs/contribute/participating/)를 봅니다. +[SIG Docs 참여](/ko/docs/contribute/participate/)를 봅니다. ## 첫 번째 기여 -- [기여 개요](/ko/docs/contribute/new-content/overview/)를 읽고 기여할 수 있는 다양한 방법에 대해 알아봅니다. -- [kubernetes/website에 기여하기](https://github.com/kubernetes/website/contribute)를 참조하여 좋은 진입점이 되는 이슈를 찾을 수 있습니다. -- 기존 문서에 대해 [GitHub을 사용해서 풀 리퀘스트 열거나](/ko/docs/contribute/new-content/new-content/#github을-사용하여-변경하기) GitHub에서의 이슈 제기에 대해 자세히 알아봅니다. -- 정확성과 언어에 대해 다른 쿠버네티스 커뮤니티 맴버의 [풀 리퀘스트 검토](/ko/docs/contribute/review/reviewing-prs/)를 합니다. -- 쿠버네티스 [콘텐츠](/docs/contribute/style/content-guide/)와 [스타일 가이드](/docs/contribute/style/style-guide/)를 읽고 정보에 대한 코멘트를 남길 수 있습니다. -- [페이지 템플릿 사용](/docs/contribute/style/page-content-types/)과 [휴고(Hugo) 단축코드(shortcodes)](/docs/contribute/style/hugo-shortcodes/)를 사용해서 큰 변경을 하는 방법에 대해 배워봅니다. +- [기여 개요](/ko/docs/contribute/new-content/overview/)를 읽고 + 기여할 수 있는 다양한 방법에 대해 알아봅니다. +- [kubernetes/website에 기여하기](https://github.com/kubernetes/website/contribute)를 + 참조하여 좋은 진입점이 되는 이슈를 찾을 수 있습니다. +- 기존 문서에 대해 [GitHub을 사용해서 풀 리퀘스트 열거나](/ko/docs/contribute/new-content/new-content/#github을-사용하여-변경하기) + GitHub에서의 이슈 제기에 대해 자세히 알아봅니다. +- 정확성과 언어에 대해 다른 쿠버네티스 커뮤니티 맴버의 + [풀 리퀘스트 검토](/ko/docs/contribute/review/reviewing-prs/)를 합니다. +- 쿠버네티스 [콘텐츠](/docs/contribute/style/content-guide/)와 + [스타일 가이드](/docs/contribute/style/style-guide/)를 읽고 정보에 대한 코멘트를 남길 수 있습니다. +- [페이지 콘텐츠 유형](/docs/contribute/style/page-content-types/)과 + [휴고(Hugo) 단축코드(shortcodes)](/docs/contribute/style/hugo-shortcodes/)에 대해 배워봅니다. ## 다음 단계 -- 리포지터리의 [로컬 복제본에서 작업](/ko/docs/contribute/new-content/new-content/#fork-the-repo)하는 방법을 배워봅니다. +- 리포지터리의 [로컬 복제본에서 작업](/ko/docs/contribute/new-content/new-content/#fork-the-repo)하는 + 방법을 배워봅니다. - [릴리스된 기능](/docs/contribute/new-content/new-features/)을 문서화 합니다. -- [SIG Docs](/ko/docs/contribute/participating/)에 참여하고, [멤버 또는 검토자](/ko/docs/contribute/participating/#역할과-책임)가 되어봅니다. +- [SIG Docs](/ko/docs/contribute/participate/)에 참여하고, + [멤버 또는 검토자](/ko/docs/contribute/participate/roles-and-responsibilities/)가 되어봅니다. + - [현지화](/ko/docs/contribute/localization_ko/)를 시작하거나 도와줍니다. ## SIG Docs에 참여 -[SIG Docs](/ko/docs/contribute/participating/)는 쿠버네티스 문서와 웹 사이트를 게시하고 관리하는 기여자 그룹입니다. SIG Docs에 참여하는 것은 쿠버네티스 기여자(기능 개발 및 다른 여러가지)가 쿠버네티스 프로젝트에 가장 큰 영향을 미칠 수 있는 좋은 방법입니다. +[SIG Docs](/ko/docs/contribute/participate/)는 쿠버네티스 문서와 웹 사이트를 게시하고 +관리하는 기여자 그룹입니다. SIG Docs에 참여하는 것은 +쿠버네티스 기여자(기능 개발 및 다른 여러가지)가 쿠버네티스 프로젝트에 가장 큰 영향을 +미칠 수 있는 좋은 방법입니다. SIG Docs는 여러가지 방법으로 의견을 나누고 있습니다. -- [쿠버네티스 슬랙 인스턴스에서 `#sig-docs` 에 가입](http://slack.k8s.io/)을 하고, +- [쿠버네티스 슬랙 인스턴스에서 `#sig-docs` 에 가입](https://slack.k8s.io/)하고, 자신을 소개하세요! - 더 광범위한 토론이 이루어지고 공식적인 결정이 기록이 되는 [`kubernetes-sig-docs` 메일링 리스트에 가입](https://groups.google.com/forum/#!forum/kubernetes-sig-docs) 하세요. diff --git a/content/ko/docs/contribute/advanced.md b/content/ko/docs/contribute/advanced.md index 55661a6734..21337a785e 100644 --- a/content/ko/docs/contribute/advanced.md +++ b/content/ko/docs/contribute/advanced.md @@ -19,7 +19,8 @@ weight: 98 ## 개선 제안 -SIG Docs [멤버](/ko/docs/contribute/participating/#멤버)는 개선을 제안할 수 있다. +SIG Docs [멤버](/ko/docs/contribute/participate/roles-and-responsibilities/#멤버)는 +개선을 제안할 수 있다. 한 동안 쿠버네티스 문서에 기여한 후에, [스타일 가이드](/docs/contribute/style/style-guide/), @@ -42,12 +43,12 @@ website 스타일, 풀 리퀘스트 리뷰와 병합 ## 쿠버네티스 릴리스를 위한 문서 조정 -SIG Docs [승인자](/ko/docs/contribute/participating/#승인자)는 쿠버네티스 -릴리스에 대한 문서를 조정할 수 있다. +SIG Docs [승인자](/ko/docs/contribute/participate/roles-and-responsibilities/#승인자)는 +쿠버네티스 릴리스에 대한 문서를 조정할 수 있다. 각 쿠버네티스 릴리스는 sig-release SIG(Special Interest Group)에 참여하는 사람들의 팀에 의해 조정된다. 특정 릴리스에 대한 릴리스 팀의 다른 구성원에는 -전체 릴리스 리드와 sig-pm, sig-testing 및 기타 담당자가 +전체 릴리스 리드와 sig-testing 및 기타 담당자가 포함된다. 쿠버네티스 릴리스 프로세스에 대한 자세한 내용은 [https://github.com/kubernetes/sig-release](https://github.com/kubernetes/sig-release)를 참고한다. @@ -73,8 +74,8 @@ SIG Docs [승인자](/ko/docs/contribute/participating/#승인자)는 쿠버네 ## 새로운 기여자 홍보대사로 봉사 -SIG Docs [승인자](/ko/docs/contribute/participating/#승인자)는 새로운 기여자 -홍보대사로 활동할 수 있다. +SIG Docs [승인자](/ko/docs/contribute/participate/roles-and-responsibilities/#승인자)는 +새로운 기여자 홍보대사로 활동할 수 있다. 새로운 기여자 홍보대사는 SIG-Docs에 기여한 새 기여자를 환영하고, 새 기여자에게 PR을 제안하고, 첫 몇 번의 PR 제출을 통해 @@ -92,12 +93,12 @@ SIG Docs [승인자](/ko/docs/contribute/participating/#승인자)는 새로운 ## 새로운 기여자 후원 -SIG Docs [리뷰어](/ko/docs/contribute/participating/#리뷰어)는 새로운 기여자를 -후원할 수 있다. +SIG Docs [리뷰어](/ko/docs/contribute/participate/roles-and-responsibilities/#리뷰어)는 +새로운 기여자를 후원할 수 있다. 새로운 기여자가 하나 이상의 쿠버네티스 리포지터리에 5개의 실질적인 풀 리퀘스트를 성공적으로 제출한 후에는 -쿠버네티스 조직의 [멤버십](/ko/docs/contribute/participating#멤버)을 +쿠버네티스 조직의 [멤버십](/ko/docs/contribute/participate/roles-and-responsibilities/#멤버)을 신청할 수 있다. 기여자의 멤버십은 이미 리뷰어인 두 명의 스폰서가 후원해야 한다. @@ -111,7 +112,8 @@ SIG Docs [리뷰어](/ko/docs/contribute/participating/#리뷰어)는 새로운 ## SIG 공동 의장으로 봉사 -SIG Docs [승인자](/ko/docs/contribute/participating/#승인자)는 SIG Docs의 공동 의장 역할을 할 수 있다. +SIG Docs [승인자](/ko/docs/contribute/participate/roles-and-responsibilities/#승인자)는 +SIG Docs의 공동 의장 역할을 할 수 있다. ### 전제 조건 @@ -120,7 +122,12 @@ SIG Docs [승인자](/ko/docs/contribute/participating/#승인자)는 SIG Docs - 6개월 이상 SIG Docs 승인자로 활동한다. - [쿠버네티스 문서 릴리스 주도](/ko/docs/contribute/advanced/#쿠버네티스-릴리스를-위한-문서-조정) 또는 두 개의 릴리스에서 섀도잉을 수행한다. - SIG Docs 워크플로와 툴링을 이해한다(git, Hugo, 현지화, 블로그 하위 프로젝트). -- [k/org의 팀](https://github.com/kubernetes/org/blob/master/config/kubernetes/sig-docs/teams.yaml), [k/community의 프로세스](https://github.com/kubernetes/community/tree/master/sig-docs), [k/test-infra](https://github.com/kubernetes/test-infra/)의 플러그인 및 [SIG 아키텍처](https://github.com/kubernetes/community/tree/master/sig-architecture)의 역할을 포함하여 다른 쿠버네티스 SIG와 리포지터리가 SIG Docs 워크플로에 미치는 영향을 이해한다. +- [k/org의 팀](https://github.com/kubernetes/org/blob/master/config/kubernetes/sig-docs/teams.yaml), + [k/community의 프로세스](https://github.com/kubernetes/community/tree/master/sig-docs), + [k/test-infra](https://github.com/kubernetes/test-infra/)의 플러그인 및 + [SIG 아키텍처](https://github.com/kubernetes/community/tree/master/sig-architecture)의 + 역할을 포함하여 다른 쿠버네티스 SIG와 리포지터리가 SIG Docs 워크플로에 미치는 + 영향을 이해한다. - 최소 6개월 동안 일주일에 5시간 이상(대부분 더)을 역할에 책임진다. ### 책임 diff --git a/content/ko/docs/contribute/localization_ko.md b/content/ko/docs/contribute/localization_ko.md index f6e0ae13b7..59cde62dea 100644 --- a/content/ko/docs/contribute/localization_ko.md +++ b/content/ko/docs/contribute/localization_ko.md @@ -187,7 +187,7 @@ API 오브젝트의 필드 이름, 파일 이름, 경로와 같은 내용은 독 ### 기능 게이트(feature gate) 한글화 방침 -쿠버네티스의 [기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/)를 +쿠버네티스의 [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 의미하는 용어는 한글화하지 않고 원문 형태를 유지한다. 기능 게이트의 예시는 다음과 같다. @@ -198,7 +198,7 @@ API 오브젝트의 필드 이름, 파일 이름, 경로와 같은 내용은 독 - ... 전체 기능 게이트 목록은 -[여기](/docs/reference/command-line-tools-reference/feature-gates/#feature-gates)를 참고한다. +[여기](/ko/docs/reference/command-line-tools-reference/feature-gates/#feature-gates)를 참고한다. {{% note %}} 단, 해당 원칙에는 예외가 있을 수 있으며, 이 경우에는 가능한 diff --git a/content/ko/docs/contribute/new-content/open-a-pr.md b/content/ko/docs/contribute/new-content/open-a-pr.md index 82c72e2ce8..516c22bfea 100644 --- a/content/ko/docs/contribute/new-content/open-a-pr.md +++ b/content/ko/docs/contribute/new-content/open-a-pr.md @@ -1,6 +1,5 @@ --- title: 풀 리퀘스트 열기 -slug: new-content content_type: concept weight: 10 card: diff --git a/content/ko/docs/contribute/new-content/overview.md b/content/ko/docs/contribute/new-content/overview.md index f86bbb841f..00dc7e0251 100644 --- a/content/ko/docs/contribute/new-content/overview.md +++ b/content/ko/docs/contribute/new-content/overview.md @@ -20,8 +20,12 @@ weight: 5 - 마크다운(Markdown)으로 쿠버네티스 문서를 작성하고 [Hugo](https://gohugo.io/)를 사용하여 쿠버네티스 사이트를 구축한다. - 소스는 [GitHub](https://github.com/kubernetes/website)에 있다. 쿠버네티스 문서는 `/content/ko/docs/` 에서 찾을 수 있다. 일부 참조 문서는 `update-imported-docs/` 디렉터리의 스크립트에서 자동으로 생성된다. - [페이지 템플릿](/docs/contribute/style/page-content-types/)은 Hugo에서 문서 콘텐츠의 프리젠테이션을 제어한다. -- 표준 Hugo 단축코드(shortcode) 이외에도 설명서에서 여러 [사용자 정의 Hugo 단축코드](/docs/contribute/style/hugo-shortcodes/)를 사용하여 콘텐츠 표시를 제어한다. -- 문서 소스는 `/content/` 에서 여러 언어로 제공된다. 각 언어는 [ISO 639-1 표준](https://www.loc.gov/standards/iso639-2/php/code_list.php)에 의해 결정된 2문자 코드가 있는 자체 폴더가 있다. 예를 들어, 한글 문서의 소스는 `/content/ko/docs/` 에 저장된다. +- 표준 Hugo 단축코드(shortcode) 이외에도 설명서에서 여러 + [사용자 정의 Hugo 단축코드](/docs/contribute/style/hugo-shortcodes/)를 사용하여 콘텐츠 표시를 제어한다. +- 문서 소스는 `/content/` 에서 여러 언어로 제공된다. 각 + 언어는 [ISO 639-1 표준](https://www.loc.gov/standards/iso639-2/php/code_list.php)에 + 의해 결정된 2문자 코드가 있는 자체 폴더가 있다. 예를 들어, + 한글 문서의 소스는 `/content/ko/docs/` 에 저장된다. - 여러 언어로 문서화에 기여하거나 새로운 번역을 시작하는 방법에 대한 자세한 내용은 [현지화](/ko/docs/contribute/localization_ko/)를 참고한다. ## 시작하기 전에 {#before-you-begin} diff --git a/content/ko/docs/contribute/participate/_index.md b/content/ko/docs/contribute/participate/_index.md index 610815e65b..f66c7f952b 100644 --- a/content/ko/docs/contribute/participate/_index.md +++ b/content/ko/docs/contribute/participate/_index.md @@ -20,7 +20,9 @@ SIG Docs는 모든 컨트리뷰터의 콘텐츠와 리뷰를 환영한다. 누구나 풀 리퀘스트(PR)를 요청할 수 있고, 누구나 콘텐츠에 대해 이슈를 등록하거나 진행 중인 풀 리퀘스트에 코멘트를 등록할 수 있다. -[멤버](/ko/docs/contribute/participating/roles-and-responsibilities/#멤버), [리뷰어](/ko/docs/contribute/participating/roles-and-responsibilities/#리뷰어), 또는 [승인자](/ko/docs/contribute/participating/roles-and-responsibilities/#승인자)가 될 수 있다. +[멤버](/ko/docs/contribute/participate/roles-and-responsibilities/#멤버), +[리뷰어](/ko/docs/contribute/participate/roles-and-responsibilities/#리뷰어), 또는 +[승인자](/ko/docs/contribute/participate/roles-and-responsibilities/#승인자)가 될 수 있다. 이런 역할은 변경을 승인하고 커밋할 수 있도록 보다 많은 접근 권한과 이에 상응하는 책임이 수반된다. 쿠버네티스 커뮤니티 내에서 멤버십이 운영되는 방식에 대한 보다 많은 정보를 확인하려면 [커뮤니티 멤버십](https://github.com/kubernetes/community/blob/master/community-membership.md) @@ -30,8 +32,6 @@ SIG Docs는 모든 컨트리뷰터의 콘텐츠와 리뷰를 환영한다. 문서를 관리하는 책임을 가지는 SIG Docs에서, 이런 체계가 작동하는 특유의 방식에 대한 윤곽을 잡아보겠다. - - ## SIG Docs 의장 @@ -58,7 +58,8 @@ GitHub의 SIG Docs [팀]에는 두 분류가 있다. 그룹의 전원과 의사소통하기 위해서 각각 GitHub 코멘트에서 그룹의 `@name`으로 참조할 수 있다. -가끔은 Prow와 GitHub 팀은 정확히 일치하지 않고 중복된다. 이슈, 풀 리퀘스트를 할당하고, PR 승인을 지원하기 위해서 +가끔은 Prow와 GitHub 팀은 정확히 일치하지 않고 중복된다. +이슈, 풀 리퀘스트를 할당하고, PR 승인을 지원하기 위해서 자동화 시스템이 `OWNERS` 파일의 정보를 활용한다. ### OWNERS 파일과 전문(front-matter) diff --git a/content/ko/docs/contribute/participate/roles-and-responsibilties.md b/content/ko/docs/contribute/participate/roles-and-responsibilties.md index e5dbfb85ff..252d07b332 100644 --- a/content/ko/docs/contribute/participate/roles-and-responsibilties.md +++ b/content/ko/docs/contribute/participate/roles-and-responsibilties.md @@ -6,7 +6,8 @@ weight: 10 -누구나 쿠버네티스에 기여할 수 있다. SIG Docs에 대한 기여가 커짐에 따라, 커뮤니티의 다양한 멤버십을 신청할 수 있다. +누구나 쿠버네티스에 기여할 수 있다. SIG Docs에 대한 기여가 커짐에 따라, +커뮤니티의 다양한 멤버십을 신청할 수 있다. 이러한 역할을 통해 커뮤니티 내에서 더 많은 책임을 질 수 있다. 각 역할마다 많은 시간과 노력이 필요하다. 역할은 다음과 같다. @@ -23,10 +24,13 @@ GitHub 계정을 가진 누구나 쿠버네티스에 기여할 수 있다. SIG D 모든 사람은 다음의 작업을 할 수 있다. -- [`kubernetes/website`](https://github.com/kubernetes/website)를 포함한 모든 [쿠버네티스] 리포지터리에서 이슈를 올린다. +- [`kubernetes/website`](https://github.com/kubernetes/website)를 포함한 모든 + [쿠버네티스](https://github.com/kubernetes/) 리포지터리에서 + 이슈를 올린다. - 풀 리퀘스트에 대해 구속력 없는 피드백을 제공한다. - 현지화에 기여한다. -- [슬랙](http://slack.k8s.io/) 또는 [SIG docs 메일링 리스트](https://groups.google.com/forum/#!forum/kubernetes-sig-docs)에 개선을 제안한다. +- [슬랙](http://slack.k8s.io/) 또는 + [SIG docs 메일링 리스트](https://groups.google.com/forum/#!forum/kubernetes-sig-docs)에 개선을 제안한다. [CLA에 서명](/ko/docs/contribute/new-content/overview/#sign-the-cla) 후에 누구나 다음을 할 수 있다. @@ -37,16 +41,19 @@ GitHub 계정을 가진 누구나 쿠버네티스에 기여할 수 있다. SIG D ## 멤버 -멤버는 `kubernetes/website` 에 여러 개의 풀 리퀘스트를 제출한 사람이다. 멤버는 [쿠버네티스 GitHub 조직](https://github.com/kubernetes)의 회원이다. +멤버는 `kubernetes/website` 에 여러 개의 풀 리퀘스트를 제출한 +사람이다. 멤버는 +[쿠버네티스 GitHub 조직](https://github.com/kubernetes)의 회원이다. 멤버는 다음의 작업을 할 수 있다. - [모든 사람](#모든-사람)에 나열된 모든 것을 한다. - 풀 리퀘스트에 `/lgtm` 코멘트를 사용하여 LGTM(looks good to me) 레이블을 추가한다. - {{< note >}} - `/lgtm` 사용은 자동화를 트리거한다. 만약 구속력 없는 승인을 제공하려면, 단순히 "LGTM" 코멘트를 남기는 것도 좋다! - {{< /note >}} + {{< note >}} + `/lgtm` 사용은 자동화를 트리거한다. 만약 구속력 없는 승인을 제공하려면, 단순히 "LGTM" 코멘트를 남기는 것도 좋다! + {{< /note >}} + - `/hold` 코멘트를 사용하여 풀 리퀘스트에 대한 병합을 차단한다. - `/assign` 코멘트를 사용하여 풀 리퀘스트에 리뷰어를 지정한다. - 풀 리퀘스트에 구속력 없는 리뷰를 제공한다. @@ -55,46 +62,56 @@ GitHub 계정을 가진 누구나 쿠버네티스에 기여할 수 있다. SIG D ### 멤버 되기 -최소 5개의 실질적인 풀 리퀘스트를 제출하고 다른 [요구 사항](https://github.com/kubernetes/community/blob/master/community-membership.md#member)을 충족시킨 후, 다음의 단계를 따른다. +최소 5개의 실질적인 풀 리퀘스트를 제출하고 다른 +[요구 사항](https://github.com/kubernetes/community/blob/master/community-membership.md#member)을 충족시킨 후, 다음의 단계를 따른다. -1. 멤버십을 [후원](/docs/contribute/advanced#sponsor-a-new-contributor)해 줄 두 명의 [리뷰어](#리뷰어) 또는 [승인자](#승인자)를 찾는다. +1. 멤버십을 [후원](/docs/contribute/advanced#sponsor-a-new-contributor)해줄 두 명의 + [리뷰어](#리뷰어) 또는 [승인자](#승인자)를 + 찾는다. - [슬랙의 #sig-docs 채널](https://kubernetes.slack.com) 또는 - [SIG Docs 메일링 리스트](https://groups.google.com/forum/#!forum/kubernetes-sig-docs)에서 후원을 요청한다. + [슬랙의 #sig-docs 채널](https://kubernetes.slack.com) 또는 + [SIG Docs 메일링 리스트](https://groups.google.com/forum/#!forum/kubernetes-sig-docs)에서 후원을 요청한다. - {{< note >}} - SIG Docs 멤버 개인에게 직접 email을 보내거나 - 슬랙 다이렉트 메시지를 보내지 않는다. 반드시 지원서를 제출하기 전에 후원을 요청해야 한다. - {{< /note >}} + {{< note >}} + SIG Docs 멤버 개인에게 직접 email을 보내거나 + 슬랙 다이렉트 메시지를 보내지 않는다. 반드시 지원서를 제출하기 전에 후원을 요청해야 한다. + {{< /note >}} -2. [`kubernetes/org`](https://github.com/kubernetes/org/) 리포지터리에 GitHub 이슈를 등록한다. **Organization Membership Request** 이슈 템플릿을 사용한다. +1. [`kubernetes/org`](https://github.com/kubernetes/org/) 리포지터리에 + GitHub 이슈를 등록한다. + **Organization Membership Request** 이슈 템플릿을 사용한다. -3. 후원자에게 GitHub 이슈를 알린다. 다음 중 하나를 수행할 수 있다. - - 이슈에서 후원자의 GitHub 사용자 이름을 코멘트로 추가한다. (`@`) - - 슬랙 또는 이메일을 사용해 이슈 링크를 후원자에게 보낸다. +1. 후원자에게 GitHub 이슈를 알린다. 다음 중 하나를 수행할 수 있다. + - 이슈에서 후원자의 GitHub 사용자 이름을 코멘트로 추가한다. (`@`) + - 슬랙 또는 이메일을 사용해 이슈 링크를 후원자에게 보낸다. - 후원자는 `+1` 투표로 여러분의 요청을 승인할 것이다. 후원자가 요청을 승인하면, 쿠버네티스 GitHub 관리자가 여러분을 멤버로 추가한다. 축하한다! + 후원자는 `+1` 투표로 여러분의 요청을 승인할 것이다. 후원자가 요청을 승인하면, + 쿠버네티스 GitHub 관리자가 여러분을 멤버로 추가한다. + 축하한다! - 만약 멤버십이 수락되지 않으면 피드백을 받게 될 것이다. 피드백의 내용을 해결한 후, 다시 지원하자. + 만약 멤버십이 수락되지 않으면 피드백을 받게 될 것이다. 피드백의 내용을 해결한 후, 다시 지원하자. -4. 여러분의 이메일 계정으로 수신된 쿠버네티스 GitHub 조직으로의 초대를 수락한다. +1. 여러분의 이메일 계정으로 수신된 쿠버네티스 GitHub 조직으로의 초대를 수락한다. - {{< note >}} - GitHub은 초대를 여러분 계정의 기본 이메일 주소로 보낸다. - {{< /note >}} + {{< note >}} + GitHub은 초대를 여러분 계정의 기본 이메일 주소로 보낸다. + {{< /note >}} ## 리뷰어 -리뷰어는 열린 풀 리퀘스트를 리뷰할 책임이 있다. 멤버 피드백과는 달리, 여러분은 리뷰어의 피드백을 반드시 해결해야 한다. 리뷰어는 [@kubernetes/sig-docs-{language}-reviews](https://github.com/orgs/kubernetes/teams?query=sig-docs) GitHub 팀의 멤버이다. +리뷰어는 열린 풀 리퀘스트를 리뷰할 책임이 있다. 멤버 피드백과는 달리, +여러분은 리뷰어의 피드백을 반드시 해결해야 한다. 리뷰어는 +[@kubernetes/sig-docs-{language}-reviews](https://github.com/orgs/kubernetes/teams?query=sig-docs) +GitHub 팀의 멤버이다. 리뷰어는 다음의 작업을 수행할 수 있다. - [모든 사람](#모든-사람)과 [멤버](#멤버)에 나열된 모든 것을 수행한다. - 풀 리퀘스트 리뷰와 구속력 있는 피드백을 제공한다. - {{< note >}} - 구속력 없는 피드백을 제공하려면, 코멘트에 "선택 사항: "과 같은 문구를 접두어로 남긴다. - {{< /note >}} + {{< note >}} + 구속력 없는 피드백을 제공하려면, 코멘트에 "선택 사항: "과 같은 문구를 접두어로 남긴다. + {{< /note >}} - 코드에서 사용자 화면 문자열 편집 - 코드 코멘트 개선 @@ -107,37 +124,45 @@ GitHub 계정을 가진 누구나 쿠버네티스에 기여할 수 있다. SIG D [@_github_handle]` 코멘트를 남겨 특정 사람에게 리뷰를 요청할 수 있다. -지정된 리뷰어가 PR에 코멘트를 남기지 않는다면, 다른 리뷰어가 개입할 수 있다. 필요에 따라 기술 리뷰어를 지정할 수도 있다. +지정된 리뷰어가 PR에 코멘트를 남기지 않는다면, 다른 리뷰어가 개입할 수 +있다. 필요에 따라 기술 리뷰어를 지정할 수도 있다. ### `/lgtm` 사용하기 -LGTM은 "Looks good to me"의 약자이며 풀 리퀘스트가 기술적으로 정확하고 병합할 준비가 되었음을 나타낸다. 모든 PR은 리뷰어의 `/lgtm` 코멘트가 필요하고 병합을 위해 승인자의 `/approve` 코멘트가 필요하다. +LGTM은 "Looks good to me"의 약자이며 풀 리퀘스트가 기술적으로 +정확하고 병합할 준비가 되었음을 나타낸다. 모든 PR은 리뷰어의 `/lgtm` 코멘트가 +필요하고 병합을 위해 승인자의 `/approve` 코멘트가 필요하다. 리뷰어의 `/lgtm` 코멘트는 구속력 있고 자동화 시스템이 `lgtm` 레이블을 추가하도록 트리거한다. ### 리뷰어 되기 [요건](https://github.com/kubernetes/community/blob/master/community-membership.md#reviewer)을 -충족하면, SIG Docs 리뷰어가 될 수 있다. 다른 SIG의 리뷰어는 SIG Docs의 리뷰어 자격에 반드시 별도로 지원해야 한다. +충족하면, SIG Docs 리뷰어가 될 수 있다. 다른 SIG의 리뷰어는 SIG Docs의 리뷰어 자격에 +반드시 별도로 지원해야 한다. 지원하려면, 다음을 수행한다. 1. `kubernetes/website` 리포지터리 내 -[OWNERS_ALIASES](https://github.com/kubernetes/website/blob/master/OWNERS) 파일의 섹션에 -여러분의 GitHub 사용자 이름을 추가하는 풀 리퀘스트를 연다. + [OWNERS_ALIASES](https://github.com/kubernetes/website/blob/master/OWNERS) 파일의 섹션에 + 여러분의 GitHub 사용자 이름을 추가하는 풀 리퀘스트를 연다. {{< note >}} 자신을 추가할 위치가 확실하지 않으면, `sig-docs-ko-reviews` 에 추가한다. {{< /note >}} -2. PR을 하나 이상의 SIG-Docs 승인자(`sig-docs-{language}-owners` 에 나열된 사용자 이름)에게 지정한다. +1. PR을 하나 이상의 SIG-Docs 승인자(`sig-docs-{language}-owners` 에 + 나열된 사용자 이름)에게 지정한다. -승인되면, SIG Docs 리더가 적당한 GitHub 팀에 여러분을 추가한다. 일단 추가되면, [K8s-ci-robot](https://github.com/kubernetes/test-infra/tree/master/prow#bots-home)이 새로운 풀 리퀘스트에서 리뷰어로 여러분을 할당하고 제안한다. +승인되면, SIG Docs 리더가 적당한 GitHub 팀에 여러분을 추가한다. 일단 추가되면, +[K8s-ci-robot](https://github.com/kubernetes/test-infra/tree/master/prow#bots-home)이 +새로운 풀 리퀘스트에서 리뷰어로 여러분을 할당하고 제안한다. ## 승인자 승인자는 병합하기 위해 풀 리퀘스트를 리뷰하고 승인한다. 승인자는 -[@kubernetes/sig-docs-{language}-owners](https://github.com/orgs/kubernetes/teams/?query=sig-docs) GitHub 팀의 멤버이다. +[@kubernetes/sig-docs-{language}-owners](https://github.com/orgs/kubernetes/teams/?query=sig-docs) +GitHub 팀의 멤버이다. 승인자는 다음의 작업을 할 수 있다. @@ -147,22 +172,27 @@ LGTM은 "Looks good to me"의 약자이며 풀 리퀘스트가 기술적으로 - 문서 테스트 개선을 제안한다. - 쿠버네티스 웹사이트 또는 다른 도구 개선을 제안한다. -PR에 이미 `/lgtm` 이 있거나, 승인자도 `/lgtm` 코멘트를 남긴다면, PR은 자동으로 병합된다. SIG Docs 승인자는 추가적인 기술 리뷰가 필요치 않는 변경에 대해서만 `/lgtm` 을 남겨야 한다. +PR에 이미 `/lgtm` 이 있거나, 승인자도 `/lgtm` 코멘트를 남긴다면, +PR은 자동으로 병합된다. SIG Docs 승인자는 추가적인 기술 리뷰가 필요치 않는 변경에 대해서만 +`/lgtm` 을 남겨야 한다. ### 풀 리퀘스트 승인 -승인자와 SIG Docs 리더는 website 리포지터리로 풀 리퀘스트를 병합할 수 있는 유일한 사람들이다. 이것은 특정한 책임이 따른다. +승인자와 SIG Docs 리더는 website 리포지터리로 풀 리퀘스트를 병합할 수 있는 +유일한 사람들이다. 이것은 특정한 책임이 따른다. - 승인자는 PR들을 리포지터리에 병합하는 `/approve` 명령을 사용할 수 있다. - {{< warning >}} - 부주의한 머지로 인해 사이트를 파괴할 수 있으므로, 머지할 때에 그 의미를 확인해야 한다. - {{< /warning >}} + {{< warning >}} + 부주의한 머지로 인해 사이트를 파괴할 수 있으므로, 머지할 때에 그 의미를 확인해야 한다. + {{< /warning >}} -- 제안된 변경이 [컨트리뷰션 가이드 라인](/docs/contribute/style/content-guide/#contributing-content)에 적합한지 확인한다. +- 제안된 변경이 + [컨트리뷰션 가이드 라인](/docs/contribute/style/content-guide/#contributing-content)에 적합한지 확인한다. - 질문이 생기거나 확실하지 않다면 자유롭게 추가 리뷰를 요청한다. + 질문이 생기거나 확실하지 않다면 자유롭게 + 추가 리뷰를 요청한다. - PR을 `/approve` 하기 전에 Netlify 테스트 결과를 검토한다. @@ -170,17 +200,24 @@ PR에 이미 `/lgtm` 이 있거나, 승인자도 `/lgtm` 코멘트를 남긴다 - 승인 전에 PR에 대한 Netlify 프리뷰 페이지를 방문하여, 제대로 보이는지 확인한다. -- 주간 로테이션을 위해 [PR Wrangler 로테이션 스케줄](https://github.com/kubernetes/website/wiki/PR-Wranglers)에 참여한다. SIG Docs는 모든 승인자들이 이 로테이션에 참여할 -것으로 기대한다. 자세한 내용은 [PR 랭글러(PR wrangler)](/ko/docs/contribute/participating/pr-wranglers/)를 -참고한다. +- 주간 로테이션을 위해 + [PR Wrangler 로테이션 스케줄](https://github.com/kubernetes/website/wiki/PR-Wranglers)에 + 참여한다. SIG Docs는 모든 승인자들이 이 로테이션에 참여할 것으로 기대한다. 자세한 내용은 + [PR 랭글러(PR wrangler)](/ko/docs/contribute/participating/pr-wranglers/)를 + 참고한다. ## 승인자 되기 -[요구 사항](https://github.com/kubernetes/community/blob/master/community-membership.md#approver)을 충족하면 SIG Docs 승인자가 될 수 있다. 다른 SIG의 승인자는 SIG Docs의 승인자 자격에 대해 별도로 신청해야 한다. +[요구 사항](https://github.com/kubernetes/community/blob/master/community-membership.md#approver)을 +충족하면 SIG Docs 승인자가 될 수 있다. +다른 SIG의 승인자는 SIG Docs의 승인자 자격에 대해 +별도로 신청해야 한다. 지원하려면 다음을 수행한다. -1. `kubernetes/website` 리포지터리 내 [OWNERS_ALIASES](https://github.com/kubernetes/website/blob/master/OWNERS) 파일의 섹션에 자신을 추가하는 풀 리퀘스트를 연다. +1. `kubernetes/website` 리포지터리 내 + [OWNERS_ALIASES](https://github.com/kubernetes/website/blob/master/OWNERS) + 파일의 섹션에 자신을 추가하는 풀 리퀘스트를 연다. {{< note >}} 자신을 추가할 위치가 확실하지 않으면, `sig-docs-ko-owners` 에 추가한다. @@ -188,7 +225,9 @@ PR에 이미 `/lgtm` 이 있거나, 승인자도 `/lgtm` 코멘트를 남긴다 2. PR에 한 명 이상의 현재 SIG Docs 승인자를 지정한다. -승인되면, SIG Docs 리더가 적당한 GitHub 팀에 여러분을 추가한다. 일단 추가되면, [@k8s-ci-robot](https://github.com/kubernetes/test-infra/tree/master/prow#bots-home)이 새로운 풀 리퀘스트에서 승인자로 여러분을 할당하고 제안한다. +승인되면, SIG Docs 리더가 적당한 GitHub 팀에 여러분을 추가한다. 일단 추가되면, +[@k8s-ci-robot](https://github.com/kubernetes/test-infra/tree/master/prow#bots-home)이 +새로운 풀 리퀘스트에서 승인자로 여러분을 할당하고 제안한다. ## {{% heading "whatsnext" %}} diff --git a/content/ko/docs/contribute/review/for-approvers.md b/content/ko/docs/contribute/review/for-approvers.md index 9b6c01d739..2e76e101be 100644 --- a/content/ko/docs/contribute/review/for-approvers.md +++ b/content/ko/docs/contribute/review/for-approvers.md @@ -8,7 +8,9 @@ weight: 20 -SIG Docs [리뷰어](/ko/docs/contribute/participating/#리뷰어)와 [승인자](/ko/docs/contribute/participating/#승인자)는 변경 사항을 리뷰할 때 몇 가지 추가 작업을 수행한다. +SIG Docs [리뷰어](/ko/docs/contribute/participate/roles-and-responsibilities/#리뷰어)와 +[승인자](/ko/docs/contribute/participate/roles-and-responsibilities/#승인자)는 변경 사항을 +리뷰할 때 몇 가지 추가 작업을 수행한다. 매주 특정 문서 승인자 역할의 지원자가 풀 리퀘스트를 심사하고 리뷰한다. 이 @@ -19,9 +21,6 @@ SIG Docs [리뷰어](/ko/docs/contribute/participating/#리뷰어)와 [승인자 로테이션 외에도, 봇은 영향을 받는 파일의 소유자를 기반으로 PR에 대한 리뷰어와 승인자를 할당한다. - - - ## PR 리뷰 @@ -201,9 +200,9 @@ SIG Docs가 처리 방법을 문서화할 정도로 다음과 같은 유형의 ```none 이 이슈는 지원 요청과 비슷하지만 문서 관련 이슈와는 관련이 없는 것 같습니다. -[쿠버네티스 슬랙](http://slack.k8s.io/)의 +[쿠버네티스 슬랙](https://slack.k8s.io/)의 `#kubernetes-users` 채널에서 질문을 하시기 바랍니다. 또한, -[Stack Overflow](http://stackoverflow.com/questions/tagged/kubernetes)와 +[Stack Overflow](https://stackoverflow.com/questions/tagged/kubernetes)와 같은 리소스를 검색하여 유사한 질문에 대한 답변을 얻을 수도 있습니다. diff --git a/content/ko/docs/contribute/review/reviewing-prs.md b/content/ko/docs/contribute/review/reviewing-prs.md index ca3d38a752..f0a164de00 100644 --- a/content/ko/docs/contribute/review/reviewing-prs.md +++ b/content/ko/docs/contribute/review/reviewing-prs.md @@ -16,10 +16,9 @@ weight: 10 리뷰하기 전에, 다음을 수행하는 것이 좋다. - 적합한 코멘트를 남길 수 있도록 [콘텐츠 가이드](/docs/contribute/style/content-guide/)와 -[스타일 가이드](/docs/contribute/style/style-guide/)를 읽는다. -- 쿠버네티스 문서화 커뮤니티의 다양한 [역할과 책임](/ko/docs/contribute/participating/#역할과-책임)을 이해한다. - - + [스타일 가이드](/docs/contribute/style/style-guide/)를 읽는다. +- 쿠버네티스 문서화 커뮤니티의 다양한 + [역할과 책임](/ko/docs/contribute/participating/#역할과-책임)을 이해한다. diff --git a/content/ko/docs/contribute/style/write-new-topic.md b/content/ko/docs/contribute/style/write-new-topic.md index 9bff308df1..7441882615 100644 --- a/content/ko/docs/contribute/style/write-new-topic.md +++ b/content/ko/docs/contribute/style/write-new-topic.md @@ -10,7 +10,7 @@ weight: 20 ## {{% heading "prerequisites" %}} -[기여 시작하기](/docs/contribute/start/)에 설명된 대로 쿠버네티스 +[PR 열기](/ko/docs/contribute/new-content/open-a-pr/)에 설명된 대로 쿠버네티스 문서 저장소의 포크(fork)를 생성하자. diff --git a/content/ko/docs/reference/issues-security/security.md b/content/ko/docs/reference/issues-security/security.md index 986af01cf1..6db604665e 100644 --- a/content/ko/docs/reference/issues-security/security.md +++ b/content/ko/docs/reference/issues-security/security.md @@ -13,7 +13,7 @@ weight: 20 보안 및 주요 API 공지에 대한 이메일을 위해 [kubernetes-security-announce](https://groups.google.com/forum/#!forum/kubernetes-security-announce)) 그룹에 가입하세요. -[이 링크](https://groups.google.com/forum/feed/kubernetes-announce/msgs/rss_v2_0.xml?num=50)를 사용하여 RSS 피드를 구독할 수 있다. +[이 링크](https://groups.google.com/forum/feed/kubernetes-security-announce/msgs/rss_v2_0.xml?num=50)를 사용하여 RSS 피드를 구독할 수 있다. ## 취약점 보고 diff --git a/content/ko/docs/reference/kubectl/cheatsheet.md b/content/ko/docs/reference/kubectl/cheatsheet.md index 42d761ee93..3446c11a06 100644 --- a/content/ko/docs/reference/kubectl/cheatsheet.md +++ b/content/ko/docs/reference/kubectl/cheatsheet.md @@ -162,6 +162,10 @@ kubectl get pv --sort-by=.spec.capacity.storage kubectl get pods --selector=app=cassandra -o \ jsonpath='{.items[*].metadata.labels.version}' +# 예를 들어 'ca.crt'와 같이 점이 있는 키값을 검색한다 +kubectl get configmap myconfig \ + -o jsonpath='{.data.ca\.crt}' + # 모든 워커 노드 조회 (셀렉터를 사용하여 'node-role.kubernetes.io/master' # 으로 명명된 라벨의 결과를 제외) kubectl get node --selector='!node-role.kubernetes.io/master' diff --git a/content/ko/docs/reference/setup-tools/_index.md b/content/ko/docs/reference/setup-tools/_index.md new file mode 100644 index 0000000000..268a280c50 --- /dev/null +++ b/content/ko/docs/reference/setup-tools/_index.md @@ -0,0 +1,6 @@ +--- +title: 설치 도구 레퍼런스 +weight: 50 +toc-hide: true +--- + diff --git a/content/ko/docs/reference/setup-tools/kubeadm/_index.md b/content/ko/docs/reference/setup-tools/kubeadm/_index.md new file mode 100644 index 0000000000..085b1e1ef9 --- /dev/null +++ b/content/ko/docs/reference/setup-tools/kubeadm/_index.md @@ -0,0 +1,6 @@ +--- +title: "Kubeadm" +weight: 10 +toc-hide: true +--- + diff --git a/content/ko/docs/reference/setup-tools/kubeadm/kubeadm.md b/content/ko/docs/reference/setup-tools/kubeadm/kubeadm.md new file mode 100644 index 0000000000..f011459dd6 --- /dev/null +++ b/content/ko/docs/reference/setup-tools/kubeadm/kubeadm.md @@ -0,0 +1,28 @@ +--- +title: kubeadm 개요 +weight: 10 +card: + name: reference + weight: 40 +--- +Kubeadm은 쿠버네티스 클러스터를 "빠른 경로"로 생성하기 위한 모범 사례인 `kubeadm init`과 `kubeadm join`을 제공하기 위해 구성된 도구이다. + +kubeadm은 최소 기능 클러스터(minimum viable cluster)를 시작하고 실행하는 데 필요한 작업을 수행한다. 설계상, 부트스트랩만 다루며, 머신을 프로비저닝하지는 않는다. 마찬가지로, 쿠버네티스 대시보드, 모니터링 솔루션 및 클라우드 별 애드온과 같은 다양한 기능을 갖춘 애드온을 설치하는 것은 범위에 포함되지 않는다. + +대신, kubeadm 위에 있는 더 높은 수준의 맞춤형 도구가 구축될 것으로 예상되며, 모든 배포의 기초로서 kubeadm을 사용하면 적합한 클러스터를 보다 쉽게 만들 수 있다. + +## 설치하는 방법 + +kubeadm을 설치하려면 [설치 가이드](/docs/setup/production-environment/tools/kubeadm/install-kubeadm)를 참조한다. + +## 다음 내용 + +* [kubeadm init](/docs/reference/setup-tools/kubeadm/kubeadm-init): 쿠버네티스 컨트롤 플레인 노드를 부트스트랩 함 +* [kubeadm join](/docs/reference/setup-tools/kubeadm/kubeadm-join): 쿠버네티스 워커 노드를 부트스트랩 후 클러스터에 결합시킴 +* [kubeadm upgrade](/docs/reference/setup-tools/kubeadm/kubeadm-upgrade): 쿠버네티스 클러스터를 최신 버전으로 업그레이드 +* [kubeadm config](/docs/reference/setup-tools/kubeadm/kubeadm-config): kubeadm v1.7.x이하의 버전을 사용하여 클러스터를 초기화한 경우, 클러스터를 설정하여 `kubeadm upgrade`하기 위해 사용 +* [kubeadm token](/docs/reference/setup-tools/kubeadm/kubeadm-token): `kubeadm join`을 위한 토큰 관리 +* [kubeadm reset](/docs/reference/setup-tools/kubeadm/kubeadm-reset): `kubeadm init`나 `kubeadm join`를 의한 호스트에 대해서 변경된 사항을 되돌림 +* [kubeadm version](/docs/reference/setup-tools/kubeadm/kubeadm-version): kubeadm 버전을 출력 +* [kubeadm alpha](/docs/reference/setup-tools/kubeadm/kubeadm-alpha): 커뮤니티의 피드백 수집을 위해서 기능 미리 보기를 제공 + diff --git a/content/ko/docs/setup/best-practices/certificates.md b/content/ko/docs/setup/best-practices/certificates.md index e152e378c5..42b94acf5e 100644 --- a/content/ko/docs/setup/best-practices/certificates.md +++ b/content/ko/docs/setup/best-practices/certificates.md @@ -26,7 +26,7 @@ weight: 40 * API 서버에서 etcd 간의 통신을 위한 클라이언트 인증서 * 컨트롤러 매니저와 API 서버 간의 통신을 위한 클라이언트 인증서/kubeconfig * 스케줄러와 API 서버간 통신을 위한 클라이언트 인증서/kubeconfig -* [front-proxy][proxy]를 위한 클라이언트와 서버 인증서 +* [front-proxy](/docs/tasks/extend-kubernetes/configure-aggregation-layer/)를 위한 클라이언트와 서버 인증서 {{< note >}} `front-proxy` 인증서는 kube-proxy에서 [API 서버 확장](/docs/tasks/extend-kubernetes/setup-extension-api-server/)을 지원할 때만 kube-proxy에서 필요하다. @@ -52,7 +52,7 @@ etcd 역시 클라이언트와 피어 간에 상호 TLS 인증을 구현한다. |------------------------|---------------------------|----------------------------------| | ca.crt,key | kubernetes-ca | 쿠버네티스 일반 CA | | etcd/ca.crt,key | etcd-ca | 모든 etcd 관련 기능을 위해서 | -| front-proxy-ca.crt,key | kubernetes-front-proxy-ca | [front-end proxy][proxy] 위해서 | +| front-proxy-ca.crt,key | kubernetes-front-proxy-ca | [front-end proxy](/docs/tasks/extend-kubernetes/configure-aggregation-layer/) 위해서 | 위의 CA외에도, 서비스 계정 관리를 위한 공개/개인 키 쌍인 `sa.key` 와 `sa.pub` 을 얻는 것이 필요하다. @@ -72,10 +72,10 @@ etcd 역시 클라이언트와 피어 간에 상호 TLS 인증을 구현한다. | kube-apiserver-kubelet-client | kubernetes-ca | system:masters | client | | | front-proxy-client | kubernetes-front-proxy-ca | | client | | -[1]: 클러스터에 접속한 다른 IP 또는 DNS 이름([kubeadm][kubeadm] 이 사용하는 로드 밸런서 안정 IP 또는 DNS 이름, `kubernetes`, `kubernetes.default`, `kubernetes.default.svc`, +[1]: 클러스터에 접속한 다른 IP 또는 DNS 이름([kubeadm](/docs/reference/setup-tools/kubeadm/kubeadm/) 이 사용하는 로드 밸런서 안정 IP 또는 DNS 이름, `kubernetes`, `kubernetes.default`, `kubernetes.default.svc`, `kubernetes.default.svc.cluster`, `kubernetes.default.svc.cluster.local`) -`kind`는 하나 이상의 [x509 키 사용][usage] 종류를 가진다. +`kind`는 하나 이상의 [x509 키 사용](https://godoc.org/k8s.io/api/certificates/v1beta1#KeyUsage) 종류를 가진다. | 종류 | 키 사용 | |--------|---------------------------------------------------------------------------------| @@ -97,7 +97,7 @@ kubeadm 사용자만 해당: ### 인증서 파일 경로 -인증서는 권고하는 파일 경로에 존재해야 한다([kubeadm][kubeadm]에서 사용되는 것처럼). 경로는 위치에 관계없이 주어진 파라미터를 사용하여 지정되야 한다. +인증서는 권고하는 파일 경로에 존재해야 한다([kubeadm](/docs/reference/setup-tools/kubeadm/kubeadm/)에서 사용되는 것처럼). 경로는 위치에 관계없이 주어진 파라미터를 사용하여 지정되야 한다. | 기본 CN | 권고되는 키 파일 경로 | 권고하는 인증서 파일 경로 | 명령어 | 키 파라미터 | 인증서 파라미터 | |------------------------------|------------------------------|-----------------------------|----------------|------------------------------|-------------------------------------------| @@ -158,8 +158,3 @@ KUBECONFIG= kubectl config use-context default-system | controller-manager.conf | kube-controller-manager | 반드시 매니페스트를 `manifests/kube-controller-manager.yaml`에 추가해야한다. | | scheduler.conf | kube-scheduler | 반드시 매니페스트를 `manifests/kube-scheduler.yaml`에 추가해야한다. | -[usage]: https://godoc.org/k8s.io/api/certificates/v1beta1#KeyUsage -[kubeadm]: /docs/reference/setup-tools/kubeadm/kubeadm/ -[proxy]: /docs/tasks/extend-kubernetes/configure-aggregation-layer/ - - diff --git a/content/ko/docs/setup/release/notes.md b/content/ko/docs/setup/release/notes.md index a0cd9168a1..740d468acc 100644 --- a/content/ko/docs/setup/release/notes.md +++ b/content/ko/docs/setup/release/notes.md @@ -62,12 +62,10 @@ card: ## v1.17.0 이후 체인지로그 -릴리스 노트의 전체 체인지로그는 이제 [https://relnotes.k8s.io][1]에서 사용자 정의 가능한 +릴리스 노트의 전체 체인지로그는 이제 [https://relnotes.k8s.io](https://relnotes.k8s.io/?releaseVersions=1.18.0)에서 사용자 정의 가능한 형식으로 호스팅된다. 확인하고 의견을 보내주기 바란다! -[1]: https://relnotes.k8s.io/?releaseVersions=1.18.0 - ## 새로운 소식 (주요 테마) ### 쿠버네티스 토폴로지 매니저가 베타로 전환 - 정렬! diff --git a/content/ko/docs/tasks/access-application-cluster/access-cluster.md b/content/ko/docs/tasks/access-application-cluster/access-cluster.md index c17458a912..c28c51ea16 100644 --- a/content/ko/docs/tasks/access-application-cluster/access-cluster.md +++ b/content/ko/docs/tasks/access-application-cluster/access-cluster.md @@ -15,12 +15,12 @@ content_type: concept ## 처음이라면 kubectl을 사용하여 액세스 -최초로 쿠버네티스 API에 액세스할 때 우리는 +최초로 쿠버네티스 API에 액세스할 때 우리는 쿠버네티스 CLI인 `kubectl`을 사용하는 것을 추천한다. -클러스터에 액세스하려면 클러스터의 위치정보를 알아야 하고 클러스터에 접속하기 위한 -인증정보를 가져야 한다. 일반적으로 이는 당신이 -[Getting started guide](/ko/docs/setup/)를 다 진행했을 때 자동으로 구성되거나, +클러스터에 액세스하려면 클러스터의 위치정보를 알아야 하고 클러스터에 접속하기 위한 +인증정보를 가져야 한다. 일반적으로 이는 당신이 +[Getting started guide](/ko/docs/setup/)를 다 진행했을 때 자동으로 구성되거나, 다른 사람이 클러스터를 구성하고 당신에게 인증정보와 위치정보를 제공할 수도 있다. kubectl이 인지하는 위치정보와 인증정보는 다음 커맨드로 확인한다. @@ -29,13 +29,13 @@ kubectl이 인지하는 위치정보와 인증정보는 다음 커맨드로 확 kubectl config view ``` -많은 [예제들](/ko/docs/reference/kubectl/cheatsheet/)에서 kubectl을 사용하는 것을 소개하고 있으며 +많은 [예제들](/ko/docs/reference/kubectl/cheatsheet/)에서 kubectl을 사용하는 것을 소개하고 있으며 완전한 문서는 [kubectl manual](/docs/user-guide/kubectl-overview)에서 찾아볼 수 있다. ## REST API에 직접 액세스 -kubectl은 apiserver의 위치 파악과 인증을 처리한다. -만약 당신이 curl, wget 또는 웹브라우저와 같은 http 클라이언트로 +kubectl은 apiserver의 위치 파악과 인증을 처리한다. +만약 당신이 curl, wget 또는 웹브라우저와 같은 http 클라이언트로 REST API에 직접 액세스하려고 한다면 위치 파악과 인증을 하는 몇 가지 방법이 존재한다. - kubectl을 proxy 모드로 실행. @@ -51,8 +51,8 @@ REST API에 직접 액세스하려고 한다면 위치 파악과 인증을 하 ### kubectl proxy 사용 -다음 커맨드는 kubectl을 reverse proxy처럼 동작하는 모드를 실행한다. 이는 -apiserver의 위치지정과 인증을 처리한다. +다음 커맨드는 kubectl을 reverse proxy처럼 동작하는 모드를 실행한다. 이는 +apiserver의 위치지정과 인증을 처리한다. 다음과 같이 실행한다. ```shell @@ -61,7 +61,7 @@ kubectl proxy --port=8080 상세 내용은 [kubectl proxy](/docs/reference/generated/kubectl/kubectl-commands/#proxy)를 참조한다 -이후에 당신은 curl, wget, 웹브라우저로 다음과 같이 API를 탐색할 수 있다. localhost는 +이후에 당신은 curl, wget, 웹브라우저로 다음과 같이 API를 탐색할 수 있다. localhost는 IPv6 주소 [::1]로도 대체할 수 있다. ```shell @@ -142,22 +142,22 @@ curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure } ``` -위 예제에서는 `--insecure` flag를 사용했다. 이는 MITM 공격을 받을 수 있는 상태로 -두는 것이다. kubectl로 클러스터에 접속할 때 저장된 root 인증서와 클라이언트 인증서들을 +위 예제에서는 `--insecure` flag를 사용했다. 이는 MITM 공격을 받을 수 있는 상태로 +두는 것이다. kubectl로 클러스터에 접속할 때 저장된 root 인증서와 클라이언트 인증서들을 서버 접속에 사용한다. -(이들은 `~/.kube` 디렉터리에 설치된다.) -일반적으로 self-signed 인증서가 클러스터 인증서로 사용되므로 당신의 http 클라이언트가 +(이들은 `~/.kube` 디렉터리에 설치된다.) +일반적으로 self-signed 인증서가 클러스터 인증서로 사용되므로 당신의 http 클라이언트가 root 인증서를 사용하려면 특수한 설정을 필요로 할 것이다. -localhost에서 제공되거나 방화벽으로 보호되는 몇몇 클러스터들에서는 apiserver가 인증을 -요구하지 않지만 이는 표준이 아니다. +localhost에서 제공되거나 방화벽으로 보호되는 몇몇 클러스터들에서는 apiserver가 인증을 +요구하지 않지만 이는 표준이 아니다. [Configuring Access to the API](/docs/reference/access-authn-authz/controlling-access/) -는 클러스터 관리자가 이를 어떻게 구성할 수 있는지를 설명한다. +는 클러스터 관리자가 이를 어떻게 구성할 수 있는지를 설명한다. 이 방식들은 미래의 고가용성 지원과 충돌될 수 있다. ## API에 프로그래밍 방식으로 액세스 -쿠버네티스는 공식적으로 [Go](#go-클라이언트)와 [Python](#python-클라이언트) +쿠버네티스는 공식적으로 [Go](#go-클라이언트)와 [Python](#python-클라이언트) 클라이언트 라이브러리를 지원한다. ### Go 클라이언트 @@ -165,7 +165,7 @@ localhost에서 제공되거나 방화벽으로 보호되는 몇몇 클러스터 * 라이브러리를 취득하려면 `go get k8s.io/client-go@kubernetes-` 커맨드를 실행한다. [INSTALL.md](https://github.com/kubernetes/client-go/blob/master/INSTALL.md#for-the-casual-user)에서 상세한 설치 방법을 알 수 있다. [https://github.com/kubernetes/client-go](https://github.com/kubernetes/client-go#compatibility-matrix)에서 어떤 버젼이 지원되는지 확인할 수 있다. * client-go 클라이언트 위에 애플리케이션을 작성하자. client-go는 자체적으로 API 오브젝트를 정의하므로 필요하다면 main 레포지터리보다는 client-go에서 API 정의들을 import하기를 바란다. 정확하게 `import "k8s.io/client-go/kubernetes"`로 import하는 것을 예로 들 수 있다. -Go 클라이언트는 apiserver의 위치지정과 인증에 kubectl CLI와 동일하게 [kubeconfig file](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/)을 사용할 수 있다. +Go 클라이언트는 apiserver의 위치지정과 인증에 kubectl CLI와 동일하게 [kubeconfig file](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/)을 사용할 수 있다. [예제](https://git.k8s.io/client-go/examples/out-of-cluster-client-configuration/main.go)를 참고한다. 만약 애플리케이션이 클러스터 내에 파드로 배포되었다면 [다음 장](#파드에서-api-액세스)을 참조하기를 바란다. @@ -174,7 +174,7 @@ Go 클라이언트는 apiserver의 위치지정과 인증에 kubectl CLI와 동 Python 클라이언트를 사용하려면 `pip install kubernetes` 커맨드를 실행한다. 설치 옵션에 대한 상세 사항은 [Python Client Library page](https://github.com/kubernetes-client/python)를 참조한다. -Python 클라이언트는 apiserver의 위치지정과 인증에 kubectl CLI와 동일하게 [kubeconfig file](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/)을 사용할 수 있다. +Python 클라이언트는 apiserver의 위치지정과 인증에 kubectl CLI와 동일하게 [kubeconfig file](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/)을 사용할 수 있다. [예제](https://github.com/kubernetes-client/python/tree/master/examples)를 참조한다. ### 다른 언어 @@ -184,44 +184,44 @@ Python 클라이언트는 apiserver의 위치지정과 인증에 kubectl CLI와 ## 파드에서 API 액세스 -파드에서 API를 접속한다면 apiserver의 +파드에서 API를 접속한다면 apiserver의 위치지정과 인증은 다소 다르다. -파드 내에서 apiserver의 위치를 지정하는데 추천하는 방식은 -`kubernetes.default.svc` DNS 네임을 사용하는 것이다. +파드 내에서 apiserver의 위치를 지정하는데 추천하는 방식은 +`kubernetes.default.svc` DNS 네임을 사용하는 것이다. 이 DNS 네임은 apiserver로 라우팅되는 서비스 IP로 resolve된다. -apiserver 인증에 추천되는 방식은 -[서비스 어카운트](/docs/tasks/configure-pod-container/configure-service-account/) -인증정보를 사용하는 것이다. kube-system에 의해 파드는 서비스 어카운트와 연계되며 -해당 서비스 어카운트의 인증정보(토큰)은 파드 내 각 컨테이너의 파일시스템 트리의 +apiserver 인증에 추천되는 방식은 +[서비스 어카운트](/docs/tasks/configure-pod-container/configure-service-account/) +인증정보를 사용하는 것이다. kube-system에 의해 파드는 서비스 어카운트와 연계되며 +해당 서비스 어카운트의 인증정보(토큰)은 파드 내 각 컨테이너의 파일시스템 트리의 `/var/run/secrets/kubernetes.io/serviceaccount/token`에 위치한다. -사용 가능한 경우, 인증서 번들은 각 컨테이너 내 파일시스템 트리의 -`/var/run/secrets/kubernetes.io/serviceaccount/ca.crt`에 위치하며 +사용 가능한 경우, 인증서 번들은 각 컨테이너 내 파일시스템 트리의 +`/var/run/secrets/kubernetes.io/serviceaccount/ca.crt`에 위치하며 apiserver의 인증서 제공을 검증하는데 사용되어야 한다. -마지막으로 네임스페이스 한정의 API 조작에 사용되는 기본 네임스페이스는 각 컨테이터 내의 +마지막으로 네임스페이스 한정의 API 조작에 사용되는 기본 네임스페이스는 각 컨테이터 내의 `/var/run/secrets/kubernetes.io/serviceaccount/namespace` 파일로 존재한다. 파드 내에서 API에 접근하는데 권장되는 방식은 다음과 같다. - - 파드의 sidecar 컨테이너 내에서 `kubectl proxy`를 실행하거나, - 컨테이너 내부에서 백그라운드 프로세스로 실행한다. - 이는 쿠버네티스 API를 파드의 localhost 인터페이스로 proxy하여 + - 파드의 sidecar 컨테이너 내에서 `kubectl proxy`를 실행하거나, + 컨테이너 내부에서 백그라운드 프로세스로 실행한다. + 이는 쿠버네티스 API를 파드의 localhost 인터페이스로 proxy하여 해당 파드의 컨테이너 내에 다른 프로세스가 API에 접속할 수 있게 해준다. - - Go 클라이언트 라이브러리를 이용하여 `rest.InClusterConfig()`와 `kubernetes.NewForConfig()` 함수들을 사용하도록 클라이언트를 만든다. + - Go 클라이언트 라이브러리를 이용하여 `rest.InClusterConfig()`와 `kubernetes.NewForConfig()` 함수들을 사용하도록 클라이언트를 만든다. 이는 apiserver의 위치지정과 인증을 처리한다. [예제](https://git.k8s.io/client-go/examples/in-cluster-client-configuration/main.go) 각각의 사례에서 apiserver와의 보안 통신에 파드의 인증정보가 사용된다. ## 클러스터에서 실행되는 서비스로 액세스 -이전 장은 쿠버네티스 API server 접속에 대한 내용을 다루었다. 이번 장은 -쿠버네티스 클러스터 상에서 실행되는 다른 서비스로의 연결을 다룰 것이다. 쿠버네티스에서 -[노드들](/ko/docs/concepts/architecture/nodes/), [파드들](/ko/docs/concepts/workloads/pods/pod/), [서비스들](/docs/user-guide/services)은 -모두 자신의 IP들을 가진다. 당신의 데스크탑 PC와 같은 클러스터 외부 장비에서는 -클러스터 상의 노드 IP들, 파드 IP들, 서비스 IP들로 라우팅되지 않아서 접근을 +이전 장은 쿠버네티스 API server 접속에 대한 내용을 다루었다. 이번 장은 +쿠버네티스 클러스터 상에서 실행되는 다른 서비스로의 연결을 다룰 것이다. 쿠버네티스에서 +[노드들](/ko/docs/concepts/architecture/nodes/), [파드들](/ko/docs/concepts/workloads/pods/pod/), [서비스들](/docs/user-guide/services)은 +모두 자신의 IP들을 가진다. 당신의 데스크탑 PC와 같은 클러스터 외부 장비에서는 +클러스터 상의 노드 IP들, 파드 IP들, 서비스 IP들로 라우팅되지 않아서 접근을 할 수 없을 것이다. ### 통신을 위한 방식들 @@ -229,33 +229,33 @@ apiserver의 인증서 제공을 검증하는데 사용되어야 한다. 클러스터 외부에서 노드들, 파드들, 서비스들에 접속하는 데는 몇 가지 선택지들이 있다. - 공인 IP를 통해 서비스에 액세스. - - 클러스터 외부에서 접근할 수 있도록 `NodePort` 또는 `LoadBalancer` 타입의 - 서비스를 사용한다. [서비스](/docs/user-guide/services)와 + - 클러스터 외부에서 접근할 수 있도록 `NodePort` 또는 `LoadBalancer` 타입의 + 서비스를 사용한다. [서비스](/docs/user-guide/services)와 [kubectl expose](/docs/reference/generated/kubectl/kubectl-commands/#expose) 문서를 참조한다. - - 당신의 클러스터 환경에 따라 회사 네트워크에만 서비스를 노출하거나 - 인터넷으로 노출할 수 있다. 이 경우 노출되는 서비스의 보안 여부를 고려해야 한다. + - 당신의 클러스터 환경에 따라 회사 네트워크에만 서비스를 노출하거나 + 인터넷으로 노출할 수 있다. 이 경우 노출되는 서비스의 보안 여부를 고려해야 한다. 해당 서비스는 자체적으로 인증을 수행하는가? - - 파드들은 서비스 뒤에 위치시킨다. 레플리카들의 집합에서 특정 파드 하나에 debugging 같은 목적으로 접근하려면 + - 파드들은 서비스 뒤에 위치시킨다. 레플리카들의 집합에서 특정 파드 하나에 debugging 같은 목적으로 접근하려면 해당 파드에 고유의 레이블을 붙이고 셀렉터에 해당 레이블을 선택한 신규 서비스를 생성한다. - - 대부분의 경우에는 애플리케이션 개발자가 노드 IP를 통해 직접 노드에 + - 대부분의 경우에는 애플리케이션 개발자가 노드 IP를 통해 직접 노드에 액세스할 필요는 없다. - Proxy Verb를 사용하여 서비스, 노드, 파드에 액세스. - - 원격 서비스에 액세스하기에 앞서 apiserver의 인증과 인가를 받아야 한다. - 서비스가 인터넷에 노출하기에 보안이 충분하지 않거나 노드 IP 상의 port에 + - 원격 서비스에 액세스하기에 앞서 apiserver의 인증과 인가를 받아야 한다. + 서비스가 인터넷에 노출하기에 보안이 충분하지 않거나 노드 IP 상의 port에 액세스를 취득하려고 하거나 debugging을 하려면 이를 사용한다. - 어떤 web 애플리케이션에서는 proxy가 문제를 일으킬 수 있다. - HTTP/HTTPS에서만 동작한다. - [여기](#수작업으로-apiserver-proxy-url들을-구축)에서 설명하고 있다. - 클러스터 내 노드 또는 파드에서 액세스. - - 파드를 Running시킨 다음 [kubectl exec](/docs/reference/generated/kubectl/kubectl-commands/#exec)를 사용하여 해당 파드의 셸로 접속한다. + - 파드를 Running시킨 다음 [kubectl exec](/docs/reference/generated/kubectl/kubectl-commands/#exec)를 사용하여 해당 파드의 셸로 접속한다. 해당 셸에서 다른 노드들, 파드들, 서비스들에 연결한다. - - 어떤 클러스터는 클러스터 내의 노드에 ssh 접속을 허용하기도 한다. 이런 클러스터에서는 - 클러스터 서비스에 액세스도 가능하다. 이는 비표준 방식으로 특정 클러스터에서는 동작하지만 + - 어떤 클러스터는 클러스터 내의 노드에 ssh 접속을 허용하기도 한다. 이런 클러스터에서는 + 클러스터 서비스에 액세스도 가능하다. 이는 비표준 방식으로 특정 클러스터에서는 동작하지만 다른 클러스터에서는 동작하지 않을 수 있다. 브라우저와 다른 도구들이 설치되지 않았거나 설치되었을 수 있다. 클러스터 DNS가 동작하지 않을 수도 있다. ### 빌트인 서비스들의 발견 -일반적으로 kube-system에 의해 클러스터 상에서 start되는 몇 가지 서비스들이 존재한다. +일반적으로 kube-system에 의해 클러스터 상에서 start되는 몇 가지 서비스들이 존재한다. `kubectl cluster-info` 커맨드로 이 서비스들의 리스트를 볼 수 있다. ```shell @@ -273,15 +273,15 @@ grafana is running at https://104.197.5.247/api/v1/namespaces/kube-system/servic heapster is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/monitoring-heapster/proxy ``` -이는 각 서비스에 액세스하기 위한 proxy-verb URL을 보여준다. -예를 들어 위 클러스터는 클러스터 수준의 logging(Elasticsearch 사용)이 활성화되었으므로 적절한 인증을 통과하여 -`https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/`로 액세스할 수 있다. 예를 들어 kubectl proxy로 +이는 각 서비스에 액세스하기 위한 proxy-verb URL을 보여준다. +예를 들어 위 클러스터는 클러스터 수준의 logging(Elasticsearch 사용)이 활성화되었으므로 적절한 인증을 통과하여 +`https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/`로 액세스할 수 있다. 예를 들어 kubectl proxy로 `http://localhost:8080/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/`를 통해 logging에 액세스할 수도 있다. -(인증을 통과하는 방법이나 kubectl proxy를 사용하는 것은 [쿠버네티스 API를 사용해서 클러스터에 접근하기](/docs/tasks/administer-cluster/access-cluster-api/)을 참조한다.) +(인증을 통과하는 방법이나 kubectl proxy를 사용하는 것은 [쿠버네티스 API를 사용해서 클러스터에 접근하기](/ko/docs/tasks/administer-cluster/access-cluster-api/)을 참조한다.) #### 수작업으로 apiserver proxy URL을 구축 -위에서 언급한 것처럼 서비스의 proxy URL을 검색하는데 `kubectl cluster-info` 커맨드를 사용할 수 있다. 서비스 endpoint, 접미사, 매개변수를 포함하는 proxy URL을 생성하려면 단순하게 해당 서비스에 +위에서 언급한 것처럼 서비스의 proxy URL을 검색하는데 `kubectl cluster-info` 커맨드를 사용할 수 있다. 서비스 endpoint, 접미사, 매개변수를 포함하는 proxy URL을 생성하려면 단순하게 해당 서비스에 `http://`*`kubernetes_master_address`*`/api/v1/namespaces/`*`namespace_name`*`/services/`*`service_name[:port_name]`*`/proxy` 형식의 proxy URL을 덧붙인다. 당신이 port에 이름을 지정하지 않았다면 URL에 *port_name* 을 지정할 필요는 없다. @@ -300,7 +300,7 @@ URL의 네임 부분에 지원되는 양식은 다음과 같다. * Elasticsearch 서비스 endpoint `_search?q=user:kimchy`에 액세스하려면 `http://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_search?q=user:kimchy`를 사용할 수 있다. * Elasticsearch 클러스터 상태 정보 `_cluster/health?pretty=true`에 액세스하려면 `https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_cluster/health?pretty=true`를 사용할 수 있다. - + ```json { "cluster_name" : "kubernetes_logging", @@ -320,9 +320,9 @@ URL의 네임 부분에 지원되는 양식은 다음과 같다. 브라우저의 주소창에 apiserver proxy url을 넣을 수도 있다. 하지만 - - 웹브라우저는 일반적으로 토큰을 전달할 수 없으므로 basic (password) auth를 사용해야 할 것이다. basic auth를 수용할 수 있도록 apiserver를 구성할 수 있지만, + - 웹브라우저는 일반적으로 토큰을 전달할 수 없으므로 basic (password) auth를 사용해야 할 것이다. basic auth를 수용할 수 있도록 apiserver를 구성할 수 있지만, 당신의 클러스터가 basic auth를 수용할 수 있도록 구성되어 있지 않을 수도 있다. - - 몇몇 web app은 동작하지 않을 수도 있다. 특히 proxy path prefix를 인식하지 않는 방식으로 url을 + - 몇몇 web app은 동작하지 않을 수도 있다. 특히 proxy path prefix를 인식하지 않는 방식으로 url을 구성하는 client side javascript를 가진 web app은 동작하지 않을 수 있다. ## 요청 redirect @@ -373,7 +373,5 @@ redirect 기능은 deprecated되고 제거 되었다. 대신 (아래의) proxy - UDP/TCP 만 사용한다 - cloud provider마다 구현된 내용이 상이하다 -일반적으로 쿠버네티스 사용자들은 처음 두 타입이 아닌 다른 방식은 고려할 필요가 없지만 클러스터 관리자는 +일반적으로 쿠버네티스 사용자들은 처음 두 타입이 아닌 다른 방식은 고려할 필요가 없지만 클러스터 관리자는 나머지 타입을 적절하게 구성해줘야 한다. - - diff --git a/content/ko/docs/tasks/access-application-cluster/configure-dns-cluster.md b/content/ko/docs/tasks/access-application-cluster/configure-dns-cluster.md index eaace61131..5dde43a4f9 100644 --- a/content/ko/docs/tasks/access-application-cluster/configure-dns-cluster.md +++ b/content/ko/docs/tasks/access-application-cluster/configure-dns-cluster.md @@ -8,6 +8,4 @@ content_type: concept 쿠버네티스는 지원하는 모든 환경에서 기본으로 활성화된 DNS 클러스터 애드온을 제공한다. 쿠버네티스 1.11과 이후 버전에서는, CoreDNS가 권장되고 기본적으로 kubeadm과 함께 설치 된다. -쿠버네티스 클러스터의 CoreDNS 설정에 대한 더 많은 정보는, [DNS 서비스 사용자화 하기](/docs/tasks/administer-cluster/dns-custom-nameservers/)을 본다. kube-dns와 함께 쿠버네티스 DNS를 사용하는 방법을 보여주는 예시는 [쿠버네티스 DNS 샘플 플러그인](https://github.com/kubernetes/examples/tree/master/staging/cluster-dns)을 본다. - - +쿠버네티스 클러스터의 CoreDNS 설정에 대한 더 많은 정보는, [DNS 서비스 사용자화 하기](/ko/docs/tasks/administer-cluster/dns-custom-nameservers/)을 본다. kube-dns와 함께 쿠버네티스 DNS를 사용하는 방법을 보여주는 예시는 [쿠버네티스 DNS 샘플 플러그인](https://github.com/kubernetes/examples/tree/master/staging/cluster-dns)을 본다. diff --git a/content/ko/docs/tasks/access-application-cluster/service-access-application-cluster.md b/content/ko/docs/tasks/access-application-cluster/service-access-application-cluster.md new file mode 100644 index 0000000000..7565152bf0 --- /dev/null +++ b/content/ko/docs/tasks/access-application-cluster/service-access-application-cluster.md @@ -0,0 +1,158 @@ +--- +title: 클러스터 내 애플리케이션에 접근하기 위해 서비스 사용하기 +content_type: tutorial +weight: 60 +--- + + + +이 문서는 외부 클라이언트가 클러스터에서 실행 중인 애플리케이션에 접근하기 +위해 사용하는 쿠버네티스 서비스 오브젝트를 생성하는 방법을 설명한다. 서비스는 +실행 중인 두 개의 인스턴스를 갖는 애플리케이션에 대한 로드 밸런싱을 제공한다. + + + + +## {{% heading "prerequisites" %}} + + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + + + + +## {{% heading "objectives" %}} + + +* Hello World 애플리케이션 인스턴스 두 개를 실행한다. +* 노드 포트를 노출하는 서비스 오브젝트를 생성한다. +* 실행 중인 애플리케이션에 접근하기 위해 서비스 오브젝트를 사용한다. + + + + + + +## 두 개의 파드에서 실행 중인 애플리케이션에 대한 서비스 생성하기 + +다음은 애플리케이션 디플로이먼트(Deployment) 설정 파일이다. + +{{< codenew file="service/access/hello-application.yaml" >}} + +1. 클러스터 내 Hello World 애플리케이션을 실행하자. + 위 파일을 사용하여 애플리케이션 디플로이먼트를 생성하자. + ```shell + kubectl apply -f https://k8s.io/examples/service/access/hello-application.yaml + ``` + 앞의 명령은 + [디플로이먼트](/ko/docs/concepts/workloads/controllers/deployment/) + 오브젝트와 연관된 + [레플리카셋(ReplicaSet)](/ko/docs/concepts/workloads/controllers/replicaset/) + 오브젝트를 생성한다. 레플리카셋은 두 개의 + [파드](/ko/docs/concepts/workloads/pods/pod/)를 갖고, + 각각은 Hello World 애플리케이션을 실행한다. + +1. 디플로이먼트에 대한 정보를 보여준다. + ```shell + kubectl get deployments hello-world + kubectl describe deployments hello-world + ``` + +1. 레플리카셋 오브젝트에 대한 정보를 보여준다. + ```shell + kubectl get replicasets + kubectl describe replicasets + ``` + +1. 디플로이먼트를 노출하는 서비스 오브젝트를 생성한다. + ```shell + kubectl expose deployment hello-world --type=NodePort --name=example-service + ``` + +1. 서비스에 대한 정보를 보여준다. + ```shell + kubectl describe services example-service + ``` + 결과는 아래와 같다. + ```shell + Name: example-service + Namespace: default + Labels: run=load-balancer-example + Annotations: + Selector: run=load-balancer-example + Type: NodePort + IP: 10.32.0.16 + Port: 8080/TCP + TargetPort: 8080/TCP + NodePort: 31496/TCP + Endpoints: 10.200.1.4:8080,10.200.2.5:8080 + Session Affinity: None + Events: + ``` + 서비스의 노드포트(NodePort) 값을 메모하자. 예를 들어, + 앞선 결과에서, 노드포트 값은 31496이다. + +1. Hello World 애플리케이션이 실행 중인 파드를 나열한다. + ```shell + kubectl get pods --selector="run=load-balancer-example" --output=wide + ``` + 결과는 아래와 같다. + ```shell + NAME READY STATUS ... IP NODE + hello-world-2895499144-bsbk5 1/1 Running ... 10.200.1.4 worker1 + hello-world-2895499144-m1pwt 1/1 Running ... 10.200.2.5 worker2 + ``` +1. Hello World 파드가 실행 중인 노드들 중 하나의 노드에 대해 공용 + IP 주소를 얻자. 이 주소를 얻는 방법은 어떻게 클러스터를 설치했는지에 + 따라 다르다. 예를 들어, Minikube를 사용하면, `kubectl cluster-info`를 + 실행하여 노드 주소를 알 수 있다. Google Compute Engine 인스턴스를 + 사용하면, `gcloud compute instances list` 명령어를 + 사용하여 노드들의 공용 주소를 알 수 + 있다. + +1. 선택한 노드에서 노드 포트에 대해 TCP 통신을 허용하도록 방화벽 규칙을 + 생성하자. 예를 들어, 서비스의 노드포트 값이 31568인 경우, + 31568 포트로 TCP 통신을 허용하도록 방화벽 규칙을 생성하자. 다른 + 클라우드 공급자는 방화벽 규칙을 설정하는 다른 방법을 제공한다. + +1. Hello World 애플리케이션 접근을 위해 노드 주소와 노드 포트를 사용하자. + ```shell + curl http://: + ``` + ``는 노드의 공용 IP 주소이고, + ``는 서비스의 노드포트 값이다. + 성공적인 요청에 대한 응답은 hello 메시지이다. + ```shell + Hello Kubernetes! + ``` + +## 서비스 설정 파일 사용하기 + +`kubectl expose`를 사용하는 대신, +[서비스 설정 파일](/ko/docs/concepts/services-networking/service/)을 사용해 +서비스를 생성할 수 있다. + + + + +## {{% heading "cleanup" %}} + + +서비스를 삭제하기 위해 다음 명령어를 입력하자. + + kubectl delete services example-service + +디플로이먼트, 레플리카셋, Hello World 애플리케이션이 실행 중인 파드를 +삭제하기 위해 다음 명령어를 입력하자. + + kubectl delete deployment hello-world + + + + +## {{% heading "whatsnext" %}} + + +[서비스와 애플리케이션 연결하기](/ko/docs/concepts/services-networking/connect-applications-service/)에 +대해 더 알아본다. + diff --git a/content/ko/docs/tasks/administer-cluster/dns-custom-nameservers.md b/content/ko/docs/tasks/administer-cluster/dns-custom-nameservers.md index 5af4ea94b0..0e5a87bc82 100644 --- a/content/ko/docs/tasks/administer-cluster/dns-custom-nameservers.md +++ b/content/ko/docs/tasks/administer-cluster/dns-custom-nameservers.md @@ -258,4 +258,4 @@ kube-dns를 CoreDNS로 교체하여 적용하는 방법에 대한 상세 정보 ## {{% heading "whatsnext" %}} -- [DNS 변환 디버깅하기](/docs/tasks/debug-application-cluster/dns-debugging-resolution/) 읽기 +- [DNS 변환 디버깅하기](/docs/tasks/administer-cluster/dns-debugging-resolution/) 읽기 diff --git a/content/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md b/content/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md index 5e9c61d3e6..ac3ac3f695 100644 --- a/content/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md +++ b/content/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md @@ -10,15 +10,11 @@ weight: 10 [kubeadm](/docs/reference/setup-tools/kubeadm/kubeadm/)으로 생성된 클라이언트 인증서는 1년 후에 만료된다. 이 페이지는 kubeadm으로 인증서 갱신을 관리하는 방법을 설명한다. - - ## {{% heading "prerequisites" %}} [쿠버네티스의 PKI 인증서와 요구 조건](/ko/docs/setup/best-practices/certificates/)에 익숙해야 한다. - - ## 사용자 정의 인증서 사용 {#custom-certificates} @@ -153,33 +149,29 @@ HA 클러스터를 실행 중인 경우, 모든 컨트롤 플레인 노드에서 ### 서명자 설정 쿠버네티스 인증 기관(Certificate Authority)은 기본적으로 작동하지 않는다. -[cert-manager][cert-manager-issuer] 와 같은 외부 서명자를 설정하거나, 빌트인 서명자를 사용할 수 있다. +[cert-manager](https://docs.cert-manager.io/en/latest/tasks/issuers/setup-ca.html)와 같은 외부 서명자를 설정하거나, 빌트인 서명자를 사용할 수 있다. -빌트인 서명자는 [`kube-controller-manager`][kcm] 의 일부이다. +빌트인 서명자는 [`kube-controller-manager`](/docs/reference/command-line-tools-reference/kube-controller-manager/)의 일부이다. 빌트인 서명자를 활성화하려면, `--cluster-signing-cert-file` 와 `--cluster-signing-key-file` 플래그를 전달해야 한다. -새 클러스터를 생성하는 경우, kubeadm [구성 파일][config]을 사용할 수 있다. +새 클러스터를 생성하는 경우, kubeadm [구성 파일](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2)을 사용할 수 있다. - ```yaml - apiVersion: kubeadm.k8s.io/v1beta2 - kind: ClusterConfiguration - controllerManager: - extraArgs: - cluster-signing-cert-file: /etc/kubernetes/pki/ca.crt - cluster-signing-key-file: /etc/kubernetes/pki/ca.key - ``` - -[cert-manager-issuer]: https://docs.cert-manager.io/en/latest/tasks/issuers/setup-ca.html -[kcm]: /docs/reference/command-line-tools-reference/kube-controller-manager/ -[config]: https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2 +```yaml +apiVersion: kubeadm.k8s.io/v1beta2 +kind: ClusterConfiguration +controllerManager: + extraArgs: + cluster-signing-cert-file: /etc/kubernetes/pki/ca.crt + cluster-signing-key-file: /etc/kubernetes/pki/ca.key +``` ### 인증서 서명 요청(CSR) 생성 `kubeadm alpha certs renew --use-api` 로 쿠버네티스 인증서 API에 대한 인증서 서명 요청을 만들 수 있다. -[cert-manager][cert-manager] 와 같은 외부 서명자를 설정하면, 인증서 서명 요청(CSR)이 자동으로 승인된다. -그렇지 않으면, [`kubectl certificate`][certs] 명령을 사용하여 인증서를 수동으로 승인해야 한다. +[cert-manager](https://github.com/jetstack/cert-manager)와 같은 외부 서명자를 설정하면, 인증서 서명 요청(CSR)이 자동으로 승인된다. +그렇지 않으면, [`kubectl certificate`](/ko/docs/setup/best-practices/certificates/) 명령을 사용하여 인증서를 수동으로 승인해야 한다. 다음의 kubeadm 명령은 승인할 인증서 이름을 출력한 다음, 승인이 발생하기를 차단하고 기다린다. ```shell @@ -195,7 +187,7 @@ sudo kubeadm alpha certs renew apiserver --use-api & 외부 서명자를 설정하면, 인증서 서명 요청(CSR)이 자동으로 승인된다. -그렇지 않으면, [`kubectl certificate`][certs] 명령을 사용하여 인증서를 수동으로 승인해야 한다. 예를 들어 다음과 같다. +그렇지 않으면, [`kubectl certificate`](/ko/docs/setup/best-practices/certificates/) 명령을 사용하여 인증서를 수동으로 승인해야 한다. 예를 들어 다음과 같다. ```shell kubectl certificate approve kubeadm-cert-kube-apiserver-ld526 @@ -227,20 +219,14 @@ CSR과 함께 제공되는 개인 키가 모두 출력된다. `kubeadm init` 과 마찬가지로 출력 디렉터리를 `--csr-dir` 플래그로 지정할 수 있다. CSR에는 인증서 이름, 도메인 및 IP가 포함되지만, 용도를 지정하지는 않는다. -인증서를 발행할 때 [올바른 인증서 용도][cert-table]를 지정하는 것은 CA의 책임이다. +인증서를 발행할 때 [올바른 인증서 용도](/ko/docs/setup/best-practices/certificates/#모든-인증서)를 지정하는 것은 CA의 책임이다. -* `openssl` 의 경우 [`openssl ca` command][openssl-ca] 명령으로 수행한다. -* `cfssl` 의 경우 [설정 파일에 용도][cfssl-usages]를 지정한다. +* `openssl` 의 경우 + [`openssl ca` 명령](https://superuser.com/questions/738612/openssl-ca-keyusage-extension)으로 수행한다. +* `cfssl` 의 경우 [설정 파일에 용도](https://github.com/cloudflare/cfssl/blob/master/doc/cmd/cfssl.txt#L170)를 지정한다. 선호하는 방법으로 인증서에 서명한 후, 인증서와 개인 키를 PKI 디렉터리(기본적으로 `/etc/kubernetes/pki`)에 복사해야 한다. -[cert-manager]: https://github.com/jetstack/cert-manager -[openssl-ca]: https://superuser.com/questions/738612/openssl-ca-keyusage-extension -[cfssl-usages]: https://github.com/cloudflare/cfssl/blob/master/doc/cmd/cfssl.txt#L170 -[certs]: /ko/docs/setup/best-practices/certificates/ -[cert-cas]: /ko/docs/setup/best-practices/certificates/#단일-루트-ca -[cert-table]: /ko/docs/setup/best-practices/certificates/#모든-인증서 - ## 인증 기관(CA) 순환(rotation) {#certificate-authority-rotation} Kubeadm은 CA 인증서의 순환이나 교체 기능을 기본적으로 지원하지 않는다. diff --git a/content/ko/docs/tasks/administer-cluster/network-policy-provider/calico-network-policy.md b/content/ko/docs/tasks/administer-cluster/network-policy-provider/calico-network-policy.md index 44f57b3b58..bee3c94069 100644 --- a/content/ko/docs/tasks/administer-cluster/network-policy-provider/calico-network-policy.md +++ b/content/ko/docs/tasks/administer-cluster/network-policy-provider/calico-network-policy.md @@ -49,5 +49,4 @@ Kubeadm을 이용해서 15분 이내에 지역 단일 호스트 캘리코 클러 ## {{% heading "whatsnext" %}} 클러스터가 동작하면, 쿠버네티스 네트워크 폴리시(NetworkPolicy)를 시도하기 위해 -[네트워크 폴리시 선언하기](/docs/tasks/administer-cluster/declare-network-policy/)를 따라 할 수 있다. - +[네트워크 폴리시 선언하기](/ko/docs/tasks/administer-cluster/declare-network-policy/)를 따라 할 수 있다. diff --git a/content/ko/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy.md b/content/ko/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy.md index fed25bc169..f41b5cd716 100644 --- a/content/ko/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy.md +++ b/content/ko/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy.md @@ -102,9 +102,6 @@ cilium-6rxbd 1/1 Running 0 1m 클러스터가 동작하면, 실리움으로 쿠버네티스 네트워크 폴리시를 시도하기 위해 -[네트워크 폴리시 선언하기](/docs/tasks/administer-cluster/declare-network-policy/)를 따라 할 수 있다. +[네트워크 폴리시 선언하기](/ko/docs/tasks/administer-cluster/declare-network-policy/)를 따라 할 수 있다. 재미있게 즐기고, 질문이 있다면 [실리움 슬랙 채널](https://cilium.herokuapp.com/)을 이용하여 연락한다. - - - diff --git a/content/ko/docs/tasks/administer-cluster/network-policy-provider/kube-router-network-policy.md b/content/ko/docs/tasks/administer-cluster/network-policy-provider/kube-router-network-policy.md index 1fbc5e4455..4c16cb7385 100644 --- a/content/ko/docs/tasks/administer-cluster/network-policy-provider/kube-router-network-policy.md +++ b/content/ko/docs/tasks/administer-cluster/network-policy-provider/kube-router-network-policy.md @@ -22,7 +22,4 @@ weight: 30 ## {{% heading "whatsnext" %}} -큐브 라우터 애드온을 설치한 후에는, 쿠버네티스 네트워크 폴리시를 시도하기 위해 [네트워크 폴리시 선언하기](/docs/tasks/administer-cluster/declare-network-policy/)를 따라 할 수 있다. - - - +큐브 라우터 애드온을 설치한 후에는, 쿠버네티스 네트워크 폴리시를 시도하기 위해 [네트워크 폴리시 선언하기](/ko/docs/tasks/administer-cluster/declare-network-policy/)를 따라 할 수 있다. diff --git a/content/ko/docs/tasks/administer-cluster/network-policy-provider/romana-network-policy.md b/content/ko/docs/tasks/administer-cluster/network-policy-provider/romana-network-policy.md index 70f0ec1aae..d59cdd3e15 100644 --- a/content/ko/docs/tasks/administer-cluster/network-policy-provider/romana-network-policy.md +++ b/content/ko/docs/tasks/administer-cluster/network-policy-provider/romana-network-policy.md @@ -38,4 +38,4 @@ Kubeadm을 위한 [컨테이너화된 설치 안내서](https://github.com/roman ## {{% heading "whatsnext" %}} -로마나를 설치한 후에는, 쿠버네티스 네트워크 폴리시를 시도하기 위해 [네트워크 폴리시 선언하기](/docs/tasks/administer-cluster/declare-network-policy/)를 따라 할 수 있다. +로마나를 설치한 후에는, 쿠버네티스 네트워크 폴리시를 시도하기 위해 [네트워크 폴리시 선언하기](/ko/docs/tasks/administer-cluster/declare-network-policy/)를 따라 할 수 있다. diff --git a/content/ko/docs/tasks/administer-cluster/network-policy-provider/weave-network-policy.md b/content/ko/docs/tasks/administer-cluster/network-policy-provider/weave-network-policy.md index 484a8d58cd..3aea719c56 100644 --- a/content/ko/docs/tasks/administer-cluster/network-policy-provider/weave-network-policy.md +++ b/content/ko/docs/tasks/administer-cluster/network-policy-provider/weave-network-policy.md @@ -52,8 +52,4 @@ weave-net-pmw8w 2/2 Running 0 9d ## {{% heading "whatsnext" %}} -위브넷 애드온을 설치하고 나서, 쿠버네티스 네트워크 폴리시를 시도하기 위해 [네트워크 폴리시 선언하기](/docs/tasks/administer-cluster/declare-network-policy/)를 따라 할 수 있다. 질문이 있으면 [슬랙 #weave-community 이나 Weave 유저그룹](https://github.com/weaveworks/weave#getting-help)에 연락한다. - - - - +위브넷 애드온을 설치하고 나서, 쿠버네티스 네트워크 폴리시를 시도하기 위해 [네트워크 폴리시 선언하기](/ko/docs/tasks/administer-cluster/declare-network-policy/)를 따라 할 수 있다. 질문이 있으면 [슬랙 #weave-community 이나 Weave 유저그룹](https://github.com/weaveworks/weave#getting-help)에 연락한다. diff --git a/content/ko/docs/tasks/configure-pod-container/configure-pod-initialization.md b/content/ko/docs/tasks/configure-pod-container/configure-pod-initialization.md index d973b42f99..ee7d5a9f82 100644 --- a/content/ko/docs/tasks/configure-pod-container/configure-pod-initialization.md +++ b/content/ko/docs/tasks/configure-pod-container/configure-pod-initialization.md @@ -88,4 +88,4 @@ init-demo 파드 내 실행 중인 nginx 컨테이너의 셸을 실행한다. 대해 배우기. * [초기화 컨테이너](/ko/docs/concepts/workloads/pods/init-containers/)에 대해 배우기. * [볼륨](/ko/docs/concepts/storage/volumes/)에 대해 배우기. -* [초기화 컨테이너 디버깅](/docs/tasks/debug-application-cluster/debug-init-containers/)에 대해 배우기. +* [초기화 컨테이너 디버깅](/ko/docs/tasks/debug-application-cluster/debug-init-containers/)에 대해 배우기. diff --git a/content/ko/docs/tasks/manage-hugepages/scheduling-hugepages.md b/content/ko/docs/tasks/manage-hugepages/scheduling-hugepages.md index edb0edb08f..515b9c2cdd 100644 --- a/content/ko/docs/tasks/manage-hugepages/scheduling-hugepages.md +++ b/content/ko/docs/tasks/manage-hugepages/scheduling-hugepages.md @@ -115,4 +115,4 @@ glossary_tooltip text="kubelet" term_id="kubelet" >}} 및 {{< glossary_tooltip text="kube-apiserver" term_id="kube-apiserver" >}} (`--feature-gates=HugePageStorageMediumSize=true`)의 `HugePageStorageMediumSize` [기능 -게이트](/docs/reference/command-line-tools-reference/feature-gates/)를 사용하여 활성화할 수 있다. +게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 사용하여 활성화할 수 있다. diff --git a/content/ko/docs/tutorials/stateful-application/basic-stateful-set.md b/content/ko/docs/tutorials/stateful-application/basic-stateful-set.md index 03cfdf88c6..c7d57d8633 100644 --- a/content/ko/docs/tutorials/stateful-application/basic-stateful-set.md +++ b/content/ko/docs/tutorials/stateful-application/basic-stateful-set.md @@ -119,7 +119,7 @@ web-1 1/1 Running 0 18s ``` 참고로 `web-1` 파드는 `web-0` 파드가 _Running_ ([파드의 단계](/ko/docs/concepts/workloads/pods/pod-lifecycle/#파드의-단계-phase) 참고) -및 _Ready_ ([파드의 조건](/docs/concepts/workloads/pods/pod-lifecycle/#파드의-조건-condition)에서 `type` 참고) 상태가 되기 전에 시작하지 않음을 주의하자. +및 _Ready_ ([파드의 조건](/ko/docs/concepts/workloads/pods/pod-lifecycle/#파드의-조건-condition)에서 `type` 참고) 상태가 되기 전에 시작하지 않음을 주의하자. ## 스테이트풀셋 안에 파드 diff --git a/content/ko/examples/service/access/hello-application.yaml b/content/ko/examples/service/access/hello-application.yaml new file mode 100644 index 0000000000..1cf41313c5 --- /dev/null +++ b/content/ko/examples/service/access/hello-application.yaml @@ -0,0 +1,20 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: hello-world +spec: + selector: + matchLabels: + run: load-balancer-example + replicas: 2 + template: + metadata: + labels: + run: load-balancer-example + spec: + containers: + - name: hello-world + image: gcr.io/google-samples/node-hello:1.0 + ports: + - containerPort: 8080 + protocol: TCP diff --git a/content/pt/docs/concepts/_index.md b/content/pt/docs/concepts/_index.md new file mode 100644 index 0000000000..62b2457c71 --- /dev/null +++ b/content/pt/docs/concepts/_index.md @@ -0,0 +1,16 @@ +--- +title: Conceitos +main_menu: true +content_type: concept +weight: 40 +--- + + + +A seção de Conceitos irá te ajudar a aprender mais sobre as partes do ecossistema Kubernetes e as abstrações que o Kubernetes usa para representar seu {{< glossary_tooltip text="cluster" term_id="cluster" length="all" >}}. + +Ela irá lhe ajudar a obter um entendimento mais profundo sobre como o Kubernetes funciona. + + + + diff --git a/content/pt/docs/reference/glossary/cluster.md b/content/pt/docs/reference/glossary/cluster.md new file mode 100644 index 0000000000..49e8ae15d6 --- /dev/null +++ b/content/pt/docs/reference/glossary/cluster.md @@ -0,0 +1,18 @@ +--- +title: Cluster +id: cluster +date: 2020-08-03 +full_link: +short_description: > + Um conjunto de servidores de processamento, também chamados de nós, que executam aplicações containerizadas. Todo cluster possui ao menos um servidor de processamento (worker node). + +aka: +tags: +- fundamental +- operation +--- +Um conjunto de servidores de processamento, chamados {{< glossary_tooltip text="nós" term_id="node" >}}, que executam aplicações containerizadas. Todo cluster possui ao menos um servidor de processamento (_worker node_). + + +O servidor de processamento hospeda os {{< glossary_tooltip text="Pods" term_id="pod" >}} que são componentes de uma aplicação. O {{< glossary_tooltip text="ambiente de gerenciamento" term_id="control-plane" >}} gerencia os nós de processamento e os Pods no cluster. Em ambientes de produção, o ambiente de gerenciamento geralmente executa em múltiplos computadores e um cluster geralmente executa em múltiplos nós (_nodes_) , provendo tolerância a falhas e alta disponibilidade. + diff --git a/content/pt/docs/reference/glossary/control-plane.md b/content/pt/docs/reference/glossary/control-plane.md index 4befb3bb05..0465d5a2b8 100644 --- a/content/pt/docs/reference/glossary/control-plane.md +++ b/content/pt/docs/reference/glossary/control-plane.md @@ -1,5 +1,5 @@ --- -title: Control Plane +title: Ambiente de gerenciamento id: control-plane date: 2020-04-19 full_link: diff --git a/content/pt/docs/reference/glossary/node.md b/content/pt/docs/reference/glossary/node.md index 37c88c0343..536748f134 100755 --- a/content/pt/docs/reference/glossary/node.md +++ b/content/pt/docs/reference/glossary/node.md @@ -1,17 +1,17 @@ --- -title: Node +title: Nó id: node date: 2020-04-19 full_link: /docs/concepts/architecture/nodes/ short_description: > - Um Node é uma máquina de trabalho no Kubernetes. + Um Nó é uma máquina de trabalho no Kubernetes. aka: tags: - fundamental --- - Um Node é uma máquina de trabalho no Kubernetes. + Um Nó é uma máquina de trabalho no Kubernetes. -Um Node pode ser uma máquina virtual ou física, dependendo do cluster. Possui daemons ou serviços locais necessários para executar {{< glossary_tooltip text="Pods" term_id="pod" >}} e é gerenciado pelo {{< glossary_tooltip text="plano de controle" term_id="control-plane" >}}. Os daemons em um Node incluem {{< glossary_tooltip text="kubelet" term_id="kubelet" >}}, {{< glossary_tooltip text="kube-proxy" term_id="kube-proxy" >}} e um contêiner runtime implementando o {{< glossary_tooltip text="CRI" term_id="cri" >}} como por exemplo o {{< glossary_tooltip term_id="docker" >}}. \ No newline at end of file +Um Nó pode ser uma máquina virtual ou física, dependendo do cluster. Possui daemons ou serviços locais necessários para executar {{< glossary_tooltip text="Pods" term_id="pod" >}} e é gerenciado pelo {{< glossary_tooltip text="ambiente de gerenciamento" term_id="control-plane" >}}. Os daemons em um Node incluem {{< glossary_tooltip text="kubelet" term_id="kubelet" >}}, {{< glossary_tooltip text="kube-proxy" term_id="kube-proxy" >}} e um contêiner runtime implementando o {{< glossary_tooltip text="CRI" term_id="cri" >}} como por exemplo o {{< glossary_tooltip term_id="docker" >}}. \ No newline at end of file diff --git a/content/pt/docs/setup/_index.md b/content/pt/docs/setup/_index.md new file mode 100644 index 0000000000..a63307026f --- /dev/null +++ b/content/pt/docs/setup/_index.md @@ -0,0 +1,40 @@ +--- +no_issue: true +title: Instalação +main_menu: true +weight: 30 +content_type: concept +--- + + + +Essa seção lista as diferentes formas de instalar e executar o Kubernetes. Quando você realiza a instalação de um cluster Kubernetes, deve decidir o tipo de instalação baseado em critérios como facilidade de manutenção, segurança, controle, quantidade de recursos disponíveis e a experiência necessária para gerenciar e operar o cluster. + +Você pode criar um cluster Kubernetes em uma máquina local, na nuvem, em um datacenter on-premises ou ainda escolher uma oferta de um cluster Kubernetes gerenciado pelo seu provedor de computação em nuvem. + +Existem ainda diversos outros tipos de soluções customizadas, que você pode se deparar ao buscar formas de instalação e gerenciamento de seu cluster. + + + +## Ambientes de aprendizado + +Se você está aprendendo ou pretende aprender mais sobre o Kubernetes, use ferramentas suportadas pela comunidade, ou ferramentas no ecossistema que te permitam criar um cluster Kubernetes em sua máquina virtual. + +Temos como exemplo aqui o [Minikube](/docs/tasks/tools/install-minikube/) e o [KinD](https://kind.sigs.k8s.io/docs/user/quick-start/) + + +## Ambientes de produção + +Ao analisar uma solução para um ambiente de produção, devem ser considerados quais aspectos de operação de um cluster Kubernetes você deseja gerenciar, ou então delegar ao seu provedor. + +Temos diversas opções para esse provisionamento, desde o uso de uma ferramenta de deployment de um cluster tal qual o [Kubeadm](/docs/setup/production-environment/tools/kubeadm/install-kubeadm/) ou o [Kubespray](/docs/setup/production-environment/tools/kubespray/) quando se trata de um cluster local, ou ainda o uso de um cluster gerenciado por seu provedor de nuvem. + +Para a escolha do melhor ambiente e da melhor forma para fazer essa instalação, você deve considerar: + +* Se você deseja se preocupar com a gestão de backup da sua estrutura do ambiente de gerenciamento +* Se você deseja ter um cluster mais atualizado, com novas funcionalidades, ou se deseja seguir a versão suportada pelo fornecedor +* Se você deseja ter um cluster com um alto nível de serviço, ou com auto provisionamento de alta disponibilidade +* Quanto você deseja pagar por essa produção + + + diff --git a/content/pt/docs/tasks/_index.md b/content/pt/docs/tasks/_index.md new file mode 100644 index 0000000000..d36248475c --- /dev/null +++ b/content/pt/docs/tasks/_index.md @@ -0,0 +1,15 @@ +--- +title: Tarefas +main_menu: true +weight: 50 +content_type: concept +--- + + + +Essa seção da documentação contém páginas que mostram como executar tarefas individuais. + +Essas tarefas são organizadas em uma curta sequência de etapas e passos que te auxiliam a entender conceitos básicos. + +Se você desejar adicionar uma tarefa, verifique como +[criar um Pull Request para a documentação](/docs/contribute/new-content/open-a-pr/). diff --git a/content/pt/docs/tutorials/_index.md b/content/pt/docs/tutorials/_index.md new file mode 100644 index 0000000000..85941bc187 --- /dev/null +++ b/content/pt/docs/tutorials/_index.md @@ -0,0 +1,68 @@ +--- +title: Tutoriais +main_menu: true +no_list: true +weight: 60 +content_type: concept +--- + + + +Essa seção da documentação contém tutoriais (em inglês). Um tutorial mostra como realizar um objetivo mais complexo que uma simples [tarefa](/docs/tasks/). Eles podem ser divididos em diversas seções, cada uma com uma sequência de passos e etapas a serem seguidos. + +Antes de iniciar um tutorial, é interessante que vocẽ salve a página de [Glossário](/pt/docs/reference/glossary/) para futuras referências. + + + + +## Básicos + +* [Kubernetes básico](/docs/tutorials/kubernetes-basics/) é um tutorial interativo que auxilia no entendimento do ecossistema Kubernetes, bem como te permite testar algumas funcionalidades básicas do Kubernetes. + +* [Introdução ao Kubernetes (edX)](https://www.edx.org/course/introduction-kubernetes-linuxfoundationx-lfs158x#) é um curso gratuíto da edX que te guia no entendimento do Kubernetes, seus conceitos, bem como na execução de tarefas mais simples. + +* [Hello Minikube](/docs/tutorials/hello-minikube/) é um "Hello World" que te permite testar rapidamente o Kubernetes em sua estação com o uso do Minikube + +## Configuração + +* [Configurando o Redis usando um ConfigMap](/docs/tutorials/configuration/configure-redis-using-configmap/) + +## Aplicações stateless + +* [Expondo um Endereço de IP externo para acessar uma aplicação no Cluster](/docs/tutorials/stateless-application/expose-external-ip-address/) + +* [Exemplo: Implantando a aplicação de Livro de Visitas (Guestbook) em PHP com Redis](/docs/tutorials/stateless-application/guestbook/) + +## Aplicações stateful + +* [Básicos sobre StatefulSet](/docs/tutorials/stateful-application/basic-stateful-set/) + +* [Exemplo: WordPress e MySQL com Volumes Persistentes](/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/) + +* [Exemplo: Implantando Cassandra com Stateful Sets](/docs/tutorials/stateful-application/cassandra/) + +* [Executando ZooKeeper no Kubernetes](/docs/tutorials/stateful-application/zookeeper/) + +## Pipelines de CI/CD + +* [Configurando um Pipeline CI/CD com Kubernetes Parte 1: Visão Geral](https://www.linux.com/blog/learn/chapter/Intro-to-Kubernetes/2017/5/set-cicd-pipeline-kubernetes-part-1-overview) + +* [Configurando um Pipeline CI/CD com um Pod Jenkins no Kubernetes (Parte 2)](https://www.linux.com/blog/learn/chapter/Intro-to-Kubernetes/2017/6/set-cicd-pipeline-jenkins-pod-kubernetes-part-2) + +* [Executando e escalando um aplicativo distribuído de palavras cruzadas com CI/CD no Kubernetes (Parte 3)](https://www.linux.com/blog/learn/chapter/intro-to-kubernetes/2017/6/run-and-scale-distributed-crossword-puzzle-app-cicd-kubernetes-part-3) + +* [Configurando um CI/CD para um aplicativo distribuído de palavras cruzadas no Kubernetes (Parte 4)](https://www.linux.com/blog/learn/chapter/intro-to-kubernetes/2017/6/set-cicd-distributed-crossword-puzzle-app-kubernetes-part-4) + +## Clusters + +* [AppArmor](/docs/tutorials/clusters/apparmor/) + +## Serviços / "Services" + +* [Usando IP de origem](/docs/tutorials/services/source-ip/) + +## {{% heading "whatsnext" %}} + +Se você desejar escrever um tutorial, veja a página +[Utilizando templates](/docs/home/contribute/page-templates/) +para informações sobre o tipo de página e o formato a ser utilizado. diff --git a/content/zh/blog/_posts/2018-01-00-Kubernetes-V19-Beta-Windows-Support.md b/content/zh/blog/_posts/2018-01-00-Kubernetes-V19-Beta-Windows-Support.md new file mode 100644 index 0000000000..3567bb17f2 --- /dev/null +++ b/content/zh/blog/_posts/2018-01-00-Kubernetes-V19-Beta-Windows-Support.md @@ -0,0 +1,144 @@ +--- +title: Kubernetes 1.9 对 Windows Server 容器提供 Beta 版本支持 +date: 2018-01-09 +slug: kubernetes-v19-beta-windows-support +url: /blog/2018/01/Kubernetes-V19-Beta-Windows-Support +--- + + + +随着 Kubernetes v1.9 的发布,我们确保所有人在任何地方都能正常运行 Kubernetes 的使命前进了一大步。我们的 Beta 版本对 Windows Server 的支持进行了升级,并且在 Kubernetes 和 Windows 平台上都提供了持续的功能改进。为了在 Kubernetes 上运行许多特定于 Windows 的应用程序和工作负载,SIG-Windows 自2016年3月以来一直在努力,大大扩展了 Kubernetes 的实现场景和企业适用范围。 + + +各种规模的企业都在 .NET 和基于 Windows 的应用程序上进行了大量投资。如今许多企业产品组合都包含 .NET 和 Windows,Gartner 声称 [80%](http://www.gartner.com/document/3446217) 的企业应用都在 Windows 上运行。根据 StackOverflow Insights,40% 的专业开发人员使用 .NET 编程语言(包括 .NET Core)。 + + +但为什么这些信息都很重要?这意味着企业既有传统的,也有新生的云(microservice)应用程序,利用了大量的编程框架。业界正在大力推动将现有/遗留应用程序现代化到容器中,使用类似于“提升和转移”的方法。同时,也能灵活地向其他 Windows 或 Linux 容器引入新功能。容器正在成为打包、部署和管理现有程序和微服务应用程序的业界标准。IT 组织正在寻找一种更简单且一致的方法来跨 Linux 和 Windows 环境进行协调和管理容器。Kubernetes v1.9 现在对 Windows Server 容器提供了 Beta 版本支持,使之成为策划任何类型容器的明确选择。 + + + + +### 特点 +Kubernetes 中对 Windows Server 容器的 Alpha 支持是非常有用的,尤其是对于概念项目和可视化 Kubernetes 中 Windows 支持的路线图。然而,Alpha 版本有明显的缺点,并且缺少许多特性,特别是在网络方面。SIG Windows、Microsoft、Cloudbase Solutions、Apprenda 和其他社区成员联合创建了一个全面的 Beta 版本,使 Kubernetes 用户能够开始评估和使用 Windows。 + + +Kubernetes 对 Windows 服务器容器的一些关键功能改进包括: + +- 改进了对 Pod 的支持!Pod 中多个 Windows Server 容器现在可以使用 Windows Server 中的网络隔离专区共享网络命名空间。此功能中 Pod 的概念相当于基于 Linux 的容器 +- 可通过每个 Pod 使用单个网络端点来降低网络复杂性 +- 可以使用 Virtual Filtering Platform(VFP)的 Hyper-v Switch Extension(类似于 Linux iptables)达到基于内核的负载平衡 +- 具备 Container Runtime Interface(CRI)的 Pod 和 Node 级别的统计信息。可以使用从 Pod 和节点收集的性能指标配置 Windows Server 容器的 Horizontal Pod Autoscaling + +- 支持 kubeadm 命令将 Windows Server 的 Node 添加到 Kubernetes 环境。Kubeadm 简化了 Kubernetes 集群的配置,通过对 Windows Server 的支持,您可以在您的基础配置中使用单一的工具部署 Kubernetes +- 支持 ConfigMaps, Secrets, 和 Volumes。这些是非常关键的特性,您可以将容器的配置从实施体系中分离出来,并且在大部分情况下是安全的 +然而,kubernetes 1.9 windows 支持的最大亮点是网络增强。随着 Windows 服务器 1709 的发布,微软在操作系统和 Windows Host Networking Service(HNS)中启用了关键的网络功能,这为创造大量与 Kubernetes 中的 Windows 服务器容器一起工作的 CNI 插件铺平了道路。Kubernetes 1.9 支持的第三层路由和网络覆盖插件如下所示: + + +1. 上游 L3 路由 - 上游 ToR 中配置的 IP 路由 +2. Host-Gateway - 在每个主机上配置的 IP 路由 +3. 具有 Overlay 的 Open vSwitch(OVS)和 Open Virtual Network(OVN) - 支持 STT 和 Geneve 的 tunneling 类型 +您可以阅读更多有关 [配置、设置和运行时功能](/docs/getting-started-guides/windows/) 的信息,以便在 Kubernetes 中为您的网络堆栈做出明智的选择。 + + +如果您需要继续在 Linux 中运行 Kubernetes Control Plane 和 Master Components,现在也可以将 Windows Server 作为 Kubernetes 中的一个节点引入。对一个社区来说,这是一个巨大的里程碑和成就。现在,我们将会在 Kubernetes 中看到 .NET,.NET Core,ASP.NET,IIS,Windows 服务,Windows 可执行文件以及更多基于 Windows 的应用程序。 + + +### 接下来还会有什么 +这个 Beta 版本进行了大量工作,但是社区意识到在将 Windows 支持作为生产工作负载发布为 GA(General Availability)之前,我们需要更多领域的投资。2018年前两个季度的重点关注领域包括: + + +1. 继续在网络领域取得更多进展。其他 CNI 插件正在开发中,并且即将完成 +- Overlay - win-Overlay(vxlan 或 IP-in-IP 使用 Flannel 封装) +- Win-l2bridge(host-gateway) +- 使用云网络的 OVN - 不再依赖 Overlay +- 在 ovn-Kubernetes 中支持 Kubernetes 网络策略 +- 支持 Hyper-V Isolation +- 支持有状态应用程序的 StatefulSet 功能 +- 生成适用于任何基础架构以及跨多公共云提供商(例如 Microsoft Azure,Google Cloud 和 Amazon AWS)的安装工具和文档 +- SIG-Windows 的 Continuous Integration/Continuous Delivery(CI/CD)基础结构 +- 可伸缩性和性能测试 +尽管我们尚未承诺正式版的具体时间线,但估计 SIG-Windows 将于2018年上半年正式发布。 + + + + +### 加入我们 +随着我们在 Kubernetes 的普遍可用性方向不断取得进展,我们欢迎您参与进来,贡献代码、提供反馈,将 Windows 服务器容器部署到 Kubernetes 集群,或者干脆加入我们的社区。 + + +- 如果你想要开始在 Kubernetes 中部署 Windows Server 容器,请阅读我们的开始导览 [/docs/getting-started-guides/windows/](/docs/getting-started-guides/windows/) +- 我们每隔一个星期二在美国东部标准时间(EST)的12:30在 [https://zoom.us/my/sigwindows](https://zoom.us/my/sigwindows) 开会。所有会议内容都记录在 Youtube 并附上了参考材料 [https://www.youtube.com/playlist?list=PL69nYSiGNLP2OH9InCcNkWNu2bl-gmIU4](https://www.youtube.com/playlist?list=PL69nYSiGNLP2OH9InCcNkWNu2bl-gmIU4) +- 通过 Slack 联系我们 [https://kubernetes.slack.com/messages/sig-windows](https://kubernetes.slack.com/messages/sig-windows) +- 在 Github 上找到我们 [https://github.com/kubernetes/community/tree/master/sig-windows](https://github.com/kubernetes/community/tree/master/sig-windows) + + + + +谢谢大家, + +Michael Michael (@michmike77) +SIG-Windows 领导人 +Apprenda 产品管理高级总监 diff --git a/content/zh/blog/_posts/2018-10-01-health-checking-grpc.md b/content/zh/blog/_posts/2018-10-01-health-checking-grpc.md new file mode 100644 index 0000000000..f80633cf8a --- /dev/null +++ b/content/zh/blog/_posts/2018-10-01-health-checking-grpc.md @@ -0,0 +1,168 @@ +--- +layout: blog +title: '在 Kubernetes 上对 gRPC 服务器进行健康检查' +date: 2018-10-01 +--- + + + +**作者**: [Ahmet Alp Balkan](https://twitter.com/ahmetb) (Google) + + +[gRPC](https://grpc.io) 将成为本地云微服务间进行通信的通用语言。如果您现在将 gRPC 应用程序部署到 Kubernetes,您可能会想要了解配置健康检查的最佳方法。在本文中,我们将介绍 [grpc-health-probe](https://github.com/grpc-ecosystem/grpc-health-probe/),这是 Kubernetes 原生的健康检查 gRPC 应用程序的方法。 + + +如果您不熟悉,Kubernetes的 [健康检查](/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/)(存活探针和就绪探针)可以使您的应用程序在睡眠时保持可用状态。当检测到没有回应的 Pod 时,会将其标记为不健康,并使这些 Pod 重新启动或重新安排。 + + +Kubernetes 原本 [不支持](https://github.com/kubernetes/kubernetes/issues/21493) gRPC 健康检查。gRPC 的开发人员在 Kubernetes 中部署时可以采用以下三种方法: + +[![当前在 kubernetes 上进行 gRPC 健康检查的选项](/images/blog/2019-09-30-health-checking-grpc/options.png)](/images/blog/2019-09-30-health-checking-grpc/options.png) + + + +1. **httpGet prob:** 不能与 gRPC 一起使用。您需要重构您的应用程序,必须同时支持 gRPC 和 HTTP/1.1 协议(在不同的端口号上)。 +2. **tcpSocket probe:** 打开 gRPC 服务器的 Socket 是没有意义的,因为它无法读取响应主体。 +3. **exec probe:** 将定期调用容器生态系统中的程序。对于 gRPC,这意味着您要自己实现健康 RPC,然后使用容器编写并交付客户端工具。 + +我们可以做得更好吗?这是肯定的。 + + +## 介绍 “grpc-health-probe” + +为了使上述 "exec probe" 方法标准化,我们需要: + +- 可以在任何 gRPC 服务器中轻松实现的 **标准** 健康检查 "协议" 。 +- 一种 **标准** 健康检查 "工具" ,可以轻松查询健康协议。 + + +幸运的是,gRPC 具有 [标准的健康检查协议](https://github.com/grpc/grpc/blob/v1.15.0/doc/health-checking.md)。可以用任何语言轻松调用它。几乎所有实现 gRPC 的语言都附带了生成的代码和用于设置健康状态的实用程序。 + + +如果您在 gRPC 应用程序中 [实现](https://github.com/grpc/grpc/blob/v1.15.0/src/proto/grpc/health/v1/health.proto) 此健康检查协议,那么可以使用标准或通用工具调用 `Check()` 方法来确定服务器状态。 + + +接下来您需要的是 "标准工具" [**grpc-health-probe**](https://github.com/grpc-ecosystem/grpc-health-probe/)。 + + + + + + +使用此工具,您可以在所有 gRPC 应用程序中使用相同的健康检查配置。这种方法有以下要求: + + +1. 用您喜欢的语言找到 gRPC 的 "健康" 模块并开始使用它(例如 [Go 库](https://godoc.org/github.com/grpc/grpc-go/health))。 +2. 将二进制文件 [grpc_health_probe](https://github.com/grpc-ecosystem/grpc-health-probe/) 送到容器中。 +3. [配置](https://github.com/grpc-ecosystem/grpc-health-probe/tree/1329d682b4232c102600b5e7886df8ffdcaf9e26#example-grpc-health-checking-on-kubernetes) Kubernetes 的 "exec" 检查模块来调用容器中的 "grpc_health_probe" 工具。 + + +在这种情况下,执行 "grpc_health_probe" 将通过 `localhost` 调用您的 gRPC 服务器,因为它们位于同一个容器中。 + + +## 下一步工作 + +**grpc-health-probe** 项目仍处于初期阶段,需要您的反馈。它支持多种功能,例如与 TLS 服务器通信和配置延时连接/RPC。 + + +如果您最近要在 Kubernetes 上运行 gRPC 服务器,请尝试使用 gRPC Health Protocol,并在您的 Deployment 中尝试 grpc-health-probe,然后 [进行反馈](https://github.com/grpc-ecosystem/grpc-health-probe/)。 + + +## 更多内容 + +- 协议: [GRPC Health Checking Protocol](https://github.com/grpc/grpc/blob/v1.15.0/doc/health-checking.md) ([health.proto](https://github.com/grpc/grpc/blob/v1.15.0/src/proto/grpc/health/v1/health.proto)) +- 文档: [Kubernetes 存活和就绪探针](/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/) +- 文章: [升级版 Kubernetes 健康检查模式](https://ahmet.im/blog/advanced-kubernetes-health-checks/) diff --git a/content/zh/docs/concepts/architecture/control-plane-node-communication.md b/content/zh/docs/concepts/architecture/control-plane-node-communication.md index eafa80f804..23ae4e3919 100644 --- a/content/zh/docs/concepts/architecture/control-plane-node-communication.md +++ b/content/zh/docs/concepts/architecture/control-plane-node-communication.md @@ -5,9 +5,6 @@ weight: 20 --- - -本文对控制面节点(确切说是 apiserver)和 Kubernetes 集群之间的通信路径进行了分类。 +本文列举控制面节点(确切说是 API 服务器)和 Kubernetes 集群之间的通信路径。 目的是为了让用户能够自定义他们的安装,以实现对网络配置的加固,使得集群能够在不可信的网络上 (或者在一个云服务商完全公开的 IP 上)运行。 @@ -31,24 +27,22 @@ This document catalogs the communication paths between the control plane (really Kubernetes has a "hub-and-spoke" API pattern. All API usage from nodes (or the pods they run) terminate at the apiserver (none of the other control plane components are designed to expose remote services). The apiserver is configured to listen for remote connections on a secure HTTPS port (typically 443) with one or more forms of client [authentication](/docs/reference/access-authn-authz/authentication/) enabled. One or more forms of [authorization](/docs/reference/access-authn-authz/authorization/) should be enabled, especially if [anonymous requests](/docs/reference/access-authn-authz/authentication/#anonymous-requests) or [service account tokens](/docs/reference/access-authn-authz/authentication/#service-account-tokens) are allowed. --> - ## 节点到控制面 Kubernetes 采用的是中心辐射型(Hub-and-Spoke)API 模式。 所有从集群(或所运行的 Pods)发出的 API 调用都终止于 apiserver(其它控制面组件都没有被设计为可暴露远程服务)。 apiserver 被配置为在一个安全的 HTTPS 端口(443)上监听远程连接请求, -并启用一种或多种形式的客户端[身份认证](/docs/reference/access-authn-authz/authentication/)机制。 -一种或多种客户端[鉴权机制](/docs/reference/access-authn-authz/authorization/)应该被启用, -特别是在允许使用[匿名请求](/docs/reference/access-authn-autha/authentication/#anonymous-requests) -或[服务账号令牌](/docs/reference/access-authn-authz/authentication/#service-account-tokens)的时候。 +并启用一种或多种形式的客户端[身份认证](/zh/docs/reference/access-authn-authz/authentication/)机制。 +一种或多种客户端[鉴权机制](/zh/docs/reference/access-authn-authz/authorization/)应该被启用, +特别是在允许使用[匿名请求](/zh/docs/reference/access-authn-autha/authentication/#anonymous-requests) +或[服务账号令牌](/zh/docs/reference/access-authn-authz/authentication/#service-account-tokens)的时候。 - 应该使用集群的公共根证书开通节点,这样它们就能够基于有效的客户端凭据安全地连接 apiserver。 例如:在一个默认的 GCE 部署中,客户端凭据以客户端证书的形式提供给 kubelet。 -请查看 [kubelet TLS 启动引导](/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/) +请查看 [kubelet TLS 启动引导](/zh/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/) 以了解如何自动提供 kubelet 客户端证书。 - 想要连接到 apiserver 的 Pod 可以使用服务账号安全地进行连接。 当 Pod 被实例化时,Kubernetes 自动把公共根证书和一个有效的持有者令牌注入到 Pod 里。 `kubernetes` 服务(位于所有名字空间中)配置了一个虚拟 IP 地址,用于(通过 kube-proxy)转发 @@ -68,7 +61,6 @@ The control plane components also communicate with the cluster apiserver over th - 这样,从集群节点和节点上运行的 Pod 到控制面的连接的缺省操作模式即是安全的,能够在不可信的网络或公网上运行。 - ## 控制面到节点 从控制面(apiserver)到节点有两种主要的通信路径。 @@ -94,8 +85,7 @@ The connections from the apiserver to the kubelet are used for: These connections terminate at the kubelet's HTTPS endpoint. By default, the apiserver does not verify the kubelet's serving certificate, which makes the connection subject to man-in-the-middle attacks, and **unsafe** to run over untrusted and/or public networks. --> - -### apiserver 到 kubelet +### API 服务器到 kubelet 从 apiserver 到 kubelet 的连接用于: @@ -122,7 +112,8 @@ Finally, [Kubelet authentication and/or authorization](/docs/admin/kubelet-authe 如果无法实现这点,又要求避免在非受信网络或公共网络上进行连接,可在 apiserver 和 kubelet 之间使用 [SSH 隧道](#ssh-tunnels)。 -最后,应该启用 [Kubelet 用户认证和/或鉴权](/docs/admin/kubelet-authentication-authorization/)来保护 kubelet API。 +最后,应该启用 [Kubelet 用户认证和/或鉴权](/zh/docs/reference/command-line-tools-reference/kubelet-authentication-authorization/) +来保护 kubelet API。 - -在机器人技术和自动化中,控制回路是一个非终止回路,用于调节系统状态。 +在机器人技术和自动化领域,控制回路(Control Loop)是一个非终止回路,用于调节系统状态。 这是一个控制环的例子:房间里的温度自动调节器。 -当你设置了温度,告诉了温度自动调节器你的*期望状态*。房间的实际温度是*当前状态*。通过对设备的开关控制,温度自动调节器让其当前状态接近期望状态。 +当你设置了温度,告诉了温度自动调节器你的*期望状态(Desired State)*。 +房间的实际温度是*当前状态(Current State)*。 +通过对设备的开关控制,温度自动调节器让其当前状态接近期望状态。 {{< glossary_definition term_id="controller" length="short">}} - - - ## 控制器模式 {#controller-pattern} -一个控制器至少追踪一种类型的 Kubernetes 资源。这些[对象](/docs/concepts/overview/working-with-objects/kubernetes-objects/)有一个代表期望状态的指定字段。控制器负责确保其追踪的资源对象的当前状态接近期望状态。 +一个控制器至少追踪一种类型的 Kubernetes 资源。这些 +[对象](/zh/docs/concepts/overview/working-with-objects/kubernetes-objects/) +有一个代表期望状态的 `spec` 字段。 +该资源的控制器负责确保其当前状态接近期望状态。 -控制器可能会自行执行操作;在 Kubernetes 中更常见的是一个控制器会发送信息给 {{< glossary_tooltip text="API 服务器" term_id="kube-apiserver" >}},这会有副作用。看下面这个例子。 +控制器可能会自行执行操作;在 Kubernetes 中更常见的是一个控制器会发送信息给 +{{< glossary_tooltip text="API 服务器" term_id="kube-apiserver" >}},这会有副作用。 +具体可参看后文的例子。 {{< comment >}} -一些内置的控制器,比如命名空间控制器,针对没有指定命名空间的对象。为了简单起见,这篇文章没有详细介绍这些细节。 +一些内置的控制器,比如名字空间控制器,针对没有指定 `spec` 的对象。 +为了简单起见,本文没有详细介绍这些细节。 {{< /comment >}} - 创建新 Job 后,所期望的状态就是完成这个 Job。Job 控制器会让 Job 的当前状态不断接近期望状态:创建为 Job 要完成工作所需要的 Pod,使 Job 的状态接近完成。 控制器也会更新配置对象。例如:一旦 Job 的工作完成了,Job 控制器会更新 Job 对象的状态为 `Finished`。 @@ -145,7 +152,8 @@ nodes in your cluster. See 和外部状态交互的控制器从 API 服务器获取到它想要的状态,然后直接和外部系统进行通信并使当前状态更接近期望状态。 -(实际上有一个控制器可以水平地扩展集群中的节点。请看[集群自动扩缩容](/docs/tasks/administer-cluster/cluster-management/#cluster-autoscaling))。 +(实际上有一个控制器可以水平地扩展集群中的节点。请参阅 +[集群自动扩缩容](/zh/docs/tasks/administer-cluster/cluster-management/#cluster-autoscaling))。 - ## 期望状态与当前状态 {#desired-vs-current} Kubernetes 采用了系统的云原生视图,并且可以处理持续的变化。 -在任务执行时,集群随时都可能被修改,并且控制环会自动的修复故障。这意味着很可能集群永远不会达到稳定状态。 +在任务执行时,集群随时都可能被修改,并且控制回路会自动修复故障。这意味着很可能集群永远不会达到稳定状态。 只要集群中控制器的在运行并且进行有效的修改,整体状态的稳定与否是无关紧要的。 @@ -181,12 +188,17 @@ It's useful to have simple controllers rather than one, monolithic set of contro loops that are interlinked. Controllers can fail, so Kubernetes is designed to allow for that. -For example: a controller for Jobs tracks Job objects (to discover -new work) and Pod object (to run the Jobs, and then to see when the work is -finished). In this case something else creates the Jobs, whereas the Job -controller creates Pods. +--> +## 设计 {#design} -{{< note >}} +作为设计原则之一,Kubernetes 使用了很多控制器,每个控制器管理集群状态的一个特定方面。 +最常见的一个特定的控制器使用一种类型的资源作为它的期望状态, +控制器管理控制另外一种类型的资源向它的期望状态演化。 + +使用简单的控制器而不是一组相互连接的单体控制回路是很有用的。 +控制器会失败,所以 Kubernetes 的设计正是考虑到了这一点。 + + - -## 设计 {#design} - -作为设计的一个原则,Kubernetes 使用了很多控制器,每个控制器管理集群状态的一个特定方面。最常见的一个特定的控制器使用一种类型的资源作为它的期望状态,控制器管理控制另外一种类型的资源向它的期望状态发展。 - -使用简单的控制器而不是一组相互连接的单体控制环是很有用的。控制器会失败,所以 Kubernetes 的设计是考虑到了这一点。 - -例如:为 Job 追踪 Job 对象(发现新工作)和 Pod 对象(运行 Job,并且等工作完成)的控制器。在本例中,其它东西创建作业,而作业控制器创建 Pod。 - {{< note >}} -可以有多个控制器来创建或者更新相同类型的对象。在这之后,Kubernetes 控制器确保他们只关心和它们控制资源相关联的资源。 +可以有多个控制器来创建或者更新相同类型的对象。 +在后台,Kubernetes 控制器确保它们只关心与其控制资源相关联的资源。 -例如,你可以有 Deployments 和 Jobs;它们都可以创建 Pod。Job 控制器不删除 Deployment 创建的 Pod,因为有信息({{< glossary_tooltip term_id="label" text="标签" >}})让控制器可以区分这些 Pod。 +例如,你可以创建 Deployment 和 Job;它们都可以创建 Pod。 +Job 控制器不会删除 Deployment 所创建的 Pod,因为有信息 +({{< glossary_tooltip term_id="label" text="标签" >}})让控制器可以区分这些 Pod。 {{< /note >}} +## 运行控制器的方式 {#running-controllers} +Kubernetes 内置一组控制器,运行在 {{< glossary_tooltip term_id="kube-controller-manager" >}} 内。 +这些内置的控制器提供了重要的核心功能。 + +Deployment 控制器和 Job 控制器是 Kubernetes 内置控制器的典型例子。 +Kubernetes 允许你运行一个稳定的控制平面,这样即使某些内置控制器失败了, +控制平面的其他部分会接替它们的工作。 + +你会遇到某些控制器运行在控制面之外,用以扩展 Kubernetes。 +或者,如果你愿意,你也可以自己编写新控制器。 +你可以以一组 Pod 来运行你的控制器,或者运行在 Kubernetes 之外。 +最合适的方案取决于控制器所要执行的功能是什么。 + +## {{% heading "whatsnext" %}} + - -## 运行控制器的方式 {#running-controllers} - -Kubernetes 自带有一组内置的控制器,运行在 {{< glossary_tooltip term_id="kube-controller-manager" >}} 内。这些内置的控制器提供了重要的核心功能。 - -Deployment 控制器和 Job 控制器是 Kubernetes 内置控制器的典型例子。Kubernetes 运行一个弹性的控制平面,所以如果任意内置控制器失败了,控制平面的另外一部分会接替它的工作。 - -你会发现控制平面外面运行的控制器,扩展了 Kubernetes 的能力。或者,如果你愿意,你也可以写一个新控制器。你可以以一组 Pod 来运行你的控制器,或者运行在 Kubernetes 外面。什么是最合适的控制器,这将取决于特定控制器的功能。 - - - -## {{% heading "whatsnext" %}} - -* 请阅读 [Kubernetes 控制平面](/docs/concepts/#kubernetes-control-plane) -* 了解一些基本的 [Kubernetes 对象](/docs/concepts/#kubernetes-objects) -* 学习更多的 [Kubernetes API](/docs/concepts/overview/kubernetes-api/) -* 如果你想写自己的控制器,请看 Kubernetes 的[扩展模式](/docs/concepts/extend-kubernetes/extend-cluster/#extension-patterns)。 +* 阅读 [Kubernetes 控制面](/zh/docs/concepts/#kubernetes-control-plane) +* 了解 [Kubernetes 对象](/zh/docs/concepts/#kubernetes-objects) 的一些基本知识 +* 进一步学习 [Kubernetes API](/zh/docs/concepts/overview/kubernetes-api/) +* 如果你想编写自己的控制器,请看 Kubernetes 的[扩展模式](/zh/docs/concepts/extend-kubernetes/extend-cluster/#extension-patterns)。 diff --git a/content/zh/docs/concepts/architecture/nodes.md b/content/zh/docs/concepts/architecture/nodes.md index 143df96209..ac6d1f3e95 100644 --- a/content/zh/docs/concepts/architecture/nodes.md +++ b/content/zh/docs/concepts/architecture/nodes.md @@ -15,16 +15,206 @@ weight: 10 -在 Kubernetes 中,节点(Node)是执行工作的机器,以前叫做 `minion`。根据你的集群环境,节点可以是一个虚拟机或者物理机器。每个节点都包含用于运行 [pods](/docs/concepts/workloads/pods/pod/) 的必要服务,并由主控组件管理。节点上的服务包括 [容器运行时](/docs/concepts/overview/components/#node-components)、kubelet 和 kube-proxy。查阅架构设计文档中 [Kubernetes 节点](https://git.k8s.io/community/contributors/design-proposals/architecture/architecture.md#the-kubernetes-node) 一节获取更多细节。 +Kubernetes 通过将容器放入在节点(Node)上运行的 Pod 中来执行你的工作负载。 +节点可以是一个虚拟机或者物理机器,取决于所在的集群配置。每个节点都包含用于运行 +{{< glossary_tooltip text="Pod" term_id="pod" >}} 所需要的服务,这些服务由 +{{< glossary_tooltip text="控制面" term_id="control-plane" >}}负责管理。 + +通常集群中会有若干个节点;而在一个学习用或者资源受限的环境中,你的集群中也可能 +只有一个节点。 + +节点上的[组件](/zh/docs/concepts/overview/components/#node-components)包括 +{{< glossary_tooltip text="kubelet" term_id="kubelet" >}}、 +{{< glossary_tooltip text="容器运行时" term_id="container-runtime" >}}以及 +{{< glossary_tooltip text="kube-proxy" term_id="kube-proxy" >}}。 + +## 管理 {#management} + +向 {{< glossary_tooltip text="API 服务器" term_id="kube-apiserver" +>}}添加节点的方式主要有两种: + +1. 节点上的 `kubelet` 向控制面执行自注册; +2. 你,或者别的什么人,手动添加一个 Node 对象。 + +在你创建了 Node 对象或者节点上的 `kubelet` 执行了自注册操作之后, +控制面会检查新的 Node 对象是否合法。例如,如果你使用下面的 JSON +对象来创建 Node 对象: + +```json +{ + "kind": "Node", + "apiVersion": "v1", + "metadata": { + "name": "10.240.79.157", + "labels": { + "name": "my-first-k8s-node" + } + } +} +``` + + +Kubernetes 会在内部创建一个 Node 对象作为节点的表示。Kubernetes 检查 `kubelet` +向 API 服务器注册节点时使用的 `metadata.name` 字段是否匹配。 +如果节点是健康的(即所有必要的服务都在运行中),则该节点可以用来运行 Pod。 +否则,直到该节点变为健康之前,所有的集群活动都会忽略该节点。 + + +{{< note >}} +Kubernetes 会一直保存着非法节点对应的对象,并持续检查该节点是否已经 +变得健康。 +你,或者某个{{< glossary_tooltip term_id="controller" text="控制器">}}必需显式地 +删除该 Node 对象以停止健康检查操作。 +{{< /note >}} + + +Node 对象的名称必须是合法的 +[DNS 子域名](/zh/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)。 + + +### 节点自注册 + +当 kubelet 标志 `--register-node` 为 true(默认)时,它会尝试向 API 服务注册自己。 +这是首选模式,被绝大多数发行版选用。 + +对于自注册模式,kubelet 使用下列参数启动: + + + - `--kubeconfig` - 用于向 API 服务器表明身份的凭据路径。 + - `--cloud-provider` - 与某{{< glossary_tooltip text="云驱动" term_id="cloud-provider" >}} + 进行通信以读取与自身相关的元数据的方式。 + - `--register-node` - 自动向 API 服务注册。 + - `--register-with-taints` - 使用所给的污点列表(逗号分隔的 `=:`)注册节点。 + 当 `register-node` 为 false 时无效。 + - `--node-ip` - 节点 IP 地址。 + - `--node-labels` - 在集群中注册节点时要添加的 + {{< glossary_tooltip text="标签" term_id="label" >}}。 + (参见 [NodeRestriction 准入控制插件](/zh/docs/reference/access-authn-authz/admission-controllers/#noderestriction)所实施的标签限制)。 + - `--node-status-update-frequency` - 指定 kubelet 向控制面发送状态的频率。 + + +启用[节点授权模式](/zh/docs/reference/access-authn-authz/node/)和 +[NodeRestriction 准入插件](/zh/docs/reference/access-authn-authz/admission-controllers/#noderestriction) +时,仅授权 `kubelet` 创建或修改其自己的节点资源。 + + +#### 手动节点管理 + +你可以使用 {{< glossary_tooltip text="kubectl" term_id="kubectl" >}} +来创建和修改 Node 对象。 + +如果你希望手动创建节点对象时,请设置 kubelet 标志 `--register-node=false`。 + +你可以修改 Node 对象(忽略 `--register-node` 设置)。 +例如,修改节点上的标签或标记其为不可调度。 + + +你可以结合使用节点上的标签和 Pod 上的选择算符来控制调度。 +例如,你可以限制某 Pod 只能在符合要求的节点子集上运行。 + +如果标记节点为不可调度(unschedulable),将阻止新 Pod 调度到该节点之上,但不会 +影响任何已经在其上的 Pod。 +这是重启节点或者执行其他维护操作之前的一个有用的准备步骤。 + +要标记一个节点为不可调度,执行以下命令: + +```shell +kubectl cordon $NODENAME +``` + + +{{< note >}} +被 {{< glossary_tooltip term_id="daemonset" text="DaemonSet" >}} 控制器创建的 Pod +能够容忍节点的不可调度属性。 +DaemonSet 通常提供节点本地的服务,即使节点上的负载应用已经被腾空,这些服务也仍需 +运行在节点之上。 +{{< /note >}} - -## 节点状态 +## 节点状态 {#node-status} 一个节点的状态包含以下信息: * [地址](#addresses) -* [条件](#condition) +* [状况](#condition) * [容量与可分配](#capacity) * [信息](#info) -可以使用以下命令显示节点状态和有关节点的其他详细信息: +你可以使用 `kubectl` 来查看节点状态和其他细节信息: ```shell -kubectl describe node +kubectl describe node <节点名称> ``` - -下面对每个章节进行详细描述。 + + +下面对每个部分进行详细描述。 -### 地址 +### 地址 {#addresses} -这些字段组合的用法取决于你的云服务商或者裸机配置。 +这些字段的用法取决于你的云服务商或者物理机配置。 * HostName:由节点的内核设置。可以通过 kubelet 的 `--hostname-override` 参数覆盖。 -* ExternalIP:通常是节点的可以外部路由(从集群外可访问)的 IP 地址。 +* ExternalIP:通常是节点的可外部路由(从集群外可访问)的 IP 地址。 * InternalIP:通常是节点的仅可在集群内部路由的 IP 地址。 -### 条件 {#condition} +### 状况 {#condition} -`conditions` 字段描述了所有 `Running` 节点的状态。条件的示例包括: +`conditions` 字段描述了所有 `Running` 节点的状态。状况的示例包括: -| 节点条件 | 描述 | +{{< table caption = "节点状况及每种状况适用场景的描述" >}} +| 节点状况 | 描述 | |----------------|-------------| -| `OutOfDisk` | `True` 表示节点的空闲空间不足以用于添加新 Pods, 否则为 `False` | -| `Ready` | 表示节点是健康的并已经准备好接收 Pods;`False` 表示节点不健康而且不能接收 Pods;`Unknown` 表示节点控制器在最近 `node-monitor-grace-period` 期间(默认 40 秒)没有收到节点的消息 | +| `Ready` | 如节点是健康的并已经准备好接收 Pod 则为 `True`;`False` 表示节点不健康而且不能接收 Pod;`Unknown` 表示节点控制器在最近 `node-monitor-grace-period` 期间(默认 40 秒)没有收到节点的消息 | +| `DiskPressure` | `True` 表示节点的空闲空间不足以用于添加新 Pod, 否则为 `False` | | `MemoryPressure` | `True` 表示节点存在内存压力,即节点内存可用量低,否则为 `False` | -| `PIDPressure` | `True` 表示节点存在进程压力,即进程过多;否则为 `False` | -| `DiskPressure` | `True` 表示节点存在磁盘压力,即磁盘可用量低,否则为 `False` | +| `PIDPressure` | `True` 表示节点存在进程压力,即节点上进程过多;否则为 `False` | | `NetworkUnavailable` | `True` 表示节点网络配置不正确;否则为 `False` | + +{{< note >}} +如果使用命令行工具来打印已保护(Cordoned)节点的细节,其中的 Condition 字段可能 +包括 `SchedulingDisabled`。`SchedulingDisabled` 不是 Kubernetes API 中定义的 +Condition,被保护起来的节点在其规约中被标记为不可调度(Unschedulable)。 +{{< /note >}} + @@ -124,38 +323,40 @@ The node condition is represented as a JSON object. For example, the following r ``` -如果 Ready 条件处于状态 `Unknown` 或者 `False` 的时间超过了 `pod-eviction-timeout` -(一个传递给 [kube-controller-manager](/docs/admin/kube-controller-manager/) 的参数), -节点上的所有 Pods 都会被节点控制器计划删除。默认的逐出超时时长为 **5 分钟**。 -某些情况下,当节点不可访问时,apiserver 不能和其上的 kubelet 通信。 -删除 Pods 的决定不能传达给 kubelet,直到它重新建立和 apiserver 的连接为止。 -与此同时,被计划删除的 Pods 可能会继续在游离的节点上运行。 +如果 Ready 条件处于 `Unknown` 或者 `False` 状态的时间超过了 `pod-eviction-timeout` 值, +(一个传递给 {{< glossary_tooltip text="kube-controller-manager" term_id="kube-controller-manager" >}} 的参数), +节点上的所有 Pod 都会被节点控制器计划删除。默认的逐出超时时长为 **5 分钟**。 +某些情况下,当节点不可达时,API 服务器不能和其上的 kubelet 通信。 +删除 Pod 的决定不能传达给 kubelet,直到它重新建立和 API 服务器的连接为止。 +与此同时,被计划删除的 Pod 可能会继续在游离的节点上运行。 -在 1.5 版本之前的 Kubernetes 上,节点控制器会将不能访问的 Pods 从 apiserver 中 -[强制删除](/docs/concepts/workloads/pods/pod/#force-deletion-of-pods)。 -但在 1.5 或更高的版本里,在节点控制器确认这些 Pods 在集群中已经停止运行前,不会强制删除它们。 -你可以看到这些可能在无法访问的节点上运行的 Pods 处于 `Terminating` 或者 `Unknown` 状态。 -如果 kubernetes 不能基于下层基础设施推断出某节点是否已经永久离开了集群,集群管理员可能需要手动删除该节点对象。 -从 Kubernetes 删除节点对象将导致 apiserver 删除节点上所有运行的 Pod 对象并释放它们的名字。 +节点控制器在确认 Pod 在集群中已经停止运行前,不会强制删除它们。 +你可以看到这些可能在无法访问的节点上运行的 Pod 处于 `Terminating` 或者 `Unknown` 状态。 +如果 kubernetes 不能基于下层基础设施推断出某节点是否已经永久离开了集群, +集群管理员可能需要手动删除该节点对象。 +从 Kubernetes 删除节点对象将导致 API 服务器删除节点上所有运行的 Pod 对象并释放它们的名字。 -节点生命周期控制器会自动创建代表条件的[污点](/docs/concepts/configuration/taint-and-toleration/)。 -当调度器将 Pod 指派给某节点时,调度器会考虑节点上的污点,但是 Pod 可以容忍的污点除外。 +节点生命周期控制器会自动创建代表状况的 +[污点](/zh/docs/concepts/scheduling-eviction/taint-and-toleration/)。 +当调度器将 Pod 指派给某节点时,会考虑节点上的污点。 +Pod 则可以通过容忍度(Toleration)表达所能容忍的污点。 ### 容量与可分配 {#capacity} -描述节点上的可用资源:CPU、内存和可以调度到节点上的 Pods 的个数上限。 +描述节点上的可用资源:CPU、内存和可以调度到节点上的 Pod 的个数上限。 -capacity 块中的字段指示节点拥有的资源总量。allocatable 块指示节点上可供普通 Pod 消耗的资源量。 +`capacity` 块中的字段标示节点拥有的资源总量。 +`allocatable` 块指示节点上可供普通 Pod 消耗的资源量。 -可以在学习如何在节点上[保留计算资源](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable) -的同时阅读有关容量和可分配资源的更多信息。 +可以在学习如何在节点上[预留计算资源](/zh/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable) +的时了解有关容量和可分配资源的更多信息。 - -## 管理 -与 [Pods](/docs/concepts/workloads/pods/pod/) 和 [Services](/docs/concepts/services-networking/service/) 不同, -节点并不是在 Kubernetes 中从头创建的:它们由外部的云服务商(例如 Google Compute Engine)创建,或者是来自你的资源池 -中的物理机或者虚拟机。 -这意味着当 Kubernetes 创建一个节点时,它其实仅仅创建了一个对象来代表这个节点。 -创建以后,Kubernetes 将检查这个节点是否可用。例如,如果你尝试使用如下内容创建一个节点: - -```json -{ - "kind": "Node", - "apiVersion": "v1", - "metadata": { - "name": "10.240.79.157", - "labels": { - "name": "my-first-k8s-node" - } - } -} -``` - - -Kubernetes 会在内部创一个 Node 对象(用以表示节点),并基于 `metadata.name` 字段执行健康检查, -如果节点合法,即所有必要服务都处于运行状态,它就有资格运行 Pod;否则它将被所有的集群活动忽略直到其变为合法为止。 - - - -{{< note >}} -Kubernetes 保留无效节点所对应的对象,并持续检查它是否合法。 -若要停止这种检查,必须显式删除 Node 对象。 -{{< /note >}} - - -当前,有 3 个组件同 Kubernetes 节点接口交互:节点控制器、kubelet 和 kubectl。 +关于节点的一般性信息,例如内核版本、Kubernetes 版本(`kubelet` 和 `kube-proxy` 版本)、 +Docker 版本(如果使用了)和操作系统名称。这些信息由 `kubelet` 从节点上搜集而来。 -### 节点控制器 +### 节点控制器 {#node-controller} -节点控制器是一个 Kubernetes 控制面组件,管理节点的方方面面。 +节点{{< glossary_tooltip text="控制器" term_id="controller" >}}是 +Kubernetes 控制面组件,管理节点的方方面面。 -节点控制器在节点的生命周期中扮演多个角色。第一个是当节点注册时为它分配一个 CIDR 区间(如果启用了 CIDR 分配)。 +节点控制器在节点的生命周期中扮演多个角色。 +第一个是当节点注册时为它分配一个 CIDR 区段(如果启用了 CIDR 分配)。 -第二个保持节点控制器内部的节点列表与云服务商所提供的可用机器列表同步。 -如果在云环境下运行,当某节点不健康时,节点控制器将询问云服务是否节点的虚拟机可用。 +第二个是保持节点控制器内的节点列表与云服务商所提供的可用机器列表同步。 +如果在云环境下运行,只要某节点不健康,节点控制器就会询问云服务是否节点的虚拟机仍可用。 如果不可用,节点控制器会将该节点从它的节点列表删除。 第三个是监控节点的健康情况。节点控制器负责在节点不可达 (即,节点控制器因为某些原因没有收到心跳,例如节点宕机)时, -将它的 NodeStatus 的 NodeReady 条件更新为 ConditionUnknown。 -后续如果节点持续不可达,节点控制器将逐出节点上的所有 Pods(使用体面终止)。 -(默认情况下 40s 后开始报告 ConditionUnknown,在那之后 5m 开始逐出 Pods。) +将节点状态的 `NodeReady` 状况更新为 "`Unknown`"。 +如果节点接下来持续处于不可达状态,节点控制器将逐出节点上的所有 Pod(使用体面终止)。 +默认情况下 40 秒后开始报告 "`Unknown`",在那之后 5 分钟开始逐出 Pod。 节点控制器每隔 `--node-monitor-period` 秒检查每个节点的状态。 -#### 心跳机制 +#### 心跳机制 {#heartbeats} -Kubernetes 节点发送的心跳有助于确定节点的可用性。 -心跳有两种形式:`NodeStatus` 和 [`Lease` 对象](/docs/reference/generated/kubernetes-api/{{< latest-version >}}/#lease-v1-coordination-k8s-io)。 -每个节点在 `kube-node-lease`{{< glossary_tooltip term_id="namespace" text="命名空间">}} 中都有一个关联的 `Lease` 对象。 -`Lease` 是一种轻量级的资源,可在集群扩展时提高节点心跳机制的性能。 +Kubernetes 节点发送的心跳(Heartbeats)有助于确定节点的可用性。 +心跳有两种形式:`NodeStatus` 和 [`Lease` 对象] +(/docs/reference/generated/kubernetes-api/{{< latest-version >}}/#lease-v1-coordination-k8s-io)。 +每个节点在 `kube-node-lease`{{< glossary_tooltip term_id="namespace" text="名字空间">}} +中都有一个与之关联的 `Lease` 对象。 +`Lease` 是一种轻量级的资源,可在集群规模扩大时提高节点心跳机制的性能。 -kubelet 负责创建和更新 `NodeStatus` 和 `Lease` 对象。 +`kubelet` 负责创建和更新 `NodeStatus` 和 `Lease` 对象。 -- 当状态发生变化时,或者在配置的时间间隔内没有更新时,kubelet 会更新 `NodeStatus`。 +- 当状态发生变化时,或者在配置的时间间隔内没有更新事件时,kubelet 会更新 `NodeStatus`。 `NodeStatus` 更新的默认间隔为 5 分钟(比不可达节点的 40 秒默认超时时间长很多)。 -- kubelet 会每 10 秒(默认更新间隔时间)创建并更新其 `Lease` 对象。`Lease` 更新独立于 `NodeStatus` 更新而发生。 +- `kubelet` 会每 10 秒(默认更新间隔时间)创建并更新其 `Lease` 对象。 + `Lease` 更新独立于 `NodeStatus` 更新而发生。 + 如果 `Lease` 的更新操作失败,`kubelet` 会采用指数回退机制,从 200 毫秒开始 + 重试,最长重试间隔为 7 秒钟。 -#### 可靠性 - -在 Kubernetes 1.4 中我们更新了节点控制器逻辑以更好地处理大批量节点访问控制面而出问题的情况 -(例如,控制面节点的网络出了问题)。从 1.4 开始,节点控制器在决定逐出 Pod 之前 -会检查集群中所有节点的状态。 - - +#### 可靠性 {#reliability} -大部分情况下,节点控制器把驱逐速率限制在每秒 `--node-eviction-rate` 个(默认为 0.1)。 -这表示它每 10 秒钟内至多从一个节点驱逐 Pods。 +大部分情况下,节点控制器把逐出速率限制在每秒 `--node-eviction-rate` 个(默认为 0.1)。 +这表示它每 10 秒钟内至多从一个节点驱逐 Pod。 当一个可用区域(Availability Zone)中的节点变为不健康时,节点的驱逐行为将发生改变。 -节点控制器会同时检查可用区域中不健康(NodeReady 状态为 ConditionUnknown 或 ConditionFalse) +节点控制器会同时检查可用区域中不健康(NodeReady 状况为 Unknown 或 False) 的节点的百分比。如果不健康节点的比例超过 `--unhealthy-zone-threshold` (默认为 0.55), -驱逐速率将会降低:如果集群较小(意即小于等于 `--large-cluster-size-threshold` 个节点 - 默认为 50), -驱逐操作将会停止,否则驱逐速率将降为每秒 `--secondary-node-eviction-rate` 个(默认为 0.01)。 -在单个可用区域实施这些策略的原因是当一个可用区域可能从控制面脱离时其它可用区域可能仍然保持连接。 +驱逐速率将会降低:如果集群较小(意即小于等于 `--large-cluster-size-threshold` +个节点 - 默认为 50),驱逐操作将会停止,否则驱逐速率将降为每秒 +`--secondary-node-eviction-rate` 个(默认为 0.01)。 +在单个可用区域实施这些策略的原因是当一个可用区域可能从控制面脱离时其它可用区域 +可能仍然保持连接。 如果你的集群没有跨越云服务商的多个可用区域,那(整个集群)就只有一个可用区域。 -跨多个可用区域部署你的节点的一个关键原因是当某个可用区域整体出现故障时,工作负载可以转移到健康的可用区域。 -因此,如果一个可用区域中的所有节点都不健康时,节点控制器会以正常的速率 `--node-eviction-rate` 进行驱逐操作。 -在所有的可用区域都不健康(也即集群中没有健康节点)的极端情况下,节点控制器将假设控制面节点的连接出了某些问题, +跨多个可用区域部署你的节点的一个关键原因是当某个可用区域整体出现故障时, +工作负载可以转移到健康的可用区域。 +因此,如果一个可用区域中的所有节点都不健康时,节点控制器会以正常的速率 +`--node-eviction-rate` 进行驱逐操作。 +在所有的可用区域都不健康(也即集群中没有健康节点)的极端情况下, +节点控制器将假设控制面节点的连接出了某些问题, 它将停止所有驱逐动作直到一些连接恢复。 -从 Kubernetes 1.6 开始,NodeController 还负责驱逐运行在拥有 `NoExecute` 污点的节点上的 Pods,如果这些 Pods 没有容忍这些污点。 -此外,作为一个默认禁用的 alpha 特性,NodeController 还负责根据节点故障(例如节点不可访问或没有就绪)为其添加污点。 -请查看[这个文档](/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature)了解 `NoExecute` 污点 -和这个 alpha 特性。 +节点控制器还负责驱逐运行在拥有 `NoExecute` 污点的节点上的 Pod, +除非这些 Pod 能够容忍此污点。 +节点控制器还负责根据节点故障(例如节点不可访问或没有就绪)为其添加 +{{< glossary_tooltip text="污点" term_id="taint" >}}。 +这意味着调度器不会将 Pod 调度到不健康的节点上。 -从版本 1.8 开始,可以使节点控制器负责创建代表节点条件的污点。这是版本 1.8 的 Alpha 功能。 - - -### 节点自注册 - -当 kubelet 标志 `--register-node` 为 true (默认)时,它会尝试向 API 服务注册自己。 -这是首选模式,被绝大多数发行版选用。 - - -对于自注册模式,kubelet 使用下列参数启动: - - - - `--kubeconfig` - 用于向 apiserver 表明身份的凭据路径。 - - `--cloud-provider` - 如何从云服务商读取关于自己的元数据。 - - `--register-node` - 自动向 API 服务注册。 - - `--register-with-taints` - 使用污点列表(逗号分隔的 `=:`)注册节点。当 `register-node` 为 false 时无效。 - - `--node-ip` - 节点 IP 地址。 - - `--node-labels` - 在集群中注册节点时要添加的标签(请参阅 - [NodeRestriction 准入插件](/docs/reference/access-authn-authz/admission-controllers/#noderestriction) 在 1.13+ 中实施的标签限制)。 - - `--node-status-update-frequency` - 指定 kubelet 向控制面组件发送状态的频率。 - - -启用[节点授权模式](/docs/reference/access-authn-authz/node/) 和 -[NodeRestriction 准入插件](/docs/reference/access-authn-authz/admission-controllers/#noderestriction)时, -仅授权 kubelet 创建或修改其自己的节点资源。 - - -#### 手动节点管理 - -集群管理员可以创建及修改节点对象。 - - -如果管理员希望手动创建节点对象,请设置 kubelet 标志 `--register-node=false`。 - - -管理员可以修改节点资源(忽略 `--register-node` 设置)。修改包括在节点上设置标签及 -标记它为不可调度。 - - -节点上的标签可以和 Pods 的节点选择算符一起使用来控制调度,例如限制某 pod 只能在符合要求的节点子集上运行。 - - -如果标记节点为不可调度的(unschedulable),将阻止新 Pods 调度到该节点之上,但不会影响任何已经在其上的 Pods。 -这是重启节点等操作之前的一个有用的准备步骤。例如,要标记一个节点为不可调度的,执行以下命令: - -```shell -kubectl cordon $NODENAME -``` - - - -{{< note >}} -请注意,被 DaemonSet 控制器创建的 Pods 将忽略 Kubernetes 调度器,且不会遵照节点上不可调度的属性。 -这个假设基于守护程序属于节点机器,即使在准备重启而隔离应用的时候。 -{{< /note >}} +{{< caution>}} +`kubectl cordon` 会将节点标记为“不可调度(Unschedulable)”。 +此操作的副作用是,服务控制器会将该节点从负载均衡器中之前的目标节点列表中移除, +从而使得来自负载均衡器的网络请求不会到达被保护起来的节点。 +{{< /caution>}} -### 节点容量 +### 节点容量 {#node-capacity} -节点的容量(cpu 数量和内存容量)是节点对象的一部分。 -通常情况下,在创建节点对象时,它们会注册自己并报告自己的容量。 -如果你正在执行[手动节点管理](#manual-node-administration),那么你需要在添加节点时手动设置节点容量。 +Node 对象会跟踪节点上资源的容量(例如可用内存和 CPU 数量)。 +通过[自注册](#self-registration-of-nodes)机制生成的 Node 对象会在注册期间报告自身容量。 +如果你[手动](#manual-node-administration)添加了 Node,你就需要在添加节点时 +手动设置节点容量。 -Kubernetes 调度器保证一个节点上有足够的资源供其上的所有 Pods 使用。 -它会检查节点上所有容器的请求的总和不会超过节点的容量。 -这包括由 kubelet 启动的所有容器,但不包括由[容器运行时](/docs/concepts/overview/components/#node-components) -直接启动的容器,也不包括在容器外部运行的任何进程。 +Kubernetes {{< glossary_tooltip text="调度器" term_id="kube-scheduler" >}}保证节点上 +有足够的资源供其上的所有 Pod 使用。它会检查节点上所有容器的请求的总和不会超过节点的容量。 +总的请求包括由 kubelet 启动的所有容器,但不包括由容器运行时直接启动的容器, +也不包括不受 `kubelet` 控制的其他进程。 -如果要为非 Pod 进程显式保留资源。请参考[为系统守护程序保留资源](/docs/tasks/administer-cluster/reserve-compute-resources/#system-reserved)教程。 +{{< note >}} +如果要为非 Pod 进程显式保留资源。请参考 +[为系统守护进程预留资源](/zh/docs/tasks/administer-cluster/reserve-compute-resources/#system-reserved)。 +{{< /note >}} -## 节点拓扑 +## 节点拓扑 {#node-topology} -{{< feature-state state="alpha" >}} +{{< feature-state state="alpha" for_k8s_version="v1.16" >}} -如果启用了 `TopologyManager` [特性门控](/docs/reference/command-line-tools-reference/feature-gates/), -则 kubelet 可以在做出资源分配决策时使用拓扑提示。 - - -## API 对象 - -节点是 Kubernetes REST API 的顶级资源。 -更多关于 API 对象的细节可以在这里找到:[节点 API 对象](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#node-v1-core)。 +如果启用了 `TopologyManager` [特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/), +`kubelet` 可以在作出资源分配决策时使用拓扑提示。 +参考[控制节点上拓扑管理策略](/zh/docs/tasks/administer-cluster/topology-manager/) +了解详细信息。 ## {{% heading "whatsnext" %}} -* 了解有关[节点组件](/docs/concepts/overview/components/#node-components)的信息。 -* 阅读有关节点级拓扑的信息:[控制节点上的拓扑管理策略](/docs/tasks/administer-cluster/topology-manager/)。 +* 了解有关节点[组件](/zh/docs/concepts/overview/components/#node-components) +* 阅读[节点的 API 定义](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#node-v1-core) +* 阅读架构设计文档中有关[节点](https://git.k8s.io/community/contributors/design-proposals/architecture/architecture.md#the-kubernetes-node)的章节 +* 了解[污点和容忍度](/zh/docs/concepts/scheduling-eviction/taint-and-toleration/) +* 了解[集群自动扩缩](/zh/docs/tasks/administer-cluster/cluster-management/#cluster-autoscaling) diff --git a/content/zh/docs/concepts/cluster-administration/_index.md b/content/zh/docs/concepts/cluster-administration/_index.md index a494f4f42b..f0525696c3 100644 --- a/content/zh/docs/concepts/cluster-administration/_index.md +++ b/content/zh/docs/concepts/cluster-administration/_index.md @@ -1,5 +1,5 @@ --- -title: "集群管理" +title: 集群管理 weight: 100 content_type: concept description: > @@ -58,7 +58,7 @@ Before choosing a guide, here are some considerations: - Do you **just want to run a cluster**, or do you expect to do **active development of Kubernetes project code**? If the latter, choose an actively-developed distro. Some distros only use binary releases, but offer a greater variety of choices. -- Familiarize yourself with the [components](/docs/admin/cluster-components/) needed to run a cluster. +- Familiarize yourself with the [components](/docs/concepts/overview/components/) needed to run a cluster. --> - 你是打算在你的计算机上尝试 Kubernetes,还是要构建一个高可用的多节点集群?请选择最适合你需求的发行版。 - 您正在使用类似 [Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine/) 这样的**被托管的 Kubernetes 集群**, 还是**管理您自己的集群**? @@ -66,7 +66,7 @@ Before choosing a guide, here are some considerations: - **如果你在本地配置 Kubernetes**,需要考虑哪种[网络模型](/zh/docs/concepts/cluster-administration/networking/)最适合。 - 你的 Kubernetes 在**裸金属硬件**上还是**虚拟机(VMs)**上运行? - 你**只想运行一个集群**,还是打算**参与开发 Kubernetes 项目代码**?如果是后者,请选择一个处于开发状态的发行版。某些发行版只提供二进制发布版,但提供更多的选择。 -- 让你自己熟悉运行一个集群所需的[组件](/zh/docs/admin/cluster-components)。 +- 让你自己熟悉运行一个集群所需的[组件](/zh/docs/concepts/overview/components/)。 ### 保护 kubelet -* [主控节点通信](/zh/docs/concepts/cluster-administration/master-node-communication/) +* [主控节点通信](/zh/docs/concepts/architecture/control-plane-node-communication/) * [TLS 引导](/zh/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/) -* [Kubelet 认证/授权](/zh/docs/admin/kubelet-authentication-authorization/) +* [Kubelet 认证/授权](/zh/docs/reference/command-line-tools-reference/kubelet-authentication-authorization/) - - Add-ons 扩展了 Kubernetes 的功能。 本文列举了一些可用的 add-ons 以及到它们各自安装说明的链接。 -每个 add-ons 按字母顺序排序 - 顺序不代表任何优先地位。 - - - +每个 Add-ons 按字母顺序排序 - 顺序不代表任何优先地位。 @@ -45,33 +39,50 @@ Add-ons 扩展了 Kubernetes 的功能。 * [Romana](http://romana.io) is a Layer 3 networking solution for pod networks that also supports the [NetworkPolicy API](/docs/concepts/services-networking/network-policies/). Kubeadm add-on installation details available [here](https://github.com/romana/romana/tree/master/containerize). * [Weave Net](https://www.weave.works/docs/net/latest/kube-addon/) provides networking and network policy, will carry on working on both sides of a network partition, and does not require an external database. --> - ## 网络和网络策略 * [ACI](https://www.github.com/noironetworks/aci-containers) 通过 Cisco ACI 提供集成的容器网络和安全网络。 -* [Calico](https://docs.projectcalico.org/v3.11/getting-started/kubernetes/installation/calico) 是一个安全的 L3 网络和网络策略提供者。 +* [Calico](https://docs.projectcalico.org/v3.11/getting-started/kubernetes/installation/calico) + 是一个安全的 L3 网络和网络策略驱动。 * [Canal](https://github.com/tigera/canal/tree/master/k8s-install) 结合 Flannel 和 Calico,提供网络和网络策略。 -* [Cilium](https://github.com/cilium/cilium) 是一个 L3 网络和网络策略插件,能够透明的实施 HTTP/API/L7 策略。同时支持路由(routing)和叠加/封装(overlay/encapsulation)模式。 -* [CNI-Genie](https://github.com/Huawei-PaaS/CNI-Genie) 使 Kubernetes 无缝连接到一种 CNI 插件,例如:Flannel、Calico、Canal、Romana 或者 Weave。 -* [Contiv](http://contiv.github.io) 为多种用例提供可配置网络(使用 BGP 的原生 L3,使用 vxlan 的 overlay,经典 L2 和 Cisco-SDN/ACI)和丰富的策略框架。Contiv 项目完全[开源](http://github.com/contiv)。[安装工具](http://github.com/contiv/install)同时提供基于和不基于 kubeadm 的安装选项。 -* 基于 [Tungsten Fabric](https://tungsten.io) 的 [Contrail](http://www.juniper.net/us/en/products-services/sdn/contrail/contrail-networking/),是一个开源的多云网络虚拟化和策略管理平台,Contrail 和 Tungsten Fabric 与业务流程系统(例如 Kubernetes、OpenShift、OpenStack和Mesos)集成在一起,并为虚拟机、容器或 Pod 以及裸机工作负载提供了隔离模式。 -* [Flannel](https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml) 是一个可以用于 Kubernetes 的 overlay 网络提供者。 +* [Cilium](https://github.com/cilium/cilium) 是一个 L3 网络和网络策略插件,能够透明的实施 HTTP/API/L7 策略。 + 同时支持路由(routing)和覆盖/封装(overlay/encapsulation)模式。 +* [CNI-Genie](https://github.com/Huawei-PaaS/CNI-Genie) 使 Kubernetes 无缝连接到一种 CNI 插件, + 例如:Flannel、Calico、Canal、Romana 或者 Weave。 +* [Contiv](https://contiv.github.io) 为多种用例提供可配置网络(使用 BGP 的原生 L3,使用 vxlan 的覆盖网络, + 经典 L2 和 Cisco-SDN/ACI)和丰富的策略框架。Contiv 项目完全[开源](https://github.com/contiv)。 + [安装工具](https://github.com/contiv/install)同时提供基于和不基于 kubeadm 的安装选项。 +* 基于 [Tungsten Fabric](https://tungsten.io) 的 + [Contrail](https://www.juniper.net/us/en/products-services/sdn/contrail/contrail-networking/) + 是一个开源的多云网络虚拟化和策略管理平台,Contrail 和 Tungsten Fabric 与业务流程系统 + (例如 Kubernetes、OpenShift、OpenStack和Mesos)集成在一起, + 为虚拟机、容器或 Pod 以及裸机工作负载提供了隔离模式。 +* [Flannel](https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml) + 是一个可以用于 Kubernetes 的 overlay 网络提供者。 * [Knitter](https://github.com/ZTE/Knitter/) 是为 kubernetes 提供复合网络解决方案的网络组件。 -* [Multus](https://github.com/Intel-Corp/multus-cni) 是一个多插件,可在 Kubernetes 中提供多种网络支持,以支持所有 CNI 插件(例如 Calico,Cilium,Contiv,Flannel),而且包含了在 Kubernetes 中基于 SRIOV、DPDK、OVS-DPDK 和 VPP 的工作负载。 -* [NSX-T](https://docs.vmware.com/en/VMware-NSX-T/2.0/nsxt_20_ncp_kubernetes.pdf) 容器插件( NCP )提供了 VMware NSX-T 与容器协调器(例如 Kubernetes)之间的集成,以及 NSX-T 与基于容器的 CaaS / PaaS 平台(例如关键容器服务(PKS)和 OpenShift)之间的集成。 -* [Nuage](https://github.com/nuagenetworks/nuage-kubernetes/blob/v5.1.1-1/docs/kubernetes-1-installation.rst) 是一个 SDN 平台,可在 Kubernetes Pods 和非 Kubernetes 环境之间提供基于策略的联网,并具有可视化和安全监控。 -* [Romana](http://romana.io) 是一个 pod 网络的层 3 解决方案,并且支持 [NetworkPolicy API](/docs/concepts/services-networking/network-policies/)。Kubeadm add-on 安装细节可以在[这里](https://github.com/romana/romana/tree/master/containerize)找到。 -* [Weave Net](https://www.weave.works/docs/net/latest/kube-addon/) 提供了在网络分组两端参与工作的网络和网络策略,并且不需要额外的数据库。 +* [Multus](https://github.com/Intel-Corp/multus-cni) 是一个多插件,可在 Kubernetes 中提供多种网络支持, + 以支持所有 CNI 插件(例如 Calico,Cilium,Contiv,Flannel), + 而且包含了在 Kubernetes 中基于 SRIOV、DPDK、OVS-DPDK 和 VPP 的工作负载。 +* [NSX-T](https://docs.vmware.com/en/VMware-NSX-T/2.0/nsxt_20_ncp_kubernetes.pdf) 容器插件(NCP) + 提供了 VMware NSX-T 与容器协调器(例如 Kubernetes)之间的集成,以及 NSX-T 与基于容器的 + CaaS / PaaS 平台(例如关键容器服务(PKS)和 OpenShift)之间的集成。 +* [Nuage](https://github.com/nuagenetworks/nuage-kubernetes/blob/v5.1.1-1/docs/kubernetes-1-installation.rst) + 是一个 SDN 平台,可在 Kubernetes Pods 和非 Kubernetes 环境之间提供基于策略的联网,并具有可视化和安全监控。 +* [Romana](https://romana.io) 是一个 pod 网络的第三层解决方案,并支持[ + NetworkPolicy API](/zh/docs/concepts/services-networking/network-policies/)。 + Kubeadm add-on 安装细节可以在[这里](https://github.com/romana/romana/tree/master/containerize)找到。 +* [Weave Net](https://www.weave.works/docs/net/latest/kube-addon/) + 提供在网络分组两端参与工作的网络和网络策略,并且不需要额外的数据库。 - ## 服务发现 -* [CoreDNS](https://coredns.io) 是一种灵活的,可扩展的 DNS 服务器,可以[安装](https://github.com/coredns/deployment/tree/master/kubernetes)为集群内的 Pod 提供 DNS 服务。 +* [CoreDNS](https://coredns.io) 是一种灵活的,可扩展的 DNS 服务器,可以 + [安装](https://github.com/coredns/deployment/tree/master/kubernetes)为集群内的 Pod 提供 DNS 服务。 - ## 可视化管理 - -* [Dashboard](https://github.com/kubernetes/dashboard#kubernetes-dashboard) 是一个 Kubernetes 的 web 控制台界面。 -* [Weave Scope](https://www.weave.works/documentation/scope-latest-installing/#k8s) 是一个图形化工具,用于查看你的 containers、 pods、services 等。 请和一个 [Weave Cloud account](https://cloud.weave.works/) 一起使用,或者自己运行 UI。 +* [Dashboard](https://github.com/kubernetes/dashboard#kubernetes-dashboard) 是一个 Kubernetes 的 Web 控制台界面。 +* [Weave Scope](https://www.weave.works/documentation/scope-latest-installing/#k8s) 是一个图形化工具, + 用于查看你的容器、Pod、服务等。请和一个 [Weave Cloud 账号](https://cloud.weave.works/) 一起使用, + 或者自己运行 UI。 - ## 基础设施 -* [KubeVirt](https://kubevirt.io/user-guide/#/installation/installation) 是可以让 Kubernetes 运行虚拟机的 add-ons。通常运行在裸机集群上。 +* [KubeVirt](https://kubevirt.io/user-guide/#/installation/installation) 是可以让 Kubernetes + 运行虚拟机的 add-ons。通常运行在裸机集群上。 - ## 遗留 Add-ons 还有一些其它 add-ons 归档在已废弃的 [cluster/addons](https://git.k8s.io/kubernetes/cluster/addons) 路径中。 diff --git a/content/zh/docs/concepts/cluster-administration/certificates.md b/content/zh/docs/concepts/cluster-administration/certificates.md index 9c7e0a9174..75efede893 100644 --- a/content/zh/docs/concepts/cluster-administration/certificates.md +++ b/content/zh/docs/concepts/cluster-administration/certificates.md @@ -1,11 +1,13 @@ --- -cn-approvers: -- lichuqiang title: 证书 content_type: concept weight: 20 --- - + @@ -13,13 +15,9 @@ weight: 20 When using client certificate authentication, you can generate certificates manually through `easyrsa`, `openssl` or `cfssl`. --> - 当使用客户端证书进行认证时,用户可以使用现有部署脚本,或者通过 `easyrsa`、`openssl` 或 `cfssl` 手动生成证书。 - - - ### easyrsa @@ -27,7 +25,6 @@ manually through `easyrsa`, `openssl` or `cfssl`. - 使用 **easyrsa** 能够手动地为集群生成证书。 -1. 下载、解压并初始化 easyrsa3 的补丁版本。 +1. 下载、解压并初始化 easyrsa3 的补丁版本。 - curl -LO https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz - tar xzf easy-rsa.tar.gz - cd easy-rsa-master/easyrsa3 - ./easyrsa init-pki -1. 生成 CA(通过 `--batch` 参数设置自动模式。 通过 `--req-cn` 设置默认使用的 CN) + ``` + curl -LO https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz + tar xzf easy-rsa.tar.gz + cd easy-rsa-master/easyrsa3 + ./easyrsa init-pki + ``` - ./easyrsa --batch "--req-cn=${MASTER_IP}@`date +%s`" build-ca nopass -1. 生成服务器证书和密钥。 - 参数 `--subject-alt-name` 设置了访问 API 服务器时可能使用的 IP 和 DNS 名称。 `MASTER_CLUSTER_IP` - 通常为 `--service-cluster-ip-range` 参数中指定的服务 CIDR 的 首个 IP 地址,`--service-cluster-ip-range` 同时用于 - API 服务器和控制器管理器组件。 `--days` 参数用于设置证书的有效期限。 - 下面的示例还假设用户使用 `cluster.local` 作为默认的 DNS 域名。 +1. 生成 CA(通过 `--batch` 参数设置自动模式。 通过 `--req-cn` 设置默认使用的 CN) - ./easyrsa --subject-alt-name="IP:${MASTER_IP},"\ + ``` + ./easyrsa --batch "--req-cn=${MASTER_IP}@`date +%s`" build-ca nopass + ``` + +1. 生成服务器证书和密钥。 + 参数 `--subject-alt-name` 设置了访问 API 服务器时可能使用的 IP 和 DNS 名称。 + `MASTER_CLUSTER_IP` 通常为 `--service-cluster-ip-range` 参数中指定的服务 CIDR 的 首个 IP 地址, + `--service-cluster-ip-range` 同时用于 API 服务器和控制器管理器组件。 + `--days` 参数用于设置证书的有效期限。 + 下面的示例还假设用户使用 `cluster.local` 作为默认的 DNS 域名。 + + ``` + ./easyrsa --subject-alt-name="IP:${MASTER_IP},"\ "IP:${MASTER_CLUSTER_IP},"\ "DNS:kubernetes,"\ "DNS:kubernetes.default,"\ @@ -91,12 +96,17 @@ manually through `easyrsa`, `openssl` or `cfssl`. "DNS:kubernetes.default.svc.cluster.local" \ --days=10000 \ build-server-full server nopass -1. 拷贝 `pki/ca.crt`、 `pki/issued/server.crt` 和 `pki/private/server.key` 至您的目录。 -1. 填充并在 API 服务器的启动参数中添加以下参数: + ``` - --client-ca-file=/yourdirectory/ca.crt - --tls-cert-file=/yourdirectory/server.crt - --tls-private-key-file=/yourdirectory/server.key +1. 拷贝 `pki/ca.crt`、`pki/issued/server.crt` 和 `pki/private/server.key` 至您的目录。 + +1. 填充并在 API 服务器的启动参数中添加以下参数: + + ``` + --client-ca-file=/yourdirectory/ca.crt + --tls-cert-file=/yourdirectory/server.crt + --tls-private-key-file=/yourdirectory/server.key + ``` ### openssl @@ -168,69 +178,87 @@ manually through `easyrsa`, `openssl` or `cfssl`. 使用 **openssl** 能够手动地为集群生成证书。 -1. 生成密钥位数为 2048 的 ca.key: +1. 生成密钥位数为 2048 的 ca.key: - openssl genrsa -out ca.key 2048 -1. 依据 ca.key 生成 ca.crt (使用 -days 参数来设置证书有效时间): + ``` + openssl genrsa -out ca.key 2048 + ``` - openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 10000 -out ca.crt -1. 生成密钥位数为 2048 的 server.key: +1. 依据 ca.key 生成 ca.crt (使用 -days 参数来设置证书有效时间): - openssl genrsa -out server.key 2048 -1. 创建用于生成证书签名请求(CSR)的配置文件。 - 确保在将其保存至文件(如 `csr.conf`)之前将尖括号标记的值(如 ``) - 替换为你想使用的真实值。 注意:`MASTER_CLUSTER_IP` 是前面小节中描述的 API 服务器的服务集群 IP - (service cluster IP)。 下面的示例也假设用户使用 `cluster.local` 作为默认的 DNS 域名。 + ``` + openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 10000 -out ca.crt + ``` - [ req ] - default_bits = 2048 - prompt = no - default_md = sha256 - req_extensions = req_ext - distinguished_name = dn +1. 生成密钥位数为 2048 的 server.key: - [ dn ] - C = - ST = - L = - O = - OU = - CN = + ``` + openssl genrsa -out server.key 2048 + ``` +1. 创建用于生成证书签名请求(CSR)的配置文件。 + 确保在将其保存至文件(如 `csr.conf`)之前将尖括号标记的值(如 ``) + 替换为你想使用的真实值。 注意:`MASTER_CLUSTER_IP` 是前面小节中描述的 API 服务器的服务集群 IP + (service cluster IP)。 下面的示例也假设用户使用 `cluster.local` 作为默认的 DNS 域名。 - [ req_ext ] - subjectAltName = @alt_names + ``` + [ req ] + default_bits = 2048 + prompt = no + default_md = sha256 + req_extensions = req_ext + distinguished_name = dn - [ alt_names ] - DNS.1 = kubernetes - DNS.2 = kubernetes.default - DNS.3 = kubernetes.default.svc - DNS.4 = kubernetes.default.svc.cluster - DNS.5 = kubernetes.default.svc.cluster.local - IP.1 = - IP.2 = + [ dn ] + C = <国家> + ST = <州/省> + L = <市> + O = <组织> + OU = <部门> + CN = - [ v3_ext ] - authorityKeyIdentifier=keyid,issuer:always - basicConstraints=CA:FALSE - keyUsage=keyEncipherment,dataEncipherment - extendedKeyUsage=serverAuth,clientAuth - subjectAltName=@alt_names -1. 基于配置文件生成证书签名请求: + [ req_ext ] + subjectAltName = @alt_names - openssl req -new -key server.key -out server.csr -config csr.conf -1. 使用 ca.key、ca.crt 和 server.csr 生成服务器证书: + [ alt_names ] + DNS.1 = kubernetes + DNS.2 = kubernetes.default + DNS.3 = kubernetes.default.svc + DNS.4 = kubernetes.default.svc.cluster + DNS.5 = kubernetes.default.svc.cluster.local + IP.1 = + IP.2 = - openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \ - -CAcreateserial -out server.crt -days 10000 \ - -extensions v3_ext -extfile csr.conf -1. 查看证书: + [ v3_ext ] + authorityKeyIdentifier=keyid,issuer:always + basicConstraints=CA:FALSE + keyUsage=keyEncipherment,dataEncipherment + extendedKeyUsage=serverAuth,clientAuth + subjectAltName=@alt_names + ``` - openssl x509 -noout -text -in ./server.crt +1. 基于配置文件生成证书签名请求: + + ``` + openssl req -new -key server.key -out server.csr -config csr.conf + ``` + +1. 使用 ca.key、ca.crt 和 server.csr 生成服务器证书: + + ``` + openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \ + -CAcreateserial -out server.crt -days 10000 \ + -extensions v3_ext -extfile csr.conf + ``` + +1. 查看证书: + + ``` + openssl x509 -noout -text -in ./server.crt + ``` - 最后,添加同样的参数到 API 服务器的启动参数中。 ### cfssl @@ -238,8 +266,7 @@ Finally, add the same parameters into the API server start parameters. - -**cfssl** 是另一种用来生成证书的工具。 +**cfssl** 是用来生成证书的另一种工具。 +1. 按如下所示的方式下载、解压并准备命令行工具。 + 注意:你可能需要基于硬件架构和你所使用的 cfssl 版本对示例命令进行修改。 -1. 按如下所示的方式下载、解压并准备命令行工具。 - 注意:你可能需要基于硬件架构和你所使用的 cfssl 版本对示例命令进行修改。 + ``` + curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o cfssl + chmod +x cfssl + curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o cfssljson + chmod +x cfssljson + curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o cfssl-certinfo + chmod +x cfssl-certinfo + ``` - curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o cfssl - chmod +x cfssl - curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o cfssljson - chmod +x cfssljson - curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o cfssl-certinfo - chmod +x cfssl-certinfo -1. 创建目录来存放物料,并初始化 cfssl: +1. 创建目录来存放物料,并初始化 cfssl: - mkdir cert - cd cert - ../cfssl print-defaults config > config.json - ../cfssl print-defaults csr > csr.json -1. 创建用来生成 CA 文件的 JSON 配置文件,例如 `ca-config.json`: + ``` + mkdir cert + cd cert + ../cfssl print-defaults config > config.json + ../cfssl print-defaults csr > csr.json + ``` - { - "signing": { - "default": { - "expiry": "8760h" - }, - "profiles": { - "kubernetes": { - "usages": [ - "signing", - "key encipherment", - "server auth", - "client auth" - ], - "expiry": "8760h" - } - } - } - } -1. 创建用来生成 CA 证书签名请求(CSR)的 JSON 配置文件,例如 `ca-csr.json`。 - 确保将尖括号标记的值替换为你想使用的真实值。 +1. 创建用来生成 CA 文件的 JSON 配置文件,例如 `ca-config.json`: - { - "CN": "kubernetes", - "key": { - "algo": "rsa", - "size": 2048 - }, - "names":[{ - "C": "", - "ST": "", - "L": "", - "O": "", - "OU": "" - }] - } -1. 生成 CA 密钥(`ca-key.pem`)和证书(`ca.pem`): + ``` + { + "signing": { + "default": { + "expiry": "8760h" + }, + "profiles": { + "kubernetes": { + "usages": [ + "signing", + "key encipherment", + "server auth", + "client auth" + ], + "expiry": "8760h" + } + } + } + } + ``` - ../cfssl gencert -initca ca-csr.json | ../cfssljson -bare ca -1. 按如下所示的方式创建用来为 API 服务器生成密钥和证书的 JSON 配置文件。 - 确保将尖括号标记的值替换为你想使用的真实值。 `MASTER_CLUSTER_IP` 是前面小节中描述的 - API 服务器的服务集群 IP。 下面的示例也假设用户使用 `cluster.local` 作为默认的 DNS 域名。 +1. 创建用来生成 CA 证书签名请求(CSR)的 JSON 配置文件,例如 `ca-csr.json`。 + 确保将尖括号标记的值替换为你想使用的真实值。 - { - "CN": "kubernetes", - "hosts": [ - "127.0.0.1", - "", - "", - "kubernetes", - "kubernetes.default", - "kubernetes.default.svc", - "kubernetes.default.svc.cluster", - "kubernetes.default.svc.cluster.local" - ], - "key": { - "algo": "rsa", - "size": 2048 - }, - "names": [{ - "C": "", - "ST": "", - "L": "", - "O": "", - "OU": "" - }] - } -1. 为 API 服务器生成密钥和证书,生成的秘钥和证书分别默认保存在文件 `server-key.pem` - 和 `server.pem` 中: + ``` + { + "CN": "kubernetes", + "key": { + "algo": "rsa", + "size": 2048 + }, + "names":[{ + "C": "", + "ST": "", + "L": "", + "O": "", + "OU": "" + }] + } + ``` - ../cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \ +1. 生成 CA 密钥(`ca-key.pem`)和证书(`ca.pem`): + + ``` + ../cfssl gencert -initca ca-csr.json | ../cfssljson -bare ca + ``` + +1. 按如下所示的方式创建用来为 API 服务器生成密钥和证书的 JSON 配置文件。 + 确保将尖括号标记的值替换为你想使用的真实值。 `MASTER_CLUSTER_IP` 是前面小节中描述的 + API 服务器的服务集群 IP。 下面的示例也假设用户使用 `cluster.local` 作为默认的 DNS 域名。 + + ``` + { + "CN": "kubernetes", + "hosts": [ + "127.0.0.1", + "", + "", + "kubernetes", + "kubernetes.default", + "kubernetes.default.svc", + "kubernetes.default.svc.cluster", + "kubernetes.default.svc.cluster.local" + ], + "key": { + "algo": "rsa", + "size": 2048 + }, + "names": [{ + "C": "", + "ST": "", + "L": "", + "O": "", + "OU": "" + }] + } + ``` + +1. 为 API 服务器生成密钥和证书,生成的秘钥和证书分别默认保存在文件 `server-key.pem` + 和 `server.pem` 中: + + ``` + ../cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \ --config=ca-config.json -profile=kubernetes \ server-csr.json | ../cfssljson -bare server - + ``` - ## 分发自签名 CA 证书 客户端节点可能拒绝承认自签名 CA 证书有效。 @@ -467,10 +511,9 @@ You can use the `certificates.k8s.io` API to provision x509 certificates to use for authentication as documented [here](/docs/tasks/tls/managing-tls-in-a-cluster). --> - ## 证书 API -您可以按照[这里](/docs/tasks/tls/managing-tls-in-a-cluster)记录的方式, +您可以按照[这里](/zh/docs/tasks/tls/managing-tls-in-a-cluster)记录的方式, 使用 `certificates.k8s.io` API 来准备 x509 证书,用于认证。 diff --git a/content/zh/docs/concepts/cluster-administration/cloud-providers.md b/content/zh/docs/concepts/cluster-administration/cloud-providers.md index f568c57304..b463f1eb1f 100644 --- a/content/zh/docs/concepts/cluster-administration/cloud-providers.md +++ b/content/zh/docs/concepts/cluster-administration/cloud-providers.md @@ -5,11 +5,9 @@ weight: 30 --- @@ -28,7 +26,8 @@ kubeadm has configuration options to specify configuration information for cloud in-tree cloud provider can be configured using kubeadm as shown below: --> ### kubeadm -[kubeadm](/docs/reference/setup-tools/kubeadm/kubeadm/) 是创建 kubernetes 集群的一种流行选择。 + +[kubeadm](/zh/docs/reference/setup-tools/kubeadm/kubeadm/) 是创建 kubernetes 集群的一种流行选择。 kubeadm 通过提供配置选项来指定云驱动的配置信息。例如,一个典型的适用于“树内”云驱动的 kubeadm 配置如下: ```yaml @@ -68,9 +67,14 @@ for the [kube-apiserver](/docs/admin/kube-apiserver/), [kube-controller-manager] For all external cloud providers, please follow the instructions on the individual repositories, which are listed under their headings below, or one may view [the list of all repositories](https://github.com/kubernetes?q=cloud-provider-&type=&language=) --> - -“树内”的云驱动通常需要在命令行中为 [kube-apiserver](/docs/admin/kube-apiserver/)、[kube-controller-manager](/docs/admin/kube-controller-manager/) 和 [kubelet](/docs/admin/kubelet/) 指定 `--cloud-provider` 和 `--cloud-config`。在 `--cloud-config` 中为每个供应商指定的文件的内容也同样需要写在下面。 -对于所有外部云驱动,请遵循独立云存储库的说明,或浏览[所有版本库清单](https://github.com/kubernetes?q=cloud-provider-&type=&language=) +“树内”的云驱动通常需要在命令行中为 +[kube-apiserver](/zh/docs/reference/command-line-tools-reference/kube-apiserver/)、 +[kube-controller-manager](/zh/docs/reference/command-line-tools-reference/kube-controller-manager/) 和 +[kubelet](/zh/docs/reference/command-line-tools-reference/kubelet/) 指定 +`--cloud-provider` 和 `--cloud-config`。 +在 `--cloud-config` 中为每个供应商指定的文件内容的文档也可参见本文后文。 +对于所有外部云驱动,请遵循各自仓库的说明,或浏览 +[所有仓库清单](https://github.com/kubernetes?q=cloud-provider-&type=&language=) - # AWS + 本节介绍在 Amazon Web Services 上运行 Kubernetes 时可以使用的所有配置。 如果希望使用此外部云驱动,其代码库位于 [kubernetes/cloud-provider-aws](https://github.com/kubernetes/cloud-provider-aws#readme) @@ -100,7 +104,9 @@ to use specific features in AWS by configuring the annotations as shown below. --> ### 负载均衡器 -用户可以通过配置注解(annotations)来设置 [外部负载均衡器](/docs/tasks/access-application-cluster/create-external-load-balancer/),以在 AWS 中使用特定功能,如下所示: +用户可以通过配置注解(annotations)来设置 +[外部负载均衡器](/zh/docs/tasks/access-application-cluster/create-external-load-balancer/), +以在 AWS 中使用特定功能,如下所示: ```yaml apiVersion: v1 @@ -125,7 +131,6 @@ spec: - 可以使用 _注解_ 将不同的设置应用于 AWS 中的负载均衡器服务。下面描述了 AWS ELB 所支持的注解: - AWS 相关的注解信息取自 [aws.go](https://github.com/kubernetes/cloud-provider-aws/blob/master/pkg/cloudprovider/providers/aws/aws.go) 文件的注释。 ## Azure @@ -182,7 +193,6 @@ If you wish to use the external cloud provider, its repository is [kubernetes/cl The Azure cloud provider uses the hostname of the node (as determined by the kubelet or overridden with `--hostname-override`) as the name of the Kubernetes Node object. Note that the Kubernetes Node name must match the Azure VM name. --> - ### 节点名称 云驱动 Azure 使用节点的主机名(由 kubelet 决定,或者用 `--hostname-override` 覆盖)作为 Kubernetes 节点对象的名称。 @@ -202,7 +212,6 @@ If you wish to use the external cloud provider, its repository is [apache/clouds The CloudStack cloud provider uses the hostname of the node (as determined by the kubelet or overridden with `--hostname-override`) as the name of the Kubernetes Node object. Note that the Kubernetes Node name must match the CloudStack VM name. --> - ### 节点名称 云驱动 CloudStack 使用节点的主机名(由 kubelet 决定,或者用 `--hostname-override` 覆盖)作为 Kubernetes 节点对象的名称。 @@ -212,7 +221,6 @@ Note that the Kubernetes Node name must match the CloudStack VM name. - 如果希望使用此外部云驱动,其代码库位于 [kubernetes/cloud-provider-gcp](https://github.com/kubernetes/cloud-provider-gcp#readme) - ### 节点名称 GCE 云驱动使用节点的主机名(由 kubelet 确定,或者用 `--hostname-override` 覆盖)作为 Kubernetes 节点对象的名称。 @@ -244,7 +251,6 @@ If you wish to use the external cloud provider, its repository is [kubernetes/cl The OpenStack cloud provider uses the instance name (as determined from OpenStack metadata) as the name of the Kubernetes Node object. Note that the instance name must be a valid Kubernetes Node name in order for the kubelet to successfully register its Node object. --> - ### 节点名称 OpenStack 云驱动使用实例名(由 OpenStack 元数据确定)作为 Kubernetes 节点对象的名称。 @@ -286,12 +292,12 @@ a future release. As of the "Queens" release, OpenStack will no longer expose th Identity V2 API. § Load Balancing V1 API support was removed in Kubernetes 1.9. --> +† 块存储 V1 版本的 API 被弃用,从 Kubernetes 1.9 版本开始加入了块存储 V3 版本 API。 -† Block Storage V1 版本的 API 被弃用,从 Kubernetes 1.9 版本开始加入了 Block Storage V3 版本 API。 +‡ 身份认证 V2 API 支持已被弃用,将在未来的版本中从供应商中移除。 + 从 “Queens” 版本开始,OpenStack 将不再支持身份认证 V2 版本的 API。 -‡ Identity V2 API 支持已被弃用,将在未来的版本中从供应商中移除。从 “Queens” 版本开始,OpenStack 将不再支持 Identity V2 版本的 API。 - -§ Kubernetes 1.9 中取消了对 V1 版本 Load Balancing API 的支持。 +§ Kubernetes 1.9 中取消了对 V1 版本负载均衡 API 的支持。 - 服务发现是通过使用供应商配置中提供的 `auth-url` 所列出 OpenStack 身份认证(Keystone)管理的服务目录来实现的。 当除 Keystone 外的 OpenStack 服务不可用时,供应商将优雅地降低功能,并简单地放弃对受影响特性的支持。 某些功能还可以根据 Neutron 在底层云中发布的扩展列表启用或禁用。 ### cloud.conf + - -Kubernetes 知道如何通过 cloud.conf 文件与 OpenStack 交互。该文件将为 Kubernetes 提供 OpenStack 验证端点的凭据和位置。 +Kubernetes 知道如何通过 cloud.conf 文件与 OpenStack 交互。 +该文件将为 Kubernetes 提供 OpenStack 验证端点的凭据和位置。 用户可在创建 cloud.conf 文件时指定以下信息: #### 典型配置 -下面是一个典型配置的例子,它涉及到最常设置的值。它将供应商指向 OpenStack 云的 Keystone 端点,提供如何使用它进行身份验证的细节,并配置负载均衡器: +下面是一个典型配置的例子,它涉及到最常设置的值。它将供应商指向 OpenStack 云的 Keystone 端点, +提供如何使用它进行身份验证的细节,并配置负载均衡器: ```yaml [Global] @@ -344,7 +351,6 @@ These configuration options for the OpenStack provider pertain to its global configuration and should appear in the `[Global]` section of the `cloud.conf` file: --> - ##### 全局配置 这些配置选项属于 OpenStack 驱动的全局配置,并且应该出现在 `cloud.conf` 文件中的 `[global]` 部分: @@ -377,22 +383,26 @@ file: * `ca-file` (Optional): Used to specify the path to your custom CA file. --> -* `auth-url` (必需): 用于认证的 keystone API 的 URL。在 OpenStack 控制面板中,这可以在“访问和安全(Access and Security)> API 访问(API Access)> 凭证(Credentials)”中找到。 +* `auth-url` (必需): 用于认证的 Keystone API 的 URL。在 OpenStack 控制面板中, + 这可以在“访问和安全(Access and Security)> API 访问(API Access)> 凭证(Credentials)”中找到。 * `username` (必需): 指 keystone 中一个有效用户的用户名。 * `password` (必需): 指 keystone 中一个有效用户的密码。 * `tenant-id` (必需): 用于指定要创建资源的租户 ID。 * `tenant-name` (可选): 用于指定要在其中创建资源的租户的名称。 -* `trust-id` (可选): 用于指定用于授权的信任的标识符。信任表示用户(委托人)将角色委托给另一个用户(受托人)的授权,并可选的允许受托人模仿委托人。可用的信任可以在 Keystone API 的 `/v3/OS-TRUST/trusts` 端点下找到。 +* `trust-id` (可选): 用于指定用于授权的信任的标识符。信任表示用户(委托人) + 将角色委托给另一个用户(受托人)的授权,并可选的允许受托人模仿委托人。 + 可用的信任可以在 Keystone API 的 `/v3/OS-TRUST/trusts` 端点下找到。 * `domain-id` (可选): 用于指定用户所属域的 ID。 * `domain-name` (可选): 用于指定用户所属域的名称。 -* `region` (可选): 用于指定在多区域 OpenStack 云上运行时使用的区域标识符。区域是 OpenStack 部署的一般性划分。虽然区域没有严格的地理含义,但部署可以使用地理名称表示区域标识符,如 `us-east`。可用区域位于 Keystone API 的 `/v3/regions` 端点之下。 +* `region` (可选): 用于指定在多区域 OpenStack 云上运行时使用的区域标识符。 + 区域是 OpenStack 部署的一般性划分。虽然区域没有严格的地理含义,但部署可以使用地理名称表示区域标识符, + 如 `us-east`。可用区域位于 Keystone API 的 `/v3/regions` 端点之下。 * `ca-file` (可选): 用于指定自定义 CA 文件的路径。 - 当使用 Keystone V3 时(它将tenant更改为project),`tenant-id` 值会自动映射到 API 中的项目。 - #### 负载均衡器 这些配置选项属于 OpenStack 驱动的全局配置,并且应该出现在 `cloud.conf` 文件中的 `[LoadBalancer]` 部分: @@ -447,24 +456,34 @@ file: * `node-security-group` (Optional): ID of the security group to manage. --> -* `lb-version` (可选): 用于覆盖自动版本检测。有效值为 `v1` 或 `v2`。如果没有提供值,则自动选择底层 OpenStack 云所支持的最高版本。 -* `use-octavia` (可选): 用于确定是否查找和使用 Octavia LBaaS V2 服务目录端点。有效值是 `true` 或 `false`。 -如果指定了“true”,并且无法找到 Octaiva LBaaS V2 入口,则提供者将退回并尝试寻找一个 Neutron LBaaS V2 端点。默认值是 `false`。 +* `lb-version` (可选): 用于覆盖自动版本检测。有效值为 `v1` 或 `v2`。 + 如果没有提供值,则自动选择底层 OpenStack 云所支持的最高版本。 +* `use-octavia` (可选): 用于确定是否查找和使用 Octavia LBaaS V2 服务目录端点。 + 有效值是 `true` 或 `false`。 + 如果指定了“true”,并且无法找到 Octaiva LBaaS V2 入口,则提供者将退回并尝试寻找一个 + Neutron LBaaS V2 端点。默认值是 `false`。 * `subnet-id` (可选): 用于指定要在其上创建负载均衡器的子网的 ID。 -可以在 “Network > Networks” 上找到。 -单击相应的网络以获得其子网。 + 可以在 “Network > Networks” 上找到。 + 单击相应的网络以获得其子网。 * `floating-network-id` (可选): 如果指定,将为负载均衡器创建一个浮动 IP。 -* `lb-method` (可选): 用于指定将负载分配到负载均衡器池成员的算法。值可以是 `ROUND_ROBIN`、`LEAST_CONNECTIONS` 或 `SOURCE_IP`。如果没有指定,默认行为是 `ROUND_ROBIN`。 -* `lb-provider` (可选): 用于指定负载均衡器的提供程序。如果没有指定,将使用在 Neutron 中配置的默认提供者服务。 -* `create-monitor` (可选): 指定是否为 Neutron 负载均衡器创建健康监视器。有效值是 `true` 和 `false`。 -默认为 `false`。当指定 `true` 时,还必须设置 `monitor-delay`、`monitor-timeout` 和 `monitor-max-retries`。 +* `lb-method` (可选): 用于指定将负载分配到负载均衡器池成员的算法。 + 值可以是 `ROUND_ROBIN`、`LEAST_CONNECTIONS` 或 `SOURCE_IP`。 + 如果没有指定,默认行为是 `ROUND_ROBIN`。 +* `lb-provider` (可选): 用于指定负载均衡器的提供程序。 + 如果没有指定,将使用在 Neutron 中配置的默认提供者服务。 +* `create-monitor` (可选): 指定是否为 Neutron 负载均衡器创建健康监视器。 + 有效值是 `true` 和 `false`。 + 默认为 `false`。当指定 `true` 时,还必须设置 `monitor-delay`、`monitor-timeout` 和 `monitor-max-retries`。 * `monitor-delay` (可选): 向负载均衡器的成员发送探测之间的时间间隔。 -确保您指定了一个有效的时间单位。 -有效时间单位为 `ns`、`us` (或 `µs`)、`ms`、`s`、`m`、`h`。 -* `monitor-timeout` (可选): 在超时之前,监视器等待 ping 响应的最长时间。该值必须小于延迟值。确保您指定了一个有效的时间单位。有效时间单位为 `ns`、 `us` (或 `µs`)、`ms`、`s`、`m`、 `h`。 + 确保您指定了一个有效的时间单位。 + 有效时间单位为 `ns`、`us` (或 `µs`)、`ms`、`s`、`m`、`h`。 +* `monitor-timeout` (可选): 在超时之前,监视器等待 ping 响应的最长时间。 + 该值必须小于延迟值。确保您指定了一个有效的时间单位。 + 有效时间单位为 `ns`、`us` (或 `µs`)、`ms`、`s`、`m`、`h`。 * `monitor-max-retries` (可选): 在将负载均衡器成员的状态更改为非活动之前,允许 ping 失败的次数。 -必须是 1 到 10 之间的数字。 -* `manage-security-groups` (可选): 确定负载均衡器是否应自动管理安全组规则。有效值是 `true` 和 `false`。默认为 `false`。当指定 `true` 时,还必须提供 `node-security-group`。 + 必须是 1 到 10 之间的数字。 +* `manage-security-groups` (可选): 确定负载均衡器是否应自动管理安全组规则。 + 有效值是 `true` 和 `false`。默认为 `false`。当指定 `true` 时,还必须提供 `node-security-group`。 * `node-security-group` (可选): 要管理的安全组的 ID。 - ##### 块存储 这些配置选项属于 OpenStack 驱动的全局配置,并且应该出现在 `cloud.conf` 文件中的 `[BlockStorage]` 部分: @@ -498,12 +516,15 @@ and should appear in the `[BlockStorage]` section of the `cloud.conf` file: attached to the node, default is 256 for cinder. --> -* `bs-version` (可选): 指所使用的块存储 API 版本。其合法值为 `v1`、`v2`、`v3`和 `auto`。 `auto` 为默认值,将使用底层 Openstack 所支持的块存储 API 的最新版本。 -* `trust-device-path` (可选): 在大多数情况下,块设备名称由 Cinder 提供(例如:`/dev/vda`)不可信任。此布尔值切换此行为。将其设置为 `true` 将导致信任 Cinder 提供的块设备名称。默认值 `false` 会根据设备序列号和 `/dev/disk/by-id` 映射发现设备路径,推荐这种方法。 +* `bs-version` (可选): 指所使用的块存储 API 版本。其合法值为 `v1`、`v2`、`v3`和 `auto`。 + `auto` 为默认值,将使用底层 Openstack 所支持的块存储 API 的最新版本。 +* `trust-device-path` (可选): 在大多数情况下,块设备名称由 Cinder 提供(例如:`/dev/vda`)不可信任。 + 此布尔值切换此行为。将其设置为 `true` 将导致信任 Cinder 提供的块设备名称。 + 默认值 `false` 会根据设备序列号和 `/dev/disk/by-id` 映射发现设备路径,推荐这种方法。 * `ignore-volume-az` (可选): 用于在附加 Cinder 卷时影响可用区使用。 -当 Nova 和 Cinder 有不同的可用区域时,应该将其设置为 `true`。 -最常见的情况是,有许多 Nova 可用区,但只有一个 Cinder 可用区。 -默认值是 `false`,以保持在早期版本中使用的行为,但是将来可能会更改。 + 当 Nova 和 Cinder 有不同的可用区域时,应该将其设置为 `true`。 + 最常见的情况是,有许多 Nova 可用区,但只有一个 Cinder 可用区。 + 默认值是 `false`,以保持在早期版本中使用的行为,但是将来可能会更改。 * `node-volume-attach-limit` (可选): 可连接到节点的最大卷数,对于 Cinder 默认为 256。 +如果在 OpenStack 上部署 Kubernetes <= 1.8 的版本,同时使用路径而不是端口来区分端点(Endpoints), +那么可能需要显式设置 `bs-version` 参数。 +基于路径的端点形如 `http://foo.bar/volume`,而基于端口的的端点形如 `http://foo.bar:xxx`。 -如果在 OpenStack 上部署 Kubernetes <= 1.8 的版本,同时使用路径而不是端口来区分端点(Endpoints),那么可能需要显式设置 `bs-version` 参数。 基于路径的端点形如 `http://foo.bar/volume`,而基于端口的的端点形如 -`http://foo.bar:xxx`。 - -在使用基于路径的端点,并且 Kubernetes 使用较旧的自动检索逻辑的环境中,尝试卷卸载(Detachment)会返回 `BS API version autodetection failed.` 错误。为了解决这个问题,可以通过添加以下内容到云驱动配置中,来强制使用 Cinder API V2 版本。 - +在使用基于路径的端点,并且 Kubernetes 使用较旧的自动检索逻辑的环境中, +尝试卷卸载(Detachment)会返回 `BS API version autodetection failed.` 错误。 +为了解决这个问题,可以通过添加以下内容到云驱动配置中,来强制使用 Cinder API V2 版本。 ```yaml [BlockStorage] bs-version=v2 ``` + - ##### 元数据 这些配置选项属于 OpenStack 提供程序的全局配置,并且应该出现在 `cloud.conf` 文件中的 `[Metadata]` 部分: * `search-order` (可选): 此配置键影响提供者检索与其运行的实例相关的元数据的方式。 -`configDrive,metadataService` 的默认值导致供应商首先从配置驱动器中检索与实例相关的元数据(如果可用的话),然后检索元数据服务。 -他们的替代值: + `configDrive,metadataService` 的默认值导致供应商首先从配置驱动器中检索与实例相关的元数据(如果可用的话), + 然后检索元数据服务。 + 他们的替代值: + * `configDrive` - 仅从配置驱动器检索实例元数据。 * `metadataService` - 仅从元数据服务检索实例元数据。 * `metadataService,configDrive` - 如果可用,首先从元数据服务检索实例元数据,然后从配置驱动器检索。 -影响这种行为可能是可取的,因为配置驱动器上的元数据可能会随着时间的推移而变得陈旧,而元数据服务总是提供最新的数据视图。并不是所有的 OpenStack 云都同时提供配置驱动和元数据服务,可能只有一个或另一个可用,这就是为什么默认情况下要同时检查两个。 + 影响这种行为可能是可取的,因为配置驱动器上的元数据可能会随着时间的推移而变得陈旧, + 而元数据服务总是提供最新的数据视图。并不是所有的 OpenStack 云都同时提供配置驱动和元数据服务, + 可能只有一个或另一个可用,这就是为什么默认情况下要同时检查两个。 ##### 路由 这些配置选项属于 OpenStack 驱动为 Kubernetes 网络插件 [kubenet] 提供的设置,并且应该出现在 `cloud.conf` 文件中的 `[Route]` 部分: -* `router-id` (可选):如果底层云的 Neutron 部署支持 `extraroutes` 扩展,则使用 `router-id` 指定要添加路由的路由器。选择的路由器必须跨越包含集群节点的私有网络(通常只有一个节点网络,这个值应该是节点网络的默认路由器)。在 OpenStack 上使用 [kubenet] 时需要这个值。 - -[kubenet]: /docs/concepts/cluster-administration/network-plugins/#kubenet - +* `router-id` (可选):如果底层云的 Neutron 部署支持 `extraroutes` 扩展, + 则使用 `router-id` 指定要添加路由的路由器。 + 选择的路由器必须跨越包含集群节点的私有网络(通常只有一个节点网络,这个值应该是节点网络的默认路由器)。 + 在 OpenStack 上使用 [kubenet](/zh/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#kubenet) + 时需要这个值。 ## OVirt @@ -616,10 +642,13 @@ OVirt 云驱动使用节点的主机名(由 kubelet 确定,或者用 `--host The Photon cloud provider uses the hostname of the node (as determined by the kubelet or overridden with `--hostname-override`) as the name of the Kubernetes Node object. Note that the Kubernetes Node name must match the Photon VM name (or if `overrideIP` is set to true in the `--cloud-config`, the Kubernetes Node name must match the Photon VM IP address). --> + ### 节点名称 -Photon 云驱动使用节点的主机名(由 kubelet 决定,或者用 `--hostname-override` 覆盖)作为 Kubernetes 节点对象的名称。 -注意,Kubernetes 节点名必须与 Photon VM名匹配(或者,如果在 `--cloud-config` 中将 `overrideIP` 设置为 `true`,则 Kubernetes 节点名必须与 Photon VM IP 地址匹配)。 +Photon 云驱动使用节点的主机名(由 kubelet 决定,或者用 `--hostname-override` 覆盖) +作为 Kubernetes 节点对象的名称。 +注意,Kubernetes 节点名必须与 Photon VM名匹配(或者,如果在 `--cloud-config` 中将 +`overrideIP` 设置为 `true`,则 Kubernetes 节点名必须与 Photon VM IP 地址匹配)。 ## VSphere @@ -645,45 +674,54 @@ The name of the Kubernetes Node object is the private IP address of the IBM Clou --> ### 计算节点 -通过使用 IBM Cloud Kubernetes Service 驱动,您可以在单个区域或跨区域的多个区(Region)中创建虚拟和物理(裸金属)节点的集群。 +通过使用 IBM Cloud Kubernetes Service 驱动,您可以在单个区域或跨区域的多个区(Region) +中创建虚拟和物理(裸金属)节点的集群。 有关更多信息,请参见[规划您的集群和工作节点设置](https://cloud.ibm.com/docs/containers?topic=containers-plan_clusters#plan_clusters)。 Kubernetes 节点对象的名称是 IBM Cloud Kubernetes Services 工作节点实例的私有IP地址。 ### 网络 -IBM Cloud Kubernetes Services 驱动提供 VLAN,用于提供高质量的网络性能和节点间的网络隔离。您可以设置自定义防火墙和 Calico 网络策略来为您的集群添加额外的安全层,或者通过 VPN 将您的集群连接到自有数据中心。有关更多信息,请参见[规划集群内和私有网络](https://cloud.ibm.com/docs/containers?topic=containers-cs_network_cluster#cs_network_cluster)。 +IBM Cloud Kubernetes Services 驱动提供 VLAN,用于提供高质量的网络性能和节点间的网络隔离。 +您可以设置自定义防火墙和 Calico 网络策略来为您的集群添加额外的安全层,或者通过 VPN +将您的集群连接到自有数据中心。 +有关更多信息,请参见[规划集群内和私有网络](https://cloud.ibm.com/docs/containers?topic=containers-cs_network_cluster#cs_network_cluster)。 -要向公众或集群内部公开应用程序,您可以利用 NodePort、LoadBalancer 或 Ingress 服务。您还可以使用注释自定义 Ingress 应用程序负载均衡器。有关更多信息,请参见[计划使用外部网络公开您的应用程序](https://cloud.ibm.com/docs/containers?topic=containers-cs_network_planning#cs_network_planning)。 +要向公众或集群内部公开应用程序,您可以利用 NodePort、LoadBalancer 或 Ingress 服务。 +您还可以使用注释自定义 Ingress 应用程序负载均衡器。 +有关更多信息,请参见[计划使用外部网络公开您的应用程序](https://cloud.ibm.com/docs/containers?topic=containers-cs_network_planning#cs_network_planning)。 ### 存储 -IBM Cloud Kubernetes Services 驱动利用 Kubernetes 原生的持久卷,使用户能够将文件、块和云对象存储装载到他们的应用程序中。还可以使用 database-as-a-service 和第三方附加组件来持久存储数据。有关更多信息,请参见[规划高可用性持久存储](https://cloud.ibm.com/docs/containers?topic=containers-storage_planning#storage_planning)。 +IBM Cloud Kubernetes Services 驱动利用 Kubernetes 原生的持久卷,使用户能够将文件、块和云对象存储 +装载到他们的应用程序中。还可以使用 database-as-a-service 和第三方附加组件来持久存储数据。 +有关更多信息,请参见[规划高可用性持久存储](https://cloud.ibm.com/docs/containers?topic=containers-storage_planning#storage_planning)。 - ## 百度云容器引擎 ### 节点名称 -Baidu 云驱动使用节点的私有 IP 地址(由 kubelet 确定,或者用 `--hostname-override` 覆盖)作为 Kubernetes 节点对象的名称。 +Baidu 云驱动使用节点的私有 IP 地址(由 kubelet 确定,或者用 `--hostname-override` 覆盖) +作为 Kubernetes 节点对象的名称。 注意 Kubernetes 节点名必须匹配百度 VM 的私有 IP。 diff --git a/content/zh/docs/concepts/cluster-administration/kubelet-garbage-collection.md b/content/zh/docs/concepts/cluster-administration/kubelet-garbage-collection.md index d9ffdaeb01..5bc6c0b8d4 100644 --- a/content/zh/docs/concepts/cluster-administration/kubelet-garbage-collection.md +++ b/content/zh/docs/concepts/cluster-administration/kubelet-garbage-collection.md @@ -5,110 +5,86 @@ weight: 70 --- -垃圾回收是 kubelet 的一个有用功能,它将清理未使用的镜像和容器。 - - -Kubelet 将每分钟对容器执行一次垃圾回收,每五分钟对镜像执行一次垃圾回收。 - - -不建议使用外部垃圾收集工具,因为这些工具可能会删除原本期望存在的容器进而破坏 kubelet 的行为。 - - +垃圾回收是 kubelet 的一个有用功能,它将清理未使用的镜像和容器。 +Kubelet 将每分钟对容器执行一次垃圾回收,每五分钟对镜像执行一次垃圾回收。 - +不建议使用外部垃圾收集工具,因为这些工具可能会删除原本期望存在的容器进而破坏 kubelet 的行为。 -## 镜像回收 - +## 镜像回收 {#image-collection} Kubernetes 借助于 cadvisor 通过 imageManager 来管理所有镜像的生命周期。 - - 镜像垃圾回收策略只考虑两个因素:`HighThresholdPercent` 和 `LowThresholdPercent`。 - - - 磁盘使用率超过上限阈值(HighThresholdPercent)将触发垃圾回收。 - - - 垃圾回收将删除最近最少使用的镜像,直到磁盘使用率满足下限阈值(LowThresholdPercent)。 - - -## 容器回收 - -容器垃圾回收策略考虑三个用户定义变量。`MinAge` 是容器可以被执行垃圾回收的最小生命周期。`MaxPerPodContainer` 是每个 pod 内允许存在的死亡容器的最大数量。 -`MaxContainers` 是全部死亡容器的最大数量。可以分别独立地通过将 `MinAge` 设置为 0,以及将 `MaxPerPodContainer` 和 `MaxContainers` 设置为小于 0 来禁用这些变量。 - +## 容器回收 {#container-collection} -Kubelet 将处理无法辨识的、已删除的以及超出前面提到的参数所设置范围的容器。最老的容器通常会先被移除。 -`MaxPerPodContainer` 和 `MaxContainer` 在某些场景下可能会存在冲突,例如在保证每个 pod 内死亡容器的最大数量(`MaxPerPodContainer`)的条件下可能会超过允许存在的全部死亡容器的最大数量(`MaxContainer`)。 -`MaxPerPodContainer` 在这种情况下会被进行调整:最坏的情况是将 `MaxPerPodContainer` 降级为 1,并驱逐最老的容器。 -此外,pod 内已经被删除的容器一旦年龄超过 `MinAge` 就会被清理。 +容器垃圾回收策略考虑三个用户定义变量。 +`MinAge` 是容器可以被执行垃圾回收的最小生命周期。 +`MaxPerPodContainer` 是每个 pod 内允许存在的死亡容器的最大数量。 +`MaxContainers` 是全部死亡容器的最大数量。 +可以分别独立地通过将 `MinAge` 设置为 0,以及将 `MaxPerPodContainer` 和 `MaxContainers` +设置为小于 0 来禁用这些变量。 - -不被 kubelet 管理的容器不受容器垃圾回收的约束。 +`kubelet` 将处理无法辨识的、已删除的以及超出前面提到的参数所设置范围的容器。 +最老的容器通常会先被移除。 +`MaxPerPodContainer` 和 `MaxContainer` 在某些场景下可能会存在冲突, +例如在保证每个 pod 内死亡容器的最大数量(`MaxPerPodContainer`)的条件下可能会超过 +允许存在的全部死亡容器的最大数量(`MaxContainer`)。 +`MaxPerPodContainer` 在这种情况下会被进行调整: +最坏的情况是将 `MaxPerPodContainer` 降级为 1,并驱逐最老的容器。 +此外,pod 内已经被删除的容器一旦年龄超过 `MinAge` 就会被清理。 - -## 用户配置 +不被 kubelet 管理的容器不受容器垃圾回收的约束。 -用户可以使用以下 kubelet 参数调整相关阈值来优化镜像垃圾回收: - - +## 用户配置 {#user-configuration} + +用户可以使用以下 kubelet 参数调整相关阈值来优化镜像垃圾回收: 1. `image-gc-high-threshold`,触发镜像垃圾回收的磁盘使用率百分比。默认值为 85%。 - 2. `image-gc-low-threshold`,镜像垃圾回收试图释放资源后达到的磁盘使用率百分比。默认值为 80%。 -我们还允许用户通过以下 kubelet 参数自定义垃圾收集策略: - +我们还允许用户通过以下 kubelet 参数自定义垃圾收集策略: -1. `minimum-container-ttl-duration`,完成的容器在被垃圾回收之前的最小年龄,默认是 0 分钟,这意味着每个完成的容器都会被执行垃圾回收。 +1. `minimum-container-ttl-duration`,完成的容器在被垃圾回收之前的最小年龄,默认是 0 分钟。 + 这意味着每个完成的容器都会被执行垃圾回收。 2. `maximum-dead-containers-per-container`,每个容器要保留的旧实例的最大数量。默认值为 1。 -3. `maximum-dead-containers`,要全局保留的旧容器实例的最大数量。默认值是 -1,这意味着没有全局限制。 - +3. `maximum-dead-containers`,要全局保留的旧容器实例的最大数量。 + 默认值是 -1,意味着没有全局限制。 +See [this issue](https://github.com/kubernetes/kubernetes/issues/13287) for more details. +--> 容器可能会在其效用过期之前被垃圾回收。这些容器可能包含日志和其他对故障诊断有用的数据。 强烈建议为 `maximum-dead-containers-per-container` 设置一个足够大的值,以便每个预期容器至少保留一个死亡容器。 由于同样的原因,`maximum-dead-containers` 也建议使用一个足够大的值。 -查阅 [这个问题](https://github.com/kubernetes/kubernetes/issues/13287) 获取更多细节。 - - - -## 弃用 +查阅[这个 Issue](https://github.com/kubernetes/kubernetes/issues/13287) 获取更多细节。 +## 弃用 {#deprecation} 这篇文档中的一些 kubelet 垃圾收集(Garbage Collection)功能将在未来被 kubelet 驱逐回收(eviction)所替代。 - - 包括: -| 现存参数 | 新参数 | 解释 | -| ------------- | -------- | --------- | -| `--image-gc-high-threshold` | `--eviction-hard` 或 `--eviction-soft` | 现存的驱逐回收信号可以触发镜像垃圾回收 | -| `--image-gc-low-threshold` | `--eviction-minimum-reclaim` | 驱逐回收实现相同行为 | -| `--maximum-dead-containers` | | 一旦旧日志存储在容器上下文之外,就会被弃用 | -| `--maximum-dead-containers-per-container` | | 一旦旧日志存储在容器上下文之外,就会被弃用 | -| `--minimum-container-ttl-duration` | | 一旦旧日志存储在容器上下文之外,就会被弃用 | -| `--low-diskspace-threshold-mb` | `--eviction-hard` or `eviction-soft` | 驱逐回收将磁盘阈值泛化到其他资源 | -| `--outofdisk-transition-frequency` | `--eviction-pressure-transition-period` | 驱逐回收将磁盘压力转换到其他资源 | - - - +| 现存参数 | 新参数 | 解释 | +| ------------- | -------- | --------- | +| `--image-gc-high-threshold` | `--eviction-hard` 或 `--eviction-soft` | 现存的驱逐回收信号可以触发镜像垃圾回收 | +| `--image-gc-low-threshold` | `--eviction-minimum-reclaim` | 驱逐回收实现相同行为 | +| `--maximum-dead-containers` | | 一旦旧日志存储在容器上下文之外,就会被弃用 | +| `--maximum-dead-containers-per-container` | | 一旦旧日志存储在容器上下文之外,就会被弃用 | +| `--minimum-container-ttl-duration` | | 一旦旧日志存储在容器上下文之外,就会被弃用 | +| `--low-diskspace-threshold-mb` | `--eviction-hard` or `eviction-soft` | 驱逐回收将磁盘阈值泛化到其他资源 | +| `--outofdisk-transition-frequency` | `--eviction-pressure-transition-period` | 驱逐回收将磁盘压力转换到其他资源 | ## {{% heading "whatsnext" %}} - -查阅 [配置驱逐回收资源的策略](/docs/tasks/administer-cluster/out-of-resource/) 获取更多细节。 - +查阅[配置资源不足情况的处理](/zh/docs/tasks/administer-cluster/out-of-resource/)了解更多细节。 diff --git a/content/zh/docs/concepts/cluster-administration/logging.md b/content/zh/docs/concepts/cluster-administration/logging.md index 0dd9494d35..e0a47b8c84 100755 --- a/content/zh/docs/concepts/cluster-administration/logging.md +++ b/content/zh/docs/concepts/cluster-administration/logging.md @@ -1,25 +1,33 @@ --- -reviewers: -- piosz -- x13n title: 日志架构 content_type: concept weight: 60 --- - + -应用和系统日志可以让您了解集群内部的运行状况。日志对调试问题和监控集群活动非常有用。大部分现代化应用都有某种日志记录机制;同样地,大多数容器引擎也被设计成支持某种日志记录机制。针对容器化应用,最简单且受欢迎的日志记录方式就是写入标准输出和标准错误流。 +应用和系统日志可以让你了解集群内部的运行状况。日志对调试问题和监控集群活动非常有用。 +大部分现代化应用都有某种日志记录机制;同样地,大多数容器引擎也被设计成支持某种日志记录机制。 +针对容器化应用,最简单且受欢迎的日志记录方式就是写入标准输出和标准错误流。 -但是,由容器引擎或 runtime 提供的原生功能通常不足以满足完整的日志记录方案。例如,如果发生容器崩溃、pod 被逐出或节点宕机等情况,您仍然想访问到应用日志。因此,日志应该具有独立的存储和生命周期,与节点、pod 或容器的生命周期相独立。这个概念叫 _集群级的日志_ 。集群级日志方案需要一个独立的后台来存储、分析和查询日志。Kubernetes 没有为日志数据提供原生存储方案,但是您可以集成许多现有的日志解决方案到 Kubernetes 集群中。 - - +但是,由容器引擎或运行时提供的原生功能通常不足以满足完整的日志记录方案。 +例如,如果发生容器崩溃、Pod 被逐出或节点宕机等情况,你仍然想访问到应用日志。 +因此,日志应该具有独立的存储和生命周期,与节点、Pod 或容器的生命周期相独立。 +这个概念叫 _集群级的日志_ 。集群级日志方案需要一个独立的后台来存储、分析和查询日志。 +Kubernetes 没有为日志数据提供原生存储方案,但是你可以集成许多现有的日志解决方案到 Kubernetes 集群中。 @@ -29,7 +37,8 @@ a logging backend is present inside or outside of your cluster. If you're not interested in having cluster-level logging, you might still find the description of how logs are stored and handled on the node to be useful. --> -集群级日志架构假定在集群内部或者外部有一个日志后台。如果您对集群级日志不感兴趣,您仍会发现关于如何在节点上存储和处理日志的描述对您是有用的。 +集群级日志架构假定在集群内部或者外部有一个日志后台。 +如果你对集群级日志不感兴趣,你仍会发现关于如何在节点上存储和处理日志的描述对你是有用的。 ## Kubernetes 中的基本日志记录 -本节,您会看到一个kubernetes 中生成基本日志的例子,该例子中数据被写入到标准输出。 -这里通过一个特定的 [pod 规约](/examples/debug/counter-pod.yaml) 演示创建一个容器,并令该容器每秒钟向标准输出写入数据。 +本节,你会看到一个kubernetes 中生成基本日志的例子,该例子中数据被写入到标准输出。 +这里通过一个特定的 [Pod 规约](/examples/debug/counter-pod.yaml) 演示创建一个容器, +并令该容器每秒钟向标准输出写入数据。 {{< codenew file="debug/counter-pod.yaml" >}} -用下面的命令运行 pod: +用下面的命令运行 Pod: ```shell kubectl apply -f https://k8s.io/examples/debug/counter-pod.yaml @@ -72,6 +82,7 @@ To fetch the logs, use the `kubectl logs` command, as follows: ```shell kubectl logs counter ``` + @@ -87,8 +98,8 @@ The output is: -一旦发生容器崩溃,您可以使用命令 `kubectl logs` 和参数 `--previous` 检索之前的容器日志。 -如果 pod 中有多个容器,您应该向该命令附加一个容器名以访问对应容器的日志。 +一旦发生容器崩溃,你可以使用命令 `kubectl logs` 和参数 `--previous` 检索之前的容器日志。 +如果 pod 中有多个容器,你应该向该命令附加一个容器名以访问对应容器的日志。 详见 [`kubectl logs` 文档](/docs/reference/generated/kubectl/kubectl-commands#logs)。 容器化应用写入 `stdout` 和 `stderr` 的任何数据,都会被容器引擎捕获并被重定向到某个位置。 -例如,Docker 容器引擎将这两个输出流重定向到某个 [日志驱动](https://docs.docker.com/engine/admin/logging/overview) , -该日志驱动在 Kubernetes 中配置为以 json 格式写入文件。 +例如,Docker 容器引擎将这两个输出流重定向到某个 +[日志驱动](https://docs.docker.com/engine/admin/logging/overview) , +该日志驱动在 Kubernetes 中配置为以 JSON 格式写入文件。 {{< note >}} -Docker json 日志驱动将日志的每一行当作一条独立的消息。该日志驱动不直接支持多行消息。您需要在日志代理级别或更高级别处理多行消息。 +Docker JSON 日志驱动将日志的每一行当作一条独立的消息。 +该日志驱动不直接支持多行消息。你需要在日志代理级别或更高级别处理多行消息。 {{< /note >}} 默认情况下,如果容器重启,kubelet 会保留被终止的容器日志。 -如果 pod 在工作节点被驱逐,该 pod 中所有的容器也会被驱逐,包括容器日志。 +如果 Pod 在工作节点被驱逐,该 Pod 中所有的容器也会被驱逐,包括容器日志。 节点级日志记录中,需要重点考虑实现日志的轮转,以此来保证日志不会消耗节点上所有的可用空间。 Kubernetes 当前并不负责轮转日志,而是通过部署工具建立一个解决问题的方案。 -例如,在 Kubernetes 集群中,用 `kube-up.sh` 部署一个每小时运行的工具 [`logrotate`](https://linux.die.net/man/8/logrotate)。 -您也可以设置容器 runtime 来自动地轮转应用日志,比如使用 Docker 的 `log-opt` 选项。 +例如,在 Kubernetes 集群中,用 `kube-up.sh` 部署一个每小时运行的工具 +[`logrotate`](https://linux.die.net/man/8/logrotate)。 +你也可以设置容器 runtime 来自动地轮转应用日志,比如使用 Docker 的 `log-opt` 选项。 在 `kube-up.sh` 脚本中,使用后一种方式来处理 GCP 上的 COS 镜像,而使用前一种方式来处理其他环境。 这两种方式,默认日志超过 10MB 大小时都会触发日志轮转。 @@ -146,8 +158,9 @@ Kubernetes 当前并不负责轮转日志,而是通过部署工具建立一个 As an example, you can find detailed information about how `kube-up.sh` sets up logging for COS image on GCP in the corresponding [script][cosConfigureHelper]. --> -例如,您可以找到关于 `kube-up.sh` 为 GCP 环境的 COS 镜像设置日志的详细信息, -相应的脚本在 [这里][cosConfigureHelper]。 +例如,你可以找到关于 `kube-up.sh` 为 GCP 环境的 COS 镜像设置日志的详细信息, +相应的脚本在 +[这里](https://github.com/kubernetes/kubernetes/blob/{{< param "githubbranch" >}}/cluster/gce/gci/configure-helper.sh) +{{< note >}} 当前,如果有其他系统机制执行日志轮转,那么 `kubectl logs` 仅可查询到最新的日志内容。 -比如,一个 10MB 大小的文件,通过`logrotate` 执行轮转后生成两个文件,一个 10MB 大小,一个为空,所以 `kubectl logs` 将返回空。 +比如,一个 10MB 大小的文件,通过`logrotate` 执行轮转后生成两个文件,一个 10MB 大小, +一个为空,所以 `kubectl logs` 将返回空。 {{< /note >}} -[cosConfigureHelper]: https://github.com/kubernetes/kubernetes/blob/{{< param "githubbranch" >}}/cluster/gce/gci/configure-helper.sh - 在使用 systemd 机制的服务器上,kubelet 和容器 runtime 写入日志到 journald。 如果没有 systemd,他们写入日志到 `/var/log` 目录的 `.log` 文件。 -容器中的系统组件通常将日志写到 `/var/log` 目录,绕过了默认的日志机制。他们使用 [klog][klog] 日志库。 -您可以在[日志开发文档](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/logging.md)找到这些组件的日志告警级别协议。 +容器中的系统组件通常将日志写到 `/var/log` 目录,绕过了默认的日志机制。他们使用 +[klog](https://github.com/kubernetes/klog) 日志库。 +你可以在[日志开发文档](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/logging.md)找到这些组件的日志告警级别协议。 和容器日志类似,`/var/log` 目录中的系统组件日志也应该被轮转。 -通过脚本 `kube-up.sh` 启动的 Kubernetes 集群中,日志被工具 `logrotate` 执行每日轮转,或者日志大小超过 100MB 时触发轮转。 - -[klog]: https://github.com/kubernetes/klog +通过脚本 `kube-up.sh` 启动的 Kubernetes 集群中,日志被工具 `logrotate` 执行每日轮转, +或者日志大小超过 100MB 时触发轮转。 -## 集群级日志架构 - -虽然Kubernetes没有为集群级日志记录提供原生的解决方案,但您可以考虑几种常见的方法。以下是一些选项: +## 集群级日志架构 + +虽然Kubernetes没有为集群级日志记录提供原生的解决方案,但你可以考虑几种常见的方法。以下是一些选项: * 使用在每个节点上运行的节点级日志记录代理。 * 在应用程序的 pod 中,包含专门记录日志的 sidecar 容器。 @@ -242,35 +253,41 @@ While Kubernetes does not provide a native solution for cluster-level logging, t -您可以通过在每个节点上使用 _节点级的日志记录代理_ 来实现群集级日志记录。日志记录代理是一种用于暴露日志或将日志推送到后端的专用工具。通常,日志记录代理程序是一个容器,它可以访问包含该节点上所有应用程序容器的日志文件的目录。 +你可以通过在每个节点上使用 _节点级的日志记录代理_ 来实现群集级日志记录。 +日志记录代理是一种用于暴露日志或将日志推送到后端的专用工具。 +通常,日志记录代理程序是一个容器,它可以访问包含该节点上所有应用程序容器的日志文件的目录。 -由于日志记录代理必须在每个节点上运行,它可以用 DaemonSet 副本,Pod 或 本机进程来实现。然而,后两种方法被弃用并且非常不别推荐。 +由于日志记录代理必须在每个节点上运行,它可以用 DaemonSet 副本,Pod 或 本机进程来实现。 +然而,后两种方法被弃用并且非常不别推荐。 -对于 Kubernetes 集群来说,使用节点级的日志代理是最常用和被推荐的方式,因为在每个节点上仅创建一个代理,并且不需要对节点上的应用做修改。 +对于 Kubernetes 集群来说,使用节点级的日志代理是最常用和被推荐的方式, +因为在每个节点上仅创建一个代理,并且不需要对节点上的应用做修改。 但是,节点级的日志 _仅适用于应用程序的标准输出和标准错误输出_。 Kubernetes 并不指定日志代理,但是有两个可选的日志代理与 Kubernetes 发行版一起发布。 -[Stackdriver 日志](/docs/user-guide/logging/stackdriver) 适用于 Google Cloud Platform,和 [Elasticsearch](/docs/user-guide/logging/elasticsearch)。 -您可以在专门的文档中找到更多的信息和说明。两者都使用 [fluentd](http://www.fluentd.org/) 与自定义配置作为节点上的代理。 +[Stackdriver 日志](/zh/docs/tasks/debug-application-cluster/logging-stackdriver/) +适用于 Google Cloud Platform,和 +[Elasticsearch](/zh/docs/tasks/debug-application-cluster/logging-elasticsearch-kibana/)。 +你可以在专门的文档中找到更多的信息和说明。 +两者都使用 [fluentd](https://www.fluentd.org/) 与自定义配置作为节点上的代理。 ### 使用 sidecar 容器和日志代理 - -您可以通过以下方式之一使用 sidecar 容器: +你可以通过以下方式之一使用 sidecar 容器: -#### 传输数据流的 sidecar 容器 - -利用 sidecar 容器向自己的 `stdout` 和 `stderr` 传输流的方式,您就可以利用每个节点上的 kubelet 和日志代理来处理日志。 -sidecar 容器从文件,socket 或 journald 读取日志。每个 sidecar 容器打印其自己的 `stdout` 和 `stderr` 流。 +#### 传输数据流的 sidecar 容器 + +![数据流容器的 Sidecar 容器](/images/docs/user-guide/logging/logging-with-streaming-sidecar.png) + +利用 sidecar 容器向自己的 `stdout` 和 `stderr` 传输流的方式, +你就可以利用每个节点上的 kubelet 和日志代理来处理日志。 +sidecar 容器从文件、套接字或 journald 读取日志。 +每个 sidecar 容器打印其自己的 `stdout` 和 `stderr` 流。 -这种方法允许您将日志流从应用程序的不同部分分离开,其中一些可能缺乏对写入 `stdout` 或 `stderr` 的支持。重定向日志背后的逻辑是最小的,因此它的开销几乎可以忽略不计。 +这种方法允许你将日志流从应用程序的不同部分分离开,其中一些可能缺乏对写入 +`stdout` 或 `stderr` 的支持。重定向日志背后的逻辑是最小的,因此它的开销几乎可以忽略不计。 另外,因为 `stdout`、`stderr` 由 kubelet 处理,你可以使用内置的工具 `kubectl logs`。 -在同一个日志流中有两种不同格式的日志条目,这有点混乱,即使您试图重定向它们到容器的 `stdout` 流。 -取而代之的是,您可以引入两个 sidecar 容器。 +在同一个日志流中有两种不同格式的日志条目,这有点混乱,即使你试图重定向它们到容器的 `stdout` 流。 +取而代之的是,你可以引入两个 sidecar 容器。 每一个 sidecar 容器可以从共享卷跟踪特定的日志文件,并重定向文件内容到各自的 `stdout` 流。 -这是运行两个 sidecar 容器的 pod 文件。 +这是运行两个 sidecar 容器的 Pod 文件。 {{< codenew file="admin/logging/two-files-counter-pod-streaming-sidecar.yaml" >}} @@ -338,7 +359,7 @@ Here's a configuration file for a pod that has two sidecar containers: Now when you run this pod, you can access each log stream separately by running the following commands: --> -现在当您运行这个 pod 时,您可以分别地访问每一个日志流,运行如下命令: +现在当你运行这个 Pod 时,你可以分别地访问每一个日志流,运行如下命令: ```shell kubectl logs counter count-log-1 @@ -365,7 +386,7 @@ The node-level agent installed in your cluster picks up those log streams automatically without any further configuration. If you like, you can configure the agent to parse log lines depending on the source container. --> -集群中安装的节点级代理会自动获取这些日志流,而无需进一步配置。如果您愿意,您可以配置代理程序来解析源容器的日志行。 +集群中安装的节点级代理会自动获取这些日志流,而无需进一步配置。如果你愿意,你可以配置代理程序来解析源容器的日志行。 注意,尽管 CPU 和内存使用率都很低(以多个 cpu millicores 指标排序或者按内存的兆字节排序), 向文件写日志然后输出到 `stdout` 流仍然会成倍地增加磁盘使用率。 -如果您的应用向单一文件写日志,通常最好设置 `/dev/stdout` 作为目标路径,而不是使用流式的 sidecar 容器方式。 +如果你的应用向单一文件写日志,通常最好设置 `/dev/stdout` 作为目标路径,而不是使用流式的 sidecar 容器方式。 -如果节点级日志记录代理程序对于你的场景来说不够灵活,您可以创建一个带有单独日志记录代理程序的 sidecar 容器,将代理程序专门配置为与您的应用程序一起运行。 +如果节点级日志记录代理程序对于你的场景来说不够灵活,你可以创建一个带有单独日志记录代理程序的 +sidecar 容器,将代理程序专门配置为与你的应用程序一起运行。 {{< note >}} -在 sidecar 容器中使用日志代理会导致严重的资源损耗。此外,您不能使用 `kubectl logs` 命令访问日志,因为日志并没有被 kubelet 管理。 +在 sidecar 容器中使用日志代理会导致严重的资源损耗。 +此外,你不能使用 `kubectl logs` 命令访问日志,因为日志并没有被 kubelet 管理。 {{< /note >}} -例如,您可以使用 [Stackdriver](/docs/tasks/debug-application-cluster/logging-stackdriver/),它使用fluentd作为日志记录代理。 +例如,你可以使用 [Stackdriver](/zh/docs/tasks/debug-application-cluster/logging-stackdriver/), +它使用 fluentd 作为日志记录代理。 以下是两个可用于实现此方法的配置文件。 -第一个文件包含配置 fluentd 的[ConfigMap](/docs/tasks/configure-pod-container/configure-pod-configmap/)。 +第一个文件包含配置 fluentd 的 +[ConfigMap](/zh/docs/tasks/configure-pod-container/configure-pod-configmap/)。 {{< codenew file="admin/logging/fluentd-sidecar-config.yaml" >}} @@ -438,28 +463,29 @@ information about configuring fluentd, see the {{< /note >}} --> {{< note >}} -配置fluentd超出了本文的范围。要知道更多的关于如何配置fluentd,请参考[fluentd 官方文档](http://docs.fluentd.org/). +配置 fluentd 超出了本文的范围。要进一步了解如何配置 fluentd, +请参考 [fluentd 官方文档](https://docs.fluentd.org/). {{< /note >}} -第二个文件描述了运行 fluentd sidecar 容器的 pod 。flutend 通过 pod 的挂载卷获取它的配置数据。 +第二个文件描述了运行 fluentd sidecar 容器的 Pod 。flutend 通过 Pod 的挂载卷获取它的配置数据。 {{< codenew file="admin/logging/two-files-counter-pod-agent-sidecar.yaml" >}} -一段时间后,您可以在 Stackdriver 界面看到日志消息。 +一段时间后,你可以在 Stackdriver 界面看到日志消息。 -记住,这只是一个例子,事实上您可以用任何一个日志代理替换 fluentd ,并从应用容器中读取任何资源。 +记住,这只是一个例子,事实上你可以用任何一个日志代理替换 fluentd ,并从应用容器中读取任何资源。 -通过暴露或推送每个应用的日志,您可以实现集群级日志记录;然而,这种日志记录机制的实现已超出 Kubernetes 的范围。 +通过暴露或推送每个应用的日志,你可以实现集群级日志记录; +然而,这种日志记录机制的实现已超出 Kubernetes 的范围。 diff --git a/content/zh/docs/concepts/cluster-administration/manage-deployment.md b/content/zh/docs/concepts/cluster-administration/manage-deployment.md index 55caa7b8d7..cc2224db49 100644 --- a/content/zh/docs/concepts/cluster-administration/manage-deployment.md +++ b/content/zh/docs/concepts/cluster-administration/manage-deployment.md @@ -9,21 +9,24 @@ weight: 40 -您已经部署了应用并通过服务暴露它。然后呢?Kubernetes 提供了一些工具来帮助管理您的应用部署,包括缩扩容和更新。我们将更深入讨论的特性包括[配置文件](/docs/concepts/configuration/overview/)和[标签](/docs/concepts/overview/working-with-objects/labels/)。 - - - +你已经部署了应用并通过服务暴露它。然后呢? +Kubernetes 提供了一些工具来帮助管理你的应用部署,包括扩缩容和更新。 +我们将更深入讨论的特性包括 +[配置文件](/zh/docs/concepts/configuration/overview/)和 +[标签](/zh/docs/concepts/overview/working-with-objects/labels/)。 ## 组织资源配置 -许多应用需要创建多个资源,例如 Deployment 和 Service。可以通过将多个资源组合在同一个文件中(在 YAML 中以 `---` 分隔)来简化对它们的管理。例如: +许多应用需要创建多个资源,例如 Deployment 和 Service。 +可以通过将多个资源组合在同一个文件中(在 YAML 中以 `---` 分隔) +来简化对它们的管理。例如: {{< codenew file="application/nginx-app.yaml" >}} @@ -36,7 +39,7 @@ Multiple resources can be created the same way as a single resource: kubectl apply -f https://k8s.io/examples/application/nginx-app.yaml ``` -```shell +``` service/my-nginx-svc created deployment.apps/my-nginx created ``` @@ -44,7 +47,9 @@ deployment.apps/my-nginx created -资源将按照它们在文件中的顺序创建。因此,最好先指定服务,这样在控制器(例如 Deployment)创建 Pod 时能够确保调度器可以将与服务关联的多个 Pod 分散到不同节点。 +资源将按照它们在文件中的顺序创建。 +因此,最好先指定服务,这样在控制器(例如 Deployment)创建 Pod 时能够 +确保调度器可以将与服务关联的多个 Pod 分散到不同节点。 -`kubectl` 将读取任何后缀为 `.yaml`,`.yml` 或者 `.json` 的文件。 +`kubectl` 将读取任何后缀为 `.yaml`、`.yml` 或者 `.json` 的文件。 -建议的做法是,将同一个微服务或同一应用层相关的资源放到同一个文件中,将同一个应用相关的所有文件按组存放到同一个目录中。如果应用的各层使用 DNS 相互绑定,那么您可以简单地将堆栈的所有组件一起部署。 +建议的做法是,将同一个微服务或同一应用层相关的资源放到同一个文件中, +将同一个应用相关的所有文件按组存放到同一个目录中。 +如果应用的各层使用 DNS 相互绑定,那么你可以简单地将堆栈的所有组件一起部署。 还可以使用 URL 作为配置源,便于直接使用已经提交到 Github 上的配置文件进行部署: @@ -81,7 +88,7 @@ A URL can also be specified as a configuration source, which is handy for deploy kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/zh/examples/application/nginx/nginx-deployment.yaml ``` -```shell +``` deployment.apps/my-nginx created ``` @@ -92,13 +99,15 @@ Resource creation isn't the only operation that `kubectl` can perform in bulk. I --> ## kubectl 中的批量操作 -资源创建并不是 `kubectl` 可以批量执行的唯一操作。`kubectl` 还可以从配置文件中提取资源名,以便执行其他操作,特别是删除您之前创建的资源: +资源创建并不是 `kubectl` 可以批量执行的唯一操作。 +`kubectl` 还可以从配置文件中提取资源名,以便执行其他操作, +特别是删除你之前创建的资源: ```shell kubectl delete -f https://k8s.io/examples/application/nginx-app.yaml ``` -```shell +``` deployment.apps "my-nginx" deleted service "my-nginx-svc" deleted ``` @@ -115,13 +124,14 @@ kubectl delete deployments/my-nginx services/my-nginx-svc -对于资源数目较大的情况,您会发现使用 `-l` 或 `--selector` 指定的筛选器(标签查询)能很容易根据标签筛选资源: +对于资源数目较大的情况,你会发现使用 `-l` 或 `--selector` +指定筛选器(标签查询)能很容易根据标签筛选资源: ```shell kubectl delete deployment,services -l app=nginx ``` -```shell +``` deployment.apps "my-nginx" deleted service "my-nginx-svc" deleted ``` @@ -129,13 +139,14 @@ service "my-nginx-svc" deleted -由于 `kubectl` 用来输出资源名称的语法与其所接受的资源名称语法相同,所以很容易使用 `$()` 或 `xargs` 进行链式操作: +由于 `kubectl` 用来输出资源名称的语法与其所接受的资源名称语法相同, +所以很容易使用 `$()` 或 `xargs` 进行链式操作: ```shell kubectl get $(kubectl create -f docs/concepts/cluster-administration/nginx/ -o name | grep service) ``` -```shell +``` NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-nginx-svc LoadBalancer 10.0.0.208 80/TCP 0s ``` @@ -144,17 +155,21 @@ my-nginx-svc LoadBalancer 10.0.0.208 80/TCP 0s With the above commands, we first create resources under `examples/application/nginx/` and print the resources created with `-o name` output format (print each resource as resource/name). Then we `grep` only the "service", and then print it with `kubectl get`. --> -上面的命令中,我们首先使用 `examples/application/nginx/` 下的配置文件创建资源,并使用 `-o name` 的输出格式(以"资源/名称"的形式打印每个资源)打印所创建的资源。然后,我们通过 `grep` 来过滤 "service",最后再打印 `kubectl get` 的内容。 +上面的命令中,我们首先使用 `examples/application/nginx/` 下的配置文件创建资源, +并使用 `-o name` 的输出格式(以"资源/名称"的形式打印每个资源)打印所创建的资源。 +然后,我们通过 `grep` 来过滤 "service",最后再打印 `kubectl get` 的内容。 -如果您碰巧在某个路径下的多个子路径中组织资源,那么也可以递归地在所有子路径上执行操作,方法是在 `--filename,-f` 后面指定 `--recursive` 或者 `-R`。 +如果你碰巧在某个路径下的多个子路径中组织资源,那么也可以递归地在所有子路径上 +执行操作,方法是在 `--filename,-f` 后面指定 `--recursive` 或者 `-R`。 -例如,假设有一个目录路径为 `project/k8s/development`,它保存开发环境所需的所有清单,并按资源类型组织: +例如,假设有一个目录路径为 `project/k8s/development`,它保存开发环境所需的 +所有清单,并按资源类型组织: ``` project/k8s/development @@ -176,20 +191,20 @@ By default, performing a bulk operation on `project/k8s/development` will stop a kubectl apply -f project/k8s/development ``` -```shell +``` error: you must provide one or more resources by argument or filename (.json|.yaml|.yml|stdin) ``` -然而,在 `--filename,-f` 后面标明 `--recursive` 或者 `-R` 之后: +正确的做法是,在 `--filename,-f` 后面标明 `--recursive` 或者 `-R` 之后: ```shell kubectl apply -f project/k8s/development --recursive ``` -```shell +``` configmap/my-config created deployment.apps/my-deployment created persistentvolumeclaim/my-pvc created @@ -200,7 +215,8 @@ The `--recursive` flag works with any operation that accepts the `--filename,-f` The `--recursive` flag also works when multiple `-f` arguments are provided: --> -`--recursive` 可以用于接受 `--filename,-f` 参数的任何操作,例如:`kubectl {create,get,delete,describe,rollout}` 等。 +`--recursive` 可以用于接受 `--filename,-f` 参数的任何操作,例如: +`kubectl {create,get,delete,describe,rollout}` 等。 有多个 `-f` 参数出现的时候,`--recursive` 参数也能正常工作: @@ -208,7 +224,7 @@ The `--recursive` flag also works when multiple `-f` arguments are provided: kubectl apply -f project/k8s/namespaces -f project/k8s/development --recursive ``` -```shell +``` namespace/development created namespace/staging created configmap/my-config created @@ -219,7 +235,8 @@ persistentvolumeclaim/my-pvc created -如果您有兴趣学习更多关于 `kubectl` 的内容,请阅读 [kubectl 概述](/docs/reference/kubectl/overview/)。 +如果你有兴趣进一步学习关于 `kubectl` 的内容,请阅读 +[kubectl 概述](/zh/docs/reference/kubectl/overview/)。 ## 有效地使用标签 -到目前为止我们使用的示例中的资源最多使用了一个标签。在许多情况下,应使用多个标签来区分集合。 +到目前为止我们使用的示例中的资源最多使用了一个标签。 +在许多情况下,应使用多个标签来区分集合。 + 以及 ```yaml @@ -276,7 +292,7 @@ kubectl apply -f examples/guestbook/all-in-one/guestbook-all-in-one.yaml kubectl get pods -Lapp -Ltier -Lrole ``` -```shell +``` NAME READY STATUS RESTARTS AGE APP TIER ROLE guestbook-fe-4nlpb 1/1 Running 0 1m guestbook frontend guestbook-fe-ght6d 1/1 Running 0 1m guestbook frontend @@ -291,7 +307,8 @@ my-nginx-o0ef1 1/1 Running 0 29m nginx ```shell kubectl get pods -lapp=guestbook,role=slave ``` -```shell + +``` NAME READY STATUS RESTARTS AGE guestbook-redis-slave-2q2yf 1/1 Running 0 3m guestbook-redis-slave-qgazl 1/1 Running 0 3m @@ -299,20 +316,22 @@ guestbook-redis-slave-qgazl 1/1 Running 0 3m -## 金丝雀部署 - -另一个需要多标签的场景是用来区分同一组件的不同版本或者不同配置的多个部署。常见的做法是部署一个使用*金丝雀发布*来部署新应用版本(在 pod 模板中通过镜像标签指定),保持新旧版本应用同时运行,这样,新版本在完全发布之前也可以接收实时的生产流量。 +## 金丝雀部署(Canary Deployments) {#canary-deployments} + +另一个需要多标签的场景是用来区分同一组件的不同版本或者不同配置的多个部署。 +常见的做法是部署一个使用*金丝雀发布*来部署新应用版本 +(在 Pod 模板中通过镜像标签指定),保持新旧版本应用同时运行。 +这样,新版本在完全发布之前也可以接收实时的生产流量。 -例如,您可以使用 `track` 标签来区分不同的版本。 +例如,你可以使用 `track` 标签来区分不同的版本。 主要稳定的发行版将有一个 `track` 标签,其值为 `stable`: @@ -331,7 +350,8 @@ The primary, stable release would have a `track` label with value as `stable`: -然后,您可以创建 guestbook 前端的新版本,让这些版本的 `track` 标签带有不同的值(即 `canary`),以便两组 pod 不会重叠: +然后,你可以创建 guestbook 前端的新版本,让这些版本的 `track` 标签带有不同的值 +(即 `canary`),以便两组 Pod 不会重叠: ```yaml name: frontend-canary @@ -360,7 +380,7 @@ The frontend service would span both sets of replicas by selecting the common su You can tweak the number of replicas of the stable and canary releases to determine the ratio of each release that will receive live production traffic (in this case, 3:1). Once you're confident, you can update the stable track to the new application release and remove the canary one. --> -您可以调整 `stable` 和 `canary` 版本的副本数量,以确定每个版本将接收实时生产流量的比例(在本例中为 3:1)。一旦有信心,您就可以将新版本应用的 `track` 标签的值从 `canary` 替换为 `stable`,并且将老版本应用删除。 +你可以调整 `stable` 和 `canary` 版本的副本数量,以确定每个版本将接收实时生产流量的比例(在本例中为 3:1)。一旦有信心,你就可以将新版本应用的 `track` 标签的值从 `canary` 替换为 `stable`,并且将老版本应用删除。 -## 更新标签 +## 更新标签 {#updating-labels} -有时,现有的 pod 和其它资源需要在创建新资源之前重新标记。这可以用 `kubectl label` 完成。 +有时,现有的 pod 和其它资源需要在创建新资源之前重新标记。 +这可以用 `kubectl label` 完成。 例如,如果想要将所有 nginx pod 标记为前端层,只需运行: ```shell kubectl label pods -l app=nginx tier=fe ``` -```shell +``` pod/my-nginx-2035384211-j5fhi labeled pod/my-nginx-2035384211-u2c7e labeled pod/my-nginx-2035384211-u3t6x labeled @@ -392,12 +413,14 @@ pod/my-nginx-2035384211-u3t6x labeled This first filters all pods with the label "app=nginx", and then labels them with the "tier=fe". To see the pods you just labeled, run: --> -首先用标签 "app=nginx" 过滤所有的 pod,然后用 "tier=fe" 标记它们。想要查看您刚才标记的 pod,请运行: +首先用标签 "app=nginx" 过滤所有的 Pod,然后用 "tier=fe" 标记它们。 +想要查看你刚才标记的 Pod,请运行: ```shell kubectl get pods -l app=nginx -L tier ``` -```shell + +``` NAME READY STATUS RESTARTS AGE TIER my-nginx-2035384211-j5fhi 1/1 Running 0 23m fe my-nginx-2035384211-u2c7e 1/1 Running 0 23m fe @@ -409,18 +432,22 @@ This outputs all "app=nginx" pods, with an additional label column of pods' tier For more information, please see [labels](/docs/concepts/overview/working-with-objects/labels/) and [kubectl label](/docs/reference/generated/kubectl/kubectl-commands/#label). --> -这将输出所有 "app=nginx" 的 pod,并有一个额外的描述 pod 的 tier 的标签列(用参数 `-L` 或者 `--label-columns` 标明)。 +这将输出所有 "app=nginx" 的 Pod,并有一个额外的描述 Pod 的 tier 的标签列 +(用参数 `-L` 或者 `--label-columns` 标明)。 -想要了解更多信息,请参考 [标签](/docs/concepts/overview/working-with-objects/labels/) 和 [kubectl label](/docs/reference/generated/kubectl/kubectl-commands/#label)。 +想要了解更多信息,请参考 +[标签](/zh/docs/concepts/overview/working-with-objects/labels/) 和 +[`kubectl label`](/docs/reference/generated/kubectl/kubectl-commands/#label) +命令文档。 -## 更新注解 +## 更新注解 {#updating-annotations} -有时,您可能希望将注解附加到资源中。注解是 API 客户端(如工具、库等)用于检索的任意非标识元数据。这可以通过 `kubectl annotate` 来完成。例如: +有时,你可能希望将注解附加到资源中。注解是 API 客户端(如工具、库等)用于检索的任意非标识元数据。这可以通过 `kubectl annotate` 来完成。例如: ```shell kubectl annotate pods my-nginx-v4-9gw19 description='my frontend running nginx' @@ -438,33 +465,38 @@ metadata: -想要了解更多信息,请参考 [注解](/docs/concepts/overview/working-with-objects/annotations/) 和 [kubectl annotate](/docs/reference/generated/kubectl/kubectl-commands/#annotate) 文档。 +想要了解更多信息,请参考 +[注解](/zh/docs/concepts/overview/working-with-objects/annotations/)和 +[`kubectl annotate`](/docs/reference/generated/kubectl/kubectl-commands/#annotate) +命令文档。 -## 缩扩您的应用 +## 扩缩你的应用 -当应用上的负载增长或收缩时,使用 `kubectl` 能够轻松实现规模的缩扩。例如,要将 nginx 副本的数量从 3 减少到 1,请执行以下操作: +当应用上的负载增长或收缩时,使用 `kubectl` 能够轻松实现规模的扩缩。 +例如,要将 nginx 副本的数量从 3 减少到 1,请执行以下操作: ```shell kubectl scale deployment/my-nginx --replicas=1 ``` -```shell + +``` deployment.extensions/my-nginx scaled ``` -现在,您的 deployment 管理的 pod 只有一个了。 +现在,你的 Deployment 管理的 Pod 只有一个了。 ```shell kubectl get pods -l app=nginx ``` -```shell +``` NAME READY STATUS RESTARTS AGE my-nginx-2035384211-j5fhi 1/1 Running 0 30m ``` @@ -477,7 +509,8 @@ To have the system automatically choose the number of nginx replicas as needed, ```shell kubectl autoscale deployment/my-nginx --min=1 --max=3 ``` -```shell + +``` horizontalpodautoscaler.autoscaling/my-nginx autoscaled ``` @@ -486,9 +519,12 @@ Now your nginx replicas will be scaled up and down as needed, automatically. For more information, please see [kubectl scale](/docs/reference/generated/kubectl/kubectl-commands/#scale), [kubectl autoscale](/docs/reference/generated/kubectl/kubectl-commands/#autoscale) and [horizontal pod autoscaler](/docs/tasks/run-application/horizontal-pod-autoscale/) document. --> -现在,您的 nginx 副本将根据需要自动地增加或者减少。 +现在,你的 nginx 副本将根据需要自动地增加或者减少。 -想要了解更多信息,请参考 [kubectl scale](/docs/reference/generated/kubectl/kubectl-commands/#scale), [kubectl autoscale](/docs/reference/generated/kubectl/kubectl-commands/#autoscale) 和 [pod 水平自动伸缩](/docs/tasks/run-application/horizontal-pod-autoscale/) 文档。 +想要了解更多信息,请参考 +[kubectl scale](/docs/reference/generated/kubectl/kubectl-commands/#scale)命令文档、 +[kubectl autoscale](/docs/reference/generated/kubectl/kubectl-commands/#autoscale) 命令文档和 +[水平 Pod 自动伸缩](/zh/docs/tasks/run-application/horizontal-pod-autoscale/) 文档。 ## 就地更新资源 -有时,有必要对您所创建的资源进行小范围、无干扰地更新。 +有时,有必要对你所创建的资源进行小范围、无干扰地更新。 ### kubectl apply @@ -506,12 +542,15 @@ It is suggested to maintain a set of configuration files in source control (see so that they can be maintained and versioned along with the code for the resources they configure. Then, you can use [`kubectl apply`](/docs/reference/generated/kubectl/kubectl-commands/#apply) to push your configuration changes to the cluster. --> -建议在源代码管理中维护一组配置文件(参见[配置即代码](http://martinfowler.com/bliki/InfrastructureAsCode.html)),这样,它们就可以和应用代码一样进行维护和版本管理。然后,您可以用 [`kubectl apply`](/docs/reference/generated/kubectl/kubectl-commands/#apply) 将配置变更应用到集群中。 +建议在源代码管理中维护一组配置文件 +(参见[配置即代码](https://martinfowler.com/bliki/InfrastructureAsCode.html)), +这样,它们就可以和应用代码一样进行维护和版本管理。 +然后,你可以用 [`kubectl apply`](/docs/reference/generated/kubectl/kubectl-commands/#apply) 将配置变更应用到集群中。 -这个命令将会把推送的版本与以前的版本进行比较,并应用您所做的更改,但是不会自动覆盖任何你没有指定更改的属性。 +这个命令将会把推送的版本与以前的版本进行比较,并应用你所做的更改,但是不会自动覆盖任何你没有指定更改的属性。 ```shell kubectl apply -f https://k8s.io/examples/application/nginx/nginx-deployment.yaml @@ -534,9 +573,7 @@ All subsequent calls to `kubectl apply`, and other commands that modify the conf 所有后续调用 `kubectl apply` 以及其它修改配置的命令,如 `kubectl replace` 和 `kubectl edit`,都将更新注解,并允许随后调用的 `kubectl apply` 使用三方差异进行检查和执行删除。 {{< note >}} 想要使用 apply,请始终使用 `kubectl apply` 或 `kubectl create --save-config` 创建资源。 @@ -547,7 +584,7 @@ To use apply, always create resource initially with either `kubectl apply` or `k -或者,您也可以使用 `kubectl edit` 更新资源: +或者,你也可以使用 `kubectl edit` 更新资源: ```shell kubectl edit deployment/my-nginx @@ -569,13 +606,12 @@ deployment.apps/my-nginx configured rm /tmp/nginx.yaml ``` - -这使您可以更加容易地进行更重大的更改。请注意,可以使用 `EDITOR` 或 `KUBE_EDITOR` 环境变量来指定编辑器。 +这使你可以更加容易地进行更重大的更改。请注意,可以使用 `EDITOR` 或 `KUBE_EDITOR` 环境变量来指定编辑器。 想要了解更多信息,请参考 [kubectl edit](/docs/reference/generated/kubectl/kubectl-commands/#edit) 文档。 @@ -588,8 +624,8 @@ JSON merge patch, and strategic merge patch. See and [kubectl patch](/docs/reference/generated/kubectl/kubectl-commands/#patch). --> -您可以使用 `kubectl patch` 来更新 API 对象。此命令支持 JSON patch,JSON merge patch,以及 strategic merge patch。 请参考 -[使用 kubectl patch 更新 API 对象](/docs/tasks/run-application/update-api-object-kubectl-patch/) +你可以使用 `kubectl patch` 来更新 API 对象。此命令支持 JSON patch,JSON merge patch,以及 strategic merge patch。 请参考 +[使用 kubectl patch 更新 API 对象](/zh/docs/tasks/run-application/update-api-object-kubectl-patch/) 和 [kubectl patch](/docs/reference/generated/kubectl/kubectl-commands/#patch). @@ -598,14 +634,15 @@ and In some cases, you may need to update resource fields that cannot be updated once initialized, or you may just want to make a recursive change immediately, such as to fix broken pods created by a Deployment. To change such fields, use `replace --force`, which deletes and re-creates the resource. In this case, you can simply modify your original configuration file: --> -## 破坏性的更新 +## 破坏性的更新 {#disruptive-updates} -在某些情况下,您可能需要更新某些初始化后无法更新的资源字段,或者您可能只想立即进行递归更改,例如修复 Deployment 创建的不正常的 Pod。若要更改这些字段,请使用 `replace --force`,它将删除并重新创建资源。在这种情况下,您可以简单地修改原始配置文件: +在某些情况下,你可能需要更新某些初始化后无法更新的资源字段,或者你可能只想立即进行递归更改,例如修复 Deployment 创建的不正常的 Pod。若要更改这些字段,请使用 `replace --force`,它将删除并重新创建资源。在这种情况下,你可以简单地修改原始配置文件: ```shell kubectl replace -f https://k8s.io/examples/application/nginx/nginx-deployment.yaml --force ``` -```shell + +``` deployment.apps/my-nginx deleted deployment.apps/my-nginx replaced ``` @@ -618,29 +655,30 @@ deployment.apps/my-nginx replaced -在某些时候,您最终需要更新已部署的应用,通常都是通过指定新的镜像或镜像标签,如上面的金丝雀发布的场景中所示。`kubectl` 支持几种更新操作,每种更新操作都适用于不同的场景。 +在某些时候,你最终需要更新已部署的应用,通常都是通过指定新的镜像或镜像标签,如上面的金丝雀发布的场景中所示。`kubectl` 支持几种更新操作,每种更新操作都适用于不同的场景。 -我们将指导您通过 Deployment 如何创建和更新应用。 +我们将指导你通过 Deployment 如何创建和更新应用。 -假设您正运行的是 1.7.9 版本的 nginx: +假设你正运行的是 1.14.2 版本的 nginx: ```shell -kubectl create deployment my-nginx --image=nginx:1.7.9 +kubectl create deployment my-nginx --image=nginx:1.14.2 +``` ``` -```shell deployment.apps/my-nginx created ``` -要更新到 1.9.1 版本,只需使用我们前面学到的 kubectl 命令将 `.spec.template.spec.containers[0].image` 从 `nginx:1.7.9` 修改为 `nginx:1.9.1`。 +要更新到 1.16.1 版本,只需使用我们前面学到的 kubectl 命令将 +`.spec.template.spec.containers[0].image` 从 `nginx:1.14.2` 修改为 `nginx:1.16.1`。 ```shell kubectl edit deployment/my-nginx @@ -649,18 +687,16 @@ kubectl edit deployment/my-nginx -没错,就是这样!Deployment 将在后台逐步更新已经部署的 nginx 应用。它确保在更新过程中,只有一定数量的旧副本被开闭,并且只有一定基于所需 pod 数量的新副本被创建。想要了解更多细节,请参考 [Deployment](/docs/concepts/workloads/controllers/deployment/)。 - - +没错,就是这样!Deployment 将在后台逐步更新已经部署的 nginx 应用。 +它确保在更新过程中,只有一定数量的旧副本被开闭,并且只有一定基于所需 Pod 数量的新副本被创建。 +想要了解更多细节,请参考 [Deployment](/zh/docs/concepts/workloads/controllers/deployment/)。 ## {{% heading "whatsnext" %}} - -- [学习怎么样使用 `kubectl` 观察和调试应用](/docs/tasks/debug-application-cluster/debug-application-introspection/) -- [配置最佳实践和技巧](/docs/concepts/configuration/overview/) - +- 学习[如何使用 `kubectl` 观察和调试应用](/zh/docs/tasks/debug-application-cluster/debug-application-introspection/) +- 阅读[配置最佳实践和技巧](/zh/docs/concepts/configuration/overview/) diff --git a/content/zh/docs/concepts/cluster-administration/monitoring.md b/content/zh/docs/concepts/cluster-administration/monitoring.md index 5025857051..afd8d12b64 100644 --- a/content/zh/docs/concepts/cluster-administration/monitoring.md +++ b/content/zh/docs/concepts/cluster-administration/monitoring.md @@ -2,6 +2,8 @@ title: Kubernetes 控制面的指标 content_type: concept weight: 60 +aliases: +- controller-metrics.md --- @@ -11,12 +13,11 @@ System component metrics can give a better look into what is happening inside th Metrics in Kubernetes control plane are emitted in [prometheus format](https://prometheus.io/docs/instrumenting/exposition_formats/) and are human readable. --> - 系统组件的指标可以让我们更好的看清系统内部究竟发生了什么,尤其对于构建仪表盘和告警都非常有用。 -Kubernetes 控制面板中的指标是以 [prometheus](https://prometheus.io/docs/instrumenting/exposition_formats/) 格式发出的,而且是易于阅读的。 - - +Kubernetes 控制面板中的指标是以 +[prometheus](https://prometheus.io/docs/instrumenting/exposition_formats/) +格式发出的,而且是易于阅读的。 @@ -24,15 +25,14 @@ Kubernetes 控制面板中的指标是以 [prometheus](https://prometheus.io/doc ## Metrics in Kubernetes In most cases metrics are available on `/metrics` endpoint of the HTTP server. For components that doesn't expose endpoint by default it can be enabled using `--bind-address` flag. --> - ## Kubernetes 的指标 -在大多数情况下,指标在 HTTP 服务器的 `/metrics` 端点使用,对于默认情况下不暴露端点的组件,可以使用 `--bind-address` 参数启用。 +在大多数情况下,指标在 HTTP 服务器的 `/metrics` 端点使用。 +对于默认情况下不暴露端点的组件,可以使用 `--bind-address` 参数启用。 - 举例下面这些组件: * {{< glossary_tooltip term_id="kube-controller-manager" text="kube-controller-manager" >}} @@ -50,12 +50,16 @@ Note that {{< glossary_tooltip term_id="kubelet" text="kubelet" >}} also exposes If your cluster uses {{< glossary_tooltip term_id="rbac" text="RBAC" >}}, reading metrics requires authorization via a user, group or ServiceAccount with a ClusterRole that allows accessing `/metrics`. For example: --> +在生产环境中,你可能需要配置 [Prometheus 服务器](https://prometheus.io/) +或其他指标收集器来定期收集这些指标,并使它们在某种时间序列数据库中可用。 -在生产环境中,你可能需要配置 [Prometheus Server](https://prometheus.io/) 或其他指标收集器来定期收集这些指标,并使它们在某种时间序列数据库中可用。 +请注意 {{< glossary_tooltip term_id="kubelet" text="kubelet" >}} 同样在 +`/metrics/cadvisor`、`/metrics/resource` 和 `/metrics/probes` 等端点提供性能指标。 +这些指标的生命周期并不相同。 -请注意 {{< glossary_tooltip term_id="kubelet" text="kubelet" >}} 同样在 `/metrics/cadvisor`、`/metrics/resource` 和 `/metrics/probes` 等端点提供性能指标。这些指标的生命周期并不相同。 - -如果你的集群还使用了 {{< glossary_tooltip term_id="rbac" text="RBAC" >}} ,那读取指标数据的时候,还需要通过具有 ClusterRole 的用户、组或者 ServiceAccount 来进行授权,才有权限访问 `/metrics` 。 +如果你的集群还使用了 {{< glossary_tooltip term_id="rbac" text="RBAC" >}}, +那读取指标数据的时候,还需要通过具有 ClusterRole 的用户、组或者 ServiceAccount 来进行授权, +才有权限访问 `/metrics` 。 举例: @@ -79,7 +83,6 @@ Alpha metrics have no stability guarantees; as such they can be modified or dele Stable metrics can be guaranteed to not change; Specifically, stability means: --> - ## 指标的生命周期 内测版指标 → 稳定版指标 → 弃用指标 → 隐藏指标 → 删除 @@ -101,8 +104,8 @@ Deprecated metric signal that the metric will eventually be deleted; to find whi Before deprecation: --> - -弃用指标表明这个指标最终将会被删除,要想查找是哪个版本,你需要检查其注释,注释中包括该指标从哪个 kubernetes 版本被弃用。 +弃用指标表明这个指标最终将会被删除,要想查找是哪个版本,你需要检查其注释, +注释中包括该指标从哪个 kubernetes 版本被弃用。 指标弃用前: @@ -112,10 +115,7 @@ Before deprecation: some_counter 0 ``` - - + 指标弃用后: ``` @@ -129,8 +129,8 @@ Once a metric is hidden then by default the metrics is not published for scrapin Once a metric is deleted, the metric is not published. You cannot change this using an override. --> - -一个指标一旦被隐藏,默认这个指标是不会发布来被抓取的。如果你想要使用这个隐藏指标,你需要覆盖相关集群组件的配置。 +一个指标一旦被隐藏,默认这个指标是不会发布来被抓取的。 +如果你想要使用这个隐藏指标,你需要覆盖相关集群组件的配置。 一个指标一旦被删除,那这个指标就不会被发布,您也不可以通过覆盖配置来进行更改。 @@ -145,14 +145,17 @@ The flag can only take the previous minor version as it's value. All metrics hid Take metric `A` as an example, here assumed that `A` is deprecated in 1.n. According to metrics deprecated policy, we can reach the following conclusion: --> - ## 显示隐藏指标 -综上所述,管理员可以通过在运行可执行文件时添加一些特定的参数来开启一些隐藏的指标。当管理员错过了之前版本的的一些已弃用的指标时,这个可被视作是一个后门。 +综上所述,管理员可以通过在运行可执行文件时添加一些特定的参数来开启一些隐藏的指标。 +当管理员错过了之前版本的的一些已弃用的指标时,这个可被视作是一个后门。 -`show-hidden-metrics-for-version` 参数可以指定一个版本,用来显示这个版本中被隐藏的指标。这个版本号形式是x.y,x 是主要版本号,y 是次要版本号。补丁版本并不是必须的,尽管在一些补丁版本中也会有一些指标会被弃用,因为指标弃用策略主要是针对次要版本。 +`show-hidden-metrics-for-version` 参数可以指定一个版本,用来显示这个版本中被隐藏的指标。 +这个版本号形式是x.y,x 是主要版本号,y 是次要版本号。补丁版本并不是必须的, +尽管在一些补丁版本中也会有一些指标会被弃用,因为指标弃用策略主要是针对次要版本。 -这个参数只能使用上一版本作为其值,如果管理员将上一版本设置为 `show-hidden-metrics-for-version` 的值,那么就会显示上一版本所有被隐藏的指标,太老的版本是不允许的,因为这不符合指标弃用策略。 +这个参数只能使用上一版本作为其值,如果管理员将上一版本设置为 `show-hidden-metrics-for-version` 的值, +那么就会显示上一版本所有被隐藏的指标,太老的版本是不允许的,因为这不符合指标弃用策略。 以指标 `A` 为例,这里假设 `A` 指标在 1.n 版本中被弃用,根据指标弃用策略,我们可以得出以下结论: @@ -168,7 +171,9 @@ If you're upgrading from release `1.12` to `1.13`, but still depend on a metric * 在 `1.n+1` 版本中,这个指标默认被隐藏,你可以通过设置参数 `show-hidden-metrics-for-version=1.n` 来使它可以被发出. * 在 `1.n+2` 版本中,这个指标就被从代码库中删除,也不会再有后门了. -如果你想要从 `1.12` 版本升级到 `1.13` ,但仍然需要依赖指标 `A` ,你可以通过命令行设置隐藏指标 `--show-hidden-metrics=1.12` ,但是在升级到 `1.14`时就必须要删除这个指标的依赖,因为这个版本中这个指标已经被删除了。 +如果你想要从 `1.12` 版本升级到 `1.13` ,但仍然需要依赖指标 `A` , +你可以通过命令行设置隐藏指标 `--show-hidden-metrics=1.12`, +但是在升级到 `1.14`时就必须要删除这个指标的依赖,因为这个版本中这个指标已经被删除了。 - ## 组件指标 ### kube-controller-manager 指标 @@ -205,11 +209,8 @@ cloudprovider_gce_api_request_duration_seconds { request = "detach_disk"} cloudprovider_gce_api_request_duration_seconds { request = "list_disk"} ``` - - ## {{% heading "whatsnext" %}} - -集群网络系统是 Kubernetes 的核心部分,但是想要准确了解它的工作原理可是个不小的挑战。下面列出的是网络系统的的四个主要问题: +集群网络系统是 Kubernetes 的核心部分,但是想要准确了解它的工作原理可是个不小的挑战。 +下面列出的是网络系统的的四个主要问题: -1. 高度耦合的容器间通信:这个已经被 [pods](/docs/concepts/workloads/pods/pod) 和 `localhost` 通信解决了。 +1. 高度耦合的容器间通信:这个已经被 {{< glossary_tooltip text="Pods" term_id="pod" >}} + 和 `localhost` 通信解决了。 2. Pod 间通信:这个是本文档的重点要讲述的。 -3. Pod 和 Service 间通信:这个已经在 [services](/docs/concepts/services-networking/service/) 里讲述过了。 -4. 外部和 Service 间通信:这个也已经在 [services](/docs/concepts/services-networking/service/) 讲述过了。 - - - +3. Pod 和服务间通信:这个已经在[服务](/zh/docs/concepts/services-networking/service/) 里讲述过了。 +4. 外部和服务间通信:这也已经在[服务](/zh/docs/concepts/services-networking/service/) 讲述过了。 @@ -42,9 +41,13 @@ insert dynamic port numbers into configuration blocks, services have to know how to find each other, etc. Rather than deal with this, Kubernetes takes a different approach. --> -Kubernetes 的宗旨就是在应用之间共享机器。通常来说,共享机器需要两个应用之间不能使用相同的端口,但是在多个应用开发者之间去大规模地协调端口是件很困难的事情,尤其是还要让用户暴露在他们控制范围之外的集群级别的问题上。 +Kubernetes 的宗旨就是在应用之间共享机器。 +通常来说,共享机器需要两个应用之间不能使用相同的端口,但是在多个应用开发者之间 +去大规模地协调端口是件很困难的事情,尤其是还要让用户暴露在他们控制范围之外的集群级别的问题上。 -动态分配端口也会给系统带来很多复杂度 - 每个应用都需要设置一个端口的参数,而 API 服务器还需要知道如何将动态端口数值插入到配置模块中,服务也需要知道如何找到对方等等。与其去解决这些问题,Kubernetes 选择了其他不同的方法。 +动态分配端口也会给系统带来很多复杂度 - 每个应用都需要设置一个端口的参数, +而 API 服务器还需要知道如何将动态端口数值插入到配置模块中,服务也需要知道如何找到对方等等。 +与其去解决这些问题,Kubernetes 选择了其他不同的方法。 +## Kubernetes 网络模型 {#the-kubernetes-network-model} +每一个 `Pod` 都有它自己的IP地址,这就意味着你不需要显式地在每个 `Pod` 之间创建链接, +你几乎不需要处理容器端口到主机端口之间的映射。 +这将创建一个干净的、向后兼容的模型,在这个模型里,从端口分配、命名、服务发现、 +负载均衡、应用配置和迁移的角度来看,`Pod` 可以被视作虚拟机或者物理主机。 + +Kubernetes 对所有网络设施的实施,都需要满足以下的基本要求(除非有设置一些特定的网络分段策略): + +* 节点上的 Pod 可以不通过 NAT 和其他任何节点上的 Pod 通信 +* 节点上的代理(比如:系统守护进程、kubelet) 可以和节点上的所有Pod通信 + +备注:仅针对那些支持 `Pods` 在主机网络中运行的平台(比如:Linux) : + +* 那些运行在节点的主机网络里的 Pod 可以不通过 NAT 和所有节点上的 Pod 通信 + + -## Kubernetes 网络模型 +这个模型不仅不复杂,而且还和 Kubernetes 的实现廉价的从虚拟机向容器迁移的初衷相兼容, +如果你的工作开始是在虚拟机中运行的,你的虚拟机有一个 IP , +这样就可以和其他的虚拟机进行通信,这是基本相同的模型。 -每一个 `Pod` 都有它自己的IP地址,这就意味着你不需要显式地在每个 `Pod` 之间创建链接,你几乎不需要处理容器端口到主机端口之间的映射。这将创建一个干净的、向后兼容的模型,在这个模型里,从端口分配、命名、服务发现、负载均衡、应用配置和迁移的角度来看,`Pod` 可以被视作虚拟机或者物理主机。 - -Kubernetes 对所有网络设施的实施,都需要满足以下的基本要求(除非有设置一些特定的网络分段策略): - - * 节点上的 pods 可以不通过 NAT 和其他任何节点上的 pods 通信 - * 节点上的代理(比如:系统守护进程、kubelet) 可以和节点上的所有pods通信 - -备注:仅针对那些支持 `Pods` 在主机网络中运行的平台(比如:Linux) : - - * 那些运行在节点的主机网络里的 pods 可以不通过 NAT 和所有节点上的 pods 通信 - -这个模型不仅不复杂,而且还和 Kubernetes 的实现廉价的从虚拟机向容器迁移的初衷相兼容,如果你的工作开始是在虚拟机中运行的,你的虚拟机有一个 IP ,这样就可以和其他的虚拟机进行通信,这是基本相同的模型。 - -Kubernetes 的 IP 地址存在于 `Pod` 范围内 - 容器分享他们的网络命名空间 - 包括他们的 IP 地址。这就意味着 `Pod` 内的容器都可以通过 `localhost` 到达各个端口。这也意味着 `Pod` 内的容器都需要相互协调端口的使用,但是这和虚拟机中的进程似乎没有什么不同,这也被称为“一个 pod 一个 IP” 模型。 +Kubernetes 的 IP 地址存在于 `Pod` 范围内 - 容器分享它们的网络命名空间 - 包括它们的 IP 地址。 +这就意味着 `Pod` 内的容器都可以通过 `localhost` 到达各个端口。 +这也意味着 `Pod` 内的容器都需要相互协调端口的使用,但是这和虚拟机中的进程似乎没有什么不同, +这也被称为“一个 Pod 一个 IP” 模型。 如何实现这一点是正在使用的容器运行时的特定信息。 -也可以在 `node` 本身通过端口去请求你的 `Pod` (称之为主机端口),但这是一个很特殊的操作。转发方式如何实现也是容器运行时的细节。`Pod` 自己并不知道这些主机端口是否存在。 +也可以在 `node` 本身通过端口去请求你的 `Pod` (称之为主机端口), +但这是一个很特殊的操作。转发方式如何实现也是容器运行时的细节。 +`Pod` 自己并不知道这些主机端口是否存在。 ## 如何实现 Kubernetes 的网络模型 -有很多种方式可以实现这种网络模型,本文档并不是对各种实现技术的详细研究,但是希望可以作为对各种技术的详细介绍,并且成为你研究的起点。 +有很多种方式可以实现这种网络模型,本文档并不是对各种实现技术的详细研究, +但是希望可以作为对各种技术的详细介绍,并且成为你研究的起点。 -接下来的网络技术是按照首字母排序,并无其他任何含义。 +接下来的网络技术是按照首字母排序,顺序本身并无其他意义。 ### ACI -[Cisco Application Centric Infrastructure](https://www.cisco.com/c/en/us/solutions/data-center-virtualization/application-centric-infrastructure/index.html) 提供了一个集成覆盖和底层 SDN 解决方案来支持容器、虚拟机和其他裸机服务器。[ACI](https://www.github.com/noironetworks/aci-containers) 为ACI提供了容器网络集成。点击[这里](https://www.cisco.com/c/dam/en/us/solutions/collateral/data-center-virtualization/application-centric-infrastructure/solution-overview-c22-739493.pdf)查看概述 +[Cisco Application Centric Infrastructure](https://www.cisco.com/c/en/us/solutions/data-center-virtualization/application-centric-infrastructure/index.html) +提供了一个集成覆盖网络和底层 SDN 的解决方案来支持容器、虚拟机和其他裸机服务器。 +[ACI](https://www.github.com/noironetworks/aci-containers) 为 ACI 提供了容器网络集成。 +点击[这里](https://www.cisco.com/c/dam/en/us/solutions/collateral/data-center-virtualization/application-centric-infrastructure/solution-overview-c22-739493.pdf)查看概述。 ### Antrea -[Antrea](https://github.com/vmware-tanzu/antrea) 项目是一个开源的,旨在成为 Kubernetes 原生的网络解决方案。它利用 Open vSwitch 作为网络数据平面。Open vSwitch 是一个高性能可编程的虚拟交换机,支持 Linux 和 Windows 平台。Open vSwitch 使 Antrea 能够以高性能和高效的方式实现 Kubernetes 的网络策略。借助 Open vSwitch 可编程的特性, Antrea 能够在 Open vSwitch 之上实现广泛的网络,安全功能和服务。 +[Antrea](https://github.com/vmware-tanzu/antrea) 项目是一个开源的联网解决方案,旨在成为 +Kubernetes 原生的网络解决方案。它利用 Open vSwitch 作为网络数据平面。 +Open vSwitch 是一个高性能可编程的虚拟交换机,支持 Linux 和 Windows 平台。 +Open vSwitch 使 Antrea 能够以高性能和高效的方式实现 Kubernetes 的网络策略。 +借助 Open vSwitch 可编程的特性,Antrea 能够在 Open vSwitch 之上实现广泛的联网、安全功能和服务。 -### Apstra 中的 AOS +### Apstra 的 AOS -[AOS](http://www.apstra.com/products/aos/) 是一个基于意图的网络系统,可以通过一个简单的集成平台创建和管理复杂的数据中心环境。AOS 利用高度可扩展的分布式设计来消除网络中断,同时将成本降至最低。 +[AOS](https://www.apstra.com/products/aos/) 是一个基于意图的网络系统, +可以通过一个简单的集成平台创建和管理复杂的数据中心环境。 +AOS 利用高度可扩展的分布式设计来消除网络中断,同时将成本降至最低。 -AOS 参考设计当前支持三层连接的主机,这些主机消除了旧的两层连接的交换问题。这些三层连接的主机可以是 Linux(Debian、Ubuntu、CentOS)系统,它们直接在机架式交换机(TOR)的顶部创建 BGP 邻居关系。AOS 自动执行路由邻接,然后提供对 Kubernetes 部署中常见的路由运行状况注入(RHI)的精细控制。 +AOS 参考设计当前支持三层连接的主机,这些主机消除了旧的两层连接的交换问题。 +这些三层连接的主机可以是 Linux(Debian、Ubuntu、CentOS)系统, +它们直接在机架式交换机(TOR)的顶部创建 BGP 邻居关系。 +AOS 自动执行路由邻接,然后提供对 Kubernetes 部署中常见的路由运行状况注入(RHI)的精细控制。 -AOS 具有一组丰富的 REST API 端点,这些端点使 Kubernetes 能够根据应用程序需求快速更改网络策略。进一步的增强功能将用于网络设计的 AOS Graph 模型与工作负载供应集成在一起,从而为私有云和公共云提供端到端管理系统。 +AOS 具有一组丰富的 REST API 端点,这些端点使 Kubernetes 能够根据应用程序需求快速更改网络策略。 +进一步的增强功能将用于网络设计的 AOS Graph 模型与工作负载供应集成在一起, +从而为私有云和公共云提供端到端管理系统。 -AOS 支持使用包括 Cisco、Arista、Dell、Mellanox、HPE 在内的制造商提供的通用供应商设备,以及大量白盒系统和开放网络操作系统,例如 Microsoft SONiC、Dell OPX 和 Cumulus Linux 。 +AOS 支持使用包括 Cisco、Arista、Dell、Mellanox、HPE 在内的制造商提供的通用供应商设备, +以及大量白盒系统和开放网络操作系统,例如 Microsoft SONiC、Dell OPX 和 Cumulus Linux 。 -想要更详细地了解 AOS 系统是如何工作的可以点击这里: http://www.apstra.com/products/how-it-works/ +想要更详细地了解 AOS 系统是如何工作的可以点击这里:https://www.apstra.com/products/how-it-works/ ### Kubernetes 的 AWS VPC CNI -[AWS VPC CNI](https://github.com/aws/amazon-vpc-cni-k8s) 为 Kubernetes 集群提供了集成的 AWS 虚拟私有云(VPC)网络。该 CNI 插件提供了高吞吐量和可用性,低延迟以及最小的网络抖动。此外,用户可以使用现有的 AWS VPC 网络和安全最佳实践来构建 Kubernetes 集群。这包括使用 VPC 流日志,VPC 路由策略和安全组进行网络流量隔离的功能。 +[AWS VPC CNI](https://github.com/aws/amazon-vpc-cni-k8s) 为 Kubernetes 集群提供了集成的 +AWS 虚拟私有云(VPC)网络。该 CNI 插件提供了高吞吐量和可用性,低延迟以及最小的网络抖动。 +此外,用户可以使用现有的 AWS VPC 网络和安全最佳实践来构建 Kubernetes 集群。 +这包括使用 VPC 流日志、VPC 路由策略和安全组进行网络流量隔离的功能。 -使用该 CNI 插件,可使 Kubernetes Pods 在 Pod 中拥有与在 VPC 网络上相同的 IP 地址。CNI 将 AWS 弹性网络接口(ENI)分配给每个 Kubernetes 节点,并将每个 ENI 的辅助 IP 范围用于该节点上的 Pod 。CNI 包含用于 ENI 和 IP 地址的预分配的控件,以便加快 Pod 的启动时间,并且能够支持多达2000个节点的大型集群。 +使用该 CNI 插件,可使 Kubernetes Pod 拥有与在 VPC 网络上相同的 IP 地址。 +CNI 将 AWS 弹性网络接口(ENI)分配给每个 Kubernetes 节点,并将每个 ENI 的辅助 IP 范围用于该节点上的 Pod 。 +CNI 包含用于 ENI 和 IP 地址的预分配的控件,以便加快 Pod 的启动时间,并且能够支持多达2000个节点的大型集群。 -此外,CNI可以与[用于执行网络策略的 Calico](https://docs.aws.amazon.com/eks/latest/userguide/calico.html)一起运行。 AWS VPC CNI项目是开源的,查看 [GitHub 上的文档](https://github.com/aws/amazon-vpc-cni-k8s)。 +此外,CNI 可以与 +[用于执行网络策略的 Calico](https://docs.aws.amazon.com/eks/latest/userguide/calico.html)一起运行。 +AWS VPC CNI 项目是开源的,请查看 [GitHub 上的文档](https://github.com/aws/amazon-vpc-cni-k8s)。 ### Kubernetes 的 Azure CNI -[Azure CNI](https://docs.microsoft.com/en-us/azure/virtual-network/container-networking-overview) 是一个[开源插件](https://github.com/Azure/azure-container-networking/blob/master/docs/cni.md),将 Kubernetes Pods 和 Azure 虚拟网络(也称为 VNet)集成在一起,可提供与 VN 相当的网络性能。Pod 可以通过 Express Route 或者 站点到站点的 VPN 来连接到对等的 VNet ,也可以从这些网络来直接访问 Pod。Pod 可以访问受服务端点或者受保护链接的 Azure 服务,比如存储和 SQL。你可以使用 VNet 安全策略和路由来筛选 Pod 流量。该插件通过利用在 Kubernetes 节点的网络接口上预分配的辅助 IP 池将 VNet 分配给 Pod 。 +[Azure CNI](https://docs.microsoft.com/en-us/azure/virtual-network/container-networking-overview) +是一个[开源插件](https://github.com/Azure/azure-container-networking/blob/master/docs/cni.md), +将 Kubernetes Pods 和 Azure 虚拟网络(也称为 VNet)集成在一起,可提供与 VM 相当的网络性能。 +Pod 可以通过 Express Route 或者 站点到站点的 VPN 来连接到对等的 VNet , +也可以从这些网络来直接访问 Pod。Pod 可以访问受服务端点或者受保护链接的 Azure 服务,比如存储和 SQL。 +你可以使用 VNet 安全策略和路由来筛选 Pod 流量。 +该插件通过利用在 Kubernetes 节点的网络接口上预分配的辅助 IP 池将 VNet 分配给 Pod 。 -Azure CNI 可以在 [Azure Kubernetes Service (AKS)](https://docs.microsoft.com/en-us/azure/aks/configure-azure-cni) 中获得。 +Azure CNI 可以在 +[Azure Kubernetes Service (AKS)](https://docs.microsoft.com/en-us/azure/aks/configure-azure-cni) 中获得。 ### Big Switch Networks 的 Big Cloud Fabric -[Big Cloud Fabric](https://www.bigswitch.com/container-network-automation) 是一个基于云原生的网络架构,旨在在私有云或者本地环境中运行 Kubernetes。它使用统一的物理和虚拟 SDN,Big Cloud Fabric 解决了固有的容器网络问题,比如负载均衡、可见性、故障排除、安全策略和容器流量监控。 +[Big Cloud Fabric](https://www.bigswitch.com/container-network-automation) 是一个基于云原生的网络架构, +旨在在私有云或者本地环境中运行 Kubernetes。 +它使用统一的物理和虚拟 SDN,Big Cloud Fabric 解决了固有的容器网络问题, +比如负载均衡、可见性、故障排除、安全策略和容器流量监控。 -在 Big Cloud Fabric 的虚拟 Pod 多租户架构的帮助下,容器编排系统(比如 Kubernetes、RedHat OpenShift、Mesosphere DC/OS 和 Docker Swarm)将于VM本地编排系统(比如 VMware、OpenStack 和 Nutanix)进行本地集成。客户将能够安全地互联任意数量的这些集群,并且在需要时启用他们之间的租户间通信。 +在 Big Cloud Fabric 的虚拟 Pod 多租户架构的帮助下,容器编排系统 +(比如 Kubernetes、RedHat OpenShift、Mesosphere DC/OS 和 Docker Swarm) +将与 VM 本地编排系统(比如 VMware、OpenStack 和 Nutanix)进行本地集成。 +客户将能够安全地互联任意数量的这些集群,并且在需要时启用他们之间的租户间通信。 -在最新的 [Magic Quadrant](http://go.bigswitch.com/17GatedDocuments-MagicQuadrantforDataCenterNetworking_Reg.html) 上,BCF 被 Gartner 认为是非常有远见的。而 BCF 的一条关于 Kubernetes 的本地部署(其中包括 Kubernetes、DC/OS 和在不同地理区域的多个 DC 上运行的 VMware)也在[这里](https://portworx.com/architects-corner-kubernetes-satya-komala-nio/)被引用。 +在最新的 [Magic Quadrant](https://go.bigswitch.com/17GatedDocuments-MagicQuadrantforDataCenterNetworking_Reg.html) 上, +BCF 被 Gartner 认为是非常有远见的。 +而 BCF 的一条关于 Kubernetes 的本地部署(其中包括 Kubernetes、DC/OS 和在不同地理区域的多个 +DC 上运行的 VMware)也在[这里](https://portworx.com/architects-corner-kubernetes-satya-komala-nio/)被引用。 ### Cilium -[Cilium](https://github.com/cilium/cilium) 是一个开源软件,用于提供并透明保护应用容器间的网络连接。Cilium 支持 L7/HTTP ,可以在 L3-L7 上通过使用与网络分离的基于身份的安全模型寻址来实施网络策略,并且可以与其他 CNI 插件结合使用。 +[Cilium](https://github.com/cilium/cilium) 是一个开源软件,用于提供并透明保护应用容器间的网络连接。 +Cilium 支持 L7/HTTP,可以在 L3-L7 上通过使用与网络分离的基于身份的安全模型寻址来实施网络策略, +并且可以与其他 CNI 插件结合使用。 ### 华为的 CNI-Genie -[CNI-Genie](https://github.com/Huawei-PaaS/CNI-Genie) 是一个 CNI 插件,可以让 Kubernetes 在运行时允许不同的 [Kubernetes 的网络模型](https://github.com/kubernetes/website/blob/master/content/en/docs/concepts/cluster-administration/networking.md#the-kubernetes-network-model)的[实现同时被访问](https://github.com/Huawei-PaaS/CNI-Genie/blob/master/docs/multiple-cni-plugins/README.md#what-cni-genie-feature-1-multiple-cni-plugins-enables)。这包括以 [CNI 插件](https://github.com/containernetworking/cni#3rd-party-plugins)运行的任何实现,比如 [Flannel](https://github.com/coreos/flannel#flannel)、[Calico](http://docs.projectcalico.org/)、[Romana](http://romana.io)、[Weave-net](https://www.weave.works/products/weave-net/)。 +[CNI-Genie](https://github.com/Huawei-PaaS/CNI-Genie) 是一个 CNI 插件, +可以让 Kubernetes 在运行时使用不同的[网络模型](#the-kubernetes-network-model)的 +[实现同时被访问](https://github.com/Huawei-PaaS/CNI-Genie/blob/master/docs/multiple-cni-plugins/README.md#what-cni-genie-feature-1-multiple-cni-plugins-enables)。 +这包括以 +[CNI 插件](https://github.com/containernetworking/cni#3rd-party-plugins)运行的任何实现,比如 +[Flannel](https://github.com/coreos/flannel#flannel)、 +[Calico](https://docs.projectcalico.org/)、 +[Romana](https://romana.io)、 +[Weave-net](https://www.weave.works/products/weave-net/)。 -CNI-Genie 还支持[将多个 IP 地址分配给 Pod](https://github.com/Huawei-PaaS/CNI-Genie/blob/master/docs/multiple-ips/README.md#feature-2-extension-cni-genie-multi-ip-addresses-per-pod),每个都来自不同的 CNI 插件。 +CNI-Genie 还支持[将多个 IP 地址分配给 Pod](https://github.com/Huawei-PaaS/CNI-Genie/blob/master/docs/multiple-ips/README.md#feature-2-extension-cni-genie-multi-ip-addresses-per-pod), +每个都来自不同的 CNI 插件。 ### cni-ipvlan-vpc-k8s -[cni-ipvlan-vpc-k8s](https://github.com/lyft/cni-ipvlan-vpc-k8s) 包含了一组 CNI 和 IPAM 插件来提供一个简单的、本地主机、低延迟、高吞吐量以及通过使用 Amazon 弹性网络接口(ENI)并使用 Linux 内核的 IPv2 驱动程序以 L2 模式将 AWS 管理的 IP 绑定到 Pod 中,在 Amazon Virtual Private Cloud(VPC)环境中为 Kubernetes 兼容的网络堆栈。 +[cni-ipvlan-vpc-k8s](https://github.com/lyft/cni-ipvlan-vpc-k8s) +包含了一组 CNI 和 IPAM 插件来提供一个简单的、本地主机、低延迟、高吞吐量 +以及通过使用 Amazon 弹性网络接口(ENI)并使用 Linux 内核的 IPv2 驱动程序 +以 L2 模式将 AWS 管理的 IP 绑定到 Pod 中, +在 Amazon Virtual Private Cloud(VPC)环境中为 Kubernetes 兼容的网络堆栈。 -这些插件旨在直接在 VPC 中进行配置和部署,Kubelets 先启动,然后根据需要进行自我配置和扩展它们的 IP 使用率,而无需经常建议复杂的管理覆盖网络, BGP ,禁用源/目标检查,或调整 VPC 路由表以向每个主机提供每个实例子网的复杂性(每个 VPC 限制为50-100个条目)。简而言之, cni-ipvlan-vpc-k8s 大大降低了在 AWS 中大规模部署 Kubernetes 所需的网络复杂性。 +这些插件旨在直接在 VPC 中进行配置和部署,Kubelets 先启动, +然后根据需要进行自我配置和扩展它们的 IP 使用率,而无需经常建议复杂的管理 +覆盖网络、BGP、禁用源/目标检查或调整 VPC 路由表以向每个主机提供每个实例子网的 +复杂性(每个 VPC 限制为50-100个条目)。 +简而言之,cni-ipvlan-vpc-k8s 大大降低了在 AWS 中大规模部署 Kubernetes 所需的网络复杂性。 ### Contiv -[Contiv](https://github.com/contiv/netplugin) 为各种使用情况提供了一个可配置网络(使用了 BGP 的本地 l3 ,使用 vxlan 的覆盖,经典 l2 或 Cisco-SDN/ACI)。[Contiv](http://contiv.io) 是完全开源的。 +[Contiv](https://github.com/contiv/netplugin) +为各种使用情况提供了一个可配置网络(使用了 BGP 的本地 L3, +使用 vxlan 、经典 L2 或 Cisco-SDN/ACI 的覆盖网络)。 +[Contiv](https://contiv.io) 是完全开源的。 +### Contrail/Tungsten Fabric -### Contrail / Tungsten Fabric - -[Contrail](http://www.juniper.net/us/en/products-services/sdn/contrail/contrail-networking/) 是基于 [Tungsten Fabric](https://tungsten.io) 的,真正开放的,多云网络虚拟化和策略管理平台。Contrail 和 Tungsten Fabric 与各种编排系统集成在一起,例如 Kubernetes,OpenShift,OpenStack 和 Mesos,并为虚拟机、容器或 Pods 以及裸机工作负载提供了不同的隔离模式。 +[Contrail](https://www.juniper.net/us/en/products-services/sdn/contrail/contrail-networking/) +是基于 [Tungsten Fabric](https://tungsten.io) 的,真正开放的多云网络虚拟化和策略管理平台。 +Contrail 和 Tungsten Fabric 与各种编排系统集成在一起,例如 Kubernetes、OpenShift、OpenStack 和 Mesos, +并为虚拟机、容器或 Pods 以及裸机工作负载提供了不同的隔离模式。 ### DANM -[DANM](https://github.com/nokia/danm) 是一个针对在 Kubernetes 集群中运行的电信工作负载的网络解决方案。它由以下几个组件构成: +[DANM](https://github.com/nokia/danm) 是一个针对在 Kubernetes 集群中运行的电信工作负载的网络解决方案。 +它由以下几个组件构成: - * 能够配置具有高级功能的 IPVLAN 接口的 CNI 插件 - * 一个内置的 IPAM 模块,能够管理多个、群集内的、不连续的 L3 网络,并按请求提供动态、静态或无 IP 分配方案 - * CNI 元插件能够通过自己的 CNI 或通过将任务授权给其他任何流行的 CNI 解决方案(例如 SRI-OV 或 Flannel)来实现将多个网络接口连接到容器 - * Kubernetes 控制器能够集中管理所有 Kubernetes 主机的 VxLAN 和 VLAN 接口 - * 另一个 Kubernetes 控制器扩展了 Kubernetes 的基于服务的服务发现概念,以在 Pod 的所有网络接口上工作 +* 能够配置具有高级功能的 IPVLAN 接口的 CNI 插件 +* 一个内置的 IPAM 模块,能够管理多个、群集内的、不连续的 L3 网络,并按请求提供动态、静态或无 IP 分配方案 +* CNI 元插件能够通过自己的 CNI 或通过将任务授权给其他任何流行的 CNI 解决方案(例如 SRI-OV 或 Flannel)来实现将多个网络接口连接到容器 +* Kubernetes 控制器能够集中管理所有 Kubernetes 主机的 VxLAN 和 VLAN 接口 +* 另一个 Kubernetes 控制器扩展了 Kubernetes 的基于服务的服务发现概念,以在 Pod 的所有网络接口上工作 -通过这个工具集,DANM 可以提供多个分离的网络接口,可以为 pods 使用不同的网络后端和高级 IPAM 功能。 +通过这个工具集,DANM 可以提供多个分离的网络接口,可以为 Pod 使用不同的网络后端和高级 IPAM 功能。 ### Flannel -[Flannel](https://github.com/coreos/flannel#flannel) 是一个非常简单的能够满足 Kubernetes 所需要的重叠网络。已经有许多人报告了使用 Flannel 和 Kubernetes 的成功案例。 +[Flannel](https://github.com/coreos/flannel#flannel) 是一个非常简单的能够满足 +Kubernetes 所需要的覆盖网络。已经有许多人报告了使用 Flannel 和 Kubernetes 的成功案例。 ### Google Compute Engine (GCE) -对于 Google Compute Engine 的集群配置脚本,[advanced routing](https://cloud.google.com/vpc/docs/routes) 用于为每个虚机分配一个子网(默认是 `/24` - 254个 IP),绑定到该子网的任何流量都将通过 GCE 网络结构直接路由到虚机。这是除了分配给虚机的“主要” IP 地址之外的一个补充,该 IP 地址经过 NAT 转换以用于访问外网。linux网桥(称为“cbr0”)被配置为存在于该子网中,并被传递到 docker 的 --bridge 参数上。 +对于 Google Compute Engine 的集群配置脚本, +[高级路由器](https://cloud.google.com/vpc/docs/routes) 用于为每个虚机分配一个子网(默认是 `/24` - 254个 IP), +绑定到该子网的任何流量都将通过 GCE 网络结构直接路由到虚机。 +这是除了分配给虚机的“主” IP 地址之外的一个补充,该 IP 地址经过 NAT 转换以用于访问外网。 +Linux 网桥(称为“cbr0”)被配置为存在于该子网中,并被传递到 Docker 的 --bridge 参数上。 Docker 会以这样的参数启动: @@ -373,11 +455,14 @@ Docker 会以这样的参数启动: DOCKER_OPTS="--bridge=cbr0 --iptables=false --ip-masq=false" ``` -这个网桥是由 Kubelet(由 --network-plugin=kubenet 参数控制)根据节点的 .spec.podCIDR 参数创建的。 +这个网桥是由 Kubelet(由 --network-plugin=kubenet 参数控制)根据节点的 `.spec.podCIDR` 参数创建的。 -Docker 将会从 `cbr-cidr` 块分配 IP 。容器之间可以通过 cbr0 网桥相互访问,也可以访问节点。这些 IP 都可以在 GCE 的网络中被路由。 - -而 GCE 本身并不知道这些 IP,所以不会对访问外网的流量进行 NAT,为了实现此目的,使用了 iptables 规则来伪装(又称为 SNAT,使数据包看起来好像是来自“节点”本身),将通信绑定到 GCE 项目网络(10.0.0.0/8)之外的 IP。 +Docker 将会从 `cbr-cidr` 块分配 IP。 +容器之间可以通过 `cbr0` 网桥相互访问,也可以访问节点。 +这些 IP 都可以在 GCE 的网络中被路由。 +而 GCE 本身并不知道这些 IP,所以不会对访问外网的流量进行 NAT。 +为了实现此目的,使用了 `iptables` 规则来伪装(又称为 SNAT,使数据包看起来好像是来自“节点”本身), +将通信绑定到 GCE 项目网络(10.0.0.0/8)之外的 IP。 ```shell iptables -t nat -A POSTROUTING ! -d 10.0.0.0/8 -o eth0 -j MASQUERADE @@ -389,7 +474,7 @@ iptables -t nat -A POSTROUTING ! -d 10.0.0.0/8 -o eth0 -j MASQUERADE sysctl net.ipv4.ip_forward=1 ``` -所有这些的结果是所有 `Pods` 都可以互相访问,并且可以将流量发送到互联网。 +所有这些的结果是所有 Pod 都可以互相访问,并且可以将流量发送到互联网。 ### Jaguar -[Jaguar](https://gitlab.com/sdnlab/jaguar) 是一个基于 OpenDaylight 的 Kubernetes 网络开源解决方案。Jaguar 使用 vxlan 提供覆盖网络,而 Jaguar CNIPlugin 为每个 Pod 提供一个 IP 地址。 +[Jaguar](https://gitlab.com/sdnlab/jaguar) 是一个基于 OpenDaylight 的 Kubernetes 网络开源解决方案。 +Jaguar 使用 vxlan 提供覆盖网络,而 Jaguar CNIPlugin 为每个 Pod 提供一个 IP 地址。 ### k-vswitch -[k-vswitch](https://github.com/k-vswitch/k-vswitch) 是一个基于 [Open vSwitch](https://www.openvswitch.org/) 的简易 Kubernetes 网络插件。它利用 Open vSwitch 中现有的功能来提供强大的网络插件,该插件易于操作,高效且安全。 +[k-vswitch](https://github.com/k-vswitch/k-vswitch) 是一个基于 +[Open vSwitch](https://www.openvswitch.org/) 的简易 Kubernetes 网络插件。 +它利用 Open vSwitch 中现有的功能来提供强大的网络插件,该插件易于操作,高效且安全。 - ### Knitter -[Knitter](https://github.com/ZTE/Knitter/) 是一个支持 Kubernetes 中实现多个网络系统的解决方案。它提供了租户管理和网络管理的功能。除了多个网络平面外,Knitter 还包括一组端到端的 NFV 容器网络解决方案,例如为应用程序保留 IP 地址,IP 地址迁移等。 +[Knitter](https://github.com/ZTE/Knitter/) 是一个支持 Kubernetes 中实现多个网络系统的解决方案。 +它提供了租户管理和网络管理的功能。除了多个网络平面外,Knitter 还包括一组端到端的 NFV 容器网络解决方案, +例如为应用程序保留 IP 地址、IP 地址迁移等。 ### Kube-OVN -[Kube-OVN](https://github.com/alauda/kube-ovn) 是一个基于 OVN 的用于企业的 Kubernetes 网络架构。借助于 OVN/OVS ,它提供了一些高级覆盖网络功能,例如子网、QoS、静态 IP 分配、流量镜像、网关、基于开放流的网络策略和服务代理。 +[Kube-OVN](https://github.com/alauda/kube-ovn) 是一个基于 OVN 的用于企业的 Kubernetes 网络架构。 +借助于 OVN/OVS ,它提供了一些高级覆盖网络功能,例如子网、QoS、静态 IP 分配、流量镜像、网关、 +基于 openflow 的网络策略和服务代理。 ### Kube-router -[Kube-router](https://github.com/cloudnativelabs/kube-router) 是 Kubernetes 的专用网络解决方案,旨在提供高性能和易操作性。 Kube-router 提供了一个基于 Linux [LVS/IPVS](http://www.linuxvirtualserver.org/software/ipvs.html) 的服务代理,一个基于 Linux 内核转发的无覆盖 Pod-to-Pod 网络解决方案,和基于 iptables/ipset 的网络策略执行器。 +[Kube-router](https://github.com/cloudnativelabs/kube-router) 是 Kubernetes 的专用网络解决方案, +旨在提供高性能和易操作性。 +Kube-router 提供了一个基于 Linux [LVS/IPVS](https://www.linuxvirtualserver.org/software/ipvs.html) +的服务代理、一个基于 Linux 内核转发的无覆盖 Pod-to-Pod 网络解决方案和基于 iptables/ipset 的网络策略执行器。 ### L2 networks and linux bridging -如果你具有一个“哑”的L2网络,例如“裸机”环境中的简单交换机,则应该能够执行与上述 GCE 设置类似的操作。请注意,这些说明仅是非常简单的尝试过-似乎可行,但尚未经过全面测试。如果您使用此技术并完善了流程,请告诉我们。 +如果你具有一个“哑”的L2网络,例如“裸机”环境中的简单交换机,则应该能够执行与上述 GCE 设置类似的操作。 +请注意,这些说明仅是非常简单的尝试过-似乎可行,但尚未经过全面测试。 +如果您使用此技术并完善了流程,请告诉我们。 -根据 Lars Kellogg-Stedman 的这份非常不错的“Linux 网桥设备”[使用说明](http://blog.oddbit.com/2014/08/11/four-ways-to-connect-a-docker/)来进行操作。 +根据 Lars Kellogg-Stedman 的这份非常不错的“Linux 网桥设备” +[使用说明](https://blog.oddbit.com/2014/08/11/four-ways-to-connect-a-docker/)来进行操作。 ### Multus (a Multi Network plugin) -[Multus](https://github.com/Intel-Corp/multus-cni) 是一个多 CNI 插件,使用 Kubernetes 中基于 CRD 的网络对象来支持实现 Kubernetes 多网络系统。 +[Multus](https://github.com/Intel-Corp/multus-cni) 是一个多 CNI 插件, +使用 Kubernetes 中基于 CRD 的网络对象来支持实现 Kubernetes 多网络系统。 -Multus 支持所有[参考插件](https://github.com/containernetworking/plugins)(比如: [Flannel](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel)、[DHCP](https://github.com/containernetworking/plugins/tree/master/plugins/ipam/dhcp)、[Macvlan](https://github.com/containernetworking/plugins/tree/master/plugins/main/macvlan) ),来实现 CNI 规范和第三方插件(比如: [Calico](https://github.com/projectcalico/cni-plugin)、[Weave](https://github.com/weaveworks/weave)、[Cilium](https://github.com/cilium/cilium)、[Contiv](https://github.com/contiv/netplugin))。除此之外, Multus 还支持 [SRIOV](https://github.com/hustcat/sriov-cni)、[DPDK](https://github.com/Intel-Corp/sriov-cni)、[OVS-DPDK & VPP](https://github.com/intel/vhost-user-net-plugin) 的工作负载,以及 Kubernetes 中基于云的本机应用程序和基于 NFV 的应用程序。 +Multus 支持所有[参考插件](https://github.com/containernetworking/plugins)(比如: +[Flannel](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel)、 +[DHCP](https://github.com/containernetworking/plugins/tree/master/plugins/ipam/dhcp)、 +[Macvlan](https://github.com/containernetworking/plugins/tree/master/plugins/main/macvlan) ) +来实现 CNI 规范和第三方插件(比如: +[Calico](https://github.com/projectcalico/cni-plugin)、 +[Weave](https://github.com/weaveworks/weave)、 +[Cilium](https://github.com/cilium/cilium)、 +[Contiv](https://github.com/contiv/netplugin))。 +除此之外, Multus 还支持 +[SRIOV](https://github.com/hustcat/sriov-cni)、 +[DPDK](https://github.com/Intel-Corp/sriov-cni)、 +[OVS-DPDK & VPP](https://github.com/intel/vhost-user-net-plugin) 的工作负载, +以及 Kubernetes 中基于云的本机应用程序和基于 NFV 的应用程序。 ### NSX-T -[VMware NSX-T](https://docs.vmware.com/en/VMware-NSX-T/index.html) 是一个网络虚拟化的安全平台。 NSX-T 可以为多云及多系统管理程序环境提供网络虚拟化,并专注于具有异构端点和技术堆栈的新兴应用程序框架和体系结构。除了 vSphere 管理程序之外,这些环境还包括其他虚拟机管理程序,例如 KVM,容器和裸机。 +[VMware NSX-T](https://docs.vmware.com/en/VMware-NSX-T/index.html) 是一个网络虚拟化和安全平台。 +NSX-T 可以为多云及多系统管理程序环境提供网络虚拟化,并专注于具有异构端点和技术堆栈的新兴应用程序框架和体系结构。 +除了 vSphere 管理程序之外,这些环境还包括其他虚拟机管理程序,例如 KVM、容器和裸机。 -[NSX-T Container Plug-in (NCP)](https://docs.vmware.com/en/VMware-NSX-T/2.0/nsxt_20_ncp_kubernetes.pdf) 提供了 NSX-T 与容器协调器(例如 Kubernetes)之间的结合, 以及 NSX-T 与基于容器的 CaaS/PaaS 平台(例如 Pivotal Container Service(PKS) 和 OpenShift )之间的集成。 +[NSX-T Container Plug-in (NCP)](https://docs.vmware.com/en/VMware-NSX-T/2.0/nsxt_20_ncp_kubernetes.pdf) +提供了 NSX-T 与容器协调器(例如 Kubernetes)之间的结合, +以及 NSX-T 与基于容器的 CaaS/PaaS 平台(例如 Pivotal Container Service(PKS)和 OpenShift)之间的集成。 ### Nuage Networks VCS (Virtualized Cloud Services) -[Nuage](http://www.nuagenetworks.net) 提供了一个高度可扩展的基于策略的软件定义网络(SDN)平台,Nuage 使用开源的 Open vSwitch 作为数据平面,以及基于开放标准构建具有丰富功能的 SDN 控制器。 +[Nuage](https://www.nuagenetworks.net) 提供了一个高度可扩展的基于策略的软件定义网络(SDN)平台。 +Nuage 使用开源的 Open vSwitch 作为数据平面,以及基于开放标准构建具有丰富功能的 SDN 控制器。 -Nuage 平台使用覆盖层在 Kubernetes Pod 和非 Kubernetes 环境(VM 和裸机服务器)之间提供基于策略的无缝联网。Nuage 的策略抽象模型在设计时就考虑到了应用程序,并且可以轻松声明应用程序的细粒度策略。该平台的实时分析引擎可为 Kubernetes 应用程序提供可见性和安全性监控。 +Nuage 平台使用覆盖层在 Kubernetes Pod 和非 Kubernetes 环境(VM 和裸机服务器)之间提供基于策略的无缝联网。 +Nuage 的策略抽象模型在设计时就考虑到了应用程序,并且可以轻松声明应用程序的细粒度策略。 +该平台的实时分析引擎可为 Kubernetes 应用程序提供可见性和安全性监控。 ### OpenVSwitch -[OpenVSwitch](https://www.openvswitch.org/) 是一个较为成熟的解决方案,但同时也增加了构建覆盖网络的复杂性,这也得到了几个网络系统的“大商店”的拥护。 +[OpenVSwitch](https://www.openvswitch.org/) 是一个较为成熟的解决方案,但同时也增加了构建覆盖网络的复杂性。 +这也得到了几个网络系统的“大商店”的拥护。 ### OVN (开放式虚拟网络) -OVN 是一个由 Open vSwitch 社区开发的开源的网络虚拟化解决方案。它允许创建逻辑交换器,逻辑路由,状态 ACL,负载均衡等等来建立不同的虚拟网络拓扑。该项目有一个特定的Kubernetes插件和文档 [ovn-kubernetes](https://github.com/openvswitch/ovn-kubernetes)。 +OVN 是一个由 Open vSwitch 社区开发的开源的网络虚拟化解决方案。 +它允许创建逻辑交换器、逻辑路由、状态 ACL、负载均衡等等来建立不同的虚拟网络拓扑。 +该项目有一个特定的Kubernetes插件和文档 [ovn-kubernetes](https://github.com/openvswitch/ovn-kubernetes)。 -### Project Calico +### Calico 项目 {#project-calico} -[Project Calico](http://docs.projectcalico.org/) 是一个开源的容器网络提供者和网络策略引擎。 +[Calico 项目](https://docs.projectcalico.org/) 是一个开源的容器网络提供者和网络策略引擎。 -Calico 提供了高度可扩展的网络和网络解决方案,使用基于与 Internet 相同的 IP 网络原理来连接 Kubernetes Pod,适用于 Linux (开放源代码)和 Windows(专有-可从 [Tigera](https//www.tigera.io/essentials/) 获得。可以无需封装或覆盖即可部署 Calico,以提供高性能,高可扩的数据中心网络。Calico 还通过其分布式防火墙为 Kubernetes Pod 提供了基于意图的细粒度网络安全策略。 +Calico 提供了高度可扩展的网络和网络解决方案,使用基于与 Internet 相同的 IP 网络原理来连接 Kubernetes Pod, +适用于 Linux (开放源代码)和 Windows(专有-可从 [Tigera](https://www.tigera.io/essentials/) 获得。 +可以无需封装或覆盖即可部署 Calico,以提供高性能,高可扩的数据中心网络。 +Calico 还通过其分布式防火墙为 Kubernetes Pod 提供了基于意图的细粒度网络安全策略。 -Calico 还可以和其他的网络解决方案(比如 Flannel、[canal](https://github.com/tigera/canal) 或本机 GCE、AWS、Azure 等)一起以策略实施模式运行。 +Calico 还可以和其他的网络解决方案(比如 Flannel、[canal](https://github.com/tigera/canal) +或原生 GCE、AWS、Azure 网络等)一起以策略实施模式运行。 ### Romana -[Romana](http://romana.io) 是一个开源网络和安全自动化解决方案。它可以让你在没有覆盖网络的情况下部署 Kubernetes。Romana 支持 Kubernetes [网络策略](/docs/concepts/services-networking/network-policies/),来提供跨网络命名空间的隔离。 +[Romana](https://romana.io) 是一个开源网络和安全自动化解决方案。 +它可以让你在没有覆盖网络的情况下部署 Kubernetes。 +Romana 支持 Kubernetes [网络策略](/zh/docs/concepts/services-networking/network-policies/), +来提供跨网络命名空间的隔离。 ### Weaveworks 的 Weave Net -[Weave Net](https://www.weave.works/products/weave-net/) 是 Kubernetes 及其托管应用程序的弹性和易于使用的网络系统。Weave Net 可以作为 [CNI plug-in](https://www.weave.works/docs/net/latest/cni-plugin/) 运行或者独立运行。在这两种运行方式里,都不需要任何配置或额外的代码即可运行,并且在两种情况下,网络都为每个 Pod 提供一个 IP 地址-这是 Kubernetes 的标准配置。 - - +[Weave Net](https://www.weave.works/products/weave-net/) 是 Kubernetes 及其 +托管应用程序的弹性且易于使用的网络系统。 +Weave Net 可以作为 [CNI 插件](https://www.weave.works/docs/net/latest/cni-plugin/) 运行或者独立运行。 +在这两种运行方式里,都不需要任何配置或额外的代码即可运行,并且在两种情况下, +网络都为每个 Pod 提供一个 IP 地址 -- 这是 Kubernetes 的标准配置。 ## {{% heading "whatsnext" %}} - -网络模型的早期设计、运行原理以及未来的一些计划,都在 [networking design -document](https://git.k8s.io/community/contributors/design-proposals/network/networking.md) 文档里进行了更详细的描述。 - +网络模型的早期设计、运行原理以及未来的一些计划,都在 +[联网设计文档](https://git.k8s.io/community/contributors/design-proposals/network/networking.md) +里有更详细的描述。 diff --git a/content/zh/docs/concepts/cluster-administration/proxies.md b/content/zh/docs/concepts/cluster-administration/proxies.md index 5b1941d4ae..808d8b31ec 100644 --- a/content/zh/docs/concepts/cluster-administration/proxies.md +++ b/content/zh/docs/concepts/cluster-administration/proxies.md @@ -1,19 +1,42 @@ --- title: Kubernetes 中的代理 content_type: concept +weight: 90 --- + + 本文讲述了 Kubernetes 中所使用的代理。 - -## 代理 + +## 代理 {#proxies} 用户在使用 Kubernetes 的过程中可能遇到几种不同的代理(proxy): -1. [kubectl proxy](/docs/tasks/access-application-cluster/access-cluster/#directly-accessing-the-rest-api): + +1. [kubectl proxy](/zh/docs/tasks/access-application-cluster/access-cluster/#directly-accessing-the-rest-api): - 运行在用户的桌面或 pod 中 - 从本机地址到 Kubernetes apiserver 的代理 @@ -22,7 +45,18 @@ content_type: concept - 指向 apiserver - 添加认证头信息 -1. [apiserver proxy](/docs/tasks/access-application-cluster/access-cluster/#discovering-builtin-services): + +2. [apiserver proxy](/zh/docs/tasks/access-application-cluster/access-cluster/#discovering-builtin-services): - 是一个建立在 apiserver 内部的“堡垒” - 将集群外部的用户与群集 IP 相连接,这些IP是无法通过其他方式访问的 @@ -32,31 +66,66 @@ content_type: concept - 可以用来访问 Node、 Pod 或 Service - 当用来访问 Service 时,会进行负载均衡 -1. [kube proxy](/docs/concepts/services-networking/service/#ips-and-vips): + +3. [kube proxy](/zh/docs/concepts/services-networking/service/#ips-and-vips): - 在每个节点上运行 - - 代理 UDP 和 TCP + - 代理 UDP、TCP 和 SCTP - 不支持 HTTP - 提供负载均衡能力 - 只用来访问 Service -1. apiserver 之前的代理/负载均衡器: + +4. apiserver 之前的代理/负载均衡器: -1. 外部服务的云负载均衡器: + - 在不同集群中的存在形式和实现不同 (如 nginx) + - 位于所有客户端和一个或多个 API 服务器之间 + - 存在多个 API 服务器时,扮演负载均衡器的角色 - - 由一些云供应商提供 (如AWS ELB、 Google Cloud Load Balancer) - - Kubernetes service 为 `LoadBalancer` 类型时自动创建 - - 只使用 UDP/TCP 协议 - - 不同云供应商的实现不同。 + +5. 外部服务的云负载均衡器: + + - 由一些云供应商提供 (如 AWS ELB、Google Cloud Load Balancer) + - Kubernetes 服务类型为 `LoadBalancer` 时自动创建 + - 通常仅支持 UDP/TCP 协议 + - SCTP 支持取决于云供应商的负载均衡器实现 + - 不同云供应商的云负载均衡器实现不同 + + Kubernetes 用户通常只需要关心前两种类型的代理,集群管理员通常需要确保后面几种类型的代理设置正确。 + ## 请求重定向 -代理已经取代重定向功能,重定向已被弃用。 - +代理已经取代重定向功能,重定向功能已被弃用。 diff --git a/content/zh/docs/concepts/configuration/manage-resources-containers.md b/content/zh/docs/concepts/configuration/manage-resources-containers.md index 8860f5807d..ef14f7608d 100644 --- a/content/zh/docs/concepts/configuration/manage-resources-containers.md +++ b/content/zh/docs/concepts/configuration/manage-resources-containers.md @@ -55,7 +55,7 @@ a Pod scheduled to a Node with 8GiB of memory and no other Pods, then the contai more RAM. --> -## 请求和约束 +## 请求和约束 {#requests-and-limits} 如果 Pod 运行所在的节点具有足够的可用资源,容器可能(且可以)使用超出对应资源 `request` 属性所设置的资源量。不过,容器不可以使用超出其资源 `limit` @@ -90,6 +90,7 @@ runtimes can have different ways to implement the same restrictions. - -## 资源类型 +## 资源类型 {#resource-types} *CPU* 和*内存*都是*资源类型*。每种资源类型具有其基本单位。 CPU 表达的是计算处理能力,其单位是 [Kubernetes CPUs](#meaning-of-cpu)。 @@ -210,13 +210,13 @@ CPU 总是按绝对数量来请求的,不可以使用相对数量; - -## 内存的含义 +## 内存的含义 {#meaning-of-memory} 内存的约束和请求以字节为单位。你可以使用以下后缀之一以一般整数或定点整数形式来表示内存: E、P、T、G、M、K。你也可以使用对应的 2 的幂数:Ei、Pi、Ti、Gi、Mi、Ki。 @@ -403,8 +403,7 @@ The kubelet can provide scratch space to Pods using local ephemeral storage to mount [`emptyDir`](https://kubernetes.io/docs/concepts/storage/volumes/#emptydir) {{< glossary_tooltip term_id="volume" text="volumes" >}} into containers. --> - -## 本地临时存储 +## 本地临时存储 {#local-ephemeral-storage} {{< feature-state for_k8s_version="v1.10" state="beta" >}} @@ -862,7 +861,7 @@ operator must advertise an Extended Resource. Second, users must request the Extended Resource in Pods. --> -## 扩展资源(Extended Resources) +## 扩展资源(Extended Resources) {#extended-resources} 扩展资源是 `kubernetes.io` 域名之外的标准资源名称。 它们使得集群管理员能够颁布非 Kubernetes 内置资源,而用户可以使用他们。 diff --git a/content/zh/docs/concepts/containers/container-environment.md b/content/zh/docs/concepts/containers/container-environment.md index 777f746f67..543260c95a 100644 --- a/content/zh/docs/concepts/containers/container-environment.md +++ b/content/zh/docs/concepts/containers/container-environment.md @@ -3,6 +3,14 @@ title: 容器环境 content_type: concept weight: 20 --- + @@ -11,9 +19,6 @@ This page describes the resources available to Containers in the Container envir --> 本页描述了在容器环境里容器可用的资源。 - - - -## 容器环境 +## 容器环境 {#container-environment} Kubernetes 的容器环境给容器提供了几个重要的资源: -* 文件系统,其中包含一个[镜像](/docs/concepts/containers/images/) 和一个或多个的[卷](/docs/concepts/storage/volumes/)。 -* 容器自身的信息。 -* 集群中其他对象的信息。 +* 文件系统,其中包含一个[镜像](/zh/docs/concepts/containers/images/) + 和一个或多个的[卷](/zh/docs/concepts/storage/volumes/) +* 容器自身的信息 +* 集群中其他对象的信息 ### 容器信息 -容器的 *hostname* 是它所运行在的 pod 的名称。它可以通过 `hostname` 命令或者调用 libc 中的 [`gethostname`](http://man7.org/linux/man-pages/man2/gethostname.2.html) 函数来获取。 +容器的 *hostname* 是它所运行在的 pod 的名称。它可以通过 `hostname` 命令或者调用 libc 中的 +[`gethostname`](https://man7.org/linux/man-pages/man2/gethostname.2.html) 函数来获取。 -Pod 名称和命名空间可以通过 [downward API](/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/) 使用环境变量。 +Pod 名称和命名空间可以通过 +[下行 API](/zh/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/) +转换为环境变量。 Pod 定义中的用户所定义的环境变量也可在容器中使用,就像在 Docker 镜像中静态指定的任何环境变量一样。 @@ -79,19 +88,18 @@ FOO_SERVICE_PORT= Services have dedicated IP addresses and are available to the Container via DNS, if [DNS addon](http://releases.k8s.io/{{< param "githubbranch" >}}/cluster/addons/dns/) is enabled.  --> -Service 具有专用的 IP 地址。如果启用了 [DNS插件](http://releases.k8s.io/{{< param "githubbranch" >}}/cluster/addons/dns/),就可以在容器中通过 DNS 来访问。 - - +服务具有专用的 IP 地址。如果启用了 +[DNS插件](https://releases.k8s.io/{{< param "githubbranch" >}}/cluster/addons/dns/), +可以在容器中通过 DNS 来访问服务。 ## {{% heading "whatsnext" %}} - -* 学习更多有关[容器生命周期钩子](/docs/concepts/containers/container-lifecycle-hooks/)的知识。 -* 动手获得经验[将处理程序附加到容器生命周期事件](/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/)。 +* 学习更多有关[容器生命周期回调](/zh/docs/concepts/containers/container-lifecycle-hooks/)的知识 +* 动手[为容器生命周期事件添加处理程序](/zh/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/) diff --git a/content/zh/docs/concepts/containers/container-lifecycle-hooks.md b/content/zh/docs/concepts/containers/container-lifecycle-hooks.md index 14063a4003..0408e7650f 100644 --- a/content/zh/docs/concepts/containers/container-lifecycle-hooks.md +++ b/content/zh/docs/concepts/containers/container-lifecycle-hooks.md @@ -1,12 +1,8 @@ --- -reviewers: -- mikedanese -- thockin -title: 容器生命周期钩子 +title: 容器生命周期回调 content_type: concept weight: 30 --- - - -这个页面描述了 kubelet 管理的容器如何使用容器生命周期钩子框架来运行在其管理生命周期中由事件触发的代码。 - - - +这个页面描述了 kubelet 管理的容器如何使用容器生命周期回调框架, +藉由其管理生命周期中的事件触发,运行指定代码。 -## 概述 - - -类似于许多具有生命周期钩子组件的编程语言框架,例如 Angular、Kubernetes 为容器提供了生命周期钩子。 -钩子使容器能够了解其管理生命周期中的事件,并在执行相应的生命周期钩子时运行在处理程序中实现的代码。 +## 概述 + +类似于许多具有生命周期回调组件的编程语言框架,例如 Angular、Kubernetes 为容器提供了生命周期回调。 +回调使容器能够了解其管理生命周期中的事件,并在执行相应的生命周期回调时运行在处理程序中实现的代码。 -## 容器钩子 - - -有两个钩子暴露在容器中: +## 容器回调 + +有两个回调暴露给容器: `PostStart` @@ -63,8 +52,8 @@ This hook executes immediately after a container is created. However, there is no guarantee that the hook will execute before the container ENTRYPOINT. No parameters are passed to the handler. --> -这个钩子在创建容器之后立即执行。 -但是,不能保证钩子会在容器入口点之前执行。 +这个回调在创建容器之后立即执行。 +但是,不能保证回调会在容器入口点(ENTRYPOINT)之前执行。 没有参数传递给处理程序。 `PreStop` @@ -75,29 +64,29 @@ It is blocking, meaning it is synchronous, so it must complete before the call to delete the container can be sent. No parameters are passed to the handler. --> - -在容器终止之前是否立即调用此钩子,取决于 API 的请求或者管理事件,类似活动探针故障、资源抢占、资源竞争等等。 如果容器已经完全处于终止或者完成状态,则对 preStop 钩子的调用将失败。 -它是阻塞的,同时也是同步的,因此它必须在删除容器的调用之前完成。 +在容器因 API 请求或者管理事件(诸如存活态探针失败、资源抢占、资源竞争等)而被终止之前, +此回调会被调用。 +如果容器已经处于终止或者完成状态,则对 preStop 回调的调用将失败。 +此调用是阻塞的,也是同步调用,因此必须在删除容器的调用之前完成。 没有参数传递给处理程序。 -有关终止行为的更详细描述,请参见[终止 Pod](/docs/concepts/workloads/pods/pod/#termination-of-pods)。 +有关终止行为的更详细描述,请参见 +[终止 Pod](/zh/docs/concepts/workloads/pods/pod-lifecycle/#termination-of-pods)。 -### 钩子处理程序的实现 - - -容器可以通过实现和注册该钩子的处理程序来访问该钩子。 -针对容器,有两种类型的钩子处理程序可供实现: +### 回调处理程序的实现 + +容器可以通过实现和注册该回调的处理程序来访问该回调。 +针对容器,有两种类型的回调处理程序可供实现: -* Exec - 执行一个特定的命令,例如 `pre-stop.sh`,在容器的 cgroups 和名称空间中。 -命令所消耗的资源根据容器进行计算。 +* Exec - 在容器的 cgroups 和名称空间中执行特定的命令(例如 `pre-stop.sh`)。 + 命令所消耗的资源计入容器的资源消耗。 * HTTP - 对容器上的特定端点执行 HTTP 请求。 -### 钩子处理程序执行 - - -当调用容器生命周期管理钩子时,Kubernetes 管理系统在为该钩子注册的容器中执行处理程序。 +### 回调处理程序执行 + +当调用容器生命周期管理回调时,Kubernetes 管理系统在注册了回调的容器中执行处理程序。 -钩子处理程序调用在包含容器的 Pod 上下文中是同步的。 -这意味着对于 `PostStart` 钩子,容器入口点和钩子异步触发。 -但是,如果钩子运行或挂起的时间太长,则容器无法达到 `running` 状态。 +回调处理程序调用在包含容器的 Pod 上下文中是同步的。 +这意味着对于 `PostStart` 回调,容器入口点和回调异步触发。 +但是,如果回调运行或挂起的时间太长,则容器无法达到 `running` 状态。 -行为与 `PreStop` 钩子的行为类似。 -如果钩子在执行过程中挂起,Pod 阶段将保持在 `Terminating` 状态,并在 Pod 结束的 `terminationGracePeriodSeconds` 之后被杀死。 -如果 `PostStart` 或 `PreStop` 钩子失败,它会杀死容器。 +行为与 `PreStop` 回调的行为类似。 +如果回调在执行过程中挂起,Pod 阶段将保持在 `Terminating` 状态, +并在 Pod 结束的 `terminationGracePeriodSeconds` 之后被杀死。 +如果 `PostStart` 或 `PreStop` 回调失败,它会杀死容器。 -用户应该使他们的钩子处理程序尽可能的轻量级。 +用户应该使他们的回调处理程序尽可能的轻量级。 但也需要考虑长时间运行的命令也很有用的情况,比如在停止容器之前保存状态。 -### 钩子寄送保证 - - -钩子的寄送应该是 *至少一次*,这意味着对于任何给定的事件,例如 `PostStart` 或 `PreStop`,钩子可以被调用多次。 -如何正确处理,是钩子实现所要考虑的问题。 +### 回调寄送保证 + +回调的寄送应该是 *至少一次*,这意味着对于任何给定的事件,例如 `PostStart` 或 `PreStop`,回调可以被调用多次。 +如何正确处理,是回调实现所要考虑的问题。 通常情况下,只会进行单次寄送。 -例如,如果 HTTP 钩子接收器宕机,无法接收流量,则不会尝试重新发送。 +例如,如果 HTTP 回调接收器宕机,无法接收流量,则不会尝试重新发送。 然而,偶尔也会发生重复寄送的可能。 -例如,如果 kubelet 在发送钩子的过程中重新启动,钩子可能会在 kubelet 恢复后重新发送。 +例如,如果 kubelet 在发送回调的过程中重新启动,回调可能会在 kubelet 恢复后重新发送。 -### 调试钩子处理程序 - - -钩子处理程序的日志不会在 Pod 事件中公开。 +### 调试回调处理程序 + +回调处理程序的日志不会在 Pod 事件中公开。 如果处理程序由于某种原因失败,它将播放一个事件。 对于 `PostStart`,这是 `FailedPostStartHook` 事件,对于 `PreStop`,这是 `FailedPreStopHook` 事件。 您可以通过运行 `kubectl describe pod ` 命令来查看这些事件。 @@ -214,18 +198,14 @@ Events: 1m 22s 2 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Warning FailedPostStartHook ``` - - ## {{% heading "whatsnext" %}} - -* 了解更多关于[容器环境](/docs/concepts/containers/container-environment-variables/)。 -* 获取实践经验[将处理程序附加到容器生命周期事件](/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/)。 - +* 进一步了解[容器环境](/zh/docs/concepts/containers/container-environment/) +* 动手实践,[为容器生命周期事件添加处理程序](/zh/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/) diff --git a/content/zh/docs/concepts/containers/images.md b/content/zh/docs/concepts/containers/images.md index 8622ff532e..d47a9c21d6 100644 --- a/content/zh/docs/concepts/containers/images.md +++ b/content/zh/docs/concepts/containers/images.md @@ -4,43 +4,99 @@ content_type: concept weight: 10 --- -创建 Docker 镜像并将其推送到仓库,然后在 Kubernetes pod 中引用它。 - -容器的 `image` 属性支持与 `docker` 命令相同的语法,包括私有仓库和标签。 - +容器镜像(Image)所承载的是封装了应用程序及其所有软件依赖的二进制数据。 +容器镜像是可执行的软件包,可以单独运行;该软件包对所处的运行时环境具有 +良定(Well Defined)的假定。 +你通常会创建应用的容器镜像并将其推送到某仓库,然后在 +{{< glossary_tooltip text="Pod" term_id="pod" >}} 中引用它。 +本页概要介绍容器镜像的概念。 -## 更新镜像 {#updating-images} +## 镜像名称 {#image-names} + +容器镜像通常会被赋予 `pause`、`example/mycontainer` 或者 `kube-apiserver` 这类的名称。 +镜像名称也可以包含所在仓库的主机名。例如:`fictional.registry.example/imagename`。 +还可以包含仓库的端口号,例如:`fictional.registry.example:10443/imagename`。 + +如果你不指定仓库的主机名,Kubernetes 认为你在使用 Docker 公共仓库。 + +在镜像名称之后,你可以添加一个 _标签(Tag)_ (就像在 `docker` 或 `podman` +中也在用的那样)。 +使用标签能让你辨识同一镜像序列中的不同版本。 +镜像标签可以包含小写字母、大写字符、数字、下划线(`_`)、句点(`.`)和连字符(`-`)。 +关于在镜像标签中何处可以使用分隔字符(`_`、`-` 和 `.`)还有一些额外的规则。 +如果你不指定标签,Kubernetes 认为你想使用标签 `latest`。 + + +{{< caution >}} +你要避免在生产环境中使用 `latest` 标签,因为这会使得跟踪所运行的镜像版本变得 +非常困难,同时也很难会滚到之前运行良好的版本。 + +正确的做法恰恰相反,你应该指定一个有意义的标签,如 `v1.42.0`。 +{{< /caution >}} + + -默认的镜像拉取策略是 `IfNotPresent`,在镜像已经存在的情况下,kubelet 将不再去拉取镜像。如果总是想要拉取镜像,您可以执行以下操作: +## 更新镜像 {#updating-images} + +默认的镜像拉取策略是 `IfNotPresent`:在镜像已经存在的情况下,`kubelet` 将不再去拉取镜像。 +如果希望强制总是拉取镜像,你可以执行以下操作之一: -注意应避免使用 `:latest` 标签,参见[配置镜像最佳实践](/docs/concepts/configuration/overview/#container-images) 获取更多信息。 +如果 `imagePullPolicy` 未被定义为特定的值,也会被设置为 `Always`。 ## 使用清单(manifest)构建多架构镜像 - -Docker CLI 现在支持以下命令 `docker manifest` 以及 `create`、`annotate`、`push` 等子命令。这些命令可用于构建和推送清单。您可以使用 `docker manifest inspect` 来查看清单。 +除了提供二进制的镜像之外,容器仓库也可以提供 +[容器镜像清单](https://github.com/opencontainers/image-spec/blob/master/manifest.md)。 +清单文件(Manifest)可以为特定于体系结构的镜像版本引用其镜像清单。 +这背后的理念是让你可以为镜像命名(例如:`pause`、`example/mycontainer`、`kube-apiserver`) +的同时,允许不同的系统基于它们所使用的机器体系结构取回正确的二进制镜像。 - -请在此处查看 docker 清单文档: -https://docs.docker.com/edge/engine/reference/commandline/manifest/ - - -查看有关如何在构建工具中使用清单的示例: -https://cs.k8s.io/?q=docker%20manifest%20(create%7Cpush%7Cannotate)&i=nope&files=&repos= - - -这些命令依赖于 Docker CLI 并仅在 Docker CLI 上实现。需要编辑 `$HOME/.docker/config.json` 并将 `experimental` 设置为 `enabled`,或者仅在调用 CLI 命令时将 `DOCKER_CLI_EXPERIMENTAL` 环境变量设置为 `enabled`。 - -{{< note >}} - -请使用 Docker *18.06 或更高版本*,低版本存在错误或不支持实验性命令行选项。导致容器问题示例 https://github.com/docker/cli/issues/1135。 -{{< /note >}} - - -如果在上传旧清单时遇到麻烦,只需删除 `$HOME/.docker/manifests` 中旧的清单即可重新开始。 - - -对于 Kubernetes,通常使用带有后缀 `-$(ARCH)` 的镜像。为了向后兼容,请生成带有后缀的旧镜像。想法是生成具有所有 arch(es) 清单的 `pause` 镜像,并生成 `pause-amd64` 镜像,该镜像向后兼容较早的配置或者可能已对带有后缀的镜像进行硬编码的 YAML 文件。 +Kubernetes 自身通常在命名容器镜像时添加后缀 `-$(ARCH)`。 +为了向前兼容,请在生成较老的镜像时也提供后缀。 +这里的理念是为某镜像(如 `pause`)生成针对所有平台都适用的清单时, +生成 `pause-amd64` 这类镜像,以便较老的配置文件或者将镜像后缀影编码到其中的 +YAML 文件也能兼容。 -## 使用私有仓库 - +## 使用私有仓库 {#using-a-private-registry} + 从私有仓库读取镜像时可能需要密钥。 -凭证可以用以下方式提供: - - - - 使用 Google Container Registry - - 每个集群 - - 在 Google Compute Engine 或 Google Kubernetes Engine 上自动配置 - - 所有 Pod 均可读取项目的私有仓库 - - 使用 Amazon Elastic Container Registry(ECR) - - 使用 IAM 角色和策略来控制对 ECR 仓库的访问 - - 自动刷新 ECR 登录凭据 - - 使用 Oracle Cloud Infrastructure Registry(OCIR) - - 使用 IAM 角色和策略来控制对 OCIR 仓库的访问 - - 使用 Azure Container Registry (ACR) - - 使用 IBM Cloud Container Registry - - 配置节点用于私有仓库进行身份验证 - - 所有 Pod 均可读取任何已配置的私有仓库 - - 需要集群管理员配置节点 - - 预拉镜像 - - 所有 Pod 都可以使用节点上缓存的任何镜像 - - 需要所有节点的 root 访问权限才能进行设置 - - 在 Pod 上指定 ImagePullSecrets - - 只有提供自己密钥的 Pod 才能访问私有仓库 +凭据信息可以用以下方式提供: -下面将详细描述每一项。 - +- 配置节点向私有仓库进行身份验证 + - 所有 Pod 均可读取任何已配置的私有仓库 + - 需要集群管理员配置节点 +- 预拉镜像 + - 所有 Pod 都可以使用节点上缓存的所有镜像 + - 需要所有节点的 root 访问权限才能进行设置 +- 在 Pod 中设置 ImagePullSecrets + - 只有提供自己密钥的 Pod 才能访问私有仓库 +- 特定于厂商的扩展或者本地扩展 + - 如果你在使用定制的节点配置,你(或者云平台提供商)可以实现让节点 + 向容器仓库认证的机制 -### 使用 Google Container Registry +下面将详细描述每一种方案。 -Kuberetes 运行在 Google Compute Engine (GCE) 时原生支持 [Google Container -Registry (GCR)](https://cloud.google.com/tools/container-registry/)。如果 kubernetes 集群运行在 GCE 或者 Google Kubernetes Engine,使用镜像全名(例如 gcr.io/my_project/image:tag) 即可。 +### Configuring Nodes to authenticate to a Private Registry - -集群中所有 pod 都会有读取这个仓库镜像的权限。 +If you run Docker on your nodes, you can configure the Docker container +runtime to authenticate to a private container registry. - -kubelet 将使用实例的 Google service account 向 GCR 认证。实例的 Google service account 拥有 `https://www.googleapis.com/auth/devstorage.read_only`,所以它可以从项目的 GCR 拉取,但不能推送。 - - -### 使用 Amazon Elastic Container Registry - - -当 Node 是 AWS EC2 实例时,Kubernetes 原生支持 [Amazon Elastic Container Registry](https://aws.amazon.com/ecr/)。 - -在 pod 定义中,使用镜像全名即可 (例如 `ACCOUNT.dkr.ecr.REGION.amazonaws.com/imagename:tag`) - - -集群中所有可以创建 Pod 的用户都将能够运行使用 ECR 仓库中任何镜像的 Pod。 - -kubelet 将获取并定期刷新 ECR 凭据。它需要以下权限才能执行此操作: - -- `ecr:GetAuthorizationToken` -- `ecr:BatchCheckLayerAvailability` -- `ecr:GetDownloadUrlForLayer` -- `ecr:GetRepositoryPolicy` -- `ecr:DescribeRepositories` -- `ecr:ListImages` -- `ecr:BatchGetImage` - - -要求: - -- 必须使用 kubelet `v1.2.0` 及以上版本。(例如 运行 `/usr/bin/kubelet --version=true`)。 -- 如果 Node 在区域 A,而镜像仓库在另一个区域 B,需要 `v1.3.0` 及以上版本。 -- 区域中必须提供 ECR。 - - -故障排除: - -- 验证是否满足以上要求。 -- 获取工作站的 $REGION (例如 `us-west-2`) 凭证,使用凭证 SSH 到主机手动运行 Docker。它行得通吗? -- 验证 kubelet 是否使用参数 `--cloud-provider=aws` 运行。 -- 检查 kubelet 日志(例如 `journalctl -u kubelet`)是否有类似的行: - - `plugins.go:56] Registering credential provider: aws-ecr-key` - - `provider.go:91] Refreshing cache for provider: *aws_credentials.ecrProvider` - - -### 使用 Azure Container Registry (ACR) - - -当使用 [Azure Container Registry](https://azure.microsoft.com/en-us/services/container-registry/) 时,可以使用管理员用户或者 service principal 进行身份验证。任何一种情况,认证都通过标准的 Docker 授权完成。本指南假设使用 [azure-cli](https://github.com/azure/azure-cli) 命令行工具。 - - -首先,需要创建仓库并获取凭证,完整的文档请参考 [Azure container registry 文档](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-azure-cli)。 - - -创建好容器仓库后,可以使用以下凭证登录: - - * `DOCKER_USER` : service principal,或管理员用户名称 - * `DOCKER_PASSWORD`: service principal 密码,或管理员用户密码 - * `DOCKER_REGISTRY_SERVER`: `${some-registry-name}.azurecr.io` - * `DOCKER_EMAIL`: `${some-email-address}` - - -填写以上变量后,就可以 -[配置 Kubernetes Secret 并使用它来部署 Pod](/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod)。 - - -### 使用 IBM Cloud Container Registry -IBM Cloud Container Registry 提供了一个多租户私有镜像仓库,可以使用它来安全地存储和共享 Docker 仓库。默认情况下,集成的 Vulnerability Advisor 会扫描私有仓库中的镜像,以检测安全问题和潜在的漏洞。IBM Cloud 帐户中的用户可以访问您的镜像,也可以创建令牌来授予对仓库命名空间的访问权限。 - - -要安装 IBM Cloud Container Registry CLI 插件并为镜像创建命名空间,请参阅 [IBM Cloud Container Registry 入门](https://cloud.ibm.com/docs/services/Registry?topic=registry-index#index)。 - - -可以使用 IBM Cloud Container Registry 将容器从 [IBM Cloud 公共镜像](https://cloud.ibm.com/docs/services/Registry?topic=registry-public_images#public_images) 和私有镜像部署到 IBM Cloud Kubernetes Service 集群的默认命名空间。要将容器部署到其他命名空间,或使用来自其他 IBM Cloud Container 的仓库区域或 IBM Cloud 帐户的镜像,请创建 Kubernetes `imagePullSecret`。有关更多信息,请参阅[从镜像构建容器](https://cloud.ibm.com/docs/containers?topic=containers-images#images)。 - - ### 配置 Node 对私有仓库认证 -{{< note >}} - -如果在 Google Kubernetes Engine 上运行集群,每个节点上都会有 `.dockercfg` 文件,它包含 Google Container Registry 的凭证。不需要使用以下方法。 -{{< /note >}} +如果你在节点上运行的是 Docker,你可以配置 Docker +容器运行时来向私有容器仓库认证身份。 -{{< note >}} - -如果在 AWS EC2 上运行集群且准备使用 EC2 Container Registry (ECR),每个 node 上的 kubelet 会管理和更新 ECR 的登录凭证。不需要使用以下方法。 -{{< /note >}} +此方法适用于能够对节点进行配置的场合。 -{{< note >}} -该方法适用于能够对节点进行配置的情况。该方法在 GCE 及在其它能自动配置节点的云平台上并不适合。 -{{< /note >}} - {{< note >}} - -截至目前,Kubernetes 仅支持 docker config 的 `auths` 和 `HttpHeaders` 部分。这意味着不支持凭据助手(`credHelpers` 或 `credsStore`)。 +Kubernetes 仅支持 Docker 配置中的 `auths` 和 `HttpHeaders` 部分, +不支持 Docker 凭据辅助程序(`credHelpers` 或 `credsStore`)。 {{< /note >}} -Docker 将私有仓库的密钥存放在 `$HOME/.dockercfg` 或 `$HOME/.docker/config.json` 文件中。Kubelet 上,docker 会使用 root 用户 `$HOME` 路径下的密钥。 +Docker 将私有仓库的密钥保存在 `$HOME/.dockercfg` 或 `$HOME/.docker/config.json` +文件中。如果你将相同的文件放在下面所列的搜索路径中,`kubelet` 会在拉取镜像时将其用作凭据 +数据来源: -* `{--root-dir:-/var/lib/kubelet}/config.json` -* `{cwd of kubelet}/config.json` -* `${HOME}/.docker/config.json` -* `/.docker/config.json` -* `{--root-dir:-/var/lib/kubelet}/.dockercfg` -* `{cwd of kubelet}/.dockercfg` -* `${HOME}/.dockercfg` -* `/.dockercfg` - -{{< note >}} -可能必须在环境变量文件中为 kubelet 显式设置 `HOME=/root`。 +* `{--root-dir:-/var/lib/kubelet}/config.json` +* `{kubelet 当前工作目录}/config.json` +* `${HOME}/.docker/config.json` +* `/.docker/config.json` +* `{--root-dir:-/var/lib/kubelet}/.dockercfg` +* `{kubelet 当前工作目录}/.dockercfg` +* `${HOME}/.dockercfg` +* `/.dockercfg` + + +{{< note >}} +你可能不得不为 `kubelet` 进程显式地设置 `HOME=/root` 环境变量。 {{< /note >}} -推荐如下步骤来为 node 配置私有仓库。以下示例在 PC 或笔记本电脑中操作: - - 1. 对于想要使用的每一种凭证,运行 `docker login [server]`,它会更新 `$HOME/.docker/config.json`。 - 2. 使用编辑器查看 `$HOME/.docker/config.json`,保证文件中包含了想要使用的凭证。 - 3. 获取 node 列表,例如 - - 如果想要 node 名称,`nodes=$(kubectl get nodes -o jsonpath='{range.items[*].metadata}{.name} {end}')` - - 如果想要 node IP ,`nodes=$(kubectl get nodes -o jsonpath='{range .items[*].status.addresses[?(@.type=="ExternalIP")]}{.address} {end}')` - 4. 将本地的 `.docker/config.json` 拷贝到每个节点 root 用户目录下 - - 例如: `for n in $nodes; do scp ~/.docker/config.json root@$n:/root/.docker/config.json; done` +推荐采用如下步骤来配置节点以便访问私有仓库。以下示例中,在 PC 或笔记本电脑中操作: -创建使用私有仓库的 pod 来验证,例如: +1. 针对你要使用的每组凭据,运行 `docker login [服务器]` 命令。这会更新 + 你本地环境中的 `$HOME/.docker/config.json` 文件。 +1. 在编辑器中打开查看 `$HOME/.docker/config.json` 文件,确保其中仅包含你要 + 使用的凭据信息。 +1. 获得节点列表;例如: -```yaml + - 如果想要节点名称:`nodes=$(kubectl get nodes -o jsonpath='{range.items[*].metadata}{.name} {end}')` + + - 如果想要节点 IP ,`nodes=$(kubectl get nodes -o jsonpath='{range .items[*].status.addresses[?(@.type=="ExternalIP")]}{.address} {end}')` + +1. 将本地的 `.docker/config.json` 拷贝到所有节点,放入如上所列的目录之一: + - 例如,可以试一下:`for n in $nodes; do scp ~/.docker/config.json root@"$n":/var/lib/kubelet/config.json; done` + + +{{< note >}} +对于产品环境的集群,可以使用配置管理工具来将这些设置应用到 +你所期望的节点上。 +{{< /note >}} + + +创建使用私有镜像的 Pod 来验证。例如: + +```shell kubectl apply -f - < -如果一切正常,一段时间后,可以看到: +如果一切正常,一段时间后,可以运行: ```shell kubectl logs private-image-test-1 +``` + +并看到命令输出为: + +``` SUCCESS ``` -如果失败,则可以看到: +如果你怀疑命令失败了,你可以运行: ```shell -kubectl describe pods/private-image-test-1 | grep "Failed" +kubectl describe pods/private-image-test-1 | grep 'Failed' +``` + + +如果命令确实失败,输出类似于: + +``` Fri, 26 Jun 2015 15:36:13 -0700 Fri, 26 Jun 2015 15:39:13 -0700 19 {kubelet node-i2hq} spec.containers{uses-private-image} failed Failed to pull image "user/privaterepo:v1": Error: image user/privaterepo:v1 not found ``` @@ -447,42 +336,40 @@ kubectl describe pods/private-image-test-1 | grep "Failed" You must ensure all nodes in the cluster have the same `.docker/config.json`. Otherwise, pods will run on some nodes and fail to run on others. For example, if you use node autoscaling, then each instance template needs to include the `.docker/config.json` or mount a drive that contains it. ---> -必须保证集群中所有的节点都有相同的 `.docker/config.json` 文件。否则, pod 会在一些节点上正常运行而在另一些节点上无法启动。例如,如果使用 node 自动缩放,那么每个实例模板都需要包含 `.docker/config.json`,或者挂载一个包含这个文件的驱动器。 - -在 `.docker/config.json` 中配置了私有仓库密钥后,所有 pod 都会能读取私有仓库中的镜像。 +你必须确保集群中所有节点的 `.docker/config.json` 文件内容相同。 +否则,Pod 会能在一些节点上正常运行而无法在另一些节点上启动。 +例如,如果使用节点自动扩缩,那么每个实例模板都需要包含 `.docker/config.json`, +或者挂载一个包含该文件的驱动器。 + +在 `.docker/config.json` 中配置了私有仓库密钥后,所有 Pod 都将能读取私有仓库中的镜像。 -### 提前拉取镜像 +### 提前拉取镜像 {#pre-pulled-images} -{{< note >}} - -如果在 Google Kubernetes Engine 上运行集群,每个节点上都会有 `.dockercfg` 文件,它包含 Google Container Registry 的凭证。不需要使用以下方法。 -{{< /note >}} - -{{< note >}} -该方法适用于能够对节点进行配置的情况。该方法在 GCE 及在其它能自动配置节点的云平台上并不适合。 +{{< note >}} +该方法适用于你能够控制节点配置的场合。 +如果你的云供应商负责管理节点并自动置换节点,这一方案无法可靠地工作。 {{< /note >}} -默认情况下,kubelet 会尝试从指定的仓库拉取每一个镜像。但是,如果容器属性 `imagePullPolicy` 设置为 `IfNotPresent `或者 `Never`,则会使用本地镜像(优先、唯一、分别)。 +默认情况下,`kubelet` 会尝试从指定的仓库拉取每个镜像。 +但是,如果容器属性 `imagePullPolicy` 设置为 `IfNotPresent` 或者 `Never`, +则会优先使用(对应 `IfNotPresent`)或者一定使用(对应 `Never`)本地镜像。 -如果依赖提前拉取镜像代替仓库认证,必须保证集群所有的节点提前拉取的镜像是相同的。 +如果你希望使用提前拉取镜像的方法代替仓库认证,就必须保证集群中所有节点提前拉取的镜像是相同的。 -可以用于提前载入指定的镜像以提高速度,或者作为私有仓库认证的一种替代方案。 +这一方案可以用来提前载入指定的镜像以提高速度,或者作为向私有仓库执行身份认证的一种替代方案。 -所有的 pod 都可以使用 node 上缓存的镜像。 +所有的 Pod 都可以使用节点上提前拉取的镜像。 -### 在 pod 上指定 ImagePullSecrets +### 为 Pod 设置 ImagePullSecrets -{{< note >}} -Google Kubernetes Engine、GCE 及其他自动创建 node 的云平台上,推荐使用本方法。 +{{< note >}} +运行使用私有仓库中镜像的容器时,建议使用这种方法。 {{< /note >}} -Kubernetes 支持在 pod 中指定仓库密钥。 +Kubernetes 支持在 Pod 中设置容器镜像仓库的密钥。 -#### 使用 Docker Config 创建 Secret - -运行以下命令,将大写字母代替为合适的值: +#### 创建包含 Docker 配置的Secret + +将大写字母代替为合适的值,运行以下命令: ```shell -kubectl create secret docker-registry --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL +kubectl create secret docker-registry <名称> \ + --docker-server=DOCKER_REGISTRY_SERVER \ + --docker-username=DOCKER_USER \ + --docker-password=DOCKER_PASSWORD \ + --docker-email=DOCKER_EMAIL ``` -如果已经有 Docker 凭证文件,则可以将凭证文件作为 Kubernetes secret 导入而不是使用上面的命令。[根据现有 Docker 凭证创建 Secret](/docs/tasks/configure-pod-container/pull-image-private-registry/#registry-secret-existing-credentials) 解释了如何安装。如果使用多个私有容器仓库,这将特别有用,因为 `kubectl create secret docker-registry` 创建了一个仅适用于单个私有仓库的 Secret。 +如果你已经有 Docker 凭据文件,则可以将凭据文件导入为 Kubernetes +{{< glossary_tooltip text="Secret" term_id="secret" >}}, +而不是执行上面的命令。 +[基于已有的 Docker 凭据创建 Secret](/zh/docs/tasks/configure-pod-container/pull-image-private-registry/#registry-secret-existing-credentials) +解释了如何完成这一操作。 + + +如果你在使用多个私有容器仓库,这种技术将特别有用。 +原因是 `kubectl create secret docker-registry` 创建的是仅适用于某个私有仓库的 Secret。 -{{< note >}} -Pod 只能引用和它相同命名空间的 ImagePullSecrets,所以需要为每一个命名空间做配置。 +{{< note >}} +Pod 只能引用位于自身所在名字空间中的 Secret,因此需要针对每个名字空间 +重复执行上述过程。 {{< /note >}} -#### 引用 Pod 上的 imagePullSecrets - -现在,在创建 pod 时,可以在 pod 定义中增加 `imagePullSecrets` 部分来引用 secret。 +#### 在 Pod 中引用 ImagePullSecrets + +现在,在创建 Pod 时,可以在 Pod 定义中增加 `imagePullSecrets` 部分来引用该 Secret。 + +例如: ```shell cat < pod.yaml @@ -581,43 +485,46 @@ EOF ``` -对每一个使用私有仓库的 pod,都需要做以上操作。 -但是,可以通过在 [serviceAccount](/docs/user-guide/service-accounts) 资源中设置 imagePullSecrets 来自动设置 `imagePullSecrets`。检查 [将 ImagePullSecrets 添加 Service Account](/docs/tasks/configure-pod-container/configure-service-account/#add-imagepullsecrets-to-a-service-account) 以获取详细说明。 - - -可以将其与每个节点 `.docker/config.json` 结合使用。凭据将被合并。这种方法适用于 Google Kubernetes Engine。 +你需要对使用私有仓库的每个 Pod 执行以上操作。 +不过,设置该字段的过程也可以通过为 +[服务账号](/zh/docs/tasks/configure-pod-container/configure-service-account/) +资源设置 `imagePullSecrets` 来自动完成。 +有关详细指令可参见 +[将 ImagePullSecrets 添加到服务账号](/zh/docs/tasks/configure-pod-container/configure-service-account/#add-imagepullsecrets-to-a-service-account)。 + +你也可以将此方法与节点级别的 `.docker/config.json` 配置结合使用。 +来自不同来源的凭据会被合并。 -### 使用场景 - +### 使用案例 {#use-cases} + 配置私有仓库有多种方案,以下是一些常用场景和建议的解决方案。 -1. 集群运行非专有(例如 开源镜像)镜像。镜像不需要隐藏。 - - 使用 Docker hub 上的公有镜像 - - 无需配置 - - 在 GCE/GKE 上会自动使用高稳定性和高速的 Docker hub 的本地 mirror +1. 集群运行非专有镜像(例如,开源镜像)。镜像不需要隐藏。 + - 使用 Docker hub 上的公开镜像 + - 无需配置 + - 某些云厂商会自动为公开镜像提供高速缓存,以便提升可用性并缩短拉取镜像所需时间 -2. 集群运行一些专有镜像,这些镜像对外部公司需要隐藏,对集群用户可见 - - 使用自主的私有 [Docker registry](https://docs.docker.com/registry/)。 - - 可以放置在 [Docker Hub](https://hub.docker.com/account/signup/),或者其他地方。 - - 按照上面的描述,在每个节点手动配置 .docker/config.json。 - - 或者,在防火墙内运行一个内置的私有仓库,并开放读取权限。 - - 不需要配置 Kubenretes。 - - 或者,在 GCE/GKE 上时,使用项目的 Google Container Registry。 - - 使用集群自动伸缩比手动配置 node 工作的更好。 - - 或者,在更改集群 node 配置不方便时,使用 `imagePullSecrets`。 +2. 集群运行一些专有镜像,这些镜像需要对公司外部隐藏,对所有集群用户可见 + - 使用托管的私有 [Docker 仓库](https://docs.docker.com/registry/)。 + - 可以托管在 [Docker Hub](https://hub.docker.com/account/signup/) 或者其他地方 + - 按照上面的描述,在每个节点上手动配置 `.docker/config.json` 文件 + - 或者,在防火墙内运行一个组织内部的私有仓库,并开放读取权限 + - 不需要配置 Kubenretes + - 使用控制镜像访问的托管容器镜像仓库服务 + - 与手动配置节点相比,这种方案能更好地处理集群自动扩缩容 + - 或者,在不方便更改节点配置的集群中,使用 `imagePullSecrets` -3. 使用专有镜像的集群,有更严格的访问控制。 - - 保证开启 [AlwaysPullImages admission controller](/docs/reference/access-authn-authz/admission-controllers/#alwayspullimages)。否则,所有的 pod 都可以使用镜像。 - - 将敏感数据存储在 "Secret" 资源中,而不是打包在镜像里。 +3. 集群使用专有镜像,且有些镜像需要更严格的访问控制 + - 确保 [AlwaysPullImages 准入控制器](/zh/docs/reference/access-authn-authz/admission-controllers/#alwayspullimages)被启用。否则,所有 Pod 都可以使用所有镜像。 + - 确保将敏感数据存储在 Secret 资源中,而不是将其打包在镜像里 -4. 多租户集群下,每个租户需要自己的私有仓库。 - - 开启保证 [AlwaysPullImages admission controller](/docs/reference/access-authn-authz/admission-controllers/#alwayspullimages)。否则,所有租户的所有的 pod 都可以使用镜像。 - - 私有仓库开启认证。 - - 为每个租户获取仓库凭证,放置在 secret 中,并发布到每个租户的命名空间下。 - - 租户将 secret 增加到每个命名空间下的 imagePullSecrets 中。 - - +4. 集群是多租户的并且每个租户需要自己的私有仓库 + - 确保 [AlwaysPullImages 准入控制器](/zh/docs/reference/access-authn-authz/admission-controllers/#alwayspullimages)。否则,所有租户的所有的 Pod 都可以使用所有镜像。 + - 为私有仓库启用鉴权 + - 为每个租户生成访问仓库的凭据,放置在 Secret 中,并将 Secrert 发布到各租户的命名空间下。 + - 租户将 Secret 添加到每个名字空间中的 imagePullSecrets -如果需要访问多个仓库,则可以为每个仓库创建一个 secret。Kubelet 将任何 `imagePullSecrets` 合并为单个虚拟 `.docker/config.json` 文件。 +如果你需要访问多个仓库,可以为每个仓库创建一个 Secret。 +`kubelet` 将所有 `imagePullSecrets` 合并为一个虚拟的 `.docker/config.json` 文件。 + + +## {{% heading "whatsnext" %}} + + +* 阅读 [OCI Image Manifest 规范](https://github.com/opencontainers/image-spec/blob/master/manifest.md) + diff --git a/content/zh/docs/concepts/containers/overview.md b/content/zh/docs/concepts/containers/overview.md deleted file mode 100644 index 713cc4e7ac..0000000000 --- a/content/zh/docs/concepts/containers/overview.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: 容器概述 -content_type: concept -weight: 1 ---- - - - - -容器是一种用来打包已经编译好的代码以及运行时需要的各个依赖项的技术。您运行的每个容器都是可以重复运行的;包含依赖项的标准化意味着您在任何地点运行它都会得到相同的结果。 - -容器将应用程序和底层主机架构解耦,这使得在不同的云或OS环境中部署应用更加容易。 - - - - - - - -## 容器镜像 - -[容器镜像](/docs/concepts/containers/images/)是一个现成的软件包,包含了运行应用程序时所需要的一切:代码和任何运行时所需的东西,应用程序和系统库,以及任何基本设置的默认值。 - -根据设计,容器是不可变的:你不能更改已经在运行的容器中的代码。如果您有一个容器化的应用程序,想要做一些更改,您需要构建一个新的容器,来包含所做的更改,然后使用已经更新过的镜像来重新创建容器。 - - -## 容器运行时 - -{{< glossary_definition term_id="container-runtime" length="all" >}} - - -## {{% heading "whatsnext" %}} - - -* 阅读有关[容器镜像](/docs/concepts/containers/images/) -* 阅读有关 [Pods](/docs/concepts/workloads/pods/) - diff --git a/content/zh/docs/concepts/containers/runtime-class.md b/content/zh/docs/concepts/containers/runtime-class.md index 693e156cc3..4e1178670b 100644 --- a/content/zh/docs/concepts/containers/runtime-class.md +++ b/content/zh/docs/concepts/containers/runtime-class.md @@ -1,11 +1,16 @@ --- -reviewers: -- tallclair -- dchen1107 title: 容器运行时类(Runtime Class) content_type: concept weight: 20 --- + @@ -13,26 +18,19 @@ weight: 20 -本页面描述了 RuntimeClass 资源和运行时的选择机制。 - +本页面描述了 RuntimeClass 资源和运行时的选择机制。 + RuntimeClass 是一个用于选择容器运行时配置的特性,容器运行时配置用于运行 Pod 中的容器。 - - - -## 动机 - -您可以在不同的 pod 之间设置不同的 RuntimeClass,以提供性能与安全性之间的平衡。 -例如,如果您的部分工作负载需要高级别的信息安全保证,那么您可以选择性地调度这些 pod, -使它们在使用硬件虚拟化的容器运行时中运行。 -然后,您将从可选运行时的额外隔离中获益,代价是一些额外的开销。 +## 动机 {#motivation} + +你可以在不同的 Pod 设置不同的 RuntimeClass,以提供性能与安全性之间的平衡。 +例如,如果你的部分工作负载需要高级别的信息安全保证,你可以决定在调度这些 Pod +时尽量使它们在使用硬件虚拟化的容器运行时中运行。 +这样,你将从这些不同运行时所提供的额外隔离中获益,代价是一些额外的开销。 -您还可以使用 RuntimeClass 运行具有相同容器运行时但具有不同设置的pod。 +你还可以使用 RuntimeClass 运行具有相同容器运行时但具有不同设置的 Pod。 -## 设置 - +## 设置 {#setup} + 确保 RuntimeClass 特性开关处于开启状态(默认为开启状态)。 -关于特性开关的详细介绍,请查阅 -[Feature Gates](/docs/reference/command-line-tools-reference/feature-gates/)。 -`RuntimeClass` 特性开关必须在 apiserver 和 kubelet 同时开启。 +关于特性开关的详细介绍,请参阅 +[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/)。 +`RuntimeClass` 特性开关必须在 API 服务器和 kubelet 端同时开启。 - 1. 在节点上配置 CRI 的实现(取决于所选用的运行时) 2. 创建相应的 RuntimeClass 资源 @@ -87,11 +85,12 @@ CRI implementation for how to configure. RuntimeClass 的配置依赖于 运行时接口(CRI)的实现。 根据你使用的 CRI 实现,查阅相关的文档([下方](#cri-configuration))来了解如何配置。 -{{< note >}} +heterogenous node configurations, see [Scheduling](#scheduling) below. +--> +{{< note >}} RuntimeClass 假设集群中的节点配置是同构的(换言之,所有的节点在容器运行时方面的配置是相同的)。 如果需要支持异构节点,配置方法请参阅下面的 [调度](#scheduling)。 {{< /note >}} @@ -105,13 +104,12 @@ handler 必须符合 DNS-1123 命名规范(字母、数字、或 `-`)。 -### 2. 创建相应的 RuntimeClass 资源 - +### 2. 创建相应的 RuntimeClass 资源 + 在上面步骤 1 中,每个配置都需要有一个用于标识配置的 `handler`。 针对每个 handler 需要创建一个 RuntimeClass 对象。 @@ -123,31 +121,32 @@ RuntimeClass 资源当前只有两个重要的字段:RuntimeClass 名 (`metada 对象定义如下所示: ```yaml -apiVersion: node.k8s.io/v1beta1 # RuntimeClass is defined in the node.k8s.io API group +apiVersion: node.k8s.io/v1beta1 # RuntimeClass 定义于 node.k8s.io API 组 kind: RuntimeClass metadata: - name: myclass # The name the RuntimeClass will be referenced by - # RuntimeClass is a non-namespaced resource -handler: myconfiguration # The name of the corresponding CRI configuration + name: myclass # 用来引用 RuntimeClass 的名字 + # RuntimeClass 是一个集群层面的资源 +handler: myconfiguration # 对应的 CRI 配置的名称 ``` -{{< note >}} 建议将 RuntimeClass 写操作(create、update、patch 和 delete)限定于集群管理员使用。 -通常这是默认配置。参阅[授权概述](/docs/reference/access-authn-authz/authorization/)了解更多信息。 +Overview](/docs/reference/access-authn-authz/authorization/) for more details. +--> +{{< note >}} +建议将 RuntimeClass 写操作(create、update、patch 和 delete)限定于集群管理员使用。 +通常这是默认配置。参阅[授权概述](/zh/docs/reference/access-authn-authz/authorization/)了解更多信息。 {{< /note >}} -## 使用说明 - +## 使用说明 {#usage} + 一旦完成集群中 RuntimeClasses 的配置,使用起来非常方便。 在 Pod spec 中指定 `runtimeClassName` 即可。例如: @@ -168,9 +167,11 @@ RuntimeClass does not exist, or the CRI cannot run the corresponding handler, th corresponding [event](/docs/tasks/debug-application-cluster/debug-application-introspection/) for an error message. --> -这一设置会告诉 Kubelet 使用所指的 RuntimeClass 来运行该 pod。 -如果所指的 RuntimeClass 不存在或者 CRI 无法运行相应的 handler,那么 pod 将会进入 `Failed` 终止[阶段](/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase)。 -你可以查看相应的[事件](/docs/tasks/debug-application-cluster/debug-application-introspection/),获取出错信息。 +这一设置会告诉 kubelet 使用所指的 RuntimeClass 来运行该 pod。 +如果所指的 RuntimeClass 不存在或者 CRI 无法运行相应的 handler, +那么 pod 将会进入 `Failed` 终止[阶段](/zh/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase)。 +你可以查看相应的[事件](/zh/docs/tasks/debug-application-cluster/debug-application-introspection/), +获取出错信息。 -### CRI 配置 - -关于如何安装 CRI 运行时,请查阅 [CRI 安装](/docs/setup/production-environment/container-runtimes/)。 +### CRI 配置 {#cri-configuration} + +关于如何安装 CRI 运行时,请查阅 +[CRI 安装](/zh/docs/setup/production-environment/container-runtimes/)。 #### dockershim -Kubernetes 内置 dockershim CRI 不支持配置运行时 handler。 +Kubernetes 内置的 dockershim CRI 不支持配置运行时 handler。 #### [containerd](https://containerd.io/) @@ -223,8 +224,9 @@ handlers are configured under the [crio.runtime table](https://github.com/kubernetes-sigs/cri-o/blob/master/docs/crio.conf.5.md#crioruntime-table): --> 通过 cri-o 的 `/etc/crio/crio.conf` 配置文件来配置运行时 handler。 -handler 需要配置在 [crio.runtime 表](https://github.com/kubernetes-sigs/cri-o/blob/master/docs/crio.conf.5.md#crioruntime-table) -下方: +handler 需要配置在 +[crio.runtime 表](https://github.com/kubernetes-sigs/cri-o/blob/master/docs/crio.conf.5.md#crioruntime-table) +下面: ``` [crio.runtime.runtimes.${HANDLER_NAME}] @@ -232,16 +234,14 @@ handler 需要配置在 [crio.runtime 表](https://github.com/kubernetes-sigs/cr ``` -更详细信息,请查阅 containerd 配置文档: -https://github.com/kubernetes-sigs/cri-o/blob/master/cmd/crio/config.go +更详细信息,请查阅 CRI-O [配置文档](https://raw.githubusercontent.com/cri-o/cri-o/9f11d1d/docs/crio.conf.5.md)。 -## 调度 +## 调度 {#scheduling} {{< feature-state for_k8s_version="v1.16" state="beta" >}} @@ -253,7 +253,9 @@ the [RuntimeClass admission controller][] enabled (the default, as of 1.16). --> 在 Kubernetes v1.16 版本里,RuntimeClass 特性引入了 `scheduling` 字段来支持异构集群。 通过该字段,可以确保 pod 被调度到支持指定运行时的节点上。 -该调度支持,需要确保 [RuntimeClass admission controller][] 处于开启状态(1.16 版本默认开启)。 +该调度支持,需要确保 +[RuntimeClass 准入控制器](/zh/docs/reference/access-authn-authz/admission-controllers/#runtimeclass) +处于开启状态(1.16 版本默认开启)。 更多有关 node selector 和 tolerations 的配置信息,请查阅 -[Assigning Pods to Nodes](/docs/concepts/configuration/assign-pod-node/)。 - -[RuntimeClass admission controller]: /docs/reference/access-authn-authz/admission-controllers/ +[将 Pod 分派到节点](/zh/docs/concepts/scheduling-eviction/assign-pod-node/)。 -### Pod 开销 +### Pod 开销 {#pod-overhead} {{< feature-state for_k8s_version="v1.18" state="beta" >}} @@ -298,19 +298,20 @@ To use Pod overhead, you must have the PodOverhead [feature gate](/docs/referenc enabled (it is on by default). --> 你可以指定与运行 Pod 相关的 _开销_ 资源。声明开销即允许集群(包括调度器)在决策 Pod 和资源时将其考虑在内。 -若要使用 Pod 开销特性,你必须确保 PodOverhead [特性开关](/docs/reference/command-line-tools-reference/feature-gates/) 处于开启状态(默认为启用状态)。 +若要使用 Pod 开销特性,你必须确保 PodOverhead +[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) +处于启用状态(默认为启用状态)。 -Pod 开销通过 RuntimeClass 的 `overhead` 字段定义。通过使用这些字段,你可以指定使用该 RuntimeClass 运行 Pod 时的开销并确保 Kubernetes 将这些开销计算在内。 - +Pod 开销通过 RuntimeClass 的 `overhead` 字段定义。 +通过使用这些字段,你可以指定使用该 RuntimeClass 运行 Pod 时的开销并确保 Kubernetes 将这些开销计算在内。 ## {{% heading "whatsnext" %}} - - [RuntimeClass 设计](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/runtime-class.md) - [RuntimeClass 调度设计](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/runtime-class-scheduling.md) -- 阅读关于 [Pod 开销](/docs/concepts/configuration/pod-overhead/) 的概念 +- 阅读关于 [Pod 开销](/zh/docs/concepts/configuration/pod-overhead/) 的概念 - [PodOverhead 特性设计](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20190226-pod-overhead.md) diff --git a/content/zh/docs/concepts/extend-kubernetes/_index.md b/content/zh/docs/concepts/extend-kubernetes/_index.md index 3d091a51cd..e79067baad 100644 --- a/content/zh/docs/concepts/extend-kubernetes/_index.md +++ b/content/zh/docs/concepts/extend-kubernetes/_index.md @@ -61,20 +61,20 @@ Customization approaches can be broadly divided into *configuration*, which only *Configuration files* and *flags* are documented in the Reference section of the online documentation, under each binary: -* [kubelet](/docs/admin/kubelet/) -* [kube-apiserver](/docs/admin/kube-apiserver/) -* [kube-controller-manager](/docs/admin/kube-controller-manager/) -* [kube-scheduler](/docs/admin/kube-scheduler/). +* [kubelet](/docs/reference/command-line-tools-reference/kubelet/) +* [kube-apiserver](/docs/reference/command-line-tools-reference/kube-apiserver/) +* [kube-controller-manager](/docs/reference/command-line-tools-reference/kube-controller-manager/) +* [kube-scheduler](/docs/reference/command-line-tools-reference/kube-scheduler/). --> ## Configuration *配置文件*和*参数标志*的说明位于在线文档的参考章节,按可执行文件组织: -* [kubelet](/docs/admin/kubelet/) -* [kube-apiserver](/docs/admin/kube-apiserver/) -* [kube-controller-manager](/docs/admin/kube-controller-manager/) -* [kube-scheduler](/docs/admin/kube-scheduler/). +* [kubelet](/zh/docs/reference/command-line-tools-reference/kubelet/) +* [kube-apiserver](/zh/docs/reference/command-line-tools-reference/kube-apiserver/) +* [kube-controller-manager](/zh/docs/reference/command-line-tools-reference/kube-controller-manager/) +* [kube-scheduler](/zh/docs/reference/command-line-tools-reference/kube-scheduler/). ## API 扩展 {#api-extensions} @@ -259,7 +259,7 @@ For more about Custom Resources, see the [Custom Resources concept guide](/docs/ 不要使用自定义资源来充当应用、用户或者监控数据的数据存储。 -关于自定义资源的更多信息,可参见[自定义资源概念指南](/zh/docs/concepts/api-extension/custom-resources/)。 +关于自定义资源的更多信息,可参见[自定义资源概念指南](/zh/docs/concepts/extend-kubernetes/api-extension/custom-resources/)。 ### 鉴权 {#authorization} -[鉴权](/docs/reference/access-authn-authz/webhook/)操作负责确定特定的用户 +[鉴权](/zh/docs/reference/access-authn-authz/webhook/)操作负责确定特定的用户 是否可以读、写 API 资源或对其执行其他操作。 此操作仅在整个资源集合的层面进行。 换言之,它不会基于对象的特定字段作出不同的判决。 @@ -392,12 +392,12 @@ Different networking fabrics can be supported via node-level [Network Plugins](/ --> ### 设备插件 {#device-plugins} -使用[设备插件](/zh/docs/concepts/cluster-administration/device-plugins/), +使用[设备插件](/zh/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/), 节点能够发现新的节点资源(除了内置的类似 CPU 和内存这类资源)。 ### 网络插件 {#network-plugins} -通过节点层面的[网络插件](/docs/admin/network-plugins/),可以支持 +通过节点层面的[网络插件](/zh/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/),可以支持 不同的网络设施。 -* 进一步了解[自定义资源](/zh/docs/concepts/api-extension/custom-resources/) +* 进一步了解[自定义资源](/zh/docs/concepts/extend-kubernetes/api-extension/custom-resources/) * 了解[动态准入控制](/zh/docs/reference/access-authn-authz/extensible-admission-controllers/) * 进一步了解基础设施扩展 - * [网络插件](/zh/docs/concepts/cluster-administration/network-plugins/) - * [设备插件](/zh/docs/concepts/cluster-administration/device-plugins/) + * [网络插件](/zh/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) + * [设备插件](/zh/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/) * 了解 [kubectl 插件](/zh/docs/tasks/extend-kubectl/kubectl-plugins/) * 了解 [Operator 模式](/zh/docs/concepts/extend-kubernetes/operator/) diff --git a/content/zh/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation.md b/content/zh/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation.md index acac52ab5f..d91546feb6 100644 --- a/content/zh/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation.md +++ b/content/zh/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation.md @@ -1,7 +1,7 @@ --- title: 通过聚合层扩展 Kubernetes API content_type: concept -weight: 10 +weight: 20 --- @@ -20,57 +20,77 @@ weight: 10 -聚合层允许 Kubernetes 通过额外的 API 进行扩展,而不局限于 Kubernetes 核心 API 提供的功能。 +使用聚合层(Aggregation Layer),用户可以通过额外的 API 扩展 Kubernetes, +而不局限于 Kubernetes 核心 API 提供的功能。 + +这里的附加 API 可以是[服务目录](/zh/docs/concepts/extend-kubernetes/service-catalog/) +这类已经成熟的解决方案,也可以是你自己开发的 API。 + +聚合层不同于 +[自定义资源(Custom Resources)](/zh/docs/concepts/extend-kubernetes/api-extension/custom-resources/)。 +后者的目的是让 {{< glossary_tooltip term_id="kube-apiserver" text="kube-apiserver" >}} +能够认识新的对象类别(Kind)。 -## 概述 - -聚合层使您的集群可以安装其他 Kubernetes 风格的 API。这些 API 可以是预编译的、第三方的解决方案提供的例如[service-catalog](https://github.com/kubernetes-incubator/service-catalog/blob/master/README.md)、或者用户创建的类似[apiserver-builder](https://github.com/kubernetes-incubator/apiserver-builder/blob/master/README.md)一样的API可以帮助你上手。 - - -聚合层在 kube-apiserver 进程内运行。在扩展资源注册之前,聚合层不做任何事情。要注册 API,用户必须添加一个 APIService 对象,用它来申领 Kubernetes API 中的 URL 路径。自此以后,聚合层将会把发给该 API 路径的所有内容(例如 /apis/myextension.mycompany.io/v1/…)代理到已注册的 APIService。 +## 聚合层 {#aggregation-layer} + +聚合层在 kube-apiserver 进程内运行。在扩展资源注册之前,聚合层不做任何事情。 +要注册 API,用户必须添加一个 APIService 对象,用它来“申领” Kubernetes API 中的 URL 路径。 +自此以后,聚合层将会把发给该 API 路径的所有内容(例如 `/apis/myextension.mycompany.io/v1/…`) +转发到已注册的 APIService。 -正常情况下,APIService 会实现为运行于集群中某 Pod 内的 extension-apiserver。如果需要对增加的资源进行动态管理,extension-apiserver 经常需要和一个或多个控制器一起使用。因此,apiserver-builder 同时提供用来管理新资源的 API 框架和控制器框架。另外一个例子,当安装了 service-catalog 时,它会为自己提供的服务提供 extension-apiserver 和控制器。 +APIService 的最常见实现方式是在集群中某 Pod 内运行 *扩展 API 服务器*。 +如果你在使用扩展 API 服务器来管理集群中的资源,该扩展 API 服务器(也被写成“extension-apiserver”) +一般需要和一个或多个{{< glossary_tooltip text="控制器" term_id="controller" >}}一起使用。 +apiserver-builder 库同时提供构造扩展 API 服务器和控制器框架代码。 + +### 反应延迟 {#response-latency} -extension-apiserver 与 kube-apiserver 之间的连接应具有低延迟。 -特别是,发现请求需要在五秒钟或更短的时间内从 kube-apiserver 往返。 -如果您的部署无法实现此目的,则应考虑如何进行更改。目前,在 kube-apiserver 上设置 `EnableAggregatedDiscoveryTimeout=false` 功能开关将禁用超时限制。它将在将来的版本中被删除。 - +扩展 API 服务器与 kube-apiserver 之间需要存在低延迟的网络连接。 +发现请求需要在五秒钟或更短的时间内完成到 kube-apiserver 的往返。 +如果你的扩展 API 服务器无法满足这一延迟要求,应考虑如何更改配置已满足需要。 +你也可以为 kube-apiserver 设置 `EnableAggregatedDiscoveryTimeout=false` +[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) +来禁用超时限制。此特性门控已经废弃,将在未来版本中被删除。 ## {{% heading "whatsnext" %}} - -* 阅读[配置聚合层](/docs/tasks/access-kubernetes-api/configure-aggregation-layer/) 文档,了解如何在自己的环境中启用聚合器(aggregator)。 -* 然后[安装扩展的 api-server](/docs/tasks/access-kubernetes-api/setup-extension-api-server/) 来开始使用聚合层。 -* 也可以学习怎样 [使用自定义资源定义扩展 Kubernetes API](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/)。 - - - +* 阅读[配置聚合层](/zh/docs/tasks/extend-kubernetes/configure-aggregation-layer/) 文档, + 了解如何在自己的环境中启用聚合器。 +* 接下来,了解[安装扩展 API 服务器](/zh/docs/tasks/extend-kubernetes/setup-extension-api-server/), + 开始使用聚合层。 +* 也可以学习怎样[使用自定义资源定义扩展 Kubernetes API](/zh/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/)。 +* 阅读 [APIService](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#apiservice-v1-apiregistration-k8s-io) 的规范 diff --git a/content/zh/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins.md b/content/zh/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins.md index e7d020a8b2..964c5dc392 100644 --- a/content/zh/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins.md +++ b/content/zh/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins.md @@ -19,11 +19,9 @@ The targeted devices include GPUs, high-performance NICs, FPGAs, InfiniBand adap and other similar computing resources that may require vendor specific initialization and setup. --> -Kubernetes 提供了一个[设备插件框架](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/resource-management/device-plugin.md),您可以用来将系统硬件资源发布到 {{< glossary_tooltip term_id="kubelet" >}}。 - -供应商可以实现设备插件,由您手动部署或作为 {{< glossary_tooltip term_id="daemonset" >}} 来部署,而不必定制 Kubernetes 本身的代码。目标设备包括 GPU、高性能 NIC、FPGA、InfiniBand 适配器以及其他类似的、可能需要特定于供应商的初始化和设置的计算资源。 - +Kubernetes 提供了一个[设备插件框架](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/resource-management/device-plugin.md),你可以用来将系统硬件资源发布到 {{< glossary_tooltip term_id="kubelet" >}}。 +供应商可以实现设备插件,由你手动部署或作为 {{< glossary_tooltip term_id="daemonset" >}} 来部署,而不必定制 Kubernetes 本身的代码。目标设备包括 GPU、高性能 NIC、FPGA、InfiniBand 适配器以及其他类似的、可能需要特定于供应商的初始化和设置的计算资源。 @@ -32,7 +30,7 @@ Kubernetes 提供了一个[设备插件框架](https://github.com/kubernetes/com -kubelet 输出了一个 `Registration` 的 gRPC 服务: +`kubelet` 提供了一个 `Registration` 的 gRPC 服务: ```gRPC service Registration { @@ -47,7 +45,7 @@ During the registration, the device plugin needs to send: * The name of its Unix socket. * The Device Plugin API version against which it was built. * The `ResourceName` it wants to advertise. Here `ResourceName` needs to follow the - [extended resource naming scheme](/docs/concepts/configuration/manage-compute-resources-container/#extended-resources) + [extended resource naming scheme](/docs/concepts/configuration/manage-resources-container/#extended-resources) as `vendor-domain/resourcetype`. (For example, an NVIDIA GPU is advertised as `nvidia.com/gpu`.) @@ -60,9 +58,11 @@ to advertise that the node has 2 “Foo” devices installed and available. --> 设备插件可以通过此 gRPC 服务在 kubelet 进行注册。在注册期间,设备插件需要发送下面几样内容: - * 设备插件的 Unix 套接字。 - * 设备插件的 API 版本。 - * `ResourceName` 是需要公布的。这里 `ResourceName` 需要遵循[扩展资源命名方案](/docs/concepts/configuration/manage-compute-resources-container/#extended-resources),类似于 `vendor-domain/resourcetype`。(比如 NVIDIA GPU 就被公布为 `nvidia.com/gpu`。) +* 设备插件的 Unix 套接字。 +* 设备插件的 API 版本。 +* `ResourceName` 是需要公布的。这里 `ResourceName` 需要遵循 + [扩展资源命名方案](/zh/docs/concepts/configuration/manage-resources-container/#extended-resources), + 类似于 `vendor-domain/resourcetype`。(比如 NVIDIA GPU 就被公布为 `nvidia.com/gpu`。) 成功注册后,设备插件就向 kubelet 发送他所管理的设备列表,然后 kubelet 负责将这些资源发布到 API 服务器,作为 kubelet 节点状态更新的一部分。 @@ -76,16 +76,17 @@ specification as they request other types of resources, with the following limit * Extended resources are only supported as integer resources and cannot be overcommitted. * Devices cannot be shared among Containers. --> -然后用户需要去请求其他类型的资源的时候,就可以在[Container](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#container-v1-core)规范请求这类设备,但是有以下的限制: +然后用户需要请求其他类型的资源的时候,就可以在 +[Container](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#container-v1-core) +规范请求这类设备,但是有以下的限制: - * 扩展资源仅可作为整数资源使用,并且不能被过量使用 - * 设备不能在容器之间共享 +* 扩展资源仅可作为整数资源使用,并且不能被过量使用 +* 设备不能在容器之间共享 - 假设 Kubernetes 集群正在运行一个设备插件,该插件在一些节点上公布的资源为 `hardware-vendor.example/foo`。 下面就是一个 Pod 示例,请求此资源以运行某演示负载: @@ -125,8 +126,8 @@ The general workflow of a device plugin includes the following steps: 设备插件的常规工作流程包括以下几个步骤: - * 初始化。在这个阶段,设备插件将执行供应商特定的初始化和设置,以确保设备处于就绪状态。 - * 插件使用主机路径 `/var/lib/kubelet/device-plugins/` 下的 Unix socket 启动一个 gRPC 服务,该服务实现以下接口: +* 初始化。在这个阶段,设备插件将执行供应商特定的初始化和设置,以确保设备处于就绪状态。 +* 插件使用主机路径 `/var/lib/kubelet/device-plugins/` 下的 Unix socket 启动一个 gRPC 服务,该服务实现以下接口: ```gRPC service DevicePlugin { @@ -154,9 +155,12 @@ If the operations succeed, the device plugin returns an `AllocateResponse` that runtime configurations for accessing the allocated devices. The kubelet passes this information to the container runtime. --> - - * 插件通过 Unix socket 在主机路径 `/var/lib/kubelet/device-plugins/kubelet.sock` 处向 kubelet 注册自身。 - * 成功注册自身后,设备插件将以服务模式运行,在此期间,它将持续监控设备运行状况,并在设备状态发生任何变化时向 kubelet 报告。它还负责响应 `Allocate` gRPC 请求。在`Allocate`期间,设备插件可能还会做一些设备特定的准备;例如 GPU 清理或 QRNG 初始化。如果操作成功,则设备插件将返回 `AllocateResponse`,其中包含用于访问被分配的设备容器运行时的配置。kubelet 将此信息传递到容器运行时。 +* 插件通过 Unix socket 在主机路径 `/var/lib/kubelet/device-plugins/kubelet.sock` 处向 kubelet 注册自身。 +* 成功注册自身后,设备插件将以服务模式运行,在此期间,它将持续监控设备运行状况, + 并在设备状态发生任何变化时向 kubelet 报告。它还负责响应 `Allocate` gRPC 请求。 + 在 `Allocate` 期间,设备插件可能还会做一些设备特定的准备;例如 GPU 清理或 QRNG 初始化。 + 如果操作成功,则设备插件将返回 `AllocateResponse`,其中包含用于访问被分配的设备容器运行时的配置。 + kubelet 将此信息传递到容器运行时。 ### 处理 kubelet 重启 -设备插件应能监测到 kubelet 重启,并且向新的 kubelet 实例来重新注册自己。在当前实现中,当 kubelet 重启的时候,新的 kubelet 实例会删除 `/var/lib/kubelet/device-plugins` 下所有已经存在的 Unix sockets。设备插件需要能够监控到它的 Unix socket 被删除,并且当发生此类事件时重新注册自己。 +设备插件应能监测到 kubelet 重启,并且向新的 kubelet 实例来重新注册自己。 +在当前实现中,当 kubelet 重启的时候,新的 kubelet 实例会删除 `/var/lib/kubelet/device-plugins` +下所有已经存在的 Unix sockets。 +设备插件需要能够监控到它的 Unix socket 被删除,并且当发生此类事件时重新注册自己。 ## API 兼容性 -Kubernetes 设备插件支持还处于 beta 版本。所以在稳定版本出来之前 API 会以不兼容的方式进行更改。作为一个项目,Kubernetes 建议设备插件开发者: +Kubernetes 设备插件支持还处于 beta 版本。所以在稳定版本出来之前 API 会以不兼容的方式进行更改。 +作为一个项目,Kubernetes 建议设备插件开发者: * 注意未来版本的更改 * 支持多个版本的设备插件 API,以实现向后/向前兼容性。 -如果你启用 DevicePlugins 功能,并在需要升级到 Kubernetes 版本来获得较新的设备插件 API 版本的节点上运行设备插件,请在升级这些节点之前先升级设备插件以支持这两个版本。采用该方法将确保升级期间设备分配的连续运行。 +如果你启用 DevicePlugins 功能,并在需要升级到 Kubernetes 版本来获得较新的设备插件 API +版本的节点上运行设备插件,请在升级这些节点之前先升级设备插件以支持这两个版本。 +采用该方法将确保升级期间设备分配的连续运行。 -gRPC 服务通过 `/var/lib/kubelet/pod-resources/kubelet.sock` 的 UNIX 套接字来提供服务。设备插件资源的监控代理程序可以部署为守护进程或者 DaemonSet。规范的路径 `/var/lib/kubelet/pod-resources` 需要特权来进入,所以监控代理程序必须要在获得授权的安全的上下文中运行。如果设备监控代理以 DaemonSet 形式运行,必须要在插件的 [PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core) 中声明将 `/var/lib/kubelet/pod-resources` 目录以 {{< glossary_tooltip term_id="volume" >}} 形式被 mount 到容器中。 +gRPC 服务通过 `/var/lib/kubelet/pod-resources/kubelet.sock` 的 UNIX 套接字来提供服务。 +设备插件资源的监控代理程序可以部署为守护进程或者 DaemonSet。 +规范的路径 `/var/lib/kubelet/pod-resources` 需要特权来进入, +所以监控代理程序必须要在获得授权的安全的上下文中运行。 +如果设备监控代理以 DaemonSet 形式运行,必须要在插件的 +[PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core) +中声明将 `/var/lib/kubelet/pod-resources` 目录以 +{{< glossary_tooltip text="卷" term_id="volume" >}}的形式被挂载到容器中。 -对“PodResources 服务”的支持要求启用 `KubeletPodResources` [特性门控](/docs/reference/command-line-tools-reference/feature-gates/)。从 Kubernetes 1.15 开始默认启用。 +对“PodResources 服务”的支持要求启用 `KubeletPodResources` +[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/)。 +从 Kubernetes 1.15 开始默认启用。 -设备插件希望拓扑管理器可以将填充的 TopologyInfo 结构体作为设备注册的一部分以及设备 ID 和设备的运行状况发送回去。然后设备管理器将使用此信息来咨询拓扑管理器并做出资源分配决策。 +设备插件希望拓扑管理器可以将填充的 TopologyInfo 结构体作为设备注册的一部分以及设备 ID +和设备的运行状况发送回去。然后设备管理器将使用此信息来咨询拓扑管理器并做出资源分配决策。 -`TopologyInfo` 支持定义 `nodes` 字段,允许为 `nil`(默认)或者是一个 NUMA nodes 的列表。这样就可以使设备插件可以跨越 NUMA nodes 去发布。 +`TopologyInfo` 支持定义 `nodes` 字段,允许为 `nil`(默认)或者是一个 NUMA 节点的列表。 +这样就可以使设备插件可以跨越 NUMA 节点去发布。 下面是一个由设备插件为设备填充 `TopologyInfo` 结构体的示例: @@ -328,30 +358,28 @@ Here are some examples of device plugin implementations: 下面是一些设备插件实现的示例: -* [AMD GPU device plugin](https://github.com/RadeonOpenCompute/k8s-device-plugin) -* [Intel device plugins](https://github.com/intel/intel-device-plugins-for-kubernetes) 支持 Intel GPU、FPGA 和 QuickAssist 设备 -* [KubeVirt device plugins](https://github.com/kubevirt/kubernetes-device-plugins) 用于硬件辅助的虚拟化 -* The [NVIDIA GPU device plugin](https://github.com/NVIDIA/k8s-device-plugin) - * 需要 [nvidia-docker](https://github.com/NVIDIA/nvidia-docker) 2.0,允许运行 Docker 容器的时候开启 GPU。 -* [NVIDIA GPU device plugin for Container-Optimized OS](https://github.com/GoogleCloudPlatform/container-engine-accelerators/tree/master/cmd/nvidia_gpu) -* [RDMA device plugin](https://github.com/hustcat/k8s-rdma-device-plugin) -* [Solarflare device plugin](https://github.com/vikaschoudhary16/sfc-device-plugin) -* [SR-IOV Network device plugin](https://github.com/intel/sriov-network-device-plugin) -* [Xilinx FPGA device plugins](https://github.com/Xilinx/FPGA_as_a_Service/tree/master/k8s-fpga-device-plugin) - +* [AMD GPU 设备插件](https://github.com/RadeonOpenCompute/k8s-device-plugin) +* [Intel 设备插件](https://github.com/intel/intel-device-plugins-for-kubernetes) 支持 Intel GPU、FPGA 和 QuickAssist 设备 +* [KubeVirt 设备插件](https://github.com/kubevirt/kubernetes-device-plugins) 用于硬件辅助的虚拟化 +* The [NVIDIA GPU 设备插件](https://github.com/NVIDIA/k8s-device-plugin) + * 需要 [nvidia-docker](https://github.com/NVIDIA/nvidia-docker) 2.0,以允许运行 Docker 容器的时候启用 GPU。 +* [为 Container-Optimized OS 所提供的 NVIDIA GPU 设备插件](https://github.com/GoogleCloudPlatform/container-engine-accelerators/tree/master/cmd/nvidia_gpu) +* [RDMA 设备插件](https://github.com/hustcat/k8s-rdma-device-plugin) +* [Solarflare 设备插件](https://github.com/vikaschoudhary16/sfc-device-plugin) +* [SR-IOV 网络设备插件](https://github.com/intel/sriov-network-device-plugin) +* [Xilinx FPGA 设备插件](https://github.com/Xilinx/FPGA_as_a_Service/tree/master/k8s-fpga-device-plugin) ## {{% heading "whatsnext" %}} - -* 查看 [调度 GPU 资源](/docs/tasks/manage-gpus/scheduling-gpus/) 来学习使用设备插件 -* 查看在 node 上如何[广告扩展资源](/docs/tasks/administer-cluster/extended-resource-node/) -* 阅读如何在 Kubernetes 中如何使用 [TLS 入口的硬件加速](https://kubernetes.io/blog/2019/04/24/hardware-accelerated-ssl/tls-termination-in-ingress-controllers-using-kubernetes-device-plugins-and-runtimeclass/) -* 学习 [Topology Manager] (/docs/tasks/adminster-cluster/topology-manager/) +* 查看[调度 GPU 资源](/zh/docs/tasks/manage-gpus/scheduling-gpus/) 来学习使用设备插件 +* 查看在上如何[公布节点上的扩展资源](/docs/tasks/administer-cluster/extended-resource-node/) +* 阅读如何在 Kubernetes 中使用 [TLS Ingress 的硬件加速](https://kubernetes.io/blog/2019/04/24/hardware-accelerated-ssl/tls-termination-in-ingress-controllers-using-kubernetes-device-plugins-and-runtimeclass/) +* 学习[拓扑管理器](/zh/docs/tasks/adminster-cluster/topology-manager/) diff --git a/content/zh/docs/concepts/extend-kubernetes/extend-cluster.md b/content/zh/docs/concepts/extend-kubernetes/extend-cluster.md index 58e6154f6a..4c2c7cbc53 100644 --- a/content/zh/docs/concepts/extend-kubernetes/extend-cluster.md +++ b/content/zh/docs/concepts/extend-kubernetes/extend-cluster.md @@ -23,19 +23,23 @@ Kubernetes is highly configurable and extensible. As a result, there is rarely a need to fork or submit patches to the Kubernetes project code. -This guide describes the options for customizing a Kubernetes -cluster. It is aimed at {{< glossary_tooltip text="cluster operators" term_id="cluster-operator" >}} who want to -understand how to adapt their Kubernetes cluster to the needs of -their work environment. Developers who are prospective {{< glossary_tooltip text="Platform Developers" term_id="platform-developer" >}} or Kubernetes Project {{< glossary_tooltip text="Contributors" term_id="contributor" >}} will also find it -useful as an introduction to what extension points and patterns -exist, and their trade-offs and limitations. +This guide describes the options for customizing a Kubernetes cluster. It is +aimed at {{< glossary_tooltip text="cluster operators" term_id="cluster-operator" >}} +who want to understand how to adapt their +Kubernetes cluster to the needs of their work environment. Developers who are prospective +{{< glossary_tooltip text="Platform Developers" term_id="platform-developer" >}} +or Kubernetes Project {{< glossary_tooltip text="Contributors" term_id="contributor" >}} +will also find it useful as an introduction to what extension points and +patterns exist, and their trade-offs and limitations. --> Kubernetes 是高度可配置和可扩展的。因此,极少需要分发或提交补丁代码给 Kubernetes 项目。 -本文档介绍自定义 Kubernetes 集群的选项。本文档的目标读者 {{< glossary_tooltip text="cluster operators" term_id="cluster-operator" >}} 是希望了解如何使 Kubernetes 集群满足其业务环境需求的集群运维人员。Kubernetes 项目的贡献者 {{< glossary_tooltip text="Contributors" term_id="contributor" >}} 或潜在的平台开发人员 {{< glossary_tooltip text="Platform Developers" term_id="platform-developer" >}} 也可以从本文找到有用的信息,如对已存在扩展点和模式的介绍,以及它们的权衡和限制。 - - - +本文档介绍自定义 Kubernetes 集群的选项。本文档的目标读者包括希望了解如何使 +Kubernetes 集群满足其业务环境需求的 +{{< glossary_tooltip text="集群运维人员" term_id="cluster-operator" >}}、 +Kubernetes 项目的{{< glossary_tooltip text="贡献者" term_id="contributor" >}}。 +或潜在的{{< glossary_tooltip text="平台开发人员" term_id="platform-developer" >}} +也可以从本文找到有用的信息,如对已存在扩展点和模式的介绍,以及它们的权衡和限制。 @@ -46,27 +50,28 @@ Customization approaches can be broadly divided into *configuration*, which only --> ## 概述 -定制方法可以大致分为 *配置* 和 *扩展* 。*配置* 只涉及更改标志参数、本地配置文件或 API 资源;*扩展* 涉及运行额外的程序或服务。本文档主要内容是关于扩展。 +定制方法可以大致分为 *配置(Configuration)* 和 *扩展(Extension)* 。 +*配置* 只涉及更改标志参数、本地配置文件或 API 资源; +*扩展* 涉及运行额外的程序或服务。本文档主要内容是关于扩展。 -## 配置 - -关于 *配置文件* 和 *标志* 的说明文档位于在线文档的参考部分,按照二进制组件各自描述: +## 配置 {#configuration} -* [kubelet](/docs/admin/kubelet/) -* [kube-apiserver](/docs/admin/kube-apiserver/) -* [kube-controller-manager](/docs/admin/kube-controller-manager/) -* [kube-scheduler](/docs/admin/kube-scheduler/). +关于 *配置文件* 和 *标志* 的说明文档位于在线文档的"参考"部分,按照可执行文件组织: + +* [kubelet](/zh/docs/reference/command-line-tools-reference/kubelet/) +* [kube-apiserver](/zh/docs/reference/command-line-tools-reference/kube-apiserver/) +* [kube-controller-manager](/zh/docs/reference/command-line-tools-reference/kube-controller-manager/) +* [kube-scheduler](/zh/docs/reference/command-line-tools-reference/kube-scheduler/). -*内置策略 API* ,例如 [ResourceQuota](/docs/concepts/policy/resource-quotas/)、[PodSecurityPolicy](/docs/concepts/policy/pod-security-policy/)、[NetworkPolicy](/docs/concepts/services-networking/network-policies/) 和基于角色的权限控制 ([RBAC](/docs/reference/access-authn-authz/rbac/)),是内置的 Kubernetes API。API 通常与托管的 Kubernetes 服务和受控的 Kubernetes 安装一起使用。 -它们是声明性的,并使用与其他 Kubernetes 资源(如 Pod )相同的约定,所以新的集群配置可以重复使用,并以与应用程序相同的方式进行管理。而且,当他们变稳定后,他们和其他 Kubernetes API 一样享受[定义支持政策](/docs/reference/deprecation-policy/)。出于这些原因,在合适的情况下它们优先于 *配置文件* 和 *标志* 被使用。 +*内置策略 API* ,例如 [ResourceQuota](/zh/docs/concepts/policy/resource-quotas/)、 +[PodSecurityPolicy](/zh/docs/concepts/policy/pod-security-policy/)、 +[NetworkPolicy](/zh/docs/concepts/services-networking/network-policies/) +和基于角色的权限控制 ([RBAC](/zh/docs/reference/access-authn-authz/rbac/)), +是内置的 Kubernetes API。API 通常与托管的 Kubernetes 服务和受控的 Kubernetes 安装一起使用。 +它们是声明性的,并使用与其他 Kubernetes 资源(如 Pod )相同的约定,所以新的集群配置可以重复使用, +并以与应用程序相同的方式进行管理。 +而且,当它们变稳定后,也遵循和其他 Kubernetes API 一样的 +[支持政策](/zh/docs/reference/using-api/deprecation-policy/)。 +出于这些原因,在合适的情况下它们优先于 *配置文件* 和 *标志* 被使用。 -## 扩展程序 +## 扩展程序 {#extension} 扩展程序是指对 Kubernetes 进行扩展和深度集成的软件组件。它们适合用于支持新的类型和新型硬件。 -大多数集群管理员会使用托管的或统一分发的 Kubernetes 实例。因此,大多数 Kubernetes 用户需要安装扩展程序,而且还有少部分用户甚至需要编写新的扩展程序。 +大多数集群管理员会使用托管的或统一分发的 Kubernetes 实例。 +因此,大多数 Kubernetes 用户需要安装扩展程序,而且还有少部分用户甚至需要编写新的扩展程序。 -## 扩展模式 +## 扩展模式 {#extension-patterns} -Kubernetes 的设计是通过编写客户端程序来实现自动化的。任何读和(或)写 Kubernetes API 的程序都可以提供有用的自动化工作。*自动化* 程序可以运行在集群之中或之外。按照本文档的指导,您可以编写出高可用的和健壮的自动化程序。自动化程序通常适用于任何 Kubernetes 集群,包括托管集群和受管理安装的集群。 +Kubernetes 的设计是通过编写客户端程序来实现自动化的。 +任何读和(或)写 Kubernetes API 的程序都可以提供有用的自动化工作。 +*自动化* 程序可以运行在集群之中或之外。按照本文档的指导,你可以编写出高可用的和健壮的自动化程序。 +自动化程序通常适用于任何 Kubernetes 集群,包括托管集群和受管理安装的集群。 -*控制器* 模式是编写适合 Kubernetes 的客户端程序的一种特定模式。控制器通常读取一个对象的 `.spec` 字段,可能做出一些处理,然后更新对象的 `.status` 字段。 +*控制器(Controller)* 模式是编写适合 Kubernetes 的客户端程序的一种特定模式。 +控制器通常读取一个对象的 `.spec` 字段,可能做出一些处理,然后更新对象的 `.status` 字段。 -一个控制器是 Kubernetes 的一个客户端。而当 Kubernetes 作为客户端调用远程服务时,它被称为 *Webhook* ,远程服务称为 *Webhook* 后端。 和控制器类似,Webhooks 增加了一个失败点。 +一个控制器是 Kubernetes 的一个客户端。 +当 Kubernetes 作为客户端调用远程服务时,它被称为 *Webhook* , +远程服务称为 *Webhook* 后端。 和控制器类似,Webhooks 增加了一个失败点。 -在 webhook 模型里,Kubernetes 向远程服务发送一个网络请求。在 *二进制插件* 模型里,Kubernetes 执行一个二进制(程序)。二进制插件被 kubelet(如 [Flex 卷插件](https://github.com/kubernetes/community/blob/master/contributors/devel/flexvolume.md)和[网络插件](/docs/concepts/cluster-administration/network-plugins/))和 kubectl 所使用。 +在 webhook 模型里,Kubernetes 向远程服务发送一个网络请求。 +在 *可执行文件插件* 模型里,Kubernetes 执行一个可执行文件(程序)。 +可执行文件插件被 kubelet(如 +[Flex 卷插件](https://github.com/kubernetes/community/blob/master/contributors/devel/flexvolume.md)和 +[网络插件](/zh/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/)和 +`kubectl` 所使用。 -## 扩展点 +## 扩展点 {#extension-points} 下图显示了 Kubernetes 系统的扩展点。 @@ -162,27 +187,38 @@ This diagram shows the extension points in a Kubernetes system. -1. 用户通常使用 `kubectl` 与 Kubernetes API 进行交互。[kubectl 插件](/docs/tasks/extend-kubectl/kubectl-plugins/)扩展了 kubectl 二进制程序。它们只影响个人用户的本地环境,因此不能执行站点范围的策略。 -2. apiserver 处理所有请求。apiserver 中的几种类型的扩展点允许对请求进行身份认证或根据其内容对其进行阻止、编辑内容以及处理删除操作。这些内容在[API 访问扩展](/docs/concepts/overview/extending#api-access-extensions)小节中描述。 -3. apiserver 提供各种 *资源* 。 *内置的资源种类* ,如 `pods`,由 Kubernetes 项目定义,不能更改。您还可以添加您自己定义的资源或其他项目已定义的资源,称为 自定义资源,如[自定义资源](/docs/concepts/overview/extending#user-defined-types)部分所述。自定义资源通常与 API 访问扩展一起使用。 -4. Kubernetes 调度器决定将 Pod 放置到哪个节点。有几种方法可以扩展调度器。这些内容在 [Scheduler Extensions](/docs/concepts/overview/extending#scheduler-extensions) 小节中描述。 -5. Kubernetes 的大部分行为都是由称为控制器的程序实现的,这些程序是 API-Server 的客户端。控制器通常与自定义资源一起使用。 -6. kubelet 在主机上运行,并帮助 pod 看起来就像在集群网络上拥有自己的 IP 的虚拟服务器。[网络插件](/docs/concepts/overview/extending#network-plugins)让您可以实现不同的 pod 网络。 -7. kubelet 也挂载和卸载容器的卷。新的存储类型可以通过[存储插件](/docs/concepts/overview/extending#storage-plugins)支持。 +1. 用户通常使用 `kubectl` 与 Kubernetes API 进行交互。 + [kubectl 插件](/zh/docs/tasks/extend-kubectl/kubectl-plugins/)扩展了 kubectl 可执行文件。 + 它们只影响个人用户的本地环境,因此不能执行站点范围的策略。 +2. API 服务器处理所有请求。API 服务器中的几种类型的扩展点允许对请求进行身份认证或根据其内容对其进行阻止、 + 编辑内容以及处理删除操作。这些内容在 + [API 访问扩展](/zh/docs/concepts/extend-kubernetes/#api-access-extensions)小节中描述。 +3. API 服务器提供各种 *资源(Resource)* 。 *内置的资源种类(Resource Kinds)* ,如 `pods`, + 由 Kubernetes 项目定义,不能更改。你还可以添加你自己定义的资源或其他项目已定义的资源, + 称为 *自定义资源(Custom Resource)*,如[自定义资源](/zh/docs/concepts/extend-kubernetes/#user-defined-types) + 部分所述。自定义资源通常与 API 访问扩展一起使用。 +4. Kubernetes 调度器决定将 Pod 放置到哪个节点。有几种方法可以扩展调度器。 + 这些内容在[调度器扩展](/zh/docs/concepts/extend-kubernetes/#scheduler-extensions) + 小节中描述。 +5. Kubernetes 的大部分行为都是由称为控制器(Controllers)的程序实现的,这些程序是 API 服务器的客户端。 + 控制器通常与自定义资源一起使用。 +6. `kubelet` 在主机上运行,并帮助 Pod 看起来就像在集群网络上拥有自己的 IP 的虚拟服务器。 + [网络插件](/zh/docs/concepts/extend-kubernetes/#network-plugins/)让你可以实现不同的 pod 网络。 +7. `kubelet` 也负责为容器挂载和卸载卷。新的存储类型可以通过 + [存储插件](/zh/docs/concepts/extend-kubernetes/#storage-plugins/)支持。 - -如果您不确定从哪里开始扩展,此流程图可以提供帮助。请注意,某些解决方案可能涉及多种类型的扩展。 +如果你不确定从哪里开始扩展,下面流程图可以提供一些帮助。请注意,某些解决方案可能涉及多种类型的扩展。 @@ -198,14 +234,16 @@ Do not use a Custom Resource as data storage for application, user, or monitorin For more about Custom Resources, see the [Custom Resources concept guide](/docs/concepts/api-extension/custom-resources/). --> -## API 扩展 -### 用户自定义类型 +## API 扩展 {#api-extensions} -如果您想定义新的控制器、应用程序配置对象或其他声明式 API,并使用 Kubernetes 工具(如 `kubectl`)管理它们,请考虑为 Kubernetes 添加一个自定义资源。 +### 用户自定义类型 {#user-defined-types} + +如果你想定义新的控制器、应用程序配置对象或其他声明式 API,并使用 Kubernetes 工具(如 `kubectl`)管理它们,请考虑为 Kubernetes 添加一个自定义资源。 不要使用自定义资源作为应用、用户或者监控数据的数据存储。 -有关自定义资源的更多信息,请查看[自定义资源概念指南](/docs/concepts/api-extension/custom-resources/)。 +有关自定义资源的更多信息,请查看 +[自定义资源概念指南](/zh/docs/concepts/extend-kubernetes/api-extension/custom-resources/)。 ### 将新的 API 与自动化相结合 -自定义资源 API 和控制循环的组合称为 [操作者模式](/docs/concepts/extend-kubernetes/operator/)。操作者模式用于管理特定的,通常是有状态的应用程序。这些自定义 API 和控制循环还可用于控制其他资源,例如存储或策略。 +自定义资源 API 和控制循环的组合称为 +[操作者(Operator)模式](/zh/docs/concepts/extend-kubernetes/operator/)。 +操作者模式用于管理特定的,通常是有状态的应用程序。 +这些自定义 API 和控制循环还可用于控制其他资源,例如存储或策略。 ### 改变内置资源 -当您通过添加自定义资源来扩展 Kubernetes API 时,添加的资源始终属于新的 API 组。您不能替换或更改已有的 API 组。添加 API 不会直接影响现有 API(例如 Pod )的行为,但是 API 访问扩展可以。 +当你通过添加自定义资源来扩展 Kubernetes API 时,添加的资源始终属于新的 API 组。 +你不能替换或更改已有的 API 组。 +添加 API 不会直接影响现有 API(例如 Pod )的行为,但是 API 访问扩展可以。 -### API 访问扩展 +### API 访问扩展 {#api-access-extensions} -当请求到达 Kubernetes API Server 时,它首先被要求进行用户认证,然后要进行授权检查,接着受到各种类型的准入控制的检查。有关此流程的更多信息,请参阅 [Kubernetes API访问控制](/docs/reference/access-authn-authz/controlling-access/)。 +当请求到达 Kubernetes API Server 时,它首先被要求进行用户认证,然后要进行授权检查, +接着受到各种类型的准入控制的检查。有关此流程的更多信息,请参阅 +[Kubernetes API 访问控制](/zh/docs/reference/access-authn-authz/controlling-access/)。 上述每个步骤都提供了扩展点。 -Kubernetes 有几个它支持的内置认证方法。它还可以位于身份验证代理之后,并将授权 header 中的令牌发送给远程服务进行验证(webhook)。所有这些方法都在[身份验证文档](/docs/reference/access-authn-authz/authentication/)中介绍。 +Kubernetes 有几个它支持的内置认证方法。它还可以位于身份验证代理之后,并将 Authorziation 头部 +中的令牌发送给远程服务(webhook)进行验证。所有这些方法都在 +[身份验证文档](/zh/docs/reference/access-authn-authz/authentication/)中介绍。 -### 身份认证 +### 身份认证 {#authentication} -[身份认证](/docs/reference/access-authn-authz/authentication/)将所有请求中的 header 或证书映射为发出请求的客户端的用户名。 +[身份认证](/zh/docs/reference/access-authn-authz/authentication/) +将所有请求中的头部字段或证书映射为发出请求的客户端的用户名。 -Kubernetes 提供了几种内置的身份认证方法,如果这些方法不符合您的需求,可以使用[身份认证 webhook](/docs/reference/access-authn-authz/authentication/#webhook-token-authentication) 方法。 +Kubernetes 提供了几种内置的身份认证方法,如果这些方法不符合你的需求,可以使用 +[身份认证 Webhook](/zh/docs/reference/access-authn-authz/authentication/#webhook-token-authentication) 方法。 -### 授权 +### 鉴权 {#authorization} -[授权](/docs/reference/access-authn-authz/webhook/)决定特定用户是否可以对 API 资源执行读取、写入以及其他操作。它只是在整个资源的层面上工作 -- 它不基于任意的对象字段进行区分。如果内置授权选项不能满足您的需求,[授权 webhook](/docs/reference/access-authn-authz/webhook/) 允许调用用户提供的代码来作出授权决定。 +[鉴权组件](/zh/docs/reference/access-authn-authz/authorization/)决定特定用户是否可以对 +API 资源执行读取、写入以及其他操作。它只是在整个资源的层面上工作 -- +它不基于任意的对象字段进行区分。如果内置授权选项不能满足你的需求, +[鉴权 Webhook](/zh/docs/reference/access-authn-authz/webhook/) +允许调用用户提供的代码来作出授权决定。 ### 动态准入控制 -在请求被授权之后,如果是写入操作,它还将进入[准入控制](/docs/reference/access-authn-authz/admission-controllers/)步骤。除了内置的步骤之外,还有几个扩展: +在请求被授权之后,如果是写入操作,它还将进入 +[准入控制](/zh/docs/reference/access-authn-authz/admission-controllers/) +步骤。除了内置的步骤之外,还有几个扩展: -* [镜像策略 webhook](/docs/reference/access-authn-authz/admission-controllers/#imagepolicywebhook) 限制了哪些镜像可以在容器中运行。 -* 为了进行灵活的准入控制决策,可以使用通用的 [Admission webhook](/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks)。Admission Webhooks 可以拒绝创建或更新操作。 +* [镜像策略 Webhook](/zh/docs/reference/access-authn-authz/admission-controllers/#imagepolicywebhook) + 限制哪些镜像可以在容器中运行。 +* 为了进行灵活的准入控制决策,可以使用通用的 + [准入 Webhook](/zh/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks)。 + 准入 Webhooks 可以拒绝创建或更新操作。 ## 基础设施扩展 - ### 存储插件 [Flex Volumes](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/storage/flexvolume-deployment.md -) 允许用户挂载无内置插件支持的卷类型,它通过 Kubelet 调用一个二进制插件来挂载卷。 +) +允许用户挂载无内置插件支持的卷类型,它通过 Kubelet 调用一个可执行文件插件来挂载卷。 -### 设备插件 +### 设备插件 {#device-plugins} -设备插件允许节点通过[设备插件](/docs/concepts/cluster-administration/device-plugins/)发现新的节点资源(除了内置的 CPU 和内存之外)。 +设备插件允许节点通过 +[设备插件](/zh/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/). +发现新的节点资源(除了内置的 CPU 和内存之外)。 -### 网络插件 +### 网络插件 {#network-plugins} -不同的网络结构可以通过节点级的[网络插件](/docs/admin/network-plugins/)支持。 +不同的网络结构可以通过节点级的 +[网络插件](/zh/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) +得到支持。 -### 调度器扩展 - -调度器是一种特殊类型的控制器,用于监视 pod 并将其分配到节点。默认的调度器可以完全被替换,而继续使用其他 Kubernetes 组件,或者可以同时运行[多个调度器](/docs/tasks/administer-cluster/configure-multiple-schedulers/)。 - -这是一个重要的任务,几乎所有的 Kubernetes 用户都发现他们不需要修改调度器。 - -调度器也支持 [webhook](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/scheduling/scheduler_extender.md),它允许一个 webhook 后端(调度器扩展程序)为 pod 筛选节点和确定节点的优先级。 +### 调度器扩展 {#scheduler-extensions} +调度器是一种特殊类型的控制器,用于监视 pod 并将其分配到节点。 +默认的调度器可以完全被替换,而继续使用其他 Kubernetes 组件,或者可以同时运行 +[多个调度器](/zh/docs/tasks/administer-cluster/configure-multiple-schedulers/)。 +这是一个不太轻松的任务,几乎所有的 Kubernetes 用户都会意识到他们并不需要修改调度器。 +调度器也支持 +[Webhook](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/scheduling/scheduler_extender.md), +它允许使用一个 Webhook 后端(调度器扩展程序)为 Pod 筛选节点和确定节点的优先级。 ## {{% heading "whatsnext" %}} - -* 详细了解[自定义资源](/docs/concepts/api-extension/custom-resources/) -* 了解[动态准入控制](/docs/reference/access-authn-authz/extensible-admission-controllers/) +* 详细了解[自定义资源](/zh/docs/concepts/extend-kubernetes/api-extension/custom-resources/) +* 了解[动态准入控制](/zh/docs/reference/access-authn-authz/extensible-admission-controllers/) * 详细了解基础设施扩展 - * [网络插件](/docs/concepts/cluster-administration/network-plugins/) - * [设备插件](/docs/concepts/cluster-administration/device-plugins/) -* 了解 [kubectl 插件](/docs/tasks/extend-kubectl/kubectl-plugins/) -* 了解[操作者模式](/docs/concepts/extend-kubernetes/operator/) + * [网络插件](/zh/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) + * [设备插件](/zh/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/) +* 了解 [kubectl 插件](/zh/docs/tasks/extend-kubectl/kubectl-plugins/) +* 了解[操作者模式](/zh/docs/concepts/extend-kubernetes/operator/) diff --git a/content/zh/docs/concepts/extend-kubernetes/operator.md b/content/zh/docs/concepts/extend-kubernetes/operator.md index c34a54676e..5cf55cbb8c 100644 --- a/content/zh/docs/concepts/extend-kubernetes/operator.md +++ b/content/zh/docs/concepts/extend-kubernetes/operator.md @@ -5,11 +5,9 @@ weight: 30 --- @@ -21,9 +19,9 @@ to manage applications and their components. Operators follow Kubernetes principles, notably the [control loop](/docs/concepts/#kubernetes-control-plane). --> -Operator 是 Kubernetes 的扩展软件,它利用[自定义资源](/docs/concepts/extend-kubernetes/api-extension/custom-resources/)管理应用及其组件。 -Operator 遵循 Kubernetes 的理念,特别是在[控制回路](/docs/concepts/#kubernetes-control-plane)方面。 - +Operator 是 Kubernetes 的扩展软件,它利用 +[自定义资源](/zh/docs/concepts/extend-kubernetes/api-extension/custom-resources/)管理应用及其组件。 +Operator 遵循 Kubernetes 的理念,特别是在[控制回路](/zh/docs/concepts/#kubernetes-control-plane)方面。 @@ -40,7 +38,6 @@ People who run workloads on Kubernetes often like to use automation to take care of repeatable tasks. The Operator pattern captures how you can write code to automate a task beyond what Kubernetes itself provides. --> - ## 初衷 Operator 模式旨在捕获(正在管理一个或一组服务的)运维人员的关键目标。 @@ -62,14 +59,14 @@ of Kubernetes itself. Operators are clients of the Kubernetes API that act as controllers for a [Custom Resource](/docs/concepts/api-extension/custom-resources/). --> - ## Kubernetes 上的 Operator Kubernetes 为自动化而生。无需任何修改,您即可以从 Kubernetes 核心中获得许多内置的自动化功能。 您可以使用 Kubernetes 自动化部署和运行工作负载, *甚至* 可以自动化 Kubernetes 自身。 Kubernetes {{< glossary_tooltip text="控制器" term_id="controller" >}} 使您无需修改 Kubernetes 自身的代码,即可以扩展集群的行为。 -Operator 是 Kubernetes API 的客户端,充当[自定义资源](/docs/concepts/api-extension/custom-resources/)的控制器。 +Operator 是 Kubernetes API 的客户端,充当 +[自定义资源](/zh/docs/concepts/extend-kubernetes/api-extension/custom-resources/)的控制器。 - ## Operator 示例 {#example} 使用 Operator 可以自动化的事情包括: @@ -147,7 +143,6 @@ The Controller will normally run outside of the much as you would run any containerized application. For example, you can run the controller in your cluster as a Deployment. --> - ## 部署 Operator 部署 Operator 最常见的方法是将自定义资源及其关联的控制器添加到您的集群中。跟运行容器化应用一样,Controller 通常会运行在 {{< glossary_tooltip text="控制平面" term_id="control-plane" >}} 之外。例如,您可以在集群中将控制器作为 Deployment 运行。 @@ -198,13 +193,11 @@ that can act as a [client for the Kubernetes API](/docs/reference/using-api/clie 如果生态系统中没可以实现您目标的 Operator,您可以自己编写代码。在[接下来](#what-s-next)一节中,您会找到编写自己的云原生 Operator 需要的库和工具的链接。 -您还可以使用任何支持 [Kubernetes API 客户端](/docs/reference/using-api/client-libraries/)的语言或运行时来实现 Operator(即控制器)。 - - +您还可以使用任何支持 [Kubernetes API 客户端](/zh/docs/reference/using-api/client-libraries/) +的语言或运行时来实现 Operator(即控制器)。 ## {{% heading "whatsnext" %}} - -* 详细了解[自定义资源](/docs/concepts/extend-kubernetes/api-extension/custom-resources/) +* 详细了解[自定义资源](/zh/docs/concepts/extend-kubernetes/api-extension/custom-resources/) * 在 [OperatorHub.io](https://operatorhub.io/) 上找到现成的、适合您的 Operator * 借助已有的工具来编写您自己的 Operator,例如: * [KUDO](https://kudo.dev/) (Kubernetes 通用声明式 Operator) @@ -228,6 +221,7 @@ that can act as a [client for the Kubernetes API](/docs/reference/using-api/clie * [Operator 框架](https://github.com/operator-framework/getting-started) * [发布](https://operatorhub.io/)您的 Operator,让别人也可以使用 * 阅读 [CoreOS 原文](https://coreos.com/blog/introducing-operators.html),其介绍了 Operator 介绍 -* 阅读这篇来自谷歌云的关于构建 Operator 最佳实践的[文章](https://cloud.google.com/blog/products/containers-kubernetes/best-practices-for-building-kubernetes-operators-and-stateful-apps) +* 阅读这篇来自谷歌云的关于构建 Operator 最佳实践的 + [文章](https://cloud.google.com/blog/products/containers-kubernetes/best-practices-for-building-kubernetes-operators-and-stateful-apps) diff --git a/content/zh/docs/concepts/extend-kubernetes/service-catalog.md b/content/zh/docs/concepts/extend-kubernetes/service-catalog.md index 0ee381052c..29b12f6bea 100644 --- a/content/zh/docs/concepts/extend-kubernetes/service-catalog.md +++ b/content/zh/docs/concepts/extend-kubernetes/service-catalog.md @@ -1,22 +1,18 @@ --- title: 服务目录 -reviewers: -- chenopis content_type: concept weight: 40 --- -{{< glossary_definition term_id="service-catalog" length="all" prepend="" >}} +{{< glossary_definition term_id="service-catalog" length="all" prepend="服务目录(Service Catalog)是" >}} -服务代理是由[开放服务代理 API 规范](https://github.com/openservicebrokerapi/servicebroker/blob/v2.13/spec.md)定义的一组托管服务的终结点,由第三方提供并维护,其中的第三方可以是 AWS,GCP 或 Azure 等云服务提供商。 -托管服务的一些示例是 Microsoft Azure Cloud Queue,Amazon Simple Queue Service 和 Google Cloud Pub/Sub,但它们是可以使用应用程序的任何软件产品。 - -使用服务目录,集群操作者可以浏览其提供的托管服务列表,提供托管服务实例并与之绑定,以使其可以被 Kubernetes 集群中的应用程序使用。 - - +服务代理(Service Broker)是由[Open Service Broker API 规范](https://github.com/openservicebrokerapi/servicebroker/blob/v2.13/spec.md)定义的一组托管服务的端点,这些服务由第三方提供并维护,其中的第三方可以是 AWS、GCP 或 Azure 等云服务提供商。 +托管服务的一些示例是 Microsoft Azure Cloud Queue、Amazon Simple Queue Service 和 Google Cloud Pub/Sub,但它们可以是应用程序能够使用的任何软件交付物。 +使用服务目录,{{< glossary_tooltip text="集群操作员" term_id="cluster-operator" >}} +可以浏览某服务代理所提供的托管服务列表,供应托管服务实例并与之绑定, +以使其可以被 Kubernetes 集群中的应用程序使用。 ## 示例用例 -应用开发者希望使用消息队列作为其在 Kubernetes 集群中运行的应用程序的一部分。 -但是,它们不想承受建立这种服务的开销,也不想自行管理。幸运的是,有一家云服务提供商通过它们的服务代理将消息队列作为托管服务提供。 +{{< glossary_tooltip text="应用开发人员" term_id="application-developer" >}}, +希望使用消息队列,作为其在 Kubernetes 集群中运行的应用程序的一部分。 +但是,他们不想承受构造这种服务的开销,也不想自行管理。 +幸运的是,有一家云服务提供商通过其服务代理以托管服务的形式提供消息队列服务。 -集群运维人员可以设置服务目录并使用它与云服务提供商的服务代理 通信,以此提供消息队列服务的实例并使其对 Kubernetes 中的应用程序可用。 -因此,应用开发者可以不用关心消息队列的实现细节,也不用对其进行管理。它们的应用程序可以简单的将其作为服务使用。 +集群操作员可以设置服务目录并使用它与云服务提供商的服务代理通信,进而部署消息队列服务的实例 +并使其对 Kubernetes 中的应用程序可用。 +应用开发者于是可以不关心消息队列的实现细节,也不用对其进行管理。 +他们的应用程序可以简单的将其作为服务使用。 -## 架构 -服务目录使用[开放服务代理 API](https://github.com/openservicebrokerapi/servicebroker) 与服务代理进行通信,并作为 Kubernetes API Server 的中介,以便协商首要规定并获取应用程序使用托管服务的必要凭据。 +## 架构 {#architecture} -它被实现为一个扩展 API 服务和一个控制器管理器,使用 Etcd 作为存储。它还使用了 Kubernetes 1.7+ 版本中提供的 [aggregation layer](/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/) 来呈现其 API。 +服务目录使用[Open Service Broker API](https://github.com/openservicebrokerapi/servicebroker) +与服务代理进行通信,并作为 Kubernetes API 服务器的中介,以便协商启动部署和获取 +应用程序使用托管服务时必须的凭据。 -
+服务目录实现为一个扩展 API 服务器和一个控制器,使用 Etcd 提供存储。 +它还使用了 Kubernetes 1.7 之后版本中提供的 +[聚合层](/zh/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/) +来呈现其 API。 -![Service Catalog Architecture](/images/docs/service-catalog-architecture.svg) +![服务目录架构](/images/docs/service-catalog-architecture.svg) -## API 资源 +## API 资源 {#api-resources} 服务目录安装 `servicecatalog.k8s.io` API 并提供以下 Kubernetes 资源: -* `ClusterServiceBroker`:服务目录的集群内代表,封装了它的服务连接细节。集群运维人员创建和管理这些资源,并希望使用该代理服务在集群中提供新类型的托管服务。 +* `ClusterServiceBroker`:服务目录的集群内表现形式,封装了其服务连接细节。集群运维人员创建和管理这些资源,并希望使用该代理服务在集群中提供新类型的托管服务。 * `ClusterServiceClass`:由特定服务代理提供的托管服务。当新的 `ClusterServiceBroker` 资源被添加到集群时,服务目录控制器将连接到服务代理以获取可用的托管服务列表。然后为每个托管服务创建对应的新 `ClusterServiceClass` 资源。 * `ClusterServicePlan`:托管服务的特定产品。例如托管服务可能有不同的计划可用,如免费版本和付费版本,或者可能有不同的配置选项,例如使用 SSD 存储或拥有更多资源。与 `ClusterServiceClass` 类似,当一个新的 `ClusterServiceBroker` 被添加到集群时,服务目录会为每个托管服务的每个可用服务计划创建对应的新 `ClusterServicePlan` 资源。 * `ServiceInstance`:`ClusterServiceClass` 提供的示例。由集群运维人员创建,以使托管服务的特定实例可供一个或多个集群内应用程序使用。当创建一个新的 `ServiceInstance` 资源时,服务目录控制器将连接到相应的服务代理并指示它调配服务实例。 @@ -107,11 +108,11 @@ Service Catalog supports these methods of authentication: * Basic (username/password) * [OAuth 2.0 Bearer Token](https://tools.ietf.org/html/rfc6750) --> -### 认证 +### 认证 {#authentication} 服务目录支持这些认证方法: -* 基础认证(用户名/密码) +* 基本认证(用户名/密码) * [OAuth 2.0 不记名令牌](https://tools.ietf.org/html/rfc6750) ## 使用方式 -集群运维人员可以使用服务目录 API 资源来提供托管服务并使其在 Kubernetes 集群内可用。涉及的步骤有: +集群运维人员可以使用服务目录 API 资源来供应托管服务并使其在 Kubernetes 集群内可用。涉及的步骤有: 1. 列出服务代理提供的托管服务和服务计划。 2. 配置托管服务的新实例。 @@ -153,7 +154,28 @@ spec: # with the service broker, such as bearer token info or a caBundle for TLS. ##### ``` +--> +### 列出托管服务和服务计划 +首先,集群运维人员在 `servicecatalog.k8s.io` 组内创建一个 `ClusterServiceBroker` 资源。此资源包含访问服务代理终结点所需的 URL 和连接详细信息。 + +这是一个 `ClusterServiceBroker` 资源的例子: + +```yaml +apiVersion: servicecatalog.k8s.io/v1beta1 +kind: ClusterServiceBroker +metadata: + name: cloud-broker +spec: + # 指向服务代理的末端。(这里的 URL 是无法使用的) + url: https://servicebroker.somecloudprovider.com/v1alpha1/projects/service-catalog/brokers/default + ##### + # 这里可以添加额外的用来与服务代理通信的属性值, + # 例如持有者令牌信息或者 TLS 的 CA 包 + ##### +``` + + +下面的时序图展示了从服务代理列出可用托管服务和计划所涉及的各个步骤: +![列举服务](/images/docs/service-catalog-list.svg) + +1. 一旦 `ClusterServiceBroker` 资源被添加到了服务目录之后,将会触发一个到外部服务代理的 + 调用,以列举所有可用服务; +1. 服务代理返回可用的托管服务和服务计划列表,这些列表将本地缓存在 `ClusterServiceClass` + 和 `ClusterServicePlan` 资源中。 +1. 集群运维人员接下来可以使用以下命令获取可用托管服务的列表: + + -### 列出托管服务和服务计划 -首先,集群运维人员在 `servicecatalog.k8s.io` 组内创建一个 `ClusterServiceBroker` 资源。此资源包含访问服务代理终结点所需的 URL 和连接详细信息。 + ```shell + kubectl get clusterserviceclasses \ + -o=custom-columns=SERVICE\ NAME:.metadata.name,EXTERNAL\ NAME:.spec.externalName + ``` -这是一个 `ClusterServiceBroker` 资源的例子: + 它应该输出一个和以下格式类似的服务名称列表: -```yaml -apiVersion: servicecatalog.k8s.io/v1beta1 -kind: ClusterServiceBroker -metadata: - name: cloud-broker -spec: - # Points to the endpoint of a service broker. (This example is not a working URL.) - url: https://servicebroker.somecloudprovider.com/v1alpha1/projects/service-catalog/brokers/default - ##### - # Additional values can be added here, which may be used to communicate - # with the service broker, such as bearer token info or a caBundle for TLS. - ##### -``` + ``` + SERVICE NAME EXTERNAL NAME + 4f6e6cf6-ffdd-425f-a2c7-3c9258ad2468 cloud-provider-service + ... ... + ``` -下面的顺序图展示了从一个服务代理列出可用托管服务和计划所有涉及的步骤: + 他们还可以使用以下命令查看可用的服务计划: -![List Services](/images/docs/service-catalog-list.svg) - -1. 一旦 `ClusterServiceBroker` 资源被添加到了服务目录之后,将会触发一个到外部服务代理的 List Services 调用。 -1. 服务代理返回可用的托管服务和服务计划列表,这些列表将本地缓存在 `ClusterServiceClass` 和 `ClusterServicePlan` 资源中。 -1. 然后集群运维人员可以使用以下命令获取可用托管服务的列表: - - kubectl get clusterserviceclasses -o=custom-columns=SERVICE\ NAME:.metadata.name,EXTERNAL\ NAME:.spec.externalName - - 它应该输出一个和以下格式类似的服务名称列表: - - SERVICE NAME EXTERNAL NAME - 4f6e6cf6-ffdd-425f-a2c7-3c9258ad2468 cloud-provider-service - ... ... - - 他们还可以使用以下命令查看可用的服务计划: - - kubectl get clusterserviceplans -o=custom-columns=PLAN\ NAME:.metadata.name,EXTERNAL\ NAME:.spec.externalName + ```shell + kubectl get clusterserviceplans \ + -o=custom-columns=PLAN\ NAME:.metadata.name,EXTERNAL\ NAME:.spec.externalName + ``` 它应该输出一个和以下格式类似的服务计划列表: - PLAN NAME EXTERNAL NAME - 86064792-7ea2-467b-af93-ac9694d96d52 service-plan-name - ... ... + ``` + PLAN NAME EXTERNAL NAME + 86064792-7ea2-467b-af93-ac9694d96d52 service-plan-name + ... ... + ``` -### 配置一个新实例 +### 供应一个新实例 集群运维人员 可以通过创建一个 `ServiceInstance` 资源来启动一个新实例的配置。 -这是一个 `ServiceInstance` 资源的例子: +下面是一个 `ServiceInstance` 资源的例子: ```yaml apiVersion: servicecatalog.k8s.io/v1beta1 @@ -270,22 +278,31 @@ metadata: name: cloud-queue-instance namespace: cloud-apps spec: - # References one of the previously returned services + # 引用之前返回的服务之一 clusterServiceClassExternalName: cloud-provider-service clusterServicePlanExternalName: service-plan-name ##### - # Additional parameters can be added here, - # which may be used by the service broker. + # 这里可添加额外的参数,供服务代理使用 ##### ``` -以下顺序图展示了配置托管服务新实例所涉及的步骤: + +以下时序图展示了配置托管服务新实例所涉及的步骤: + +![供应服务](/images/docs/service-catalog-provision.svg) + +1. 创建 `ServiceInstance` 资源时,服务目录将启动一个到外部服务代理的调用, + 请求供应一个实例。 1. 服务代理创建一个托管服务的新实例并返回 HTTP 响应。 -1. 然后集群运维人员可以检查实例的状态是否就绪。 +1. 接下来,集群运维人员可以检查实例的状态是否就绪。 ### 绑定到托管服务 @@ -333,15 +342,23 @@ spec: instanceRef: name: cloud-queue-instance ##### - # Additional information can be added here, such as a secretName or - # service account parameters, which may be used by the service broker. + # 这里可以添加供服务代理使用的额外信息,例如 Secret 名称或者服务账号参数, ##### ``` -以下顺序图展示了绑定到托管服务实例的步骤: + +以下顺序图展示了绑定到托管服务实例的步骤: + +![绑定到托管服务](/images/docs/service-catalog-bind.svg) + 1. 在创建 `ServiceBinding` 之后,服务目录调用外部服务代理,请求绑定服务实例所需的信息。 1. 服务代理为相应服务账户启用应用权限/角色。 1. 服务代理返回连接和访问托管服务示例所需的信息。这是由提供商和服务特定的,故返回的信息可能因服务提供商和其托管服务而有所不同。 @@ -362,7 +379,7 @@ These pieces of information are stored in secrets that the application in the cl
-![Map connection credentials](/images/docs/service-catalog-map.svg) +![映射连接凭据](/images/docs/service-catalog-map.svg) #### Pod 配置文件 执行此映射的一种方法是使用声明式 Pod 配置。 -以下示例描述了如何将服务账户凭据映射到应用程序中。名为 `sa-key` 的密钥保存在一个名为 `provider-cloud-key` 的卷中,应用程序会将该卷挂载在 `/var/secrets/provider/key.json` 路径下。环境变量 `PROVIDER_APPLICATION_CREDENTIALS` 将映射为挂载文件的路径。 +以下示例描述了如何将服务账户凭据映射到应用程序中。名为 `sa-key` 的密钥保存在一个名为 +`provider-cloud-key` 的卷中,应用程序会将该卷挂载在 `/var/secrets/provider/key.json` +路径下。环境变量 `PROVIDER_APPLICATION_CREDENTIALS` 将映射为挂载文件的路径。 ```yaml ... @@ -424,8 +413,12 @@ The following example describes how to map secret values into application enviro value: "/var/secrets/provider/key.json" ``` -以下示例描述了如何将 secret 值映射为应用程序的环境变量。在这个示例中,消息队列的主题名从 secret `provider-queue-credentials` 中名为 `topic` 的 key 项映射到环境变量 `TOPIC` 中。 - + +以下示例描述了如何将 Secret 值映射为应用程序的环境变量。 +在这个示例中,消息队列的主题名从 Secret `provider-queue-credentials` 中名为 +`topic` 的主键映射到环境变量 `TOPIC` 中。 ```yaml ... @@ -437,9 +430,6 @@ The following example describes how to map secret values into application enviro key: topic ``` - - - ## {{% heading "whatsnext" %}} -* 如果您熟悉{{< glossary_tooltip text="Helm Charts" term_id="helm-chart" >}},您可以[使用 Helm 将服务目录](/docs/tasks/service-catalog/install-service-catalog-using-helm/)安装到 Kubernetes 集群中。或者,您可以[使用 SC 工具安装服务目录](/docs/tasks/service-catalog/install-service-catalog-using-sc/)。 -* 查看[服务代理示例](https://github.com/openservicebrokerapi/servicebroker/blob/master/gettingStarted.md#sample-service-brokers)。 -* 浏览 [kubernetes-incubator/service-catalog](https://github.com/kubernetes-incubator/service-catalog) 项目。 -* 查看 [svc-cat.io](https://svc-cat.io/docs/)。 - - +* 如果你熟悉 {{< glossary_tooltip text="Helm Charts" term_id="helm-chart" >}}, + 可以[使用 Helm 安装服务目录](/zh/docs/tasks/service-catalog/install-service-catalog-using-helm/) + 到 Kubernetes 集群中。或者,你可以 + [使用 SC 工具安装服务目录](/zh/docs/tasks/service-catalog/install-service-catalog-using-sc/)。 +* 查看[服务代理示例](https://github.com/openservicebrokerapi/servicebroker/blob/master/gettingStarted.md#sample-service-brokers) +* 浏览 [kubernetes-incubator/service-catalog](https://github.com/kubernetes-incubator/service-catalog) 项目 +* 查看 [svc-cat.io](https://svc-cat.io/docs/) diff --git a/content/zh/docs/concepts/overview/components.md b/content/zh/docs/concepts/overview/components.md index f653d71fef..a8cc964c64 100644 --- a/content/zh/docs/concepts/overview/components.md +++ b/content/zh/docs/concepts/overview/components.md @@ -9,7 +9,6 @@ card: weight: 20 --- - -## 控制平面组件(Control Plane Components) +## 控制平面组件(Control Plane Components) + 控制平面的组件对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的 `replicas` 字段时,启动新的 {{< glossary_tooltip text="pod" term_id="pod">}})。 -控制平面组件可以在集群中的任何节点上运行。然而,为了简单起见,设置脚本通常会在同一个计算机上启动所有控制平面组件,并且不会在此计算机上运行用户容器。请参阅[构建高可用性集群](/docs/admin/high-availability/)中对于多主机 VM 的设置示例。 +控制平面组件可以在集群中的任何节点上运行。 +然而,为了简单起见,设置脚本通常会在同一个计算机上启动所有控制平面组件,并且不会在此计算机上运行用户容器。 +请参阅[构建高可用性集群](/zh/docs/setup/production-environment/tools/kubeadm/high-availability/) +中对于多主机 VM 的设置示例。 ### kube-apiserver @@ -100,47 +99,46 @@ These controllers include: -### 云控制器管理器-(cloud-controller-manager) +### cloud-controller-manager - -[cloud-controller-manager](/docs/tasks/administer-cluster/running-cloud-controller/) 运行与基础云提供商交互的控制器。cloud-controller-manager 二进制文件是 Kubernetes 1.6 版本中引入的 alpha 功能。 +`cloud-controller-manager` 进运行特定于云平台的控制回路。 +如果你在自己的环境中运行 Kubernetes,或者在本地计算机中运行学习环境, +所部属的环境中不需要云控制器管理器。 - -cloud-controller-manager 仅运行云提供商特定的控制器循环。您必须在 kube-controller-manager 中禁用这些控制器循环,您可以通过在启动 kube-controller-manager 时将 `--cloud-provider` 参数设置为 `external` 来禁用控制器循环。 +与 `kube-controller-manager` 类似,`cloud-controller-manager` 将若干逻辑上独立的 +控制回路组合到同一个可执行文件中,供你以同一进程的方式运行。 +你可以对其执行水平扩容(运行不止一个副本)以提升性能或者增强容错能力。 - -cloud-controller-manager 允许云供应商的代码和 Kubernetes 代码彼此独立地发展。在以前的版本中,核心的 Kubernetes 代码依赖于特定云提供商的代码来实现功能。在将来的版本中,云供应商专有的代码应由云供应商自己维护,并与运行 Kubernetes 的云控制器管理器相关联。 +下面的控制器都包含对云平台驱动的依赖: - -以下控制器具有云提供商依赖性: - - * 节点控制器(Node Controller): 用于检查云提供商以确定节点是否在云中停止响应后被删除 + * 节点控制器(Node Controller): 用于在节点终止响应后检查云提供商以确定节点是否已被删除 * 路由控制器(Route Controller): 用于在底层云基础架构中设置路由 * 服务控制器(Service Controller): 用于创建、更新和删除云提供商负载均衡器 - * 数据卷控制器(Volume Controller): 用于创建、附加和装载卷、并与云提供商进行交互以编排卷 -## Node 组件 - +## Node 组件 {#node-components} + 节点组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境。 ### kubelet @@ -154,87 +152,93 @@ Node components run on every node, maintaining running pods and providing the Ku -### 容器运行环境(Container Runtime) +### 容器运行时(Container Runtime) {#container-runtime} {{< glossary_definition term_id="container-runtime" length="all" >}} -## 插件(Addons) - -插件使用 Kubernetes 资源 ({{< glossary_tooltip term_id="daemonset" >}}, -{{< glossary_tooltip term_id="deployment" >}}等) 实现集群功能。因为这些提供集群级别的功能,所以插件的命名空间资源属于 `kube-system` 命名空间。 +## 插件(Addons) {#addons} + +插件使用 Kubernetes 资源({{< glossary_tooltip text="DaemonSet" term_id="daemonset" >}}、 +{{< glossary_tooltip text="Deployment" term_id="deployment" >}}等)实现集群功能。 +因为这些插件提供集群级别的功能,插件中命名空间域的资源属于 `kube-system` 命名空间。 -所选的插件如下所述:有关可用插件的扩展列表,请参见[插件 (Addons)](/docs/concepts/cluster-administration/addons/)。 - -### DNS +下面描述众多插件中的几种。有关可用插件的完整列表,请参见 +[插件(Addons)](/zh/docs/concepts/cluster-administration/addons/)。 -尽管并非严格要求其他附加组件,但所有示例都依赖[集群 DNS](/docs/concepts/services-networking/dns-pod-service/),因此所有 Kubernetes 集群都应具有 DNS。 +### DNS {#dns} -除了您环境中的其他 DNS 服务器之外,集群 DNS 还是一个 DNS 服务器,它为 Kubernetes 服务提供 DNS 记录。 +尽管其他插件都并非严格意义上的必需组件,但几乎所有 Kubernetes 集群都应该 +有[集群 DNS](/zh/docs/concepts/services-networking/dns-pod-service/), +因为很多示例都需要 DNS 服务。 -Cluster DNS 是一个 DNS 服务器,和您部署环境中的其他 DNS 服务器一起工作,为 Kubernetes 服务提供DNS记录。 +集群 DNS 是一个 DNS 服务器,和环境中的其他 DNS 服务器一起工作,它为 Kubernetes 服务提供 DNS 记录。 -Kubernetes 启动的容器自动将 DNS 服务器包含在 DNS 搜索中。 +Kubernetes 启动的容器自动将此 DNS 服务器包含在其 DNS 搜索列表中。 -### 用户界面(Dashboard) - -[Dashboard](/docs/tasks/access-application-cluster/web-ui-dashboard/) 是 Kubernetes 集群的通用基于 Web 的 UI。它使用户可以管理集群中运行的应用程序以及集群本身并进行故障排除。 +### Web 界面(仪表盘) + +[Dashboard](/zh/docs/tasks/access-application-cluster/web-ui-dashboard/) 是K +ubernetes 集群的通用的、基于 Web 的用户界面。 +它使用户可以管理集群中运行的应用程序以及集群本身并进行故障排除。 -### 容器资源监控 - -[容器资源监控](/docs/tasks/debug-application-cluster/resource-usage-monitoring/)将关于容器的一些常见的时间序列度量值保存到一个集中的数据库中,并提供用于浏览这些数据的界面。 +### 容器资源监控 + +[容器资源监控](/zh/docs/tasks/debug-application-cluster/resource-usage-monitoring/) +将关于容器的一些常见的时间序列度量值保存到一个集中的数据库中,并提供用于浏览这些数据的界面。 -### 集群层面日志 - -[集群层面日志](/docs/concepts/cluster-administration/logging/) 机制负责将容器的日志数据保存到一个集中的日志存储中,该存储能够提供搜索和浏览接口。 +### 集群层面日志 +[集群层面日志](/zh/docs/concepts/cluster-administration/logging/) 机制负责将容器的日志数据 +保存到一个集中的日志存储中,该存储能够提供搜索和浏览接口。 ## {{% heading "whatsnext" %}} -* 进一步了解 [Nodes](/docs/concepts/architecture/nodes/) -* 进一步了解 [kube-scheduler](/docs/concepts/scheduling/kube-scheduler/) +* 进一步了解[节点](/zh/docs/concepts/architecture/nodes/) +* 进一步了解[控制器](/zh/docs/concepts/architecture/controller/) +* 进一步了解 [kube-scheduler](/zh/docs/concepts/scheduling-eviction/kube-scheduler/) * 阅读 etcd 官方[文档](https://etcd.io/docs/) + diff --git a/content/zh/docs/concepts/overview/kubernetes-api.md b/content/zh/docs/concepts/overview/kubernetes-api.md index 8594bdcfb4..99d65a572f 100644 --- a/content/zh/docs/concepts/overview/kubernetes-api.md +++ b/content/zh/docs/concepts/overview/kubernetes-api.md @@ -3,7 +3,7 @@ title: Kubernetes API content_type: concept weight: 30 description: > - Kubernetes API 使您可以查询和操纵 Kubernetes 中对象的状态。Kubernetes 控制平面的核心是 API 服务器和它暴露的 HTTP API。 用户、集群的不同部分以及外部组件都通过 API 服务器相互通信。 + Kubernetes API 使你可以查询和操纵 Kubernetes 中对象的状态。Kubernetes 控制平面的核心是 API 服务器和它暴露的 HTTP API。 用户、集群的不同部分以及外部组件都通过 API 服务器相互通信。 card: name: concepts weight: 30 @@ -12,135 +12,186 @@ card: -[API协议文档](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md)描述了主系统和API概念。 - -[API参考文档](/docs/reference)描述了API整体规范。 - -[访问文档](/docs/admin/accessing-the-api)讨论了通过远程访问API的相关问题。 - -Kubernetes API是系统描述性配置的基础。 [Kubectl](/docs/user-guide/kubectl/) 命令行工具被用于创建、更新、删除、获取API对象。 - -Kubernetes 通过API资源存储自己序列化状态(现在存储在[etcd](https://coreos.com/docs/distributed-configuration/getting-started-with-etcd/))。 - -Kubernetes 被分成多个组件,各部分通过API相互交互。 - +Kubernetes {{< glossary_tooltip text="控制面" term_id="control-plane" >}} +的核心是 {{< glossary_tooltip text="API 服务器" term_id="kube-apiserver" >}}。 +API 服务器负责提供 HTTP API,以供用户、集群中的不同部分和集群外部组件相互通信。 +Kubernetes API 使你可以查询和操纵 Kubernetes API +中对象(例如:Pod、Namespace、ConfigMap 和 Event)的状态。 +API 末端、资源类型以及示例都在[API 参考](/zh/docs/reference/kubernetes-api/)中描述。 -## API 变更 +## API 变更 {#api-changes} -根据经验,任何成功的系统都需要随着新的用例出现或现有用例发生变化的情况下,进行相应的进化与调整。因此,我们希望Kubernetes API也可以保持持续的进化和调整。同时,在较长一段时间内,我们也希望与现有客户端版本保持良好的向下兼容性。一般情况下,增加新的API资源和资源字段不会导致向下兼容性问题发生;但如果是需要删除一个已有的资源或者字段,那么必须通过[API废弃流程](/docs/reference/deprecation-policy/)来进行。 +任何成功的系统都要随着新的使用案例的出现和现有案例的变化来成长和变化。 +为此,Kubernetes 的功能特性设计考虑了让 Kubernetes API 能够持续变更和成长的因素。 +Kubernetes 项目的目标是 _不要_ 引发现有客户端的兼容性问题,并在一定的时期内 +维持这种兼容性,以便其他项目有机会作出适应性变更。 -参考[API变更文档](https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md),了解兼容性变更的要素以及如何变更API的流程。 +一般而言,新的 API 资源和新的资源字段可以被频繁地添加进来。 +删除资源或者字段则要遵从 +[API 废弃策略](/zh/docs/reference/using-api/deprecation-policy/)。 + +关于什么是兼容性的变更,如何变更 API 等详细信息,可参考 +[API 变更](https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md#readme)。 -## OpenAPI 和 API Swagger 定义 +## OpenAPI 规范 {#api-specification} -完整的 API 详细文档使用 [OpenAPI](https://www.openapis.org/)生成. +完整的 API 细节是用 [OpenAPI](https://www.openapis.org/) 来表述的。 -随着 Kubernetes 1.10 版本的正式启用,Kubernetes API 服务通过 `/openapi/v2` 接口提供 OpenAPI 规范。 -通过设置 HTTP 标头的规定了请求的结构。 - -Header | Possible Values ------- | --------------- -Accept | `application/json`, `application/com.github.proto-openapi.spec.v2@v1.0+protobuf` (the default content-type is `application/json` for `*/*` or not passing this header) -Accept-Encoding | `gzip` (not passing this header is acceptable) +Kubernetes API 服务器通过 `/openapi/v2` 末端提供 OpenAPI 规范。 +你可以按照下表所给的请求头部,指定响应的格式: - -在1.14版本之前,区分结构的接口通过(`/swagger.json`, `/swagger-2.0.0.json`, `/swagger-2.0.0.pb-v1`, `/swagger-2.0.0.pb-v1.gz`) -提供不同格式的 OpenAPI 规范。但是这些接口已经被废弃,并且已经在 Kubernetes 1.14 中被删除。 - -**获取 OpenAPI 规范的例子**: - -1.10 之前 | 从 1.10 开始 ------------ | ----------------------------- -GET /swagger.json | GET /openapi/v2 **Accept**: application/json -GET /swagger-2.0.0.pb-v1 | GET /openapi/v2 **Accept**: application/com.github.proto-openapi.spec.v2@v1.0+protobuf -GET /swagger-2.0.0.pb-v1.gz | GET /openapi/v2 **Accept**: application/com.github.proto-openapi.spec.v2@v1.0+protobuf **Accept-Encoding**: gzip + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
头部可选值说明
Accept-Encodinggzip不指定此头部也是可以的
Acceptapplication/com.github.proto-openapi.spec.v2@v1.0+protobuf主要用于集群内部
application/json默认值
*提供application/json
OpenAPI v2 查询请求的合法头部值
- -Kubernetes实现了另一种基于Protobuf的序列化格式,该格式主要用于集群内通信,并在[设计方案](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/protobuf.md)中进行了说明,每个模式的IDL文件位于定义API对象的Go软件包中。 -在 1.14 版本之前, Kubernetes apiserver 也提供 API 服务用于返回 -[Swagger v1.2](http://swagger.io/) Kubernetes API 规范通过 `/swaggerapi` 接口. -但是这个接口已经被废弃,并且在 Kubernetes 1.14 中已经被移除。 +Kubernetes 为 API 实现了一种基于 Protobuf 的序列化格式,主要用于集群内部的通信。 +相关文档位于[设计提案](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/protobuf.md)。 +每种 Schema 对应的 IDL 位于定义 API 对象的 Go 包中。 +## API 版本 {#api-versioning} -## API 版本 - -为了使删除字段或者重构资源表示更加容易,Kubernetes 支持 -多个API版本。每一个版本都在不同API路径下,例如 `/api/v1` 或者 -`/apis/extensions/v1beta1`。 +为了简化删除字段或者重构资源表示等工作,Kubernetes 支持多个 API 版本, +每一个版本都在不同 API 路径下,例如 `/api/v1` 或 +`/apis/rbac.authorization.k8s.io/v1alpha1`。 +版本化是在 API 级别而不是在资源或字段级别进行的,目的是为了确保 API +为系统资源和行为提供清晰、一致的视图,并能够控制对已废止的和/或实验性 API 的访问。 -我们选择在API级别进行版本化,而不是在资源或字段级别进行版本化,以确保API提供清晰,一致的系统资源和行为视图,并控制对已废止的API和/或实验性API的访问。 JSON和Protobuf序列化模式遵循架构更改的相同准则 - 下面的所有描述都同时适用于这两种格式。 - -请注意,API版本控制和软件版本控制只有间接相关性。 - [API和发行版本建议](https://git.k8s.io/community/contributors/design-proposals/release/versioning.md) 描述了API版本与软件版本之间的关系。 +JSON 和 Protobuf 序列化模式遵循 schema 更改的相同准则 - 下面的所有描述都同时适用于这两种格式。 +请注意,API 版本控制和软件版本控制只有间接相关性。 +[Kubernetes 发行版本提案](https://git.k8s.io/community/contributors/design-proposals/release/versioning.md) +中描述了 API 版本与软件版本之间的关系。 -不同的API版本名称意味着不同级别的软件稳定性和支持程度。 每个级别的标准在[API变更文档](https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md#alpha-beta-and-stable-versions)中有更详细的描述。 内容主要概括如下: +不同的 API 版本名称意味着不同级别的软件稳定性和支持程度。 +每个级别的判定标准在 +[API 变更文档](https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md#alpha-beta-and-stable-versions) +中有更详细的描述。 +这些标准主要概括如下: +- Alpha 级别: + - 版本名称包含 `alpha`(例如:`v1alpha1`) + - API 可能是有缺陷的。启用该功能可能会带来问题,默认情况是禁用的 + - 对相关功能的支持可能在没有通知的情况下随时终止 + - API 可能在将来的软件发布中出现不兼容性的变更,此类变更不会另行通知 + - 由于缺陷风险较高且缺乏长期支持,推荐仅在短暂的集群测试中使用 + + +- Beta 级别: + - 版本名称包含 `beta`(例如:`v2beta3`) + - 代码已经充分测试过。启用该功能被认为是安全的,功能默认已启用。 + - 所支持的功能作为一个整体不会被删除,尽管细节可能会发生变更。 + - 对象的模式和/或语义可能会在后续的 beta 发行版或稳定版中以不兼容的方式进行更改。 + 发生这种情况时,我们将提供如何迁移到新版本的说明。 + 迁移操作可能需要删除、编辑和重新创建 API 对象。 + 执行编辑操作时可能需要动些脑筋。 + 迁移过程中可能需要停用依赖该功能的应用程序。 + - 建议仅用于非业务关键性用途,因为后续版本中可能存在不兼容的更改。 + 如果你有多个可以独立升级的集群,则可以放宽此限制。 + - **请尝试我们的 beta 版本功能并且给出反馈!一旦它们结束 beta 阶段,进一步变更可能就不太现实了。** + -- Alpha 测试版本: - - 版本名称包含了 **`alpha`** (例如:**`v1alpha1`**)。 - - 可能是有缺陷的。启用该功能可能会带来隐含的问题,默认情况是关闭的。 - - 支持的功能可能在没有通知的情况下随时删除。 - - API的更改可能会带来兼容性问题,但是在后续的软件发布中不会有任何通知。 - - 由于bugs风险的增加和缺乏长期的支持,推荐在短暂的集群测试中使用。 -- Beta 测试版本: - - 版本名称包含了 **`beta`** (例如: **`v2beta3`**)。 - - 代码已经测试过。启用该功能被认为是安全的,功能默认已启用。 - - 所有已支持的功能不会被删除,细节可能会发生变化。 - - 对象的模式和/或语义可能会在后续的beta测试版或稳定版中以不兼容的方式进行更改。 发生这种情况时,我们将提供迁移到下一个版本的说明。 这可能需要删除、编辑和重新创建API对象。执行编辑操作时需要谨慎行事,这可能需要停用依赖该功能的应用程序。 - - 建议仅用于非业务关键型用途,因为后续版本中可能存在不兼容的更改。 如果您有多个可以独立升级的集群,则可以放宽此限制。 - - **请尝试我们的 beta 版本功能并且给出反馈!一旦他们退出 beta 测试版,我们可能不会做出更多的改变。** -- 稳定版本: - - 版本名称是 **`vX`**,其中 **`X`** 是整数。 +- 稳定级别: + - 版本名称是 `vX`,其中 `X` 是整数。 - 功能的稳定版本将出现在许多后续版本的发行软件中。 +## API 组 {#api-groups} -## API 组 - -为了更容易地扩展Kubernetes API,我们实现了[*`API组`*](https://git.k8s.io/community/contributors/design-proposals/api-machinery/api-group.md)。 -API组在REST路径和序列化对象的 **`apiVersion`** 字段中指定。 +为了更容易地扩展 Kubernetes API,Kubernetes 实现了 +[*`API组`*](https://git.k8s.io/community/contributors/design-proposals/api-machinery/api-group.md)。 +API 组在 REST 路径和序列化对象的 `apiVersion` 字段中指定。 +集群中存在若干 API 组: -目前有几个API组正在使用中: +1. *核心(Core)*组,通常被称为 *遗留(Legacy)* 组,位于 REST 路径 `/api/v1`, + 使用 `apiVersion: v1`。 -1. 核心组(通常被称为遗留组)位于REST路径 `/api/v1` 并使用 `apiVersion:v1`。 - -1. 指定的组位于REST路径 `/apis/$GROUP_NAME/$VERSION`,并使用 `apiVersion:$GROUP_NAME/$VERSION` - (例如 `apiVersion:batch/v1`)。 在[Kubernetes API参考](/docs/reference/)中可以看到支持的API组的完整列表。 +1. *命名(Named)* 组 REST 路径 `/apis/$GROUP_NAME/$VERSION`,使用 + `apiVersion: $GROUP_NAME/$VERSION`(例如 `apiVersion: batch/v1`)。 + [Kubernetes API 参考](/zh/docs/reference/kubernetes-api/)中枚举了可用的 API 组的完整列表。 +有两种途径来扩展 Kubernetes API 以支持 +[自定义资源](/zh/docs/concepts/extend-kubernetes/api-extension/custom-resources/): -社区支持使用以下两种方式来提供自定义资源对API进行扩展[自定义资源](/docs/concepts/api-extension/custom-resources/): +1. 使用 [CustomResourceDefinition](/zh/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/), + 你可以用声明式方式来定义 API 如何提供你所选择的资源 API。 -1. [CustomResourceDefinition](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/) - 适用于具有非常基本的CRUD需求的用户。 - -1. 需要全套Kubernetes API语义的用户可以实现自己的apiserver, - 并使用[聚合器](/docs/tasks/access-kubernetes-api/configure-aggregation-layer/) +1. 你也可以选择[实现自己的扩展 API 服务器](/zh/docs/tasks/extend-kubernetes/setup-extension-api-server/) + 并使用[聚合器](/zh/docs/tasks/extend-kubernetes/configure-aggregation-layer/) 为客户提供无缝的服务。 +## 启用或禁用 API 组 {#enabling-or-disabling-api-groups} -## 启用 API 组 - -某些资源和API组默认情况下处于启用状态。 可以通过在apiserver上设置 `--runtime-config` 来启用或禁用它们。 +某些资源和 API 组默认情况下处于启用状态。可以通过为 `kube-apiserver` +设置 `--runtime-config` 命令行选项来启用或禁用它们。 `--runtime-config` 接受逗号分隔的值。 -例如:要禁用batch/v1,请设置 `--runtime-config=batch/v1=false`,以启用batch/v2alpha1,请设置`--runtime-config=batch/v2alpha1`。 -该标志接受描述apiserver的运行时配置的逗号分隔的一组键值对。 +例如:要禁用 `batch/v1`,设置 `--runtime-config=batch/v1=false`; +要启用 `batch/v2alpha1`,设置`--runtime-config=batch/v2alpha1`。 +该标志接受逗号分隔的一组"key=value"键值对,用以描述 API 服务器的运行时配置。 {{< note >}} - -启用或禁用组或资源需要重新启动apiserver和控制器管理器来使得 `--runtime-config` 更改生效。 - +启用或禁用组或资源需要重新启动 `kube-apiserver` 和 `kube-controller-manager` +来使得 `--runtime-config` 更改生效。 {{< /note >}} +## 持久性 {#persistence} -## 启用 extensions/v1beta1 组中资源 +Kubernetes 也将其 API 资源的序列化状态保存起来,写入到 {{< glossary_tooltip term_id="etcd" >}}。 -在 `extensions/v1beta1` API 组中,DaemonSets,Deployments,StatefulSet, NetworkPolicies, PodSecurityPolicies 和 ReplicaSets 是默认禁用的。 -例如:要启用 deployments 和 daemonsets,请设置 `--runtime-config=extensions/v1beta1/deployments=true,extensions/v1beta1/daemonsets=true`。 +## {{% heading "whatsnext" %}} -{{< note >}} + +* [控制 API 访问](/zh/docs/reference/access-authn-authz/controlling-access/) + 描述了集群如何为 API 访问管理身份认证和权限判定; +* 总体的 API 约定描述位于 [API 约定](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md)中; +* API 末端、资源类型和示例等均在 [API 参考文档](/zh/docs/reference/kubernetes-api/)中描述 -出于遗留原因,仅在 `extensions / v1beta1` API 组中支持各个资源的启用/禁用。 -{{< /note >}} diff --git a/content/zh/docs/concepts/overview/working-with-objects/annotations.md b/content/zh/docs/concepts/overview/working-with-objects/annotations.md index 8e8b0f3f5b..f342a92113 100644 --- a/content/zh/docs/concepts/overview/working-with-objects/annotations.md +++ b/content/zh/docs/concepts/overview/working-with-objects/annotations.md @@ -5,46 +5,39 @@ weight: 50 --- -你可以使用 Kubernetes 注解为对象附加任意的非标识的元数据。客户端程序(例如工具和库)能够获取这些元数据信息。 - +你可以使用 Kubernetes 注解为对象附加任意的非标识的元数据。客户端程序(例如工具和库)能够获取这些元数据信息。 -## 为对象附加元数据 -您可以使用标签或注解将元数据附加到 Kubernetes 对象。 -标签可以用来选择对象和查找满足某些条件的对象集合。 相反,注解不用于标识和选择对象。 -注解中的元数据,可以很小,也可以很大,可以是结构化的,也可以是非结构化的,能够包含标签不允许的字符。 - - - -注解和标签一样,是键/值对: - +## 为对象附加元数据 + +你可以使用标签或注解将元数据附加到 Kubernetes 对象。 +标签可以用来选择对象和查找满足某些条件的对象集合。 相反,注解不用于标识和选择对象。 +注解中的元数据,可以很小,也可以很大,可以是结构化的,也可以是非结构化的,能够包含标签不允许的字符。 + +注解和标签一样,是键/值对: ```json "metadata": { @@ -55,75 +48,63 @@ Annotations, like labels, are key/value maps: } ``` -以下是一些例子,用来说明哪些信息可以使用注解来记录: - -* 由声明性配置所管理的字段。 - 将这些字段附加为注解,能够将它们与客户端或服务端设置的默认值、自动生成的字段以及通过自动调整大小或自动伸缩系统设置的字段区分开来。 +以下是一些例子,用来说明哪些信息可以使用注解来记录: -* 构建、发布或镜像信息(如时间戳、发布 ID、Git 分支、PR 数量、镜像哈希、仓库地址)。 - - -* 指向日志记录、监控、分析或审计仓库的指针。 - - -* 可用于调试目的的客户端库或工具信息:例如,名称、版本和构建信息。 +* 由声明性配置所管理的字段。 + 将这些字段附加为注解,能够将它们与客户端或服务端设置的默认值、 + 自动生成的字段以及通过自动调整大小或自动伸缩系统设置的字段区分开来。 +* 构建、发布或镜像信息(如时间戳、发布 ID、Git 分支、PR 数量、镜像哈希、仓库地址)。 +* 指向日志记录、监控、分析或审计仓库的指针。 + -* 用户或者工具/系统的来源信息,例如来自其他生态系统组件的相关对象的 URL。 - - -* 推出的轻量级工具的元数据信息:例如,配置或检查点。 - - -* 负责人员的电话或呼机号码,或指定在何处可以找到该信息的目录条目,如团队网站。 - - - -从用户到最终运行的指令,以修改行为或使用非标准功能。 - +* 可用于调试目的的客户端库或工具信息:例如,名称、版本和构建信息。 + +* 用户或者工具/系统的来源信息,例如来自其他生态系统组件的相关对象的 URL。 + +* 轻量级上线工具的元数据信息:例如,配置或检查点。 + +* 负责人员的电话或呼机号码,或指定在何处可以找到该信息的目录条目,如团队网站。 + +* 从用户到最终运行的指令,以修改行为或使用非标准功能。 -您可以将这类信息存储在外部数据库或目录中而不使用注解,但这样做就使得开发人员很难生成用于部署、管理、自检的客户端共享库和工具。 +你可以将这类信息存储在外部数据库或目录中而不使用注解, +但这样做就使得开发人员很难生成用于部署、管理、自检的客户端共享库和工具。 - ## 语法和字符集 -_注解_ 存储的形式是键/值对。有效的注解键分为两部分:可选的前缀和名称,以斜杠(`/`)分隔。 名称段是必需项,并且必须在63个字符以内,以字母数字字符(`[a-z0-9A-Z]`)开头和结尾,并允许使用破折号(`-`),下划线(`_`),点(`.`)和字母数字。 前缀是可选的。 如果指定,则前缀必须是DNS子域:一系列由点(`.`)分隔的DNS标签,总计不超过253个字符,后跟斜杠(`/`)。 -如果省略前缀,则假定注释键对用户是私有的。 由系统组件添加的注释(例如,`kube-scheduler`,`kube-controller-manager`,`kube-apiserver`,`kubectl` 或其他第三方组件),必须为终端用户添加注释前缀。 + +_注解(Annotations)_ 存储的形式是键/值对。有效的注解键分为两部分: +可选的前缀和名称,以斜杠(`/`)分隔。 +名称段是必需项,并且必须在63个字符以内,以字母数字字符(`[a-z0-9A-Z]`)开头和结尾, +并允许使用破折号(`-`),下划线(`_`),点(`.`)和字母数字。 +前缀是可选的。如果指定,则前缀必须是DNS子域:一系列由点(`.`)分隔的DNS标签, +总计不超过253个字符,后跟斜杠(`/`)。 +如果省略前缀,则假定注释键对用户是私有的。 由系统组件添加的注释 +(例如,`kube-scheduler`,`kube-controller-manager`,`kube-apiserver`,`kubectl` +或其他第三方组件),必须为终端用户添加注释前缀。 +`kubernetes.io/` 和 `k8s.io/` 前缀是为Kubernetes核心组件保留的。 -`kubernetes.io /` 和 `k8s.io /` 前缀是为Kubernetes核心组件保留的。 +例如,这是Pod的配置文件,其注释为 `imageregistry: https://hub.docker.com/`: -例如,这是Pod的配置文件,其注释为 `imageregistry:https:// hub.docker.com /` : ```yaml - apiVersion: v1 kind: Pod metadata: @@ -160,15 +147,12 @@ spec: image: nginx:1.7.9 ports: - containerPort: 80 - ``` - - ## {{% heading "whatsnext" %}} -进一步了解[标签和选择器](/docs/concepts/overview/working-with-objects/labels/)。 +* 进一步了解[标签和选择算符](/zh/docs/concepts/overview/working-with-objects/labels/)。 diff --git a/content/zh/docs/concepts/overview/working-with-objects/field-selectors.md b/content/zh/docs/concepts/overview/working-with-objects/field-selectors.md index a7bb9b1794..5184fb0b38 100644 --- a/content/zh/docs/concepts/overview/working-with-objects/field-selectors.md +++ b/content/zh/docs/concepts/overview/working-with-objects/field-selectors.md @@ -3,16 +3,15 @@ title: 字段选择器 weight: 60 --- -_字段选择器_(_Field selectors_)允许您根据一个或多个资源字段的值[筛选 Kubernetes 资源](/docs/concepts/overview/working-with-objects/kubernetes-objects)。 +_字段选择器(Field selectors_)允许你根据一个或多个资源字段的值 +[筛选 Kubernetes 资源](/zh/docs/concepts/overview/working-with-objects/kubernetes-objects)。 下面是一些使用字段选择器查询的例子: * `metadata.name=my-service` @@ -22,18 +21,18 @@ _字段选择器_(_Field selectors_)允许您根据一个或多个资源字 -下面这个 `kubectl` 命令将筛选出 [`status.phase`](/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase) 字段值为 `Running` 的所有 Pod: - +下面这个 `kubectl` 命令将筛选出 [`status.phase`](/zh/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase) +字段值为 `Running` 的所有 Pod: ```shell kubectl get pods --field-selector status.phase=Running ``` - -{{< note >}} -字段选择器本质上是资源*过滤器*。默认情况下,字段选择器/过滤器是未被应用的,这意味着指定类型的所有资源都会被筛选出来。 +{{< note >}} +字段选择器本质上是资源*过滤器(Filters)*。默认情况下,字段选择器/过滤器是未被应用的, +这意味着指定类型的所有资源都会被筛选出来。 这使得以下的两个 `kubectl` 查询是等价的: ```shell @@ -44,30 +43,32 @@ kubectl get pods --field-selector "" -## 支持的字段 - -不同的 Kubernetes 资源类型支持不同的字段选择器。所有资源类型都支持 `metadata.name` 和 `metadata.namespace` 字段。使用不被支持的字段选择器会产生错误,例如: +## 支持的字段 {#supported-fields} + +不同的 Kubernetes 资源类型支持不同的字段选择器。 +所有资源类型都支持 `metadata.name` 和 `metadata.namespace` 字段。 +使用不被支持的字段选择器会产生错误。例如: ```shell kubectl get ingress --field-selector foo.bar=baz ``` + ``` Error from server (BadRequest): Unable to find "ingresses" that match label selector "", field selector "foo.bar=baz": "foo.bar" is not a known field selector: only "metadata.name", "metadata.namespace" ``` -## 支持的运算符 - -您可以使用 `=`、`==`和 `!=` 对字段选择器进行运算(`=` 和 `==` 的意义是相同的)。例如,下面这个 `kubectl` 命令将筛选所有不属于 `default` 命名空间的 Kubernetes Service: +## 支持的操作符 {#supported-operators} + +你可在字段选择器中使用 `=`、`==`和 `!=` (`=` 和 `==` 的意义是相同的)操作符。 +例如,下面这个 `kubectl` 命令将筛选所有不属于 `default` 命名空间的 Kubernetes 服务: ```shell kubectl get services --all-namespaces --field-selector metadata.namespace!=default @@ -75,13 +76,15 @@ kubectl get services --all-namespaces --field-selector metadata.namespace!=defa -## 链式选择器 - -同[标签](/docs/concepts/overview/working-with-objects/labels)和其他选择器一样,字段选择器可以通过使用逗号分隔的列表组成一个选择链。下面这个 `kubectl` 命令将筛选 `status.phase` 字段不等于 `Running` 同时 `spec.restartPolicy` 字段等于 `Always` 的所有 Pod: +## 链式选择器 {#chained-selectors} + +同[标签](/zh/docs/concepts/overview/working-with-objects/labels/)和其他选择器一样, +字段选择器可以通过使用逗号分隔的列表组成一个选择链。 +下面这个 `kubectl` 命令将筛选 `status.phase` 字段不等于 `Running` 同时 +`spec.restartPolicy` 字段等于 `Always` 的所有 Pod: ```shell kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always @@ -89,13 +92,13 @@ kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Alway -## 多种资源类型 - -您能够跨多种资源类型来使用字段选择器。下面这个 `kubectl` 命令将筛选出所有不在 `default` 命名空间中的 StatefulSet 和 Service: +## 多种资源类型 {#multiple-resource-types} + +你能够跨多种资源类型来使用字段选择器。 +下面这个 `kubectl` 命令将筛选出所有不在 `default` 命名空间中的 StatefulSet 和 Service: ```shell kubectl get statefulsets,services --all-namespaces --field-selector metadata.namespace!=default diff --git a/content/zh/docs/concepts/overview/working-with-objects/kubernetes-objects.md b/content/zh/docs/concepts/overview/working-with-objects/kubernetes-objects.md index 408c9c7641..fe47dad14c 100644 --- a/content/zh/docs/concepts/overview/working-with-objects/kubernetes-objects.md +++ b/content/zh/docs/concepts/overview/working-with-objects/kubernetes-objects.md @@ -33,51 +33,82 @@ This page explains how Kubernetes objects are represented in the Kubernetes API, * The resources available to those applications * The policies around how those applications behave, such as restart policies, upgrades, and fault-tolerance --> - ## 理解 Kubernetes 对象 -在 Kubernetes 系统中,*Kubernetes 对象* 是持久化的实体。Kubernetes 使用这些实体去表示整个集群的状态。特别地,它们描述了如下信息: +在 Kubernetes 系统中,*Kubernetes 对象* 是持久化的实体。 +Kubernetes 使用这些实体去表示整个集群的状态。特别地,它们描述了如下信息: -* 哪些容器化应用在运行(以及在哪个 Node 上) +* 哪些容器化应用在运行(以及在哪些节点上) * 可以被应用使用的资源 * 关于应用运行时表现的策略,比如重启策略、升级策略,以及容错策略 +Kubernetes 对象是 “目标性记录” —— 一旦创建对象,Kubernetes 系统将持续工作以确保对象存在。 +通过创建对象,本质上是在告知 Kubernetes 系统,所需要的集群工作负载看起来是什么样子的, +这就是 Kubernetes 集群的 **期望状态(Desired State)**。 -Kubernetes 对象是 “目标性记录” —— 一旦创建对象,Kubernetes 系统将持续工作以确保对象存在。通过创建对象,本质上是在告知 Kubernetes 系统,所需要的集群工作负载看起来是什么样子的,这就是 Kubernetes 集群的 **期望状态(Desired State)**。 - -操作 Kubernetes 对象 —— 无论是创建、修改,或者删除 —— 需要使用 [Kubernetes API](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md)。比如,当使用 `kubectl` 命令行接口时,CLI 会执行必要的 Kubernetes API 调用,也可以在程序中使用 [客户端库](/docs/reference/using-api/client-libraries/) 直接调用 Kubernetes API。 +操作 Kubernetes 对象 —— 无论是创建、修改,或者删除 —— 需要使用 +[Kubernetes API](/zh/docs/concepts/overview/kubernetes-api)。 +比如,当使用 `kubectl` 命令行接口时,CLI 会执行必要的 Kubernetes API 调用, +也可以在程序中使用 +[客户端库](/zh/docs/reference/using-api/client-libraries/)直接调用 Kubernetes API。 +### 对象规约(Spec)与状态(Status) {#object-spec-and-status} -### 对象规约(Spec)与状态(Status) - -每个 Kubernetes 对象包含两个嵌套的对象字段,它们负责管理对象的配置:对象 *spec* 和 对象 *status* 。 -*spec* 是必需的,它描述了对象的 *期望状态(Desired State)* —— 希望对象所具有的特征。 -*status* 描述了对象的 *实际状态(Actual State)* ,它是由 Kubernetes 系统提供和更新的。在任何时刻,Kubernetes 控制面一直努力地管理着对象的实际状态以与期望状态相匹配。 +几乎每个 Kubernetes 对象包含两个嵌套的对象字段,它们负责管理对象的配置: +对象 *`spec`(规约)* 和 对象 *`status`(状态)* 。 +对于具有 `spec` 的对象,你必须在创建对象时设置其内容,描述你希望对象所具有的特征: +*期望状态(Desired State)* 。 +`status` 描述了对象的 _当前状态(Current State)_,它是由 Kubernetes 系统和组件 +设置并更新的。在任何时刻,Kubernetes +{{< glossary_tooltip text="控制面" term_id="control-plane" >}} +都一直积极地管理着对象的实际状态,以使之与期望状态相匹配。 -例如,Kubernetes Deployment 对象能够表示运行在集群中的应用。 -当创建 Deployment 时,可能需要设置 Deployment 的规约,以指定该应用需要有 3 个副本在运行。 -Kubernetes 系统读取 Deployment 规约,并启动我们所期望的该应用的 3 个实例 —— 更新状态以与规约相匹配。 -如果那些实例中有失败的(一种状态变更),Kubernetes 系统通过修正来响应规约和状态之间的不一致 —— 这种情况,会启动一个新的实例来替换。 + +例如,Kubernetes 中的 Deployment 对象能够表示运行在集群中的应用。 +当创建 Deployment 时,可能需要设置 Deployment 的 `spec`,以指定该应用需要有 3 个副本运行。 +Kubernetes 系统读取 Deployment 规约,并启动我们所期望的应用的 3 个实例 +—— 更新状态以与规约相匹配。 +如果这些实例中有的失败了(一种状态变更),Kubernetes 系统通过执行修正操作 +来响应规约和状态间的不一致 —— 在这里意味着它会启动一个新的实例来替换。 -关于对象 spec、status 和 metadata 的更多信息,查看 [Kubernetes API 约定](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md)。 +关于对象 spec、status 和 metadata 的更多信息,可参阅 +[Kubernetes API 约定](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md)。 - ### 描述 Kubernetes 对象 -当创建 Kubernetes 对象时,必须提供对象的规约,用来描述该对象的期望状态,以及关于对象的一些基本信息(例如名称)。 -当使用 Kubernetes API 创建对象时(或者直接创建,或者基于`kubectl`),API 请求必须在请求体中包含 JSON 格式的信息。 +创建 Kubernetes 对象时,必须提供对象的规约,用来描述该对象的期望状态, +以及关于对象的一些基本信息(例如名称)。 +当使用 Kubernetes API 创建对象时(或者直接创建,或者基于`kubectl`), +API 请求必须在请求体中包含 JSON 格式的信息。 **大多数情况下,需要在 .yaml 文件中为 `kubectl` 提供这些信息**。 `kubectl` 在发起 API 请求时,将这些信息转换成 JSON 格式。 @@ -103,8 +135,7 @@ One way to create a Deployment using a `.yaml` file like the one above is to use [`kubectl apply`](/docs/reference/generated/kubectl/kubectl-commands#apply) command in the `kubectl` command-line interface, passing the `.yaml` file as an argument. Here's an example: --> - -使用类似于上面的 `.yaml` 文件来创建 Deployment,一种方式是使用 `kubectl` 命令行接口(CLI)中的 +使用类似于上面的 `.yaml` 文件来创建 Deployment的一种方式是使用 `kubectl` 命令行接口(CLI)中的 [`kubectl apply`](/docs/reference/generated/kubectl/kubectl-commands#apply) 命令, 将 `.yaml` 文件作为参数。下面是一个示例: @@ -115,10 +146,9 @@ kubectl apply -f https://k8s.io/examples/application/deployment.yaml --record - 输出类似如下这样: -```shell +``` deployment.apps/nginx-deployment created ``` @@ -131,14 +161,13 @@ In the `.yaml` file for the Kubernetes object you want to create, you'll need to * `kind` - What kind of object you want to create * `metadata` - Data that helps uniquely identify the object, including a `name` string, `UID`, and optional `namespace` --> - -### 必需字段 +### 必需字段 {#required-fields} 在想要创建的 Kubernetes 对象对应的 `.yaml` 文件中,需要配置如下的字段: * `apiVersion` - 创建该对象所使用的 Kubernetes API 的版本 -* `kind` - 想要创建的对象的类型 -* `metadata` - 帮助识别对象唯一性的数据,包括一个 `name` 字符串、UID 和可选的 `namespace` +* `kind` - 想要创建的对象的类别 +* `metadata` - 帮助唯一性标识对象的一些数据,包括一个 `name` 字符串、UID 和可选的 `namespace` - -您也需要提供对象的 `spec` 字段。对象 `spec` 的精确格式对每个 Kubernetes 对象来说是不同的,包含了特定于该对象的嵌套字段。[Kubernetes API 参考](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/)能够帮助我们找到任何我们想创建的对象的 spec 格式。 +你也需要提供对象的 `spec` 字段。 +对象 `spec` 的精确格式对每个 Kubernetes 对象来说是不同的,包含了特定于该对象的嵌套字段。 +[Kubernetes API 参考](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/) +能够帮助我们找到任何我们想创建的对象的 spec 格式。 例如,可以从 -[这里](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core) +[core/v1 PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core) 查看 `Pod` 的 `spec` 格式, 并且可以从 -[这里](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#deploymentspec-v1-apps) +[apps/v1 DeploymentSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#deploymentspec-v1-apps) 查看 `Deployment` 的 `spec` 格式。 @@ -164,9 +195,7 @@ and the `spec` format for a `Deployment` can be found * Learn about the most important basic Kubernetes objects, such as [Pod](/docs/concepts/workloads/pods/pod-overview/). * Learn about [controllers](/docs/concepts/architecture/controller/) in Kubernetes --> -* [Kubernetes API 概述](/docs/reference/using-api/api-overview/) 提供关于 API 概念的进一步阐述 -* 了解最重要的 Kubernetes 基本对象,例如 [Pod](/docs/concepts/workloads/pods/pod-overview/)。 -* 了解 Kubernetes 中的[控制器](/docs/concepts/architecture/controller/)。 - - +* [Kubernetes API 概述](/zh/docs/reference/using-api/api-overview/) 提供关于 API 概念的进一步阐述 +* 了解最重要的 Kubernetes 基本对象,例如 [Pod](/zh/docs/concepts/workloads/pods/) +* 了解 Kubernetes 中的[控制器](/zh/docs/concepts/architecture/controller/) diff --git a/content/zh/docs/concepts/overview/working-with-objects/labels.md b/content/zh/docs/concepts/overview/working-with-objects/labels.md index 718ad4fc93..941cdaccb2 100644 --- a/content/zh/docs/concepts/overview/working-with-objects/labels.md +++ b/content/zh/docs/concepts/overview/working-with-objects/labels.md @@ -1,26 +1,26 @@ --- -title: 标签和选择器 +title: 标签和选择算符 content_type: concept weight: 40 --- + -_标签_ 是附加到 Kubernetes 对象(比如 Pods)上的键值对。 +_标签(Labels)_ 是附加到 Kubernetes 对象(比如 Pods)上的键值对。 标签旨在用于指定对用户有意义且相关的对象的标识属性,但不直接对核心系统有语义含义。 标签可以用于组织和选择对象的子集。标签可以在创建时附加到对象,随后可以随时添加和修改。 每个对象都可以定义一组键/值标签。每个键对于给定对象必须是唯一的。 @@ -35,116 +35,135 @@ _标签_ 是附加到 Kubernetes 对象(比如 Pods)上的键值对。 ``` - -我们最终将标签索引和反向索引,用于高效查询和监视,使用它们在 UI 和 CLI 中进行排序和分组等。我们不希望将非标识性的、尤其是大型或结构化数据用作标签,给后者带来污染。应使用 [注解](/docs/concepts/overview/working-with-objects/annotations/) 记录非识别信息 - - - +标签能够支持高效的查询和监听操作,对于用户界面和命令行是很理想的。 +应使用[注解](/zh/docs/concepts/overview/working-with-objects/annotations/) 记录非识别信息。 -## 动机 - - +## 动机 + 标签使用户能够以松散耦合的方式将他们自己的组织结构映射到系统对象,而无需客户端存储这些映射。 -服务部署和批处理流水线通常是多维实体(例如,多个分区或部署、多个发行序列、多个层,每层多个微服务)。管理通常需要交叉操作,这打破了严格的层次表示的封装,特别是由基础设施而不是用户确定的严格的层次结构。 - +服务部署和批处理流水线通常是多维实体(例如,多个分区或部署、多个发行序列、多个层,每层多个微服务)。 +管理通常需要交叉操作,这打破了严格的层次表示的封装,特别是由基础设施而不是用户确定的严格的层次结构。 + 示例标签: - * `"release" : "stable"`, `"release" : "canary"` - * `"environment" : "dev"`, `"environment" : "qa"`, `"environment" : "production"` - * `"tier" : "frontend"`, `"tier" : "backend"`, `"tier" : "cache"` - * `"partition" : "customerA"`, `"partition" : "customerB"` - * `"track" : "daily"`, `"track" : "weekly"` +* `"release" : "stable"`, `"release" : "canary"` +* `"environment" : "dev"`, `"environment" : "qa"`, `"environment" : "production"` +* `"tier" : "frontend"`, `"tier" : "backend"`, `"tier" : "cache"` +* `"partition" : "customerA"`, `"partition" : "customerB"` +* `"track" : "daily"`, `"track" : "weekly"` -这些只是常用标签的例子; 您可以任意制定自己的约定。请记住,对于给定对象标签的键必须是唯一的。 +这些只是常用标签的例子; 你可以任意制定自己的约定。请记住,对于给定对象标签的键必须是唯一的。 ## 语法和字符集 +_标签_ 是键值对。有效的标签键有两个段:可选的前缀和名称,用斜杠(`/`)分隔。 +名称段是必需的,必须小于等于 63 个字符,以字母数字字符(`[a-z0-9A-Z]`)开头和结尾, +带有破折号(`-`),下划线(`_`),点( `.`)和之间的字母数字。 +前缀是可选的。如果指定,前缀必须是 DNS 子域:由点(`.`)分隔的一系列 DNS 标签,总共不超过 253 个字符, +后跟斜杠(`/`)。 - -_标签_ 是键值对。有效的标签键有两个段:可选的前缀和名称,用斜杠(`/`)分隔。名称段是必需的,必须小于等于 63 个字符,以字母数字字符(`[a-z0-9A-Z]`)开头和结尾,带有破折号(`-`),下划线(`_`),点( `.`)和之间的字母数字。前缀是可选的。如果指定,前缀必须是 DNS 子域:由点(`.`)分隔的一系列 DNS 标签,总共不超过 253 个字符,后跟斜杠(`/`)。 -如果省略前缀,则假定标签键对用户是私有的。 向最终用户对象添加标签的自动系统组件(例如 `kube-scheduler`,`kube-controller-manager`,`kube-apiserver`,`kubectl` 或其他第三方自动化)必须指定前缀。`kubernetes.io/` 前缀是为 Kubernetes 核心组件保留的。 +如果省略前缀,则假定标签键对用户是私有的。 +向最终用户对象添加标签的自动系统组件(例如 `kube-scheduler`、`kube-controller-manager`、 +`kube-apiserver`、`kubectl` 或其他第三方自动化工具)必须指定前缀。 + +`kubernetes.io/` 前缀是为 Kubernetes 核心组件保留的。 -有效标签值必须为 63 个字符或更少,并且必须为空或以字母数字字符(`[a-z0-9A-Z]`)开头和结尾,中间可以包含破折号(`-`)、下划线(`_`)、点(`.`)和字母或数字。 +有效标签值必须为 63 个字符或更少,并且必须为空或以字母数字字符(`[a-z0-9A-Z]`)开头和结尾, +中间可以包含破折号(`-`)、下划线(`_`)、点(`.`)和字母或数字。 -## 标签选择器 - -与 [名称和 UID](/docs/user-guide/identifiers) 不同,标签不提供唯一性。通常,我们希望许多对象携带相同的标签。 +## 标签选择算符 {#label-selectors} + +与[名称和 UID](/zh/docs/concepts/overview/working-with-objects/names/) 不同, +标签不支持唯一性。通常,我们希望许多对象携带相同的标签。 -通过 _标签选择器_,客户端/用户可以识别一组对象。标签选择器是 Kubernetes 中的核心分组原语。 +通过 _标签选择算符_,客户端/用户可以识别一组对象。标签选择算符是 Kubernetes 中的核心分组原语。 -API 目前支持两种类型的选择器:_基于相等性的_ 和 _基于集合的_。 -标签选择器可以由逗号分隔的多个 _需求_ 组成。在多个需求的情况下,必须满足所有要求,因此逗号分隔符充当逻辑 _与_(`&&`)运算符。 +API 目前支持两种类型的选择算符:_基于等值的_ 和 _基于集合的_。 +标签选择算符可以由逗号分隔的多个 _需求_ 组成。 +在多个需求的情况下,必须满足所有要求,因此逗号分隔符充当逻辑 _与_(`&&`)运算符。 -空标签选择器(即,需求为零的选择器)选择集合中的每个对象。 +空标签选择算符或者未指定的选择算符的语义取决于上下文, +支持使用选择算符的 API 类别应该将算符的合法性和含义用文档记录下来。 -null 值的标签选择器(仅可用于可选选择器字段)不选择任何对象 {{< note >}} - -**注意**:两个控制器的标签选择器不得在命名空间内重叠,否则它们将互相冲突。 +对于某些 API 类别(例如 ReplicaSet)而言,两个实例的标签选择算符不得在命名空间内重叠, +否则它们的控制器将互相冲突,无法确定应该存在的副本个数。 {{< /note >}} -### _基于相等性的_ 需求 - +{{< caution >}} +对于基于等值的和基于集合的条件而言,不存在逻辑或(`||`)操作符。 +你要确保你的过滤语句按合适的方式组织。 +{{< /caution >}} -_基于相等性_ 或 _不相等_ 的需求允许按标签键和值进行过滤。匹配对象必须满足所有指定的标签约束,尽管它们也可能具有其他标签。 -可接受的运算符有`=`、`==` 和 `!=` 三种。 前两个表示 _相等_(并且只是同义词),而后者表示 _不相等_。 例如: +### _基于等值的_ 需求 + +_基于等值_ 或 _基于不等值_ 的需求允许按标签键和值进行过滤。 +匹配对象必须满足所有指定的标签约束,尽管它们也可能具有其他标签。 +可接受的运算符有`=`、`==` 和 `!=` 三种。 +前两个表示 _相等_(并且只是同义词),而后者表示 _不相等_。例如: ``` environment = production @@ -165,7 +184,8 @@ One usage scenario for equality-based label requirement is for Pods to specify node selection criteria. For example, the sample Pod below selects nodes with the label "`accelerator=nvidia-tesla-p100`". --> -基于相等性的标签要求的一种使用场景是 Pods 要指定节点选择标准。例如,下面的示例 Pod 选择带有标签 "`accelerator=nvidia-tesla-p100`"。 +基于等值的标签要求的一种使用场景是 Pod 要指定节点选择标准。 +例如,下面的示例 Pod 选择带有标签 "`accelerator=nvidia-tesla-p100`"。 ```yaml apiVersion: v1 @@ -185,13 +205,13 @@ spec: ### _基于集合_ 的需求 - -_基于集合_ 的标签需求允许您通过一组值来过滤键。支持三种操作符:`in`,`notin` and `exists` (只可以用在键标识符上)。例如: +_基于集合_ 的标签需求允许你通过一组值来过滤键。 +支持三种操作符:`in`、`notin` 和 `exists` (只可以用在键标识符上)。例如: ``` environment in (production, qa) @@ -202,38 +222,24 @@ partition 第一个示例选择了所有键等于 `environment` 并且值等于 `production` 或者 `qa` 的资源。 - - - 第二个示例选择了所有键等于 `tier` 并且值不等于 `frontend` 或者 `backend` 的资源,以及所有没有 `tier` 键标签的资源。 - - - 第三个示例选择了所有包含了有 `partition` 标签的资源;没有校验它的值。 - - - 第四个示例选择了所有没有 `partition` 标签的资源;没有校验它的值。 - - -类似地,逗号分隔符充当 _AND_ 运算符。因此,使用 `partition` 键(无论为何值)和 `environment` 不同于 `qa` 来过滤资源可以使用 `partition,environment notin(qa)` 来实现。 +类似地,逗号分隔符充当 _与_ 运算符。因此,使用 `partition` 键(无论为何值)和 +`environment` 不同于 `qa` 来过滤资源可以使用 `partition, environment notin(qa)` 来实现。 - -_基于集合_ 的标签选择器是相等标签选择器的一般形式,因为 `environment = production` 等同于 `environment in(production)`;`!=` 和 `notin` 也是类似的。 +_基于集合_ 的标签选择算符是相等标签选择算符的一般形式,因为 `environment=production` +等同于 `environment in(production`;`!=` 和 `notin` 也是类似的。 ### LIST 和 WATCH 过滤 - -LIST and WATCH 操作可以使用查询参数指定标签选择器过滤一组对象。两种需求都是允许的。(这里显示的是它们出现在 URL 查询字符串中) +LIST and WATCH 操作可以使用查询参数指定标签选择算符过滤一组对象。 +两种需求都是允许的。(这里显示的是它们出现在 URL 查询字符串中) - * _基于相等性_ 的需求: `?labelSelector=environment%3Dproduction,tier%3Dfrontend` - * _基于集合_ 的需求: `?labelSelector=environment+in+%28production%2Cqa%29%2Ctier+in+%28frontend%29` +* _基于等值_ 的需求: `?labelSelector=environment%3Dproduction,tier%3Dfrontend` +* _基于集合_ 的需求: `?labelSelector=environment+in+%28production%2Cqa%29%2Ctier+in+%28frontend%29` -两种标签选择器都可以通过 REST 客户端用于 list 或者 watch 资源。例如,使用 `kubectl` 定位 `apiserver`,可以使用 _基于相等性_ 的标签选择器可以这么写: +两种标签选择算符都可以通过 REST 客户端用于 list 或者 watch 资源。 +例如,使用 `kubectl` 定位 `apiserver`,可以使用 _基于等值_ 的标签选择算符可以这么写: ```shell -$ kubectl get pods -l environment=production,tier=frontend +kubectl get pods -l environment=production,tier=frontend ``` - + 或者使用 _基于集合的_ 需求: ```shell -$ kubectl get pods -l 'environment in (production),tier in (frontend)' +kubectl get pods -l 'environment in (production),tier in (frontend)' ``` + 或者通过 _exists_ 运算符限制不匹配: ```shell -$ kubectl get pods -l 'environment,environment notin (frontend)' +kubectl get pods -l 'environment,environment notin (frontend)' ``` ### 在 API 对象上设置引用 -一些 Kubernetes 对象,例如 [`services`](/docs/user-guide/services) 和 [`replicationcontrollers`](/docs/user-guide/replication-controller) ,也使用了标签选择器去指定了其他资源的集合,例如 [pods](/docs/user-guide/pods)。 +一些 Kubernetes 对象,例如 [`services`](/zh/docs/concepts/services-networking/service/) +和 [`replicationcontrollers`](/zh/docs/concepts/workloads/controllers/replicationcontroller/) , +也使用了标签选择算符去指定了其他资源的集合,例如 +[pods](/zh/docs/concepts/workloads/pods/)。 #### Service 和 ReplicationController -一个 `Service` 指向的一组 pods 是由标签选择器定义的。同样,一个 `ReplicationController` 应该管理的 pods 的数量也是由标签选择器定义的。 +一个 `Service` 指向的一组 pods 是由标签选择算符定义的。同样,一个 `ReplicationController` 应该管理的 pods 的数量也是由标签选择算符定义的。 -两个对象的标签选择器都是在 `json` 或者 `yaml` 文件中使用映射定义的,并且只支持 _基于相等性_ 需求的选择器: +两个对象的标签选择算符都是在 `json` 或者 `yaml` 文件中使用映射定义的,并且只支持 _基于等值_ 需求的选择算符: ```json "selector": { @@ -324,9 +333,7 @@ Labels selectors for both objects are defined in `json` or `yaml` files using ma } ``` - + 或者 ```yaml @@ -337,7 +344,7 @@ selector: -这个选择器(分别在 `json` 或者 `yaml` 格式中) 等价于 `component=redis` 或 `component in (redis)` 。 +这个选择算符(分别在 `json` 或者 `yaml` 格式中) 等价于 `component=redis` 或 `component in (redis)` 。 #### 支持基于集合需求的资源 -比较新的资源,例如 [`Job`](/docs/concepts/jobs/run-to-completion-finite-workloads/)、[`Deployment`](/docs/concepts/workloads/controllers/deployment/)、[`Replica Set`](/docs/concepts/workloads/controllers/replicaset/) 和[`Daemon Set`](/docs/concepts/workloads/controllers/daemonset/) ,也支持 _基于集合的_ 需求。 +比较新的资源,例如 [`Job`](/zh/docs/concepts/workloads/controllers/job/)、 +[`Deployment`](/zh/docs/concepts/workloads/controllers/deployment/)、 +[`Replica Set`](/zh/docs/concepts/workloads/controllers/replicaset/) 和 +[`DaemonSet`](/zh/docs/concepts/workloads/controllers/daemonset/) , +也支持 _基于集合的_ 需求。 ```yaml selector: @@ -358,21 +369,26 @@ selector: ``` -`matchLabels` 是由 `{key,value}` 对组成的映射。`matchLabels` 映射中的单个 `{key,value }` 等同于 `matchExpressions` 的元素,其 `key`字段为 "key",`operator` 为 "In",而 `values` 数组仅包含 "value"。`matchExpressions` 是 pod 选择器要求的列表。有效的运算符包括 In,NotIn,Exists 和 DoesNotExist。在 In 和 NotIn 的情况下,设置的值必须是非空的。来自 `matchLabels` 和 `matchExpressions` 的所有要求都是合在一起 -- 它们必须都满足才能匹配。 +`matchLabels` 是由 `{key,value}` 对组成的映射。 +`matchLabels` 映射中的单个 `{key,value }` 等同于 `matchExpressions` 的元素, +其 `key` 字段为 "key",`operator` 为 "In",而 `values` 数组仅包含 "value"。 +`matchExpressions` 是 Pod 选择算符需求的列表。 +有效的运算符包括 `In`、`NotIn`、`Exists` 和 `DoesNotExist`。 +在 `In` 和 `NotIn` 的情况下,设置的值必须是非空的。 +来自 `matchLabels` 和 `matchExpressions` 的所有要求都按逻辑与的关系组合到一起 +-- 它们必须都满足才能匹配。 -#### 选择节点集 - -通过标签进行选择的一个用例是确定节点集,方便 pod 调度。 -有关更多信息,请参阅 [选择节点](/docs/concepts/configuration/assign-pod-node/) 上的文档。 +#### 选择节点集 +通过标签进行选择的一个用例是确定节点集,方便 Pod 调度。 +有关更多信息,请参阅[选择节点](/zh/docs/concepts/scheduling-eviction/assign-pod-node/)文档。 diff --git a/content/zh/docs/concepts/overview/working-with-objects/names.md b/content/zh/docs/concepts/overview/working-with-objects/names.md index e7b7da5afd..303a7e541d 100644 --- a/content/zh/docs/concepts/overview/working-with-objects/names.md +++ b/content/zh/docs/concepts/overview/working-with-objects/names.md @@ -1,5 +1,5 @@ --- -title: 对象名称和IDs +title: 对象名称和 IDs content_type: concept weight: 20 --- @@ -13,46 +13,32 @@ Every Kubernetes object also has a [_UID_](#uids) that is unique across your who For example, you can only have one Pod named `myapp-1234` within the same [namespace](/docs/concepts/overview/working-with-objects/namespaces/), but you can have one Pod and one Deployment that are each named `myapp-1234`. --> -集群中的每一个对象都一个[_名称_](#名称) 来标识在同类资源中的唯一性。 +集群中的每一个对象都一个[_名称_](#names) 来标识在同类资源中的唯一性。 每个 Kubernetes 对象也有一个[_UID_](#uids) 来标识在整个集群中的唯一性。 -比如,在同一个[namespace](/docs/concepts/overview/working-with-objects/namespaces/)中只能命名一个名为 `myapp-1234` 的 Pod, 但是可以命名一个 Pod 和一个 Deployment 同为 `myapp-1234`. +比如,在同一个[名字空间](/zh/docs/concepts/overview/working-with-objects/namespaces/) +中有一个名为 `myapp-1234` 的 Pod, 但是可以命名一个 Pod 和一个 Deployment 同为 `myapp-1234`. - -对于非唯一的用户提供的属性,Kubernetes 提供了[标签](/docs/user-guide/labels)和[注释](/docs/concepts/overview/working-with-objects/annotations/)。 - -有关名称和 UID 的精确语法规则,请参见[标识符设计文档](https://git.k8s.io/community/contributors/design-proposals/architecture/identifiers.md)。 - - - +对于用户提供的非唯一性的属性,Kubernetes 提供了 +[标签(Labels)](/zh/docs/concepts/working-with-objects/labels)和 +[注解(Annotation)](/zh/docs/concepts/overview/working-with-objects/annotations/)机制。 - -## 名称 +## 名称 {#names} {{< glossary_definition term_id="name" length="all" >}} - 以下是比较常见的三种资源命名约束。 -### DNS 子域名 +### DNS 子域名 {#dns-subdomain-names} -某些资源类型需要一个 name 来作为一个 DNS 子域名,见定义 [RFC 1123](https://tools.ietf.org/html/rfc1123)。也就是命名必须满足如下规则: +很多资源类型需要可以用作 DNS 子域名的名称。 +DNS 子域名的定义可参见 [RFC 1123](https://tools.ietf.org/html/rfc1123)。 +这一要求意味着名称必须满足如下规则: - 不能超过253个字符 - 只能包含字母数字,以及'-' 和 '.' @@ -89,10 +77,10 @@ This means the name must: - start with an alphanumeric character - end with an alphanumeric character --> +### DNS 标签名 {#dns-label-names} -### DNS 标签名称 - -某些资源类型需要其名称遵循 DNS 标签的标准,见[RFC 1123](https://tools.ietf.org/html/rfc1123)。也就是命名必须满足如下规则: +某些资源类型需要其名称遵循 [RFC 1123](https://tools.ietf.org/html/rfc1123) +所定义的 DNS 标签标准。也就是命名必须满足如下规则: - 最多63个字符 - 只能包含字母数字,以及'-' @@ -100,19 +88,20 @@ This means the name must: - 须以字母数字结尾 +### 路径分段名称 {#path-segment-names} -### Path 部分名称 - -一些用与 Path 部分的资源类型要求名称能被安全的 encode。换句话说,其名称不能含有这些字符 "."、".."、"/"或"%"。 +某些资源类型要求名称能被安全地用作路径中的片段。 +换句话说,其名称不能是 `.`、`..`,也不可以包含 `/` 或 `%` 这些字符。 - 下面是一个名为`nginx-demo`的 Pod 的配置清单: ```yaml @@ -127,16 +116,14 @@ spec: ports: - containerPort: 80 ``` -{{< note >}} + - -某些资源类型可能有其相应的附加命名约束。 - +{{< note >}} +某些资源类型可能具有额外的命名约束。 {{< /note >}} - ## UIDs {{< glossary_definition term_id="uid" length="all" >}} @@ -145,18 +132,16 @@ Some resource types have additional restrictions on their names. Kubernetes UIDs are universally unique identifiers (also known as UUIDs). UUIDs are standardized as ISO/IEC 9834-8 and as ITU-T X.667. --> -Kubernetes UIDs 是通用的唯一标识符 (也叫 UUIDs). +Kubernetes UIDs 是全局唯一标识符(也叫 UUIDs)。 UUIDs 是标准化的,见 ISO/IEC 9834-8 和 ITU-T X.667. - - ## {{% heading "whatsnext" %}} -* 阅读关于 Kubernetes [labels](/docs/concepts/overview/working-with-objects/labels/)。 -* 更多参见 [Kubernetes 标识符和名称设计文档](https://git.k8s.io/community/contributors/design-proposals/architecture/identifiers.md). +* 进一步了解 Kubernetes [标签](/zh/docs/concepts/overview/working-with-objects/labels/) +* 参阅 [Kubernetes 标识符和名称](https://git.k8s.io/community/contributors/design-proposals/architecture/identifiers.md)的设计文档 diff --git a/content/zh/docs/concepts/overview/working-with-objects/namespaces.md b/content/zh/docs/concepts/overview/working-with-objects/namespaces.md index a0b7b773dc..e40ff89abf 100644 --- a/content/zh/docs/concepts/overview/working-with-objects/namespaces.md +++ b/content/zh/docs/concepts/overview/working-with-objects/namespaces.md @@ -1,10 +1,9 @@ --- -title: 命名空间 +title: 名字空间 content_type: concept weight: 30 --- @@ -22,16 +20,14 @@ Kubernetes supports multiple virtual clusters backed by the same physical cluste These virtual clusters are called namespaces. --> Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 -这些虚拟集群被称为命名空间。 - - +这些虚拟集群被称为名字空间。 -## 何时使用多个命名空间 +## 何时使用多个名字空间 -命名空间适用于存在很多跨多个团队或项目的用户的场景。对于只有几到几十个用户的集群,根本不需要创建或考虑命名空间。当需要名称空间提供的功能时,请开始使用它们。 +名字空间适用于存在很多跨多个团队或项目的用户的场景。对于只有几到几十个用户的集群,根本不需要创建或考虑名字空间。当需要名称空间提供的功能时,请开始使用它们。 -命名空间为名称提供了一个范围。资源的名称需要在命名空间内是唯一的,但不能跨命名空间。命名空间不能相互嵌套,每个 Kubernetes 资源只能在一个命名空间中。 +名字空间为名称提供了一个范围。资源的名称需要在名字空间内是唯一的,但不能跨名字空间。 +名字空间不能相互嵌套,每个 Kubernetes 资源只能在一个名字空间中。 -命名空间是在多个用户之间划分集群资源的一种方法(通过[资源配额](/docs/concepts/policy/resource-quotas/))。 - -在 Kubernetes 未来版本中,相同命名空间中的对象默认将具有相同的访问控制策略。 +名字空间是在多个用户之间划分集群资源的一种方法(通过[资源配额](/zh/docs/concepts/policy/resource-quotas/))。 +在 Kubernetes 未来版本中,相同名字空间中的对象默认将具有相同的访问控制策略。 -不需要使用多个命名空间来分隔轻微不同的资源,例如同一软件的不同版本:使用 [labels](/docs/user-guide/labels) 来区分同一命名空间中的不同资源。 +不需要使用多个名字空间来分隔轻微不同的资源,例如同一软件的不同版本: +使用[标签](/zh/docs/concepts/overview/working-with-objects/labels)来区分同一名字空间中的不同资源。 -## 使用命名空间 - -命名空间的创建和删除已在[命名空间的管理指南文档](/docs/admin/namespaces)中进行了描述。 +## 使用名字空间 + +名字空间的创建和删除在[名字空间的管理指南文档](/zh/docs/tasks/administer-cluster/namespaces/)描述。 {{< note >}} -避免使用前缀 `kube-` 创建命名空间,因为它是为 Kubernetes 系统命名空间保留的。 +避免使用前缀 `kube-` 创建名字空间,因为它是为 Kubernetes 系统名字空间保留的。 {{< /note >}} -### 查看命名空间 - -您可以使用以下命令列出集群中现存的命名空间: +### 查看名字空间 + +你可以使用以下命令列出集群中现存的名字空间: ```shell kubectl get namespace @@ -100,74 +95,72 @@ kubectl get namespace ``` NAME STATUS AGE default Active 1d +kube-node-lease Active 1d kube-system Active 1d kube-public Active 1d ``` -Kubernetes 会创建三个初始命名空间: +Kubernetes starts with four initial namespaces: - - * `default` 没有指明使用其它命名空间的对象所使用的默认命名空间 - - * `kube-system` Kubernetes 系统创建对象所使用的命名空间 - - * `kube-public` 这个命名空间是自动创建的,所有用户(包括未经过身份验证的用户)都可以读取它。这个命名空间主要用于集群使用,以防某些资源在整个集群中应该是可见和可读的。这个命名空间的公共方面只是一种约定,而不是要求。 +* `default` The default namespace for objects with no other namespace +* `kube-system` The namespace for objects created by the Kubernetes system +* `kube-public` This namespace is created automatically and is readable by all users (including those not authenticated). This namespace is mostly reserved for cluster usage, in case that some resources should be visible and readable publicly throughout the whole cluster. The public aspect of this namespace is only a convention, not a requirement. +* `kube-node-lease` This namespace for the lease objects associated with each node which improves the performance of the node heartbeats as the cluster scales. +--> +Kubernetes 会创建三个初始名字空间: + +* `default` 没有指明使用其它名字空间的对象所使用的默认名字空间 +* `kube-system` Kubernetes 系统创建对象所使用的名字空间 +* `kube-public` 这个名字空间是自动创建的,所有用户(包括未经过身份验证的用户)都可以读取它。 + 这个名字空间主要用于集群使用,以防某些资源在整个集群中应该是可见和可读的。 + 这个名字空间的公共方面只是一种约定,而不是要求。 +* `kube-node-lease` 此名字空间用于与哥哥节点相关的租期(Lease)对象; + 此对象的设计使得集群规模很大时节点心跳检测性能得到提升。 -### 为请求设置命名空间 - -要为当前请求设置命名空间,请使用 `--namespace` 参数。 +To set the namespace for a current request, use the `-namespace` flag. - +### 为请求设置名字空间 + +要为当前请求设置名字空间,请使用 `--namespace` 参数。 + 例如: ```shell -kubectl run nginx --image=nginx --namespace= -kubectl get pods --namespace= +kubectl run nginx --image=nginx --namespace=<名字空间名称> +kubectl get pods --namespace=<名字空间名称> ``` -### 设置命名空间首选项 - -您可以永久保存该上下文中所有后续 kubectl 命令使用的命名空间。 +### 设置名字空间偏好 + +你可以永久保存名字空间,以用于对应上下文中所有后续 kubectl 命令。 ```shell -kubectl config set-context --current --namespace= -# Validate it +kubectl config set-context --current --namespace=<名字空间名称> +# 验证之 kubectl config view | grep namespace: ``` -## 命名空间和 DNS - -当您创建一个 [Service](/docs/user-guide/services) 时,Kubernetes 会创建一个相应的 [DNS 条目](/docs/concepts/services-networking/dns-pod-service/)。 +## 名字空间和 DNS + +当你创建一个[服务](/zh/docs/concepts/services-networking/service/) 时, +Kubernetes 会创建一个相应的 [DNS 条目](/zh/docs/concepts/services-networking/dns-pod-service/)。 -该条目的形式是 `..svc.cluster.local`,这意味着如果容器只使用 ``,它将被解析到本地命名空间的服务。这对于跨多个命名空间(如开发、分级和生产)使用相同的配置非常有用。如果您希望跨命名空间访问,则需要使用完全限定域名(FQDN)。 +该条目的形式是 `<服务名称>.<名字空间名称>.svc.cluster.local`,这意味着如果容器只使用 +`<服务名称>`,它将被解析到本地名字空间的服务。这对于跨多个名字空间(如开发、分级和生产) +使用相同的配置非常有用。如果你希望跨名字空间访问,则需要使用完全限定域名(FQDN)。 -## 并非所有对象都在命名空间中 +## 并非所有对象都在名字空间中 -大多数 kubernetes 资源(例如 Pod、Service、副本控制器等)都位于某些命名空间中。但是命名空间资源本身并不在命名空间中。而且底层资源,例如 [nodes](/docs/admin/node) 和持久化卷不属于任何命名空间。 +大多数 kubernetes 资源(例如 Pod、Service、副本控制器等)都位于某些名字空间中。 +但是名字空间资源本身并不在名字空间中。而且底层资源,例如 +[节点](/zh/docs/concepts/architecture/nodes/) 和持久化卷不属于任何名字空间。 -查看哪些 Kubernetes 资源在命名空间中,哪些不在命名空间中: +查看哪些 Kubernetes 资源在名字空间中,哪些不在名字空间中: ```shell -# In a namespace +# 位于名字空间中的资源 kubectl api-resources --namespaced=true -# Not in a namespace +# 不在名字空间中的资源 kubectl api-resources --namespaced=false ``` - - ## {{% heading "whatsnext" %}} -* 进一步了解[建立新的命名空间](/docs/tasks/administer-cluster/namespaces/#creating-a-new-namespace)。 -* 进一步了解[删除命名空间](/docs/tasks/administer-cluster/namespaces/#deleting-a-namespace)。 - - +* 进一步了解[建立新的名字空间](/zh/docs/tasks/administer-cluster/namespaces/#creating-a-new-namespace)。 +* 进一步了解[删除名字空间](/zh/docs/tasks/administer-cluster/namespaces/#deleting-a-namespace)。 diff --git a/content/zh/docs/concepts/policy/limit-range.md b/content/zh/docs/concepts/policy/limit-range.md index 34d97b3995..8412d9e80c 100644 --- a/content/zh/docs/concepts/policy/limit-range.md +++ b/content/zh/docs/concepts/policy/limit-range.md @@ -7,17 +7,15 @@ weight: 10 - -默认情况下, Kubernetes 集群上的容器运行使用的[计算资源](/docs/user-guide/compute-resources) 没有限制。 -使用资源配额,集群管理员可以以命名空间为单位,限制其资源的使用与创建。 -在命名空间中,一个 Pod 或 Container 最多能够使用命名空间的资源配额所定义的 CPU 和内存用量。有人担心,一个 Pod 或 Container 会垄断所有可用的资源。LimitRange 是在命名空间内限制资源分配(给多个 Pod 或 Container)的策略对象。 - - - +默认情况下, Kubernetes 集群上的容器运行使用的[计算资源](/zh/docs/concepts/configuration/manage-resources-containers/)没有限制。 +使用资源配额,集群管理员可以以{{< glossary_tooltip text="名字空间" term_id="namespace" >}}为单位,限制其资源的使用与创建。 +在命名空间中,一个 Pod 或 Container 最多能够使用命名空间的资源配额所定义的 CPU 和内存用量。 +有人担心,一个 Pod 或 Container 会垄断所有可用的资源。 +LimitRange 是在命名空间内限制资源分配(给多个 Pod 或 Container)的策略对象。 @@ -30,7 +28,7 @@ A _LimitRange_ provides constraints that can: - Set default request/limit for compute resources in a namespace and automatically inject them to Containers at runtime. --> -一个 _LimitRange_ 对象提供的限制能够做到: +一个 _LimitRange(限制范围)_ 对象提供的限制能够做到: - 在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制。 - 在一个命名空间中实施对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限制。 @@ -39,39 +37,27 @@ A _LimitRange_ provides constraints that can: +LimitRange support has been enabled by default since Kubernetes 1.10. + +LimitRange support is enabled by default for many Kubernetes distributions. +--> ## 启用 LimitRange - +对 LimitRange 的支持自 Kubernetes 1.10 版本默认启用。 -对 LimitRange 的支持默认在多数 Kubernetes 发行版中启用。当 apiserver 的 `--enable-admission-plugins` 标志的参数包含 `LimitRanger` 准入控制器时即启用。 - - - -当一个命名空间中有 LimitRange 时,实施该 LimitRange 所定义的限制。 +LimitRange 支持在很多 Kubernetes 发行版本中也是默认启用的。 - -LimitRange 的名称必须是合法的 [DNS 子域名](/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)。 +LimitRange 的名称必须是合法的 +[DNS 子域名](/zh/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)。 -### 限制范围总览 - - +### 限制范围总览 - 管理员在一个命名空间内创建一个 `LimitRange` 对象。 - 用户在命名空间内创建 Pod ,Container 和 PersistentVolumeClaim 等资源。 -- `LimitRanger` 准入控制器对所有没有设置计算资源需求的 Pod 和 Container 设置默认值与限制值,并跟踪其使用量以保证没有超出命名空间中存在的任意 LimitRange 对象中的最小、最大资源使用量以及使用量比值。 -- 若创建或更新资源(Pod, Container, PersistentVolumeClaim)违反了 LimitRange 的约束,向 API 服务器的请求会失败,并返回 HTTP 状态码 `403 FORBIDDEN` 与描述哪一项约束被违反的消息。 -- 若命名空间中的 LimitRange 启用了对 `cpu` 和 `memory` 的限制,用户必须指定这些值的需求使用量与限制使用量。否则,系统将会拒绝创建 Pod。 +- `LimitRanger` 准入控制器对所有没有设置计算资源需求的 Pod 和 Container 设置默认值与限制值, + 并跟踪其使用量以保证没有超出命名空间中存在的任意 LimitRange 对象中的最小、最大资源使用量以及使用量比值。 +- 若创建或更新资源(Pod、 Container、PersistentVolumeClaim)违反了 LimitRange 的约束, + 向 API 服务器的请求会失败,并返回 HTTP 状态码 `403 FORBIDDEN` 与描述哪一项约束被违反的消息。 +- 若命名空间中的 LimitRange 启用了对 `cpu` 和 `memory` 的限制, + 用户必须指定这些值的需求使用量与限制使用量。否则,系统将会拒绝创建 Pod。 - LimitRange 的验证仅在 Pod 准入阶段进行,不对正在运行的 Pod 进行验证。 +能够使用限制范围创建的策略示例有: -能够使用限制范围创建策略的例子有: - -- 在一个有两个节点,8 GiB 内存与16个核的集群中,限制一个命名空间的 Pod 申请 100m 单位,最大 500m 单位的 CPU,以及申请 200Mi,最大 600Mi 的内存。 -- 为 spec 中没有 cpu 和内存需求值的 Container 定义默认 CPU 限制值与需求值 150m,内存默认需求值 300Mi。 +- 在一个有两个节点,8 GiB 内存与16个核的集群中,限制一个命名空间的 Pod 申请 + 100m 单位,最大 500m 单位的 CPU,以及申请 200Mi,最大 600Mi 的内存。 +- 为 spec 中没有 cpu 和内存需求值的 Container 定义默认 CPU 限制值与需求值 + 150m,内存默认需求值 300Mi。 - -在命名空间的总限制值小于 Pod 或 Container 的限制值的总和的情况下,可能会产生资源竞争。在这种情况下,将不会创建 Container 或 Pod。 +在命名空间的总限制值小于 Pod 或 Container 的限制值的总和的情况下,可能会产生资源竞争。 +在这种情况下,将不会创建 Container 或 Pod。 - 竞争和对 LimitRange 的改变都不会影响任何已经创建了的资源。 +## {{% heading "whatsnext" %}} + - -## 示例 +参阅 [LimitRanger 设计文档](https://git.k8s.io/community/contributors/design-proposals/resource-management/admission_control_limit_range.md)获取更多信息。 +关于使用限值的例子,可参看 -- 查看[如何配置每个命名空间最小和最大的 CPU 约束](/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/)。 -- 查看[如何配置每个命名空间最小和最大的内存约束](/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/)。 -- 查看[如何配置每个命名空间默认的 CPU 申请值和限制值](/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/)。 -- 查看[如何配置每个命名空间默认的内存申请值和限制值](/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/)。 -- 查看[如何配置每个命名空间最小和最大存储使用量](/docs/tasks/administer-cluster/limit-storage-consumption/#limitrange-to-limit-requests-for-storage)。 -- 查看[配置每个命名空间的配额的详细例子](/docs/tasks/administer-cluster/quota-memory-cpu-namespace/)。 - - - -## {{% heading "whatsnext" %}} - - - - -查看 [LimitRanger 设计文档](https://git.k8s.io/community/contributors/design-proposals/resource-management/admission_control_limit_range.md)获取更多信息。 - +- [如何配置每个命名空间最小和最大的 CPU 约束](/zh/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/)。 +- [如何配置每个命名空间最小和最大的内存约束](/zh/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/)。 +- [如何配置每个命名空间默认的 CPU 申请值和限制值](/zh/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/)。 +- [如何配置每个命名空间默认的内存申请值和限制值](/zh/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/)。 +- [如何配置每个命名空间最小和最大存储使用量](/zh/docs/tasks/administer-cluster/limit-storage-consumption/#limitrange-to-limit-requests-for-storage)。 +- [配置每个命名空间的配额的详细例子](/zh/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/)。 diff --git a/content/zh/docs/concepts/policy/pod-security-policy.md b/content/zh/docs/concepts/policy/pod-security-policy.md index 1573ff7af2..3c24f027b0 100644 --- a/content/zh/docs/concepts/policy/pod-security-policy.md +++ b/content/zh/docs/concepts/policy/pod-security-policy.md @@ -1,43 +1,81 @@ --- -approvers: -- pweil- title: Pod 安全策略 +content_type: concept +weight: 20 --- + +{{< feature-state state="beta" >}} -`PodSecurityPolicy` 类型的对象能够控制,是否可以向 Pod 发送请求,该 Pod 能够影响被应用到 Pod 和容器的 `SecurityContext`。 -查看 [Pod 安全策略建议](https://git.k8s.io/community/contributors/design-proposals/security-context-constraints.md) 获取更多信息。 - -{{< toc >}} - + +Pod 安全策略使得对 Pod 创建和更新进行细粒度的权限控制成为可能。 + ## 什么是 Pod 安全策略? -_Pod 安全策略_ 是集群级别的资源,它能够控制 Pod 运行的行为,以及它具有访问什么的能力。 -`PodSecurityPolicy` 对象定义了一组条件,指示 Pod 必须按系统所能接受的顺序运行。 -它们允许管理员控制如下方面: - - - -| 控制面 | 字段名称 | -| ------------------------------------------------------------- | --------------------------------- | -| 已授权容器的运行 | `privileged` | -| 为容器添加默认的一组能力 | `defaultAddCapabilities` | -| 为容器去掉某些能力 | `requiredDropCapabilities` | -| 容器能够请求添加某些能力 | `allowedCapabilities` | -| 控制卷类型的使用 | [`volumes`](#controlling-volumes) | -| 主机网络的使用 | [`hostNetwork`](#host-network) | -| 主机端口的使用 | `hostPorts` | -| 主机 PID namespace 的使用 | `hostPID` | -| 主机 IPC namespace 的使用 | `hostIPC` | -| 主机路径的使用 | [`allowedHostPaths`](#allowed-host-paths) | -| 容器的 SELinux 上下文 | [`seLinux`](#selinux) | -| 用户 ID | [`runAsUser`](#runasuser) | -| 配置允许的补充组 | [`supplementalGroups`](#supplementalgroups) | -| 分配拥有 Pod 数据卷的 FSGroup | [`fsGroup`](#fsgroup) | -| 必须使用一个只读的 root 文件系统 | `readOnlyRootFilesystem` | +_Pod 安全策略(Pod Security Policy)_ 是集群级别的资源,它能够控制 Pod 规约 +中与安全性相关的各个方面。 +[PodSecurityPolicy](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podsecuritypolicy-v1beta1-policy) +对象定义了一组 Pod 运行时必须遵循的条件及相关字段的默认值,只有 Pod 满足这些条件 +才会被系统接受。 +Pod 安全策略允许管理员控制如下方面: + +| 控制的角度 | 字段名称 | +| ----------------------------------- | --------------------------------- | +| 运行特权容器 | [`privileged`](#privileged) | +| 使用宿主名字空间 | [`hostPID`、`hostIPC`](#host-namespaces) | +| 使用宿主的网络和端口 | [`hostNetwork`, `hostPorts`](#host-namespaces) | +| 控制卷类型的使用 | [`volumes`](#volumes-and-file-systems) | +| 使用宿主文件系统 | [`allowedHostPaths`](#volumes-and-file-systems) | +| 允许使用特定的 FlexVolume 驱动 | [`allowedFlexVolumes`](#flexvolume-drivers) | +| 分配拥有 Pod 卷的 FSGroup 账号 | [`fsGroup`](#volumes-and-file-systems) | +| 以只读方式访问根文件系统 | [`readOnlyRootFilesystem`](#volumes-and-file-systems) | +| 设置容器的用户和组 ID | [`runAsUser`, `runAsGroup`, `supplementalGroups`](#users-and-groups) | +| 限制 roo 账号特权级提升 | [`allowPrivilegeEscalation`, `defaultAllowPrivilegeEscalation`](#privilege-escalation) | +| Linux 权能字(Capabilities) | [`defaultAddCapabilities`, `requiredDropCapabilities`, `allowedCapabilities`](#capabilities) | +| 设置容器的 SELinux 上下文 | [`seLinux`](#selinux) | +| 指定容器可以挂载的 proc 类型 | [`allowedProcMountTypes`](#allowedprocmounttypes) | +| 指定容器使用的 AppArmor 模版 | [annotations](#apparmor) | +| 指定容器使用的 seccomp 模版 | [annotations](#seccomp) | +| 指定容器使用的 sysctl 模版 | [`forbiddenSysctls`,`allowedUnsafeSysctls`](#sysctl) | _Pod 安全策略_ 由设置和策略组成,它们能够控制 Pod 访问的安全特征。这些设置分为如下三类: @@ -46,180 +84,1142 @@ _Pod 安全策略_ 由设置和策略组成,它们能够控制 Pod 访问的 - *基于被允许的值集合控制* :这种类型的字段会与这组值进行对比,以确认值被允许。 - *基于策略控制* :设置项通过一种策略提供的机制来生成该值,这种机制能够确保指定的值落在被允许的这组值中。 + +## 启用 Pod 安全策略 -### RunAsUser +Pod 安全策略实现为一种可选(但是建议启用)的 +[准入控制器](/zh/docs/reference/access-authn-authz/admission-controllers/#podsecuritypolicy)。 +[启用了准入控制器](/zh/docs/reference/access-authn-authz/admission-controllers/#how-do-i-turn-on-an-admission-control-plug-in) +即可强制实施 Pod 安全策略,不过如果没有授权认可策略之前即启用 +准入控制器 **将导致集群中无法创建任何 Pod**。 + +由于 Pod 安全策略 API(`policy/v1beta1/podsecuritypolicy`)是独立于准入控制器 +来启用的,对于现有集群而言,建议在启用准入控制器之前先添加策略并对其授权。 + +## 授权策略 {#authorizing-policies} +PodSecurityPolicy 资源被创建时,并不执行任何操作。为了使用该资源,需要对 +发出请求的用户或者目标 Pod 的 +[服务账号](/zh/docs/tasks/configure-pod-container/configure-service-account/) +授权,通过允许其对策略执行 `use` 动词允许其使用该策略。 + +大多数 Kubernetes Pod 不是由用户直接创建的。相反,这些 Pod 是由 +[Deployment](/zh/docs/concepts/workloads/controllers/deployment/)、 +[ReplicaSet](/zh/docs/concepts/workloads/controllers/replicaset/) +或者经由控制器管理器模版化的控制器创建。 +赋予控制器访问策略的权限意味着对应控制器所创建的 *所有* Pod 都可访问策略。 +因此,对策略进行授权的优先方案是为 Pod 的服务账号授予访问权限 +(参见[示例](#run-another-pod))。 -### SELinux + +### 通过 RBAC 授权 {#via-rbac} -### SupplementalGroups +[RBAC](/zh/docs/reference/access-authn-authz/rbac/) 是一种标准的 Kubernetes +鉴权模式,可以很容易地用来授权策略访问。 -- *MustRunAs* - 至少需要指定一个范围。默认使用第一个范围的最小值。验证所有范围的值。 -- *RunAsAny* - 没有提供默认值。允许任意指定的 `supplementalGroups` ID。 +首先,某 `Role` 或 `ClusterRole` 需要获得使用 `use` 访问目标策略的权限。 +访问授权的规则看起来像这样: +```yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: +rules: +- apiGroups: ['policy'] + resources: ['podsecuritypolicies'] + verbs: ['use'] + resourceNames: + - <要授权的策略列表> +``` + +接下来将该 `Role`(或 `ClusterRole`)绑定到授权的用户: -- *MustRunAs* - 至少需要指定一个范围。默认使用第一个范围的最小值。验证在第一个范围内的第一个 ID。 -- *RunAsAny* - 没有提供默认值。允许任意指定的 `fsGroup` ID。 +```yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: <绑定名称> +roleRef: + kind: ClusterRole + name: <角色名称> + apiGroup: rbac.authorization.k8s.io +subjects: +# 授权特定的服务账号 +- kind: ServiceAccount + name: <要授权的服务账号名称> + namespace: +# 授权特定的用户(不建议这样操作) +- kind: User + apiGroup: rbac.authorization.k8s.io + name: <要授权的用户名> +``` + +如果使用的是 `RoleBinding`(而不是 `ClusterRoleBinding`),授权仅限于 +与该 `RoleBinding` 处于同一名字空间中的 Pods。 +可以考虑将这种授权模式和系统组结合,对名字空间中的所有 Pod 授予访问权限。 +```yaml +# 授权该某名字空间中所有服务账号 +- kind: Group + apiGroup: rbac.authorization.k8s.io + name: system:serviceaccounts +# 或者与之等价,授权给某名字空间中所有被认证过的用户 +- kind: Group + apiGroup: rbac.authorization.k8s.io + name: system:authenticated +``` -### 控制卷 + +参阅[角色绑定示例](/zh/docs/reference/access-authn-authz/rbac#role-binding-examples) +查看 RBAC 绑定的更多实例。 +参阅[下文](#example),查看对 PodSecurityPolicy 进行授权的完整示例。 -通过设置 PSP 卷字段,能够控制具体卷类型的使用。当创建一个卷的时候,与该字段相关的已定义卷可以允许设置如下值: + +### 故障排查 {#troubleshooting} +- [控制器管理器组件](/zh/docs/reference/command-line-tools-reference/kube-controller-manager/) + 必须运行在 + [安全的 API 端口](/zh/docs/reference/access-authn-authz/controlling-access/), + 并且一定不能具有超级用户权限。 + 否则其请求会绕过身份认证和鉴权模块控制,从而导致所有 PodSecurityPolicy 对象 + 都被启用,用户亦能创建特权容器。 + 关于配置控制器管理器鉴权相关的详细信息,可参阅 + [控制器角色](/zh/docs/reference/access-authn-authz/rbac/#controller-roles)。 + +## 策略顺序 {#policy-order} +除了限制 Pod 创建与更新,Pod 安全策略也可用来为其所控制的很多字段 +设置默认值。当存在多个策略对象时,Pod 安全策略控制器依据以下条件选择 +策略: + +1. 优先考虑中允许 Pod 不经修改地创建或更新的 PodSecurityPolicy,这些策略 + 不会更改 Pod 字段的默认值或者其他配置。 + 这类非更改性质的 PodSecurityPolicy 对象之间的顺序无关紧要。 +2. 如果必须要为 Pod 设置默认值或者其他配置,(按名称顺序)选择第一个允许 + Pod 操作的 PodSecurityPolicy 对象。 -### 主机网络 - - *HostPorts* , 默认为 `empty`。`HostPortRange` 列表通过 `min`(包含) and `max`(包含) 来定义,指定了被允许的主机端口。 + +{{< note >}} +在更新操作期间(这时不允许更改 Pod 规约),仅使用非更改性质的 +PodSecurityPolicy 来对 Pod 执行验证操作。 +{{< /note >}} -### 允许的主机路径 - - *AllowedHostPaths* 是一个被允许的主机路径前缀的白名单。空值表示所有的主机路径都可以使用。 + +## 示例 {#example} +_本示例假定你已经有一个启动了 PodSecurityPolicy 准入控制器的集群并且 +你拥有集群管理员特权。_ -## 许可 + +### 配置 {#set-up} -许可使用如下的方式为 Pod 创建最终的安全上下文: -1. 检索所有可用的 PSP。 -1. 生成在请求中没有指定的安全上下文设置的字段值。 -1. 基于可用的策略,验证最终的设置。 +为运行此示例,配置一个名字空间和一个服务账号。我们将用这个服务账号来 +模拟一个非管理员账号的用户。 -如果某个策略能够匹配上,该 Pod 就被接受。如果请求与 PSP 不匹配,则 Pod 被拒绝。 +```shell +kubectl create namespace psp-example +kubectl create serviceaccount -n psp-example fake-user +kubectl create rolebinding -n psp-example fake-editor --clusterrole=edit --serviceaccount=psp-example:fake-user +``` -Pod 必须基于 PSP 验证每个字段。 + +创建两个别名,以更清晰地展示我们所使用的用户账号,同时减少一些键盘输入: +```shell +alias kubectl-admin='kubectl -n psp-example' +alias kubectl-user='kubectl --as=system:serviceaccount:psp-example:fake-user -n psp-example' +``` - ### 创建一个策略和一个 Pod -在一个文件中定义 PodSecurityPolicy 对象实例。这里的策略只是用来禁止创建有特权 -要求的 Pods。 +在一个文件中定一个示例的 PodSecurityPolicy 对象。 +这里的策略只是用来禁止创建有特权要求的 Pods。 +PodSecurityPolicy 对象的名称必须是合法的 +[DNS 子域名](/zh/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)。 {{< codenew file="policy/example-psp.yaml" >}} + 使用 kubectl 执行创建操作: ```shell kubectl-admin create -f example-psp.yaml ``` -## 获取 Pod 安全策略列表 - -获取已存在策略列表,使用 `kubectl get`: + +现在,作为一个非特权用户,尝试创建一个简单的 Pod: ```shell -$ kubectl get psp -NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS VOLUMES -permissive false [] RunAsAny RunAsAny RunAsAny RunAsAny false [*] -privileged true [] RunAsAny RunAsAny RunAsAny RunAsAny false [*] -restricted false [] RunAsAny MustRunAsNonRoot RunAsAny RunAsAny false [emptyDir secret downwardAPI configMap persistentVolumeClaim projected] +kubectl-user create -f- < +**发生了什么?** 尽管 PodSecurityPolicy 被创建,Pod 的服务账号或者 +`fake-user` 用户都没有使用该策略的权限。 ```shell -$ kubectl edit psp permissive +kubectl-user auth can-i use podsecuritypolicy/example ``` +``` +no +``` + +创建角色绑定,赋予 `fake-user` 使用 `use` 访问示例策略的权限: - -该命令将打开一个默认文本编辑器,在这里能够修改策略。 - - - -## 删除 Pod 安全策略 - -一旦不再需要一个策略,很容易通过 `kubectl` 删除它: + +{{< note >}} +不建议使用这种方法! +欲了解优先考虑的方法,请参见[下节](#run-another-pod)。 +{{< /note >}} ```shell -$ kubectl delete psp permissive -podsecuritypolicy "permissive" deleted +kubectl-admin create role psp:unprivileged \ + --verb=use \ + --resource=podsecuritypolicy \ + --resource-name=example ``` +输出: + +``` +role "psp:unprivileged" created +``` + +```shell +kubectl-admin create rolebinding fake-user:psp:unprivileged \ + --role=psp:unprivileged \ + --serviceaccount=psp-example:fake-user +``` + +输出: + +``` +rolebinding "fake-user:psp:unprivileged" created +``` + +```shell +kubectl-user auth can-i use podsecuritypolicy/example +``` + +输出: + +``` +yes +``` + + +现在重试创建 Pod: + +```shell +kubectl-user create -f- < +此次尝试不出所料地成功了! +不过任何创建特权 Pod 的尝试还是会被拒绝: + +```shell +kubectl-user create -f- < +继续此例之前先删除该 Pod: + +```shell +kubectl-user delete pod pause +``` + + +### 运行另一个 Pod {#run-another-pod} + +我们再试一次,稍微有些不同: + +```shell +kubectl-user create deployment pause --image=k8s.gcr.io/pause +``` + +输出为: + +``` +deployment "pause" created +``` + +```shell +kubectl-user get pods +``` + +输出为: + +``` +No resources found. +``` + +```shell +kubectl-user get events | head -n 2 +``` + +输出为: +``` +LASTSEEN FIRSTSEEN COUNT NAME KIND SUBOBJECT TYPE REASON SOURCE MESSAGE +1m 2m 15 pause-7774d79b5 ReplicaSet Warning FailedCreate replicaset-controller Error creating: pods "pause-7774d79b5-" is forbidden: no providers available to validate pod request +``` + + +**发生了什么?** 我们已经为用户 `fake-user` 绑定了 `psp:unprivileged` 角色, +为什么还会收到错误 `Error creating: pods "pause-7774d79b5-" is +forbidden: no providers available to validate pod request +(创建错误:pods "pause-7774d79b5" 被禁止:没有可用来验证 pod 请求的驱动)`? +答案在于源文件 - `replicaset-controller`。 +`fake-user` 用户成功地创建了 Deployment,而后者也成功地创建了 ReplicaSet, +不过当 ReplicaSet 创建 Pod 时,发现未被授权使用示例 PodSecurityPolicy 资源。 + + +为了修复这一问题,将 `psp:unprivileged` 角色绑定到 Pod 的服务账号。 +在这里,因为我们没有给出服务账号名称,默认的服务账号是 `default`。 + +```shell +kubectl-admin create rolebinding default:psp:unprivileged \ + --role=psp:unprivileged \ + --serviceaccount=psp-example:default +``` + +输出为: + +``` +rolebinding "default:psp:unprivileged" created +``` + + +现在如果你给 ReplicaSet 控制器一分钟的时间来重试,该控制器最终将能够 +成功地创建 Pod: + +```shell +kubectl-user get pods --watch +``` + +输出类似于: + +``` +NAME READY STATUS RESTARTS AGE +pause-7774d79b5-qrgcb 0/1 Pending 0 1s +pause-7774d79b5-qrgcb 0/1 Pending 0 1s +pause-7774d79b5-qrgcb 0/1 ContainerCreating 0 1s +pause-7774d79b5-qrgcb 1/1 Running 0 2s +``` + + +### 清理 {#clean-up} + +删除名字空间即可清理大部分示例资源: + +```shell +kubectl-admin delete ns psp-example +``` + +输出类似于: + +``` +namespace "psp-example" deleted +``` + + +注意 `PodSecurityPolicy` 资源不是名字空间域的资源,必须单独清理: + +```shell +kubectl-admin delete psp example +``` + +输出类似于: +``` +podsecuritypolicy "example" deleted +``` + + +### 示例策略 {#example-policies} + +下面是一个你可以创建的约束性非常弱的策略,其效果等价于没有使用 Pod 安全 +策略准入控制器: + +{{< codenew file="policy/privileged-psp.yaml" >}} + + +下面是一个具有约束性的策略,要求用户以非特权账号运行,禁止可能的向 root 权限 +的升级,同时要求使用若干安全机制。 + +{{< codenew file="policy/restricted-psp.yaml" >}} + + +更多的示例可参考 +[Pod 安全标准](/zh/docs/concepts/security/pod-security-standards/#policy-instantiation)。 + + +## 策略参考 {#policy-reference} + +### Privileged + +**Privileged** - 决定是否 Pod 中的某容器可以启用特权模式。 +默认情况下,容器是不可以访问宿主上的任何设备的,不过一个“privileged(特权的)” +容器则被授权访问宿主上所有设备。 +这种容器几乎享有宿主上运行的进程的所有访问权限。 +对于需要使用 Linux 权能字(如操控网络堆栈和访问设备)的容器而言是有用的。 + + +### 宿主名字空间 {#host-namespaces} + +**HostPID** - 控制 Pod 中容器是否可以共享宿主上的进程 ID 空间。 +注意,如果与 `ptrace` 相结合,这种授权可能被利用,导致向容器外的特权逃逸 +(默认情况下 `ptrace` 是被禁止的)。 + +**HostIPC** - 控制 Pod 容器是否可共享宿主上的 IPC 名字空间。 + +**HostNetwork** - 控制是否 Pod 可以使用节点的网络名字空间。 +此类授权将允许 Pod 访问本地回路(loopback)设备、在本地主机(localhost) +上监听的服务、还可能用来监听同一节点上其他 Pod 的网络活动。 + +**HostPorts** -提供可以在宿主网络名字空间中可使用的端口范围列表。 +该属性定义为一组 `HostPortRange` 对象的列表,每个对象中包含 +`min`(含)与 `max`(含)值的设置。 +默认不允许访问宿主端口。 + + +### 卷和文件系统 {#volumes-and-file-systems} + +**Volumes** - 提供一组被允许的卷类型列表。可被允许的值对应于创建卷时可以 +设置的卷来源。卷类型的完整列表可参见 +[卷类型](/zh/docs/concepts/storage/volumes/#types-of-volumes)。 +此外, `*` 可以用来允许所有卷类型。 + +对于新的 Pod 安全策略设置而言,建议设置的卷类型的*最小列表*包含: + +- configMap +- downwardAPI +- emptyDir +- persistentVolumeClaim +- secret +- projected + + +{{< warning >}} +PodSecurityPolicy 并不限制可以被 `PersistentVolumeClaim` 所引用的 +`PersistentVolume` 对象的类型。 +此外 `hostPath` 类型的 `PersistentVolume` 不支持只读访问模式。 +应该仅赋予受信用户创建 `PersistentVolume` 对象的访问权限。 +{{< /warning >}} + + +**FSGroup** - 控制应用到某些卷上的附加用户组。 + + - *MustRunAs* - 要求至少指定一个 `range`。 + 使用范围中的最小值作为默认值。所有 range 值都会被用来执行验证。 + - *MayRunAs* - 要求至少指定一个 `range`。 + 允许不设置 `FSGroups`,且无默认值。 + 如果 `FSGroup` 被设置,则所有 range 值都会被用来执行验证检查。 + - *RunAsAny* - 不提供默认值。允许设置任意 `fsGroup` ID 值。 + + +**AllowedHostPaths** - 设置一组宿主文件目录,这些目录项可以在 `hostPath` 卷中 +使用。列表为空意味着对所使用的宿主目录没有限制。 +此选项定义包含一个对象列表,表中对象包含 `pathPrefix` 字段,用来表示允许 +`hostPath` 卷挂载以所指定前缀开头的路径。 +对象中还包含一个 `readOnly` 字段,用来表示对应的卷必须以只读方式挂载。 +例如: + + +```yaml +allowedHostPaths: + # 下面的设置允许 "/foo"、"/foo/"、"/foo/bar" 等路径,但禁止 + # "/fool"、"/etc/foo" 这些路径。 + # "/foo/../" 总会被当作非法路径。 + - pathPrefix: "/foo" + readOnly: true # 仅允许只读模式挂载 +``` + + + +{{< warning >}} +容器如果对宿主文件系统拥有不受限制的访问权限,就可以有很多种方式提升自己的特权, +包括读取其他容器中的数据、滥用系统服务(如 `kubelet`)`的凭据信息等。 + +由可写入的目录所构造的 `hostPath` 卷能够允许容器写入数据到宿主文件系统, +并且在写入时避开 `pathPrefix` 所设置的目录限制。 +`readOnly: true` 这一设置在 Kubernetes 1.11 版本之后可用。 +必须针对 `allowedHostPaths` 中的 *所有* 条目设置此属性才能有效地限制容器 +只能访问 `pathPrefix` 所指定的目录。 +{{< /warning >}} + +**ReadOnlyRootFilesystem** - 要求容器必须以只读方式挂载根文件系统来运行 +(即不允许存在可写入层)。 + + +### FlexVolume 驱动 {#flexvolume-drivers} + +此配置指定一个可以被 FlexVolume 卷使用的驱动程序的列表。 +空的列表或者 nil 值意味着对驱动没有任何限制。 +请确保[`volumes`](#volumes-and-file-systems) 字段包含了 `flexVolume` 卷类型, +否则所有 FlexVolume 驱动都被禁止。 + + + +```yaml +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: allow-flex-volumes +spec: + # spec d的其他字段 + volumes: + - flexVolume + allowedFlexVolumes: + - driver: example/lvm + - driver: example/cifs +``` + + +### 用户和组 {#users-and-groups} + +**RunAsUser** - 控制使用哪个用户 ID 来运行容器。 + + - *MustRunAs* - 必须配置一个 `range`。使用该范围内的第一个值作为默认值。 + 所有 range 值都被用于验证检查。 +- *MustRunAsNonRoot* - 要求提交的 Pod 具有非零 `runAsUser` 值,或在镜像中 + (使用 UID 数值)定义了 `USER` 环境变量。 + 如果 Pod 既没有设置 `runAsNonRoot`,也没有设置 `runAsUser`,则该 Pod 会被 + 修改以设置 `runAsNonRoot=true`,从而要求容器通过 `USER` 指令给出非零的数值形式 + 的用户 ID。此配置没有默认值。采用此配置时,强烈建议设置 + `allowPrivilegeEscalation=false`。 +- *RunAsAny* - 没有提供默认值。允许指定任何 `runAsUser` 配置。 + + +**RunAsGroup** - 控制运行容器时使用的主用户组 ID。 + + - *MustRunAs* - 要求至少指定一个 `range` 值。第一个 range + 中的最小值作为默认值。所有 range 值都被用来执行验证检查。 + - *MayRunAs* - 不要求设置 `RunAsGroup`。 + 不过,如果指定了 `RunAsGroup` 被设置,所设置值必须处于所定义的范围内。 + - *RunAsAny* - 未指定默认值。允许 `runAsGroup` 设置任何值。 + + +**SupplementalGroups** - 控制容器可以添加的组 ID。 + + - *MustRunAs* - 要求至少指定一个 `range` 值。 + 第一个 range 中的最小值用作默认值。 + 所有 range 值都被用来执行验证检查。 + - *MayRunAs* - 要求至少指定一个 `range` 值。 + 允许不指定 `supplementalGroups` 且不设置默认值。 + 如果 `supplementalGroups` 被设置,则所有 range 值都被用来执行验证检查。 + - *RunAsAny* - 未指定默认值。允许为 `supplementalGroups` 设置任何值。 + + +### 特权提升 {#privilege-escalation} + +这一组选项控制容器的`allowPrivilegeEscalation` 属性。该属性直接决定是否为 +容器进程设置 +[`no_new_privs`](https://www.kernel.org/doc/Documentation/prctl/no_new_privs.txt) +参数。此参数会禁止 `setuid` 属性的可执行文件更改有效用户 ID(EUID),并且 +禁止启用额外权能的文件。例如,`no_new_privs` 会禁止使用 `ping` 工具。 +如果想有效地实施 `MustRunAsNonRoot` 控制,需要配置这一选项。 + + +**AllowPrivilegeEscalation** - 决定是否用户可以将容器的安全上下文设置为 +`allowPrivilegeEscalation=true`。默认设置下,这样做是允许的,目的是避免 +造成现有的 `setuid` 应用无法运行。将此选项设置为 `false` 可以确保容器的所有 +子进程都无法获得比父进程更多的特权。 + + +**DefaultAllowPrivilegeEscalation** - 为 `allowPrivilegeEscalation` 选项设置 +默认值。不设置此选项时的默认行为是允许特权提升,以便运行 setuid 程序。 +如果不希望运行 setuid 程序,可以使用此字段将选项的默认值设置为禁止,同时 +仍然允许 Pod 显式地请求 `allowPrivilegeEscalation`。 + + +### 权能字 {#capabilities} + +Linux 权能字(Capabilities)将传统上与超级用户相关联的特权作了细粒度的分解。 +其中某些权能字可以用来提升特权,打破容器边界,可以通过 PodSecurityPolicy +来限制。关于 Linux 权能字的更多细节,可参阅 +[capabilities(7)](http://man7.org/linux/man-pages/man7/capabilities.7.html)。 + +下列字段都可以配置为权能字的列表。表中的每一项都是 `ALL_CAPS` 中的一个权能字 +名称,只是需要去掉 `CAP_` 前缀。 + + +**AllowedCapabilities** - 给出可以被添加到容器的权能字列表。 +默认的权能字集合是被隐式允许的那些。空集合意味着只能使用默认权能字集合, +不允许添加额外的权能字。`*` 可以用来设置允许所有权能字。 + + +**RequiredDropCapabilities** - 必须从容器中去除的权能字。 +所给的权能字会从默认权能字集合中去除,并且一定不可以添加。 +`RequiredDropCapabilities` 中列举的权能字不能出现在 +`AllowedCapabilities` 或 `DefaultAddCapabilities` 所给的列表中。 + + +**DefaultAddCapabilities** - 默认添加到容器的权能字集合。 +这一集合是作为容器运行时所设值的补充。 +关于使用 Docker 容器运行引擎时默认的权能字列表,可参阅 +[Docker 文档](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)。 + + +### SELinux + +- *MustRunAs* - 要求必须配置 `seLinuxOptions`。默认使用 `seLinuxOptions`。 + 针对 `seLinuxOptions` 所给值执行验证检查。 +- *RunAsAny* - 没有提供默认值。允许任意指定的 `seLinuxOptions` 选项。 + + +### AllowedProcMountTypes + +`allowedProcMountTypes` 是一组可以允许的 proc 挂载类型列表。 +空表或者 nil 值表示只能使用 `DefaultProcMountType`。 + +`DefaultProcMount` 使用容器运行时的默认值设置来决定 `/proc` 的只读挂载模式 +和路径屏蔽。大多数容器运行时都会屏蔽 `/proc` 下面的某些路径以避免特殊设备或 +信息被不小心暴露给容器。这一配置使所有 `Default` 字符串值来表示。 + +此外唯一的ProcMountType 是 `UnmaskedProcMount`,意味着即将绕过容器运行时的 +路径屏蔽行为,确保新创建的 `/proc` 不会被容器修改。此配置用字符串 +`Unmasked` 来表示。 + + +### AppArmor + +通过 PodSecurityPolicy 上的注解来控制。 +详情请参阅 +[AppArmor 文档](/zh/docs/tutorials/clusters/apparmor/#podsecuritypolicy-annotations)。 -## 启用 Pod 安全策略 + +### Seccomp +Pod 对 seccomp 模版的使用可以通过在 PodSecurityPolicy 上设置注解来控制。 +Seccomp 是 Kubernetes 的一项 alpha 阶段特性。 -1. 已经启用 API 类型 `extensions/v1beta1/podsecuritypolicy`(仅对 1.6 之前的版本) -1. 已经启用许可控制器 `PodSecurityPolicy` -1. 已经定义了自己的策略 +**seccomp.security.alpha.kubernetes.io/defaultProfileName** - 注解用来 +指定为容器配置默认的 seccomp 模版。可选值为: + +- `unconfined` - 如果没有指定其他替代方案,Seccomp 不会被应用到容器进程上 + (Kubernets 中的默认设置)。 +- `runtime/default` - 使用默认的容器运行时模版。 +- `docker/default` - 使用 Docker 的默认 seccomp 模版。自 1.11 版本废弃。 + 应改为使用 `runtime/default`。 +- `localhost/<路径名>` - 指定节点上路径 `/<路径名>` 下的一个 + 文件作为其模版。其中 `` 是通过 `kubelet` 的标志 + `--seccomp-profile-root` 来指定的。 + +**seccomp.security.alpha.kubernetes.io/allowedProfileNames** - 指定可以为 +Pod seccomp 注解配置的值的注解。取值为一个可用值的列表。 +表中每项可以是上述各值之一,还可以是 `*`,用来表示允许所有的模版。 +如果没有设置此注解,意味着默认的 seccomp 模版是不可更改的。 -## 使用 RBAC + +### Sysctl + +默认情况下,所有的安全的 sysctl 都是被允许的。 + + +- `forbiddenSysctls` - 用来排除某些特定的 sysctl。 + 你可以在此列表中禁止一些安全的或者不安全的 sysctl。 + 此选项设置为 `*` 意味着禁止设置所有 sysctl。 +- `allowedUnsafeSysctls` - 用来启用那些被默认列表所禁用的 sysctl, + 前提是所启用的 sysctl 没有被列在 `forbiddenSysctls` 中。 + +参阅 [Sysctl 文档](/zh/docs/tasks/administer-cluster/sysctl-cluster/#podsecuritypolicy)。 + +## {{% heading "whatsnext" %}} + + +- 参阅[Pod 安全标准](/zh/docs/concepts/security/pod-security-standards/) + 了解策略建议。 +- 阅读 [Pod 安全策略参考](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podsecuritypolicy-v1beta1-policy)了解 API 细节。 -PodSecurityPolicy 认证使用所有可用的策略,包括创建 Pod 的用户,Pod 上指定的服务账户(Service Account)。当 Pod 基于 Deployment、ReplicaSet 创建时,它是创建 Pod 的 Controller Manager,所以如果基于非安全 API 端口运行,允许所有的 PodSecurityPolicy 对象,并且不能够有效地实现细分权限。用户访问给定的 PSP 策略有效,仅当是直接部署 Pod 的情况。更多详情,查看 [PodSecurityPolicy RBAC 示例](https://git.k8s.io/kubernetes/examples/podsecuritypolicy/rbac/README.md),当直接部署 Pod 时,应用 PodSecurityPolicy 控制基于角色和组的已授权容器的访问 。 diff --git a/content/zh/docs/concepts/policy/resource-quotas.md b/content/zh/docs/concepts/policy/resource-quotas.md index 29d222a63c..73234a7cf3 100644 --- a/content/zh/docs/concepts/policy/resource-quotas.md +++ b/content/zh/docs/concepts/policy/resource-quotas.md @@ -1,19 +1,15 @@ --- -approvers: -- derekwaynecarr title: 资源配额 content_type: concept weight: 10 --- @@ -21,17 +17,13 @@ weight: 10 当多个用户或团队共享具有固定节点数目的集群时,人们会担心有人使用超过其基于公平原则所分配到的资源量。 - 资源配额是帮助管理员解决这一问题的工具。 - - - -资源配额,通过 `ResourceQuota` 对象来定义,对每个命名空间的资源消耗总量提供限制。它可以限制命名空间中某种类型的对象的总数目上限,也可以限制命令空间中的 Pod 可以使用的计算资源的总上限。 +资源配额,通过 `ResourceQuota` 对象来定义,对每个命名空间的资源消耗总量提供限制。 +它可以限制命名空间中某种类型的对象的总数目上限,也可以限制命令空间中的 Pod 可以使用的计算资源的总上限。 -- 不同的团队可以在不同的命名空间下工作,目前这是非约束性的,在未来的版本中可能会通过 ACL (Access Control List 访问控制列表) 来实现强制性约束。 +- 不同的团队可以在不同的命名空间下工作,目前这是非约束性的,在未来的版本中可能会通过 + ACL (Access Control List 访问控制列表) 来实现强制性约束。 - 集群管理员可以为每个命名空间创建一个或多个资源配额对象。 -- 当用户在命名空间下创建资源(如 Pod、Service 等)时,Kubernetes 的配额系统会跟踪集群的资源使用情况,以确保使用的资源用量不超过资源配额中定义的硬性资源限额。 -- 如果资源创建或者更新请求违反了配额约束,那么该请求会报错(HTTP 403 FORBIDDEN),并在消息中给出有可能违反的约束。 -- 如果命名空间下的计算资源 (如 `cpu` 和 `memory`)的配额被启用,则用户必须为这些资源设定请求值(request)和约束值(limit),否则配额系统将拒绝 Pod 的创建。 +- 当用户在命名空间下创建资源(如 Pod、Service 等)时,Kubernetes 的配额系统会 + 跟踪集群的资源使用情况,以确保使用的资源用量不超过资源配额中定义的硬性资源限额。 +- 如果资源创建或者更新请求违反了配额约束,那么该请求会报错(HTTP 403 FORBIDDEN), + 并在消息中给出有可能违反的约束。 +- 如果命名空间下的计算资源 (如 `cpu` 和 `memory`)的配额被启用,则用户必须为 + 这些资源设定请求值(request)和约束值(limit),否则配额系统将拒绝 Pod 的创建。 提示: 可使用 `LimitRanger` 准入控制器来为没有设置计算资源需求的 Pod 设置默认值。 - 若想避免这类问题,请参考[演练](/docs/tasks/administer-cluster/quota-memory-cpu-namespace/)中的示例。 + + 若想避免这类问题,请参考 + [演练](/zh/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/)示例。 + + +ResourceQuota 对象的名称必须时合法的 +[DNS 子域名](/zh/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)。 -- 在具有 32 GiB 内存和 16 核 CPU 资源的集群中,允许 A 团队使用 20 GiB 内存 和 10 核的 CPU 资源,允许 B 团队使用 10 GiB 内存和 4 核的 CPU 资源,并且预留 2 GiB 内存和 2 核的 CPU 资源供将来分配。 +- 在具有 32 GiB 内存和 16 核 CPU 资源的集群中,允许 A 团队使用 20 GiB 内存 和 10 核的 CPU 资源, + 允许 B 团队使用 10 GiB 内存和 4 核的 CPU 资源,并且预留 2 GiB 内存和 2 核的 CPU 资源供将来分配。 - 限制 "testing" 命名空间使用 1 核 CPU 资源和 1GiB 内存。允许 "production" 命名空间使用任意数量。 在集群容量小于各命名空间配额总和的情况下,可能存在资源竞争。资源竞争时,Kubernetes 系统会遵循先到先得的原则。 - 不管是资源竞争还是配额的修改,都不会影响已经创建的资源使用对象。 ## 启用资源配额 - -资源配额的支持在很多 Kubernetes 版本中是默认开启的。当 apiserver `--enable-admission-plugins=` 参数中包含 `ResourceQuota` 时,资源配额会被启用。 +资源配额的支持在很多 Kubernetes 版本中是默认开启的。当 apiserver `--enable-admission-plugins=` +参数中包含 `ResourceQuota` 时,资源配额会被启用。 ## 计算资源配额 - -用户可以对给定命名空间下的可被请求的[计算资源](/docs/user-guide/compute-resources)总量进行限制。 +用户可以对给定命名空间下的可被请求的 +[计算资源](/zh/docs/concepts/configuration/manage-resources-containers/) +总量进行限制。 | 资源名称 | 描述 | -| --------------------- | ----------------------------------------------------------- | +| --------------------- | --------------------------------------------- | | `limits.cpu` | 所有非终止状态的 Pod,其 CPU 限额总量不能超过该值。 | | `limits.memory` | 所有非终止状态的 Pod,其内存限额总量不能超过该值。 | | `requests.cpu` | 所有非终止状态的 Pod,其 CPU 需求总量不能超过该值。 | @@ -143,21 +150,23 @@ The following resource types are supported: -### 扩展资源的资源配额 - -除上述资源外,在 Kubernetes 1.10 版本中,还添加了对[扩展资源](/zh/docs/concepts/configuration/manage-resources-containers/#扩展资源-extended-resources)的支持。 +### 扩展资源的资源配额 + +除上述资源外,在 Kubernetes 1.10 版本中,还添加了对 +[扩展资源](/zh/docs/concepts/configuration/manage-resources-containers/#extended-resources) +的支持。 -由于扩展资源不可超量分配,因此没有必要在配额中为同一扩展资源同时指定 `requests` 和 `limits`。对于扩展资源而言,目前仅允许使用前缀为 `requests.` 的配额项。 +由于扩展资源不可超量分配,因此没有必要在配额中为同一扩展资源同时指定 `requests` 和 `limits`。 +对于扩展资源而言,目前仅允许使用前缀为 `requests.` 的配额项。 ## 存储资源配额 - -用户可以对给定命名空间下的[存储资源](/docs/user-guide/persistent-volumes)总量进行限制。 +用户可以对给定命名空间下的[存储资源](/zh/docs/concepts/storage/persistent-volumes/)总量进行限制。 - 此外,还可以根据相关的存储类(Storage Class)来限制存储资源的消耗。 ## 对象数量配额 - Kubernetes 1.9 版本增加了使用以下语法对所有标准的、命名空间域的资源类型进行配额设置的支持。 * `count/.` @@ -263,7 +269,6 @@ For example, to create a quota on a `widgets` custom resource in the `example.co Kubernetes 1.15 版本增加了对使用相同语法来约束自定义资源的支持。 例如,要对 `example.com` API 组中的自定义资源 `widgets` 设置配额,请使用 `count/widgets.example.com`。 - 在 Kubernetes 1.9 版本之前,可以在有限的一组资源上实施一般性的对象数量配额。 此外,还可以进一步按资源的类型设置其配额。 - 支持以下类型: -例如,`pods` 配额统计某个命名空间中所创建的、非终止状态的 `Pod` 个数并确保其不超过某上限值。用户可能希望在某命名空间中设置 `pods` 配额,以避免有用户创建很多小的 Pod,从而耗尽集群所能提供的 Pod IP 地址。 +例如,`pods` 配额统计某个命名空间中所创建的、非终止状态的 `Pod` 个数并确保其不超过某上限值。 +用户可能希望在某命名空间中设置 `pods` 配额,以避免有用户创建很多小的 Pod,从而耗尽集群所能提供的 Pod IP 地址。 -## 配额作用域 - -每个配额都有一组相关的作用域(scope),配额只会对作用域内的资源生效。配额机制仅统计所列举的作用域的交集中的资源用量。 +## 配额作用域 {#quota-scopes} + +每个配额都有一组相关的作用域(scope),配额只会对作用域内的资源生效。 +配额机制仅统计所列举的作用域的交集中的资源用量。 `BestEffort` 作用域限制配额跟踪以下资源:`pods` - `Terminating`、`NotTerminating` 和 `NotBestEffort` 这三种作用域限制配额跟踪以下资源: * `cpu` @@ -383,18 +387,17 @@ Pods can be created at a specific [priority](/docs/concepts/configuration/pod-pr You can control a pod's consumption of system resources based on a pod's priority, by using the `scopeSelector` field in the quota spec. --> -Pod 可以创建为特定的[优先级](/docs/concepts/configuration/pod-priority-preemption/#pod-priority)。 +Pod 可以创建为特定的[优先级](/zh/docs/concepts/configuration/pod-priority-preemption/#pod-priority)。 通过使用配额规约中的 `scopeSelector` 字段,用户可以根据 Pod 的优先级控制其系统资源消耗。 -仅当配额规范中的 `scopeSelector` 字段选择到某 Pod 时,配额机制才会匹配和计量 Pod 的资源消耗。 - +仅当配额规范中的 `scopeSelector` 字段选择到某 Pod 时,配额机制才会匹配和计量 Pod 的资源消耗。 + 本示例创建一个配额对象,并将其与具有特定优先级的 Pod 进行匹配。 该示例的工作方式如下: @@ -405,9 +408,7 @@ works as follows: - 集群中的 Pod 可取三个优先级类之一,即 "low"、"medium"、"high"。 - 为每个优先级创建一个配额对象。 - + 将以下 YAML 保存到文件 `quota.yml` 中。 ```yaml @@ -467,7 +468,7 @@ Apply the YAML using `kubectl create`. kubectl create -f ./quota.yml ``` -```shell +``` resourcequota/pods-high created resourcequota/pods-medium created resourcequota/pods-low created @@ -482,7 +483,7 @@ Verify that `Used` quota is `0` using `kubectl describe quota`. kubectl describe quota ``` -```shell +``` Name: pods-high Namespace: default Resource Used Hard @@ -557,7 +558,7 @@ the other two quotas are unchanged. kubectl describe quota ``` -```shell +``` Name: pods-high Namespace: default Resource Used Hard @@ -597,13 +598,12 @@ pods 0 10 -## 请求与限制 - +## 请求与限制 {#requests-vs-limits} + 分配计算资源时,每个容器可以为 CPU 或内存指定请求和约束。 配额可以针对二者之一进行设置。 @@ -612,16 +612,16 @@ If the quota has a value specified for `requests.cpu` or `requests.memory`, then container makes an explicit request for those resources. If the quota has a value specified for `limits.cpu` or `limits.memory`, then it requires that every incoming container specifies an explicit limit for those resources. --> -如果配额中指定了 `requests.cpu` 或 `requests.memory` 的值,则它要求每个容器都显式给出对这些资源的请求。同理,如果配额中指定了 `limits.cpu` 或 `limits.memory` 的值,那么它要求每个容器都显式设定对应资源的限制。 +如果配额中指定了 `requests.cpu` 或 `requests.memory` 的值,则它要求每个容器都显式给出对这些资源的请求。 +同理,如果配额中指定了 `limits.cpu` 或 `limits.memory` 的值,那么它要求每个容器都显式设定对应资源的限制。 ## 查看和设置配额 {#viewing-and-setting-quotas} - Kubectl 支持创建、更新和查看配额: ```shell @@ -674,7 +674,7 @@ kubectl create -f ./object-counts.yaml --namespace=myspace kubectl get quota --namespace=myspace ``` -```shell +``` NAME AGE compute-resources 30s object-counts 32s @@ -684,7 +684,7 @@ object-counts 32s kubectl describe quota compute-resources --namespace=myspace ``` -```shell +``` Name: compute-resources Namespace: myspace Resource Used Hard @@ -700,7 +700,7 @@ requests.nvidia.com/gpu 0 4 kubectl describe quota object-counts --namespace=myspace ``` -```shell +``` Name: object-counts Namespace: myspace Resource Used Hard @@ -736,7 +736,7 @@ kubectl create deployment nginx --image=nginx --namespace=myspace kubectl describe quota --namespace=myspace ``` -```shell +``` Name: test Namespace: myspace Resource Used Hard @@ -749,27 +749,26 @@ count/secrets 1 4 -## 配额和集群容量 - -资源配额与集群资源总量是完全独立的。它们通过绝对的单位来配置。所以,为集群添加节点时,资源配额*不会*自动赋予每个命名空间消耗更多资源的能力。 +## 配额和集群容量 {#quota-and-cluster-capacity} + +资源配额与集群资源总量是完全独立的。它们通过绝对的单位来配置。 +所以,为集群添加节点时,资源配额*不会*自动赋予每个命名空间消耗更多资源的能力。 -有时可能需要资源配额支持更复杂的策略,比如: - +有时可能需要资源配额支持更复杂的策略,比如: + - 在几个团队中按比例划分总的集群资源。 - 允许每个租户根据需要增加资源使用量,但要有足够的限制以防止资源意外耗尽。 - 探测某个命名空间的需求,添加物理节点并扩大资源配额值。 @@ -779,7 +778,8 @@ Such policies could be implemented using `ResourceQuotas` as building blocks, by writing a "controller" that watches the quota usage and adjusts the quota hard limits of each namespace according to other signals. --> -这些策略可以通过将资源配额作为一个组成模块、手动编写一个控制器来监控资源使用情况,并结合其他信号调整命名空间上的硬性资源配额来实现。 +这些策略可以通过将资源配额作为一个组成模块、手动编写一个控制器来监控资源使用情况, +并结合其他信号调整命名空间上的硬性资源配额来实现。 ## 默认情况下限制特定优先级的资源消耗 - -有时候可能希望当且仅当某名字空间中存在匹配的配额对象时,才可以创建特定优先级(例如 "cluster-services")的 Pod。 +有时候可能希望当且仅当某名字空间中存在匹配的配额对象时,才可以创建特定优先级 +(例如 "cluster-services")的 Pod。 -通过这种机制,操作人员能够将限制某些高优先级类仅出现在有限数量的命名空间中,而并非每个命名空间默认情况下都能够使用这些优先级类。 +通过这种机制,操作人员能够将限制某些高优先级类仅出现在有限数量的命名空间中, +而并非每个命名空间默认情况下都能够使用这些优先级类。 要实现此目的,应使用 kube-apiserver 标志 `--admission-control-config-file` 传递如下配置文件的路径: @@ -827,13 +828,13 @@ plugins: {{% /tab %}} {{% tab name="apiserver.k8s.io/v1alpha1" %}} ```yaml -# 在 Kubernetes 1.17 中已不被推荐使用,请使用 apiserver.config.k8s.io/v1 +# 在 Kubernetes 1.17 中已不推荐使用,请使用 apiserver.config.k8s.io/v1 apiVersion: apiserver.k8s.io/v1alpha1 kind: AdmissionConfiguration plugins: - name: "ResourceQuota" configuration: - # 在 Kubernetes 1.17 中已不被推荐使用,请使用 apiserver.config.k8s.io/v1, ResourceQuotaConfiguration + # 在 Kubernetes 1.17 中已不推荐使用,请使用 apiserver.config.k8s.io/v1, ResourceQuotaConfiguration apiVersion: resourcequota.admission.k8s.io/v1beta1 kind: Configuration limitedResources: @@ -848,12 +849,11 @@ plugins: 现在,仅当命名空间中存在匹配的 `scopeSelector` 的配额对象时,才允许使用 "cluster-services" Pod。 - 示例: ```yaml @@ -867,24 +867,22 @@ For example: -有关更多信息,请参见 [LimitedResources](https://github.com/kubernetes/kubernetes/pull/36765) 和[优先级类配额支持的设计文档](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/scheduling/pod-priority-resourcequota.md)。 +有关更多信息,请参见 [LimitedResources](https://github.com/kubernetes/kubernetes/pull/36765) 和 +[优先级类配额支持的设计文档](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/scheduling/pod-priority-resourcequota.md)。 ## 示例 - -查看[如何使用资源配额的详细示例](/docs/tasks/administer-cluster/quota-api-object/)。 - - +查看[如何使用资源配额的详细示例](/zh/docs/tasks/administer-cluster/quota-api-object/)。 ## {{% heading "whatsnext" %}} - -查看[资源配额设计文档](https://git.k8s.io/community/contributors/design-proposals/resource-management/admission_control_resource_quota.md)了解更多信息。 +- 查看[资源配额设计文档](https://git.k8s.io/community/contributors/design-proposals/resource-management/admission_control_resource_quota.md) + 了解更多信息。 diff --git a/content/zh/docs/concepts/workloads/controllers/cron-jobs.md b/content/zh/docs/concepts/workloads/controllers/cron-jobs.md index c4da73af47..f6a5eefa9c 100644 --- a/content/zh/docs/concepts/workloads/controllers/cron-jobs.md +++ b/content/zh/docs/concepts/workloads/controllers/cron-jobs.md @@ -5,15 +5,9 @@ weight: 80 --- @@ -26,10 +20,11 @@ A _Cron Job_ creates [Jobs](/docs/concepts/workloads/controllers/jobs-run-to-com One CronJob object is like one line of a _crontab_ (cron table) file. It runs a job periodically on a given schedule, written in [Cron](https://en.wikipedia.org/wiki/Cron) format. --> +_Cron Job_ 创建基于时间调度的 [Jobs](/zh/docs/concepts/workloads/controllers/jobs-run-to-completion/)。 -_Cron Job_ 创建基于时间调度的 [Jobs](/docs/concepts/workloads/controllers/jobs-run-to-completion/)。 - -一个 CronJob 对象就像 _crontab_ (cron table) 文件中的一行。它用 [Cron](https://en.wikipedia.org/wiki/Cron) 格式进行编写,并周期性地在给定的调度时间执行 Job。 +一个 CronJob 对象就像 _crontab_ (cron table) 文件中的一行。 +它用 [Cron](https://en.wikipedia.org/wiki/Cron) 格式进行编写, +并周期性地在给定的调度时间执行 Job。 {{< caution >}} -所有 **CronJob** 的 `schedule:` 时间都是基于初始 Job 的主控节点的时区。 +所有 **CronJob** 的 `schedule:` 时间都是基于 +{{< glossary_tooltip term_id="kube-controller-manager" text="kube-controller-manager" >}}. +的时区。 -如果你的控制平面在 Pod 或是裸容器中运行了主控程序 (kube-controller-manager), -那么为该容器设置的时区将会决定定时任务的控制器所使用的时区。 +如果你的控制平面在 Pod 或是裸容器中运行了 kube-controller-manager, +那么为该容器所设置的时区将会决定 Cron Job 的控制器所使用的时区。 {{< /caution >}} -为 CronJob 资源创建清单时,请确保创建的名称不超过 52 个字符。这是因为 CronJob 控制器将自动在提供的作业名称后附加 11 个字符,并且存在一个限制,即作业名称的最大长度不能超过 63 个字符。 - - - - -有关创建和使用 CronJob 的说明及规范文件的示例,请参见[使用 CronJob 运行自动化任务](/zh/docs/tasks/job/automated-tasks-with-cron-jobs/)。 - - - - +为 CronJob 资源创建清单时,请确保所提供的名称是一个合法的 +[DNS 子域名](/zh/docs/concepts/overview/working-with-objects/names#dns-subdomain-names). +名称不能超过 52 个字符。 +这是因为 CronJob 控制器将自动在提供的 Job 名称后附加 11 个字符,并且存在一个限制, +即 Job 名称的最大长度不能超过 63 个字符。 +## CronJob + +CronJobs 对于创建周期性的、反复重复的任务很有用,例如执行数据备份或者发送邮件。 +CronJobs 也可以用来计划在指定时间来执行的独立任务,例如计划当集群看起来很空闲时 +执行某个 Job。 + + +### 示例 + +下面的 CronJob 示例清单会在每分钟打印出当前时间和问候消息: + +{{< codenew file="application/job/cronjob.yaml" >}} + +[使用 CronJob 运行自动化任务](/zh/docs/tasks/job/automated-tasks-with-cron-jobs/) +一文会为你详细讲解此例。 + + +## CronJob 限制 {#cron-job-limitations} -## CronJob 限制 - -CronJob 创建 Job 对象,每个 Job 的执行次数大约为一次。 +CronJob 根据其计划编排,在每次该执行任务的时候大约会创建一个 Job。 我们之所以说 "大约",是因为在某些情况下,可能会创建两个 Job,或者不会创建任何 Job。 我们试图使这些情况尽量少发生,但不能完全杜绝。因此,Job 应该是 _幂等的_。 @@ -86,14 +103,15 @@ If `startingDeadlineSeconds` is set to a large value or left unset (the default) and if `concurrencyPolicy` is set to `Allow`, the jobs will always run at least once. --> - -如果 `startingDeadlineSeconds` 设置为很大的数值或未设置(默认),并且 `concurrencyPolicy` 设置为 `Allow`,则作业将始终至少运行一次。 +如果 `startingDeadlineSeconds` 设置为很大的数值或未设置(默认),并且 +`concurrencyPolicy` 设置为 `Allow`,则作业将始终至少运行一次。 - -对于每个 CronJob,CronJob {{< glossary_tooltip term_text="控制器" term_id="controller" >}} 检查从上一次调度的时间点到现在所错过了调度次数。如果错过的调度次数超过 100 次,那么它就不会启动这个任务,并记录这个错误: +对于每个 CronJob,CronJob {{< glossary_tooltip term_text="控制器" term_id="controller" >}} +检查从上一次调度的时间点到现在所错过了调度次数。如果错过的调度次数超过 100 次, +那么它就不会启动这个任务,并记录这个错误: ```` Cannot determine if job needs to be started. Too many missed start time (> 100). Set or decrease .spec.startingDeadlineSeconds or check clock skew. @@ -102,22 +120,24 @@ Cannot determine if job needs to be started. Too many missed start time (> 100). - -需要注意的是,如果 `startingDeadlineSeconds` 字段非空,则控制器会统计从 `startingDeadlineSeconds` 设置的值到现在而不是从上一个计划时间到现在错过了多少次 Job。例如,如果 `startingDeadlineSeconds` 是 `200`,则控制器会统计在过去 200 秒中错过了多少次 Job。 +需要注意的是,如果 `startingDeadlineSeconds` 字段非空,则控制器会统计从 +`startingDeadlineSeconds` 设置的值到现在而不是从上一个计划时间到现在错过了多少次 Job。 +例如,如果 `startingDeadlineSeconds` 是 `200`,则控制器会统计在过去 200 秒中错过了多少次 Job。 - -如果未能在调度时间内创建 CronJob,则计为错过。例如,如果 `concurrencyPolicy` 被设置为 `Forbid`,并且当前有一个调度仍在运行的情况下,试图调度的 CronJob 将被计算为错过。 +如果未能在调度时间内创建 CronJob,则计为错过。 +例如,如果 `concurrencyPolicy` 被设置为 `Forbid`,并且当前有一个调度仍在运行的情况下, +试图调度的 CronJob 将被计算为错过。 - -例如,假设一个 CronJob 被设置为 `08:30:00` 准时开始,它的 `startingDeadlineSeconds` 字段被设置为 10,如果在 `08:29:00` 时将 CronJob 控制器的时间改为 `08:42:00`,Job 将不会启动。 +例如,假设一个 CronJob 被设置为 `08:30:00` 准时开始,它的 `startingDeadlineSeconds` +字段被设置为 10,如果在 `08:29:00` 时将 CronJob 控制器的时间改为 `08:42:00`,Job 将不会启动。 如果觉得晚些开始比没有启动好,那请设置一个较长的 `startingDeadlineSeconds`。 -为了进一步阐述这个概念,假设将 CronJob 设置为从 `08:30:00` 开始每隔一分钟创建一个新的 Job,并将其 `startingDeadlineSeconds` 字段设置为 200 秒。 如果 CronJob 控制器恰好在与上一个示例相同的时间段(`08:29:00` 到 `10:21:00`)停机,则 Job 仍将从 `10:22:00` 开始。造成这种情况的原因是控制器现在检查在最近 200 秒(即 3 个错过的调度)中发生了多少次错过的 Job 调度,而不是从现在为止的最后一个调度时间开始。 +为了进一步阐述这个概念,假设将 CronJob 设置为从 `08:30:00` 开始每隔一分钟创建一个新的 Job, +并将其 `startingDeadlineSeconds` 字段设置为 200 秒。 +如果 CronJob 控制器恰好在与上一个示例相同的时间段(`08:29:00` 到 `10:21:00`)终止运行, +则 Job 仍将从 `10:22:00` 开始。 +造成这种情况的原因是控制器现在检查在最近 200 秒(即 3 个错过的调度)中发生了多少次错过的 +Job 调度,而不是从现在为止的最后一个调度时间开始。 CronJob 仅负责创建与其调度时间相匹配的 Job,而 Job 又负责管理其代表的 Pod。 +## {{% heading "whatsnext" %}} + + +* 进一步了解 [Cron 表达式的格式](https://en.wikipedia.org/wiki/Cron),学习设置 CronJob `schedule` 字段 +* 有关创建和使用 CronJob 的说明及示例规约文件,请参见 + [使用 CronJob 运行自动化任务](/zh/docs/tasks/job/automated-tasks-with-cron-jobs/)。 - diff --git a/content/zh/docs/concepts/workloads/controllers/daemonset.md b/content/zh/docs/concepts/workloads/controllers/daemonset.md index edcbc29399..c9b58f7bd5 100644 --- a/content/zh/docs/concepts/workloads/controllers/daemonset.md +++ b/content/zh/docs/concepts/workloads/controllers/daemonset.md @@ -5,17 +5,9 @@ weight: 50 --- @@ -25,35 +17,32 @@ A _DaemonSet_ ensures that all (or some) Nodes run a copy of a Pod. As nodes ar cluster, Pods are added to them. As nodes are removed from the cluster, those Pods are garbage collected. Deleting a DaemonSet will clean up the Pods it created. ---> -_DaemonSet_ 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, -也会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。 +_DaemonSet_ 确保全部(或者某些)节点上运行一个 Pod 的副本。 +当有节点加入集群时, 也会为他们新增一个 Pod 。 +当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。 DaemonSet 的一些典型用法: -- 在每个节点上运行集群存储 DaemonSet,例如 `glusterd`、`ceph`。 -- 在每个节点上运行日志收集 DaemonSet,例如 `fluentd`、`logstash`。 -- 在每个节点上运行监控 DaemonSet,例如 [Prometheus Node Exporter](https://github.com/prometheus/node_exporter)、[Flowmill](https://github.com/Flowmill/flowmill-k8s/)、[Sysdig 代理](https://docs.sysdig.com)、`collectd`、[Dynatrace OneAgent](https://www.dynatrace.com/technologies/kubernetes-monitoring/)、[AppDynamics 代理](https://docs.appdynamics.com/display/CLOUD/Container+Visibility+with+Kubernetes)、[Datadog 代理](https://docs.datadoghq.com/agent/kubernetes/daemonset_setup/)、[New Relic 代理](https://docs.newrelic.com/docs/integrations/kubernetes-integration/installation/kubernetes-installation-configuration)、Ganglia `gmond` 或者 [Instana 代理](https://www.instana.com/supported-integrations/kubernetes-monitoring/)。 +- 在每个节点上运行集群存守护进程 +- 在每个节点上运行日志收集守护进程 +- 在每个节点上运行监控守护进程 -一个简单的用法是在所有的节点上都启动一个 DaemonSet,将被作为每种类型的 daemon 使用。 - -一个稍微复杂的用法是单独对每种 daemon 类型使用多个 DaemonSet,但具有不同的标志, +一种简单的用法是为每种类型的守护进程在所有的节点上都启动一个 DaemonSet。 +一个稍微复杂的用法是为同一种守护进程部署多个 DaemonSet;每个具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求。 - - - -您可以在 YAML 文件中描述 DaemonSet。例如,下面的 daemonset.yaml 文件描述了一个运行 fluentd-elasticsearch Docker 镜像的 DaemonSet: +你可以在 YAML 文件中描述 DaemonSet。 +例如,下面的 daemonset.yaml 文件描述了一个运行 fluentd-elasticsearch Docker 镜像的 DaemonSet: {{< codenew file="controllers/daemonset.yaml" >}} -* 基于 YAML 文件创建 DaemonSet: +基于 YAML 文件创建 DaemonSet: + ``` kubectl apply -f https://k8s.io/examples/controllers/daemonset.yaml ``` @@ -84,22 +75,32 @@ kubectl apply -f https://k8s.io/examples/controllers/daemonset.yaml ### Required Fields As with all other Kubernetes config, a DaemonSet needs `apiVersion`, `kind`, and `metadata` fields. For -general information about working with config files, see [deploying applications](/docs/user-guide/deploying-applications/), +general information about working with config files, see + [running stateless applications](/docs/tasks/run-application/run-stateless-application-deployment/), [configuring containers](/docs/tasks/), and [object management using kubectl](/docs/concepts/overview/working-with-objects/object-management/) documents. +The name of a DaemonSet object must be a valid +[DNS subdomain name](/docs/concepts/overview/working-with-objects/names#dns-subdomain-names). + A DaemonSet also needs a [`.spec`](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status) section. --> ### 必需字段 -和其它所有 Kubernetes 配置一样,DaemonSet 需要 `apiVersion`、`kind` 和 `metadata` 字段。有关配置文件的基本信息,详见文档 [部署应用](/docs/user-guide/deploying-applications/)、[配置容器](/docs/tasks/) 和 [使用 kubectl 进行对象管理](/docs/concepts/overview/object-management-kubectl/overview/)。 + +和所有其他 Kubernetes 配置一样,DaemonSet 需要 `apiVersion`、`kind` 和 `metadata` 字段。 +有关配置文件的基本信息,参见 +[部署应用](/zh/docs/tasks/run-application/run-stateless-application-deployment/)、 +[配置容器](/zh/docs/tasks/)和 +[使用 kubectl 进行对象管理](/zh/docs/concepts/overview/working-with-objects/object-management/) +文档。 + +DaemonSet 对象的名称必须是一个合法的 +[DNS 子域名](/zh/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)。 DaemonSet 也需要一个 [`.spec`](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status) 配置段。 -### Pod 模板 - +### Pod 模板 {#pod-template} + `.spec` 中唯一必需的字段是 `.spec.template`。 -`.spec.template` 是一个 [Pod 模板](/docs/concepts/workloads/pods/pod-overview/#pod-templates)。除了它是嵌套的,而且不具有 `apiVersion` 或 `kind` 字段,它与 [Pod](/docs/concepts/workloads/pods/pod/) 具有相同的 schema。 +`.spec.template` 是一个 [Pod 模板](/zh/docs/concepts/workloads/pods/#pod-templates)。 +除了它是嵌套的,因而不具有 `apiVersion` 或 `kind` 字段之外,它与 +{{< glossary_tooltip text="Pod" term_id="pod" >}} 具有相同的 schema。 -除了 Pod 必需字段外,在 DaemonSet 中的 Pod 模板必须指定合理的标签(查看 [Pod Selector](#pod-selector))。 +除了 Pod 必需字段外,在 DaemonSet 中的 Pod 模板必须指定合理的标签(查看 [Pod 选择算符](#pod-selector))。 -在 DaemonSet 中的 Pod 模板必须具有一个值为 `Always` 的 [`RestartPolicy`](/docs/user-guide/pod-states),或者未指定它的值,默认是 `Always`。 +在 DaemonSet 中的 Pod 模板必须具有一个值为 `Always` 的 +[`RestartPolicy`](/zh/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy)。 +当该值未指定时,默认是 `Always`。 -### Pod Selector {#pod-selector} - -`.spec.selector` 字段表示 Pod Selector,它与 [Job](/docs/concepts/jobs/run-to-completion-finite-workloads/) 的 `.spec.selector` 的作用是相同的。 +### Pod 选择算符 {#pod-selector} -从 Kubernetes 1.8 开始,您必须指定与 `.spec.template` 的标签匹配的 pod selector。当不配置时,pod selector 将不再有默认值。selector 默认与 `kubectl apply` 不兼容。 此外,一旦创建了 DaemonSet,它的 `.spec.selector` 就不能修改。修改 pod selector 可能导致 Pod 意外悬浮,并且这对用户来说是困惑的。 +`.spec.selector` 字段表示 Pod 选择算符,它与 +[Job](/zh/docs/concepts/workloads/controllers/job/) 的 `.spec.selector` 的作用是相同的。 + +从 Kubernetes 1.8 开始,您必须指定与 `.spec.template` 的标签匹配的 Pod 选择算符。 +用户不指定 Pod 选择算符时,该字段不再有默认值。 +选择算符的默认值生成结果与 `kubectl apply` 不兼容。 +此外,一旦创建了 DaemonSet,它的 `.spec.selector` 就不能修改。 +修改 Pod 选择算符可能导致 Pod 意外悬浮,并且这对用户来说是费解的。 -`spec.selector` 表示一个对象,它由如下两个字段组成: +`spec.selector` 是一个对象,如下两个字段组成: -* `matchLabels` - 与 [ReplicationController](/docs/concepts/workloads/controllers/replicationcontroller/) 的 `.spec.selector` 的作用相同。 -* `matchExpressions` - 允许构建更加复杂的 Selector,可以通过指定 key、value 列表 -,以及与 key 和 value 列表相关的操作符。 +* `matchLabels` - 与 [ReplicationController](/zh/docs/concepts/workloads/controllers/replicationcontroller/) + 的 `.spec.selector` 的作用相同。 +* `matchExpressions` - 允许构建更加复杂的选择器,可以通过指定 key、value + 列表以及将 key 和 value 列表关联起来的 operator。 -当上述两个字段都指定时,结果表示的是 AND 关系。 +当上述两个字段都指定时,结果会按逻辑与(AND)操作处理。 -如果指定了 `.spec.selector`,必须与 `.spec.template.metadata.labels` 相匹配。如果与它们配置的不匹配,则会被 API 拒绝。 +如果指定了 `.spec.selector`,必须与 `.spec.template.metadata.labels` 相匹配。 +如果与后者不匹配,则 DeamonSet 会被 API 拒绝。 -另外,通常不应直接通过另一个 DaemonSet 或另一个工作负载资源(例如 ReplicaSet)来创建其标签与该选择器匹配的任何 Pod。否则,DaemonSet {{< glossary_tooltip term_text="控制器" term_id="controller" >}}会认为这些 Pod 是由它创建的。Kubernetes 不会阻止你这样做。您可能要执行此操作的一种情况是,手动在节点上创建具有不同值的 Pod 进行测试。 +另外,通常不应直接通过另一个 DaemonSet 或另一个工作负载资源(例如 ReplicaSet) +来创建其标签与该选择器匹配的任何 Pod。否则,DaemonSet +{{< glossary_tooltip term_text="控制器" term_id="controller" >}} +会认为这些 Pod 是由它创建的。 +Kubernetes 不会阻止你这样做。 +你可能要执行此操作的一种情况是,手动在节点上创建具有不同值的 Pod 进行测试。 -### 仅在某些节点上运行 Pod - +### 仅在某些节点上运行 Pod + 如果指定了 `.spec.template.spec.nodeSelector`,DaemonSet Controller 将在能够与 [Node Selector](/docs/concepts/configuration/assign-pod-node/) 匹配的节点上创建 Pod。类似这种情况,可以指定 `.spec.template.spec.affinity`,然后 DaemonSet Controller 将在能够与 [node Affinity](/docs/concepts/configuration/assign-pod-node/) 匹配的节点上创建 Pod。 如果根本就没有指定,则 DaemonSet Controller 将在所有节点上创建 Pod。 @@ -192,7 +209,7 @@ If you do not specify either, then the DaemonSet controller will create Pods on --> ## 如何调度 Daemon Pods -### 通过默认 scheduler 调度 +### 通过默认调度器调度 {{< feature-state state="stable" for-kubernetes-version="1.17" >}} @@ -209,10 +226,15 @@ That introduces the following issues: is handled by default scheduler. When preemption is enabled, the DaemonSet controller will make scheduling decisions without considering pod priority and preemption. --> -DaemonSet 确保所有符合条件的节点都运行该 Pod 的一个副本。通常,运行 Pod 的节点由 Kubernetes 调度器抉择。不过,DaemonSet pods 由 DaemonSet 控制器创建和调度。这将引入以下问题: +DaemonSet 确保所有符合条件的节点都运行该 Pod 的一个副本。 +通常,运行 Pod 的节点由 Kubernetes 调度器选择。 +不过,DaemonSet pods 由 DaemonSet 控制器创建和调度。这就带来了以下问题: - * Pod 行为的不一致性:等待调度的正常 Pod 已被创建并处于 `Pending` 状态,但 DaemonSet pods 未在 `Pending` 状态下创建。 这使用户感到困惑。 - * [Pod preemption](/docs/concepts/configuration/pod-priority-preemption/)由默认 scheduler 处理。 启用抢占后,DaemonSet 控制器将在不考虑 pod 优先级和抢占的情况下制定调度决策。 +* Pod 行为的不一致性:正常 Pod 在被创建后等待调度时处于 `Pending` 状态, + DaemonSet Pods 创建后不会处于 `Pending` 状态下。这使用户感到困惑。 +* [Pod 抢占](/zh/docs/concepts/configuration/pod-priority-preemption/) + 由默认调度器处理。启用抢占后,DaemonSet 控制器将在不考虑 Pod 优先级和抢占 + 的情况下制定调度决策。 -`ScheduleDaemonSetPods` 允许您使用默认调度器而不是 DaemonSet 控制器来调度 DaemonSets,方法是将 `NodeAffinity` 添加到 DaemonSet pods,而不是 `.spec.nodeName`。 然后使用默认调度器将 pod 绑定到目标主机。 如果 DaemonSet pod 的亲和节点已存在,则替换它。 DaemonSet 控制器仅在创建或修改 DaemonSet pods 时执行这些操作,并且不对 DaemonSet 的 `spec.template` 进行任何更改。 +`ScheduleDaemonSetPods` 允许您使用默认调度器而不是 DaemonSet 控制器来调度 DaemonSets, +方法是将 `NodeAffinity` 条件而不是 `.spec.nodeName` 条件添加到 DaemonSet Pods。 +默认调度器接下来将 Pod 绑定到目标主机。 +如果 DaemonSet Pod 的节点亲和性配置已存在,则被替换。 +DaemonSet 控制器仅在创建或修改 DaemonSet Pod 时执行这些操作, +并且不回更改 DaemonSet 的 `spec.template`。 ```yaml nodeAffinity: @@ -241,7 +268,8 @@ In addition, `node.kubernetes.io/unschedulable:NoSchedule` toleration is added automatically to DaemonSet Pods. The default scheduler ignores `unschedulable` Nodes when scheduling DaemonSet Pods. --> -此外,系统会自动添加 `node.kubernetes.io/unschedulable:NoSchedule` 容忍度到 DaemonSet Pods。 在调度 DaemonSet Pod 时,默认调度器会忽略 `unschedulable` 节点。 +此外,系统会自动添加 `node.kubernetes.io/unschedulable:NoSchedule` 容忍度到 +DaemonSet Pods。在调度 DaemonSet Pod 时,默认调度器会忽略 `unschedulable` 节点。 -### 污点和容忍度 +### 污点和容忍度 {#taint-and-toleration} -尽管 Daemon Pods 遵循[污点和容忍度](/docs/concepts/configuration/taint-and-toleration) 规则,根据相关特性,会自动将以下容忍度添加到 DaemonSet Pods 中。 +尽管 Daemon Pods 遵循[污点和容忍度](/zh/docs/concepts/scheduling-eviction/taint-and-toleration) +规则,根据相关特性,控制器会自动将以下容忍度添加到 DaemonSet Pod: -| 容忍度关键词 | 影响 | 版本 | 描述 | +| 容忍度键名 | 效果 | 版本 | 描述 | | ---------------------------------------- | ---------- | ------- | ------------------------------------------------------------ | -| `node.kubernetes.io/not-ready` | NoExecute | 1.13+ | DaemonSet pods will not be evicted when there are node problems such as a network partition. | -| `node.kubernetes.io/unreachable` | NoExecute | 1.13+ | DaemonSet pods will not be evicted when there are node problems such as a network partition. | -| `node.kubernetes.io/disk-pressure` | NoSchedule | 1.8+ | | -| `node.kubernetes.io/memory-pressure` | NoSchedule | 1.8+ | | -| `node.kubernetes.io/unschedulable` | NoSchedule | 1.12+ | DaemonSet pods tolerate unschedulable attributes by default scheduler. | -| `node.kubernetes.io/network-unavailable` | NoSchedule | 1.12+ | DaemonSet pods, who uses host network, tolerate network-unavailable attributes by default scheduler. | - - +| `node.kubernetes.io/not-ready` | NoExecute | 1.13+ | 当出现类似网络断开的情况导致节点问题时,DaemonSet Pod 不会被逐出。 | +| `node.kubernetes.io/unreachable` | NoExecute | 1.13+ | 当出现类似于网络断开的情况导致节点问题时,DaemonSet Pod 不会被逐出。 | +| `node.kubernetes.io/disk-pressure` | NoSchedule | 1.8+ | | +| `node.kubernetes.io/memory-pressure` | NoSchedule | 1.8+ | | +| `node.kubernetes.io/unschedulable` | NoSchedule | 1.12+ | DaemonSet Pod 能够容忍默认调度器所设置的 `unschedulable` 属性. | +| `node.kubernetes.io/network-unavailable` | NoSchedule | 1.12+ | DaemonSet 在使用宿主网络时,能够容忍默认调度器所设置的 `network-unavailable` 属性。 | -## 与 Daemon Pods 通信 +## 与 Daemon Pods 通信 + 与 DaemonSet 中的 Pod 进行通信的几种可能模式如下: -- **Push**:将 DaemonSet 中的 Pod 配置为将更新发送到另一个 Service,例如统计数据库。 -- **NodeIP 和已知端口**:DaemonSet 中的 Pod 可以使用 `hostPort`,从而可以通过节点 IP 访问到 Pod。客户端能通过某种方法获取节点 IP 列表,并且基于此也可以获取到相应的端口。 -- **DNS**:创建具有相同 Pod Selector 的 [Headless Service](/docs/concepts/services-networking/service/#headless-services),然后通过使用 `endpoints` 资源或从 DNS 中检索到多个 A 记录来发现 DaemonSet。 -- **Service**:创建具有相同 Pod Selector 的 Service,并使用该 Service 随机访问到某个节点上的 daemon(没有办法访问到特定节点)。 +- **Push**:配置 DaemonSet 中的 Pod,将更新发送到另一个服务,例如统计数据库。 + 这些服务没有客户端。 + +- **NodeIP 和已知端口**:DaemonSet 中的 Pod 可以使用 `hostPort`,从而可以通过节点 IP + 访问到 Pod。客户端能通过某种方法获取节点 IP 列表,并且基于此也可以获取到相应的端口。 + +- **DNS**:创建具有相同 Pod 选择算符的 + [无头服务](/zh/docs/concepts/services-networking/service/#headless-services), + 通过使用 `endpoints` 资源或从 DNS 中检索到多个 A 记录来发现 DaemonSet。 + +- **Service**:创建具有相同 Pod 选择算符的服务,并使用该服务随机访问到某个节点上的 + 守护进程(没有办法访问到特定节点)。 -## 更新 DaemonSet - -如果修改了节点标签,DaemonSet 将立刻向新匹配上的节点添加 Pod,同时删除不能够匹配的节点上的 Pod。 +## 更新 DaemonSet -您可以修改 DaemonSet 创建的 Pod。然而,不允许对 Pod 的所有字段进行更新。当下次 -节点(即使具有相同的名称)被创建时,DaemonSet Controller 还会使用最初的模板。 +如果节点的标签被修改,DaemonSet 将立刻向新匹配上的节点添加 Pod, +同时删除不匹配的节点上的 Pod。 + +你可以修改 DaemonSet 创建的 Pod。不过并非 Pod 的所有字段都可更新。 +下次当某节点(即使具有相同的名称)被创建时,DaemonSet 控制器还会使用最初的模板。 -您可以删除一个 DaemonSet。如果使用 `kubectl` 并指定 `--cascade=false` 选项,则 Pod 将被保留在节点上。然后可以创建具有不同模板的新 DaemonSet。具有不同模板的新 DaemonSet 将能够通过标签匹配并识别所有已经存在的 Pod。 -如果有任何 Pod 需要替换,则 DaemonSet 根据它的 `updateStrategy` 来替换。 +您可以删除一个 DaemonSet。如果使用 `kubectl` 并指定 `--cascade=false` 选项, +则 Pod 将被保留在节点上。接下来如果创建使用相同选择算符的新 DaemonSet, +新的 DaemonSet 会收养已有的 Pod。 +如果有 Pod 需要被替换,DaemonSet 会根据其 `updateStrategy` 来替换。 + +你可以对 DaemonSet [执行滚动更新](/zh/docs/tasks/manage-daemon/update-daemon-set/)操作。 -## DaemonSet 的可替代选择 +## DaemonSet 的替代方案 ### init 脚本 @@ -339,13 +379,16 @@ running such processes via a DaemonSet: containers. However, this can also be accomplished by running the daemons in a container but not in a Pod (e.g. start directly via Docker). --> -我们很可能希望直接在一个节点上启动 daemon 进程(例如,使用 `init`、`upstartd`、或 `systemd`)。这非常好,但基于 DaemonSet 来运行这些进程有如下一些好处: +直接在节点上启动守护进程(例如使用 `init`、`upstartd` 或 `systemd`)的做法当然是可行的。 +不过,基于 DaemonSet 来运行这些进程有如下一些好处: -- 像对待应用程序一样,具备为 daemon 提供监控和管理日志的能力。 +- 像所运行的其他应用一样,DaemonSet 具备为守护进程提供监控和日志管理的能力。 -- 为 daemon 和应用程序使用相同的配置语言和工具(如 Pod 模板、`kubectl`)。 +- 为守护进程和应用所使用的配置语言和工具(如 Pod 模板、`kubectl`)是相同的。 -- 在资源受限的容器中运行 daemon,能够增加 daemon 和应用容器的隔离性。然而,这也实现了在容器中运行 daemon,但却不能在 Pod 中运行(例如,直接基于 Docker 启动)。 +- 在资源受限的容器中运行守护进程能够增加守护进程和应用容器的隔离性。 + 然而,这一点也可以通过在容器中运行守护进程但却不在 Pod 中运行之来实现。 + 例如,直接基于 Docker 启动。 ### 裸 Pod -可能要直接创建 Pod,同时指定其运行在特定的节点上。然而,DaemonSet 替换了由于任何原因被删除或终止的 Pod,例如节点失败、例行节点维护、内核升级。由于这个原因,我们应该使用 DaemonSet 而不是单独创建 Pod。 +直接创建 Pod并指定其运行在特定的节点上也是可以的。 +然而,DaemonSet 能够替换由于任何原因(例如节点失败、例行节点维护、内核升级) +而被删除或终止的 Pod。 +由于这个原因,你应该使用 DaemonSet 而不是单独创建 Pod。 ### 静态 Pod -可能需要通过在一个指定目录下编写文件来创建 Pod,该目录受 Kubelet 所监视。这些 Pod 被称为 [静态 Pod](/docs/concepts/cluster-administration/static-pod/)。 -不像 DaemonSet,静态 Pod 不受 kubectl 和其它 Kubernetes API 客户端管理。静态 Pod 不依赖于 apiserver,这使得它们在集群启动的情况下非常有用。而且,未来静态 Pod 可能会被废弃掉。 +通过在一个指定的、受 `kubelet` 监视的目录下编写文件来创建 Pod 也是可行的。 +这类 Pod 被称为[静态 Pod](/zh/docs/tasks/configure-pod-container/static-pod/)。 +不像 DaemonSet,静态 Pod 不受 `kubectl` 和其它 Kubernetes API 客户端管理。 +静态 Pod 不依赖于 API 服务器,这使得它们在启动引导新集群的情况下非常有用。 +此外,静态 Pod 在将来可能会被废弃。 ### Deployments -DaemonSet 与 [Deployments](/docs/concepts/workloads/controllers/deployment/) 非常类似,它们都能创建 Pod,这些 Pod 对应的进程都不希望被终止掉(例如,Web 服务器、存储服务器)。 -为无状态的 Service 使用 Deployments,比如前端 Frontend 服务,实现对副本的数量进行扩缩容、平滑升级,比基于精确控制 Pod 运行在某个主机上要重要得多。 -需要 Pod 副本总是运行在全部或特定主机上,并需要先于其他 Pod 启动,当这被认为非常重要时,应该使用 Daemon Controller。 - +DaemonSet 与 [Deployments](/zh/docs/concepts/workloads/controllers/deployment/) 非常类似, +它们都能创建 Pod,并且 Pod 中的进程都不希望被终止(例如,Web 服务器、存储服务器)。 +建议为无状态的服务使用 Deployments,比如前端服务。 +对这些服务而言,对副本的数量进行扩缩容、平滑升级,比精确控制 Pod 运行在某个主机上要重要得多。 +当需要 Pod 副本总是运行在全部或特定主机上,并需要它们先于其他 Pod 启动时, +应该使用 DaemonSet。 diff --git a/content/zh/docs/concepts/workloads/controllers/garbage-collection.md b/content/zh/docs/concepts/workloads/controllers/garbage-collection.md index 7e7802999e..0c34eda433 100644 --- a/content/zh/docs/concepts/workloads/controllers/garbage-collection.md +++ b/content/zh/docs/concepts/workloads/controllers/garbage-collection.md @@ -1,15 +1,13 @@ --- title: 垃圾收集 content_type: concept -weight: 60 +weight: 70 --- @@ -18,11 +16,7 @@ weight: 60 The role of the Kubernetes garbage collector is to delete certain objects that once had an owner, but no longer have an owner. --> - -Kubernetes 垃圾收集器的作用是删除某些曾经拥有所有者(owner)但现在不再拥有所有者的对象。 - - - +Kubernetes 垃圾收集器的作用是删除某些曾经拥有属主(Owner)但现在不再拥有属主的对象。 @@ -41,24 +35,29 @@ automatically sets the value of `ownerReference` for objects created or adopted by ReplicationController, ReplicaSet, StatefulSet, DaemonSet, Deployment, Job and CronJob. +--> +## 属主和附属 {#owners-and-dependents} + +某些 Kubernetes 对象是其它一些对象的属主。 +例如,一个 ReplicaSet 是一组 Pod 的属主。 +具有属主的对象被称为是属主的 *附属* 。 +每个附属对象具有一个指向其所属对象的 `metadata.ownerReferences` 字段。 + +有时,Kubernetes 会自动设置 `ownerReference` 的值。 +例如,当创建一个 ReplicaSet 时,Kubernetes 自动设置 ReplicaSet 中每个 Pod 的 `ownerReference` 字段值。 +在 Kubernetes 1.8 版本,Kubernetes 会自动为某些对象设置 `ownerReference` 的值。 +这些对象是由 ReplicationController、ReplicaSet、StatefulSet、DaemonSet、Deployment、 +Job 和 CronJob 所创建或管理的。 + + +你也可以通过手动设置 `ownerReference` 的值,来指定属主和附属之间的关系。 -## 所有者和附属 - -某些 Kubernetes 对象是其它一些对象的所有者。例如,一个 ReplicaSet 是一组 Pod 的所有者。 -具有所有者的对象被称为是所有者的 *附属* 。 -每个附属对象具有一个指向其所属对象的 `metadata.ownerReferences` 字段。 - -有时,Kubernetes 会自动设置 `ownerReference` 的值。 -例如,当创建一个 ReplicaSet 时,Kubernetes 自动设置 ReplicaSet 中每个 Pod 的 `ownerReference` 字段值。 -在 Kubernetes 1.8 版本,Kubernetes 会自动为某些对象设置 `ownerReference` 的值,这些对象是由 ReplicationController、ReplicaSet、StatefulSet、DaemonSet、Deployment、Job 和 CronJob 所创建或管理。 -也可以通过手动设置 `ownerReference` 的值,来指定所有者和附属之间的关系。 - -这里有一个配置文件,表示一个具有 3 个 Pod 的 ReplicaSet: +下面的配置文件中包含一个具有 3 个 Pod 的 ReplicaSet: {{< codenew file="controllers/replicaset.yaml" >}} @@ -66,8 +65,7 @@ Here's a configuration file for a ReplicaSet that has three Pods: If you create the ReplicaSet and then view the Pod metadata, you can see OwnerReferences field: --> - -如果创建该 ReplicaSet,然后查看 Pod 的 metadata 字段,能够看到 OwnerReferences 字段: +如果你创建该 ReplicaSet,然后查看 Pod 的 metadata 字段,能够看到 OwnerReferences 字段: ```shell kubectl apply -f https://k8s.io/examples/controllers/replicaset.yaml @@ -77,8 +75,7 @@ kubectl get pods --output=yaml - -输出显示了 Pod 的所有者是名为 my-repset 的 ReplicaSet: +输出显示了 Pod 的属主是名为 my-repset 的 ReplicaSet: ```yaml apiVersion: v1 @@ -103,9 +100,9 @@ and owners that are cluster-scoped. namespace-scoped owners. --> {{< note >}} -根据设计,kubernetes 不允许跨命名空间指定所有者。这意味着: -1)命名空间范围的附属只能在相同的命名空间中指定所有者,并且只能指定集群范围的所有者。 -2)集群范围的附属只能指定集群范围的所有者,不能指定命名空间范围的。 +根据设计,kubernetes 不允许跨命名空间指定属主。这意味着: +1)命名空间范围的附属只能指定同一的命名空间中的或者集群范围的属主。 +2)集群范围的附属只能指定集群范围的属主,不能指定命名空间范围的属主。 {{< /note >}} -## 控制垃圾收集器删除附属者 +## 控制垃圾收集器删除附属 -当删除对象时,可以指定该对象的附属者是否也自动删除掉。 -自动删除 Dependent 也称为 *级联删除* 。 -Kubernetes 中有两种 *级联删除* 的模式:*background* 模式和 *foreground* 模式。 - -如果删除对象时,不自动删除它的附属者,这些附属者被称作是原对象的 *orphaned* 。 +当你删除对象时,可以指定该对象的附属是否也自动删除。 +自动删除附属的行为也称为 *级联删除(Cascading Deletion)* 。 +Kubernetes 中有两种 *级联删除* 模式:*后台(Background)* 模式和 *前台(Foreground)* 模式。 +如果删除对象时,不自动删除它的附属,这些附属被称作 *孤立对象(Orphaned)* 。 -### 显式级联删除 - -在 *显式级联删除* 模式下,根对象首先进入 `deletion in progress` 状态。在 `deletion in progress` 状态会有如下的情况: +### 前台级联删除 + +在 *前台级联删除* 模式下,根对象首先进入 `deletion in progress` 状态。 +在 `deletion in progress` 状态,会有如下的情况: * 对象仍然可以通过 REST API 可见。 - * 会设置对象的 `deletionTimestamp` 字段。 - * 对象的 `metadata.finalizers` 字段包含了值 `foregroundDeletion`。 + * 对象的 `deletionTimestamp` 字段被设置。 + * 对象的 `metadata.finalizers` 字段包含值 `foregroundDeletion`。 一旦对象被设置为 `deletion in progress` 状态,垃圾收集器会删除对象的所有附属。 -垃圾收集器在删除了所有 `Blocking` 状态的附属(对象的 `ownerReference.blockOwnerDeletion=true`)之后,它会删除拥有者对象。 +垃圾收集器在删除了所有有阻塞能力的附属(对象的 `ownerReference.blockOwnerDeletion=true`) +之后,删除属主对象。 -注意,在 `foregroundDeletion` 模式下,只有设置了 `ownerReference.blockOwnerDeletion` 值的附属者才能阻止删除拥有者对象。 -在 Kubernetes 1.7 版本中将增加[准入控制器](/docs/reference/access-authn-authz/admission-controllers/#ownerreferencespermissionenforcement),基于拥有者对象上的删除权限来控制用户去设置 `blockOwnerDeletion` 的值为 true,所以未授权的附属者不能够延迟拥有者对象的删除。 - -如果一个对象的 `ownerReferences` 字段被一个 Controller(例如 Deployment 或 ReplicaSet)设置,`blockOwnerDeletion` 会被自动设置,不需要手动修改这个字段。 +注意,在 `foregroundDeletion` 模式下,只有设置了 `ownerReference.blockOwnerDeletion` +值的附属才能阻止删除属主对象。 +在 Kubernetes 1.7 版本增加了 +[准入控制器](/zh/docs/reference/access-authn-authz/admission-controllers/#ownerreferencespermissionenforcement), +基于属主对象上的删除权限来控制用户设置 `blockOwnerDeletion` 的值为 True, +这样未经授权的附属不能够阻止属主对象的删除。 +如果一个对象的 `ownerReferences` 字段被一个控制器(例如 Deployment 或 ReplicaSet)设置, +`blockOwnerDeletion` 也会被自动设置,你不需要手动修改这个字段。 -### 隐式级联删除 +### 后台级联删除 -在 *隐式级联删除* 模式下,Kubernetes 会立即删除拥有者对象,然后垃圾收集器会在后台删除这些附属值。 +在 *后台级联删除* 模式下,Kubernetes 会立即删除属主对象,之后垃圾收集器 +会在后台删除其附属对象。 - ### 设置级联删除策略 -通过为拥有者对象设置 `deleteOptions.propagationPolicy` 字段,可以控制级联删除策略。 -可能的取值包括:`orphan`、`Foreground` 或者 `Background`。 - -对很多 Controller 资源,包括 ReplicationController、ReplicaSet、StatefulSet、DaemonSet 和 Deployment,默认的垃圾收集策略是 `orphan`。 -因此,对于使用 `extensions/v1beta1`、`apps/v1beta1` 和 `apps/v1beta2` 组版本中的 `Kind`,除非指定其它的垃圾收集策略,否则所有附属对象默认使用的都是 `orphan` 策略。 +通过为属主对象设置 `deleteOptions.propagationPolicy` 字段,可以控制级联删除策略。 +可能的取值包括:`Orphan`、`Foreground` 或者 `Background`。 -下面是一个在 `Background` 中删除 Dependent 对象的示例: +下面是一个在后台删除附属对象的示例: ```shell kubectl proxy --port=8080 @@ -223,7 +214,7 @@ curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/replicasets/my-rep Here's an example that deletes dependents in foreground: --> -下面是一个在 `Foreground` 中删除附属对象的示例: +下面是一个在前台中删除附属对象的示例: ```shell kubectl proxy --port=8080 @@ -235,8 +226,7 @@ curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/replicasets/my-rep - -这里是一个 `Orphan` 附属的示例: +下面是一个令附属成为孤立对象的示例: ```shell kubectl proxy --port=8080 @@ -247,17 +237,18 @@ curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/replicasets/my-rep +`kubectl` 命令也支持级联删除。 +通过设置 `--cascade` 为 `true`,可以使用 kubectl 自动删除附属对象。 +设置 `--cascade` 为 `false`,会使附属对象成为孤立附属对象。 +`--cascade` 的默认值是 true。 -kubectl 也支持级联删除。 -通过设置 `--cascade` 为 `true`,可以使用 kubectl 自动删除附属对象。设置 `--cascade` 为 `false`,会使附属对象成为孤儿附属对象。`--cascade` 的默认值是 true。 - -下面是一个例子,使一个 ReplicaSet 的附属对象成为孤儿附属: +下面是一个例子,使一个 ReplicaSet 的附属对象成为孤立附属: ```shell kubectl delete replicaset my-repset --cascade=false @@ -271,40 +262,30 @@ to delete not only the ReplicaSets created, but also their Pods. If this type of is not used, only the ReplicaSets will be deleted, and the Pods will be orphaned. See [kubeadm/#149](https://github.com/kubernetes/kubeadm/issues/149#issuecomment-284766613) for more information. --> +### Deployment 的附加说明 -### Deployment 的其他说明 +在 1.7 之前的版本中,当在 Deployment 中使用级联删除时,你 *必须*使用 +`propagationPolicy:Foreground` 模式以便在删除所创建的 ReplicaSet 的同时,还删除其 Pod。 +如果不使用这种类型的 `propagationPolicy`,将只删除 ReplicaSet,而 Pod 被孤立。 -在 1.7 之前的版本中,当在 Deployment 中使用级联删除时,您必须*使用* `propagationPolicy:Foreground` 模式。这样不仅删除所创建的 ReplicaSet,还删除其 Pod。如果不使用这种类型的 `propagationPolicy`,则将只删除 ReplicaSet,而 Pod 被孤立。 - -更多信息,请参考 [kubeadm/#149](https://github.com/kubernetes/kubeadm/issues/149#issuecomment-284766613)。 +有关信息请参考 [kubeadm/#149](https://github.com/kubernetes/kubeadm/issues/149#issuecomment-284766613)。 - ## 已知的问题 跟踪 [#26120](https://github.com/kubernetes/kubernetes/issues/26120) - - - ## {{% heading "whatsnext" %}} - - -[设计文档 1](https://git.k8s.io/community/contributors/design-proposals/api-machinery/garbage-collection.md) - -[设计文档 2](https://git.k8s.io/community/contributors/design-proposals/api-machinery/synchronous-garbage-collection.md) - - - - +* [设计文档 1](https://git.k8s.io/community/contributors/design-proposals/api-machinery/garbage-collection.md) +* [设计文档 2](https://git.k8s.io/community/contributors/design-proposals/api-machinery/synchronous-garbage-collection.md) diff --git a/content/zh/docs/concepts/workloads/controllers/job.md b/content/zh/docs/concepts/workloads/controllers/job.md index 0a5dfd8291..3156ff6a53 100644 --- a/content/zh/docs/concepts/workloads/controllers/job.md +++ b/content/zh/docs/concepts/workloads/controllers/job.md @@ -497,7 +497,7 @@ cleaned up by CronJobs based on the specified capacity-based cleanup policy. ### TTL mechanism for finished Jobs --> -## 自动清理完成的 Job +## 自动清理完成的 Job {#clean-up-finished-jobs-automatically} 完成的 Job 通常不需要留存在系统中。在系统中一直保留它们会给 API 服务器带来额外的压力。 diff --git a/content/zh/docs/concepts/workloads/controllers/replicaset.md b/content/zh/docs/concepts/workloads/controllers/replicaset.md index 962b7dfc0b..76e06b6490 100644 --- a/content/zh/docs/concepts/workloads/controllers/replicaset.md +++ b/content/zh/docs/concepts/workloads/controllers/replicaset.md @@ -1,8 +1,4 @@ --- -reviewers: -- Kashomon -- bprashanth -- madhusudancs title: ReplicaSet content_type: concept weight: 10 @@ -11,19 +7,59 @@ weight: 10 -ReplicaSet 是下一代的 Replication Controller。 _ReplicaSet_ 和 [_Replication Controller_](/docs/concepts/workloads/controllers/replicationcontroller/) 的唯一区别是选择器的支持。ReplicaSet 支持新的基于集合的选择器需求,这在[标签用户指南](/docs/concepts/overview/working-with-objects/labels/#label-selectors)中有描述。而 Replication Controller 仅支持基于相等选择器的需求。 - - +ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 +因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。 + +## ReplicaSet 的工作原理 {#how-a-replicaset-works} + +RepicaSet 是通过一组字段来定义的,包括一个用来识别可获得的 Pod +的集合的选择算符,一个用来标明应该维护的副本个数的数值,一个用来指定应该创建新 Pod +以满足副本个数条件时要使用的 Pod 模板等等。每个 ReplicaSet 都通过根据需要创建和 +删除 Pod 以使得副本个数达到期望值,进而实现其存在价值。当 ReplicaSet 需要创建 +新的 Pod 时,会使用所提供的 Pod 模板。 + + +ReplicaSet 通过 Pod 上的 +[metadata.ownerReferences](/zh/docs/concepts/workloads/controllers/garbage-collection/#owners-and-dependents) +字段连接到附属 Pod,该字段给出当前对象的属主资源。 +ReplicaSet 所获得的 Pod 都在其 ownerReferences 字段中包含了属主 ReplicaSet +的标识信息。正是通过这一连接,ReplicaSet 知道它所维护的 Pod 集合的状态, +并据此计划其操作行为。 + + +ReplicaSet 使用其选择算符来辨识要获得的 Pod 集合。如果某个 Pod 没有 +OwnerReference 或者其 OwnerReference 不是一个 +{{< glossary_tooltip text="控制器" term_id="controller" >}},且其匹配到 +某 ReplicaSet 的选择算符,则该 Pod 立即被此 ReplicaSet 获得。 - -## 怎样使用 ReplicaSet +## 怎样使用 ReplicaSet {#how-to-use-a-replicaset} 大多数支持 Replication Controllers 的[`kubectl`](/docs/user-guide/kubectl/)命令也支持 ReplicaSets。但[`rolling-update`](/docs/reference/generated/kubectl/kubectl-commands#rolling-update) 命令是个例外。如果您想要滚动更新功能请考虑使用 Deployment。[`rolling-update`](/docs/reference/generated/kubectl/kubectl-commands#rolling-update) 命令是必需的,而 Deployment 是声明性的,因此我们建议通过 [`rollout`](/docs/reference/generated/kubectl/kubectl-commands#rollout)命令使用 Deployment。 diff --git a/content/zh/docs/concepts/workloads/controllers/replicationcontroller.md b/content/zh/docs/concepts/workloads/controllers/replicationcontroller.md index e5b8b0941a..b719c0661f 100644 --- a/content/zh/docs/concepts/workloads/controllers/replicationcontroller.md +++ b/content/zh/docs/concepts/workloads/controllers/replicationcontroller.md @@ -31,7 +31,8 @@ weight: 20 A [`Deployment`](/docs/concepts/workloads/controllers/deployment/) that configures a [`ReplicaSet`](/docs/concepts/workloads/controllers/replicaset/) is now the recommended way to set up replication. --> {{< note >}} -现在推荐使用配置 [`ReplicaSet`](/docs/concepts/workloads/controllers/replicaset/) 的 [`Deployment`](/docs/concepts/workloads/controllers/deployment/) 来建立副本管理机制。 +现在推荐使用配置 [`ReplicaSet`](/zh/docs/concepts/workloads/controllers/replicaset/) 的 +[`Deployment`](/zh/docs/concepts/workloads/controllers/deployment/) 来建立副本管理机制。 {{< /note >}} -_ReplicationController_ 确保在任何时候都有特定数量的 pod 副本处于运行状态。 -换句话说,ReplicationController 确保一个 pod 或一组同类的 pod 总是可用的。 - - +_ReplicationController_ 确保在任何时候都有特定数量的 Pod 副本处于运行状态。 +换句话说,ReplicationController 确保一个 Pod 或一组同类的 Pod 总是可用的。 -## ReplicationController 如何工作 - -当 pod 数量过多时,ReplicationController 会终止多余的 pod。当 pod 数量太少时,ReplicationController 将会启动新的 pod。 -与手动创建的 pod 不同,由 ReplicationController 创建的 pod 在失败、被删除或被终止时会被自动替换。 -例如,在中断性维护(如内核升级)之后,您的 pod 会在节点上重新创建。 -因此,即使您的应用程序只需要一个 pod,您也应该使用 ReplicationController 创建 Pod。 -ReplicationController 类似于进程管理器,但是 ReplicationController 不是监控单个节点上的单个进程,而是监控跨多个节点的多个 pod。 +## ReplicationController 如何工作 + +当 Pod 数量过多时,ReplicationController 会终止多余的 Pod。当 Pod 数量太少时,ReplicationController 将会启动新的 Pod。 +与手动创建的 Pod 不同,由 ReplicationController 创建的 Pod 在失败、被删除或被终止时会被自动替换。 +例如,在中断性维护(如内核升级)之后,你的 Pod 会在节点上重新创建。 +因此,即使你的应用程序只需要一个 Pod,你也应该使用 ReplicationController 创建 Pod。 +ReplicationController 类似于进程管理器,但是 ReplicationController 不是监控单个节点上的单个进程,而是监控跨多个节点的多个 Pod。 ## 运行一个示例 ReplicationController -这个示例 ReplicationController 配置运行 nginx web 服务器的三个副本。 +这个示例 ReplicationController 配置运行 nginx Web 服务器的三个副本。 {{< codenew file="controllers/replication.yaml" >}} @@ -143,19 +141,20 @@ A little later, the same command may show: 在这里,创建了三个 Pod,但没有一个 Pod 正在运行,这可能是因为正在拉取镜像。 稍后,相同的命令可能会显示: -```shell +``` Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed ``` -要以机器可读的形式列出属于 ReplicationController 的所有 pod,可以使用如下命令: +要以机器可读的形式列出属于 ReplicationController 的所有 Pod,可以使用如下命令: ```shell pods=$(kubectl get pods --selector=app=nginx --output=jsonpath={.items..metadata.name}) echo $pods ``` + ``` nginx-3ntk0 nginx-4ok8v nginx-qrm3m ``` @@ -165,8 +164,8 @@ Here, the selector is the same as the selector for the ReplicationController (se `kubectl describe` output), and in a different form in `replication.yaml`. The `--output=jsonpath` option specifies an expression that just gets the name from each pod in the returned list. --> -这里,选择器与 ReplicationController 的选择器相同(参见 `kubectl describe` 输出),并以不同的形式出现在 `replication.yaml` 中。 -`--output=jsonpath` 选项指定了一个表达式,只从返回列表中的每个 pod 中获取名称。 +这里,选择算符与 ReplicationController 的选择算符相同(参见 `kubectl describe` 输出),并以不同的形式出现在 `replication.yaml` 中。 +`--output=jsonpath` 选项指定了一个表达式,只从返回列表中的每个 Pod 中获取名称。 -### Pod 模板 - +### Pod 模板 {#pod-template} + `.spec.template` 是 `.spec` 的唯一必需字段。 -`.spec.template` 是一个 [pod 模板](/docs/concepts/workloads/pods/pod-overview/#pod-templates)。它的模式与 [pod](/docs/concepts/workloads/pods/pod/) 完全相同,只是它是嵌套的,没有 `apiVersion` 或 `kind` 属性。 +`.spec.template` 是一个 [Pod 模板](/zh/docs/concepts/workloads/pods/#pod-templates)。 +它的模式与 [Pod](/zh/docs/concepts/workloads/pods/) 完全相同,只是它是嵌套的,没有 `apiVersion` 或 `kind` 属性。 -除了 Pod 所需的字段外,ReplicationController 中的 pod 模板必须指定适当的标签和适当的重新启动策略。 -对于标签,请确保不与其他控制器重叠。参考 [pod 选择器](#pod-selector)。 +除了 Pod 所需的字段外,ReplicationController 中的 Pod 模板必须指定适当的标签和适当的重新启动策略。 +对于标签,请确保不与其他控制器重叠。参考 [Pod 选择算符](#pod-selector)。 -只允许 [`.spec.template.spec.restartPolicy`](/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy) 等于 `Always`,如果没有指定,这是默认值。 +只允许 [`.spec.template.spec.restartPolicy`](/zh/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy) 等于 `Always`,如果没有指定,这是默认值。 对于本地容器重启,ReplicationController 委托给节点上的代理, -例如 [Kubelet](/docs/admin/kubelet/) 或 Docker。 +例如 [Kubelet](/docs/reference/command-line-toolls-reference/kubelet/) 或 Docker。 -### Pod 选择器 {#pod-selector} - -`.spec.selector` 字段是一个[标签选择器](/docs/concepts/overview/working-with-objects/labels/#label-selectors)。 -ReplicationController 管理标签与选择器匹配的所有 Pod。 +### Pod 选择算符 {#pod-selector} + +`.spec.selector` 字段是一个[标签选择算符](/zh/docs/concepts/overview/working-with-objects/labels/#label-selectors)。 +ReplicationController 管理标签与选择算符匹配的所有 Pod。 它不区分它创建或删除的 Pod 和其他人或进程创建或删除的 Pod。 这允许在不影响正在运行的 Pod 的情况下替换 ReplicationController。 @@ -262,10 +260,11 @@ from doing this. If you do end up with multiple controllers that have overlapping selectors, you will have to manage the deletion yourself (see [below](#working-with-replicationcontrollers)). --> -另外,通常不应直接使用另一个 ReplicationController 或另一个控制器(例如 Job)来创建其标签与该选择器匹配的任何 Pod。如果这样做,ReplicationController 会认为它创建了这些 Pod。 +另外,通常不应直接使用另一个 ReplicationController 或另一个控制器(例如 Job) +来创建其标签与该选择算符匹配的任何 Pod。如果这样做,ReplicationController 会认为它创建了这些 Pod。 Kubernetes 并没有阻止你这样做。 -如果您的确创建了多个控制器并且其选择器之间存在重叠,那么您将不得不自己管理删除操作(参考[后文](#working-with-replicationcontrollers))。 +如果你的确创建了多个控制器并且其选择算符之间存在重叠,那么你将不得不自己管理删除操作(参考[后文](#working-with-replicationcontrollers))。 -## 使用 ReplicationController {#working-with-replicationcontrollers} - +## 使用 ReplicationController {#working-with-replicationcontrollers} + ### 删除一个 ReplicationController 以及它的 Pod -要删除一个 ReplicationController 以及它的 Pod,使用 [`kubectl delete`](/docs/reference/generated/kubectl/kubectl-commands#delete)。 +要删除一个 ReplicationController 以及它的 Pod,使用 +[`kubectl delete`](/docs/reference/generated/kubectl/kubectl-commands#delete)。 kubectl 将 ReplicationController 缩放为 0 并等待以便在删除 ReplicationController 本身之前删除每个 Pod。 如果这个 kubectl 命令被中断,可以重新启动它。 -当使用 REST API 或 go 客户端库时,您需要明确地执行这些步骤(缩放副本为 0、 等待 Pod 删除,之后删除 ReplicationController 资源)。 +当使用 REST API 或 go 客户端库时,你需要明确地执行这些步骤(缩放副本为 0、 等待 Pod 删除,之后删除 ReplicationController 资源)。 -### 只删除 ReplicationController - -你可以删除一个 ReplicationController 而不影响它的任何 pod。 +### 只删除 ReplicationController -使用 kubectl ,为 [`kubectl delete`](/docs/reference/generated/kubectl/kubectl-commands#delete) 指定 `--cascade=false` 选项。 +你可以删除一个 ReplicationController 而不影响它的任何 Pod。 -当使用 REST API 或 go 客户端库时, 只需删除 ReplicationController 对象。 +使用 kubectl,为 [`kubectl delete`](/docs/reference/generated/kubectl/kubectl-commands#delete) 指定 `--cascade=false` 选项。 + +当使用 REST API 或 go 客户端库时,只需删除 ReplicationController 对象。 -### 从 ReplicationController 中隔离 pod +### 从 ReplicationController 中隔离 Pod -通过更改 Pod 的标签,可以从 ReplicationController 的目标中删除 pod。 -此技术可用于从服务中删除 pod 以进行调试、数据恢复等。以这种方式删除的 pod 将自动替换(假设复制副本的数量也没有更改)。 +通过更改 Pod 的标签,可以从 ReplicationController 的目标中删除 Pod。 +此技术可用于从服务中删除 Pod 以进行调试、数据恢复等。以这种方式删除的 Pod 将自动替换(假设复制副本的数量也没有更改)。 -### 重新调度 +### 重新调度 {#rescheduling} -如上所述,无论您想要继续运行 1 个 pod 还是 1000 个 Pod,一个 ReplicationController 都将确保存在指定数量的 pod,即使在节点故障或 pod 终止(例如,由于另一个控制代理的操作)的情况下也是如此。 +如上所述,无论你想要继续运行 1 个 Pod 还是 1000 个 Pod,一个 ReplicationController 都将确保存在指定数量的 Pod,即使在节点故障或 Pod 终止(例如,由于另一个控制代理的操作)的情况下也是如此。 -### 扩缩容 +### 扩缩容 {#scaling} 通过简单地更新 `replicas` 字段,ReplicationController 可以方便地横向扩容或缩容副本的数量,或手动或通过自动缩放控制代理。 -### 滚动更新 {#rolling-updates} - -ReplicationController 的设计目的是通过逐个替换 pod 以方便滚动更新服务。 +### 滚动更新 {#rolling-updates} -如 [#1353](http://issue.k8s.io/1353) PR 中所述,建议的方法是使用 1 个副本创建一个新的 ReplicationController,逐个缩放新的(+1)和旧的(-1)控制器,然后在旧的控制器达到 0 个副本后将其删除。这一方法能够实现可控的 Pod 集合更新,即使存在意外失效的状况。 +ReplicationController 的设计目的是通过逐个替换 Pod 以方便滚动更新服务。 + +如 [#1353](https://issue.k8s.io/1353) PR 中所述,建议的方法是使用 1 个副本创建一个新的 ReplicationController, +逐个扩容新的(+1)和缩容旧的(-1)控制器,然后在旧的控制器达到 0 个副本后将其删除。 +这一方法能够实现可控的 Pod 集合更新,即使存在意外失效的状况。 理想情况下,滚动更新控制器将考虑应用程序的就绪情况,并确保在任何给定时间都有足够数量的 Pod 有效地提供服务。 -这两个 ReplicationController 将需要创建至少具有一个不同标签的 pod,比如 pod 主要容器的镜像标签,因为通常是镜像更新触发滚动更新。 +这两个 ReplicationController 将需要创建至少具有一个不同标签的 Pod,比如 Pod 主要容器的镜像标签,因为通常是镜像更新触发滚动更新。 -滚动更新是在客户端工具 [`kubectl rolling-update`](/docs/reference/generated/kubectl/kubectl-commands#rolling-update) 中实现的。 访问 [`kubectl rolling-update` 任务](/docs/tasks/run-application/rolling-update-replication-controller/)以获得更多的具体示例。 +滚动更新是在客户端工具 [`kubectl rolling-update`](/docs/reference/generated/kubectl/kubectl-commands#rolling-update) +中实现的。访问 [`kubectl rolling-update` 任务](/zh/docs/tasks/run-application/rolling-update-replication-controller/)以获得更多的具体示例。 -### 多个版本跟踪 - +### 多个版本跟踪 + 除了在滚动更新过程中运行应用程序的多个版本之外,通常还会使用多个版本跟踪来长时间,甚至持续运行多个版本。这些跟踪将根据标签加以区分。 -例如,一个服务可能把具有 `tier in (frontend), environment in (prod)` 的所有 pod 作为目标。 -现在假设您有 10 个副本的 pod 组成了这个层。但是你希望能够 `canary` (`金丝雀`)发布这个组件的新版本。 -您可以为大部分副本设置一个 ReplicationController,其中 `replicas` 设置为 9,标签为 `tier=frontend, environment=prod, track=stable` 而为 `canary` 设置另一个 ReplicationController,其中 `replicas` 设置为 1,标签为 `tier=frontend, environment=prod, track=canary`。 -现在这个服务覆盖了 `canary` 和非 `canary` Pod。但您可以单独处理 ReplicationController,以测试、监控结果等。 +例如,一个服务可能把具有 `tier in (frontend), environment in (prod)` 的所有 Pod 作为目标。 +现在假设你有 10 个副本的 Pod 组成了这个层。但是你希望能够 `canary` (`金丝雀`)发布这个组件的新版本。 +你可以为大部分副本设置一个 ReplicationController,其中 `replicas` 设置为 9, +标签为 `tier=frontend, environment=prod, track=stable` 而为 `canary` +设置另一个 ReplicationController,其中 `replicas` 设置为 1, +标签为 `tier=frontend, environment=prod, track=canary`。 +现在这个服务覆盖了 `canary` 和非 `canary` Pod。但你可以单独处理 ReplicationController,以测试、监控结果等。 ## ReplicationController 的职责 - -ReplicationController 只需确保所需的 pod 数量与其标签选择器匹配,并且是可操作的。 -目前,它的计数中只排除终止的 pod。 -未来,可能会考虑系统提供的[就绪状态](http://issue.k8s.io/620)和其他信息,我们可能会对替换策略添加更多控制,我们计划发出事件,这些事件可以被外部客户端用来实现任意复杂的替换和/或缩减策略。 +ReplicationController 只需确保所需的 Pod 数量与其标签选择算符匹配,并且是可操作的。 +目前,它的计数中只排除终止的 Pod。 +未来,可能会考虑系统提供的[就绪状态](https://issue.k8s.io/620)和其他信息, +我们可能会对替换策略添加更多控制, +我们计划发出事件,这些事件可以被外部客户端用来实现任意复杂的替换和/或缩减策略。 ReplicationController 永远被限制在这个狭隘的职责范围内。 它本身既不执行就绪态探测,也不执行活跃性探测。 -它不负责执行自动缩放,而是由外部自动缩放器控制(如 [#492](http://issue.k8s.io/492) 中所述),后者负责更改其 `replicas` 字段值。 -我们不会向 ReplicationController 添加调度策略(例如,[spreading](http://issue.k8s.io/367#issuecomment-48428019))。 -它也不应该验证所控制的 pod 是否与当前指定的模板匹配,因为这会阻碍自动调整大小和其他自动化过程。 +它不负责执行自动缩放,而是由外部自动缩放器控制(如 [#492](https://issue.k8s.io/492) 中所述),后者负责更改其 `replicas` 字段值。 +我们不会向 ReplicationController 添加调度策略(例如,[spreading](https://issue.k8s.io/367#issuecomment-48428019))。 +它也不应该验证所控制的 Pod 是否与当前指定的模板匹配,因为这会阻碍自动调整大小和其他自动化过程。 类似地,完成期限、整理依赖关系、配置扩展和其他特性也属于其他地方。 -我们甚至计划考虑批量创建 pod 的机制(查阅 [#170](http://issue.k8s.io/170))。 +我们甚至计划考虑批量创建 Pod 的机制(查阅 [#170](https://issue.k8s.io/170))。 -## ReplicationController 的替代方案 - - +## ReplicationController 的替代方案 + ### ReplicaSet -[`ReplicaSet`](/docs/concepts/workloads/controllers/replicaset/) 是下一代 ReplicationController ,支持新的[基于集合的标签选择器](/docs/concepts/overview/working-with-objects/labels/#set-based-requirement)。 -它主要被 [`Deployment`](/docs/concepts/workloads/controllers/deployment/) 用来作为一种编排 pod 创建、删除及更新的机制。 -请注意,我们推荐使用 Deployment 而不是直接使用 ReplicaSet,除非您需要自定义更新编排或根本不需要更新。 +[`ReplicaSet`](/zh/docs/concepts/workloads/controllers/replicaset/) 是下一代 ReplicationController, +支持新的[基于集合的标签选择算符](/zh/docs/concepts/overview/working-with-objects/labels/#set-based-requirement)。 +它主要被 [`Deployment`](/zh/docs/concepts/workloads/controllers/deployment/) 用来作为一种编排 Pod 创建、删除及更新的机制。 +请注意,我们推荐使用 Deployment 而不是直接使用 ReplicaSet,除非你需要自定义更新编排或根本不需要更新。 ### Deployment (推荐) -[`Deployment`](/docs/concepts/workloads/controllers/deployment/) 是一种更高级别的 API 对象,它以类似于 `kubectl rolling-update` 的方式更新其底层 ReplicaSet 及其 Pod。 -如果您想要这种滚动更新功能,那么推荐使用 Deployment,因为与 `kubectl rolling-update` 不同,它们是声明式的、服务端的,并且具有其它特性。 +[`Deployment`](/zh/docs/concepts/workloads/controllers/deployment/) 是一种更高级别的 API 对象, +它以类似于 `kubectl rolling-update` 的方式更新其底层 ReplicaSet 及其 Pod。 +如果你想要这种滚动更新功能,那么推荐使用 Deployment,因为与 `kubectl rolling-update` 不同, +它们是声明式的、服务端的,并且具有其它特性。 ### 裸 Pod -与用户直接创建 pod 的情况不同,ReplicationController 能够替换因某些原因被删除或被终止的 pod ,例如在节点故障或中断节点维护的情况下,例如内核升级。 -因此,我们建议您使用 ReplicationController,即使您的应用程序只需要一个 pod。 -可以将其看作类似于进程管理器,它只管理跨多个节点的多个 pod ,而不是单个节点上的单个进程。 +与用户直接创建 Pod 的情况不同,ReplicationController 能够替换因某些原因被删除或被终止的 Pod ,例如在节点故障或中断节点维护的情况下,例如内核升级。 +因此,我们建议你使用 ReplicationController,即使你的应用程序只需要一个 Pod。 +可以将其看作类似于进程管理器,它只管理跨多个节点的多个 Pod ,而不是单个节点上的单个进程。 ReplicationController 将本地容器重启委托给节点上的某个代理(例如,Kubelet 或 Docker)。 ### Job -对于预期会自行终止的 pod (即批处理任务),使用 [`Job`](/docs/concepts/jobs/run-to-completion-finite-workloads/) 而不是 ReplicationController。 +对于预期会自行终止的 Pod (即批处理任务),使用 +[`Job`](/docs/concepts/workloads/controllers/job/) 而不是 ReplicationController。 ### DaemonSet -对于提供机器级功能(例如机器监控或机器日志记录)的 pod ,使用 [`DaemonSet`](/docs/concepts/workloads/controllers/daemonset/) 而不是 ReplicationController。 -这些 pod 的生命期与机器的生命期绑定:它们需要在其他 pod 启动之前在机器上运行,并且在机器准备重新启动或者关闭时安全地终止。 +对于提供机器级功能(例如机器监控或机器日志记录)的 Pod, +使用 [`DaemonSet`](/zh/docs/concepts/workloads/controllers/daemonset/) 而不是 +ReplicationController。 +这些 Pod 的生命期与机器的生命期绑定:它们需要在其他 Pod 启动之前在机器上运行, +并且在机器准备重新启动或者关闭时安全地终止。 ## 更多信息 -请阅读[运行无状态的 Replication Controller](/docs/tutorials/stateless-application/run-stateless-ap-replication-controller/)。 - +请阅读[运行无状态的 ReplicationController](/zh/docs/tasks/run-application/run-stateless-application-deployment/)。 diff --git a/content/zh/docs/concepts/workloads/controllers/statefulset.md b/content/zh/docs/concepts/workloads/controllers/statefulset.md index 3a27b68dd8..955774f469 100644 --- a/content/zh/docs/concepts/workloads/controllers/statefulset.md +++ b/content/zh/docs/concepts/workloads/controllers/statefulset.md @@ -5,18 +5,9 @@ weight: 40 --- @@ -24,23 +15,20 @@ weight: 40 - StatefulSet 是用来管理有状态应用的工作负载 API 对象。 {{< glossary_definition term_id="statefulset" length="all" >}} - -## 使用 StatefulSets - +## 使用 StatefulSets + StatefulSets 对于需要满足以下一个或多个需求的应用程序很有价值: -在上面,稳定意味着 Pod 调度或重调度的整个过程是有持久性的。如果应用程序不需要任何稳定的标识符或有序的部署、删除或伸缩,则应该使用由一组无状态的副本控制器提供的工作负载来部署应用程序,比如 [Deployment](/docs/concepts/workloads/controllers/deployment/) 或者 [ReplicaSet](/docs/concepts/workloads/controllers/replicaset/) 可能更适用于您的无状态应用部署需要。 +在上面,稳定意味着 Pod 调度或重调度的整个过程是有持久性的。如果应用程序不需要任何稳定的标识符或有序的部署、删除或伸缩,则应该使用由一组无状态的副本控制器提供的工作负载来部署应用程序,比如 [Deployment](/zh/docs/concepts/workloads/controllers/deployment/) 或者 [ReplicaSet](/zh/docs/concepts/workloads/controllers/replicaset/) 可能更适用于您的无状态应用部署需要。 -## 限制 +## 限制 {#limitations} * 给定 Pod 的存储必须由 [PersistentVolume 驱动](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/staging/persistent-volume-provisioning/README.md) 基于所请求的 `storage class` 来提供,或者由管理员预先提供。 * 删除或者收缩 StatefulSet 并*不会*删除它关联的存储卷。这样做是为了保证数据安全,它通常比自动清除 StatefulSet 所有相关的资源更有价值。 -* StatefulSet 当前需要 [headless 服务](/docs/concepts/services-networking/service/#headless-services) 来负责 Pod 的网络标识。您需要负责创建此服务。 +* StatefulSet 当前需要[无头服务](/zh/docs/concepts/services-networking/service/#headless-services) 来负责 Pod 的网络标识。您需要负责创建此服务。 * 当删除 StatefulSets 时,StatefulSet 不提供任何终止 Pod 的保证。为了实现 StatefulSet 中的 Pod 可以有序和优雅的终止,可以在删除之前将 StatefulSet 缩放为 0。 * 在默认 [Pod 管理策略](#pod-management-policies)(`OrderedReady`) 时使用 [滚动更新](#rolling-updates),可能进入需要 [人工干预](#forced-rollback) 才能修复的损坏状态。 @@ -89,7 +77,7 @@ that provides a set of stateless replicas. ## Components The example below demonstrates the components of a StatefulSet. --> -## 组件 +## 组件 {#components} 下面的示例演示了 StatefulSet 的组件。 @@ -151,12 +139,13 @@ spec: --> * 名为 `nginx` 的 Headless Service 用来控制网络域名。 * 名为 `web` 的 StatefulSet 有一个 Spec,它表明将在独立的 3 个 Pod 副本中启动 nginx 容器。 -* `volumeClaimTemplates` 将通过 PersistentVolumes 驱动提供的 [PersistentVolumes](/docs/concepts/storage/persistent-volumes/) 来提供稳定的存储。 +* `volumeClaimTemplates` 将通过 PersistentVolumes 驱动提供的 + [PersistentVolumes](/zh/docs/concepts/storage/persistent-volumes/) 来提供稳定的存储。 -## Pod 选择器 {#pod-selector} +## Pod 选择算符 {#pod-selector} -## Pod 标识 - +## Pod 标识 {#pod-identity} + StatefulSet Pod 具有唯一的标识,该标识包括顺序标识、稳定的网络标识和稳定的存储。该标识和 Pod 是绑定的,不管它被调度在哪个节点上。 -### 有序索引 - +### 有序索引 {#ordinal-index} + 对于具有 N 个副本的 StatefulSet,StatefulSet 中的每个 Pod 将被分配一个整数序号,从 0 到 N-1,该序号在 StatefulSet 上是唯一的。 -### 稳定的网络 ID - -StatefulSet 中的每个 Pod 根据 StatefulSet 的名称和 Pod 的序号派生出它的主机名。组合主机名的格式为`$(StatefulSet 名称)-$(序号)`。上例将会创建三个名称分别为 `web-0、web-1、web-2` 的 Pod。 -StatefulSet 可以使用 [headless 服务](/docs/concepts/services-networking/service/#headless-services) 控制它的 Pod 的网络域。管理域的这个服务的格式为: +### 稳定的网络 ID {#stable-network-id} + +StatefulSet 中的每个 Pod 根据 StatefulSet 的名称和 Pod 的序号派生出它的主机名。 +组合主机名的格式为`$(StatefulSet 名称)-$(序号)`。上例将会创建三个名称分别为 `web-0、web-1、web-2` 的 Pod。 +StatefulSet 可以使用 [headless 服务](/zh/docs/concepts/services-networking/service/#headless-services) +控制它的 Pod 的网络域。管理域的这个服务的格式为: `$(服务名称).$(命名空间).svc.cluster.local`,其中 `cluster.local` 是集群域。 -一旦每个 Pod 创建成功,就会得到一个匹配的 DNS 子域,格式为:`$(pod 名称).$(所属服务的 DNS 域名)`,其中所属服务由 StatefulSet 的 `serviceName` 域来设定。 +一旦每个 Pod 创建成功,就会得到一个匹配的 DNS 子域,格式为: +`$(pod 名称).$(所属服务的 DNS 域名)`,其中所属服务由 StatefulSet 的 `serviceName` 域来设定。 - 下面给出一些选择集群域、服务名、StatefulSet 名、及其怎样影响 StatefulSet 的 Pod 上的 DNS 名称的示例: -Cluster Domain | Service (ns/name) | StatefulSet (ns/name) | StatefulSet Domain | Pod DNS | Pod Hostname | --------------- | ----------------- | ----------------- | -------------- | ------- | ------------ | +集群域名 | 服务(名字空间/名字)| StatefulSet(名字空间/名字) | StatefulSet 域名 | Pod DNS | Pod 主机名 | +-------------- | -------------------- | ---------------------------- | ---------------- | ------- | ------------ | cluster.local | default/nginx | default/web | nginx.default.svc.cluster.local | web-{0..N-1}.nginx.default.svc.cluster.local | web-{0..N-1} | cluster.local | foo/nginx | foo/web | nginx.foo.svc.cluster.local | web-{0..N-1}.nginx.foo.svc.cluster.local | web-{0..N-1} | kube.local | foo/nginx | foo/web | nginx.foo.svc.kube.local | web-{0..N-1}.nginx.foo.svc.kube.local | web-{0..N-1} | @@ -227,15 +215,12 @@ Cluster Domain will be set to `cluster.local` unless [otherwise configured](/docs/concepts/services-networking/dns-pod-service/#how-it-works). --> {{< note >}} -集群域会被设置为 `cluster.local`,除非有[其他配置](/docs/concepts/services-networking/dns-pod-service/)。 +集群域会被设置为 `cluster.local`,除非有[其他配置](/zh/docs/concepts/services-networking/dns-pod-service/)。 {{< /note >}} -### 稳定的存储 - -Kubernetes 为每个 VolumeClaimTemplate 创建一个 [PersistentVolume](/docs/concepts/storage/persistent-volumes/)。在上面的 nginx 示例中,每个 Pod 将会得到基于 StorageClass `my-storage-class` 提供的 1 Gib 的 PersistentVolume。如果没有声明 StorageClass,就会使用默认的 StorageClass。当一个 Pod 被调度(重新调度)到节点上时,它的 `volumeMounts` 会挂载与其 PersistentVolumeClaims 相关联的 PersistentVolume。请注意,当 Pod 或者 StatefulSet 被删除时,与 PersistentVolumeClaims 相关联的 PersistentVolume 并不会被删除。要删除它必须通过手动方式来完成。 +### 稳定的存储 {#stable-storage} + +Kubernetes 为每个 VolumeClaimTemplate 创建一个 [PersistentVolume](/zh/docs/concepts/storage/persistent-volumes/)。 +在上面的 nginx 示例中,每个 Pod 将会得到基于 StorageClass `my-storage-class` 提供的 +1 Gib 的 PersistentVolume。如果没有声明 StorageClass,就会使用默认的 StorageClass。 +当一个 Pod 被调度(重新调度)到节点上时,它的 `volumeMounts` 会挂载与其 +PersistentVolumeClaims 相关联的 PersistentVolume。 +请注意,当 Pod 或者 StatefulSet 被删除时,与 PersistentVolumeClaims 相关联的 +PersistentVolume 并不会被删除。要删除它必须通过手动方式来完成。 -### Pod 名称标签 - +### Pod 名称标签 {#pod-name-label} + 当 StatefulSet {{< glossary_tooltip term_id="controller" >}} 创建 Pod 时,它会添加一个标签 `statefulset.kubernetes.io/pod-name`,该标签设置为 Pod 名称。这个标签允许您给 StatefulSet 中的特定 Pod 绑定一个 Service。 -## 部署和扩缩保证 - +## 部署和扩缩保证 {#deployment-and-scaling-guarantees} + * 对于包含 N 个 副本的 StatefulSet,当部署 Pod 时,它们是依次创建的,顺序为 `0..N-1`。 * 当删除 Pod 时,它们是逆序终止的,顺序为 `N-1..0`。 * 在将缩放操作应用到 Pod 之前,它前面的所有 Pod 必须是 Running 和 Ready 状态。 @@ -279,8 +270,9 @@ the StatefulSet. - -StatefulSet 不应将 `pod.Spec.TerminationGracePeriodSeconds` 设置为 0。这种做法是不安全的,要强烈阻止。更多的解释请参考 [强制删除 StatefulSet Pod](/docs/tasks/run-application/force-delete-stateful-set-pod/)。 +StatefulSet 不应将 `pod.Spec.TerminationGracePeriodSeconds` 设置为 0。 +这种做法是不安全的,要强烈阻止。更多的解释请参考 +[强制删除 StatefulSet Pod](/zh/docs/tasks/run-application/force-delete-stateful-set-pod/)。 - -在上面的 nginx 示例被创建后,会按照 web-0、web-1、web-2 的顺序部署三个 Pod。在 web-0 进入 [Running 和 Ready](/docs/user-guide/pod-states/) 状态前不会部署 web-1。在 web-1 进入 Running 和 Ready 状态前不会部署 web-2。如果 web-1 已经处于 Running 和 Ready 状态,而 web-2 尚未部署,在此期间发生了 web-0 运行失败,那么 web-2 将不会被部署,要等到 web-0 部署完成并进入 Running 和 Ready 状态后,才会部署 web-2。 +在上面的 nginx 示例被创建后,会按照 web-0、web-1、web-2 的顺序部署三个 Pod。 +在 web-0 进入 [Running 和 Ready](/zh/docs/concepts/workloads/pods/pod-lifecycle/) +状态前不会部署 web-1。在 web-1 进入 Running 和 Ready 状态前不会部署 web-2。 +如果 web-1 已经处于 Running 和 Ready 状态,而 web-2 尚未部署,在此期间发生了 +web-0 运行失败,那么 web-2 将不会被部署,要等到 web-0 部署完成并进入 Running 和 +Ready 状态后,才会部署 web-2。 -### Pod 管理策略 {#pod-management-policies} - +### Pod 管理策略 {#pod-management-policies} + 在 Kubernetes 1.7 及以后的版本中,StatefulSet 允许您不要求其排序保证,同时通过它的 `.spec.podManagementPolicy` 域保持其唯一性和身份保证。 在 Kubernetes 1.7 及以后的版本中,StatefulSet 允许您放宽其排序保证,同时通过它的 `.spec.podManagementPolicy` 域保持其唯一性和身份保证。 -#### OrderedReady Pod 管理 - +#### OrderedReady Pod 管理 + `OrderedReady` Pod 管理是 StatefulSet 的默认设置。它实现了[上面](#deployment-and-scaling-guarantees)描述的功能。 -#### Parallel Pod 管理 - -`Parallel` Pod 管理让 StatefulSet 控制器并行的启动或终止所有的 Pod,启动或者终止其他 Pod 前,无需等待 Pod 进入 Running 和 ready 或者完全停止状态。 +#### 并行 Pod 管理 {#parallel-pod-management} + +`Parallel` Pod 管理让 StatefulSet 控制器并行的启动或终止所有的 Pod, +启动或者终止其他 Pod 前,无需等待 Pod 进入 Running 和 ready 或者完全停止状态。 -## 更新策略 - +## 更新策略 {#update-strategies} + 在 Kubernetes 1.7 及以后的版本中,StatefulSet 的 `.spec.updateStrategy` 字段让您可以配置和禁用掉自动滚动更新 Pod 的容器、标签、资源请求或限制、以及注解。 -### 关于删除策略 - +### 关于删除策略 {#on-delete} + `OnDelete` 更新策略实现了 1.6 及以前版本的历史遗留行为。当 StatefulSet 的 `.spec.updateStrategy.type` 设置为 `OnDelete` 时,它的控制器将不会自动更新 StatefulSet 中的 Pod。用户必须手动删除 Pod 以便让控制器创建新的 Pod,以此来对 StatefulSet 的 `.spec.template` 的变动作出反应。 -### 滚动更新 {#rolling-updates} - +### 滚动更新 {#rolling-updates} + `RollingUpdate` 更新策略对 StatefulSet 中的 Pod 执行自动的滚动更新。在没有声明 `.spec.updateStrategy` 时,`RollingUpdate` 是默认配置。 当 StatefulSet 的 `.spec.updateStrategy.type` 被设置为 `RollingUpdate` 时,StatefulSet 控制器会删除和重建 StatefulSet 中的每个 Pod。 它将按照与 Pod 终止相同的顺序(从最大序号到最小序号)进行,每次更新一个 Pod。它会等到被更新的 Pod 进入 Running 和 Ready 状态,然后再更新其前身。 -#### 分区 - +#### 分区 {#partitions} + 通过声明 `.spec.updateStrategy.rollingUpdate.partition` 的方式,`RollingUpdate` 更新策略可以实现分区。如果声明了一个分区,当 StatefulSet 的 `.spec.template` 被更新时,所有序号大于等于该分区序号的 Pod 都会被更新。所有序号小于该分区序号的 Pod 都不会被更新,并且,即使他们被删除也会依据之前的版本进行重建。如果 StatefulSet 的 `.spec.updateStrategy.rollingUpdate.partition` 大于它的 `.spec.replicas`,对它的 `.spec.template` 的更新将不会传递到它的 Pod。 在大多数情况下,您不需要使用分区,但如果您希望进行阶段更新、执行金丝雀或执行分阶段展开,则这些分区会非常有用。 -#### 强制回滚 {#forced-rollback} - +#### 强制回滚 {#forced-rollback} +在默认 [Pod 管理策略](#pod-management-policies)(`OrderedReady`) 时使用 [滚动更新](#rolling-updates) ,可能进入需要人工干预才能修复的损坏状态。 + +如果更新后 Pod 模板配置进入无法运行或就绪的状态(例如,由于错误的二进制文件或应用程序级配置错误),StatefulSet 将停止回滚并等待。 + + -在默认 [Pod 管理策略](#pod-management-policies)(`OrderedReady`) 时使用 [滚动更新](#rolling-updates) ,可能进入需要人工干预才能修复的损坏状态。 - -如果更新后 Pod 模板配置进入无法运行或就绪的状态(例如,由于错误的二进制文件或应用程序级配置错误),StatefulSet 将停止回滚并等待。 - -在这种状态下,仅将 Pod 模板还原为正确的配置是不够的。由于[已知问题](https://github.com/kubernetes/kubernetes/issues/67250),StatefulSet 将继续等待损坏状态的 Pod 准备就绪(永远不会发生),然后再尝试将其恢复为正常工作配置。 - -恢复模板后,还必须删除 StatefulSet 尝试使用错误的配置来运行的 Pod。这样,StatefulSet 才会开始使用被还原的模板来重新创建 Pod。 +在这种状态下,仅将 Pod 模板还原为正确的配置是不够的。由于 +[已知问题](https://github.com/kubernetes/kubernetes/issues/67250),StatefulSet +将继续等待损坏状态的 Pod 准备就绪(永远不会发生),然后再尝试将其恢复为正常工作配置。 +恢复模板后,还必须删除 StatefulSet 尝试使用错误的配置来运行的 Pod。这样, +StatefulSet 才会开始使用被还原的模板来重新创建 Pod。 ## {{% heading "whatsnext" %}} - -* 示例一:[部署有状态应用](/docs/tutorials/stateful-application/basic-stateful-set/)。 -* 示例二:[使用 StatefulSet 部署 Cassandra](/docs/tutorials/stateful-application/cassandra/)。 -* 示例三:[运行多副本的有状态应用程序](/docs/tasks/run-application/run-replicated-stateful-application/)。 +* 示例一:[部署有状态应用](/zh/docs/tutorials/stateful-application/basic-stateful-set/)。 +* 示例二:[使用 StatefulSet 部署 Cassandra](/zh/docs/tutorials/stateful-application/cassandra/)。 +* 示例三:[运行多副本的有状态应用程序](/zh/docs/tasks/run-application/run-replicated-stateful-application/)。 diff --git a/content/zh/docs/concepts/workloads/controllers/ttlafterfinished.md b/content/zh/docs/concepts/workloads/controllers/ttlafterfinished.md index 344363c5dd..3b2ddc60c7 100644 --- a/content/zh/docs/concepts/workloads/controllers/ttlafterfinished.md +++ b/content/zh/docs/concepts/workloads/controllers/ttlafterfinished.md @@ -4,13 +4,9 @@ content_type: concept weight: 65 --- @@ -20,36 +16,41 @@ weight: 65 -TTL 控制器提供了一种 TTL 机制来限制已完成执行的资源对象的生命周期。TTL 控制器目前只处理 [Job](/docs/concepts/workloads/controllers/jobs-run-to-completion/),可能以后会扩展以处理将完成执行的其他资源,例如 Pod 和自定义资源。 +TTL 控制器提供了一种 TTL 机制来限制已完成执行的资源对象的生命周期。 +TTL 控制器目前只处理 {{< glossary_tooltip text="Job" term_id="job" >}}, +可能以后会扩展以处理将完成执行的其他资源,例如 Pod 和自定义资源。 -Alpha 免责声明:此功能目前是 alpha 版,并且可以通过 kube-apiserver 和 kube-controller-manager [特性开关](/docs/reference/command-line-tools-reference/feature-gates/) `TTLAfterFinished` 启用。 - - - +Alpha 免责声明:此功能目前是 alpha 版,并且可以通过 `kube-apiserver` 和 +`kube-controller-manager` 上的 +[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) +`TTLAfterFinished` 启用。 -## TTL 控制器 - -TTL 控制器现在只支持 Job。集群操作员可以通过指定 Job 的 `.spec.ttlSecondsAfterFinished` 字段来自动清理已结束的作业(`Complete` 或 `Failed`),如下所示的[示例](/docs/concepts/workloads/controllers/jobs-run-to-completion/#clean-up-finished-jobs-automatically)。 +## TTL 控制器 + +TTL 控制器现在只支持 Job。集群操作员可以通过指定 Job 的 `.spec.ttlSecondsAfterFinished` +字段来自动清理已结束的作业(`Complete` 或 `Failed`),如 +[示例](/zh/docs/concepts/workloads/controllers/jobs-run-to-completion/#clean-up-finished-jobs-automatically) +所示。 + -TTL 控制器假设资源能在执行完成后的 TTL 秒内被清理,也就是当 TTL 过期后。当 TTL 控制器清理资源时,它将做级联删除操作,如删除资源对象的同时也删除其依赖对象。注意,当资源被删除时,由该资源的生命周期保证其终结器(finalizers)等被执行。 +TTL 控制器假设资源能在执行完成后的 TTL 秒内被清理,也就是当 TTL 过期后。 +当 TTL 控制器清理资源时,它将做级联删除操作,即删除资源对象的同时也删除其依赖对象。 +注意,当资源被删除时,由该资源的生命周期保证其终结器(Finalizers)等被执行。 * 在资源清单(manifest)中指定此字段,以便 Job 在完成后的某个时间被自动清除。 -* 将此字段设置为存在的、已完成的资源,以采用此新功能。 -* 在创建资源时使用 [mutating admission webhook](/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks) 动态设置该字段。集群管理员可以使用它对完成的资源强制执行 TTL 策略。 -* 使用 [mutating admission webhook](/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks) 在资源完成后动态设置该字段,并根据资源状态、标签等选择不同的 TTL 值。 +* 将此字段设置为现有的、已完成的资源,以采用此新功能。 +* 在创建资源时使用 [mutating admission webhook](/zh/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks) + 动态设置该字段。集群管理员可以使用它对完成的资源强制执行 TTL 策略。 +* 使用 [mutating admission webhook](/zh/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks) + 在资源完成后动态设置该字段,并根据资源状态、标签等选择不同的 TTL 值。 -## 警告 - -### 更新 TTL 秒 - -请注意,在创建资源或已经执行结束后,仍可以修改其 TTL 周期,例如 Job 的 `.spec.ttlSecondsAfterFinished` 字段。但是,一旦 Job 变为可被删除状态(当其 TTL 已过期时),即使您通过 API 扩展其 TTL 时长得到了成功的响应,系统也不保证 Job 将被保留。 +## 警告 + +### 更新 TTL 秒 + +请注意,在创建资源或已经执行结束后,仍可以修改其 TTL 周期,例如 Job 的 +`.spec.ttlSecondsAfterFinished` 字段。 +但是一旦 Job 变为可被删除状态(当其 TTL 已过期时),即使您通过 API 增加其 TTL +时长得到了成功的响应,系统也不保证 Job 将被保留。 -### 时间偏差 - -由于 TTL 控制器使用存储在 Kubernetes 资源中的时间戳来确定 TTL 是否已过期,因此该功能对集群中的时间偏差很敏感,这可能导致 TTL 控制器在错误的时间清理资源对象。 +### 时间偏差 {#time-skew} + +由于 TTL 控制器使用存储在 Kubernetes 资源中的时间戳来确定 TTL 是否已过期, +因此该功能对集群中的时间偏差很敏感,这可能导致 TTL 控制器在错误的时间清理资源对象。 -在 Kubernetes 中,需要在所有节点上运行 NTP(参见 [#6159](https://github.com/kubernetes/kubernetes/issues/6159#issuecomment-93844058))以避免时间偏差。时钟并不总是如此正确,但差异应该很小。设置非零 TTL 时请注意避免这种风险。 - - +在 Kubernetes 中,需要在所有节点上运行 NTP(参见 +[#6159](https://github.com/kubernetes/kubernetes/issues/6159#issuecomment-93844058)) +以避免时间偏差。时钟并不总是如此正确,但差异应该很小。 +设置非零 TTL 时请注意避免这种风险。 ## {{% heading "whatsnext" %}} - -[自动清理 Job](/docs/concepts/workloads/controllers/jobs-run-to-completion/#clean-up-finished-jobs-automatically) - - -[设计文档](https://github.com/kubernetes/enhancements/blob/master/keps/sig-apps/0026-ttl-after-finish.md) - +* [自动清理 Job](/zh/docs/concepts/workloads/controllers/job/#clean-up-finished-jobs-automatically) +* [设计文档](https://github.com/kubernetes/enhancements/blob/master/keps/sig-apps/0026-ttl-after-finish.md) diff --git a/content/zh/docs/concepts/workloads/pods/disruptions.md b/content/zh/docs/concepts/workloads/pods/disruptions.md index e47577bfe1..304f3703d5 100644 --- a/content/zh/docs/concepts/workloads/pods/disruptions.md +++ b/content/zh/docs/concepts/workloads/pods/disruptions.md @@ -1,19 +1,13 @@ --- -title: 干扰 +title: 干扰(Disruptions) content_type: concept weight: 60 --- @@ -22,31 +16,23 @@ This guide is for application owners who want to build highly available applications, and thus need to understand what types of Disruptions can happen to Pods. --> - 本指南针对的是希望构建高可用性应用程序的应用所有者,他们有必要了解可能发生在 pod 上的干扰类型。 - 文档同样适用于想要执行自动化集群操作(例如升级和自动扩展集群)的集群管理员。 - - - -## 自愿干扰和非自愿干扰 - - +## 自愿干扰和非自愿干扰 {#voluntary-and-involuntary-disruptions} Pod 不会消失,除非有人(用户或控制器)将其销毁,或者出现了不可避免的硬件或软件系统错误。 @@ -54,8 +40,7 @@ Pod 不会消失,除非有人(用户或控制器)将其销毁,或者出 We call these unavoidable cases *involuntary disruptions* to an application. Examples are: --> - -我们把这些不可避免的情况称为应用的*非自愿干扰*。例如: +我们把这些不可避免的情况称为应用的*非自愿干扰(Involuntary Disruptions)*。例如: - 除了资源不足的情况,大多数用户应该都熟悉这些情况;它们不是特定于 Kubernetes 的。 - -我们称其他情况为*自愿干扰*。包括由应用程序所有者发起的操作和由集群管理员发起的操作。典型的应用程序所有者的操 +我们称其他情况为*自愿干扰(Voluntary Disruptions)*。 +包括由应用程序所有者发起的操作和由集群管理员发起的操作。典型的应用程序所有者的操 作包括: - -- 删除 deployment 或其他管理 pod 的控制器 -- 更新了 deployment 的 pod 模板导致 pod 重启 -- 直接删除 pod(例如,因为误操作) +- 删除 Deployment 或其他管理 Pod 的控制器 +- 更新了 Deployment 的 Pod 模板导致 Pod 重启 +- 直接删除 Pod(例如,因为误操作) -集群管理员操作包括: - - +集群管理员操作包括: -- [排空(drain)节点](/docs/tasks/administer-cluster/safely-drain-node/)进行修复或升级。 -- 从集群中排空节点以缩小集群(了解[集群自动扩缩](/docs/tasks/administer-cluster/cluster-management/#cluster-autoscaler))。 -- 从节点中移除一个 pod,以允许其他 pod 使用该节点。 +- [排空(drain)节点](/zh/docs/tasks/administer-cluster/safely-drain-node/)进行修复或升级。 +- 从集群中排空节点以缩小集群(了解[集群自动扩缩](/zh/docs/tasks/administer-cluster/cluster-management/#cluster-autoscaler))。 +- 从节点中移除一个 Pod,以允许其他 Pod 使用该节点。 - 这些操作可能由集群管理员直接执行,也可能由集群管理员所使用的自动化工具执行,或者由集群托管提供商自动执行。 - -咨询集群管理员或联系云提供商,或者查询发布文档,以确定是否为集群启用了任何资源干扰源。如果没有启用,可以不用创建 Pod Disruption Budgets(Pod 干扰预算) - -{{< caution >}} +咨询集群管理员或联系云提供商,或者查询发布文档,以确定是否为集群启用了任何资源干扰源。 +如果没有启用,可以不用创建 Pod Disruption Budgets(Pod 干扰预算) - -并非所有的自愿干扰都会受到 pod 干扰预算的限制。例如,删除 deployment 或 pod 的删除操作就会跳过 pod 干扰预算检查。 - +{{< caution >}} +并非所有的自愿干扰都会受到 Pod 干扰预算的限制。 +例如,删除 Peployment 或 Pod 的删除操作就会跳过 Pod 干扰预算检查。 {{< /caution >}} -## 处理干扰 - - +## 处理干扰 以下是减轻非自愿干扰的一些方法: @@ -167,10 +141,13 @@ spread applications across racks (using or across zones (if using a [multi-zone cluster](/docs/setup/multiple-zones).) --> - -- 确保 pod[请求所需资源](/docs/tasks/configure-pod-container/assign-cpu-ram-container)。 -- 如果需要更高的可用性,请复制应用程序。(了解有关运行多副本的[无状态](/docs/tasks/run-application/run-stateless-application-deployment/)和[有状态](/docs/tasks/run-application/run-replicated-stateful-application/)应用程序的信息。) -- 为了在运行复制应用程序时获得更高的可用性,请跨机架(使用[反亲和性](/docs/user-guide/node-selection/#inter-pod-affinity-and-anti-affinity-beta-feature))或跨区域(如果使用[多区域集群](/docs/setup/multiple-zones))扩展应用程序。 +- 确保 Pod 在请求中给出[所需资源](/zh/docs/tasks/configure-pod-container/assign-memory-resource/)。 +- 如果需要更高的可用性,请复制应用程序。 + (了解有关运行多副本的[无状态](/zh/docs/tasks/run-application/run-stateless-application-deployment/) + 和[有状态](/zh/docs/tasks/run-application/run-replicated-stateful-application/)应用程序的信息。) +- 为了在运行复制应用程序时获得更高的可用性,请跨机架(使用 + [反亲和性](/zh/docs/concepts/scheduling-eviction/assign-pod-node/))或跨区域 + (如果使用[多区域集群](/zh/docs/setup/best-practices/multiple-zones/))扩展应用程序。 - 自愿干扰的频率各不相同。在一个基本的 Kubernetes 集群中,根本没有自愿干扰。然而,集群管理 或托管提供商可能运行一些可能导致自愿干扰的额外服务。例如,节点软 更新可能导致自愿干扰。另外,集群(节点)自动缩放的某些 @@ -193,16 +169,15 @@ Kubernetes offers features to help run highly available applications at the same time as frequent voluntary disruptions. We call this set of features *Disruption Budgets*. --> - -Kubernetes 提供特性来满足在出现频繁自愿干扰的同时运行高可用的应用程序。我们称这些特性为*干扰预算* +Kubernetes 提供特性来满足在出现频繁自愿干扰的同时运行高可用的应用程序。我们称这些特性为 +*干扰预算(Disruption Budget)*。 +## Pod disruption budgets -## 干扰预算工作原理 +Kubernetes offers features to help you run highly available applications even when you +introduce frequent voluntary disruptions. - +## 干扰预算 -应用程序所有者可以为每个应用程序创建 `PodDisruptionBudget` 对象(PDB)。PDB 将限制在同一时间因自愿干扰导致的复制应用程序中宕机的 pod 数量。例如,基于定额的应用程序希望确保运行的副本数 -永远不会低于仲裁所需的数量。Web 前端可能希望确保提供负载的副本数量永远不会低于总数的某个百分比。 +{{< feature-state for_k8s_version="v1.5" state="beta" >}} + +即使你会经常引入自愿性干扰,Kubernetes 也能够支持你运行高度可用的应用。 + +应用程序所有者可以为每个应用程序创建 `PodDisruptionBudget` 对象(PDB)。 +PDB 将限制在同一时间因自愿干扰导致的复制应用程序中宕机的 pod 数量。 +例如,基于票选机制的应用程序希望确保运行的副本数永远不会低于仲裁所需的数量。 +Web 前端可能希望确保提供负载的副本数量永远不会低于总数的某个百分比。 - -集群管理员和托管提供商应该使用遵循 Pod Disruption Budgets 的接口(通过调用[驱逐 API](/docs/tasks/administer-cluster/safely-drain-node/#the-eviction-api)),而不是直接删除 pod 或 deployment。示例包括 `kubectl drain` 命令和 Kubernetes-on-GCE 集群升级脚本(`cluster/gce/upgrade.sh`)。 +集群管理员和托管提供商应该使用遵循 Pod Disruption Budgets 的接口 +(通过调用[Eviction API](/zh/docs/tasks/administer-cluster/safely-drain-node/#the-eviction-api)), +而不是直接删除 Pod 或 Deployment。 - -当集群管理员想排空一个节点时,可以使用 `kubectl drain` 命令。该命令试图驱逐机器上的所有 pod。驱逐请求可能会暂时被拒绝,且该工具定时重试失败的请求直到所有的 pod 都被终止,或者达到配置的超时时间。 +例如,`kubectl drain` 命令可以用来标记某个节点即将停止服务。 +运行 `kubectl drain` 命令时,工具会尝试驱逐机器上的所有 Pod。 +`kubectl` 所提交的驱逐请求可能会暂时被拒绝,所以该工具会定时重试失败的请求, +直到所有的 Pod 都被终止,或者达到配置的超时时间。 - -PDB 指定应用程序可以容忍的副本数量(相当于应该有多少副本)。例如,具有 `.spec.replicas: 5` 的 deployment 在任何时间都应该有 5 个 pod。如果 PDB 允许其在某一时刻有 4 个副本,那么驱逐 API 将允许同一时刻仅有一个而不是两个 pod 自愿干扰。 +PDB 指定应用程序可以容忍的副本数量(相当于应该有多少副本)。 +例如,具有 `.spec.replicas: 5` 的 Deployment 在任何时间都应该有 5 个 Pod。 +如果 PDB 允许其在某一时刻有 4 个副本,那么驱逐 API 将允许同一时刻仅有一个而不是两个 Pod 自愿干扰。 - -使用标签选择器来指定构成应用程序的一组 pod,这与应用程序的控制器(deployment,stateful-set 等)选择 pod 的逻辑一样。 +使用标签选择器来指定构成应用程序的一组 Pod,这与应用程序的控制器(Deployment,StatefulSet 等) +选择 Pod 的逻辑一样。 - -Pod 控制器的 `.spec.replicas` 计算“预期的” pod 数量。根据 pod 对象的 `.metadata.ownerReferences` 字段来发现控制器。 +Pod 控制器的 `.spec.replicas` 计算“预期的” Pod 数量。 +根据 Pod 对象的 `.metadata.ownerReferences` 字段来发现控制器。 - PDB 不能阻止[非自愿干扰](#voluntary-and-involuntary-disruptions)的发生,但是确实会计入 -算。 +预算。 - -由于应用程序的滚动升级而被删除或不可用的 pod 确实会计入干扰预算,但是控制器(如 deployment 和 stateful-set)在进行滚动升级时不受 PDB -的限制。应用程序更新期间的故障处理是在控制器的 spec 中配置的。(了解[更新 deployment](/docs/concepts/workloads/controllers/deployment/#updating-a-deployment)。) +由于应用程序的滚动升级而被删除或不可用的 Pod 确实会计入干扰预算, +但是控制器(如 Deployment 和 StatefulSet)在进行滚动升级时不受 PDB +的限制。应用程序更新期间的故障处理方式是在对应的工作负载资源的 `spec` 中配置的。 - -当使用驱逐 API 驱逐 pod 时,pod 会被优雅地终止(参考 [PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core) 中的 `terminationGracePeriodSeconds`)。 +当使用驱逐 API 驱逐 Pod 时,Pod 会被体面地 +[终止](/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination),期间会 +参考 [PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core) +中的 `terminationGracePeriodSeconds` 配置值。 -## PDB 例子 - - +## PDB 例子 {#pdb-example} -假设集群有 3 个节点,`node-1` 到 `node-3`。集群上运行了一些应用。其中一个应用有 3 个副本,分别是 `pod-a`,`pod-b` 和 `pod-c`。另外,还有一个不带 PDB 的无关 pod `pod-x` 也同样显示。最初,所有的 pod 分布如下: - +假设集群有 3 个节点,`node-1` 到 `node-3`。集群上运行了一些应用。 +其中一个应用有 3 个副本,分别是 `pod-a`,`pod-b` 和 `pod-c`。 +另外,还有一个不带 PDB 的无关 pod `pod-x` 也同样显示出来。 +最初,所有的 Pod 分布如下: | node-1 | node-2 | node-3 | |:--------------------:|:-------------------:|:------------------:| @@ -308,8 +295,7 @@ Initially, the pods are laid out as follows: All 3 pods are part of a deployment, and they collectively have a PDB which requires there be at least 2 of the 3 pods to be available at all times. --> - -3 个 pod 都是 deployment 的一部分,并且共同拥有同一个 PDB,要求 3 个 pod 中至少有 2 个 pod 始终处于可用状态。 +3 个 Pod 都是 deployment 的一部分,并且共同拥有同一个 PDB,要求 3 个 Pod 中至少有 2 个 Pod 始终处于可用状态。 -例如,假设集群管理员想要重启系统,升级内核版本来修复内核中的 bug。集群管理员首先使用 `kubectl drain` 命令尝试排空 `node-1` 节点。命令尝试驱逐 `pod-a` 和 `pod-x`。操作立即就成功了。两个 pod 同时进入 `terminating` 状态。这时的集群处于下面的状态: +例如,假设集群管理员想要重启系统,升级内核版本来修复内核中的权限。 +集群管理员首先使用 `kubectl drain` 命令尝试排空 `node-1` 节点。 +命令尝试驱逐 `pod-a` 和 `pod-x`。操作立即就成功了。 +两个 Pod 同时进入 `terminating` 状态。这时的集群处于下面的状态: | node-1 *draining* | node-2 | node-3 | |:--------------------:|:-------------------:|:------------------:| @@ -331,21 +320,21 @@ The deployment notices that one of the pods is terminating, so it creates a repl called `pod-d`. Since `node-1` is cordoned, it lands on another node. Something has also created `pod-y` as a replacement for `pod-x`. --> - -Deployment 控制器观察到其中一个 pod 正在终止,因此它创建了一个替代 pod `pod-d`。由于 `node-1` 被封锁(cordon),`pod-d` 落在另一个节点上。同样其他控制器也创建了 `pod-y` 作为 `pod-x` 的替代品。 +Deployment 控制器观察到其中一个 Pod 正在终止,因此它创建了一个替代 Pod `pod-d`。 +由于 `node-1` 被封锁(cordon),`pod-d` 落在另一个节点上。 +同样其他控制器也创建了 `pod-y` 作为 `pod-x` 的替代品。 - -(注意:对于 StatefulSet 来说,`pod-a`(也称为 `pod-0`)需要在替换 pod 创建之前完全终止,替代它的也称为 `pod-0`,但是具有不同的 UID。反之,样例也适用于 StatefulSet。) +(注意:对于 StatefulSet 来说,`pod-a`(也称为 `pod-0`)需要在替换 Pod 创建之前完全终止, +替代它的也称为 `pod-0`,但是具有不同的 UID。除此之外,此示例也适用于 StatefulSet。) - 当前集群的状态如下: | node-1 *draining* | node-2 | node-3 | @@ -356,8 +345,7 @@ Now the cluster is in this state: - -在某一时刻,pod 被终止,集群如下所示: +在某一时刻,Pod 被终止,集群如下所示: | node-1 *drained* | node-2 | node-3 | |:--------------------:|:-------------------:|:------------------:| @@ -369,13 +357,13 @@ At this point, if an impatient cluster administrator tries to drain `node-2` or `node-3`, the drain command will block, because there are only 2 available pods for the deployment, and its PDB requires at least 2. After some time passes, `pod-d` becomes available. --> - -此时,如果一个急躁的集群管理员试图排空(drain)`node-2` 或 `node-3`,drain 命令将被阻塞,因为对于 deployment 来说只有 2 个可用的 pod,并且它的 PDB 至少需要 2 个。经过一段时间,`pod-d` 变得可用。 +此时,如果一个急躁的集群管理员试图排空(drain)`node-2` 或 `node-3`,drain 命令将被阻塞, +因为对于 Deployment 来说只有 2 个可用的 Pod,并且它的 PDB 至少需要 2 个。 +经过一段时间,`pod-d` 变得可用。 - 集群状态如下所示: | node-1 *drained* | node-2 | node-3 | @@ -390,8 +378,10 @@ The drain command will try to evict the two pods in some order, say But, when it tries to evict `pod-d`, it will be refused because that would leave only one pod available for the deployment. --> - -现在,集群管理员试图排空(drain)`node-2`。drain 命令将尝试按照某种顺序驱逐两个 pod,假设先是 `pod-b`,然后是 `pod-d`。命令成功驱逐 `pod-b`,但是当它尝试驱逐 `pod-d`时将被拒绝,因为对于 deployment 来说只剩一个可用的 pod 了。 +现在,集群管理员试图排空(drain)`node-2`。 +drain 命令将尝试按照某种顺序驱逐两个 Pod,假设先是 `pod-b`,然后是 `pod-d`。 +命令成功驱逐 `pod-b`,但是当它尝试驱逐 `pod-d`时将被拒绝,因为对于 +Deployment 来说只剩一个可用的 Pod 了。 - -Deployment 创建 `pod-b` 的替代 pod `pod-e`。因为集群中没有足够的资源来调度 `pod-e`,drain 命令再次阻塞。集群最终将是下面这种状态: +Deployment 创建 `pod-b` 的替代 Pod `pod-e`。 +因为集群中没有足够的资源来调度 `pod-e`,drain 命令再次阻塞。集群最终将是下面这种状态: | node-1 *drained* | node-2 | node-3 | *no node* | |:--------------------:|:-------------------:|:------------------:|:------------------:| @@ -411,14 +401,12 @@ Deployment 创建 `pod-b` 的替代 pod `pod-e`。因为集群中没有足够的 At this point, the cluster administrator needs to add a node back to the cluster to proceed with the upgrade. --> - 此时,集群管理员需要增加一个节点到集群中以继续升级操作。 - 可以看到 Kubernetes 如何改变干扰发生的速率,根据: - - 应用程序需要多少个副本 - 优雅关闭应用实例需要多长时间 - 启动应用新实例需要多长时间 @@ -437,16 +424,13 @@ can happen, according to: -## 分离集群所有者和应用所有者角色 - - +## 分离集群所有者和应用所有者角色 通常,将集群管理者和应用所有者视为彼此了解有限的独立角色是很有用的。这种责任分离在下面这些场景下是有意义的: @@ -455,7 +439,6 @@ may make sense in these scenarios: there is natural specialization of roles - when third-party tools or services are used to automate cluster management --> - - 当有许多应用程序团队共用一个 Kubernetes 集群,并且有自然的专业角色 - 当第三方工具或服务用于集群自动化管理 @@ -463,30 +446,24 @@ may make sense in these scenarios: Pod Disruption Budgets support this separation of roles by providing an interface between the roles. --> - Pod 干扰预算通过在角色之间提供接口来支持这种分离。 - 如果你的组织中没有这样的责任分离,则可能不需要使用 Pod 干扰预算。 -## 如何在集群上执行干扰操作 - - +## 如何在集群上执行干扰性操作 如果你是集群管理员,并且需要对集群中的所有节点执行干扰操作,例如节点或系统软件升级,则可以使用以下选项 - - -* 参考[配置 Pod 干扰预算](/docs/tasks/run-application/configure-pdb/)中的方法来保护你的 -用。 - - - -* 了解更多关于[排空节点](/docs/tasks/administer-cluster/safely-drain-node/)的信息。 - +* 参考[配置 Pod 干扰预算](/zh/docs/tasks/run-application/configure-pdb/)中的方法来保护你的应用。 +* 进一步了解[排空节点](/zh/docs/tasks/administer-cluster/safely-drain-node/)的信息。 +* 了解[更新 Deployment](/zh/docs/concepts/workloads/controllers/deployment/#updating-a-deployment) + 的过程,包括如何在其进程中维持应用的可用性 diff --git a/content/zh/docs/concepts/workloads/pods/ephemeral-containers.md b/content/zh/docs/concepts/workloads/pods/ephemeral-containers.md index 7e9a894d8d..430a1d3c55 100644 --- a/content/zh/docs/concepts/workloads/pods/ephemeral-containers.md +++ b/content/zh/docs/concepts/workloads/pods/ephemeral-containers.md @@ -5,14 +5,9 @@ weight: 80 --- @@ -21,12 +16,13 @@ weight: 80 - -此页面概述了临时容器:一种特殊的容器,该容器在现有 {{< glossary_tooltip term_id="pod" >}} 中临时运行,为了完成用户启动的操作,例如故障排查。使用临时容器来检查服务,而不是构建应用程序。 +本页面概述了临时容器:一种特殊的容器,该容器在现有 {{< glossary_tooltip text="Pod" term_id="pod" >}} +中临时运行,以便完成用户发起的操作,例如故障排查。 +你会使用临时容器来检查服务,而不是用它来构建应用程序。 - {{< warning >}} -临时容器处于早期的 alpha 阶段,不适用于生产环境集群。应该预料到临时容器在某些情况下不起作用,例如在定位容器的命名空间时。根据 [Kubernetes 弃用政策](/docs/reference/using-api/deprecation-policy/),该 alpha 功能将来可能发生重大变化或完全删除。 +临时容器处于早期的 alpha 阶段,不适用于生产环境集群。 +应该预料到临时容器在某些情况下不起作用,例如在定位容器的命名空间时。 +根据 [Kubernetes 弃用政策](/zh/docs/reference/using-api/deprecation-policy/), +此 alpha 功能将来可能发生重大变化或被完全删除。 {{< /warning >}} - - -## 了解临时容器 - - +## 了解临时容器 -{{< glossary_tooltip text="Pods" term_id="pod" >}} 是 Kubernetes 应用程序的基本构建块。由于 pod 是一次性且可替换的,因此一旦 Pod 创建,就无法将容器加入到 Pod 中。取而代之的是,通常使用 {{< glossary_tooltip text="deployments" term_id="deployment" >}} 以受控的方式来删除并替换 Pod。 +{{< glossary_tooltip text="Pod" term_id="pod" >}} 是 Kubernetes 应用程序的基本构建块。 +由于 Pod 是一次性且可替换的,因此一旦 Pod 创建,就无法将容器加入到 Pod 中。 +取而代之的是,通常使用 {{< glossary_tooltip text="Deployment" term_id="deployment" >}} +以受控的方式来删除并替换 Pod。 - -有时有必要检查现有 Pod 的状态,例如,对于难以复现的故障进行排查。在这些场景中,可以在现有 Pod 中运行临时容器来检查其状态并运行任意命令。 +有时有必要检查现有 Pod 的状态。例如,对于难以复现的故障进行排查。 +在这些场景中,可以在现有 Pod 中运行临时容器来检查其状态并运行任意命令。 -### 什么是临时容器? - - +### 什么是临时容器? -临时容器与其他容器的不同之处在于,它们缺少对资源或执行的保证,并且永远不会自动重启,因此不适用于构建应用程序。临时容器使用与常规容器相同的 `ContainerSpec` 段进行描述,但许多字段是不相容且不允许的。 +临时容器与其他容器的不同之处在于,它们缺少对资源或执行的保证,并且永远不会自动重启, +因此不适用于构建应用程序。 +临时容器使用与常规容器相同的 `ContainerSpec` 节来描述,但许多字段是不兼容和不允许的。 +- 临时容器没有端口配置,因此像 `ports`,`livenessProbe`,`readinessProbe` + 这样的字段是不允许的。 -- 临时容器没有端口配置,因此像 `ports`,`livenessProbe`,`readinessProbe` 这样的字段是不允许的。 - Pod 资源分配是不可变的,因此 `resources` 配置是不允许的。 -- 有关允许字段的完整列表,请参见[临时容器参考文档](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#ephemeralcontainer-v1-core)。 + +- 有关允许字段的完整列表,请参见 + [EphemeralContainer 参考文档](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#ephemeralcontainer-v1-core)。 - -临时容器是使用 API 中的一种特殊的 `ephemeralcontainers` 处理器进行创建的,而不是直接添加到 `pod.spec` 段,因此无法使用 `kubectl edit` 来添加一个临时容器。 +临时容器是使用 API 中的一种特殊的 `ephemeralcontainers` 处理器进行创建的, +而不是直接添加到 `pod.spec` 段,因此无法使用 `kubectl edit` 来添加一个临时容器。 - 与常规容器一样,将临时容器添加到 Pod 后,将不能更改或删除临时容器。 -## 临时容器的用途 - - +## 临时容器的用途 -当由于容器崩溃或容器镜像不包含调试实用程序而导致 `kubectl exec` 无用时,临时容器对于交互式故障排查很有用。 +当由于容器崩溃或容器镜像不包含调试工具而导致 `kubectl exec` 无用时, +临时容器对于交互式故障排查很有用。 - -尤其是,[distroless 镜像](https://github.com/GoogleContainerTools/distroless)能够使得部署最小的容器镜像,从而减少攻击面并减少故障和漏洞的暴露。由于 distroless 镜像不包含 shell 或任何的调试工具,因此很难单独使用 `kubectl exec` 命令进行故障排查。 +尤其是,[distroless 镜像](https://github.com/GoogleContainerTools/distroless) +允许用户部署最小的容器镜像,从而减少攻击面并减少故障和漏洞的暴露。 +由于 distroless 镜像不包含 Shell 或任何的调试工具,因此很难单独使用 +`kubectl exec` 命令进行故障排查。 - -使用临时容器时,启用[进程命名空间共享](/docs/tasks/configure-pod-container/share-process-namespace/)很有帮助,可以查看其他容器中的进程。 +使用临时容器时,启用[进程名字空间共享](/zh/docs/tasks/configure-pod-container/share-process-namespace/) +很有帮助,可以查看其他容器中的进程。 -### 示例 - - +### 示例 {{< note >}} -本节中的示例要求启用 `EphemeralContainers` [特性](/docs/reference/command-line-tools-reference/feature-gates/),并且 kubernetes 客户端和服务端版本要求为 v1.16 或更高版本。 +本节中的示例要求启用 `EphemeralContainers` +[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/), +并且 kubernetes 客户端和服务端版本要求为 v1.16 或更高版本。 {{< /note >}} - -本节中的示例演示了临时容器如何出现在 API 中。 通常,您可以使用 `kubectl` 插件进行故障排查,从而自动化执行这些步骤。 +本节中的示例演示了临时容器如何出现在 API 中。 +通常,你可以使用 `kubectl` 插件进行故障排查,从而自动化执行这些步骤。 - -临时容器是使用 Pod 的 `ephemeralcontainers` 子资源创建的,可以使用 `kubectl --raw` 命令进行显示。首先描述临时容器被添加为一个 `EphemeralContainers` 列表: +临时容器是使用 Pod 的 `ephemeralcontainers` 子资源创建的,可以使用 +`kubectl --raw` 命令进行显示。 +首先描述临时容器被添加为一个 `EphemeralContainers` 列表: ```json { @@ -200,7 +197,6 @@ the ephemeral container to add as an `EphemeralContainers` list: - 使用如下命令更新已运行的临时容器 `example-pod`: ```shell @@ -210,7 +206,6 @@ kubectl replace --raw /api/v1/namespaces/default/pods/example-pod/ephemeralconta - 这将返回临时容器的新列表: ```json @@ -247,13 +242,14 @@ This will return the new list of ephemeral containers: - 可以使用以下命令查看新创建的临时容器的状态: ```shell kubectl describe pod example-pod ``` +输出为: + ``` ... Ephemeral Containers: @@ -277,7 +273,6 @@ Ephemeral Containers: - 可以使用以下命令连接到新的临时容器: ```shell @@ -288,22 +283,16 @@ kubectl attach -it example-pod -c debugger If process namespace sharing is enabled, you can see processes from all the containers in that Pod. For example, after attaching, you run `ps` in the debugger container: --> - 如果启用了进程命名空间共享,则可以查看该 Pod 所有容器中的进程。 例如,运行上述 `attach` 操作后,在调试器容器中运行 `ps` 操作: - - ```shell # 在 "debugger" 临时容器内中运行此 shell 命令 ps auxww ``` + 运行命令后,输出类似于: + ``` PID USER TIME COMMAND 1 root 0:00 /pause @@ -321,4 +310,3 @@ PID USER TIME COMMAND 29 root 0:00 ps auxww ``` - diff --git a/content/zh/docs/concepts/workloads/pods/init-containers.md b/content/zh/docs/concepts/workloads/pods/init-containers.md index 814891bcd0..956b0518c2 100644 --- a/content/zh/docs/concepts/workloads/pods/init-containers.md +++ b/content/zh/docs/concepts/workloads/pods/init-containers.md @@ -12,30 +12,26 @@ This page provides an overview of init containers: specialized containers that r Init containers can contain utilities or setup scripts not present in an app image. --> -本页提供了 Init 容器的概览,它是一种专用的容器,在{{< glossary_tooltip text="Pod" term_id="pod" >}}内的应用容器启动之前运行,并包括一些应用镜像中不存在的实用工具和安装脚本。 - - +本页提供了 Init 容器的概览,它是一种特殊容器,在 {{< glossary_tooltip text="Pod" term_id="pod" >}} +内的应用容器启动之前运行,可以包括一些应用镜像中不存在的实用工具和安装脚本。 -你可以在Pod的规格信息中与containers数组同级的位置指定 Init 容器。 - +你可以在 Pod 的规约中与用来描述应用容器的 `containers` 数组平行的位置指定 +Init 容器。 + - ## 理解 Init 容器 - - -{{< glossary_tooltip text="Pod" term_id="pod" >}} 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。 - +每个 {{< glossary_tooltip text="Pod" term_id="pod" >}} 中可以包含多个容器, +应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。 -如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 `restartPolicy` 值为 Never,它不会重新启动。 - +如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。 +然而,如果 Pod 对应的 `restartPolicy` 值为 Never,Kubernetes 不会重新启动 Pod。 -指定容器为 Init 容器,需要在 Pod 的 spec 中添加 `initContainers` 字段, 该字段內以[Container](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#container-v1-core) 类型对象数组的形式组织,和应用的 `containers` 数组同级相邻。 -Init 容器的状态在 `status.initContainerStatuses` 字段中以容器状态数组的格式返回(类似 `status.containerStatuses` 字段)。 - +为 Pod 设置 Init 容器需要在 Pod 的 `spec` 中添加 `initContainers` 字段, +该字段以 [Container](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#container-v1-core) +类型对象数组的形式组织,和应用的 `containers` 数组同级相邻。 +Init 容器的状态在 `status.initContainerStatuses` 字段中以容器状态数组的格式返回 +(类似 `status.containerStatuses` 字段)。 - ### 与普通容器的不同之处 -Init 容器支持应用容器的全部字段和特性,包括资源限制、数据卷和安全设置。 然而,Init 容器对资源请求和限制的处理稍有不同,在下面 [资源](#资源) 处有说明。 +Init 容器支持应用容器的全部字段和特性,包括资源限制、数据卷和安全设置。 +然而,Init 容器对资源请求和限制的处理稍有不同,在下面[资源](#resources)节有说明。 -同时 Init 容器不支持 `lifecycle`、`livenessProbe`、`readinessProbe` 和 `startupProbe`,因为它们必须在 Pod 就绪之前运行完成。 - -如果为一个 Pod 指定了多个 Init 容器,这些容器会按顺序逐个运行。每个 Init 容器必须运行成功,下一个才能够运行。当所有的 Init 容器运行完成时,Kubernetes 才会为 Pod 初始化应用容器并像平常一样运行。 +同时 Init 容器不支持 `lifecycle`、`livenessProbe`、`readinessProbe` 和 `startupProbe`, +因为它们必须在 Pod 就绪之前运行完成。 +如果为一个 Pod 指定了多个 Init 容器,这些容器会按顺序逐个运行。 +每个 Init 容器必须运行成功,下一个才能够运行。当所有的 Init 容器运行完成时, +Kubernetes 才会为 Pod 初始化应用容器并像平常一样运行。 -## Init 容器能做什么? +## 使用 Init 容器 因为 Init 容器具有与应用容器分离的单独镜像,其启动相关代码具有如下优势: -* Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。例如,没有必要仅为了在安装过程中使用类似 `sed`、 `awk`、 `python` 或 `dig` 这样的工具而去`FROM` 一个镜像来生成一个新的镜像。 -* Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。 -* 应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。 -* Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 {{< glossary_tooltip text="Secrets" term_id="secret" >}} 的权限,而应用容器不能够访问。 -* 由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。 +* Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。 + 例如,没有必要仅为了在安装过程中使用类似 `sed`、`awk`、`python` 或 `dig` + 这样的工具而去 `FROM` 一个镜像来生成一个新的镜像。 +* Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。 + +* 应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。 + +* Init 容器能以不同于 Pod 内应用容器的文件系统视图运行。因此,Init 容器可以访问 + 应用容器不能访问的 {{< glossary_tooltip text="Secret" term_id="secret" >}} 的权限。 + +* 由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器 + 提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。 + 一旦前置条件满足,Pod 内的所有的应用容器会并行启动。 - -### 示例 +### 示例 {#examples} 下面是一些如何使用 Init 容器的想法: * 等待一个 Service 完成创建,通过类似如下 shell 命令: - for i in {1..100}; do sleep 1; if dig myservice; then exit 0; fi; exit 1 + ```shell + for i in {1..100}; do sleep 1; if dig myservice; then exit 0; fi; exit 1 + ``` * 注册这个 Pod 到远程服务器,通过在命令中调用 API,类似如下: - curl -X POST http://$MANAGEMENT_SERVICE_HOST:$MANAGEMENT_SERVICE_PORT/register -d 'instance=$()&ip=$()' + ```shell + curl -X POST http://$MANAGEMENT_SERVICE_HOST:$MANAGEMENT_SERVICE_PORT/register \ + -d 'instance=$()&ip=$()' + ``` * 在启动应用容器之前等一段时间,使用类似命令: - sleep 60 + ```shell + sleep 60 + ``` -* 克隆 Git 仓库到 {{< glossary_tooltip text="Volume" term_id="volume" >}}。 -* 将配置值放到配置文件中,运行模板工具为主应用容器动态地生成配置文件。例如,在配置文件中存放 POD_IP 值,并使用 Jinja 生成主应用配置文件。 +* 克隆 Git 仓库到{{< glossary_tooltip text="卷" term_id="volume" >}}中。 +* 将配置值放到配置文件中,运行模板工具为主应用容器动态地生成配置文件。 + 例如,在配置文件中存放 `POD_IP` 值,并使用 Jinja 生成主应用配置文件。 -### 使用 Init 容器 +### 使用 Init 容器的情况 -下面的例子定义了一个具有 2 个 Init 容器的简单 Pod。 第一个等待 `myservice` 启动,第二个等待 `mydb` 启动。 一旦这两个 Init容器 都启动完成,Pod 将启动`spec`区域中的应用容器。 +下面的例子定义了一个具有 2 个 Init 容器的简单 Pod。 第一个等待 `myservice` 启动, +第二个等待 `mydb` 启动。 一旦这两个 Init容器 都启动完成,Pod 将启动 `spec` 节中的应用容器。 ```yaml apiVersion: v1 @@ -211,24 +225,26 @@ spec: targetPort: 9377 ``` - 要启动这个 Pod,可以执行如下命令: -``` +```shell kubectl apply -f myapp.yaml ``` +输出为: + ``` pod/myapp-pod created ``` - - 要检查其状态: -``` + +```shell kubectl get -f myapp.yaml ``` +输出类似于: + ``` NAME READY STATUS RESTARTS AGE myapp-pod 0/1 Init:0/2 0 6m @@ -236,10 +252,12 @@ myapp-pod 0/1 Init:0/2 0 6m 如需更详细的信息: -``` +```shell kubectl describe -f myapp.yaml ``` +输出类似于: + ``` Name: myapp-pod Namespace: default @@ -275,11 +293,11 @@ Events: 13s 13s 1 {kubelet 172.17.4.201} spec.initContainers{init-myservice} Normal Started Started container with docker id 5ced34a04634 ``` -如需查看Pod内 Init 容器的日志,请执行: +如需查看 Pod 内 Init 容器的日志,请执行: -``` -$ kubectl logs myapp-pod -c init-myservice # Inspect the first init container -$ kubectl logs myapp-pod -c init-mydb # Inspect the second init container +```shell +kubectl logs myapp-pod -c init-myservice # 查看第一个 Init 容器 +kubectl logs myapp-pod -c init-mydb # 查看第二个 Init 容器 ``` - -在这一刻,Init 容器将会等待至发现名称为`mydb`和`myservice`的 Service。 +在这一刻,Init 容器将会等待至发现名称为 `mydb` 和 `myservice` 的 Service。 如下为创建这些 Service 的配置文件: -``` +```yaml --- apiVersion: v1 kind: Service @@ -315,75 +332,90 @@ spec: targetPort: 9377 ``` - -创建`mydb`和`myservice`的 service 命令: +创建 `mydb` 和 `myservice` 服务的命令: ```shell -$ kubectl create -f services.yaml +kubectl create -f services.yaml ``` +输出类似于: + ``` service "myservice" created service "mydb" created ``` -这样你将能看到这些 Init容器 执行完毕,随后`my-app`的Pod转移进入 Running 状态: +这样你将能看到这些 Init 容器执行完毕,随后 `my-app` 的 Pod 进入 `Running` 状态: + ```shell $ kubectl get -f myapp.yaml ``` -```shell + +``` NAME READY STATUS RESTARTS AGE myapp-pod 1/1 Running 0 9m ``` -一旦我们启动了 `mydb` 和 `myservice` 这两个 Service,我们能够看到 Init 容器完成,并且 `myapp-pod` 被创建: - +一旦我们启动了 `mydb` 和 `myservice` 这两个服务,我们能够看到 Init 容器完成, +并且 `myapp-pod` 被创建。 -这个简单的例子应该能为你创建自己的 Init 容器提供一些启发。 [What's next](#what-s-next) 部分提供了更详细例子的链接。 - +这个简单例子应该能为你创建自己的 Init 容器提供一些启发。 +[接下来](#what-s-next)节提供了更详细例子的链接。 +## 具体行为 {#detailed-behavior} +在 Pod 启动过程中,每个 Init 容器在网络和数据卷初始化之后会按顺序启动。 +每个 Init 容器成功退出后才会启动下一个 Init 容器。 +如果它们因为容器运行时的原因无法启动,或以错误状态退出,它会根据 Pod 的 `restartPolicy` 策略进行重试。 +然而,如果 Pod 的 `restartPolicy` 设置为 "Always",Init 容器失败时会使用 `restartPolicy` +的 "OnFailure" 策略。 + +在所有的 Init 容器没有成功之前,Pod 将不会变成 `Ready` 状态。 +Init 容器的端口将不会在 Service 中进行聚集。正在初始化中的 Pod 处于 `Pending` 状态, +但会将状况 `Initializing` 设置为 true。 + +如果 Pod [重启](#pod-restart-reasons),所有 Init 容器必须重新执行。 + + +对 Init 容器规约的修改仅限于容器的 `image` 字段。 +更改 Init 容器的 `image` 字段,等同于重启该 Pod。 +因为 Init 容器可能会被重启、重试或者重新执行,所以 Init 容器的代码应该是幂等的。 +特别地,基于 `emptyDirs` 写文件的代码,应该对输出文件可能已经存在做好准备。 + +Init 容器具有应用容器的所有字段。然而 Kubernetes 禁止使用 `readinessProbe`, +因为 Init 容器不能定义不同于完成态(Completion)的就绪态(Readiness)。 +Kubernetes 会在校验时强制执行此检查。 + + +在 Pod 上使用 `activeDeadlineSeconds` 和在容器上使用 `livenessProbe` 可以避免 +Init 容器一直重复失败。`activeDeadlineSeconds` 时间包含了 Init 容器启动的时间。 -## 具体行为 - -在 Pod 启动过程中,每个Init 容器在网络和数据卷初始化之后会按顺序启动。每个 Init容器 成功退出后才会启动下一个 Init容器。 如果因为运行或退出时失败引发容器启动失败,它会根据 Pod 的 `restartPolicy` 策略进行重试。 -然而,如果 Pod 的 `restartPolicy` 设置为 Always,Init 容器失败时会使用 `restartPolicy` 的 OnFailure 策略。 - -在所有的 Init 容器没有成功之前,Pod 将不会变成 `Ready` 状态。 Init 容器的端口将不会在 Service 中进行聚集。 正在初始化中的 Pod 处于 `Pending` 状态,但会将条件 `Initializing` 设置为 true。 - -如果 Pod [重启](#pod-restart-reasons),所有 Init 容器必须重新执行。 - -对 Init 容器 spec 的修改仅限于容器的 image 字段。 更改 Init 容器的 image 字段,等同于重启该 Pod。 - -因为 Init 容器可能会被重启、重试或者重新执行,所以 Init 容器的代码应该是幂等的。 特别地,基于 `EmptyDirs` 写文件的代码,应该对输出文件可能已经存在做好准备。 - -Init 容器具有应用容器的所有字段。 然而 Kubernetes 禁止使用 `readinessProbe`,因为 Init 容器不能定义不同于完成(completion)的就绪(readiness)。 这一点会在校验时强制执行。 - -在 Pod 上使用 `activeDeadlineSeconds`和在容器上使用 `livenessProbe` 可以避免 Init 容器一直重复失败。 `activeDeadlineSeconds` 时间包含了 Init 容器启动的时间。 - -在 Pod 中的每个应用容器和 Init 容器的名称必须唯一;与任何其它容器共享同一个名称,会在校验时抛出错误。 - +在 Pod 中的每个应用容器和 Init 容器的名称必须唯一; +与任何其它容器共享同一个名称,会在校验时抛出错误。 +### 资源 {#resources} -### 资源 - -给定Init 容器的执行顺序下,资源使用适用于如下规则: +在给定的 Init 容器执行顺序下,资源使用适用于如下规则: * 所有 Init 容器上定义的任何特定资源的 limit 或 request 的最大值,作为 Pod *有效初始 request/limit* * Pod 对资源的 *有效 limit/request* 是如下两者的较大者: * 所有应用容器对某个资源的 limit/request 之和 * 对某个资源的有效初始 limit/request -* 基于有效 limit/request 完成调度,这意味着 Init 容器能够为初始化过程预留资源,这些资源在 Pod 生命周期过程中并没有被使用。 +* 基于有效 limit/request 完成调度,这意味着 Init 容器能够为初始化过程预留资源, + 这些资源在 Pod 生命周期过程中并没有被使用。 * Pod 的 *有效 QoS 层* ,与 Init 容器和应用容器的一样。 配额和限制适用于有效 Pod的 limit/request。 Pod 级别的 cgroups 是基于有效 Pod 的 limit/request,和调度器相同。 - -### Pod 重启的原因 - -Pod重启导致 Init 容器重新执行,主要有如下几个原因: - -* 用户更新 Pod 的 Spec 导致 Init 容器镜像发生改变。Init 容器镜像的变更会引起 Pod 重启. 应用容器镜像的变更仅会重启应用容器。 -* Pod 的基础设施容器 (译者注:如 pause 容器) 被重启。 这种情况不多见,必须由具备 root 权限访问 Node 的人员来完成。 -* 当 `restartPolicy` 设置为 Always,Pod 中所有容器会终止而强制重启,由于垃圾收集导致 Init 容器的完成记录丢失。 +### Pod 重启的原因 {#pod-restart-reasons} +Pod 重启会导致 Init 容器重新执行,主要有如下几个原因: +* 用户更新 Pod 的规约导致 Init 容器镜像发生改变。Init 容器镜像的变更会引起 Pod 重启。 + 应用容器镜像的变更仅会重启应用容器。 +* Pod 的基础设施容器 (译者注:如 `pause` 容器) 被重启。这种情况不多见, + 必须由具备 root 权限访问节点的人员来完成。 +* 当 `restartPolicy` 设置为 "`Always`",Pod 中所有容器会终止而强制重启。 + 由于垃圾收集机制的原因,Init 容器的完成记录将会丢失。 ## {{% heading "whatsnext" %}} - -* 阅读[创建包含 Init 容器的 Pod](/docs/tasks/configure-pod-container/configure-pod-initialization/#create-a-pod-that-has-an-init-container) -* 学习如何[调测 Init 容器](/docs/tasks/debug-application-cluster/debug-init-containers/) +* 阅读[创建包含 Init 容器的 Pod](/zh/docs/tasks/configure-pod-container/configure-pod-initialization/#create-a-pod-that-has-an-init-container) +* 学习如何[调试 Init 容器](/zh/docs/tasks/debug-application-cluster/debug-init-containers/) + diff --git a/content/zh/docs/concepts/workloads/pods/pod-lifecycle.md b/content/zh/docs/concepts/workloads/pods/pod-lifecycle.md index 767c18bdd2..3cbca2f16d 100644 --- a/content/zh/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/zh/docs/concepts/workloads/pods/pod-lifecycle.md @@ -1,180 +1,853 @@ --- title: Pod 的生命周期 content_type: concept +weight: 30 --- + -{{< comment >}}Updated: 4/14/2015{{< /comment >}} -{{< comment >}}Edited and moved to Concepts section: 2/2/17{{< /comment >}} + +本页面讲述 Pod 的生命周期。 +Pod 遵循一个预定义的生命周期,起始于 `Pending` [阶段](#pod-phase),如果至少 +其中有一个主要容器正常启动,则进入 `Running`,之后取决于 Pod 中是否有容器以 +失败状态结束而进入 `Succeeded` 或者 `Failed` 阶段。 +在 Pod 运行期间,`kubelet` 能够重启容器以处理一些失效场景。 +在 Pod 内部,Kubernetes 跟踪不同容器的[状态](#container-states) +并处理可能出现的状况。 + +在 Kubernetes API 中,Pod 包含规约部分和实际状态部分。 +Pod 对象的状态包含了一组 [Pod 状况(Conditions)](#pod-conditions)。 +如果应用需要的话,你也可以向其中注入[自定义的就绪性信息](#pod-readiness-gate)。 + +Pod 在其生命周期中只会被[调度](/zh/docs/concepts/scheduling-eviction/)一次。 +一旦 Pod 被调度(分派)到某个节点,Pod 会一直在该节点运行,直到 Pod 停止或者 +被[终止](#pod-termination)。 + +## Pod 生命期 {#pod-lifetime} + +和一个个独立的应用容器一样,Pod 也被认为是相对临时性(而不是长期存在)的实体。 +Pod 会被创建、赋予一个唯一的 +ID([UID](/zh/docs/concepts/overview/working-with-objects/names/#uids)), +并被调度到节点,并在终止(根据重启策略)或删除之前一直运行在该节点。 + +如果一个{{< glossary_tooltip text="节点" term_id="node" >}}死掉了,调度到该节点 +的 Pod 也被计划在给定超时期限结束后[删除](#pod-garbage-collection)。 + + +Pod 自身不具有自愈能力。如果 Pod 被调度到某{{< glossary_tooltip text="节点" term_id="node" >}} +而该节点之后失效,或者调度操作本身失效,Pod 会被删除;与此类似,Pod 无法在节点资源 +耗尽或者节点维护期间继续存活。Kubernetes 使用一种高级抽象,称作 +{{< glossary_tooltip term_id="controller" text="控制器" >}},来管理这些相对而言 +可随时丢弃的 Pod 实例。 + + +任何给定的 Pod (由 UID 定义)从不会被“重新调度(rescheduled)”到不同的节点; +相反,这一 Pod 可以被一个新的、几乎完全相同的 Pod 替换掉。 +如果需要,新 Pod 的名字可以不变,但是其 UID 会不同。 + +如果某物声称其生命期与某 Pod 相同,例如存储{{< glossary_tooltip term_id="volume" text="卷" >}}, +这就意味着该对象在此 Pod (UID 亦相同)存在期间也一直存在。 +如果 Pod 因为任何原因被删除,甚至某完全相同的替代 Pod 被创建时, +这个相关的对象(例如这里的卷)也会被删除并重建。 + +{{< figure src="/images/docs/pod.svg" title="Pod 结构图例" width="50%" >}} + +*一个包含多个容器的 Pod 中包含一个用来拉取文件的程序和一个 Web 服务器, +均使用持久卷作为容器间共享的存储。* + + +## Pod 阶段 {#pod-phase} + +Pod 的 `status` 字段是一个 +[PodStatus](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podstatus-v1-core) +对象,其中包含一个 `phase` 字段。 + +Pod 的阶段(Phase)是 Pod 在其生命周期中所处位置的简单宏观概述。 +该阶段并不是对容器或 Pod 状态的综合汇总,也不是为了成为完整的状态机。 + +Pod 阶段的数量和含义是严格定义的。 +除了本文档中列举的内容外,不应该再假定 Pod 有其他的 `phase` 值。 下面是 `phase` 可能的值: -- 挂起(Pending):Pod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建。等待时间包括调度 Pod 的时间和通过网络下载镜像的时间,这可能需要花点时间。 -- 运行中(Running):该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。 -- 成功(Succeeded):Pod 中的所有容器都被成功终止,并且不会再重启。 -- 失败(Failed):Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。 -- 未知(Unknown):因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败。 - -## Pod 状态 - -Pod 有一个 PodStatus 对象,其中包含一个 [PodCondition](/docs/resources-reference/v1.7/#podcondition-v1-core) 数组。 PodCondition 数组的每个元素都有一个 `type` 字段和一个 `status` 字段。`type` 字段是字符串,可能的值有 PodScheduled、Ready、Initialized 和 Unschedulable。`status` 字段是一个字符串,可能的值有 True、False 和 Unknown。 - -## 容器探针 - -[探针](/docs/resources-reference/v1.7/#probe-v1-core) 是由 [kubelet](/docs/admin/kubelet/) 对容器执行的定期诊断。要执行诊断,kubelet 调用由容器实现的 [Handler](https://godoc.org/k8s.io/kubernetes/pkg/api/v1#Handler)。有三种类型的处理程序: - -- [ExecAction](/docs/resources-reference/v1.7/#execaction-v1-core):在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。 -- [TCPSocketAction](/docs/resources-reference/v1.7/#tcpsocketaction-v1-core):对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的。 -- [HTTPGetAction](/docs/resources-reference/v1.7/#httpgetaction-v1-core):对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的。 - -每次探测都将获得以下三种结果之一: - -- 成功:容器通过了诊断。 -- 失败:容器未通过诊断。 -- 未知:诊断失败,因此不会采取任何行动。 - -Kubelet 可以选择是否执行在容器上运行的三种探针执行和做出反应: - -- `livenessProbe`:指示容器是否正在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 [重启策略](/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy) 的影响。如果容器不提供存活探针,则默认状态为 `Success`。 -- `readinessProbe`:指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 `Failure`。如果容器不提供就绪探针,则默认状态为 `Success`。 -- `startupProbe`: 指示容器中的应用是否已经启动。如果提供了启动探测(startup probe),则禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet 将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探测,则默认状态为成功`Success`。 - -### 该什么时候使用存活(liveness)和就绪(readiness)探针? - -如果容器中的进程能够在遇到问题或不健康的情况下自行崩溃,则不一定需要存活探针; kubelet 将根据 Pod 的`restartPolicy` 自动执行正确的操作。 - -如果您希望容器在探测失败时被杀死并重新启动,那么请指定一个存活探针,并指定`restartPolicy` 为 Always 或 OnFailure。 - -如果要仅在探测成功时才开始向 Pod 发送流量,请指定就绪探针。在这种情况下,就绪探针可能与存活探针相同,但是 spec 中的就绪探针的存在意味着 Pod 将在没有接收到任何流量的情况下启动,并且只有在探针探测成功后才开始接收流量。 - -如果您希望容器能够自行维护,您可以指定一个就绪探针,该探针检查与存活探针不同的端点。 - -请注意,如果您只想在 Pod 被删除时能够排除请求,则不一定需要使用就绪探针;在删除 Pod 时,Pod 会自动将自身置于未完成状态,无论就绪探针是否存在。当等待 Pod 中的容器停止时,Pod 仍处于未完成状态。 - -## Pod 和容器状态 - -有关 Pod 容器状态的详细信息,请参阅 [PodStatus](/docs/resources-reference/v1.7/#podstatus-v1-core) 和 [ContainerStatus](/docs/resources-reference/v1.7/#containerstatus-v1-core)。请注意,报告的 Pod 状态信息取决于当前的 [ContainerState](/docs/resources-reference/v1.7/#containerstatus-v1-core)。 - -## 重启策略 - -PodSpec 中有一个 `restartPolicy` 字段,可能的值为 Always、OnFailure 和 Never。默认为 Always。 `restartPolicy` 适用于 Pod 中的所有容器。`restartPolicy` 仅指通过同一节点上的 kubelet 重新启动容器。失败的容器由 kubelet 以五分钟为上限的指数退避延迟(10秒,20秒,40秒...)重新启动,并在成功执行十分钟后重置。如 [Pod 文档](/docs/user-guide/pods/#durability-of-pods-or-lack-thereof) 中所述,一旦绑定到一个节点,Pod 将永远不会重新绑定到另一个节点。 - -## Pod 的生命 - -一般来说,Pod 不会消失,直到人为销毁他们。这可能是一个人或控制器。这个规则的唯一例外是成功或失败的 `phase` 超过一段时间(由 master 确定)的Pod将过期并被自动销毁。 - -有三种可用的控制器: - -- 使用 [Job](/docs/concepts/jobs/run-to-completion-finite-workloads/) 运行预期会终止的 Pod,例如批量计算。Job 仅适用于重启策略为 `OnFailure` 或 `Never` 的 Pod。 - - -- 对预期不会终止的 Pod 使用 [ReplicationController](/docs/concepts/workloads/controllers/replicationcontroller/)、[ReplicaSet](/docs/concepts/workloads/controllers/replicaset/) 和 [Deployment](/docs/concepts/workloads/controllers/deployment/) ,例如 Web 服务器。 ReplicationController 仅适用于具有 `restartPolicy` 为 Always 的 Pod。 -- 提供特定于机器的系统服务,使用 [DaemonSet](/docs/concepts/workloads/controllers/daemonset/) 为每台机器运行一个 Pod 。 - -所有这三种类型的控制器都包含一个 PodTemplate。建议创建适当的控制器,让它们来创建 Pod,而不是直接自己创建 Pod。这是因为单独的 Pod 在机器故障的情况下没有办法自动复原,而控制器却可以。 - -如果节点死亡或与集群的其余部分断开连接,则 Kubernetes 将应用一个策略将丢失节点上的所有 Pod 的 `phase` 设置为 Failed。 - -## 示例 - -### 高级 liveness 探针示例 - -存活探针由 kubelet 来执行,因此所有的请求都在 kubelet 的网络命名空间中进行。 + +取值 | 描述 +:-----|:----------- +`Pending`(悬决)| Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间, +`Running`(运行中) | Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。 +`Succeeded`(成功) | Pod 中的所有容器都已成功终止,并且不会再重启。 +`Failed`(失败) | Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。 +`Unknown`(未知) | 因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。 +如果某节点死掉或者与集群中其他节点失联,Kubernetes +会实施一种策略,将失去的节点上运行的所有 Pod 的 `phase` 设置为 `Failed`。 + + +## 容器状态 {#container-states} + +Kubernetes 会跟踪 Pod 中每个容器的状态,就像它跟踪 Pod 总体上的[阶段](#pod-phase)一样。 +你可以使用[容器生命周期回调](/zh/docs/concepts/containers/container-lifecycle-hooks/) +来在容器生命周期中的特定时间点触发事件。 + +一旦{{< glossary_tooltip text="调度器" term_id="kube-scheduler" >}}将 Pod +分派给某个节点,`kubelet` 就通过 +{{< glossary_tooltip text="容器运行时" term_id="container-runtime" >}} +开始为 Pod 创建容器。 +容器的状态有三种:`Waiting`(等待)、`Running`(运行中)和 +`Terminated`(已终止)。 + + +要检查 Pod 中容器的状态,你可以使用 `kubectl describe pod `。 +其输出中包含 Pod 中每个容器的状态。 + +每种状态都有特定的含义: + + +### `Waiting` (等待) {#container-state-waiting} + +如果容器并不处在 `Running` 或 `Terminated` 状态之一,它就处在 `Waiting` 状态。 +处于 `Waiting` 状态的容器仍在运行它完成启动所需要的操作:例如,从某个容器镜像 +仓库拉取容器镜像,或者向容器应用 {{< glossary_tooltip text="Secret" term_id="secret" >}} +数据等等。 +当你使用 `kubectl` 来查询包含 `Waiting` 状态的容器的 Pod 时,你也会看到一个 +Reason 字段,其中给出了容器处于等待状态的原因。 + + +### `Running`(运行中) {#container-state-running} + +`Running` 状态表明容器正在执行状态并且没有问题发生。 +如果配置了 `postStart` 回调,那么该回调已经执行完成。 +如果你使用 `kubectl` 来查询包含 `Running` 状态的容器的 Pod 时,你也会看到 +关于容器进入 `Running` 状态的信息。 + + +### `Terminated`(已终止) {#container-state-terminated} + +处于 `Terminated` 状态的容器已经开始执行并且或者正常结束或者因为某些原因失败。 +如果你使用 `kubectl` 来查询包含 `Terminated` 状态的容器的 Pod 时,你会看到 +容器进入此状态的原因、退出代码以及容器执行期间的起止时间。 + +如果容器配置了 `preStop` 回调,则该回调会在容器进入 `Terminated` +状态之前执行。 + + +## 容器重启策略 {#restart-policy} + +Pod 的 `spec` 中包含一个 `restartPolicy` 字段,其可能取值包括 +Always、OnFailure 和 Never。默认值是 Always。 + +`restartPolicy` 适用于 Pod 中的所有容器。`restartPolicy` 仅针对同一节点上 +`kubelet` 的容器重启动作。当 Pod 中的容器退出时,`kubelet` 会按指数回退 +方式计算重启的延迟(10s、20s、40s、...),其最长延迟为 5 分钟。 +一旦某容器执行了 10 分钟并且没有出现问题,`kubelet` 对该容器的重启回退计时器执行 +重置操作。 + + +## Pod 状况 {#pod-conditions} + +Pod 有一个 PodStatus 对象,其中包含一个 +[PodConditions](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podcondition-v1-core) +数组。Pod 可能通过也可能未通过其中的一些状况测试。 + + +* `PodScheduled`:Pod 已经被调度到某节点; +* `ContainersReady`:Pod 中所有容器都已就绪; +* `Initialized`:所有的 [Init 容器](/zh/docs/concepts/workloads/pods/init-containers/) + 都已成功启动; +* `Ready`:Pod 可以为请求提供服务,并且应该被添加到对应服务的负载均衡池中。 + + +字段名称 | 描述 +:--------------------|:----------- +`type` | Pod 状况的名称 +`status` | 表明该状况是否适用,可能的取值有 "`True`", "`False`" 或 "`Unknown`" +`lastProbeTime` | 上次探测 Pod 状况时的时间戳 +`lastTransitionTime` | Pod 上次从一种状态转换到另一种状态时的时间戳 +`reason` | 机器可读的、驼峰编码(UpperCamelCase)的文字,表述上次状况变化的原因 +`message` | 人类可读的消息,给出上次状态转换的详细信息 + + +### Pod 就绪态 {#pod-readiness-gate} + +{{< feature-state for_k8s_version="v1.14" state="stable" >}} + +你的应用可以向 PodStatus 中注入额外的反馈或者信号:_Pod Readiness(Pod 就绪态)_。 +要使用这一特性,可以设置 Pod 规约中的 `readinessGates` 列表,为 kubelet +提供一组额外的状况供其评估 Pod 就绪态时使用。 + + +就绪态门控基于 Pod 的 `status.conditions` 字段的当前值来做决定。 +如果 Kubernetes 无法在 `status.conditions` 字段中找到某状况,则该状况的 +状态值默认为 "`False`"。 + +这里是一个例子: ```yaml -apiVersion: v1 kind: Pod -metadata: - labels: - test: liveness - name: liveness-http +... spec: - containers: - - args: - - /server - image: k8s.gcr.io/liveness - livenessProbe: - httpGet: - # 当没有定义 "host" 时,使用 "PodIP" - # host: my-host - # 当没有定义 "scheme" 时,使用 "HTTP" scheme 只允许 "HTTP" 和 "HTTPS" - # scheme: HTTPS - path: /healthz - port: 8080 - httpHeaders: - - name: X-Custom-Header - value: Awesome - initialDelaySeconds: 15 - timeoutSeconds: 1 - name: liveness + readinessGates: + - conditionType: "www.example.com/feature-1" +status: + conditions: + - type: Ready # 内置的 Pod 状况 + status: "False" + lastProbeTime: null + lastTransitionTime: 2018-01-01T00:00:00Z + - type: "www.example.com/feature-1" # 额外的 Pod 状况 + status: "False" + lastProbeTime: null + lastTransitionTime: 2018-01-01T00:00:00Z + containerStatuses: + - containerID: docker://abcd... + ready: true +... ``` -### 状态示例 - -- Pod 中只有一个容器并且正在运行。容器成功退出。 - - 记录完成事件。 - - 如果 `restartPolicy` 为: - - Always:重启容器;Pod `phase` 仍为 Running。 - - OnFailure:Pod `phase` 变成 Succeeded。 - - Never:Pod `phase` 变成 Succeeded。 -- Pod 中只有一个容器并且正在运行。容器退出失败。 - - 记录失败事件。 - - 如果 `restartPolicy` 为: - - Always:重启容器;Pod `phase` 仍为 Running。 - - OnFailure:重启容器;Pod `phase` 仍为 Running。 - - Never:Pod `phase` 变成 Failed。 -- Pod 中有两个容器并且正在运行。有一个容器退出失败。 - - 记录失败事件。 - - 如果 restartPolicy 为: - - Always:重启容器;Pod `phase` 仍为 Running。 - - OnFailure:重启容器;Pod `phase` 仍为 Running。 - - Never:不重启容器;Pod `phase` 仍为 Running。 - - 如果有一个容器没有处于运行状态,并且两个容器退出: - - 记录失败事件。 - - 如果 `restartPolicy` 为: - - Always:重启容器;Pod `phase` 仍为 Running。 - - OnFailure:重启容器;Pod `phase` 仍为 Running。 - - Never:Pod `phase` 变成 Failed。 -- Pod 中只有一个容器并处于运行状态。容器运行时内存超出限制: - - 容器以失败状态终止。 - - 记录 OOM 事件。 - - 如果 `restartPolicy` 为: - - Always:重启容器;Pod `phase` 仍为 Running。 - - OnFailure:重启容器;Pod `phase` 仍为 Running。 - - Never: 记录失败事件;Pod `phase` 仍为 Failed。 -- Pod 正在运行,磁盘故障: - - 杀掉所有容器。 - - 记录适当事件。 - - Pod `phase` 变成 Failed。 - - 如果使用控制器来运行,Pod 将在别处重建。 -- Pod 正在运行,其节点被分段。 - - 节点控制器等待直到超时。 - - 节点控制器将 Pod `phase` 设置为 Failed。 - - 如果是用控制器来运行,Pod 将在别处重建。 - - + +你所添加的 Pod 状况名称必须满足 Kubernetes +[标签键名格式](/zh/docs/concepts/overview/working-with-objects/labels/#syntax-and-character-set)。 + +### Pod 就绪态的状态 {#pod-readiness-status} + +命令 `kubectl patch` 不支持修改对象的状态。 +如果需要设置 Pod 的 `status.conditions`,应用或者 +{{< glossary_tooltip term_id="operator-pattern" text="Operators">}} +需要使用 `PATCH` 操作。 +你可以使用 [Kubernetes 客户端库](/zh/docs/reference/using-api/client-libraries/) +之一来编写代码,针对 Pod 就绪态设置定制的 Pod 状况。 + + +对于使用定制状况的 Pod 而言,只有当下面的陈述都适用时,该 Pod 才会被评估为就绪: + +* Pod 中所有容器都已就绪; +* `readinessGates` 中的所有状况都为 `True` 值。 + +当 Pod 的容器都已就绪,但至少一个定制状况没有取值或者取值为 `False`, +`kubelet` 将 Pod 的[状况](#pod-conditions)设置为 `ContainersReady`。 + + +## 容器探针 {#container-probes} + +[探针](/zh/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#probe-v1-core) +是由 [kubelet](/zh/docs/reference/command-line-tools-reference/kubelet/) 对容器执行的定期诊断。 +要执行诊断,kubelet 调用由容器实现的 +[Handler](/zh/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#handler-v1-core) +(处理程序)。有三种类型的处理程序: + + +- [ExecAction](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#execaction-v1-core): + 在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。 + +- [TCPSocketAction](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#tcpsocketaction-v1-core): + 对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的。 + +- [HTTPGetAction](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#httpgetaction-v1-core): + 对容器的 IP 地址上指定端口和路径执行 HTTP Get 请求。如果响应的状态码大于等于 200 + 且小于 400,则诊断被认为是成功的。 + + +每次探测都将获得以下三种结果之一: + +- `Success`(成功):容器通过了诊断。 +- `Failure`(失败):容器未通过诊断。 +- `Unknown`(未知):诊断失败,因此不会采取任何行动。 + + +针对运行中的容器,`kubelet` 可以选择是否执行以下三种探针,以及如何针对探测结果作出反应: + + +- `livenessProbe`:指示容器是否正在运行。如果存活态探测失败,则 kubelet 会杀死容器, + 并且容器将根据其[重启策略](#restart-policy)决定未来。如果容器不提供存活探针, + 则默认状态为 `Success`。 + +- `readinessProbe`:指示容器是否准备好为请求提供服务。如果就绪态探测失败, + 端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。 + 初始延迟之前的就绪态的状态值默认为 `Failure`。 + 如果容器不提供就绪态探针,则默认状态为 `Success`。 + +- `startupProbe`: 指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被 + 禁用,直到此探针成功为止。如果启动探测失败,`kubelet` 将杀死容器,而容器依其 + [重启策略](#restart-policy)进行重启。 + 如果容器没有提供启动探测,则默认状态为 `Success`。 + + +如欲了解如何设置存活态、就绪态和启动探针的进一步细节,可以参阅 +[配置存活态、就绪态和启动探针](/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)。 + + +### 何时该使用存活态探针? {#when-should-you-use-a-liveness-probe} + +{{< feature-state for_k8s_version="v1.0" state="stable" >}} + + +如果容器中的进程能够在遇到问题或不健康的情况下自行崩溃,则不一定需要存活态探针; +`kubelet` 将根据 Pod 的`restartPolicy` 自动执行修复操作。 + +如果你希望容器在探测失败时被杀死并重新启动,那么请指定一个存活态探针, +并指定`restartPolicy` 为 "`Always`" 或 "`OnFailure`"。 + + +### 何时该使用就绪态探针? {#when-should-you-use-a-readiness-probe} + +{{< feature-state for_k8s_version="v1.0" state="stable" >}} + + +如果要仅在探测成功时才开始向 Pod 发送请求流量,请指定就绪态探针。 +在这种情况下,就绪态探针可能与存活态探针相同,但是规约中的就绪态探针的存在意味着 +Pod 将在启动阶段不接收任何数据,并且只有在探针探测成功后才开始接收数据。 + +如果你的容器需要加载大规模的数据、配置文件或者在启动期间执行迁移操作,可以添加一个 +就绪态探针。 + + +如果你希望容器能够自行进入维护状态,也可以指定一个就绪态探针,检查某个特定于 +就绪态的因此不同于存活态探测的端点。 + + +{{< note >}} +请注意,如果你只是想在 Pod 被删除时能够排空请求,则不一定需要使用就绪态探针; +在删除 Pod 时,Pod 会自动将自身置于未就绪状态,无论就绪态探针是否存在。 +等待 Pod 中的容器停止期间,Pod 会一直处于未就绪状态。 +{{< /note >}} + + +### 何时该使用启动探针? {#when-should-you-use-a-startup-probe} + +{{< feature-state for_k8s_version="v1.16" state="alpha" >}} + + +对于所包含的容器需要较长时间才能启动就绪的 Pod 而言,启动探针是有用的。 +你不再需要配置一个较长的存活态探测时间间隔,只需要设置另一个独立的配置选定, +对启动期间的容器执行探测,从而允许使用远远超出存活态时间间隔所允许的时长。 + + +如果你的容器启动时间通常超出 `initialDelaySeconds + failureThreshold × periodSeconds` +总值,你应该设置一个启动探测,对存活态探针所使用的同一端点执行检查。 +`periodSeconds` 的默认值是 30 秒。你应该将其 `failureThreshold` 设置得足够高, +以便容器有充足的时间完成启动,并且避免更改存活态探针所使用的默认值。 +这一设置有助于减少死锁状况的发生。 + + +## Pod 的终止 {#pod-termination} + +由于 Pod 所代表的是在集群中节点上运行的进程,当不再需要这些进程时允许其体面地 +终止是很重要的。一般不应武断地使用 `KILL` 信号终止它们,导致这些进程没有机会 +完成清理操作。 + + +设计的目标是令你能够请求删除进程,并且知道进程何时被终止,同时也能够确保删除 +操作终将完成。当你请求删除某个 Pod 时,集群会记录并跟踪 Pod 的体面终止周期, +而不是直接强制地杀死 Pod。在存在强制关闭设施的前提下, +{{< glossary_tooltip text="kubelet" term_id="kubelet" >}} 会尝试体面地终止 +Pod。 + + +通常情况下,容器运行时会发送一个 TERM 信号到每个容器中的主进程。 +一旦超出了体面终止限期,容器运行时会向所有剩余进程发送 KILL 信号,之后 +Pod 就会被从 {{< glossary_tooltip text="API 服务器" term_id="kube-apiserver" >}} +上移除。如果 `kubelet` 或者容器运行时的管理服务在等待进程终止期间被重启, +集群会从头开始重试,赋予 Pod 完整的体面终止限期。 + + +下面是一个例子: + +1. 你使用 `kubectl` 工具手动删除某个特定的 Pod,而该 Pod 的体面终止限期是默认值(30 秒)。 + +2. API 服务器中的 Pod 对象被更新,记录涵盖体面终止限期在内 Pod + 的最终死期,超出所计算时间点则认为 Pod 已死(dead)。 + 如果你使用 `kubectl describe` 来查验你正在删除的 Pod,该 Pod 会显示为 + "Terminating" (正在终止)。 + 在 Pod 运行所在的节点上:`kubelet` 一旦看到 Pod + 被标记为正在终止(已经设置了体面终止限期),`kubelet` 即开始本地的 Pod 关闭过程。 + + 1. 如果 Pod 中的容器之一定义了 `preStop` + [回调](/zh/docs/concepts/containers/container-lifecycle-hooks/#hook-details), + `kubelet` 开始在容器内运行该回调逻辑。如果超出体面终止限期时,`preStop` 回调逻辑 + 仍在运行,`kubelet` 会请求给予该 Pod 的宽限期一次性增加 2 秒钟。 + + {{< note >}} + 如果 `preStop` 回调所需要的时间长于默认的体面终止限期,你必须修改 + `terminationGracePeriodSeconds` 属性值来使其正常工作。 + {{< /note >}} + + 1. `kubelet` 接下来触发容器运行时发送 TERM 信号给每个容器中的进程 1。 + + {{< note >}} + Pod 中的容器会在不同时刻收到 TERM 信号,接收顺序也是不确定的。 + 如果关闭的顺序很重要,可以考虑使用 `preStop` 回调逻辑来协调。 + {{< /note >}} + + +3. 与此同时,`kubelet` 启动体面关闭逻辑,控制面会将 Pod 从对应的端点列表(以及端点切片列表, + 如果启用了的话)中移除,过滤条件是 Pod 被对应的 + {{< glossary_tooltip term_id="service" text="服务" >}}以某 + {{< glossary_tooltip text="选择算符" term_id="selector" >}}选定。 + {{< glossary_tooltip text="ReplicaSets" term_id="replica-set" >}}和其他工作负载资源 + 不再将关闭进程中的 Pod 视为合法的、能够提供服务的副本。关闭动作很慢的 Pod + 也无法继续处理请求数据,因为负载均衡器(例如服务代理)已经在终止宽限期开始的时候 + 将其从端点列表中移除。 + + +4. 超出终止宽限期线时,`kubelet` 会触发强制关闭过程。容器运行时会向 Pod 中所有容器内 + 仍在运行的进程发送 `SIGKILL` 信号。 + `kubelet` 也会清理隐藏的 `pause` 容器,如果容器运行时使用了这种容器的话。 + +5. `kubelet` 触发强制从 API 服务器上删除 Pod 对象的逻辑,并将体面终止限期设置为 0 + (这意味着马上删除)。 + +6. API 服务器删除 Pod 的 API 对象,从任何客户端都无法再看到该对象。 + + +### 强制终止 Pod {#pod-termination-forced} + +{{< caution >}} +对于某些工作负载及其 Pod 而言,强制删除很可能会带来某种破坏。 +{{< /caution >}} + +默认情况下,所有的删除操作都会附有 30 秒钟的宽限期限。 +`kubectl delete` 命令支持 `--grace-period=` 选项,允许你重载默认值, +设定自己希望的期限值。 + + +将宽限期限强制设置为 `0` 意味着立即从 API 服务器删除 Pod。 +如果 Pod 仍然运行于某节点上,强制删除操作会触发 `kubelet` 立即执行清理操作。 + + +{{< note >}} +你必须在设置 `--grace-period=0` 的同时额外设置 `--force` +参数才能发起强制删除请求。 +{{< /note >}} + + +执行强制删除操作时,API 服务器不再等待来自 `kubelet` 的、关于 Pod +已经在原来运行的节点上终止执行的确认消息。 +API 服务器直接删除 Pod 对象,这样新的与之同名的 Pod 即可以被创建。 +在节点侧,被设置为立即终止的 Pod 仍然会在被强行杀死之前获得一点点的宽限时间。 + +如果你需要强制删除 StatefulSet 的 Pod,请参阅 +[从 StatefulSet 中删除 Pod](/zh/docs/tasks/run-application/force-delete-stateful-set-pod/) +的任务文档。 + + +### 失效 Pod 的垃圾收集 {#pod-garbage-collection} + +对于已失败的 Pod 而言,对应的 API 对象仍然会保留在集群的 API 服务器上,直到 +用户或者{{< glossary_tooltip term_id="controller" text="控制器" >}}进程显式地 +将其删除。 + +控制面组件会在 Pod 个数超出所配置的阈值 +(根据 `kube-controller-manager` 的 `terminated-pod-gc-threshold` 设置)时 +删除已终止的 Pod(阶段值为 `Succeeded` 或 `Failed`)。 +这一行为会避免随着时间演进不断创建和终止 Pod 而引起的资源泄露问题。 + +## {{% heading "whatsnext" %}} + + + +* 动手实践[为容器生命周期时间关联处理程序](/zh/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/)。 +* 动手实践[配置存活态、就绪态和启动探针](/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)。 +* 进一步了解[容器生命周期回调](/zh/docs/concepts/containers/container-lifecycle-hooks/)。 +* 关于 API 中定义的有关 Pod/容器的详细规范信息, + 可参阅 [PodStatus](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podstatus-v1-core) + 和 [ContainerStatus](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#containerstatus-v1-core)。 diff --git a/content/zh/docs/concepts/workloads/pods/pod-topology-spread-constraints.md b/content/zh/docs/concepts/workloads/pods/pod-topology-spread-constraints.md index 826ca5bd78..4e7a2c5536 100644 --- a/content/zh/docs/concepts/workloads/pods/pod-topology-spread-constraints.md +++ b/content/zh/docs/concepts/workloads/pods/pod-topology-spread-constraints.md @@ -5,13 +5,9 @@ weight: 50 --- @@ -24,20 +20,16 @@ You can use _topology spread constraints_ to control how {{< glossary_tooltip te 可以使用*拓扑扩展约束*来控制 {{< glossary_tooltip text="Pods" term_id="Pod" >}} 在集群内故障域(例如地区,区域,节点和其他用户自定义拓扑域)之间的分布。这可以帮助实现高可用以及提升资源利用率。 - - - ## 先决条件 - ### 启用功能 -确保 `EvenPodsSpread` 功能已开启(在 1.16 版本中该功能默认关闭)。阅读[功能选项](/docs/reference/command-line-tools-reference/feature-gates/)了解如何开启该功能。`EvenPodsSpread` 必须在 {{< glossary_tooltip text="API Server" term_id="kube-apiserver" >}} **和** {{< glossary_tooltip text="scheduler" term_id="kube-scheduler" >}} 中都要开启。 +确保 `EvenPodsSpread` 功能已开启(在 1.16 版本中该功能默认关闭)。 +阅读[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/)了解如何开启该功能。 +`EvenPodsSpread` 必须在 {{< glossary_tooltip text="API 服务器" term_id="kube-apiserver" >}} **和** +{{< glossary_tooltip text="调度器" term_id="kube-scheduler" >}} 中都开启。 - ### 节点标签 - 拓扑扩展约束依赖于节点标签来标识每个节点所在的拓扑域。例如,一个节点可能具有标签:`node=node1,zone=us-east-1a,region=us-east-1` - 假设你拥有一个具有以下标签的 4 节点集群: ``` @@ -79,7 +71,6 @@ node4 Ready 2m43s v1.16.0 node=node4,zone=zoneB - 然后从逻辑上看集群如下: ``` @@ -93,13 +84,11 @@ Then the cluster is logically viewed as below: - -可以复用在大多数集群上自动创建和填充的[知名标签](/docs/reference/kubernetes-api/labels-annotations-taints/),而不是手动添加标签。 +可以复用在大多数集群上自动创建和填充的[常用标签](/zh/docs/reference/kubernetes-api/labels-annotations-taints/),而不是手动添加标签。 - ## Pod 的拓扑约束 ### API @@ -107,7 +96,6 @@ Instead of manually applying labels, you can also reuse the [well-known labels]( - `pod.spec.topologySpreadConstraints` 字段定义如下所示: ```yaml @@ -126,7 +114,6 @@ spec: - 可以定义一个或多个 `topologySpreadConstraint` 来指示 kube-scheduler 如何将每个传入的 Pod 根据与现有的 Pod 的关联关系在集群中部署。字段包括: - 执行 `kubectl explain Pod.spec.topologySpreadConstraints` 命令了解更多关于 topologySpreadConstraints 的信息。 -### 例子:单个拓扑扩展约束 - - +### 例子:单个拓扑扩展约束 假设你拥有一个 4 节点集群,其中标记为 `foo:bar` 的 3 个 pod 分别位于 node1,node2 和 node3 中(`P` 表示 pod): @@ -176,7 +160,6 @@ Suppose you have a 4-node cluster where 3 Pods labeled `foo:bar` are located in - 如果希望传入的 pod 均匀散布在现有的 pod 区域,则可以指定字段如下: {{< codenew file="pods/topology-spread-constraints/one-constraint.yaml" >}} @@ -184,14 +167,15 @@ If we want an incoming Pod to be evenly spread with existing Pods across zones, - -`topologyKey: zone` 意味着均匀分布将只应用于存在标签对为 "zone:<any value>" 的节点上。`whenUnsatisfiable: DoNotSchedule` 告诉调度器,如果传入的 pod 不满足约束,则让它保持挂起状态。 +`topologyKey: zone` 意味着均匀分布将只应用于存在标签对为 "zone:<any value>" 的节点上。 +`whenUnsatisfiable: DoNotSchedule` 告诉调度器,如果传入的 pod 不满足约束,则让它保持悬决状态。 - -如果调度器将传入的 pod 放入 "zoneA",pod 分布将变为 [3, 1],因此实际的倾斜为 2(3 - 1)。这违反了 `maxSkew: 1`。此示例中,传入的 pod 只能放置在 "zoneB" 上: +如果调度器将传入的 pod 放入 "zoneA",pod 分布将变为 [3, 1],因此实际的倾斜为 2(3 - 1)。 +这违反了 `maxSkew: 1`。此示例中,传入的 pod 只能放置在 "zoneB" 上: ``` +---------------+---------------+ +---------------+---------------+ @@ -206,7 +190,6 @@ If the scheduler placed this incoming Pod into "zoneA", the Pods distribution wo - 可以调整 pod 规格以满足各种要求: - - 将 `maxSkew` 更改为更大的值,比如 "2",这样传入的 pod 也可以放在 "zoneA" 上。 -- 将 `topologyKey` 更改为 "node",以便将 pod 均匀分布在节点上而不是区域中。在上面的例子中,如果 `maxSkew` 保持为 "1",那么传入的 pod 只能放在 "node4" 上。 -- 将 `whenUnsatisfiable: DoNotSchedule` 更改为 `whenUnsatisfiable: ScheduleAnyway`,以确保传入的 pod 始终可以调度(假设满足其他的调度 API)。但是,最好将其放置在具有较少匹配 pod 的拓扑域中。(请注意,此优先性与其他内部调度优先级(如资源使用率等)一起进行标准化。) +- 将 `topologyKey` 更改为 "node",以便将 pod 均匀分布在节点上而不是区域中。 + 在上面的例子中,如果 `maxSkew` 保持为 "1",那么传入的 pod 只能放在 "node4" 上。 +- 将 `whenUnsatisfiable: DoNotSchedule` 更改为 `whenUnsatisfiable: ScheduleAnyway`, + 以确保传入的 Pod 始终可以调度(假设满足其他的调度 API)。 + 但是,最好将其放置在具有较少匹配 Pod 的拓扑域中。 + (请注意,此优先性与其他内部调度优先级(如资源使用率等)一起进行标准化。) - ### 例子:多个拓扑扩展约束 -下面的例子建立在前面例子的基础上。假设你拥有一个 4 节点集群,其中 3 个标记为 `foo:bar` 的 pod 分别位于 node1,node2 和 node3 上(`P` 表示 pod): +下面的例子建立在前面例子的基础上。假设你拥有一个 4 节点集群,其中 3 个标记为 `foo:bar` 的 +Pod 分别位于 node1,node2 和 node3 上(`P` 表示 Pod): ``` +---------------+---------------+ @@ -244,7 +230,6 @@ This builds upon the previous example. Suppose you have a 4-node cluster where 3 - 可以使用 2 个拓扑扩展约束来控制 pod 在 区域和节点两个维度上进行分布: {{< codenew file="pods/topology-spread-constraints/two-constraints.yaml" >}} @@ -252,13 +237,12 @@ You can use 2 TopologySpreadConstraints to control the Pods spreading on both zo - -在这种情况下,为了匹配第一个约束,传入的 pod 只能放置在 "zoneB" 中;而在第二个约束中,传入的 pod 只能放置在 "node4" 上。然后两个约束的结果加在一起,因此唯一可行的选择是放置在 "node4" 上。 +在这种情况下,为了匹配第一个约束,传入的 pod 只能放置在 "zoneB" 中;而在第二个约束中, +传入的 Pod 只能放置在 "node4" 上。然后两个约束的结果加在一起,因此唯一可行的选择是放置在 "node4" 上。 - 多个约束可能导致冲突。假设有一个跨越 2 个区域的 3 节点集群: ``` @@ -274,58 +258,53 @@ Multiple constraints can lead to conflicts. Suppose you have a 3-node cluster ac - -如果对集群应用 "two-constraints.yaml",会发现 "mypod" 处于 `Pending` 状态。这是因为:为了满足第一个约束,"mypod" 只能放在 "zoneB" 中,而第二个约束要求 "mypod" 只能放在 "node2" 上。pod 调度无法满足两种约束。 +如果对集群应用 "two-constraints.yaml",会发现 "mypod" 处于 `Pending` 状态。 +这是因为:为了满足第一个约束,"mypod" 只能放在 "zoneB" 中,而第二个约束要求 +"mypod" 只能放在 "node2" 上。pod 调度无法满足两种约束。 - -为了克服这种情况,可以增加 `maxSkew` 或修改其中一个约束,让其使用 `whenUnsatisfiable: ScheduleAnyway`。 +为了克服这种情况,可以增加 `maxSkew` 或修改其中一个约束,让其使用 +`whenUnsatisfiable: ScheduleAnyway`。 -### 约定 - - +### 约定 这里有一些值得注意的隐式约定: - -- 只有与传入 pod 具有相同命名空间的 pod 才能作为匹配候选者。 - - - +- 只有与传入 pod 具有相同命名空间的 pod 才能作为匹配候选者。 - 没有 `topologySpreadConstraints[*].topologyKey` 的节点将被忽略。这意味着: - 1. 位于这些节点上的 pod 不影响 `maxSkew` 的计算。在上面的例子中,假设 "node1" 没有标签 "zone",那么 2 个 pod 将被忽略,因此传入的 pod 将被调度到 "zoneA" 中。 - 2. 传入的 pod 没有机会被调度到这类节点上。在上面的例子中,假设一个带有标签 `{zone-typo: zoneC}` 的 "node5" 加入到集群,它将由于没有标签键 "zone" 而被忽略。 + 1. 位于这些节点上的 pod 不影响 `maxSkew` 的计算。 + 在上面的例子中,假设 "node1" 没有标签 "zone",那么 2 个 Pod 将被忽略, + 因此传入的 Pod 将被调度到 "zoneA" 中。 + 2. 传入的 Pod 没有机会被调度到这类节点上。 + 在上面的例子中,假设一个带有标签 `{zone-typo: zoneC}` 的 "node5" 加入到集群, + 它将由于没有标签键 "zone" 而被忽略。 - -注意,如果传入 pod 的 `topologySpreadConstraints[*].labelSelector` 与自身的标签不匹配,将会发生什么。在上面的例子中,如果移除传入 pod 的标签,pod 仍然可以调度到 "zoneB",因为约束仍然满足。然而,在调度之后,集群的不平衡程度保持不变。zoneA 仍然有 2 个带有 {foo:bar} 标签的 pod,zoneB 有 1 个带有 {foo:bar} 标签的 pod。因此,如果这不是你所期望的,建议工作负载的 `topologySpreadConstraints[*].labelSelector` 与其自身的标签匹配。 +注意,如果传入 Pod 的 `topologySpreadConstraints[*].labelSelector` 与自身的标签不匹配,将会发生什么。 +在上面的例子中,如果移除传入 Pod 的标签,Pod 仍然可以调度到 "zoneB",因为约束仍然满足。 +然而,在调度之后,集群的不平衡程度保持不变。zoneA 仍然有 2 个带有 {foo:bar} 标签的 Pod, +zoneB 有 1 个带有 {foo:bar} 标签的 Pod。 +因此,如果这不是你所期望的,建议工作负载的 `topologySpreadConstraints[*].labelSelector` +与其自身的标签匹配。 - - - - @@ -349,14 +328,11 @@ There are some implicit conventions worth noting here: -## 与 PodAffinity/PodAntiAffinity 相比较 - - +## 与 PodAffinity/PodAntiAffinity 相比较 在 Kubernetes 中,与 "Affinity" 相关的指令控制 pod 的调度方式(更密集或更分散)。 @@ -366,7 +342,6 @@ topology domain(s) - For `PodAntiAffinity`, only one Pod can be scheduled into a single topology domain. --> - - 对于 `PodAffinity`,可以尝试将任意数量的 pod 打包到符合条件的拓扑域中。 - 对于 `PodAntiAffinity`,只能将一个 pod 调度到单个拓扑域中。 @@ -376,26 +351,24 @@ topology domains - to achieve high availability or cost-saving. This can also he workloads and scaling out replicas smoothly. See [Motivation](https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/20190221-pod-topology-spread.md#motivation) for more details. --> - -"EvenPodsSpread" 功能提供灵活的选项来将 pod 均匀分布到不同的拓扑域中,以实现高可用性或节省成本。这也有助于滚动更新工作负载和平滑扩展副本。有关详细信息,请参考[动机](https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/20190221-pod-topology-spread.md#motivation)。 +"EvenPodsSpread" 功能提供灵活的选项来将 pod 均匀分布到不同的拓扑域中,以实现高可用性或节省成本。 +这也有助于滚动更新工作负载和平滑扩展副本。 +有关详细信息,请参考[动机](https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/20190221-pod-topology-spread.md#motivation)。 ## 已知局限性 - - 1.16 版本(此功能为 alpha)存在下面的一些限制: - - `Deployment` 的缩容可能导致 pod 分布不平衡。 - pod 匹配到污点节点是允许的。参考 [Issue 80921](https://github.com/kubernetes/kubernetes/issues/80921)。 diff --git a/content/zh/docs/concepts/workloads/pods/podpreset.md b/content/zh/docs/concepts/workloads/pods/podpreset.md index 69b052b868..f4e0f85675 100644 --- a/content/zh/docs/concepts/workloads/pods/podpreset.md +++ b/content/zh/docs/concepts/workloads/pods/podpreset.md @@ -5,13 +5,9 @@ weight: 50 --- -本文提供了 PodPreset 的概述。 在 Pod 创建时,用户可以使用 PodPreset 对象将特定信息注入 Pod 中,这些信息可以包括 secret、 卷、卷挂载和环境变量。 +{{< feature-state for_k8s_version="v1.6" state="alpha" >}} +本文提供了 PodPreset 的概述。 在 Pod 创建时,用户可以使用 PodPreset 对象将特定信息注入 Pod 中,这些信息可以包括 Secret、卷、卷挂载和环境变量。 @@ -38,7 +35,8 @@ You use [label selectors](/docs/concepts/overview/working-with-objects/labels/#l to specify the Pods to which a given Pod Preset applies. --> `Pod Preset` 是一种 API 资源,在 Pod 创建时,用户可以用它将额外的运行时需求信息注入 Pod。 -使用[标签选择器(label selector)](/docs/concepts/overview/working-with-objects/labels/#label-selectors)来指定 Pod Preset 所适用的 Pod。 +使用[标签选择算符](/zh/docs/concepts/overview/working-with-objects/labels/#label-selectors) +来指定 Pod Preset 所适用的 Pod。 +## Enable PodPreset in your cluster {#enable-pod-preset} -了解更多的相关背景信息,请参考 [ PodPreset 设计提案](https://git.k8s.io/community/contributors/design-proposals/service-catalog/pod-preset.md)。 +In order to use Pod Presets in your cluster you must ensure the following: +--> +## 在你的集群中启用 Pod Preset {#enable-pod-preset} + +为了在集群中使用 Pod Preset,必须确保以下几点: + + +1. 已启用 API 类型 `settings.k8s.io/v1alpha1/podpreset`。 例如,这可以通过在 API 服务器的 `--runtime-config` + 配置项中包含 `settings.k8s.io/v1alpha1=true` 来实现。 + 在 minikube 部署的集群中,启动集群时添加此参数 `--extra-config=apiserver.runtime-config=settings.k8s.io/v1alpha1=true`。 +1. 已启用准入控制器 `PodPreset`。 启用的一种方式是在 API 服务器的 `--enable-admission-plugins` + 配置项中包含 `PodPreset` 。在 minikube 部署的集群中,启动集群时添加以下参数: + + ```shell + --extra-config=apiserver.enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,PodPreset + ``` - ## PodPreset 如何工作 Kubernetes 提供了准入控制器 (`PodPreset`),该控制器被启用时,会将 Pod Preset @@ -87,7 +113,7 @@ Kubernetes 提供了准入控制器 (`PodPreset`),该控制器被启用时, 1. 尝试合并 `PodPreset` 中定义的各种资源,并注入要创建的 Pod。 1. 发生错误时抛出事件,该事件记录了 pod 信息合并错误,同时在 _不注入_ `PodPreset` 信息的情况下创建 Pod。 1. 为改动的 Pod spec 添加注解,来表明它被 `PodPreset` 所修改。 注解形如: -`podpreset.admission.kubernetes.io/podpreset-": ""`。 + `podpreset.admission.kubernetes.io/podpreset-": "<资源版本>"`。 {{< note >}} 适当时候,Pod Preset 可以修改 Pod 规范中的以下字段: - `.spec.containers` 字段 -- `initContainers` 字段 (需要 Kubernetes 1.14.0 或更高版本)。 +- `initContainers` 字段 {{< /note >}} -### 为特定 Pod 禁用 Pod Preset - -在一些情况下,用户不希望 Pod 被 Pod Preset 所改动,这时,用户可以在 Pod spec 中添加形如 `podpreset.admission.kubernetes.io/exclude: "true"` 的注解。 - - -## 启用 Pod Preset - - -为了在集群中使用 Pod Preset,必须确保以下几点: - - - -1. 已启用 API 类型 `settings.k8s.io/v1alpha1/podpreset`。 例如,这可以通过在 API 服务器的 `--runtime-config` 配置项中包含 `settings.k8s.io/v1alpha1=true` 来实现。在 minikube 部署的集群中,启动集群时添加此参数 `--extra-config=apiserver.runtime-config=settings.k8s.io/v1alpha1=true`。 -1. 已启用准入控制器 `PodPreset`。 启用的一种方式是在 API 服务器的 `--enable-admission-plugins` 配置项中包含 `PodPreset` 。在 minikube 部署的集群中,启动集群时添加以下参数: - - ```shell - --extra-config=apiserver.enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,PodPreset - ``` - -1. 已经通过在相应的命名空间中创建 `PodPreset` 对象,定义了 Pod Preset。 - - +### 为特定 Pod 禁用 Pod Preset +在一些情况下,用户不希望 Pod 被 Pod Preset 所改动,这时,用户可以在 Pod +的 `.spec` 中添加形如 `podpreset.admission.kubernetes.io/exclude: "true"` 的注解。 ## {{% heading "whatsnext" %}} -* [使用 PodPreset 将信息注入 Pod](/docs/tasks/inject-data-application/podpreset/) - +* 参考[使用 PodPreset 将信息注入 Pod](/zh/docs/tasks/inject-data-application/podpreset/)。 +* 若要更多地了解背景知识,请参阅 [PodPreset 的设计提案](https://git.k8s.io/community/contributors/design-proposals/service-catalog/pod-preset.md)。 diff --git a/content/zh/docs/tasks/debug-application-cluster/debug-application.md b/content/zh/docs/tasks/debug-application-cluster/debug-application.md index d13718617f..8e7b751951 100644 --- a/content/zh/docs/tasks/debug-application-cluster/debug-application.md +++ b/content/zh/docs/tasks/debug-application-cluster/debug-application.md @@ -1,102 +1,160 @@ --- title: 应用故障排查 +content_type: concept --- + -本指南帮助用户来调试kubernetes上那些没有正常运行的应用。 -本指南*不能*调试集群。如果想调试集群的话,请参阅[这里](/docs/admin/cluster-troubleshooting)。 + -{{< toc >}} + -## 诊断问题 +本指南帮助用户调试那些部署到 Kubernetes 上后没有正常运行的应用。 +本指南 *并非* 指导用户如何调试集群。 +如果想调试集群的话,请参阅[这里](/zh/docs/tasks/debug-application-cluster/debug-cluster/)。 -故障排查的第一步是先给问题分下类。这个问题是什么?Pods,Replication Controller或者Service? + + + + +## 诊断问题 {#diagnosing-the-problem} +故障排查的第一步是先给问题分类。问题是什么?是关于 Pods、Replication Controller 还是 Service? + +* [调试 Pods](#debugging-pods) +* [调试副本控制器](#debugging-replication-controllers) +* [调试服务](#debugging-services) + + +### 调试 Pods {#debugging-pods} + +调试 Pod 的第一步是查看 Pod 信息。用如下命令查看 Pod 的当前状态和最近的事件: ```shell -$ kubectl describe pods ${POD_NAME} +kubectl describe pods ${POD_NAME} ``` -查看一下pod中的容器所处的状态。这些容器的状态都是`Running`吗?最近有没有重启过? + +查看一下 Pod 中的容器所处的状态。这些容器的状态都是 `Running` 吗?最近有没有重启过? -#### pod停留在pending状态 +后面的调试都是要依靠 Pod 的状态的。 -如果一个pod卡在`Pending`状态,则表示这个pod没有被调度到一个节点上。通常这是因为资源不足引起的。 -敲一下`kubectl describe ...`这个命令,输出的信息里面应该有显示为什么没被调度的原因。 + +#### Pod 停滞在 Pending 状态 + +如果一个 Pod 停滞在 `Pending` 状态,表示 Pod 没有被调度到节点上。通常这是因为 +某种类型的资源不足导致无法调度。 +查看上面的 `kubectl describe ...` 命令的输出,其中应该显示了为什么没被调度的原因。 常见原因如下: + * **资源不足**: -你可能耗尽了集群上所有的CPU和内存,此时,你需要删除pods,调整资源请求,或者增加节点。 -更多信息请参阅[Compute Resources document](/docs/user-guide/compute-resources/#my-pods-are-pending-with-event-message-failedscheduling) + 你可能耗尽了集群上所有的 CPU 或内存。此时,你需要删除 Pod、调整资源请求或者为集群添加节点。 + 更多信息请参阅[计算资源文档](/zh/docs/concepts/configuration/manage-resources-containers/) -* **使用了`hostPort`**: -如果绑定一个pod到`hostPort`,那么能创建的pod个数就有限了。 -多数情况下,`hostPort`是非必要的,而应该采用服务来暴露pod。 -如果确实需要使用`hostPort`,那么能创建的pod的数量就是节点的个数。 +* **使用了 `hostPort`**: + 如果绑定 Pod 到 `hostPort`,那么能够运行该 Pod 的节点就有限了。 + 多数情况下,`hostPort` 是非必要的,而应该采用 Service 对象来暴露 Pod。 + 如果确实需要使用 `hostPort`,那么集群中节点的个数就是所能创建的 Pod + 的数量上限。 + +#### Pod 停滞在 Waiting 状态 -* 使用的镜像名字正确吗? -* 镜像仓库里有没有这个镜像? -* 用`docker pull `命令手动拉下镜像试试。 +如果 Pod 停滞在 `Waiting` 状态,则表示 Pod 已经被调度到某工作节点,但是无法在该节点上运行。 +同样,`kubectl describe ...` 命令的输出可能很有用。 +`Waiting` 状态的最常见原因是拉取镜像失败。要检查的有三个方面: -#### pod处于crashing状态或者unhealthy +* 确保镜像名字拼写正确 +* 确保镜像已被推送到镜像仓库 +* 用手动命令 `docker pull <镜像>` 试试看镜像是否可拉取 -首先,看一下容器的log: + +#### Pod 处于 Crashing 或别的不健康状态 + +一旦 Pod 被调度,就可以采用 +[调试运行中的 Pod](/zh/docs/concepts/configuration/manage-resources-containers/) +中小鞥在的方法来进一步调试。 + + +#### Pod 处于 Running 态但是没有正常工作 + +如果 Pod 行为不符合预期,很可能 Pod 描述(例如你本地机器上的 `mypod.yaml`)中有问题, +并且该错误在创建 Pod 时被忽略掉,没有报错。 +通常,Pod 的定义中节区嵌套关系错误、字段名字拼错的情况都会引起对应内容被忽略掉。 +例如,如果你误将 `command` 写成 `commnd`,Pod 虽然可以创建,但它不会执行 +你期望它执行的命令行。 + + +可以做的第一件事是删除你的 Pod,并尝试才有 `--validate` 选项重新创建。 +例如,运行 `kubectl apply --validate -f mypod.yaml`。 +如果 `command` 被误拼成 `commnd`,你将会看到下面的错误信息: -```shell -$ kubectl logs ${POD_NAME} ${CONTAINER_NAME} ``` - -如果容器是crashed的,用如下命令可以看到crash的log: - -```shell -$ kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME} -``` - -或者,用`exec`在容器内运行一些命令: - -```shell -$ kubectl exec ${POD_NAME} -c ${CONTAINER_NAME} -- ${CMD} ${ARG1} ${ARG2} ... ${ARGN} -``` - -注意:当一个pod内只有一个容器时,可以不带参数`-c ${CONTAINER_NAME}`。 - -例如,名为Cassandra的pod,处于running态,要查看它的log,可运行如下命令: - -```shell -$ kubectl exec cassandra -- cat /var/log/cassandra/system.log -``` - -如果以上方法都不起作用,找到这个pod所在的节点并用SSH登录进去做进一步的分析。 -通常情况下,是不需要在Kubernetes API中再给出另外的工具的。 -因此,如果你发现需要ssh进一个主机来分析问题时,请在GitHub上提一个特性请求,描述一个你的场景并说明为什么已经提供的工具不能满足需求。 - - -#### pod处于running态,但是没有正常工作 - -如果创建的pod不符合预期,那么创建pod的描述文件应该是存在某种错误的,并且这个错误在创建pod时被忽略掉。 -通常pod的定义中,章节被错误的嵌套,或者一个字段名字被写错,都可能会引起被忽略掉。 -例如,希望在pod中用命令行执行某个命令,但是将`command`写成`commnd`,pod虽然可以创建,但命令并没有执行。 - -如何查出来哪里出错? -首先,删掉这个pod再重新创建一个,重创时,像下面这样带着`--validate`这个参数: -`kubectl create --validate -f mypod.yaml`,`command`写成`commnd`的拼写错误就会打印出来了。 - -```shell I0805 10:43:25.129850 46757 schema.go:126] unknown field: commnd I0805 10:43:25.129973 46757 schema.go:129] this may be a false alarm, see https://github.com/kubernetes/kubernetes/issues/6842 pods/mypod @@ -104,42 +162,84 @@ pods/mypod -如果上面方法没有看到相关异常的信息,那么接下来就要验证从apiserver获取到的pod是否与期望的一致,比如创建Pod的yaml文件是mypod.yaml。 - -运行如下命令来获取apiserver创建的pod信息并保存成一个文件: -`kubectl get pods/mypod -o yaml > mypod-on-apiserver.yaml`。 - -然后手动对这两个文件进行比较: -apiserver获得的yaml文件中的一些行,不在创建pod的yaml文件内,这是正常的。 -如果创建Pod的yaml文件内的一些行,在piserver获得的yaml文件中不存在,可以说明创建pod的yaml中的定义有问题。 - + +接下来就要检查的是 API 服务器上的 Pod 与你所期望创建的是否匹配 +(例如,你原本使用本机上的一个 YAML 文件来创建 Pod)。 +例如,运行 `kubectl get pods/mypod -o yaml > mypod-on-apiserver.yaml`,之后 +手动比较 `mypod.yaml` 与从 API 服务器取回的 Pod 描述。 +从 API 服务器处获得的 YAML 通常包含一些创建 Pod 所用的 YAML 中不存在的行,这是正常的。 +不过,如果如果源文件中有些行在 API 服务器版本中不存在,则意味着 +Pod 规约是有问题的。 + +### 调试副本控制器 {#debugging-replication-controllers} +副本控制器相对比较简单直接。它们要么能创建 Pod,要么不能。 +如果不能创建 Pod,请参阅[上述说明](#debugging-pods)调试 Pod。 + +你也可以使用 `kubectl describe rc ${CONTROLLER_NAME}` 命令来检视副本控制器相关的事件。 + + +### 调试服务 {#debugging-services} + +服务支持在多个 Pod 间负载均衡。 +有一些常见的问题可以造成服务无法正常工作。 +以下说明将有助于调试服务的问题。 + +首先,验证服务是否有端点。对于每一个 Service 对象,API 服务器为其提供 +对应的 `endpoints` 资源。 + +通过如下命令可以查看 endpoints 资源: ```shell -$ kubectl get endpoints ${SERVICE_NAME} +kubectl get endpoints ${SERVICE_NAME} ``` -确保endpoints与服务内容器个数一致。 -例如,如果你创建了一个nginx服务,它有3个副本,那么你就会在这个服务的endpoints中看到3个不同的IP地址。 + +确保 Endpoints 与服务成员 Pod 个数一致。 +例如,如果你的 Service 用来运行 3 个副本的 nginx 容器,你应该会在服务的 Endpoints +中看到 3 个不同的 IP 地址。 -#### 服务缺少endpoints + +#### 服务缺少 Endpoints + +如果没有 Endpoints,请尝试使用 Service 所使用的标签列出 Pod。 +假定你的服务包含如下标签选择算符: ```yaml ... @@ -149,29 +249,70 @@ spec: type: frontend ``` -你可以使用如下命令列出与selector相匹配的pod,并验证这些pod是否归属于创建的服务: - + -验证该pod的`containerPort`与服务的`containerPort`是否匹配。 +你可以使用如下命令列出与选择算符相匹配的 Pod,并验证这些 Pod 是否归属于创建的服务: -#### 网络业务不工作 +```shell +kubectl get pods --selector=name=nginx,type=frontend +``` -如果可以连接到服务上,但是连接立即被断开了,并且在endpoints列表中有endpoints,可能是代理和pods之间不通。 + +如果 Pod 列表符合预期,但是 Endpoints 仍然为空,那么可能暴露的端口不正确。 +如果服务指定了 `containerPort`,但是所选中的 Pod 没有列出该端口,这些 Pod +不会被添加到 Endpoints 列表。 - * Pods工作是否正常? 看一下重启计数,并参阅[Debugging Pods](#debugging-pods); - * 可以直接连接到pod上吗?获取pod的IP地址,然后尝试直接连接到该IP上; - * 应用是否在配置的端口上进行服务?Kubernetes不进行端口重映射,所以如果应用在8080端口上服务,那么`containerPort`字段就需要设定为8080。 +验证 Pod 的 `containerPort` 与服务的 `targetPort` 是否匹配。 -#### 更多信息 + +#### 网络流量未被转发 + +如果你可以连接到服务上,但是连接立即被断开了,并且在 Endpoints 列表中有末端表项, +可能是代理无法连接到 Pod。 + +要检查的有以下三项: + +* Pod 工作是否正常? 看一下重启计数,并参阅[调试 Pod](#debugging-pods); +* 是否可以直接连接到 Pod?获取 Pod 的 IP 地址,然后尝试直接连接到该 IP; +* 应用是否在配置的端口上进行服务?Kubernetes 不进行端口重映射,所以如果应用在 + 8080 端口上服务,那么 `containerPort` 字段就要设定为 8080。 + +## {{% heading "whatsnext" %}} + + +如果上述方法都不能解决你的问题,请按照 +[调试服务文档](/zh/docs/tasks/debug-application-cluster/debug-service/)中的介绍, +确保你的 `Service` 处于 Running 态,有 `Endpoints` 被创建,`Pod` 真的在提供服务; +DNS 服务已配置并正常工作,iptables 规则也以安装并且 `kube-proxy` 也没有异常行为。 + +你也可以访问[故障排查文档](/zh/docs/tasks/debug-application-cluster/troubleshooting/ )来获取更多信息。 -你也可以访问[troubleshooting document](/docs/troubleshooting/)来获取更多信息。 diff --git a/i18n/de.toml b/i18n/de.toml index 4155902ec7..cd4c3d7924 100644 --- a/i18n/de.toml +++ b/i18n/de.toml @@ -15,6 +15,9 @@ other = "Aufräumen" [prerequisites_heading] other = "Bevor Sie beginnen" +[subscribe_button] +other = "Abonnieren" + [whatsnext_heading] other = "Nächste Schritte" diff --git a/i18n/es.toml b/i18n/es.toml index 2c6129b745..c232ce7c27 100644 --- a/i18n/es.toml +++ b/i18n/es.toml @@ -15,6 +15,9 @@ other = "Limpieza de recursos" [prerequisites_heading] other = "Antes de empezar" +[subscribe_button] +other = "Suscribir" + [whatsnext_heading] other = "Siguientes pasos" diff --git a/layouts/partials/head.html b/layouts/partials/head.html index a31d4533df..47f6e92daf 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -54,7 +54,14 @@ "@context": "https://schema.org", "@type": "Organization", "url": "https://kubernetes.io", - "logo": "https://kubernetes.io/images/favicon.png" + "logo": "https://kubernetes.io/images/favicon.png", +{{- if not .Site.Params.deprecated }} + "potentialAction": { + "@type": "SearchAction", + "target": {{ printf "%s%s" ("/docs/search/" | absURL) "?q={search_term_string}" }}, + "query-input": "required name=search_term_string" + } +{{ end }} } diff --git a/scripts/replace-capture.sh b/scripts/replace-capture.sh index 231a361ed1..4221c48e37 100755 --- a/scripts/replace-capture.sh +++ b/scripts/replace-capture.sh @@ -1,8 +1,37 @@ #!/bin/bash # set K8S_WEBSITE in your env to your docs website root +# or rely on this script to determine it automatically +# You must run the script inside the repository for that to work +# # Note: website/content//docs -CONTENT_DIR=${K8S_WEBSITE}/content + +find_content_dir() { + local self + local top + if command git rev-parse --is-inside-work-tree > /dev/null 2>&1 ; then + self="$0" + top="$(command git rev-parse --show-toplevel)" + while ( cd "${top}/.." && command git rev-parse --is-inside-work-tree> /dev/null 2>&1 ); do + top="$( cd "${top}/.." && "${self}" )" + done + printf "%s/content" "${top}" + else + printf "Could not autodetect CONTENT_DIR\n" 1>&2 + exit 1 + fi +} + +if [ -z ${K8S_WEBSITE+x} ]; then + CONTENT_DIR="$( find_content_dir )" +else + CONTENT_DIR=${K8S_WEBSITE}/content +fi + +if ! [ -d "${CONTENT_DIR}" ]; then + printf "Directory %s not found\n" "${CONTENT_DIR}" 1>&2 + exit 1 +fi # 16 langs # de en es fr hi id it ja ko no pl pt ru uk vi zh diff --git a/static/_redirects b/static/_redirects index 382b9ab3cb..dc58a78c72 100644 --- a/static/_redirects +++ b/static/_redirects @@ -445,7 +445,8 @@ /docs/admin/kubeadm/ /docs/reference/generated/kubeadm/ 301 /docs/admin/kubelet/ /docs/reference/generated/kubelet/ 301 -/docs/reference/generated/kubeadm/ /docs/reference/setup-tools/kubeadm/kubeadm/ 301 +/docs/reference/generated/kubeadm/ /docs/reference/setup-tools/kubeadm/ 301 +/docs/reference/setup-tools/kubeadm/kubeadm/ /docs/reference/setup-tools/kubeadm/ 301 /editdocs/ /docs/contribute/ 301 /docs/home/editdocs/ /docs/contribute/ 301