From 02b50e1a33c29d8f261707c8ab24c31238a7a4fa Mon Sep 17 00:00:00 2001 From: KobayashiD27 Date: Tue, 9 Mar 2021 10:01:15 +0900 Subject: [PATCH 001/221] ja: Make docs/concepts/architecture/controller.md follow v1.19 of the original text --- content/ja/docs/concepts/architecture/controller.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/architecture/controller.md b/content/ja/docs/concepts/architecture/controller.md index c2f71c9029..a4477d3fc2 100644 --- a/content/ja/docs/concepts/architecture/controller.md +++ b/content/ja/docs/concepts/architecture/controller.md @@ -50,7 +50,11 @@ Jobとは対照的に、クラスターの外部に変更を加える必要が 外部の状態とやりとりをするコントローラーは、目的の状態をAPIサーバーから取得した後、外部のシステムと直接通信し、現在の状態を目的の状態に近づけます。 -(クラスター内のノードを水平にスケールさせるコントローラーが実際に存在します。詳しくは、[クラスターのオートスケーリング](/docs/tasks/administer-cluster/cluster-management/#cluster-autoscaling)を読んでください。) +(クラスター内のノードを水平にスケールさせる[コントローラー](https://github.com/kubernetes/autoscaler/)が実際に存在します。) + +ここで重要な点は、コントローラーが目的の状態を実現するために変更を加えてから、現在の状態をクラスターのAPIサーバーに報告することです。 他の制御ループは、その報告されたデータを監視し、独自のアクションを実行できます。 + +サーモスタットの例では、部屋が非常に寒い場合、別のコントローラーが霜防止ヒーターをオンにすることもあります。 Kubernetesクラスターを使用すると、コントロールプレーンは、[Kubernetesを拡張して](/ja/docs/concepts/extend-kubernetes/)実装することにより、IPアドレス管理ツールやストレージサービス、クラウドプロバイダーAPI、およびその他のサービスと間接的に連携します。 ## 目的の状態 vs 現在の状態 {#desired-vs-current} From 56fa6f6211475e489e45b0b0110f6c4beed55fa3 Mon Sep 17 00:00:00 2001 From: s-kawamura-w664 Date: Thu, 4 Mar 2021 07:53:35 +0000 Subject: [PATCH 002/221] delete some dirty code from several files in ja --- .../concepts/cluster-administration/manage-deployment.md | 2 +- content/ja/docs/concepts/overview/what-is-kubernetes.md | 2 +- content/ja/docs/concepts/policy/resource-quotas.md | 2 +- content/ja/docs/concepts/security/overview.md | 2 +- .../configure-access-multiple-clusters.md | 8 ++++---- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/content/ja/docs/concepts/cluster-administration/manage-deployment.md b/content/ja/docs/concepts/cluster-administration/manage-deployment.md index 90f96547d5..cb9c7c0fc3 100644 --- a/content/ja/docs/concepts/cluster-administration/manage-deployment.md +++ b/content/ja/docs/concepts/cluster-administration/manage-deployment.md @@ -237,7 +237,7 @@ guestbook-redis-slave-qgazl 1/1 Running 0 3m image: gb-frontend:v3 ``` -そして2つの異なるPodのセットを上書きしないようにするため、`track`ラベルに異なる値を持つ(例: `canary`)ようなguestbookフロントエンドの新しいリリースを作成できます。 +そして2つの異なるPodのセットを上書きしないようにするため、`track`ラベルに異なる値を持つ(例: `canary`)ようなguestbookフロントエンドの新しいリリースを作成できます。 ```yaml name: frontend-canary diff --git a/content/ja/docs/concepts/overview/what-is-kubernetes.md b/content/ja/docs/concepts/overview/what-is-kubernetes.md index 3ca8fa78fe..dab17c9b1b 100644 --- a/content/ja/docs/concepts/overview/what-is-kubernetes.md +++ b/content/ja/docs/concepts/overview/what-is-kubernetes.md @@ -17,7 +17,7 @@ card: Kubernetesは、宣言的な構成管理と自動化を促進し、コンテナ化されたワークロードやサービスを管理するための、ポータブルで拡張性のあるオープンソースのプラットフォームです。Kubernetesは巨大で急速に成長しているエコシステムを備えており、それらのサービス、サポート、ツールは幅広い形で利用可能です。 -Kubernetesの名称は、ギリシャ語に由来し、操舵手やパイロットを意味しています。Googleは2014年にKubernetesプロジェクトをオープンソース化しました。Kubernetesは、本番環境で大規模なワークロードを稼働させた[Googleの15年以上の経験](/blog/2015/04/borg-predecessor-to-kubernetes/)と、コミュニティからの最高のアイディアや実践を組み合わせています。 +Kubernetesの名称は、ギリシャ語に由来し、操舵手やパイロットを意味しています。Googleは2014年にKubernetesプロジェクトをオープンソース化しました。Kubernetesは、本番環境で大規模なワークロードを稼働させた[Googleの15年以上の経験](/blog/2015/04/borg-predecessor-to-kubernetes/)と、コミュニティからの最高のアイディアや実践を組み合わせています。 ## 過去を振り返ってみると diff --git a/content/ja/docs/concepts/policy/resource-quotas.md b/content/ja/docs/concepts/policy/resource-quotas.md index e7368a8f94..7b00056fcf 100644 --- a/content/ja/docs/concepts/policy/resource-quotas.md +++ b/content/ja/docs/concepts/policy/resource-quotas.md @@ -22,7 +22,7 @@ weight: 10 - 異なる名前空間で異なるチームが存在するとき。現時点ではこれは自主的なものですが、将来的にはACLsを介してリソースクォータの設定を強制するように計画されています。 - 管理者は各名前空間で1つの`ResourceQuota`を作成します。 - ユーザーが名前空間内でリソース(Pod、Serviceなど)を作成し、クォータシステムが`ResourceQuota`によって定義されたハードリソースリミットを超えないことを保証するために、リソースの使用量をトラッキングします。 -- リソースの作成や更新がクォータの制約に違反しているとき、そのリクエストはHTTPステータスコード`403 FORBIDDEN`で失敗し、違反した制約を説明するメッセージが表示されます。 +- リソースの作成や更新がクォータの制約に違反しているとき、そのリクエストはHTTPステータスコード`403 FORBIDDEN`で失敗し、違反した制約を説明するメッセージが表示されます。 - `cpu`や`memory`といったコンピューターリソースに対するクォータが名前空間内で有効になっているとき、ユーザーはそれらの値に対する`requests`や`limits`を設定する必要があります。設定しないとクォータシステムがPodの作成を拒否します。 ヒント: コンピュートリソースの要求を設定しないPodに対してデフォルト値を強制するために、`LimitRanger`アドミッションコントローラーを使用してください。この問題を解決する例は[walkthrough](/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/)で参照できます。 `ResourceQuota`のオブジェクト名は、有効な[DNSサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)である必要があります. diff --git a/content/ja/docs/concepts/security/overview.md b/content/ja/docs/concepts/security/overview.md index b50a4ea1a5..0157b28f78 100644 --- a/content/ja/docs/concepts/security/overview.md +++ b/content/ja/docs/concepts/security/overview.md @@ -77,7 +77,7 @@ Kubernetesを保護する為には2つの懸念事項があります。 ### クラスター内のコンポーネント(アプリケーション) {#cluster-applications} -アプリケーションを対象にした攻撃に応じて、セキュリティの特定側面に焦点をあてたい場合があります。例:他のリソースとの連携で重要なサービス(サービスA)と、リソース枯渇攻撃に対して脆弱な別のワークロード(サービスB)が実行されている場合、サービスBのリソースを制限していないとサービスAが危険にさらされるリスクが高くなります。次の表はセキュリティの懸念事項とKubernetesで実行されるワークロードを保護するための推奨事項を示しています。 +アプリケーションを対象にした攻撃に応じて、セキュリティの特定側面に焦点をあてたい場合があります。例:他のリソースとの連携で重要なサービス(サービスA)と、リソース枯渇攻撃に対して脆弱な別のワークロード(サービスB)が実行されている場合、サービスBのリソースを制限していないとサービスAが危険にさらされるリスクが高くなります。次の表はセキュリティの懸念事項とKubernetesで実行されるワークロードを保護するための推奨事項を示しています。 ワークロードセキュリティに関する懸念事項 | 推奨事項 | diff --git a/content/ja/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md b/content/ja/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md index b2ebc16d18..d5f6b72296 100644 --- a/content/ja/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md +++ b/content/ja/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md @@ -31,9 +31,9 @@ card: ## クラスター、ユーザー、コンテキストを設定する -例として、開発用のクラスターが一つ、実験用のクラスターが一つ、計二つのクラスターが存在する場合を考えます。`development`と呼ばれる開発用のクラスター内では、フロントエンドの開発者は`frontend`というnamespace内で、ストレージの開発者は`storage`というnamespace内で作業をします。`scratch`と呼ばれる実験用のクラスター内では、開発者はデフォルトのnamespaceで作業をするか、状況に応じて追加のnamespaceを作成します。開発用のクラスターは証明書を通しての認証を必要とします。実験用のクラスターはユーザーネームとパスワードを通しての認証を必要とします。 +例として、開発用のクラスターが一つ、実験用のクラスターが一つ、計二つのクラスターが存在する場合を考えます。`development`と呼ばれる開発用のクラスター内では、フロントエンドの開発者は`frontend`というnamespace内で、ストレージの開発者は`storage`というnamespace内で作業をします。`scratch`と呼ばれる実験用のクラスター内では、開発者はデフォルトのnamespaceで作業をするか、状況に応じて追加のnamespaceを作成します。開発用のクラスターは証明書を通しての認証を必要とします。実験用のクラスターはユーザーネームとパスワードを通しての認証を必要とします。 -`config-exercise`というディレクトリを作成してください。`config-exercise`ディレクトリ内に、以下を含む`config-demo`というファイルを作成してください: +`config-exercise`というディレクトリを作成してください。`config-exercise`ディレクトリ内に、以下を含む`config-demo`というファイルを作成してください: ```shell apiVersion: v1 @@ -61,7 +61,7 @@ contexts: 設定ファイルには、クラスター、ユーザー、コンテキストの情報が含まれています。上記の`config-demo`設定ファイルには、二つのクラスター、二人のユーザー、三つのコンテキストの情報が含まれています。 -`config-exercise`ディレクトリに移動してください。クラスター情報を設定ファイルに追加するために、以下のコマンドを実行してください: +`config-exercise`ディレクトリに移動してください。クラスター情報を設定ファイルに追加するために、以下のコマンドを実行してください: ```shell kubectl config --kubeconfig=config-demo set-cluster development --server=https://1.2.3.4 --certificate-authority=fake-ca-file @@ -89,7 +89,7 @@ kubectl config --kubeconfig=config-demo set-context dev-storage --cluster=develo kubectl config --kubeconfig=config-demo set-context exp-scratch --cluster=scratch --namespace=default --user=experimenter ``` -追加した情報を確認するために、`config-demo`ファイルを開いてください。`config-demo`ファイルを開く代わりに、`config view`のコマンドを使うこともできます。 +追加した情報を確認するために、`config-demo`ファイルを開いてください。`config-demo`ファイルを開く代わりに、`config view`のコマンドを使うこともできます。 ```shell kubectl config --kubeconfig=config-demo view From 84c530bffb94f9bb284c37cfef02a740908e1228 Mon Sep 17 00:00:00 2001 From: shimodatkh Date: Wed, 10 Mar 2021 11:28:32 +0000 Subject: [PATCH 003/221] [ja] Update docs/concepts/workloads/pods/pod-lifecycle.md to 1.19 --- .../concepts/workloads/pods/pod-lifecycle.md | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/content/ja/docs/concepts/workloads/pods/pod-lifecycle.md b/content/ja/docs/concepts/workloads/pods/pod-lifecycle.md index 8afc01295d..ea2f2116f0 100644 --- a/content/ja/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/ja/docs/concepts/workloads/pods/pod-lifecycle.md @@ -8,7 +8,7 @@ weight: 30 このページではPodのライフサイクルについて説明します。Podは定義されたライフサイクルに従い `Pending`[フェーズ](#pod-phase)から始まり、少なくとも1つのプライマリーコンテナが正常に開始した場合は`Running`を経由し、次に失敗により終了したコンテナの有無に応じて、`Succeeded`または`Failed`フェーズを経由します。 -Podの実行中、kubeletはコンテナを再起動して、ある種の障害を処理できます。Pod内で、Kubernetesはさまざまなコンテナの[ステータス](#container-states)を追跡して、対処します。 +Podの実行中、kubeletはコンテナを再起動して、ある種の障害を処理できます。Pod内で、Kubernetesはさまざまなコンテナの[ステータス](#container-states)を追跡して、回復させるためのアクションを決定します。 Kubernetes APIでは、Podには仕様と実際のステータスの両方があります。Podオブジェクトのステータスは、[PodのCondition](#pod-conditions)のセットで構成されます。[カスタムのReadiness情報](#pod-readiness-gate)をPodのConditionデータに挿入することもできます。 @@ -43,13 +43,13 @@ Podの各フェーズの値と意味は厳重に守られています。ここ これらが`phase`の取りうる値です。 -値 | 概要 -:-----|:----------- -`Pending` | PodがKubernetesクラスターによって承認されましたが、1つ以上のコンテナがセットアップされて稼働する準備ができていません。これには、スケジュールされるまでの時間と、ネットワーク経由でイメージをダウンロードするための時間などが含まれます。 -`Running` | PodがNodeにバインドされ、すべてのコンテナが作成されました。少なくとも1つのコンテナがまだ実行されているか、開始または再起動中です。 -`Succeeded` |Pod内のすべてのコンテナが正常に終了し、再起動されません。 -`Failed` | Pod内のすべてのコンテナが終了し、少なくとも1つのコンテナが異常終了しました。つまり、コンテナはゼロ以外のステータスで終了したか、システムによって終了されました。 -`Unknown` | 何らかの理由によりPodの状態を取得できませんでした。このフェーズは通常はPodのホストとの通信エラーにより発生します。 +値 | 概要 +:-----------|:----------- +`Pending` | PodがKubernetesクラスターによって承認されましたが、1つ以上のコンテナがセットアップされて稼働する準備ができていません。これには、スケジュールされるまでの時間と、ネットワーク経由でイメージをダウンロードするための時間などが含まれます。 +`Running` | PodがNodeにバインドされ、すべてのコンテナが作成されました。少なくとも1つのコンテナがまだ実行されているか、開始または再起動中です。 +`Succeeded` | Pod内のすべてのコンテナが正常に終了し、再起動されません。 +`Failed` | Pod内のすべてのコンテナが終了し、少なくとも1つのコンテナが異常終了しました。つまり、コンテナはゼロ以外のステータスで終了したか、システムによって終了されました。 +`Unknown` | 何らかの理由によりPodの状態を取得できませんでした。このフェーズは通常はPodのホストとの通信エラーにより発生します。 Nodeが停止するか、クラスタの残りの部分から切断された場合、Kubernetesは失われたNode上のすべてのPodの`Phase`をFailedに設定するためのポリシーを適用します。 @@ -69,7 +69,7 @@ Podのコンテナの状態を確認するには`kubectl describe pod [POD_NAME] ### `Running` {#container-state-running} -`Running`状態はコンテナが問題なく実行されていることを示します。コンテナがRunning状態に入る前に`postStart`フック(もしあれば)が実行されます。`Running`状態のコンテナを持つPodに対して`kubectl`コマンドを使用すると、そのコンテナが`Running`状態になった時刻が表示されます。 +`Running`状態はコンテナが問題なく実行されていることを示します。`postStart`フックが構成されていた場合、それはすでに実行されて終了しています。`Running`状態のコンテナを持つPodに対して`kubectl`コマンドを使用すると、そのコンテナが`Running`状態になった時刻が表示されます。 ### `Terminated` {#container-state-terminated} @@ -81,7 +81,7 @@ Podのコンテナの状態を確認するには`kubectl describe pod [POD_NAME] Podの`spec`には、Always、OnFailure、またはNeverのいずれかの値を持つ`restartPolicy`フィールドがあります。デフォルト値はAlwaysです。 -`restartPolicy`は、Pod内のすべてのコンテナに適用されます。`restartPolicy`は、同じNode上のkubeletによるコンテナの再起動のみを参照します。Pod内のコンテナが終了した後、kubeletは5分を上限とする指数バックオフ遅延(10秒、20秒、40秒...)でコンテナを再起動します。コンテナが10分間問題なく実行されると、kubeletはコンテナの再起動バックオフタイマーをリセットします。 +`restartPolicy`は、Pod内のすべてのコンテナに適用されます。`restartPolicy`は、同じNode上のkubeletによるコンテナの再起動のみを参照します。Pod内のコンテナが終了した後、kubeletは5分を上限とする指数バックオフ遅延(10秒、20秒、40秒...)でコンテナを再起動します。コンテナが10分間実行されると、kubeletはコンテナの再起動バックオフタイマーをリセットします。 ## PodのCondition {#pod-conditions} @@ -148,7 +148,7 @@ Podのコンテナは準備完了ですが、少なくとも1つのカスタム ## コンテナのProbe {#container-probes} -[Probe](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#probe-v1-core) は [kubelet](/docs/admin/kubelet/) により定期的に実行されるコンテナの診断です。診断を行うために、kubeletはコンテナに実装された [Handler](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#handler-v1-core)を呼びます。Handlerには次の3つの種類があります: +[Probe](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#probe-v1-core) は [kubelet](/docs/reference/command-line-tools-reference/kubelet/) により定期的に実行されるコンテナの診断です。診断を行うために、kubeletはコンテナに実装された [Handler](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#handler-v1-core)を呼びます。Handlerには次の3つの種類があります: * [ExecAction](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#execaction-v1-core): コンテナ内で特定のコマンドを実行します。コマンドがステータス0で終了した場合に診断を成功と見まします。 @@ -209,7 +209,7 @@ Podが削除されたときにリクエストを来ないようにするため ### startupProbeをいつ使うべきか? {#when-should-you-use-a-startup-probe} -{{< feature-state for_k8s_version="v1.16" state="alpha" >}} +{{< feature-state for_k8s_version="v1.18" state="beta" >}} startupProbeは、サービスの開始に時間がかかるコンテナを持つポッドに役立ちます。livenessProbeの間隔を長く設定するのではなく、コンテナの起動時に別のProbeを構成して、livenessProbeの間隔よりも長い時間を許可できます。 コンテナの起動時間が、`initialDelaySeconds + failureThreshold x periodSeconds`よりも長い場合は、livenessProbeと同じエンドポイントをチェックするためにstartupProbeを指定します。`periodSeconds`のデフォルトは30秒です。次に、`failureThreshold`をlivenessProbeのデフォルト値を変更せずにコンテナが起動できるように、十分に高い値を設定します。これによりデッドロックを防ぐことができます。 @@ -220,7 +220,7 @@ Podは、クラスター内のNodeで実行中のプロセスを表すため、 ユーザーは削除を要求可能であるべきで、プロセスがいつ終了するかを知ることができなければなりませんが、削除が最終的に完了することも保証できるべきです。ユーザーがPodの削除を要求すると、システムはPodが強制終了される前に意図された猶予期間を記録および追跡します。強制削除までの猶予期間がある場合、{{< glossary_tooltip text="kubelet" term_id="kubelet" >}}正常な終了を試みます。 -通常、コンテナランタイムは各コンテナのメインプロセスにTERMシグナルを送信します。猶予期間が終了すると、プロセスにKILLシグナルが送信され、Podは{{< glossary_tooltip text="API Server" term_id="kube-apiserver" >}}から削除されます。プロセスの終了を待っている間にkubeletかコンテナランタイムの管理サービスが再起動されると、クラスターは元の猶予期間を含めて、最初からリトライされます。 +通常、コンテナランタイムは各コンテナのメインプロセスにTERMシグナルを送信します。多くのコンテナランタイムは、コンテナイメージで定義されたSTOPSIGNAL値を尊重し、TERMの代わりにこれを送信します。猶予期間が終了すると、プロセスにKILLシグナルが送信され、Podは{{< glossary_tooltip text="API Server" term_id="kube-apiserver" >}}から削除されます。プロセスの終了を待っている間にkubeletかコンテナランタイムの管理サービスが再起動されると、クラスターは元の猶予期間を含めて、最初からリトライされます。 フローの例は下のようになります。 From 91e45afd0d2b4cbacddb7ece605f2d60ba827004 Mon Sep 17 00:00:00 2001 From: KobayashiD27 Date: Thu, 11 Mar 2021 11:32:11 +0900 Subject: [PATCH 004/221] ja:Make ja/docs/concepts/architecture/nodes.md follow v1.19 of the original text --- content/ja/docs/concepts/architecture/nodes.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/ja/docs/concepts/architecture/nodes.md b/content/ja/docs/concepts/architecture/nodes.md index 9c47531a37..bf5fa1acb9 100644 --- a/content/ja/docs/concepts/architecture/nodes.md +++ b/content/ja/docs/concepts/architecture/nodes.md @@ -275,4 +275,3 @@ kubeletはリソースの割当を決定する際にトポロジーのヒント * [Node APIオブジェクト](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#node-v1-core)について読む。 * アーキテクチャ設計文書の[Node](https://git.k8s.io/community/contributors/design-proposals/architecture/architecture.md#the-kubernetes-node)という章を読む。 * [TaintとToleration](/ja/docs/concepts/scheduling-eviction/taint-and-toleration/)について読む。 -* [クラスターのオートスケール](/docs/tasks/administer-cluster/cluster-management/#cluster-autoscaling)について読む。 From 1fbbac1888e165af51730f6179d49d5fd4e77005 Mon Sep 17 00:00:00 2001 From: KobayashiD27 Date: Thu, 11 Mar 2021 12:02:58 +0900 Subject: [PATCH 005/221] ja: Make docs/concepts/cluster-administration follow v1.19 of the original text --- .../cluster-administration/cluster-administration-overview.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 5d85797649..7d8cb8a8b3 100644 --- a/content/ja/docs/concepts/cluster-administration/cluster-administration-overview.md +++ b/content/ja/docs/concepts/cluster-administration/cluster-administration-overview.md @@ -29,8 +29,6 @@ Kubernetesクラスターの計画、セットアップ、設定の例を知る ## クラスターの管理 -* [クラスターの管理](/docs/tasks/administer-cluster/cluster-management/)では、クラスターのライフサイクルに関するいくつかのトピックを紹介しています。例えば、新規クラスターの作成、クラスターのマスターやワーカーノードのアップグレード、ノードのメンテナンスの実施(例: カーネルのアップグレード)、稼働中のクラスターのKubernetes APIバージョンのアップグレードについてです。 - * [ノードの管理](/ja/docs/concepts/architecture/nodes/)方法について学んでください。 * 共有クラスターにおける[リソースクォータ](/docs/concepts/policy/resource-quotas/)のセットアップと管理方法について学んでください。 @@ -41,7 +39,7 @@ Kubernetesクラスターの計画、セットアップ、設定の例を知る * [Kubernetes コンテナの環境](/ja/docs/concepts/containers/container-environment/)では、Kubernetesノード上でのKubeletが管理するコンテナの環境について説明します。 -* [Kubernetes APIへのアクセス制御](/docs/reference/access-authn-authz/controlling-access/)では、ユーザーとサービスアカウントの権限の設定方法について説明します。 +* [Kubernetes APIへのアクセス制御](/docs/concepts/security/controlling-access)では、Kubernetesが自身のAPIに対するアクセスコントロールをどのように実装するかを説明します。 * [認証](/docs/reference/access-authn-authz/authentication/)では、様々な認証オプションを含むKubernetesでの認証について説明します。 From d65300986f6773d304f84943137f9b437c02058d Mon Sep 17 00:00:00 2001 From: CKchen0726 Date: Thu, 11 Mar 2021 11:11:39 +0800 Subject: [PATCH 006/221] fix spelling mistake in ./data/announcements/scheduled.yaml --- data/announcements/scheduled.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/announcements/scheduled.yaml b/data/announcements/scheduled.yaml index 1d5b330ac4..2eec2c1777 100644 --- a/data/announcements/scheduled.yaml +++ b/data/announcements/scheduled.yaml @@ -18,7 +18,7 @@ # title: "Sample 1 announcement" # # title is optional # message: | -# Message *one*. +# Message *one*. # [Hyperlink](https://en.wikipedia.org/wiki/Hyperlink). # # message is required. You can use Markdown. # - name: Sample 2 @@ -36,7 +36,7 @@ announcements: style: "background: #3d4cb7" title: | - KubeCon + CloudNativeCon NA 2020 virtual. + KubeCon + CloudNativeCon NA 2020 virtual. message: | 4 days of incredible opportunities to collaborate, learn, and share with the entire community!
November 17 – 20, 2020 @@ -47,7 +47,7 @@ announcements: style: "background: #3f0374" title: | - KubeCon + CloudNativeCon EU 2020 virtual. + KubeCon + CloudNativeCon EU 2020 virtual. message: | 4 days of incredible opportunities to collaborate, learn + share with the entire community!
August 17 – 20, 2020. From ae80ffb29f24eae2c0f7e1b63d44aa212e94ae8c Mon Sep 17 00:00:00 2001 From: Lapi Date: Thu, 11 Mar 2021 20:48:05 +0900 Subject: [PATCH 007/221] make docs/home/_index.md follow v1.19 of the original text --- content/ja/docs/home/_index.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/content/ja/docs/home/_index.md b/content/ja/docs/home/_index.md index 7f8837ce60..3935a9b1ba 100644 --- a/content/ja/docs/home/_index.md +++ b/content/ja/docs/home/_index.md @@ -31,7 +31,7 @@ cards: button: "チュートリアルを見る" button_path: "/docs/tutorials" - name: setup - title: "クラスターを構築する" + title: "K8sクラスターを構築する" description: "リソースと要求に基づいて、Kubernetesを実行します。" button: "Kubernetesを構築する" button_path: "/docs/setup" @@ -55,9 +55,11 @@ cards: description: "プロジェクトに不慣れでも、長い間関わっていたとしても、誰でもコントリビュートすることができます。" button: "ドキュメントにコントリビュートする" button_path: /docs/contribute -- name: download - title: "Kubernetesをダウンロードする" +- name: release-notes + title: "K8sリリースノート" description: "もしKubernetesをインストールする、また最新バージョンにアップグレードする場合、最新のリリースノートを参照してください。" + button: "Kubernetesをダウンロードする" + button_path: "/docs/setup/release/notes" - name: about title: ドキュメントについて description: このWebサイトには、Kubernetesの最新バージョンと過去4世代のドキュメントが含まれています。 From e74dda647211815da633fa9000e35af49555f1da Mon Sep 17 00:00:00 2001 From: Yasuhisa Hayato Date: Sat, 13 Mar 2021 13:01:41 +0900 Subject: [PATCH 008/221] description of built-in node labels translate to Japanes Removed individual links and replaced them with reference links to pages --- .../concepts/scheduling-eviction/assign-pod-node.md | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/content/ja/docs/concepts/scheduling-eviction/assign-pod-node.md b/content/ja/docs/concepts/scheduling-eviction/assign-pod-node.md index 18b767cbb4..c1c0c95b6d 100644 --- a/content/ja/docs/concepts/scheduling-eviction/assign-pod-node.md +++ b/content/ja/docs/concepts/scheduling-eviction/assign-pod-node.md @@ -66,17 +66,7 @@ nodeSelectorを以下のように追加します: ## 補足: ビルトインNodeラベル {#built-in-node-labels} 明示的に[付与](#step-one-attach-label-to-the-node)するラベルの他に、事前にNodeへ付与されているものもあります。 -以下のようなラベルが該当します。 - -* [`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) +これらのラベルのリストは、[Well-Known Labels, Annotations and Taints](/docs/reference/kubernetes-api/labels-annotations-taints/)を参照してください。 {{< note >}} これらのラベルは、クラウドプロバイダー固有であり、確実なものではありません。 From a34b9fc0153b85eaea9a962f90040392ce370fa0 Mon Sep 17 00:00:00 2001 From: Ryuichi KAWAMATA Date: Sat, 13 Mar 2021 16:53:28 +0900 Subject: [PATCH 009/221] Remove content/ja/docs/concepts/cluster-administration/cloud-providers.md (#26857) --- .../cluster-administration/cloud-providers.md | 327 ------------------ 1 file changed, 327 deletions(-) delete mode 100644 content/ja/docs/concepts/cluster-administration/cloud-providers.md diff --git a/content/ja/docs/concepts/cluster-administration/cloud-providers.md b/content/ja/docs/concepts/cluster-administration/cloud-providers.md deleted file mode 100644 index f5fc0fe845..0000000000 --- a/content/ja/docs/concepts/cluster-administration/cloud-providers.md +++ /dev/null @@ -1,327 +0,0 @@ ---- -title: クラウドプロバイダー -content_type: concept -weight: 30 ---- - - -このページでは、特定のクラウドプロバイダーで実行されているKubernetesを管理する方法について説明します。 - - -### kubeadm -[kubeadm](/ja/docs/reference/setup-tools/kubeadm/kubeadm/)は、Kubernetesクラスターを作成する選択肢として人気があります。 -kubeadmには、クラウドプロバイダーの設定情報を指定する設定オプションがあります。 -例えば、典型的なインツリークラウドプロバイダーは、以下のようにkubeadmを使用して設定することができます。 - -```yaml -apiVersion: kubeadm.k8s.io/v1beta2 -kind: InitConfiguration -nodeRegistration: - kubeletExtraArgs: - cloud-provider: "openstack" - cloud-config: "/etc/kubernetes/cloud.conf" ---- -apiVersion: kubeadm.k8s.io/v1beta2 -kind: ClusterConfiguration -kubernetesVersion: v1.13.0 -apiServer: - extraArgs: - cloud-provider: "openstack" - cloud-config: "/etc/kubernetes/cloud.conf" - extraVolumes: - - name: cloud - hostPath: "/etc/kubernetes/cloud.conf" - mountPath: "/etc/kubernetes/cloud.conf" -controllerManager: - extraArgs: - cloud-provider: "openstack" - cloud-config: "/etc/kubernetes/cloud.conf" - extraVolumes: - - name: cloud - hostPath: "/etc/kubernetes/cloud.conf" - mountPath: "/etc/kubernetes/cloud.conf" -``` - -典型的なインツリークラウドプロバイダーは、通常、[kube-apiserver](/ja/docs/reference/command-line-tools-reference/kube-apiserver/)および[kube-controller-manager](ja//docs/reference/command-line-tools-reference/kube-controller-manager/)、[kubelet](/ja/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)リポジトリーを参照してください。 - -### ノード名 - -AWSクラウドプロバイダーは、AWSインスタンスのプライベートDNS名をKubernetesのNodeオブジェクトの名前として使用します。 - -### ロードバランサー -以下のようにアノテーションを設定することで、[外部ロードバランサー](/ja/docs/tasks/access-application-cluster/create-external-load-balancer/)をAWS上で特定の機能を利用するように構成できます。 - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: example - namespace: kube-system - labels: - run: example - annotations: - service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:xx-xxxx-x:xxxxxxxxx:xxxxxxx/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxx #replace this value - service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http -spec: - type: LoadBalancer - ports: - - port: 443 - targetPort: 5556 - protocol: TCP - selector: - app: example -``` -AWSのロードバランサーサービスには、_アノテーション_ を使ってさまざまな設定を適用することができます。以下では、AWS ELBでサポートされているアノテーションについて説明します。 - -* `service.beta.kubernetes.io/aws-load-balancer-access-log-emit-interval`: アクセスログの送信間隔を指定するために使用します。 -* `service.beta.kubernetes.io/aws-load-balancer-access-log-enabled`: アクセスログを有効または無効にするためにサービスで使用します。 -* `service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-name`: アクセスログ用のs3バケット名を指定するために使用します。 -* `service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-prefix`: アクセスログ用のs3バケットのプレフィックスを指定するために使用します。 -* `service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags`: ELBに追加タグとして記録されるキーとバリューのペアのコンマ区切りリストとして指定するためにサービスで使用します。例えば、`"Key1=Val1,Key2=Val2,KeyNoVal1=,KeyNoVal2"`のように指定できます。 -* `service.beta.kubernetes.io/aws-load-balancer-backend-protocol`: リスナーの背後にあるバックエンド(Pod)が使用するプロトコルを指定するためにサービスで使用します。`http`(デフォルト)または`https`を指定すると、接続を終端してヘッダーを解析するHTTPSリスナーが生成されます。`ssl`または`tcp`を指定すると、「生の」SSLリスナーが使われます。`http`を指定して`aws-load-balancer-ssl-cert`を使わない場合は、HTTPリスナーが使われます。 -* `service.beta.kubernetes.io/aws-load-balancer-ssl-cert`: セキュアなリスナーを要求するためにサービスで使用します。値は有効な証明書のARNです。詳細は、[ELBリスナーの設定](https://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/elb-listener-config.html)を参照してください。CertARNは、IAMまたはCM証明書のARNで、例えば`arn:aws:acm:us-east-1:123456789012:certificate/12345678-1234-1234-1234-123456789012`のようになります。 -* `service.beta.kubernetes.io/aws-load-balancer-connection-draining-enabled`: 接続ドレインを有効または無効にするためにサービスで使用します。 -* `service.beta.kubernetes.io/aws-load-balancer-connection-draining-timeout`: 接続ドレインのタイムアウトを指定するためにサービスで使用します。 -* `service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout`: アイドル接続タイムアウトを指定するためにサービスで使用します。 -* `service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled`: クロスゾーン負荷分散を有効または無効にするためにサービスで使用されます。 -* `service.beta.kubernetes.io/aws-load-balancer-security-groups`: 作成されたELBに追加するセキュリティーグループを指定するために使用します。これは、以前にELBに割り当てられた他のすべてのセキュリティーグループを置き換えます。ここで定義されたセキュリティーグループは、サービス間で共有してはいけません。 -* `service.beta.kubernetes.io/aws-load-balancer-extra-security-groups`: 作成されたELBに加える追加のセキュリティーグループを指定するためにサービスで使用します。 -* `service.beta.kubernetes.io/aws-load-balancer-internal`: 内部ELBが必要であることを示すためにサービスで使用します。 -* `service.beta.kubernetes.io/aws-load-balancer-proxy-protocol`: ELB上でプロキシープロトコルを有効にするためにサービスで使用します。現在は、すべてのELBバックエンドでプロキシープロトコルを有効にすることを意味する`*`という値しか受け付けません。将来的には、特定のバックエンドでのみプロキシープロトコルを設定できるように調整できます。 -* `service.beta.kubernetes.io/aws-load-balancer-ssl-ports`: SSL/HTTPSリスナーを使用するポートのコンマ区切りリストを指定するためにサービスで使用します。デフォルトは`*`(すべて)です。 - -AWSのアノテーションの情報は、[aws.go](https://github.com/kubernetes/legacy-cloud-providers/blob/master/aws/aws.go)のコメントから引用しています。 - -## Azure - -この外部クラウドプロバイダーを利用したい場合、[kubernetes/cloud-provider-azure](https://github.com/kubernetes/cloud-provider-azure#readme)リポジトリーを参照してください。 - -### ノード名 - -Azureクラウドプロバイダーは、ノードのホスト名(kubeletで決定されたもの、または`--hostname-override`で上書きされたもの)を、Kubernetes Nodeオブジェクトの名前として使用します。 -Kubernetesノード名は、Azure VM名と一致しなければならないことに注意してください。 - -## CloudStack - -この外部クラウドプロバイダーを利用したい場合、[apache/cloudstack-kubernetes-provider](https://github.com/apache/cloudstack-kubernetes-provider)リポジトリーを参照してください。 - -### ノード名 - -CloudStackクラウドプロバイダーは、ノードのホスト名(kubeletで決定されたもの、または`--hostname-override`で上書きされたもの)を、Kubernetes Nodeオブジェクトの名前として使用します。 -Kubernetesノード名は、CloudStack VM名と一致しなければならないことに注意してください。 - -## GCE - -この外部クラウドプロバイダーを利用したい場合、[kubernetes/cloud-provider-gcp](https://github.com/kubernetes/cloud-provider-gcp#readme)リポジトリーを参照してください。 - -### ノード名 - -GCEクラウドプロバイダーは、ノードのホスト名(kubeletで決定されたもの、または`--hostname-override`で上書きされたもの)を、Kubernetes Nodeオブジェクトの名前として使用します。 -Kubernetesノード名の最初のセグメントは、GCEインスタンス名と一致しなければならないことに注意してください。例えば、`kubernetes-node-2.c.my-proj.internal`という名前のノードは、`kubernetes-node-2`という名前のインスタンスに対応していなければなりません。 - -## HUAWEI CLOUD - -この外部クラウドプロバイダーを利用したい場合、[kubernetes-sigs/cloud-provider-huaweicloud](https://github.com/kubernetes-sigs/cloud-provider-huaweicloud)リポジトリーを参照してください。 - -### ノード名 - -HUAWEI CLOUDプロバイダーは、ノードのプライベートIPアドレスをKubernetesノード名として使用します。 -ノードでkubeletを開始するときは、必ず`--hostname-override=`を指定してください。 - -## OpenStack -ここでは、OpenStackでKubernetesを実行する際に使用できるすべての設定について説明します。 - -この外部クラウドプロバイダーを利用したい場合、[kubernetes/cloud-provider-openstack](https://github.com/kubernetes/cloud-provider-openstack#readme)リポジトリーを参照してください。 - -### ノード名 - -OpenStackクラウドプロバイダーは、インスタンス名(OpenStackのメタデータで決定されたもの)を、Kubernetes Nodeオブジェクトの名前として使用します。 -インスタンス名は必ず、Kubernetesノード名は、CloudStack VM名と一致しなければならないことに注意してください。 -kubeletがNodeオブジェクトを正常に登録できるように、インスタンス名は有効なKubernetesノード名である必要があります。 - -### サービス - -KubernetesのOpenStackクラウドプロバイダーの実装では、利用可能な場合、基盤となるクラウドからこれらのOpenStackのサービスの使用をサポートします。 - -| サービス名 | APIバージョン | 必須か | -|--------------------------|----------------|----------| -| Block Storage (Cinder) | V1†, V2, V3 | No | -| Compute (Nova) | V2 | No | -| Identity (Keystone) | V2‡, V3 | Yes | -| Load Balancing (Neutron) | V1§, V2 | No | -| Load Balancing (Octavia) | V2 | No | - -† Block Storage V1 APIのサポートは非推奨ですが、Kubernetes 1.9ではBlock Storage V3 APIのサポートが追加されました。 - -‡ Identity V2 APIのサポートは非推奨となり、将来のリリースでプロバイダーから削除される予定です。「Queens」のリリース時点で、OpenStackはIdentity V2 APIを公開しません。 - -§ Load Balancing V1 APIのサポートは、Kubernetes 1.9で削除されました。 - -サービスディスカバリーは、プロバイダー設定で提供される`auth-url`を使用して、OpenStack Identity(Keystone)が管理するサービスカタログを一覧表示することで実現されます。 -プロバイダーは、Keystone以外のOpenStackサービスが利用できなくなった場合には、機能を緩やかに低下させ、影響を受ける機能のサポートを放棄します。 -特定の機能は、基盤となるクラウドでNeutronが公開している拡張機能のリストに基づいて有効または無効にされます。 - -### cloud.conf -Kubernetesはcloud.confというファイルを介して、OpenStackとのやりとり方法を知っています。 -これは、KubernetesにOpenStack認証エンドポイントの認証情報と場所を提供するファイルです。 -ファイル内に以下の詳細を指定することで、cloud.confファイルを作成できます。 - -#### 典型的な設定 -以下の設定例は、最も頻繁に設定が必要な値に関するものです。 -プロバイダーをOpenStackクラウドのKeystoneエンドポイントに指定し、そのエンドポイントでの認証方法の詳細を提供し、さらにロードバランサーを設定します。 - -```yaml -[Global] -username=user -password=pass -auth-url=https:///identity/v3 -tenant-id=c869168a828847f39f7f06edd7305637 -domain-id=2a73b8f597c04551a0fdc8e95544be8a - -[LoadBalancer] -subnet-id=6937f8fa-858d-4bc9-a3a5-18d2c957166a -``` - -##### グローバル -これらのOpenStackプロバイダーの設定オプションは、グローバル設定に関連しており、`cloud.conf`ファイルの`[Global]`セクションに記述する必要があります。 - -* `auth-url`(必死): 認証に使用するKeystone APIのURLです。OpenStackのコントロールパネルでは、Access and Security > API Access > Credentialsで確認できます。 -* `username`(必須): Keystoneに設定されている有効なユーザーのユーザー名を参照します。 -* `password`(必須): Keystoneで設定された有効なユーザーのパスワードを参照します。 -* `tenant-id`(必須): リソースを作成するプロジェクトのIDを指定するために使用します。 -* `tenant-name`(任意): リソースを作成するプロジェクトの名前を指定します。 -* `trust-id`(任意): 認証に使用するtrustの識別子を指定するために使用します。trustは、ユーザー(委託者)が他のユーザー(受託者)に役割を委譲したり、受託者が委託者になりすますことを許可したりする権限を表します。利用可能なtrustは、Keystone APIの`/v3/OS-TRUST/trusts`エンドポイントの下にあります。 -* `domain-id`(任意): ユーザーが所属するドメインのIDを指定するために使用します。 -* `domain-name`(任意): ユーザーが所属するドメイン名を指定するために使用します。 -* `region`(任意): マルチリージョンのOpenStackクラウド上で実行する際に使うリージョンの識別子を指定するために使用します。リージョンはOpenStackデプロイメントの一般的な区分です。リージョンには厳密な地理的な意味合いはありませんが、デプロイメントでは`us-east`のような地理的な名前をリージョンの識別子に使うことができます。利用可能なリージョンはKeystone APIの`/v3/regions`エンドポイントの下にあります。 -* `ca-file`(任意): カスタムCAファイルのパスを指定するために使用します。 - - -テナントをプロジェクトに変更するKeystone V3を使用している場合、`tenant-id`の値は自動的にAPIのプロジェクト構造体にマッピングされます。 - -##### ロードバランサー -これらのOpenStackプロバイダーの設定オプションは、ロードバランサー設定に関連しており、`cloud.conf`ファイルの`[LoadBalancer]`セクションに記述する必要があります。 - -* `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にあります。サブネットを取得するには、それぞれのネットワークをクリックします。 -* `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`も設定しなければなりません。 -* `monitor-delay`(任意): ロードバランサーのメンバーにプローブを送信するまでの時間です。有効な時間単位を指定してください。有効な時間単位は"ns"、"us"(または"μs")、"ms"、"s"、"m"、"h"です。 -* `monitor-timeout`(任意): モニタリングがタイムアウトする前にpingの応答を待つための最大の時間です。この値はdelay値よりも小さくする必要があります。有効な時間単位を指定してください。有効な時間単位は"ns"、"us"(または"μs")、"ms"、"s"、"m"、"h"です。 -* `monitor-max-retries`(任意): ロードバランサーメンバーのステータスをINACTIVEに変更する前に許容されるpingの失敗の数です。1から10の間の数値でなければなりません。 -* `manage-security-groups`(任意): ロードバランサーがセキュリティーグループのルールを自動的に管理するかどうかを決定します。有効な値は`true`と`false`で、デフォルト値は`false`です。`true`を指定した場合は、`node-security-group`も指定しなければなりません。 -* `node-security-group`(任意): 管理するセキュリティーグループのIDです。 - -##### ブロックストレージ -これらのOpenStackプロバイダーの設定オプションは、ブロックストレージ設定に関連しており、`cloud.conf`ファイルの`[BlockStorage]`セクションに記述する必要があります。 - -* `bs-version`(任意): 自動バージョン検出を上書きするために使用します。有効な値は`v1`、`v2`、`v3`、`auto`です。`auto`が指定された場合、自動検出は基盤となるOpenStackクラウドが公開するサポートバージョンのうち、最も高いものを選択します。何も指定しない場合のデフォルト値は`auto`です。 -* `trust-device-path`(任意): ほとんどのシナリオでは、Cinderが提供するブロックデバイス名(例: `/dev/vda`)は信頼できません。このブール値はこの動作をトグルします。`true`に設定すると、Cinderが提供するブロックデバイス名を信頼することになります。デフォルト値の`false`は、シリアル番号と`/dev/disk/by-id`のマッピングに基づいてデバイスのパスを検出します。 -* `ignore-volume-az`(任意): Cinderボリュームをアタッチする際のアベイラビリティーゾーンの使用に影響を与えます。NovaとCinderのアベイラビリティーゾーンが異なる場合は、`true`に設定する必要があります。これは、Novaのアベイラビリティーゾーンが多くあるにも関わらず、Cinderのアベイラビリティーゾーンが1つしかない場合によく見られます。デフォルト値は以前のリリースで使用されていた動作を維持するために`false`になっていますが、将来的には変更される可能性があります。 -* `node-volume-attach-limit`(任意): ノードにアタッチできるボリュームの最大数で、デフォルトはCinderの256です。 - -エンドポイントを区別するためにポートではなくパスを使用しているOpenStackデプロイメントにおいて、Kubernetesのバージョン1.8以下をデプロイする際、明示的に`bs-version`パラメーターの設定が必要な場合があります。パスベースのエンドポイントは`http://foo.bar/volume`の形式であり、ポートベースのエンドポイントは`http://foo.bar:xxx`の形式です。 - -パスベースのエンドポイントを使う環境で、Kubernetesが古い自動検出ロジックを使用している場合、ボリュームの切り離しを試みると`BS API version autodetection failed.`というエラーが返されます。この問題を回避するには、クラウドプロバイダー設定に以下のように追記することで、Cinder APIバージョン2を強制的に使用することができます。 - -```yaml -[BlockStorage] -bs-version=v2 -``` - -##### メタデータ -これらのOpenStackプロバイダーの設定オプションは、メタデータ設定に関連しており、`cloud.conf`ファイルの`[Metadata]`セクションに記述する必要があります。 - -* `search-order`(任意): この設定のキーは、プロバイダーが実行するインスタンスに関連するメタデータの取得方法に影響します。デフォルト値の`configDrive,metadataService`について、プロバイダーは、コンフィグドライブが利用可能な場合は最初にインスタンスに関連するメタデータをそこから取得し、次にメタデータサービスから取得します。代替値は以下の通りです。 - * `configDrive` - コンフィグドライブからのみ、インスタンスのメタデータを取得します。 - * `metadataService` - メタデータサービスからのみ、インスタンスのメタデータを取得します。 - * `metadataService,configDrive` - 最初にメタデータサービスからインスタンスのメタデータを取得し、次にコンフィグドライブから取得します。 - - コンフィグドライブ上のメタデータは時間の経過とともに陳腐化する可能性がありますが、メタデータサービスは常に最新の情報を提供するため、この動作を調整するのが望ましいです。しかし、すべてのOpenStackクラウドがコンフィグドライブとメタデータサービスの両方を提供しているわけではなく、どちらか一方しか利用できない場合もあるため、デフォルトでは両方をチェックするようになっています。 - -##### ルート -これらのOpenStackプロバイダーの設定オプションは、[kubenet](/ja/docs/concepts/cluster-administration/network-plugins/#kubenet)のKubernetesネットワークプラグインに関連しており、`cloud.conf`ファイルの`[Route]`セクションに記述する必要があります。 - - -* `router-id`(任意): 基盤となるクラウドのNeutronデプロイメントが`extraroutes`拡張機能をサポートしている場合は、`router-id`を使用してルートを追加するルーターを指定します。選択したルーターは、クラスターノードを含むプライベートネットワークにまたがっていなければなりません(通常、ノードネットワークは1つしかないので、この値はノードネットワークのデフォルトルーターになります)。この値は、OpenStackで[kubenet](/docs/concepts/cluster-administration/network-plugins/#kubenet)を使用するために必要です。 - -## OVirt - -### ノード名 - -OVirtクラウドプロバイダーは、ノードのホスト名(kubeletで決定されたもの、または`--hostname-override`で上書きされたもの)を、Kubernetes Nodeオブジェクトの名前として使用します。 -Kubernetesノード名は、VMのFQDN(`...`の下でOVirtによって報告されたもの)と一致しなければならないことに注意してください。 - -## Photon - -### ノード名 - -Photonクラウドプロバイダーは、ノードのホスト名(kubeletで決定されたもの、または`--hostname-override`で上書きされたもの)を、Kubernetes Nodeオブジェクトの名前として使用します。 -Kubernetesノード名はPhoton VM名と一致しなければならないことに注意してください(もしくは、`--cloud-config`で`overrideIP`がtrueに設定されている場合は、Kubernetesノード名はPhoton VMのIPアドレスと一致しなければなりません)。 - -## vSphere - -{{< tabs name="vSphere cloud provider" >}} -{{% tab name="vSphere 6.7U3以上" %}} -vSphere 6.7U3以上のすべてのvSphereデプロイメントでは、[external vSphere cloud provider](https://github.com/kubernetes/cloud-provider-vsphere)と[vSphere CSI driver](https://github.com/kubernetes-sigs/vsphere-csi-driver)の使用を推奨します。クイックスタートガイドについては、[Deploying a Kubernetes Cluster on vSphere with CSI and CPI](https://cloud-provider-vsphere.sigs.k8s.io/tutorials/kubernetes-on-vsphere-with-kubeadm.html)を参照してください。 -{{% /tab %}} -{{% tab name="vSphere 6.7U3未満" %}} -vSphere 6.7U3未満を実行している場合は、インツリーのvSphereクラウドプロバイダーを推奨します。クイックスタートガイドについては、[Running a Kubernetes Cluster on vSphere with kubeadm](https://cloud-provider-vsphere.sigs.k8s.io/tutorials/k8s-vcp-on-vsphere-with-kubeadm.html)を参照してください。 -{{% /tab %}} -{{< /tabs >}} - -vSphereクラウドプロバイダーの詳細なドキュメントについては、[vSphereクラウドプロバイダーのドキュメントサイト](https://cloud-provider-vsphere.sigs.k8s.io)を参照してください。 - -## IBM Cloud Kubernetes Service - -### コンピュートノード -IBM Cloud Kubernetes Serviceプロバイダーを使用することで、仮想ノードと物理ノード(ベアメタル)を混在させたクラスターを単一のゾーン、またはリージョン内の複数のゾーンにまたがって作成することができます。詳細については、[Planning your cluster and worker node setup](https://cloud.ibm.com/docs/containers?topic=containers-planning_worker_nodes)を参照してください。 - -Kubernetes Nodeオブジェクトの名前は、IBM Cloud Kubernetes ServiceワーカーノードインスタンスのプライベートIPアドレスです。 - -### ネットワーク -IBM Cloud Kubernetes Serviceプロバイダーは、高品質なネットワークパフォーマンスとノードのネットワーク分離のためにVLANを提供します。カスタムファイアウォールやCalicoネットワークポリシーを設定して、クラスターにセキュリティーの追加レイヤーを加えたり、VPNを使用してクラスターをオンプレミスデータセンターに接続したりすることができます。詳細については、[Planning your cluster network setup](https://cloud.ibm.com/docs/containers?topic=containers-plan_clusters)を参照してください。 - -アプリケーションをパブリックまたはクラスター内で公開するには、NodePort、LoadBalancer、Ingressサービスを利用できます。また、Ingressアプリケーションのロードバランサーをアノテーションでカスタマイズすることもできます。詳細については、[Choosing an app exposure service](https://cloud.ibm.com/docs/containers?topic=containers-cs_network_planning#cs_network_planning)を参照してください。 - -### ストレージ -IBM Cloud Kubernetes Serviceプロバイダーは、Kubernetesネイティブの永続ボリュームを活用して、ユーザーがファイル、ブロック、およびクラウドオブジェクトストレージをアプリケーションにマウントできるようにします。また、データの永続ストレージにDatabase as a Serviceやサードパーティーのアドオンを使用することもできます。詳しくは、[Planning highly available persistent storage](https://cloud.ibm.com/docs/containers?topic=containers-storage_planning#storage_planning)を参照してください。 - -## Baidu Cloud Container Engine - -### ノード名 - -Baiduクラウドプロバイダーは、ノードのプライベートIPアドレス(kubeletで決定されたもの、または`--hostname-override`で上書きされたもの)を、Kubernetes Nodeオブジェクトの名前として使用します。 -Kubernetesノード名はBaidu VMのプライベートIPと一致しなければならないことに注意してください。 - -## Tencent Kubernetes Engine - -この外部クラウドプロバイダーを利用したい場合、[TencentCloud/tencentcloud-cloud-controller-manager](https://github.com/TencentCloud/tencentcloud-cloud-controller-manager)リポジトリーを参照してください。 - -### ノード名 - -Baiduクラウドプロバイダーは、ノードのホスト名(kubeletで決定されたもの、または`--hostname-override`で上書きされたもの)を、Kubernetes Nodeオブジェクトの名前として使用します。 -Kubernetesノード名はTencent VMのプライベートIPと一致しなければならないことに注意してください。 - -## Alibaba Cloud Kubernetes - -この外部クラウドプロバイダーを利用したい場合、[kubernetes/cloud-provider-alibaba-cloud](https://github.com/kubernetes/cloud-provider-alibaba-cloud)リポジトリーを参照してください。 - -### ノード名 - -Alibaba Cloudではノード名の書式は必要ありませんが、kubeletでは`--provider-id=${REGION_ID}.${INSTANCE_ID}`を追加する必要があります。パラメーター`${REGION_ID}`はKubernetesのリージョンのIDを、`${INSTANCE_ID}`はAlibaba ECS(Elastic Compute Service)のIDを表します。 - -### ロードバランサー - -[アノテーション](https://www.alibabacloud.com/help/en/doc-detail/86531.htm)を設定することで、Alibaba Cloudの特定の機能を使用するように外部のロードバランサーを設定できます。 From fb402729919b66178722382231345127cfa9207f Mon Sep 17 00:00:00 2001 From: Ryuichi KAWAMATA Date: Sat, 13 Mar 2021 19:42:45 +0900 Subject: [PATCH 010/221] Update ja/docs/concepts/cluster-administration/networking.md --- .../cluster-administration/networking.md | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/content/ja/docs/concepts/cluster-administration/networking.md b/content/ja/docs/concepts/cluster-administration/networking.md index b81c51f437..b94c9f6d15 100644 --- a/content/ja/docs/concepts/cluster-administration/networking.md +++ b/content/ja/docs/concepts/cluster-administration/networking.md @@ -39,7 +39,7 @@ Kubernetesは、ネットワークの実装に次の基本的な要件を課し このモデルは全体としてそれほど複雑ではないことに加え、KubernetesがVMからコンテナへのアプリへの移植を簡単にするという要望と基本的に互換性があります。ジョブがVMで実行されていた頃も、VMにはIPがあってプロジェクト内の他のVMと通信できました。これは同じ基本モデルです。 -KubernetesのIPアドレスは`Pod`スコープに存在します。`Pod`内のコンテナは、IPアドレスを含むネットワーク名前空間を共有します。これは、`Pod`内のコンテナがすべて`localhost`上の互いのポートに到達できることを意味します。また、`Pod`内のコンテナがポートの使用を調整する必要があることも意味しますが、これもVM内のプロセスと同じです。これのことを「IP-per-pod(Pod毎のIP)」モデルと呼びます。 +KubernetesのIPアドレスは`Pod`スコープに存在します。`Pod`内のコンテナは、IPアドレスとMACアドレスを含むネットワーク名前空間を共有します。これは、`Pod`内のコンテナがすべて`localhost`上の互いのポートに到達できることを意味します。また、`Pod`内のコンテナがポートの使用を調整する必要があることも意味しますが、これもVM内のプロセスと同じです。これのことを「IP-per-pod(Pod毎のIP)」モデルと呼びます。 この実装方法は実際に使われているコンテナランタイムの詳細部分です。 @@ -51,6 +51,8 @@ KubernetesのIPアドレスは`Pod`スコープに存在します。`Pod`内の この一覧はアルファベット順にソートされており、順序は優先ステータスを意味するものではありません。 +{{% thirdparty-content %}} + ### ACI [Cisco Application Centric Infrastructure](https://www.cisco.com/c/en/us/solutions/data-center-virtualization/application-centric-infrastructure/index.html) offers an integrated overlay and underlay SDN solution that supports containers, virtual machines, and bare metal servers. @@ -99,6 +101,10 @@ With the help of the Big Cloud Fabric's virtual pod multi-tenant architecture, c BCF was recognized by Gartner as a visionary in the latest [Magic Quadrant](https://go.bigswitch.com/17GatedDocuments-MagicQuadrantforDataCenterNetworking_Reg.html). One of the BCF Kubernetes on-premises deployments (which includes Kubernetes, DC/OS & VMware running on multiple DCs across different geographic regions) is also referenced [here](https://portworx.com/architects-corner-kubernetes-satya-komala-nio/). +### Calico + +[Calico](https://docs.projectcalico.org/)は、コンテナ、仮想マシン、ホストベースのワークロードのためのオープンソースのネットワーク及びネットワークセキュリティのソリューションです。Calicoは、純粋なLinuxのeBPFデータプレーンや、Linuxの標準的なネットワークデータプレーン、WindowsのHNSデータプレーンを含む、複数のデータプレーンをサポートしています。Calicoは完全なネットワークスタックを提供していますが、[クラウドプロバイダーのCNI](https://docs.projectcalico.org/networking/determine-best-networking#calico-compatible-cni-plugins-and-cloud-provider-integrations)と組み合わせてネットワークポリシーを提供することもできます。 + ### Cilium [Cilium](https://github.com/cilium/cilium) is open source software for @@ -129,6 +135,11 @@ tables to provide per-instance subnets to each host (which is limited to 50-100 entries per VPC). In short, cni-ipvlan-vpc-k8s significantly reduces the network complexity required to deploy Kubernetes at scale within AWS. +### Coil + +[Coil](https://github.com/cybozu-go/coil)は、容易に連携できるよう設計されていて、フレキシブルなEgressネットワークを提供することができるCNIプラグインです。 +Coilはベアメタルと比較して低いオーバーヘッドで操作することができ、また外部のネットワークへの任意のEgress NATゲートウェイを定義することができます。 + ### Contiv [Contiv](https://github.com/contiv/netplugin) provides configurable networking (native l3 using BGP, overlay using vxlan, classic l2, or Cisco-SDN/ACI) for various use cases. [Contiv](https://contiv.io) is all open sourced. @@ -266,14 +277,6 @@ stateful ACLs, load-balancers etc to build different virtual networking topologies. The project has a specific Kubernetes plugin and documentation at [ovn-kubernetes](https://github.com/openvswitch/ovn-kubernetes). -### Project Calico - -[Project Calico](https://docs.projectcalico.org/) is an open source container networking provider and network policy engine. - -Calico provides a highly scalable networking and network policy solution for connecting Kubernetes pods based on the same IP networking principles as the internet, for both Linux (open source) and Windows (proprietary - available from [Tigera](https://www.tigera.io/essentials/)). Calico can be deployed without encapsulation or overlays to provide high-performance, high-scale data center networking. Calico also provides fine-grained, intent based network security policy for Kubernetes pods via its distributed firewall. - -Calico can also be run in policy enforcement mode in conjunction with other networking solutions such as Flannel, aka [canal](https://github.com/tigera/canal), or native GCE, AWS or Azure networking. - ### Romana [Romana](https://romana.io) is an open source network and security automation solution that lets you deploy Kubernetes without an overlay network. Romana supports Kubernetes [Network Policy](/docs/concepts/services-networking/network-policies/) to provide isolation across network namespaces. @@ -287,9 +290,7 @@ or stand-alone. In either version, it doesn't require any configuration or extr to run, and in both cases, the network provides one IP address per pod - as is standard for Kubernetes. - ## {{% heading "whatsnext" %}} ネットワークモデルの初期設計とその根拠、および将来の計画については、[ネットワーク設計ドキュメント](https://git.k8s.io/community/contributors/design-proposals/network/networking.md)で詳細に説明されています。 - From 45793339dd154a24ee599c59de082ed711877b77 Mon Sep 17 00:00:00 2001 From: RyuSA Date: Sat, 13 Mar 2021 22:58:11 +0900 Subject: [PATCH 011/221] bump docs up to v1.19 Update ja/docs/concepts/services-networking/service.md --- .../concepts/services-networking/service.md | 109 +++++++++++------- 1 file changed, 66 insertions(+), 43 deletions(-) diff --git a/content/ja/docs/concepts/services-networking/service.md b/content/ja/docs/concepts/services-networking/service.md index d6894e959e..c93b0688e3 100644 --- a/content/ja/docs/concepts/services-networking/service.md +++ b/content/ja/docs/concepts/services-networking/service.md @@ -23,7 +23,7 @@ KubernetesはPodにそれぞれのIPアドレス割り振りや、Podのセッ ## Serviceを利用する動機 -{{< glossary_tooltip term_id="pod" text="Pod" >}}は停止が想定して設計されています。 Podが作成され、もしそれらが停止する時、Podは再作成されません。 +Kubernetes {{< glossary_tooltip term_id="pod" text="Pods" >}}はクラスターの状態に合わせて作成され削除されます。Podは揮発的なリソースです。 {{< glossary_tooltip term_id="deployment" >}}をアプリケーションを稼働させるために使用すると、Podを動的に作成・削除してくれます。 各Podはそれ自身のIPアドレスを持ちます。しかしDeploymentでは、ある時点において同時に稼働しているPodのセットは、その後のある時点において稼働しているPodのセットとは異なる場合があります。 @@ -35,7 +35,8 @@ KubernetesはPodにそれぞれのIPアドレス割り振りや、Podのセッ ## Serviceリソース {#service-resource} Kubernetesにおいて、ServiceはPodの論理的なセットや、そのPodのセットにアクセスするためのポリシーを定義します(このパターンはよくマイクロサービスと呼ばることがあります)。 -ServiceによってターゲットとされたPodのセットは、たいてい {{< glossary_tooltip text="セレクター" term_id="selector" >}} (セレクターなしのServiceを利用したい場合は[下記](#services-without-selectors)を参照してください)によって定義されます。 +ServiceによってターゲットとされたPodのセットは、たいてい {{< glossary_tooltip text="セレクター" term_id="selector" >}}によって定義されます。 +その他の方法について知りたい場合は[セレクターなしのService](#services-without-selectors)を参照してください。 例えば、3つのレプリカが稼働しているステートレスな画像処理用のバックエンドを考えます。これらのレプリカは代替可能です。— フロントエンドはバックエンドが何であろうと気にしません。バックエンドのセットを構成する実際のPodのセットが変更された際、フロントエンドクライアントはその変更を気にしたり、バックエンドのPodのセットの情報を記録しておく必要はありません。 @@ -90,9 +91,9 @@ ServiceのデフォルトプロトコルはTCPです。また、他の[サポー Serviceは多くの場合、KubernetesのPodに対するアクセスを抽象化しますが、他の種類のバックエンドも抽象化できます。 例えば: - * プロダクション環境で外部のデータベースクラスターを利用したいが、テスト環境では、自身のクラスターが持つデータベースを利用したい場合 - * Serviceを、異なるNamespace内のServiceや他のクラスターのServiceに向ける場合 - * ワークロードをKubernetesに移行するとき、アプリケーションに対する処理をしながら、バックエンドの一部をKubernetesで実行する場合 +* プロダクション環境で外部のデータベースクラスターを利用したいが、テスト環境では、自身のクラスターが持つデータベースを利用したい場合 +* Serviceを、異なる{{< glossary_tooltip term_id="namespace" >}}のServiceや他のクラスターのServiceに向ける場合 +* ワークロードをKubernetesに移行するとき、アプリケーションに対する処理をしながら、バックエンドの一部をKubernetesで実行する場合 このような場合において、ユーザーはPodセレクター_なしで_ Serviceを定義できます。 @@ -137,6 +138,7 @@ link-local (169.254.0.0/16 and 224.0.0.0/24 for IPv4, fe80::/64 for IPv6)に設 ExternalName Serviceはセレクターの代わりにDNS名を使用する特殊なケースのServiceです。さらなる情報は、このドキュメントの後で紹介する[ExternalName](#externalname)を参照ください。 ### エンドポイントスライス + {{< feature-state for_k8s_version="v1.17" state="beta" >}} エンドポイントスライスは、Endpointsに対してよりスケーラブルな代替手段を提供できるAPIリソースです。概念的にはEndpointsに非常に似ていますが、エンドポイントスライスを使用すると、ネットワークエンドポイントを複数のリソースに分割できます。デフォルトでは、エンドポイントスライスは、100個のエンドポイントに到達すると「いっぱいである」と見なされ、その時点で追加のエンドポイントスライスが作成され、追加のエンドポイントが保存されます。 @@ -145,12 +147,10 @@ ExternalName Serviceはセレクターの代わりにDNS名を使用する特殊 ### アプリケーションプロトコル -{{< feature-state for_k8s_version="v1.18" state="alpha" >}} - -AppProtocolフィールドは、各Serviceのポートで使用されるアプリケーションプロトコルを指定する方法を提供します。 - -アルファ機能のため、このフィールドはデフォルトで有効化されていません。このフィールドを使用するには、 `ServiceAppProtocol` という[フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)を有効化してください。 +{{< feature-state for_k8s_version="v1.19" state="beta" >}} +`AppProtocol`フィールドによってServiceの各ポートに対して特定のアプリケーションプロトコルを指定することができます。 +この値は、対応するEndpointsオブジェクトとEndpointSliceオブジェクトに反映されます。 ## 仮想IPとサービスプロキシー {#virtual-ips-and-service-proxies} Kubernetesクラスターの各Nodeは`kube-proxy`を稼働させています。`kube-proxy`は[`ExternalName`](#externalname)タイプ以外の`Service`用に仮想IPを実装する責務があります。 @@ -162,9 +162,9 @@ Kubernetesクラスターの各Nodeは`kube-proxy`を稼働させています。 Serviceにおいてプロキシーを使う理由はいくつかあります。 - * DNSの実装がレコードのTTLをうまく扱わず、期限が切れた後も名前解決の結果をキャッシュするという長い歴史がある。 - * いくつかのアプリケーションではDNSルックアップを1度だけ行い、その結果を無期限にキャッシュする。 - * アプリケーションとライブラリーが適切なDNS名の再解決を行ったとしても、DNSレコード上の0もしくは低い値のTTLがDNSに負荷をかけることがあり、管理が難しい。 +* DNSの実装がレコードのTTLをうまく扱わず、期限が切れた後も名前解決の結果をキャッシュするという長い歴史がある。 +* いくつかのアプリケーションではDNSルックアップを1度だけ行い、その結果を無期限にキャッシュする。 +* アプリケーションとライブラリーが適切なDNS名の再解決を行ったとしても、DNSレコード上の0もしくは低い値のTTLがDNSに負荷をかけることがあり、管理が難しい。 ### user-spaceプロキシーモード {#proxy-mode-userspace} @@ -211,12 +211,12 @@ IPVSプロキシーモードはiptablesモードと同様に、netfilterのフ IPVSはバックエンドPodに対するトラフィックのバランシングのために多くのオプションを下記のとおりに提供します。 -- `rr`: ラウンドロビン -- `lc`: 最低コネクション数(オープンされているコネクション数がもっとも小さいもの) -- `dh`: 送信先IPによって割り当てられたハッシュ値をもとに割り当てる(Destination Hashing) -- `sh`: 送信元IPによって割り当てられたハッシュ値をもとに割り当てる(Source Hashing) -- `sed`: 見込み遅延が最小なもの -- `nq`: キューなしスケジューリング +* `rr`: ラウンドロビン +* `lc`: 最低コネクション数(オープンされているコネクション数がもっとも小さいもの) +* `dh`: 送信先IPによって割り当てられたハッシュ値をもとに割り当てる(Destination Hashing) +* `sh`: 送信元IPによって割り当てられたハッシュ値をもとに割り当てる(Source Hashing) +* `sed`: 見込み遅延が最小なもの +* `nq`: キューなしスケジューリング {{< note >}} IPVSモードでkube-proxyを稼働させるためには、kube-proxyを稼働させる前にNode上でIPVSを有効にしなければなりません。 @@ -282,7 +282,7 @@ PodがNode上で稼働するとき、kubeletはアクティブな各Serviceに これは[Docker links互換性](https://docs.docker.com/userguide/dockerlinks/)のある変数( [makeLinkVariables関数](https://releases.k8s.io/{{< param "githubbranch" >}}/pkg/kubelet/envvars/envvars.go#L72)を確認してください)や、より簡単な`{SVCNAME}_SERVICE_HOST`や、`{SVCNAME}_SERVICE_PORT`変数をサポートします。この変数名で使われるService名は大文字に変換され、`-`は`_`に変換されます。 -例えば、TCPポート6379番を公開していて、さらにclusterIPが10.0.0.11に割り当てられている`"redis-master"`というServiceは、下記のような環境変数を生成します。 +例えば、TCPポート6379番を公開していて、さらにclusterIPが10.0.0.11に割り当てられている`redis-master`というServiceは、下記のような環境変数を生成します。 ```shell REDIS_MASTER_SERVICE_HOST=10.0.0.11 @@ -308,12 +308,12 @@ ServiceのclusterIPを発見するためにDNSのみを使う場合、このよ CoreDNSなどのクラスター対応のDNSサーバーは新しいServiceや、各Service用のDNSレコードのセットのためにKubernetes APIを常に監視します。 もしクラスターを通してDNSが有効になっている場合、全てのPodはDNS名によって自動的にServiceに対する名前解決をするようにできるはずです。 -例えば、Kubernetesの`"my-ns"`というNamespace内で`"my-service"`というServiceがある場合、KubernetesコントロールプレーンとDNS Serviceが協調して動作し、`"my-service.my-ns"`というDNSレコードを作成します。 -`"my-ns"`というNamespace内のPodは`my-service`という名前で簡単に名前解決できるはずです(`"my-service.my-ns"`でも動作します)。 +例えば、Kubernetesの`my-ns`というNamespace内で`my-service`というServiceがある場合、KubernetesコントロールプレーンとDNS Serviceが協調して動作し、`my-service.my-ns`というDNSレコードを作成します。 +`my-ns`というNamespace内のPodは`my-service`という名前で簡単に名前解決できるはずです(`my-service.my-ns`でも動作します)。 他のNamespace内でのPodは`my-service.my-ns`といった形で指定しなくてはなりません。これらのDNS名は、そのServiceのclusterIPに名前解決されます。 -Kubernetesは名前付きのポートに対するDNS SRV(Service)レコードもサポートしています。もし`"my-service.my-ns"`というServiceが`"http"`という名前のTCPポートを持っていた場合、IPアドレスと同様に、`"http"`のポート番号を探すために`_http._tcp.my-service.my-ns`というDNS SRVクエリを実行できます。 +Kubernetesは名前付きのポートに対するDNS SRV(Service)レコードもサポートしています。もし`my-service.my-ns`というServiceが`http`という名前のTCPポートを持っていた場合、IPアドレスと同様に、`http`のポート番号を探すために`_http._tcp.my-service.my-ns`というDNS SRVクエリを実行できます。 KubernetesのDNSサーバーは`ExternalName` Serviceにアクセスする唯一の方法です。 [DNS Pods と Service](/ja/docs/concepts/services-networking/dns-pod-service/)にて`ExternalName`による名前解決に関するさらなる情報を確認できます。 @@ -337,8 +337,8 @@ KubernetesのDNSサーバーは`ExternalName` Serviceにアクセスする唯一 ラベルセレクターを定義しないHeadless Serviceにおいては、Endpointsコントローラーは`Endpoints`レコードを作成しません。 しかしDNSのシステムは下記の2つ両方を探索し、設定します。 - * [`ExternalName`](#externalname)タイプのServiceに対するCNAMEレコード - * 他の全てのServiceタイプを含む、Service名を共有している全ての`Endpoints`レコード +* [`ExternalName`](#externalname)タイプのServiceに対するCNAMEレコード +* 他の全てのServiceタイプを含む、Service名を共有している全ての`Endpoints`レコード ## Serviceの公開 (Serviceのタイプ) {#publishing-services-service-types} @@ -349,16 +349,15 @@ Kubernetesの`ServiceTypes`によって、ユーザーがどのような種類 `Type`項目の値と、そのふるまいは以下のようになります。 - * `ClusterIP`: クラスター内部のIPでServiceを公開する。このタイプではServiceはクラスター内部からのみ疎通性があります。このタイプはデフォルトの`ServiceType`です。 - * [`NodePort`](#nodeport): 各NodeのIPにて、静的なポート(`NodePort`)上でServiceを公開します。その`NodePort` のServiceが転送する先の`ClusterIP` Serviceが自動的に作成されます。`:`にアクセスすることによって`NodePort` Serviceにアクセスできるようになります。 - * [`LoadBalancer`](#loadbalancer): クラウドプロバイダーのロードバランサーを使用して、Serviceを外部に公開します。クラスター外部にあるロードバランサーが転送する先の`NodePort`と`ClusterIP` Serviceは自動的に作成されます。 - * [`ExternalName`](#externalname): `CNAME`レコードを返すことにより、`externalName`フィールドに指定したコンテンツ(例: `foo.bar.example.com`)とServiceを紐づけます。しかし、いかなる種類のプロキシーも設定されません。 +* `ClusterIP`: クラスター内部のIPでServiceを公開する。このタイプではServiceはクラスター内部からのみ疎通性があります。このタイプはデフォルトの`ServiceType`です。 +* [`NodePort`](#nodeport): 各NodeのIPにて、静的なポート(`NodePort`)上でServiceを公開します。その`NodePort` のServiceが転送する先の`ClusterIP` Serviceが自動的に作成されます。`:`にアクセスすることによって`NodePort` Serviceにアクセスできるようになります。 +* [`LoadBalancer`](#loadbalancer): クラウドプロバイダーのロードバランサーを使用して、Serviceを外部に公開します。クラスター外部にあるロードバランサーが転送する先の`NodePort`と`ClusterIP` Serviceは自動的に作成されます。 +* [`ExternalName`](#externalname): `CNAME`レコードを返すことにより、`externalName`フィールドに指定したコンテンツ(例: `foo.bar.example.com`)とServiceを紐づけます。しかし、いかなる種類のプロキシーも設定されません。 + {{< note >}} + `ExternalName`タイプのServiceを利用するためには、kube-dnsのバージョン1.7かCoreDNSのバージョン0.0.8以上が必要となります。 + {{< /note >}} - {{< note >}} - `ExternalName`タイプのServiceを利用するためには、kube-dnsのバージョン1.7かCoreDNSのバージョン0.0.8以上が必要となります。 - {{< /note >}} - -また、Serviceを公開するために[Ingress](/docs/concepts/services-networking/ingress/)も利用可能です。IngressはServiceのタイプではありませんが、クラスターに対するエントリーポイントとして動作します。 +また、Serviceを公開するために[Ingress](/ja/docs/concepts/services-networking/ingress/)も利用可能です。IngressはServiceのタイプではありませんが、クラスターに対するエントリーポイントとして動作します。 Ingressは同一のIPアドレスにおいて、複数のServiceを公開するように、ユーザーの設定した転送ルールを1つのリソースにまとめることができます。 ### NodePort タイプ {#nodeport} @@ -461,6 +460,7 @@ Split-HorizonなDNS環境において、ユーザーは2つのServiceを外部 タブを選択してください。 {{% /tab %}} {{% tab name="GCP" %}} + ```yaml [...] metadata: @@ -469,8 +469,10 @@ metadata: cloud.google.com/load-balancer-type: "Internal" [...] ``` + {{% /tab %}} {{% tab name="AWS" %}} + ```yaml [...] metadata: @@ -479,8 +481,10 @@ metadata: service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0 [...] ``` + {{% /tab %}} {{% tab name="Azure" %}} + ```yaml [...] metadata: @@ -489,8 +493,10 @@ metadata: service.beta.kubernetes.io/azure-load-balancer-internal: "true" [...] ``` + {{% /tab %}} {{% tab name="IBM Cloud" %}} + ```yaml [...] metadata: @@ -502,6 +508,7 @@ metadata: {{% /tab %}} {{% tab name="OpenStack" %}} + ```yaml [...] metadata: @@ -510,8 +517,10 @@ metadata: service.beta.kubernetes.io/openstack-internal-load-balancer: "true" [...] ``` + {{% /tab %}} {{% tab name="Baidu Cloud" %}} + ```yaml [...] metadata: @@ -520,8 +529,10 @@ metadata: service.beta.kubernetes.io/cce-load-balancer-internal-vpc: "true" [...] ``` + {{% /tab %}} {{% tab name="Tencent Cloud" %}} + ```yaml [...] metadata: @@ -529,6 +540,7 @@ metadata: service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: subnet-xxxxx [...] ``` + {{% /tab %}} {{< /tabs >}} @@ -675,8 +687,16 @@ AWS上でのELB Service用のアクセスログを管理するためにはいく # この値はservice.beta.kubernetes.io/aws-load-balancer-healthcheck-intervalの値以下である必要があります。 # デフォルトでは5 この値は2から60の間で設定可能 + service.beta.kubernetes.io/aws-load-balancer-security-groups: "sg-53fae93f" + # ELBが作成される際に追加されるセキュリティグループのリスト + # service.beta.kubernetes.io/aws-load-balancer-extra-security-groupsアノテーションと異なり + # 元々ELBに付与されていたセキュリティグループを置き換えることになります。 + service.beta.kubernetes.io/aws-load-balancer-extra-security-groups: "sg-53fae93f,sg-42efd82e" # ELBに追加される予定のセキュリティーグループのリスト + + service.beta.kubernetes.io/aws-load-balancer-target-node-labels: "ingress-gw,gw-name=public-api" + # ロードバランサーがターゲットノードを指定する際に利用するキーバリューのペアのコンマ区切りリストです。 ``` #### AWSでのNetwork Load Balancerのサポート {#aws-nlb-support} @@ -738,8 +758,9 @@ spec: annotations: # 指定したノードでロードバランサーをバインドします service.kubernetes.io/qcloud-loadbalancer-backends-label: key in (value1, value2) + # 既存のロードバランサーのID - service.kubernetes.io/tke-existed-lbid:lb-6swtxxxx + service.kubernetes.io/tke-existed-lbid: lb-6swtxxxx # ロードバランサー(LB)のカスタムパラメーターは、LBタイプの変更をまだサポートしていません service.kubernetes.io/service.extensiveParameters: "" @@ -750,11 +771,14 @@ spec: # ロードバランサーのタイプを指定します # 有効な値: classic(Classic Cloud Load Balancer)またはapplication(Application Cloud Load Balancer) service.kubernetes.io/loadbalance-type: xxxxx + # パブリックネットワーク帯域幅の課金方法を指定します # 有効な値: TRAFFIC_POSTPAID_BY_HOUR(bill-by-traffic)およびBANDWIDTH_POSTPAID_BY_HOUR(bill-by-bandwidth) service.kubernetes.io/qcloud-loadbalancer-internet-charge-type: xxxxxx + # 帯域幅の値を指定します(値の範囲:[1-2000] Mbps)。 service.kubernetes.io/qcloud-loadbalancer-internet-max-bandwidth-out: "10" + # この注釈が設定されている場合、ロードバランサーはポッドが実行されているノードのみを登録します # そうでない場合、すべてのノードが登録されます service.kubernetes.io/local-svc-only-bind-node-with-pod: true @@ -777,6 +801,7 @@ spec: type: ExternalName externalName: my.database.example.com ``` + {{< note >}} ExternalNameはIpv4のアドレスの文字列のみ受け付けますが、IPアドレスではなく、数字で構成されるDNS名として受け入れます。 IPv4アドレスに似ているExternalNamesはCoreDNSもしくはIngress-Nginxによって名前解決されず、これはExternalNameは正規のDNS名を指定することを目的としているためです。 @@ -914,12 +939,12 @@ ServiceはKubernetesのREST APIにおいてトップレベルのリソースで もしクラウドプロバイダーがサポートしている場合、ServiceのEndpointsに転送される外部のHTTP/HTTPSでのリバースプロキシーをセットアップするために、LoadBalancerモードでServiceを作成可能です。 {{< note >}} -ユーザーはまた、HTTP / HTTPS Serviceを公開するために、Serviceの代わりに{{< glossary_tooltip term_id="ingress" >}}を利用することもできます。 +ユーザーはまた、HTTP/HTTPS Serviceを公開するために、Serviceの代わりに{{< glossary_tooltip term_id="ingress" >}}を利用することもできます。 {{< /note >}} ### PROXY プロトコル -もしクラウドプロバイダーがサポートしている場合(例: [AWS](/docs/concepts/cluster-administration/cloud-providers/#aws))、Kubernetesクラスターの外部のロードバランサーを設定するためにLoadBalancerモードでServiceを利用できます。これは[PROXY protocol](https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt)がついた接続を転送します。 +もしクラウドプロバイダーがサポートしている場合、Kubernetesクラスターの外部のロードバランサーを設定するためにLoadBalancerモードでServiceを利用できます。これは[PROXY protocol](https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt)がついた接続を転送します。 ロードバランサーは、最初の一連のオクテットを送信します。 下記のような例となります。 @@ -927,15 +952,16 @@ ServiceはKubernetesのREST APIにおいてトップレベルのリソースで ``` PROXY TCP4 192.0.2.202 10.0.42.7 12345 7\r\n ``` + クライアントからのデータのあとに追加されます。 ### SCTP -{{< feature-state for_k8s_version="v1.12" state="alpha" >}} +{{< feature-state for_k8s_version="v1.19" state="beta" >}} -KubernetesはService、Endpoints、NetworkPolicyとPodの定義においてα版の機能として`protocol`フィールドの値でSCTPをサポートしています。この機能を有効にするために、クラスター管理者はAPI Serverにおいて`SCTPSupport`というフィーチャーゲートを有効にする必要があります。例えば、`--feature-gates=SCTPSupport=true,…`といったように設定します。 +KubernetesはService、Endpoints、EndpointSlice、NetworkPolicyとPodの定義において`protocol`フィールドの値でSCTPをサポートしています。ベータ版の機能のため、この機能はデフォルトで有効になっています。SCTPをクラスターレベルで無効にするには、クラスター管理者はAPI Serverにおいて`SCTPSupport` [フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)を`--feature-gates=SCTPSupport=false,…`と設定して無効にする必要があります。 -そのフィーチャーゲートが有効になった時、ユーザーはService、Endpoints、NetworkPolicyの`protocol`フィールドと、Podの`SCTP`フィールドを設定できます。 +そのフィーチャーゲートが有効になった時、ユーザーはService、Endpoints、EndpointSlice、NetworkPolicyの`protocol`フィールドと、Podの`SCTP`フィールドを設定できます。 Kubernetesは、TCP接続と同様に、SCTPアソシエーションに応じてネットワークをセットアップします。 #### 警告 {#caveat-sctp-overview} @@ -967,11 +993,8 @@ SCTPはWindowsベースのNodeではサポートされていません。 kube-proxyはuserspaceモードにおいてSCTPアソシエーションの管理をサポートしません。 {{< /warning >}} - - ## {{% heading "whatsnext" %}} - * [Connecting Applications with Services](/docs/concepts/services-networking/connect-applications-service/)を参照してください。 * [Ingress](/docs/concepts/services-networking/ingress/)を参照してください。 * [EndpointSlices](/docs/concepts/services-networking/endpoint-slices/)を参照してください。 From 745b68888d2906b6810bd4ff2eb8721239611015 Mon Sep 17 00:00:00 2001 From: RyuSA Date: Sat, 13 Mar 2021 23:02:03 +0900 Subject: [PATCH 012/221] Update some links from en-page to ja-page --- content/ja/docs/concepts/services-networking/service.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/ja/docs/concepts/services-networking/service.md b/content/ja/docs/concepts/services-networking/service.md index c93b0688e3..d104f3e992 100644 --- a/content/ja/docs/concepts/services-networking/service.md +++ b/content/ja/docs/concepts/services-networking/service.md @@ -143,7 +143,7 @@ ExternalName Serviceはセレクターの代わりにDNS名を使用する特殊 エンドポイントスライスは、Endpointsに対してよりスケーラブルな代替手段を提供できるAPIリソースです。概念的にはEndpointsに非常に似ていますが、エンドポイントスライスを使用すると、ネットワークエンドポイントを複数のリソースに分割できます。デフォルトでは、エンドポイントスライスは、100個のエンドポイントに到達すると「いっぱいである」と見なされ、その時点で追加のエンドポイントスライスが作成され、追加のエンドポイントが保存されます。 -エンドポイントスライスは、[エンドポイントスライスのドキュメント](/docs/concepts/services-networking/endpoint-slices/)にて詳しく説明されている追加の属性と機能を提供します。 +エンドポイントスライスは、[エンドポイントスライスのドキュメント](/ja/docs/concepts/services-networking/endpoint-slices/)にて詳しく説明されている追加の属性と機能を提供します。 ### アプリケーションプロトコル @@ -995,6 +995,6 @@ kube-proxyはuserspaceモードにおいてSCTPアソシエーションの管理 ## {{% heading "whatsnext" %}} -* [Connecting Applications with Services](/docs/concepts/services-networking/connect-applications-service/)を参照してください。 -* [Ingress](/docs/concepts/services-networking/ingress/)を参照してください。 -* [EndpointSlices](/docs/concepts/services-networking/endpoint-slices/)を参照してください。 +* [Connecting Applications with Services](/ja/docs/concepts/services-networking/connect-applications-service/)を参照してください。 +* [Ingress](/ja/docs/concepts/services-networking/ingress/)を参照してください。 +* [EndpointSlices](/ja/docs/concepts/services-networking/endpoint-slices/)を参照してください。 From 2ce5be43779ffb360ebc1ec4532c0287ee5f9ee1 Mon Sep 17 00:00:00 2001 From: Genki Ogasawara Date: Sun, 14 Mar 2021 10:25:37 +0900 Subject: [PATCH 013/221] modify: content/ja/docs/concepts/workloads/controllers/replicaset.md --- content/ja/docs/concepts/workloads/controllers/replicaset.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/ja/docs/concepts/workloads/controllers/replicaset.md b/content/ja/docs/concepts/workloads/controllers/replicaset.md index 9f8ccfc377..d2dcaf232d 100644 --- a/content/ja/docs/concepts/workloads/controllers/replicaset.md +++ b/content/ja/docs/concepts/workloads/controllers/replicaset.md @@ -197,7 +197,7 @@ ReplicaSetオブジェクトの名前は、有効な ### Pod テンプレート -`.spec.template`はラベルを持つことが必要な[Pod テンプレート](/ja/docs/concepts/workloads/pods/pod-overview/#podテンプレート) です。先ほど作成した`frontend.yaml`の例では、`tier: frontend`というラベルを1つ持っています。 +`.spec.template`はラベルを持つことが必要な[Pod テンプレート](/docs/concepts/workloads/pods/#podテンプレート) です。先ほど作成した`frontend.yaml`の例では、`tier: frontend`というラベルを1つ持っています。 他のコントローラーがこのPodを所有しようとしないためにも、他のコントローラーのセレクターでラベルを上書きしないように注意してください。 テンプレートの[再起動ポリシー](/docs/concepts/workloads/Pods/pod-lifecycle/#restart-policy)のためのフィールドである`.spec.template.spec.restartPolicy`は`Always`のみ許可されていて、そしてそれがデフォルト値です。 @@ -300,7 +300,7 @@ ReplicaSetは、Node上のいくつかのエージェント(例えば、Kubelet ### Job -PodをPodそれ自身で停止させたいような場合(例えば、バッチ用のジョブなど)は、ReplicaSetの代わりに[`Job`](/docs/concepts/jobs/run-to-completion-finite-workloads/)を使用してください。 +PodをPodそれ自身で停止させたいような場合(例えば、バッチ用のジョブなど)は、ReplicaSetの代わりに[`Job`](/docs/concepts/workloads/controllers/job/)を使用してください。 ### DaemonSet From 045265b044a6171cef39fef1a872e24126b64c2d Mon Sep 17 00:00:00 2001 From: Genki Ogasawara Date: Sun, 14 Mar 2021 10:32:03 +0900 Subject: [PATCH 014/221] modify: content/ja/docs/concepts/workloads/controllers/replicaset.md --- content/ja/docs/concepts/workloads/controllers/replicaset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/workloads/controllers/replicaset.md b/content/ja/docs/concepts/workloads/controllers/replicaset.md index d2dcaf232d..f2317706cf 100644 --- a/content/ja/docs/concepts/workloads/controllers/replicaset.md +++ b/content/ja/docs/concepts/workloads/controllers/replicaset.md @@ -197,7 +197,7 @@ ReplicaSetオブジェクトの名前は、有効な ### Pod テンプレート -`.spec.template`はラベルを持つことが必要な[Pod テンプレート](/docs/concepts/workloads/pods/#podテンプレート) です。先ほど作成した`frontend.yaml`の例では、`tier: frontend`というラベルを1つ持っています。 +`.spec.template`はラベルを持つことが必要な[Pod テンプレート](/ja/docs/concepts/workloads/pods/#podテンプレート) です。先ほど作成した`frontend.yaml`の例では、`tier: frontend`というラベルを1つ持っています。 他のコントローラーがこのPodを所有しようとしないためにも、他のコントローラーのセレクターでラベルを上書きしないように注意してください。 テンプレートの[再起動ポリシー](/docs/concepts/workloads/Pods/pod-lifecycle/#restart-policy)のためのフィールドである`.spec.template.spec.restartPolicy`は`Always`のみ許可されていて、そしてそれがデフォルト値です。 From b9c6c57377c37301625b39892622205cdb0bb4eb Mon Sep 17 00:00:00 2001 From: RyuSA Date: Sun, 14 Mar 2021 12:43:06 +0900 Subject: [PATCH 015/221] Update content/ja/docs/concepts/services-networking/service.md Pods to Pod --- content/ja/docs/concepts/services-networking/service.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/services-networking/service.md b/content/ja/docs/concepts/services-networking/service.md index d104f3e992..1b878eeda0 100644 --- a/content/ja/docs/concepts/services-networking/service.md +++ b/content/ja/docs/concepts/services-networking/service.md @@ -23,7 +23,7 @@ KubernetesはPodにそれぞれのIPアドレス割り振りや、Podのセッ ## Serviceを利用する動機 -Kubernetes {{< glossary_tooltip term_id="pod" text="Pods" >}}はクラスターの状態に合わせて作成され削除されます。Podは揮発的なリソースです。 +Kubernetes {{< glossary_tooltip term_id="pod" text="Pod" >}}はクラスターの状態に合わせて作成され削除されます。Podは揮発的なリソースです。 {{< glossary_tooltip term_id="deployment" >}}をアプリケーションを稼働させるために使用すると、Podを動的に作成・削除してくれます。 各Podはそれ自身のIPアドレスを持ちます。しかしDeploymentでは、ある時点において同時に稼働しているPodのセットは、その後のある時点において稼働しているPodのセットとは異なる場合があります。 From 12bc83471fbd51178ed54eff124d57c90b64720e Mon Sep 17 00:00:00 2001 From: JIIOryo Date: Sun, 14 Mar 2021 20:46:21 +0900 Subject: [PATCH 016/221] Update: ja/docs/concepts/workloads/controllers/deployment.md --- .../ja/docs/concepts/workloads/controllers/deployment.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/ja/docs/concepts/workloads/controllers/deployment.md b/content/ja/docs/concepts/workloads/controllers/deployment.md index e2d720323d..de2388ebee 100644 --- a/content/ja/docs/concepts/workloads/controllers/deployment.md +++ b/content/ja/docs/concepts/workloads/controllers/deployment.md @@ -95,7 +95,7 @@ Deploymentによって作成されたReplicaSetを管理しないでください コマンドの実行結果は以下のとおりです。 ```shell Waiting for rollout to finish: 2 out of 3 new replicas have been updated... - deployment.apps/nginx-deployment successfully rolled out + deployment "nginx-deployment" successfully rolled out ``` 4. 数秒後、再度`kubectl get deployments`を実行してください。 @@ -194,7 +194,7 @@ Deploymentを更新するには以下のステップに従ってください。 ``` もしくは ``` - deployment.apps/nginx-deployment successfully rolled out + deployment "nginx-deployment" successfully rolled out ``` 更新されたDeploymentのさらなる情報を取得するには、以下を確認してください。 @@ -788,7 +788,7 @@ kubectl rollout status deployment.v1.apps/nginx-deployment 実行結果は以下のとおりです。 ``` Waiting for rollout to finish: 2 of 3 updated replicas are available... -deployment.apps/nginx-deployment successfully rolled out +deployment "nginx-deployment" successfully rolled out ``` そして`kubectl rollout`の終了ステータスが0となります(成功です): ```shell From 11b5df1932cc83e418342f2fb79d0fe5e6a0e0e7 Mon Sep 17 00:00:00 2001 From: JIIOryo Date: Sun, 14 Mar 2021 21:27:15 +0900 Subject: [PATCH 017/221] Update: ja/docs/concepts/workloads/pods/init-containers.md --- content/ja/docs/concepts/workloads/pods/init-containers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/workloads/pods/init-containers.md b/content/ja/docs/concepts/workloads/pods/init-containers.md index 5e7baf0665..4cf7d75fae 100644 --- a/content/ja/docs/concepts/workloads/pods/init-containers.md +++ b/content/ja/docs/concepts/workloads/pods/init-containers.md @@ -20,7 +20,7 @@ Initコンテナは下記の項目をのぞいて、通常のコンテナと全 * Initコンテナは常に完了するまで稼働します。 * 各Initコンテナは、次のInitコンテナが稼働する前に正常に完了しなくてはなりません。 -もしあるPodの単一のInitコンテナが失敗した場合、KubernetesはInitコンテナが成功するまで何度もそのPodを再起動します。しかし、もしそのPodの`restartPolicy`がNeverの場合、再起動されません。 +もしあるPodの単一のInitコンテナが失敗した場合、Kubeletは成功するまで何度もそのInitコンテナを再起動します。しかし、もしそのPodの`restartPolicy`がNeverで、そのPodの起動時にInitコンテナが失敗した場合、KubernetesはそのPod全体を失敗として扱います。 PodにInitコンテナを指定するためには、Podの仕様にそのアプリケーションの`containers`配列と並べて、`initContainers`フィールドを[Container](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#container-v1-core)型のオブジェクトの配列として指定してください。 Initコンテナのステータスは、`.status.initContainerStatuses`フィールドにコンテナのステータスの配列として返されます(`.status.containerStatuses`と同様)。 From 57ade89fb0b842488b8a8bd2ce6ce434b76f9c74 Mon Sep 17 00:00:00 2001 From: katsuhisa91 <91katsuhisa@gmail.com> Date: Sun, 14 Mar 2021 23:50:24 +0900 Subject: [PATCH 018/221] [ja] Update docs/concepts/workloads/controllers/daemonset.md to follow v1.19 of the original text --- content/ja/docs/concepts/workloads/controllers/daemonset.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/content/ja/docs/concepts/workloads/controllers/daemonset.md b/content/ja/docs/concepts/workloads/controllers/daemonset.md index 363a549997..7d2d55febb 100644 --- a/content/ja/docs/concepts/workloads/controllers/daemonset.md +++ b/content/ja/docs/concepts/workloads/controllers/daemonset.md @@ -70,8 +70,6 @@ Kubernetes1.8のように、ユーザーは`.spec.template`のラベルにマッ もし`spec.selector`が指定されたとき、`.spec.template.metadata.labels`とマッチしなければなりません。この2つの値がマッチしない設定をした場合、APIによってリジェクトされます。 -また、ユーザーは通常、別のDaemonSetやReplicaSetなどの別のワークロードリソースを使用する場合であっても直接であっても、このセレクターマッチするラベルを持つPodを作成すべきではありません。さもないと、DaemonSet {{}}は、それらのPodが作成されたものとみなすためです。Kubernetesはこれを行うことを止めません。ユーザーがこれを行いたい1つのケースとしては、テスト用にノード上に異なる値を持つPodを手動で作成するような場合があります。 - ### 選択したNode上でPodを稼働させる もしユーザーが`.spec.template.spec.nodeSelector`を指定したとき、DaemonSetコントローラーは、その[node From c966085b8103acba88f2ac9a565a3ea6e16100f4 Mon Sep 17 00:00:00 2001 From: s-kawamura-w664 Date: Tue, 16 Mar 2021 18:48:48 +0900 Subject: [PATCH 019/221] update ja/docs/concepts/overview/what-is-kubernetes.md --- .../docs/concepts/overview/what-is-kubernetes.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/content/ja/docs/concepts/overview/what-is-kubernetes.md b/content/ja/docs/concepts/overview/what-is-kubernetes.md index 3ca8fa78fe..514d52c1ba 100644 --- a/content/ja/docs/concepts/overview/what-is-kubernetes.md +++ b/content/ja/docs/concepts/overview/what-is-kubernetes.md @@ -8,6 +8,8 @@ weight: 10 card: name: concepts weight: 10 +sitemap: + priority: 0.9 --- @@ -33,7 +35,7 @@ Kubernetesの名称は、ギリシャ語に由来し、操舵手やパイロッ 各VMは、仮想ハードウェア上で各自のOSを含んだ全コンポーネントを実行する完全なマシンです。 -**コンテナを使ったデプロイ (Container deployment):** コンテナはVMと似ていますが、アプリケーション間でオペレーティング・システム(OS)を共有できる緩和された分離特性を持っています。そのため、コンテナは軽量だといわれます。VMと同じように、コンテナは各自のファイルシステム、CPU、メモリー、プロセス空間等を持っています。基盤のインフラストラクチャから分離されているため、クラウドやOSディストリビューションを越えて移動することが可能です。 +**コンテナを使ったデプロイ (Container deployment):** コンテナはVMと似ていますが、アプリケーション間でオペレーティング・システム(OS)を共有できる緩和された分離特性を持っています。そのため、コンテナは軽量だといわれます。VMと同じように、コンテナは各自のファイルシステム、CPUの共有、メモリー、プロセス空間等を持っています。基盤のインフラストラクチャから分離されているため、クラウドやOSディストリビューションを越えて移動することが可能です。 コンテナは、その他にも次のようなメリットを提供するため、人気が高まっています。 @@ -56,17 +58,17 @@ Kubernetesの名称は、ギリシャ語に由来し、操舵手やパイロッ Kubernetesは以下を提供します。 -* **サービスディスカバリーと負荷分散** +* **サービスディスカバリーと負荷分散** Kubernetesは、DNS名または独自のIPアドレスを使ってコンテナを公開することができます。コンテナへのトラフィックが多い場合は、Kubernetesは負荷分散し、ネットワークトラフィックを振り分けることができるため、デプロイが安定します。 -* **ストレージ オーケストレーション** +* **ストレージ オーケストレーション** Kubernetesは、ローカルストレージやパブリッククラウドプロバイダーなど、選択したストレージシステムを自動でマウントすることができます。 -* **自動化されたロールアウトとロールバック** +* **自動化されたロールアウトとロールバック** Kubernetesを使うとデプロイしたコンテナのあるべき状態を記述することができ、制御されたスピードで実際の状態をあるべき状態に変更することができます。例えば、アプリケーションのデプロイのために、新しいコンテナの作成や既存コンテナの削除、新しいコンテナにあらゆるリソースを適用する作業を、Kubernetesで自動化できます。 -* **自動ビンパッキング** +* **自動ビンパッキング** コンテナ化されたタスクを実行するノードのクラスターをKubernetesへ提供します。各コンテナがどれくらいCPUやメモリー(RAM)を必要とするのかをKubernetesに宣言することができます。Kubernetesはコンテナをノードにあわせて調整することができ、リソースを最大限に活用してくれます。 -* **自己修復** +* **自己修復** Kubernetesは、処理が失敗したコンテナを再起動し、コンテナを入れ替え、定義したヘルスチェックに応答しないコンテナを強制終了します。処理の準備ができるまでは、クライアントに通知しません。 -* **機密情報と構成管理** +* **機密情報と構成管理** Kubernetesは、パスワードやOAuthトークン、SSHキーのよう機密の情報を保持し、管理することができます。機密情報をデプロイし、コンテナイメージを再作成することなくアプリケーションの構成情報を更新することができます。スタック構成の中で機密情報を晒してしまうこともありません。 ## Kubernetesにないもの From eb02d4974062c55169a3e606730d262441b98963 Mon Sep 17 00:00:00 2001 From: Lapi Date: Tue, 16 Mar 2021 23:56:21 +0900 Subject: [PATCH 020/221] Make docs/contribute/_index.md follow v1.19 of the original text --- content/ja/docs/contribute/_index.md | 81 +++++++++++++++++----------- 1 file changed, 51 insertions(+), 30 deletions(-) diff --git a/content/ja/docs/contribute/_index.md b/content/ja/docs/contribute/_index.md index 008b575e1a..f4885fc60b 100644 --- a/content/ja/docs/contribute/_index.md +++ b/content/ja/docs/contribute/_index.md @@ -1,55 +1,76 @@ --- content_type: concept -title: Kubernetesのドキュメントに貢献する +title: K8sのドキュメントに貢献する linktitle: 貢献 main_menu: true +no_list: true weight: 80 +card: + name: 貢献 + weight: 10 + title: K8sへの貢献を始める --- -ドキュメントやウェブサイトに貢献したい方、ご協力お待ちしています。 -はじめての方、久しぶりの方、開発者でもエンドユーザでも、はたまたタイポを見逃せない方でもどなたでも貢献可能です。 +*Kubernetesは初心者でも経験者でも、全てのコントリビューターからの改善を歓迎しています!* +{{< note >}} +Kubernetesへの貢献について総合的に知りたい場合は、[contributor documentation](https://www.kubernetes.dev/docs/)を参照してください。 +{{< /note >}} + +このウェブサイトは[Kubernetes SIG Docs](/docs/contribute/#get-involved-with-sig-docs)が管理しています。 + +Kubernetesドキュメントコントリビューターは + +- 既存のコンテンツを改善します +- 新しいコンテンツを作成します +- ドキュメントを翻訳します +- Kubernetesリリースサイクルの一部としてドキュメントを管理・公開します ## はじめに -どなたでも、問題を説明するissueや、ドキュメントの改善を求めるissueを作成し、プルリクエスト(PR)を用いて変更に貢献することができます。 -一部のタスクでは、Kubernetes organizationで、より多くの信頼とアクセス権限が必要です。 -役割と権限についての詳細は、[SIG Docsへの参加](/docs/contribute/participating/)を参照してください。 - -Kubernetesのドキュメントは、GitHubのリポジトリーにあります。 -どなたからの貢献も歓迎しますが、Kubernetesコミュニティの効果的な運用のためには、gitとGitHubを基本的に使いこなせる必要があります。 +どなたでも、問題を説明するissueや、ドキュメントの改善を求めるissueを作成し、[`kubernetes/website` GitHub リポジトリ](https://github.com/kubernetes/website)に対するプルリクエスト(PR)を用いて変更に貢献することができます。 +Kubernetesコミュニティで効果的に働くためには、[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. [コンテンツの改善](https://kubernetes.io/docs/contribute/start/#improve-existing-content)と[変更レビュー](https://kubernetes.io/docs/contribute/start/#review-docs-pull-requests)の基本的なプロセスを理解していることを確認してください。 +3. [プルリクエストのオープン](/docs/contribute/new-content/open-a-pr/)と[変更レビュー](/docs/contribute/review/reviewing-prs/)の基本的なプロセスを理解していることを確認してください。 -## 貢献するためのベストプラクティス +一部のタスクでは、Kubernetes organizationで、より多くの信頼とアクセス権限が必要です。 +役割と権限についての詳細は、[SIG Docsへの参加](/docs/contribute/participating/)を参照してください。 -- 明快で意味のあるGitコミットメッセージを書いてください。 -- PRがマージされたときにissueを参照し、自動的にissueをクローズする _Github Special Keywords_ を必ず含めるようにしてください。 -- タイプミスの修正や、スタイルの変更、文法の変更などのような小さな変更をPRに加える場合は、比較的小さな変更のためにコミットの数が増えすぎないように、コミットはまとめてください。 -- あなたがコードを変更をした理由を示し、レビュアーがあなたのPRを理解するのに十分な情報を確保した適切なPR説明を、必ず含めるようにしてください。 -- 追加文献 : - - [chris.beams.io/posts/git-commit/](https://chris.beams.io/posts/git-commit/) - - [github.com/blog/1506-closing-issues-via-pull-requests ](https://github.com/blog/1506-closing-issues-via-pull-requests ) - - [davidwalsh.name/squash-commits-git ](https://davidwalsh.name/squash-commits-git ) +## はじめての貢献 +- 貢献のための複数の方法について学ぶために[貢献の概要](/docs/contribute/new-content/overview/)を読んでください。 +- 良い開始地点を探すために[`kubernetes/website` issueリスト](https://github.com/kubernetes/website/issues/)を確認してください。 +- 既存のドキュメントに対して[GitHubを使ってプルリクエストをオープン](/docs/contribute/new-content/open-a-pr/#changes-using-github)し、GitHubへのissueの登録について学んでください。 +- 正確さと言語の校正のため、他のKubernetesコミュニティメンバーから[プルリクエストのレビュー](/docs/contribute/review/reviewing-prs/)を受けてください。 +- 見識のあるコメントを残せるようにするため、Kubernetesの[コンテンツ](/docs/contribute/style/content-guide/)と[スタイルガイド](/docs/contribute/style/style-guide/)を読んでください。 +- [ページコンテンツの種類](/docs/contribute/style/page-content-types/)と[Hugoショートカット](/docs/contribute/style/hugo-shortcodes/)について勉強してください。 + +## 次のステップ + +- リポジトリの[ローカルクローンでの作業](/docs/contribute/new-content/open-a-pr/#fork-the-repo)について学んでください。 +- [リリース機能](/docs/contribute/new-content/new-features/)について記載してください。 +- [SIG Docs](/docs/contribute/participate/)に参加し、[memberやreviewer](/docs/contribute/participate/roles-and-responsibilities/)になってください。 +- [国際化](/docs/contribute/localization/)を始めたり、支援したりしてください。 + +## SIG Docsに参加する + +[SIG Docs](/docs/contribute/participate/)はKubernetesのドキュメントとウェブサイトを公開・管理するコントリビューターのグループです。SIG Docsに参加することはKubernetesコントリビューター(機能開発でもそれ以外でも)にとってKubernetesプロジェクトに大きな影響を与える素晴らしい方法の一つです。 + +SIG Docsは複数の方法でコミュニケーションをとっています。 + +- [Kubernetes Slackインスタンスの`#sig-docs`に参加してください](https://slack.k8s.io/)。自己紹介を忘れずに! +- [`kubernetes-sig-docs`メーリングリストに参加してください](https://groups.google.com/forum/#!forum/kubernetes-sig-docs)。ここでは幅広い議論が起こり、公式な決定が記録されます。 +- [毎週のSIG Docsビデオミーティング](https://github.com/kubernetes/community/tree/master/sig-docs)に参加してください。ミーティングは `#sig-docs`でアナウンスされ、[Kubernetesコミュニティミーティングカレンダー](https://calendar.google.com/calendar/embed?src=cgnt364vd8s86hr2phapfjc6uk%40group.calendar.google.com&ctz=America/Los_Angeles)に追加されます[Zoomクライアント](https://zoom.us/download)をダウンロードするか、電話を使って通話する必要があります。 ## その他の貢献方法 -- TwitterやStack Overflowといったオンラインフォーラムを通してKubernetesコミュニティに貢献したい方、または各地のミートアップやイベントについて知りたい方は[Kubernetes community site](/community/)へ。 -- 機能開発に貢献したい方は、まずはじめに[Kubernetesコントリビューターチートシート](https://github.com/kubernetes/community/blob/master/contributors/guide/contributor-cheatsheet/README-ja.md)を読んでください。 - - -## {{% heading "whatsnext" %}} - -- ドキュメントへの貢献の基本について、さらに知りたい場合は、[貢献の開始](/docs/contribute/start/)を参照してください。 -- 変更を提案をする際は、[Kubernetesドキュメンテーションスタイルガイド](/docs/contribute/style/style-guide/)に従ってください。 -- SIG Docsについて、さらに知りたい場合は、[SIG Docsへの参加](/docs/contribute/participating/)を参照してください。 -- Kubernetesドキュメントのローカライズについて、さらに知りたい場合は、[Kubernetesドキュメントのローカライズ](/docs/contribute/localization/)を参照してください。 - +- [Kubernetesコミュニティサイト](/community/)を訪問してください。TwitterやStack Overflowに参加したり、Kubernetesの集会やイベントについて学んだりしてください。 +- 機能開発に貢献したい方は、まずはじめに[Kubernetesコントリビューターチートシート](https://github.com/kubernetes/community/tree/master/contributors/guide/contributor-cheatsheet)を読んでください。 +- [ブログ記事やケーススタディ](/docs/contribute/new-content/blogs-case-studies/)を投稿してください。 From 2627976c950b9f34895779b0e2b38f2c753f8fd4 Mon Sep 17 00:00:00 2001 From: Lapi Date: Wed, 17 Mar 2021 00:00:29 +0900 Subject: [PATCH 021/221] fix translation --- content/ja/docs/contribute/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/contribute/_index.md b/content/ja/docs/contribute/_index.md index f4885fc60b..551b66b284 100644 --- a/content/ja/docs/contribute/_index.md +++ b/content/ja/docs/contribute/_index.md @@ -67,7 +67,7 @@ SIG Docsは複数の方法でコミュニケーションをとっています。 - [Kubernetes Slackインスタンスの`#sig-docs`に参加してください](https://slack.k8s.io/)。自己紹介を忘れずに! - [`kubernetes-sig-docs`メーリングリストに参加してください](https://groups.google.com/forum/#!forum/kubernetes-sig-docs)。ここでは幅広い議論が起こり、公式な決定が記録されます。 -- [毎週のSIG Docsビデオミーティング](https://github.com/kubernetes/community/tree/master/sig-docs)に参加してください。ミーティングは `#sig-docs`でアナウンスされ、[Kubernetesコミュニティミーティングカレンダー](https://calendar.google.com/calendar/embed?src=cgnt364vd8s86hr2phapfjc6uk%40group.calendar.google.com&ctz=America/Los_Angeles)に追加されます[Zoomクライアント](https://zoom.us/download)をダウンロードするか、電話を使って通話する必要があります。 +- [毎週のSIG Docsビデオミーティング](https://github.com/kubernetes/community/tree/master/sig-docs)に参加してください。ミーティングは `#sig-docs`でアナウンスされ、[Kubernetesコミュニティミーティングカレンダー](https://calendar.google.com/calendar/embed?src=cgnt364vd8s86hr2phapfjc6uk%40group.calendar.google.com&ctz=America/Los_Angeles)に追加されます。[Zoomクライアント](https://zoom.us/download)をダウンロードするか、電話を使って通話する必要があります。 ## その他の貢献方法 From 0418941fb3ace0b56eac979b59f3f4ed3f92ef0e Mon Sep 17 00:00:00 2001 From: KobayashiD27 Date: Wed, 17 Mar 2021 16:47:18 +0900 Subject: [PATCH 022/221] Change to make the text more natulal --- .../cluster-administration/cluster-administration-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7d8cb8a8b3..89b3b28919 100644 --- a/content/ja/docs/concepts/cluster-administration/cluster-administration-overview.md +++ b/content/ja/docs/concepts/cluster-administration/cluster-administration-overview.md @@ -39,7 +39,7 @@ Kubernetesクラスターの計画、セットアップ、設定の例を知る * [Kubernetes コンテナの環境](/ja/docs/concepts/containers/container-environment/)では、Kubernetesノード上でのKubeletが管理するコンテナの環境について説明します。 -* [Kubernetes APIへのアクセス制御](/docs/concepts/security/controlling-access)では、Kubernetesが自身のAPIに対するアクセスコントロールをどのように実装するかを説明します。 +* [Kubernetes APIへのアクセス制御](/docs/concepts/security/controlling-access)では、Kubernetesで自身のAPIに対するアクセスコントロールがどのように実装されているかを説明します。 * [認証](/docs/reference/access-authn-authz/authentication/)では、様々な認証オプションを含むKubernetesでの認証について説明します。 From 538a43689abe4b2555a217f55192cdced53a7fdc Mon Sep 17 00:00:00 2001 From: Kobayashi Daisuke Date: Wed, 17 Mar 2021 16:54:34 +0900 Subject: [PATCH 023/221] Update content/ja/docs/concepts/architecture/controller.md Co-authored-by: inductor(Kohei) --- content/ja/docs/concepts/architecture/controller.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/ja/docs/concepts/architecture/controller.md b/content/ja/docs/concepts/architecture/controller.md index a4477d3fc2..324ac35537 100644 --- a/content/ja/docs/concepts/architecture/controller.md +++ b/content/ja/docs/concepts/architecture/controller.md @@ -52,7 +52,7 @@ Jobとは対照的に、クラスターの外部に変更を加える必要が (クラスター内のノードを水平にスケールさせる[コントローラー](https://github.com/kubernetes/autoscaler/)が実際に存在します。) -ここで重要な点は、コントローラーが目的の状態を実現するために変更を加えてから、現在の状態をクラスターのAPIサーバーに報告することです。 他の制御ループは、その報告されたデータを監視し、独自のアクションを実行できます。 +ここで重要な点は、コントローラーが目的の状態を実現するために変更を加えてから、現在の状態をクラスターのAPIサーバーに報告することです。他の制御ループは、その報告されたデータを監視し、独自のアクションを実行できます。 サーモスタットの例では、部屋が非常に寒い場合、別のコントローラーが霜防止ヒーターをオンにすることもあります。 Kubernetesクラスターを使用すると、コントロールプレーンは、[Kubernetesを拡張して](/ja/docs/concepts/extend-kubernetes/)実装することにより、IPアドレス管理ツールやストレージサービス、クラウドプロバイダーAPI、およびその他のサービスと間接的に連携します。 @@ -90,4 +90,3 @@ Kubernetesを拡張するためにコントロールプレーンの外で動作 * 基本的な[Kubernetesオブジェクト](/ja/docs/concepts/#kubernetes-objects)について学ぶ * [Kubernetes API](/ja/docs/concepts/overview/kubernetes-api/)について学ぶ * 自分でコントローラーを書きたい場合は、「Kubernetesを拡張する」の[エクステンションパターン](/ja/docs/concepts/extend-kubernetes/extend-cluster/#extension-patterns)を読んでください。 - From 64b95a525508b524ad564121b7539a20cc83d8de Mon Sep 17 00:00:00 2001 From: Kobayashi Daisuke Date: Wed, 17 Mar 2021 16:54:41 +0900 Subject: [PATCH 024/221] Update content/ja/docs/concepts/architecture/controller.md Co-authored-by: inductor(Kohei) --- content/ja/docs/concepts/architecture/controller.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/architecture/controller.md b/content/ja/docs/concepts/architecture/controller.md index 324ac35537..eaa0f4eb49 100644 --- a/content/ja/docs/concepts/architecture/controller.md +++ b/content/ja/docs/concepts/architecture/controller.md @@ -54,7 +54,7 @@ Jobとは対照的に、クラスターの外部に変更を加える必要が ここで重要な点は、コントローラーが目的の状態を実現するために変更を加えてから、現在の状態をクラスターのAPIサーバーに報告することです。他の制御ループは、その報告されたデータを監視し、独自のアクションを実行できます。 -サーモスタットの例では、部屋が非常に寒い場合、別のコントローラーが霜防止ヒーターをオンにすることもあります。 Kubernetesクラスターを使用すると、コントロールプレーンは、[Kubernetesを拡張して](/ja/docs/concepts/extend-kubernetes/)実装することにより、IPアドレス管理ツールやストレージサービス、クラウドプロバイダーAPI、およびその他のサービスと間接的に連携します。 +サーモスタットの例では、部屋が非常に寒い場合、別のコントローラーが霜防止ヒーターをオンにすることもあります。Kubernetesクラスターを使用すると、コントロールプレーンは、[Kubernetesを拡張して](/ja/docs/concepts/extend-kubernetes/)実装することにより、IPアドレス管理ツールやストレージサービス、クラウドプロバイダーAPI、およびその他のサービスと間接的に連携します。 ## 目的の状態 vs 現在の状態 {#desired-vs-current} From 035907a06d4e5b01b9352bfcbe285838484dbc1c Mon Sep 17 00:00:00 2001 From: shimodatkh Date: Wed, 17 Mar 2021 21:24:29 +0900 Subject: [PATCH 025/221] Update content/ja/docs/concepts/workloads/pods/pod-lifecycle.md Co-authored-by: bells17 --- content/ja/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/workloads/pods/pod-lifecycle.md b/content/ja/docs/concepts/workloads/pods/pod-lifecycle.md index ea2f2116f0..012c042c81 100644 --- a/content/ja/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/ja/docs/concepts/workloads/pods/pod-lifecycle.md @@ -69,7 +69,7 @@ Podのコンテナの状態を確認するには`kubectl describe pod [POD_NAME] ### `Running` {#container-state-running} -`Running`状態はコンテナが問題なく実行されていることを示します。`postStart`フックが構成されていた場合、それはすでに実行されて終了しています。`Running`状態のコンテナを持つPodに対して`kubectl`コマンドを使用すると、そのコンテナが`Running`状態になった時刻が表示されます。 +`Running`状態はコンテナが問題なく実行されていることを示します。`postStart`フックが構成されていた場合、それはすでに実行が完了しています。`Running`状態のコンテナを持つPodに対して`kubectl`コマンドを使用すると、そのコンテナが`Running`状態になった時刻が表示されます。 ### `Terminated` {#container-state-terminated} From 1df5ca8f51d690d54afbc1c5c21b78bfe48ab882 Mon Sep 17 00:00:00 2001 From: Michael Nikitochkin Date: Wed, 23 Sep 2020 18:50:02 +0200 Subject: [PATCH 026/221] Use apiversion networking.k8s.io/v1 for ingress for JA There is a warning deprecation message for kubernetes v1.19: ``` Warning: networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress ``` Switched apiversion in the example to `networking.k8s.io/v1` --- .../ingress-minikube.md | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/content/ja/docs/tasks/access-application-cluster/ingress-minikube.md b/content/ja/docs/tasks/access-application-cluster/ingress-minikube.md index 563ce2478e..5870186330 100644 --- a/content/ja/docs/tasks/access-application-cluster/ingress-minikube.md +++ b/content/ja/docs/tasks/access-application-cluster/ingress-minikube.md @@ -135,7 +135,7 @@ weight: 100 1. 以下の内容で`example-ingress.yaml`を作成します。 ```yaml - apiVersion: networking.k8s.io/v1beta1 + apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress @@ -147,9 +147,12 @@ weight: 100 http: paths: - path: / + pathType: Prefix backend: - serviceName: web - servicePort: 8080 + service: + name: web + port: + number: 8080 ``` 1. 次のコマンドを実行して、Ingressリソースを作成します。 @@ -175,8 +178,8 @@ weight: 100 {{< /note >}} ```shell - NAME HOSTS ADDRESS PORTS AGE - example-ingress hello-world.info 172.17.0.15 80 38s + NAME CLASS HOSTS ADDRESS PORTS AGE + example-ingress hello-world.info 172.17.0.15 80 38s ``` 1. 次の行を`/etc/hosts`ファイルの最後に書きます。 @@ -241,9 +244,12 @@ weight: 100 ```yaml - path: /v2 + pathType: Prefix backend: - serviceName: web2 - servicePort: 8080 + service: + name: web2 + port: + number: 8080 ``` 1. 次のコマンドで変更を適用します。 From e70524473205decf9d3041f68485fa7127701d69 Mon Sep 17 00:00:00 2001 From: Michael Nikitochkin Date: Sat, 20 Feb 2021 00:02:59 +0100 Subject: [PATCH 027/221] [ja] Update the examples with source code and sync with en version --- .../ingress-minikube.md | 26 ++----------------- .../service/networking/example-ingress.yaml | 18 +++++++++++++ 2 files changed, 20 insertions(+), 24 deletions(-) create mode 100644 content/ja/examples/service/networking/example-ingress.yaml diff --git a/content/ja/docs/tasks/access-application-cluster/ingress-minikube.md b/content/ja/docs/tasks/access-application-cluster/ingress-minikube.md index 5870186330..be26708099 100644 --- a/content/ja/docs/tasks/access-application-cluster/ingress-minikube.md +++ b/content/ja/docs/tasks/access-application-cluster/ingress-minikube.md @@ -134,31 +134,12 @@ weight: 100 1. 以下の内容で`example-ingress.yaml`を作成します。 - ```yaml - apiVersion: networking.k8s.io/v1 - kind: Ingress - metadata: - name: example-ingress - annotations: - nginx.ingress.kubernetes.io/rewrite-target: /$1 - spec: - rules: - - host: hello-world.info - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: web - port: - number: 8080 - ``` + {{< codenew file="service/networking/example-ingress.yaml" >}} 1. 次のコマンドを実行して、Ingressリソースを作成します。 ```shell - kubectl apply -f example-ingress.yaml + kubectl apply -f https://kubernetes.io/examples/service/networking/example-ingress.yaml ``` 出力は次のようになります。 @@ -306,6 +287,3 @@ weight: 100 * [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/examples/service/networking/example-ingress.yaml b/content/ja/examples/service/networking/example-ingress.yaml new file mode 100644 index 0000000000..b309d13275 --- /dev/null +++ b/content/ja/examples/service/networking/example-ingress.yaml @@ -0,0 +1,18 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: example-ingress + annotations: + nginx.ingress.kubernetes.io/rewrite-target: /$1 +spec: + rules: + - host: hello-world.info + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: web + port: + number: 8080 \ No newline at end of file From c565179b1c9eb9a8303e59d3c5f205dadd7674c2 Mon Sep 17 00:00:00 2001 From: JIIOryo Date: Thu, 18 Mar 2021 07:27:35 +0900 Subject: [PATCH 028/221] [ja] Add setHostnameAsFQDN field to dns-pod-service.md --- .../services-networking/dns-pod-service.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/content/ja/docs/concepts/services-networking/dns-pod-service.md b/content/ja/docs/concepts/services-networking/dns-pod-service.md index 4375928a45..bd679a7039 100644 --- a/content/ja/docs/concepts/services-networking/dns-pod-service.md +++ b/content/ja/docs/concepts/services-networking/dns-pod-service.md @@ -122,6 +122,29 @@ spec: A(AAAA)レコードはPodの名前に対して作成されないため、`hostname`はPodのA(AAAA)レコードが作成されるために必須となります。`hostname`を持たないが`subdomain`を持つようなPodは、そのPodのIPアドレスを指し示すHeadless Service(`default-subdomain.my-namespace.svc.cluster.local`)に対するA(AAAA)レコードのみ作成します。 {{< /note >}} +### PodのsetHostnameAsFQDNフィールド + +{{< feature-state for_k8s_version="v1.19" state="alpha" >}} + +**前提条件**: {{< glossary_tooltip text="API Server" term_id="kube-apiserver" >}}に対して`SetHostnameAsFQDN`[フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)を有効にする必要があります。 + +Podが完全修飾ドメイン名(FQDN)を持つように構成されている場合、そのホスト名は短いホスト名です。 +例えば、FQDNが`busybox-1.default-subdomain.my-namespace.svc.cluster-domain.example`のPodがある場合、 +デフォルトではそのPod内の`hostname`コマンドは`busybox-1`を返し、`hostname --fqdn`コマンドはFQDNを返します。 + +Podのspecで`setHostnameAsFQDN: true`を設定した場合、そのPodの名前空間に対してkubeletはPodのFQDNをホスト名に書き込みます。 +この場合、`hostname`と`hostname --fqdn`の両方がPodのFQDNを返します。 + +{{< note >}} +Linuxでは、カーネルのホスト名のフィールド(`struct utsname`の`nodename`フィールド)は64文字に制限されています。 + +Podがこの機能を有効にしていて、そのFQDNが64文字より長い場合、Podは起動に失敗します。 +Podは`Pending`ステータス(`kubectl`でみられる`ContainerCreating`)のままになり、「Podのホスト名とクラスタードメインからFQDNを作成できなかった」や、「FQDN`long-FQDN`が長すぎる(64文字が最大, 70文字が要求された)」などのエラーイベントが生成されます。 + +このシナリオのユーザー体験を向上させる1つの方法は、[admission webhook controller](/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks)を作成して、ユーザーがDeploymentなどのトップレベルのオブジェクトを作成するときにFQDNのサイズを制御することです。 +{{< /note >}} + + ### PodのDNSポリシー DNSポリシーはPod毎に設定できます。現在のKubernetesでは次のようなPod固有のDNSポリシーをサポートしています。これらのポリシーはPod Specの`dnsPolicy`フィールドで指定されます。 From 7cde096625d0f9eecf1318858b390ce079aaeac2 Mon Sep 17 00:00:00 2001 From: Takaaki Fujii Date: Sun, 21 Mar 2021 16:45:47 +0900 Subject: [PATCH 029/221] update container-lifecycle-hooks in ja --- .../containers/container-lifecycle-hooks.md | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/content/ja/docs/concepts/containers/container-lifecycle-hooks.md b/content/ja/docs/concepts/containers/container-lifecycle-hooks.md index ba94bd6fab..878eb7ec89 100644 --- a/content/ja/docs/concepts/containers/container-lifecycle-hooks.md +++ b/content/ja/docs/concepts/containers/container-lifecycle-hooks.md @@ -30,11 +30,11 @@ Angularなどのコンポーネントライフサイクルフックを持つ多 `PreStop` -このフックは、liveness probeの失敗、プリエンプション、リソース競合などのAPI要求または管理イベントが原因でコンテナが終了する直前に呼び出されます。コンテナがすでに終了状態または完了状態にある場合、preStopフックの呼び出しは失敗します。 -これはブロッキング、つまり同期的であるため、コンテナを削除するための呼び出しを送信する前に完了する必要があります。 +このフックは、APIからの要求、またはliveness probeの失敗、プリエンプション、リソース競合などの管理イベントが原因でコンテナが終了する直前に呼び出されます。コンテナがすでに終了状態または完了状態にある場合、preStopフックの呼び出しは失敗します。 +これはブロッキング、つまり同期的であるため、コンテナを停止する信号が送信される前に完了する必要があります。 ハンドラーにパラメーターは渡されません。 -終了動作の詳細な説明は、[Termination of Pods](/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination)にあります。 +終了動作の詳細な説明は、[Termination of Pods](/ja/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination)にあります。 ### フックハンドラーの実装 @@ -47,27 +47,32 @@ Angularなどのコンポーネントライフサイクルフックを持つ多 ### フックハンドラーの実行 -コンテナライフサイクル管理フックが呼び出されると、Kubernetes管理システムはそのフック用に登録されたコンテナ内のハンドラーを実行します。 +コンテナライフサイクル管理フックが呼び出されると、Kubernetes管理システムはフックアクションにしたがってハンドラーを実行します。 +`exec`と`tcpSocket`はコンテナの中で実行され、`httpGet`はkubeletプロセスによって実行されます。 フックハンドラーの呼び出しは、コンテナを含むPodのコンテキスト内で同期しています。 これは、`PostStart`フックの場合、コンテナのENTRYPOINTとフックは非同期に起動することを意味します。 しかし、フックの実行に時間がかかりすぎたりハングしたりすると、コンテナは`running`状態になることができません。 -その振る舞いは `PreStop`フックに似ています。 -実行中にフックがハングした場合、Podフェーズは`Terminating`状態に留まり、Podの`terminationGracePeriodSeconds`が終了した後に終了します。 -`PostStart`または`PreStop`フックが失敗した場合、コンテナを強制終了します。 +`PreStop`フックはコンテナを停止する信号から非同期で実行されるのではなく、信号が送られる前に実行を完了する必要があります。 +もし`PreStop`フックが実行中にハングした場合、Podは`Terminating`状態にになり、 +`terminationGracePeriodSeconds`の時間切れで強制終了されるまで続きます。 +この猶予時間は、`PreStop`フックが実行され正常にコンテナを停止できるまでの合計時間に適用されます。 +例えば`terminationGracePeriodSeconds`が60で、フックの終了に55秒かかり、シグナルを受信した後にコンテナを正常に停止させるのに10秒かかる場合、コンテナは正常に停止する前に終了されてしまいます。`terminationGracePeriodSeconds`が、これら2つの実行にかかる合計時間(55+10)よりも短いからです。 + +`PostStart`または`PreStop`フックが失敗した場合、コンテナは強制終了します。 ユーザーはフックハンドラーをできるだけ軽量にするべきです。 -ただし、コンテナを停止する前に状態を保存する場合など、長時間実行されるコマンドが意味をなす場合があります。 +ただし、コンテナを停止する前に状態を保存するなどの場合は、長時間のコマンド実行が必要なケースもあります。 -### フック配送保証 +### フック配信保証 -フックの配送は *少なくとも1回* を意図しています。これはフックが`PostStart`や`PreStop`のような任意のイベントに対して複数回呼ばれることがあることを意味します。 +フックの配信は *少なくとも1回* を意図しています。これはフックが`PostStart`や`PreStop`のような任意のイベントに対して複数回呼ばれることがあることを意味します。 これを正しく処理するのはフックの実装次第です。 -通常、単一の配送のみが行われます。 +通常、1回の配信のみが行われます。 たとえば、HTTPフックレシーバーがダウンしていてトラフィックを受け取れない場合、再送信は試みられません。 -ただし、まれに二重配送が発生することがあります。 +ただし、まれに二重配信が発生することがあります。 たとえば、フックの送信中にkubeletが再起動した場合、kubeletが起動した後にフックが再送信される可能性があります。 ### フックハンドラーのデバッグ From e4041be5917e8461ba8a82b14ec4b4331077bfc9 Mon Sep 17 00:00:00 2001 From: RA489 Date: Tue, 23 Mar 2021 11:05:10 +0530 Subject: [PATCH 030/221] Update setup guide --- content/ru/docs/setup/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ru/docs/setup/_index.md b/content/ru/docs/setup/_index.md index 17b6efd198..69428da89c 100644 --- a/content/ru/docs/setup/_index.md +++ b/content/ru/docs/setup/_index.md @@ -29,7 +29,7 @@ content_type: concept * Пробуете или начинаете работу с Kubernetes * Локально разрабатываете и тестируете кластер -Выбрать [решение для запуска на локальной машине](/docs/setup/pick-right-solution/#local-machine-solutions). +Выбрать [решение для запуска на локальной машине](/docs/setup/learning-environment/). ## Управляемые решения From 414584ba0ca50676c1f81e0ebb0c83f6d4f00739 Mon Sep 17 00:00:00 2001 From: KobayashiD27 Date: Tue, 23 Mar 2021 18:06:25 +0900 Subject: [PATCH 031/221] ja: Make docs/concepts/extend-kubernetes/_index.md follow v1.19 of the original text --- content/ja/docs/concepts/extend-kubernetes/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/extend-kubernetes/_index.md b/content/ja/docs/concepts/extend-kubernetes/_index.md index e1b30a8ae8..07cf8b2af2 100644 --- a/content/ja/docs/concepts/extend-kubernetes/_index.md +++ b/content/ja/docs/concepts/extend-kubernetes/_index.md @@ -105,7 +105,7 @@ Webhookのモデルでは、Kubernetesは外部のサービスを呼び出しま ### APIアクセス拡張 {#api-access-extensions} -リクエストがKubernetes APIサーバーに到達すると、まず最初に認証が行われ、次に認可、その後、様々なAdmission Controlの対象になります。このフローの詳細は[Kubernetes APIへのアクセスをコントロールする](/docs/reference/access-authn-authz/controlling-access/)を参照して下さい。 +リクエストがKubernetes APIサーバーに到達すると、まず最初に認証が行われ、次に認可、その後、様々なAdmission Controlの対象になります。このフローの詳細は[Kubernetes APIへのアクセスをコントロールする](/docs/concepts/security/controlling-access/)を参照して下さい。 これらの各ステップごとに拡張ポイントが用意されています。 From d419e162ad2151116505986d2a28f5857408d46f Mon Sep 17 00:00:00 2001 From: KobayashiD27 Date: Wed, 24 Mar 2021 10:10:26 +0900 Subject: [PATCH 032/221] ja: Make docs/concepts/extend-kubernetes/api-extension/custom-resources.md follow v1.19 of the original text --- .../extend-kubernetes/api-extension/custom-resources.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3616f568c1..0e1fecb795 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 @@ -14,7 +14,7 @@ weight: 10 ## カスタムリソース -*リソース* は、[Kubernetes API](/docs/reference/using-api/api-overview/)のエンドポイントで、特定の[APIオブジェクト](/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/)のコレクションを保持します。例えば、ビルトインの *Pods* リソースは、Podオブジェクトのコレクションを包含しています。 +*リソース* は、[Kubernetes API](/docs/concepts/overview/kubernetes-api/)のエンドポイントで、特定の[APIオブジェクト](/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/)のコレクションを保持します。例えば、ビルトインの *Pods* リソースは、Podオブジェクトのコレクションを包含しています。 *カスタムリソース* は、Kubernetes APIの拡張で、デフォルトのKubernetesインストールでは、必ずしも利用できるとは限りません。つまりそれは、特定のKubernetesインストールのカスタマイズを表します。しかし、今現在、多数のKubernetesのコア機能は、カスタムリソースを用いて作られており、Kubernetesをモジュール化しています。 From 24eba8b613a1a0e4ce560470266951e35e59bdd3 Mon Sep 17 00:00:00 2001 From: Kobayashi Daisuke Date: Wed, 24 Mar 2021 10:30:48 +0900 Subject: [PATCH 033/221] Update content/ja/docs/concepts/extend-kubernetes/api-extension/custom-resources.md Co-authored-by: makocchi --- .../extend-kubernetes/api-extension/custom-resources.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 0e1fecb795..85c1c4a77f 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 @@ -14,7 +14,7 @@ weight: 10 ## カスタムリソース -*リソース* は、[Kubernetes API](/docs/concepts/overview/kubernetes-api/)のエンドポイントで、特定の[APIオブジェクト](/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/)のコレクションを保持します。例えば、ビルトインの *Pods* リソースは、Podオブジェクトのコレクションを包含しています。 +*リソース* は、[Kubernetes API](/ja/docs/concepts/overview/kubernetes-api/)のエンドポイントで、特定の[APIオブジェクト](/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/)のコレクションを保持します。例えば、ビルトインの *Pods* リソースは、Podオブジェクトのコレクションを包含しています。 *カスタムリソース* は、Kubernetes APIの拡張で、デフォルトのKubernetesインストールでは、必ずしも利用できるとは限りません。つまりそれは、特定のKubernetesインストールのカスタマイズを表します。しかし、今現在、多数のKubernetesのコア機能は、カスタムリソースを用いて作られており、Kubernetesをモジュール化しています。 From 645a98218b823a382104512591236210c974b145 Mon Sep 17 00:00:00 2001 From: Himanshu Date: Sat, 27 Mar 2021 23:20:40 +0530 Subject: [PATCH 034/221] updated_text --- content/ja/docs/concepts/workloads/controllers/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/workloads/controllers/_index.md b/content/ja/docs/concepts/workloads/controllers/_index.md index 65c91d6280..3ac3522f23 100644 --- a/content/ja/docs/concepts/workloads/controllers/_index.md +++ b/content/ja/docs/concepts/workloads/controllers/_index.md @@ -1,4 +1,4 @@ --- -title: "コントローラー" +title: "Workload Resources" weight: 20 --- From 55d9b9d1ab1046fad6fbf3f4a691cc2ada27a8b8 Mon Sep 17 00:00:00 2001 From: arisgi Date: Sun, 28 Mar 2021 22:09:52 +0900 Subject: [PATCH 035/221] ja: Make docs/concepts/configuration/manage-resources-containers.md follow v1.19 of the original text --- .../concepts/configuration/manage-resources-containers.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/configuration/manage-resources-containers.md b/content/ja/docs/concepts/configuration/manage-resources-containers.md index 761999d937..bb2ccb7c20 100644 --- a/content/ja/docs/concepts/configuration/manage-resources-containers.md +++ b/content/ja/docs/concepts/configuration/manage-resources-containers.md @@ -29,6 +29,10 @@ Podが動作しているNodeに利用可能なリソースが十分にある場 制限は、違反が検出されるとシステムが介入するように事後的に、またはコンテナーが制限を超えないようにシステムが防ぐように強制的に、実装できます。 異なるランタイムは、同じ制限を実装するために異なる方法をとることができます。 +{{< note >}} +コンテナが自身のメモリー制限を指定しているが、メモリー要求を指定していない場合、Kubernetesは制限に一致するメモリー要求を自動的に割り当てます。同様に、コンテナが自身のCPU制限を指定しているが、CPU要求を指定していない場合、Kubernetesは制限に一致するCPU要求を自動的に割り当てます。 +{{< /note >}} + ## リソースタイプ *CPU*と*メモリー*はいずれも*リソースタイプ*です。リソースタイプには基本単位があります。 @@ -106,7 +110,6 @@ spec: containers: - name: app image: images.my-company.example/app:v4 - env: resources: requests: memory: "64Mi" From 50d19e7d30465f3a83c84a4873b57c7e18214ab6 Mon Sep 17 00:00:00 2001 From: JIIOryo Date: Tue, 30 Mar 2021 07:56:04 +0900 Subject: [PATCH 036/221] Update: ja/docs/concepts/scheduling-eviction/taint-and-toleration.md --- .../scheduling-eviction/taint-and-toleration.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/content/ja/docs/concepts/scheduling-eviction/taint-and-toleration.md b/content/ja/docs/concepts/scheduling-eviction/taint-and-toleration.md index ba9d37d2ea..e24b960924 100644 --- a/content/ja/docs/concepts/scheduling-eviction/taint-and-toleration.md +++ b/content/ja/docs/concepts/scheduling-eviction/taint-and-toleration.md @@ -22,30 +22,30 @@ Nodeにtaintを付与するには[kubectl taint](/docs/reference/generated/kubec 例えば、次のコマンドは ```shell -kubectl taint nodes node1 key=value:NoSchedule +kubectl taint nodes node1 key1=value1:NoSchedule ``` -`node1`にtaintを設定します。このtaintのキーは`key`、値は`value`、taintの効果は`NoSchedule`です。 +`node1`にtaintを設定します。このtaintのキーは`key1`、値は`value1`、taintの効果は`NoSchedule`です。 これは`node1`にはPodに合致するtolerationがなければスケジューリングされないことを意味します。 上記のコマンドで付与したtaintを外すには、下記のコマンドを使います。 ```shell -kubectl taint nodes node1 key:NoSchedule- +kubectl taint nodes node1 key1=value1:NoSchedule- ``` PodのtolerationはPodSpecの中に指定します。下記のtolerationはどちらも、上記の`kubectl taint`コマンドで追加したtaintと合致するため、どちらのtolerationが設定されたPodも`node1`へスケジューリングされることができます。 ```yaml tolerations: -- key: "key" +- key: "key1" operator: "Equal" - value: "value" + value: "value1" effect: "NoSchedule" ``` ```yaml tolerations: -- key: "key" +- key: "key1" operator: "Exists" effect: "NoSchedule" ``` @@ -67,7 +67,7 @@ tolerationがtaintと合致するのは、`key`と`effect`が同一であり、 空の`key`と演算子`Exists`は全ての`key`、`value`、`effect`と一致するため、すべてのtaintと合致します。 -空の`effect`は`key`が一致する全てのeffectと合致します。 +空の`effect`は`key1`が一致する全てのeffectと合致します。 {{< /note >}} From 7ffeac6a58015a983385f7868a6450b848a76a9e Mon Sep 17 00:00:00 2001 From: rkgy Date: Tue, 30 Mar 2021 08:52:14 +0900 Subject: [PATCH 037/221] modify: content/ja/docs/concepts/overview/working-with-objects/namespaces.md --- .../docs/concepts/overview/working-with-objects/namespaces.md | 2 -- 1 file changed, 2 deletions(-) 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 f9ebbabffd..dcf56c7959 100644 --- a/content/ja/docs/concepts/overview/working-with-objects/namespaces.md +++ b/content/ja/docs/concepts/overview/working-with-objects/namespaces.md @@ -24,8 +24,6 @@ Namespaceは名前空間のスコープを提供します。リソース名は Namespaceは、複数のユーザーの間でクラスターリソースを分割する方法です。(これは[リソースクォータ](/docs/concepts/policy/resource-quotas/)を介して分割します。) -Kubernetesの将来的なバージョンにおいて、同一のNamespace内のオブジェクトは、デフォルトで同一のアクセスコントロールポリシーが適用されます。 - 同じアプリケーションの異なるバージョンなど、少し違うリソースをただ分割するだけに、複数のNamespaceを使う必要はありません。 同一のNamespace内でリソースを区別するためには[ラベル](/ja/docs/concepts/overview/working-with-objects/labels/)を使用してください。 From 6da498d1962aa48833b4cede8e55c0ce8149497e Mon Sep 17 00:00:00 2001 From: huangshanhui <1137852140@qq.com> Date: Tue, 30 Mar 2021 10:53:44 +0800 Subject: [PATCH 038/221] Update pod-security-policy.md fix the translation of "PodSecurityPolicies which allow the pod as-is, without changing defaults or mutating the pod, are preferred" --- content/zh/docs/concepts/policy/pod-security-policy.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/zh/docs/concepts/policy/pod-security-policy.md b/content/zh/docs/concepts/policy/pod-security-policy.md index 9ea3577de8..d05d967db1 100644 --- a/content/zh/docs/concepts/policy/pod-security-policy.md +++ b/content/zh/docs/concepts/policy/pod-security-policy.md @@ -316,8 +316,7 @@ controller selects policies according to the following criteria: 2. If the pod must be defaulted or mutated, the first PodSecurityPolicy (ordered by name) to allow the pod is selected. --> -1. 优先考虑中允许 Pod 不经修改地创建或更新的 PodSecurityPolicy,这些策略 - 不会更改 Pod 字段的默认值或者其他配置。 +1. 优先考虑允许pod保持原样,不会更改Pod字段的默认值或其他配置的PodSecurityPolicy。 这类非更改性质的 PodSecurityPolicy 对象之间的顺序无关紧要。 2. 如果必须要为 Pod 设置默认值或者其他配置,(按名称顺序)选择第一个允许 Pod 操作的 PodSecurityPolicy 对象。 From 1e64fb0a484bba5c2f04c6b212ecb22c6b70f91b Mon Sep 17 00:00:00 2001 From: huangshanhui <1137852140@qq.com> Date: Tue, 30 Mar 2021 11:10:29 +0800 Subject: [PATCH 039/221] Update content/zh/docs/concepts/policy/pod-security-policy.md Co-authored-by: Qiming Teng --- content/zh/docs/concepts/policy/pod-security-policy.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/zh/docs/concepts/policy/pod-security-policy.md b/content/zh/docs/concepts/policy/pod-security-policy.md index d05d967db1..111aef303d 100644 --- a/content/zh/docs/concepts/policy/pod-security-policy.md +++ b/content/zh/docs/concepts/policy/pod-security-policy.md @@ -316,7 +316,7 @@ controller selects policies according to the following criteria: 2. If the pod must be defaulted or mutated, the first PodSecurityPolicy (ordered by name) to allow the pod is selected. --> -1. 优先考虑允许pod保持原样,不会更改Pod字段的默认值或其他配置的PodSecurityPolicy。 +1. 优先考虑允许 Pod 保持原样,不会更改 Pod 字段默认值或其他配置的 PodSecurityPolicy。 这类非更改性质的 PodSecurityPolicy 对象之间的顺序无关紧要。 2. 如果必须要为 Pod 设置默认值或者其他配置,(按名称顺序)选择第一个允许 Pod 操作的 PodSecurityPolicy 对象。 @@ -1232,4 +1232,3 @@ By default, all safe sysctls are allowed. - 参阅[Pod 安全标准](/zh/docs/concepts/security/pod-security-standards/) 了解策略建议。 - 阅读 [Pod 安全策略参考](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podsecuritypolicy-v1beta1-policy)了解 API 细节。 - From 2e75edcfdc25ceeb1eff26c11cff5d7a5407491a Mon Sep 17 00:00:00 2001 From: s-ito-ts Date: Tue, 30 Mar 2021 08:03:29 +0000 Subject: [PATCH 040/221] Fixed broken links in ja/docs/tutorials/stateful-application/basic-stateful-set.md --- .../stateful-application/basic-stateful-set.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/content/ja/docs/tutorials/stateful-application/basic-stateful-set.md b/content/ja/docs/tutorials/stateful-application/basic-stateful-set.md index d8a0acbdf6..e7de7cea05 100644 --- a/content/ja/docs/tutorials/stateful-application/basic-stateful-set.md +++ b/content/ja/docs/tutorials/stateful-application/basic-stateful-set.md @@ -45,13 +45,13 @@ StatefulSetはステートフルアプリケーションや分散システムで 上の例をダウンロードして、`web.yaml`という名前で保存します。 -ここでは、ターミナルウィンドウを2つ使う必要があります。1つ目のターミナルでは、[`kubectl get`](/ja/docs/reference/generated/kubectl/kubectl-commands/#get)を使って、StatefulSetのPodの作成を監視します。 +ここでは、ターミナルウィンドウを2つ使う必要があります。1つ目のターミナルでは、[`kubectl get`](/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を作成します。 +2つ目のターミナルでは、[`kubectl apply`](/docs/reference/generated/kubectl/kubectl-commands/#apply)を使って、`web.yaml`に定義されたheadless ServiceとStatefulSetを作成します。 ```shell kubectl apply -f web.yaml @@ -120,7 +120,7 @@ web-1 1/1 Running 0 1m ### 安定したネットワーク識別子の使用 -各Podは、順序インデックスに基づいた安定したホスト名を持ちます。[`kubectl exec`](/ja/docs/reference/generated/kubectl/kubectl-commands/#exec)を使用して、各Pod内で`hostname`コマンドを実行してみましょう。 +各Podは、順序インデックスに基づいた安定したホスト名を持ちます。[`kubectl exec`](/docs/reference/generated/kubectl/kubectl-commands/#exec)を使用して、各Pod内で`hostname`コマンドを実行してみましょう。 ```shell for i in 0 1; do kubectl exec "web-$i" -- sh -c 'hostname'; done @@ -130,7 +130,7 @@ web-0 web-1 ``` -[`kubectl run`](/ja/docs/reference/generated/kubectl/kubectl-commands/#run)を使用して、`dnsutils`パッケージの`nslookup`コマンドを提供するコンテナを実行します。Podのホスト名に対して`nslookup`を実行すると、クラスター内のDNSアドレスが確認できます。 +[`kubectl run`](/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 @@ -165,7 +165,7 @@ headless serviceのCNAMEは、SRVレコードを指しています(1つのレコ ```shell kubectl get pod -w -l app=nginx ``` -2つ目のターミナルで、[`kubectl delete`](/ja/docs/reference/generated/kubectl/kubectl-commands/#delete)を使用して、StatefulSetのすべてのPodを削除します。 +2つ目のターミナルで、[`kubectl delete`](/docs/reference/generated/kubectl/kubectl-commands/#delete)を使用して、StatefulSetのすべてのPodを削除します。 ```shell kubectl delete pod -l app=nginx @@ -316,8 +316,8 @@ web-1 ## StatefulSetをスケールする -StatefulSetのスケールとは、レプリカ数を増減することを意味します。これは、`replicas`フィールドを更新することによって実現できます。StatefulSetのスケールには、[`kubectl scale`](/ja/docs/reference/generated/kubectl/kubectl-commands/#scale)と -[`kubectl patch`](/ja/docs/reference/generated/kubectl/kubectl-commands/#patch)のどちらも使用できます。 +StatefulSetのスケールとは、レプリカ数を増減することを意味します。これは、`replicas`フィールドを更新することによって実現できます。StatefulSetのスケールには、[`kubectl scale`](/docs/reference/generated/kubectl/kubectl-commands/#scale)と +[`kubectl patch`](/docs/reference/generated/kubectl/kubectl-commands/#patch)のどちらも使用できます。 ### スケールアップ @@ -711,7 +711,7 @@ StatefulSetは、非カスケードな削除とカスケードな削除の両方 kubectl get pods -w -l app=nginx ``` -[`kubectl delete`](/ja/docs/reference/generated/kubectl/kubectl-commands/#delete)を使用して、StatefulSetを削除します。このとき、`--cascade=false`パラメーターをコマンドに与えてください。このパラメーターは、Kubernetesに対して、StatefulSetだけを削除して配下のPodは削除しないように指示します。 +[`kubectl delete`](/docs/reference/generated/kubectl/kubectl-commands/#delete)を使用して、StatefulSetを削除します。このとき、`--cascade=false`パラメーターをコマンドに与えてください。このパラメーターは、Kubernetesに対して、StatefulSetだけを削除して配下のPodは削除しないように指示します。 ```shell kubectl delete statefulset web --cascade=false From 8a5f21633d08c05c45678a4944c6c78875861110 Mon Sep 17 00:00:00 2001 From: Soichiro KAWAMURA Date: Fri, 26 Mar 2021 00:00:02 +0900 Subject: [PATCH 041/221] ingress.md follows v1.19 --- .../concepts/services-networking/ingress.md | 334 +++++++++--------- .../service/networking/external-lb.yaml | 10 + .../networking/ingress-resource-backend.yaml | 20 ++ .../networking/ingress-wildcard-host.yaml | 26 ++ .../service/networking/minimal-ingress.yaml | 17 + ...me-virtual-host-ingress-no-third-host.yaml | 35 ++ .../networking/name-virtual-host-ingress.yaml | 26 ++ .../networking/simple-fanout-example.yaml | 23 ++ .../service/networking/test-ingress.yaml | 10 + .../networking/tls-example-ingress.yaml | 20 ++ 10 files changed, 356 insertions(+), 165 deletions(-) create mode 100644 content/ja/examples/service/networking/external-lb.yaml create mode 100644 content/ja/examples/service/networking/ingress-resource-backend.yaml create mode 100644 content/ja/examples/service/networking/ingress-wildcard-host.yaml create mode 100644 content/ja/examples/service/networking/minimal-ingress.yaml create mode 100644 content/ja/examples/service/networking/name-virtual-host-ingress-no-third-host.yaml create mode 100644 content/ja/examples/service/networking/name-virtual-host-ingress.yaml create mode 100644 content/ja/examples/service/networking/simple-fanout-example.yaml create mode 100644 content/ja/examples/service/networking/test-ingress.yaml create mode 100644 content/ja/examples/service/networking/tls-example-ingress.yaml diff --git a/content/ja/docs/concepts/services-networking/ingress.md b/content/ja/docs/concepts/services-networking/ingress.md index 76bb234f7e..a3b0f66b48 100644 --- a/content/ja/docs/concepts/services-networking/ingress.md +++ b/content/ja/docs/concepts/services-networking/ingress.md @@ -5,7 +5,7 @@ weight: 40 --- -{{< feature-state for_k8s_version="v1.1" state="beta" >}} +{{< feature-state for_k8s_version="v1.19" state="stable" >}} {{< glossary_definition term_id="ingress" length="all" >}} @@ -23,15 +23,26 @@ weight: 40 ## Ingressとは何か -[Ingress](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#ingress-v1beta1-networking-k8s-io)はクラスター外からクラスター内{{< link text="Service" url="/ja/docs/concepts/services-networking/service/" >}}へのHTTPとHTTPSのルートを公開します。トラフィックのルーティングはIngressリソース上で定義されるルールによって制御されます。 +[Ingress](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#ingress-v1-networking-k8s-io)はクラスター外からクラスター内{{< link text="Service" url="/ja/docs/concepts/services-networking/service/" >}}へのHTTPとHTTPSのルートを公開します。トラフィックのルーティングはIngressリソース上で定義されるルールによって制御されます。 -```none - internet - | - [ Ingress ] - --|-----|-- - [ Services ] -``` +全てのトラフィックを単一のServiceに送る単純なIngressの例を示します。 + +{{< mermaid >}} +graph LR; + client([クライアント])-. Ingress管理下の
ロードバランサー .->ingress[Ingress]; + ingress-->|ルーティングルール|service[Service]; + subgraph cluster[クラスター] + ingress; + service-->pod1[Pod]; + service-->pod2[Pod]; + end + classDef plain fill:#ddd,stroke:#fff,stroke-width:4px,color:#000; + classDef k8s fill:#326ce5,stroke:#fff,stroke-width:4px,color:#fff; + classDef cluster fill:#fff,stroke:#bbb,stroke-width:2px,color:#326ce5; + class ingress,service,pod1,pod2 k8s; + class client plain; + class cluster cluster; +{{}} IngressはServiceに対して、外部疎通できるURL、負荷分散トラフィック、SSL/TLS終端の機能や、名前ベースの仮想ホスティングを提供するように設定できます。[Ingressコントローラー](/ja/docs/concepts/services-networking/ingress-controllers)は通常はロードバランサーを使用してIngressの機能を実現しますが、エッジルーターや、追加のフロントエンドを構成してトラフィックの処理を支援することもできます。 @@ -53,23 +64,7 @@ Ingressコントローラーのドキュメントを確認して、選択する Ingressリソースの最小構成の例は以下のとおりです。 -```yaml -apiVersion: networking.k8s.io/v1beta1 -kind: Ingress -metadata: - name: test-ingress - annotations: - nginx.ingress.kubernetes.io/rewrite-target: / -spec: - rules: - - http: - paths: - - path: /testpath - pathType: Prefix - backend: - serviceName: test - servicePort: 80 -``` +{{< codenew file="service/networking/minimal-ingress.yaml" >}} 他の全てのKubernetesリソースと同様に、Ingressには`apiVersion`、`kind`や`metadata`フィールドが必要です。Ingressオブジェクトの名前は、有効な[DNSサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)である必要があります。設定ファイルに関する一般的な情報は、[アプリケーションのデプロイ](/ja/docs/tasks/run-application/run-stateless-application-deployment/)、[コンテナの設定](/docs/tasks/configure-pod-container/configure-pod-configmap/)、[リソースの管理](/docs/concepts/cluster-administration/manage-deployment/)を参照してください。Ingressでは、Ingressコントローラーに依存しているいくつかのオプションの設定をするためにアノテーションを一般的に使用します。例としては、[rewrite-targetアノテーション](https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/rewrite/README.md)などがあります。[Ingressコントローラー](/ja/docs/concepts/services-networking/ingress-controllers)の種類が異なれば、サポートするアノテーションも異なります。サポートされているアノテーションについて学ぶためには、使用するIngressコントローラーのドキュメントを確認してください。 @@ -81,51 +76,105 @@ Ingress [Spec](https://git.k8s.io/community/contributors/devel/sig-architecture/ * オプションで設定可能なホスト名。上記のリソースの例では、ホスト名が指定されていないと、そのルールは指定されたIPアドレスを経由する全てのインバウンドHTTPトラフィックに適用されます。ホスト名が指定されていると(例: foo.bar.com)、そのルールはホストに対して適用されます。 * パスのリスト(例: `/testpath`)。各パスには`serviceName`と`servicePort`で定義されるバックエンドが関連づけられます。ロードバランサーがトラフィックを関連づけられたServiceに転送するために、外部からくるリクエストのホスト名とパスが条件と一致させる必要があります。 -* [Serviceドキュメント](/ja/docs/concepts/services-networking/service/)に書かれているように、バックエンドはServiceとポート名の組み合わせとなります。Ingressで設定されたホスト名とパスのルールに一致するHTTP(とHTTPS)のリクエストは、リスト内のバックエンドに対して送信されます。 +* [Serviceドキュメント](/ja/docs/concepts/services-networking/service/)または{{< glossary_tooltip term_id="CustomResourceDefinition" text="CRD" >}}による[カスタムリソースバックエンド](#resource-backend)に書かれているように、バックエンドはServiceとポート名の組み合わせとなります。Ingressで設定されたホスト名とパスのルールに一致するHTTP(とHTTPS)のリクエストは、リスト内のバックエンドに対して送信されます。 -Ingressコントローラーでは、デフォルトのバックエンドが設定されていることがあります。これはSpec内で指定されているパスに一致しないようなリクエストのためのバックエンドです。 +Ingressコントローラーでは、`defaultBackend`が設定されていることがあります。これはSpec内で指定されているパスに一致しないようなリクエストのためのバックエンドです。 -### デフォルトのバックエンド +### デフォルトのバックエンド {#default-backend} -ルールが設定されていないIngressは、全てのトラフィックをデフォルトのバックエンドに転送します。このデフォルトのバックエンドは、[Ingressコントローラー](/ja/docs/concepts/services-networking/ingress-controllers)のオプション設定であり、Ingressリソースでは指定されていません。 +ルールが設定されていないIngressは、全てのトラフィックをデフォルトのバックエンドに転送します。`defaultBackend`は、[Ingressコントローラー](/ja/docs/concepts/services-networking/ingress-controllers)のオプション設定であり、Ingressリソースでは指定されていません。 -IngressオブジェクトでHTTPリクエストが1つもホスト名とパスの条件に一致しない時、そのトラフィックはデフォルトのバックエンドに転送されます。 +HTTPリクエストがIngressオブジェクトのホスト名とパスの条件に1つも一致しない時、そのトラフィックはデフォルトのバックエンドに転送されます。 + +### リソースバックエンド {#resource-backend} + +`Resource`バックエンドはIngressオブジェクトと同じnamespaceにある他のKubernetesリソースを指すObjectRefです。 +`Resource`はServiceの設定とは排他であるため、両方を指定するとバリデーションに失敗します。 +`Resource`バックエンドのよくある用途は、静的なアセットが入ったオブジェクトストレージを設定することです。 + +{{< codenew file="service/networking/ingress-resource-backend.yaml" >}} + +上記のIngressを作成した後に、次のコマンドで参照することができます。 + +```bash +kubectl describe ingress ingress-resource-backend +``` + +``` +Name: ingress-resource-backend +Namespace: default +Address: +Default backend: APIGroup: k8s.example.com, Kind: StorageBucket, Name: static-assets +Rules: + Host Path Backends + ---- ---- -------- + * + /icons APIGroup: k8s.example.com, Kind: StorageBucket, Name: icon-assets +Annotations: +Events: +``` ### パスのタイプ -Ingressのそれぞれのパスは対応するパスのタイプを持ちます。サポートされているパスのタイプは3種類あります。 +Ingressのそれぞれのパスは対応するパスのタイプを持ちます。`pathType`が明示的に指定されていないパスはバリデーションに通らないでしょう。サポートされているパスのタイプは3種類あります。 -* _`ImplementationSpecific`_ (デフォルト): このパスタイプでは、パスとの一致はIngressClassに依存します。Ingressの実装はこれを独立した`pathType`と扱うことも、`Prefix`や`Exact`と同一のパスタイプと扱うこともできます。 +* `ImplementationSpecific`: このパスタイプでは、パスとの一致はIngressClassに依存します。Ingressの実装はこれを独立した`pathType`と扱うことも、`Prefix`や`Exact`と同一のパスタイプと扱うこともできます。 -* _`Exact`_: 大文字小文字を区別して完全に一致するURLパスと一致します。 +* `Exact`: 大文字小文字を区別して完全に一致するURLパスと一致します。 -* _`Prefix`_: `/`で分割されたURLと前方一致で一致します。大文字小文字は区別され、パスの要素対要素で比較されます。パス要素は`/`で分割されたパスの中のラベルのリストを参照します。リクエストがパス _p_ に一致するのは、Ingressのパス _p_ がリクエストパス _p_ と要素単位で前方一致する場合です。 +* `Prefix`: `/`で分割されたURLと前方一致で一致します。大文字小文字は区別され、パスの要素対要素で比較されます。パス要素は`/`で分割されたパスの中のラベルのリストを参照します。リクエストがパス _p_ に一致するのは、Ingressのパス _p_ がリクエストパス _p_ と要素単位で前方一致する場合です。 {{< note >}} パスの最後の要素がリクエストパスの最後の要素の部分文字列である場合、これは一致しません(例えば、`/foo/bar`は`/foo/bar/baz`と一致しますが、`/foo/barbaz`とは一致しません)。 {{< /note >}} +### 例 + +| タイプ | パス | リクエストパス | 一致するか | +|--------|---------------------------------|-------------------------------|--------------------------------------| +| Prefix | `/` | (全てのパス) | はい | +| Exact | `/foo` | `/foo` | はい | +| Exact | `/foo` | `/bar` | いいえ | +| Exact | `/foo` | `/foo/` | いいえ | +| Exact | `/foo/` | `/foo` | いいえ | +| Prefix | `/foo` | `/foo`, `/foo/` | はい | +| Prefix | `/foo/` | `/foo`, `/foo/` | はい | +| Prefix | `/aaa/bb` | `/aaa/bbb` | いいえ | +| Prefix | `/aaa/bbb` | `/aaa/bbb` | はい | +| Prefix | `/aaa/bbb/` | `/aaa/bbb` | はい、末尾のスラッシュは無視 | +| Prefix | `/aaa/bbb` | `/aaa/bbb/` | はい、末尾のスラッシュと一致 | +| Prefix | `/aaa/bbb` | `/aaa/bbb/ccc` | はい、パスの一部と一致 | +| Prefix | `/aaa/bbb` | `/aaa/bbbxyz` | いいえ、接頭辞と一致しない | +| Prefix | `/`, `/aaa` | `/aaa/ccc` | はい、接頭辞`/aaa`と一致 | +| Prefix | `/`, `/aaa`, `/aaa/bbb` | `/aaa/bbb` | はい、接頭辞`/aaa/bbb`と一致 | +| Prefix | `/`, `/aaa`, `/aaa/bbb` | `/ccc` | はい、接頭辞`/`と一致 | +| Prefix | `/aaa` | `/ccc` | いいえ、デフォルトバックエンドを使用 | +| Mixed | `/foo` (Prefix), `/foo` (Exact) | `/foo` | はい、Exactが優先 | + #### 複数のパスとの一致 リクエストがIngressの複数のパスと一致することがあります。そのような場合は、最も長くパスが一致したものが優先されます。2つのパスが同等に一致した場合は、完全一致が前方一致よりも優先されます。 +## ホスト名のワイルドカード + +ホストは正確に一致する(例えば`foo.bar.com`)かワイルドカード(例えば`*.foo.com`)とすることができます。 +正確な一致ではHTTPヘッダーの`host`が`host`フィールドと一致することが必要です。 +ワイルドカードによる一致では、HTTPヘッダーの`host`がワイルドカードルールに沿って後方一致することが必要です。 + +| Host | Hostヘッダー | 一致するか | +| ----------- |-------------------| ------------------------------------------------------------| +| `*.foo.com` | `bar.foo.com` | 共通の接尾辞により一致 | +| `*.foo.com` | `baz.bar.foo.com` | 一致しない。ワイルドカードは単一のDNSラベルのみを対象とする | +| `*.foo.com` | `foo.com` | 一致しない。ワイルドカードは単一のDNSラベルのみを対象とする | + +{{< codenew file="service/networking/ingress-wildcard-host.yaml" >}} + ## Ingress Class Ingressは異なったコントローラーで実装されうるため、しばしば異なった設定を必要とします。 IngressClassリソースは、この種別のIngressを実装すべきコントローラーの名称を含む追加の設定情報を含みます。各IngressはIngressClassリソースへの参照によって種別を指定すべきです。 -```yaml -apiVersion: networking.k8s.io/v1beta1 -kind: IngressClass -metadata: - name: external-lb -spec: - controller: example.com/ingress-controller - parameters: - apiGroup: k8s.example.com/v1alpha - kind: IngressParameters - name: external-lb -``` +{{< codenew file="service/networking/external-lb.yaml" >}} IngressClassリソースは任意のパラメータフィールドを含むことができます。これは追加の設定情報を参照するために利用することができます。 @@ -137,7 +186,7 @@ Kubernetes 1.18でIngressClassリソースと`ingressClassName`フィールド Ingressの新しい`ingressClassName`フィールドはこのアノテーションを置き換えるものですが、完全に等価ではありません。 アノテーションは一般にIngressを実装すべきIngressのコントローラーの名称を示していましたが、フィールドはIngressClassリソースを示しており、これはIngressのコントローラーの名称を含む追加のIngressの設定情報を持ちます。 -### デフォルトのIngress Class +### デフォルトのIngressClass {#default-ingress-class} 特定のIngressClassをクラスターでのデフォルトとすることができます。 IngressClassリソースの`ingressclass.kubernetes.io/is-default-class`アノテーションを`true`に設定すると、`ingressClassName`フィールドが指定されないIngressにはこのデフォルトIngressClassが割り当てられるようになります。 @@ -148,20 +197,21 @@ IngressClassリソースの`ingressclass.kubernetes.io/is-default-class`アノ ## Ingressのタイプ -### 単一ServiceのIngress +### 単一ServiceのIngress {#single-service-ingress} + Kubernetesには、単一のServiceを公開できるようにする既存の概念があります([Ingressの代替案](#alternatives)を参照してください)。ルールなしで*デフォルトのバックエンド* を指定することにより、Ingressでこれを実現することもできます。 -{{< codenew file="service/networking/ingress.yaml" >}} +{{< codenew file="service/networking/test-ingress.yaml" >}} `kubectl apply -f`を実行してIngressを作成すると、その作成したIngressの状態を確認することができます。 -```shell +```bash kubectl get ingress test-ingress ``` ``` -NAME HOSTS ADDRESS PORTS AGE -test-ingress * 203.0.113.123 80 59s +NAME CLASS HOSTS ADDRESS PORTS AGE +test-ingress external-lb * 203.0.113.123 80 59s ``` `203.0.113.123`はIngressコントローラーによって割り当てられたIPで、作成したIngressを利用するためのものです。 @@ -174,34 +224,29 @@ IngressコントローラーとロードバランサーがIPアドレス割り ファンアウト設定では単一のIPアドレスのトラフィックを、リクエストされたHTTP URIに基づいて1つ以上のServiceに転送します。Ingressによってロードバランサーの数を少なくすることができます。例えば、以下のように設定します。 -```none -foo.bar.com -> 178.91.123.132 -> / foo service1:4200 - / bar service2:8080 -``` +{{< mermaid >}} +graph LR; + client([クライアント])-. Ingress管理下の
ロードバランサー .->ingress[Ingress, 178.91.123.132]; + ingress-->|/foo|service1[Service service1:4200]; + ingress-->|/bar|service2[Service service2:8080]; + subgraph cluster[クラスター] + ingress; + service1-->pod1[Pod]; + service1-->pod2[Pod]; + service2-->pod3[Pod]; + service2-->pod4[Pod]; + end + classDef plain fill:#ddd,stroke:#fff,stroke-width:4px,color:#000; + classDef k8s fill:#326ce5,stroke:#fff,stroke-width:4px,color:#fff; + classDef cluster fill:#fff,stroke:#bbb,stroke-width:2px,color:#326ce5; + class ingress,service1,service2,pod1,pod2,pod3,pod4 k8s; + class client plain; + class cluster cluster; +{{}} Ingressを以下のように設定します。 -```yaml -apiVersion: networking.k8s.io/v1beta1 -kind: Ingress -metadata: - name: simple-fanout-example - annotations: - nginx.ingress.kubernetes.io/rewrite-target: / -spec: - rules: - - host: foo.bar.com - http: - paths: - - path: /foo - backend: - serviceName: service1 - servicePort: 4200 - - path: /bar - backend: - serviceName: service2 - servicePort: 8080 -``` +{{< codenew file="service/networking/simple-fanout-example.yaml" >}} Ingressを`kubectl apply -f`によって作成したとき: @@ -220,8 +265,6 @@ Rules: foo.bar.com /foo service1:4200 (10.8.0.90:4200) /bar service2:8080 (10.8.0.91:8080) -Annotations: - nginx.ingress.kubernetes.io/rewrite-target: / Events: Type Reason Age From Message ---- ------ ---- ---- ------- @@ -232,75 +275,46 @@ IngressコントローラーはService(`service1`、`service2`)が存在する 構築が完了すると、ADDRESSフィールドでロードバランサーのアドレスを確認できます。 {{< note >}} -使用する[Ingressコントローラー](/ja/docs/concepts/services-networking/ingress-controllers)に依存しますが、default-http-backend[Service](/ja/docs/concepts/services-networking/service/)の作成が必要な場合があります。 +使用する[Ingressコントローラー](/ja/docs/concepts/services-networking/ingress-controllers/)に依存しますが、default-http-backend[Service](/ja/docs/concepts/services-networking/service/)の作成が必要な場合があります。 {{< /note >}} ### 名前ベースのバーチャルホスティング 名前ベースのバーチャルホストは、HTTPトラフィックを同一のIPアドレスの複数のホスト名に転送することをサポートしています。 -```none -foo.bar.com --| |-> foo.bar.com service1:80 - | 178.91.123.132 | -bar.foo.com --| |-> bar.foo.com service2:80 -``` +{{< mermaid >}} +graph LR; + client([クライアント])-. Ingress管理下の
ロードバランサー .->ingress[Ingress, 178.91.123.132]; + ingress-->|Host: foo.bar.com|service1[Service service1:80]; + ingress-->|Host: bar.foo.com|service2[Service service2:80]; + subgraph cluster[クラスター] + ingress; + service1-->pod1[Pod]; + service1-->pod2[Pod]; + service2-->pod3[Pod]; + service2-->pod4[Pod]; + end + classDef plain fill:#ddd,stroke:#fff,stroke-width:4px,color:#000; + classDef k8s fill:#326ce5,stroke:#fff,stroke-width:4px,color:#fff; + classDef cluster fill:#fff,stroke:#bbb,stroke-width:2px,color:#326ce5; + class ingress,service1,service2,pod1,pod2,pod3,pod4 k8s; + class client plain; + class cluster cluster; +{{}} 以下のIngress設定は、ロードバランサーに対して、[Hostヘッダー](https://tools.ietf.org/html/rfc7230#section-5.4)に基づいてリクエストを転送するように指示するものです。 -```yaml -apiVersion: networking.k8s.io/v1beta1 -kind: Ingress -metadata: - name: name-virtual-host-ingress -spec: - rules: - - host: foo.bar.com - http: - paths: - - backend: - serviceName: service1 - servicePort: 80 - - host: bar.foo.com - http: - paths: - - backend: - serviceName: service2 - servicePort: 80 -``` +{{< codenew file="service/networking/name-virtual-host-ingress.yaml" >}} rules項目でのホストの設定がないIngressを作成すると、IngressコントローラーのIPアドレスに対するwebトラフィックは、要求されている名前ベースのバーチャルホストなしにマッチさせることができます。 -例えば、以下のIngressリソースは`first.bar.com`に対するトラフィックを`service1`へ、`second.foo.com`に対するトラフィックを`service2`へ、リクエストにおいてホスト名が指定されていない(リクエストヘッダーがないことを意味します)トラフィックは`service3`へ転送します。 +例えば、以下のIngressは`first.bar.com`に対するトラフィックを`service1`へ、`second.foo.com`に対するトラフィックを`service2`へ、リクエストにおいてホスト名が指定されていない(リクエストヘッダーがないことを意味します)トラフィックは`service3`へ転送します。 -```yaml -apiVersion: networking.k8s.io/v1beta1 -kind: Ingress -metadata: - name: name-virtual-host-ingress -spec: - rules: - - host: first.bar.com - http: - paths: - - backend: - serviceName: service1 - servicePort: 80 - - host: second.foo.com - http: - paths: - - backend: - serviceName: service2 - servicePort: 80 - - http: - paths: - - backend: - serviceName: service3 - servicePort: 80 -``` +{{< codenew file="service/networking/name-virtual-host-ingress-no-third-host.yaml" >}} ### TLS -TLSの秘密鍵と証明書を含んだ{{< glossary_tooltip term_id="secret" >}}を指定することにより、Ingressをセキュアにできます。現在Ingressは単一のTLSポートである443番ポートのみサポートし、TLS終端を行うことを想定しています。IngressのTLS設定のセクションで異なるホストを指定すると、それらのホストはSNI TLSエクステンション(IngressコントローラーがSNIをサポートしている場合)を介して指定されたホスト名に対し、同じポート上で多重化されます。TLSのSecretは`tls.crt`と`tls.key`というキーを含む必要があり、TLSを使用するための証明書と秘密鍵を含む値となります。以下がその例です。 +TLSの秘密鍵と証明書を含んだ{{< glossary_tooltip term_id="secret" >}}を指定することにより、Ingressをセキュアにできます。Ingressは単一のTLSポートである443番ポートのみサポートし、IngressでTLS終端を行うことを想定しています。IngressからServiceやPodへのトラフィックは平文です。IngressのTLS設定のセクションで異なるホストを指定すると、それらのホストはSNI TLSエクステンション(IngressコントローラーがSNIをサポートしている場合)を介して指定されたホスト名に対し、同じポート上で多重化されます。TLSのSecretは`tls.crt`と`tls.key`というキーを含む必要があり、TLSを使用するための証明書と秘密鍵を含む値となります。以下がその例です。 ```yaml apiVersion: v1 @@ -314,37 +328,25 @@ data: type: kubernetes.io/tls ``` -IngressでこのSecretを参照すると、クライアントとロードバランサー間の通信にTLSを使用するようIngressコントローラーに指示することになります。作成したTLS Secretは、`sslexample.foo.com`の完全修飾ドメイン名(FQDN)とも呼ばれる共通名(CN)を含む証明書から作成したものであることを確認する必要があります。 +IngressでこのSecretを参照すると、クライアントとロードバランサー間の通信にTLSを使用するようIngressコントローラーに指示することになります。作成したTLS Secretは、`https-example.foo.com`の完全修飾ドメイン名(FQDN)とも呼ばれる共通名(CN)を含む証明書から作成したものであることを確認する必要があります。 -```yaml -apiVersion: networking.k8s.io/v1beta1 -kind: Ingress -metadata: - name: tls-example-ingress -spec: - tls: - - hosts: - - sslexample.foo.com - secretName: testsecret-tls - rules: - - host: sslexample.foo.com - http: - paths: - - path: / - backend: - serviceName: service1 - servicePort: 80 -``` +{{< note >}} +デフォルトルールではTLSが機能しない可能性があることに注意してください。 +これは取り得る全てのサブドメインに対する証明書を発行する必要があるからです。 +そのため、`tls`セクションの`hosts`は`rules`セクションの`host`と明示的に一致する必要があります。 +{{< /note >}} + +{{< codenew file="service/networking/tls-example-ingress.yaml" >}} {{< note >}} サポートされるTLSの機能はIngressコントローラーによって違いがあります。利用する環境でTLSがどのように動作するかを理解するためには、[nginx](https://kubernetes.github.io/ingress-nginx/user-guide/tls/)や、[GCE](https://git.k8s.io/ingress-gce/README.md#frontend-https)、他のプラットフォーム固有のIngressコントローラーのドキュメントを確認してください。 {{< /note >}} -### 負荷分散 +### 負荷分散 {#load-balancing} Ingressコントローラーは、負荷分散アルゴリズムやバックエンドの重みスキームなど、すべてのIngressに適用されるいくつかの負荷分散ポリシーの設定とともにブートストラップされます。発展した負荷分散のコンセプト(例: セッションの永続化、動的重み付けなど)はIngressによってサポートされていません。代わりに、それらの機能はService用のロードバランサーを介して利用できます。 -Ingressによってヘルスチェックの機能が直接に公開されていない場合でも、Kubernetesにおいて、同等の機能を提供する[Readiness Probe](/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)のようなコンセプトが存在することは注目に値します。コントローラーがどのようにヘルスチェックを行うかについては、コントローラーのドキュメントを参照してください([nginx](https://git.k8s.io/ingress-nginx/README.md)、[GCE](https://git.k8s.io/ingress-gce/README.md#health-checks))。 +Ingressによってヘルスチェックの機能が直接に公開されていない場合でも、Kubernetesにおいて、同等の機能を提供する[Readiness Probe](/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)のようなコンセプトが存在することは注目に値します。コントローラーがどのようにヘルスチェックを行うかについては、コントローラーのドキュメントを参照してください(例えば[nginx](https://git.k8s.io/ingress-nginx/README.md)、または[GCE](https://git.k8s.io/ingress-gce/README.md#health-checks))。 ## Ingressの更新 @@ -385,16 +387,22 @@ spec: http: paths: - backend: - serviceName: service1 - servicePort: 80 + service: + name: service1 + port: + number: 80 path: /foo + pathType: Prefix - host: bar.baz.com http: paths: - backend: - serviceName: service2 - servicePort: 80 + service: + name: service2 + port: + number: 80 path: /foo + pathType: Prefix .. ``` @@ -430,11 +438,7 @@ Events: ## アベイラビリティーゾーンをまたいだ障害について -障害のあるドメインをまたいでトラフィックを分散する手法は、クラウドプロバイダーによって異なります。詳細に関して、[Ingress コントローラー](/ja/docs/concepts/services-networking/ingress-controllers)のドキュメントを参照してください。複数のクラスターにおいてIngressをデプロイする方法の詳細に関しては[Kubernetes Cluster Federationのドキュメント](https://github.com/kubernetes-sigs/federation-v2)を参照してください。 - -## 将来追加予定の内容 - -Ingressと関連するリソースの今後の開発については[SIG Network](https://github.com/kubernetes/community/tree/master/sig-network)で行われている議論を確認してください。様々なIngressコントローラーの開発については[Ingress リポジトリー](https://github.com/kubernetes/ingress/tree/master)を確認してください。 +障害のあるドメインをまたいでトラフィックを分散する手法は、クラウドプロバイダーによって異なります。詳細に関して、[Ingress コントローラー](/ja/docs/concepts/services-networking/ingress-controllers)のドキュメントを参照してください。 ## Ingressの代替案 {#alternatives} @@ -447,4 +451,4 @@ Ingressリソースを直接含まない複数の方法でサービスを公開 ## {{% heading "whatsnext" %}} * [Ingress API](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#ingress-v1beta1-networking-k8s-io)について学ぶ * [Ingressコントローラー](/ja/docs/concepts/services-networking/ingress-controllers/)について学ぶ -* [MinikubeとNGINXコントローラーでIngressのセットアップを行う](/docs/tasks/access-application-cluster/ingress-minikube) +* [MinikubeとNGINXコントローラーでIngressのセットアップを行う](/docs/tasks/access-application-cluster/ingress-minikube/) diff --git a/content/ja/examples/service/networking/external-lb.yaml b/content/ja/examples/service/networking/external-lb.yaml new file mode 100644 index 0000000000..adcf7a2fd0 --- /dev/null +++ b/content/ja/examples/service/networking/external-lb.yaml @@ -0,0 +1,10 @@ +apiVersion: networking.k8s.io/v1 +kind: IngressClass +metadata: + name: external-lb +spec: + controller: example.com/ingress-controller + parameters: + apiGroup: k8s.example.com + kind: IngressParameters + name: external-lb diff --git a/content/ja/examples/service/networking/ingress-resource-backend.yaml b/content/ja/examples/service/networking/ingress-resource-backend.yaml new file mode 100644 index 0000000000..87b6bbd0f3 --- /dev/null +++ b/content/ja/examples/service/networking/ingress-resource-backend.yaml @@ -0,0 +1,20 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: ingress-resource-backend +spec: + defaultBackend: + resource: + apiGroup: k8s.example.com + kind: StorageBucket + name: static-assets + rules: + - http: + paths: + - path: /icons + pathType: ImplementationSpecific + backend: + resource: + apiGroup: k8s.example.com + kind: StorageBucket + name: icon-assets diff --git a/content/ja/examples/service/networking/ingress-wildcard-host.yaml b/content/ja/examples/service/networking/ingress-wildcard-host.yaml new file mode 100644 index 0000000000..2be7016706 --- /dev/null +++ b/content/ja/examples/service/networking/ingress-wildcard-host.yaml @@ -0,0 +1,26 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: ingress-wildcard-host +spec: + rules: + - host: "foo.bar.com" + http: + paths: + - pathType: Prefix + path: "/bar" + backend: + service: + name: service1 + port: + number: 80 + - host: "*.foo.com" + http: + paths: + - pathType: Prefix + path: "/foo" + backend: + service: + name: service2 + port: + number: 80 diff --git a/content/ja/examples/service/networking/minimal-ingress.yaml b/content/ja/examples/service/networking/minimal-ingress.yaml new file mode 100644 index 0000000000..76640b9447 --- /dev/null +++ b/content/ja/examples/service/networking/minimal-ingress.yaml @@ -0,0 +1,17 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: minimal-ingress + annotations: + nginx.ingress.kubernetes.io/rewrite-target: / +spec: + rules: + - http: + paths: + - path: /testpath + pathType: Prefix + backend: + service: + name: test + port: + number: 80 diff --git a/content/ja/examples/service/networking/name-virtual-host-ingress-no-third-host.yaml b/content/ja/examples/service/networking/name-virtual-host-ingress-no-third-host.yaml new file mode 100644 index 0000000000..16a560b1ff --- /dev/null +++ b/content/ja/examples/service/networking/name-virtual-host-ingress-no-third-host.yaml @@ -0,0 +1,35 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: name-virtual-host-ingress-no-third-host +spec: + rules: + - host: first.bar.com + http: + paths: + - pathType: Prefix + path: "/" + backend: + service: + name: service1 + port: + number: 80 + - host: second.bar.com + http: + paths: + - pathType: Prefix + path: "/" + backend: + service: + name: service2 + port: + number: 80 + - http: + paths: + - pathType: Prefix + path: "/" + backend: + service: + name: service3 + port: + number: 80 diff --git a/content/ja/examples/service/networking/name-virtual-host-ingress.yaml b/content/ja/examples/service/networking/name-virtual-host-ingress.yaml new file mode 100644 index 0000000000..213a73d261 --- /dev/null +++ b/content/ja/examples/service/networking/name-virtual-host-ingress.yaml @@ -0,0 +1,26 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: name-virtual-host-ingress +spec: + rules: + - host: foo.bar.com + http: + paths: + - pathType: Prefix + path: "/" + backend: + service: + name: service1 + port: + number: 80 + - host: bar.foo.com + http: + paths: + - pathType: Prefix + path: "/" + backend: + service: + name: service2 + port: + number: 80 diff --git a/content/ja/examples/service/networking/simple-fanout-example.yaml b/content/ja/examples/service/networking/simple-fanout-example.yaml new file mode 100644 index 0000000000..19fef9455b --- /dev/null +++ b/content/ja/examples/service/networking/simple-fanout-example.yaml @@ -0,0 +1,23 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: simple-fanout-example +spec: + rules: + - host: foo.bar.com + http: + paths: + - path: /foo + pathType: Prefix + backend: + service: + name: service1 + port: + number: 4200 + - path: /bar + pathType: Prefix + backend: + service: + name: service2 + port: + number: 8080 diff --git a/content/ja/examples/service/networking/test-ingress.yaml b/content/ja/examples/service/networking/test-ingress.yaml new file mode 100644 index 0000000000..acd384ab56 --- /dev/null +++ b/content/ja/examples/service/networking/test-ingress.yaml @@ -0,0 +1,10 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: test-ingress +spec: + defaultBackend: + service: + name: test + port: + number: 80 diff --git a/content/ja/examples/service/networking/tls-example-ingress.yaml b/content/ja/examples/service/networking/tls-example-ingress.yaml new file mode 100644 index 0000000000..fe5d52a0cb --- /dev/null +++ b/content/ja/examples/service/networking/tls-example-ingress.yaml @@ -0,0 +1,20 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: tls-example-ingress +spec: + tls: + - hosts: + - https-example.foo.com + secretName: testsecret-tls + rules: + - host: https-example.foo.com + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: service1 + port: + number: 80 From 9edbda7e818bf4a81e861050702e68991428d79f Mon Sep 17 00:00:00 2001 From: JIIOryo Date: Wed, 31 Mar 2021 09:44:55 +0900 Subject: [PATCH 042/221] Update: /ja/docs/concepts/storage/persistent-volumes.md --- .../concepts/storage/persistent-volumes.md | 89 ++++++++++++++----- 1 file changed, 69 insertions(+), 20 deletions(-) diff --git a/content/ja/docs/concepts/storage/persistent-volumes.md b/content/ja/docs/concepts/storage/persistent-volumes.md index 24bcea4ee5..1940b72cab 100644 --- a/content/ja/docs/concepts/storage/persistent-volumes.md +++ b/content/ja/docs/concepts/storage/persistent-volumes.md @@ -162,6 +162,49 @@ spec: ``` ただし、カスタムリサイクラーPodテンプレートの`volumes`パート内で指定された特定のパスは、リサイクルされるボリュームの特定のパスに置き換えられます。 +### 永続ボリュームの予約 + +コントロールプレーンは、永続ボリュームクレームをクラスター内の一致する永続ボリュームに[バインド](#バインディング)できます。 +ただし、永続ボリュームクレームを特定の永続ボリュームにバインドする場合、それらを事前にバインドする必要があります。 + +永続ボリュームクレームで永続ボリュームを指定することにより、その特定の永続ボリュームと永続ボリュームクレームの間のバインディングを宣言します。 +永続ボリュームが存在し、その`claimRef`フィールドで永続ボリュームクレームを予約していない場合に永続ボリュームと永続ボリュームクレームがバインドされます。 + +バインディングは、ノードアフィニティを含むいくつかのボリュームの一致基準に関係なく発生します。 +コントロールプレーンは、依然として[ストレージクラス](/docs/concepts/storage/storage-classes/)、アクセスモード、および要求されたストレージサイズが有効であることをチェックします。 + +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: foo-pvc + namespace: foo +spec: + storageClassName: "" # 空の文字列を明示的に指定する必要があります。そうしないとデフォルトのストレージクラスが設定されてしまいます。 + volumeName: foo-pv + ... +``` + +この方法は、永続ボリュームへのバインド特権を保証するものではありません。 +他の永続ボリュームクレームが指定した永続ボリュームを使用できる場合、最初にそのストレージボリュームを予約する必要があります。 +永続ボリュームの`claimRef`フィールドに関連する永続ボリュームクレームを指定して、他の永続ボリュームクレームがその永続ボリュームにバインドできないようにしてください。 + + +```yaml +apiVersion: v1 +kind: PersistentVolume +metadata: + name: foo-pv +spec: + storageClassName: "" + claimRef: + name: foo-pvc + namespace: foo + ... +``` + +これは、既存の永続ボリュームを再利用する場合など、`claimPolicy`が`Retain`に設定されている永続ボリュームを使用する場合に役立ちます。 + ### 永続ボリュームクレームの拡大 {{< feature-state for_k8s_version="v1.11" state="beta" >}} @@ -247,26 +290,32 @@ EBSの拡張は時間がかかる操作です。また変更は、ボリュー PersistentVolumeの種類はプラグインとして実装されます。Kubernetesは現在次のプラグインに対応しています。 -* GCEPersistentDisk -* AWSElasticBlockStore -* AzureFile -* AzureDisk -* CSI -* FC (Fibre Channel) -* FlexVolume -* Flocker -* NFS -* iSCSI -* RBD (Ceph Block Device) -* CephFS -* Cinder (OpenStack block storage) -* Glusterfs -* VsphereVolume -* Quobyte Volumes -* HostPath (テスト用の単一ノードのみ。ローカルストレージはどのような方法でもサポートされておらず、またマルチノードクラスターでは動作しません) -* Portworx Volumes -* ScaleIO Volumes -* StorageOS +* [`awsElasticBlockStore`](/docs/concepts/storage/volumes/#awselasticblockstore) - AWS Elastic Block Store (EBS) +* [`azureDisk`](/docs/concepts/storage/volumes/#azuredisk) - Azure Disk +* [`azureFile`](/docs/concepts/storage/volumes/#azurefile) - Azure File +* [`cephfs`](/docs/concepts/storage/volumes/#cephfs) - CephFS volume +* [`cinder`](/docs/concepts/storage/volumes/#cinder) - Cinder (OpenStack block storage) + (**非推奨**) +* [`csi`](/docs/concepts/storage/volumes/#csi) - Container Storage Interface (CSI) +* [`fc`](/docs/concepts/storage/volumes/#fc) - Fibre Channel (FC) storage +* [`flexVolume`](/docs/concepts/storage/volumes/#flexVolume) - FlexVolume +* [`flocker`](/docs/concepts/storage/volumes/#flocker) - Flocker storage +* [`gcePersistentDisk`](/docs/concepts/storage/volumes/#gcepersistentdisk) - GCE Persistent Disk +* [`glusterfs`](/docs/concepts/storage/volumes/#glusterfs) - Glusterfs volume +* [`hostPath`](/docs/concepts/storage/volumes/#hostpath) - HostPath volume + (テスト用の単一ノードのみ。マルチノードクラスターでは動作しません。代わりに`local`ボリュームを利用することを検討してください。) +* [`iscsi`](/docs/concepts/storage/volumes/#iscsi) - iSCSI (SCSI over IP) storage +* [`local`](/docs/concepts/storage/volumes/#local) - ノードにマウントされたローカルストレージデバイス +* [`nfs`](/docs/concepts/storage/volumes/#nfs) - Network File System (NFS) storage +* `photonPersistentDisk` - Photon controller persistent disk + (対応するクラウドプロバイダーが削除されたため、このボリュームタイプは機能しなくなりました。) +* [`portworxVolume`](/docs/concepts/storage/volumes/#portworxvolume) - Portworx volume +* [`quobyte`](/docs/concepts/storage/volumes/#quobyte) - Quobyte volume +* [`rbd`](/docs/concepts/storage/volumes/#rbd) - Rados Block Device (RBD) volume +* [`scaleIO`](/docs/concepts/storage/volumes/#scaleio) - ScaleIO volume + (**非推奨**) +* [`storageos`](/docs/concepts/storage/volumes/#storageos) - StorageOS volume +* [`vsphereVolume`](/docs/concepts/storage/volumes/#vspherevolume) - vSphere VMDK volume ## 永続ボリューム From 4f774e3175345d2370441381ffc131e266aeeaab Mon Sep 17 00:00:00 2001 From: translucens Date: Thu, 1 Apr 2021 22:23:54 +0900 Subject: [PATCH 043/221] Update content/ja/docs/concepts/services-networking/ingress.md Co-authored-by: Tim Bannister --- content/ja/docs/concepts/services-networking/ingress.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/services-networking/ingress.md b/content/ja/docs/concepts/services-networking/ingress.md index a3b0f66b48..dbb3d528d5 100644 --- a/content/ja/docs/concepts/services-networking/ingress.md +++ b/content/ja/docs/concepts/services-networking/ingress.md @@ -44,7 +44,7 @@ graph LR; class cluster cluster; {{}} -IngressはServiceに対して、外部疎通できるURL、負荷分散トラフィック、SSL/TLS終端の機能や、名前ベースの仮想ホスティングを提供するように設定できます。[Ingressコントローラー](/ja/docs/concepts/services-networking/ingress-controllers)は通常はロードバランサーを使用してIngressの機能を実現しますが、エッジルーターや、追加のフロントエンドを構成してトラフィックの処理を支援することもできます。 +IngressはServiceに対して、外部疎通できるURL、負荷分散トラフィック、SSL/TLS終端の機能や、名前ベースの仮想ホスティングを提供するように設定できます。[Ingressコントローラー](/ja/docs/concepts/services-networking/ingress-controllers/)は通常はロードバランサーを使用してIngressの機能を実現しますが、エッジルーターや、追加のフロントエンドを構成してトラフィックの処理を支援することもできます。 Ingressは任意のポートやプロトコルを公開しません。HTTPやHTTPS以外のServiceをインターネットに公開する場合、[Service.Type=NodePort](/ja/docs/concepts/services-networking/service/#nodeport)や[Service.Type=LoadBalancer](/ja/docs/concepts/services-networking/service/#loadbalancer)のServiceタイプを一般的には使用します。 From 1a1cc25f15ea48ef151b6d4220aeea97eb56cdff Mon Sep 17 00:00:00 2001 From: Soichiro KAWAMURA Date: Thu, 1 Apr 2021 22:28:42 +0900 Subject: [PATCH 044/221] add term ImplementationSpecific meaning --- content/ja/docs/concepts/services-networking/ingress.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/services-networking/ingress.md b/content/ja/docs/concepts/services-networking/ingress.md index dbb3d528d5..216e7c9e8f 100644 --- a/content/ja/docs/concepts/services-networking/ingress.md +++ b/content/ja/docs/concepts/services-networking/ingress.md @@ -118,7 +118,7 @@ Events: Ingressのそれぞれのパスは対応するパスのタイプを持ちます。`pathType`が明示的に指定されていないパスはバリデーションに通らないでしょう。サポートされているパスのタイプは3種類あります。 -* `ImplementationSpecific`: このパスタイプでは、パスとの一致はIngressClassに依存します。Ingressの実装はこれを独立した`pathType`と扱うことも、`Prefix`や`Exact`と同一のパスタイプと扱うこともできます。 +* `ImplementationSpecific`(実装に特有): このパスタイプでは、パスとの一致はIngressClassに依存します。Ingressの実装はこれを独立した`pathType`と扱うことも、`Prefix`や`Exact`と同一のパスタイプと扱うこともできます。 * `Exact`: 大文字小文字を区別して完全に一致するURLパスと一致します。 From 453736593be0b6a16b4926d6d8d988685984e4ba Mon Sep 17 00:00:00 2001 From: takaf04 Date: Fri, 2 Apr 2021 00:03:50 +0900 Subject: [PATCH 045/221] Update content/ja/docs/concepts/containers/container-lifecycle-hooks.md Co-authored-by: makocchi --- .../ja/docs/concepts/containers/container-lifecycle-hooks.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/ja/docs/concepts/containers/container-lifecycle-hooks.md b/content/ja/docs/concepts/containers/container-lifecycle-hooks.md index 878eb7ec89..7804a0c212 100644 --- a/content/ja/docs/concepts/containers/container-lifecycle-hooks.md +++ b/content/ja/docs/concepts/containers/container-lifecycle-hooks.md @@ -55,7 +55,7 @@ Angularなどのコンポーネントライフサイクルフックを持つ多 しかし、フックの実行に時間がかかりすぎたりハングしたりすると、コンテナは`running`状態になることができません。 `PreStop`フックはコンテナを停止する信号から非同期で実行されるのではなく、信号が送られる前に実行を完了する必要があります。 -もし`PreStop`フックが実行中にハングした場合、Podは`Terminating`状態にになり、 +もし`PreStop`フックが実行中にハングした場合、Podは`Terminating`状態になり、 `terminationGracePeriodSeconds`の時間切れで強制終了されるまで続きます。 この猶予時間は、`PreStop`フックが実行され正常にコンテナを停止できるまでの合計時間に適用されます。 例えば`terminationGracePeriodSeconds`が60で、フックの終了に55秒かかり、シグナルを受信した後にコンテナを正常に停止させるのに10秒かかる場合、コンテナは正常に停止する前に終了されてしまいます。`terminationGracePeriodSeconds`が、これら2つの実行にかかる合計時間(55+10)よりも短いからです。 @@ -106,4 +106,3 @@ Events: * [コンテナ環境](/ja/docs/concepts/containers/container-environment/)の詳細 * [コンテナライフサイクルイベントへのハンドラー紐付け](/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/)のハンズオン - From f8d72bb3b32273dc7e3640b43ac8fd2d8fd01d9a Mon Sep 17 00:00:00 2001 From: YukiKasuya Date: Fri, 2 Apr 2021 12:39:18 +0900 Subject: [PATCH 046/221] Fix content/ja/docs/concepts/scheduling-eviction/kube-scheduler.md --- .../scheduling-eviction/kube-scheduler.md | 67 +++---------------- 1 file changed, 8 insertions(+), 59 deletions(-) diff --git a/content/ja/docs/concepts/scheduling-eviction/kube-scheduler.md b/content/ja/docs/concepts/scheduling-eviction/kube-scheduler.md index 861e528cd9..8d3ec5ef56 100644 --- a/content/ja/docs/concepts/scheduling-eviction/kube-scheduler.md +++ b/content/ja/docs/concepts/scheduling-eviction/kube-scheduler.md @@ -50,65 +50,10 @@ _スコアリング_ ステップでは、Podを割り当てるのに最も適 最後に、kube-schedulerは最も高いランクのNodeに対してPodを割り当てます。もし同一のスコアのNodeが複数ある場合は、kube-schedulerがランダムに1つ選択します。 -### デフォルトのポリシーについて +スケジューラーのフィルタリングとスコアリングの動作に関する設定には2つのサポートされた手法があります。 -kube-schedulerは、デフォルトで用意されているスケジューリングポリシーのセットを持っています。 - -### フィルタリング - -- `PodFitsHostPorts`: Nodeに、Podが要求するポートが利用可能かどうかをチェックします。 - -- `PodFitsHost`: Podがそのホスト名において特定のNodeを指定しているかをチェックします。 - -- `PodFitsResources`: Nodeに、Podが要求するリソース(例: CPUとメモリー)が利用可能かどうかをチェックします。 - -- `PodMatchNodeSelector`: PodのNodeSelectorが、Nodeのラベルにマッチするかどうかをチェックします。 - -- `NoVolumeZoneConflict`: Podが要求するVolumeがNode上で利用可能かを、障害が発生しているゾーンを考慮して評価します。 - -- `NoDiskConflict`: NodeのVolumeがPodの要求を満たし、すでにマウントされているかどうかを評価します。 - -- `MaxCSIVolumeCount`: CSI Volumeをいくつ割り当てるべきか決定し、それが設定された上限を超えるかどうかを評価します。 - -- `CheckNodeMemoryPressure`: もしNodeがメモリーの容量が逼迫している場合、また設定された例外がない場合はそのPodはそのNodeにスケジュールされません。 - -- `CheckNodePIDPressure`: もしNodeのプロセスIDが枯渇しそうになっていた場合や、設定された例外がない場合はそのPodはそのNodeにスケジュールされません。 - -- `CheckNodeDiskPressure`: もしNodeのストレージが逼迫している場合(ファイルシステムの残り容量がほぼない場合)や、設定された例外がない場合はそのPodはそのNodeにスケジュールされません。 - -- `CheckNodeCondition`: Nodeは、ファイルシステムの空き容量が完全になくなった場合、ネットワークが利用不可な場合、kubeletがPodを稼働させる準備をできていない場合などに、その状況を通知できます。Nodeがこの状況下かつ設定された例外がない場合、Podは該当のNodeにスケジュールされません。 - -- `PodToleratesNodeTaints`: PodのTolerationがNodeのTaintを許容できるかチェックします。 - -- `CheckVolumeBinding`: Podが要求するVolumeの要求を満たすか評価します。これはPersistentVolumeClaimがバインドされているかに関わらず適用されます。 - -### スコアリング - -- `SelectorSpreadPriority`: 同一のService、StatefulSetや、ReplicaSetに属するPodを複数のホストをまたいで稼働させます。 - -- `InterPodAffinityPriority`: weightedPodAffinityTermの要素をイテレートして合計を計算したり、もし一致するPodAffinityTermがNodeに適合している場合は、"重み"を合計値に足したりします。:最も高い合計値を持つNode(複数もあり)が候補となります。 - -- `LeastRequestedPriority`: 要求されたリソースがより低いNodeを優先するものです。言い換えると、Nodeに多くのPodが稼働しているほど、Podが使用するリソースが多くなり、その要求量が低いNodeが選択されます。 - -- `MostRequestedPriority`: 要求されたリソースがより多いNodeを優先するものです。このポリシーは、ワークロードの全体セットを実行するために必要な最小数のNodeに対して、スケジュールされたPodを適合させます。  - -- `RequestedToCapacityRatioPriority`: デフォルトのリソーススコアリング関数を使用して、requestedToCapacityベースのResourceAllocationPriorityを作成します。 - -- `BalancedResourceAllocation`: バランスのとれたリソース使用量になるようにNodeを選択します。 - -- `NodePreferAvoidPodsPriority`: Nodeの`scheduler.alpha.kubernetes.io/preferAvoidPods`というアノテーションに基づいてNodeの優先順位づけをします。この設定により、2つの異なるPodが同じNode上で実行しないことを示唆できます。 - -- `NodeAffinityPriority`: "PreferredDuringSchedulingIgnoredDuringExecution"の値によって示されたNode Affinityのスケジューリング性向に基づいてNodeの優先順位づけを行います。詳細は[NodeへのPodの割り当て](https://kubernetes.io/ja/docs/concepts/scheduling-eviction/assign-pod-node/)にて確認できます。 - -- `TaintTolerationPriority`: Node上における許容できないTaintsの数に基づいて、全てのNodeの優先順位リストを準備します。このポリシーでは優先順位リストを考慮してNodeのランクを調整します。 - -- `ImageLocalityPriority`: すでにPodに対するコンテナイメージをローカルにキャッシュしているNodeを優先します。 - -- `ServiceSpreadingPriority`: このポリシーの目的は、特定のServiceに対するバックエンドのPodが、それぞれ異なるNodeで実行されるようにすることです。このポリシーではServiceのバックエンドのPodがすでに実行されていないNode上にスケジュールするように優先します。これによる結果として、Serviceは単体のNode障害に対してより耐障害性が高まります。 - -- `CalculateAntiAffinityPriorityMap`: このポリシーは[PodのAnti-Affinity](/ja/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity)の実装に役立ちます。 - -- `EqualPriorityMap`: 全てのNodeに対して等しい重みを与えます。 +1. [スケジューリングポリシー](/docs/reference/scheduling/policies) は、フィルタリングのための_Predicates_とスコアリングのための_Priorities_の設定することができます。 +1. [スケジューリングプロファイル](/docs/reference/scheduling/config/#profiles)は、`QueueSort`、 `Filter`、 `Score`、 `Bind`、 `Reserve`、 `Permit`やその他を含む異なるスケジューリングの段階を実装するプラグインを設定することができます。kube-schdulerを異なるプロファイルを実行するように設定することもできます。 ## {{% heading "whatsnext" %}} @@ -118,4 +63,8 @@ kube-schedulerは、デフォルトで用意されているスケジューリン * kube-schedulerの[リファレンスドキュメント](/docs/reference/command-line-tools-reference/kube-scheduler/)を参照してください。 * [複数のスケジューラーの設定](/docs/tasks/administer-cluster/configure-multiple-schedulers/)について学んでください。 * [トポロジーの管理ポリシー](/docs/tasks/administer-cluster/topology-manager/)について学んでください。 -* [Podのオーバーヘッド](/docs/concepts/configuration/pod-overhead/)について学んでください。 +* [Podのオーバーヘッド](/docs/concepts/scheduling-eviction/pod-overhead/)について学んでください。 +* ボリュームを使用するPodのスケジューリングについて以下で学んでください。 + * [Volume Topology Support](/docs/concepts/storage/storage-classes/#volume-binding-mode) + * [ストレージ容量の追跡](/ja//docs/concepts/storage/storage-capacity/) + * [Node-specific Volume Limits](/docs/concepts/storage/storage-limits/) From 26338b84cccc31c251aa03361213e171035d1b51 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji Date: Sun, 4 Apr 2021 19:50:54 +0900 Subject: [PATCH 047/221] Fix the position of the abbreviation text "CNCF" --- content/ja/docs/home/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/home/_index.md b/content/ja/docs/home/_index.md index 3935a9b1ba..44419b4890 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: "基本を理解する" From d2e3851109850eb504c571241f22e59bdcdd6a55 Mon Sep 17 00:00:00 2001 From: RyuSA Date: Mon, 5 Apr 2021 23:03:57 +0900 Subject: [PATCH 048/221] Update content/ja/docs/concepts/services-networking/service.md Co-authored-by: atoato88 --- content/ja/docs/concepts/services-networking/service.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/services-networking/service.md b/content/ja/docs/concepts/services-networking/service.md index 1b878eeda0..a91da37567 100644 --- a/content/ja/docs/concepts/services-networking/service.md +++ b/content/ja/docs/concepts/services-networking/service.md @@ -961,7 +961,7 @@ PROXY TCP4 192.0.2.202 10.0.42.7 12345 7\r\n KubernetesはService、Endpoints、EndpointSlice、NetworkPolicyとPodの定義において`protocol`フィールドの値でSCTPをサポートしています。ベータ版の機能のため、この機能はデフォルトで有効になっています。SCTPをクラスターレベルで無効にするには、クラスター管理者はAPI Serverにおいて`SCTPSupport` [フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)を`--feature-gates=SCTPSupport=false,…`と設定して無効にする必要があります。 -そのフィーチャーゲートが有効になった時、ユーザーはService、Endpoints、EndpointSlice、NetworkPolicyの`protocol`フィールドと、Podの`SCTP`フィールドを設定できます。 +そのフィーチャーゲートが有効になった時、ユーザーはService、Endpoints、EndpointSlice、NetworkPolicy、またはPodの`protocol`フィールドに`SCTP`を設定できます。 Kubernetesは、TCP接続と同様に、SCTPアソシエーションに応じてネットワークをセットアップします。 #### 警告 {#caveat-sctp-overview} From bbf394c010ec0cc1245768452327d70fff05e3cb Mon Sep 17 00:00:00 2001 From: Himanshu Date: Tue, 6 Apr 2021 10:21:40 +0530 Subject: [PATCH 049/221] Update _index.md --- content/ja/docs/concepts/workloads/controllers/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/workloads/controllers/_index.md b/content/ja/docs/concepts/workloads/controllers/_index.md index 3ac3522f23..86a36414a2 100644 --- a/content/ja/docs/concepts/workloads/controllers/_index.md +++ b/content/ja/docs/concepts/workloads/controllers/_index.md @@ -1,4 +1,4 @@ --- -title: "Workload Resources" +title: "ワークロードリソース" weight: 20 --- From 4aa5723cfc5c6be2b79690a8e7921b06f218f6b4 Mon Sep 17 00:00:00 2001 From: Jin Hase Date: Tue, 6 Apr 2021 20:09:28 +0900 Subject: [PATCH 050/221] Update Japanese localization on concepts/overview/working-with-objects/labels.md --- .../concepts/overview/working-with-objects/labels.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 b6abcb974d..8d3ac3dedc 100644 --- a/content/ja/docs/concepts/overview/working-with-objects/labels.md +++ b/content/ja/docs/concepts/overview/working-with-objects/labels.md @@ -151,10 +151,10 @@ partition !partition ``` -最初の例では、キーが`environment`で、値が`production`か`qa`に等しいリソースを全て選択します。 -第2の例では、キーが`tier`で、値が`frontend`と`backend`以外のもの、そして`tier`キーを持たないリソースを全て選択します。 -第3の例では、`partition`というキーをもつラベルを全て選択し、値はチェックしません。 -第4の例では、`partition`というキーを持たないラベルを全て選択し、値はチェックしません。 +* 最初の例では、キーが`environment`で、値が`production`か`qa`に等しいリソースを全て選択します。 +* 第2の例では、キーが`tier`で、値が`frontend`と`backend`以外のもの、そして`tier`キーを持たないリソースを全て選択します。 +* 第3の例では、`partition`というキーをもつラベルを全て選択し、値はチェックしません。 +* 第4の例では、`partition`というキーを持たないラベルを全て選択し、値はチェックしません。 同様に、コンマセパレーターは、_AND_ オペレーターと同様にふるまいます。そのため、`partition`と`environment`キーの値がともに`qa`でないラベルを選択するには、`partition,environment notin (qa)`と記述することで可能です。 *集合ベース* のラベルセレクターは、`environment=production`という記述が`environment in (production)`と等しいため、一般的な等価形式となります。 `!=`と`notin`も同様に等価となります。 @@ -198,7 +198,7 @@ kubectl get pods -l 'environment,environment notin (frontend)' ``` ### APIオブジェクトに参照を設定する -[`Service`](/ja/docs/concepts/services-networking/service/) と [`ReplicationController`](/docs/concepts/workloads/controllers/replicationcontroller/)のような、いくつかのKubernetesオブジェクトでは、ラベルセレクターを[Pod](/ja/docs/concepts/workloads/pods/pod/)のような他のリソースのセットを指定するのにも使われます。 +[`Service`](/ja/docs/concepts/services-networking/service/) と [`ReplicationController`](/docs/concepts/workloads/controllers/replicationcontroller/)のような、いくつかのKubernetesオブジェクトでは、ラベルセレクターを[Pod](/ja/docs/concepts/workloads/pods/)のような他のリソースのセットを指定するのにも使われます。 #### ServiceとReplicationController `Service`が対象とするPodの集合は、ラベルセレクターによって定義されます。 From ce2509a5ea8ad0920c6b57fd1f1a1ad55fbb699f Mon Sep 17 00:00:00 2001 From: Jin Hase Date: Tue, 6 Apr 2021 20:14:07 +0900 Subject: [PATCH 051/221] Update labels.md --- content/ja/docs/concepts/overview/working-with-objects/labels.md | 1 + 1 file changed, 1 insertion(+) 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 8d3ac3dedc..95d6dfc09f 100644 --- a/content/ja/docs/concepts/overview/working-with-objects/labels.md +++ b/content/ja/docs/concepts/overview/working-with-objects/labels.md @@ -155,6 +155,7 @@ partition * 第2の例では、キーが`tier`で、値が`frontend`と`backend`以外のもの、そして`tier`キーを持たないリソースを全て選択します。 * 第3の例では、`partition`というキーをもつラベルを全て選択し、値はチェックしません。 * 第4の例では、`partition`というキーを持たないラベルを全て選択し、値はチェックしません。 + 同様に、コンマセパレーターは、_AND_ オペレーターと同様にふるまいます。そのため、`partition`と`environment`キーの値がともに`qa`でないラベルを選択するには、`partition,environment notin (qa)`と記述することで可能です。 *集合ベース* のラベルセレクターは、`environment=production`という記述が`environment in (production)`と等しいため、一般的な等価形式となります。 `!=`と`notin`も同様に等価となります。 From 4119fcd6084c85b795bbeb9533c5552a13c36215 Mon Sep 17 00:00:00 2001 From: s-ito-ts Date: Mon, 22 Mar 2021 08:49:54 +0000 Subject: [PATCH 052/221] Update ja/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md --- .../scheduler-perf-tuning.md | 63 ++++++++++++++----- 1 file changed, 48 insertions(+), 15 deletions(-) diff --git a/content/ja/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md b/content/ja/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md index 7adfe28827..3457132bd1 100644 --- a/content/ja/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md +++ b/content/ja/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md @@ -1,7 +1,7 @@ --- title: スケジューラーのパフォーマンスチューニング content_type: concept -weight: 70 +weight: 80 --- @@ -15,12 +15,44 @@ weight: 70 このページでは、大規模のKubernetesクラスターにおけるパフォーマンス最適化のためのチューニングについて説明します。 - -## スコア付けするノードの割合 +大規模クラスターでは、レイテンシー(新規Podをすばやく配置)と精度(スケジューラーが不適切な配置を行うことはめったにありません)の間でスケジューリング結果を調整するスケジューラーの動作をチューニングできます。 -Kubernetes 1.12以前では、Kube-schedulerがクラスター内の全てのノードに対して割り当て可能かをチェックし、実際に割り当て可能なノードのスコア付けをしていました。Kubernetes 1.12では新機能を追加し、ある数の割り当て可能なノードが見つかった時点で、割り当て可能なノードの探索を止めれるようになりました。これにより大規模なクラスターにおけるスケジューラーのパフォーマンスが向上しました。その数はクラスターのサイズの割合(%)として指定されます。この割合は`percentageOfNodesToScore`というオプションの設定項目によって指定可能です。この値の範囲は1から100までです。100より大きい値は100%として扱われます。0を指定したときは、この設定オプションを指定しないものとして扱われます。Kubernetes 1.14では、この値が指定されていないときは、スコア付けするノードの割合をクラスターのサイズに基づいて決定するためのメカニズムがあります。このメカニズムでは100ノードのクラスターに対しては50%の割合とするような線形な式を使用します。5000ノードのクラスターに対しては10%となります。自動で算出される割合の最低値は5%となります。言い換えると、クラスターの規模がどれだけ大きくても、ユーザーがこの値を5未満に設定しない限りスケジューラーは少なくても5%のクラスター内のノードをスコア付けすることになります。 +このチューニング設定は、kube-scheduler設定の`percentageOfNodesToScore`で設定できます。KubeSchedulerConfiguration設定は、クラスター内のノードにスケジュールするための閾値を決定します。 + +### 閾値の設定 + +`percentageOfNodesToScore`オプションは、0から100までの数値を受け入れます。0は、kube-schedulerがコンパイル済みのデフォルトを使用することを示す特別な値です。 +`percentageOfNodesToScore`に100より大きな値を設定した場合、kube-schedulerの挙動は100を設定した場合と同様となります。 + +この値を変更するためには、kube-schedulerの設定ファイル(これは`/etc/kubernetes/config/kube-scheduler.yaml`の可能性が高い)を編集し、スケジューラーを再起動します。 + +この変更をした後、 + +```bash +kubectl get pods -n kube-system | grep kube-scheduler +``` + +を実行して、kube-schedulerコンポーネントが正常であることを確認できます。 + +## ノードへのスコア付けの閾値 {#percentage-of-nodes-to-score} + +スケジューリング性能を改善するため、kube-schedulerは割り当て可能なノードが十分に見つかるとノードの検索を停止できます。大規模クラスターでは、すべてのノードを考慮する単純なアプローチと比較して時間を節約できます。 + +クラスター内のすべてのノードに対する十分なノード数を整数パーセンテージで指定します。kube-schedulerは、これをノード数に変換します。スケジューリング中に、kube-schedulerが設定されたパーセンテージを超える十分な割り当て可能なノードを見つけた場合、kube-schedulerはこれ以上割り当て可能なノードを探すのを止め、[スコアリングフェーズ](/docs/concepts/scheduling-eviction/kube-scheduler/#kube-scheduler-implementation)に進みます。 + +[スケジューラーはどのようにノードを探索するか](#how-the-scheduler-iterates-over-nodes)で処理を詳しく説明しています。 + +### デフォルトの閾値 + +閾値を指定しない場合、Kubernetesは100ノードのクラスタでは50%、5000ノードのクラスタでは10%になる線形方程式を使用して数値を計算します。自動計算の下限は5%です。 + +つまり、明示的に`percentageOfNodesToScore`を5未満の値を設定しない限り、クラスターの規模に関係なく、kube-schedulerは常に少なくともクラスターの5%のノードに対してスコア付けをします。 + +スケジューラーにクラスター内のすべてのノードに対してスコア付けをさせる場合は、`percentageOfNodesToScore`の値に100を設定します。 + +## 例 `percentageOfNodesToScore`の値を50%に設定する例は下記のとおりです。 @@ -35,22 +67,23 @@ algorithmSource: percentageOfNodesToScore: 50 ``` +## percentageOfNodesToScoreのチューニング + +`percentageOfNodesToScore`は1から100の間の範囲である必要があり、デフォルト値はクラスターのサイズに基づいて計算されます。また、クラスターのサイズの最小値は50ノードとハードコードされています。 + {{< note >}} -割り当て可能なノードが50未満のクラスターにおいては、割り当て可能なノードの探索を止めるほどノードが多くないため、スケジューラーは全てのノードをチェックします。 +割り当て可能なノードが50以下のクラスタでは、スケジューラの検索を早期に停止するのに十分な割り当て可能なノードがないため、スケジューラはすべてのノードをチェックします。 + +小規模クラスタでは、`percentageOfNodesToScore`に低い値を設定したとしても、同様の理由で変更による影響は全くないか、ほとんどありません。 + +クラスターのノード数が数百以下の場合は、この設定オプションをデフォルト値のままにします。変更してもスケジューラの性能を大幅に改善する可能性はほとんどありません。 {{< /note >}} -**この機能を無効にするためには**、`percentageOfNodesToScore`を100に設定してください。 +この値を設定する際に考慮するべき重要な注意事項として、割り当て可能ノードのチェック対象のノードが少ないと、一部のノードはPodの割り当てのためにスコアリングされなくなります。結果として、高いスコアをつけられる可能性のあるノードがスコアリングフェーズに渡されることがありません。これにより、Podの配置が理想的なものでなくなります。 +kube-schedulerが頻繁に不適切なPodの配置を行わないよう、`percentageOfNodesToScore`をかなり低い値を設定することは避けるべきです。スケジューラのスループットがアプリケーションにとって致命的で、ノードのスコアリングが重要でない場合を除いて、10%未満に設定することは避けてください。言いかえると、割り当て可能な限り、Podは任意のノード上で稼働させるのが好ましいです。 -### percentageOfNodesToScoreのチューニング - -`percentageOfNodesToScore`は1から100の間の範囲である必要があり、デフォルト値はクラスターのサイズに基づいて計算されます。また、クラスターのサイズの最小値は50ノードとハードコードされています。これは数百のノードを持つようなクラスターにおいてこの値を50より低い値に変更しても、スケジューラーが検出する割り当て可能なノードの数に大きな影響を与えないことを意味します。このオプションは意図的なものです。その理由としては、小規模のクラスターにおいてパフォーマンスを著しく改善する可能性が低いためです。1000ノードを超える大規模なクラスターでこの値を低く設定すると、パフォーマンスが著しく改善される可能性があります。 - -この値を設定する際に考慮するべき重要な注意事項として、割り当て可能ノードのチェック対象のノードが少ないと、一部のノードはPodの割り当てのためにスコアリングされなくなります。結果として、高いスコアをつけられる可能性のあるノードがスコアリングフェーズに渡されることがありません。これにより、Podの配置が理想的なものでなくなります。したがって、この値をかなり低い割合に設定すべきではありません。一般的な経験則として、この値を10未満に設定しないことです。スケジューラーのスループットがアプリケーションにとって致命的で、ノードのスコアリングが重要でないときのみ、この値を低く設定するべきです。言いかえると、割り当て可能な限り、Podは任意のノード上で稼働させるのが好ましいです。 - -クラスターが数百のノードを持つ場合やそれに満たない場合でも、この設定オプションのデフォルト値を低くするのを推奨しません。デフォルト値を低くしてもスケジューラーのパフォーマンスを大幅に改善することはありません。 - -### スケジューラーはどのようにノードを探索するか +## スケジューラーはどのようにノードを探索するか {#how-the-scheduler-iterates-over-nodes} このセクションでは、この機能の内部の詳細を理解したい人向けになります。 From e5278754aecd0e9f0d29d7e8bf5da27a033937dd Mon Sep 17 00:00:00 2001 From: yu-kasuya Date: Thu, 8 Apr 2021 12:43:51 +0900 Subject: [PATCH 053/221] Update content/ja/docs/concepts/scheduling-eviction/kube-scheduler.md Co-authored-by: makocchi --- content/ja/docs/concepts/scheduling-eviction/kube-scheduler.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/scheduling-eviction/kube-scheduler.md b/content/ja/docs/concepts/scheduling-eviction/kube-scheduler.md index 8d3ec5ef56..9f2b86a425 100644 --- a/content/ja/docs/concepts/scheduling-eviction/kube-scheduler.md +++ b/content/ja/docs/concepts/scheduling-eviction/kube-scheduler.md @@ -53,7 +53,7 @@ _スコアリング_ ステップでは、Podを割り当てるのに最も適 スケジューラーのフィルタリングとスコアリングの動作に関する設定には2つのサポートされた手法があります。 1. [スケジューリングポリシー](/docs/reference/scheduling/policies) は、フィルタリングのための_Predicates_とスコアリングのための_Priorities_の設定することができます。 -1. [スケジューリングプロファイル](/docs/reference/scheduling/config/#profiles)は、`QueueSort`、 `Filter`、 `Score`、 `Bind`、 `Reserve`、 `Permit`やその他を含む異なるスケジューリングの段階を実装するプラグインを設定することができます。kube-schdulerを異なるプロファイルを実行するように設定することもできます。 +1. [スケジューリングプロファイル](/docs/reference/scheduling/config/#profiles)は、`QueueSort`、 `Filter`、 `Score`、 `Bind`、 `Reserve`、 `Permit`やその他を含む異なるスケジューリングの段階を実装するプラグインを設定することができます。kube-schedulerを異なるプロファイルを実行するように設定することもできます。 ## {{% heading "whatsnext" %}} From bed23cd47efaaf1568a1e960b480da9066d69c75 Mon Sep 17 00:00:00 2001 From: atline Date: Thu, 8 Apr 2021 15:16:30 +0800 Subject: [PATCH 054/221] Update guestbook.md Fix typo. --- content/zh/docs/tutorials/stateless-application/guestbook.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/tutorials/stateless-application/guestbook.md b/content/zh/docs/tutorials/stateless-application/guestbook.md index b7ef978490..0188d8b059 100644 --- a/content/zh/docs/tutorials/stateless-application/guestbook.md +++ b/content/zh/docs/tutorials/stateless-application/guestbook.md @@ -261,7 +261,7 @@ The `mongo` Services you applied is only accessible within the Kubernetes cluste -如果您希望访客能够访问您的留言板,您必须将前端服务配置为外部可见的,以便客户端可以从 Kubernetes 集群之外请求服务。然而即便使用了 `ClusterIP` Kubernets 用户仍可以通过 `kubectl port-forwart` 访问服务。 +如果您希望访客能够访问您的留言板,您必须将前端服务配置为外部可见的,以便客户端可以从 Kubernetes 集群之外请求服务。然而即便使用了 `ClusterIP` Kubernets 用户仍可以通过 `kubectl port-forward` 访问服务。 + +異なる種類のワークロードやその一部を表すコアオブジェクトはさまざまなものがあり、DaemonSet、Deployment、Job、ReplicaSet、StatefulSetオブジェクトなどがあります。 + +たとえば、ウェブサーバーとデータベースを含むワークロードの場合、データベースを1つの{{< glossary_tooltip term_id="StatefulSet" >}}で実行し、ウェブサーバーを{{< glossary_tooltip term_id="Deployment" >}}で実行するという構成が考えられます。 From f83f87fe57197ce926c4bf93da96a9d896c3c184 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji Date: Sun, 11 Apr 2021 14:20:56 +0000 Subject: [PATCH 058/221] Delete unnecessary two files: search.md and sitemap.md --- content/ja/docs/search.md | 5 -- content/ja/docs/sitemap.md | 114 ------------------------------------- 2 files changed, 119 deletions(-) delete mode 100644 content/ja/docs/search.md delete mode 100644 content/ja/docs/sitemap.md diff --git a/content/ja/docs/search.md b/content/ja/docs/search.md deleted file mode 100644 index c6f961cdfb..0000000000 --- a/content/ja/docs/search.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: search -title: 検索結果 ---- - diff --git a/content/ja/docs/sitemap.md b/content/ja/docs/sitemap.md deleted file mode 100644 index 287642c004..0000000000 --- a/content/ja/docs/sitemap.md +++ /dev/null @@ -1,114 +0,0 @@ ---- ---- - - - -ページ上のタグをクリックするか、カラムのドロップダウンを使って記事をフィルターできます。テーブルヘッダーをクリックすると並び順をソートすることができます。 - -

-コンセプトでフィルター:
-オブジェクトでフィルター:
-コマンドでフィルター: -

- -
From ac4c22342258fc1b428e7975cf5ef7c3c358e406 Mon Sep 17 00:00:00 2001 From: atline Date: Tue, 13 Apr 2021 16:18:25 +0800 Subject: [PATCH 059/221] Update content/zh/docs/tutorials/stateless-application/guestbook.md Co-authored-by: Mike Petersen --- content/zh/docs/tutorials/stateless-application/guestbook.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/zh/docs/tutorials/stateless-application/guestbook.md b/content/zh/docs/tutorials/stateless-application/guestbook.md index 0188d8b059..a561268be7 100644 --- a/content/zh/docs/tutorials/stateless-application/guestbook.md +++ b/content/zh/docs/tutorials/stateless-application/guestbook.md @@ -261,7 +261,7 @@ The `mongo` Services you applied is only accessible within the Kubernetes cluste -如果您希望访客能够访问您的留言板,您必须将前端服务配置为外部可见的,以便客户端可以从 Kubernetes 集群之外请求服务。然而即便使用了 `ClusterIP` Kubernets 用户仍可以通过 `kubectl port-forward` 访问服务。 +如果您希望访客能够访问您的留言板,您必须将前端服务配置为外部可见的,以便客户端可以从 Kubernetes 集群之外请求服务。然而即便使用了 `ClusterIP` Kubernetes 用户仍可以通过 `kubectl port-forward` 访问服务。 + +## Podとは何か? + +{{< note >}} +KubernetesはDockerだけでなく複数の{{< glossary_tooltip text="コンテナランタイム" term_id="container-runtime" >}}をサポートしていますが、[Docker](https://www.docker.com/)が最も一般的に知られたランタイムであるため、Docker由来の用語を使ってPodを説明するのが理解の助けとなります。 +{{< /note >}} + +Podの共有コンテキストは、Dockerコンテナを隔離するのに使われているのと同じ、Linuxのnamespaces、cgroups、場合によっては他の隔離技術の集合を用いて作られます。Podのコンテキスト内では、各アプリケーションが追加の準隔離技術を適用することもあります。 + +Dockerの概念を使って説明すると、Podは共有の名前空間と共有ファイルシステムのボリュームを持つDockerコンテナのグループに似ています。 + +## Podを使用する + +通常、たとえ単一のコンテナしか持たないシングルトンのPodだとしても、自分でPodを直接作成する必要はありません。その代わりに、{{< glossary_tooltip text="Deployment" +term_id="deployment" >}}や{{< glossary_tooltip text="Job" term_id="job" >}}などのワークロードリソースを使用してPodを作成します。もしPodが状態を保持する必要がある場合は、{{< glossary_tooltip text="StatefulSet" term_id="statefulset" >}}リソースを使用することを検討してください。 + +Kubernetesクラスター内のPodは、主に次の2種類の方法で使われます。 + +* **単一のコンテナを稼働させるPod**。「1Pod1コンテナ」構成のモデルは、Kubernetesでは最も一般的なユースケースです。このケースでは、ユーザーはPodを単一のコンテナのラッパーとして考えることができます。Kubernetesはコンテナを直接管理するのではなく、Podを管理します。 +* **協調して稼働させる必要がある複数のコンテナを稼働させるPod**。単一のPodは、密に結合してリソースを共有する必要があるような、同じ場所で稼働する複数のコンテナからなるアプリケーションをカプセル化することもできます。これらの同じ場所で稼働するコンテナ群は、単一のまとまりのあるサービスのユニットを構成します。たとえば、1つのコンテナが共有ボリュームからファイルをパブリックに配信し、別の*サイドカー*コンテナがそれらのファイルを更新するという構成が考えられます。Podはこれらの複数のコンテナ、ストレージリソース、一時的なネットワークIDなどを、単一のユニットとしてまとめます。 + + {{< note >}} + 複数のコンテナを同じ場所で同時に管理するように単一のPod内にグループ化するのは、比較的高度なユースケースです。このパターンを使用するのは、コンテナが密に結合しているような特定のインスタンス内でのみにするべきです。 + {{< /note >}} + +各Podは、与えられたアプリケーションの単一のインスタンスを稼働するためのものです。もしユーザーのアプリケーションを水平にスケールさせたい場合(例: 複数インスタンスを稼働させる)、複数のPodを使うべきです。1つのPodは各インスタンスに対応しています。Kubernetesでは、これは一般的に*レプリケーション*と呼ばれます。レプリケーションされたPodは、通常ワークロードリソースと、それに対応する{{< glossary_tooltip text="コントローラー" term_id="controller" >}}によって、作成・管理されます。 + +Kubernetesがワークロードリソースとそのコントローラーを活用して、スケーラブルで自動回復するアプリケーションを実装する方法については、詳しくは[Podとコントローラー](#pods-and-controllers)を参照してください。 + +### Podが複数のコンテナを管理する方法 + +Podは、まとまりの強いサービスのユニットを構成する、複数の協調する(コンテナとして実行される)プロセスをサポートするために設計されました。単一のPod内の複数のコンテナは、クラスター内の同じ物理または仮想マシン上で、自動的に同じ場所に配置・スケジューリングされます。コンテナ間では、リソースや依存関係を共有したり、お互いに通信したり、停止するときにはタイミングや方法を協調して実行できます。 + +たとえば、あるコンテナが共有ボリューム内のファイルを配信するウェブサーバーとして動作し、別の「サイドカー」コンテナがリモートのリソースからファイルをアップデートするような構成が考えられます。この構成を以下のダイアグラムに示します。 + +{{< figure src="/images/docs/pod.svg" alt="Podのダイアグラムの例" width="50%" >}} + +Podによっては、{{< glossary_tooltip text="appコンテナ" term_id="app-container" >}}に加えて{{< glossary_tooltip text="initコンテナ" term_id="init-container" >}}を持っている場合があります。initコンテナはappコンテナが起動する前に実行・完了するコンテナです。 + +Podは、Podを構成する複数のコンテナに対して、[ネットワーク](#pod-networking)と[ストレージ](#pod-storage)の2種類の共有リソースを提供します。 + +## Podを利用する + +通常Kubernetesでは、たとえ単一のコンテナしか持たないシングルトンのPodだとしても、個別のPodを直接作成することはめったにありません。その理由は、Podがある程度一時的で使い捨てできる存在として設計されているためです。Podが作成されると(あなたが直接作成した場合でも、{{< glossary_tooltip text="コントローラー" term_id="controller" >}}が間接的に作成した場合でも)、新しいPodはクラスター内の{{< glossary_tooltip term_id="node" >}}上で実行されるようにスケジューリングされます。Podは、実行が完了するか、Podオブジェクトが削除されるか、リソース不足によって*強制退去*されるか、ノードが停止するまで、そのノード上にとどまります。 + +{{< note >}} +Pod内のコンテナの再起動とPodの再起動を混同しないでください。Podはプロセスではなく、コンテナが実行するための環境です。Podは削除されるまでは残り続けます。 +{{< /note >}} + +Podオブジェクトのためのマニフェストを作成したときは、指定したPodの名前が有効な[DNSサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)であることを確認してください。 + +### Podとコンテナコントローラー {#pods-and-controllers} + +ワークロードリソースは、複数のPodを作成・管理するために利用できます。リソースに対応するコントローラーが、複製やロールアウトを扱い、Podの障害時には自動回復を行います。たとえば、あるノードに障害が発生した場合、コントローラーはそのノードの動作が停止したことを検知し、代わりのPodを作成します。そして、スケジューラーが代わりのPodを健全なノード上に配置します。 + +以下に、1つ以上のPodを管理するワークロードリソースの一例をあげます。 + +* {{< glossary_tooltip text="Deployment" term_id="deployment" >}} +* {{< glossary_tooltip text="StatefulSet" term_id="statefulset" >}} +* {{< glossary_tooltip text="DaemonSet" term_id="daemonset" >}} + +### Podテンプレート + +{{< glossary_tooltip text="workload" term_id="workload" >}}リソース向けのコントローラーは、Podを*Podテンプレート*を元に作成し、あなたの代わりにPodを管理してくれます。 + +PodTemplateはPodを作成するための仕様で、[Deployment](/ja/docs/concepts/workloads/controllers/deployment/)、[Job](/ja/docs/concepts/workloads/controllers/job/)、[DaemonSet](/ja/docs/concepts/workloads/controllers/daemonset/)などのワークロードリソースの中に含まれています。 + +ワークロードリソースに対応する各コントローラーは、ワークロードオブジェクト内にある`PodTemplate`を使用して実際のPodを作成します。`PodTemplate`は、アプリを実行するために使われるワークロードリソースがどんな種類のものであれ、その目的の状態の一部を構成するものです。 + +以下は、単純なJobのマニフェストの一例で、1つのコンテナを実行する`template`があります。Pod内のコンテナはメッセージを出力した後、一時停止します。 + +```yaml +apiVersion: batch/v1 +kind: Job +metadata: + name: hello +spec: + template: + # これがPodテンプレートです + spec: + containers: + - name: hello + image: busybox + command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600'] + restartPolicy: OnFailure + # Podテンプレートはここまでです +``` + +Podテンプレートを修正するか新しいPodに切り替えたとしても、すでに存在するPodには直接の影響はありません。ワークロードリソース内のPodテンプレートを変更すると、そのリソースは更新されたテンプレートを使用して代わりとなるPodを作成する必要があります。 + +たとえば、StatefulSetコントローラーは、各StatefulSetごとに、実行中のPodが現在のPodテンプレートに一致することを保証します。Podテンプレートを変更するためにStatefulSetを編集すると、StatefulSetは更新されたテンプレートを元にした新しいPodを作成するようになります。最終的に、すべての古いPodが新しいPodで置き換えられ、更新は完了します。 + +各ワークロードリソースは、Podテンプレートへの変更を処理するための独自のルールを実装しています。特にStatefulSetについて更に詳しく知りたい場合は、StatefulSetの基本チュートリアル内の[アップデート戦略](/ja/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets)を読んでください。 + +ノード上では、{{< glossary_tooltip term_id="kubelet" text="kubelet" >}}はPodテンプレートに関する詳細について監視や管理を直接行うわけではありません。こうした詳細は抽象化されています。こうした抽象化や関心の分離のおかげでシステムのセマンティクスが単純化され、既存のコードを変更せずにクラスターの動作を容易に拡張できるようになっているのです。 + +## リソースの共有と通信 + +Podは、データの共有と構成するコンテナ間での通信を可能にします。 + +### Pod内のストレージ {#pod-storage} + +Podでは、共有ストレージである{{< glossary_tooltip text="ボリューム" term_id="volume" >}}の集合を指定できます。Pod内のすべてのコンテナは共有ボリュームにアクセスできるため、それら複数のコンテナでデータを共有できるようになります。また、ボリュームを利用すれば、Pod内のコンテナの1つに再起動が必要になった場合にも、Pod内の永続化データを保持し続けられるようにできます。Kubernetesの共有ストレージの実装方法とPodで利用できるようにする方法に関するさらに詳しい情報は、[ストレージ](/ja/docs/concepts/storage/)を読んでください。 + +### Podネットワーク + +各Podには、各アドレスファミリーごとにユニークなIPアドレスが割り当てられます。Pod内のすべてのコンテナは、IPアドレスとネットワークポートを含むネットワーク名前空間を共有します。Podの中では(かつその場合に**のみ**)、そのPod内のコンテナは`localhost`をしようして他のコンテナと通信できます。Podの内部にあるコンテナが*Podの外部にある*エンティティと通信する場合、(ポートなどの)共有ネットワークリソースの使い方をコンテナ間で調整しなければなりません。Pod内では、コンテナはIPアドレスとポートの空間を共有するため、`localhost`で他のコンテナにアクセスできます。また、Pod内のコンテナは、SystemVのセマフォやPOSIXの共有メモリなど、標準のプロセス間通信を使って他のコンテナと通信することもできます。異なるPod内のコンテナは異なるIPアドレスを持つため、[特別な設定](/docs/concepts/policy/pod-security-policy/)をしない限りIPCで通信することはできません。異なるPod上で実行中のコンテナ間でやり取りをしたい場合は、IPネットワークを使用して通信できます。 + +Pod内のコンテナは、システムのhostnameがPodに設定した`name`と同一であると考えます。ネットワークについての詳しい情報は、[ネットワーク](/ja/docs/concepts/cluster-administration/networking/)で説明しています。 + +## コンテナの特権モード + +Pod内のどんなコンテナも、`privileged`フラグをコンテナのspecの[security context](/docs/tasks/configure-pod-container/security-context/)に設定することで、特権モード(privileged mode)を有効にできます。これは、ネットワークスタックの操作やハードウェアデバイスへのアクセスなど、オペレーティングシステムの管理者の権限が必要なコンテナの場合に役に立ちます。特権コンテナ内のプロセスはコンテナ外のプロセスが利用できるのとほぼ同等の権限を取得します。 + +{{< note >}} +この設定を有効にするには、{{< glossary_tooltip text="コンテナランタイム" term_id="container-runtime" >}}が特権コンテナの概念をサポートしていなければなりません。 +{{< /note >}} + +## static Pod + +*static Pod*は、{{< glossary_tooltip text="APIサーバー" term_id="kube-apiserver" >}}には管理されない、特定のノード上でkubeletデーモンによって直接管理されるPodのことです。大部分のPodはコントロープレーン(たとえば{{< glossary_tooltip text="Deployment" term_id="deployment" >}})によって管理されますが、static Podの場合はkubeletが各static Podを直接管理します(障害時には再起動します)。 + +static Podは常に特定のノード上の1つの{{< glossary_tooltip term_id="kubelet" >}}に紐付けられます。static Podの主な用途は、セルフホストのコントロールプレーンを実行すること、言い換えると、kubeletを使用して個別の[コントロールプレーンコンポーネント](/ja/docs/concepts/overview/components/#control-plane-components)を管理することです。 + +kubeletは自動的にKubernetes APIサーバー上に各static Podに対応する{{< glossary_tooltip text="ミラーPod" term_id="mirror-pod" >}}の作成を試みます。つまり、ノード上で実行中のPodはAPIサーバー上でも見えるようになるけれども、APIサーバー上から制御はできないということです。 + +## {{% heading "whatsnext" %}} + +* [Podのライフサイクル](/ja/docs/concepts/workloads/pods/pod-lifecycle/)について学ぶ。 +* [PodPreset](/ja/docs/concepts/workloads/pods/podpreset/)について学ぶ。 +* [RuntimeClass](/ja/docs/concepts/containers/runtime-class/)と、それを用いてPodごとに異なるコンテナランタイム設定する方法について学ぶ。 +* [Podトポロジー分布制約](/docs/concepts/workloads/pods/pod-topology-spread-constraints/)について読む。 +* [PodDisruptionBudget](/ja/docs/concepts/workloads/pods/disruptions/)と、それを使用してクラスターの停止(disruption)中にアプリケーションの可用性を管理する方法について読む。 +* PodはKubernetes REST API内のトップレベルのリソースです。[Pod](/ja/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#pod-v1-core)オブジェクトの定義では、オブジェクトの詳細について記述されています。 +* [The Distributed System Toolkit: Patterns for Composite Containers](https://kubernetes.io/blog/2015/06/the-distributed-system-toolkit-patterns)では、2つ以上のコンテナを利用する場合の一般的なレイアウトについて説明しています。 + +Kubernetesが共通のPod APIを他のリソース内(たとえば{{< glossary_tooltip text="StatefulSet" term_id="statefulset" >}}や{{< glossary_tooltip text="Deployment" term_id="deployment" >}}など)にラッピングしている理由の文脈を理解するためには、Kubernetes以前から存在する以下のような既存技術について読むのが助けになります。 + + * [Aurora](https://aurora.apache.org/documentation/latest/reference/configuration/#job-schema) + * [Borg](https://research.google.com/pubs/pub43438.html) + * [Marathon](https://mesosphere.github.io/marathon/docs/rest-api.html) + * [Omega](https://research.google/pubs/pub41684/) + * [Tupperware](https://engineering.fb.com/data-center-engineering/tupperware/) From c1026c7bd6b87c1196024180d97fe1d7bf5292e3 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji Date: Fri, 16 Apr 2021 14:21:55 +0000 Subject: [PATCH 069/221] Add an anthor link to basic-stateful-set --- .../docs/tutorials/stateful-application/basic-stateful-set.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/tutorials/stateful-application/basic-stateful-set.md b/content/ja/docs/tutorials/stateful-application/basic-stateful-set.md index e7de7cea05..e14b1e5925 100644 --- a/content/ja/docs/tutorials/stateful-application/basic-stateful-set.md +++ b/content/ja/docs/tutorials/stateful-application/basic-stateful-set.md @@ -421,7 +421,7 @@ www-web-4 Bound pvc-e11bb5f8-b508-11e6-932f-42010a800002 1Gi RWO まだ、5つのPersistentVolumeClaimと5つのPersistentVolumeが残っています。[安定したストレージへの書き込み](#writing-to-stable-storage)を読むと、StatefulSetのPodが削除されても、StatefulSetのPodにマウントされたPersistentVolumeは削除されないと書かれています。このことは、StatefulSetのスケールダウンによってPodが削除された場合にも当てはまります。 -## StatefulSetsを更新する +## StatefulSetsを更新する {#updating-statefulsets} Kubernetes 1.7以降では、StatefulSetコントローラーは自動アップデートをサポートしています。使われる戦略は、StatefulSet APIオブジェクトの`spec.updateStrategy`フィールドによって決まります。この機能はコンテナイメージのアップグレード、リソースのrequestsやlimits、ラベル、StatefulSet内のPodのアノテーションの更新時に利用できます。有効なアップデートの戦略は、`RollingUpdate`と`OnDelete`の2種類です。 From e7813467312ac97fa66a86cbe6dd225057a135f3 Mon Sep 17 00:00:00 2001 From: JIIOryo Date: Sat, 17 Apr 2021 14:50:39 +0900 Subject: [PATCH 070/221] Update: ja/docs/concepts/services-networking/network-policies.md --- .../services-networking/network-policies.md | 35 ++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/content/ja/docs/concepts/services-networking/network-policies.md b/content/ja/docs/concepts/services-networking/network-policies.md index 61a798b947..bac1f12ed0 100644 --- a/content/ja/docs/concepts/services-networking/network-policies.md +++ b/content/ja/docs/concepts/services-networking/network-policies.md @@ -6,9 +6,17 @@ weight: 50 -ネットワークポリシーは、{{< glossary_tooltip text="Pod" term_id="pod">}}のグループが、Pod相互や他のネットワークエンドポイントと通信する場合に許可を与える方法を指定するための仕様です。 +IPアドレスまたはポートのレベル(OSI参照モデルのレイヤ3または4)でトラフィックフローを制御したい場合、クラスター内の特定のアプリケーションにKubernetesのネットワークポリシーを使用することを検討してください。ネットワークポリシーはアプリケーション中心の構造であり、{{}}がネットワークを介して多様な「エンティティ」(「エンドポイント」や「Service」のようなKubernetesに含まれる特定の意味を持つ共通の用語との重複を避けるため、ここではエンティティという単語を使用します。)と通信する方法を指定できます。 -NetworkPolicyリソースは、{{< glossary_tooltip text="ラベル" term_id="label">}}を使用してPodを選択し、選択したPodに対してどんなトラフィックを許可するかを指定するルールを定義します。 +Podが通信できるエンティティは以下の3つの識別子の組み合わせによって識別されます。 + +1. 許可されている他のPod (例外: Podはそれ自体へのアクセスをブロックできません) +2. 許可されている名前空間 +3. IPブロック (例外: PodまたはノードのIPアドレスに関係なく、Podが実行されているノードとの間のトラフィックは常に許可されます。) + +Podベースもしくは名前空間ベースのネットワークポリシーを定義する場合、{{}}を使用してセレクターに一致するPodとの間で許可されるトラフィックを指定します。 + +一方でIPベースのネットワークポリシーが作成されると、IPブロック(CIDRの範囲)に基づいてポリシーが定義されます。 ## 前提条件 @@ -186,14 +194,33 @@ __ipBlock__: 特定のIPのCIDRの範囲を選択して、ingressの送信元ま ## SCTPのサポート -{{< feature-state for_k8s_version="v1.12" state="alpha" >}} +{{< feature-state for_k8s_version="v1.19" state="beta" >}} -この機能を利用するには、クラスター管理者がAPIサーバーで`--feature-gates=SCTPSupport=true,…`と指定して、`SCTPSupport`[フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)を有効にする必要があります。フィーチャーゲートが有効になれば、NetworkPolicyの`protocol`フィールドに`SCTP`が指定できるようになります。 +ベータ版の機能として、これはデフォルトで有効化されます。 +クラスターレベルでSCTPを無効化するために、クラスター管理者はAPIサーバーで`--feature-gates=SCTPSupport=false,…`と指定して、`SCTPSupport`[フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)を無効にする必要があります。 {{< note >}} SCTPプロトコルのネットワークポリシーをサポートする{{< glossary_tooltip text="CNI" term_id="cni" >}}プラグインを使用している必要があります。 {{< /note >}} +## ネットワークポリシーでできないこと (少なくともまだ) + +Kubernetes1.20現在、ネットワークポリシーAPIに以下の機能は存在しません。 +しかし、オペレーティングシステムのコンポーネント(SELinux、OpenVSwitch、IPTablesなど)、レイヤ7の技術(Ingressコントローラー、サービスメッシュ実装)、もしくはアドミッションコントローラーを使用して回避策を実装できる場合があります。 +Kubernetesのネットワークセキュリティを初めて使用する場合は、ネットワークポリシーAPIを使用して以下ののユーザーストーリーを(まだ)実装できないことに注意してください。これらのユーザーストーリーの一部(全てではありません)は、ネットワークポリシーAPIの将来のリリースで活発に議論されています。 + +- クラスター内トラフィックを強制的に共通ゲートウェイを通過させる (これは、サービスメッシュもしくは他のプロキシで提供するのが最適な場合があります。) +- TLS関連のもの (これにはサービスメッシュまたはIngressコントローラを使用します。) +- ノードの固有のポリシー (これらにはCIDR表記を使用できますが、Kubernetesのアイデンティティでノードを指定することはできません。) +- 名前空間またはサービスを名前で指定する (ただし、Podまたは名前空間を{{< glossary_tooltip text="ラベル" term_id="label" >}}で指定することができます。これは多くの場合で実行可能な回避策です。) +- サードパーティによって実行される「ポリシー要求」の作成または管理 +- 全ての名前空間もしくはPodに適用されるデフォルトのポリシー (これを実現できるサードパーティのKubernetesディストリビューションとプロジェクトがいくつか存在します。) +- 高度なポリシークエリと到達可能性ツール +- 単一のポリシー宣言でポートの範囲を指定する機能 +- ネットワークセキュリティイベント(例えばブロックされた接続や受け入れられた接続)をログに記録する機能 +- ポリシーを明示的に拒否する機能 (現在、ネットワークポリシーのモデルはデフォルトで拒否されており、許可ルールを追加する機能のみが存在します。) +- ループバックまたは内向きのホストトラフィックを拒否する機能 (Podは現在localhostのアクセスやそれらが配置されているノードからのアクセスをブロックすることはできません。) + ## {{% heading "whatsnext" %}} - [ネットワークポリシーを宣言する](/ja/docs/tasks/administer-cluster/declare-network-policy/)で追加の例の説明を読む。 From c6d3383cb21bb83541a338a004d17ba81d3638f8 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji Date: Sat, 17 Apr 2021 11:02:22 +0000 Subject: [PATCH 071/221] Translate "thirdparty_message" message --- i18n/ja.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/i18n/ja.toml b/i18n/ja.toml index a7a103f435..b100192422 100644 --- a/i18n/ja.toml +++ b/i18n/ja.toml @@ -181,6 +181,9 @@ other = "始める前に" [subscribe_button] other = "購読する" +[thirdparty_message] +other = """このセクションはKubernetesに必要な機能を提供するサードパーティのプロジェクトへリンクしています。Kubernetesプロジェクトの作者はこれらのプロジェクトへの責任を持ちません。このページはプロジェクトをアルファベット順に列挙しており、CNCFウェブサイトガイドラインに従っています。このリストにプロジェクトを追加する場合は、変更を送信する前にコンテンツガイドを読んでください。""" + [ui_search_placeholder] other = "検索" From b7db2dd1630e7418d1db48d3f50dbed8d84336c1 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji Date: Sat, 17 Apr 2021 11:02:34 +0000 Subject: [PATCH 072/221] Add an anchor text --- content/ja/docs/contribute/style/content-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/contribute/style/content-guide.md b/content/ja/docs/contribute/style/content-guide.md index eb165ca733..4161d1c489 100644 --- a/content/ja/docs/contribute/style/content-guide.md +++ b/content/ja/docs/contribute/style/content-guide.md @@ -31,7 +31,7 @@ Kubernetesのドキュメントにサードパーティーのコンテンツを - コンテンツがプロジェクト外のソフトウェアのドキュメントとなるが、Kubernetesを機能させるために必要である場合 - コンテンツがkubernetes.ioの正規のコンテンツであるか、他の場所の正規のコンテンツへのリンクである場合 -### サードパーティーのコンテンツ +### サードパーティーのコンテンツ {#third-party-content} Kubernetesのドキュメントには、Kubernetesプロジェクト([kubernetes](https://github.com/kubernetes)および[kubernetes-sigs](https://github.com/kubernetes-sigs) GitHub organizationsに存在するプロジェクト)の適用例が含まれています。 From 7b046958fd81330f3314020800488da16edc5429 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji Date: Sat, 17 Apr 2021 21:26:02 +0900 Subject: [PATCH 073/221] Change the page title from "Secrets" to "Secret" --- content/ja/docs/concepts/configuration/secret.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/configuration/secret.md b/content/ja/docs/concepts/configuration/secret.md index 9ae7c55067..01253eed58 100644 --- a/content/ja/docs/concepts/configuration/secret.md +++ b/content/ja/docs/concepts/configuration/secret.md @@ -1,5 +1,5 @@ --- -title: Secrets +title: Secret content_type: concept feature: title: Secretと構成管理 From c338cba3ea9660ddf9dbdbd6e00f8d9e00fe5a87 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji Date: Sat, 17 Apr 2021 12:37:36 +0000 Subject: [PATCH 074/221] Update content/ja/docs/concepts/security/overview.md --- content/ja/docs/concepts/security/overview.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/ja/docs/concepts/security/overview.md b/content/ja/docs/concepts/security/overview.md index 0157b28f78..ca9505a6dd 100644 --- a/content/ja/docs/concepts/security/overview.md +++ b/content/ja/docs/concepts/security/overview.md @@ -82,12 +82,12 @@ Kubernetesを保護する為には2つの懸念事項があります。 ワークロードセキュリティに関する懸念事項 | 推奨事項 | ------------------------------ | --------------------- | -RBAC認可(Kubernetes APIへのアクセス) | https://kubernetes.io/docs/reference/access-authn-authz/rbac/ -認証 | https://kubernetes.io/docs/reference/access-authn-authz/controlling-access/ | +RBAC認可(Kubernetes APIへのアクセス) | https://kubernetes.io/ja/docs/reference/access-authn-authz/rbac/ +認証 | https://kubernetes.io/docs/concepts/security/controlling-access/ | アプリケーションのSecret管理(およびetcdへの保存時に暗号化) | https://kubernetes.io/ja/docs/concepts/configuration/secret/
https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/ | PodSecurityPolicy | https://kubernetes.io/docs/concepts/policy/pod-security-policy/ | Quality of Service (およびクラスターリソース管理) | https://kubernetes.io/ja/docs/tasks/configure-pod-container/quality-service-pod/ | -NetworkPolicy | https://kubernetes.io/docs/concepts/services-networking/network-policies/ | +NetworkPolicy | https://kubernetes.io/ja/docs/concepts/services-networking/network-policies/ | Kubernetes IngressのTLS | https://kubernetes.io/ja/docs/concepts/services-networking/ingress/#tls | @@ -123,10 +123,10 @@ TLS経由のアクセスのみ | コードがTCP通信を必要とする場合 関連するKubernetesセキュリティについて学びます。 -* [Podのセキュリティ基準](/docs/concepts/security/pod-security-standards/) -* [PodのNetworkPolicy](/docs/concepts/services-networking/network-policies/) +* [Podセキュリティの標準](/ja/docs/concepts/security/pod-security-standards/) +* [Podのネットワークポリシー]](/ja/docs/concepts/services-networking/network-policies/) +* [Kubernetes APIへのアクセスを制御する](/docs/concepts/security/controlling-access) * [クラスターの保護](/docs/tasks/administer-cluster/securing-a-cluster/) -* [APIアクセスコントロール](/docs/reference/access-authn-authz/controlling-access/) * コントロールプレーンとの[通信時のデータ暗号化](/docs/tasks/tls/managing-tls-in-a-cluster/) * [保存時のデータ暗号化](/docs/tasks/administer-cluster/encrypt-data/) * [Kubernetes Secret](/ja/docs/concepts/configuration/secret/) From ce1f6287326a6fcaa75166adda292a349d93d496 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji Date: Sat, 17 Apr 2021 14:46:03 +0000 Subject: [PATCH 075/221] Translate tasks/manage-kubernetes-objects/ into Japanese --- content/ja/docs/tasks/manage-kubernetes-objects/_index.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 content/ja/docs/tasks/manage-kubernetes-objects/_index.md diff --git a/content/ja/docs/tasks/manage-kubernetes-objects/_index.md b/content/ja/docs/tasks/manage-kubernetes-objects/_index.md new file mode 100644 index 0000000000..16150cf3d7 --- /dev/null +++ b/content/ja/docs/tasks/manage-kubernetes-objects/_index.md @@ -0,0 +1,5 @@ +--- +title: "Kubernetesオブジェクトの管理" +description: Kubernetes APIと対話するための宣言型および命令型のパラダイム。 +weight: 25 +--- From fdcc5d6f9d7674a2108787ff400a5d0be0da2813 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji Date: Sat, 17 Apr 2021 11:20:21 +0000 Subject: [PATCH 076/221] Update ingress-controllers.md --- .../ingress-controllers.md | 43 ++++++++----------- 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/content/ja/docs/concepts/services-networking/ingress-controllers.md b/content/ja/docs/concepts/services-networking/ingress-controllers.md index cbd652d17e..c1bca823a0 100644 --- a/content/ja/docs/concepts/services-networking/ingress-controllers.md +++ b/content/ja/docs/concepts/services-networking/ingress-controllers.md @@ -11,47 +11,42 @@ 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)のコントローラーをサポートし、保守しています。 - - +プロジェクトとしてのKubernetesは現在、[AWS](https://github.com/kubernetes-sigs/aws-load-balancer-controller#readme)、[GCE](https://git.k8s.io/ingress-gce/README.md#readme)、および[nginx](https://git.k8s.io/ingress-nginx/README.md#readme)のIngressコントローラーをサポート・保守しています。 ## 追加のコントローラー {#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](https://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 Container Ingress Services for Kubernetes](https://clouddocs.f5.com/containers/latest/userguide/kubernetes/)の[サポートと保守](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)のサポートと保守を提供しています。 +{{% thirdparty-content %}} + +* [AKS Application Gateway Ingress Controller](https://github.com/Azure/application-gateway-kubernetes-ingress)は、[Azure Application Gateway](https://docs.microsoft.com/azure/application-gateway/overview)を設定するIngressコントローラーです。 +* [Ambassador](https://www.getambassador.io/) API Gatewayは[Envoy](https://www.envoyproxy.io)ベースのIngressコントローラーです。 +* [Citrix ingress controller](https://github.com/citrix/citrix-k8s-ingress-controller#readme)は、Citrix Application Delivery Controllerで動作します。 +* [Contour](https://projectcontour.io/)は、[Envoy](https://www.envoyproxy.io/)ベースのIngressコントローラーです。 +* F5 BIG-IPの[Container Ingress Services for Kubernetes](https://clouddocs.f5.com/containers/latest/userguide/kubernetes/)はF5 BIG-IPの仮想サーバー上でIngressの設定を可能にします。 +* [Gloo](https://gloo.solo.io)は[Envoy](https://www.envoyproxy.io)をベースにしたオープンソースのIngressコントローラーです。 +* [HAProxy Ingress](https://haproxy-ingress.github.io)は、[HAProxy](http://www.haproxy.org/#desc)用のIngressコントローラーです。 +* [HAProxy Ingress Controller for Kubernetes](https://github.com/haproxytech/kubernetes-ingress)も、[HAProxy](http://www.haproxy.org/#desc)用のIngressコントローラーです。 +* [Istio Ingress](https://istio.io/latest/docs/tasks/traffic-management/ingress/kubernetes-ingress/)は、[Istio](https://istio.io/)ベースのIngressコントローラーです。 +* [Kong Ingress Controller for Kubernetes](https://github.com/Kong/kubernetes-ingress-controller#readme)は、[Kong Gateway](https://konghq.com/kong/)向けのIngressコントローラーです。 +* [NGINX Ingress Controller for Kubernetes](https://www.nginx.com/products/nginx/kubernetes-ingress-controller)は、[NGINX](https://www.nginx.com/resources/glossary/nginx/)ウェブサーバーで(プロキシとして)動作します。 * [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)による商用サポートもあります。 +* [Traefik Kubernetes Ingress provider](https://doc.traefik.io/traefik/providers/kubernetes-ingress/)は、[Traefik](https://github.com/containous/traefik) proxy向けのIngressコントローラーです。 +* [Voyager](https://appscode.com/products/voyager)は、[HAProxy](http://www.haproxy.org/#desc)向けのIngressコントローラーです。 ## 複数の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コントローラーは、好きな数だけ](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) +* [Ingress](/ja/docs/concepts/services-networking/ingress/)についてさらに学ぶ。 +* [Minikube上でNGINX Ingressコントローラーを使用してIngressをセットアップする](/ja/docs/tasks/access-application-cluster/ingress-minikube)。 From 1fd1b1ee94fd345156efbf0241d3f2dc37041b57 Mon Sep 17 00:00:00 2001 From: YukiKasuya Date: Mon, 19 Apr 2021 13:27:04 +0900 Subject: [PATCH 077/221] Update ja/docs/concepts/overview/kubernetes-api.md --- .../docs/concepts/overview/kubernetes-api.md | 117 +++++++----------- 1 file changed, 44 insertions(+), 73 deletions(-) diff --git a/content/ja/docs/concepts/overview/kubernetes-api.md b/content/ja/docs/concepts/overview/kubernetes-api.md index 251f671b6d..7b20192ae7 100644 --- a/content/ja/docs/concepts/overview/kubernetes-api.md +++ b/content/ja/docs/concepts/overview/kubernetes-api.md @@ -18,22 +18,13 @@ APIサーバーは、エンドユーザー、クラスターのさまざまな Kubernetes APIを使用すると、Kubernetes API内のオブジェクトの状態をクエリで操作できます(例:Pod、Namespace、ConfigMap、Events)。 -APIエンドポイント、リソースタイプ、サンプルについては[APIリファレンス](/docs/reference/kubernetes-api/)で説明しています。 +ほとんどの操作は、APIを使用している[kubectl](/docs/reference/kubectl/overview/)コマンドラインインターフェースもしくは[kubeadm](/docs/reference/setup-tools/kubeadm/)のような別のコマンドラインツールを通して実行できます。 +RESTコールを利用して直接APIにアクセスすることも可能です。 + +Kubernetes APIを利用してアプリケーションを書いているのであれば、[client libraries](/docs/reference/using-api/client-libraries/)のうちひとつの利用を考えてみてください。 -## APIの変更 - -成功を収めているシステムはすべて、新しいユースケースの出現や既存の変化に応じて成長し、変化する必要があります。 -したがって、Kubernetesには、Kubernetes APIを継続的に変更および拡張できる設計機能があります。 -Kubernetesプロジェクトは、既存のクライアントとの互換性を破壊しないこと、およびその互換性を一定期間維持して、他のプロジェクトが適応する機会を提供することを目的としています。 - -基本的に、新しいAPIリソースと新しいリソースフィールドは追加することができます。 -リソースまたはフィールドを削除するには、[API非推奨ポリシー](/docs/reference/using-api/deprecation-policy/)に従ってください。 - -互換性のある変更の構成要素とAPIの変更方法については、[APIの変更](https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md#readme)で詳しく説明しています。 - - ## OpenAPI 仕様 {#api-specification} 完全なAPIの詳細は、[OpenAPI](https://www.openapis.org/)を使用して文書化されています。 @@ -43,6 +34,7 @@ Kubernetes APIサーバーは、`/openapi/v2`エンドポイントを介してOp + @@ -70,74 +62,53 @@ Kubernetes APIサーバーは、`/openapi/v2`エンドポイントを介してOp -
OpenAPI v2クエリの有効なリクエストヘッダー値
Headerapplication/jsonを提供
OpenAPI v2クエリの有効なリクエストヘッダー値
-Kubernetesは、他の手段として主にクラスター間の連携用途向けのAPIに、Protocol buffersをベースにしたシリアライズフォーマットを実装しており、そのフォーマットの概要は[デザイン提案](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/protobuf.md)に記載されています。また各スキーマのIDFファイルは、APIオブジェクトを定義しているGoパッケージ内に配置されています。 - -## APIバージョニング - -フィールドの削除やリソース表現の再構成を簡単に行えるようにするため、Kubernetesは複数のAPIバージョンをサポートしており、`/api/v1`や`/apis/rbac.authorization.k8s.io/v1alpha1`のように、それぞれ異なるAPIのパスが割り当てられています。 - -APIが、システムリソースと動作について明確かつ一貫したビューを提供し、サポート終了、実験的なAPIへのアクセス制御を有効にするために、リソースまたはフィールドレベルではなく、APIレベルでバージョンが行われます。 - -JSONとProtocol Buffersのシリアライズスキーマも、スキーマ変更に関して同じガイドラインに従います。ここから以下の説明は、双方のフォーマットをカバーしています。 - -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)に記載されています。下記に簡潔にまとめます: - -- アルファレベル(版): - - バージョン名に`alpha`を含みます(例、`v1alpha1`)。 - - バグが多いかもしれません。アルファ機能の有効化がバグを顕在化させるかもしれません。デフォルトでは無効となっています。 - - アルファ機能のサポートは、いつでも通知無しに取りやめられる可能性があります。 - - ソフトウェアリリース後、APIが通知無しに互換性が無い形で変更される可能性があります。 - - バグが増えるリスク、また長期サポートが無いことから、短期間のテスト用クラスターでの利用を推奨します。 -- ベータレベル(版): - - バージョン名に`beta`を含みます(例、`v2beta3`)。 - - コードは十分にテストされています。ベータ機能の有効化は安全だと考えられます。デフォルトで有効化されています。 - - 全体的な機能のサポートは取りやめられませんが、詳細は変更される可能性があります。 - - オブジェクトのスキーマ、意味はその後のベータ、安定版リリースで互換性が無い形で変更される可能性があります。その場合、次のバージョンへアップデートするための手順を提供します。その手順ではAPIオブジェクトの削除、修正、再作成が必要になるかもしれません。修正のプロセスは多少の検討が必要になるかもしれません。これは、この機能を利用しているアプリケーションでダウンタイムが必要になる可能性があるためです。 - - 今後のリリースで、互換性の無い変更が行われる可能性があるため、ビジネスクリティカルな場面以外での利用を推奨します。もし複数のクラスターを持っており、それぞれ個別にアップグレードが可能な場合、この制限の影響を緩和できるかもしれません。 - - **是非ベータ機能を試して、フィードバックをください!ベータから安定版になってしまうと、より多くの変更を加えることが難しくなってしまいます。** -- 安定版: - - バージョン名は`vX`のようになっており、`X`は整数です。 - - 安定版の機能は、今後のリリースバージョンにも適用されます。 - -## APIグループ {#api-groups} - -APIの拡張を簡易に行えるようにするため、Kubernetesは[*APIグループ*](https://git.k8s.io/community/contributors/design-proposals/api-machinery/api-group.md)を実装しました。 -APIグループは、RESTのパスとシリアライズされたオブジェクトの`apiVersion`フィールドで指定されます。 - -クラスターにはいくつかのAPIグループがあります: - -1. *core* グループ(*legacy group* とも呼ばれます)は、`/api/v1`というRESTのパスで、`apiVersion: v1`を使います。 - -1. 名前付きのグループは、`/apis/$GROUP_NAME/$VERSION`というRESTのパスで、`apiVersion: $GROUP_NAME/$VERSION`(例、`apiVersion: batch/v1`)を使います。Kubernetesの[APIリファレンス](/docs/reference/kubernetes-api/)にすべての使用可能なAPIグループのリストがあります。 - -[カスタムリソース](/docs/concepts/extend-kubernetes/api-extension/custom-resources/)でAPIを拡張するために、2つの方法があります: - -1. [カスタムリソース定義](/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/)は、APIサーバーが選択したリソースAPIを提供する方法を宣言的に定義できます。 -1. [独自の拡張APIサーバーを実装](/docs/tasks/extend-kubernetes/setup-extension-api-server/)し、[アグリゲーター](/docs/tasks/extend-kubernetes/configure-aggregation-layer/)を使用してクライアントに対してシームレスにすることもできます。 - -## APIグループの有効化、無効化 - -いくつかのリソースとAPIグループはデフォルトで有効になっています。それらは、kube-apiserverのコマンドラインオプションとしてAPIサーバーの`--runtime-config`設定で、有効化、無効化できます。 - -`--runtime-config`は、カンマ区切りの複数の値を設定可能です。例えば、batch/v1を無効化する場合、`--runtime-config=batch/v1=false`をセットし、batch/v2alpha1を有効化する場合、`--runtime-config=batch/v2alpha1`をセットします。このフラグは、APIサーバーのランタイム設定を表すkey=valueのペアを、カンマ区切りで指定したセットを指定可能です。 - -{{< note >}}APIグループ、リソースの有効化、無効化は、`--runtime-config`の変更を反映するため、kube-apiserverとkube-controller-managerの再起動が必要です。{{< /note >}} +Kubernetesは、他の手段として主にクラスター間の連携用途向けのAPIに、Protocol buffersをベースにしたシリアライズフォーマットを実装しています。このフォーマットに関しては、[Kubernetes Protobuf serialization](https://github.com/kubernetes/community/blob/master/contributors/des ign-proposals/api-machinery/protobuf.md)デザイン提案を参照してください。また、各スキーマのInterface Definition Language(IDL)ファイルは、APIオブジェクトを定義しているGoパッケージないに配置されています。 ## 永続性 KubernetesはAPIリソースの観点からシリアル化された状態を{{< glossary_tooltip term_id="etcd" >}}に書き込むことで保存します。 +## APIグループとバージョニング + +フィールドの削除やリソース表現の再構成を簡単に行えるようにするため、Kubernetesは複数のAPIバージョンをサポートしており、`/api/v1`や`/apis/rbac.authorization.k8s.io/v1alpha1`のように、それぞれ異なるAPIのパスが割り当てられています。 + +APIが、システムリソースと動作について明確かつ一貫したビューを提供し、サポート終了、実験的なAPIへのアクセス制御を有効にするために、リソースまたはフィールドレベルではなく、APIレベルでバージョンが行われます。 + +APIの発展や拡張を簡易に行えるようにするため、Kubernetesは[enabled or disabled](/docs/reference/using-api/#enabling-or-disabling)を行える[APIグループ](/docs/reference/using-api/#api-groups)を実装しました。 + +APIリソースは、APIグループ、リソースタイプ、ネームスペース(namespacedリソースのための)、名前によって区別されます。APIサーバーは、APIバージョン間の変換を透過的に処理します。すべてのバージョンの違いは、実際のところ同じ永続データとして表現されます。APIサーバーは、同じ基本的なデータを複数のAPIバージョンで提供することができます。 + +例えば、同じリソースで`v1`と`v1beta1`の2つのバージョンが有ることを考えてみます。`v1beta1`バージョンのAPIを利用しオブジェクトを最初に作成したとして、`v1beta1`もしくは`v1`どちらのAPIバージョンを利用してもオブジェクトのread、update、deleteができます。 + +## APIの変更 + +成功を収めているシステムはすべて、新しいユースケースの出現や既存の変化に応じて成長し、変化する必要があります。 +したがって、Kubernetesには、Kubernetes APIを継続的に変更および拡張できる設計機能があります。 +Kubernetesプロジェクトは、既存のクライアントとの互換性を破壊しないこと、およびその互換性を一定期間維持して、他のプロジェクトが適応する機会を提供することを目的としています。 + +基本的に、新しいAPIリソースと新しいリソースフィールドは追加することができます。 +リソースまたはフィールドを削除するには、[API非推奨ポリシー](/docs/reference/using-api/deprecation-policy/)に従ってください。 + +Kubernetesは、公式のKubernetes APIが一度一般提供(GA)に達した場合、通常は`v1`APIバージョンです、互換性を維持することを強い責任があります。さらに、Kubernetesは_beta_についても可能な限り互換性を維持し続けます。ベータAPIを採用した場合、その機能が安定版になったあとでも、APIを利用してクラスタを操作し続けることができます。 + +{{< note >}} +Kubernetesは、_alpha_APIバージョンについても互換性の維持に注力しますが、いくつかの事情により不可である場合もあります。アルファAPIバージョンを使っている場合、クラスタのアップグレードやAPIが変更された場合に備えて、Kubernetesのリリースノートを確認してください。 +{{< /note >}} + +## APIの拡張 + +Kubernetes APIは2つの方法で拡張できます。 + +1. [カスタムリソース](/ja/docs/concepts/extend-kubernetes/api-extension/custom-resources/)は、APIサーバーが選択したリソースAPIをどのように提供するかを宣言的に定義します。 +1. [アグリゲーションレイヤー](/ja/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/)を実装することでKubernetes APIを拡張することもできます。 + ## {{% heading "whatsnext" %}} -[APIアクセスの制御](/docs/reference/access-authn-authz/controlling-access/)は、クラスターがAPIアクセスの認証と承認を管理する方法を説明しています。 - -全体的なAPI規則は、[API規則](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#api-conventions)の資料で説明されています。 - -APIエンドポイント、リソースタイプ、サンプルについては、[APIリファレンス](/docs/reference/kubernetes-api/)をご覧ください。 +- 自分自身で[CustomResourceDefinition](/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/)を追加してKubernetes APIを拡張する方法について学んでください。 +- [Controlling Access To The Kubernetes API](/docs/concepts/security/controlling-access/)では、クラスターがAPIアクセスの認証と承認を管理する方法を説明しています。 +- [APIリファレンス](/ja/docs/reference/kubernetes-api/)を読んで、APIエンドポイント、リソースタイプやサンプルについて学んでください。 +- [API changes](https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md#readme)から、互換性のある変更とは何か, どのようにAPIを変更するかについて学んでください。 From 9511002caaa8d2d49f745950dcec6906f983a08f Mon Sep 17 00:00:00 2001 From: YukiKasuya Date: Mon, 19 Apr 2021 13:31:50 +0900 Subject: [PATCH 078/221] Update ja/docs/concepts/overview/kubernetes-api.md --- content/ja/docs/concepts/overview/kubernetes-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/overview/kubernetes-api.md b/content/ja/docs/concepts/overview/kubernetes-api.md index 7b20192ae7..afd413b786 100644 --- a/content/ja/docs/concepts/overview/kubernetes-api.md +++ b/content/ja/docs/concepts/overview/kubernetes-api.md @@ -65,7 +65,7 @@ Kubernetes APIサーバーは、`/openapi/v2`エンドポイントを介してOp -Kubernetesは、他の手段として主にクラスター間の連携用途向けのAPIに、Protocol buffersをベースにしたシリアライズフォーマットを実装しています。このフォーマットに関しては、[Kubernetes Protobuf serialization](https://github.com/kubernetes/community/blob/master/contributors/des ign-proposals/api-machinery/protobuf.md)デザイン提案を参照してください。また、各スキーマのInterface Definition Language(IDL)ファイルは、APIオブジェクトを定義しているGoパッケージないに配置されています。 +Kubernetesは、他の手段として主にクラスター間の連携用途向けのAPIに、Protocol buffersをベースにしたシリアライズフォーマットを実装しています。このフォーマットに関しては、[Kubernetes Protobuf serialization](https://github.com/kubernetes/community/blob/master/contributors/des ign-proposals/api-machinery/protobuf.md)デザイン提案を参照してください。また、各スキーマのInterface Definition Language(IDL)ファイルは、APIオブジェクトを定義しているGoパッケージ内に配置されています。 ## 永続性 From c6cef1db1a7d9e0ca5fb37bf8216296dcf412661 Mon Sep 17 00:00:00 2001 From: YukiKasuya Date: Mon, 19 Apr 2021 13:42:49 +0900 Subject: [PATCH 079/221] Update ja/docs/concepts/overview/kubernetes-api.md --- content/ja/docs/concepts/overview/kubernetes-api.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/ja/docs/concepts/overview/kubernetes-api.md b/content/ja/docs/concepts/overview/kubernetes-api.md index afd413b786..df5b46d1e7 100644 --- a/content/ja/docs/concepts/overview/kubernetes-api.md +++ b/content/ja/docs/concepts/overview/kubernetes-api.md @@ -77,7 +77,7 @@ KubernetesはAPIリソースの観点からシリアル化された状態を{{< APIが、システムリソースと動作について明確かつ一貫したビューを提供し、サポート終了、実験的なAPIへのアクセス制御を有効にするために、リソースまたはフィールドレベルではなく、APIレベルでバージョンが行われます。 -APIの発展や拡張を簡易に行えるようにするため、Kubernetesは[enabled or disabled](/docs/reference/using-api/#enabling-or-disabling)を行える[APIグループ](/docs/reference/using-api/#api-groups)を実装しました。 +APIの発展や拡張を簡易に行えるようにするため、Kubernetesは[有効もしくは無効](/docs/reference/using-api/#enabling-or-disabling)を行える[APIグループ](/docs/reference/using-api/#api-groups)を実装しました。 APIリソースは、APIグループ、リソースタイプ、ネームスペース(namespacedリソースのための)、名前によって区別されます。APIサーバーは、APIバージョン間の変換を透過的に処理します。すべてのバージョンの違いは、実際のところ同じ永続データとして表現されます。APIサーバーは、同じ基本的なデータを複数のAPIバージョンで提供することができます。 @@ -108,7 +108,7 @@ Kubernetes APIは2つの方法で拡張できます。 ## {{% heading "whatsnext" %}} -- 自分自身で[CustomResourceDefinition](/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/)を追加してKubernetes APIを拡張する方法について学んでください。 -- [Controlling Access To The Kubernetes API](/docs/concepts/security/controlling-access/)では、クラスターがAPIアクセスの認証と承認を管理する方法を説明しています。 +- 自分自身で[カスタムリソース定義](/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/)を追加してKubernetes APIを拡張する方法について学んでください。 +- [Kubernetes APIのアクセス制御 ](/docs/concepts/security/controlling-access/)では、クラスターがAPIアクセスの認証と承認を管理する方法を説明しています。 - [APIリファレンス](/ja/docs/reference/kubernetes-api/)を読んで、APIエンドポイント、リソースタイプやサンプルについて学んでください。 -- [API changes](https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md#readme)から、互換性のある変更とは何か, どのようにAPIを変更するかについて学んでください。 +- [APIの変更](https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md#readme)から、互換性のある変更とは何か, どのようにAPIを変更するかについて学んでください。 From 9c670268db76e75a5b480882e42f4f7e9a7069ba Mon Sep 17 00:00:00 2001 From: KobayashiD27 Date: Mon, 19 Apr 2021 17:16:57 +0900 Subject: [PATCH 080/221] ja: Make docs/concepts/configuration/secret.md follow v1.19 of the original text --- .../ja/docs/concepts/configuration/secret.md | 624 ++++++++---------- 1 file changed, 267 insertions(+), 357 deletions(-) diff --git a/content/ja/docs/concepts/configuration/secret.md b/content/ja/docs/concepts/configuration/secret.md index 9ae7c55067..3ed92c01a5 100644 --- a/content/ja/docs/concepts/configuration/secret.md +++ b/content/ja/docs/concepts/configuration/secret.md @@ -11,18 +11,18 @@ weight: 30 KubernetesのSecretはパスワード、OAuthトークン、SSHキーのような機密情報を保存し、管理できるようにします。 -Secretに機密情報を保存することは、それらを{{< glossary_tooltip text="Pod" term_id="pod" >}}の定義や{{< glossary_tooltip text="コンテナイメージ" term_id="image" >}}に直接記載するより、安全で柔軟です。詳しくは[Secretの設計文書](https://git.k8s.io/community/contributors/design-proposals/auth/secrets.md)を参照してください。 +Secretに機密情報を保存することは、それらを{{< glossary_tooltip text="Pod" term_id="pod" >}}の定義や{{< glossary_tooltip text="コンテナイメージ" term_id="image" >}}に直接記載するより、安全で柔軟です。 +詳しくは[Secretの設計文書](https://git.k8s.io/community/contributors/design-proposals/auth/secrets.md)を参照してください。 +Secretはパスワード、トークン、キーのような小容量の機密データを含むオブジェクトです。 +他の方法としては、そのような情報はPodの定義やイメージに含めることができます。 +ユーザーはSecretを作ることができ、またシステムが作るSecretもあります。 ## Secretの概要 -Secretはパスワード、トークン、キーのような小容量の機密データを含むオブジェクトです。 -他の方法としては、そのような情報はPodの定義やイメージに含めることができます。 -ユーザーはSecretを作ることができ、またシステムが作るSecretもあります。 - Secretを使うには、PodはSecretを参照することが必要です。 PodがSecretを使う方法は3種類あります。 @@ -30,392 +30,292 @@ PodがSecretを使う方法は3種類あります。 - [コンテナの環境変数](#using-secrets-as-environment-variables)として利用する - Podを生成するために[kubeletがイメージをpullする](#using-imagepullsecrets)ときに使用する -### 内蔵のSecret -#### 自動的にサービスアカウントがAPIの認証情報のSecretを生成し、アタッチする - -KubernetesはAPIにアクセスするための認証情報を含むSecretを自動的に生成し、この種のSecretを使うように自動的にPodを改変します。 - -必要であれば、APIの認証情報が自動生成され利用される機能は無効化したり、上書きしたりすることができます。しかし、安全にAPIサーバーでアクセスすることのみが必要なのであれば、これは推奨されるワークフローです。 - -サービスアカウントがどのように機能するのかについては、[サービスアカウント](/docs/tasks/configure-pod-container/configure-service-account/) -のドキュメントを参照してください。 - -### Secretを作成する - -#### `kubectl`を利用してSecretを作成する - -SecretにはPodがデータベースにアクセスするために必要な認証情報を含むことができます。 -例えば、ユーザー名とパスワードからなる接続文字列です。 -ローカルマシンのファイル`./username.txt`にユーザー名を、ファイル`./password.txt`にパスワードを保存することができます。 - -```shell -# この後の例で使用するファイルを作成します -echo -n 'admin' > ./username.txt -echo -n '1f2d1e2e67df' > ./password.txt -``` - -`kubectl create secret`コマンドはそれらのファイルをSecretに格納して、APIサーバー上でオブジェクトを作成します。 Secretオブジェクトの名称は正当な[DNSサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names/#dns-subdomain-names)である必要があります。 +シークレットの構成ファイルを作成するときに、`data`および/または`stringData`フィールドを指定できます。`data`フィールドと`stringData`フィールドはオプションです。 +`data`フィールドのすべてのキーの値は、base64でエンコードされた文字列である必要があります。 +base64文字列への変換が望ましくない場合は、代わりに`stringData`フィールドを指定することを選択できます。これは任意の文字列を値として受け入れます。 + + +`data`と`stringData`のキーは、英数字、`-`、`_`、または`.`で構成されている必要があります。 +`stringData`フィールドのすべてのキーと値のペアは、内部で`data`フィールドにマージされます。 +キーが`data`フィールドと`stringData`フィールドの両方に表示される場合、`stringData`フィールドで指定された値が優先されます。 + +## Secretの種類 {#secret-types} + +Secretを作成するときは、[`Secret`](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#secret-v1-core)の`type`フィールド、または特定の同等の`kubectl`コマンドラインフラグ(使用可能な場合)を使用して、その型を指定できます。 +Secret型は、Secret dataのプログラムによる処理を容易にするために使用されます。 + +Kubernetesは、いくつかの一般的な使用シナリオに対応するいくつかの組み込み型を提供します。 +これらの型は、実行される検証とKubernetesが課す制約の点で異なります。 + +| Builtin Type | Usage | +|--------------|-------| +| `Opaque` | arbitrary user-defined data | +| `kubernetes.io/service-account-token` | service account token | +| `kubernetes.io/dockercfg` | serialized `~/.dockercfg` file | +| `kubernetes.io/dockerconfigjson` | serialized `~/.docker/config.json` file | +| `kubernetes.io/basic-auth` | credentials for basic authentication | +| `kubernetes.io/ssh-auth` | credentials for SSH authentication | +| `kubernetes.io/tls` | data for a TLS client or server | +| `bootstrap.kubernetes.io/token` | bootstrap token data | + +Secretオブジェクトの`type`値として空でない文字列を割り当てることにより、独自のSecret型を定義して使用できます。空の文字列は`Opaque`型として扱われます。Kubernetesは型名に制約を課しません。ただし、組み込み型の1つを使用している場合は、その型に定義されているすべての要件を満たす必要があります。 + +### Opaque secrets + +`Opaque`は、Secret構成ファイルから省略された場合のデフォルトのSecret型です。 +`kubectl`を使用してSecretを作成する場合、`generic`サブコマンドを使用して`Opaque`Secret型を示します。 たとえば、次のコマンドは、`Opaque`型の空のSecretを作成します。 ```shell -kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt -``` - -次のように出力されます: - -``` -secret "db-user-pass" created -``` - -デフォルトのキー名はファイル名です。`[--from-file=[key=]source]`を使って任意でキーを指定することができます。 - -```shell -kubectl create secret generic db-user-pass --from-file=username=./username.txt --from-file=password=./password.txt -``` - -{{< note >}} -`$`、`\`、`*`、`=`、`!`のような特殊文字は[シェル](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%A7%E3%83%AB)に解釈されるので、エスケープする必要があります。 -ほとんどのシェルではパスワードをエスケープする最も簡単な方法はシングルクォート(`'`)で囲むことです。 -例えば、実際のパスワードが`S!B\*d$zDsb=`だとすると、実行すべきコマンドは下記のようになります。 - -```shell -kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password='S!B\*d$zDsb=' -``` - -`--from-file`を使ってファイルからパスワードを読み込む場合、ファイルに含まれるパスワードの特殊文字をエスケープする必要はありません。 -{{< /note >}} - -Secretが作成されたことを確認できます。 - -```shell -kubectl get secrets +kubectl create secret generic empty-secret +kubectl get secret empty-secret ``` 出力は次のようになります。 ``` -NAME TYPE DATA AGE -db-user-pass Opaque 2 51s +NAME TYPE DATA AGE +empty-secret Opaque 0 2m6s ``` -Secretの説明を参照することができます。 +`DATA`列には、Secretに保存されているデータ項目の数が表示されます。 +この場合、「0」は空のSecretを作成したことを意味します。 -```shell -kubectl describe secrets/db-user-pass -``` +### Service account token Secrets -出力は次のようになります。 - -``` -Name: db-user-pass -Namespace: default -Labels: -Annotations: - -Type: Opaque - -Data -==== -password.txt: 12 bytes -username.txt: 5 bytes -``` - -{{< note >}} -`kubectl get`や`kubectl describe`コマンドはデフォルトではSecretの内容の表示を避けます。 -これはSecretを誤って盗み見られたり、ターミナルのログへ記録されてしまったりすることがないよう保護するためです。 -{{< /note >}} - -Secretの内容を参照する方法は[Secretのデコード](#decoding-a-secret)を参照してください。 - -#### 手動でSecretを作成する - -SecretをJSONまたはYAMLフォーマットのファイルで作成し、その後オブジェクトを作成することができます。 -Secretオブジェクトの名称は正当な[DNSサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names/#dns-subdomain-names)である必要があります。 -[Secret](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#secret-v1-core)は、`data`と`stringData`の2つの連想配列を持ちます。 -`data`フィールドは任意のデータの保存に使われ、Base64でエンコードされています。 -`stringData`は利便性のために存在するもので、機密データをエンコードされない文字列で扱えます。 - -例えば、`data`フィールドを使って1つのSecretに2つの文字列を保存するには、次のように文字列をBase64エンコードします。 - -```shell -echo -n 'admin' | base64 -``` - -出力は次のようになります。 - -``` -YWRtaW4= -``` - -```shell -echo -n '1f2d1e2e67df' | base64 -``` - -出力は次のようになります。 - -``` -MWYyZDFlMmU2N2Rm -``` - -このようなSecretを書きます。 +`kubernetes.io/service-account-token`型のSecretは、サービスアカウントを識別するトークンを格納するために使用されます。 このSecret型を使用する場合は、`kubernetes.io/service-account.name`アノテーションが既存のサービスアカウント名に設定されていることを確認する必要があります。Kubernetesコントローラーは、`kubernetes.io/service-account.uid`アノテーションや実際のトークンコンテンツに設定された`data`フィールドの`token`キーなど、他のいくつかのフィールドに入力します。 ```yaml apiVersion: v1 kind: Secret metadata: - name: mysecret -type: Opaque + name: secret-sa-sample + annotations: + kubernetes.io/service-account.name: "sa-name" +type: kubernetes.io/service-account-token data: - username: YWRtaW4= - password: MWYyZDFlMmU2N2Rm + # You can include additional key value pairs as you do with Opaque Secrets + extra: YmFyCg== ``` -これでSecretを[`kubectl apply`](/docs/reference/generated/kubectl/kubectl-commands#apply)コマンドで作成できるようになりました。 +`Pod`を作成すると、Kubernetesはservice account Secretを自動的に作成し、このSecretを使用するようにPodを自動的に変更します。service account token Secretには、APIにアクセスするための資格情報が含まれています。 -```shell -kubectl apply -f ./secret.yaml -``` +API証明の自動作成と使用は、必要に応じて無効にするか、上書きすることができます。 ただし、API Serverに安全にアクセスするだけの場合は、これが推奨されるワークフローです。 -出力は次のようになります。 +ServiceAccountの動作の詳細については、[ServiceAccount](/docs/tasks/configure-pod-container/configure-service-account/)のドキュメントを参照してください。 +PodからServiceAccountを参照する方法については、[`Pod`](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#pod-v1-core)の`automountServiceAccountToken`フィールドと`serviceAccountName`フィールドを確認することもできます。 -``` -secret "mysecret" created -``` +### Docker config Secrets -状況によっては、代わりに`stringData`フィールドを使いたいときもあるでしょう。 -このフィールドを使えばBase64でエンコードされていない文字列を直接Secretに書くことができて、その文字列はSecretが作られたり更新されたりするときにエンコードされます。 +次の`type`値のいずれかを使用して、イメージのDockerレジストリにアクセスするための資格情報を格納するSecretを作成できます。 -実用的な例として、設定ファイルの格納にSecretを使うアプリケーションをデプロイすることを考えます。 -デプロイプロセスの途中で、この設定ファイルの一部のデータを投入したいとしましょう。 +- `kubernetes.io/dockercfg` +- `kubernetes.io/dockerconfigjson` -例えば、アプリケーションは次のような設定ファイルを使用するとします。 + +`kubernetes.io/dockercfg`型は、Dockerコマンドラインを構成するためのレガシー形式であるシリアル化された`~/.dockercfg`を保存するために予約されています。 +このSecret型を使用する場合は、Secretの`data`フィールドに`.dockercfg`キーが含まれていることを確認する必要があります。このキーの値は、base64形式でエンコードされた`~/.dockercfg`ファイルの内容です。 + +`kubernetes.io/dockerconfigjson`型は、`~/.dockercfg`の新しいフォーマットである`~/.docker/config.json`ファイルと同じフォーマットルールに従うシリアル化されたJSONを保存するために設計されています。 +このSecret型を使用する場合、Secretオブジェクトの`data`フィールドには`.dockerconfigjson`キーが含まれている必要があります。このキーでは、`~/.docker/config.json`ファイルのコンテンツがbase64でエンコードされた文字列として提供されます。 + +以下は、`kubernetes.io/dockercfg`型のSecretの例です。 ```yaml -apiUrl: "https://my.api.com/api/v1" -username: "user" -password: "password" +apiVersion: v1 +kind: Secret + name: secret-dockercfg +type: kubernetes.io/dockercfg + data: + .dockercfg: | + "" ``` -次のような定義を使用して、この設定ファイルをSecretに保存することができます。 +{{< note >}} +base64エンコーディングを実行したくない場合は、代わりに`stringData`フィールドを使用することを選択できます。 +{{< /note >}} + +マニフェストを使用してこれらの型のSecretを作成すると、APIserverは期待されるキーが`data`フィールドに存在するかどうかを確認し、提供された値を有効なJSONとして解析できるかどうかを確認します。APIサーバーは、JSONが実際にDocker configファイルであるかどうかを検証しません。 + + +Docker configファイルがない場合、または`kubectl`を使用してDockerレジストリSecretを作成する場合は、次の操作を実行できます。 + +```shell +kubectl create secret docker-registry secret-tiger-docker \ + --docker-username=tiger \ + --docker-password=pass113 \ + --docker-email=tiger@acme.com +``` + +このコマンドは、`kubernetes.io/dockerconfigjson`型のSecretを作成します。 +`data`フィールドから`.dockerconfigjson`コンテンツをダンプすると、その場で作成された有効なDocker configである次のJSONコンテンツを取得します。 + +```json +{ + "auths": { + "https://index.docker.io/v1/": { + "username": "tiger", + "password": "pass113", + "email": "tiger@acme.com", + "auth": "dGlnZXI6cGFzczExMw==" + } + } +} +``` + +### Basic authentication Secret + +`kubernetes.io/basic-auth`型は、Basic認証に必要な認証を保存するために提供されています。このSecret型を使用する場合、Secretの`data`フィールドには次の2つのキーが含まれている必要があります。 + +- `username`: 認証のためのユーザー名 +- `password`: 認証のためのパスワードかトークン + +上記の2つのキーの両方の値は、base64でエンコードされた文字列です。もちろん、Secretの作成に`stringData`を使用してクリアテキストコンテンツを提供することもできます。 + +次のYAMLは、Basic authentication Secretの設定例です。 + ```yaml apiVersion: v1 kind: Secret metadata: - name: mysecret -type: Opaque + name: secret-basic-auth +type: kubernetes.io/basic-auth stringData: - config.yaml: |- - apiUrl: "https://my.api.com/api/v1" - username: {{username}} - password: {{password}} + username: admin + password: t0p-Secret config.yaml: |- ``` -デプロイツールは`kubectl apply`を実行する前に`{{username}}`と`{{password}}`のテンプレート変数を置換することができます。 -`stringData`フィールドは利便性のための書き込み専用フィールドです。 -Secretを取得するときに出力されることは決してありません。 -例えば、次のコマンドを実行すると、 +Basic認証Secret型は、ユーザーの便宜のためにのみ提供されています。Basic認証に使用される資格情報の`Opaque`を作成できます。 +ただし、組み込みのSecret型を使用すると、認証の形式を統一するのに役立ち、APIserverは必要なキーがSecret configurationで提供されているかどうかを確認します。 + + +### SSH authentication secrets + +組み込みのタイプ`kubernetes.io/ssh-auth`は、SSH認証で使用されるデータを保存するために提供されています。このSecret型を使用する場合、使用するSSH認証として`data`(または`stringData`)フィールドに`ssh-privatekey`キーと値のペアを指定する必要があります。 + +次のYAMLはSSH authentication Secretの設定例です: + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: secret-ssh-auth +type: kubernetes.io/ssh-auth +data: + # the data is abbreviated in this example + ssh-privatekey: | + MIIEpQIBAAKCAQEAulqb/Y ... +``` + +SSH authentication Secret型は、ユーザーの便宜のためにのみ提供されています。 +SSH認証に使用される資格情報の`Opaque`を作成できます。 +ただし、組み込みのSecret型を使用すると、認証の形式を統一するのに役立ち、APIserverは必要なキーがSecret configurationで提供されているかどうかを確認します。 + +### TLS secrets + +Kubernetesは、TLSに通常使用される証明書とそれに関連付けられたキーを保存するための組み込みのSecret型`kubernetes.io/tls`を提供します。このデータは、主にIngressリソースのTLS terminationで使用されますが、他のリソースで使用されることも、ワークロードによって直接使用されることもあります。 +このSecret型を使用する場合、APIサーバーは各キーの値を実際には検証しませんが、`tls.key`および`tls.crt`キーをSecret configurationの`data`(または`stringData`)フィールドに指定する必要があります。 + + +次のYAMLはTLS Secretの設定例です: + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: secret-tls +type: kubernetes.io/tls +data: + # the data is abbreviated in this example + tls.crt: | + MIIC2DCCAcCgAwIBAgIBATANBgkqh ... + tls.key: | + MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ... +``` + +TLS Secret型は、ユーザーの便宜のために提供されています。 TLSサーバーやクライアントに使用される資格情報の`Opaque`を作成できます。ただし、組み込みのSecret型を使用すると、プロジェクトでSecret形式の一貫性を確保できます。APIserverは、必要なキーがSecret configurationで提供されているかどうかを確認します。 + +`kubectl`を使用してTLS Secretを作成する場合、次の例に示すように`tls`サブコマンドを使用できます。 ```shell -kubectl get secret mysecret -o yaml +kubectl create secret tls my-tls-secret \ + --cert=path/to/cert/file \ + --key=path/to/key/file ``` -出力は次のようになります。 + +公開鍵と秘密鍵のペアは、事前に存在している必要があります。`--cert`の公開鍵証明書は.PEMエンコード(Base64エンコードDER形式)であり、`--key`の指定された秘密鍵と一致する必要があります。 +秘密鍵は、一般にPEM秘密鍵形式と呼ばれる暗号化されていない形式である必要があります。どちらの場合も、PEMの最初と最後の行(たとえば、`-------- BEGIN CERTIFICATE -----`と`------- END CERTIFICATE ----`)は含まれていません。 + +### Bootstrap token Secrets + +Bootstrap token Secretは、Secretの`type`を`bootstrap.kubernetes.io/token`に明示的に指定することで作成できます。このタイプのSecretは、ノードのブートストラッププロセス中に使用されるトークン用に設計されています。よく知られているConfigMapに署名するために使用されるトークンを格納します。 + +Bootstrap toke Secretは通常、`kube-system`namespaceで作成され`bootstrap-token-`の形式で名前が付けられます。ここで``はトークンIDの6文字の文字列です。 + +Kubernetesマニフェストとして、Bootstrap token Secretは次のようになります。 ```yaml apiVersion: v1 kind: Secret metadata: - creationTimestamp: 2018-11-15T20:40:59Z - name: mysecret - namespace: default - resourceVersion: "7225" - uid: c280ad2e-e916-11e8-98f2-025000000001 -type: Opaque + name: bootstrap-token-5emitj + namespace: kube-system +type: bootstrap.kubernetes.io/token data: - config.yaml: YXBpVXJsOiAiaHR0cHM6Ly9teS5hcGkuY29tL2FwaS92MSIKdXNlcm5hbWU6IHt7dXNlcm5hbWV9fQpwYXNzd29yZDoge3twYXNzd29yZH19 + auth-extra-groups: c3lzdGVtOmJvb3RzdHJhcHBlcnM6a3ViZWFkbTpkZWZhdWx0LW5vZGUtdG9rZW4= + expiration: MjAyMC0wOS0xM1QwNDozOToxMFo= + token-id: NWVtaXRq + token-secret: a3E0Z2lodnN6emduMXAwcg== + usage-bootstrap-authentication: dHJ1ZQ== + usage-bootstrap-signing: dHJ1ZQ== ``` -`username`のようなフィールドを`data`と`stringData`の両方で指定すると、`stringData`の値が使用されます。 -例えば、次のSecret定義からは + +Bootstrap type Secretには、`data`で指定された次のキーがあります。 + +- `token_id`:トークン識別子としてのランダムな6文字の文字列。必須。 +- `token-secret`:実際のtoken secretとしてのランダムな16文字の文字列。必須。 +- `description`:トークンの使用目的を説明する人間が読める文字列。オプション。 +- `expiration`:トークンの有効期限を指定するRFC3339を使用した絶対UTC時間。オプション。 +- `usage-bootstrap-`:Bootstrap tokenの追加の使用法を示すブールフラグ。 +- `auth-extra-groups`:`system:bootstrappers`グループに加えて認証されるグループ名のコンマ区切りのリスト。 + +上記のYAMLは、値がすべてbase64でエンコードされた文字列であるため、混乱しているように見える場合があります。実際、次のYAMLを使用して同一のSecretを作成できます。 ```yaml apiVersion: v1 kind: Secret metadata: - name: mysecret -type: Opaque -data: - username: YWRtaW4= + # Note how the Secret is named + name: bootstrap-token-5emitj + # A bootstrap token Secret usually resides in the kube-system namespace + namespace: kube-system +type: bootstrap.kubernetes.io/token stringData: - username: administrator + auth-extra-groups: "system:bootstrappers:kubeadm:default-node-token" + expiration: "2020-09-13T04:39:10Z" + # This token ID is used in the name + token-id: "5emitj" + token-secret: "kq4gihvszzgn1p0r" + # This token can be used for authentication + usage-bootstrap-authentication: "true" + # and it can be used for signing + usage-bootstrap-signing: "true" ``` -次のようなSecretが生成されます。 +## Secretの作成 -```yaml -apiVersion: v1 -kind: Secret -metadata: - creationTimestamp: 2018-11-15T20:46:46Z - name: mysecret - namespace: default - resourceVersion: "7579" - uid: 91460ecb-e917-11e8-98f2-025000000001 -type: Opaque -data: - username: YWRtaW5pc3RyYXRvcg== -``` +Secretを作成するには、いくつかのオプションがあります。 -`YWRtaW5pc3RyYXRvcg==`をデコードすると`administrator`になります。 +- [create Secret using `kubectl` command](/docs/tasks/configmap-secret/managing-secret-using-kubectl/) +- [create Secret from config file](/docs/tasks/configmap-secret/managing-secret-using-config-file/) +- [create Secret using kustomize](/docs/tasks/configmap-secret/managing-secret-using-kustomize/) -`data`や`stringData`のキーは英数字または'-'、'_'、'.'からなる必要があります。 - -{{< note >}} -シリアライズされたJSONやYAMLの機密データはBase64エンコードされています。 -文字列の中の改行は不正で、含まれていてはなりません。 -Darwin/macOSの`base64`ユーティリティーを使うときは、長い行を分割する`-b`オプションを指定するのは避けるべきです。 -反対に、Linuxユーザーは`base64`コマンドに`-w 0`オプションを指定するか、`-w`オプションが使えない場合は`base64 | tr -d '\n'`のようにパイプ*すべき*です。 -{{< /note >}} - -#### ジェネレーターからSecretを作成する - -Kubernetes v1.14から、`kubectl`は[Kustomizeを使ったオブジェクトの管理](/docs/tasks/manage-kubernetes-objects/kustomization/)に対応しています。 -KustomizeはSecretやConfigMapを生成するリソースジェネレーターを提供します。 -Kustomizeのジェネレーターはディレクトリの中の`kustomization.yaml`ファイルにて指定されるべきです。 -Secretが生成された後には、`kubectl apply`コマンドを使用してAPIサーバー上にSecretを作成することができます。 - -#### ファイルからのSecretの生成 - -./username.txtと./password.txtのファイルから生成するように`secretGenerator`を定義することで、Secretを生成することができます。 - -```shell -cat <./kustomization.yaml -secretGenerator: -- name: db-user-pass - files: - - username.txt - - password.txt -EOF -``` - -Secretを生成するには、`kustomization.yaml`を含むディレクトリをapplyします。 - -```shell -kubectl apply -k . -``` - -出力は次のようになります。 - -``` -secret/db-user-pass-96mffmfh4k created -``` - -Secretが生成されたことを確認できます。 - -```shell -kubectl get secrets -``` - -出力は次のようになります。 - -``` -NAME TYPE DATA AGE -db-user-pass-96mffmfh4k Opaque 2 51s -``` - -```shell -kubectl describe secrets/db-user-pass-96mffmfh4k -``` - -出力は次のようになります。 - -``` -Name: db-user-pass -Namespace: default -Labels: -Annotations: - -Type: Opaque - -Data -==== -password.txt: 12 bytes -username.txt: 5 bytes -``` - -#### 文字列リテラルからのSecretの生成 - -リテラル`username=admin`と`password=secret`から生成するように`secretGenerator`を定義して、Secretを生成することができます。 - -```shell -cat <./kustomization.yaml -secretGenerator: -- name: db-user-pass - literals: - - username=admin - - password=secret -EOF -``` - -Secretを生成するには、`kustomization.yaml`を含むディレクトリをapplyします。 - -```shell -kubectl apply -k . -``` - -出力は次のようになります。 - -``` -secret/db-user-pass-dddghtt9b5 created -``` - -{{< note >}} -Secretが生成されるとき、Secretのデータからハッシュ値が算出され、Secretの名称にハッシュ値が加えられます。 -これはデータが更新されたときに毎回新しいSecretが生成されることを保証します。 -{{< /note >}} - -#### Secretのデコード - -Secretは`kubectl get secret`を実行することで取得可能です。 -例えば、前のセクションで作成したSecretは次のコマンドを実行することで参照できます。 - -```shell -kubectl get secret mysecret -o yaml -``` - -出力は次のようになります。 - -```yaml -apiVersion: v1 -kind: Secret -metadata: - creationTimestamp: 2016-01-22T18:41:56Z - name: mysecret - namespace: default - resourceVersion: "164619" - uid: cfee02d6-c137-11e5-8d73-42010af00002 -type: Opaque -data: - username: YWRtaW4= - password: MWYyZDFlMmU2N2Rm -``` - -`password`フィールドをデコードします。 - -```shell -echo 'MWYyZDFlMmU2N2Rm' | base64 --decode -``` - -出力は次のようになります。 - -``` -1f2d1e2e67df -``` - -#### Secretの編集 +## Secretの編集 既存のSecretは次のコマンドで編集することができます。 @@ -491,7 +391,7 @@ Podに複数のコンテナがある場合、それぞれのコンテナが`volu #### Secretのキーの特定のパスへの割り当て Secretのキーが割り当てられるパスを制御することができます。 -それぞれのキーがターゲットとするパスは`.spec.volumes[].secret.items`フィールドによって指定てきます。 +それぞれのキーがターゲットとするパスは`.spec.volumes[].secret.items`フィールドによって指定できます。 ```yaml apiVersion: v1 @@ -668,32 +568,6 @@ Secretはwatch(デフォルト)、TTLベース、単に全てのリクエス Secretを[subPath](/docs/concepts/storage/volumes#using-subpath)を指定してボリュームにマウントしているコンテナには、Secretの更新が反映されません。 {{< /note >}} -{{< feature-state for_k8s_version="v1.18" state="alpha" >}} - -Kubernetesのアルファ機能である _Immutable Secrets and ConfigMaps_ は各SecretやConfigMapが不変であると設定できるようにします。 -Secretを広範に利用しているクラスター(PodにマウントされているSecretが1万以上)においては、データが変更されないようにすることで次のような利点が得られます。 - -- 意図しない(または望まない)変更によってアプリケーションの停止を引き起こすことを防ぎます -- 不変であると設定されたSecretの監視を停止することにより、kube-apiserverの負荷が著しく軽減され、クラスターのパフォーマンスが改善されます - -この機能を利用するには、`ImmutableEphemeralVolumes`[feature gate](/ja/docs/reference/command-line-tools-reference/feature-gates/)を有効にして、SecretまたはConfigMapの`immutable`フィールドに`true`を指定します。例えば、次のようにします。 - -```yaml -apiVersion: v1 -kind: Secret -metadata: - ... -data: - ... -immutable: true -``` - -{{< note >}} -一度SecretやConfigMapを不変であると設定すると、この変更を戻すことや`data`フィールドの内容を書き換えることは _できません_ 。 -Secretを削除して、再生成することだけができます。 -既存のPodは削除されたSecretへのマウントポイントを持ち続けるため、Podを再生成することが推奨されます。 -{{< /note >}} - ### Secretを環境変数として使用する {#using-secrets-as-environment-variables} SecretをPodの{{< glossary_tooltip text="環境変数" term_id="container-env-variables" >}}として使用するには、 @@ -752,6 +626,34 @@ echo $SECRET_PASSWORD ``` 1f2d1e2e67df ``` +// diffの762あたり + + +## Immutable Secrets {#secret-immutable} + +{{< feature-state for_k8s_version="v1.19" state="beta" >}} + +Kubernetesベータ機能_ImmutableSecrets and ConfigMaps_は、個々のSecretsとConfigMapsをimutableとして設定するオプションを提供します。Secret(少なくとも数万の、SecretからPodへの一意のマウント)を広範囲に使用するクラスターの場合、データの変更を防ぐことには次の利点があります。 + +- アプリケーションの停止を引き起こす可能性のある偶発的な(または不要な)更新からユーザーを保護します +- imutableとしてマークされたSecretのウォッチを閉じることで、kube-apiserverの負荷を大幅に削減することができ、クラスターのパフォーマンスを向上させます。 + +この機能は、`ImmutableEphemeralVolumes`[feature gate](/docs/reference/command-line-tools-reference/feature-gates/)によって制御されます。これは、v1.19以降デフォルトで有効になっています。`immutable`フィールドを`true`に設定することで、imutableのSecretを作成できます。例えば、 +```yaml +apiVersion: v1 +kind: Secret +metadata: + ... +data: + ... +immutable: true +``` +{{< note >}} +SecretまたはConfigMapがimutableとしてマークされると、この変更を元に戻したり、`data`フィールドの内容を変更したりすることはできません。Secretを削除して再作成することしかできません。 +既存のPodは、削除されたSecretへのマウントポイントを維持します。これらのPodを再作成することをお勧めします。 +{{< /note >}} + + ### imagePullSecretsを使用する {#using-imagepullsecrets} @@ -1028,8 +930,8 @@ kubectl apply -k . 2つのサービスアカウントを使用すると、ベースのPod仕様をさらに単純にすることができます。 -1. `prod-user` と `prod-db-secret` -1. `test-user` と `test-db-secret` +1. `prod-user`と`prod-db-secret` +1. `test-user`と`test-db-secret` 簡略化されたPod仕様は次のようになります。 @@ -1155,3 +1057,11 @@ Podに複数のコンテナが含まれることもあります。しかし、Po - Secretを利用するPodを作成できるユーザーはSecretの値を見ることができます。たとえAPIサーバーのポリシーがユーザーにSecretの読み取りを許可していなくても、ユーザーはSecretを晒すPodを実行することができます。 - 現在、任意のノードでルート権限を持つ人は誰でも、kubeletに偽装することで _任意の_ SecretをAPIサーバーから読み取ることができます。 単一のノードのルート権限を不正に取得された場合の影響を抑えるため、実際に必要としているノードに対してのみSecretを送る機能が計画されています。 + + +## {{% heading "whatsnext" %}} + +- [`kubectl`を使用してSecretを管理する](/docs/tasks/configmap-secret/managing-secret-using-kubectl/)方法を学ぶ +- [config fileを使用してSecretを管理する](/docs/tasks/configmap-secret/managing-secret-using-config-file/)方法を学ぶ +- [kustomizeを使用してSecretを管理する](/docs/tasks/configmap-secret/managing-secret-using-kustomize/)方法を学ぶ + From 47a3422cc58f11260f47077e669d3467aba5c695 Mon Sep 17 00:00:00 2001 From: Mengjiao Liu Date: Mon, 19 Apr 2021 18:52:01 +0800 Subject: [PATCH 081/221] [ja] Update CronJob example yaml apiversion: batch/v1beta1 --> batch/v1 --- content/ja/examples/application/job/cronjob.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/examples/application/job/cronjob.yaml b/content/ja/examples/application/job/cronjob.yaml index 2ce31233c3..34ab2a3f06 100644 --- a/content/ja/examples/application/job/cronjob.yaml +++ b/content/ja/examples/application/job/cronjob.yaml @@ -1,4 +1,4 @@ -apiVersion: batch/v1beta1 +apiVersion: batch/v1 kind: CronJob metadata: name: hello From 1c72e79a491351e2d5bbcc1d326ad57e7c6dce45 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji Date: Mon, 19 Apr 2021 20:40:47 +0900 Subject: [PATCH 082/221] Add a missing translation --- .../ja/docs/concepts/services-networking/ingress-controllers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/services-networking/ingress-controllers.md b/content/ja/docs/concepts/services-networking/ingress-controllers.md index c1bca823a0..75dfb1d11b 100644 --- a/content/ja/docs/concepts/services-networking/ingress-controllers.md +++ b/content/ja/docs/concepts/services-networking/ingress-controllers.md @@ -24,7 +24,7 @@ Ingressリソースが動作するためには、クラスターでIngressコン * [Citrix ingress controller](https://github.com/citrix/citrix-k8s-ingress-controller#readme)は、Citrix Application Delivery Controllerで動作します。 * [Contour](https://projectcontour.io/)は、[Envoy](https://www.envoyproxy.io/)ベースのIngressコントローラーです。 * F5 BIG-IPの[Container Ingress Services for Kubernetes](https://clouddocs.f5.com/containers/latest/userguide/kubernetes/)はF5 BIG-IPの仮想サーバー上でIngressの設定を可能にします。 -* [Gloo](https://gloo.solo.io)は[Envoy](https://www.envoyproxy.io)をベースにしたオープンソースのIngressコントローラーです。 +* [Gloo](https://gloo.solo.io)は[Envoy](https://www.envoyproxy.io)をベースにしたオープンソースのIngressコントローラーで、API Gateway機能を提供しています。 * [HAProxy Ingress](https://haproxy-ingress.github.io)は、[HAProxy](http://www.haproxy.org/#desc)用のIngressコントローラーです。 * [HAProxy Ingress Controller for Kubernetes](https://github.com/haproxytech/kubernetes-ingress)も、[HAProxy](http://www.haproxy.org/#desc)用のIngressコントローラーです。 * [Istio Ingress](https://istio.io/latest/docs/tasks/traffic-management/ingress/kubernetes-ingress/)は、[Istio](https://istio.io/)ベースのIngressコントローラーです。 From 9a276e404cac868b6bc614876ef41c06fda54440 Mon Sep 17 00:00:00 2001 From: pengli Date: Tue, 20 Apr 2021 19:23:28 +0800 Subject: [PATCH 083/221] change description for CM mount --- .../tasks/configure-pod-container/configure-pod-configmap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/tasks/configure-pod-container/configure-pod-configmap.md b/content/zh/docs/tasks/configure-pod-container/configure-pod-configmap.md index 2399e89ad7..0575b4113c 100644 --- a/content/zh/docs/tasks/configure-pod-container/configure-pod-configmap.md +++ b/content/zh/docs/tasks/configure-pod-container/configure-pod-configmap.md @@ -925,7 +925,7 @@ In this case, the `SPECIAL_LEVEL` item will be mounted in the `config-volume` vo ### 将 ConfigMap 数据添加到数据卷中的特定路径 使用 `path` 字段为特定的 ConfigMap 项目指定预期的文件路径。 -在这里,`SPECIAL_LEVEL` 将挂载在 `config-volume` 数据卷中 `/etc/config/keys` 目录下。 +在这里,ConfigMap中,键值 `SPECIAL_LEVEL` 的内容将挂载在 `config-volume` 数据卷中 `/etc/config/keys` 文件下。 {{< codenew file="pods/pod-configmap-volume-specific-key.yaml" >}} From bde33edc57765e0d93de588a504bcbb63425775a Mon Sep 17 00:00:00 2001 From: yu-kasuya Date: Wed, 21 Apr 2021 09:09:20 +0900 Subject: [PATCH 084/221] Update content/ja/docs/concepts/overview/kubernetes-api.md Co-authored-by: atoato88 --- content/ja/docs/concepts/overview/kubernetes-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/overview/kubernetes-api.md b/content/ja/docs/concepts/overview/kubernetes-api.md index df5b46d1e7..c7f68b04ef 100644 --- a/content/ja/docs/concepts/overview/kubernetes-api.md +++ b/content/ja/docs/concepts/overview/kubernetes-api.md @@ -87,7 +87,7 @@ APIリソースは、APIグループ、リソースタイプ、ネームスペ 成功を収めているシステムはすべて、新しいユースケースの出現や既存の変化に応じて成長し、変化する必要があります。 したがって、Kubernetesには、Kubernetes APIを継続的に変更および拡張できる設計機能があります。 -Kubernetesプロジェクトは、既存のクライアントとの互換性を破壊しないこと、およびその互換性を一定期間維持して、他のプロジェクトが適応する機会を提供することを目的としています。 +Kubernetesプロジェクトは、既存のクライアントとの互換性を破壊 _しないこと_ 、およびその互換性を一定期間維持して、他のプロジェクトが適応する機会を提供することを目的としています。 基本的に、新しいAPIリソースと新しいリソースフィールドは追加することができます。 リソースまたはフィールドを削除するには、[API非推奨ポリシー](/docs/reference/using-api/deprecation-policy/)に従ってください。 From 2a3b36fc3337a922f23dbf1e7b3ceb295ab93b17 Mon Sep 17 00:00:00 2001 From: yu-kasuya Date: Wed, 21 Apr 2021 09:09:35 +0900 Subject: [PATCH 085/221] Update content/ja/docs/concepts/overview/kubernetes-api.md Co-authored-by: atoato88 --- content/ja/docs/concepts/overview/kubernetes-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/overview/kubernetes-api.md b/content/ja/docs/concepts/overview/kubernetes-api.md index c7f68b04ef..71a31774c4 100644 --- a/content/ja/docs/concepts/overview/kubernetes-api.md +++ b/content/ja/docs/concepts/overview/kubernetes-api.md @@ -92,7 +92,7 @@ Kubernetesプロジェクトは、既存のクライアントとの互換性を 基本的に、新しいAPIリソースと新しいリソースフィールドは追加することができます。 リソースまたはフィールドを削除するには、[API非推奨ポリシー](/docs/reference/using-api/deprecation-policy/)に従ってください。 -Kubernetesは、公式のKubernetes APIが一度一般提供(GA)に達した場合、通常は`v1`APIバージョンです、互換性を維持することを強い責任があります。さらに、Kubernetesは_beta_についても可能な限り互換性を維持し続けます。ベータAPIを採用した場合、その機能が安定版になったあとでも、APIを利用してクラスタを操作し続けることができます。 +Kubernetesは、公式のKubernetes APIが一度一般提供(GA)に達した場合、通常は`v1`APIバージョンです、互換性を維持することを強い責任があります。さらに、Kubernetesは _beta_ についても可能な限り互換性を維持し続けます。ベータAPIを採用した場合、その機能が安定版になったあとでも、APIを利用してクラスタを操作し続けることができます。 {{< note >}} Kubernetesは、_alpha_APIバージョンについても互換性の維持に注力しますが、いくつかの事情により不可である場合もあります。アルファAPIバージョンを使っている場合、クラスタのアップグレードやAPIが変更された場合に備えて、Kubernetesのリリースノートを確認してください。 From 8b74996be272e62240d1d7454d82ff9fec346f07 Mon Sep 17 00:00:00 2001 From: yu-kasuya Date: Wed, 21 Apr 2021 09:09:46 +0900 Subject: [PATCH 086/221] Update content/ja/docs/concepts/overview/kubernetes-api.md Co-authored-by: atoato88 --- content/ja/docs/concepts/overview/kubernetes-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/overview/kubernetes-api.md b/content/ja/docs/concepts/overview/kubernetes-api.md index 71a31774c4..08c8cc2dd8 100644 --- a/content/ja/docs/concepts/overview/kubernetes-api.md +++ b/content/ja/docs/concepts/overview/kubernetes-api.md @@ -95,7 +95,7 @@ Kubernetesプロジェクトは、既存のクライアントとの互換性を Kubernetesは、公式のKubernetes APIが一度一般提供(GA)に達した場合、通常は`v1`APIバージョンです、互換性を維持することを強い責任があります。さらに、Kubernetesは _beta_ についても可能な限り互換性を維持し続けます。ベータAPIを採用した場合、その機能が安定版になったあとでも、APIを利用してクラスタを操作し続けることができます。 {{< note >}} -Kubernetesは、_alpha_APIバージョンについても互換性の維持に注力しますが、いくつかの事情により不可である場合もあります。アルファAPIバージョンを使っている場合、クラスタのアップグレードやAPIが変更された場合に備えて、Kubernetesのリリースノートを確認してください。 +Kubernetesは、 _alpha_ APIバージョンについても互換性の維持に注力しますが、いくつかの事情により不可である場合もあります。アルファAPIバージョンを使っている場合、クラスタのアップグレードやAPIが変更された場合に備えて、Kubernetesのリリースノートを確認してください。 {{< /note >}} ## APIの拡張 From c60e30f74537b8f7985e6bda2e43d83c83a301ea Mon Sep 17 00:00:00 2001 From: YukiKasuya Date: Wed, 21 Apr 2021 09:30:14 +0900 Subject: [PATCH 087/221] Add missing sentence --- content/ja/docs/concepts/overview/kubernetes-api.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/ja/docs/concepts/overview/kubernetes-api.md b/content/ja/docs/concepts/overview/kubernetes-api.md index 08c8cc2dd8..07fcff478b 100644 --- a/content/ja/docs/concepts/overview/kubernetes-api.md +++ b/content/ja/docs/concepts/overview/kubernetes-api.md @@ -98,6 +98,8 @@ Kubernetesは、公式のKubernetes APIが一度一般提供(GA)に達した Kubernetesは、 _alpha_ APIバージョンについても互換性の維持に注力しますが、いくつかの事情により不可である場合もあります。アルファAPIバージョンを使っている場合、クラスタのアップグレードやAPIが変更された場合に備えて、Kubernetesのリリースノートを確認してください。 {{< /note >}} +APIバージョンレベルの定義に関する詳細は[APIバージョンのリファレンス](/docs/reference/using-api/#api-versioning)を参照してください。 + ## APIの拡張 Kubernetes APIは2つの方法で拡張できます。 From 8de0976826ede51c2373b3153b57f6b6e1da94d3 Mon Sep 17 00:00:00 2001 From: "inductor(Kohei)" Date: Wed, 21 Apr 2021 11:26:07 +0900 Subject: [PATCH 088/221] Update content/ja/docs/concepts/workloads/_index.md --- content/ja/docs/concepts/workloads/_index.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/ja/docs/concepts/workloads/_index.md b/content/ja/docs/concepts/workloads/_index.md index 9e002af387..ca846cd0e7 100644 --- a/content/ja/docs/concepts/workloads/_index.md +++ b/content/ja/docs/concepts/workloads/_index.md @@ -1,5 +1,5 @@ --- -title: ワークロード +title: "ワークロード" weight: 50 description: > Kubernetesにおけるデプロイ可能な最小のオブジェクトであるPodと、高レベルな抽象化がPodの実行を助けることを理解します。 @@ -35,4 +35,3 @@ Podには定義されたライフサイクルがあります。たとえば、 アプリケーションが実行できるようになったら、インターネット上で公開したくなるかもしれません。その場合には、[Service](/ja/docs/concepts/services-networking/service/)として公開したり、ウェブアプリケーションだけの場合、[Ingress](/ja/docs/concepts/services-networking/ingress)を使用することができます。 コードを設定から分離するKubernetesのしくみについて学ぶには、[設定](/ja/docs/concepts/configuration/)を読んでください。 - From 81514411716819a938aef3b92912df5eb4f806bc Mon Sep 17 00:00:00 2001 From: KobayashiD27 Date: Wed, 21 Apr 2021 11:45:55 +0900 Subject: [PATCH 089/221] ja: Make docs/concepts/storage/dynamic-provisioning.md follow v1.19 of the original text --- content/ja/docs/concepts/storage/dynamic-provisioning.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/storage/dynamic-provisioning.md b/content/ja/docs/concepts/storage/dynamic-provisioning.md index 4fb1908a6c..4cb9855a63 100644 --- a/content/ja/docs/concepts/storage/dynamic-provisioning.md +++ b/content/ja/docs/concepts/storage/dynamic-provisioning.md @@ -54,7 +54,7 @@ parameters: ユーザーは`PersistentVolumeClaim`リソース内でStorageClassを含むことで、動的にプロビジョンされたStorageをリクエストできます。Kubernetes v1.6以前では、この機能は`volume.beta.kubernetes.io/storage-class`アノテーションを介して使うことができました。しかしこのアノテーションではv1.6から廃止になりました。その代わりユーザーは現在では`PersistentVolumeClaim`オブジェクトの`storageClassName`を使う必要があります。このフィールドの値は、管理者によって設定された`StorageClass`の名前と一致しなければなりません([下記](#enabling-dynamic-provisioning)のセクションも参照ください)。 -"fast"というStorageClassを選択するために、例としてユーザーは下記の`PersistentVolumeClaim`を作成します。 +"fast"というStorageClassを選択するために、例としてユーザーは下記のPersistentVolumeClaimを作成します。 ```yaml apiVersion: v1 From b6d23c7abaf8c84e251d05d7a5c5d25c929573c7 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji Date: Wed, 21 Apr 2021 12:22:46 +0900 Subject: [PATCH 090/221] Revert an unnecessary change --- content/ja/docs/concepts/workloads/pods/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/workloads/pods/_index.md b/content/ja/docs/concepts/workloads/pods/_index.md index c7fee56191..0035885bf7 100755 --- a/content/ja/docs/concepts/workloads/pods/_index.md +++ b/content/ja/docs/concepts/workloads/pods/_index.md @@ -1,5 +1,5 @@ --- -title: Pod +title: "Pod" content_type: concept weight: 10 no_list: true From 579dbbae1b61373d5acf2c07be8a9c76229bc3f4 Mon Sep 17 00:00:00 2001 From: Soichiro KAWAMURA Date: Wed, 21 Apr 2021 21:05:50 +0900 Subject: [PATCH 091/221] fix ingress rule sentences --- content/ja/docs/concepts/services-networking/ingress.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/ja/docs/concepts/services-networking/ingress.md b/content/ja/docs/concepts/services-networking/ingress.md index 216e7c9e8f..97d18640b8 100644 --- a/content/ja/docs/concepts/services-networking/ingress.md +++ b/content/ja/docs/concepts/services-networking/ingress.md @@ -75,8 +75,8 @@ Ingress [Spec](https://git.k8s.io/community/contributors/devel/sig-architecture/ 各HTTPルールは以下の情報を含みます。 * オプションで設定可能なホスト名。上記のリソースの例では、ホスト名が指定されていないと、そのルールは指定されたIPアドレスを経由する全てのインバウンドHTTPトラフィックに適用されます。ホスト名が指定されていると(例: foo.bar.com)、そのルールはホストに対して適用されます。 -* パスのリスト(例: `/testpath`)。各パスには`serviceName`と`servicePort`で定義されるバックエンドが関連づけられます。ロードバランサーがトラフィックを関連づけられたServiceに転送するために、外部からくるリクエストのホスト名とパスが条件と一致させる必要があります。 -* [Serviceドキュメント](/ja/docs/concepts/services-networking/service/)または{{< glossary_tooltip term_id="CustomResourceDefinition" text="CRD" >}}による[カスタムリソースバックエンド](#resource-backend)に書かれているように、バックエンドはServiceとポート名の組み合わせとなります。Ingressで設定されたホスト名とパスのルールに一致するHTTP(とHTTPS)のリクエストは、リスト内のバックエンドに対して送信されます。 +* パスのリスト(例: `/testpath`)。各パスには`service.name`と`service.port.name`または`service.port.number`で定義されるバックエンドが関連づけられます。ロードバランサーがトラフィックを関連づけられたServiceに転送するために、外部からくるリクエストのホスト名とパスが条件と一致させる必要があります。 +* バックエンドは[Serviceドキュメント](/ja/docs/concepts/services-networking/service/)に書かれているようなService名とポート名の組み合わせ、または{{< glossary_tooltip term_id="CustomResourceDefinition" text="CRD" >}}による[カスタムリソースバックエンド](#resource-backend)です。Ingressで設定されたホスト名とパスのルールに一致するHTTP(とHTTPS)のリクエストは、リスト内のバックエンドに対して送信されます。 Ingressコントローラーでは、`defaultBackend`が設定されていることがあります。これはSpec内で指定されているパスに一致しないようなリクエストのためのバックエンドです。 From 3b8786e63b83b1d1eac9b3a4f727c54b3602485d Mon Sep 17 00:00:00 2001 From: Qiming Teng Date: Wed, 21 Apr 2021 22:01:30 +0800 Subject: [PATCH 092/221] [zh] Resync contribute section for Chinese localization --- content/zh/docs/contribute/advanced.md | 4 +- content/zh/docs/contribute/localization.md | 119 ++++++---- .../new-content/blogs-case-studies.md | 8 +- .../contribute/new-content/new-features.md | 77 +++--- .../contribute/participate/pr-wranglers.md | 25 +- .../participate/roles-and-responsibilities.md | 11 +- .../docs/contribute/review/for-approvers.md | 1 - .../style/hugo-shortcodes/example1.md | 2 - .../zh/docs/contribute/style/style-guide.md | 224 +++++++++++------- 9 files changed, 293 insertions(+), 178 deletions(-) diff --git a/content/zh/docs/contribute/advanced.md b/content/zh/docs/contribute/advanced.md index f3b3aab9af..3a69c1f97f 100644 --- a/content/zh/docs/contribute/advanced.md +++ b/content/zh/docs/contribute/advanced.md @@ -359,9 +359,9 @@ For weekly meetings, copypaste the previous week's notes into the "Past meetings diff --git a/content/zh/docs/contribute/localization.md b/content/zh/docs/contribute/localization.md index 5ad2b88a87..3e58721357 100644 --- a/content/zh/docs/contribute/localization.md +++ b/content/zh/docs/contribute/localization.md @@ -51,7 +51,7 @@ First, consult the [ISO 639-1 standard](https://www.loc.gov/standards/iso639-2/p ### Fork and clone the repo -First, [create your own fork](/docs/contribute/start/#improve-existing-content) of the [kubernetes/website](https://github.com/kubernetes/website) repository. +First, [create your own fork](/docs/contribute/new-content/open-a-pr/#fork-the-repo) of the [kubernetes/website](https://github.com/kubernetes/website) repository. --> ### 找到两个字母的语言代码 @@ -122,11 +122,11 @@ The `@kubernetes/sig-docs-**-reviews` team automates review assignment for new P `@kubernetes/sig-docs-**-reviews` 团队被自动分派新 PR 的审阅任务。 -`@kubernetes/website-maintainers` 成员可以创建新的开发分支来协调翻译工作。 +`@kubernetes/website-maintainers` 成员可以创建新的本地化分支来协调翻译工作。 `@kubernetes/website-milestone-maintainers` 成员可以使用 `/milestone` [Prow 命令](https://prow.k8s.io/command-help) 为 issues 或 PR 设定里程碑。 @@ -394,26 +394,40 @@ To ensure accuracy in grammar and meaning, members of your localization team sho ### 源文件 -本地化必须基于最新版本 {{< latest-version >}} 中的英文文件。 +本地化必须基于本地化团队所针对的特定发行版本中的英文文件。 +每个本地化团队可以决定要针对哪个发行版本,在下文中称作目标版本(target version)。) -要查找最新版本的源文件: +要查找你的目标版本的源文件: 1. 导航到 Kubernetes website 仓库,网址为 https://github.com/kubernetes/website。 -1. 选择最新版本的 `release-1.X` 分支。 +2. 从下面的表格中选择你的目标版本分支: -最新版本是 {{< latest-version >}},所以最新的发行分支是 -[`{{< release-branch >}}`](https://github.com/kubernetes/website/tree/{{< release-branch >}})。 + 目标版本 | 分支 + -----|----- + 下一个版本 | [`dev-{{< skew nextMinorVersion >}}`](https://github.com/kubernetes/website/tree/dev-{{< skew nextMinorVersion >}}) + 最新版本 | [`master`](https://github.com/kubernetes/website/tree/master) + 之前的版本 | `release-*.**` + +`master` 分支中保存的是当前发行版本 `{{< latest-version >}}` 的内容。 +发行团队会在下一个发行版本 v{{< skew nextMinorVersion >}} 出现之前创建 +`{{< release-branch >}}` 分支。 -### 分支策略 -因为本地化项目是高度协同的工作,所以我们鼓励团队基于共享的开发分支工作。 +### 分支策略 {#branching-strategy} -在开发分支上协作需要: +因为本地化项目是高度协同的工作,所以我们鼓励团队基于共享的本地化分支工作。 + +在本地化分支上协作需要: 1. [@kubernetes/website-maintainers](https://github.com/orgs/kubernetes/teams/website-maintainers) - 中的团队成员从 https://github.com/kubernetes/website 原有分支新建一个开发分支。 + 中的团队成员从 https://github.com/kubernetes/website 原有分支新建一个本地化分支。 当你给 `kubernetes/org` 仓库[添加你的本地化团队](#add-your-localization-team-in-github)时, 你的团队批准人便加入了 `@kubernetes/website-maintainers` 团队。 @@ -490,52 +505,72 @@ To collaborate on a development branch: `dev--.` 例如,一个德语本地化团队的批准人基于 Kubernetes v1.12 版本的源分支, - 直接新建了 k/website 仓库的开发分支 `dev-1.12-de.1`。 + 直接新建了 k/website 仓库的本地化分支 `dev-1.12-de.1`。 -2. 个人贡献者基于开发分支创建新的特性分支 +2. 个人贡献者基于本地化分支创建新的特性分支 例如,一个德语贡献者新建了一个拉取请求,并将 `username:local-branch-name` 更改为 `kubernetes:dev-1.12-de.1`。 -3. 批准人审查功能分支并将其合并到开发分支中。 +3. 批准人审查功能分支并将其合并到本地化分支中。 -4. 批准人会定期发起并批准新的 PR,将开发分支合并到其源分支。在批准 PR 之前,请确保先 squash commits。 +4. 批准人会定期发起并批准新的 PR,将本地化分支合并到其源分支。 + 在批准 PR 之前,请确保先 squash commits。 -根据需要重复步骤 1-4,直到完成本地化工作。例如,随后的德语开发分支将是: +根据需要重复步骤 1-4,直到完成本地化工作。例如,随后的德语本地化分支将是: `dev-1.12-de.2`、`dev-1.12-de.3`,等等。 -团队必须将本地化内容合入到发布分支中,该发布分支也正是内容的来源。 -例如,源于 {{< release-branch >}} 的开发分支必须基于 {{< release-branch >}}。 +团队必须将本地化内容合入到发布分支中,该发布分支是内容的来源。 -approver 必须通过使开发分支与源分支保持最新并解决合并冲突来维护开发分支。 -开发分支的存在时间越长,通常需要的维护工作就越多。 -考虑定期合并开发分支并新建分支,而不是维护一个持续时间很长的开发分支。 +例如: + +- 源于 `master` 分支的本地化分支必须被合并到 `master`。 +- 源于 `release-1.19` 的本地化分支必须被合并到 `release-1.19`。 + +如果你的本地化分支是基于 `master` 分支创建的,但最终没有在新的发行 +分支 `{{< release-branch >}}` 被创建之前合并到 `master` 中,需要将其 +同时将其合并到 `master` 和新的发行分支 `{{< release-branch >}}` 中。 +要将本地化分支合并到新的发行分支 `{{< release-branch >}}` 中,你需要 +将你本地化分支的上游分支切换到 `{{< release-branch >}}`。 +在团队每个里程碑的开始时段,创建一个 issue 来比较先前的本地化分支 +和当前的本地化分支之间的上游变化很有帮助。 +现在有两个脚本用来比较上游的变化。 +[`upstream_changes.py`](https://github.com/kubernetes/website/tree/master/scripts#upstream_changespy) +对于检查对某个文件的变更很有用。 +[`diff_l10n_branches.py`](https://github.com/kubernetes/website/tree/master/scripts#diff_l10n_branchespy) +可以用来为某个特定本地化分支创建过时文件的列表。 -在团队每个里程碑的起点,创建一个 issue 来比较先前的开发分支和当前的开发分支之间的上游变化很有帮助。 -虽然只有批准人才能创建新的开发分支并合并 PR,但任何人都可以为新的开发分支提交一个拉取请求(PR)。 -不需要特殊权限。 +虽然只有批准人才能创建新的本地化分支并合并 PR,任何人都可以 +为新的本地化分支提交一个拉取请求(PR)。不需要特殊权限。 @@ -100,8 +100,8 @@ Kubernetes 博客用于项目发布新功能特性、社区报告以及其他一 Kubernetes 博客上阅读的内容。 - Beta 和 Stable 功能特性通常比 Alpha 特性更为需要文档支持。 - 如果某功能特性尚未被合并,就很难测试或者为其撰写文档。 对于对应的 PR 而言,也很难讲特性是否完全实现。 -- 确定某个功能特性是否需要对应的文档的过程是一个手动的过程。 - 即使某个功能特性没有标记需要文档,并不意味着该功能真的不需要任何文档。 +- 确定某个功能特性是否需要文档的过程是一个手动的过程。 + 即使某个功能特性没有标记需要文档,你仍可能需要为其提供文档。 ### 提交占位 PR {#open-a-placeholder-pr} 1. 在 `kubernetes/website` 仓库上针对 `dev-{{< skew nextMinorVersion >}}` - 分支提交一个 PR,其中包含较少的、待以后慢慢补齐的提交内容。 + 分支提交一个**draft** PR,其中包含较少的、待以后慢慢补齐的提交内容。 + 要创建一个草案(draft)状态的 PR,可以在 Create Pull Request 下拉菜单中 + 选择 **Create Draft Pull Request**,然后点击 **Draft Pull Request**。 1. 编辑拉取请求描述以包括指向 [kubernetes/kubernetes](https://github.com/kubernetes/kubernetes) PR 和 [kubernetes/enhancements](https://github.com/kubernetes/enhancements) 问题的链接。 -1. 使用 Prow 命令 `/milestone {{< skew nextMinorVersion >}}` - 将 PR指派到对应的里程碑。这样做会提醒负责管理对应发行版本的文档团队成员,有 - 新的功能特性要合并到将来版本。 +1. 在对应的 [kubernetes/enhancements](https://github.com/kubernetes/enhancements) + issue 上添加评论,附上新 PR 的链接以便管理此发行版本的人员能够得到通知, + 了解特性的文档正在被撰写,在新的发行版本中要跟踪其进展。 -### PR 准备好评阅 +### PR 准备好评阅 {#pr-ready-for-review} -时机成熟时,你可以在你的占位 PR 中完成功能特性文档。 +时机成熟时,你可以在你的占位 PR 中完成功能特性文档,并将 PR 的状态 +从草案状态更改为 **Ready for Review**。要将一个拉取请求标记为预备 +评阅,转到页面的 merge 框,点击 **Ready for review**。 尽可能为功能特性提供详尽文档以及使用说明。如果你需要文档组织方面的帮助,请 在 `#sig-docs` Slack 频道中提问。 @@ -244,8 +247,22 @@ received, the feature may be removed from the milestone. 为了确保技术准确性,内容可能还需要相应 SIG 的技术审核。 尽量利用他们所给出的建议,改进文档内容以达到发布就绪状态。 -如果你的功能特性需要文档,而一直没有关于该特性的文档提交评阅, -该特性可能会被从里程碑中移除。 + +如果你在处理的功能特性处于 Alpha 或 Beta 阶段并由某特性门控控制, +请确保在你的 PR 中,该特性门控被添加到 +[Alpha/Beta 特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/#feature-gates-for-alpha-or-beta-features) +表格中。对于新的特性门控选项,需要为该特性门控提供一段描述。 +如果所处理的功能特性已经进入正式发布(GA)状态或者被废弃, +请确保将其从上述表格中迁移到 +[已毕业或废弃的特性](/zh/docs/reference/command-line-tools-reference/feature-gates/#feature-gates-for-graduated-or-deprecated-features) +表格中,并确保迁移后保留其 Alpha、Beta 版本变迁历史。 -### 所有 PR 均经过评审且合并就绪 +### 所有 PR 均经过评审且合并就绪 {#all-prs-reviewd-and-ready-to-merge} 如果你的 PR 在发行截止日期之前尚未合并到 `dev-{{< skew nextMinorVersion >}}` 分支, 请与负责管理该发行版本的文档团队成员一起合作,在截止期限之前将其合并。 如果功能特性需要文档,而文档并未就绪,该特性可能会被从里程碑中去除。 -如果你的功能特性是 Alpha 阶段,并且受到某个特性门控的保护,在你的 PR 中,请确保将 -该特性门控添加到 -[Alpha/Beta 特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/#feature-gates-for-alpha-or-beta-features) -表格中。 -如果你的功能特性不再是 Alpha 阶段,请确保特性门控状态得到更新。 diff --git a/content/zh/docs/contribute/participate/pr-wranglers.md b/content/zh/docs/contribute/participate/pr-wranglers.md index 1199c5e865..8fb60a4f63 100644 --- a/content/zh/docs/contribute/participate/pr-wranglers.md +++ b/content/zh/docs/contribute/participate/pr-wranglers.md @@ -11,11 +11,11 @@ weight: 20 -SIG Docs 的[批准人(Approvers)](/zh/docs/contribute/participating/#approvers)们每周轮流负责 +SIG Docs 的[批准人(Approvers)](/zh/docs/contribute/participate/roles-and-responsibilites/#approvers)们每周轮流负责 [管理仓库的 PRs](https://github.com/kubernetes/website/wiki/PR-Wranglers)。 本节介绍 PR 管理者的职责。关于如何提供较好的评审意见,可参阅 @@ -94,6 +94,7 @@ These queries exclude localization PRs. All queries are against the main branch --> - [未签署 CLA,不可合并的 PR](https://github.com/kubernetes/website/pulls?q=is%3Aopen+is%3Apr+label%3A%22cncf-cla%3A+no%22+-label%3A%22do-not-merge%2Fwork-in-progress%22+-label%3A%22do-not-merge%2Fhold%22+label%3Alanguage%2Fen): 提醒贡献者签署 CLA。如果机器人和审阅者都已经提醒他们,请关闭 PR,并提醒他们在签署 CLA 后可以重新提交。 + **在作者没有签署 CLA 之前,不要审阅他们的 PR!** - [需要 LGTM](https://github.com/kubernetes/website/pulls?q=is%3Aopen+is%3Apr+-label%3A%22cncf-cla%3A+no%22+-label%3Ado-not-merge%2Fwork-in-progress+-label%3Ado-not-merge%2Fhold+label%3Alanguage%2Fen+-label%3Algtm): @@ -108,12 +109,28 @@ These queries exclude localization PRs. All queries are against the main branch 列举针对主分支的、没有明确合并障碍的 PR。 在浏览 PR 时,可以将 "XS" 尺寸标签更改为 "S"、"M"、"L"、"XL"、"XXL"。 -- [非主分支的 PR](https://github.com/kubernetes/website/pulls?q=is%3Aopen+is%3Apr+label%3Alanguage%2Fen+-base%3Amaster): +- [非主分支的 PR](https://github.com/kubernetes/website/pulls?q=is%3Aopen+is%3Apr+label%3Alanguage%2Fen+-base%3Amaster): If the PR is against a `dev-` branch, it's for an upcoming release. Assign the [docs release manager](https://github.com/kubernetes/sig-release/tree/master/release-team#kubernetes-release-team-roles) using: `/assign @`. If the PR is against an old branch, help the author figure out whether it's targeted against the best branch. 如果 PR 针对 `dev-` 分支,则表示它适用于即将发布的版本。 请添加带有 `/assign @<负责人的 github 账号>`,将其指派给 - [发行版本负责人](https://github.com/kubernetes/sig-release/tree/master/release-team)。 + [发行版本负责人](https://github.com/kubernetes/sig-release/tree/master/release-team#kubernetes-release-team-roles)。 如果 PR 是针对旧分支,请帮助 PR 作者确定是否所针对的是最合适的分支。 + +### 对管理者有用的 Prow 命令 {#helpful-prow-commands-for-wranglers} + +``` +# 添加 English 标签 +/language en + +# 如果 PR 包含多个提交(commits),添加 squash 标签 +/label tide/merge-method-squash + +# 使用 Prow 来为 PR 重设标题(例如一个正在处理 [WIP] 的 PR 或为 PR 提供更好的细节信息) +/retitle [WIP] +``` + <!-- ### When to close Pull Requests diff --git a/content/zh/docs/contribute/participate/roles-and-responsibilities.md b/content/zh/docs/contribute/participate/roles-and-responsibilities.md index c1359d7171..51b4399857 100644 --- a/content/zh/docs/contribute/participate/roles-and-responsibilities.md +++ b/content/zh/docs/contribute/participate/roles-and-responsibilities.md @@ -80,7 +80,7 @@ Members can: - Use the `/lgtm` comment to add the LGTM (looks good to me) label to a pull request {{< note >}} - Using `/lgtm` triggers automation. If you want to provide non-binding approval, simply commenting "LGTM" works too! + Using `/lgtm` triggers automation. If you want to provide non-binding approval, commenting "LGTM" works too! {{< /note >}} - Use the `/hold` comment to block merging for a pull request - Use the `/assign` comment to assign a reviewer to a pull request @@ -98,10 +98,11 @@ Members can: - 执行[任何人](#anyone)节区所列举操作 - 使用 `/lgtm` 评论添加 LGTM (looks good to me(我觉得可以)) 标签到某个 PR - {{< note >}} - 使用 `/lgtm` 会触发自动化机制。如果你希望提供不拘约束力的批准意见, - 直接回复 "LGTM" 也是可以的。 - {{< /note >}} + {{< note >}} + 使用 `/lgtm` 会触发自动化机制。如果你希望提供不拘约束力的批准意见, + 直接回复 "LGTM" 也是可以的。 + {{< /note >}} + - 利用 `/hold` 评论来阻止某个 PR 被合并 - 使用 `/assign` 评论为某个 PR 指定评审人 - 对 PR 提供非约束性的评审意见 diff --git a/content/zh/docs/contribute/review/for-approvers.md b/content/zh/docs/contribute/review/for-approvers.md index 5982ce7078..a0aa83feca 100644 --- a/content/zh/docs/contribute/review/for-approvers.md +++ b/content/zh/docs/contribute/review/for-approvers.md @@ -430,4 +430,3 @@ https://github.com/kubernetes/kubernetes/issues. If this is a documentation issue, please re-open this issue. ``` - diff --git a/content/zh/docs/contribute/style/hugo-shortcodes/example1.md b/content/zh/docs/contribute/style/hugo-shortcodes/example1.md index 9359bf1c16..6c3ed549cd 100644 --- a/content/zh/docs/contribute/style/hugo-shortcodes/example1.md +++ b/content/zh/docs/contribute/style/hugo-shortcodes/example1.md @@ -5,7 +5,6 @@ title: 例子 #1 <!-- title: Example #1 --> - <!-- This is an **example** content file inside the **includes** leaf bundle. --> @@ -17,4 +16,3 @@ Included content files can also contain shortcodes. {{< note >}} 被包含的内容文件也可以包含短代码。 {{< /note >}} - diff --git a/content/zh/docs/contribute/style/style-guide.md b/content/zh/docs/contribute/style/style-guide.md index eefeb1d3c6..111d24e5af 100644 --- a/content/zh/docs/contribute/style/style-guide.md +++ b/content/zh/docs/contribute/style/style-guide.md @@ -79,74 +79,82 @@ Kubernetes 文档已经被翻译为多个语种 ### Use upper camel case for API objects -When you refer specifically to interacting with an API object, use [UpperCamelCase](https://en.wikipedia.org/wiki/Camel_case), also -known as Pascal Case. When you are generally discussing an API object, use [sentence-style capitalization] -(https://docs.microsoft.com/en-us/style-guide/text-formatting/using-type/use-sentence-style-capitalization). +When you refer specifically to interacting with an API object, use [UpperCamelCase](https://en.wikipedia.org/wiki/Camel_case), also known as Pascal Case. You may see different capitalization, such as "configMap", in the [API reference](/docs/reference/kubernetes-api/). When writing general documentation, it's better to use upper camel case, calling it "ConfigMap" instead. -Don't split the API object name into separate words. For example, use -PodTemplateList, not Pod Template List. +When you are generally discussing an API object, use [sentence-style capitalization](https://docs.microsoft.com/en-us/style-guide/text-formatting/using-type/use-sentence-style-capitalization). -Refer to API objects without saying "object," unless omitting "object" -leads to an awkward construction. +You may use the word "resource", "API", or "object" to clarify a Kubernetes resource type in a sentence. + +Don't split an API object name into separate words. For example, use PodTemplateList, not Pod Template List. + +The following examples focus on capitalization. For more information about formatting API object names, review the related guidance on [Code Style](#code-style-inline-code). --> ## 文档格式标准 {#documentation-formatting-standards} ### 对 API 对象使用大写驼峰式命名法 {#use-upper-camel-case-for-api-objects} -当你与指定的 API 对象进行交互时,使用 [大写驼峰式命名法](https://en.wikipedia.org/wiki/Camel_case), -也被称为帕斯卡拼写法. -通常在讨论 API 对象时,使用 -[句子式大写](https://docs.microsoft.com/en-us/style-guide/text-formatting/using-type/use-sentence-style-capitalization). +当你与指定的 API 对象进行交互时,使用 [大写驼峰式命名法](https://en.wikipedia.org/wiki/Camel_case),也被称为帕斯卡拼写法(PascalCase). +你可能在 [API 参考](/docs/reference/kubernetes-api/) 中看到不同的大小写形式, +例如 "configMap"。在一般性的文档中,最好使用大写驼峰形式,将之称作 "ConfigMap"。 + +在一般性地讨论 API 对象时,使用 +[句子式大写](https://docs.microsoft.com/en-us/style-guide/text-formatting/using-type/use-sentence-style-capitalization)。 + +你可以使用“资源”、“API”或者“对象”这类词汇来进一步在句子中明确所指的是 +一个 Kubernetes 资源类型。 不要将 API 对象的名称切分成多个单词。例如,使用 PodTemplateList,不要 使用 Pod Template List。 -引用 API 对象时不必强调 “object(对象)”,除非省略“object(object)” -会使得文字读起来很别扭。 +下面的例子关注的是大小写问题。关于如何格式化 API 对象的名称, +有关详细细节可参考相关的[代码风格](#code-style-inline-code)指南。 <!-- -{{< table caption = "Do and Don't - API objects" >}} +{{< table caption = "Do and Don't - Use Pascal case for API objects" >}} Do | Don't :--| :----- -The Pod has two containers. | The pod has two containers. -The HorizontalPodAutoscaler is responsible for ... | The HorizontalPodAutoscaler object is responsible for ... -A PodList is a list of Pods. | A Pod List is a list of pods. -The two ContainerPorts ... | The two ContainerPort objects ... -The two ContainerStateTerminated objects ... | The two ContainerStateTerminateds ... +The HorizontalPodAutoscaler resource is responsible for ... | The Horizontal pod autoscaler is responsible for ... +A PodList object is a list of pods. | A Pod List object is a list of pods. +The Volume object contains a `hostPath` field. | The volume object contains a hostPath field. +Every ConfigMap object is part of a namespace. | Every configMap object is part of a namespace. +For managing confidential data, consider using the Secret API. | For managing confidential data, consider using the secret API. {{< /table >}} --> -{{< table caption = "关于 API 对象的约定" >}} +{{< table caption = "使用 Pascal 风格大小写来给出 API 对象的约定" >}} 可以 | 不可以 :--| :----- -Pod 有两个容器 | pod 中有两个容器 -此 HorizontalPodAutoscaler 负责... | 此 HorizontalPodAutoscaler 对象负责 ... -PodList 是 Pod 的列表 | Pod List 是 pods 的列表 -这两个 ContainerPorts ... | 这两个 ContainerPort 对象 ... -这两个 ContainerStateTerminated 对象 ... | 这两个 ContainerStateTerminateds ... +该 HorizontalPodAutoscaler 负责... | 该 HorizontalPodAutoscaler 负责... +每个 PodList 是一个 Pod 组成的列表。 | 每个 Pod List 是一个由 pods 组成的列表。 +该 Volume 对象包含一个 `hostPath` 字段。 | 此卷对象包含一个 hostPath 字段。 +每个 ConfigMap 对象都是某个名字空间的一部分。| 每个 configMap 对象是某个名字空间的一部分。 +要管理机密数据,可以考虑使用 Secret API。 | 要管理机密数据,可以考虑使用秘密 API。 {{< /table >}} <!-- ### Use angle brackets for placeholders Use angle brackets for placeholders. Tell the reader what a placeholder -represents. +represents, for example: -1. Display information about a Pod: +Display information about a Pod: - kubectl describe pod <pod-name> -n <namespace> +```shell +kubectl describe pod <pod-name> -n <namespace> +``` - If the namespace of the pod is `default`, you can omit the '-n' parameter. +If the namespace of the pod is `default`, you can omit the '-n' parameter. --> ### 在占位符中使用尖括号 在占位符中使用尖括号,并让读者知道其中代表的事物。例如: -1. 显示 Pod 信息: +显示 Pod 信息: - kubectl describe pod <pod-名称> -n <名字空间> - - 如果名字空间被忽略,默认为 `default`,你可以忽略 '-n' 参数。 +```shell +kubectl describe pod <pod-名称> -n <名字空间> +``` +如果名字空间被忽略,默认为 `default`,你可以忽略 '-n' 参数。 <!-- ### Use bold for user interface elements @@ -236,13 +244,13 @@ document, use the backtick (`` ` ``). --> ## 行间代码格式 {#inline-code-formatting} -### 为行间代码、命令与 API 对象使用代码样式 +### 为行间代码、命令与 API 对象使用代码样式 {#code-style-inline-code} 对于 HTML 文档中的行间代码,使用 `<code>` 标记。 在 Markdown 文档中,使用反引号(`` ` ``)。 <!-- -{{< table caption = "Do and Don't - Use code style for inline code and commands" >}} +{{< table caption = "Do and Don't - Use code style for inline code, commands and API objects" >}} Do | Don't :--| :----- The `kubectl run` command creates a `Pod`. | The "kubectl run" command creates a pod. @@ -256,7 +264,7 @@ Use meaningful variable names that have a context. | Use variable names such as Remove trailing spaces in the code. | Add trailing spaces in the code, where these are important, because the screen reader will read out the spaces as well. {{< /table >}} --> -{{< table caption = "行间代码和命令约定" >}} +{{< table caption = "行间代码、命令和 API 对象约定" >}} 可以 | 不可以 :--| :----- `kubectl run` 命令会创建一个 `Pod` | "kubectl run" 命令会创建一个 pod。 @@ -409,12 +417,16 @@ kubectl get pods | $ kubectl get pods Verify that the pod is running on your chosen node: - kubectl get pods --output=wide +```shell +kubectl get pods --output=wide +``` The output is similar to this: - NAME READY STATUS RESTARTS AGE IP NODE - nginx 1/1 Running 0 13s 10.200.0.4 worker0 +```console +NAME READY STATUS RESTARTS AGE IP NODE +nginx 1/1 Running 0 13s 10.200.0.4 worker0 +``` --> ### 将命令和输出分开 @@ -422,12 +434,16 @@ The output is similar to this: 验证 Pod 已经在你所选的节点上运行: - kubectl get pods --output=wide +```shell +kubectl get pods --output=wide +``` 输出类似于: - NAME READY STATUS RESTARTS AGE IP NODE - nginx 1/1 Running 0 13s 10.200.0.4 worker0 +```console +NAME READY STATUS RESTARTS AGE IP NODE +nginx 1/1 Running 0 13s 10.200.0.4 worker0 +``` <!-- ### Versioning Kubernetes examples @@ -531,17 +547,17 @@ Hugo [Shortcodes](https://gohugo.io/content-management/shortcodes) help create d 2. Use the following syntax to apply a style: - ``` - {{</* note */>}} - No need to include a prefix; the shortcode automatically provides one. (Note:, Caution:, etc.) - {{</* /note */>}} - ``` + ```none + {{</* note */>}} + No need to include a prefix; the shortcode automatically provides one. (Note:, Caution:, etc.) + {{</* /note */>}} + ``` -The output is: + The output is: -{{< note >}} -The prefix you choose is the same text for the tag. -{{< /note >}} + {{< note >}} + The prefix you choose is the same text for the tag. + {{< /note >}} --> ## 短代码(Shortcodes) {#shortcodes} @@ -553,17 +569,17 @@ Hugo [短代码(Shortcodes)](https://gohugo.io/content-management/shortcodes 1. 将要突出显示的文字用短代码的开始和结束形式包围。 2. 使用下面的语法来应用某种样式: - ``` - {{</* note */>}} - 不需要前缀;短代码会自动添加前缀(注意:、小心:等) - {{</* /note */>}} - ``` + ```none + {{</* note */>}} + 不需要前缀;短代码会自动添加前缀(注意:、小心:等) + {{</* /note */>}} + ``` -输出的样子是: + 输出的样子是: -{{< note >}} -你所选择的标记决定了文字的前缀。 -{{< /note >}} + {{< note >}} + 你所选择的标记决定了文字的前缀。 + {{< /note >}} <!-- ### Note @@ -807,7 +823,7 @@ The output is: 1. Prepare the batter, and pour into springform pan. - {{< note >}}Grease the pan for best results.{{< /note >}} + {{< note >}}Grease the pan for best results.{{< /note >}} 1. Bake for 20-25 minutes or until set. --> @@ -830,7 +846,7 @@ The output is: 1. 预热到 350˚F 1. 准备好面糊,倒入烘烤盘 - {{< note >}}给盘子抹上油可以达到最佳效果。{{< /note >}} + {{< note >}}给盘子抹上油可以达到最佳效果。{{< /note >}} 1. 烘烤 20 到 25 分钟,或者直到满意为止。 <!-- @@ -941,12 +957,13 @@ Write Markdown-style links: `[link text](URL)`. For example: `[Hugo shortcodes]( <!-- ### Lists + Group items in a list that are related to each other and need to appear in a specific order or to indicate a correlation between multiple items. When a screen reader comes across a list—whether it is an ordered or unordered list—it will be announced to the user that there is a group of list items. The user can then use the arrow keys to move up and down between the various items in the list. Website navigation links can also be marked up as list items; after all they are nothing but a group of related links. - - End each item in a list with a period if one or more items in the list are complete sentences. For the sake of consistency, normally either all items or none should be complete sentences. +- End each item in a list with a period if one or more items in the list are complete sentences. For the sake of consistency, normally either all items or none should be complete sentences. - {{< note >}} Ordered lists that are part of an incomplete introductory sentence can be in lowercase and punctuated as if each item was a part of the introductory sentence.{{< /note >}} + {{< note >}} Ordered lists that are part of an incomplete introductory sentence can be in lowercase and punctuated as if each item was a part of the introductory sentence.{{< /note >}} --> ### 列表 {#lists} @@ -955,32 +972,34 @@ Website navigation links can also be marked up as list items; after all they are 用户可以使用箭头键来上下移动,浏览列表中条目。 网站导航链接也可以标记成列表条目,因为说到底他们也是一组相互关联的链接而已。 - - 如果列表中一个或者多个条目是完整的句子,则在每个条目末尾添加句号。 - 出于一致性考虑,一般要么所有条目要么没有条目是完整句子。 +- 如果列表中一个或者多个条目是完整的句子,则在每个条目末尾添加句号。 + 出于一致性考虑,一般要么所有条目要么没有条目是完整句子。 - {{< note >}} 编号列表如果是不完整的介绍性句子的一部分,可以全部用小写字母,并按照 - 每个条目都是句子的一部分来看待和处理。{{< /note >}} + {{< note >}} + 编号列表如果是不完整的介绍性句子的一部分,可以全部用小写字母,并按照 + 每个条目都是句子的一部分来看待和处理。 + {{< /note >}} <!-- - - Use the number one (`1.`) for ordered lists. +- Use the number one (`1.`) for ordered lists. - - Use (`+`), (`*`), or (`-`) for unordered lists. +- Use (`+`), (`*`), or (`-`) for unordered lists. - - Leave a blank line after each list. +- Leave a blank line after each list. - - Indent nested lists with four spaces (for example, ⋅⋅⋅⋅). +- Indent nested lists with four spaces (for example, ⋅⋅⋅⋅). - - List items may consist of multiple paragraphs. Each subsequent paragraph in a list item must be indented by either four spaces or one tab. +- List items may consist of multiple paragraphs. Each subsequent paragraph in a list item must be indented by either four spaces or one tab. --> - - 在编号列表中,使用数字一(`1.`) +- 在编号列表中,使用数字 1(`1.`) - - 对非排序列表,使用加号(`+`)、星号(`*`)、或者减号(`-`) +- 对非排序列表,使用加号(`+`)、星号(`*`)、或者减号(`-`) - - 在每个列表之后留一个空行 +- 在每个列表之后留一个空行 - - 对于嵌套的列表,相对缩进四个空格(例如,⋅⋅⋅⋅)。 +- 对于嵌套的列表,相对缩进四个空格(例如,⋅⋅⋅⋅)。 - - 列表条目可能包含多个段落。每个后续段落都要缩进或者四个空格或者一个制表符。 +- 列表条目可能包含多个段落。每个后续段落都要缩进或者四个空格或者一个制表符。 <!-- ### Tables @@ -1009,7 +1028,7 @@ This section contains suggested best practices for clear, concise, and consisten {{< table caption = "Do and Don't - Use present tense" >}} Do | Don't This command starts a proxy. | This command will start a proxy. - {{< /table >}} +{{< /table >}} Exception: Use future or past tense if it is required to convey the correct meaning. @@ -1180,6 +1199,20 @@ Avoid making promises or giving hints about the future. If you need to talk abou an alpha feature, put the text under a heading that identifies it as alpha information. +An exception to this rule is documentation about announced deprecations +targeting removal in future versions. One example of documentation like this +is the [Deprecated API migration guide](/docs/reference/using-api/deprecation-guide/). +--> +### 避免关于将来的陈述 + +要避免对将来作出承诺或暗示。如果你需要讨论的是 Alpha 功能特性,可以将相关文字 +放在一个单独的标题下,标示为 alpha 版本信息。 + +此规则的一个例外是对未来版本中计划移除的已废弃功能选项的文档。 +此类文档的例子之一是 +[已弃用 API 迁移指南](/docs/reference/using-api/deprecation-guide/)。 + +<!-- ### Avoid statements that will soon be out of date Avoid words like "currently" and "new." A feature that is new today might not be @@ -1191,10 +1224,6 @@ In version 1.4, ... | In the current version, ... The Federation feature provides ... | The new Federation feature provides ... {{< /table >}} --> -### 避免关于将来的陈述 - -要避免对将来作出承诺或暗示。如果你需要讨论的是 Alpha 功能特性,可以将相关文字 -放在一个单独的标题下,标示为 alpha 版本信息。 ### 避免使用很快就会过时的表达 @@ -1208,8 +1237,37 @@ The Federation feature provides ... | The new Federation feature provides ... 联邦功能特性提供 ... | 新的联邦功能特性提供 ... {{< /table >}} +<!-- +### Avoid words that assume a specific level of understanding + +Avoid words such as "just", "simply", "easy", "easily", or "simple". These words do not add value. + +{{< table caption = "Do and Don't - Avoid insensitive words" >}} +Do | Don't +:--| :----- +Include one command in ... | Include just one command in ... +Run the container ... | Simply run the container ... +You can easily remove ... | You can remove ... +These simple steps ... | These steps ... +{{< /table >}} +--> +### 避免使用隐含用户对某技术有一定理解的词汇 + +避免使用“只是”、“仅仅”、“简单”、“很容易地”、“很简单”这类词汇。 +这些词并没有提升文档的价值。 + +{{< table caption = "避免无意义词汇的注意事项" >}} +可以 | 不可以 +:--| :----- +在 ... 中包含一个命令 | 只需要在... 中包含一个命令 +运行容器 ... | 只需运行该容器... +你可以很容易地移除... | 你可以移除... +这些简单的步骤... | 这些步骤... +{{< /table >}} + ## {{% heading "whatsnext" %}} * 了解[编写新主题](/zh/docs/contribute/style/write-new-topic/). * 了解[页面内容类型](/zh/docs/contribute/style/page-content-types/). * 了解[发起 PR](/zh/docs/contribute/new-content/open-a-pr/). + From 783f50ff443347693841f705c7570cbcb214f568 Mon Sep 17 00:00:00 2001 From: Jin Hase <hase.jin@jp.fujitsu.com> Date: Thu, 22 Apr 2021 10:17:40 +0900 Subject: [PATCH 093/221] Update Japanese localization on concepts/containers/runtime-class.md --- content/ja/docs/concepts/containers/runtime-class.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/ja/docs/concepts/containers/runtime-class.md b/content/ja/docs/concepts/containers/runtime-class.md index 8d89f7ff37..67334995eb 100644 --- a/content/ja/docs/concepts/containers/runtime-class.md +++ b/content/ja/docs/concepts/containers/runtime-class.md @@ -149,7 +149,7 @@ PodのオーバーヘッドはRuntimeClass内の`overhead`フィールドによ ## {{% 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/)のコンセプトを読む +- [RuntimeClassデザイン](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/585-runtime-class/README.md) +- [RuntimeClassスケジューリングデザイン](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/585-runtime-class/README.md#runtimeclass-scheduling) +- [Podオーバーヘッド](/docs/concepts/scheduling-eviction/pod-overhead/)のコンセプトを読む - [PodOverhead機能デザイン](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20190226-pod-overhead.md) From 52713e0f9e22265fe4e443ec92680006a310c66e Mon Sep 17 00:00:00 2001 From: Jin Hase <hase.jin@jp.fujitsu.com> Date: Thu, 22 Apr 2021 13:50:41 +0900 Subject: [PATCH 094/221] Update Japanese localization on concepts/containers/images.md --- content/ja/docs/concepts/containers/images.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/ja/docs/concepts/containers/images.md b/content/ja/docs/concepts/containers/images.md index 0ad4459d79..4de0dc0f74 100644 --- a/content/ja/docs/concepts/containers/images.md +++ b/content/ja/docs/concepts/containers/images.md @@ -48,10 +48,10 @@ weight: 10 `imagePullPolicy`が値なしで定義された場合、この場合も`Always`が設定されます。 -## マニフェストを使ったマルチアーキテクチャイメージ +## イメージインデックスを使ったマルチアーキテクチャイメージ -コンテナレジストリはバイナリイメージの提供だけでなく、[コンテナイメージマニフェスト](https://github.com/opencontainers/image-spec/blob/master/manifest.md)も提供する事ができます。 -マニフェストはコンテナのアーキテクチャ固有バージョンに関するイメージマニフェストを参照できます。マニフェストの目的はイメージの名前(例:`pause`、`example/mycontainer`、`kube-apiserver`)をもたせ、様々なシステムが使用しているマシンアーキテクチャにあう適切なバイナリイメージを取得できることです。 +コンテナレジストリはバイナリイメージの提供だけでなく、[コンテナイメージインデックス](https://github.com/opencontainers/image-spec/blob/master/image-index.md)も提供する事ができます。 +イメージインデックスはコンテナのアーキテクチャ固有バージョンに関する複数の[イメージマニフェスト](https://github.com/opencontainers/image-spec/blob/master/manifest.md)を指すことができます。イメージインデックスの目的はイメージの名前(例:`pause`、`example/mycontainer`、`kube-apiserver`)をもたせ、様々なシステムが使用しているマシンアーキテクチャにあう適切なバイナリイメージを取得できることです。 Kubernetes自身は、通常コンテナイメージに`-$(ARCH)`のサフィックスを持つ名前をつけます。下位互換の為にサフィックス付きの古い仕様のイメージを生成してください。その目的は、`pause`のようなすべてのアーキテクチャのマニフェストを持つイメージと、サフィックスのあるイメージをハードコードしていた可能性のある古い仕様の設定やYAMLファイルと下位互換がある`pause-amd64`のようなイメージを生成することです。 @@ -179,7 +179,7 @@ Node構成を制御できる場合、この方法が適しています。 すべてのPodは事前にPullしたイメージへの読み取りアクセス権をもちます。 -### PodでImagePullSecretsを指定する +### PodでimagePullSecretsを指定する {{< note >}} この方法がプライベートレジストリのイメージに基づいてコンテナを実行するための推奨の方法です。 @@ -187,7 +187,7 @@ Node構成を制御できる場合、この方法が適しています。 KubernetesはPodでのコンテナイメージレジストリキーの指定をサポートしています。 -#### Docker Configを利用してSecretを作成する。 +#### Docker configを利用してSecretを作成する。 適切な大文字の値を置き換えて、次のコマンドを実行します。 From c94f9a14c141717ff87dc5cab12e2bd951fe9e1f Mon Sep 17 00:00:00 2001 From: Jin Hase <hase.jin@jp.fujitsu.com> Date: Thu, 22 Apr 2021 14:05:27 +0900 Subject: [PATCH 095/221] Remove unnecessary space. --- content/ja/docs/concepts/containers/images.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/ja/docs/concepts/containers/images.md b/content/ja/docs/concepts/containers/images.md index 4de0dc0f74..a8d6d36c35 100644 --- a/content/ja/docs/concepts/containers/images.md +++ b/content/ja/docs/concepts/containers/images.md @@ -50,8 +50,7 @@ weight: 10 ## イメージインデックスを使ったマルチアーキテクチャイメージ -コンテナレジストリはバイナリイメージの提供だけでなく、[コンテナイメージインデックス](https://github.com/opencontainers/image-spec/blob/master/image-index.md)も提供する事ができます。 -イメージインデックスはコンテナのアーキテクチャ固有バージョンに関する複数の[イメージマニフェスト](https://github.com/opencontainers/image-spec/blob/master/manifest.md)を指すことができます。イメージインデックスの目的はイメージの名前(例:`pause`、`example/mycontainer`、`kube-apiserver`)をもたせ、様々なシステムが使用しているマシンアーキテクチャにあう適切なバイナリイメージを取得できることです。 +コンテナレジストリはバイナリイメージの提供だけでなく、[コンテナイメージインデックス](https://github.com/opencontainers/image-spec/blob/master/image-index.md)も提供する事ができます。イメージインデックスはコンテナのアーキテクチャ固有バージョンに関する複数の[イメージマニフェスト](https://github.com/opencontainers/image-spec/blob/master/manifest.md)を指すことができます。イメージインデックスの目的はイメージの名前(例:`pause`、`example/mycontainer`、`kube-apiserver`)をもたせ、様々なシステムが使用しているマシンアーキテクチャにあう適切なバイナリイメージを取得できることです。 Kubernetes自身は、通常コンテナイメージに`-$(ARCH)`のサフィックスを持つ名前をつけます。下位互換の為にサフィックス付きの古い仕様のイメージを生成してください。その目的は、`pause`のようなすべてのアーキテクチャのマニフェストを持つイメージと、サフィックスのあるイメージをハードコードしていた可能性のある古い仕様の設定やYAMLファイルと下位互換がある`pause-amd64`のようなイメージを生成することです。 From 03b2eb8066eb4b09a8bbb20c8231e82790963b63 Mon Sep 17 00:00:00 2001 From: Jin Hase <hase.jin@jp.fujitsu.com> Date: Thu, 22 Apr 2021 15:16:45 +0900 Subject: [PATCH 096/221] Update Japanese localization on concepts/configuration/configmap.md --- .../docs/concepts/configuration/configmap.md | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/content/ja/docs/concepts/configuration/configmap.md b/content/ja/docs/concepts/configuration/configmap.md index 54147a7a90..5cc3b31336 100644 --- a/content/ja/docs/concepts/configuration/configmap.md +++ b/content/ja/docs/concepts/configuration/configmap.md @@ -22,12 +22,18 @@ ConfigMapは機密性や暗号化を提供しません。保存したいデー こうすることで、必要であればクラウド上で実行しているコンテナイメージを取得することで、ローカルでも完全に同じコードを使ってデバッグができるようになります。 +ConfigMapは、大量のデータを保持するようには設計されていません。ConfigMapに保存されるデータは1MiBを超えることはできません。この制限を超える設定を保存する必要がある場合は、ボリュームのマウントを検討するか、別のデータベースまたはファイルサービスを使用することを検討してください。 + ## ConfigMapオブジェクト -ConfigMapは、他のオブジェクトが使うための設定を保存できるAPI[オブジェクト](/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/)です。ほとんどのKubernetesオブジェクトに`spec`セクションがあるのとは違い、ConfigMapにはアイテム(キー)と値を保存するための`data`セクションがあります。 +ConfigMapは、他のオブジェクトが使うための設定を保存できるAPI[オブジェクト](/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/)です。ほとんどのKubernetesオブジェクトに`spec`セクションがあるのとは違い、ConfigMapには`data`および`binaryData`フィールドがあります。これらのフィールドは、キーとバリューのペアを値として受け入れます。`data`フィールドと` binaryData`フィールドはどちらもオプションです。`data`フィールドはUTF-8バイトシーケンスを含むように設計されていますが、` binaryData`フィールドはバイナリデータを含むように設計されています。 ConfigMapの名前は、有効な[DNSのサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)でなければなりません。 +`data`または` binaryData`フィールドの各キーは、英数字、`-`、`_`、または`.`で構成されている必要があります。`data`に格納されているキーは、`binaryData`フィールドのキーと重複することはできません。 + +v1.19以降、ConfigMapの定義に`immutable`フィールドを追加して、[イミュータブルなConfigMap](#configmap-immutable)を作成できます。 + ## ConfigMapとPod ConfigMapを参照して、ConfigMap内のデータを元にしてPod内のコンテナの設定をするPodの`spec`を書くことができます。このとき、PodとConfigMapは同じ{{< glossary_tooltip text="名前空間" term_id="namespace" >}}内に存在する必要があります。 @@ -43,7 +49,7 @@ data: # プロパティーに似たキー。各キーは単純な値にマッピングされている player_initial_lives: "3" ui_properties_file_name: "user-interface.properties" - # + # ファイルに似たキー game.properties: | enemy.types=aliens,monsters @@ -56,7 +62,7 @@ data: ConfigMapを利用してPod内のコンテナを設定する方法には、次の4種類があります。 -1. コマンドライン引数をコンテナのエントリーポイントに渡す +1. コンテナ内のコマンドと引数 1. 環境変数をコンテナに渡す 1. 読み取り専用のボリューム内にファイルを追加し、アプリケーションがそのファイルを読み取る 1. Kubernetes APIを使用してConfigMapを読み込むコードを書き、そのコードをPod内で実行する @@ -75,7 +81,8 @@ metadata: spec: containers: - name: demo - image: game.example/demo-game + image: alpine + command: ["sleep", "3600"] env: # 環境変数を定義します。 - name: PLAYER_INITIAL_LIVES # ここではConfigMap内のキーの名前とは違い @@ -117,11 +124,9 @@ ConfigMapは1行のプロパティの値と複数行のファイルに似た形 ConfigMapは、データボリュームとしてマウントできます。ConfigMapは、Podへ直接公開せずにシステムの他の部品として使うこともできます。たとえば、ConfigMapには、システムの他の一部が設定のために使用するデータを保存できます。 -{{< note >}} ConfigMapの最も一般的な使い方では、同じ名前空間にあるPod内で実行されているコンテナに設定を構成します。ConfigMapを独立して使用することもできます。 たとえば、ConfigMapに基づいて動作を調整する{{< glossary_tooltip text="アドオン" term_id="addons" >}}や{{< glossary_tooltip text="オペレーター" term_id="operator-pattern" >}}を見かけることがあるかもしれません。 -{{< /note >}} ### ConfigMapをPodからファイルとして使う @@ -161,14 +166,17 @@ Pod内に複数のコンテナが存在する場合、各コンテナにそれ ボリューム内で現在使用中のConfigMapが更新されると、射影されたキーも最終的に(eventually)更新されます。kubeletは定期的な同期のたびにマウントされたConfigMapが新しいかどうか確認します。しかし、kubeletが現在のConfigMapの値を取得するときにはローカルキャッシュを使用します。キャッシュの種類は、[KubeletConfiguration構造体](https://github.com/kubernetes/kubernetes/blob/{{< param "docsbranch" >}}/staging/src/k8s.io/kubelet/config/v1beta1/types.go)の中の`ConfigMapAndSecretChangeDetectionStrategy`フィールドで設定可能です。ConfigMapは、監視(デフォルト)、ttlベース、またはすべてのリクエストを直接APIサーバーへ単純にリダイレクトする方法のいずれかによって伝搬されます。その結果、ConfigMapが更新された瞬間から、新しいキーがPodに射影されるまでの遅延の合計は、最長でkubeletの同期期間+キャッシュの伝搬遅延になります。ここで、キャッシュの伝搬遅延は選択したキャッシュの種類に依存します(監視の伝搬遅延、キャッシュのttl、または0に等しくなります)。 -{{< feature-state for_k8s_version="v1.18" state="alpha" >}} +環境変数として使用されるConfigMapは自動的に更新されないため、ポッドを再起動する必要があります。 +## イミュータブルなConfigMap {#configmap-immutable} -Kubernetesのアルファ版の機能である _イミュータブルなSecretおよびConfigMap_ は、個別のSecretやConfigMapをイミュータブルに設定するオプションを提供します。ConfigMapを広範に使用している(少なくとも数万のConfigMapがPodにマウントされている)クラスターでは、データの変更を防ぐことにより、以下のような利点が得られます。 +{{< feature-state for_k8s_version="v1.19" state="beta" >}} + +Kubernetesのベータ版の機能である _イミュータブルなSecretおよびConfigMap_ は、個別のSecretやConfigMapをイミュータブルに設定するオプションを提供します。ConfigMapを広範に使用している(少なくとも数万のConfigMapがPodにマウントされている)クラスターでは、データの変更を防ぐことにより、以下のような利点が得られます。 - アプリケーションの停止を引き起こす可能性のある予想外の(または望まない)変更を防ぐことができる - ConfigMapをイミュータブルにマークして監視を停止することにより、kube-apiserverへの負荷を大幅に削減し、クラスターの性能が向上する -この機能を使用するには、`ImmutableEmphemeralVolumes`[フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)を有効にして、SecretやConfigMapの`immutable`フィールドを`true`に設定してください。次に例を示します。 +この機能は、`ImmutableEmphemeralVolumes`[フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)によって管理されます。`immutable`フィールドを`true`に設定することで、イミュータブルなConfigMapを作成できます。次に例を示します。 ```yaml apiVersion: v1 @@ -180,9 +188,7 @@ data: immutable: true ``` -{{< note >}} -一度ConfigMapやSecretがイミュータブルに設定すると、この変更を元に戻したり、`data`フィールドのコンテンツを変更することは*できません*。既存のPodは削除されたConfigMapのマウントポイントを保持するため、こうしたPodは再作成することをおすすめします。 -{{< /note >}} +一度ConfigMapがイミュータブルに設定されると、この変更を元に戻したり、`data`または`binaryData`フィールドのコンテンツを変更することは*できません*。Configmapの削除と再作成のみ可能です。既存のPodは削除されたConfigMapのマウントポイントを保持するため、こうしたPodは再作成することをおすすめします。 ## {{% heading "whatsnext" %}} From 977e8fedda2fa0c808a1dbd0f3a0e7b630cd27b2 Mon Sep 17 00:00:00 2001 From: JIIOryo <r-kawaguchi-m4w@eagle.sophia.ac.jp> Date: Fri, 23 Apr 2021 09:05:55 +0900 Subject: [PATCH 097/221] Update: ja/docs/concepts/services-networking/network-policies.md --- .../ja/docs/concepts/services-networking/network-policies.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/services-networking/network-policies.md b/content/ja/docs/concepts/services-networking/network-policies.md index bac1f12ed0..d9897bcabe 100644 --- a/content/ja/docs/concepts/services-networking/network-policies.md +++ b/content/ja/docs/concepts/services-networking/network-policies.md @@ -6,7 +6,7 @@ weight: 50 <!-- overview --> -IPアドレスまたはポートのレベル(OSI参照モデルのレイヤ3または4)でトラフィックフローを制御したい場合、クラスター内の特定のアプリケーションにKubernetesのネットワークポリシーを使用することを検討してください。ネットワークポリシーはアプリケーション中心の構造であり、{{<glossary_tooltip text="Pod" term_id="pod">}}がネットワークを介して多様な「エンティティ」(「エンドポイント」や「Service」のようなKubernetesに含まれる特定の意味を持つ共通の用語との重複を避けるため、ここではエンティティという単語を使用します。)と通信する方法を指定できます。 +IPアドレスまたはポートのレベル(OSI参照モデルのレイヤ3または4)でトラフィックフローを制御したい場合、クラスター内の特定のアプリケーションにKubernetesのネットワークポリシーを使用することを検討してください。ネットワークポリシーはアプリケーション中心の構造であり、{{<glossary_tooltip text="Pod" term_id="pod">}}がネットワークを介して多様な「エンティティ」(「Endpoint」や「Service」のようなKubernetesに含まれる特定の意味を持つ共通の用語との重複を避けるため、ここではエンティティという単語を使用します。)と通信する方法を指定できます。 Podが通信できるエンティティは以下の3つの識別子の組み合わせによって識別されます。 From d18f80d6ba8b9517ed8435635bcda609578c71db Mon Sep 17 00:00:00 2001 From: Jin Hase <hase.jin@jp.fujitsu.com> Date: Fri, 23 Apr 2021 09:35:52 +0900 Subject: [PATCH 098/221] Update content/ja/docs/concepts/configuration/configmap.md Co-authored-by: makocchi <makocchi@gmail.com> --- content/ja/docs/concepts/configuration/configmap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/configuration/configmap.md b/content/ja/docs/concepts/configuration/configmap.md index 5cc3b31336..8333c0ee82 100644 --- a/content/ja/docs/concepts/configuration/configmap.md +++ b/content/ja/docs/concepts/configuration/configmap.md @@ -188,7 +188,7 @@ data: immutable: true ``` -一度ConfigMapがイミュータブルに設定されると、この変更を元に戻したり、`data`または`binaryData`フィールドのコンテンツを変更することは*できません*。Configmapの削除と再作成のみ可能です。既存のPodは削除されたConfigMapのマウントポイントを保持するため、こうしたPodは再作成することをおすすめします。 +一度ConfigMapがイミュータブルに設定されると、この変更を元に戻したり、`data`または`binaryData`フィールドのコンテンツを変更することは*できません*。ConfigMapの削除と再作成のみ可能です。既存のPodは削除されたConfigMapのマウントポイントを保持するため、こうしたPodは再作成することをおすすめします。 ## {{% heading "whatsnext" %}} From b39ff2f587cf8f5aa139a12057e6f1d0a404f6ae Mon Sep 17 00:00:00 2001 From: Jin Hase <hase.jin@jp.fujitsu.com> Date: Fri, 23 Apr 2021 13:11:11 +0900 Subject: [PATCH 099/221] Update content/ja/docs/concepts/containers/images.md Co-authored-by: atoato88 <akihito-inou@nec.com> --- content/ja/docs/concepts/containers/images.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/containers/images.md b/content/ja/docs/concepts/containers/images.md index a8d6d36c35..39acaa0970 100644 --- a/content/ja/docs/concepts/containers/images.md +++ b/content/ja/docs/concepts/containers/images.md @@ -186,7 +186,7 @@ Node構成を制御できる場合、この方法が適しています。 KubernetesはPodでのコンテナイメージレジストリキーの指定をサポートしています。 -#### Docker configを利用してSecretを作成する。 +#### Docker の設定を利用してSecretを作成する。 適切な大文字の値を置き換えて、次のコマンドを実行します。 From 8a6dfd5ab472457d282b60098660331454ca9e2d Mon Sep 17 00:00:00 2001 From: Jin Hase <hase.jin@jp.fujitsu.com> Date: Fri, 23 Apr 2021 13:12:27 +0900 Subject: [PATCH 100/221] Remove unnecessary space --- content/ja/docs/concepts/containers/images.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/containers/images.md b/content/ja/docs/concepts/containers/images.md index 39acaa0970..ab1bdda921 100644 --- a/content/ja/docs/concepts/containers/images.md +++ b/content/ja/docs/concepts/containers/images.md @@ -186,7 +186,7 @@ Node構成を制御できる場合、この方法が適しています。 KubernetesはPodでのコンテナイメージレジストリキーの指定をサポートしています。 -#### Docker の設定を利用してSecretを作成する。 +#### Dockerの設定を利用してSecretを作成する。 適切な大文字の値を置き換えて、次のコマンドを実行します。 From 9435ef2fbacb537befeef1d6fcdda870274076c9 Mon Sep 17 00:00:00 2001 From: Jin Hase <hase.jin@jp.fujitsu.com> Date: Fri, 23 Apr 2021 15:14:05 +0900 Subject: [PATCH 101/221] Update content/ja/docs/concepts/configuration/configmap.md Co-authored-by: inductor(Kohei) <kela@inductor.me> --- content/ja/docs/concepts/configuration/configmap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/configuration/configmap.md b/content/ja/docs/concepts/configuration/configmap.md index 8333c0ee82..4e09405473 100644 --- a/content/ja/docs/concepts/configuration/configmap.md +++ b/content/ja/docs/concepts/configuration/configmap.md @@ -30,7 +30,7 @@ ConfigMapは、他のオブジェクトが使うための設定を保存でき ConfigMapの名前は、有効な[DNSのサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)でなければなりません。 -`data`または` binaryData`フィールドの各キーは、英数字、`-`、`_`、または`.`で構成されている必要があります。`data`に格納されているキーは、`binaryData`フィールドのキーと重複することはできません。 +`data`または`binaryData`フィールドの各キーは、英数字、`-`、`_`、または`.`で構成されている必要があります。`data`に格納されているキーは、`binaryData`フィールドのキーと重複することはできません。 v1.19以降、ConfigMapの定義に`immutable`フィールドを追加して、[イミュータブルなConfigMap](#configmap-immutable)を作成できます。 From 12d358d9af41b1e8c489d8ac03e09473845f07eb Mon Sep 17 00:00:00 2001 From: Jin Hase <hase.jin@jp.fujitsu.com> Date: Fri, 23 Apr 2021 15:15:11 +0900 Subject: [PATCH 102/221] Update content/ja/docs/concepts/configuration/configmap.md Co-authored-by: inductor(Kohei) <kela@inductor.me> --- content/ja/docs/concepts/configuration/configmap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/configuration/configmap.md b/content/ja/docs/concepts/configuration/configmap.md index 4e09405473..32799c9e9d 100644 --- a/content/ja/docs/concepts/configuration/configmap.md +++ b/content/ja/docs/concepts/configuration/configmap.md @@ -26,7 +26,7 @@ ConfigMapは、大量のデータを保持するようには設計されてい ## ConfigMapオブジェクト -ConfigMapは、他のオブジェクトが使うための設定を保存できるAPI[オブジェクト](/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/)です。ほとんどのKubernetesオブジェクトに`spec`セクションがあるのとは違い、ConfigMapには`data`および`binaryData`フィールドがあります。これらのフィールドは、キーとバリューのペアを値として受け入れます。`data`フィールドと` binaryData`フィールドはどちらもオプションです。`data`フィールドはUTF-8バイトシーケンスを含むように設計されていますが、` binaryData`フィールドはバイナリデータを含むように設計されています。 +ConfigMapは、他のオブジェクトが使うための設定を保存できるAPI[オブジェクト](/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/)です。ほとんどのKubernetesオブジェクトに`spec`セクションがあるのとは違い、ConfigMapには`data`および`binaryData`フィールドがあります。これらのフィールドは、キーとバリューのペアを値として受け入れます。`data`フィールドと`binaryData`フィールドはどちらもオプションです。`data`フィールドはUTF-8バイトシーケンスを含むように設計されていますが、`binaryData`フィールドはバイナリデータを含むように設計されています。 ConfigMapの名前は、有効な[DNSのサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)でなければなりません。 From 33b26a4d3e8a15636ab2aaabc40658eab5c3ca0e Mon Sep 17 00:00:00 2001 From: arkhipovds <54039166+arkhipovds@users.noreply.github.com> Date: Fri, 23 Apr 2021 19:15:01 +0300 Subject: [PATCH 103/221] Update names.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Поправил опечатку --- content/ru/docs/concepts/overview/working-with-objects/names.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ru/docs/concepts/overview/working-with-objects/names.md b/content/ru/docs/concepts/overview/working-with-objects/names.md index af4b2db071..e73d436533 100644 --- a/content/ru/docs/concepts/overview/working-with-objects/names.md +++ b/content/ru/docs/concepts/overview/working-with-objects/names.md @@ -43,7 +43,7 @@ weight: 20 ### Имена сегментов пути -Определённые имена типов ресурсов должны закодированы для использования в качестве сегмента пути. Проще говоря, имя не может быть "." или "..", а также не может содержать "/" или "%". +Определённые имена типов ресурсов должны быть закодированы для использования в качестве сегмента пути. Проще говоря, имя не может быть "." или "..", а также не может содержать "/" или "%". Пример файла манифеста пода `nginx-demo`. From f302697380322186706c93cbbbb3978671d75b38 Mon Sep 17 00:00:00 2001 From: JIIOryo <r-kawaguchi-m4w@eagle.sophia.ac.jp> Date: Sat, 24 Apr 2021 12:52:54 +0900 Subject: [PATCH 104/221] Fix parentheses in ja/docs/concepts/services-networking/network-policies.md --- .../services-networking/network-policies.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/content/ja/docs/concepts/services-networking/network-policies.md b/content/ja/docs/concepts/services-networking/network-policies.md index d9897bcabe..b11bcead2b 100644 --- a/content/ja/docs/concepts/services-networking/network-policies.md +++ b/content/ja/docs/concepts/services-networking/network-policies.md @@ -10,9 +10,9 @@ IPアドレスまたはポートのレベル(OSI参照モデルのレイヤ3ま Podが通信できるエンティティは以下の3つの識別子の組み合わせによって識別されます。 -1. 許可されている他のPod (例外: Podはそれ自体へのアクセスをブロックできません) +1. 許可されている他のPod(例外: Podはそれ自体へのアクセスをブロックできません) 2. 許可されている名前空間 -3. IPブロック (例外: PodまたはノードのIPアドレスに関係なく、Podが実行されているノードとの間のトラフィックは常に許可されます。) +3. IPブロック(例外: PodまたはノードのIPアドレスに関係なく、Podが実行されているノードとの間のトラフィックは常に許可されます。) Podベースもしくは名前空間ベースのネットワークポリシーを定義する場合、{{<glossary_tooltip text="セレクター" term_id="selector">}}を使用してセレクターに一致するPodとの間で許可されるトラフィックを指定します。 @@ -203,23 +203,23 @@ __ipBlock__: 特定のIPのCIDRの範囲を選択して、ingressの送信元ま SCTPプロトコルのネットワークポリシーをサポートする{{< glossary_tooltip text="CNI" term_id="cni" >}}プラグインを使用している必要があります。 {{< /note >}} -## ネットワークポリシーでできないこと (少なくともまだ) +## ネットワークポリシーでできないこと(少なくともまだ) Kubernetes1.20現在、ネットワークポリシーAPIに以下の機能は存在しません。 しかし、オペレーティングシステムのコンポーネント(SELinux、OpenVSwitch、IPTablesなど)、レイヤ7の技術(Ingressコントローラー、サービスメッシュ実装)、もしくはアドミッションコントローラーを使用して回避策を実装できる場合があります。 Kubernetesのネットワークセキュリティを初めて使用する場合は、ネットワークポリシーAPIを使用して以下ののユーザーストーリーを(まだ)実装できないことに注意してください。これらのユーザーストーリーの一部(全てではありません)は、ネットワークポリシーAPIの将来のリリースで活発に議論されています。 -- クラスター内トラフィックを強制的に共通ゲートウェイを通過させる (これは、サービスメッシュもしくは他のプロキシで提供するのが最適な場合があります。) -- TLS関連のもの (これにはサービスメッシュまたはIngressコントローラを使用します。) -- ノードの固有のポリシー (これらにはCIDR表記を使用できますが、Kubernetesのアイデンティティでノードを指定することはできません。) -- 名前空間またはサービスを名前で指定する (ただし、Podまたは名前空間を{{< glossary_tooltip text="ラベル" term_id="label" >}}で指定することができます。これは多くの場合で実行可能な回避策です。) +- クラスター内トラフィックを強制的に共通ゲートウェイを通過させる(これは、サービスメッシュもしくは他のプロキシで提供するのが最適な場合があります)。 +- TLS関連のもの(これにはサービスメッシュまたはIngressコントローラを使用します)。 +- ノードの固有のポリシー(これらにはCIDR表記を使用できますが、Kubernetesのアイデンティティでノードを指定することはできません)。 +- 名前空間またはサービスを名前で指定する(ただし、Podまたは名前空間を{{< glossary_tooltip text="ラベル" term_id="label" >}}で指定することができます。これは多くの場合で実行可能な回避策です)。 - サードパーティによって実行される「ポリシー要求」の作成または管理 -- 全ての名前空間もしくはPodに適用されるデフォルトのポリシー (これを実現できるサードパーティのKubernetesディストリビューションとプロジェクトがいくつか存在します。) +- 全ての名前空間もしくはPodに適用されるデフォルトのポリシー(これを実現できるサードパーティのKubernetesディストリビューションとプロジェクトがいくつか存在します)。 - 高度なポリシークエリと到達可能性ツール - 単一のポリシー宣言でポートの範囲を指定する機能 - ネットワークセキュリティイベント(例えばブロックされた接続や受け入れられた接続)をログに記録する機能 -- ポリシーを明示的に拒否する機能 (現在、ネットワークポリシーのモデルはデフォルトで拒否されており、許可ルールを追加する機能のみが存在します。) -- ループバックまたは内向きのホストトラフィックを拒否する機能 (Podは現在localhostのアクセスやそれらが配置されているノードからのアクセスをブロックすることはできません。) +- ポリシーを明示的に拒否する機能(現在、ネットワークポリシーのモデルはデフォルトで拒否されており、許可ルールを追加する機能のみが存在します)。 +- ループバックまたは内向きのホストトラフィックを拒否する機能(Podは現在localhostのアクセスやそれらが配置されているノードからのアクセスをブロックすることはできません)。 ## {{% heading "whatsnext" %}} From 5718ce3bc435ed112eb59d1592049abe45d30b9f Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Sat, 24 Apr 2021 14:01:46 +0900 Subject: [PATCH 105/221] Fix a markup error on concepts/workloads/controllers/garbage-collection --- .../docs/concepts/workloads/controllers/garbage-collection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/workloads/controllers/garbage-collection.md b/content/ja/docs/concepts/workloads/controllers/garbage-collection.md index 3a1e630d20..cd7f4bf25e 100644 --- a/content/ja/docs/concepts/workloads/controllers/garbage-collection.md +++ b/content/ja/docs/concepts/workloads/controllers/garbage-collection.md @@ -124,7 +124,7 @@ kubectl delete replicaset my-repset --cascade=false ### Deploymentsに関する追記事項 -Kubernetes1.7以前では、Deploymentに対するカスケード削除において、作成されたReplicaSetだけでなく、それらのPodも削除するためには、ユーザーは`propagationPolicy: Foreground`と指定*しなくてはなりません* 。もしこのタイプの_propagationPolicy_ が使われなかった場合、そのReplicaSetは削除されますが、そのPodは削除されずみなしご状態になります。 +Kubernetes1.7以前では、Deploymentに対するカスケード削除において、作成されたReplicaSetだけでなく、それらのPodも削除するためには、ユーザーは`propagationPolicy: Foreground`と指定*しなくてはなりません* 。もしこのタイプの*propagationPolicy*が使われなかった場合、そのReplicaSetは削除されますが、そのPodは削除されずみなしご状態になります。 さらなる詳細に関しては[kubeadm/#149](https://github.com/kubernetes/kubeadm/issues/149#issuecomment-284766613)を参照してください。 ## 既知の問題について From 37a6668fb2fd99ad3abd8ea0f1a4d65f30f36e1b Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Sat, 24 Apr 2021 05:39:06 +0000 Subject: [PATCH 106/221] Copy /content/en/docs/tasks/job/indexed-parallel-processing-static.md for Japanese translation --- .../job/indexed-parallel-processing-static.md | 190 ++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 content/ja/docs/tasks/job/indexed-parallel-processing-static.md diff --git a/content/ja/docs/tasks/job/indexed-parallel-processing-static.md b/content/ja/docs/tasks/job/indexed-parallel-processing-static.md new file mode 100644 index 0000000000..b5492eed6e --- /dev/null +++ b/content/ja/docs/tasks/job/indexed-parallel-processing-static.md @@ -0,0 +1,190 @@ +--- +title: Indexed Job for Parallel Processing with Static Work Assignment +content_type: task +min-kubernetes-server-version: v1.21 +weight: 30 +--- + +{{< feature-state for_k8s_version="v1.21" state="alpha" >}} + +<!-- overview --> + + +In this example, you will run a Kubernetes Job that uses multiple parallel +worker processes. +Each worker is a different container running in its own Pod. The Pods have an +_index number_ that the control plane sets automatically, which allows each Pod +to identify which part of the overall task to work on. + +The pod index is available in the {{< glossary_tooltip text="annotation" term_id="annotation" >}} +`batch.kubernetes.io/job-completion-index` as a string representing its +decimal value. In order for the containerized task process to obtain this index, +you can publish the value of the annotation using the [downward API](/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#the-downward-api) +mechanism. +For convenience, the control plane automatically sets the downward API to +expose the index in the `JOB_COMPLETION_INDEX` environment variable. + +Here is an overview of the steps in this example: + +1. **Define a Job manifest using indexed completion**. + The downward API allows you to pass the pod index annotation as an + environment variable or file to the container. +2. **Start an `Indexed` Job based on that manifest**. + +## {{% heading "prerequisites" %}} + +You should already be familiar with the basic, +non-parallel, use of [Job](/docs/concepts/workloads/controllers/job/). + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + +To be able to create Indexed Jobs, make sure to enable the `IndexedJob` +[feature gate](/docs/reference/command-line-tools-reference/feature-gates/) +on the [API server](/docs/reference/command-line-tools-reference/kube-apiserver/) +and the [controller manager](/docs/reference/command-line-tools-reference/kube-controller-manager/). + +<!-- steps --> + +## Choose an approach + +To access the work item from the worker program, you have a few options: + +1. Read the `JOB_COMPLETION_INDEX` environment variable. The Job + {{< glossary_tooltip text="controller" term_id="controller" >}} + automatically links this variable to the annotation containing the completion + index. +1. Read a file that contains the completion index. +1. Assuming that you can't modify the program, you can wrap it with a script + that reads the index using any of the methods above and converts it into + something that the program can use as input. + +For this example, imagine that you chose option 3 and you want to run the +[rev](https://man7.org/linux/man-pages/man1/rev.1.html) utility. This +program accepts a file as an argument and prints its content reversed. + +```shell +rev data.txt +``` + +You'll use the `rev` tool from the +[`busybox`](https://hub.docker.com/_/busybox) container image. + +As this is only an example, each Pod only does a tiny piece of work (reversing a short +string). In a real workload you might, for example, create a Job that represents + the +task of producing 60 seconds of video based on scene data. +Each work item in the video rendering Job would be to render a particular +frame of that video clip. Indexed completion would mean that each Pod in +the Job knows which frame to render and publish, by counting frames from +the start of the clip. + +## Define an Indexed Job + +Here is a sample Job manifest that uses `Indexed` completion mode: + +{{< codenew language="yaml" file="application/job/indexed-job.yaml" >}} + +In the example above, you use the builtin `JOB_COMPLETION_INDEX` environment +variable set by the Job controller for all containers. An [init container](/docs/concepts/workloads/pods/init-containers/) +maps the index to a static value and writes it to a file that is shared with the +container running the worker through an [emptyDir volume](/docs/concepts/storage/volumes/#emptydir). +Optionally, you can [define your own environment variable through the downward +API](/docs/tasks/inject-data-application/environment-variable-expose-pod-information/) +to publish the index to containers. You can also choose to load a list of values +from a [ConfigMap as an environment variable or file](/docs/tasks/configure-pod-container/configure-pod-configmap/). + +Alternatively, you can directly [use the downward API to pass the annotation +value as a volume file](/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#store-pod-fields), +like shown in the following example: + +{{< codenew language="yaml" file="application/job/indexed-job-vol.yaml" >}} + +## Running the Job + +Now run the Job: + +```shell +# This uses the first approach (relying on $JOB_COMPLETION_INDEX) +kubectl apply -f https://kubernetes.io/examples/application/job/indexed-job.yaml +``` + +When you create this Job, the control plane creates a series of Pods, one for each index you specified. The value of `.spec.parallelism` determines how many can run at once whereas `.spec.completions` determines how many Pods the Job creates in total. + +Because `.spec.parallelism` is less than `.spec.completions`, the control plane waits for some of the first Pods to complete before starting more of them. + +Once you have created the Job, wait a moment then check on progress: + +```shell +kubectl describe jobs/indexed-job +``` + +The output is similar to: + +``` +Name: indexed-job +Namespace: default +Selector: controller-uid=bf865e04-0b67-483b-9a90-74cfc4c3e756 +Labels: controller-uid=bf865e04-0b67-483b-9a90-74cfc4c3e756 + job-name=indexed-job +Annotations: <none> +Parallelism: 3 +Completions: 5 +Start Time: Thu, 11 Mar 2021 15:47:34 +0000 +Pods Statuses: 2 Running / 3 Succeeded / 0 Failed +Completed Indexes: 0-2 +Pod Template: + Labels: controller-uid=bf865e04-0b67-483b-9a90-74cfc4c3e756 + job-name=indexed-job + Init Containers: + input: + Image: docker.io/library/bash + Port: <none> + Host Port: <none> + Command: + bash + -c + items=(foo bar baz qux xyz) + echo ${items[$JOB_COMPLETION_INDEX]} > /input/data.txt + + Environment: <none> + Mounts: + /input from input (rw) + Containers: + worker: + Image: docker.io/library/busybox + Port: <none> + Host Port: <none> + Command: + rev + /input/data.txt + Environment: <none> + Mounts: + /input from input (rw) + Volumes: + input: + Type: EmptyDir (a temporary directory that shares a pod's lifetime) + Medium: + SizeLimit: <unset> +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal SuccessfulCreate 4s job-controller Created pod: indexed-job-njkjj + Normal SuccessfulCreate 4s job-controller Created pod: indexed-job-9kd4h + Normal SuccessfulCreate 4s job-controller Created pod: indexed-job-qjwsz + Normal SuccessfulCreate 1s job-controller Created pod: indexed-job-fdhq5 + Normal SuccessfulCreate 1s job-controller Created pod: indexed-job-ncslj +``` + +In this example, you run the Job with custom values for each index. You can +inspect the output of one of the pods: + +```shell +kubectl logs indexed-job-fdhq5 # Change this to match the name of a Pod from that Job +``` + + +The output is similar to: + +``` +xuq +``` \ No newline at end of file From 17f688f533e0aba1fc86752fa7ef121b90010184 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Sat, 24 Apr 2021 13:45:35 +0000 Subject: [PATCH 107/221] Add two new example files --- .../application/job/indexed-job-vol.yaml | 27 ++++++++++++++ .../examples/application/job/indexed-job.yaml | 35 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 content/ja/examples/application/job/indexed-job-vol.yaml create mode 100644 content/ja/examples/application/job/indexed-job.yaml diff --git a/content/ja/examples/application/job/indexed-job-vol.yaml b/content/ja/examples/application/job/indexed-job-vol.yaml new file mode 100644 index 0000000000..ed40e1cc44 --- /dev/null +++ b/content/ja/examples/application/job/indexed-job-vol.yaml @@ -0,0 +1,27 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: 'indexed-job' +spec: + completions: 5 + parallelism: 3 + completionMode: Indexed + template: + spec: + restartPolicy: Never + containers: + - name: 'worker' + image: 'docker.io/library/busybox' + command: + - "rev" + - "/input/data.txt" + volumeMounts: + - mountPath: /input + name: input + volumes: + - name: input + downwardAPI: + items: + - path: "data.txt" + fieldRef: + fieldPath: metadata.annotations['batch.kubernetes.io/job-completion-index'] \ No newline at end of file diff --git a/content/ja/examples/application/job/indexed-job.yaml b/content/ja/examples/application/job/indexed-job.yaml new file mode 100644 index 0000000000..5b80d35264 --- /dev/null +++ b/content/ja/examples/application/job/indexed-job.yaml @@ -0,0 +1,35 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: 'indexed-job' +spec: + completions: 5 + parallelism: 3 + completionMode: Indexed + template: + spec: + restartPolicy: Never + initContainers: + - name: 'input' + image: 'docker.io/library/bash' + command: + - "bash" + - "-c" + - | + items=(foo bar baz qux xyz) + echo ${items[$JOB_COMPLETION_INDEX]} > /input/data.txt + volumeMounts: + - mountPath: /input + name: input + containers: + - name: 'worker' + image: 'docker.io/library/busybox' + command: + - "rev" + - "/input/data.txt" + volumeMounts: + - mountPath: /input + name: input + volumes: + - name: input + emptyDir: {} From 1e3a357f470f04293692fa503ce7f1cf84632be3 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Sat, 24 Apr 2021 13:46:00 +0000 Subject: [PATCH 108/221] Translate tasks/job/indexed-parallel-processing-static into Japanese --- .../job/indexed-parallel-processing-static.md | 103 +++++------------- 1 file changed, 30 insertions(+), 73 deletions(-) diff --git a/content/ja/docs/tasks/job/indexed-parallel-processing-static.md b/content/ja/docs/tasks/job/indexed-parallel-processing-static.md index b5492eed6e..3e92433476 100644 --- a/content/ja/docs/tasks/job/indexed-parallel-processing-static.md +++ b/content/ja/docs/tasks/job/indexed-parallel-processing-static.md @@ -1,5 +1,5 @@ --- -title: Indexed Job for Parallel Processing with Static Work Assignment +title: 静的な処理の割り当てを使用した並列処理のためのインデックス付きJob content_type: task min-kubernetes-server-version: v1.21 weight: 30 @@ -9,116 +9,75 @@ weight: 30 <!-- overview --> +この例では、複数の並列ワーカープロセスを使用するKubernetesのJobを実行します。各ワーカーは、それぞれが自分のPod内で実行される異なるコンテナです。Podはコントロールプレーンが自動的に設定する*インデックス値*を持ち、この値を利用することで、各Podは処理するタスク全体のどの部分を処理するのかを特定できます。 -In this example, you will run a Kubernetes Job that uses multiple parallel -worker processes. -Each worker is a different container running in its own Pod. The Pods have an -_index number_ that the control plane sets automatically, which allows each Pod -to identify which part of the overall task to work on. +Podのインデックスは、{{< glossary_tooltip text="アノテーション" term_id="annotation" >}}内の`batch.kubernetes.io/job-completion-index`を整数値の文字列表現としてで利用できます。コンテナ化されたタスクプロセスがこのインデックスを取得できるようにするために、このアノテーションの値は[downward API](/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#the-downward-api)の仕組みを利用することで公開できます。利便性のために、コントロールプレーンは自動的にdownward APIを設定して、`JOB_COMPLETION_INDEX`環境変数内のインデックスを公開してくれます。 -The pod index is available in the {{< glossary_tooltip text="annotation" term_id="annotation" >}} -`batch.kubernetes.io/job-completion-index` as a string representing its -decimal value. In order for the containerized task process to obtain this index, -you can publish the value of the annotation using the [downward API](/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#the-downward-api) -mechanism. -For convenience, the control plane automatically sets the downward API to -expose the index in the `JOB_COMPLETION_INDEX` environment variable. +以下に、この例で実行するステップの概要を示します。 -Here is an overview of the steps in this example: - -1. **Define a Job manifest using indexed completion**. - The downward API allows you to pass the pod index annotation as an - environment variable or file to the container. -2. **Start an `Indexed` Job based on that manifest**. +1. **completionのインデックスを使用してJobのマニフェストを定義する**。downward APIはPodのインデックスのアノテーションを環境変数またはファイルとしてコンテナに渡してくれます。 +2. **そのマニフェストに基づいてインデックス付き(Indexed)のJobを開始する**。 ## {{% heading "prerequisites" %}} -You should already be familiar with the basic, -non-parallel, use of [Job](/docs/concepts/workloads/controllers/job/). +あらかじめ基本的な非並列の[Job](/docs/concepts/workloads/controllers/job/)の使用に慣れている必要があります。 {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} -To be able to create Indexed Jobs, make sure to enable the `IndexedJob` -[feature gate](/docs/reference/command-line-tools-reference/feature-gates/) -on the [API server](/docs/reference/command-line-tools-reference/kube-apiserver/) -and the [controller manager](/docs/reference/command-line-tools-reference/kube-controller-manager/). +インデックス付きJobを作成できるようにするには、[APIサーバー](/docs/reference/command-line-tools-reference/kube-apiserver/)と[コントローラーマネージャー](/docs/reference/command-line-tools-reference/kube-controller-manager/)上で`IndexedJob`[フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)を有効にしていることを確認してください。 <!-- steps --> -## Choose an approach +## アプローチを選択する -To access the work item from the worker program, you have a few options: +ワーカープログラムから処理アイテムにアクセスするには、いくつかの選択肢があります。 -1. Read the `JOB_COMPLETION_INDEX` environment variable. The Job - {{< glossary_tooltip text="controller" term_id="controller" >}} - automatically links this variable to the annotation containing the completion - index. -1. Read a file that contains the completion index. -1. Assuming that you can't modify the program, you can wrap it with a script - that reads the index using any of the methods above and converts it into - something that the program can use as input. +1. `JOB_COMPLETION_INDEX`環境変数を読み込む。Job{{< glossary_tooltip text="コントローラー" term_id="controller" >}}は、この変数をcompletion indexを含むアノテーションに自動的にリンクします。 +1. completion indexを含むファイルを読み込む。 +1. プログラムを修正できない場合、プログラムをスクリプトでラップし、上のいずれかの方法でインデックスを読み取り、プログラムが入力として使用できるものに変換する。 -For this example, imagine that you chose option 3 and you want to run the -[rev](https://man7.org/linux/man-pages/man1/rev.1.html) utility. This -program accepts a file as an argument and prints its content reversed. +この例では、3番目のオプションを選択肢して、[rev](https://man7.org/linux/man-pages/man1/rev.1.html)ユーティリティを実行したいと考えているとしましょう。このプログラムはファイルを引数として受け取り、内容を逆さまに表示します。 ```shell rev data.txt ``` -You'll use the `rev` tool from the -[`busybox`](https://hub.docker.com/_/busybox) container image. +`rev`ツールは[`busybox`](https://hub.docker.com/_/busybox)コンテナイメージから利用できます。 -As this is only an example, each Pod only does a tiny piece of work (reversing a short -string). In a real workload you might, for example, create a Job that represents - the -task of producing 60 seconds of video based on scene data. -Each work item in the video rendering Job would be to render a particular -frame of that video clip. Indexed completion would mean that each Pod in -the Job knows which frame to render and publish, by counting frames from -the start of the clip. +これは単なる例であるため、各Podはごく簡単な処理(短い文字列を逆にする)をするだけです。現実のワークロードでは、たとえば、シーンデータをもとに60秒の動画を生成するというようなタスクを記述したJobを作成するかもしれません。ビデオレンダリングJobの各処理アイテムは、ビデオクリップの特定のフレームのレンダリングを行うものになるでしょう。その場合、インデックス付きの完了が意味するのは、クリップの最初からフレームをカウントすることで、Job内の各Podがレンダリングと公開をするのがどのフレームであるかがわかるということです。 -## Define an Indexed Job +## インデックス付きJobを定義する -Here is a sample Job manifest that uses `Indexed` completion mode: +以下は、completion modeとして`Indexed`を使用するJobのマニフェストの例です。 {{< codenew language="yaml" file="application/job/indexed-job.yaml" >}} -In the example above, you use the builtin `JOB_COMPLETION_INDEX` environment -variable set by the Job controller for all containers. An [init container](/docs/concepts/workloads/pods/init-containers/) -maps the index to a static value and writes it to a file that is shared with the -container running the worker through an [emptyDir volume](/docs/concepts/storage/volumes/#emptydir). -Optionally, you can [define your own environment variable through the downward -API](/docs/tasks/inject-data-application/environment-variable-expose-pod-information/) -to publish the index to containers. You can also choose to load a list of values -from a [ConfigMap as an environment variable or file](/docs/tasks/configure-pod-container/configure-pod-configmap/). +上記の例では、Jobコントローラーがすべてのコンテナに設定する組み込みの`JOB_COMPLETION_INDEX`環境変数を使っています。[initコンテナ](/ja/docs/concepts/workloads/pods/init-containers/)がインデックスを静的な値にマッピングし、その値をファイルに書き込み、ファイルを[emptyDir volume](/docs/concepts/storage/volumes/#emptydir)を介してワーカーを実行しているコンテナと共有します。オプションとして、インデックスとコンテナに公開するために[downward APIを使用して独自の環境変数を定義する](/ja/docs/tasks/inject-data-application/environment-variable-expose-pod-information/)こともできます。[環境変数やファイルとして設定したConfigMap](/ja/docs/tasks/configure-pod-container/configure-pod-configmap/)から値のリストを読み込むという選択肢もあります。 -Alternatively, you can directly [use the downward API to pass the annotation -value as a volume file](/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#store-pod-fields), -like shown in the following example: +他には、以下の例のように、直接[downward APIを使用してアノテーションの値をボリュームファイルとして渡す](/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#store-pod-fields)こともできます。 {{< codenew language="yaml" file="application/job/indexed-job-vol.yaml" >}} -## Running the Job +## Jobを実行する -Now run the Job: +次のコマンドでJobを実行します。 ```shell -# This uses the first approach (relying on $JOB_COMPLETION_INDEX) +# このコマンドでは1番目のアプローチを使っています ($JOB_COMPLETION_INDEX に依存しています) kubectl apply -f https://kubernetes.io/examples/application/job/indexed-job.yaml ``` -When you create this Job, the control plane creates a series of Pods, one for each index you specified. The value of `.spec.parallelism` determines how many can run at once whereas `.spec.completions` determines how many Pods the Job creates in total. +このJobを作成したら、コントロールプレーンは指定した各インデックスごとに一連のPodを作成します。`.spec.parallelism`の値が同時に実行できるPodの数を決定し、`.spec.completions`の値がJobが作成するPodの合計数を決定します。 -Because `.spec.parallelism` is less than `.spec.completions`, the control plane waits for some of the first Pods to complete before starting more of them. +`.spec.parallelism`は`.spec.completions`より小さいため、コントロールプレーンは別のPodを開始する前に最初のPodの一部が完了するまで待機します。 -Once you have created the Job, wait a moment then check on progress: +Jobを作成したら、少し待ってから進行状況を確認します。 ```shell kubectl describe jobs/indexed-job ``` -The output is similar to: +出力は次のようになります。 ``` Name: indexed-job @@ -175,15 +134,13 @@ Events: Normal SuccessfulCreate 1s job-controller Created pod: indexed-job-ncslj ``` -In this example, you run the Job with custom values for each index. You can -inspect the output of one of the pods: +この例では、各インデックスごとにカスタムの値を使用してJobを実行します。次のコマンドでPodの1つの出力を確認できます。 ```shell -kubectl logs indexed-job-fdhq5 # Change this to match the name of a Pod from that Job +kubectl logs indexed-job-fdhq5 # これを対象のJobのPodの名前に一致するように変更してください。 ``` - -The output is similar to: +出力は次のようになります。 ``` xuq From 1c9b7844a23e391b2a8e59dfb68566b0fc2f3ced Mon Sep 17 00:00:00 2001 From: Lapi <tyoutugai.7@gmail.com> Date: Mon, 26 Apr 2021 11:22:35 +0900 Subject: [PATCH 109/221] fix translation of shortcodes --- content/ja/docs/contribute/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/contribute/_index.md b/content/ja/docs/contribute/_index.md index 551b66b284..4bc7489b5e 100644 --- a/content/ja/docs/contribute/_index.md +++ b/content/ja/docs/contribute/_index.md @@ -50,7 +50,7 @@ Kubernetesコミュニティで効果的に働くためには、[git](https://gi - 既存のドキュメントに対して[GitHubを使ってプルリクエストをオープン](/docs/contribute/new-content/open-a-pr/#changes-using-github)し、GitHubへのissueの登録について学んでください。 - 正確さと言語の校正のため、他のKubernetesコミュニティメンバーから[プルリクエストのレビュー](/docs/contribute/review/reviewing-prs/)を受けてください。 - 見識のあるコメントを残せるようにするため、Kubernetesの[コンテンツ](/docs/contribute/style/content-guide/)と[スタイルガイド](/docs/contribute/style/style-guide/)を読んでください。 -- [ページコンテンツの種類](/docs/contribute/style/page-content-types/)と[Hugoショートカット](/docs/contribute/style/hugo-shortcodes/)について勉強してください。 +- [ページコンテンツの種類](/docs/contribute/style/page-content-types/)と[Hugoショートコード](/docs/contribute/style/hugo-shortcodes/)について勉強してください。 ## 次のステップ From 99adc0b2b1f449765055225852b4e58b9df2793c Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Mon, 26 Apr 2021 21:56:19 +0900 Subject: [PATCH 110/221] Add a missing translation of "(as in a pod of whales or pea pod)" --- content/ja/docs/concepts/workloads/pods/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/workloads/pods/_index.md b/content/ja/docs/concepts/workloads/pods/_index.md index 0035885bf7..87b678879f 100755 --- a/content/ja/docs/concepts/workloads/pods/_index.md +++ b/content/ja/docs/concepts/workloads/pods/_index.md @@ -8,7 +8,7 @@ card: weight: 60 --- -*Pod*は、Kubernetes内で作成・管理できるコンピューティングの最小のデプロイ可能なユニットです。 +*Pod*は、Kubernetes内で作成・管理できるコンピューティングの最小のデプロイ可能なユニットです(Podという名前は、たとえばクジラの群れ(pod of whales)やえんどう豆のさや(pea pod)などの表現と同じような意味です)。 *Pod*は、1つまたは複数の{{< glossary_tooltip text="コンテナ" term_id="container" >}}のグループであり、ストレージやネットワークの共有リソースを持ち、コンテナの実行方法に関する仕様を持っています。同じPodに含まれるリソースは、常に同じ場所で同時にスケジューリングされ、共有されたコンテキストの中で実行されます。Podはアプリケーションに特化した「論理的なホスト」をモデル化します。つまり、1つのPod内には、1つまたは複数の比較的密に結合されたアプリケーションコンテナが含まれます。クラウド外の文脈で説明すると、アプリケーションが同じ物理ホストや同じバーチャルマシンで実行されることが、クラウドアプリケーションの場合には同じ論理ホスト上で実行されることに相当します。 From 5019acd822a716bd5e270fafec739257bb8e80d8 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Tue, 27 Apr 2021 12:16:02 +0900 Subject: [PATCH 111/221] Apply suggestions from code review Co-authored-by: atoato88 <akihito-inou@nec.com> --- content/ja/docs/concepts/workloads/pods/_index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/ja/docs/concepts/workloads/pods/_index.md b/content/ja/docs/concepts/workloads/pods/_index.md index 87b678879f..de7ba27148 100755 --- a/content/ja/docs/concepts/workloads/pods/_index.md +++ b/content/ja/docs/concepts/workloads/pods/_index.md @@ -82,7 +82,7 @@ Podオブジェクトのためのマニフェストを作成したときは、 PodTemplateはPodを作成するための仕様で、[Deployment](/ja/docs/concepts/workloads/controllers/deployment/)、[Job](/ja/docs/concepts/workloads/controllers/job/)、[DaemonSet](/ja/docs/concepts/workloads/controllers/daemonset/)などのワークロードリソースの中に含まれています。 -ワークロードリソースに対応する各コントローラーは、ワークロードオブジェクト内にある`PodTemplate`を使用して実際のPodを作成します。`PodTemplate`は、アプリを実行するために使われるワークロードリソースがどんな種類のものであれ、その目的の状態の一部を構成するものです。 +ワークロードリソースに対応する各コントローラーは、ワークロードオブジェクト内にある`PodTemplate`を使用して実際のPodを作成します。`PodTemplate`は、アプリを実行するために使われるワークロードリソースがどんな種類のものであれ、その目的の状態の一部を構成するものです。 以下は、単純なJobのマニフェストの一例で、1つのコンテナを実行する`template`があります。Pod内のコンテナはメッセージを出力した後、一時停止します。 @@ -121,7 +121,7 @@ Podでは、共有ストレージである{{< glossary_tooltip text="ボリュ ### Podネットワーク -各Podには、各アドレスファミリーごとにユニークなIPアドレスが割り当てられます。Pod内のすべてのコンテナは、IPアドレスとネットワークポートを含むネットワーク名前空間を共有します。Podの中では(かつその場合に**のみ**)、そのPod内のコンテナは`localhost`をしようして他のコンテナと通信できます。Podの内部にあるコンテナが*Podの外部にある*エンティティと通信する場合、(ポートなどの)共有ネットワークリソースの使い方をコンテナ間で調整しなければなりません。Pod内では、コンテナはIPアドレスとポートの空間を共有するため、`localhost`で他のコンテナにアクセスできます。また、Pod内のコンテナは、SystemVのセマフォやPOSIXの共有メモリなど、標準のプロセス間通信を使って他のコンテナと通信することもできます。異なるPod内のコンテナは異なるIPアドレスを持つため、[特別な設定](/docs/concepts/policy/pod-security-policy/)をしない限りIPCで通信することはできません。異なるPod上で実行中のコンテナ間でやり取りをしたい場合は、IPネットワークを使用して通信できます。 +各Podには、各アドレスファミリーごとにユニークなIPアドレスが割り当てられます。Pod内のすべてのコンテナは、IPアドレスとネットワークポートを含むネットワーク名前空間を共有します。Podの中では(かつその場合に**のみ**)、そのPod内のコンテナは`localhost`を使用して他のコンテナと通信できます。Podの内部にあるコンテナが*Podの外部にある*エンティティと通信する場合、(ポートなどの)共有ネットワークリソースの使い方をコンテナ間で調整しなければなりません。Pod内では、コンテナはIPアドレスとポートの空間を共有するため、`localhost`で他のコンテナにアクセスできます。また、Pod内のコンテナは、SystemVのセマフォやPOSIXの共有メモリなど、標準のプロセス間通信を使って他のコンテナと通信することもできます。異なるPod内のコンテナは異なるIPアドレスを持つため、[特別な設定](/docs/concepts/policy/pod-security-policy/)をしない限りIPCで通信することはできません。異なるPod上で実行中のコンテナ間でやり取りをしたい場合は、IPネットワークを使用して通信できます。 Pod内のコンテナは、システムのhostnameがPodに設定した`name`と同一であると考えます。ネットワークについての詳しい情報は、[ネットワーク](/ja/docs/concepts/cluster-administration/networking/)で説明しています。 From fe2e63d8e86180d8e995eec43dad199d45ecb1ad Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Tue, 27 Apr 2021 11:17:35 +0000 Subject: [PATCH 112/221] Copy content/ja/docs/tasks/network/{_index,validate-dual-stack}.md --- content/ja/docs/tasks/network/_index.md | 6 + .../docs/tasks/network/validate-dual-stack.md | 237 ++++++++++++++++++ 2 files changed, 243 insertions(+) create mode 100755 content/ja/docs/tasks/network/_index.md create mode 100644 content/ja/docs/tasks/network/validate-dual-stack.md diff --git a/content/ja/docs/tasks/network/_index.md b/content/ja/docs/tasks/network/_index.md new file mode 100755 index 0000000000..0dad8191a0 --- /dev/null +++ b/content/ja/docs/tasks/network/_index.md @@ -0,0 +1,6 @@ +--- +title: "Networking" +description: Learn how to configure networking for your cluster. +weight: 160 +--- + diff --git a/content/ja/docs/tasks/network/validate-dual-stack.md b/content/ja/docs/tasks/network/validate-dual-stack.md new file mode 100644 index 0000000000..bc90dea4ea --- /dev/null +++ b/content/ja/docs/tasks/network/validate-dual-stack.md @@ -0,0 +1,237 @@ +--- +reviewers: +- lachie83 +- khenidak +- bridgetkromhout +min-kubernetes-server-version: v1.20 +title: Validate IPv4/IPv6 dual-stack +content_type: task +--- + +<!-- overview --> +This document shares how to validate IPv4/IPv6 dual-stack enabled Kubernetes clusters. + + +## {{% heading "prerequisites" %}} + + +* Provider support for dual-stack networking (Cloud provider or otherwise must be able to provide Kubernetes nodes with routable IPv4/IPv6 network interfaces) +* A [network plugin](/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports dual-stack (such as Kubenet or Calico) +* [Dual-stack enabled](/docs/concepts/services-networking/dual-stack/) cluster + +{{< version-check >}} + + + +<!-- steps --> + +## Validate addressing + +### Validate node addressing + +Each dual-stack Node should have a single IPv4 block and a single IPv6 block allocated. Validate that IPv4/IPv6 Pod address ranges are configured by running the following command. Replace the sample node name with a valid dual-stack Node from your cluster. In this example, the Node's name is `k8s-linuxpool1-34450317-0`: + +```shell +kubectl get nodes k8s-linuxpool1-34450317-0 -o go-template --template='{{range .spec.podCIDRs}}{{printf "%s\n" .}}{{end}}' +``` +``` +10.244.1.0/24 +a00:100::/24 +``` +There should be one IPv4 block and one IPv6 block allocated. + +Validate that the node has an IPv4 and IPv6 interface detected. Replace node name with a valid node from the cluster. In this example the node name is `k8s-linuxpool1-34450317-0`: + +```shell +kubectl get nodes k8s-linuxpool1-34450317-0 -o go-template --template='{{range .status.addresses}}{{printf "%s: %s\n" .type .address}}{{end}}' +``` +``` +Hostname: k8s-linuxpool1-34450317-0 +InternalIP: 10.240.0.5 +InternalIP: 2001:1234:5678:9abc::5 +``` + +### Validate Pod addressing + +Validate that a Pod has an IPv4 and IPv6 address assigned. Replace the Pod name with a valid Pod in your cluster. In this example the Pod name is `pod01`: + +```shell +kubectl get pods pod01 -o go-template --template='{{range .status.podIPs}}{{printf "%s\n" .ip}}{{end}}' +``` +``` +10.244.1.4 +a00:100::4 +``` + +You can also validate Pod IPs using the Downward API via the `status.podIPs` fieldPath. The following snippet demonstrates how you can expose the Pod IPs via an environment variable called `MY_POD_IPS` within a container. + +``` + env: + - name: MY_POD_IPS + valueFrom: + fieldRef: + fieldPath: status.podIPs +``` + +The following command prints the value of the `MY_POD_IPS` environment variable from within a container. The value is a comma separated list that corresponds to the Pod's IPv4 and IPv6 addresses. + +```shell +kubectl exec -it pod01 -- set | grep MY_POD_IPS +``` +``` +MY_POD_IPS=10.244.1.4,a00:100::4 +``` + +The Pod's IP addresses will also be written to `/etc/hosts` within a container. The following command executes a cat on `/etc/hosts` on a dual stack Pod. From the output you can verify both the IPv4 and IPv6 IP address for the Pod. + +```shell +kubectl exec -it pod01 -- 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.244.1.4 pod01 +a00:100::4 pod01 +``` + +## Validate Services + +Create the following Service that does not explicitly define `.spec.ipFamilyPolicy`. Kubernetes will assign a cluster IP for the Service from the first configured `service-cluster-ip-range` and set the `.spec.ipFamilyPolicy` to `SingleStack`. + +{{< codenew file="service/networking/dual-stack-default-svc.yaml" >}} + +Use `kubectl` to view the YAML for the Service. + +```shell +kubectl get svc my-service -o yaml +``` + +The Service has `.spec.ipFamilyPolicy` set to `SingleStack` and `.spec.clusterIP` set to an IPv4 address from the first configured range set via `--service-cluster-ip-range` flag on kube-controller-manager. + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: my-service + namespace: default +spec: + clusterIP: 10.0.217.164 + clusterIPs: + - 10.0.217.164 + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - port: 80 + protocol: TCP + targetPort: 9376 + selector: + app: MyApp + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} +``` + +Create the following Service that explicitly defines `IPv6` as the first array element in `.spec.ipFamilies`. Kubernetes will assign a cluster IP for the Service from the IPv6 range configured `service-cluster-ip-range` and set the `.spec.ipFamilyPolicy` to `SingleStack`. + +{{< codenew file="service/networking/dual-stack-ipfamilies-ipv6.yaml" >}} + +Use `kubectl` to view the YAML for the Service. + +```shell +kubectl get svc my-service -o yaml +``` + +The Service has `.spec.ipFamilyPolicy` set to `SingleStack` and `.spec.clusterIP` set to an IPv6 address from the IPv6 range set via `--service-cluster-ip-range` flag on kube-controller-manager. + +```yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app: MyApp + name: my-service +spec: + clusterIP: fd00::5118 + clusterIPs: + - fd00::5118 + ipFamilies: + - IPv6 + ipFamilyPolicy: SingleStack + ports: + - port: 80 + protocol: TCP + targetPort: 80 + selector: + app: MyApp + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} +``` + +Create the following Service that explicitly defines `PreferDualStack` in `.spec.ipFamilyPolicy`. Kubernetes will assign both IPv4 and IPv6 addresses (as this cluster has dual-stack enabled) and select the `.spec.ClusterIP` from the list of `.spec.ClusterIPs` based on the address family of the first element in the `.spec.ipFamilies` array. + +{{< codenew file="service/networking/dual-stack-preferred-svc.yaml" >}} + +{{< note >}} +The `kubectl get svc` command will only show the primary IP in the `CLUSTER-IP` field. + +```shell +kubectl get svc -l app=MyApp + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +my-service ClusterIP 10.0.216.242 <none> 80/TCP 5s +``` +{{< /note >}} + +Validate that the Service gets cluster IPs from the IPv4 and IPv6 address blocks using `kubectl describe`. You may then validate access to the service via the IPs and ports. + +```shell +kubectl describe svc -l app=MyApp +``` + +``` +Name: my-service +Namespace: default +Labels: app=MyApp +Annotations: <none> +Selector: app=MyApp +Type: ClusterIP +IP Family Policy: PreferDualStack +IP Families: IPv4,IPv6 +IP: 10.0.216.242 +IPs: 10.0.216.242,fd00::af55 +Port: <unset> 80/TCP +TargetPort: 9376/TCP +Endpoints: <none> +Session Affinity: None +Events: <none> +``` + +### Create a dual-stack load balanced Service + +If the cloud provider supports the provisioning of IPv6 enabled external load balancers, create the following Service with `PreferDualStack` in `.spec.ipFamilyPolicy`, `IPv6` as the first element of the `.spec.ipFamilies` array and the `type` field set to `LoadBalancer`. + +{{< codenew file="service/networking/dual-stack-prefer-ipv6-lb-svc.yaml" >}} + +Check the Service: + +```shell +kubectl get svc -l app=MyApp +``` + +Validate that the Service receives a `CLUSTER-IP` address from the IPv6 address block along with an `EXTERNAL-IP`. You may then validate access to the service via the IP and port. + +```shell +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +my-service LoadBalancer fd00::7ebc 2603:1030:805::5 80:30790/TCP 35s +``` + + From 074cc20ce3fbab51aef59f2de6bb853e4ac90651 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Tue, 27 Apr 2021 11:17:35 +0000 Subject: [PATCH 113/221] Update example YAML files --- .../networking/dual-stack-default-svc.yaml | 3 ++- .../networking/dual-stack-ipfamilies-ipv6.yaml | 14 ++++++++++++++ .../dual-stack-prefer-ipv6-lb-svc.yaml | 16 ++++++++++++++++ .../dual-stack-preferred-ipfamilies-svc.yaml | 16 ++++++++++++++++ .../networking/dual-stack-preferred-svc.yaml | 13 +++++++++++++ 5 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 content/ja/examples/service/networking/dual-stack-ipfamilies-ipv6.yaml create mode 100644 content/ja/examples/service/networking/dual-stack-prefer-ipv6-lb-svc.yaml create mode 100644 content/ja/examples/service/networking/dual-stack-preferred-ipfamilies-svc.yaml create mode 100644 content/ja/examples/service/networking/dual-stack-preferred-svc.yaml diff --git a/content/ja/examples/service/networking/dual-stack-default-svc.yaml b/content/ja/examples/service/networking/dual-stack-default-svc.yaml index 00ed87ba19..86eadd5478 100644 --- a/content/ja/examples/service/networking/dual-stack-default-svc.yaml +++ b/content/ja/examples/service/networking/dual-stack-default-svc.yaml @@ -2,10 +2,11 @@ apiVersion: v1 kind: Service metadata: name: my-service + labels: + app: MyApp 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-ipfamilies-ipv6.yaml b/content/ja/examples/service/networking/dual-stack-ipfamilies-ipv6.yaml new file mode 100644 index 0000000000..7c7239cae6 --- /dev/null +++ b/content/ja/examples/service/networking/dual-stack-ipfamilies-ipv6.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: my-service + labels: + app: MyApp +spec: + ipFamilies: + - IPv6 + selector: + app: MyApp + ports: + - protocol: TCP + port: 80 diff --git a/content/ja/examples/service/networking/dual-stack-prefer-ipv6-lb-svc.yaml b/content/ja/examples/service/networking/dual-stack-prefer-ipv6-lb-svc.yaml new file mode 100644 index 0000000000..0949a75428 --- /dev/null +++ b/content/ja/examples/service/networking/dual-stack-prefer-ipv6-lb-svc.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: my-service + labels: + app: MyApp +spec: + ipFamilyPolicy: PreferDualStack + ipFamilies: + - IPv6 + type: LoadBalancer + selector: + app: MyApp + ports: + - protocol: TCP + port: 80 diff --git a/content/ja/examples/service/networking/dual-stack-preferred-ipfamilies-svc.yaml b/content/ja/examples/service/networking/dual-stack-preferred-ipfamilies-svc.yaml new file mode 100644 index 0000000000..c31acfec58 --- /dev/null +++ b/content/ja/examples/service/networking/dual-stack-preferred-ipfamilies-svc.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: my-service + labels: + app: MyApp +spec: + ipFamilyPolicy: PreferDualStack + ipFamilies: + - IPv6 + - IPv4 + selector: + app: MyApp + ports: + - protocol: TCP + port: 80 diff --git a/content/ja/examples/service/networking/dual-stack-preferred-svc.yaml b/content/ja/examples/service/networking/dual-stack-preferred-svc.yaml new file mode 100644 index 0000000000..8fb5bfa3d3 --- /dev/null +++ b/content/ja/examples/service/networking/dual-stack-preferred-svc.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: my-service + labels: + app: MyApp +spec: + ipFamilyPolicy: PreferDualStack + selector: + app: MyApp + ports: + - protocol: TCP + port: 80 From 553e907708fb02d6102e4d61ef4b1b8f7506071e Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Tue, 27 Apr 2021 11:17:35 +0000 Subject: [PATCH 114/221] Translate _index.md --- content/ja/docs/tasks/network/_index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/ja/docs/tasks/network/_index.md b/content/ja/docs/tasks/network/_index.md index 0dad8191a0..1d5796f7b7 100755 --- a/content/ja/docs/tasks/network/_index.md +++ b/content/ja/docs/tasks/network/_index.md @@ -1,6 +1,6 @@ --- -title: "Networking" -description: Learn how to configure networking for your cluster. +title: "ネットワーク" +description: クラスターのネットワークの設定方法を学びます。 weight: 160 --- From 68033869bf33f42a304d61fd946d84332046ba5e Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Tue, 27 Apr 2021 11:17:35 +0000 Subject: [PATCH 115/221] Translate tasks/network/validate-dual-stack into japanese --- .../docs/tasks/network/validate-dual-stack.md | 65 +++++++++---------- 1 file changed, 30 insertions(+), 35 deletions(-) diff --git a/content/ja/docs/tasks/network/validate-dual-stack.md b/content/ja/docs/tasks/network/validate-dual-stack.md index bc90dea4ea..ef8aaadf01 100644 --- a/content/ja/docs/tasks/network/validate-dual-stack.md +++ b/content/ja/docs/tasks/network/validate-dual-stack.md @@ -1,23 +1,19 @@ --- -reviewers: -- lachie83 -- khenidak -- bridgetkromhout min-kubernetes-server-version: v1.20 -title: Validate IPv4/IPv6 dual-stack +title: IPv4/IPv6デュアルスタックの検証 content_type: task --- <!-- overview --> -This document shares how to validate IPv4/IPv6 dual-stack enabled Kubernetes clusters. +このドキュメントでは、IPv4/IPv6デュアルスタックが有効化されたKubernetesクラスターを検証する方法について共有します。 ## {{% heading "prerequisites" %}} -* Provider support for dual-stack networking (Cloud provider or otherwise must be able to provide Kubernetes nodes with routable IPv4/IPv6 network interfaces) -* A [network plugin](/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports dual-stack (such as Kubenet or Calico) -* [Dual-stack enabled](/docs/concepts/services-networking/dual-stack/) cluster +* プロバイダーがデュアルスタックのネットワークをサポートしていること (クラウドプロバイダーか、ルーティングできるIPv4/IPv6ネットワークインターフェイスを持つKubernetesノードが提供できること) +* (KubenetやCalicoなど)デュアルスタックをサポートする[ネットワークプラグイン](/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) +* [デュアルスタックを有効化](/ja/docs/concepts/services-networking/dual-stack/)したクラスター {{< version-check >}} @@ -25,11 +21,11 @@ This document shares how to validate IPv4/IPv6 dual-stack enabled Kubernetes clu <!-- steps --> -## Validate addressing +## アドレスの検証 -### Validate node addressing +### ノードアドレスの検証 -Each dual-stack Node should have a single IPv4 block and a single IPv6 block allocated. Validate that IPv4/IPv6 Pod address ranges are configured by running the following command. Replace the sample node name with a valid dual-stack Node from your cluster. In this example, the Node's name is `k8s-linuxpool1-34450317-0`: +各デュアルスタックのノードは、1つのIPv4ブロックと1つのIPv6ブロックを割り当てる必要があります。IPv4/IPv6のPodアドレスの範囲が設定されていることを検証するには、次のコマンドを実行します。例の中のノード名は、自分のクラスターの有効なデュアルスタックのノードの名前に置換してください。この例では、ノードの名前は`k8s-linuxpool1-34450317-0`になっています。 ```shell kubectl get nodes k8s-linuxpool1-34450317-0 -o go-template --template='{{range .spec.podCIDRs}}{{printf "%s\n" .}}{{end}}' @@ -38,9 +34,10 @@ kubectl get nodes k8s-linuxpool1-34450317-0 -o go-template --template='{{range . 10.244.1.0/24 a00:100::/24 ``` -There should be one IPv4 block and one IPv6 block allocated. -Validate that the node has an IPv4 and IPv6 interface detected. Replace node name with a valid node from the cluster. In this example the node name is `k8s-linuxpool1-34450317-0`: +IPv4ブロックとIPv6ブロックがそれぞれ1つずつ割り当てられているはずです。 + +ノードが検出されたIPv4とIPv6のインターフェイスを持っていることを検証します。ノード名は自分のクラスター内の有効なノード名に置換してください。この例では、ノード名は`k8s-linuxpool1-34450317-0`になっています。 ```shell kubectl get nodes k8s-linuxpool1-34450317-0 -o go-template --template='{{range .status.addresses}}{{printf "%s: %s\n" .type .address}}{{end}}' @@ -51,9 +48,9 @@ InternalIP: 10.240.0.5 InternalIP: 2001:1234:5678:9abc::5 ``` -### Validate Pod addressing +### Podアドレスの検証 -Validate that a Pod has an IPv4 and IPv6 address assigned. Replace the Pod name with a valid Pod in your cluster. In this example the Pod name is `pod01`: +PodにIPv4とIPv6のアドレスが割り当てられていることを検証します。Podの名前は自分のクラスター内の有効なPodの名前と置換してください。この例では、Podの名前は`pod01`になっています。 ```shell kubectl get pods pod01 -o go-template --template='{{range .status.podIPs}}{{printf "%s\n" .ip}}{{end}}' @@ -63,7 +60,7 @@ kubectl get pods pod01 -o go-template --template='{{range .status.podIPs}}{{prin a00:100::4 ``` -You can also validate Pod IPs using the Downward API via the `status.podIPs` fieldPath. The following snippet demonstrates how you can expose the Pod IPs via an environment variable called `MY_POD_IPS` within a container. +Downward APIを使用して、`status.podIPs`のfieldPath経由でPod IPを検証することもできます。次のスニペットは、Pod IPを`MY_POD_IPS`という名前の環境変数経由でコンテナ内に公開する方法を示しています。 ``` env: @@ -73,7 +70,7 @@ You can also validate Pod IPs using the Downward API via the `status.podIPs` fie fieldPath: status.podIPs ``` -The following command prints the value of the `MY_POD_IPS` environment variable from within a container. The value is a comma separated list that corresponds to the Pod's IPv4 and IPv6 addresses. +次のコマンドを実行すると、`MY_POD_IPS`環境変数の値をコンテナ内から表示できます。値はカンマ区切りのリストであり、PodのIPv4とIPv6のアドレスに対応しています。 ```shell kubectl exec -it pod01 -- set | grep MY_POD_IPS @@ -82,7 +79,7 @@ kubectl exec -it pod01 -- set | grep MY_POD_IPS MY_POD_IPS=10.244.1.4,a00:100::4 ``` -The Pod's IP addresses will also be written to `/etc/hosts` within a container. The following command executes a cat on `/etc/hosts` on a dual stack Pod. From the output you can verify both the IPv4 and IPv6 IP address for the Pod. +PodのIPアドレスは、コンテナ内の`/etc/hosts`にも書き込まれます。次のコマンドは、デュアルスタックのPod上で`/etc/hosts`に対してcatコマンドを実行します。出力を見ると、Pod用のIPv4およびIPv6のIPアドレスの両方が確認できます。 ```shell kubectl exec -it pod01 -- cat /etc/hosts @@ -99,19 +96,19 @@ fe00::2 ip6-allrouters a00:100::4 pod01 ``` -## Validate Services +## Serviceの検証 -Create the following Service that does not explicitly define `.spec.ipFamilyPolicy`. Kubernetes will assign a cluster IP for the Service from the first configured `service-cluster-ip-range` and set the `.spec.ipFamilyPolicy` to `SingleStack`. +`.spec.isFamilyPolicy`を明示的に定義していない、以下のようなServiceを作成してみます。Kubernetesは最初に設定した`service-cluster-ip-range`の範囲からServiceにcluster IPを割り当てて、`.spec.ipFamilyPolicy`を`SingleStack`に設定します。 {{< codenew file="service/networking/dual-stack-default-svc.yaml" >}} -Use `kubectl` to view the YAML for the Service. +`kubectl`を使ってServiceのYAMLを表示します。 ```shell kubectl get svc my-service -o yaml ``` -The Service has `.spec.ipFamilyPolicy` set to `SingleStack` and `.spec.clusterIP` set to an IPv4 address from the first configured range set via `--service-cluster-ip-range` flag on kube-controller-manager. +Serviceの`.spec.ipFamilyPolicy`は`SingleStack`に設定され、`.spec.clusterIP`にはkube-controller-manager上の`--service-cluster-ip-range`フラグで最初に設定した範囲から1つのIPv4アドレスが設定されているのがわかります。 ```yaml apiVersion: v1 @@ -138,17 +135,17 @@ status: loadBalancer: {} ``` -Create the following Service that explicitly defines `IPv6` as the first array element in `.spec.ipFamilies`. Kubernetes will assign a cluster IP for the Service from the IPv6 range configured `service-cluster-ip-range` and set the `.spec.ipFamilyPolicy` to `SingleStack`. +`.spec.ipFamilies`内の配列の1番目の要素に`IPv6`を明示的に指定した、次のようなServiceを作成してみます。Kubernetesは`service-cluster-ip-range`で設定したIPv6の範囲からcluster IPを割り当てて、`.spec.ipFamilyPolicy`を`SingleStack`に設定します。 {{< codenew file="service/networking/dual-stack-ipfamilies-ipv6.yaml" >}} -Use `kubectl` to view the YAML for the Service. +`kubectl`を使ってServiceのYAMLを表示します。 ```shell kubectl get svc my-service -o yaml ``` -The Service has `.spec.ipFamilyPolicy` set to `SingleStack` and `.spec.clusterIP` set to an IPv6 address from the IPv6 range set via `--service-cluster-ip-range` flag on kube-controller-manager. +Serviceの`.spec.ipFamilyPolicy`は`SingleStack`に設定され、`.spec.clusterIP`には、kube-controller-manager上の`--service-cluster-ip-range`フラグで指定された最初の設定範囲から1つのIPv6アドレスが設定されているのがわかります。 ```yaml apiVersion: v1 @@ -176,12 +173,12 @@ status: loadBalancer: {} ``` -Create the following Service that explicitly defines `PreferDualStack` in `.spec.ipFamilyPolicy`. Kubernetes will assign both IPv4 and IPv6 addresses (as this cluster has dual-stack enabled) and select the `.spec.ClusterIP` from the list of `.spec.ClusterIPs` based on the address family of the first element in the `.spec.ipFamilies` array. +`.spec.ipFamiliePolicy`に`PreferDualStack`を明示的に指定した、次のようなServiceを作成してみます。Kubernetesは(クラスターでデュアルスタックを有効化しているため)IPv4およびIPv6のアドレスの両方を割り当て、`.spec.ClusterIPs`のリストから、`.spec.ipFamilies`配列の最初の要素のアドレスファミリーに基づいた`.spec.ClusterIP`を設定します。 {{< codenew file="service/networking/dual-stack-preferred-svc.yaml" >}} {{< note >}} -The `kubectl get svc` command will only show the primary IP in the `CLUSTER-IP` field. +`kubectl get svc`コマンドは、`CLUSTER-IP`フィールドにプライマリーのIPだけしか表示しません。 ```shell kubectl get svc -l app=MyApp @@ -191,7 +188,7 @@ my-service ClusterIP 10.0.216.242 <none> 80/TCP 5s ``` {{< /note >}} -Validate that the Service gets cluster IPs from the IPv4 and IPv6 address blocks using `kubectl describe`. You may then validate access to the service via the IPs and ports. +`kubectl describe`を使用して、ServiceがIPv4およびIPv6アドレスのブロックからcluster IPを割り当てられていることを検証します。その後、ServiceにIPアドレスとポートを使用してアクセスできることを検証することもできます。 ```shell kubectl describe svc -l app=MyApp @@ -215,23 +212,21 @@ Session Affinity: None Events: <none> ``` -### Create a dual-stack load balanced Service +### デュアルスタックのLoadBalancer Serviceを作成する -If the cloud provider supports the provisioning of IPv6 enabled external load balancers, create the following Service with `PreferDualStack` in `.spec.ipFamilyPolicy`, `IPv6` as the first element of the `.spec.ipFamilies` array and the `type` field set to `LoadBalancer`. +クラウドプロバイダーがIPv6を有効化した外部ロードバランサーのプロビジョニングをサポートする場合、`.spec.ipFamilyPolicy`に`PreferDualStack`を指定し、`.spec.ipFamilies`の最初の要素を`IPv6`にして、`type`フィールドに`LoadBalancer`を指定したServiceを作成できます。 {{< codenew file="service/networking/dual-stack-prefer-ipv6-lb-svc.yaml" >}} -Check the Service: +Serviceを確認します。 ```shell kubectl get svc -l app=MyApp ``` -Validate that the Service receives a `CLUSTER-IP` address from the IPv6 address block along with an `EXTERNAL-IP`. You may then validate access to the service via the IP and port. +ServiceがIPv6アドレスブロックから`CLUSTER-IP`のアドレスと`EXTERNAL-IP`を割り当てられていることを検証します。その後、IPとポートを用いたServiceへのアクセスを検証することもできます。 ```shell NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-service LoadBalancer fd00::7ebc 2603:1030:805::5 80:30790/TCP 35s ``` - - From d2db81bb16de5643dad3d7f730f3878d9108ef48 Mon Sep 17 00:00:00 2001 From: ranyuanyuan <523255931@qq.com> Date: Tue, 27 Apr 2021 21:42:45 +0800 Subject: [PATCH 116/221] Update service.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Most do not --> 大多数不支持 --- content/zh/docs/concepts/services-networking/service.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/concepts/services-networking/service.md b/content/zh/docs/concepts/services-networking/service.md index 3497dd817d..e032faaa86 100644 --- a/content/zh/docs/concepts/services-networking/service.md +++ b/content/zh/docs/concepts/services-networking/service.md @@ -2003,7 +2003,7 @@ provider offering this facility. (Most do not). {{< feature-state for_k8s_version="v1.20" state="stable" >}} 一旦你使用了支持 SCTP 流量的网络插件,你就可以使用 SCTP 于更多的服务。 -对于 type = LoadBalancer 的服务,SCTP 的支持取决于提供此设施的云供应商(多大数不支持)。 +对于 type = LoadBalancer 的服务,SCTP 的支持取决于提供此设施的云供应商(大多数不支持)。 <!-- #### Warnings {#caveat-sctp-overview} From 210775f69164f98789c818ee6c2432c4deb42493 Mon Sep 17 00:00:00 2001 From: Qiming Teng <tengqm@outlook.com> Date: Wed, 28 Apr 2021 11:27:08 +0800 Subject: [PATCH 117/221] [zh] Resync concepts section (7) --- .../concepts/workloads/pods/disruptions.md | 26 ++++--- .../workloads/pods/ephemeral-containers.md | 71 +++++++------------ .../workloads/pods/init-containers.md | 18 ++--- .../concepts/workloads/pods/pod-lifecycle.md | 41 ++++++----- .../pods/pod-topology-spread-constraints.md | 5 +- 5 files changed, 72 insertions(+), 89 deletions(-) diff --git a/content/zh/docs/concepts/workloads/pods/disruptions.md b/content/zh/docs/concepts/workloads/pods/disruptions.md index 442ab1bc4b..7320859778 100644 --- a/content/zh/docs/concepts/workloads/pods/disruptions.md +++ b/content/zh/docs/concepts/workloads/pods/disruptions.md @@ -5,6 +5,10 @@ weight: 60 --- <!-- +reviewers: +- erictune +- foxish +- davidopp title: Disruptions content_type: concept weight: 60 @@ -136,18 +140,18 @@ Here are some ways to mitigate involuntary disruptions: [stateless](/docs/tasks/run-application/run-stateless-application-deployment/) and [stateful](/docs/tasks/run-application/run-replicated-stateful-application/) applications.) - For even higher availability when running replicated applications, -spread applications across racks (using -[anti-affinity](/docs/user-guide/node-selection/#inter-pod-affinity-and-anti-affinity-beta-feature)) -or across zones (if using a -[multi-zone cluster](/docs/setup/multiple-zones).) + spread applications across racks (using + [anti-affinity](/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity)) + or across zones (if using a + [multi-zone cluster](/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/))扩展应用程序。 + [反亲和性](/zh/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity) + 或跨区域(如果使用[多区域集群](/zh/docs/setup/best-practices/multiple-zones/))扩展应用程序。 <!-- The frequency of voluntary disruptions varies. On a basic Kubernetes cluster, there are @@ -186,9 +190,9 @@ number needed for a quorum. A web front end might want to ensure that the number of replicas serving load never falls below a certain percentage of the total. --> -## 干扰预算 +## 干扰预算 {#pod-disruption-budgets} -{{< feature-state for_k8s_version="v1.5" state="beta" >}} +{{< feature-state for_k8s_version="v1.21" state="stable" >}} 即使你会经常引入自愿性干扰,Kubernetes 也能够支持你运行高度可用的应用。 @@ -199,11 +203,11 @@ Web 前端可能希望确保提供负载的副本数量永远不会低于总数 <!-- Cluster managers and hosting providers should use tools which -respect Pod Disruption Budgets by calling the [Eviction API](/docs/tasks/administer-cluster/safely-drain-node/#the-eviction-api) +respect PodDisruptionBudgets by calling the [Eviction API](/docs/tasks/administer-cluster/safely-drain-node/#eviction-api) instead of directly deleting pods or deployments. Examples are the `kubectl drain` command and the Kubernetes-on-GCE cluster upgrade script (`cluster/gce/upgrade.sh`). --> -集群管理员和托管提供商应该使用遵循 Pod Disruption Budgets 的接口 +集群管理员和托管提供商应该使用遵循 PodDisruptionBudgets 的接口 (通过调用[Eviction API](/zh/docs/tasks/administer-cluster/safely-drain-node/#the-eviction-api)), 而不是直接删除 Pod 或 Deployment。 @@ -264,7 +268,7 @@ during application updates is configured in spec for the specific workload resou When a pod is evicted using the eviction API, it is gracefully [terminated](/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination), hornoring the -`terminationGracePeriodSeconds` setting in its [PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core).) +`terminationGracePeriodSeconds` setting in its [PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core). --> 当使用驱逐 API 驱逐 Pod 时,Pod 会被体面地 [终止](/zh/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination),期间会 diff --git a/content/zh/docs/concepts/workloads/pods/ephemeral-containers.md b/content/zh/docs/concepts/workloads/pods/ephemeral-containers.md index 7161e3f7f3..728500be34 100644 --- a/content/zh/docs/concepts/workloads/pods/ephemeral-containers.md +++ b/content/zh/docs/concepts/workloads/pods/ephemeral-containers.md @@ -20,10 +20,12 @@ that runs temporarily in an existing {{< glossary_tooltip term_id="pod" >}} to accomplish user-initiated actions such as troubleshooting. You use ephemeral containers to inspect services rather than to build applications. --> -本页面概述了临时容器:一种特殊的容器,该容器在现有 {{< glossary_tooltip text="Pod" term_id="pod" >}} +本页面概述了临时容器:一种特殊的容器,该容器在现有 +{{< glossary_tooltip text="Pod" term_id="pod" >}} 中临时运行,以便完成用户发起的操作,例如故障排查。 你会使用临时容器来检查服务,而不是用它来构建应用程序。 +{{< warning >}} <!-- Ephemeral containers are in early alpha state and are not suitable for production clusters. You should expect the feature not to work in some situations, such as @@ -31,11 +33,10 @@ when targeting the namespaces of a container. In accordance with the [Kubernetes Deprecation Policy](/docs/reference/using-api/deprecation-policy/), this alpha feature could change significantly in the future or be removed entirely. --> -{{< warning >}} -临时容器处于早期的 alpha 阶段,不适用于生产环境集群。 +临时容器处于早期的 Alpha 阶段,不适用于生产环境集群。 应该预料到临时容器在某些情况下不起作用,例如在定位容器的命名空间时。 根据 [Kubernetes 弃用政策](/zh/docs/reference/using-api/deprecation-policy/), -此 alpha 功能将来可能发生重大变化或被完全删除。 +此 Alpha 功能将来可能发生重大变化或被完全删除。 {{< /warning >}} <!-- body --> @@ -49,7 +50,7 @@ replaceable, you cannot add a container to a Pod once it has been created. Instead, you usually delete and replace Pods in a controlled fashion using {{< glossary_tooltip text="deployments" term_id="deployment" >}}. --> -## 了解临时容器 +## 了解临时容器 {#understanding-ephemeral-containers} {{< glossary_tooltip text="Pod" term_id="pod" >}} 是 Kubernetes 应用程序的基本构建块。 由于 Pod 是一次性且可替换的,因此一旦 Pod 创建,就无法将容器加入到 Pod 中。 @@ -74,7 +75,7 @@ they are not appropriate for building applications. Ephemeral containers are described using the same `ContainerSpec` as regular containers, but many fields are incompatible and disallowed for ephemeral containers. --> -### 什么是临时容器? +### 什么是临时容器? {#what-is-an-ephemeral-container} 临时容器与其他容器的不同之处在于,它们缺少对资源或执行的保证,并且永远不会自动重启, 因此不适用于构建应用程序。 @@ -89,9 +90,7 @@ are incompatible and disallowed for ephemeral containers. --> - 临时容器没有端口配置,因此像 `ports`,`livenessProbe`,`readinessProbe` 这样的字段是不允许的。 - - Pod 资源分配是不可变的,因此 `resources` 配置是不允许的。 - - 有关允许字段的完整列表,请参见 [EphemeralContainer 参考文档](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#ephemeralcontainer-v1-core)。 @@ -116,7 +115,7 @@ Ephemeral containers are useful for interactive troubleshooting when `kubectl exec` is insufficient because a container has crashed or a container image doesn't include debugging utilities. --> -## 临时容器的用途 +## 临时容器的用途 {#uses-for-ephemeral-containers} 当由于容器崩溃或容器镜像不包含调试工具而导致 `kubectl exec` 无用时, 临时容器对于交互式故障排查很有用。 @@ -128,7 +127,7 @@ and exposure to bugs and vulnerabilities. Since distroless images do not include shell or any debugging utilities, it's difficult to troubleshoot distroless images using `kubectl exec` alone. --> -尤其是,[distroless 镜像](https://github.com/GoogleContainerTools/distroless) +尤其是,[Distroless 镜像](https://github.com/GoogleContainerTools/distroless) 允许用户部署最小的容器镜像,从而减少攻击面并减少故障和漏洞的暴露。 由于 distroless 镜像不包含 Shell 或任何的调试工具,因此很难单独使用 `kubectl exec` 命令进行故障排查。 @@ -138,19 +137,28 @@ When using ephemeral containers, it's helpful to enable [process namespace sharing](/docs/tasks/configure-pod-container/share-process-namespace/) so you can view processes in other containers. --> -使用临时容器时,启用[进程名字空间共享](/zh/docs/tasks/configure-pod-container/share-process-namespace/) +使用临时容器时,启用 +[进程名字空间共享](/zh/docs/tasks/configure-pod-container/share-process-namespace/) 很有帮助,可以查看其他容器中的进程。 <!-- -### Examples +See [Debugging with Ephemeral Debug Container](/docs/tasks/debug-application-cluster/debug-running-pod/#ephemeral-container) +for examples of troubleshooting using ephemeral containers. +--> +关于如何使用临时容器来执行故障排查的例子,可参阅 +[使用临时调试容器来调试](/zh/docs/tasks/debug-application-cluster/debug-running-pod/#ephemeral-container)。 +<!-- +## Ephemeral containers API +--> +### 临时容器 API {#ephemeral-containers-api}」 + +{{< note >}} +<!-- The examples in this section require the `EphemeralContainers` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) to be enabled, and Kubernetes client and server version v1.16 or later. --> -### 示例 - -{{< note >}} 本节中的示例要求启用 `EphemeralContainers` [特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/), 并且 kubernetes 客户端和服务端版本要求为 v1.16 或更高版本。 @@ -180,7 +188,7 @@ the ephemeral container to add as an `EphemeralContainers` list: "apiVersion": "v1", "kind": "EphemeralContainers", "metadata": { - "name": "example-pod" + "name": "example-pod" }, "ephemeralContainers": [{ "command": [ @@ -281,34 +289,3 @@ You can attach to the new ephemeral container using `kubectl attach`: 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 - 6 root 0:00 nginx: master process nginx -g daemon off; - 11 101 0:00 nginx: worker process - 12 101 0:00 nginx: worker process - 13 101 0:00 nginx: worker process - 14 101 0:00 nginx: worker process - 15 101 0:00 nginx: worker process - 16 101 0:00 nginx: worker process - 17 101 0:00 nginx: worker process - 18 101 0:00 nginx: worker process - 19 root 0:00 /pause - 24 root 0:00 sh - 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 692928099b..283b9f3759 100644 --- a/content/zh/docs/concepts/workloads/pods/init-containers.md +++ b/content/zh/docs/concepts/workloads/pods/init-containers.md @@ -1,6 +1,4 @@ --- -approvers: -- erictune title: Init 容器 content_type: concept weight: 40 @@ -514,9 +512,6 @@ Pod 级别的 cgroups 是基于有效 Pod 的请求和限制值,和调度器 A Pod can restart, causing re-execution of init containers, for the following reasons: -* A user updates the Pod specification, causing the init container image to change. - Any changes to the init container image restarts the Pod. App container image - changes only restart the app container. * The Pod infrastructure container is restarted. This is uncommon and would have to be done by someone with root access to nodes. * All containers in a Pod are terminated while `restartPolicy` is set to Always, @@ -527,15 +522,22 @@ reasons: Pod 重启会导致 Init 容器重新执行,主要有如下几个原因: -* 用户更新 Pod 的规约导致 Init 容器镜像发生改变。Init 容器镜像的变更会引起 Pod 重启。 - 应用容器镜像的变更仅会重启应用容器。 - * Pod 的基础设施容器 (译者注:如 `pause` 容器) 被重启。这种情况不多见, 必须由具备 root 权限访问节点的人员来完成。 * 当 `restartPolicy` 设置为 "`Always`",Pod 中所有容器会终止而强制重启。 由于垃圾收集机制的原因,Init 容器的完成记录将会丢失。 +<!-- +The Pod will not be restarted when the init container image is changed, or the +init container completion record has been lost due to garbage collection. This +applies for Kubernetes v1.20 and later. If you are using an earlier version of +Kubernetes, consult the documentation for the version you are using. +--> +当 Init 容器的镜像发生改变或者 Init 容器的完成记录因为垃圾收集等原因被丢失时, +Pod 不会被重启。这一行为适用于 Kubernetes v1.20 及更新版本。如果你在使用较早 +版本的 Kubernetes,可查阅你所使用的版本对应的文档。 + ## {{% heading "whatsnext" %}} <!-- diff --git a/content/zh/docs/concepts/workloads/pods/pod-lifecycle.md b/content/zh/docs/concepts/workloads/pods/pod-lifecycle.md index fc8a84e489..76702d222c 100644 --- a/content/zh/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/zh/docs/concepts/workloads/pods/pod-lifecycle.md @@ -74,18 +74,17 @@ ID([UID](/zh/docs/concepts/overview/working-with-objects/names/#uids)), <!-- Pods do not, by themselves, self-heal. If a Pod is scheduled to a -{{< glossary_tooltip text="node" term_id="node" >}} that then fails, -or if the scheduling operation itself fails, the Pod is deleted; likewise, a Pod won't +{{< glossary_tooltip text="node" term_id="node" >}} that then fails, the Pod is deleted; likewise, a Pod won't survive an eviction due to a lack of resources or Node maintenance. Kubernetes uses a higher-level abstraction, called a {{< glossary_tooltip term_id="controller" text="controller" >}}, that handles the work of managing the relatively disposable Pod instances. --> Pod 自身不具有自愈能力。如果 Pod 被调度到某{{< glossary_tooltip text="节点" term_id="node" >}} -而该节点之后失效,或者调度操作本身失效,Pod 会被删除;与此类似,Pod 无法在节点资源 -耗尽或者节点维护期间继续存活。Kubernetes 使用一种高级抽象,称作 -{{< glossary_tooltip term_id="controller" text="控制器" >}},来管理这些相对而言 -可随时丢弃的 Pod 实例。 +而该节点之后失效,Pod 会被删除;类似地,Pod 无法在因节点资源 +耗尽或者节点维护而被驱逐期间继续存活。Kubernetes 使用一种高级抽象 +来管理这些相对而言可随时丢弃的 Pod 实例,称作 +{{< glossary_tooltip term_id="controller" text="控制器" >}}。 <!-- A given Pod (as defined by a UID) is never "rescheduled" to a different node; instead, @@ -577,14 +576,14 @@ is different from the liveness probe. 如果你希望容器能够自行进入维护状态,也可以指定一个就绪态探针,检查某个特定于 就绪态的因此不同于存活态探测的端点。 +{{< note >}} <!-- -If you just want to be able to drain requests when the Pod is deleted, you do not +If you want to be able to drain requests when the Pod is deleted, you do not necessarily need a readiness probe; on deletion, the Pod automatically puts itself into an unready state regardless of whether the readiness probe exists. The Pod remains in the unready state while it waits for the containers in the Pod to stop. --> -{{< note >}} 请注意,如果你只是想在 Pod 被删除时能够排空请求,则不一定需要使用就绪态探针; 在删除 Pod 时,Pod 会自动将自身置于未就绪状态,无论就绪态探针是否存在。 等待 Pod 中的容器停止期间,Pod 会一直处于未就绪状态。 @@ -677,18 +676,6 @@ An example flow: On the node where the Pod is running: as soon as the kubelet sees that a Pod has been marked as terminating (a graceful shutdown duration has been set), the kubelet begins the local Pod shutdown process. - - 1. If one of the Pod's containers has defined a `preStop` - [hook](/docs/concepts/containers/container-lifecycle-hooks/#hook-details), the kubelet - runs that hook inside of the container. If the `preStop` hook is still running after the - grace period expires, the kubelet requests a small, one-off grace period extension of 2 - seconds. - If the `preStop` hook needs longer to complete than the default grace period allows, - you must modify `terminationGracePeriodSeconds` to suit this. - 1. The kubelet triggers the container runtime to send a TERM signal to process 1 inside each - container. - The containers in the Pod receive the TERM signal at different times and in an arbitrary - order. If the order of shutdowns matters, consider using a `preStop` hook to synchronize. --> 下面是一个例子: @@ -701,6 +688,19 @@ An example flow: 在 Pod 运行所在的节点上:`kubelet` 一旦看到 Pod 被标记为正在终止(已经设置了体面终止限期),`kubelet` 即开始本地的 Pod 关闭过程。 + <!-- + 1. If one of the Pod's containers has defined a `preStop` + [hook](/docs/concepts/containers/container-lifecycle-hooks/#hook-details), the kubelet + runs that hook inside of the container. If the `preStop` hook is still running after the + grace period expires, the kubelet requests a small, one-off grace period extension of 2 + seconds. + If the `preStop` hook needs longer to complete than the default grace period allows, + you must modify `terminationGracePeriodSeconds` to suit this. + 1. The kubelet triggers the container runtime to send a TERM signal to process 1 inside each + container. + The containers in the Pod receive the TERM signal at different times and in an arbitrary + order. If the order of shutdowns matters, consider using a `preStop` hook to synchronize. + --> 1. 如果 Pod 中的容器之一定义了 `preStop` [回调](/zh/docs/concepts/containers/container-lifecycle-hooks/#hook-details), `kubelet` 开始在容器内运行该回调逻辑。如果超出体面终止限期时,`preStop` 回调逻辑 @@ -847,7 +847,6 @@ This avoids a resource leak as Pods are created and terminated over time. and [ContainerStatus](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#containerstatus-v1-core). --> - * 动手实践[为容器生命周期时间关联处理程序](/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/)。 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 c18ed5c85d..2ddc5a4d9d 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 @@ -95,10 +95,11 @@ graph TB {{< /mermaid >}} <!-- -Instead of manually applying labels, you can also reuse the [well-known labels](/docs/reference/kubernetes-api/labels-annotations-taints/) that are created and populated automatically on most clusters. + +Instead of manually applying labels, you can also reuse the [well-known labels](/docs/reference/labels-annotations-taints/) that are created and populated automatically on most clusters. --> 你可以复用在大多数集群上自动创建和填充的 -[常用标签](/zh/docs/reference/kubernetes-api/labels-annotations-taints/), +[常用标签](/zh/docs/reference/labels-annotations-taints/), 而不是手动添加标签。 <!-- From dbdbf49b4988e3a1738e26f6d0048db61b32fd6e Mon Sep 17 00:00:00 2001 From: Qiming Teng <tengqm@outlook.com> Date: Wed, 28 Apr 2021 12:18:37 +0800 Subject: [PATCH 118/221] [zh] Resync concepts section (8) --- .../concepts/workloads/controllers/job.md | 261 ++++++++++++++++-- 1 file changed, 234 insertions(+), 27 deletions(-) diff --git a/content/zh/docs/concepts/workloads/controllers/job.md b/content/zh/docs/concepts/workloads/controllers/job.md index a2a6982e54..27e97ef8bf 100644 --- a/content/zh/docs/concepts/workloads/controllers/job.md +++ b/content/zh/docs/concepts/workloads/controllers/job.md @@ -25,7 +25,8 @@ weight: 50 A Job creates one or more Pods and will continue to retry execution of the Pods until a specified number of them successfully terminate. As pods successfully complete, the Job tracks the successful completions. When a specified number of successful completions is reached, the task (ie, Job) is complete. Deleting a Job will clean up -the Pods it created. +the Pods it created. Suspending a Job will delete its active Pods until the Job +is resumed again. A simple case is to create one Job object in order to reliably run one Pod to completion. The Job object will start a new Pod if the first Pod fails or is deleted (for example @@ -33,11 +34,11 @@ due to a node hardware failure or a node reboot). You can also use a Job to run multiple Pods in parallel. --> - Job 会创建一个或者多个 Pods,并将继续重试 Pods 的执行,直到指定数量的 Pods 成功终止。 随着 Pods 成功结束,Job 跟踪记录成功完成的 Pods 个数。 当数量达到指定的成功个数阈值时,任务(即 Job)结束。 删除 Job 的操作会清除所创建的全部 Pods。 +挂起 Job 的操作会删除 Job 的所有活跃 Pod,直到 Job 被再次恢复执行。 一种简单的使用场景下,你会创建一个 Job 对象以便以一种可靠的方式运行某 Pod 直到完成。 当第一个 Pod 失败或者被删除(比如因为节点硬件失效或者重启)时,Job @@ -224,8 +225,8 @@ There are three main types of task suitable to run as a Job: - the Job is complete as soon as its Pod terminates successfully. 1. Parallel Jobs with a *fixed completion count*: - specify a non-zero positive value for `.spec.completions`. - - the Job represents the overall task, and is complete when there is one successful Pod for each value in the range 1 to `.spec.completions`. - - **not implemented yet:** Each Pod is passed a different index in the range 1 to `.spec.completions`. + - the Job represents the overall task, and is complete when there are `.spec.completions` successful Pods. + - when using `.spec.completionMode="Indexed"`, each Pod gets a different index in the range 0 to `.spec.completions-1`. 1. Parallel Jobs with a *work queue*: - do not specify `.spec.completions`, default to `.spec.parallelism`. - the Pods must coordinate amongst themselves or an external service to determine what each should work on. For example, a Pod might fetch a batch of up to N items from the work queue. @@ -234,21 +235,21 @@ There are three main types of task suitable to run as a Job: - once at least one Pod has terminated with success and all Pods are terminated, then the Job is completed with success. - once any Pod has exited with success, no other Pod should still be doing any work for this task or writing any output. They should all be in the process of exiting. --> -1. 非并行 Job - - 通常只启动一个 Pod,除非该 Pod 失败 - - 当 Pod 成功终止时,立即视 Job 为完成状态 -1. 具有 *确定完成计数* 的并行 Job - - `.spec.completions` 字段设置为非 0 的正数值 - - Job 用来代表整个任务,当对应于 1 和 `.spec.completions` 之间的每个整数都存在 - 一个成功的 Pod 时,Job 被视为完成 - - **尚未实现**:每个 Pod 收到一个介于 1 和 `spec.completions` 之间的不同索引值 -1. 带 *工作队列* 的并行 Job - - 不设置 `spec.completions`,默认值为 `.spec.parallelism` +1. 非并行 Job: + - 通常只启动一个 Pod,除非该 Pod 失败。 + - 当 Pod 成功终止时,立即视 Job 为完成状态。 +1. 具有 *确定完成计数* 的并行 Job: + - `.spec.completions` 字段设置为非 0 的正数值。 + - Job 用来代表整个任务,当成功的 Pod 个数达到 `.spec.completions` 时,Job 被视为完成。 + - 当使用 `.spec.completionMode="Indexed"` 时,每个 Pod 都会获得一个不同的 + 索引值,介于 0 和 `.spec.completions-1` 之间。 +1. 带 *工作队列* 的并行 Job: + - 不设置 `spec.completions`,默认值为 `.spec.parallelism`。 - 多个 Pod 之间必须相互协调,或者借助外部服务确定每个 Pod 要处理哪个工作条目。 例如,任一 Pod 都可以从工作队列中取走最多 N 个工作条目。 - - 每个 Pod 都可以独立确定是否其它 Pod 都已完成,进而确定 Job 是否完成 - - 当 Job 中 _任何_ Pod 成功终止,不再创建新 Pod - - 一旦至少 1 个 Pod 成功完成,并且所有 Pod 都已终止,即可宣告 Job 成功完成 + - 每个 Pod 都可以独立确定是否其它 Pod 都已完成,进而确定 Job 是否完成。 + - 当 Job 中 _任何_ Pod 成功终止,不再创建新 Pod。 + - 一旦至少 1 个 Pod 成功完成,并且所有 Pod 都已终止,即可宣告 Job 成功完成。 - 一旦任何 Pod 成功退出,任何其它 Pod 都不应再对此任务执行任何操作或生成任何输出。 所有 Pod 都应启动退出过程。 @@ -314,6 +315,59 @@ parallelism, for a variety of reasons: - Job 控制器可能会因为之前同一 Job 中 Pod 失效次数过多而压制新 Pod 的创建。 - 当 Pod 处于体面终止进程中,需要一定时间才能停止。 +<!-- +### Completion mode +--> +### 完成模式 {#completion-mode} + +{{< feature-state for_k8s_version="v1.21" state="alpha" >}} + +{{< note >}} +<!-- +To be able to create Indexed Jobs, make sure to enable the `IndexedJob` +[feature gate](/docs/reference/command-line-tools-reference/feature-gates/) +on the [API server](/docs/reference/command-line-tools-reference/kube-apiserver/) +and the [controller manager](/docs/reference/command-line-tools-reference/kube-controller-manager/). +--> +若想创建带索引的 Job(Indexed Job),请确保 +[API 服务器](/zh/docs/reference/command-line-tools-reference/kube-apiserver/) +和[控制器管理器](/docs/reference/command-line-tools-reference/kube-controller-manager/) +上的 +[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) +`IndexedJob` 被启用。 +{{< /note >}} + +<!-- +Jobs with _fixed completion count_ - that is, jobs that have non null +`.spec.completions` - can have a completion mode that is specified in `.spec.completionMode`: +--> +带有 *确定完成计数* 的 Job,即 `.spec.completions` 不为 null 的 Job, +都可以在其 `.spec.completionMode` 中设置完成模式: + +<!-- +- `NonIndexed` (default): the Job is considered complete when there have been + `.spec.completions` successfully completed Pods. In other words, each Pod + completion is homologous to each other. Note that Jobs that have null + `.spec.completions` are implicitly `NonIndexed`. +- `Indexed`: the Pods of a Job get an associated completion index from 0 to + `.spec.completions-1`, available in the annotation `batch.kubernetes.io/job-completion-index`. + The Job is considered complete when there is one successfully completed Pod + for each index. For more information about how to use this mode, see + [Indexed Job for Parallel Processing with Static Work Assignment](/docs/tasks/job/indexed-parallel-processing-static/). + Note that, although rare, more than one Pod could be started for the same + index, but only one of them will count towards the completion count. +--> +- `NonIndexed` (默认值):当成功完成的 Pod 个数达到 `.spec.completions` 所 + 设值时认为 Job 已经完成。换言之,每个 Job 完成事件都是独立无关且同质的。 + 要注意的是,当 `.spec.completions` 取值为 null 时,Job 被隐式处理为 `NonIndexed`。 +- `Indexed`:Job 的 Pod 会获得对应的完成索引,取值为 0 到 `.spec.completions-1`, + 存放在注解 `batch.kubernetes.io/job-completion-index` 中。 + 当每个索引都对应一个完成完成的 Pod 时,Job 被认为是已完成的。 + 关于如何使用这种模式的更多信息,可参阅 + [用带索引的 Job 执行基于静态任务分配的并行处理](/zh/docs/tasks/job/indexed-parallel-processing-static/)。 + 需要注意的是,对同一索引值可能被启动的 Pod 不止一个,尽管这种情况很少发生。 + 这时,只有一个会被记入完成计数中。 + <!-- ## Handling Pod and container failures @@ -631,12 +685,12 @@ The pattern names are also links to examples and more detailed description. 下面是对这些权衡的汇总,列 2 到 4 对应上面的权衡比较。 模式的名称对应了相关示例和更详细描述的链接。 -| 模式 | 单个 Job 对象 | Pods 数少于工作条目数? | 直接使用应用无需修改? | 在 Kube 1.1 上可用?| -| ----- |:-------------:|:-----------------------:|:---------------------:|:-------------------:| -| [Job 模版扩展](/zh/docs/tasks/job/parallel-processing-expansion/) | | | ✓ | ✓ | -| [每工作条目一 Pod 的队列](/zh/docs/tasks/job/coarse-parallel-processing-work-queue/) | ✓ | | 有时 | ✓ | -| [Pod 数量可变的队列](/zh/docs/tasks/job/fine-parallel-processing-work-queue/) | ✓ | ✓ | | ✓ | -| 静态工作分派的单个 Job | ✓ | | ✓ | | +| 模式 | 单个 Job 对象 | Pods 数少于工作条目数? | 直接使用应用无需修改? | +| ----- |:-------------:|:-----------------------:|:---------------------:| +| [每工作条目一 Pod 的队列](/zh/docs/tasks/job/coarse-parallel-processing-work-queue/) | ✓ | | 有时 | +| [Pod 数量可变的队列](/zh/docs/tasks/job/fine-parallel-processing-work-queue/) | ✓ | ✓ | | +| [静态任务分派的带索引的 Job](/zh/docs/tasks/job/indexed-parallel-processing-static) | ✓ | | ✓ | +| [Job 模版扩展](/zh/docs/tasks/job/parallel-processing-expansion/) | | | ✓ | <!-- When you specify completions with `.spec.completions`, each Pod created by the Job controller @@ -659,14 +713,169 @@ Here, `W` is the number of work items. | 模式 | `.spec.completions` | `.spec.parallelism` | | ----- |:-------------------:|:--------------------:| -| [Job 模版扩展](/zh/docs/tasks/job/parallel-processing-expansion/) | 1 | 应该为 1 | | [每工作条目一 Pod 的队列](/zh/docs/tasks/job/coarse-parallel-processing-work-queue/) | W | 任意值 | | [Pod 个数可变的队列](/zh/docs/tasks/job/fine-parallel-processing-work-queue/) | 1 | 任意值 | -| 基于静态工作分派的单一 Job | W | 任意值 | +| [静态任务分派的带索引的 Job](/zh/docs/tasks/job/indexed-parallel-processing-static) | W | | 任意值 | +| [Job 模版扩展](/zh/docs/tasks/job/parallel-processing-expansion/) | 1 | 应该为 1 | <!-- ## Advanced usage +### Suspending a Job +--> +## 高级用法 {#advanced-usage} + +### 挂起 Job {#suspending-a-job} + +{{< feature-state for_k8s_version="v1.21" state="alpha" >}} + +{{< note >}} +<!-- +Suspending Jobs is available in Kubernetes versions 1.21 and above. You must +enable the `SuspendJob` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) +on the [API server](/docs/reference/command-line-tools-reference/kube-apiserver/) +and the [controller manager](/docs/reference/command-line-tools-reference/kube-controller-manager/) +in order to use this feature. +--> +在 Kubernetes 1.21 及更高版本中可以执行挂起(Suspending)Job 的操作。 +你必须在 +[API 服务器](/zh/docs/reference/command-line-tools-reference/kube-apiserver/) +和[控制器管理器](/zh/docs/reference/command-line-tools-reference/kube-controller-manager/) +上启用 `SuspendJob` 这一 +[特性门控](/docs/reference/command-line-tools-reference/feature-gates/) +才能执行此操作, +{{< /note >}} + +<!-- +When a Job is created, the Job controller will immediately begin creating Pods +to satisfy the Job's requirements and will continue to do so until the Job is +complete. However, you may want to temporarily suspend a Job's execution and +resume it later. To suspend a Job, you can update the `.spec.suspend` field of +the Job to true; later, when you want to resume it again, update it to false. +Creating a Job with `.spec.suspend` set to true will create it in the suspended +state. +--> +Job 被创建时,Job 控制器会马上开始执行 Pod 创建操作以满足 Job 的需求, +并持续执行此操作直到 Job 完成为止。 +不过你可能想要暂时挂起 Job 执行,之后再恢复其执行。 +要挂起一个 Job,你可以将 Job 的 `.spec.suspend` 字段更新为 true。 +之后,当你希望恢复其执行时,将其更新为 false。 +创建一个 `.spec.suspend` 被设置为 true 的 Job 本质上会将其创建为被挂起状态。 + +<!-- +When a Job is resumed from suspension, its `.status.startTime` field will be +reset to the current time. This means that the `.spec.activeDeadlineSeconds` +timer will be stopped and reset when a Job is suspended and resumed. +--> +当 Job 被从挂起状态恢复执行时,其 `.status.startTime` 字段会被重置为 +当前的时间。这意味着 `.spec.activeDeadlineSeconds` 计时器会在 Job 挂起时 +被停止,并在 Job 恢复执行时复位。 + +<!-- +Remember that suspending a Job will delete all active Pods. When the Job is +suspended, your [Pods will be terminated](/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination) +with a SIGTERM signal. The Pod's graceful termination period will be honored and +your Pod must handle this signal in this period. This may involve saving +progress for later or undoing changes. Pods terminated this way will not count +towards the Job's `completions` count. +--> +要记住的是,挂起 Job 会删除其所有活跃的 Pod。当 Job 被挂起时,你的 Pod 会 +收到 SIGTERM 信号而被[终止](/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination)。 +Pod 的体面终止期限会被考虑,不过 Pod 自身也必须在此期限之内处理完信号。 +处理逻辑可能包括保存进度以便将来恢复,或者取消已经做出的变更等等。 +Pod 以这种形式终止时,不会被记入 Job 的 `completions` 计数。 + +<!-- +An example Job definition in the suspended state can be like so: +--> +处于被挂起状态的 Job 的定义示例可能是这样子: + +```shell +kubectl get job myjob -o yaml +``` + +```yaml +apiVersion: batch/v1 +kind: Job +metadata: + name: myjob +spec: + suspend: true + parallelism: 1 + completions: 5 + template: + spec: + ... +``` + +<!-- +The Job's status can be used to determine if a Job is suspended or has been +suspended in the past: +--> +Job 的 `status` 可以用来确定 Job 是否被挂起,或者曾经被挂起。 + +```shell +kubectl get jobs/myjob -o yaml +``` + +```json +apiVersion: batch/v1 +kind: Job +# .metadata and .spec omitted +status: + conditions: + - lastProbeTime: "2021-02-05T13:14:33Z" + lastTransitionTime: "2021-02-05T13:14:33Z" + status: "True" + type: Suspended + startTime: "2021-02-05T13:13:48Z" +``` + +<!-- +The Job condition of type "Suspended" with status "True" means the Job is +suspended; the `lastTransitionTime` field can be used to determine how long the +Job has been suspended for. If the status of that condition is "False", then the +Job was previously suspended and is now running. If such a condition does not +exist in the Job's status, the Job has never been stopped. + +Events are also created when the Job is suspended and resumed: +--> +Job 的 "Suspended" 类型的状况在状态值为 "True" 时意味着 Job 正被 +挂起;`lastTransitionTime` 字段可被用来确定 Job 被挂起的时长。 +如果此状况字段的取值为 "False",则 Job 之前被挂起且现在在运行。 +如果 "Suspended" 状况在 `status` 字段中不存在,则意味着 Job 从未 +被停止执行。 + +当 Job 被挂起和恢复执行时,也会生成事件: + +```shell +kubectl describe jobs/myjob +``` + +``` +Name: myjob +... +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal SuccessfulCreate 12m job-controller Created pod: myjob-hlrpl + Normal SuccessfulDelete 11m job-controller Deleted pod: myjob-hlrpl + Normal Suspended 11m job-controller Job suspended + Normal SuccessfulCreate 3s job-controller Created pod: myjob-jvb44 + Normal Resumed 3s job-controller Job resumed +``` + +<!-- +The last four events, particularly the "Suspended" and "Resumed" events, are +directly a result of toggling the `.spec.suspend` field. In the time between +these two events, we see that no Pods were created, but Pod creation restarted +as soon as the Job was resumed. +--> +最后四个四件,特别是 "Suspended" 和 "Resumed" 事件,都是因为 `.spec.suspend` +字段值被改来改去造成的。在这两个事件之间,我们看到没有 Pod 被创建,不过当 +Job 被恢复执行时,Pod 创建操作立即被重启执行。 + +<!-- ### Specifying your own Pod selector {#specifying-your-own-pod-selector} Normally, when you create a Job object, you do not specify `.spec.selector`. @@ -676,8 +885,6 @@ It picks a selector value that will not overlap with any other jobs. However, in some cases, you might need to override this automatically set selector. To do this, you can specify the `.spec.selector` of the Job. --> -## 高级用法 {#advanced-usage} - ### 指定你自己的 Pod 选择算符 {#specifying-your-own-pod-selector} 通常,当你创建一个 Job 对象时,你不会设置 `.spec.selector`。 From 9e7587eae5288f48de624c55e2ab175961abe0a5 Mon Sep 17 00:00:00 2001 From: YukiKasuya <yu-kasuya@kddilabs.jp> Date: Wed, 28 Apr 2021 13:45:31 +0900 Subject: [PATCH 119/221] Fix a expression --- content/ja/docs/concepts/overview/kubernetes-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/overview/kubernetes-api.md b/content/ja/docs/concepts/overview/kubernetes-api.md index 07fcff478b..b02343e73c 100644 --- a/content/ja/docs/concepts/overview/kubernetes-api.md +++ b/content/ja/docs/concepts/overview/kubernetes-api.md @@ -21,7 +21,7 @@ Kubernetes APIを使用すると、Kubernetes API内のオブジェクトの状 ほとんどの操作は、APIを使用している[kubectl](/docs/reference/kubectl/overview/)コマンドラインインターフェースもしくは[kubeadm](/docs/reference/setup-tools/kubeadm/)のような別のコマンドラインツールを通して実行できます。 RESTコールを利用して直接APIにアクセスすることも可能です。 -Kubernetes APIを利用してアプリケーションを書いているのであれば、[client libraries](/docs/reference/using-api/client-libraries/)のうちひとつの利用を考えてみてください。 +Kubernetes APIを利用してアプリケーションを書いているのであれば、[client libraries](/docs/reference/using-api/client-libraries/)の利用を考えてみてください。 <!-- body --> From 14c3dc1968e725003b2ff2b315f9e6b4476427e2 Mon Sep 17 00:00:00 2001 From: yu-kasuya <yu-kasuya@kddilabs.jp> Date: Wed, 28 Apr 2021 13:46:58 +0900 Subject: [PATCH 120/221] Update content/ja/docs/concepts/overview/kubernetes-api.md Co-authored-by: inductor(Kohei) <kela@inductor.me> --- content/ja/docs/concepts/overview/kubernetes-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/overview/kubernetes-api.md b/content/ja/docs/concepts/overview/kubernetes-api.md index b02343e73c..876cdac7fa 100644 --- a/content/ja/docs/concepts/overview/kubernetes-api.md +++ b/content/ja/docs/concepts/overview/kubernetes-api.md @@ -111,6 +111,6 @@ Kubernetes APIは2つの方法で拡張できます。 ## {{% heading "whatsnext" %}} - 自分自身で[カスタムリソース定義](/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/)を追加してKubernetes APIを拡張する方法について学んでください。 -- [Kubernetes APIのアクセス制御 ](/docs/concepts/security/controlling-access/)では、クラスターがAPIアクセスの認証と承認を管理する方法を説明しています。 +- [Kubernetes APIのアクセス制御](/docs/concepts/security/controlling-access/)では、クラスターがAPIアクセスの認証と承認を管理する方法を説明しています。 - [APIリファレンス](/ja/docs/reference/kubernetes-api/)を読んで、APIエンドポイント、リソースタイプやサンプルについて学んでください。 - [APIの変更](https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md#readme)から、互換性のある変更とは何か, どのようにAPIを変更するかについて学んでください。 From 65a5f83483b6d902e3e62c8f5722f63f6c61ac3a Mon Sep 17 00:00:00 2001 From: Qiming Teng <tengqm@outlook.com> Date: Wed, 28 Apr 2021 13:40:50 +0800 Subject: [PATCH 121/221] [zh] Resync concepts section (9) --- .../workloads/controllers/cron-jobs.md | 70 ++++++------- .../workloads/controllers/replicaset.md | 98 ++++++++++++++++++- .../controllers/replicationcontroller.md | 52 ++++++---- .../workloads/controllers/ttlafterfinished.md | 14 +-- 4 files changed, 174 insertions(+), 60 deletions(-) diff --git a/content/zh/docs/concepts/workloads/controllers/cron-jobs.md b/content/zh/docs/concepts/workloads/controllers/cron-jobs.md index 21eb03385c..44be9b9a68 100644 --- a/content/zh/docs/concepts/workloads/controllers/cron-jobs.md +++ b/content/zh/docs/concepts/workloads/controllers/cron-jobs.md @@ -12,15 +12,15 @@ weight: 80 <!-- overview --> -{{< feature-state for_k8s_version="v1.8" state="beta" >}} +{{< feature-state for_k8s_version="v1.21" state="stable" >}} <!-- -A _Cron Job_ creates [Jobs](/docs/concepts/workloads/controllers/jobs-run-to-completion/) on a time-based schedule. +A _CronJob_ creates {{< glossary_tooltip term_id="job" text="Jobs" >}} on a repeating schedule. 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/job/)。 +_CronJob_ 创建基于时隔重复调度的 {{< glossary_tooltip term_id="job" text="Jobs" >}}。 一个 CronJob 对象就像 _crontab_ (cron table) 文件中的一行。 它用 [Cron](https://en.wikipedia.org/wiki/Cron) 格式进行编写, @@ -102,24 +102,22 @@ This example CronJob manifest prints the current time and a hello message every # * * * * * ``` - <!-- -| Entry | Description | Equivalent to | -| ------------- | ------------- |------------- | -| @yearly (or @annually) | Run once a year at midnight of 1 January | 0 0 1 1 * | -| @monthly | Run once a month at midnight of the first day of the month | 0 0 1 * * | -| @weekly | Run once a week at midnight on Sunday morning | 0 0 * * 0 | -| @daily (or @midnight) | Run once a day at midnight | 0 0 * * * | -| @hourly | Run once an hour at the beginning of the hour | 0 * * * * | +| Entry | Description | Equivalent to | +| ------------- | ------------- |------------- | +| @yearly (or @annually) | Run once a year at midnight of 1 January | 0 0 1 1 * | +| @monthly | Run once a month at midnight of the first day of the month | 0 0 1 * * | +| @weekly | Run once a week at midnight on Sunday morning | 0 0 * * 0 | +| @daily (or @midnight) | Run once a day at midnight | 0 0 * * * | +| @hourly | Run once an hour at the beginning of the hour | 0 * * * * | --> -| 输入 | 描述 | 相当于 | -| ------------- | ------------- |------------- | -| @yearly (or @annually) | 每年 1 月 1 日的午夜运行一次 | 0 0 1 1 * | -| @monthly | 每月第一天的午夜运行一次 | 0 0 1 * * | -| @weekly | 每周的周日午夜运行一次 | 0 0 * * 0 | -| @daily (or @midnight) | 每天午夜运行一次 | 0 0 * * * | -| @hourly | 每小时的开始一次 | 0 * * * * | - +| 输入 | 描述 | 相当于 | +| ------------- | ------------- |------------- | +| @yearly (or @annually) | 每年 1 月 1 日的午夜运行一次 | 0 0 1 1 * | +| @monthly | 每月第一天的午夜运行一次 | 0 0 1 * * | +| @weekly | 每周的周日午夜运行一次 | 0 0 * * 0 | +| @daily (or @midnight) | 每天午夜运行一次 | 0 0 * * * | +| @hourly | 每小时的开始一次 | 0 * * * * | <!-- For example, the line below states that the task must be started every Friday at midnight, as well as on the 13th of each month at midnight: @@ -192,8 +190,10 @@ For example, suppose a CronJob is set to schedule a new Job every one minute beg `startingDeadlineSeconds` field is not set. If the CronJob controller happens to be down from `08:29:00` to `10:21:00`, the job will not start as the number of missed jobs which missed their schedule is greater than 100. --> -例如,假设一个 CronJob 被设置为从 `08:30:00` 开始每隔一分钟创建一个新的 Job,并且它的 `startingDeadlineSeconds` 字段 -未被设置。如果 CronJob 控制器从 `08:29:00` 到 `10:21:00` 终止运行,则该 Job 将不会启动,因为其错过的调度次数超过了100。 +例如,假设一个 CronJob 被设置为从 `08:30:00` 开始每隔一分钟创建一个新的 Job, +并且它的 `startingDeadlineSeconds` 字段未被设置。如果 CronJob 控制器从 +`08:29:00` 到 `10:21:00` 终止运行,则该 Job 将不会启动,因为其错过的调度 +次数超过了 100。 <!-- To illustrate this concept further, suppose a CronJob is set to schedule a new Job every one minute beginning at `08:30:00`, and its @@ -214,22 +214,25 @@ the Job in turn is responsible for the management of the Pods it represents. CronJob 仅负责创建与其调度时间相匹配的 Job,而 Job 又负责管理其代表的 Pod。 <!-- -## New controller +## Controller version {#new-controller} -There's an alternative implementation of the CronJob controller, available as an alpha feature since Kubernetes 1.20. To select version 2 of the CronJob controller, pass the following [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) flag to the {{< glossary_tooltip term_id="kube-controller-manager" text="kube-controller-manager" >}}. - -``` ---feature-gates="CronJobControllerV2=true" -``` +Starting with Kubernetes v1.21 the second version of the CronJob controller +is the default implementation. To disable the default CronJob controller +and use the original CronJob controller instead, one pass the `CronJobControllerV2` +[feature gate](/docs/reference/command-line-tools-reference/feature-gates/) +flag to the {{< glossary_tooltip term_id="kube-controller-manager" text="kube-controller-manager" >}}, +and set this flag to `false`. For example: --> -## 新控制器 +## 控制器版本 {#new-controller} -CronJob 控制器有一个替代的实现,自 Kubernetes 1.20 开始以 alpha 特性引入。 -如果选择 CronJob 控制器的 v2 版本,请在 {{< glossary_tooltip term_id="kube-controller-manager" text="kube-controller-manager" >}} -中设置以下[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) 标志。 +从 Kubernetes v1.21 版本开始,CronJob 控制器的第二个版本被用作默认实现。 +要禁用此默认 CronJob 控制器而使用原来的 CronJob 控制器,请在 +{{< glossary_tooltip term_id="kube-controller-manager" text="kube-controller-manager" >}} +中设置[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) +`CronJobControllerV2`,将此标志设置为 `false`。例如: ``` ---feature-gates="CronJobControllerV2=true" +--feature-gates="CronJobControllerV2=false" ``` ## {{% heading "whatsnext" %}} @@ -240,7 +243,8 @@ documents the format of CronJob `schedule` fields. For instructions on creating and working with cron jobs, and for an example of a spec file for a cron job, see [Running automated tasks with cron jobs](/docs/tasks/job/automated-tasks-with-cron-jobs). --> -* 进一步了解 [Cron 表达式的格式](https://en.wikipedia.org/wiki/Cron),学习设置 CronJob `schedule` 字段 +* 进一步了解 [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/replicaset.md b/content/zh/docs/concepts/workloads/controllers/replicaset.md index 7ad68c9e53..14c86eb956 100644 --- a/content/zh/docs/concepts/workloads/controllers/replicaset.md +++ b/content/zh/docs/concepts/workloads/controllers/replicaset.md @@ -472,7 +472,7 @@ curl -X DELETE 'localhost:8080/apis/apps/v1/namespaces/default/replicasets/fron <!-- ### Deleting just a ReplicaSet -You can delete a ReplicaSet without affecting any of its Pods using [`kubectl delete`](/docs/reference/generated/kubectl/kubectl-commands#delete) with the `--cascade=orphan` option. +You can delete a ReplicaSet without affecting any of its Pods using [`kubectl delete`](/docs/reference/generated/kubectl/kubectl-commands#delete) with the `-cascade=orphan` option. When using the REST API or the `client-go` library, you must set `propagationPolicy` to `Orphan`. For example: --> @@ -531,6 +531,102 @@ ensures that a desired number of pods with a matching label selector are availab 通过更新 `.spec.replicas` 字段,ReplicaSet 可以被轻松的进行缩放。ReplicaSet 控制器能确保匹配标签选择器的数量的 Pod 是可用的和可操作的。 +<!-- +When scaling down, the ReplicaSet controller chooses which pods to delete by sorting the available pods to +prioritize scaling down pods based on the following general algorithm: +--> +在降低集合规模时,ReplicaSet 控制器通过对可用的 Pods 进行排序来优先选择 +要被删除的 Pods。其一般性算法如下: + +<!-- + 1. Pending (and unschedulable) pods are scaled down first + 2. If controller.kubernetes.io/pod-deletion-cost annotation is set, then + the pod with the lower value will come first. + 3. Pods on nodes with more replicas come before pods on nodes with fewer replicas. + 4. If the pods' creation times differ, the pod that was created more recently + comes before the older pod (the creation times are bucketed on an integer log scale + when the `LogarithmicScaleDown` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) is enabled) +--> +1. 首先选择剔除悬决(Pending,且不可调度)的 Pods +2. 如果设置了 `controller.kubernetes.io/pod-deletion-cost` 注解,则注解值 + 较小的优先被裁减掉 +3. 所处节点上副本个数较多的 Pod 优先于所处节点上副本较少者 +4. 如果 Pod 的创建时间不同,最近创建的 Pod 优先于早前创建的 Pod 被裁减。 + (当 `LogarithmicScaleDown` 这一 + [特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) + 被启用时,创建时间是按整数幂级来分组的)。 + +如果以上比较结果都相同,则随机选择。 + +<!-- +### Pod deletion cost +--> +### Pod 删除开销 {#pod-deletion-cost} + +{{< feature-state for_k8s_version="v1.21" state="alpha" >}} + +<!-- +Using the [`controller.kubernetes.io/pod-deletion-cost`](/docs/reference/labels-annotations-taints/#pod-deletion-cost) +annotation, users can set a preference regarding which pods to remove first when downscaling a ReplicaSet. +--> +通过使用 [`controller.kubernetes.io/pod-deletion-cost`](/zh/docs/reference/labels-annotations-taints/#pod-deletion-cost) +注解,用户可以对 ReplicaSet 缩容时要先删除哪些 Pods 设置偏好。 + +<!-- +The annotation should be set on the pod, the range is [-2147483647, 2147483647]. It represents the cost of +deleting a pod compared to other pods belonging to the same ReplicaSet. Pods with lower deletion +cost are preferred to be deleted before pods with higher deletion cost. +--> +此注解要设置到 Pod 上,取值范围为 [-2147483647, 2147483647]。 +所代表的的是删除同一 ReplicaSet 中其他 Pod 相比较而言的开销。 +删除开销较小的 Pods 比删除开销较高的 Pods 更容易被删除。 + +<!-- +The implicit value for this annotation for pods that don't set it is 0; negative values are permitted. +Invalid values will be rejected by the API server. +--> +Pods 如果未设置此注解,则隐含的设置值为 0。负值也是可接受的。 +如果注解值非法,API 服务器会拒绝对应的 Pod。 + +<!-- +This feature is alpha and disabled by default. You can enable it by setting the +[feature gate](/docs/reference/command-line-tools-reference/feature-gates/) +`PodDeletionCost` in both kube-apiserver and kube-controller-manager. +--> +此功能特性处于 Alpha 阶段,默认被禁用。你可以通过为 kube-apiserver 和 +kube-controller-manager 设置 +[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) +`PodDeletionCost` 来启用此功能。 + +{{< note >}} +<!-- +- This is honored on a best-effort basis, so it does not offer any guarantees on pod deletion order. +- Users should avoid updating the annotation frequently, such as updating it based on a metric value, + because doing so will generate a significant number of pod updates on the apiserver. +--> +- 此机制实施时仅是尽力而为,并不能对 Pod 的删除顺序作出任何保证; +- 用户应避免频繁更新注解值,例如根据某观测度量值来更新此注解值是应该避免的。 + 这样做会在 API 服务器上产生大量的 Pod 更新操作。 +{{< /note >}} + +<!-- +#### Example Use Case + +The different pods of an application could have different utilization levels. On scale down, the application +may prefer to remove the pods with lower utilization. To avoid frequently updating the pods, the application +should update `controller.kubernetes.io/pod-deletion-cost` once before issuing a scale down (setting the +annotation to a value proportional to pod utilization level). This works if the application itself controls +the down scaling; for example, the driver pod of a Spark deployment. +--> +#### 使用场景示例 + +同一应用的不同 Pods 可能其利用率是不同的。在对应用执行缩容操作时,可能 +希望移除利用率较低的 Pods。为了避免频繁更新 Pods,应用应该在执行缩容 +操作之前更新一次 `controller.kubernetes.io/pod-deletion-cost` 注解值 +(将注解值设置为一个与其 Pod 利用率对应的值)。 +如果应用自身控制器缩容操作时(例如 Spark 部署的驱动 Pod),这种机制 +是可以起作用的。 + <!-- ### ReplicaSet as an Horizontal Pod Autoscaler Target diff --git a/content/zh/docs/concepts/workloads/controllers/replicationcontroller.md b/content/zh/docs/concepts/workloads/controllers/replicationcontroller.md index c35032aa28..285215a3b2 100644 --- a/content/zh/docs/concepts/workloads/controllers/replicationcontroller.md +++ b/content/zh/docs/concepts/workloads/controllers/replicationcontroller.md @@ -5,7 +5,6 @@ feature: anchor: ReplicationController 如何工作 description: > 重新启动失败的容器,在节点死亡时替换并重新调度容器,杀死不响应用户定义的健康检查的容器,并且在它们准备好服务之前不会将它们公布给客户端。 - content_type: concept weight: 90 --- @@ -97,10 +96,12 @@ Run the example job by downloading the example file and then running this comman ```shell kubectl apply -f https://k8s.io/examples/controllers/replication.yaml ``` + <!-- The output is similar to this: --> 输出类似于: + ``` replicationcontroller/nginx created ``` @@ -113,10 +114,12 @@ Check on the status of the ReplicationController using this command: ```shell kubectl describe replicationcontrollers/nginx ``` + <!-- The output is similar to this: --> 输出类似于: + ``` Name: nginx Namespace: default @@ -167,6 +170,7 @@ echo $pods The output is similar to this: --> 输出类似于: + ``` nginx-3ntk0 nginx-4ok8v nginx-qrm3m ``` @@ -183,14 +187,16 @@ specifies an expression with the name from each pod in the returned list. ## Writing a ReplicationController Spec As with all other Kubernetes config, a ReplicationController needs `apiVersion`, `kind`, and `metadata` fields. -For general information about working with config files, see [object management ](/docs/concepts/overview/working-with-objects/object-management/). +For general information about working with configuration files, see [object management](/docs/concepts/overview/working-with-objects/object-management/). A ReplicationController also needs a [`.spec` section](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status). --> -## 编写一个 ReplicationController Spec +## 编写一个 ReplicationController 规约 -与所有其它 Kubernetes 配置一样,ReplicationController 需要 `apiVersion`、`kind` 和 `metadata` 字段。 -有关使用配置文件的常规信息,参考[对象管理](/zh/docs/concepts/overview/working-with-objects/object-management/)。 +与所有其它 Kubernetes 配置一样,ReplicationController 需要 `apiVersion`、 +`kind` 和 `metadata` 字段。 +有关使用配置文件的常规信息,参考 +[对象管理](/zh/docs/concepts/overview/working-with-objects/object-management/)。 ReplicationController 也需要一个 [`.spec` 部分](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status)。 @@ -230,7 +236,7 @@ for example the [Kubelet](/docs/admin/kubelet/) or Docker. The ReplicationController can itself have labels (`.metadata.labels`). Typically, you would set these the same as the `.spec.template.metadata.labels`; if `.metadata.labels` is not specified -then it defaults to `.spec.template.metadata.labels`. However, they are allowed to be +then it defaults to `.spec.template.metadata.labels`. However, they are allowed to be different, and the `.metadata.labels` do not affect the behavior of the ReplicationController. --> ### ReplicationController 上的标签 @@ -351,12 +357,13 @@ To update pods to a new spec in a controlled way, use a [rolling update](#rollin <!-- ### Isolating pods from a ReplicationController -Pods may be removed from a ReplicationController's target set by changing their labels. This technique may be used to remove pods from service for debugging, data recovery, etc. Pods that are removed in this way will be replaced automatically (assuming that the number of replicas is not also changed). +Pods may be removed from a ReplicationController's target set by changing their labels. This technique may be used to remove pods from service for debugging and data recovery. Pods that are removed in this way will be replaced automatically (assuming that the number of replicas is not also changed). --> ### 从 ReplicationController 中隔离 Pod 通过更改 Pod 的标签,可以从 ReplicationController 的目标中删除 Pod。 -此技术可用于从服务中删除 Pod 以进行调试、数据恢复等。以这种方式删除的 Pod 将自动替换(假设复制副本的数量也没有更改)。 +此技术可用于从服务中删除 Pod 以进行调试、数据恢复等。以这种方式删除的 Pod +将被自动替换(假设复制副本的数量也没有更改)。 <!-- ## Common usage patterns @@ -374,12 +381,11 @@ As mentioned above, whether you have 1 pod you want to keep running, or 1000, a <!-- ### Scaling -The ReplicationController scales the number of replicas up or down by setting the `replicas` field. -You can configure the ReplicationController to manage the replicas manually or by an auto-scaling control agent. +The ReplicationController enables scaling the number of replicas up or down, either manually or by an auto-scaling control agent, by updating the `replicas` field. --> ### 扩缩容 {#scaling} -通过设置 `replicas` 字段,ReplicationController 可以方便地横向扩容或缩容副本的数量。 +通过设置 `replicas` 字段,ReplicationController 可以允许扩容或缩容副本的数量。 你可以手动或通过自动缩放控制代理来控制 ReplicationController 执行此操作。 <!-- @@ -421,7 +427,8 @@ For instance, a service might target all pods with `tier in (frontend), environm --> ### 多个版本跟踪 -除了在滚动更新过程中运行应用程序的多个版本之外,通常还会使用多个版本跟踪来长时间,甚至持续运行多个版本。这些跟踪将根据标签加以区分。 +除了在滚动更新过程中运行应用程序的多个版本之外,通常还会使用多个版本跟踪来长时间, +甚至持续运行多个版本。这些跟踪将根据标签加以区分。 例如,一个服务可能把具有 `tier in (frontend), environment in (prod)` 的所有 Pod 作为目标。 现在假设你有 10 个副本的 Pod 组成了这个层。但是你希望能够 `canary` (`金丝雀`)发布这个组件的新版本。 @@ -429,7 +436,8 @@ For instance, a service might target all pods with `tier in (frontend), environm 标签为 `tier=frontend, environment=prod, track=stable` 而为 `canary` 设置另一个 ReplicationController,其中 `replicas` 设置为 1, 标签为 `tier=frontend, environment=prod, track=canary`。 -现在这个服务覆盖了 `canary` 和非 `canary` Pod。但你可以单独处理 ReplicationController,以测试、监控结果等。 +现在这个服务覆盖了 `canary` 和非 `canary` Pod。但你可以单独处理 +ReplicationController,以测试、监控结果等。 <!-- ### Using ReplicationControllers with Services @@ -441,7 +449,8 @@ A ReplicationController will never terminate on its own, but it isn't expected t --> ### 和服务一起使用 ReplicationController -多个 ReplicationController 可以位于一个服务的后面,例如,一部分流量流向旧版本,一部分流量流向新版本。 +多个 ReplicationController 可以位于一个服务的后面,例如,一部分流量流向旧版本, +一部分流量流向新版本。 一个 ReplicationController 永远不会自行终止,但它不会像服务那样长时间存活。 服务可以由多个 ReplicationController 控制的 Pod 组成,并且在服务的生命周期内 @@ -455,8 +464,10 @@ Pods created by a ReplicationController are intended to be fungible and semantic --> ## 编写多副本的应用 -由 ReplicationController 创建的 Pod 是可替换的,语义上是相同的,尽管随着时间的推移,它们的配置可能会变得异构。 -这显然适合于多副本的无状态服务器,但是 ReplicationController 也可以用于维护主选、分片和工作池应用程序的可用性。 +由 ReplicationController 创建的 Pod 是可替换的,语义上是相同的, +尽管随着时间的推移,它们的配置可能会变得异构。 +这显然适合于多副本的无状态服务器,但是 ReplicationController 也可以用于维护主选、 +分片和工作池应用程序的可用性。 这样的应用程序应该使用动态的工作分配机制,例如 [RabbitMQ 工作队列](https://www.rabbitmq.com/tutorials/tutorial-two-python.html), 而不是静态的或者一次性定制每个 Pod 的配置,这被认为是一种反模式。 @@ -481,8 +492,10 @@ The ReplicationController is forever constrained to this narrow responsibility. --> ReplicationController 永远被限制在这个狭隘的职责范围内。 它本身既不执行就绪态探测,也不执行活跃性探测。 -它不负责执行自动缩放,而是由外部自动缩放器控制(如 [#492](https://issue.k8s.io/492) 中所述),后者负责更改其 `replicas` 字段值。 -我们不会向 ReplicationController 添加调度策略(例如,[spreading](https://issue.k8s.io/367#issuecomment-48428019))。 +它不负责执行自动缩放,而是由外部自动缩放器控制(如 +[#492](https://issue.k8s.io/492) 中所述),后者负责更改其 `replicas` 字段值。 +我们不会向 ReplicationController 添加调度策略(例如, +[spreading](https://issue.k8s.io/367#issuecomment-48428019))。 它也不应该验证所控制的 Pod 是否与当前指定的模板匹配,因为这会阻碍自动调整大小和其他自动化过程。 类似地,完成期限、整理依赖关系、配置扩展和其他特性也属于其他地方。 我们甚至计划考虑批量创建 Pod 的机制(查阅 [#170](https://issue.k8s.io/170))。 @@ -549,7 +562,8 @@ Unlike in the case where a user directly created pods, a ReplicationController r --> ### 裸 Pod -与用户直接创建 Pod 的情况不同,ReplicationController 能够替换因某些原因被删除或被终止的 Pod ,例如在节点故障或中断节点维护的情况下,例如内核升级。 +与用户直接创建 Pod 的情况不同,ReplicationController 能够替换因某些原因 +被删除或被终止的 Pod ,例如在节点故障或中断节点维护的情况下,例如内核升级。 因此,我们建议你使用 ReplicationController,即使你的应用程序只需要一个 Pod。 可以将其看作类似于进程管理器,它只管理跨多个节点的多个 Pod ,而不是单个节点上的单个进程。 ReplicationController 将本地容器重启委托给节点上的某个代理(例如,Kubelet 或 Docker)。 diff --git a/content/zh/docs/concepts/workloads/controllers/ttlafterfinished.md b/content/zh/docs/concepts/workloads/controllers/ttlafterfinished.md index 91483c5513..291b88e0d7 100644 --- a/content/zh/docs/concepts/workloads/controllers/ttlafterfinished.md +++ b/content/zh/docs/concepts/workloads/controllers/ttlafterfinished.md @@ -1,17 +1,17 @@ --- title: 已完成资源的 TTL 控制器 content_type: concept -weight: 65 +weight: 70 --- <!-- title: TTL Controller for Finished Resources content_type: concept -weight: 65 +weight: 70 --> <!-- overview --> -{{< feature-state for_k8s_version="v1.12" state="alpha" >}} +{{< feature-state for_k8s_version="v1.21" state="beta" >}} <!-- The TTL controller provides a TTL mechanism to limit the lifetime of resource @@ -25,14 +25,14 @@ TTL 控制器目前只处理 {{< glossary_tooltip text="Job" term_id="job" >}} 可能以后会扩展以处理将完成执行的其他资源,例如 Pod 和自定义资源。 <!-- -Alpha Disclaimer: this feature is currently alpha, and can be enabled with both kube-apiserver and kube-controller-manager +This feature is currently beta and enabled by default, and can be disabled via [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) -`TTLAfterFinished`. +`TTLAfterFinished` in both kube-apiserver and kube-controller-manager. --> -Alpha 免责声明:此功能目前是 alpha 版,并且可以通过 `kube-apiserver` 和 +此功能目前是 Beta 版而自动启用,并且可以通过 `kube-apiserver` 和 `kube-controller-manager` 上的 [特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) -`TTLAfterFinished` 启用。 +`TTLAfterFinished` 禁用。 <!-- body --> From e2845d936e96a8ecef05e8f9f998c16f94bf2e0c Mon Sep 17 00:00:00 2001 From: s-kawamura-w664 <s-kawamura_p@nec.com> Date: Thu, 22 Apr 2021 08:31:10 +0000 Subject: [PATCH 122/221] update ja/docs/concepts/policy/resource-quotas.md --- .../docs/concepts/policy/resource-quotas.md | 171 ++++++++++-------- 1 file changed, 92 insertions(+), 79 deletions(-) diff --git a/content/ja/docs/concepts/policy/resource-quotas.md b/content/ja/docs/concepts/policy/resource-quotas.md index 7b00056fcf..4258a20356 100644 --- a/content/ja/docs/concepts/policy/resource-quotas.md +++ b/content/ja/docs/concepts/policy/resource-quotas.md @@ -15,17 +15,17 @@ weight: 10 <!-- body --> -`ResourceQuota`オブジェクトによって定義されるリソースクォータは、名前空間ごとの総リソース消費を制限するための制約を提供します。リソースクォータは同じ名前空間のクラスター内でタイプごとに作成できるオブジェクト数や、プロジェクト内のリソースによって消費されるコンピュートリソースの総量を制限できます。 +`ResourceQuota`オブジェクトによって定義されるリソースクォータは、名前空間ごとの総リソース消費を制限するための制約を提供します。リソースクォータは同じ名前空間のクラスター内でタイプごとに作成できるオブジェクト数や、名前空間内のリソースによって消費されるコンピュートリソースの総量を制限できます。 リソースクォータは下記のように働きます。 - 異なる名前空間で異なるチームが存在するとき。現時点ではこれは自主的なものですが、将来的にはACLsを介してリソースクォータの設定を強制するように計画されています。 -- 管理者は各名前空間で1つの`ResourceQuota`を作成します。 -- ユーザーが名前空間内でリソース(Pod、Serviceなど)を作成し、クォータシステムが`ResourceQuota`によって定義されたハードリソースリミットを超えないことを保証するために、リソースの使用量をトラッキングします。 +- 管理者は各名前空間で1つのResourceQuotaを作成します。 +- ユーザーが名前空間内でリソース(Pod、Serviceなど)を作成し、クォータシステムがResourceQuotaによって定義されたハードリソースリミットを超えないことを保証するために、リソースの使用量をトラッキングします。 - リソースの作成や更新がクォータの制約に違反しているとき、そのリクエストはHTTPステータスコード`403 FORBIDDEN`で失敗し、違反した制約を説明するメッセージが表示されます。 - `cpu`や`memory`といったコンピューターリソースに対するクォータが名前空間内で有効になっているとき、ユーザーはそれらの値に対する`requests`や`limits`を設定する必要があります。設定しないとクォータシステムがPodの作成を拒否します。 ヒント: コンピュートリソースの要求を設定しないPodに対してデフォルト値を強制するために、`LimitRanger`アドミッションコントローラーを使用してください。この問題を解決する例は[walkthrough](/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/)で参照できます。 -`ResourceQuota`のオブジェクト名は、有効な[DNSサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)である必要があります. +ResourceQuotaのオブジェクト名は、有効な[DNSサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)である必要があります. 名前空間とクォータを使用して作成できるポリシーの例は以下の通りです。 @@ -40,7 +40,7 @@ weight: 10 多くのKubernetesディストリビューションにおいてリソースクォータはデフォルトで有効になっています。APIサーバーで`--enable-admission-plugins=`の値に`ResourceQuota`が含まれるときに有効になります。 -特定の名前空間に`ResourceQuota`があるとき、そのリソースクォータはその名前空間に適用されます。 +特定の名前空間にResourceQuotaがあるとき、そのリソースクォータはその名前空間に適用されます。 ## リソースクォータの計算 @@ -55,6 +55,9 @@ weight: 10 | `limits.memory` | 停止していない状態の全てのPodで、メモリーの合計がこの値を超えることができません。 | | `requests.cpu` | 停止していない状態の全てのPodで、CPUリクエストの合計がこの値を超えることができません。 | | `requests.memory` | 停止していない状態の全てのPodで、メモリーリクエストの合計がこの値を超えることができません。 | +| `hugepages-<size>` | 停止していない状態の全てのPodで, 指定されたサイズのHuge Pageリクエスト数がこの値を超えることができません。 | +| `cpu` | `requests.cpu`と同じ。 | +| `memory` | `requests.memory`と同じ。 | ### 拡張リソースのためのリソースクォータ @@ -79,8 +82,8 @@ GPUリソースを例にすると、もしリソース名が`nvidia.com/gpu`で | --------------------- | ----------------------------------------------------------- | | `requests.storage` | 全てのPersistentVolumeClaimにおいて、ストレージのリクエストの合計がこの値を超えないようにします。 | | `persistentvolumeclaims` | 特定の名前空間内で作成可能な[PersistentVolumeClaim](/ja/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims)の総数。 | -| `<storage-class-name>.storageclass.storage.k8s.io/requests.storage` | ストレージクラス名に関連する全てのPersistentVolumeClaimにおいて、ストレージリクエストの合計がこの値を超えないようにします。 | -| `<storage-class-name>.storageclass.storage.k8s.io/persistentvolumeclaims` | ストレージクラス名に関連する全てのPersistentVolumeClaimにおいて、特定の名前空間内で作成可能な[PersistentVolumeClaim](/ja/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims)の総数。 | +| `<storage-class-name>.storageclass.storage.k8s.io/requests.storage` | ストレージクラス名`<storage-class-name>`に関連する全てのPersistentVolumeClaimにおいて、ストレージリクエストの合計がこの値を超えないようにします。 | +| `<storage-class-name>.storageclass.storage.k8s.io/persistentvolumeclaims` | ストレージクラス名`<storage-class-name>`に関連する全てのPersistentVolumeClaimにおいて、特定の名前空間内で作成可能な[PersistentVolumeClaim](/ja/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims)の総数。 | 例えば、もし管理者が`gold`ストレージクラスを`bronze`ストレージクラスと分けてリソースクォータを設定するとき、管理者はリソースクォータを下記のように指定できます。 @@ -93,12 +96,14 @@ Kubernetes v1.8において、ローカルのエフェメラルストレージ | ------------------------------- |----------------------------------------------------------- | | `requests.ephemeral-storage` | 名前空間内の全てのPodで、ローカルのエフェメラルストレージのリクエストの合計がこの値を超えないようにします。 | | `limits.ephemeral-storage` | 名前空間内の全てのPodで、ローカルのエフェメラルストレージのリミットの合計がこの値を超えないようにします。 | +| `ephemeral-storage` | `requests.ephemeral-storage`と同じ。 | ## オブジェクト数に対するクォータ -Kubernetes v1.9では下記のシンタックスを使用して、名前空間に紐づいた全ての標準リソースタイプに対するリソースクォータのサポートが追加されました。 +下記のシンタックスを使用して、名前空間に紐づいた全ての標準であるリソースタイプの中の特定のリソースの総数に対するリソースクォータを設定できます。 -* `count/<resource>.<group>` +* `count/<resource>.<group>` コアでないグループのリソース用 +* `count/<resource>` コアグループのリソース用 オブジェクト数に対するクォータでユーザーが設定するリソースの例は下記の通りです。 @@ -112,13 +117,12 @@ Kubernetes v1.9では下記のシンタックスを使用して、名前空間 * `count/statefulsets.apps` * `count/jobs.batch` * `count/cronjobs.batch` -* `count/deployments.extensions` -Kubernetes v1.15において、同一のシンタックスを使用して、カスタムリソースに対するサポートが追加されました。例えば、`example.com`というAPIグループ内の`widgets`というカスタムリソースのリソースクォータを設定するには`count/widgets.example.com`と記述します。 +カスタムリソースに対して同じシンタックスを使用できます。例えば、`example.com`というAPIグループ内の`widgets`というカスタムリソースのリソースクォータを設定するには`count/widgets.example.com`と記述します。 -`count/*`リソースクォータの使用において、オブジェクトがサーバーストレージに存在するときオブジェクトはクォータの計算対象となります。このようなタイプのリソースクォータはストレージリソース浪費の防止に有効です。例えば、もしSecretが大量に存在するとき、そのSecretリソースの総数に対してリソースクォータの制限をかけたい場合です。クラスター内でSecretが大量にあると、サーバーとコントローラーの起動を妨げることになります!また、適切に設定されていないCronJobが名前空間内で大量のJobを作成し、サービスが利用不可能になることを防ぐためにリソースクォータを設定できます。 +`count/*`リソースクォータの使用において、オブジェクトがサーバーストレージに存在するときオブジェクトはクォータの計算対象となります。このようなタイプのリソースクォータはストレージリソース浪費の防止に有効です。例えば、もしSecretが大量に存在するとき、そのSecretリソースの総数に対してリソースクォータの制限をかけたい場合です。クラスター内でSecretが大量にあると、サーバーとコントローラーの起動を妨げることになります。適切に設定されていないCronJobから保護するためにジョブのクォータを設定できます。名前空間内で大量のJobを作成するCronJobは、サービスを利用不可能にする可能性があります。 -Kubernetes v1.9より前のバージョンでは、限定されたリソースのセットにおいて汎用オブジェクトカウントのリソースクォータを実行可能でした。さらに、特定のリソースに対するリソースクォータを種類ごとに制限することができます。 +また、限定されたリソースのセットにおいて汎用オブジェクトカウントのリソースクォータを実行可能です。 下記のタイプのリソースがサポートされています。 @@ -128,7 +132,7 @@ Kubernetes v1.9より前のバージョンでは、限定されたリソース | `persistentvolumeclaims` | 名前空間内で存在可能な[PersistentVolumeClaim](/ja/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims)の総数。 | | `pods` | 名前空間内で存在可能な停止していないPodの総数。`.status.phase in (Failed, Succeeded)`がtrueのとき、Podは停止状態にあります。 | | `replicationcontrollers` | 名前空間内で存在可能なReplicationControlerの総数。 | -| `resourcequotas` | 名前空間内で存在可能な[リソースクォータ](/docs/reference/access-authn-authz/admission-controllers/#resourcequota)の総数。 | +| `resourcequotas` | 名前空間内で存在可能なResourceQuotaの総数。 | | `services` | 名前空間内で存在可能なServiceの総数。 | | `services.loadbalancers` | 名前空間内で存在可能なtype:LoadBalancerであるServiceの総数。 | | `services.nodeports` | 名前空間内で存在可能なtype:NodePortであるServiceの総数。 | @@ -138,7 +142,7 @@ Kubernetes v1.9より前のバージョンでは、限定されたリソース ## クォータのスコープについて -各リソースクォータには関連するスコープのセットを関連づけることができます。クォータは、列挙されたスコープの共通部分と一致する場合にのみリソースの使用量を計測します。 +各リソースクォータには関連する`scope`のセットを関連づけることができます。クォータは、列挙されたscopeの共通部分と一致する場合にのみリソースの使用量を計測します。 スコープがクォータに追加されると、サポートするリソースの数がスコープに関連するリソースに制限されます。許可されたセット以外のクォータ上でリソースを指定するとバリデーションエラーになります。 @@ -148,27 +152,72 @@ Kubernetes v1.9より前のバージョンでは、限定されたリソース | `NotTerminating` | `.spec.activeDeadlineSecondsがnil`であるPodに一致します。 | | `BestEffort` | ベストエフォート型のサービス品質のPodに一致します。 | | `NotBestEffort` | ベストエフォート型のサービス品質でないPodに一致します。 | +| `PriorityClass` | 指定された[優先度クラス](/docs/concepts/configuration/pod-priority-preemption)と関連付いているPodに一致します。 | -`BestEffort`スコープはリソースクォータを次のリソースに対するトラッキングのみに制限します: `pods` +`BestEffort`スコープはリソースクォータを次のリソースに対するトラッキングのみに制限します: -`Terminating`、`NotTerminating`、`NotBestEffort`スコープは、リソースクォータを次のリソースに対するトラッキングのみに制限します: - -* `cpu` -* `limits.cpu` -* `limits.memory` -* `memory` * `pods` + +`Terminating`、`NotTerminating`、`NotBestEffort`、`PriorityClass`スコープは、リソースクォータを次のリソースに対するトラッキングのみに制限します: + +* `pods` +* `cpu` +* `memory` * `requests.cpu` * `requests.memory` +* `limits.cpu` +* `limits.memory` + +同じクォータで`Terminating`と`NotTerminating`の両方のスコープを指定することはできず、また同じクォータで`BestEffort`と`NotBestEffort`の両方のスコープを指定することもできないことに注意してください。 + +`scopeSelector`は`operator` フィールドにおいて下記の値をサポートしています。: + +* `In` +* `NotIn` +* `Exists` +* `DoesNotExist` + +`scopeSelector`の定義において`scopeName`に下記のいずれかの値を使用する場合、`operator`に`Exists`を指定してください。 + +* `Terminating` +* `NotTerminating` +* `BestEffort` +* `NotBestEffort` + +`operator`が`In`または`NotIn`の場合、`values`フィールドには少なくとも1つの値が必要です。例えば以下のように記述します: + +```yaml + scopeSelector: + matchExpressions: + - scopeName: PriorityClass + operator: In + values: + - middle +``` + +`operator`が`Exists`または`DoesNotExist`の場合、`values`フィールドは指定*しないでください*。 ### PriorityClass毎のリソースクォータ -{{< feature-state for_k8s_version="v1.12" state="beta" >}} +{{< feature-state for_k8s_version="v1.17" state="stable" >}} Podは特定の[優先度](/docs/concepts/configuration/pod-priority-preemption/#pod-priority)で作成されます。リソースクォータのSpec内にある`scopeSelector`フィールドを使用して、Podの優先度に基づいてPodのシステムリソースの消費をコントロールできます。 リソースクォータのSpec内の`scopeSelector`によってPodが選択されたときのみ、そのリソースクォータが一致し、消費されます。 +リソースクォータが`scopeSelector`フィールドを使用して優先度クラスに対してスコープされる場合、リソースクォータのオプジェクトは、次のリソースのみトラッキングするように制限されます: + +* `pods` +* `cpu` +* `memory` +* `ephemeral-storage` +* `limits.cpu` +* `limits.memory` +* `limits.ephemeral-storage` +* `requests.cpu` +* `requests.memory` +* `requests.ephemeral-storage` + この例ではリソースクォータのオブジェクトを作成し、特定の優先度を持つPodに一致させます。この例は下記のように動作します。 - クラスター内のPodは"low"、"medium"、"high"の3つの優先度クラスのうち1つをもちます。 @@ -230,7 +279,7 @@ items: kubectl create -f ./quota.yml ``` -```shell +``` resourcequota/pods-high created resourcequota/pods-medium created resourcequota/pods-low created @@ -242,7 +291,7 @@ resourcequota/pods-low created kubectl describe quota ``` -```shell +``` Name: pods-high Namespace: default Resource Used Hard @@ -305,7 +354,7 @@ kubectl create -f ./high-priority-pod.yml kubectl describe quota ``` -```shell +``` Name: pods-high Namespace: default Resource Used Hard @@ -333,13 +382,6 @@ memory 0 20Gi pods 0 10 ``` -`scopeSelector`は`operator`フィールドにおいて下記の値をサポートしています。 - -* `In` -* `NotIn` -* `Exist` -* `DoesNotExist` - ## リクエスト vs リミット コンピュートリソースを分配する際に、各コンテナはCPUとメモリーそれぞれのリクエストとリミット値を指定します。クォータはそれぞれの値を設定できます。 @@ -400,7 +442,7 @@ kubectl create -f ./object-counts.yaml --namespace=myspace kubectl get quota --namespace=myspace ``` -```shell +``` NAME AGE compute-resources 30s object-counts 32s @@ -410,7 +452,7 @@ object-counts 32s kubectl describe quota compute-resources --namespace=myspace ``` -```shell +``` Name: compute-resources Namespace: myspace Resource Used Hard @@ -426,7 +468,7 @@ requests.nvidia.com/gpu 0 4 kubectl describe quota object-counts --namespace=myspace ``` -```shell +``` Name: object-counts Namespace: myspace Resource Used Hard @@ -447,40 +489,39 @@ kubectl create namespace myspace ``` ```shell -kubectl create quota test --hard=count/deployments.extensions=2,count/replicasets.extensions=4,count/pods=3,count/secrets=4 --namespace=myspace +kubectl create quota test --hard=count/deployments.apps=2,count/replicasets.apps=4,count/pods=3,count/secrets=4 --namespace=myspace ``` ```shell -kubectl create deployment nginx --image=nginx --namespace=myspace -kubectl scale deployment nginx --replicas=2 --namespace=myspace +kubectl create deployment nginx --image=nginx --namespace=myspace --replicas=2 ``` ```shell kubectl describe quota --namespace=myspace ``` -```shell +``` Name: test Namespace: myspace Resource Used Hard -------- ---- ---- -count/deployments.extensions 1 2 +count/deployments.apps 1 2 count/pods 2 3 -count/replicasets.extensions 1 4 +count/replicasets.apps 1 4 count/secrets 1 4 ``` ## クォータとクラスター容量 -`ResourceQuotas`はクラスター容量に依存しません。またユニット数の絶対値で表されます。そのためクラスターにノードを追加したことにより、各名前空間が自動的により多くのリソースを消費するような機能が提供されるわけでは*ありません*。 +ResourceQuotaはクラスター容量に依存しません。またユニット数の絶対値で表されます。そのためクラスターにノードを追加したことにより、各名前空間が自動的により多くのリソースを消費するような機能が提供されるわけでは*ありません*。 下記のようなより複雑なポリシーが必要な状況があります。 - - 複数チーム間でクラスターリソースの総量を分けあう。 - - 各テナントが必要な時にリソース使用量を増やせるようにするが、偶発的なリソースの枯渇を防ぐために上限を設定する。 - - 1つの名前空間に対してリソース消費の需要を検出し、ノードを追加し、クォータを増加させる。 +- 複数チーム間でクラスターリソースの総量を分けあう。 +- 各テナントが必要な時にリソース使用量を増やせるようにするが、偶発的なリソースの枯渇を防ぐために上限を設定する。 +- 1つの名前空間に対してリソース消費の需要を検出し、ノードを追加し、クォータを増加させる。 -このようなポリシーは、クォータの使用量の監視と、他のシグナルにしたがってクォータのハードの制限を調整する"コントローラー"を記述することにより、`ResourceQuotas`をビルディングブロックのように使用して実装できます。 +このようなポリシーは、クォータの使用量の監視と、他のシグナルにしたがってクォータのハードの制限を調整する"コントローラー"を記述することにより、ResourceQuotaをビルディングブロックのように使用して実装できます。 リソースクォータは集約されたクラスターリソースを分割しますが、ノードに対しては何の制限も行わないことに注意して下さい。例: 複数の名前空間のPodは同一のノード上で稼働する可能性があります。 @@ -490,10 +531,8 @@ count/secrets 1 4 このメカニズムにより、オペレーターは特定の高優先度クラスの使用を限られた数の名前空間に制限することができ、全ての名前空間でこれらの優先度クラスをデフォルトで使用することはできなくなります。 -これを実施するには、kube-apiserverの`--admission-control-config-file`というフラグを使い、下記の設定ファイルに対してパスを渡す必要がります。 +これを実施するには、`kube-apiserver`の`--admission-control-config-file`というフラグを使い、下記の設定ファイルに対してパスを渡す必要がります。 -{{< tabs name="example1" >}} -{{% tab name="apiserver.config.k8s.io/v1" %}} ```yaml apiVersion: apiserver.config.k8s.io/v1 kind: AdmissionConfiguration @@ -509,27 +548,6 @@ plugins: operator: In values: ["cluster-services"] ``` -{{% /tab %}} -{{% tab name="apiserver.k8s.io/v1alpha1" %}} -```yaml -# v1.17では非推奨になり、apiserver.config.k8s.io/v1の使用を推奨します。 -apiVersion: apiserver.k8s.io/v1alpha1 -kind: AdmissionConfiguration -plugins: -- name: "ResourceQuota" - configuration: - # v1.17では非推奨になり、apiserver.config.k8s.io/v1、ResourceQuotaConfigurationの使用を推奨します。 - apiVersion: resourcequota.admission.k8s.io/v1beta1 - kind: Configuration - limitedResources: - - resource: pods - matchScopes: - - scopeName: PriorityClass - operator: In - values: ["cluster-services"] -``` -{{% /tab %}} -{{< /tabs >}} なお、"cluster-services"Podは、条件に一致する`scopeSelector`を持つクォータオブジェクトが存在する名前空間でのみ許可されます。 @@ -541,14 +559,9 @@ plugins: values: ["cluster-services"] ``` -さらなる情報は、[LimitedResources](https://github.com/kubernetes/kubernetes/pull/36765)と[優先度クラスに対するクォータサポートの design doc](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/scheduling/pod-priority-resourcequota.md)を参照してください。 - -## 例 - -[リソースクォータの使用方法の例](/docs/tasks/administer-cluster/quota-api-object/)を参照してください。 - - ## {{% heading "whatsnext" %}} - さらなる情報は[クォータの design doc](https://git.k8s.io/community/contributors/design-proposals/resource-management/admission_control_resource_quota.md)を参照してください。 - +- [リソースクォータの使用方法の例](/docs/tasks/administer-cluster/quota-api-object/)を参照してください。 +- [優先度クラスに対するクォータサポートの design doc](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/scheduling/pod-priority-resourcequota.md)を参照してください。 +- [LimitedResources](https://github.com/kubernetes/kubernetes/pull/36765)を参照してください。 From 3940c9d0655350832299c03cbf59edf12b72c4d3 Mon Sep 17 00:00:00 2001 From: KobayashiD27 <kobayashi.da-06@fujitsu.com> Date: Wed, 28 Apr 2021 17:47:57 +0900 Subject: [PATCH 123/221] ja: Make docs/concepts/services-networking/endpoint-slices.md follow v1.19 of the original text --- .../services-networking/endpoint-slices.md | 58 +++++++++++++------ 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/content/ja/docs/concepts/services-networking/endpoint-slices.md b/content/ja/docs/concepts/services-networking/endpoint-slices.md index 24a588c29e..b9d60eb6b3 100644 --- a/content/ja/docs/concepts/services-networking/endpoint-slices.md +++ b/content/ja/docs/concepts/services-networking/endpoint-slices.md @@ -1,7 +1,7 @@ --- title: EndpointSlice content_type: concept -weight: 15 +weight: 35 --- <!-- overview --> @@ -14,13 +14,19 @@ weight: 15 ## 動機 -Endpoints APIはKubernetes内のネットワークエンドポイントを追跡する単純で直観的な手段を提供してきました。残念ながら、KubernetesクラスターやServiceが大規模になるにつれて、Endpoints APIの限界が明らかになってきました。最も顕著な問題の1つに、ネットワークエンドポイントの数が大きくなったときのスケーリングの問題があります。 +Endpoint APIはKubernetes内のネットワークエンドポイントを追跡する単純で直観的な手段を提供してきました。 +残念ながら、Kubernetesクラスターや{{< glossary_tooltip text="Service" term_id="service" >}}が大規模になり、より多くのトラフィックを処理し、より多くのバックエンドPodに送信するようになるにしたがって、Endpoint APIの限界が明らかになってきました。 +最も顕著な問題の1つに、ネットワークエンドポイントの数が大きくなったときのスケーリングの問題があります。 -Serviceのすべてのネットワークエンドポイントが単一のEndpointsリソースに格納されていたため、リソースのサイズが非常に大きくなる場合がありました。これがKubernetesのコンポーネント(特に、マスターコントロールプレーン)の性能に悪影響を与え、結果として、Endpointsに変更があるたびに、大量のネットワークトラフィックと処理が発生するようになってしまいました。EndpointSliceは、この問題を緩和するとともに、トポロジカルルーティングなどの追加機能のための拡張可能なプラットフォームを提供します。 +Serviceのすべてのネットワークエンドポイントが単一のEndpointリソースに格納されていたため、リソースのサイズが非常に大きくなる場合がありました。これがKubernetesのコンポーネント(特に、マスターコントロールプレーン)の性能に悪影響を与え、結果として、Endpointに変更があるたびに、大量のネットワークトラフィックと処理が発生するようになってしまいました。EndpointSliceは、この問題を緩和するとともに、トポロジカルルーティングなどの追加機能のための拡張可能なプラットフォームを提供します。 ## EndpointSliceリソース {#endpointslice-resource} -Kubernetes内ではEndpointSliceにはネットワークエンドポイントの集合へのリファレンスが含まれます。EndpointSliceコントローラーは、{{< glossary_tooltip text="セレクター" term_id="selector" >}}が指定されると、Kubernetes Serviceに対するEndpointSliceを自動的に作成します。これらのEndpointSliceにはServiceセレクターに一致する任意のPodへのリファレンスが含まれます。EndpointSliceはネットワークエンドポイントをユニークなServiceとPortの組み合わせでグループ化します。EndpointSliceオブジェクトの名前は有効な[DNSサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)である必要があります。 +Kubernetes内ではEndpointSliceにはネットワークエンドポイントの集合へのリファレンスが含まれます。 +コントロールプレーンは、{{< glossary_tooltip text = "セレクター" term_id = "selector" >}}が指定されているKubernetes ServiceのEndpointSliceを自動的に作成します。 +これらのEndpointSliceには、Serviceセレクターに一致するすべてのPodへのリファレンスが含まれています。 +EndpointSliceは、プロトコル、ポート番号、およびサービス名の一意の組み合わせによってネットワークエンドポイントをグループ化します。 +EndpointSliceオブジェクトの名前は有効な[DNSサブドメイン名](/ja/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)である必要があります。 一例として、以下に`example`というKubernetes Serviceに対するサンプルのEndpointSliceリソースを示します。 @@ -47,9 +53,9 @@ endpoints: topology.kubernetes.io/zone: us-west2-a ``` -デフォルトではEndpointSliceコントローラーが管理するEndpointSliceには、1つにつき最大で100個のエンドポイントしか所属しません。この規模以下であれば、EndpointSliceはEndpointとServiceが1対1対応になり、性能は変わらないはずです。 +デフォルトでは、コントロールプレーンはEndpointSliceを作成・管理し、それぞれのエンドポイント数が100以下になるようにします。`--max-endpoints-per-slice`{{< glossary_tooltip text="kube-controller-manager" term_id="kube-controller-manager" >}}フラグを設定することで、最大1000個まで設定可能です。 -EndpointSliceは内部トラフィックのルーティング方法に関して、kube-proxyに対する唯一のソース(source of truth)として振る舞うことができます。EndpointSliceを有効にすれば、非常に多数のエンドポイントを持つServiceに対して性能向上が得られるはずです。 +EndpointSliceは内部トラフィックのルーティング方法に関して、{{< glossary_tooltip term_id="kube-proxy" text="kube-proxy" >}}に対する唯一のソース(source of truth)として振る舞うことができます。EndpointSliceを有効にすれば、非常に多数のエンドポイントを持つServiceに対して性能向上が得られるはずです。 ### アドレスの種類 @@ -59,9 +65,10 @@ EndpointSliceは次の3種類のアドレスをサポートします。 * IPv6 * FQDN (Fully Qualified Domain Name、完全修飾ドメイン名) -### トポロジー +### トポロジー {#topology} -EndpointSliceに属する各エンドポイントは、関連するトポロジーの情報を持つことができます。この情報は、エンドポイントの場所を示すために使われ、対応するNode、ゾーン、リージョンに関する情報が含まれます。値が利用できる場合にはEndpointSliceコントローラーによって次のようなTopologyラベルが設定されます。 +EndpointSliceに属する各エンドポイントは、関連するトポロジーの情報を持つことができます。この情報は、エンドポイントの場所を示すために使われ、対応するNode、ゾーン、リージョンに関する情報が含まれます。 +値が利用できる場合には、コントロールプレーンはEndpointSliceコントローラーに次のようなTopologyラベルを設定します。 * `kubernetes.io/hostname` - このエンドポイントが存在するNodeの名前。 * `topology.kubernetes.io/zone` - このエンドポイントが存在するゾーン。 @@ -71,25 +78,34 @@ EndpointSliceに属する各エンドポイントは、関連するトポロジ ### 管理 -EndpointSliceはデフォルトではEndpointSliceコントローラーによって作成・管理されます。EndpointSliceには他にもサービスメッシュの実装などのさまざまなユースケースがあるため、他のエンティティやコントローラーがEndpointSliceの追加の集合を管理する場合もあります。複数のエンティティが互いに干渉せずにEndpointSliceを管理できるようにするために、EndpointSliceを管理しているエンティティを表す`endpointslice.kubernetes.io/managed-by`ラベルが使用されます。EndpointSliceコントローラーの場合、管理対象のすべてのEndpointSliceに対して、このラベルの値として`endpointslice-controller.k8s.io`を設定します。EndpointSliceを管理するその他のエンティティも同様に、このラベルにユニークな値を設定する必要があります。 +ほとんどの場合、コントロールプレーン(具体的には、EndpointSlice {{< glossary_tooltip text = "コントローラー" term_id = "controller" >}})は、EndpointSliceオブジェクトを作成および管理します。EndpointSliceには、サービスメッシュの実装など、他のさまざまなユースケースがあり、他のエンティティまたはコントローラーがEndpointSliceの追加セットを管理する可能性があります。 + +複数のエンティティが互いに干渉することなくEndpointSliceを管理できるようにするために、KubernetesはEndpointSliceを管理するエンティティを示す`endpointslice.kubernetes.io/managed-by`という{{< glossary_tooltip term_id="label" text="ラベル" >}}を定義します。 +EndpointSliceを管理するその他のエンティティも同様に、このラベルにユニークな値を設定する必要があります。 ### 所有権 -ほとんどのユースケースでは、EndpointSliceは対象のエンドポイントが追跡しているServiceによって所有されます。これは、各EndpointSlice上のownerリファレンスと`kubernetes.io/service-name`ラベルによって示されます。これにより、Serviceに属するすべてのEndpointSliceを簡単に検索できるようになっています。 +ほとんどのユースケースでは、EndpointSliceはエンドポイントスライスオブジェクトがエンドポイントを追跡するServiceによって所有されます。 +これは、各EndpointSlice上のownerリファレンスと`kubernetes.io/service-name`ラベルによって示されます。これにより、Serviceに属するすべてのEndpointSliceを簡単に検索できるようになっています。 -## EndpointSliceコントローラー +### EndpointSliceのミラーリング -EndpointSliceコントローラーは対応するEndpointSliceが最新の状態であることを保証するために、ServiceとPodを監視します。このコントローラーはセレクターが指定した各Serviceに対応するEndpointSliceを管理します。EndpointSliceはServiceセレクターに一致するPodのIPを表します。 +場合によっては、アプリケーションはカスタムEndpointリソースを作成します。これらのアプリケーションがEndpointリソースとEndpointSliceリソースの両方に同時に書き込む必要がないようにするために、クラスターのコントロールプレーンは、ほとんどのEndpointリソースを対応するEndpointSliceにミラーリングします。 -### EndpointSliceのサイズ +コントロールプレーンは、次の場合を除いて、Endpointリソースをミラーリングします。 -デフォルトでは、それぞれのEndpointSliceのサイズの上限は100個のEndpointsに制限されています。この制限は{{< glossary_tooltip text="kube-controller-manager" term_id="kube-controller-manager" >}}に`--max-endpoints-per-slice`フラグを使用することで、最大で1000まで設定できます。 +* Endpointリソースの`endpointslice.kubernetes.io/skip-mirror`ラベルが`true`に設定されています。 +* Endpointリソースが`control-plane.alpha.kubernetes.io/leader`アノテーションを持っています。 +* 対応するServiceリソースが存在しません。 +* 対応するServiceリソースには、nil以外のセレクターがあります。 + +個々のEndpointリソースは、複数のEndpointSliceに変換される場合があります。これは、Endpointリソースに複数のサブセットがある場合、または複数のIPファミリ(IPv4およびIPv6)を持つエンドポイントが含まれている場合に発生します。サブセットごとに最大1000個のアドレスがEndpointSliceにミラーリングされます。 ### EndpointSliceの分散 -それぞれのEndpointSliceにはポートの集合があり、リソース内のすべてのエンドポイントに適用されます。サービスが名前付きポートを使用した場合、Podが同じ名前のポートに対して、結果的に異なるターゲットポート番号が使用されて、異なるEndpointSliceが必要になる場合があります。これはサービスの部分集合がEndpointsにグループ化される場合と同様です。 +それぞれのEndpointSliceにはポートの集合があり、リソース内のすべてのエンドポイントに適用されます。サービスが名前付きポートを使用した場合、Podが同じ名前のポートに対して、結果的に異なるターゲットポート番号が使用されて、異なるEndpointSliceが必要になる場合があります。これはサービスの部分集合がEndpointにグループ化される場合と同様です。 -コントローラーはEndpointSliceをできる限り充填しようとしますが、積極的にリバランスを行うことはありません。コントローラーのロジックは極めて単純で、以下のようになっています。 +コントロールプレーンはEndpointSliceをできる限り充填しようとしますが、積極的にリバランスを行うことはありません。コントローラーのロジックは極めて単純で、以下のようになっています。 1. 既存のEndpointSliceをイテレートし、もう必要のないエンドポイントを削除し、変更があったエンドポイントを更新する。 2. 前のステップで変更されたEndpointSliceをイテレートし、追加する必要がある新しいエンドポイントで充填する。 @@ -101,8 +117,16 @@ EndpointSliceコントローラーは対応するEndpointSliceが最新の状態 現実的には、こうしたあまり理想的ではない分散が発生することは稀です。EndpointSliceコントローラーによって処理されるほとんどの変更は、既存のEndpointSliceに収まるほど十分小さくなるためです。そうでなかったとしても、すぐに新しいEndpointSliceが必要になる可能性が高いです。また、Deploymentのローリングアップデートが行われれば、自然な再充填が行われます。Podとそれに対応するエンドポイントがすべて置換されるためです。 +### エンドポイントの重複 + +EndpointSliceの変更の性質上、エンドポイントは同時に複数のEndpointSliceで表される場合があります。 +これは、さまざまなEndpointSliceオブジェクトへの変更が、さまざまな時間にKubernetesクライアントのウォッチ/キャッシュに到達する可能性があるために自然に発生します。 +EndpointSliceを使用する実装では、エンドポイントを複数のスライスに表示できる必要があります。 +エンドポイント重複排除を実行する方法のリファレンス実装は、`kube-proxy`の`EndpointSliceCache`実装にあります。 + + ## {{% heading "whatsnext" %}} -* [EndpointSliceを有効にする](/docs/tasks/administer-cluster/enabling-endpointslices) +* [EndpointSliceの有効化](/docs/tasks/administer-cluster/enabling-endpointslices)について学ぶ * [サービスとアプリケーションの接続](/ja/docs/concepts/services-networking/connect-applications-service/)を読む From 5eeff70c00c734bb52a68f893af2e0a313973062 Mon Sep 17 00:00:00 2001 From: lmx-Hexagram <52130356+lmx-Hexagram@users.noreply.github.com> Date: Wed, 28 Apr 2021 23:49:01 +0800 Subject: [PATCH 124/221] fix: Dockedr -> Docker --- .../blog/_posts/2020-12-02-dont-panic-kubernetes-and-docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/blog/_posts/2020-12-02-dont-panic-kubernetes-and-docker.md b/content/zh/blog/_posts/2020-12-02-dont-panic-kubernetes-and-docker.md index 788b28420d..e6a7cd2426 100644 --- a/content/zh/blog/_posts/2020-12-02-dont-panic-kubernetes-and-docker.md +++ b/content/zh/blog/_posts/2020-12-02-dont-panic-kubernetes-and-docker.md @@ -45,7 +45,7 @@ tool for building containers, and the images that result from running `docker build` can still run in your Kubernetes cluster. --> 如果你是 Kubernetes 的终端用户,这对你不会有太大影响。 -这事并不意味着 Dockder 已死、也不意味着你不能或不该继续把 Docker 用作开发工具。 +这事并不意味着 Docker 已死、也不意味着你不能或不该继续把 Docker 用作开发工具。 Docker 仍然是构建容器的利器,使用命令 `docker build` 构建的镜像在 Kubernetes 集群中仍然可以运行。 <!-- From d5f160df09629b38dbc53b4bcb5fb8c084b09406 Mon Sep 17 00:00:00 2001 From: Qiming Teng <tengqm@outlook.com> Date: Thu, 29 Apr 2021 12:11:57 +0800 Subject: [PATCH 125/221] [zh] Resync concepts section (13) --- .../overview/working-with-objects/labels.md | 13 +- .../overview/working-with-objects/names.md | 9 ++ .../working-with-objects/namespaces.md | 30 ++++- .../working-with-objects/object-management.md | 120 +++++++++--------- 4 files changed, 104 insertions(+), 68 deletions(-) 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 30e2635695..2714cb3f7b 100644 --- a/content/zh/docs/concepts/overview/working-with-objects/labels.md +++ b/content/zh/docs/concepts/overview/working-with-objects/labels.md @@ -100,10 +100,17 @@ _标签_ 是键值对。有效的标签键有两个段:可选的前缀和名 `kubernetes.io/` 前缀是为 Kubernetes 核心组件保留的。 <!-- -Valid label values must be 63 characters or less and must be empty or begin and end with an alphanumeric character (`[a-z0-9A-Z]`) with dashes (`-`), underscores (`_`), dots (`.`), and alphanumerics between. +Valid label value: + +* must be 63 characters or less (can be empty), +* unless empty, must begin and end with an alphanumeric character (`[a-z0-9A-Z]`), +* could contain dashes (`-`), underscores (`_`), dots (`.`), and alphanumerics between. --> -有效标签值必须为 63 个字符或更少,并且必须为空或以字母数字字符(`[a-z0-9A-Z]`)开头和结尾, -中间可以包含破折号(`-`)、下划线(`_`)、点(`.`)和字母或数字。 +有效标签值: + +* 必须为 63 个字符或更少(可以为空) +* 除非标签值为空,必须以字母数字字符(`[a-z0-9A-Z]`)开头和结尾 +* 包含破折号(`-`)、下划线(`_`)、点(`.`)和字母或数字。 <!-- ## Label selectors 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 6075e0273c..5e0c59ae6d 100644 --- a/content/zh/docs/concepts/overview/working-with-objects/names.md +++ b/content/zh/docs/concepts/overview/working-with-objects/names.md @@ -36,6 +36,15 @@ For non-unique user-provided attributes, Kubernetes provides [labels](/docs/user {{< glossary_definition term_id="name" length="all" >}} +{{< note >}} +<!-- +In cases when objects represent a physical entity, like a Node representing a physical host, when the host is re-created under the same name without deleting and re-creating the Node, Kubernetes treats the new host as the old one, which may lead to inconsistencies. +--> +当对象所代表的是一个物理实体(例如代表一台物理主机的 Node)时, +如果在 Node 对象未被删除并重建的条件下,创新创建了同名的物理主机, +则 Kubernetes 会将新的主机看作是老的主机,这可能会带来某种不一致性。 +{{< /note >}} + <!-- Below are three types of commonly used name constraints for resources. --> 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 d7ea89b644..38f947f6d1 100644 --- a/content/zh/docs/concepts/overview/working-with-objects/namespaces.md +++ b/content/zh/docs/concepts/overview/working-with-objects/namespaces.md @@ -51,13 +51,14 @@ Namespaces are a way to divide cluster resources between multiple users (via [re 名字空间是在多个用户之间划分集群资源的一种方法(通过[资源配额](/zh/docs/concepts/policy/resource-quotas/))。 <!-- -It is not necessary to use multiple namespaces just to separate slightly different +It is not necessary to use multiple namespaces to separate slightly different resources, such as different versions of the same software: use -[labels](/docs/concepts/overview/working-with-objects/labels/) to distinguish +{{< glossary_tooltip text="labels" term_id="label" >}} to distinguish resources within the same namespace. --> -不需要使用多个名字空间来分隔轻微不同的资源,例如同一软件的不同版本: -使用[标签](/zh/docs/concepts/overview/working-with-objects/labels)来区分同一名字空间中的不同资源。 +不必使用多个名字空间来分隔仅仅轻微不同的资源,例如同一软件的不同版本: +应该使用{{< glossary_tooltip text="标签" term_id="label" >}} +来区分同一名字空间中的不同资源。 <!-- ## Working with Namespaces @@ -160,7 +161,7 @@ Kubernetes 会创建一个相应的 [DNS 条目](/zh/docs/concepts/services-netw <!-- This entry is of the form `<service-name>.<namespace-name>.svc.cluster.local`, which means -that if a container just uses `<service-name>`, it will resolve to the service which +that if a container only uses `<service-name>`, it will resolve to the service which is local to a namespace. This is useful for using the same configuration across multiple namespaces such as Development, Staging and Production. If you want to reach across namespaces, you need to use the fully qualified domain name (FQDN). @@ -197,6 +198,25 @@ kubectl api-resources --namespaced=true kubectl api-resources --namespaced=false ``` +<!-- +## Automatic labelling +--> +## 自动打标签 {#automatic-labelling} + +{{< feature-state state="beta" for_k8s_version="1.21" >}} + +<!-- +The Kubernetes control plane sets an immutable {{< glossary_tooltip text="label" term_id="label" >}} +`kubernetes.io/metadata.name` on all namespaces, provided that the `NamespaceDefaultLabelName` +[feature gate](/docs/reference/command-line-tools-reference/feature-gates/) is enabled. +The value of the label is the namespace name. +--> +Kubernetes 控制面会为所有名字空间设置一个不可变更的 +{{< glossary_tooltip text="标签" term_id="label" >}} +`kubernetes.io/metadata.name`,只要 `NamespaceDefaultLabelName` 这一 +[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) +被启用。标签的值是名字空间的名称。 + ## {{% heading "whatsnext" %}} <!-- diff --git a/content/zh/docs/concepts/overview/working-with-objects/object-management.md b/content/zh/docs/concepts/overview/working-with-objects/object-management.md index e7bcf9af09..b1dd99ca60 100644 --- a/content/zh/docs/concepts/overview/working-with-objects/object-management.md +++ b/content/zh/docs/concepts/overview/working-with-objects/object-management.md @@ -11,8 +11,10 @@ Kubernetes objects. This document provides an overview of the different approaches. Read the [Kubectl book](https://kubectl.docs.kubernetes.io) for details of managing objects by Kubectl. --> -`kubectl` 命令行工具支持多种不同的方式来创建和管理 Kubernetes 对象。本文档概述了不同的方法。阅读 [Kubectl book](https://kubectl.docs.kubernetes.io) 来了解 kubectl 管理对象的详细信息。 - +`kubectl` 命令行工具支持多种不同的方式来创建和管理 Kubernetes 对象。 +本文档概述了不同的方法。 +阅读 [Kubectl book](https://kubectl.docs.kubernetes.io) 来了解 kubectl +管理对象的详细信息。 <!-- body --> @@ -29,30 +31,39 @@ and matching techniques for the same object results in undefined behavior. 应该只使用一种技术来管理 Kubernetes 对象。混合和匹配技术作用在同一对象上将导致未定义行为。 {{< /warning >}} +<!-- | Management technique | Operates on |Recommended environment | Supported writers | Learning curve | |----------------------------------|----------------------|------------------------|--------------------|----------------| | Imperative commands | Live objects | Development projects | 1+ | Lowest | | Imperative object configuration | Individual files | Production projects | 1 | Moderate | | Declarative object configuration | Directories of files | Production projects | 1+ | Highest | +--> +| 管理技术 | 作用于 | 建议的环境 | 支持的写者 | 学习难度 | +|----------------|----------|------------|------------|----------| +| 指令式命令 | 活跃对象 | 开发项目 | 1+ | 最低 | +| 指令式对象配置 | 单个文件 | 生产项目 | 1 | 中等 | +| 声明式对象配置 | 文件目录 | 生产项目 | 1+ | 最高 | <!-- ## Imperative commands --> -## 命令式命令 +## 指令式命令 <!-- When using imperative commands, a user operates directly on live objects in a cluster. The user provides operations to the `kubectl` command as arguments or flags. --> -使用命令式命令时,用户可以在集群中的活动对象上进行操作。用户将操作传给 `kubectl` 命令作为参数或标志。 +使用指令式命令时,用户可以在集群中的活动对象上进行操作。用户将操作传给 +`kubectl` 命令作为参数或标志。 <!-- -This is the simplest way to get started or to run a one-off task in +This is the recommended way to get started or to run a one-off task in a cluster. Because this technique operates directly on live objects, it provides no history of previous configurations. --> -这是开始或者在集群中运行一次性任务的最简单方法。因为这个技术直接在活动对象上操作,所以它不提供以前配置的历史记录。 +这是开始或者在集群中运行一次性任务的推荐方法。因为这个技术直接在活跃对象 +上操作,所以它不提供以前配置的历史记录。 <!-- ### Examples @@ -64,15 +75,6 @@ Run an instance of the nginx container by creating a Deployment object: --> 通过创建 Deployment 对象来运行 nginx 容器的实例: -```sh -kubectl run nginx --image nginx -``` - -<!-- -Do the same thing using a different syntax: ---> -使用不同的语法来达到同样的上面的效果: - ```sh kubectl create deployment nginx --image nginx ``` @@ -84,27 +86,25 @@ kubectl create deployment nginx --image nginx <!-- Advantages compared to object configuration: ---> -与对象配置相比的优点: -<!-- - Commands are simple, easy to learn and easy to remember. - Commands require only a single step to make changes to the cluster. --> +与对象配置相比的优点: + - 命令简单,易学且易于记忆。 - 命令仅需一步即可对集群进行更改。 <!-- Disadvantages compared to object configuration: ---> -与对象配置相比的缺点: -<!-- - Commands do not integrate with change review processes. - Commands do not provide an audit trail associated with changes. - Commands do not provide a source of records except for what is live. - Commands do not provide a template for creating new objects. --> +与对象配置相比的缺点: + - 命令不与变更审查流程集成。 - 命令不提供与更改关联的审核跟踪。 - 除了实时内容外,命令不提供记录源。 @@ -113,7 +113,7 @@ Disadvantages compared to object configuration: <!-- ## Imperative object configuration --> -## 命令式对象配置 +## 指令式对象配置 <!-- In imperative object configuration, the kubectl command specifies the @@ -121,13 +121,15 @@ operation (create, replace, etc.), optional flags and at least one file name. The file specified must contain a full definition of the object in YAML or JSON format. --> -在命令式对象配置中,kubectl 命令指定操作(创建,替换等),可选标志和至少一个文件名。指定的文件必须包含 YAML 或 JSON 格式的对象的完整定义。 +在指令式对象配置中,kubectl 命令指定操作(创建,替换等),可选标志和 +至少一个文件名。指定的文件必须包含 YAML 或 JSON 格式的对象的完整定义。 <!-- See the [API reference](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/) for more details on object definitions. --> -有关对象定义的详细信息,请查看 [API 参考](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/)。 +有关对象定义的详细信息,请查看 +[API 参考](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/)。 {{< warning >}} <!-- @@ -138,17 +140,19 @@ types whose specs are updated independently of the configuration file. Services of type `LoadBalancer`, for example, have their `externalIPs` field updated independently from the configuration by the cluster. --> -`replace` 命令式命令将现有规范替换为新提供的规范,并删除对配置文件中缺少的对象的所有更改。此方法不应与规范独立于配置文件进行更新的资源类型一起使用。比如类型为 `LoadBalancer` 的服务,它的 `externalIPs` 字段就是独立于集群配置进行更新。 +`replace` 指令式命令将现有规范替换为新提供的规范,并放弃对配置文件中 +缺少的对象的所有更改。此方法不应与对象规约被独立于配置文件进行更新的 +资源类型一起使用。比如类型为 `LoadBalancer` 的服务,它的 `externalIPs` +字段就是独立于集群配置进行更新。 {{< /warning >}} <!-- ### Examples + +Create the objects defined in a configuration file: --> ### 例子 -<!-- -Create the objects defined in a configuration file: ---> 创建配置文件中定义的对象: ```sh @@ -181,52 +185,48 @@ kubectl replace -f nginx.yaml <!-- Advantages compared to imperative commands: ---> -与命令式命令相比的优点: -<!-- - Object configuration can be stored in a source control system such as Git. - Object configuration can integrate with processes such as reviewing changes before push and audit trails. - Object configuration provides a template for creating new objects. --> +与指令式命令相比的优点: + - 对象配置可以存储在源控制系统中,比如 Git。 - 对象配置可以与流程集成,例如在推送和审计之前检查更新。 - 对象配置提供了用于创建新对象的模板。 <!-- Disadvantages compared to imperative commands: ---> -与命令式命令相比的缺点: -<!-- - Object configuration requires basic understanding of the object schema. - Object configuration requires the additional step of writing a YAML file. --> +与指令式命令相比的缺点: + - 对象配置需要对对象架构有基本的了解。 - 对象配置需要额外的步骤来编写 YAML 文件。 <!-- Advantages compared to declarative object configuration: ---> -与声明式对象配置相比的优点: -<!-- - Imperative object configuration behavior is simpler and easier to understand. - As of Kubernetes version 1.5, imperative object configuration is more mature. --> -- 命令式对象配置行为更加简单易懂。 -- 从 Kubernetes 1.5 版本开始,命令式对象配置更加成熟。 +与声明式对象配置相比的优点: + +- 指令式对象配置行为更加简单易懂。 +- 从 Kubernetes 1.5 版本开始,指令对象配置更加成熟。 <!-- Disadvantages compared to declarative object configuration: ---> -与声明式对象配置相比的缺点: -<!-- - Imperative object configuration works best on files, not directories. - Updates to live objects must be reflected in configuration files, or they will be lost during the next replacement. --> -- 命令式对象配置更适合文件,而非目录。 +与声明式对象配置相比的缺点: + +- 指令式对象配置更适合文件,而非目录。 - 对活动对象的更新必须反映在配置文件中,否则会在下一次替换时丢失。 <!-- @@ -241,7 +241,10 @@ operations to be taken on the files. Create, update, and delete operations are automatically detected per-object by `kubectl`. This enables working on directories, where different operations might be needed for different objects. --> -使用声明式对象配置时,用户对本地存储的对象配置文件进行操作,但是用户未定义要对该文件执行的操作。`kubectl` 会自动检测每个文件的创建、更新和删除操作。这使得配置可以在目录上工作,根据目录中配置文件对不同的对象执行不同的操作。 +使用声明式对象配置时,用户对本地存储的对象配置文件进行操作,但是用户 +未定义要对该文件执行的操作。 +`kubectl` 会自动检测每个文件的创建、更新和删除操作。 +这使得配置可以在目录上工作,根据目录中配置文件对不同的对象执行不同的操作。 {{< note >}} <!-- @@ -251,7 +254,9 @@ This is possible by using the `patch` API operation to write only observed differences, instead of using the `replace` API operation to replace the entire object configuration. --> -声明式对象配置保留其他编写者所做的修改,即使这些更改并未合并到对象配置文件中。可以通过使用 `patch` API 操作仅写入观察到的差异,而不是使用 `replace` API 操作来替换整个对象配置来实现。 +声明式对象配置保留其他编写者所做的修改,即使这些更改并未合并到对象配置文件中。 +可以通过使用 `patch` API 操作仅写入观察到的差异,而不是使用 `replace` API +操作来替换整个对象配置来实现。 {{< /note >}} <!-- @@ -264,7 +269,8 @@ Process all object configuration files in the `configs` directory, and create or patch the live objects. You can first `diff` to see what changes are going to be made, and then apply: --> -处理 `configs` 目录中的所有对象配置文件,创建并更新活动对象。可以首先使用 `diff` 子命令查看将要进行的更改,然后在进行应用: +处理 `configs` 目录中的所有对象配置文件,创建并更新活跃对象。 +可以首先使用 `diff` 子命令查看将要进行的更改,然后在进行应用: ```sh kubectl diff -f configs/ @@ -283,35 +289,30 @@ kubectl apply -R -f configs/ <!-- ### Trade-offs ---> -### 权衡 -<!-- Advantages compared to imperative object configuration: ---> -与命令式对象配置相比的优点: -<!-- - Changes made directly to live objects are retained, even if they are not merged back into the configuration files. - Declarative object configuration has better support for operating on directories and automatically detecting operation types (create, patch, delete) per-object. --> +### 权衡 + +与指令式对象配置相比的优点: + - 对活动对象所做的更改即使未合并到配置文件中,也会被保留下来。 - 声明性对象配置更好地支持对目录进行操作并自动检测每个文件的操作类型(创建,修补,删除)。 <!-- Disadvantages compared to imperative object configuration: ---> -与命令式对象配置相比的缺点: -<!-- - Declarative object configuration is harder to debug and understand results when they are unexpected. - Partial updates using diffs create complex merge and patch operations. --> +与指令式对象配置相比的缺点: + - 声明式对象配置难于调试并且出现异常时结果难以理解。 - 使用 diff 产生的部分更新会创建复杂的合并和补丁操作。 - - ## {{% heading "whatsnext" %}} @@ -324,12 +325,11 @@ Disadvantages compared to imperative object configuration: - [Kubectl Book](https://kubectl.docs.kubernetes.io) - [Kubernetes API Reference](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/) --> -- [使用命令式命令管理 Kubernetes 对象](/zh/docs/tasks/manage-kubernetes-objects/imperative-command/) -- [使用对象配置管理 Kubernetes 对象(命令式)](/zh/docs/tasks/manage-kubernetes-objects/imperative-config/) +- [使用指令式命令管理 Kubernetes 对象](/zh/docs/tasks/manage-kubernetes-objects/imperative-command/) +- [使用对象配置管理 Kubernetes 对象(指令式)](/zh/docs/tasks/manage-kubernetes-objects/imperative-config/) - [使用对象配置管理 Kubernetes 对象(声明式)](/zh/docs/tasks/manage-kubernetes-objects/declarative-config/) - [使用 Kustomize(声明式)管理 Kubernetes 对象](/zh/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" >}}/) - From 1607e18655915718e4c3ba7638a63c657b1eaefc Mon Sep 17 00:00:00 2001 From: Qiming Teng <tengqm@outlook.com> Date: Thu, 29 Apr 2021 12:38:27 +0800 Subject: [PATCH 126/221] [zh] Resync concepts section (14) --- .../concepts/policy/pod-security-policy.md | 7 +- .../docs/concepts/policy/resource-quotas.md | 159 ++++++++++++++++-- .../policy/priority-class-resourcequota.yaml | 10 ++ 3 files changed, 159 insertions(+), 17 deletions(-) create mode 100644 content/zh/examples/policy/priority-class-resourcequota.yaml diff --git a/content/zh/docs/concepts/policy/pod-security-policy.md b/content/zh/docs/concepts/policy/pod-security-policy.md index 9ea3577de8..0b63716241 100644 --- a/content/zh/docs/concepts/policy/pod-security-policy.md +++ b/content/zh/docs/concepts/policy/pod-security-policy.md @@ -12,7 +12,12 @@ content_type: concept weight: 30 --> -{{< feature-state state="beta" >}} +{{< feature-state for_k8s_version="v1.21" state="deprecated" >}} + +<!-- +PodSecurityPolicy is deprecated as of Kubernetes v1.21, and will be removed in v1.25. +--> +PodSecurityPolicy 在 Kubernetes v1.21 版本中被启用,将在 v1.25 中删除。 <!-- Pod Security Policies enable fine-grained authorization of pod creation and diff --git a/content/zh/docs/concepts/policy/resource-quotas.md b/content/zh/docs/concepts/policy/resource-quotas.md index 33d2a9e5f3..23cc9a2308 100644 --- a/content/zh/docs/concepts/policy/resource-quotas.md +++ b/content/zh/docs/concepts/policy/resource-quotas.md @@ -103,13 +103,15 @@ Neither contention nor changes to quota will affect already created resources. ## Enabling Resource Quota Resource Quota support is enabled by default for many Kubernetes distributions. It is -enabled when the API server `--enable-admission-plugins=` flag has `ResourceQuota` as +enabled when the {{< glossary_tooltip text="API server" term_id="kube-apiserver" >}} `--enable-admission-plugins=` flag has `ResourceQuota` as one of its arguments. --> ## 启用资源配额 -资源配额的支持在很多 Kubernetes 版本中是默认开启的。当 API 服务器的 `--enable-admission-plugins=` -参数中包含 `ResourceQuota` 时,资源配额会被启用。 +资源配额的支持在很多 Kubernetes 版本中是默认启用的。 +当 {{< glossary_tooltip text="API 服务器" term_id="kube-apiserver" >}} +的命令行标志 `--enable-admission-plugins=` 中包含 `ResourceQuota` 时, +资源配额会被启用。 <!-- A resource quota is enforced in a particular namespace when there is a @@ -245,6 +247,16 @@ In release 1.8, quota support for local ephemeral storage is added as an alpha f | `limits.ephemeral-storage` | 在命名空间的所有 Pod 中,本地临时存储限制值的总和不能超过此值。 | | `ephemeral-storage` | 与 `requests.ephemeral-storage` 相同。 | +{{< note >}} +<!-- +When using a CRI container runtime, container logs will count against the ephemeral storage quota. This can result in the unexpected eviction of pods that have exhausted their storage quotas. Refer to [Logging Architecture](/docs/concepts/cluster-administration/logging/) for details. +--> +如果所使用的是 CRI 容器运行时,容器日志会被计入临时存储配额。 +这可能会导致存储配额耗尽的 Pods 被意外地驱逐出节点。 +参考[日志架构](/zh/docs/concepts/cluster-administration/logging/) +了解详细信息。 +{{< /note >}} + <!-- ## Object Count Quota @@ -371,6 +383,7 @@ Resources specified on the quota outside of the allowed set results in a validat | `BestEffort` | Match pods that have best effort quality of service. | | `NotBestEffort` | Match pods that do not have best effort quality of service. | | `PriorityClass` | Match pods that references the specified [priority class](/docs/concepts/configuration/pod-priority-preemption). | +| `CrossNamespacePodAffinity` | Match pods that have cross-namespace pod [(anti)affinity terms](/docs/concepts/scheduling-eviction/assign-pod-node). | --> | 作用域 | 描述 | | ----- | ----------- | @@ -379,6 +392,7 @@ Resources specified on the quota outside of the allowed set results in a validat | `BestEffort` | 匹配所有 Qos 是 BestEffort 的 Pod。 | | `NotBestEffort` | 匹配所有 Qos 不是 BestEffort 的 Pod。 | | `PriorityClass` | 匹配所有引用了所指定的[优先级类](/zh/docs/concepts/configuration/pod-priority-preemption)的 Pods。 | +| `CrossNamespacePodAffinity` | 匹配那些设置了跨名字空间 [(反)亲和性条件](/zh/docs/concepts/scheduling-eviction/assign-pod-node)的 Pod。 | <!-- The `BestEffort` scope restricts a quota to tracking the following resource: @@ -684,12 +698,105 @@ pods 0 10 ``` <!-- -## Requests vs Limits +### Cross-namespace Pod Affinity Quota +--> +### 跨名字空间的 Pod 亲和性配额 {#cross-namespace-pod-affinity-quota} + +{{< feature-state for_k8s_version="v1.21" state="alpha" >}} + +<!-- +Operators can use `CrossNamespacePodAffinity` quota scope to limit which namespaces are allowed to +have pods with affinity terms that cross namespaces. Specifically, it controls which pods are allowed +to set `namespaces` or `namespaceSelector` fields in pod affinity terms. +--> +集群运维人员可以使用 `CrossNamespacePodAffinity` 配额作用域来 +限制哪个名字空间中可以存在包含跨名字空间亲和性规则的 Pod。 +更为具体一点,此作用域用来配置哪些 Pod 可以在其 Pod 亲和性规则 +中设置 `namespaces` 或 `namespaceSelector` 字段。 + +<!-- +Preventing users from using cross-namespace affinity terms might be desired since a pod +with anti-affinity constraints can block pods from all other namespaces +from getting scheduled in a failure domain. +--> +禁止用户使用跨名字空间的亲和性规则可能是一种被需要的能力,因为带有 +反亲和性约束的 Pod 可能会阻止所有其他名字空间的 Pod 被调度到某失效域中。 + +<!-- +Using this scope operators can prevent certain namespaces (`foo-ns` in the example below) +from having pods that use cross-namespace pod affinity by creating a resource quota object in +that namespace with `CrossNamespaceAffinity` scope and hard limit of 0: +--> +使用此作用域操作符可以避免某些名字空间(例如下面例子中的 `foo-ns`)运行 +特别的 Pod,这类 Pod 使用跨名字空间的 Pod 亲和性约束,在该名字空间中创建 +了作用域为 `CrossNamespaceAffinity` 的、硬性约束为 0 的资源配额对象。 + +```yaml +apiVersion: v1 +kind: ResourceQuota +metadata: + name: disable-cross-namespace-affinity + namespace: foo-ns +spec: + hard: + pods: "0" + scopeSelector: + matchExpressions: + - scopeName: CrossNamespaceAffinity +``` + +<!-- +If operators want to disallow using `namespaces` and `namespaceSelector` by default, and +only allow it for specific namespaces, they could configure `CrossNamespaceAffinity` +as a limited resource by setting the kube-apiserver flag -admission-control-config-file +to the path of the following configuration file: +--> +如果集群运维人员希望默认禁止使用 `namespaces` 和 `namespaceSelector`,而 +仅仅允许在特定名字空间中这样做,他们可以将 `CrossNamespaceAffinity` 作为一个 +被约束的资源。方法是为 `kube-apiserver` 设置标志 +`--admission-control-config-file`,使之指向如下的配置文件: + +```yaml +apiVersion: apiserver.config.k8s.io/v1 +kind: AdmissionConfiguration +plugins: +- name: "ResourceQuota" + configuration: + apiVersion: apiserver.config.k8s.io/v1 + kind: ResourceQuotaConfiguration + limitedResources: + - resource: pods + matchScopes: + - scopeName: CrossNamespaceAffinity +``` + +<!-- +With the above configuration, pods can use `namespaces` and `namespaceSelector` in pod affinity only +if the namespace where they are created have a resource quota object with +`CrossNamespaceAffinity` scope and a hard limit greater than or equal to the number of pods using those fields. +--> +基于上面的配置,只有名字空间中包含作用域为 `CrossNamespaceAffinity` 且 +硬性约束大于或等于使用 `namespaces` 和 `namespaceSelector` 字段的 Pods +个数时,才可以在该名字空间中继续创建在其 Pod 亲和性规则中设置 `namespaces` +或 `namespaceSelector` 的新 Pod。 + +<!-- +This feature is alpha and disabled by default. You can enable it by setting the +[feature gate](/docs/reference/command-line-tools-reference/feature-gates/) +`PodAffinityNamespaceSelector` in both kube-apiserver and kube-scheduler. +--> +此功能特性处于 Alpha 阶段,默认被禁用。你可以通过为 kube-apiserver 和 +kube-scheduler 设置 +[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) +`PodAffinityNamespaceSelector` 来启用此特性。 + +<!-- +## Requests compared to Limits {#requests-vs-limits} When allocating compute resources, each container may specify a request and a limit value for either CPU or memory. The quota can be configured to quota either value. --> -## 请求与限制 {#requests-vs-limits} +## 请求与限制的比较 {#requests-vs-limits} 分配计算资源时,每个容器可以为 CPU 或内存指定请求和约束。 配额可以针对二者之一进行设置。 @@ -917,22 +1024,42 @@ plugins: ``` <!-- -Now, "cluster-services" pods will be allowed in only those namespaces where a quota object with a matching `scopeSelector` is present. - -For example: +Then, create a resource quota object in the `kube-system` namespace: --> -现在,仅当命名空间中存在匹配的 `scopeSelector` 的配额对象时,才允许使用 "cluster-services" Pod。 +现在在 `kube-system` 名字空间中创建一个资源配额对象: -示例: +{{< codenew file="policy/priority-class-resourcequota.yaml" >}} -```yaml - scopeSelector: - matchExpressions: - - scopeName: PriorityClass - operator: In - values: ["cluster-services"] +```shell +kubectl apply -f https://k8s.io/examples/policy/priority-class-resourcequota.yaml -n kube-system ``` +``` +resourcequota/pods-cluster-services created +``` + +<!-- +In this case, a pod creation will be allowed if: + +1. the Pod's `priorityClassName` is not specified. +1. the Pod's `priorityClassName` is specified to a value other than `cluster-services`. +1. the Pod's `priorityClassName` is set to `cluster-services`, it is to be created + in the `kube-system` namespace, and it has passed the resource quota check. +--> +在这里,当以下条件满足时可以创建 Pod: + +1. Pod 未设置 `priorityClassName` +1. Pod 的 `priorityClassName` 设置值不是 `cluster-services` +1. Pod 的 `priorityClassName` 设置值为 `cluster-services`,它将被创建于 + `kube-system` 名字空间中,并且它已经通过了资源配额检查。 + +<!-- +A Pod creation request is rejected if its `priorityClassName` is set to `cluster-services` +and it is to be created in a namespace other than `kube-system`. +--> +如果 Pod 的 `priorityClassName` 设置为 `cluster-services`,但要被创建到 +`kube-system` 之外的别的名字空间,则 Pod 创建请求也被拒绝。 + ## {{% heading "whatsnext" %}} <!-- diff --git a/content/zh/examples/policy/priority-class-resourcequota.yaml b/content/zh/examples/policy/priority-class-resourcequota.yaml new file mode 100644 index 0000000000..7350d00c8f --- /dev/null +++ b/content/zh/examples/policy/priority-class-resourcequota.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: ResourceQuota +metadata: + name: pods-cluster-services +spec: + scopeSelector: + matchExpressions: + - operator : In + scopeName: PriorityClass + values: ["cluster-services"] \ No newline at end of file From d9de7214d195e3d1eccd0fa7155756ba95aa6d0f Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Thu, 29 Apr 2021 08:57:33 +0000 Subject: [PATCH 127/221] Copy content/en/docs/concepts/cluster-administration/addons.md for translation --- .../concepts/cluster-administration/addons.md | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 content/ja/docs/concepts/cluster-administration/addons.md diff --git a/content/ja/docs/concepts/cluster-administration/addons.md b/content/ja/docs/concepts/cluster-administration/addons.md new file mode 100644 index 0000000000..726a714151 --- /dev/null +++ b/content/ja/docs/concepts/cluster-administration/addons.md @@ -0,0 +1,53 @@ +--- +title: Installing Addons +content_type: concept +--- + +<!-- overview --> + +{{% thirdparty-content %}} + +Add-ons extend the functionality of Kubernetes. + +This page lists some of the available add-ons and links to their respective installation instructions. + +<!-- body --> + +## Networking and Network Policy + +* [ACI](https://www.github.com/noironetworks/aci-containers) provides integrated container networking and network security with Cisco ACI. +* [Antrea](https://antrea.io/) operates at Layer 3/4 to provide networking and security services for Kubernetes, leveraging Open vSwitch as the networking data plane. +* [Calico](https://docs.projectcalico.org/latest/introduction/) is a networking and network policy provider. Calico supports a flexible set of networking options so you can choose the most efficient option for your situation, including non-overlay and overlay networks, with or without BGP. Calico uses the same engine to enforce network policy for hosts, pods, and (if using Istio & Envoy) applications at the service mesh layer. +* [Canal](https://github.com/tigera/canal/tree/master/k8s-install) unites Flannel and Calico, providing networking and network policy. +* [Cilium](https://github.com/cilium/cilium) is a L3 network and network policy plugin that can enforce HTTP/API/L7 policies transparently. Both routing and overlay/encapsulation mode are supported, and it can work on top of other CNI plugins. +* [CNI-Genie](https://github.com/Huawei-PaaS/CNI-Genie) enables Kubernetes to seamlessly connect to a choice of CNI plugins, such as Calico, Canal, Flannel, Romana, or Weave. +* [Contiv](https://contiv.github.io) provides configurable networking (native L3 using BGP, overlay using vxlan, classic L2, and Cisco-SDN/ACI) for various use cases and a rich policy framework. Contiv project is fully [open sourced](https://github.com/contiv). The [installer](https://github.com/contiv/install) provides both kubeadm and non-kubeadm based installation options. +* [Contrail](https://www.juniper.net/us/en/products-services/sdn/contrail/contrail-networking/), based on [Tungsten Fabric](https://tungsten.io), is an open source, multi-cloud network virtualization and policy management platform. Contrail and Tungsten Fabric are integrated with orchestration systems such as Kubernetes, OpenShift, OpenStack and Mesos, and provide isolation modes for virtual machines, containers/pods and bare metal workloads. +* [Flannel](https://github.com/coreos/flannel/blob/master/Documentation/kubernetes.md) is an overlay network provider that can be used with Kubernetes. +* [Knitter](https://github.com/ZTE/Knitter/) is a plugin to support multiple network interfaces in a Kubernetes pod. +* [Multus](https://github.com/Intel-Corp/multus-cni) is a Multi plugin for multiple network support in Kubernetes to support all CNI plugins (e.g. Calico, Cilium, Contiv, Flannel), in addition to SRIOV, DPDK, OVS-DPDK and VPP based workloads in Kubernetes. +* [OVN-Kubernetes](https://github.com/ovn-org/ovn-kubernetes/) is a networking provider for Kubernetes based on [OVN (Open Virtual Network)](https://github.com/ovn-org/ovn/), a virtual networking implementation that came out of the Open vSwitch (OVS) project. OVN-Kubernetes provides an overlay based networking implementation for Kubernetes, including an OVS based implementation of load balancing and network policy. +* [OVN4NFV-K8S-Plugin](https://github.com/opnfv/ovn4nfv-k8s-plugin) is OVN based CNI controller plugin to provide cloud native based Service function chaining(SFC), Multiple OVN overlay networking, dynamic subnet creation, dynamic creation of virtual networks, VLAN Provider network, Direct provider network and pluggable with other Multi-network plugins, ideal for edge based cloud native workloads in Multi-cluster networking +* [NSX-T](https://docs.vmware.com/en/VMware-NSX-T/2.0/nsxt_20_ncp_kubernetes.pdf) Container Plug-in (NCP) provides integration between VMware NSX-T and container orchestrators such as Kubernetes, as well as integration between NSX-T and container-based CaaS/PaaS platforms such as Pivotal Container Service (PKS) and OpenShift. +* [Nuage](https://github.com/nuagenetworks/nuage-kubernetes/blob/v5.1.1-1/docs/kubernetes-1-installation.rst) is an SDN platform that provides policy-based networking between Kubernetes Pods and non-Kubernetes environments with visibility and security monitoring. +* [Romana](https://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/kubernetes/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. + +## Service Discovery + +* [CoreDNS](https://coredns.io) is a flexible, extensible DNS server which can be [installed](https://github.com/coredns/deployment/tree/master/kubernetes) as the in-cluster DNS for pods. + +## Visualization & Control + +* [Dashboard](https://github.com/kubernetes/dashboard#kubernetes-dashboard) is a dashboard web interface for Kubernetes. +* [Weave Scope](https://www.weave.works/documentation/scope-latest-installing/#k8s) is a tool for graphically visualizing your containers, pods, services etc. Use it in conjunction with a [Weave Cloud account](https://cloud.weave.works/) or host the UI yourself. + +## Infrastructure + +* [KubeVirt](https://kubevirt.io/user-guide/#/installation/installation) is an add-on to run virtual machines on Kubernetes. Usually run on bare-metal clusters. + +## Legacy Add-ons + +There are several other add-ons documented in the deprecated [cluster/addons](https://git.k8s.io/kubernetes/cluster/addons) directory. + +Well-maintained ones should be linked to here. PRs welcome! From e0d4e723426e97bbd2714ad27ceadb91c44b3851 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Fri, 30 Apr 2021 13:46:47 +0000 Subject: [PATCH 128/221] Translate concepts/cluster-administration/addons into Japanese --- .../concepts/cluster-administration/addons.md | 62 +++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/content/ja/docs/concepts/cluster-administration/addons.md b/content/ja/docs/concepts/cluster-administration/addons.md index 726a714151..72e9ebc39f 100644 --- a/content/ja/docs/concepts/cluster-administration/addons.md +++ b/content/ja/docs/concepts/cluster-administration/addons.md @@ -1,5 +1,5 @@ --- -title: Installing Addons +title: アドオンのインストール content_type: concept --- @@ -7,47 +7,47 @@ content_type: concept {{% thirdparty-content %}} -Add-ons extend the functionality of Kubernetes. +アドオンはKubernetesの機能を拡張するものです。 -This page lists some of the available add-ons and links to their respective installation instructions. +このページでは、利用可能なアドオンの一部の一覧と、それぞれのアドオンのインストール方法へのリンクを提供します。 <!-- body --> -## Networking and Network Policy +## ネットワークとネットワークポリシー -* [ACI](https://www.github.com/noironetworks/aci-containers) provides integrated container networking and network security with Cisco ACI. -* [Antrea](https://antrea.io/) operates at Layer 3/4 to provide networking and security services for Kubernetes, leveraging Open vSwitch as the networking data plane. -* [Calico](https://docs.projectcalico.org/latest/introduction/) is a networking and network policy provider. Calico supports a flexible set of networking options so you can choose the most efficient option for your situation, including non-overlay and overlay networks, with or without BGP. Calico uses the same engine to enforce network policy for hosts, pods, and (if using Istio & Envoy) applications at the service mesh layer. -* [Canal](https://github.com/tigera/canal/tree/master/k8s-install) unites Flannel and Calico, providing networking and network policy. -* [Cilium](https://github.com/cilium/cilium) is a L3 network and network policy plugin that can enforce HTTP/API/L7 policies transparently. Both routing and overlay/encapsulation mode are supported, and it can work on top of other CNI plugins. -* [CNI-Genie](https://github.com/Huawei-PaaS/CNI-Genie) enables Kubernetes to seamlessly connect to a choice of CNI plugins, such as Calico, Canal, Flannel, Romana, or Weave. -* [Contiv](https://contiv.github.io) provides configurable networking (native L3 using BGP, overlay using vxlan, classic L2, and Cisco-SDN/ACI) for various use cases and a rich policy framework. Contiv project is fully [open sourced](https://github.com/contiv). The [installer](https://github.com/contiv/install) provides both kubeadm and non-kubeadm based installation options. -* [Contrail](https://www.juniper.net/us/en/products-services/sdn/contrail/contrail-networking/), based on [Tungsten Fabric](https://tungsten.io), is an open source, multi-cloud network virtualization and policy management platform. Contrail and Tungsten Fabric are integrated with orchestration systems such as Kubernetes, OpenShift, OpenStack and Mesos, and provide isolation modes for virtual machines, containers/pods and bare metal workloads. -* [Flannel](https://github.com/coreos/flannel/blob/master/Documentation/kubernetes.md) is an overlay network provider that can be used with Kubernetes. -* [Knitter](https://github.com/ZTE/Knitter/) is a plugin to support multiple network interfaces in a Kubernetes pod. -* [Multus](https://github.com/Intel-Corp/multus-cni) is a Multi plugin for multiple network support in Kubernetes to support all CNI plugins (e.g. Calico, Cilium, Contiv, Flannel), in addition to SRIOV, DPDK, OVS-DPDK and VPP based workloads in Kubernetes. -* [OVN-Kubernetes](https://github.com/ovn-org/ovn-kubernetes/) is a networking provider for Kubernetes based on [OVN (Open Virtual Network)](https://github.com/ovn-org/ovn/), a virtual networking implementation that came out of the Open vSwitch (OVS) project. OVN-Kubernetes provides an overlay based networking implementation for Kubernetes, including an OVS based implementation of load balancing and network policy. -* [OVN4NFV-K8S-Plugin](https://github.com/opnfv/ovn4nfv-k8s-plugin) is OVN based CNI controller plugin to provide cloud native based Service function chaining(SFC), Multiple OVN overlay networking, dynamic subnet creation, dynamic creation of virtual networks, VLAN Provider network, Direct provider network and pluggable with other Multi-network plugins, ideal for edge based cloud native workloads in Multi-cluster networking -* [NSX-T](https://docs.vmware.com/en/VMware-NSX-T/2.0/nsxt_20_ncp_kubernetes.pdf) Container Plug-in (NCP) provides integration between VMware NSX-T and container orchestrators such as Kubernetes, as well as integration between NSX-T and container-based CaaS/PaaS platforms such as Pivotal Container Service (PKS) and OpenShift. -* [Nuage](https://github.com/nuagenetworks/nuage-kubernetes/blob/v5.1.1-1/docs/kubernetes-1-installation.rst) is an SDN platform that provides policy-based networking between Kubernetes Pods and non-Kubernetes environments with visibility and security monitoring. -* [Romana](https://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/kubernetes/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を使用して提供します。 +* [Antrea](https://antrea.io/)は、L3またはL4で動作して、Open vSwitchをネットワークデータプレーンとして活用する、Kubernetes向けのネットワークとセキュリティサービスを提供します。 +* [Calico](https://docs.projectcalico.org/latest/introduction/)はネットワークとネットワークプリシーのプロバイダーです。Calicoは、BGPを使用または未使用の非オーバーレイおよびオーバーレイネットワークを含む、フレキシブルなさまざまなネットワークオプションサポートします。Calicoはホスト、Pod、そして(IstioとEnvoyを使用している場合には)サービスメッシュ上のアプリケーションに対してネットワークポリシーを強制するために、同一のエンジンを使用します。 +* [Canal](https://github.com/tigera/canal/tree/master/k8s-install)はFlannelとCalicoをあわせたもので、ネットワークとネットワークポリシーを提供します。 +* [Cilium](https://github.com/cilium/cilium)は、L3のネットワークとネットワークポリシーのプラグインで、HTTP/API/L7のポリシーを透過的に強制できます。ルーティングとoverlay/encapsulationモードの両方をサポートしており、他のCNIプラグイン上で機能できます。 +* [CNI-Genie](https://github.com/Huawei-PaaS/CNI-Genie)は、KubernetesをCalico、Canal、Flannel、Romana、Weaveなど選択したCNIプラグインをシームレスに接続できるようにするプラグインです。 +* [Contiv](https://contiv.github.io)は、さまざまなユースケースと豊富なポリシーフレームワーク向けに設定可能なネットワーク(BGPを使用したネイティブのL3、vxlanを使用したオーバーレイ、古典的なL2、Cisco-SDN/ACI)を提供します。Contivプロジェクトは完全に[オープンソース](https://github.com/contiv)です。[インストーラ](https://github.com/contiv/install)はkubeadmとkubeadm以外の両方をベースとしたインストールオプションがあります。 +* [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などのオーケストレーションシステムと統合されており、仮想マシン、コンテナ/Pod、ベアメタルのワークロードに隔離モードを提供します。 +* [Flannel](https://github.com/coreos/flannel/blob/master/Documentation/kubernetes.md)は、Kubernetesで使用できるオーバーレイネットワークプロバイダーです。 +* [Knitter](https://github.com/ZTE/Knitter/)は、1つのKubernetes Podで複数のネットワークインターフェイスをサポートするためのプラグインです。 +* [Multus](https://github.com/Intel-Corp/multus-cni)は、すべてのCNIプラグイン(たとえば、Calico、Cilium、Contiv、Flannel)に加えて、SRIOV、DPDK、OVS-DPDK、VPPをベースとするKubernetes上のワークロードをサポートする、複数のネットワークサポートのためのMultiプラグインです。 +* [OVN-Kubernetes](https://github.com/ovn-org/ovn-kubernetes/)は、Open vSwitch(OVS)プロジェクトから生まれた仮想ネットワーク実装である[OVN(Open Virtual Network)](https://github.com/ovn-org/ovn/)をベースとする、Kubernetesのためのネットワークプロバイダです。OVN-Kubernetesは、OVSベースのロードバランサーおよびネットワークポリシーの実装を含む、Kubernetes向けのオーバーレイベースのネットワーク実装を提供します。 +* [OVN4NFV-K8S-Plugin](https://github.com/opnfv/ovn4nfv-k8s-plugin)は、クラウドネイティブベースのService function chaining(SFC)、Multiple OVNオーバーレイネットワーク、動的なサブネットの作成、動的な仮想ネットワークの作成、VLANプロバイダーネットワーク、Directプロバイダーネットワークを提供し、他のMulti-networkプラグインと付け替え可能なOVNベースのCNIコントローラープラグインです。 +* [NSX-T](https://docs.vmware.com/en/VMware-NSX-T/2.0/nsxt_20_ncp_kubernetes.pdf) Container Plug-in(NCP)は、VMware NSX-TとKubernetesなどのコンテナオーケストレーター間のインテグレーションを提供します。また、NSX-Tと、Pivotal Container Service(PKS)とOpenShiftなどのコンテナベースのCaaS/PaaSプラットフォームとのインテグレーションも提供します。 +* [Nuage](https://github.com/nuagenetworks/nuage-kubernetes/blob/v5.1.1-1/docs/kubernetes-1-installation.rst)は、Kubernetes Podと非Kubernetes環境間で可視化とセキュリティモニタリングを使用してポリシーベースのネットワークを提供するSDNプラットフォームです。 +* [Romana](https://romana.io)は、[NetworkPolicy API](/docs/concepts/services-networking/network-policies/)もサポートするPodネットワーク向けのL3のネットワークソリューションです。Kubeadmアドオンのインストールの詳細は[こちら](https://github.com/romana/romana/tree/master/containerize)で確認できます。 +* [Weave Net](https://www.weave.works/docs/net/latest/kubernetes/kube-addon/)は、ネットワークパーティションの両面で機能し、外部データベースを必要とせずに、ネットワークとネットワークポリシーを提供します。 -## Service Discovery +## サービスディスカバリ -* [CoreDNS](https://coredns.io) is a flexible, extensible DNS server which can be [installed](https://github.com/coredns/deployment/tree/master/kubernetes) as the in-cluster DNS for pods. +* [CoreDNS](https://coredns.io)は、フレキシブルで拡張可能なDNSサーバーです。Pod向けのクラスター内DNSとして[インストール](https://github.com/coredns/deployment/tree/master/kubernetes)できます。 -## Visualization & Control +## 可視化と制御 -* [Dashboard](https://github.com/kubernetes/dashboard#kubernetes-dashboard) is a dashboard web interface for Kubernetes. -* [Weave Scope](https://www.weave.works/documentation/scope-latest-installing/#k8s) is a tool for graphically visualizing your containers, pods, services etc. Use it in conjunction with a [Weave Cloud account](https://cloud.weave.works/) or host the UI yourself. +* [Dashboard](https://github.com/kubernetes/dashboard#kubernetes-dashboard)はKubernetes向けのダッシュボードを提供するウェブインターフェイスです。 +* [Weave Scope](https://www.weave.works/documentation/scope-latest-installing/#k8s)は、コンテナ、Pod、Serviceなどをグラフィカルに可視化するツールです。[Weave Cloud account](https://cloud.weave.works/)と組み合わせて使うか、UIを自分でホストして使います。 -## Infrastructure +## インフラストラクチャ -* [KubeVirt](https://kubevirt.io/user-guide/#/installation/installation) is an add-on to run virtual machines on Kubernetes. Usually run on bare-metal clusters. +* [KubeVirt](https://kubevirt.io/user-guide/#/installation/installation)は仮想マシンをKubernetes上で実行するためのアドオンです。通常、ベアメタルのクラスタで実行します。 -## Legacy Add-ons +## レガシーなアドオン -There are several other add-ons documented in the deprecated [cluster/addons](https://git.k8s.io/kubernetes/cluster/addons) directory. +いくつかのアドオンは、廃止された[cluster/addons](https://git.k8s.io/kubernetes/cluster/addons)ディレクトリに掲載されています。 -Well-maintained ones should be linked to here. PRs welcome! +よくメンテナンスされたアドオンはここにリンクしてください。PRを歓迎しています。 \ No newline at end of file From 390de57ebf80c2f5f7e39bad8c90beb08979f420 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Sat, 1 May 2021 06:24:13 +0000 Subject: [PATCH 129/221] Copy content/en/docs/concepts/cluster-administration/kubelet-garbage-collection.md for translation --- .../kubelet-garbage-collection.md | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 content/ja/docs/concepts/cluster-administration/kubelet-garbage-collection.md diff --git a/content/ja/docs/concepts/cluster-administration/kubelet-garbage-collection.md b/content/ja/docs/concepts/cluster-administration/kubelet-garbage-collection.md new file mode 100644 index 0000000000..ea51a566ac --- /dev/null +++ b/content/ja/docs/concepts/cluster-administration/kubelet-garbage-collection.md @@ -0,0 +1,86 @@ +--- +reviewers: +title: Garbage collection for container images +content_type: concept +weight: 70 +--- + +<!-- overview --> + +Garbage collection is a helpful function of kubelet that will clean up unused [images](/docs/concepts/containers/#container-images) and unused [containers](/docs/concepts/containers/). Kubelet will perform garbage collection for containers every minute and garbage collection for images every five minutes. + +External garbage collection tools are not recommended as these tools can potentially break the behavior of kubelet by removing containers expected to exist. + + + + +<!-- body --> + +## Image Collection + +Kubernetes manages lifecycle of all images through imageManager, with the cooperation +of cadvisor. + +The policy for garbage collecting images takes two factors into consideration: +`HighThresholdPercent` and `LowThresholdPercent`. Disk usage above the high threshold +will trigger garbage collection. The garbage collection will delete least recently used images until the low +threshold has been met. + +## Container Collection + +The policy for garbage collecting containers considers three user-defined variables. `MinAge` is the minimum age at which a container can be garbage collected. `MaxPerPodContainer` is the maximum number of dead containers every single +pod (UID, container name) pair is allowed to have. `MaxContainers` is the maximum number of total dead containers. These variables can be individually disabled by setting `MinAge` to zero and setting `MaxPerPodContainer` and `MaxContainers` respectively to less than zero. + +Kubelet will act on containers that are unidentified, deleted, or outside of the boundaries set by the previously mentioned flags. The oldest containers will generally be removed first. `MaxPerPodContainer` and `MaxContainer` may potentially conflict with each other in situations where retaining the maximum number of containers per pod (`MaxPerPodContainer`) would go outside the allowable range of global dead containers (`MaxContainers`). `MaxPerPodContainer` would be adjusted in this situation: A worst case scenario would be to downgrade `MaxPerPodContainer` to 1 and evict the oldest containers. Additionally, containers owned by pods that have been deleted are removed once they are older than `MinAge`. + +Containers that are not managed by kubelet are not subject to container garbage collection. + +## User Configuration + +You can adjust the following thresholds to tune image garbage collection with the following kubelet flags : + +1. `image-gc-high-threshold`, the percent of disk usage which triggers image garbage collection. +Default is 85%. +2. `image-gc-low-threshold`, the percent of disk usage to which image garbage collection attempts +to free. Default is 80%. + +You can customize the garbage collection policy through the following kubelet flags: + +1. `minimum-container-ttl-duration`, minimum age for a finished container before it is +garbage collected. Default is 0 minute, which means every finished container will be garbage collected. +2. `maximum-dead-containers-per-container`, maximum number of old instances to be retained +per container. Default is 1. +3. `maximum-dead-containers`, maximum number of old instances of containers to retain globally. +Default is -1, which means there is no global limit. + +Containers can potentially be garbage collected before their usefulness has expired. These containers +can contain logs and other data that can be useful for troubleshooting. A sufficiently large value for +`maximum-dead-containers-per-container` is highly recommended to allow at least 1 dead container to be +retained per expected container. A larger value for `maximum-dead-containers` is also recommended for a +similar reason. +See [this issue](https://github.com/kubernetes/kubernetes/issues/13287) for more details. + + +## Deprecation + +Some kubelet Garbage Collection features in this doc will be replaced by kubelet eviction in the future. + +Including: + +| Existing Flag | New Flag | Rationale | +| ------------- | -------- | --------- | +| `--image-gc-high-threshold` | `--eviction-hard` or `--eviction-soft` | existing eviction signals can trigger image garbage collection | +| `--image-gc-low-threshold` | `--eviction-minimum-reclaim` | eviction reclaims achieve the same behavior | +| `--maximum-dead-containers` | | deprecated once old logs are stored outside of container's context | +| `--maximum-dead-containers-per-container` | | deprecated once old logs are stored outside of container's context | +| `--minimum-container-ttl-duration` | | deprecated once old logs are stored outside of container's context | +| `--low-diskspace-threshold-mb` | `--eviction-hard` or `eviction-soft` | eviction generalizes disk thresholds to other resources | +| `--outofdisk-transition-frequency` | `--eviction-pressure-transition-period` | eviction generalizes disk pressure transition to other resources | + + + +## {{% heading "whatsnext" %}} + + +See [Configuring Out Of Resource Handling](/docs/tasks/administer-cluster/out-of-resource/) for more details. + From e654c368a7a2a82934bf4707d28a586fea441ce1 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Sat, 1 May 2021 07:57:30 +0000 Subject: [PATCH 130/221] Translate concepts/cluster-administration/kubelet-garbage-collection into Japanese --- .../kubelet-garbage-collection.md | 83 +++++++------------ 1 file changed, 32 insertions(+), 51 deletions(-) diff --git a/content/ja/docs/concepts/cluster-administration/kubelet-garbage-collection.md b/content/ja/docs/concepts/cluster-administration/kubelet-garbage-collection.md index ea51a566ac..ffa08d63bd 100644 --- a/content/ja/docs/concepts/cluster-administration/kubelet-garbage-collection.md +++ b/content/ja/docs/concepts/cluster-administration/kubelet-garbage-collection.md @@ -1,86 +1,67 @@ --- -reviewers: -title: Garbage collection for container images +title: コンテナイメージのガベージコレクション content_type: concept weight: 70 --- <!-- overview --> -Garbage collection is a helpful function of kubelet that will clean up unused [images](/docs/concepts/containers/#container-images) and unused [containers](/docs/concepts/containers/). Kubelet will perform garbage collection for containers every minute and garbage collection for images every five minutes. - -External garbage collection tools are not recommended as these tools can potentially break the behavior of kubelet by removing containers expected to exist. - - +ガベージコレクションは、未使用の[イメージ](/ja/docs/concepts/containers/#container-images)と未使用の[コンテナ](/ja/docs/concepts/containers/)をクリーンアップするkubeletの便利な機能です。kubeletコンテナのガベージコレクションを1分ごとに行い、イメージのガベージコレクションは5分ごとに行います。 +存在することが期待されているコンテナを削除してkubeletの動作を壊す可能性があるため、外部のガベージコレクションのツールは推奨されません。 <!-- body --> -## Image Collection +## イメージのガベージコレクション -Kubernetes manages lifecycle of all images through imageManager, with the cooperation -of cadvisor. +Kubernetesでは、すべてのイメージのライフサイクルの管理はcadvisorと協調してimageManager経由で行います。 -The policy for garbage collecting images takes two factors into consideration: -`HighThresholdPercent` and `LowThresholdPercent`. Disk usage above the high threshold -will trigger garbage collection. The garbage collection will delete least recently used images until the low -threshold has been met. +イメージのガベージコレクションのポリシーについて考えるときは、`HighThresholdPercent`および`LowThresholdPercent`という2つの要因について考慮する必要があります。ディスク使用量がhigh thresholdを超えると、ガベージコレクションがトリガされます。ガベージコレクションは、low +thresholdが満たされるまで、最後に使われてから最も時間が経った(least recently used)イメージを削除します。 -## Container Collection +## コンテナのガベージコレクション -The policy for garbage collecting containers considers three user-defined variables. `MinAge` is the minimum age at which a container can be garbage collected. `MaxPerPodContainer` is the maximum number of dead containers every single -pod (UID, container name) pair is allowed to have. `MaxContainers` is the maximum number of total dead containers. These variables can be individually disabled by setting `MinAge` to zero and setting `MaxPerPodContainer` and `MaxContainers` respectively to less than zero. +コンテナのガベージコレクションのポリシーは、3つのユーザー定義の変数を考慮に入れます。`MinAge`は、ガベージコレクションできるコンテナの最小の年齢です。`MaxPerPodContainer`は、すべての単一のPod(UID、コンテナ名)が保持することを許されているdead状態のコンテナの最大値です。`MaxContainers`はdead状態のコンテナの合計の最大値です。これらの変数は、`MinAge`は0に、`MaxPerPodContainer`と`MaxContainers`は0未満にそれぞれ設定することで個別に無効にできます。 -Kubelet will act on containers that are unidentified, deleted, or outside of the boundaries set by the previously mentioned flags. The oldest containers will generally be removed first. `MaxPerPodContainer` and `MaxContainer` may potentially conflict with each other in situations where retaining the maximum number of containers per pod (`MaxPerPodContainer`) would go outside the allowable range of global dead containers (`MaxContainers`). `MaxPerPodContainer` would be adjusted in this situation: A worst case scenario would be to downgrade `MaxPerPodContainer` to 1 and evict the oldest containers. Additionally, containers owned by pods that have been deleted are removed once they are older than `MinAge`. +kubeletは、未指定のコンテナ、削除されたコンテナ、前述のフラグにより設定された境界の外にあるコンテナに対して動作します。一般に、最も古いコンテナが最初に削除されます。`MaxPerPodContainer`と`MaxContainer`は、Podごとの保持するコンテナの最大値(`MaxPerPodContainer`)がグローバルのdead状態のコンテナの許容範囲(`MaxContainers`)外である場合には、互いに競合する可能性があります。このような状況では、`MaxPerPodContainer`が調整されます。最悪のケースのシナリオでは、`MaxPerPodContainer`が1にダウングレードされ、最も古いコンテナが強制退去されます。さらに、`MinAge`より古くなると、削除済みのPodが所有するコンテナが削除されます。 -Containers that are not managed by kubelet are not subject to container garbage collection. +kubeletによって管理されないコンテナは、コンテナのガベージコレクションの対象にはなりません。 -## User Configuration +## ユーザー設定 -You can adjust the following thresholds to tune image garbage collection with the following kubelet flags : +イメージのガベージコレクションを調整するために、以下のkubeletのフラグを使用して次のようなしきい値を調整できます。 -1. `image-gc-high-threshold`, the percent of disk usage which triggers image garbage collection. -Default is 85%. -2. `image-gc-low-threshold`, the percent of disk usage to which image garbage collection attempts -to free. Default is 80%. +1. `image-gc-high-threshold`: イメージのガベージコレクションをトリガするディスク使用量の割合(%)。デフォルトは85%。 +2. `image-gc-low-threshold`: イメージのガベージコレクションが解放を試みるディスク使用量の割合(%)。デフォルトは80%。 -You can customize the garbage collection policy through the following kubelet flags: +ガベージコレクションのポリシーは、以下のkubeletのフラグを使用してカスタマイズできます。 -1. `minimum-container-ttl-duration`, minimum age for a finished container before it is -garbage collected. Default is 0 minute, which means every finished container will be garbage collected. -2. `maximum-dead-containers-per-container`, maximum number of old instances to be retained -per container. Default is 1. -3. `maximum-dead-containers`, maximum number of old instances of containers to retain globally. -Default is -1, which means there is no global limit. +1. `minimum-container-ttl-duration`: 完了したコンテナがガベージコレクションされる前に経過するべき最小期間。デフォルトは0分です。つまり、すべての完了したコンテナはガベージコレクションされます。 +2. `maximum-dead-containers-per-container`: コンテナごとに保持される古いインスタンスの最大値です。デフォルトは1です。 +3. `maximum-dead-containers`: グローバルに保持するべき古いコンテナのインスタンスの最大値です。デフォルトは-1です。つまり、グローバルなリミットは存在しません。 -Containers can potentially be garbage collected before their usefulness has expired. These containers -can contain logs and other data that can be useful for troubleshooting. A sufficiently large value for -`maximum-dead-containers-per-container` is highly recommended to allow at least 1 dead container to be -retained per expected container. A larger value for `maximum-dead-containers` is also recommended for a -similar reason. -See [this issue](https://github.com/kubernetes/kubernetes/issues/13287) for more details. +コンテナは役に立たなくなる前にガベージコレクションされる可能性があります。こうしたコンテナには、トラブルシューティングに役立つログや他のデータが含まれるかもしれません。そのため、期待されるコンテナごとに最低でも1つのdead状態のコンテナが許容されるようにするために、`maximum-dead-containers-per-container`には十分大きな値を設定することが強く推奨されます。同様の理由で、`maximum-dead-containers`にも、より大きな値を設定することが推奨されます。詳しくは、[こちらのissue](https://github.com/kubernetes/kubernetes/issues/13287)を読んでください。 +## 廃止 -## Deprecation +このドキュメントにあるkubeletの一部のガベージコレクションの機能は、将来kubelet evictionで置換される予定です。 -Some kubelet Garbage Collection features in this doc will be replaced by kubelet eviction in the future. +これには以下のものが含まれます。 -Including: - -| Existing Flag | New Flag | Rationale | +| 既存のフラグ | 新しいフラグ | 理由 | | ------------- | -------- | --------- | -| `--image-gc-high-threshold` | `--eviction-hard` or `--eviction-soft` | existing eviction signals can trigger image garbage collection | -| `--image-gc-low-threshold` | `--eviction-minimum-reclaim` | eviction reclaims achieve the same behavior | -| `--maximum-dead-containers` | | deprecated once old logs are stored outside of container's context | -| `--maximum-dead-containers-per-container` | | deprecated once old logs are stored outside of container's context | -| `--minimum-container-ttl-duration` | | deprecated once old logs are stored outside of container's context | -| `--low-diskspace-threshold-mb` | `--eviction-hard` or `eviction-soft` | eviction generalizes disk thresholds to other resources | -| `--outofdisk-transition-frequency` | `--eviction-pressure-transition-period` | eviction generalizes disk pressure transition to other resources | +| `--image-gc-high-threshold` | `--eviction-hard`または`--eviction-soft` | 既存のevictionのシグナルがイメージのガベージコレクションをトリガする可能性がある | +| `--image-gc-low-threshold` | `--eviction-minimum-reclaim` | eviction reclaimが同等の動作を実現する | +| `--maximum-dead-containers` | | 古いログがコンテナのコンテキストの外部に保存されるようになったら廃止 | +| `--maximum-dead-containers-per-container` | | 古いログがコンテナのコンテキストの外部に保存されるようになったら廃止 | +| `--minimum-container-ttl-duration` | | 古いログがコンテナのコンテキストの外部に保存されるようになったら廃止 | +| `--low-diskspace-threshold-mb` | `--eviction-hard` or `eviction-soft` | evictionはディスクのしきい値を他のリソースに一般化している | +| `--outofdisk-transition-frequency` | `--eviction-pressure-transition-period` | evictionはディスクのpressure transitionを他のリソースに一般化している | ## {{% heading "whatsnext" %}} -See [Configuring Out Of Resource Handling](/docs/tasks/administer-cluster/out-of-resource/) for more details. +詳細については、[リソース不足のハンドリング方法を設定する](/docs/tasks/administer-cluster/out-of-resource/)を参照してください。 From 919cafa2c0c7868bb810379711dc38f92904b25d Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Sat, 1 May 2021 08:00:27 +0000 Subject: [PATCH 131/221] Add an anchor link to concepts/containers/_index.md --- content/ja/docs/concepts/containers/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/containers/_index.md b/content/ja/docs/concepts/containers/_index.md index fd3506ea40..cb2b457e57 100755 --- a/content/ja/docs/concepts/containers/_index.md +++ b/content/ja/docs/concepts/containers/_index.md @@ -18,7 +18,7 @@ no_list: true <!-- body --> -## コンテナイメージ +## コンテナイメージ {#container-images} [コンテナイメージ](/docs/concepts/containers/images/)はすぐに実行可能なソフトウェアパッケージで、アプリケーションの実行に必要なものをすべて含んています。コードと必要なランタイム、アプリケーションとシステムのライブラリ、そして必須な設定項目のデフォルト値を含みます。 設計上、コンテナは不変で、既に実行中のコンテナのコードを変更することはできません。コンテナ化されたアプリケーションがあり変更したい場合は、変更を含んだ新しいイメージをビルドし、コンテナを再作成して、更新されたイメージから起動する必要があります。 From 4201120ebd8f4652563d8ca549b9e2b1492aad23 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Sat, 1 May 2021 09:01:48 +0000 Subject: [PATCH 132/221] Copy content/en/docs/concepts/cluster-administration/system-logs.md for translation --- .../cluster-administration/system-logs.md | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 content/ja/docs/concepts/cluster-administration/system-logs.md diff --git a/content/ja/docs/concepts/cluster-administration/system-logs.md b/content/ja/docs/concepts/cluster-administration/system-logs.md new file mode 100644 index 0000000000..0466837356 --- /dev/null +++ b/content/ja/docs/concepts/cluster-administration/system-logs.md @@ -0,0 +1,142 @@ +--- +reviewers: +- dims +- 44past4 +title: System Logs +content_type: concept +weight: 60 +--- + +<!-- overview --> + +System component logs record events happening in cluster, which can be very useful for debugging. +You can configure log verbosity to see more or less detail. +Logs can be as coarse-grained as showing errors within a component, or as fine-grained as showing step-by-step traces of events (like HTTP access logs, pod state changes, controller actions, or scheduler decisions). + +<!-- body --> + +## Klog + +klog is the Kubernetes logging library. [klog](https://github.com/kubernetes/klog) +generates log messages for the Kubernetes system components. + +For more information about klog configuration, see the [Command line tool reference](/docs/reference/command-line-tools-reference/). + +An example of the klog native format: +``` +I1025 00:15:15.525108 1 httplog.go:79] GET /api/v1/namespaces/kube-system/pods/metrics-server-v0.3.1-57c75779f-9p8wg: (1.512ms) 200 [pod_nanny/v0.0.0 (linux/amd64) kubernetes/$Format 10.56.1.19:51756] +``` + +### Structured Logging + +{{< feature-state for_k8s_version="v1.19" state="alpha" >}} + +{{< warning >}} +Migration to structured log messages is an ongoing process. Not all log messages are structured in this version. When parsing log files, you must also handle unstructured log messages. + +Log formatting and value serialization are subject to change. +{{< /warning>}} + +Structured logging introduces a uniform structure in log messages allowing for programmatic extraction of information. You can store and process structured logs with less effort and cost. +New message format is backward compatible and enabled by default. + +Format of structured logs: + +```ini +<klog header> "<message>" <key1>="<value1>" <key2>="<value2>" ... +``` + +Example: + +```ini +I1025 00:15:15.525108 1 controller_utils.go:116] "Pod status updated" pod="kube-system/kubedns" status="ready" +``` + + +### JSON log format + +{{< feature-state for_k8s_version="v1.19" state="alpha" >}} + +{{<warning >}} +JSON output does not support many standard klog flags. For list of unsupported klog flags, see the [Command line tool reference](/docs/reference/command-line-tools-reference/). + +Not all logs are guaranteed to be written in JSON format (for example, during process start). If you intend to parse logs, make sure you can handle log lines that are not JSON as well. + +Field names and JSON serialization are subject to change. +{{< /warning >}} + +The `--logging-format=json` flag changes the format of logs from klog native format to JSON format. +Example of JSON log format (pretty printed): +```json +{ + "ts": 1580306777.04728, + "v": 4, + "msg": "Pod status updated", + "pod":{ + "name": "nginx-1", + "namespace": "default" + }, + "status": "ready" +} +``` + +Keys with special meaning: +* `ts` - timestamp as Unix time (required, float) +* `v` - verbosity (required, int, default 0) +* `err` - error string (optional, string) +* `msg` - message (required, string) + + +List of components currently supporting JSON format: +* {{< glossary_tooltip term_id="kube-controller-manager" text="kube-controller-manager" >}} +* {{< 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" >}} + +### Log sanitization + +{{< feature-state for_k8s_version="v1.20" state="alpha" >}} + +{{<warning >}} +Log sanitization might incur significant computation overhead and therefore should not be enabled in production. +{{< /warning >}} + +The `--experimental-logging-sanitization` flag enables the klog sanitization filter. +If enabled all log arguments are inspected for fields tagged as sensitive data (e.g. passwords, keys, tokens) and logging of these fields will be prevented. + +List of components currently supporting log sanitization: +* kube-controller-manager +* kube-apiserver +* kube-scheduler +* kubelet + +{{< note >}} +The Log sanitization filter does not prevent user workload logs from leaking sensitive data. +{{< /note >}} + +### Log verbosity level + +The `-v` flag controls log verbosity. Increasing the value increases the number of logged events. Decreasing the value decreases the number of logged events. +Increasing verbosity settings logs increasingly less severe events. A verbosity setting of 0 logs only critical events. + +### Log location + +There are two types of system components: those that run in a container and those +that do not run in a container. For example: + +* The Kubernetes scheduler and kube-proxy run in a container. +* The kubelet and container runtime, for example Docker, do not run in containers. + +On machines with systemd, the kubelet and container runtime write to journald. +Otherwise, they write to `.log` files in the `/var/log` directory. +System components inside containers always write to `.log` files in the `/var/log` directory, +bypassing the default logging mechanism. +Similar to the container logs, you should rotate system component logs in the `/var/log` directory. +In Kubernetes clusters created by the `kube-up.sh` script, log rotation is configured by the `logrotate` tool. +The `logrotate` tool rotates logs daily, or once the log size is greater than 100MB. + +## {{% heading "whatsnext" %}} + +* Read about the [Kubernetes Logging Architecture](/docs/concepts/cluster-administration/logging/) +* Read about [Structured Logging](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/1602-structured-logging) +* Read about the [Conventions for logging severity](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/logging.md) From 7f0557afd6a3fb495beb615c5eb6aa92c79d0179 Mon Sep 17 00:00:00 2001 From: Qiming Teng <tengqm@outlook.com> Date: Sat, 1 May 2021 22:07:01 +0800 Subject: [PATCH 133/221] [zh] Resync reference for kube-apiserver --- .../kube-apiserver.md | 1004 +++++++---------- 1 file changed, 425 insertions(+), 579 deletions(-) diff --git a/content/zh/docs/reference/command-line-tools-reference/kube-apiserver.md b/content/zh/docs/reference/command-line-tools-reference/kube-apiserver.md index 24c8fe683e..ac4d11b631 100644 --- a/content/zh/docs/reference/command-line-tools-reference/kube-apiserver.md +++ b/content/zh/docs/reference/command-line-tools-reference/kube-apiserver.md @@ -2,10 +2,23 @@ title: kube-apiserver content_type: tool-reference weight: 30 +auto_generated: true --- +<!-- +The file is auto-generated from the Go source code of the component using a generic +[generator](https://github.com/kubernetes-sigs/reference-docs/). To learn how +to generate the reference documentation, please read +[Contributing to the reference documentation](/docs/contribute/generate-ref-docs/). +To update the reference conent, please follow the +[Contributing upstream](/docs/contribute/generate-ref-docs/contribute-upstream/) +guide. You can file document formatting bugs against the +[reference-docs](https://github.com/kubernetes-sigs/reference-docs/) project. +--> + ## {{% heading "synopsis" %}} + <!-- The Kubernetes API server validates and configures data for the api objects which include pods, services, replicationcontrollers, and @@ -38,7 +51,7 @@ kube-apiserver [flags] <!-- If true, adds the file directory to the header of the log messages --> -如果为 true,则将文件目录添加到日志消息的标题中 +<p>如果为 true,则将文件目录添加到日志消息的标题中</p> </td> </tr> @@ -50,12 +63,12 @@ If true, adds the file directory to the header of the log messages <!-- File with admission control configuration. --> -包含准入控制配置的文件。 +<p>包含准入控制配置的文件。</p> </td> </tr> <tr> -<td colspan="2">--advertise-address ip</td> +<td colspan="2">--advertise-address string</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -65,13 +78,29 @@ This address must be reachable by the rest of the cluster. If blank, the --bind-address will be used. If --bind-address is unspecified, the host's default interface will be used. --> +<p> 向集群成员通知 apiserver 消息的 IP 地址。 这个地址必须能够被集群中其他成员访问。 如果 IP 地址为空,将会使用 --bind-address, 如果未指定 --bind-address,将会使用主机的默认接口地址。 +</p> </td> </tr> +<tr> +<td colspan="2">--allow-metric-labels stringToString     <!--Default:-->默认值:[]</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p> +<!-- +The map from metric-label to value allow-list of this label. The key's format is <MetricName>,<LabelName>. The value's format is <allowed_value>,<allowed_value>...e.g. metric1,label1='v1,v2,v3', metric1,label2='v1,v2,v3' metric2,label1='v1,v2,v3'. +--> +允许使用的指标标签到指标值的映射列表。键的格式为 <MetricName>,<LabelName>. +值得格式为 <allowed_value>,<allowed_value>...。 例如:<code>metric1,label1='v1,v2,v3', metric1,label2='v1,v2,v3' metric2,label1='v1,v2,v3'</code>。 +</p></td> +</tr> + + <tr> <td colspan="2">--allow-privileged</td> </tr> @@ -97,12 +126,7 @@ log to standard error as well as files </tr> <tr> -<td colspan="2"> -<!-- ---anonymous-auth     Default: true ---> ---anonymous-auth     默认值:true -</td> +<td colspan="2">--anonymous-auth     <!--Default:-->默认值:true</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -112,15 +136,15 @@ Requests that are not rejected by another authentication method are treated as anonymous requests. Anonymous requests have a username of system:anonymous, and a group name of system:unauthenticated. --> -启用到 API server 的安全端口的匿名请求。 +启用到 API 服务器的安全端口的匿名请求。 未被其他认证方法拒绝的请求被当做匿名请求。 -匿名请求的用户名为 system:anonymous, -用户组名为 system:unauthenticated。 +匿名请求的用户名为 <code>system:anonymous</code>, +用户组名为 </code>system:unauthenticated</code>。 </td> </tr> <tr> -<td colspan="2">--api-audiences stringSlice</td> +<td colspan="2">--api-audiences strings</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -133,18 +157,13 @@ containing the issuer URL. --> API 的标识符。 服务帐户令牌验证者将验证针对 API 使用的令牌是否已绑定到这些受众中的至少一个。 -如果配置了 --service-account-issuer 标志,但未配置此标志, -则此字段默认为包含发行者 URL 的单个元素列表。 +如果配置了 <code>--service-account-issuer</code> 标志,但未配置此标志, +则此字段默认为包含发布者 URL 的单个元素列表。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---apiserver-count int     Default: 1 ---> ---apiserver-count int     默认值:1 -</td> +<td colspan="2">--apiserver-count int     <!--Default:-->默认值:1</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -152,18 +171,13 @@ API 的标识符。 The number of apiservers running in the cluster, must be a positive number. (In use when --endpoint-reconciler-type=master-count is enabled.) --> -集群中运行的 apiserver 数量,必须为正数。 +集群中运行的 API 服务器数量,必须为正数。 (在启用 --endpoint-reconciler-type=master-count 时使用。) </td> </tr> <tr> -<td colspan="2"> -<!-- ---audit-log-batch-buffer-size int     Default: 10000 ---> ---audit-log-batch-buffer-size int     默认值:10000 -</td> +<td colspan="2">--audit-log-batch-buffer-size int     <!--Default:-->默认值:10000</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -176,18 +190,13 @@ The size of the buffer to store events before batching and writing. Only used in </tr> <tr> -<td colspan="2"> -<!-- ---audit-log-batch-max-size int     Default: 1 ---> ---audit-log-batch-max-size int     默认值:1 -</td> +<td colspan="2">--audit-log-batch-max-size int     <!--Default:-->默认值:1</td> </tr><tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- The maximum size of a batch. Only used in batch mode. --> -批处理的最大大小。 仅在批处理模式下使用。 +每个批次的最大大小。仅在批处理模式下使用。 </td> </tr> @@ -200,7 +209,7 @@ The maximum size of a batch. Only used in batch mode. The amount of time to wait before force writing the batch that hadn't reached the max size. Only used in batch mode. --> -强制写入尚未达到最大大小的批处理之前要等待的时间。 +强制写入尚未达到最大大小的批次之前要等待的时间。 仅在批处理模式下使用。 </td> </tr> @@ -214,7 +223,7 @@ Only used in batch mode. Maximum number of requests sent at the same moment if ThrottleQPS was not utilized before. Only used in batch mode. --> -如果之前未使用 ThrottleQPS,则同时发送的最大请求数。 +如果之前未使用 ThrottleQPS,则为同时发送的最大请求数。 仅在批处理模式下使用。 </td> </tr> @@ -227,21 +236,19 @@ Only used in batch mode. <!-- Whether batching throttling is enabled. Only used in batch mode. --> -是否启用了批量限制。 -仅在批处理模式下使用。 +是否启用了批量限制。仅在批处理模式下使用。 </td> </tr> <tr> -<td colspan="2">--audit-log-batch-throttle-qps float32</td> +<td colspan="2">--audit-log-batch-throttle-qps float</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- Maximum average number of batches per second. Only used in batch mode. --> -每秒的最大平均批处理数。 -仅在批处理模式下使用。 +每秒的最大平均批次数。仅在批处理模式下使用。 </td> </tr> @@ -253,18 +260,13 @@ Maximum average number of batches per second. Only used in batch mode. <!-- If set, the rotated log files will be compressed using gzip. --> -若设置了此标志,则轮换的日志文件会使用 gzip 压缩。 +若设置了此标志,则被轮换的日志文件会使用 gzip 压缩。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---audit-log-format string     Default: "json" ---> ---audit-log-format string     默认值:"json" -</td> +<td colspan="2">--audit-log-format string     <!--Default:-->默认值:"json" </td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -298,7 +300,7 @@ The maximum number of days to retain old audit log files based on the timestamp <!-- The maximum number of old audit log files to retain. --> -保留的旧审计日志文件的最大数量。 +要保留的旧的审计日志文件个数上限。 </td> </tr> @@ -315,12 +317,7 @@ The maximum size in megabytes of the audit log file before it gets rotated. </tr> <tr> -<td colspan="2"> -<!-- ---audit-log-mode string     Default: "blocking" ---> ---audit-log-mode string     默认值:"blocking" -</td> +<td colspan="2">--audit-log-mode string     <!--Default:-->默认值:"blocking"</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -329,9 +326,9 @@ Strategy for sending audit events. Blocking indicates sending events should bloc Batch causes the backend to buffer and write events asynchronously. Known modes are batch,blocking,blocking-strict. --> -发送审计事件的策略。 +用来发送审计事件的策略。 阻塞(blocking)表示发送事件应阻止服务器响应。 -批处理导致后端异步缓冲和写入事件。 +批处理(batch)会导致后端异步缓冲和写入事件。 已知的模式是批处理(batch),阻塞(blocking),严格阻塞(blocking-strict)。 </td> </tr> @@ -345,7 +342,7 @@ Known modes are batch,blocking,blocking-strict. If set, all requests coming to the apiserver will be logged to this file. '-' means standard out. --> -如果设置,则所有到达 apiserver 的请求都将记录到该文件中。 +如果设置,则所有到达 API 服务器的请求都将记录到该文件中。 "-" 表示标准输出。 </td> </tr> @@ -363,12 +360,7 @@ Whether event and batch truncating is enabled. </tr> <tr> -<td colspan="2"> -<!-- ---audit-log-truncate-max-batch-size int     Default: 10485760 ---> ---audit-log-truncate-max-batch-size int     默认值:10485760 -</td> +<td colspan="2">--audit-log-truncate-max-batch-size int     <!--Default:-->默认值:10485760</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -377,19 +369,14 @@ Maximum size of the batch sent to the underlying backend. Actual serialized size several hundreds of bytes greater. If a batch exceeds this limit, it is split into several batches of smaller size. --> -发送到下层后端的批次的最大数据量。 +发送到下层后端的每批次的最大数据量。 实际的序列化大小可能会增加数百个字节。 如果一个批次超出此限制,则将其分成几个较小的批次。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---audit-log-truncate-max-event-size int     Default: 102400 ---> ---audit-log-truncate-max-event-size int     默认值:102400 -</td> +<td colspan="2">--audit-log-truncate-max-event-size int     <!--Default:-->默认值:102400</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -398,26 +385,21 @@ Maximum size of the audit event sent to the underlying backend. If the size of a is greater than this number, first request and response are removed, and if this doesn't reduce the size enough, event is discarded. --> -发送到下层后端的批次的最大数据量。 -如果事件的大小大于此数字,则将删除第一个请求和响应, -并且没有减小足够大的程度,则将丢弃事件。 +发送到下层后端的每批次的最大数据量。 +如果事件的大小大于此数字,则将删除第一个请求和响应; +如果这样做没有减小足够大的程度,则将丢弃事件。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---audit-log-version string     Default: "audit.k8s.io/v1" ---> ---audit-log-version string     默认值:"audit.k8s.io/v1" -</td> +<td colspan="2">--audit-log-version string     <!--Default:-->默认值:"audit.k8s.io/v1"</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- API group and version used for serializing audit events written to log. --> -用于序列化写入日志的审计事件的 API 组和版本。 +用于对写入日志的审计事件执行序列化的 API 组和版本。 </td> </tr> @@ -434,12 +416,7 @@ Path to the file that defines the audit policy configuration. </tr> <tr> -<td colspan="2"> -<!-- ---audit-webhook-batch-buffer-size int     Default: 10000 ---> ---audit-webhook-batch-buffer-size int     默认值:10000 -</td> +<td colspan="2">--audit-webhook-batch-buffer-size int     <!--Default:-->默认值:10000</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -452,12 +429,7 @@ The size of the buffer to store events before batching and writing. Only used in </tr> <tr> -<td colspan="2"> -<!-- ---audit-webhook-batch-max-size int     Default: 400 ---> ---audit-webhook-batch-max-size int     默认值:400 -</td> +<td colspan="2">--audit-webhook-batch-max-size int     <!--Default:-->默认值:400</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -470,12 +442,7 @@ The maximum size of a batch. Only used in batch mode. </tr> <tr> -<td colspan="2"> -<!-- ---audit-webhook-batch-max-wait duration     Default: 30s ---> ---audit-webhook-batch-max-wait duration     默认值:30s -</td> +<td colspan="2">--audit-webhook-batch-max-wait duration     <!--Default:-->默认值:30s</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -489,12 +456,7 @@ Only used in batch mode. </tr> <tr> -<td colspan="2"> -<!-- ---audit-webhook-batch-throttle-burst int     Default: 15 ---> ---audit-webhook-batch-throttle-burst int     默认值:15 -</td> +<td colspan="2">--audit-webhook-batch-throttle-burst int     <!--Default:-->默认值:15</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -502,44 +464,32 @@ Only used in batch mode. Maximum number of requests sent at the same moment if ThrottleQPS was not utilized before. Only used in batch mode. --> -如果之前未使用 ThrottleQPS,则同时发送的最大请求数。 +如果之前未使用 ThrottleQPS,同时发送的最大请求数。 仅在批处理模式下使用。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---audit-webhook-batch-throttle-enable     Default: true ---> ---audit-webhook-batch-throttle-enable     默认值:true -</td> +<td colspan="2">--audit-webhook-batch-throttle-enable     <!--Default:-->默认值:true</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- Whether batching throttling is enabled. Only used in batch mode. --> -是否启用了批量限制。 -仅在批处理模式下使用。 +是否启用了批量限制。仅在批处理模式下使用。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---audit-webhook-batch-throttle-qps float32     Default: 10 ---> ---audit-webhook-batch-throttle-qps float32     默认值:10 -</td> +<td colspan="2">--audit-webhook-batch-throttle-qps float32     <!--Default:-->默认值:10</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- Maximum average number of batches per second. Only used in batch mode. --> -每秒的最大平均批次数。 -仅在批处理模式下使用。 +每秒的最大平均批次数。仅在批处理模式下使用。 </td> </tr> @@ -555,12 +505,7 @@ Path to a kubeconfig formatted file that defines the audit webhook configuration </tr> <tr> -<td colspan="2"> -<!-- ---audit-webhook-initial-backoff duration     Default: 10s ---> ---audit-webhook-initial-backoff duration     默认值:10s -</td> +<td colspan="2">--audit-webhook-initial-backoff duration     <!--Default:-->默认值:10s</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -572,12 +517,7 @@ The amount of time to wait before retrying the first failed request. </tr> <tr> -<td colspan="2"> -<!-- ---audit-webhook-mode string     Default: "batch" ---> ---audit-webhook-mode string     默认值:"batch" -</td> +<td colspan="2">--audit-webhook-mode string     <!--Default:-->默认值:"batch"</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -587,7 +527,7 @@ Batch causes the backend to buffer and write events asynchronously. Known modes --> 发送审计事件的策略。 阻止(Blocking)表示发送事件应阻止服务器响应。 -批处理导致后端异步缓冲和写入事件。 +批处理(Batch)导致后端异步缓冲和写入事件。 已知的模式是批处理(batch),阻塞(blocking),严格阻塞(blocking-strict)。 </td> </tr> @@ -605,12 +545,7 @@ Whether event and batch truncating is enabled. </tr> <tr> -<td colspan="2"> -<!-- ---audit-webhook-truncate-max-batch-size int     Default: 10485760 ---> ---audit-webhook-truncate-max-batch-size int     默认值:10485760 -</td> +<td colspan="2">--audit-webhook-truncate-max-batch-size int     <!--Default:-->默认值:10485760</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -626,12 +561,7 @@ several batches of smaller size. </tr> <tr> -<td colspan="2"> -<!-- ---audit-webhook-truncate-max-event-size int     Default: 102400 ---> ---audit-webhook-truncate-max-event-size int     默认值:102400 -</td> +<td colspan="2">--audit-webhook-truncate-max-event-size int     <!--Default:-->默认值:102400</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -641,17 +571,13 @@ is greater than this number, first request and response are removed, and if this reduce the size enough, event is discarded. --> 发送到下层后端的批次的最大数据量。 -如果事件的大小大于此数字,则将删除第一个请求和响应, -并且如果事件和事件的大小没有足够减小,则将丢弃事件。 +如果事件的大小大于此数字,则将删除第一个请求和响应; +如果事件和事件的大小没有减小到一定幅度,则将丢弃事件。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---audit-webhook-version string     Default: "audit.k8s.io/v1" ---> ---audit-webhook-version string     默认值:"audit.k8s.io/v1" +<td colspan="2">--audit-webhook-version string     <!--Default:-->默认值:"audit.k8s.io/v1" </td> </tr> <tr> @@ -664,19 +590,14 @@ API group and version used for serializing audit events written to webhook. </tr> <tr> -<td colspan="2"> -<!-- ---authentication-token-webhook-cache-ttl duration     Default: 2m0s ---> ---authentication-token-webhook-cache-ttl duration     默认值:2m0s -</td> +<td colspan="2">--authentication-token-webhook-cache-ttl duration     <!--Default:-->2m0s</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- The duration to cache responses from the webhook token authenticator. --> -来自 Webhook 令牌身份验证器的缓存响应的持续时间。 +对来自 Webhook 令牌身份验证器的响应的缓存时间。 </td> </tr> @@ -689,17 +610,13 @@ The duration to cache responses from the webhook token authenticator. File with webhook configuration for token authentication in kubeconfig format. The API server will query the remote service to determine authentication for bearer tokens. --> -包含 Webhook 配置的文件,用于以 kubeconfig 格式进行令牌认证。 +包含 Webhook 配置的 kubeconfig 格式文件,用于进行令牌认证。 API 服务器将查询远程服务,以对持有者令牌进行身份验证。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---authentication-token-webhook-version string     Default: "v1beta1" ---> ---authentication-token-webhook-version string     默认值:"v1beta1" +<td colspan="2">--authentication-token-webhook-version string     <!--Default:-->默认值:"v1beta1" </td> </tr> <tr> @@ -712,12 +629,7 @@ The API version of the authentication.k8s.io TokenReview to send to and expect f </tr> <tr> -<td colspan="2"> -<!-- ---authorization-mode stringSlice     Default: [AlwaysAllow] ---> ---authorization-mode stringSlice     默认值:[AlwaysAllow] -</td> +<td colspan="2">--authorization-mode stringSlice     <!--Default:-->默认值:"AlwaysAllow"</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -726,7 +638,7 @@ Ordered list of plug-ins to do authorization on secure port. Comma-delimited lis AlwaysAllow,AlwaysDeny,ABAC,Webhook,RBAC,Node. --> 在安全端口上进行鉴权的插件的顺序列表。 -逗号分隔的列表:AlwaysAllow,AlwaysDeny,ABAC,Webhook,RBAC,Node。 +逗号分隔的列表:AlwaysAllow、AlwaysDeny、ABAC、Webhook、RBAC、Node。 </td> </tr> @@ -739,42 +651,32 @@ AlwaysAllow,AlwaysDeny,ABAC,Webhook,RBAC,Node. File with authorization policy in json line by line format, used with --authorization-mode=ABAC, on the secure port. --> -包含安全策略的文件,其内容为分行 JSON 格式, +包含鉴权策略的文件,其内容为分行 JSON 格式, 在安全端口上与 --authorization-mode=ABAC 一起使用。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---authorization-webhook-cache-authorized-ttl duration     Default: 5m0s ---> ---authorization-webhook-cache-authorized-ttl duration     默认值:5m0s -</td> +<td colspan="2">--authorization-webhook-cache-authorized-ttl duration     <!--Default:-->默认值:5m0s</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- The duration to cache 'authorized' responses from the webhook authorizer. --> -缓存来自 Webhook 鉴权组件的 “授权(authorized)” 响应的持续时间。 +对来自 Webhook 鉴权组件的 “授权(authorized)” 响应的缓存时间。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---authorization-webhook-cache-unauthorized-ttl duration     Default: 30s ---> ---authorization-webhook-cache-unauthorized-ttl duration     默认值:30s -</td> +<td colspan="2">--authorization-webhook-cache-unauthorized-ttl duration     <!--Default:-->默认值:30s</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- The duration to cache 'unauthorized' responses from the webhook authorizer. --> -缓存来自 Webhook 鉴权模块的 “未授权(unauthorized)” 响应的持续时间。 +对来自 Webhook 鉴权模块的 “未授权(unauthorized)” 响应的缓存时间。 </td> </tr> @@ -794,13 +696,7 @@ API 服务器将查询远程服务,以对 API 服务器的安全端口的访 </tr> <tr> -<td colspan="2"> -<!-- ---authorization-webhook-version string     Default: "v1beta1" ---> ---authorization-webhook-version string     默认值:"v1beta1" -</td> -</tr> +<td colspan="2">--authorization-webhook-version string     <!--Default:-->默认值:"v1beta1"</tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- @@ -823,12 +719,7 @@ Path to the file containing Azure container registry configuration information. </tr> <tr> -<td colspan="2"> -<!-- ---bind-address ip     Default: 0.0.0.0 ---> ---bind-address ip     默认值:0.0.0.0 -</td> +<td colspan="2">--bind-address string     <!--Default:-->默认值:"0.0.0.0"</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -837,19 +728,14 @@ The IP address on which to listen for the --secure-port port. The associated int must be reachable by the rest of the cluster, and by CLI/web clients. If blank or an unspecified address (0.0.0.0 or ::), all interfaces will be used. --> -监听 --secure-port 端口的 IP 地址。 -集群的其余部分以及 CLI/web 客户端必须可以访问关联的接口。 -如果为空白或未指定地址(0.0.0.0 或 ::),则将使用所有接口。 +用来监听 <code>--secure-port</code> 端口的 IP 地址。 +集群的其余部分以及 CLI/web 客户端必须可以访问所关联的接口。 +如果为空白或未指定地址(<tt>0.0.0.0</tt> 或 <tt>::</tt>),则将使用所有接口。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---cert-dir string     Default: "/var/run/kubernetes" ---> ---cert-dir string     默认值:"/var/run/kubernetes" -</td> +<td colspan="2">--cert-dir string     <!--Default:-->默认值:"/var/run/kubernetes"</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -858,7 +744,8 @@ The directory where the TLS certs are located. If --tls-cert-file and --tls-private-key-file are provided, this flag will be ignored. --> TLS 证书所在的目录。 -如果提供了 --tls-cert-file 和 --tls-private-key-file,则将忽略此标志。 +如果提供了 <code>--tls-cert-file</code> 和 <code>--tls-private-key-file</code> +标志值,则将忽略此标志。 </td> </tr> @@ -885,8 +772,7 @@ client-ca 文件中的授权机构之一签名的客户端证书的请求进行 <!-- The path to the cloud provider configuration file. Empty string for no configuration file. --> -云厂商配置文件的路径。 -空字符串表示无配置文件。 +云厂商配置文件的路径。空字符串表示无配置文件。 </td> </tr> @@ -898,25 +784,19 @@ The path to the cloud provider configuration file. Empty string for no configura <!-- The provider for cloud services. Empty string for no provider. --> -云服务提供商。 -空字符串表示没有云厂商。 +云服务提供商。空字符串表示没有云厂商。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---cloud-provider-gce-l7lb-src-cidrs cidrs     Default: 130.211.0.0/22,35.191.0.0/16 ---> ---cloud-provider-gce-l7lb-src-cidrs cidrs     默认值:130.211.0.0/22,35.191.0.0/16 -</td> +<td colspan="2">--cloud-provider-gce-l7lb-src-cidrs cidrs     <!--Default:-->默认值:"130.211.0.0/22,35.191.0.0/16"</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- CIDRs opened in GCE firewall for L7 LB traffic proxy & health checks --> -在 GCE 防火墙中打开 CIDR,以进行 L7 LB 流量代理和运行状况检查 +在 GCE 防火墙中打开 CIDR,以进行第 7 层负载均衡流量代理和健康状况检查。 </td> </tr> @@ -928,12 +808,12 @@ CIDRs opened in GCE firewall for L7 LB traffic proxy & health checks <!-- Enable lock contention profiling, if profiling is enabled --> -如果启用了性能分析,则启用锁争用性能分析 +如果启用了性能分析,则启用锁争用性能分析。 </td> </tr> <tr> -<td colspan="2">--cors-allowed-origins stringSlice</td> +<td colspan="2">--cors-allowed-origins strings</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -949,30 +829,20 @@ CORS 允许的来源清单,以逗号分隔。 </tr> <tr> -<td colspan="2"> -<!-- ---default-not-ready-toleration-seconds int     Default: 300 ---> ---default-not-ready-toleration-seconds int     默认值:300 -</td> +<td colspan="2">--default-not-ready-toleration-seconds int     <!--Default: -->默认值:300</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- Indicates the tolerationSeconds of the toleration for notReady:NoExecute that is added by default to every pod that does not already have such a toleration. --> -标明 notReady:NoExecute 的 tolerationSeconds, -默认情况下将其添加到尚未具有此容忍度的每个 pod 中。 +对污点 NotReady:NoExecute 的容忍时长(以秒计)。 +默认情况下这一容忍度会被添加到尚未具有此容忍度的每个 pod 中。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---default-unreachable-toleration-seconds int     Default: 300 ---> ---default-unreachable-toleration-seconds int     默认值:300 -</td> +<td colspan="2">--default-unreachable-toleration-seconds int     <!--Default:-->默认值:300</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -980,18 +850,13 @@ Indicates the tolerationSeconds of the toleration for notReady:NoExecute that is Indicates the tolerationSeconds of the toleration for unreachable:NoExecute that is added by default to every pod that does not already have such a toleration. --> -标明 unreachable:NoExecute 的 tolerationSeconds, -默认情况下将其添加到尚未具有此容忍度的每个 pod 中。 +对污点 Unreachable:NoExecute 的容忍时长(以秒计) +默认情况下这一容忍度会被添加到尚未具有此容忍度的每个 pod 中。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---default-watch-cache-size int     Default: 100 ---> ---default-watch-cache-size int     默认值:100 -</td> +<td colspan="2">--default-watch-cache-size int     <!--Default:-->默认值:100</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1005,38 +870,48 @@ that do not have a default watch size set. </tr> <tr> -<td colspan="2"> -<!-- ---delete-collection-workers int     Default: 1 ---> ---delete-collection-workers int     默认值:1 -</td> +<td colspan="2">--delete-collection-workers int     <!--Default:-->默认值: 1</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- Number of workers spawned for DeleteCollection call. These are used to speed up namespace cleanup. --> -为 DeleteCollection 调用而产生的工作程序数。 +为 DeleteCollection 调用而产生的工作线程数。 这些用于加速名字空间清理。 </td> </tr> <tr> -<td colspan="2">--disable-admission-plugins stringSlice</td> +<td colspan="2">--disable-admission-plugins strings</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- -admission plugins that should be disabled although they are in the default enabled plugins list (NamespaceLifecycle, LimitRanger, ServiceAccount, TaintNodesByCondition, Priority, DefaultTolerationSeconds, DefaultStorageClass, StorageObjectInUseProtection, PersistentVolumeClaimResize, RuntimeClass, CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, MutatingAdmissionWebhook, ValidatingAdmissionWebhook, ResourceQuota). Comma-delimited list of admission plugins: AlwaysAdmit, AlwaysDeny, AlwaysPullImages, CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, DefaultStorageClass, DefaultTolerationSeconds, DenyEscalatingExec, DenyExecOnPrivileged, EventRateLimit, ExtendedResourceToleration, ImagePolicyWebhook, LimitPodHardAntiAffinityTopology, LimitRanger, MutatingAdmissionWebhook, NamespaceAutoProvision, NamespaceExists, NamespaceLifecycle, NodeRestriction, OwnerReferencesPermissionEnforcement, PersistentVolumeClaimResize, PersistentVolumeLabel, PodNodeSelector, PodSecurityPolicy, PodTolerationRestriction, Priority, ResourceQuota, RuntimeClass, SecurityContextDeny, ServiceAccount, StorageObjectInUseProtection, TaintNodesByCondition, ValidatingAdmissionWebhook. The order of plugins in this flag does not matter. +admission plugins that should be disabled although they are in the default enabled plugins list (NamespaceLifecycle, LimitRanger, ServiceAccount, TaintNodesByCondition, Priority, DefaultTolerationSeconds, DefaultStorageClass, StorageObjectInUseProtection, PersistentVolumeClaimResize, RuntimeClass, CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, MutatingAdmissionWebhook, ValidatingAdmissionWebhook, ResourceQuota). Comma-delimited list of admission plugins: AlwaysAdmit, AlwaysDeny, AlwaysPullImages, CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, DefaultStorageClass, DefaultTolerationSeconds, DenyServiceExternalIPs, EventRateLimit, ExtendedResourceToleration, ImagePolicyWebhook, LimitPodHardAntiAffinityTopology, LimitRanger, MutatingAdmissionWebhook, NamespaceAutoProvision, NamespaceExists, NamespaceLifecycle, NodeRestriction, OwnerReferencesPermissionEnforcement, PersistentVolumeClaimResize, PersistentVolumeLabel, PodNodeSelector, PodSecurityPolicy, PodTolerationRestriction, Priority, ResourceQuota, RuntimeClass, SecurityContextDeny, ServiceAccount, StorageObjectInUseProtection, TaintNodesByCondition, ValidatingAdmissionWebhook. The order of plugins in this flag does not matter. --> 尽管位于默认启用的插件列表中(NamespaceLifecycle、LimitRanger、ServiceAccount、TaintNodesByCondition、Priority、DefaultTolerationSeconds、DefaultStorageClass、StorageObjectInUseProtection、PersistentVolumeClaimResize、RuntimeClass、CertificateApproval、CertificateSigning、CertificateSubjectRestriction、DefaultIngressClass、MutatingAdmissionWebhook、ValidatingAdmissionWebhook、ResourceQuota)仍须被禁用的插件。 -<br/>取值为逗号分隔的准入插件列表:AlwaysAdmit、AlwaysDeny、AlwaysPullImages、CertificateApproval、CertificateSigning、CertificateSubjectRestriction、DefaultIngressClass、DefaultStorageClass、DefaultTolerationSeconds、DenyEscalatingExec、DenyExecOnPrivileged、EventRateLimit、ExtendedResourceToleration、ImagePolicyWebhook、LimitPodHardAntiAffinityTopology、LimitRanger、MutatingAdmissionWebhook、NamespaceAutoProvision、NamespaceExists、NamespaceLifecycle、NodeRestriction、OwnerReferencesPermissionEnforcement、PersistentVolumeClaimResize、PersistentVolumeLabel、PodNodeSelector、PodSecurityPolicy、PodTolerationRestriction、Priority、ResourceQuota、RuntimeClass、SecurityContextDeny、ServiceAccount、StorageObjectInUseProtection、TaintNodesByCondition、ValidatingAdmissionWebhook。 +<br/>取值为逗号分隔的准入插件列表:AlwaysAdmit、AlwaysDeny、AlwaysPullImages、CertificateApproval、CertificateSigning、CertificateSubjectRestriction、DefaultIngressClass、DefaultStorageClass、DefaultTolerationSeconds、DenyServiceExternalIPs、EventRateLimit、ExtendedResourceToleration、ImagePolicyWebhook、LimitPodHardAntiAffinityTopology、LimitRanger、MutatingAdmissionWebhook、NamespaceAutoProvision、NamespaceExists、NamespaceLifecycle、NodeRestriction、OwnerReferencesPermissionEnforcement、PersistentVolumeClaimResize、PersistentVolumeLabel、PodNodeSelector、PodSecurityPolicy、PodTolerationRestriction、Priority、ResourceQuota、RuntimeClass、SecurityContextDeny、ServiceAccount、StorageObjectInUseProtection、TaintNodesByCondition、ValidatingAdmissionWebhook。 <br/>该标志中插件的顺序无关紧要。 </td> </tr> +<tr> +<td colspan="2">--disabled-metrics strings</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"> +<!-- +This flag provides an escape hatch for misbehaving metrics. You must provide the fully qualified metric name in order to disable it. Disclaimer: disabling metrics is higher in precedence than showing hidden metrics. +--> +此标志为行为不正确的度量指标提供一种处理方案。 +你必须提供完全限定的指标名称才能将其禁止。 +声明:禁用度量值的行为优先于显示已隐藏的度量值。 +</td> +</tr> + + <tr> <td colspan="2">--egress-selector-config-file string</td> </tr> @@ -1045,7 +920,7 @@ admission plugins that should be disabled although they are in the default enabl <!-- File with apiserver egress selector configuration. --> -带有 apiserver 出站选择器配置的文件。 +带有 API 服务器出站选择器配置的文件。 </td> </tr> @@ -1055,10 +930,14 @@ File with apiserver egress selector configuration. <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- -admission plugins that should be enabled in addition to default enabled ones (NamespaceLifecycle, LimitRanger, ServiceAccount, TaintNodesByCondition, Priority, DefaultTolerationSeconds, DefaultStorageClass, StorageObjectInUseProtection, PersistentVolumeClaimResize, RuntimeClass, CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, MutatingAdmissionWebhook, ValidatingAdmissionWebhook, ResourceQuota). Comma-delimited list of admission plugins: AlwaysAdmit, AlwaysDeny, AlwaysPullImages, CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, DefaultStorageClass, DefaultTolerationSeconds, DenyEscalatingExec, DenyExecOnPrivileged, EventRateLimit, ExtendedResourceToleration, ImagePolicyWebhook, LimitPodHardAntiAffinityTopology, LimitRanger, MutatingAdmissionWebhook, NamespaceAutoProvision, NamespaceExists, NamespaceLifecycle, NodeRestriction, OwnerReferencesPermissionEnforcement, PersistentVolumeClaimResize, PersistentVolumeLabel, PodNodeSelector, PodSecurityPolicy, PodTolerationRestriction, Priority, ResourceQuota, RuntimeClass, SecurityContextDeny, ServiceAccount, StorageObjectInUseProtection, TaintNodesByCondition, ValidatingAdmissionWebhook. The order of plugins in this flag does not matter. +admission plugins that should be enabled in addition to default enabled ones ( +NamespaceLifecycle, LimitRanger, ServiceAccount, TaintNodesByCondition, Priority, DefaultTolerationSeconds, DefaultStorageClass, StorageObjectInUseProtection, PersistentVolumeClaimResize, RuntimeClass, CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, MutatingAdmissionWebhook, ValidatingAdmissionWebhook, ResourceQuota). +Comma-delimited list of admission plugins: +AlwaysAdmit, AlwaysDeny, AlwaysPullImages, CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, DefaultStorageClass, DefaultTolerationSeconds, DenyServiceExternalIPs, EventRateLimit, ExtendedResourceToleration, ImagePolicyWebhook, LimitPodHardAntiAffinityTopology, LimitRanger, MutatingAdmissionWebhook, NamespaceAutoProvision, NamespaceExists, NamespaceLifecycle, NodeRestriction, OwnerReferencesPermissionEnforcement, PersistentVolumeClaimResize, PersistentVolumeLabel, PodNodeSelector, PodSecurityPolicy, PodTolerationRestriction, Priority, ResourceQuota, RuntimeClass, SecurityContextDeny, ServiceAccount, StorageObjectInUseProtection, TaintNodesByCondition, ValidatingAdmissionWebhook. +The order of plugins in this flag does not matter. --> 除了默认启用的插件(NamespaceLifecycle、LimitRanger、ServiceAccount、TaintNodesByCondition、Priority、DefaultTolerationSeconds、DefaultStorageClass、StorageObjectInUseProtection、PersistentVolumeClaimResize、RuntimeClass、CertificateApproval、CertificateSigning、CertificateSubjectRestriction、DefaultIngressClass、MutatingAdmissionWebhook、ValidatingAdmissionWebhook、ResourceQuota)之外要启用的插件 -</br>取值为逗号分隔的准入插件列表:AlwaysAdmit、AlwaysDeny、AlwaysPullImages、CertificateApproval、CertificateSigning、CertificateSubjectRestriction、DefaultIngressClass、DefaultStorageClass、DefaultTolerationSeconds、DenyEscalatingExec、DenyExecOnPrivileged、EventRateLimit、ExtendedResourceToleration、ImagePolicyWebhook、LimitPodHardAntiAffinityTopology、LimitRanger、MutatingAdmissionWebhook、NamespaceAutoProvision、NamespaceExists、NamespaceLifecycle、NodeRestriction、OwnerReferencesPermissionEnforcement、PersistentVolumeClaimResize、PersistentVolumeLabel、PodNodeSelector、PodSecurityPolicy、PodTolerationRestriction、Priority、ResourceQuota、RuntimeClass、SecurityContextDeny、ServiceAccount、StorageObjectInUseProtection、TaintNodesByCondition、ValidatingAdmissionWebhook +</br>取值为逗号分隔的准入插件列表:AlwaysAdmit、AlwaysDeny、AlwaysPullImages、CertificateApproval、CertificateSigning、CertificateSubjectRestriction、DefaultIngressClass、DefaultStorageClass、DefaultTolerationSeconds、DenyServiceExternalIPs、EventRateLimit、ExtendedResourceToleration、ImagePolicyWebhook、LimitPodHardAntiAffinityTopology、LimitRanger、MutatingAdmissionWebhook、NamespaceAutoProvision、NamespaceExists、NamespaceLifecycle、NodeRestriction、OwnerReferencesPermissionEnforcement、PersistentVolumeClaimResize、PersistentVolumeLabel、PodNodeSelector、PodSecurityPolicy、PodTolerationRestriction、Priority、ResourceQuota、RuntimeClass、SecurityContextDeny、ServiceAccount、StorageObjectInUseProtection、TaintNodesByCondition、ValidatingAdmissionWebhook <br/>该标志中插件的顺序无关紧要。 </td> </tr> @@ -1090,29 +969,19 @@ namespace to be used for TLS bootstrapping authentication. </tr> <tr> -<td colspan="2"> -<!-- ---enable-garbage-collector     Default: true ---> ---enable-garbage-collector     默认值:true +<td colspan="2">--enable-garbage-collector     <!--Default:-->默认值:true</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- Enables the generic garbage collector. MUST be synced with the corresponding flag of the kube-controller-manager. --> -启用通用垃圾收集器。 -必须与 kube-controller-manager 的相应标志同步。 +启用通用垃圾收集器。必须与 kube-controller-manager 的相应标志同步。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---enable-priority-and-fairness     Default: true ---> ---enable-priority-and-fairness     默认值:true -</td> +<td colspan="2">--enable-priority-and-fairness     <!--Default:-->默认值:true</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1121,7 +990,7 @@ If true and the APIPriorityAndFairness feature gate is enabled, replace the max-in-flight handler with an enhanced one that queues and dispatches with priority and fairness --> -如果为 true 且启用了 APIPriorityAndFairness 特性门控, +如果为 true 且启用了 <code>APIPriorityAndFairness</code> 特性门控, 请使用增强的处理程序替换 max-in-flight 处理程序, 以便根据优先级和公平性完成排队和调度。 </td> @@ -1140,19 +1009,14 @@ The file containing configuration for encryption providers to be used for storin </tr> <tr> -<td colspan="2"> -<!-- ---endpoint-reconciler-type string     Default: "lease" ---> ---endpoint-reconciler-type string     默认值:"lease" -</td> +<td colspan="2">--endpoint-reconciler-type string     <!--Default:-->默认值:"lease"</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- Use an endpoint reconciler (master-count, lease, none) --> -使用端点协调器(master-count, lease, none) +使用端点协调器(<code>master-count</code>、<code>lease</code> 或 <code>none</code>)。 </td> </tr> @@ -1181,12 +1045,7 @@ SSL certification file used to secure etcd communication. </tr> <tr> -<td colspan="2"> -<!-- ---etcd-compaction-interval duration     Default: 5m0s ---> ---etcd-compaction-interval duration     默认值:5m0s -</td> +<td colspan="2">--etcd-compaction-interval duration     <!--Default:-->默认值:5m0s</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1194,43 +1053,32 @@ SSL certification file used to secure etcd communication. The interval of compaction requests. If 0, the compaction request from apiserver is disabled. --> 压缩请求的间隔。 -如果为0,则禁用来自 apiserver 的压缩请求。 +如果为0,则禁用来自 API 服务器的压缩请求。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---etcd-count-metric-poll-period duration     Default: 1m0s ---> ---etcd-count-metric-poll-period duration     默认值:1m0s -</td> +<td colspan="2">--etcd-count-metric-poll-period duration     <!--Default:-->默认值:1m0s</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- Frequency of polling etcd for number of resources per type. 0 disables the metric collection. --> -针对每种类型的资源数量轮询 etcd 的频率。 -0 禁用度量值收集。 +针对每种类型的资源数量轮询 etcd 的频率。 +0 值表示禁用度量值收集。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---etcd-db-metric-poll-interval duration     Default: 30s ---> ---etcd-db-metric-poll-interval duration     默认值:30s -</td> +<td colspan="2">--etcd-db-metric-poll-interval duration     <!--Default:-->默认值:30s</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- The interval of requests to poll etcd and update metric. 0 disables the metric collection --> -轮询 etcd 和更新度量值的请求间隔。 -0 禁用度量值收集 +轮询 etcd 和更新度量值的请求间隔。0 值表示禁用度量值收集。 </td> </tr> @@ -1259,12 +1107,7 @@ SSL key file used to secure etcd communication.< </tr> <tr> -<td colspan="2"> -<!-- ---etcd-prefix string     Default: "/registry" ---> ---etcd-prefix string     默认值:"/registry" -</td> +<td colspan="2">--etcd-prefix string     <!--Default:-->默认值:"/registry"</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1276,19 +1119,19 @@ The prefix to prepend to all resource paths in etcd. </tr> <tr> -<td colspan="2">--etcd-servers stringSlice</td> +<td colspan="2">--etcd-servers strings</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- List of etcd servers to connect with (scheme://ip:port), comma separated. --> -要连接的 etcd 服务器列表(scheme://ip:port),以逗号分隔。 +要连接的 etcd 服务器列表(<code>scheme://ip:port</code>),以逗号分隔。 </td> </tr> <tr> -<td colspan="2">--etcd-servers-overrides stringSlice</td> +<td colspan="2">--etcd-servers-overrides strings</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1298,17 +1141,13 @@ The individual override format: group/resource#servers, where servers are URLs, semicolon separated. --> etcd 服务器针对每个资源的重载设置,以逗号分隔。 -单个替代格式:组/资源#服务器(group/resource#servers),其中服务器是 URL,以分号分隔。 +单个替代格式:组/资源#服务器(group/resource#servers), +其中服务器是 URL,以分号分隔。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---event-ttl duration     Default: 1h0m0s ---> ---event-ttl duration     默认值:1h0m0s -</td> +<td colspan="2">--event-ttl duration     <!--Default:-->默认值:1h0m0s</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1345,7 +1184,7 @@ The hostname to use when generating externalized URLs for this master </tr> <tr> -<td colspan="2">--feature-gates mapStringBool</td> +<td colspan="2">--feature-gates <逗号分隔的 'key=True|False' 键值对></td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1357,41 +1196,35 @@ APIResponseCompression=true|false (BETA - default=true)<br/> APIServerIdentity=true|false (ALPHA - default=false)<br/> AllAlpha=true|false (ALPHA - default=false)<br/> AllBeta=true|false (BETA - default=false)<br/> -AllowInsecureBackendProxy=true|false (BETA - default=true)<br/> AnyVolumeDataSource=true|false (ALPHA - default=false)<br/> AppArmor=true|false (BETA - default=true)<br/> BalanceAttachedNodeVolumes=true|false (ALPHA - default=false)<br/> -BoundServiceAccountTokenVolume=true|false (ALPHA - default=false)<br/> +BoundServiceAccountTokenVolume=true|false (BETA - default=true)<br/> CPUManager=true|false (BETA - default=true)<br/> -CRIContainerLogRotation=true|false (BETA - default=true)<br/> CSIInlineVolume=true|false (BETA - default=true)<br/> CSIMigration=true|false (BETA - default=true)<br/> CSIMigrationAWS=true|false (BETA - default=false)<br/> -CSIMigrationAWSComplete=true|false (ALPHA - default=false)<br/> CSIMigrationAzureDisk=true|false (BETA - default=false)<br/> -CSIMigrationAzureDiskComplete=true|false (ALPHA - default=false)<br/> -CSIMigrationAzureFile=true|false (ALPHA - default=false)<br/> -CSIMigrationAzureFileComplete=true|false (ALPHA - default=false)<br/> +CSIMigrationAzureFile=true|false (BETA - default=false)<br/> CSIMigrationGCE=true|false (BETA - default=false)<br/> -CSIMigrationGCEComplete=true|false (ALPHA - default=false)<br/> -CSIMigrationOpenStack=true|false (BETA - default=false)<br/> -CSIMigrationOpenStackComplete=true|false (ALPHA - default=false)<br/> +CSIMigrationOpenStack=true|false (BETA - default=true)<br/> CSIMigrationvSphere=true|false (BETA - default=false)<br/> CSIMigrationvSphereComplete=true|false (BETA - default=false)<br/> -CSIServiceAccountToken=true|false (ALPHA - default=false)<br/> -CSIStorageCapacity=true|false (ALPHA - default=false)<br/> +CSIServiceAccountToken=true|false (BETA - default=true)<br/> +CSIStorageCapacity=true|false (BETA - default=true)<br/> CSIVolumeFSGroupPolicy=true|false (BETA - default=true)<br/> +CSIVolumeHealth=true|false (ALPHA - default=false)<br/> ConfigurableFSGroupPolicy=true|false (BETA - default=true)<br/> -CronJobControllerV2=true|false (ALPHA - default=false)<br/> +ControllerManagerLeaderMigration=true|false (ALPHA - default=false)<br/> +CronJobControllerV2=true|false (BETA - default=true)<br/> CustomCPUCFSQuotaPeriod=true|false (ALPHA - default=false)<br/> +DaemonSetUpdateSurge=true|false (ALPHA - default=false)<br/> DefaultPodTopologySpread=true|false (BETA - default=true)<br/> DevicePlugins=true|false (BETA - default=true)<br/> DisableAcceleratorUsageMetrics=true|false (BETA - default=true)<br/> -DownwardAPIHugePages=true|false (ALPHA - default=false)<br/> +DownwardAPIHugePages=true|false (BETA - default=false)<br/> DynamicKubeletConfig=true|false (BETA - default=true)<br/> -EfficientWatchResumption=true|false (ALPHA - default=false)<br/> -EndpointSlice=true|false (BETA - default=true)<br/> -EndpointSliceNodeName=true|false (ALPHA - default=false)<br/> +EfficientWatchResumption=true|false (BETA - default=true)<br/> EndpointSliceProxying=true|false (BETA - default=true)<br/> EndpointSliceTerminatingCondition=true|false (ALPHA - default=false)<br/> EphemeralContainers=true|false (ALPHA - default=false)<br/> @@ -1399,138 +1232,158 @@ ExpandCSIVolumes=true|false (BETA - default=true)<br/> ExpandInUsePersistentVolumes=true|false (BETA - default=true)<br/> ExpandPersistentVolumes=true|false (BETA - default=true)<br/> ExperimentalHostUserNamespaceDefaulting=true|false (BETA - default=false)<br/> -GenericEphemeralVolume=true|false (ALPHA - default=false)<br/> -GracefulNodeShutdown=true|false (ALPHA - default=false)<br/> +GenericEphemeralVolume=true|false (BETA - default=true)<br/> +GracefulNodeShutdown=true|false (BETA - default=true)<br/> HPAContainerMetrics=true|false (ALPHA - default=false)<br/> HPAScaleToZero=true|false (ALPHA - default=false)<br/> HugePageStorageMediumSize=true|false (BETA - default=true)<br/> -IPv6DualStack=true|false (ALPHA - default=false)<br/> -ImmutableEphemeralVolumes=true|false (BETA - default=true)<br/> +IPv6DualStack=true|false (BETA - default=true)<br/> +InTreePluginAWSUnregister=true|false (ALPHA - default=false)<br/> +InTreePluginAzureDiskUnregister=true|false (ALPHA - default=false)<br/> +InTreePluginAzureFileUnregister=true|false (ALPHA - default=false)<br/> +InTreePluginGCEUnregister=true|false (ALPHA - default=false)<br/> +InTreePluginOpenStackUnregister=true|false (ALPHA - default=false)<br/> +InTreePluginvSphereUnregister=true|false (ALPHA - default=false)<br/> +IndexedJob=true|false (ALPHA - default=false)<br/> +IngressClassNamespacedParams=true|false (ALPHA - default=false)<br/> KubeletCredentialProviders=true|false (ALPHA - default=false)<br/> KubeletPodResources=true|false (BETA - default=true)<br/> -LegacyNodeRoleBehavior=true|false (BETA - default=true)<br/> +KubeletPodResourcesGetAllocatable=true|false (ALPHA - default=false)<br/> LocalStorageCapacityIsolation=true|false (BETA - default=true)<br/> LocalStorageCapacityIsolationFSQuotaMonitoring=true|false (ALPHA - default=false)<br/> +LogarithmicScaleDown=true|false (ALPHA - default=false)<br/> +MemoryManager=true|false (ALPHA - default=false)<br/> MixedProtocolLBService=true|false (ALPHA - default=false)<br/> -NodeDisruptionExclusion=true|false (BETA - default=true)<br/> +NamespaceDefaultLabelName=true|false (BETA - default=true)<br/> +NetworkPolicyEndPort=true|false (ALPHA - default=false)<br/> NonPreemptingPriority=true|false (BETA - default=true)<br/> -PodDisruptionBudget=true|false (BETA - default=true)<br/> +PodAffinityNamespaceSelector=true|false (ALPHA - default=false)<br/> +PodDeletionCost=true|false (ALPHA - default=false)<br/> PodOverhead=true|false (BETA - default=true)<br/> +PreferNominatedNode=true|false (ALPHA - default=false)<br/> +ProbeTerminationGracePeriod=true|false (ALPHA - default=false)<br/> ProcMountType=true|false (ALPHA - default=false)<br/> QOSReserved=true|false (ALPHA - default=false)<br/> RemainingItemCount=true|false (BETA - default=true)<br/> RemoveSelfLink=true|false (BETA - default=true)<br/> -RootCAConfigMap=true|false (BETA - default=true)<br/> RotateKubeletServerCertificate=true|false (BETA - default=true)<br/> -RunAsGroup=true|false (BETA - default=true)<br/> ServerSideApply=true|false (BETA - default=true)<br/> -ServiceAccountIssuerDiscovery=true|false (BETA - default=true)<br/> +ServiceInternalTrafficPolicy=true|false (ALPHA - default=false)<br/> ServiceLBNodePortControl=true|false (ALPHA - default=false)<br/> -ServiceNodeExclusion=true|false (BETA - default=true)<br/> +ServiceLoadBalancerClass=true|false (ALPHA - default=false)<br/> ServiceTopology=true|false (ALPHA - default=false)<br/> SetHostnameAsFQDN=true|false (BETA - default=true)<br/> SizeMemoryBackedVolumes=true|false (ALPHA - default=false)<br/> StorageVersionAPI=true|false (ALPHA - default=false)<br/> StorageVersionHash=true|false (BETA - default=true)<br/> -Sysctls=true|false (BETA - default=true)<br/> -TTLAfterFinished=true|false (ALPHA - default=false)<br/> +SuspendJob=true|false (ALPHA - default=false)<br/> +TTLAfterFinished=true|false (BETA - default=true)<br/> +TopologyAwareHints=true|false (ALPHA - default=false)<br/> TopologyManager=true|false (BETA - default=true)<br/> ValidateProxyRedirects=true|false (BETA - default=true)<br/> +VolumeCapacityPriority=true|false (ALPHA - default=false)<br/> WarningHeaders=true|false (BETA - default=true)<br/> WinDSR=true|false (ALPHA - default=false)<br/> WinOverlay=true|false (BETA - default=true)<br/> -WindowsEndpointSliceProxying=true|false (ALPHA - default=false) +WindowsEndpointSliceProxying=true|false (BETA - default=true) --> -一组 key=value 对,用来描述测试性/试验性功能的特性门控。可选项有: -<br/>APIListChunking=true|false (BETA - 默认值=true) -<br/>APIPriorityAndFairness=true|false (BETA - 默认值=true) -<br/>APIResponseCompression=true|false (BETA - 默认值=true) -<br/>APIServerIdentity=true|false (ALPHA - 默认值=false) -<br/>AllAlpha=true|false (ALPHA - 默认值=false) -<br/>AllBeta=true|false (BETA - 默认值=false) -<br/>AllowInsecureBackendProxy=true|false (BETA - 默认值=true) -<br/>AnyVolumeDataSource=true|false (ALPHA - 默认值=false) -<br/>AppArmor=true|false (BETA - 默认值=true) -<br/>BalanceAttachedNodeVolumes=true|false (ALPHA - 默认值=false) -<br/>BoundServiceAccountTokenVolume=true|false (ALPHA - 默认值=false) -<br/>CPUManager=true|false (BETA - 默认值=true) -<br/>CRIContainerLogRotation=true|false (BETA - 默认值=true) -<br/>CSIInlineVolume=true|false (BETA - 默认值=true) -<br/>CSIMigration=true|false (BETA - 默认值=true) -<br/>CSIMigrationAWS=true|false (BETA - 默认值=false) -<br/>CSIMigrationAWSComplete=true|false (ALPHA - 默认值=false) -<br/>CSIMigrationAzureDisk=true|false (BETA - 默认值=false) -<br/>CSIMigrationAzureDiskComplete=true|false (ALPHA - 默认值=false) -<br/>CSIMigrationAzureFile=true|false (ALPHA - 默认值=false) -<br/>CSIMigrationAzureFileComplete=true|false (ALPHA - 默认值=false) -<br/>CSIMigrationGCE=true|false (BETA - 默认值=false) -<br/>CSIMigrationGCEComplete=true|false (ALPHA - 默认值=false) -<br/>CSIMigrationOpenStack=true|false (BETA - 默认值=false) -<br/>CSIMigrationOpenStackComplete=true|false (ALPHA - 默认值=false) -<br/>CSIMigrationvSphere=true|false (BETA - 默认值=false) -<br/>CSIMigrationvSphereComplete=true|false (BETA - 默认值=false) -<br/>CSIServiceAccountToken=true|false (ALPHA - 默认值=false) -<br/>CSIStorageCapacity=true|false (ALPHA - 默认值=false) -<br/>CSIVolumeFSGroupPolicy=true|false (BETA - 默认值=true) -<br/>ConfigurableFSGroupPolicy=true|false (BETA - 默认值=true) -<br/>CronJobControllerV2=true|false (ALPHA - 默认值=false) -<br/>CustomCPUCFSQuotaPeriod=true|false (ALPHA - 默认值=false) -<br/>DefaultPodTopologySpread=true|false (BETA - 默认值=true) -<br/>DevicePlugins=true|false (BETA - 默认值=true) -<br/>DisableAcceleratorUsageMetrics=true|false (BETA - 默认值=true) -<br/>DownwardAPIHugePages=true|false (ALPHA - default=false) -<br/>DynamicKubeletConfig=true|false (BETA - 默认值=true) -<br/>EfficientWatchResumption=true|false (ALPHA - 默认值=false) -<br/>EndpointSlice=true|false (BETA - 默认值=true) -<br/>EndpointSliceNodeName=true|false (ALPHA - 默认值=false) -<br/>EndpointSliceProxying=true|false (BETA - 默认值=true) -<br/>EndpointSliceTerminatingCondition=true|false (ALPHA - 默认值=false) -<br/>EphemeralContainers=true|false (ALPHA - 默认值=false) -<br/>ExpandCSIVolumes=true|false (BETA - 默认值=true) -<br/>ExpandInUsePersistentVolumes=true|false (BETA - 默认值=true) -<br/>ExpandPersistentVolumes=true|false (BETA - 默认值=true) -<br/>ExperimentalHostUserNamespaceDefaulting=true|false (BETA - 默认值=false) -<br/>GenericEphemeralVolume=true|false (ALPHA - 默认值=false) -<br/>GracefulNodeShutdown=true|false (ALPHA - 默认值=false) -<br/>HPAContainerMetrics=true|false (ALPHA - default=false) -<br/>HPAScaleToZero=true|false (ALPHA - 默认值=false) -<br/>HugePageStorageMediumSize=true|false (BETA - 默认值=true) -<br/>IPv6DualStack=true|false (ALPHA - 默认值=false) -<br/>ImmutableEphemeralVolumes=true|false (BETA - 默认值=true) -<br/>KubeletCredentialProviders=true|false (ALPHA - 默认值=false) -<br/>KubeletPodResources=true|false (BETA - 默认值=true) -<br/>LegacyNodeRoleBehavior=true|false (BETA - 默认值=true) -<br/>LocalStorageCapacityIsolation=true|false (BETA - 默认值=true) -<br/>LocalStorageCapacityIsolationFSQuotaMonitoring=true|false (ALPHA - 默认值=false) -<br/>MixedProtocolLBService=true|false (ALPHA - 默认值=false) -<br/>NodeDisruptionExclusion=true|false (BETA - 默认值=true) -<br/>NonPreemptingPriority=true|false (BETA - 默认值=true) -<br/>PodDisruptionBudget=true|false (BETA - 默认值=true) -<br/>PodOverhead=true|false (BETA - 默认值=true) -<br/>ProcMountType=true|false (ALPHA - 默认值=false) -<br/>QOSReserved=true|false (ALPHA - 默认值=false) -<br/>RemainingItemCount=true|false (BETA - 默认值=true) -<br/>RemoveSelfLink=true|false (BETA - 默认值=true) -<br/>RootCAConfigMap=true|false (BETA - 默认值=true) -<br/>RotateKubeletServerCertificate=true|false (BETA - 默认值=true) -<br/>RunAsGroup=true|false (BETA - 默认值=true) -<br/>ServerSideApply=true|false (BETA - 默认值=true) -<br/>ServiceAccountIssuerDiscovery=true|false (BETA - 默认值=true) -<br/>ServiceLBNodePortControl=true|false (ALPHA - 默认值=false) -<br/>ServiceNodeExclusion=true|false (BETA - 默认值=true) -<br/>ServiceTopology=true|false (ALPHA - 默认值=false) -<br/>SetHostnameAsFQDN=true|false (BETA - 默认值=true) -<br/>SizeMemoryBackedVolumes=true|false (ALPHA - 默认值=false) -<br/>StorageVersionAPI=true|false (ALPHA - 默认值=false) -<br/>StorageVersionHash=true|false (BETA - 默认值=true) -<br/>Sysctls=true|false (BETA - 默认值=true) -<br/>TTLAfterFinished=true|false (ALPHA - 默认值=false) -<br/>TopologyManager=true|false (BETA - 默认值=true) -<br/>ValidateProxyRedirects=true|false (BETA - 默认值=true) -<br/>WarningHeaders=true|false (BETA - 默认值=true) -<br/>WinDSR=true|false (ALPHA - 默认值=false) -<br/>WinOverlay=true|false (BETA - 默认值=true) -<br/>WindowsEndpointSliceProxying=true|false (ALPHA - 默认值=false) +<p>一组 key=value 对,用来描述测试性/试验性功能的特性门控。可选项有: +APIListChunking=true|false (BETA - 默认值=true)<br/> +APIPriorityAndFairness=true|false (BETA - 默认值=true)<br/> +APIResponseCompression=true|false (BETA - 默认值=true)<br/> +APIServerIdentity=true|false (ALPHA - 默认值=false)<br/> +AllAlpha=true|false (ALPHA - 默认值=false)<br/> +AllBeta=true|false (BETA - 默认值=false)<br/> +AnyVolumeDataSource=true|false (ALPHA - 默认值=false)<br/> +AppArmor=true|false (BETA - 默认值=true)<br/> +BalanceAttachedNodeVolumes=true|false (ALPHA - 默认值=false)<br/> +BoundServiceAccountTokenVolume=true|false (BETA - 默认值=true)<br/> +CPUManager=true|false (BETA - 默认值=true)<br/> +CSIInlineVolume=true|false (BETA - 默认值=true)<br/> +CSIMigration=true|false (BETA - 默认值=true)<br/> +CSIMigrationAWS=true|false (BETA - 默认值=false)<br/> +CSIMigrationAzureDisk=true|false (BETA - 默认值=false)<br/> +CSIMigrationAzureFile=true|false (BETA - 默认值=false)<br/> +CSIMigrationGCE=true|false (BETA - 默认值=false)<br/> +CSIMigrationOpenStack=true|false (BETA - 默认值=true)<br/> +CSIMigrationvSphere=true|false (BETA - 默认值=false)<br/> +CSIMigrationvSphereComplete=true|false (BETA - 默认值=false)<br/> +CSIServiceAccountToken=true|false (BETA - 默认值=true)<br/> +CSIStorageCapacity=true|false (BETA - 默认值=true)<br/> +CSIVolumeFSGroupPolicy=true|false (BETA - 默认值=true)<br/> +CSIVolumeHealth=true|false (ALPHA - 默认值=false)<br/> +ConfigurableFSGroupPolicy=true|false (BETA - 默认值=true)<br/> +ControllerManagerLeaderMigration=true|false (ALPHA - 默认值=false)<br/> +CronJobControllerV2=true|false (BETA - 默认值=true)<br/> +CustomCPUCFSQuotaPeriod=true|false (ALPHA - 默认值=false)<br/> +DaemonSetUpdateSurge=true|false (ALPHA - 默认值=false)<br/> +DefaultPodTopologySpread=true|false (BETA - 默认值=true)<br/> +DevicePlugins=true|false (BETA - 默认值=true)<br/> +DisableAcceleratorUsageMetrics=true|false (BETA - 默认值=true)<br/> +DownwardAPIHugePages=true|false (BETA - 默认值=false)<br/> +DynamicKubeletConfig=true|false (BETA - 默认值=true)<br/> +EfficientWatchResumption=true|false (BETA - 默认值=true)<br/> +EndpointSliceProxying=true|false (BETA - 默认值=true)<br/> +EndpointSliceTerminatingCondition=true|false (ALPHA - 默认值=false)<br/> +EphemeralContainers=true|false (ALPHA - 默认值=false)<br/> +ExpandCSIVolumes=true|false (BETA - 默认值=true)<br/> +ExpandInUsePersistentVolumes=true|false (BETA - 默认值=true)<br/> +ExpandPersistentVolumes=true|false (BETA - 默认值=true)<br/> +ExperimentalHostUserNamespace默认值ing=true|false (BETA - 默认值=false)<br/> +GenericEphemeralVolume=true|false (BETA - 默认值=true)<br/> +GracefulNodeShutdown=true|false (BETA - 默认值=true)<br/> +HPAContainerMetrics=true|false (ALPHA - 默认值=false)<br/> +HPAScaleToZero=true|false (ALPHA - 默认值=false)<br/> +HugePageStorageMediumSize=true|false (BETA - 默认值=true)<br/> +IPv6DualStack=true|false (BETA - 默认值=true)<br/> +InTreePluginAWSUnregister=true|false (ALPHA - 默认值=false)<br/> +InTreePluginAzureDiskUnregister=true|false (ALPHA - 默认值=false)<br/> +InTreePluginAzureFileUnregister=true|false (ALPHA - 默认值=false)<br/> +InTreePluginGCEUnregister=true|false (ALPHA - 默认值=false)<br/> +InTreePluginOpenStackUnregister=true|false (ALPHA - 默认值=false)<br/> +InTreePluginvSphereUnregister=true|false (ALPHA - 默认值=false)<br/> +IndexedJob=true|false (ALPHA - 默认值=false)<br/> +IngressClassNamespacedParams=true|false (ALPHA - 默认值=false)<br/> +KubeletCredentialProviders=true|false (ALPHA - 默认值=false)<br/> +KubeletPodResources=true|false (BETA - 默认值=true)<br/> +KubeletPodResourcesGetAllocatable=true|false (ALPHA - 默认值=false)<br/> +LocalStorageCapacityIsolation=true|false (BETA - 默认值=true)<br/> +LocalStorageCapacityIsolationFSQuotaMonitoring=true|false (ALPHA - 默认值=false)<br/> +LogarithmicScaleDown=true|false (ALPHA - 默认值=false)<br/> +MemoryManager=true|false (ALPHA - 默认值=false)<br/> +MixedProtocolLBService=true|false (ALPHA - 默认值=false)<br/> +NamespaceDefaultLabelName=true|false (BETA - 默认值=true)<br/> +NetworkPolicyEndPort=true|false (ALPHA - 默认值=false)<br/> +NonPreemptingPriority=true|false (BETA - 默认值=true)<br/> +PodAffinityNamespaceSelector=true|false (ALPHA - 默认值=false)<br/> +PodDeletionCost=true|false (ALPHA - 默认值=false)<br/> +PodOverhead=true|false (BETA - 默认值=true)<br/> +PreferNominatedNode=true|false (ALPHA - 默认值=false)<br/> +ProbeTerminationGracePeriod=true|false (ALPHA - 默认值=false)<br/> +ProcMountType=true|false (ALPHA - 默认值=false)<br/> +QOSReserved=true|false (ALPHA - 默认值=false)<br/> +RemainingItemCount=true|false (BETA - 默认值=true)<br/> +RemoveSelfLink=true|false (BETA - 默认值=true)<br/> +RotateKubeletServerCertificate=true|false (BETA - 默认值=true)<br/> +ServerSideApply=true|false (BETA - 默认值=true)<br/> +ServiceInternalTrafficPolicy=true|false (ALPHA - 默认值=false)<br/> +ServiceLBNodePortControl=true|false (ALPHA - 默认值=false)<br/> +ServiceLoadBalancerClass=true|false (ALPHA - 默认值=false)<br/> +ServiceTopology=true|false (ALPHA - 默认值=false)<br/> +SetHostnameAsFQDN=true|false (BETA - 默认值=true)<br/> +SizeMemoryBackedVolumes=true|false (ALPHA - 默认值=false)<br/> +StorageVersionAPI=true|false (ALPHA - 默认值=false)<br/> +StorageVersionHash=true|false (BETA - 默认值=true)<br/> +SuspendJob=true|false (ALPHA - 默认值=false)<br/> +TTLAfterFinished=true|false (BETA - 默认值=true)<br/> +TopologyAwareHints=true|false (ALPHA - 默认值=false)<br/> +TopologyManager=true|false (BETA - 默认值=true)<br/> +ValidateProxyRedirects=true|false (BETA - 默认值=true)<br/> +VolumeCapacityPriority=true|false (ALPHA - 默认值=false)<br/> +WarningHeaders=true|false (BETA - 默认值=true)<br/> +WinDSR=true|false (ALPHA - 默认值=false)<br/> +WinOverlay=true|false (BETA - 默认值=true)<br/> +WindowsEndpointSliceProxying=true|false (BETA - 默认值=true)</p> </td> </tr> @@ -1549,11 +1402,11 @@ will be sent a GOAWAY. Clusters with single apiservers, or which don't use a load balancer, should NOT enable this. Min is 0 (off), Max is .02 (1/50 requests); .001 (1/1000) is a recommended starting point. --> -为防止 HTTP/2 客户端卡在单个 apiserver 上,可启用随机关闭连接(GOAWAY)。 +为防止 HTTP/2 客户端卡在单个 API 服务器上,可启用随机关闭连接(GOAWAY)。 客户端的其他运行中请求将不会受到影响,并且客户端将重新连接, -可能会在再次通过负载平衡器后登陆到其他 apiserver 上。 +可能会在再次通过负载平衡器后登陆到其他 API 服务器上。 此参数设置将发送 GOAWAY 的请求的比例。 -具有单个 apiserver 或不使用负载平衡器的群集不应启用此功能。 +具有单个 API 服务器或不使用负载平衡器的群集不应启用此功能。 最小值为0(关闭),最大值为 .02(1/50 请求); 建议使用 .001(1/1000)。 </td> </tr> @@ -1580,7 +1433,7 @@ The limit that the server gives to clients for the maximum number of streams in an HTTP/2 connection. Zero means to use golang's default. --> 服务器为客户端提供的 HTTP/2 连接中最大流数的限制。 -零表示使用 golang 的默认值。 +零表示使用 GoLang 的默认值。 </td> </tr> @@ -1647,12 +1500,7 @@ TLS 客户端密钥文件的路径。 </tr> <tr> -<td colspan="2"> -<!-- ---kubelet-preferred-address-types stringSlice     Default: [Hostname,InternalDNS,InternalIP,ExternalDNS,ExternalIP] ---> ---kubelet-preferred-address-types stringSlice     默认值:[Hostname,InternalDNS,InternalIP,ExternalDNS,ExternalIP] -</td> +<td colspan="2">--kubelet-preferred-address-types strings     <!--Default:-->默认值:Hostname,InternalDNS,InternalIP,ExternalDNS,ExternalIP</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1664,12 +1512,7 @@ List of the preferred NodeAddressTypes to use for kubelet connections. </tr> <tr> -<td colspan="2"> -<!-- ---kubelet-timeout duration     Default: 5s ---> ---kubelet-timeout duration     默认值:5s -</td> +<td colspan="2">--kubelet-timeout duration     <!--Default:-->默认值:5s</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1690,11 +1533,26 @@ If non-zero, the Kubernetes master service (which apiserver creates/maintains) will be of type NodePort, using this as the value of the port. If zero, the Kubernetes master service will be of type ClusterIP. --> -如果非零,那么 Kubernetes 主服务(由 apiserver 创建/维护)将是 NodePort 类型,使用它作为端口的值。 +如果非零,那么 Kubernetes 主服务(由 apiserver 创建/维护)将是 NodePort 类型, +使用它作为端口的值。 如果为零,则 Kubernetes 主服务将为 ClusterIP 类型。 </td> </tr> +<tr> +<td colspan="2">--lease-reuse-duration-seconds int     <!--Default:-->默认值:60</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"> +<!-- +The time in seconds that each lease is reused. A lower value could avoid large number of objects reusing the same lease. Notice that a too small value may cause performance problems at storage layer. +--> +每个租约被重用的时长。 +如果此值比较低,可以避免大量对象重用此租约。 +注意,如果此值过小,可能导致存储层出现性能问题。 +</td> +</tr> + <tr> <td colspan="2">--livez-grace-period duration</td> </tr> @@ -1706,25 +1564,21 @@ to complete its startup sequence and become live. From apiserver's start time to when this amount of time has elapsed, /livez will assume that unfinished post-start hooks will complete successfully and therefore return true. --> -此选项代表 apiserver 完成启动序列并生效所需的最长时间。 -从 apiserver 的启动时间到这段时间为止, -/livez 将假定未完成的启动后钩子将成功完成,因此返回 true。 +此选项代表 API 服务器完成启动序列并生效所需的最长时间。 +从 API 服务器的启动时间到这段时间为止, +<tt>/livez</tt> 将假定未完成的启动后钩子将成功完成,因此返回 true。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---log-backtrace-at traceLocation     默认值::0 ---> -</td> +<td colspan="2">--log-backtrace-at traceLocation     <!--Default:-->默认值:<tt>:0</tt></td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- when logging hits line file:N, emit a stack trace --> -当日志机制执行到'文件 :N'时,生成堆栈跟踪 +当日志机制执行到'文件 :N'时,生成堆栈跟踪。 </td> </tr> @@ -1736,7 +1590,7 @@ when logging hits line file:N, emit a stack trace <!-- If non-empty, write log files in this directory --> -如果为非空,则在此目录中写入日志文件 +如果为非空,则在此目录中写入日志文件。 </td> </tr> @@ -1748,7 +1602,7 @@ If non-empty, write log files in this directory <!-- If non-empty, use this log file --> -如果为非空,使用此日志文件 +如果为非空,使用此值作为日志文件。 </td> </tr> @@ -1787,35 +1641,25 @@ Maximum number of seconds between log flushes Sets the log format. Permitted formats: "json", "text".<br/>Non-default formats don't honor these flags: --add_dir_header, --alsologtostderr, --log_backtrace_at, --log_dir, --log_file, --log_file_max_size, --logtostderr, --one_output, --skip_headers, --skip_log_headers, --stderrthreshold, --vmodule, --log-flush-frequency.<br/>Non-default choices are currently alpha and subject to change without warning. --> 设置日志格式。允许的格式:"json","json"。<br/> -非默认格式不支持以下标志:<code>--add_dir_header</code>、<code>--alsologtostderr</code>、<code>--log_backtrace_at</code>、<code>--log_dir</code>、<code>--log_file</code>、<code>--log_file_max_size</code>、<code>--logtostderr</code>、<code>--one_output</code>、<code>-skip_headers</code>、<code>-skip_log_headers</code>、<code>--stderrthreshold</code>、<code>-vmodule</code> 和 <code>--log-flush-frequency</code>。<br/> +非默认格式不支持以下标志:<code>--add-dir-header</code>、<code>--alsologtostderr</code>、<code>--log-backtrace-at</code>、<code>--log-dir</code>、<code>--log-file</code>、<code>--log-file-max-size</code>、<code>--logtostderr</code>、<code>--one-output</code>、<code>-skip-headers</code>、<code>-skip-log-headers</code>、<code>--stderrthreshold</code>、<code>-vmodule</code> 和 <code>--log-flush-frequency</code>。<br/> 当前非默认选择为 alpha,会随时更改而不会发出警告。 </td> </tr> <tr> -<td colspan="2">c -<!-- ---logtostderr     Default: true ---> ---logtostderr     默认值:true -</td> +<td colspan="2">--logtostderr     <!--Default:-->默认值:true</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- log to standard error instead of files --> -在标准错误而不是文件中输出日志记录 +在标准错误而不是文件中输出日志记录。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---master-service-namespace string     Default: "default" ---> ---master-service-namespace string     默认值:"default" -</td> +<td colspan="2">--master-service-namespace string     <!--Default:-->默认值:"default"</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1840,12 +1684,7 @@ If non-zero, throttle each user connection to this number of bytes/sec. Currentl </tr> <tr> -<td colspan="2"> -<!-- ---max-mutating-requests-inflight int     Default: 200 ---> ---max-mutating-requests-inflight int     默认值:200 -</td> +<td colspan="2">--max-mutating-requests-inflight int     <!--Default:-->默认值:200</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1860,12 +1699,7 @@ When the server exceeds this, it rejects requests. Zero for no limit. </tr> <tr> -<td colspan="2"> -<!-- ---max-requests-inflight int     Default: 400 ---> ---max-requests-inflight int     默认值:400 -</td> +<td colspan="2">--max-requests-inflight int     <!--Default:-->默认值:400</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1880,12 +1714,7 @@ When the server exceeds this, it rejects requests. Zero for no limit. </tr> <tr> -<td colspan="2"> -<!-- ---min-request-timeout int     Default: 1800 ---> ---min-request-timeout int     默认值:1800 -</td> +<td colspan="2">--min-request-timeout int     <!--Default:-->默认值:1800</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1896,7 +1725,8 @@ watch request handler, which picks a randomized value above this number as the connection timeout, to spread out load. --> 可选字段,表示处理程序在请求超时前,必须保持其处于打开状态的最小秒数。 -当前只对监听(Watch)请求的处理程序有效,它基于这个值选择一个随机数作为连接超时值,以达到分散负载的目的。 +当前只对监听(Watch)请求的处理程序有效,它基于这个值选择一个随机数作为连接超时值, +以达到分散负载的目的。 </td> </tr> @@ -1951,7 +1781,7 @@ This flag is experimental, please see the authentication documentation for furth If provided, all groups will be prefixed with this value to prevent conflicts with other authentication strategies. --> -如果提供,则所有组都将以该值作为前缀,以防止与其他身份认证策略冲突。 +如果提供了此值,则所有组都将以该值作为前缀,以防止与其他身份认证策略冲突。 </td> </tr> @@ -1970,7 +1800,7 @@ OpenID 颁发者 URL,只接受 HTTPS 方案。 </tr> <tr> -<td colspan="2">--oidc-required-claim mapStringString</td> +<td colspan="2">--oidc-required-claim <逗号分隔的 'key=value' 键值对列表></td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1986,12 +1816,7 @@ Repeat this flag to specify multiple claims. </tr> <tr> -<td colspan="2"> -<!-- ---oidc-signing-algs stringSlice     Default: [RS256] ---> ---oidc-signing-algs stringSlice     默认值:[RS256] -</td> +<td colspan="2">--oidc-signing-algs strings     <!--Default:-->默认值:RS256</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -2007,12 +1832,7 @@ Values are defined by RFC 7518 https://tools.ietf.org/html/rfc7518#section-3.1. </tr> <tr> -<td colspan="2"> -<!-- ---oidc-username-claim string     Default: "sub" ---> ---oidc-username-claim string     默认值:"sub" -</td> +<td colspan="2">--oidc-username-claim string     <!--Default:-->默认值:"sub"</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -2057,7 +1877,20 @@ If true, only write logs to their native severity level (vs also writing to each </tr> <tr> -<td colspan="2">--permit-port-sharing</td> +<td colspan="2">--permit-address-sharing     <!--Default:-->默认值:false</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p> +<!--If true, SO_REUSEADDR will be used when binding the port. This allows binding to wildcard IPs like 0.0.0.0 and specific IPs in parallel, and it avoids waiting for the kernel to release sockets in TIME_WAIT state. +--> +若此标志为 true,则使用 <tt>SO_REUSEADDR</tt> 来绑定端口。 +这样设置可以同时绑定到用通配符表示的类似 0.0.0.0 这种 IP 地址, +以及特定的 IP 地址。也可以避免等待内核释放 <tt>TIME_WAIT</tt> 状态的套接字。 +</p></td> +</tr> + +<tr> +<td colspan="2">--permit-port-sharing     <!--Default:-->默认值:false</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -2065,8 +1898,8 @@ If true, only write logs to their native severity level (vs also writing to each If true, SO_REUSEPORT will be used when binding the port, which allows more than one instance to bind on the same address and port. [default=false] --> -如果为 true,则在绑定端口时将使用 SO_REUSEPORT, -这样多个实例可以绑定到同一地址和端口上。[默认值 = false] +如果为 true,则在绑定端口时将使用 <tt>SO_REUSEPORT</tt>, +这样多个实例可以绑定到同一地址和端口上。 </td> </tr> @@ -2078,7 +1911,7 @@ which allows more than one instance to bind on the same address and port. [defau <!-- Enable profiling via web interface host:port/debug/pprof/ --> -通过 Web 界面启用性能分析 host:port/debug/pprof/ +通过 Web 接口 <code>host:port/debug/pprof/</code> 启用性能分析。 </td> </tr> @@ -2139,7 +1972,7 @@ for specific types of requests. </tr> <tr> -<td colspan="2">--requestheader-allowed-names stringSlice</td> +<td colspan="2">--requestheader-allowed-names strings</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -2150,8 +1983,9 @@ any client certificate validated by the authorities in --requestheader-client-ca-file is allowed. --> 此值为客户端证书通用名称(Common Name)的列表;表中所列的表项可以用来提供用户名, -方式是使用 --requestheader-username-headers 所指定的头部。 -如果为空,能够通过 --requestheader-client-ca-file 中机构认证的客户端证书都是被允许的。 +方式是使用 <code>--requestheader-username-headers</code> 所指定的头部。 +如果为空,能够通过 <code>--requestheader-client-ca-file</code> 中机构 +认证的客户端证书都是被允许的。 </td> </tr> @@ -2173,43 +2007,43 @@ depend on authorization being already done for incoming requests. </tr> <tr> -<td colspan="2">--requestheader-extra-headers-prefix stringSlice</td> +<td colspan="2">--requestheader-extra-headers-prefix strings</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- List of request header prefixes to inspect. X-Remote-Extra- is suggested. --> -用于查验请求头部的前缀列表。建议使用 X-Remote-Extra-。 +用于查验请求头部的前缀列表。建议使用 <code>X-Remote-Extra-</code>。 </td> </tr> <tr> -<td colspan="2">--requestheader-group-headers stringSlice</td> +<td colspan="2">--requestheader-group-headers strings</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- List of request headers to inspect for groups. X-Remote-Group is suggested. --> -用于查验用户组的请求头部列表。建议使用 X-Remote-Group。 +用于查验用户组的请求头部列表。建议使用 <code>X-Remote-Group</code>。 </td> </tr> <tr> -<td colspan="2">--requestheader-username-headers stringSlice</td> +<td colspan="2">--requestheader-username-headers strings</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- List of request headers to inspect for usernames. X-Remote-User is common. --> -用于查验用户名的请求头头列表。建议使用 X-Remote-User。 +用于查验用户名的请求头头列表。建议使用 <code>X-Remote-User</code>。 </td> </tr> <tr> -<td colspan="2">--runtime-config mapStringString</td> +<td colspan="2">--runtime-config <逗号分隔的 'key=value' 对列表></td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -2235,12 +2069,7 @@ A set of key=value pairs that enable or disable built-in APIs. Supported options </tr> <tr> -<td colspan="2"> -<!-- ---secure-port int     Default: 6443 ---> ---secure-port int     默认值:6443 -</td> +<td colspan="2">--secure-port int     <!--Default:-->默认值:6443</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -2311,7 +2140,7 @@ docand key set are served to relying parties from a URL other than the API server's external (as auto-detected or overridden with external-hostname). Only valid if the ServiceAccountIssuerDiscovery feature gate is enabled. --> -覆盖 /.well-known/openid-configuration 提供的发现文档中 JSON Web 密钥集的 URI。 +覆盖 <code>/.well-known/openid-configuration</code> 提供的发现文档中 JSON Web 密钥集的 URI。 如果发现文档和密钥集是通过 API 服务器外部 (而非自动检测到或被外部主机名覆盖)之外的 URL 提供给依赖方的,则此标志很有用。 仅在启用 ServiceAccountIssuerDiscovery 特性门控的情况下有效。 @@ -2319,7 +2148,7 @@ Only valid if the ServiceAccountIssuerDiscovery feature gate is enabled. </tr> <tr> -<td colspan="2">--service-account-key-file stringArray</td> +<td colspan="2">--service-account-key-file strings</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -2332,18 +2161,13 @@ Must be specified when --service-account-signing-key is provided --> 包含 PEM 编码的 x509 RSA 或 ECDSA 私钥或公钥的文件,用于验证 ServiceAccount 令牌。 指定的文件可以包含多个键,并且可以使用不同的文件多次指定标志。 -如果未指定,则使用 --tls-private-key-file。 -提供 --service-account-signing-key 时必须指定。 +如果未指定,则使用 <code>--tls-private-key-file</code>。 +提供 <code>--service-account-signing-key</code> 时必须指定。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---service-account-lookup     Default: true ---> ---service-account-lookup     默认值:true -</td> +<td colspan="2">--service-account-lookup     <!--Default:-->默认值:true</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -2399,7 +2223,7 @@ CIDR 表示的 IP 范围用来为服务分配集群 IP。 </tr> <tr> -<td colspan="2">--service-node-port-range portRange     <!--Default:-->默认值:30000-32767</td> +<td colspan="2">--service-node-port-range <形式为 'N1-N2' 的字符串>     <!--Default:-->默认值:30000-32767</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -2458,7 +2282,7 @@ This can be used to allow load balancer to stop sending traffic to this server. <!-- If true, avoid header prefixes in the log messages --> -如果为 true,日志消息中避免标题前缀 +如果为 true,日志消息中避免标题前缀。 </td> </tr> @@ -2470,12 +2294,12 @@ If true, avoid header prefixes in the log messages <!-- If true, avoid headers when opening log files --> -如果为 true,则在打开日志文件时避免标题 +如果为 true,则在打开日志文件时避免标题。 </td> </tr> <tr> -<td colspan="2">--stderrthreshold severity     <!--Default:-->默认值:2</td> +<td colspan="2">--stderrthreshold int     <!--Default:-->默认值:2</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -2512,6 +2336,21 @@ Some resources or storage backends may only support a specific media type and wi </td> </tr> +<tr> +<td colspan="2">--strict-transport-security-directives strings</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p> +<!-- +List of directives for HSTS, comma separated. If this list is empty, then HSTS directives will not be added. Example: 'max-age=31536000,includeSubDomains,preload' +--> +为 HSTS 所设置的指令列表,用逗号分隔。 +如果此列表为空,则不会添加 HSTS 指令。 +例如: 'max-age=31536000,includeSubDomains,preload' +</p></td> +</tr> + + <tr> <td colspan="2">--tls-cert-file string</td> </tr> @@ -2525,23 +2364,30 @@ a self-signed certificate and key are generated for the public address and saved to the directory specified by --cert-dir. --> 包含用于 HTTPS 的默认 x509 证书的文件。(CA 证书(如果有)在服务器证书之后并置)。 -如果启用了 HTTPS 服务,并且未提供 --tls-cert-file 和 --tls-private-key-file, -为公共地址生成一个自签名证书和密钥,并将其保存到 --cert-dir 指定的目录中。 +如果启用了 HTTPS 服务,并且未提供 <code>--tls-cert-file</code> 和 +<code>--tls-private-key-file</code>, +为公共地址生成一个自签名证书和密钥,并将其保存到 <code>--cert-dir</code> 指定的目录中。 </td> </tr> <tr> -<td colspan="2">--tls-cipher-suites stringSlice</td> +<td colspan="2">--tls-cipher-suites strings</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- Comma-separated list of cipher suites for the server. If omitted, the default Go cipher suites will be used. -<br/>Preferred values: TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384. <br/>Insecure values: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_RC4_128_SHA. +<br/>Preferred values: +TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384.<br/> +Insecure values: +TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_RC4_128_SHA. --> 服务器的密码套件的列表,以逗号分隔。如果省略,将使用默认的 Go 密码套件。 -<br/>首选值:TLS_AES_128_GCM_SHA256、TLS_AES_256_GCM_SHA384、TLS_CHACHA20_POLY1305_SHA256、TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA、TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256、TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA、TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384、TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305、TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256、TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA、TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA、TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256、TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA、TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384、TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305、TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256、TLS_RSA_WITH_3DES_EDE_CBC_SHA、TLS_RSA_WITH_AES_128_CBC_SHA、TLS_RSA_WITH_AES_128_GCM_SHA256、TLS_RSA_WTLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256、TLS_ECDHE_ECDSA_WITH_RC4_128_SHA、TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256、TLS_ECDHE_RSA_WITH_RC4_128_SHA、TLS_RSA_WITH_AES_128_CBC_SHA256、TLS_RSA_WITH_RC4_128_SHA。 +<br/>首选值: +TLS_AES_128_GCM_SHA256、TLS_AES_256_GCM_SHA384、TLS_CHACHA20_POLY1305_SHA256、TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA、TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256、TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA、TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384、TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305、TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256、TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA、TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA、TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256、TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA、TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384、TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305、TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256、TLS_RSA_WITH_3DES_EDE_CBC_SHA、TLS_RSA_WITH_AES_128_CBC_SHA、TLS_RSA_WITH_AES_128_GCM_SHA256、 TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384. +不安全的值有: +TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256、TLS_ECDHE_ECDSA_WITH_RC4_128_SHA、TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256、TLS_ECDHE_RSA_WITH_RC4_128_SHA、TLS_RSA_WITH_AES_128_CBC_SHA256、TLS_RSA_WITH_RC4_128_SHA。 </td> </tr> @@ -2565,17 +2411,12 @@ Minimum TLS version supported. Possible values: VersionTLS10, VersionTLS11, Vers <!-- File containing the default x509 private key matching --tls-cert-file. --> -包含匹配 --tls-cert-file 的 x509 证书私钥的文件。 +包含匹配 <code>--tls-cert-file</code> 的 x509 证书私钥的文件。 </td> </tr> <tr> -<td colspan="2"> -<!-- ---tls-sni-cert-key namedCertKey     Default: [] ---> ---tls-sni-cert-key namedCertKey     默认值:[] -</td> +<td colspan="2">--tls-sni-cert-key string     <!--Default:-->默认值: []</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -2595,8 +2436,8 @@ pairs, use the --tls-sni-cert-key multiple times. Examples: 域模式也允许使用 IP 地址,但仅当 apiserver 对客户端请求的IP地址具有可见性时,才应使用 IP。 如果未提供域模式,则提取证书的名称。 非通配符匹配优先于通配符匹配,显式域模式优先于提取出的名称。 -对于多个密钥/证书对,请多次使用 --tls-sni-cert-key。 -示例:"example.crt,example.key" 或 "foo.crt,foo.key:*.foo.com,foo.com"。 +对于多个密钥/证书对,请多次使用 <code>--tls-sni-cert-key</code>。 +示例:"example.crt,example.key" 或 "foo.crt,foo.key:\*.foo.com,foo.com"。 </td> </tr> @@ -2613,14 +2454,14 @@ If set, the file that will be used to secure the secure port of the API server v </tr> <tr> -<td colspan="2">-v, --v Level</td> +<td colspan="2">-v, --v int</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- number for the log level verbosity --> -日志级别详细程度的数字 +日志级别详细程度的数字。 </td> </tr> @@ -2637,14 +2478,14 @@ Print version information and quit </tr> <tr> -<td colspan="2">--vmodule moduleSpec</td> +<td colspan="2">--vmodule <用逗号分隔的多个 'pattern=N' 配置字符串></td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- comma-separated list of pattern=N settings for file-filtered logging --> -以逗号分隔的 pattern=N 设置列表,用于文件过滤的日志记录 +以逗号分隔的 <code>pattern=N</code> 设置列表,用于文件过滤的日志记录。 </td> </tr> @@ -2656,12 +2497,12 @@ comma-separated list of pattern=N settings for file-filtered logging <!-- Enable watch caching in the apiserver --> -在 apiserver 中启用监视缓存 +在 API 服务器中启用监视缓存。 </td> </tr> <tr> -<td colspan="2">--watch-cache-sizes stringSlice</td> +<td colspan="2">--watch-cache-sizes strings</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -2674,15 +2515,20 @@ watch-cache is enabled. Some resources (replicationcontrollers, endpoints, nodes pods, services, apiservices.apiregistration.k8s.io) have system defaults set by heuristics, others default to default-watch-cache-size --> -某些资源(pods、nodes 等)的监视缓存大小设置,以逗号分隔。 -每个资源对应的设置格式:resource[.group]#size,其中 resource 为小写复数(无版本), -对于 apiVersion v1(旧版核心 API)的资源要省略 group, -对其它资源要给出 group,size 为一个数字。 -启用 watch-cache 时,此功能生效。 -某些资源(replicationcontrollers、endpoints、nodes、pods、services、apiservices.apiregistration.k8s.io) -具有通过启发式设置的系统默认值,其他资源默认为 default-watch-cache-size +某些资源(Pods、Nodes 等)的监视缓存大小设置,以逗号分隔。 +每个资源对应的设置格式:<code>resource[.group]#size</code>,其中 +<code>resource</code> 为小写复数(无版本), +对于 apiVersion v1(旧版核心 API)的资源要省略 <code>group</code>, +对其它资源要给出 <code>group</code>;<code>size 为一个数字</code>。 +启用 <code>watch-cache</code> 时,此功能生效。 +某些资源(<code>replicationcontrollers</code>、<code>endpoints</code>、 +<code>nodes</code>、<code>pods</code>、<code>services</code>、 +<code>apiservices.apiregistration.k8s.io</code>) +具有通过启发式设置的系统默认值,其他资源默认为 +<code>default-watch-cache-size<code>。 </td> </tr> </tbody> </table> + From 895d59124e53e380dc476f12d60f67f28f0855b7 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Sun, 2 May 2021 12:31:38 +0000 Subject: [PATCH 134/221] Translate concepts/cluster-administration/system-logs into Japanese --- .../cluster-administration/system-logs.md | 96 ++++++++----------- 1 file changed, 40 insertions(+), 56 deletions(-) diff --git a/content/ja/docs/concepts/cluster-administration/system-logs.md b/content/ja/docs/concepts/cluster-administration/system-logs.md index 0466837356..cae76d7e34 100644 --- a/content/ja/docs/concepts/cluster-administration/system-logs.md +++ b/content/ja/docs/concepts/cluster-administration/system-logs.md @@ -1,72 +1,66 @@ --- -reviewers: -- dims -- 44past4 -title: System Logs +title: システムログ content_type: concept weight: 60 --- <!-- overview --> -System component logs record events happening in cluster, which can be very useful for debugging. -You can configure log verbosity to see more or less detail. -Logs can be as coarse-grained as showing errors within a component, or as fine-grained as showing step-by-step traces of events (like HTTP access logs, pod state changes, controller actions, or scheduler decisions). +システムコンポーネントのログは、クラスター内で起こったイベントを記録します。このログはデバッグのために非常に役立ちます。ログのverbosityを設定すると、ログをどの程度詳細に見るのかを変更できます。ログはコンポーネント内のエラーを表示する程度の荒い粒度にすることも、イベントのステップバイステップのトレース(HTTPのアクセスログ、Podの状態の変更、コントローラーの動作、スケジューラーの決定など)を表示するような細かい粒度に設定することもできます。 <!-- body --> -## Klog +## klog -klog is the Kubernetes logging library. [klog](https://github.com/kubernetes/klog) -generates log messages for the Kubernetes system components. +klogは、Kubernetesのログライブラリです。[klog](https://github.com/kubernetes/klog)は、Kubernetesのシステムコンポーネント向けのログメッセージを生成します。 -For more information about klog configuration, see the [Command line tool reference](/docs/reference/command-line-tools-reference/). +klogの設定に関する詳しい情報については、[コマンドラインツールのリファレンス](/docs/reference/command-line-tools-reference/)を参照してください。 + +klogネイティブ形式の例: -An example of the klog native format: ``` I1025 00:15:15.525108 1 httplog.go:79] GET /api/v1/namespaces/kube-system/pods/metrics-server-v0.3.1-57c75779f-9p8wg: (1.512ms) 200 [pod_nanny/v0.0.0 (linux/amd64) kubernetes/$Format 10.56.1.19:51756] ``` -### Structured Logging +### 構造化ログ {{< feature-state for_k8s_version="v1.19" state="alpha" >}} {{< warning >}} -Migration to structured log messages is an ongoing process. Not all log messages are structured in this version. When parsing log files, you must also handle unstructured log messages. +構造化ログへのマイグレーションは現在進行中の作業です。このバージョンでは、すべてのログメッセージが構造化されているわけではありません。ログファイルをパースする場合、JSONではないログの行にも対処しなければなりません。 -Log formatting and value serialization are subject to change. +ログの形式と値のシリアライズは変更される可能性があります。 {{< /warning>}} -Structured logging introduces a uniform structure in log messages allowing for programmatic extraction of information. You can store and process structured logs with less effort and cost. -New message format is backward compatible and enabled by default. +構造化ログは、ログメッセージに単一の構造を導入し、プログラムで情報の抽出ができるようにするものです。構造化ログは、僅かな労力とコストで保存・処理できます。新しいメッセージ形式は後方互換性があり、デフォルトで有効化されます。 -Format of structured logs: +構造化ログの形式: ```ini <klog header> "<message>" <key1>="<value1>" <key2>="<value2>" ... ``` -Example: +例: ```ini I1025 00:15:15.525108 1 controller_utils.go:116] "Pod status updated" pod="kube-system/kubedns" status="ready" ``` -### JSON log format +### JSONログ形式 {{< feature-state for_k8s_version="v1.19" state="alpha" >}} {{<warning >}} -JSON output does not support many standard klog flags. For list of unsupported klog flags, see the [Command line tool reference](/docs/reference/command-line-tools-reference/). +JSONの出力は多数の標準のklogフラグをサポートしていません。非対応のklogフラグの一覧については、[コマンドラインツールリファレンス](/docs/reference/command-line-tools-reference/)を参照してください。 -Not all logs are guaranteed to be written in JSON format (for example, during process start). If you intend to parse logs, make sure you can handle log lines that are not JSON as well. +すべてのログがJSON形式で書き込むことに対応しているわけではありません(たとえば、プロセスの開始時など)。ログのパースを行おうとしている場合、JSONではないログの行に対処できるようにしてください。 -Field names and JSON serialization are subject to change. +フィールド名とJSONのシリアライズは変更される可能性があります。 {{< /warning >}} -The `--logging-format=json` flag changes the format of logs from klog native format to JSON format. -Example of JSON log format (pretty printed): +`--logging-format=json`フラグは、ログの形式をネイティブ形式klogからJSON形式に変更します。以下は、JSONログ形式の例(pretty printしたもの)です。 + ```json { "ts": 1580306777.04728, @@ -80,63 +74,53 @@ Example of JSON log format (pretty printed): } ``` -Keys with special meaning: -* `ts` - timestamp as Unix time (required, float) -* `v` - verbosity (required, int, default 0) -* `err` - error string (optional, string) -* `msg` - message (required, string) +特別な意味を持つキー: +* `ts` - Unix時間のタイムスタンプ(必須、float) +* `v` - verbosity (必須、int、デフォルトは0) +* `err` - エラー文字列 (オプション、string) +* `msg` - メッセージ (必須、string) - -List of components currently supporting JSON format: +現在サポートされているJSONフォーマットの一覧: * {{< glossary_tooltip term_id="kube-controller-manager" text="kube-controller-manager" >}} * {{< 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" >}} -### Log sanitization +### ログのサニタイズ {{< feature-state for_k8s_version="v1.20" state="alpha" >}} {{<warning >}} -Log sanitization might incur significant computation overhead and therefore should not be enabled in production. +ログのサニタイズ大きな計算のオーバーヘッドを引き起こす可能性があるため、本番環境では有効にするべきではありません。 {{< /warning >}} -The `--experimental-logging-sanitization` flag enables the klog sanitization filter. -If enabled all log arguments are inspected for fields tagged as sensitive data (e.g. passwords, keys, tokens) and logging of these fields will be prevented. +`--experimental-logging-sanitization`フラグはklogのサニタイズフィルタを有効にします。有効にすると、すべてのログの引数が機密データ(パスワード、キー、トークンなど)としてタグ付けされたフィールドについて検査され、これらのフィールドのログの記録は防止されます。 -List of components currently supporting log sanitization: +現在ログのサニタイズをサポートしているコンポーネント一覧: * kube-controller-manager * kube-apiserver * kube-scheduler * kubelet {{< note >}} -The Log sanitization filter does not prevent user workload logs from leaking sensitive data. +ログのサニタイズフィルターは、ユーザーのワークロードのログが機密データを漏洩するのを防げるわけではありません。 {{< /note >}} -### Log verbosity level +### ログのverbosityレベル -The `-v` flag controls log verbosity. Increasing the value increases the number of logged events. Decreasing the value decreases the number of logged events. -Increasing verbosity settings logs increasingly less severe events. A verbosity setting of 0 logs only critical events. +`-v`フラグはログのverbosityを制御します。値を増やすとログに記録されるイベントの数が増えます。値を減らすとログに記録されるイベントの数が減ります。verbosityの設定を増やすと、ますます多くの深刻度の低いイベントをログに記録するようになります。verbosityの設定を0にすると、クリティカルなイベントだけをログに記録します。 -### Log location +### ログの場所 -There are two types of system components: those that run in a container and those -that do not run in a container. For example: +システムコンポーネントには2種類あります。コンテナ内で実行されるコンポーネントと、コンテナ内で実行されないコンポーネントです。たとえば、次のようなコンポーネントがあります。 -* The Kubernetes scheduler and kube-proxy run in a container. -* The kubelet and container runtime, for example Docker, do not run in containers. +* Kubernetesのスケジューラーやkube-proxyはコンテナ内で実行されます。 +* kubeletやDockerのようなコンテナランタイムはコンテナ内で実行されません。 -On machines with systemd, the kubelet and container runtime write to journald. -Otherwise, they write to `.log` files in the `/var/log` directory. -System components inside containers always write to `.log` files in the `/var/log` directory, -bypassing the default logging mechanism. -Similar to the container logs, you should rotate system component logs in the `/var/log` directory. -In Kubernetes clusters created by the `kube-up.sh` script, log rotation is configured by the `logrotate` tool. -The `logrotate` tool rotates logs daily, or once the log size is greater than 100MB. +systemdを使用しているマシンでは、kubeletとコンテナランタイムはjournaldに書き込みを行います。それ以外のマシンでは、`/var/log`ディレクトリ内の`.log`ファイルに書き込みます。コンテナ内部のシステムコンポーネントは、デフォルトのログ機構をバイパスするため、常に`/var/log`ディレクトリ内の`.log`ファイルに書き込みます。コンテナのログと同様に、`/var/log`ディレクトリ内のシステムコンポーネントのログはローテートする必要があります。`kube-up.sh`スクリプトによって作成されたKubernetesクラスターでは、ログローテーションは`logrotate`ツールで設定されます。`logrotate`ツールはログを1日ごとまたはログのサイズが100MBを超えたときにローテートします。 ## {{% heading "whatsnext" %}} -* Read about the [Kubernetes Logging Architecture](/docs/concepts/cluster-administration/logging/) -* Read about [Structured Logging](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/1602-structured-logging) -* Read about the [Conventions for logging severity](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/logging.md) +* [Kubernetesのログのアーキテクチャ](/docs/concepts/cluster-administration/logging/)について読む。 +* [構造化ログ](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/1602-structured-logging)について読む。 +* [ログの深刻度の慣習](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/logging.md)について読む。 From d3fd7174c7f66d00dd0008b80c119088849fa9e6 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Mon, 3 May 2021 11:37:13 +0900 Subject: [PATCH 135/221] Apply suggestions from code review Co-authored-by: makocchi <makocchi@gmail.com> --- content/ja/docs/concepts/cluster-administration/addons.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/ja/docs/concepts/cluster-administration/addons.md b/content/ja/docs/concepts/cluster-administration/addons.md index 72e9ebc39f..b50beb85f5 100644 --- a/content/ja/docs/concepts/cluster-administration/addons.md +++ b/content/ja/docs/concepts/cluster-administration/addons.md @@ -17,7 +17,7 @@ content_type: concept * [ACI](https://www.github.com/noironetworks/aci-containers)は、統合されたコンテナネットワークとネットワークセキュリティをCisco ACIを使用して提供します。 * [Antrea](https://antrea.io/)は、L3またはL4で動作して、Open vSwitchをネットワークデータプレーンとして活用する、Kubernetes向けのネットワークとセキュリティサービスを提供します。 -* [Calico](https://docs.projectcalico.org/latest/introduction/)はネットワークとネットワークプリシーのプロバイダーです。Calicoは、BGPを使用または未使用の非オーバーレイおよびオーバーレイネットワークを含む、フレキシブルなさまざまなネットワークオプションサポートします。Calicoはホスト、Pod、そして(IstioとEnvoyを使用している場合には)サービスメッシュ上のアプリケーションに対してネットワークポリシーを強制するために、同一のエンジンを使用します。 +* [Calico](https://docs.projectcalico.org/latest/introduction/)はネットワークとネットワークプリシーのプロバイダーです。Calicoは、BGPを使用または未使用の非オーバーレイおよびオーバーレイネットワークを含む、フレキシブルなさまざまなネットワークオプションをサポートします。Calicoはホスト、Pod、そして(IstioとEnvoyを使用している場合には)サービスメッシュ上のアプリケーションに対してネットワークポリシーを強制するために、同一のエンジンを使用します。 * [Canal](https://github.com/tigera/canal/tree/master/k8s-install)はFlannelとCalicoをあわせたもので、ネットワークとネットワークポリシーを提供します。 * [Cilium](https://github.com/cilium/cilium)は、L3のネットワークとネットワークポリシーのプラグインで、HTTP/API/L7のポリシーを透過的に強制できます。ルーティングとoverlay/encapsulationモードの両方をサポートしており、他のCNIプラグイン上で機能できます。 * [CNI-Genie](https://github.com/Huawei-PaaS/CNI-Genie)は、KubernetesをCalico、Canal、Flannel、Romana、Weaveなど選択したCNIプラグインをシームレスに接続できるようにするプラグインです。 @@ -25,7 +25,7 @@ content_type: concept * [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などのオーケストレーションシステムと統合されており、仮想マシン、コンテナ/Pod、ベアメタルのワークロードに隔離モードを提供します。 * [Flannel](https://github.com/coreos/flannel/blob/master/Documentation/kubernetes.md)は、Kubernetesで使用できるオーバーレイネットワークプロバイダーです。 * [Knitter](https://github.com/ZTE/Knitter/)は、1つのKubernetes Podで複数のネットワークインターフェイスをサポートするためのプラグインです。 -* [Multus](https://github.com/Intel-Corp/multus-cni)は、すべてのCNIプラグイン(たとえば、Calico、Cilium、Contiv、Flannel)に加えて、SRIOV、DPDK、OVS-DPDK、VPPをベースとするKubernetes上のワークロードをサポートする、複数のネットワークサポートのためのMultiプラグインです。 +* [Multus](https://github.com/Intel-Corp/multus-cni)は、すべてのCNIプラグイン(たとえば、Calico、Cilium、Contiv、Flannel)に加えて、SRIOV、DPDK、OVS-DPDK、VPPをベースとするKubernetes上のワークロードをサポートする、複数のネットワークサポートのためのマルチプラグインです。 * [OVN-Kubernetes](https://github.com/ovn-org/ovn-kubernetes/)は、Open vSwitch(OVS)プロジェクトから生まれた仮想ネットワーク実装である[OVN(Open Virtual Network)](https://github.com/ovn-org/ovn/)をベースとする、Kubernetesのためのネットワークプロバイダです。OVN-Kubernetesは、OVSベースのロードバランサーおよびネットワークポリシーの実装を含む、Kubernetes向けのオーバーレイベースのネットワーク実装を提供します。 * [OVN4NFV-K8S-Plugin](https://github.com/opnfv/ovn4nfv-k8s-plugin)は、クラウドネイティブベースのService function chaining(SFC)、Multiple OVNオーバーレイネットワーク、動的なサブネットの作成、動的な仮想ネットワークの作成、VLANプロバイダーネットワーク、Directプロバイダーネットワークを提供し、他のMulti-networkプラグインと付け替え可能なOVNベースのCNIコントローラープラグインです。 * [NSX-T](https://docs.vmware.com/en/VMware-NSX-T/2.0/nsxt_20_ncp_kubernetes.pdf) Container Plug-in(NCP)は、VMware NSX-TとKubernetesなどのコンテナオーケストレーター間のインテグレーションを提供します。また、NSX-Tと、Pivotal Container Service(PKS)とOpenShiftなどのコンテナベースのCaaS/PaaSプラットフォームとのインテグレーションも提供します。 @@ -50,4 +50,4 @@ content_type: concept いくつかのアドオンは、廃止された[cluster/addons](https://git.k8s.io/kubernetes/cluster/addons)ディレクトリに掲載されています。 -よくメンテナンスされたアドオンはここにリンクしてください。PRを歓迎しています。 \ No newline at end of file +よくメンテナンスされたアドオンはここにリンクしてください。PRを歓迎しています。 From cb894d47f2809fc18f78b2edd75544f75e1dff87 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Sun, 9 May 2021 09:37:42 +0000 Subject: [PATCH 136/221] Copy content/en/docs/concepts/configuration/organize-cluster-access-kubeconfig.md for translation --- .../organize-cluster-access-kubeconfig.md | 157 ++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 content/ja/docs/concepts/configuration/organize-cluster-access-kubeconfig.md diff --git a/content/ja/docs/concepts/configuration/organize-cluster-access-kubeconfig.md b/content/ja/docs/concepts/configuration/organize-cluster-access-kubeconfig.md new file mode 100644 index 0000000000..df767bbc3e --- /dev/null +++ b/content/ja/docs/concepts/configuration/organize-cluster-access-kubeconfig.md @@ -0,0 +1,157 @@ +--- +title: Organizing Cluster Access Using kubeconfig Files +content_type: concept +weight: 60 +--- + +<!-- overview --> + +Use kubeconfig files to organize information about clusters, users, namespaces, and +authentication mechanisms. The `kubectl` command-line tool uses kubeconfig files to +find the information it needs to choose a cluster and communicate with the API server +of a cluster. + +{{< note >}} +A file that is used to configure access to clusters is called +a *kubeconfig file*. This is a generic way of referring to configuration files. +It does not mean that there is a file named `kubeconfig`. +{{< /note >}} + +By default, `kubectl` looks for a file named `config` in the `$HOME/.kube` directory. +You can specify other kubeconfig files by setting the `KUBECONFIG` environment +variable or by setting the +[`--kubeconfig`](/docs/reference/generated/kubectl/kubectl/) flag. + +For step-by-step instructions on creating and specifying kubeconfig files, see +[Configure Access to Multiple Clusters](/docs/tasks/access-application-cluster/configure-access-multiple-clusters). + + + + +<!-- body --> + +## Supporting multiple clusters, users, and authentication mechanisms + +Suppose you have several clusters, and your users and components authenticate +in a variety of ways. For example: + +- A running kubelet might authenticate using certificates. +- A user might authenticate using tokens. +- Administrators might have sets of certificates that they provide to individual users. + +With kubeconfig files, you can organize your clusters, users, and namespaces. +You can also define contexts to quickly and easily switch between +clusters and namespaces. + +## Context + +A *context* element in a kubeconfig file is used to group access parameters +under a convenient name. Each context has three parameters: cluster, namespace, and user. +By default, the `kubectl` command-line tool uses parameters from +the *current context* to communicate with the cluster. + +To choose the current context: +``` +kubectl config use-context +``` + +## The KUBECONFIG environment variable + +The `KUBECONFIG` environment variable holds a list of kubeconfig files. +For Linux and Mac, the list is colon-delimited. For Windows, the list +is semicolon-delimited. The `KUBECONFIG` environment variable is not +required. If the `KUBECONFIG` environment variable doesn't exist, +`kubectl` uses the default kubeconfig file, `$HOME/.kube/config`. + +If the `KUBECONFIG` environment variable does exist, `kubectl` uses +an effective configuration that is the result of merging the files +listed in the `KUBECONFIG` environment variable. + +## Merging kubeconfig files + +To see your configuration, enter this command: + +```shell +kubectl config view +``` + +As described previously, the output might be from a single kubeconfig file, +or it might be the result of merging several kubeconfig files. + +Here are the rules that `kubectl` uses when it merges kubeconfig files: + +1. If the `--kubeconfig` flag is set, use only the specified file. Do not merge. + Only one instance of this flag is allowed. + + Otherwise, if the `KUBECONFIG` environment variable is set, use it as a + list of files that should be merged. + Merge the files listed in the `KUBECONFIG` environment variable + according to these rules: + + * Ignore empty filenames. + * Produce errors for files with content that cannot be deserialized. + * The first file to set a particular value or map key wins. + * Never change the value or map key. + Example: Preserve the context of the first file to set `current-context`. + Example: If two files specify a `red-user`, use only values from the first file's `red-user`. + Even if the second file has non-conflicting entries under `red-user`, discard them. + + For an example of setting the `KUBECONFIG` environment variable, see + [Setting the KUBECONFIG environment variable](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#set-the-kubeconfig-environment-variable). + + Otherwise, use the default kubeconfig file, `$HOME/.kube/config`, with no merging. + +1. Determine the context to use based on the first hit in this chain: + + 1. Use the `--context` command-line flag if it exists. + 1. Use the `current-context` from the merged kubeconfig files. + + An empty context is allowed at this point. + +1. Determine the cluster and user. At this point, there might or might not be a context. + Determine the cluster and user based on the first hit in this chain, + which is run twice: once for user and once for cluster: + + 1. Use a command-line flag if it exists: `--user` or `--cluster`. + 1. If the context is non-empty, take the user or cluster from the context. + + The user and cluster can be empty at this point. + +1. Determine the actual cluster information to use. At this point, there might or + might not be cluster information. + Build each piece of the cluster information based on this chain; the first hit wins: + + 1. Use command line flags if they exist: `--server`, `--certificate-authority`, `--insecure-skip-tls-verify`. + 1. If any cluster information attributes exist from the merged kubeconfig files, use them. + 1. If there is no server location, fail. + +1. Determine the actual user information to use. Build user information using the same + rules as cluster information, except allow only one authentication + technique per user: + + 1. Use command line flags if they exist: `--client-certificate`, `--client-key`, `--username`, `--password`, `--token`. + 1. Use the `user` fields from the merged kubeconfig files. + 1. If there are two conflicting techniques, fail. + +1. For any information still missing, use default values and potentially + prompt for authentication information. + +## File references + +File and path references in a kubeconfig file are relative to the location of the kubeconfig file. +File references on the command line are relative to the current working directory. +In `$HOME/.kube/config`, relative paths are stored relatively, and absolute paths +are stored absolutely. + + + + +## {{% heading "whatsnext" %}} + + +* [Configure Access to Multiple Clusters](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/) +* [`kubectl config`](/docs/reference/generated/kubectl/kubectl-commands#config) + + + + From 0e8b3e4aa818f764b6e90a30f1dd31cff044fa3f Mon Sep 17 00:00:00 2001 From: Arhell <arhell333@gmail.com> Date: Wed, 12 May 2021 00:43:17 +0300 Subject: [PATCH 137/221] [ja] Update HAProxy Protocol Link --- content/ja/docs/tutorials/services/source-ip.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/tutorials/services/source-ip.md b/content/ja/docs/tutorials/services/source-ip.md index 505ba8ef45..6e52a1c9b3 100644 --- a/content/ja/docs/tutorials/services/source-ip.md +++ b/content/ja/docs/tutorials/services/source-ip.md @@ -392,7 +392,7 @@ client_address=198.51.100.79 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](https://www.haproxy.org/download/1.5/doc/proxy-protocol.txt)などの、ロードバランサーとバックエンドの間で合意されたプロトコルを使用する必要があります。2つ目のカテゴリーのロードバランサーの場合、Serviceの`service.spec.healthCheckNodePort`フィールドに保存されたポートを指すHTTPのヘルスチェックを作成することで、上記の機能を活用できます。 +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](https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt)などの、ロードバランサーとバックエンドの間で合意されたプロトコルを使用する必要があります。2つ目のカテゴリーのロードバランサーの場合、Serviceの`service.spec.healthCheckNodePort`フィールドに保存されたポートを指すHTTPのヘルスチェックを作成することで、上記の機能を活用できます。 ## {{% heading "cleanup" %}} From e3c8fb1313c82d49ddfad7426f265294eb32a686 Mon Sep 17 00:00:00 2001 From: Arhell <arhell333@gmail.com> Date: Thu, 13 May 2021 00:34:06 +0300 Subject: [PATCH 138/221] [ja] fix invalid location --- content/ja/docs/tutorials/stateless-application/guestbook.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/tutorials/stateless-application/guestbook.md b/content/ja/docs/tutorials/stateless-application/guestbook.md index aff86a2289..82e38a56d2 100644 --- a/content/ja/docs/tutorials/stateless-application/guestbook.md +++ b/content/ja/docs/tutorials/stateless-application/guestbook.md @@ -199,7 +199,7 @@ Deploymentはマニフェストファイル内に書かれた設定に基づい ### フロントエンドのServiceを作成する -適用した`redis-slave`および`redis-master` Serviceは、コンテナクラスター内部からのみアクセス可能です。これは、デフォルトのServiceのtypeが[ClusterIP](/docs/concepts/services-networking/service/#publishing-services---service-types)であるためです。`ClusterIP`は、Serviceが指している一連のPodに対して1つのIPアドレスを提供します。このIPアドレスはクラスター内部からのみアクセスできます。 +適用した`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`でのみ公開できます。 From c184f20f76eaf58ece0ef14e025da1a4fa9d4f0d Mon Sep 17 00:00:00 2001 From: Shannon Kularathna <shannduin@google.com> Date: Mon, 26 Apr 2021 21:46:50 +0000 Subject: [PATCH 139/221] Create pod eviction concept and glossary entries - Created glossary entries for manual and kubelet eviction - Created node-pressure-eviction.md and api-eviction.md - Merged content from eviction-policy.md and out-of-resource.md - Added note to kube-scheduler about node conditions - Deleted eviction-policy and out-of-resource.md - Redirected old topics - Change topic weights --- .../concepts/scheduling-eviction/_index.md | 26 ++ .../scheduling-eviction/api-eviction.md | 19 + .../scheduling-eviction/eviction-policy.md | 24 - .../scheduling-eviction/kube-scheduler.md | 2 - .../node-pressure-eviction.md | 411 ++++++++++++++++++ .../scheduling-eviction/pod-overhead.md | 2 +- .../pod-priority-preemption.md | 6 +- .../resource-bin-packing.md | 2 +- .../scheduler-perf-tuning.md | 2 +- .../scheduling-framework.md | 2 +- .../docs/reference/glossary/api-eviction.md | 22 + .../glossary/node-pressure-eviction.md | 23 + .../docs/reference/glossary/pod-disruption.md | 19 + .../administer-cluster/out-of-resource.md | 354 --------------- static/_redirects | 4 +- 15 files changed, 531 insertions(+), 387 deletions(-) create mode 100644 content/en/docs/concepts/scheduling-eviction/api-eviction.md delete mode 100644 content/en/docs/concepts/scheduling-eviction/eviction-policy.md create mode 100644 content/en/docs/concepts/scheduling-eviction/node-pressure-eviction.md create mode 100644 content/en/docs/reference/glossary/api-eviction.md create mode 100644 content/en/docs/reference/glossary/node-pressure-eviction.md create mode 100644 content/en/docs/reference/glossary/pod-disruption.md delete mode 100644 content/en/docs/tasks/administer-cluster/out-of-resource.md diff --git a/content/en/docs/concepts/scheduling-eviction/_index.md b/content/en/docs/concepts/scheduling-eviction/_index.md index 79fca8e597..21e9371f03 100644 --- a/content/en/docs/concepts/scheduling-eviction/_index.md +++ b/content/en/docs/concepts/scheduling-eviction/_index.md @@ -1,11 +1,37 @@ --- title: "Scheduling, Preemption and Eviction" weight: 90 +content_type: concept description: > In Kubernetes, scheduling refers to making sure that Pods are matched to Nodes so that the kubelet can run them. Preemption is the process of terminating Pods with lower Priority so that Pods with higher Priority can schedule on Nodes. Eviction is the process of proactively terminating one or more Pods on resource-starved Nodes. +no_list: true --- +In Kubernetes, scheduling refers to making sure that {{<glossary_tooltip text="Pods" term_id="pod">}} +are matched to {{<glossary_tooltip text="Nodes" term_id="node">}} so that the +{{<glossary_tooltip text="kubelet" term_id="kubelet">}} can run them. Preemption +is the process of terminating Pods with lower {{<glossary_tooltip text="Priority" term_id="pod-priority">}} +so that Pods with higher Priority can schedule on Nodes. Eviction is the process +of terminating one or more Pods on Nodes. + +## Scheduling + +* [Kubernetes Scheduler](/docs/concepts/scheduling-eviction/kube-scheduler/) +* [Assigning Pods to Nodes](/docs/concepts/scheduling-eviction/assign-pod-node/) +* [Pod Overhead](/docs/concepts/scheduling-eviction/pod-overhead/) +* [Taints and Tolerations](/docs/concepts/scheduling-eviction/taint-and-toleration/) +* [Scheduling Framework](/docs/concepts/scheduling-eviction/scheduling-framework) +* [Scheduler Performance Tuning](/docs/concepts/scheduling-eviction/scheduler-perf-tuning/) +* [Resource Bin Packing for Extended Resources](/docs/concepts/scheduling-eviction/resource-bin-packing/) + +## Pod Disruption + +{{<glossary_definition term_id="pod-disruption" length="all">}} + +* [Pod Priority and Preemption](/docs/concepts/scheduling-eviction/pod-priority-preemption/) +* [Node-pressure Eviction](/docs/concepts/scheduling-eviction/node-pressure-eviction/) +* [API-initiated Eviction](/docs/concepts/scheduling-eviction/api-eviction/) diff --git a/content/en/docs/concepts/scheduling-eviction/api-eviction.md b/content/en/docs/concepts/scheduling-eviction/api-eviction.md new file mode 100644 index 0000000000..e7f1942df2 --- /dev/null +++ b/content/en/docs/concepts/scheduling-eviction/api-eviction.md @@ -0,0 +1,19 @@ +--- +title: API-initiated Eviction +content_type: concept +weight: 70 +--- + +{{< glossary_definition term_id="api-eviction" length="short" >}} </br> + +You can request eviction by directly calling the Eviction API +using a client of the kube-apiserver, like the `kubectl drain` command. +This creates an `Eviction` object, which causes the API server to terminate the Pod. + +API-initiated evictions respect your configured [`PodDisruptionBudgets`](/docs/tasks/run-application/configure-pdb/) +and [`terminationGracePeriodSeconds`](/docs/concepts/workloads/pods/pod-lifecycle#pod-termination). + +## {{% heading "whatsnext" %}} + +* Learn about [Node-pressure Eviction](/docs/concepts/scheduling-eviction/node-pressure-eviction/) +* Learn about [Pod Priority and Preemption](/docs/concepts/scheduling-eviction/pod-priority-preemption/) diff --git a/content/en/docs/concepts/scheduling-eviction/eviction-policy.md b/content/en/docs/concepts/scheduling-eviction/eviction-policy.md deleted file mode 100644 index b63c729696..0000000000 --- a/content/en/docs/concepts/scheduling-eviction/eviction-policy.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Eviction Policy -content_type: concept -weight: 60 ---- - -<!-- overview --> - -This page is an overview of Kubernetes' policy for eviction. - -<!-- body --> - -## Eviction Policy - -The {{< glossary_tooltip text="kubelet" term_id="kubelet" >}} proactively monitors for -and prevents total starvation of a compute resource. In those cases, the `kubelet` can reclaim -the starved resource by failing one or more Pods. When the `kubelet` fails -a Pod, it terminates all of its containers and transitions its `PodPhase` to `Failed`. -If the evicted Pod is managed by a Deployment, the Deployment creates another Pod -to be scheduled by Kubernetes. - -## {{% heading "whatsnext" %}} - -- Learn how to [configure out of resource handling](/docs/tasks/administer-cluster/out-of-resource/) with eviction signals and thresholds. diff --git a/content/en/docs/concepts/scheduling-eviction/kube-scheduler.md b/content/en/docs/concepts/scheduling-eviction/kube-scheduler.md index 0944ecc768..52c8fd417e 100644 --- a/content/en/docs/concepts/scheduling-eviction/kube-scheduler.md +++ b/content/en/docs/concepts/scheduling-eviction/kube-scheduler.md @@ -77,11 +77,9 @@ one of these at random. There are two supported ways to configure the filtering and scoring behavior of the scheduler: - 1. [Scheduling Policies](/docs/reference/scheduling/policies) allow you to configure _Predicates_ for filtering and _Priorities_ for scoring. 1. [Scheduling Profiles](/docs/reference/scheduling/config/#profiles) allow you to configure Plugins that implement different scheduling stages, including: `QueueSort`, `Filter`, `Score`, `Bind`, `Reserve`, `Permit`, and others. You can also configure the kube-scheduler to run different profiles. - ## {{% heading "whatsnext" %}} * Read about [scheduler performance tuning](/docs/concepts/scheduling-eviction/scheduler-perf-tuning/) diff --git a/content/en/docs/concepts/scheduling-eviction/node-pressure-eviction.md b/content/en/docs/concepts/scheduling-eviction/node-pressure-eviction.md new file mode 100644 index 0000000000..1f1fcd9991 --- /dev/null +++ b/content/en/docs/concepts/scheduling-eviction/node-pressure-eviction.md @@ -0,0 +1,411 @@ +--- +title: Node-pressure Eviction +content_type: concept +weight: 60 +--- + +{{<glossary_definition term_id="node-pressure-eviction" length="short">}}</br> + +The {{<glossary_tooltip term_id="kubelet" text="kubelet">}} monitors resources +like CPU, memory, disk space, and filesystem inodes on your cluster's nodes. +When one or more of these resources reach specific consumption levels, the +kubelet can proactively fail one or more pods on the node to reclaim resources +and prevent starvation. + +During a node-pressure eviction, the kubelet sets the `PodPhase` for the +selected pods to `Failed`. This terminates the pods. + +Node-pressure eviction is not the same as +[API-initiated eviction](/docs/concepts/scheduling-eviction/eviction/#api-eviction). + +The kubelet does not respect your configured `PodDisruptionBudget` or the pod's +`terminationGracePeriodSeconds`. If you use [soft eviction thresholds](#soft-eviction-thresholds), +the kubelet respects your configured `eviction-max-pod-grace-period`. If you use +[hard eviction thresholds](#hard-eviction-thresholds), it uses a `0s` grace period for termination. + +If the pods are managed by a {{< glossary_tooltip text="workload" term_id="workload" >}} +resource (such as {{< glossary_tooltip text="StatefulSet" term_id="statefulset" >}} +or {{< glossary_tooltip text="Deployment" term_id="deployment" >}}) that +replaces failed pods, the control plane or `kube-controller-manager` creates new +pods in place of the evicted pods. + +{{<note>}} +The kubelet attempts to [reclaim node-level resources](#reclaim-node-resources) +before it terminates end-user pods. For example, it removes unused container +images when disk resources are starved. +{{</note>}} + +The kubelet uses various parameters to make eviction decisions, like the following: + + * Eviction signals + * Eviction thresholds + * Monitoring intervals + +### Eviction signals {#eviction-signals} + +Eviction signals are the current state of a particular resource at a specific +point in time. Kubelet uses eviction signals to make eviction decisions by +comparing the signals to eviction thresholds, which are the minimum amount of +the resource that should be available on the node. + +Kubelet uses the following eviction signals: + +| Eviction Signal | Description | +|----------------------|---------------------------------------------------------------------------------------| +| `memory.available` | `memory.available` := `node.status.capacity[memory]` - `node.stats.memory.workingSet` | +| `nodefs.available` | `nodefs.available` := `node.stats.fs.available` | +| `nodefs.inodesFree` | `nodefs.inodesFree` := `node.stats.fs.inodesFree` | +| `imagefs.available` | `imagefs.available` := `node.stats.runtime.imagefs.available` | +| `imagefs.inodesFree` | `imagefs.inodesFree` := `node.stats.runtime.imagefs.inodesFree` | +| `pid.available` | `pid.available` := `node.stats.rlimit.maxpid` - `node.stats.rlimit.curproc` | + +In this table, the `Description` column shows how kubelet gets the value of the +signal. Each signal supports either a percentage or a literal value. Kubelet +calculates the percentage value relative to the total capacity associated with +the signal. + +The value for `memory.available` is derived from the cgroupfs instead of tools +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](/examples/admin/resource/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 +memory is reclaimable under pressure. + +The kubelet supports the following filesystem partitions: + +1. `nodefs`: The node's main filesystem, used for local disk volumes, emptyDir, + log storage, and more. For example, `nodefs` contains `/var/lib/kubelet/`. +1. `imagefs`: An optional filesystem that container runtimes use to store container + images and container writable layers. + +Kubelet auto-discovers these filesystems and ignores other filesystems. Kubelet +does not support other configurations. + +{{<note>}} +Some kubelet garbage collection features are deprecated in favor of eviction. +For a list of the deprecated features, see [kubelet garbage collection deprecation](/docs/concepts/cluster-administration/kubelet-garbage-collection/#deprecation). +{{</note>}} + +### Eviction thresholds + +You can specify custom eviction thresholds for the kubelet to use when it makes +eviction decisions. + +Eviction thresholds have the form `[eviction-signal][operator][quantity]`, where: + +* `eviction-signal` is the [eviction signal](#eviction-signals) to use. +* `operator` is the [relational operator](https://en.wikipedia.org/wiki/Relational_operator#Standard_relational_operators) + you want, such as `<` (less than). +* `quantity` is the eviction threshold amount, such as `1Gi`. The value of `quantity` + must match the quantity representation used by Kubernetes. You can use either + literal values or percentages (`%`). + +For example, if a node has `10Gi` of total memory and you want trigger eviction if +the available memory falls below `1Gi`, you can define the eviction threshold as +either `memory.available<10%` or `memory.available<1Gi`. You cannot use both. + +You can configure soft and hard eviction thresholds. + +#### Soft eviction thresholds {#soft-eviction-thresholds} + +A soft eviction threshold pairs an eviction threshold with a required +administrator-specified grace period. The kubelet does not evict pods until the +grace period is exceeded. The kubelet returns an error on startup if there is no +specified grace period. + +You can specify both a soft eviction threshold grace period and a maximum +allowed pod termination grace period for kubelet to use during evictions. If you +specify a maximum allowed grace period and the soft eviction threshold is met, +the kubelet uses the lesser of the two grace periods. If you do not specify a +maximum allowed grace period, the kubelet kills evicted pods immediately without +graceful termination. + +You can use the following flags to configure soft eviction thresholds: + +* `eviction-soft`: A set of eviction thresholds like `memory.available<1.5Gi` + that can trigger pod eviction if held over the specified grace period. +* `eviction-soft-grace-period`: A set of eviction grace periods like `memory.available=1m30s` + that define how long a soft eviction threshold must hold before triggering a Pod eviction. +* `eviction-max-pod-grace-period`: The maximum allowed grace period (in seconds) + to use when terminating pods in response to a soft eviction threshold being met. + +#### Hard eviction thresholds {#hard-eviction-thresholds} + +A hard eviction threshold has no grace period. When a hard eviction threshold is +met, the kubelet kills pods immediately without graceful termination to reclaim +the starved resource. + +You can use the `eviction-hard` flag to configure a set of hard eviction +thresholds like `memory.available<1Gi`. + +The kubelet has the following default hard eviction thresholds: + +* `memory.available<100Mi` +* `nodefs.available<10%` +* `imagefs.available<15%` +* `nodefs.inodesFree<5%` (Linux nodes) + +### Eviction monitoring interval + +The kubelet evaluates eviction thresholds based on its configured `housekeeping-interval` +which defaults to `10s`. + +### Node conditions {#node-conditions} + +The kubelet reports node conditions to reflect that the node is under pressure +because hard or soft eviction threshold is met, independent of configured grace +periods. + +The kubelet maps eviction signals to node conditions as follows: + +| Node Condition | Eviction Signal | Description | +|-------------------|---------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------| +| `MemoryPressure` | `memory.available` | Available memory on the node has satisfied an eviction threshold | +| `DiskPressure` | `nodefs.available`, `nodefs.inodesFree`, `imagefs.available`, or `imagefs.inodesFree` | Available disk space and inodes on either the node's root filesystem or image filesystem has satisfied an eviction threshold | +| `PIDPressure` | `pid.available` | Available processes identifiers on the (Linux) node has fallen below an eviction threshold | + +The kubelet updates the node conditions based on the configured +`--node-status-update-frequency`, which defaults to `10s`. + +#### Node condition oscillation + +In some cases, nodes oscillate above and below soft eviction thresholds without +holding for the defined grace periods. This causes the reported node condition +to constantly switch between `true` and `false`, leading to bad eviction decisions. + +To protect against oscillation, you can use the `eviction-pressure-transition-period` +flag, which controls how long the kubelet must wait before transitioning a node +condition to a different state. The transition period has a default value of `5m`. + +### Reclaiming node level resources {#reclaim-node-resources} + +The kubelet tries to reclaim node-level resources before it evicts end-user pods. + +When a `DiskPressure` node condition is reported, the kubelet reclaims node-level +resources based on the filesystems on the node. + +#### With `imagefs` + +If the node has a dedicated `imagefs` filesystem for container runtimes to use, +the kubelet does the following: + + * If the `nodefs` filesystem meets the eviction threshlds, the kubelet garbage collects + dead pods and containers. + * If the `imagefs` filesystem meets the eviction thresholds, the kubelet + deletes all unused images. + +#### Without `imagefs` + +If the node only has a `nodefs` filesystem that meets eviction thresholds, +the kubelet frees up disk space in the following order: + +1. Garbage collect dead pods and containers +1. Delete unused images + +### Pod selection for kubelet eviction + +If the kubelet's attempts to reclaim node-level resources don't bring the eviction +signal below the threshold, the kubelet begins to evict end-user pods. + +The kubelet uses the following parameters to determine pod eviction order: + +1. Whether the pod's resource usage exceeds requests +1. [Pod Priority](/docs/concepts/configuration/pod-priority-preemption/) +1. The pod's resource usage relative to requests + +As a result, kubelet ranks and evicts pods in the following order: + +1. `BestEffort` or `Burstable` pods where the usage exceeds requests. These pods + are evicted based on their Priority and then by how much their usage level + exceeds the request. +1. `Guaranteed` pods and `Burstable` pods where the usage is less than requests + are evicted last, based on their Priority. + +{{<note>}} +The kubelet does not use the pod's QoS class to determine the eviction order. +You can use the QoS class to estimate the most likely pod eviction order when +reclaiming resources like memory. QoS does not apply to EphemeralStorage requests, +so the above scenario will not apply if the node is, for example, under `DiskPressure`. +{{</note>}} + +`Guaranteed` pods are guaranteed only when requests and limits are specified for +all the containers and they are equal. These pods will never be evicted because +of another pod's resource consumption. If a system daemon (such as `kubelet`, +`docker`, and `journald`) is consuming more resources than were reserved via +`system-reserved` or `kube-reserved` allocations, and the node only has +`Guaranteed` or `Burstable` pods using less resources than requests left on it, +then the kubelet must choose to evict one of these pods to preserve node stability +and to limit the impact of resource starvation on other pods. In this case, it +will choose to evict pods of lowest Priority first. + +When the kubelet evicts pods in response to `inode` or `PID` starvation, it uses +the Priority to determine the eviction order, because `inodes` and `PIDs` have no +requests. + +The kubelet sorts pods differently based on whether the node has a dedicated +`imagefs` filesystem: + +#### With `imagefs` + +If `nodefs` is triggering evictions, the kubelet sorts pods based on `nodefs` +usage (`local volumes + logs of all containers`). + +If `imagefs` is triggering evictions, the kubelet sorts pods based on the +writable layer usage of all containers. + +#### Without `imagefs` + +If `nodefs` is triggering evictions, the kubelet sorts pods based on their total +disk usage (`local volumes + logs & writable layer of all containers`) + +### Minimum eviction reclaim + +In some cases, pod eviction only reclaims a small amount of the starved resource. +This can lead to the kubelet repeatedly hitting the configured eviction thresholds +and triggering multiple evictions. + +You can use the `--eviction-minimum-reclaim` flag or a [kubelet config file](/docs/tasks/administer-cluster/kubelet-config-file/) +to configure a minimum reclaim amount for each resource. When the kubelet notices +that a resource is starved, it continues to reclaim that resource until it +reclaims the quantity you specify. + +For example, the following configuration sets minimum reclaim amounts: + +```yaml +apiVersion: kubelet.config.k8s.io/v1beta1 +kind: KubeletConfiguration +evictionHard: + memory.available: "500Mi" + nodefs.available: "1Gi" + imagefs.available: "100Gi" +evictionMinimumReclaim: + memory.available: "0Mi" + nodefs.available: "500Mi" + imagefs.available: "2Gi" +``` + +In this example, if the `nodefs.available` signal meets the eviction threshold, +the kubelet reclaims the resource until the signal reaches the threshold of `1Gi`, +and then continues to reclaim the minimum amount of `500Mi` it until the signal +reaches `1.5Gi`. + +Similarly, the kubelet reclaims the `imagefs` resource until the `imagefs.available` +signal reaches `102Gi`. + +The default `eviction-minimum-reclaim` is `0` for all resources. + +### Node out of memory behavior + +If the node experiences an out of memory (OOM) event prior to the kubelet +being able to reclaim memory, the node depends on the [oom_killer](https://lwn.net/Articles/391222/) +to respond. + +The kubelet sets an `oom_score_adj` value for each container based on the QoS for the pod. + +| Quality of Service | oom_score_adj | +|--------------------|-----------------------------------------------------------------------------------| +| `Guaranteed` | -997 | +| `BestEffort` | 1000 | +| `Burstable` | min(max(2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999) | + +{{<note>}} +The kubelet also sets an `oom_score_adj` value of `-997` for containers in Pods that have +`system-node-critical` {{<glossary_tooltip text="Priority" term_id="pod-priority">}} +{{</note>}} + +If the kubelet can't reclaim memory before a node experiences OOM, the +`oom_killer` calculates an `oom_score` based on the percentage of memory it's +using on the node, and then adds the `oom_score_adj` to get an effective `oom_score` +for each container. It then kills the container with the highest score. + +This means that containers in low QoS pods that consume a large amount of memory +relative to their scheduling requests are killed first. + +Unlike pod eviction, if a container is OOM killed, the `kubelet` can restart it +based on its `RestartPolicy`. + +### Best practices {#node-pressure-eviction-good-practices} + +The following sections describe best practices for eviction configuration. + +#### Schedulable resources and eviction policies + +When you configure the kubelet with an eviction policy, you should make sure that +the scheduler will not schedule pods if they will trigger eviction because they +immediately induce memory pressure. + +Consider the following scenario: + +* Node memory capacity: `10Gi` +* Operator wants to reserve 10% of memory capacity for system daemons (kernel, `kubelet`, etc.) +* Operator wants to evict Pods at 95% memory utilization to reduce incidence of system OOM. + +For this to work, the kubelet is launched as follows: + +``` +--eviction-hard=memory.available<500Mi +--system-reserved=memory=1.5Gi +``` + +In this configuration, the `--system-reserved` flag reserves `1.5Gi` of memory +for the system, which is `10% of the total memory + the eviction threshold amount`. + +The node can reach the eviction threshold if a pod is using more than its request, +or if the system is using more than `1Gi` of memory, which makes the `memory.available` +signal fall below `500Mi` and triggers the threshold. + +#### DaemonSet + +Pod Priority is a major factor in making eviction decisions. If you do not want +the kubelet to evict pods that belong to a `DaemonSet`, give those pods a high +enough `priorityClass` in the pod spec. You can also use a lower `priorityClass` +or the default to only allow `DaemonSet` pods to run when there are enough +resources. + +### Known issues + +The following sections describe known issues related to out of resource handling. + +#### kubelet may not observe memory pressure right away + +By default, the kubelet polls `cAdvisor` to collect memory usage stats at a +regular interval. If memory usage increases within that window rapidly, the +kubelet may not observe `MemoryPressure` fast enough, and the `OOMKiller` +will still be invoked. + +You can use the `--kernel-memcg-notification` flag to enable the `memcg` +notification API on the kubelet to get notified immediately when a threshold +is crossed. + +If you are not trying to achieve extreme utilization, but a sensible measure of +overcommit, a viable workaround for this issue is to use the `--kube-reserved` +and `--system-reserved` flags to allocate memory for the system. + +#### active_file memory is not considered as available memory + +On Linux, the kernel tracks the number of bytes of file-backed memory on active +LRU list as the `active_file` statistic. The kubelet treats `active_file` memory +areas as not reclaimable. For workloads that make intensive use of block-backed +local storage, including ephemeral local storage, kernel-level caches of file +and block data means that many recently accessed cache pages are likely to be +counted as `active_file`. If enough of these kernel block buffers are on the +active LRU list, the kubelet is liable to observe this as high resource use and +taint the node as experiencing memory pressure - triggering pod eviction. + +For more more details, see [https://github.com/kubernetes/kubernetes/issues/43916](https://github.com/kubernetes/kubernetes/issues/43916) + +You can work around that behavior by setting the memory limit and memory request +the same for containers likely to perform intensive I/O activity. You will need +to estimate or measure an optimal memory limit value for that container. + +## {{% heading "whatsnext" %}} + +* Learn about [API-initiated Eviction](/docs/concepts/scheduling-eviction/api-eviction/) +* Learn about [Pod Priority and Preemption](/docs/concepts/scheduling-eviction/pod-priority-preemption/) +* Learn about [PodDisruptionBudgets](/docs/tasks/run-application/configure-pdb/) +* Learn about [Quality of Service](/docs/tasks/configure-pod-container/quality-service-pod/) (QoS) +* Check out the [Eviction API](/docs/reference/generated/kubernetes-api/{{<param "version">}}/#create-eviction-pod-v1-core) \ No newline at end of file diff --git a/content/en/docs/concepts/scheduling-eviction/pod-overhead.md b/content/en/docs/concepts/scheduling-eviction/pod-overhead.md index 15992126f9..eebc235084 100644 --- a/content/en/docs/concepts/scheduling-eviction/pod-overhead.md +++ b/content/en/docs/concepts/scheduling-eviction/pod-overhead.md @@ -5,7 +5,7 @@ reviewers: - tallclair title: Pod Overhead content_type: concept -weight: 50 +weight: 30 --- <!-- overview --> diff --git a/content/en/docs/concepts/scheduling-eviction/pod-priority-preemption.md b/content/en/docs/concepts/scheduling-eviction/pod-priority-preemption.md index 5e75674d73..112e244f46 100644 --- a/content/en/docs/concepts/scheduling-eviction/pod-priority-preemption.md +++ b/content/en/docs/concepts/scheduling-eviction/pod-priority-preemption.md @@ -4,7 +4,7 @@ reviewers: - wojtek-t title: Pod Priority and Preemption content_type: concept -weight: 70 +weight: 50 --- <!-- overview --> @@ -372,4 +372,6 @@ that exceeds its requests may be evicted. ## {{% heading "whatsnext" %}} * Read about using ResourceQuotas in connection with PriorityClasses: [limit Priority Class consumption by default](/docs/concepts/policy/resource-quotas/#limit-priority-class-consumption-by-default) - +* Learn about [Pod Disruption](/docs/concepts/workloads/pods/disruptions/) +* Learn about [API-initiated Eviction](/docs/concepts/scheduling-eviction/api-eviction/) +* Learn about [Node-pressure Eviction](/docs/concepts/scheduling-eviction/node-pressure-eviction/) diff --git a/content/en/docs/concepts/scheduling-eviction/resource-bin-packing.md b/content/en/docs/concepts/scheduling-eviction/resource-bin-packing.md index 94bfaa1280..a7b3639366 100644 --- a/content/en/docs/concepts/scheduling-eviction/resource-bin-packing.md +++ b/content/en/docs/concepts/scheduling-eviction/resource-bin-packing.md @@ -5,7 +5,7 @@ reviewers: - ahg-g title: Resource Bin Packing for Extended Resources content_type: concept -weight: 30 +weight: 80 --- <!-- overview --> diff --git a/content/en/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md b/content/en/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md index 24283f2efa..b110dc63e5 100644 --- a/content/en/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md +++ b/content/en/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md @@ -3,7 +3,7 @@ reviewers: - bsalamat title: Scheduler Performance Tuning content_type: concept -weight: 80 +weight: 100 --- <!-- overview --> diff --git a/content/en/docs/concepts/scheduling-eviction/scheduling-framework.md b/content/en/docs/concepts/scheduling-eviction/scheduling-framework.md index 06ed901c2a..3be7adf430 100644 --- a/content/en/docs/concepts/scheduling-eviction/scheduling-framework.md +++ b/content/en/docs/concepts/scheduling-eviction/scheduling-framework.md @@ -3,7 +3,7 @@ reviewers: - ahg-g title: Scheduling Framework content_type: concept -weight: 70 +weight: 90 --- <!-- overview --> diff --git a/content/en/docs/reference/glossary/api-eviction.md b/content/en/docs/reference/glossary/api-eviction.md new file mode 100644 index 0000000000..b13238c955 --- /dev/null +++ b/content/en/docs/reference/glossary/api-eviction.md @@ -0,0 +1,22 @@ +--- +title: API-initiated eviction +id: api-eviction +date: 2021-04-27 +full_link: /docs/concepts/scheduling-eviction/pod-eviction/#api-eviction +short_description: > + API-initiated eviction is the process by which you use the Eviction API to create an + Eviction object that triggers graceful pod termination. +aka: +tags: +- operation +--- +API-initiated eviction is the process by which you use the [Eviction API](/docs/reference/generated/kubernetes-api/{{<param "version">}}/#create-eviction-pod-v1-core) +to create an `Eviction` object that triggers graceful pod termination. + +<!--more--> + +You can request eviction either by directly calling the Eviction API +using a client of the kube-apiserver, like the `kubectl drain` command. +When an `Eviction` object is created, the API server terminates the Pod. + +API-initiated eviction is not the same as [node-pressure eviction](/docs/concepts/scheduling-eviction/eviction/#kubelet-eviction). diff --git a/content/en/docs/reference/glossary/node-pressure-eviction.md b/content/en/docs/reference/glossary/node-pressure-eviction.md new file mode 100644 index 0000000000..742ee3fe0c --- /dev/null +++ b/content/en/docs/reference/glossary/node-pressure-eviction.md @@ -0,0 +1,23 @@ +--- +title: Node-pressure eviction +id: node-pressure-eviction +date: 2021-05-13 +full_link: /docs/concepts/scheduling-eviction/node-pressure-eviction/ +short_description: > + Node-pressure eviction is the process by which the kubelet proactively fails + pods to reclaim resources on nodes. +aka: kubelet eviction +tags: +- operation +--- +Node-pressure eviction is the process by which the {{<glossary_tooltip term_id="kubelet" text="kubelet">}} proactively terminates +pods to reclaim resources on nodes. + +<!--more--> + +The kubelet monitors resources like CPU, memory, disk space, and filesystem +inodes on your cluster's nodes. When one or more of these resources reach +specific consumption levels, the kubelet can proactively fail one or more pods +on the node to reclaim resources and prevent starvation. + +Node-pressure eviction is not the same as [API-initiated eviction](/docs/concepts/scheduling-eviction/api-eviction/). diff --git a/content/en/docs/reference/glossary/pod-disruption.md b/content/en/docs/reference/glossary/pod-disruption.md new file mode 100644 index 0000000000..1efd69dd4c --- /dev/null +++ b/content/en/docs/reference/glossary/pod-disruption.md @@ -0,0 +1,19 @@ +--- +id: pod-disruption +title: Pod Disruption +full_link: /docs/concepts/workloads/pods/disruptions/ +date: 2021-05-12 +short_description: > + The process by which Pods on Nodes are terminated either voluntarily or involuntarily. + +aka: +related: + - pod + - container +tags: + - operation +--- + +[Pod disruption](/docs/concepts/workloads/pods/disruptions/) is the process by which Pods on Nodes are terminated either voluntarily or involuntarily. + +Voluntary disruptions are started intentionally by application owners or cluster administrators. Involuntary disruptions are unintentional and can be triggered by unavoidable issues like Nodes running out of resources, or by accidental deletions. diff --git a/content/en/docs/tasks/administer-cluster/out-of-resource.md b/content/en/docs/tasks/administer-cluster/out-of-resource.md deleted file mode 100644 index f750dd2585..0000000000 --- a/content/en/docs/tasks/administer-cluster/out-of-resource.md +++ /dev/null @@ -1,354 +0,0 @@ ---- -reviewers: -- derekwaynecarr -- vishh -- timstclair -title: Configure Out of Resource Handling -content_type: concept ---- - -<!-- overview --> - -This page explains how to configure out of resource handling with `kubelet`. - -The `kubelet` needs to preserve node stability when available compute resources -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. - -<!-- body --> - -### Eviction Signals - -The `kubelet` supports eviction decisions based on the signals described in the following -table. The value of each signal is described in the Description column, which is based on -the `kubelet` summary API. - -| Eviction Signal | Description | -|----------------------|---------------------------------------------------------------------------------------| -| `memory.available` | `memory.available` := `node.status.capacity[memory]` - `node.stats.memory.workingSet` | -| `nodefs.available` | `nodefs.available` := `node.stats.fs.available` | -| `nodefs.inodesFree` | `nodefs.inodesFree` := `node.stats.fs.inodesFree` | -| `imagefs.available` | `imagefs.available` := `node.stats.runtime.imagefs.available` | -| `imagefs.inodesFree` | `imagefs.inodesFree` := `node.stats.runtime.imagefs.inodesFree` | -| `pid.available` | `pid.available` := `node.stats.rlimit.maxpid` - `node.stats.rlimit.curproc` | - -Each of the above signals supports either a literal or percentage based value. -The percentage based value is calculated relative to the total capacity -associated with each signal. - -The value for `memory.available` is derived from the cgroupfs instead of tools -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](/examples/admin/resource/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 -memory is reclaimable under pressure. - -`kubelet` supports only two filesystem partitions. - -1. The `nodefs` filesystem that kubelet uses for volumes, daemon logs, etc. -1. The `imagefs` filesystem that container runtimes uses for storing images and - container writable layers. - -`imagefs` is optional. `kubelet` auto-discovers these filesystems using -cAdvisor. `kubelet` does not care about any other filesystems. Any other types -of configurations are not currently supported by the kubelet. For example, it is -_not OK_ to store volumes and logs in a dedicated `filesystem`. - -In future releases, the `kubelet` will deprecate the existing [garbage -collection](/docs/concepts/cluster-administration/kubelet-garbage-collection/) -support in favor of eviction in response to disk pressure. - -### Eviction Thresholds - -The `kubelet` supports the ability to specify eviction thresholds that trigger the `kubelet` to reclaim resources. - -Each threshold has the following form: - -`[eviction-signal][operator][quantity]` - -where: - -* `eviction-signal` is an eviction signal token as defined in the previous table. -* `operator` is the desired relational operator, such as `<` (less than). -* `quantity` is the eviction threshold quantity, such as `1Gi`. These tokens must match the quantity representation used by Kubernetes. An eviction threshold can also be expressed as a percentage using the `%` token. - -For example, if a node has `10Gi` of total memory and you want trigger eviction if -the available memory falls below `1Gi`, you can define the eviction threshold as -either `memory.available<10%` or `memory.available<1Gi`. You cannot use both. - -#### Soft Eviction Thresholds - -A soft eviction threshold pairs an eviction threshold with a required -administrator-specified grace period. No action is taken by the `kubelet` -to reclaim resources associated with the eviction signal until that grace -period has been exceeded. If no grace period is provided, the `kubelet` -returns an error on startup. - -In addition, if a soft eviction threshold has been met, an operator can -specify a maximum allowed Pod termination grace period to use when evicting -pods from the node. If specified, the `kubelet` uses the lesser value among -the `pod.Spec.TerminationGracePeriodSeconds` and the max allowed grace period. -If not specified, the `kubelet` kills Pods immediately with no graceful -termination. - -To configure soft eviction thresholds, the following flags are supported: - -* `eviction-soft` describes a set of eviction thresholds (e.g. `memory.available<1.5Gi`) that if met over a corresponding grace period would trigger a Pod eviction. -* `eviction-soft-grace-period` describes a set of eviction grace periods (e.g. `memory.available=1m30s`) that correspond to how long a soft eviction threshold must hold before triggering a Pod eviction. -* `eviction-max-pod-grace-period` describes the maximum allowed grace period (in seconds) to use when terminating pods in response to a soft eviction threshold being met. - -#### Hard Eviction Thresholds - -A hard eviction threshold has no grace period, and if observed, the `kubelet` -will take immediate action to reclaim the associated starved resource. If a -hard eviction threshold is met, the `kubelet` kills the Pod immediately -with no graceful termination. - -To configure hard eviction thresholds, the following flag is supported: - -* `eviction-hard` describes a set of eviction thresholds (e.g. `memory.available<1Gi`) that if met would trigger a Pod eviction. - -The `kubelet` has the following default hard eviction threshold: - -* `memory.available<100Mi` -* `nodefs.available<10%` -* `imagefs.available<15%` - -On a Linux node, the default value also includes `nodefs.inodesFree<5%`. - -### Eviction Monitoring Interval - -The `kubelet` evaluates eviction thresholds per its configured housekeeping interval. - -* `housekeeping-interval` is the interval between container housekeepings which defaults to `10s`. - -### Node Conditions - -The `kubelet` maps one or more eviction signals to a corresponding node condition. - -If a hard eviction threshold has been met, or a soft eviction threshold has been met -independent of its associated grace period, the `kubelet` reports a condition that -reflects the node is under pressure. - -The following node conditions are defined that correspond to the specified eviction signal. - -| Node Condition | Eviction Signal | Description | -|-------------------|---------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------| -| `MemoryPressure` | `memory.available` | Available memory on the node has satisfied an eviction threshold | -| `DiskPressure` | `nodefs.available`, `nodefs.inodesFree`, `imagefs.available`, or `imagefs.inodesFree` | Available disk space and inodes on either the node's root filesystem or image filesystem has satisfied an eviction threshold | -| `PIDPressure` | `pid.available` | Available processes identifiers on the (Linux) node has fallen below an eviction threshold | | - -The `kubelet` continues to report node status updates at the frequency specified by -`--node-status-update-frequency` which defaults to `10s`. - -### Oscillation of node conditions - -If a node is oscillating above and below a soft eviction threshold, but not exceeding -its associated grace period, it would cause the corresponding node condition to -constantly oscillate between true and false, and could cause poor scheduling decisions -as a consequence. - -To protect against this oscillation, the following flag is defined to control how -long the `kubelet` must wait before transitioning out of a pressure condition. - -* `eviction-pressure-transition-period` is the duration for which the `kubelet` has to wait before transitioning out of an eviction pressure condition. - -The `kubelet` would ensure that it has not observed an eviction threshold being met -for the specified pressure condition for the period specified before toggling the -condition back to `false`. - -### Reclaiming node level resources - -If an eviction threshold has been met and the grace period has passed, -the `kubelet` initiates the process of reclaiming the pressured resource -until it has observed the signal has gone below its defined threshold. - -The `kubelet` attempts to reclaim node level resources prior to evicting end-user Pods. If -disk pressure is observed, the `kubelet` reclaims node level resources differently if the -machine has a dedicated `imagefs` configured for the container runtime. - -#### With `imagefs` - -If `nodefs` filesystem has met eviction thresholds, `kubelet` frees up disk space by deleting the dead Pods and their containers. - -If `imagefs` filesystem has met eviction thresholds, `kubelet` frees up disk space by deleting all unused images. - -#### Without `imagefs` - -If `nodefs` filesystem has met eviction thresholds, `kubelet` frees up disk space in the following order: - -1. Delete dead Pods and their containers -1. Delete all unused images - -### Evicting end-user Pods - -If the `kubelet` is unable to reclaim sufficient resource on the node, `kubelet` begins evicting Pods. - -The `kubelet` ranks Pods for eviction first by whether or not their usage of the starved resource exceeds requests, -then by [Priority](/docs/concepts/configuration/pod-priority-preemption/), and then by the consumption of the starved compute resource relative to the Pods' scheduling requests. - -As a result, `kubelet` ranks and evicts Pods in the following order: - -* `BestEffort` or `Burstable` Pods whose usage of a starved resource exceeds its request. Such pods are ranked by Priority, and then usage above request. -* `Guaranteed` pods and `Burstable` pods whose usage is beneath requests are evicted last. `Guaranteed` Pods are guaranteed only when requests and limits are specified for all the containers and they are equal. Such pods are guaranteed to never be evicted because of another Pod's resource consumption. If a system daemon (such as `kubelet`, `docker`, and `journald`) is consuming more resources than were reserved via `system-reserved` or `kube-reserved` allocations, and the node only has `Guaranteed` or `Burstable` Pods using less than requests remaining, then the node must choose to evict such a Pod in order to preserve node stability and to limit the impact of the unexpected consumption to other Pods. In this case, it will choose to evict pods of Lowest Priority first. - -If necessary, `kubelet` evicts Pods one at a time to reclaim disk when `DiskPressure` -is encountered. If the `kubelet` is responding to `inode` starvation, it reclaims -`inodes` by evicting Pods with the lowest quality of service first. If the `kubelet` -is responding to lack of available disk, it ranks Pods within a quality of service -that consumes the largest amount of disk and kills those first. - -#### With `imagefs` - -If `nodefs` is triggering evictions, `kubelet` sorts Pods based on the usage on `nodefs` - -- local volumes + logs of all its containers. - -If `imagefs` is triggering evictions, `kubelet` sorts Pods based on the writable layer usage of all its containers. - -#### Without `imagefs` - -If `nodefs` is triggering evictions, `kubelet` sorts Pods based on their total disk usage - -- local volumes + logs & writable layer of all its containers. - -### Minimum eviction reclaim - -In certain scenarios, eviction of Pods could result in reclamation of small amount of resources. This can result in -`kubelet` hitting eviction thresholds in repeated successions. In addition to that, eviction of resources like `disk`, is time consuming. - -To mitigate these issues, `kubelet` can have a per-resource `minimum-reclaim`. Whenever `kubelet` observes -resource pressure, `kubelet` attempts to reclaim at least `minimum-reclaim` amount of resource below -the configured eviction threshold. - -For example, with the following configuration: - -``` ---eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.available<100Gi ---eviction-minimum-reclaim="memory.available=0Mi,nodefs.available=500Mi,imagefs.available=2Gi"` -``` - -If an eviction threshold is triggered for `memory.available`, the `kubelet` works to ensure -that `memory.available` is at least `500Mi`. For `nodefs.available`, the `kubelet` works -to ensure that `nodefs.available` is at least `1.5Gi`, and for `imagefs.available` it -works to ensure that `imagefs.available` is at least `102Gi` before no longer reporting pressure -on their associated resources. - -The default `eviction-minimum-reclaim` is `0` for all resources. - -### Scheduler - -The node reports a condition when a compute resource is under pressure. The -scheduler views that condition as a signal to dissuade placing additional -pods on the node. - -| Node Condition | Scheduler Behavior | -| ------------------| ----------------------------------------------------| -| `MemoryPressure` | No new `BestEffort` Pods are scheduled to the node. | -| `DiskPressure` | No new Pods are scheduled to the node. | - -## Node OOM Behavior - -If the node experiences a system OOM (out of memory) event prior to the `kubelet` being able to reclaim memory, -the node depends on the [oom_killer](https://lwn.net/Articles/391222/) to respond. - -The `kubelet` sets a `oom_score_adj` value for each container based on the quality of service for the Pod. - -| Quality of Service | oom_score_adj | -|--------------------|-----------------------------------------------------------------------------------| -| `Guaranteed` | -998 | -| `BestEffort` | 1000 | -| `Burstable` | min(max(2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999) | - -If the `kubelet` is unable to reclaim memory prior to a node experiencing system OOM, the `oom_killer` calculates -an `oom_score` based on the percentage of memory it's using on the node, and then add the `oom_score_adj` to get an -effective `oom_score` for the container, and then kills the container with the highest score. - -The intended behavior should be that containers with the lowest quality of service that -are consuming the largest amount of memory relative to the scheduling request should be killed first in order -to reclaim memory. - -Unlike Pod eviction, if a Pod container is OOM killed, it may be restarted by the `kubelet` based on its `RestartPolicy`. - -## Best Practices - -The following sections describe best practices for out of resource handling. - -### Schedulable resources and eviction policies - -Consider the following scenario: - -* Node memory capacity: `10Gi` -* Operator wants to reserve 10% of memory capacity for system daemons (kernel, `kubelet`, etc.) -* Operator wants to evict Pods at 95% memory utilization to reduce incidence of system OOM. - -To facilitate this scenario, the `kubelet` would be launched as follows: - -``` ---eviction-hard=memory.available<500Mi ---system-reserved=memory=1.5Gi -``` - -Implicit in this configuration is the understanding that "System reserved" should include the amount of memory -covered by the eviction threshold. - -To reach that capacity, either some Pod is using more than its request, or the system is using more than `1.5Gi - 500Mi = 1Gi`. - -This configuration ensures that the scheduler does not place Pods on a node that immediately induce memory pressure -and trigger eviction assuming those Pods use less than their configured request. - -### DaemonSet - -As `Priority` is a key factor in the eviction strategy, if you do not want pods belonging to a `DaemonSet` to be evicted, specify a sufficiently high priorityClass in the pod spec template. If you want pods belonging to a `DaemonSet` to run only if there are sufficient resources, specify a lower or default priorityClass. - - -## Deprecation of existing feature flags to reclaim disk - -`kubelet` has been freeing up disk space on demand to keep the node stable. - -As disk based eviction matures, the following `kubelet` flags are marked for deprecation -in favor of the simpler configuration supported around eviction. - -| Existing Flag | New Flag | -| ------------------------------------------ | ----------------------------------------| -| `--image-gc-high-threshold` | `--eviction-hard` or `eviction-soft` | -| `--image-gc-low-threshold` | `--eviction-minimum-reclaim` | -| `--maximum-dead-containers` | deprecated | -| `--maximum-dead-containers-per-container` | deprecated | -| `--minimum-container-ttl-duration` | deprecated | -| `--low-diskspace-threshold-mb` | `--eviction-hard` or `eviction-soft` | -| `--outofdisk-transition-frequency` | `--eviction-pressure-transition-period` | - -## Known issues - -The following sections describe known issues related to out of resource handling. - -### kubelet may not observe memory pressure right away - -The `kubelet` currently polls `cAdvisor` to collect memory usage stats at a regular interval. If memory usage -increases within that window rapidly, the `kubelet` may not observe `MemoryPressure` fast enough, and the `OOMKiller` -will still be invoked. We intend to integrate with the `memcg` notification API in a future release to reduce this -latency, and instead have the kernel tell us when a threshold has been crossed immediately. - -If you are not trying to achieve extreme utilization, but a sensible measure of overcommit, a viable workaround for -this issue is to set eviction thresholds at approximately 75% capacity. This increases the ability of this feature -to prevent system OOMs, and promote eviction of workloads so cluster state can rebalance. - -### kubelet may evict more Pods than needed - -The Pod eviction may evict more Pods than needed due to stats collection timing gap. This can be mitigated by adding -the ability to get root container stats on an on-demand basis [(https://github.com/google/cadvisor/issues/1247)](https://github.com/google/cadvisor/issues/1247) in the future. - -### active_file memory is not considered as available memory - -On Linux, the kernel tracks the number of bytes of file-backed memory on active LRU list as the `active_file` statistic. The kubelet treats `active_file` memory areas as not reclaimable. For workloads that make intensive use of block-backed local storage, including ephemeral local storage, kernel-level caches of file and block data means that many recently accessed cache pages are likely to be counted as `active_file`. If enough of these kernel block buffers are on the active LRU list, the kubelet is liable to observe this as high resource use and taint the node as experiencing memory pressure - triggering Pod eviction. - -For more more details, see [https://github.com/kubernetes/kubernetes/issues/43916](https://github.com/kubernetes/kubernetes/issues/43916) - -You can work around that behavior by setting the memory limit and memory request the same for containers likely to perform intensive I/O activity. You will need to estimate or measure an optimal memory limit value for that container. - diff --git a/static/_redirects b/static/_redirects index 2961c5229a..399ee1604c 100644 --- a/static/_redirects +++ b/static/_redirects @@ -91,7 +91,7 @@ /docs/concepts/cluster-administration/guaranteed-scheduling-critical-addon-pods/ /docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/ 301 /docs/concepts/cluster-administration/master-node-communication/ /docs/concepts/architecture/master-node-communication/ 301 /docs/concepts/cluster-administration/network-plugins/ /docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/ 301 -/docs/concepts/cluster-administration/out-of-resource/ /docs/tasks/administer-cluster/out-of-resource/ 301 +/docs/concepts/cluster-administration/out-of-resource/ /docs/concepts/scheduling-eviction/node-pressure-eviction/ 301 /docs/concepts/cluster-administration/resource-usage-monitoring /docs/tasks/debug-application-cluster/resource-usage-monitoring/ 301 /docs/concepts/cluster-administration/monitoring/ /docs/concepts/cluster-administration/system-metrics/ 301 /docs/concepts/cluster-administration/controller-metrics/ /docs/concepts/cluster-administration/system-metrics/ 301 @@ -127,6 +127,7 @@ /id/docs/concepts/scheduling/scheduler-perf-tuning/ /id/docs/concepts/scheduling-eviction/scheduler-perf-tuning/ 301 /docs/concepts/scheduling/scheduling-framework/ /docs/concepts/scheduling-eviction/scheduling-framework/ 301 /id/docs/concepts/scheduling/scheduling-framework/ /id/docs/concepts/scheduling-eviction/scheduling-framework/ 301 +/docs/concepts/scheduling-eviction/eviction-policy/ /docs/concepts/scheduling-eviction/node-pressure-eviction/ 301 /docs/concepts/service-catalog/ /docs/concepts/extend-kubernetes/service-catalog/ 301 /docs/concepts/services-networking/networkpolicies/ /docs/concepts/services-networking/network-policies/ 301 /docs/concepts/storage/etcd-store-api-object/ /docs/tasks/administer-cluster/configure-upgrade-etcd/ 301 @@ -261,6 +262,7 @@ /docs/tasks/administer-cluster/quota-memory-cpu-namespace/ /docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/ 301 /docs/tasks/administer-cluster/quota-pod-namespace/ /docs/tasks/administer-cluster/manage-resources/quota-pod-namespace/ 301 /docs/tasks/administer-cluster/reserve-compute-resources/out-of-resource.md /docs/tasks/administer-cluster/out-of-resource/ 301 +/docs/tasks/administer-cluster/out-of-resource/ /docs/concepts/scheduling-eviction/pod-eviction/ 301 /docs/tasks/administer-cluster/romana-network-policy/ /docs/tasks/administer-cluster/network-policy-provider/romana-network-policy/ 301 /docs/tasks/administer-cluster/running-cloud-controller.md /docs/tasks/administer-cluster/running-cloud-controller/ 301 /docs/tasks/administer-cluster/share-configuration/ /docs/tasks/access-application-cluster/configure-access-multiple-clusters/ 301 From 1638e3543f4d0a96dff924573d1d8fe026f6dded Mon Sep 17 00:00:00 2001 From: Qiming Teng <tengqm@outlook.com> Date: Fri, 14 May 2021 13:41:11 +0800 Subject: [PATCH 140/221] [zh] Resync tasks for 1.21 (4) --- .../tasks/run-application/configure-pdb.md | 27 +++---- .../run-application/delete-stateful-set.md | 18 ++--- .../force-delete-stateful-set-pod.md | 17 +++-- .../horizontal-pod-autoscale-walkthrough.md | 4 +- .../horizontal-pod-autoscale.md | 72 ++++++++++--------- .../run-replicated-stateful-application.md | 7 +- ...un-single-instance-stateful-application.md | 15 ++++ .../run-stateless-application-deployment.md | 8 ++- 8 files changed, 102 insertions(+), 66 deletions(-) diff --git a/content/zh/docs/tasks/run-application/configure-pdb.md b/content/zh/docs/tasks/run-application/configure-pdb.md index a7cbaf97df..ef8f54c168 100644 --- a/content/zh/docs/tasks/run-application/configure-pdb.md +++ b/content/zh/docs/tasks/run-application/configure-pdb.md @@ -2,6 +2,7 @@ title: 为应用程序设置干扰预算(Disruption Budget) content_type: task weight: 110 +min-kubernetes-server-version: v1.21 --- <!-- @@ -12,7 +13,7 @@ weight: 110 <!-- overview --> -{{< feature-state for_k8s_version="v1.5" state="beta" >}} +{{< feature-state for_k8s_version="v1.21" state="stable" >}} <!-- This page shows how to limit the number of concurrent disruptions @@ -24,6 +25,8 @@ nodes. ## {{% heading "prerequisites" %}} +{{< version-check >}} + <!-- * You are the owner of an application running on a Kubernetes cluster that requires high availability. @@ -205,15 +208,15 @@ It can be either an absolute number or a percentage. * `.spec.maxUnavailable` (Kubernetes 1.7 及更高的版本中可用)表示驱逐后允许不可用的 Pod 的最大数量。其值可以是绝对值或是百分比。 -<!-- -For versions 1.8 and earlier: When creating a `PodDisruptionBudget` -object using the `kubectl` command line tool, the `minAvailable` field has a -default value of 1 if neither `minAvailable` nor `maxUnavailable` is specified. ---> {{< note >}} -对于1.8及更早的版本:当你用 `kubectl` 命令行工具创建 `PodDisruptionBudget` 对象时, -如果既未指定 `minAvailable` 也未指定 `maxUnavailable`, -则 `minAvailable` 字段有一个默认值 1。 +<!-- +The behavior for an empty selector differs between the policy/v1beta1 and policy/v1 APIs for +PodDisruptionBudgets. For policy/v1beta1 an empty selector matches zero pods, while +for policy/v1 an empty selector matches every pod in the namespace. +--> +`policy/v1beta1` 和 `policy/v1` API 中 PodDisruptionBudget 的空选择算符的行为 +略有不同。在 `policy/v1beta1` 中,空的选择算符不会匹配任何 Pods,而 +`policy/v1` 中,空的选择算符会匹配名字空间中所有 Pods。 {{< /note >}} <!-- @@ -296,9 +299,9 @@ Example PDB Using minAvailable: {{< codenew file="policy/zookeeper-pod-disruption-budget-minavailable.yaml" >}} <!-- -Example PDB Using maxUnavailable (Kubernetes 1.7 or higher): +Example PDB Using maxUnavailable: --> -使用 maxUnavailable 的 PDB 示例(Kubernetes 1.7 或更高的版本): +使用 maxUnavailable 的 PDB 示例: {{< codenew file="policy/zookeeper-pod-disruption-budget-maxunavailable.yaml" >}} @@ -378,7 +381,7 @@ kubectl get poddisruptionbudgets zk-pdb -o yaml ``` ```yaml -apiVersion: policy/v1beta1 +apiVersion: policy/v1 kind: PodDisruptionBudget metadata: anntation: {} diff --git a/content/zh/docs/tasks/run-application/delete-stateful-set.md b/content/zh/docs/tasks/run-application/delete-stateful-set.md index 77b6b47da7..8deb3db483 100644 --- a/content/zh/docs/tasks/run-application/delete-stateful-set.md +++ b/content/zh/docs/tasks/run-application/delete-stateful-set.md @@ -20,14 +20,14 @@ weight: 60 <!-- This task shows you how to delete a StatefulSet. ----> +--> 本任务展示如何删除 StatefulSet。 ## {{% heading "prerequisites" %}} <!-- * This task assumes you have an application running on your cluster represented by a StatefulSet. ----> +--> * 本任务假设在你的集群上已经运行了由 StatefulSet 创建的应用。 <!-- steps --> @@ -36,7 +36,7 @@ This task shows you how to delete a StatefulSet. <!-- You can delete a StatefulSet in the same way you delete other resources in Kubernetes: use the `kubectl delete` command, and specify the StatefulSet either by file or by name. ----> +--> 你可以像删除 Kubernetes 中的其他资源一样删除 StatefulSet:使用 `kubectl delete` 命令,并按文件或者名字指定 StatefulSet。 ```shell @@ -66,10 +66,11 @@ kubectl delete service <服务名称> ``` <!-- -Deleting a StatefulSet through kubectl will scale it down to 0, thereby deleting all pods that are a part of it. -If you want to delete just the StatefulSet and not the pods, use `--cascade=false`. +When deleting a StatefulSet through `kubectl`, the StatefulSet scales down to 0. All Pods that are part of this workload are also deleted. If you want to delete only the StatefulSet and not the Pods, use `--cascade=false`. +For example: ---> -通过 `kubectl` 删除 StatefulSet 会将其缩容为 0,因此删除属于它的所有 Pod。 +当通过 `kubectl` 删除 StatefulSet 时,StatefulSet 会被缩容为 0。 +属于该 StatefulSet 的所有 Pod 也被删除。 如果你只想删除 StatefulSet 而不删除 Pod,使用 `--cascade=false`。 ```shell @@ -114,7 +115,8 @@ To simply delete everything in a StatefulSet, including the associated pods, you --> ### 完全删除 StatefulSet {#complete-deletion-of-a-statefulset} -要简单地删除 StatefulSet 中的所有内容,包括关联的 pods,你可能需要运行一系列类似于以下内容的命令: +要删除 StatefulSet 中的所有内容,包括关联的 pods,你可以运行 +一系列如下所示的命令: ```shell grace=$(kubectl get pods <stateful-set-pod> --template '{{.spec.terminationGracePeriodSeconds}}') @@ -144,7 +146,7 @@ If you find that some pods in your StatefulSet are stuck in the 'Terminating' or <!-- Learn more about [force deleting StatefulSet Pods](/docs/tasks/run-application/force-delete-stateful-set-pod/). ----> +--> 进一步了解[强制删除 StatefulSet 的 Pods](/zh/docs/tasks/run-application/force-delete-stateful-set-pod/)。 diff --git a/content/zh/docs/tasks/run-application/force-delete-stateful-set-pod.md b/content/zh/docs/tasks/run-application/force-delete-stateful-set-pod.md index c2e678d93c..40f48886a6 100644 --- a/content/zh/docs/tasks/run-application/force-delete-stateful-set-pod.md +++ b/content/zh/docs/tasks/run-application/force-delete-stateful-set-pod.md @@ -1,5 +1,5 @@ --- -title: 强制删除 StatefulSet 类型的 Pods +title: 强制删除 StatefulSet 中的 Pods content_type: task weight: 70 --- @@ -19,8 +19,8 @@ weight: 70 <!-- This page shows how to delete Pods which are part of a {{< glossary_tooltip text="stateful set" term_id="StatefulSet" >}}, and explains the considerations to keep in mind when doing so. --> -本文介绍了如何删除 {{< glossary_tooltip text="StatefulSet" term_id="StatefulSet" >}} -管理的 Pods,并且解释了这样操作时需要记住的注意事项。 +本文介绍如何删除 {{< glossary_tooltip text="StatefulSet" term_id="StatefulSet" >}} +管理的 Pods,并解释这样操作时需要记住的注意事项。 ## {{% heading "prerequisites" %}} @@ -76,11 +76,16 @@ Pod 不要使用。体面删除是安全的,并且会在 kubelet 从 API 服 [体面地结束 pod ](/zh/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination)。 <!-- -Kubernetes (versions 1.5 or newer) will not delete Pods just because a Node is unreachable. The Pods running on an unreachable Node enter the 'Terminating' or 'Unknown' state after a [timeout](/docs/admin/node/#node-condition). Pods may also enter these states when the user attempts graceful deletion of a Pod on an unreachable Node. The only ways in which a Pod in such a state can be removed from the apiserver are as follows: +A Pod is not deleted automatically when a Node is unreachable. +The Pods running on an unreachable Node enter the 'Terminating' or 'Unknown' state after a +[timeout](/docs/concepts/architecture/nodes/#condition). +Pods may also enter these states when the user attempts graceful deletion of a Pod +on an unreachable Node. +The only ways in which a Pod in such a state can be removed from the apiserver are as follows: --> -Kubernetes(1.5 版本或者更新版本)不会因为一个节点无法访问而删除 Pod。 +当某个节点不可达时,不会引发自动删除 Pod。 在无法访问的节点上运行的 Pod 在 -[超时](/zh/docs/concepts/workloads/pods/pod-lifecycle/#pod-condition) +[超时](/zh/docs/concepts/architecture/nodes/#condition) 后会进入'Terminating' 或者 'Unknown' 状态。 当用户尝试体面地删除无法访问的节点上的 Pod 时 Pod 也可能会进入这些状态。 从 API 服务器上删除处于这些状态 Pod 的仅有可行方法如下: diff --git a/content/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md b/content/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md index 0e967bb46e..ca9931c7d1 100644 --- a/content/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md +++ b/content/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md @@ -571,7 +571,7 @@ with *external metrics*. <!-- Using external metrics requires knowledge of your monitoring system; the setup is similar to that required when using custom metrics. External metrics allow you to autoscale your cluster -based on any metric available in your monitoring system. Just provide a `metric` block with a +based on any metric available in your monitoring system. Provide a `metric` block with a `name` and `selector`, as above, and use the `External` metric type instead of `Object`. If multiple time series are matched by the `metricSelector`, the sum of their values is used by the HorizontalPodAutoscaler. @@ -580,7 +580,7 @@ as when you use the `Object` type. --> 使用外部度量指标时,需要了解你所使用的监控系统,相关的设置与使用自定义指标时类似。 外部度量指标使得你可以使用你的监控系统的任何指标来自动扩缩你的集群。 -你只需要在 `metric` 块中提供 `name` 和 `selector`,同时将类型由 `Object` 改为 `External`。 +你需要在 `metric` 块中提供 `name` 和 `selector`,同时将类型由 `Object` 改为 `External`。 如果 `metricSelector` 匹配到多个度量指标,HorizontalPodAutoscaler 将会把它们加和。 外部度量指标同时支持 `Value` 和 `AverageValue` 类型,这与 `Object` 类型的度量指标相同。 diff --git a/content/zh/docs/tasks/run-application/horizontal-pod-autoscale.md b/content/zh/docs/tasks/run-application/horizontal-pod-autoscale.md index 4d4c8416c2..449b13319b 100644 --- a/content/zh/docs/tasks/run-application/horizontal-pod-autoscale.md +++ b/content/zh/docs/tasks/run-application/horizontal-pod-autoscale.md @@ -19,8 +19,10 @@ support, on some other application-provided metrics). Note that Horizontal Pod Autoscaling does not apply to objects that can't be scaled, for example, DaemonSets. --> Pod 水平自动扩缩(Horizontal Pod Autoscaler) -可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment、ReplicaSet 和 StatefulSet 中的 Pod 数量。 -除了 CPU 利用率,也可以基于其他应程序提供的[自定义度量指标](https://git.k8s.io/community/contributors/design-proposals/instrumentation/custom-metrics-api.md) +可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment、ReplicaSet 和 +StatefulSet 中的 Pod 数量。 +除了 CPU 利用率,也可以基于其他应程序提供的 +[自定义度量指标](https://git.k8s.io/community/contributors/design-proposals/instrumentation/custom-metrics-api.md) 来执行自动扩缩。 Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。 @@ -28,11 +30,11 @@ Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。 The Horizontal Pod Autoscaler is implemented as a Kubernetes API resource and a controller. The resource determines the behavior of the controller. The controller periodically adjusts the number of replicas in a replication controller or deployment -to match the observed average CPU utilization to the target specified by user. +to match the observed metrics such as average CPU utilisation, average memory utilisation or any other custom metric to the target specified by the user. --> Pod 水平自动扩缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。 -控制器会周期性的调整副本控制器或 Deployment 中的副本数量,以使得 Pod 的平均 CPU -利用率与用户所设定的目标值匹配。 +控制器会周期性地调整副本控制器或 Deployment 中的副本数量,以使得类似 Pod 平均 CPU +利用率、平均内存利用率这类观测到的度量值与用户所设定的目标值匹配。 <!-- body --> @@ -57,7 +59,8 @@ obtains the metrics from either the resource metrics API (for per-pod resource m or the custom metrics API (for all other metrics). --> 每个周期内,控制器管理器根据每个 HorizontalPodAutoscaler 定义中指定的指标查询资源利用率。 -控制器管理器可以从资源度量指标 API(按 Pod 统计的资源用量)和自定义度量指标 API(其他指标)获取度量值。 +控制器管理器可以从资源度量指标 API(按 Pod 统计的资源用量)和自定义度量指标 +API(其他指标)获取度量值。 <!-- * For per-pod resource metrics (like CPU), the controller fetches the metrics @@ -288,7 +291,7 @@ the current value. 这表示,如果一个或多个指标给出的 `desiredReplicas` 值大于当前值,HPA 仍然能实现扩容。 <!-- -Finally, just before HPA scales the target, the scale recommendation is recorded. The +Finally, right before HPA scales the target, the scale recommendation is recorded. The controller considers all recommendations within a configurable window choosing the highest recommendation from within that window. This value can be configured using the `--horizontal-pod-autoscaler-downscale-stabilization` flag, which defaults to 5 minutes. This means that scaledowns will occur gradually, smoothing out the impact of rapidly @@ -296,7 +299,8 @@ fluctuating metric values. --> 最后,在 HPA 控制器执行扩缩操作之前,会记录扩缩建议信息。 控制器会在操作时间窗口中考虑所有的建议信息,并从中选择得分最高的建议。 -这个值可通过 `kube-controller-manager` 服务的启动参数 `--horizontal-pod-autoscaler-downscale-stabilization` 进行配置, +这个值可通过 `kube-controller-manager` 服务的启动参数 +`--horizontal-pod-autoscaler-downscale-stabilization` 进行配置, 默认值为 5 分钟。 这个配置可以让系统更为平滑地进行缩容操作,从而消除短时间内指标值快速波动产生的影响。 @@ -349,7 +353,7 @@ Finally, we can delete an autoscaler using `kubectl delete hpa`. 最后,可以使用 `kubectl delete hpa` 命令删除对象。 <!-- -In addition, there is a special `kubectl autoscale` command for easy creation of a Horizontal Pod Autoscaler. +In addition, there is a special `kubectl autoscale` command for creating a HorizontalPodAutoscaler. For instance, executing `kubectl autoscale rs foo --min=2 --max=5 --cpu-percent=80` will create an autoscaler for replication set *foo*, with target CPU utilization set to `80%` and the number of replicas between 2 and 5. @@ -412,14 +416,15 @@ upscale delay. 从 v1.12 开始,算法调整后,扩容操作时的延迟就不必设置了。 <!-- -- `--horizontal-pod-autoscaler-downscale-stabilization`: The value for this option is a - duration that specifies how long the autoscaler has to wait before another - downscale operation can be performed after the current one has completed. +- `--horizontal-pod-autoscaler-downscale-stabilization`: Specifies the duration of the + downscale stabilization time window. Horizontal Pod Autoscaler remembers + this historical recommended sizes and only acts on the largest size within this time window. The default value is 5 minutes (`5m0s`). --> -- `--horizontal-pod-autoscaler-downscale-stabilization`: - `kube-controller-manager` 的这个参数表示缩容冷却时间。 - 即自从上次缩容执行结束后,多久可以再次执行缩容,默认时间是 5 分钟(`5m0s`)。 +- `--horizontal-pod-autoscaler-downscale-stabilization`: 设置缩容冷却时间窗口长度。 + 水平 Pod +扩缩器能够记住过去建议的负载规模,并仅对此时间窗口内的最大规模执行操作。 + 默认值是 5 分钟(`5m0s`)。 <!-- When tuning these parameter values, a cluster operator should be aware of the possible @@ -669,7 +674,7 @@ and [the walkthrough for using external metrics](/docs/tasks/run-application/hor ## Support for configurable scaling behavior Starting from -[v1.18](https://github.com/kubernetes/enhancements/blob/master/keps/sig-autoscaling/20190307-configurable-scale-velocity-for-hpa.md) +[v1.18](https://github.com/kubernetes/enhancements/blob/master/keps/sig-autoscaling/853-configurable-hpa-scale-velocity/README.md) the `v2beta2` API allows scaling behavior to be configured through the HPA `behavior` field. Behaviors are specified separately for scaling up and down in `scaleUp` or `scaleDown` section under the `behavior` field. A stabilization @@ -679,7 +684,7 @@ policies controls the rate of change of replicas while scaling. --> ## 支持可配置的扩缩 {#support-for-configurable-scaling-behaviour} -从 [v1.18](https://github.com/kubernetes/enhancements/blob/master/keps/sig-autoscaling/20190307-configurable-scale-velocity-for-hpa.md) +从 [v1.18](https://github.com/kubernetes/enhancements/blob/master/keps/sig-autoscaling/853-configurable-hpa-scale-velocity/README.md) 开始,`v2beta2` API 允许通过 HPA 的 `behavior` 字段配置扩缩行为。 在 `behavior` 字段中的 `scaleUp` 和 `scaleDown` 分别指定扩容和缩容行为。 可以两个方向指定一个稳定窗口,以防止扩缩目标中副本数量的波动。 @@ -711,7 +716,12 @@ behavior: ``` <!-- -When the number of pods is more than 40 the second policy will be used for scaling down. +`periodSeconds` indicates the length of time in the past for which the policy must hold true. +The first policy _(Pods)_ allows at most 4 replicas to be scaled down in one minute. The second policy +_(Percent)_ allows at most 10% of the current replicas to be scaled down in one minute. + +Since by default the policy which allows the highest amount of change is selected, the second policy will +only be used when the number of pod replicas is more than 40. With 40 or less replicas, the first policy will be applied. For instance if there are 80 replicas and the target has to be scaled down to 10 replicas then during the first step 8 replicas will be reduced. In the next iteration when the number of replicas is 72, 10% of the pods is 7.2 but the number is rounded up to 8. On each loop of @@ -719,20 +729,16 @@ the autoscaler controller the number of pods to be change is re-calculated based of current replicas. When the number of replicas falls below 40 the first policy _(Pods)_ is applied and 4 replicas will be reduced at a time. --> -当 Pod 数量超过 40 个时,第二个策略将用于缩容。 +`periodSeconds` 表示在过去的多长时间内要求策略值为真。 +第一个策略(Pods)允许在一分钟内最多缩容 4 个副本。第二个策略(Percent) +允许在一分钟内最多缩容当前副本个数的百分之十。 + +由于默认情况下会选择容许更大程度作出变更的策略,只有 Pod 副本数大于 40 时, +第二个策略才会被采用。如果副本数为 40 或者更少,则应用第一个策略。 例如,如果有 80 个副本,并且目标必须缩小到 10 个副本,那么在第一步中将减少 8 个副本。 在下一轮迭代中,当副本的数量为 72 时,10% 的 Pod 数为 7.2,但是这个数字向上取整为 8。 在 autoscaler 控制器的每个循环中,将根据当前副本的数量重新计算要更改的 Pod 数量。 -当副本数量低于 40 时,应用第一个策略 _(Pods)_ ,一次减少 4 个副本。 - -<!-- -`periodSeconds` indicates the length of time in the past for which the policy must hold true. -The first policy allows at most 4 replicas to be scaled down in one minute. The second policy -allows at most 10% of the current replicas to be scaled down in one minute. ---> -`periodSeconds` 表示策略的时间长度必须保证有效。 -第一个策略允许在一分钟内最多缩小 4 个副本。 -第二个策略最多允许在一分钟内缩小当前副本的 10%。 +当副本数量低于 40 时,应用第一个策略(Pods),一次减少 4 个副本。 <!-- The policy selection can be changed by specifying the `selectPolicy` field for a scaling @@ -806,7 +812,7 @@ behavior: ``` <!-- -For scaling down the stabilization window is _300_ seconds(or the value of the +For scaling down the stabilization window is _300_ seconds (or the value of the `--horizontal-pod-autoscaler-downscale-stabilization` flag if provided). There is only a single policy for scaling down which allows a 100% of the currently running replicas to be removed which means the scaling target can be scaled down to the minimum allowed replicas. @@ -814,7 +820,8 @@ For scaling up there is no stabilization window. When the metrics indicate that scaled up the target is scaled up immediately. There are 2 policies where 4 pods or a 100% of the currently running replicas will be added every 15 seconds till the HPA reaches its steady state. --> -用于缩小稳定窗口的时间为 _300_ 秒(或是 `--horizontal-pod-autoscaler-downscale-stabilization` 参数设定值)。 +用于缩小稳定窗口的时间为 _300_ 秒(或是 `--horizontal-pod-autoscaler-downscale-stabilization` +参数设定值)。 只有一种缩容的策略,允许 100% 删除当前运行的副本,这意味着扩缩目标可以缩小到允许的最小副本数。 对于扩容,没有稳定窗口。当指标显示目标应该扩容时,目标会立即扩容。 这里有两种策略,每 15 秒添加 4 个 Pod 或 100% 当前运行的副本数,直到 HPA 达到稳定状态。 @@ -859,7 +866,8 @@ To ensure that no more than 5 Pods are removed per minute, you can add a second policy with a fixed size of 5, and set `selectPolicy` to minimum. Setting `selectPolicy` to `Min` means that the autoscaler chooses the policy that affects the smallest number of Pods: --> -为了确保每分钟删除的 Pod 数不超过 5 个,可以添加第二个缩容策略,大小固定为 5,并将 `selectPolicy` 设置为最小值。 +为了确保每分钟删除的 Pod 数不超过 5 个,可以添加第二个缩容策略,大小固定为 5, +并将 `selectPolicy` 设置为最小值。 将 `selectPolicy` 设置为 `Min` 意味着 autoscaler 会选择影响 Pod 数量最小的策略: ```yaml diff --git a/content/zh/docs/tasks/run-application/run-replicated-stateful-application.md b/content/zh/docs/tasks/run-application/run-replicated-stateful-application.md index e70c1075ac..8be16829c0 100644 --- a/content/zh/docs/tasks/run-application/run-replicated-stateful-application.md +++ b/content/zh/docs/tasks/run-application/run-replicated-stateful-application.md @@ -290,7 +290,8 @@ Combined with the StatefulSet controller's this ensures the primary MySQL server is Ready before creating replicas, so they can begin replicating. --> -通过将内容复制到 conf.d 中,`init-mysql` 容器中的脚本也可以应用 ConfigMap 中的 `primary.cnf` 或 `replica.cnf`。 +通过将内容复制到 conf.d 中,`init-mysql` 容器中的脚本也可以应用 ConfigMap 中的 +`primary.cnf` 或 `replica.cnf`。 由于示例部署结构由单个 MySQL 主节点和任意数量的副本节点组成, 因此脚本仅将序数 `0` 指定为主节点,而将其他所有节点指定为副本节点。 @@ -851,12 +852,12 @@ kubectl delete pvc data-mysql-4 * Learn more about [debugging a StatefulSet](/docs/tasks/debug-application-cluster/debug-stateful-set/). * Learn more about [deleting a StatefulSet](/docs/tasks/run-application/delete-stateful-set/). * Learn more about [force deleting StatefulSet Pods](/docs/tasks/run-application/force-delete-stateful-set-pod/). -* Look in the [Helm Charts repository](https://github.com/kubernetes/charts) +* Look in the [Helm Charts repository](https://artifacthub.io/) for other stateful application examples. --> * 进一步了解[为 StatefulSet 扩缩容](/zh/docs/tasks/run-application/scale-stateful-set/). * 进一步了解[调试 StatefulSet](/zh/docs/tasks/debug-application-cluster/debug-stateful-set/). * 进一步了解[删除 StatefulSet](/zh/docs/tasks/run-application/delete-stateful-set/). * 进一步了解[强制删除 StatefulSet Pods](/zh/docs/tasks/run-application/force-delete-stateful-set-pod/). -* 在[Helm Charts 仓库](https://github.com/kubernetes/charts)中查找其他有状态的应用程序示例。 +* 在 [Helm Charts 仓库](https://artifacthub.io/)中查找其他有状态的应用程序示例。 diff --git a/content/zh/docs/tasks/run-application/run-single-instance-stateful-application.md b/content/zh/docs/tasks/run-application/run-single-instance-stateful-application.md index f2cd9de27c..130fb307ef 100644 --- a/content/zh/docs/tasks/run-application/run-single-instance-stateful-application.md +++ b/content/zh/docs/tasks/run-application/run-single-instance-stateful-application.md @@ -81,6 +81,11 @@ for a secure solution. kubectl describe deployment mysql ``` + <!-- + The output is similar to this: + --> + 输出类似于: + ``` Name: mysql Namespace: default @@ -126,6 +131,11 @@ for a secure solution. kubectl get pods -l app=mysql ``` + <!-- + The output is similar to this: + --> + 输出类似于: + ``` NAME READY STATUS RESTARTS AGE mysql-63082529-2z3ki 1/1 Running 0 3m @@ -138,6 +148,11 @@ for a secure solution. kubectl describe pvc mysql-pv-claim ``` + <!-- + The output is similar to this: + --> + 输出类似于: + ``` Name: mysql-pv-claim Namespace: default diff --git a/content/zh/docs/tasks/run-application/run-stateless-application-deployment.md b/content/zh/docs/tasks/run-application/run-stateless-application-deployment.md index 6ca7e60628..f33e2021af 100644 --- a/content/zh/docs/tasks/run-application/run-stateless-application-deployment.md +++ b/content/zh/docs/tasks/run-application/run-stateless-application-deployment.md @@ -1,6 +1,8 @@ --- -title: 使用Deployment运行一个无状态应用 +title: 使用 Deployment 运行一个无状态应用 +min-kubernetes-server-version: v1.9 content_type: tutorial +weight: 10 --- <!-- overview --> @@ -8,7 +10,7 @@ content_type: tutorial <!-- This page shows how to run an application using a Kubernetes Deployment object. --> -本文介绍通过Kubernetes Deployment对象如何去运行一个应用. +本文介绍如何通过 Kubernetes Deployment 对象去运行一个应用. ## {{% heading "objectives" %}} @@ -211,7 +213,7 @@ Delete the deployment by name: --> ## 删除 Deployment -通过名称删除 Deployment: +基于名称删除 Deployment: ```shell kubectl delete deployment nginx-deployment From 29c0554d7026701a488900e7d07924c208efc92d Mon Sep 17 00:00:00 2001 From: Qiming Teng <tengqm@outlook.com> Date: Fri, 14 May 2021 16:07:50 +0800 Subject: [PATCH 141/221] [zh] Resync task files (5) --- .../optional-kubectl-configs-bash-mac.md | 25 ++-- .../docs/tasks/tools/install-kubectl-linux.md | 129 ++++++++++++------ .../docs/tasks/tools/install-kubectl-macos.md | 124 ++++++++++------- .../tasks/tools/install-kubectl-windows.md | 61 +-------- 4 files changed, 176 insertions(+), 163 deletions(-) diff --git a/content/zh/docs/tasks/tools/included/optional-kubectl-configs-bash-mac.md b/content/zh/docs/tasks/tools/included/optional-kubectl-configs-bash-mac.md index d92055f6a3..225492631c 100644 --- a/content/zh/docs/tasks/tools/included/optional-kubectl-configs-bash-mac.md +++ b/content/zh/docs/tasks/tools/included/optional-kubectl-configs-bash-mac.md @@ -4,11 +4,9 @@ description: "在 macOS 上实现 Bash 自动补全的一些可选配置。" headless: true --- <!-- ---- title: "bash auto-completion on macOS" description: "Some optional configuration for bash auto-completion on macOS." headless: true ---- --> <!-- @@ -154,20 +152,23 @@ You now have to ensure that the kubectl completion script gets sourced in all yo ``` <!-- -- If you installed kubectl with Homebrew (as explained [above](#install-with-homebrew-on-macos)), then the kubectl completion script should already be in `/usr/local/etc/bash_completion.d/kubectl`. In that case, you don't need to do anything. +- If you installed kubectl with Homebrew (as explained [here](/docs/tasks/tools/install-kubectl-macos/#install-with-homebrew-on-macos)), then the kubectl completion script should already be in `/usr/local/etc/bash_completion.d/kubectl`. In that case, you don't need to do anything. --> -- 如果你是用 Homebrew 安装的 kubectl([如上所述](#install-with-homebrew-on-macos)), - 那么 kubectl 补全脚本应该已经安装到目录 `/usr/local/etc/bash_completion.d/kubectl` 中了。 - 这种情况下,你什么都不需要做。 +- 如果你是用 Homebrew 安装的 kubectl(如 + [此页面](/zh/docs/tasks/install-with-homebrew-on-macos/#install-with-homebrew-on-macos) + 所描述),则kubectl 补全脚本应该已经安装到目录 `/usr/local/etc/bash_completion.d/kubectl` + 中了。这种情况下,你什么都不需要做。 - {{< note >}} - <!-- - The Homebrew installation of bash-completion v2 sources all the files in the `BASH_COMPLETION_COMPAT_DIR` directory, that's why the latter two methods work. - --> - 用 Hommbrew 安装的 bash-completion v2 会初始化 目录 `BASH_COMPLETION_COMPAT_DIR` 中的所有文件,这就是后两种方法能正常工作的原因。 - {{< /note >}} + {{< note >}} + <!-- + The Homebrew installation of bash-completion v2 sources all the files in the `BASH_COMPLETION_COMPAT_DIR` directory, that's why the latter two methods work. + --> + 用 Hommbrew 安装的 bash-completion v2 会初始化 目录 `BASH_COMPLETION_COMPAT_DIR` + 中的所有文件,这就是后两种方法能正常工作的原因。 + {{< /note >}} <!-- In any case, after reloading your shell, kubectl completion should be working. --> 总之,重新加载 shell 之后,kubectl 补全功能将立即生效。 + diff --git a/content/zh/docs/tasks/tools/install-kubectl-linux.md b/content/zh/docs/tasks/tools/install-kubectl-linux.md index 8a5f4b8b67..2357358d97 100644 --- a/content/zh/docs/tasks/tools/install-kubectl-linux.md +++ b/content/zh/docs/tasks/tools/install-kubectl-linux.md @@ -8,7 +8,6 @@ card: title: 在 Linux 系统中安装 kubectl --- <!-- ---- reviewers: - mikedanese title: Install and Set Up kubectl on Linux @@ -18,18 +17,17 @@ card: name: tasks weight: 20 title: Install kubectl on Linux ---- --> ## {{% heading "prerequisites" %}} <!-- -You must use a kubectl version that is within one minor version difference of your cluster. -For example, a v1.2 client should work with v1.1, v1.2, and v1.3 master. +You must use a kubectl version that is within one minor version difference of your cluster. For example, a v{{< skew latestVersion >}} client can communicate with v{{< skew prevMinorVersion >}}, v{{< skew latestVersion >}}, and v{{< skew nextMinorVersion >}} control planes. Using the latest version of kubectl helps avoid unforeseen issues. --> kubectl 版本和集群版本之间的差异必须在一个小版本号内。 -例如:v1.2 版本的客户端只能与 v1.1、v1.2 和 v1.3 版本的集群一起工作。 +例如:v{{< skew latestVersion >}} 版本的客户端能与 v{{< skew prevMinorVersion >}}、 +v{{< skew latestVersion >}} 和 v{{< skew nextMinorVersion >}} 版本的控制面通信。 用最新版的 kubectl 有助于避免不可预见的问题。 <!-- @@ -42,16 +40,16 @@ The following methods exist for installing kubectl on Linux: --> 在 Linux 系统中安装 kubectl 有如下几种方法: -- [{{% heading "prerequisites" %}}](#{{% heading "prerequisites" %}}) -- [在 Linux 系统中安装 kubectl](#install-kubectl-on-linux) - - [用 curl 在 Linux 系统中安装 kubectl](#install-kubectl-binary-with-curl-on-linux) - - [用原生包管理工具安装](#install-using-native-package-management) - - [用其他包管理工具安装](#install-using-other-package-management) - - [作为谷歌云 SDK 的一部分,在 Linux 中安装](#install-on-linux-as-part-of-the-google-cloud-sdk) -- [验证 kubectl 配置](#verify-kubectl-configration) -- [可选的 kubectl 配置](#optional-kubectl-configurations) - - [启用 shell 自动补全功能](#enable-shell-autocompletion) -- [{{% heading "whatsnext" %}}](#{{% heading "whatsnext" %}}) +<!-- +- [Install kubectl binary with curl on Linux](#install-kubectl-binary-with-curl-on-linux) +- [Install using native package management](#install-using-native-package-management) +- [Install using other package management](#install-using-other-package-management) +- [Install on Linux as part of the Google Cloud SDK](#install-on-linux-as-part-of-the-google-cloud-sdk) +--> +- [用 curl 在 Linux 系统中安装 kubectl](#install-kubectl-binary-with-curl-on-linux) +- [用原生包管理工具安装](#install-using-native-package-management) +- [用其他包管理工具安装](#install-using-other-package-management) +- [作为谷歌云 SDK 的一部分,在 Linux 中安装](#install-on-linux-as-part-of-the-google-cloud-sdk) <!-- ### Install kubectl binary with curl on Linux @@ -68,26 +66,27 @@ The following methods exist for installing kubectl on Linux: ``` {{< note >}} -<!-- -To download a specific version, replace the `$(curl -L -s https://dl.k8s.io/release/stable.txt)` portion of the command with the specific version. + <!-- + To download a specific version, replace the `$(curl -L -s https://dl.k8s.io/release/stable.txt)` portion of the command with the specific version. -For example, to download version {{< param "fullversion" >}} on Linux, type: ---> -如需下载某个指定的版本,请用指定版本号替换该命令的这一部分: `$(curl -L -s https://dl.k8s.io/release/stable.txt)`。 + For example, to download version {{< param "fullversion" >}} on Linux, type: + --> + 如需下载某个指定的版本,请用指定版本号替换该命令的这一部分: + `$(curl -L -s https://dl.k8s.io/release/stable.txt)`。 -例如,要在 Linux 中下载 {{< param "fullversion" >}} 版本,请输入: + 例如,要在 Linux 中下载 {{< param "fullversion" >}} 版本,请输入: ```bash curl -LO https://dl.k8s.io/release/{{< param "fullversion" >}}/bin/linux/amd64/kubectl ``` {{< /note >}} - <!-- - 1. Validate the binary (optional) +<!-- +1. Validate the binary (optional) - Download the kubectl checksum file: - --> -1. 验证该可执行文件(可选步骤) + Download the kubectl checksum file: +--> +2. 验证该可执行文件(可选步骤) 下载 kubectl 校验和文件: @@ -130,10 +129,10 @@ For example, to download version {{< param "fullversion" >}} on Linux, type: 下载的 kubectl 与校验和文件版本必须相同。 {{< /note >}} - <!-- - 1. Install kubectl - --> -1. 安装 kubectl +<!-- +1. Install kubectl +--> +3. 安装 kubectl ```bash sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl @@ -148,15 +147,14 @@ For example, to download version {{< param "fullversion" >}} on Linux, type: ```bash mkdir -p ~/.local/bin/kubectl mv ./kubectl ~/.local/bin/kubectl - # and then add ~/.local/bin/kubectl to $PATH + # 之后将 ~/.local/bin/kubectl 添加到 $PATH ``` - {{< /note >}} - <!-- - 1. Test to ensure the version you installed is up-to-date: - --> -1. 执行测试,以保障你安装的版本是最新的: +<!-- +1. Test to ensure the version you installed is up-to-date: +--> +4. 执行测试,以保障你安装的版本是最新的: ```bash kubectl version --client @@ -169,14 +167,49 @@ For example, to download version {{< param "fullversion" >}} on Linux, type: {{< tabs name="kubectl_install" >}} {{< tab name="Ubuntu、Debian 或 HypriotOS" codelang="bash" >}} -sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2 curl -curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - -echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list -sudo apt-get update -sudo apt-get install -y kubectl + +<!-- +1. Update the `apt` package index and install packages needed to use the Kubernetes `apt` repository: +--> +1. 更新 `apt` 包索引,并安装使用 Kubernetes `apt` 仓库锁需要的包: + + ```shell + sudo apt-get update + sudo apt-get install -y apt-transport-https ca-certificates curl + ``` + +<!-- +2. Download the Google Cloud public signing key: +--> +2. 下载 Google Cloud 公开签名秘钥: + + ```shell + sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg + ``` + +<!-- +3. Add the Kubernetes `apt` repository: +--> +3. 添加 Kubernetes `apt` 仓库: + + ```shell + echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list + ``` + +<!-- +4. Update `apt` package index with the new repository and install kubectl: +--> +4. 更新 `apt` 包索引,使之包含新的仓库并安装 kubectl: + + ```shell + sudo apt-get update + sudo apt-get install -y kubectl + ``` + {{< /tab >}} -{{< tab name="CentOS、RHEL 或 Fedora" codelang="bash" >}}cat <<EOF > /etc/yum.repos.d/kubernetes.repo +{{< tab name="基于 Red Hat 的发行版" codelang="bash" >}} +cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 @@ -199,7 +232,8 @@ yum install -y kubectl <!-- If you are on Ubuntu or another Linux distribution that support [snap](https://snapcraft.io/docs/core/install) package manager, kubectl is available as a [snap](https://snapcraft.io/) application. --> -如果你使用的 Ubuntu 或其他 Linux 发行版,内建支持 [snap](https://snapcraft.io/docs/core/install) 包管理工具, +如果你使用的 Ubuntu 或其他 Linux 发行版,内建支持 +[snap](https://snapcraft.io/docs/core/install) 包管理工具, 则可用 [snap](https://snapcraft.io/) 命令安装 kubectl。 ```shell @@ -213,7 +247,8 @@ kubectl version --client <!-- If you are on Linux and using [Homebrew](https://docs.brew.sh/Homebrew-on-Linux) package manager, kubectl is available for [installation](https://docs.brew.sh/Homebrew-on-Linux#install). --> -如果你使用 Linux 系统,并且装了 [Homebrew](https://docs.brew.sh/Homebrew-on-Linux) 包管理工具, +如果你使用 Linux 系统,并且装了 [Homebrew](https://docs.brew.sh/Homebrew-on-Linux) +包管理工具, 则可以使用这种方式[安装](https://docs.brew.sh/Homebrew-on-Linux#install) kubectl。 ```shell @@ -239,6 +274,11 @@ kubectl version --client {{< include "included/verify-kubectl.md" >}} +<!-- +## Optional kubectl configurations + +### Enable shell autocompletion +--> ## kubectl 的可选配置 {#optional-kubectl-configurations} ### 启用 shell 自动补全功能 {#enable-shell-autocompletion} @@ -260,3 +300,4 @@ kubectl 为 Bash 和 Zsh 提供自动补全功能,可以减轻许多输入的 ## {{% heading "whatsnext" %}} {{< include "included/kubectl-whats-next.md" >}} + diff --git a/content/zh/docs/tasks/tools/install-kubectl-macos.md b/content/zh/docs/tasks/tools/install-kubectl-macos.md index bd5e670e86..ec9dcae5f8 100644 --- a/content/zh/docs/tasks/tools/install-kubectl-macos.md +++ b/content/zh/docs/tasks/tools/install-kubectl-macos.md @@ -8,7 +8,6 @@ card: title: 在 macOS 系统上安装 kubectl --- <!-- ---- reviewers: - mikedanese title: Install and Set Up kubectl on macOS @@ -18,18 +17,17 @@ card: name: tasks weight: 20 title: Install kubectl on macOS ---- --> ## {{% heading "prerequisites" %}} <!-- -You must use a kubectl version that is within one minor version difference of your cluster. -For example, a v1.2 client should work with v1.1, v1.2, and v1.3 master. +You must use a kubectl version that is within one minor version difference of your cluster. For example, a v{{< skew latestVersion >}} client can communicate with v{{< skew prevMinorVersion >}}, v{{< skew latestVersion >}}, and v{{< skew nextMinorVersion >}} control planes. Using the latest version of kubectl helps avoid unforeseen issues. --> kubectl 版本和集群之间的差异必须在一个小版本号之内。 -例如:v1.2 版本的客户端只能与 v1.1、v1.2 和 v1.3 版本的集群一起工作。 +例如:v{{< skew latestVersion >}} 版本的客户端能与 v{{< skew prevMinorVersion >}}、 +v{{< skew latestVersion >}} 和 v{{< skew nextMinorVersion >}} 版本的控制面通信。 用最新版本的 kubectl 有助于避免不可预见的问题。 <!-- @@ -42,16 +40,16 @@ The following methods exist for installing kubectl on macOS: --> 在 macOS 系统上安装 kubectl 有如下方法: -- [{{% heading "prerequisites" %}}](#{{% heading "prerequisites" %}}) -- [在 macOS 系统上安装 kubectl](#install-kubectl-on-macos) - - [用 curl 在 macOS 系统上安装 kubectl](#install-kubectl-binary-with-curl-on-macos) - - [用 Homebrew 在 macOS 系统上安装](#install-with-homebrew-on-macos) - - [用 Macports 在 macOS 上安装](#install-with-macports-on-macos) - - [作为谷歌云 SDK 的一部分,在 macOS 上安装](#install-on-macos-as-part-of-the-google-cloud-sdk) -- [验证 kubectl 配置](#verify-kubectl-configuration) -- [可选的 kubectl 配置](#optional-kubectl-configurations) - - [启用 shell 自动补全功能](#enable-shell-autocompletion) -- [{{% heading "whatsnext" %}}](#{{% heading "whatsnext" %}}) +<!-- +- [Install kubectl binary with curl on macOS](#install-kubectl-binary-with-curl-on-macos) +- [Install with Homebrew on macOS](#install-with-homebrew-on-macos) +- [Install with Macports on macOS](#install-with-macports-on-macos) +- [Install on macOS as part of the Google Cloud SDK](#install-on-macos-as-part-of-the-google-cloud-sdk) +--> +- [用 curl 在 macOS 系统上安装 kubectl](#install-kubectl-binary-with-curl-on-macos) +- [用 Homebrew 在 macOS 系统上安装](#install-with-homebrew-on-macos) +- [用 Macports 在 macOS 上安装](#install-with-macports-on-macos) +- [作为谷歌云 SDK 的一部分,在 macOS 上安装](#install-on-macos-as-part-of-the-google-cloud-sdk) <!-- ### Install kubectl binary with curl on macOS {#install-kubectl-binary-with-curl-on-macos} @@ -63,40 +61,63 @@ The following methods exist for installing kubectl on macOS: --> 1. 下载最新的发行版: - ```bash + {{< tabs name="download_binary_macos" >}} + {{< tab name="Intel" codelang="bash" >}} curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl" - ``` + {{< /tab >}} + {{< tab name="Apple Silicon" codelang="bash" >}} + curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/arm64/kubectl" + {{< /tab >}} + {{< /tabs >}} {{< note >}} <!-- To download a specific version, replace the `$(curl -L -s https://dl.k8s.io/release/stable.txt)` portion of the command with the specific version. - For example, to download version {{< param "fullversion" >}} on macOS, type: - --> - 如果需要下载某个指定的版本,用该指定版本号替换掉命令的这个部分:`$(curl -L -s https://dl.k8s.io/release/stable.txt)`。 - 例如:要在 macOS 系统中下载 {{< param "fullversion" >}} 版本,则输入: + For example, to download version {{< param "fullversion" >}} on Intel macOS, type: ```bash - curl -LO https://dl.k8s.io/release/{{< param "fullversion" >}}/bin/darwin/amd64/kubectl + curl -LO "https://dl.k8s.io/release/{{< param "fullversion" >}}/bin/darwin/arm64/kubectl" ``` + --> + 如果需要下载某个指定的版本,用该指定版本号替换掉命令的这个部分:`$(curl -L -s https://dl.k8s.io/release/stable.txt)`。 + 例如:要为 Intel macOS 系统下载 {{< param "fullversion" >}} 版本,则输入: + + ```bash + curl -LO "https://dl.k8s.io/release/{{< param "fullversion" >}}/bin/darwin/amd64/kubectl" + ``` + + <!-- + And for macOS on Apple Silicon, type: + --> + 对于 Apple Silicon 版本的 macOS,输入: + + ```bash + curl -LO "https://dl.k8s.io/release/{{< param "fullversion" >}}/bin/darwin/arm64/kubectl" + ``` {{< /note >}} - <!-- - 1. Validate the binary (optional) +<!-- +1. Validate the binary (optional) Download the kubectl checksum file: - --> -1. 验证可执行文件(可选操作) +--> +2. 验证可执行文件(可选操作) 下载 kubectl 的校验和文件: - ```bash - curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl.sha256" - ``` + {{< tabs name="download_checksum_macos" >}} + {{< tab name="Intel" codelang="bash" >}} + curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl.sha256" + {{< /tab >}} + {{< tab name="Apple Silicon" codelang="bash" >}} + curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/arm64/kubectl.sha256" + {{< /tab >}} + {{< /tabs >}} <!-- - Validate the kubectl binary against the checksum file: + Validate the kubectl binary against the checksum file: --> 根据校验和文件,验证 kubectl: @@ -129,29 +150,29 @@ The following methods exist for installing kubectl on macOS: 下载的 kubectl 与校验和文件版本要相同。 {{< /note >}} - <!-- - 1. Make the kubectl binary executable. - --> -1. 将 kubectl 置为可执行文件: +<!-- +1. Make the kubectl binary executable. +--> +3. 将 kubectl 置为可执行文件: ```bash chmod +x ./kubectl ``` - <!-- - 1. Move the kubectl binary to a file location on your system `PATH`. - --> -1. 将可执行文件 kubectl 移动到系统可寻址路径 `PATH` 内的一个位置: +<!-- +1. Move the kubectl binary to a file location on your system `PATH`. +--> +4. 将可执行文件 kubectl 移动到系统可寻址路径 `PATH` 内的一个位置: ```bash sudo mv ./kubectl /usr/local/bin/kubectl sudo chown root: /usr/local/bin/kubectl ``` - <!-- - 1. Test to ensure the version you installed is up-to-date: - --> -1. 测试一下,确保你安装的是最新的版本: +<!-- +1. Test to ensure the version you installed is up-to-date: +--> +5. 测试一下,确保你安装的是最新的版本: ```bash kubectl version --client @@ -183,10 +204,10 @@ If you are on macOS and using [Homebrew](https://brew.sh/) package manager, you brew install kubernetes-cli ``` - <!-- - 1. Test to ensure the version you installed is up-to-date: - --> -1. 测试一下,确保你安装的是最新的版本: +<!-- +1. Test to ensure the version you installed is up-to-date: +--> +2. 测试一下,确保你安装的是最新的版本: ```bash kubectl version --client @@ -212,10 +233,10 @@ If you are on macOS and using [Macports](https://macports.org/) package manager, sudo port install kubectl ``` - <!-- - 1. Test to ensure the version you installed is up-to-date: - --> -1. 测试一下,确保你安装的是最新的版本: +<!-- +1. Test to ensure the version you installed is up-to-date: +--> +2. 测试一下,确保你安装的是最新的版本: ```bash kubectl version --client @@ -260,4 +281,5 @@ kubectl 为 Bash 和 Zsh 提供自动补全功能,这可以节省许多输入 ## {{% heading "whatsnext" %}} -{{< include "included/kubectl-whats-next.md" >}} \ No newline at end of file +{{< include "included/kubectl-whats-next.md" >}} + diff --git a/content/zh/docs/tasks/tools/install-kubectl-windows.md b/content/zh/docs/tasks/tools/install-kubectl-windows.md index 9b3c975056..43d33e7510 100644 --- a/content/zh/docs/tasks/tools/install-kubectl-windows.md +++ b/content/zh/docs/tasks/tools/install-kubectl-windows.md @@ -8,7 +8,6 @@ card: title: Windows 安装 kubectl --- <!-- ---- reviewers: - mikedanese title: Install and Set Up kubectl on Windows @@ -18,18 +17,17 @@ card: name: tasks weight: 20 title: Install kubectl on Windows ---- --> ## {{% heading "prerequisites" %}} <!-- -You must use a kubectl version that is within one minor version difference of your cluster. -For example, a v1.2 client should work with v1.1, v1.2, and v1.3 master. +You must use a kubectl version that is within one minor version difference of your cluster. For example, a v{{< skew latestVersion >}} client can communicate with v{{< skew prevMinorVersion >}}, v{{< skew latestVersion >}}, and v{{< skew nextMinorVersion >}} control planes. Using the latest version of kubectl helps avoid unforeseen issues. --> kubectl 版本和集群版本之间的差异必须在一个小版本号内。 -例如:v1.2 版本的客户端只能与 v1.1、v1.2 和 v1.3 版本的集群一起工作。 +例如:v{{< skew latestVersion >}} 版本的客户端能与 v{{< skew prevMinorVersion >}}、 +v{{< skew latestVersion >}} 和 v{{< skew nextMinorVersion >}} 版本的控制面通信。 用最新版的 kubectl 有助于避免不可预见的问题。 <!-- @@ -43,7 +41,6 @@ The following methods exist for installing kubectl on Windows: 在 Windows 系统中安装 kubectl 有如下几种方法: - [用 curl 在 Windows 上安装 kubectl](#install-kubectl-binary-with-curl-on-windows) -- [用 PowerShell 从 PSGallery 安装](#install-with-powershell-from-psgallery) - [在 Windows 上用 Chocolatey 或 Scoop 安装](#install-on-windows-using-chocolatey-or-scoop) - [作为谷歌云 SDK 的一部分,在 Windows 上安装](#install-on-windows-as-part-of-the-google-cloud-sdk) @@ -133,55 +130,6 @@ If you have installed Docker Desktop before, you may need to place your `PATH` e 或者直接删掉 Docker Desktop 的 `kubectl`。 {{< /note >}} -<!-- -### Install with PowerShell from PSGallery ---> -### 用 PowerShell 从 PSGallery 安装 {#install-with-powershell-from-psgallery} - -<!-- -If you are on Windows and using the [PowerShell Gallery](https://www.powershellgallery.com/) package manager, you can install and update kubectl with PowerShell. ---> -如果你工作在 Windows 平台上,且使用 [PowerShell Gallery](https://www.powershellgallery.com/) 包管理器, -则可以用 PowerShell 安装、更新 kubectl。 - -<!-- -1. Run the installation commands (making sure to specify a `DownloadLocation`): ---> -1. 运行安装命令(确保提供了参数 `DownloadLocation`): - - ```powershell - Install-Script -Name 'install-kubectl' -Scope CurrentUser -Force - install-kubectl.ps1 [-DownloadLocation <path>] - ``` - - <!-- - If you do not specify a `DownloadLocation`, `kubectl` will be installed in the user's `temp` Directory. - --> - {{< note >}} - 如果没有指定 `DownloadLocation`,`kubectl` 则会被安装到用户的 `temp` 目录下。 - {{< /note >}} - - <!-- - The installer creates `$HOME/.kube` and instructs it to create a config file. - --> - 安装程序创建 `$HOME/.kube`,并指示其创建配置文件。 - - <!-- - 1. Test to ensure the version you installed is up-to-date: - --> -1. 测试一下,确保你安装的是最新版本: - - ```powershell - kubectl version --client - ``` - -<!-- -Updating the installation is performed by rerunning the two commands listed in step 1. ---> -{{< note >}} -更新安装是通过重新运行步骤 1 中的两个命令而实现。 -{{< /note >}} - <!-- ### Install on Windows using Chocolatey or Scoop --> @@ -298,4 +246,5 @@ kubectl 为 Bash 和 Zsh 提供自动补全功能,可以减轻许多输入的 ## {{% heading "whatsnext" %}} -{{< include "included/kubectl-whats-next.md" >}} \ No newline at end of file +{{< include "included/kubectl-whats-next.md" >}} + From 81aa62d9ffd2fe99acafb26bcf80ad2665e6c3e3 Mon Sep 17 00:00:00 2001 From: Arhell <arhell333@gmail.com> Date: Sat, 15 May 2021 12:34:28 +0300 Subject: [PATCH 142/221] [zh] address typos docker-cli-kubectl --- content/zh/docs/reference/kubectl/docker-cli-to-kubectl.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/zh/docs/reference/kubectl/docker-cli-to-kubectl.md b/content/zh/docs/reference/kubectl/docker-cli-to-kubectl.md index 74473b4b1c..a5b8789163 100644 --- a/content/zh/docs/reference/kubectl/docker-cli-to-kubectl.md +++ b/content/zh/docs/reference/kubectl/docker-cli-to-kubectl.md @@ -17,9 +17,9 @@ reviewers: <!-- overview --> <!-- -You can use the Kubernetes command line tool kubectl to interact with the API Server. Using kubectl is straightforward if you are familiar with the Docker command line tool. However, there are a few differences between the docker commands and the kubectl commands. The following sections show a docker sub-command and describe the equivalent kubectl command. +You can use the Kubernetes command line tool `kubectl` to interact with the API Server. Using kubectl is straightforward if you are familiar with the Docker command line tool. However, there are a few differences between the docker commands and the kubectl commands. The following sections show a Docker sub-command and describe the equivalent `kubectl` command. --> -您可以使用 Kubernetes 命令行工具 kubectl 与 API 服务器进行交互。如果您熟悉 Docker 命令行工具,则使用 kubectl 非常简单。但是,docker 命令和 kubectl 命令之间有一些区别。以下显示了 docker 子命令,并描述了等效的 kubectl 命令。 +您可以使用 Kubernetes 命令行工具 `kubectl` 与 API 服务器进行交互。如果您熟悉 Docker 命令行工具,则使用 kubectl 非常简单。但是,Docker 命令和 kubectl 命令之间有一些区别。以下显示了 Docker 子命令,并描述了等效的 `kubectl` 命令。 <!-- body --> From d2025e448c99472e98bc2caa44d8ac9592625fda Mon Sep 17 00:00:00 2001 From: Arhell <arhell333@gmail.com> Date: Sun, 16 May 2021 00:32:37 +0300 Subject: [PATCH 143/221] [zh] fix capitalization --- .../docs/concepts/cluster-administration/manage-deployment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/concepts/cluster-administration/manage-deployment.md b/content/zh/docs/concepts/cluster-administration/manage-deployment.md index e28da08081..eb991447b5 100644 --- a/content/zh/docs/concepts/cluster-administration/manage-deployment.md +++ b/content/zh/docs/concepts/cluster-administration/manage-deployment.md @@ -74,7 +74,7 @@ kubectl apply -f https://k8s.io/examples/application/nginx/ It is a recommended practice to put resources related to the same microservice or application tier into the same file, and to group all of the files associated with your application in the same directory. If the tiers of your application bind to each other using DNS, then you can deploy all of the components of your stack together. -A URL can also be specified as a configuration source, which is handy for deploying directly from configuration files checked into github: +A URL can also be specified as a configuration source, which is handy for deploying directly from configuration files checked into Github: --> `kubectl` 将读取任何后缀为 `.yaml`、`.yml` 或者 `.json` 的文件。 From d4146d2384a2bf887dd2c7e29460b4b7af8da618 Mon Sep 17 00:00:00 2001 From: Arhell <arhell333@gmail.com> Date: Mon, 17 May 2021 01:15:55 +0300 Subject: [PATCH 144/221] [ja] Add a missing feature gate entry --- .../docs/reference/command-line-tools-reference/feature-gates.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/ja/docs/reference/command-line-tools-reference/feature-gates.md b/content/ja/docs/reference/command-line-tools-reference/feature-gates.md index 11334045fc..01a2c289e9 100644 --- a/content/ja/docs/reference/command-line-tools-reference/feature-gates.md +++ b/content/ja/docs/reference/command-line-tools-reference/feature-gates.md @@ -203,6 +203,7 @@ content_type: concept | `DynamicProvisioningScheduling` | - | Deprecated| 1.12 | - | | `DynamicVolumeProvisioning` | `true` | Alpha | 1.3 | 1.7 | | `DynamicVolumeProvisioning` | `true` | GA | 1.8 | - | +| `EnableAggregatedDiscoveryTimeout` | `true` | Deprecated | 1.16 | - | | `EnableEquivalenceClassCache` | `false` | Alpha | 1.8 | 1.14 | | `EnableEquivalenceClassCache` | - | Deprecated | 1.15 | - | | `ExperimentalCriticalPodAnnotation` | `false` | Alpha | 1.5 | 1.12 | From 1f1c57cf8e5a07b8eafbe9cbe69456beec6f3deb Mon Sep 17 00:00:00 2001 From: Arhell <arhell333@gmail.com> Date: Tue, 18 May 2021 00:44:08 +0300 Subject: [PATCH 145/221] [ja] Improvement: Managing Secret using kubectl --- .../tasks/configmap-secret/managing-secret-using-kubectl.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/ja/docs/tasks/configmap-secret/managing-secret-using-kubectl.md b/content/ja/docs/tasks/configmap-secret/managing-secret-using-kubectl.md index 9e498de8ac..fbc427469e 100644 --- a/content/ja/docs/tasks/configmap-secret/managing-secret-using-kubectl.md +++ b/content/ja/docs/tasks/configmap-secret/managing-secret-using-kubectl.md @@ -114,10 +114,10 @@ kubectl get secret db-user-pass -o jsonpath='{.data}' 出力は次のようになります: ```json -{"password.txt":"MWYyZDFlMmU2N2Rm","username.txt":"YWRtaW4="} +{"password":"MWYyZDFlMmU2N2Rm","username":"YWRtaW4="} ``` -`password.txt`のデータをデコードします: +`password`のデータをデコードします: ```shell echo 'MWYyZDFlMmU2N2Rm' | base64 --decode From 0e265010e5d61a820ecec565c5668bc96731542d Mon Sep 17 00:00:00 2001 From: Jihoon Seo <jihoon.seo@etri.re.kr> Date: Thu, 22 Apr 2021 15:11:13 +0900 Subject: [PATCH 146/221] Add line breaks in Markdown code --- .../container-runtimes.md | 22 +++-- .../windows/user-guide-windows-containers.md | 90 ++++++++++++++----- 2 files changed, 84 insertions(+), 28 deletions(-) diff --git a/content/en/docs/setup/production-environment/container-runtimes.md b/content/en/docs/setup/production-environment/container-runtimes.md index ebbd11f081..188a02673a 100644 --- a/content/en/docs/setup/production-environment/container-runtimes.md +++ b/content/en/docs/setup/production-environment/container-runtimes.md @@ -99,7 +99,10 @@ Install containerd: {{< tabs name="tab-cri-containerd-installation" >}} {{% tab name="Linux" %}} -1. Install the `containerd.io` package from the official Docker repositories. Instructions for setting up the Docker repository for your respective Linux distribution and installing the `containerd.io` package can be found at [Install Docker Engine](https://docs.docker.com/engine/install/#server). +1. Install the `containerd.io` package from the official Docker repositories. +Instructions for setting up the Docker repository for your respective Linux distribution and +installing the `containerd.io` package can be found at +[Install Docker Engine](https://docs.docker.com/engine/install/#server). 2. Configure containerd: @@ -117,7 +120,8 @@ Install containerd: {{% /tab %}} {{% tab name="Windows (PowerShell)" %}} -Start a Powershell session, set `$Version` to the desired version (ex: `$Version=1.4.3`), and then run the following commands: +Start a Powershell session, set `$Version` to the desired version (ex: `$Version=1.4.3`), +and then run the following commands: 1. Download containerd: @@ -243,7 +247,8 @@ sudo apt-get install cri-o cri-o-runc {{% tab name="Ubuntu" %}} -To install on the following operating systems, set the environment variable `OS` to the appropriate field in the following table: +To install on the following operating systems, set the environment variable `OS` +to the appropriate field in the following table: | Operating system | `$OS` | | ---------------- | ----------------- | @@ -278,7 +283,8 @@ sudo apt-get install cri-o cri-o-runc {{% tab name="CentOS" %}} -To install on the following operating systems, set the environment variable `OS` to the appropriate field in the following table: +To install on the following operating systems, set the environment variable `OS` +to the appropriate field in the following table: | Operating system | `$OS` | | ---------------- | ----------------- | @@ -358,7 +364,10 @@ in sync. ### Docker -1. On each of your nodes, install the Docker for your Linux distribution as per [Install Docker Engine](https://docs.docker.com/engine/install/#server). You can find the latest validated version of Docker in this [dependencies](https://git.k8s.io/kubernetes/build/dependencies.yaml) file. +1. On each of your nodes, install the Docker for your Linux distribution as per +[Install Docker Engine](https://docs.docker.com/engine/install/#server). +You can find the latest validated version of Docker in this +[dependencies](https://git.k8s.io/kubernetes/build/dependencies.yaml) file. 2. Configure the Docker daemon, in particular to use systemd for the management of the container’s cgroups. @@ -377,7 +386,8 @@ in sync. ``` {{< note >}} - `overlay2` is the preferred storage driver for systems running Linux kernel version 4.0 or higher, or RHEL or CentOS using version 3.10.0-514 and above. + `overlay2` is the preferred storage driver for systems running Linux kernel version 4.0 or higher, + or RHEL or CentOS using version 3.10.0-514 and above. {{< /note >}} 3. Restart Docker and enable on boot: diff --git a/content/en/docs/setup/production-environment/windows/user-guide-windows-containers.md b/content/en/docs/setup/production-environment/windows/user-guide-windows-containers.md index ce7aee8a89..7ddf5397ae 100644 --- a/content/en/docs/setup/production-environment/windows/user-guide-windows-containers.md +++ b/content/en/docs/setup/production-environment/windows/user-guide-windows-containers.md @@ -11,7 +11,8 @@ weight: 75 <!-- overview --> -Windows applications constitute a large portion of the services and applications that run in many organizations. This guide walks you through the steps to configure and deploy a Windows container in Kubernetes. +Windows applications constitute a large portion of the services and applications that run in many organizations. +This guide walks you through the steps to configure and deploy a Windows container in Kubernetes. @@ -24,12 +25,18 @@ Windows applications constitute a large portion of the services and applications ## Before you begin -* Create a Kubernetes cluster that includes a [master and a worker node running Windows Server](/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes) -* It is important to note that creating and deploying services and workloads on Kubernetes behaves in much the same way for Linux and Windows containers. [Kubectl commands](/docs/reference/kubectl/overview/) to interface with the cluster are identical. The example in the section below is provided to jumpstart your experience with Windows containers. +* Create a Kubernetes cluster that includes a +[master and a worker node running Windows Server](/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes) +* It is important to note that creating and deploying services and workloads on Kubernetes +behaves in much the same way for Linux and Windows containers. +[Kubectl commands](/docs/reference/kubectl/overview/) to interface with the cluster are identical. +The example in the section below is provided to jumpstart your experience with Windows containers. ## Getting Started: Deploying a Windows container -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: +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 @@ -76,7 +83,8 @@ spec: ``` {{< note >}} -Port mapping is also supported, but for simplicity in this example the container port 80 is exposed directly to the service. +Port mapping is also supported, but for simplicity in this example +the container port 80 is exposed directly to the service. {{< /note >}} 1. Check that all nodes are healthy: @@ -98,51 +106,85 @@ Port mapping is also supported, but for simplicity in this example the container * Two containers per pod on the Windows node, use `docker ps` * Two pods listed from the Linux master, use `kubectl get pods` - * Node-to-pod communication across the network, `curl` port 80 of your pod IPs from the Linux master to check for a web server response - * Pod-to-pod communication, ping between pods (and across hosts, if you have more than one Windows node) using docker exec or kubectl exec - * Service-to-pod communication, `curl` the virtual service IP (seen under `kubectl get services`) from the Linux master and from individual pods + * Node-to-pod communication across the network, `curl` port 80 of your pod IPs from the Linux master + to check for a web server response + * Pod-to-pod communication, ping between pods (and across hosts, if you have more than one Windows node) + using docker exec or kubectl exec + * Service-to-pod communication, `curl` the virtual service IP (seen under `kubectl get services`) + from the Linux master and from individual pods * Service discovery, `curl` the service name with the Kubernetes [default DNS suffix](/docs/concepts/services-networking/dns-pod-service/#services) * Inbound connectivity, `curl` the NodePort from the Linux master or machines outside of the cluster * Outbound connectivity, `curl` external IPs from inside the pod using kubectl exec {{< note >}} -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. +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 <pod>`. +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 <pod>`. -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. +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/). +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/). +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/). ## Taints and Tolerations -Users today need to use some combination of taints and node selectors in order to keep Linux and Windows workloads on their respective OS-specific nodes. This likely imposes a burden only on Windows users. The recommended approach is outlined below, with one of its main goals being that this approach should not break compatibility for existing Linux workloads. +Users today need to use some combination of taints and node selectors in order to +keep Linux and Windows workloads on their respective OS-specific nodes. +This likely imposes a burden only on Windows users. The recommended approach is outlined below, +with one of its main goals being that this approach should not break compatibility for existing Linux workloads. ### Ensuring OS-specific workloads land on the appropriate container host -Users can ensure Windows containers can be scheduled on the appropriate host using Taints and Tolerations. All Kubernetes nodes today have the following default labels: +Users can ensure Windows containers can be scheduled on the appropriate host using Taints and Tolerations. +All Kubernetes nodes today have the following default labels: * kubernetes.io/os = [windows|linux] * kubernetes.io/arch = [amd64|arm64|...] -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. +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. +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=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. +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: @@ -160,9 +202,11 @@ tolerations: 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. +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. +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) | |--------------------------------------|------------------------| @@ -173,10 +217,12 @@ This label reflects the Windows major, minor, and build number that need to matc ### 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. +[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. +1. Save this file to `runtimeClasses.yml`. It includes the appropriate `nodeSelector` +for the Windows OS, architecture, and version. ```yaml apiVersion: node.k8s.io/v1 From a4f7ed2a38ea0309266a3d54a0414a4190e76902 Mon Sep 17 00:00:00 2001 From: Paco Xu <paco.xu@daocloud.io> Date: Tue, 18 May 2021 17:50:40 +0800 Subject: [PATCH 147/221] use `kubectl debug` as `alpha debug` is deprecated refer to #24847 --- .../debug-application-cluster/debug-running-pod.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/zh/docs/tasks/debug-application-cluster/debug-running-pod.md b/content/zh/docs/tasks/debug-application-cluster/debug-running-pod.md index 3889cdf701..4517bbca79 100644 --- a/content/zh/docs/tasks/debug-application-cluster/debug-running-pod.md +++ b/content/zh/docs/tasks/debug-application-cluster/debug-running-pod.md @@ -135,7 +135,7 @@ The examples in this section require the `EphemeralContainers` [feature gate]( /docs/reference/command-line-tools-reference/feature-gates/) enabled in your cluster and `kubectl` version v1.18 or later. -You can use the `kubectl alpha debug` command to add ephemeral containers to a +You can use the `kubectl debug` command to add ephemeral containers to a running Pod. First, create a pod for the example: ```shell @@ -154,7 +154,7 @@ images. `kubectl` 版本为 v1.18 或者更高。 {{< /note >}} -你可以使用 `kubectl alpha debug` 命令来给正在运行中的 Pod 增加一个临时容器。 +你可以使用 `kubectl debug` 命令来给正在运行中的 Pod 增加一个临时容器。 首先,像示例一样创建一个 pod: ```shell @@ -177,12 +177,12 @@ kubectl exec -it ephemeral-demo -- sh OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused "exec: \"sh\": executable file not found in $PATH": unknown ``` -You can instead add a debugging container using `kubectl alpha debug`. If you +You can instead add a debugging container using `kubectl debug`. If you specify the `-i`/`--interactive` argument, `kubectl` will automatically attach to the console of the Ephemeral Container. ```shell -kubectl alpha debug -it ephemeral-demo --image=busybox --target=ephemeral-demo +kubectl debug -it ephemeral-demo --image=busybox --target=ephemeral-demo ``` ``` @@ -201,11 +201,11 @@ kubectl exec -it ephemeral-demo -- sh OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused "exec: \"sh\": executable file not found in $PATH": unknown ``` -你可以改为使用 `kubectl alpha debug` 添加调试容器。 +你可以改为使用 `kubectl debug` 添加调试容器。 如果你指定 `-i` 或者 `--interactive` 参数,`kubectl` 将自动挂接到临时容器的控制台。 ```shell -kubectl alpha debug -it ephemeral-demo --image=busybox --target=ephemeral-demo +kubectl debug -it ephemeral-demo --image=busybox --target=ephemeral-demo ``` ``` From 465b7860f89acea903754ebbdc6457c3abd8ecb5 Mon Sep 17 00:00:00 2001 From: Haardik Dharma <dharmahaardik08@gmail.com> Date: Tue, 18 May 2021 20:43:24 +0530 Subject: [PATCH 148/221] Update task-tutorial-prereqs.md --- content/en/includes/task-tutorial-prereqs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/includes/task-tutorial-prereqs.md b/content/en/includes/task-tutorial-prereqs.md index 93195d8b9c..b5d3c0abf3 100644 --- a/content/en/includes/task-tutorial-prereqs.md +++ b/content/en/includes/task-tutorial-prereqs.md @@ -1,7 +1,7 @@ You need to have a Kubernetes cluster, and the kubectl command-line tool must -be configured to communicate with your cluster. If you do not already have a +be configured to communicate with your cluster. It is recommended to run this tutorial on a cluster with at least two nodes that are not acting as control plane hosts. If you do not already have a cluster, you can create one by using -[minikube](/docs/tasks/tools/#minikube) +[minikube](https://minikube.sigs.k8s.io/docs/tutorials/multi_node/) or you can use one of these Kubernetes playgrounds: * [Katacoda](https://www.katacoda.com/courses/kubernetes/playground) From 249731705df91dd265e343b3996559482740d7b0 Mon Sep 17 00:00:00 2001 From: Jack Wu <wuyang01@inspur.com> Date: Wed, 19 May 2021 09:41:50 +0800 Subject: [PATCH 149/221] Update storage-classes.md --- content/zh/docs/concepts/storage/storage-classes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/zh/docs/concepts/storage/storage-classes.md b/content/zh/docs/concepts/storage/storage-classes.md index addf5deee9..9cf05702b5 100644 --- a/content/zh/docs/concepts/storage/storage-classes.md +++ b/content/zh/docs/concepts/storage/storage-classes.md @@ -237,8 +237,8 @@ the class or PV, If a mount option is invalid, the PV mount fails. 由 StorageClass 动态创建的 PersistentVolume 将使用类中 `mountOptions` 字段指定的挂载选项。 -如果卷插件不支持挂载选项,却指定了选项,则制备操作会失败。 -挂载选项在 StorageClass 和 PV 上都不会做验证,如果其中一个挂载选项无效,那么这个 PV 挂载就会失败。 +如果卷插件不支持挂载选项,却指定了挂载选项,则制备操作会失败。 +挂载选项在 StorageClass 和 PV 上都不会做验证,如果其中一个挂载选项无效,那么这个 PV 挂载操作就会失败。 <!-- ### Volume Binding Mode From 08df1089e16bdeaa6e633814c1e6e5d893c6197b Mon Sep 17 00:00:00 2001 From: Kobayashi Daisuke <kobayashi.da-06@fujitsu.com> Date: Wed, 19 May 2021 15:29:43 +0900 Subject: [PATCH 150/221] Update content/ja/docs/concepts/configuration/secret.md Co-authored-by: atoato88 <akihito-inou@nec.com> --- content/ja/docs/concepts/configuration/secret.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/ja/docs/concepts/configuration/secret.md b/content/ja/docs/concepts/configuration/secret.md index 3ed92c01a5..ac9fc589e5 100644 --- a/content/ja/docs/concepts/configuration/secret.md +++ b/content/ja/docs/concepts/configuration/secret.md @@ -80,7 +80,7 @@ empty-secret Opaque 0 2m6s ``` `DATA`列には、Secretに保存されているデータ項目の数が表示されます。 -この場合、「0」は空のSecretを作成したことを意味します。 +この場合、`0`は空のSecretを作成したことを意味します。 ### Service account token Secrets @@ -1064,4 +1064,3 @@ Podに複数のコンテナが含まれることもあります。しかし、Po - [`kubectl`を使用してSecretを管理する](/docs/tasks/configmap-secret/managing-secret-using-kubectl/)方法を学ぶ - [config fileを使用してSecretを管理する](/docs/tasks/configmap-secret/managing-secret-using-config-file/)方法を学ぶ - [kustomizeを使用してSecretを管理する](/docs/tasks/configmap-secret/managing-secret-using-kustomize/)方法を学ぶ - From 2a80c6d052a52ec91198797d403cf596c722f0c8 Mon Sep 17 00:00:00 2001 From: Kobayashi Daisuke <kobayashi.da-06@fujitsu.com> Date: Wed, 19 May 2021 15:29:49 +0900 Subject: [PATCH 151/221] Update content/ja/docs/concepts/configuration/secret.md Co-authored-by: atoato88 <akihito-inou@nec.com> --- content/ja/docs/concepts/configuration/secret.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/configuration/secret.md b/content/ja/docs/concepts/configuration/secret.md index ac9fc589e5..eeb0cc7d05 100644 --- a/content/ja/docs/concepts/configuration/secret.md +++ b/content/ja/docs/concepts/configuration/secret.md @@ -184,7 +184,7 @@ metadata: type: kubernetes.io/basic-auth stringData: username: admin - password: t0p-Secret config.yaml: |- + password: t0p-Secret ``` From 5cd82a6ff84d96cb7fbae8535e45ff6c4fa6a87d Mon Sep 17 00:00:00 2001 From: Kobayashi Daisuke <kobayashi.da-06@fujitsu.com> Date: Wed, 19 May 2021 15:29:56 +0900 Subject: [PATCH 152/221] Update content/ja/docs/concepts/configuration/secret.md Co-authored-by: atoato88 <akihito-inou@nec.com> --- content/ja/docs/concepts/configuration/secret.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/configuration/secret.md b/content/ja/docs/concepts/configuration/secret.md index eeb0cc7d05..56fc9120cd 100644 --- a/content/ja/docs/concepts/configuration/secret.md +++ b/content/ja/docs/concepts/configuration/secret.md @@ -248,7 +248,7 @@ kubectl create secret tls my-tls-secret \ 公開鍵と秘密鍵のペアは、事前に存在している必要があります。`--cert`の公開鍵証明書は.PEMエンコード(Base64エンコードDER形式)であり、`--key`の指定された秘密鍵と一致する必要があります。 -秘密鍵は、一般にPEM秘密鍵形式と呼ばれる暗号化されていない形式である必要があります。どちらの場合も、PEMの最初と最後の行(たとえば、`-------- BEGIN CERTIFICATE -----`と`------- END CERTIFICATE ----`)は含まれていません。 +秘密鍵は、一般にPEM秘密鍵形式と呼ばれる暗号化されていない形式である必要があります。どちらの場合も、PEMの最初と最後の行(たとえば、`-------- BEGIN CERTIFICATE -----`と`------- END CERTIFICATE ----`)は含まれて*いません*。 ### Bootstrap token Secrets From cafc10704de0ebea06372a6382d9b1feec8cfd41 Mon Sep 17 00:00:00 2001 From: Kobayashi Daisuke <kobayashi.da-06@fujitsu.com> Date: Wed, 19 May 2021 15:30:34 +0900 Subject: [PATCH 153/221] Update content/ja/docs/concepts/configuration/secret.md Co-authored-by: atoato88 <akihito-inou@nec.com> --- content/ja/docs/concepts/configuration/secret.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/configuration/secret.md b/content/ja/docs/concepts/configuration/secret.md index 56fc9120cd..0eb5e41839 100644 --- a/content/ja/docs/concepts/configuration/secret.md +++ b/content/ja/docs/concepts/configuration/secret.md @@ -633,7 +633,7 @@ echo $SECRET_PASSWORD {{< feature-state for_k8s_version="v1.19" state="beta" >}} -Kubernetesベータ機能_ImmutableSecrets and ConfigMaps_は、個々のSecretsとConfigMapsをimutableとして設定するオプションを提供します。Secret(少なくとも数万の、SecretからPodへの一意のマウント)を広範囲に使用するクラスターの場合、データの変更を防ぐことには次の利点があります。 +Kubernetesベータ機能*ImmutableSecrets and ConfigMaps*は、個々のSecretsとConfigMapsをimutableとして設定するオプションを提供します。Secret(少なくとも数万の、SecretからPodへの一意のマウント)を広範囲に使用するクラスターの場合、データの変更を防ぐことには次の利点があります。 - アプリケーションの停止を引き起こす可能性のある偶発的な(または不要な)更新からユーザーを保護します - imutableとしてマークされたSecretのウォッチを閉じることで、kube-apiserverの負荷を大幅に削減することができ、クラスターのパフォーマンスを向上させます。 From 8ac8d358e6da0c0d24afd6b78c9b01fc8094fdfa Mon Sep 17 00:00:00 2001 From: Kobayashi Daisuke <kobayashi.da-06@fujitsu.com> Date: Wed, 19 May 2021 15:30:45 +0900 Subject: [PATCH 154/221] Update content/ja/docs/concepts/configuration/secret.md Co-authored-by: atoato88 <akihito-inou@nec.com> --- content/ja/docs/concepts/configuration/secret.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/configuration/secret.md b/content/ja/docs/concepts/configuration/secret.md index 0eb5e41839..692fb3f87a 100644 --- a/content/ja/docs/concepts/configuration/secret.md +++ b/content/ja/docs/concepts/configuration/secret.md @@ -649,7 +649,7 @@ data: immutable: true ``` {{< note >}} -SecretまたはConfigMapがimutableとしてマークされると、この変更を元に戻したり、`data`フィールドの内容を変更したりすることはできません。Secretを削除して再作成することしかできません。 +SecretまたはConfigMapがimutableとしてマークされると、この変更を元に戻したり、`data`フィールドの内容を変更したりすることは*できません*。Secretを削除して再作成することしかできません。 既存のPodは、削除されたSecretへのマウントポイントを維持します。これらのPodを再作成することをお勧めします。 {{< /note >}} From 1dcae361ea1cd62a5b08758f861273d42c65a757 Mon Sep 17 00:00:00 2001 From: KobayashiD27 <kobayashi.da-06@fujitsu.com> Date: Wed, 19 May 2021 15:35:56 +0900 Subject: [PATCH 155/221] Fix typo --- content/ja/docs/concepts/configuration/secret.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/content/ja/docs/concepts/configuration/secret.md b/content/ja/docs/concepts/configuration/secret.md index 692fb3f87a..d61a04770a 100644 --- a/content/ja/docs/concepts/configuration/secret.md +++ b/content/ja/docs/concepts/configuration/secret.md @@ -626,8 +626,6 @@ echo $SECRET_PASSWORD ``` 1f2d1e2e67df ``` -// diffの762あたり - ## Immutable Secrets {#secret-immutable} From c1d5b91a1148980e9da22b4ce0be900273b42e85 Mon Sep 17 00:00:00 2001 From: 404_K <437292602@qq.com> Date: Thu, 20 May 2021 12:55:43 +0800 Subject: [PATCH 156/221] Update overview.md --- content/zh/docs/reference/kubectl/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/reference/kubectl/overview.md b/content/zh/docs/reference/kubectl/overview.md index aa3d13cdc6..cd740388d6 100644 --- a/content/zh/docs/reference/kubectl/overview.md +++ b/content/zh/docs/reference/kubectl/overview.md @@ -74,7 +74,7 @@ where `command`, `TYPE`, `NAME`, and `flags` are: --> * `command`:指定要对一个或多个资源执行的操作,例如 `create`、`get`、`describe`、`delete`。 -* `TYPE`:指定[资源类型](#resource-types)。资源类型不区分大小写, +* `TYPE`:指定[资源类型](#资源类型)。资源类型不区分大小写, 可以指定单数、复数或缩写形式。例如,以下命令输出相同的结果: ```shell From 991bb00b59ec4118f546576d69a06775a1e387df Mon Sep 17 00:00:00 2001 From: Christopher Negus <striker57@gmail.com> Date: Thu, 20 May 2021 19:23:16 +0000 Subject: [PATCH 157/221] Fixed link Whats next heading --- content/en/docs/setup/production-environment/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/setup/production-environment/_index.md b/content/en/docs/setup/production-environment/_index.md index 27308495be..7b8eba7d6e 100644 --- a/content/en/docs/setup/production-environment/_index.md +++ b/content/en/docs/setup/production-environment/_index.md @@ -271,7 +271,7 @@ for information on creating a new service account. For example, you might want t - Add secrets that a pod could use to pull images from a particular container registry. See [Configure Service Accounts for Pods](/docs/tasks/configure-pod-container/configure-service-account/) for an example. - Assign RBAC permissions to a service account. See [ServiceAccount permissions](/docs/reference/access-authn-authz/rbac/#service-account-permissions) for details. -## What's next {#what-s-next} +## {{% heading "whatsnext" %}} - Decide if you want to build your own production Kubernetes or obtain one from available [Turnkey Cloud Solutions](/docs/setup/production-environment/turnkey-solutions/) From 4efbf939cc8a2b7a6f74d152cd7ed5419a5c163b Mon Sep 17 00:00:00 2001 From: Tim Bannister <tim@scalefactory.com> Date: Thu, 20 May 2021 20:55:38 +0100 Subject: [PATCH 158/221] Fix AKA for node-pressure eviction glossary item --- content/en/docs/reference/glossary/node-pressure-eviction.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/en/docs/reference/glossary/node-pressure-eviction.md b/content/en/docs/reference/glossary/node-pressure-eviction.md index 742ee3fe0c..05d641aeda 100644 --- a/content/en/docs/reference/glossary/node-pressure-eviction.md +++ b/content/en/docs/reference/glossary/node-pressure-eviction.md @@ -6,7 +6,8 @@ full_link: /docs/concepts/scheduling-eviction/node-pressure-eviction/ short_description: > Node-pressure eviction is the process by which the kubelet proactively fails pods to reclaim resources on nodes. -aka: kubelet eviction +aka: +- kubelet eviction tags: - operation --- From c56839e403ab8f2994063785b46168d4310778cf Mon Sep 17 00:00:00 2001 From: Shannon Kularathna <shannduin@google.com> Date: Fri, 21 May 2021 14:52:33 +0000 Subject: [PATCH 159/221] Update redirect destination --- static/_redirects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/_redirects b/static/_redirects index 399ee1604c..828413e411 100644 --- a/static/_redirects +++ b/static/_redirects @@ -262,7 +262,7 @@ /docs/tasks/administer-cluster/quota-memory-cpu-namespace/ /docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/ 301 /docs/tasks/administer-cluster/quota-pod-namespace/ /docs/tasks/administer-cluster/manage-resources/quota-pod-namespace/ 301 /docs/tasks/administer-cluster/reserve-compute-resources/out-of-resource.md /docs/tasks/administer-cluster/out-of-resource/ 301 -/docs/tasks/administer-cluster/out-of-resource/ /docs/concepts/scheduling-eviction/pod-eviction/ 301 +/docs/tasks/administer-cluster/out-of-resource/ /docs/concepts/scheduling-eviction/node-pressure-eviction/ 301 /docs/tasks/administer-cluster/romana-network-policy/ /docs/tasks/administer-cluster/network-policy-provider/romana-network-policy/ 301 /docs/tasks/administer-cluster/running-cloud-controller.md /docs/tasks/administer-cluster/running-cloud-controller/ 301 /docs/tasks/administer-cluster/share-configuration/ /docs/tasks/access-application-cluster/configure-access-multiple-clusters/ 301 From 3b55463123926356b415f60f8686cec627219208 Mon Sep 17 00:00:00 2001 From: llhuii <llhuii5614@gmail.com> Date: Sun, 23 May 2021 09:58:27 +0800 Subject: [PATCH 160/221] [zh] fix short description of the service glossary --- content/zh/docs/reference/glossary/service.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/zh/docs/reference/glossary/service.md b/content/zh/docs/reference/glossary/service.md index b6a0fab287..fb611558b5 100644 --- a/content/zh/docs/reference/glossary/service.md +++ b/content/zh/docs/reference/glossary/service.md @@ -4,7 +4,7 @@ id: service date: 2018-04-12 full_link: /zh/docs/concepts/services-networking/service/ short_description: > - 将运行在一组 {{< glossary_tooltip text="Pods" term_id="pod" >}} 上的应用程序公开为网络服务的抽象方法。 + 将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。 aka: tags: @@ -42,4 +42,4 @@ An abstract way to expose an application running on a set of {{< glossary_toolti --> 服务所针对的 Pod 集(通常)由{{< glossary_tooltip text="选择算符" term_id="selector" >}}确定。 如果有 Pod 被添加或被删除,则与选择算符匹配的 Pod 集合将发生变化。 -服务确保可以将网络流量定向到该工作负载的当前 Pod 集合。 \ No newline at end of file +服务确保可以将网络流量定向到该工作负载的当前 Pod 集合。 From 5709cb1e6aefe52a1ea2d0d4a5637d5365c76001 Mon Sep 17 00:00:00 2001 From: Arhell <arhell333@gmail.com> Date: Mon, 24 May 2021 01:29:19 +0300 Subject: [PATCH 161/221] [fr] fix link replicaset.md --- content/fr/docs/concepts/workloads/controllers/replicaset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/fr/docs/concepts/workloads/controllers/replicaset.md b/content/fr/docs/concepts/workloads/controllers/replicaset.md index 81ccb6e7b3..820c8bb42d 100644 --- a/content/fr/docs/concepts/workloads/controllers/replicaset.md +++ b/content/fr/docs/concepts/workloads/controllers/replicaset.md @@ -214,7 +214,7 @@ Un ReplicaSet a également besoin de [`.spec` section](https://git.k8s.io/commun L'attribut `.spec.template` est un [modèle de pod](/docs/concepts/workloads/Pods/pod-overview/#pod-templates) qui requiert d'avoir des labels. Dans notre exemple `frontend.yaml`, nous avons un label : `tier: frontend`. Il faut faire attention à ne pas avoir des selecteurs que d'autres controllers utilisent, afin d'éviter que le ReplicaSet n'adopte ce pod. -Pour le champ [restart policy](/docs/concepts/workloads/Pods/pod-lifecycle/#restart-policy), +Pour le champ [restart policy](/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy), `.spec.template.spec.restartPolicy`, la seule valeur autorisée est `Always`, qui est la valeur par défaut. ### Sélecteur de Pod From 47a137594b2fb254986b4aefa83046b8e0726cb4 Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shuuji <shuuji3@gmail.com> Date: Sun, 9 May 2021 10:05:59 +0000 Subject: [PATCH 162/221] Translate concepts/configuration/organize-cluster-access-kubeconfig into Japanese --- .../organize-cluster-access-kubeconfig.md | 145 ++++++------------ .../configure-access-multiple-clusters.md | 2 +- 2 files changed, 52 insertions(+), 95 deletions(-) diff --git a/content/ja/docs/concepts/configuration/organize-cluster-access-kubeconfig.md b/content/ja/docs/concepts/configuration/organize-cluster-access-kubeconfig.md index df767bbc3e..b3ed117931 100644 --- a/content/ja/docs/concepts/configuration/organize-cluster-access-kubeconfig.md +++ b/content/ja/docs/concepts/configuration/organize-cluster-access-kubeconfig.md @@ -1,155 +1,112 @@ --- -title: Organizing Cluster Access Using kubeconfig Files +title: kubeconfigファイルを使用してクラスターアクセスを組織する content_type: concept weight: 60 --- <!-- overview --> -Use kubeconfig files to organize information about clusters, users, namespaces, and -authentication mechanisms. The `kubectl` command-line tool uses kubeconfig files to -find the information it needs to choose a cluster and communicate with the API server -of a cluster. +kubeconfigを使用すると、クラスターに、ユーザー、名前空間、認証の仕組みに関する情報を組織できます。`kubectl`コマンドラインツールはkubeconfigファイルを使用してクラスターを選択するために必要な情報を見つけ、クラスターのAPIサーバーと通信します。 {{< note >}} -A file that is used to configure access to clusters is called -a *kubeconfig file*. This is a generic way of referring to configuration files. -It does not mean that there is a file named `kubeconfig`. +クラスターへのアクセスを設定するために使われるファイルは*kubeconfigファイル*と呼ばれます。これは設定ファイルを指すために使われる一般的な方法です。`kubeconfig`という名前を持つファイルが存在するという意味ではありません。 {{< /note >}} -By default, `kubectl` looks for a file named `config` in the `$HOME/.kube` directory. -You can specify other kubeconfig files by setting the `KUBECONFIG` environment -variable or by setting the -[`--kubeconfig`](/docs/reference/generated/kubectl/kubectl/) flag. - -For step-by-step instructions on creating and specifying kubeconfig files, see -[Configure Access to Multiple Clusters](/docs/tasks/access-application-cluster/configure-access-multiple-clusters). - - +デフォルトでは、`kubectl`は`$HOME/.kube`ディレクトリ内にある`config`という名前のファイルを探します。`KUBECONFIG`環境変数を設定するか、[`--kubeconfig`](/docs/reference/generated/kubectl/kubectl/)フラグで指定することで、別のkubeconfigファイルを指定することもできます。 +kubeconfigファイルの作成と指定に関するステップバイステップの手順を知りたいときは、[複数のクラスターへのアクセスを設定する](/docs/tasks/access-application-cluster/configure-access-multiple-clusters)を参照してください。 <!-- body --> -## Supporting multiple clusters, users, and authentication mechanisms +## 複数のクラスター、ユーザ、認証の仕組みのサポート -Suppose you have several clusters, and your users and components authenticate -in a variety of ways. For example: +複数のクラスターを持っていて、ユーザーやコンポーネントがさまざまな方法で認証を行う次のような状況を考えてみます。 -- A running kubelet might authenticate using certificates. -- A user might authenticate using tokens. -- Administrators might have sets of certificates that they provide to individual users. +- 実行中のkubeletが証明書を使用して認証を行う可能性がある。 +- ユーザーがトークンを使用して認証を行う可能性がある。 +- 管理者が個別のユーザに提供する複数の証明書を持っている可能性がある。 -With kubeconfig files, you can organize your clusters, users, and namespaces. -You can also define contexts to quickly and easily switch between -clusters and namespaces. +kubeconfigファイルを使用すると、クラスター、ユーザー、名前空間を組織化することができます。また、contextを定義することで、複数のクラスターや名前空間を素早く簡単に切り替えられます。 ## Context -A *context* element in a kubeconfig file is used to group access parameters -under a convenient name. Each context has three parameters: cluster, namespace, and user. -By default, the `kubectl` command-line tool uses parameters from -the *current context* to communicate with the cluster. +kubeconfigファイルの*context*要素は、アクセスパラメーターを使いやすい名前でグループ化するために使われます。各contextは3つのパラメータ、cluster、namespace、userを持ちます。デフォルトでは、`kubectl`コマンドラインツールはクラスターとの通信に*current context*のパラメーターを使用します。 + +current contextを選択するには、以下のコマンドを使用します。 -To choose the current context: ``` kubectl config use-context ``` -## The KUBECONFIG environment variable +## KUBECONFIG環境変数 -The `KUBECONFIG` environment variable holds a list of kubeconfig files. -For Linux and Mac, the list is colon-delimited. For Windows, the list -is semicolon-delimited. The `KUBECONFIG` environment variable is not -required. If the `KUBECONFIG` environment variable doesn't exist, -`kubectl` uses the default kubeconfig file, `$HOME/.kube/config`. +`KUBECONFIG`環境変数には、kubeconfigファイルのリストを指定できます。LinuxとMacでは、リストはコロン区切りです。Windowsでは、セミコロン区切りです。`KUBECONFIG`環境変数は必須ではありません。`KUBECONFIG`環境変数が存在しない場合は、`kubectl`はデフォルトのkubeconfigファイルである`$HOME/.kube/config`を使用します。 -If the `KUBECONFIG` environment variable does exist, `kubectl` uses -an effective configuration that is the result of merging the files -listed in the `KUBECONFIG` environment variable. +`KUBECONFIG`環境変数が存在する場合は、`kubectl`は`KUBECONFIG`環境変数にリストされているファイルをマージした結果を有効な設定として使用します。 -## Merging kubeconfig files +## kubeconfigファイルのマージ -To see your configuration, enter this command: +設定ファイルを確認するには、以下のコマンドを実行します。 ```shell kubectl config view ``` -As described previously, the output might be from a single kubeconfig file, -or it might be the result of merging several kubeconfig files. +上で説明したように、出力は1つのkubeconfigファイルから作られる場合も、複数のkubeconfigファイルをマージした結果となる場合もあります。 -Here are the rules that `kubectl` uses when it merges kubeconfig files: +`kubectl`がkubeconfigファイルをマージするときに使用するルールを以下に示します。 -1. If the `--kubeconfig` flag is set, use only the specified file. Do not merge. - Only one instance of this flag is allowed. +1. もし`--kubeconfig`フラグが設定されていた場合、指定したファイルだけが使用されます。マージは行いません。このフラグに指定できるのは1つのファイルだけです。 - Otherwise, if the `KUBECONFIG` environment variable is set, use it as a - list of files that should be merged. - Merge the files listed in the `KUBECONFIG` environment variable - according to these rules: + そうでない場合、`KUBECONFIG`環境変数が設定されていた場合には、それをマージするべきファイルのリストとして使用します。`KUBECONFIG`環境変数にリストされたファイルのマージは、次のようなルールに従って行われます。 - * Ignore empty filenames. - * Produce errors for files with content that cannot be deserialized. - * The first file to set a particular value or map key wins. - * Never change the value or map key. - Example: Preserve the context of the first file to set `current-context`. - Example: If two files specify a `red-user`, use only values from the first file's `red-user`. - Even if the second file has non-conflicting entries under `red-user`, discard them. + * 空のファイルを無視する。 + * デシリアライズできない内容のファイルに対してエラーを出す。 + * 特定の値やmapのキーを設定する最初のファイルが勝つ。 + * 値やmapのキーは決して変更しない。 + 例: 最初のファイルが指定した`current-context`を保持する。 + 例: 2つのファイルが`red-user`を指定した場合、1つ目のファイルの`red-user`だけを使用する。もし2つ目のファイルの`red-user`以下に競合しないエントリーがあったとしても、それらは破棄する。 - For an example of setting the `KUBECONFIG` environment variable, see - [Setting the KUBECONFIG environment variable](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#set-the-kubeconfig-environment-variable). + `KUBECONFIG`環境変数を設定する例については、[KUBECONFIG環境変数を設定する](/ja/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#set-the-kubeconfig-environment-variable)を参照してください。 - Otherwise, use the default kubeconfig file, `$HOME/.kube/config`, with no merging. + それ以外の場合は、デフォルトのkubeconfigファイル`$HOME/.kube/config`をマージせずに使用します。 -1. Determine the context to use based on the first hit in this chain: +1. 以下のチェーンで最初に見つかったものをもとにして、使用するcontextを決定する。 - 1. Use the `--context` command-line flag if it exists. - 1. Use the `current-context` from the merged kubeconfig files. + 1. `--context`コマンドラインフラグが存在すれば、それを使用する。 + 1. マージしたkubeconrfigファイルから`current-context`を使用する。 - An empty context is allowed at this point. + この時点では、空のcontextも許容されます。 -1. Determine the cluster and user. At this point, there might or might not be a context. - Determine the cluster and user based on the first hit in this chain, - which is run twice: once for user and once for cluster: +1. クラスターとユーザーを決定する。この時点では、contextである場合もそうでない場合もあります。以下のチェーンで最初に見つかったものをもとにして、クラスターとユーザーを決定します。この手順はユーザーとクラスターについてそれぞれ1回ずつ、合わせて2回実行されます。 - 1. Use a command-line flag if it exists: `--user` or `--cluster`. - 1. If the context is non-empty, take the user or cluster from the context. + 1. もし存在すれば、コマンドラインフラグ`--user`または`--cluster`を使用する。 + 1. もしcontextが空でなければ、contextからユーザーまたはクラスターを取得する。 - The user and cluster can be empty at this point. + この時点では、ユーザーとクラスターは空である可能性があります。 -1. Determine the actual cluster information to use. At this point, there might or - might not be cluster information. - Build each piece of the cluster information based on this chain; the first hit wins: +1. 使用する実際のクラスター情報を決定する。この時点では、クラスター情報は存在しない可能性があります。以下のチェーンで最初に見つかったものをもとにして、クラスター情報の各パーツをそれぞれを構築します。 - 1. Use command line flags if they exist: `--server`, `--certificate-authority`, `--insecure-skip-tls-verify`. - 1. If any cluster information attributes exist from the merged kubeconfig files, use them. - 1. If there is no server location, fail. + 1. もし存在すれば、`--server`、`--certificate-authority`、`--insecure-skip-tls-verify`コマンドラインフラグを使用する。 + 1. もしマージしたkubeconfigファイルにクラスター情報の属性が存在すれば、それを使用する。 + 1. もしサーバーの場所が存在しなければ、マージは失敗する。 -1. Determine the actual user information to use. Build user information using the same - rules as cluster information, except allow only one authentication - technique per user: +1. 使用する実際のユーザー情報を決定する。クラスター情報の場合と同じルールを使用して、ユーザー情報を構築します。ただし、ユーザーごとに許可される認証方法は1つだけです。 - 1. Use command line flags if they exist: `--client-certificate`, `--client-key`, `--username`, `--password`, `--token`. - 1. Use the `user` fields from the merged kubeconfig files. - 1. If there are two conflicting techniques, fail. - -1. For any information still missing, use default values and potentially - prompt for authentication information. - -## File references - -File and path references in a kubeconfig file are relative to the location of the kubeconfig file. -File references on the command line are relative to the current working directory. -In `$HOME/.kube/config`, relative paths are stored relatively, and absolute paths -are stored absolutely. + 1. もし存在すれば、`--client-certificate`、`--client-key`、`--username`、`--password`、`--token`コマンドラインフラグを使用する。 + 1. マージしたkubeconfigファイルの`user`フィールドを使用する。 + 1. もし2つの競合する方法が存在する場合、マージは失敗する。 +1. もし何らかの情報がまだ不足していれば、デフォルトの値を使用し、認証情報については場合によってはプロンプトを表示する。 +## ファイルリファレンス +kubeconfigファイル内のファイルとパスのリファレンスは、kubeconfigファイルの位置からの相対パスで指定します。コマンドライン上のファイルのリファレンスは、現在のワーキングディレクトリからの相対パスです。`$HOME/.kube/config`内では、相対パスは相対のまま、絶対パスは絶対のまま保存されます。 ## {{% heading "whatsnext" %}} -* [Configure Access to Multiple Clusters](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/) +* [複数のクラスターへのアクセスを設定する](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/) * [`kubectl config`](/docs/reference/generated/kubectl/kubectl-commands#config) diff --git a/content/ja/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md b/content/ja/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md index d5f6b72296..e250155f2d 100644 --- a/content/ja/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md +++ b/content/ja/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md @@ -232,7 +232,7 @@ contexts: 上記の設定ファイルは、`dev-ramp-up`というコンテキストを表します。 -## KUBECONFIG環境変数を設定する +## KUBECONFIG環境変数を設定する {#set-the-kubeconfig-environment-variable} `KUBECONFIG`という環境変数が存在するかを確認してください。もし存在する場合は、後で復元できるようにバックアップしてください。例えば: From e03702f13b10fde5f2f2034703b2efe1384b646f Mon Sep 17 00:00:00 2001 From: Arhell <arhell333@gmail.com> Date: Tue, 25 May 2021 01:03:53 +0300 Subject: [PATCH 163/221] [ja] Update the link to install service catalog using Helm --- .../tasks/service-catalog/install-service-catalog-using-helm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/tasks/service-catalog/install-service-catalog-using-helm.md b/content/ja/docs/tasks/service-catalog/install-service-catalog-using-helm.md index eced279efc..ff894fba29 100644 --- a/content/ja/docs/tasks/service-catalog/install-service-catalog-using-helm.md +++ b/content/ja/docs/tasks/service-catalog/install-service-catalog-using-helm.md @@ -33,7 +33,7 @@ Helmをインストールし、以下のコマンドを実行することでロ ```shell -helm repo add svc-cat https://svc-catalog-charts.storage.googleapis.com +helm repo add svc-cat https://kubernetes-sigs.github.io/service-catalog ``` 以下のコマンドを実行し、インストールに成功していることを確認します。 From 6916aea2d5d1bedbd22db0967b1e45a3e6e13a52 Mon Sep 17 00:00:00 2001 From: Squidtoon99 <49101235+Squidtoon99@users.noreply.github.com> Date: Mon, 24 May 2021 22:53:28 -0500 Subject: [PATCH 164/221] Fix typo "form" > "from" In the code example given the flask server returns "Hello from Python!" but there are typos writing "form" instead of "from" in the post. --- .../2019-07-23-get-started-with-kubernetes-using-python.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/blog/_posts/2019-07-23-get-started-with-kubernetes-using-python.md b/content/en/blog/_posts/2019-07-23-get-started-with-kubernetes-using-python.md index 5f8d40618a..7d2e3d6ec2 100644 --- a/content/en/blog/_posts/2019-07-23-get-started-with-kubernetes-using-python.md +++ b/content/en/blog/_posts/2019-07-23-get-started-with-kubernetes-using-python.md @@ -120,7 +120,7 @@ Run the following command to have Docker run the application in a container and ``` docker run -p 5001:5000 hello-python ``` -Now navigate to http://localhost:5001, and you should see the “Hello form Python!” message. +Now navigate to http://localhost:5001, and you should see the “Hello from Python!” message. ### More info * [Get started with Docker](https://docs.docker.com/get-started/) @@ -201,7 +201,7 @@ kubectl get pods ``` <img src="/images/blog/get-started-with-kubernetes-using-python/kubectl-get-pods.png" alt="Pod listing" /> -Now navigate to http://localhost:6000, and you should see the “Hello form Python!” message. +Now navigate to http://localhost:6000, and you should see the “Hello from Python!” message. That’s it! The application is now running in Kubernetes! From 67c7ab0c4d42187a9c11b7bd53131e254449edc1 Mon Sep 17 00:00:00 2001 From: Albert <r.albert.huang@gmail.com> Date: Wed, 19 May 2021 21:33:53 +0800 Subject: [PATCH 165/221] [zh]Update README-zh.md --- README-zh.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README-zh.md b/README-zh.md index 4dd4de269f..ef259ef2d0 100644 --- a/README-zh.md +++ b/README-zh.md @@ -174,7 +174,7 @@ Learn more about SIG Docs Kubernetes community and meetings on the [community pa You can also reach the maintainers of this project at: -- [Slack](https://kubernetes.slack.com/messages/sig-docs) +- [Slack](https://kubernetes.slack.com/messages/sig-docs) [Get an invite for this Slack](https://slack.k8s.io/) - [Mailing List](https://groups.google.com/forum/#!forum/kubernetes-sig-docs) --> # 参与 SIG Docs 工作 @@ -184,7 +184,7 @@ You can also reach the maintainers of this project at: 你也可以通过以下渠道联系本项目的维护人员: -- [Slack](https://kubernetes.slack.com/messages/sig-docs) +- [Slack](https://kubernetes.slack.com/messages/sig-docs) [加入Slack](https://slack.k8s.io/) - [邮件列表](https://groups.google.com/forum/#!forum/kubernetes-sig-docs) <!-- From 0a3ee58cb4f4b1fa24bb0d61235fcea10651ef2f Mon Sep 17 00:00:00 2001 From: Arhell <arhell333@gmail.com> Date: Wed, 26 May 2021 00:34:44 +0300 Subject: [PATCH 166/221] [id] Fix link for Horizontal Pod Autoscaler enhancement --- .../id/docs/tasks/run-application/horizontal-pod-autoscale.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/id/docs/tasks/run-application/horizontal-pod-autoscale.md b/content/id/docs/tasks/run-application/horizontal-pod-autoscale.md index 1ae40d2090..cd82ded0b1 100644 --- a/content/id/docs/tasks/run-application/horizontal-pod-autoscale.md +++ b/content/id/docs/tasks/run-application/horizontal-pod-autoscale.md @@ -290,7 +290,7 @@ dan [panduan penggunaan metrik eksternal](/docs/tasks/run-application/horizontal ## Dukungan untuk Perilaku *Scaling* yang dapat Dikonfigurasi -Mulai dari versi [v1.18](https://github.com/kubernetes/enhancements/blob/master/keps/sig-autoscaling/20190307-configurable-scale-velocity-for-hpa.md), API `v2beta2` mengizinkan perilaku *scaling* dapat +Mulai dari versi [v1.18](https://github.com/kubernetes/enhancements/blob/master/keps/sig-autoscaling/853-configurable-hpa-scale-velocity/README.md), API `v2beta2` mengizinkan perilaku *scaling* dapat dikonfigurasi melalui *field* `behavior` pada HorizontalPodAutoscaler. Perilaku *scaling up* dan *scaling down* ditentukan terpisah pada *field* `slaceUp` dan *field* `scaleDown`, dibawah dari *field* `behavior`. Sebuah stabilisator dapat ditentukan untuk kedua arah *scale* untuk mencegah perubahan replika yang terlalu From 99f542cbae31075a48541bbaad24c5843ae85a15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=8A=E6=9C=9D?= <48907738+anois@users.noreply.github.com> Date: Wed, 26 May 2021 10:11:15 +0800 Subject: [PATCH 167/221] Update components.md --- content/zh/docs/concepts/overview/components.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/concepts/overview/components.md b/content/zh/docs/concepts/overview/components.md index 6f1051d142..8e76e91fd7 100644 --- a/content/zh/docs/concepts/overview/components.md +++ b/content/zh/docs/concepts/overview/components.md @@ -207,7 +207,7 @@ Kubernetes 启动的容器自动将此 DNS 服务器包含在其 DNS 搜索列 ### Web 界面(仪表盘) [Dashboard](/zh/docs/tasks/access-application-cluster/web-ui-dashboard/) -是Kubernetes 集群的通用的、基于 Web 的用户界面。 +是 Kubernetes 集群的通用的、基于 Web 的用户界面。 它使用户可以管理集群中运行的应用程序以及集群本身并进行故障排除。 <!-- From 38977dfa7109f4e54ca33c72872d76246ca01a4d Mon Sep 17 00:00:00 2001 From: inductor <kohei.ota@hpe.com> Date: Wed, 26 May 2021 04:41:55 +0000 Subject: [PATCH 168/221] resolve conflict for toml --- i18n/ja.toml | 3 --- 1 file changed, 3 deletions(-) diff --git a/i18n/ja.toml b/i18n/ja.toml index b100192422..a7a103f435 100644 --- a/i18n/ja.toml +++ b/i18n/ja.toml @@ -181,9 +181,6 @@ other = "始める前に" [subscribe_button] other = "購読する" -[thirdparty_message] -other = """このセクションはKubernetesに必要な機能を提供するサードパーティのプロジェクトへリンクしています。Kubernetesプロジェクトの作者はこれらのプロジェクトへの責任を持ちません。このページはプロジェクトをアルファベット順に列挙しており、<a href="https://github.com/cncf/foundation/blob/master/website-guidelines.md" target="_blank">CNCFウェブサイトガイドライン</a>に従っています。このリストにプロジェクトを追加する場合は、変更を送信する前に<a href="/ja/docs/contribute/style/content-guide/#third-party-content">コンテンツガイド</a>を読んでください。""" - [ui_search_placeholder] other = "検索" From 0a7120a939e19ac1b0a7f4cce6013ad06d4074cd Mon Sep 17 00:00:00 2001 From: c00522440 <chenchuntao@huawei.com> Date: Wed, 26 May 2021 15:59:28 +0800 Subject: [PATCH 169/221] AddMissingTypeRetainkeys --- .../update-api-object-kubectl-patch.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/zh/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch.md b/content/zh/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch.md index 44cb202930..34360eb890 100644 --- a/content/zh/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch.md +++ b/content/zh/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch.md @@ -452,10 +452,10 @@ spec: {{< tabs name="kubectl_retainkeys_example" >}} {{{< tab name="Bash" codelang="bash" >}} -kubectl patch deployment retainkeys-demo --patch "$(cat patch-file-no-retainkeys.yaml)" +kubectl patch deployment retainkeys-demo --type merge --patch "$(cat patch-file-no-retainkeys.yaml)" {{< /tab >}} {{< tab name="PowerShell" codelang="posh" >}} -kubectl patch deployment retainkeys-demo --patch $(Get-Content patch-file-no-retainkeys.yaml -Raw) +kubectl patch deployment retainkeys-demo --type merge --patch $(Get-Content patch-file-no-retainkeys.yaml -Raw) {{< /tab >}}} {{< /tabs >}} @@ -499,10 +499,10 @@ Patch your Deployment again with this new patch: {{< tabs name="kubectl_retainkeys2_example" >}} {{{< tab name="Bash" codelang="bash" >}} -kubectl patch deployment retainkeys-demo --patch "$(cat patch-file-retainkeys.yaml)" +kubectl patch deployment retainkeys-demo --type merge --patch "$(cat patch-file-retainkeys.yaml)" {{< /tab >}} {{< tab name="PowerShell" codelang="posh" >}} -kubectl patch deployment retainkeys-demo --patch $(Get-Content patch-file-retainkeys.yaml -Raw) +kubectl patch deployment retainkeys-demo --type merge --patch $(Get-Content patch-file-retainkeys.yaml -Raw) {{< /tab >}}} {{< /tabs >}} From f1ae3ed632843af72a5c9d8edb85080ea9ab659f Mon Sep 17 00:00:00 2001 From: c00522440 <chenchuntao@huawei.com> Date: Wed, 26 May 2021 17:09:12 +0800 Subject: [PATCH 170/221] updateVersion --- .../docs/tasks/access-application-cluster/web-ui-dashboard.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/tasks/access-application-cluster/web-ui-dashboard.md b/content/zh/docs/tasks/access-application-cluster/web-ui-dashboard.md index 870a030f49..7f15b264c0 100644 --- a/content/zh/docs/tasks/access-application-cluster/web-ui-dashboard.md +++ b/content/zh/docs/tasks/access-application-cluster/web-ui-dashboard.md @@ -56,7 +56,7 @@ The Dashboard UI is not deployed by default. To deploy it, run the following com 默认情况下不会部署 Dashboard。可以通过以下命令部署: ``` -kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml +kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml ``` <!-- From 333b04b12f6a8a4977c4b6799da23016083a982b Mon Sep 17 00:00:00 2001 From: Kiran Mova <kiran.mova@mayadata.io> Date: Wed, 26 May 2021 17:45:20 +0530 Subject: [PATCH 171/221] remove alpha feature note from fsGroupChangePolicy --- .../en/docs/tasks/configure-pod-container/security-context.md | 1 - 1 file changed, 1 deletion(-) 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 104dc0003f..50a02b990e 100644 --- a/content/en/docs/tasks/configure-pod-container/security-context.md +++ b/content/en/docs/tasks/configure-pod-container/security-context.md @@ -176,7 +176,6 @@ securityContext: fsGroupChangePolicy: "OnRootMismatch" ``` -This is an alpha feature. To use it, enable the [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) `ConfigurableFSGroupPolicy` for the kube-api-server, the kube-controller-manager, and for the kubelet. {{< note >}} This field has no effect on ephemeral volume types such as From 43cee67f88ab08f9de66f3dab865cfc84d6c84bf Mon Sep 17 00:00:00 2001 From: Jerry Park <jaehwa@gmail.com> Date: Wed, 26 May 2021 22:54:59 +0900 Subject: [PATCH 172/221] Update outdated files in the dev-1.21-ko.3 branch (1) --- .../windows/intro-windows-in-kubernetes.md | 1310 +++++++++++++---- 1 file changed, 995 insertions(+), 315 deletions(-) diff --git a/content/ko/docs/setup/production-environment/windows/intro-windows-in-kubernetes.md b/content/ko/docs/setup/production-environment/windows/intro-windows-in-kubernetes.md index 2a7826c414..eb48f3f65d 100644 --- a/content/ko/docs/setup/production-environment/windows/intro-windows-in-kubernetes.md +++ b/content/ko/docs/setup/production-environment/windows/intro-windows-in-kubernetes.md @@ -2,27 +2,57 @@ title: 쿠버네티스의 윈도우 지원 소개 content_type: concept weight: 65 + + + + + --- <!-- overview --> -윈도우 애플리케이션은 많은 조직에서 실행되는 서비스 및 애플리케이션의 상당 부분을 구성한다. [윈도우 컨테이너](https://aka.ms/windowscontainers)는 프로세스와 패키지 종속성을 캡슐화하는 현대적인 방법을 제공하여, 데브옵스(DevOps) 사례를 더욱 쉽게 ​​사용하고 윈도우 애플리케이션의 클라우드 네이티브 패턴을 따르도록 한다. 쿠버네티스는 사실상의 표준 컨테이너 오케스트레이터가 되었으며, 쿠버네티스 1.14 릴리스에는 쿠버네티스 클러스터의 윈도우 노드에서 윈도우 컨테이너 스케줄링을 위한 프로덕션 지원이 포함되어 있어, 광범위한 윈도우 애플리케이션 생태계가 쿠버네티스의 강력한 기능을 활용할 수 있다. 윈도우 기반 애플리케이션과 리눅스 기반 애플리케이션에 투자한 조직은 워크로드를 관리하기 위해 별도의 오케스트레이터를 찾을 필요가 없으므로, 운영 체제와 관계없이 배포 전반에 걸쳐 운영 효율성이 향상된다. +윈도우 애플리케이션은 많은 조직에서 실행되는 서비스 및 +애플리케이션의 상당 부분을 구성한다. +[윈도우 컨테이너](https://aka.ms/windowscontainers)는 프로세스와 패키지 종속성을 +캡슐화하는 현대적인 방법을 제공하여, 데브옵스(DevOps) +사례를 더욱 쉽게 사용하고 윈도우 애플리케이션의 클라우드 네이티브 패턴을 따르도록 한다. +쿠버네티스는 사실상의 표준 컨테이너 오케스트레이터가 되었으며, +쿠버네티스 1.14 릴리스에는 쿠버네티스 클러스터의 윈도우 노드에서 윈도우 +컨테이너 스케줄링을 위한 프로덕션 지원이 포함되어 있어, 광범위한 윈도우 애플리케이션 생태계가 +쿠버네티스의 강력한 기능을 활용할 수 있다. 윈도우 기반 애플리케이션과 +리눅스 기반 애플리케이션에 투자한 조직은 워크로드를 관리하기 위해 +별도의 오케스트레이터를 찾을 필요가 없으므로, +운영 체제와 관계없이 배포 전반에 걸쳐 +운영 효율성이 향상된다. <!-- body --> ## 쿠버네티스의 윈도우 컨테이너 -쿠버네티스에서 윈도우 컨테이너 오케스트레이션을 활성화하려면, 기존 리눅스 클러스터에 윈도우 노드를 포함한다. 쿠버네티스의 {{< glossary_tooltip text="파드" term_id="pod" >}}에서 윈도우 컨테이너를 스케줄링하는 것은 리눅스 기반 컨테이너를 스케줄링하는 것과 유사하다. +쿠버네티스에서 윈도우 컨테이너 오케스트레이션을 활성화하려면, 기존 +리눅스 클러스터에 윈도우 노드를 포함한다. 쿠버네티스의 +{{< glossary_tooltip text="파드" term_id="pod" >}}에서 윈도우 컨테이너를 스케줄링하는 것은 +리눅스 기반 컨테이너를 스케줄링하는 것과 유사하다. -윈도우 컨테이너를 실행하려면, 쿠버네티스 클러스터에 리눅스를 실행하는 컨트롤 플레인 노드와 사용자의 워크로드 요구에 따라 윈도우 또는 리눅스를 실행하는 워커가 있는 여러 운영 체제가 포함되어 있어야 한다. 윈도우 서버 2019는 윈도우에서 [쿠버네티스 노드](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/architecture/architecture.md#the-kubernetes-node)를 활성화하는 유일한 윈도우 운영 체제이다(kubelet, [컨테이너 런타임](https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/deploy-containers/containerd) 및 kube-proxy 포함). 윈도우 배포 채널에 대한 자세한 설명은 [Microsoft 문서](https://docs.microsoft.com/ko-kr/windows-server/get-started-19/servicing-channels-19)를 참고한다. +윈도우 컨테이너를 실행하려면, 쿠버네티스 클러스터에 리눅스를 +실행하는 컨트롤 플레인 노드와 사용자의 워크로드 요구에 따라 윈도우 또는 리눅스를 +실행하는 워커가 있는 여러 운영 체제가 포함되어 있어야 한다. 윈도우 +서버 2019는 윈도우에서 +[쿠버네티스 노드](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/architecture/architecture.md#the-kubernetes-node)를 +활성화하는 유일한 윈도우 운영 체제이다(kubelet, +[컨테이너 런타임](https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/deploy-containers/containerd) +및 kube-proxy 포함). 윈도우 배포 채널에 대한 자세한 설명은 +[Microsoft 문서](https://docs.microsoft.com/ko-kr/windows-server/get-started-19/servicing-channels-19)를 참고한다. -{{< note >}} -[마스터 컴포넌트](/ko/docs/concepts/overview/components/)를 포함한 쿠버네티스 컨트롤 플레인은 리눅스에서 계속 실행된다. 윈도우 전용 쿠버네티스 클러스터는 계획이 없다. -{{< /note >}} +[마스터 컴포넌트](/ko/docs/concepts/overview/components/)를 포함한 +쿠버네티스 컨트롤 플레인은 +리눅스에서 계속 실행된다. +윈도우 전용 쿠버네티스 클러스터는 계획이 없다. -{{< note >}} -이 문서에서 윈도우 컨테이너에 대해 이야기할 때 프로세스 격리된 윈도우 컨테이너를 의미한다. [Hyper-V 격리](https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/manage-containers/hyperv-container)가 있는 윈도우 컨테이너는 향후 릴리스로 계획되어 있다. -{{< /note >}} +이 문서에서 윈도우 컨테이너에 대해 이야기할 때 +프로세스 격리된 윈도우 컨테이너를 의미한다. +[Hyper-V 격리](https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/manage-containers/hyperv-container)가 +있는 윈도우 컨테이너는 향후 릴리스로 계획되어 있다. ## 지원되는 기능 및 제한 @@ -30,41 +60,68 @@ weight: 65 #### 윈도우 OS 버전 지원 -쿠버네티스의 윈도우 운영 체제 지원은 다음 표를 참조한다. 단일 이기종 쿠버네티스 클러스터에는 윈도우 및 리눅스 워커 노드가 모두 있을 수 있다. 윈도우 컨테이너는 윈도우 노드에서, 리눅스 컨테이너는 리눅스 노드에서 스케줄되어야 한다. +쿠버네티스의 윈도우 운영 체제 지원은 다음 표를 +참조한다. 단일 이기종 쿠버네티스 클러스터에는 윈도우 및 +리눅스 워커 노드가 모두 있을 수 있다. 윈도우 컨테이너는 윈도우 노드에서, +리눅스 컨테이너는 리눅스 노드에서 스케줄되어야 한다. | 쿠버네티스 버전 | 윈도우 서버 LTSC 릴리스 | 윈도우 서버 SAC 릴리스 | -| --- | --- | --- | -| *Kubernetes v1.17* | Windows Server 2019 | Windows Server ver 1809 | -| *Kubernetes v1.18* | Windows Server 2019 | Windows Server ver 1809, Windows Server ver 1903, Windows Server ver 1909 | +| --- | --- | --- | --- | | *Kubernetes v1.19* | Windows Server 2019 | Windows Server ver 1909, Windows Server ver 2004 | | *Kubernetes v1.20* | Windows Server 2019 | Windows Server ver 1909, Windows Server ver 2004 | +| *Kubernetes v1.21* | Windows Server 2019 | Windows Server ver 2004, Windows Server ver 20H2 | -{{< note >}} -지원 모델을 포함한 다양한 윈도우 서버 서비스 채널에 대한 정보는 [윈도우 서버 서비스 채널](https://docs.microsoft.com/ko-kr/windows-server/get-started-19/servicing-channels-19)에서 확인할 수 있다. -{{< /note >}} -{{< note >}} -모든 윈도우 고객이 앱의 운영 체제를 자주 업데이트하는 것은 아니다. 애플리케이션 업그레이드를 위해서는 클러스터에 새 노드를 업그레이드하거나 도입하는 것이 필요하다. 이 문서에서 쿠버네티스에서 실행되는 컨테이너의 운영 체제를 업그레이드하기로 선택한 고객을 위해 새 운영 체제 버전에 대한 지원을 추가할 때의 가이드와 단계별 지침을 제공한다. 이 가이드에는 클러스터 노드와 함께 사용자 애플리케이션을 업그레이드하기 위한 권장 업그레이드 절차가 포함된다. 윈도우 노드는 현재 리눅스 노드와 동일한 방식으로 쿠버네티스 [버전-스큐(skew) 정책](/ko/docs/setup/release/version-skew-policy/)(노드 대 컨트롤 플레인 버전 관리)을 준수한다. -{{< /note >}} -{{< note >}} -윈도우 서버 호스트 운영 체제에는 [윈도우 서버](https://www.microsoft.com/ko-kr/cloud-platform/windows-server-pricing) 라이선스가 적용된다. 윈도우 컨테이너 이미지에는 [윈도우 컨테이너에 대한 추가 사용 조건](https://docs.microsoft.com/en-us/virtualization/windowscontainers/images-eula)이 적용된다. -{{< /note >}} -{{< note >}} -프로세스 격리가 포함된 윈도우 컨테이너에는 엄격한 호환성 규칙이 있으며, [여기서 호스트 OS 버전은 컨테이너 베이스 이미지 OS 버전과 일치해야 한다](https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/deploy-containers/version-compatibility). 일단 쿠버네티스에서 Hyper-V 격리가 포함된 윈도우 컨테이너를 지원하면, 제한 및 호환성 규칙이 변경될 것이다. -{{< /note >}} + +지원 모델을 포함한 다양한 윈도우 서버 +서비스 채널에 대한 정보는 +[윈도우 서버 서비스 채널](https://docs.microsoft.com/ko-kr/windows-server/get-started-19/servicing-channels-19)에서 확인할 수 있다. + +모든 윈도우 고객이 앱의 운영 체제를 자주 업데이트하는 것은 +아니다. 애플리케이션 업그레이드를 위해서는 클러스터에 새 노드를 +업그레이드하거나 도입하는 것이 필요하다. 이 문서에서 +쿠버네티스에서 실행되는 컨테이너의 운영 체제를 업그레이드하기로 선택한 +고객을 위해 새 운영 체제 버전에 대한 지원을 추가할 때의 가이드와 +단계별 지침을 제공한다. 이 가이드에는 클러스터 노드와 함께 사용자 애플리케이션을 +업그레이드하기 위한 권장 업그레이드 절차가 포함된다. +윈도우 노드는 현재 리눅스 노드와 동일한 방식으로 쿠버네티스 +[버전-스큐(skew) 정책](/ko/docs/setup/release/version-skew-policy/)(노드 대 컨트롤 플레인 +버전 관리)을 준수한다. + + +윈도우 서버 호스트 운영 체제에는 +[윈도우 서버](https://www.microsoft.com/ko-kr/cloud-platform/windows-server-pricing) +라이선스가 적용된다. 윈도우 컨테이너 이미지에는 +[윈도우 컨테이너에 대한 추가 사용 조건](https://docs.microsoft.com/en-us/virtualization/windowscontainers/images-eula)이 적용된다. + +프로세스 격리가 포함된 윈도우 컨테이너에는 엄격한 호환성 규칙이 있으며, +[여기서 호스트 OS 버전은 컨테이너 베이스 이미지 OS 버전과 일치해야 한다](https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/deploy-containers/version-compatibility). +일단 쿠버네티스에서 Hyper-V 격리가 포함된 윈도우 컨테이너를 지원하면, +제한 및 호환성 규칙이 변경될 것이다. #### 퍼즈(Pause) 이미지 -Microsoft는 `mcr.microsoft.com/oss/kubernetes/pause:1.4.1`에서 윈도우 퍼즈 인프라 컨테이너를 유지한다. +Microsoft는 `mcr.microsoft.com/oss/kubernetes/pause:3.4.1`에서 +윈도우 퍼즈 인프라 컨테이너를 유지한다. #### 컴퓨트 -API 및 kubectl의 관점에서, 윈도우 컨테이너는 리눅스 기반 컨테이너와 거의 같은 방식으로 작동한다. 그러나 [제한 섹션](#제한)에 요약된 주요 기능에는 몇 가지 눈에 띄는 차이점이 있다. +API 및 kubectl의 관점에서, 윈도우 컨테이너는 +리눅스 기반 컨테이너와 거의 같은 방식으로 작동한다. 그러나 +[제한 섹션](#제한)에 요약된 주요 기능에는 +몇 가지 눈에 띄는 차이점이 있다. -윈도우에서 주요 쿠버네티스 요소는 리눅스와 동일한 방식으로 작동한다. 이 섹션에서는, 주요 워크로드 인에이블러(enabler) 일부와 이들이 윈도우에 매핑되는 방법에 대해 설명한다. +윈도우에서 주요 쿠버네티스 요소는 리눅스와 동일한 방식으로 작동한다. 이 +섹션에서는, 주요 워크로드 인에이블러(enabler) 일부와 이들이 윈도우에 매핑되는 방법에 +대해 설명한다. * [파드](/ko/docs/concepts/workloads/pods/) - 파드는 쿠버네티스의 기본 빌딩 블록이다 - 쿠버네티스 오브젝트 모델에서 생성하고 배포하는 가장 작고 간단한 단위. 동일한 파드에 윈도우 및 리눅스 컨테이너를 배포할 수 없다. 파드의 모든 컨테이너는 단일 노드로 스케줄되며 각 노드는 특정 플랫폼 및 아키텍처를 나타낸다. 다음과 같은 파드 기능, 속성 및 이벤트가 윈도우 컨테이너에서 지원된다. + 파드는 쿠버네티스의 기본 빌딩 블록이다 - 쿠버네티스 오브젝트 모델에서 + 생성하고 배포하는 가장 작고 간단한 단위. 동일한 파드에 + 윈도우 및 리눅스 컨테이너를 배포할 수 없다. 파드의 모든 컨테이너는 + 단일 노드로 스케줄되며 각 노드는 특정 플랫폼 및 + 아키텍처를 나타낸다. 다음과 같은 파드 기능, 속성 및 + 이벤트가 윈도우 컨테이너에서 지원된다. * 프로세스 분리 및 볼륨 공유 기능을 갖춘 파드 당 하나 또는 여러 개의 컨테이너 * 파드 상태 필드 @@ -76,7 +133,8 @@ API 및 kubectl의 관점에서, 윈도우 컨테이너는 리눅스 기반 컨 * 리소스 제한 * [컨트롤러](/ko/docs/concepts/workloads/controllers/) - 쿠버네티스 컨트롤러는 파드의 의도한 상태(desired state)를 처리한다. 윈도우 컨테이너에서 지원되는 워크로드 컨트롤러는 다음과 같다. + 쿠버네티스 컨트롤러는 파드의 의도한 상태(desired state)를 처리한다. 윈도우 + 컨테이너에서 지원되는 워크로드 컨트롤러는 다음과 같다. * 레플리카셋(ReplicaSet) * 레플리케이션컨트롤러(ReplicationController) @@ -87,7 +145,10 @@ API 및 kubectl의 관점에서, 윈도우 컨테이너는 리눅스 기반 컨 * 크론잡(CronJob) * [서비스](/ko/docs/concepts/services-networking/service/) - 쿠버네티스 서비스는 논리적인 파드 집합과 그것에(마이크로 서비스라고도 함) 접근하는 정책을 정의하는 추상화 개념이다. 상호-운영 체제 연결을 위해 서비스를 사용할 수 있다. 윈도우에서 서비스는 다음의 유형, 속성 및 기능을 활용할 수 있다. + 쿠버네티스 서비스는 논리적인 파드 집합과 그것에(마이크로 서비스라고도 함) + 접근하는 정책을 정의하는 추상화 개념이다. 상호-운영 체제 + 연결을 위해 서비스를 사용할 수 있다. 윈도우에서 서비스는 + 다음의 유형, 속성 및 기능을 활용할 수 있다. * 서비스 환경 변수 * 노드포트(NodePort) @@ -96,7 +157,10 @@ API 및 kubectl의 관점에서, 윈도우 컨테이너는 리눅스 기반 컨 * ExternalName * 헤드리스 서비스(Headless services) -파드, 컨트롤러 및 서비스는 쿠버네티스에서 윈도우 워크로드를 관리하는데 중요한 요소이다. 그러나 그 자체로는 동적 클라우드 네이티브 환경에서 윈도우 워크로드의 적절한 수명 주기 관리를 수행하기에 충분하지 않다. 다음 기능에 대한 지원이 추가되었다. +파드, 컨트롤러 및 서비스는 쿠버네티스에서 윈도우 워크로드를 +관리하는데 중요한 요소이다. 그러나 그 자체로는 동적 클라우드 네이티브 환경에서 +윈도우 워크로드의 적절한 수명 주기 관리를 수행하기에 +충분하지 않다. 다음 기능에 대한 지원이 추가되었다. * 파드와 컨테이너 메트릭 * Horizontal Pod Autoscaler 지원 @@ -110,27 +174,42 @@ API 및 kubectl의 관점에서, 윈도우 컨테이너는 리눅스 기반 컨 {{< feature-state for_k8s_version="v1.14" state="stable" >}} -Docker EE-basic 19.03 이상은 모든 윈도우 서버 버전에 대해 권장되는 컨테이너 런타임이다. 이것은 kubelet에 포함된 dockershim 코드와 함께 작동한다. +Docker EE-basic 19.03 이상은 모든 윈도우 서버 버전에 대해 권장되는 +컨테이너 런타임이다. 이것은 kubelet에 포함된 dockershim 코드와 함께 작동한다. ##### CRI-ContainerD {{< feature-state for_k8s_version="v1.20" state="stable" >}} -{{< glossary_tooltip term_id="containerd" text="ContainerD" >}} 1.4.0+는 윈도우 쿠버네티스 노드의 컨테이너 런타임으로도 사용할 수 있다. +{{< glossary_tooltip term_id="containerd" text="ContainerD" >}} 1.4.0+는 +윈도우 쿠버네티스 노드의 컨테이너 런타임으로도 사용할 수 있다. -[윈도우에 ContainerD 설치](/ko/docs/setup/production-environment/container-runtimes/#containerd-설치) 방법을 확인한다. - -{{< caution >}} -ContainerD와 함께 GMSA를 사용하여 커널 패치가 필요한 윈도우 네트워크 공유에 액세스 할 때 [알려진 제한](/docs/tasks/configure-pod-container/configure-gmsa/#gmsa-limitations)이 있다. 이 제한을 해결하기위한 업데이트는 현재 Windows Server, 버전 2004에서 사용할 수 있으며 2021년 초에 Windows Server 2019에서 사용할 수 있다. [Microsoft 윈도우 컨테이너 이슈 트래커](https://github.com/microsoft/Windows-Containers/issues/44)에서 업데이트를 확인한다. -{{< /caution >}} +[윈도우에 ContainerD 설치](/ko/docs/setup/production-environment/container-runtimes/#containerd-설치) +방법을 확인한다. #### 퍼시스턴트 스토리지(Persistent Storage) -쿠버네티스 [볼륨](/ko/docs/concepts/storage/volumes/)을 사용하면 데이터 지속성(persistence) 및 파드 볼륨 공유 요구 사항이 있는 복잡한 애플리케이션을 쿠버네티스에 배포할 수 있다. 특정 스토리지 백엔드 또는 프로토콜과 관련된 퍼시스턴트 볼륨 관리에는 볼륨 프로비저닝/디-프로비저닝/크기 조정, 쿠버네티스 노드에 볼륨 연결/분리, 데이터를 유지해야 하는 파드의 개별 컨테이너에 볼륨 마운트/분리와 같은 작업이 포함된다. 특정 스토리지 백엔드 또는 프로토콜에 대해 이러한 볼륨 관리 작업을 구현하는 코드는 쿠버네티스 볼륨 [플러그인](/ko/docs/concepts/storage/volumes/#볼륨-유형들)의 형태로 제공된다. 다음과 같은 광범위한 쿠버네티스 볼륨 플러그인 클래스가 윈도우에서 지원된다. +쿠버네티스 [볼륨](/ko/docs/concepts/storage/volumes/)을 사용하면 +데이터 지속성(persistence) 및 파드 볼륨 공유 요구 사항이 있는 복잡한 애플리케이션을 +쿠버네티스에 배포할 수 있다. 특정 스토리지 백엔드 또는 +프로토콜과 관련된 퍼시스턴트 볼륨 관리에는 +볼륨 프로비저닝/디-프로비저닝/크기 조정, 쿠버네티스 노드에 볼륨 +연결/분리, 데이터를 유지해야 하는 파드의 개별 컨테이너에 볼륨 +마운트/분리와 같은 작업이 포함된다. 특정 스토리지 백엔드 또는 +프로토콜에 대해 이러한 볼륨 관리 작업을 +구현하는 코드는 쿠버네티스 볼륨 +[플러그인](/ko/docs/concepts/storage/volumes/#볼륨-유형들)의 형태로 제공된다. 다음과 같은 +광범위한 쿠버네티스 볼륨 플러그인 클래스가 윈도우에서 지원된다. ##### 인-트리(In-tree) 볼륨 플러그인 -인-트리 볼륨 플러그인과 관련된 코드는 핵심 쿠버네티스 코드 베이스의 일부로 제공된다. 인-트리 볼륨 플러그인 배포는 추가 스크립트를 설치하거나 별도의 컨테이너화된 플러그인 컴포넌트를 배포할 필요가 없다. 이러한 플러그인들은 볼륨 프로비저닝/디-프로비저닝, 스토리지 백엔드 볼륨 크기 조정, 쿠버네티스 노드에 볼륨 연결/분리, 파드의 개별 컨테이너에 볼륨 마운트/분리를 처리할 수 있다. 다음의 인-트리 플러그인은 윈도우 노드를 지원한다. +인-트리 볼륨 플러그인과 관련된 코드는 핵심 쿠버네티스 +코드 베이스의 일부로 제공된다. 인-트리 볼륨 플러그인 배포는 +추가 스크립트를 설치하거나 별도의 컨테이너화된 플러그인 컴포넌트를 +배포할 필요가 없다. 이러한 플러그인들은 +볼륨 프로비저닝/디-프로비저닝, 스토리지 백엔드 볼륨 크기 조정, 쿠버네티스 노드에 +볼륨 연결/분리, 파드의 개별 컨테이너에 볼륨 마운트/분리를 +처리할 수 있다. 다음의 인-트리 플러그인은 윈도우 노드를 지원한다. * [awsElasticBlockStore](/ko/docs/concepts/storage/volumes/#awselasticblockstore) * [azureDisk](/ko/docs/concepts/storage/volumes/#azuredisk) @@ -140,7 +219,16 @@ ContainerD와 함께 GMSA를 사용하여 커널 패치가 필요한 윈도우 ##### FlexVolume 플러그인 -[FlexVolume](/ko/docs/concepts/storage/volumes/#flexVolume) 플러그인과 관련된 코드는 아웃-오브-트리(out-of-tree) 스크립트 또는 호스트에 직접 배포해야 하는 바이너리로 제공된다. FlexVolume 플러그인은 쿠버네티스 노드에 볼륨 연결/분리 및 파드의 개별 컨테이너에 볼륨 마운트/분리를 처리한다. FlexVolume 플러그인과 관련된 퍼시스턴트 볼륨의 프로비저닝/디-프로비저닝은 일반적으로 FlexVolume 플러그인과는 별도의 외부 프로비저너를 통해 처리될 수 있다. 호스트에서 powershell 스크립트로 배포된 다음의 FlexVolume [플러그인](https://github.com/Microsoft/K8s-Storage-Plugins/tree/master/flexvolume/windows)은 윈도우 노드를 지원한다. +[FlexVolume](/ko/docs/concepts/storage/volumes/#flexVolume) +플러그인과 관련된 코드는 아웃-오브-트리(out-of-tree) 스크립트 또는 호스트에 직접 배포해야 하는 +바이너리로 제공된다. FlexVolume 플러그인은 쿠버네티스 노드에 볼륨 +연결/분리 및 파드의 개별 컨테이너에 볼륨 마운트/분리를 +처리한다. FlexVolume 플러그인과 관련된 퍼시스턴트 볼륨의 +프로비저닝/디-프로비저닝은 일반적으로 FlexVolume 플러그인과는 별도의 외부 +프로비저너를 통해 처리될 수 있다. 호스트에서 +powershell 스크립트로 배포된 다음의 FlexVolume +[플러그인](https://github.com/Microsoft/K8s-Storage-Plugins/tree/master/flexvolume/windows)은 +윈도우 노드를 지원한다. * [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) @@ -149,13 +237,40 @@ ContainerD와 함께 GMSA를 사용하여 커널 패치가 필요한 윈도우 {{< feature-state for_k8s_version="v1.19" state="beta" >}} -{{< glossary_tooltip text="CSI" term_id="csi" >}} 플러그인과 관련된 코드는 일반적으로 컨테이너 이미지로 배포되고 데몬셋(DaemonSets) 및 스테이트풀셋(StatefulSets)과 같은 표준 쿠버네티스 구성을 사용하여 배포되는 아웃-오브-트리 스크립트 및 바이너리로 제공된다. CSI 플러그인은 쿠버네티스에서 볼륨 프로비저닝/디-프로비저닝, 볼륨 크기 조정, 쿠버네티스 노드에 볼륨 연결/분리, 파드의 개별 컨테이너에 볼륨 마운트/분리, 스냅샷 및 복제를 사용하여 퍼시스턴트 데이터 백업/복원과 같은 다양한 볼륨 관리 작업을 처리한다. CSI 플러그인은 일반적으로 (각 노드에서 데몬셋으로 실행되는) 노드 플러그인과 컨트롤러 플러그인으로 구성된다. +{{< glossary_tooltip text="CSI" term_id="csi" >}} 플러그인과 +관련된 코드는 일반적으로 컨테이너 이미지로 배포되고 데몬셋(DaemonSets) +및 스테이트풀셋(StatefulSets)과 같은 +표준 쿠버네티스 구성을 사용하여 배포되는 아웃-오브-트리 스크립트 및 +바이너리로 제공된다. CSI 플러그인은 쿠버네티스에서 볼륨 프로비저닝/디-프로비저닝, 볼륨 +크기 조정, 쿠버네티스 노드에 볼륨 연결/분리, 파드의 개별 컨테이너에 볼륨 +마운트/분리, 스냅샷 및 복제를 사용하여 퍼시스턴트 데이터 백업/복원과 같은 +다양한 볼륨 관리 작업을 처리한다. CSI 플러그인은 +일반적으로 (각 노드에서 데몬셋으로 실행되는) 노드 플러그인과 컨트롤러 +플러그인으로 구성된다. -CSI 노드 플러그인(특히 블록 디바이스 또는 공유 파일시스템으로 노출된 퍼시스턴트 볼륨과 관련된 플러그인)은 디스크 장치 스캔, 파일 시스템 마운트 등과 같은 다양한 특권이 필요한(privileged) 작업을 수행해야 한다. 이러한 작업은 호스트 운영 체제마다 다르다. 리눅스 워커 노드의 경우 컨테이너화된 CSI 노드 플러그인은 일반적으로 특권을 가진 컨테이너로 배포된다. 윈도우 워커 노드의 경우 컨테이너화된 CSI 노드 플러그인에 대한 특권이 필요한 작업은 커뮤니티에서 관리되고, 각 윈도우 노드에 사전 설치되어야 하는 독립형(stand-alone) 바이너리인 [csi-proxy](https://github.com/kubernetes-csi/csi-proxy)를 사용하여 지원된다. 자세한 내용은 배포하려는 CSI 플러그인의 배포 가이드를 참조한다. +CSI 노드 플러그인(특히 블록 디바이스 또는 공유 파일시스템으로 노출된 +퍼시스턴트 볼륨과 관련된 플러그인)은 디스크 장치 스캔, 파일 시스템 마운트 등과 같은 +다양한 특권이 필요한(privileged) 작업을 수행해야 +한다. 이러한 작업은 호스트 운영 체제마다 다르다. 리눅스 워커 +노드의 경우 컨테이너화된 CSI 노드 플러그인은 일반적으로 특권을 가진 +컨테이너로 배포된다. 윈도우 워커 노드의 경우 컨테이너화된 +CSI 노드 플러그인에 대한 특권이 필요한 작업은 커뮤니티에서 관리되고, +각 윈도우 노드에 사전 설치되어야 하는 독립형(stand-alone) 바이너리인 +[csi-proxy](https://github.com/kubernetes-csi/csi-proxy)를 사용하여 지원된다. 자세한 +내용은 배포하려는 CSI 플러그인의 배포 가이드를 +참조한다. #### 네트워킹 -윈도우 컨테이너용 네트워킹은 [CNI 플러그인](/ko/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/)을 통해 노출된다. 윈도우 컨테이너는 네트워킹과 관련하여 가상 머신과 유사하게 작동한다. 각 컨테이너에는 Hyper-V 가상 스위치(vSwitch)에 연결된 가상 네트워크 어댑터(vNIC)가 있다. 호스트 네트워킹 서비스(HNS)와 호스트 컴퓨팅 서비스(HCS)는 함께 작동하여 컨테이너를 만들고 컨테이너 vNIC을 네트워크에 연결한다. HCS는 컨테이너 관리를 담당하는 반면 HNS는 다음과 같은 네트워킹 리소스 관리를 담당한다. +윈도우 컨테이너용 네트워킹은 +[CNI 플러그인](/ko/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/)을 통해 노출된다. +윈도우 컨테이너는 네트워킹과 관련하여 가상 머신과 유사하게 +작동한다. 각 컨테이너에는 Hyper-V 가상 스위치(vSwitch)에 연결된 +가상 네트워크 어댑터(vNIC)가 있다. 호스트 네트워킹 서비스(HNS)와 +호스트 컴퓨팅 서비스(HCS)는 함께 작동하여 컨테이너를 만들고 +컨테이너 vNIC을 네트워크에 연결한다. HCS는 컨테이너 관리를 +담당하는 반면 HNS는 다음과 같은 네트워킹 리소스 관리를 +담당한다. * 가상 네트워크(vSwitch 생성 포함) * 엔드포인트 / vNIC @@ -171,19 +286,155 @@ CSI 노드 플러그인(특히 블록 디바이스 또는 공유 파일시스템 ##### 네트워크 모드 -윈도우는 L2bridge, L2tunnel, Overlay, Transparent 및 NAT의 다섯 가지 네트워킹 드라이버/모드를 지원한다. 윈도우와 리눅스 워커 노드가 있는 이기종 클러스터에서는 윈도우와 리눅스 모두에서 호환되는 네트워킹 솔루션을 선택해야 한다. 윈도우에서 다음과 같은 out-of-tree 플러그인이 지원되며 각 CNI 사용 시 권장 사항이 있다. +윈도우는 L2bridge, L2tunnel, Overlay, Transparent 및 +NAT의 다섯 가지 네트워킹 드라이버/모드를 지원한다. 윈도우와 리눅스 워커 노드가 +있는 이기종 클러스터에서는 윈도우와 리눅스 모두에서 호환되는 네트워킹 +솔루션을 선택해야 한다. 윈도우에서 다음과 같은 out-of-tree 플러그인이 지원되며 +각 CNI 사용 시 권장 사항이 있다. -| 네트워크 드라이버 | 설명 | 컨테이너 패킷 수정 | 네트워크 플러그인 | 네트워크 플러그인 특성 | -| -------------- | ----------- | ------------------------------ | --------------- | ------------------------------ | -| L2bridge | 컨테이너는 외부 vSwitch에 연결된다. 컨테이너는 언더레이 네트워크에 연결된다. 하지만 인그레스/이그레스시에 재작성되기 때문에 물리적 네트워크가 컨테이너 MAC을 학습할 필요가 없다. | MAC은 호스트 MAC에 다시 쓰여지고, IP는 HNS OutboundNAT 정책을 사용하여 호스트 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 네트워크 모드를 사용하고, 컨테이너를 호스트의 언더레이에 연결하여 최상의 성능을 제공한다. 노드 간 연결을 위해 사용자 정의 경로(user-defined routes, 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/ko-kr/services/virtual-network/) 기능 집합을 활용할 수 있다. 예를 들어 Azure 서비스에 안전하게 연결하거나 Azure NSG를 사용한다. [azure-cni 예제](https://docs.microsoft.com/ko-kr/azure/aks/concepts-network#azure-cni-advanced-networking)를 참고한다. | -| 오버레이(쿠버네티스에서 윈도우용 오버레이 네트워킹은 *알파* 단계에 있음) | 컨테이너에는 외부 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를 재사용할 수 있다. 이 옵션을 사용하려면 윈도우 서버 2019에서 [KB4489899](https://support.microsoft.com/help/4489899)가 필요하다. | -| Transparent([ovn-kubernetes](https://github.com/openvswitch/ovn-kubernetes)의 특수한 유스케이스) | 외부 vSwitch가 필요하다. 컨테이너는 논리적 네트워크(논리적 스위치 및 라우터)를 통해 파드 내 통신을 가능하게 하는 외부 vSwitch에 연결된다. | 패킷은 [GENEVE](https://datatracker.ietf.org/doc/draft-gross-geneve/) 또는 [STT](https://datatracker.ietf.org/doc/draft-davie-stt)를 통해 캡슐화되는데, 동일한 호스트에 있지 않은 파드에 도달하기 위한 터널링을 한다. <br/> 패킷은 ovn 네트워크 컨트롤러에서 제공하는 터널 메타데이터 정보를 통해 전달되거나 삭제된다. <br/> NAT는 north-south 통신(데이터 센터와 클라이언트, 네트워크 상의 데이터 센터 외부와의 통신)을 위해 수행된다. | [ovn-kubernetes](https://github.com/openvswitch/ovn-kubernetes) | [ansible을 통해 배포](https://github.com/openvswitch/ovn-kubernetes/tree/master/contrib)한다. 분산 ACL은 쿠버네티스 정책을 통해 적용할 수 있다. IPAM을 지원한다. kube-proxy 없이 로드 밸런싱을 수행할 수 있다. NAT를 수행할 때 iptables/netsh를 사용하지 않고 수행된다. | -| NAT(*쿠버네티스에서 사용되지 않음*) | 컨테이너에는 내부 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) | 완전성을 위해 여기에 포함되었다. | +<table> + <thead> + <tr> + <th>네트워크 드라이버</th> + <th>설명</th> + <th>컨테이너 패킷 수정</th> + <th>네트워크 플러그인</th> + <th>네트워크 플러그인 특성</th> + </tr> + </thead> + <tbody> + <tr> + <td>L2bridge</td> + <td>컨테이너는 외부 vSwitch에 연결된다. 컨테이너는 + 언더레이 네트워크에 연결된다. 하지만 인그레스/이그레스시에 재작성되기 + 때문에 물리적 네트워크가 컨테이너 MAC을 학습할 필요가 없다. + </td> + <td> + MAC은 호스트 MAC에 다시 쓰여지고, IP는 HNS OutboundNAT 정책을 사용하여 + 호스트 IP에 다시 쓰여질 수 있다. + </td> + <td> + <a href="https://github.com/containernetworking/plugins/tree/master/plugins/main/windows/win-bridge">win-bridge<a>, + <a href="https://github.com/Azure/azure-container-networking/blob/master/docs/cni.md">Azure-CNI</a>, + Flannel 호스트 게이트웨이는 win-bridge를 사용한다. + </td> + <td> + win-bridge는 L2bridge 네트워크 모드를 사용하고, + 컨테이너를 호스트의 언더레이에 연결하여 최상의 성능을 제공한다. + 노드 간 연결을 위해 사용자 정의 경로(user-defined routes, UDR)가 필요하다. + </td> + </tr> + <tr> + <td>L2Tunnel</td> + <td> + 이것은 l2bridge의 특별한 케이스이지만 Azure에서만 사용된다. 모든 패킷은 + SDN 정책이 적용되는 가상화 호스트로 전송된다. + </td> + <td> + MAC 재작성되고, 언더레이 네트워크 상에서 IP가 보인다. + </td> + <td> + <a href="https://github.com/Azure/azure-container-networking/blob/master/docs/cni.md">Azure-CNI</a> + </td> + <td> + Azure-CNI를 사용하면 컨테이너를 Azure vNET과 통합할 수 있으며, + <a href="https://azure.microsoft.com/ko-kr/services/virtual-network/">Azure Virtual Network</a>에서 + 제공하는 기능 집합을 활용할 수 있다. + 예를 들어, Azure 서비스에 안전하게 연결하거나 Azure NSG를 사용한다. + <a href="https://docs.microsoft.com/ko-kr/azure/aks/concepts-network#azure-cni-advanced-networking">azure-cni</a> + 예제를 참고한다. + </td> + </tr> + <tr> + <td>오버레이(쿠버네티스에서 윈도우용 오버레이 네트워킹은 <B>알파</B> 단계에 있음)</td> + <td> + 컨테이너에는 외부 vSwitch에 연결된 vNIC이 제공된다. 각 오버레이 + 네트워크는 사용자 지정 IP 접두사로 정의된 자체 IP 서브넷을 가져온다. 오버레이 + 네트워크 드라이버는 VXLAN 캡슐화를 사용한다. + </td> + <td> + 외부 헤더로 캡슐화된다. + </td> + <td> + <a href="https://github.com/containernetworking/plugins/tree/master/plugins/main/windows/win-overlay">Win-overlay</a>, + Flannel VXLAN (win-overlay 사용) + </td> + <td> + win-overlay는 가상 컨테이너 네트워크를 호스트의 + 언더레이에서 격리하려는 경우(예: 보안 상의 이유로) 사용해야 한다. 데이터 센터의 IP에 + 제한이 있는 경우, (다른 VNID 태그가 있는) 다른 오버레이 + 네트워크에 IP를 재사용할 수 있다. 이 옵션을 사용하려면 + 윈도우 서버 2019에서 <a href="https://support.microsoft.com/help/4489899">KB4489899</a>가 + 필요하다. + </td> + </tr> + <tr> + <td> + Transparent(<a href="https://github.com/openvswitch/ovn-kubernetes">ovn-kubernetes</a>의 특수한 유스케이스) + </td> + <td> + 외부 vSwitch가 필요하다. 컨테이너는 논리적 네트워크(논리적 스위치 및 라우터)를 + 통해 파드 내 통신을 가능하게 하는 외부 vSwitch에 + 연결된다. + </td> + <td> + 패킷은 + <a href="https://datatracker.ietf.org/doc/draft-gross-geneve/">GENEVE</a>, + <a href="https://datatracker.ietf.org/doc/draft-davie-stt/">STT</a> 터널링을 통해 + 캡슐화되는데, 동일한 호스트에 있지 않은 파드에 도달하기 위한 터널링을 한다. <br/> 패킷은 ovn 네트워크 + 컨트롤러에서 제공하는 터널 메타데이터 정보를 통해 전달되거나 삭제된다. + <br/> + NAT는 north-south 통신(데이터 센터와 클라이언트, 네트워크 상의 데이터 센터 외부와의 통신)을 위해 수행된다. + </td> + <td> + <a href="https://github.com/openvswitch/ovn-kubernetes">ovn-kubernetes</a> + </td> + <td> + <a href="https://github.com/openvswitch/ovn-kubernetes/tree/master/contrib">Ansible</a>을 통해 배포한다. + 분산 ACL은 쿠버네티스 정책을 통해 적용할 수 있다. IPAM을 지원한다. + kube-proxy 없이 로드 밸런싱을 수행할 수 있다. NAT를 수행할 때 + iptables/netsh를 사용하지 않고 수행된다. + </td> + </tr> + <tr> + <td>NAT (<B>쿠버네티스에서 사용되지 않음</B>)</td> + <td> + 컨테이너에는 내부 vSwitch에 연결된 vNIC이 제공된다. DNS/DHCP는 + <a href="https://blogs.technet.microsoft.com/virtualization/2016/05/25/windows-nat-winnat-capabilities-and-limitations">WinNAT</a>라는 + 내부 컴포넌트를 사용하여 제공된다. + </td> + <td> + MAC 및 IP는 호스트 MAC/IP에 다시 작성된다. + </td> + <td> + <a href="https://github.com/Microsoft/windows-container-networking/tree/master/plugins/nat">nat</a> + </td> + <td> + 완전성을 위해 여기에 포함되었다. + </td> + </tr> + </tbody> +</table> -위에서 설명한대로 [플란넬(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)(**alpha 지원**, win-overlay에 위임) 및 [host-gateway network backend](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#host-gw) (안정적인 지원, win-bridge에 위임)를 통해 [윈도우](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel#windows-support-experimental)에서도 지원된다. 이 플러그인은 자동 노드 서브넷 임대 할당과 HNS 네트워크 생성을 위해 윈도우 (Flanneld)에서 Flannel 데몬과 함께 작동하도록 참조 CNI 플러그인 (win-overlay, win-bridge) 중 하나에 대한 위임을 지원한다. 이 플러그인은 자체 구성 파일 (cni.conf)을 읽고, 이를 FlannelD 생성하는 subnet.env 파일의 환경 변수와 함께 집계한다. 이후 네트워크 연결을 위한 참조 CNI 플러그인 중 하나에 위임하고 노드 할당 서브넷을 포함하는 올바른 구성을 IPAM 플러그인 (예: 호스트-로컬)으로 보낸다. +위에서 설명한대로 [플란넬(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) +(**alpha 지원**, win-overlay에 위임) 및 +[host-gateway network backend](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#host-gw) +(안정적인 지원, win-bridge에 위임)를 통해 +[윈도우](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel#windows-support-experimental)에서도 +지원된다. 이 플러그인은 자동 노드 서브넷 +임대 할당과 HNS 네트워크 생성을 위해 윈도우 (Flanneld)에서 +Flannel 데몬과 함께 작동하도록 참조 CNI 플러그인 (win-overlay, win-bridge) +중 하나에 대한 위임을 지원한다. 이 플러그인은 자체 +구성 파일 (cni.conf)을 읽고, 이를 FlannelD 생성하는 subnet.env 파일의 환경 변수와 +함께 집계한다. 이후 네트워크 연결을 위한 +참조 CNI 플러그인 중 하나에 위임하고 노드 할당 서브넷을 포함하는 올바른 +구성을 IPAM 플러그인 (예: 호스트-로컬)으로 +보낸다. -노드, 파드, 서비스 오브젝트의 경우 TCP/UDP 트래픽에 대해 다음 네트워크 흐름이 지원된다. +노드, 파드, 서비스 오브젝트의 경우 TCP/UDP 트래픽에 대해 다음 +네트워크 흐름이 지원된다. * 파드 -> 파드(IP) * 파드 -> 파드(Name) @@ -205,84 +456,227 @@ CSI 노드 플러그인(특히 블록 디바이스 또는 공유 파일시스템 ##### 로드 밸런싱과 서비스 -윈도우에서는 다음 설정을 사용하여 서비스 및 로드 밸런싱 동작을 구성할 수 있다. +윈도우에서는 다음 설정을 사용하여 서비스 및 로드 밸런싱 동작을 +구성할 수 있다. {{< table caption="윈도우 서비스 구성" >}} -| 기능 | 설명 | 지원되는 쿠버네티스 버전 | 지원되는 윈도우 OS 빌드 | 활성화하는 방법 | -| ------- | ----------- | ----------------------------- | -------------------------- | ------------- | -| 세션 어피니티 | 특정 클라이언트의 연결이 매번 동일한 파드로 전달되도록 한다. | v1.20 이상 | [윈도우 서버 vNext Insider Preview Build 19551](https://blogs.windows.com/windowsexperience/2020/01/28/announcing-windows-server-vnext-insider-preview-build-19551/) 이상 | `service.spec.sessionAffinity`를 "ClientIP"로 설정 | -| 직접 서버 반환 (DSR) | IP 주소 수정 및 LBNAT가 컨테이너 vSwitch 포트에서 직접 발생하는 로드 밸런싱 모드. 서비스 트래픽은 소스 IP가 원래 파드 IP로 설정된 상태로 도착한다. | v1.20 이상 | 윈도우 서버 2019 | kube-proxy에서 다음 플래그를 설정한다. `--feature-gates="WinDSR=true" --enable-dsr=true` | -| 대상 보존(Preserve-Destination) | 서비스 트래픽의 DNAT를 스킵하여, 백엔드 파드에 도달하는 패킷에서 대상 서비스의 가상 IP를 보존한다. 또한 노드-노드 전달을 비활성화한다. | v1.20 이상 | 윈도우 서버, 버전 1903 (또는 그 이상) | 서비스 어노테이션에서 `"preserve-destination": "true"`를 설정하고 kube-proxy에서 DSR을 활성화한다. | -| IPv4/IPv6 이중 스택 네트워킹 | 클러스터 내/외부 기본 IPv4-to-IPv4 통신과 함께 IPv6-to-IPv6 통신 | v1.19 이상 | 윈도우 서버, 버전 2004 (또는 그 이상) | [IPv4/IPv6 이중 스택](#ipv4ipv6-이중-스택)을 참고한다. | -| 클라이언트 IP 보존 | 인그레스 트래픽의 소스 IP가 유지되도록 한다. 또한 노드-노드 전달을 비활성화한다. | v1.20 이상 | 윈도우 서버, 버전 2019 (또는 그 이상) | `service.spec.externalTrafficPolicy` 를 "Local"로 설정하고 kube-proxy에서 DSR을 활성화한다. | + +<table> + <thead> + <tr> + <th>기능</th> + <th>설명</th> + <th>지원되는 쿠버네티스 버전</th> + <th>지원되는 윈도우 OS 빌드</th> + <th>활성화하는 방법</th> + </tr> + <thead> + <tbody> + <tr> + <td>세션 어피니티</td> + <td> + 특정 클라이언트의 연결이 매번 동일한 파드로 + 전달되도록 한다. + </td> + <td>v1.20 이상</td> + <td> + <a href="https://blogs.windows.com/windowsexperience/2020/01/28/announcing-windows-server-vnext-insider-preview-build-19551/">윈도우 서버 vNext Insider Preview Build 19551</a> (또는 그 이상) + </td> + <td> + <code>service.spec.sessionAffinity</code>를 "ClientIP"로 설정 + </td> + </tr> + <tr> + <td>직접 서버 반환 (DSR) </td> + <td> + IP 주소 수정 및 LBNAT가 컨테이너 vSwitch 포트에서 직접 + 발생하는 로드 밸런싱 모드. 서비스 트래픽은 소스 IP가 원래 파드 IP로 + 설정된 상태로 도착한다. + </td> + <td>v1.20 이상</td> + <td> + 윈도우 서버 2019 + </td> + <td> + kube-proxy에서 다음 플래그를 설정한다. + <code>--feature-gates="WinDSR=true" --enable-dsr=true</code> + </td> + </tr> + <tr> + <td>대상 보존(Preserve-Destination)</td> + <td> + 서비스 트래픽의 DNAT를 스킵하여, 백엔드 파드에 도달하는 패킷에서 대상 + 서비스의 가상 IP를 보존한다. 또한 노드-노드 전달을 비활성화한다. + </td> + <td>v1.20 이상</td> + <td>윈도우 서버, 버전 1903 (또는 그 이상)</td> + <td> + 서비스 어노테이션에서 <code>"preserve-destination": "true"</code>를 설정하고 + kube-proxy에서 DSR을 활성화한다. + </td> + </tr> + <tr> + <td>IPv4/IPv6 이중 스택 네트워킹</td> + <td> + 클러스터 내/외부 기본 IPv4-to-IPv4 통신과 함께 + IPv6-to-IPv6 통신 + </td> + <td>v1.19 이상</td> + <td>윈도우 서버, 버전 2004 (또는 그 이상)</td> + <td> + <a href="#ipv4ipv6-dual-stack">IPv4/IPv6 이중 스택</a>을 참고한다. + </td> + </tr> + <tr> + <td>클라이언트 IP 보존</td> + <td> + 인그레스 트래픽의 소스 IP가 유지되도록 한다. 또한 + 노드-노드 전달을 비활성화한다. + </td> + <td>v1.20 이상</td> + <td>윈도우 서버, 버전 2019 (또는 그 이상)</td> + <td> + <code>service.spec.externalTrafficPolicy</code>를 "Local"로 설정하고 + kube-proxy에서 DSR을 활성화한다. + </td> + </tr> + </tbody> +</table> + {{< /table >}} #### IPv4/IPv6 이중 스택 -`IPv6DualStack` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 사용하여 `l2bridge` 네트워크에 IPv4/IPv6 이중 스택 네트워킹을 활성화할 수 있다. 자세한 내용은 [IPv4/IPv6 이중 스택 활성화](/ko/docs/concepts/services-networking/dual-stack/#ipv4-ipv6-이중-스택-활성화)를 참조한다. +`IPv6DualStack` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 +사용하여 `l2bridge` 네트워크에 IPv4/IPv6 이중 스택 네트워킹을 활성화할 수 있다. 자세한 내용은 +[IPv4/IPv6 이중 스택 활성화](/ko/docs/concepts/services-networking/dual-stack/#ipv4-ipv6-이중-스택-활성화)를 +참조한다. -{{< note >}} -윈도우에서 쿠버네티스와 함께 IPv6를 사용하려면 윈도우 서버 버전 2004 (커널 버전 10.0.19041.610) 이상이 필요하다. -{{< /note >}} +윈도우에서 쿠버네티스와 함께 IPv6를 사용하려면 윈도우 서버 버전 2004 +(커널 버전 10.0.19041.610) 이상이 필요하다. -{{< note >}} 윈도우의 오버레이(VXLAN) 네트워크는 현재 이중 스택 네트워킹을 지원하지 않는다. -{{< /note >}} ### 제한 -윈도우는 쿠버네티스 아키텍처 및 컴포넌트 매트릭스에서 워커 노드로만 지원된다. 즉, 쿠버네티스 클러스터에는 항상 리눅스 마스터 노드가 반드시 포함되어야 하고, 0개 이상의 리눅스 워커 노드 및 0개 이상의 윈도우 워커 노드가 포함된다. +윈도우는 쿠버네티스 아키텍처 및 컴포넌트 매트릭스에서 워커 +노드로만 지원된다. 즉, 쿠버네티스 클러스터에는 항상 리눅스 마스터 노드가 반드시 +포함되어야 하고, 0개 이상의 리눅스 워커 노드 및 0개 이상의 윈도우 +워커 노드가 포함된다. #### 자원 관리 - 리눅스 cgroup은 리눅스에서 리소스 제어를 위한 파드 경계로 사용된다. 컨테이너는 네트워크, 프로세스 및 파일시스템 격리를 위해 해당 경계 내에 생성된다. cgroups API는 cpu/io/memory 통계를 수집하는 데 사용할 수 있다. 반대로 윈도우는 시스템 네임스페이스 필터가 있는 컨테이너별로 잡(Job) 오브젝트를 사용하여 컨테이너의 모든 프로세스를 포함하고 호스트와의 논리적 격리를 제공한다. 네임스페이스 필터링 없이 윈도우 컨테이너를 실행할 수 있는 방법은 없다. 즉, 시스템 권한은 호스트 컨텍스트에서 삽입 될(assert) 수 없으므로 권한이 있는(privileged) 컨테이너는 윈도우에서 사용할 수 없다. 보안 계정 매니져(Security Account Manager, SAM)가 분리되어 있으므로 컨테이너는 호스트의 ID를 가정할 수 없다. +리눅스 cgroup은 리눅스에서 리소스 제어를 위한 파드 경계로 사용된다. +컨테이너는 네트워크, 프로세스 및 파일시스템 격리를 위해 해당 +경계 내에 생성된다. cgroups API는 cpu/io/memory 통계를 수집하는 데 사용할 수 있다. +반대로 윈도우는 시스템 네임스페이스 필터가 있는 컨테이너별로 잡(Job) +오브젝트를 사용하여 컨테이너의 모든 프로세스를 포함하고 호스트와의 +논리적 격리를 제공한다. 네임스페이스 필터링 없이 윈도우 컨테이너를 +실행할 수 있는 방법은 없다. 즉, 시스템 권한은 호스트 컨텍스트에서 삽입될(assert) 수 없으므로 +권한이 있는(privileged) 컨테이너는 윈도우에서 사용할 수 없다. 보안 계정 +매니져(Security Account Manager, SAM)가 분리되어 있으므로 +컨테이너는 호스트의 ID를 가정할 수 없다. #### 자원 예약 ##### 메모리 예약 -윈도우에는 리눅스에는 있는 메모리 부족 프로세스 킬러가 없다. 윈도우는 모든 사용자-모드 메모리 할당을 항상 가상 메모리처럼 처리하며, 페이지파일이 필수이다. 결과적으로 윈도우에서는 리눅스에서 발생할 수 있는 메모리 부족 상태에 도달하지 않으며, 프로세스는 메모리 부족 (out of memory, OOM) 종료를 겪는 대신 디스크로 페이징한다. 메모리가 오버프로비저닝되고 모든 물리 메모리가 고갈되면 페이징으로 인해 성능이 저하될 수 있다. -kubelet 파라미터 `--kubelet-reserve` 를 사용하여 메모리 사용량을 합리적인 범위 내로 유지할 수 있으며, `--system-reserve` 를 사용하여 노드 (컨테이너 외부) 의 메모리 사용량을 예약할 수 있다. 이들을 사용하면 그만큼 [노드 할당(NodeAllocatable)](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable)은 줄어든다. +윈도우에는 리눅스에는 있는 메모리 부족 프로세스 킬러가 없다. 윈도우는 +모든 사용자-모드 메모리 할당을 항상 가상 메모리처럼 처리하며, 페이지파일이 +필수이다. 결과적으로 윈도우에서는 리눅스에서 발생할 수 있는 +메모리 부족 상태에 도달하지 않으며, 프로세스는 메모리 부족(out of memory, OOM) 종료를 +겪는 대신 디스크로 페이징한다. 메모리가 오버프로비저닝되고 +모든 물리 메모리가 고갈되면 페이징으로 인해 성능이 저하될 수 있다. -{{< note >}} -워크로드를 배포할 때, 컨테이너에 리소스 제한을 걸어라 (제한만 설정하거나, 제한이 요청과 같아야 함). 이 또한 NodeAllocatable 에서 차감되며, 메모리가 꽉 찬 노드에 스케줄러가 파드를 할당하지 않도록 제한한다. -{{< /note >}} +kubelet 파라미터 `--kubelet-reserve` 를 사용하여 메모리 사용량을 +합리적인 범위 내로 유지할 수 있으며, `--system-reserve` 를 사용하여 +노드(컨테이너 외부)의 메모리 사용량을 예약할 수 있다. 이들을 사용하면 그만큼 +[노드 할당(NodeAllocatable)](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable)은 줄어든다. -오버프로비저닝을 방지하는 가장 좋은 방법은 윈도우, 도커, 그리고 쿠버네티스 프로세스를 위해 최소 2GB 이상의 시스템 예약 메모리로 kubelet을 설정하는 것이다. +워크로드를 배포할 때, 컨테이너에 리소스 제한을 +걸어라(제한만 설정하거나, 제한이 요청과 같아야 함). 이 또한 NodeAllocatable에서 차감되며, +메모리가 꽉 찬 노드에 스케줄러가 파드를 할당하지 않도록 제한한다. + +오버프로비저닝을 방지하는 가장 좋은 방법은 윈도우, 도커, 그리고 +쿠버네티스 프로세스를 위해 최소 2GB 이상의 시스템 예약 메모리로 +kubelet을 설정하는 것이다. ##### CPU 예약 -윈도우, 도커, 그리고 다른 쿠버네티스 호스트 프로세스가 이벤트에 잘 응답할 수 있도록, CPU의 일정 비율을 예약하는 것이 좋다. 이 값은 윈도우 노드에 있는 CPU 코어 수에 따라 조정해야 한다. 이 비율을 결정하려면, 각 노드의 최대 파드 밀도(density)를 관찰하고, 시스템 서비스의 CPU 사용량을 모니터링하여 워크로드 요구사항을 충족하는 값을 선택해야 한다. -kubelet 파라미터 `--kubelet-reserve` 를 사용하여 CPU 사용량을 합리적인 범위 내로 유지할 수 있으며, `--system-reserve` 를 사용하여 노드 (컨테이너 외부) 의 CPU 사용량을 예약할 수 있다. 이들을 사용하면 그만큼 [노드 할당(NodeAllocatable)](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable)은 줄어든다. +윈도우, 도커, 그리고 다른 쿠버네티스 호스트 프로세스가 이벤트에 +잘 응답할 수 있도록, CPU의 일정 비율을 예약하는 것이 +좋다. 이 값은 윈도우 노드에 있는 CPU 코어 수에 +따라 조정해야 한다. 이 비율을 결정하려면, 각 노드의 +최대 파드 밀도(density)를 관찰하고, 시스템 서비스의 CPU +사용량을 모니터링하여 워크로드 요구사항을 충족하는 값을 선택해야 한다. + +kubelet 파라미터 `--kubelet-reserve` 를 사용하여 CPU 사용량을 +합리적인 범위 내로 유지할 수 있으며, `--system-reserve` 를 사용하여 +노드 (컨테이너 외부) 의 CPU 사용량을 예약할 수 있다. 이들을 사용하면 그만큼 +[노드 할당(NodeAllocatable)](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable)은 줄어든다. #### 기능 제한 + * TerminationGracePeriod: 구현되지 않음 * 단일 파일 매핑: CRI-ContainerD로 구현 예정 * 종료 메시지: CRI-ContainerD로 구현 예정 * 특권을 가진(Privileged) 컨테이너: 현재 윈도우 컨테이너에서 지원되지 않음 * HugePages: 현재 윈도우 컨테이너에서 지원되지 않음 -* 기존 노드 문제 감지기는 리눅스 전용이며 특권을 가진 컨테이너가 필요하다. 윈도우에서 특권을 가진 컨테이너를 지원하지 않기 때문에 일반적으로 윈도우에서 이 기능이 사용될 것으로 예상하지 않는다. -* 공유 네임스페이스의 모든 기능이 지원되는 것은 아니다. (자세한 내용은 API 섹션 참조). +* 기존 노드 문제 감지기는 리눅스 전용이며 특권을 가진 + 컨테이너가 필요하다. 윈도우에서 특권을 가진 컨테이너를 지원하지 않기 때문에 + 일반적으로 윈도우에서 이 기능이 사용될 것으로 예상하지 않는다. +* 공유 네임스페이스의 모든 기능이 지원되는 것은 아니다. (자세한 내용은 + API 섹션 참조). #### 각 플래그의 리눅스와의 차이점 + 윈도우 노드에서의 kubelet 플래그의 동작은 아래에 설명된 대로 다르게 동작한다. -* `--kubelet-reserve`, `--system-reserve`, `--eviction-hard` 플래그는 Node Allocatable 업데이트 +* `--kubelet-reserve`, `--system-reserve`, `--eviction-hard` 플래그는 + Node Allocatable 업데이트 + * `--enforce-node-allocable`을 사용한 축출(Eviction)은 구현되지 않았다. + * `--eviction-hard`와 `--eviction-soft`를 사용한 축출은 구현되지 않았다. + * MemoryPressure 조건은 구현되지 않았다. + * kubelet이 취한 OOM 축출 조치가 없다. -* 윈도우 노드에서 실행되는 Kubelet에는 메모리 제한이 없다. `--kubelet-reserve`와 `--system-reserve`는 호스트에서 실행되는 kubelet 또는 프로세스에 제한을 설정하지 않는다. 이는 호스트의 kubelet 또는 프로세스가 node-allocatable 및 스케줄러 외부에서 메모리 리소스 부족을 유발할 수 있음을 의미한다. -* kubelet 프로세스의 우선 순위를 설정하는 추가 플래그는 `--windows-priorityclass`라는 윈도우 노드에서 사용할 수 있다. 이 플래그를 사용하면 kubelet 프로세스가 윈도우 호스트에서 실행중인 다른 프로세스와 비교할 때 더 많은 CPU 시간 슬라이스을 얻을 수 있다. 허용되는 값과 그 의미에 대한 자세한 내용은 [윈도우 우선순위 클래스](https://docs.microsoft.com/en-us/windows/win32/procthread/scheduling-priorities#priority-class)에서 확인할 수 있다. kubelet이 항상 충분한 CPU주기를 갖도록 하려면 이 플래그를 `ABOVE_NORMAL_PRIORITY_CLASS` 이상으로 설정하는 것이 좋다. + +* 윈도우 노드에서 실행되는 Kubelet에는 메모리 제한이 없다. + `--kubelet-reserve`와 `--system-reserve`는 호스트에서 실행되는 kubelet 또는 + 프로세스에 제한을 설정하지 않는다. 이는 호스트의 kubelet 또는 프로세스가 + node-allocatable 및 스케줄러 외부에서 메모리 리소스 부족을 유발할 수 있음을 + 의미한다. + +* kubelet 프로세스의 우선 순위를 설정하는 추가 플래그는 + `--windows-priorityclass`라는 윈도우 노드에서 사용할 수 있다. 이 플래그를 사용하면 + kubelet 프로세스가 윈도우 호스트에서 실행중인 다른 프로세스와 비교할 때 더 많은 CPU 시간 + 슬라이스을 얻을 수 있다. 허용되는 값과 그 의미에 대한 자세한 내용은 + [윈도우 우선순위 클래스](https://docs.microsoft.com/en-us/windows/win32/procthread/scheduling-priorities#priority-class)에서 + 확인할 수 있다. + kubelet이 항상 충분한 CPU주기를 갖도록 하려면 + 이 플래그를 `ABOVE_NORMAL_PRIORITY_CLASS` 이상으로 설정하는 것이 좋다. #### 스토리지 -윈도우에는 컨테이너 계층을 마운트하고 NTFS를 기반으로 하는 복제 파일시스템을 만드는 레이어드(layered) 파일시스템 드라이버가 있다. 컨테이너의 모든 파일 경로는 해당 컨테이너의 컨텍스트 내에서만 확인된다. +윈도우에는 컨테이너 계층을 마운트하고 NTFS를 기반으로 하는 복제 파일시스템을 +만드는 레이어드(layered) 파일시스템 드라이버가 있다. 컨테이너의 모든 파일 경로는 +해당 컨테이너의 컨텍스트 내에서만 확인된다. -* 도커 볼륨 마운트는 개별 파일이 아닌 컨테이너의 디렉토리 만 대상으로 할 수 있다. 이 제한은 CRI-containerD에는 존재하지 않는다. -* 볼륨 마운트는 파일이나 디렉터리를 호스트 파일시스템으로 다시 투영할 수 없다. -* 읽기 전용 파일시스템은 윈도우 레지스트리 및 SAM 데이터베이스에 항상 쓰기 접근이 필요하기 때문에 지원되지 않는다. 그러나 읽기 전용 볼륨은 지원된다. -* 볼륨 사용자 마스크(user-masks) 및 권한은 사용할 수 없다. SAM은 호스트와 컨테이너 간에 공유되지 않기 때문에 이들 간에 매핑이 없다. 모든 권한은 컨테이너 컨텍스트 내에서 해결된다. +* 도커 볼륨 마운트는 개별 파일이 아닌 컨테이너의 + 디렉터리만 대상으로 할 수 있다. 이 제한은 CRI-containerD에는 존재하지 않는다. + +* 볼륨 마운트는 파일이나 디렉터리를 호스트 파일시스템으로 다시 + 투영할 수 없다. + +* 읽기 전용 파일시스템은 윈도우 레지스트리 및 SAM 데이터베이스에 항상 + 쓰기 접근이 필요하기 때문에 지원되지 않는다. 그러나 읽기 전용 + 볼륨은 지원된다. + +* 볼륨 사용자 마스크(user-masks) 및 권한은 사용할 수 없다. SAM은 + 호스트와 컨테이너 간에 공유되지 않기 때문에 이들 간에 매핑이 없다. 모든 + 권한은 컨테이너 컨텍스트 내에서 해결된다. 결과적으로, 다음 스토리지 기능은 윈도우 노드에서 지원되지 않는다. @@ -299,24 +693,61 @@ kubelet 파라미터 `--kubelet-reserve` 를 사용하여 CPU 사용량을 합 #### 네트워킹 {#네트워킹-제한} -윈도우 컨테이너 네트워킹은 리눅스 네트워킹과 몇 가지 중요한 면에서 다르다. [윈도우 컨테이너 네트워킹에 대한 Microsoft 문서](https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/container-networking/architecture)에는 추가 세부 정보와 배경이 포함되어 있다. +윈도우 컨테이너 네트워킹은 리눅스 네트워킹과 몇 가지 중요한 면에서 +다르다. [윈도우 컨테이너 네트워킹에 대한 Microsoft 문서](https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/container-networking/architecture)에는 +추가 세부 정보와 배경이 포함되어 있다. -윈도우 호스트 네트워킹 서비스와 가상 스위치는 네임스페이스를 구현하고 파드 또는 컨테이너에 필요한 가상 NIC을 만들 수 있다. 그러나 DNS, 라우트, 메트릭과 같은 많은 구성은 리눅스에서와 같이 /etc/... 파일이 아닌 윈도우 레지스트리 데이터베이스에 저장된다. 컨테이너의 윈도우 레지스트리는 호스트 레지스트리와 별개이므로 호스트에서 컨테이너로 /etc/resolv.conf를 매핑하는 것과 같은 개념은 리눅스에서와 동일한 효과를 갖지 않는다. 해당 컨테이너의 컨텍스트에서 실행되는 윈도우 API를 사용하여 구성해야 한다. 따라서 CNI 구현에서는 파일 매핑에 의존하는 대신 HNS를 호출하여 네트워크 세부 정보를 파드 또는 컨테이너로 전달해야 한다. +윈도우 호스트 네트워킹 서비스와 가상 스위치는 네임스페이스를 +구현하고 파드 또는 컨테이너에 필요한 가상 NIC을 만들 수 있다. 그러나 +DNS, 라우트, 메트릭과 같은 많은 구성은 리눅스에서와 같이 /etc/... 파일이 +아닌 윈도우 레지스트리 데이터베이스에 저장된다. 컨테이너의 +윈도우 레지스트리는 호스트 레지스트리와 별개이므로 호스트에서 +컨테이너로 /etc/resolv.conf를 매핑하는 것과 같은 개념은 리눅스에서와 +동일한 효과를 갖지 않는다. 해당 컨테이너의 컨텍스트에서 실행되는 윈도우 API를 +사용하여 구성해야 한다. 따라서 CNI 구현에서는 파일 매핑에 의존하는 +대신 HNS를 호출하여 네트워크 세부 정보를 파드 또는 컨테이너로 +전달해야 한다. 다음 네트워킹 기능은 윈도우 노드에서 지원되지 않는다. * 윈도우 파드에서는 호스트 네트워킹 모드를 사용할 수 없다. -* 노드 자체에서 로컬 NodePort 접근은 실패한다. (다른 노드 또는 외부 클라이언트에서는 가능) -* 노드에서 서비스 VIP에 접근하는 것은 향후 윈도우 서버 릴리스에서 사용할 수 있다. + +* 노드 자체에서 로컬 NodePort 접근은 실패한다. (다른 노드 또는 + 외부 클라이언트에서는 가능) + +* 노드에서 서비스 VIP에 접근하는 것은 향후 윈도우 서버 릴리스에서 + 사용할 수 있다. + * 한 서비스는 최대 64개의 백엔드 파드 또는 고유한 목적지 IP를 지원할 수 있다. -* kube-proxy의 오버레이 네트워킹 지원은 베타 기능이다. 또한 윈도우 서버 2019에 [KB4482887](https://support.microsoft.com/ko-kr/help/4482887/windows-10-update-kb4482887)을 설치해야 한다. + +* kube-proxy의 오버레이 네트워킹 지원은 베타 기능이다. 또한 + 윈도우 서버 2019에 [KB4482887](https://support.microsoft.com/ko-kr/help/4482887/windows-10-update-kb4482887)을 + 설치해야 한다. + * 비-DSR 모드의 로컬 트래픽 정책 -* 오버레이 네트워크에 연결된 윈도우 컨테이너는 IPv6 스택을 통한 통신을 지원하지 않는다. 이 네트워크 드라이버가 IPv6 주소를 사용하고 kubelet, kube-proxy 및 CNI 플러그인에서 후속 쿠버네티스 작업을 사용할 수 있도록 하는데 필요한 뛰어난 윈도우 플랫폼 작업이 있다. -* win-overlay, win-bridge, Azure-CNI 플러그인을 통해 ICMP 프로토콜을 사용하는 아웃바운드 통신. 특히, 윈도우 데이터 플레인([VFP](https://www.microsoft.com/en-us/research/project/azure-virtual-filtering-platform/))은 ICMP 패킷 치환을 지원하지 않는다. 이것은 다음을 의미한다. - * 동일한 네트워크(예: ping을 통한 파드 간 통신) 내의 목적지로 전달되는 ICMP 패킷은 예상대로 제한 없이 작동한다. + +* 오버레이 네트워크에 연결된 윈도우 컨테이너는 + IPv6 스택을 통한 통신을 지원하지 않는다. 이 네트워크 드라이버가 IPv6 주소를 + 사용하고 kubelet, kube-proxy 및 CNI 플러그인에서 후속 쿠버네티스 작업을 + 사용할 수 있도록 하는데 필요한 뛰어난 윈도우 플랫폼 작업이 있다. + +* win-overlay, win-bridge, Azure-CNI 플러그인을 통해 + ICMP 프로토콜을 사용하는 아웃바운드 통신. 특히, 윈도우 데이터 플레인 + ([VFP](https://www.microsoft.com/en-us/research/project/azure-virtual-filtering-platform/))은 + ICMP 패킷 치환을 지원하지 않는다. 이것은 다음을 의미한다. + + * 동일한 네트워크(예: ping을 통한 파드 간 통신) 내의 목적지로 전달되는 + ICMP 패킷은 예상대로 제한 없이 작동한다. + * TCP/UDP 패킷은 예상대로 제한 없이 작동한다. - * 원격 네트워크를 통과하도록 지정된 ICMP 패킷(예: ping을 통한 파드에서 외부 인터넷으로의 통신)은 치환될 수 없으므로 소스로 다시 라우팅되지 않는다. - * TCP/UDP 패킷은 여전히 ​​치환될 수 있기 때문에 `ping <destination>`을 `curl <destination>`으로 대체하여 외부와의 연결을 디버깅할 수 있다. + + * 원격 네트워크를 통과하도록 지정된 ICMP 패킷(예: ping을 통한 + 파드에서 외부 인터넷으로의 통신)은 치환될 수 없으므로 + 소스로 다시 라우팅되지 않는다. + + * TCP/UDP 패킷은 여전히 ​​치환될 수 있기 때문에 + `ping <destination>`을 `curl <destination>`으로 대체하여 + 외부와의 연결을 디버깅할 수 있다. 해당 기능은 쿠버네티스 v1.15에 추가되었다. @@ -324,334 +755,583 @@ kubelet 파라미터 `--kubelet-reserve` 를 사용하여 CPU 사용량을 합 ##### CNI 플러그인 -* 윈도우 참조 네트워크 플러그인 win-bridge와 win-overlay는 현재 "CHECK" 구현 누락으로 인해 [CNI 사양](https://github.com/containernetworking/cni/blob/master/SPEC.md) v0.4.0을 구현하지 않는다. +* 윈도우 참조 네트워크 플러그인 win-bridge와 win-overlay는 + 현재 "CHECK" 구현 누락으로 인해 [CNI 사양](https://github.com/containernetworking/cni/blob/master/SPEC.md) + v0.4.0을 구현하지 않는다. + * Flannel VXLAN CNI는 윈도우에서 다음과 같은 제한이 있다. -1. 노드-파드 연결은 설계상 불가능하다. Flannel v0.12.0(또는 그 이상)이 있는 로컬 파드에서만 가능하다. -2. VNI 4096와 UDP 4789 포트 사용은 제한된다. VNI 제한은 작업 중이며 향후 릴리스(오픈 소스 flannel 변경)에서 구현될 것이다. 이러한 파라미터에 대한 자세한 내용은 공식 [Flannel VXLAN](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#vxlan) 백엔드 문서를 참고한다. + 1. 노드-파드 연결은 설계상 불가능하다. Flannel v0.12.0(또는 그 이상)이 + 있는 로컬 파드에서만 가능하다. + + 1. VNI 4096와 UDP 4789 포트 사용은 제한된다. VNI 제한은 + 작업 중이며 향후 릴리스(오픈 소스 flannel 변경)에서 + 구현될 것이다. 이러한 파라미터에 대한 자세한 내용은 공식 + [Flannel VXLAN](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#vxlan) + 백엔드 문서를 참고한다. ##### DNS {#dns-limitations} -* ClusterFirstWithHostNet은 DNS에서 지원되지 않는다. 윈도우는 '.'이 있는 모든 이름을 FQDN으로 처리하고 PQDN 확인을 건너뛴다. -* 리눅스에서는 PQDN을 확인하려고 할 때 사용되는 DNS 접미사 목록이 있다. 윈도우에서는 해당 파드의 네임스페이스(예: mydns.svc.cluster.local)와 연결된 DNS 접미사인 DNS 접미사 1개만 있다. 윈도우는 FQDN과 서비스 또는 해당 접미사만으로 확인할 수 있는 이름을 확인할 수 있다. 예를 들어, 디폴트 네임스페이스에서 생성된 파드에는 DNS 접미사 **default.svc.cluster.local**이 있다. 윈도우 파드에서는 **kubernetes.default.svc.cluster.local** 및 **kubernetes**를 모두 확인할 수 있지만 **kubernetes.default** 또는 **kubernetes.default.svc**와 같은 중간 항목은 확인할 수 없다. -* 윈도우에서는 사용할 수 있는 여러 가지의 DNS 리졸버(resolver)가 있다. 이들은 약간 다른 동작을 제공하므로, 이름 쿼리 확인을 위해 `Resolve-DNSName` 유틸리티를 사용하는 것이 좋다. +* ClusterFirstWithHostNet은 DNS에서 지원되지 않는다. 윈도우는 + '.'이 있는 모든 이름을 FQDN으로 처리하고 PQDN 확인을 건너뛴다. + +* 리눅스에서는 PQDN을 확인하려고 할 때 사용되는 DNS 접미사 목록이 + 있다. 윈도우에서는 해당 파드의 네임스페이스(예: mydns.svc.cluster.local)와 + 연결된 DNS 접미사인 DNS 접미사 1개만 있다. + 윈도우는 FQDN과 서비스 또는 해당 접미사만으로 확인할 수 있는 이름을 확인할 수 + 있다. 예를 들어, 디폴트 네임스페이스에서 생성된 파드에는 DNS + 접미사 `default.svc.cluster.local`이 있다. 윈도우 파드에서는 + `kubernetes.default.svc.cluster.local` 및 `kubernetes`를 모두 확인할 수 + 있지만 `kubernetes.default` 또는 `kubernetes.default.svc`와 같은 중간 항목은 확인할 수 없다. + +* 윈도우에서는 사용할 수 있는 여러 가지의 DNS 리졸버(resolver)가 있다. 이들은 + 약간 다른 동작을 제공하므로, 이름 쿼리 확인을 위해 `Resolve-DNSName` 유틸리티를 + 사용하는 것이 좋다. ##### IPv6 -윈도우의 쿠버네티스는 단일 스택 "IPv6 전용" 네트워킹을 지원하지 않는다. 그러나 단일 제품군 서비스를 사용하는 파드와 노드에 대한 이중 스택 IPv4/IPv6 네트워킹이 지원된다. 자세한 내용은 [IPv4/IPv6 이중 스택 네트워킹](#ipv4ipv6-이중-스택)을 참고한다. +윈도우의 쿠버네티스는 단일 스택 "IPv6 전용" 네트워킹을 지원하지 않는다. +그러나 단일 제품군 서비스를 사용하는 파드와 노드에 대한 이중 스택 IPv4/IPv6 네트워킹이 +지원된다. +자세한 내용은 [IPv4/IPv6 이중 스택 네트워킹](#ipv4ipv6-이중-스택)을 참고한다. ##### 세션 어피니티(affinity) -`service.spec.sessionAffinityConfig.clientIP.timeoutSeconds`를 사용하는 윈도우 서비스의 최대 세션 고정(sticky) 시간 설정은 지원되지 않는다. +`service.spec.sessionAffinityConfig.clientIP.timeoutSeconds`를 사용하는 +윈도우 서비스의 최대 세션 고정(sticky) 시간 설정은 지원되지 않는다. ##### 보안 -시크릿(Secret)은 노드의 볼륨(리눅스의 tmpfs/in-memory와 비교)에 일반 텍스트로 작성된다. 이는 고객이 두 가지 작업을 수행해야 함을 의미한다. +시크릿(Secret)은 노드의 볼륨(리눅스의 tmpfs/in-memory와 +비교)에 일반 텍스트로 작성된다. 이는 고객이 두 가지 작업을 수행해야 함을 의미한다. 1. 파일 ACL을 사용하여 시크릿 파일 위치를 보호한다. -2. [BitLocker](https://docs.microsoft.com/ko-kr/windows/security/information-protection/bitlocker/bitlocker-how-to-deploy-on-windows-server)를 사용한 볼륨-레벨 암호화를 사용한다. +1. [BitLocker](https://docs.microsoft.com/ko-kr/windows/security/information-protection/bitlocker/bitlocker-how-to-deploy-on-windows-server)를 + 사용한 볼륨-레벨 암호화를 사용한다. -[RunAsUsername](/ko/docs/tasks/configure-pod-container/configure-runasusername)은 컨테이너 프로세스를 노드 기본 사용자로 실행하기 위해 윈도우 파드 또는 컨테이너에 지정할 수 있다. 이것은 [RunAsUser](/ko/docs/concepts/policy/pod-security-policy/#사용자-및-그룹)와 거의 동일하다. +[RunAsUsername](/ko/docs/tasks/configure-pod-container/configure-runasusername)은 +컨테이너 프로세스를 노드 기본 사용자로 실행하기 위해 윈도우 파드 또는 +컨테이너에 지정할 수 있다. 이것은 +[RunAsUser](/ko/docs/concepts/policy/pod-security-policy/#사용자-및-그룹)와 거의 동일하다. -SELinux, AppArmor, Seccomp, 기능(POSIX 기능)과 같은 리눅스 특유의 파드 시큐리티 컨텍스트 권한은 지원하지 않는다. +SELinux, AppArmor, Seccomp, 기능(POSIX 기능)과 같은 +리눅스 특유의 파드 시큐리티 컨텍스트 권한은 지원하지 않는다. -또한 이미 언급했듯이 특권을 가진 컨테이너는 윈도우에서 지원되지 않는다. +또한 이미 언급했듯이 특권을 가진 컨테이너는 윈도우에서 지원되지 +않는다. #### API -대부분의 Kubernetes API가 윈도우에서 작동하는 방식은 차이가 없다. 중요한 차이점은 OS와 컨테이너 런타임의 차이로 귀결된다. 특정 상황에서 파드 또는 컨테이너와 같은 워크로드 API의 일부 속성은 리눅스에서 구현되고 윈도우에서 실행되지 않는다는 가정 하에 설계되었다. +대부분의 Kubernetes API가 윈도우에서 작동하는 방식은 차이가 없다. +중요한 차이점은 OS와 컨테이너 런타임의 차이로 +귀결된다. 특정 상황에서 파드 또는 컨테이너와 같은 워크로드 API의 +일부 속성은 리눅스에서 구현되고 윈도우에서 실행되지 않는다는 가정 하에 +설계되었다. 높은 수준에서 이러한 OS 개념은 다르다. -* ID - 리눅스는 정수형으로 표시되는 userID(UID) 및 groupID(GID)를 사용한다. 사용자와 그룹 이름은 정식 이름이 아니다. UID+GID에 대한 `/etc/groups` 또는 `/etc/passwd`의 별칭일 뿐이다. 윈도우는 윈도우 보안 계정 관리자(Security Account Manager, SAM) 데이터베이스에 저장된 더 큰 이진 보안 식별자(SID)를 사용한다. 이 데이터베이스는 호스트와 컨테이너 간에 또는 컨테이너들 간에 공유되지 않는다. -* 파일 퍼미션 - 윈도우는 권한 및 UUID+GID의 비트 마스크(bitmask) 대신 SID를 기반으로 하는 접근 제어 목록을 사용한다. -* 파일 경로 - 윈도우의 규칙은 `/` 대신 `\`를 사용하는 것이다. Go IO 라이브러리는 두 가지 파일 경로 분리자를 모두 허용한다. 하지만, 컨테이너 내부에서 해석되는 경로 또는 커맨드 라인을 설정할 때 `\`가 필요할 수 있다. -* 신호(Signals) - 윈도우 대화형(interactive) 앱은 종료를 다르게 처리하며, 다음 중 하나 이상을 구현할 수 있다. - * UI 스레드는 WM_CLOSE를 포함하여 잘 정의된(well-defined) 메시지를 처리한다. - * 콘솔 앱은 컨트롤 핸들러(Control Handler)를 사용하여 ctrl-c 또는 ctrl-break를 처리한다. - * 서비스는 SERVICE_CONTROL_STOP 제어 코드를 수용할 수 있는 Service Control Handler 함수를 등록한다. +* ID - 리눅스는 정수형으로 표시되는 userID(UID) 및 groupID(GID)를 + 사용한다. 사용자와 그룹 이름은 정식 이름이 아니다. UID+GID에 대한 + `/etc/groups` 또는 `/etc/passwd`의 별칭일 뿐이다. 윈도우는 윈도우 + 보안 계정 관리자(Security Account Manager, SAM) 데이터베이스에 + 저장된 더 큰 이진 보안 식별자(SID)를 사용한다. 이 데이터베이스는 호스트와 + 컨테이너 간에 또는 컨테이너들 간에 공유되지 않는다. -종료 코드는 0일 때 성공, 0이 아닌 경우 실패인 동일한 규칙을 따른다. 특정 오류 코드는 윈도우와 리눅스에서 다를 수 있다. 그러나 쿠버네티스 컴포넌트(kubelet, kube-proxy)에서 전달된 종료 코드는 변경되지 않는다. +* 파일 퍼미션 - 윈도우는 권한 및 UUID+GID의 비트 마스크(bitmask) 대신 + SID를 기반으로 하는 접근 제어 목록을 사용한다. + +* 파일 경로 - 윈도우의 규칙은 `/` 대신 `\`를 사용하는 것이다. Go IO + 라이브러리는 두 가지 파일 경로 분리자를 모두 허용한다. 하지만, 컨테이너 + 내부에서 해석되는 경로 또는 커맨드 라인을 설정할 때 `\`가 필요할 수 + 있다. + +* 신호(Signals) - 윈도우 대화형(interactive) 앱은 종료를 다르게 처리하며, 다음 중 + 하나 이상을 구현할 수 있다. + + * UI 스레드는 `WM_CLOSE`를 포함하여 잘 정의된(well-defined) 메시지를 처리한다. + + * 콘솔 앱은 컨트롤 핸들러(Control Handler)를 사용하여 ctrl-c 또는 ctrl-break를 처리한다. + + * 서비스는 `SERVICE_CONTROL_STOP` 제어 코드를 수용할 수 있는 + Service Control Handler 함수를 등록한다. + +종료 코드는 0일 때 성공, 0이 아닌 경우 실패인 동일한 규칙을 따른다. +특정 오류 코드는 윈도우와 리눅스에서 다를 수 있다. 그러나 +쿠버네티스 컴포넌트(kubelet, kube-proxy)에서 전달된 종료 코드는 +변경되지 않는다. ##### V1.Container -* V1.Container.ResourceRequirements.limits.cpu 및 V1.Container.ResourceRequirements.limits.memory - 윈도우는 CPU 할당에 하드 리밋(hard limit)을 사용하지 않는다. 대신 공유 시스템이 사용된다. 밀리코어를 기반으로 하는 기존 필드는 윈도우 스케줄러가 뒤따르는 상대적인 공유로 스케일된다. [참고: kuberuntime/helpers_windows.go](https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/kuberuntime/helpers_windows.go), [참고: Microsoft 문서 내 리소스 제어](https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/manage-containers/resource-controls) - * Huge page는 윈도우 컨테이너 런타임에서 구현되지 않으며, 사용할 수 없다. 컨테이너에 대해 구성할 수 없는 [사용자 권한(privilege) 어설트](https://docs.microsoft.com/en-us/windows/desktop/Memory/large-page-support)가 필요하다. -* V1.Container.ResourceRequirements.requests.cpu 및 V1.Container.ResourceRequirements.requests.memory - 노드의 사용 가능한 리소스에서 요청(requests)을 빼서, 노드에 대한 오버 프로비저닝을 방지하는데 사용할 수 있다. 그러나 오버 프로비저닝된 노드에서 리소스를 보장하는 데는 사용할 수 없다. 운영자가 오버 프로비저닝을 완전히 피하려는 경우 모범 사례로 모든 컨테이너에 적용해야 한다. -* V1.Container.SecurityContext.allowPrivilegeEscalation - 윈도우에서는 불가능하며, 어떤 기능도 연결되지 않는다. -* V1.Container.SecurityContext.Capabilities - POSIX 기능은 윈도우에서 구현되지 않는다. -* V1.Container.SecurityContext.privileged - 윈도우는 특권을 가진 컨테이너를 지원하지 않는다. +* V1.Container.ResourceRequirements.limits.cpu 및 + V1.Container.ResourceRequirements.limits.memory - 윈도우는 CPU 할당에 하드 + 리밋(hard limit)을 사용하지 않는다. 대신 공유 시스템이 사용된다. 밀리코어를 + 기반으로 하는 기존 필드는 윈도우 스케줄러가 뒤따르는 상대적인 공유로 + 스케일된다. + [참고: kuberuntime/helpers_windows.go](https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/kuberuntime/helpers_windows.go), + [참고: Microsoft 문서 내 리소스 제어](https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/manage-containers/resource-controls) + + * Huge page는 윈도우 컨테이너 런타임에서 구현되지 않으며, + 사용할 수 없다. 컨테이너에 대해 구성할 수 없는 + [사용자 권한(privilege) 어설트](https://docs.microsoft.com/en-us/windows/desktop/Memory/large-page-support)가 + 필요하다. + +* V1.Container.ResourceRequirements.requests.cpu 및 + V1.Container.ResourceRequirements.requests.memory - 노드의 사용 가능한 + 리소스에서 요청(requests)을 빼서, 노드에 대한 오버 프로비저닝을 방지하는데 사용할 수 + 있다. 그러나 오버 프로비저닝된 노드에서 리소스를 보장하는 데는 + 사용할 수 없다. 운영자가 오버 프로비저닝을 완전히 피하려는 경우 + 모범 사례로 모든 컨테이너에 적용해야 한다. + +* V1.Container.SecurityContext.allowPrivilegeEscalation - 윈도우에서는 + 불가능하며, 어떤 기능도 연결되지 않는다. + +* V1.Container.SecurityContext.Capabilities - POSIX 기능은 윈도우에서 + 구현되지 않는다. + +* V1.Container.SecurityContext.privileged - 윈도우는 특권을 가진 컨테이너를 + 지원하지 않는다. + * V1.Container.SecurityContext.procMount - 윈도우에는 /proc 파일시스템이 없다. -* V1.Container.SecurityContext.readOnlyRootFilesystem - 윈도우에서는 불가능하며, 레지스트리 및 시스템 프로세스가 컨테이너 내부에서 실행되려면 쓰기 권한이 필요하다. + +* V1.Container.SecurityContext.readOnlyRootFilesystem - 윈도우에서는 불가능하며, + 레지스트리 및 시스템 프로세스가 컨테이너 내부에서 실행되려면 쓰기 권한이 + 필요하다. + * V1.Container.SecurityContext.runAsGroup - 윈도우에서는 불가능하며, GID 지원이 없다. -* V1.Container.SecurityContext.runAsNonRoot - 윈도우에는 root 사용자가 없다. 가장 가까운 항목은 노드에 존재하지 않는 아이덴티티(identity)인 ContainerAdministrator이다. -* V1.Container.SecurityContext.runAsUser - 윈도우에서는 불가능하며, 정수값으로의 UID 지원이 없다. + +* V1.Container.SecurityContext.runAsNonRoot - 윈도우에는 root 사용자가 + 없다. 가장 가까운 항목은 노드에 존재하지 않는 아이덴티티(identity)인 + ContainerAdministrator이다. + +* V1.Container.SecurityContext.runAsUser - 윈도우에서는 불가능하며, 정수값으로의 UID + 지원이 없다. + * V1.Container.SecurityContext.seLinuxOptions - 윈도우에서는 불가능하며, SELinux가 없다. -* V1.Container.terminationMessagePath - 윈도우가 단일 파일 매핑을 지원하지 않는다는 점에서 몇 가지 제한이 있다. 기본값은 /dev/termination-log이며, 기본적으로 윈도우에 존재하지 않기 때문에 작동한다. + +* V1.Container.terminationMessagePath - 윈도우가 단일 파일 매핑을 지원하지 + 않는다는 점에서 몇 가지 제한이 있다. 기본값은 /dev/termination-log이며, 기본적으로 윈도우에 존재하지 않기 때문에 + 작동한다. ##### V1.Pod * V1.Pod.hostIPC, v1.pod.hostpid - 윈도우에서 호스트 네임스페이스 공유가 불가능하다. + * V1.Pod.hostNetwork - 호스트 네트워크를 공유하기 위한 윈도우 OS 지원이 없다. -* V1.Pod.dnsPolicy - ClusterFirstWithHostNet - 윈도우에서 호스트 네트워킹이 지원되지 않기 때문에 지원되지 않는다. + +* V1.Pod.dnsPolicy - ClusterFirstWithHostNet - 윈도우에서 호스트 네트워킹이 지원되지 않기 때문에 + 지원되지 않는다. + * V1.Pod.podSecurityContext - 아래 V1.PodSecurityContext 내용을 참고한다. -* V1.Pod.shareProcessNamespace - 이것은 베타 기능이며, 윈도우에서 구현되지 않은 리눅스 네임스페이스에 따라 다르다. 윈도우는 프로세스 네임스페이스 또는 컨테이너의 루트 파일시스템을 공유할 수 없다. 네트워크만 공유할 수 있다. -* V1.Pod.terminationGracePeriodSeconds - 이것은 윈도우의 도커에서 완전히 구현되지 않았다. [참조](https://github.com/moby/moby/issues/25982)의 내용을 참고한다. 현재 동작은 ENTRYPOINT 프로세스가 CTRL_SHUTDOWN_EVENT로 전송된 다음, 윈도우가 기본적으로 5초를 기다린 후, 마지막으로 정상적인 윈도우 종료 동작을 사용하여 모든 프로세스를 종료하는 것이다. 5초 기본값은 실제로 [컨테이너 내부](https://github.com/moby/moby/issues/25982#issuecomment-426441183) 윈도우 레지스트리에 있으므로 컨테이너를 빌드할 때 재정의 할 수 있다. -* V1.Pod.volumeDevices - 이것은 베타 기능이며, 윈도우에서 구현되지 않는다. 윈도우는 원시 블록 장치(raw block device)를 파드에 연결할 수 없다. -* V1.Pod.volumes - EmptyDir, 시크릿, 컨피그맵, HostPath - 모두 작동하며 TestGrid에 테스트가 있다. - * V1.emptyDirVolumeSource - 노드 기본 매체는 윈도우의 디스크이다. 윈도우에는 내장 RAM 디스크가 없기 때문에 메모리는 지원되지 않는다. + +* V1.Pod.shareProcessNamespace - 이것은 베타 기능이며, 윈도우에서 구현되지 않은 + 리눅스 네임스페이스에 따라 다르다. 윈도우는 프로세스 네임스페이스 또는 + 컨테이너의 루트 파일시스템을 공유할 수 없다. 네트워크만 공유할 수 + 있다. + +* V1.Pod.terminationGracePeriodSeconds - 이것은 윈도우의 도커에서 + 완전히 구현되지 않았다. + [참조](https://github.com/moby/moby/issues/25982)의 내용을 참고한다. 현재 동작은 + `ENTRYPOINT` 프로세스가 `CTRL_SHUTDOWN_EVENT`로 전송된 다음, 윈도우가 기본적으로 5초를 + 기다린 후, 마지막으로 정상적인 윈도우 종료 동작을 사용하여 모든 프로세스를 + 종료하는 것이다. 5초 기본값은 실제로 + [컨테이너 내부](https://github.com/moby/moby/issues/25982#issuecomment-426441183) + 윈도우 레지스트리에 있으므로 컨테이너를 빌드할 때 재정의 할 수 있다. + +* V1.Pod.volumeDevices - 이것은 베타 기능이며, 윈도우에서 구현되지 + 않는다. 윈도우는 원시 블록 장치(raw block device)를 파드에 연결할 수 없다. + +* V1.Pod.volumes - EmptyDir, 시크릿, 컨피그맵, HostPath - 모두 작동하며 + TestGrid에 테스트가 있다. + + * V1.emptyDirVolumeSource - 노드 기본 매체는 윈도우의 디스크이다. + 윈도우에는 내장 RAM 디스크가 없기 때문에 메모리는 지원되지 않는다. + * V1.VolumeMount.mountPropagation - 마운트 전파(propagation)는 윈도우에서 지원되지 않는다. ##### V1.PodSecurityContext -PodSecurityContext 필드는 윈도우에서 작동하지 않는다. 참조를 위해 여기에 나열한다. +PodSecurityContext 필드는 윈도우에서 작동하지 않는다. 참조를 위해 여기에 +나열한다. * V1.PodSecurityContext.SELinuxOptions - SELinux는 윈도우에서 사용할 수 없다. + * V1.PodSecurityContext.RunAsUser - 윈도우에서는 사용할 수 없는 UID를 제공한다. + * V1.PodSecurityContext.RunAsGroup - 윈도우에서는 사용할 수 없는 GID를 제공한다. -* V1.PodSecurityContext.RunAsNonRoot - 윈도우에는 root 사용자가 없다. 가장 가까운 항목은 노드에 존재하지 않는 아이덴티티인 ContainerAdministrator이다. + +* V1.PodSecurityContext.RunAsNonRoot - 윈도우에는 root 사용자가 없다. 가장 + 가까운 항목은 노드에 존재하지 않는 아이덴티티인 + ContainerAdministrator이다. + * V1.PodSecurityContext.SupplementalGroups - 윈도우에서는 사용할 수 없는 GID를 제공한다. -* V1.PodSecurityContext.Sysctls - 이것들은 리눅스 sysctl 인터페이스의 일부이다. 윈도우에는 이에 상응하는 것이 없다. + +* V1.PodSecurityContext.Sysctls - 이것들은 리눅스 sysctl 인터페이스의 + 일부이다. 윈도우에는 이에 상응하는 것이 없다. #### 운영 체제 버전 제한 -윈도우에는 호스트 OS 버전이 컨테이너 베이스 이미지 OS 버전과 일치해야 하는 엄격한 호환성 규칙이 있다. 윈도우 서버 2019의 컨테이너 운영 체제가 있는 윈도우 컨테이너만 지원된다. 윈도우 컨테이너 이미지 버전의 일부 이전 버전과의 호환성을 가능하게 하는 컨테이너의 Hyper-V 격리는 향후 릴리스로 계획되어 있다. +윈도우에는 호스트 OS 버전이 컨테이너 베이스 이미지 OS 버전과 일치해야 하는 +엄격한 호환성 규칙이 있다. 윈도우 서버 2019의 컨테이너 +운영 체제가 있는 윈도우 컨테이너만 지원된다. 윈도우 컨테이너 이미지 버전의 일부 +이전 버전과의 호환성을 가능하게 하는 컨테이너의 Hyper-V 격리는 +향후 릴리스로 계획되어 있다. ## 도움 받기 및 트러블슈팅 {#troubleshooting} -쿠버네티스 클러스터 트러블슈팅을 위한 기본 도움말은 이 [섹션](/docs/tasks/debug-application-cluster/troubleshooting/)에서 먼저 찾아야 한다. 이 섹션에는 몇 가지 추가 윈도우 관련 트러블슈팅 도움말이 포함되어 있다. 로그는 쿠버네티스에서 트러블슈팅하는데 중요한 요소이다. 다른 기여자로부터 트러블슈팅 지원을 구할 때마다 이를 포함해야 한다. SIG-Windows [로그 수집에 대한 기여 가이드](https://github.com/kubernetes/community/blob/master/sig-windows/CONTRIBUTING.md#gathering-logs)의 지침을 따른다. +쿠버네티스 클러스터 트러블슈팅을 위한 기본 +도움말은 이 +[섹션](/docs/tasks/debug-application-cluster/troubleshooting/)에서 먼저 찾아야 한다. 이 +섹션에는 몇 가지 추가 윈도우 관련 트러블슈팅 도움말이 포함되어 있다. +로그는 쿠버네티스에서 트러블슈팅하는데 중요한 요소이다. 다른 +기여자로부터 트러블슈팅 지원을 구할 때마다 이를 포함해야 +한다. SIG-Windows +[로그 수집에 대한 기여 가이드](https://github.com/kubernetes/community/blob/master/sig-windows/CONTRIBUTING.md#gathering-logs)의 지침을 따른다. -1. start.ps1이 성공적으로 완료되었는지 어떻게 알 수 있는가? +* start.ps1이 성공적으로 완료되었는지 어떻게 알 수 있는가? - kubelet, kube-proxy 및 (Flannel을 네트워킹 솔루션으로 선택한 경우) 노드에서 실행 중인 flanneld 호스트 에이전트 프로세스를 확인할 수 있어야 하는데, 별도의 PowerShell 윈도우에서 실행 중인 로그가 표시된다. 또한 윈도우 노드는 쿠버네티스 클러스터에서 "Ready"로 조회되어야 한다. + kubelet, kube-proxy 및 (Flannel을 네트워킹 솔루션으로 + 선택한 경우) 노드에서 실행 중인 flanneld 호스트 에이전트 프로세스를 + 확인할 수 있어야 하는데, 별도의 PowerShell 윈도우에서 실행 중인 로그가 표시된다. 또한 + 윈도우 노드는 쿠버네티스 클러스터에서 "Ready"로 조회되어야 + 한다. -1. 백그라운드에서 서비스로 실행되도록 쿠버네티스 노드 프로세스를 구성할 수 있는가? +* 백그라운드에서 서비스로 실행되도록 쿠버네티스 노드 프로세스를 구성할 수 있는가? - Kubelet 및 kube-proxy는 이미 기본 윈도우 서비스로 실행되도록 구성되어 있으며, 실패(예: 프로세스 충돌) 시 서비스를 자동으로 다시 시작하여 복원력(resiliency)을 제공한다. 이러한 노드 컴포넌트를 서비스로 구성하기 위한 두 가지 옵션이 있다. + Kubelet 및 kube-proxy는 이미 기본 윈도우 서비스로 실행되도록 + 구성되어 있으며, 실패(예: 프로세스 충돌) 시 서비스를 + 자동으로 다시 시작하여 복원력(resiliency)을 + 제공한다. 이러한 노드 컴포넌트를 서비스로 구성하기 위한 + 두 가지 옵션이 있다. - 1. 네이티브 윈도우 서비스 + * 네이티브 윈도우 서비스 - Kubelet와 kube-proxy는 `sc.exe`를 사용하여 네이티브 윈도우 서비스로 실행될 수 있다. - - ```powershell - # 두 개의 개별 명령으로 kubelet 및 kube-proxy에 대한 서비스 생성 - sc.exe create <컴포넌트_명> binPath= "<바이너리_경로> --service <다른_인자>" - - # 인자에 공백이 포함된 경우 이스케이프 되어야 한다. - sc.exe create kubelet binPath= "C:\kubelet.exe --service --hostname-override 'minion' <다른_인자>" - - # 서비스 시작 - Start-Service kubelet - Start-Service kube-proxy - - # 서비스 중지 - Stop-Service kubelet (-Force) - Stop-Service kube-proxy (-Force) - - # 서비스 상태 질의 - Get-Service kubelet - Get-Service kube-proxy - ``` - - 1. nssm.exe 사용 - - 또한 언제든지 [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를 등록할 수 있다. - - ```powershell - register-svc.ps1 -NetworkMode <네트워크 모드> -ManagementIP <윈도우 노드 IP> -ClusterCIDR <클러스터 서브넷> -KubeDnsServiceIP <Kube-dns 서비스 IP> -LogDir <로그 위치 디렉터리> - - # NetworkMode = 네트워크 모드 l2bridge(flannel host-gw, 기본값이기도 함) 또는 네트워크 솔루션으로 선택한 오버레이(flannel vxlan) - # ManagementIP = 윈도우 노드에 할당된 IP 주소. ipconfig를 사용하여 찾을 수 있다. - # ClusterCIDR = 클러스터 서브넷 범위. (기본값 10.244.0.0/16) - # KubeDnsServiceIP = 쿠버네티스 DNS 서비스 IP (기본값 10.96.0.10) - # LogDir = kubelet 및 kube-proxy 로그가 각각의 출력 파일로 리다이렉션되는 디렉터리(기본값 C:\k) - ``` - - 위에 언급된 스크립트가 적합하지 않은 경우, 다음 예제를 사용하여 nssm.exe를 수동으로 구성할 수 있다. - ```powershell - # flanneld.exe 등록 - nssm install flanneld C:\flannel\flanneld.exe - nssm set flanneld AppParameters --kubeconfig-file=c:\k\config --iface=<ManagementIP> --ip-masq=1 --kube-subnet-mgr=1 - nssm set flanneld AppEnvironmentExtra NODE_NAME=<hostname> - nssm set flanneld AppDirectory C:\flannel - nssm start flanneld - - # kubelet.exe 등록 - # Microsoft는 mcr.microsoft.com/oss/kubernetes/pause:1.4.1에서 pause 인프라 컨테이너를 릴리스했다. - nssm install kubelet C:\k\kubelet.exe - nssm set kubelet AppParameters --hostname-override=<hostname> --v=6 --pod-infra-container-image=mcr.microsoft.com/oss/kubernetes/pause:1.4.1 --resolv-conf="" --allow-privileged=true --enable-debugging-handlers --cluster-dns=<DNS-service-IP> --cluster-domain=cluster.local --kubeconfig=c:\k\config --hairpin-mode=promiscuous-bridge --image-pull-progress-deadline=20m --cgroups-per-qos=false --log-dir=<log directory> --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 - - # 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=<hostname>--kubeconfig=c:\k\config --enable-dsr=false --log-dir=<log directory> --logtostderr=false - nssm.exe set kube-proxy AppEnvironmentExtra KUBE_NETWORK=cbr0 - nssm set kube-proxy DependOnService kubelet - nssm start kube-proxy - - # 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=<hostname> --kubeconfig=c:\k\config --network-name=vxlan0 --source-vip=<source-vip> --enable-dsr=false --log-dir=<log directory> --logtostderr=false - nssm set kube-proxy DependOnService kubelet - nssm start kube-proxy - ``` - - - 초기 트러블슈팅을 위해 [nssm.exe](https://nssm.cc/)에서 다음 플래그를 사용하여 stdout 및 stderr을 출력 파일로 리다이렉션할 수 있다. - - ```powershell - nssm set <Service Name> AppStdout C:\k\mysvc.log - nssm set <Service Name> AppStderr C:\k\mysvc.log - ``` - - 자세한 내용은 공식 [nssm 사용](https://nssm.cc/usage) 문서를 참고한다. - -1. 내 윈도우 파드에 네트워크 연결이 없다. - - 가상 머신을 사용하는 경우, 모든 VM 네트워크 어댑터에서 MAC 스푸핑이 활성화되어 있는지 확인한다. - -1. 내 윈도우 파드가 외부 리소스를 ping 할 수 없다. - - 윈도우 파드에는 현재 ICMP 프로토콜용으로 프로그래밍된 아웃바운드 규칙이 없다. 그러나 TCP/UDP는 지원된다. 클러스터 외부 리소스에 대한 연결을 시연하려는 경우, `ping <IP>`를 해당 `curl <IP>`명령으로 대체한다. - - 여전히 문제가 발생하는 경우, [cni.conf](https://github.com/Microsoft/SDN/blob/master/Kubernetes/flannel/l2bridge/cni/config/cni.conf)의 네트워크 구성에 특별히 추가 확인이 필요하다. 언제든지 이 정적 파일을 편집할 수 있다. 구성 업데이트는 새로 생성된 모든 쿠버네티스 리소스에 적용된다. - - 쿠버네티스 네트워킹 요구 사항 중 하나([쿠버네티스 모델](/ko/docs/concepts/cluster-administration/networking/))는 클러스터 통신이 내부적으로 NAT 없이 발생하는 것이다. 이 요구 사항을 준수하기 위해 아웃바운드 NAT가 발생하지 않도록 하는 모든 통신에 대한 [ExceptionList](https://github.com/Microsoft/SDN/blob/master/Kubernetes/flannel/l2bridge/cni/config/cni.conf#L20)가 있다. 그러나 이것은 쿼리하려는 외부 IP를 ExceptionList에서 제외해야 함도 의미한다. 그래야만 윈도우 파드에서 발생하는 트래픽이 제대로 SNAT 되어 외부에서 응답을 받는다. 이와 관련하여 `cni.conf`의 ExceptionList는 다음과 같아야 한다. - - ```conf - "ExceptionList": [ - "10.244.0.0/16", # 클러스터 서브넷 - "10.96.0.0/12", # 서비스 서브넷 - "10.127.130.0/24" # 관리(호스트) 서브넷 - ] - ``` - -1. 내 윈도우 노드가 NodePort 서비스에 접근할 수 없다. - - 노드 자체에서는 로컬 NodePort 접근이 실패한다. 이것은 알려진 제약사항이다. NodePort 접근은 다른 노드 또는 외부 클라이언트에서는 가능하다. - -1. 컨테이너의 vNIC 및 HNS 엔드포인트가 삭제되었다. - - 이 문제는 `hostname-override` 파라미터가 [kube-proxy](/ko/docs/reference/command-line-tools-reference/kube-proxy/)에 전달되지 않은 경우 발생할 수 있다. 이를 해결하려면 사용자는 다음과 같이 hostname을 kube-proxy에 전달해야 한다. + Kubelet와 kube-proxy는 `sc.exe`를 사용하여 네이티브 윈도우 서비스로 실행될 수 있다. ```powershell - C:\k\kube-proxy.exe --hostname-override=$(hostname) + # 두 개의 개별 명령으로 kubelet 및 kube-proxy에 대한 서비스 생성 + sc.exe create <컴포넌트_명> binPath= "<바이너리_경로> --service <다른_인자>" + + # 인자에 공백이 포함된 경우 이스케이프 되어야 한다. + sc.exe create kubelet binPath= "C:\kubelet.exe --service --hostname-override 'minion' <다른_인자>" + + # 서비스 시작 + Start-Service kubelet + Start-Service kube-proxy + + # 서비스 중지 + Stop-Service kubelet (-Force) + Stop-Service kube-proxy (-Force) + + # 서비스 상태 질의 + Get-Service kubelet + Get-Service kube-proxy ``` -1. 플란넬(flannel)을 사용하면 클러스터에 다시 조인(join)한 후 노드에 이슈가 발생한다. + * nssm.exe 사용 - 이전에 삭제된 노드가 클러스터에 다시 조인될 때마다, flannelD는 새 파드 서브넷을 노드에 할당하려고 한다. 사용자는 다음 경로에서 이전 파드 서브넷 구성 파일을 제거해야 한다. + 또한 언제든지 [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`를 등록할 수 있다. ```powershell - Remove-Item C:\k\SourceVip.json - Remove-Item C:\k\SourceVipRequest.json + register-svc.ps1 -NetworkMode <네트워크 모드> -ManagementIP <윈도우 노드 IP> -ClusterCIDR <클러스터 서브넷> -KubeDnsServiceIP <Kube-dns 서비스 IP> -LogDir <로그 위치 디렉터리> ``` + 파라미터 설명은 아래와 같다. -1. `start.ps1`을 시작한 후, flanneld가 "Waiting for the Network to be created"에서 멈춘다. + - `NetworkMode`: 네트워크 모드 l2bridge(flannel host-gw, + 기본값이기도 함) 또는 네트워크 솔루션으로 선택한 오버레이(flannel vxlan) + - `ManagementIP`: 윈도우 노드에 할당된 IP 주소. `ipconfig`를 사용하여 + 찾을 수 있다. + - `ClusterCIDR`: 클러스터 서브넷 범위. (기본값 10.244.0.0/16) + - `KubeDnsServiceIP`: 쿠버네티스 DNS 서비스 IP (기본값 10.96.0.10) + - `LogDir`: kubelet 및 kube-proxy 로그가 각각의 출력 파일로 + 리다이렉션되는 디렉터리(기본값 C:\k) - 이 [이슈](https://github.com/coreos/flannel/issues/1066)에 대한 수많은 보고가 있다. 플란넬 네트워크의 관리 IP가 설정될 때의 타이밍 이슈일 가능성이 높다. 해결 방법은 start.ps1을 다시 시작하거나 다음과 같이 수동으로 다시 시작하는 것이다. + 위에 언급된 스크립트가 적합하지 않은 경우, 다음 예제를 사용하여 + `nssm.exe`를 수동으로 구성할 수 있다. + + flanneld.exe를 등록한다. ```powershell - PS C:> [Environment]::SetEnvironmentVariable("NODE_NAME", "<Windows_Worker_Hostname>") - PS C:> C:\flannel\flanneld.exe --kubeconfig-file=c:\k\config --iface=<Windows_Worker_Node_IP> --ip-masq=1 --kube-subnet-mgr=1 + nssm install flanneld C:\flannel\flanneld.exe + nssm set flanneld AppParameters --kubeconfig-file=c:\k\config --iface=<ManagementIP> --ip-masq=1 --kube-subnet-mgr=1 + nssm set flanneld AppEnvironmentExtra NODE_NAME=<hostname> + nssm set flanneld AppDirectory C:\flannel + nssm start flanneld ``` -1. `/run/flannel/subnet.env` 누락으로 인해 윈도우 파드를 시작할 수 없다. - - 이것은 플란넬이 제대로 실행되지 않았음을 나타낸다. flanneld.exe를 다시 시작하거나 쿠버네티스 마스터의 `/run/flannel/subnet.env`에서 윈도우 워커 노드의 `C:\run\flannel\subnet.env`로 파일을 수동으로 복사할 수 있고, `FLANNEL_SUBNET` 행을 다른 숫자로 수정한다. 예를 들어, 다음은 노드 서브넷 10.244.4.1/24가 필요한 경우이다. - - ```env - FLANNEL_NETWORK=10.244.0.0/16 - FLANNEL_SUBNET=10.244.4.1/24 - FLANNEL_MTU=1500 - FLANNEL_IPMASQ=true - ``` - -1. 내 윈도우 노드가 서비스 IP를 사용하여 내 서비스에 접근할 수 없다. - - 이는 윈도우에서 현재 네트워킹 스택의 알려진 제약 사항이다. 그러나 윈도우 파드는 서비스 IP에 접근할 수 있다. - -1. kubelet을 시작할 때 네트워크 어댑터를 찾을 수 없다. - - 윈도우 네트워킹 스택에는 쿠버네티스 네트워킹이 작동하기 위한 가상 어댑터가 필요하다. 다음 명령이 (어드민 셸에서) 결과를 반환하지 않으면, Kubelet이 작동하는데 필요한 필수 구성 요소인 가상 네트워크 생성이 실패한 것이다. + kubelet.exe를 등록한다. ```powershell - Get-HnsNetwork | ? Name -ieq "cbr0" - Get-NetAdapter | ? Name -Like "vEthernet (Ethernet*" + # Microsoft는 mcr.microsoft.com/oss/kubernetes/pause:1.4.1에서 pause 인프라 컨테이너를 릴리스했다. + nssm install kubelet C:\k\kubelet.exe + nssm set kubelet AppParameters --hostname-override=<hostname> --v=6 --pod-infra-container-image=mcr.microsoft.com/oss/kubernetes/pause:1.4.1 --resolv-conf="" --allow-privileged=true --enable-debugging-handlers --cluster-dns=<DNS-service-IP> --cluster-domain=cluster.local --kubeconfig=c:\k\config --hairpin-mode=promiscuous-bridge --image-pull-progress-deadline=20m --cgroups-per-qos=false --log-dir=<log directory> --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 ``` - 호스트 네트워크 어댑터가 "Ethernet"이 아닌 경우, 종종 start.ps1 스크립트의 [InterfaceName](https://github.com/microsoft/SDN/blob/master/Kubernetes/flannel/start.ps1#L7) 파라미터를 수정하는 것이 좋다. 그렇지 않으면 `start-kubelet.ps1` 스크립트의 출력을 참조하여 가상 네트워크 생성 중에 오류가 있는지 확인한다. + kube-proxy.exe를 등록한다(l2bridge / host-gw). -1. 내 파드가 "Container Creating"에서 멈췄거나 계속해서 다시 시작된다. - - pause 이미지가 OS 버전과 호환되는지 확인한다. [지침](https://docs.microsoft.com/en-us/virtualization/windowscontainers/kubernetes/deploying-resources)에서는 OS와 컨테이너가 모두 버전 1803이라고 가정한다. 이후 버전의 윈도우가 있는 경우, Insider 빌드와 같이 그에 따라 이미지를 조정해야 한다. 이미지는 Microsoft의 [도커 리포지터리](https://hub.docker.com/u/microsoft/)를 참조한다. 그럼에도 불구하고, pause 이미지 Dockerfile과 샘플 서비스는 이미지가 :latest로 태그될 것으로 예상한다. - -1. DNS 확인(resolution)이 제대로 작동하지 않는다. - - 이 [섹션](#dns-limitations)에서 윈도우에 대한 DNS 제한을 확인한다. - -1. `kubectl port-forward`가 "unable to do port forwarding: wincat not found"로 실패한다. - - 이는 쿠버네티스 1.15 및 pause 인프라 컨테이너 `mcr.microsoft.com/oss/kubernetes/pause:1.4.1`에서 구현되었다. 해당 버전 또는 최신 버전을 사용해야 한다. - 자체 pause 인프라 컨테이너를 빌드하려면 [wincat](https://github.com/kubernetes-sigs/sig-windows-tools/tree/master/cmd/wincat)을 포함해야 한다. - -1. 내 윈도우 서버 노드가 프록시 뒤에 있기 때문에 내 쿠버네티스 설치가 실패한다. - - 프록시 뒤에 있는 경우 다음 PowerShell 환경 변수를 정의해야 한다. - - ```PowerShell - [Environment]::SetEnvironmentVariable("HTTP_PROXY", "http://proxy.example.com:80/", [EnvironmentVariableTarget]::Machine) - [Environment]::SetEnvironmentVariable("HTTPS_PROXY", "http://proxy.example.com:443/", [EnvironmentVariableTarget]::Machine) + ```powershell + 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=<hostname>--kubeconfig=c:\k\config --enable-dsr=false --log-dir=<log directory> --logtostderr=false + nssm.exe set kube-proxy AppEnvironmentExtra KUBE_NETWORK=cbr0 + nssm set kube-proxy DependOnService kubelet + nssm start kube-proxy ``` -1. `pause` 컨테이너란 무엇인가? + kube-proxy.exe를 등록한다(overlay / vxlan). - 쿠버네티스 파드에서는 컨테이너 엔드포인트를 호스팅하기 위해 먼저 인프라 또는 "pause" 컨테이너가 생성된다. 인프라 및 워커 컨테이너를 포함하여 동일한 파드에 속하는 컨테이너는 공통 네트워크 네임스페이스 및 엔드포인트(동일한 IP 및 포트 공간)를 공유한다. 네트워크 구성을 잃지 않고 워커 컨테이너가 충돌하거나 다시 시작되도록 하려면 pause 컨테이너가 필요하다. + ```powershell + 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=<hostname> --kubeconfig=c:\k\config --network-name=vxlan0 --source-vip=<source-vip> --enable-dsr=false --log-dir=<log directory> --logtostderr=false + nssm set kube-proxy DependOnService kubelet + nssm start kube-proxy + ``` - "pause" (인프라) 이미지는 Microsoft Container Registry(MCR)에서 호스팅된다. `mcr.microsoft.com/oss/kubernetes/pause:1.4.1`을 사용하여 접근할 수 있다. 자세한 내용은 [DOCKERFILE](https://github.com/kubernetes-sigs/windows-testing/blob/master/images/pause/Dockerfile)을 참고한다. + + 초기 트러블슈팅을 위해 [nssm.exe](https://nssm.cc/)에서 + 다음 플래그를 사용하여 stdout 및 stderr을 출력 파일로 리다이렉션할 수 있다. + + ```powershell + nssm set <Service Name> AppStdout C:\k\mysvc.log + nssm set <Service Name> AppStderr C:\k\mysvc.log + ``` + + 자세한 내용은 공식 [nssm 사용](https://nssm.cc/usage) 문서를 참고한다. + +* 내 윈도우 파드에 네트워크 연결이 없다. + + 가상 머신을 사용하는 경우, 모든 VM 네트워크 어댑터에서 MAC 스푸핑이 + 활성화되어 있는지 확인한다. + +* 내 윈도우 파드가 외부 리소스를 ping 할 수 없다. + + 윈도우 파드에는 현재 ICMP 프로토콜용으로 프로그래밍된 아웃바운드 + 규칙이 없다. 그러나 TCP/UDP는 지원된다. 클러스터 외부 리소스에 대한 연결을 + 시연하려는 경우, `ping <IP>`를 해당 `curl <IP>`명령으로 + 대체한다. + + 여전히 문제가 발생하는 경우, + [cni.conf](https://github.com/Microsoft/SDN/blob/master/Kubernetes/flannel/l2bridge/cni/config/cni.conf)의 + 네트워크 구성에 특별히 추가 확인이 필요하다. 언제든지 이 정적 파일을 편집할 수 있다. 구성 + 업데이트는 새로 생성된 모든 쿠버네티스 리소스에 적용된다. + + 쿠버네티스 네트워킹 요구 사항 중 + 하나([쿠버네티스 모델](/ko/docs/concepts/cluster-administration/networking/))는 + 클러스터 통신이 내부적으로 NAT 없이 발생하는 것이다. 이 요구 사항을 + 준수하기 위해 아웃바운드 NAT가 발생하지 않도록 하는 모든 통신에 대한 + [ExceptionList](https://github.com/Microsoft/SDN/blob/master/Kubernetes/flannel/l2bridge/cni/config/cni.conf#L20)가 + 있다. 그러나 + 이것은 쿼리하려는 외부 IP를 ExceptionList에서 + 제외해야 함도 의미한다. 그래야만 윈도우 파드에서 발생하는 트래픽이 제대로 SNAT 되어 + 외부에서 응답을 받는다. 이와 관련하여 `cni.conf`의 ExceptionList는 다음과 + 같아야 한다. + + ```conf + "ExceptionList": [ + "10.244.0.0/16", # 클러스터 서브넷 + "10.96.0.0/12", # 서비스 서브넷 + "10.127.130.0/24" # 관리(호스트) 서브넷 + ] + ``` + +* 내 윈도우 노드가 NodePort 서비스에 접근할 수 없다. + + 노드 자체에서는 로컬 NodePort 접근이 실패한다. 이것은 알려진 + 제약사항이다. NodePort 접근은 다른 노드 또는 외부 클라이언트에서는 가능하다. + +* 컨테이너의 vNIC 및 HNS 엔드포인트가 삭제되었다. + + 이 문제는 `hostname-override` 파라미터가 + [kube-proxy](/ko/docs/reference/command-line-tools-reference/kube-proxy/)에 + 전달되지 않은 경우 발생할 수 있다. + 이를 해결하려면 사용자는 다음과 같이 hostname을 kube-proxy에 전달해야 한다. + + ```powershell + C:\k\kube-proxy.exe --hostname-override=$(hostname) + ``` + +* 플란넬(flannel)을 사용하면 클러스터에 다시 조인(join)한 후 노드에 이슈가 발생한다. + + 이전에 삭제된 노드가 클러스터에 다시 조인될 때마다, + flannelD는 새 파드 서브넷을 노드에 할당하려고 한다. 사용자는 다음 경로에서 + 이전 파드 서브넷 구성 파일을 제거해야 한다. + + ```powershell + Remove-Item C:\k\SourceVip.json + Remove-Item C:\k\SourceVipRequest.json + ``` + +* `start.ps1`을 시작한 후, flanneld가 "Waiting for the Network + to be created"에서 멈춘다. + + 이 [이슈](https://github.com/coreos/flannel/issues/1066)에 + 대한 수많은 보고가 있다. 플란넬 네트워크의 + 관리 IP가 설정될 때의 타이밍 이슈일 가능성이 높다. 해결 + 방법은 start.ps1을 다시 시작하거나 다음과 같이 수동으로 다시 시작하는 것이다. + + ```powershell + PS C:> [Environment]::SetEnvironmentVariable("NODE_NAME", "<Windows_Worker_Hostname>") + PS C:> C:\flannel\flanneld.exe --kubeconfig-file=c:\k\config --iface=<Windows_Worker_Node_IP> --ip-masq=1 --kube-subnet-mgr=1 + ``` + +* `/run/flannel/subnet.env` 누락으로 인해 윈도우 파드를 시작할 수 없다. + + 이것은 플란넬이 제대로 실행되지 않았음을 나타낸다. flanneld.exe를 + 다시 시작하거나 쿠버네티스 마스터의 + `/run/flannel/subnet.env`에서 윈도우 워커 노드의 + `C:\run\flannel\subnet.env`로 파일을 수동으로 복사할 수 있고, + `FLANNEL_SUBNET` 행을 다른 숫자로 수정한다. 예를 들어, 다음은 노드 서브넷 + 10.244.4.1/24가 필요한 경우이다. + + ```none + FLANNEL_NETWORK=10.244.0.0/16 + FLANNEL_SUBNET=10.244.4.1/24 + FLANNEL_MTU=1500 + FLANNEL_IPMASQ=true + ``` + +* 내 윈도우 노드가 서비스 IP를 사용하여 내 서비스에 접근할 수 없다. + + 이는 윈도우에서 현재 네트워킹 스택의 알려진 제약 사항이다. + 그러나 윈도우 파드는 서비스 IP에 접근할 수 있다. + +* kubelet을 시작할 때 네트워크 어댑터를 찾을 수 없다. + + 윈도우 네트워킹 스택에는 쿠버네티스 네트워킹이 작동하기 위한 + 가상 어댑터가 필요하다. 다음 명령이 (어드민 셸에서) 결과를 반환하지 + 않으면, Kubelet이 작동하는데 필요한 필수 구성 요소인 가상 네트워크 생성이 + 실패한 것이다. + + ```powershell + Get-HnsNetwork | ? Name -ieq "cbr0" + Get-NetAdapter | ? Name -Like "vEthernet (Ethernet*" + ``` + + 호스트 네트워크 어댑터가 "Ethernet"이 아닌 경우, + 종종 start.ps1 스크립트의 + [InterfaceName](https://github.com/microsoft/SDN/blob/master/Kubernetes/flannel/start.ps1#L7) + 파라미터를 수정하는 것이 좋다. 그렇지 않으면 `start-kubelet.ps1` + 스크립트의 출력을 참조하여 가상 네트워크 생성 중에 오류가 있는지 확인한다. + +* 내 파드가 "Container Creating"에서 멈췄거나 계속해서 다시 시작된다. + + pause 이미지가 OS 버전과 호환되는지 확인한다. + [지침](https://docs.microsoft.com/en-us/virtualization/windowscontainers/kubernetes/deploying-resources)에서는 + OS와 컨테이너가 모두 버전 1803이라고 가정한다. 이후 버전의 + 윈도우가 있는 경우, Insider 빌드와 같이 그에 따라 이미지를 + 조정해야 한다. 이미지는 Microsoft의 + [도커 리포지터리](https://hub.docker.com/u/microsoft/)를 참조한다. + 그럼에도 불구하고, pause 이미지 Dockerfile과 샘플 서비스는 이미지가 + :latest로 태그될 것으로 예상한다. + +* DNS 확인(resolution)이 제대로 작동하지 않는다. + + [윈도우에 대한 DNS 제한](#dns-limitations)을 확인한다. + +* `kubectl port-forward`가 "unable to do port forwarding: wincat not found"로 실패한다. + + 이는 쿠버네티스 1.15 및 pause 인프라 컨테이너 + `mcr.microsoft.com/oss/kubernetes/pause:1.4.1`에서 구현되었다. + 해당 버전 또는 최신 버전을 사용해야 한다. 자체 pause + 인프라 컨테이너를 빌드하려면 + [wincat](https://github.com/kubernetes-sigs/sig-windows-tools/tree/master/cmd/wincat)을 포함해야 한다. + +* 내 윈도우 서버 노드가 프록시 뒤에 있기 때문에 내 쿠버네티스 + 설치가 실패한다. + + 프록시 뒤에 있는 경우 다음 PowerShell 환경 변수를 + 정의해야 한다. + + ```PowerShell + [Environment]::SetEnvironmentVariable("HTTP_PROXY", "http://proxy.example.com:80/", [EnvironmentVariableTarget]::Machine) + [Environment]::SetEnvironmentVariable("HTTPS_PROXY", "http://proxy.example.com:443/", [EnvironmentVariableTarget]::Machine) + ``` + +* `pause` 컨테이너란 무엇인가? + + 쿠버네티스 파드에서는 컨테이너 엔드포인트를 호스팅하기 위해 + 먼저 인프라 또는 "pause" 컨테이너가 생성된다. 인프라 및 워커 컨테이너를 포함하여 + 동일한 파드에 속하는 컨테이너는 공통 네트워크 네임스페이스 및 + 엔드포인트(동일한 IP 및 포트 공간)를 공유한다. 네트워크 구성을 잃지 않고 + 워커 컨테이너가 충돌하거나 다시 시작되도록 하려면 pause 컨테이너가 + 필요하다. + + "pause" (인프라) 이미지는 Microsoft Container Registry(MCR)에서 + 호스팅된다. `mcr.microsoft.com/oss/kubernetes/pause:1.4.1`을 사용하여 접근할 수 있다. + 자세한 내용은 + [DOCKERFILE](https://github.com/kubernetes-sigs/windows-testing/blob/master/images/pause/Dockerfile)을 참고한다. ### 추가 조사 -이러한 단계로 문제가 해결되지 않으면, 다음을 통해 쿠버네티스의 윈도우 노드에서 윈도우 컨테이너를 실행하는데 도움을 받을 수 있다. +이러한 단계로 문제가 해결되지 않으면, 다음을 통해 쿠버네티스의 윈도우 노드에서 +윈도우 컨테이너를 실행하는데 도움을 받을 수 있다. * 스택오버플로우 [윈도우 서버 컨테이너](https://stackoverflow.com/questions/tagged/windows-server-container) 주제 + * 쿠버네티스 공식 포럼 [discuss.kubernetes.io](https://discuss.kubernetes.io/) + * 쿠버네티스 슬랙 [#SIG-Windows Channel](https://kubernetes.slack.com/messages/sig-windows) ## 이슈 리포팅 및 기능 요청 -버그처럼 보이는 부분이 있거나 기능 요청을 하고 싶다면, [GitHub 이슈 트래킹 시스템](https://github.com/kubernetes/kubernetes/issues)을 활용한다. [GitHub](https://github.com/kubernetes/kubernetes/issues/new/choose)에서 이슈를 열고 SIG-Windows에 할당할 수 있다. 먼저 이전에 보고된 이슈 목록을 검색하고 이슈에 대한 경험을 언급하고 추가 로그를 첨부해야 한다. SIG-Windows 슬랙은 티켓을 만들기 전에 초기 지원 및 트러블슈팅 아이디어를 얻을 수 있는 좋은 방법이기도 하다. +버그처럼 보이는 부분이 있거나 기능 +요청을 하고 싶다면, +[GitHub 이슈 트래킹 시스템](https://github.com/kubernetes/kubernetes/issues)을 +활용한다. +[GitHub](https://github.com/kubernetes/kubernetes/issues/new/choose)에서 이슈를 열고 +SIG-Windows에 할당할 수 있다. 먼저 이전에 보고된 이슈 목록을 검색하고 +이슈에 대한 경험을 언급하고 추가 로그를 +첨부해야 한다. SIG-Windows 슬랙은 티켓을 만들기 전에 초기 지원 및 +트러블슈팅 아이디어를 얻을 수 있는 좋은 방법이기도 하다. -버그를 제출하는 경우, 다음과 같이 문제를 재현하는 방법에 대한 자세한 정보를 포함한다. +버그를 제출하는 경우, 다음과 같이 문제를 재현하는 방법에 대한 자세한 정보를 +포함한다. * 쿠버네티스 버전: kubectl version -* 환경 세부사항: 클라우드 공급자, OS 배포판, 네트워킹 선택 및 구성, 도커 버전 +* 환경 세부사항: 클라우드 공급자, OS 배포판, 네트워킹 선택 및 + 구성, 도커 버전 * 문제를 재현하기 위한 세부 단계 * [관련 로그](https://github.com/kubernetes/community/blob/master/sig-windows/CONTRIBUTING.md#gathering-logs) -* SIG-Windows 회원의 주의를 끌 수 있도록 `/sig windows`로 이슈에 대해 어노테이션을 달아 이슈에 sig/windows 태그를 지정한다. +* SIG-Windows 회원의 주의를 끌 수 있도록 `/sig windows`로 이슈에 대해 어노테이션을 달아 + 이슈에 sig/windows 태그를 지정한다. ## {{% heading "whatsnext" %}} -로드맵에는 많은 기능이 있다. 요약된 높은 수준의 목록이 아래에 포함되어 있지만, [로드맵 프로젝트](https://github.com/orgs/kubernetes/projects/8)를 보고 [기여](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/)하여 +윈도우 지원을 개선하는데 도움이 주는 것이 좋다. ### Hyper-V 격리(isolation) -쿠버네티스에서 윈도우 컨테이너에 대해 다음 유스케이스를 사용하려면 Hyper-V 격리가 필요하다. +쿠버네티스에서 윈도우 컨테이너에 대해 다음 유스케이스를 사용하려면 +Hyper-V 격리가 필요하다. * 추가 보안을 위해 파드 간 하이퍼바이저 기반 격리 -* 하위 호환성을 통해 컨테이너를 다시 빌드할 필요 없이 노드에서 최신 윈도우 서버 버전을 실행할 수 있다. + +* 하위 호환성을 통해 컨테이너를 다시 빌드할 필요 없이 노드에서 + 최신 윈도우 서버 버전을 실행할 수 있다. + * 파드에 대한 특정 CPU/NUMA 설정 + * 메모리 격리 및 예약 -Hyper-V 격리 지원은 이후 릴리스에 추가되며 CRI-Containerd가 필요하다. +Hyper-V 격리 지원은 이후 릴리스에 추가되며 +CRI-Containerd가 필요하다. ### kubeadm 및 클러스터 API를 사용한 배포 Kubeadm은 사용자가 쿠버네티스 클러스터를 배포하기 위한 사실상의 표준이 되고 있다. kubeadm의 윈도우 노드 지원은 현재 작업 중이지만 -[여기](/ko/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes/)에서 가이드를 사용할 수 있다. +[여기](/ko/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes/)에서 +가이드를 사용할 수 있다. 또한 윈도우 노드가 적절하게 프로비저닝되도록 클러스터 API에 투자하고 있다. From 5fba7a91da927366586c8ba91b3fd9a29cca8244 Mon Sep 17 00:00:00 2001 From: Dax McDonald <daxmc99@gmail.com> Date: Wed, 26 May 2021 16:41:01 -0700 Subject: [PATCH 173/221] Fix broken link --- .../concepts/scheduling-eviction/node-pressure-eviction.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/concepts/scheduling-eviction/node-pressure-eviction.md b/content/en/docs/concepts/scheduling-eviction/node-pressure-eviction.md index 1f1fcd9991..f2ae086783 100644 --- a/content/en/docs/concepts/scheduling-eviction/node-pressure-eviction.md +++ b/content/en/docs/concepts/scheduling-eviction/node-pressure-eviction.md @@ -16,7 +16,7 @@ During a node-pressure eviction, the kubelet sets the `PodPhase` for the selected pods to `Failed`. This terminates the pods. Node-pressure eviction is not the same as -[API-initiated eviction](/docs/concepts/scheduling-eviction/eviction/#api-eviction). +[API-initiated eviction](/docs/concepts/scheduling-eviction/api-eviction/). The kubelet does not respect your configured `PodDisruptionBudget` or the pod's `terminationGracePeriodSeconds`. If you use [soft eviction thresholds](#soft-eviction-thresholds), @@ -408,4 +408,4 @@ to estimate or measure an optimal memory limit value for that container. * Learn about [Pod Priority and Preemption](/docs/concepts/scheduling-eviction/pod-priority-preemption/) * Learn about [PodDisruptionBudgets](/docs/tasks/run-application/configure-pdb/) * Learn about [Quality of Service](/docs/tasks/configure-pod-container/quality-service-pod/) (QoS) -* Check out the [Eviction API](/docs/reference/generated/kubernetes-api/{{<param "version">}}/#create-eviction-pod-v1-core) \ No newline at end of file +* Check out the [Eviction API](/docs/reference/generated/kubernetes-api/{{<param "version">}}/#create-eviction-pod-v1-core) From dfe4b47bbe237ce264552a6e01ef76dfdd99ac6c Mon Sep 17 00:00:00 2001 From: c00522440 <chenchuntao@huawei.com> Date: Thu, 27 May 2021 11:38:59 +0800 Subject: [PATCH 174/221] fixHorizontalPodlink --- .../zh/docs/tasks/run-application/horizontal-pod-autoscale.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/zh/docs/tasks/run-application/horizontal-pod-autoscale.md b/content/zh/docs/tasks/run-application/horizontal-pod-autoscale.md index 4d4c8416c2..8c7fc01380 100644 --- a/content/zh/docs/tasks/run-application/horizontal-pod-autoscale.md +++ b/content/zh/docs/tasks/run-application/horizontal-pod-autoscale.md @@ -669,7 +669,7 @@ and [the walkthrough for using external metrics](/docs/tasks/run-application/hor ## Support for configurable scaling behavior Starting from -[v1.18](https://github.com/kubernetes/enhancements/blob/master/keps/sig-autoscaling/20190307-configurable-scale-velocity-for-hpa.md) +[v1.18](https://github.com/kubernetes/enhancements/blob/master/keps/sig-autoscaling/853-configurable-hpa-scale-velocity/README.md) the `v2beta2` API allows scaling behavior to be configured through the HPA `behavior` field. Behaviors are specified separately for scaling up and down in `scaleUp` or `scaleDown` section under the `behavior` field. A stabilization @@ -679,7 +679,7 @@ policies controls the rate of change of replicas while scaling. --> ## 支持可配置的扩缩 {#support-for-configurable-scaling-behaviour} -从 [v1.18](https://github.com/kubernetes/enhancements/blob/master/keps/sig-autoscaling/20190307-configurable-scale-velocity-for-hpa.md) +从 [v1.18](https://github.com/kubernetes/enhancements/blob/master/keps/sig-autoscaling/853-configurable-hpa-scale-velocity/README.md) 开始,`v2beta2` API 允许通过 HPA 的 `behavior` 字段配置扩缩行为。 在 `behavior` 字段中的 `scaleUp` 和 `scaleDown` 分别指定扩容和缩容行为。 可以两个方向指定一个稳定窗口,以防止扩缩目标中副本数量的波动。 From 1f822ba7c75f60b767cc24a9e82fe46a4f01cad1 Mon Sep 17 00:00:00 2001 From: c00522440 <chenchuntao@huawei.com> Date: Thu, 27 May 2021 15:37:36 +0800 Subject: [PATCH 175/221] translateExample delSpace --- .../managing-secret-using-kustomize.md | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/content/zh/docs/tasks/configmap-secret/managing-secret-using-kustomize.md b/content/zh/docs/tasks/configmap-secret/managing-secret-using-kustomize.md index d1a17280ed..4021ca7145 100644 --- a/content/zh/docs/tasks/configmap-secret/managing-secret-using-kustomize.md +++ b/content/zh/docs/tasks/configmap-secret/managing-secret-using-kustomize.md @@ -68,7 +68,25 @@ secretGenerator: - password=1f2d1e2e67df ``` -<!-- Note that in both cases, you don't need to base64 encode the values. --> +<!-- +You can also define the `secretGenerator` in the `kustomization.yaml` +file by providing `.env` files. +For example, the following `kustomization.yaml` file pulls in data from +`.env.secret` file: +--> +你也可以使用 `.env` 文件在 `kustomization.yaml` 中定义 `secretGenerator`。 +例如:下面的 `kustomization.yaml` 文件从 `.env.secret` 文件获取数据。 + +```yaml +secretGenerator: +- name: db-user-pass + envs: + - .env.secret +``` + +<!-- +Note that in all cases, you don't need to base64 encode the values. +--> 注意,上面两种情况,你都不需要使用 base64 编码。 <!-- ## Create the Secret --> From 32a97a9989c14c7890551219877c956db6a172f0 Mon Sep 17 00:00:00 2001 From: Qiming Teng <tengqm@outlook.com> Date: Thu, 27 May 2021 19:11:39 +0800 Subject: [PATCH 176/221] [zh] Resync kube-controller-manager reference --- .../kube-controller-manager.md | 617 +++++++++++------- 1 file changed, 370 insertions(+), 247 deletions(-) diff --git a/content/zh/docs/reference/command-line-tools-reference/kube-controller-manager.md b/content/zh/docs/reference/command-line-tools-reference/kube-controller-manager.md index d81f940b5b..0e456cff71 100644 --- a/content/zh/docs/reference/command-line-tools-reference/kube-controller-manager.md +++ b/content/zh/docs/reference/command-line-tools-reference/kube-controller-manager.md @@ -2,8 +2,21 @@ title: kube-controller-manager content_type: tool-reference weight: 30 +auto_generated: true --- +<!-- +The file is auto-generated from the Go source code of the component using a generic +[generator](https://github.com/kubernetes-sigs/reference-docs/). To learn how +to generate the reference documentation, please read +[Contributing to the reference documentation](/docs/contribute/generate-ref-docs/). +To update the reference conent, please follow the +[Contributing upstream](/docs/contribute/generate-ref-docs/contribute-upstream/) +guide. You can file document formatting bugs against the +[reference-docs](https://github.com/kubernetes-sigs/reference-docs/) project. +--> + + ## {{% heading "synopsis" %}} <!-- @@ -41,9 +54,9 @@ kube-controller-manager [flags] <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- -If true, adds the file directory to the header +If true, adds the file directory to the header of the log messages --> -若为 true,将文件目录添加到头部。 +若为 true,将文件目录添加到日志消息的头部。 </td> </tr> @@ -59,6 +72,23 @@ Should CIDRs for Pods be allocated and set on the cloud provider. </td> </tr> +<tr> +<td colspan="2">--allow-metric-labels stringToString     <!--Default:-->默认值:""</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p> +<p> +<!-- +The map from metric-label to value allow-list of this label. The key's format is <MetricName>,<LabelName>. The value's format is <allowed_value>,<allowed_value>...e.g. metric1,label1='v1,v2,v3', metric1,label2='v1,v2,v3' metric2,label1='v1,v2,v3'. +--> +从度量值标签到准许值列表的映射。键名的格式为<MetricName>,<LabelName>。 +准许值的格式为<allowed_value>,<allowed_value>...。 +例如,<code>metric1,label1='v1,v2,v3', metric1,label2='v1,v2,v3' +metric2,label='v1,v2,v3'</code>。 +</p> +</td> +</tr> + <tr> <td colspan="2">--alsologtostderr</td> </tr> @@ -138,7 +168,7 @@ If true, failures to look up missing authentication configuration from the clust </tr> <tr> -<td colspan="2">--authorization-always-allow-paths stringSlice     <!--Default:-->默认值:[/healthz]</td> +<td colspan="2">--authorization-always-allow-paths strings     <!--Default:-->默认值:"/healthz,/readyz,/livez"</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -209,9 +239,10 @@ Path to the file containing Azure container registry configuration information. <!-- The IP address on which to listen for the --secure-port port. The associated interface(s) must be reachable by the rest of the cluster, and by CLI/web clients. If blank or an unspecified address (0.0.0.0 or ::), all interfaces will be used. --> -针对 --secure-port 端口上请求执行监听操作的 IP 地址。 +针对 <code>--secure-port</code> 端口上请求执行监听操作的 IP 地址。 所对应的网络接口必须从集群中其它位置可访问(含命令行及 Web 客户端)。 -如果此值为空或者设定为非特定地址(0.0.0.0 或 ::),意味着所有网络接口都在监听范围。 +如果此值为空或者设定为非特定地址(<code>0.0.0.0</code> 或 <code>::</code>), +意味着所有网络接口都在监听范围。 </td> </tr> @@ -223,7 +254,8 @@ The IP address on which to listen for the --secure-port port. The associated int <!-- The directory where the TLS certs are located. If --tls-cert-file and --tls-private-key-file are provided, this flag will be ignored. --> -TLS 证书所在的目录。如果提供了 --tls-cert-file 和 --tls-private-key-file,此标志会被忽略。 +TLS 证书所在的目录。如果提供了 <code>--tls-cert-file</code> 和 +<code>--tls-private-key-file</code>,此标志会被忽略。 </td> </tr> @@ -248,8 +280,8 @@ Type of CIDR allocator to use If set, any request presenting a client certificate signed by one of the authorities in the client-ca-file is authenticated with an identity corresponding to the CommonName of the client certificate. --> 如果设置了此标志,对于所有能够提供客户端证书的请求,若该证书由 -client-ca-file 中所给机构之一签署,则该请求会被成功认证为客户端证书中 -CommonName 所给的实体。 +<code>--client-ca-file</code> 中所给机构之一签署,则该请求会被 +成功认证为客户端证书中 CommonName 所标识的实体。 </td> </tr> @@ -285,7 +317,7 @@ The provider for cloud services. Empty string for no provider. <!-- CIDR Range for Pods in cluster. Requires --allocate-node-cidrs to be true --> -集群中 Pods 的 CIDR 范围。要求 --allocate-node-cidrs 标志为 true。 +集群中 Pods 的 CIDR 范围。要求 <code>--allocate-node-cidrs</code> 标志为 true。 </td> </tr> @@ -302,7 +334,7 @@ The instance prefix for the cluster. </tr> <tr> -<td colspan="2">--cluster-signing-cert-file string     <!--Default:-->默认值:"/etc/kubernetes/ca/ca.pem"</td> +<td colspan="2">--cluster-signing-cert-file string</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -327,14 +359,16 @@ The length of duration signed certificates will be given. </tr> <tr> -<td colspan="2">--cluster-signing-key-file string     <!--Default:-->默认值:"/etc/kubernetes/ca/ca.key"</td> +<td colspan="2">--cluster-signing-key-file string</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- -Filename containing a PEM-encoded RSA or ECDSA private key used to sign cluster-scoped certificates +Filename containing a PEM-encoded RSA or ECDSA private key used to sign cluster-scoped certificates. +If specified, no more specific --cluster-signing-* flag may be specified. --> 包含 PEM 编码的 RSA 或 ECDSA 私钥的文件名。该私钥用来对集群范围证书签名。 +若指定了此选项,则不可再设置 <code>--cluster-signing-*</code> 参数。 </td> </tr> @@ -501,6 +535,19 @@ The number of namespace objects that are allowed to sync concurrently. Larger nu </td> </tr> +<tr> +<td colspan="2">--concurrent-rc-syncs int32     <!--Default:-->默认值:5</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p> +<!-- +The number of replication controllers that are allowed to sync concurrently. Larger number = more responsive replica management, but more CPU (and network) load +--> +可以并发同步的副本控制器对象个数。较大的数值意味着更快的副本管理操作, +不过也意味着更多的 CPU (和网络)占用。 +</p></td> +</tr> + <tr> <td colspan="2">--concurrent-replicaset-syncs int32     <!--Default:-->默认值:5</td> </tr> @@ -591,19 +638,6 @@ The number of TTL-after-finished controller workers that are allowed to sync con </td> </tr> -<tr> -<td colspan="2">--concurrent_rc_syncs int32     <!--Default:-->默认值:5</td> -</tr> -<tr> -<td></td><td style="line-height: 130%; word-wrap: break-word;"> -<!-- -The number of replication controllers that are allowed to sync concurrently. Larger number = more responsive replica management, but more CPU (and network) load ---> -可以并发同步的 ReplicationController 对象个数。数值越大,副本管理的响应速度越快, -不过对 CPU (和网络)的占用也越高。 -</td> -</tr> - <tr> <td colspan="2">--configure-cloud-routes     <!--Default:-->默认值:true</td> </tr> @@ -612,7 +646,7 @@ The number of replication controllers that are allowed to sync concurrently. Lar <!-- Should CIDRs allocated by allocate-node-cidrs be configured on the cloud provider. --> -决定是否由 --allocate-node-cidrs 所分配的 CIDR 要通过云驱动程序来配置。 +决定是否由 <code>--allocate-node-cidrs</code> 所分配的 CIDR 要通过云驱动程序来配置。 </td> </tr> @@ -641,14 +675,15 @@ Interval between starting controller managers. </tr> <tr> -<td colspan="2">--controllers stringSlice     <!--Default:-->默认值:<code>[*]</code></td> +<td colspan="2">--controllers strings     <!--Default:-->默认值:<code>[*]</code></td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- A list of controllers to enable. '*' enables all on-by-default controllers, 'foo' enables the controller named 'foo', '-foo' disables the controller named 'foo'.<br/>All controllers: attachdetach, bootstrapsigner, cloud-node-lifecycle, clusterrole-aggregation, cronjob, csrapproving, csrcleaner, csrsigning, daemonset, deployment, disruption, endpoint, endpointslice, endpointslicemirroring, ephemeral-volume, garbagecollector, horizontalpodautoscaling, job, namespace, nodeipam, nodelifecycle, persistentvolume-binder, persistentvolume-expander, podgc, pv-protection, pvc-protection, replicaset, replicationcontroller, resourcequota, root-ca-cert-publisher, route, service, serviceaccount, serviceaccount-token, statefulset, tokencleaner, ttl, ttl-after-finished<br/>Disabled-by-default controllers: bootstrapsigner, tokencleaner --> -要启用的控制器列表。<code>*</code> 表示启用所有默认启用的控制器;<code>foo</code> 启用名为 foo 的控制器; +要启用的控制器列表。<code>\*</code> 表示启用所有默认启用的控制器; +<code>foo</code> 启用名为 foo 的控制器; <code>-foo</code> 表示禁用名为 foo 的控制器。<br/> 控制器的全集:attachdetach、bootstrapsigner、cloud-node-lifecycle、clusterrole-aggregation、cronjob、csrapproving、csrcleaner、csrsigning、daemonset、deployment、disruption、endpoint、endpointslice、endpointslicemirroring、ephemeral-volume、garbagecollector、horizontalpodautoscaling、job、namespace、nodeipam、nodelifecycle、persistentvolume-binder、persistentvolume-expander、podgc、pv-protection、pvc-protection、replicaset、replicationcontroller、resourcequota、root-ca-cert-publisher、route、service、serviceaccount、serviceaccount-token、statefulset、tokencleaner、ttl、ttl-after-finished<br/> 默认禁用的控制器有:bootstrapsigner 和 tokencleaner。</td> @@ -674,10 +709,26 @@ Deployment 资源的同步周期。 <!-- Disable volume attach detach reconciler sync. Disabling this may cause volumes to be mismatched with pods. Use wisely. --> -禁用卷挂接/解挂调节器的同步。禁用此同步可能导致卷存储与 Pod 之间出现错位。请小心使用。 +禁用卷挂接/解挂调节器的同步。禁用此同步可能导致卷存储与 Pod 之间出现错位。 +请小心使用。 </td> </tr> +<tr> +<td colspan="2">--disabled-metrics strings</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p> +<!-- +This flag provides an escape hatch for misbehaving metrics. You must provide the fully qualified metric name in order to disable it. Disclaimer: disabling metrics is higher in precedence than showing hidden metrics. +--> +此标志提供对行为异常的度量值的防控措施。你必须提供度量值的 +完全限定名称才能将其禁用。<B>声明</B>:禁用度量值的操作比显示隐藏度量值 +的操作优先级高。 +</p></td> +</tr> + + <tr> <td colspan="2">--enable-dynamic-provisioning     <!--Default:-->默认值:true</td> </tr> @@ -716,6 +767,19 @@ Enable HostPath PV provisioning when running without a cloud provider. This allo </td> </tr> +<tr> +<td colspan="2">--enable-leader-migration</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p> +<!-- +Whether to enable controller leader migration. +--> +此标志决定是否启用控制器领导者迁移。 +</p></td> +</tr> + + <tr> <td colspan="2">--enable-taint-manager     <!--Default:-->默认值:true</td> </tr> @@ -785,192 +849,208 @@ The plugin to use when cloud provider is set to external. Can be empty, should o </tr> <tr> -<td colspan="2">--feature-gates mapStringBool</td> +<td colspan="2">--feature-gates <<!--comma-separated 'key=True|False' pairs-->逗号分隔的 'key=True|False' 对列表></td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> +<p> <!-- -A set of key=value pairs that describe feature gates for alpha/experimental features. Options are: -<br/>APIListChunking=true|false (BETA - default=true) -<br/>APIPriorityAndFairness=true|false (BETA - default=true) -<br/>APIResponseCompression=true|false (BETA - default=true) -<br/>APIServerIdentity=true|false (ALPHA - default=false) -<br/>AllAlpha=true|false (ALPHA - default=false) -<br/>AllBeta=true|false (BETA - default=false) -<br/>AllowInsecureBackendProxy=true|false (BETA - default=true) -<br/>AnyVolumeDataSource=true|false (ALPHA - default=false) -<br/>AppArmor=true|false (BETA - default=true) -<br/>BalanceAttachedNodeVolumes=true|false (ALPHA - default=false) -<br/>BoundServiceAccountTokenVolume=true|false (ALPHA - default=false) -<br/>CPUManager=true|false (BETA - default=true) -<br/>CRIContainerLogRotation=true|false (BETA - default=true) -<br/>CSIInlineVolume=true|false (BETA - default=true) -<br/>CSIMigration=true|false (BETA - default=true) -<br/>CSIMigrationAWS=true|false (BETA - default=false) -<br/>CSIMigrationAWSComplete=true|false (ALPHA - default=false) -<br/>CSIMigrationAzureDisk=true|false (BETA - default=false) -<br/>CSIMigrationAzureDiskComplete=true|false (ALPHA - default=false) -<br/>CSIMigrationAzureFile=true|false (ALPHA - default=false) -<br/>CSIMigrationAzureFileComplete=true|false (ALPHA - default=false) -<br/>CSIMigrationGCE=true|false (BETA - default=false) -<br/>CSIMigrationGCEComplete=true|false (ALPHA - default=false) -<br/>CSIMigrationOpenStack=true|false (BETA - default=false) -<br/>CSIMigrationOpenStackComplete=true|false (ALPHA - default=false) -<br/>CSIMigrationvSphere=true|false (BETA - default=false) -<br/>CSIMigrationvSphereComplete=true|false (BETA - default=false) -<br/>CSIServiceAccountToken=true|false (ALPHA - default=false) -<br/>CSIStorageCapacity=true|false (ALPHA - default=false) -<br/>CSIVolumeFSGroupPolicy=true|false (BETA - default=true) -<br/>ConfigurableFSGroupPolicy=true|false (BETA - default=true) -<br/>CronJobControllerV2=true|false (ALPHA - default=false) -<br/>CustomCPUCFSQuotaPeriod=true|false (ALPHA - default=false) -<br/>DefaultPodTopologySpread=true|false (BETA - default=true) -<br/>DevicePlugins=true|false (BETA - default=true) -<br/>DisableAcceleratorUsageMetrics=true|false (BETA - default=true) -<br/>DownwardAPIHugePages=true|false (ALPHA - default=false) -<br/>DynamicKubeletConfig=true|false (BETA - default=true) -<br/>EfficientWatchResumption=true|false (ALPHA - default=false) -<br/>EndpointSlice=true|false (BETA - default=true) -<br/>EndpointSliceNodeName=true|false (ALPHA - default=false) -<br/>EndpointSliceProxying=true|false (BETA - default=true) -<br/>EndpointSliceTerminatingCondition=true|false (ALPHA - default=false) -<br/>EphemeralContainers=true|false (ALPHA - default=false) -<br/>ExpandCSIVolumes=true|false (BETA - default=true) -<br/>ExpandInUsePersistentVolumes=true|false (BETA - default=true) -<br/>ExpandPersistentVolumes=true|false (BETA - default=true) -<br/>ExperimentalHostUserNamespaceDefaulting=true|false (BETA - default=false) -<br/>GenericEphemeralVolume=true|false (ALPHA - default=false) -<br/>GracefulNodeShutdown=true|false (ALPHA - default=false) -<br/>HPAContainerMetrics=true|false (ALPHA - default=false) -<br/>HPAScaleToZero=true|false (ALPHA - default=false) -<br/>HugePageStorageMediumSize=true|false (BETA - default=true) -<br/>IPv6DualStack=true|false (ALPHA - default=false) -<br/>ImmutableEphemeralVolumes=true|false (BETA - default=true) -<br/>KubeletCredentialProviders=true|false (ALPHA - default=false) -<br/>KubeletPodResources=true|false (BETA - default=true) -<br/>LegacyNodeRoleBehavior=true|false (BETA - default=true) -<br/>LocalStorageCapacityIsolation=true|false (BETA - default=true) -<br/>LocalStorageCapacityIsolationFSQuotaMonitoring=true|false (ALPHA - default=false) -<br/>MixedProtocolLBService=true|false (ALPHA - default=false) -<br/>NodeDisruptionExclusion=true|false (BETA - default=true) -<br/>NonPreemptingPriority=true|false (BETA - default=true) -<br/>PodDisruptionBudget=true|false (BETA - default=true) -<br/>PodOverhead=true|false (BETA - default=true) -<br/>ProcMountType=true|false (ALPHA - default=false) -<br/>QOSReserved=true|false (ALPHA - default=false) -<br/>RemainingItemCount=true|false (BETA - default=true) -<br/>RemoveSelfLink=true|false (BETA- default=true) -<br/>RootCAConfigMap=true|false (BETA - default=true) -<br/>RotateKubeletServerCertificate=true|false (BETA - default=true) -<br/>RunAsGroup=true|false (BETA - default=true) -<br/>ServerSideApply=true|false (BETA - default=true) -<br/>ServiceAccountIssuerDiscovery=true|false (BETA - default=true) -<br/>ServiceLBNodePortControl=true|false (ALPHA - default=false) -<br/>ServiceNodeExclusion=true|false (BETA - default=true) -<br/>ServiceTopology=true|false (ALPHA - default=false) -<br/>SetHostnameAsFQDN=true|false (BETA - default=true) -<br/>SizeMemoryBackedVolumes=true|false (ALPHA - default=false) -<br/>StorageVersionAPI=true|false (ALPHA - default=false) -<br/>StorageVersionHash=true|false (BETA - default=true) -<br/>Sysctls=true|false (BETA - default=true) -<br/>TTLAfterFinished=true|false (ALPHA - default=false) -<br/>TopologyManager=true|false (BETA - default=true) -<br/>ValidateProxyRedirects=true|false (BETA - default=true) -<br/>WarningHeaders=true|false (BETA - default=true) -<br/>WinDSR=true|false (ALPHA - default=false) -<br/>WinOverlay=true|false (BETA - default=true) -<br/>WindowsEndpointSliceProxying=true|false (ALPHA - default=false) +A set of key=value pairs that describe feature gates for alpha/experimental features. Options are:<br/> +APIListChunking=true|false (BETA - default=true)<br/> +APIPriorityAndFairness=true|false (BETA - default=true)<br/> +APIResponseCompression=true|false (BETA - default=true)<br/> +APIServerIdentity=true|false (ALPHA - default=false)<br/> +AllAlpha=true|false (ALPHA - default=false)<br/> +AllBeta=true|false (BETA - default=false)<br/> +AnyVolumeDataSource=true|false (ALPHA - default=false)<br/> +AppArmor=true|false (BETA - default=true)<br/> +BalanceAttachedNodeVolumes=true|false (ALPHA - default=false)<br/> +BoundServiceAccountTokenVolume=true|false (BETA - default=true)<br/> +CPUManager=true|false (BETA - default=true)<br/> +CSIInlineVolume=true|false (BETA - default=true)<br/> +CSIMigration=true|false (BETA - default=true)<br/> +CSIMigrationAWS=true|false (BETA - default=false)<br/> +CSIMigrationAzureDisk=true|false (BETA - default=false)<br/> +CSIMigrationAzureFile=true|false (BETA - default=false)<br/> +CSIMigrationGCE=true|false (BETA - default=false)<br/> +CSIMigrationOpenStack=true|false (BETA - default=true)<br/> +CSIMigrationvSphere=true|false (BETA - default=false)<br/> +CSIMigrationvSphereComplete=true|false (BETA - default=false)<br/> +CSIServiceAccountToken=true|false (BETA - default=true)<br/> +CSIStorageCapacity=true|false (BETA - default=true)<br/> +CSIVolumeFSGroupPolicy=true|false (BETA - default=true)<br/> +CSIVolumeHealth=true|false (ALPHA - default=false)<br/> +ConfigurableFSGroupPolicy=true|false (BETA - default=true)<br/> +ControllerManagerLeaderMigration=true|false (ALPHA - default=false)<br/> +CronJobControllerV2=true|false (BETA - default=true)<br/> +CustomCPUCFSQuotaPeriod=true|false (ALPHA - default=false)<br/> +DaemonSetUpdateSurge=true|false (ALPHA - default=false)<br/> +DefaultPodTopologySpread=true|false (BETA - default=true)<br/> +DevicePlugins=true|false (BETA - default=true)<br/> +DisableAcceleratorUsageMetrics=true|false (BETA - default=true)<br/> +DownwardAPIHugePages=true|false (BETA - default=false)<br/> +DynamicKubeletConfig=true|false (BETA - default=true)<br/> +EfficientWatchResumption=true|false (BETA - default=true)<br/> +EndpointSliceProxying=true|false (BETA - default=true)<br/> +EndpointSliceTerminatingCondition=true|false (ALPHA - default=false)<br/> +EphemeralContainers=true|false (ALPHA - default=false)<br/> +ExpandCSIVolumes=true|false (BETA - default=true)<br/> +ExpandInUsePersistentVolumes=true|false (BETA - default=true)<br/> +ExpandPersistentVolumes=true|false (BETA - default=true)<br/> +ExperimentalHostUserNamespaceDefaulting=true|false (BETA - default=false)<br/> +GenericEphemeralVolume=true|false (BETA - default=true)<br/> +GracefulNodeShutdown=true|false (BETA - default=true)<br/> +HPAContainerMetrics=true|false (ALPHA - default=false)<br/> +HPAScaleToZero=true|false (ALPHA - default=false)<br/> +HugePageStorageMediumSize=true|false (BETA - default=true)<br/> +IPv6DualStack=true|false (BETA - default=true)<br/> +InTreePluginAWSUnregister=true|false (ALPHA - default=false)<br/> +InTreePluginAzureDiskUnregister=true|false (ALPHA - default=false)<br/> +InTreePluginAzureFileUnregister=true|false (ALPHA - default=false)<br/> +InTreePluginGCEUnregister=true|false (ALPHA - default=false)<br/> +InTreePluginOpenStackUnregister=true|false (ALPHA - default=false)<br/> +InTreePluginvSphereUnregister=true|false (ALPHA - default=false)<br/> +IndexedJob=true|false (ALPHA - default=false)<br/> +IngressClassNamespacedParams=true|false (ALPHA - default=false)<br/> +KubeletCredentialProviders=true|false (ALPHA - default=false)<br/> +KubeletPodResources=true|false (BETA - default=true)<br/> +KubeletPodResourcesGetAllocatable=true|false (ALPHA - default=false)<br/> +LocalStorageCapacityIsolation=true|false (BETA - default=true)<br/> +LocalStorageCapacityIsolationFSQuotaMonitoring=true|false (ALPHA - default=false)<br/> +LogarithmicScaleDown=true|false (ALPHA - default=false)<br/> +MemoryManager=true|false (ALPHA - default=false)<br/> +MixedProtocolLBService=true|false (ALPHA - default=false)<br/> +NamespaceDefaultLabelName=true|false (BETA - default=true)<br/> +NetworkPolicyEndPort=true|false (ALPHA - default=false)<br/> +NonPreemptingPriority=true|false (BETA - default=true)<br/> +PodAffinityNamespaceSelector=true|false (ALPHA - default=false)<br/> +PodDeletionCost=true|false (ALPHA - default=false)<br/> +PodOverhead=true|false (BETA - default=true)<br/> +PreferNominatedNode=true|false (ALPHA - default=false)<br/> +ProbeTerminationGracePeriod=true|false (ALPHA - default=false)<br/> +ProcMountType=true|false (ALPHA - default=false)<br/> +QOSReserved=true|false (ALPHA - default=false)<br/> +RemainingItemCount=true|false (BETA - default=true)<br/> +RemoveSelfLink=true|false (BETA - default=true)<br/> +RotateKubeletServerCertificate=true|false (BETA - default=true)<br/> +ServerSideApply=true|false (BETA - default=true)<br/> +ServiceInternalTrafficPolicy=true|false (ALPHA - default=false)<br/> +ServiceLBNodePortControl=true|false (ALPHA - default=false)<br/> +ServiceLoadBalancerClass=true|false (ALPHA - default=false)<br/> +ServiceTopology=true|false (ALPHA - default=false)<br/> +SetHostnameAsFQDN=true|false (BETA - default=true)<br/> +SizeMemoryBackedVolumes=true|false (ALPHA - default=false)<br/> +StorageVersionAPI=true|false (ALPHA - default=false)<br/> +StorageVersionHash=true|false (BETA - default=true)<br/> +SuspendJob=true|false (ALPHA - default=false)<br/> +TTLAfterFinished=true|false (BETA - default=true)<br/> +TopologyAwareHints=true|false (ALPHA - default=false)<br/> +TopologyManager=true|false (BETA - default=true)<br/> +ValidateProxyRedirects=true|false (BETA - default=true)<br/> +VolumeCapacityPriority=true|false (ALPHA - default=false)<br/> +WarningHeaders=true|false (BETA - default=true)<br/> +WinDSR=true|false (ALPHA - default=false)<br/> +WinOverlay=true|false (BETA - default=true)<br/> +WindowsEndpointSliceProxying=true|false (BETA - default=true) --> 一组 key=value 对,用来描述测试性/试验性功能的特性门控(Feature Gate)。可选项有: -<br/>APIListChunking=true|false (BETA - 默认值=true) -<br/>APIPriorityAndFairness=true|false (BETA - 默认值=true) -<br/>APIResponseCompression=true|false (BETA - 默认值=true) -<br/>APIServerIdentity=true|false (ALPHA - 默认值=false) -<br/>AllAlpha=true|false (ALPHA - 默认值=false) -<br/>AllBeta=true|false (BETA - 默认值=false) -<br/>AllowInsecureBackendProxy=true|false (BETA - 默认值=true) -<br/>AnyVolumeDataSource=true|false (ALPHA - 默认值=false) -<br/>AppArmor=true|false (BETA - 默认值=true) -<br/>BalanceAttachedNodeVolumes=true|false (ALPHA - 默认值=false) -<br/>BoundServiceAccountTokenVolume=true|false (ALPHA - 默认值=false) -<br/>CPUManager=true|false (BETA - 默认值=true) -<br/>CRIContainerLogRotation=true|false (BETA - 默认值=true) -<br/>CSIInlineVolume=true|false (BETA - 默认值=true) -<br/>CSIMigration=true|false (BETA - 默认值=true) -<br/>CSIMigrationAWS=true|false (BETA - 默认值=false) -<br/>CSIMigrationAWSComplete=true|false (ALPHA - 默认值=false) -<br/>CSIMigrationAzureDisk=true|false (BETA - 默认值=false) -<br/>CSIMigrationAzureDiskComplete=true|false (ALPHA - 默认值=false) -<br/>CSIMigrationAzureFile=true|false (ALPHA - 默认值=false) -<br/>CSIMigrationAzureFileComplete=true|false (ALPHA - 默认值=false) -<br/>CSIMigrationGCE=true|false (BETA - 默认值=false) -<br/>CSIMigrationGCEComplete=true|false (ALPHA - 默认值=false) -<br/>CSIMigrationOpenStack=true|false (BETA - 默认值=false) -<br/>CSIMigrationOpenStackComplete=true|false (ALPHA - 默认值=false) -<br/>CSIMigrationvSphere=true|false (BETA - 默认值=false) -<br/>CSIMigrationvSphereComplete=true|false (BETA - 默认值=false) -<br/>CSIServiceAccountToken=true|false (ALPHA - 默认值=false) -<br/>CSIStorageCapacity=true|false (ALPHA - 默认值=false) -<br/>CSIVolumeFSGroupPolicy=true|false (BETA - 默认值=true) -<br/>ConfigurableFSGroupPolicy=true|false (BETA - 默认值=true) -<br/>CronJobControllerV2=true|false (ALPHA - 默认值=false) -<br/>CustomCPUCFSQuotaPeriod=true|false (ALPHA - 默认值=false) -<br/>DefaultPodTopologySpread=true|false (BETA - 默认值=true) -<br/>DevicePlugins=true|false (BETA - 默认值=true) -<br/>DisableAcceleratorUsageMetrics=true|false (BETA - 默认值=true) -<br/>DownwardAPIHugePages=true|false (ALPHA - 默认值=false) -<br/>DynamicKubeletConfig=true|false (BETA - 默认值=true) -<br/>EfficientWatchResumption=true|false (ALPHA - 默认值=false) -<br/>EndpointSlice=true|false (BETA - 默认值=true) -<br/>EndpointSliceNodeName=true|false (ALPHA - 默认值=false) -<br/>EndpointSliceProxying=true|false (BETA - 默认值=true) -<br/>EndpointSliceTerminatingCondition=true|false (ALPHA - 默认值=false) -<br/>EphemeralContainers=true|false (ALPHA - 默认值=false) -<br/>ExpandCSIVolumes=true|false (BETA - 默认值=true) -<br/>ExpandInUsePersistentVolumes=true|false (BETA - 默认值=true) -<br/>ExpandPersistentVolumes=true|false (BETA - 默认值=true) -<br/>ExperimentalHostUserNamespaceDefaulting=true|false (BETA - 默认值=false) -<br/>GenericEphemeralVolume=true|false (ALPHA - 默认值=false) -<br/>GracefulNodeShutdown=true|false (ALPHA - 默认值=false) -<br/>HPAContainerMetrics=true|false (ALPHA - 默认值=false) -<br/>HPAScaleToZero=true|false (ALPHA - 默认值=false) -<br/>HugePageStorageMediumSize=true|false (BETA - 默认值=true) -<br/>IPv6DualStack=true|false (ALPHA - 默认值=false) -<br/>ImmutableEphemeralVolumes=true|false (BETA - 默认值=true) -<br/>KubeletCredentialProviders=true|false (ALPHA - 默认值=false) -<br/>KubeletPodResources=true|false (BETA - 默认值=true) -<br/>LegacyNodeRoleBehavior=true|false (BETA - 默认值=true) -<br/>LocalStorageCapacityIsolation=true|false (BETA - 默认值=true) -<br/>LocalStorageCapacityIsolationFSQuotaMonitoring=true|false (ALPHA - 默认值=false) -<br/>MixedProtocolLBService=true|false (ALPHA - 默认值=false) -<br/>NodeDisruptionExclusion=true|false (BETA - 默认值=true) -<br/>NonPreemptingPriority=true|false (BETA - 默认值=true) -<br/>PodDisruptionBudget=true|false (BETA - 默认值=true) -<br/>PodOverhead=true|false (BETA - 默认值=true) -<br/>ProcMountType=true|false (ALPHA - 默认值=false) -<br/>QOSReserved=true|false (ALPHA - 默认值=false) -<br/>RemainingItemCount=true|false (BETA - 默认值=true) -<br/>RemoveSelfLink=true|false (BETA - 默认值=true) -<br/>RootCAConfigMap=true|false (BETA - 默认值=true) -<br/>RotateKubeletServerCertificate=true|false (BETA - 默认值=true) -<br/>RunAsGroup=true|false (BETA - 默认值=true) -<br/>ServerSideApply=true|false (BETA - 默认值=true) -<br/>ServiceAccountIssuerDiscovery=true|false (BETA - 默认值=true) -<br/>ServiceLBNodePortControl=true|false (ALPHA - 默认值=false) -<br/>ServiceNodeExclusion=true|false (BETA - 默认值=true) -<br/>ServiceTopology=true|false (ALPHA - 默认值=false) -<br/>SetHostnameAsFQDN=true|false (BETA - 默认值=true) -<br/>SizeMemoryBackedVolumes=true|false (ALPHA - 默认值=false) -<br/>StorageVersionAPI=true|false (ALPHA - 默认值=false) -<br/>StorageVersionHash=true|false (BETA - 默认值=true) -<br/>Sysctls=true|false (BETA - 默认值=true) -<br/>TTLAfterFinished=true|false (ALPHA - 默认值=false) -<br/>TopologyManager=true|false (BETA - 默认值=true) -<br/>ValidateProxyRedirects=true|false (BETA - 默认值=true) -<br/>WarningHeaders=true|false (BETA - 默认值=true) -<br/>WinDSR=true|false (ALPHA - 默认值=false) -<br/>WinOverlay=true|false (BETA - 默认值=true) -<br/>WindowsEndpointSliceProxying=true|false (ALPHA - 默认值=false) +APIListChunking=true|false (BETA - 默认值=true)<br/> +APIPriorityAndFairness=true|false (BETA - 默认值=true)<br/> +APIResponseCompression=true|false (BETA - 默认值=true)<br/> +APIServerIdentity=true|false (ALPHA - 默认值=false)<br/> +AllAlpha=true|false (ALPHA - 默认值=false)<br/> +AllBeta=true|false (BETA - 默认值=false)<br/> +AnyVolumeDataSource=true|false (ALPHA - 默认值=false)<br/> +AppArmor=true|false (BETA - 默认值=true)<br/> +BalanceAttachedNodeVolumes=true|false (ALPHA - 默认值=false)<br/> +BoundServiceAccountTokenVolume=true|false (BETA - 默认值=true)<br/> +CPUManager=true|false (BETA - 默认值=true)<br/> +CSIInlineVolume=true|false (BETA - 默认值=true)<br/> +CSIMigration=true|false (BETA - 默认值=true)<br/> +CSIMigrationAWS=true|false (BETA - 默认值=false)<br/> +CSIMigrationAzureDisk=true|false (BETA - 默认值=false)<br/> +CSIMigrationAzureFile=true|false (BETA - 默认值=false)<br/> +CSIMigrationGCE=true|false (BETA - 默认值=false)<br/> +CSIMigrationOpenStack=true|false (BETA - 默认值=true)<br/> +CSIMigrationvSphere=true|false (BETA - 默认值=false)<br/> +CSIMigrationvSphereComplete=true|false (BETA - 默认值=false)<br/> +CSIServiceAccountToken=true|false (BETA - 默认值=true)<br/> +CSIStorageCapacity=true|false (BETA - 默认值=true)<br/> +CSIVolumeFSGroupPolicy=true|false (BETA - 默认值=true)<br/> +CSIVolumeHealth=true|false (ALPHA - 默认值=false)<br/> +ConfigurableFSGroupPolicy=true|false (BETA - 默认值=true)<br/> +ControllerManagerLeaderMigration=true|false (ALPHA - 默认值=false)<br/> +CronJobControllerV2=true|false (BETA - 默认值=true)<br/> +CustomCPUCFSQuotaPeriod=true|false (ALPHA - 默认值=false)<br/> +DaemonSetUpdateSurge=true|false (ALPHA - 默认值=false)<br/> +DefaultPodTopologySpread=true|false (BETA - 默认值=true)<br/> +DevicePlugins=true|false (BETA - 默认值=true)<br/> +DisableAcceleratorUsageMetrics=true|false (BETA - 默认值=true)<br/> +DownwardAPIHugePages=true|false (BETA - 默认值=false)<br/> +DynamicKubeletConfig=true|false (BETA - 默认值=true)<br/> +EfficientWatchResumption=true|false (BETA - 默认值=true)<br/> +EndpointSliceProxying=true|false (BETA - 默认值=true)<br/> +EndpointSliceTerminatingCondition=true|false (ALPHA - 默认值=false)<br/> +EphemeralContainers=true|false (ALPHA - 默认值=false)<br/> +ExpandCSIVolumes=true|false (BETA - 默认值=true)<br/> +ExpandInUsePersistentVolumes=true|false (BETA - 默认值=true)<br/> +ExpandPersistentVolumes=true|false (BETA - 默认值=true)<br/> +ExperimentalHostUserNamespaceDefaulting=true|false (BETA - 默认值=false)<br/> +GenericEphemeralVolume=true|false (BETA - 默认值=true)<br/> +GracefulNodeShutdown=true|false (BETA - 默认值=true)<br/> +HPAContainerMetrics=true|false (ALPHA - 默认值=false)<br/> +HPAScaleToZero=true|false (ALPHA - 默认值=false)<br/> +HugePageStorageMediumSize=true|false (BETA - 默认值=true)<br/> +IPv6DualStack=true|false (BETA - 默认值=true)<br/> +InTreePluginAWSUnregister=true|false (ALPHA - 默认值=false)<br/> +InTreePluginAzureDiskUnregister=true|false (ALPHA - 默认值=false)<br/> +InTreePluginAzureFileUnregister=true|false (ALPHA - 默认值=false)<br/> +InTreePluginGCEUnregister=true|false (ALPHA - 默认值=false)<br/> +InTreePluginOpenStackUnregister=true|false (ALPHA - 默认值=false)<br/> +InTreePluginvSphereUnregister=true|false (ALPHA - 默认值=false)<br/> +IndexedJob=true|false (ALPHA - 默认值=false)<br/> +IngressClassNamespacedParams=true|false (ALPHA - 默认值=false)<br/> +KubeletCredentialProviders=true|false (ALPHA - 默认值=false)<br/> +KubeletPodResources=true|false (BETA - 默认值=true)<br/> +KubeletPodResourcesGetAllocatable=true|false (ALPHA - 默认值=false)<br/> +LocalStorageCapacityIsolation=true|false (BETA - 默认值=true)<br/> +LocalStorageCapacityIsolationFSQuotaMonitoring=true|false (ALPHA - 默认值=false)<br/> +LogarithmicScaleDown=true|false (ALPHA - 默认值=false)<br/> +MemoryManager=true|false (ALPHA - 默认值=false)<br/> +MixedProtocolLBService=true|false (ALPHA - 默认值=false)<br/> +NamespaceDefaultLabelName=true|false (BETA - 默认值=true)<br/> +NetworkPolicyEndPort=true|false (ALPHA - 默认值=false)<br/> +NonPreemptingPriority=true|false (BETA - 默认值=true)<br/> +PodAffinityNamespaceSelector=true|false (ALPHA - 默认值=false)<br/> +PodDeletionCost=true|false (ALPHA - 默认值=false)<br/> +PodOverhead=true|false (BETA - 默认值=true)<br/> +PreferNominatedNode=true|false (ALPHA - 默认值=false)<br/> +ProbeTerminationGracePeriod=true|false (ALPHA - 默认值=false)<br/> +ProcMountType=true|false (ALPHA - 默认值=false)<br/> +QOSReserved=true|false (ALPHA - 默认值=false)<br/> +RemainingItemCount=true|false (BETA - 默认值=true)<br/> +RemoveSelfLink=true|false (BETA - 默认值=true)<br/> +RotateKubeletServerCertificate=true|false (BETA - 默认值=true)<br/> +ServerSideApply=true|false (BETA - 默认值=true)<br/> +ServiceInternalTrafficPolicy=true|false (ALPHA - 默认值=false)<br/> +ServiceLBNodePortControl=true|false (ALPHA - 默认值=false)<br/> +ServiceLoadBalancerClass=true|false (ALPHA - 默认值=false)<br/> +ServiceTopology=true|false (ALPHA - 默认值=false)<br/> +SetHostnameAsFQDN=true|false (BETA - 默认值=true)<br/> +SizeMemoryBackedVolumes=true|false (ALPHA - 默认值=false)<br/> +StorageVersionAPI=true|false (ALPHA - 默认值=false)<br/> +StorageVersionHash=true|false (BETA - 默认值=true)<br/> +SuspendJob=true|false (ALPHA - 默认值=false)<br/> +TTLAfterFinished=true|false (BETA - 默认值=true)<br/> +TopologyAwareHints=true|false (ALPHA - 默认值=false)<br/> +TopologyManager=true|false (BETA - 默认值=true)<br/> +ValidateProxyRedirects=true|false (BETA - 默认值=true)<br/> +VolumeCapacityPriority=true|false (ALPHA - 默认值=false)<br/> +WarningHeaders=true|false (BETA - 默认值=true)<br/> +WinDSR=true|false (ALPHA - 默认值=false)<br/> +WinOverlay=true|false (BETA - 默认值=true)<br/> +WindowsEndpointSliceProxying=true|false (BETA - 默认值=true) +</p> </td> </tr> @@ -982,7 +1062,7 @@ A set of key=value pairs that describe feature gates for alpha/experimental feat <!-- Full path of the directory in which the flex volume plugin should search for additional third party volume plugins. --> -FlexVolume 插件要搜索第三方卷插件的目录路径。 +FlexVolume 插件要搜索第三方卷插件的目录路径全名。 </td> </tr> @@ -1018,7 +1098,8 @@ Pod 启动之后可以忽略 CPU 采样值的时长。 <!-- The period for which autoscaler will look backwards and not scale down below any recommendation it made during that period. --> -自动扩缩程序的回溯时长。自动扩缩器不会基于在给定的时长内所建议的规模对负载执行规模缩小的操作。 +自动扩缩程序的回溯时长。自动扩缩器不会基于在给定的时长内所建议的规模 +对负载执行规模缩小的操作。 </td> </tr> @@ -1054,7 +1135,8 @@ The period for syncing the number of pods in horizontal pod autoscaler. <!-- The minimum change (from 1.0) in the desired-to-actual metrics ratio for the horizontal pod autoscaler to consider scaling. --> -此值为目标值与实际值的比值与 1.0 的差值。只有超过此标志所设的阈值时,HPA 才会考虑执行缩放操作。 +此值为目标值与实际值的比值与 1.0 的差值。只有超过此标志所设的阈值时, +HPA 才会考虑执行缩放操作。 </td> </tr> @@ -1171,12 +1253,13 @@ The interval between attempts by the acting master to renew a leadership slot be --> 当前执行领导者角色的节点在被停止履行领导职责之前可多次尝试续约领导者身份; 此标志给出相邻两次尝试之间的间歇时长。 -此值必须小于或等于租期时长(Lease Duration)。仅在集群启用了领导者选举时有效。 +此值必须小于或等于租期时长(Lease Duration)。 +仅在集群启用了领导者选举时有效。 </td> </tr> <tr> -<td colspan="2">--leader-elect-resource-lock string     <!--Default:-->默认值:"endpointsleases"</td> +<td colspan="2">--leader-elect-resource-lock string     <!--Default:-->默认值:"leases"</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1220,10 +1303,27 @@ The namespace of resource object that is used for locking during leader election <!-- The duration the clients should wait between attempting acquisition and renewal of a leadership. This is only applicable if leader election is enabled. --> -尝试获得领导者身份时,客户端在相邻两次尝试之间要等待的时长。此标志仅在启用了领导者选举的集群中起作用。 +尝试获得领导者身份时,客户端在相邻两次尝试之间要等待的时长。 +此标志仅在启用了领导者选举的集群中起作用。 </td> </tr> +<tr> +<td colspan="2">--leader-migration-config string</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p> +<!-- +Path to the config file for controller leader migration, or empty to use the value that reflects default configuration of the controller manager. The config file should be of type LeaderMigrationConfiguration, group controllermanager.config.k8s.io, version v1alpha1. +--> +控制器领导者迁移所用的配置文件路径。 +此值为空意味着使用控制器管理器的默认配置。 +配置文件应该是 <code>controllermanager.config.k8s.io</code> 组、 +<code>v1alpha1</code> 版本的 <code>LeaderMigrationConfiguration</code> 结构。 +</p></td> +</tr> + + <tr> <td colspan="2">--log-backtrace-at traceLocation     <!--Default:-->默认值:<code>:0</code></td> </tr> @@ -1232,7 +1332,7 @@ The duration the clients should wait between attempting acquisition and renewal <!-- when logging hits line file:N, emit a stack trace --> -当执行到 file:N 所给的文件和代码行时,日志机制会生成一个调用栈快照。 +当执行到 <code>file:N</code> 所给的文件和代码行时,日志机制会生成一个调用栈快照。 </td> </tr> @@ -1294,8 +1394,13 @@ Maximum number of seconds between log flushes Sets the log format. Permitted formats: "json", "text".<br/>Non-default formats don't honor these flags: --add_dir_header, --alsologtostderr, --log_backtrace_at, --log_dir, --log_file, --log_file_max_size, --logtostderr, --one_output, --skip_headers, --skip_log_headers, --stderrthreshold, --vmodule, --log-flush-frequency.<br/>Non-default choices are currently alpha and subject to change without warning. --> 设置日志格式。允许的格式:"text","json"。 -<br/>非默认格式不支持以下标志:--add_dir_header、--alsologtostderr、--log_backtrace_at、--log_dir、--log_file、--log_file_max_size、--logtostderr、--one_output、--skip_headers、--skip_log_headers、--stderrthreshold、--vmodule、--log-flush-frequency。 -<br/>当前非默认选项为 Alpha,如有更改,恕不另行通知。 +<br/>非默认格式不支持以下标志:<code>--add-dir-header</code>、 +<code>--alsologtostderr</code>》、<code>--log-backtrace-at</code>、 +<code>--log-dir</code>、<code>--log-file</code>、<code>--log-file-max-size</code>、 +<code>--logtostderr</code>、<code>--one-output</code>、<code>--skip-headers</code>、 +<code>--skip-log-headers</code>、<code>--stderrthreshold</code>、 +<code>--vmodule</code>、<code>--log-flush-frequency</code>。 +<br/>当前非默认选项为 Alpha 阶段,如有更改,恕不另行通知。 </td> </tr> @@ -1384,11 +1489,10 @@ EndpointSlice 更改的处理将延迟此持续时间, <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- -The maximum number of endpoints that will be added to an EndpointSlice by the EndpointSliceMirroring controller. More endpoints per slice will result in less endpoint slices, but larger resources. Defaults to 100. +The maximum number of endpoints that will be added to an EndpointSlice by the EndpointSliceMirroring controller. More endpoints per slice will result in less endpoint slices, but larger resources. --> EndpointSliceMirroring 控制器将添加到 EndpointSlice 的最大端点数。 每个分片的端点越多,端点分片越少,但资源越大。 -默认为 100。 </td> </tr> @@ -1506,6 +1610,21 @@ If true, only write logs to their native severity level (vs also writing to each </td> </tr> +<tr> +<td colspan="2">--permit-address-sharing</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p> +<!-- +If true, SO_REUSEADDR will be used when binding the port. This allows binding to wildcard IPs like 0.0.0.0 and specific IPs in parallel, and it avoids waiting for the kernel to release sockets in TIME_WAIT state. +--> +如果此标志为 true,则在绑定端口时使用 <code>SO_REUSEADDR</code>。 +这就意味着可以同时绑定到 <code>0.0.0.0</code> 和特定的 IP 地址, +并且避免等待内核释放处于 <code>TIME_WAITE</code> 状态的套接字。 +</p></td> +</tr> + + <tr> <td colspan="2">--permit-port-sharing</td> </tr> @@ -1514,9 +1633,8 @@ If true, only write logs to their native severity level (vs also writing to each <!-- If true, SO_REUSEPORT will be used when binding the port, which allows more than one instance to bind on the same address and port. [default=false] --> -如果为 true,则在绑定端口时将使用 SO_REUSEPORT, +如果为 true,则在绑定端口时将使用 <code>SO_REUSEPORT</code>, 这允许多个实例在同一地址和端口上进行绑定。 -[默认值 = false] </td> </tr> @@ -1633,7 +1751,7 @@ The period for syncing persistent volumes and persistent volume claims </tr> <tr> -<td colspan="2">--requestheader-allowed-names stringSlice</td> +<td colspan="2">--requestheader-allowed-names strings</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1652,7 +1770,8 @@ List of client certificate common names to allow to provide usernames in headers <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- -Root certificate bundle to use to verify client certificates on incoming requests before trusting usernames in headers specified by --requestheader-username-headers. WARNING: generally do not depend on authorization being already done for incoming requests.--> +Root certificate bundle to use to verify client certificates on incoming requests before trusting usernames in headers specified by --requestheader-username-headers. WARNING: generally do not depend on authorization being already done for incoming requests. +--> 根证书包文件名。在信任通过 <code>--requestheader-username-headers</code> 所指定的任何用户名之前,要使用这里的证书来检查请求中的客户证书。 警告:一般不要依赖对请求所作的鉴权结果。 @@ -1660,38 +1779,39 @@ Root certificate bundle to use to verify client certificates on incoming request </tr> <tr> -<td colspan="2">--requestheader-extra-headers-prefix stringSlice     <!--Default:-->默认值:<code>[x-remote-extra-]</code></td> +<td colspan="2">--requestheader-extra-headers-prefix strings     <!--Default:-->默认值:<code>"x-remote-extra-"</code></td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- List of request header prefixes to inspect. X-Remote-Extra- is suggested. --> -要插入的请求头部前缀。建议使用 X-Remote-Exra-。 +要插入的请求头部前缀。建议使用 <code>X-Remote-Exra-</code>。 </td> </tr> <tr> -<td colspan="2">--requestheader-group-headers stringSlice     <!--Default:-->默认值:[x-remote-group]</td> +<td colspan="2">--requestheader-group-headers strings     <!--Default:-->默认值:<code>"x-remote-group"</code></td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- List of request headers to inspect for groups. X-Remote-Group is suggested. --> -用来检查用户组名的请求头部名称列表。建议使用 X-Remote-Group。 +用来检查用户组名的请求头部名称列表。建议使用 <code>X-Remote-Group</code>。 </td> </tr> <tr> -<td colspan="2">--requestheader-username-headers stringSlice     <!--Default:-->默认值:[x-remote-user]</td> +<td colspan="2">--requestheader-username-headers strings     <!--Default:-->默认值:<code>"x-remote-user"</code></td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- List of request headers to inspect for usernames. X-Remote-User is common. --> -用来检查用户名的请求头部名称列表。建议使用 X-Remote-User。</td> +用来检查用户名的请求头部名称列表。建议使用 <code>X-Remote-User</code>。 +</td> </tr> <tr> @@ -1740,9 +1860,10 @@ The period for reconciling routes created for Nodes by cloud provider. Number of nodes per second on which pods are deleted in case of node failure when a zone is unhealthy (see --unhealthy-zone-threshold for definition of healthy/unhealthy). Zone refers to entire cluster in non-multizone clusters. This value is implicitly overridden to 0 if the cluster size is smaller than --large-cluster-size-threshold. --> 当区域不健康,节点失效时,每秒钟从此标志所给的节点个数上删除 Pods。 -参见 --unhealthy-zone-threshold 以了解“健康与否”的判定标准。 +参见 <code>--unhealthy-zone-threshold</code> 以了解“健康与否”的判定标准。 在只有一个区域的集群中,区域指的是整个集群。如果集群规模小于 ---large-cluster-size-threshold 所设置的节点个数时,此值被隐式地重设为 0。 +<code>--large-cluster-size-threshold</code> 所设置的节点个数时, +此值被隐式地重设为 0。 </td> </tr> @@ -1855,18 +1976,20 @@ Pods 的个数上限。若此值小于等于 0,则相当于禁止垃圾回收 File containing the default x509 Certificate for HTTPS. (CA cert, if any, concatenated after server cert). If HTTPS serving is enabled, and --tls-cert-file and --tls-private-key-file are not provided, a self-signed certificate and key are generated for the public address and saved to the directory specified by --cert-dir. --> 包含 HTTPS 所用的默认 X509 证书的文件。如果有 CA 证书,会被串接在服务器证书之后。 -若启用了 HTTPS 服务且 --tls-cert-file 和 --tls-private-key-file 标志未设置, -则为节点的公开地址生成自签名的证书和密钥,并保存到 --cert-dir 所给的目录中。 +若启用了 HTTPS 服务且 <code>--tls-cert-file</code> 和 <code>--tls-private-key-file</code> +标志未设置, +则为节点的公开地址生成自签名的证书和密钥,并保存到 <code>--cert-dir</code> +所给的目录中。 </td> </tr> <tr> -<td colspan="2">--tls-cipher-suites stringSlice</td> +<td colspan="2">--tls-cipher-suites strings</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- -Comma-separated list of cipher suites for the server. If omitted, the default Go cipher suites will be used. <br/>Preferred values: TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384. <br/>Insecure values: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_RC4_128_SHA. +Comma-separated list of cipher suites for the server. If omitted, the default Go cipher suites will be used.<br/>Preferred values: TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384.<br/>Insecure values: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_RC4_128_SHA. --> 供服务器使用的加密包的逗号分隔列表。若忽略此标志,则使用 Go 语言默认的加密包。<br/> 可选值包括:TLS_AES_128_GCM_SHA256、TLS_AES_256_GCM_SHA384、TLS_CHACHA20_POLY1305_SHA256、TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA、TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256、TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA、TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384、TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305、TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256、TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA、TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA、TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256、TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA、TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384、TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305、TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256、TLS_RSA_WITH_3DES_EDE_CBC_SHA、TLS_RSA_WITH_AES_128_CBC_SHA、TLS_RSA_WITH_AES_128_GCM_SHA256、TLS_RSA_WITH_AES_256_CBC_SHA、TLS_RSA_WITH_AES_256_GCM_SHA384. @@ -1895,7 +2018,7 @@ Minimum TLS version supported. Possible values: VersionTLS10, VersionTLS11, Vers <!-- File containing the default x509 private key matching --tls-cert-file. --> -包含与 --tls-cert-file 对应的默认 X509 私钥的文件。 +包含与 <code>--tls-cert-file</code> 对应的默认 X509 私钥的文件。 </td> </tr> @@ -1912,8 +2035,8 @@ X509 证书和私钥文件路径的耦对。作为可选项,可以添加域名 域名模式也可以使用 IP 地址字符串,不过只有 API 服务器在所给 IP 地址上 对客户端可见时才可以使用 IP 地址。在未提供域名模式时,从证书中提取域名。 如果有非通配方式的匹配,则优先于通配方式的匹配;显式的域名模式优先于提取的域名。 -当存在多个密钥/证书耦对时,可以多次使用 --tls-sni-cert-key 标志。 -例如:<code>example.crt,example.key</code> 或 <code>foo.crt,foo.key:*.foo.com,foo.com</code>。 +当存在多个密钥/证书耦对时,可以多次使用 <code>--tls-sni-cert-key</code> 标志。 +例如:<code>example.crt,example.key</code> 或 <code>foo.crt,foo.key:\*.foo.com,foo.com</code>。 </td> </tr> @@ -1925,7 +2048,8 @@ X509 证书和私钥文件路径的耦对。作为可选项,可以添加域名 <!-- Fraction of Nodes in a zone which needs to be not Ready (minimum 3) for zone to be treated as unhealthy. --> -仅当给定区域中处于非就绪状态的节点(最少 3 个)的占比高于此值时,才将该区域视为不健康。 +仅当给定区域中处于非就绪状态的节点(最少 3 个)的占比高于此值时, +才将该区域视为不健康。 </td> </tr> @@ -1942,13 +2066,13 @@ If true, use individual service account credentials for each controller. </tr> <tr> -<td colspan="2">-v, --v Level</td> +<td colspan="2">-v, --v int</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> <!-- number for the log level verbosity--> -日志级别详细程度取值 +日志级别详细程度取值。 </td> </tr> @@ -1960,12 +2084,12 @@ number for the log level verbosity--> <!-- Print version information and quit --> -打印版本信息之后退出 +打印版本信息之后退出。 </td> </tr> <tr> -<td colspan="2">--vmodule moduleSpec</td> +<td colspan="2">--vmodule <<!--comma-separated 'pattern=N' settings-->逗号分隔的 'pattern=N' 配置值></td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -1984,13 +2108,13 @@ Comma-separated list of pattern=N settings for file-filtered logging <!-- If false, deny local loopback IPs in addition to any CIDR ranges in --volume-host-cidr-denylist --> -此标志为 false 时,禁止本地回路 IP 地址和 --volume-host-cidr-denylist +此标志为 false 时,禁止本地回路 IP 地址和 <code>--volume-host-cidr-denylist</code> 中所指定的 CIDR 范围。 </td> </tr> <tr> -<td colspan="2">--volume-host-cidr-denylist stringSlice</td> +<td colspan="2">--volume-host-cidr-denylist strings</td> </tr> <tr> <td></td><td style="line-height: 130%; word-wrap: break-word;"> @@ -2001,7 +2125,6 @@ A comma-separated list of CIDR ranges to avoid from volume plugins. </td> </tr> - </tbody> </table> From 6e75f25d04a3af4572b48c5622237bd8db018029 Mon Sep 17 00:00:00 2001 From: Qiming Teng <tengqm@outlook.com> Date: Thu, 27 May 2021 19:23:22 +0800 Subject: [PATCH 177/221] Fix component reference We have some problems processing "<" and ">" in the code comment. The library we used are treating them as unsafe HTML tags. This PR fixes the problem by regenerating the references using the updated generator. --- .../command-line-tools-reference/kube-apiserver.md | 6 +++--- .../command-line-tools-reference/kube-controller-manager.md | 6 +++--- .../reference/command-line-tools-reference/kube-proxy.md | 2 +- .../command-line-tools-reference/kube-scheduler.md | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/content/en/docs/reference/command-line-tools-reference/kube-apiserver.md b/content/en/docs/reference/command-line-tools-reference/kube-apiserver.md index c502c77d16..9a824fd834 100644 --- a/content/en/docs/reference/command-line-tools-reference/kube-apiserver.md +++ b/content/en/docs/reference/command-line-tools-reference/kube-apiserver.md @@ -64,7 +64,7 @@ kube-apiserver [flags] <td colspan="2">--allow-metric-labels stringToString     Default: []</td> </tr> <tr> -<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>The map from metric-label to value allow-list of this label. The key's format is <!-- raw HTML omitted -->,<!-- raw HTML omitted -->. The value's format is <allowed_value>,<allowed_value>...e.g. metric1,label1='v1,v2,v3', metric1,label2='v1,v2,v3' metric2,label1='v1,v2,v3'.</p></td> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>The map from metric-label to value allow-list of this label. The key's format is <MetricName>,<LabelName>. The value's format is <allowed_value>,<allowed_value>...e.g. metric1,label1='v1,v2,v3', metric1,label2='v1,v2,v3' metric2,label1='v1,v2,v3'.</p></td> </tr> <tr> @@ -967,7 +967,7 @@ kube-apiserver [flags] <td colspan="2">--runtime-config <comma-separated 'key=value' pairs></td> </tr> <tr> -<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>A set of key=value pairs that enable or disable built-in APIs. Supported options are:<br/>v1=true|false for the core API group<br/><!-- raw HTML omitted -->/<!-- raw HTML omitted -->=true|false for a specific API group and version (e.g. apps/v1=true)<br/>api/all=true|false controls all API versions<br/>api/ga=true|false controls all API versions of the form v[0-9]+<br/>api/beta=true|false controls all API versions of the form v[0-9]+beta[0-9]+<br/>api/alpha=true|false controls all API versions of the form v[0-9]+alpha[0-9]+<br/>api/legacy is deprecated, and will be removed in a future version</p></td> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>A set of key=value pairs that enable or disable built-in APIs. Supported options are:<br/>v1=true|false for the core API group<br/><group>/<version>=true|false for a specific API group and version (e.g. apps/v1=true)<br/>api/all=true|false controls all API versions<br/>api/ga=true|false controls all API versions of the form v[0-9]+<br/>api/beta=true|false controls all API versions of the form v[0-9]+beta[0-9]+<br/>api/alpha=true|false controls all API versions of the form v[0-9]+alpha[0-9]+<br/>api/legacy is deprecated, and will be removed in a future version</p></td> </tr> <tr> @@ -1044,7 +1044,7 @@ kube-apiserver [flags] <td colspan="2">--show-hidden-metrics-for-version string</td> </tr> <tr> -<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>The previous version for which you want to show hidden metrics. Only the previous minor version is meaningful, other values will not be allowed. The format is <!-- raw HTML omitted -->.<!-- raw HTML omitted -->, e.g.: '1.16'. The purpose of this format is make sure you have the opportunity to notice if the next release hides additional metrics, rather than being surprised when they are permanently removed in the release after that.</p></td> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>The previous version for which you want to show hidden metrics. Only the previous minor version is meaningful, other values will not be allowed. The format is <major>.<minor>, e.g.: '1.16'. The purpose of this format is make sure you have the opportunity to notice if the next release hides additional metrics, rather than being surprised when they are permanently removed in the release after that.</p></td> </tr> <tr> diff --git a/content/en/docs/reference/command-line-tools-reference/kube-controller-manager.md b/content/en/docs/reference/command-line-tools-reference/kube-controller-manager.md index df8f76baed..9e175bbb7c 100644 --- a/content/en/docs/reference/command-line-tools-reference/kube-controller-manager.md +++ b/content/en/docs/reference/command-line-tools-reference/kube-controller-manager.md @@ -61,7 +61,7 @@ kube-controller-manager [flags] <td colspan="2">--allow-metric-labels stringToString     Default: []</td> </tr> <tr> -<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>The map from metric-label to value allow-list of this label. The key's format is <!-- raw HTML omitted -->,<!-- raw HTML omitted -->. The value's format is <allowed_value>,<allowed_value>...e.g. metric1,label1='v1,v2,v3', metric1,label2='v1,v2,v3' metric2,label1='v1,v2,v3'.</p></td> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>The map from metric-label to value allow-list of this label. The key's format is <MetricName>,<LabelName>. The value's format is <allowed_value>,<allowed_value>...e.g. metric1,label1='v1,v2,v3', metric1,label2='v1,v2,v3' metric2,label1='v1,v2,v3'.</p></td> </tr> <tr> @@ -708,7 +708,7 @@ kube-controller-manager [flags] <td></td><td style="line-height: 130%; word-wrap: break-word;"><p>The length of EndpointSlice updates batching period for EndpointSliceMirroring controller. Processing of EndpointSlice changes will be delayed by this duration to join them with potential upcoming updates and reduce the overall number of EndpointSlice updates. Larger number = higher endpoint programming latency, but lower number of endpoints revision generated</p></td> </tr> -<tr> +*<tr> <td colspan="2">--mirroring-max-endpoints-per-subset int32     Default: 1000</td> </tr> <tr> @@ -943,7 +943,7 @@ kube-controller-manager [flags] <td colspan="2">--show-hidden-metrics-for-version string</td> </tr> <tr> -<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>The previous version for which you want to show hidden metrics. Only the previous minor version is meaningful, other values will not be allowed. The format is <!-- raw HTML omitted -->.<!-- raw HTML omitted -->, e.g.: '1.16'. The purpose of this format is make sure you have the opportunity to notice if the next release hides additional metrics, rather than being surprised when they are permanently removed in the release after that.</p></td> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>The previous version for which you want to show hidden metrics. Only the previous minor version is meaningful, other values will not be allowed. The format is <major>.<minor>, e.g.: '1.16'. The purpose of this format is make sure you have the opportunity to notice if the next release hides additional metrics, rather than being surprised when they are permanently removed in the release after that.</p></td> </tr> <tr> diff --git a/content/en/docs/reference/command-line-tools-reference/kube-proxy.md b/content/en/docs/reference/command-line-tools-reference/kube-proxy.md index 8313be8ebb..dc236b02e9 100644 --- a/content/en/docs/reference/command-line-tools-reference/kube-proxy.md +++ b/content/en/docs/reference/command-line-tools-reference/kube-proxy.md @@ -424,7 +424,7 @@ kube-proxy [flags] <td colspan="2">--show-hidden-metrics-for-version string</td> </tr> <tr> -<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>The previous version for which you want to show hidden metrics. Only the previous minor version is meaningful, other values will not be allowed. The format is <!-- raw HTML omitted -->.<!-- raw HTML omitted -->, e.g.: '1.16'. The purpose of this format is make sure you have the opportunity to notice if the next release hides additional metrics, rather than being surprised when they are permanently removed in the release after that.</p></td> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>The previous version for which you want to show hidden metrics. Only the previous minor version is meaningful, other values will not be allowed. The format is <major>.<minor>, e.g.: '1.16'. The purpose of this format is make sure you have the opportunity to notice if the next release hides additional metrics, rather than being surprised when they are permanently removed in the release after that.</p></td> </tr> <tr> diff --git a/content/en/docs/reference/command-line-tools-reference/kube-scheduler.md b/content/en/docs/reference/command-line-tools-reference/kube-scheduler.md index 885e997ed7..ce8b9b3b67 100644 --- a/content/en/docs/reference/command-line-tools-reference/kube-scheduler.md +++ b/content/en/docs/reference/command-line-tools-reference/kube-scheduler.md @@ -68,7 +68,7 @@ kube-scheduler [flags] <td colspan="2">--allow-metric-labels stringToString     Default: []</td> </tr> <tr> -<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>The map from metric-label to value allow-list of this label. The key's format is <!-- raw HTML omitted -->,<!-- raw HTML omitted -->. The value's format is <allowed_value>,<allowed_value>...e.g. metric1,label1='v1,v2,v3', metric1,label2='v1,v2,v3' metric2,label1='v1,v2,v3'.</p></td> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>The map from metric-label to value allow-list of this label. The key's format is <MetricName>,<LabelName>. The value's format is <allowed_value>,<allowed_value>...e.g. metric1,label1='v1,v2,v3', metric1,label2='v1,v2,v3' metric2,label1='v1,v2,v3'.</p></td> </tr> <tr> @@ -474,7 +474,7 @@ kube-scheduler [flags] <td colspan="2">--show-hidden-metrics-for-version string</td> </tr> <tr> -<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>The previous version for which you want to show hidden metrics. Only the previous minor version is meaningful, other values will not be allowed. The format is <!-- raw HTML omitted -->.<!-- raw HTML omitted -->, e.g.: '1.16'. The purpose of this format is make sure you have the opportunity to notice if the next release hides additional metrics, rather than being surprised when they are permanently removed in the release after that.</p></td> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>The previous version for which you want to show hidden metrics. Only the previous minor version is meaningful, other values will not be allowed. The format is <major>.<minor>, e.g.: '1.16'. The purpose of this format is make sure you have the opportunity to notice if the next release hides additional metrics, rather than being surprised when they are permanently removed in the release after that.</p></td> </tr> <tr> From 779b6cad72a48033927bcfcfa60c3346fd2e869b Mon Sep 17 00:00:00 2001 From: c00522440 <chenchuntao@huawei.com> Date: Thu, 27 May 2021 20:46:55 +0800 Subject: [PATCH 178/221] delalphades --- .../docs/tasks/configure-pod-container/security-context.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/content/zh/docs/tasks/configure-pod-container/security-context.md b/content/zh/docs/tasks/configure-pod-container/security-context.md index e36b0f038a..42f07b5ceb 100644 --- a/content/zh/docs/tasks/configure-pod-container/security-context.md +++ b/content/zh/docs/tasks/configure-pod-container/security-context.md @@ -286,13 +286,6 @@ securityContext: fsGroupChangePolicy: "OnRootMismatch" ``` -<!-- -This is an alpha feature. To use it, enable the [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) `ConfigurableFSGroupPolicy` for the kube-api-server, the kube-controller-manager, and for the kubelet. ---> -这是一个 Alpha 阶段的功能特性。要使用此特性,需要在 `kube-apiserver`、`kube-controller-manager` -和 `kubelet` 上启用 `ConfigurableFSGroupPolicy` -[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/)。 - <!-- This field has no effect on ephemeral volume types such as [`secret`](/docs/concepts/storage/volumes/#secret), From 3e271904776c188c3dfc3a728dacc70863c3acc2 Mon Sep 17 00:00:00 2001 From: Arhell <arhell333@gmail.com> Date: Fri, 28 May 2021 03:31:44 +0300 Subject: [PATCH 179/221] [es] Add configuration java microservice link to tutorials index --- content/es/docs/tutorials/_index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/es/docs/tutorials/_index.md b/content/es/docs/tutorials/_index.md index 47db2da8b9..a8748b958d 100644 --- a/content/es/docs/tutorials/_index.md +++ b/content/es/docs/tutorials/_index.md @@ -31,6 +31,8 @@ Antes de recorrer cada tutorial, recomendamos añadir un marcador a ## Configuración +* [Ejemplo: Configurando un Microservicio en Java](/docs/tutorials/configuration/configure-java-microservice/) + * [Configuring Redis Using a ConfigMap](/docs/tutorials/configuration/configure-redis-using-configmap/) ## Aplicaciones Stateless From 4bbd5606026d8b4f2b40537aa24e784756e8fd2e Mon Sep 17 00:00:00 2001 From: Qiming Teng <tengqm@outlook.com> Date: Fri, 28 May 2021 09:03:48 +0800 Subject: [PATCH 180/221] Update kube-controller-manager.md --- .../command-line-tools-reference/kube-controller-manager.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/reference/command-line-tools-reference/kube-controller-manager.md b/content/en/docs/reference/command-line-tools-reference/kube-controller-manager.md index 9e175bbb7c..29e7b1ec8e 100644 --- a/content/en/docs/reference/command-line-tools-reference/kube-controller-manager.md +++ b/content/en/docs/reference/command-line-tools-reference/kube-controller-manager.md @@ -708,7 +708,7 @@ kube-controller-manager [flags] <td></td><td style="line-height: 130%; word-wrap: break-word;"><p>The length of EndpointSlice updates batching period for EndpointSliceMirroring controller. Processing of EndpointSlice changes will be delayed by this duration to join them with potential upcoming updates and reduce the overall number of EndpointSlice updates. Larger number = higher endpoint programming latency, but lower number of endpoints revision generated</p></td> </tr> -*<tr> +<tr> <td colspan="2">--mirroring-max-endpoints-per-subset int32     Default: 1000</td> </tr> <tr> From b33e1aec19b242c382b7787d19c5df2ee5bedb3c Mon Sep 17 00:00:00 2001 From: Qiming Teng <tengqm@outlook.com> Date: Tue, 27 Apr 2021 13:02:33 +0800 Subject: [PATCH 181/221] [zh] Resync concepts files (2) --- .../scheduling-eviction/assign-pod-node.md | 97 +++++++++++-------- .../scheduling-eviction/kube-scheduler.md | 6 +- .../resource-bin-packing.md | 8 +- .../scheduler-perf-tuning.md | 24 +++-- .../scheduling-framework.md | 25 +++-- .../docs/tasks/manage-gpus/scheduling-gpus.md | 2 +- 6 files changed, 97 insertions(+), 65 deletions(-) diff --git a/content/zh/docs/concepts/scheduling-eviction/assign-pod-node.md b/content/zh/docs/concepts/scheduling-eviction/assign-pod-node.md index 5b03763a5d..c237281776 100644 --- a/content/zh/docs/concepts/scheduling-eviction/assign-pod-node.md +++ b/content/zh/docs/concepts/scheduling-eviction/assign-pod-node.md @@ -1,7 +1,7 @@ --- title: 将 Pod 分配给节点 content_type: concept -weight: 50 +weight: 20 --- <!-- @@ -11,24 +11,24 @@ reviewers: - bsalamat title: Assigning Pods to Nodes content_type: concept -weight: 50 +weight: 20 --> <!-- overview --> <!-- -You can constrain a {{< glossary_tooltip text="Pod" term_id="pod" >}} to only be able to run on particular -{{< glossary_tooltip text="Node(s)" term_id="node" >}}, or to prefer to run on particular nodes. +You can constrain a {{< glossary_tooltip text="Pod" term_id="pod" >}} so that it can only run on particular set of +{{< glossary_tooltip text="Node(s)" term_id="node" >}}. There are several ways to do this, and the recommended approaches all use -[label selectors](/docs/concepts/overview/working-with-objects/labels/) to make the selection. +[label selectors](/docs/concepts/overview/working-with-objects/labels/) to facilitate the selection. Generally such constraints are unnecessary, as the scheduler will automatically do a reasonable placement -(e.g. spread your pods across nodes, not place the pod on a node with insufficient free resources, etc.) +(e.g. spread your pods across nodes so as not place the pod on a node with insufficient free resources, etc.) but there are some circumstances where you may want more control on a node where a pod lands, for example to ensure that a pod ends up on a machine with an SSD attached to it, or to co-locate pods from two different services that communicate a lot into the same availability zone. --> 你可以约束一个 {{< glossary_tooltip text="Pod" term_id="pod" >}} 只能在特定的 -{{< glossary_tooltip text="节点" term_id="node" >}} 上运行,或者优先运行在特定的节点上。 +{{< glossary_tooltip text="节点" term_id="node" >}} 上运行。 有几种方法可以实现这点,推荐的方法都是用 [标签选择算符](/zh/docs/concepts/overview/working-with-objects/labels/)来进行选择。 通常这样的约束不是必须的,因为调度器将自动进行合理的放置(比如,将 Pod 分散到节点上, @@ -132,22 +132,12 @@ Pod 将会调度到将标签添加到的节点上。 ## Interlude: built-in node labels {#built-in-node-labels} In addition to labels you [attach](#step-one-attach-label-to-the-node), nodes come pre-populated -with a standard set of labels. These labels are +with a standard set of labels. See [Well-Known Labels, Annotations and Taints](/docs/reference/labels-annotations-taints/) for a list of these. --> ## 插曲:内置的节点标签 {#built-in-node-labels} 除了你[添加](#attach-labels-to-node)的标签外,节点还预先填充了一组标准标签。 -这些标签有: - -* [`kubernetes.io/hostname`](/zh/docs/reference/kubernetes-api/labels-annotations-taints/#kubernetes-io-hostname) -* [`failure-domain.beta.kubernetes.io/zone`](/zh/docs/reference/kubernetes-api/labels-annotations-taints/#failure-domainbetakubernetesiozone) -* [`failure-domain.beta.kubernetes.io/region`](/zh/docs/reference/kubernetes-api/labels-annotations-taints/#failure-domainbetakubernetesioregion) -* [`topology.kubernetes.io/zone`](/zh/docs/reference/kubernetes-api/labels-annotations-taints/#topologykubernetesiozone) -* [`topology.kubernetes.io/region`](/zh/docs/reference/kubernetes-api/labels-annotations-taints/#topologykubernetesiozone) -* [`beta.kubernetes.io/instance-type`](/zh/docs/reference/kubernetes-api/labels-annotations-taints/#beta-kubernetes-io-instance-type) -* [`node.kubernetes.io/instance-type`](/zh/docs/reference/kubernetes-api/labels-annotations-taints/#nodekubernetesioinstance-type) -* [`kubernetes.io/os`](/zh/docs/reference/kubernetes-api/labels-annotations-taints/#kubernetes-io-os) -* [`kubernetes.io/arch`](/zh/docs/reference/kubernetes-api/labels-annotations-taints/#kubernetes-io-arch) +参见[常用标签、注解和污点](/zh/docs/reference/labels-annotations-taints/)。 {{< note >}} <!-- @@ -247,12 +237,12 @@ Pod 可以调度到哪些节点。 <!-- There are currently two types of node affinity, called `requiredDuringSchedulingIgnoredDuringExecution` and `preferredDuringSchedulingIgnoredDuringExecution`. You can think of them as "hard" and "soft" respectively, -in the sense that the former specifies rules that *must* be met for a pod to be scheduled onto a node (just like +in the sense that the former specifies rules that *must* be met for a pod to be scheduled onto a node (similar to `nodeSelector` but using a more expressive syntax), while the latter specifies *preferences* that the scheduler will try to enforce but will not guarantee. The "IgnoredDuringExecution" part of the names means that, similar to how `nodeSelector` works, if labels on a node change at runtime such that the affinity rules on a pod are no longer -met, the pod will still continue to run on the node. In the future we plan to offer -`requiredDuringSchedulingRequiredDuringExecution` which will be just like `requiredDuringSchedulingIgnoredDuringExecution` +met, the pod continues to run on the node. In the future we plan to offer +`requiredDuringSchedulingRequiredDuringExecution` which will be identical to `requiredDuringSchedulingIgnoredDuringExecution` except that it will evict pods from nodes that cease to satisfy the pods' node affinity requirements. --> 目前有两种类型的节点亲和性,分别为 `requiredDuringSchedulingIgnoredDuringExecution` 和 @@ -264,8 +254,8 @@ except that it will evict pods from nodes that cease to satisfy the pods' node a 如果节点的标签在运行时发生变更,从而不再满足 Pod 上的亲和性规则,那么 Pod 将仍然继续在该节点上运行。 将来我们计划提供 `requiredDuringSchedulingRequiredDuringExecution`, -它将类似于 `requiredDuringSchedulingIgnoredDuringExecution`, -除了它会将 pod 从不再满足 pod 的节点亲和性要求的节点上驱逐。 +它将与 `requiredDuringSchedulingIgnoredDuringExecution` 完全相同, +只是它会将 Pod 从不再满足 Pod 的节点亲和性要求的节点上驱逐。 <!-- Thus an example of `requiredDuringSchedulingIgnoredDuringExecution` would be "only run the pod on nodes with Intel CPUs" @@ -538,22 +528,23 @@ Pod 亲和性与反亲和性的合法操作符有 `In`,`NotIn`,`Exists`,`D 然而,出于性能和安全原因,topologyKey 受到一些限制: <!-- -1. For affinity and for `requiredDuringSchedulingIgnoredDuringExecution` pod anti-affinity, -empty `topologyKey` is not allowed. -2. For `requiredDuringSchedulingIgnoredDuringExecution` pod anti-affinity, the admission controller `LimitPodHardAntiAffinityTopology` was introduced to limit `topologyKey` to `kubernetes.io/hostname`. If you want to make it available for custom topologies, you may modify the admission controller, or simply disable it. -3. For `preferredDuringSchedulingIgnoredDuringExecution` pod anti-affinity, empty `topologyKey` is interpreted as "all topologies" ("all topologies" here is now limited to the combination of `kubernetes.io/hostname`, `topology.kubernetes.io/zone` and `topology.kubernetes.io/region`). +1. For pod affinity, empty `topologyKey` is not allowed in both +`requiredDuringSchedulingIgnoredDuringExecution` +and `preferredDuringSchedulingIgnoredDuringExecution`. +2. For pod anti-affinity, empty `topologyKey` is also not allowed in both `requiredDuringSchedulingIgnoredDuringExecution` +and `preferredDuringSchedulingIgnoredDuringExecution`. +3. For `requiredDuringSchedulingIgnoredDuringExecution` pod anti-affinity, the admission controller `LimitPodHardAntiAffinityTopology` was introduced to limit `topologyKey` to `kubernetes.io/hostname`. If you want to make it available for custom topologies, you may modify the admission controller, or disable it. 4. Except for the above cases, the `topologyKey` can be any legal label-key. --> -1. 对于亲和性与 `requiredDuringSchedulingIgnoredDuringExecution` 要求的 - Pod 反亲和性,`topologyKey` 不允许为空。 -2. 对于 `requiredDuringSchedulingIgnoredDuringExecution` 要求的 Pod 反亲和性, - 准入控制器 `LimitPodHardAntiAffinityTopology` 被引入来限制 `topologyKey` - 为 `kubernetes.io/hostname`。 - 如果你想设置topologyKey为其他值来用于自定义拓扑结构,你必须修改准入控制器或者禁用它。 -3. 对于 `preferredDuringSchedulingIgnoredDuringExecution` 要求的 Pod 反亲和性, - 空的 `topologyKey` 被解释为“所有拓扑结构”(这里的“所有拓扑结构”限制为 - `kubernetes.io/hostname`,`topology.kubernetes.io/zone` 和 - `topology.kubernetes.io/region` 的组合)。 +1. 对于 Pod 亲和性而言,在 `requiredDuringSchedulingIgnoredDuringExecution` + 和 `preferredDuringSchedulingIgnoredDuringExecution` 中,`topologyKey` 不允许为空。 +2. 对于 Pod 反亲和性而言,`requiredDuringSchedulingIgnoredDuringExecution` + 和 `preferredDuringSchedulingIgnoredDuringExecution` 中,`topologyKey` + 都不可以为空。 +3. 对于 `requiredDuringSchedulingIgnoredDuringExecution` 要求的 Pod 反亲和性, + 准入控制器 `LimitPodHardAntiAffinityTopology` 被引入以确保 `topologyKey` + 只能是 `kubernetes.io/hostname`。如果你希望 `topologyKey` 也可用于其他定制 + 拓扑逻辑,你可以更改准入控制器或者禁用之。 4. 除上述情况外,`topologyKey` 可以是任何合法的标签键。 <!-- @@ -573,6 +564,36 @@ must be satisfied for the pod to be scheduled onto a node. 所有与 `requiredDuringSchedulingIgnoredDuringExecution` 亲和性与反亲和性 关联的 `matchExpressions` 必须满足,才能将 pod 调度到节点上。 +<!-- +#### Namespace selector +--> +#### 名字空间选择算符 + +{{< feature-state for_k8s_version="v1.21" state="alpha" >}} + +<!-- +Users can also select matching namespaces using `namespaceSelector`, which is a label query over the set of namespaces. +The affinity term is applied to the union of the namespaces selected by `namespaceSelector` and the ones listed in the `namespaces` field. +Note that an empty `namespaceSelector` ({}) matches all namespaces, while a null or empty `namespaces` list and +null `namespaceSelector` means "this pod's namespace". +--> +用户也可以使用 `namespaceSelector` 选择匹配的名字空间,`namespaceSelector` +是对名字空间集合进行标签查询的机制。 +亲和性条件会应用到 `namespaceSelector` 所选择的名字空间和 `namespaces` 字段中 +所列举的名字空间之上。 +注意,空的 `namespaceSelector`({})会匹配所有名字空间,而 null 或者空的 +`namespaces` 列表以及 null 值 `namespaceSelector` 意味着“当前 Pod 的名字空间”。 + +<!-- +This feature is alpha and disabled by default. You can enable it by setting the +[feature gate](/docs/reference/command-line-tools-reference/feature-gates/) +`PodAffinityNamespaceSelector` in both kube-apiserver and kube-scheduler. +--> +此功能特性是 Alpha 版本的,默认是被禁用的。你可以通过针对 kube-apiserver 和 +kube-scheduler 设置 +[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) +`PodAffinityNamespaceSelector` 来启用此特性。 + <!-- #### More Practical Use-cases diff --git a/content/zh/docs/concepts/scheduling-eviction/kube-scheduler.md b/content/zh/docs/concepts/scheduling-eviction/kube-scheduler.md index d5b7cdc5c3..65306db584 100644 --- a/content/zh/docs/concepts/scheduling-eviction/kube-scheduler.md +++ b/content/zh/docs/concepts/scheduling-eviction/kube-scheduler.md @@ -1,13 +1,13 @@ --- title: Kubernetes 调度器 content_type: concept -weight: 50 +weight: 10 --- <!-- title: Kubernetes Scheduler content_type: concept -weight: 50 +weight: 10 --> <!-- overview --> @@ -173,6 +173,7 @@ of the scheduler: * Read about [scheduler performance tuning](/docs/concepts/scheduling-eviction/scheduler-perf-tuning/) * Read about [Pod topology spread constraints](/docs/concepts/workloads/pods/pod-topology-spread-constraints/) * Read the [reference documentation](/docs/reference/command-line-tools-reference/kube-scheduler/) for kube-scheduler +* Read the [kube-scheduler config (v1beta1)](/docs/reference/config-api/kube-scheduler-config.v1beta1/) reference * Learn about [configuring multiple schedulers](/docs/tasks/extend-kubernetes/configure-multiple-schedulers/) * Learn about [topology management policies](/docs/tasks/administer-cluster/topology-manager/) * Learn about [Pod Overhead](/docs/concepts/scheduling-eviction/pod-overhead/) @@ -180,6 +181,7 @@ of the scheduler: * 阅读关于 [调度器性能调优](/zh/docs/concepts/scheduling-eviction/scheduler-perf-tuning/) * 阅读关于 [Pod 拓扑分布约束](/zh/docs/concepts/workloads/pods/pod-topology-spread-constraints/) * 阅读关于 kube-scheduler 的 [参考文档](/zh/docs/reference/command-line-tools-reference/kube-scheduler/) +* 阅读 [kube-scheduler 配置参考 (v1beta1)](/zh/docs/reference/config-api/kube-scheduler-config.v1beta1/) * 了解关于 [配置多个调度器](/zh/docs/tasks/extend-kubernetes/configure-multiple-schedulers/) 的方式 * 了解关于 [拓扑结构管理策略](/zh/docs/tasks/administer-cluster/topology-manager/) * 了解关于 [Pod 额外开销](/zh/docs/concepts/scheduling-eviction/pod-overhead/) diff --git a/content/zh/docs/concepts/scheduling-eviction/resource-bin-packing.md b/content/zh/docs/concepts/scheduling-eviction/resource-bin-packing.md index 8d822069d9..a08539b1a0 100644 --- a/content/zh/docs/concepts/scheduling-eviction/resource-bin-packing.md +++ b/content/zh/docs/concepts/scheduling-eviction/resource-bin-packing.md @@ -1,12 +1,16 @@ --- title: 扩展资源的资源装箱 content_type: concept -weight: 50 +weight: 30 --- <!-- +reviewers: +- bsalamat +- k82cn +- ahg-g title: Resource Bin Packing for Extended Resources content_type: concept -weight: 50 +weight: 30 --> <!-- overview --> diff --git a/content/zh/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md b/content/zh/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md index e10b5b8854..42894aca1e 100644 --- a/content/zh/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md +++ b/content/zh/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md @@ -78,12 +78,14 @@ had set a value of 100. kube-scheduler 的表现等价于设置值为 100。 <!-- -To change the value, edit the kube-scheduler configuration file (this is likely -to be `/etc/kubernetes/config/kube-scheduler.yaml`), then restart the scheduler. - --> -要修改这个值,编辑 kube-scheduler 的配置文件 -(通常是 `/etc/kubernetes/config/kube-scheduler.yaml`), -然后重启调度器。 +To change the value, edit the +[kube-scheduler configuration file](/docs/reference/config-api/kube-scheduler-config.v1beta1/) +and then restart the scheduler. +In many cases, the configuration file can be found at `/etc/kubernetes/config/kube-scheduler.yaml`. +--> +要修改这个值,编辑 [kube-scheduler 的配置文件](/zh/docs/reference/config-api/kube-scheduler-config.v1beta1/), +之后重启调度器。 +在很多场合下,配置文件位于 `/etc/kubernetes/config/kube-scheduler.yaml`。 <!-- After you have made this change, you can run @@ -193,8 +195,8 @@ minimum value of 50 nodes. 另外,还有一个 50 个 Node 的最小值是硬编码在程序中。 <!-- -{{< note >}} In clusters with less than 50 feasible nodes, the scheduler still -checks all the nodes, simply because there are not enough feasible nodes to stop +In clusters with less than 50 feasible nodes, the scheduler still +checks all the nodes because there are not enough feasible nodes to stop the scheduler's search early. In a small cluster, if you set a low value for `percentageOfNodesToScore`, your @@ -203,7 +205,6 @@ change will have no or little effect, for a similar reason. If your cluster has several hundred Nodes or fewer, leave this configuration option at its default value. Making changes is unlikely to improve the scheduler's performance significantly. -{{< /note >}} --> {{< note >}} 当集群中的可调度节点少于 50 个时,调度器仍然会去检查所有的 Node, @@ -293,3 +294,8 @@ After going over all the Nodes, it goes back to Node 1. --> 在评估完所有 Node 后,将会返回到 Node 1,从头开始。 + +## {{% heading "whatsnext" %}} + +* 查阅 [kube-scheduler 配置参考 (v1beta1)](/zh/docs/reference/config-api/kube-scheduler-config.v1beta1/) + diff --git a/content/zh/docs/concepts/scheduling-eviction/scheduling-framework.md b/content/zh/docs/concepts/scheduling-eviction/scheduling-framework.md index d757a654be..5927a4c8f3 100644 --- a/content/zh/docs/concepts/scheduling-eviction/scheduling-framework.md +++ b/content/zh/docs/concepts/scheduling-eviction/scheduling-framework.md @@ -1,6 +1,4 @@ --- -reviewers: -- ahg-g title: 调度框架 content_type: concept weight: 70 @@ -11,7 +9,7 @@ reviewers: - ahg-g title: Scheduling Framework content_type: concept -weight: 60 +weight: 70 --> <!-- overview --> @@ -19,16 +17,17 @@ weight: 60 {{< feature-state for_k8s_version="1.15" state="alpha" >}} <!-- -The scheduling framework is a plugable architecture for Kubernetes Scheduler -that makes scheduler customizations easy. It adds a new set of "plugin" APIs to -the existing scheduler. Plugins are compiled into the scheduler. The APIs -allow most scheduling features to be implemented as plugins, while keeping the +The scheduling framework is a plugable architecture for the Kubernetes Scheduler. +It adds a new set of "plugin" APIs to the existing scheduler. Plugins are compiled +into the scheduler. The APIs allow most scheduling features to be implemented as +plugins, while keeping the scheduling "core" simple and maintainable. Refer to the [design proposal of the scheduling framework][kep] for more technical information on the design of the framework. --> -调度框架是 Kubernetes Scheduler 的一种可插入架构,可以简化调度器的自定义。 -它向现有的调度器增加了一组新的“插件” API。插件被编译到调度器程序中。 +调度框架是 Kubernetes 调度器的一种可插入架构。 +调度框架向现有的调度器增加了一组新的“插件(Plugin)” API。 +插件被编译到调度器程序中。 这些 API 允许大多数调度功能以插件的形式实现,同时使调度“核心”保持简单且可维护。 请参考[调度框架的设计提案](https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/624-scheduling-framework/README.md) 获取框架设计的更多技术信息。 @@ -328,15 +327,15 @@ _Permit_ 插件在每个 Pod 调度周期的最后调用,用于防止或延迟 <!-- While any plugin can access the list of "waiting" Pods and approve them -(see [`FrameworkHandle`](#frameworkhandle)), we expect only the permit +(see [`FrameworkHandle`](https://git.k8s.io/enhancements/keps/sig-scheduling/624-scheduling-framework#frameworkhandle)), we expect only the permit plugins to approve binding of reserved Pods that are in "waiting" state. Once a Pod is approved, it is sent to the [PreBind](#pre-bind) phase. --> {{< note >}} 尽管任何插件可以访问 “等待中” 状态的 Pod 列表并批准它们 -(查看 [`FrameworkHandle`](#frameworkhandle))。 -我们希望只有允许插件可以批准处于 “等待中” 状态的预留 Pod 的绑定。 -一旦 Pod 被批准了,它将发送到[预绑定](#pre-bind) 阶段。 +(参阅 [`FrameworkHandle`](https://git.k8s.io/enhancements/keps/sig-scheduling/624-scheduling-framework#frameworkhandle))。 +我们希望只有被允许的插件可以批准处于“等待中”状态的预留 Pod 的绑定。 +一旦 Pod 被批准了,它将进入到[预绑定](#pre-bind) 阶段。 {{< /note >}} <!-- diff --git a/content/zh/docs/tasks/manage-gpus/scheduling-gpus.md b/content/zh/docs/tasks/manage-gpus/scheduling-gpus.md index 85703130b6..e88c3dbcf7 100644 --- a/content/zh/docs/tasks/manage-gpus/scheduling-gpus.md +++ b/content/zh/docs/tasks/manage-gpus/scheduling-gpus.md @@ -54,7 +54,7 @@ When the above conditions are true, Kubernetes will expose `amd.com/gpu` or `nvidia.com/gpu` as a schedulable resource. You can consume these GPUs from your containers by requesting -`<vendor>.com/gpu` just like you request `cpu` or `memory`. +`<vendor>.com/gpu` the same way you request `cpu` or `memory`. However, there are some limitations in how you specify the resource requirements when using GPUs: --> From f9b2c8c9329fffc49506b35f010e3bfdd3c2fd4e Mon Sep 17 00:00:00 2001 From: liuwei10 <liuwei10@inspur.com> Date: Fri, 28 May 2021 16:54:11 +0800 Subject: [PATCH 182/221] modify error of runtime-class md --- content/zh/docs/concepts/containers/runtime-class.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/concepts/containers/runtime-class.md b/content/zh/docs/concepts/containers/runtime-class.md index 70f5dce756..eb3e6be5f6 100644 --- a/content/zh/docs/concepts/containers/runtime-class.md +++ b/content/zh/docs/concepts/containers/runtime-class.md @@ -255,7 +255,7 @@ the intersection of the set of nodes selected by each. If there is a conflict, t rejected. --> 为了确保 pod 会被调度到支持指定运行时的 node 上,每个 node 需要设置一个通用的 label 用于被 -`runtimeclass.scheduling.nodeSelector` 挑选。在 admission 阶段,RuntimeClass 的 nodeSelector 将会于 +`runtimeclass.scheduling.nodeSelector` 挑选。在 admission 阶段,RuntimeClass 的 nodeSelector 将会与 pod 的 nodeSelector 合并,取二者的交集。如果有冲突,pod 将会被拒绝。 <!-- From 3020b23c49dc81c3c6849c4c2867d8a2d68488c3 Mon Sep 17 00:00:00 2001 From: Jack Wu <wuyang01@inspur.com> Date: Fri, 28 May 2021 17:30:33 +0800 Subject: [PATCH 183/221] Update web-ui-dashboard.md --- .../docs/tasks/access-application-cluster/web-ui-dashboard.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/tasks/access-application-cluster/web-ui-dashboard.md b/content/zh/docs/tasks/access-application-cluster/web-ui-dashboard.md index 7f15b264c0..a9d3793cda 100644 --- a/content/zh/docs/tasks/access-application-cluster/web-ui-dashboard.md +++ b/content/zh/docs/tasks/access-application-cluster/web-ui-dashboard.md @@ -214,7 +214,7 @@ The deploy wizard expects that you provide the following information: --> 不管哪种 Service 类型,如果你选择创建一个 Service,而且容器在一个端口上开启了监听(入向的), 那么你需要定义两个端口。创建的 Service 会把(入向的)端口映射到容器可见的目标端口。 - 该 Service 会把流量路由到你部署的 Pod。支持的协议有 TCP 和 UDP。 + 该 Service 会把流量路由到你部署的 Pod。支持 TCP 协议和 UDP 协议。 这个 Service 的内部 DNS 解析名就是之前你定义的应用名称的值。 <!-- From abce898833832d0bc9e1311392c48ec0fef13173 Mon Sep 17 00:00:00 2001 From: Mengjiao Liu <mengjiao.liu@daocloud.io> Date: Fri, 28 May 2021 19:46:29 +0800 Subject: [PATCH 184/221] [zh] Resync feature gates reference --- .../feature-gates.md | 125 ++++++++++-------- 1 file changed, 73 insertions(+), 52 deletions(-) diff --git a/content/zh/docs/reference/command-line-tools-reference/feature-gates.md b/content/zh/docs/reference/command-line-tools-reference/feature-gates.md index 597bc98040..ff81c38d6b 100644 --- a/content/zh/docs/reference/command-line-tools-reference/feature-gates.md +++ b/content/zh/docs/reference/command-line-tools-reference/feature-gates.md @@ -98,7 +98,7 @@ different Kubernetes components. | `APIPriorityAndFairness` | `false` | Alpha | 1.17 | 1.19 | | `APIPriorityAndFairness` | `true` | Beta | 1.20 | | | `APIResponseCompression` | `false` | Alpha | 1.7 | 1.15 | -| `APIResponseCompression` | `false` | Beta | 1.16 | | +| `APIResponseCompression` | `true` | Beta | 1.16 | | | `APIServerIdentity` | `false` | Alpha | 1.20 | | | `AllowInsecureBackendProxy` | `true` | Beta | 1.17 | | | `AnyVolumeDataSource` | `false` | Alpha | 1.18 | | @@ -135,6 +135,7 @@ different Kubernetes components. | `CSIStorageCapacity` | `true` | Beta | 1.21 | | | `CSIVolumeFSGroupPolicy` | `false` | Alpha | 1.19 | 1.19 | | `CSIVolumeFSGroupPolicy` | `true` | Beta | 1.20 | | +| `CSIVolumeHealth` | `false` | Alpha | 1.21 | | | `ConfigurableFSGroupPolicy` | `false` | Alpha | 1.18 | 1.19 | | `ConfigurableFSGroupPolicy` | `true` | Beta | 1.20 | | | `CronJobControllerV2` | `false` | Alpha | 1.20 | 1.20 | @@ -170,14 +171,13 @@ different Kubernetes components. | `HPAScaleToZero` | `false` | Alpha | 1.16 | | | `HugePageStorageMediumSize` | `false` | Alpha | 1.18 | 1.18 | | `HugePageStorageMediumSize` | `true` | Beta | 1.19 | | +| `IndexedJob` | `false` | Alpha | 1.21 | | | `IngressClassNamespacedParams` | `false` | Alpha | 1.21 | | | `IPv6DualStack` | `false` | Alpha | 1.15 | 1.20 | | `IPv6DualStack` | `true` | Beta | 1.21 | | | `KubeletCredentialProviders` | `false` | Alpha | 1.20 | | -| `KubeletPodResources` | `true` | Alpha | 1.13 | 1.14 | -| `KubeletPodResources` | `true` | Beta | 1.15 | | | `LegacyNodeRoleBehavior` | `false` | Alpha | 1.16 | 1.18 | -| `LegacyNodeRoleBehavior` | `true` | True | 1.19 | | +| `LegacyNodeRoleBehavior` | `true` | True | 1.19 | 1.20 | | `LocalStorageCapacityIsolation` | `false` | Alpha | 1.7 | 1.9 | | `LocalStorageCapacityIsolation` | `true` | Beta | 1.10 | | | `LocalStorageCapacityIsolationFSQuotaMonitoring` | `false` | Alpha | 1.15 | | @@ -187,7 +187,7 @@ different Kubernetes components. | `NamespaceDefaultLabelName` | `true` | Beta | 1.21 | | | `NetworkPolicyEndPort` | `false` | Alpha | 1.21 | | | `NodeDisruptionExclusion` | `false` | Alpha | 1.16 | 1.18 | -| `NodeDisruptionExclusion` | `true` | Beta | 1.19 | | +| `NodeDisruptionExclusion` | `true` | Beta | 1.19 | 1.20 | | `NonPreemptingPriority` | `false` | Alpha | 1.15 | 1.18 | | `NonPreemptingPriority` | `true` | Beta | 1.19 | | | `PodDeletionCost` | `false` | Alpha | 1.21 | | @@ -203,15 +203,13 @@ different Kubernetes components. | `RotateKubeletServerCertificate` | `false` | Alpha | 1.7 | 1.11 | | `RotateKubeletServerCertificate` | `true` | Beta | 1.12 | | | `RunAsGroup` | `true` | Beta | 1.14 | | -| `SCTPSupport` | `false` | Alpha | 1.12 | 1.18 | -| `SCTPSupport` | `true` | Beta | 1.19 | | | `ServerSideApply` | `false` | Alpha | 1.14 | 1.15 | | `ServerSideApply` | `true` | Beta | 1.16 | | | `ServiceInternalTrafficPolicy` | `false` | Alpha | 1.21 | | | `ServiceLBNodePortControl` | `false` | Alpha | 1.20 | | | `ServiceLoadBalancerClass` | `false` | Alpha | 1.21 | | | `ServiceNodeExclusion` | `false` | Alpha | 1.8 | 1.18 | -| `ServiceNodeExclusion` | `true` | Beta | 1.19 | | +| `ServiceNodeExclusion` | `true` | Beta | 1.19 | 1.20 | | `ServiceTopology` | `false` | Alpha | 1.17 | | | `SetHostnameAsFQDN` | `false` | Alpha | 1.19 | 1.19 | | `SetHostnameAsFQDN` | `true` | Beta | 1.20 | | @@ -220,18 +218,20 @@ different Kubernetes components. | `StorageVersionHash` | `false` | Alpha | 1.14 | 1.14 | | `StorageVersionHash` | `true` | Beta | 1.15 | | | `SuspendJob` | `false` | Alpha | 1.21 | | -| `TTLAfterFinished` | `false` | Alpha | 1.12 | | +| `TTLAfterFinished` | `false` | Alpha | 1.12 | 1.20 | +| `TTLAfterFinished` | `false` | Beta | 1.21 | | | `TopologyAwareHints` | `false` | Alpha | 1.21 | | | `TopologyManager` | `false` | Alpha | 1.16 | 1.17 | | `TopologyManager` | `true` | Beta | 1.18 | | | `ValidateProxyRedirects` | `false` | Alpha | 1.12 | 1.13 | | `ValidateProxyRedirects` | `true` | Beta | 1.14 | | +| `VolumeCapacityPriority` | `false` | Alpha | 1.21 | - | | `WarningHeaders` | `true` | Beta | 1.19 | | | `WinDSR` | `false` | Alpha | 1.14 | | | `WinOverlay` | `false` | Alpha | 1.14 | 1.19 | | `WinOverlay` | `true` | Beta | 1.20 | | | `WindowsEndpointSliceProxying` | `false` | Alpha | 1.19 | 1.20 | -| `WindowsEndpointSliceProxying` | `true` | beta | 1.21 | | +| `WindowsEndpointSliceProxying` | `true` | Beta | 1.21 | | {{< /table >}} <!-- @@ -279,7 +279,6 @@ different Kubernetes components. | `CSIPersistentVolume` | `false` | Alpha | 1.9 | 1.9 | | `CSIPersistentVolume` | `true` | Beta | 1.10 | 1.12 | | `CSIPersistentVolume` | `true` | GA | 1.13 | - | -| `CSIVolumeHealth` | `false` | Alpha | 1.21 | - | | `CustomPodDNS` | `false` | Alpha | 1.9 | 1.9 | | `CustomPodDNS` | `true` | Beta| 1.10 | 1.13 | | `CustomPodDNS` | `true` | GA | 1.14 | - | @@ -312,16 +311,17 @@ different Kubernetes components. | `EnableEquivalenceClassCache` | - | Deprecated | 1.15 | - | | `EndpointSlice` | `false` | Alpha | 1.16 | 1.16 | | `EndpointSlice` | `false` | Beta | 1.17 | 1.17 | -| `EndpointSlice` | `true` | Beta | 1.18 | 1.21 | +| `EndpointSlice` | `true` | Beta | 1.18 | 1.20 | | `EndpointSlice` | `true` | GA | 1.21 | - | | `EndpointSliceNodeName` | `false` | Alpha | 1.20 | 1.21 | -| `EndpointSliceNodeName` | `true` | GA | 1.21 | - | +| `EndpointSliceNodeName` | `true` | Beta | 1.18 | 1.20 | | `ExperimentalCriticalPodAnnotation` | `false` | Alpha | 1.5 | 1.12 | | `ExperimentalCriticalPodAnnotation` | `false` | Deprecated | 1.13 | - | | `EvenPodsSpread` | `false` | Alpha | 1.16 | 1.17 | | `EvenPodsSpread` | `true` | Beta | 1.18 | 1.18 | | `EvenPodsSpread` | `true` | GA | 1.19 | - | | `ExecProbeTimeout` | `true` | GA | 1.20 | - | +| `ExternalPolicyForExternalIP` | `true` | GA | 1.18 | - | | `GCERegionalPersistentDisk` | `true` | Beta | 1.10 | 1.12 | | `GCERegionalPersistentDisk` | `true` | GA | 1.13 | - | | `HugePages` | `false` | Alpha | 1.8 | 1.9 | @@ -332,7 +332,6 @@ different Kubernetes components. | `ImmutableEphemeralVolumes` | `false` | Alpha | 1.18 | 1.18 | | `ImmutableEphemeralVolumes` | `true` | Beta | 1.19 | 1.20 | | `ImmutableEphemeralVolumes` | `true` | GA | 1.21 | | -| `IndexedJob` | `false` | Alpha | 1.21 | | | `Initializers` | `false` | Alpha | 1.7 | 1.13 | | `Initializers` | - | Deprecated | 1.14 | - | | `KubeletConfigFile` | `false` | Alpha | 1.8 | 1.9 | @@ -343,11 +342,13 @@ different Kubernetes components. | `KubeletPodResources` | `false` | Alpha | 1.13 | 1.14 | | `KubeletPodResources` | `true` | Beta | 1.15 | | | `KubeletPodResources` | `true` | GA | 1.20 | | +| `LegacyNodeRoleBehavior` | `false` | GA | 1.21 | - | | `MountContainers` | `false` | Alpha | 1.9 | 1.16 | | `MountContainers` | `false` | Deprecated | 1.17 | - | | `MountPropagation` | `false` | Alpha | 1.8 | 1.9 | | `MountPropagation` | `true` | Beta | 1.10 | 1.11 | | `MountPropagation` | `true` | GA | 1.12 | - | +| `NodeDisruptionExclusion` | `true` | GA | 1.21 | - | | `NodeLease` | `false` | Alpha | 1.12 | 1.13 | | `NodeLease` | `true` | Beta | 1.14 | 1.16 | | `NodeLease` | `true` | GA | 1.17 | - | @@ -369,6 +370,7 @@ different Kubernetes components. | `PodShareProcessNamespace` | `true` | Beta | 1.12 | 1.16 | | `PodShareProcessNamespace` | `true` | GA | 1.17 | - | | `RequestManagement` | `false` | Alpha | 1.15 | 1.16 | +| `RequestManagement` | - | Derecated | 1.17 | - | | `ResourceLimitsPriorityFunction` | `false` | Alpha | 1.9 | 1.18 | | `ResourceLimitsPriorityFunction` | - | Deprecated | 1.19 | - | | `ResourceQuotaScopeSelectors` | `false` | Alpha | 1.11 | 1.11 | @@ -392,11 +394,12 @@ different Kubernetes components. | `ServiceAccountIssuerDiscovery` | `true` | Beta | 1.20 | 1.20 | | `ServiceAccountIssuerDiscovery` | `true` | GA | 1.21 | - | | `ServiceAppProtocol` | `false` | Alpha | 1.18 | 1.18 | -| `ServiceAppProtocol` | `true` | Beta | 1.19 | | +| `ServiceAppProtocol` | `true` | Beta | 1.19 | 1.19 | | `ServiceAppProtocol` | `true` | GA | 1.20 | - | | `ServiceLoadBalancerFinalizer` | `false` | Alpha | 1.15 | 1.15 | | `ServiceLoadBalancerFinalizer` | `true` | Beta | 1.16 | 1.16 | | `ServiceLoadBalancerFinalizer` | `true` | GA | 1.17 | - | +| `ServiceNodeExclusion` | `true` | GA | 1.21 | - | | `StartupProbe` | `false` | Alpha | 1.16 | 1.17 | | `StartupProbe` | `true` | Beta | 1.18 | 1.19 | | `StartupProbe` | `true` | GA | 1.20 | - | @@ -404,7 +407,7 @@ different Kubernetes components. | `StorageObjectInUseProtection` | `true` | GA | 1.11 | - | | `StreamingProxyRedirects` | `false` | Beta | 1.5 | 1.5 | | `StreamingProxyRedirects` | `true` | Beta | 1.6 | 1.18 | -| `StreamingProxyRedirects` | - | Deprecated| 1.19 | - | +| `StreamingProxyRedirects` | - | GA | 1.19 | - | | `SupportIPVSProxyMode` | `false` | Alpha | 1.8 | 1.8 | | `SupportIPVSProxyMode` | `false` | Beta | 1.9 | 1.9 | | `SupportIPVSProxyMode` | `true` | Beta | 1.10 | 1.10 | @@ -429,16 +432,15 @@ different Kubernetes components. | `TokenRequestProjection` | `false` | Alpha | 1.11 | 1.11 | | `TokenRequestProjection` | `true` | Beta | 1.12 | 1.19 | | `TokenRequestProjection` | `true` | GA | 1.20 | - | -| `VolumeCapacityPriority` | `false` | Alpha | 1.21 | - | -| `VolumeSnapshotDataSource` | `false` | Alpha | 1.12 | 1.16 | -| `VolumeSnapshotDataSource` | `true` | Beta | 1.17 | 1.19 | -| `VolumeSnapshotDataSource` | `true` | GA | 1.20 | - | | `VolumePVCDataSource` | `false` | Alpha | 1.15 | 1.15 | | `VolumePVCDataSource` | `true` | Beta | 1.16 | 1.17 | | `VolumePVCDataSource` | `true` | GA | 1.18 | - | | `VolumeScheduling` | `false` | Alpha | 1.9 | 1.9 | | `VolumeScheduling` | `true` | Beta | 1.10 | 1.12 | | `VolumeScheduling` | `true` | GA | 1.13 | - | +| `VolumeSnapshotDataSource` | `false` | Alpha | 1.12 | 1.16 | +| `VolumeSnapshotDataSource` | `true` | Beta | 1.17 | 1.19 | +| `VolumeSnapshotDataSource` | `true` | GA | 1.20 | - | | `VolumeSubpath` | `true` | GA | 1.10 | - | | `VolumeSubpathEnvExpansion` | `false` | Alpha | 1.14 | 1.14 | | `VolumeSubpathEnvExpansion` | `true` | Beta | 1.15 | 1.16 | @@ -558,7 +560,7 @@ Each feature gate is designed for enabling/disabling a specific feature: <!-- - `Accelerators`: Enable Nvidia GPU support when using Docker - `AdvancedAuditing`: Enable [advanced auditing](/docs/tasks/debug-application-cluster/audit/#advanced-audit) -- `AffinityInAnnotations`(*deprecated*): Enable setting +- `AffinityInAnnotations`: Enable setting [Pod affinity or anti-affinity](/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity). - `AllowExtTrafficLocalEndpoints`: Enable a service to route external requests to node local endpoints. - `AllowInsecureBackendProxy`: Enable the users to skip TLS verification of @@ -570,7 +572,7 @@ Each feature gate is designed for enabling/disabling a specific feature: --> - `Accelerators`:使用 Docker 时启用 Nvidia GPU 支持。 - `AdvancedAuditing`:启用[高级审计功能](/zh/docs/tasks/debug-application-cluster/audit/#advanced-audit)。 -- `AffinityInAnnotations`( *已弃用* ):启用 [Pod 亲和或反亲和](/zh/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity)。 +- `AffinityInAnnotations`:启用 [Pod 亲和或反亲和](/zh/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity)。 - `AllowExtTrafficLocalEndpoints`:启用服务用于将外部请求路由到节点本地终端。 - `AllowInsecureBackendProxy`:允许用户在执行 Pod 日志访问请求时跳过 TLS 验证。 - `AnyVolumeDataSource`: 允许使用任何自定义的资源来做作为 @@ -830,7 +832,7 @@ Each feature gate is designed for enabling/disabling a specific feature: [downward API](/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information). - `DryRun`: Enable server-side [dry run](/docs/reference/using-api/api-concepts/#dry-run) requests so that validation, merging, and mutation can be tested without committing. -- `DynamicAuditing`(*deprecated*): Used to enable dynamic auditing before v1.19. +- `DynamicAuditing`: Used to enable dynamic auditing before v1.19. --> - `DefaultPodTopologySpread`: 启用 `PodTopologySpread` 调度插件来完成 [默认的调度传播](/zh/docs/concepts/workloads/pods/pod-topology-spread-constraints/#internal-default-constraints). @@ -845,30 +847,30 @@ Each feature gate is designed for enabling/disabling a specific feature: - `DryRun`:启用在服务器端对请求进行 [彩排(Dry Run)](/zh/docs/reference/using-api/api-concepts/#dry-run), 以便测试验证、合并和修改,同时避免提交更改。 -- `DynamicAuditing`( *已弃用* ):在 v1.19 版本前用于启用动态审计。 +- `DynamicAuditing`:在 v1.19 版本前用于启用动态审计。 <!-- - `DynamicKubeletConfig`: Enable the dynamic configuration of kubelet. See [Reconfigure kubelet](/docs/tasks/administer-cluster/reconfigure-kubelet/). - `DynamicProvisioningScheduling`: Extend the default scheduler to be aware of volume topology and handle PV provisioning. This feature is superseded by the `VolumeScheduling` feature completely in v1.12. -- `DynamicVolumeProvisioning`(*deprecated*): Enable the +- `DynamicVolumeProvisioning`: Enable the [dynamic provisioning](/docs/concepts/storage/dynamic-provisioning/) of persistent volumes to Pods. - `EfficientWatchResumption`: Allows for storage-originated bookmark (progress notify) events to be delivered to the users. This is only applied to watch operations. -- `EnableAggregatedDiscoveryTimeout` (*deprecated*): Enable the five second +- `EnableAggregatedDiscoveryTimeout`: Enable the five second timeout on aggregated discovery calls. --> - `DynamicKubeletConfig`:启用 kubelet 的动态配置。请参阅 [重新配置 kubelet](/zh/docs/tasks/administer-cluster/reconfigure-kubelet/)。 - `DynamicProvisioningScheduling`:扩展默认调度器以了解卷拓扑并处理 PV 配置。 此特性已在 v1.12 中完全被 `VolumeScheduling` 特性取代。 -- `DynamicVolumeProvisioning`( *已弃用* ):启用持久化卷到 Pod 的 +- `DynamicVolumeProvisioning`:启用持久化卷到 Pod 的 [动态预配置](/zh/docs/concepts/storage/dynamic-provisioning/)。 - `EfficientWatchResumption`:允许从存储发起的 bookmark(进度通知)事件被 通知到用户。此特性仅适用于 watch 操作。 -- `EnableAggregatedDiscoveryTimeout`( *已弃用* ):对聚集的发现调用启用五秒钟超时设置。 +- `EnableAggregatedDiscoveryTimeout`:对聚集的发现调用启用五秒钟超时设置。 <!-- - `EnableEquivalenceClassCache`: Enable the scheduler to cache equivalence of nodes when scheduling Pods. @@ -936,6 +938,7 @@ Each feature gate is designed for enabling/disabling a specific feature: host mounts, or containers that are privileged or using specific non-namespaced capabilities (e.g. `MKNODE`, `SYS_MODULE` etc.). This should only be enabled if user namespace remapping is enabled in the Docker daemon. +- `ExternalPolicyForExternalIP`: Fix a bug where ExternalTrafficPolicy is not applied to Service ExternalIPs. - `GCERegionalPersistentDisk`: Enable the regional PD feature on GCE. - `GenericEphemeralVolume`: Enables ephemeral, inline volumes that support all features of normal volumes (can be provided by third-party storage vendors, storage capacity tracking, @@ -951,6 +954,7 @@ Each feature gate is designed for enabling/disabling a specific feature: 这适用于使用其他主机名字空间、主机安装的容器,或具有特权或使用特定的非名字空间功能 (例如 MKNODE、SYS_MODULE 等)的容器。 如果在 Docker 守护程序中启用了用户名字空间重新映射,则启用此选项。 +- `ExternalPolicyForExternalIP`: 修复 ExternalPolicyForExternalIP 没有应用于 Service ExternalIPs 的 bug。 - `GCERegionalPersistentDisk`:在 GCE 上启用带地理区域信息的 PD 特性。 - `GenericEphemeralVolume`:启用支持临时的内联卷,这些卷支持普通卷 (可以由第三方存储供应商提供、存储容量跟踪、从快照还原等等)的所有功能。请参见 @@ -989,9 +993,11 @@ Each feature gate is designed for enabling/disabling a specific feature: - `IndexedJob`: Allows the [Job](/docs/concepts/workloads/controllers/job/) controller to manage Pod completions per completion index. - `IngressClassNamespacedParams`: Allow namespace-scoped parameters reference in - `IngressClass` resouce. This feature adds two fields - `Scope` and `Namespace` + `IngressClass` resource. This feature adds two fields - `Scope` and `Namespace` to `IngressClass.spec.parameters`. -- `KubeletConfigFile` (*deprecated*): Enable loading kubelet configuration +- `Initializers`: Allow asynchronous coordination of object creation using the + Initializers admission plugin. +- `KubeletConfigFile`: Enable loading kubelet configuration from a file specified using a config file. See [setting kubelet parameters via a config file](/docs/tasks/administer-cluster/kubelet-config-file/) for more details. @@ -1007,7 +1013,8 @@ Each feature gate is designed for enabling/disabling a specific feature: 以支持 IPv6。 - `IndexedJob`:允许 [Job](/zh/docs/concepts/workloads/controllers/job/) 控制器按每个完成的索引去管理 Pod 完成。 - `IngressClassNamespacedParams`:允许引用命名空间范围的参数引用 `IngressClass`资源。该特性增加了两个字段 —— `Scope` 和 `Namespace` 到 `IngressClass.spec.parameters`。 -- `KubeletConfigFile`(*已弃用*):启用从使用配置文件指定的文件中加载 kubelet 配置。 +- `Initializers`: 使用 Initializers 准入插件允许异步协调对象创建。 +- `KubeletConfigFile`:启用从使用配置文件指定的文件中加载 kubelet 配置。 有关更多详细信息,请参见 [通过配置文件设置 kubelet 参数](/zh/docs/tasks/administer-cluster/kubelet-config-file/)。 - `KubeletCredentialProviders`:允许使用 kubelet exec 凭据提供程序来设置 @@ -1019,7 +1026,7 @@ Each feature gate is designed for enabling/disabling a specific feature: [Support Device Monitoring](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/606-compute-device-assignment/README.md) for more details. - `KubeletPodResourcesGetAllocatable`: Enable the kubelet's pod resources `GetAllocatableResources` functionality. - This API augments the [resource allocation reporting](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/#monitoring-device-plugin-resources) + This API augments the [resource allocation reporting](/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/#monitoring-device-plugin-resources) with informations about the allocatable resources, enabling clients to properly track the free compute resources on a node. - `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 @@ -1027,8 +1034,9 @@ Each feature gate is designed for enabling/disabling a specific feature: --> - `KubeletPodResources`:启用 kubelet 的 Pod 资源 GRPC 端点。更多详细信息,请参见 [支持设备监控](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/compute-device-assignment.md)。 -- `KubeletPodResourcesGetAllocatable`:启用kubelet的pod资源`GetAllocatableResources`功能。该API增强了[资源分配报告](https://kubernetes.io/zh/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/#monitoring-device-plugin-resources) - 包含有关可分配资源的信息,使客户端能够正确跟踪节点上的可用计算资源。 +- `KubeletPodResourcesGetAllocatable`:启用 kubelet 的 pod 资源 `GetAllocatableResources` 功能。 + 该 API 增强了[资源分配报告](/zh/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/#monitoring-device-plugin-resources) + 包含有关可分配资源的信息,使客户端能够正确跟踪节点上的可用计算资源。 - `LegacyNodeRoleBehavior`:禁用此门控时,服务负载均衡器中和节点干扰中的原先行为 会忽略 `node-role.kubernetes.io/master` 标签,使用 `NodeDisruptionExclusion` 和 `ServiceNodeExclusion` 对应特性所提供的标签。 @@ -1048,7 +1056,7 @@ Each feature gate is designed for enabling/disabling a specific feature: based on logarithmic bucketing of pod timestamps. - `MixedProtocolLBService`: Enable using different protocols in the same `LoadBalancer` type Service instance. -- `MountContainers` (*deprecated*): Enable using utility containers on host as +- `MountContainers`: Enable using utility containers on host as the volume mounter. --> - `LocalStorageCapacityIsolation`:允许使用 @@ -1064,7 +1072,7 @@ Each feature gate is designed for enabling/disabling a specific feature: - `LogarithmicScaleDown`:启用Pod的半随机(semi-random)选择,控制器将根据 Pod 时间戳的对数桶按比例缩小去驱逐 Pod。 - `MixedProtocolLBService`:允许在同一 `LoadBalancer` 类型的 Service 实例中使用不同 的协议。 -- `MountContainers`( *已弃用* )`:允许使用主机上的工具容器作为卷挂载程序。 +- `MountContainers`:允许使用主机上的工具容器作为卷挂载程序。 <!-- - `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). @@ -1096,7 +1104,7 @@ Each feature gate is designed for enabling/disabling a specific feature: - `NodeLease`:启用新的 Lease(租期)API 以报告节点心跳,可用作节点运行状况信号。 - `NonPreemptingPriority`:为 PriorityClass 和 Pod 启用 `preemptionPolicy` 选项。 - `PVCProtection`:启用防止仍被某 Pod 使用的 PVC 被删除的特性。 -- `PodDeletionCost`:启用[Pod 删除成本](/zh/docs/content/en/docs/concepts/workloads/controllers/replicaset/#pod-deletion-cost)功能 +- `PodDeletionCost`:启用[Pod 删除成本](/zh/docs/concepts/workloads/controllers/replicaset/#pod-deletion-cost)功能。 该功能使用户可以影响 ReplicaSet 的降序顺序。 - `PersistentLocalVolumes`:允许在 Pod 中使用 `local(本地)`卷类型。 如果请求 `local` 卷,则必须指定 Pod 亲和性属性。 @@ -1115,7 +1123,7 @@ Each feature gate is designed for enabling/disabling a specific feature: a single process namespace between containers running in a pod. More details can be found in [Share Process Namespace between Containers in a Pod](/docs/tasks/configure-pod-container/share-process-namespace/). - `ProbeTerminationGracePeriod`: Enable [setting probe-level - `terminationGracePeriodSeconds`](/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#probe-level-terminationGracePeriodSeconds) + `terminationGracePeriodSeconds`](/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#probe-level-terminationgraceperiodseconds) on pods. See the [enhancement proposal](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2238-liveness-probe-grace-period) for more details. - `ProcMountType`: Enables control over the type proc mounts for containers by setting the `procMount` field of a SecurityContext. @@ -1134,8 +1142,9 @@ Each feature gate is designed for enabling/disabling a specific feature: - `PodShareProcessNamespace`:在 Pod 中启用 `shareProcessNamespace` 的设置, 以便在 Pod 中运行的容器之间共享同一进程名字空间。更多详细信息,请参见 [在 Pod 中的容器间共享同一进程名字空间](/zh/docs/tasks/configure-pod-container/share-process-namespace/)。 -- `ProbeTerminationGracePeriod`:在 Pod 上 启用 [设置探测器级别 `terminationGracePeriodSeconds`](/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#probe-level-terminationGracePeriodSeconds)。 - 有关更多信息,请参见 [enhancement proposal](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2238-liveness-probe-grace-period) for more details. +- `ProbeTerminationGracePeriod`:在 Pod 上 启用 + [设置探测器级别 `terminationGracePeriodSeconds`](/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#probe-level-terminationgraceperiodseconds)。 + 有关更多信息,请参见 [enhancement proposal](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2238-liveness-probe-grace-period)。 - `ProcMountType`:允许容器通过设置 SecurityContext 的 `procMount` 字段来控制 对 proc 文件系统的挂载方式。 - `QOSReserved`:允许在 QoS 级别进行资源预留,以防止处于较低 QoS 级别的 Pod @@ -1146,7 +1155,9 @@ Each feature gate is designed for enabling/disabling a specific feature: <!-- - `RemoveSelfLink`: Deprecates and removes `selfLink` from ObjectMeta and ListMeta. -- `ResourceLimitsPriorityFunction` (*deprecated*): Enable a scheduler priority function that +- `RequestManagement`: Enables managing request concurrency with prioritization and fairness + at each API server. Deprecated by `APIPriorityAndFairness` since 1.17. +- `ResourceLimitsPriorityFunction`: Enable a scheduler priority function that assigns a lowest possible score of 1 to a node that satisfies at least one of the input Pod's cpu and memory limits. The intent is to break ties between nodes with same scores. @@ -1159,7 +1170,9 @@ Each feature gate is designed for enabling/disabling a specific feature: for more details. --> - `RemoveSelfLink`:将 ObjectMeta 和 ListMeta 中的 `selfLink` 字段废弃并删除。 -- `ResourceLimitsPriorityFunction` ( *已弃用* ):启用某调度器优先级函数, +- `RequestManagement`:允许在每个 API 服务器上通过优先级和公平性管理请求并发性。 + 自 1.17 以来已被 `APIPriorityAndFairness` 弃用。 +- `ResourceLimitsPriorityFunction`:启用某调度器优先级函数, 该函数将最低得分 1 指派给至少满足输入 Pod 的 CPU 和内存限制之一的节点, 目的是打破得分相同的节点之间的关联。 - `ResourceQuotaScopeSelectors`:启用资源配额范围选择器。 @@ -1202,11 +1215,11 @@ Each feature gate is designed for enabling/disabling a specific feature: JWKS URLs) for the service account issuer in the API server. See [Configure Service Accounts for Pods](/docs/tasks/configure-pod-container/configure-service-account/#service-account-issuer-discovery) for more details. -- `ServiceAppProtocol`: Enables the `AppProtocol` field on Services and Endpoints. -- `ServiceInternalTrafficPolicy`: Enables the `InternalTrafficPolicy` field on Services -- `ServiceLBNodePortControl`: Enables the `spec.allocateLoadBalancerNodePorts` - field on Services. - `ServiceLoadBalancerClass`: Enables the `LoadBalancerClass` field on Services. See [Specifying class of load balancer implementation](/docs/concepts/services-networking/service/#specifying-class-of-load-balancer-implementation-load-balancer-class) for more details. +- `ServiceAppProtocol`: Enables the `appProtocol` field on Services and Endpoints. +- `ServiceInternalTrafficPolicy`: Enables the `internalTrafficPolicy` field on Services +- `ServiceLBNodePortControl`: Enables the `allocateLoadBalancerNodePorts` field on Services. +- `ServiceLoadBalancerClass`: Enables the `loadBalancerClass` field on Services. See + [Specifying class of load balancer implementation](/docs/concepts/services-networking/service/#load-balancer-class) for more details. - `ServiceLoadBalancerFinalizer`: Enable finalizer protection for Service load balancers. --> - `SCTPSupport`:在 Pod、Service、Endpoints、NetworkPolicy 定义中 @@ -1217,9 +1230,10 @@ Each feature gate is designed for enabling/disabling a specific feature: (颁发者和 JWKS URL)。详情参见 [为 Pod 配置服务账户](/zh/docs/tasks/configure-pod-container/configure-service-account/#service-account-issuer-discovery) 。 - `ServiceAppProtocol`:为 Service 和 Endpoints 启用 `appProtocol` 字段。 -- `ServiceInternalTrafficPolicy`:为服务启用 `InternalTrafficPolicy` 字段。 -- `ServiceLBNodePortControl`:为服务启用 `spec.allocateLoadBalancerNodePorts` 字段。 - `ServiceLoadBalancerClass`: 为服务启用 `LoadBalancerClass` 字段。 有关更多信息,请参见 [负载均衡器类的定义 implementation](/zh/docs/concepts/services-networking/service/#specifying-class-of-load-balancer-implementation-load-balancer-class) for more details. +- `ServiceInternalTrafficPolicy`:为服务启用 `internalTrafficPolicy` 字段。 +- `ServiceLBNodePortControl`:为服务启用 `allocateLoadBalancerNodePorts` 字段。 + `ServiceLoadBalancerClass`: 为服务启用 `loadBalancerClass` 字段。 + 有关更多信息,请参见 [负载均衡器类的定义 implementation](/zh/docs/concepts/services-networking/service/#load-balancer-class)。 - `ServiceLoadBalancerFinalizer`:为服务负载均衡启用终结器(finalizers)保护。 <!-- - `ServiceNodeExclusion`: Enable the exclusion of nodes from load balancers @@ -1272,12 +1286,12 @@ Each feature gate is designed for enabling/disabling a specific feature: <!-- - `SupportIPVSProxyMode`: Enable providing in-cluster service load balancing using IPVS. See [service proxies](/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies) for more details. -- `SupportPodPidsLimit`: Enable the support to limiting PIDs in Pods. - `SupportNodePidsLimit`: Enable the support to limiting PIDs on the Node. The parameter `pid=<number>` in the `--system-reserved` and `--kube-reserved` options can be specified to ensure that the specified number of process IDs will be reserved for the system as a whole and for Kubernetes system daemons respectively. +- `SupportPodPidsLimit`: Enable the support to limiting PIDs in Pods. - `SuspendJob`: Enable support to suspend and resume Jobs. See [the Jobs docs](/docs/concepts/workloads/controllers/job/) for more details. @@ -1287,11 +1301,11 @@ Each feature gate is designed for enabling/disabling a specific feature: --> - `SupportIPVSProxyMode`:启用使用 IPVS 提供内服务负载平衡。更多详细信息,请参见 [服务代理](/zh/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies)。 -- `SupportPodPidsLimit`:启用支持限制 Pod 中的进程 PID。 - `SupportNodePidsLimit`:启用支持,限制节点上的 PID 用量。 `--system-reserved` 和 `--kube-reserved` 中的参数 `pid=<数值>` 可以分别用来 设定为整个系统所预留的进程 ID 个数和为 Kubernetes 系统守护进程预留的进程 ID 个数。 +- `SupportPodPidsLimit`:启用支持限制 Pod 中的进程 PID。 - `SuspendJob`: 启用支持以暂停和恢复作业。 更多详细信息,请参见 [Jobs 文档](zh//docs/concepts/workloads/controllers/job/)。 - `Sysctls`:允许为每个 Pod 设置的名字空间内核参数(sysctls)。 @@ -1332,6 +1346,9 @@ Each feature gate is designed for enabling/disabling a specific feature: - `TopologyManager`:启用一种机制来协调 Kubernetes 不同组件的细粒度硬件资源分配。 详见[控制节点上的拓扑管理策略](/zh/docs/tasks/administer-cluster/topology-manager/)。 <!-- +- `ValidateProxyRedirects`: This flag controls whether the API server should + validate that redirects are only followed to the same host. Only used if the + `StreamingProxyRedirects` flag is enabled. - 'VolumeCapacityPriority`: Enable support for prioritizing nodes in different topologies based on available PV capacity. - `VolumePVCDataSource`: Enable support for specifying an existing PVC as a DataSource. @@ -1340,13 +1357,17 @@ Each feature gate is designed for enabling/disabling a specific feature: enables the usage of [`local`](/docs/concepts/storage/volumes/#local) volume type when used together with the `PersistentLocalVolumes` feature gate. - `VolumeSnapshotDataSource`: Enable volume snapshot data source support. +- `VolumeSubpath`: Allow mounting a subpath of a volume in a container. --> +- `ValidateProxyRedirects`: 这个标志控制 API 服务器是否应该验证只跟随到相同的主机的重定向。 + 仅在启用 `StreamingProxyRedirects` 标志时被使用。 - 'VolumeCapacityPriority`: 基于可用 PV 容量的拓扑,启用对不同节点的优先级支持。 - `VolumePVCDataSource`:启用对将现有 PVC 指定数据源的支持。 - `VolumeScheduling`:启用卷拓扑感知调度,并使 PersistentVolumeClaim(PVC) 绑定能够了解调度决策;当与 PersistentLocalVolumes 特性门控一起使用时, 还允许使用 [`local`](/docs/concepts/storage/volumes/#local) 卷类型。 - `VolumeSnapshotDataSource`:启用卷快照数据源支持。 +- `VolumeSubpath`: 允许在容器中挂载卷的子路径。 <!-- - `VolumeSubpathEnvExpansion`: Enable `subPathExpr` field for expanding environment variables into a `subPath`. From 46e509c4aab1c34634143e8e1a45fec20a0dcb08 Mon Sep 17 00:00:00 2001 From: xoyabc <lxh1031138448@gmail.com> Date: Sat, 29 May 2021 09:01:07 +0800 Subject: [PATCH 185/221] Update basic-stateful-set.md fix the wrong translation --- .../docs/tutorials/stateful-application/basic-stateful-set.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/tutorials/stateful-application/basic-stateful-set.md b/content/zh/docs/tutorials/stateful-application/basic-stateful-set.md index d3717c3e44..0411d9c92e 100644 --- a/content/zh/docs/tutorials/stateful-application/basic-stateful-set.md +++ b/content/zh/docs/tutorials/stateful-application/basic-stateful-set.md @@ -1057,7 +1057,7 @@ the `partition`. Delete the `web-1` Pod. --> -当你改变 `partition` 时,StatefulSet 会自动的更新 `web-2` Pod,这是因为 Pod 的序号小于或等于 `partition`。 +当你改变 `partition` 时,StatefulSet 会自动的更新 `web-2` Pod,这是因为 Pod 的序号大于或等于 `partition`。 删除 `web-1` Pod。 From 1383eb490098d5301aa2f8582072f3ac6bfe9392 Mon Sep 17 00:00:00 2001 From: Jack Wu <wuyang01@inspur.com> Date: Sat, 29 May 2021 10:27:09 +0800 Subject: [PATCH 186/221] Update runtime-class.md --- content/zh/docs/concepts/containers/runtime-class.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/concepts/containers/runtime-class.md b/content/zh/docs/concepts/containers/runtime-class.md index cebe50b63b..c45df4e62b 100644 --- a/content/zh/docs/concepts/containers/runtime-class.md +++ b/content/zh/docs/concepts/containers/runtime-class.md @@ -163,7 +163,7 @@ error message. 如果所指的 RuntimeClass 不存在或者 CRI 无法运行相应的 handler, 那么 pod 将会进入 `Failed` 终止[阶段](/zh/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase)。 你可以查看相应的[事件](/zh/docs/tasks/debug-application-cluster/debug-application-introspection/), -获取出错信息。 +获取执行过程中的错误信息。 <!-- If no `runtimeClassName` is specified, the default RuntimeHandler will be used, which is equivalent From a9fb2d35d0da6a522656d3c3b96c5228c77e5a81 Mon Sep 17 00:00:00 2001 From: Jihoon Seo <jihoon.seo@etri.re.kr> Date: Fri, 28 May 2021 22:16:18 +0900 Subject: [PATCH 187/221] [ko] Update outdated files in dev-1.21-ko.3 (p2) --- content/ko/community/_index.html | 3 +- .../concepts/cluster-administration/addons.md | 2 +- .../concepts/extend-kubernetes/operator.md | 2 ++ .../concepts/overview/what-is-kubernetes.md | 2 +- .../working-with-objects/common-labels.md | 14 ++++---- .../working-with-objects/namespaces.md | 2 +- .../concepts/scheduling-eviction/_index.md | 36 +++++++++++++++++-- .../scheduling-eviction/kube-scheduler.md | 1 - .../scheduling-eviction/pod-overhead.md | 2 +- .../pod-priority-preemption.md | 0 .../resource-bin-packing.md | 2 +- .../scheduler-perf-tuning.md | 2 +- .../concepts/storage/persistent-volumes.md | 4 +-- .../docs/concepts/storage/storage-classes.md | 34 ++++++++++++++++-- .../concepts/workloads/pods/disruptions.md | 4 ++- .../workloads/pods/init-containers.md | 1 - .../pods/pod-topology-spread-constraints.md | 2 +- .../feature-gates.md | 14 +++++--- .../docs/reference/glossary/pod-disruption.md | 19 ++++++++++ 19 files changed, 118 insertions(+), 28 deletions(-) rename content/ko/docs/concepts/{configuration => scheduling-eviction}/pod-priority-preemption.md (100%) create mode 100644 content/ko/docs/reference/glossary/pod-disruption.md diff --git a/content/ko/community/_index.html b/content/ko/community/_index.html index 40bea7b523..0fa8d8658a 100644 --- a/content/ko/community/_index.html +++ b/content/ko/community/_index.html @@ -24,7 +24,8 @@ cid: community <a href="#videos">비디오</a>      <a href="#discuss">토론</a>      <a href="#events">이벤트와 모임들</a>      -<a href="#news">새소식</a> +<a href="#news">새소식</a>      +<a href="/releases">릴리즈</a> </div> <br class="mobile"><br class="mobile"> diff --git a/content/ko/docs/concepts/cluster-administration/addons.md b/content/ko/docs/concepts/cluster-administration/addons.md index 7e67dd604f..270063a737 100644 --- a/content/ko/docs/concepts/cluster-administration/addons.md +++ b/content/ko/docs/concepts/cluster-administration/addons.md @@ -23,7 +23,7 @@ content_type: concept * [CNI-Genie](https://github.com/Huawei-PaaS/CNI-Genie)를 사용하면 쿠버네티스는 Calico, Canal, Flannel, Romana 또는 Weave와 같은 CNI 플러그인을 완벽하게 연결할 수 있다. * [Contiv](https://contiv.github.io)는 다양한 유스케이스와 풍부한 폴리시 프레임워크를 위해 구성 가능한 네트워킹(BGP를 사용하는 네이티브 L3, vxlan을 사용하는 오버레이, 클래식 L2 그리고 Cisco-SDN/ACI)을 제공한다. Contiv 프로젝트는 완전히 [오픈소스](https://github.com/contiv)이다. [인스톨러](https://github.com/contiv/install)는 kubeadm을 이용하거나, 그렇지 않은 경우에 대해서도 설치 옵션을 모두 제공한다. * [Contrail](https://www.juniper.net/us/en/products-services/sdn/contrail/contrail-networking/)은 [Tungsten Fabric](https://tungsten.io)을 기반으로 하며, 오픈소스이고, 멀티 클라우드 네트워크 가상화 및 폴리시 관리 플랫폼이다. Contrail과 Tungsten Fabric은 쿠버네티스, OpenShift, OpenStack 및 Mesos와 같은 오케스트레이션 시스템과 통합되어 있으며, 가상 머신, 컨테이너/파드 및 베어 메탈 워크로드에 대한 격리 모드를 제공한다. -* [Flannel](https://github.com/coreos/flannel/blob/master/Documentation/kubernetes.md)은 쿠버네티스와 함께 사용할 수 있는 오버레이 네트워크 제공자이다. +* [Flannel](https://github.com/flannel-io/flannel#deploying-flannel-manually)은 쿠버네티스와 함께 사용할 수 있는 오버레이 네트워크 제공자이다. * [Knitter](https://github.com/ZTE/Knitter/)는 쿠버네티스 파드에서 여러 네트워크 인터페이스를 지원하는 플러그인이다. * [Multus](https://github.com/Intel-Corp/multus-cni)는 쿠버네티스에서 SRIOV, DPDK, OVS-DPDK 및 VPP 기반 워크로드 외에 모든 CNI 플러그인(예: Calico, Cilium, Contiv, Flannel)을 지원하기 위해 쿠버네티스에서 다중 네트워크 지원을 위한 멀티 플러그인이다. * [OVN-Kubernetes](https://github.com/ovn-org/ovn-kubernetes/)는 Open vSwitch(OVS) 프로젝트에서 나온 가상 네트워킹 구현인 [OVN(Open Virtual Network)](https://github.com/ovn-org/ovn/)을 기반으로 하는 쿠버네티스용 네트워킹 제공자이다. OVN-Kubernetes는 OVS 기반 로드 밸런싱과 네트워크 폴리시 구현을 포함하여 쿠버네티스용 오버레이 기반 네트워킹 구현을 제공한다. diff --git a/content/ko/docs/concepts/extend-kubernetes/operator.md b/content/ko/docs/concepts/extend-kubernetes/operator.md index 21b3183b99..a0959f83dc 100644 --- a/content/ko/docs/concepts/extend-kubernetes/operator.md +++ b/content/ko/docs/concepts/extend-kubernetes/operator.md @@ -113,11 +113,13 @@ kubectl edit SampleDB/example-database # 일부 설정을 수동으로 변경하 {{% thirdparty-content %}} +* [Charmed Operator Framework](https://juju.is/) * [kubebuilder](https://book.kubebuilder.io/) 사용하기 * [KUDO](https://kudo.dev/) (Kubernetes Universal Declarative Operator) * 웹훅(WebHook)과 함께 [Metacontroller](https://metacontroller.app/)를 사용하여 직접 구현하기 * [오퍼레이터 프레임워크](https://operatorframework.io) +* [shell-operator](https://github.com/flant/shell-operator) ## {{% heading "whatsnext" %}} diff --git a/content/ko/docs/concepts/overview/what-is-kubernetes.md b/content/ko/docs/concepts/overview/what-is-kubernetes.md index 344c266d1e..5d2ef83d76 100644 --- a/content/ko/docs/concepts/overview/what-is-kubernetes.md +++ b/content/ko/docs/concepts/overview/what-is-kubernetes.md @@ -21,7 +21,7 @@ sitemap: <!-- body --> 쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장가능한 오픈소스 플랫폼이다. 쿠버네티스는 선언적 구성과 자동화를 모두 용이하게 해준다. 쿠버네티스는 크고, 빠르게 성장하는 생태계를 가지고 있다. 쿠버네티스 서비스, 기술 지원 및 도구는 어디서나 쉽게 이용할 수 있다. -쿠버네티스란 명칭은 키잡이(helmsman)나 파일럿을 뜻하는 그리스어에서 유래했다. 구글이 2014년에 쿠버네티스 프로젝트를 오픈소스화했다. 쿠버네티스는 프로덕션 워크로드를 대규모로 운영하는 [15년 이상의 구글 경험](/blog/2015/04/borg-predecessor-to-kubernetes/)과 커뮤니티의 최고의 아이디어와 적용 사례가 결합되어 있다. +쿠버네티스란 명칭은 키잡이(helmsman)나 파일럿을 뜻하는 그리스어에서 유래했다. K8s라는 표기는 "K"와 "s"와 그 사이에 있는 8글자를 나타내는 약식 표기이다. 구글이 2014년에 쿠버네티스 프로젝트를 오픈소스화했다. 쿠버네티스는 프로덕션 워크로드를 대규모로 운영하는 [15년 이상의 구글 경험](/blog/2015/04/borg-predecessor-to-kubernetes/)과 커뮤니티의 최고의 아이디어와 적용 사례가 결합되어 있다. ## 여정 돌아보기 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 09f70af30c..c19ec0b3a9 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 @@ -32,14 +32,15 @@ kubectl과 대시보드와 같은 많은 도구들로 쿠버네티스 오브젝 레이블을 최대한 활용하려면 모든 리소스 오브젝트에 적용해야 한다. -| Key | Description | Example | Type | +| 키 | 설명 | 예시 | 타입 | | ----------------------------------- | --------------------- | -------- | ---- | | `app.kubernetes.io/name` | 애플리케이션 이름 | `mysql` | 문자열 | | `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` | 문자열 | -| `app.kubernetes.io/managed-by` | 애플리케이션의 작동을 관리하는데 사용되는 도구 | `helm` | 문자열 | +| `app.kubernetes.io/managed-by` | 애플리케이션의 작동을 관리하는 데 사용되는 도구 | `helm` | 문자열 | +| `app.kubernetes.io/created-by` | 이 리소스를 만든 컨트롤러/사용자 | `controller-manager` | 문자열 | 위 레이블의 실제 예시는 다음 스테이트풀셋 오브젝트를 고려한다. @@ -54,6 +55,7 @@ metadata: app.kubernetes.io/component: database app.kubernetes.io/part-of: wordpress app.kubernetes.io/managed-by: helm + app.kubernetes.io/created-by: controller-manager ``` ## 애플리케이션과 애플리케이션 인스턴스 @@ -76,7 +78,7 @@ WordPress가 여러 번 설치되어 각각 서로 다른 웹사이트를 서비 `Deployment` 와 `Service` 오브젝트를 통해 배포된 단순한 스테이트리스 서비스의 경우를 보자. 다음 두 식별자는 레이블을 가장 간단한 형태로 사용하는 방법을 나타낸다. -`Deployment` 는 애플리케이션을 실행하는 파드를 감시하는데 사용한다. +`Deployment` 는 애플리케이션을 실행하는 파드를 감시하는 데 사용한다. ```yaml apiVersion: apps/v1 kind: Deployment @@ -102,9 +104,9 @@ metadata: Helm을 이용해서 데이터베이스(MySQL)을 이용하는 웹 애플리케이션(WordPress)을 설치한 것과 같이 좀 더 복잡한 애플리케이션을 고려할 수 있다. -다음 식별자는 이 애플리케이션을 배포하는데 사용하는 오브젝트의 시작을 보여준다. +다음 식별자는 이 애플리케이션을 배포하는 데 사용하는 오브젝트의 시작을 보여준다. -WordPress를 배포하는데 다음과 같이 `Deployment` 로 시작한다. +WordPress를 배포하는 데 다음과 같이 `Deployment` 로 시작한다. ```yaml apiVersion: apps/v1 @@ -152,7 +154,7 @@ metadata: ... ``` -`Service` 는 WordPress의 일부로 MySQL을 노출하는데 이용한다. +`Service` 는 WordPress의 일부로 MySQL을 노출하는 데 이용한다. ```yaml apiVersion: v1 diff --git a/content/ko/docs/concepts/overview/working-with-objects/namespaces.md b/content/ko/docs/concepts/overview/working-with-objects/namespaces.md index ef75f4f081..049b30a1f7 100644 --- a/content/ko/docs/concepts/overview/working-with-objects/namespaces.md +++ b/content/ko/docs/concepts/overview/working-with-objects/namespaces.md @@ -35,7 +35,7 @@ weight: 30 [네임스페이스 관리자 가이드 문서](/docs/tasks/administer-cluster/namespaces/)에 기술되어 있다. {{< note >}} - 쿠버네티스 시스템 네임스페이스용으로 예약되어 있으므로, `kube-` 접두사로 네임스페이스를 생성하지 않는다. + `kube-` 접두사로 시작하는 네임스페이스는 쿠버네티스 시스템용으로 예약되어 있으므로, 사용자는 이러한 네임스페이스를 생성하지 않는다. {{< /note >}} ### 네임스페이스 조회 diff --git a/content/ko/docs/concepts/scheduling-eviction/_index.md b/content/ko/docs/concepts/scheduling-eviction/_index.md index 5cd57c3a29..5ae3f5822e 100644 --- a/content/ko/docs/concepts/scheduling-eviction/_index.md +++ b/content/ko/docs/concepts/scheduling-eviction/_index.md @@ -1,7 +1,37 @@ --- -title: "스케줄링과 축출(eviction)" +title: "스케줄링, 선점(Preemption), 축출(Eviction)" weight: 90 +content_type: concept description: > - 쿠버네티스에서, 스케줄링은 kubelet이 파드를 실행할 수 있도록 파드가 노드와 일치하는지 확인하는 것을 말한다. - 축출은 리소스가 부족한 노드에서 하나 이상의 파드를 사전에 장애로 처리하는 프로세스이다. + 쿠버네티스에서, 스케줄링은 kubelet이 파드를 실행할 수 있도록 + 파드를 노드에 할당하는 것을 말한다. + 선점은 우선순위가 높은 파드가 노드에 스케줄될 수 있도록 + 우선순위가 낮은 파드를 종료시키는 과정을 말한다. + 축출은 리소스가 부족한 노드에서 하나 이상의 파드를 사전에 종료시키는 프로세스이다. +no_list: true --- + +쿠버네티스에서, 스케줄링은 {{<glossary_tooltip text="kubelet" term_id="kubelet">}}이 파드를 실행할 수 있도록 +{{<glossary_tooltip text="파드" term_id="pod">}}를 +{{<glossary_tooltip text="노드" term_id="node">}}에 할당하는 것을 말한다. +선점은 {{<glossary_tooltip text="우선순위" term_id="pod-priority">}}가 높은 파드가 노드에 스케줄될 수 있도록 +우선순위가 낮은 파드를 종료시키는 과정을 말한다. +축출은 리소스가 부족한 노드에서 하나 이상의 파드를 사전에 종료시키는 프로세스이다. + +## 스케줄링 + +* [쿠버네티스 스케줄러](/ko/docs/concepts/scheduling-eviction/kube-scheduler/) +* [노드에 파드 할당하기](/ko/docs/concepts/scheduling-eviction/assign-pod-node/) +* [파드 오버헤드](/ko/docs/concepts/scheduling-eviction/pod-overhead/) +* [테인트(Taints)와 톨러레이션(Tolerations)](/ko/docs/concepts/scheduling-eviction/taint-and-toleration/) +* [스케줄링 프레임워크](/docs/concepts/scheduling-eviction/scheduling-framework/) +* [스케줄러 성능 튜닝](/ko/docs/concepts/scheduling-eviction/scheduler-perf-tuning/) +* [확장된 리소스를 위한 리소스 빈 패킹(bin packing)](/ko/docs/concepts/scheduling-eviction/resource-bin-packing/) + +## 파드 중단(disruption) + +{{<glossary_definition term_id="pod-disruption" length="all">}} + +* [파드 우선순위와 선점](/docs/concepts/scheduling-eviction/pod-priority-preemption/) +* [노드-압박 축출](/docs/concepts/scheduling-eviction/node-pressure-eviction/) +* [API를 이용한 축출](/docs/concepts/scheduling-eviction/api-eviction/) diff --git a/content/ko/docs/concepts/scheduling-eviction/kube-scheduler.md b/content/ko/docs/concepts/scheduling-eviction/kube-scheduler.md index 86e67978c2..8c17269a64 100644 --- a/content/ko/docs/concepts/scheduling-eviction/kube-scheduler.md +++ b/content/ko/docs/concepts/scheduling-eviction/kube-scheduler.md @@ -80,7 +80,6 @@ _스코어링_ 단계에서 스케줄러는 목록에 남아있는 노드의 순 1. [스케줄링 정책](/ko/docs/reference/scheduling/config/#프로파일)을 사용하면 필터링을 위한 _단정(Predicates)_ 및 스코어링을 위한 _우선순위(Priorities)_ 를 구성할 수 있다. 1. [스케줄링 프로파일](/ko/docs/reference/scheduling/config/#프로파일)을 사용하면 `QueueSort`, `Filter`, `Score`, `Bind`, `Reserve`, `Permit` 등의 다른 스케줄링 단계를 구현하는 플러그인을 구성할 수 있다. 다른 프로파일을 실행하도록 kube-scheduler를 구성할 수도 있다. - ## {{% heading "whatsnext" %}} * [스케줄러 성능 튜닝](/ko/docs/concepts/scheduling-eviction/scheduler-perf-tuning/)에 대해 읽기 diff --git a/content/ko/docs/concepts/scheduling-eviction/pod-overhead.md b/content/ko/docs/concepts/scheduling-eviction/pod-overhead.md index 0f474338d9..b0da80ceae 100644 --- a/content/ko/docs/concepts/scheduling-eviction/pod-overhead.md +++ b/content/ko/docs/concepts/scheduling-eviction/pod-overhead.md @@ -1,7 +1,7 @@ --- title: 파드 오버헤드 content_type: concept -weight: 20 +weight: 30 --- <!-- overview --> diff --git a/content/ko/docs/concepts/configuration/pod-priority-preemption.md b/content/ko/docs/concepts/scheduling-eviction/pod-priority-preemption.md similarity index 100% rename from content/ko/docs/concepts/configuration/pod-priority-preemption.md rename to content/ko/docs/concepts/scheduling-eviction/pod-priority-preemption.md diff --git a/content/ko/docs/concepts/scheduling-eviction/resource-bin-packing.md b/content/ko/docs/concepts/scheduling-eviction/resource-bin-packing.md index d11b7fe2ae..34ff6f3108 100644 --- a/content/ko/docs/concepts/scheduling-eviction/resource-bin-packing.md +++ b/content/ko/docs/concepts/scheduling-eviction/resource-bin-packing.md @@ -5,7 +5,7 @@ title: 확장된 리소스를 위한 리소스 빈 패킹(bin packing) content_type: concept -weight: 30 +weight: 80 --- <!-- overview --> diff --git a/content/ko/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md b/content/ko/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md index 9e049cd348..6be3e204c8 100644 --- a/content/ko/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md +++ b/content/ko/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md @@ -3,7 +3,7 @@ title: 스케줄러 성능 튜닝 content_type: concept -weight: 80 +weight: 100 --- <!-- overview --> diff --git a/content/ko/docs/concepts/storage/persistent-volumes.md b/content/ko/docs/concepts/storage/persistent-volumes.md index 3a85139cd2..c70b7413ad 100644 --- a/content/ko/docs/concepts/storage/persistent-volumes.md +++ b/content/ko/docs/concepts/storage/persistent-volumes.md @@ -540,11 +540,11 @@ spec: ### 접근 모드 -클레임은 특정 접근 모드로 저장소를 요청할 때 볼륨과 동일한 규칙을 사용한다. +클레임은 특정 접근 모드로 저장소를 요청할 때 [볼륨과 동일한 규칙](#접근-모드)을 사용한다. ### 볼륨 모드 -클레임은 볼륨과 동일한 규칙을 사용하여 파일시스템 또는 블록 장치로 볼륨을 사용함을 나타낸다. +클레임은 [볼륨과 동일한 규칙](#볼륨-모드)을 사용하여 파일시스템 또는 블록 장치로 볼륨을 사용함을 나타낸다. ### 리소스 diff --git a/content/ko/docs/concepts/storage/storage-classes.md b/content/ko/docs/concepts/storage/storage-classes.md index 94577ca182..0bec67ef8a 100644 --- a/content/ko/docs/concepts/storage/storage-classes.md +++ b/content/ko/docs/concepts/storage/storage-classes.md @@ -149,9 +149,9 @@ CSI | 1.14 (alpha), 1.16 (beta) ### 볼륨 바인딩 모드 `volumeBindingMode` 필드는 [볼륨 바인딩과 동적 -프로비저닝](/ko/docs/concepts/storage/persistent-volumes/#프로비저닝)의 시작 시기를 제어한다. +프로비저닝](/ko/docs/concepts/storage/persistent-volumes/#프로비저닝)의 시작 시기를 제어한다. 설정되어 있지 않으면, `Immediate` 모드가 기본으로 사용된다. -기본적으로, `Immediate` 모드는 퍼시스턴트볼륨클레임이 생성되면 볼륨 +`Immediate` 모드는 퍼시스턴트볼륨클레임이 생성되면 볼륨 바인딩과 동적 프로비저닝이 즉시 발생하는 것을 나타낸다. 토폴로지 제약이 있고 클러스터의 모든 노드에서 전역적으로 접근할 수 없는 스토리지 백엔드의 경우, 파드의 스케줄링 요구 사항에 대한 지식 없이 퍼시스턴트볼륨이 @@ -183,6 +183,36 @@ CSI | 1.14 (alpha), 1.16 (beta) 사전에 생성된 PV에서도 지원되지만, 지원되는 토폴로지 키와 예시를 보려면 해당 CSI 드라이버에 대한 문서를 본다. +{{< note >}} + `waitForFirstConsumer`를 사용한다면, 노드 어피니티를 지정하기 위해서 파드 스펙에 `nodeName`을 사용하지는 않아야 한다. + 만약 `nodeName`을 사용한다면, 스케줄러가 바이패스되고 PVC가 `pending` 상태로 있을 것이다. + + 대신, 아래와 같이 호스트네임을 이용하는 노드셀렉터를 사용할 수 있다. +{{< /note >}} + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: task-pv-pod +spec: + nodeSelector: + kubernetes.io/hostname: kube-01 + volumes: + - name: task-pv-storage + persistentVolumeClaim: + claimName: task-pv-claim + containers: + - name: task-pv-container + image: nginx + ports: + - containerPort: 80 + name: "http-server" + volumeMounts: + - mountPath: "/usr/share/nginx/html" + name: task-pv-storage +``` + ### 허용된 토폴로지 클러스터 운영자가 `WaitForFirstConsumer` 볼륨 바인딩 모드를 지정하면, 대부분의 상황에서 diff --git a/content/ko/docs/concepts/workloads/pods/disruptions.md b/content/ko/docs/concepts/workloads/pods/disruptions.md index 56244fae26..02730d4306 100644 --- a/content/ko/docs/concepts/workloads/pods/disruptions.md +++ b/content/ko/docs/concepts/workloads/pods/disruptions.md @@ -79,13 +79,15 @@ weight: 60 ([다중 영역 클러스터](/docs/setup/multiple-zones)를 이용한다면)에 애플리케이션을 분산해야 한다. -자발적 중단의 빈도는 다양하다. 기본적인 쿠버네티스 클러스터에서는 자발적인 운영 중단이 전혀 없다. +자발적 중단의 빈도는 다양하다. 기본적인 쿠버네티스 클러스터에서는 자동화된 자발적 중단은 발생하지 않는다(사용자가 지시한 자발적 중단만 발생한다). 그러나 클러스터 관리자 또는 호스팅 공급자가 자발적 중단이 발생할 수 있는 일부 부가 서비스를 운영할 수 있다. 예를 들어 노드 소프트웨어의 업데이트를 출시하는 경우 자발적 중단이 발생할 수 있다. 또한 클러스터(노드) 오토스케일링의 일부 구현에서는 단편화를 제거하고 노드의 효율을 높이는 과정에서 자발적 중단을 야기할 수 있다. 클러스터 관리자 또는 호스팅 공급자는 예측 가능한 자발적 중단 수준에 대해 문서화해야 한다. +파드 스펙 안에 [프라이어리티클래스 사용하기](/ko/docs/concepts/configuration/pod-priority-preemption/)와 같은 특정 환경설정 옵션 +또한 자발적(+ 비자발적) 중단을 유발할 수 있다. ## 파드 disruption budgets diff --git a/content/ko/docs/concepts/workloads/pods/init-containers.md b/content/ko/docs/concepts/workloads/pods/init-containers.md index b7a1241fc2..c8c7055408 100644 --- a/content/ko/docs/concepts/workloads/pods/init-containers.md +++ b/content/ko/docs/concepts/workloads/pods/init-containers.md @@ -326,6 +326,5 @@ myapp-pod 1/1 Running 0 9m ## {{% heading "whatsnext" %}} - * [초기화 컨테이너를 가진 파드 생성하기](/ko/docs/tasks/configure-pod-container/configure-pod-initialization/#초기화-컨테이너를-갖는-파드-생성) * [초기화 컨테이너 디버깅](/ko/docs/tasks/debug-application-cluster/debug-init-containers/) 알아보기 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 9bb8cfba78..2601f5c871 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 @@ -13,7 +13,7 @@ obsolete --> 사용자는 _토폴로지 분배 제약 조건_ 을 사용해서 지역, 영역, 노드 그리고 기타 사용자-정의 토폴로지 도메인과 같이 장애-도메인으로 설정된 클러스터에 걸쳐 파드가 분산되는 방식을 제어할 수 있다. 이를 통해 고가용성뿐만 아니라, 효율적인 리소스 활용의 목적을 이루는 데 도움이 된다. {{< note >}} -v1.19 이전 버전의 쿠버네티스에서는 파드 토폴로지 분배 제약조건을 사용하려면 +v1.18 이전 버전의 쿠버네티스에서는 파드 토폴로지 분배 제약조건을 사용하려면 [API 서버](/ko/docs/concepts/overview/components/#kube-apiserver)와 [스케줄러](/docs/reference/generated/kube-scheduler/)에서 `EvenPodsSpread`[기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 diff --git a/content/ko/docs/reference/command-line-tools-reference/feature-gates.md b/content/ko/docs/reference/command-line-tools-reference/feature-gates.md index 6040ba514b..a658d58497 100644 --- a/content/ko/docs/reference/command-line-tools-reference/feature-gates.md +++ b/content/ko/docs/reference/command-line-tools-reference/feature-gates.md @@ -132,7 +132,7 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능 | `IPv6DualStack` | `true` | 베타 | 1.21 | | | `KubeletCredentialProviders` | `false` | 알파 | 1.20 | | | `LegacyNodeRoleBehavior` | `false` | 알파 | 1.16 | 1.18 | -| `LegacyNodeRoleBehavior` | `true` | 베타 | 1.19 | | +| `LegacyNodeRoleBehavior` | `true` | 베타 | 1.19 | 1.20 | | `LocalStorageCapacityIsolation` | `false` | 알파 | 1.7 | 1.9 | | `LocalStorageCapacityIsolation` | `true` | 베타 | 1.10 | | | `LocalStorageCapacityIsolationFSQuotaMonitoring` | `false` | 알파 | 1.15 | | @@ -142,7 +142,7 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능 | `NamespaceDefaultLabelName` | `true` | 베타 | 1.21 | | | `NetworkPolicyEndPort` | `false` | 알파 | 1.21 | | | `NodeDisruptionExclusion` | `false` | 알파 | 1.16 | 1.18 | -| `NodeDisruptionExclusion` | `true` | 베타 | 1.19 | | +| `NodeDisruptionExclusion` | `true` | 베타 | 1.19 | 1.20 | | `NonPreemptingPriority` | `false` | 알파 | 1.15 | 1.18 | | `NonPreemptingPriority` | `true` | 베타 | 1.19 | | | `PodDeletionCost` | `false` | 알파 | 1.21 | | @@ -164,7 +164,7 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능 | `ServiceLBNodePortControl` | `false` | 알파 | 1.20 | | | `ServiceLoadBalancerClass` | `false` | 알파 | 1.21 | | | `ServiceNodeExclusion` | `false` | 알파 | 1.8 | 1.18 | -| `ServiceNodeExclusion` | `true` | 베타 | 1.19 | | +| `ServiceNodeExclusion` | `true` | 베타 | 1.19 | 1.20 | | `ServiceTopology` | `false` | 알파 | 1.17 | | | `SetHostnameAsFQDN` | `false` | 알파 | 1.19 | 1.19 | | `SetHostnameAsFQDN` | `true` | 베타 | 1.20 | | @@ -173,7 +173,8 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능 | `StorageVersionHash` | `false` | 알파 | 1.14 | 1.14 | | `StorageVersionHash` | `true` | 베타 | 1.15 | | | `SuspendJob` | `false` | 알파 | 1.21 | | -| `TTLAfterFinished` | `false` | 알파 | 1.12 | | +| `TTLAfterFinished` | `false` | 알파 | 1.12 | 1.20 | +| `TTLAfterFinished` | `true` | 베타 | 1.21 | | | `TopologyAwareHints` | `false` | 알파 | 1.21 | | | `TopologyManager` | `false` | 알파 | 1.16 | 1.17 | | `TopologyManager` | `true` | 베타 | 1.18 | | @@ -266,6 +267,7 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능 | `EvenPodsSpread` | `true` | 베타 | 1.18 | 1.18 | | `EvenPodsSpread` | `true` | GA | 1.19 | - | | `ExecProbeTimeout` | `true` | GA | 1.20 | - | +| `ExternalPolicyForExternalIP` | `true` | GA | 1.18 | - | | `GCERegionalPersistentDisk` | `true` | 베타 | 1.10 | 1.12 | | `GCERegionalPersistentDisk` | `true` | GA | 1.13 | - | | `HugePages` | `false` | 알파 | 1.8 | 1.9 | @@ -286,11 +288,13 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능 | `KubeletPodResources` | `false` | 알파 | 1.13 | 1.14 | | `KubeletPodResources` | `true` | 베타 | 1.15 | | | `KubeletPodResources` | `true` | GA | 1.20 | | +| `LegacyNodeRoleBehavior` | `false` | GA | 1.21 | - | | `MountContainers` | `false` | 알파 | 1.9 | 1.16 | | `MountContainers` | `false` | 사용중단 | 1.17 | - | | `MountPropagation` | `false` | 알파 | 1.8 | 1.9 | | `MountPropagation` | `true` | 베타 | 1.10 | 1.11 | | `MountPropagation` | `true` | GA | 1.12 | - | +| `NodeDisruptionExclusion` | `true` | GA | 1.21 | - | | `NodeLease` | `false` | 알파 | 1.12 | 1.13 | | `NodeLease` | `true` | 베타 | 1.14 | 1.16 | | `NodeLease` | `true` | GA | 1.17 | - | @@ -341,6 +345,7 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능 | `ServiceLoadBalancerFinalizer` | `false` | 알파 | 1.15 | 1.15 | | `ServiceLoadBalancerFinalizer` | `true` | 베타 | 1.16 | 1.16 | | `ServiceLoadBalancerFinalizer` | `true` | GA | 1.17 | - | +| `ServiceNodeExclusion` | `true` | GA | 1.21 | - | | `StartupProbe` | `false` | 알파 | 1.16 | 1.17 | | `StartupProbe` | `true` | 베타 | 1.18 | 1.19 | | `StartupProbe` | `true` | GA | 1.20 | - | @@ -636,6 +641,7 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능 권한이 있는 컨테이너 또는 특정 비-네임스페이스(non-namespaced) 기능(예: `MKNODE`, `SYS_MODULE` 등)을 사용하는 컨테이너를 위한 것이다. 도커 데몬에서 사용자 네임스페이스 재 매핑이 활성화된 경우에만 활성화해야 한다. +- `ExternalPolicyForExternalIP`: ExternalTrafficPolicy가 서비스(Service) ExternalIP에 적용되지 않는 버그를 수정한다. - `GCERegionalPersistentDisk`: GCE에서 지역 PD 기능을 활성화한다. - `GenericEphemeralVolume`: 일반 볼륨의 모든 기능을 지원하는 임시, 인라인 볼륨을 활성화한다(타사 스토리지 공급 업체, 스토리지 용량 추적, 스냅샷으로부터 복원 diff --git a/content/ko/docs/reference/glossary/pod-disruption.md b/content/ko/docs/reference/glossary/pod-disruption.md new file mode 100644 index 0000000000..93a473035c --- /dev/null +++ b/content/ko/docs/reference/glossary/pod-disruption.md @@ -0,0 +1,19 @@ +--- +id: pod-disruption +title: 파드 중단(Disruption) +full_link: /ko/docs/concepts/workloads/pods/disruptions/ +date: 2021-05-12 +short_description: > + 노드에 있는 파드가 자발적 또는 비자발적으로 종료되는 절차 + +aka: +related: + - pod + - container +tags: + - operation +--- + +[파드 중단](/ko/docs/concepts/workloads/pods/disruptions/)은 노드에 있는 파드가 자발적 또는 비자발적으로 종료되는 절차이다. + +자발적 중단은 애플리케이션 소유자 또는 클러스터 관리자가 의도적으로 시작한다. 비자발적 중단은 의도하지 않은 것이며, 노드의 리소스 부족과 같은 피할 수 없는 문제 또는 우발적인 삭제로 인해 트리거될 수 있다. From 70d80a89e650f18341cc48ff4c27b9f11db8935d Mon Sep 17 00:00:00 2001 From: Jihoon Seo <jihoon.seo@etri.re.kr> Date: Sat, 29 May 2021 22:17:09 +0900 Subject: [PATCH 188/221] [ko] Update outdated files in dev-1.21-ko.3 (p3) --- .../kube-proxy.md | 137 +++++++++++++++++- .../ko/docs/reference/kubectl/cheatsheet.md | 4 + .../ko/docs/reference/scheduling/policies.md | 14 -- .../setup/best-practices/cluster-large.md | 6 +- 4 files changed, 144 insertions(+), 17 deletions(-) diff --git a/content/ko/docs/reference/command-line-tools-reference/kube-proxy.md b/content/ko/docs/reference/command-line-tools-reference/kube-proxy.md index bd930180cd..eab89638db 100644 --- a/content/ko/docs/reference/command-line-tools-reference/kube-proxy.md +++ b/content/ko/docs/reference/command-line-tools-reference/kube-proxy.md @@ -42,6 +42,20 @@ kube-proxy [flags] </colgroup> <tbody> +<tr> +<td colspan="2">--add-dir-header</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>true로 되어 있으면, 로그 메시지의 헤더에 파일 디렉터리를 기재한다.</p></td> +</tr> + +<tr> +<td colspan="2">--alsologtostderr</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>로그를 파일뿐만 아니라 표준 에러(standard error)로도 출력한다.</p></td> +</tr> + <tr> <td colspan="2">--azure-container-registry-config string</td> </tr> @@ -63,6 +77,13 @@ kube-proxy [flags] <td></td><td style="line-height: 130%; word-wrap: break-word;"><p>true인 경우 kube-proxy는 포트 바인딩 실패를 치명적인 것으로 간주하고 종료한다.</p></td> </tr> +<tr> +<td colspan="2">--boot-id-file string     기본값: "/proc/sys/kernel/random/boot_id"</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>boot-id를 위해 확인할 파일 목록(쉼표로 분리). 가장 먼저 발견되는 항목을 사용한다.</p></td> +</tr> + <tr> <td colspan="2">--cleanup</td> </tr> @@ -70,6 +91,20 @@ kube-proxy [flags] <td></td><td style="line-height: 130%; word-wrap: break-word;"><p>true인 경우 iptables 및 ipvs 규칙을 제거하고 종료한다.</p></td> </tr> +<tr> +<td colspan="2">--cloud-provider-gce-l7lb-src-cidrs cidrs     기본값: 130.211.0.0/22,35.191.0.0/16</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>GCE 방화벽에서, L7 로드밸런싱 트래픽 프록시와 헬스 체크를 위해 개방할 CIDR 목록</p></td> +</tr> + +<tr> +<td colspan="2">--cloud-provider-gce-lb-src-cidrs cidrs     기본값: 130.211.0.0/22,209.85.152.0/22,209.85.204.0/22,35.191.0.0/16</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>GCE 방화벽에서, L4 로드밸런싱 트래픽 프록시와 헬스 체크를 위해 개방할 CIDR 목록</p></td> +</tr> + <tr> <td colspan="2">--cluster-cidr string</td> </tr> @@ -119,6 +154,20 @@ kube-proxy [flags] <td></td><td style="line-height: 130%; word-wrap: break-word;"><p>설정된 TCP 연결에 대한 유휴시간 초과(값이 0이면 그대로 유지)</p></td> </tr> +<tr> +<td colspan="2">--default-not-ready-toleration-seconds int     기본값: 300</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>notReady:NoExecute 상태에 대한 톨러레이션(toleration) 시간이 지정되지 않은 모든 파드에 기본값으로 지정될 톨러레이션 시간(단위: 초)</p></td> +</tr> + +<tr> +<td colspan="2">--default-unreachable-toleration-seconds int     기본값: 300</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>unreachable:NoExecute 상태에 대한 톨러레이션 시간이 지정되지 않은 모든 파드에 기본값으로 지정될 톨러레이션 시간(단위: 초)</p></td> +</tr> + <tr> <td colspan="2">--detect-local-mode LocalMode</td> </tr> @@ -259,6 +308,34 @@ kube-proxy [flags] <td></td><td style="line-height: 130%; word-wrap: break-word;"><p>인증 정보가 있는 kubeconfig 파일의 경로(마스터 위치는 마스터 플래그로 설정됨).</p></td> </tr> +<tr> +<td colspan="2">--log-backtrace-at <'file:N' 형태의 문자열>     기본값: :0</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>로깅 과정에서 file:N 번째 라인에 도달하면 스택 트레이스를 출력한다.</p></td> +</tr> + +<tr> +<td colspan="2">--log-dir string</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>로그 파일이 저장될 디렉터리</p></td> +</tr> + +<tr> +<td colspan="2">--log-file string</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>사용할 로그 파일</p></td> +</tr> + +<tr> +<td colspan="2">--log-file-max-size uint     기본값: 1800</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>로그 파일의 최대 크기(단위: MB). 0으로 설정하면 무제한이다.</p></td> +</tr> + <tr> <td colspan="2">--log-flush-frequency duration     기본값: 5s</td> </tr> @@ -266,6 +343,20 @@ kube-proxy [flags] <td></td><td style="line-height: 130%; word-wrap: break-word;"><p>로그 플러시 사이의 최대 시간</p></td> </tr> +<tr> +<td colspan="2">--logtostderr     기본값: true</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>로그를 파일에 기록하지 않고 표준 에러로만 출력</p></td> +</tr> + +<tr> +<td colspan="2">--machine-id-file string     기본값: "/etc/machine-id,/var/lib/dbus/machine-id"</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>machine-id를 위해 확인할 파일 목록(쉼표로 분리). 가장 먼저 발견되는 항목을 사용한다.</p></td> +</tr> + <tr> <td colspan="2">--masquerade-all</td> </tr> @@ -294,6 +385,13 @@ kube-proxy [flags] <td></td><td style="line-height: 130%; word-wrap: break-word;"><p>NodePort에 사용할 주소를 지정하는 값의 문자열 조각. 값은 유효한 IP 블록(예: 1.2.3.0/24, 1.2.3.4/32). 기본값인 빈 문자열 조각값은([]) 모든 로컬 주소를 사용하는 것을 의미한다.</p></td> </tr> +<tr> +<td colspan="2">--one-output</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>true이면, 해당 로그가 속하는 심각성 레벨에만 각 로그를 기록한다(원래는 하위 심각성 레벨에도 기록한다).</p></td> +</tr> + <tr> <td colspan="2">--oom-score-adj int32     기본값: -999</td> </tr> @@ -326,7 +424,28 @@ kube-proxy [flags] <td colspan="2">--show-hidden-metrics-for-version string</td> </tr> <tr> -<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>숨겨진 메트릭을 표시할 이전 버전. </p></td> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>숨겨진 메트릭을 표시할 이전 버전. 이전 마이너 버전만 인식하며, 다른 값은 허용하지 않는다. '1.16' 형태로 사용한다. 이 옵션의 존재 목적은, 다음 릴리스에서 추가적인 메트릭을 숨기는지에 대한 여부를 사용자가 알게 하여, 그 이후 릴리스에서 메트릭이 영구적으로 삭제됐을 때 사용자가 놀라지 않도록 하기 위함이다.</p></td> +</tr> + +<tr> +<td colspan="2">--skip-headers</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>true이면, 로그 메시지에서 헤더 접두사를 붙이지 않는다.</p></td> +</tr> + +<tr> +<td colspan="2">--skip-log-headers</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>true이면, 로그 파일을 열 때 헤더를 붙이지 않는다.</p></td> +</tr> + +<tr> +<td colspan="2">--stderrthreshold int     기본값: 2</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>이 값 이상의 로그는 표준 에러(stderr)로 출력되도록 한다.</p></td> </tr> <tr> @@ -336,11 +455,25 @@ kube-proxy [flags] <td></td><td style="line-height: 130%; word-wrap: break-word;"><p>유휴 UDP 연결이 열린 상태로 유지되는 시간(예: '250ms', '2s'). 값은 0보다 커야 한다. 프록시 모드 userspace에만 적용 가능함.</p></td> </tr> +<tr> +<td colspan="2">-v, --v int</td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>로그 상세 레벨(verbosity)</p></td> +</tr> + <tr> <td colspan="2">--version version[=true]</td> </tr> <tr> -<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>버전 정보를 인쇄하고 종료.</p></td> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>버전 정보를 출력하고 종료</p></td> +</tr> + +<tr> +<td colspan="2">--vmodule <쉼표로 구분된 'pattern=N' 설정></td> +</tr> +<tr> +<td></td><td style="line-height: 130%; word-wrap: break-word;"><p>파일-필터된 로깅을 위한 'pattern=N' 설정들(쉼표로 구분됨)</p></td> </tr> <tr> diff --git a/content/ko/docs/reference/kubectl/cheatsheet.md b/content/ko/docs/reference/kubectl/cheatsheet.md index 4ee9c5406e..71fc5a5f27 100644 --- a/content/ko/docs/reference/kubectl/cheatsheet.md +++ b/content/ko/docs/reference/kubectl/cheatsheet.md @@ -212,6 +212,10 @@ kubectl get nodes -o json | jq -c 'path(..)|[.[]|tostring]|join(".")' # 파드 등에 대해 반환된 모든 키의 마침표로 구분된 트리를 생성한다. kubectl get pods -o json | jq -c 'path(..)|[.[]|tostring]|join(".")' + +# 모든 파드에 대해 ENV를 생성한다(각 파드에 기본 컨테이너가 있고, 기본 네임스페이스가 있고, `env` 명령어가 동작한다고 가정). +# `env` 뿐만 아니라 다른 지원되는 명령어를 모든 파드에 실행할 때에도 참고할 수 있다. +for pod in $(kubectl get po --output=jsonpath={.items..metadata.name}); do echo $pod && kubectl exec -it $pod env; done ``` ## 리소스 업데이트 diff --git a/content/ko/docs/reference/scheduling/policies.md b/content/ko/docs/reference/scheduling/policies.md index 626e077784..c2b9cbbdff 100644 --- a/content/ko/docs/reference/scheduling/policies.md +++ b/content/ko/docs/reference/scheduling/policies.md @@ -37,20 +37,6 @@ weight: 10 - `MaxCSIVolumeCount`: 연결해야 하는 {{< glossary_tooltip text="CSI" term_id="csi" >}} 볼륨의 수와 구성된 제한을 초과하는지 여부를 결정한다. -- `CheckNodeMemoryPressure`: 노드가 메모리 압박을 보고하고 있고, 구성된 - 예외가 없는 경우, 파드가 해당 노드에 스케줄되지 않는다. - -- `CheckNodePIDPressure`: 노드가 프로세스 ID 부족을 보고하고 있고, 구성된 - 예외가 없는 경우, 파드가 해당 노드에 스케줄되지 않는다. - -- `CheckNodeDiskPressure`: 노드가 스토리지 압박(파일시스템이 가득차거나 - 거의 꽉 참)을 보고하고 있고, 구성된 예외가 없는 경우, 파드가 해당 노드에 스케줄되지 않는다. - -- `CheckNodeCondition`: 노드는 파일시스템이 완전히 가득찼거나, - 네트워킹을 사용할 수 없거나, kubelet이 파드를 실행할 준비가 되지 않았다고 보고할 수 있다. - 노드에 대해 이러한 조건이 설정되고, 구성된 예외가 없는 경우, 파드가 - 해당 노드에 스케줄되지 않는다. - - `PodToleratesNodeTaints`: 파드의 {{< glossary_tooltip text="톨러레이션" term_id="toleration" >}}이 노드의 {{< glossary_tooltip text="테인트" term_id="taint" >}}를 용인할 수 있는지 확인한다. diff --git a/content/ko/docs/setup/best-practices/cluster-large.md b/content/ko/docs/setup/best-practices/cluster-large.md index d67892e6dc..d0293e72f6 100644 --- a/content/ko/docs/setup/best-practices/cluster-large.md +++ b/content/ko/docs/setup/best-practices/cluster-large.md @@ -60,9 +60,13 @@ _A_ 영역에 있는 컨트롤 플레인 호스트로만 전달한다. 단일 클러스터 생성시의 부가 스트립트이다. 클러스터 생성 시에 (사용자 도구를 사용하여) 다음을 수행할 수 있다. -* 추가 ectd 인스턴스 시작 및 설정 +* 추가 etcd 인스턴스 시작 및 설정 * 이벤트를 저장하기 위한 {{< glossary_tooltip term_id="kube-apiserver" text="API server" >}} 설정 +[쿠버네티스를 위한 etcd 클러스터 운영하기](/docs/tasks/administer-cluster/configure-upgrade-etcd/)와 +[kubeadm을 이용하여 고가용성 etcd 생성하기](/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/)에서 +큰 클러스터를 위한 etcd를 설정하고 관리하는 방법에 대한 상세 사항을 확인한다. + ## 애드온 리소스 쿠버네티스 [리소스 제한](/ko/docs/concepts/configuration/manage-resources-containers/)은 From d60462e1cc320b3860c42344a81b239827b68506 Mon Sep 17 00:00:00 2001 From: Rui Chen <rui@chenrui.dev> Date: Sun, 30 May 2021 01:51:40 -0400 Subject: [PATCH 189/221] zh: sync concepts/overview/what-is-kubernetes.md Signed-off-by: Rui Chen <rui@chenrui.dev> --- .../concepts/overview/what-is-kubernetes.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/content/zh/docs/concepts/overview/what-is-kubernetes.md b/content/zh/docs/concepts/overview/what-is-kubernetes.md index b976570edb..761d4736c1 100644 --- a/content/zh/docs/concepts/overview/what-is-kubernetes.md +++ b/content/zh/docs/concepts/overview/what-is-kubernetes.md @@ -35,10 +35,11 @@ Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。 <!-- -The name Kubernetes originates from Greek, meaning helmsman or pilot. Google open-sourced the Kubernetes project in 2014. Kubernetes builds upon a [decade and a half of experience that Google has with running production workloads at scale](https://research.google/pubs/pub43438), combined with best-of-breed ideas and practices from the community. +The name Kubernetes originates from Greek, meaning helmsman or pilot. K8s as an abbreviation results from counting the eight letters between the "K" and the "s". Google open-sourced the Kubernetes project in 2014. Kubernetes combines [over 15 years of Google's experience](/blog/2015/04/borg-predecessor-to-kubernetes/) running production workloads at scale with best-of-breed ideas and practices from the community. --> -名称 **Kubernetes** 源于希腊语,意为“舵手”或“飞行员”。Google 在 2014 年开源了 Kubernetes 项目。 -Kubernetes 建立在 [Google 在大规模运行生产工作负载方面拥有十几年的经验](https://research.google/pubs/pub43438) +**Kubernetes** 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 +Google 在 2014 年开源了 Kubernetes 项目。Kubernetes 建立在 +[Google 在大规模运行生产工作负载方面拥有十几年的经验](https://research.google/pubs/pub43438) 的基础上,结合了社区中最好的想法和实践。 <!-- @@ -155,7 +156,7 @@ Kubernetes provides you with: Kubernetes 为你提供: <!-- -* **Service discovery and load balancing** +* **Service discovery and load balancing** Kubernetes can expose a container using the DNS name or using their own IP address. If traffic to a container is high, Kubernetes is able to load balance and distribute the network traffic so that the deployment is stable. --> * **服务发现和负载均衡** @@ -164,7 +165,7 @@ Kubernetes can expose a container using the DNS name or using their own IP addre Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。 <!-- -* **Storage orchestration** +* **Storage orchestration** Kubernetes allows you to automatically mount a storage system of your choice, such as local storages, public cloud providers, and more. --> * **存储编排** @@ -172,7 +173,7 @@ Kubernetes allows you to automatically mount a storage system of your choice, su Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。 <!-- -* **Automated rollouts and rollbacks** +* **Automated rollouts and rollbacks** You can describe the desired state for your deployed containers using Kubernetes, and it can change the actual state to the desired state at a controlled rate. For example, you can automate Kubernetes to create new containers for your deployment, remove existing containers and adopt all their resources to the new container. --> * **自动部署和回滚** @@ -182,7 +183,7 @@ You can describe the desired state for your deployed containers using Kubernetes 删除现有容器并将它们的所有资源用于新容器。 <!-- -* **Automatic bin packing** +* **Automatic bin packing** Kubernetes allows you to specify how much CPU and memory (RAM) each container needs. When containers have resource requests specified, Kubernetes can make better decisions to manage the resources for containers. --> * **自动完成装箱计算** @@ -191,7 +192,7 @@ Kubernetes allows you to specify how much CPU and memory (RAM) each container ne 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。 <!-- -* **Self-healing** +* **Self-healing** Kubernetes restarts containers that fail, replaces containers, kills containers that don’t respond to your user-defined health check, and doesn’t advertise them to clients until they are ready to serve. --> * **自我修复** @@ -200,7 +201,7 @@ Kubernetes restarts containers that fail, replaces containers, kills containers 运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。 <!-- -* **Secret and configuration management** +* **Secret and configuration management** Kubernetes lets you store and manage sensitive information, such as passwords, OAuth tokens, and ssh keys. You can deploy and update secrets and application configuration without rebuilding your container images, and without exposing secrets in your stack configuration. --> * **密钥与配置管理** From b3e9ecd9fc5dcb9fccd22fc01ecb8297cd7e6e0f Mon Sep 17 00:00:00 2001 From: Rui Chen <rui@chenrui.dev> Date: Sun, 30 May 2021 02:13:59 -0400 Subject: [PATCH 190/221] zh: sync concepts/extend-kubernetes/operator.md Signed-off-by: Rui Chen <rui@chenrui.dev> --- content/zh/docs/concepts/extend-kubernetes/operator.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/content/zh/docs/concepts/extend-kubernetes/operator.md b/content/zh/docs/concepts/extend-kubernetes/operator.md index ca3d0f790f..97326b31cd 100644 --- a/content/zh/docs/concepts/extend-kubernetes/operator.md +++ b/content/zh/docs/concepts/extend-kubernetes/operator.md @@ -65,7 +65,7 @@ a [Custom Resource](/docs/concepts/extend-kubernetes/api-extension/custom-resour Kubernetes 为自动化而生。无需任何修改,你即可以从 Kubernetes 核心中获得许多内置的自动化功能。 你可以使用 Kubernetes 自动化部署和运行工作负载, *甚至* 可以自动化 Kubernetes 自身。 -Kubernetes {{< glossary_tooltip text="控制器" term_id="controller" >}} +Kubernetes {{< glossary_tooltip text="控制器" term_id="controller" >}} 使你无需修改 Kubernetes 自身的代码,即可以扩展集群的行为。 Operator 是 Kubernetes API 的客户端,充当 [定制资源](/zh/docs/concepts/extend-kubernetes/api-extension/custom-resources/) @@ -196,7 +196,7 @@ kubectl edit SampleDB/example-database # 手动修改某些配置 <!-- If there isn't an Operator in the ecosystem that implements the behavior you -want, you can code your own. +want, you can code your own. You also implement an Operator (that is, a Controller) using any language / runtime that can act as a [client for the Kubernetes API](/docs/reference/using-api/client-libraries/). @@ -213,20 +213,24 @@ Operator. {{% thirdparty-content %}} +* [Charmed Operator Framework](https://juju.is/) * [kubebuilder](https://book.kubebuilder.io/) * [KUDO](https://kudo.dev/) (Kubernetes Universal Declarative Operator) * [Metacontroller](https://metacontroller.app/) along with WebHooks that you implement yourself * [Operator Framework](https://operatorframework.io) +* [shell-operator](https://github.com/flant/shell-operator) --> 以下是一些库和工具,你可用于编写自己的云原生 Operator。 {{% thirdparty-content %}} +* [Charmed Operator Framework](https://juju.is/) * [kubebuilder](https://book.kubebuilder.io/) * [KUDO](https://kudo.dev/) (Kubernetes 通用声明式 Operator) * [Metacontroller](https://metacontroller.app/),可与 Webhooks 结合使用,以实现自己的功能。 * [Operator Framework](https://operatorframework.io) +* [shell-operator](https://github.com/flant/shell-operator) ## {{% heading "whatsnext" %}} @@ -244,4 +248,3 @@ Operator. * 阅读 [CoreOS 原始文章](https://web.archive.org/web/20170129131616/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) - From eaa215eee1f51c7aea274a62a7a14dae22266a26 Mon Sep 17 00:00:00 2001 From: Rui Chen <rui@chenrui.dev> Date: Sun, 30 May 2021 02:21:08 -0400 Subject: [PATCH 191/221] sync concepts/overview/working-with-objects/common-labels.md Signed-off-by: Rui Chen <rui@chenrui.dev> --- .../overview/working-with-objects/common-labels.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/content/zh/docs/concepts/overview/working-with-objects/common-labels.md b/content/zh/docs/concepts/overview/working-with-objects/common-labels.md index 0d0ecbd8b1..664c9ed096 100644 --- a/content/zh/docs/concepts/overview/working-with-objects/common-labels.md +++ b/content/zh/docs/concepts/overview/working-with-objects/common-labels.md @@ -68,7 +68,8 @@ on every resource object. | `app.kubernetes.io/version` | The current version of the application (e.g., a semantic version, revision hash, etc.) | `5.7.21` | string | | `app.kubernetes.io/component` | The component within the architecture | `database` | string | | `app.kubernetes.io/part-of` | The name of a higher level application this one is part of | `wordpress` | string | -| `app.kubernetes.io/managed-by` | The tool being used to manage the operation of an application | `helm` | string | +| `app.kubernetes.io/managed-by` | The tool being used to manage the operation of an application | `helm` | string | +| `app.kubernetes.io/created-by` | The controller/user who created this resource | `controller-manager` | string | --> | 键 | 描述 | 示例 | 类型 | | ----------------------------------- | --------------------- | -------- | ---- | @@ -77,7 +78,8 @@ on every resource object. | `app.kubernetes.io/version` | 应用程序的当前版本(例如,语义版本,修订版哈希等) | `5.7.21` | 字符串 | | `app.kubernetes.io/component` | 架构中的组件 | `database` | 字符串 | | `app.kubernetes.io/part-of` | 此级别的更高级别应用程序的名称 | `wordpress` | 字符串 | -| `app.kubernetes.io/managed-by` | 用于管理应用程序的工具 | `helm` | 字符串 | +| `app.kubernetes.io/managed-by` | 用于管理应用程序的工具 | `helm` | 字符串 | +| `app.kubernetes.io/created-by` | 创建该资源的控制器或者用户 | `controller-manager` | 字符串 | <!-- To illustrate these labels in action, consider the following StatefulSet object: --> @@ -94,6 +96,7 @@ metadata: app.kubernetes.io/component: database app.kubernetes.io/part-of: wordpress app.kubernetes.io/managed-by: helm + app.kubernetes.io/created-by: controller-manager ``` <!-- @@ -253,5 +256,3 @@ metadata: With the MySQL `StatefulSet` and `Service` you'll notice information about both MySQL and Wordpress, the broader application, are included. --> 使用 MySQL `StatefulSet` 和 `Service`,您会注意到有关 MySQL 和 Wordpress 的信息,包括更广泛的应用程序。 - - From d3217b35d5d5b2be15e3ac4cf817aa35f5bdb5fe Mon Sep 17 00:00:00 2001 From: Rui Chen <rui@chenrui.dev> Date: Sun, 30 May 2021 02:21:53 -0400 Subject: [PATCH 192/221] resync concepts/overview/working-with-objects/namespaces.md Signed-off-by: Rui Chen <rui@chenrui.dev> --- .../concepts/overview/working-with-objects/namespaces.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) 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 38f947f6d1..6966d7afb8 100644 --- a/content/zh/docs/concepts/overview/working-with-objects/namespaces.md +++ b/content/zh/docs/concepts/overview/working-with-objects/namespaces.md @@ -33,13 +33,13 @@ Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群 Namespaces are intended for use in environments with many users spread across multiple teams, or projects. For clusters with a few to tens of users, you should not need to create or think about namespaces at all. Start using namespaces when you -need the features they provide. +need the features they provide. --> 名字空间适用于存在很多跨多个团队或项目的用户的场景。对于只有几到几十个用户的集群,根本不需要创建或考虑名字空间。当需要名称空间提供的功能时,请开始使用它们。 <!-- Namespaces provide a scope for names. Names of resources need to be unique within a namespace, -but not across namespaces. Namespaces can not be nested inside one another and each Kubernetes +but not across namespaces. Namespaces can not be nested inside one another and each Kubernetes resource can only be in one namespace. --> 名字空间为名称提供了一个范围。资源的名称需要在名字空间内是唯一的,但不能跨名字空间。 @@ -71,7 +71,7 @@ for namespaces](/docs/tasks/administer-cluster/namespaces/). 名字空间的创建和删除在[名字空间的管理指南文档](/zh/docs/tasks/administer-cluster/namespaces/)描述。 <!-- -Avoid creating namespace with prefix `kube-`, since it is reserved for Kubernetes system namespaces. +Avoid creating namespaces with the prefix `kube-`, since it is reserved for Kubernetes system namespaces. --> {{< note >}} 避免使用前缀 `kube-` 创建名字空间,因为它是为 Kubernetes 系统名字空间保留的。 @@ -216,7 +216,7 @@ Kubernetes 控制面会为所有名字空间设置一个不可变更的 `kubernetes.io/metadata.name`,只要 `NamespaceDefaultLabelName` 这一 [特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) 被启用。标签的值是名字空间的名称。 - + ## {{% heading "whatsnext" %}} <!-- @@ -225,4 +225,3 @@ Kubernetes 控制面会为所有名字空间设置一个不可变更的 --> * 进一步了解[建立新的名字空间](/zh/docs/tasks/administer-cluster/namespaces/#creating-a-new-namespace)。 * 进一步了解[删除名字空间](/zh/docs/tasks/administer-cluster/namespaces/#deleting-a-namespace)。 - From 1a3e0e3c139c03354ce049785ad5d540006049da Mon Sep 17 00:00:00 2001 From: seokho-son <shsongist@gmail.com> Date: Sun, 30 May 2021 19:22:07 +0900 Subject: [PATCH 193/221] Restruct release directory and docs for Korean --- content/ko/docs/setup/release/_index.md | 5 - content/ko/docs/setup/release/notes.md | 1626 ----------------- content/ko/releases/_index.md | 27 + content/ko/releases/notes.md | 13 + .../version-skew-policy.md | 4 +- 5 files changed, 42 insertions(+), 1633 deletions(-) delete mode 100755 content/ko/docs/setup/release/_index.md delete mode 100644 content/ko/docs/setup/release/notes.md create mode 100644 content/ko/releases/_index.md create mode 100644 content/ko/releases/notes.md rename content/ko/{docs/setup/release => releases}/version-skew-policy.md (97%) diff --git a/content/ko/docs/setup/release/_index.md b/content/ko/docs/setup/release/_index.md deleted file mode 100755 index fcef7a59ab..0000000000 --- a/content/ko/docs/setup/release/_index.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "릴리스 노트와 버전 차이 지원(skew)" -weight: 10 ---- - diff --git a/content/ko/docs/setup/release/notes.md b/content/ko/docs/setup/release/notes.md deleted file mode 100644 index ada4903931..0000000000 --- a/content/ko/docs/setup/release/notes.md +++ /dev/null @@ -1,1626 +0,0 @@ ---- -title: v1.21 릴리스 노트 -weight: 10 -card: - name: release-notes - weight: 20 - anchors: - - anchor: "#" - title: 현재 릴리스 노트 - - anchor: "#긴급-업그레이드-노트" - title: 긴급 업그레이드 노트 ---- - -<!-- NEW RELEASE NOTES ENTRY --> - -# v1.21.0 - -[문서](https://docs.k8s.io) - -## v1.21.0 다운로드 - -### 소스 코드 - -파일명 | sha512 해시 --------- | ----------- -[kubernetes.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes.tar.gz) | `19bb76a3fa5ce4b9f043b2a3a77c32365ab1fcb902d8dd6678427fb8be8f49f64a5a03dc46aaef9c7dadee05501cf83412eda46f0edacbb8fc1ed0bf5fb79142` -[kubernetes-src.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-src.tar.gz) | `f942e6d6c10007a6e9ce21e94df597015ae646a7bc3e515caf1a3b79f1354efb9aff59c40f2553a8e3d43fe4a01742241f5af18b69666244906ed11a22e3bc49` - -### 클라이언트 바이너리 - -파일명 | sha512 해시 --------- | ----------- -[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-client-darwin-amd64.tar.gz) | `be9d1440e418e5253fb8a3d8aba705ca8160746a9bd17325ad626a986b6da9f733af864155a651a32b7bca94b533b8d596005ddbe5248bdeea85db47a1b957ed` -[kubernetes-client-darwin-arm64.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-client-darwin-arm64.tar.gz) | `eed0ddc81d104bb2d41ace13f737c490423d5df4ebddc7376e45c18ed66af35933c9376b912c1c3da105945b04056f6ca0870c156bee8a307cf4189ca5eb1dd1` -[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-client-linux-386.tar.gz) | `8a2f30c4434199762f2a96141dab4241c1cce2711bea9ea39cc63c2c5e7d31719ed7f076efac1931604e3a94578d3bbf0cfa454965708c96f3cfb91789868746` -[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-client-linux-amd64.tar.gz) | `cd3cfa645fa31de3716f1f63506e31b73d2aa8d37bb558bb3b3e8c151f35b3d74d44e03cbd05be67e380f9a5d015aba460222afdac6677815cd99a85c2325cf0` -[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-client-linux-arm.tar.gz) | `936042aa11cea0f6dfd2c30fc5dbe655420b34799bede036b1299a92d6831f589ca10290b73b9c9741560b603ae31e450ad024e273f2b4df5354bfac272691d8` -[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-client-linux-arm64.tar.gz) | `42beb75364d7bf4bf526804b8a35bd0ab3e124b712e9d1f45c1b914e6be0166619b30695feb24b3eecef134991dacb9ab3597e788bd9e45cf35addddf20dd7f6` -[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-client-linux-ppc64le.tar.gz) | `4baba2ed7046b28370eccc22e2378ae79e3ce58220d6f4f1b6791e8233bec8379e30200bb20b971456b83f2b791ea166fdfcf1ea56908bc1eea03590c0eda468` -[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-client-linux-s390x.tar.gz) | `37fa0c4d703aef09ce68c10ef3e7362b0313c8f251ce38eea579cd18fae4023d3d2b70e0f31577cabe6958ab9cfc30e98d25a7c64e69048b423057c3cf728339` -[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-client-windows-386.tar.gz) | `6900db36c1e3340edfd6dfd8d720575a904c932d39a8a7fa36401595e971a0235bd42111dbcc1cbb77e7374e47f1380a68c637997c18f96a0d9cdc9f3714c4c9` -[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-client-windows-amd64.tar.gz) | `90de67f6f79fc63bcfdf35066e3d84501cc85433265ffad36fd1a7a428a31b446249f0644a1e97495ea8b2a08e6944df6ef30363003750339edaa2aceffe937c` - -### 서버 바이너리 - -파일명 | sha512 해시 --------- | ----------- -[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-server-linux-amd64.tar.gz) | `3941dcc2309ac19ec185603a79f5a086d8a198f98c04efa23f15a177e5e1f34946ea9392ba9f5d24d0d727839438f067fef1001fc6e88b27b8b01e35bbd962ca` -[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-server-linux-arm.tar.gz) | `6507abf6c2ec2b336901dc23269f6c577ec0049b8bad3c9dd6ad63f21aa10f09bfbbfa6e064c2466d250411d3e10f8672791a9e10942e38de7bfbaf7a8bcc9da` -[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-server-linux-arm64.tar.gz) | `5abe76f867ca6865344e957bf166b81766c049ec4eb183a8a5580c22a7f8474db1edf90fd901a5833e56128b6825811653a1d27f72fd34ce5b1287a8c10da05c` -[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-server-linux-ppc64le.tar.gz) | `62507b182ca25396a285d91241536860e58f54fac937e97cbdf91948c83bb41be97d33277400489bf50e85164d560205540b76e94e5d519892312bdc63df1067` -[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-server-linux-s390x.tar.gz) | `04f2a1f7d1388e4a7d7d9f597f872a3da36f26839cfed16aad6df07021c03f4dca1df06b19cfda56df09d1c2d9a13ebd0af40ca1b9b6aecfaf427ab7712d88f3` - -### 노드 바이너리 - -파일명 | sha512 해시 --------- | ----------- -[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-node-linux-amd64.tar.gz) | `c1831c708109c31b3878e5a9327ea4b9e546504d0b6b00f3d43db78b5dd7d5114d32ac24a9a505f9cadbe61521f0419933348d2cd309ed8cfe3987d9ca8a7e2c` -[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-node-linux-arm.tar.gz) | `b68dd5bcfc7f9ce2781952df40c8c3a64c29701beff6ac22f042d6f31d4de220e9200b7e8272ddf608114327770acdaf3cb9a34a0a5206e784bda717ea080e0f` -[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-node-linux-arm64.tar.gz) | `7fa84fc500c28774ed25ca34b6f7b208a2bea29d6e8379f84b9f57bd024aa8fe574418cee7ee26edd55310716d43d65ae7b9cbe11e40c995fe2eac7f66bdb423` -[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-node-linux-ppc64le.tar.gz) | `a4278b3f8e458e9581e01f0c5ba8443303c987988ee136075a8f2f25515d70ca549fbd2e4d10eefca816c75c381d62d71494bd70c47034ab47f8315bbef4ae37` -[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-node-linux-s390x.tar.gz) | `8de2bc6f22f232ff534b45012986eac23893581ccb6c45bd637e40dbe808ce31d5a92375c00dc578bdbadec342b6e5b70c1b9f3d3a7bb26ccfde97d71f9bf84a` -[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.21.0/kubernetes-node-windows-amd64.tar.gz) | `b82e94663d330cff7a117f99a7544f27d0bc92b36b5a283b3c23725d5b33e6f15e0ebf784627638f22f2d58c58c0c2b618ddfd226a64ae779693a0861475d355` - -## v1.20.0 이후 변경로그 (Changelog) - -## 새로운 소식 (주요 테마) - -### Deprecation of PodSecurityPolicy - -PSP as an admission controller resource is being deprecated. Deployed PodSecurityPolicy's will keep working until version 1.25, their target removal from the codebase. A new feature, with a working title of "PSP replacement policy", is being developed in [KEP-2579](https://features.k8s.io/2579). To learn more, read [PodSecurityPolicy Deprecation: Past, Present, and Future](https://blog.k8s.io/2021/04/06/podsecuritypolicy-deprecation-past-present-and-future/). - -### Kubernetes API Reference Documentation - -The API reference is now generated with [`gen-resourcesdocs`](https://github.com/kubernetes-sigs/reference-docs/tree/c96658d89fb21037b7d00d27e6dbbe6b32375837/gen-resourcesdocs) and it is moving to [Kubernetes API](https://docs.k8s.io/reference/kubernetes-api/) - -### Kustomize Updates in Kubectl - -[Kustomize](https://github.com/kubernetes-sigs/kustomize) version in kubectl had a jump from v2.0.3 to [v4.0.5](https://github.com/kubernetes/kubernetes/pull/98946). Kustomize is now treated as a library and future updates will be less sporadic. - -### Default Container Labels - -Pod with multiple containers can use `kubectl.kubernetes.io/default-container` label to have a container preselected for kubectl commands. More can be read in [KEP-2227](https://github.com/kubernetes/enhancements/blob/master/keps/sig-cli/2227-kubectl-default-container/README.md). - -### Immutable Secrets and ConfigMaps - -Immutable Secrets and ConfigMaps graduates to GA. This feature allows users to specify that the contents of a particular Secret or ConfigMap is immutable for its object lifetime. For such instances, Kubelet will not watch/poll for changes and therefore reducing apiserver load. - -### Structured Logging in Kubelet - -Kubelet has adopted structured logging, thanks to community effort in accomplishing this within the release timeline. Structured logging in the project remains an ongoing effort -- for folks interested in participating, [keep an eye / chime in to the mailing list discussion](https://groups.google.com/g/kubernetes-dev/c/y4WIw-ntUR8). - -### Storage Capacity Tracking - -Traditionally, the Kubernetes scheduler was based on the assumptions that additional persistent storage is available everywhere in the cluster and has infinite capacity. Topology constraints addressed the first point, but up to now pod scheduling was still done without considering that the remaining storage capacity may not be enough to start a new pod. [Storage capacity tracking](https://docs.k8s.io/concepts/storage/storage-capacity/) addresses that by adding an API for a CSI driver to report storage capacity and uses that information in the Kubernetes scheduler when choosing a node for a pod. This feature serves as a stepping stone for supporting dynamic provisioning for local volumes and other volume types that are more capacity constrained. - -### Generic Ephemeral Volumes - -[Generic ephermeral volumes](https://docs.k8s.io/concepts/storage/ephemeral-volumes/#generic-ephemeral-volumes) feature allows any existing storage driver that supports dynamic provisioning to be used as an ephemeral volume with the volume’s lifecycle bound to the Pod. It can be used to provide scratch storage that is different from the root disk, for example persistent memory, or a separate local disk on that node. All StorageClass parameters for volume provisioning are supported. All features supported with PersistentVolumeClaims are supported, such as storage capacity tracking, snapshots and restore, and volume resizing. - -### CSI Service Account Token - -CSI Service Account Token feature moves to Beta in 1.21. This feature improves the security posture and allows CSI drivers to receive pods' [bound service account tokens](https://github.com/kubernetes/enhancements/blob/master/keps/sig-auth/1205-bound-service-account-tokens/README.md). This feature also provides a knob to re-publish volumes so that short-lived volumes can be refreshed. - -### CSI Health Monitoring - -The CSI health monitoring feature is being released as a second Alpha in Kubernetes 1.21. This feature enables CSI Drivers to share abnormal volume conditions from the underlying storage systems with Kubernetes so that they can be reported as events on PVCs or Pods. This feature serves as a stepping stone towards programmatic detection and resolution of individual volume health issues by Kubernetes. - -## 알려진 이슈 - -### `TopologyAwareHints` feature falls back to default behavior - -The feature gate currently falls back to the default behavior in most cases. Enabling the feature gate will add hints to `EndpointSlices`, but functional differences are only observed in non-dual stack kube-proxy implementation. [The fix will be available in coming releases](https://github.com/kubernetes/kubernetes/pull/100804). - -## 긴급 업그레이드 노트 - -### (주의. 업그레이드 전에 반드시 읽어야 함) - -- Kube-proxy's IPVS proxy mode no longer sets the net.ipv4.conf.all.route_localnet sysctl parameter. Nodes upgrading will have net.ipv4.conf.all.route_localnet set to 1 but new nodes will inherit the system default (usually 0). If you relied on any behavior requiring net.ipv4.conf.all.route_localnet, you must set ensure it is enabled as kube-proxy will no longer set it automatically. This change helps to further mitigate CVE-2020-8558. ([#92938](https://github.com/kubernetes/kubernetes/pull/92938), [@lbernail](https://github.com/lbernail)) [SIG Network and Release] - - Kubeadm: during "init" an empty cgroupDriver value in the KubeletConfiguration is now always set to "systemd" unless the user is explicit about it. This requires existing machine setups to configure the container runtime to use the "systemd" driver. Documentation on this topic can be found here: https://kubernetes.io/docs/setup/production-environment/container-runtimes/. When upgrading existing clusters / nodes using "kubeadm upgrade" the old cgroupDriver value is preserved, but in 1.22 this change will also apply to "upgrade". For more information on migrating to the "systemd" driver or remaining on the "cgroupfs" driver see: https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/. ([#99471](https://github.com/kubernetes/kubernetes/pull/99471), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle] - - Newly provisioned PVs by EBS plugin will no longer use the deprecated "failure-domain.beta.kubernetes.io/zone" and "failure-domain.beta.kubernetes.io/region" labels. It will use "topology.kubernetes.io/zone" and "topology.kubernetes.io/region" labels instead. ([#99130](https://github.com/kubernetes/kubernetes/pull/99130), [@ayberk](https://github.com/ayberk)) [SIG Cloud Provider, Storage and Testing] - - Newly provisioned PVs by OpenStack Cinder plugin will no longer use the deprecated "failure-domain.beta.kubernetes.io/zone" and "failure-domain.beta.kubernetes.io/region" labels. It will use "topology.kubernetes.io/zone" and "topology.kubernetes.io/region" labels instead. ([#99719](https://github.com/kubernetes/kubernetes/pull/99719), [@jsafrane](https://github.com/jsafrane)) [SIG Cloud Provider and Storage] - - Newly provisioned PVs by gce-pd will no longer have the beta FailureDomain label. gce-pd volume plugin will start to have GA topology label instead. ([#98700](https://github.com/kubernetes/kubernetes/pull/98700), [@Jiawei0227](https://github.com/Jiawei0227)) [SIG Cloud Provider, Storage and Testing] - - OpenStack Cinder CSI migration is on by default, Clinder CSI driver must be installed on clusters on OpenStack for Cinder volumes to work. ([#98538](https://github.com/kubernetes/kubernetes/pull/98538), [@dims](https://github.com/dims)) [SIG Storage] - - Remove alpha `CSIMigrationXXComplete` flag and add alpha `InTreePluginXXUnregister` flag. Deprecate `CSIMigrationvSphereComplete` flag and it will be removed in v1.22. ([#98243](https://github.com/kubernetes/kubernetes/pull/98243), [@Jiawei0227](https://github.com/Jiawei0227)) - - Remove storage metrics `storage_operation_errors_total`, since we already have `storage_operation_status_count`.And add new field `status` for `storage_operation_duration_seconds`, so that we can know about all status storage operation latency. ([#98332](https://github.com/kubernetes/kubernetes/pull/98332), [@JornShen](https://github.com/JornShen)) [SIG Instrumentation and Storage] - - The metric `storage_operation_errors_total` is not removed, but is marked deprecated, and the metric `storage_operation_status_count` is marked deprecated. In both cases the `storage_operation_duration_seconds` metric can be used to recover equivalent counts (using `status=fail-unknown` in the case of `storage_operations_errors_total`). ([#99045](https://github.com/kubernetes/kubernetes/pull/99045), [@mattcary](https://github.com/mattcary)) - - `ServiceNodeExclusion`, `NodeDisruptionExclusion` and `LegacyNodeRoleBehavior` features have been promoted to GA. `ServiceNodeExclusion` and `NodeDisruptionExclusion` are now unconditionally enabled, while `LegacyNodeRoleBehavior` is unconditionally disabled. To prevent control plane nodes from being added to load balancers automatically, upgrade users need to add "node.kubernetes.io/exclude-from-external-load-balancers" label to control plane nodes. ([#97543](https://github.com/kubernetes/kubernetes/pull/97543), [@pacoxu](https://github.com/pacoxu)) - -## 종류(Kind)별 변경 사항 - -### 사용 중단 - -- Aborting the drain command in a list of nodes will be deprecated. The new behavior will make the drain command go through all nodes even if one or more nodes failed during the drain. For now, users can try such experience by enabling --ignore-errors flag. ([#98203](https://github.com/kubernetes/kubernetes/pull/98203), [@yuzhiquan](https://github.com/yuzhiquan)) -- Delete deprecated `service.beta.kubernetes.io/azure-load-balancer-mixed-protocols` mixed procotol annotation in favor of the MixedProtocolLBService feature ([#97096](https://github.com/kubernetes/kubernetes/pull/97096), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider] -- Deprecate the `topologyKeys` field in Service. This capability will be replaced with upcoming work around Topology Aware Subsetting and Service Internal Traffic Policy. ([#96736](https://github.com/kubernetes/kubernetes/pull/96736), [@andrewsykim](https://github.com/andrewsykim)) [SIG Apps] -- Kube-proxy: remove deprecated --cleanup-ipvs flag of kube-proxy, and make --cleanup flag always to flush IPVS ([#97336](https://github.com/kubernetes/kubernetes/pull/97336), [@maaoBit](https://github.com/maaoBit)) [SIG Network] -- Kubeadm: deprecated command "alpha selfhosting pivot" is now removed. ([#97627](https://github.com/kubernetes/kubernetes/pull/97627), [@knight42](https://github.com/knight42)) -- Kubeadm: graduate the command `kubeadm alpha kubeconfig user` to `kubeadm kubeconfig user`. The `kubeadm alpha kubeconfig user` command is deprecated now. ([#97583](https://github.com/kubernetes/kubernetes/pull/97583), [@knight42](https://github.com/knight42)) [SIG Cluster Lifecycle] -- Kubeadm: the "kubeadm alpha certs" command is removed now, please use "kubeadm certs" instead. ([#97706](https://github.com/kubernetes/kubernetes/pull/97706), [@knight42](https://github.com/knight42)) [SIG Cluster Lifecycle] -- Kubeadm: the deprecated kube-dns is no longer supported as an option. If "ClusterConfiguration.dns.type" is set to "kube-dns" kubeadm will now throw an error. ([#99646](https://github.com/kubernetes/kubernetes/pull/99646), [@rajansandeep](https://github.com/rajansandeep)) [SIG Cluster Lifecycle] -- Kubectl: The deprecated `kubectl alpha debug` command is removed. Use `kubectl debug` instead. ([#98111](https://github.com/kubernetes/kubernetes/pull/98111), [@pandaamanda](https://github.com/pandaamanda)) [SIG CLI] -- Official support to build kubernetes with docker-machine / remote docker is removed. This change does not affect building kubernetes with docker locally. ([#97935](https://github.com/kubernetes/kubernetes/pull/97935), [@adeniyistephen](https://github.com/adeniyistephen)) [SIG Release and Testing] -- Remove deprecated `--generator, --replicas, --service-generator, --service-overrides, --schedule` from `kubectl run` - Deprecate `--serviceaccount, --hostport, --requests, --limits` in `kubectl run` ([#99732](https://github.com/kubernetes/kubernetes/pull/99732), [@soltysh](https://github.com/soltysh)) -- Remove the deprecated metrics "scheduling_algorithm_preemption_evaluation_seconds" and "binding_duration_seconds", suggest to use "scheduler_framework_extension_point_duration_seconds" instead. ([#96447](https://github.com/kubernetes/kubernetes/pull/96447), [@chendave](https://github.com/chendave)) [SIG Cluster Lifecycle, Instrumentation, Scheduling and Testing] -- Removing experimental windows container hyper-v support with Docker ([#97141](https://github.com/kubernetes/kubernetes/pull/97141), [@wawa0210](https://github.com/wawa0210)) [SIG Node and Windows] -- Rename metrics `etcd_object_counts` to `apiserver_storage_object_counts` and mark it as stable. The original `etcd_object_counts` metrics name is marked as "Deprecated" and will be removed in the future. ([#99785](https://github.com/kubernetes/kubernetes/pull/99785), [@erain](https://github.com/erain)) [SIG API Machinery, Instrumentation and Testing] -- The GA TokenRequest and TokenRequestProjection feature gates have been removed and are unconditionally enabled. Remove explicit use of those feature gates in CLI invocations. ([#97148](https://github.com/kubernetes/kubernetes/pull/97148), [@wawa0210](https://github.com/wawa0210)) [SIG Node] -- The PodSecurityPolicy API is deprecated in 1.21, and will no longer be served starting in 1.25. ([#97171](https://github.com/kubernetes/kubernetes/pull/97171), [@deads2k](https://github.com/deads2k)) [SIG Auth and CLI] -- The `batch/v2alpha1` CronJob type definitions and clients are deprecated and removed. ([#96987](https://github.com/kubernetes/kubernetes/pull/96987), [@soltysh](https://github.com/soltysh)) [SIG API Machinery, Apps, CLI and Testing] -- The `export` query parameter (inconsistently supported by API resources and deprecated in v1.14) is fully removed. Requests setting this query parameter will now receive a 400 status response. ([#98312](https://github.com/kubernetes/kubernetes/pull/98312), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, Auth and Testing] -- `audit.k8s.io/v1beta1` and `audit.k8s.io/v1alpha1` audit policy configuration and audit events are deprecated in favor of `audit.k8s.io/v1`, available since v1.13. kube-apiserver invocations that specify alpha or beta policy configurations with `--audit-policy-file`, or explicitly request alpha or beta audit events with `--audit-log-version` / `--audit-webhook-version` must update to use `audit.k8s.io/v1` and accept `audit.k8s.io/v1` events prior to v1.24. ([#98858](https://github.com/kubernetes/kubernetes/pull/98858), [@carlory](https://github.com/carlory)) [SIG Auth] -- `discovery.k8s.io/v1beta1` EndpointSlices are deprecated in favor of `discovery.k8s.io/v1`, and will no longer be served in Kubernetes v1.25. ([#100472](https://github.com/kubernetes/kubernetes/pull/100472), [@liggitt](https://github.com/liggitt)) -- `diskformat` storage class parameter for in-tree vSphere volume plugin is deprecated as of v1.21 release. Please consider updating storageclass and remove `diskformat` parameter. vSphere CSI Driver does not support diskformat storageclass parameter. - - vSphere releases less than 67u3 are deprecated as of v1.21. Please consider upgrading vSphere to 67u3 or above. vSphere CSI Driver requires minimum vSphere 67u3. - - VM Hardware version less than 15 is deprecated as of v1.21. Please consider upgrading the Node VM Hardware version to 15 or above. vSphere CSI Driver recommends Node VM's Hardware version set to at least vmx-15. - - Multi vCenter support is deprecated as of v1.21. If you have a Kubernetes cluster spanning across multiple vCenter servers, please consider moving all k8s nodes to a single vCenter Server. vSphere CSI Driver does not support Kubernetes deployment spanning across multiple vCenter servers. - - Support for these deprecations will be available till Kubernetes v1.24. ([#98546](https://github.com/kubernetes/kubernetes/pull/98546), [@divyenpatel](https://github.com/divyenpatel)) - -### API 변경 - -- 1. PodAffinityTerm includes a namespaceSelector field to allow selecting eligible namespaces based on their labels. - 2. A new CrossNamespacePodAffinity quota scope API that allows restricting which namespaces allowed to use PodAffinityTerm with corss-namespace reference via namespaceSelector or namespaces fields. ([#98582](https://github.com/kubernetes/kubernetes/pull/98582), [@ahg-g](https://github.com/ahg-g)) [SIG API Machinery, Apps, Auth and Testing] -- Add Probe-level terminationGracePeriodSeconds field ([#99375](https://github.com/kubernetes/kubernetes/pull/99375), [@ehashman](https://github.com/ehashman)) [SIG API Machinery, Apps, Node and Testing] -- Added `.spec.completionMode` field to Job, with accepted values `NonIndexed` (default) and `Indexed`. This is an alpha field and is only honored by servers with the `IndexedJob` feature gate enabled. ([#98441](https://github.com/kubernetes/kubernetes/pull/98441), [@alculquicondor](https://github.com/alculquicondor)) [SIG Apps and CLI] -- Adds support for endPort field in NetworkPolicy ([#97058](https://github.com/kubernetes/kubernetes/pull/97058), [@rikatz](https://github.com/rikatz)) [SIG Apps and Network] -- CSIServiceAccountToken graduates to Beta and enabled by default. ([#99298](https://github.com/kubernetes/kubernetes/pull/99298), [@zshihang](https://github.com/zshihang)) -- Cluster admins can now turn off `/debug/pprof` and `/debug/flags/v` endpoint in kubelet by setting `enableProfilingHandler` and `enableDebugFlagsHandler` to `false` in the Kubelet configuration file. Options `enableProfilingHandler` and `enableDebugFlagsHandler` can be set to `true` only when `enableDebuggingHandlers` is also set to `true`. ([#98458](https://github.com/kubernetes/kubernetes/pull/98458), [@SaranBalaji90](https://github.com/SaranBalaji90)) -- DaemonSets accept a MaxSurge integer or percent on their rolling update strategy that will launch the updated pod on nodes and wait for those pods to go ready before marking the old out-of-date pods as deleted. This allows workloads to avoid downtime during upgrades when deployed using DaemonSets. This feature is alpha and is behind the DaemonSetUpdateSurge feature gate. ([#96441](https://github.com/kubernetes/kubernetes/pull/96441), [@smarterclayton](https://github.com/smarterclayton)) [SIG Apps and Testing] -- Enable SPDY pings to keep connections alive, so that `kubectl exec` and `kubectl portforward` won't be interrupted. ([#97083](https://github.com/kubernetes/kubernetes/pull/97083), [@knight42](https://github.com/knight42)) [SIG API Machinery and CLI] -- FieldManager no longer owns fields that get reset before the object is persisted (e.g. "status wiping"). ([#99661](https://github.com/kubernetes/kubernetes/pull/99661), [@kevindelgado](https://github.com/kevindelgado)) [SIG API Machinery, Auth and Testing] -- Fixes server-side apply for APIService resources. ([#98576](https://github.com/kubernetes/kubernetes/pull/98576), [@kevindelgado](https://github.com/kevindelgado)) -- Generic ephemeral volumes are beta. ([#99643](https://github.com/kubernetes/kubernetes/pull/99643), [@pohly](https://github.com/pohly)) [SIG API Machinery, Apps, Auth, CLI, Node, Storage and Testing] -- Hugepages request values are limited to integer multiples of the page size. ([#98515](https://github.com/kubernetes/kubernetes/pull/98515), [@lala123912](https://github.com/lala123912)) [SIG Apps] -- Implement the GetAvailableResources in the podresources API. ([#95734](https://github.com/kubernetes/kubernetes/pull/95734), [@fromanirh](https://github.com/fromanirh)) [SIG Instrumentation, Node and Testing] -- IngressClass resource can now reference a resource in a specific namespace - for implementation-specific configuration (previously only Cluster-level resources were allowed). - This feature can be enabled using the IngressClassNamespacedParams feature gate. ([#99275](https://github.com/kubernetes/kubernetes/pull/99275), [@hbagdi](https://github.com/hbagdi)) -- Jobs API has a new `.spec.suspend` field that can be used to suspend and resume Jobs. This is an alpha field which is only honored by servers with the `SuspendJob` feature gate enabled. ([#98727](https://github.com/kubernetes/kubernetes/pull/98727), [@adtac](https://github.com/adtac)) -- Kubelet Graceful Node Shutdown feature graduates to Beta and enabled by default. ([#99735](https://github.com/kubernetes/kubernetes/pull/99735), [@bobbypage](https://github.com/bobbypage)) -- Kubernetes is now built using go1.15.7 ([#98363](https://github.com/kubernetes/kubernetes/pull/98363), [@cpanato](https://github.com/cpanato)) [SIG Cloud Provider, Instrumentation, Node, Release and Testing] -- Namespace API objects now have a `kubernetes.io/metadata.name` label matching their metadata.name field to allow selecting any namespace by its name using a label selector. ([#96968](https://github.com/kubernetes/kubernetes/pull/96968), [@jayunit100](https://github.com/jayunit100)) [SIG API Machinery, Apps, Cloud Provider, Storage and Testing] -- One new field "InternalTrafficPolicy" in Service is added. - It specifies if the cluster internal traffic should be routed to all endpoints or node-local endpoints only. - "Cluster" routes internal traffic to a Service to all endpoints. - "Local" routes traffic to node-local endpoints only, and traffic is dropped if no node-local endpoints are ready. - The default value is "Cluster". ([#96600](https://github.com/kubernetes/kubernetes/pull/96600), [@maplain](https://github.com/maplain)) [SIG API Machinery, Apps and Network] -- PodDisruptionBudget API objects can now contain conditions in status. ([#98127](https://github.com/kubernetes/kubernetes/pull/98127), [@mortent](https://github.com/mortent)) [SIG API Machinery, Apps, Auth, CLI, Cloud Provider, Cluster Lifecycle and Instrumentation] -- PodSecurityPolicy only stores "generic" as allowed volume type if the GenericEphemeralVolume feature gate is enabled ([#98918](https://github.com/kubernetes/kubernetes/pull/98918), [@pohly](https://github.com/pohly)) [SIG Auth and Security] -- Promote CronJobs to batch/v1 ([#99423](https://github.com/kubernetes/kubernetes/pull/99423), [@soltysh](https://github.com/soltysh)) [SIG API Machinery, Apps, CLI and Testing] -- Promote Immutable Secrets/ConfigMaps feature to Stable. This allows to set `immutable` field in Secret or ConfigMap object to mark their contents as immutable. ([#97615](https://github.com/kubernetes/kubernetes/pull/97615), [@wojtek-t](https://github.com/wojtek-t)) [SIG Apps, Architecture, Node and Testing] -- Remove support for building Kubernetes with bazel. ([#99561](https://github.com/kubernetes/kubernetes/pull/99561), [@BenTheElder](https://github.com/BenTheElder)) [SIG API Machinery, Apps, Architecture, Auth, Autoscaling, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Release, Scalability, Scheduling, Storage, Testing and Windows] -- Scheduler extender filter interface now can report unresolvable failed nodes in the new field `FailedAndUnresolvableNodes` of `ExtenderFilterResult` struct. Nodes in this map will be skipped in the preemption phase. ([#92866](https://github.com/kubernetes/kubernetes/pull/92866), [@cofyc](https://github.com/cofyc)) [SIG Scheduling] -- Services can specify loadBalancerClass to use a custom load balancer ([#98277](https://github.com/kubernetes/kubernetes/pull/98277), [@XudongLiuHarold](https://github.com/XudongLiuHarold)) -- Storage capacity tracking (= the CSIStorageCapacity feature) graduates to Beta and enabled by default, storage.k8s.io/v1alpha1/VolumeAttachment and storage.k8s.io/v1alpha1/CSIStorageCapacity objects are deprecated ([#99641](https://github.com/kubernetes/kubernetes/pull/99641), [@pohly](https://github.com/pohly)) -- Support for Indexed Job: a Job that is considered completed when Pods associated to indexes from 0 to (.spec.completions-1) have succeeded. ([#98812](https://github.com/kubernetes/kubernetes/pull/98812), [@alculquicondor](https://github.com/alculquicondor)) [SIG Apps and CLI] -- The BoundServiceAccountTokenVolume feature has been promoted to beta, and enabled by default. - - This changes the tokens provided to containers at `/var/run/secrets/kubernetes.io/serviceaccount/token` to be time-limited, auto-refreshed, and invalidated when the containing pod is deleted. - - Clients should reload the token from disk periodically (once per minute is recommended) to ensure they continue to use a valid token. `k8s.io/client-go` version v11.0.0+ and v0.15.0+ reload tokens automatically. - - By default, injected tokens are given an extended lifetime so they remain valid even after a new refreshed token is provided. The metric `serviceaccount_stale_tokens_total` can be used to monitor for workloads that are depending on the extended lifetime and are continuing to use tokens even after a refreshed token is provided to the container. If that metric indicates no existing workloads are depending on extended lifetimes, injected token lifetime can be shortened to 1 hour by starting `kube-apiserver` with `--service-account-extend-token-expiration=false`. ([#95667](https://github.com/kubernetes/kubernetes/pull/95667), [@zshihang](https://github.com/zshihang)) [SIG API Machinery, Auth, Cluster Lifecycle and Testing] -- The EndpointSlice Controllers are now GA. The `EndpointSliceController` will not populate the `deprecatedTopology` field and will only provide topology information through the `zone` and `nodeName` fields. ([#99870](https://github.com/kubernetes/kubernetes/pull/99870), [@swetharepakula](https://github.com/swetharepakula)) -- The Endpoints controller will now set the `endpoints.kubernetes.io/over-capacity` annotation to "warning" when an Endpoints resource contains more than 1000 addresses. In a future release, the controller will truncate Endpoints that exceed this limit. The EndpointSlice API can be used to support significantly larger number of addresses. ([#99975](https://github.com/kubernetes/kubernetes/pull/99975), [@robscott](https://github.com/robscott)) [SIG Apps and Network] -- The PodDisruptionBudget API has been promoted to policy/v1 with no schema changes. The only functional change is that an empty selector (`{}`) written to a policy/v1 PodDisruptionBudget now selects all pods in the namespace. The behavior of the policy/v1beta1 API remains unchanged. The policy/v1beta1 PodDisruptionBudget API is deprecated and will no longer be served in 1.25+. ([#99290](https://github.com/kubernetes/kubernetes/pull/99290), [@mortent](https://github.com/mortent)) [SIG API Machinery, Apps, Auth, Autoscaling, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Scheduling and Testing] -- The `EndpointSlice` API is now GA. The `EndpointSlice` topology field has been removed from the GA API and will be replaced by a new per Endpoint Zone field. If the topology field was previously used, it will be converted into an annotation in the v1 Resource. The `discovery.k8s.io/v1alpha1` API is removed. ([#99662](https://github.com/kubernetes/kubernetes/pull/99662), [@swetharepakula](https://github.com/swetharepakula)) -- The `controller.kubernetes.io/pod-deletion-cost` annotation can be set to offer a hint on the cost of deleting a `Pod` compared to other pods belonging to the same ReplicaSet. Pods with lower deletion cost are deleted first. This is an alpha feature. ([#99163](https://github.com/kubernetes/kubernetes/pull/99163), [@ahg-g](https://github.com/ahg-g)) -- The kube-apiserver now resets `managedFields` that got corrupted by a mutating admission controller. ([#98074](https://github.com/kubernetes/kubernetes/pull/98074), [@kwiesmueller](https://github.com/kwiesmueller)) -- Topology Aware Hints are now available in alpha and can be enabled with the `TopologyAwareHints` feature gate. ([#99522](https://github.com/kubernetes/kubernetes/pull/99522), [@robscott](https://github.com/robscott)) [SIG API Machinery, Apps, Auth, Instrumentation, Network and Testing] -- Users might specify the `kubectl.kubernetes.io/default-exec-container` annotation in a Pod to preselect container for kubectl commands. ([#97099](https://github.com/kubernetes/kubernetes/pull/97099), [@pacoxu](https://github.com/pacoxu)) [SIG CLI] - -### 기능 (Feature) - -- A client-go metric, rest_client_exec_plugin_call_total, has been added to track total calls to client-go credential plugins. ([#98892](https://github.com/kubernetes/kubernetes/pull/98892), [@ankeesler](https://github.com/ankeesler)) [SIG API Machinery, Auth, Cluster Lifecycle and Instrumentation] -- A new histogram metric to track the time it took to delete a job by the `TTLAfterFinished` controller ([#98676](https://github.com/kubernetes/kubernetes/pull/98676), [@ahg-g](https://github.com/ahg-g)) -- AWS cloud provider supports auto-discovering subnets without any `kubernetes.io/cluster/<clusterName>` tags. It also supports additional service annotation `service.beta.kubernetes.io/aws-load-balancer-subnets` to manually configure the subnets. ([#97431](https://github.com/kubernetes/kubernetes/pull/97431), [@kishorj](https://github.com/kishorj)) -- Aborting the drain command in a list of nodes will be deprecated. The new behavior will make the drain command go through all nodes even if one or more nodes failed during the drain. For now, users can try such experience by enabling --ignore-errors flag. ([#98203](https://github.com/kubernetes/kubernetes/pull/98203), [@yuzhiquan](https://github.com/yuzhiquan)) -- Add --permit-address-sharing flag to `kube-apiserver` to listen with `SO_REUSEADDR`. While allowing to listen on wildcard IPs like 0.0.0.0 and specific IPs in parallel, it avoids waiting for the kernel to release socket in `TIME_WAIT` state, and hence, considerably reducing `kube-apiserver` restart times under certain conditions. ([#93861](https://github.com/kubernetes/kubernetes/pull/93861), [@sttts](https://github.com/sttts)) -- Add `csi_operations_seconds` metric on kubelet that exposes CSI operations duration and status for node CSI operations. ([#98979](https://github.com/kubernetes/kubernetes/pull/98979), [@Jiawei0227](https://github.com/Jiawei0227)) [SIG Instrumentation and Storage] -- Add `migrated` field into `storage_operation_duration_seconds` metric ([#99050](https://github.com/kubernetes/kubernetes/pull/99050), [@Jiawei0227](https://github.com/Jiawei0227)) [SIG Apps, Instrumentation and Storage] -- Add flag --lease-reuse-duration-seconds for kube-apiserver to config etcd lease reuse duration. ([#97009](https://github.com/kubernetes/kubernetes/pull/97009), [@lingsamuel](https://github.com/lingsamuel)) [SIG API Machinery and Scalability] -- Add metric etcd_lease_object_counts for kube-apiserver to observe max objects attached to a single etcd lease. ([#97480](https://github.com/kubernetes/kubernetes/pull/97480), [@lingsamuel](https://github.com/lingsamuel)) [SIG API Machinery, Instrumentation and Scalability] -- Add support to generate client-side binaries for new darwin/arm64 platform ([#97743](https://github.com/kubernetes/kubernetes/pull/97743), [@dims](https://github.com/dims)) [SIG Release and Testing] -- Added `ephemeral_volume_controller_create[_failures]_total` counters to kube-controller-manager metrics ([#99115](https://github.com/kubernetes/kubernetes/pull/99115), [@pohly](https://github.com/pohly)) [SIG API Machinery, Apps, Cluster Lifecycle, Instrumentation and Storage] -- Added support for installing `arm64` node artifacts. ([#99242](https://github.com/kubernetes/kubernetes/pull/99242), [@liu-cong](https://github.com/liu-cong)) -- Adds alpha feature `VolumeCapacityPriority` which makes the scheduler prioritize nodes based on the best matching size of statically provisioned PVs across multiple topologies. ([#96347](https://github.com/kubernetes/kubernetes/pull/96347), [@cofyc](https://github.com/cofyc)) [SIG Apps, Network, Scheduling, Storage and Testing] -- Adds the ability to pass --strict-transport-security-directives to the kube-apiserver to set the HSTS header appropriately. Be sure you understand the consequences to browsers before setting this field. ([#96502](https://github.com/kubernetes/kubernetes/pull/96502), [@249043822](https://github.com/249043822)) [SIG Auth] -- Adds two new metrics to cronjobs, a histogram to track the time difference when a job is created and the expected time when it should be created, as well as a gauge for the missed schedules of a cronjob ([#99341](https://github.com/kubernetes/kubernetes/pull/99341), [@alaypatel07](https://github.com/alaypatel07)) -- Alpha implementation of Kubectl Command Headers: SIG CLI KEP 859 enabled when KUBECTL_COMMAND_HEADERS environment variable set on the client command line. ([#98952](https://github.com/kubernetes/kubernetes/pull/98952), [@seans3](https://github.com/seans3)) -- Base-images: Update to debian-iptables:buster-v1.4.0 - - Uses iptables 1.8.5 - - base-images: Update to debian-base:buster-v1.3.0 - - cluster/images/etcd: Build etcd:3.4.13-2 image - - Uses debian-base:buster-v1.3.0 ([#98401](https://github.com/kubernetes/kubernetes/pull/98401), [@pacoxu](https://github.com/pacoxu)) [SIG Testing] -- CRIContainerLogRotation graduates to GA and unconditionally enabled. ([#99651](https://github.com/kubernetes/kubernetes/pull/99651), [@umohnani8](https://github.com/umohnani8)) -- Component owner can configure the allowlist of metric label with flag '--allow-metric-labels'. ([#99385](https://github.com/kubernetes/kubernetes/pull/99385), [@YoyinZyc](https://github.com/YoyinZyc)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation and Release] -- Component owner can configure the allowlist of metric label with flag '--allow-metric-labels'. ([#99738](https://github.com/kubernetes/kubernetes/pull/99738), [@YoyinZyc](https://github.com/YoyinZyc)) [SIG API Machinery, Cluster Lifecycle and Instrumentation] -- EmptyDir memory backed volumes are sized as the the minimum of pod allocatable memory on a host and an optional explicit user provided value. ([#100319](https://github.com/kubernetes/kubernetes/pull/100319), [@derekwaynecarr](https://github.com/derekwaynecarr)) [SIG Node] -- Enables Kubelet to check volume condition and log events to corresponding pods. ([#99284](https://github.com/kubernetes/kubernetes/pull/99284), [@fengzixu](https://github.com/fengzixu)) [SIG Apps, Instrumentation, Node and Storage] -- EndpointSliceNodeName graduates to GA and thus will be unconditionally enabled -- NodeName will always be available in the v1beta1 API. ([#99746](https://github.com/kubernetes/kubernetes/pull/99746), [@swetharepakula](https://github.com/swetharepakula)) -- Export `NewDebuggingRoundTripper` function and `DebugLevel` options in the k8s.io/client-go/transport package. ([#98324](https://github.com/kubernetes/kubernetes/pull/98324), [@atosatto](https://github.com/atosatto)) -- Kube-proxy iptables: new metric sync_proxy_rules_iptables_total that exposes the number of rules programmed per table in each iteration ([#99653](https://github.com/kubernetes/kubernetes/pull/99653), [@aojea](https://github.com/aojea)) [SIG Instrumentation and Network] -- Kube-scheduler now logs plugin scoring summaries at --v=4 ([#99411](https://github.com/kubernetes/kubernetes/pull/99411), [@damemi](https://github.com/damemi)) [SIG Scheduling] -- Kubeadm now includes CoreDNS v1.8.0. ([#96429](https://github.com/kubernetes/kubernetes/pull/96429), [@rajansandeep](https://github.com/rajansandeep)) [SIG Cluster Lifecycle] -- Kubeadm: IPv6DualStack feature gate graduates to Beta and enabled by default ([#99294](https://github.com/kubernetes/kubernetes/pull/99294), [@pacoxu](https://github.com/pacoxu)) -- Kubeadm: a warning to user as ipv6 site-local is deprecated ([#99574](https://github.com/kubernetes/kubernetes/pull/99574), [@pacoxu](https://github.com/pacoxu)) [SIG Cluster Lifecycle and Network] -- Kubeadm: add support for certificate chain validation. When using kubeadm in external CA mode, this allows an intermediate CA to be used to sign the certificates. The intermediate CA certificate must be appended to each signed certificate for this to work correctly. ([#97266](https://github.com/kubernetes/kubernetes/pull/97266), [@robbiemcmichael](https://github.com/robbiemcmichael)) [SIG Cluster Lifecycle] -- Kubeadm: amend the node kernel validation to treat CGROUP_PIDS, FAIR_GROUP_SCHED as required and CFS_BANDWIDTH, CGROUP_HUGETLB as optional ([#96378](https://github.com/kubernetes/kubernetes/pull/96378), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle and Node] -- Kubeadm: apply the "node.kubernetes.io/exclude-from-external-load-balancers" label on control plane nodes during "init", "join" and "upgrade" to preserve backwards compatibility with the lagacy LB mode where nodes labeled as "master" where excluded. To opt-out you can remove the label from a node. See #97543 and the linked KEP for more details. ([#98269](https://github.com/kubernetes/kubernetes/pull/98269), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle] -- Kubeadm: if the user has customized their image repository via the kubeadm configuration, pass the custom pause image repository and tag to the kubelet via --pod-infra-container-image not only for Docker but for all container runtimes. This flag tells the kubelet that it should not garbage collect the image. ([#99476](https://github.com/kubernetes/kubernetes/pull/99476), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle] -- Kubeadm: perform pre-flight validation on host/node name upon `kubeadm init` and `kubeadm join`, showing warnings on non-compliant names ([#99194](https://github.com/kubernetes/kubernetes/pull/99194), [@pacoxu](https://github.com/pacoxu)) -- Kubectl version changed to write a warning message to stderr if the client and server version difference exceeds the supported version skew of +/-1 minor version. ([#98250](https://github.com/kubernetes/kubernetes/pull/98250), [@brianpursley](https://github.com/brianpursley)) [SIG CLI] -- Kubectl: Add `--use-protocol-buffers` flag to kubectl top pods and nodes. ([#96655](https://github.com/kubernetes/kubernetes/pull/96655), [@serathius](https://github.com/serathius)) -- Kubectl: `kubectl get` will omit managed fields by default now. Users could set `--show-managed-fields` to true to show managedFields when the output format is either `json` or `yaml`. ([#96878](https://github.com/kubernetes/kubernetes/pull/96878), [@knight42](https://github.com/knight42)) [SIG CLI and Testing] -- Kubectl: a Pod can be preselected as default container using `kubectl.kubernetes.io/default-container` annotation ([#99833](https://github.com/kubernetes/kubernetes/pull/99833), [@mengjiao-liu](https://github.com/mengjiao-liu)) -- Kubectl: add bash-completion for comma separated list on `kubectl get` ([#98301](https://github.com/kubernetes/kubernetes/pull/98301), [@phil9909](https://github.com/phil9909)) -- Kubernetes is now built using go1.15.8 ([#98834](https://github.com/kubernetes/kubernetes/pull/98834), [@cpanato](https://github.com/cpanato)) [SIG Cloud Provider, Instrumentation, Release and Testing] -- Kubernetes is now built with Golang 1.16 ([#98572](https://github.com/kubernetes/kubernetes/pull/98572), [@justaugustus](https://github.com/justaugustus)) [SIG API Machinery, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Node, Release and Testing] -- Kubernetes is now built with Golang 1.16.1 ([#100106](https://github.com/kubernetes/kubernetes/pull/100106), [@justaugustus](https://github.com/justaugustus)) [SIG Cloud Provider, Instrumentation, Release and Testing] -- Metrics can now be disabled explicitly via a command line flag (i.e. '--disabled-metrics=metric1,metric2') ([#99217](https://github.com/kubernetes/kubernetes/pull/99217), [@logicalhan](https://github.com/logicalhan)) -- New admission controller `DenyServiceExternalIPs` is available. Clusters which do not *need* the Service `externalIPs` feature should enable this controller and be more secure. ([#97395](https://github.com/kubernetes/kubernetes/pull/97395), [@thockin](https://github.com/thockin)) -- Overall, enable the feature of `PreferNominatedNode` will improve the performance of scheduling where preemption might frequently happen, but in theory, enable the feature of `PreferNominatedNode`, the pod might not be scheduled to the best candidate node in the cluster. ([#93179](https://github.com/kubernetes/kubernetes/pull/93179), [@chendave](https://github.com/chendave)) [SIG Scheduling and Testing] -- Persistent Volumes formatted with the btrfs filesystem will now automatically resize when expanded. ([#99361](https://github.com/kubernetes/kubernetes/pull/99361), [@Novex](https://github.com/Novex)) [SIG Storage] -- Port the devicemanager to Windows node to allow device plugins like directx ([#93285](https://github.com/kubernetes/kubernetes/pull/93285), [@aarnaud](https://github.com/aarnaud)) [SIG Node, Testing and Windows] -- Removes cAdvisor JSON metrics (/stats/container, /stats/<podname>/<containername>, /stats/<namespace>/<podname>/<poduid>/<containername>) from the kubelet. ([#99236](https://github.com/kubernetes/kubernetes/pull/99236), [@pacoxu](https://github.com/pacoxu)) -- Rename metrics `etcd_object_counts` to `apiserver_storage_object_counts` and mark it as stable. The original `etcd_object_counts` metrics name is marked as "Deprecated" and will be removed in the future. ([#99785](https://github.com/kubernetes/kubernetes/pull/99785), [@erain](https://github.com/erain)) [SIG API Machinery, Instrumentation and Testing] -- Sysctls graduates to General Availability and thus unconditionally enabled. ([#99158](https://github.com/kubernetes/kubernetes/pull/99158), [@wgahnagl](https://github.com/wgahnagl)) -- The Kubernetes pause image manifest list now contains an image for Windows Server 20H2. ([#97322](https://github.com/kubernetes/kubernetes/pull/97322), [@claudiubelu](https://github.com/claudiubelu)) [SIG Windows] -- The NodeAffinity plugin implements the PreFilter extension, offering enhanced performance for Filter. ([#99213](https://github.com/kubernetes/kubernetes/pull/99213), [@AliceZhang2016](https://github.com/AliceZhang2016)) [SIG Scheduling] -- The `CronJobControllerV2` feature flag graduates to Beta and set to be enabled by default. ([#98878](https://github.com/kubernetes/kubernetes/pull/98878), [@soltysh](https://github.com/soltysh)) -- The `EndpointSlice` mirroring controller mirrors endpoints annotations and labels to the generated endpoint slices, it also ensures that updates on any of these fields are mirrored. - The well-known annotation `endpoints.kubernetes.io/last-change-trigger-time` is skipped and not mirrored. ([#98116](https://github.com/kubernetes/kubernetes/pull/98116), [@aojea](https://github.com/aojea)) -- The `RunAsGroup` feature has been promoted to GA in this release. ([#94641](https://github.com/kubernetes/kubernetes/pull/94641), [@krmayankk](https://github.com/krmayankk)) [SIG Auth and Node] -- The `ServiceAccountIssuerDiscovery` feature has graduated to GA, and is unconditionally enabled. The `ServiceAccountIssuerDiscovery` feature-gate will be removed in 1.22. ([#98553](https://github.com/kubernetes/kubernetes/pull/98553), [@mtaufen](https://github.com/mtaufen)) [SIG API Machinery, Auth and Testing] -- The `TTLAfterFinished` feature flag is now beta and enabled by default ([#98678](https://github.com/kubernetes/kubernetes/pull/98678), [@ahg-g](https://github.com/ahg-g)) -- The apimachinery util/net function used to detect the bind address `ResolveBindAddress()` takes into consideration global IP addresses on loopback interfaces when 1) the host has default routes, or 2) there are no global IPs on those interfaces in order to support more complex network scenarios like BGP Unnumbered RFC 5549 ([#95790](https://github.com/kubernetes/kubernetes/pull/95790), [@aojea](https://github.com/aojea)) [SIG Network] -- The feature gate `RootCAConfigMap` graduated to GA in v1.21 and therefore will be unconditionally enabled. This flag will be removed in v1.22 release. ([#98033](https://github.com/kubernetes/kubernetes/pull/98033), [@zshihang](https://github.com/zshihang)) -- The pause image upgraded to `v3.4.1` in kubelet and kubeadm for both Linux and Windows. ([#98205](https://github.com/kubernetes/kubernetes/pull/98205), [@pacoxu](https://github.com/pacoxu)) -- Update pause container to run as pseudo user and group `65535:65535`. This implies the release of version 3.5 of the container images. ([#97963](https://github.com/kubernetes/kubernetes/pull/97963), [@saschagrunert](https://github.com/saschagrunert)) [SIG CLI, Cloud Provider, Cluster Lifecycle, Node, Release, Security and Testing] -- Update the latest validated version of Docker to 20.10 ([#98977](https://github.com/kubernetes/kubernetes/pull/98977), [@neolit123](https://github.com/neolit123)) [SIG CLI, Cluster Lifecycle and Node] -- Upgrade node local dns to 1.17.0 for better IPv6 support ([#99749](https://github.com/kubernetes/kubernetes/pull/99749), [@pacoxu](https://github.com/pacoxu)) [SIG Cloud Provider and Network] -- Upgrades `IPv6Dualstack` to `Beta` and turns it on by default. New clusters or existing clusters are not be affected until an actor starts adding secondary Pods and service CIDRS CLI flags as described here: [IPv4/IPv6 Dual-stack](https://github.com/kubernetes/enhancements/tree/master/keps/sig-network/563-dual-stack) ([#98969](https://github.com/kubernetes/kubernetes/pull/98969), [@khenidak](https://github.com/khenidak)) -- Users might specify the `kubectl.kubernetes.io/default-container` annotation in a Pod to preselect container for kubectl commands. ([#99581](https://github.com/kubernetes/kubernetes/pull/99581), [@mengjiao-liu](https://github.com/mengjiao-liu)) [SIG CLI] -- When downscaling ReplicaSets, ready and creation timestamps are compared in a logarithmic scale. ([#99212](https://github.com/kubernetes/kubernetes/pull/99212), [@damemi](https://github.com/damemi)) [SIG Apps and Testing] -- When the kubelet is watching a ConfigMap or Secret purely in the context of setting environment variables - for containers, only hold that watch for a defined duration before cancelling it. This change reduces the CPU - and memory usage of the kube-apiserver in large clusters. ([#99393](https://github.com/kubernetes/kubernetes/pull/99393), [@chenyw1990](https://github.com/chenyw1990)) [SIG API Machinery, Node and Testing] -- WindowsEndpointSliceProxying feature gate has graduated to beta and is enabled by default. This means kube-proxy will read from EndpointSlices instead of Endpoints on Windows by default. ([#99794](https://github.com/kubernetes/kubernetes/pull/99794), [@robscott](https://github.com/robscott)) [SIG Network] -- `kubectl wait` ensures that observedGeneration >= generation to prevent stale state reporting. An example scenario can be found on CRD updates. ([#97408](https://github.com/kubernetes/kubernetes/pull/97408), [@KnicKnic](https://github.com/KnicKnic)) - -### 문서 - -- Azure file migration graduates to beta, with CSIMigrationAzureFile flag off by default - as it requires installation of AzureFile CSI Driver. Users should enable CSIMigration and - CSIMigrationAzureFile features and install the [AzureFile CSI Driver](https://github.com/kubernetes-sigs/azurefile-csi-driver) - to avoid disruption to existing Pod and PVC objects at that time. Azure File CSI driver does not support using same persistent - volume with different fsgroups. When CSI migration is enabled for azurefile driver, such case is not supported. - (there is a case we support where volume is mounted with 0777 and then it readable/writable by everyone) ([#96293](https://github.com/kubernetes/kubernetes/pull/96293), [@andyzhangx](https://github.com/andyzhangx)) -- Official support to build kubernetes with docker-machine / remote docker is removed. This change does not affect building kubernetes with docker locally. ([#97935](https://github.com/kubernetes/kubernetes/pull/97935), [@adeniyistephen](https://github.com/adeniyistephen)) [SIG Release and Testing] -- Set kubelet option `--volume-stats-agg-period` to negative value to disable volume calculations. ([#96675](https://github.com/kubernetes/kubernetes/pull/96675), [@pacoxu](https://github.com/pacoxu)) [SIG Node] - -### 실패 테스트 - -- Escape the special characters like `[`, `]` and ` ` that exist in vsphere windows path ([#98830](https://github.com/kubernetes/kubernetes/pull/98830), [@liyanhui1228](https://github.com/liyanhui1228)) [SIG Storage and Windows] -- Kube-proxy: fix a bug on UDP `NodePort` Services where stale connection tracking entries may blackhole the traffic directed to the `NodePort` ([#98305](https://github.com/kubernetes/kubernetes/pull/98305), [@aojea](https://github.com/aojea)) -- Kubelet: fixes a bug in the HostPort dockershim implementation that caused the conformance test "HostPort validates that there is no conflict between pods with same hostPort but different hostIP and protocol" to fail. ([#98755](https://github.com/kubernetes/kubernetes/pull/98755), [@aojea](https://github.com/aojea)) [SIG Cloud Provider, Network and Node] - -### 버그 또는 회귀(regression) - -- AcceleratorStats will be available in the Summary API of kubelet when cri_stats_provider is used. ([#96873](https://github.com/kubernetes/kubernetes/pull/96873), [@ruiwen-zhao](https://github.com/ruiwen-zhao)) [SIG Node] -- All data is no longer automatically deleted when a failure is detected during creation of the volume data file on a CSI volume. Now only the data file and volume path is removed. ([#96021](https://github.com/kubernetes/kubernetes/pull/96021), [@huffmanca](https://github.com/huffmanca)) -- Clean ReplicaSet by revision instead of creation timestamp in deployment controller ([#97407](https://github.com/kubernetes/kubernetes/pull/97407), [@waynepeking348](https://github.com/waynepeking348)) [SIG Apps] -- Cleanup subnet in frontend IP configs to prevent huge subnet request bodies in some scenarios. ([#98133](https://github.com/kubernetes/kubernetes/pull/98133), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider] -- Client-go exec credential plugins will pass stdin only when interactive terminal is detected on stdin. This fixes a bug where previously it was checking if **stdout** is an interactive terminal. ([#99654](https://github.com/kubernetes/kubernetes/pull/99654), [@ankeesler](https://github.com/ankeesler)) -- Cloud-controller-manager: routes controller should not depend on --allocate-node-cidrs ([#97029](https://github.com/kubernetes/kubernetes/pull/97029), [@andrewsykim](https://github.com/andrewsykim)) [SIG Cloud Provider and Testing] -- Cluster Autoscaler version bump to v1.20.0 ([#97011](https://github.com/kubernetes/kubernetes/pull/97011), [@towca](https://github.com/towca)) -- Creating a PVC with DataSource should fail for non-CSI plugins. ([#97086](https://github.com/kubernetes/kubernetes/pull/97086), [@xing-yang](https://github.com/xing-yang)) [SIG Apps and Storage] -- EndpointSlice controller is now less likely to emit FailedToUpdateEndpointSlices events. ([#99345](https://github.com/kubernetes/kubernetes/pull/99345), [@robscott](https://github.com/robscott)) [SIG Apps and Network] -- EndpointSlice controllers are less likely to create duplicate EndpointSlices. ([#100103](https://github.com/kubernetes/kubernetes/pull/100103), [@robscott](https://github.com/robscott)) [SIG Apps and Network] -- EndpointSliceMirroring controller is now less likely to emit FailedToUpdateEndpointSlices events. ([#99756](https://github.com/kubernetes/kubernetes/pull/99756), [@robscott](https://github.com/robscott)) [SIG Apps and Network] -- Ensure all vSphere nodes are are tracked by volume attach-detach controller ([#96689](https://github.com/kubernetes/kubernetes/pull/96689), [@gnufied](https://github.com/gnufied)) -- Ensure empty string annotations are copied over in rollbacks. ([#94858](https://github.com/kubernetes/kubernetes/pull/94858), [@waynepeking348](https://github.com/waynepeking348)) -- Ensure only one LoadBalancer rule is created when HA mode is enabled ([#99825](https://github.com/kubernetes/kubernetes/pull/99825), [@feiskyer](https://github.com/feiskyer)) [SIG Cloud Provider] -- Ensure that client-go's EventBroadcaster is safe (non-racy) during shutdown. ([#95664](https://github.com/kubernetes/kubernetes/pull/95664), [@DirectXMan12](https://github.com/DirectXMan12)) [SIG API Machinery] -- Explicitly pass `KUBE_BUILD_CONFORMANCE=y` in `package-tarballs` to reenable building the conformance tarballs. ([#100571](https://github.com/kubernetes/kubernetes/pull/100571), [@puerco](https://github.com/puerco)) -- Fix Azure file migration e2e test failure when CSIMigration is turned on. ([#97877](https://github.com/kubernetes/kubernetes/pull/97877), [@andyzhangx](https://github.com/andyzhangx)) -- Fix CSI-migrated inline EBS volumes failing to mount if their volumeID is prefixed by aws:// ([#96821](https://github.com/kubernetes/kubernetes/pull/96821), [@wongma7](https://github.com/wongma7)) [SIG Storage] -- Fix CVE-2020-8555 for Gluster client connections. ([#97922](https://github.com/kubernetes/kubernetes/pull/97922), [@liggitt](https://github.com/liggitt)) [SIG Storage] -- Fix NPE in ephemeral storage eviction ([#98261](https://github.com/kubernetes/kubernetes/pull/98261), [@wzshiming](https://github.com/wzshiming)) [SIG Node] -- Fix PermissionDenied issue on SMB mount for Windows ([#99550](https://github.com/kubernetes/kubernetes/pull/99550), [@andyzhangx](https://github.com/andyzhangx)) -- Fix bug that would let the Horizontal Pod Autoscaler scale down despite at least one metric being unavailable/invalid ([#99514](https://github.com/kubernetes/kubernetes/pull/99514), [@mikkeloscar](https://github.com/mikkeloscar)) [SIG Apps and Autoscaling] -- Fix cgroup handling for systemd with cgroup v2 ([#98365](https://github.com/kubernetes/kubernetes/pull/98365), [@odinuge](https://github.com/odinuge)) [SIG Node] -- Fix counting error in service/nodeport/loadbalancer quota check ([#97451](https://github.com/kubernetes/kubernetes/pull/97451), [@pacoxu](https://github.com/pacoxu)) [SIG API Machinery, Network and Testing] -- Fix errors when accessing Windows container stats for Dockershim ([#98510](https://github.com/kubernetes/kubernetes/pull/98510), [@jsturtevant](https://github.com/jsturtevant)) [SIG Node and Windows] -- Fix kube-proxy container image architecture for non amd64 images. ([#98526](https://github.com/kubernetes/kubernetes/pull/98526), [@saschagrunert](https://github.com/saschagrunert)) -- Fix missing cadvisor machine metrics. ([#97006](https://github.com/kubernetes/kubernetes/pull/97006), [@lingsamuel](https://github.com/lingsamuel)) [SIG Node] -- Fix nil VMSS name when setting service to auto mode ([#97366](https://github.com/kubernetes/kubernetes/pull/97366), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider] -- Fix privileged config of Pod Sandbox which was previously ignored. ([#96877](https://github.com/kubernetes/kubernetes/pull/96877), [@xeniumlee](https://github.com/xeniumlee)) -- Fix the panic when kubelet registers if a node object already exists with no Status.Capacity or Status.Allocatable ([#95269](https://github.com/kubernetes/kubernetes/pull/95269), [@SataQiu](https://github.com/SataQiu)) [SIG Node] -- Fix the regression with the slow pods termination. Before this fix pods may take an additional time to terminate - up to one minute. Reversing the change that ensured that CNI resources cleaned up when the pod is removed on API server. ([#97980](https://github.com/kubernetes/kubernetes/pull/97980), [@SergeyKanzhelev](https://github.com/SergeyKanzhelev)) [SIG Node] -- Fix to recover CSI volumes from certain dangling attachments ([#96617](https://github.com/kubernetes/kubernetes/pull/96617), [@yuga711](https://github.com/yuga711)) [SIG Apps and Storage] -- Fix: azure file latency issue for metadata-heavy workloads ([#97082](https://github.com/kubernetes/kubernetes/pull/97082), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage] -- Fixed Cinder volume IDs on OpenStack Train ([#96673](https://github.com/kubernetes/kubernetes/pull/96673), [@jsafrane](https://github.com/jsafrane)) [SIG Cloud Provider] -- Fixed FibreChannel volume plugin corrupting filesystems on detach of multipath volumes. ([#97013](https://github.com/kubernetes/kubernetes/pull/97013), [@jsafrane](https://github.com/jsafrane)) [SIG Storage] -- Fixed a bug in kubelet that will saturate CPU utilization after containerd got restarted. ([#97174](https://github.com/kubernetes/kubernetes/pull/97174), [@hanlins](https://github.com/hanlins)) [SIG Node] -- Fixed a bug that causes smaller number of conntrack-max being used under CPU static policy. (#99225, @xh4n3) ([#99613](https://github.com/kubernetes/kubernetes/pull/99613), [@xh4n3](https://github.com/xh4n3)) [SIG Network] -- Fixed a bug that on k8s nodes, when the policy of INPUT chain in filter table is not ACCEPT, healthcheck nodeport would not work. - Added iptables rules to allow healthcheck nodeport traffic. ([#97824](https://github.com/kubernetes/kubernetes/pull/97824), [@hanlins](https://github.com/hanlins)) [SIG Network] -- Fixed a bug that the kubelet cannot start on BtrfS. ([#98042](https://github.com/kubernetes/kubernetes/pull/98042), [@gjkim42](https://github.com/gjkim42)) [SIG Node] -- Fixed a race condition on API server startup ensuring previously created webhook configurations are effective before the first write request is admitted. ([#95783](https://github.com/kubernetes/kubernetes/pull/95783), [@roycaihw](https://github.com/roycaihw)) [SIG API Machinery] -- Fixed an issue with garbage collection failing to clean up namespaced children of an object also referenced incorrectly by cluster-scoped children ([#98068](https://github.com/kubernetes/kubernetes/pull/98068), [@liggitt](https://github.com/liggitt)) [SIG API Machinery and Apps] -- Fixed authentication_duration_seconds metric scope. Previously, it included whole apiserver request duration which yields inaccurate results. ([#99944](https://github.com/kubernetes/kubernetes/pull/99944), [@marseel](https://github.com/marseel)) -- Fixed bug in CPUManager with race on container map access ([#97427](https://github.com/kubernetes/kubernetes/pull/97427), [@klueska](https://github.com/klueska)) [SIG Node] -- Fixed bug that caused cAdvisor to incorrectly detect single-socket multi-NUMA topology. ([#99315](https://github.com/kubernetes/kubernetes/pull/99315), [@iwankgb](https://github.com/iwankgb)) [SIG Node] -- Fixed cleanup of block devices when /var/lib/kubelet is a symlink. ([#96889](https://github.com/kubernetes/kubernetes/pull/96889), [@jsafrane](https://github.com/jsafrane)) [SIG Storage] -- Fixed no effect namespace when exposing deployment with --dry-run=client. ([#97492](https://github.com/kubernetes/kubernetes/pull/97492), [@masap](https://github.com/masap)) [SIG CLI] -- Fixed provisioning of Cinder volumes migrated to CSI when StorageClass with AllowedTopologies was used. ([#98311](https://github.com/kubernetes/kubernetes/pull/98311), [@jsafrane](https://github.com/jsafrane)) [SIG Storage] -- Fixes a bug of identifying the correct containerd process. ([#97888](https://github.com/kubernetes/kubernetes/pull/97888), [@pacoxu](https://github.com/pacoxu)) -- Fixes add-on manager leader election to use leases instead of endpoints, similar to what kube-controller-manager does in 1.20 ([#98968](https://github.com/kubernetes/kubernetes/pull/98968), [@liggitt](https://github.com/liggitt)) -- Fixes connection errors when using `--volume-host-cidr-denylist` or `--volume-host-allow-local-loopback` ([#98436](https://github.com/kubernetes/kubernetes/pull/98436), [@liggitt](https://github.com/liggitt)) [SIG Network and Storage] -- Fixes problem where invalid selector on `PodDisruptionBudget` leads to a nil pointer dereference that causes the Controller manager to crash loop. ([#98750](https://github.com/kubernetes/kubernetes/pull/98750), [@mortent](https://github.com/mortent)) -- Fixes spurious errors about IPv6 in `kube-proxy` logs on nodes with IPv6 disabled. ([#99127](https://github.com/kubernetes/kubernetes/pull/99127), [@danwinship](https://github.com/danwinship)) -- Fixing a bug where a failed node may not have the NoExecute taint set correctly ([#96876](https://github.com/kubernetes/kubernetes/pull/96876), [@howieyuen](https://github.com/howieyuen)) [SIG Apps and Node] -- GCE Internal LoadBalancer sync loop will now release the ILB IP address upon sync failure. An error in ILB forwarding rule creation will no longer leak IP addresses. ([#97740](https://github.com/kubernetes/kubernetes/pull/97740), [@prameshj](https://github.com/prameshj)) [SIG Cloud Provider and Network] -- Ignore update pod with no new images in alwaysPullImages admission controller ([#96668](https://github.com/kubernetes/kubernetes/pull/96668), [@pacoxu](https://github.com/pacoxu)) [SIG Apps, Auth and Node] -- Improve speed of vSphere PV provisioning and reduce number of API calls ([#100054](https://github.com/kubernetes/kubernetes/pull/100054), [@gnufied](https://github.com/gnufied)) [SIG Cloud Provider and Storage] -- KUBECTL_EXTERNAL_DIFF now accepts equal sign for additional parameters. ([#98158](https://github.com/kubernetes/kubernetes/pull/98158), [@dougsland](https://github.com/dougsland)) [SIG CLI] -- Kube-apiserver: an update of a pod with a generic ephemeral volume dropped that volume if the feature had been disabled since creating the pod with such a volume ([#99446](https://github.com/kubernetes/kubernetes/pull/99446), [@pohly](https://github.com/pohly)) [SIG Apps, Node and Storage] -- Kube-proxy: remove deprecated --cleanup-ipvs flag of kube-proxy, and make --cleanup flag always to flush IPVS ([#97336](https://github.com/kubernetes/kubernetes/pull/97336), [@maaoBit](https://github.com/maaoBit)) [SIG Network] -- Kubeadm installs etcd v3.4.13 when creating cluster v1.19 ([#97244](https://github.com/kubernetes/kubernetes/pull/97244), [@pacoxu](https://github.com/pacoxu)) -- Kubeadm: Fixes a kubeadm upgrade bug that could cause a custom CoreDNS configuration to be replaced with the default. ([#97016](https://github.com/kubernetes/kubernetes/pull/97016), [@rajansandeep](https://github.com/rajansandeep)) [SIG Cluster Lifecycle] -- Kubeadm: Some text in the `kubeadm upgrade plan` output has changed. If you have scripts or other automation that parses this output, please review these changes and update your scripts to account for the new output. ([#98728](https://github.com/kubernetes/kubernetes/pull/98728), [@stmcginnis](https://github.com/stmcginnis)) [SIG Cluster Lifecycle] -- Kubeadm: fix a bug in the host memory detection code on 32bit Linux platforms ([#97403](https://github.com/kubernetes/kubernetes/pull/97403), [@abelbarrera15](https://github.com/abelbarrera15)) [SIG Cluster Lifecycle] -- Kubeadm: fix a bug where "kubeadm join" would not properly handle missing names for existing etcd members. ([#97372](https://github.com/kubernetes/kubernetes/pull/97372), [@ihgann](https://github.com/ihgann)) [SIG Cluster Lifecycle] -- Kubeadm: fix a bug where "kubeadm upgrade" commands can fail if CoreDNS v1.8.0 is installed. ([#97919](https://github.com/kubernetes/kubernetes/pull/97919), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle] -- Kubeadm: fix a bug where external credentials in an existing admin.conf prevented the CA certificate to be written in the cluster-info ConfigMap. ([#98882](https://github.com/kubernetes/kubernetes/pull/98882), [@kvaps](https://github.com/kvaps)) [SIG Cluster Lifecycle] -- Kubeadm: get k8s CI version markers from k8s infra bucket ([#98836](https://github.com/kubernetes/kubernetes/pull/98836), [@hasheddan](https://github.com/hasheddan)) [SIG Cluster Lifecycle and Release] -- Kubeadm: skip validating pod subnet against node-cidr-mask when allocate-node-cidrs is set to be false ([#98984](https://github.com/kubernetes/kubernetes/pull/98984), [@SataQiu](https://github.com/SataQiu)) [SIG Cluster Lifecycle] -- Kubectl logs: `--ignore-errors` is now honored by all containers, maintaining consistency with parallelConsumeRequest behavior. ([#97686](https://github.com/kubernetes/kubernetes/pull/97686), [@wzshiming](https://github.com/wzshiming)) -- Kubectl-convert: Fix `no kind "Ingress" is registered for version` error ([#97754](https://github.com/kubernetes/kubernetes/pull/97754), [@wzshiming](https://github.com/wzshiming)) -- Kubectl: Fixed panic when describing an ingress backend without an API Group ([#100505](https://github.com/kubernetes/kubernetes/pull/100505), [@lauchokyip](https://github.com/lauchokyip)) [SIG CLI] -- Kubelet now cleans up orphaned volume directories automatically ([#95301](https://github.com/kubernetes/kubernetes/pull/95301), [@lorenz](https://github.com/lorenz)) [SIG Node and Storage] -- Kubelet.exe on Windows now checks that the process running as administrator and the executing user account is listed in the built-in administrators group. This is the equivalent to checking the process is running as uid 0. ([#96616](https://github.com/kubernetes/kubernetes/pull/96616), [@perithompson](https://github.com/perithompson)) [SIG Node and Windows] -- Kubelet: Fix kubelet from panic after getting the wrong signal ([#98200](https://github.com/kubernetes/kubernetes/pull/98200), [@wzshiming](https://github.com/wzshiming)) [SIG Node] -- Kubelet: Fix repeatedly acquiring the inhibit lock ([#98088](https://github.com/kubernetes/kubernetes/pull/98088), [@wzshiming](https://github.com/wzshiming)) [SIG Node] -- Kubelet: Fixed the bug of getting the number of cpu when the number of cpu logical processors is more than 64 in windows ([#97378](https://github.com/kubernetes/kubernetes/pull/97378), [@hwdef](https://github.com/hwdef)) [SIG Node and Windows] -- Limits lease to have 1000 maximum attached objects. ([#98257](https://github.com/kubernetes/kubernetes/pull/98257), [@lingsamuel](https://github.com/lingsamuel)) -- Mitigate CVE-2020-8555 for kube-up using GCE by preventing local loopback folume hosts. ([#97934](https://github.com/kubernetes/kubernetes/pull/97934), [@mattcary](https://github.com/mattcary)) [SIG Cloud Provider and Storage] -- On single-stack configured (IPv4 or IPv6, but not both) clusters, Services which are both headless (no clusterIP) and selectorless (empty or undefined selector) will report `ipFamilyPolicy RequireDualStack` and will have entries in `ipFamilies[]` for both IPv4 and IPv6. This is a change from alpha, but does not have any impact on the manually-specified Endpoints and EndpointSlices for the Service. ([#99555](https://github.com/kubernetes/kubernetes/pull/99555), [@thockin](https://github.com/thockin)) [SIG Apps and Network] -- Performance regression #97685 has been fixed. ([#97860](https://github.com/kubernetes/kubernetes/pull/97860), [@MikeSpreitzer](https://github.com/MikeSpreitzer)) [SIG API Machinery] -- Pod Log stats for windows now reports metrics ([#99221](https://github.com/kubernetes/kubernetes/pull/99221), [@jsturtevant](https://github.com/jsturtevant)) [SIG Node, Storage, Testing and Windows] -- Pod status updates faster when reacting on probe results. The first readiness probe will be called faster when startup probes succeeded, which will make Pod status as ready faster. ([#98376](https://github.com/kubernetes/kubernetes/pull/98376), [@matthyx](https://github.com/matthyx)) -- Readjust `kubelet_containers_per_pod_count` buckets to only show metrics greater than 1. ([#98169](https://github.com/kubernetes/kubernetes/pull/98169), [@wawa0210](https://github.com/wawa0210)) -- Remove CSI topology from migrated in-tree gcepd volume. ([#97823](https://github.com/kubernetes/kubernetes/pull/97823), [@Jiawei0227](https://github.com/Jiawei0227)) [SIG Cloud Provider and Storage] -- Requests with invalid timeout parameters in the request URL now appear in the audit log correctly. ([#96901](https://github.com/kubernetes/kubernetes/pull/96901), [@tkashem](https://github.com/tkashem)) [SIG API Machinery and Testing] -- Resolve a "concurrent map read and map write" crashing error in the kubelet ([#95111](https://github.com/kubernetes/kubernetes/pull/95111), [@choury](https://github.com/choury)) [SIG Node] -- Resolves spurious `Failed to list *v1.Secret` or `Failed to list *v1.ConfigMap` messages in kubelet logs. ([#99538](https://github.com/kubernetes/kubernetes/pull/99538), [@liggitt](https://github.com/liggitt)) [SIG Auth and Node] -- ResourceQuota of an entity now inclusively calculate Pod overhead ([#99600](https://github.com/kubernetes/kubernetes/pull/99600), [@gjkim42](https://github.com/gjkim42)) -- Return zero time (midnight on Jan. 1, 1970) instead of negative number when reporting startedAt and finishedAt of the not started or a running Pod when using `dockershim` as a runtime. ([#99585](https://github.com/kubernetes/kubernetes/pull/99585), [@Iceber](https://github.com/Iceber)) -- Reverts breaking change to inline AzureFile volumes; referenced secrets are now searched for in the same namespace as the pod as in previous releases. ([#100563](https://github.com/kubernetes/kubernetes/pull/100563), [@msau42](https://github.com/msau42)) -- Scores from InterPodAffinity have stronger differentiation. ([#98096](https://github.com/kubernetes/kubernetes/pull/98096), [@leileiwan](https://github.com/leileiwan)) [SIG Scheduling] -- Specifying the KUBE_TEST_REPO environment variable when e2e tests are executed will instruct the test infrastructure to load that image from a location within the specified repo, using a predefined pattern. ([#93510](https://github.com/kubernetes/kubernetes/pull/93510), [@smarterclayton](https://github.com/smarterclayton)) [SIG Testing] -- Static pods will be deleted gracefully. ([#98103](https://github.com/kubernetes/kubernetes/pull/98103), [@gjkim42](https://github.com/gjkim42)) [SIG Node] -- Sync node status during kubelet node shutdown. - Adds an pod admission handler that rejects new pods when the node is in progress of shutting down. ([#98005](https://github.com/kubernetes/kubernetes/pull/98005), [@wzshiming](https://github.com/wzshiming)) [SIG Node] -- The calculation of pod UIDs for static pods has changed to ensure each static pod gets a unique value - this will cause all static pod containers to be recreated/restarted if an in-place kubelet upgrade from 1.20 to 1.21 is performed. Note that draining pods before upgrading the kubelet across minor versions is the supported upgrade path. ([#87461](https://github.com/kubernetes/kubernetes/pull/87461), [@bboreham](https://github.com/bboreham)) [SIG Node] -- The maximum number of ports allowed in EndpointSlices has been increased from 100 to 20,000 ([#99795](https://github.com/kubernetes/kubernetes/pull/99795), [@robscott](https://github.com/robscott)) [SIG Network] -- Truncates a message if it hits the `NoteLengthLimit` when the scheduler records an event for the pod that indicates the pod has failed to schedule. ([#98715](https://github.com/kubernetes/kubernetes/pull/98715), [@carlory](https://github.com/carlory)) -- Updated k8s.gcr.io/ingress-gce-404-server-with-metrics-amd64 to a version that serves /metrics endpoint on a non-default port. ([#97621](https://github.com/kubernetes/kubernetes/pull/97621), [@vbannai](https://github.com/vbannai)) [SIG Cloud Provider] -- Updates the commands ` - - kubectl kustomize {arg} - - kubectl apply -k {arg} - `to use same code as kustomize CLI [v4.0.5](https://github.com/kubernetes-sigs/kustomize/releases/tag/kustomize%2Fv4.0.5) ([#98946](https://github.com/kubernetes/kubernetes/pull/98946), [@monopole](https://github.com/monopole)) -- Use force unmount for NFS volumes if regular mount fails after 1 minute timeout ([#96844](https://github.com/kubernetes/kubernetes/pull/96844), [@gnufied](https://github.com/gnufied)) [SIG Storage] -- Use network.Interface.VirtualMachine.ID to get the binded VM - Skip standalone VM when reconciling LoadBalancer ([#97635](https://github.com/kubernetes/kubernetes/pull/97635), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider] -- Using exec auth plugins with kubectl no longer results in warnings about constructing many client instances from the same exec auth config. ([#97857](https://github.com/kubernetes/kubernetes/pull/97857), [@liggitt](https://github.com/liggitt)) [SIG API Machinery and Auth] -- When a CNI plugin returns dual-stack pod IPs, kubelet will now try to respect the - "primary IP family" of the cluster by picking a primary pod IP of the same family - as the (primary) node IP, rather than assuming that the CNI plugin returned the IPs - in the order the administrator wanted (since some CNI plugins don't allow - configuring this). ([#97979](https://github.com/kubernetes/kubernetes/pull/97979), [@danwinship](https://github.com/danwinship)) [SIG Network and Node] -- When dynamically provisioning Azure File volumes for a premium account, the requested size will be set to 100GB if the request is initially lower than this value to accommodate Azure File requirements. ([#99122](https://github.com/kubernetes/kubernetes/pull/99122), [@huffmanca](https://github.com/huffmanca)) [SIG Cloud Provider and Storage] -- When using `Containerd` on Windows, the `C:\Windows\System32\drivers\etc\hosts` file will now be managed by kubelet. ([#83730](https://github.com/kubernetes/kubernetes/pull/83730), [@claudiubelu](https://github.com/claudiubelu)) -- `VolumeBindingArgs` now allow `BindTimeoutSeconds` to be set as zero, while the value zero indicates no waiting for the checking of volume binding operation. ([#99835](https://github.com/kubernetes/kubernetes/pull/99835), [@chendave](https://github.com/chendave)) [SIG Scheduling and Storage] -- `kubectl exec` and `kubectl attach` now honor the `--quiet` flag which suppresses output from the local binary that could be confused by a script with the remote command output (all non-failure output is hidden). In addition, print inline with exec and attach the list of alternate containers when we default to the first spec.container. ([#99004](https://github.com/kubernetes/kubernetes/pull/99004), [@smarterclayton](https://github.com/smarterclayton)) [SIG CLI] - -### 기타 (정리 또는 플레이크(flake)) - -- APIs for kubelet annotations and labels from `k8s.io/kubernetes/pkg/kubelet/apis` are now moved under `k8s.io/kubelet/pkg/apis/` ([#98931](https://github.com/kubernetes/kubernetes/pull/98931), [@michaelbeaumont](https://github.com/michaelbeaumont)) -- Apiserver_request_duration_seconds is promoted to stable status. ([#99925](https://github.com/kubernetes/kubernetes/pull/99925), [@logicalhan](https://github.com/logicalhan)) [SIG API Machinery, Instrumentation and Testing] -- Bump github.com/Azure/go-autorest/autorest to v0.11.12 ([#97033](https://github.com/kubernetes/kubernetes/pull/97033), [@patrickshan](https://github.com/patrickshan)) [SIG API Machinery, CLI, Cloud Provider and Cluster Lifecycle] -- Clients required to use go1.15.8+ or go1.16+ if kube-apiserver has the goaway feature enabled to avoid unexpected data race condition. ([#98809](https://github.com/kubernetes/kubernetes/pull/98809), [@answer1991](https://github.com/answer1991)) -- Delete deprecated `service.beta.kubernetes.io/azure-load-balancer-mixed-protocols` mixed procotol annotation in favor of the MixedProtocolLBService feature ([#97096](https://github.com/kubernetes/kubernetes/pull/97096), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider] -- EndpointSlice generation is now incremented when labels change. ([#99750](https://github.com/kubernetes/kubernetes/pull/99750), [@robscott](https://github.com/robscott)) [SIG Network] -- Featuregate AllowInsecureBackendProxy graduates to GA and unconditionally enabled. ([#99658](https://github.com/kubernetes/kubernetes/pull/99658), [@deads2k](https://github.com/deads2k)) -- Increase timeout for pod lifecycle test to reach pod status=ready ([#96691](https://github.com/kubernetes/kubernetes/pull/96691), [@hh](https://github.com/hh)) -- Increased `CSINodeIDMaxLength` from 128 bytes to 192 bytes. ([#98753](https://github.com/kubernetes/kubernetes/pull/98753), [@Jiawei0227](https://github.com/Jiawei0227)) -- Kube-apiserver: The OIDC authenticator no longer waits 10 seconds before attempting to fetch the metadata required to verify tokens. ([#97693](https://github.com/kubernetes/kubernetes/pull/97693), [@enj](https://github.com/enj)) [SIG API Machinery and Auth] -- Kube-proxy: Traffic from the cluster directed to ExternalIPs is always sent directly to the Service. ([#96296](https://github.com/kubernetes/kubernetes/pull/96296), [@aojea](https://github.com/aojea)) [SIG Network and Testing] -- Kubeadm: change the default image repository for CI images from 'gcr.io/kubernetes-ci-images' to 'gcr.io/k8s-staging-ci-images' ([#97087](https://github.com/kubernetes/kubernetes/pull/97087), [@SataQiu](https://github.com/SataQiu)) [SIG Cluster Lifecycle] -- Kubectl: The deprecated `kubectl alpha debug` command is removed. Use `kubectl debug` instead. ([#98111](https://github.com/kubernetes/kubernetes/pull/98111), [@pandaamanda](https://github.com/pandaamanda)) [SIG CLI] -- Kubelet command line flags related to dockershim are now showing deprecation message as they will be removed along with dockershim in future release. ([#98730](https://github.com/kubernetes/kubernetes/pull/98730), [@dims](https://github.com/dims)) -- Official support to build kubernetes with docker-machine / remote docker is removed. This change does not affect building kubernetes with docker locally. ([#97618](https://github.com/kubernetes/kubernetes/pull/97618), [@jherrera123](https://github.com/jherrera123)) [SIG Release and Testing] -- Process start time on Windows now uses current process information ([#97491](https://github.com/kubernetes/kubernetes/pull/97491), [@jsturtevant](https://github.com/jsturtevant)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation and Windows] -- Resolves flakes in the Ingress conformance tests due to conflicts with controllers updating the Ingress object ([#98430](https://github.com/kubernetes/kubernetes/pull/98430), [@liggitt](https://github.com/liggitt)) [SIG Network and Testing] -- The `AttachVolumeLimit` feature gate (GA since v1.17) has been removed and now unconditionally enabled. ([#96539](https://github.com/kubernetes/kubernetes/pull/96539), [@ialidzhikov](https://github.com/ialidzhikov)) -- The `CSINodeInfo` feature gate that is GA since v1.17 is unconditionally enabled, and can no longer be specified via the `--feature-gates` argument. ([#96561](https://github.com/kubernetes/kubernetes/pull/96561), [@ialidzhikov](https://github.com/ialidzhikov)) [SIG Apps, Auth, Scheduling, Storage and Testing] -- The `apiserver_request_total` metric is promoted to stable status and no longer has a content-type dimensions, so any alerts/charts which presume the existence of this will fail. This is however, unlikely to be the case since it was effectively an unbounded dimension in the first place. ([#99788](https://github.com/kubernetes/kubernetes/pull/99788), [@logicalhan](https://github.com/logicalhan)) -- The default delegating authorization options now allow unauthenticated access to healthz, readyz, and livez. A system:masters user connecting to an authz delegator will not perform an authz check. ([#98325](https://github.com/kubernetes/kubernetes/pull/98325), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, Auth, Cloud Provider and Scheduling] -- The deprecated feature gates `CSIDriverRegistry`, `BlockVolume` and `CSIBlockVolume` are now unconditionally enabled and can no longer be specified in component invocations. ([#98021](https://github.com/kubernetes/kubernetes/pull/98021), [@gavinfish](https://github.com/gavinfish)) [SIG Storage] -- The deprecated feature gates `RotateKubeletClientCertificate`, `AttachVolumeLimit`, `VolumePVCDataSource` and `EvenPodsSpread` are now unconditionally enabled and can no longer be specified in component invocations. ([#97306](https://github.com/kubernetes/kubernetes/pull/97306), [@gavinfish](https://github.com/gavinfish)) [SIG Node, Scheduling and Storage] -- The e2e suite can be instructed not to wait for pods in kube-system to be ready or for all nodes to be ready by passing `--allowed-not-ready-nodes=-1` when invoking the e2e.test program. This allows callers to run subsets of the e2e suite in scenarios other than perfectly healthy clusters. ([#98781](https://github.com/kubernetes/kubernetes/pull/98781), [@smarterclayton](https://github.com/smarterclayton)) [SIG Testing] -- The feature gates `WindowsGMSA` and `WindowsRunAsUserName` that are GA since v1.18 are now removed. ([#96531](https://github.com/kubernetes/kubernetes/pull/96531), [@ialidzhikov](https://github.com/ialidzhikov)) [SIG Node and Windows] -- The new `-gce-zones` flag on the `e2e.test` binary instructs tests that check for information about how the cluster interacts with the cloud to limit their queries to the provided zone list. If not specified, the current behavior of asking the cloud provider for all available zones in multi zone clusters is preserved. ([#98787](https://github.com/kubernetes/kubernetes/pull/98787), [@smarterclayton](https://github.com/smarterclayton)) [SIG API Machinery, Cluster Lifecycle and Testing] -- Update cri-tools to [v1.20.0](https://github.com/kubernetes-sigs/cri-tools/releases/tag/v1.20.0) ([#97967](https://github.com/kubernetes/kubernetes/pull/97967), [@rajibmitra](https://github.com/rajibmitra)) [SIG Cloud Provider] -- Windows nodes on GCE will take longer to start due to dependencies installed at node creation time. ([#98284](https://github.com/kubernetes/kubernetes/pull/98284), [@pjh](https://github.com/pjh)) [SIG Cloud Provider] -- `apiserver_storage_objects` (a newer version of `etcd_object_counts`) is promoted and marked as stable. ([#100082](https://github.com/kubernetes/kubernetes/pull/100082), [@logicalhan](https://github.com/logicalhan)) - -### 분류되지 않음 - -- GCE L4 Loadbalancers now handle > 5 ports in service spec correctly. ([#99595](https://github.com/kubernetes/kubernetes/pull/99595), [@prameshj](https://github.com/prameshj)) [SIG Cloud Provider] -- The DownwardAPIHugePages feature is beta. Users may use the feature if all workers in their cluster are min 1.20 version. The feature will be enabled by default in all installations in 1.22. ([#99610](https://github.com/kubernetes/kubernetes/pull/99610), [@derekwaynecarr](https://github.com/derekwaynecarr)) [SIG Node] - -## 의존성 - -### 추가 -- github.com/go-errors/errors: [v1.0.1](https://github.com/go-errors/errors/tree/v1.0.1) -- github.com/gobuffalo/here: [v0.6.0](https://github.com/gobuffalo/here/tree/v0.6.0) -- github.com/google/shlex: [e7afc7f](https://github.com/google/shlex/tree/e7afc7f) -- github.com/markbates/pkger: [v0.17.1](https://github.com/markbates/pkger/tree/v0.17.1) -- github.com/moby/spdystream: [v0.2.0](https://github.com/moby/spdystream/tree/v0.2.0) -- github.com/monochromegane/go-gitignore: [205db1a](https://github.com/monochromegane/go-gitignore/tree/205db1a) -- github.com/niemeyer/pretty: [a10e7ca](https://github.com/niemeyer/pretty/tree/a10e7ca) -- github.com/xlab/treeprint: [a009c39](https://github.com/xlab/treeprint/tree/a009c39) -- go.starlark.net: 8dd3e2e -- golang.org/x/term: 6a3ed07 -- sigs.k8s.io/kustomize/api: v0.8.5 -- sigs.k8s.io/kustomize/cmd/config: v0.9.7 -- sigs.k8s.io/kustomize/kustomize/v4: v4.0.5 -- sigs.k8s.io/kustomize/kyaml: v0.10.15 - -### 변경 -- dmitri.shuralyov.com/gpu/mtl: 666a987 → 28db891 -- github.com/Azure/go-autorest/autorest: [v0.11.1 → v0.11.12](https://github.com/Azure/go-autorest/autorest/compare/v0.11.1...v0.11.12) -- github.com/NYTimes/gziphandler: [56545f4 → v1.1.1](https://github.com/NYTimes/gziphandler/compare/56545f4...v1.1.1) -- github.com/cilium/ebpf: [1c8d4c9 → v0.2.0](https://github.com/cilium/ebpf/compare/1c8d4c9...v0.2.0) -- github.com/container-storage-interface/spec: [v1.2.0 → v1.3.0](https://github.com/container-storage-interface/spec/compare/v1.2.0...v1.3.0) -- github.com/containerd/console: [v1.0.0 → v1.0.1](https://github.com/containerd/console/compare/v1.0.0...v1.0.1) -- github.com/containerd/containerd: [v1.4.1 → v1.4.4](https://github.com/containerd/containerd/compare/v1.4.1...v1.4.4) -- github.com/coredns/corefile-migration: [v1.0.10 → v1.0.11](https://github.com/coredns/corefile-migration/compare/v1.0.10...v1.0.11) -- github.com/creack/pty: [v1.1.7 → v1.1.11](https://github.com/creack/pty/compare/v1.1.7...v1.1.11) -- github.com/docker/docker: [bd33bbf → v20.10.2+incompatible](https://github.com/docker/docker/compare/bd33bbf...v20.10.2) -- github.com/go-logr/logr: [v0.2.0 → v0.4.0](https://github.com/go-logr/logr/compare/v0.2.0...v0.4.0) -- github.com/go-openapi/spec: [v0.19.3 → v0.19.5](https://github.com/go-openapi/spec/compare/v0.19.3...v0.19.5) -- github.com/go-openapi/strfmt: [v0.19.3 → v0.19.5](https://github.com/go-openapi/strfmt/compare/v0.19.3...v0.19.5) -- github.com/go-openapi/validate: [v0.19.5 → v0.19.8](https://github.com/go-openapi/validate/compare/v0.19.5...v0.19.8) -- github.com/gogo/protobuf: [v1.3.1 → v1.3.2](https://github.com/gogo/protobuf/compare/v1.3.1...v1.3.2) -- github.com/golang/mock: [v1.4.1 → v1.4.4](https://github.com/golang/mock/compare/v1.4.1...v1.4.4) -- github.com/google/cadvisor: [v0.38.5 → v0.39.0](https://github.com/google/cadvisor/compare/v0.38.5...v0.39.0) -- github.com/heketi/heketi: [c2e2a4a → v10.2.0+incompatible](https://github.com/heketi/heketi/compare/c2e2a4a...v10.2.0) -- github.com/kisielk/errcheck: [v1.2.0 → v1.5.0](https://github.com/kisielk/errcheck/compare/v1.2.0...v1.5.0) -- github.com/konsorten/go-windows-terminal-sequences: [v1.0.3 → v1.0.2](https://github.com/konsorten/go-windows-terminal-sequences/compare/v1.0.3...v1.0.2) -- github.com/kr/text: [v0.1.0 → v0.2.0](https://github.com/kr/text/compare/v0.1.0...v0.2.0) -- github.com/mattn/go-runewidth: [v0.0.2 → v0.0.7](https://github.com/mattn/go-runewidth/compare/v0.0.2...v0.0.7) -- github.com/miekg/dns: [v1.1.4 → v1.1.35](https://github.com/miekg/dns/compare/v1.1.4...v1.1.35) -- github.com/moby/sys/mountinfo: [v0.1.3 → v0.4.0](https://github.com/moby/sys/mountinfo/compare/v0.1.3...v0.4.0) -- github.com/moby/term: [672ec06 → df9cb8a](https://github.com/moby/term/compare/672ec06...df9cb8a) -- github.com/mrunalp/fileutils: [abd8a0e → v0.5.0](https://github.com/mrunalp/fileutils/compare/abd8a0e...v0.5.0) -- github.com/olekukonko/tablewriter: [a0225b3 → v0.0.4](https://github.com/olekukonko/tablewriter/compare/a0225b3...v0.0.4) -- github.com/opencontainers/runc: [v1.0.0-rc92 → v1.0.0-rc93](https://github.com/opencontainers/runc/compare/v1.0.0-rc92...v1.0.0-rc93) -- github.com/opencontainers/runtime-spec: [4d89ac9 → e6143ca](https://github.com/opencontainers/runtime-spec/compare/4d89ac9...e6143ca) -- github.com/opencontainers/selinux: [v1.6.0 → v1.8.0](https://github.com/opencontainers/selinux/compare/v1.6.0...v1.8.0) -- github.com/sergi/go-diff: [v1.0.0 → v1.1.0](https://github.com/sergi/go-diff/compare/v1.0.0...v1.1.0) -- github.com/sirupsen/logrus: [v1.6.0 → v1.7.0](https://github.com/sirupsen/logrus/compare/v1.6.0...v1.7.0) -- github.com/syndtr/gocapability: [d983527 → 42c35b4](https://github.com/syndtr/gocapability/compare/d983527...42c35b4) -- github.com/willf/bitset: [d5bec33 → v1.1.11](https://github.com/willf/bitset/compare/d5bec33...v1.1.11) -- github.com/yuin/goldmark: [v1.1.27 → v1.2.1](https://github.com/yuin/goldmark/compare/v1.1.27...v1.2.1) -- golang.org/x/crypto: 7f63de1 → 5ea612d -- golang.org/x/exp: 6cc2880 → 85be41e -- golang.org/x/mobile: d2bd2a2 → e6ae53a -- golang.org/x/mod: v0.3.0 → ce943fd -- golang.org/x/net: 69a7880 → 3d97a24 -- golang.org/x/sync: cd5d95a → 67f06af -- golang.org/x/sys: 5cba982 → a50acf3 -- golang.org/x/time: 3af7569 → f8bda1e -- golang.org/x/tools: c1934b7 → v0.1.0 -- gopkg.in/check.v1: 41f04d3 → 8fa4692 -- gopkg.in/yaml.v2: v2.2.8 → v2.4.0 -- gotest.tools/v3: v3.0.2 → v3.0.3 -- k8s.io/gengo: 83324d8 → b6c5ce2 -- k8s.io/klog/v2: v2.4.0 → v2.8.0 -- k8s.io/kube-openapi: d219536 → 591a79e -- k8s.io/system-validators: v1.2.0 → v1.4.0 -- sigs.k8s.io/apiserver-network-proxy/konnectivity-client: v0.0.14 → v0.0.15 -- sigs.k8s.io/structured-merge-diff/v4: v4.0.2 → v4.1.0 - -### 제거 -- github.com/codegangsta/negroni: [v1.0.0](https://github.com/codegangsta/negroni/tree/v1.0.0) -- github.com/docker/spdystream: [449fdfc](https://github.com/docker/spdystream/tree/449fdfc) -- github.com/golangplus/bytes: [45c989f](https://github.com/golangplus/bytes/tree/45c989f) -- github.com/golangplus/fmt: [2a5d6d7](https://github.com/golangplus/fmt/tree/2a5d6d7) -- github.com/gorilla/context: [v1.1.1](https://github.com/gorilla/context/tree/v1.1.1) -- github.com/kr/pty: [v1.1.5](https://github.com/kr/pty/tree/v1.1.5) -- rsc.io/quote/v3: v3.1.0 -- rsc.io/sampler: v1.3.0 -- sigs.k8s.io/kustomize: v2.0.3+incompatible - - - -# v1.21.0-rc.0 - - -## Downloads for v1.21.0-rc.0 - -### Source Code - -filename | sha512 hash --------- | ----------- -[kubernetes.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes.tar.gz) | ef53a41955d6f8a8d2a94636af98b55d633fb8a5081517559039e019b3dd65c9d10d4e7fa297ab88a7865d772f3eecf72e7b0eeba5e87accb4000c91da33e148 -[kubernetes-src.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-src.tar.gz) | 9335a01b50d351776d3b8d00c07a5233844c51d307e361fa7e55a0620c1cb8b699e43eacf45ae9cafd8cbc44752e6987450c528a5bede8204706b7673000b5fc - -### Client binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-client-darwin-amd64.tar.gz) | 964135e43234cee275c452f5f06fb6d2bcd3cff3211a0d50fa35fff1cc4446bc5a0ac5125405dadcfb6596cb152afe29fabf7aad5b35b100e1288db890b70f8e -[kubernetes-client-darwin-arm64.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-client-darwin-arm64.tar.gz) | 50d782abaa4ded5e706b3192d87effa953ceabbd7d91e3d48b0c1fa2206a1963a909c14b923560f5d09cac2c7392edc5f38a13fbf1e9a40bc94e3afe8de10622 -[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-client-linux-386.tar.gz) | 72af5562f24184a2d7c27f95fa260470da979fbdcacce39a372f8f3add2991d7af8bc78f4e1dbe7a0f97e3f559b149b72a51491d3b13008da81872ee50f02f37 -[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-client-linux-amd64.tar.gz) | 1eddb8f6b51e005bc6f7b519d036cbe3d2f6d97dbf7d212dd933fb56354c29f222d050519115a9bcf94555aef095db7cf763469e47bb4ae3c6c07f97edf437cb -[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-client-linux-arm.tar.gz) | 670f8ca60ea3cf0bb3262a772715e0ea735fccda6a92f3186299361dc455b304ae177d4017e0b67bbfa4a95e36f4cc3f7eb335e2a5130c93ac3fba2aff4519bf -[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-client-linux-arm64.tar.gz) | a69a47907cff138ba393d8c87044fd95d97f3ca8f35d301b50742e2801ad7c229d99d6667971091f65825eb51854d585be0dd7421670110b1aa567e67e7ab4b3 -[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-client-linux-ppc64le.tar.gz) | b929feade94b71c81908abdcd4343b1e1e20098fd65e10d4d02585ad649d292d06f52c7ddc349efa188ce5b093e703c7aa9582c6ae5a69699adb87bbf5350243 -[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-client-linux-s390x.tar.gz) | 899d1470e412282cf289d8e24806d1a08c62ec0151f345ae3c9e497cc7bc0feab76498de4dd897d6adcdfa0c422e6b1a37e25d928669030f53457fd69d6e7df7 -[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-client-windows-386.tar.gz) | 9f0bc90a269eabd06fe4f637b5172a3a6a7d3de26de0d66504c2e1f2093083c584ea39031db6075a7da7a86b98c48bed25aa88d4ac09060b38692c6a5b637078 -[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-client-windows-amd64.tar.gz) | 05c8cc10188a1294b0d51d052942742a9b26411a08ec73494bf0e728a8a167e0a7863bdfc8864e76a371b584380098381805341e18b4b283b5d0cf298d5f7c7c - -### Server binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-server-linux-amd64.tar.gz) | 355f278728ef7ac7eb2f5568c99c1429543c6302bbd0ed3bd0378c08116075e56ae850a49241313f078e2392702672ec6c9b70c8d97b4f2f5f4bee36828a63ba -[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-server-linux-arm.tar.gz) | 9ac02c2825e2fd4e92f0c0f67180c67c24e32841ccbabc82284bf6293727ffecfae65e8a42b527c2a7ca482752384928eb65c2a1706144ae7819a6b3a1ab291c -[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-server-linux-arm64.tar.gz) | eb412453da03c82a9248412c8ccf4d4baa1fbfa81edd8d4f81d28969b40a3727e18934accc68f643d253446c58ffd2623292402495480b3d4b2a837b5318b957 -[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-server-linux-ppc64le.tar.gz) | 07da2812c35bbc427ee5b4a0b601c3ae271e0d50ab0dd4c5c25399f43506fa2a187642eb9d4d2085df7b90264d48ea2f31088af87d9efa7eb2e87f91e1fdbde4 -[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-server-linux-s390x.tar.gz) | 3b79442a3d6e389c4ff105922a8e49994c0b6c088d2c501bd8c78d9f9e814902f5bb72c8f9c89380b750fda9b3a336759b9b68f11d70bef4f0e984564a95c29e - -### Node binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-node-linux-amd64.tar.gz) | f12edf1faf5f07de1ebc5a8626601c12927902e10aca3f11e398637382fdf55365dbd9a0ef38858553fb7569495ae2cf68f155dd2e49b85b27d76fb599bb92e4 -[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-node-linux-arm.tar.gz) | 4fba8fc4e2102f07fb778aab597ec7231ea65c35e1aa618fe98b707b64a931237bd842c173e9120326e4d9deb983bb3917176762bba2212612bbc09d6e2105c4 -[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-node-linux-arm64.tar.gz) | a2e1be5459a8346839970faf4e7ebdb8ab9f3273e02babf1f3199b06bdb67434a2d18fcd1628cf1b989756e99d8dad6624a455b9db11d50f51f509f4df5c27da -[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-node-linux-ppc64le.tar.gz) | 16d2c1cc295474fc49fe9a827ddd73e81bdd6b76af7074987b90250023f99b6d70bf474e204c7d556802111984fcb3a330740b150bdc7970d0e3634eb94a1665 -[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-node-linux-s390x.tar.gz) | 9dc6faa6cd007b13dfce703f3e271f80adcc4e029c90a4a9b4f2f143b9756f2893f8af3d7c2cf813f2bd6731cffd87d15d4229456c1685939f65bf467820ec6e -[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.21.0-rc.0/kubernetes-node-windows-amd64.tar.gz) | f8bac2974c9142bfb80cd5eadeda79f79f27b78899a4e6e71809b795c708824ba442be83fdbadb98e01c3823dd8350776358258a205e851ed045572923cacba7 - -## Changelog since v1.21.0-beta.1 - -## Urgent Upgrade Notes - -### (No, really, you MUST read this before you upgrade) - - - Migrated pkg/kubelet/cm/cpuset/cpuset.go to structured logging. Exit code changed from 255 to 1. ([#100007](https://github.com/kubernetes/kubernetes/pull/100007), [@utsavoza](https://github.com/utsavoza)) [SIG Instrumentation and Node] - -## Changes by Kind - -### API Change - -- Add Probe-level terminationGracePeriodSeconds field ([#99375](https://github.com/kubernetes/kubernetes/pull/99375), [@ehashman](https://github.com/ehashman)) [SIG API Machinery, Apps, Node and Testing] -- CSIServiceAccountToken is Beta now ([#99298](https://github.com/kubernetes/kubernetes/pull/99298), [@zshihang](https://github.com/zshihang)) [SIG Auth, Storage and Testing] -- Discovery.k8s.io/v1beta1 EndpointSlices are deprecated in favor of discovery.k8s.io/v1, and will no longer be served in Kubernetes v1.25. ([#100472](https://github.com/kubernetes/kubernetes/pull/100472), [@liggitt](https://github.com/liggitt)) [SIG Network] -- FieldManager no longer owns fields that get reset before the object is persisted (e.g. "status wiping"). ([#99661](https://github.com/kubernetes/kubernetes/pull/99661), [@kevindelgado](https://github.com/kevindelgado)) [SIG API Machinery, Auth and Testing] -- Generic ephemeral volumes are beta. ([#99643](https://github.com/kubernetes/kubernetes/pull/99643), [@pohly](https://github.com/pohly)) [SIG API Machinery, Apps, Auth, CLI, Node, Storage and Testing] -- Implement the GetAvailableResources in the podresources API. ([#95734](https://github.com/kubernetes/kubernetes/pull/95734), [@fromanirh](https://github.com/fromanirh)) [SIG Instrumentation, Node and Testing] -- The Endpoints controller will now set the `endpoints.kubernetes.io/over-capacity` annotation to "warning" when an Endpoints resource contains more than 1000 addresses. In a future release, the controller will truncate Endpoints that exceed this limit. The EndpointSlice API can be used to support significantly larger number of addresses. ([#99975](https://github.com/kubernetes/kubernetes/pull/99975), [@robscott](https://github.com/robscott)) [SIG Apps and Network] -- The PodDisruptionBudget API has been promoted to policy/v1 with no schema changes. The only functional change is that an empty selector (`{}`) written to a policy/v1 PodDisruptionBudget now selects all pods in the namespace. The behavior of the policy/v1beta1 API remains unchanged. The policy/v1beta1 PodDisruptionBudget API is deprecated and will no longer be served in 1.25+. ([#99290](https://github.com/kubernetes/kubernetes/pull/99290), [@mortent](https://github.com/mortent)) [SIG API Machinery, Apps, Auth, Autoscaling, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Scheduling and Testing] -- Topology Aware Hints are now available in alpha and can be enabled with the `TopologyAwareHints` feature gate. ([#99522](https://github.com/kubernetes/kubernetes/pull/99522), [@robscott](https://github.com/robscott)) [SIG API Machinery, Apps, Auth, Instrumentation, Network and Testing] - -### Feature - -- Add e2e test to validate performance metrics of volume lifecycle operations ([#94334](https://github.com/kubernetes/kubernetes/pull/94334), [@RaunakShah](https://github.com/RaunakShah)) [SIG Storage and Testing] -- EmptyDir memory backed volumes are sized as the the minimum of pod allocatable memory on a host and an optional explicit user provided value. ([#100319](https://github.com/kubernetes/kubernetes/pull/100319), [@derekwaynecarr](https://github.com/derekwaynecarr)) [SIG Node] -- Enables Kubelet to check volume condition and log events to corresponding pods. ([#99284](https://github.com/kubernetes/kubernetes/pull/99284), [@fengzixu](https://github.com/fengzixu)) [SIG Apps, Instrumentation, Node and Storage] -- Introduce a churn operator to scheduler perf testing framework. ([#98900](https://github.com/kubernetes/kubernetes/pull/98900), [@Huang-Wei](https://github.com/Huang-Wei)) [SIG Scheduling and Testing] -- Kubernetes is now built with Golang 1.16.1 ([#100106](https://github.com/kubernetes/kubernetes/pull/100106), [@justaugustus](https://github.com/justaugustus)) [SIG Cloud Provider, Instrumentation, Release and Testing] -- Migrated pkg/kubelet/cm/devicemanager to structured logging ([#99976](https://github.com/kubernetes/kubernetes/pull/99976), [@knabben](https://github.com/knabben)) [SIG Instrumentation and Node] -- Migrated pkg/kubelet/cm/memorymanager to structured logging ([#99974](https://github.com/kubernetes/kubernetes/pull/99974), [@knabben](https://github.com/knabben)) [SIG Instrumentation and Node] -- Migrated pkg/kubelet/cm/topologymanager to structure logging ([#99969](https://github.com/kubernetes/kubernetes/pull/99969), [@knabben](https://github.com/knabben)) [SIG Instrumentation and Node] -- Rename metrics `etcd_object_counts` to `apiserver_storage_object_counts` and mark it as stable. The original `etcd_object_counts` metrics name is marked as "Deprecated" and will be removed in the future. ([#99785](https://github.com/kubernetes/kubernetes/pull/99785), [@erain](https://github.com/erain)) [SIG API Machinery, Instrumentation and Testing] -- Update pause container to run as pseudo user and group `65535:65535`. This implies the release of version 3.5 of the container images. ([#97963](https://github.com/kubernetes/kubernetes/pull/97963), [@saschagrunert](https://github.com/saschagrunert)) [SIG CLI, Cloud Provider, Cluster Lifecycle, Node, Release, Security and Testing] -- Users might specify the `kubectl.kubernetes.io/default-exec-container` annotation in a Pod to preselect container for kubectl commands. ([#99833](https://github.com/kubernetes/kubernetes/pull/99833), [@mengjiao-liu](https://github.com/mengjiao-liu)) [SIG CLI] - -### Bug or Regression - -- Add ability to skip OpenAPI handler installation to the GenericAPIServer ([#100341](https://github.com/kubernetes/kubernetes/pull/100341), [@kevindelgado](https://github.com/kevindelgado)) [SIG API Machinery] -- Count pod overhead against an entity's ResourceQuota ([#99600](https://github.com/kubernetes/kubernetes/pull/99600), [@gjkim42](https://github.com/gjkim42)) [SIG API Machinery and Node] -- EndpointSlice controllers are less likely to create duplicate EndpointSlices. ([#100103](https://github.com/kubernetes/kubernetes/pull/100103), [@robscott](https://github.com/robscott)) [SIG Apps and Network] -- Ensure only one LoadBalancer rule is created when HA mode is enabled ([#99825](https://github.com/kubernetes/kubernetes/pull/99825), [@feiskyer](https://github.com/feiskyer)) [SIG Cloud Provider] -- Fixed a race condition on API server startup ensuring previously created webhook configurations are effective before the first write request is admitted. ([#95783](https://github.com/kubernetes/kubernetes/pull/95783), [@roycaihw](https://github.com/roycaihw)) [SIG API Machinery] -- Fixed authentication_duration_seconds metric. Previously it included whole apiserver request duration. ([#99944](https://github.com/kubernetes/kubernetes/pull/99944), [@marseel](https://github.com/marseel)) [SIG API Machinery, Instrumentation and Scalability] -- Fixes issue where inline AzueFile secrets could not be accessed from the pod's namespace. ([#100563](https://github.com/kubernetes/kubernetes/pull/100563), [@msau42](https://github.com/msau42)) [SIG Storage] -- Improve speed of vSphere PV provisioning and reduce number of API calls ([#100054](https://github.com/kubernetes/kubernetes/pull/100054), [@gnufied](https://github.com/gnufied)) [SIG Cloud Provider and Storage] -- Kubectl: Fixed panic when describing an ingress backend without an API Group ([#100505](https://github.com/kubernetes/kubernetes/pull/100505), [@lauchokyip](https://github.com/lauchokyip)) [SIG CLI] -- Kubectl: fix case of age column in describe node (#96963, @bl-ue) ([#96963](https://github.com/kubernetes/kubernetes/pull/96963), [@bl-ue](https://github.com/bl-ue)) [SIG CLI] -- Kubelet.exe on Windows now checks that the process running as administrator and the executing user account is listed in the built-in administrators group. This is the equivalent to checking the process is running as uid 0. ([#96616](https://github.com/kubernetes/kubernetes/pull/96616), [@perithompson](https://github.com/perithompson)) [SIG Node and Windows] -- Kubelet: Fixed the bug of getting the number of cpu when the number of cpu logical processors is more than 64 in windows ([#97378](https://github.com/kubernetes/kubernetes/pull/97378), [@hwdef](https://github.com/hwdef)) [SIG Node and Windows] -- Pass `KUBE_BUILD_CONFORMANCE=y` to the package-tarballs to reenable building the conformance tarballs. ([#100571](https://github.com/kubernetes/kubernetes/pull/100571), [@puerco](https://github.com/puerco)) [SIG Release] -- Pod Log stats for windows now reports metrics ([#99221](https://github.com/kubernetes/kubernetes/pull/99221), [@jsturtevant](https://github.com/jsturtevant)) [SIG Node, Storage, Testing and Windows] - -### Other (Cleanup or Flake) - -- A new storage E2E testsuite covers CSIStorageCapacity publishing if a driver opts into the test. ([#100537](https://github.com/kubernetes/kubernetes/pull/100537), [@pohly](https://github.com/pohly)) [SIG Storage and Testing] -- Convert cmd/kubelet/app/server.go to structured logging ([#98334](https://github.com/kubernetes/kubernetes/pull/98334), [@wawa0210](https://github.com/wawa0210)) [SIG Node] -- If kube-apiserver enabled goaway feature, clients required golang 1.15.8 or 1.16+ version to avoid un-expected data race issue. ([#98809](https://github.com/kubernetes/kubernetes/pull/98809), [@answer1991](https://github.com/answer1991)) [SIG API Machinery] -- Increased CSINodeIDMaxLength from 128 bytes to 192 bytes. ([#98753](https://github.com/kubernetes/kubernetes/pull/98753), [@Jiawei0227](https://github.com/Jiawei0227)) [SIG Apps and Storage] -- Migrate `pkg/kubelet/pluginmanager` to structured logging ([#99885](https://github.com/kubernetes/kubernetes/pull/99885), [@qingwave](https://github.com/qingwave)) [SIG Node] -- Migrate `pkg/kubelet/preemption/preemption.go` and `pkg/kubelet/logs/container_log_manager.go` to structured logging ([#99848](https://github.com/kubernetes/kubernetes/pull/99848), [@qingwave](https://github.com/qingwave)) [SIG Node] -- Migrate `pkg/kubelet/(cri)` to structured logging ([#99006](https://github.com/kubernetes/kubernetes/pull/99006), [@yangjunmyfm192085](https://github.com/yangjunmyfm192085)) [SIG Node] -- Migrate `pkg/kubelet/(node, pod)` to structured logging ([#98847](https://github.com/kubernetes/kubernetes/pull/98847), [@yangjunmyfm192085](https://github.com/yangjunmyfm192085)) [SIG Node] -- Migrate `pkg/kubelet/(volume,container)` to structured logging ([#98850](https://github.com/kubernetes/kubernetes/pull/98850), [@yangjunmyfm192085](https://github.com/yangjunmyfm192085)) [SIG Node] -- Migrate `pkg/kubelet/kubelet_node_status.go` to structured logging ([#98154](https://github.com/kubernetes/kubernetes/pull/98154), [@yangjunmyfm192085](https://github.com/yangjunmyfm192085)) [SIG Node and Release] -- Migrate `pkg/kubelet/lifecycle,oom` to structured logging ([#99479](https://github.com/kubernetes/kubernetes/pull/99479), [@mengjiao-liu](https://github.com/mengjiao-liu)) [SIG Instrumentation and Node] -- Migrate cmd/kubelet/+ pkg/kubelet/cadvisor/cadvisor_linux.go + pkg/kubelet/cri/remote/util/util_unix.go + pkg/kubelet/images/image_manager.go to structured logging ([#99994](https://github.com/kubernetes/kubernetes/pull/99994), [@AfrouzMashayekhi](https://github.com/AfrouzMashayekhi)) [SIG Instrumentation and Node] -- Migrate pkg/kubelet/cm/container_manager_linux.go and pkg/kubelet/cm/container_manager_stub.go to structured logging ([#100001](https://github.com/kubernetes/kubernetes/pull/100001), [@shiyajuan123](https://github.com/shiyajuan123)) [SIG Instrumentation and Node] -- Migrate pkg/kubelet/cm/cpumanage/{topology/togit pology.go, policy_none.go, cpu_assignment.go} to structured logging ([#100163](https://github.com/kubernetes/kubernetes/pull/100163), [@lala123912](https://github.com/lala123912)) [SIG Instrumentation and Node] -- Migrate pkg/kubelet/cm/cpumanager/state to structured logging ([#99563](https://github.com/kubernetes/kubernetes/pull/99563), [@jmguzik](https://github.com/jmguzik)) [SIG Instrumentation and Node] -- Migrate pkg/kubelet/config to structured logging ([#100002](https://github.com/kubernetes/kubernetes/pull/100002), [@AfrouzMashayekhi](https://github.com/AfrouzMashayekhi)) [SIG Instrumentation and Node] -- Migrate pkg/kubelet/kubelet.go to structured logging ([#99861](https://github.com/kubernetes/kubernetes/pull/99861), [@navidshaikh](https://github.com/navidshaikh)) [SIG Instrumentation and Node] -- Migrate pkg/kubelet/kubeletconfig to structured logging ([#100265](https://github.com/kubernetes/kubernetes/pull/100265), [@ehashman](https://github.com/ehashman)) [SIG Node] -- Migrate pkg/kubelet/kuberuntime to structured logging ([#99970](https://github.com/kubernetes/kubernetes/pull/99970), [@krzysiekg](https://github.com/krzysiekg)) [SIG Instrumentation and Node] -- Migrate pkg/kubelet/prober to structured logging ([#99830](https://github.com/kubernetes/kubernetes/pull/99830), [@krzysiekg](https://github.com/krzysiekg)) [SIG Instrumentation and Node] -- Migrate pkg/kubelet/winstats to structured logging ([#99855](https://github.com/kubernetes/kubernetes/pull/99855), [@hexxdump](https://github.com/hexxdump)) [SIG Instrumentation and Node] -- Migrate probe log messages to structured logging ([#97093](https://github.com/kubernetes/kubernetes/pull/97093), [@aldudko](https://github.com/aldudko)) [SIG Instrumentation and Node] -- Migrate remaining kubelet files to structured logging ([#100196](https://github.com/kubernetes/kubernetes/pull/100196), [@ehashman](https://github.com/ehashman)) [SIG Instrumentation and Node] -- `apiserver_storage_objects` (a newer version of `etcd_object_counts) is promoted and marked as stable. ([#100082](https://github.com/kubernetes/kubernetes/pull/100082), [@logicalhan](https://github.com/logicalhan)) [SIG API Machinery, Instrumentation and Testing] - -## Dependencies - -### Added -_Nothing has changed._ - -### Changed -- github.com/cilium/ebpf: [1c8d4c9 → v0.2.0](https://github.com/cilium/ebpf/compare/1c8d4c9...v0.2.0) -- github.com/containerd/console: [v1.0.0 → v1.0.1](https://github.com/containerd/console/compare/v1.0.0...v1.0.1) -- github.com/containerd/containerd: [v1.4.1 → v1.4.4](https://github.com/containerd/containerd/compare/v1.4.1...v1.4.4) -- github.com/creack/pty: [v1.1.9 → v1.1.11](https://github.com/creack/pty/compare/v1.1.9...v1.1.11) -- github.com/docker/docker: [bd33bbf → v20.10.2+incompatible](https://github.com/docker/docker/compare/bd33bbf...v20.10.2) -- github.com/google/cadvisor: [v0.38.8 → v0.39.0](https://github.com/google/cadvisor/compare/v0.38.8...v0.39.0) -- github.com/konsorten/go-windows-terminal-sequences: [v1.0.3 → v1.0.2](https://github.com/konsorten/go-windows-terminal-sequences/compare/v1.0.3...v1.0.2) -- github.com/moby/sys/mountinfo: [v0.1.3 → v0.4.0](https://github.com/moby/sys/mountinfo/compare/v0.1.3...v0.4.0) -- github.com/moby/term: [672ec06 → df9cb8a](https://github.com/moby/term/compare/672ec06...df9cb8a) -- github.com/mrunalp/fileutils: [abd8a0e → v0.5.0](https://github.com/mrunalp/fileutils/compare/abd8a0e...v0.5.0) -- github.com/opencontainers/runc: [v1.0.0-rc92 → v1.0.0-rc93](https://github.com/opencontainers/runc/compare/v1.0.0-rc92...v1.0.0-rc93) -- github.com/opencontainers/runtime-spec: [4d89ac9 → e6143ca](https://github.com/opencontainers/runtime-spec/compare/4d89ac9...e6143ca) -- github.com/opencontainers/selinux: [v1.6.0 → v1.8.0](https://github.com/opencontainers/selinux/compare/v1.6.0...v1.8.0) -- github.com/sirupsen/logrus: [v1.6.0 → v1.7.0](https://github.com/sirupsen/logrus/compare/v1.6.0...v1.7.0) -- github.com/syndtr/gocapability: [d983527 → 42c35b4](https://github.com/syndtr/gocapability/compare/d983527...42c35b4) -- github.com/willf/bitset: [d5bec33 → v1.1.11](https://github.com/willf/bitset/compare/d5bec33...v1.1.11) -- gotest.tools/v3: v3.0.2 → v3.0.3 -- k8s.io/klog/v2: v2.5.0 → v2.8.0 -- sigs.k8s.io/structured-merge-diff/v4: v4.0.3 → v4.1.0 - -### Removed -_Nothing has changed._ - - - -# v1.21.0-beta.1 - - -## Downloads for v1.21.0-beta.1 - -### Source Code - -filename | sha512 hash --------- | ----------- -[kubernetes.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes.tar.gz) | c9f4f25242e319e5d90f49d26f239a930aad69677c0f3c2387c56bb13482648a26ed234be2bfe2352508f35010e3eb6d3b127c31a9f24fa1e53ac99c38520fe4 -[kubernetes-src.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-src.tar.gz) | 255357db8fa160cab2187658906b674a8b0d9b9a5b5f688cc7b69dc124f5da00362c6cc18ae9b80f7ddb3da6f64c2ab2f12fb9b63a4e063c7366a5375b175cda - -### Client binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-client-darwin-amd64.tar.gz) | 02efd389c8126456416fd2c7ea25c3cc30f612649ad91f631f068d6c0e5e539484d3763cb9a8645ad6b8077e4fcd1552a659d7516ebc4ce6828cf823b65c3016 -[kubernetes-client-darwin-arm64.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-client-darwin-arm64.tar.gz) | ac90dcd1699d1d7ff9c8342d481f6d0d97ccdc3ec501a56dc7c9e1898a8f77f712bf66942d304bfe581b5494f13e3efa211865de88f89749780e9e26e673dbdb -[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-client-linux-386.tar.gz) | cce5fb84cc7a1ee664f89d8ad3064307c51c044e9ddd2ae5a004939b69d3b3ef6f29acc5782e27d0c8f0d6d3d9c96e922f5d1b99d210ca3e754666d775df9f0c -[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-client-linux-amd64.tar.gz) | 2e93bbd2e60ad7cd8fe495115e96c55b1dc8facd100a827ef9c197a732679b60cceb9ea7bf92a1f5e328c3b8adfa8d3922cbc5d8370e374f3381b83f5b877b4f -[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-client-linux-arm.tar.gz) | 23f03b6a8fa9decce9b89a2c1bd3dae6d0b2f9e533e35a79e2c5a29326a165259677594ae83c877219a21bdb95557a284e55f4eec12954742794579c89a7d7e5 -[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-client-linux-arm64.tar.gz) | 3acf3101b46568b0ded6b90f13df0e918870d6812dc1a584903ddb8ba146484a204b9e442f863df47c7d4dab043fd9f7294c5510d3eb09004993d6d3b1e9e13c -[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-client-linux-ppc64le.tar.gz) | f749198df69577f62872d3096138a1b8969ec6b1636eb68eb56640bf33cf5f97a11df4363462749a1c0dc3ccbb8ae76c5d66864bf1c5cf7e52599caaf498e504 -[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-client-linux-s390x.tar.gz) | 3f6c0189d59fca22cdded3a02c672ef703d17e6ab0831e173a870e14ccec436c142600e9fc35b403571b6906f2be8d18d38d33330f7caada971bbe1187b388f6 -[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-client-windows-386.tar.gz) | 03d92371c425cf331c80807c0ac56f953be304fc6719057258a363d527d186d610e1d4b4d401b34128062983265c2e21f2d2389231aa66a6f5787eee78142cf6 -[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-client-windows-amd64.tar.gz) | 489ece0c886a025ca3a25d28518637a5a824ea6544e7ef8778321036f13c8909a978ad4ceca966cec1e1cda99f25ca78bfd37460d1231c77436d216d43c872ad - -### Server binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-server-linux-amd64.tar.gz) | 2e95cb31d5afcb6842c41d25b7d0c18dd7e65693b2d93c8aa44e5275f9c6201e1a67685c7a8ddefa334babb04cb559d26e39b6a18497695a07dc270568cae108 -[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-server-linux-arm.tar.gz) | 2927e82b98404c077196ce3968f3afd51a7576aa56d516019bd3976771c0213ba01e78da5b77478528e770da0d334e9457995fafb98820ed68b2ee34beb68856 -[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-server-linux-arm64.tar.gz) | e0f7aea3ea598214a9817bc04949389cb7e4e7b9503141a590ef48c0b681fe44a4243ebc6280752fa41aa1093149b3ee1bcef7664edb746097a342281825430b -[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-server-linux-ppc64le.tar.gz) | c011f7eb01294e9ba5d5ced719068466f88ed595dcb8d554a36a4dd5118fb6b3d6bafe8bf89aa2d42988e69793ed777ba77b8876c6ec74f898a43cfce1f61bf4 -[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-server-linux-s390x.tar.gz) | 15f6683e7f16caab7eebead2b7c15799460abbf035a43de0b75f96b0be19908f58add98a777a0cca916230d60cf6bfe3fee92b9dcff50274b1e37c243c157969 - -### Node binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-node-linux-amd64.tar.gz) | ed58679561197110f366b9109f7afd62c227bfc271918ccf3eea203bb2ab6428eb5db4dd6c965f202a8a636f66da199470269b863815809b99d53d2fa47af2ea -[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-node-linux-arm.tar.gz) | 7e6c7f1957fcdecec8fef689c5019edbc0d0c11d22dafbfef0a07121d10d8f6273644f73511bd06a9a88b04d81a940bd6645ffb5711422af64af547a45c76273 -[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-node-linux-arm64.tar.gz) | a3618f29967e7a1574917a67f0296e65780321eda484b99aa32bfd4dc9b35acdefce33da952ac52dfb509fbac5bf700cf177431fad2ab4adcab0544538939faa -[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-node-linux-ppc64le.tar.gz) | 326d3eb521b41bdf489912177f70b8cdd7cd828bb9b3d847ed3694eb27e457f24e0a88b8e51b726eee39800a3c5a40c1b30e3a8ec4a34d8041b3d8ef05d1b749 -[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-node-linux-s390x.tar.gz) | 022d05ebaa66a0332c4fe18cdaf23d14c2c7e4d1f2af7f27baaf1eb042e6890dc3434b4ac8ba58c35d590717956f8c3458112685aff4938b94b18e263c3f4256 -[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.21.0-beta.1/kubernetes-node-windows-amd64.tar.gz) | fa691ed93f07af6bc1cf57e20a30580d6c528f88e5fea3c14f39c1820969dc5a0eb476c5b87b288593d0c086c4dd93aff6165082393283c3f46c210f9bb66d61 - -## Changelog since v1.21.0-beta.0 - -## Urgent Upgrade Notes - -### (No, really, you MUST read this before you upgrade) - - - Kubeadm: during "init" an empty cgroupDriver value in the KubeletConfiguration is now always set to "systemd" unless the user is explicit about it. This requires existing machine setups to configure the container runtime to use the "systemd" driver. Documentation on this topic can be found here: https://kubernetes.io/docs/setup/production-environment/container-runtimes/. When upgrading existing clusters / nodes using "kubeadm upgrade" the old cgroupDriver value is preserved, but in 1.22 this change will also apply to "upgrade". For more information on migrating to the "systemd" driver or remaining on the "cgroupfs" driver see: https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/. ([#99471](https://github.com/kubernetes/kubernetes/pull/99471), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle] - - Migrate `pkg/kubelet/(dockershim, network)` to structured logging - Exit code changed from 255 to 1 ([#98939](https://github.com/kubernetes/kubernetes/pull/98939), [@yangjunmyfm192085](https://github.com/yangjunmyfm192085)) [SIG Network and Node] - - Migrate `pkg/kubelet/certificate` to structured logging - Exit code changed from 255 to 1 ([#98993](https://github.com/kubernetes/kubernetes/pull/98993), [@SataQiu](https://github.com/SataQiu)) [SIG Auth and Node] - - Newly provisioned PVs by EBS plugin will no longer use the deprecated "failure-domain.beta.kubernetes.io/zone" and "failure-domain.beta.kubernetes.io/region" labels. It will use "topology.kubernetes.io/zone" and "topology.kubernetes.io/region" labels instead. ([#99130](https://github.com/kubernetes/kubernetes/pull/99130), [@ayberk](https://github.com/ayberk)) [SIG Cloud Provider, Storage and Testing] - - Newly provisioned PVs by OpenStack Cinder plugin will no longer use the deprecated "failure-domain.beta.kubernetes.io/zone" and "failure-domain.beta.kubernetes.io/region" labels. It will use "topology.kubernetes.io/zone" and "topology.kubernetes.io/region" labels instead. ([#99719](https://github.com/kubernetes/kubernetes/pull/99719), [@jsafrane](https://github.com/jsafrane)) [SIG Cloud Provider and Storage] - - OpenStack Cinder CSI migration is on by default, Clinder CSI driver must be installed on clusters on OpenStack for Cinder volumes to work. ([#98538](https://github.com/kubernetes/kubernetes/pull/98538), [@dims](https://github.com/dims)) [SIG Storage] - - Package pkg/kubelet/server migrated to structured logging - Exit code changed from 255 to 1 ([#99838](https://github.com/kubernetes/kubernetes/pull/99838), [@adisky](https://github.com/adisky)) [SIG Node] - - Pkg/kubelet/kuberuntime/kuberuntime_manager.go migrated to structured logging - Exit code changed from 255 to 1 ([#99841](https://github.com/kubernetes/kubernetes/pull/99841), [@adisky](https://github.com/adisky)) [SIG Instrumentation and Node] - -## Changes by Kind - -### Deprecation - -- Kubeadm: the deprecated kube-dns is no longer supported as an option. If "ClusterConfiguration.dns.type" is set to "kube-dns" kubeadm will now throw an error. ([#99646](https://github.com/kubernetes/kubernetes/pull/99646), [@rajansandeep](https://github.com/rajansandeep)) [SIG Cluster Lifecycle] -- Remove deprecated --generator --replicas --service-generator --service-overrides --schedule from kubectl run - Deprecate --serviceaccount --hostport --requests --limits in kubectl run ([#99732](https://github.com/kubernetes/kubernetes/pull/99732), [@soltysh](https://github.com/soltysh)) [SIG CLI and Testing] -- `audit.k8s.io/v1beta1` and `audit.k8s.io/v1alpha1` audit policy configuration and audit events are deprecated in favor of `audit.k8s.io/v1`, available since v1.13. kube-apiserver invocations that specify alpha or beta policy configurations with `--audit-policy-file`, or explicitly request alpha or beta audit events with `--audit-log-version` / `--audit-webhook-version` must update to use `audit.k8s.io/v1` and accept `audit.k8s.io/v1` events prior to v1.24. ([#98858](https://github.com/kubernetes/kubernetes/pull/98858), [@carlory](https://github.com/carlory)) [SIG Auth] -- `diskformat` stroage class parameter for in-tree vSphere volume plugin is deprecated as of v1.21 release. Please consider updating storageclass and remove `diskformat` parameter. vSphere CSI Driver does not support diskformat storageclass parameter. - - vSphere releases less than 67u3 are deprecated as of v1.21. Please consider upgrading vSphere to 67u3 or above. vSphere CSI Driver requires minimum vSphere 67u3. - - VM Hardware version less than 15 is deprecated as of v1.21. Please consider upgrading the Node VM Hardware version to 15 or above. vSphere CSI Driver recommends Node VM's Hardware version set to at least vmx-15. - - Multi vCenter support is deprecated as of v1.21. If you have a Kubernetes cluster spanning across multiple vCenter servers, please consider moving all k8s nodes to a single vCenter Server. vSphere CSI Driver does not support Kubernetes deployment spanning across multiple vCenter servers. - - Support for these deprecations will be available till Kubernetes v1.24. ([#98546](https://github.com/kubernetes/kubernetes/pull/98546), [@divyenpatel](https://github.com/divyenpatel)) [SIG Cloud Provider and Storage] - -### API Change - -- 1. PodAffinityTerm includes a namespaceSelector field to allow selecting eligible namespaces based on their labels. - 2. A new CrossNamespacePodAffinity quota scope API that allows restricting which namespaces allowed to use PodAffinityTerm with corss-namespace reference via namespaceSelector or namespaces fields. ([#98582](https://github.com/kubernetes/kubernetes/pull/98582), [@ahg-g](https://github.com/ahg-g)) [SIG API Machinery, Apps, Auth and Testing] -- Add a default metadata name labels for selecting any namespace by its name. ([#96968](https://github.com/kubernetes/kubernetes/pull/96968), [@jayunit100](https://github.com/jayunit100)) [SIG API Machinery, Apps, Cloud Provider, Storage and Testing] -- Added `.spec.completionMode` field to Job, with accepted values `NonIndexed` (default) and `Indexed` ([#98441](https://github.com/kubernetes/kubernetes/pull/98441), [@alculquicondor](https://github.com/alculquicondor)) [SIG Apps and CLI] -- Clarified NetworkPolicy policyTypes documentation ([#97216](https://github.com/kubernetes/kubernetes/pull/97216), [@joejulian](https://github.com/joejulian)) [SIG Network] -- DaemonSets accept a MaxSurge integer or percent on their rolling update strategy that will launch the updated pod on nodes and wait for those pods to go ready before marking the old out-of-date pods as deleted. This allows workloads to avoid downtime during upgrades when deployed using DaemonSets. This feature is alpha and is behind the DaemonSetUpdateSurge feature gate. ([#96441](https://github.com/kubernetes/kubernetes/pull/96441), [@smarterclayton](https://github.com/smarterclayton)) [SIG Apps and Testing] -- EndpointSlice API is now GA. The EndpointSlice topology field has been removed from the GA API and will be replaced by a new per Endpoint Zone field. If the topology field was previously used, it will be converted into an annotation in the v1 Resource. The discovery.k8s.io/v1alpha1 API is removed. ([#99662](https://github.com/kubernetes/kubernetes/pull/99662), [@swetharepakula](https://github.com/swetharepakula)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network and Testing] -- EndpointSlice Controllers are now GA. The EndpointSlice Controller will not populate the `deprecatedTopology` field and will only provide topology information through the `zone` and `nodeName` fields. ([#99870](https://github.com/kubernetes/kubernetes/pull/99870), [@swetharepakula](https://github.com/swetharepakula)) [SIG API Machinery, Apps, Auth, Network and Testing] -- IngressClass resource can now reference a resource in a specific namespace - for implementation-specific configuration(previously only Cluster-level resources were allowed). - This feature can be enabled using the IngressClassNamespacedParams feature gate. ([#99275](https://github.com/kubernetes/kubernetes/pull/99275), [@hbagdi](https://github.com/hbagdi)) [SIG API Machinery, CLI and Network] -- Introduce conditions for PodDisruptionBudget ([#98127](https://github.com/kubernetes/kubernetes/pull/98127), [@mortent](https://github.com/mortent)) [SIG API Machinery, Apps, Auth, CLI, Cloud Provider, Cluster Lifecycle and Instrumentation] -- Jobs API has a new .spec.suspend field that can be used to suspend and resume Jobs ([#98727](https://github.com/kubernetes/kubernetes/pull/98727), [@adtac](https://github.com/adtac)) [SIG API Machinery, Apps, Node, Scheduling and Testing] -- Kubelet Graceful Node Shutdown feature is now beta. ([#99735](https://github.com/kubernetes/kubernetes/pull/99735), [@bobbypage](https://github.com/bobbypage)) [SIG Node] -- Limit the quest value of hugepage to integer multiple of page size. ([#98515](https://github.com/kubernetes/kubernetes/pull/98515), [@lala123912](https://github.com/lala123912)) [SIG Apps] -- One new field "InternalTrafficPolicy" in Service is added. - It specifies if the cluster internal traffic should be routed to all endpoints or node-local endpoints only. - "Cluster" routes internal traffic to a Service to all endpoints. - "Local" routes traffic to node-local endpoints only, and traffic is dropped if no node-local endpoints are ready. - The default value is "Cluster". ([#96600](https://github.com/kubernetes/kubernetes/pull/96600), [@maplain](https://github.com/maplain)) [SIG API Machinery, Apps and Network] -- PodSecurityPolicy only stores "generic" as allowed volume type if the GenericEphemeralVolume feature gate is enabled ([#98918](https://github.com/kubernetes/kubernetes/pull/98918), [@pohly](https://github.com/pohly)) [SIG Auth and Security] -- Promote CronJobs to batch/v1 ([#99423](https://github.com/kubernetes/kubernetes/pull/99423), [@soltysh](https://github.com/soltysh)) [SIG API Machinery, Apps, CLI and Testing] -- Remove support for building Kubernetes with bazel. ([#99561](https://github.com/kubernetes/kubernetes/pull/99561), [@BenTheElder](https://github.com/BenTheElder)) [SIG API Machinery, Apps, Architecture, Auth, Autoscaling, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Release, Scalability, Scheduling, Storage, Testing and Windows] -- Setting loadBalancerClass in load balancer type of service is available with this PR. - Users who want to use a custom load balancer can specify loadBalancerClass to achieve it. ([#98277](https://github.com/kubernetes/kubernetes/pull/98277), [@XudongLiuHarold](https://github.com/XudongLiuHarold)) [SIG API Machinery, Apps, Cloud Provider and Network] -- Storage capacity tracking (= the CSIStorageCapacity feature) is beta, storage.k8s.io/v1alpha1/VolumeAttachment and storage.k8s.io/v1alpha1/CSIStorageCapacity objects are deprecated ([#99641](https://github.com/kubernetes/kubernetes/pull/99641), [@pohly](https://github.com/pohly)) [SIG API Machinery, Apps, Auth, Scheduling, Storage and Testing] -- Support for Indexed Job: a Job that is considered completed when Pods associated to indexes from 0 to (.spec.completions-1) have succeeded. ([#98812](https://github.com/kubernetes/kubernetes/pull/98812), [@alculquicondor](https://github.com/alculquicondor)) [SIG Apps and CLI] -- The apiserver now resets managedFields that got corrupted by a mutating admission controller. ([#98074](https://github.com/kubernetes/kubernetes/pull/98074), [@kwiesmueller](https://github.com/kwiesmueller)) [SIG API Machinery and Testing] -- `controller.kubernetes.io/pod-deletion-cost` annotation can be set to offer a hint on the cost of deleting a pod compared to other pods belonging to the same ReplicaSet. Pods with lower deletion cost are deleted first. This is an alpha feature. ([#99163](https://github.com/kubernetes/kubernetes/pull/99163), [@ahg-g](https://github.com/ahg-g)) [SIG Apps] - -### Feature - -- A client-go metric, rest_client_exec_plugin_call_total, has been added to track total calls to client-go credential plugins. ([#98892](https://github.com/kubernetes/kubernetes/pull/98892), [@ankeesler](https://github.com/ankeesler)) [SIG API Machinery, Auth, Cluster Lifecycle and Instrumentation] -- Add --use-protocol-buffers flag to kubectl top pods and nodes ([#96655](https://github.com/kubernetes/kubernetes/pull/96655), [@serathius](https://github.com/serathius)) [SIG CLI] -- Add support to generate client-side binaries for new darwin/arm64 platform ([#97743](https://github.com/kubernetes/kubernetes/pull/97743), [@dims](https://github.com/dims)) [SIG Release and Testing] -- Added `ephemeral_volume_controller_create[_failures]_total` counters to kube-controller-manager metrics ([#99115](https://github.com/kubernetes/kubernetes/pull/99115), [@pohly](https://github.com/pohly)) [SIG API Machinery, Apps, Cluster Lifecycle, Instrumentation and Storage] -- Adds alpha feature `VolumeCapacityPriority` which makes the scheduler prioritize nodes based on the best matching size of statically provisioned PVs across multiple topologies. ([#96347](https://github.com/kubernetes/kubernetes/pull/96347), [@cofyc](https://github.com/cofyc)) [SIG Apps, Network, Scheduling, Storage and Testing] -- Adds two new metrics to cronjobs, a histogram to track the time difference when a job is created and the expected time when it should be created, and a gauge for the missed schedules of a cronjob ([#99341](https://github.com/kubernetes/kubernetes/pull/99341), [@alaypatel07](https://github.com/alaypatel07)) [SIG Apps and Instrumentation] -- Alpha implementation of Kubectl Command Headers: SIG CLI KEP 859 enabled when KUBECTL_COMMAND_HEADERS environment variable set on the client command line. - - To enable: export KUBECTL_COMMAND_HEADERS=1; kubectl ... ([#98952](https://github.com/kubernetes/kubernetes/pull/98952), [@seans3](https://github.com/seans3)) [SIG API Machinery and CLI] -- Component owner can configure the allowlist of metric label with flag '--allow-metric-labels'. ([#99738](https://github.com/kubernetes/kubernetes/pull/99738), [@YoyinZyc](https://github.com/YoyinZyc)) [SIG API Machinery, Cluster Lifecycle and Instrumentation] -- Disruption controller only sends one event per PodDisruptionBudget if scale can't be computed ([#98128](https://github.com/kubernetes/kubernetes/pull/98128), [@mortent](https://github.com/mortent)) [SIG Apps] -- EndpointSliceNodeName will always be enabled, so NodeName will always be available in the v1beta1 API. ([#99746](https://github.com/kubernetes/kubernetes/pull/99746), [@swetharepakula](https://github.com/swetharepakula)) [SIG Apps and Network] -- Graduate CRIContainerLogRotation feature gate to GA. ([#99651](https://github.com/kubernetes/kubernetes/pull/99651), [@umohnani8](https://github.com/umohnani8)) [SIG Node and Testing] -- Kube-proxy iptables: new metric sync_proxy_rules_iptables_total that exposes the number of rules programmed per table in each iteration ([#99653](https://github.com/kubernetes/kubernetes/pull/99653), [@aojea](https://github.com/aojea)) [SIG Instrumentation and Network] -- Kube-scheduler now logs plugin scoring summaries at --v=4 ([#99411](https://github.com/kubernetes/kubernetes/pull/99411), [@damemi](https://github.com/damemi)) [SIG Scheduling] -- Kubeadm: a warning to user as ipv6 site-local is deprecated ([#99574](https://github.com/kubernetes/kubernetes/pull/99574), [@pacoxu](https://github.com/pacoxu)) [SIG Cluster Lifecycle and Network] -- Kubeadm: apply the "node.kubernetes.io/exclude-from-external-load-balancers" label on control plane nodes during "init", "join" and "upgrade" to preserve backwards compatibility with the lagacy LB mode where nodes labeled as "master" where excluded. To opt-out you can remove the label from a node. See #97543 and the linked KEP for more details. ([#98269](https://github.com/kubernetes/kubernetes/pull/98269), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle] -- Kubeadm: if the user has customized their image repository via the kubeadm configuration, pass the custom pause image repository and tag to the kubelet via --pod-infra-container-image not only for Docker but for all container runtimes. This flag tells the kubelet that it should not garbage collect the image. ([#99476](https://github.com/kubernetes/kubernetes/pull/99476), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle] -- Kubeadm: promote IPv6DualStack feature gate to Beta ([#99294](https://github.com/kubernetes/kubernetes/pull/99294), [@pacoxu](https://github.com/pacoxu)) [SIG Cluster Lifecycle] -- Kubectl version changed to write a warning message to stderr if the client and server version difference exceeds the supported version skew of +/-1 minor version. ([#98250](https://github.com/kubernetes/kubernetes/pull/98250), [@brianpursley](https://github.com/brianpursley)) [SIG CLI] -- Kubernetes is now built with Golang 1.16 ([#98572](https://github.com/kubernetes/kubernetes/pull/98572), [@justaugustus](https://github.com/justaugustus)) [SIG API Machinery, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Node, Release and Testing] -- Persistent Volumes formatted with the btrfs filesystem will now automatically resize when expanded. ([#99361](https://github.com/kubernetes/kubernetes/pull/99361), [@Novex](https://github.com/Novex)) [SIG Storage] -- Remove cAdvisor json metrics api collected by Kubelet ([#99236](https://github.com/kubernetes/kubernetes/pull/99236), [@pacoxu](https://github.com/pacoxu)) [SIG Node] -- Sysctls is now GA and locked to default ([#99158](https://github.com/kubernetes/kubernetes/pull/99158), [@wgahnagl](https://github.com/wgahnagl)) [SIG Node] -- The NodeAffinity plugin implements the PreFilter extension, offering enhanced performance for Filter. ([#99213](https://github.com/kubernetes/kubernetes/pull/99213), [@AliceZhang2016](https://github.com/AliceZhang2016)) [SIG Scheduling] -- The endpointslice mirroring controller mirrors endpoints annotations and labels to the generated endpoint slices, it also ensures that updates on any of these fields are mirrored. - The well-known annotation endpoints.kubernetes.io/last-change-trigger-time is skipped and not mirrored. ([#98116](https://github.com/kubernetes/kubernetes/pull/98116), [@aojea](https://github.com/aojea)) [SIG Apps, Network and Testing] -- Update the latest validated version of Docker to 20.10 ([#98977](https://github.com/kubernetes/kubernetes/pull/98977), [@neolit123](https://github.com/neolit123)) [SIG CLI, Cluster Lifecycle and Node] -- Upgrade node local dns to 1.17.0 for better IPv6 support ([#99749](https://github.com/kubernetes/kubernetes/pull/99749), [@pacoxu](https://github.com/pacoxu)) [SIG Cloud Provider and Network] -- Users might specify the `kubectl.kubernetes.io/default-exec-container` annotation in a Pod to preselect container for kubectl commands. ([#99581](https://github.com/kubernetes/kubernetes/pull/99581), [@mengjiao-liu](https://github.com/mengjiao-liu)) [SIG CLI] -- When downscaling ReplicaSets, ready and creation timestamps are compared in a logarithmic scale. ([#99212](https://github.com/kubernetes/kubernetes/pull/99212), [@damemi](https://github.com/damemi)) [SIG Apps and Testing] -- When the kubelet is watching a ConfigMap or Secret purely in the context of setting environment variables - for containers, only hold that watch for a defined duration before cancelling it. This change reduces the CPU - and memory usage of the kube-apiserver in large clusters. ([#99393](https://github.com/kubernetes/kubernetes/pull/99393), [@chenyw1990](https://github.com/chenyw1990)) [SIG API Machinery, Node and Testing] -- WindowsEndpointSliceProxying feature gate has graduated to beta and is enabled by default. This means kube-proxy will read from EndpointSlices instead of Endpoints on Windows by default. ([#99794](https://github.com/kubernetes/kubernetes/pull/99794), [@robscott](https://github.com/robscott)) [SIG Network] - -### Bug or Regression - -- Creating a PVC with DataSource should fail for non-CSI plugins. ([#97086](https://github.com/kubernetes/kubernetes/pull/97086), [@xing-yang](https://github.com/xing-yang)) [SIG Apps and Storage] -- EndpointSlice controller is now less likely to emit FailedToUpdateEndpointSlices events. ([#99345](https://github.com/kubernetes/kubernetes/pull/99345), [@robscott](https://github.com/robscott)) [SIG Apps and Network] -- EndpointSliceMirroring controller is now less likely to emit FailedToUpdateEndpointSlices events. ([#99756](https://github.com/kubernetes/kubernetes/pull/99756), [@robscott](https://github.com/robscott)) [SIG Apps and Network] -- Fix --ignore-errors does not take effect if multiple logs are printed and unfollowed ([#97686](https://github.com/kubernetes/kubernetes/pull/97686), [@wzshiming](https://github.com/wzshiming)) [SIG CLI] -- Fix bug that would let the Horizontal Pod Autoscaler scale down despite at least one metric being unavailable/invalid ([#99514](https://github.com/kubernetes/kubernetes/pull/99514), [@mikkeloscar](https://github.com/mikkeloscar)) [SIG Apps and Autoscaling] -- Fix cgroup handling for systemd with cgroup v2 ([#98365](https://github.com/kubernetes/kubernetes/pull/98365), [@odinuge](https://github.com/odinuge)) [SIG Node] -- Fix smb mount PermissionDenied issue on Windows ([#99550](https://github.com/kubernetes/kubernetes/pull/99550), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider, Storage and Windows] -- Fixed a bug that causes smaller number of conntrack-max being used under CPU static policy. (#99225, @xh4n3) ([#99613](https://github.com/kubernetes/kubernetes/pull/99613), [@xh4n3](https://github.com/xh4n3)) [SIG Network] -- Fixed bug that caused cAdvisor to incorrectly detect single-socket multi-NUMA topology. ([#99315](https://github.com/kubernetes/kubernetes/pull/99315), [@iwankgb](https://github.com/iwankgb)) [SIG Node] -- Fixes add-on manager leader election ([#98968](https://github.com/kubernetes/kubernetes/pull/98968), [@liggitt](https://github.com/liggitt)) [SIG Cloud Provider] -- Improved update time of pod statuses following new probe results. ([#98376](https://github.com/kubernetes/kubernetes/pull/98376), [@matthyx](https://github.com/matthyx)) [SIG Node and Testing] -- Kube-apiserver: an update of a pod with a generic ephemeral volume dropped that volume if the feature had been disabled since creating the pod with such a volume ([#99446](https://github.com/kubernetes/kubernetes/pull/99446), [@pohly](https://github.com/pohly)) [SIG Apps, Node and Storage] -- Kubeadm: skip validating pod subnet against node-cidr-mask when allocate-node-cidrs is set to be false ([#98984](https://github.com/kubernetes/kubernetes/pull/98984), [@SataQiu](https://github.com/SataQiu)) [SIG Cluster Lifecycle] -- On single-stack configured (IPv4 or IPv6, but not both) clusters, Services which are both headless (no clusterIP) and selectorless (empty or undefined selector) will report `ipFamilyPolicy RequireDualStack` and will have entries in `ipFamilies[]` for both IPv4 and IPv6. This is a change from alpha, but does not have any impact on the manually-specified Endpoints and EndpointSlices for the Service. ([#99555](https://github.com/kubernetes/kubernetes/pull/99555), [@thockin](https://github.com/thockin)) [SIG Apps and Network] -- Resolves spurious `Failed to list *v1.Secret` or `Failed to list *v1.ConfigMap` messages in kubelet logs. ([#99538](https://github.com/kubernetes/kubernetes/pull/99538), [@liggitt](https://github.com/liggitt)) [SIG Auth and Node] -- Return zero time (midnight on Jan. 1, 1970) instead of negative number when reporting startedAt and finishedAt of the not started or a running Pod when using dockershim as a runtime. ([#99585](https://github.com/kubernetes/kubernetes/pull/99585), [@Iceber](https://github.com/Iceber)) [SIG Node] -- Stdin is now only passed to client-go exec credential plugins when it is detected to be an interactive terminal. Previously, it was passed to client-go exec plugins when **stdout*- was detected to be an interactive terminal. ([#99654](https://github.com/kubernetes/kubernetes/pull/99654), [@ankeesler](https://github.com/ankeesler)) [SIG API Machinery and Auth] -- The maximum number of ports allowed in EndpointSlices has been increased from 100 to 20,000 ([#99795](https://github.com/kubernetes/kubernetes/pull/99795), [@robscott](https://github.com/robscott)) [SIG Network] -- Updates the commands - - kubectl kustomize {arg} - - kubectl apply -k {arg} - to use same code as kustomize CLI v4.0.5 - - [v4.0.5]: https://github.com/kubernetes-sigs/kustomize/releases/tag/kustomize%2Fv4.0.5 ([#98946](https://github.com/kubernetes/kubernetes/pull/98946), [@monopole](https://github.com/monopole)) [SIG API Machinery, Architecture, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Node and Storage] -- When a CNI plugin returns dual-stack pod IPs, kubelet will now try to respect the - "primary IP family" of the cluster by picking a primary pod IP of the same family - as the (primary) node IP, rather than assuming that the CNI plugin returned the IPs - in the order the administrator wanted (since some CNI plugins don't allow - configuring this). ([#97979](https://github.com/kubernetes/kubernetes/pull/97979), [@danwinship](https://github.com/danwinship)) [SIG Network and Node] -- When using Containerd on Windows, the "C:\Windows\System32\drivers\etc\hosts" file will now be managed by kubelet. ([#83730](https://github.com/kubernetes/kubernetes/pull/83730), [@claudiubelu](https://github.com/claudiubelu)) [SIG Node and Windows] -- `VolumeBindingArgs` now allow `BindTimeoutSeconds` to be set as zero, while the value zero indicates no waiting for the checking of volume binding operation. ([#99835](https://github.com/kubernetes/kubernetes/pull/99835), [@chendave](https://github.com/chendave)) [SIG Scheduling and Storage] -- `kubectl exec` and `kubectl attach` now honor the `--quiet` flag which suppresses output from the local binary that could be confused by a script with the remote command output (all non-failure output is hidden). In addition, print inline with exec and attach the list of alternate containers when we default to the first spec.container. ([#99004](https://github.com/kubernetes/kubernetes/pull/99004), [@smarterclayton](https://github.com/smarterclayton)) [SIG CLI] - -### Other (Cleanup or Flake) - -- Apiserver_request_duration_seconds is promoted to stable status. ([#99925](https://github.com/kubernetes/kubernetes/pull/99925), [@logicalhan](https://github.com/logicalhan)) [SIG API Machinery, Instrumentation and Testing] -- Apiserver_request_total is promoted to stable status and no longer has a content-type dimensions, so any alerts/charts which presume the existence of this will fail. This is however, unlikely to be the case since it was effectively an unbounded dimension in the first place. ([#99788](https://github.com/kubernetes/kubernetes/pull/99788), [@logicalhan](https://github.com/logicalhan)) [SIG API Machinery, Instrumentation and Testing] -- EndpointSlice generation is now incremented when labels change. ([#99750](https://github.com/kubernetes/kubernetes/pull/99750), [@robscott](https://github.com/robscott)) [SIG Network] -- Featuregate AllowInsecureBackendProxy is promoted to GA ([#99658](https://github.com/kubernetes/kubernetes/pull/99658), [@deads2k](https://github.com/deads2k)) [SIG API Machinery] -- Migrate `pkg/kubelet/(eviction)` to structured logging ([#99032](https://github.com/kubernetes/kubernetes/pull/99032), [@yangjunmyfm192085](https://github.com/yangjunmyfm192085)) [SIG Node] -- Migrate deployment controller log messages to structured logging ([#97507](https://github.com/kubernetes/kubernetes/pull/97507), [@aldudko](https://github.com/aldudko)) [SIG Apps] -- Migrate pkg/kubelet/cloudresource to structured logging ([#98999](https://github.com/kubernetes/kubernetes/pull/98999), [@sladyn98](https://github.com/sladyn98)) [SIG Node] -- Migrate pkg/kubelet/cri/remote logs to structured logging ([#98589](https://github.com/kubernetes/kubernetes/pull/98589), [@chenyw1990](https://github.com/chenyw1990)) [SIG Node] -- Migrate pkg/kubelet/kuberuntime/kuberuntime_container.go logs to structured logging ([#96973](https://github.com/kubernetes/kubernetes/pull/96973), [@chenyw1990](https://github.com/chenyw1990)) [SIG Instrumentation and Node] -- Migrate pkg/kubelet/status to structured logging ([#99836](https://github.com/kubernetes/kubernetes/pull/99836), [@navidshaikh](https://github.com/navidshaikh)) [SIG Instrumentation and Node] -- Migrate pkg/kubelet/token to structured logging ([#99264](https://github.com/kubernetes/kubernetes/pull/99264), [@palnabarun](https://github.com/palnabarun)) [SIG Auth, Instrumentation and Node] -- Migrate pkg/kubelet/util to structured logging ([#99823](https://github.com/kubernetes/kubernetes/pull/99823), [@navidshaikh](https://github.com/navidshaikh)) [SIG Instrumentation and Node] -- Migrate proxy/userspace/proxier.go logs to structured logging ([#97837](https://github.com/kubernetes/kubernetes/pull/97837), [@JornShen](https://github.com/JornShen)) [SIG Network] -- Migrate some kubelet/metrics log messages to structured logging ([#98627](https://github.com/kubernetes/kubernetes/pull/98627), [@jialaijun](https://github.com/jialaijun)) [SIG Instrumentation and Node] -- Process start time on Windows now uses current process information ([#97491](https://github.com/kubernetes/kubernetes/pull/97491), [@jsturtevant](https://github.com/jsturtevant)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation and Windows] - -### Uncategorized - -- Migrate pkg/kubelet/stats to structured logging ([#99607](https://github.com/kubernetes/kubernetes/pull/99607), [@krzysiekg](https://github.com/krzysiekg)) [SIG Node] -- The DownwardAPIHugePages feature is beta. Users may use the feature if all workers in their cluster are min 1.20 version. The feature will be enabled by default in all installations in 1.22. ([#99610](https://github.com/kubernetes/kubernetes/pull/99610), [@derekwaynecarr](https://github.com/derekwaynecarr)) [SIG Node] - -## Dependencies - -### Added -- github.com/go-errors/errors: [v1.0.1](https://github.com/go-errors/errors/tree/v1.0.1) -- github.com/gobuffalo/here: [v0.6.0](https://github.com/gobuffalo/here/tree/v0.6.0) -- github.com/google/shlex: [e7afc7f](https://github.com/google/shlex/tree/e7afc7f) -- github.com/markbates/pkger: [v0.17.1](https://github.com/markbates/pkger/tree/v0.17.1) -- github.com/monochromegane/go-gitignore: [205db1a](https://github.com/monochromegane/go-gitignore/tree/205db1a) -- github.com/niemeyer/pretty: [a10e7ca](https://github.com/niemeyer/pretty/tree/a10e7ca) -- github.com/xlab/treeprint: [a009c39](https://github.com/xlab/treeprint/tree/a009c39) -- go.starlark.net: 8dd3e2e -- golang.org/x/term: 6a3ed07 -- sigs.k8s.io/kustomize/api: v0.8.5 -- sigs.k8s.io/kustomize/cmd/config: v0.9.7 -- sigs.k8s.io/kustomize/kustomize/v4: v4.0.5 -- sigs.k8s.io/kustomize/kyaml: v0.10.15 - -### Changed -- dmitri.shuralyov.com/gpu/mtl: 666a987 → 28db891 -- github.com/creack/pty: [v1.1.7 → v1.1.9](https://github.com/creack/pty/compare/v1.1.7...v1.1.9) -- github.com/go-openapi/spec: [v0.19.3 → v0.19.5](https://github.com/go-openapi/spec/compare/v0.19.3...v0.19.5) -- github.com/go-openapi/strfmt: [v0.19.3 → v0.19.5](https://github.com/go-openapi/strfmt/compare/v0.19.3...v0.19.5) -- github.com/go-openapi/validate: [v0.19.5 → v0.19.8](https://github.com/go-openapi/validate/compare/v0.19.5...v0.19.8) -- github.com/google/cadvisor: [v0.38.7 → v0.38.8](https://github.com/google/cadvisor/compare/v0.38.7...v0.38.8) -- github.com/kr/text: [v0.1.0 → v0.2.0](https://github.com/kr/text/compare/v0.1.0...v0.2.0) -- github.com/mattn/go-runewidth: [v0.0.2 → v0.0.7](https://github.com/mattn/go-runewidth/compare/v0.0.2...v0.0.7) -- github.com/olekukonko/tablewriter: [a0225b3 → v0.0.4](https://github.com/olekukonko/tablewriter/compare/a0225b3...v0.0.4) -- github.com/sergi/go-diff: [v1.0.0 → v1.1.0](https://github.com/sergi/go-diff/compare/v1.0.0...v1.1.0) -- golang.org/x/crypto: 7f63de1 → 5ea612d -- golang.org/x/exp: 6cc2880 → 85be41e -- golang.org/x/mobile: d2bd2a2 → e6ae53a -- golang.org/x/mod: v0.3.0 → ce943fd -- golang.org/x/net: 69a7880 → 3d97a24 -- golang.org/x/sys: 5cba982 → a50acf3 -- golang.org/x/time: 3af7569 → f8bda1e -- golang.org/x/tools: 113979e → v0.1.0 -- gopkg.in/check.v1: 41f04d3 → 8fa4692 -- gopkg.in/yaml.v2: v2.2.8 → v2.4.0 -- k8s.io/kube-openapi: d219536 → 591a79e -- k8s.io/system-validators: v1.3.0 → v1.4.0 - -### Removed -- github.com/codegangsta/negroni: [v1.0.0](https://github.com/codegangsta/negroni/tree/v1.0.0) -- github.com/golangplus/bytes: [45c989f](https://github.com/golangplus/bytes/tree/45c989f) -- github.com/golangplus/fmt: [2a5d6d7](https://github.com/golangplus/fmt/tree/2a5d6d7) -- github.com/gorilla/context: [v1.1.1](https://github.com/gorilla/context/tree/v1.1.1) -- github.com/kr/pty: [v1.1.5](https://github.com/kr/pty/tree/v1.1.5) -- sigs.k8s.io/kustomize: v2.0.3+incompatible - - - -# v1.21.0-beta.0 - - -## Downloads for v1.21.0-beta.0 - -### Source Code - -filename | sha512 hash --------- | ----------- -[kubernetes.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes.tar.gz) | 69b73a03b70b0ed006e9fef3f5b9bc68f0eb8dc40db6cc04777c03a2cb83a008c783012ca186b1c48357fb192403dbcf6960f120924785e2076e215b9012d546 -[kubernetes-src.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-src.tar.gz) | 9620fb6d37634271bdd423c09f33f3bd29e74298aa82c47dffc8cb6bd2ff44fa8987a53c53bc529db4ca96ec41503aa81cc8d0c3ac106f3b06c4720de933a8e6 - -### Client binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-client-darwin-amd64.tar.gz) | 2a6f3fcd6b571f5ccde56b91e6e179a01899244be496dae16a2a16e0405c9437b75c6dc853b56f9a4876a7c0a60ec624ccd28400bf8fb960258263172f6860ba -[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-client-linux-386.tar.gz) | 78fe9ad9f9a9bc043293327223f0038a2c087ca65e87187a6dcae7a24aef9565fe498d295a4639b0b90524469a04930022fcecd815d0afc742eb87ddd8eb7ef5 -[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-client-linux-amd64.tar.gz) | c025f5e5bd132355e7dd1296cf2ec752264e7f754c4d95fc34b076bd75bef2f571d30872bcb3d138ce95c592111353d275a80eb31f82c07000874b4c56282dbd -[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-client-linux-arm.tar.gz) | 9975cd2f08fbc202575fb15ba6fc51dab23155ca4d294ebb48516a81efa51f58bab3a87d41c865103756189b554c020371d729ad42880ba788f25047ffc46910 -[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-client-linux-arm64.tar.gz) | 56a6836e24471e42e9d9a8488453f2d55598d70c8aca0a307d5116139c930c25c469fd0d1ab5060fbe88dad75a9b5209a08dc11d644af5f3ebebfbcb6c16266c -[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-client-linux-ppc64le.tar.gz) | b6a6cc9baad0ad85ed079ee80e6d6acc905095cfb440998bbc0f553b94fa80077bd58b8692754de477517663d51161705e6e89a1b6d04aa74819800db3517722 -[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-client-linux-s390x.tar.gz) | 7b743481b340f510bf9ae28ea8ea91150aa1e8c37fe104b66d7b3aff62f5e6db3c590d2c13d14dbb5c928de31c7613372def2496075853611d10d6b5fa5b60bd -[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-client-windows-386.tar.gz) | df06c7a524ce84c1f8d7836aa960c550c88dbca0ec4854df4dd0a85b3c84b8ecbc41b54e8c4669ce28ac670659ff0fad795deb1bc539f3c3b3aa885381265f5a -[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-client-windows-amd64.tar.gz) | 4568497b684564f2a94fbea6cbfd778b891231470d9a6956c3b7a3268643d13b855c0fc5ebea5f769300cc0c7719c2c331c387f468816f182f63e515adeaa7a0 - -### Server binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-server-linux-amd64.tar.gz) | 42883cca2d312153baf693fc6024a295359a421e74fd70eefc927413be4e0353debe634e7cca6b9a8f7d8a0cee3717e03ba5d29a306e93139b1c2f3027535a6d -[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-server-linux-arm.tar.gz) | e0042215e84c769ba4fc4d159ccf67b2c4a26206bfffb0ec5152723dc813ff9c1426aa0e9b963d7bfa2efb266ca43561b596b459152882ebb42102ccf60bd8eb -[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-server-linux-arm64.tar.gz) | bfad29d43e14152cb9bc7c4df6aa77929c6eca64a294bb832215bdba9fa0ee2195a2b709c0267dc7426bb371b547ee80bb8461a8c678c9bffa0819aa7db96289 -[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-server-linux-ppc64le.tar.gz) | ca67674c01c6cebdc8160c85b449eab1a23bb0557418665246e0208543fa2eaaf97679685c7b49bee3a4300904c0399c3d762ae34dc3e279fd69ce792c4b07ff -[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-server-linux-s390x.tar.gz) | 285352b628ec754b01b8ad4ef1427223a142d58ebcb46f6861df14d68643133b32330460b213b1ba5bc5362ff2b6dacd8e0c2d20cce6e760fa1954af8a60df8b - -### Node binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-node-linux-amd64.tar.gz) | d92d9b30e7e44134a0cd9db4c01924d365991ea16b3131200b02a82cff89c8701f618cd90e7f1c65427bd4bb5f78b10d540b2262de2c143b401fa44e5b25627b -[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-node-linux-arm.tar.gz) | 551092f23c27fdea4bb2d0547f6075892534892a96fc2be7786f82b58c93bffdb5e1c20f8f11beb8bed46c24f36d4c18ec5ac9755435489efa28e6ae775739bd -[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-node-linux-arm64.tar.gz) | 26ae7f4163e527349b8818ee38b9ee062314ab417f307afa49c146df8f5a2bd689509b128bd4a1efd3896fd89571149a9955ada91f8ca0c2f599cd863d613c86 -[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-node-linux-ppc64le.tar.gz) | 821fa953f6cebc69d2d481e489f3e90899813d20e2eefbabbcadd019d004108e7540f741fabe60e8e7c6adbb1053ac97898bbdddec3ca19f34a71aa3312e0d4e -[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-node-linux-s390x.tar.gz) | 22197d4f66205d5aa9de83dfddcc4f2bb3195fd7067cdb5c21e61dbeae217bc112fb7ecff8a539579b60ad92298c2b4c87b9b7c7e6ec1ee1ffa0c6e4bc4412c1 -[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.21.0-beta.0/kubernetes-node-windows-amd64.tar.gz) | 7e22e0d9603562a04dee16a513579f06b1ff6354d97d669bd68f8777ec7f89f6ef027fb23ab0445d7bba0bb689352f0cc748ce90e3f597c6ebe495464a96b860 - -## Changelog since v1.21.0-alpha.3 - -## Urgent Upgrade Notes - -### (No, really, you MUST read this before you upgrade) - - - The metric `storage_operation_errors_total` is not removed, but is marked deprecated, and the metric `storage_operation_status_count` is marked deprecated. In both cases the storage_operation_duration_seconds metric can be used to recover equivalent counts (using `status=fail-unknown` in the case of `storage_operations_errors_total`). ([#99045](https://github.com/kubernetes/kubernetes/pull/99045), [@mattcary](https://github.com/mattcary)) [SIG Instrumentation and Storage] - -## Changes by Kind - -### Deprecation - -- The `batch/v2alpha1` CronJob type definitions and clients are deprecated and removed. ([#96987](https://github.com/kubernetes/kubernetes/pull/96987), [@soltysh](https://github.com/soltysh)) [SIG API Machinery, Apps, CLI and Testing] - -### API Change - -- Cluster admins can now turn off /debug/pprof and /debug/flags/v endpoint in kubelet by setting enableProfilingHandler and enableDebugFlagsHandler to false in their kubelet configuration file. enableProfilingHandler and enableDebugFlagsHandler can be set to true only when enableDebuggingHandlers is also set to true. ([#98458](https://github.com/kubernetes/kubernetes/pull/98458), [@SaranBalaji90](https://github.com/SaranBalaji90)) [SIG Node] -- The BoundServiceAccountTokenVolume feature has been promoted to beta, and enabled by default. - - This changes the tokens provided to containers at `/var/run/secrets/kubernetes.io/serviceaccount/token` to be time-limited, auto-refreshed, and invalidated when the containing pod is deleted. - - Clients should reload the token from disk periodically (once per minute is recommended) to ensure they continue to use a valid token. `k8s.io/client-go` version v11.0.0+ and v0.15.0+ reload tokens automatically. - - By default, injected tokens are given an extended lifetime so they remain valid even after a new refreshed token is provided. The metric `serviceaccount_stale_tokens_total` can be used to monitor for workloads that are depending on the extended lifetime and are continuing to use tokens even after a refreshed token is provided to the container. If that metric indicates no existing workloads are depending on extended lifetimes, injected token lifetime can be shortened to 1 hour by starting `kube-apiserver` with `--service-account-extend-token-expiration=false`. ([#95667](https://github.com/kubernetes/kubernetes/pull/95667), [@zshihang](https://github.com/zshihang)) [SIG API Machinery, Auth, Cluster Lifecycle and Testing] - -### Feature - -- A new histogram metric to track the time it took to delete a job by the ttl-after-finished controller ([#98676](https://github.com/kubernetes/kubernetes/pull/98676), [@ahg-g](https://github.com/ahg-g)) [SIG Apps and Instrumentation] -- AWS cloudprovider supports auto-discovering subnets without any kubernetes.io/cluster/<clusterName> tags. It also supports additional service annotation service.beta.kubernetes.io/aws-load-balancer-subnets to manually configure the subnets. ([#97431](https://github.com/kubernetes/kubernetes/pull/97431), [@kishorj](https://github.com/kishorj)) [SIG Cloud Provider] -- Add --permit-address-sharing flag to kube-apiserver to listen with SO_REUSEADDR. While allowing to listen on wildcard IPs like 0.0.0.0 and specific IPs in parallel, it avoid waiting for the kernel to release socket in TIME_WAIT state, and hence, considably reducing kube-apiserver restart times under certain conditions. ([#93861](https://github.com/kubernetes/kubernetes/pull/93861), [@sttts](https://github.com/sttts)) [SIG API Machinery] -- Add `csi_operations_seconds` metric on kubelet that exposes CSI operations duration and status for node CSI operations. ([#98979](https://github.com/kubernetes/kubernetes/pull/98979), [@Jiawei0227](https://github.com/Jiawei0227)) [SIG Instrumentation and Storage] -- Add `migrated` field into `storage_operation_duration_seconds` metric ([#99050](https://github.com/kubernetes/kubernetes/pull/99050), [@Jiawei0227](https://github.com/Jiawei0227)) [SIG Apps, Instrumentation and Storage] -- Add bash-completion for comma separated list on `kubectl get` ([#98301](https://github.com/kubernetes/kubernetes/pull/98301), [@phil9909](https://github.com/phil9909)) [SIG CLI] -- Added support for installing arm64 node artifacts. ([#99242](https://github.com/kubernetes/kubernetes/pull/99242), [@liu-cong](https://github.com/liu-cong)) [SIG Cloud Provider] -- Feature gate RootCAConfigMap is graduated to GA in 1.21 and will be removed in 1.22. ([#98033](https://github.com/kubernetes/kubernetes/pull/98033), [@zshihang](https://github.com/zshihang)) [SIG API Machinery and Auth] -- Kubeadm: during "init" and "join" perform preflight validation on the host / node name and throw warnings if a name is not compliant ([#99194](https://github.com/kubernetes/kubernetes/pull/99194), [@pacoxu](https://github.com/pacoxu)) [SIG Cluster Lifecycle] -- Kubectl: `kubectl get` will omit managed fields by default now. Users could set `--show-managed-fields` to true to show managedFields when the output format is either `json` or `yaml`. ([#96878](https://github.com/kubernetes/kubernetes/pull/96878), [@knight42](https://github.com/knight42)) [SIG CLI and Testing] -- Metrics can now be disabled explicitly via a command line flag (i.e. '--disabled-metrics=bad_metric1,bad_metric2') ([#99217](https://github.com/kubernetes/kubernetes/pull/99217), [@logicalhan](https://github.com/logicalhan)) [SIG API Machinery, Cluster Lifecycle and Instrumentation] -- TTLAfterFinished is now beta and enabled by default ([#98678](https://github.com/kubernetes/kubernetes/pull/98678), [@ahg-g](https://github.com/ahg-g)) [SIG Apps and Auth] -- The `RunAsGroup` feature has been promoted to GA in this release. ([#94641](https://github.com/kubernetes/kubernetes/pull/94641), [@krmayankk](https://github.com/krmayankk)) [SIG Auth and Node] -- Turn CronJobControllerV2 on by default. ([#98878](https://github.com/kubernetes/kubernetes/pull/98878), [@soltysh](https://github.com/soltysh)) [SIG Apps] -- UDP protocol support for Agnhost connect subcommand ([#98639](https://github.com/kubernetes/kubernetes/pull/98639), [@knabben](https://github.com/knabben)) [SIG Testing] -- Upgrades `IPv6Dualstack` to `Beta` and turns it on by default. Clusters new and existing will not be affected until user starting adding secondary pod and service cidrs cli flags as described here: https://github.com/kubernetes/enhancements/tree/master/keps/sig-network/563-dual-stack ([#98969](https://github.com/kubernetes/kubernetes/pull/98969), [@khenidak](https://github.com/khenidak)) [SIG API Machinery, Apps, Cloud Provider, Network and Node] - -### Documentation - -- Fix ALPHA stability level reference link ([#98641](https://github.com/kubernetes/kubernetes/pull/98641), [@Jeffwan](https://github.com/Jeffwan)) [SIG Auth, Cloud Provider, Instrumentation and Storage] - -### Failing Test - -- Escape the special characters like `[`, `]` and ` ` that exist in vsphere windows path ([#98830](https://github.com/kubernetes/kubernetes/pull/98830), [@liyanhui1228](https://github.com/liyanhui1228)) [SIG Storage and Windows] -- Kube-proxy: fix a bug on UDP NodePort Services where stale conntrack entries may blackhole the traffic directed to the NodePort. ([#98305](https://github.com/kubernetes/kubernetes/pull/98305), [@aojea](https://github.com/aojea)) [SIG Network] - -### Bug or Regression - -- Add missing --kube-api-content-type in kubemark hollow template ([#98911](https://github.com/kubernetes/kubernetes/pull/98911), [@Jeffwan](https://github.com/Jeffwan)) [SIG Scalability and Testing] -- Avoid duplicate error messages when runing kubectl edit quota ([#98201](https://github.com/kubernetes/kubernetes/pull/98201), [@pacoxu](https://github.com/pacoxu)) [SIG API Machinery and Apps] -- Cleanup subnet in frontend IP configs to prevent huge subnet request bodies in some scenarios. ([#98133](https://github.com/kubernetes/kubernetes/pull/98133), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider] -- Fix errors when accessing Windows container stats for Dockershim ([#98510](https://github.com/kubernetes/kubernetes/pull/98510), [@jsturtevant](https://github.com/jsturtevant)) [SIG Node and Windows] -- Fixes spurious errors about IPv6 in kube-proxy logs on nodes with IPv6 disabled. ([#99127](https://github.com/kubernetes/kubernetes/pull/99127), [@danwinship](https://github.com/danwinship)) [SIG Network and Node] -- In the method that ensures that the docker and containerd are in the correct containers with the proper OOM score set up, fixed the bug of identifying containerd process. ([#97888](https://github.com/kubernetes/kubernetes/pull/97888), [@pacoxu](https://github.com/pacoxu)) [SIG Node] -- Kubelet now cleans up orphaned volume directories automatically ([#95301](https://github.com/kubernetes/kubernetes/pull/95301), [@lorenz](https://github.com/lorenz)) [SIG Node and Storage] -- When dynamically provisioning Azure File volumes for a premium account, the requested size will be set to 100GB if the request is initially lower than this value to accommodate Azure File requirements. ([#99122](https://github.com/kubernetes/kubernetes/pull/99122), [@huffmanca](https://github.com/huffmanca)) [SIG Cloud Provider and Storage] - -### Other (Cleanup or Flake) - -- APIs for kubelet annotations and labels from k8s.io/kubernetes/pkg/kubelet/apis are now available under k8s.io/kubelet/pkg/apis/ ([#98931](https://github.com/kubernetes/kubernetes/pull/98931), [@michaelbeaumont](https://github.com/michaelbeaumont)) [SIG Apps, Auth and Node] -- Migrate `pkg/kubelet/(pod, pleg)` to structured logging ([#98990](https://github.com/kubernetes/kubernetes/pull/98990), [@gjkim42](https://github.com/gjkim42)) [SIG Instrumentation and Node] -- Migrate pkg/kubelet/nodestatus to structured logging ([#99001](https://github.com/kubernetes/kubernetes/pull/99001), [@QiWang19](https://github.com/QiWang19)) [SIG Node] -- Migrate pkg/kubelet/server logs to structured logging ([#98643](https://github.com/kubernetes/kubernetes/pull/98643), [@chenyw1990](https://github.com/chenyw1990)) [SIG Node] -- Migrate proxy/winkernel/proxier.go logs to structured logging ([#98001](https://github.com/kubernetes/kubernetes/pull/98001), [@JornShen](https://github.com/JornShen)) [SIG Network and Windows] -- Migrate scheduling_queue.go to structured logging ([#98358](https://github.com/kubernetes/kubernetes/pull/98358), [@tanjing2020](https://github.com/tanjing2020)) [SIG Scheduling] -- Several flags related to the deprecated dockershim which are present in the kubelet command line are now deprecated. ([#98730](https://github.com/kubernetes/kubernetes/pull/98730), [@dims](https://github.com/dims)) [SIG Node] -- The deprecated feature gates `CSIDriverRegistry`, `BlockVolume` and `CSIBlockVolume` are now unconditionally enabled and can no longer be specified in component invocations. ([#98021](https://github.com/kubernetes/kubernetes/pull/98021), [@gavinfish](https://github.com/gavinfish)) [SIG Storage] - -## Dependencies - -### Added -_Nothing has changed._ - -### Changed -- sigs.k8s.io/structured-merge-diff/v4: v4.0.2 → v4.0.3 - -### Removed -_Nothing has changed._ - - - -# v1.21.0-alpha.3 - - -## Downloads for v1.21.0-alpha.3 - -### Source Code - -filename | sha512 hash --------- | ----------- -[kubernetes.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes.tar.gz) | 704ec916a1dbd134c54184d2652671f80ae09274f9d23dbbed312944ebeccbc173e2e6b6949b38bdbbfdaf8aa032844deead5efeda1b3150f9751386d9184bc8 -[kubernetes-src.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-src.tar.gz) | 57db9e7560cfc9c10e7059cb5faf9c4bd5eb8f9b7964f44f000a417021cf80873184b774e7c66c80d4aba84c14080c6bc335618db3d2e5f276436ae065e25408 - -### Client binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-client-darwin-amd64.tar.gz) | e2706efda92d5cf4f8b69503bb2f7703a8754407eff7f199bb77847838070e720e5f572126c14daa4c0c03b59bb1a63c1dfdeb6e936a40eff1d5497e871e3409 -[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-client-linux-386.tar.gz) | 007bb23c576356ed0890bdfd25a0f98d552599e0ffec19fb982591183c7c1f216d8a3ffa3abf15216be12ae5c4b91fdcd48a7306a2d26b007b86a6abd553fc61 -[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-client-linux-amd64.tar.gz) | 39504b0c610348beba60e8866fff265bad58034f74504951cd894c151a248db718d10f77ebc83f2c38b2d517f8513a46325b38889eefa261ca6dbffeceba50ff -[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-client-linux-arm.tar.gz) | 30bc2c40d0c759365422ad1651a6fb35909be771f463c5b971caf401f9209525d05256ab70c807e88628dd357c2896745eecf13eda0b748464da97d0a5ef2066 -[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-client-linux-arm64.tar.gz) | 085cdf574dc8fd33ece667130b8c45830b522a07860e03a2384283b1adea73a9652ef3dfaa566e69ee00aea1a6461608814b3ce7a3f703e4a934304f7ae12f97 -[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-client-linux-ppc64le.tar.gz) | b34b845037d83ea7b3e2d80a9ede4f889b71b17b93b1445f0d936a36e98c13ed6ada125630a68d9243a5fcd311ee37cdcc0c05da484da8488ea5060bc529dbfc -[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-client-linux-s390x.tar.gz) | c4758adc7a404b776556efaa79655db2a70777c562145d6ea6887f3335988367a0c2fcd4383e469340f2a768b22e786951de212805ca1cb91104d41c21e0c9ce -[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-client-windows-386.tar.gz) | f51edc79702bbd1d9cb3a672852a405e11b20feeab64c5411a7e85c9af304960663eb6b23ef96e0f8c44a722fecf58cb6d700ea2c42c05b3269d8efd5ad803f2 -[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-client-windows-amd64.tar.gz) | 6a3507ce4ac40a0dc7e4720538863fa15f8faf025085a032f34b8fa0f6fa4e8c26849baf649b5b32829b9182e04f82721b13950d31cf218c35be6bf1c05d6abf - -### Server binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-server-linux-amd64.tar.gz) | 19181d162dfb0b30236e2bf1111000e037eece87c037ca2b24622ca94cb88db86aa4da4ca533522518b209bc9983bbfd6b880a7898e0da96b33f3f6c4690539b -[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-server-linux-arm.tar.gz) | 42a02f9e08a78ad5da6e5fa1ab12bf1e3c967c472fdbdadbd8746586da74dc8093682ba8513ff2a5301393c47ee9021b860e88ada56b13da386ef485708e46ca -[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-server-linux-arm64.tar.gz) | 3c8ba8eb02f70061689bd7fab7813542005efe2edc6cfc6b7aecd03ffedf0b81819ad91d69fff588e83023d595eefbfe636aa55e1856add8733bf42fff3c748f -[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-server-linux-ppc64le.tar.gz) | cd9e6537450411c39a06fd0b5819db3d16b668d403fb3627ec32c0e32dd1c4860e942934578ca0e1d1b8e6f21f450ff81e37e0cd46ff5c5faf7847ab074aefc5 -[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-server-linux-s390x.tar.gz) | ada3f65e53bc0e0c0229694dd48c425388089d6d77111a62476d1b08f6ad1d8ab3d60b9ed7d95ac1b42c2c6be8dc0618f40679717160769743c43583d8452362 - -### Node binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-node-linux-amd64.tar.gz) | ae0fec6aa59e49624b55d9a11c12fdf717ddfe04bdfd4f69965d03004a34e52ee4a3e83f7b61d0c6a86f43b72c99f3decb195b39ae529ef30526d18ec5f58f83 -[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-node-linux-arm.tar.gz) | 9a48c140ab53b7ed8ecec6903988a1a474efc16d2538e5974bc9a12f0c9190be78c4f9e326bf4e982d0b7045a80b99dd0fda7e9b650663be5b89bfd991596746 -[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-node-linux-arm64.tar.gz) | 6912adbc9300344bea470d6435f7b387bfce59767078c11728ce59faf47cd3f72b41b9604fcc5cda45e9816fe939fbe2fb33e52a773e6ff2dfa9a615b4df6141 -[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-node-linux-ppc64le.tar.gz) | d66dccfe3e6ed6d81567c70703f15375a53992b3a5e2814b98c32e581b861ad95912e03ed2562415d087624c008038bb4a816611fa255442ae752968ea15856b -[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-node-linux-s390x.tar.gz) | ad8c69a28f1fbafa3f1cb54909bfd3fc22b104bed63d7ca2b296208c9d43eb5f2943a0ff267da4c185186cdd9f7f77b315cd7f5f1bf9858c0bf42eceb9ac3c58 -[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.3/kubernetes-node-windows-amd64.tar.gz) | 91d723aa848a9cb028f5bcb41090ca346fb973961521d025c4399164de2c8029b57ca2c4daca560d3c782c05265d2eb0edb0abcce6f23d3efbecf2316a54d650 - -## Changelog since v1.21.0-alpha.2 - -## Urgent Upgrade Notes - -### (No, really, you MUST read this before you upgrade) - - - Newly provisioned PVs by gce-pd will no longer have the beta FailureDomain label. gce-pd volume plugin will start to have GA topology label instead. ([#98700](https://github.com/kubernetes/kubernetes/pull/98700), [@Jiawei0227](https://github.com/Jiawei0227)) [SIG Cloud Provider, Storage and Testing] - - Remove alpha CSIMigrationXXComplete flag and add alpha InTreePluginXXUnregister flag. Deprecate CSIMigrationvSphereComplete flag and it will be removed in 1.22. ([#98243](https://github.com/kubernetes/kubernetes/pull/98243), [@Jiawei0227](https://github.com/Jiawei0227)) [SIG Node and Storage] - -## Changes by Kind - -### API Change - -- Adds support for portRange / EndPort in Network Policy ([#97058](https://github.com/kubernetes/kubernetes/pull/97058), [@rikatz](https://github.com/rikatz)) [SIG Apps and Network] -- Fixes using server-side apply with APIService resources ([#98576](https://github.com/kubernetes/kubernetes/pull/98576), [@kevindelgado](https://github.com/kevindelgado)) [SIG API Machinery, Apps and Testing] -- Kubernetes is now built using go1.15.7 ([#98363](https://github.com/kubernetes/kubernetes/pull/98363), [@cpanato](https://github.com/cpanato)) [SIG Cloud Provider, Instrumentation, Node, Release and Testing] -- Scheduler extender filter interface now can report unresolvable failed nodes in the new field `FailedAndUnresolvableNodes` of `ExtenderFilterResult` struct. Nodes in this map will be skipped in the preemption phase. ([#92866](https://github.com/kubernetes/kubernetes/pull/92866), [@cofyc](https://github.com/cofyc)) [SIG Scheduling] - -### Feature - -- A lease can only attach up to 10k objects. ([#98257](https://github.com/kubernetes/kubernetes/pull/98257), [@lingsamuel](https://github.com/lingsamuel)) [SIG API Machinery] -- Add ignore-errors flag for drain, support none-break drain in group ([#98203](https://github.com/kubernetes/kubernetes/pull/98203), [@yuzhiquan](https://github.com/yuzhiquan)) [SIG CLI] -- Base-images: Update to debian-iptables:buster-v1.4.0 - - Uses iptables 1.8.5 - - base-images: Update to debian-base:buster-v1.3.0 - - cluster/images/etcd: Build etcd:3.4.13-2 image - - Uses debian-base:buster-v1.3.0 ([#98401](https://github.com/kubernetes/kubernetes/pull/98401), [@pacoxu](https://github.com/pacoxu)) [SIG Testing] -- Export NewDebuggingRoundTripper function and DebugLevel options in the k8s.io/client-go/transport package. ([#98324](https://github.com/kubernetes/kubernetes/pull/98324), [@atosatto](https://github.com/atosatto)) [SIG API Machinery] -- Kubectl wait ensures that observedGeneration >= generation if applicable ([#97408](https://github.com/kubernetes/kubernetes/pull/97408), [@KnicKnic](https://github.com/KnicKnic)) [SIG CLI] -- Kubernetes is now built using go1.15.8 ([#98834](https://github.com/kubernetes/kubernetes/pull/98834), [@cpanato](https://github.com/cpanato)) [SIG Cloud Provider, Instrumentation, Release and Testing] -- New admission controller "denyserviceexternalips" is available. Clusters which do not *need- the Service "externalIPs" feature should enable this controller and be more secure. ([#97395](https://github.com/kubernetes/kubernetes/pull/97395), [@thockin](https://github.com/thockin)) [SIG API Machinery] -- Overall, enable the feature of `PreferNominatedNode` will improve the performance of scheduling where preemption might frequently happen, but in theory, enable the feature of `PreferNominatedNode`, the pod might not be scheduled to the best candidate node in the cluster. ([#93179](https://github.com/kubernetes/kubernetes/pull/93179), [@chendave](https://github.com/chendave)) [SIG Scheduling and Testing] -- Pause image upgraded to 3.4.1 in kubelet and kubeadm for both Linux and Windows. ([#98205](https://github.com/kubernetes/kubernetes/pull/98205), [@pacoxu](https://github.com/pacoxu)) [SIG CLI, Cloud Provider, Cluster Lifecycle, Node, Testing and Windows] -- The `ServiceAccountIssuerDiscovery` feature has graduated to GA, and is unconditionally enabled. The `ServiceAccountIssuerDiscovery` feature-gate will be removed in 1.22. ([#98553](https://github.com/kubernetes/kubernetes/pull/98553), [@mtaufen](https://github.com/mtaufen)) [SIG API Machinery, Auth and Testing] - -### Documentation - -- Feat: azure file migration go beta in 1.21. Feature gates CSIMigration to Beta (on by default) and CSIMigrationAzureFile to Beta (off by default since it requires installation of the AzureFile CSI Driver) - The in-tree AzureFile plugin "kubernetes.io/azure-file" is now deprecated and will be removed in 1.23. Users should enable CSIMigration + CSIMigrationAzureFile features and install the AzureFile CSI Driver (https://github.com/kubernetes-sigs/azurefile-csi-driver) to avoid disruption to existing Pod and PVC objects at that time. - Users should start using the AzureFile CSI Driver directly for any new volumes. ([#96293](https://github.com/kubernetes/kubernetes/pull/96293), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider] - -### Failing Test - -- Kubelet: the HostPort implementation in dockershim was not taking into consideration the HostIP field, causing that the same HostPort can not be used with different IP addresses. - This bug causes the conformance test "HostPort validates that there is no conflict between pods with same hostPort but different hostIP and protocol" to fail. ([#98755](https://github.com/kubernetes/kubernetes/pull/98755), [@aojea](https://github.com/aojea)) [SIG Cloud Provider, Network and Node] - -### Bug or Regression - -- Fix NPE in ephemeral storage eviction ([#98261](https://github.com/kubernetes/kubernetes/pull/98261), [@wzshiming](https://github.com/wzshiming)) [SIG Node] -- Fixed a bug that on k8s nodes, when the policy of INPUT chain in filter table is not ACCEPT, healthcheck nodeport would not work. - Added iptables rules to allow healthcheck nodeport traffic. ([#97824](https://github.com/kubernetes/kubernetes/pull/97824), [@hanlins](https://github.com/hanlins)) [SIG Network] -- Fixed kube-proxy container image architecture for non amd64 images. ([#98526](https://github.com/kubernetes/kubernetes/pull/98526), [@saschagrunert](https://github.com/saschagrunert)) [SIG API Machinery, Release and Testing] -- Fixed provisioning of Cinder volumes migrated to CSI when StorageClass with AllowedTopologies was used. ([#98311](https://github.com/kubernetes/kubernetes/pull/98311), [@jsafrane](https://github.com/jsafrane)) [SIG Storage] -- Fixes a panic in the disruption budget controller for PDB objects with invalid selectors ([#98750](https://github.com/kubernetes/kubernetes/pull/98750), [@mortent](https://github.com/mortent)) [SIG Apps] -- Fixes connection errors when using `--volume-host-cidr-denylist` or `--volume-host-allow-local-loopback` ([#98436](https://github.com/kubernetes/kubernetes/pull/98436), [@liggitt](https://github.com/liggitt)) [SIG Network and Storage] -- If the user specifies an invalid timeout in the request URL, the request will be aborted with an HTTP 400. - - in cases where the client specifies a timeout in the request URL, the overall request deadline is shortened now since the deadline is setup as soon as the request is received by the apiserver. ([#96901](https://github.com/kubernetes/kubernetes/pull/96901), [@tkashem](https://github.com/tkashem)) [SIG API Machinery and Testing] -- Kubeadm: Some text in the `kubeadm upgrade plan` output has changed. If you have scripts or other automation that parses this output, please review these changes and update your scripts to account for the new output. ([#98728](https://github.com/kubernetes/kubernetes/pull/98728), [@stmcginnis](https://github.com/stmcginnis)) [SIG Cluster Lifecycle] -- Kubeadm: fix a bug where external credentials in an existing admin.conf prevented the CA certificate to be written in the cluster-info ConfigMap. ([#98882](https://github.com/kubernetes/kubernetes/pull/98882), [@kvaps](https://github.com/kvaps)) [SIG Cluster Lifecycle] -- Kubeadm: fix bad token placeholder text in "config print *-defaults --help" ([#98839](https://github.com/kubernetes/kubernetes/pull/98839), [@Mattias-](https://github.com/Mattias-)) [SIG Cluster Lifecycle] -- Kubeadm: get k8s CI version markers from k8s infra bucket ([#98836](https://github.com/kubernetes/kubernetes/pull/98836), [@hasheddan](https://github.com/hasheddan)) [SIG Cluster Lifecycle and Release] -- Mitigate CVE-2020-8555 for kube-up using GCE by preventing local loopback folume hosts. ([#97934](https://github.com/kubernetes/kubernetes/pull/97934), [@mattcary](https://github.com/mattcary)) [SIG Cloud Provider and Storage] -- Remove CSI topology from migrated in-tree gcepd volume. ([#97823](https://github.com/kubernetes/kubernetes/pull/97823), [@Jiawei0227](https://github.com/Jiawei0227)) [SIG Cloud Provider and Storage] -- Sync node status during kubelet node shutdown. - Adds an pod admission handler that rejects new pods when the node is in progress of shutting down. ([#98005](https://github.com/kubernetes/kubernetes/pull/98005), [@wzshiming](https://github.com/wzshiming)) [SIG Node] -- Truncates a message if it hits the NoteLengthLimit when the scheduler records an event for the pod that indicates the pod has failed to schedule. ([#98715](https://github.com/kubernetes/kubernetes/pull/98715), [@carlory](https://github.com/carlory)) [SIG Scheduling] -- We will no longer automatically delete all data when a failure is detected during creation of the volume data file on a CSI volume. Now we will only remove the data file and volume path. ([#96021](https://github.com/kubernetes/kubernetes/pull/96021), [@huffmanca](https://github.com/huffmanca)) [SIG Storage] - -### Other (Cleanup or Flake) - -- Fix the description of command line flags that can override --config ([#98254](https://github.com/kubernetes/kubernetes/pull/98254), [@changshuchao](https://github.com/changshuchao)) [SIG Scheduling] -- Migrate scheduler/taint_manager.go structured logging ([#98259](https://github.com/kubernetes/kubernetes/pull/98259), [@tanjing2020](https://github.com/tanjing2020)) [SIG Apps] -- Migrate staging/src/k8s.io/apiserver/pkg/admission logs to structured logging ([#98138](https://github.com/kubernetes/kubernetes/pull/98138), [@lala123912](https://github.com/lala123912)) [SIG API Machinery] -- Resolves flakes in the Ingress conformance tests due to conflicts with controllers updating the Ingress object ([#98430](https://github.com/kubernetes/kubernetes/pull/98430), [@liggitt](https://github.com/liggitt)) [SIG Network and Testing] -- The default delegating authorization options now allow unauthenticated access to healthz, readyz, and livez. A system:masters user connecting to an authz delegator will not perform an authz check. ([#98325](https://github.com/kubernetes/kubernetes/pull/98325), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, Auth, Cloud Provider and Scheduling] -- The e2e suite can be instructed not to wait for pods in kube-system to be ready or for all nodes to be ready by passing `--allowed-not-ready-nodes=-1` when invoking the e2e.test program. This allows callers to run subsets of the e2e suite in scenarios other than perfectly healthy clusters. ([#98781](https://github.com/kubernetes/kubernetes/pull/98781), [@smarterclayton](https://github.com/smarterclayton)) [SIG Testing] -- The feature gates `WindowsGMSA` and `WindowsRunAsUserName` that are GA since v1.18 are now removed. ([#96531](https://github.com/kubernetes/kubernetes/pull/96531), [@ialidzhikov](https://github.com/ialidzhikov)) [SIG Node and Windows] -- The new `-gce-zones` flag on the `e2e.test` binary instructs tests that check for information about how the cluster interacts with the cloud to limit their queries to the provided zone list. If not specified, the current behavior of asking the cloud provider for all available zones in multi zone clusters is preserved. ([#98787](https://github.com/kubernetes/kubernetes/pull/98787), [@smarterclayton](https://github.com/smarterclayton)) [SIG API Machinery, Cluster Lifecycle and Testing] - -## Dependencies - -### Added -- github.com/moby/spdystream: [v0.2.0](https://github.com/moby/spdystream/tree/v0.2.0) - -### Changed -- github.com/NYTimes/gziphandler: [56545f4 → v1.1.1](https://github.com/NYTimes/gziphandler/compare/56545f4...v1.1.1) -- github.com/container-storage-interface/spec: [v1.2.0 → v1.3.0](https://github.com/container-storage-interface/spec/compare/v1.2.0...v1.3.0) -- github.com/go-logr/logr: [v0.2.0 → v0.4.0](https://github.com/go-logr/logr/compare/v0.2.0...v0.4.0) -- github.com/gogo/protobuf: [v1.3.1 → v1.3.2](https://github.com/gogo/protobuf/compare/v1.3.1...v1.3.2) -- github.com/kisielk/errcheck: [v1.2.0 → v1.5.0](https://github.com/kisielk/errcheck/compare/v1.2.0...v1.5.0) -- github.com/yuin/goldmark: [v1.1.27 → v1.2.1](https://github.com/yuin/goldmark/compare/v1.1.27...v1.2.1) -- golang.org/x/sync: cd5d95a → 67f06af -- golang.org/x/tools: c1934b7 → 113979e -- k8s.io/klog/v2: v2.4.0 → v2.5.0 -- sigs.k8s.io/apiserver-network-proxy/konnectivity-client: v0.0.14 → v0.0.15 - -### Removed -- github.com/docker/spdystream: [449fdfc](https://github.com/docker/spdystream/tree/449fdfc) - - - -# v1.21.0-alpha.2 - - -## Downloads for v1.21.0-alpha.2 - -### Source Code - -filename | sha512 hash --------- | ----------- -[kubernetes.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes.tar.gz) | 6836f6c8514253fe0831fd171fc4ed92eb6d9a773491c8dc82b90d171a1b10076bd6bfaea56ec1e199c5f46c273265bdb9f174f0b2d99c5af1de4c99b862329e -[kubernetes-src.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-src.tar.gz) | d137694804741a05ab09e5f9a418448b66aba0146c028eafce61bcd9d7c276521e345ce9223ffbc703e8172041d58dfc56a3242a4df3686f24905a4541fcd306 - -### Client binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-client-darwin-amd64.tar.gz) | 9478b047a97717953f365c13a098feb7e3cb30a3df22e1b82aa945f2208dcc5cb90afc441ba059a3ae7aafb4ee000ec3a52dc65a8c043a5ac7255a391c875330 -[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-client-linux-386.tar.gz) | 44c8dd4b1ddfc256d35786c8abf45b0eb5f0794f5e310d2efc865748adddc50e8bf38aa71295ae8a82884cb65f2e0b9b0737b000f96fd8f2d5c19971d7c4d8e8 -[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-client-linux-amd64.tar.gz) | e1291989892769de6b978c17b8612b94da6f3b735a4d895100af622ca9ebb968c75548afea7ab00445869625dd0da3afec979e333afbb445805f5d31c1c13cc7 -[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-client-linux-arm.tar.gz) | 3c4bcb8cbe73822d68a2f62553a364e20bec56b638c71d0f58679b4f4b277d809142346f18506914e694f6122a3e0f767eab20b7b1c4dbb79e4c5089981ae0f1 -[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-client-linux-arm64.tar.gz) | 9389974a790268522e187f5ba5237f3ee4684118c7db76bc3d4164de71d8208702747ec333b204c7a78073ab42553cbbce13a1883fab4fec617e093b05fab332 -[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-client-linux-ppc64le.tar.gz) | 63399e53a083b5af3816c28ff162c9de6b64c75da4647f0d6bbaf97afdf896823cb1e556f2abac75c6516072293026d3ff9f30676fd75143ac6ca3f4d21f4327 -[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-client-linux-s390x.tar.gz) | 50898f197a9d923971ff9046c9f02779b57f7b3cea7da02f3ea9bab8c08d65a9c4a7531a2470fa14783460f52111a52b96ebf916c0a1d8215b4070e4e861c1b0 -[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-client-windows-386.tar.gz) | a7743e839e1aa19f5ee20b6ee5000ac8ef9e624ac5be63bb574fad6992e4b9167193ed07e03c9bc524e88bfeed66c95341a38a03bff1b10bc9910345f33019f0 -[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-client-windows-amd64.tar.gz) | 5f1d19c230bd3542866d16051808d184e9dd3e2f8c001ed4cee7b5df91f872380c2bf56a3add8c9413ead9d8c369efce2bcab4412174df9b823d3592677bf74e - -### Server binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-server-linux-amd64.tar.gz) | ef2cac10febde231aeb6f131e589450c560eeaab8046b49504127a091cddc17bc518c2ad56894a6a033033ab6fc6e121b1cc23691683bc36f45fe6b1dd8e0510 -[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-server-linux-arm.tar.gz) | d11c9730307f08e80b2b8a7c64c3e9a9e43c622002e377dfe3a386f4541e24adc79a199a6f280f40298bb36793194fd44ed45defe8a3ee54a9cb1386bc26e905 -[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-server-linux-arm64.tar.gz) | 28f8c32bf98ee1add7edf5d341c3bac1afc0085f90dcbbfb8b27a92087f13e2b53c327c8935ee29bf1dc3160655b32bbe3e29d5741a8124a3848a777e7d42933 -[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-server-linux-ppc64le.tar.gz) | 99ae8d44b0de3518c27fa8bbddd2ecf053dfb789fb9d65f8a4ecf4c8331cf63d2f09a41c2bcd5573247d5f66a1b2e51944379df1715017d920d521b98589508a -[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-server-linux-s390x.tar.gz) | f8c0e954a2dfc6845614488dadeed069cc7f3f08e33c351d7a77c6ef97867af590932e8576d12998a820a0e4d35d2eee797c764e2810f09ab1e90a5acaeaad33 - -### Node binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-node-linux-amd64.tar.gz) | c5456d50bfbe0d75fb150b3662ed7468a0abd3970792c447824f326894382c47bbd3a2cc5a290f691c8c09585ff6fe505ab86b4aff2b7e5ccee11b5e6354ae6c -[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-node-linux-arm.tar.gz) | 335b5cd8672e053302fd94d932fb2fa2e48eeeb1799650b3f93acdfa635e03a8453637569ab710c46885c8317759f4c60aaaf24dca9817d9fa47500fe4a3ca53 -[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-node-linux-arm64.tar.gz) | 3ee87dbeed8ace9351ac89bdaf7274dd10b4faec3ceba0825f690ec7a2bb7eb7c634274a1065a0939eec8ff3e43f72385f058f4ec141841550109e775bc5eff9 -[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-node-linux-ppc64le.tar.gz) | 6956f965b8d719b164214ec9195fdb2c776b907fe6d2c524082f00c27872a73475927fd7d2a994045ce78f6ad2aa5aeaf1eb5514df1810d2cfe342fd4e5ce4a1 -[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-node-linux-s390x.tar.gz) | 3b643aa905c709c57083c28dd9e8ffd88cb64466cda1499da7fc54176b775003e08b9c7a07b0964064df67c8142f6f1e6c13bfc261bd65fb064049920bfa57d0 -[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.2/kubernetes-node-windows-amd64.tar.gz) | b2e6d6fb0091f2541f9925018c2bdbb0138a95bab06b4c6b38abf4b7144b2575422263b78fb3c6fd09e76d90a25a8d35a6d4720dc169794d42c95aa22ecc6d5f - -## Changelog since v1.21.0-alpha.1 - -## Urgent Upgrade Notes - -### (No, really, you MUST read this before you upgrade) - - - Remove storage metrics `storage_operation_errors_total`, since we already have `storage_operation_status_count`.And add new field `status` for `storage_operation_duration_seconds`, so that we can know about all status storage operation latency. ([#98332](https://github.com/kubernetes/kubernetes/pull/98332), [@JornShen](https://github.com/JornShen)) [SIG Instrumentation and Storage] - -## Changes by Kind - -### Deprecation - -- Remove the TokenRequest and TokenRequestProjection feature gates ([#97148](https://github.com/kubernetes/kubernetes/pull/97148), [@wawa0210](https://github.com/wawa0210)) [SIG Node] -- Removing experimental windows container hyper-v support with Docker ([#97141](https://github.com/kubernetes/kubernetes/pull/97141), [@wawa0210](https://github.com/wawa0210)) [SIG Node and Windows] -- The `export` query parameter (inconsistently supported by API resources and deprecated in v1.14) is fully removed. Requests setting this query parameter will now receive a 400 status response. ([#98312](https://github.com/kubernetes/kubernetes/pull/98312), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, Auth and Testing] - -### API Change - -- Enable SPDY pings to keep connections alive, so that `kubectl exec` and `kubectl port-forward` won't be interrupted. ([#97083](https://github.com/kubernetes/kubernetes/pull/97083), [@knight42](https://github.com/knight42)) [SIG API Machinery and CLI] - -### Documentation - -- Official support to build kubernetes with docker-machine / remote docker is removed. This change does not affect building kubernetes with docker locally. ([#97935](https://github.com/kubernetes/kubernetes/pull/97935), [@adeniyistephen](https://github.com/adeniyistephen)) [SIG Release and Testing] -- Set kubelet option `--volume-stats-agg-period` to negative value to disable volume calculations. ([#96675](https://github.com/kubernetes/kubernetes/pull/96675), [@pacoxu](https://github.com/pacoxu)) [SIG Node] - -### Bug or Regression - -- Clean ReplicaSet by revision instead of creation timestamp in deployment controller ([#97407](https://github.com/kubernetes/kubernetes/pull/97407), [@waynepeking348](https://github.com/waynepeking348)) [SIG Apps] -- Ensure that client-go's EventBroadcaster is safe (non-racy) during shutdown. ([#95664](https://github.com/kubernetes/kubernetes/pull/95664), [@DirectXMan12](https://github.com/DirectXMan12)) [SIG API Machinery] -- Fix azure file migration issue ([#97877](https://github.com/kubernetes/kubernetes/pull/97877), [@andyzhangx](https://github.com/andyzhangx)) [SIG Auth, Cloud Provider and Storage] -- Fix kubelet from panic after getting the wrong signal ([#98200](https://github.com/kubernetes/kubernetes/pull/98200), [@wzshiming](https://github.com/wzshiming)) [SIG Node] -- Fix repeatedly acquire the inhibit lock ([#98088](https://github.com/kubernetes/kubernetes/pull/98088), [@wzshiming](https://github.com/wzshiming)) [SIG Node] -- Fixed a bug that the kubelet cannot start on BtrfS. ([#98042](https://github.com/kubernetes/kubernetes/pull/98042), [@gjkim42](https://github.com/gjkim42)) [SIG Node] -- Fixed an issue with garbage collection failing to clean up namespaced children of an object also referenced incorrectly by cluster-scoped children ([#98068](https://github.com/kubernetes/kubernetes/pull/98068), [@liggitt](https://github.com/liggitt)) [SIG API Machinery and Apps] -- Fixed no effect namespace when exposing deployment with --dry-run=client. ([#97492](https://github.com/kubernetes/kubernetes/pull/97492), [@masap](https://github.com/masap)) [SIG CLI] -- Fixing a bug where a failed node may not have the NoExecute taint set correctly ([#96876](https://github.com/kubernetes/kubernetes/pull/96876), [@howieyuen](https://github.com/howieyuen)) [SIG Apps and Node] -- Indentation of `Resource Quota` block in kubectl describe namespaces output gets correct. ([#97946](https://github.com/kubernetes/kubernetes/pull/97946), [@dty1er](https://github.com/dty1er)) [SIG CLI] -- KUBECTL_EXTERNAL_DIFF now accepts equal sign for additional parameters. ([#98158](https://github.com/kubernetes/kubernetes/pull/98158), [@dougsland](https://github.com/dougsland)) [SIG CLI] -- Kubeadm: fix a bug where "kubeadm join" would not properly handle missing names for existing etcd members. ([#97372](https://github.com/kubernetes/kubernetes/pull/97372), [@ihgann](https://github.com/ihgann)) [SIG Cluster Lifecycle] -- Kubelet should ignore cgroup driver check on Windows node. ([#97764](https://github.com/kubernetes/kubernetes/pull/97764), [@pacoxu](https://github.com/pacoxu)) [SIG Node and Windows] -- Make podTopologyHints protected by lock ([#95111](https://github.com/kubernetes/kubernetes/pull/95111), [@choury](https://github.com/choury)) [SIG Node] -- Readjust kubelet_containers_per_pod_count bucket ([#98169](https://github.com/kubernetes/kubernetes/pull/98169), [@wawa0210](https://github.com/wawa0210)) [SIG Instrumentation and Node] -- Scores from InterPodAffinity have stronger differentiation. ([#98096](https://github.com/kubernetes/kubernetes/pull/98096), [@leileiwan](https://github.com/leileiwan)) [SIG Scheduling] -- Specifying the KUBE_TEST_REPO environment variable when e2e tests are executed will instruct the test infrastructure to load that image from a location within the specified repo, using a predefined pattern. ([#93510](https://github.com/kubernetes/kubernetes/pull/93510), [@smarterclayton](https://github.com/smarterclayton)) [SIG Testing] -- Static pods will be deleted gracefully. ([#98103](https://github.com/kubernetes/kubernetes/pull/98103), [@gjkim42](https://github.com/gjkim42)) [SIG Node] -- Use network.Interface.VirtualMachine.ID to get the binded VM - Skip standalone VM when reconciling LoadBalancer ([#97635](https://github.com/kubernetes/kubernetes/pull/97635), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider] - -### Other (Cleanup or Flake) - -- Kubeadm: change the default image repository for CI images from 'gcr.io/kubernetes-ci-images' to 'gcr.io/k8s-staging-ci-images' ([#97087](https://github.com/kubernetes/kubernetes/pull/97087), [@SataQiu](https://github.com/SataQiu)) [SIG Cluster Lifecycle] -- Migrate generic_scheduler.go and types.go to structured logging. ([#98134](https://github.com/kubernetes/kubernetes/pull/98134), [@tanjing2020](https://github.com/tanjing2020)) [SIG Scheduling] -- Migrate proxy/winuserspace/proxier.go logs to structured logging ([#97941](https://github.com/kubernetes/kubernetes/pull/97941), [@JornShen](https://github.com/JornShen)) [SIG Network] -- Migrate staging/src/k8s.io/apiserver/pkg/audit/policy/reader.go logs to structured logging. ([#98252](https://github.com/kubernetes/kubernetes/pull/98252), [@lala123912](https://github.com/lala123912)) [SIG API Machinery and Auth] -- Migrate staging\src\k8s.io\apiserver\pkg\endpoints logs to structured logging ([#98093](https://github.com/kubernetes/kubernetes/pull/98093), [@lala123912](https://github.com/lala123912)) [SIG API Machinery] -- Node ([#96552](https://github.com/kubernetes/kubernetes/pull/96552), [@pandaamanda](https://github.com/pandaamanda)) [SIG Apps, Cloud Provider, Node and Scheduling] -- The kubectl alpha debug command was scheduled to be removed in v1.21. ([#98111](https://github.com/kubernetes/kubernetes/pull/98111), [@pandaamanda](https://github.com/pandaamanda)) [SIG CLI] -- Update cri-tools to [v1.20.0](https://github.com/kubernetes-sigs/cri-tools/releases/tag/v1.20.0) ([#97967](https://github.com/kubernetes/kubernetes/pull/97967), [@rajibmitra](https://github.com/rajibmitra)) [SIG Cloud Provider] -- Windows nodes on GCE will take longer to start due to dependencies installed at node creation time. ([#98284](https://github.com/kubernetes/kubernetes/pull/98284), [@pjh](https://github.com/pjh)) [SIG Cloud Provider] - -## Dependencies - -### Added -_Nothing has changed._ - -### Changed -- github.com/google/cadvisor: [v0.38.6 → v0.38.7](https://github.com/google/cadvisor/compare/v0.38.6...v0.38.7) -- k8s.io/gengo: 83324d8 → b6c5ce2 - -### Removed -_Nothing has changed._ - - - -# v1.21.0-alpha.1 - - -## Downloads for v1.21.0-alpha.1 - -### Source Code - -filename | sha512 hash --------- | ----------- -[kubernetes.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes.tar.gz) | b2bacd5c3fc9f829e6269b7d2006b0c6e464ff848bb0a2a8f2fe52ad2d7c4438f099bd8be847d8d49ac6e4087f4d74d5c3a967acd798e0b0cb4d7a2bdb122997 -[kubernetes-src.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-src.tar.gz) | 518ac5acbcf23902fb1b902b69dbf3e86deca5d8a9b5f57488a15f185176d5a109558f3e4df062366af874eca1bcd61751ee8098b0beb9bcdc025d9a1c9be693 - -### Client binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-client-darwin-amd64.tar.gz) | eaa7aea84a5ed954df5ec710cbeb6ec88b46465f43cb3d09aabe2f714b84a050a50bf5736089f09dbf1090f2e19b44823d656c917e3c8c877630756c3026f2b6 -[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-client-linux-386.tar.gz) | 47f74b8d46ad1779c5b0b5f15aa15d5513a504eeb6f53db4201fbe9ff8956cb986b7c1b0e9d50a99f78e9e2a7f304f3fc1cc2fa239296d9a0dd408eb6069e975 -[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-client-linux-amd64.tar.gz) | 1a148e282628b008c8abd03dd12ec177ced17584b5115d92cd33dd251e607097d42e9da8c7089bd947134b900f85eb75a4740b6a5dd580c105455b843559df39 -[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-client-linux-arm.tar.gz) | d13d2feb73bd032dc01f7e2955b98d8215a39fe1107d037a73fa1f7d06c3b93ebaa53ed4952d845c64454ef3cca533edb97132d234d50b6fb3bcbd8a8ad990eb -[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-client-linux-arm64.tar.gz) | 8252105a17b09a78e9ad2c024e4e401a69764ac869708a071aaa06f81714c17b9e7c5b2eb8efde33f24d0b59f75c5da607d5e1e72bdf12adfbb8c829205cd1c1 -[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-client-linux-ppc64le.tar.gz) | 297a9082df4988389dc4be30eb636dff49f36f5d87047bab44745884e610f46a17ae3a08401e2cab155b7c439f38057bfd8288418215f7dd3bf6a49dbe61ea0e -[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-client-linux-s390x.tar.gz) | 04c06490dd17cd5dccfd92bafa14acf64280ceaea370d9635f23aeb6984d1beae6d0d1d1506edc6f30f927deeb149b989d3e482b47fbe74008b371f629656e79 -[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-client-windows-386.tar.gz) | ec6e9e87a7d685f8751d7e58f24f417753cff5554a7229218cb3a08195d461b2e12409344950228e9fbbc92a8a06d35dd86242da6ff1e6652ec1fae0365a88c1 -[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-client-windows-amd64.tar.gz) | 51039e6221d3126b5d15e797002ae01d4f0b10789c5d2056532f27ef13f35c5a2e51be27764fda68e8303219963126559023aed9421313bec275c0827fbcaf8a - -### Server binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-server-linux-amd64.tar.gz) | 4edf820930c88716263560275e3bd7fadb8dc3700b9f8e1d266562e356e0abeb1a913f536377dab91218e3940b447d6bf1da343b85da25c2256dc4dcde5798dd -[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-server-linux-arm.tar.gz) | b15213e53a8ab4ba512ce6ef9ad42dd197d419c61615cd23de344227fd846c90448d8f3d98e555b63ba5b565afa627cca6b7e3990ebbbba359c96f2391302df1 -[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-server-linux-arm64.tar.gz) | 5be29cca9a9358fc68351ee63e99d57dc2ffce6e42fc3345753dbbf7542ff2d770c4852424158540435fa6e097ce3afa9b13affc40c8b3b69fe8406798f8068f -[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-server-linux-ppc64le.tar.gz) | 89fd99ab9ce85db0b94b86709932105efc883cc93959cf7ea9a39e79a4acea23064d7010eeb577450cccabe521c04b7ba47bbec212ed37edeed7cb04bad34518 -[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-server-linux-s390x.tar.gz) | 2fbc30862c77d247aa8d96ab9d1a144599505287b0033a3a2d0988958e7bb2f2e8b67f52c1fec74b4ec47d74ba22cd0f6cb5c4228acbaa72b1678d5fece0254d - -### Node binaries - -filename | sha512 hash --------- | ----------- -[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-node-linux-amd64.tar.gz) | 95658d321a0a371c0900b401d1469d96915310afbc4e4b9b11f031438bb188513b57d5a60b5316c3b0c18f541cda6f0ac42f59a76495f8abc743a067115da23a -[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-node-linux-arm.tar.gz) | f375acfb42aad6c65b833c270e7e3acfe9cd1d6b2441c33874e77faae263957f7acfe86f1b71f14298118595e4cc6952c7dea0c832f7f2e72428336f13034362 -[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-node-linux-arm64.tar.gz) | 43b4baccd58d74e7f48d096ab92f2bbbcdf47e30e7a3d2b56c6cc9f90002cfd4fefaac894f69bd5f9f4dbdb09a4749a77eb76b1b97d91746bd96fe94457879ab -[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-node-linux-ppc64le.tar.gz) | e7962b522c6c7c14b9ee4c1d254d8bdd9846b2b33b0443fc9c4a41be6c40e5e6981798b720f0148f36263d5cc45d5a2bb1dd2f9ab2838e3d002e45b9bddeb7bf -[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-node-linux-s390x.tar.gz) | 49ebc97f01829e65f7de15be00b882513c44782eaadd1b1825a227e3bd3c73cc6aca8345af05b303d8c43aa2cb944a069755b2709effb8cc22eae621d25d4ba5 -[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.21.0-alpha.1/kubernetes-node-windows-amd64.tar.gz) | 6e0fd7724b09e6befbcb53b33574e97f2db089f2eee4bbf391abb7f043103a5e6e32e3014c0531b88f9a3ca88887bbc68625752c44326f98dd53adb3a6d1bed8 - -## Changelog since v1.20.0 - -## Urgent Upgrade Notes - -### (No, really, you MUST read this before you upgrade) - - - Kube-proxy's IPVS proxy mode no longer sets the net.ipv4.conf.all.route_localnet sysctl parameter. Nodes upgrading will have net.ipv4.conf.all.route_localnet set to 1 but new nodes will inherit the system default (usually 0). If you relied on any behavior requiring net.ipv4.conf.all.route_localnet, you must set ensure it is enabled as kube-proxy will no longer set it automatically. This change helps to further mitigate CVE-2020-8558. ([#92938](https://github.com/kubernetes/kubernetes/pull/92938), [@lbernail](https://github.com/lbernail)) [SIG Network and Release] - -## Changes by Kind - -### Deprecation - -- Deprecate the `topologyKeys` field in Service. This capability will be replaced with upcoming work around Topology Aware Subsetting and Service Internal Traffic Policy. ([#96736](https://github.com/kubernetes/kubernetes/pull/96736), [@andrewsykim](https://github.com/andrewsykim)) [SIG Apps] -- Kubeadm: deprecated command "alpha selfhosting pivot" is removed now. ([#97627](https://github.com/kubernetes/kubernetes/pull/97627), [@knight42](https://github.com/knight42)) [SIG Cluster Lifecycle] -- Kubeadm: graduate the command `kubeadm alpha kubeconfig user` to `kubeadm kubeconfig user`. The `kubeadm alpha kubeconfig user` command is deprecated now. ([#97583](https://github.com/kubernetes/kubernetes/pull/97583), [@knight42](https://github.com/knight42)) [SIG Cluster Lifecycle] -- Kubeadm: the "kubeadm alpha certs" command is removed now, please use "kubeadm certs" instead. ([#97706](https://github.com/kubernetes/kubernetes/pull/97706), [@knight42](https://github.com/knight42)) [SIG Cluster Lifecycle] -- Remove the deprecated metrics "scheduling_algorithm_preemption_evaluation_seconds" and "binding_duration_seconds", suggest to use "scheduler_framework_extension_point_duration_seconds" instead. ([#96447](https://github.com/kubernetes/kubernetes/pull/96447), [@chendave](https://github.com/chendave)) [SIG Cluster Lifecycle, Instrumentation, Scheduling and Testing] -- The PodSecurityPolicy API is deprecated in 1.21, and will no longer be served starting in 1.25. ([#97171](https://github.com/kubernetes/kubernetes/pull/97171), [@deads2k](https://github.com/deads2k)) [SIG Auth and CLI] - -### API Change - -- Change the APIVersion proto name of BoundObjectRef from aPIVersion to apiVersion. ([#97379](https://github.com/kubernetes/kubernetes/pull/97379), [@kebe7jun](https://github.com/kebe7jun)) [SIG Auth] -- Promote Immutable Secrets/ConfigMaps feature to Stable. - This allows to set `Immutable` field in Secrets or ConfigMap object to mark their contents as immutable. ([#97615](https://github.com/kubernetes/kubernetes/pull/97615), [@wojtek-t](https://github.com/wojtek-t)) [SIG Apps, Architecture, Node and Testing] - -### Feature - -- Add flag --lease-max-object-size and metric etcd_lease_object_counts for kube-apiserver to config and observe max objects attached to a single etcd lease. ([#97480](https://github.com/kubernetes/kubernetes/pull/97480), [@lingsamuel](https://github.com/lingsamuel)) [SIG API Machinery, Instrumentation and Scalability] -- Add flag --lease-reuse-duration-seconds for kube-apiserver to config etcd lease reuse duration. ([#97009](https://github.com/kubernetes/kubernetes/pull/97009), [@lingsamuel](https://github.com/lingsamuel)) [SIG API Machinery and Scalability] -- Adds the ability to pass --strict-transport-security-directives to the kube-apiserver to set the HSTS header appropriately. Be sure you understand the consequences to browsers before setting this field. ([#96502](https://github.com/kubernetes/kubernetes/pull/96502), [@249043822](https://github.com/249043822)) [SIG Auth] -- Kubeadm now includes CoreDNS v1.8.0. ([#96429](https://github.com/kubernetes/kubernetes/pull/96429), [@rajansandeep](https://github.com/rajansandeep)) [SIG Cluster Lifecycle] -- Kubeadm: add support for certificate chain validation. When using kubeadm in external CA mode, this allows an intermediate CA to be used to sign the certificates. The intermediate CA certificate must be appended to each signed certificate for this to work correctly. ([#97266](https://github.com/kubernetes/kubernetes/pull/97266), [@robbiemcmichael](https://github.com/robbiemcmichael)) [SIG Cluster Lifecycle] -- Kubeadm: amend the node kernel validation to treat CGROUP_PIDS, FAIR_GROUP_SCHED as required and CFS_BANDWIDTH, CGROUP_HUGETLB as optional ([#96378](https://github.com/kubernetes/kubernetes/pull/96378), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle and Node] -- The Kubernetes pause image manifest list now contains an image for Windows Server 20H2. ([#97322](https://github.com/kubernetes/kubernetes/pull/97322), [@claudiubelu](https://github.com/claudiubelu)) [SIG Windows] -- The apimachinery util/net function used to detect the bind address `ResolveBindAddress()` - takes into consideration global ip addresses on loopback interfaces when: - - the host has default routes - - there are no global IPs on those interfaces. - in order to support more complex network scenarios like BGP Unnumbered RFC 5549 ([#95790](https://github.com/kubernetes/kubernetes/pull/95790), [@aojea](https://github.com/aojea)) [SIG Network] - -### Bug or Regression - -- ## Changelog - - ### General - - Fix priority expander falling back to a random choice even though there is a higher priority option to choose - - Clone `kubernetes/kubernetes` in `update-vendor.sh` shallowly, instead of fetching all revisions - - Speed up binpacking by reducing the number of PreFilter calls (call once per pod instead of #pods*#nodes times) - - Speed up finding unneeded nodes by 5x+ in very large clusters by reducing the number of PreFilter calls - - Expose `--max-nodes-total` as a metric - - Errors in `IncreaseSize` changed from type `apiError` to `cloudProviderError` - - Make `build-in-docker` and `test-in-docker` work on Linux systems with SELinux enabled - - Fix an error where existing nodes were not considered as destinations while finding place for pods in scale-down simulations - - Remove redundant log lines and reduce severity around parsing kubeEnv - - Don't treat nodes created by virtual kubelet as nodes from non-autoscaled node groups - - Remove redundant logging around calculating node utilization - - Add configurable `--network` and `--rm` flags for docker in `Makefile` - - Subtract DaemonSet pods' requests from node allocatable in the denominator while computing node utilization - - Include taints by condition when determining if a node is unready/still starting - - Fix `update-vendor.sh` to work on OSX and zsh - - Add best-effort eviction for DaemonSet pods while scaling down non-empty nodes - - Add build support for ARM64 - - ### AliCloud - - Add missing daemonsets and replicasets to ALI example cluster role - - ### Apache CloudStack - - Add support for Apache CloudStack - - ### AWS - - Regenerate list of EC2 instances - - Fix pricing endpoint in AWS China Region - - ### Azure - - Add optional jitter on initial VMSS VM cache refresh, keep the refreshes spread over time - - Serve from cache for the whole period of ongoing throttling - - Fix unwanted VMSS VMs cache invalidations - - Enforce setting the number of retries if cloud provider backoff is enabled - - Don't update capacity if VMSS provisioning state is updating - - Support allocatable resources overrides via VMSS tags - - Add missing stable labels in template nodes - - Proactively set instance status to deleting on node deletions - - ### Cluster API - - Migrate interaction with the API from using internal types to using Unstructured - - Improve tests to work better with constrained resources - - Add support for node autodiscovery - - Add support for `--cloud-config` - - Update group identifier to use for Cluster API annotations - - ### Exoscale - - Add support for Exoscale - - ### GCE - - Decrease the number of GCE Read Requests made while deleting nodes - - Base pricing of custom instances on their instance family type - - Add pricing information for missing machine types - - Add pricing information for different GPU types - - Ignore the new `topology.gke.io/zone` label when comparing groups - - Add missing stable labels to template nodes - - ### HuaweiCloud - - Add auto scaling group support - - Implement node group by AS - - Implement getting desired instance number of node group - - Implement increasing node group size - - Implement TemplateNodeInfo - - Implement caching instances - - ### IONOS - - Add support for IONOS - - ### Kubemark - - Skip non-kubemark nodes while computing node infos for node groups. - - ### Magnum - - Add Magnum support in the Cluster Autoscaler helm chart - - ### Packet - - Allow empty nodepools - - Add support for multiple nodepools - - Add pricing support - - ## Image - Image: `k8s.gcr.io/autoscaling/cluster-autoscaler:v1.20.0` ([#97011](https://github.com/kubernetes/kubernetes/pull/97011), [@towca](https://github.com/towca)) [SIG Cloud Provider] -- AcceleratorStats will be available in the Summary API of kubelet when cri_stats_provider is used. ([#96873](https://github.com/kubernetes/kubernetes/pull/96873), [@ruiwen-zhao](https://github.com/ruiwen-zhao)) [SIG Node] -- Add limited lines to log when having tail option ([#93920](https://github.com/kubernetes/kubernetes/pull/93920), [@zhouya0](https://github.com/zhouya0)) [SIG Node] -- Avoid systemd-logind loading configuration warning ([#97950](https://github.com/kubernetes/kubernetes/pull/97950), [@wzshiming](https://github.com/wzshiming)) [SIG Node] -- Cloud-controller-manager: routes controller should not depend on --allocate-node-cidrs ([#97029](https://github.com/kubernetes/kubernetes/pull/97029), [@andrewsykim](https://github.com/andrewsykim)) [SIG Cloud Provider and Testing] -- Copy annotations with empty value when deployment rolls back ([#94858](https://github.com/kubernetes/kubernetes/pull/94858), [@waynepeking348](https://github.com/waynepeking348)) [SIG Apps] -- Detach volumes from vSphere nodes not tracked by attach-detach controller ([#96689](https://github.com/kubernetes/kubernetes/pull/96689), [@gnufied](https://github.com/gnufied)) [SIG Cloud Provider and Storage] -- Fix kubectl label error when local=true is set. ([#97440](https://github.com/kubernetes/kubernetes/pull/97440), [@pandaamanda](https://github.com/pandaamanda)) [SIG CLI] -- Fix Azure file share not deleted issue when the namespace is deleted ([#97417](https://github.com/kubernetes/kubernetes/pull/97417), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage] -- Fix CVE-2020-8555 for Gluster client connections. ([#97922](https://github.com/kubernetes/kubernetes/pull/97922), [@liggitt](https://github.com/liggitt)) [SIG Storage] -- Fix counting error in service/nodeport/loadbalancer quota check ([#97451](https://github.com/kubernetes/kubernetes/pull/97451), [@pacoxu](https://github.com/pacoxu)) [SIG API Machinery, Network and Testing] -- Fix kubectl-convert import known versions ([#97754](https://github.com/kubernetes/kubernetes/pull/97754), [@wzshiming](https://github.com/wzshiming)) [SIG CLI and Testing] -- Fix missing cadvisor machine metrics. ([#97006](https://github.com/kubernetes/kubernetes/pull/97006), [@lingsamuel](https://github.com/lingsamuel)) [SIG Node] -- Fix nil VMSS name when setting service to auto mode ([#97366](https://github.com/kubernetes/kubernetes/pull/97366), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider] -- Fix the panic when kubelet registers if a node object already exists with no Status.Capacity or Status.Allocatable ([#95269](https://github.com/kubernetes/kubernetes/pull/95269), [@SataQiu](https://github.com/SataQiu)) [SIG Node] -- Fix the regression with the slow pods termination. Before this fix pods may take an additional time to terminate - up to one minute. Reversing the change that ensured that CNI resources cleaned up when the pod is removed on API server. ([#97980](https://github.com/kubernetes/kubernetes/pull/97980), [@SergeyKanzhelev](https://github.com/SergeyKanzhelev)) [SIG Node] -- Fix to recover CSI volumes from certain dangling attachments ([#96617](https://github.com/kubernetes/kubernetes/pull/96617), [@yuga711](https://github.com/yuga711)) [SIG Apps and Storage] -- Fix: azure file latency issue for metadata-heavy workloads ([#97082](https://github.com/kubernetes/kubernetes/pull/97082), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage] -- Fixed Cinder volume IDs on OpenStack Train ([#96673](https://github.com/kubernetes/kubernetes/pull/96673), [@jsafrane](https://github.com/jsafrane)) [SIG Cloud Provider] -- Fixed FibreChannel volume plugin corrupting filesystems on detach of multipath volumes. ([#97013](https://github.com/kubernetes/kubernetes/pull/97013), [@jsafrane](https://github.com/jsafrane)) [SIG Storage] -- Fixed a bug in kubelet that will saturate CPU utilization after containerd got restarted. ([#97174](https://github.com/kubernetes/kubernetes/pull/97174), [@hanlins](https://github.com/hanlins)) [SIG Node] -- Fixed bug in CPUManager with race on container map access ([#97427](https://github.com/kubernetes/kubernetes/pull/97427), [@klueska](https://github.com/klueska)) [SIG Node] -- Fixed cleanup of block devices when /var/lib/kubelet is a symlink. ([#96889](https://github.com/kubernetes/kubernetes/pull/96889), [@jsafrane](https://github.com/jsafrane)) [SIG Storage] -- GCE Internal LoadBalancer sync loop will now release the ILB IP address upon sync failure. An error in ILB forwarding rule creation will no longer leak IP addresses. ([#97740](https://github.com/kubernetes/kubernetes/pull/97740), [@prameshj](https://github.com/prameshj)) [SIG Cloud Provider and Network] -- Ignore update pod with no new images in alwaysPullImages admission controller ([#96668](https://github.com/kubernetes/kubernetes/pull/96668), [@pacoxu](https://github.com/pacoxu)) [SIG Apps, Auth and Node] -- Kubeadm now installs version 3.4.13 of etcd when creating a cluster with v1.19 ([#97244](https://github.com/kubernetes/kubernetes/pull/97244), [@pacoxu](https://github.com/pacoxu)) [SIG Cluster Lifecycle] -- Kubeadm: avoid detection of the container runtime for commands that do not need it ([#97625](https://github.com/kubernetes/kubernetes/pull/97625), [@pacoxu](https://github.com/pacoxu)) [SIG Cluster Lifecycle] -- Kubeadm: fix a bug in the host memory detection code on 32bit Linux platforms ([#97403](https://github.com/kubernetes/kubernetes/pull/97403), [@abelbarrera15](https://github.com/abelbarrera15)) [SIG Cluster Lifecycle] -- Kubeadm: fix a bug where "kubeadm upgrade" commands can fail if CoreDNS v1.8.0 is installed. ([#97919](https://github.com/kubernetes/kubernetes/pull/97919), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle] -- Performance regression [#97685](https://github.com/kubernetes/kubernetes/issues/97685) has been fixed. ([#97860](https://github.com/kubernetes/kubernetes/pull/97860), [@MikeSpreitzer](https://github.com/MikeSpreitzer)) [SIG API Machinery] -- Remove deprecated --cleanup-ipvs flag of kube-proxy, and make --cleanup flag always to flush IPVS ([#97336](https://github.com/kubernetes/kubernetes/pull/97336), [@maaoBit](https://github.com/maaoBit)) [SIG Network] -- The current version of the container image publicly exposed IP serving a /metrics endpoint to the Internet. The new version of the container image serves /metrics endpoint on a different port. ([#97621](https://github.com/kubernetes/kubernetes/pull/97621), [@vbannai](https://github.com/vbannai)) [SIG Cloud Provider] -- Use force unmount for NFS volumes if regular mount fails after 1 minute timeout ([#96844](https://github.com/kubernetes/kubernetes/pull/96844), [@gnufied](https://github.com/gnufied)) [SIG Storage] -- Users will see increase in time for deletion of pods and also guarantee that removal of pod from api server would mean deletion of all the resources from container runtime. ([#92817](https://github.com/kubernetes/kubernetes/pull/92817), [@kmala](https://github.com/kmala)) [SIG Node] -- Using exec auth plugins with kubectl no longer results in warnings about constructing many client instances from the same exec auth config. ([#97857](https://github.com/kubernetes/kubernetes/pull/97857), [@liggitt](https://github.com/liggitt)) [SIG API Machinery and Auth] -- Warning about using a deprecated volume plugin is logged only once. ([#96751](https://github.com/kubernetes/kubernetes/pull/96751), [@jsafrane](https://github.com/jsafrane)) [SIG Storage] - -### Other (Cleanup or Flake) - -- Bump github.com/Azure/go-autorest/autorest to v0.11.12 ([#97033](https://github.com/kubernetes/kubernetes/pull/97033), [@patrickshan](https://github.com/patrickshan)) [SIG API Machinery, CLI, Cloud Provider and Cluster Lifecycle] -- Delete deprecated mixed protocol annotation ([#97096](https://github.com/kubernetes/kubernetes/pull/97096), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider] -- Kube-proxy: Traffic from the cluster directed to ExternalIPs is always sent directly to the Service. ([#96296](https://github.com/kubernetes/kubernetes/pull/96296), [@aojea](https://github.com/aojea)) [SIG Network and Testing] -- Kubeadm: fix a whitespace issue in the output of the "kubeadm join" command shown as the output of "kubeadm init" and "kubeadm token create --print-join-command" ([#97413](https://github.com/kubernetes/kubernetes/pull/97413), [@SataQiu](https://github.com/SataQiu)) [SIG Cluster Lifecycle] -- Kubeadm: improve the error messaging when the user provides an invalid discovery token CA certificate hash. ([#97290](https://github.com/kubernetes/kubernetes/pull/97290), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle] -- Migrate log messages in pkg/scheduler/{scheduler.go,factory.go} to structured logging ([#97509](https://github.com/kubernetes/kubernetes/pull/97509), [@aldudko](https://github.com/aldudko)) [SIG Scheduling] -- Migrate proxy/iptables/proxier.go logs to structured logging ([#97678](https://github.com/kubernetes/kubernetes/pull/97678), [@JornShen](https://github.com/JornShen)) [SIG Network] -- Migrate some scheduler log messages to structured logging ([#97349](https://github.com/kubernetes/kubernetes/pull/97349), [@aldudko](https://github.com/aldudko)) [SIG Scheduling] -- NONE ([#97167](https://github.com/kubernetes/kubernetes/pull/97167), [@geegeea](https://github.com/geegeea)) [SIG Node] -- NetworkPolicy validation framework optimizations for rapidly verifying CNI's work correctly across several pods and namespaces ([#91592](https://github.com/kubernetes/kubernetes/pull/91592), [@jayunit100](https://github.com/jayunit100)) [SIG Network, Storage and Testing] -- Official support to build kubernetes with docker-machine / remote docker is removed. This change does not affect building kubernetes with docker locally. ([#97618](https://github.com/kubernetes/kubernetes/pull/97618), [@jherrera123](https://github.com/jherrera123)) [SIG Release and Testing] -- Scheduler plugin validation now provides all errors detected instead of the first one. ([#96745](https://github.com/kubernetes/kubernetes/pull/96745), [@lingsamuel](https://github.com/lingsamuel)) [SIG Node, Scheduling and Testing] -- Storage related e2e testsuite redesign & cleanup ([#96573](https://github.com/kubernetes/kubernetes/pull/96573), [@Jiawei0227](https://github.com/Jiawei0227)) [SIG Storage and Testing] -- The OIDC authenticator no longer waits 10 seconds before attempting to fetch the metadata required to verify tokens. ([#97693](https://github.com/kubernetes/kubernetes/pull/97693), [@enj](https://github.com/enj)) [SIG API Machinery and Auth] -- The `AttachVolumeLimit` feature gate that is GA since v1.17 is now removed. ([#96539](https://github.com/kubernetes/kubernetes/pull/96539), [@ialidzhikov](https://github.com/ialidzhikov)) [SIG Storage] -- The `CSINodeInfo` feature gate that is GA since v1.17 is unconditionally enabled, and can no longer be specified via the `--feature-gates` argument. ([#96561](https://github.com/kubernetes/kubernetes/pull/96561), [@ialidzhikov](https://github.com/ialidzhikov)) [SIG Apps, Auth, Scheduling, Storage and Testing] -- The deprecated feature gates `RotateKubeletClientCertificate`, `AttachVolumeLimit`, `VolumePVCDataSource` and `EvenPodsSpread` are now unconditionally enabled and can no longer be specified in component invocations. ([#97306](https://github.com/kubernetes/kubernetes/pull/97306), [@gavinfish](https://github.com/gavinfish)) [SIG Node, Scheduling and Storage] -- `ServiceNodeExclusion`, `NodeDisruptionExclusion` and `LegacyNodeRoleBehavior`(locked to false) features have been promoted to GA. - To prevent control plane nodes being added to load balancers automatically, upgrade users need to add "node.kubernetes.io/exclude-from-external-load-balancers" label to control plane nodes. ([#97543](https://github.com/kubernetes/kubernetes/pull/97543), [@pacoxu](https://github.com/pacoxu)) [SIG API Machinery, Apps, Cloud Provider and Network] - -### Uncategorized - -- Adding Brazilian Portuguese translation for kubectl ([#61595](https://github.com/kubernetes/kubernetes/pull/61595), [@cpanato](https://github.com/cpanato)) [SIG CLI] - -## Dependencies - -### Added -_Nothing has changed._ - -### Changed -- github.com/Azure/go-autorest/autorest: [v0.11.1 → v0.11.12](https://github.com/Azure/go-autorest/autorest/compare/v0.11.1...v0.11.12) -- github.com/coredns/corefile-migration: [v1.0.10 → v1.0.11](https://github.com/coredns/corefile-migration/compare/v1.0.10...v1.0.11) -- github.com/golang/mock: [v1.4.1 → v1.4.4](https://github.com/golang/mock/compare/v1.4.1...v1.4.4) -- github.com/google/cadvisor: [v0.38.5 → v0.38.6](https://github.com/google/cadvisor/compare/v0.38.5...v0.38.6) -- github.com/heketi/heketi: [c2e2a4a → v10.2.0+incompatible](https://github.com/heketi/heketi/compare/c2e2a4a...v10.2.0) -- github.com/miekg/dns: [v1.1.4 → v1.1.35](https://github.com/miekg/dns/compare/v1.1.4...v1.1.35) -- k8s.io/system-validators: v1.2.0 → v1.3.0 - -### Removed -- rsc.io/quote/v3: v3.1.0 -- rsc.io/sampler: v1.3.0 diff --git a/content/ko/releases/_index.md b/content/ko/releases/_index.md new file mode 100644 index 0000000000..aa6a306f8a --- /dev/null +++ b/content/ko/releases/_index.md @@ -0,0 +1,27 @@ +--- +linktitle: 릴리스 히스토리 +title: 릴리스 +type: docs +--- + + +<!-- overview --> + +쿠버네티스 프로젝트는 가장 최신의 3개 마이너(minor) 릴리스({{< skew latestVersion >}}, {{< skew prevMinorVersion >}}, {{< skew oldestMinorVersion >}})에 대해서 릴리스 브랜치를 관리한다. 쿠버네티스 1.19 및 이후 신규 버전은 약 1년간 패치 지원을 받을 수 있다. 쿠버네티스 1.18 및 이전 버전은 약 9개월간의 패치 지원을 받을 수 있다. + +쿠버네티스 버전은 **x.y.z** 의 형태로 표현되는데, +**x** 는 메이저(major) 버전, **y** 는 마이너(minor), **z** 는 패치(patch) 버전을 의미하며, 이는 [시맨틱 버전](https://semver.org/)의 용어를 따른 것이다. + +저 자세한 정보는 [버전 차이(skew) 정책](/releases/version-skew-policy/) 문서에서 확인하길 바란다. + +<!-- body --> + +## 릴리스 히스토리 + +{{< release-data >}} + +## 차기 릴리스 + +차기 쿠버네티스 릴리스 **{{< skew nextMinorVersion >}}** 일정은 [스케줄](https://github.com/kubernetes/sig-release/tree/master/releases/release-{{< skew nextMinorVersion >}})에서 확인할 수 있다. + +## 유용한 자원 diff --git a/content/ko/releases/notes.md b/content/ko/releases/notes.md new file mode 100644 index 0000000000..b509ae0d65 --- /dev/null +++ b/content/ko/releases/notes.md @@ -0,0 +1,13 @@ +--- +linktitle: 릴리스 노트 +title: 노트 +type: docs +description: > + 쿠버네티스 릴리스 노트. +sitemap: + priority: 0.5 +--- + +릴리스 노트는 사용자의 쿠버네티스 버전에 해당하는 [변경로그(Changelog)](https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG)를 통해서 확인할 수 있다. {{< skew latestVersion >}} 의 변경로그는 [깃허브](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-{{< skew latestVersion >}}.md)에 있다. + +대안으로, 릴리스 노트는 [relnotes.k8s.io](https://relnotes.k8s.io)에서 온라인으로 검색 및 필터링이 가능하다. {{< skew latestVersion >}}로 필터링된 릴리스 노트는 [relnotes.k8s.io](https://relnotes.k8s.io/?releaseVersions={{< skew latestVersion >}}.0)에서 확인한다. diff --git a/content/ko/docs/setup/release/version-skew-policy.md b/content/ko/releases/version-skew-policy.md similarity index 97% rename from content/ko/docs/setup/release/version-skew-policy.md rename to content/ko/releases/version-skew-policy.md index 76ff7504fd..38052aa18d 100644 --- a/content/ko/docs/setup/release/version-skew-policy.md +++ b/content/ko/releases/version-skew-policy.md @@ -20,8 +20,8 @@ weight: 30 ## 지원되는 버전 -쿠버네티스 버전은 **x.y.z**로 표현되는데, -여기서 **x**는 메이저 버전, **y**는 마이너 버전, **z**는 [시맨틱 버전](https://semver.org/) 용어에 따른 패치 버전이다. +쿠버네티스 버전은 **x.y.z** 로 표현되는데, +여기서 **x** 는 메이저 버전, **y** 는 마이너 버전, **z** 는 패치 버전을 의미하며, 이는 [시맨틱 버전](https://semver.org/) 용어에 따른 것이다. 자세한 내용은 [쿠버네티스 릴리스 버전](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/release/versioning.md#kubernetes-release-versioning)을 참조한다. 쿠버네티스 프로젝트는 최근 세 개의 마이너 릴리스 ({{< skew latestVersion >}}, {{< skew prevMinorVersion >}}, {{< skew oldestMinorVersion >}}) 에 대한 릴리스 분기를 유지한다. 쿠버네티스 1.19 이상은 약 1년간의 패치 지원을 받는다. 쿠버네티스 1.18 이상은 약 9개월의 패치 지원을 받는다. From 11bc6b4efcc60c1ba61a8721549ece224aaf7ae4 Mon Sep 17 00:00:00 2001 From: luzg <hikube@163.com> Date: Fri, 28 May 2021 23:52:22 +0800 Subject: [PATCH 194/221] [zh] translate tasks/Enabling Topology Aware Hints --- .../enabling-topology-aware-hints.md | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 content/zh/docs/tasks/administer-cluster/enabling-topology-aware-hints.md diff --git a/content/zh/docs/tasks/administer-cluster/enabling-topology-aware-hints.md b/content/zh/docs/tasks/administer-cluster/enabling-topology-aware-hints.md new file mode 100644 index 0000000000..14b5bea3a5 --- /dev/null +++ b/content/zh/docs/tasks/administer-cluster/enabling-topology-aware-hints.md @@ -0,0 +1,72 @@ +--- +title: 启用拓扑感知提示 +content_type: task +min-kubernetes-server-version: 1.21 +--- +<!-- +--- +reviewers: +- robscott +title: Enabling Topology Aware Hints +content_type: task +min-kubernetes-server-version: 1.21 +--- +--> + +<!-- overview --> +{{< feature-state for_k8s_version="v1.21" state="alpha" >}} + +<!-- +_Topology Aware Hints_ enable topology aware routing with topology hints +included in {{< glossary_tooltip text="EndpointSlices" term_id="endpoint-slice" >}}. +This approach tries to keep traffic close to where it originated from; +you might do this to reduce costs, or to improve network performance. +--> +_拓扑感知提示_ 启用具有拓扑感知能力的路由,其中拓扑感知信息包含在 +{{< glossary_tooltip text="EndpointSlices" term_id="endpoint-slice" >}} 中。 +此功能尽量将流量限制在它的发起区域附近; +可以降低成本,或者提高网络性能。 + +## {{% heading "prerequisites" %}} + + {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + +<!-- +The following prerequisite is needed in order to enable topology aware hints: + +* Configure the {{< glossary_tooltip text="kube-proxy" term_id="kube-proxy" >}} to run in + iptables mode or IPVS mode +* Ensure that you have not disabled EndpointSlices +--> +为了启用拓扑感知提示,先要满足以下先决条件: + +* 配置 {{< glossary_tooltip text="kube-proxy" term_id="kube-proxy" >}} + 以 iptables 或 IPVS 模式运行 +* 确保未禁用 EndpointSlices + +<!-- +## Enable Topology Aware Hints +--> +## 启动拓扑感知提示 {#enable-topology-aware-hints} + +<!-- +To enable service topology hints, enable the `TopologyAwareHints` [feature +gate](/docs/reference/command-line-tools-reference/feature-gates/) for the +kube-apiserver, kube-controller-manager, and kube-proxy: +--> +要启用服务拓扑感知,请启用 kube-apiserver、kube-controller-manager、和 kube-proxy 的 +[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) +`TopologyAwareHints`。 + +``` +--feature-gates="TopologyAwareHints=true" +``` + +## {{% heading "whatsnext" %}} + +<!-- +* Read about [Topology Aware Hints](/docs/concepts/services-networking/topology-aware-hints) for Services +* Read [Connecting Applications with Services](/docs/concepts/services-networking/connect-applications-service/) +--> +* 参阅面向服务的[拓扑感知提示](/zh/docs/concepts/services-networking/topology-aware-hints) +* 参阅[用服务连通应用](/zh/docs/concepts/services-networking/connect-applications-service/) From 9c1a5245b0151172985dc8220c552a4645d9ff7a Mon Sep 17 00:00:00 2001 From: liuwei10 <liuwei10@inspur.com> Date: Mon, 31 May 2021 10:35:25 +0800 Subject: [PATCH 195/221] modify error of labels-annotations-taints.md --- .../manage-resources/memory-constraint-namespace.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace.md b/content/zh/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace.md index 0bb4c5d8d8..372ca6c854 100644 --- a/content/zh/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace.md +++ b/content/zh/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace.md @@ -339,7 +339,7 @@ For example: you want development workloads to be limited to 512 MB. You create separate namespaces for production and development, and you apply memory constraints to each namespace. --> -做为集群管理员,你可能想规定 Pod 可以使用的内存总量限制。例如: +作为集群管理员,你可能想规定 Pod 可以使用的内存总量限制。例如: * 集群的每个节点有 2 GB 内存。你不想接受任何请求超过 2 GB 的 Pod,因为集群中没有节点可以满足。 * 集群由生产部门和开发部门共享。你希望允许产品部门的负载最多耗用 8 GB 内存, From 590d07f92215ccfa52bac3fe944f6825a3d3558b Mon Sep 17 00:00:00 2001 From: Rui Chen <rui@chenrui.dev> Date: Sun, 30 May 2021 12:40:17 -0400 Subject: [PATCH 196/221] zh: sync concepts/storage/persistent-volumes Signed-off-by: Rui Chen <rui@chenrui.dev> sync zh translation Co-authored-by: Qiming Teng <tengqm@outlook.com> add hyperlink refs Signed-off-by: Rui Chen <rui@chenrui.dev> --- .../docs/concepts/storage/persistent-volumes.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/content/zh/docs/concepts/storage/persistent-volumes.md b/content/zh/docs/concepts/storage/persistent-volumes.md index 739540c002..53647be555 100644 --- a/content/zh/docs/concepts/storage/persistent-volumes.md +++ b/content/zh/docs/concepts/storage/persistent-volumes.md @@ -746,10 +746,10 @@ Kubernetes supports two `volumeModes` of PersistentVolumes: `Filesystem` and `Bl `Filesystem` is the default mode used when `volumeMode` parameter is omitted. A volume with `volumeMode: Filesystem` is *mounted* into Pods into a directory. If the volume -is backed by a block device and the device is empty, Kuberneretes creates a filesystem +is backed by a block device and the device is empty, Kubernetes creates a filesystem on the device before mounting it for the first time. --> -针对 PV 持久卷,Kuberneretes +针对 PV 持久卷,Kubernetes 支持两种卷模式(`volumeModes`):`Filesystem(文件系统)` 和 `Block(块)`。 `volumeMode` 是一个可选的 API 参数。 如果该参数被省略,默认的卷模式是 `Filesystem`。 @@ -1032,20 +1032,20 @@ spec: <!-- ### Access Modes -Claims use the same conventions as volumes when requesting storage with specific access modes. +Claims use [the same conventions as volumes](#access-modes) when requesting storage with specific access modes. --> -### 访问模式 {#access-modes} +### 访问模式 {#access-modes} -申领在请求具有特定访问模式的存储时,使用与卷相同的访问模式约定。 +申领在请求具有特定访问模式的存储时,使用与卷相同的[访问模式约定](#access-modes)。 <!-- ### Volume Modes -Claims use the same convention as volumes to indicate the consumption of the volume as either a filesystem or block device. +Claims use [the same convention as volumes](#volume-mode) to indicate the consumption of the volume as either a filesystem or block device. --> -### 卷模式 {#volume-modes} +### 卷模式 {#volume-modes} -申领使用与卷相同的约定来表明是将卷作为文件系统还是块设备来使用。 +申领使用[与卷相同的约定](#access-modes)来表明是将卷作为文件系统还是块设备来使用。 <!-- ### Resources From 29e7f7c0456dbf3aa1e0e5be3e953eacc5ff2c3f Mon Sep 17 00:00:00 2001 From: Rui Chen <rui@chenrui.dev> Date: Sun, 30 May 2021 13:03:22 -0400 Subject: [PATCH 197/221] zh: sync concepts/workloads files zh: sync concepts/workloads/pods/disruptions zh: sync concepts/workloads/pods/init-containers zh: sync concepts/workloads/pods/pod-topology-spread-constraint --- .../docs/concepts/workloads/pods/disruptions.md | 16 ++++++++++------ .../concepts/workloads/pods/init-containers.md | 7 +++---- .../pods/pod-topology-spread-constraints.md | 8 ++++---- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/content/zh/docs/concepts/workloads/pods/disruptions.md b/content/zh/docs/concepts/workloads/pods/disruptions.md index 7320859778..c200a51757 100644 --- a/content/zh/docs/concepts/workloads/pods/disruptions.md +++ b/content/zh/docs/concepts/workloads/pods/disruptions.md @@ -155,18 +155,23 @@ and [stateful](/docs/tasks/run-application/run-replicated-stateful-application/) <!-- The frequency of voluntary disruptions varies. On a basic Kubernetes cluster, there are -no voluntary disruptions at all. However, your cluster administrator or hosting provider +no automated voluntary disruptions (only user-triggered ones). However, your cluster administrator or hosting provider may run some additional services which cause voluntary disruptions. For example, rolling out node software updates can cause voluntary disruptions. Also, some implementations of cluster (node) autoscaling may cause voluntary disruptions to defragment and compact nodes. Your cluster administrator or hosting provider should have documented what level of voluntary -disruptions, if any, to expect. +disruptions, if any, to expect. Certain configuration options, such as +[using PriorityClasses](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/) +in your pod spec can also cause voluntary (and involuntary) disruptions. --> -自愿干扰的频率各不相同。在一个基本的 Kubernetes 集群中,根本没有自愿干扰。然而,集群管理 -或托管提供商可能运行一些可能导致自愿干扰的额外服务。例如,节点软 +自愿干扰的频率各不相同。在一个基本的 Kubernetes 集群中,没有自愿干扰(只有用户触发的干扰)。 +然而,集群管理员或托管提供商可能运行一些可能导致自愿干扰的额外服务。例如,节点软 更新可能导致自愿干扰。另外,集群(节点)自动缩放的某些 实现可能导致碎片整理和紧缩节点的自愿干扰。集群 管理员或托管提供商应该已经记录了各级别的自愿干扰(如果有的话)。 +有些配置选项,例如在 pod spec 中 +[使用 PriorityClasses](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/) +也会产生自愿(和非自愿)的干扰。 <!-- Kubernetes offers features to help run highly available applications at the same @@ -267,7 +272,7 @@ during application updates is configured in spec for the specific workload resou <!-- When a pod is evicted using the eviction API, it is gracefully [terminated](/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination), -hornoring the +hornoring the `terminationGracePeriodSeconds` setting in its [PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core). --> 当使用驱逐 API 驱逐 Pod 时,Pod 会被体面地 @@ -504,4 +509,3 @@ the nodes in your cluster, such as a node or system software upgrade, here are s * 进一步了解[排空节点](/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/init-containers.md b/content/zh/docs/concepts/workloads/pods/init-containers.md index 283b9f3759..bbfdebc581 100644 --- a/content/zh/docs/concepts/workloads/pods/init-containers.md +++ b/content/zh/docs/concepts/workloads/pods/init-containers.md @@ -54,7 +54,7 @@ Init 容器与普通的容器非常像,除了如下两点: * 每个都必须在下一个启动之前成功完成。 <!-- -If a Pod's init container fails, the kubelet repeatedly restarts that init container until it succeeds. +If a Pod's init container fails, the kubelet repeatedly restarts that init container until it succeeds. However, if the Pod has a `restartPolicy` of Never, and an init container fails during startup of that Pod, Kubernetes treats the overall Pod as failed. --> 如果 Pod 的 Init 容器失败,kubelet 会不断地重启该 Init 容器直到该容器成功为止。 @@ -391,10 +391,10 @@ myapp-pod 1/1 Running 0 9m <!-- This simple example should provide some inspiration for you to create your own -init containers. [What's next](#whats-next) contains a link to a more detailed example. +init containers. [What's next](#what-s-next) contains a link to a more detailed example. --> 这个简单例子应该能为你创建自己的 Init 容器提供一些启发。 -[接下来](#whats-next)节提供了更详细例子的链接。 +[接下来](#what-s-next)节提供了更详细例子的链接。 <!-- ## Detailed behavior @@ -546,4 +546,3 @@ Pod 不会被重启。这一行为适用于 Kubernetes v1.20 及更新版本。 --> * 阅读[创建包含 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-topology-spread-constraints.md b/content/zh/docs/concepts/workloads/pods/pod-topology-spread-constraints.md index 2ddc5a4d9d..747087b059 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 @@ -27,7 +27,7 @@ You can use _topology spread constraints_ to control how {{< glossary_tooltip te <!-- {{< note >}} -In versions of Kubernetes before v1.19, you must enable the `EvenPodsSpread` +In versions of Kubernetes before v1.18, you must enable the `EvenPodsSpread` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) on the [API server](/docs/concepts/overview/components/#kube-apiserver) and the [scheduler](/docs/reference/generated/kube-scheduler/) in order to use Pod @@ -36,7 +36,8 @@ topology spread constraints. --> {{< note >}} -在 v1.19 之前的 Kubernetes 版本中,如果要使用 Pod 拓扑扩展约束,你必须在 [API 服务器](/zh/docs/concepts/overview/components/#kube-apiserver) +在 v1.18 之前的 Kubernetes 版本中,如果要使用 Pod 拓扑扩展约束,你必须在 +[API 服务器](/zh/docs/concepts/overview/components/#kube-apiserver) 和[调度器](/zh/docs/reference/command-line-tools-reference/kube-scheduler/) 中启用 `EvenPodsSpread` [特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/)。 {{< /note >}} @@ -218,7 +219,7 @@ If we want an incoming Pod to be evenly spread with existing Pods across zones, 则让它保持悬决状态。 <!-- -If the scheduler placed this incoming Pod into "zoneA", the Pods distribution would become [3, 1], +If the scheduler placed this incoming Pod into "zoneA", the Pods distribution would become [3, 1], hence the actual skew is 2 (3 - 1) - which violates `maxSkew: 1`. In this example, the incoming Pod can only be placed onto "zoneB": --> 如果调度器将新的 Pod 放入 "zoneA",Pods 分布将变为 [3, 1],因此实际的偏差 @@ -645,4 +646,3 @@ See [Motivation](https://github.com/kubernetes/enhancements/blob/master/keps/sig --> - [博客: PodTopologySpread介绍](https://kubernetes.io/blog/2020/05/introducing-podtopologyspread/) 详细解释了 `maxSkew`,并给出了一些高级的使用示例。 - From 7f4281ebb3f17d87f3d1d05d982f4f1b748d81a2 Mon Sep 17 00:00:00 2001 From: Rui Chen <rui@chenrui.dev> Date: Sun, 30 May 2021 12:27:23 -0400 Subject: [PATCH 198/221] zh: resync concepts/security files zh: resync content/zh/docs/concepts/security/controlling-access zh: resync content/zh/docs/concepts/security/pod-security-standards sync zh translation Update content/zh/docs/concepts/security/pod-security-standards.md Co-authored-by: Qiming Teng <tengqm@outlook.com> Update content/zh/docs/concepts/security/pod-security-standards.md Co-authored-by: Qiming Teng <tengqm@outlook.com> Update content/zh/docs/concepts/security/pod-security-standards.md Co-authored-by: Qiming Teng <tengqm@outlook.com> Update content/zh/docs/concepts/security/pod-security-standards.md Co-authored-by: Qiming Teng <tengqm@outlook.com> Update content/zh/docs/concepts/security/pod-security-standards.md Co-authored-by: Qiming Teng <tengqm@outlook.com> Update content/zh/docs/concepts/security/pod-security-standards.md Co-authored-by: Qiming Teng <tengqm@outlook.com> --- .../concepts/security/controlling-access.md | 62 +++++++-------- .../security/pod-security-standards.md | 78 ++++++++++++------- 2 files changed, 83 insertions(+), 57 deletions(-) diff --git a/content/zh/docs/concepts/security/controlling-access.md b/content/zh/docs/concepts/security/controlling-access.md index d17e6744bb..b45dee64dd 100644 --- a/content/zh/docs/concepts/security/controlling-access.md +++ b/content/zh/docs/concepts/security/controlling-access.md @@ -2,7 +2,7 @@ title: Kubernetes API 访问控制 content_type: concept --- -<!-- +<!-- --- reviewers: - erictune @@ -14,13 +14,13 @@ content_type: concept <!-- overview --> -<!-- +<!-- This page provides an overview of controlling access to the Kubernetes API. --> 本页面概述了对 Kubernetes API 的访问控制。 <!-- body --> -<!-- +<!-- Users access the [Kubernetes API](/docs/concepts/overview/kubernetes-api/) using `kubectl`, client libraries, or by making REST requests. Both human users and [Kubernetes service accounts](/docs/tasks/configure-pod-container/configure-service-account/) can be @@ -37,7 +37,7 @@ following diagram: <!-- ## Transport security --> ## 传输安全 {#transport-security} -<!-- +<!-- In a typical Kubernetes cluster, the API serves on port 443, protected by TLS. The API server presents a certificate. This certificate may be signed using a private certificate authority (CA), or based on a public key infrastructure linked @@ -47,9 +47,9 @@ to a generally recognized CA. API 服务器出示证书。 该证书可以使用私有证书颁发机构(CA)签名,也可以基于链接到公认的 CA 的公钥基础架构签名。 -<!-- +<!-- If your cluster uses a private certificate authority, you need a copy of that CA -certifcate configured into your `~/.kube/config` on the client, so that you can +certificate configured into your `~/.kube/config` on the client, so that you can trust the connection and be confident it was not intercepted. Your client can present a TLS client certificate at this stage. @@ -62,7 +62,7 @@ Your client can present a TLS client certificate at this stage. <!-- ## Authentication --> ## 认证 {#authentication} -<!-- +<!-- Once TLS is established, the HTTP request moves to the Authentication step. This is shown as step **1** in the diagram. The cluster creation script or cluster admin configures the API server to run @@ -74,9 +74,9 @@ Authenticators are described in more detail in 集群创建脚本或者集群管理员配置 API 服务器,使之运行一个或多个身份认证组件。 身份认证组件在[认证](/zh/docs/reference/access-authn-authz/authentication/)节中有更详细的描述。 -<!-- +<!-- The input to the authentication step is the entire HTTP request; however, it typically -just examines the headers and/or client certificate. +examines the headers and/or client certificate. Authentication modules include client certificates, password, and plain tokens, bootstrap tokens, and JSON Web Tokens (used for service accounts). @@ -90,7 +90,7 @@ until one of them succeeds. 可以指定多个认证模块,在这种情况下,服务器依次尝试每个验证模块,直到其中一个成功。 -<!-- +<!-- If the request cannot be authenticated, it is rejected with HTTP status code 401. Otherwise, the user is authenticated as a specific `username`, and the user name is available to subsequent steps to use in their decisions. Some authenticators @@ -99,7 +99,7 @@ do not. While Kubernetes uses usernames for access control decisions and in request logging, it does not have a `User` object nor does it store usernames or other information about -users in its API. +users in its API. --> 如果请求认证不通过,服务器将以 HTTP 状态码 401 拒绝该请求。 反之,该用户被认证为特定的 `username`,并且该用户名可用于后续步骤以在其决策中使用。 @@ -108,7 +108,7 @@ users in its API. <!-- ## Authorization --> ## 鉴权 {#authorization} -<!-- +<!-- After the request is authenticated as coming from a specific user, the request must be authorized. This is shown as step **2** in the diagram. A request must include the username of the requester, the requested action, and the object affected by the action. The request is authorized if an existing policy declares that the user has permissions to complete the requested action. @@ -134,7 +134,7 @@ For example, if Bob has the policy below, then he can read pods only in the name } } ``` -<!-- +<!-- If Bob makes the following request, the request is authorized because he is allowed to read objects in the `projectCaribou` namespace: --> 如果 Bob 执行以下请求,那么请求会被鉴权,因为允许他读取 `projectCaribou` 名称空间中的对象。 @@ -153,27 +153,27 @@ If Bob makes the following request, the request is authorized because he is allo } } ``` -<!-- -If Bob makes a request to write (`create` or `update`) to the objects in the `projectCaribou` namespace, his authorization is denied. +<!-- +If Bob makes a request to write (`create` or `update`) to the objects in the `projectCaribou` namespace, his authorization is denied. If Bob makes a request to read (`get`) objects in a different namespace such as `projectFish`, then his authorization is denied. -Kubernetes authorization requires that you use common REST attributes to interact with existing organization-wide or cloud-provider-wide access control systems. +Kubernetes authorization requires that you use common REST attributes to interact with existing organization-wide or cloud-provider-wide access control systems. It is important to use REST formatting because these control systems might interact with other APIs besides the Kubernetes API. --> 如果 Bob 在 `projectCaribou` 名字空间中请求写(`create` 或 `update`)对象,其鉴权请求将被拒绝。 如果 Bob 在诸如 `projectFish` 这类其它名字空间中请求读取(`get`)对象,其鉴权也会被拒绝。 -Kubernetes 鉴权要求使用公共 REST 属性与现有的组织范围或云提供商范围的访问控制系统进行交互。 +Kubernetes 鉴权要求使用公共 REST 属性与现有的组织范围或云提供商范围的访问控制系统进行交互。 使用 REST 格式很重要,因为这些控制系统可能会与 Kubernetes API 之外的 API 交互。 -<!-- -Kubernetes supports multiple authorization modules, such as ABAC mode, RBAC Mode, and Webhook mode. -When an administrator creates a cluster, they configure the authorization modules that should be used in the API server. -If more than one authorization modules are configured, Kubernetes checks each module, -and if any module authorizes the request, then the request can proceed. +<!-- +Kubernetes supports multiple authorization modules, such as ABAC mode, RBAC Mode, and Webhook mode. +When an administrator creates a cluster, they configure the authorization modules that should be used in the API server. +If more than one authorization modules are configured, Kubernetes checks each module, +and if any module authorizes the request, then the request can proceed. If all of the modules deny the request, then the request is denied (HTTP status code 403). -To learn more about Kubernetes authorization, including details about creating policies using the supported authorization modules, +To learn more about Kubernetes authorization, including details about creating policies using the supported authorization modules, see [Authorization](/docs/reference/access-authn-authz/authorization/). --> Kubernetes 支持多种鉴权模块,例如 ABAC 模式、RBAC 模式和 Webhook 模式等。 @@ -187,7 +187,7 @@ Kubernetes 支持多种鉴权模块,例如 ABAC 模式、RBAC 模式和 Webhoo <!-- ## Admission control --> ## 准入控制 {#admission-control} -<!-- +<!-- Admission Control modules are software modules that can modify or reject requests. In addition to the attributes available to Authorization modules, Admission Control modules can access the contents of the object that is being created or modified. @@ -203,7 +203,7 @@ When multiple admission controllers are configured, they are called in order. 准入控制器不会对仅读取对象的请求起作用。 有多个准入控制器被配置时,服务器将依次调用它们。 -<!-- +<!-- This is shown as step **3** in the diagram. Unlike Authentication and Authorization modules, if any admission controller module @@ -230,11 +230,11 @@ for the corresponding API object, and then written to the object store (shown as <!-- ## API server ports and IPs --> ## API 服务器端口和 IP {#api-server-ports-and-ips} -<!-- +<!-- The previous discussion applies to requests sent to the secure port of the API server (the typical case). The API server can actually serve on 2 ports: -By default the Kubernetes API server serves HTTP on 2 ports: +By default, the Kubernetes API server serves HTTP on 2 ports: --> 前面的讨论适用于发送到 API 服务器的安全端口的请求(典型情况)。 API 服务器实际上可以在 2 个端口上提供服务: @@ -250,7 +250,7 @@ By default the Kubernetes API server serves HTTP on 2 ports: - default IP is localhost, change with `--insecure-bind-address` flag. - request **bypasses** authentication and authorization modules. - request handled by admission control module(s). - - protected by need to have host access + - protected by need to have host access 2. “Secure port”: @@ -281,11 +281,11 @@ By default the Kubernetes API server serves HTTP on 2 ports: - 请求须经身份认证和鉴权组件处理 - 请求须经准入控制模块处理 - 身份认证和鉴权模块运行 - + ## {{% heading "whatsnext" %}} -<!-- +<!-- Read more documentation on authentication, authorization and API access control: - [Authenticating](/docs/reference/access-authn-authz/authentication/) @@ -330,4 +330,4 @@ You can learn about: 你可以了解 - Pod 如何使用 [Secrets](/zh/docs/concepts/configuration/secret/#service-accounts-automatically-create-and-attach-secrets-with-api-credentials) - 获取 API 凭证. \ No newline at end of file + 获取 API 凭证. diff --git a/content/zh/docs/concepts/security/pod-security-standards.md b/content/zh/docs/concepts/security/pod-security-standards.md index 3a897686dc..47a3c5e0da 100644 --- a/content/zh/docs/concepts/security/pod-security-standards.md +++ b/content/zh/docs/concepts/security/pod-security-standards.md @@ -49,7 +49,7 @@ should range from highly restricted to highly flexible: - **_Privileged_** - Unrestricted policy, providing the widest possible level of permissions. This policy allows for known privilege escalations. -- **_Baseline/Default_** - Minimally restrictive policy while preventing known privilege +- **_Baseline_** - Minimally restrictive policy while preventing known privilege escalations. Allows the default (minimally specified) Pod configuration. - **_Restricted_** - Heavily restricted policy, following current Pod hardening best practices. --> @@ -60,7 +60,7 @@ should range from highly restricted to highly flexible: - **_Privileged_** - 不受限制的策略,提供最大可能范围的权限许可。这些策略 允许已知的特权提升。 -- **_Baseline/Default_** - 限制性最弱的策略,禁止已知的策略提升。 +- **_Baseline_** - 限制性最弱的策略,禁止已知的策略提升。 允许使用默认的(规定最少)Pod 配置。 - **_Restricted_** - 限制性非常强的策略,遵循当前的保护 Pod 的最佳实践。 @@ -90,15 +90,15 @@ Privileged 框架可能意味着不应用任何约束而不是实施某策略实 与此不同,对于默认拒绝(Deny-by-default)实施机制(如 Pod 安全策略)而言, Privileged 策略应该默认允许所有控制(即,禁止所有限制)。 -### Baseline/Default +### Baseline <!-- -The Baseline/Default policy is aimed at ease of adoption for common containerized workloads while +The Baseline policy is aimed at ease of adoption for common containerized workloads while preventing known privilege escalations. This policy is targeted at application operators and developers of non-critical applications. The following listed controls should be enforced/disallowed: --> -Baseline/Default 策略的目标是便于常见的容器化应用采用,同时禁止已知的特权提升。 +Baseline 策略的目标是便于常见的容器化应用采用,同时禁止已知的特权提升。 此策略针对的是应用运维人员和非关键性应用的开发人员。 下面列举的控制应该被实施(禁止): @@ -201,39 +201,66 @@ Baseline/Default 策略的目标是便于常见的容器化应用采用,同时 </td> </tr> <tr> - <!-- td>AppArmor <em>(optional)</em></td --> - <td>AppArmor <em>(可选)</em></td> + <!-- <td>AppArmor <em>(optional)</em></td> --> + <td>AppArmor</td> <!-- td> - On supported hosts, the 'runtime/default' AppArmor profile is applied by default. The default policy should prevent overriding or disabling the policy, or restrict overrides to an allowed set of profiles.<br> + On supported hosts, the 'runtime/default' AppArmor profile is applied by default. + The baseline policy should prevent overriding or disabling the default AppArmor + profile, or restrict overrides to an allowed set of profiles.<br> <br><b>限制的字段:</b><br> metadata.annotations['container.apparmor.security.beta.kubernetes.io/*']<br> <br><b>Allowed Values:</b> 'runtime/default', undefined<br> </td --> <td> - 在受支持的宿主上,默认应用 'runtime/default' AppArmor Profile。默认策略应禁止重载或者禁用该策略,或将重载限定未所允许的 profile 集合。<br> + 在被支持的主机上,默认使用 'runtime/default' AppArmor Profile。 + 基线策略应避免覆盖或者禁用默认策略,以及限制覆盖一些 profile 集合的权限。<br> <br><b>限制的字段:</b><br> metadata.annotations['container.apparmor.security.beta.kubernetes.io/*']<br> <br><b>允许的值:</b> 'runtime/default'、未定义<br> </td> </tr> <tr> - <!-- td>SELinux <em>(optional)</em></td --> - <td>SELinux <em>(可选)</em></td> + <!-- <td>SELinux</td> --> + <td>SELinux</td> <!-- td> - Setting custom SELinux options should be disallowed.<br> + Setting the SELinux type is restricted, and setting a custom SELinux user or role option is forbidden.<br> <br><b>Restricted Fields:</b><br> - spec.securityContext.seLinuxOptions<br> - spec.containers[*].securityContext.seLinuxOptions<br> - spec.initContainers[*].securityContext.seLinuxOptions<br> - <br><b>Allowed Values:</b> undefined/nil<br> + spec.securityContext.seLinuxOptions.type<br> + spec.containers[*].securityContext.seLinuxOptions.type<br> + spec.initContainers[*].securityContext.seLinuxOptions.type<br> + <br><b>Allowed Values:</b><br> + undefined/empty<br> + container_t<br> + container_init_t<br> + container_kvm_t<br> + <br><b>Restricted Fields:</b><br> + spec.securityContext.seLinuxOptions.user<br> + spec.containers[*].securityContext.seLinuxOptions.user<br> + spec.initContainers[*].securityContext.seLinuxOptions.user<br> + spec.securityContext.seLinuxOptions.role<br> + spec.containers[*].securityContext.seLinuxOptions.role<br> + spec.initContainers[*].securityContext.seLinuxOptions.role<br> + <br><b>Allowed Values:</b> undefined/empty<br> </td --> <td> - 应禁止设置定制的 SELinux 选项。<br> + 设置 SELinux 类型的操作是被限制的,设置自定义的 SELinux 用户或角色选项是被禁止的。<br> <br><b>限制的字段:</b><br> - spec.securityContext.seLinuxOptions<br> - spec.containers[*].securityContext.seLinuxOptions<br> - spec.initContainers[*].securityContext.seLinuxOptions<br> - <br><b>允许的值:</b> undefined/nil<br> + spec.securityContext.seLinuxOptions.type<br> + spec.containers[*].securityContext.seLinuxOptions.type<br> + spec.initContainers[*].securityContext.seLinuxOptions.type<br> + <br><b>允许的值:</b><br> + 未定义/空<br> + container_t<br> + container_init_t<br> + container_kvm_t<br> + <br><b>被限制的字段:</b><br> + spec.securityContext.seLinuxOptions.user<br> + spec.containers[*].securityContext.seLinuxOptions.user<br> + spec.initContainers[*].securityContext.seLinuxOptions.user<br> + spec.securityContext.seLinuxOptions.role<br> + spec.containers[*].securityContext.seLinuxOptions.role<br> + spec.initContainers[*].securityContext.seLinuxOptions.role<br> + <br><b>允许的值:</b> 未定义或空<br> </td> </tr> <tr> @@ -306,8 +333,8 @@ Restricted 策略旨在实施当前保护 Pod 的最佳实践,尽管这样作 <td><strong>策略(Policy)</strong></td> </tr> <tr> - <!-- td colspan="2"><em>Everything from the default profile.</em></td --> - <td colspan="2"><em>Default 策略的所有要求。</em></td> + <!-- <td colspan="2"><em>Everything from the baseline profile.</em></td> --> + <td colspan="2"><em>基线策略的所有要求。</em></td> </tr> <tr> <!-- td>Volume Types</td --> @@ -425,11 +452,11 @@ of individual policies are not defined here. <!-- ## FAQ -### Why isn't there a profile between privileged and default? +### Why isn't there a profile between privileged and baseline? --> ## 常见问题 {#faq} -### 为什么策略类型定义在 Privileged 和 Default 之间 +### 为什么不存在介于 Privileged 和 Baseline 之间的策略类型 <!-- The three profiles defined here have a clear linear progression from most secure (restricted) to least @@ -517,4 +544,3 @@ sandboxing. As such, no single recommended policy is recommended for all sandbox 此外,沙箱化负载的保护高度依赖于沙箱化的实现方法。 因此,现在还没有针对所有沙箱化负载的建议策略。 - From 23dbe3823b2e2222d13750e7764be99ded490c4c Mon Sep 17 00:00:00 2001 From: liuwei10 <liuwei10@inspur.com> Date: Mon, 31 May 2021 15:42:55 +0800 Subject: [PATCH 199/221] modify error of zh md --- .../zh/docs/tasks/run-application/horizontal-pod-autoscale.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/tasks/run-application/horizontal-pod-autoscale.md b/content/zh/docs/tasks/run-application/horizontal-pod-autoscale.md index 4d4c8416c2..bc9702e8f0 100644 --- a/content/zh/docs/tasks/run-application/horizontal-pod-autoscale.md +++ b/content/zh/docs/tasks/run-application/horizontal-pod-autoscale.md @@ -634,7 +634,7 @@ APIs, cluster administrators must ensure that: * 相应的 API 已注册: * 对于资源指标,将使用 `metrics.k8s.io` API,一般由 [metrics-server](https://github.com/kubernetes-incubator/metrics-server) 提供。 - 它可以做为集群插件启动。 + 它可以作为集群插件启动。 * 对于自定义指标,将使用 `custom.metrics.k8s.io` API。 它由其他度量指标方案厂商的“适配器(Adapter)” API 服务器提供。 From 428e30e5211acd6add9f4b218bde1bbf3c6bd236 Mon Sep 17 00:00:00 2001 From: yaohaoyun <dabeige@gmail.com> Date: Mon, 31 May 2021 17:18:47 +0800 Subject: [PATCH 200/221] optimize zh doc translation --- .../_posts/2019-05-14-expanding-our-contributor-workshops.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/blog/_posts/2019-05-14-expanding-our-contributor-workshops.md b/content/zh/blog/_posts/2019-05-14-expanding-our-contributor-workshops.md index 9fed26b2c7..8fb0f2b32f 100644 --- a/content/zh/blog/_posts/2019-05-14-expanding-our-contributor-workshops.md +++ b/content/zh/blog/_posts/2019-05-14-expanding-our-contributor-workshops.md @@ -71,7 +71,7 @@ In the 201 track, we will have a codebase walkthrough and local development and For both tracks, you will have a chance to get your hands dirty and have some fun. Because not every contributor works with code, and not every contribution is technical, we will spend the beginning of the workshop learning how our project is structured and organized, where to find the right people, and where to get help when stuck. --> -对于这两门课程,你将有机会亲自动手并体会到其中的乐趣。因为不是每个贡献者都使用代码,也不是每项贡献都包含技术性的,所以我们将在研讨会开始时学习如何构建和组织项目,以及如何进行找到合适的人,以及遇到困难时在哪里寻求帮助。 +对于这两门课程,你将有机会亲自动手并体会到其中的乐趣。因为不是每个贡献者都使用代码,也不是每项贡献都是技术性的,所以我们将在研讨会开始时学习如何构建和组织项目,以及如何进行找到合适的人,以及遇到困难时在哪里寻求帮助。 <!-- ## Mentoring Opportunities From 7ebb2271223df37a414b117921b3da78428ee645 Mon Sep 17 00:00:00 2001 From: Jihoon Seo <jihoon.seo@etri.re.kr> Date: Mon, 31 May 2021 18:23:51 +0900 Subject: [PATCH 201/221] [ko] Remove untranslated files in ko/case-studies/ --- .../adform/adform_featured_logo.png | Bin 7830 -> 0 bytes content/ko/case-studies/adform/index.html | 86 ---------------- .../case-studies/amadeus/amadeus_featured.png | Bin 6970 -> 0 bytes .../ko/case-studies/amadeus/amadeus_logo.png | Bin 19562 -> 0 bytes content/ko/case-studies/amadeus/index.html | 84 ---------------- .../ancestry/ancestry_featured.png | Bin 21016 -> 0 bytes .../case-studies/ancestry/ancestry_logo.png | Bin 21141 -> 0 bytes content/ko/case-studies/ancestry/index.html | 92 ----------------- .../blablacar/blablacar_featured.png | Bin 7867 -> 0 bytes .../case-studies/blablacar/blablacar_logo.png | Bin 7841 -> 0 bytes content/ko/case-studies/blablacar/index.html | 85 ---------------- .../blackrock/blackrock_featured.png | Bin 6391 -> 0 bytes .../case-studies/blackrock/blackrock_logo.png | Bin 6430 -> 0 bytes content/ko/case-studies/blackrock/index.html | 83 ---------------- .../case-studies/buffer/buffer_featured.png | Bin 5263 -> 0 bytes .../ko/case-studies/buffer/buffer_logo.png | Bin 4791 -> 0 bytes content/ko/case-studies/buffer/index.html | 83 ---------------- .../capital-one/capitalone_featured_logo.png | Bin 11306 -> 0 bytes .../ko/case-studies/capital-one/index.html | 61 ------------ .../crowdfire/crowdfire_featured_logo.png | Bin 7827 -> 0 bytes content/ko/case-studies/crowdfire/index.html | 85 ---------------- .../case-studies/golfnow/golfnow_featured.png | Bin 22915 -> 0 bytes .../ko/case-studies/golfnow/golfnow_logo.png | Bin 8858 -> 0 bytes content/ko/case-studies/golfnow/index.html | 89 ----------------- .../haufegroup/haufegroup_featured.png | Bin 5841 -> 0 bytes .../haufegroup/haufegroup_logo.png | Bin 5794 -> 0 bytes content/ko/case-studies/haufegroup/index.html | 85 ---------------- .../case-studies/huawei/huawei_featured.png | Bin 14310 -> 0 bytes .../ko/case-studies/huawei/huawei_logo.png | Bin 14274 -> 0 bytes content/ko/case-studies/huawei/index.html | 73 -------------- .../ko/case-studies/ibm/ibm_featured_logo.png | Bin 11298 -> 0 bytes .../ko/case-studies/ibm/ibm_featured_logo.svg | 1 - content/ko/case-studies/ibm/index.html | 80 --------------- content/ko/case-studies/ing/index.html | 78 --------------- .../ko/case-studies/ing/ing_featured_logo.png | Bin 10305 -> 0 bytes content/ko/case-studies/naic/index.html | 87 ---------------- .../case-studies/naic/naic_featured_logo.png | Bin 9433 -> 0 bytes .../ko/case-studies/newyorktimes/index.html | 74 -------------- .../newyorktimes/newyorktimes_featured.png | Bin 20189 -> 0 bytes .../newyorktimes/newyorktimes_logo.png | Bin 10251 -> 0 bytes content/ko/case-studies/nordstrom/index.html | 75 -------------- .../nordstrom/nordstrom_featured_logo.png | Bin 7352 -> 0 bytes .../northwestern-mutual/index.html | 69 ------------- .../northwestern_featured_logo.png | Bin 10083 -> 0 bytes content/ko/case-studies/ocado/index.html | 83 ---------------- .../ocado/ocado_featured_logo.png | Bin 8089 -> 0 bytes content/ko/case-studies/openAI/index.html | 69 ------------- .../case-studies/openAI/openai_featured.png | Bin 12132 -> 0 bytes .../ko/case-studies/openAI/openai_logo.png | Bin 19818 -> 0 bytes content/ko/case-studies/peardeck/index.html | 87 ---------------- .../peardeck/peardeck_featured.png | Bin 11786 -> 0 bytes .../case-studies/peardeck/peardeck_logo.png | Bin 9260 -> 0 bytes content/ko/case-studies/pearson/index.html | 83 ---------------- .../case-studies/pearson/pearson_featured.png | Bin 7784 -> 0 bytes .../ko/case-studies/pearson/pearson_logo.png | Bin 5123 -> 0 bytes content/ko/case-studies/pinterest/index.html | 84 ---------------- .../pinterest/pinterest_feature.png | Bin 9118 -> 0 bytes .../case-studies/pinterest/pinterest_logo.png | Bin 9003 -> 0 bytes content/ko/case-studies/slingtv/index.html | 79 --------------- .../slingtv/slingtv_featured_logo.png | Bin 8513 -> 0 bytes .../ko/case-studies/squarespace/index.html | 71 ------------- .../squarespace/squarespace_featured_logo.png | Bin 4539 -> 0 bytes content/ko/case-studies/wikimedia/index.html | 66 ------------- .../wikimedia/wikimedia_featured.png | Bin 21322 -> 0 bytes .../case-studies/wikimedia/wikimedia_logo.png | Bin 7875 -> 0 bytes content/ko/case-studies/wink/index.html | 87 ---------------- .../ko/case-studies/wink/wink_featured.png | Bin 21292 -> 0 bytes content/ko/case-studies/wink/wink_logo.png | Bin 5623 -> 0 bytes content/ko/case-studies/workiva/index.html | 93 ------------------ .../workiva/workiva_featured_logo.png | Bin 5980 -> 0 bytes .../ko/case-studies/yahoo-japan/index.html | 4 - .../yahoo-japan/yahooJapan_logo.png | Bin 7266 -> 0 bytes content/ko/case-studies/ygrene/index.html | 82 --------------- .../ygrene/ygrene_featured_logo.png | Bin 11569 -> 0 bytes content/ko/case-studies/zalando/index.html | 83 ---------------- .../zalando/zalando_feature_logo.png | Bin 7643 -> 0 bytes 76 files changed, 2341 deletions(-) delete mode 100644 content/ko/case-studies/adform/adform_featured_logo.png delete mode 100644 content/ko/case-studies/adform/index.html delete mode 100644 content/ko/case-studies/amadeus/amadeus_featured.png delete mode 100644 content/ko/case-studies/amadeus/amadeus_logo.png delete mode 100644 content/ko/case-studies/amadeus/index.html delete mode 100644 content/ko/case-studies/ancestry/ancestry_featured.png delete mode 100644 content/ko/case-studies/ancestry/ancestry_logo.png delete mode 100644 content/ko/case-studies/ancestry/index.html delete mode 100644 content/ko/case-studies/blablacar/blablacar_featured.png delete mode 100644 content/ko/case-studies/blablacar/blablacar_logo.png delete mode 100644 content/ko/case-studies/blablacar/index.html delete mode 100644 content/ko/case-studies/blackrock/blackrock_featured.png delete mode 100644 content/ko/case-studies/blackrock/blackrock_logo.png delete mode 100644 content/ko/case-studies/blackrock/index.html delete mode 100644 content/ko/case-studies/buffer/buffer_featured.png delete mode 100644 content/ko/case-studies/buffer/buffer_logo.png delete mode 100644 content/ko/case-studies/buffer/index.html delete mode 100644 content/ko/case-studies/capital-one/capitalone_featured_logo.png delete mode 100644 content/ko/case-studies/capital-one/index.html delete mode 100644 content/ko/case-studies/crowdfire/crowdfire_featured_logo.png delete mode 100644 content/ko/case-studies/crowdfire/index.html delete mode 100644 content/ko/case-studies/golfnow/golfnow_featured.png delete mode 100644 content/ko/case-studies/golfnow/golfnow_logo.png delete mode 100644 content/ko/case-studies/golfnow/index.html delete mode 100644 content/ko/case-studies/haufegroup/haufegroup_featured.png delete mode 100644 content/ko/case-studies/haufegroup/haufegroup_logo.png delete mode 100644 content/ko/case-studies/haufegroup/index.html delete mode 100644 content/ko/case-studies/huawei/huawei_featured.png delete mode 100644 content/ko/case-studies/huawei/huawei_logo.png delete mode 100644 content/ko/case-studies/huawei/index.html delete mode 100644 content/ko/case-studies/ibm/ibm_featured_logo.png delete mode 100644 content/ko/case-studies/ibm/ibm_featured_logo.svg delete mode 100644 content/ko/case-studies/ibm/index.html delete mode 100644 content/ko/case-studies/ing/index.html delete mode 100644 content/ko/case-studies/ing/ing_featured_logo.png delete mode 100644 content/ko/case-studies/naic/index.html delete mode 100644 content/ko/case-studies/naic/naic_featured_logo.png delete mode 100644 content/ko/case-studies/newyorktimes/index.html delete mode 100644 content/ko/case-studies/newyorktimes/newyorktimes_featured.png delete mode 100644 content/ko/case-studies/newyorktimes/newyorktimes_logo.png delete mode 100644 content/ko/case-studies/nordstrom/index.html delete mode 100644 content/ko/case-studies/nordstrom/nordstrom_featured_logo.png delete mode 100644 content/ko/case-studies/northwestern-mutual/index.html delete mode 100644 content/ko/case-studies/northwestern-mutual/northwestern_featured_logo.png delete mode 100644 content/ko/case-studies/ocado/index.html delete mode 100644 content/ko/case-studies/ocado/ocado_featured_logo.png delete mode 100644 content/ko/case-studies/openAI/index.html delete mode 100644 content/ko/case-studies/openAI/openai_featured.png delete mode 100644 content/ko/case-studies/openAI/openai_logo.png delete mode 100644 content/ko/case-studies/peardeck/index.html delete mode 100644 content/ko/case-studies/peardeck/peardeck_featured.png delete mode 100644 content/ko/case-studies/peardeck/peardeck_logo.png delete mode 100644 content/ko/case-studies/pearson/index.html delete mode 100644 content/ko/case-studies/pearson/pearson_featured.png delete mode 100644 content/ko/case-studies/pearson/pearson_logo.png delete mode 100644 content/ko/case-studies/pinterest/index.html delete mode 100644 content/ko/case-studies/pinterest/pinterest_feature.png delete mode 100644 content/ko/case-studies/pinterest/pinterest_logo.png delete mode 100644 content/ko/case-studies/slingtv/index.html delete mode 100644 content/ko/case-studies/slingtv/slingtv_featured_logo.png delete mode 100644 content/ko/case-studies/squarespace/index.html delete mode 100644 content/ko/case-studies/squarespace/squarespace_featured_logo.png delete mode 100644 content/ko/case-studies/wikimedia/index.html delete mode 100644 content/ko/case-studies/wikimedia/wikimedia_featured.png delete mode 100644 content/ko/case-studies/wikimedia/wikimedia_logo.png delete mode 100644 content/ko/case-studies/wink/index.html delete mode 100644 content/ko/case-studies/wink/wink_featured.png delete mode 100644 content/ko/case-studies/wink/wink_logo.png delete mode 100644 content/ko/case-studies/workiva/index.html delete mode 100644 content/ko/case-studies/workiva/workiva_featured_logo.png delete mode 100644 content/ko/case-studies/yahoo-japan/index.html delete mode 100644 content/ko/case-studies/yahoo-japan/yahooJapan_logo.png delete mode 100644 content/ko/case-studies/ygrene/index.html delete mode 100644 content/ko/case-studies/ygrene/ygrene_featured_logo.png delete mode 100644 content/ko/case-studies/zalando/index.html delete mode 100644 content/ko/case-studies/zalando/zalando_feature_logo.png diff --git a/content/ko/case-studies/adform/adform_featured_logo.png b/content/ko/case-studies/adform/adform_featured_logo.png deleted file mode 100644 index 7e3be727e39e676c4039d3d7e4fa5fff3de0ebe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7830 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 diff --git a/content/ko/case-studies/adform/index.html b/content/ko/case-studies/adform/index.html deleted file mode 100644 index 1de43d0637..0000000000 --- a/content/ko/case-studies/adform/index.html +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: Adform Case Study -linkTitle: Adform -case_study_styles: true -cid: caseStudies -logo: adform_featured_logo.png -draft: false -featured: true -weight: 47 -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. - -new_case_study_styles: true -heading_background: /images/case-studies/adform/banner1.jpg -heading_title_logo: /images/adform_logo.png -subheading: > - Improving Performance and Morale with Cloud Native -case_study_details: - - Company: AdForm - - Location: Copenhagen, Denmark - - Industry: Adtech ---- - -<h2>Challenge</h2> - -<p><a href="https://site.adform.com/">Adform's</a> mission is to provide a secure and transparent full stack of advertising technology to enable digital ads across devices. The company has a large infrastructure: <a href="https://www.openstack.org/">OpenStack</a>-based private clouds running on 1,100 physical servers in 7 data centers around the world, 3 of which were opened in the past year. With the company's growth, the infrastructure team felt that "our private cloud was not really flexible enough," says IT System Engineer Edgaras Apšega. "The biggest pain point is that our developers need to maintain their virtual machines, so rolling out technology and new software takes time. We were really struggling with our releases, and we didn't have self-healing infrastructure."</p> - -<h2>Solution</h2> - -<p>The team, which had already been using <a href="https://prometheus.io/">Prometheus</a> for monitoring, embraced <a href="https://kubernetes.io/">Kubernetes</a> and cloud native practices in 2017. "To start our Kubernetes journey, we had to adapt all our software, so we had to choose newer frameworks," says Apšega. "We also adopted the microservices way, so observability is much better because you can inspect the bug or the services separately."</p> - -<h2>Impact</h2> - -<p>"Kubernetes helps our business a lot because our features are coming to market faster," says Apšega. The release process went from several hours to several minutes. Autoscaling has been at least 6 times faster than the semi-manual VM bootstrapping and application deployment required before. The team estimates that the company has experienced cost savings of 4-5x due to less hardware and fewer man hours needed to set up the hardware and virtual machines, metrics, and logging. Utilization of the hardware resources has been reduced as well, with containers notching 2-3 times more efficiency over virtual machines. "The deployments are very easy because developers just push the code and it automatically appears on Kubernetes," says Apšega. Prometheus has also had a positive impact: "It provides high availability for metrics and alerting. We monitor everything starting from hardware to applications. Having all the metrics in <a href="https://grafana.com/">Grafana</a> dashboards provides great insight on your systems."</p> - -{{< case-studies/quote author="Edgaras Apšega, IT Systems Engineer, Adform" >}} -"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-studies/quote >}} - -{{< case-studies/lead >}} -Adform made <a href="https://www.wsj.com/articles/fake-ad-operation-used-to-steal-from-publishers-is-uncovered-1511290981">headlines</a> last year when it detected the HyphBot ad fraud network that was costing some businesses hundreds of thousands of dollars a day. -{{< /case-studies/lead >}} - -<p>With its mission to provide a secure and transparent full stack of advertising technology to enable an open internet, Adform published a <a href="https://site.adform.com/media/85132/hyphbot_whitepaper_.pdf">white paper</a> revealing what it did—and others could too—to limit customers' exposure to the scam.</p> - -<p>In that same spirit, Adform is sharing its cloud native journey. "When you see that everyone shares their best practices, it inspires you to contribute back to the project," says IT Systems Engineer Edgaras Apšega.</p> - -<p>The company has a large infrastructure: <a href="https://www.openstack.org/">OpenStack</a>-based private clouds running on 1,100 physical servers in their own seven data centers around the world, three of which were opened in the past year. With the company's growth, the infrastructure team felt that "our private cloud was not really flexible enough," says Apšega. "The biggest pain point is that our developers need to maintain their virtual machines, so rolling out technology and new software really takes time. We were really struggling with our releases, and we didn't have self-healing infrastructure."</p> - -{{< case-studies/quote - image="/images/case-studies/adform/banner3.jpg" - author="Edgaras Apšega, IT Systems Engineer, Adform" ->}} -"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." -{{< /case-studies/quote >}} - -<p>The team, which had already been using Prometheus for monitoring, embraced Kubernetes, microservices, and cloud native practices. "The fact that Cloud Native Computing Foundation incubated Kubernetes was a really big point for us because it was vendor neutral," says Apšega. "And we can see that a community really gathers around it."</p> - -<p>A proof of concept project was started, with a Kubernetes cluster running on bare metal in the data center. When developers saw how quickly containers could be spun up compared to the virtual machine process, "they wanted to ship their containers in production right away, and we were still doing proof of concept," says IT Systems Engineer Andrius Cibulskis.</p> - -<p>Of course, a lot of work still had to be done. "First of all, we had to learn Kubernetes, see all of the moving parts, how they glue together," says Apšega. "Second of all, the whole CI/CD part had to be redone, and our DevOps team had to invest more man hours to implement it. And third is that developers had to rewrite the code, and they're still doing it."</p> - -<p>The first production cluster was launched in the spring of 2018, and is now up to 20 physical machines dedicated for pods throughout three data centers, with plans for separate clusters in the other four data centers. The user-facing Adform application platform, data distribution platform, and back ends are now all running on Kubernetes. "Many APIs for critical applications are being developed for Kubernetes," says Apšega. "Teams are rewriting their applications to .NET core, because it supports containers, and preparing to move to Kubernetes. And new applications, by default, go in containers."</p> - -{{< case-studies/quote - image="/images/case-studies/adform/banner4.jpg" - author="Andrius Cibulskis, IT Systems Engineer, Adform" ->}} -"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." -{{< /case-studies/quote >}} - -<p>This big push has been driven by the real impact that these new practices have had. "Kubernetes helps our business a lot because our features are coming to market faster," says Apšega. "The deployments are very easy because developers just push the code and it automatically appears on Kubernetes." The release process went from several hours to several minutes. Autoscaling is at least six times faster than the semi-manual VM bootstrapping and application deployment required before.</p> - -<p>The team estimates that the company has experienced cost savings of 4-5x due to less hardware and fewer man hours needed to set up the hardware and virtual machines, metrics, and logging. Utilization of the hardware resources has been reduced as well, with containers notching two to three times more efficiency over virtual machines.</p> - -<p>Prometheus has also had a positive impact: "It provides high availability for metrics and alerting," says Apšega. "We monitor everything starting from hardware to applications. Having all the metrics in Grafana dashboards provides great insight on our systems."</p> - -{{< case-studies/quote author="Edgaras Apšega, IT Systems Engineer, Adform" >}} -"I think that our company just started our cloud native journey. It seems like a huge road ahead, but we're really happy that we joined it." -{{< /case-studies/quote >}} - -<p>All of these benefits have trickled down to individual team members, whose working lives have been changed for the better. "They used to have to get up at night to re-start some services, and now Kubernetes handles all of that," says Apšega. Adds Cibulskis: "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." Even the security teams have been impacted. "Security teams are always not happy," says Apšega, "and now they're happy because they can easily inspect the containers."</p> - -<p>The company plans to remain in the data centers for now, "mostly because we want to keep all the data, to not share it in any way," says Cibulskis, "and it's cheaper at our scale." But, Apšega says, the possibility of using a hybrid cloud for computing is intriguing: "One of the projects we're interested in is the <a href="https://github.com/virtual-kubelet/virtual-kubelet">Virtual Kubelet</a> that lets you spin up the working nodes on different clouds to do some computing."</p> - -<p>Apšega, Cibulskis and their colleagues are keeping tabs on how the cloud native ecosystem develops, and are excited to contribute where they can. "I think that our company just started our cloud native journey," says Apšega. "It seems like a huge road ahead, but we're really happy that we joined it."</p> diff --git a/content/ko/case-studies/amadeus/amadeus_featured.png b/content/ko/case-studies/amadeus/amadeus_featured.png deleted file mode 100644 index d23d7b0163854a5da1da707c3c4aee2f43a594a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6970 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 E2e!!Rvj6}9 diff --git a/content/ko/case-studies/amadeus/amadeus_logo.png b/content/ko/case-studies/amadeus/amadeus_logo.png deleted file mode 100644 index 6191c7f6819f2c325bf843e85d63a35a2f4ff6ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19562 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 diff --git a/content/ko/case-studies/amadeus/index.html b/content/ko/case-studies/amadeus/index.html deleted file mode 100644 index bd647003ec..0000000000 --- a/content/ko/case-studies/amadeus/index.html +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: Amadeus Case Study -case_study_styles: true -cid: caseStudies - -new_case_study_styles: true -heading_background: /images/case-studies/amadeus/banner1.jpg -heading_title_logo: /images/amadeus_logo.png -subheading: > - Another Technical Evolution for a 30-Year-Old Company -case_study_details: - - Company: Amadeus IT Group - - Location: Madrid, Spain - - Industry: Travel Technology ---- - -<h2>Challenge</h2> - -<p>In the past few years, Amadeus, which provides IT solutions to the travel industry around the world, found itself in need of a new platform for the 5,000 services supported by its service-oriented architecture. The 30-year-old company operates its own data center in Germany, and there were growing demands internally and externally for solutions that needed to be geographically dispersed. And more generally, "we had objectives of being even more highly available," says Eric Mountain, Senior Expert, Distributed Systems at Amadeus. Among the company's goals: to increase automation in managing its infrastructure, optimize the distribution of workloads, use data center resources more efficiently, and adopt new technologies more easily.</p> - -<h2>Solution</h2> - -<p>Mountain has been overseeing the company's migration to <a href="http://kubernetes.io/">Kubernetes</a>, using <a href="https://www.openshift.org/">OpenShift</a> Container Platform, <a href="https://www.redhat.com/en">Red Hat</a>'s enterprise container platform.</p> - -<h2>Impact</h2> - -<p>One of the first projects the team deployed in Kubernetes was the Amadeus Airline Cloud Availability solution, which helps manage ever-increasing flight-search volume. "It's now handling in production several thousand transactions per second, and it's deployed in multiple data centers throughout the world," says Mountain. "It's not a migration of an existing workload; it's a whole new workload that we couldn't have done otherwise. [This platform] gives us access to market opportunities that we didn't have before."</p> - -{{< case-studies/quote author="Eric Mountain, Senior Expert, Distributed Systems at Amadeus IT Group" >}} -"We want multi-data center capabilities, and we want them for our mainstream system as well. We didn't think that we could achieve them with our existing system. We need new automation, things that Kubernetes and OpenShift bring." -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -In his two decades at Amadeus, Eric Mountain has been the migrations guy. -{{< /case-studies/lead >}} - -<p>Back in the day, he worked on the company's move from Unix to Linux, and now he's overseeing the journey to cloud native. "Technology just keeps changing, and we embrace it," he says. "We are celebrating our 30 years this year, and we continue evolving and innovating to stay cost-efficient and enhance everyone's travel experience, without interrupting workflows for the customers who depend on our technology."</p> - -<p>That was the challenge that Amadeus—which provides IT solutions to the travel industry around the world, from flight searches to hotel bookings to customer feedback—faced in 2014. The technology team realized it was in need of a new platform for the 5,000 services supported by its service-oriented architecture.</p> - -<p>The tipping point occurred when they began receiving many requests, internally and externally, for solutions that needed to be geographically outside the company's main data center in Germany. "Some requests were for running our applications on customer premises," Mountain says. "There were also new services we were looking to offer that required response time to the order of a few hundred milliseconds, which we couldn't achieve with transatlantic traffic. Or at least, not without eating into a considerable portion of the time available to our applications for them to process individual queries."</p> - -<p>More generally, the company was interested in leveling up on high availability, increasing automation in managing infrastructure, optimizing the distribution of workloads and using data center resources more efficiently. "We have thousands and thousands of servers," says Mountain. "These servers are assigned roles, so even if the setup is highly automated, the machine still has a given role. It's wasteful on many levels. For instance, an application doesn't necessarily use the machine very optimally. Virtualization can help a bit, but it's not a silver bullet. If that machine breaks, you still want to repair it because it has that role and you can't simply say, 'Well, I'll bring in another machine and give it that role.' It's not fast. It's not efficient. So we wanted the next level of automation."</p> - -{{< case-studies/quote image="/images/case-studies/amadeus/banner3.jpg" >}} -"We hope that if we build on what others have built, what we do might actually be upstream-able. As Kubernetes and OpenShift progress, we see that we are indeed able to remove some of the additional layers we implemented to compensate for gaps we perceived earlier." -{{< /case-studies/quote >}} - -<p>While mainly a C++ and Java shop, Amadeus also wanted to be able to adopt new technologies more easily. Some of its developers had started using languages like <a href="https://www.python.org/">Python</a> and databases like <a href="https://www.couchbase.com/">Couchbase</a>, but Mountain wanted still more options, he says, "in order to better adapt our technical solutions to the products we offer, and open up entirely new possibilities to our developers." Working with recent technologies and cool new things would also make it easier to attract new talent.</p> - -<p>All of those needs led Mountain and his team on a search for a new platform. "We did a set of studies and proofs of concept over a fairly short period, and we considered many technologies," he says. "In the end, we were left with three choices: build everything on premise, build on top of <a href="http://kubernetes.io/">Kubernetes</a> whatever happens to be missing from our point of view, or go with <a href="https://www.openshift.com/">OpenShift</a> and build whatever remains there."</p> - -<p>The team decided against building everything themselves—though they'd done that sort of thing in the past—because "people were already inventing things that looked good," says Mountain.</p> - -<p>Ultimately, they went with OpenShift Container Platform, <a href="https://www.redhat.com/en">Red Hat</a>'s Kubernetes-based enterprise offering, instead of building on top of Kubernetes because "there was a lot of synergy between what we wanted and the way Red Hat was anticipating going with OpenShift," says Mountain. "They were clearly developing Kubernetes, and developing certain things ahead of time in OpenShift, which were important to us, such as more security."</p> - -<p>The hope was that those particular features would eventually be built into Kubernetes, and, in the case of security, Mountain feels that has happened. "We realize that there's always a certain amount of automation that we will probably have to develop ourselves to compensate for certain gaps," says Mountain. "The less we do that, the better for us. We hope that if we build on what others have built, what we do might actually be upstream-able. As Kubernetes and OpenShift progress, we see that we are indeed able to remove some of the additional layers we implemented to compensate for gaps we perceived earlier."</p> - -{{< case-studies/quote image="/images/case-studies/amadeus/banner4.jpg" >}} -"It's not a migration of an existing workload; it's a whole new workload that we couldn't have done otherwise. [This platform] gives us access to market opportunities that we didn't have before." -{{< /case-studies/quote >}} - -<p>The first project the team tackled was one that they knew had to run outside the data center in Germany. Because of the project's needs, "We couldn't rely only on the built-in Kubernetes service discovery; we had to layer on top of that an extra service discovery level that allows us to load balance at the operation level within our system," says Mountain. They also built a stream dedicated to monitoring, which at the time wasn't offered in the Kubernetes or OpenShift ecosystem. Now that <a href="https://www.prometheus.io/">Prometheus</a> and other products are available, Mountain says the company will likely re-evaluate their monitoring system: "We obviously always like to leverage what Kubernetes and OpenShift can offer." -</p> - -<p>The second project ended up going into production first: the Amadeus Airline Cloud Availability solution, which helps manage ever-increasing flight-search volume and was deployed in public cloud. Launched in early 2016, it is "now handling in production several thousand transactions per second, and it's deployed in multiple data centers throughout the world," says Mountain. "It's not a migration of an existing workload; it's a whole new workload that we couldn't have done otherwise. [This platform] gives us access to market opportunities that we didn't have before."</p> - -<p>Having been through this kind of technical evolution more than once, Mountain has advice on how to handle the cultural changes. "That's one aspect that we can tackle progressively," he says. "We have to go on supplying our customers with new features on our pre-existing products, and we have to keep existing products working. So we can't simply do absolutely everything from one day to the next. And we mustn't sell it that way."</p> - -<p>The first order of business, then, is to pick one or two applications to demonstrate that the technology works. Rather than choosing a high-impact, high-risk project, Mountain's team selected a smaller application that was representative of all the company's other applications in its complexity: "We just made sure we picked something that's complex enough, and we showed that it can be done."</p> - -{{< case-studies/quote >}} -"The bottom line is we want these multi-data center capabilities, and we want them as well for our mainstream system," he says. "And we don't think that we can implement them with our previous system. We need the new automation, homogeneity, and scale that Kubernetes and OpenShift bring." -{{< /case-studies/quote >}} - -<p>Next comes convincing people. "On the operations side and on the R&D side, there will be people who say quite rightly, 'There is a system, and it works, so why change?'" Mountain says. "The only thing that really convinces people is showing them the value." For Amadeus, people realized that the Airline Cloud Availability product could not have been made available on the public cloud with the company's existing system. The question then became, he says, "Do we go into a full-blown migration? Is that something that is justified?"</p> - -<p>"The bottom line is we want these multi-data center capabilities, and we want them as well for our mainstream system," he says. "And we don't think that we can implement them with our previous system. We need the new automation, homogeneity, and scale that Kubernetes and OpenShift bring."</p> - -<p>So how do you get everyone on board? "Make sure you have good links between your R&D and your operations," he says. "Also make sure you're going to talk early on to the investors and stakeholders. Figure out what it is that they will be expecting from you, that will convince them or not, that this is the right way for your company."</p> - -<p>His other advice is simply to make the technology available for people to try it. "Kubernetes and OpenShift Origin are open source software, so there's no complicated license key for the evaluation period and you're not limited to 30 days," he points out. "Just go and get it running." Along with that, he adds, "You've got to be prepared to rethink how you do things. Of course making your applications as cloud native as possible is how you'll reap the most benefits: 12 factors, CI/CD, which is continuous integration, continuous delivery, but also continuous deployment."</p> - -<p>And while they explore that aspect of the technology, Mountain and his team will likely be practicing what he preaches to others taking the cloud native journey. "See what happens when you break it, because it's important to understand the limits of the system," he says. Or rather, he notes, the advantages of it. "Breaking things on Kube is actually one of the nice things about it—it recovers. It's the only real way that you'll see that you might be able to do things."</p> diff --git a/content/ko/case-studies/ancestry/ancestry_featured.png b/content/ko/case-studies/ancestry/ancestry_featured.png deleted file mode 100644 index 6d63daae32139867e33f6fe0d3eb68a36f0c4ded..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21016 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 VgkzT6;7v22p{k>jrF10dzW^=FWhVdt diff --git a/content/ko/case-studies/ancestry/ancestry_logo.png b/content/ko/case-studies/ancestry/ancestry_logo.png deleted file mode 100644 index 5fbade8decbc19b9e913fb9a7f0cd70d9f152ab3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21141 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 diff --git a/content/ko/case-studies/ancestry/index.html b/content/ko/case-studies/ancestry/index.html deleted file mode 100644 index 8cab3c19c6..0000000000 --- a/content/ko/case-studies/ancestry/index.html +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: Ancestry Case Study -case_study_styles: true -cid: caseStudies - -new_case_study_styles: true -heading_background: /images/case-studies/ancestry/banner1.jpg -heading_title_logo: /images/ancestry_logo.png -subheading: > - Digging Into the Past With New Technology -case_study_details: - - Company: Ancestry - - Location: Lehi, Utah - - Industry: Internet Company, Online Services ---- - -<h2>Challenge</h2> - -<p>Ancestry, the global leader in family history and consumer genomics, uses sophisticated engineering and technology to help everyone, everywhere discover the story of what led to them. The company has spent more than 30 years innovating and building products and technologies that at their core, result in real and emotional human responses. <a href="https://www.ancestry.com">Ancestry</a> currently serves more than 2.6 million paying subscribers, holds 20 billion historical records, 90 million family trees and more than four million people are in its AncestryDNA network, making it the largest consumer genomics DNA network in the world. The company's popular website, <a href="https://www.ancestry.com">ancestry.com</a>, has been working with big data long before the term was popularized. The site was built on hundreds of services, technologies and a traditional deployment methodology. "It's worked well for us in the past," says Paul MacKay, software engineer and architect at Ancestry, "but had become quite cumbersome in its processing and is time-consuming. As a primarily online service, we are constantly looking for ways to accelerate to be more agile in delivering our solutions and our products."</p> - -<h2>Solution</h2> - -<p>The company is transitioning to cloud native infrastructure, using <a href="https://www.docker.com">Docker</a> containerization, <a href="https://kubernetes.io">Kubernetes</a> orchestration and <a href="https://prometheus.io">Prometheus</a> for cluster monitoring.</p> - -<h2>Impact</h2> - -<p>"Every single product, every decision we make at Ancestry, focuses on delighting our customers with intimate, sometimes life-changing discoveries about themselves and their families," says MacKay. "As the company continues to grow, the increased productivity gains from using Kubernetes has helped Ancestry make customer discoveries faster. With the move to Dockerization for example, instead of taking between 20 to 50 minutes to deploy a new piece of code, we can now deploy in under a minute for much of our code. We've truly experienced significant time savings in addition to the various features and benefits from cloud native and Kubernetes-type technologies."</p> - -{{< case-studies/quote author="PAUL MACKAY, SOFTWARE ENGINEER AND ARCHITECT AT ANCESTRY" >}} -"At a certain point, you have to step back if you're going to push a new technology and get key thought leaders with engineers within the organization to become your champions for new technology adoption. At training sessions, the development teams were always the ones that were saying, 'Kubernetes saved our time tremendously; it's an enabler. It really is incredible.'" -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -It started with a Shaky Leaf. -{{< /case-studies/lead >}} - -<p>Since its introduction a decade ago, the Shaky Leaf icon has become one of Ancestry's signature features, which signals to users that there's a helpful hint you can use to find out more about your family tree.</p> - -<p>So when the company decided to begin moving its infrastructure to cloud native technology, the first service that was launched on <a href="https://kubernetes.io">Kubernetes</a>, the open source platform for managing application containers across clusters of hosts, was this hint system. Think of it as Amazon's recommended products, but instead of recommending products the company recommends records, stories, or familial connections. "It was a very important part of the site," says Ancestry software engineer and architect Paul MacKay, "but also small enough for a pilot project that we knew we could handle in a very appropriate, secure way."</p> - -<p>And when it went live smoothly in early 2016, "our deployment time for this service literally was cut down from 50 minutes to 2 or 5 minutes," MacKay adds. "The development team was just thrilled because we're focused on supplying a great experience for our customers. And that means features, it means stability, it means all those things that we need for a first-in-class type operation."</p> - -<p>The stability of that Shaky Leaf was a signal for MacKay and his team that their decision to embrace cloud native technologies was the right one for the company. With a private data center, Ancestry built its website (which launched in 1996) on hundreds of services and technologies and a traditional deployment methodology. "It worked well for us in the past, but the sum of the legacy systems became quite cumbersome in its processing and was time-consuming," says MacKay. "We were looking for other ways to accelerate, to be more agile in delivering our solutions and our products."</p> - -{{< case-studies/quote image="/images/case-studies/ancestry/banner3.jpg" >}} -"And when it [Kubernetes] went live smoothly in early 2016, 'our deployment time for this service literally was cut down from 50 minutes to 2 or 5 minutes,' MacKay adds. 'The development team was just thrilled because we're focused on supplying a great experience for our customers. And that means features, it means stability, it means all those things that we need for a first-in-class type operation.'" -{{< /case-studies/quote >}} - -<p>That need led them in 2015 to explore containerization. Ancestry engineers had already been using technology like <a href="https://www.java.com/en/">Java</a> and <a href="https://www.python.org">Python</a> on Linux, so part of the decision was about making the infrastructure more Linux-friendly. They quickly decided that they wanted to go with Docker for containerization, "but it always comes down to the orchestration part of it to make it really work," says MacKay.</p> - -<p>His team looked at orchestration platforms offered by <a href="https://docs.docker.com/compose/">Docker Compose</a>, <a href="http://mesos.apache.org">Mesos</a> and <a href="https://www.openstack.org/software/">OpenStack</a>, and even started to prototype some homegrown solutions. And then they started hearing rumblings of the imminent release of Kubernetes v1.0. "At the forefront, we were looking at the secret store, so we didn't have to manage that all ourselves, the config maps, the methodology of seamless deployment strategy," he says. "We found that how Kubernetes had done their resources, their types, their labels and just their interface was so much further advanced than the other things we had seen. It was a feature fit."</p> - -{{< case-studies/lead >}} -Plus, MacKay says, "I just believed in the confidence that comes with the history that Google has with containerization. So we started out right on the leading edge of it. And we haven't looked back since." -{{< /case-studies/lead >}} - -<p>Which is not to say that adopting a new technology hasn't come with some challenges. "Change is hard," says MacKay. "Not because the technology is hard or that the technology is not good. It's just that people like to do things like they had done [before]. You have the early adopters and you have those who are coming in later. It was a learning experience on both sides."</p> - -<p>Figuring out the best deployment operations for Ancestry was a big part of the work it took to adopt cloud native infrastructure. "We want to make sure the process is easy and also controlled in the manner that allows us the highest degree of security that we demand and our customers demand," says MacKay. "With Kubernetes and other products, there are some good solutions, but a little bit of glue is needed to bring it into corporate processes and governances. It's like having a set of gloves that are generic, but when you really do want to grab something you have to make it so it's customized to you. That's what we had to do."</p> - -<p>Their best practices include allowing their developers to deploy into development stage and production, but then controlling the aspects that need governance and auditing, such as secrets. They found that having one namespace per service is useful for achieving that containment of secrets and config maps. And for their needs, having one container per pod makes it easier to manage and to have a smaller unit of deployment. -</p> - -{{< case-studies/quote image="/images/case-studies/ancestry/banner4.jpg" >}} -"The success of Ancestry's first deployment of the hint system on Kubernetes helped create momentum for greater adoption of the technology." -{{< /case-studies/quote >}} - -<p>With that process established, the time spent on deployment was cut down to under a minute for some services. "As programmers, we have what's called REPL: read, evaluate, print, and loop, but with Kubernetes, we have CDEL: compile, deploy, execute, and loop," says MacKay. "It's a very quick loop back and a great benefit to understand that when our services are deployed in production, they're the same as what we tested in the pre-production environments. The approach of cloud native for Ancestry provides us a better ability to scale and to accommodate the business needs as work loads occur."</p> - -<p>The success of Ancestry's first deployment of the hint system on Kubernetes helped create momentum for greater adoption of the technology. "Engineers like to code, they like to do features, they don't like to sit around waiting for things to be deployed and worrying about scaling up and out and down," says MacKay. "After a while the engineers became our champions. At training sessions, the development teams were always the ones saying, 'Kubernetes saved our time tremendously; it's an enabler; it really is incredible.' Over time, we were able to convince our management that this was a transition that the industry is making and that we needed to be a part of it."</p> - -<p>A year later, Ancestry has transitioned a good number of applications to Kubernetes. "We have many different services that make up the rich environment that [the website] has from both the DNA side and the family history side," says MacKay. "We have front-end stacks, back-end stacks and back-end processing type stacks that are in the cluster."</p> - -<p>The company continues to weigh which services it will move forward to Kubernetes, which ones will be kept as is, and which will be replaced in the future and thus don't have to be moved over. MacKay estimates that the company is "approaching halfway on those features that are going forward. We don't have to do a lot of convincing anymore. It's more of an issue of timing with getting product management and engineering staff the knowledge and information that they need."</p> - -{{< case-studies/quote >}} -"... 'I believe in Kubernetes. I believe in containerization. I think if we can get there and establish ourselves in that world, we will be further along and far better off being agile and all the things we talk about, and it'll go forward.'" -{{< /case-studies/quote >}} - -<p>Looking ahead, MacKay sees Ancestry maximizing the benefits of Kubernetes in 2017. "We're very close to having everything that should be or could be in a Linux-friendly world in Kubernetes by the end of the year," he says, adding that he's looking forward to features such as federation and horizontal pod autoscaling that are currently in the works. "Kubernetes has been very wonderful for us and we continue to ride the wave."</p> - -<p>That wave, he points out, has everything to do with the vibrant Kubernetes community, which has grown by leaps and bounds since Ancestry joined it as an early adopter. "This is just a very rough way of judging it, but on Slack in June 2015, there were maybe 500 on there," MacKay says. "The last time I looked there were maybe 8,500 just on the Slack channel. There are so many major companies and different kinds of companies involved now. It's the variety of contributors, the number of contributors, the incredibly competent and friendly community."</p> - -<p>As much as he and his team at Ancestry have benefited from what he calls "the goodness and the technical abilities of many" in the community, they've also contributed information about best practices, logged bug issues and participated in the open source conversation. And they've been active in attending <a href="https://www.meetup.com/Utah-Kubernetes-Meetup/">meetups</a> to help educate and give back to the local tech community in Utah. Says MacKay: "We're trying to give back as far as our experience goes, rather than just code."</p> - -<p>When he meets with companies considering adopting cloud native infrastructure, the best advice he has to give from Ancestry's Kubernetes journey is this: "Start small, but with hard problems," he says. And "you need a patron who understands the vision of containerization, to help you tackle the political as well as other technical roadblocks that can occur when change is needed."</p> - -<p>With the changes that MacKay's team has led over the past year and a half, cloud native will be part of Ancestry's technological genealogy for years to come. MacKay has been such a champion of the technology that he says people have jokingly accused him of having a Kubernetes tattoo.</p> - -<p>"I really don't," he says with a laugh. "But I'm passionate. I'm not exclusive to any technology; I use whatever I need that's out there that makes us great. If it's something else, I'll use it. But right now I believe in Kubernetes. I believe in containerization. I think if we can get there and establish ourselves in that world, we will be further along and far better off being agile and all the things we talk about, and it'll go forward."</p> - -<p>He pauses. "So, yeah, I guess you can say I'm an evangelist for Kubernetes," he says. "But I'm not getting a tattoo!"</p> diff --git a/content/ko/case-studies/blablacar/blablacar_featured.png b/content/ko/case-studies/blablacar/blablacar_featured.png deleted file mode 100644 index cfe37257b99e73fefe25b5f6fd582feafd6dff07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7867 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 Znv!~+sS3n9_Rlz3QTB~YiPSsa{{ohc>AnB} diff --git a/content/ko/case-studies/blablacar/blablacar_logo.png b/content/ko/case-studies/blablacar/blablacar_logo.png deleted file mode 100644 index 14606e036002ed9ad34469a06a8ed39f86e41d71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7841 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 diff --git a/content/ko/case-studies/blablacar/index.html b/content/ko/case-studies/blablacar/index.html deleted file mode 100644 index e6537a672f..0000000000 --- a/content/ko/case-studies/blablacar/index.html +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: BlaBlaCar Case Study -case_study_styles: true -cid: caseStudies - -new_case_study_styles: true -heading_background: /images/case-studies/blablacar/banner1.jpg -heading_title_logo: /images/blablacar_logo.png -subheading: > - Turning to Containerization to Support Millions of Rideshares -case_study_details: - - Company: BlaBlaCar - - Location: Paris, France - - Industry: Ridesharing Company ---- - -<h2>Challenge</h2> - -<p>The world's largest long-distance carpooling community, <a href="https://www.blablacar.com/">BlaBlaCar</a>, connects 40 million members across 22 countries. The company has been experiencing exponential growth since 2012 and needed its infrastructure to keep up. "When you're thinking about doubling the number of servers, you start thinking, 'What should I do to be more efficient?'" says Simon Lallemand, Infrastructure Engineer at BlaBlaCar. "The answer is not to hire more and more people just to deal with the servers and installation." The team knew they had to scale the platform, but wanted to stay on their own bare metal servers.</p> - -<h2>Solution</h2> - -<p>Opting not to shift to cloud virtualization or use a private cloud on their own servers, the BlaBlaCar team became early adopters of containerization, using the CoreOs runtime <a href="https://coreos.com/rkt">rkt</a>, initially deployed using <a href="https://coreos.com/fleet/docs/latest/launching-containers-fleet.html">fleet</a> cluster manager. Last year, the company switched to <a href="http://kubernetes.io/">Kubernetes</a> orchestration, and now also uses <a href="https://prometheus.io/">Prometheus</a> for monitoring.</p> - -<h2>Impact</h2> - -<p>"Before using containers, it would take sometimes a day, sometimes two, just to create a new service," says Lallemand. "With all the tooling that we made around the containers, copying a new service now is a matter of minutes. It's really a huge gain. We are better at capacity planning in our data center because we have fewer constraints due to this abstraction between the services and the hardware we run on. For the developers, it also means they can focus only on the features that they're developing, and not on the infrastructure."</p> - -{{< case-studies/quote author="Simon Lallemand, Infrastructure Engineer at BlaBlaCar" >}} -"When you're switching to this cloud-native model and running everything in containers, you have to make sure that at any moment you can reboot without any downtime and without losing traffic. [With Kubernetes] our infrastructure is much more resilient and we have better availability than before." -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -For the 40 million users of <a href="https://www.blablacar.com/">BlaBlaCar</a>, it's easy to find strangers headed in the same direction to share rides and costs. You can even choose how much "bla bla" chatter you want from a long-distance ride mate. -{{< /case-studies/lead >}} - -<p>Behind the scenes, though, the infrastructure was falling woefully behind the rider community's exponential growth. Founded in 2006, the company hit its current stride around 2012. "Our infrastructure was very traditional," says Infrastructure Engineer Simon Lallemand, who began working at the company in 2014. "In the beginning, it was a bit chaotic because we had to [grow] fast. But then comes the time when you have to design things to make it manageable."</p> - -<p>By 2015, the company had about 50 bare metal servers. The team was using a <a href="https://www.mysql.com/">MySQL</a> database and <a href="http://php.net/">PHP</a>, but, Lallemand says, "it was a very static way." They also utilized the configuration management system, <a href="https://www.chef.io/chef/">Chef</a>, but had little automation in its process. "When you're thinking about doubling the number of servers, you start thinking, 'What should I do to be more efficient?'" says Lallemand. "The answer is not to hire more and more people just to deal with the servers and installation."</p> - -<p>Instead, BlaBlaCar began its cloud-native journey but wasn't sure which route to take. "We could either decide to go into cloud virtualization or even use a private cloud on our own servers," says Lallemand. "But going into the cloud meant we had to make a lot of changes in our application work, and we were just not ready to make the switch from on premise to the cloud." They wanted to keep the great performance they got on bare metal, so they didn't want to go to virtualization on premise.</p> - -<p>The solution: containerization. This was early 2015 and containers were still relatively new. "It was a bold move at the time," says Lallemand. "We decided that the next servers that we would buy in the new data center would all be the same model, so we could outsource the maintenance of the servers. And we decided to go with containers and with <a href="https://coreos.com/">CoreOS</a> Container Linux as an abstraction for this hardware. It seemed future-proof to go with containers because we could see what companies were already doing with containers."</p> - -{{< case-studies/quote image="/images/case-studies/blablacar/banner3.jpg">}} -"With all the tooling that we made around the containers, copying a new service is a matter of minutes. It's a huge gain. For the developers, it means they can focus only on the features that they're developing and not on the infrastructure or the hour they would test their code, or the hour that it would get deployed." -{{< /case-studies/quote >}} - -<p>Next, they needed to choose a runtime for the containers, but "there were very few deployments in production at that time," says Lallemand. They experimented with <a href="https://www.docker.com/">Docker</a> but decided to go with <a href="https://coreos.com/rkt">rkt</a>. Lallemand explains that for BlaBlaCar, it was "much simpler to integrate things that are on rkt." At the time, the project was still pre-v1.0, so "we could speak with the developers of rkt and give them feedback. It was an advantage." Plus, he notes, rkt was very stable, even at this early stage.</p> - -<p>Once those decisions were made that summer, the company came up with a plan for implementation. First, they formed a task force to create a workflow that would be tested by three of the 10 members on Lallemand's team. But they took care to run regular workshops with all 10 members to make sure everyone was on board. "When you're focused on your product sometimes you forget if it's really user friendly, whether other people can manage to create containers too," Lallemand says. "So we did a lot of iterations to find a good workflow."</p> - -<p>After establishing the workflow, Lallemand says with a smile that "we had this strange idea that we should try the most difficult thing first. Because if it works, it will work for everything." So the first project the team decided to containerize was the database. "Nobody did that at the time, and there were really no existing tools for what we wanted to do, including building container images," he says. So the team created their own tools, such as <a href="https://github.com/blablacar/dgr">dgr</a>, which builds container images so that the whole team has a common framework to build on the same images with the same standards. They also revamped the service-discovery tools <a href="https://github.com/airbnb/nerve">Nerve</a> and <a href="http://airbnb.io/projects/synapse/">Synapse</a>; their versions, <a href="https://github.com/blablacar/go-nerve">Go-Nerve</a> and <a href="https://github.com/blablacar/go-synapse">Go-Synapse</a>, were written in Go and built to be more efficient and include new features. All of these tools were open-sourced.</p> - -<p>At the same time, the company was working to migrate its entire platform to containers with a deadline set for Christmas 2015. With all the work being done in parallel, BlaBlaCar was able to get about 80 percent of its production into containers by its deadline with live traffic running on containers during December. (It's now at 100 percent.) "It's a really busy time for traffic," says Lallemand. "We knew that by using those new servers with containers, it would help us handle the traffic."</p> - -<p>In the middle of that peak season for carpooling, everything worked well. "The biggest impact that we had was for the deployment of new services," says Lallemand. "Before using containers, we had to first deploy a new server and create configurations with Chef. It would take sometimes a day, sometimes two, just to create a new service. And with all the tooling that we made around the containers, copying a new service is a matter of minutes. So it's really a huge gain. For the developers, it means they can focus only on the features that they're developing and not on the infrastructure or the hour they would test their code, or the hour that it would get deployed."</p> - -{{< case-studies/quote image="/images/case-studies/blablacar/banner4.jpg" >}} -"We realized that there was a really strong community around it [Kubernetes], which meant we would not have to maintain a lot of tools of our own," says Lallemand. "It was better if we could contribute to some bigger project like Kubernetes." -{{< /case-studies/quote >}} - -<p>In order to meet their self-imposed deadline, one of the decisions they made was to not do any "orchestration magic" for containers in the first production alignment. Instead, they used the basic <a href="https://coreos.com/fleet/docs/latest/launching-containers-fleet.html">fleet</a> tool from CoreOS to deploy their containers. (They did build a tool called <a href="https://github.com/blablacar/ggn">GGN</a>, which they've open-sourced, to make it more manageable for their system engineers to use.)</p> - -<p>Still, the team knew that they'd want more orchestration. "Our tool was doing a pretty good job, but at some point you want to give more autonomy to the developer team," Lallemand says. "We also realized that we don't want to be the single point of contact for developers when they want to launch new services." By the summer of 2016, they found their answer in <a href="http://kubernetes.io/">Kubernetes</a>, which had just begun supporting rkt implementation.</p> - -<p>After discussing their needs with their contacts at CoreOS and Google, they were convinced that Kubernetes would work for BlaBlaCar. "We realized that there was a really strong community around it, which meant we would not have to maintain a lot of tools of our own," says Lallemand. "It was better if we could contribute to some bigger project like Kubernetes." They also started using <a href="https://prometheus.io/">Prometheus</a>, as they were looking for "service-oriented monitoring that could be updated nightly." Production on Kubernetes began in December 2016. "We like to do crazy stuff around Christmas," he adds with a laugh.</p> - -<p>BlaBlaCar now has about 3,000 pods, with 1200 of them running on Kubernetes. Lallemand leads a "foundations team" of 25 members who take care of the networks, databases and systems for about 100 developers. There have been some challenges getting to this point. "The rkt implementation is still not 100 percent finished," Lallemand points out. "It's really good, but there are some features still missing. We have questions about how we do things with stateful services, like databases. We know how we will be migrating some of the services; some of the others are a bit more complicated to deal with. But the Kubernetes community is making a lot of progress on that part."</p> - -<p>The team is particularly happy that they're now able to plan capacity better in the company's data center. "We have fewer constraints since we have this abstraction between the services and the hardware we run on," says Lallemand. "If we lose a server because there's a hardware problem on it, we just move the containers onto another server. It's much more efficient. We do that by just changing a line in the configuration file. And with Kubernetes, it should be automatic, so we would have nothing to do."</p> - -{{< case-studies/quote >}} -"If we lose a server because there's a hardware problem on it, we just move the containers onto another server. It's much more efficient. We do that by just changing a line in the configuration file. With Kubernetes, it should be automatic, so we would have nothing to do." -{{< /case-studies/quote >}} - -<p>And these advances ultimately trickle down to BlaBlaCar's users. "We have improved availability overall on our website," says Lallemand. "When you're switching to this cloud-native model with running everything in containers, you have to make sure that you can at any moment reboot a server or a data container without any downtime, without losing traffic. So now our infrastructure is much more resilient and we have better availability than before."</p> - -<p>Within BlaBlaCar's technology department, the cloud-native journey has created some profound changes. Lallemand thinks that the regular meetings during the conception stage and the training sessions during implementation helped. "After that everybody took part in the migration process," he says. "Then we split the organization into different 'tribes'—teams that gather developers, product managers, data analysts, all the different jobs, to work on a specific part of the product. Before, they were organized by function. The idea is to give all these tribes access to the infrastructure directly in a self-service way without having to ask. These people are really autonomous. They have responsibility of that part of the product, and they can make decisions faster."</p> - -<p>This DevOps transformation turned out to be a positive one for the company's staffers. "The team was very excited about the DevOps transformation because it was new, and we were working to make things more reliable, more future-proof," says Lallemand. "We like doing things that very few people are doing, other than the internet giants."</p> - -<p>With these changes already making an impact, BlaBlaCar is looking to split up more and more of its application into services. "I don't say microservices because they're not so micro," Lallemand says. "If we can split the responsibilities between the development teams, it would be easier to manage and more reliable, because we can easily add and remove services if one fails. You can handle it easily, instead of adding a big monolith that we still have."</p> - -<p>When Lallemand speaks to other European companies curious about what BlaBlaCar has done with its infrastructure, he tells them to come along for the ride. "I tell them that it's such a pleasure to deal with the infrastructure that we have today compared to what we had before," he says. "They just need to keep in mind their real motive, whether it's flexibility in development or reliability or so on, and then go step by step towards reaching those objectives. That's what we've done. It's important not to do technology for the sake of technology. Do it for a purpose. Our focus was on helping the developers."</p> diff --git a/content/ko/case-studies/blackrock/blackrock_featured.png b/content/ko/case-studies/blackrock/blackrock_featured.png deleted file mode 100644 index 3898b88c9fa43c09caea23dd985c1bab1802d986..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6391 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 diff --git a/content/ko/case-studies/blackrock/blackrock_logo.png b/content/ko/case-studies/blackrock/blackrock_logo.png deleted file mode 100644 index 51e914a63b259a76b0239d93c2ce872f7722e941..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6430 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 ImCSJe1$hptGynhq diff --git a/content/ko/case-studies/blackrock/index.html b/content/ko/case-studies/blackrock/index.html deleted file mode 100644 index 725d6bc057..0000000000 --- a/content/ko/case-studies/blackrock/index.html +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: BlackRock Case Study -case_study_styles: true -cid: caseStudies - -new_case_study_styles: true -heading_background: /images/case-studies/blackrock/banner1.jpg -heading_title_logo: /images/blackrock_logo.png -subheading: > - Rolling Out Kubernetes in Production in 100 Days -case_study_details: - - Company: BlackRock - - Location: New York, NY - - Industry: Financial Services ---- - -<h2>Challenge</h2> - -<p>The world's largest asset manager, <a href="https://www.blackrock.com/investing">BlackRock</a> operates a very controlled static deployment scheme, which has allowed for scalability over the years. But in their data science division, there was a need for more dynamic access to resources. "We want to be able to give every investor access to data science, meaning <a href="https://www.python.org">Python</a> notebooks, or even something much more advanced, like a MapReduce engine based on <a href="https://spark.apache.org">Spark</a>," says Michael Francis, a Managing Director in BlackRock's Product Group, which runs the company's investment management platform. "Managing complex Python installations on users' desktops is really hard because everyone ends up with slightly different environments. We have existing environments that do these things, but we needed to make it real, expansive and scalable. Being able to spin that up on demand, tear it down, make that much more dynamic, became a critical thought process for us. It's not so much that we had to solve our main core production problem, it's how do we extend that? How do we evolve?"</p> - -<h2>Solution</h2> - -<p>Drawing from what they learned during a pilot done last year using <a href="https://www.docker.com">Docker</a> environments, Francis put together a cross-sectional team of 20 to build an investor research web app using <a href="https://kubernetes.io">Kubernetes</a> with the goal of getting it into production within one quarter.</p> - -<h2>Impact</h2> - -<p>"Our goal was: How do you give people tools rapidly without having to install them on their desktop?" says Francis. And the team hit the goal within 100 days. Francis is pleased with the results and says, "We're going to use this infrastructure for lots of other application workloads as time goes on. It's not just data science; it's this style of application that needs the dynamism. But I think we're 6-12 months away from making a [large scale] decision. We need to gain experience of running the system in production, we need to understand failure modes and how best to manage operational issues. What's interesting is that just having this technology there is changing the way our developers are starting to think about their future development."</p> - -{{< case-studies/quote author="Michael Francis, Managing Director, BlackRock">}} -"My message to other enterprises like us is you can actually integrate Kubernetes into an existing, well-orchestrated machinery. You don't have to throw out everything you do. And using Kubernetes made a complex problem significantly easier." -{{< /case-studies/quote >}} - -<p>One of the management objectives for BlackRock's Product Group employees in 2017 was to "build cool stuff." Led by Managing Director Michael Francis, a cross-sectional group of 20 did just that: They rolled out a full production Kubernetes environment and released a new investor research web app on it. In 100 days.</p> - -<p>For a company that's the world's largest asset manager, "just equipment procurement can take 100 days sometimes, let alone from inception to delivery," says Karl Wieman, a Senior System Administrator. "It was an aggressive schedule. But it moved the dial." In fact, the project achieved two goals: It solved a business problem (creating the needed web app) as well as provided real-world, in-production experience with Kubernetes, a cloud-native technology that the company was eager to explore. "It's not so much that we had to solve our main core production problem, it's how do we extend that? How do we evolve?" says Francis. The ultimate success of this project, beyond delivering the app, lies in the fact that "we've managed to integrate a radically new thought process into a controlled infrastructure that we didn't want to change."</p> - -<p>After all, in its three decades of existence, BlackRock has "a very well-established environment for managing our compute resources," says Francis. "We manage large cluster processes on machines, so we do a lot of orchestration and management for our main production processes in a way that's very cloudish in concept. We're able to manage them in a very controlled, static deployment scheme, and that has given us a huge amount of scalability."</p> - -<p>Though that works well for the core production, the company has found that some data science workloads require more dynamic access to resources. "It's a very bursty process," says Francis, who is head of data for the company's Aladdin investment management platform division.</p> - -<p>Aladdin, which connects the people, information and technology needed for money management in real time, is used internally and is also sold as a platform to other asset managers and insurance companies. "We want to be able to give every investor access to data science, meaning <a href="https://www.python.org">Python</a> notebooks, or even something much more advanced, like a MapReduce engine based on <a href="https://spark.apache.org">Spark</a>," says Francis. But "managing complex Python installations on users' desktops is really hard because everyone ends up with slightly different environments. Docker allows us to flatten that environment."</p> - -{{< case-studies/quote image="/images/case-studies/blackrock/banner3.jpg">}} -"We manage large cluster processes on machines, so we do a lot of orchestration and management for our main production processes in a way that's very cloudish in concept. We're able to manage them in a very controlled, static deployment scheme, and that has given us a huge amount of scalability." -{{< /case-studies/quote >}} - -<p>Still, challenges remain. "If you have a shared cluster, you get this storming herd problem where everyone wants to do the same thing at the same time," says Francis. "You could put limits on it, but you'd have to build an infrastructure to define limits for our processes, and the Python notebooks weren't really designed for that. We have existing environments that do these things, but we needed to make it real, expansive, and scalable. Being able to spin that up on demand, tear it down, and make that much more dynamic, became a critical thought process for us."</p> - -<p>Made up of managers from technology, infrastructure, production operations, development and information security, Francis's team was able to look at the problem holistically and come up with a solution that made sense for BlackRock. "Our initial straw man was that we were going to build everything using <a href="https://www.ansible.com">Ansible</a> and run it all using some completely different distributed environment," says Francis. "That would have been absolutely the wrong thing to do. Had we gone off on our own as the dev team and developed this solution, it would have been a very different product. And it would have been very expensive. We would not have gone down the route of running under our existing orchestration system. Because we don't understand it. These guys [in operations and infrastructure] understand it. Having the multidisciplinary team allowed us to get to the right solutions and that actually meant we didn't build anywhere near the amount we thought we were going to end up building."</p> - -<p>In search of a solution in which they could manage usage on a user-by-user level, Francis's team gravitated to Red Hat's <a href="https://www.openshift.com">OpenShift</a> Kubernetes offering. The company had already experimented with other cloud-native environments, but the team liked that Kubernetes was open source, and "we felt the winds were blowing in the direction of Kubernetes long term," says Francis. "Typically we make technology choices that we believe are going to be here in 5-10 years' time, in some form. And right now, in this space, Kubernetes feels like the one that's going to be there." Adds Uri Morris, Vice President of Production Operations: "When you see that the non-Google committers to Kubernetes overtook the Google committers, that's an indicator of the momentum."</p> - -<p>Once that decision was made, the major challenge was figuring out how to make Kubernetes work within BlackRock's existing framework. "It's about understanding how we can operate, manage and support a platform like this, in addition to tacking it onto our existing technology platform," says Project Manager Michael Maskallis. "All the controls we have in place, the change management process, the software development lifecycle, onboarding processes we go through—how can we do all these things?"</p> - -<p>The first (anticipated) speed bump was working around issues behind BlackRock's corporate firewalls. "One of our challenges is there are no firewalls in most open source software," says Francis. "So almost all install scripts fail in some bizarre way, and pulling down packages doesn't necessarily work." The team ran into these types of problems using <a href="/docs/getting-started-guides/minikube/">Minikube</a> and did a few small pushes back to the open source project.</p> - -{{< case-studies/quote image="/images/case-studies/blackrock/banner4.jpg">}} -"Typically we make technology choices that we believe are going to be here in 5-10 years' time, in some form. And right now, in this space, Kubernetes feels like the one that's going to be there." -{{< /case-studies/quote >}} - -<p>There were also questions about service discovery. "You can think of Aladdin as a cloud of services with APIs between them that allows us to build applications rapidly," says Francis. "It's all on a proprietary message bus, which gives us all sorts of advantages but at the same time, how does that play in a third party [platform]?"</p> - -<p>Another issue they had to navigate was that in BlackRock's existing system, the messaging protocol has different instances in the different development, test and production environments. While Kubernetes enables a more DevOps-style model, it didn't make sense for BlackRock. "I think what we are very proud of is that the ability for us to push into production is still incredibly rapid in this [new] infrastructure, but we have the control points in place, and we didn't have to disrupt everything," says Francis. "A lot of the cost of this development was thinking how best to leverage our internal tools. So it was less costly than we actually thought it was going to be."</p> - -<p>The project leveraged tools associated with the messaging bus, for example. "The way that the Kubernetes cluster will talk to our internal messaging platform is through a gateway program, and this gateway program already has built-in checks and throttles," says Morris. "We can use them to control and potentially throttle the requests coming in from Kubernetes's very elastic infrastructure to the production infrastructure. We'll continue to go in that direction. It enables us to scale as we need to from the operational perspective."</p> - -<p>The solution also had to be complementary with BlackRock's centralized operational support team structure. "The core infrastructure components of Kubernetes are hooked into our existing orchestration framework, which means that anyone in our support team has both control and visibility to the cluster using the existing operational tools," Morris explains. "That means that I don't need to hire more people."</p> - -<p>With those points established, the team created a procedure for the project: "We rolled this out first to a development environment, then moved on to a testing environment and then eventually to two production environments, in that sequential order," says Maskallis. "That drove a lot of our learning curve. We have all these moving parts, the software components on the infrastructure side, the software components with Kubernetes directly, the interconnectivity with the rest of the environment that we operate here at BlackRock, and how we connect all these pieces. If we came across issues, we fixed them, and then moved on to the different environments to replicate that until we eventually ended up in our production environment where this particular cluster is supposed to live."</p> - -<p>The team had weekly one-hour working sessions with all the members (who are located around the world) participating, and smaller breakout or deep-dive meetings focusing on specific technical details. Possible solutions would be reported back to the group and debated the following week. "I think what made it a successful experiment was people had to work to learn, and they shared their experiences with others," says Vice President and Software Developer Fouad Semaan. Then, Francis says, "We gave our engineers the space to do what they're good at. This hasn't been top-down."</p> - -{{< case-studies/quote >}} -"The core infrastructure components of Kubernetes are hooked into our existing orchestration framework, which means that anyone in our support team has both control and visibility to the cluster using the existing operational tools. That means that I don't need to hire more people." -{{< /case-studies/quote >}} - -<p>They were led by one key axiom: To stay focused and avoid scope creep. This meant that they wouldn't use features that weren't in the core of Kubernetes and Docker. But if there was a real need, they'd build the features themselves. Luckily, Francis says, "Because of the rapidity of the development, a lot of things we thought we would have to build ourselves have been rolled into the core product. [The package manager<a href="https://helm.sh"> Helm</a> is one example]. People have similar problems."</p> - -<p>By the end of the 100 days, the app was up and running for internal BlackRock users. The initial capacity of 30 users was hit within hours, and quickly increased to 150. "People were immediately all over it," says Francis. In the next phase of this project, they are planning to scale up the cluster to have more capacity.</p> - -<p>Even more importantly, they now have in-production experience with Kubernetes that they can continue to build on—and a complete framework for rolling out new applications. "We're going to use this infrastructure for lots of other application workloads as time goes on. It's not just data science; it's this style of application that needs the dynamism," says Francis. "Is it the right place to move our core production processes onto? It might be. We're not at a point where we can say yes or no, but we felt that having real production experience with something like Kubernetes at some form and scale would allow us to understand that. I think we're 6-12 months away from making a [large scale] decision. We need to gain experience of running the system in production, we need to understand failure modes and how best to manage operational issues."</p> - -<p>For other big companies considering a project like this, Francis says commitment and dedication are key: "We got the signoff from [senior management] from day one, with the commitment that we were able to get the right people. If I had to isolate what makes something complex like this succeed, I would say senior hands-on people who can actually drive it make a huge difference." With that in place, he adds, "My message to other enterprises like us is you can actually integrate Kubernetes into an existing, well-orchestrated machinery. You don't have to throw out everything you do. And using Kubernetes made a complex problem significantly easier."</p> diff --git a/content/ko/case-studies/buffer/buffer_featured.png b/content/ko/case-studies/buffer/buffer_featured.png deleted file mode 100644 index cd6aaba4ca6a0327e3fdc9f43385b4199ff3fccb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5263 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 diff --git a/content/ko/case-studies/buffer/buffer_logo.png b/content/ko/case-studies/buffer/buffer_logo.png deleted file mode 100644 index 1b4b3b7e525d0a796046cdacfaec27aab25cc3e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4791 zcmdT|`9Bl>AE(4}<y`J-j@-92A+wPVhCYmh*<x}x_mwmn=18t3M1<T4Bf=ajH~F{{ z=FBxm&iLrN{*3Pr@AL6^zhB4u`F_4$?{^&B+?0b=h?RkXfy3-3)QaAY)5{Y8GrbPi zu+^bAj94pE2t(z7$SQrn<Ysi&h=HLdne7yLfq{VsX$CdA7wov1^RQY3b~#p$blaDM z2|%kff&ggdz5p8EY1>6duInjtob58vEX670i!_>fb@=t-`mJ%IUhOBzFq_A-#g7z% z+$i=lSo1vEq`%O$$BQKrxRPrN>1X_qQGvMI06A$D$=4|)oG)aahkWt>Z{nxc<HawQ zMXlMXc~8!+u?uQQJ4EdNi|iJ3V-MSE2|~EU$&im0lAXZhWXrcEG06tMubdvQ<mFoz zn|qze=J=1Ot(VtMt=PmqZaJ9ppc373FK#veN=o;dkCWs4)u(BJK)-;I$!w~gdB5f+ zuFeF5t{+Zgk)3#MuK+E2uOUZof7CiNiI$~RLHhjP!FOMZXb|qUN~84YZm;TC{vW!q z?USw6=NEv8HfTMWRS{<<ODyy^+05_QTl-fr{8#@~FBjKYmjq>CWz*VwwVB|G^`lw( zwC`GJaqMNM@L{Nt9T)o(>%pOl`whOMmZmW=K>IHSrkL#70k9&wD0tL>f<4Z}9*4yW zx&l~4{ox2~zjg<X*BnC$(0XO=kQe#8G^8}!=kp|3WBzO4eCye7#nY2%<U69P#*6)p zNzFS3$BRWi9xR8Gk9(CjiB^8fEqf!>zc$<Xwa`tnsk|tg^~RI(XR~3pk9QbYQx4_1 z?^XBD(dn<jUZMKdKWBQUI}~v$^|?5$TC7|?lqG}qBWRYxR4fEN;rxt)oOpEx!(ljy zez_Fr{Mq=9;n@*N_v~n)|C2-LY7v$09aT}u_#0|rw8r8%1x2N1PG*@<@%nG(dKDEM z6Hk8TKVN25%uOhXIuXJ4sf&WOJWEIzc9(;QgGo8h`bk&n=M!432`T~g`ti_D0GH3> znUEDCi{1i3v+o-|+`DlJ$c9yi%R|o*K(_YoMMHHSw!h#lVTYV_-#e}1xg6<;*&emF zsN)5Sv2s_C=Hr2o$I6fuy4oavD5X#mDVc5odf-0{(|MDNDTsT-lZkR~)FF3fZ#MrL zK+>gE+$sqncpxR0CcQsxlIaE+z9LOLIifzlKiW0{tVt<!?n`G~?c}xi=%=>HPn}S% zpCFU5Ox<;O$WeB63&?tW#>i!UKyOP+HK2`=1rZy+U1@XP5ejvCvm@vUB19bixZ1o; zX7i%nGG$KQ|0<V9$Z&_Tv#F4rC+JYQi@5P0HN*<(H@#lfYB1F(pgENcPNIqzz|uq? zAmFxs55jl4TqXbdoo(eqzFEZ$bYaS*0DSA?H*;#bt)qOzcRwSE;8&wBHEpEQ$`)g; z9Tw+BJ_@2aVEdO+?+9HkDI;+j9L=ePANeLM?MTxRRHhBD$Op~I=mpV4%)zUL+jQe_ zU6-Aj_bM*UMjYn!pUkOqYYAQhqqOH3OP+7oaKKhRh>r}8-p)13c8QmtdcZOgf!9#H z(JX+}9ltx6c&HM+wNr41Wk?+Fn)~D|M6=1E%KpQkgTGIzBJMr?-eTM>A}|Pr+<}{? z2EKDQgs<~P7fMo|Jl)~Si3(AJ@GrNI?6hY=isgl{`&+ZK<+@T$XTR6)!trqn7<5+P zlzWH0N5#X^b(IHA6Q8fsn$|0QH|xfe4$7yqrThKA-L;*1Irz=OP;}th%Im;_$$;?( z9goT?T=%2$<4XN{Qa7Wl?`r>(75RJhd#ACW8N2?$1ZvF0AzLGYe$1O>56JIH*X)YT zGZ6}+!8BRy;9AVJTa{)ZPNAzZVJd4W;J3}Ey>+@l9UNCbwkEt$dM@(#CVip!RI~gz zBJy~t<0*?6Chs_DrFDPoeurCLgey{Y^PcM3TBFs^U@dYrvO_5+DbomjZzwCe?rr|h zy-cUb#(;a^u?aw#h(jhP7&G*ydb9q!{rUNrRp*-8YISX2x~z#PaYmEjhsSGWRekZG zQBn(i_pz^vMl3zKz1>jNxx2@wGhtgqw=cCD4(EHt2A4tsPt)|CXzDDVH2WzI-i(&c z?Zr~Uiq&X8yc&LxxlKj5bHjJdJ{j!8^o{uB2J!7(5|%-*fEy1qm=_~gv6}CgXbl~l zdbrv_gYP}<5o@BKb?!KDLsIYROiE8jo@`R5v4eGHw{cdbs9`gVM19@3<9Au`*E!|7 zQ7bQwCC2%7hHA*d;!BJAFv)t1zV$W};Y4>i&Dy+X10z=R?BUl>t{DZ`g|pE%z6Yv4 zh9@JT<;!+blWt_dCY=RjaR_nPAt4|(*xc|x|Ll{#bvBV+KY71d<4gKz$QhlHm8ITm z<?a<w=i}k>WmTV>LPV9uQ*W!d&qxSAvtI2S^7kzlE+|~k5VuagRfuxtS0&AzW7EXI zbK^LA2U_iPnL*J<#NINwkldc^kDOxR+wH#Oi*ksgtoZZ;(8mQt?u$YE6$90PST$Pf zpGY>#GI^FmXNMRGbp=>#v7=TZNlL4Y&a!ScVhNNft!Cb6i03_lmjlwAC7pEKeG@8} z8A|a7)Z4idyROS3<rkR194ECB)u?3svF_~sXmG+H@$k+KmSR*frA9U5nX;-h)0#m% z$a`2qV*u#@ZA1zCDa~3tm7kF|KJ+T36}Rl@2-wktCDT695wEmk$>E?EAFlypG#-P8 zSs&t<FUaV~5>SM$Hhy*f{(xbD&S7?_;B*x|5{)5XYLTQ9+9$6ima<wq8MwSWoJmwB zdk8NPY@@kRLlIlnUJ&6v5qvx3mnA{@{m$kxXt>xSuX@}uEd2oIyOeHgZzYvuTY!Qm z-TDQ)bbUK25%po=Hdq^LTfSB-;_uz9`CK$`0`rh+aEHWO-?b1tb8R`RV~WMN%>ddn zBA4;H2tvJkfsBH3wQwZ_5+6}t-FaF#Xu`50I6u{`gnJwe1`2lm;?nUl2;QEnho`K2 zHm$zX`P^%wR3lP8f$TW4bWKvsM7-Ay;J;j@lfnqHh8mSJC`9`Ka}uSQ5_g^6STg^& zzAC_GxuYdAzC61>?qs+@k7gO%!o0eM77qS5Klrj|{Q?6dG{BZqW>K8F{aW7;y24$H zk}B`?gAe#dW&!fr=<9N2ifTMdb0Jx$a>uEG%ad+-`qOkmDYE$Ue2945r4<*2%+FC* zS(?+O#rV3kXmV1VcTVBbDpLeAzcKCIwL73v55&zPOEbh(1tvx460gCK(b#<-{oeOT z(XyxODW&9*3i|OKgtCsq-uO$Lz0-UtrON8j%_rn@cD!;)k48e}S2N`AZGImIvkVGS ziE2#ft?Oob4mh_#5JyM+-1J8gZg%v{F;un`@6OVEiMf;q$_OxMQR!Z&|L$G8&SxZC zJDtc?J4}vlif0?drFVR){=!>>eEJiBXIG35kU9yX3(8LKd&Vlukr2=w+O_Yk#VQ)L z{+Rvczc`-euzO`ox(<0E`2s@e=Pz}I>X%0X$7rzkjW(JuBO(ccyoaSb`TBrAWr=qH zb=E$8b@<@jkyGwY7$2YUo{6=sA7jSre|ZXj)OgdAu_U`II2g$C7@uf+bK4}iNEe%o z0Vos2zq@98c|ua-JI{{<2g8JLX3*t9uGv1#L5C*n=A2`Q&GkzfZ$$DSqH3y|mC<gl z%^9H<J$(Xc@E2a04+7<<)#5*fDGdCSB-SdJR!F7U!-M=_B}xugpCOyskU;*9Heyl& z2B0XAt#+v!x?v*hh2D~))@}O(;(RYyzWC@|%4>Kr>S$Z2pCKQv6JEHnq~u%Hu^2LT z1b024#JS2gB<S!!a3>+-CDN6y1<3hZlIVr>ZF&+q-po;8ghqsStKbP-FML7qNpLnx zZj|N<4sfx3gwbC!s;)oj$r0gl(vW+%jGC;S4@Vkr`@LGDK=E;ye+9%EuNd7RiEeu- z8Z_;f@x%B=uohT4(Kr~to$(;hE?XRVTHm8kMgZnr<;9gxLeDKBr-5-f^0&+4lXkn5 zoLIfS#NIsXH4&y%SMjgCL(W6AU@uE?R=8*-657+`2>)jLT%n6#*^BKf_G{4d;s5QA z$4u6Q?zXdte+<9_TwG{HJRxx@HWC@i+Crm@mdswJCRqW`{`Fj~IqkPMzoK!oANr#U zR_rFog|(1YItq{k#w`B>v}p}Hq)}gaRMs$Ez=8>7m_pBz3;re<t!j~=3JYVdN2yAs zGKi%|N^<$!s|#8(92;&+k<wKg4tW=MZlSAwu&bRd$(<h=O4)VBY)|wh)}$7_QV#Q6 z+sV#pich$Rwn1!<p!+yeqnydUt^XY;hNH3u`bgzh%${Ce%#j$`b$HIGDVErcR-)XB z{~Ig)_a@qFxei})lra(SMm8y}KTv01^|4-jn(w^ZB;xN#8}^jsp$hkoSq<JMnqlS| z!K`%J5Q`yVyRH0GSht|Ra}HBoUIDj^0f>v_TamFGs=<51ruRpl;h1xXzXbEt8z5xR zJ|F6Q4(_D7hk^UDQOL~!_-8(_NYzlWp~9^PXnl3D)p*59wT>4oyql*qiF_-~P*rx> zLPz2vAM*j7Hk3EzFO`O^)%;UhMmoy50MX9aA5#D6>@Nlu8RJA&)3~-ensj-D33VUT zk|7{<)4*k-+pEiq4q(jdOQ5gqtYOQ&S=E&fS)k2@X?9+1pD@kyZF>y79m$4gq)k)^ zUpGim2%5}jcDRsUn=g4Nq5L<yzb~8S<T$UHn<C9=sMVo*P1{52xv%$nMT2)Hf02WL zEO28a$^9o_kELg_%E_=y4(Q&n_7P_Mgpbb>Nn~ahaL!?7>>Pju<1xXdsTbbh1n*s6 zP@O>+X}Vl=S36rqfR)&uy7NVTM|yV1@JNMtur-PcA135moaSOlKDk-k!1bB!o2&Z> z));lOaiB>FOQl)yVr2O8%<I9G>x}0UJR4nm=+7YJH~!UHOP_KRia^@=7x2pj;<uBU zwoIL`imKzwf+U|uOu><BiSGPBTS`nFL0ui*_s~+M(kw^0wol_=IVjYLfC==Hr0fDU zV?POEW)%W(Jslk>R&v6f6L^!t`4Y8eZVp_K)ZSaaolu;;7JDM!N=Me@iZ-9sk<!y0 zq36C9Gp}+V_sCa#vu4)G%}g{;8y|LAPW@0wKIfP%=~;wDQxQGAt;4&Nb!+c|CE_b? z!i8AehL62YkCDEm+-YF9{^2wV<vJ7ImThVBc}2H!=L;w~>(E<UNTCuS%91e9<2$ki zi0i(Axu*tkL3x^(zO|-y9c8DlpqY+KbsPh>V>#PvQ+K4>qa{n29_ABHQ`M?4XsVvg zd*97woH?-Efb!zn!>1m5x%~jIXlkeNaIX6?=6;V@!_OR$NP^!|1N_K~VDnbKlRy8% z4!B$q)eIv+E-d6!51b~J2)x}sP^YNT;#!He9waxgE1oMpWfMefYZji56BV1U{gCXH zs6AG_W7(KKg{vVLSC0aK`LJZZDoVtJjbq5eu$EZyR(T$qnX}*)C5Kv`*V$Lk`oCw! z?B}5IA-5SUgnNyMBN{GRA>N-8ObFsq57YJBkNA>IgY9+?wBuuw8s9(NQ!bk^qw*xF zpOI6SVjSyYyImtWj6kQPOIsbRPY#B^NNaBAq8q+QyTqt7B&al%^ncrlzxC)vZ+lkk zHooQxN<Sl9QkNFD@22pKD>aNk)p+-r>JAq7$5md@6?X%WvCnzxEjg~jl9N-NJs`Y( z4saZtkUzESXRx3!gI$;<eaXCnyU750R&u0@KeF2_2wZL?cAMork03CbIcuN4tEwVt qpZ<=OEk+>o|M<`3uj-PxKa95?+1;z$9sT<?#b5?AhgL$IqyGnlMkE6O diff --git a/content/ko/case-studies/buffer/index.html b/content/ko/case-studies/buffer/index.html deleted file mode 100644 index bcf0896445..0000000000 --- a/content/ko/case-studies/buffer/index.html +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Buffer Case Study -case_study_styles: true -cid: caseStudies - -new_case_study_styles: true -heading_background: /images/case-studies/buffer/banner3.jpg -heading_title_logo: /images/buffer.png -subheading: > - Making Deployments Easy for a Small, Distributed Team -case_study_details: - - Company: Buffer - - Location: Around the World - - Industry: Social Media Technology ---- - -<h2>Challenge</h2> - -<p>With a small but fully distributed team of 80 working across almost a dozen time zones, Buffer—which offers social media management to agencies and marketers—was looking to solve its "classic monolithic code base problem," says Architect Dan Farrelly. "We wanted to have the kind of liquid infrastructure where a developer could create an app and deploy it and scale it horizontally as necessary."</p> - -<h2>Solution</h2> - -<p>Embracing containerization, Buffer moved its infrastructure from Amazon Web Services' Elastic Beanstalk to Docker on AWS, orchestrated with Kubernetes.</p> - -<h2>Impact</h2> - -<p>The new system "leveled up our ability with deployment and rolling out new changes," says Farrelly. "Building something on your computer and knowing that it's going to work has shortened things up a lot. Our feedback cycles are a lot faster now too."</p> - -{{< case-studies/quote author="DAN FARRELLY, BUFFER ARCHITECT" >}} -"It's amazing that we can use the Kubernetes solution off the shelf with our team. And it just keeps getting better. Before we even know that we need something, it's there in the next release or it's coming in the next few months." -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -Dan Farrelly uses a carpentry analogy to explain the problem his company, <a href="https://buffer.com">Buffer</a>, began having as its team of developers grew over the past few years. -{{< /case-studies/lead >}} - -<p>"If you're building a table by yourself, it's fine," the company's architect says. "If you bring in a second person to work on the table, maybe that person can start sanding the legs while you're sanding the top. But when you bring a third or fourth person in, someone should probably work on a different table." Needing to work on more and more different tables led Buffer on a path toward microservices and containerization made possible by Kubernetes.</p> - -<p>Since around 2012, Buffer had already been using <a href="https://aws.amazon.com/elasticbeanstalk/">Elastic Beanstalk</a>, the orchestration service for deploying infrastructure offered by <a href="https://aws.amazon.com">Amazon Web Services</a>. "We were deploying a single monolithic <a href="http://php.net/manual/en/intro-whatis.php">PHP</a> application, and it was the same application across five or six environments," says Farrelly. "We were very much a product-driven company. It was all about shipping new features quickly and getting things out the door, and if something was not broken, we didn't spend too much time on it. If things were getting a little bit slow, we'd maybe use a faster server or just scale up one instance, and it would be good enough. We'd move on."</p> - -<p>But things came to a head in 2016. With the growing number of committers on staff, Farrelly and Buffer's then-CTO, Sunil Sadasivan, decided it was time to re-architect and rethink their infrastructure. "It was a classic monolithic code base problem," says Farrelly.<br><br>Some of the company's team was already successfully using <a href="https://www.docker.com">Docker</a> in their development environment, but the only application running on Docker in production was a marketing website that didn't see real user traffic. They wanted to go further with Docker, and the next step was looking at options for orchestration.</p> - -{{< case-studies/quote image="/images/case-studies/buffer/banner1.jpg" >}} -And all the things Kubernetes did well suited Buffer's needs. "We wanted to have the kind of liquid infrastructure where a developer could create an app and deploy it and scale it horizontally as necessary," says Farrelly. "We quickly used some scripts to set up a couple of test clusters, we built some small proof-of-concept applications in containers, and we deployed things within an hour. We had very little experience in running containers in production. It was amazing how quickly we could get a handle on it [Kubernetes]." -{{< /case-studies/quote >}} - -<p>First they considered <a href="https://mesosphere.com">Mesosphere</a>, <a href="https://dcos.io">DC/OS</a> and <a href="https://aws.amazon.com/ecs/">Amazon Elastic Container Service</a> (which their data systems team was already using for some data pipeline jobs). While they were impressed by these offerings, they ultimately went with Kubernetes. "We run on AWS still, so spinning up, creating services and creating load balancers on demand for us without having to configure them manually was a great way for our team to get into this," says Farrelly. "We didn't need to figure out how to configure this or that, especially coming from a former Elastic Beanstalk environment that gave us an automatically-configured load balancer. I really liked Kubernetes' controls of the command line. It just took care of ports. It was a lot more flexible. Kubernetes was designed for doing what it does, so it does it very well."</p> - -<p>And all the things Kubernetes did well suited Buffer's needs. "We wanted to have the kind of liquid infrastructure where a developer could create an app and deploy it and scale it horizontally as necessary," says Farrelly. "We quickly used some scripts to set up a couple of test clusters, we built some small proof-of-concept applications in containers, and we deployed things within an hour. We had very little experience in running containers in production. It was amazing how quickly we could get a handle on it [Kubernetes]."</p> - -<p>Above all, it provided a powerful solution for one of the company's most distinguishing characteristics: their remote team that's spread across a dozen different time zones. "The people with deep knowledge of our infrastructure live in time zones different from our peak traffic time zones, and most of our product engineers live in other places," says Farrelly. "So we really wanted something where anybody could get a grasp of the system early on and utilize it, and not have to worry that the deploy engineer is asleep. Otherwise people would sit around for 12 to 24 hours for something. It's been really cool to see people moving much faster."</p> - -<p>With a relatively small engineering team—just 25 people, and only a handful working on infrastructure, with the majority front-end developers—Buffer needed "something robust for them to deploy whatever they wanted," says Farrelly. Before, "it was only a couple of people who knew how to set up everything in the old way. With this system, it was easy to review documentation and get something out extremely quickly. It lowers the bar for us to get everything in production. We don't have the big team to build all these tools or manage the infrastructure like other larger companies might."</p> - -{{< case-studies/quote image="/images/case-studies/buffer/banner4.jpg" >}} -"In our old way of working, the feedback loop was a lot longer, and it was delicate because if you deployed something, the risk was high to potentially break something else," Farrelly says. "With the kind of deploys that we built around Kubernetes, we were able to detect bugs and fix them, and get them deployed super fast. The second someone is fixing [a bug], it's out the door." -{{< /case-studies/quote >}} - -<p>To help with this, Buffer developers wrote a deploy bot that wraps the Kubernetes deploy process and can be used by every team. "Before, our data analysts would update, say, a <a href="https://www.python.org">Python</a> analysis script and have to wait for the lead on that team to click the button and deploy it," Farrelly explains. "Now our data analysts can make a change, enter a <a href="https://slack.com">Slack</a> command, '/deploy,' and it goes out instantly. They don't need to wait on these slow turnaround times. They don't even know where it's running; it doesn't matter."</p> - -<p>One of the first applications the team built from scratch using Kubernetes was a new image resizing service. As a social media management tool that allows marketing teams to collaborate on posts and send updates across multiple social media profiles and networks, Buffer has to be able to resize photographs as needed to meet the varying limitations of size and format posed by different social networks. "We always had these hacked together solutions," says Farrelly.</p> - -<p>To create this new service, one of the senior product engineers was assigned to learn Docker and Kubernetes, then build the service, test it, deploy it and monitor it—which he was able to do relatively quickly. "In our old way of working, the feedback loop was a lot longer, and it was delicate because if you deployed something, the risk was high to potentially break something else," Farrelly says. "With the kind of deploys that we built around Kubernetes, we were able to detect bugs and fix them, and get them deployed super fast. The second someone is fixing [a bug], it's out the door."</p> - -<p>Plus, unlike with their old system, they could scale things horizontally with one command. "As we rolled it out," Farrelly says, "we could anticipate and just click a button. This allowed us to deal with the demand that our users were placing on the system and easily scale it to handle it."</p> - -<p>Another thing they weren't able to do before was a canary deploy. This new capability "made us so much more confident in deploying big changes," says Farrelly. "Before, it took a lot of testing, which is still good, but it was also a lot of 'fingers crossed.' And this is something that gets run 800,000 times a day, the core of our business. If it doesn't work, our business doesn't work. In a Kubernetes world, I can do a canary deploy to test it for 1 percent and I can shut it down very quickly if it isn't working. This has leveled up our ability to deploy and roll out new changes quickly while reducing risk."</p> - -{{< case-studies/quote >}} -"If you want to run containers in production, with nearly the power that Google uses internally, this [Kubernetes] is a great way to do that," Farrelly says. "We're a relatively small team that's actually running Kubernetes, and we've never run anything like it before. So it's more approachable than you might think. That's the one big thing that I tell people who are experimenting with it. Pick a couple of things, roll it out, kick the tires on this for a couple of months and see how much it can handle. You start learning a lot this way." -{{< /case-studies/quote >}} - -<p>By October 2016, 54 percent of Buffer's traffic was going through their Kubernetes cluster. "There's a lot of our legacy functionality that still runs alright, and those parts might move to Kubernetes or stay in our old setup forever," says Farrelly. But the company made the commitment at that time that going forward, "all new development, all new features, will be running on Kubernetes."</p> - -<p>The plan for 2017 is to move all the legacy applications to a new Kubernetes cluster, and run everything they've pulled out of their old infrastructure, plus the new services they're developing in Kubernetes, on another cluster. "I want to bring all the benefits that we've seen on our early services to everyone on the team," says Farrelly.</p> - -{{< case-studies/lead >}} -For Buffer's engineers, it's an exciting process. "Every time we're deploying a new service, we need to figure out: OK, what's the architecture? How do these services communicate? What's the best way to build this service?" Farrelly says. "And then we use the different features that Kubernetes has to glue all the pieces together. It's enabling us to experiment as we're learning how to design a service-oriented architecture. Before, we just wouldn't have been able to do it. This is actually giving us a blank white board so we can do whatever we want on it." -{{< /case-studies/lead >}} - -<p>Part of that blank slate is the flexibility that Kubernetes offers should the time come when Buffer may want or need to change its cloud. "It's cloud agnostic so maybe one day we could switch to Google or somewhere else," Farrelly says. "We're very deep in Amazon but it's nice to know we could move away if we need to."</p> - -<p>At this point, the team at Buffer can't imagine running their infrastructure any other way—and they're happy to spread the word. "If you want to run containers in production, with nearly the power that Google uses internally, this [Kubernetes] is a great way to do that," Farrelly says. "We're a relatively small team that's actually running Kubernetes, and we've never run anything like it before. So it's more approachable than you might think. That's the one big thing that I tell people who are experimenting with it. Pick a couple of things, roll it out, kick the tires on this for a couple of months and see how much it can handle. You start learning a lot this way."</p> diff --git a/content/ko/case-studies/capital-one/capitalone_featured_logo.png b/content/ko/case-studies/capital-one/capitalone_featured_logo.png deleted file mode 100644 index f57c7697e36fd06fbd418787ea15eea218bc7692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11306 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 diff --git a/content/ko/case-studies/capital-one/index.html b/content/ko/case-studies/capital-one/index.html deleted file mode 100644 index 7474b71b10..0000000000 --- a/content/ko/case-studies/capital-one/index.html +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Capital One Case Study -case_study_styles: true -cid: caseStudies - -new_case_study_styles: true -heading_background: /images/case-studies/capitalone/banner1.jpg -heading_title_logo: /images/capitalone-logo.png -subheading: > - Supporting Fast Decisioning Applications with Kubernetes -case_study_details: - - Company: Capital One - - Location: McLean, Virginia - - Industry: Retail banking ---- - -<h2>Challenge</h2> - -<p>The team set out to build a provisioning platform for <a href="https://www.capitalone.com/">Capital One</a> applications deployed on AWS that use streaming, big-data decisioning, and machine learning. One of these applications handles millions of transactions a day; some deal with critical functions like fraud detection and credit decisioning. The key considerations: resilience and speed—as well as full rehydration of the cluster from base AMIs.</p> - -<h2>Solution</h2> - -<p>The decision to run <a href="https://kubernetes.io/">Kubernetes</a> "is very strategic for us," says John Swift, Senior Director Software Engineering. "We use Kubernetes as a substrate or an operating system, if you will. There's a degree of affinity in our product development."</p> - -<h2>Impact</h2> - -<p>"Kubernetes is a significant productivity multiplier," says Lead Software Engineer Keith Gasser, adding that to run the platform without Kubernetes would "easily see our costs triple, quadruple what they are now for the amount of pure AWS expense." Time to market has been improved as well: "Now, 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." Deployments increased by several orders of magnitude. Plus, the rehydration/cluster-rebuild process, which took a significant part of a day to do manually, now takes a couple hours with Kubernetes automation and declarative configuration.</p> - -{{< case-studies/quote author="Jamil Jadallah, Scrum Master" >}} -<iframe width="560" height="315" src="https://www.youtube.com/embed/UHVW01ksg-s" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe> -<br> -"With the scalability, the management, the coordination, Kubernetes really empowers us and gives us more time back than we had before." -{{< /case-studies/quote >}} - -<p>As a top 10 U.S. retail bank, Capital One has applications that handle millions of transactions a day. Big-data decisioning—for fraud detection, credit approvals and beyond—is core to the business. To support the teams that build applications with those functions for the bank, the cloud team led by Senior Director Software Engineering John Swift embraced Kubernetes for its provisioning platform. "Kubernetes and its entire ecosystem are very strategic for us," says Swift. "We use Kubernetes as a substrate or an operating system, if you will. There's a degree of affinity in our product development."</p> - -<p>Almost two years ago, the team embarked on this journey by first working with Docker. Then came Kubernetes. "We wanted to put streaming services into Kubernetes as one feature of the workloads for fast decisioning, and to be able to do batch alongside it," says Lead Software Engineer Keith Gasser. "Once the data is streamed and batched, there are so many tool sets in <a href="https://flink.apache.org/">Flink</a> that we use for decisioning. 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."</p> - -{{< case-studies/quote image="/images/case-studies/capitalone/banner3.jpg" >}} -"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." -{{< /case-studies/quote >}} - -<p>In this first year, the impact has already been great. "Time to market is really huge for us," says Gasser. "Especially with fraud, you have to be very nimble in the way you respond to threats in the marketplace—being able to add and push new rules, detect new patterns of behavior, detect anomalies in account and transaction flows." 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."</p> - -<p>Teams now have the tools to be autonomous in their deployments, and as a result, deployments have increased by two orders of magnitude. "And that was with just seven dedicated resources, without needing a whole group sitting there watching everything," says Scrum Master Jamil Jadallah. "That's a huge cost savings. With the scalability, the management, the coordination, Kubernetes really empowers us and gives us more time back than we had before."</p> - -{{< case-studies/quote image="/images/case-studies/capitalone/banner4.jpg" >}} -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." -{{< /case-studies/quote >}} - -<p>Kubernetes has also been a great time-saver for Capital One's required period "rehydration" of clusters from base AMIs. To minimize the attack vulnerability profile for applications in the cloud, "Our entire clusters get rebuilt from scratch periodically, with new fresh instances and virtual server images that are patched with the latest and greatest security patches," says Gasser. This process used to take the better part of a day, and personnel, to do manually. It's now a quick Kubernetes job.</p> - -<p>Savings extend to both capital and operating expenses. "It takes very little to get into Kubernetes because it's all open source," Gasser points out. "We went the DIY route for building our cluster, and we definitely like the flexibility of being able to embrace the latest from the community immediately without waiting for a downstream company to do it. There's capex related to those licenses that we don't have to pay for. Moreover, there's capex savings for us from some of the proprietary software that we get to sunset in our particular domain. So that goes onto our ledger in a positive way as well." (Some of those open source technologies include Prometheus, Fluentd, gRPC, Istio, CNI, and Envoy.)</p> - -{{< case-studies/quote >}} -"If we had to do all of this without Kubernetes, on underlying cloud services, I could easily see our costs triple, quadruple what they are now for the amount of pure AWS expense. That doesn't account for personnel to deploy and maintain all the additional infrastructure." -{{< /case-studies/quote >}} - -<p>And on the opex side, Gasser says, the savings are high. "We run dozens of services, we have scores of pods, many daemon sets, and since we're data-driven, we take advantage of EBS-backed volume claims for all of our stateful services. If we had to do all of this without Kubernetes, on underlying cloud services, I could easily see our costs triple, quadruple what they are now for the amount of pure AWS expense. That doesn't account for personnel to deploy and maintain all the additional infrastructure."</p> - -<p>The team is confident that the benefits will continue to multiply—without a steep learning curve for the engineers being exposed to the new technology. "As we onboard additional tenants in this ecosystem, I think the need for folks to understand Kubernetes may not necessarily go up. In fact, I think it goes down, and that's good," says Gasser. "Because that really demonstrates the scalability of the technology. You start to reap the benefits, and they can concentrate on all the features they need to build for great decisioning in the business— fraud decisions, credit decisions—and not have to worry about, 'Is my AWS server broken? Is my pod not running?'"</p> diff --git a/content/ko/case-studies/crowdfire/crowdfire_featured_logo.png b/content/ko/case-studies/crowdfire/crowdfire_featured_logo.png deleted file mode 100644 index ef84b16ea06c7de72fa288068f309fa91eaa36a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7827 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 M91QwN=6Udc0K2Me2><{9 diff --git a/content/ko/case-studies/crowdfire/index.html b/content/ko/case-studies/crowdfire/index.html deleted file mode 100644 index 98caae2830..0000000000 --- a/content/ko/case-studies/crowdfire/index.html +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: Crowdfire Case Study -case_study_styles: true -cid: caseStudies - -new_case_study_styles: true -heading_background: /images/case-studies/crowdfire/banner1.jpg -heading_title_logo: /images/crowdfire_logo.png -subheading: > - How to Keep Iterating a Fast-Growing App With a Cloud-Native Approach -case_study_details: - - Company: Crowdfire - - Location: Mumbai, India - - Industry: Social Media Software ---- - -<h2>Challenge</h2> - -<p><a href="https://www.crowdfireapp.com/">Crowdfire</a> helps content creators create their content anywhere on the Internet and publish it everywhere else in the right format. Since its launch in 2010, it has grown to 16 million users. The product began as a monolith app running on <a href="https://cloud.google.com/appengine/">Google App Engine</a>, and in 2015, the company began a transformation to microservices running on Amazon Web Services <a href="https://aws.amazon.com/elasticbeanstalk/">Elastic Beanstalk</a>. "It was okay for our use cases initially, but as the number of services, development teams and scale increased, the deploy times, self-healing capabilities and resource utilization started to become problems for us," says Software Engineer Amanpreet Singh, who leads the infrastructure team for Crowdfire.</p> - -<h2>Solution</h2> - -<p>"We realized that we needed a more cloud-native approach to deal with these issues," says Singh. The team decided to implement a custom setup of Kubernetes based on <a href="https://www.terraform.io/">Terraform</a> and <a href="https://www.ansible.com/">Ansible</a>.</p> - -<h2>Impact</h2> - -<p>"Kubernetes has helped us reduce the deployment time from 15 minutes to less than a minute," says Singh. "Due to Kubernetes's self-healing nature, the operations team doesn't need to do any manual intervention in case of a node or pod failure." Plus, he says, "Dev-Prod parity has improved since developers can experiment with options in dev/staging clusters, and when it's finalized, they just commit the config changes in the respective code repositories. These changes automatically get replicated on the production cluster via CI/CD pipelines."</p> - -{{< case-studies/quote author="Amanpreet Singh, Software Engineer at Crowdfire" >}} -"In the 15 months that we've been using Kubernetes, it has been amazing for us. It enabled us to iterate quickly, increase development speed, and continuously deliver new features and bug fixes to our users, while keeping our operational costs and infrastructure management overhead under control." -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -"If you build it, they will come." -{{< /case-studies/lead >}} - -<p>For most content creators, only half of that movie quote may ring true. Sure, platforms like Wordpress, YouTube and Shopify have made it simple for almost anyone to start publishing new content online, but attracting an audience isn't as easy. Crowdfire "helps users publish their content to all possible places where their audience exists," says Amanpreet Singh, a Software Engineer at the company based in Mumbai, India. Crowdfire has gained more than 16 million users—from bloggers and artists to makers and small businesses—since its launch in 2010.</p> - -<p>With that kind of growth—and a high demand from users for new features and continuous improvements—the Crowdfire team struggled to keep up behind the scenes. In 2015, they moved their monolith Java application to Amazon Web Services <a href="https://aws.amazon.com/elasticbeanstalk/">Elastic Beanstalk</a> and started breaking it down into microservices.</p> - -<p>It was a good first step, but the team soon realized they needed to go further down the cloud-native path, which would lead them to Kubernetes. "It was okay for our use cases initially, but as the number of services and development teams increased and we scaled further, deploy times, self-healing capabilities and resource utilization started to become problematic," says Singh, who leads the infrastructure team at Crowdfire. "We realized that we needed a more cloud-native approach to deal with these issues."</p> - -<p>As he looked around for solutions, Singh had a checklist of what Crowdfire needed. "We wanted to keep some things separate so they could be shipped independent of other things; this would help remove blockers and let different teams work at their own pace," he says. "We also make a lot of data-driven decisions, so shipping a feature and its iterations quickly was a must."</p> - -<p>Kubernetes checked all the boxes and then some. "One of the best things was the built-in service discovery," he says. "When you have a bunch of microservices that need to call each other, having internal DNS readily available and service IPs and ports automatically set as environment variables help a lot." Plus, he adds, "Kubernetes's opinionated approach made it easier to get started."</p> - -{{< case-studies/quote image="/images/case-studies/crowdfire/banner3.jpg" >}} -"We realized that we needed a more cloud-native approach to deal with these issues," says Singh. The team decided to implement a custom setup of Kubernetes based on Terraform and Ansible." -{{< /case-studies/quote >}} - -<p>There was another compelling business reason for the cloud-native approach. "In today's world of ever-changing business requirements, using cloud native technology provides a variety of options to choose from—even the ability to run services in a hybrid cloud environment," says Singh. "Businesses can keep services in a region closest to the users, and thus benefit from high-availability and resiliency."</p> - -<p>So in February 2016, Singh set up a test Kubernetes cluster using the kube-up scripts provided. "I explored the features and was able to deploy an application pretty easily," he says. "However, it seemed like a black box since I didn't understand the components completely, and had no idea what the kube-up script did under the hood. So when it broke, it was hard to find the issue and fix it."</p> - -<p>To get a better understanding, Singh dove into the internals of Kubernetes, reading the docs and even some of the code. And he looked to the Kubernetes community for more insight. "I used to stay up a little late every night (a lot of users were active only when it's night here in India) and would try to answer questions on the Kubernetes community Slack from users who were getting started," he says. "I would also follow other conversations closely. I must admit I was able to avoid a lot of issues in our setup because I knew others had faced the same issues."</p> - -<p>Based on the knowledge he gained, Singh decided to implement a custom setup of Kubernetes based on <a href="https://www.terraform.io/">Terraform</a> and <a href="https://www.ansible.com/">Ansible</a>. "I wrote Terraform to launch Kubernetes master and nodes (Auto Scaling Groups) and an Ansible playbook to install the required components," he says. (The company recently switched to using prebaked <a href="http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html">AMIs</a> to make the node bringup faster, and is planning to change its networking layer.)</p> - -{{< case-studies/quote image="/images/case-studies/crowdfire/banner4.jpg" >}} -"Kubernetes helped us reduce the deployment time from 15 minutes to less than a minute. Due to Kubernetes's self-healing nature, the operations team doesn't need to do any manual intervention in case of a node or pod failure." -{{< /case-studies/quote >}} - -<p>First, the team migrated a few staging services from Elastic Beanstalk to the new Kubernetes staging cluster, and then set up a production cluster a month later to deploy some services. The results were convincing. "By the end of March 2016, we established that all the new services must be deployed on Kubernetes," says Singh. "Kubernetes helped us reduce the deployment time from 15 minutes to less than a minute. Due to Kubernetes's self-healing nature, the operations team doesn't need to do any manual intervention in case of a node or pod failure." On top of that, he says, "Dev-Prod parity has improved since developers can experiment with options in dev/staging clusters, and when it's finalized, they just commit the config changes in the respective code repositories. These changes automatically get replicated on the production cluster via CI/CD pipelines. This brings more visibility into the changes being made, and keeping an audit trail."</p> - -<p>Over the next six months, the team worked on migrating all the services from Elastic Beanstalk to Kubernetes, except for the few that were deprecated and would soon be terminated anyway. The services were moved one at a time, and their performance was monitored for two to three days each. Today, "We're completely migrated and we run all new services on Kubernetes," says Singh.</p> - -<p>The impact has been considerable: With Kubernetes, the company has experienced a 90% cost savings on Elastic Load Balancer, which is now only used for their public, user-facing services. Their EC2 operating expenses have been decreased by as much as 50%.</p> - -<p>All 30 engineers at Crowdfire were onboarded at once. "I gave an internal talk where I shared the basic components and demoed the usage of kubectl," says Singh. "Everyone was excited and happy about using Kubernetes. Developers have more control and visibility into their applications running in production now. Most of all, they're happy with the low deploy times and self-healing services."</p> - -<p>And they're much more productive, too. "Where we used to do about 5 deployments per day," says Singh, "now we're doing 30+ production and 50+ staging deployments almost every day."</p> - -{{< case-studies/quote >}} -The impact has been considerable: With Kubernetes, the company has experienced a 90% cost savings on Elastic Load Balancer, which is now only used for their public, user-facing services. Their EC2 operating expenses have been decreased by as much as 50%. -{{< /case-studies/quote >}} - -<p>Singh notes that almost all of the engineers interact with the staging cluster on a daily basis, and that has created a cultural change at Crowdfire. "Developers are more aware of the cloud infrastructure now," he says. "They've started following cloud best practices like better health checks, structured logs to stdout [standard output], and config via files or environment variables."</p> - -<p>With Crowdfire's commitment to Kubernetes, Singh is looking to expand the company's cloud-native stack. The team already uses <a href="https://prometheus.io/">Prometheus</a> for monitoring, and he says he is evaluating <a href="https://linkerd.io/">Linkerd</a> and <a href="https://envoyproxy.github.io/">Envoy Proxy</a> as a way to "get more metrics about request latencies and failures, and handle them better." Other CNCF projects, including <a href="http://opentracing.io/">OpenTracing</a> and <a href="https://grpc.io/">gRPC</a> are also on his radar.</p> - -<p>Singh has found that the cloud-native community is growing in India, too, particularly in Bangalore. "A lot of startups and new companies are starting to run their infrastructure on Kubernetes," he says.</p> - -<p>And when people ask him about Crowdfire's experience, he has this advice to offer: "Kubernetes is a great piece of technology, but it might not be right for you, especially if you have just one or two services or your app isn't easy to run in a containerized environment," he says. "Assess your situation and the value that Kubernetes provides before going all in. If you do decide to use Kubernetes, make sure you understand the components that run under the hood and what role they play in smoothly running the cluster. Another thing to consider is if your apps are 'Kubernetes-ready,' meaning if they have proper health checks and handle termination signals to shut down gracefully."</p> - -<p>And if your company fits that profile, go for it. Crowdfire clearly did—and is now reaping the benefits. "In the 15 months that we've been using Kubernetes, it has been amazing for us," says Singh. "It enabled us to iterate quickly, increase development speed and continuously deliver new features and bug fixes to our users, while keeping our operational costs and infrastructure management overhead under control."</p> diff --git a/content/ko/case-studies/golfnow/golfnow_featured.png b/content/ko/case-studies/golfnow/golfnow_featured.png deleted file mode 100644 index 0b99ac3b8f8f81dd990436b54c08f335dbf40996..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22915 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 diff --git a/content/ko/case-studies/golfnow/golfnow_logo.png b/content/ko/case-studies/golfnow/golfnow_logo.png deleted file mode 100644 index dbeb127b02a270963c61bb29f21dd9f2d9b576c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8858 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 E0r1&*@&Et; diff --git a/content/ko/case-studies/golfnow/index.html b/content/ko/case-studies/golfnow/index.html deleted file mode 100644 index 9e82d90cd1..0000000000 --- a/content/ko/case-studies/golfnow/index.html +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: GolfNow Case Study -case_study_styles: true -cid: caseStudies - -new_case_study_styles: true -heading_background: /images/case-studies/golfnow/banner1.jpg -heading_title_logo: /images/golfnow_logo.png -subheading: > - Saving Time and Money with Cloud Native Infrastructure -case_study_details: - - Company: GolfNow - - Location: Orlando, Florida - - Industry: Golf Industry Technology and Services Provider ---- - -<h2>Challenge</h2> - -<p>A member of the <a href="http://www.nbcunicareers.com/our-businesses/nbc-sports-group">NBC Sports Group</a>, <a href="https://www.golfnow.com/">GolfNow</a> is the golf industry's technology and services leader, managing 10 different products, as well as the largest e-commerce tee time marketplace in the world. As its business began expanding rapidly and globally, GolfNow's monolithic application became problematic. "We kept growing our infrastructure vertically rather than horizontally, and the cost of doing business became problematic," says Sheriff Mohamed, GolfNow's Director, Architecture. "We wanted the ability to more easily expand globally."</p> - -<h2>Solution</h2> - -<p>Turning to microservices and containerization, GolfNow began moving its applications and databases from third-party services to its own clusters running on <a href="https://www.docker.com/">Docker</a> and <a href="http://kubernetes.io/">Kubernetes.</a></p> - -<h2>Impact</h2> - -<p>The results were immediate. While maintaining the same capacity—and beyond, during peak periods—GolfNow saw its infrastructure costs for the first application virtually cut in half.</p> - -{{< case-studies/quote author="SHERIFF MOHAMED, DIRECTOR, ARCHITECTURE AT GOLFNOW" >}} -"With our growth we obviously needed to expand our infrastructure, and we kept growing vertically rather than horizontally. We were basically wasting money and doubling the cost of our infrastructure." -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -It's not every day that you can say you've slashed an operating expense by half. -{{< /case-studies/lead >}} - -<p>But Sheriff Mohamed and Josh Chandler did just that when they helped lead their company, <a href="https://www.golfnow.com/">GolfNow</a>, on a journey from a monolithic to a containerized, cloud native infrastructure managed by Kubernetes.</p> - -<p>A top-performing business within the NBC Sports Group, GolfNow is a technology and services company with the largest tee time marketplace in the world. GolfNow serves 5 million active golfers across 10 different products. In recent years, the business had grown so fast that the infrastructure supporting their giant monolithic application (written in C#.NET and backed by SQL Server database management system) could not keep up. "With our growth we obviously needed to expand our infrastructure, and we kept growing vertically rather than horizontally," says Sheriff, GolfNow's Director, Architecture. "Our costs were growing exponentially. And on top of that, we had to build a Disaster Recovery (DR) environment, which then meant we'd have to copy exactly what we had in our original data center to another data center that was just the standby. We were basically wasting money and doubling the cost of our infrastructure."</p> - -<p>In moving just the first of GolfNow's important applications—a booking engine for golf courses and B2B marketing platform—from third-party services to their own Kubernetes environment, "our bill went down drastically," says Sheriff.</p> - -<p>The path to those stellar results began in late 2014. In order to support GolfNow's global growth, the team decided that the company needed to have multiple data centers and the ability to quickly and easily re-route traffic as needed. "From there we knew that we needed to go in a direction of breaking things apart, microservices, and containerization," says Sheriff. "At the time we were trying to get away from <a href="https://www.microsoft.com/net">C#.NET</a> and <a href="https://www.microsoft.com/en-cy/sql-server/sql-server-2016">SQL Server</a> since it didn't run very well on Linux, where everything container was running smoothly."</p> - -<p>To that end, the team shifted to working with <a href="https://nodejs.org/">Node.js</a>, the open-source, cross-platform JavaScript runtime environment for developing tools and applications, and <a href="https://www.mongodb.com/">MongoDB</a>, the open-source database program. At the time, <a href="https://www.docker.com/">Docker</a>, the platform for deploying applications in containers, was still new. But once the team began experimenting with it, Sheriff says, "we realized that was the way we wanted to go, especially since that's the way the industry is heading."</p> - -{{< case-studies/quote image="/images/case-studies/golfnow/banner3.jpg" >}} -"The team migrated the rest of the application into their Kubernetes cluster. And the impact was immediate: On top of cutting monthly costs by a large percentage, says Sheriff, 'Running at the same capacity and during our peak time, we were able to horizontally grow. Since we were using our VMs more efficiently with containers, we didn't have to pay extra money at all.'" -{{< /case-studies/quote >}} - -<p>GolfNow's dev team ran an "internal, low-key" proof of concept and were won over. "We really liked how easy it was to be able to pass containers around to each other and have them up and running in no time, exactly the way it was running on my machine," says Sheriff. "Because that is always the biggest gripe that Ops has with developers, right? 'It worked on my machine!' But then we started getting to the point of, 'How do we make sure that these things stay up and running?'"</p> - -<p>That led the team on a quest to find the right orchestration system for the company's needs. Sheriff says the first few options they tried were either too heavy or "didn't feel quite right." In late summer 2015, they discovered the just-released <a href="http://kubernetes.io/">Kubernetes</a>, which Sheriff immediately liked for its ease of use. "We did another proof of concept," he says, "and Kubernetes won because of the fact that the community backing was there, built on top of what Google had already done."</p> - -<p>But before they could go with Kubernetes, <a href="http://www.nbc.com/">NBC</a>, GolfNow's parent company, also asked them to comparison shop with another company. Sheriff and his team liked the competing company's platform user interface, but didn't like that its platform would not allow containers to run natively on Docker. With no clear decision in sight, Sheriff's VP at GolfNow, Steve McElwee, set up a three-month trial during which a GolfNow team (consisting of Sheriff and Josh, who's now Lead Architect, Open Platforms) would build out a Kubernetes environment, and a large NBC team would build out one with the other company's platform.</p> - -<p>"We spun up the cluster and we tried to get everything to run the way we wanted it to run," Sheriff says. "The biggest thing that we took away from it is that not only did we want our applications to run within Kubernetes and Docker, we also wanted our databases to run there. We literally wanted our entire infrastructure to run within Kubernetes."</p> - -<p>At the time there was nothing in the community to help them get Kafka and MongoDB clusters running within a Kubernetes and Docker environment, so Sheriff and Josh figured it out on their own, taking a full month to get it right. "Everything started rolling from there," Sheriff says. "We were able to get all our applications connected, and we finished our side of the proof of concept a month in advance. My VP was like, 'Alright, it's over. Kubernetes wins.'"</p> - -<p>The next step, beginning in January 2016, was getting everything working in production. The team focused first on one application that was already written in Node.js and MongoDB. A booking engine for golf courses and B2B marketing platform, the application was already going in the microservice direction but wasn't quite finished yet. At the time, it was running in <a href="https://devcenter.heroku.com/articles/mongohq">Heroku Compose</a> and other third-party services—resulting in a large monthly bill.</p> - -{{< case-studies/quote image="/images/case-studies/golfnow/banner4.jpg" >}} -"'The time I spent actually moving the applications was under 30 seconds! We can move data centers in just incredible amounts of time. If you haven't come from the Kubernetes world you wouldn't believe me.' Sheriff puts it in these terms: 'Before Kubernetes I wasn't sleeping at night, literally. I was woken up all the time, because things were down. After Kubernetes, I've been sleeping at night.'" -{{< /case-studies/quote >}} - -<p>"The goal was to take all of that out and put it within this new platform we've created with Kubernetes on <a href="https://cloud.google.com/compute/">Google Compute Engine (GCE)</a>," says Sheriff. "So we ended up building piece by piece, in parallel, what was out in Heroku and Compose, in our Kubernetes cluster. Then, literally, just switched configs in the background. So in Heroku we had the app running hitting a Compose database. We'd take the config, change it and make it hit the database that was running in our cluster."</p> - -<p>Using this procedure, they were able to migrate piecemeal, without any downtime. The first migration was done during off hours, but to test the limits, the team migrated the second database in the middle of the day, when lots of users were running the application. "We did it," Sheriff says, "and again it was successful. Nobody noticed."</p> - -<p>After three weeks of monitoring to make sure everything was running stable, the team migrated the rest of the application into their Kubernetes cluster. And the impact was immediate: On top of cutting monthly costs by a large percentage, says Sheriff, "Running at the same capacity and during our peak time, we were able to horizontally grow. Since we were using our VMs more efficiently with containers, we didn't have to pay extra money at all."</p> - -<p>Not only were they saving money, but they were also saving time. "I had a meeting this morning about migrating some applications from one cluster to another," says Josh. "I spent about 2 hours explaining the process. The time I spent actually moving the applications was under 30 seconds! We can move data centers in just incredible amounts of time. If you haven't come from the Kubernetes world you wouldn't believe me." Sheriff puts it in these terms: "Before Kubernetes I wasn't sleeping at night, literally. I was woken up all the time, because things were down. After Kubernetes, I've been sleeping at night."</p> - -<p>A small percentage of the applications on GolfNow have been migrated over to the Kubernetes environment. "Our Core Team is rewriting a lot of the .NET applications into <a href="https://www.microsoft.com/net/core">.NET Core</a> [which is compatible with Linux and Docker] so that we can run them within containers," says Sheriff.</p> - -<p>Looking ahead, Sheriff and his team want to spend 2017 continuing to build a whole platform around Kubernetes with <a href="https://github.com/drone/drone">Drone</a>, an open-source continuous delivery platform, to make it more developer-centric. "Now they're able to manage configuration, they're able to manage their deployments and things like that, making all these subteams that are now creating all these microservices, be self sufficient," he says. "So it can pull us away from applications and allow us to just make sure the cluster is running and healthy, and then actually migrate that over to our Ops team."</p> - -{{< case-studies/quote >}} -"Having gone from complete newbies to production-ready in three months, the GolfNow team is eager to encourage other companies to follow their lead. 'This is The Six Million Dollar Man of the cloud right now,' adds Josh. 'Just try it out, watch it happen. I feel like the proof is in the pudding when you look at these kinds of application stacks. They're faster, they're more resilient.'" -{{< /case-studies/quote >}} - -<p>And long-term, Sheriff has an even bigger goal for getting more people into the Kubernetes fold. "We're actually trying to make this platform generic enough so that any of our sister companies can use it if they wish," he says. "Most definitely I think it can be used as a model. I think the way we migrated into it, the way we built it out, are all ways that I think other companies can learn from, and should not be afraid of."</p> - -<p>The GolfNow team is also giving back to the Kubernetes community by open-sourcing a bot framework that Josh built. "We noticed that the dashboard user interface is actually moving a lot faster than when we started," says Sheriff. "However we realized what we needed was something that's more of a bot that really helps us administer Kubernetes as a whole through Slack." Josh explains: "With the Kubernetes-Slack integration, you can essentially hook into a cluster and the issue commands and edit configurations. We've tried to simplify the security configuration as much as possible. We hope this will be our major thank you to Kubernetes, for everything you've given us."</p> - -<p>Having gone from complete newbies to production-ready in three months, the GolfNow team is eager to encourage other companies to follow their lead. The lessons they've learned: "You've got to have buy-in from your boss," says Sheriff. "Another big deal is having two to three people dedicated to this type of endeavor. You can't have people who are half in, half out." And if you don't have buy-in from the get go, proving it out will get you there.</p> - -<p>"This is The Six Million Dollar Man of the cloud right now," adds Josh. "Just try it out, watch it happen. I feel like the proof is in the pudding when you look at these kinds of application stacks. They're faster, they're more resilient."</p> diff --git a/content/ko/case-studies/haufegroup/haufegroup_featured.png b/content/ko/case-studies/haufegroup/haufegroup_featured.png deleted file mode 100644 index 08b09ec9db8b7792d07a9a4d385cbd546d2446ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5841 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 diff --git a/content/ko/case-studies/haufegroup/haufegroup_logo.png b/content/ko/case-studies/haufegroup/haufegroup_logo.png deleted file mode 100644 index 5d8245b0f6d18fcf18d871f7c657716b37f2ef96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5794 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 diff --git a/content/ko/case-studies/haufegroup/index.html b/content/ko/case-studies/haufegroup/index.html deleted file mode 100644 index 580a282683..0000000000 --- a/content/ko/case-studies/haufegroup/index.html +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: Haufe Group Case Study -case_study_styles: true -cid: caseStudies - -new_case_study_styles: true -heading_background: /images/case-studies/haufegroup/banner1.jpg -heading_title_logo: /images/haufegroup_logo.png -subheading: > - Paving the Way for Cloud Native for Midsize Companies -case_study_details: - - Company: Haufe Group - - Location: Freiburg, Germany - - Industry: Media and Software ---- - -<h2>Challenge</h2> - -<p>Founded in 1930 as a traditional publisher, Haufe Group has grown into a media and software company with 95 percent of its sales from digital products. Over the years, the company has gone from having "hardware in the basement" to outsourcing its infrastructure operations and IT. More recently, the development of new products, from Internet portals for tax experts to personnel training software, has created demands for increased speed, reliability and scalability. "We need to be able to move faster," says Solution Architect Martin Danielsson. "Adapting workloads is something that we really want to be able to do."</p> - -<h2>Solution</h2> -<p>Haufe Group began its cloud-native journey when <a href="https://azure.microsoft.com/">Microsoft Azure</a> became available in Europe; the company needed cloud deployments for its desktop apps with bandwidth-heavy download services. "After that, it has been different projects trying out different things," says Danielsson. Two years ago, Holger Reinhardt joined Haufe Group as CTO and rapidly re-oriented the traditional host provider-based approach toward a cloud and API-first strategy.</p> - -<p>A core part of this strategy was a strong mandate to embrace infrastructure-as-code across the entire software deployment lifecycle via Docker. The company is now getting ready to go live with two services in production using <a href="https://kubernetes.io/">Kubernetes</a> orchestration on <a href="https://azure.microsoft.com/">Microsoft Azure</a> and <a href="https://aws.amazon.com/">Amazon Web Services</a>. The team is also working on breaking up one of their core Java Enterprise desktop products into microservices to allow for better evolvability and dynamic scaling in the cloud.</p> - -<h2>Impact</h2> -<p>With the ability to adapt workloads, Danielsson says, teams "will be able to scale down to around half the capacity at night, saving 30 percent of the hardware cost." Plus, shorter release times have had a major impact. "Before, we had to announce at least a week in advance when we wanted to do a release because there was a huge checklist of things that you had to do," he says. "By going cloud native, we have the infrastructure in place to be able to automate all of these things. Now we can get a new release done in half an hour instead of days."</p> - -{{< case-studies/quote author="Martin Danielsson, Solution Architect, Haufe Group" >}} -"Over the next couple of years, people won't even think that much about it when they want to run containers. Kubernetes is going to be the go-to solution." -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -More than 80 years ago, Haufe Group was founded as a traditional publishing company, printing books and commentary on paper. -{{< /case-studies/lead >}} - -<p>By the 1990s, though, the company's leaders recognized that the future was digital, and to their credit, were able to transform Haufe Group into a media and software business that now gets 95 percent of its sales from digital products. "Among the German companies doing this, we were one of the early adopters," says Martin Danielsson, Solution Architect for Haufe Group.</p> - -<p>And now they're leading the way for midsize companies embracing cloud-native technology like Kubernetes. "The really big companies like Ticketmaster and Google get it right, and the startups get it right because they're faster," says Danielsson. "We're in this big lump of companies in the middle with a lot of legacy, a lot of structure, a lot of culture that does not easily fit the cloud technologies. We're just 1,500 people, but we have hundreds of customer-facing applications. So we're doing things that will be relevant for many companies of our size or even smaller."</p> - -<p>Many of those legacy challenges stemmed from simply following the technology trends of the times. "We used to do full DevOps," he says. In the 1990s and 2000s, "that meant that you had your hardware in the basement. And then 10 years ago, the hype of the moment was to outsource application operations, outsource everything, and strip down your IT department to take away the distraction of all these hardware things. That's not our area of expertise. We didn't want to be an infrastructure provider. And now comes the backlash of that."</p> - -<p>Haufe Group began feeling the pain as they were developing more new products, from Internet portals for tax experts to personnel training software, that have created demands for increased speed, reliability and scalability. "Right now, we have this break in workflows, where we go from writing concepts to developing, handing it over to production and then handing that over to your host provider," he says. "And then when things go bad we have no clue what went wrong. We definitely want to take back control, and we want to move a lot faster. Adapting workloads is something that we really want to be able to do."</p> - -<p>Those needs led them to explore cloud-native technology. Their first foray into the cloud was doing deployments in <a href="https://azure.microsoft.com/">Microsoft Azure</a>, once it became available in Europe, for desktop products that had built-in download services. Hosting expenses for such bandwidth-heavy services were too high, so the company turned to the cloud. "After that, it has been different projects trying out different things," says Danielsson.</p> - -{{< case-studies/quote image="/images/case-studies/haufegroup/banner3.jpg" >}} -"We have been doing containers for the last two years, and we really got the hang of how they work," says Danielsson. "But it was always for development and test, never in production, because we didn't fully understand how that would work. And to me, Kubernetes was definitely the technology that solved that." -{{< /case-studies/quote >}} - -<p>Two years ago, Holger Reinhardt joined Haufe Group as CTO and rapidly re-oriented the traditional host provider-based approach toward a cloud and API-first strategy. A core part of this strategy was a strong mandate to embrace infrastructure-as-code across the entire software deployment lifecycle via Docker. Some experiments went further than others; German regulations about sensitive data proved to be a road block in moving some workloads to Azure and Amazon Web Services. "Due to our history, Germany is really strict with things like personally identifiable data," Danielsson says.</p> - -<p>These experiments took on new life with the arrival of the Azure Sovereign Cloud for Germany (an Azure clone run by the German T-Systems provider). With the availability of Azure.de—which conforms to Germany's privacy regulations—teams started to seriously consider deploying production loads in Docker into the cloud. "We have been doing containers for the last two years, and we really got the hang of how they work," says Danielsson. "But it was always for development and test, never in production, because we didn't fully understand how that would work. And to me, Kubernetes was definitely the technology that solved that."</p> - -<p>In parallel, Danielsson had built an API management system with the aim of supporting CI/CD scenarios, aspects of which were missing in off-the-shelf API management products. With a foundation based on <a href="https://getkong.org/">Mashape's Kong</a> gateway, it is open-sourced as <a href="http://wicked.haufe.io/">wicked.haufe.io</a>. He put wicked.haufe.io to use with his product team.<br><br> Otherwise, Danielsson says his philosophy was "don't try to reinvent the wheel all the time. Go for what's there and 99 percent of the time it will be enough. And if you think you really need something custom or additional, think perhaps once or twice again. One of the things that I find so amazing with this cloud-native framework is that everything ties in."</p> - -<p>Currently, Haufe Group is working on two projects using Kubernetes in production. One is a new mobile application for researching legislation and tax laws. "We needed a way to take out functionality from a legacy core and put an application on top of that with an API gateway—a lot of moving parts that screams containers," says Danielsson. So the team moved the build pipeline away from "deploying to some old, huge machine that you could deploy anything to" and onto a Kubernetes cluster where there would be automatic CI/CD "with feature branches and all these things that were a bit tedious in the past."</p> - -{{< case-studies/quote image="/images/case-studies/haufegroup/banner4.jpg" >}} -"Before, we had to announce at least a week in advance when we wanted to do a release because there was a huge checklist of things that you had to do," says Danielsson. "By going cloud native, we have the infrastructure in place to be able to automate all of these things. Now we can get a new release done in half an hour instead of days." -{{< /case-studies/quote >}} - -<p>It was a proof of concept effort, and the proof was in the pudding. "Everyone was really impressed at what we accomplished in a week," says Danielsson. "We did these kinds of integrations just to make sure that we got a handle on how Kubernetes works. If you can create optimism and buzz around something, it's half won. And if the developers and project managers know this is working, you're more or less done." Adds Reinhardt: "You need to create some very visible, quick wins in order to overcome the status quo."</p> - -<p>The impact on the speed of deployment was clear: "Before, we had to announce at least a week in advance when we wanted to do a release because there was a huge checklist of things that you had to do," says Danielsson. "By going cloud native, we have the infrastructure in place to be able to automate all of these things. Now we can get a new release done in half an hour instead of days."</p> - -<p>The potential impact on cost was another bonus. "Hosting applications is quite expensive, so moving to the cloud is something that we really want to be able to do," says Danielsson. With the ability to adapt workloads, teams "will be able to scale down to around half the capacity at night, saving 30 percent of the hardware cost."</p> - -<p>Just as importantly, Danielsson says, there's added flexibility: "When we try to move or rework applications that are really crucial, it's often tricky to validate whether the path we want to take is going to work out well. In order to validate that, we would need to reproduce the environment and really do testing, and that's prohibitively expensive and simply not doable with traditional host providers. Cloud native gives us the ability to do risky changes and validate them in a cost-effective way."</p> - -<p>As word of the two successful test projects spread throughout the company, interest in Kubernetes has grown. "We want to be able to support our developers in running Kubernetes clusters but we're not there yet, so we allow them to do it as long as they're aware that they are on their own," says Danielsson. "So that's why we are also looking at things like [the managed Kubernetes platform] <a href="https://coreos.com/tectonic/">CoreOS Tectonic</a>, <a href="https://azure.microsoft.com/en-us/services/container-service/">Azure Container Service</a>, <a href="https://aws.amazon.com/ecs/">ECS</a>, etc. These kinds of services will be a lot more relevant to midsize companies that want to leverage cloud native but don't have the IT departments or the structure around that."</p> - -<p>In the next year and a half, Danielsson says the company will be working on moving one of their legacy desktop products, a web app for researching legislation and tax laws originally built in Java Enterprise, onto cloud-native technology. "We're doing a microservice split out right now so that we can independently deploy the different parts," he says. The main website, which provides free content for customers, is also moving to cloud native.</p> - -{{< case-studies/quote >}} -"the execution of a strategy requires alignment of culture, structure and technology. Only if those three dimensions are aligned can you successfully execute a transformation into microservices and cloud-native architectures. And it is only then that the Cloud will pay the dividends in much faster speeds in product innovation and much lower operational costs." -{{< /case-studies/quote >}} - -<p>But with these goals, Danielsson believes there are bigger cultural challenges that need to be constantly addressed. The move to new technology, not to mention a shift toward DevOps, means a lot of change for employees. "The roles were rather fixed in the past," he says. "You had developers, you had project leads, you had testers. And now you get into these really, really important things like test automation. Testers aren't actually doing click testing anymore, and they have to write automated testing. And if you really want to go full-blown CI/CD, all these little pieces have to work together so that you get the confidence to do a check in, and know this check in is going to land in production, because if I messed up, some test is going to break. This is a really powerful thing because whatever you do, whenever you merge something into the trunk or to the master, this is going live. And that's where you either get the people or they run away screaming." Danielsson understands that it may take some people much longer to get used to the new ways.</p> - -<p>"Culture is nothing that you can force on people," he says. "You have to live it for yourself. You have to evangelize. You have to show the advantages time and time again: This is how you can do it, this is what you get from it." To that end, his team has scheduled daylong workshops for the staff, bringing in outside experts to talk about everything from API to Devops to cloud.</p> - -<p>For every person who runs away screaming, many others get drawn in. "Get that foot in the door and make them really interested in this stuff," says Danielsson. "Usually it catches on. We have people you never would have expected chanting, 'Docker Docker Docker' now. It's cool to see them realize that there is a world outside of their Python libraries. It's awesome to see them really work with Kubernetes."</p> - -<p>Ultimately, Reinhardt says, "the execution of a strategy requires alignment of culture, structure and technology. Only if those three dimensions are aligned can you successfully execute a transformation into microservices and cloud-native architectures. And it is only then that the Cloud will pay the dividends in much faster speeds in product innovation and much lower operational costs."</p> diff --git a/content/ko/case-studies/huawei/huawei_featured.png b/content/ko/case-studies/huawei/huawei_featured.png deleted file mode 100644 index 22071b4691e3830c0ee3636f04e6aabf02d5fe83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14310 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 Wkvu)p=jJ~*@1(`$#cD(h0{=gHoFJJ1 diff --git a/content/ko/case-studies/huawei/huawei_logo.png b/content/ko/case-studies/huawei/huawei_logo.png deleted file mode 100644 index 94361a27eb5af3a06992dda4aa1b411ab702ee2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14274 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 W@eBhBOaJ+*PEu4>q*h2j@P7e3cUl|( diff --git a/content/ko/case-studies/huawei/index.html b/content/ko/case-studies/huawei/index.html deleted file mode 100644 index ec1cd212f2..0000000000 --- a/content/ko/case-studies/huawei/index.html +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: Huawei Case Study -case_study_styles: true -cid: caseStudies - -new_case_study_styles: true -heading_background: /images/case-studies/huawei/banner1.jpg -heading_title_logo: /images/huawei_logo.png -subheading: > - Embracing Cloud Native as a User – and a Vendor -case_study_details: - - Company: Huawei - - Location: Shenzhen, China - - Industry: Telecommunications Equipment ---- - -<h2>Challenge</h2> - -<p>A multinational company that's the largest telecommunications equipment manufacturer in the world, Huawei has more than 180,000 employees. In order to support its fast business development around the globe, <a href="http://www.huawei.com/">Huawei</a> has eight data centers for its internal I.T. department, which have been running 800+ applications in 100K+ VMs to serve these 180,000 users. With the rapid increase of new applications, the cost and efficiency of management and deployment of VM-based apps all became critical challenges for business agility. "It's very much a distributed system so we found that managing all of the tasks in a more consistent way is always a challenge," says Peixin Hou, the company's Chief Software Architect and Community Director for Open Source. "We wanted to move into a more agile and decent practice."</p> - -<h2>Solution</h2> - -<p>After deciding to use container technology, Huawei began moving the internal I.T. department's applications to run on <a href="http://kubernetes.io/">Kubernetes</a>. So far, about 30 percent of these applications have been transferred to cloud native.</p> - -<h2>Impact</h2> - -<p>"By the end of 2016, Huawei's internal I.T. department managed more than 4,000 nodes with tens of thousands containers using a Kubernetes-based Platform as a Service (PaaS) solution," says Hou. "The global deployment cycles decreased from a week to minutes, and the efficiency of application delivery has been improved 10 fold." For the bottom line, he says, "We also see significant operating expense spending cut, in some circumstances 20-30 percent, which we think is very helpful for our business." Given the results Huawei has had internally – and the demand it is seeing externally – the company has also built the technologies into <a href="http://developer.huawei.com/ict/en/site-paas">FusionStage™</a>, the PaaS solution it offers its customers.</p> - -{{< case-studies/quote author="Peixin Hou, chief software architect and community director for open source" >}} -"If you're a vendor, in order to convince your customer, you should use it yourself. Luckily because Huawei has a lot of employees, we can demonstrate the scale of cloud we can build using this technology." -{{< /case-studies/quote >}} - -<p>Huawei's Kubernetes journey began with one developer. Over two years ago, one of the engineers employed by the networking and telecommunications giant became interested in <a href="http://kubernetes.io/">Kubernetes</a>, the technology for managing application containers across clusters of hosts, and started contributing to its open source community. As the technology developed and the community grew, he kept telling his managers about it.</p> - -<p>And as fate would have it, at the same time, Huawei was looking for a better orchestration system for its internal enterprise I.T. department, which supports every business flow processing. "We have more than 180,000 employees worldwide, and a complicated internal procedure, so probably every week this department needs to develop some new applications," says Peixin Hou, Huawei's Chief Software Architect and Community Director for Open Source. "Very often our I.T. departments need to launch tens of thousands of containers, with tasks running across thousands of nodes across the world. It's very much a distributed system, so we found that managing all of the tasks in a more consistent way is always a challenge."</p> - -<p>In the past, Huawei had used virtual machines to encapsulate applications, but "every time when we start a VM," Hou says, "whether because it's a new service or because it was a service that was shut down because of some abnormal node functioning, it takes a lot of time." Huawei turned to containerization, so the timing was right to try Kubernetes. It took a year to adopt that engineer's suggestion – the process "is not overnight," says Hou – but once in use, he says, "Kubernetes basically solved most of our problems. Before, the time of deployment took about a week, now it only takes minutes. The developers are happy. That department is also quite happy."</p> - -<p>Hou sees great benefits to the company that come with using this technology: "Kubernetes brings agility, scale-out capability, and DevOps practice to the cloud-based applications," he says. "It provides us with the ability to customize the scheduling architecture, which makes possible the affinity between container tasks that gives greater efficiency. It supports multiple container formats. It has extensive support for various container networking solutions and container storage."</p> - -{{< case-studies/quote image="/images/case-studies/huawei/banner3.jpg" >}} -"Kubernetes basically solved most of our problems. Before, the time of deployment took about a week, now it only takes minutes. The developers are happy. That department is also quite happy." -{{< /case-studies/quote >}} - -<p>And not least of all, there's an impact on the bottom line. Says Hou: "We also see significant operating expense spending cut in some circumstances 20-30 percent, which is very helpful for our business."</p> - -<p>Pleased with those initial results, and seeing a demand for cloud native technologies from its customers, Huawei doubled down on Kubernetes. In the spring of 2016, the company became not only a user but also a vendor.</p> - -<p>"We built the Kubernetes technologies into our solutions," says Hou, referring to Huawei's <a href="http://developer.huawei.com/ict/en/site-paas">FusionStage™</a> PaaS offering. "Our customers, from very big telecommunications operators to banks, love the idea of cloud native. They like Kubernetes technology. But they need to spend a lot of time to decompose their applications to turn them into microservice architecture, and as a solution provider, we help them. We've started to work with some Chinese banks, and we see a lot of interest from our customers like <a href="http://www.chinamobileltd.com/">China Mobile</a> and <a href="https://www.telekom.com/en">Deutsche Telekom</a>."</p> - -<p>"If you're just a user, you're just a user," adds Hou. "But if you're a vendor, in order to even convince your customers, you should use it yourself. Luckily because Huawei has a lot of employees, we can demonstrate the scale of cloud we can build using this technology. We provide customer wisdom." While Huawei has its own private cloud, many of its customers run cross-cloud applications using Huawei's solutions. It's a big selling point that most of the public cloud providers now support Kubernetes. "This makes the cross-cloud transition much easier than with other solutions," says Hou.</p> - -{{< case-studies/quote image="/images/case-studies/huawei/banner4.jpg" >}} -"Our customers, from very big telecommunications operators to banks, love the idea of cloud native. They like Kubernetes technology. But they need to spend a lot of time to decompose their applications to turn them into microservice architecture, and as a solution provider, we help them." -{{< /case-studies/quote >}} - -<p>Within Huawei itself, once his team completes the transition of the internal business procedure department to Kubernetes, Hou is looking to convince more departments to move over to the cloud native development cycle and practice. "We have a lot of software developers, so we will provide them with our platform as a service solution, our own product," he says. "We would like to see significant cuts in their iteration cycle."</p> - -<p>Having overseen the initial move to Kubernetes at Huawei, Hou has advice for other companies considering the technology: "When you start to design the architecture of your application, think about cloud native, think about microservice architecture from the beginning," he says. "I think you will benefit from that."</p> - -<p>But if you already have legacy applications, "start from some microservice-friendly part of those applications first, parts that are relatively easy to be decomposed into simpler pieces and are relatively lightweight," Hou says. "Don't think from day one that within how many days I want to move the whole architecture, or move everything into microservices. Don't put that as a kind of target. You should do it in a gradual manner. And I would say for legacy applications, not every piece would be suitable for microservice architecture. No need to force it."</p> - -<p>After all, as enthusiastic as Hou is about Kubernetes at Huawei, he estimates that "in the next 10 years, maybe 80 percent of the workload can be distributed, can be run on the cloud native environments. There's still 20 percent that's not, but it's fine. If we can make 80 percent of our workload really be cloud native, to have agility, it's a much better world at the end of the day."</p> - -{{< case-studies/quote >}} -"In the next 10 years, maybe 80 percent of the workload can be distributed, can be run on the cloud native environments. There's still 20 percent that's not, but it's fine. If we can make 80 percent of our workload really be cloud native, to have agility, it's a much better world at the end of the day." -{{< /case-studies/quote >}} - -<p>In the nearer future, Hou is looking forward to new features that are being developed around Kubernetes, not least of all the ones that Huawei is contributing to. Huawei engineers have worked on the federation feature (which puts multiple Kubernetes clusters in a single framework to be managed seamlessly), scheduling, container networking and storage, and a just-announced technology called <a href="http://containerops.org/">Container Ops</a>, which is a DevOps pipeline engine. "This will put every DevOps job into a container," he explains. "And then this container mechanism is running using Kubernetes, but is also used to test Kubernetes. With that mechanism, we can make the containerized DevOps jobs be created, shared and managed much more easily than before."</p> - -<p>Still, Hou sees this technology as only halfway to its full potential. First and foremost, he'd like to expand the scale it can orchestrate, which is important for supersized companies like Huawei – as well as some of its customers.</p> - -<p>Hou proudly notes that two years after that first Huawei engineer became a contributor to and evangelist for Kubernetes, Huawei is now a top contributor to the community. "We've learned that the more you contribute to the community," he says, "the more you get back."</p> diff --git a/content/ko/case-studies/ibm/ibm_featured_logo.png b/content/ko/case-studies/ibm/ibm_featured_logo.png deleted file mode 100644 index adb07a8cdf58888b9884161d64112179b2987112..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11298 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 diff --git a/content/ko/case-studies/ibm/ibm_featured_logo.svg b/content/ko/case-studies/ibm/ibm_featured_logo.svg deleted file mode 100644 index f79fd7847b..0000000000 --- a/content/ko/case-studies/ibm/ibm_featured_logo.svg +++ /dev/null @@ -1 +0,0 @@ -<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 215.9892 128.40633"><defs><style>.cls-1{fill:transparent;}.cls-2{fill:#4c81c2;}</style></defs><title>ibm_featured_logo \ No newline at end of file diff --git a/content/ko/case-studies/ibm/index.html b/content/ko/case-studies/ibm/index.html deleted file mode 100644 index aa3f108e1c..0000000000 --- a/content/ko/case-studies/ibm/index.html +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: IBM Case Study -linkTitle: IBM -case_study_styles: true -cid: caseStudies -logo: ibm_featured_logo.svg -featured: false - -new_case_study_styles: true -heading_background: /images/case-studies/ibm/banner1.jpg -heading_title_logo: /images/ibm_logo.png -subheading: > - Building an Image Trust Service on Kubernetes with Notary and TUF -case_study_details: - - Company: IBM - - Location: Armonk, New York - - Industry: Cloud Computing ---- - -

Challenge

- -

IBM Cloud offers public, private, and hybrid cloud functionality across a diverse set of runtimes from its OpenWhisk-based function as a service (FaaS) offering, managed Kubernetes and containers, to Cloud Foundry platform as a service (PaaS). These runtimes are combined with the power of the company's enterprise technologies, such as MQ and DB2, its modern artificial intelligence (AI) Watson, and data analytics services. Users of IBM Cloud can exploit capabilities from more than 170 different cloud native services in its catalog, including capabilities such as IBM's Weather Company API and data services. In the later part of 2017, the IBM Cloud Container Registry team wanted to build out an image trust service.

- -

Solution

- -

The work on this new service culminated with its public availability in the IBM Cloud in February 2018. The image trust service, called Portieris, is fully based on the Cloud Native Computing Foundation (CNCF) open source project Notary, according to Michael Hough, a software developer with the IBM Cloud Container Registry team. Portieris is a Kubernetes admission controller for enforcing content trust. Users can create image security policies for each Kubernetes namespace, or at the cluster level, and enforce different levels of trust for different images. Portieris is a key part of IBM's trust story, since it makes it possible for users to consume the company's Notary offering from within their IKS clusters. The offering is that Notary server runs in IBM's cloud, and then Portieris runs inside the IKS cluster. This enables users to be able to have their IKS cluster verify that the image they're loading containers from contains exactly what they expect it to, and Portieris is what allows an IKS cluster to apply that verification.

- -

Impact

- -

IBM's intention in offering a managed Kubernetes container service and image registry is to provide a fully secure end-to-end platform for its enterprise customers. "Image signing is one key part of that offering, and our container registry team saw Notary as the de facto way to implement that capability in the current Docker and container ecosystem," Hough says. The company had not been offering image signing before, and Notary is the tool it used to implement that capability. "We had a multi-tenant Docker Registry with private image hosting," Hough says. "The Docker Registry uses hashes to ensure that image content is correct, and data is encrypted both in flight and at rest. But it does not provide any guarantees of who pushed an image. We used Notary to enable users to sign images in their private registry namespaces if they so choose."

- -{{< case-studies/quote author="Michael Hough, a software developer with the IBM Container Registry team" >}} -"We see CNCF as a safe haven for cloud native open source, providing stability, longevity, and expected maintenance for member projects—no matter the originating vendor or project." -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -Docker had already created the Notary project as an implementation of The Update Framework (TUF), and this implementation of TUF provided the capabilities for Docker Content Trust. -{{< /case-studies/lead >}} - -

"After contribution to CNCF of both TUF and Notary, we perceived that it was becoming the de facto standard for image signing in the container ecosystem", says Michael Hough, a software developer with the IBM Cloud Container Registry team.

- -

The key reason for selecting Notary was that it was already compatible with the existing authentication stack IBM's container registry was using. So was the design of TUF, which does not require the registry team to have to enter the business of key management. Both of these were "attractive design decisions that confirmed our choice of Notary," he says.

- -

The introduction of Notary to implement image signing capability in IBM Cloud encourages increased security across IBM's cloud platform, "where we expect it will include both the signing of official IBM images as well as expected use by security-conscious enterprise customers," Hough says. "When combined with security policy implementations, we expect an increased use of deployment policies in CI/CD pipelines that allow for fine-grained control of service deployment based on image signers."

- -

The availability of image signing "is a huge benefit to security-conscious customers who require this level of image provenance and security," Hough says. "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."

- -{{< case-studies/quote - image="/images/case-studies/ibm/banner3.jpg" - author="Michael Hough, a software developer with the IBM Cloud Container Registry team" ->}} -"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" -{{< /case-studies/quote >}} - -

Now that the Notary-implemented service is generally available in IBM's public cloud as a component of its existing IBM Cloud Container Registry, it is deployed as a highly available service across five IBM Cloud regions. This high-availability deployment has three instances across two zones in each of the five regions, load balanced with failover support. "We have also deployed it with end-to-end TLS support through to our back-end IBM Cloudant persistence storage service," Hough says.

- -

The IBM team has created and open sourced a Kubernetes admission controller called Portieris, which uses Notary signing information combined with customer-defined security policies to control image deployment into their cluster. "We are hoping to drive adoption of Portieris through its use of our Notary offering," Hough says.

- -

IBM has been a key player in the creation and support of open source foundations, including CNCF. Todd Moore, IBM's vice president of Open Technology, is the current CNCF governing board chair and a number of IBMers are active across many of the CNCF member projects.

- -{{< case-studies/quote - image="/images/case-studies/ibm/banner4.jpg" - author="Michael Hough, a software developer with the IBM Cloud Container Registry team" ->}} -"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." -{{< /case-studies/quote >}} - -

"Given that, we see CNCF as a safe haven for cloud native open source, providing stability, longevity, and expected maintenance for member projects—no matter the originating vendor or project," Hough says. Because the entire cloud native world is a fast-moving area with many competing vendors and solutions, "we see the CNCF model as an arbiter of openness and fair play across the ecosystem," he says.

- -

With both TUF and Notary as part of CNCF, IBM expects there to be standardization around these capabilities beyond just de facto standards for signing and provenance. IBM has determined to not simply consume Notary, but also to contribute to the open source project where applicable. "IBMers have contributed a CouchDB backend to support our use of IBM Cloudant as the persistent store; and are working on generalization of the pkcs11 provider, allowing support of other security hardware devices beyond Yubikey," Hough says.

- -{{< case-studies/quote author="Michael Hough, a software developer with the IBM Cloud Container Registry team" >}} -"There are new projects addressing these challenges, including within CNCF. We will definitely be following these advancements with interest. We found the Notary community to be an active and friendly community open to changes, such as our addition of a CouchDB backend for persistent storage." -{{< /case-studies/quote >}} - -

The company has used other CNCF projects containerd, Envoy, Prometheus, gRPC, and CNI, and is looking into SPIFFE and SPIRE as well for potential future use.

- -

What advice does Hough have for other companies that are looking to deploy Notary or a cloud native infrastructure?

- -

"While this is true for many areas of cloud native infrastructure software, we found that a high-availability, multi-region deployment of Notary requires a solid implementation to handle certificate management and rotation," he says. "There are new projects addressing these challenges, including within CNCF. We will definitely be following these advancements with interest. We found the Notary community to be an active and friendly community open to changes, such as our addition of a CouchDB backend for persistent storage."

diff --git a/content/ko/case-studies/ing/index.html b/content/ko/case-studies/ing/index.html deleted file mode 100644 index 037ba9775d..0000000000 --- a/content/ko/case-studies/ing/index.html +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: ING Case Study -linkTitle: ING -case_study_styles: true -cid: caseStudies -weight: 50 -featured: true -quote: > - The big cloud native promise to our business is the ability to go from idea to production within 48 hours. We are some years away from this, but that's quite feasible to us. - -new_case_study_styles: true -heading_background: /images/case-studies/ing/banner1.jpg -heading_title_logo: /images/ing_logo.png -subheading: > - Driving Banking Innovation with Cloud Native -case_study_details: - - Company: ING - - Location: Amsterdam, Netherlands - - Industry: Finance ---- - -

Challenge

- -

After undergoing an agile transformation, ING realized it needed a standardized platform to support the work their developers were doing. "Our DevOps teams got empowered to be autonomous," says Infrastructure Architect Thijs Ebbers. "It has benefits; you get all kinds of ideas. But a lot of teams are going to devise the same wheel. Teams started tinkering with Docker, Docker Swarm, Kubernetes, Mesos. Well, it's not really useful for a company to have one hundred wheels, instead of one good wheel.

- -

Solution

- -

Using Kubernetes for container orchestration and Docker for containerization, the ING team began building an internal public cloud for its CI/CD pipeline and green-field applications. The pipeline, which has been built on Mesos Marathon, will be migrated onto Kubernetes. The bank-account management app Yolt in the U.K. (and soon France and Italy) market already is live hosted on a Kubernetes framework. At least two greenfield projects currently on the Kubernetes framework will be going into production later this year. By the end of 2018, the company plans to have converted a number of APIs used in the banking customer experience to cloud native APIs and host these on the Kubernetes-based platform.

- -

Impact

- -

"Cloud native technologies are helping our speed, from getting an application to test to acceptance to production," says Infrastructure Architect Onno Van der Voort. "If you walk around ING now, you see all these DevOps teams, doing stand-ups, demoing. They try to get new functionality out there really fast. We held a hackathon for one of our existing components and basically converted it to cloud native within 2.5 days, though of course the tail takes more time before code is fully production ready."

- -{{< case-studies/quote author="Thijs Ebbers, Infrastructure Architect, ING">}} -"The big cloud native promise to our business is the ability to go from idea to production within 48 hours. We are some years away from this, but that's quite feasible to us." -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -ING has long embraced innovation in banking, launching the internet-based ING Direct in 1997. -{{< /case-studies/lead >}} - -

In that same spirit, the company underwent an agile transformation a few years ago. "Our DevOps teams got empowered to be autonomous," says Infrastructure Architect Thijs Ebbers. "It has benefits; you get all kinds of ideas. But a lot of teams are going to devise the same wheel. Teams started tinkering with Docker, Docker Swarm, Kubernetes, Mesos. Well, it's not really useful for a company to have one hundred wheels, instead of one good wheel."

- -

Looking to standardize the deployment process within the company's strict security guidelines, the team looked at several solutions and found that in the past year, "Kubernetes won the container management framework wars," says Ebbers. "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."

- -

They also embraced Docker to address a major pain point in ING's CI/CD pipeline. Before containerization, "Every development team had to order a VM, and it was quite a heavy delivery model for them," says Infrastructure Architect Onno Van der Voort. "Another use case for containerization is when the application travels through the pipeline, they fire up Docker containers to do test work against the applications and after they've done the work, the containers get killed again."

- -{{< case-studies/quote - image="/images/case-studies/ing/banner3.jpg" - author="Thijs Ebbers, Infrastructure Architect, ING" ->}} -"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." -{{< /case-studies/quote >}} - -

Because of industry regulations, applications are only allowed to go through the pipeline, where compliance is enforced, rather than be deployed directly into a container. "We have to run the complete platform of services we need, many routing from different places," says Van der Voort. "We need this Kubernetes framework for deploying the containers, with all those components, monitoring, logging. It's complex." For that reason, ING has chosen to start on the OpenShift Origin Kubernetes distribution.

- -

Already, "cloud native technologies are helping our speed, from getting an application to test to acceptance to production," says Van der Voort. "If you walk around ING now, you see all these DevOps teams, doing stand-ups, demoing. They try to get new functionality out there really fast. We held a hackathon for one of our existing components and basically converted it to cloud native within 2.5 days, though of course the tail takes more time before code is fully production ready."

- -

The pipeline, which has been built on Mesos Marathon, will be migrated onto Kubernetes. Some legacy applications are also being rewritten as cloud native in order to run on the framework. At least two smaller greenfield projects built on Kubernetes will go into production this year. By the end of 2018, the company plans to have converted a number of APIs used in the banking customer experience to cloud native APIs and host these on the Kubernetes-based platform.

- -{{< case-studies/quote - image="/images/case-studies/ing/banner4.jpg" - author="Onno Van der Voort, Infrastructure Architect, ING" ->}} -"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." -{{< /case-studies/quote >}} - -

The team, however, doesn't see the bank's back-end systems going onto the Kubernetes platform. "Our philosophy is it only makes sense to move things to cloud if they are cloud native," says Van der Voort. "If you have traditional architecture, build traditional patterns, it doesn't hold any value to go to the cloud." Adds Cloud Platform Architect Alfonso Fernandez-Barandiaran: "ING has a strategy about where we will go, in order to improve our agility. So it's not about how cool this technology is, it's about finding the right technology and the right approach."

- -

The Kubernetes framework will be hosting some greenfield projects that are high priority for ING: applications the company is developing in response to PSD2, the European Commission directive requiring more innovative online and mobile payments that went into effect at the beginning of 2018. For example, a bank-account management app called Yolt, serving the U.K. market (and soon France and Italy), was built on a Kubernetes platform and has gone into production. ING is also developing blockchain-enabled applications that will live on the Kubernetes platform. "We've been contacted by a lot of development teams that have ideas with what they want to do with containers," says Ebbers.

- -{{< case-studies/quote author="Alfonso Fernandez-Barandiaran, Cloud Platform Architect, ING" >}} -Even with the particular requirements that come in banking, ING has managed to take a lead in technology and innovation. "Every time we have constraints, we look for maybe a better way that we can use this technology." -{{< /case-studies/quote >}} - -

Even with the particular requirements that come in banking, ING has managed to take a lead in technology and innovation. "Every time we have constraints, we look for maybe a better way that we can use this technology," says Fernandez-Barandiaran.

- -

The results, after all, are worth the effort. "The big cloud native promise to our business is the ability to go from idea to production within 48 hours," says Ebbers. "That would require all these projects to be mature. We are some years away from this, but that's quite feasible to us."

diff --git a/content/ko/case-studies/ing/ing_featured_logo.png b/content/ko/case-studies/ing/ing_featured_logo.png deleted file mode 100644 index f6d4489715aa4bc1ecbed9ec6b21531e07a02ffe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10305 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 E0oEjKyZ`_I diff --git a/content/ko/case-studies/naic/index.html b/content/ko/case-studies/naic/index.html deleted file mode 100644 index 89ef6cb8de..0000000000 --- a/content/ko/case-studies/naic/index.html +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: NAIC Case Study -linkTitle: NAIC -case_study_styles: true -cid: caseStudies -logo: naic_featured_logo.png -featured: false - -new_case_study_styles: true -heading_background: /images/case-studies/naic/banner1.jpg -heading_title_logo: /images/naic_logo.png -subheading: > - A Culture and Technology Transition Enabled by Kubernetes -case_study_details: - - Company: NAIC - - Location: Washington, DC - - Industry: Regulatory ---- - -

Challenge

- -

The National Association of Insurance Commissioners (NAIC), the U.S. standard-setting and regulatory support organization, was looking for a way to deliver new services faster to provide more value for members and staff. It also needed greater agility to improve productivity internally.

- -

Solution

- -

Beginning in 2016, they started using Cloud Native Computing Foundation (CNCF) tools such as Prometheus. NAIC began hosting internal systems and development systems on Kubernetes at the beginning of 2018, as part of a broad move toward the public cloud. "Our culture and technology transition is a strategy embraced by our top leaders," says Dan Barker, Chief Enterprise Architect. "It has already proven successful by allowing us to accelerate our value pipeline by more than double while decreasing our costs by more than half. We are also seeing customer satisfaction increase as we add more and more applications to these new technologies."

- -

Impact

- -

Leveraging Kubernetes, "our development teams can create rapid prototypes far faster than they used to," Barker said. Applications running on Kubernetes are more resilient than those running in other environments. The deployment of open source solutions is helping influence company culture, as NAIC becomes a more open and transparent organization.

- -

"We completed a small prototype in two days that would have previously taken at least a month," Barker says. Resiliency is currently measured in how much downtime systems have. "They've basically had none, and the occasional issue is remedied in minutes," he says.

- -{{< case-studies/quote author="Dan Barker, Chief Enterprise Architect, NAIC" >}} -"Our culture and technology transition is a strategy embraced by our top leaders. It has already proven successful by allowing us to accelerate our value pipeline by more than double while decreasing our costs by more than half. We are also seeing customer satisfaction increase as we add more and more applications to these new technologies." -{{< /case-studies/quote >}} - -

NAIC—which was created and overseen by the chief insurance regulators from the 50 states, the District of Columbia and five U.S. territories—provides a means through which state insurance regulators establish standards and best practices, conduct peer reviews, and coordinate their regulatory oversight. Their staff supports these efforts and represents the collective views of regulators in the United States and internationally. NAIC members, together with the organization's central resources, form the national system of state-based insurance regulation in the United States.

- -

The organization has been using the cloud for years, and wanted to find more ways to quickly deliver new services that provide more value for members and staff. They looked to Kubernetes for a solution. Within NAIC, several groups are leveraging Kubernetes, one being the Platform Engineering Team. "The team building out these tools are not only deploying and operating Kubernetes, but they're also using them," Barker says. "In fact, we're using GitLab to deploy Kubernetes with a pipeline using kops. This team was created from developers, operators, and quality engineers from across the company, so their jobs have changed quite a bit."

- -

In addition, NAIC is onboarding teams to the new platform, and those teams have seen a lot of change in how they work and what they can do. "They now have more power in creating their own infrastructure and deploying their own applications," Barker says. They also use pipelines to facilitate their currently manual processes. NAIC has consumers who are using GitLab heavily, and they're starting to use Kubernetes to deploy simple applications that help their internal processes.

- -{{< case-studies/quote - image="/images/case-studies/naic/banner3.jpg" - author="Dan Barker, Chief Enterprise Architect, NAIC" ->}} -"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." -{{< /case-studies/quote >}} - -

"We needed greater agility to enable our own productivity internally," he says. "We decided it was right for us to move everything to the public cloud [Amazon Web Services] to help with that process and be able to access many of the native tools that allows us to move faster by not needing to build everything." -The NAIC also wanted to be cloud-agnostic, "and Kubernetes helps with this for our compute layer," Barker says. "Compute is pretty standard across the clouds, and now we can take advantage of any of them while getting all of the other features Kubernetes offers."

- -

The NAIC currently hosts internal systems and development systems on Kubernetes, and has already seen how impactful it can be. "Our development teams can create rapid prototypes in minutes instead of weeks," Barker says. "This recently happened with an internal tool that had no measurable wait time on the infrastructure. It was solely development bound. There is now a central shared resource that lives in AWS, which means it can grow as needed."

- -

The native integrations into Kubernetes at NAIC has made it easy to write code and have it running in minutes instead of weeks. Applications running on Kubernetes have also proven to be more resilient than those running in other environments. "We even have teams using this to create more internal tools to help with communication or automating some of their current tasks," Barker says.

- -

"We knew that Kubernetes had become the de facto standard for container orchestration," he says. "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."

- -

As for other CNCF projects, NAIC is using Prometheus on a small scale and hopes to continue using it moving forward because of the seamless integration with Kubernetes. The Association also is considering gRPC as its internal communications standard, Envoy in conjunction with Istio for service mesh, OpenTracing and Jaeger for tracing aggregation, and Fluentd with its Elasticsearch cluster.

- -{{< case-studies/quote - image="/images/case-studies/naic/banner4.jpg" - author="Dan Barker, Chief Enterprise Architect, NAIC" ->}} -"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." -{{< /case-studies/quote >}} - -

The open governance and broad industry participation in CNCF provided a comfort level with the technology, Barker says. "We also see it as helping to influence our own company culture," he says. "We're moving to be a more open and transparent company, and we are encouraging our staff to get involved with the different working groups and codebases. We recently became CNCF members to help further our commitment to community contribution and transparency."

- -

Factors such as vendor-neutrality and cross-industry investment were important in the selection. "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," Barker says.

- -

NAIC is a largely Oracle shop, Barker says, and has been running mostly Java on JBoss. "However, we have years of history with other applications," he says. "Some of these have been migrated by completely rewriting the application, while others are just being modified slightly to fit into this new paradigm."

- -

Running on AWS cloud, the Association has not specifically taken a microservices approach. "We are moving to microservices where practical, but we haven't found that it's a necessity to operate them within Kubernetes," Barker says.

- -

All of its databases are currently running within public cloud services, but they have explored eventually running those in Kubernetes, as it makes sense. "We're doing this to get more reuse from common components and to limit our failure domains to something more manageable and observable," Barker says.

- -{{< case-studies/quote author="Dan Barker, Chief Enterprise Architect, NAIC" >}} -"We have been able to move much faster at lower cost than we were able to in the past," Barker says. "We were able to complete one of our projects in a year, when the previous version took over two years. And the new project cost $500,000 while the original required $3 million, and with fewer defects. We are also able to push out new features much faster." -{{< /case-studies/quote >}} - -

NAIC has seen a significant business impact from its efforts. "We have been able to move much faster at lower cost than we were able to in the past," Barker says. "We were able to complete one of our projects in a year, when the previous version took over two years. And the new project cost $500,000 while the original required $3 million, and with fewer defects. We are also able to push out new features much faster."

- -

He says the organization is moving toward continuous deployment "because the business case makes sense. The research is becoming very hard to argue with. We want to reduce our batch sizes and optimize on delivering value to customers and not feature count. This is requiring a larger cultural shift than just a technology shift."

- -

NAIC is "becoming more open and transparent, as well as more resilient to failure," Barker says. "Even our customers are wanting more and more of this and trying to figure out how they can work with us to accomplish our mutual goals faster. Members of the insurance industry have reached out so that we can better learn together and grow as an industry."

diff --git a/content/ko/case-studies/naic/naic_featured_logo.png b/content/ko/case-studies/naic/naic_featured_logo.png deleted file mode 100644 index f2497114bf40a1a0fad1eaf65fb52b2c03918f08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9433 zcmbt)byOVBvoG!hTb$q?g1fUg1Y0!t;;xJP;_eax1cwa?kPw19A&}sb0KpxCTX5dw zdw;)s?>q0l_s`pNW@n~ORZn$Sb$8XLI$m2-86SrV2MGxYUsXi`0^ENBR~Qxw@PDS= z4FztLFhwJnuDcz~59(!$BxmDpWlOK>3bnU|*g|arJcn#0k&sZ?9rcW0Mj9`~t=(O@ zp?`U}{arl(X(S{`8GjF`wX-dZ-pbbA(M^i+sI7~U-qA*i(NIW(SHnZz*1=IF(92dg zP*cx3(AiqdhEYbEUeaG2Xu#DL2Br6Rb#e0+_m^V)r(JR2`7fD=k^UbRn6nh)e<)?7 zp-nIE?qy3a#4Y^Xnop3IUPO$WPncIwh>we&pO;UBhgXP)SNJ(EpE$3mI6oi#zkZCs z*Su`(#32ew|N0j2CdKFggL#Pa@c8-par+5yyL;L5@QI0u@$mBV@bf)5B1>T z6GyZd-q1NN|E`nNDJcK`1W{bdBS5m#`x z_Hng!gQ+S=F#;5B8%G;)UO}*uyn?&{m`|9Wk55rlOjtlpQACa(tSBZA782$Cx2&q0 zHw@}#ZToLo$N!S$|9{Gg%X`^EVeVdf?(Q!Cww|_wJIvkN!QF#iUj83z(X(qntsUL| z5;^`3@W1r6^>XyJwNdhNccuSlgv1^H2QBz{6~#mqg!#qfgarTT0l%n#qJWURl9G^s zAXos*_%B(T|Ec$iyov%MO1xrnA_D)TEDxXz&tLQYH*^1+1o+V3$NzL*;N?Hv-_{NA zc`v}ZNxDjbS;nBOsvxK5KfiB==?_x8ebbR|9u86g)60Uf(9*_VpKF(MV8w+CIzpu7 zu;bt=M4-C|Ms|v~5Of_-JrYhZ2%QK7#$_R#3~KwHegAmLT43+hv|z>^vD2(Phw-lX`SnG>wZeNg&P8iw2KKJm2jN-w^u@(RN<0e6AzcpJPzENlLf-$b zPzvMHh87yXQ_%*cnny|i*Xx5@zs#aEt0GV)v5G1!N}`BqsgWKMYk`NVm1yQjTcEe= zZ5(5K=SQou7v{5&uSg( z`E6h_X+(qTFJS@cRP)E1-*rFVy%gZ$8h%&#De|+++}i5uD!bCf@1J!B z?~Us^Z=B4{i-a~ygaC6S9SXY4YF{1fIYr_OZ#W04{O~p0Pc*=Ll5R(OX87^kuOZQ_ z-6<+2X0atC=;T*ojEs!Uc)0zsi2rzaL`dKh%5lF{YQA_5$4-XTAx_ocltXiAi}H0* zt*$nUcf|BN#>rPRY|&zy8>sewXdh)$v)fVSNS~X0eo-#_TG(~8NXn$BDERUIk5u3} z??aSq6VL~4?$LF667i_v@rPBzVgYQwrBl~<9N1SwQPoJ>sXb-MTx znJ3h$ZV9tNHt{{^dg(Qn%0)X+&4Qrf`sy|8c6+# zP6LONR2!DtU!_%Zb7l?MAR{ANDKgq^%Q82==dO2Q z5&k(^PEBX8LJ?ME2-f`yCR}*DI~#izC!?yWn#rccjqAyT9DF(JCd+GajFJn}X`eL0 z_;Wb+LTZgbR+}?BCMM?LxR0RjMPWvM{^`%>JtHa|!sP~{I<3Uc68s=&q9v7&q>DR96KV32ypPzK) z*72~j50Ho!6FeI(e1Yuw5Tf=i!HjtFT!!(S|NFmr8Hrk6W2A3Pb-WE2}> zK9de0RBmRR^xfIN%BK`V?{w3A`SK;l&=7{%jyetBnfBa~=H%3rV(sBv!`H+7#f1fj zZ_hs!TYJ;#xFVXH83*U)<}$S4v@BCPO`&>c{uQ`Qb*UdU@DII&wP;6`oCWja;^O3E zI}3%@8PH0u?LstKUx1Kuy)t(iqi%1X5ov-~_`O~R?B0yI@51jE+y}naIEY5Xylc+r#UVfaMoT;&v2g#CC}ssKK~MdvFFue_zg)Wc zQTx1x%F6k9 z5NLU|ODMiT$C#Ly5M}ps_HW`rzna|NJk1tynvSCt6&76T2=d$HRkq0=h!Nw8l$foI zfVo-kZgO=X9A|c6SP6cIv!SOO@fo_PWNEA&Dr>fkAGlTYJ;W4kHql4oT_QP8YFYXR z^Gi8ndNm8hS08t$s=lVu@j$qknKugkmOeC|vTEe7ggH4mK_D4rRKQYi$HT)z1De07 z9rksa`&cn|=IH3y_4v@%*jVlVN}{PeTCyq+wEIxGU>SXScD8JC?Kb3&#yHWS0x7_c z=R-=&YWEer2>)1itb3@?9uC$gm52WN?24eSHK^GhdCew$ZFm~kEq;1(;<(f<#@9aY zHSJ7%MIgv+-e5PfH&gR0OJJtPFxJB1auV2u>>`zoWLbr>8_%*AhR7Fsy54;%XRxCnt7YZ&5o90w#u8%!od;0Sx-GVIq7vLpqt!f$q4*D+RwW>lBk*YE{Ef3BTD0` z_H2u{{aqJqH{)bDnObDYe;q&FWGVP;1X!qk7lOy@x*m)lDlhkD5^HTrHvZt%GJke-0Z%^S1!!l=T(+#gVP%w?8YFdi&?dU5}0Q8;!c= zaiN5t8Yqv{Q?)8TgLiB)fpBAOFF`HzVK=X5Mmw#tBl-^`F-L$^b%yrN;i2Ys&G-4- z?V=#f4W%8hGX!;)JppxIZ627_O-&+CDm4pln$U7^%2rlZZZ3Ym?m)A3=|DPv%i@#q zDxfTe_i>=n867T#r4Z#im89PmHr_IJ60dTrIZwshfe5K6-7cr3VpxwJhjo zP{~AcTkbR)_4Peky06GJ@9k;v-u_W*X7WlG({8sn8rLA-x}vJQB9*yf@WtToy|uv0 z{l0~iRvj>Q(H*spLqSFdFiqxa>N+ls)e?++)2^mH_4Ghegj!XNtlYwyRRq++?=nJ2 z8_v(hWK1Y?r~hog7n>!MDT5ihc|H(B#1KF8H!6PdN}Oqdp>4hg)izZX6|bIKo_7yJ zY7E}njTO1>IxV*P?8=EXvMzPB48%h7e~fD*9Z;>JL7@f5cBC)wm9E>w@0uy*)Lu znO#d~Ql88^@A$J+^9dQ)B6GkbD)7d+eMxMOO%Md~BNpc4(-HP)j%{z5QYiH_16}t* z8|z4viwh4k?BTjfFSd;f!#QNpYvQ{c40j=pP zR6=56D~`Uh>0me(8aCJaHcCaTjAtM*F#>Y-o0v4V5tes?ATSXp2#4w-t?Gi=7BzmZ~i}IzhCq zNEX0W>6&uRivwAM7h2#BnOk=dWW~0+RZ8`F_LfLzEJ@g zG%E^g${R^s*wTwSab_Fcl=GEWh?)8BgCfI+L@A4$izRW<2;^$sr_JG~o8mif*Whna zuuq>Ve0$aOoST~)LvT;MO6)F3n}Uc)j=*KUTlT#{;#eN+aN!kIV5{3m3fH5S%suEt z=m{YKItBYU&BR#_Yy3CWoUIyH+|NkQ@!wQzkrJPIW>@7xcXK+8ur!+4h~h}y(jB)< zt*lBLDb-kgDLwnbkx{uwjk-ebWALeWKD-}#4`eaHCtt`B@{S{5>o$AF16&P$0Ra+X zViyl=p$(-cb!qwT0Um{|59WtMa{=YegYzt`kGy6o78&^=A$KZN{5C48ta0expPgnn z1G%K>%#BZN_}6>wpKVuXt5x)gt^fY*Y}#R*F#go!PfJ_jnDd35seIha!j%=3o43Z< z>Kh4RPjOxgI-;19cq0UVq$!nAinuK>B_gk_@tCPi%r`pk-dc&~E{FVCT(=5oup{fr zI-k;#nKQ`EVg?;Y8w=Ey9RG+~pZDY6@Y*gXZfPj2)7lxZpz7Q!Nn_;;-(O<${#k35 zdOqcvUl$Y03++XF%UrD!YRbF@njhw7@e@)H6G;67$%$e3>gkAZTnxG-R=SzQhWpP+ z(<8%;*S3cB6{2)MunV%fOP?+lVqF|9TP#SB}t@W!pHO$Z&PXld!q? z93?hfGsTO`*b6wX0Y22%M~%O`l+qs}kHa7RQeJ{xSElpBzMe%3q>`DtGlp3)WJZ=@ zM4)~PXnAvME5Uu%>0WT;^5EC5csCF;y==)@;c45__VV%qN7-CX0=duofFV7yxVFPR z{+a%{7gs&Nk~eDhK}mLb^?83&tt%4z^!vC-4co7A{m%k(2&{~tpT|xUp3WGYgweIN zwdeX$!3SQIqhALG5}MTvIxmiX*3lJW$A0v*B(4cTN{);3@b+$q0td~n_AUk#%lKQ6 zuZ=ohPb!JAu&^|T&YreR0bwFD+t@tC7hV$8$?G`Fx#(@sGK)%%IX)}f&kQYd=B6={ zqj1jfUh|H?35`!Q8GJyfsoj9PN|XNw~I+AXE3SrI5Z@x`q(D zN$3aHK2~U-P8oXz3Lwl)X7}sq8*qx#Sl<%%4PbB9;VXT6XZG2vrPlNH^x5{R_a+j!vM!I3-KR9n`cqyuJ~qZ9E}l=@gAbD^6n!>}phXtH(Ta~8AGfj(Z&fvYzw&DkPam%)%pT;%#>&>v4 zer`*(dP%KXJ6W}Ty>gXYGh|qYMT-9t>?Fjv>-RR?!hdI+p$yU6^OY`aKh5cTWsfw3 zoZGB*T2SQ2&C^wliyRfrb=MyVEk%sS#7$D)Sd2^~b&_j=bvH6gug#2r=zSq(rtwQ>WN=k6-)T9v!*iJpL zK}q~MK-(}C>s3__)onhkc|)zAd4q}8Lq;vnj{TLW<1jF%QnoJ{E8ETA_(NUnS`FpXr8hWNkG6ktqDOH7CpyUU>GbYlDJ zBwj7SBl$vqg9kTLn;c6BA080OacGtCn6)aLHR*Gb7K}osLU}tA$$19C*0+T0*2e|x zM_=Ue_CSb*@ceEs4*)2DOYvg`*6Nd1-#>?D#qHBd?zFVD0H&erTJf=;PSpeIzR>)^ zV-=jZnp?r6A=|XGsB-tEXRdAQ1;vl%?X>Ch^H0-y?+u*urLZk~L-f?*P2s4Tb=!#- z?UP>?n+%E#YOY<*Dix2y@^bHvD-5TWZ1ypr7U}JUUJ6TX|iqr9~e}meI=vJ@P?Zi$$=ZM5|R0mt72+MR!}o4kL9P_u^s& zrqD_m3vc7>Oi&LV+R4_f`%3t#@S8k$lGndUP~jnc+TpcRj*#AaWDsNR$%`k zT+3)+J2@sH;|jVVs>_E9VLoKww>GSiSX1IW3K>Q9<-buq<&VNL>@MIzEWS`VU&CA8 zjM4b{HrlmTNRj!%Zb&`*n=x&-_7zW5nfYv<@pIz$hL`goY-)0))ItDe*0%+Hbfi+M z%qsgFh8lQ#-@CK3)7uM9S)WCc6n?vyg~q8G(T19NbifoP;)Zi8lz-pw1Av{o{x`fi zkYC&X;Vz)nj*pvLb7P&i*=EXWW8}5S>(D-vvWWtzpdTrlzk!XLQKL_1=1c zsMu|0&Kv@R!Bj#{(+FL*-#-hd-|DL)^r+6RA_hIz2V8-)dS|>uSjc_4T8A(dLTBGk zQG6=yvlkT`>$f}krLs<97bYHFEEkCZzxsrzaQw@R}R9LYjFG+Ci;Kay{2 z!2+a@ZWEEzeuF zi`v2-A1XCo?__ANWQTg@QTQqa9j`=u7$fYL3c4K6+Uo9>wfw0U96uBb3FkD%rfu>& zGH-n+DlNSPn_}8&0iuNaZJEbw086R)`CF?%RL+o*oQzD^eTl}Q@;#M+9o~#;#hW6 zCUBhHxMGVPqD8dd0C-VdZtB?X6co?xl9-%q))9CCM109x;G$yAft07}lpFi|?cUp( zmYx%(ip^9YP`@XQ9_TPRA)!>AVOMJbC3w2dg03uD4G26egTDdWh>ksAW6!$@WxDID zD?D0Bih)nS?gNEFdH-0l+sJZe19{F+(B*0@-5Ny)5|_a{BV_in6EI_^F}~nB zQm!SY-DrVoS21$%3i0A5_4e+R4#5WUu)@f4*rODu9JQ&bX;HuyrIk@_G(Uiip)Oa? z%Gw2ogm@B*hW>uv6iy*o;lA8iO_-#}H*1A;07U%S81~)60A{{=6-{oA6n0GSfguA; zZ*OluZU%O$QYL>!PGz2M!K~Quxn!1Go!Kfax_WHXA9J$j8vu|M2knXiB2rWw(Z~nu z_FNtdb0F6S$~~r10MvX#MnclyzARlvq5TvoJEkp(y}!9PU;eQte2oo**76Io*(|cn z3Pl-~nR@mnfy|w(lzIVXZjZAu!3c5;8c2H7`M@i$=)Eg$r? zn>?_?9}a#s$%{chC9y}ntRkcA$dmBnHi8B+b;t6&qk~ zdTD`dL_q-!M?3Kvh;~+Fro~3bg{D8*wf@BM$0~=5Ws!E1NaDkiKc>5RM=EofHm6B0 zED)6@3InJ!<|DPROWa#+>=_$T3~Nk$s;EvR6YWVoCII@uy@__CkLg5(TlNA_1i_oA zL$2^ArR#(gKG%bxiFky?i)pCr!B~WWDN6D|-#5M3J+KHB5-1Fcdw6@`NC=oBf#{Pt z#U_S2oM@DrBVZC>v_-I8nOCYOcS|ocyUg)>@G>wUbH$wY?SL)d5<4lum83x7>uOr~FMsZKlLaB5?4*aH54VyP?l=KJ4P?x>`ZY0ckZ9%!M(_tq zX?IXyltp;73DglX=R{k$AJMvc^Ich=_4AZJOWL8m1_}emoYgg$m1TYPqObsJe|+w; zFVmh8_L1fh1Ad3St~a@&eWe6OF$Rnqolh^E(h{tVoollk;i_P#2t>kgR&>br}tzU3@f?qvH3QX z@>HT!*eD6|jNln|^vXH_K=0BD9&6ImQG`dJViNbo9(f?OL^wr7$t5#Xqa~Jb(wj7+ zWn=sZzqQ0!Y(wRY{YWZXLWYb69R09NMN*(Aw(~sQ7_wxHp@|TC0FX93X{2Fx8**d( ze2gbJXrNJ?W`dYfeOUtkSf>bLJWj!$i85vUW%hQNpi7rH{L*LaNY!W#SROPY5RdUj zZy4NW+z~yrh1Z3Yqs;_J+*iuGHXmWLc7943fZFiS>6*YX353uXNC}KaBQS7Ej$Wm z0==F*70D3MU0hgi=+Dh1bZ4pZv>ttoz#p8+tAr&n9{P!d31u*aMvQn2ZeDB@RT_OH z>ba({fa`5LGbZ^%%&HaMzf46zFg&&-I-8jw=X~@VR*J;ceK(?E8RP>aSYGcoBjrEnSoFMWt0{0 zNOkZ7^4ey!=58-!ZVKW8v`!s?`V_ljeQmsIOlgumH0g1SPn6A3LJBp-TA6(=lIH$<9G4aIO+^LOmGfA=-Tuy+0hI7|~2b69Ywt zS>lYVoZ~i?F=?wiuoXo+LCYq1C5gTc_^uJtKbe4|BK< - The New York Times: From Print to the Web to Cloud Native -case_study_details: - - Company: New York Times - - Location: New York, N.Y. - - Industry: News Media ---- - -

Challenge

- -

When the company decided a few years ago to move out of its data centers, its first deployments on the public cloud were smaller, less critical applications managed on virtual machines. "We started building more and more tools, and at some point we realized that we were doing a disservice by treating Amazon as another data center," says Deep Kapadia, Executive Director, Engineering at The New York Times. Kapadia was tapped to lead a Delivery Engineering Team that would "design for the abstractions that cloud providers offer us."

- -

Solution

- -

The team decided to use Google Cloud Platform and its Kubernetes-as-a-service offering, GKE.

- -

Impact

- -

Speed of delivery increased. Some of the legacy VM-based deployments took 45 minutes; with Kubernetes, that time was "just a few seconds to a couple of minutes," says Engineering Manager Brian Balser. Adds Li: "Teams that used to deploy on weekly schedules or had to coordinate schedules with the infrastructure team now deploy their updates independently, and can do it daily when necessary." Adopting Cloud Native Computing Foundation technologies allows for a more unified approach to deployment across the engineering staff, and portability for the company.

- -{{< case-studies/quote author="Deep Kapadia, Executive Director, Engineering at The New York Times" >}} -{{< youtube DqS_IPw-c6o youtube-quote-sm >}} -{{< youtube Tm4VfJtOHt8 youtube-quote-sm >}} -
-"I think once you get over the initial hump, things get a lot easier and actually a lot faster." -{{< /case-studies/quote >}} - -

Founded in 1851 and known as the newspaper of record, The New York Times is a digital pioneer: Its first website launched in 1996, before Google even existed. After the company decided a few years ago to move out of its private data centers—including one located in the pricy real estate of Manhattan. It recently took another step into the future by going cloud native.

- -

At first, the infrastructure team "managed the virtual machines in the Amazon cloud, and they deployed more critical applications in our data centers and the less critical ones on AWS as an experiment," says Deep Kapadia, Executive Director, Engineering at The New York Times. "We started building more and more tools, and at some point we realized that we were doing a disservice by treating Amazon as another data center."

- -

To get the most out of the cloud, Kapadia was tapped to lead a new Delivery Engineering Team that would "design for the abstractions that cloud providers offer us." In mid-2016, they began looking at the Google Cloud Platform and its Kubernetes-as-a-service offering, GKE.

- -

At the time, says team member Tony Li, a Site Reliability Engineer, "We had some internal tooling that attempted to do what Kubernetes does for containers, but for VMs. We asked why are we building and maintaining these tools ourselves?"

- -

In early 2017, the first production application—the nytimes.com mobile homepage—began running on Kubernetes, serving just 1% of the traffic. Today, almost 100% of the nytimes.com site's end-user facing applications run on GCP, with the majority on Kubernetes.

- -{{< case-studies/quote image="/images/case-studies/newyorktimes/banner3.jpg" >}} -"We had some internal tooling that attempted to do what Kubernetes does for containers, but for VMs. We asked why are we building and maintaining these tools ourselves?" -{{< /case-studies/quote >}} - -

The team found that the speed of delivery was immediately impacted. "Deploying Docker images versus spinning up VMs was quite a lot faster," says Engineering Manager Brian Balser. Some of the legacy VM-based deployments took 45 minutes; with Kubernetes, that time was "just a few seconds to a couple of minutes."

- -

The plan is to get as much as possible, not just the website, running on Kubernetes, and beyond that, moving toward serverless deployments. For instance, The New York Times crossword app was built on Google App Engine, which has been the main platform for the company's experimentation with serverless. "The hardest part was getting the engineers over the hurdle of how little they had to do," Chief Technology Officer Nick Rockwell recently told The CTO Advisor. "Our experience has been very, very good. We have invested a lot of work into deploying apps on container services, and I'm really excited about experimenting with deploying those on App Engine Flex and AWS Fargate and seeing how that feels, because that's a great migration path."

- -

There are some exceptions to the move to cloud native, of course. "We have the print publishing business as well," says Kapadia. "A lot of that is definitely not going down the cloud-native path because they're using vendor software and even special machinery that prints the physical paper. But even those teams are looking at things like App Engine and Kubernetes if they can."

- -

Kapadia acknowledges that there was a steep learning curve for some engineers, but "I think once you get over the initial hump, things get a lot easier and actually a lot faster."

- -{{< case-studies/quote image="/images/case-studies/newyorktimes/banner4.jpg" >}} -"Right now, every team is running a small Kubernetes cluster, but it would be nice if we could all live in a larger ecosystem," says Kapadia. "Then we can harness the power of things like service mesh proxies that can actually do a lot of instrumentation between microservices, or service-to-service orchestration. Those are the new things that we want to experiment with as we go forward." -{{< /case-studies/quote >}} - -

At The New York Times, they did. As teams started sharing their own best practices with each other, "We're no longer the bottleneck for figuring out certain things," Kapadia says. "Most of the infrastructure and systems were managed by a centralized function. We've sort of blown that up, partly because Google and Amazon have tools that allow us to do that. We provide teams with complete ownership of their Google Cloud Platform projects, and give them a set of sensible defaults or standards. We let them know, 'If this works for you as is, great! If not, come talk to us and we'll figure out how to make it work for you.'"

- -

As a result, "It's really allowed teams to move at a much more rapid pace than they were able to in the past," says Kapadia. Adds Li: "The use of GKE means each team can get their own compute cluster, reducing the number of individual instances they have to care about since developers can treat the cluster as a whole. Because the ticket-based workflow was removed from requesting resources and connections, developers can just call an API to get what they want. Teams that used to deploy on weekly schedules or had to coordinate schedules with the infrastructure team now deploy their updates independently, and can do it daily when necessary."

- -

Another benefit to adopting Kubernetes: allowing for a more unified approach to deployment across the engineering staff. "Before, many teams were building their own tools for deployment," says Balser. With Kubernetes—as well as the other CNCF projects The New York Times uses, including Fluentd to collect logs for all of its AWS servers, gRPC for its Publishing Pipeline, Prometheus, and Envoy—"we can benefit from the advances that each of these technologies make, instead of trying to catch up."

- -{{< case-studies/quote >}} -Li calls the Cloud Native Computing Foundation's projects "a northern star that we can all look at and follow." -{{< /case-studies/quote >}} - -

These open-source technologies have given the company more portability. "CNCF has enabled us to follow an industry standard," says Kapadia. "It allows us to think about whether we want to move away from our current service providers. Most of our applications are connected to Fluentd. If we wish to switch our logging provider from provider A to provider B we can do that. We're running Kubernetes in GCP today, but if we want to run it in Amazon or Azure, we could potentially look into that as well."

- -

Li calls the Cloud Native Computing Foundation's projects "a northern star that we can all look at and follow." Led by that star, the team is looking ahead to a year of onboarding the remaining half of the 40 or so product engineering teams to extract even more value out of the technology. "Right now, every team is running a small Kubernetes cluster, but it would be nice if we could all live in a larger ecosystem," says Kapadia. "Then we can harness the power of things like service mesh proxies that can actually do a lot of instrumentation between microservices, or service-to-service orchestration. Those are the new things that we want to experiment with as we go forward."

diff --git a/content/ko/case-studies/newyorktimes/newyorktimes_featured.png b/content/ko/case-studies/newyorktimes/newyorktimes_featured.png deleted file mode 100644 index fad0927883a9310b252dc3ea75172b7bba5a9e0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20189 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 - Finding Millions in Potential Savings in a Tough Retail Climate -case_study_details: - - Company: Nordstrom - - Location: Seattle, Washington - - Industry: Retail ---- - -

Challenge

- -

Nordstrom wanted to increase the efficiency and speed of its technology operations, which includes the Nordstrom.com e-commerce site. At the same time, Nordstrom Technology was looking for ways to tighten its technology operational costs.

- -

Solution

- -

After embracing a DevOps transformation and launching a continuous integration/continuous deployment (CI/CD) project four years ago, the company reduced its deployment time from three months to 30 minutes. But they wanted to go even faster across environments, so they began their cloud native journey, adopting Docker containers orchestrated with Kubernetes.

- -

Impact

- -

Nordstrom Technology developers using Kubernetes now deploy faster and can "just focus on writing applications," says Dhawal Patel, a senior engineer on the team building a Kubernetes enterprise platform for Nordstrom. Furthermore, the team has increased Ops efficiency, improving CPU utilization from 5x to 12x depending on the workload. "We run thousands of virtual machines (VMs), but aren't effectively using all those resources," says Patel. "With Kubernetes, without even trying to make our cluster efficient, we are currently at a 10x increase."

- -{{< case-studies/quote author="Dhawal Patel, senior engineer at Nordstrom" >}} -"We are always looking for ways to optimize and provide more value through technology. With Kubernetes we are showcasing two types of efficiency that we can bring: Dev efficiency and Ops efficiency. It's a win-win." -{{< /case-studies/quote >}} - -

When Dhawal Patel joined Nordstrom five years ago as an application developer for the retailer's website, he realized there was an opportunity to help speed up development cycles.

- -

In those early DevOps days, Nordstrom Technology still followed a traditional model of silo teams and functions. "As a developer, I was spending more time fixing environments than writing code and adding value to business," Patel says. "I was passionate about that—so I was given the opportunity to help fix it."

- -

The company was eager to move faster, too, and in 2013 launched the first continuous integration/continuous deployment (CI/CD) project. That project was the first step in Nordstrom's cloud native journey.

- -

Dev and Ops team members built a CI/CD pipeline, working with the company's servers on premise. The team chose Chef, and wrote cookbooks that automated virtual IP creation, servers, and load balancing. "After we completed the project, deployment went from three months to 30 minutes," says Patel. "We still had multiple environments—dev, test, staging, then production—so with each environment running the Chef cookbooks, it took 30 minutes. It was a huge achievement at that point."

- -

But new environments still took too long to turn up, so the next step was working in the cloud. Today, Nordstrom Technology has built an enterprise platform that allows the company's 1,500 developers to deploy applications running as Docker containers in the cloud, orchestrated with Kubernetes.

- -{{< case-studies/quote image="/images/case-studies/nordstrom/banner3.jpg" >}} -"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," -{{< /case-studies/quote >}} - -

"The cloud provided faster access to resources, because it took weeks for us to get a virtual machine (VM) on premises," says Patel. "But now we can do the same thing in only five minutes."

- -

Nordstrom's first foray into scheduling containers on a cluster was a homegrown system based on CoreOS fleet. They began doing a few proofs of concept projects with that system until Kubernetes 1.0 was released when they made the switch. "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," says Marius Grigoriu, Sr. Manager of the Kubernetes team at Nordstrom.

- -

While Kubernetes is often thought as a platform for microservices, the first application to launch on Kubernetes in a critical production role at Nordstrom was Jira. "It was not the ideal microservice we were hoping to get as our first application," Patel admits, "but the team that was working on it was really passionate about Docker and Kubernetes, and they wanted to try it out. They had their application running on premises, and wanted to move it to Kubernetes."

- -

The benefits were immediate for the teams that came on board. "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."

- -{{< case-studies/quote image="/images/case-studies/nordstrom/banner4.jpg">}} -"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." -{{< /case-studies/quote >}} - -

To support these early adopters, Patel's team began growing the cluster and building production-grade services. "We integrated with Prometheus for monitoring, with a Grafana front end; we used Fluentd to push logs to Elasticsearch, so that gives us log aggregation," says Patel. The team also added dozens of open-source components, including CNCF projects and has made contributions to Kubernetes, Terraform, and kube2iam.

- -

There are now more than 60 development teams running Kubernetes in Nordstrom Technology, and as success stories have popped up, more teams have gotten on board. "Our initial customer base, the ones who were willing to try this out, are now going and evangelizing to the next set of users," says Patel. "One early adopter had Docker containers and he was not sure how to run it in production. We sat with him and within 15 minutes we deployed it in production. He thought it was amazing, and more people in his org started coming in."

- -

For Nordstrom Technology, going cloud-native has vastly improved development and operational efficiency. The developers using Kubernetes now deploy faster and can focus on building value in their applications. One such team started with a 25-minute merge to deploy by launching virtual machines in the cloud. Switching to Kubernetes was a 5x speedup in their process, improving their merge to deploy time to 5 minutes.

- -{{< case-studies/quote >}} -"With Kubernetes, without even trying to make our cluster efficient, we are currently at 40 percent CPU utilization—a 10x increase. we are running 2600+ customer pods that would have been 2600+ VMs if they had gone directly to the cloud. We are running them on 40 VMs now, so that's a huge reduction in operational overhead." -{{< /case-studies/quote >}} - -

Speed is great, and easily demonstrated, but perhaps the bigger impact lies in the operational efficiency. "We run thousands of VMs on AWS, and their overall average CPU utilization is about four percent," says Patel. "With Kubernetes, without even trying to make our cluster efficient, we are currently at 40 percent CPU utilization—a 10x increase. We are running 2600+ customer pods that would have been 2600+ VMs if they had gone directly to the cloud. We are running them on 40 VMs now, so that's a huge reduction in operational overhead."

- -

Nordstrom Technology is also exploring running Kubernetes on bare metal on premises. "If we can build an on-premises Kubernetes cluster," says Patel, "we could bring the power of cloud to provision resources fast on-premises. Then for the developer, their interface is Kubernetes; they might not even realize or care that their services are now deployed on premises because they're only working with Kubernetes."

- -

For that reason, Patel is eagerly following Kubernetes' development of multi-cluster capabilities. "With cluster federation, we can have our on-premise as the primary cluster and the cloud as a secondary burstable cluster," he says. "So, when there is an anniversary sale or Black Friday sale, and we need more containers - we can go to the cloud."

- -

That kind of possibility—as well as the impact that Grigoriu and Patel's team has already delivered using Kubernetes—is what led Nordstrom on its cloud native journey in the first place. "The way the retail environment is today, we are trying to build responsiveness and flexibility where we can," says Grigoriu. "Kubernetes makes it easy to: bring efficiency to both the Dev and Ops side of the equation. It's a win-win."

diff --git a/content/ko/case-studies/nordstrom/nordstrom_featured_logo.png b/content/ko/case-studies/nordstrom/nordstrom_featured_logo.png deleted file mode 100644 index a557ffa82f12e9172639a30014f60c19cee74e22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7352 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%0DTu4DD-z2Zi$SC(#VDWNxd`Y@D(?mqm+rbw00h z(BY=OF1U!1D*yhII}>^&$(Kv1Lp|BPd-$O!9!3B8-b8lTH(zAI+EgR6jVyq4%C^qg zcgHZ2_-@qiQO{fgECcz2Qnx5*|NC-<&aTm=^8}St<3`N1`DYh516$*pTa4y_Q+GWQ zy?(1AUF;_&nvQ#M`bBy=OWILbv31kl=KGlX4J0hd5t9(ilKNvIx zV@zU~ZNi>WwJe%aD6~#vTWBfNRQ3ag&^WWr869AT>t1h65#fPGKSTh)e)_CXx`->`tJ{TVEb4MXl-?TK|q`Ab7=9&)PdrFhm_=M8Q?rwH7doK2;9Df?9G8YyVU3picX52CgZBqbMn(tKYfc*r zjthCbzC|?)@#Db>mZ#xv6CvTy&UnJhS`#agpRkr}OS)l_m4`PeHiw-LROQ*xQZ9 z4Bb<$XQ5Y%`b1O0sm_<_8XwcE4=YK6Lms7SsOe<{^l)%?P5>Cb#PP#QeIwe4oEn2VFHo!}GZq4Th>MHjqQ zNl;&Na9+hXk+(n3)_VZ%NU|6G2{ar*bVY_0QXIAwX4mvOl{ZTIJ;C09Gf(9+UK0gYvsQnF;dnaGKRD0O*x`Fv<`O_-oo@9_Z0 z*WbT+SK)HnQ+G!_CZYY;InIs!o}UAe&79&08O35P6I0XS=e%7G`pF^hMzf&;a&nfb z$qe1^>?CQUF6j@k?e1H!Bp>>VC`>N;lMVEu;dry4sKkUD<9=5Y2d?>5Z4FO1$o8(5jdd8LX~{3#q7XY+t13aX+|}@~6?l(Gu=5Q86J} z+e+T&iXk<7x!EHHi29y*GEE^K zTx;8Q2=>Ib?>V`}Ay@F#qsndd<`YxrO{brEX{h0*o?nxZnRKg9lb}&fU@YK%1N5kX zcH;*CA8$BL38lULOd}`QQpvnkn>N1#AYu0c!k>)=pbp>Uf<5FDce1jY0(#DAsi~(? zI6J#Pg_A$i()^o^beVge-`--HVKTMFfdM63Ad>Po6aq==&84MX#yPKJVGrzE%CfH} z7RFq;ZYD97hH-wS0`!dEXjmj9!$OS!FPp5kmht*Ao{(@k57CWyH%6?)aPm4pex@#J z+t!v8xbzpT=$o?5@ymszkKan{)1MlWP67?0jTQ_F5DQtOMasdqDNi`nSRiyK z2;%Zhidt9IUZ7~KccCb%GDejYrCm3mUS2By-|O=KKQ9LUeyecf4==^VGwg=O3>|al RIZodtYO5O{YgF%s{TI$2raJ%t diff --git a/content/ko/case-studies/northwestern-mutual/index.html b/content/ko/case-studies/northwestern-mutual/index.html deleted file mode 100644 index a25d25484c..0000000000 --- a/content/ko/case-studies/northwestern-mutual/index.html +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: Northwestern Mutual Case Study -case_study_styles: true -cid: caseStudies - -new_case_study_styles: true -heading_background: /images/case-studies/northwestern/banner1.jpg -heading_title_logo: /images/northwestern_logo.png -subheading: > - Cloud Native at Northwestern Mutual -case_study_details: - - Company: Northwestern Mutual - - Location: Milwaukee, WI - - Industry: Insurance and Financial Services ---- - -

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.

- -

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.

- -

Impact

- -

Before, infrastructure deployments could take weeks; now, it is done in a matter of minutes. The number of deployments has increased dramatically, from about 24 a year to over 500 in just the first 10 months of 2017. Availability has also increased: There used to be a six-hour control window for commits every Sunday morning, as well as other periods of general maintenance, during which outages could happen. "Now we have eliminated the planned outage windows," says Bryan Pfremmer, App Platform Teams Manager, Northwestern Mutual. Kanali has had an impact on the bottom line. The vendor API management product that the company previously used required 23 servers, "dedicated, to only API management," says Pfremmer. "Now it's all integrated in the existing stack and running as another deployment on Kubernetes. And that's just one environment. Between the three that we had plus the test, that's hard dollar savings."

- -{{< case-studies/quote author="Frank Greco Jr., Cloud Native Engineer at Northwestern Mutual">}} -"In a large enterprise, you're going to have people using Kubernetes, but then you're also going to have people using WAS and .NET. You may not be at a point where your whole stack can be cloud native. What if you can take your API management tool and make it cloud native, but still proxy to legacy systems? Using different pieces that are cloud native, open source and Kubernetes native, you can do pretty innovative stuff." -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -For more than 160 years, Northwestern Mutual has maintained its industry leadership in part by keeping a strong focus on risk management. -{{< /case-studies/lead >}} - -

For many years, the company took a similar approach to managing its technology and has recently undergone a digital transformation to advance the company's digital strategy - including making a lot of noise in the cloud-native world.

- -

In the spring of 2015, this insurance and financial services company 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 an on-premise datacenter; deployments were very traditional and had to many manual steps that were error prone.

- -

In order to give the company's 4.5 million clients the digital experience they'd come to expect, says Williams, "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. We essentially said, 'You build the system that you think is necessary to support a new, modern-facing one.' That's why we departed from anything legacy."

- -{{< case-studies/quote image="/images/case-studies/northwestern/banner3.jpg" >}} -"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." -{{< /case-studies/quote >}} - -

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.

- -{{< case-studies/quote image="/images/case-studies/northwestern/banner4.jpg" >}} -"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." -{{< /case-studies/quote >}} - -

The process used to be so cumbersome that minor bug releases would be bundled with feature releases. With the new streamlined system enabled by Kubernetes, the number of deployments has increased from about 24 a year to more than 500 in just the first 10 months of 2017. Availability has also been improved: There used to be a six-hour control window for commits every early Sunday morning, as well as other periods of general maintenance, during which outages could happen. "Now there's no planned outage window," notes Pfremmer.

- -

Northwestern Mutual built that API management tool—called Kanali—and open sourced it in the summer of 2017. The team took on the project because it was a key capability for what they were building and prior the solution worked in an "anti-cloud native way that was different than everything else we were doing," says Greco. Now API management is just another container deployed to Kubernetes along with a separate Jaeger deployment.

- -

Now the engineers using the Kubernetes deployment platform have the added benefit of visibility in production—and autonomy. Before, a centralized team and would have to run a trace. "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." says Greco.

- -{{< case-studies/quote >}} -"We're trying to make what we're doing known so that we can find people who are like, 'Yeah, that's interesting. I want to come do it!'" -{{< /case-studies/quote >}} - -

But the team didn't stop there. "In a large enterprise, you're going to have people using Kubernetes, but then you're also going to have people using WAS and .NET," says Greco. "You may not be at a point where your whole stack can be cloud native. What if you can take your API management tool and make it cloud native, but still proxy to legacy systems? Using different pieces that are cloud native, open source and Kubernetes native, you can do pretty innovative stuff."

- -

As the team continues to improve its stack and share its Kubernetes best practices, it feels that Northwestern Mutual's reputation as a technology-first company is evolving too. "No one would think a company that's 160-plus years old is foraying this deep into the cloud and infrastructure stack," says Pfremmer. And they're hoping that means they'll be able to attract new talent. "We're trying to make what we're doing known so that we can find people who are like, 'Yeah, that's interesting. I want to come do it!'"

diff --git a/content/ko/case-studies/northwestern-mutual/northwestern_featured_logo.png b/content/ko/case-studies/northwestern-mutual/northwestern_featured_logo.png deleted file mode 100644 index 7c1422f32b86d6f3eb930b33467899db662b14e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10083 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

Gda%H|g|!l%DjX=<#=S4tsgEo8jCG$HK^ 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 - 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. - -new_case_study_styles: true -heading_background: /images/case-studies/ocado/banner1.jpg -heading_title_logo: /images/ocado_logo.png -subheading: > - Ocado: Running Grocery Warehouses with a Cloud Native Platform -case_study_details: - - Company: Ocado Technology - - Location: Hatfield, England - - Industry: Grocery retail technology and platforms ---- - -

Challenge

- -

The world's largest online-only grocery retailer, Ocado developed the Ocado Smart Platform to manage its own operations, from websites to warehouses, and is now licensing the technology to other retailers such as Kroger. To set up the first warehouses for the platform, Ocado shifted from virtual machines and Puppet infrastructure to Docker containers, using CoreOS's fleet scheduler to provision all the services on its OpenStack-based private cloud on bare metal. As the Smart Platform grew and "fleet was going end-of-life," says Platform Engineer Mike Bryant, "we started looking for a more complete platform, with all of these disparate infrastructure services being brought together in one unified API."

- -

Solution

- -

The team decided to migrate from fleet to Kubernetes on Ocado's private cloud. The Kubernetes stack currently uses kubeadm for bootstrapping, CNI with Weave Net for networking, Prometheus Operator for monitoring, Fluentd for logging, and OpenTracing for distributed tracing. The first app on Kubernetes, a business-critical service in the warehouses, went into production in the summer of 2017, with a mass migration continuing into 2018. Hundreds of Ocado engineers working on the Smart Platform are now deploying on Kubernetes.

- -

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."

- -{{< case-studies/quote author="Mike Bryant, Platform Engineer, Ocado" >}} -"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-studies/quote >}} - -{{< case-studies/lead >}} -When it was founded in 2000, Ocado was an online-only grocery retailer in the U.K. In the years since, it has expanded from delivering produce to families to providing technology to other grocery retailers. -{{< /case-studies/lead >}} - -

The company began developing its Ocado Smart Platform to manage its own operations, from websites to warehouses, and is now licensing the technology to other grocery chains around the world, such as Kroger. To set up the first warehouses on the platform, Ocado shifted from virtual machines and Puppet infrastructure to Docker containers, using CoreOS's fleet scheduler to provision all the services on its OpenStack-based private cloud on bare metal. As the Smart Platform grew, and "fleet was going end-of-life," says Platform Engineer Mike Bryant, "we started looking for a more complete platform, with all of these disparate infrastructure services being brought together in one unified API."

- -

Bryant had already been using Kubernetes with Code for Life, a children's education project that's part of Ocado's charity arm. "We really liked it, so we started looking at it seriously for our production workloads," says Bryant. The team that managed fleet had researched orchestration solutions and landed on Kubernetes as well. "We were looking for a platform with wide adoption, and that was where the momentum was," says DevOps Team Leader Kevin McCormack. The two paths converged, and "We didn't even go through any proof-of-concept stage. The Code for Life work served that purpose," says Bryant.

- -{{< case-studies/quote - image="/images/case-studies/ocado/banner3.jpg" - author="Kevin McCormack, DevOps Team Leader, Ocado" ->}} -"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," -{{< /case-studies/quote >}} - -

In the summer of 2016, the team began migrating from fleet to Kubernetes on Ocado's private cloud. The Kubernetes stack currently uses kubeadm for bootstrapping, CNI with Weave Net for networking, Prometheus Operator for monitoring, Fluentd for logging, and OpenTracing for distributed tracing.

- -

The first app on Kubernetes, a business-critical service in the warehouses, went into production a year later. Once that app was running smoothly, a mass migration continued into 2018. Hundreds of Ocado engineers working on the Smart Platform are now deploying on Kubernetes, and the platform is live in Ocado's warehouses, managing tens of thousands of orders a week. At full capacity, Ocado's latest warehouse in Erith, southeast London, will deliver more than 200,000 orders per week, making it the world's largest facility for online grocery.

- -

There are about 150 microservices now running on Kubernetes, with multiple instances of many of them. "We're not just deploying all these microservices at once. We're deploying them all for one warehouse, and then they're all being deployed again for the next warehouse, and again and again," says Bryant.

- -

The move to Kubernetes was eye-opening for many people at Ocado Technology. "In the early days of putting the platform into our test infrastructure, the technical architect asked what network performance was like on Weave Net with encryption turned on," recalls Bryant. "So we found a Docker container for iPerf, wrote a daemon set, deployed it. A few moments later, we've deployed the entire thing across this cluster. He was pretty blown away by that."

- -{{< case-studies/quote - image="/images/case-studies/ocado/banner4.jpg" - author="Mike Bryant, Platform Engineer, Ocado" ->}} -"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." -{{< /case-studies/quote >}} - -

Indeed, the impact has been profound. "Prior to containerization, we had quite restrictive deployment windows in our warehouses," says Bryant. "Moving to microservices, we've been able to deploy much more frequently. We've been able to move towards continuous delivery in a number of areas. In our older warehouse, new application deployments involve talking to a bunch of different teams for different levels of the stack: from VM provisioning, to storage, to load balancers, and so on. 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."

- -

The rate of deployment has gone from as few as two per week to dozens per week. "With Kubernetes, some of our development teams have been able to deploy their application to production on the new platform without us noticing," says Bryant, "which means they're faster at doing what they need to do and we have less work."

- -

Ocado has also achieved cost savings because Kubernetes gives the team the ability to have more fine-grained resource allocation. "That lets us shrink quite a lot of our deployments from being per-core VM deployments to having fractions of the core," says Bryant. Adds 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. This means we use our hardware better since if we have to always have two nodes of excess capacity available in case of node failures then we only need two extra instead of 20."

- -{{< case-studies/quote author="Mike Bryant, Platform Engineer, Ocado" >}} -"CNCF have provided us with support of different technologies. We've been able to adopt those in a very easy fashion. We do like that CNCF is vendor agnostic. We're not being asked to commit to this one way of doing things. The vast diversity of viewpoints in CNCF lead to better technology." -{{< /case-studies/quote >}} - -

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 resource to host the same applications in Kubernetes in our test environments."

- -

One of the broader benefits of cloud native, says Bryant, is the unified API. "We have one method of doing our deployments that covers the wide range of things we need to do, and we can extend the API," he says. In addition to using Prometheus Operator, the Ocado team has started writing its own operators, some of which have been open sourced. Plus, "CNCF has provided us with support of these different technologies. We've been able to adopt those in a very easy fashion. We do like that CNCF is vendor agnostic. We're not being asked to commit to this one way of doing things. The vast diversity of viewpoints in the CNCF leads to better technology."

- -

Ocado's own technology, in the form of its Smart Platform, will soon be used around the world. And cloud native plays a crucial role in this global expansion. "I wouldn't have wanted to try it without Kubernetes," says Bryant. "Kubernetes has made it so much nicer, especially to have that consistent way of deploying all of the applications, then taking the same thing and being able to replicate it. It's very valuable."

diff --git a/content/ko/case-studies/ocado/ocado_featured_logo.png b/content/ko/case-studies/ocado/ocado_featured_logo.png deleted file mode 100644 index 0c2ef19ec3b0359285ba05db312d2d8b10cbd5aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8089 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 - Launching and Scaling Up Experiments, Made Simple -case_study_details: - - Company: OpenAI - - Location: San Francisco, California - - Industry: Artificial Intelligence Research ---- - -

Challenge

- -

An artificial intelligence research lab, OpenAI needed infrastructure for deep learning that would allow experiments to be run either in the cloud or in its own data center, and to easily scale. Portability, speed, and cost were the main drivers.

- -

Solution

- -

OpenAI began running Kubernetes on top of AWS in 2016, and in early 2017 migrated to Azure. OpenAI runs key experiments in fields including robotics and gaming both in Azure and in its own data centers, depending on which cluster has free capacity. "We use Kubernetes mainly as a batch scheduling system and rely on our autoscaler to dynamically scale up and down our cluster," says Christopher Berner, Head of Infrastructure. "This lets us significantly reduce costs for idle nodes, while still providing low latency and rapid iteration."

- -

Impact

- -

The company has benefited from greater portability: "Because Kubernetes provides a consistent API, we can move our research experiments very easily between clusters," says Berner. Being able to use its own data centers when appropriate is "lowering costs and providing us access to hardware that we wouldn't necessarily have access to in the cloud," he adds. "As long as the utilization is high, the costs are much lower there." Launching experiments also takes far less time: "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. 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."

- -{{< case-studies/quote >}} - -
-Check out "Building the Infrastructure that Powers the Future of AI" presented by Vicki Cheung, Member of Technical Staff & Jonas Schneider, Member of Technical Staff at OpenAI from KubeCon/CloudNativeCon Europe 2017. -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -From experiments in robotics to old-school video game play research, OpenAI's work in artificial intelligence technology is meant to be shared. -{{< /case-studies/lead >}} - -

With a mission to ensure powerful AI systems are safe, OpenAI cares deeply about open source—both benefiting from it and contributing safety technology into it. "The research that we do, we want to spread it as widely as possible so everyone can benefit," says OpenAI's Head of Infrastructure Christopher Berner. The lab's philosophy—as well as its particular needs—lent itself to embracing an open source, cloud native strategy for its deep learning infrastructure.

- -

OpenAI started running Kubernetes on top of AWS in 2016, and a year later, migrated the Kubernetes clusters to Azure. "We probably use Kubernetes differently from a lot of people," says Berner. "We use it for batch scheduling and as a workload manager for the cluster. It's a way of coordinating a large number of containers that are all connected together. We rely on our autoscaler to dynamically scale up and down our cluster. This lets us significantly reduce costs for idle nodes, while still providing low latency and rapid iteration."

- -

In the past year, Berner has overseen the launch of several Kubernetes clusters in OpenAI's own data centers. "We run them in a hybrid model where the control planes—the Kubernetes API servers, etcd and everything—are all in Azure, and then all of the Kubernetes nodes are in our own data center," says Berner. "The cloud is really convenient for managing etcd and all of the masters, and having backups and spinning up new nodes if anything breaks. This model allows us to take advantage of lower costs and have the availability of more specialized hardware in our own data center."

- -{{< case-studies/quote image="/images/case-studies/openAI/banner3.jpg" >}} -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..." -{{< /case-studies/quote >}} - -

Different teams at OpenAI currently run a couple dozen projects. While the largest-scale workloads manage bare cloud VMs directly, most of 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," says Berner. The on-prem clusters are generally "used for workloads where you need lots of GPUs, something like training an ImageNet model. Anything that's CPU heavy, that's run in the cloud. But we also have a number of teams that run their experiments both in Azure and in our own data centers, just depending on which cluster has free capacity, and that's hugely valuable."

- -

Berner has made the Kubernetes clusters available to all OpenAI teams to use if it's a good fit. "I've worked a lot with our games team, which at the moment is doing research on classic console games," he says. "They had been running a bunch of their experiments on our dev servers, and they had been trying out Google cloud, managing their own VMs. We got them to try out our first on-prem Kubernetes cluster, and that was really successful. They've now moved over completely to it, and it has allowed them to scale up their experiments by 10x, and do that without needing to invest significant engineering time to figure out how to manage more machines. A lot of people are now following the same path."

- -{{< case-studies/quote image="/images/case-studies/openAI/banner4.jpg" >}} -"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." -{{< /case-studies/quote >}} - -

That path has been simplified by frameworks and tools that two of OpenAI's teams have developed to handle interaction with Kubernetes. "You can just write some Python code, fill out a bit of configuration with exactly how many machines you need and which types, and then it will prepare all of those specifications and send it to the Kube cluster so that it gets launched there," says Berner. "And it also provides a bit of extra monitoring and better tooling that's designed specifically for these machine learning projects."

- -

The impact that Kubernetes has had at OpenAI is impressive. With Kubernetes, the frameworks and tooling, including the autoscaler, in place, launching experiments takes far less time. "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."

- -

Plus, the flexibility they now have to use their on-prem Kubernetes cluster when appropriate is "lowering costs and providing us access to hardware that we wouldn't necessarily have access to in the cloud," he says. "As long as the utilization is high, the costs are much lower in our data center. To an extent, you can also customize your hardware to exactly what you need."

- -{{< case-studies/quote author="CHRISTOPHER BERNER, HEAD OF INFRASTRUCTURE FOR OPENAI" >}} -"Research teams can now take advantage of the frameworks we've built on top of Kubernetes, which make it easy to launch experiments, scale them by 10x or 50x, and take little effort to manage." -{{< /case-studies/quote >}} - -

OpenAI is also benefiting from other technologies in the CNCF cloud-native ecosystem. gRPC is used by many of its systems for communications between different services, and Prometheus is in place "as a debugging tool if things go wrong," says Berner. "We actually haven't had any real problems in our Kubernetes clusters recently, so I don't think anyone has looked at our Prometheus monitoring in a while. If something breaks, it will be there."

- -

One of the things Berner continues to focus on is Kubernetes' ability to scale, which is essential to deep learning experiments. OpenAI has been able to push one of its Kubernetes clusters on Azure up to more than 2,500 nodes. "I think we'll probably hit the 5,000-machine number that Kubernetes has been tested at before too long," says Berner, adding, "We're definitely hiring if you're excited about working on these things!"

diff --git a/content/ko/case-studies/openAI/openai_featured.png b/content/ko/case-studies/openAI/openai_featured.png deleted file mode 100644 index b2b667c0bb13d09866a2bcdcf39c77f24a55c29d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12132 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 oBbQYHlkUGZ2Ffi_@% diff --git a/content/ko/case-studies/openAI/openai_logo.png b/content/ko/case-studies/openAI/openai_logo.png deleted file mode 100644 index a85a81ea063d0cd80218f48c376547313a47fd73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19818 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 - Infrastructure for a Growing EdTech Startup -case_study_details: - - Company: Pear Deck - - Location: Iowa City, Iowa - - Industry: Educational Software ---- - -

Challenge

- -

The three-year-old startup provides a web app for teachers to interact with their students in the classroom. The JavaScript app was built on Google's web app development platform Firebase, using Heroku. As the user base steadily grew, so did the development team. "We outgrew Heroku when we started wanting to have multiple services, and the deploying story got pretty horrendous. We were frustrated that we couldn't have the developers quickly stage a version," says CEO Riley Eynon-Lynch. "Tracing and monitoring became basically impossible." On top of that, many of Pear Deck's customers are behind government firewalls and connect through Firebase, not Pear Deck's servers, making troubleshooting even more difficult.

- -

Solution

- -

In 2016, the company began moving their code from Heroku to Docker containers running on Google Kubernetes Engine, orchestrated by Kubernetes and monitored with Prometheus.

- -

Impact

- -

The new cloud native stack immediately improved the development workflow, speeding up deployments. Prometheus gave Pear Deck "a lot of confidence, knowing that people are still logging into the app and using it all the time," says Eynon-Lynch. "The biggest impact is being able to work as a team on the configuration in git in a pull request, and the biggest confidence comes from the solidity of the abstractions and the trust that we have in Kubernetes actually making our yaml files a reality."

- -{{< case-studies/quote author="RILEY EYNON-LYNCH, CEO OF PEAR DECK" >}} -"We didn't even realize how stressed out we were about our lack of insight into what was happening with the app. I'm really excited and have more and more confidence in the actual state of our application for our actual users, and not just what the CPU graphs are saying, because of Prometheus and Kubernetes." -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -With the speed befitting a startup, Pear Deck delivered its first prototype to customers within three months of incorporating. -{{< /case-studies/lead >}} - -

As a former high school math teacher, CEO Riley Eynon-Lynch felt an urgency to provide a tech solution to classes where instructors struggle to interact with every student in a short amount of time. "Pear Deck is an app that students can use to interact with the teacher all at once," he says. "When the teacher asks a question, instead of just the kid at the front of the room answering again, everybody can answer every single question. It's a huge fundamental shift in the messaging to the students about how much we care about them and how much they are a part of the classroom."

- -

Eynon-Lynch and his partners quickly built a JavaScript web app on Google's web app development platform Firebase, and launched the minimum viable product [MVP] on Heroku "because it was fast and easy," he says. "We made everything as easy as we could."

- -

But once it launched, the user base began growing steadily at a rate of 30 percent a month. "Our Heroku bill was getting totally insane," Eynon-Lynch says. But even more crucially, as the company hired more developers to keep pace, "we outgrew Heroku. We wanted to have multiple services and the deploying story got pretty horrendous. We were frustrated that we couldn't have the developers quickly stage a version. Tracing and monitoring became basically impossible."

- -

On top of that, many of Pear Deck's customers are behind government firewalls and connect through Firebase, not Pear Deck's servers, making troubleshooting even more difficult.

- -

The team began looking around for another solution, and finally decided in early 2016 to start moving the app from Heroku to Docker containers running on Google Kubernetes Engine, orchestrated by Kubernetes and monitored with Prometheus.

- -{{< case-studies/quote image="/images/case-studies/peardeck/banner1.jpg" >}} -"When it became clear that Google Kubernetes Engine was going to have a lot of support from Google and be a fully-managed Kubernetes platform, it seemed very obvious to us that was the way to go," says Eynon-Lynch. -{{< /case-studies/quote >}} - -

They had considered other options like Google's App Engine (which they were already using for one service) and Amazon's Elastic Compute Cloud (EC2), while experimenting with running one small service that wasn't accessible to the Internet in Kubernetes. "When it became clear that Google Kubernetes Engine was going to have a lot of support from Google and be a fully-managed Kubernetes platform, it seemed very obvious to us that was the way to go," says Eynon-Lynch. "We didn't really consider Terraform and the other competitors because the abstractions offered by Kubernetes just jumped off the page to us."

- -

Once the team started porting its Heroku apps into Kubernetes, which was "super easy," he says, the impact was immediate. "Before, to make a new version of the app meant going to Heroku and reconfiguring 10 new services, so basically no one was willing to do it, and we never staged things," he says. "Now we can deploy our exact same configuration in lots of different clusters in 30 seconds. We have a full set up that's always running, and then any of our developers or designers can stage new versions with one command, including their recent changes. We stage all the time now, and everyone stopped talking about how cool it is because it's become invisible how great it is."

- -

Along with Kubernetes came Prometheus. "Until pretty recently we didn't have any kind of visibility into aggregate server metrics or performance," says Eynon-Lynch. The team had tried to use Google Kubernetes Engine's Stackdriver monitoring, but had problems making it work, and considered New Relic. When they started looking at Prometheus in the fall of 2016, "the fit between the abstractions in Prometheus and the way we think about how our system works, was so clear and obvious," he says.

- -

The integration with Kubernetes made set-up easy. Once Helm installed Prometheus, "We started getting a graph of the health of all our Kubernetes nodes and pods immediately. I think we were pretty hooked at that point," Eynon-Lynch says. "Then we got our own custom instrumentation working in 15 minutes, and had an actively updated count of requests that we could do, rate on and get a sense of how many users are connected at a given point. And then it was another hour before we had alarms automatically showing up in our Slack channel. All that was in one afternoon. And it was an afternoon of gasping with delight, basically!"

- -{{< case-studies/quote image="/images/case-studies/peardeck/banner2.jpg" >}} -"We started getting a graph of the health of all our Kubernetes nodes and pods immediately. I think we were pretty hooked at that point," Eynon-Lynch says. "Then we got our own custom instrumentation working in 15 minutes, and had an actively updated count of requests that we could do, rate on and get a sense of how many users are connected at a given point. And then it was another hour before we had alarms automatically showing up in our Slack channel. All that was in one afternoon. And it was an afternoon of gasping with delight, basically!" -{{< /case-studies/quote >}} - -

With Pear Deck's specific challenges—traffic through Firebase as well as government firewalls—Prometheus was a game-changer. "We didn't even realize how stressed out we were about our lack of insight into what was happening with the app," Eynon-Lynch says. Before, when a customer would report that the app wasn't working, the team had to manually investigate the problem without knowing whether customers were affected all over the world, or whether Firebase was down, and where.

- -

To help solve that problem, the team wrote a script that pings Firebase from several different geographical locations, and then reports the responses to Prometheus in a histogram. "A huge impact that Prometheus had on us was just an amazing sigh of relief, of feeling like we knew what was happening," he says. "It took 45 minutes to implement [the Firebase alarm] because we knew that we had this trustworthy metrics platform in Prometheus. We weren't going to have to figure out, 'Where do we send these metrics? How do we aggregate the metrics? How do we understand them?'"

- -

Plus, Prometheus has allowed Pear Deck to build alarms for business goals. One measures the rate of successful app loads and goes off if the day's loads are less than 90 percent of the loads from seven days before. "We run a JavaScript app behind ridiculous firewalls and all kinds of crazy browser extensions messing with it—Chrome will push a feature that breaks some CSS that we're using," Eynon-Lynch says. "So that gives us a lot of confidence, and we at least know that people are still logging into the app and using it all the time."

- -

Now, when a customer complains, and none of the alarms have gone off, the team can feel confident that it's not a widespread problem. "Just to be sure, we can go and double check the graphs and say, 'Yep, there's currently 10,000 people connected to that Firebase node. It's definitely working. Let's investigate your network settings, customer,'" he says. "And we can pass that back off to our support reps instead of the whole development team freaking out that Firebase is down."

- -

Pear Deck is also giving back to the community, building and open-sourcing a metrics aggregator that enables end-user monitoring in Prometheus. "We can measure, for example, the time to interactive-dom on the web clients," he says. "The users all report that to our aggregator, then the aggregator reports to Prometheus. So we can set an alarm for some client side errors."

- -

Most of Pear Deck's services have now been moved onto Kubernetes. And all of the team's new code is going on Kubernetes. "Kubernetes lets us experiment with service configurations and stage them on a staging cluster all at once, and test different scenarios and talk about them as a development team looking at code, not just talking about the steps we would eventually take as humans," says Eynon-Lynch.

- -{{< case-studies/quote >}} -"A huge impact that Prometheus had on us was just an amazing sigh of relief, of feeling like we knew what was happening. It took 45 minutes to implement [the Firebase alarm] because we knew that we had this trustworthy metrics platform in Prometheus...in terms of the cloud, Kubernetes and Prometheus have so much to offer," he says. -{{< /case-studies/quote >}} - -

Looking ahead, the team is planning to explore autoscaling on Kubernetes. With users all over the world but mostly in the United States, there are peaks and valleys in the traffic. One service that's still on App Engine can get as many as 10,000 requests a second during the day but far less at night. "We pay for the same servers at night, so I understand there's autoscaling that we can be taking advantage of," he says. "Implementing it is a big worry, exposing the rest of our Kubernetes cluster to us and maybe messing that up. But it's definitely our intention to move everything over, because now none of the developers want to work on that app anymore because it's such a pain to deploy it."

- -

They're also eager to explore the work that Kubernetes is doing with stateful sets. "Right now all of the services we run in Kubernetes are stateless, and Google basically runs our databases for us and manages backups," Eynon-Lynch says. "But we're interested in building our own web-socket solution that doesn't have to be super stateful but will have maybe an hour's worth of state on it."

- -

That project will also involve Prometheus, for a dark launch of web socket connections. "We don't know how reliable web socket connections behind all these horrible firewalls will be to our servers," he says. "We don't know what work Firebase has done to make them more reliable. So I'm really looking forward to trying to get persistent connections with web sockets to our clients and have optional tools to understand if it's working. That's our next new adventure, into stateful servers."

- -

As for Prometheus, Eynon-Lynch thinks the company has only gotten started. "We haven't instrumented all our important features, especially those that depend on third parties," he says. "We have to wait for those third parties to tell us they're down, which sometimes they don't do for a long time. So I'm really excited and have more and more confidence in the actual state of our application for our actual users, and not just what the CPU graphs are saying, because of Prometheus and Kubernetes."

- -

For a spry startup that's continuing to grow rapidly—and yes, they're hiring!—Pear Deck is notably satisfied with how its infrastructure has evolved in the cloud native ecosystem. "Usually I have some angsty thing where I want to get to the new, better technology," says Eynon-Lynch, "but in terms of the cloud, Kubernetes and Prometheus have so much to offer."

diff --git a/content/ko/case-studies/peardeck/peardeck_featured.png b/content/ko/case-studies/peardeck/peardeck_featured.png deleted file mode 100644 index ce87ee2d47f7b5701843b8153ed648c46444bd9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11786 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 diff --git a/content/ko/case-studies/pearson/index.html b/content/ko/case-studies/pearson/index.html deleted file mode 100644 index 501bcea8e7..0000000000 --- a/content/ko/case-studies/pearson/index.html +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Pearson Case Study -linkTitle: Pearson -case_study_styles: true -cid: caseStudies -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. - -new_case_study_styles: true -heading_background: /images/case-studies/pearson/banner1.jpg -heading_title_logo: /images/pearson_logo.png -subheading: > - Reinventing the World's Largest Education Company With Kubernetes -case_study_details: - - Company: Pearson - - Location: Global - - Industry: Education ---- - -

Challenge

- -

A global education company serving 75 million learners, Pearson set a goal to more than double that number, to 200 million, by 2025. A key part of this growth is in digital learning experiences, and Pearson was having difficulty in scaling and adapting to its growing online audience. They needed an infrastructure platform that would be able to scale quickly and deliver products to market faster.

- -

Solution

- -

"To transform our infrastructure, we had to think beyond simply enabling automated provisioning," says Chris Jackson, Director for Cloud Platforms & SRE at Pearson. "We realized we had to build a platform that would allow Pearson developers to build, manage and deploy applications in a completely different way." The team chose Docker container technology and Kubernetes orchestration "because of its flexibility, ease of management and the way it would improve our engineers' productivity."

- -

Impact

- -

With the platform, there has been substantial improvements in productivity and speed of delivery. "In some cases, we've gone from nine months to provision physical assets in a data center to just a few minutes to provision and get a new idea in front of a customer," says John Shirley, Lead Site Reliability Engineer for the Cloud Platform Team. Jackson estimates they've achieved 15-20% developer productivity savings. Before, outages were an issue during their busiest time of year, the back-to-school period. Now, there's high confidence in their ability to meet aggressive customer SLAs.

- -{{< case-studies/quote author="Chris Jackson, Director for Cloud Platforms & SRE at Pearson" >}} -"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-studies/quote >}} - -

In 2015, Pearson was already serving 75 million learners as the world's largest education company, offering curriculum and assessment tools for Pre-K through college and beyond. Understanding that innovating the digital education experience was the key to the future of all forms of education, the company set out to increase its reach to 200 million people by 2025.

- -

That goal would require a transformation of its existing infrastructure, which was in data centers. In some cases, it took nine months to provision physical assets. In order to adapt to the demands of its growing online audience, Pearson needed an infrastructure platform that would be able to scale quickly and deliver business-critical products to market faster. "We had to think beyond simply enabling automated provisioning," says Chris Jackson, Director for Cloud Platforms & SRE at Pearson. "We realized we had to build a platform that would allow Pearson developers to build, manage and deploy applications in a completely different way."

- -

With 400 development groups and diverse brands with varying business and technical needs, Pearson embraced Docker container technology so that each brand could experiment with building new types of content using their preferred technologies, and then deliver it using containers. Jackson chose Kubernetes orchestration "because of its flexibility, ease of management and the way it would improve our engineers' productivity," he says.

- -

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."

- -{{< case-studies/quote - image="/images/case-studies/pearson/banner3.jpg" - author="Chris Jackson, Director for Cloud Platforms & SRE at Pearson" ->}} -"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." -{{< /case-studies/quote >}} - -

That work resulted in two tools for building and deploying applications in the cluster that Pearson has open sourced. "We're an education company, so we want to share what we can," says Somogyi.

- -

Now that development teams no longer have to worry about infrastructure, there have been substantial improvements in productivity and speed of delivery. "In some cases, we've gone from nine months to provision physical assets in a data center to just a few minutes to provision and to get a new idea in front of a customer," says John Shirley, Lead Site Reliability Engineer for the Cloud Platform Team.

- -

According to Jackson, the Cloud Platforms team can "provision a new proof-of-concept environment for a development team in minutes, and then they can take that to production as quickly as they are able to. This is the value proposition of all major technology services, and we had to compete like one to become our developers' preferred choice. Just because you work for the same company, you do not have the right to force people into a mediocre service. 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."

- -

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!"

- -{{< case-studies/quote - image="/images/case-studies/pearson/banner4.jpg" - author="Chris Jackson, Director for Cloud Platforms & SRE at Pearson" ->}} -"Teams who were previously limited to 1-2 releases per academic year can now ship code multiple times per day!" -{{< /case-studies/quote >}} - -

Availability has also been positively impacted. The back-to-school period is the company's busiest time of year, and "you have to keep applications up," says Somogyi. Before, this was a pain point for the legacy infrastructure. Now, for the applications that have been migrated to the Kubernetes platform, "We have 100% uptime. We're not worried about 9s. There aren't any. It's 100%, which is pretty astonishing for us, compared to some of the existing platforms that have legacy challenges," says Shirley.

- -

"You can't even begin to put a price on how much that saves the company," Jackson explains. "A reduction in the number of support cases takes load out of our operations. The customer sentiment of having a reliable product drives customer retention and growth. It frees us to think about investing more into our digital transformation and taking a better quality of education to a global scale."

- -

The platform itself is also being broken down, "so we can quickly release smaller pieces of the platform, like upgrading our Kubernetes or all the different modules that make up our platform," says Somogyi. "One of the big focuses in 2018 is this scheme of delivery to update the platform itself."

- -

Guided by Pearson's overarching goal of getting to 200 million users, the team has run internal tests of the platform's scalability. "We had a challenge: 28 million requests within a 10 minute period," says Shirley. "And we demonstrated that we can hit that, with an acceptable latency. We saw that we could actually get that pretty readily, and we scaled up in just a few seconds, using open source tools entirely. Shout out to Locustfor that one. So that's amazing."

- -{{< case-studies/quote author="Benjamin Somogyi, Principal Systems Architect at Pearson" >}} -"We have 100% uptime. We're not worried about 9s. There aren't any. It's 100%, which is pretty astonishing for us, compared to some of the existing platforms that have legacy challenges. You can't even begin to put a price on how much that saves the company." -{{< /case-studies/quote >}} - -

In just two years, "We're already seeing tremendous benefits with Kubernetes—improved engineering productivity, faster delivery of applications and a simplified infrastructure," says Jackson. "But this is just the beginning. Kubernetes will help transform the way that educational content is delivered online."

- -

So far, about 15 production products are running on the new platform, including Pearson's new flagship digital education service, the Global Learning Platform. The Cloud Platform team continues to prepare, onboard and support customers that are a good fit for the platform. Some existing products will be refactored into 12-factor apps, while others are being developed so that they can live on the platform from the get-go. "There are challenges with bringing in new customers of course, because we have to help them to see a different way of developing, a different way of building," says Shirley.

- -

But, he adds, "It is our corporate motto: Always Learning. We encourage those teams that haven't started a cloud native journey, to see the future of technology, to learn, to explore. It will pique your interest. Keep learning."

diff --git a/content/ko/case-studies/pearson/pearson_featured.png b/content/ko/case-studies/pearson/pearson_featured.png deleted file mode 100644 index 6f8ffec49e6efbba25af84b21319bcdac403a2d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7784 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 - We are in the position to run things at scale, in a public cloud environment, and test things out in way that a lot of people might not be able to do. - -new_case_study_styles: true -heading_background: /images/case-studies/pinterest/banner1.jpg -heading_title_logo: /images/pinterest_logo.png -subheading: > - Pinning Its Past, Present, and Future on Cloud Native -case_study_details: - - Company: Pinterest - - Location: San Francisco, California - - Industry: Web and Mobile App ---- - -

Challenge

- -

After eight years in existence, Pinterest had grown into 1,000 microservices and multiple layers of infrastructure and diverse set-up tools and platforms. In 2016 the company launched a roadmap towards a new compute platform, led by the vision of creating the fastest path from an idea to production, without making engineers worry about the underlying infrastructure.

- -

Solution

- -

The first phase involved moving services to Docker containers. Once these services went into production in early 2017, the team began looking at orchestration to help create efficiencies and manage them in a decentralized way. After an evaluation of various solutions, Pinterest went with Kubernetes.

- -

Impact

- -

"By moving to Kubernetes the team was able to build on-demand scaling and new failover policies, in addition to simplifying the overall deployment and management of a complicated piece of infrastructure such as Jenkins," says Micheal Benedict, Product Manager for the Cloud and the Data Infrastructure Group at Pinterest. "We not only saw reduced build times but also huge efficiency wins. For instance, the team reclaimed over 80 percent of capacity during non-peak hours. As a result, the Jenkins Kubernetes cluster now uses 30 percent less instance-hours per-day when compared to the previous static cluster."

- -{{< case-studies/quote author="Micheal Benedict, Product Manager for the Cloud and the Data Infrastructure Group at Pinterest" >}} - -
-"So far it's been good, especially the elasticity around how we can configure our Jenkins workloads on that Kubernetes shared cluster. That is the win we were pushing for." -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -Pinterest was born on the cloud—running on AWS since day one in 2010—but even cloud native companies can experience some growing pains. -{{< /case-studies/lead >}} - -

Since its launch, Pinterest has become a household name, with more than 200 million active monthly users and 100 billion objects saved. Underneath the hood, there are 1,000 microservices running and hundreds of thousands of data jobs.

- -

With such growth came layers of infrastructure and diverse set-up tools and platforms for the different workloads, resulting in an inconsistent and complex end-to-end developer experience, and ultimately less velocity to get to production. So in 2016, the company launched a roadmap toward a new compute platform, led by the vision of having the fastest path from an idea to production, without making engineers worry about the underlying infrastructure.

- -

The first phase involved moving to Docker. "Pinterest has been heavily running on virtual machines, on EC2 instances directly, for the longest time," says Micheal Benedict, Product Manager for the Cloud and the Data Infrastructure Group. "To solve the problem around packaging software and not make engineers own portions of the fleet and those kinds of challenges, we standardized the packaging mechanism and then moved that to the container on top of the VM. Not many drastic changes. We didn't want to boil the ocean at that point."

- -{{< case-studies/quote - image="/images/case-studies/pinterest/banner3.jpg" - author="MICHEAL BENEDICT, PRODUCT MANAGER FOR THE CLOUD AND THE DATA INFRASTRUCTURE GROUP AT PINTEREST" ->}} -"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." -{{< /case-studies/quote >}} - -

The first service that was migrated was the monolith API fleet that powers most of Pinterest. At the same time, Benedict's infrastructure governance team built chargeback and capacity planning systems to analyze how the company uses its virtual machines on AWS. "It became clear that running on VMs is just not sustainable with what we're doing," says Benedict. "A lot of resources were underutilized. There were efficiency efforts, which worked fine at a certain scale, but now you have to move to a more decentralized way of managing that. So orchestration was something we thought could help solve that piece."

- -

That led to the second phase of the roadmap. In July 2017, after an eight-week evaluation period, the team chose Kubernetes over other orchestration platforms. "Kubernetes lacked certain things at the time—for example, we wanted Spark on Kubernetes," says Benedict. "But we realized that the dev cycles we would put in to even try building that is well worth the outcome, both for Pinterest as well as the community. We've been in those conversations in the Big Data SIG. 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."

- -

At the beginning of 2018, the team began onboarding its first use case into the Kubernetes system: Jenkins workloads. "Although we have builds happening during a certain period of the day, we always need to allocate peak capacity," says Benedict. "They don't have any auto-scaling capabilities, so that capacity stays constant. It is difficult to speed up builds because ramping up takes more time. So given those kind of concerns, we thought that would be a perfect use case for us to work on."

- -{{< case-studies/quote - image="/images/case-studies/pinterest/banner4.jpg" - author="MICHEAL BENEDICT, PRODUCT MANAGER FOR THE CLOUD AND THE DATA INFRASTRUCTURE GROUP AT PINTEREST" ->}} -"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." -{{< /case-studies/quote >}} - -

They ramped up the cluster, and working with a team of four people, got the Jenkins Kubernetes cluster ready for production. "We still have our static Jenkins cluster," says Benedict, "but on Kubernetes, we are doing similar builds, testing the entire pipeline, getting the artifact ready and just doing the comparison to see, how much time did it take to build over here. Is the SLA okay, is the artifact generated correct, are there issues there?"

- -

"So far it's been good," he adds, "especially the elasticity around how we can configure our Jenkins workloads on Kubernetes shared cluster. That is the win we were pushing for."

- -

By the end of Q1 2018, the team successfully migrated Jenkins Master to run natively on Kubernetes and also collaborated on the Jenkins Kubernetes Plugin to manage the lifecycle of workers. "We're currently building the entire Pinterest JVM stack (one of the larger monorepos at Pinterest which was recently bazelized) on this new cluster," says Benedict. "At peak, we run thousands of pods on a few hundred nodes. Overall, by moving to Kubernetes the team was able to build on-demand scaling and new failover policies, in addition to simplifying the overall deployment and management of a complicated piece of infrastructure such as Jenkins. We not only saw reduced build times but also huge efficiency wins. For instance, the team reclaimed over 80 percent of capacity during non-peak hours. As a result, the Jenkins Kubernetes cluster now uses 30 percent less instance-hours per-day when compared to the previous static cluster."

- -{{< case-studies/quote author="MICHEAL BENEDICT, PRODUCT MANAGER FOR THE CLOUD AND THE DATA INFRASTRUCTURE GROUP AT PINTEREST">}} -"We are in the position to run things at scale, in a public cloud environment, and test things out in way that a lot of people might not be able to do." -{{< /case-studies/quote >}} - -

Benedict points to a "pretty robust roadmap" going forward. In addition to the Pinterest big data team's experiments with Spark on Kubernetes, the company collaborated with Amazon's EKS team on an ENI/CNI plug in.

- -

Once the Jenkins cluster is up and running out of dark mode, Benedict hopes to establish best practices, including having governance primitives established—including integration with the chargeback system—before moving on to migrating the next service. "We have a healthy pipeline of use-cases to be on-boarded. After Jenkins, we want to enable support for Tensorflow and Apache Spark. At some point, we aim to move the company's monolithic API service. If we move that and understand the complexity around that, it builds our confidence," says Benedict. "It sets us up for migration of all our other services."

- -

After years of being a cloud native pioneer, Pinterest is eager to share its ongoing journey. "We are in the position to run things at scale, in a public cloud environment, and test things out in way that a lot of people might not be able to do," says Benedict. "We're in a great position to contribute back some of those learnings."

diff --git a/content/ko/case-studies/pinterest/pinterest_feature.png b/content/ko/case-studies/pinterest/pinterest_feature.png deleted file mode 100644 index ea5d6257894681f6afb0f969c3d0cb5b4bd371ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9118 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 bDj9+}Co@&exntg+KV}p_DzatL@BRM^K`Oyg diff --git a/content/ko/case-studies/pinterest/pinterest_logo.png b/content/ko/case-studies/pinterest/pinterest_logo.png deleted file mode 100644 index 0f744e7828cc2c0643135267fa2a7f1d5fb0813a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9003 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 - I would almost be so bold as to say that most of these applications that we are building now would not have been possible without the cloud native patterns and the flexibility that Kubernetes enables. - -new_case_study_styles: true -heading_background: /images/case-studies/slingtv/banner1.jpg -heading_title_logo: /images/slingtv_logo.png -subheading: > - Sling TV: Marrying Kubernetes and AI to Enable Proper Web Scale -case_study_details: - - Company: Sling TV - - Location: Englewood, Colorado - - Industry: Streaming television ---- - -

Challenge

- -

Launched by DISH Network in 2015, Sling TV experienced great customer growth from the beginning. After just a year, "we were going through some growing pains of some of the legacy systems and trying to find the right architecture to enable our future," says Brad Linder, Sling TV's Cloud Native & Big Data Evangelist. The company has particular challenges: "We take live TV and distribute it over the internet out to a user's device that we do not control," says Linder. "In a lot of ways, we are working in the Wild West: The internet is what it is going to be, and if a customer's service does not work for whatever reason, they do not care why. They just want things to work. Those are the variables of the equation that we have to try to solve. We really have to try to enable optionality and good customer experience at web scale."

- -

Solution

- -

Led by the belief that "the cloud native architectures and patterns really give us a lot of flexibility in meeting the needs of that sort of customer base," Linder partnered with Rancher Labs to build Sling TV's next-generation platform around Kubernetes. "We are going to need to enable a hybrid cloud strategy including multiple public clouds and an on-premise VMWare multi data center environment to meet the needs of the business at some point, so getting that sort of abstraction was a real goal," he says. "That is one of the biggest reasons why we picked Kubernetes." The team launched its first applications on Kubernetes in Sling TV's two internal data centers. The push to enable AWS as a data center option is underway and should be available by the end of 2018. The team has added Prometheus for monitoring and Jaeger for tracing, to work alongside the company's existing tool sets: Zenoss, New Relic and ELK.

- -

Impact

- -

"We are getting to the place where we can one-click deploy an entire data center – the compute, network, Kubernetes, logging, monitoring and all the apps," says Linder. "We have really enabled a platform thinking based approach to allowing applications to consume common tools. A new application can be onboarded in about an hour using common tooling and CI/CD processes. The gains on that side have been huge. Before, it took at least a few days to get things sorted for a new application to deploy. That does not consider the training of our operations staff to manage this new application. It is two or three orders of magnitude of savings in time and cost, and operationally it has given us the opportunity to let a core team of talented operations engineers manage common infrastructure and tooling to make our applications available at web scale."

- -{{< case-studies/quote author="Brad Linder, Cloud Native & Big Data Evangelist for Sling TV" >}} -"I would almost be so bold as to say that most of these applications that we are building now would not have been possible without the cloud native patterns and the flexibility that Kubernetes enables." -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -The beauty of streaming television, like the service offered by Sling TV, is that you can watch it from any device you want, wherever you want. -{{< /case-studies/lead >}} - - -

Of course, from the provider side of things, that creates a particular set of challenges "We take live TV and distribute it over the internet out to a user's device that we do not control," says Brad Linder, Sling TV's Cloud Native & Big Data Evangelist. "In a lot of ways, we are working in the Wild West: The internet is what it is going to be, and if a customer's service does not work for whatever reason, they do not care why. They just want things to work. Those are the variables of the equation that we have to try to solve. We really have to try to enable optionality and we have to do it at web scale."

- -

Indeed, Sling TV experienced great customer growth from the beginning of its launch by DISH Network in 2015. After just a year, "we were going through some growing pains of some of the legacy systems and trying to find the right architecture to enable our future," says Linder. Tasked with building a next-generation web scale platform for the "personalized customer experience," Linder has spent the past year bringing Kubernetes to Sling TV.

- -

Led by the belief that "the cloud native architectures and patterns really give us a lot of flexibility in meeting the needs of our customers," Linder partnered with Rancher Labs to build the platform around Kubernetes. "They have really helped us get our head around how to use Kubernetes," he says. "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."

- -{{< case-studies/quote - image="/images/case-studies/slingtv/banner3.jpg" - author="Brad Linder, Cloud Native & Big Data Evangelist for Sling TV" ->}} -"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." -{{< /case-studies/quote >}} - -

One big reason he chose Kubernetes was getting a level of abstraction that would enable the company to "enable a hybrid cloud strategy including multiple public clouds and an on-premise VMWare multi data center environment to meet the needs of the business," he says. Another factor was how much the Kubernetes ecosystem has matured over the past couple of years. "We have spent a lot of time and energy around making logging, monitoring and alerting production ready to give us insights into applications' well-being," says Linder. The team has added Prometheus for monitoring and Jaeger for tracing, to work alongside the company's existing tool sets: Zenoss, New Relic and ELK.

- -

With the emphasis on common tooling, "We are getting to the place where we can one-click deploy an entire data center – the compute, network, Kubernetes, logging, monitoring and all the apps," says Linder. "We have really enabled a platform thinking based approach to allowing applications to consume common tools and services. A new application can be onboarded in about an hour using common tooling and CI/CD processes. The gains on that side have been huge. Before, it took at least a few days to get things sorted for a new application to deploy. That does not consider the training of our operations staff to manage this new application. It is two or three orders of magnitude of savings in time and cost, and operationally it has given us the opportunity to let a core team of talented operations engineers manage common infrastructure and tooling to make our applications available at web scale."

- -{{< case-studies/quote - image="/images/case-studies/slingtv/banner4.jpg" - author="Brad Linder, Cloud Native & Big Data Evangelist for Sling TV" ->}} -"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." -{{< /case-studies/quote >}} - -

The team launched its first applications on Kubernetes in Sling TV's two internal data centers in the early part of Q1 2018 and began to enable AWS as a data center option. The company plans to expand into other public clouds in the future.

- -

The first application that went into production is a web socket-based back-end notification service. "It allows back-end changes to trigger messages to our clients in the field without the polling," says Linder. "We are talking about very high volumes of messages with this application. Without something like Kubernetes to be able to scale up and down, as well as just support that overall workload, that is pretty hard to do. I would almost be so bold as to say that most of these applications that we are building now would not have been possible without the cloud native patterns and the flexibility that Kubernetes enables."

- -

Linder oversees three teams working together on building the next-generation platform: a platform engineering team; an enterprise middleware services team; and a big data and analytics team. "We have really tried to bring everything together to be able to have a client application interact with a cloud native middleware layer. That middleware layer must run on a platform, consume platform services and then have logs and events monitored by an artificial agent to keep things running smoothly," says Linder.

- -{{< case-studies/quote author="BRAD LINDER, CLOUD NATIVE & BIG DATA EVANGELIST FOR SLING TV">}} -This undertaking is about "trying to marry Kubernetes with AI to enable web scale that just works". -{{< /case-studies/quote >}} - -

Ultimately, this undertaking is about "trying to marry Kubernetes with AI to enable web scale that just works," he adds. "We want the artificial agents and the big data platform using the actual logs and events coming out of the applications, Kubernetes, the infrastructure, backing services and changes to the environment to make decisions like, 'Hey we need more capacity for this service so please add more nodes.' From a platform perspective, if you are truly doing web scale stuff and you are not using AI and big data, in my opinion, you are going to implode under your own weight. It is not a question of if, it is when. If you are in a 'millions of users' sort of environment, that implosion is going to be catastrophic. We are on our way to this goal and have learned a lot along the way."

- -

For Sling TV, moving to cloud native has been exactly what they needed. "We have to be able to react to changes and hiccups in the matrix," says Linder. "It is the foundation for our ability to deliver a high-quality service for our customers. Building intelligent platforms, tools and clients in the field consuming those services has got to be part of all of this. In my eyes that is a big part of what cloud native is all about. It is taking these distributed, potentially unreliable entities and enabling a robust customer experience they expect."

diff --git a/content/ko/case-studies/slingtv/slingtv_featured_logo.png b/content/ko/case-studies/slingtv/slingtv_featured_logo.png deleted file mode 100644 index b52143ee8b6c650b4fe6c9d0b166b0f7163378ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8513 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 diff --git a/content/ko/case-studies/squarespace/index.html b/content/ko/case-studies/squarespace/index.html deleted file mode 100644 index 461e466d8c..0000000000 --- a/content/ko/case-studies/squarespace/index.html +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: Squarespace Case Study -case_study_styles: true -cid: caseStudies - -new_case_study_styles: true -heading_background: /images/case-studies/squarespace/banner1.jpg -heading_title_logo: /images/squarespace_logo.png -subheading: > - Squarespace: Gaining Productivity and Resilience with Kubernetes -case_study_details: - - Company: Squarespace - - Location: New York, N.Y. - - Industry: Software as a Service, Website-Building Platform ---- - -

Challenge

- -

Moving from a monolith to microservices in 2014 "solved a problem on the development side, but it pushed that problem to the infrastructure team," says Kevin Lynch, Staff Engineer on the Site Reliability team at Squarespace. "The infrastructure deployment process on our 5,000 VM hosts was slowing everyone down."

- -

Solution

- -

The team experimented with container orchestration platforms, and found that Kubernetes "answered all the questions that we had," says Lynch. The company began running Kubernetes in its data centers in 2016.

- -

Impact

- -

Since Squarespace moved to Kubernetes, in conjunction with modernizing its networking stack, deployment time has been reduced by almost 85%. Before, their VM deployment would take half an hour; now, says Lynch, "someone can generate a templated application, deploy it within five minutes, and have actual instances containerized, running in our staging environment at that point." Because of that, "productivity time is the big cost saver," he adds. "When we started the Kubernetes project, we had probably a dozen microservices. Today there are twice that in the pipeline being actively worked on." Resilience has also been improved with Kubernetes: "If a node goes down, it's rescheduled immediately and there's no performance impact."

- -{{< case-studies/quote author="Kevin Lynch, Staff Engineer on the Site Reliability team at Squarespace" >}} - -
-"Once you prove that Kubernetes solves one problem, everyone immediately starts solving other problems without you even having to evangelize it." -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -Since it was started in a dorm room in 2003, Squarespace has made it simple for millions of people to create their own websites. -{{< /case-studies/lead >}} - -

Behind the scenes, though, the company's monolithic Java application was making things not so simple for its developers to keep improving the platform. So in 2014, the company decided to "go down the microservices path," says Kevin Lynch, staff engineer on Squarespace's Site Reliability team. "But we were always deploying our applications in vCenter VMware VMs [in our own data centers]. Microservices solved a problem on the development side, but it pushed that problem to the Infrastructure team. The infrastructure deployment process on our 5,000 VM hosts was slowing everyone down."

- -

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." Deploying it in the data center rather than the public cloud was their biggest challenge, and at the time, not a lot of other companies were doing that. "We had to figure out how to deploy this in our infrastructure for ourselves, and we had to integrate it with our other applications," says Lynch.

- -

At the same time, Squarespace's Network Engineering team was modernizing its networking stack, switching from a traditional layer-two network to a layer-three spine-and-leaf network. "It mapped beautifully with what we wanted to do with Kubernetes," says Lynch. "It gives us the ability to have our servers communicate directly with the top-of-rack switches. We use Calico for CNI networking for Kubernetes, so we can announce all these individual Kubernetes pod IP addresses and have them integrate seamlessly with our other services that are still provisioned in the VMs."

- -{{< case-studies/quote image="/images/case-studies/squarespace/banner3.jpg" >}} -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." -{{< /case-studies/quote >}} - -

Within a couple months, they had a stable cluster for their internal use, and began rolling out Kubernetes for production. They also added Zipkin and CNCF projects Prometheus and fluentd to their cloud native stack. "We switched to Kubernetes, a new world, and we revamped all our other tooling as well," says Lynch. "It allowed us to streamline our process, so we can now easily create an entire microservice project from templates, generate the code and deployment pipeline for that, generate the Docker file, and then immediately just ship a workable, deployable project to Kubernetes." Deployments across Dev/QA/Stage/Prod were also "simplified drastically," Lynch adds. "Now there is little configuration variation."

- -

And the whole process takes only five minutes, an almost 85% reduction in time compared to their VM deployment. "From end to end that probably took half an hour, and that's not accounting for the fact that an infrastructure engineer would be responsible for doing that, so there's some business delay in there as well."

- -

With faster deployments, "productivity time is the big cost saver," says Lynch. "We had a team that was implementing a new file storage service, and they just started integrating that with our storage back end without our involvement"—which wouldn't have been possible before Kubernetes. He adds: "When we started the Kubernetes project, we had probably a dozen microservices. Today there are twice that in the pipeline being actively worked on."

- -{{< case-studies/quote image="/images/case-studies/squarespace/banner4.jpg" >}} -"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. -{{< /case-studies/quote >}} - -

There's also been a positive impact on the application's resilience. "When we're deploying VMs, we have to build tooling to ensure that a service is spread across racks appropriately and can withstand failure," he says. "Kubernetes just does it. If a node goes down, it's rescheduled immediately and there's no performance impact."

- -

Another big benefit is autoscaling. "It wasn't really possible with the way we've been using VMware," says Lynch, "but now we can just add the appropriate autoscaling features via Kubernetes directly, and boom, it's scaling up as demand increases. And it worked out of the box."

- -

For others starting out with Kubernetes, Lynch says his best advice is to "fail fast": "Once you've planned things out, just execute. Kubernetes has been really great for trying something out quickly and seeing if it works or not."

- -{{< case-studies/quote >}} -"When we're deploying VMs, we have to build tooling to ensure that a service is spread across racks appropriately and can withstand failure," he says. "Kubernetes just does it. If a node goes down, it's rescheduled immediately and there's no performance impact." -{{< /case-studies/quote >}} - -

Lynch and his team are planning to open source some of the tools they've developed to extend Kubernetes and use it as an API itself. The first tool injects dependent applications as containers in a pod. "When you ship an application, usually it comes along with a whole bunch of dependent applications that need to be shipped with that, for example, fluentd for logging," he explains. With this tool, the developer doesn't need to worry about the configurations.

- -

Going forward, all new services at Squarespace are going into Kubernetes, and the end goal is to convert everything it can. About a quarter of existing services have been migrated. "Our monolithic application is going to be the last one, just because it's so big and complex," says Lynch. "But now I'm seeing other services get moved over, like the file storage service. Someone just did it and it worked—painlessly. So I believe if we tackle it, it's probably going to be a lot easier than we fear. Maybe I should just take my own advice and fail fast!"

diff --git a/content/ko/case-studies/squarespace/squarespace_featured_logo.png b/content/ko/case-studies/squarespace/squarespace_featured_logo.png deleted file mode 100644 index 551b6da32119dd8701405202ab8c861d63966a97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4539 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 - Using Kubernetes to Build Tools to Improve the World's Wikis -case_study_details: - - Company: Wikimedia - - Location: San Francisco, CA ---- - -

The non-profit Wikimedia Foundation operates some of the largest collaboratively edited reference projects in the world, including Wikipedia. To help users maintain and use wikis, it runs Wikimedia Tool Labs, a hosting environment for community developers working on tools and bots to help editors and other volunteers do their work, including reducing vandalism. The community around Wikimedia Tool Labs began forming nearly 10 years ago.

- -{{< case-studies/quote author="Yuvi Panda, operations engineer at Wikimedia Foundation and Wikimedia Tool Labs">}} -Wikimedia -
-
-"Wikimedia Tool Labs is vital for making sure wikis all around the world work as well as they possibly can. Because it's grown organically for almost 10 years, it has become an extremely challenging environment and difficult to maintain. It's like a big ball of mud — you really can't see through it. With Kubernetes, we're simplifying the environment and making it easier for developers to build the tools that make wikis run better." -{{< /case-studies/quote >}} - -

Challenges

- -
    -
  • Simplify a complex, difficult-to-manage infrastructure
  • -
  • Allow developers to continue writing tools and bots using existing techniques
  • -
- -

Why Kubernetes

- -
    -
  • Wikimedia Tool Labs chose Kubernetes because it can mimic existing workflows, while reducing complexity
  • -
- -

Approach

- -
    -
  • Migrate old systems and a complex infrastructure to Kubernetes
  • -
- -

Results

- -
    -
  • 20 percent of web tools that account for more than 40 percent of web traffic now run on Kubernetes
  • -
  • A 25-node cluster that keeps up with each new Kubernetes release
  • -
  • Thousands of lines of old code have been deleted, thanks to Kubernetes
  • -
- -

Using Kubernetes to provide tools for maintaining wikis

- -

Wikimedia Tool Labs is run by a staff of four-and-a-half paid employees and two volunteers. The infrastructure didn't make it easy or intuitive for developers to build bots and other tools to make wikis work more easily. Yuvi says, "It's incredibly chaotic. We have lots of Perl and Bash duct tape on top of it. Everything is super fragile."

- -

To solve the problem, Wikimedia Tool Labs migrated parts of its infrastructure to Kubernetes, in preparation for eventually moving its entire system. Yuvi said Kubernetes greatly simplifies maintenance. The goal is to allow developers creating bots and other tools to use whatever development methods they want, but make it easier for the Wikimedia Tool Labs to maintain the required infrastructure for hosting and sharing them.

- -

"With Kubernetes, I've been able to remove a lot of our custom-made code, which makes everything easier to maintain. Our users' code also runs in a more stable way than previously," says Yuvi.

- -

Simplifying infrastructure and keeping wikis running better

- -

Wikimedia Tool Labs has seen great success with the initial Kubernetes deployment. Old code is being simplified and eliminated, contributing developers don't have to change the way they write their tools and bots, and those tools and bots run in a more stable fashion than they have in the past. The paid staff and volunteers are able to better keep up with fixing issues.

- -

In the future, with a more complete migration to Kubernetes, Wikimedia Tool Labs expects to make it even easier to host and maintain the bots and tools that help run wikis across the world. The tool labs already host approximately 1,300 tools and bots from 800 volunteers, with many more being submitted every day. Twenty percent of the tool labs' web tools that account for more than 60 percent of web traffic now run on Kubernetes. The tool labs has a 25-node cluster that keeps up with each new Kubernetes release. Many existing web tools are migrating to Kubernetes.

- -

"Our goal is to make sure that people all over the world can share knowledge as easily as possible. Kubernetes helps with that, by making it easier for wikis everywhere to have the tools they need to thrive," says Yuvi.

diff --git a/content/ko/case-studies/wikimedia/wikimedia_featured.png b/content/ko/case-studies/wikimedia/wikimedia_featured.png deleted file mode 100644 index 7b1f89ac98490d8c64ec722375bbcae0d8ec9880..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21322 zcmeI4c|26_+sDt?BD<_Dj4dS0*o`$yNF@6bVGK={k+JVvAwp6jOO!;GWZyz%%a(oL zLs>(S{W+>%-}!Ej=XqYwpU&%L=5pWH=eqCnzOU<^W6tXc)znZXKYIKq0088wDvDa* zdn5SskQfhqt#L5|UjY&a6+Ka# zvdPLEm2yLX0qjst=1?~~TYD_RO`7dTTm)$EHw&;qf4Df=NVA>W9}sGwt_fAZIHI5; z{GxnFxR5whOoAUSA|Wm)d=@GQgNq8lBn05Xd@wiyCV_y#p}!6`nWLa3wm+t3i4;KDqU=!iPFPR}|3{s}HH;Gmdkyn1L;mjm*MY$`QCI&x_CLoE?!UB^U5i*#GJ5ozPZ)EY6=I?f3la+)-}mf06C? z{FMDjg`X=V1)eKH!4YNdgmKitU~FZ6W|`)H5JD9c_OnV1%B^mWMBDFk<&hHjtLTpv z|05ns(cB3ov#;fYiSY@+bp&Au5n+Ug2>2@k2Ez&R)AKJe)G?N5EBC*}5JbR)5P~q= z7&xAPjR97WrMZ*&|0oKsFHRgwB*F^gXlL#ugSIobMhQ6BTT2Q2(TL;uJFgH57+Z`Z zI4zWnkd(kbHRGs$( z{(n2fKZN<)P%3CFn4#`CnG5FckKIfgb>q*i|LL$r|Jaor%pI|){hE_z`%lsR-o}3K zQu~@8wTm!E?(b(Z$o-N)SxO1~sr8R({Z{^xq5rQ7_%l9^{NKlLy@s;??+WT?s2^Vc z9t4ZAa&k3yM4ht+bK-wi?LXuGS@_ohqy+Xq0c_EKUW%Wse_o;g!lAPhVN;QOz?q`2LGl^Xu{QrzypO8-#m+M}Ih z1b>b8mu4K*{_gv8W6%aK6i_mvA|gUy{rp(=f4u`mKX&h)D;yMr!uEQZNTp9=3hqw+zgzIpK3zx=$_93nV5#c%< z;=-kIpnZtzKt#9>hq!QQ9B3cnIuH@A!yztQ8VA~kxDG^w>u`t*m&SqiA+7@v;W`}R z!liMbeTeHoM7R!zxNvD4XdmJ_5D~7!Aue1R2ik|Y4n&0OaEJ?+#)0-Bt^*O_IvnD{ zrE#Eri0eQ^xDJQ7aA_Q9AL2R?5w61_E?gQ1+K0FfM1<>bhzpm-f%YM;0}p(=f4u`mKX&h)D;yMr!uEQZNTp9=3hqw+zgzIpK3zx=$_J51(=pPRNqU^z^ z{#?Pw`&{wP=z)(0LXj$3>Hy%u2>^b90I;zKzJCS)XBYs?ngIafApkI7qOaDT2Y}=8 zs*2}y+y>?oJ-u|g3+sCatgQrv+{s89EukyK5P~#6mTx^~RGQCe3Gid|Jo37f1-g#t zSpTC*H5HBrl-aaNj0eP6D2PQU^C-jg}j;jm>AXAEMeW+zqOm!Cb3F< z&U4VF(Q|XOcw)JCkY+;Y7=Yq4Qt}YeLrY{wBv7E|FPL4hr8X8*?lA<62V|n=i zKGvECQD$l?zk0xqpFLp5uO3jculXU_*Zh?1YjA^k1f86qPq-T1@gdZxFpUY&63nk~ zXGl>P60YfyJzbc$T!~gPQoKCZ3a|k%AW~KiI9;V1FABRll)6f)w3m&&zNIcEd`jYR zZ!a9$K+Xu@;lYT`)+Wz=eM;}^6(z*Q(YN``$ah1oa6CMS26iv=n%8YPCVV-fuKULx zR+iruPn?JdHP}7zxrLYLI=LVu6mCXuKwM2uiyHEP;Driz*_B)mDM1EgW1e1$-R7D( z-CCq@(h`u1+LG@&{&C%&k$3Tt+1y-ukgo5U_SreRTR^G|bq!e#BY+Bzs|!z%#>!I? z)eaxCO}un_W~-Ry>qwp9_IEm8QIwA zTT>{9Q&T=@IAyfEawj1BX$QvDo6yd@)a1VI0z?Qx4+u98!1|7n|)TZn~Vs7>k&NQ%lNH zQ}(1$+DFmhhd9GhPj-AQD>|k7%It-w&CoGS6DzqNg!S|p;%Yex<)bVHqx~YLrC*t1 zWvNcs*RBNkRi{#P6kVt78{@$uuI_YjVj5D20iaOh9e34cw!i|FtuxZ@`?k0^ryOwI zC!-qh0|MnTZT3247b_aP+6ye|06*6ACg$>MH4&o=uG)@{0>-ZahKzGCcd4lquOyQ#TS?_EpkwN*}bFlbrj~RbeG9=u%vehS65K(FA{-zPzp>>{Y>4b`_u}dTbW~vS; zYp1$6jhD`mHG0O)Ww3D;@!~0^dINxOU*Dc?&$hff#~^8n=pK0r_tstx%)>Z$G4FNG z+c>|~oI@>YW&_Ek+YpkmGX0U(lM-jvbg-lDMrqU}4JX9-Rllp?FZwD_pyjB51twli z;;$OgyI(Gv7ncRI5p}l-*9W(e0eI*f244?#JOfa8fucx9xLZ#wd2^9vN&1CLA0};$ z1%|xzEhai~hl{>^yVSl)wsy&N3%hlv(r3kHX=khxnP-N+C4=7SX#2>1{|?v5po>0p z{y~?%wR?*ZRA@Z*GD6465)j*{o^<9kuH0Tl-FFPOI(;hSzN#4zqh84&;PTP1@QEr( zlKqQVDnOI;NV>h3%;x{G5#OWi{`M@O%c&9v}*_svsmI zmN3!g^0HWW2r<)q9YsdmqaWg@DK(MWcbA2Ec#e%CSl8_OWcP9VM|sP4iMy*Br?`>W zQSaG{#(@OH#I$~RRDe9IB&YYc-IBt@ntn8tx--P$q6|Ki7EWNyP<9-lvtipOOt!Y& z3bVQ*B5eNgp65vBwM-EqydFCk5M}P%lmVYxv<{SIxXTt#ZDjTMz)-*>A9KX&GiVG6_p`(%X;G}bzZJlznj$X z)ZO`aco6v-GbkK(I*^?&b7|OX1FwbyJR>>@@k;1Mn2dX#kjbx89z;?v?Jh zUE|*PXdXRzg88%a1K#!f^QQN9`*3@r6R1P|ieb%fIi1F}i=yINh@0oLjD`p5dWBwhOS)w#6f*g}T5R&*8KH}fRf zxp5E$LGXww;_`yi%PVO7{N<_>7#&$I@I`Z)y*s1g%+}AVU(38(xhr9YNkWlD0jWbB z=9)Dr3;Q6w;vI-1T%-bPlwtUx9_1B(b5s-Ok}j@G#522#zastzUH!$zh@lpq@%Y6I)J5Hb$oK%pc>p(DoCU-H}eOA3w} zW#2xkGH?ggh%Dw%ggsYf4E4#q&vzqEHJwAL>1!6t1Z*M*E*W;$k2CCb5a37jFo`ck z?>Jj_FDG)U#T3!ds%}Q%s?8TEolqO}w1|X^k z*HYOC<(@Y9tt?3NNsL(ZC^ajoS;nxkF%r`NP)0HizzilVgz*y)Tl}7%@;vWp4_AQ^ zKS{YWgje!y!pPu>YAVSY8jtc$r@HS~7hlpGLF6A1l!r8wV#w?Lp(`t}&^V zk2nVM7+pDEK%e5!YA}*Ccf*4R(wKx1T(zemI7*dLH#9zZj7|Q-oljO2udmoK*2Yee z7V$gXVM!p3iT?}{PKi<&i0rBDX20@4(x8()h}GyO{M}Ih^>coCOhJkzQE`irg4kOs z*;5UlgpZkN>LvHTt*d4Jz9lWV9qB za#Vg7BsRcLarD-jKZowCyh4ZhT1al^S>cy6wgi4-9qUygr{X?qROReF5A$3XgQQNc zx7zHGNtO=izItmkn*v0m3aHH7)~YMIvij6zfG>-&>E|N*SRc38R8M;CaVdc(96g5D z(DKSQvb)(oWhkdY&x70I9o^>e)-cO=t%|oh_%)evd0Wy@Af z4z^a>Q<|1l$3FC)#YMo%2MT8NrfAdK@y7-#V^ z4_g*dg!f!|xRr@Xa>xke*br)tUfT$jJuW@=y07CEsKx}i(rQ*!I0wB_C|Kr{`<{sC6evO&v-b7Wqs1S%XOaX9vPnLO!A(MN0sSF z4n=x+k}bwbHA3$CgB=U*)Fcv7@-I^el~|HCQBJ{?yLTMRj}L#Si)|*sT=`^FY&P+5 z+qOn;z2|C#XscnNiJov1XRWBl8@Wu<4k_I|=Rmd1nRi4ndF=vTeJ+`X6v|nq{_scH z{)AfEJ`&$vmEXQ4PpKKb9?Nns*?Z18mZ)SYKg{l7+?(jY%(KN58{Lmsyqu?5s`NJU z>b5!ODD~gJ+W1OtQ(Pz!XXal(8#&smP#wU$GSmx+tRTP5c0{)+$f4+AsTxaE`bzPL z_fCk$Dc-8k2+G zq@-22q($jr`VGm#?BTuz;Vn2q%ENoaYVj1Zg5f0Kr&vA5+%7Ozww+L8m_aj<_uxYW z@{Xs?i4^H~Z?UB&@FwMjoh^=O61j@ob#t?cy`G~c$5Mhbtffi4mD9ZDX0;647rYb; zK1pm|(Wm$R{>+5cZrujj{_5p5>B`~JM@wX3Ru|w=vmP(M-yVEz3`k#+4&wvFxr^1k z7rjeOAgXv{Ck&9H%6{DqMDr`s^!GUO9SXuM=i#C^riY^Z%n2%TWVh=Jj}gttN9sf( z!&bj+rq@4sFb|iG-}!_n7YxRp&+-x1V_0@GR(c}E8g|}D&aXo*b8c}?d05E)Va$A^ zYfX>DQ*FI3pR9;qI0h3DJTd+Zza?sA$1yohThsSUrF{x&D)E+ElU~IYpEZ~z>9a=1 zb*-8nF_@C_^%J&@GzBL-{@%L?3 zaa(-2iCOZ-V8|Jp=j)mz6nZws6Do2`RGHHt$qZEIDd)=VTNyEt#kv96{Ao-Dtj}|{ z=KEHCGXf~+fREE=PH))(P5LqNN~zY;ScaiZOyG(abFl)Hvu{&Ui3v%j6PQVj4_u*$ zo``}Cc*=uc!+g#C_2o`iOIORR#@y`eNebnqk;*5kK}Djf(H$MBTRX zmum(*owa6Bk9)ZS3sSFI`%9n{cFWX=#bkO7Hxx{@}vv^$|~q+0N#-8nZ8p3T-J}TffQJl`B{R~#8ktEgV zo1KwyqkK4;Lqu5ki@wX!2sw~%)iP0KWo7l?!Gi&)m8GTa=<7tR-qow4U0uTHj;F7^ zw^m#^RR;=fV(n;2Skuzdz}Qv0-*OiyUs}}OURhb`=+Lro-n_>Vs^u|gSIl>%#9{o+ z&8p4r-0xGwtRW8{JScKm7>JIJCM2cT(bLN@D$LBwyUX%0KK=r6V{^ETQU8YzUmCfR z9fWKnX>Gkv9GCVG24e2tU%o14+xHSX(;6we>(&x4vVA{M(iM@|y1mUWY4o|Qm9bNJ z!L@2@ILk1_H7eHz zY#8{Agk9$QjxdLKUVqs%<*_jpOQ$p*EcNw+0?Ef4ty0X9g9{Og&F8T(r)7AaXJlj) z7CP^4Z`c=mg0FMExtMF$8X6m^ZN1gboH;X4ik(T2!0PB$uDs{Xf3<&bsFrO^Kayr{ zdujfbzw~4D>Jtgy-R(Bny$bNi%9@{jkt?$|#i6?5QMo$ZqD_mc2_UpDmZUw(Ie((l zxw53BSb6q-cAvboG|n}HMPs`GVRbMHnCH1wy9i&@#JkYjsn_D`teL@Y zI2DSA9M!b7?>$2wJAH91w>e3=JTvnsa62sQ*z0dWS55e1bLJ?5k;@ack z(WwcB4(H*Bf-C&JiLN8)Hr2s_0aK69X@xeuBR*RT;5<|{(mP?{L9n5v^}&?zY_LjF zQ`rWW3JMCY#ar!_xh+r7@#;x!e7tu_YB}ib_~RIQditV*g1*rmU40We3a-UPjGZ0d z*|P=IWWjGI>+TGe++d&SgM~{jmaubi)x*NUaIsB=u1lu7J@ftfGtF_xdkhr8_2EpN zBO|TaCzKLd}oc+lK;8rp}Z)?)KkucYAm)&!1J|jDOXCh4C7WoMxU~6sR9tV$z2pw>S zmscSrs%?gsk5Ag^6V)YQ9ew@cq9Slt=;`X3A1uywT^gaIqpS4zHbHt9c!}VJi5`ue#OOnbLke}UfbUavt4n2`#1u&#$%?d^Bto**=dy;TU)0`NBi@w zMbzUR{bn@4V#(P#Q0~0#l@Jx zqL$aGiFky-1s>T8y4^iJdOmJ0E}~V>%^7QJYr#*4FXM07MrN(FbPF#f%Xo$M&aCR{ z>FMd}f}1cnJ|&CH$^BA!-_%rUI8fy)E08(GV1)U9K<{V0{;nX2AeBnaofz(9<(ZxxLKGTmF!ufI^|R*_VSXe0+RB{xk1v1$juY z>FJk}i_~6;%PB{k9KZkE(9lrS7c5zYcjp3$mKEK>wX)CYFG-oSjA7fmlEBJRh=TIb&kiRQR*#K_oq&aw39(W52suv6~f^7-s+g120P u6f1t*n)yH9fcf`ZGyig*C-Lf@B(U2}a^+FId;b1^yHr)uP|T4x3-~V@R@z(u diff --git a/content/ko/case-studies/wikimedia/wikimedia_logo.png b/content/ko/case-studies/wikimedia/wikimedia_logo.png deleted file mode 100644 index 3ad5b630342048494a4ce20f52ea46c310c431a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7875 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%0AwOxR>&A$MvnP6#U}J3!Na*I1 zr=6XhJ#Xj-qKb-&auBNE948YUo%b%51_qprHfm}=L(k{^?{Ck40RaFwaP;2f)TAo5 zpr%G2{BI%npcXaG!_ICCDB82E5+^#_!O@Q)e0r~)oSdqHs~v`hGhT3EtP-T}Z;k;< z0P1Go1IhPpIUas-(6CCXHFkBnYJ$U`~Ki;reV3@Ie32 z(0n`kUUbq7FT1KrS0`z3aB!!rd4JZu{gZJA0;Z2ZbkOj^V29VYr6#qKK_@WVr!QUv z1LXteT}z7;DBar_%YMKL1t%pXA=C+pX$0LDS^%TV+pbW6ivUVwCq2N8$ji&))+=C; z326Wd3gsrDZJkUYb*L_Oaj1ZGjE$#DO~o!Jc252FW_-I|kpR$k{uGThc&@_ofl&Eh znK3*p2sRO-&78(a)bh0izreY5@iX98s6LU{R*0 zrvYW(1TrpQX_N1cA5eHv^O=BPK>ap2m?Yt7KB=dt2T1W;t_m3lSX7z7qqVi4A5H6A zxG?|;e)aVs9@#H-M95?b2n$y$7f3gGR!xw;=i-#A>au^E3y - Cloud-Native Infrastructure Keeps Your Smart Home Connected -case_study_details: - - Company: Wink - - Location: New York, N.Y. - - Industry: Internet of Things Platform ---- - -

Challenge

- -

Building a low-latency, highly reliable infrastructure to serve communications between millions of connected smart-home devices and the company's consumer hubs and mobile app, with an emphasis on horizontal scalability, the ability to encrypt everything quickly and connections that could be easily brought back up if anything went wrong.

- -

Solution

- -

Across-the-board use of a Kubernetes-Docker-CoreOS Container Linux stack.

- -

Impact

- -

"Two of the biggest American retailers [Home Depot and Walmart] are carrying and promoting the brand and the hardware," Wink Head of Engineering Kit Klein says proudly – though he adds that "it really comes with a lot of pressure. It's not a retail situation where you have a lot of tech enthusiasts. These are everyday people who want something that works and have no tolerance for technical excuses." And that's further testament to how much faith Klein has in the infrastructure that the Wink team has built. With 80 percent of Wink's workload running on a unified stack of Kubernetes-Docker-CoreOS, the company has put itself in a position to continually innovate and improve its products and services. Committing to this technology, says Klein, "makes building on top of the infrastructure relatively easy."

- -{{< case-studies/quote author="KIT KLEIN, HEAD OF ENGINEERING, WINK" >}} -"It's not proprietary, it's totally open, it's really portable. You can run all the workloads across different cloud providers. You can easily run a hybrid AWS or even bring in your own data center. That's the benefit of having everything unified on one open source Kubernetes-Docker-CoreOS Container Linux stack. There are massive security benefits if you only have one Linux distro/machine image to validate. The benefits are enormous because you save money, and you save time." -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -How many people does it take to turn on a light bulb? -{{< /case-studies/lead >}} - -

Kit Klein whips out his phone to demonstrate. With a few swipes, the head of engineering at Wink pulls up the smart-home app created by the New York City-based company and taps the light button. "Honestly when you're holding the phone and you're hitting the light," he says, "by the time you feel the pressure of your finger on the screen, it's on. It takes as long as the signal to travel to your brain."

- -

Sure, it takes just one finger and less than 200 milliseconds to turn on the light – or lock a door or change a thermostat. But what allows Wink to help consumers manage their connected smart-home products with such speed and ease is a sophisticated, cloud native infrastructure that Klein and his team built and continue to develop using a unified stack of CoreOS, the open-source operating system designed for clustered deployments, and Kubernetes, an open-source platform for automating deployment, scaling, and operations of application containers across clusters of hosts, providing container-centric infrastructure. "When you have a big, complex network of interdependent microservices that need to be able to discover each other, and need to be horizontally scalable and tolerant to failure, that's what this is really optimized for," says Klein. "A lot of people end up relying on proprietary services [offered by some big cloud providers] to do some of this stuff, but what you get by adopting CoreOS/Kubernetes is portability, to not be locked in to anyone. You can really make your own fate."

- -

Indeed, Wink did. The company's mission statement is to make the connected home accessible – that is, user-friendly for non-technical owners, affordable and perhaps most importantly, reliable. "If you can't trust that when you hit the switch, you know a light is going to go on, or if you're remote and you're checking on your house and that information isn't accurate, then the convenience of the system is lost," says Klein. "So that's where the infrastructure comes in."

- -

Wink was incubated within Quirky, a company that developed crowd-sourced inventions. The Wink app was first introduced in 2013, and at the time, it controlled only a few consumer products such as the PivotPower Strip that Quirky produced in collaboration with GE. As smart-home products proliferated, Wink was launched in 2014 in Home Depot stores nationwide. Its first project: a hub that could integrate with smart products from about a dozen brands like Honeywell and Chamberlain. The biggest challenge would be to build the infrastructure to serve all those communications between the hub and the products, with a focus on maximizing reliability and minimizing latency.

- -

"When we originally started out, we were moving very fast trying to get the first product to market, the minimum viable product," says Klein. "Lots of times you go down a path and end up having to backtrack and try different things. But in this particular case, we did a lot of the work up front, which led to us making a really sound decision to deploy it on CoreOS Container Linux. And that was very early in the life of it."

- -{{< case-studies/quote image="/images/case-studies/wink/banner3.jpg">}} -"...what you get by adopting CoreOS/Kubernetes is portability, to not be locked in to anyone. You can really make your own fate." -{{< /case-studies/quote >}} - -

Concern number one: Wink's products need to connect to consumer devices in people's homes, behind a firewall. "You don't have an end point like a URL, and you don't even know what ports are open behind that firewall," Klein explains. "So you essentially need to have this thing wake up and talk to your system and then open real-time, bidirectional communication between the cloud and the device. And it's really, really important that it's persistent because you want to decrease as much as possible the overhead of sending a message – you never know when someone is going to turn on the lights."

- -

With the earliest version of the Wink Hub, when you decided to turn your lights on or off, the request would be sent to the cloud and then executed. Subsequent updates to Wink's software enabled local control, cutting latency down to about 10 milliseconds for many devices. But with the need for cloud-enabled integrations of an ever-growing ecosystem of smart home products, low-latency internet connectivity is still a critical consideration.

- -{{< case-studies/lead >}} -"You essentially need to have this thing wake up and talk to your system and then open real-time, bidirectional communication between the cloud and the device. And it's really, really important that it's persistent...you never know when someone is going to turn on the lights." -{{< /case-studies/lead >}} - -

In addition, Wink had other requirements: horizontal scalability, the ability to encrypt everything quickly, connections that could be easily brought back up if something went wrong. "Looking at this whole structure we started, we decided to make a secure socket-based service," says Klein. "We've always used, I would say, some sort of clustering technology to deploy our services and so the decision we came to was, this thing is going to be containerized, running on Docker."

- -

At the time – just over two years ago – Docker wasn't yet widely used, but as Klein points out, "it was certainly understood by the people who were on the frontier of technology. We started looking at potential technologies that existed. One of the limiting factors was that we needed to deploy multi-port non-http/https services. It wasn't really appropriate for some of the early cluster technology. We liked the project a lot and we ended up using it on other stuff for a while, but initially it was too targeted toward http workloads."

- -

Once Wink's backend engineering team decided on a Dockerized workload, they had to make decisions about the OS and the container orchestration platform. "Obviously you can't just start the containers and hope everything goes well," Klein says with a laugh. "You need to have a system that is helpful [in order] to manage where the workloads are being distributed out to. And when the container inevitably dies or something like that, to restart it, you have a load balancer. All sorts of housekeeping work is needed to have a robust infrastructure."

- -{{< case-studies/quote image="/images/case-studies/wink/banner4.jpg" >}} -"Obviously you can't just start the containers and hope everything goes well," Klein says with a laugh. "You need to have a system that is helpful [in order] to manage where the workloads are being distributed out to. And when the container inevitably dies or something like that, to restart it, you have a load balancer. All sorts of housekeeping work is needed to have a robust infrastructure." -{{< /case-studies/quote >}} - -

Wink considered building directly on a general purpose Linux distro like Ubuntu (which would have required installing tools to run a containerized workload) and cluster management systems like Mesos (which was targeted toward enterprises with larger teams/workloads), but ultimately set their sights on CoreOS Container Linux. "A container-optimized Linux distribution system was exactly what we needed," he says. "We didn't have to futz around with trying to take something like a Linux distro and install everything. It's got a built-in container orchestration system, which is Fleet, and an easy-to-use API. It's not as feature-rich as some of the heavier solutions, but we realized that, at that moment, it was exactly what we needed."

- -

Wink's hub (along with a revamped app) was introduced in July 2014 with a short-term deployment, and within the first month, they had moved the service to the Dockerized CoreOS deployment. Since then, they've moved almost every other piece of their infrastructure – from third-party cloud-to-cloud integrations to their customer service and payment portals – onto CoreOS Container Linux clusters.

- -

Using this setup did require some customization. "Fleet is really nice as a basic container orchestration system, but it doesn't take care of routing, sharing configurations, secrets, et cetera, among instances of a service," Klein says. "All of those layers of functionality can be implemented, of course, but if you don't want to spend a lot of time writing unit files manually – which of course nobody does – you need to create a tool to automate some of that, which we did."

- -

Wink quickly embraced the Kubernetes container cluster manager when it was launched in 2015 and integrated with CoreOS core technology, and as promised, it ended up providing the features Wink wanted and had planned to build. "If not for Kubernetes, we likely would have taken the logic and library we implemented for the automation tool that we created, and would have used it in a higher level abstraction and tool that could be used by non-DevOps engineers from the command line to create and manage clusters," Klein says. "But Kubernetes made that totally unnecessary – and is written and maintained by people with a lot more experience in cluster management than us, so all the better." Now, an estimated 80 percent of Wink's workload is run on Kubernetes on top of CoreOS Container Linux.

- -{{< case-studies/quote >}} -"Stay close to the development. Understand why decisions are being made. If you understand the intent behind the project, from the technological intent to a certain philosophical intent, then it helps you understand how to build your system in harmony with those systems as opposed to trying to work against it." -{{< /case-studies/quote >}} - -

Wink's reasons for going all in are clear: "It's not proprietary, it's totally open, it's really portable," Klein says. "You can run all the workloads across different cloud providers. You can easily run a hybrid AWS or even bring in your own data center. That's the benefit of having everything unified on one Kubernetes-Docker-CoreOS Container Linux stack. There are massive security benefits if you only have one Linux distro to try to validate. The benefits are enormous because you save money, you save time."

- -

Klein concedes that there are tradeoffs in every technology decision. "Cutting-edge technology is going to be scary for some people," he says. "In order to take advantage of this, you really have to keep up with the technology. You can't treat it like it's a black box. Stay close to the development. Understand why decisions are being made. If you understand the intent behind the project, from the technological intent to a certain philosophical intent, then it helps you understand how to build your system in harmony with those systems as opposed to trying to work against it."

- -

Wink, which was acquired by Flex in 2015, now controls 2.3 million connected devices in households all over the country. What's next for the company? A new version of the hub - Wink Hub 2 - hit shelves last November – and is being offered for the first time at Walmart stores in addition to Home Depot. "Two of the biggest American retailers are carrying and promoting the brand and the hardware," Klein says proudly – though he adds that "it really comes with a lot of pressure. It's not a retail situation where you have a lot of tech enthusiasts. These are everyday people who want something that works and have no tolerance for technical excuses." And that's further testament to how much faith Klein has in the infrastructure that the Wink team has have built.

- -

Wink's engineering team has grown exponentially since its early days, and behind the scenes, Klein is most excited about the machine learning Wink is using. "We built [a system of] containerized small sections of the data pipeline that feed each other and can have multiple outputs," he says. "It's like data pipelines as microservices." Again, Klein points to having a unified stack running on CoreOS Container Linux and Kubernetes as the primary driver for the innovations to come. "You're not reinventing the wheel every time," he says. "You can just get down to work."

diff --git a/content/ko/case-studies/wink/wink_featured.png b/content/ko/case-studies/wink/wink_featured.png deleted file mode 100644 index 3c01133bef701699285d864d8b1924ad6e6b8e10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21292 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 ZNQ6ZA;4Y$D!1JqEBRw - With OpenTracing, my team was able to look at a trace and make optimization suggestions to another team without ever looking at their code. - -new_case_study_styles: true -heading_background: /images/case-studies/workiva/banner1.jpg -heading_title_logo: /images/workiva_logo.png -subheading: > - Using OpenTracing to Help Pinpoint the Bottlenecks -case_study_details: - - Company: Workiva - - Location: Ames, Iowa - - Industry: Enterprise Software ---- - -

Challenge

- -

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.

- -

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."

- -{{< case-studies/quote author="MacLeod Broad, Senior Software Architect at Workiva" >}} -"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-studies/quote >}} - -{{< case-studies/lead >}} -Last fall, MacLeod Broad's platform team at Workiva was prepping one of the company's first products utilizing Amazon Web Services when they ran into a roadblock. -{{< /case-studies/lead >}} - -

Early on, Workiva's backend had run mostly on Google App Engine. But things changed along the way as Workiva's SaaS offering, Wdesk, a cloud-based platform for managing and reporting business data, grew its customer base to more than 70 percent of the Fortune 500 companies. "As customer needs grew and the product offering expanded, we started to leverage a wider offering of services such as Amazon Web Services as well as other Google Cloud Platform services, creating a multi-vendor environment."

- -

With this new product, there was a "sync and link" feature by which data "went through a whole host of services starting with the new spreadsheet system [Amazon Aurora] into what we called our linking system, and then pushed through http to our existing system, and then a number of calculations would go on, and the results would be transmitted back into the new system," says Broad. "We were trying to optimize that for speed. We thought we had made this great optimization and then it would turn out to be a micro optimization, which didn't really affect the overall speed of things."

- -

The challenges faced by Broad's team may sound familiar to other companies that have also made the shift from monoliths to more distributed, microservice-based systems. "We had a number of people working on this, all on different teams, so it was difficult to get our head around what the issues were and where the bottlenecks were," says Broad.

- -

"Each service team was going through different iterations of their architecture and it was very hard to follow what was actually going on in each teams' system," he adds. "We had circular dependencies where we'd have three or four different service teams unsure of where the issues really were, requiring a lot of back and forth communication. So we wasted a lot of time saying, 'What part of this is slow? Which part of this is sometimes slow depending on the use case? Which part is degrading over time? Which part of this process is asynchronous so it doesn't really matter if it's long-running or not? What are we doing that's redundant, and which part of this is buggy?'"

- -{{< case-studies/quote - image="/images/case-studies/workiva/banner3.jpg" - author="MACLEOD BROAD, SENIOR SOFTWARE ARCHITECT AT WORKIVA" ->}} -"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." -{{< /case-studies/quote >}} - -

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?'"

- -

Using the insight OpenTracing gave them, "My team was able to look at a trace and make optimization suggestions to another team without ever looking at their code," says Broad. "The way we named our traces gave us insight whether it's doing a SQL call or it's making an RPC. And so it was really easy to say, 'OK, we know that it's going to page through all these requests. Do the work once and stuff it in cache.' And we were done basically. All those calls became sub-second calls immediately."

- -{{< case-studies/quote - image="/images/case-studies/workiva/banner4.jpg" - author="MACLEOD BROAD, SENIOR SOFTWARE ARCHITECT AT WORKIVA" ->}} -"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." -{{< /case-studies/quote >}} - -

After the success of the first use case, everyone involved in the trial went back and fully instrumented their products. Tracing was added to a few more use cases. "We wanted to get through the initial implementation pains early without bringing the whole department along for the ride," says Broad. "Now, a lot of teams add it when they're starting up a new service. We're really pushing adoption now more than we were before."

- -

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."

- -

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."

- -{{< case-studies/quote author="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." -{{< /case-studies/quote >}} - -

For Workiva, OpenTracing has become an essential tool for zeroing in on optimizations and determining what's actually a micro-optimization by observing usage patterns. "On some projects we often assume what the customer is doing, and we optimize for these crazy scale cases that we hit 1 percent of the time," says Broad. "It's been really helpful to be able to say, 'OK, we're adding 100 milliseconds on every request that does X, and we only need to add that 100 milliseconds if it's the worst of the worst case, which only happens one out of a thousand requests or one out of a million requests."

- -

Unlike many other companies, Workiva also traces the client side. "For us, the user experience is important—it doesn't matter if the RPC takes 100 milliseconds if it still takes 5 seconds to do the rendering to show it in the browser," says Broad. "So for us, those client times are important. We trace it to see what parts of loading take a long time. We're in the middle of working on a definition of what is 'loaded.' Is it when you have it, or when it's rendered, or when you can interact with it? Those are things we're planning to use tracing for to keep an eye on and to better understand."

- -

That also requires adjusting for differences in external and internal clocks. "Before time correcting, it was horrible; our traces were more misleading than anything," says Broad. "So we decided that we would return a timestamp on the response headers, and then have the client reorient its time based on that—not change its internal clock but just calculate the offset on the response time to when the client got it. And if you end up in an impossible situation where a client RPC spans 210 milliseconds but the time on the response time is outside of that window, then we have to reorient that."

- -

Broad is excited about the impact OpenTracing has already had on the company, and is also looking ahead to what else the technology can enable. One possibility is using tracing to update documentation in real time. "Keeping documentation up to date with reality is a big challenge," he says. "Say, we just ran a trace simulation or we just ran a smoke test on this new deploy, and the architecture doesn't match the documentation. We can find whose responsibility it is and let them know and have them update it. That's one of the places I'd like to get in the future with tracing."

diff --git a/content/ko/case-studies/workiva/workiva_featured_logo.png b/content/ko/case-studies/workiva/workiva_featured_logo.png deleted file mode 100644 index 9998b471049e5e561af77feca573b2eb4c77e95d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5980 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 diff --git a/content/ko/case-studies/ygrene/index.html b/content/ko/case-studies/ygrene/index.html deleted file mode 100644 index 9afc1ec45b..0000000000 --- a/content/ko/case-studies/ygrene/index.html +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Ygrene Case Study -linkTitle: Ygrene -case_study_styles: true -cid: caseStudies -logo: ygrene_featured_logo.png -featured: true -weight: 48 -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. - -new_case_study_styles: true -heading_background: /images/case-studies/ygrene/banner1.jpg -heading_title_logo: /images/ygrene_logo.png -subheading: > - Ygrene: Using Cloud Native to Bring Security and Scalability to the Finance Industry -case_study_details: - - Company: Ygrene - - Location: Petaluma, Calif. - - Industry: Clean energy financing ---- - -

Challenge

- -

A PACE (Property Assessed Clean Energy) financing company, Ygrene has funded more than $1 billion in loans since 2010. In order to approve and process those loans, "We have lots of data sources that are being aggregated, and we also have lots of systems that need to churn on that data," says Ygrene Development Manager Austin Adams. The company was utilizing massive servers, and "we just reached the limit of being able to scale them vertically. We had a really unstable system that became overwhelmed with requests just for doing background data processing in real time. The performance the users saw was very poor. We needed a solution that wouldn't require us to make huge refactors to the code base." As a finance company, Ygrene also needed to ensure that they were shipping their applications securely.

- -

Solution

- -

Moving from an Engine Yard platform and Amazon Elastic Beanstalk, the Ygrene team embraced cloud native technologies and practices: Kubernetes to help scale out vertically and distribute workloads, Notary to put in build-time controls and get trust on the Docker images being used with third-party dependencies, and Fluentd for "observing every part of our stack," all running on Amazon EC2 Spot.

- -

Impact

- -

Before, deployments typically took three to four hours, and two or three months' worth of work would be deployed at low-traffic times every week or two weeks. Now, they take five minutes for Kubernetes, and an hour for the overall deploy with smoke testing. And "we're able to deploy three or four times a week, with just one week's or two days' worth of work," Adams says. "We're deploying during the work week, in the daytime and without any downtime. We had to ask for business approval to take the systems down, even in the middle of the night, because people could be doing loans. Now we can deploy, ship code, and migrate databases, all without taking the system down. The company gets new features without worrying that some business will be lost or delayed." Additionally, by using the kops project, Ygrene can now run its Kubernetes clusters with AWS EC2 Spot, at a tenth of the previous cost. These cloud native technologies have "changed the game for scalability, observability, and security—we're adding new data sources that are very secure," says Adams. "Without Kubernetes, Notary, and Fluentd, we couldn't tell our investors and team members that we knew what was going on."

- -{{< case-studies/quote author="Austin Adams, Development Manager, Ygrene Energy Fund" >}} -"CNCF projects are helping Ygrene determine the security and observability standards for the entire PACE industry. We're an emerging finance industry, and without these projects, especially Kubernetes, we couldn't be the industry leader that we are today." -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -In less than a decade, Ygrene has funded more than $1 billion in loans for renewable energy projects. -{{< /case-studies/lead >}} - -

A PACE (Property Assessed Clean Energy) financing company, "We take the equity in a home or a commercial building, and use it to finance property improvements for anything that saves electricity, produces electricity, saves water, or reduces carbon emissions," says Development Manager Austin Adams.

- -

In order to approve those loans, the company processes an enormous amount of underwriting data. "We have tons of different points that we have to validate about the property, about the company, or about the person," Adams says. "So we have lots of data sources that are being aggregated, and we also have lots of systems that need to churn on that data in real time."

- -

By 2017, deployments and scalability had become pain points. The company was utilizing massive servers, and "we just reached the limit of being able to scale them vertically," he says. Migrating to AWS Elastic Beanstalk didn't solve the problem: "The Scala services needed a lot of data from the main Ruby on Rails services and from different vendors, so they were asking for information from our Ruby services at a rate that those services couldn't handle. We had lots of configuration misses with Elastic Beanstalk as well. It just came to a head, and we realized we had a really unstable system."

- -{{< case-studies/quote - image="/images/case-studies/ygrene/banner3.jpg" - author="Austin Adams, Development Manager, Ygrene Energy Fund" ->}} -"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." -{{< /case-studies/quote >}} - -

Adams along with the rest of the team set out to find a solution that would be transformational, but "wouldn't require us to make huge refactors to the code base," he says. And as a finance company, Ygrene needed security as much as scalability. They found the answer by embracing cloud native technologies: Kubernetes to help scale out vertically and distribute workloads, Notary to achieve reliable security at every level, and Fluentd for observability. "Kubernetes was where the community was going, and we wanted to be future proof," says Adams.

- -

With Kubernetes, the team was able to quickly containerize the Ygrene application with Docker. "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."

- -

How? Cloud native has "changed the game for scalability, observability, and security—we're adding new data sources that are very secure," says Adams. "Without Kubernetes, Notary, and Fluentd, we couldn't tell our investors and team members that we knew what was going on."

- -

Notary, in particular, "has been a godsend," says Adams. "We need to know that our attack surface on third-party dependencies is low, or at least managed. We use it as a trust system and we also use it as a separation, so production images are signed by Notary, but some development images we don't sign. That is to ensure that they can't get into the production cluster. We've been using it in the test cluster to feel more secure about our builds."

- -{{< case-studies/quote image="/images/case-studies/ygrene/banner4.jpg">}} -"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." -{{< /case-studies/quote >}} - -

By using the kops project, Ygrene was able to move from Elastic Beanstalk to running its Kubernetes clusters on AWS EC2 Spot, at a tenth of the previous cost. "In order to scale before, we would need to up our instance sizes, incurring high cost for low value," says Adams. "Now with Kubernetes and kops, we are able to scale horizontally on Spot with multiple instance groups."

- -

That also helped them mitigate the risk that comes with running in the public cloud. "We figured out, essentially, that if we're able to select instance classes using EC2 Spot that had an extremely low likelihood of interruption and zero history of interruption, and we're willing to pay a price high enough, that we could virtually get the same guarantee using Kubernetes because we have enough nodes," says Software Engineer Zach Arnold, who led the migration to Kubernetes. "Now that we've re-architected these pieces of the application to not live on the same server, we can push out to many different servers and have a more stable deployment."

- -

As a result, the team can now ship code any time of day. "That was risky because it could bring down your whole loan management software with it," says Arnold. "But we now can deploy safely and securely during the day."

- -{{< case-studies/quote >}} -"In order to scale before, we would need to up our instance sizes, incurring high cost for low value," says Adams. "Now with Kubernetes and kops, we are able to scale horizontally on Spot with multiple instance groups." -{{< /case-studies/quote >}} - -

Before, deployments typically took three to four hours, and two or three months' worth of work would be deployed at low-traffic times every week or two weeks. Now, they take five minutes for Kubernetes, and an hour for an overall deploy with smoke testing. And "we're able to deploy three or four times a week, with just one week's or two days' worth of work," Adams says. "We're deploying during the work week, in the daytime and without any downtime. We had to ask for business approval to take the systems down for 30 minutes to an hour, even in the middle of the night, because people could be doing loans. Now we can deploy, ship code, and migrate databases, all without taking the system down. The company gets new features without worrying that some business will be lost or delayed."

- -

Cloud native also affected how Ygrene's 50+ developers and contractors work. Adams and Arnold spent considerable time "teaching people to think distributed out of the box," says Arnold. "We ended up picking what we call the Four S's of Shipping: safely, securely, stably, and speedily." (For more on the security piece of it, see their article on their "continuous hacking" strategy.) As for the engineers, says Adams, "they have been able to advance as their software has advanced. I think that at the end of the day, the developers feel better about what they're doing, and they also feel more connected to the modern software development community."

- -

Looking ahead, Adams is excited to explore more CNCF projects, including SPIFFE and SPIRE. "CNCF has been an amazing incubator for so many projects," he says. "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."

diff --git a/content/ko/case-studies/ygrene/ygrene_featured_logo.png b/content/ko/case-studies/ygrene/ygrene_featured_logo.png deleted file mode 100644 index d0d69114784c8d418e8c0958229d301b3fe00505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11569 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 diff --git a/content/ko/case-studies/zalando/index.html b/content/ko/case-studies/zalando/index.html deleted file mode 100644 index 23363da401..0000000000 --- a/content/ko/case-studies/zalando/index.html +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Zalando Case Study -case_study_styles: true -cid: caseStudies - -new_case_study_styles: true -heading_background: /images/case-studies/zalando/banner1.jpg -heading_title_logo: /images/zalando_logo.png -subheading: > - Europe's Leading Online Fashion Platform Gets Radical with Cloud Native -case_study_details: - - Company: Zalando - - Location: Berlin, Germany - - Industry: Online Fashion ---- - -

Challenge

- -

Zalando, Europe's leading online fashion platform, has experienced exponential growth since it was founded in 2008. In 2015, with plans to further expand its original e-commerce site to include new services and products, Zalando embarked on a radical transformation resulting in autonomous self-organizing teams. This change requires an infrastructure that could scale with the growth of the engineering organization. Zalando's technology department began rewriting its applications to be cloud-ready and started moving its infrastructure from on-premise data centers to the cloud. While orchestration wasn't immediately considered, as teams migrated to Amazon Web Services (AWS): "We saw the pain teams were having with infrastructure and Cloud Formation on AWS," says Henning Jacobs, Head of Developer Productivity. "There's still too much operational overhead for the teams and compliance. " To provide better support, cluster management was brought into play.

- -

Solution

- -

The company now runs its Docker containers on AWS using Kubernetes orchestration.

- -

Impact

- -

With the old infrastructure "it was difficult to properly embrace new technologies, and DevOps teams were considered to be a bottleneck," says Jacobs. "Now, with this cloud infrastructure, they have this packaging format, which can contain anything that runs on the Linux kernel. This makes a lot of people pretty happy. The engineers love autonomy."

- -{{< case-studies/quote author="Henning Jacobs, Head of Developer Productivity at Zalando" >}} -"We envision all Zalando delivery teams running their containerized applications on a state-of-the-art, reliable and scalable cluster infrastructure provided by Kubernetes." -{{< /case-studies/quote >}} - -{{< case-studies/lead >}} -When Henning Jacobs arrived at Zalando in 2010, the company was just two years old with 180 employees running an online store for European shoppers to buy fashion items. -{{< /case-studies/lead >}} - -

"It started as a PHP e-commerce site which was easy to get started with, but was not scaling with the business' needs" says Jacobs, Head of Developer Productivity at Zalando.

- -

At that time, the company began expanding beyond its German origins into other European markets. Fast-forward to today and Zalando now has more than 14,000 employees, 3.6 billion Euro in revenue for 2016 and operates across 15 countries. "With growth in all dimensions, and constant scaling, it has been a once-in-a-lifetime experience," he says.

- -

Not to mention a unique opportunity for an infrastructure specialist like Jacobs. Just after he joined, the company began rewriting all their applications in-house. "That was generally our strategy," he says. "For example, we started with our own logistics warehouses but at first you don't know how to do logistics software, so you have some vendor software. And then we replaced it with our own because with off-the-shelf software you're not competitive. You need to optimize these processes based on your specific business needs."

- -

In parallel to rewriting their applications, Zalando had set a goal of expanding beyond basic e-commerce to a platform offering multi-tenancy, a dramatic increase in assortments and styles, same-day delivery and even your own personal online stylist.

- -

The need to scale ultimately led the company on a cloud-native journey. As did its embrace of a microservices-based software architecture that gives engineering teams more autonomy and ownership of projects. "This move to the cloud was necessary because in the data center you couldn't have autonomous teams. You have the same infrastructure and it was very homogeneous, so you could only run your Java or Python app," Jacobs says.

- -{{< case-studies/quote image="/images/case-studies/zalando/banner3.jpg" >}} -"This move to the cloud was necessary because in the data center you couldn't have autonomous teams. You have the same infrastructure and it was very homogeneous, so you could only run your Java or Python app." -{{< /case-studies/quote >}} - -

Zalando began moving its infrastructure from two on-premise data centers to the cloud, requiring the migration of older applications for cloud-readiness. "We decided to have a clean break," says Jacobs. "Our Amazon Web Services infrastructure was set up like so: Every team has its own AWS account, which is completely isolated, meaning there's no 'lift and shift.' You basically have to rewrite your application to make it cloud-ready even down to the persistence layer. We bravely went back to the drawing board and redid everything, first choosing Docker as a common containerization, then building the infrastructure from there."

- -

The company decided to hold off on orchestration at the beginning, but as teams were migrated to AWS, "we saw the pain teams were having with infrastructure and cloud formation on AWS," says Jacobs.

- -

Zalandos 200+ autonomous engineering teams decide what technologies to use and could operate their own applications using their own AWS accounts. This setup proved to be a compliance challenge. Even with strict rules-of-play and automated compliance checks in place, engineering teams and IT-compliance were overburdened addressing compliance issues. "Violations appear for non-compliant behavior, which we detect when scanning the cloud infrastructure," says Jacobs. "Everything is possible and nothing enforced, so you have to live with violations (and resolve them) instead of preventing the error in the first place. This means overhead for teams—and overhead for compliance and operations. It also takes time to spin up new EC2 instances on AWS, which affects our deployment velocity."

- -

The team realized they needed to "leverage the value you get from cluster management," says Jacobs. When they first looked at Platform as a Service (PaaS) options in 2015, the market was fragmented; but "now there seems to be a clear winner. It seemed like a good bet to go with Kubernetes."

- -

The transition to Kubernetes started in 2016 during Zalando's Hack Week where participants deployed their projects to a Kubernetes cluster. From there 60 members of the tech infrastructure department were on-boarded - and then engineering teams were brought on one at a time. "We always start by talking with them and make sure everyone's expectations are clear," says Jacobs. "Then we conduct some Kubernetes training, which is mostly training for our CI/CD setup, because the user interface for our users is primarily through the CI/CD system. But they have to know fundamental Kubernetes concepts and the API. This is followed by a weekly sync with each team to check their progress. Once they have something in production, we want to see if everything is fine on top of what we can improve."

- -{{< case-studies/quote image="/images/case-studies/zalando/banner4.jpg" >}} -Once Zalando began migrating applications to Kubernetes, the results were immediate. "Kubernetes is a cornerstone for our seamless end-to-end developer experience. We are able to ship ideas to production using a single consistent and declarative API," says Jacobs. -{{< /case-studies/quote >}} - -

At the moment, Zalando is running an initial 40 Kubernetes clusters with plans to scale for the foreseeable future. Once Zalando began migrating applications to Kubernetes, the results were immediate. "Kubernetes is a cornerstone for our seamless end-to-end developer experience. We are able to ship ideas to production using a single consistent and declarative API," says Jacobs. "The self-healing infrastructure provides a frictionless experience with higher-level abstractions built upon low-level best practices. We envision all Zalando delivery teams will run their containerized applications on a state-of-the-art reliable and scalable cluster infrastructure provided by Kubernetes."

- -

With the old on-premise infrastructure "it was difficult to properly embrace new technologies, and DevOps teams were considered to be a bottleneck," says Jacobs. "Now, with this cloud infrastructure, they have this packaging format, which can contain anything that runs in the Linux kernel. This makes a lot of people pretty happy. The engineers love the autonomy."

- -

There were a few challenges in Zalando's Kubernetes implementation. "We are a team of seven people providing clusters to different engineering teams, and our goal is to provide a rock-solid experience for all of them," says Jacobs. "We don't want pet clusters. We don't want to have to understand what workload they have; it should just work out of the box. With that in mind, cluster autoscaling is important. There are many different ways of doing cluster management, and this is not part of the core. So we created two components to provision clusters, have a registry for clusters, and to manage the whole cluster life cycle."

- -

Jacobs's team also worked to improve the Kubernetes-AWS integration. "Thus you're very restricted. You need infrastructure to scale each autonomous team's idea." Plus, "there are still a lot of best practices missing," says Jacobs. The team, for example, recently solved a pod security policy issue. "There was already a concept in Kubernetes but it wasn't documented, so it was kind of tricky," he says. The large Kubernetes community was a big help to resolve the issue. To help other companies start down the same path, Jacobs compiled his team's learnings in a document called Running Kubernetes in Production.

- -{{< case-studies/quote >}} -"The Kubernetes API allows us to run applications in a cloud provider-agnostic way, which gives us the freedom to revisit IaaS providers in the coming years... We expect the Kubernetes API to be the global standard for PaaS infrastructure and are excited about the continued journey." -{{< /case-studies/quote >}} - -

In the end, Kubernetes made it possible for Zalando to introduce and maintain the new products the company envisioned to grow its platform. "The fashion advice product used Scala, and there were struggles to make this possible with our former infrastructure," says Jacobs. "It was a workaround, and that team needed more and more support from the platform team, just because they used different technologies. Now with Kubernetes, it's autonomous. Whatever the workload is, that team can just go their way, and Kubernetes prevents other bottlenecks."

- -

Looking ahead, Jacobs sees Zalando's new infrastructure as a great enabler for other things the company has in the works, from its new logistics software, to a platform feature connecting brands, to products dreamed up by data scientists. "One vision is if you watch the next James Bond movie and see the suit he's wearing, you should be able to automatically order it, and have it delivered to you within an hour," says Jacobs. "It's about connecting the full fashion sphere. This is definitely not possible if you have a bottleneck with everyone running in the same data center and thus very restricted. You need infrastructure to scale each autonomous team's idea."

- -

For other companies considering this technology, Jacobs says he wouldn't necessarily advise doing it exactly the same way Zalando did. "It's okay to do so if you're ready to fail at some things," he says. "You need to set the right expectations. Not everything will work. Rewriting apps and this type of organizational change can be disruptive. The first product we moved was critical. There were a lot of dependencies, and it took longer than expected. Maybe we should have started with something less complicated, less business critical, just to get our toes wet."

- -

But once they got to the other side "it was clear for everyone that there's no big alternative," Jacobs adds. "The Kubernetes API allows us to run applications in a cloud provider-agnostic way, which gives us the freedom to revisit IaaS providers in the coming years. Zalando Technology benefits from migrating to Kubernetes as we are able to leverage our existing knowledge to create an engineering platform offering flexibility and speed to our engineers while significantly reducing the operational overhead. We expect the Kubernetes API to be the global standard for PaaS infrastructure and are excited about the continued journey."

diff --git a/content/ko/case-studies/zalando/zalando_feature_logo.png b/content/ko/case-studies/zalando/zalando_feature_logo.png deleted file mode 100644 index ba6251050d15abb523d009ad79df06cc1fa0779e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7643 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 R?Uet&{~zE#M<{wb`#*xsh{XT^ From c0d1bef1b1f2c0ca4b0c03d0b3d392705bacfc1e Mon Sep 17 00:00:00 2001 From: liuwei10 Date: Mon, 31 May 2021 17:39:31 +0800 Subject: [PATCH 202/221] modify error of zh docs --- content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md b/content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md index 6de803ec91..b4039ee281 100644 --- a/content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md +++ b/content/zh/docs/tasks/job/automated-tasks-with-cron-jobs.md @@ -227,7 +227,7 @@ It takes a [Cron](https://en.wikipedia.org/wiki/Cron) format string, such as `0 ### 时间安排 `.spec.schedule` 是 `.spec` 需要的域。它使用了 [Cron](https://en.wikipedia.org/wiki/Cron) -格式串,例如 `0 * * * *` or `@hourly` ,做为它的任务被创建和执行的调度时间。 +格式串,例如 `0 * * * *` or `@hourly` ,作为它的任务被创建和执行的调度时间。 +### 你的服务在正确的命名空间中吗? + +未指定命名空间的 DNS 查询仅作用于 pod 所在的命名空间。 + +如果 pod 和服务的命名空间不相同,则 DNS 查询必须指定服务所在的命名空间。 + +该查询仅限于 pod 所在的名称空间: +```shell +kubectl exec -i -t dnsutils -- nslookup +``` + + +指定命名空间的查询: +```shell +kubectl exec -i -t dnsutils -- nslookup . +``` + + +要进一步了解名字解析,请查看 +[服务和 Pod 的 DNS](/zh/docs/concepts/services-networking/dns-pod-service/#what-things-get-dns-names)。 + + +{{< feature-state for_k8s_version="v1.18" state="stable" >}} + +이 페이지에서는 윈도우 노드에서 실행될 파드 및 컨테이너에 `runAsUserName` 설정을 사용하는 방법을 소개한다. 이는 리눅스 관련 `runAsUser` 설정과 거의 동일하여, 컨테이너의 기본값과 다른 username으로 애플리케이션을 실행할 수 있다. + + + +## {{% heading "prerequisites" %}} + + +쿠버네티스 클러스터가 있어야 하며 클러스터와 통신하도록 kubectl 명령줄 도구를 구성해야 한다. 클러스터에는 윈도우 워커 노드가 있어야 하고, 해당 노드에서 윈도우 워크로드를 실행하는 컨테이너의 파드가 스케쥴 된다. + + + + + +## 파드의 username 설정 + +파드의 컨테이너 프로세스를 실행할 username을 지정하려면 파드 명세에 `securityContext` 필드 ([PodSecurityContext](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podsecuritycontext-v1-core)) 를 포함시키고, 그 안에 `runAsUserName` 필드를 포함하는 `windowsOptions` ([WindowsSecurityContextOptions](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#windowssecuritycontextoptions-v1-core)) 필드를 추가한다. + +파드에 지정하는 윈도우 보안 컨텍스트 옵션은 파드의 모든 컨테이너 및 초기화 컨테이너에 적용된다. + +다음은 `runAsUserName` 필드가 설정된 윈도우 파드의 구성 파일이다. + +{{< codenew file="windows/run-as-username-pod.yaml" >}} + +파드를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/windows/run-as-username-pod.yaml +``` + +파드의 컨테이너가 실행 중인지 확인한다. + +```shell +kubectl get pod run-as-username-pod-demo +``` + +실행 중인 컨테이너의 셸에 접근한다. + +```shell +kubectl exec -it run-as-username-pod-demo -- powershell +``` + +셸이 올바른 username인 사용자로 실행 중인지 확인한다. + +```powershell +echo $env:USERNAME +``` + +결과는 다음과 같다. + +```shell +ContainerUser +``` + +## 컨테이너의 username 설정 + +컨테이너의 프로세스를 실행할 username을 지정하려면, 컨테이너 매니페스트에 `securityContext` 필드 ([SecurityContext](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#securitycontext-v1-core)) 를 포함시키고 그 안에 `runAsUserName` 필드를 포함하는 `windowsOptions` ([WindowsSecurityContextOptions](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#windowssecuritycontextoptions-v1-core)) 필드를 추가한다. + +컨테이너에 지정하는 윈도우 보안 컨텍스트 옵션은 해당 개별 컨테이너에만 적용되며 파드 수준에서 지정한 설정을 재정의한다. + +다음은 한 개의 컨테이너에 `runAsUserName` 필드가 파드 수준 및 컨테이너 수준에서 설정되는 파드의 구성 파일이다. + +{{< codenew file="windows/run-as-username-container.yaml" >}} + +파드를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/windows/run-as-username-container.yaml +``` + +파드의 컨테이너가 실행 중인지 확인한다. + +```shell +kubectl get pod run-as-username-container-demo +``` + +실행 중인 컨테이너의 셸에 접근한다. + +```shell +kubectl exec -it run-as-username-container-demo -- powershell +``` + +셸이 사용자에게 올바른 username(컨테이너 수준에서 설정된 사용자)을 실행 중인지 확인한다. + +```powershell +echo $env:USERNAME +``` + +결과는 다음과 같다. + +```shell +ContainerAdministrator +``` + +## 윈도우 username 제약사항 + +이 기능을 사용하려면 `runAsUserName` 필드에 설정된 값이 유효한 username이어야 한다. 형식은 `DOMAIN\USER` 여야하고, 여기서 `DOMAIN\`은 선택 사항이다. 윈도우 username은 대소문자를 구분하지 않는다. 또한 `DOMAIN` 및 `USER` 와 관련된 몇 가지 제약사항이 있다. + +- `runAsUserName` 필드는 비워 둘 수 없으며 제어 문자를 포함할 수 없다. (ASCII 값: `0x00-0x1F`, `0x7F`) +- `DOMAIN`은 NetBios 이름 또는 DNS 이름이어야 하며 각각 고유한 제한이 있다. + - NetBios 이름: 최대 15 자, `.`(마침표)으로 시작할 수 없으며 다음 문자를 포함할 수 없다. `\ / : * ? " < > |` + - DNS 이름: 최대 255 자로 영숫자, 마침표(`.`), 대시(`-`)로만 구성되며, 마침표 또는 대시로 시작하거나 끝날 수 없다. +- `USER`는 최대 20자이며, *오직* 마침표나 공백들로는 구성할 수 없고, 다음 문자는 포함할 수 없다. `" / \ [ ] : ; | = , + * ? < > @`. + +`runAsUserName` 필드에 허용되는 값의 예 : `ContainerAdministrator`,`ContainerUser`, `NT AUTHORITY\NETWORK SERVICE`, `NT AUTHORITY\LOCAL SERVICE`. + +이러한 제약사항에 대한 자세한 내용은 [여기](https://support.microsoft.com/en-us/help/909264/naming-conventions-in-active-directory-for-computers-domains-sites-and) 와 [여기](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.localaccounts/new-localuser?view=powershell-5.1)를 확인한다. + + + +## {{% heading "whatsnext" %}} + + +* [쿠버네티스에서 윈도우 컨테이너 스케줄링을 위한 가이드](/ko/docs/setup/production-environment/windows/user-guide-windows-containers/) +* [그룹 매니지드 서비스 어카운트를 이용하여 워크로드 신원 관리하기](/ko/docs/setup/production-environment/windows/user-guide-windows-containers/#그룹-매니지드-서비스-어카운트를-이용하여-워크로드-신원-관리하기) +* [윈도우 파드와 컨테이너의 GMSA 구성](/docs/tasks/configure-pod-container/configure-gmsa/) + diff --git a/content/ko/examples/windows/configmap-pod.yaml b/content/ko/examples/windows/configmap-pod.yaml new file mode 100644 index 0000000000..661cb73dee --- /dev/null +++ b/content/ko/examples/windows/configmap-pod.yaml @@ -0,0 +1,31 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: example-config +data: + example.property.1: hello + example.property.2: world + +--- + +apiVersion: v1 +kind: Pod +metadata: + name: configmap-pod +spec: + containers: + - name: configmap-redis + image: redis:3.0-nanoserver + env: + - name: EXAMPLE_PROPERTY_1 + valueFrom: + configMapKeyRef: + name: example-config + key: example.property.1 + - name: EXAMPLE_PROPERTY_2 + valueFrom: + configMapKeyRef: + name: example-config + key: example.property.2 + nodeSelector: + kubernetes.io/os: windows \ No newline at end of file diff --git a/content/ko/examples/windows/daemonset.yaml b/content/ko/examples/windows/daemonset.yaml new file mode 100644 index 0000000000..7483708fc7 --- /dev/null +++ b/content/ko/examples/windows/daemonset.yaml @@ -0,0 +1,21 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: my-daemonset + labels: + app: foo +spec: + selector: + matchLabels: + app: foo + template: + metadata: + labels: + app: foo + spec: + containers: + - name: foo + image: microsoft/windowsservercore:1709 + nodeSelector: + kubernetes.io/os: windows + diff --git a/content/ko/examples/windows/deploy-hyperv.yaml b/content/ko/examples/windows/deploy-hyperv.yaml new file mode 100644 index 0000000000..c8b71ce8cb --- /dev/null +++ b/content/ko/examples/windows/deploy-hyperv.yaml @@ -0,0 +1,22 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: iis +spec: + selector: + matchLabels: + app: iis + replicas: 3 + template: + metadata: + labels: + app: iis + annotations: + experimental.windows.kubernetes.io/isolation-type: hyperv + spec: + containers: + - name: iis + image: microsoft/iis + ports: + - containerPort: 80 + diff --git a/content/ko/examples/windows/deploy-resource.yaml b/content/ko/examples/windows/deploy-resource.yaml new file mode 100644 index 0000000000..81207a3804 --- /dev/null +++ b/content/ko/examples/windows/deploy-resource.yaml @@ -0,0 +1,24 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: iis +spec: + replicas: 3 + selector: + matchLabels: + app: iis + template: + metadata: + labels: + app: iis + spec: + containers: + - name: iis + image: microsoft/iis + resources: + limits: + memory: "128Mi" + cpu: 2 + ports: + - containerPort: 80 + diff --git a/content/ko/examples/windows/emptydir-pod.yaml b/content/ko/examples/windows/emptydir-pod.yaml new file mode 100644 index 0000000000..08d8091391 --- /dev/null +++ b/content/ko/examples/windows/emptydir-pod.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Pod +metadata: + name: my-empty-dir-pod +spec: + containers: + - image: microsoft/windowsservercore:1709 + name: my-empty-dir-pod + volumeMounts: + - mountPath: /cache + name: cache-volume + - mountPath: C:/scratch + name: scratch-volume + volumes: + - name: cache-volume + emptyDir: {} + - name: scratch-volume + emptyDir: {} + nodeSelector: + kubernetes.io/os: windows diff --git a/content/ko/examples/windows/hostpath-volume-pod.yaml b/content/ko/examples/windows/hostpath-volume-pod.yaml new file mode 100644 index 0000000000..d95e345b6c --- /dev/null +++ b/content/ko/examples/windows/hostpath-volume-pod.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Pod +metadata: + name: hostpath-volume-pod +spec: + containers: + - name: my-hostpath-volume-pod + image: microsoft/windowsservercore:1709 + volumeMounts: + - name: foo + mountPath: "C:\\etc\\foo" + readOnly: true + nodeSelector: + kubernetes.io/os: windows + volumes: + - name: foo + hostPath: + path: "C:\\etc\\foo" diff --git a/content/ko/examples/windows/run-as-username-container.yaml b/content/ko/examples/windows/run-as-username-container.yaml new file mode 100644 index 0000000000..77b7b2d188 --- /dev/null +++ b/content/ko/examples/windows/run-as-username-container.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Pod +metadata: + name: run-as-username-container-demo +spec: + securityContext: + windowsOptions: + runAsUserName: "ContainerUser" + containers: + - name: run-as-username-demo + image: mcr.microsoft.com/windows/servercore:ltsc2019 + command: ["ping", "-t", "localhost"] + securityContext: + windowsOptions: + runAsUserName: "ContainerAdministrator" + nodeSelector: + kubernetes.io/os: windows diff --git a/content/ko/examples/windows/run-as-username-pod.yaml b/content/ko/examples/windows/run-as-username-pod.yaml new file mode 100644 index 0000000000..281bbda597 --- /dev/null +++ b/content/ko/examples/windows/run-as-username-pod.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Pod +metadata: + name: run-as-username-pod-demo +spec: + securityContext: + windowsOptions: + runAsUserName: "ContainerUser" + containers: + - name: run-as-username-demo + image: mcr.microsoft.com/windows/servercore:ltsc2019 + command: ["ping", "-t", "localhost"] + nodeSelector: + kubernetes.io/os: windows diff --git a/content/ko/examples/windows/secret-pod.yaml b/content/ko/examples/windows/secret-pod.yaml new file mode 100644 index 0000000000..69ee9b1f1e --- /dev/null +++ b/content/ko/examples/windows/secret-pod.yaml @@ -0,0 +1,32 @@ +apiVersion: v1 +kind: Secret +metadata: + name: mysecret +type: Opaque +data: + username: YWRtaW4= + password: MWYyZDFlMmU2N2Rm + +--- + +apiVersion: v1 +kind: Pod +metadata: + name: my-secret-pod +spec: + containers: + - name: my-secret-pod + image: microsoft/windowsservercore:1709 + env: + - name: USERNAME + valueFrom: + secretKeyRef: + name: mysecret + key: username + - name: PASSWORD + valueFrom: + secretKeyRef: + name: mysecret + key: password + nodeSelector: + kubernetes.io/os: windows diff --git a/content/ko/examples/windows/simple-pod.yaml b/content/ko/examples/windows/simple-pod.yaml new file mode 100644 index 0000000000..0b1f0ed5c5 --- /dev/null +++ b/content/ko/examples/windows/simple-pod.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Pod +metadata: + name: iis + labels: + name: iis +spec: + containers: + - name: iis + image: microsoft/iis:windowsservercore-1709 + ports: + - containerPort: 80 + nodeSelector: + "kubernetes.io/os": windows From 5e27d2ee604410b0a4bec5827acfbf80b537ded0 Mon Sep 17 00:00:00 2001 From: Arhell Date: Wed, 2 Jun 2021 00:12:56 +0300 Subject: [PATCH 208/221] [uk] Add configuration java microservice & translate --- content/uk/docs/tutorials/_index.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/content/uk/docs/tutorials/_index.md b/content/uk/docs/tutorials/_index.md index 09c8b1e7a8..c87a5155a0 100644 --- a/content/uk/docs/tutorials/_index.md +++ b/content/uk/docs/tutorials/_index.md @@ -29,9 +29,9 @@ Before walking through each tutorial, you may want to bookmark the --> * [Основи Kubernetes](/docs/tutorials/kubernetes-basics/) - детальний навчальний матеріал з інтерактивними уроками, що допоможе вам зрозуміти Kubernetes і спробувати його базову функціональність. -* [Scalable Microservices with Kubernetes (Udacity)](https://www.udacity.com/course/scalable-microservices-with-kubernetes--ud615) +* [Масштабовані мікросервіси з Kubernetes (Udacity)](https://www.udacity.com/course/scalable-microservices-with-kubernetes--ud615) -* [Introduction to Kubernetes (edX)](https://www.edx.org/course/introduction-kubernetes-linuxfoundationx-lfs158x#) +* [Вступ до Kubernetes (edX)](https://www.edx.org/course/introduction-kubernetes-linuxfoundationx-lfs158x#) * [Привіт Minikube](/docs/tutorials/hello-minikube/) @@ -39,23 +39,25 @@ Before walking through each tutorial, you may want to bookmark the --> ## Конфігурація -* [Configuring Redis Using a ConfigMap](/docs/tutorials/configuration/configure-redis-using-configmap/) +* [Приклад: Конфігурування Java мікросервісу](/docs/tutorials/configuration/configure-java-microservice/) + +* [Конфігурування Redis використовуючи ConfigMap](/docs/tutorials/configuration/configure-redis-using-configmap/) ## Застосунки без стану (Stateless Applications) {#застосунки-без-стану} -* [Exposing an External IP Address to Access an Application in a Cluster](/docs/tutorials/stateless-application/expose-external-ip-address/) +* [Відкриття зовнішньої IP-адреси для доступу до програми в кластері](/docs/tutorials/stateless-application/expose-external-ip-address/) -* [Example: Deploying PHP Guestbook application with Redis](/docs/tutorials/stateless-application/guestbook/) +* [Приклад: Розгортання застосунку PHP Guestbook з Redis](/docs/tutorials/stateless-application/guestbook/) ## Застосунки зі станом (Stateful Applications) {#застосунки-зі-станом} -* [StatefulSet Basics](/docs/tutorials/stateful-application/basic-stateful-set/) +* [Основи StatefulSet](/docs/tutorials/stateful-application/basic-stateful-set/) -* [Example: WordPress and MySQL with Persistent Volumes](/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/) +* [Приклад: WordPress та MySQL із постійними томами](/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/) -* [Example: Deploying Cassandra with Stateful Sets](/docs/tutorials/stateful-application/cassandra/) +* [Приклад: Розгортання Cassandra зі Stateful Sets](/docs/tutorials/stateful-application/cassandra/) -* [Running ZooKeeper, A CP Distributed System](/docs/tutorials/stateful-application/zookeeper/) +* [Запуск ZooKeeper, координатора розподіленої системи](/docs/tutorials/stateful-application/zookeeper/) ## Кластери @@ -63,7 +65,7 @@ Before walking through each tutorial, you may want to bookmark the ## Сервіси -* [Using Source IP](/docs/tutorials/services/source-ip/) +* [Використання Source IP](/docs/tutorials/services/source-ip/) From e10fada0073a6cb3ef8d94aadf5eeb85bcd3b1e0 Mon Sep 17 00:00:00 2001 From: Christoph Petrausch <263448+hikhvar@users.noreply.github.com> Date: Wed, 2 Jun 2021 03:42:33 +0200 Subject: [PATCH 209/221] [de] Add missing git submodules init to german README. (#24308) * Add missing git submodules init to german README. * Add links and comments to docsy theme installation * Adjust the JavaScript dependency managment from the english Readme --- README-de.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README-de.md b/README-de.md index b6f4491e70..c901fdde65 100644 --- a/README-de.md +++ b/README-de.md @@ -37,6 +37,13 @@ Um die Kubernetes-Website lokal laufen zu lassen, empfiehlt es sich, ein speziel > Wenn Sie die Website lieber lokal ohne Docker ausführen möchten, finden Sie weitere Informationen unter [Website lokal mit Hugo ausführen](#Die-Site-lokal-mit-Hugo-ausführen). +Das benötigte [Docsy Hugo theme](https://github.com/google/docsy#readme) muss als git submodule installiert werden: + +``` +#Füge das Docsy submodule hinzu +git submodule update --init --recursive --depth 1 +``` + Wenn Sie Docker [installiert](https://www.docker.com/get-started) haben, erstellen Sie das Docker-Image `kubernetes-hugo` lokal: ```bash @@ -55,9 +62,18 @@ make container-serve Hugo-Installationsanweisungen finden Sie in der [offiziellen Hugo-Dokumentation](https://gohugo.io/getting-started/installing/). Stellen Sie sicher, dass Sie die Hugo-Version installieren, die in der Umgebungsvariablen `HUGO_VERSION` in der Datei [`netlify.toml`](netlify.toml#L9) angegeben ist. +Das benötigte [Docsy Hugo theme](https://github.com/google/docsy#readme) muss als git submodule installiert werden: + +``` +#Füge das Docsy submodule hinzu +git submodule update --init --recursive --depth 1 +``` + So führen Sie die Site lokal aus, wenn Sie Hugo installiert haben: ```bash +# Installieren der JavaScript Abhängigkeiten +npm ci make serve ``` From 85965ec8d047dc849716b85caa7c88058f4ef2ee Mon Sep 17 00:00:00 2001 From: luzg Date: Mon, 31 May 2021 18:11:28 +0800 Subject: [PATCH 210/221] [zh] translate concepts/API-initiated Eviction --- .../scheduling-eviction/api-eviction.md | 38 +++++++++++++++ .../docs/reference/glossary/api-eviction.md | 47 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 content/zh/docs/concepts/scheduling-eviction/api-eviction.md create mode 100644 content/zh/docs/reference/glossary/api-eviction.md diff --git a/content/zh/docs/concepts/scheduling-eviction/api-eviction.md b/content/zh/docs/concepts/scheduling-eviction/api-eviction.md new file mode 100644 index 0000000000..ee90cf9dd6 --- /dev/null +++ b/content/zh/docs/concepts/scheduling-eviction/api-eviction.md @@ -0,0 +1,38 @@ +--- +title: API 发起的驱逐 +content_type: concept +weight: 70 +--- + +{{< glossary_definition term_id="api-eviction" length="short" >}}
+ + +你可以通过 kube-apiserver 的客户端,比如 `kubectl drain` 这样的命令,直接调用 Eviction API 发起驱逐。 +此操作创建一个 `Eviction` 对象,该对象再驱动 API 服务器终止选定的 Pod。 + +API 发起的驱逐将遵从你的 +[`PodDisruptionBudgets`](/zh/docs/tasks/run-application/configure-pdb/) +和 [`terminationGracePeriodSeconds`](/zh/docs/concepts/workloads/pods/pod-lifecycle#pod-termination) +配置。 + +## {{% heading "whatsnext" %}} + + +* 了解[节点压力引发的驱逐](/zh/docs/concepts/scheduling-eviction/node-pressure-eviction/) +* 了解 [Pod 优先级和抢占](/zh/docs/concepts/scheduling-eviction/pod-priority-preemption/) diff --git a/content/zh/docs/reference/glossary/api-eviction.md b/content/zh/docs/reference/glossary/api-eviction.md new file mode 100644 index 0000000000..9ce3069879 --- /dev/null +++ b/content/zh/docs/reference/glossary/api-eviction.md @@ -0,0 +1,47 @@ +--- +title: API 发起的驱逐 +id: api-eviction +date: 2021-04-27 +full_link: /zh/docs/concepts/scheduling-eviction/pod-eviction/#api-eviction +short_description: > + API 发起的驱逐是一个先调用 Eviction API 创建驱逐对象,再由该对象体面地中止 Pod 的过程。 +aka: +tags: +- operation +--- + + + +API 发起的驱逐是一个先调用 +[Eviction API](/docs/reference/generated/kubernetes-api/{{}}/create-eviction-pod-v1-core) +创建驱逐对象,再由该对象体面地中止 Pod 的过程。 + + + + +你可以通过 kube-apiserver 的客户端,比如 `kubectl drain` 这样的命令,直接调用 Eviction API 发起驱逐。 +当 `Eviction` 对象创建出来之后,该对象将驱动 API 服务器终止选定的Pod。 + +API 发起的驱逐不同于 +[节点压力引发的驱逐](/zh/docs/concepts/scheduling-eviction/eviction/#kubelet-eviction)。 From f0be2cf9a5a168ee2a7beb66d456d4c6585a0e92 Mon Sep 17 00:00:00 2001 From: Jihoon Seo Date: Mon, 31 May 2021 18:11:27 +0900 Subject: [PATCH 211/221] [ko] Update outdated files in dev-1.21-ko.3 (p6) --- .../setup/production-environment/_index.md | 291 +++++++++++++++++- .../tools/kubeadm/control-plane-flags.md | 10 +- 2 files changed, 297 insertions(+), 4 deletions(-) diff --git a/content/ko/docs/setup/production-environment/_index.md b/content/ko/docs/setup/production-environment/_index.md index 5296cfcaf2..3471214564 100644 --- a/content/ko/docs/setup/production-environment/_index.md +++ b/content/ko/docs/setup/production-environment/_index.md @@ -1,4 +1,293 @@ --- -title: 운영 환경 +title: "프로덕션 환경" +description: 프로덕션 수준의 쿠버네티스 클러스터 생성 weight: 30 +no_list: true --- + + +프로덕션 수준의 쿠버네티스 클러스터에는 계획과 준비가 필요하다. +쿠버네티스 클러스터에 중요한 워크로드를 실행하려면 클러스터를 탄력적이도록 구성해야 한다. +이 페이지에서는 프로덕션용 클러스터를 설정하거나 기존 클러스터를 프로덕션용으로 업그레이드하기 위해 +수행할 수 있는 단계를 설명한다. +이미 프로덕션 구성 내용에 익숙하여 단지 링크를 찾고 있다면, +[다음 내용](#다음-내용)을 참고한다. + + + +## 프로덕션 고려 사항 + +일반적으로 프로덕션 쿠버네티스 클러스터 환경에는 +개인 학습용, 개발용 또는 테스트 환경용 클러스터보다 더 많은 요구 사항이 있다. +프로덕션 환경에는 많은 사용자의 보안 액세스, 일관된 가용성 및 +변화하는 요구를 충족하기 위한 리소스가 필요할 수 있다. + +프로덕션 쿠버네티스 환경이 상주할 위치(온 프레미스 또는 클라우드)와 +직접 처리하거나 다른 사람에게 맡길 관리의 양을 결정할 때, +쿠버네티스 클러스터에 대한 요구 사항이 +다음 이슈에 의해 어떻게 영향을 받는지 고려해야 한다. + +- *가용성*: 단일 머신 쿠버네티스 [학습 환경](/ko/docs/setup/#학습-환경)은 SPOF(Single Point of Failure, 단일 장애 지점) 이슈를 갖고 있다. +고가용성 클러스터를 만드는 것에는 다음과 같은 고려 사항이 있다. + - 컨트롤 플레인과 워크 노드를 분리 + - 컨트롤 플레인 구성요소를 여러 노드에 복제 + - 클러스터의 {{< glossary_tooltip term_id="kube-apiserver" text="API 서버" >}}로 가는 트래픽을 로드밸런싱 + - 워커 노드를 충분히 운영하거나, 워크로드 변경에 따라 빠르게 제공할 수 있도록 보장 + +- *스케일링*: 프로덕션 쿠버네티스 환경에 들어오는 요청의 양의 +일정할 것으로 예상된다면, 필요한 만큼의 용량(capacity)을 증설하고 +마무리할 수도 있다. 하지만, 요청의 양이 시간에 따라 점점 증가하거나 +계절, 이벤트 등에 의해 극적으로 변동할 것으로 예상된다면, +컨트롤 플레인과 워커 노드로의 요청 증가로 인한 압박을 해소하기 위해 스케일 업 하거나 +잉여 자원을 줄이기 위해 스케일 다운 하는 것에 대해 고려해야 한다. + +- *보안 및 접근 관리*: 학습을 위한 쿠버네티스 클러스터에는 +완전한 관리 권한을 가질 수 있다. 하지만 중요한 워크로드를 실행하며 +두 명 이상의 사용자가 있는 공유 클러스터에는 누가, 그리고 무엇이 클러스터 자원에 +접근할 수 있는지에 대해서 보다 정교한 접근 방식이 필요하다. +역할 기반 접근 제어([RBAC](/docs/reference/access-authn-authz/rbac/)) 및 +기타 보안 메커니즘을 사용하여, 사용자와 워크로드가 필요한 자원에 +액세스할 수 있게 하면서도 워크로드와 클러스터를 안전하게 유지할 수 있다. +[정책](/ko/docs/concepts/policy/)과 +[컨테이너 리소스](/ko/docs/concepts/configuration/manage-resources-containers/)를 +관리하여, 사용자 및 워크로드가 접근할 수 있는 자원에 대한 제한을 설정할 수 있다. + +쿠버네티스 프로덕션 환경을 직접 구축하기 전에, 이 작업의 일부 또는 전체를 +[턴키 클라우드 솔루션](/docs/setup/production-environment/turnkey-solutions/) +제공 업체 또는 기타 [쿠버네티스 파트너](/ko/partners/)에게 +넘기는 것을 고려할 수 있다. +다음과 같은 옵션이 있다. + +- *서버리스*: 클러스터를 전혀 관리하지 않고 +타사 장비에서 워크로드를 실행하기만 하면 된다. +CPU 사용량, 메모리 및 디스크 요청과 같은 항목에 대한 요금이 부과된다. +- *관리형 컨트롤 플레인*: 쿠버네티스 서비스 공급자가 +클러스터 컨트롤 플레인의 확장 및 가용성을 관리하고 패치 및 업그레이드를 처리하도록 한다. +- *관리형 워커 노드*: 필요에 맞는 노드 풀을 정의하면, +쿠버네티스 서비스 공급자는 해당 노드의 가용성 및 +필요 시 업그레이드 제공을 보장한다. +- *통합*: 쿠버네티스를 스토리지, 컨테이너 레지스트리, +인증 방법 및 개발 도구와 같이 +사용자가 필요로 하는 여러 서비스를 통합 제공하는 업체도 있다. + +프로덕션 쿠버네티스 클러스터를 직접 구축하든 파트너와 협력하든, +요구 사항이 *컨트롤 플레인*, *워커 노드*, +*사용자 접근*, *워크로드 자원*과 관련되기 때문에, +다음 섹션들을 검토하는 것이 바람직하다. + +## 프로덕션 클러스터 구성 + +프로덕션 수준 쿠버네티스 클러스터에서, +컨트롤 플레인은 다양한 방식으로 여러 컴퓨터에 분산될 수 있는 서비스들을 통해 +클러스터를 관리한다. +반면, 각 워커 노드는 쿠버네티스 파드를 실행하도록 구성된 단일 엔티티를 나타낸다. + +### 프로덕션 컨트롤 플레인 + +가장 간단한 쿠버네티스 클러스터는 모든 컨트롤 플레인 및 워커 노드 서비스가 +하나의 머신에 실행되는 클러스터이다. +[쿠버네티스 컴포넌트](/ko/docs/concepts/overview/components/) +그림에 명시된 대로, 워커 노드를 추가하여 해당 환경을 확장할 수 있다. +클러스터를 단기간만 사용하거나, +심각한 문제가 발생한 경우 폐기하는 것이 가능하다면, 이 방식을 선택할 수 있다. + +그러나 더 영구적이고 가용성이 높은 클러스터가 필요한 경우 +컨트롤 플레인 확장을 고려해야 한다. +설계 상, 단일 시스템에서 실행되는 단일 시스템 컨트롤 플레인 서비스는 +가용성이 높지 않다. +클러스터를 계속 유지하면서 문제가 발생한 경우 복구할 수 있는지 여부가 중요한 경우, +다음 사항들을 고려한다. + +- *배포 도구 선택*: kubeadm, kops, kubespray와 같은 도구를 이용해 +컨트롤 플레인을 배포할 수 있다. +[배포 도구로 쿠버네티스 설치하기](/ko/docs/setup/production-environment/tools/)에서 +여러 배포 도구를 이용한 프로덕션 수준 배포에 대한 팁을 확인한다. +배포 시, 다양한 +[컨테이너 런타임](/ko/docs/setup/production-environment/container-runtimes/)을 사용할 수 있다. +- *인증서 관리*: 컨트롤 플레인 서비스 간의 보안 통신은 인증서를 사용하여 구현된다. +인증서는 배포 중에 자동으로 생성되거나, 또는 자체 인증 기관을 사용하여 생성할 수 있다. +[PKI 인증서 및 요구 조건](/ko/docs/setup/best-practices/certificates/)에서 +상세 사항을 확인한다. +- *apiserver를 위한 로드밸런서 구성*: 여러 노드에서 실행되는 apiserver 서비스 인스턴스에 +외부 API 호출을 분산할 수 있도록 로드밸런서를 구성한다. +[외부 로드밸런서 생성하기](/docs/tasks/access-application-cluster/create-external-load-balancer/)에서 +상세 사항을 확인한다. +- *etcd 서비스 분리 및 백업*: etcd 서비스는 +다른 컨트롤 플레인 서비스와 동일한 시스템에서 실행되거나, +또는 추가 보안 및 가용성을 위해 별도의 시스템에서 실행될 수 있다. +etcd는 클러스터 구성 데이터를 저장하므로 +필요한 경우 해당 데이터베이스를 복구할 수 있도록 etcd 데이터베이스를 정기적으로 백업해야 한다. +[etcd FAQ](https://etcd.io/docs/v3.4/faq/)에서 etcd 구성 및 사용 상세를 확인한다. +[쿠버네티스를 위한 etcd 클러스터 운영하기](/docs/tasks/administer-cluster/configure-upgrade-etcd/)와 +[kubeadm을 이용하여 고가용성 etcd 생성하기](/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/)에서 +상세 사항을 확인한다. +- *다중 컨트롤 플레인 시스템 구성*: 고가용성을 위해, +컨트롤 플레인은 단일 머신으로 제한되지 않아야 한다. +컨트롤 플레인 서비스가 init 서비스(예: systemd)에 의해 실행되는 경우, +각 서비스는 최소 3대의 머신에서 실행되어야 한다. +그러나, 컨트롤 플레인 서비스를 쿠버네티스 상의 파드 형태로 실행하면 +각 서비스 복제본 요청이 보장된다. +스케줄러는 내결함성이 있어야 하고, 고가용성은 필요하지 않다. +일부 배포 도구는 쿠버네티스 서비스의 리더 선출을 수행하기 위해 +[Raft](https://raft.github.io/) 합의 알고리즘을 설정한다. +리더를 맡은 서비스가 사라지면 다른 서비스가 스스로 리더가 되어 인계를 받는다. +- *다중 영역(zone)으로 확장*: 클러스터를 항상 사용 가능한 상태로 유지하는 것이 중요하다면 +여러 데이터 센터(클라우드 환경에서는 '영역'이라고 함)에서 실행되는 +클러스터를 만드는 것이 좋다. +영역의 그룹을 지역(region)이라고 한다. +동일한 지역의 여러 영역에 클러스터를 분산하면 +하나의 영역을 사용할 수 없게 된 경우에도 클러스터가 계속 작동할 가능성을 높일 수 있다. +[여러 영역에서 실행](/ko/docs/setup/best-practices/multiple-zones/)에서 상세 사항을 확인한다. +- *구동 중인 기능 관리*: 클러스터를 계속 유지하려면, +상태 및 보안을 유지하기 위해 수행해야 하는 작업이 있다. +예를 들어 kubeadm으로 클러스터를 생성한 경우, +[인증서 관리](/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/)와 +[kubeadm 클러스터 업그레이드하기](/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/)에 대해 도움이 되는 가이드가 있다. +[클러스터 운영하기](/ko/docs/tasks/administer-cluster/)에서 +더 많은 쿠버네티스 관리 작업을 볼 수 있다. + +컨트롤 플레인 서비스를 실행할 때 사용 가능한 옵션에 대해 보려면, +[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/)를 참조한다. +고가용성 컨트롤 플레인 예제는 +[고가용성 토폴로지를 위한 옵션](/docs/setup/production-environment/tools/kubeadm/ha-topology/), +[kubeadm을 이용하여 고가용성 클러스터 생성하기](/docs/setup/production-environment/tools/kubeadm/high-availability/), +[쿠버네티스를 위한 etcd 클러스터 운영하기](/docs/tasks/administer-cluster/configure-upgrade-etcd/)를 참조한다. +etcd 백업 계획을 세우려면 +[etcd 클러스터 백업하기](/docs/tasks/administer-cluster/configure-upgrade-etcd/#backing-up-an-etcd-cluster)를 참고한다. + +### 프로덕션 워커 노드 + +프로덕션 수준 워크로드는 복원력이 있어야 하고, +이들이 의존하는 모든 것들(예: CoreDNS)도 복원력이 있어야 한다. +컨트롤 플레인을 자체적으로 관리하든 +클라우드 공급자가 대신 수행하도록 하든 상관없이, +워커 노드(간단히 *노드*라고도 함)를 어떤 방법으로 관리할지 고려해야 한다. + +- *노드 구성하기*: 노드는 물리적 또는 가상 머신일 수 있다. +직접 노드를 만들고 관리하려면 지원되는 운영 체제를 설치한 다음 +적절한 [노드 서비스](/ko/docs/concepts/overview/components/#노드-컴포넌트)를 추가하고 실행한다. +다음을 고려해야 한다. + - 워크로드의 요구 사항 (노드가 적절한 메모리, CPU, 디스크 속도, 저장 용량을 갖도록 구성) + - 일반적인 컴퓨터 시스템이면 되는지, 아니면 GPU, 윈도우 노드, 또는 VM 격리를 필요로 하는 워크로드가 있는지 +- *노드 검증하기*: [노드 구성 검증하기](/ko/docs/setup/best-practices/node-conformance/)에서 +노드가 쿠버네티스 클러스터에 조인(join)에 필요한 요구 사항을 +만족하는지 확인하는 방법을 알아본다. +- *클러스터에 노드 추가하기*: 클러스터를 자체적으로 관리하는 경우, +머신을 준비하고, 클러스터의 apiserver에 이를 수동으로 추가하거나 +또는 머신이 스스로 등록하도록 하여 노드를 추가할 수 있다. +이러한 방식으로 노드를 추가하는 방법을 보려면 [노드](/ko/docs/concepts/architecture/nodes/) 섹션을 확인한다. +- *클러스터에 윈도우 노드 추가하기*: 윈도우 컨테이너로 구현된 워크로드를 +실행할 수 있도록, 쿠버네티스는 윈도우 워커 노드를 지원한다. +[쿠버네티스에서의 윈도우](/ko/docs/setup/production-environment/windows/)에서 상세 사항을 확인한다. +- *노드 스케일링*: 클러스터가 최종적으로 필요로 하게 될 용량만큼 +확장하는 것에 대한 계획이 있어야 한다. +실행해야 하는 파드 및 컨테이너 수에 따라 필요한 노드 수를 판별하려면 +[대형 클러스터에 대한 고려 사항](/ko/docs/setup/best-practices/cluster-large/)을 확인한다. +만약 노드를 직접 관리한다면, 직접 물리적 장비를 구입하고 설치해야 할 수도 있음을 의미한다. +- *노드 자동 스케일링*: 대부분의 클라우드 공급자는 +비정상 노드를 교체하거나 수요에 따라 노드 수를 늘리거나 줄일 수 있도록 +[클러스터 오토스케일러](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler#readme)를 지원한다. +[자주 묻는 질문](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md)에서 +오토스케일러가 어떻게 동작하는지, +[배치](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler#deployment) 섹션에서 +각 클라우드 공급자별로 어떻게 구현했는지를 확인한다. +온프레미스의 경우, 필요에 따라 새 노드를 가동하도록 +스크립트를 구성할 수 있는 가상화 플랫폼이 있다. +- *노드 헬스 체크 구성*: 중요한 워크로드의 경우, +해당 노드에서 실행 중인 노드와 파드의 상태가 정상인지 확인하고 싶을 것이다. +[Node Problem Detector](/docs/tasks/debug-application-cluster/monitor-node-health/) +데몬을 사용하면 노드가 정상인지 확인할 수 있다. + +## 프로덕션 사용자 관리 + +프로덕션에서는, 클러스터를 한 명 또는 여러 명이 사용하던 모델에서 +수십에서 수백 명이 사용하는 모델로 바꿔야 하는 경우가 발생할 수 있다. +학습 환경 또는 플랫폼 프로토타입에서는 모든 작업에 대한 단일 관리 계정으로도 +충분할 수 있다. 프로덕션에서는 여러 네임스페이스에 대한, 액세스 수준이 +각각 다른 더 많은 계정이 필요하다. + +프로덕션 수준의 클러스터를 사용한다는 것은 +다른 사용자의 액세스를 선택적으로 허용할 방법을 결정하는 것을 의미한다. +특히 클러스터에 액세스를 시도하는 사용자의 신원을 확인(인증, authentication)하고 +요청한 작업을 수행할 권한이 있는지 결정(인가, authorization)하기 위한 +다음과 같은 전략을 선택해야 한다. + +- *인증*: apiserver는 클라이언트 인증서, 전달자 토큰, 인증 프록시 또는 +HTTP 기본 인증을 사용하여 사용자를 인증할 수 있다. +사용자는 인증 방법을 선택하여 사용할 수 있다. +apiserver는 또한 플러그인을 사용하여 +LDAP 또는 Kerberos와 같은 조직의 기존 인증 방법을 활용할 수 있다. +쿠버네티스 사용자를 인증하는 다양한 방법에 대한 설명은 +[인증](/docs/reference/access-authn-authz/authentication/)을 참조한다. +- *인가*: 일반 사용자 인가를 위해, RBAC 와 ABAC 중 하나를 선택하여 사용할 수 있다. [인가 개요](/ko/docs/reference/access-authn-authz/authorization/)에서 사용자 계정과 서비스 어카운트 인가를 위한 여러 가지 모드를 확인할 수 있다. + - *역할 기반 접근 제어* ([RBAC](/docs/reference/access-authn-authz/rbac/)): 인증된 사용자에게 특정 권한 집합을 허용하여 클러스터에 대한 액세스를 할당할 수 있다. 특정 네임스페이스(Role) 또는 전체 클러스터(ClusterRole)에 권한을 할당할 수 있다. 그 뒤에 RoleBindings 및 ClusterRoleBindings를 사용하여 해당 권한을 특정 사용자에게 연결할 수 있다. + - *속성 기반 접근 제어* ([ABAC](/docs/reference/access-authn-authz/abac/)): 클러스터의 리소스 속성을 기반으로 정책을 생성하고 이러한 속성을 기반으로 액세스를 허용하거나 거부할 수 있다. 정책 파일의 각 줄은 버전 관리 속성(apiVersion 및 종류), 그리고 '대상(사용자 또는 그룹)', '리소스 속성', '비 리소스 속성(`/version` 또는 `/apis`)' 및 '읽기 전용'과 일치하는 사양 속성 맵을 식별한다. 자세한 내용은 [예시](/docs/reference/access-authn-authz/abac/#examples)를 참조한다. + +프로덕션 쿠버네티스 클러스터에 인증과 인가를 설정할 때, 다음의 사항을 고려해야 한다. + +- *인가 모드 설정*: 쿠버네티스 API 서버([kube-apiserver](/docs/reference/command-line-tools-reference/kube-apiserver/))를 실행할 때, +*`--authorization-mode`* 플래그를 사용하여 인증 모드를 설정해야 한다. +예를 들어, (*`/etc/kubernetes/manifests`*에 있는) +*`kube-adminserver.yaml`* 파일 안의 플래그를 `Node,RBAC`으로 설정할 수 있다. +이렇게 하여 인증된 요청이 Node 인가와 RBAC 인가를 사용할 수 있게 된다. +- *사용자 인증서와 롤 바인딩 생성(RBAC을 사용하는 경우)*: RBAC 인증을 사용하는 경우, +사용자는 클러스터 CA가 서명한 CSR(CertificateSigningRequest)을 만들 수 있다. +그 뒤에 각 사용자에게 역할 및 ClusterRoles를 바인딩할 수 있다. +자세한 내용은 +[인증서 서명 요청](/docs/reference/access-authn-authz/certificate-signing-requests/)을 참조한다. +- *속성을 포함하는 정책 생성(ABAC을 사용하는 경우)*: ABAC 인증을 사용하는 경우, +속성의 집합으로 정책을 생성하여, 인증된 사용자 또는 그룹이 +특정 리소스(예: 파드), 네임스페이스, 또는 apiGroup에 접근할 수 있도록 한다. +[예시](/docs/reference/access-authn-authz/abac/#examples)에서 +더 많은 정보를 확인한다. +- *어드미션 컨트롤러 도입 고려*: +[웹훅 토큰 인증](/docs/reference/access-authn-authz/authentication/#webhook-token-authentication)은 +API 서버를 통해 들어오는 요청의 인가에 사용할 수 있는 추가적인 방법이다. +웹훅 및 다른 인가 형식을 사용하려면 API 서버에 +[어드미션 컨트롤러](/docs/reference/access-authn-authz/admission-controllers/)를 +추가해야 한다. + +## 워크로드에 자원 제한 걸기 + +프로덕션 워크로드의 요구 사항이 +쿠버네티스 컨트롤 플레인 안팎의 압박을 초래할 수 있다. +워크로드의 요구 사항을 충족하도록 클러스터를 구성할 때 다음 항목을 고려한다. + +- *네임스페이스 제한 설정*: 메모리, CPU와 같은 자원의 네임스페이스 별 쿼터를 설정한다. +[메모리, CPU 와 API 리소스 관리](/ko/docs/tasks/administer-cluster/manage-resources/)에서 +상세 사항을 확인한다. +[계층적 네임스페이스](/blog/2020/08/14/introducing-hierarchical-namespaces/)를 설정하여 +제한을 상속할 수도 있다. +- *DNS 요청에 대한 대비*: 워크로드가 대규모로 확장될 것으로 예상된다면, +DNS 서비스도 확장할 준비가 되어 있어야 한다. +[클러스터의 DNS 서비스 오토스케일링](/docs/tasks/administer-cluster/dns-horizontal-autoscaling/)을 확인한다. +- *추가적인 서비스 어카운트 생성*: 사용자 계정은 *클러스터*에서 사용자가 무엇을 할 수 있는지 결정하는 반면에, +서비스 어카운트는 특정 네임스페이스 내의 파드 접근 권한을 결정한다. +기본적으로, 파드는 자신의 네임스페이스의 기본 서비스 어카운트을 이용한다. +[서비스 어카운트 관리하기](/ko/docs/reference/access-authn-authz/service-accounts-admin/)에서 +새로운 서비스 어카운트을 생성하는 방법을 확인한다. 예를 들어, 다음의 작업을 할 수 있다. + - 파드가 특정 컨테이너 레지스트리에서 이미지를 가져 오는 데 사용할 수 있는 시크릿을 추가한다. [파드를 위한 서비스 어카운트 구성하기](/docs/tasks/configure-pod-container/configure-service-account/)에서 예시를 확인한다. + - 서비스 어카운트에 RBAC 권한을 할당한다. [서비스어카운트 권한](/docs/reference/access-authn-authz/rbac/#service-account-permissions)에서 상세 사항을 확인한다. + +## {{% heading "whatsnext" %}} + +- 프로덕션 쿠버네티스를 직접 구축할지, +아니면 [턴키 클라우드 솔루션](/docs/setup/production-environment/turnkey-solutions/) 또는 +[쿠버네티스 파트너](/partners/)가 제공하는 서비스를 이용할지 결정한다. +- 클러스터를 직접 구축한다면, +[인증서](/ko/docs/setup/best-practices/certificates/)를 어떻게 관리할지, +[etcd](/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/)와 +[API 서버](/ko/docs/setup/production-environment/tools/kubeadm/ha-topology/) +등의 기능에 대한 고가용성을 +어떻게 보장할지를 계획한다. +- 배포 도구로 [kubeadm](/ko/docs/setup/production-environment/tools/kubeadm/), [kops](/ko/docs/setup/production-environment/tools/kops/), [Kubespray](/ko/docs/setup/production-environment/tools/kubespray/) 중 +하나를 선택한다. +- [인증](/docs/reference/access-authn-authz/authentication/) 및 +[인가](/ko/docs/reference/access-authn-authz/authorization/) 방식을 선택하여 +사용자 관리 방법을 구성한다. +- [자원 제한](/ko/docs/tasks/administer-cluster/manage-resources/), +[DNS 오토스케일링](/docs/tasks/administer-cluster/dns-horizontal-autoscaling/), +[서비스 어카운트](/ko/docs/reference/access-authn-authz/service-accounts-admin/)를 설정하여 +애플리케이션 워크로드의 실행에 대비한다. diff --git a/content/ko/docs/setup/production-environment/tools/kubeadm/control-plane-flags.md b/content/ko/docs/setup/production-environment/tools/kubeadm/control-plane-flags.md index 358274d143..d978e7d59f 100644 --- a/content/ko/docs/setup/production-environment/tools/kubeadm/control-plane-flags.md +++ b/content/ko/docs/setup/production-environment/tools/kubeadm/control-plane-flags.md @@ -76,7 +76,11 @@ kind: ClusterConfiguration kubernetesVersion: v1.16.0 scheduler: extraArgs: - bind-address: 0.0.0.0 - config: /home/johndoe/schedconfig.yaml - kubeconfig: /home/johndoe/kubeconfig.yaml + config: /etc/kubernetes/scheduler-config.yaml + extraVolumes: + - name: schedulerconfig + hostPath: /home/johndoe/schedconfig.yaml + mountPath: /etc/kubernetes/scheduler-config.yaml + readOnly: true + pathType: "File" ``` From dfaefa54aab81cd868c38bcfdf5a3831319a6b39 Mon Sep 17 00:00:00 2001 From: Jihoon Seo Date: Thu, 3 Jun 2021 06:20:26 +0900 Subject: [PATCH 212/221] Nit: Fix hrefs of some links --- .../extend-kubernetes/compute-storage-net/device-plugins.md | 2 +- content/en/docs/concepts/workloads/pods/disruptions.md | 2 +- .../command-line-tools-reference/kube-scheduler.md | 2 +- content/en/docs/reference/scheduling/config.md | 2 +- .../kubeadm/generated/kubeadm_certs_generate-csr.md | 2 +- content/en/docs/reference/using-api/deprecation-guide.md | 2 +- content/en/docs/setup/best-practices/cluster-large.md | 4 ++-- content/en/docs/setup/production-environment/_index.md | 6 +++--- .../docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/content/en/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins.md b/content/en/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins.md index 8f39284a96..ae96bb7551 100644 --- a/content/en/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins.md +++ b/content/en/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins.md @@ -253,7 +253,7 @@ message AllocatableResourcesResponse { `ContainerDevices` do expose the topology information declaring to which NUMA cells the device is affine. The NUMA cells are identified using a opaque integer ID, which value is consistent to what device -plugins report [when they register themselves to the kubelet](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/#device-plugin-integration-with-the-topology-manager). +plugins report [when they register themselves to the kubelet](/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/#device-plugin-integration-with-the-topology-manager). The gRPC service is served over a unix socket at `/var/lib/kubelet/pod-resources/kubelet.sock`. diff --git a/content/en/docs/concepts/workloads/pods/disruptions.md b/content/en/docs/concepts/workloads/pods/disruptions.md index 288502e0d7..6d51edd803 100644 --- a/content/en/docs/concepts/workloads/pods/disruptions.md +++ b/content/en/docs/concepts/workloads/pods/disruptions.md @@ -86,7 +86,7 @@ rolling out node software updates can cause voluntary disruptions. Also, some im of cluster (node) autoscaling may cause voluntary disruptions to defragment and compact nodes. Your cluster administrator or hosting provider should have documented what level of voluntary disruptions, if any, to expect. Certain configuration options, such as -[using PriorityClasses](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/) +[using PriorityClasses](/docs/concepts/configuration/pod-priority-preemption/) in your pod spec can also cause voluntary (and involuntary) disruptions. diff --git a/content/en/docs/reference/command-line-tools-reference/kube-scheduler.md b/content/en/docs/reference/command-line-tools-reference/kube-scheduler.md index ce8b9b3b67..45d8cae73a 100644 --- a/content/en/docs/reference/command-line-tools-reference/kube-scheduler.md +++ b/content/en/docs/reference/command-line-tools-reference/kube-scheduler.md @@ -27,7 +27,7 @@ each Pod in the scheduling queue according to constraints and available resources. The scheduler then ranks each valid Node and binds the Pod to a suitable Node. Multiple different schedulers may be used within a cluster; kube-scheduler is the reference implementation. -See [scheduling](https://kubernetes.io/docs/concepts/scheduling-eviction/) +See [scheduling](/docs/concepts/scheduling-eviction/) for more information about scheduling and the kube-scheduler component. ``` diff --git a/content/en/docs/reference/scheduling/config.md b/content/en/docs/reference/scheduling/config.md index 02a6e8e505..1e140e6300 100644 --- a/content/en/docs/reference/scheduling/config.md +++ b/content/en/docs/reference/scheduling/config.md @@ -250,7 +250,7 @@ only has one pending pods queue. ## {{% heading "whatsnext" %}} -* Read the [kube-scheduler reference](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-scheduler/) +* Read the [kube-scheduler reference](/docs/reference/command-line-tools-reference/kube-scheduler/) * Learn about [scheduling](/docs/concepts/scheduling-eviction/kube-scheduler/) * Read the [kube-scheduler configuration (v1beta1)](/docs/reference/config-api/kube-scheduler-config.v1beta1/) reference diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_generate-csr.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_generate-csr.md index 52d21a2cff..2a41f2e58f 100644 --- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_generate-csr.md +++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_generate-csr.md @@ -17,7 +17,7 @@ Generate keys and certificate signing requests Generates keys and certificate signing requests (CSRs) for all the certificates required to run the control plane. This command also generates partial kubeconfig files with private key data in the "users > user > client-key-data" field, and for each kubeconfig file an accompanying ".csr" file is created. -This command is designed for use in [Kubeadm External CA Mode](https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/#external-ca-mode). It generates CSRs which you can then submit to your external certificate authority for signing. +This command is designed for use in [Kubeadm External CA Mode](/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/#external-ca-mode). It generates CSRs which you can then submit to your external certificate authority for signing. The PEM encoded signed certificates should then be saved alongside the key files, using ".crt" as the file extension, or in the case of kubeconfig files, the PEM encoded signed certificate should be base64 encoded and added to the kubeconfig file in the "users > user > client-certificate-data" field. diff --git a/content/en/docs/reference/using-api/deprecation-guide.md b/content/en/docs/reference/using-api/deprecation-guide.md index 9f518143b3..73a4ae2a18 100755 --- a/content/en/docs/reference/using-api/deprecation-guide.md +++ b/content/en/docs/reference/using-api/deprecation-guide.md @@ -74,7 +74,7 @@ The **policy/v1beta1** API version of PodDisruptionBudget will no longer be serv PodSecurityPolicy in the **policy/v1beta1** API version will no longer be served in v1.25, and the PodSecurityPolicy admission controller will be removed. PodSecurityPolicy replacements are still under discussion, but current use can be migrated to -[3rd-party admission webhooks](https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/) now. +[3rd-party admission webhooks](/docs/reference/access-authn-authz/extensible-admission-controllers/) now. #### RuntimeClass {#runtimeclass-v125} diff --git a/content/en/docs/setup/best-practices/cluster-large.md b/content/en/docs/setup/best-practices/cluster-large.md index 81b6404f37..30e8128a19 100644 --- a/content/en/docs/setup/best-practices/cluster-large.md +++ b/content/en/docs/setup/best-practices/cluster-large.md @@ -66,8 +66,8 @@ When creating a cluster, you can (using custom tooling): * start and configure additional etcd instance * configure the {{< glossary_tooltip term_id="kube-apiserver" text="API server" >}} to use it for storing events -See [Operating etcd clusters for Kubernetes](https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/) and -[Set up a High Availability etcd cluster with kubeadm](docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/) +See [Operating etcd clusters for Kubernetes](/docs/tasks/administer-cluster/configure-upgrade-etcd/) and +[Set up a High Availability etcd cluster with kubeadm](/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/) for details on configuring and managing etcd for a large cluster. ## Addon resources diff --git a/content/en/docs/setup/production-environment/_index.md b/content/en/docs/setup/production-environment/_index.md index 7b8eba7d6e..fc99c31a7d 100644 --- a/content/en/docs/setup/production-environment/_index.md +++ b/content/en/docs/setup/production-environment/_index.md @@ -49,7 +49,7 @@ access cluster resources. You can use role-based access control security mechanisms to make sure that users and workloads can get access to the resources they need, while keeping workloads, and the cluster itself, secure. You can set limits on the resources that users and workloads can access -by managing [policies](https://kubernetes.io/docs/concepts/policy/) and +by managing [policies](/docs/concepts/policy/) and [container resources](/docs/concepts/configuration/manage-resources-containers/). Before building a Kubernetes production environment on your own, consider @@ -286,8 +286,8 @@ and the deployment methods. - Configure user management by determining your [Authentication](/docs/reference/access-authn-authz/authentication/) and -[Authorization](docs/reference/access-authn-authz/authorization/) methods. +[Authorization](/docs/reference/access-authn-authz/authorization/) methods. - Prepare for application workloads by setting up -[resource limits](docs/tasks/administer-cluster/manage-resources/), +[resource limits](/docs/tasks/administer-cluster/manage-resources/), [DNS autoscaling](/docs/tasks/administer-cluster/dns-horizontal-autoscaling/) and [service accounts](/docs/reference/access-authn-authz/service-accounts-admin/). diff --git a/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md b/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md index 57aac35a7a..e706bf0267 100644 --- a/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md +++ b/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md @@ -239,7 +239,7 @@ The field `serverTLSBootstrap: true` will enable the bootstrap of kubelet servin certificates by requesting them from the `certificates.k8s.io` API. One known limitation is that the CSRs (Certificate Signing Requests) for these certificates cannot be automatically approved by the default signer in the kube-controller-manager - -[`kubernetes.io/kubelet-serving`](https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/#kubernetes-signers). +[`kubernetes.io/kubelet-serving`](/docs/reference/access-authn-authz/certificate-signing-requests/#kubernetes-signers). This will require action from the user or a third party controller. These CSRs can be viewed using: From edb849a7253aa5538b2a57fba883bcefe385f29d Mon Sep 17 00:00:00 2001 From: redcometlpb Date: Thu, 3 Jun 2021 10:52:10 +0900 Subject: [PATCH 213/221] Translate concepts/storage/volume-health-monitoring in Korean --- .../storage/volume-health-monitoring.md | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 content/ko/docs/concepts/storage/volume-health-monitoring.md diff --git a/content/ko/docs/concepts/storage/volume-health-monitoring.md b/content/ko/docs/concepts/storage/volume-health-monitoring.md new file mode 100644 index 0000000000..ce149165da --- /dev/null +++ b/content/ko/docs/concepts/storage/volume-health-monitoring.md @@ -0,0 +1,30 @@ +--- +title: 볼륨 헬스 모니터링 +content_type: concept +--- + + + +{{< feature-state for_k8s_version="v1.21" state="alpha" >}} + +{{< glossary_tooltip text="CSI" term_id="csi" >}} 볼륨 헬스 모니터링을 통해 CSI 드라이버는 기본 스토리지 시스템에서 비정상적인 볼륨 상태를 감지하고 이를 {{< glossary_tooltip text="PVC" term_id="persistent-volume-claim" >}} 또는 {{< glossary_tooltip text="파드" term_id="pod" >}}의 이벤트로 보고한다. + + + +## 볼륨 헬스 모니터링 + +쿠버네티스 _볼륨 헬스 모니터링_ 은 쿠버네티스가 CSI(Container Storage Interface)를 구현하는 방법의 일부다. 볼륨 헬스 모니터링 기능은 외부 헬스 모니터 컨트롤러와 {{< glossary_tooltip term_id="kubelet" text="kubelet" >}}, 2가지 컴포넌트로 구현된다. + +CSI 드라이버가 컨트롤러 측의 볼륨 헬스 모니터링 기능을 지원하는 경우, CSI 볼륨에서 비정상적인 볼륨 상태가 감지될 때 관련 {{< glossary_tooltip text="퍼시스턴트볼륨클레임" term_id="persistent-volume-claim" >}}(PersistentVolumeClaim, PVC) 이벤트가 보고된다. + +외부 헬스 모니터 {{< glossary_tooltip text="컨트롤러" term_id="controller" >}}는 노드 장애 이벤트도 감시한다. `enable-node-watcher` 플래그를 true로 설정하여 노드 장애 모니터링을 활성화할 수 있다. 외부 헬스 모니터가 노드 장애 이벤트를 감지하면, 컨트롤러는 이 PVC를 사용하는 파드가 장애 상태인 노드에 있음을 나타내는 이벤트가 PVC에 보고된다고 알린다. + +CSI 드라이버가 노드 측에서 볼륨 헬스 모니터링 기능을 지원하는 경우, CSI 볼륨에서 비정상적인 볼륨 상태가 감지되면 PVC를 사용하는 모든 파드에서 이벤트가 보고된다. + +{{< note >}} +노드 측에서 이 기능을 사용하려면 `CSIVolumeHealth` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 활성화해야 한다. +{{< /note >}} + +## {{% heading "whatsnext" %}} + +이 기능을 구현한 CSI 드라이버를 확인하려면 [CSI 드라이버 문서](https://kubernetes-csi.github.io/docs/drivers.html)를 참고한다. From 316667729c38d12b468ceff5df45ee49660dfec4 Mon Sep 17 00:00:00 2001 From: Bridget Kromhout Date: Wed, 2 Jun 2021 22:16:05 -0500 Subject: [PATCH 214/221] SCTP is stable as of 1.20 Signed-off-by: Bridget Kromhout --- .../en/docs/concepts/services-networking/network-policies.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/concepts/services-networking/network-policies.md b/content/en/docs/concepts/services-networking/network-policies.md index 764fedbcc7..2c9ed4a90e 100644 --- a/content/en/docs/concepts/services-networking/network-policies.md +++ b/content/en/docs/concepts/services-networking/network-policies.md @@ -212,9 +212,9 @@ This ensures that even pods that aren't selected by any other NetworkPolicy will ## SCTP support -{{< feature-state for_k8s_version="v1.19" state="beta" >}} +{{< feature-state for_k8s_version="v1.20" state="stable" >}} -As a beta feature, this is enabled by default. To disable SCTP at a cluster level, you (or your cluster administrator) will need to disable the `SCTPSupport` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) for the API server with `--feature-gates=SCTPSupport=false,…`. +As a stable feature, this is enabled by default. To disable SCTP at a cluster level, you (or your cluster administrator) will need to disable the `SCTPSupport` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) for the API server with `--feature-gates=SCTPSupport=false,…`. When the feature gate is enabled, you can set the `protocol` field of a NetworkPolicy to `SCTP`. {{< note >}} From 05c1eb0030968241425805bf1482ca90f9169fdc Mon Sep 17 00:00:00 2001 From: Albert Date: Thu, 3 Jun 2021 16:30:14 +0800 Subject: [PATCH 215/221] [zh]: fix names.md --- content/zh/docs/concepts/overview/working-with-objects/names.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5e0c59ae6d..09e767ea9c 100644 --- a/content/zh/docs/concepts/overview/working-with-objects/names.md +++ b/content/zh/docs/concepts/overview/working-with-objects/names.md @@ -41,7 +41,7 @@ For non-unique user-provided attributes, Kubernetes provides [labels](/docs/user In cases when objects represent a physical entity, like a Node representing a physical host, when the host is re-created under the same name without deleting and re-creating the Node, Kubernetes treats the new host as the old one, which may lead to inconsistencies. --> 当对象所代表的是一个物理实体(例如代表一台物理主机的 Node)时, -如果在 Node 对象未被删除并重建的条件下,创新创建了同名的物理主机, +如果在 Node 对象未被删除并重建的条件下,重新创建了同名的物理主机, 则 Kubernetes 会将新的主机看作是老的主机,这可能会带来某种不一致性。 {{< /note >}} From a64a4fd2f50b4acab7bac3b7eeab6e984a816d13 Mon Sep 17 00:00:00 2001 From: Albert Date: Thu, 3 Jun 2021 16:16:38 +0800 Subject: [PATCH 216/221] [zh]Update init-containers.md --- content/zh/docs/concepts/workloads/pods/init-containers.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/zh/docs/concepts/workloads/pods/init-containers.md b/content/zh/docs/concepts/workloads/pods/init-containers.md index bbfdebc581..d15fcfebce 100644 --- a/content/zh/docs/concepts/workloads/pods/init-containers.md +++ b/content/zh/docs/concepts/workloads/pods/init-containers.md @@ -58,7 +58,8 @@ If a Pod's init container fails, the kubelet repeatedly restarts that init conta However, if the Pod has a `restartPolicy` of Never, and an init container fails during startup of that Pod, Kubernetes treats the overall Pod as failed. --> 如果 Pod 的 Init 容器失败,kubelet 会不断地重启该 Init 容器直到该容器成功为止。 -然而,如果 Pod 对应的 `restartPolicy` 值为 "Never",Kubernetes 不会重新启动 Pod。 +然而,如果 Pod 对应的 `restartPolicy` 值为 "Never",并且 Pod 的 Init 容器失败, +则 Kubernetes 会将整个 Pod 状态设置为失败。 + +# Ценности сообщества Kubernetes + +Культура сообщества Kubernetes часто упоминается как существенный вклад в стремительный рост этого проекта с открытым исходным кодом. Ниже приведены дистиллированные ценности, которые развивались в течение последних многих лет в нашем сообществе, подталкивая наш проект и коллег к постоянному совершенствованию. + +## Распределение лучше, чем централизация + +Масштаб проекта Kubernetes жизнеспособен только благодаря высокому доверию и четкому распределению работ, которое включает делегирование полномочий, принятие решений, техническое проектирование, владение кодом и документацию. Распределенное асинхронное владение, сотрудничество, коммуникация и принятие решений являются краеугольным камнем нашего мирового сообщества. + +## Сообщество над товаром или компанией + +Мы здесь в первую очередь как сообщество, наша преданность заключается в преднамеренном управлении проектом Kubernetes на благо всех его членов и пользователей во всем мире. Мы поддерживаем совместную публичную работу для достижения общей цели создания динамичной взаимодействующей экосистемы, обеспечивающей отличный опыт для наших пользователей. Отдельные лица получают статус благодаря работе, компании получают статус благодаря своим обязательствам поддерживать это сообщество и финансировать ресурсы, необходимые для функционирования проекта. + +## Автоматизация процесса + +У крупных проектов есть много менее захватывающей, но все же тяжелой работы. Мы ценим время, потраченное на автоматизацию повторяющейся работы, больше, чем тяжелый труд. Там, где эта работа не может быть автоматизирована, наша культура заключается в признании и вознаграждении всех видов вклада. Однако героизм не является устойчивым. + +## Inclusive is better than exclusive + +В целом успешная и полезная технология требует различных перспектив и навыков, которые могут быть услышаны только в гостеприимной и уважительной обстановке. Членство в сообществе-это привилегия, а не право. Лидерство в сообществе достигается за счет усилий, объема, качества, количества и продолжительности взносов. Наше сообщество проявляет уважение к времени и усилиям, затраченным на обсуждение, независимо от того, где участник находится на пути своего роста. + +## Эволюция лучше, чем застой + +Открытость новым идеям и изученная технологическая эволюция делают Kubernetes более сильным проектом. Постоянное совершенствование, лидерство слуг, наставничество и уважение-вот основы культуры проекта Kubernetes. Лидеры сообщества Kubernetes обязаны находить, спонсировать и продвигать новых членов сообщества. Лидеры должны ожидать, что они отойдут в сторону. Члены сообщества должны ожидать, что они сделают шаг вперед. + +**"Culture eats strategy for breakfast." --Peter Drucker** diff --git a/content/ru/community/values.md b/content/ru/community/values.md new file mode 100644 index 0000000000..4ae1fe30b6 --- /dev/null +++ b/content/ru/community/values.md @@ -0,0 +1,13 @@ +--- +title: Community +layout: basic +cid: community +css: /css/community.css +--- + +
+ +
+{{< include "/static/community-values.md" >}} +
+
diff --git a/content/ru/docs/_index.md b/content/ru/docs/_index.md index 09f6d57a37..3ccdee88bb 100644 --- a/content/ru/docs/_index.md +++ b/content/ru/docs/_index.md @@ -1,3 +1,6 @@ --- +linktitle: Документация по Kubernetes title: Документация +sitemap: + priority: 1.0 --- diff --git a/content/ru/docs/concepts/architecture/_index.md b/content/ru/docs/concepts/architecture/_index.md index eb68a67e53..05b3535491 100755 --- a/content/ru/docs/concepts/architecture/_index.md +++ b/content/ru/docs/concepts/architecture/_index.md @@ -1,5 +1,7 @@ --- title: "Кластерная Архитектура" weight: 30 +description: > + The architectural concepts behind Kubernetes. --- diff --git a/content/ru/docs/concepts/architecture/cloud-controller.md b/content/ru/docs/concepts/architecture/cloud-controller.md new file mode 100644 index 0000000000..287afad287 --- /dev/null +++ b/content/ru/docs/concepts/architecture/cloud-controller.md @@ -0,0 +1,192 @@ +--- +title: Диспетчер облочных контроллеров +content_type: concept +weight: 40 +--- + + + +{{< feature-state state="beta" for_k8s_version="v1.11" >}} + +Технологии облочной инфраструктуры позволяет запускать Kubernetes в общедоступных, частных и гибритных облоках. Kubernetes верит в автоматизированную,управляемую API инфраструктуру без жесткой связи между компонентами. + +{{< glossary_definition term_id="cloud-controller-manager" length="all" prepend="Диспетчер облочных контроллеров">}} + +Диспетчер облочных контроллеров структурирован с использованием механизма плагинов, которые позволяют различным облочным провайдерам интегрировать свои платформы с Kubernetes. + + + + + +## Дизайн + +![Kubernetes components](/images/docs/components-of-kubernetes.svg) + +Диспетчер облочных контроллеров работает в панели управления как реплицированный набот процессов (обычно это контейнер в Pod-ах). Каждый диспетчер облочных контроллеров реализует многоразовые {{< glossary_tooltip text="контроллеры" term_id="controller" >}} в единственном процессе. + + +{{< note >}} +Вы так же можете запустить диспетчер облочных контроллеров как {{< glossary_tooltip text="дополнение" term_id="addons" >}} Kubernetes, а некак часть панели управления. +{{< /note >}} + +## Функции диспетчера облочных контроллеров {#functions-of-the-ccm} + +Контроллеры внутри диспетчера облочных контроллеров включают в себя: + +### Контролер узла + +Контроллер узла отвечает за создание объектов {{< glossary_tooltip text="узла" term_id="node" >}} при создании новых серверов в вашей облочной инфраструктуре. Контроллер узла получает информацию +о работающих хостах внутри вашего арендуемого облочного провайдера. +Контроллер узла выполняет следующие функции: + +1. Инициализация объектов узла для каждого сервера, контроллер которого через API облочного провайдера. +2. Аннотирование и маркировка объеко узла специфичной для облока информацией, такой как регион, в котором развернут узел и доступные ему ресурсы (процессор, память и т.д.). +3. Получение имени хоста и сетевых адресов. +4. Проверка работоспособности ущла. В случае, если узел перестает отвечать на запросы, этот контроллер проверяется с помощью API вашего облочного провайдера, был ли сервер деактевирован / удален / прекращен. + Если узел был удален из облока, контроллер удлаяет объект узла из вашего Kubernetes кластера.. + +Некоторые облочные провайдеры реализуют его разделение на контроллер узла и отдельный контроллер жизненного цикла узла. + +### Контролер маршрута + +Контролер маршрута отвечае за соответствующую настройку маршрутов облоке, чтобы контейнеры на разных узлах кластера Kubernetes могли взаимодействовать друг с другом. + +В зависимости от облочного провайдера, контроллер маршрута способен также выделять блоки IP адресов для сети Pod. + +### Сервисный контроллер + +{{< glossary_tooltip text="Службы" term_id="service" >}} интегрируются с компонентами облочной инфраструктуры, такими как управляемые балансировщики нагрузки, IP адреса, фильтрация сетевых пакетов и проверка работоспособности целевых объектов. Сервисный контроллер взаимодействует с API вашего облочного провайдера для настройки балансировщиков нагрузки и других компонентов инфраструктуры, когда вы объявляете ресурсные службы которые он требует. + +## Авторизация + +В этом разделе разбирается доступ, который нужен для управления облочным контроллером к различным объектам API для выполнения своих операций. + +### Контроллер узла {#authorization-node-controller} + +Контроллер узла работает только с объектом узла. Он требует полного доступа для и изменения объектов узла. + +`v1/Node`: + +- Get +- List +- Create +- Update +- Patch +- Watch +- Delete + +### Контролер маршрута {#authorization-route-controller} + +Контролер маршрута прослушивает создание объектов узла и соответствующим образом настраивает маршруты. Для этого требуется получить доступ к объектам узла. + +`v1/Node`: + +- Get + +### Сервисный контроллер {#authorization-service-controller} + +Сервисный контроллер прослушивает события Create, Update и Delete объектов службы, а затем соответствующим образом настраивает конечные точки для этих соответствующих сервисов. + +Для доступа к сервисам, требуется доступ к событиям List и Watch. Для обновления сервисов, требуется доступ к событиям Patch и Update. + +Чтобы настроить ресурсы конечных точек для сервисов, требуется доступ к событиям Create, List, Get, Watch, и Update. + +`v1/Service`: + +- List +- Get +- Watch +- Patch +- Update + +### Другие {#authorization-miscellaneous} + +Реализация ядра диспетчера облочных контроллеров требует доступ для создания создания объектов события, а для обеспечения безопасной работы требуется доступ для создания учетных записей сервисов (ServiceAccounts). + +`v1/Event`: + +- Create +- Patch +- Update + +`v1/ServiceAccount`: + +- Create + +The {{< glossary_tooltip term_id="rbac" text="RBAC" >}} ClusterRole для диспетчера облочных контроллеров выглядить так: + +```yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: cloud-controller-manager +rules: +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - update +- apiGroups: + - "" + resources: + - nodes + verbs: + - '*' +- apiGroups: + - "" + resources: + - nodes/status + verbs: + - patch +- apiGroups: + - "" + resources: + - services + verbs: + - list + - patch + - update + - watch +- apiGroups: + - "" + resources: + - serviceaccounts + verbs: + - create +- apiGroups: + - "" + resources: + - persistentvolumes + verbs: + - get + - list + - update + - watch +- apiGroups: + - "" + resources: + - endpoints + verbs: + - create + - get + - list + - watch + - update +``` + + +## {{% heading "whatsnext" %}} + +[Администрирование диспетчера облочных контроллеров](/docs/tasks/administer-cluster/running-cloud-controller/#cloud-controller-manager) +содержить инструкции по запуску и управлению диспетером облочных контроллеров. + +Хотите знать как реализовать свой собственный диспетчер облочных контроллеров или расширить проект? + +Диспетчер облочных контроллеров использует интерфейс Go, который позволяет реализовать подключение из любого облока. В частности, он использует `CloudProvider` интерфейс, который определен в [`cloud.go`](https://github.com/kubernetes/cloud-provider/blob/release-1.17/cloud.go#L42-L62) из [kubernetes/cloud-provider](https://github.com/kubernetes/cloud-provider). + +Реализация общих контроллеров выделенных в этом документе (Node, Route, и Service),а так же некоторые возведения вместе с общим облочным провайдерским интерфейсом являются частью ядра Kubernetes. особые реализации, для облочных провайдеров находятся вне ядра Kubernetes и реализуют интерфейс `CloudProvider`. + +Дополнительные сведения о разработке плагинов см. в разделе [Разработка диспетчера облочных контроллеров](/docs/tasks/administer-cluster/developing-cloud-controller-manager/). diff --git a/content/ru/docs/concepts/architecture/control-plane-node-communication.md b/content/ru/docs/concepts/architecture/control-plane-node-communication.md new file mode 100644 index 0000000000..ea5cc33921 --- /dev/null +++ b/content/ru/docs/concepts/architecture/control-plane-node-communication.md @@ -0,0 +1,70 @@ +--- +reviewers: +- dchen1107 +- liggitt +title: Связь между плоскостью управления и узлом +content_type: concept +weight: 20 +aliases: +- master-node-communication +--- + + + +Этот документ каталог связь между плоскостью управления (apiserver) и кластером Kubernetes. Цель состоит в том, чтобы позволить пользователям настраивать свою установку для усиления сетевой конфигурации, чтобы кластер мог работать в ненадежной сети (или на полностью общедоступных IP-адресах облачного провайдера). + + + + + +## Связь между плоскостью управления и узлом +В Kubernetes имеется API шаблон "hub-and-spoke". Все используемые API из узлов (или которые запускают pod-ы) завершает apiserver. Ни один из других компонентов плоскости управления не предназначен для предоставления удаленных сервисов. Apiserver настроен на прослушивание удаленных подключений через безопасный порт HTTPS. (обычно 443) с одной или несколькими включенными формами [идентификации](/docs/reference/access-authn-authz/authentication/) клиена. + +Должна быть включена одна или несколько форм [идентификации](/docs/reference/access-authn-authz/authorization/), особенно если разрешены [анонимные запросы](/docs/reference/access-authn-authz/authentication/#anonymous-requests) или [service account tokens](/docs/reference/access-authn-authz/authentication/#service-account-tokens). + +Узлы должны быть снабжены общедоступным корневым сертификатом для кластера, чтобы они могли безопасно подключаться к apiserver-у вместе с действительными учетными данными клиента. Хороший подход заключается в том, что учетные данные клиента, предоставляемые kubelet, имеют форму клиентского сертификата. См. Информацию о загрузке Kubelet TLS [kubelet TLS bootstrapping](/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/) для автоматической подготовки клиентских сертификатов kubelet. + +pod-ы, которые хотят подключиться к apiserver, могут сделать это безопасно, используя учетную запись службы, чтобы Kubernetes автоматически вводил общедоступный корневой сертификат и действительный токен-носитель в pod при его создании. +Служба `kubernetes` (в пространстве имен `default`) is настроен с виртуальным IP-адресом, который перенаправляет (через kube-proxy) к endpoint HTTPS apiserver-а. + +Компоненты уровня управления также взаимодействуют с кластером apiserver-а через защищенный порт. + +В результате режим работы по умолчанию для соединений от узлов и модулей, работающих на узлах, к плоскости управления по умолчанию защищен и может работать в ненадежных и/или общедоступных сетях. + +## Узел к плоскости управления + +Существуют две пути взаимодействия от плоскости управления (apiserver) к узлам. Первый - от apiserver-а до kubelet процесса, который выполняется на каждом узле кластера. Второй - от apiserver к любому узлу, pod-у или службе через промежуточную функциональность apiserver-а. + +### apiserver в kubelet + +Соединение из apiserver-а к kubelet используются для: + +* Извлечения логов с pod-ов. +* Прикрепление (через kubectl) к запущенным pod-ам. +* Обеспечение функциональности переадресации портов kubelet. + +Эти соединения заверщаются в kubelet в endpoint HTTPS. По умолчанию apiserver не проверяет сертификат обслуживания kubelet-ов, что делает соединение подверженным к атаке человек по середине (man-in-the-middle) и **unsafe** запущенных в ненадежных или общедоступных сетях. + +Для проверки этого соединения, используется флаг `--kubelet-certificate-authority` чтобы предоставить apiserver-у набор корневых (root) сертификатов для проверки сертификата обслуживания kubelet-ов. + +Если это не возможно, используйте [SSH-тунелирование](#ssh-tunnels) между apiserver-ом и kubelet, если это необходимо во избежании подключения по ненадежной или общедоступной сети. + +Наконец, Должны быть включены [пудентификация или авторизация Kubelet](/docs/reference/command-line-tools-reference/kubelet-authentication-authorization/) для защиты kubelet API. + +### apiserver для узлов, pod-ов, и служб + +Соединение с apiserver-ом к узлу, pod-у или службе по умолчанию осушествяляется по обычному HTTP-соединению и поэтому не проходят проверку подлиности и не шифрование. Они могут быть запущены по защищенному HTTPS-соединению, добавив префикс `https:` к имени узла, pod-а или службы в URL-адресе API, но они не будут проверять сертификат предоставленный HTTPS endpoint, также не будут предоставлять учетные данные клиента. Таким образом, хотя соединение будет зашифровано, оно не обеспечит никаких гарантий целостности. Эти соединения **are not currently safe** запущенных в ненадежных или общедоступных сетях. + +### SSH-тунели + +Kubernetes поддерживает SSH-туннели для защиты плоскости управления узлов от путей связи. В этой конфигурации apiserver инициирует SSH-туннель для каждого узла в кластере (подключается к ssh-серверу, прослушивая порт 22) и передает весь трафикпредназначенный для kubelet, узлу, pod-у или службе через тунель. Этот тунель гарантирует, что трафик не выводиться за пределы сети, в которой работает узел. + +SSH-туннели в настоящее время устарели, поэтому вы не должны использовать их, если не знаете, что делаете. Служба подключения является заменой этого канала связи. + +### Служба подключения + +{{< feature-state for_k8s_version="v1.18" state="beta" >}} + +В качестве замены SSH-туннелям, служба подключения обеспечивает уровень полномочие TCP для плоскости управления кластерной связи. Служба подключения состоит из двух частей: сервер подключения в сети плоскости управления и агентов подключения в сети узлов. Агенты службы подключения инициируют подключения к серверу подключения и поддерживают сетевое подключение. После включения службы подключения, весь трафик с плоскости управления на узлы проходит через эти соединения. + +Следуйте инструкциям [Задача службы подключения](/docs/tasks/extend-kubernetes/setup-konnectivity/) чтобы настроить службу подключения в кластере. diff --git a/content/ru/docs/concepts/architecture/controller.md b/content/ru/docs/concepts/architecture/controller.md new file mode 100644 index 0000000000..c47fcaed95 --- /dev/null +++ b/content/ru/docs/concepts/architecture/controller.md @@ -0,0 +1,116 @@ +--- +title: Контроллеры +content_type: concept +weight: 30 +--- + + + +В робототехнике и автоматизации, _цикл управления_ - это непрерывный цикл, который регулирует состояние системы. + +Вот один из примеров контура управления: термостат в помещении. + +Когда вы устанавливаете температуру, это говорит термостату о вашем *желаемом состоянии*. Фактическая температура в помещении - это +*текущее состояние*. Термостат действует так, чтобы приблизить текущее состояние к елаемому состоянию, путем включения или выключения оборудования. + +{{< glossary_definition term_id="controller" length="short">}} + + + + + + +## Шаблон контроллера + +Контроллер отслеживает по крайней мере один тип ресурса Kubernetes. +Эти [объекты](/docs/concepts/overview/working-with-objects/kubernetes-objects/#kubernetes-objects) +имеют поле спецификации, которое представляет желаемое состояние. Контроллер (ы) для этого ресурса несут ответственность за приближение текущего состояния к желаемому состоянию + +Контроллер может выполнить это действие сам; чаще всего в Kubernetes, +контроллер будет отправляет сообщения на +{{< glossary_tooltip text="сервер API" term_id="kube-apiserver" >}} которые имеют +полезные побочные эффекты. Пример этого вы можете увидеть ниже. + +{{< comment >}} +Некоторые встроенные контроллеры, такие как контроллер пространства имен, действуют на объекты, не имеющие спецификации. Для простоты эта страница опускает объяснение этих деталей. +{{< /comment >}} + +### Управление с помощью сервера API + +Контроллер {{< glossary_tooltip term_id="job" >}} является примером встроенного контроллера Kubernetes. Встроенные контроллеры управляют состоянием, взаимодействуя с кластером сервера API. + +Задание - это ресурс Kubernetes, который запускает +{{< glossary_tooltip term_id="pod" >}}, или возможно несколько Pod-ов, которые выполняют задание и затем останавливаются. + +(После [планирования](/docs/concepts/scheduling-eviction/), Pod объекты становятся частью желаемого состояния для kubelet). + +Когда контроллер задания видить новую задачу, он убеждается что где-то в вашем кластере kubelet-ы на множестве узлов запускают нужное количество Pod-ов для выполнения работы. +Контроллер задания сам по себе не запускает никакие Pod-ы или контейнеры. Вместо этого контроллер задания Iсообщает серверу API о создании или удалении Pod-ов. +Другие компоненты в +{{< glossary_tooltip text="плоскости управления" term_id="control-plane" >}} +действуют на основе информации (имеются ли новые заплонированные Pod-ы для запуска), и в итоге работка заверщается. + +После того, как вы создадите новое задание, желаемое состояние для этого задания будет завершено. Контроллер задания приближает текущее состояние этого задания к желаемому состоянию: создает Pod-ы, которые выполняют работу, которую вы хотели для этого задания, чтобы задание было ближе к завершению. + +Контроллеры также обровляют объекты которые их настраивают. +Например: как только работа выполнена для задания, контроллер задания обновляет этот объект задание, чтобы пометить его как `Завершенный`. + +(Это немного похоже на то, как некоторые термостаты выключают свет, чтобы указать, что теперь ваша комната имеет установленную вами температуру). + +### Прямое управление + +В отличие от Задания, некоторым контроллерам нужно вносить изменения в вещи за пределами вашего кластера. + +Например, если вы используете контур управления, чтобы убедиться, что в вашем кластере достаточно {{< glossary_tooltip text="Узлов" term_id="node" >}}, +тогда этому контроллеру нужно что-то вне текущего кластера, чтобы при необъодимости установить новые узлы. + +Контроллеры, которые взаимодействуют с внешним состоянием, находят свое желаемое состояние с сервера API, а затем напрямую взаимодействуют с внешней системой, чтобы приблизить текущее состояние. + +(На самом деле существует [контроллер](https://github.com/kubernetes/autoscaler/) +, который горизонтально маштабирует узла в вашем кластере.) + +Важным моментом здесь является то, что контроллер вносит некоторые изменения, чтобы вызвать желаемое состояние, а затем сообщает текущее состояние обратно на сервер API вашего кластера. Другие контуры управления могут наблюдать за этими отчетными данными и предпринимать собственные действия. + +В примере с термостатом, если в помещении очень холодно, тогда другой контроллер может также включить обогреватель для защиты от замерзания. В кластерах Kubernetes, плоскость управления косвенно работает с инструментами управления IP-адресами,службами хранения данных, API облочных провайдеров и другими службами для релизации +[расширения Kubernetes](/docs/concepts/extend-kubernetes/). + +## Желаемое против текущего состояния {#desired-vs-current} + +Kubernetes использует систему вида cloud-native и способен справлятся с постоянными изменениями. + +Ваш кластер может изменяться в любой по мере выполнения работы и контуры управления автоматически устранают сбой. Это означает, что потенциально Ваш кластер никогда не достигнет стабильного состояния. + +Пока контроллеры вашего кластера работают и могут вносить полезные изменения, не имеет значения, является ли общее состояние стабильным или нет. + +## Дизайн + +В качестве принципа своей конструкции Kubernetes использует множество контроллеров, каждый из которых управляет определенным аспектом состояния кластера. Чаще всего конкретный контур управления (контроллер) использует один вид ресурса в качестве своего желаемого состояния и имеет другой вид ресурса, которым он управляет, чтобы это случилось. Например, контроллер для заданий отслеживает объекты заданий (для обнаружения новой работы) и объекты модулей (для выполнения заданий, а затем для того, чтобы видеть, когда работа завершена). В этом случае что-то еще создает задания, тогда как контроллер заданий создает Pod-ы. + +Полезно иметь простые контроллеры, а не один монолитный набор взаимосвязанных контуров управления. Контроллеры могут выйти из строя, поэтому Kubernetes предназначен для этого. + +{{< note >}} +Существует несколько контроллеров, которые создают или обновляют один и тот же тип объекта. За кулисами контроллеры Kubernetes следят за тем, чтобы обращать внимание только на ресурсы, связанные с их контролирующим ресурсом. + +Например, у вас могут быть развертывания и задания; они оба создают Pod-ы. Контроллер заданий не удаляет Pod-ы созданные вашим развертиыванием, потому что имеется информационные ({{< glossary_tooltip term_id="label" text="метки" >}}) +которые могут быть использованы контроллерами тем самым показывая отличие Pod-ов. +{{< /note >}} + +## Способы запуска контроллеров {#running-controllers} + +Kubernetes поставляется с набором встроенных контроллеров, которые работают внутри {{< glossary_tooltip term_id="kube-controller-manager" >}}. Эти встроенные контроллеры обеспечивают важные основные функции. + +Контроллер развертывания и контроллер заданий - это примеры контроллеров, которые входят в состав самого Kubernetes («встроенные» контроллеры). +Kubernetes позволяет вам запускать устойчивую плоскость управления, так что в случае отказа одного из встроенных контроллеров работу берет на себя другая часть плоскости управления. + +Вы можете найти контроллеры, которые работают вне плоскости управления, чтобы расширить Kubernetes. +Или, если вы хотите, можете написать новый контроллер самостоятельно. Вы можете запустить свой собственный контроллер виде наборов Pod-ов, +или внешнее в Kubernetes. Что подойдет лучше всего, будет зависеть от того, что делает этот конкретный контроллер. + + + +## {{% heading "whatsnext" %}} + +* Прочтите о [плоскости управления Kubernetes ](/docs/concepts/overview/components/#control-plane-components) +* Откройте для себя некоторые из основных [объектов Kubernetes ](/docs/concepts/overview/working-with-objects/kubernetes-objects/) +* Узнайте больше о [Kubernetes API](/docs/concepts/overview/kubernetes-api/) +* Если вы хотите написать собственный контроллер, см [Шаблоны расширения](/docs/concepts/extend-kubernetes/extend-cluster/#extension-patterns) в расширении Kubernetes. diff --git a/content/ru/docs/reference/glossary/cloud-controller-manager.md b/content/ru/docs/reference/glossary/cloud-controller-manager.md new file mode 100644 index 0000000000..d8f0615778 --- /dev/null +++ b/content/ru/docs/reference/glossary/cloud-controller-manager.md @@ -0,0 +1,19 @@ +--- +title: Диспетчер облачных контроллеров +id: cloud-controller-manager +date: 2018-04-12 +full_link: /docs/concepts/architecture/cloud-controller/ +short_description: > + Компонент плоскости управления, который интегрирует Kubernetes со сторонними облачными провайдерами. +aka: +tags: +- core-object +- architecture +- operation +--- +Компонент {{< glossary_tooltip text="панель управления" term_id="control-plane" >}} Kubernetes - это встраиваемый в логику управления облочная спецификация. Диспетчер облачных контроллеров позволяет связать кластер с API поставщика облачных услуг и отделить компоненты, взаимодействующие с этой облачной платформой, от компонентов, взаимодействующих только с вашим кластером. + + + +Отделяя логику взаимодействия между Kubernetes и базовой облачной инфраструктурой, компонент cloud-controller-manager позволяет поставщикам облачных услуг выпускать функции в другом темпе по сравнению с основным проектом Kubernetes. + From 612ebcc5594ec4043f65f2a1f7a5bd15075a19c5 Mon Sep 17 00:00:00 2001 From: himanshu007-creator Date: Thu, 3 Jun 2021 17:29:05 +0530 Subject: [PATCH 218/221] links corrected --- content/en/releases/patch-releases.md | 110 +++++++++++++------------- content/en/releases/release.md | 25 +++--- 2 files changed, 68 insertions(+), 67 deletions(-) diff --git a/content/en/releases/patch-releases.md b/content/en/releases/patch-releases.md index 85951742ab..adc51c5ac2 100644 --- a/content/en/releases/patch-releases.md +++ b/content/en/releases/patch-releases.md @@ -10,10 +10,10 @@ For general information about Kubernetes release cycle, see the ## Cadence -Our typical patch release cadence is monthly. It is +Our typical patch release cadence is monthly. It is commonly a bit faster (1 to 2 weeks) for the earliest patch releases -after a 1.X minor release. Critical bug fixes may cause a more -immediate release outside of the normal cadence. We also aim to not make +after a 1.X minor release. Critical bug fixes may cause a more +immediate release outside of the normal cadence. We also aim to not make releases during major holiday periods. ## Contact @@ -23,7 +23,7 @@ See the [Release Managers page][release-managers] for full contact details on th Please give us a business day to respond - we may be in a different timezone! In between releases the team is looking at incoming cherry pick -requests on a weekly basis. The team will get in touch with +requests on a weekly basis. The team will get in touch with submitters via GitHub PR, SIG channels in Slack, and direct messages in Slack and [email](mailto:release-managers-private@kubernetes.io) if there are questions on the PR. @@ -34,8 +34,8 @@ Please follow the [cherry pick process][cherry-picks]. Cherry picks must be merge-ready in GitHub with proper labels (e.g., `approved`, `lgtm`, `release-note`) and passing CI tests ahead of the -cherry pick deadline. This is typically two days before the target -release, but may be more. Earlier PR readiness is better, as we +cherry pick deadline. This is typically two days before the target +release, but may be more. Earlier PR readiness is better, as we need time to get CI signal after merging your cherry picks ahead of the actual release. @@ -73,15 +73,15 @@ dates for simplicity (every month has it). ## Upcoming Monthly Releases Timelines may vary with the severity of bug fixes, but for easier planning we -will target the following monthly release points. Unplanned, critical +will target the following monthly release points. Unplanned, critical releases may also occur in between these. | Monthly Patch Release | Target date | -| --- | --- | -| June 2021 | 2021-06-16 | -| July 2021 | 2021-07-14 | -| August 2021 | 2021-08-11 | -| September 2021 | 2021-09-15 | +| --------------------- | ----------- | +| June 2021 | 2021-06-16 | +| July 2021 | 2021-07-14 | +| August 2021 | 2021-08-11 | +| September 2021 | 2021-09-15 | ## Detailed Release History for Active Branches @@ -92,7 +92,7 @@ releases may also occur in between these. End of Life for **1.21** is **2022-06-28** | PATCH RELEASE | CHERRY PICK DEADLINE | TARGET DATE | -|--- |--- |--- | +| ------------- | -------------------- | ----------- | | 1.21.2 | 2021-06-12 | 2021-06-16 | | 1.21.1 | 2021-05-07 | 2021-05-12 | @@ -102,16 +102,16 @@ End of Life for **1.21** is **2022-06-28** End of Life for **1.20** is **2022-02-28** -| PATCH RELEASE | CHERRY PICK DEADLINE | TARGET DATE | -|--- |--- |--- | -| 1.20.8 | 2021-06-12 | 2021-06-16 | -| 1.20.7 | 2021-05-07 | 2021-05-12 | -| 1.20.6 | 2021-04-09 | 2021-04-14 | -| 1.20.5 | 2021-03-12 | 2021-03-17 | -| 1.20.4 | 2021-02-12 | 2021-02-18 | +| PATCH RELEASE | CHERRY PICK DEADLINE | TARGET DATE | +| ------------- | ----------------------------------------------------------------------------------- | ----------- | +| 1.20.8 | 2021-06-12 | 2021-06-16 | +| 1.20.7 | 2021-05-07 | 2021-05-12 | +| 1.20.6 | 2021-04-09 | 2021-04-14 | +| 1.20.5 | 2021-03-12 | 2021-03-17 | +| 1.20.4 | 2021-02-12 | 2021-02-18 | | 1.20.3 | [Conformance Tests Issue](https://groups.google.com/g/kubernetes-dev/c/oUpY9vWgzJo) | 2021-02-17 | -| 1.20.2 | 2021-01-08 | 2021-01-13 | -| 1.20.1 | [Tagging Issue](https://groups.google.com/g/kubernetes-dev/c/dNH2yknlCBA) | 2020-12-18 | +| 1.20.2 | 2021-01-08 | 2021-01-13 | +| 1.20.1 | [Tagging Issue](https://groups.google.com/g/kubernetes-dev/c/dNH2yknlCBA) | 2020-12-18 | ### 1.19 @@ -119,46 +119,46 @@ End of Life for **1.20** is **2022-02-28** End of Life for **1.19** is **2021-10-28** -| PATCH RELEASE | CHERRY PICK DEADLINE | TARGET DATE | -|--- |--- |--- | -| 1.19.12 | 2021-06-12 | 2021-06-16 | -| 1.19.11 | 2021-05-07 | 2021-05-12 | -| 1.19.10 | 2021-04-09 | 2021-04-14 | -| 1.19.9 | 2021-03-12 | 2021-03-17 | -| 1.19.8 | 2021-02-12 | 2021-02-17 | -| 1.19.7 | 2021-01-08 | 2021-01-13 | +| PATCH RELEASE | CHERRY PICK DEADLINE | TARGET DATE | +| ------------- | ------------------------------------------------------------------------- | ----------- | +| 1.19.12 | 2021-06-12 | 2021-06-16 | +| 1.19.11 | 2021-05-07 | 2021-05-12 | +| 1.19.10 | 2021-04-09 | 2021-04-14 | +| 1.19.9 | 2021-03-12 | 2021-03-17 | +| 1.19.8 | 2021-02-12 | 2021-02-17 | +| 1.19.7 | 2021-01-08 | 2021-01-13 | | 1.19.6 | [Tagging Issue](https://groups.google.com/g/kubernetes-dev/c/dNH2yknlCBA) | 2020-12-18 | -| 1.19.5 | 2020-12-04 | 2020-12-09 | -| 1.19.4 | 2020-11-06 | 2020-11-11 | -| 1.19.3 | 2020-10-09 | 2020-10-14 | -| 1.19.2 | 2020-09-11 | 2020-09-16 | -| 1.19.1 | 2020-09-04 | 2020-09-09 | +| 1.19.5 | 2020-12-04 | 2020-12-09 | +| 1.19.4 | 2020-11-06 | 2020-11-11 | +| 1.19.3 | 2020-10-09 | 2020-10-14 | +| 1.19.2 | 2020-09-11 | 2020-09-16 | +| 1.19.1 | 2020-09-04 | 2020-09-09 | ## Non-Active Branch History These releases are no longer supported. -| Minor Version | Final Patch Release | EOL date | -| --- | --- | --- | -| 1.18 | 1.18.19 | 2021-05-12 | -| 1.17 | 1.17.17 | 2021-01-13 | -| 1.16 | 1.16.15 | 2020-09-02 | -| 1.15 | 1.15.12 | 2020-05-06 | -| 1.14 | 1.14.10 | 2019-12-11 | -| 1.13 | 1.13.12 | 2019-10-15 | -| 1.12 | 1.12.10 | 2019-07-08 | -| 1.11 | 1.11.10 | 2019-05-01 | -| 1.10 | 1.10.13 | 2019-02-13 | -| 1.9 | 1.9.11 | 2018-09-29 | -| 1.8 | 1.8.15 | 2018-07-12 | -| 1.7 | 1.7.16 | 2018-04-04 | -| 1.6 | 1.6.13 | 2017-11-23 | -| 1.5 | 1.5.8 | 2017-10-01 | -| 1.4 | 1.4.12 | 2017-04-21 | -| 1.3 | 1.3.10 | 2016-11-01 | -| 1.2 | 1.2.7 | 2016-10-23 | +| Minor Version | Final Patch Release | EOL date | +| ------------- | ------------------- | ---------- | +| 1.18 | 1.18.19 | 2021-05-12 | +| 1.17 | 1.17.17 | 2021-01-13 | +| 1.16 | 1.16.15 | 2020-09-02 | +| 1.15 | 1.15.12 | 2020-05-06 | +| 1.14 | 1.14.10 | 2019-12-11 | +| 1.13 | 1.13.12 | 2019-10-15 | +| 1.12 | 1.12.10 | 2019-07-08 | +| 1.11 | 1.11.10 | 2019-05-01 | +| 1.10 | 1.10.13 | 2019-02-13 | +| 1.9 | 1.9.11 | 2018-09-29 | +| 1.8 | 1.8.15 | 2018-07-12 | +| 1.7 | 1.7.16 | 2018-04-04 | +| 1.6 | 1.6.13 | 2017-11-23 | +| 1.5 | 1.5.8 | 2017-10-01 | +| 1.4 | 1.4.12 | 2017-04-21 | +| 1.3 | 1.3.10 | 2016-11-01 | +| 1.2 | 1.2.7 | 2016-10-23 | -[cherry-picks]: https://git.k8s.io/community/contributors/devel/sig-release/cherry-picks.md +[cherry-picks]: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-release/cherry-picks.md [release-managers]: /release-managers.md [release process description]: /release.md [yearly-support]: https://git.k8s.io/enhancements/keps/sig-release/1498-kubernetes-yearly-support-period/README.md diff --git a/content/en/releases/release.md b/content/en/releases/release.md index fa0f5e0b21..5542b41202 100644 --- a/content/en/releases/release.md +++ b/content/en/releases/release.md @@ -3,6 +3,7 @@ title: Kubernetes Release Cycle type: docs auto_generated: true --- + {{< warning >}} @@ -89,43 +90,43 @@ The general labeling process should be consistent across artifact types. ## Definitions -- *issue owners*: Creator, assignees, and user who moved the issue into a +- _issue owners_: Creator, assignees, and user who moved the issue into a release milestone -- *Release Team*: Each Kubernetes release has a team doing project management +- _Release Team_: Each Kubernetes release has a team doing project management tasks described [here][release-team]. The contact info for the team associated with any given release can be found [here](https://git.k8s.io/sig-release/releases/). -- *Y days*: Refers to business days +- _Y days_: Refers to business days -- *enhancement*: see "[Is My Thing an Enhancement?](https://git.k8s.io/enhancements/README.md#is-my-thing-an-enhancement)" +- _enhancement_: see "[Is My Thing an Enhancement?](https://git.k8s.io/enhancements/README.md#is-my-thing-an-enhancement)" -- *[Enhancements Freeze][enhancements-freeze]*: +- _[Enhancements Freeze][enhancements-freeze]_: the deadline by which [KEPs][keps] have to be completed in order for enhancements to be part of the current release -- *[Exception Request][exceptions]*: +- _[Exception Request][exceptions]_: The process of requesting an extension on the deadline for a particular Enhancement -- *[Code Freeze][code-freeze]*: +- _[Code Freeze][code-freeze]_: The period of ~4 weeks before the final release date, during which only critical bug fixes are merged into the release. -- *[Pruning](https://git.k8s.io/sig-release/releases/release_phases.md#pruning)*: +- _[Pruning](https://git.k8s.io/sig-release/releases/release_phases.md#pruning)_: The process of removing an Enhancement from a release milestone if it is not fully implemented or is otherwise considered not stable. -- *release milestone*: semantic version string or +- _release milestone_: semantic version string or [GitHub milestone](https://help.github.com/en/github/managing-your-work-on-github/associating-milestones-with-issues-and-pull-requests) referring to a release MAJOR.MINOR `vX.Y` version. See also [release versioning](/contributors/design-proposals/release/versioning.md). -- *release branch*: Git branch `release-X.Y` created for the `vX.Y` milestone. +- _release branch_: Git branch `release-X.Y` created for the `vX.Y` milestone. Created at the time of the `vX.Y-rc.0` release and maintained after the release for approximately 12 months with `vX.Y.Z` patch releases. @@ -160,7 +161,7 @@ conjunction with the Release Team's [Enhancements Lead](https://git.k8s.io/sig-r After Enhancements Freeze, tracking milestones on PRs and issues is important. Items within the milestone are used as a punchdown list to complete the -release. *On issues*, milestones must be applied correctly, via triage by the +release. _On issues_, milestones must be applied correctly, via triage by the SIG, so that [Release Team][release-team] can track bugs and enhancements (any enhancement-related issue needs a milestone). @@ -354,7 +355,7 @@ issue kind labels must be set: - `kind/feature`: New functionality. - `kind/flake`: CI test case is showing intermittent failures. -[cherry-picks]: /contributors/devel/sig-release/cherry-picks.md +[cherry-picks]: /community/blob/master/contributors/devel/sig-release/cherry-picks.md [code-freeze]: https://git.k8s.io/sig-release/releases/release_phases.md#code-freeze [enhancements-freeze]: https://git.k8s.io/sig-release/releases/release_phases.md#enhancements-freeze [exceptions]: https://git.k8s.io/sig-release/releases/release_phases.md#exceptions From 104ec652828bedc29097f18774f454ca559f965e Mon Sep 17 00:00:00 2001 From: jmkim Date: Wed, 26 May 2021 14:04:35 +0900 Subject: [PATCH 219/221] Translate /concepts/cluster-administration/system-logs.md into Korean --- .../cluster-administration/system-logs.md | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 content/ko/docs/concepts/cluster-administration/system-logs.md diff --git a/content/ko/docs/concepts/cluster-administration/system-logs.md b/content/ko/docs/concepts/cluster-administration/system-logs.md new file mode 100644 index 0000000000..13008ebbd8 --- /dev/null +++ b/content/ko/docs/concepts/cluster-administration/system-logs.md @@ -0,0 +1,148 @@ +--- + + + +title: 시스템 로그 +content_type: concept +weight: 60 +--- + + + +시스템 컴포넌트 로그는 클러스터에서 발생하는 이벤트를 기록하며, 이는 디버깅에 아주 유용하다. +더 많거나 적은 세부 정보를 표시하도록 다양하게 로그를 설정할 수 있다. +로그는 컴포넌트 내에서 오류를 표시하는 것 처럼 간단하거나, 이벤트의 단계적 추적(예: HTTP 엑세스 로그, 파드의 상태 변경, 컨트롤러 작업 또는 스케줄러의 결정)을 표시하는 것처럼 세밀할 수 있다. + + + +## Klog + +klog는 쿠버네티스의 로깅 라이브러리다. [klog](https://github.com/kubernetes/klog) +는 쿠버네티스 시스템 컴포넌트의 로그 메시지를 생성한다. + +klog 설정에 대한 더 많은 정보는, [커맨드라인 툴](/docs/reference/command-line-tools-reference/)을 참고한다. + +klog 네이티브 형식 예 : +``` +I1025 00:15:15.525108 1 httplog.go:79] GET /api/v1/namespaces/kube-system/pods/metrics-server-v0.3.1-57c75779f-9p8wg: (1.512ms) 200 [pod_nanny/v0.0.0 (linux/amd64) kubernetes/$Format 10.56.1.19:51756] +``` + +### 구조화된 로깅 + +{{< feature-state for_k8s_version="v1.19" state="alpha" >}} + +{{}} +구조화된 로그메시지로 마이그레이션은 진행중인 작업이다. 이 버전에서는 모든 로그 메시지가 구조화되지 않는다. 로그 파일을 +파싱할 때, 구조화되지 않은 로그 메시지도 처리해야 한다. + +로그 형식 및 값 직렬화는 변경될 수 있다. +{{< /warning>}} + +구조화된 로깅은 로그 메시지에 통일된 구조를 적용하여 정보를 쉽게 추출하고, +로그를 보다 쉽고 저렴하게 저장하고 처리하는 작업이다. +새로운 메시지 형식은 이전 버전과 호환되며 기본적으로 활성화 된다. + +구조화된 로그 형식: + +```ini + "" ="" ="" ... +``` + +예시: + +```ini +I1025 00:15:15.525108 1 controller_utils.go:116] "Pod status updated" pod="kube-system/kubedns" status="ready" +``` + + +### JSON 로그 형식 + +{{< feature-state for_k8s_version="v1.19" state="alpha" >}} + +{{}} + +JSON 출력은 많은 표준 klog 플래그를 지원하지 않는다. 지원하지 않는 klog 플래그 목록은, [커맨드라인 툴](/docs/reference/command-line-tools-reference/)을 참고한다. + +모든 로그가 JSON 형식으로 작성되는 것은 아니다(예: 프로세스 시작 중). 로그를 파싱하려는 경우 +JSON 형식이 아닌 로그 행을 처리할 수 있는지 확인해야 한다. + +필드 이름과 JSON 직렬화는 변경될 수 있다. +{{< /warning >}} + +`--logging-format=json` 플래그는 로그 형식을 klog 기본 형식에서 JSON 형식으로 변경한다. +JSON 로그 형식 예시(보기좋게 출력된 형태): + +```json +{ + "ts": 1580306777.04728, + "v": 4, + "msg": "Pod status updated", + "pod":{ + "name": "nginx-1", + "namespace": "default" + }, + "status": "ready" +} +``` + +특별한 의미가 있는 키: +* `ts` - Unix 시간의 타임스탬프 (필수, 부동 소수점) +* `v` - 자세한 정도 (필수, 정수, 기본 값 0) +* `err` - 오류 문자열 (선택 사항, 문자열) +* `msg` - 메시지 (필수, 문자열) + + +현재 JSON 형식을 지원하는 컴포넌트 목록: +* {{< glossary_tooltip term_id="kube-controller-manager" text="kube-controller-manager" >}} +* {{< 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" >}} + +### 로그 정리(sanitization) + +{{< feature-state for_k8s_version="v1.20" state="alpha" >}} + +{{}} +로그 정리(sanitization)는 상당한 오버 헤드를 발생시킬 수 있으므로 프로덕션 환경에서는 사용하지 않아야한다. +{{< /warning >}} + + `--experimental-logging-sanitization` 플래그는 klog 정리(sanitization) 필터를 활성화 한다. +활성화된 경우 모든 로그 인자에서 민감한 데이터(예: 비밀번호, 키, 토큰)가 표시된 필드를 검사하고 +이러한 필드의 로깅이 방지된다. + +현재 로그 정리(sanitization)를 지원하는 컴포넌트 목록: +* kube-controller-manager +* kube-apiserver +* kube-scheduler +* kubelet + +{{< note >}} +로그 정리(sanitization) 필터는 사용자 작업 로그로부터 민감한 데이터가 유출되는 것을 방지할 수 없다. +{{< /note >}} + +### 로그 상세 레벨(verbosity) + +`-v` 플래그로 로그 상세 레벨(verbosity)을 제어한다. 값을 늘리면 기록된 이벤트 수가 증가한다. 값을 줄이면 +기록된 이벤트 수가 줄어든다. +로그 상세 레벨(verbosity)를 높이면 점점 덜 심각한 이벤트가 기록된다. 로그 상세 레벨(verbosity)을 0으로 설정하면 중요한 이벤트만 기록된다. + +### 로그 위치 + +시스템 컴포넌트에는 컨테이너에서 실행되는 것과 컨테이너에서 실행되지 않는 두 가지 유형이 있다. 예를 들면 다음과 같다. + +* 쿠버네티스 스케줄러와 kube-proxy는 컨테이너에서 실행된다. +* kubelet과 컨테이너 런타임(예: 도커)은 컨테이너에서 실행되지 않는다. + +systemd를 사용하는 시스템에서는, kubelet과 컨테이너 런타임은 jounald에 기록한다. +그 외 시스템에서는, `/var/log` 디렉터리의 `.log` 파일에 기록한다. +컨테이너 내부의 시스템 컴포넌트들은 기본 로깅 메커니즘을 무시하고, +항상 `/var/log` 디렉터리의 `.log` 파일에 기록한다. +컨테이너 로그와 마찬가지로, `/var/log` 디렉터리의 시스템 컴포넌트 로그들은 로테이트해야 한다. +`kube-up.sh` 스크립트로 생성된 쿠버네티스 클러스터에서는, `logrotate` 도구로 로그가 로테이트되도록 설정된다. +`logrotate` 도구는 로그가 매일 또는 크기가 100MB 보다 클 때 로테이트된다. + +## {{% heading "whatsnext" %}} + +* [쿠버네티스 로깅 아키텍처](/docs/concepts/cluster-administration/logging/) 알아보기 +* [구조화된 로깅](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/1602-structured-logging) 알아보기 +* [로깅 심각도(serverity) 규칙](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/logging.md) 알아보기 From df5ece0a1d2c7b594bb975299b40a592efa9c777 Mon Sep 17 00:00:00 2001 From: Albert Date: Thu, 3 Jun 2021 16:25:39 +0800 Subject: [PATCH 220/221] [zh]: fix common lables.md --- .../concepts/overview/working-with-objects/common-labels.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/content/zh/docs/concepts/overview/working-with-objects/common-labels.md b/content/zh/docs/concepts/overview/working-with-objects/common-labels.md index 664c9ed096..a64d648ac3 100644 --- a/content/zh/docs/concepts/overview/working-with-objects/common-labels.md +++ b/content/zh/docs/concepts/overview/working-with-objects/common-labels.md @@ -116,7 +116,10 @@ to be identifiable. Every instance of an application must have a unique name. 应用可以在 Kubernetes 集群中安装一次或多次。在某些情况下,可以安装在同一命名空间中。例如,可以不止一次地为不同的站点安装不同的 WordPress。 -应用的名称和实例的名称是分别记录的。例如,某 WordPress 实例的 `app.kubernetes.io/name` 为 `wordpress`,而其实例名称表现为 `app.kubernetes.io/instance` 的属性值 `wordpress-abcxzy`。这使应用程序和应用程序的实例成为可能是可识别的。应用程序的每个实例都必须具有唯一的名称。 +应用的名称和实例的名称是分别记录的。例如,WordPress 应用的 +`app.kubernetes.io/name` 为 `wordpress`,而其实例名称 +`app.kubernetes.io/instance` 为 `wordpress-abcxzy`。 +这使得应用和应用的实例均可被识别,应用的每个实例都必须具有唯一的名称。 -欢迎来到新的 Kubernetes 博客。关注此博客,了解 Kubernetes 开源项目。我们计划不时发布发布说明,操作方法文章,活动,甚至一些非常有趣的话题。 +欢迎来到新的 Kubernetes 博客。关注此博客,了解 Kubernetes 开源项目。我们计划时不时的发布发布说明,操作方法文章,活动,甚至一些非常有趣的话题。 -另一方面, CNI 在哲学上与 Kubernetes 更加一致。它比 CNM 简单得多,不需要守护进程,并且至少是合理的跨平台( CoreOS 的 [rkt](https://coreos.com/rkt/docs/) 容器运行时支持它)。跨平台意味着有机会启用跨运行时(例如 Docker , Rocket , Hyper )运行相同的网络配置。 它遵循 UNIX 的理念,即做好一件事。 +另一方面, CNI 在哲学上与 Kubernetes 更加一致。它比 CNM 简单得多,不需要守护进程,并且至少有合理的跨平台( CoreOS 的 [rkt](https://coreos.com/rkt/docs/) 容器运行时支持它)。跨平台意味着有机会启用跨运行时(例如 Docker , Rocket , Hyper )运行相同的网络配置。 它遵循 UNIX 的理念,即做好一件事。 diff --git a/content/zh/blog/_posts/2020-12-02-dockershim-faq.md b/content/zh/blog/_posts/2020-12-02-dockershim-faq.md index b910cfdfd2..65292d90ac 100644 --- a/content/zh/blog/_posts/2020-12-02-dockershim-faq.md +++ b/content/zh/blog/_posts/2020-12-02-dockershim-faq.md @@ -83,7 +83,7 @@ and other ecosystem groups to ensure a smooth transition and will evaluate thing as the situation evolves. --> 考虑到此改变带来的影响,我们使用了一个加长的废弃时间表。 -在 Kubernetes 1.22 版之前,它不会被彻底移除;换句话说,dockershim 被移除的最早版本会是 2021 年底发布 1.23 版。 +在 Kubernetes 1.22 版之前,它不会被彻底移除;换句话说,dockershim 被移除的最早版本会是 2021 年底发布的 1.23 版。 我们将与供应商以及其他生态团队紧密合作,确保顺利过渡,并将依据事态的发展评估后续事项。 -弃用 Docker 这个底层运行时,转而支持符合为 Kubernetes 创建的 +弃用 Docker 这个底层运行时,转而支持符合为 Kubernetes 创建的容器运行接口 [Container Runtime Interface (CRI)](https://kubernetes.io/blog/2016/12/container-runtime-interface-cri-in-kubernetes/) 的运行时。 Docker 构建的镜像,将在你的集群的所有运行时中继续工作,一如既往。 diff --git a/content/zh/docs/concepts/architecture/cloud-controller.md b/content/zh/docs/concepts/architecture/cloud-controller.md index c962b5f5f0..f97922ec17 100644 --- a/content/zh/docs/concepts/architecture/cloud-controller.md +++ b/content/zh/docs/concepts/architecture/cloud-controller.md @@ -56,7 +56,7 @@ You can also run the cloud controller manager as a Kubernetes of the control plane. --> {{< note >}} -你也可以以 Kubernetes {{< glossary_tooltip text="插件" term_id="addons" >}} +你也可以用 Kubernetes {{< glossary_tooltip text="插件" term_id="addons" >}} 的形式而不是控制面中的一部分来运行云控制器管理器。 {{< /note >}}