From b6760f3ae23b4e192280e020a2c28545b4de4ac6 Mon Sep 17 00:00:00 2001 From: Jerry Park Date: Sat, 23 May 2020 21:31:56 +0900 Subject: [PATCH] Fourth Korean l10n work for release 1.18 - Translate docs/reference/issues-security/_index.md into Korean (#21145) - Translate tasks/administer-cluster/kubeadm/adding-windows-nodes.md into Korean (#21003) - Translate manage-resources/memory-default-namespace.md into Korean (#21089) - Translate tasks/configure-pod-container/pull-image-private-registry in Korean (#21036) - Translate contribute/advanced.md into Korean (#21002) - Update to Outdated files in the dev-1.18-ko.4 branch. (#21102) - Translate manage-resources/cpu-constraint-namespace.md into Korean (#21048) - Translate manage-resources/memory-constraint-namespace.md into Korean (#21091) - Translate setup/release/notes.md in Korean (#21158) - Translate manage-resources/quota-pod-namespace.md into Korean (#21087) - Translate tasks/administer-cluster/kubeadm/upgrading-windows-nodes.md into Korean (#20999) - Translate tasks/administer-cluster/kubeadm/kubeadm-certs.md into Korean (#21000) - Translate manage-resources/quota-memory-cpu-namespace.md into Korean (#21088) - Translate manage-resources/cpu-default-namespace.md into Korean (#21090) - Translate contribute/suggesting-improvements.md into Korean (#21001) - Translate quality-service-pod in Korean (#21081) Co-authored-by: Jerry Park Co-authored-by: Jesang Myung Co-authored-by: DongMoon Kim Co-authored-by: Jesang Myung Co-authored-by: Yuk, Yongsu Co-authored-by: bluefriday --- content/ko/_index.html | 2 +- .../ko/case-studies/ccp-games/ccp_logo.png | Bin 20368 -> 0 bytes content/ko/case-studies/ccp-games/index.html | 4 - .../ko/case-studies/comcast/comcast_logo.png | Bin 6279 -> 0 bytes content/ko/case-studies/comcast/index.html | 4 - .../concur/concur_featured_logo.png | Bin 19719 -> 0 bytes content/ko/case-studies/concur/index.html | 4 - .../ko/case-studies/ebay/ebay_featured.png | Bin 22471 -> 0 bytes content/ko/case-studies/ebay/ebay_logo.png | Bin 7316 -> 0 bytes content/ko/case-studies/ebay/index.html | 4 - .../ko/case-studies/goldman-sachs/gs_logo.png | Bin 23083 -> 0 bytes .../ko/case-studies/goldman-sachs/index.html | 4 - .../homeoffice/homeoffice_logo.png | Bin 27411 -> 0 bytes content/ko/case-studies/homeoffice/index.html | 4 - content/ko/case-studies/jd/index.html | 4 - content/ko/case-studies/jd/jd_logo.png | Bin 10738 -> 0 bytes content/ko/case-studies/liveperson/index.html | 4 - .../liveperson/liveperson_logo.png | Bin 19458 -> 0 bytes content/ko/case-studies/monzo/index.html | 4 - content/ko/case-studies/monzo/monzo_logo.png | Bin 5515 -> 0 bytes content/ko/case-studies/philips/index.html | 4 - .../ko/case-studies/philips/philips_logo.png | Bin 3877 -> 0 bytes content/ko/case-studies/pokemon-go/index.html | 4 - .../pokemon-go/pokemon_go_logo.png | Bin 19218 -> 0 bytes .../ko/case-studies/samsung-sds/index.html | 4 - .../ko/case-studies/samsung-sds/sds_logo.png | Bin 22930 -> 0 bytes content/ko/case-studies/sap/index.html | 4 - content/ko/case-studies/sap/sap_logo.png | Bin 20435 -> 0 bytes content/ko/case-studies/sap/sap_small.png | Bin 4879 -> 0 bytes content/ko/case-studies/soundcloud/index.html | 4 - .../soundcloud/soundcloud_logo.png | Bin 22800 -> 0 bytes content/ko/case-studies/wepay/index.html | 4 - content/ko/case-studies/wepay/wepay_logo.png | Bin 20277 -> 0 bytes content/ko/case-studies/zulily/index.html | 4 - .../case-studies/zulily/zulily_featured.png | Bin 7953 -> 0 bytes .../ko/case-studies/zulily/zulily_logo.png | Bin 8815 -> 0 bytes .../architecture/master-node-communication.md | 120 -- .../ko/docs/concepts/architecture/nodes.md | 291 ++-- .../concepts/cluster-administration/addons.md | 1 + .../cluster-administration/cloud-providers.md | 21 + .../cluster-administration/networking.md | 4 + .../docs/concepts/configuration/configmap.md | 2 +- .../manage-resources-containers.md | 2 +- .../configuration/pod-priority-preemption.md | 9 +- .../docs/concepts/containers/runtime-class.md | 2 +- .../overview/working-with-objects/labels.md | 2 +- .../docs/concepts/policy/resource-quotas.md | 3 +- .../assign-pod-node.md | 800 +++++----- .../scheduling-eviction/kube-scheduler.md | 2 +- .../taint-and-toleration.md | 0 ...ries-to-pod-etc-hosts-with-host-aliases.md | 2 +- .../services-networking/dns-pod-service.md | 5 +- .../services-networking/dual-stack.md | 15 +- .../services-networking/endpoint-slices.md | 5 - .../concepts/services-networking/ingress.md | 26 +- .../concepts/services-networking/service.md | 13 +- .../concepts/storage/persistent-volumes.md | 2 +- .../docs/concepts/storage/storage-classes.md | 4 +- content/ko/docs/concepts/storage/volumes.md | 9 +- .../workloads/controllers/daemonset.md | 4 +- .../workloads/controllers/deployment.md | 173 ++- .../workloads/controllers/replicaset.md | 2 +- .../concepts/workloads/pods/disruptions.md | 4 +- .../workloads/pods/init-containers.md | 6 +- .../pods/pod-topology-spread-constraints.md | 4 +- .../docs/concepts/workloads/pods/podpreset.md | 54 +- content/ko/docs/contribute/advanced.md | 248 +++ .../docs/contribute/review/for-approvers.md | 3 +- .../contribute/suggesting-improvements.md | 65 + content/ko/docs/reference/glossary/node.md | 2 + content/ko/docs/reference/glossary/taint.md | 2 +- .../ko/docs/reference/glossary/toleration.md | 2 +- .../docs/reference/issues-security/_index.md | 5 + .../setup/learning-environment/minikube.md | 216 +-- .../container-runtimes.md | 158 +- .../windows/user-guide-windows-containers.md | 2 +- content/ko/docs/setup/release/notes.md | 1372 +++++++++++++++++ .../access-cluster.md | 2 +- .../configure-access-multiple-clusters.md | 2 +- .../web-ui-dashboard.md | 2 +- .../kubeadm/adding-windows-nodes.md | 182 +++ .../kubeadm/kubeadm-certs.md | 243 +++ .../kubeadm/upgrading-windows-nodes.md | 93 ++ .../manage-resources/_index.md | 4 + .../cpu-constraint-namespace.md | 269 ++++ .../manage-resources/cpu-default-namespace.md | 191 +++ .../memory-constraint-namespace.md | 268 ++++ .../memory-default-namespace.md | 199 +++ .../quota-memory-cpu-namespace.md | 175 +++ .../manage-resources/quota-pod-namespace.md | 136 ++ .../assign-pods-nodes-using-node-affinity.md | 2 +- .../pull-image-private-registry.md | 214 +++ .../quality-service-pod.md | 266 ++++ .../resource-metrics-pipeline.md | 2 +- .../declarative-config.md | 4 +- .../horizontal-pod-autoscale-walkthrough.md | 2 +- .../ko/docs/tasks/tools/install-kubectl.md | 46 +- .../ko/docs/templates/feature-state-alpha.txt | 8 - .../ko/docs/templates/feature-state-beta.txt | 8 - .../templates/feature-state-deprecated.txt | 2 - .../docs/templates/feature-state-stable.txt | 5 - content/ko/docs/templates/index.md | 13 - .../ko/docs/tutorials/clusters/apparmor.md | 2 +- content/ko/docs/tutorials/hello-minikube.md | 18 +- .../guestbook-logs-metrics-with-elk.md | 18 +- .../admin/resource/cpu-constraints-pod-2.yaml | 13 + .../admin/resource/cpu-constraints-pod-3.yaml | 13 + .../admin/resource/cpu-constraints-pod-4.yaml | 8 + .../admin/resource/cpu-constraints-pod.yaml | 13 + .../admin/resource/cpu-constraints.yaml | 11 + .../admin/resource/cpu-defaults-pod-2.yaml | 11 + .../admin/resource/cpu-defaults-pod-3.yaml | 11 + .../admin/resource/cpu-defaults-pod.yaml | 8 + .../examples/admin/resource/cpu-defaults.yaml | 11 + .../resource/memory-constraints-pod-2.yaml | 13 + .../resource/memory-constraints-pod-3.yaml | 13 + .../resource/memory-constraints-pod-4.yaml | 9 + .../resource/memory-constraints-pod.yaml | 13 + .../admin/resource/memory-constraints.yaml | 11 + .../admin/resource/memory-defaults-pod-2.yaml | 11 + .../admin/resource/memory-defaults-pod-3.yaml | 11 + .../admin/resource/memory-defaults-pod.yaml | 8 + .../admin/resource/memory-defaults.yaml | 11 + .../admin/resource/quota-mem-cpu-pod-2.yaml | 15 + .../admin/resource/quota-mem-cpu-pod.yaml | 15 + .../admin/resource/quota-mem-cpu.yaml | 10 + .../admin/resource/quota-pod-deployment.yaml | 17 + .../ko/examples/admin/resource/quota-pod.yaml | 7 + content/ko/examples/minikube/Dockerfile | 4 - content/ko/examples/minikube/server.js | 9 - content/ko/examples/pods/private-reg-pod.yaml | 11 + content/ko/examples/pods/qos/qos-pod-2.yaml | 14 + content/ko/examples/pods/qos/qos-pod-3.yaml | 9 + content/ko/examples/pods/qos/qos-pod-4.yaml | 16 + content/ko/examples/pods/qos/qos-pod.yaml | 16 + 135 files changed, 5336 insertions(+), 1110 deletions(-) delete mode 100644 content/ko/case-studies/ccp-games/ccp_logo.png delete mode 100644 content/ko/case-studies/ccp-games/index.html delete mode 100644 content/ko/case-studies/comcast/comcast_logo.png delete mode 100644 content/ko/case-studies/comcast/index.html delete mode 100644 content/ko/case-studies/concur/concur_featured_logo.png delete mode 100644 content/ko/case-studies/concur/index.html delete mode 100644 content/ko/case-studies/ebay/ebay_featured.png delete mode 100644 content/ko/case-studies/ebay/ebay_logo.png delete mode 100644 content/ko/case-studies/ebay/index.html delete mode 100644 content/ko/case-studies/goldman-sachs/gs_logo.png delete mode 100644 content/ko/case-studies/goldman-sachs/index.html delete mode 100644 content/ko/case-studies/homeoffice/homeoffice_logo.png delete mode 100644 content/ko/case-studies/homeoffice/index.html delete mode 100644 content/ko/case-studies/jd/index.html delete mode 100644 content/ko/case-studies/jd/jd_logo.png delete mode 100644 content/ko/case-studies/liveperson/index.html delete mode 100644 content/ko/case-studies/liveperson/liveperson_logo.png delete mode 100644 content/ko/case-studies/monzo/index.html delete mode 100644 content/ko/case-studies/monzo/monzo_logo.png delete mode 100644 content/ko/case-studies/philips/index.html delete mode 100644 content/ko/case-studies/philips/philips_logo.png delete mode 100644 content/ko/case-studies/pokemon-go/index.html delete mode 100644 content/ko/case-studies/pokemon-go/pokemon_go_logo.png delete mode 100644 content/ko/case-studies/samsung-sds/index.html delete mode 100644 content/ko/case-studies/samsung-sds/sds_logo.png delete mode 100644 content/ko/case-studies/sap/index.html delete mode 100644 content/ko/case-studies/sap/sap_logo.png delete mode 100644 content/ko/case-studies/sap/sap_small.png delete mode 100644 content/ko/case-studies/soundcloud/index.html delete mode 100644 content/ko/case-studies/soundcloud/soundcloud_logo.png delete mode 100644 content/ko/case-studies/wepay/index.html delete mode 100644 content/ko/case-studies/wepay/wepay_logo.png delete mode 100644 content/ko/case-studies/zulily/index.html delete mode 100644 content/ko/case-studies/zulily/zulily_featured.png delete mode 100644 content/ko/case-studies/zulily/zulily_logo.png delete mode 100644 content/ko/docs/concepts/architecture/master-node-communication.md rename content/ko/docs/concepts/{configuration => scheduling-eviction}/assign-pod-node.md (98%) rename content/ko/docs/concepts/{configuration => scheduling-eviction}/taint-and-toleration.md (100%) create mode 100644 content/ko/docs/contribute/advanced.md create mode 100644 content/ko/docs/contribute/suggesting-improvements.md create mode 100644 content/ko/docs/reference/issues-security/_index.md create mode 100644 content/ko/docs/setup/release/notes.md create mode 100644 content/ko/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes.md create mode 100644 content/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md create mode 100644 content/ko/docs/tasks/administer-cluster/kubeadm/upgrading-windows-nodes.md create mode 100644 content/ko/docs/tasks/administer-cluster/manage-resources/_index.md create mode 100644 content/ko/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace.md create mode 100644 content/ko/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace.md create mode 100644 content/ko/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace.md create mode 100644 content/ko/docs/tasks/administer-cluster/manage-resources/memory-default-namespace.md create mode 100644 content/ko/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace.md create mode 100644 content/ko/docs/tasks/administer-cluster/manage-resources/quota-pod-namespace.md create mode 100644 content/ko/docs/tasks/configure-pod-container/pull-image-private-registry.md create mode 100644 content/ko/docs/tasks/configure-pod-container/quality-service-pod.md delete mode 100644 content/ko/docs/templates/feature-state-alpha.txt delete mode 100644 content/ko/docs/templates/feature-state-beta.txt delete mode 100644 content/ko/docs/templates/feature-state-deprecated.txt delete mode 100644 content/ko/docs/templates/feature-state-stable.txt delete mode 100644 content/ko/docs/templates/index.md create mode 100644 content/ko/examples/admin/resource/cpu-constraints-pod-2.yaml create mode 100644 content/ko/examples/admin/resource/cpu-constraints-pod-3.yaml create mode 100644 content/ko/examples/admin/resource/cpu-constraints-pod-4.yaml create mode 100644 content/ko/examples/admin/resource/cpu-constraints-pod.yaml create mode 100644 content/ko/examples/admin/resource/cpu-constraints.yaml create mode 100644 content/ko/examples/admin/resource/cpu-defaults-pod-2.yaml create mode 100644 content/ko/examples/admin/resource/cpu-defaults-pod-3.yaml create mode 100644 content/ko/examples/admin/resource/cpu-defaults-pod.yaml create mode 100644 content/ko/examples/admin/resource/cpu-defaults.yaml create mode 100644 content/ko/examples/admin/resource/memory-constraints-pod-2.yaml create mode 100644 content/ko/examples/admin/resource/memory-constraints-pod-3.yaml create mode 100644 content/ko/examples/admin/resource/memory-constraints-pod-4.yaml create mode 100644 content/ko/examples/admin/resource/memory-constraints-pod.yaml create mode 100644 content/ko/examples/admin/resource/memory-constraints.yaml create mode 100644 content/ko/examples/admin/resource/memory-defaults-pod-2.yaml create mode 100644 content/ko/examples/admin/resource/memory-defaults-pod-3.yaml create mode 100644 content/ko/examples/admin/resource/memory-defaults-pod.yaml create mode 100644 content/ko/examples/admin/resource/memory-defaults.yaml create mode 100644 content/ko/examples/admin/resource/quota-mem-cpu-pod-2.yaml create mode 100644 content/ko/examples/admin/resource/quota-mem-cpu-pod.yaml create mode 100644 content/ko/examples/admin/resource/quota-mem-cpu.yaml create mode 100644 content/ko/examples/admin/resource/quota-pod-deployment.yaml create mode 100644 content/ko/examples/admin/resource/quota-pod.yaml delete mode 100644 content/ko/examples/minikube/Dockerfile delete mode 100644 content/ko/examples/minikube/server.js create mode 100644 content/ko/examples/pods/private-reg-pod.yaml create mode 100644 content/ko/examples/pods/qos/qos-pod-2.yaml create mode 100644 content/ko/examples/pods/qos/qos-pod-3.yaml create mode 100644 content/ko/examples/pods/qos/qos-pod-4.yaml create mode 100644 content/ko/examples/pods/qos/qos-pod.yaml diff --git a/content/ko/_index.html b/content/ko/_index.html index 6d9f6ecd12..1017b6093e 100644 --- a/content/ko/_index.html +++ b/content/ko/_index.html @@ -50,7 +50,7 @@ Google이 일주일에 수십억 개의 컨테이너들을 운영하게 해준


- Attend KubeCon in Boston on November 17-20, 2020 + Attend KubeCon EU virtually on August 17-20, 2020
diff --git a/content/ko/case-studies/ccp-games/ccp_logo.png b/content/ko/case-studies/ccp-games/ccp_logo.png deleted file mode 100644 index cbf3d267ba8ddce67119711911d799ef87dc4c3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20368 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 y1pnU6*%t)})QeQ@uKW+Ou>ooT diff --git a/content/ko/case-studies/ccp-games/index.html b/content/ko/case-studies/ccp-games/index.html deleted file mode 100644 index 8867cbb323..0000000000 --- a/content/ko/case-studies/ccp-games/index.html +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: CCP Games -content_url: https://cloud.google.com/customers/ccp-games/ ---- \ No newline at end of file diff --git a/content/ko/case-studies/comcast/comcast_logo.png b/content/ko/case-studies/comcast/comcast_logo.png deleted file mode 100644 index 3f0ef7664568017f8e49592a08b4e83c71964524..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6279 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 UAM}rI|En@xZ3C?m4ZD#41B|(?>;M1& diff --git a/content/ko/case-studies/concur/index.html b/content/ko/case-studies/concur/index.html deleted file mode 100644 index 0bb619f527..0000000000 --- a/content/ko/case-studies/concur/index.html +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Concur -content_url: http://searchitoperations.techtarget.com/news/450297178/Tech-firms-roll-out-Kubernetes-in-production ---- \ No newline at end of file diff --git a/content/ko/case-studies/ebay/ebay_featured.png b/content/ko/case-studies/ebay/ebay_featured.png deleted file mode 100644 index 4ad17a4af50365afac13a4b6f841f5ec07b56a9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22471 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 ZFa>NbRFW0b9{<#?mYSaGQ)Qc={{mwMEo}e* diff --git a/content/ko/case-studies/ebay/ebay_logo.png b/content/ko/case-studies/ebay/ebay_logo.png deleted file mode 100644 index 830913c52b13fb4e808cbc61bb03be9ef990a724..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7316 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�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 RV}Gszs48lq%H_>N{vQp8*bV>y diff --git a/content/ko/case-studies/goldman-sachs/index.html b/content/ko/case-studies/goldman-sachs/index.html deleted file mode 100644 index 93d3022d12..0000000000 --- a/content/ko/case-studies/goldman-sachs/index.html +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Goldman Sachs -content_url: http://blogs.wsj.com/cio/2016/02/24/big-changes-in-goldmans-software-emerge-from-small-containers/ ---- \ No newline at end of file diff --git a/content/ko/case-studies/homeoffice/homeoffice_logo.png b/content/ko/case-studies/homeoffice/homeoffice_logo.png deleted file mode 100644 index 35d97226111593770ce84fe1a73597fee9273457..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27411 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 Mqas}`X%h550Q;ID$^ZZW diff --git a/content/ko/case-studies/liveperson/index.html b/content/ko/case-studies/liveperson/index.html deleted file mode 100644 index 0cadb0f274..0000000000 --- a/content/ko/case-studies/liveperson/index.html +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: LivePerson -content_url: https://www.openstack.org/videos/video/running-kubernetes-on-openstack-at-liveperson ---- \ No newline at end of file diff --git a/content/ko/case-studies/liveperson/liveperson_logo.png b/content/ko/case-studies/liveperson/liveperson_logo.png deleted file mode 100644 index b7e63d94f72d697d0e88e931aee15dc3f0797255..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19458 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 f|CErfQWf%o9kh9p1%7(>cv?e diff --git a/content/ko/case-studies/pokemon-go/index.html b/content/ko/case-studies/pokemon-go/index.html deleted file mode 100644 index ed4e168019..0000000000 --- a/content/ko/case-studies/pokemon-go/index.html +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Pokemon GO -content_url: https://cloudplatform.googleblog.com/2016/09/bringing-Pokemon-GO-to-life-on-Google-Cloud.html ---- \ No newline at end of file diff --git a/content/ko/case-studies/pokemon-go/pokemon_go_logo.png b/content/ko/case-studies/pokemon-go/pokemon_go_logo.png deleted file mode 100644 index 3cf2b5c7ef63d1719087cdaf4c408b068651854b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19218 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 diff --git a/content/ko/case-studies/samsung-sds/index.html b/content/ko/case-studies/samsung-sds/index.html deleted file mode 100644 index db4aa479ab..0000000000 --- a/content/ko/case-studies/samsung-sds/index.html +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Samsung SDS -content_url: http://www.nextplatform.com/2016/05/24/samsung-experts-put-kubernetes-paces/ ---- \ No newline at end of file diff --git a/content/ko/case-studies/samsung-sds/sds_logo.png b/content/ko/case-studies/samsung-sds/sds_logo.png deleted file mode 100644 index 0a172df65d7e152f91c088b71b2a969853faca45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22930 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 S!G9G2$lq0wDU>pK`u_ku*xgnD diff --git a/content/ko/case-studies/sap/index.html b/content/ko/case-studies/sap/index.html deleted file mode 100644 index 856dc8be9d..0000000000 --- a/content/ko/case-studies/sap/index.html +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: SAP -content_url: https://youtu.be/4gyeixJLabo ---- \ No newline at end of file diff --git a/content/ko/case-studies/sap/sap_logo.png b/content/ko/case-studies/sap/sap_logo.png deleted file mode 100644 index 681a3fe5cff8c390ad8ff822ba255ba397ba65e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20435 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 T@J8U?zui+;(N?~zXc_cBN?8%x diff --git a/content/ko/case-studies/sap/sap_small.png b/content/ko/case-studies/sap/sap_small.png deleted file mode 100644 index ada89de7595e59a5496285cf74ce56fd12d30ad4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4879 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 LD4rww`04)xu@gFQ diff --git a/content/ko/case-studies/wepay/index.html b/content/ko/case-studies/wepay/index.html deleted file mode 100644 index b8ce8201d5..0000000000 --- a/content/ko/case-studies/wepay/index.html +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: WePay -content_url: http://thenewstack.io/wepay-kubernetes-changed-business/ ---- \ No newline at end of file diff --git a/content/ko/case-studies/wepay/wepay_logo.png b/content/ko/case-studies/wepay/wepay_logo.png deleted file mode 100644 index 4e35dd8fd694a189ca1e03eec452363c9bf8336d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20277 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

3?y6N?ySl13L{lAvjX{P12M33(q$sETJ}>sxSI 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 - -SSH 터널을 대체하는 Konnectivity 서비스는 마스터 → 클러스터 통신을 -위한 TCP 수준의 프록시를 제공한다. Konnectivity는 마스터 -네트워크와 클러스터 네트워크에서 실행되는 Konnectivity 서버와 -에이전트 두 부분으로 구성된다. Konnectivity 에이전트는 -Konnectivity 서버에 대한 연결을 시작하고, 유지한다. -이 연결을 통해 모든 마스터 → 클러스터로의 트래픽이 통과하게 된다. - -클러스터에서 설정하는 방법에 대해서는 [Konnectivity 서비스 구성](/docs/tasks/setup-konnectivity/) -하기를 참고한다. - -{{% /capture %}} diff --git a/content/ko/docs/concepts/architecture/nodes.md b/content/ko/docs/concepts/architecture/nodes.md index 1ab0ba857e..34690c7825 100644 --- a/content/ko/docs/concepts/architecture/nodes.md +++ b/content/ko/docs/concepts/architecture/nodes.md @@ -6,18 +6,112 @@ weight: 10 {{% capture overview %}} -하나의 노드는 쿠버네티스에서 하나의 워커 머신으로, 이전에는 `미니언`으로 알려졌다. 노드는 -클러스터에 따라, VM 또는 물리 머신이 될 수 있다. 각 노드는 -[파드](/ko/docs/concepts/workloads/pods/pod/)를 동작시키기 위해 필요한 서비스를 포함하며 마스터 컴포넌트에 의해 관리된다. 노드 상의 서비스는 [컨테이너 런타임](/ko/docs/concepts/overview/components/#컨테이너-런타임), kubelet 그리고 kube-proxy를 포함한다. 보다 -상세한 내용은 아키텍처 문서 내 -[쿠버네티스 노드](https://git.k8s.io/community/contributors/design-proposals/architecture/architecture.md#the-kubernetes-node) -섹션을 확인한다. +쿠버네티스는 컨테이너를 파드내에 배치하고 _노드_ 에서 실행함으로 워크로드를 구동한다. +노드는 클러스터에 따라 가상 또는 물리적 머신일 수 있다. 각 노드에는 +{{< glossary_tooltip text="컨트롤 플레인" term_id="control-plane" >}}이라는 +{{< glossary_tooltip text="파드" term_id="pod" >}}를 +실행하는데 필요한 서비스가 포함되어 있다. + +일반적으로 클러스터에는 여러개의 노드가 있으며, 학습 또는 리소스가 제한되는 +환경에서는 하나만 있을 수도 있다. + +노드의 [컴포넌트](/ko/docs/concepts/overview/components/#노드-컴포넌트)에는 +{{< glossary_tooltip text="kubelet" term_id="kubelet" >}}, +{{< glossary_tooltip text="컨테이너 런타임" term_id="container-runtime" >}} +그리고 {{< glossary_tooltip text="kube-proxy" term_id="kube-proxy" >}}가 포함된다. {{% /capture %}} - {{% capture body %}} +## 관리 + +{{< glossary_tooltip text="API 서버" term_id="kube-apiserver" >}}에 노드를 추가하는 두가지 주요 방법이 있다. + +1. 노드의 kubelet으로 컨트롤 플레인에 자체 등록 +2. 사용자 또는 다른 사용자가 노드 오브젝트를 수동으로 추가 + +노드 오브젝트 또는 노드의 kubelet으로 자체 등록한 후 컨트롤 플레인은 새 노드 오브젝트가 유효한지 확인한다. +예를 들어 다음 JSON 매니페스트에서 노드를 만들려는 경우이다. + +```json +{ + "kind": "Node", + "apiVersion": "v1", + "metadata": { + "name": "10.240.79.157", + "labels": { + "name": "my-first-k8s-node" + } + } +} +``` + +쿠버네티스는 내부적으로 노드 오브젝트를 생성한다(표시한다). 쿠버네티스는 +kubelet이 노드의 `metadata.name` 필드와 일치하는 API 서버에 등록이 되어있는지 확인한다. +노드가 정상이면(필요한 모든 서비스가 실행중인 경우) 파드를 실행할 수 있게 된다. +그렇지 않으면, 해당 노드는 정상이 될때까지 모든 클러스터 활동에 +대해 무시된다. + +{{< note >}} +쿠버네티스는 유효하지 않은 노드 오브젝트를 유지하고, 노드가 +정상적인지 확인한다. + +상태 확인을 중지하려면 사용자 또는 {{< glossary_tooltip term_id="controller" text="컨트롤러">}}에서 +노드 오브젝트를 명시적으로 삭제해야한다. +{{< /note >}} + +노드 오브젝트의 이름은 유효한 [DNS 서브도메인 이름](/ko/docs/concepts/overview/working-with-objects/names/#dns-서브도메인-이름들)이어야 한다. + +### 노드에 대한 자체-등록 + +kubelet 플래그 `--register-node`는 참(기본값)일 경우, kubelet 은 API 서버에 +스스로 등록을 시도할 것이다. 이는 대부분의 배포판에 의해 이용되는, 선호하는 패턴이다. + +자체-등록에 대해, kubelet은 다음 옵션과 함께 시작된다. + + - `--kubeconfig` - apiserver에 스스로 인증하기 위한 자격증명에 대한 경로. + - `--cloud-provider` - 자신에 대한 메터데이터를 읽기 위해 어떻게 {{< glossary_tooltip text="클라우드 제공자" term_id="cloud-provider" >}}와 소통할지에 대한 방법. + - `--register-node` - 자동으로 API 서버에 등록. + - `--register-with-taints` - 주어진 taint 리스트 (콤마로 분리된 `=:`)를 가진 노드 등록. `register-node`가 거짓이면 동작 안함. + - `--node-ip` - 노드의 IP 주소. + - `--node-labels` - 클러스터에 노드를 등록할 때 추가 할 {{< glossary_tooltip text="레이블" term_id="label" >}}([NodeRestriction admission plugin](/docs/reference/access-authn-authz/admission-controllers/#noderestriction)에 의해 적용되는 레이블 제한 사항 참고). + - `--node-status-update-frequency` - 얼마나 자주 kubelet이 마스터에 노드 상태를 게시할 지 정의. + +[Node authorization mode](/docs/reference/access-authn-authz/node/)와 +[NodeRestriction admission plugin](/docs/reference/access-authn-authz/admission-controllers/#noderestriction)이 활성화 되면, +kubelets 은 자신의 노드 리소스를 생성/수정할 권한을 가진다. + +#### 수동 노드 관리 + +{{< glossary_tooltip text="kubectl" term_id="kubectl" >}}을 +사용해서 노드 오브젝트를 생성하고 수정할 수 있다. + +노드 오브젝트를 수동으로 생성하려면 kubelet 플래그를 `--register-node=false` 로 설정한다. + +`--register-node` 설정과 관계 없이 노드 오브젝트를 수정할 수 있다. +예를 들어 기존 노드에 레이블을 설정하거나, 스케줄 불가로 표시할 수 있다. + +파드의 노드 셀렉터와 함께 노드의 레이블을 사용해서 스케줄링을 제어할 수 있다. +예를 들어, 사용 가능한 노드의 하위 집합에서만 실행되도록 +파드를 제한할 수 있다. + +노드를 스케줄 불가로 표시하면 스케줄러가 해당 노드에 새 파드를 배치할 수 없지만, +노드에 있는 기존 파드에는 영향을 미치지 않는다. +이는 노드 재부팅 또는 기타 유지보수 준비 단계에서 유용하다. + +노드를 스케줄 불가로 표시하려면 다음을 실행한다. + +```shell +kubectl cordon $NODENAME +``` + +{{< note >}} +{{< glossary_tooltip term_id="daemonset" >}}에 포함되는 일부 파드는 +스케줄 불가 노드에서 실행될 수 있다. 일반적으로 데몬셋은 워크로드 애플리케이션을 +비우는 경우에도 노드에서 실행되어야 하는 노드 로컬 서비스를 제공한다. +{{< /note >}} + ## 노드 상태 노드의 상태는 다음의 정보를 포함한다. @@ -27,11 +121,13 @@ weight: 10 * [용량과 할당가능](#capacity) * [정보](#info) -노드의 상태와 상세 정보는 다음 커맨드를 통해 확인할 수 있다. +`kubectl` 을 사용해서 노드 상태와 기타 세부 정보를 볼수 있다. + ```shell kubectl describe node ``` -각 섹션은 아래 상세하게 기술되었다. + +출력되는 각 섹션은 아래에 설명되어있다. ### 주소 {#addresses} @@ -46,13 +142,21 @@ kubectl describe node `conditions` 필드는 모든 `Running` 노드의 상태를 기술한다. 컨디션의 예로 다음을 포함한다. -| Node Condition | Description | +{{< table caption = "노드 컨디션과 각 컨디션이 적용되는 시기에 대한 설명들이다." >}} +| 노드 컨디션 | 설명 | |----------------|-------------| | `Ready` | 노드가 상태 양호하며 파드를 수용할 준비가 되어 있는 경우 `True`, 노드의 상태가 불량하여 파드를 수용하지 못할 경우 `False`, 그리고 노드 컨트롤러가 마지막 `node-monitor-grace-period` (기본값 40 기간 동안 노드로부터 응답을 받지 못한 경우) `Unknown` | +| `DiskPressure` | 디스크 사이즈 상에 압박이 있는 경우, 즉 디스크 용량이 넉넉치 않은 경우 `True`, 반대의 경우 `False` | | `MemoryPressure` | 노드 메모리 상에 압박이 있는 경우, 즉 노드 메모리가 넉넉치 않은 경우 `True`, 반대의 경우 `False` | | `PIDPressure` | 프로세스 상에 압박이 있는 경우, 즉 노드 상에 많은 프로세스들이 존재하는 경우 `True`, 반대의 경우 `False` | -| `DiskPressure` | 디스크 사이즈 상에 압박이 있는 경우, 즉 디스크 용량이 넉넉치 않은 경우 `True`, 반대의 경우 `False` | | `NetworkUnavailable` | 노드에 대해 네트워크가 올바르게 구성되지 않은 경우 `True`, 반대의 경우 `False` | +{{< /table >}} + +{{< note >}} +커맨드 라인 도구를 사용해서 코드화된 노드의 세부 정보를 출력하는 경우 조건에는 +`SchedulingDisabled` 이 포함된다. `SchedulingDisabled` 은 쿠버네티스 API의 조건이 아니며, +대신 코드화된 노드는 사양에 스케줄 불가로 표시된다. +{{< /note >}} 노드 컨디션은 JSON 오브젝트로 표현된다. 예를 들어, 다음 응답은 상태 양호한 노드를 나타낸다. @@ -69,17 +173,18 @@ kubectl describe node ] ``` -ready 컨디션의 상태가 `pod-eviction-timeout` ([kube-controller-manager](/docs/admin/kube-controller-manager/)에 전달된 인수) 보다 더 길게 `Unknown` 또는 `False`로 유지되는 경우, 노드 상에 모든 파드는 노드 컨트롤러에 의해 삭제되도록 스케줄 된다. 기본 축출 타임아웃 기간은 **5분** 이다. 노드에 접근이 불가할 때와 같은 경우, apiserver는 노드 상의 kubelet과 통신이 불가하다. apiserver와의 통신이 재개될 때까지 파드 삭제에 대한 결정은 kubelet에 전해질 수 없다. 그 사이, 삭제되도록 스케줄 되어진 파드는 분할된 노드 상에서 계속 동작할 수도 있다. +ready 컨디션의 상태가 `pod-eviction-timeout` ({{< glossary_tooltip text="kube-controller-manager" term_id="kube-controller-manager" >}}에 전달된 인수) 보다 더 길게 `Unknown` 또는 `False`로 유지되는 경우, 노드 상에 모든 파드는 노드 컨트롤러에 의해 삭제되도록 스케줄 된다. 기본 축출 타임아웃 기간은 **5분** 이다. 노드에 접근이 불가할 때와 같은 경우, apiserver는 노드 상의 kubelet과 통신이 불가하다. apiserver와의 통신이 재개될 때까지 파드 삭제에 대한 결정은 kubelet에 전해질 수 없다. 그 사이, 삭제되도록 스케줄 되어진 파드는 분할된 노드 상에서 계속 동작할 수도 있다. -1.5 이전의 쿠버네티스 버전에서는, 노드 컨트롤러가 apiserver로부터 접근 불가한 이러한 파드를 [강제 삭제](/ko/docs/concepts/workloads/pods/pod/#파드-강제-삭제) -시킬 것이다. 그러나 1.5 이상에서는, 노드 컨트롤러가 클러스터 내 동작 중지된 것을 확신할 때까지는 파드를 +노드 컨트롤러가 클러스터 내 동작 중지된 것을 확신할 때까지는 파드를 강제로 삭제하지 않는다. 파드가 `Terminating` 또는 `Unknown` 상태로 있을 때 접근 불가한 노드 상에서 -동작되고 있는 것을 보게 될 수도 있다. 노드가 영구적으로 클러스터에서 삭제되었는지에 대한 여부를 쿠버네티스가 기반 인프라로부터 유추할 수 없는 경우, -노드가 클러스터를 영구적으로 탈퇴하게 되면, 클러스터 관리자는 손수 노드 오브젝트를 삭제해야 할 수도 있다. 쿠버네티스에서 노드 오브젝트를 삭제하면 -노드 상에서 동작중인 모든 파드 오브젝트가 apiserver로부터 삭제되어 그 이름을 사용할 수 있는 결과를 낳는다. +동작되고 있는 것을 보게 될 수도 있다. 노드가 영구적으로 클러스터에서 삭제되었는지에 +대한 여부를 쿠버네티스가 기반 인프라로부터 유추할 수 없는 경우, 노드가 클러스터를 영구적으로 +탈퇴하게 되면, 클러스터 관리자는 손수 노드 오브젝트를 삭제해야 할 수도 있다. +쿠버네티스에서 노드 오브젝트를 삭제하면 노드 상에서 동작중인 모든 파드 오브젝트가 +apiserver로부터 삭제되어 그 이름을 사용할 수 있는 결과를 낳는다. 노드 수명주기 컨트롤러는 자동으로 컨디션을 나타내는 -[테인트(taints)](/docs/concepts/configuration/taint-and-toleration/)를 생성한다. +[테인트(taints)](/docs/concepts/scheduling-eviction/taint-and-toleration/)를 생성한다. 스케줄러는 파드를 노드에 할당 할 때 노드의 테인트를 고려한다. 또한 파드는 노드의 테인트를 극복(tolerate)할 수 있는 톨러레이션(toleration)을 가질 수 있다. @@ -101,47 +206,10 @@ ready 컨디션의 상태가 `pod-eviction-timeout` ([kube-controller-manager](/ 커널 버전, 쿠버네티스 버전 (kubelet과 kube-proxy 버전), (사용하는 경우) Docker 버전, OS 이름과 같은노드에 대한 일반적인 정보를 보여준다. 이 정보는 Kubelet에 의해 노드로부터 수집된다. -## 관리 - -[파드](/ko/docs/concepts/workloads/pods/pod/)와 [서비스](/ko/docs/concepts/services-networking/service/)와 달리, -노드는 본래 쿠버네티스에 의해 생성되지 않는다. 구글 컴퓨트 엔진과 같은 클라우드 제공사업자에 의해 -외부로부터 생성 되거나, 물리적 또는 가상 머신의 풀 내에서 존재한다. -그래서 쿠버네티스가 노드를 생성할 때, -노드를 나타내는 오브젝트를 생성한다. -생성 이후, 쿠버네티스는 노드의 유효성 여부를 검사한다. 예를 들어, -다음 내용으로 노드를 생성하려 한다면, - -```json -{ - "kind": "Node", - "apiVersion": "v1", - "metadata": { - "name": "10.240.79.157", - "labels": { - "name": "my-first-k8s-node" - } - } -} -``` - -쿠버네티스는 내부적으로 (표현을) 노드 오브젝트를 생성하고, -`metadata.name` 필드를 근거로 상태 체크를 수행하여 노드의 유효성을 확인한다. 노드가 유효하면, 즉 -모든 필요한 서비스가 동작 중이면, 파드를 동작시킬 자격이 된다. 그렇지 않으면, -유효하게 될때까지 어떠한 클러스터 활동에 대해서도 무시된다. -노드 오브젝트의 이름은 유효한 [DNS 서브도메인 이름](/ko/docs/concepts/overview/working-with-objects/names/#dns-서브도메인-이름들)이어야 한다. - -{{< note >}} -쿠버네티스는 유효하지 않은 노드로부터 오브젝트를 보호하고 유효한 상태로 이르는지 확인하기 위해 지속적으로 체크한다. -이러한 프로세스를 중지시키기 위해는 명시적으로 노드 오브젝트를 삭제해야 한다. -{{< /note >}} - -현재, 쿠버네티스 노드 인터페이스와 상호작용 하는 3개의 컴포넌트가 존재하는데, -노드 컨트롤러, kubelet, 그리고 kubectl 이다. - ### 노드 컨트롤러 -노드 컨트롤러는 노드의 다양한 측면을 관리하는 쿠버네티스 -마스터 컴포넌트다. +노드 {{< glossary_tooltip text="컨트롤러" term_id="controller" >}}는 +노드의 다양한 측면을 관리하는 쿠버네티스 컨트롤 플레인 컴포넌트이다. 노드 컨트롤러는 노드가 생성되어 유지되는 동안 다양한 역할을 한다. 첫째는 등록 시점에 (CIDR 할당이 사용토록 설정된 경우) 노드에 CIDR 블럭을 할당하는 것이다. @@ -164,6 +232,7 @@ NodeStatus의 NodeReady 컨디션을 ConditionUnknown으로 업데이트 하는 #### 하트비트 쿠버네티스 노드에서 보내는 하트비트는 노드의 가용성을 결정하는데 도움이 된다. + 하트비트의 두 가지 형태는 `NodeStatus` 와 [리스(Lease) 오브젝트](/docs/reference/generated/kubernetes-api/{{< latest-version >}}/#lease-v1-coordination-k8s-io) 이다. 각 노드에는 `kube-node-lease` 라는 @@ -184,13 +253,7 @@ kubelet은 `NodeStatus` 와 리스 오브젝트를 생성하고 업데이트 할 #### 안정성 -쿠버네티스 1.4에서, 대량의 노드들이 마스터 접근에 -문제를 지닐 경우 (예를 들어 마스터에 네트워크 문제들이 발생했기 때문에) -더 개선된 문제 해결을 하도록 노드 컨트롤러의 로직을 업데이트 했다. 1.4를 시작으로, -노드 컨트롤러는 파드 축출에 대한 결정을 내릴 경우 클러스터 -내 모든 노드를 살핀다. - -대부분의 경우, 노드 컨트롤러는 초당 `--node-eviction-rate`(기본값 0.1)로 + 대부분의 경우, 노드 컨트롤러는 초당 `--node-eviction-rate`(기본값 0.1)로 축출 비율을 제한한다. 이 말은 10초당 1개의 노드를 초과하여 파드 축출을 하지 않는다는 의미가 된다. @@ -216,62 +279,11 @@ kubelet은 `NodeStatus` 와 리스 오브젝트를 생성하고 업데이트 할 이러한 경우, 노드 컨트롤러는 마스터 연결에 문제가 있어 일부 연결이 복원될 때까지 모든 축출을 중지하는 것으로 여긴다. -쿠버네티스 1.6을 시작으로 NodeController는 파드가 taint를 허용하지 않을 때, -`NoExecute` taint 상태의 노드 상에 동작하는 파드 축출에 대한 책임 또한 -지고 있다. 추가로, 기본적으로 비활성화 된 알파 기능으로, NodeController는 노드 접근 불가 -또는 준비 부족과 같은 노드 문제에 상응하는 taint 추가에 대한 책임을 진다. -`NoExecute` taints와 알파 기능에 대한 보다 상세한 -내용은 [이 문서](/docs/concepts/configuration/taint-and-toleration/)를 참고한다. - -1.8 버전을 시작으로, 노드 컨트롤러는 노드 상태를 나타내는 taint 생성에 대한 책임을 지도록 -만들 수 있다. 이는 버전 1.8 의 알파 기능이다. - -### 노드에 대한 자체-등록 - -kubelet 플래그 `--register-node`는 참(기본값)일 경우, kubelet 은 API 서버에 -스스로 등록을 시도할 것이다. 이는 대부분의 배포판에 의해 이용되는, 선호하는 패턴이다. - -자체-등록에 대해, kubelet은 다음 옵션과 함께 시작된다. - - - `--kubeconfig` - apiserver에 스스로 인증하기 위한 자격증명에 대한 경로. - - `--cloud-provider` - 자신에 대한 메터데이터를 읽기 위해 어떻게 클라우드 제공사업자와 소통할지에 대한 방법. - - `--register-node` - 자동으로 API 서버에 등록. - - `--register-with-taints` - 주어진 taint 리스트 (콤마로 분리된 `=:`)를 가진 노드 등록. `register-node`가 거짓이면 동작 안함. - - `--node-ip` - 노드의 IP 주소. - - `--node-labels` - 클러스터 내 노드를 등록할 경우 추가되는 레이블 (1.13+ 에서 [NodeRestriction admission plugin](/docs/reference/access-authn-authz/admission-controllers/#noderestriction)에 의해 강제되는 레이블 제약사항 참고). - - `--node-status-update-frequency` - 얼마나 자주 kubelet이 마스터에 노드 상태를 게시할 지 정의. - -[Node authorization mode](/docs/reference/access-authn-authz/node/)와 -[NodeRestriction admission plugin](/docs/reference/access-authn-authz/admission-controllers/#noderestriction)이 활성화 되면, -kubelets 은 자신의 노드 리소스를 생성/수정할 권한을 가진다. - -#### 수동 노드 관리 - -클러스터 관리자는 노드 오브젝트를 생성하고 수정할 수 있다. - -관리자가 수동으로 오브젝트를 생성하고자 한다면, kubelet 플래그를 -`--register-node=false`로 설정한다. - -관리자는 노드 리소스를 수정할 수 있다(`--register-node`설정과 무관하게). -수정은 노드 상에 레이블 설정과 스케줄 불가 마킹을 포함한다. - -노드 상의 레이블은 스케줄링을 제어하기 위해, -즉 하나의 파드가 오직 노드의 서브셋 상에 동작할 수 있도록 제한하기 위해 노드 셀렉터와 함께 이용될 수 있다. - -노드를 스케줄 불가로 마킹하게 되면, 해당 노드에 새로운 파드가 스케줄되는 것을 막아주지만, -노드 상의 임의의 기존 파드에 대해서는 영향을 미치치 않는다. 이는 노드 리부트 -전이나 기타 등의 준비 조치로 유용하다. 예를 들어, 노드를 스케줄 불가로 -마크하기 위해 다음 명령을 수행한다. - -```shell -kubectl cordon $NODENAME -``` - -{{< note >}} -DaemonSet 컨트롤러에 의해 생성된 파드는 쿠버네티스 스케줄러를 -우회하고 노드 상에 스케줄 불가 속성을 고려하지 않는다. 심지어 리부트를 준비하는 동안 -애플리케이션을 유출시키는 중이라 할지라도 머신 상에 속한 데몬으로 여긴다. -{{< /note >}} +또한, 노드 컨트롤러는 파드가 테인트를 허용하지 않을 때 `NoExecute` 테인트 상태의 +노드에서 동작하는 파드에 대한 축출 책임을 가지고 있다. +추가로, 노드 컨틀로러는 연결할 수 없거나, 준비되지 않은 노드와 같은 노드 문제에 상응하는 +{{< glossary_tooltip text="테인트" term_id="taint" >}}를 추가한다. +이는 스케줄러가 비정상적인 노드에 파드를 배치하지 않게 된다. {{< caution >}} `kubectl cordon` 은 노드를 'unschedulable'로 표기하는데, 이는 @@ -281,34 +293,41 @@ DaemonSet 컨트롤러에 의해 생성된 파드는 쿠버네티스 스케줄 ### 노드 용량 -노드의 용량 (cpu 수와 메모리 양) 은 노드 오브젝트의 한 부분이다. -일반적으로, 노드는 스스로 등록하고 노드 오브젝트를 생성할 때 자신의 용량을 알린다. 만약 -[수동 노드 관리](#수동-노드-관리)를 수행 한다면, 노드를 추가할 때 -노드 용량을 설정해야 한다. +노드 오브젝트는 노드 리소스 용량에 대한 정보(예: 사용 가능한 메모리의 +양과 CPU의 수)를 추적한다. +노드의 [자체 등록](#노드에-대한-자체-등록)은 등록하는 중에 용량을 보고한다. +[수동](#수동-노드-관리)으로 노드를 추가하는 경우 추가할 때 +노드의 용량 정보를 설정해야 한다. -쿠버네티스 스케줄러는 노드 상에 모든 노드에 대해 충분한 리소스가 존재하도록 보장한다. -노드 상에 컨테이너에 대한 요청의 합이 노드 용량보다 더 크지 않도록 체크한다. -kubelet에 의해 구동된 모든 컨테이너를 포함하지만, [컨테이너 런타임](/ko/docs/concepts/overview/components/#컨테이너-런타임)에 의해 직접 구동된 컨테이너 또는 컨테이너 외부에서 동작하는 임의의 프로세스는 해당되지 않는다. +쿠버네티스 {{< glossary_tooltip text="스케줄러" term_id="kube-scheduler" >}}는 +노드 상에 모든 노드에 대해 충분한 리소스가 존재하도록 보장한다. 스케줄러는 노드 상에 +컨테이너에 대한 요청의 합이 노드 용량보다 더 크지 않도록 체크한다. +요청의 합은 kubelet에서 관리하는 모든 컨테이너를 포함하지만, 컨테이너 런타임에 +의해 직접적으로 시작된 컨 테이너는 제외되고 kubelet의 컨트롤 범위 +밖에서 실행되는 모든 프로세스도 제외된다. +{{< note >}} 파드 형태가 아닌 프로세스에 대해 명시적으로 리소스를 확보하려면, -[reserve resources for system daemons](/docs/tasks/administer-cluster/reserve-compute-resources/#system-reserved) 튜토리얼을 따른다. +[시스템 데몬에 사용할 리소스 예약하기](/docs/tasks/administer-cluster/reserve-compute-resources/#system-reserved)을 본다. +{{< /note >}} ## 노드 토폴로지 -{{< feature-state state="alpha" >}} +{{< feature-state state="alpha" for_k8s_version="v1.16" >}} `TopologyManager` [기능 게이트(feature gate)](/docs/reference/command-line-tools-reference/feature-gates/)를 활성화 시켜두면, kubelet이 리소스 할당 결정을 할 때 토폴로지 힌트를 사용할 수 있다. -## API 오브젝트 - -노드는 쿠버네티스 REST API 내 탑-레벨 리소스 이다. API 오브젝트에 대한 -보다 자세한 내용은 -[노드 API 오브젝트](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#node-v1-core)에서 확인할 수 있다. +자세한 내용은 +[노드의 컨트롤 토폴로지 관리 정책](/docs/tasks/administer-cluster/topology-manager/)을 본다. {{% /capture %}} {{% capture whatsnext %}} -* [노드 컴포넌트](/ko/docs/concepts/overview/components/#노드-컴포넌트)에 대해 읽기 -* 노드 수준 토폴로지에 대해 읽기: [노드의 토폴로지 정책 제어하기](/docs/tasks/administer-cluster/topology-manager/) +* 노드를 구성하는 [컴포넌트](/ko/docs/concepts/overview/components/#노드-컴포넌트)에 대해 알아본다. +* [노드에 대한 API 정의](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#node-v1-core)를 읽어본다. +* 아키텍처 디자인 문서의 [노드](https://git.k8s.io/community/contributors/design-proposals/architecture/architecture.md#the-kubernetes-node) + 섹션을 읽어본다. +* [테인트와 톨러레이션](/ko/docs/concepts/configuration/taint-and-toleration/)을 읽어본다. +* [클러스터 오토스케일링](/ko/docs/tasks/administer-cluster/cluster-management/#클러스터-오토스케일링)을 읽어본다. {{% /capture %}} diff --git a/content/ko/docs/concepts/cluster-administration/addons.md b/content/ko/docs/concepts/cluster-administration/addons.md index d4a7ebf9e1..ac66c7baa4 100644 --- a/content/ko/docs/concepts/cluster-administration/addons.md +++ b/content/ko/docs/concepts/cluster-administration/addons.md @@ -30,6 +30,7 @@ content_template: templates/concept * [Flannel](https://github.com/coreos/flannel/blob/master/Documentation/kubernetes.md)은 쿠버네티스와 함께 사용할 수 있는 오버레이 네트워크 제공자이다. * [Knitter](https://github.com/ZTE/Knitter/)는 쿠버네티스 파드에서 여러 네트워크 인터페이스를 지원하는 플러그인이다. * [Multus](https://github.com/Intel-Corp/multus-cni)는 쿠버네티스에서 SRIOV, DPDK, OVS-DPDK 및 VPP 기반 워크로드 외에 모든 CNI 플러그인(예: Calico, Cilium, Contiv, Flannel)을 지원하기 위해 쿠버네티스에서 다중 네트워크 지원을 위한 멀티 플러그인이다. +* [OVN4NFV-K8S-Plugin](https://github.com/opnfv/ovn4nfv-k8s-plugin)은 OVN 기반의 CNI 컨트롤러 플러그인으로 클라우드 네이티브 기반 서비스 기능 체인(Service function chaining(SFC)), 다중 OVN 오버레이 네트워킹, 동적 서브넷 생성, 동적 가상 네트워크 생성, VLAN 공급자 네트워크, 직접 공급자 네트워크와 멀티 클러스터 네트워킹의 엣지 기반 클라우드 등 네이티브 워크로드에 이상적인 멀티 네티워크 플러그인이다. * [NSX-T](https://docs.vmware.com/en/VMware-NSX-T/2.0/nsxt_20_ncp_kubernetes.pdf) 컨테이너 플러그인(NCP)은 VMware NSX-T와 쿠버네티스와 같은 컨테이너 오케스트레이터 간의 통합은 물론 NSX-T와 PKS(Pivotal 컨테이너 서비스) 및 OpenShift와 같은 컨테이너 기반 CaaS/PaaS 플랫폼 간의 통합을 제공한다. * [Nuage](https://github.com/nuagenetworks/nuage-kubernetes/blob/v5.1.1-1/docs/kubernetes-1-installation.rst)는 가시성과 보안 모니터링 기능을 통해 쿠버네티스 파드와 비-쿠버네티스 환경 간에 폴리시 기반 네트워킹을 제공하는 SDN 플랫폼이다. * [Romana](http://romana.io)는 [네트워크폴리시 API](/docs/concepts/services-networking/network-policies/)도 지원하는 파드 네트워크용 Layer 3 네트워킹 솔루션이다. Kubeadm 애드온 설치에 대한 세부 정보는 [여기](https://github.com/romana/romana/tree/master/containerize)에 있다. diff --git a/content/ko/docs/concepts/cluster-administration/cloud-providers.md b/content/ko/docs/concepts/cluster-administration/cloud-providers.md index 7696321645..702dc3a54c 100644 --- a/content/ko/docs/concepts/cluster-administration/cloud-providers.md +++ b/content/ko/docs/concepts/cluster-administration/cloud-providers.md @@ -134,6 +134,15 @@ CloudStack 클라우드 제공자는 쿠버네티스 노드 오브젝트의 이 GCE 클라우드 제공자는 쿠버네티스 노드 오브젝트의 이름으로 노드의 (kubelet에 의해 결정되거나 `--hostname-override` 로 재정의된) 호스트 이름을 사용한다. 참고로 쿠버네티스 노드 이름의 첫 번째 세그먼트는 GCE 인스턴스 이름과 일치해야 한다(예: `kubernetes-node-2.c.my-proj.internal` 이름이 지정된 노드는 `kubernetes-node-2` 이름이 지정된 인스턴스에 해당해야 함). +## HUAWEI 클라우드 + +외부 클라우드 제공자를 사용하려는 경우, 해당 리포지터리는 [kubernetes-sigs/cloud-provider-huaweicloud](https://github.com/kubernetes-sigs/cloud-provider-huaweicloud)이다. + +### 노드 이름 + +HUAWEI 클라우드 제공자는 쿠버네티스 노드 오브젝트의 이름으로 노드의 프라이빗 IP 주소가 필요하다. +노드에서 kubelet을 시작할 때 반드시 `--hostname-override=` 를 사용한다. + ## OpenStack 이 섹션에서는 쿠버네티스와 함께 OpenStack을 사용할 때 사용할 수 있는 모든 구성에 대해 설명한다. @@ -412,3 +421,15 @@ Baidu 클라우드 제공자는 쿠버네티스 노드 오브젝트의 이름으 Tencent 클라우드 제공자는 쿠버네티스 노드 오브젝트의 이름으로 노드의 (kubelet에 의해 결정되거나 `--hostname-override` 로 재정의된) 호스트 이름을 사용한다. 참고로 쿠버네티스 노드 이름은 Tencent VM 프라이빗 IP와 일치해야 한다. + +## Alibaba 클라우드 쿠버네티스 + + 이 외부 클라우드 제공자를 사용하려는 경우, 해당 리포지터리는 [kubernetes/cloud-provider-alibaba-cloud](https://github.com/kubernetes/cloud-provider-alibaba-cloud)이다. + +### 노드 이름 + +Alibaba 클라우드는 노드 이름의 형식을 요구하지는 않지만, kubelet은 `--provider-id=${REGION_ID}.${INSTANCE_ID}` 를 추가해야만 한다. 파라미터 `${REGION_ID}` 는 쿠버네티스의 지역 ID에 해당하고, `${INSTANCE_ID}` 는 Alibaba ECS (Elastic Compute Service) ID를 의미한다. + +### 로드 밸런서 + +[어노테이션](https://www.alibabacloud.com/help/en/doc-detail/86531.htm)을 구성해서 Alibaba 클라우드의 특정 기능을 사용하도록 외부 로드 밸런서를 설정할 수 있다. diff --git a/content/ko/docs/concepts/cluster-administration/networking.md b/content/ko/docs/concepts/cluster-administration/networking.md index 03fccd4364..bdc0981f59 100644 --- a/content/ko/docs/concepts/cluster-administration/networking.md +++ b/content/ko/docs/concepts/cluster-administration/networking.md @@ -260,6 +260,10 @@ Lars Kellogg-Stedman이 제공하는 [이 훌륭한 Multus는 CNI 명세를 구현하는 모든 [레퍼런스 플러그인](https://github.com/containernetworking/plugins)(예: [플라넬](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel), [DHCP](https://github.com/containernetworking/plugins/tree/master/plugins/ipam/dhcp), [Macvlan](https://github.com/containernetworking/plugins/tree/master/plugins/main/macvlan)) 및 써드파티 플러그인(예: [캘리코](https://github.com/projectcalico/cni-plugin), [위브(Weave)](https://github.com/weaveworks/weave), [실리움](https://github.com/cilium/cilium), [콘티브](https://github.com/contiv/netplugin))을 지원한다. 또한, Multus는 쿠버네티스의 클라우드 네이티브 애플리케이션과 NFV 기반 애플리케이션을 통해 쿠버네티스의 [SRIOV](https://github.com/hustcat/sriov-cni), [DPDK](https://github.com/Intel-Corp/sriov-cni), [OVS-DPDK 및 VPP](https://github.com/intel/vhost-user-net-plugin) 워크로드를 지원한다. +### OVN4NFV-K8s-Plugin (OVN 기반의 CNI 컨트롤러 & 플러그인) + +[OVN4NFV-K8S-Plugin](https://github.com/opnfv/ovn4nfv-k8s-plugin)은 OVN 기반의 CNI 컨트롤러 플러그인으로 클라우드 네이티브 기반 서비스 기능 체인(Service function chaining(SFC)), 다중 OVN 오버레이 네트워킹, 동적 서브넷 생성, 동적 가상 네트워크 생성, VLAN 공급자 네트워크, 직접 공급자 네트워크와 멀티 클러스터 네트워킹의 엣지 기반 클라우드 등 네이티브 워크로드에 이상적인 멀티 네티워크 플러그인이다. + ### NSX-T [VMware NSX-T](https://docs.vmware.com/en/VMware-NSX-T/index.html)는 네트워크 가상화 및 보안 플랫폼이다. NSX-T는 멀티 클라우드 및 멀티 하이퍼바이저 환경에 네트워크 가상화를 제공할 수 있으며 이기종 엔드포인트와 기술 스택이 있는 새로운 애플리케이션 프레임워크 및 아키텍처에 중점을 둔다. vSphere 하이퍼바이저 외에도, 이러한 환경에는 KVM, 컨테이너 및 베어메탈과 같은 다른 하이퍼바이저가 포함된다. diff --git a/content/ko/docs/concepts/configuration/configmap.md b/content/ko/docs/concepts/configuration/configmap.md index 8f7292d61c..42beb83ed5 100644 --- a/content/ko/docs/concepts/configuration/configmap.md +++ b/content/ko/docs/concepts/configuration/configmap.md @@ -57,7 +57,7 @@ API [오브젝트](/ko/docs/concepts/overview/working-with-objects/kubernetes-ob apiVersion: v1 kind: ConfigMap metadata: - Name: game-demo + name: game-demo data: # 속성과 비슷한 키; 각 키는 간단한 값으로 매핑됨 player_initial_lives: 3 diff --git a/content/ko/docs/concepts/configuration/manage-resources-containers.md b/content/ko/docs/concepts/configuration/manage-resources-containers.md index 525414a7a9..b54f12a48b 100644 --- a/content/ko/docs/concepts/configuration/manage-resources-containers.md +++ b/content/ko/docs/concepts/configuration/manage-resources-containers.md @@ -321,7 +321,7 @@ Ei, Pi, Ti, Gi, Mi, Ki와 같은 2의 거듭제곱을 사용할 수도 있다. 128974848, 129e6, 129M, 123Mi ``` -다음 예에서, 파드에 두 개의 컨테이너가 있다. 각 컨테이너에는 2GiB의 로컬 임시 스토리지 요청이 있다. 각 컨테이너에는 4GiB의 로컬 임시 스토리지 제한이 있다. 따라서, 파드는 4GiB의 로컬 임시 스토리지 요청과 8GiB 스토리지 제한을 가진다. +다음 예에서, 파드에 두 개의 컨테이너가 있다. 각 컨테이너에는 2GiB의 로컬 임시 스토리지 요청이 있다. 각 컨테이너에는 4GiB의 로컬 임시 스토리지 제한이 있다. 따라서, 파드는 4GiB의 로컬 임시 스토리지 요청과 8GiB 로컬 임시 스토리지 제한을 가진다. ```yaml apiVersion: v1 diff --git a/content/ko/docs/concepts/configuration/pod-priority-preemption.md b/content/ko/docs/concepts/configuration/pod-priority-preemption.md index a69013f5bd..3a6b989c8e 100644 --- a/content/ko/docs/concepts/configuration/pod-priority-preemption.md +++ b/content/ko/docs/concepts/configuration/pod-priority-preemption.md @@ -48,13 +48,6 @@ weight: 70 이들은 일반적인 클래스이며 [중요한(critical) 컴포넌트가 항상 먼저 스케줄링이 되도록 하는 데](/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/) 사용된다. {{< /note >}} -기능을 사용해 본 후 사용하지 않기로 했다면, PodPriority -커맨드-라인 플래그를 제거하거나 `false` 로 설정한 후, API 서버와 -스케줄러를 다시 시작해야 한다. 기능이 비활성화된 후, 기존 파드는 -우선순위 필드를 유지하지만, 선점은 비활성화되며, 우선순위 필드는 -무시된다. 이 기능이 비활성화되면, 새로운 파드에서 `priorityClassName` 을 설정할 수 -없다. - ## 선점을 비활성화하는 방법 {{< caution >}} @@ -117,7 +110,7 @@ disablePreemption: true ### PodPriority와 기존 클러스터에 대한 참고 사항 -- 기존 클러스터를 업그레이드하고 이 기능을 활성화하면, 기존 파드의 +- 이 기능없이 기존 클러스터를 업그레이드 하는 경우, 기존 파드의 우선순위는 사실상 0이다. - `globalDefault` 가 `true` 로 설정된 프라이어리티클래스를 추가해도 기존 파드의 diff --git a/content/ko/docs/concepts/containers/runtime-class.md b/content/ko/docs/concepts/containers/runtime-class.md index eab78a19fb..f1fd42cad6 100644 --- a/content/ko/docs/concepts/containers/runtime-class.md +++ b/content/ko/docs/concepts/containers/runtime-class.md @@ -158,7 +158,7 @@ https://github.com/containerd/cri/blob/master/docs/config.md 노드의 합집합을 취한다. 노드 셀렉터와 톨러레이션 설정에 대해 더 배우려면 -[노드에 파드 할당](/ko/docs/concepts/configuration/assign-pod-node/)을 참고한다. +[노드에 파드 할당](/ko/docs/concepts/scheduling-eviction/assign-pod-node/)을 참고한다. [런타임 클래스 어드미션 컨트롤러]: /docs/reference/access-authn-authz/admission-controllers/#runtimeclass diff --git a/content/ko/docs/concepts/overview/working-with-objects/labels.md b/content/ko/docs/concepts/overview/working-with-objects/labels.md index 7c9983093b..6fa5790a83 100644 --- a/content/ko/docs/concepts/overview/working-with-objects/labels.md +++ b/content/ko/docs/concepts/overview/working-with-objects/labels.md @@ -223,6 +223,6 @@ selector: #### 노드 셋 선택 레이블을 통해 선택하는 사용 사례 중 하나는 파드를 스케줄 할 수 있는 노드 셋을 제한하는 것이다. -자세한 내용은 [노드 선택](/ko/docs/concepts/configuration/assign-pod-node/) 문서를 참조한다. +자세한 내용은 [노드 선택](/ko/docs/concepts/scheduling-eviction/assign-pod-node/) 문서를 참조한다. {{% /capture %}} diff --git a/content/ko/docs/concepts/policy/resource-quotas.md b/content/ko/docs/concepts/policy/resource-quotas.md index 4eeb59b510..d13c6abbc2 100644 --- a/content/ko/docs/concepts/policy/resource-quotas.md +++ b/content/ko/docs/concepts/policy/resource-quotas.md @@ -490,7 +490,8 @@ kubectl create quota test --hard=count/deployments.extensions=2,count/replicaset ``` ```shell -kubectl run nginx --image=nginx --replicas=2 --namespace=myspace +kubectl create deployment nginx --image=nginx --namespace=myspace +kubectl scale deployment nginx --replicas=2 --namespace=myspace ``` ```shell diff --git a/content/ko/docs/concepts/configuration/assign-pod-node.md b/content/ko/docs/concepts/scheduling-eviction/assign-pod-node.md similarity index 98% rename from content/ko/docs/concepts/configuration/assign-pod-node.md rename to content/ko/docs/concepts/scheduling-eviction/assign-pod-node.md index 1d13f2b412..6a5eaf68ec 100644 --- a/content/ko/docs/concepts/configuration/assign-pod-node.md +++ b/content/ko/docs/concepts/scheduling-eviction/assign-pod-node.md @@ -1,400 +1,400 @@ ---- -title: 노드에 파드 할당하기 -content_template: templates/concept -weight: 50 ---- - - -{{% capture overview %}} - -{{< glossary_tooltip text="파드" term_id="pod" >}}를 특정한 {{< glossary_tooltip text="노드(들)" term_id="node" >}}에서만 동작하도록 하거나, -특정 노드들을 선호하도록 제한할 수 있다. -이를 수행하는 방법에는 여러 가지가 있으며, 권장되는 접근 방식은 모두 -[레이블 셀렉터](/ko/docs/concepts/overview/working-with-objects/labels/)를 사용하여 선택한다. -보통 스케줄러가 자동으로 합리적인 배치(예: 노드들에 걸쳐 파드를 분배하거나, -자원이 부족한 노드에 파드를 배치하지 않는 등)를 수행하기에 이런 제약 조건은 필요하지 않지만 -간혹 파드가 배치되는 노드에 대해 더 많은 제어를 원할 수 있는 상황이 있다. -예를 들어 SSD가 장착된 머신에 파드가 연결되도록 하거나 또는 동일한 가용성 영역(availability zone)에서 -많은 것을 통신하는 두 개의 서로 다른 서비스의 파드를 같이 배치할 수 있다. - -{{% /capture %}} - -{{% capture body %}} - -## 노드 셀렉터(nodeSelector) - -`nodeSelector` 는 가장 간단하고 권장되는 노드 선택 제약 조건의 형태이다. -`nodeSelector` 는 PodSpec의 필드이다. 이는 키-값 쌍의 매핑으로 지정한다. 파드가 노드에서 동작할 수 있으려면, -노드는 키-값의 쌍으로 표시되는 레이블을 각자 가지고 있어야 한다(이는 추가 레이블을 가지고 있을 수 있다). -일반적으로 하나의 키-값 쌍이 사용된다. - -`nodeSelector` 를 어떻게 사용하는지 예시를 통해 알아보도록 하자. - -### 0 단계: 사전 준비 - -이 예시는 쿠버네티스 파드에 대한 기본적인 이해를 하고 있고 [쿠버네티스 클러스터가 설정](/ko/docs/setup/)되어 있다고 가정한다. - -### 1 단계: 노드에 레이블 붙이기 - -`kubectl get nodes` 를 실행해서 클러스터 노드 이름을 가져온다. 이 중에 레이블을 추가하기 원하는 것 하나를 선택한 다음에 `kubectl label nodes <노드 이름> <레이블 키>=<레이블 값>` 을 실행해서 선택한 노드에 레이블을 추가한다. 예를 들어 노드의 이름이 'kubernetes-foo-node-1.c.a-robinson.internal' 이고, 원하는 레이블이 'disktype=ssd' 라면, `kubectl label nodes kubernetes-foo-node-1.c.a-robinson.internal disktype=ssd` 를 실행한다. - -`kubectl get nodes --show-labels` 를 다시 실행해서 노드가 현재 가진 레이블을 확인하여, 이 작업을 검증할 수 있다. 또한 `kubectl describe node "노드 이름"` 을 사용해서 노드에 주어진 레이블의 전체 목록을 확인할 수 있다. - -### 2 단계: 파드 설정에 nodeSelector 필드 추가하기 - -실행하고자 하는 파드의 설정 파일을 가져오고, 이처럼 nodeSelector 섹션을 추가한다. 예를 들어 이것이 파드 설정이라면, - -```yaml -apiVersion: v1 -kind: Pod -metadata: - name: nginx - labels: - env: test -spec: - containers: - - name: nginx - image: nginx -``` - -이 다음에 nodeSelector 를 다음과 같이 추가한다. - -{{< codenew file="pods/pod-nginx.yaml" >}} - -그런 다음에 `kubectl apply -f https://k8s.io/examples/pods/pod-nginx.yaml` 을 -실행하면, 레이블이 붙여진 노드에 파드가 스케줄 된다. -`kubectl get pods -o wide` 를 실행해서 파드가 할당된 -"NODE" 를 보면 작동하는지 검증할 수 있다. - -## 넘어가기 전에: 내장 노드 레이블들 {#built-in-node-labels} - -[붙인](#1-단계-노드에-레이블-붙이기) 레이블뿐만 아니라, 노드에는 -표준 레이블 셋이 미리 채워져 있다. 이 레이블들은 다음과 같다. - -* [`kubernetes.io/hostname`](/docs/reference/kubernetes-api/labels-annotations-taints/#kubernetes-io-hostname) -* [`failure-domain.beta.kubernetes.io/zone`](/docs/reference/kubernetes-api/labels-annotations-taints/#failure-domainbetakubernetesiozone) -* [`failure-domain.beta.kubernetes.io/region`](/docs/reference/kubernetes-api/labels-annotations-taints/#failure-domainbetakubernetesioregion) -* [`topology.kubernetes.io/zone`](/docs/reference/kubernetes-api/labels-annotations-taints/#topologykubernetesiozone) -* [`topology.kubernetes.io/region`](/docs/reference/kubernetes-api/labels-annotations-taints/#topologykubernetesiozone) -* [`beta.kubernetes.io/instance-type`](/docs/reference/kubernetes-api/labels-annotations-taints/#beta-kubernetes-io-instance-type) -* [`node.kubernetes.io/instance-type`](/docs/reference/kubernetes-api/labels-annotations-taints/#nodekubernetesioinstance-type) -* [`kubernetes.io/os`](/docs/reference/kubernetes-api/labels-annotations-taints/#kubernetes-io-os) -* [`kubernetes.io/arch`](/docs/reference/kubernetes-api/labels-annotations-taints/#kubernetes-io-arch) - -{{< note >}} -이 레이블들의 값은 클라우드 공급자에 따라 다르고 신뢰성이 보장되지 않는다. -예를 들어 `kubernetes.io/hostname` 은 어떤 환경에서는 노드 이름과 같지만, -다른 환경에서는 다른 값일 수 있다. -{{< /note >}} - -## 노드 격리(isolation)/제한(restriction) - -노드 오브젝트에 레이블을 추가하면 파드가 특정 노드 또는 노드 그룹을 목표 대상으로 할 수 있게 된다. -이는 특정 파드가 어떤 격리, 보안, 또는 규제 속성이 있는 노드에서만 실행되도록 사용할 수 있다. -이 목적으로 레이블을 사용하는 경우, 노드에서 kubelet 프로세스로 수정할 수 없는 레이블 키를 선택하는 것을 권장한다. -이렇게 하면 손상된 노드가 해당 kubelet 자격 증명을 사용해서 해당 레이블을 자체 노드 오브젝트에 설정하고, -스케줄러가 손상된 노드로 워크로드를 스케줄 하는 것을 방지할 수 있다. - -`NodeRestriction` 어드미션 플러그인은 kubelet이 `node-restriction.kubernetes.io/` 접두사로 레이블을 설정 또는 수정하지 못하게 한다. -노드 격리에 해당 레이블 접두사를 사용하려면 다음과 같이 한다. - -1. [노드 권한부여자](/docs/reference/access-authn-authz/node/)를 사용하고 있고, [NodeRestriction 어드미션 플러그인](/docs/reference/access-authn-authz/admission-controllers/#noderestriction)을 _활성화_ 해야 한다. -2. 노드 오브젝트의 `node-restriction.kubernetes.io/` 접두사 아래에 레이블을 추가하고, 해당 레이블을 노드 셀렉터에서 사용한다. -예를 들어, `example.com.node-restriction.kubernetes.io/fips=true` 또는 `example.com.node-restriction.kubernetes.io/pci-dss=true` 이다. - -## 어피니티(affinity)와 안티-어피니티(anti-affinity) - -`nodeSelector` 는 파드를 특정 레이블이 있는 노드로 제한하는 매우 간단한 방법을 제공한다. -어피니티/안티-어피니티 기능은 표현할 수 있는 제약 종류를 크게 확장한다. 주요 개선 사항은 다음과 같다. - -1. 어피니티/안티-어피니티 언어가 더 표현적이다. 언어는 논리 연산자인 AND 연산으로 작성된 - 정확한 매칭 항목 이외에 더 많은 매칭 규칙을 제공한다. -2. 규칙이 엄격한 요구 사항이 아니라 "유연한(soft)"/"선호(preference)" 규칙을 나타낼 수 있기에 스케줄러가 규칙을 만족할 수 없더라도, - 파드가 계속 스케줄 되도록 한다. -3. 노드 자체에 레이블을 붙이기보다는 노드(또는 다른 토폴로지 도메인)에서 실행 중인 다른 파드의 레이블을 제한할 수 있다. - 이를 통해 어떤 파드가 함께 위치할 수 있는지와 없는지에 대한 규칙을 적용할 수 있다. - -어피니티 기능은 "노드 어피니티" 와 "파드 간 어피니티/안티-어피니티" 두 종류의 어피니티로 구성된다. -노드 어피니티는 기존 `nodeSelector` 와 비슷하지만(그러나 위에서 나열된 첫째와 두 번째 이점이 있다.), -파드 간 어피니티/안티-어피니티는 위에서 나열된 세번째 항목에 설명된 대로 -노드 레이블이 아닌 파드 레이블에 대해 제한되고 위에서 나열된 첫 번째와 두 번째 속성을 가진다. - -### 노드 어피니티 - -노드 어피니티는 개념적으로 `nodeSelector` 와 비슷하다 -- 이는 노드의 레이블을 기반으로 파드를 -스케줄할 수 있는 노드를 제한할 수 있다. - -여기에 현재 `requiredDuringSchedulingIgnoredDuringExecution` 와 `preferredDuringSchedulingIgnoredDuringExecution` 로 부르는 -두 가지 종류의 노드 어피니티가 있다. 전자는 파드가 노드에 스케줄 되도록 *반드시* -규칙을 만족해야 하는 것(`nodeSelector` 와 같으나 보다 표현적인 구문을 사용해서)을 지정하고, -후자는 스케줄러가 시도하려고는 하지만, 보증하지 않는 *선호(preferences)* 를 지정한다는 점에서 -이를 각각 "엄격함(hard)" 과 "유연함(soft)" 으로 생각할 수 있다. -이름의 "IgnoredDuringExecution" 부분은 `nodeSelector` 작동 방식과 유사하게 노드의 -레이블이 런타임 중에 변경되어 파드의 어피니티 규칙이 더 이상 충족되지 않으면 파드가 여전히 그 노드에서 -동작한다는 의미이다. 향후에는 파드의 노드 어피니티 요구 사항을 충족하지 않는 노드에서 파드를 제거한다는 -점을 제외하고는 `preferredDuringSchedulingIgnoredDuringExecution` 와 같은 `requiredDuringSchedulingIgnoredDuringExecution` 를 제공할 계획이다. - -따라서 `requiredDuringSchedulingIgnoredDuringExecution` 의 예로는 "인텔 CPU가 있는 노드에서만 파드 실행"이 -될 수 있고, `preferredDuringSchedulingIgnoredDuringExecution` 의 예로는 "장애 조치 영역 XYZ에 파드 집합을 실행하려고 -하지만, 불가능하다면 다른 곳에서 일부를 실행하도록 허용"이 있을 것이다. - -노드 어피니티는 PodSpec의 `affinity` 필드의 `nodeAffinity` 필드에서 지정된다. - -여기에 노드 어피니티를 사용하는 파드 예시가 있다. - -{{< codenew file="pods/pod-with-node-affinity.yaml" >}} - -이 노드 어피니티 규칙은 키가 `kubernetes.io/e2e-az-name` 이고 값이 `e2e-az1` 또는 `e2e-az2` 인 -레이블이 있는 노드에만 파드를 배치할 수 있다고 말한다. 또한, 이 기준을 충족하는 노드들 -중에서 키가 `another-node-label-key` 이고 값이 `another-node-label-value` 인 레이블이 있는 노드를 -선호하도록 한다. - -예시에서 연산자 `In` 이 사용되고 있는 것을 볼 수 있다. 새로운 노드 어피니티 구문은 다음의 연산자들을 지원한다. `In`, `NotIn`, `Exists`, `DoesNotExist`, `Gt`, `Lt`. -`NotIn` 과 `DoesNotExist` 를 사용해서 안티-어피니티를 수행하거나, -특정 노드에서 파드를 쫓아내는 [노드 테인트(taint)](/docs/concepts/configuration/taint-and-toleration/)를 설정할 수 있다. - -`nodeSelector` 와 `nodeAffinity` 를 모두 지정한다면 파드가 후보 노드에 스케줄 되기 위해서는 -*둘 다* 반드시 만족해야 한다. - -`nodeAffinity` 유형과 연관된 `nodeSelectorTerms` 를 지정하면, 파드는 `nodeSelectorTerms` 를 **모두** 만족하는 노드에만 스케줄할 수 있다. - -`nodeSelectorTerms` 와 연관된 여러 `matchExpressions` 를 지정하면, 파드는 `matchExpressions` 이 지정된 것 중 **한 가지**라도 만족하는 노드에만 스케줄할 수 있다. - -파드가 스케줄 된 노드의 레이블을 지우거나 변경해도 파드는 제거되지 않는다. 다시 말해서 어피니티 선택은 파드를 스케줄링 하는 시점에만 작동한다. - -`preferredDuringSchedulingIgnoredDuringExecution` 의 `weight` 필드의 범위는 1-100이다. 모든 스케줄링 요구 사항 (리소스 요청, RequiredDuringScheduling 어피니티 표현식 등)을 만족하는 각 노드들에 대해 스케줄러는 이 필드의 요소들을 반복해서 합계를 계산하고 노드가 MatchExpressions 에 일치하는 경우 합계에 "가중치(weight)"를 추가한다. 이후에 이 점수는 노드에 대한 다른 우선순위 함수의 점수와 합쳐진다. 전체 점수가 가장 높은 노드를 가장 선호한다. - -### 파드간 어피니티와 안티-어피니티 - -파드간 어피니티와 안티-어피니티를 사용하면 노드의 레이블을 기반으로 하지 않고, *노드에서 이미 실행 중인 파드 레이블을 기반으로* -파드가 스케줄될 수 있는 노드를 제한할 수 있다. 규칙은 "X가 규칙 Y를 충족하는 하나 이상의 파드를 이미 실행중인 경우 -이 파드는 X에서 실행해야 한다(또는 안티-어피니티가 없는 경우에는 동작하면 안된다)"는 형태이다. Y는 -선택적으로 연관된 네임스페이스 목록을 가진 LabelSelector로 표현된다. 노드와는 다르게 파드는 네임스페이스이기에 -(그리고 따라서 파드의 레이블은 암암리에 네임스페이스이다) 파드 레이블위의 레이블 셀렉터는 반드시 -셀렉터가 적용될 네임스페이스를 지정해야만 한다. 개념적으로 X는 노드, 랙, -클라우드 공급자 영역, 클라우드 공급자 지역 등과 같은 토폴로지 도메인이다. 시스템이 이런 토폴로지 -도메인을 나타내는 데 사용하는 노드 레이블 키인 `topologyKey` 를 사용하여 이를 표현한다. -예: [넘어가기 전에: 빌트인 노드 레이블](#built-in-node-labels) 섹션 위에 나열된 레이블 키를 본다. - -{{< note >}} -파드간 어피니티와 안티-어피니티에는 상당한 양의 프로세싱이 필요하기에 -대규모 클러스터에서는 스케줄링 속도가 크게 느려질 수 있다. -수백 개의 노드를 넘어가는 클러스터에서 이를 사용하는 것은 추천하지 않는다. -{{< /note >}} - -{{< note >}} -파드 안티-어피니티에서는 노드에 일관된 레이블을 지정해야 한다. 즉, 클러스터의 모든 노드는 `topologyKey` 와 매칭되는 적절한 레이블을 가지고 있어야 한다. 일부 또는 모든 노드에 지정된 `topologyKey` 레이블이 없는 경우에는 의도하지 않은 동작이 발생할 수 있다. -{{< /note >}} - -노드 어피니티와 마찬가지로 현재 파드 어피니티와 안티-어피니티로 부르는 "엄격함" 대 "유연함"의 요구사항을 나타내는 `requiredDuringSchedulingIgnoredDuringExecution` 와 -`preferredDuringSchedulingIgnoredDuringExecution` 두 가지 종류가 있다. -앞의 노드 어피니티 섹션의 설명을 본다. -`requiredDuringSchedulingIgnoredDuringExecution` 어피니티의 예시는 -"서로 많은 통신을 하기 때문에 서비스 A와 서비스 B를 같은 영역에 함께 위치시키는 것"이고, -`preferredDuringSchedulingIgnoredDuringExecution` 안티-어피니티의 예시는 "서비스를 여러 영역에 걸쳐서 분배하는 것"이다 -(엄격한 요구사항은 영역보다 파드가 더 많을 수 있기 때문에 엄격한 요구사항은 의미가 없다). - -파드간 어피니티는 PodSpec에서 `affinity` 필드 중 `podAffinity` 필드로 지정한다. -그리고 파드간 안티-어피니티는 PodSpec에서 `affinity` 필드 중 `podAntiAffinity` 필드로 지정한다. - -#### 파드 어피니티를 사용하는 파드의 예시 - -{{< codenew file="pods/pod-with-pod-affinity.yaml" >}} - -이 파드의 어피니티는 하나의 파드 어피니티 규칙과 하나의 파드 안티-어피니티 규칙을 정의한다. -이 예시에서 `podAffinity` 는 `requiredDuringSchedulingIgnoredDuringExecution` 이고 `podAntiAffinity` 는 -`preferredDuringSchedulingIgnoredDuringExecution` 이다. 파드 어피니티 규칙에 의하면 키 "security" 와 값 -"S1"인 레이블이 있는 하나 이상의 이미 실행 중인 파드와 동일한 영역에 있는 경우에만 파드를 노드에 스케줄할 수 있다. -(보다 정확하게는, 클러스터에 키 "security"와 값 "S1"인 레이블을 가지고 있는 실행 중인 파드가 있는 키 -`failure-domain.beta.kubernetes.io/zone` 와 값 V인 노드가 최소 하나 이상 있고, 노드 N이 키 -`failure-domain.beta.kubernetes.io/zone` 와 일부 값이 V인 레이블을 가진다면 파드는 노드 N에서 실행할 수 있다.) -파드 안티-어피니티 규칙에 의하면 노드가 이미 키 "security"와 값 "S2"인 레이블을 가진 파드를 -실행하고 있는 파드는 노드에 스케줄되는 것을 선호하지 않는다. -(만약 `topologyKey` 가 `failure-domain.beta.kubernetes.io/zone` 라면 노드가 키 -"security"와 값 "S2"를 레이블로 가진 파드와 -동일한 영역에 있는 경우, 노드에 파드를 예약할 수 없음을 의미한다.) -[디자인 문서](https://git.k8s.io/community/contributors/design-proposals/scheduling/podaffinity.md)를 통해 -`requiredDuringSchedulingIgnoredDuringExecution` 와 `preferredDuringSchedulingIgnoredDuringExecution` 의 -파드 어피니티와 안티-어피니티에 대한 많은 예시를 맛볼 수 있다. - -파드 어피니티와 안티-어피니티의 적합한 연산자는 `In`, `NotIn`, `Exists`, `DoesNotExist` 이다. - -원칙적으로, `topologyKey` 는 적법한 어느 레이블-키도 될 수 있다. -하지만, 성능과 보안상의 이유로 topologyKey에는 몇 가지 제약조건이 있다. - -1. 어피니티와 `requiredDuringSchedulingIgnoredDuringExecution` 파드 안티-어피니티는 대해 -`topologyKey` 가 비어있는 것을 허용하지 않는다. -2. `requiredDuringSchedulingIgnoredDuringExecution` 파드 안티-어피니티에서 `topologyKey` 를 `kubernetes.io/hostname` 로 제한하기 위해 어드미션 컨트롤러 `LimitPodHardAntiAffinityTopology` 가 도입되었다. 사용자 지정 토폴로지를에 사용할 수 있도록 하려면, 어드미션 컨트롤러를 수정하거나 간단히 이를 비활성화 할 수 있다. -3. `preferredDuringSchedulingIgnoredDuringExecution` 파드 안티-어피니티는 `topologyKey` 가 비어있는 것을 허용하지 않는다. -4. 위의 경우를 제외하고, `topologyKey` 는 적법한 어느 레이블-키도 가능하다. - -`labelSelector` 와 `topologyKey` 외에도 `labelSelector` 와 일치해야 하는 네임스페이스 목록 `namespaces` 를 -선택적으로 지정할 수 있다(이것은 `labelSelector` 와 `topologyKey` 와 같은 수준의 정의이다). -생략되어있거나 비어있을 경우 어피니티/안티-어피니티 정의가 있는 파드의 네임스페이스가 기본 값이다. - -파드를 노드에 스케줄하려면 `requiredDuringSchedulingIgnoredDuringExecution` 어피니티와 안티-어피니티와 -연관된 `matchExpressions` 가 모두 충족되어야 한다. - -#### 더 실용적인 유스케이스 - -파드간 어피니티와 안티-어피니티는 레플리카셋, 스테이트풀셋, 디플로이먼트 등과 같은 -상위 레벨 모음과 함께 사용할 때 더욱 유용할 수 있다. 워크로드 집합이 동일한 노드와 같이 -동일하게 정의된 토폴로지와 같은 위치에 배치되도록 쉽게 구성할 수 있다. - -##### 항상 같은 노드에 위치시키기 - -세 개의 노드가 있는 클러스터에서 웹 애플리케이션에는 redis와 같은 인-메모리 캐시가 있다. 웹 서버가 가능한 캐시와 함께 위치하기를 원한다. - -다음은 세 개의 레플리카와 셀렉터 레이블이 `app=store` 가 있는 간단한 redis 디플로이먼트의 yaml 스니펫이다. 디플로이먼트에는 스케줄러가 단일 노드에서 레플리카를 함께 배치하지 않도록 `PodAntiAffinity` 가 구성되어 있다. - -```yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: redis-cache -spec: - selector: - matchLabels: - app: store - replicas: 3 - template: - metadata: - labels: - app: store - spec: - affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: app - operator: In - values: - - store - topologyKey: "kubernetes.io/hostname" - containers: - - name: redis-server - image: redis:3.2-alpine -``` - -아래 yaml 스니펫의 웹서버 디플로이먼트는 `podAntiAffinity` 와 `podAffinity` 설정을 가지고 있다. 이렇게 하면 스케줄러에 모든 레플리카는 셀렉터 레이블이 `app=store` 인 파드와 함께 위치해야 한다. 또한 각 웹 서버 레플리카가 단일 노드의 같은 위치에 있지 않도록 한다. - -```yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: web-server -spec: - selector: - matchLabels: - app: web-store - replicas: 3 - template: - metadata: - labels: - app: web-store - spec: - affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: app - operator: In - values: - - web-store - topologyKey: "kubernetes.io/hostname" - podAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: app - operator: In - values: - - store - topologyKey: "kubernetes.io/hostname" - containers: - - name: web-app - image: nginx:1.16-alpine -``` - -만약 위의 두 디플로이먼트를 생성하면 세 개의 노드가 있는 클러스터는 다음과 같아야 한다. - -| node-1 | node-2 | node-3 | -|:--------------------:|:-------------------:|:------------------:| -| *webserver-1* | *webserver-2* | *webserver-3* | -| *cache-1* | *cache-2* | *cache-3* | - -여기서 볼 수 있듯이 `web-server` 의 세 레플리카들이 기대했던 것처럼 자동으로 캐시와 함께 위치하게 된다. - -``` -kubectl get pods -o wide -``` -출력은 다음과 유사할 것이다. -``` -NAME READY STATUS RESTARTS AGE IP NODE -redis-cache-1450370735-6dzlj 1/1 Running 0 8m 10.192.4.2 kube-node-3 -redis-cache-1450370735-j2j96 1/1 Running 0 8m 10.192.2.2 kube-node-1 -redis-cache-1450370735-z73mh 1/1 Running 0 8m 10.192.3.1 kube-node-2 -web-server-1287567482-5d4dz 1/1 Running 0 7m 10.192.2.3 kube-node-1 -web-server-1287567482-6f7v5 1/1 Running 0 7m 10.192.4.3 kube-node-3 -web-server-1287567482-s330j 1/1 Running 0 7m 10.192.3.2 kube-node-2 -``` - -##### 절대 동일한 노드에 위치시키지 않게 하기 - -위의 예시에서 `topologyKey:"kubernetes.io/hostname"` 과 함께 `PodAntiAffinity` 규칙을 사용해서 -두 개의 인스터스가 동일한 호스트에 있지 않도록 redis 클러스터를 배포한다. -같은 기술을 사용해서 고 가용성을 위해 안티-어피니티로 구성된 스테이트풀셋의 예시는 -[ZooKeeper 튜토리얼](/ko/docs/tutorials/stateful-application/zookeeper/#노드-실패-방지)을 본다. - -## nodeName - -`nodeName` 은 가장 간단한 형태의 노트 선택 제약 조건이지만, -한계로 인해 일반적으로는 사용하지 않는다. -`nodeName` 은 PodSpec의 필드이다. 만약 비어있지 않으면, 스케줄러는 -파드를 무시하고 명명된 노드에서 실행 중인 kubelet이 -파드를 실행하려고 한다. 따라서 만약 PodSpec에 `nodeName` 가 -제공된 경우, 노드 선텍을 위해 위의 방법보다 우선한다. - -`nodeName` 을 사용해서 노드를 선택할 때의 몇 가지 제한은 다음과 같다. - -- 만약 명명된 노드가 없으면, 파드가 실행되지 않고 - 따라서 자동으로 삭제될 수 있다. -- 만약 명명된 노드에 파드를 수용할 수 있는 - 리소스가 없는 경우 파드가 실패하고, 그 이유는 다음과 같이 표시된다. - 예: OutOfmemory 또는 OutOfcpu. -- 클라우드 환경의 노드 이름은 항상 예측 가능하거나 - 안정적인 것은 아니다. - -여기에 `nodeName` 필드를 사용하는 파드 설정 파일 예시가 있다. - -```yaml -apiVersion: v1 -kind: Pod -metadata: - name: nginx -spec: - containers: - - name: nginx - image: nginx - nodeName: kube-01 -``` - -위 파드는 kube-01 노드에서 실행될 것이다. - -{{% /capture %}} - -{{% capture whatsnext %}} - -[테인트](/docs/concepts/configuration/taint-and-toleration/)는 노드가 특정 파드들을 *쫓아내게* 할 수 있다. - -[노드 어피니티](https://git.k8s.io/community/contributors/design-proposals/scheduling/nodeaffinity.md)와 -[파드간 어피니티/안티-어피니티](https://git.k8s.io/community/contributors/design-proposals/scheduling/podaffinity.md)에 대한 디자인 문서에는 -이러한 기능에 대한 추가 배경 정보가 있다. - -파드가 노드에 할당되면 kubelet은 파드를 실행하고 노드의 로컬 리소스를 할당한다. -[토폴로지 매니저](/docs/tasks/administer-cluster/topology-manager/)는 -노드 수준의 리소스 할당 결정에 참여할 수 있다. - -{{% /capture %}} +--- +title: 노드에 파드 할당하기 +content_template: templates/concept +weight: 50 +--- + + +{{% capture overview %}} + +{{< glossary_tooltip text="파드" term_id="pod" >}}를 특정한 {{< glossary_tooltip text="노드(들)" term_id="node" >}}에서만 동작하도록 하거나, +특정 노드들을 선호하도록 제한할 수 있다. +이를 수행하는 방법에는 여러 가지가 있으며, 권장되는 접근 방식은 모두 +[레이블 셀렉터](/ko/docs/concepts/overview/working-with-objects/labels/)를 사용하여 선택한다. +보통 스케줄러가 자동으로 합리적인 배치(예: 노드들에 걸쳐 파드를 분배하거나, +자원이 부족한 노드에 파드를 배치하지 않는 등)를 수행하기에 이런 제약 조건은 필요하지 않지만 +간혹 파드가 배치되는 노드에 대해 더 많은 제어를 원할 수 있는 상황이 있다. +예를 들어 SSD가 장착된 머신에 파드가 연결되도록 하거나 또는 동일한 가용성 영역(availability zone)에서 +많은 것을 통신하는 두 개의 서로 다른 서비스의 파드를 같이 배치할 수 있다. + +{{% /capture %}} + +{{% capture body %}} + +## 노드 셀렉터(nodeSelector) + +`nodeSelector` 는 가장 간단하고 권장되는 노드 선택 제약 조건의 형태이다. +`nodeSelector` 는 PodSpec의 필드이다. 이는 키-값 쌍의 매핑으로 지정한다. 파드가 노드에서 동작할 수 있으려면, +노드는 키-값의 쌍으로 표시되는 레이블을 각자 가지고 있어야 한다(이는 추가 레이블을 가지고 있을 수 있다). +일반적으로 하나의 키-값 쌍이 사용된다. + +`nodeSelector` 를 어떻게 사용하는지 예시를 통해 알아보도록 하자. + +### 0 단계: 사전 준비 + +이 예시는 쿠버네티스 파드에 대한 기본적인 이해를 하고 있고 [쿠버네티스 클러스터가 설정](/ko/docs/setup/)되어 있다고 가정한다. + +### 1 단계: 노드에 레이블 붙이기 + +`kubectl get nodes` 를 실행해서 클러스터 노드 이름을 가져온다. 이 중에 레이블을 추가하기 원하는 것 하나를 선택한 다음에 `kubectl label nodes <노드 이름> <레이블 키>=<레이블 값>` 을 실행해서 선택한 노드에 레이블을 추가한다. 예를 들어 노드의 이름이 'kubernetes-foo-node-1.c.a-robinson.internal' 이고, 원하는 레이블이 'disktype=ssd' 라면, `kubectl label nodes kubernetes-foo-node-1.c.a-robinson.internal disktype=ssd` 를 실행한다. + +`kubectl get nodes --show-labels` 를 다시 실행해서 노드가 현재 가진 레이블을 확인하여, 이 작업을 검증할 수 있다. 또한 `kubectl describe node "노드 이름"` 을 사용해서 노드에 주어진 레이블의 전체 목록을 확인할 수 있다. + +### 2 단계: 파드 설정에 nodeSelector 필드 추가하기 + +실행하고자 하는 파드의 설정 파일을 가져오고, 이처럼 nodeSelector 섹션을 추가한다. 예를 들어 이것이 파드 설정이라면, + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: nginx + labels: + env: test +spec: + containers: + - name: nginx + image: nginx +``` + +이 다음에 nodeSelector 를 다음과 같이 추가한다. + +{{< codenew file="pods/pod-nginx.yaml" >}} + +그런 다음에 `kubectl apply -f https://k8s.io/examples/pods/pod-nginx.yaml` 을 +실행하면, 레이블이 붙여진 노드에 파드가 스케줄 된다. +`kubectl get pods -o wide` 를 실행해서 파드가 할당된 +"NODE" 를 보면 작동하는지 검증할 수 있다. + +## 넘어가기 전에: 내장 노드 레이블들 {#built-in-node-labels} + +[붙인](#1-단계-노드에-레이블-붙이기) 레이블뿐만 아니라, 노드에는 +표준 레이블 셋이 미리 채워져 있다. 이 레이블들은 다음과 같다. + +* [`kubernetes.io/hostname`](/docs/reference/kubernetes-api/labels-annotations-taints/#kubernetes-io-hostname) +* [`failure-domain.beta.kubernetes.io/zone`](/docs/reference/kubernetes-api/labels-annotations-taints/#failure-domainbetakubernetesiozone) +* [`failure-domain.beta.kubernetes.io/region`](/docs/reference/kubernetes-api/labels-annotations-taints/#failure-domainbetakubernetesioregion) +* [`topology.kubernetes.io/zone`](/docs/reference/kubernetes-api/labels-annotations-taints/#topologykubernetesiozone) +* [`topology.kubernetes.io/region`](/docs/reference/kubernetes-api/labels-annotations-taints/#topologykubernetesiozone) +* [`beta.kubernetes.io/instance-type`](/docs/reference/kubernetes-api/labels-annotations-taints/#beta-kubernetes-io-instance-type) +* [`node.kubernetes.io/instance-type`](/docs/reference/kubernetes-api/labels-annotations-taints/#nodekubernetesioinstance-type) +* [`kubernetes.io/os`](/docs/reference/kubernetes-api/labels-annotations-taints/#kubernetes-io-os) +* [`kubernetes.io/arch`](/docs/reference/kubernetes-api/labels-annotations-taints/#kubernetes-io-arch) + +{{< note >}} +이 레이블들의 값은 클라우드 공급자에 따라 다르고 신뢰성이 보장되지 않는다. +예를 들어 `kubernetes.io/hostname` 은 어떤 환경에서는 노드 이름과 같지만, +다른 환경에서는 다른 값일 수 있다. +{{< /note >}} + +## 노드 격리(isolation)/제한(restriction) + +노드 오브젝트에 레이블을 추가하면 파드가 특정 노드 또는 노드 그룹을 목표 대상으로 할 수 있게 된다. +이는 특정 파드가 어떤 격리, 보안, 또는 규제 속성이 있는 노드에서만 실행되도록 사용할 수 있다. +이 목적으로 레이블을 사용하는 경우, 노드에서 kubelet 프로세스로 수정할 수 없는 레이블 키를 선택하는 것을 권장한다. +이렇게 하면 손상된 노드가 해당 kubelet 자격 증명을 사용해서 해당 레이블을 자체 노드 오브젝트에 설정하고, +스케줄러가 손상된 노드로 워크로드를 스케줄 하는 것을 방지할 수 있다. + +`NodeRestriction` 어드미션 플러그인은 kubelet이 `node-restriction.kubernetes.io/` 접두사로 레이블을 설정 또는 수정하지 못하게 한다. +노드 격리에 해당 레이블 접두사를 사용하려면 다음과 같이 한다. + +1. [노드 권한부여자](/docs/reference/access-authn-authz/node/)를 사용하고 있고, [NodeRestriction 어드미션 플러그인](/docs/reference/access-authn-authz/admission-controllers/#noderestriction)을 _활성화_ 해야 한다. +2. 노드 오브젝트의 `node-restriction.kubernetes.io/` 접두사 아래에 레이블을 추가하고, 해당 레이블을 노드 셀렉터에서 사용한다. +예를 들어, `example.com.node-restriction.kubernetes.io/fips=true` 또는 `example.com.node-restriction.kubernetes.io/pci-dss=true` 이다. + +## 어피니티(affinity)와 안티-어피니티(anti-affinity) + +`nodeSelector` 는 파드를 특정 레이블이 있는 노드로 제한하는 매우 간단한 방법을 제공한다. +어피니티/안티-어피니티 기능은 표현할 수 있는 제약 종류를 크게 확장한다. 주요 개선 사항은 다음과 같다. + +1. 어피니티/안티-어피니티 언어가 더 표현적이다. 언어는 논리 연산자인 AND 연산으로 작성된 + 정확한 매칭 항목 이외에 더 많은 매칭 규칙을 제공한다. +2. 규칙이 엄격한 요구 사항이 아니라 "유연한(soft)"/"선호(preference)" 규칙을 나타낼 수 있기에 스케줄러가 규칙을 만족할 수 없더라도, + 파드가 계속 스케줄 되도록 한다. +3. 노드 자체에 레이블을 붙이기보다는 노드(또는 다른 토폴로지 도메인)에서 실행 중인 다른 파드의 레이블을 제한할 수 있다. + 이를 통해 어떤 파드가 함께 위치할 수 있는지와 없는지에 대한 규칙을 적용할 수 있다. + +어피니티 기능은 "노드 어피니티" 와 "파드 간 어피니티/안티-어피니티" 두 종류의 어피니티로 구성된다. +노드 어피니티는 기존 `nodeSelector` 와 비슷하지만(그러나 위에서 나열된 첫째와 두 번째 이점이 있다.), +파드 간 어피니티/안티-어피니티는 위에서 나열된 세번째 항목에 설명된 대로 +노드 레이블이 아닌 파드 레이블에 대해 제한되고 위에서 나열된 첫 번째와 두 번째 속성을 가진다. + +### 노드 어피니티 + +노드 어피니티는 개념적으로 `nodeSelector` 와 비슷하다 -- 이는 노드의 레이블을 기반으로 파드를 +스케줄할 수 있는 노드를 제한할 수 있다. + +여기에 현재 `requiredDuringSchedulingIgnoredDuringExecution` 와 `preferredDuringSchedulingIgnoredDuringExecution` 로 부르는 +두 가지 종류의 노드 어피니티가 있다. 전자는 파드가 노드에 스케줄 되도록 *반드시* +규칙을 만족해야 하는 것(`nodeSelector` 와 같으나 보다 표현적인 구문을 사용해서)을 지정하고, +후자는 스케줄러가 시도하려고는 하지만, 보증하지 않는 *선호(preferences)* 를 지정한다는 점에서 +이를 각각 "엄격함(hard)" 과 "유연함(soft)" 으로 생각할 수 있다. +이름의 "IgnoredDuringExecution" 부분은 `nodeSelector` 작동 방식과 유사하게 노드의 +레이블이 런타임 중에 변경되어 파드의 어피니티 규칙이 더 이상 충족되지 않으면 파드가 여전히 그 노드에서 +동작한다는 의미이다. 향후에는 파드의 노드 어피니티 요구 사항을 충족하지 않는 노드에서 파드를 제거한다는 +점을 제외하고는 `preferredDuringSchedulingIgnoredDuringExecution` 와 같은 `requiredDuringSchedulingIgnoredDuringExecution` 를 제공할 계획이다. + +따라서 `requiredDuringSchedulingIgnoredDuringExecution` 의 예로는 "인텔 CPU가 있는 노드에서만 파드 실행"이 +될 수 있고, `preferredDuringSchedulingIgnoredDuringExecution` 의 예로는 "장애 조치 영역 XYZ에 파드 집합을 실행하려고 +하지만, 불가능하다면 다른 곳에서 일부를 실행하도록 허용"이 있을 것이다. + +노드 어피니티는 PodSpec의 `affinity` 필드의 `nodeAffinity` 필드에서 지정된다. + +여기에 노드 어피니티를 사용하는 파드 예시가 있다. + +{{< codenew file="pods/pod-with-node-affinity.yaml" >}} + +이 노드 어피니티 규칙은 키가 `kubernetes.io/e2e-az-name` 이고 값이 `e2e-az1` 또는 `e2e-az2` 인 +레이블이 있는 노드에만 파드를 배치할 수 있다고 말한다. 또한, 이 기준을 충족하는 노드들 +중에서 키가 `another-node-label-key` 이고 값이 `another-node-label-value` 인 레이블이 있는 노드를 +선호하도록 한다. + +예시에서 연산자 `In` 이 사용되고 있는 것을 볼 수 있다. 새로운 노드 어피니티 구문은 다음의 연산자들을 지원한다. `In`, `NotIn`, `Exists`, `DoesNotExist`, `Gt`, `Lt`. +`NotIn` 과 `DoesNotExist` 를 사용해서 안티-어피니티를 수행하거나, +특정 노드에서 파드를 쫓아내는 [노드 테인트(taint)](/docs/concepts/configuration/taint-and-toleration/)를 설정할 수 있다. + +`nodeSelector` 와 `nodeAffinity` 를 모두 지정한다면 파드가 후보 노드에 스케줄 되기 위해서는 +*둘 다* 반드시 만족해야 한다. + +`nodeAffinity` 유형과 연관된 `nodeSelectorTerms` 를 지정하면, 파드는 `nodeSelectorTerms` 를 **모두** 만족하는 노드에만 스케줄할 수 있다. + +`nodeSelectorTerms` 와 연관된 여러 `matchExpressions` 를 지정하면, 파드는 `matchExpressions` 이 지정된 것 중 **한 가지**라도 만족하는 노드에만 스케줄할 수 있다. + +파드가 스케줄 된 노드의 레이블을 지우거나 변경해도 파드는 제거되지 않는다. 다시 말해서 어피니티 선택은 파드를 스케줄링 하는 시점에만 작동한다. + +`preferredDuringSchedulingIgnoredDuringExecution` 의 `weight` 필드의 범위는 1-100이다. 모든 스케줄링 요구 사항 (리소스 요청, RequiredDuringScheduling 어피니티 표현식 등)을 만족하는 각 노드들에 대해 스케줄러는 이 필드의 요소들을 반복해서 합계를 계산하고 노드가 MatchExpressions 에 일치하는 경우 합계에 "가중치(weight)"를 추가한다. 이후에 이 점수는 노드에 대한 다른 우선순위 함수의 점수와 합쳐진다. 전체 점수가 가장 높은 노드를 가장 선호한다. + +### 파드간 어피니티와 안티-어피니티 + +파드간 어피니티와 안티-어피니티를 사용하면 노드의 레이블을 기반으로 하지 않고, *노드에서 이미 실행 중인 파드 레이블을 기반으로* +파드가 스케줄될 수 있는 노드를 제한할 수 있다. 규칙은 "X가 규칙 Y를 충족하는 하나 이상의 파드를 이미 실행중인 경우 +이 파드는 X에서 실행해야 한다(또는 안티-어피니티가 없는 경우에는 동작하면 안된다)"는 형태이다. Y는 +선택적으로 연관된 네임스페이스 목록을 가진 LabelSelector로 표현된다. 노드와는 다르게 파드는 네임스페이스이기에 +(그리고 따라서 파드의 레이블은 암암리에 네임스페이스이다) 파드 레이블위의 레이블 셀렉터는 반드시 +셀렉터가 적용될 네임스페이스를 지정해야만 한다. 개념적으로 X는 노드, 랙, +클라우드 공급자 영역, 클라우드 공급자 지역 등과 같은 토폴로지 도메인이다. 시스템이 이런 토폴로지 +도메인을 나타내는 데 사용하는 노드 레이블 키인 `topologyKey` 를 사용하여 이를 표현한다. +예: [넘어가기 전에: 빌트인 노드 레이블](#built-in-node-labels) 섹션 위에 나열된 레이블 키를 본다. + +{{< note >}} +파드간 어피니티와 안티-어피니티에는 상당한 양의 프로세싱이 필요하기에 +대규모 클러스터에서는 스케줄링 속도가 크게 느려질 수 있다. +수백 개의 노드를 넘어가는 클러스터에서 이를 사용하는 것은 추천하지 않는다. +{{< /note >}} + +{{< note >}} +파드 안티-어피니티에서는 노드에 일관된 레이블을 지정해야 한다. 즉, 클러스터의 모든 노드는 `topologyKey` 와 매칭되는 적절한 레이블을 가지고 있어야 한다. 일부 또는 모든 노드에 지정된 `topologyKey` 레이블이 없는 경우에는 의도하지 않은 동작이 발생할 수 있다. +{{< /note >}} + +노드 어피니티와 마찬가지로 현재 파드 어피니티와 안티-어피니티로 부르는 "엄격함" 대 "유연함"의 요구사항을 나타내는 `requiredDuringSchedulingIgnoredDuringExecution` 와 +`preferredDuringSchedulingIgnoredDuringExecution` 두 가지 종류가 있다. +앞의 노드 어피니티 섹션의 설명을 본다. +`requiredDuringSchedulingIgnoredDuringExecution` 어피니티의 예시는 +"서로 많은 통신을 하기 때문에 서비스 A와 서비스 B를 같은 영역에 함께 위치시키는 것"이고, +`preferredDuringSchedulingIgnoredDuringExecution` 안티-어피니티의 예시는 "서비스를 여러 영역에 걸쳐서 분배하는 것"이다 +(엄격한 요구사항은 영역보다 파드가 더 많을 수 있기 때문에 엄격한 요구사항은 의미가 없다). + +파드간 어피니티는 PodSpec에서 `affinity` 필드 중 `podAffinity` 필드로 지정한다. +그리고 파드간 안티-어피니티는 PodSpec에서 `affinity` 필드 중 `podAntiAffinity` 필드로 지정한다. + +#### 파드 어피니티를 사용하는 파드의 예시 + +{{< codenew file="pods/pod-with-pod-affinity.yaml" >}} + +이 파드의 어피니티는 하나의 파드 어피니티 규칙과 하나의 파드 안티-어피니티 규칙을 정의한다. +이 예시에서 `podAffinity` 는 `requiredDuringSchedulingIgnoredDuringExecution` 이고 `podAntiAffinity` 는 +`preferredDuringSchedulingIgnoredDuringExecution` 이다. 파드 어피니티 규칙에 의하면 키 "security" 와 값 +"S1"인 레이블이 있는 하나 이상의 이미 실행 중인 파드와 동일한 영역에 있는 경우에만 파드를 노드에 스케줄할 수 있다. +(보다 정확하게는, 클러스터에 키 "security"와 값 "S1"인 레이블을 가지고 있는 실행 중인 파드가 있는 키 +`failure-domain.beta.kubernetes.io/zone` 와 값 V인 노드가 최소 하나 이상 있고, 노드 N이 키 +`failure-domain.beta.kubernetes.io/zone` 와 일부 값이 V인 레이블을 가진다면 파드는 노드 N에서 실행할 수 있다.) +파드 안티-어피니티 규칙에 의하면 노드가 이미 키 "security"와 값 "S2"인 레이블을 가진 파드를 +실행하고 있는 파드는 노드에 스케줄되는 것을 선호하지 않는다. +(만약 `topologyKey` 가 `failure-domain.beta.kubernetes.io/zone` 라면 노드가 키 +"security"와 값 "S2"를 레이블로 가진 파드와 +동일한 영역에 있는 경우, 노드에 파드를 예약할 수 없음을 의미한다.) +[디자인 문서](https://git.k8s.io/community/contributors/design-proposals/scheduling/podaffinity.md)를 통해 +`requiredDuringSchedulingIgnoredDuringExecution` 와 `preferredDuringSchedulingIgnoredDuringExecution` 의 +파드 어피니티와 안티-어피니티에 대한 많은 예시를 맛볼 수 있다. + +파드 어피니티와 안티-어피니티의 적합한 연산자는 `In`, `NotIn`, `Exists`, `DoesNotExist` 이다. + +원칙적으로, `topologyKey` 는 적법한 어느 레이블-키도 될 수 있다. +하지만, 성능과 보안상의 이유로 topologyKey에는 몇 가지 제약조건이 있다. + +1. 어피니티와 `requiredDuringSchedulingIgnoredDuringExecution` 파드 안티-어피니티는 대해 +`topologyKey` 가 비어있는 것을 허용하지 않는다. +2. `requiredDuringSchedulingIgnoredDuringExecution` 파드 안티-어피니티에서 `topologyKey` 를 `kubernetes.io/hostname` 로 제한하기 위해 어드미션 컨트롤러 `LimitPodHardAntiAffinityTopology` 가 도입되었다. 사용자 지정 토폴로지를에 사용할 수 있도록 하려면, 어드미션 컨트롤러를 수정하거나 간단히 이를 비활성화 할 수 있다. +3. `preferredDuringSchedulingIgnoredDuringExecution` 파드 안티-어피니티는 `topologyKey` 가 비어있는 것을 허용하지 않는다. +4. 위의 경우를 제외하고, `topologyKey` 는 적법한 어느 레이블-키도 가능하다. + +`labelSelector` 와 `topologyKey` 외에도 `labelSelector` 와 일치해야 하는 네임스페이스 목록 `namespaces` 를 +선택적으로 지정할 수 있다(이것은 `labelSelector` 와 `topologyKey` 와 같은 수준의 정의이다). +생략되어있거나 비어있을 경우 어피니티/안티-어피니티 정의가 있는 파드의 네임스페이스가 기본 값이다. + +파드를 노드에 스케줄하려면 `requiredDuringSchedulingIgnoredDuringExecution` 어피니티와 안티-어피니티와 +연관된 `matchExpressions` 가 모두 충족되어야 한다. + +#### 더 실용적인 유스케이스 + +파드간 어피니티와 안티-어피니티는 레플리카셋, 스테이트풀셋, 디플로이먼트 등과 같은 +상위 레벨 모음과 함께 사용할 때 더욱 유용할 수 있다. 워크로드 집합이 동일한 노드와 같이 +동일하게 정의된 토폴로지와 같은 위치에 배치되도록 쉽게 구성할 수 있다. + +##### 항상 같은 노드에 위치시키기 + +세 개의 노드가 있는 클러스터에서 웹 애플리케이션에는 redis와 같은 인-메모리 캐시가 있다. 웹 서버가 가능한 캐시와 함께 위치하기를 원한다. + +다음은 세 개의 레플리카와 셀렉터 레이블이 `app=store` 가 있는 간단한 redis 디플로이먼트의 yaml 스니펫이다. 디플로이먼트에는 스케줄러가 단일 노드에서 레플리카를 함께 배치하지 않도록 `PodAntiAffinity` 가 구성되어 있다. + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: redis-cache +spec: + selector: + matchLabels: + app: store + replicas: 3 + template: + metadata: + labels: + app: store + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app + operator: In + values: + - store + topologyKey: "kubernetes.io/hostname" + containers: + - name: redis-server + image: redis:3.2-alpine +``` + +아래 yaml 스니펫의 웹서버 디플로이먼트는 `podAntiAffinity` 와 `podAffinity` 설정을 가지고 있다. 이렇게 하면 스케줄러에 모든 레플리카는 셀렉터 레이블이 `app=store` 인 파드와 함께 위치해야 한다. 또한 각 웹 서버 레플리카가 단일 노드의 같은 위치에 있지 않도록 한다. + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: web-server +spec: + selector: + matchLabels: + app: web-store + replicas: 3 + template: + metadata: + labels: + app: web-store + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app + operator: In + values: + - web-store + topologyKey: "kubernetes.io/hostname" + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app + operator: In + values: + - store + topologyKey: "kubernetes.io/hostname" + containers: + - name: web-app + image: nginx:1.16-alpine +``` + +만약 위의 두 디플로이먼트를 생성하면 세 개의 노드가 있는 클러스터는 다음과 같아야 한다. + +| node-1 | node-2 | node-3 | +|:--------------------:|:-------------------:|:------------------:| +| *webserver-1* | *webserver-2* | *webserver-3* | +| *cache-1* | *cache-2* | *cache-3* | + +여기서 볼 수 있듯이 `web-server` 의 세 레플리카들이 기대했던 것처럼 자동으로 캐시와 함께 위치하게 된다. + +``` +kubectl get pods -o wide +``` +출력은 다음과 유사할 것이다. +``` +NAME READY STATUS RESTARTS AGE IP NODE +redis-cache-1450370735-6dzlj 1/1 Running 0 8m 10.192.4.2 kube-node-3 +redis-cache-1450370735-j2j96 1/1 Running 0 8m 10.192.2.2 kube-node-1 +redis-cache-1450370735-z73mh 1/1 Running 0 8m 10.192.3.1 kube-node-2 +web-server-1287567482-5d4dz 1/1 Running 0 7m 10.192.2.3 kube-node-1 +web-server-1287567482-6f7v5 1/1 Running 0 7m 10.192.4.3 kube-node-3 +web-server-1287567482-s330j 1/1 Running 0 7m 10.192.3.2 kube-node-2 +``` + +##### 절대 동일한 노드에 위치시키지 않게 하기 + +위의 예시에서 `topologyKey:"kubernetes.io/hostname"` 과 함께 `PodAntiAffinity` 규칙을 사용해서 +두 개의 인스터스가 동일한 호스트에 있지 않도록 redis 클러스터를 배포한다. +같은 기술을 사용해서 고 가용성을 위해 안티-어피니티로 구성된 스테이트풀셋의 예시는 +[ZooKeeper 튜토리얼](/ko/docs/tutorials/stateful-application/zookeeper/#노드-실패-방지)을 본다. + +## nodeName + +`nodeName` 은 가장 간단한 형태의 노트 선택 제약 조건이지만, +한계로 인해 일반적으로는 사용하지 않는다. +`nodeName` 은 PodSpec의 필드이다. 만약 비어있지 않으면, 스케줄러는 +파드를 무시하고 명명된 노드에서 실행 중인 kubelet이 +파드를 실행하려고 한다. 따라서 만약 PodSpec에 `nodeName` 가 +제공된 경우, 노드 선텍을 위해 위의 방법보다 우선한다. + +`nodeName` 을 사용해서 노드를 선택할 때의 몇 가지 제한은 다음과 같다. + +- 만약 명명된 노드가 없으면, 파드가 실행되지 않고 + 따라서 자동으로 삭제될 수 있다. +- 만약 명명된 노드에 파드를 수용할 수 있는 + 리소스가 없는 경우 파드가 실패하고, 그 이유는 다음과 같이 표시된다. + 예: OutOfmemory 또는 OutOfcpu. +- 클라우드 환경의 노드 이름은 항상 예측 가능하거나 + 안정적인 것은 아니다. + +여기에 `nodeName` 필드를 사용하는 파드 설정 파일 예시가 있다. + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: nginx +spec: + containers: + - name: nginx + image: nginx + nodeName: kube-01 +``` + +위 파드는 kube-01 노드에서 실행될 것이다. + +{{% /capture %}} + +{{% capture whatsnext %}} + +[테인트](/docs/concepts/configuration/taint-and-toleration/)는 노드가 특정 파드들을 *쫓아내게* 할 수 있다. + +[노드 어피니티](https://git.k8s.io/community/contributors/design-proposals/scheduling/nodeaffinity.md)와 +[파드간 어피니티/안티-어피니티](https://git.k8s.io/community/contributors/design-proposals/scheduling/podaffinity.md)에 대한 디자인 문서에는 +이러한 기능에 대한 추가 배경 정보가 있다. + +파드가 노드에 할당되면 kubelet은 파드를 실행하고 노드의 로컬 리소스를 할당한다. +[토폴로지 매니저](/docs/tasks/administer-cluster/topology-manager/)는 +노드 수준의 리소스 할당 결정에 참여할 수 있다. + +{{% /capture %}} diff --git a/content/ko/docs/concepts/scheduling-eviction/kube-scheduler.md b/content/ko/docs/concepts/scheduling-eviction/kube-scheduler.md index a7c33265f2..24754a5c88 100644 --- a/content/ko/docs/concepts/scheduling-eviction/kube-scheduler.md +++ b/content/ko/docs/concepts/scheduling-eviction/kube-scheduler.md @@ -1,7 +1,7 @@ --- title: 쿠버네티스 스케줄러 content_template: templates/concept -weight: 50 +weight: 10 --- {{% capture overview %}} diff --git a/content/ko/docs/concepts/configuration/taint-and-toleration.md b/content/ko/docs/concepts/scheduling-eviction/taint-and-toleration.md similarity index 100% rename from content/ko/docs/concepts/configuration/taint-and-toleration.md rename to content/ko/docs/concepts/scheduling-eviction/taint-and-toleration.md diff --git a/content/ko/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases.md b/content/ko/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases.md index 65ebdca6d6..b0cc6b1a93 100644 --- a/content/ko/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases.md +++ b/content/ko/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases.md @@ -91,7 +91,7 @@ hostaliases-pod 0/1 Completed 0 6s 10.200 `hosts` 파일 내용은 아래와 같을 것이다. ```shell -kubectl logs hostaliases-pod +kubectl exec hostaliases-pod -- cat /etc/hosts ``` ```none diff --git a/content/ko/docs/concepts/services-networking/dns-pod-service.md b/content/ko/docs/concepts/services-networking/dns-pod-service.md index db0abf1ede..cef017128f 100644 --- a/content/ko/docs/concepts/services-networking/dns-pod-service.md +++ b/content/ko/docs/concepts/services-networking/dns-pod-service.md @@ -171,7 +171,7 @@ DNS 정책은 파드별로 설정할 수 있다. 현재 쿠버네티스는 다 - "`None`": 이 정책은 파드가 쿠버네티스 환경의 DNS 설정을 무시하도록 한다. 모든 DNS 설정은 파드 스펙 내에 `dnsConfig`필드를 사용하여 제공해야 한다. 아래 절인 - [파드의 DNS 설정](#파드의-dns-설정) + [파드의 DNS 설정](#pod-dns-config) 에서 자세한 내용을 확인할 수 있다. {{< note >}} @@ -202,7 +202,7 @@ spec: dnsPolicy: ClusterFirstWithHostNet ``` -### 파드의 DNS 설정 +### 파드의 DNS 설정 {#pod-dns-config} 사용자들은 파드의 DNS 설정을 통해서 직접 파드의 DNS를 세팅할 수 있다. @@ -272,4 +272,3 @@ DNS 구성 관리에 대한 지침은 {{% /capture %}} - diff --git a/content/ko/docs/concepts/services-networking/dual-stack.md b/content/ko/docs/concepts/services-networking/dual-stack.md index 0c52346820..f234bcbbc3 100644 --- a/content/ko/docs/concepts/services-networking/dual-stack.md +++ b/content/ko/docs/concepts/services-networking/dual-stack.md @@ -36,27 +36,30 @@ IPv4/IPv6 이중 스택 쿠버네티스 클러스터를 활용하려면 다음 * 쿠버네티스 1.16 또는 이후 버전 * 이중 스택 네트워킹을 위한 공급자의 지원(클라우드 공급자 또는 다른 방식으로 쿠버네티스 노드에 라우팅 가능한 IPv4/IPv6 네트워크 인터페이스를 제공할 수 있어야 한다.) * 이중 스택(예: Kubenet 또는 Calico)을 지원하는 네트워크 플러그인 - * IPVS 모드에서 구동 중인 Kube-Proxy ## IPv4/IPv6 이중 스택 활성화 IPv4/IPv6 이중 스택을 활성화 하려면, 클러스터의 관련 구성요소에 대해 `IPv6DualStack` [기능 게이트](/docs/reference/command-line-tools-reference/feature-gates/) 를 활성화 하고, 이중 스택 클러스터 네트워크 할당을 설정한다. + * kube-apiserver: + * `--feature-gates="IPv6DualStack=true"` * kube-controller-manager: * `--feature-gates="IPv6DualStack=true"` - * `--cluster-cidr=,` 예: `--cluster-cidr=10.244.0.0/16,fc00::/24` + * `--cluster-cidr=,` * `--service-cluster-ip-range=,` * `--node-cidr-mask-size-ipv4|--node-cidr-mask-size-ipv6` IPv4의 기본값은 /24 이고 IPv6의 기본값은 /64이다. * kubelet: * `--feature-gates="IPv6DualStack=true"` * kube-proxy: - * `--proxy-mode=ipvs` * `--cluster-cidr=,` * `--feature-gates="IPv6DualStack=true"` -{{< caution >}} -명령줄에서 `--cluster-cidr` 를 통해 /24보다 큰 IPv6 주소 블럭을 지정하면 할당이 실패한다. -{{< /caution >}} +{{< note >}} +IPv4 CIDR의 예: `10.244.0.0/16` (자신의 주소 범위를 제공하더라도) + +IPv6 CIDR의 예: `fdXY:IJKL:MNOP:15::/64` (이 형식으로 표시되지만, 유효한 주소는 아니다 - [RFC 4193](https://tools.ietf.org/html/rfc4193)을 본다.) + +{{< /note >}} ## 서비스 diff --git a/content/ko/docs/concepts/services-networking/endpoint-slices.md b/content/ko/docs/concepts/services-networking/endpoint-slices.md index 4fc51a9fa0..635798f5a2 100644 --- a/content/ko/docs/concepts/services-networking/endpoint-slices.md +++ b/content/ko/docs/concepts/services-networking/endpoint-slices.md @@ -1,10 +1,5 @@ --- title: 엔드포인트슬라이스 -feature: - title: 엔드포인트슬라이스 - description: > - 쿠버네티스 클러스터에서 확장 가능한 네트워크 엔드포인트 추적. - content_template: templates/concept weight: 15 --- diff --git a/content/ko/docs/concepts/services-networking/ingress.md b/content/ko/docs/concepts/services-networking/ingress.md index ee11186d50..28f964a4ca 100644 --- a/content/ko/docs/concepts/services-networking/ingress.md +++ b/content/ko/docs/concepts/services-networking/ingress.md @@ -132,11 +132,11 @@ spec: 요소별로 경로 요소에 대해 수행한다. 모든 _p_ 가 요청 경로의 요소별 접두사가 _p_ 인 경우 요청은 _p_ 경로에 일치한다. - {{< note >}} - 경로의 마지막 요소가 요청 경로에 있는 마지막 요소의 - 하위 문자열인 경우에는 일치하지 않는다(예시: - `/foo/bar` 와 `/foo/bar/baz` 와 일치하지만, `/foo/barbaz` 는 일치하지 않는다). - {{< /note >}} + + {{< note >}} + 경로의 마지막 요소가 요청 경로에 있는 마지막 요소의 하위 문자열인 경우에는 일치하지 않는다(예시: + `/foo/bar` 와 `/foo/bar/baz` 와 일치하지만, `/foo/barbaz` 는 일치하지 않는다). + {{< /note >}} #### 다중 일치 경우에 따라 인그레스의 여러 경로가 요청과 일치할 수 있다. @@ -400,16 +400,16 @@ metadata: spec: tls: - hosts: - - sslexample.foo.com + - sslexample.foo.com secretName: testsecret-tls rules: - - host: sslexample.foo.com - http: - paths: - - path: / - backend: - serviceName: service1 - servicePort: 80 + - host: sslexample.foo.com + http: + paths: + - path: / + backend: + serviceName: service1 + servicePort: 80 ``` {{< note >}} diff --git a/content/ko/docs/concepts/services-networking/service.md b/content/ko/docs/concepts/services-networking/service.md index 5f6fbac267..c81309709f 100644 --- a/content/ko/docs/concepts/services-networking/service.md +++ b/content/ko/docs/concepts/services-networking/service.md @@ -310,7 +310,7 @@ IPVS는 트래픽을 백엔드 파드로 밸런싱하기 위한 추가 옵션을 - `nq`: 큐 미사용 (never queue) {{< note >}} -IPVS 모드에서 kube-proxy를 실행하려면, kube-proxy를 시작하기 전에 노드에서 IPVS Linux를 +IPVS 모드에서 kube-proxy를 실행하려면, kube-proxy를 시작하기 전에 노드에서 IPVS를 사용 가능하도록 해야한다. kube-proxy가 IPVS 프록시 모드에서 시작될 때, IPVS 커널 모듈을 @@ -691,6 +691,15 @@ metadata: [...] ``` {{% /tab %}} +{{% tab name="Alibaba Cloud" %}} +```yaml +[...] +metadata: + annotations: + service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet" +[...] +``` +{{% /tab %}} {{< /tabs >}} @@ -895,7 +904,7 @@ NLB는 특정 인스턴스 클래스에서만 작동한다. 지원되는 인스 헬스 체크에 실패하고 트래픽을 수신하지 못하게 된다. 트래픽을 균일하게 하려면, DaemonSet을 사용하거나, -[파드 안티어피니티(pod anti-affinity)](/ko/docs/concepts/configuration/assign-pod-node/#어피니티-affinity-와-안티-어피니티-anti-affinity) +[파드 안티어피니티(pod anti-affinity)](/ko/docs/concepts/scheduling-eviction/assign-pod-node/#어피니티-affinity-와-안티-어피니티-anti-affinity) 를 지정하여 동일한 노드에 위치하지 않도록 한다. [내부 로드 밸런서](/ko/docs/concepts/services-networking/service/#internal-load-balancer) 어노테이션과 함께 NLB 서비스를 diff --git a/content/ko/docs/concepts/storage/persistent-volumes.md b/content/ko/docs/concepts/storage/persistent-volumes.md index a94eb8490f..b24c284ba8 100644 --- a/content/ko/docs/concepts/storage/persistent-volumes.md +++ b/content/ko/docs/concepts/storage/persistent-volumes.md @@ -329,7 +329,7 @@ spec: 가장 빠른 방법을 파드에 제공하는 데 유용하다. 반면에 파드에서 실행되는 애플리케이션은 원시 블록 장치를 처리하는 방법을 알아야 한다. 파드에서 `volumeMode: Block`으로 볼륨을 사용하는 방법에 대한 예는 -[원시 블록 볼륨 지원](/ko/docs/concepts/storage/persistent-volumes/#원시-블록-볼륨-지원)를 참조하십시오. +[원시 블록 볼륨 지원](#원시-블록-볼륨-지원)를 참조하십시오. ### 접근 모드 diff --git a/content/ko/docs/concepts/storage/storage-classes.md b/content/ko/docs/concepts/storage/storage-classes.md index 9f38f9f46c..0d7416e72a 100644 --- a/content/ko/docs/concepts/storage/storage-classes.md +++ b/content/ko/docs/concepts/storage/storage-classes.md @@ -164,9 +164,9 @@ CSI | 1.14 (alpha), 1.16 (beta) 퍼시스턴트볼륨은 파드의 스케줄링 제약 조건에 의해 지정된 토폴로지에 따라 선택되거나 프로비전된다. 여기에는 [리소스 요구 사항](/docs/concepts/configuration/manage-compute-resources-container/), -[노드 셀렉터](/ko/docs/concepts/configuration/assign-pod-node/#노드-셀렉터-nodeselector), +[노드 셀렉터](/ko/docs/concepts/scheduling-eviction/assign-pod-node/#노드-셀렉터-nodeselector), [파드 어피니티(affinity)와 -안티-어피니티(anti-affinity)](/ko/docs/concepts/configuration/assign-pod-node/#어피니티-affinity-와-안티-어피니티-anti-affinity) +안티-어피니티(anti-affinity)](/ko/docs/concepts/scheduling-eviction/assign-pod-node/#어피니티-affinity-와-안티-어피니티-anti-affinity) 그리고 [테인트(taint)와 톨러레이션(toleration)](/docs/concepts/configuration/taint-and-toleration/)이 포함된다. 다음 플러그인은 동적 프로비저닝과 `WaitForFirstConsumer` 를 지원한다. diff --git a/content/ko/docs/concepts/storage/volumes.md b/content/ko/docs/concepts/storage/volumes.md index 035b7bade7..eb63215bb5 100644 --- a/content/ko/docs/concepts/storage/volumes.md +++ b/content/ko/docs/concepts/storage/volumes.md @@ -243,14 +243,14 @@ spec: #### CSI 마이그레이션 -{{< feature-state for_k8s_version="v1.14" state="alpha" >}} +{{< feature-state for_k8s_version="v1.18" state="beta" >}} Cinder의 CSI 마이그레이션 기능이 활성화된 경우, 기존 트리 내 플러그인에서 `cinder.csi.openstack.org` 컨테이너 스토리지 인터페이스(CSI) 드라이버로 모든 플러그인 작업을 수행한다. 이 기능을 사용하려면, 클러스터에 [오픈스택 Cinder CSI 드라이버](https://github.com/kubernetes/cloud-provider-openstack/blob/master/docs/using-cinder-csi-plugin.md) 를 설치하고 `CSIMigration` 과 `CSIMigrationOpenStack` -알파 기능을 활성화해야 한다. +베타 기능을 활성화해야 한다. ### configMap {#configmap} @@ -300,6 +300,11 @@ ConfigMap을 [subPath](#subpath-사용하기) 볼륨 마운트로 사용하는 업데이트를 수신하지 않는다. {{< /note >}} +{{< note >}} +텍스트 데이터는 UTF-8 문자 인코딩을 사용하는 파일로 노출된다. 다른 문자 인코딩을 사용하려면, binaryData를 사용한다. +{{< /note >}} + + ### downwardAPI {#downwardapi} `downwardAPI` 볼륨은 애플리케이션에서 다운워드(downward) API 데이터를 사용할 수 있도록 하는데 사용된다. diff --git a/content/ko/docs/concepts/workloads/controllers/daemonset.md b/content/ko/docs/concepts/workloads/controllers/daemonset.md index 2a19576a0f..91fbeb8cf8 100644 --- a/content/ko/docs/concepts/workloads/controllers/daemonset.md +++ b/content/ko/docs/concepts/workloads/controllers/daemonset.md @@ -91,9 +91,9 @@ kubectl apply -f https://k8s.io/examples/controllers/daemonset.yaml ### 오직 일부 노드에서만 파드 실행 만약 `.spec.template.spec.nodeSelector` 를 명시하면 데몬셋 컨트롤러는 -[노드 셀렉터](/ko/docs/concepts/configuration/assign-pod-node/#노드-셀렉터-nodeselector)와 +[노드 셀렉터](/ko/docs/concepts/scheduling-eviction/assign-pod-node/#노드-셀렉터-nodeselector)와 일치하는 노드에 파드를 생성한다. 마찬가지로 `.spec.template.spec.affinity` 를 명시하면 -데몬셋 컨트롤러는 [노트 어피니티](/ko/docs/concepts/configuration/assign-pod-node/#노드-어피니티)와 일치하는 노드에 파드를 생성한다. +데몬셋 컨트롤러는 [노트 어피니티](/ko/docs/concepts/scheduling-eviction/assign-pod-node/#노드-어피니티)와 일치하는 노드에 파드를 생성한다. 만약 둘 중 하나를 명시하지 않으면 데몬셋 컨트롤러는 모든 노드에서 파드를 생성한다. ## 데몬 파드가 스케줄 되는 방법 diff --git a/content/ko/docs/concepts/workloads/controllers/deployment.md b/content/ko/docs/concepts/workloads/controllers/deployment.md index 268175c200..ab730109d5 100644 --- a/content/ko/docs/concepts/workloads/controllers/deployment.md +++ b/content/ko/docs/concepts/workloads/controllers/deployment.md @@ -51,12 +51,13 @@ _디플로이먼트_ 는 [파드](/ko/docs/concepts/workloads/pods/pod/)와 이 사례에서는 간단하게 파드 템플릿에 정의된 레이블(`app: nginx`)을 선택한다. 그러나 파드 템플릿 자체의 규칙이 만족되는 한, 보다 정교한 선택 규칙의 적용이 가능하다. - {{< note >}} - `.spec.selector.matchLabels` 필드는 {key,value}의 쌍으로 매핑되어있다. `matchLabels` 에 매핑된 - 단일 {key,value}은 `matchExpressions` 의 요소에 해당하며, 키 필드는 "key"에 그리고 연산자는 "In"에 대응되며 - 값 배열은 "value"만 포함한다. - 매칭을 위해서는 `matchLabels` 와 `matchExpressions` 의 모든 요건이 충족되어야 한다. - {{< /note >}} + + {{< note >}} + `.spec.selector.matchLabels` 필드는 {key,value}의 쌍으로 매핑되어있다. `matchLabels` 에 매핑된 + 단일 {key,value}은 `matchExpressions` 의 요소에 해당하며, 키 필드는 "key"에 그리고 연산자는 "In"에 대응되며 + 값 배열은 "value"만 포함한다. + 매칭을 위해서는 `matchLabels` 와 `matchExpressions` 의 모든 요건이 충족되어야 한다. + {{< /note >}} * `template` 필드에는 다음 하위 필드가 포함되어있다. * 파드는 `.metadata.labels` 필드를 사용해서 `app: nginx` 라는 레이블을 붙인다. @@ -65,86 +66,95 @@ _디플로이먼트_ 는 [파드](/ko/docs/concepts/workloads/pods/pod/)와 `nginx` 컨테이너 1개를 실행하는 것을 나타낸다. * 컨테이너 1개를 생성하고, `.spec.template.spec.containers[0].name` 필드를 사용해서 `nginx` 이름을 붙인다. - 위의 디플로이먼트를 생성하려면 다음 단계를 따른다. +시작하기 전에, 쿠버네티스 클러스터가 시작되고 실행 중인지 확인한다. +위의 디플로이먼트를 생성하려면 다음 단계를 따른다. - 시작하기 전에, 쿠버네티스 클러스터가 시작되고 실행 중인지 확인한다. - 1. 다음 명령어를 실행해서 디플로이먼트를 생성한다. +1. 다음 명령어를 실행해서 디플로이먼트를 생성한다. - {{< note >}} - `--record` 플래그를 지정해서 실행된 명령을 `kubernetes.io/change-cause` 리소스 어노테이션에 작성할 수 있다. 이것은 향후 인트로스펙션(introspection)에 유용하다. - 예를 들면, 디플로이먼트의 각 수정 버전에서 실행된 명령을 볼 수 있다. - {{< /note >}} - ```shell - kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml - ``` - - 2. `kubectl get deployments` 을 실행해서 디플로이먼트가 생성되었는지 확인한다. 만약 디플로이먼트가 여전히 생성중이면 다음과 유사하게 출력된다. - ```shell - NAME READY UP-TO-DATE AVAILABLE AGE - nginx-deployment 0/3 0 0 1s - ``` - 클러스터에서 디플로이먼트를 점검할 때 다음 필드가 표시된다. - - * `NAME` 은 네임스페이스에 있는 디플로이먼트 이름의 목록이다. - * `READY` 는 사용자가 사용할 수 있는 애플리케이션의 레플리카의 수를 표시한다. ready/desired 패턴을 따른다. - * `UP-TO-DATE` 는 의도한 상태를 얻기위해 업데이트 된 레플리카의 수를 표시한다. - * `AVAILABLE` 은 사용자가 사용 가능한 애플리케이션 레플리카의 수를 표시한다. - * `AGE` 는 애플리케이션의 실행 된 시간을 표시한다. - - `.spec.replicas` 필드에 따라 의도한 레플리카의 수가 3개인지 알 수 있다. - - 3. 디플로이먼트의 롤아웃 상태를 보려면 `kubectl rollout status deployment.v1.apps/nginx-deployment` 를 실행한다. 다음과 유사하게 출력된다. - ```shell - Waiting for rollout to finish: 2 out of 3 new replicas have been updated... - deployment.apps/nginx-deployment successfully rolled out - ``` - - 4. 몇 초 후 `kubectl get deployments` 를 다시 실행한다. 다음과 유사하게 출력된다. - ```shell - NAME READY UP-TO-DATE AVAILABLE AGE - nginx-deployment 3/3 3 3 18s - ``` - 디플로이먼트에서 3개의 레플리카가 생성되었고, 모든 레플리카는 최신 상태(최신 파드 템플릿을 포함)이며 사용 가능한 것을 알 수 있다. - - 5. 디플로이먼트로 생성된 레플리카셋(`rs`)을 보려면 `kubectl get rs` 를 실행한다. 다음과 유사하게 출력된다. - ```shell - NAME DESIRED CURRENT READY AGE - nginx-deployment-75675f5897 3 3 3 18s - ``` - 레플리카셋의 출력에는 다음 필드가 표시된다. - - * `NAME` 은 네임스페이스에 있는 레플리카셋 이름의 목록이다. - * `DESIRED` 는 디플로이먼트의 생성 시 정의된 의도한 애플리케이션 _레플리카_ 의 수를 표시한다. 이것이 _의도한 상태_ 이다. - * `CURRENT` 는 현재 실행 중인 레플리카의 수를 표시한다. - * `READY` 는 사용자가 사용할 수 있는 애플리케이션의 레플리카의 수를 표시한다. - * `AGE` 는 애플리케이션의 실행된 시간을 표시한다. - - 레플리카셋의 이름은 항상 `[DEPLOYMENT-NAME]-[RANDOM-STRING]` 형식으로 된 것을 알 수 있다. 무작위 문자열은 - 무작위로 생성되며, `pod-template-hash` 를 시드(seed)로 사용한다. - - 6. 각 파드에 자동으로 생성된 레이블을 보려면 `kubectl get pods --show-labels` 를 실행한다. 다음과 유사하게 출력된다. - ```shell - NAME READY STATUS RESTARTS AGE LABELS - nginx-deployment-75675f5897-7ci7o 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453 - nginx-deployment-75675f5897-kzszj 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453 - nginx-deployment-75675f5897-qqcnn 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453 - ``` - 만들어진 레플리카셋은 3개의 `nginx` 파드가 있는 것을 보장한다. +```shell +kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml +``` {{< note >}} - 디플로이먼트에는 파드 템플릿 레이블과 적절한 셀렉터를 반드시 명시해야 한다(이 예시에서는 `app: nginx`). - 레이블 또는 셀렉터는 다른 컨트롤러(다른 디플로이먼트와 스테이트풀 셋 포함)와 겹치지 않아야 한다. 쿠버네티스는 겹치는 것을 막지 않으며, 만약 다중 컨트롤러가 겹치는 셀렉터를 가지는 경우 해당 컨트롤러의 충돌 또는 예기치 않은 동작을 야기할 수 있다. + `--record` 플래그를 지정해서 실행된 명령을 `kubernetes.io/change-cause` 리소스 어노테이션에 작성할 수 있다. + 기록된 변경사항은 향후 인트로스펙션(introspection)에 유용하다. 예를 들면, 디플로이먼트의 각 수정 버전에서 실행된 명령을 볼 수 있다. {{< /note >}} + +2. `kubectl get deployments` 을 실행해서 디플로이먼트가 생성되었는지 확인한다. + + 만약 디플로이먼트가 여전히 생성 중이면, 다음과 유사하게 출력된다. + ```shell + NAME READY UP-TO-DATE AVAILABLE AGE + nginx-deployment 0/3 0 0 1s + ``` + 클러스터에서 디플로이먼트를 점검할 때, 다음 필드가 표시된다. + * `NAME` 은 네임스페이스에 있는 디플로이먼트 이름의 목록이다. + * `READY` 는 사용자가 사용할 수 있는 애플리케이션의 레플리카의 수를 표시한다. ready/desired 패턴을 따른다. + * `UP-TO-DATE` 는 의도한 상태를 얻기 위해 업데이트된 레플리카의 수를 표시한다. + * `AVAILABLE` 은 사용자가 사용할 수 있는 애플리케이션 레플리카의 수를 표시한다. + * `AGE` 는 애플리케이션의 실행된 시간을 표시한다. + + `.spec.replicas` 필드에 따라 의도한 레플리카의 수가 3개인지 알 수 있다. + +3. 디플로이먼트의 롤아웃 상태를 보려면, `kubectl rollout status deployment.v1.apps/nginx-deployment` 를 실행한다. + + 다음과 유사하게 출력된다. + ```shell + Waiting for rollout to finish: 2 out of 3 new replicas have been updated... + deployment.apps/nginx-deployment successfully rolled out + ``` + +4. 몇 초 후 `kubectl get deployments` 를 다시 실행한다. + 다음과 유사하게 출력된다. + ```shell + NAME READY UP-TO-DATE AVAILABLE AGE + nginx-deployment 3/3 3 3 18s + ``` + 디플로이먼트에서 3개의 레플리카가 생성되었고, 모든 레플리카는 최신 상태(최신 파드 템플릿을 포함)이며 사용 가능한 것을 알 수 있다. + +5. 디플로이먼트로 생성된 레플리카셋(`rs`)을 보려면, `kubectl get rs` 를 실행한다. 다음과 유사하게 출력된다. + ```shell + NAME DESIRED CURRENT READY AGE + nginx-deployment-75675f5897 3 3 3 18s + ``` + 레플리카셋의 출력에는 다음 필드가 표시된다. + + * `NAME` 은 네임스페이스에 있는 레플리카셋 이름의 목록이다. + * `DESIRED` 는 디플로이먼트의 생성 시 정의된 의도한 애플리케이션 _레플리카_ 의 수를 표시한다. 이것이 _의도한 상태_ 이다. + * `CURRENT` 는 현재 실행 중인 레플리카의 수를 표시한다. + * `READY` 는 사용자가 사용할 수 있는 애플리케이션의 레플리카의 수를 표시한다. + * `AGE` 는 애플리케이션의 실행된 시간을 표시한다. + + 레플리카셋의 이름은 항상 `[DEPLOYMENT-NAME]-[RANDOM-STRING]` 형식으로 된 것을 알 수 있다. 무작위 문자열은 + 무작위로 생성되며, `pod-template-hash` 를 시드(seed)로 사용한다. + +6. 각 파드에 자동으로 생성된 레이블을 보려면, `kubectl get pods --show-labels` 를 실행한다. + 다음과 유사하게 출력된다. + ```shell + NAME READY STATUS RESTARTS AGE LABELS + nginx-deployment-75675f5897-7ci7o 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453 + nginx-deployment-75675f5897-kzszj 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453 + nginx-deployment-75675f5897-qqcnn 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453 + ``` + 만들어진 레플리카셋은 실행 중인 3개의 `nginx` 파드를 보장한다. + +{{< note >}} +디플로이먼트에는 파드 템플릿 레이블과 적절한 셀렉터를 반드시 명시해야 한다 +(이 예시에서는 `app: nginx`). + +레이블 또는 셀렉터는 다른 컨트롤러(다른 디플로이먼트와 스테이트풀 셋 포함)와 겹치지 않아야 한다. 쿠버네티스는 겹치는 것을 막지 않으며, 만약 다중 컨트롤러가 겹치는 셀렉터를 가지는 경우 해당 컨트롤러의 충돌 또는 예기치 않은 동작을 야기할 수 있다. +{{< /note >}} + ### Pod-template-hash 레이블 -{{< note >}} +{{< caution >}} 이 레이블은 변경하면 안 된다. -{{< /note >}} +{{< /caution >}} -`pod-template-hash` 레이블은 디플로이먼트 컨트롤러에 의해서 디플로이먼트가 생성 또는 채택한 모든 레플리케셋에 추가된다. +`pod-template-hash` 레이블은 디플로이먼트 컨트롤러에 의해서 디플로이먼트가 생성 또는 채택한 모든 레플리카셋에 추가된다. 이 레이블은 디플로이먼트의 자식 레플리카셋이 겹치지 않도록 보장한다. 레플리카셋의 `PodTemplate` 을 해싱하고, 해시 결과를 레플리카셋 셀렉터, 파드 템플릿 레이블 및 레플리카셋 이 가질 수 있는 기존의 모든 파드에 레이블 값으로 추가해서 사용하도록 생성한다. @@ -407,9 +417,7 @@ API 버전 `apps/v1` 에서 디플로이먼트의 레이블 셀렉터는 생성 ``` {{< note >}} - 디플로이먼트 컨트롤러가 잘못된 롤아웃을 자동으로 중지하고, 새로운 레플리카셋의 스케일 업을 중지한다. - 이는 지정한 롤링 업데이트의 파라미터(구체적으로 `maxUnavailable`)에 따라 달라진다. - 쿠버네티스는 기본값으로 25%를 설정한다. + 디플로이먼트 컨트롤러가 잘못된 롤아웃을 자동으로 중지하고, 새로운 레플리카셋의 스케일 업을 중지한다. 이는 지정한 롤링 업데이트의 파라미터(구체적으로 `maxUnavailable`)에 따라 달라진다. 쿠버네티스는 기본값으로 25%를 설정한다. {{< /note >}} * 디플로이먼트에 대한 설명 보기 @@ -1080,6 +1088,15 @@ API 버전 `apps/v1` 에서는 `.spec.selector` 와 `.metadata.labels` 이 설 기존의 모든 파드는 `.spec.strategy.type==Recreate` 이면 새 파드가 생성되기 전에 죽는다. +{{< note >}} +이렇게 하면 업그레이드를 생성하기 전에 파드 종료를 보장할 수 있다. 디플로이먼트를 업그레이드하면, +이전 버전의 모든 파드가 즉시 종료된다. 신규 버전의 파드가 생성되기 전에 성공적으로 제거가 +완료되기를 대기한다. 파드를 수동으로 삭제하면, 라이프사이클은 레플리카셋에 의해 +제어되며(이전 파드가 여전히 종료 상태에 있는 경우에도) 교체용 파드가 즉시 생성된다. 파드에 +대해 "최대" 보장이 필요한 경우 +[스테이트풀셋](/ko/docs/concepts/workloads/controllers/statefulset/)의 사용을 고려해야 한다. +{{< /note >}} + #### 디플로이먼트 롤링 업데이트 디플로이먼트는 `.spec.strategy.type==RollingUpdate` 이면 파드를 롤링 업데이트 @@ -1114,7 +1131,7 @@ API 버전 `apps/v1` 에서는 `.spec.selector` 와 `.metadata.labels` 이 설 `.spec.progressDeadlineSeconds` 는 디플로어먼트가 표면적으로 `Type=Progressing`, `Status=False`의 상태 그리고 리소스가 `Reason=ProgressDeadlineExceeded` 상태로 [진행 실패](#디플로이먼트-실패)를 보고하기 전에 디플로이먼트가 진행되는 것을 대기시키는 시간(초)를 명시하는 선택적 필드이다. -디플로이먼트 컨트롤러는 디플로이먼트를 계속 재시도 한다. +디플로이먼트 컨트롤러는 디플로이먼트를 계속 재시도 한다. 기본값은 600(초)이다. 미래에 자동화된 롤백이 구현된다면 디플로이먼트 컨트롤러는 상태를 관찰하고, 그 즉시 디플로이먼트를 롤백할 것이다. diff --git a/content/ko/docs/concepts/workloads/controllers/replicaset.md b/content/ko/docs/concepts/workloads/controllers/replicaset.md index 6058fbab1c..80bcf6052b 100644 --- a/content/ko/docs/concepts/workloads/controllers/replicaset.md +++ b/content/ko/docs/concepts/workloads/controllers/replicaset.md @@ -326,7 +326,7 @@ kubectl apply -f https://k8s.io/examples/controllers/hpa-rs.yaml (그리고 더 쉽다!) ```shell -kubectl autoscale rs frontend --max=10 +kubectl autoscale rs frontend --max=10 --min=3 --cpu-percent=50 ``` ## 레플리카셋의 대안 diff --git a/content/ko/docs/concepts/workloads/pods/disruptions.md b/content/ko/docs/concepts/workloads/pods/disruptions.md index da0e5752ab..d2c91e3ecb 100644 --- a/content/ko/docs/concepts/workloads/pods/disruptions.md +++ b/content/ko/docs/concepts/workloads/pods/disruptions.md @@ -83,6 +83,8 @@ weight: 60 ## Disruption Budgets의 작동 방식 +{{< feature-state for_k8s_version="v1.5" state="beta" >}} + 애플리케이션 소유자는 각 애플리케이션에 대해 `PodDisruptionBudget` 오브젝트(PDB)를 만들 수 있다. PDB는 자발적 중단으로 일시에 중지되는 복제된 애플리케이션 파드의 수를 제한한다. 예를 들어 정족수 기반의 애플리케이션이 @@ -192,7 +194,7 @@ drain 커멘드는 `pod-b`를 축출하는데 성공했다. | node-1 *drained* | node-2 | node-3 | *no node* | |:--------------------:|:-------------------:|:------------------:|:------------------:| -| | pod-b *available* | pod-c *available* | pod-e *pending* | +| | pod-b *terminating* | pod-c *available* | pod-e *pending* | | | pod-d *available* | pod-y | | 이 시점에서 클러스터 관리자는 diff --git a/content/ko/docs/concepts/workloads/pods/init-containers.md b/content/ko/docs/concepts/workloads/pods/init-containers.md index d4b73562b6..c45d3cc838 100644 --- a/content/ko/docs/concepts/workloads/pods/init-containers.md +++ b/content/ko/docs/concepts/workloads/pods/init-containers.md @@ -44,8 +44,8 @@ weight: 40 그러나, 초기화 컨테이너를 위한 리소스 요청량과 상한은 [리소스](#리소스)에 문서화된 것처럼 다르게 처리된다. -또한, 초기화 컨테이너는 준비성 프로브(readiness probe)를 지원하지 않는다. 왜냐하면 초기화 컨테이너는 -파드가 준비 상태가 되기 전에 완료를 목표로 실행되어야 하기 때문이다. +또한, 초기화 컨테이너는 `lifecycle`, `livenessProbe`, `readinessProbe` 또는 `startupProbe` 를 지원하지 않는다. +왜냐하면 초기화 컨테이너는 파드가 준비 상태가 되기 전에 완료를 목표로 실행되어야 하기 때문이다. 만약 다수의 초기화 컨테이너가 파드에 지정되어 있다면, Kubelet은 해당 초기화 컨테이너들을 한 번에 하나씩 실행한다. 각 초기화 컨테이너는 다음 컨테이너를 실행하기 전에 꼭 성공해야 한다. @@ -239,7 +239,7 @@ myapp-pod 1/1 Running 0 9m ``` 이 간단한 예제는 사용자만의 초기화 컨테이너를 생성하는데 -영감을 줄 것이다. [다음 순서](#what-s-next)에는 더 자세한 예제의 링크가 있다. +영감을 줄 것이다. [다음 순서](#다음-내용)에는 더 자세한 예제의 링크가 있다. ## 자세한 동작 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 4bb95789d3..040a228d70 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 @@ -55,7 +55,7 @@ node4 Ready 2m43s v1.16.0 node=node4,zone=zoneB `pod.spec.topologySpreadConstraints` 필드는 1.16에서 다음과 같이 도입되었다. -```yaml +``` apiVersion: v1 kind: Pod metadata: @@ -97,7 +97,7 @@ spec: {{< codenew file="pods/topology-spread-constraints/one-constraint.yaml" >}} -`topologyKey: zone` 는 "zone:" 레이블 쌍을 가지는 노드에 대해서만 균등한 분배를 적용하는 것을 의미한다. `whenUnsatisfiable: DoNotSchedule` 은 만약 들어오는 파드가 제약 조건을 만족시키지 못하면 스케줄러에게 pending 상태를 유지하도록 지시한다. +`topologyKey: zone` 는 "zone:<any value>" 레이블 쌍을 가지는 노드에 대해서만 균등한 분배를 적용하는 것을 의미한다. `whenUnsatisfiable: DoNotSchedule` 은 만약 들어오는 파드가 제약 조건을 만족시키지 못하면 스케줄러에게 pending 상태를 유지하도록 지시한다. 만약 스케줄러가 이 신규 파드를 "zoneA"에 배치하면 파드 분포는 [3, 1]이 되며, 따라서 실제 차이(skew)는 2 (3 - 1)가 되어 `maxSkew: 1` 를 위반하게 된다. 이 예시에서는 들어오는 파드는 오직 "zoneB"에만 배치할 수 있다. diff --git a/content/ko/docs/concepts/workloads/pods/podpreset.md b/content/ko/docs/concepts/workloads/pods/podpreset.md index b6ebb25a04..97ed144f68 100644 --- a/content/ko/docs/concepts/workloads/pods/podpreset.md +++ b/content/ko/docs/concepts/workloads/pods/podpreset.md @@ -5,7 +5,9 @@ weight: 50 --- {{% capture overview %}} -이 페이지는 파드 프리셋에 대한 개요를 제공한다. 파드 프리셋은 파드 생성 시간에 파드에 +{{< feature-state for_k8s_version="v1.6" state="alpha" >}} + +이 페이지는 파드프리셋(PodPreset)에 대한 개요를 제공한다. 파드프리셋은 파드 생성 시간에 파드에 특정 정보를 주입하기 위한 오브젝트이다. 해당 정보에는 시크릿, 볼륨, 볼륨 마운트, 환경 변수가 포함될 수 있다. {{% /capture %}} @@ -14,16 +16,33 @@ weight: 50 {{% capture body %}} ## 파드 프리셋 이해하기 -`Pod Preset`은 파드 생성 시간에 파드에 추가적인 런타임 요구사항을 +파드프리셋은 파드 생성 시간에 파드에 추가적인 런타임 요구사항을 주입하기 위한 API 리소스이다. -주어진 파드 프리셋이 적용되도록 파드에 명시하기 위해서는 +주어진 파드프리셋이 적용되도록 파드에 명시하기 위해서는 [레이블 셀렉터](/ko/docs/concepts/overview/working-with-objects/labels/#레이블-셀렉터)를 사용한다. -파드 프리셋을 사용하는 것은 파드 템플릿 작성자에게 모든 파드를 위한 모든 정보를 명시적으로 +파드프리셋을 사용하는 것은 파드 템플릿 작성자에게 모든 파드를 위한 모든 정보를 명시적으로 제공하지는 않아도 되도록 한다. 이렇게 하면, 어떤 특정 서비스를 사용할 파드의 파드 템플릿 작성자는 해당 서비스에 대한 모든 세부 사항을 알 필요가 없다. -그 배경에 대한 자세한 정보를 위해서는, [파드 프리셋을 위한 디자인 제안](https://git.k8s.io/community/contributors/design-proposals/service-catalog/pod-preset.md)을 참고한다. +## 클러스터에서 파드프리셋 활성화하기 {#enable-pod-preset} + +클러스터에서 파드 프리셋을 사용하기 위해서는 다음 사항이 반드시 이행되어야 한다. + +1. API 타입 `settings.k8s.io/v1alpha1/podpreset`을 활성화하였다. + 예를 들면, 이것은 API 서버의 `--runtime-config` 옵션에 `settings.k8s.io/v1alpha1=true`을 포함하여 완료할 수 있다. + minikube에서는 클러스터가 시작할 때 + `--extra-config=apiserver.runtime-config=settings.k8s.io/v1alpha1=true` + 플래그를 추가한다. +1. 어드미션 컨트롤러 `PodPreset`을 활성화하였다. 이것을 이루는 방법 중 하나는 + API 서버를 위해서 명시된 `--enable-admission-plugins` 옵션에 `PodPreset`을 포함하는 것이다. + minikube에서는 클러스터가 시작할 때 + + ```shell + --extra-config=apiserver.enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,PodPreset + ``` + + 플래그를 추가한다. ## 어떻게 동작하는가 @@ -60,31 +79,12 @@ weight: 50 있을 것이다. 이 경우에는, 다음과 같은 양식으로 어노테이션을 파드 스펙에 추가한다. `podpreset.admission.kubernetes.io/exclude: "true"`. -## 파드 프리셋 활성화하기 - -클러스터에서 파드 프리셋을 사용하기 위해서는 다음 사항이 반드시 이행되어야 한다. - -1. API 타입 `settings.k8s.io/v1alpha1/podpreset`을 활성화하였다. - 예를 들면, 이것은 API 서버의 `--runtime-config` 옵션에 `settings.k8s.io/v1alpha1=true`을 포함하여 완료할 수 있다. - minikube에서는 클러스터가 시작할 때 - `--extra-config=apiserver.runtime-config=settings.k8s.io/v1alpha1=true` - 플래그를 추가한다. -1. 어드미션 컨트롤러 `PodPreset`을 활성화하였다. 이것을 이루는 방법 중 하나는 - API 서버를 위해서 명시된 `--enable-admission-plugins` 옵션에 `PodPreset`을 포함하는 것이다. - minikube에서는 클러스터가 시작할 때 - - ```shell - --extra-config=apiserver.enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,PodPreset - ``` - - 플래그를 추가한다. -1. 사용할 네임스페이스 안에서 `PodPreset` 오브젝트를 생성하여 - 파드 프리셋을 정의하였다. - {{% /capture %}} {{% capture whatsnext %}} -* [파드 프리셋을 사용하여 파드에 데이터 주입하기](/docs/tasks/inject-data-application/podpreset/) +[파드프리셋을 사용하여 파드에 데이터 주입하기](/docs/tasks/inject-data-application/podpreset/)를 본다. + +배경에 대한 자세한 정보를 위해서는, [파드프리셋을 위한 디자인 제안](https://git.k8s.io/community/contributors/design-proposals/service-catalog/pod-preset.md)을 본다. {{% /capture %}} diff --git a/content/ko/docs/contribute/advanced.md b/content/ko/docs/contribute/advanced.md new file mode 100644 index 0000000000..de723b3353 --- /dev/null +++ b/content/ko/docs/contribute/advanced.md @@ -0,0 +1,248 @@ +--- +title: 고급 기여 +slug: advanced +content_template: templates/concept +weight: 98 +--- + +{{% capture overview %}} + +이 페이지에서는 당신이 +[새로운 콘텐츠에 기여](/ko/docs/contribute/new-content/overview)하고 +[다른 사람의 작업을 리뷰](/ko/docs/contribute/review/reviewing-prs/)하는 방법을 +이해한다고 가정한다. 또한 기여하기 위한 더 많은 방법에 대해 배울 준비가 되었다고 가정한다. 이러한 +작업 중 일부에는 Git 커맨드 라인 클라이언트와 다른 도구를 사용해야 한다. + +{{% /capture %}} + +{{% capture body %}} + +## 일주일 동안 PR 랭글러(Wrangler) 되기 + +SIG Docs [승인자](/ko/docs/contribute/participating/#승인자)는 리포지터리에 대해 1주일 정도씩 [PR을 조정(wrangling)](https://github.com/kubernetes/website/wiki/PR-Wranglers)하는 역할을 맡는다. + +PR 랭글러의 임무는 다음과 같다. + +- [스타일](/docs/contribute/style/style-guide/)과 [콘텐츠](/docs/contribute/style/content-guide/) 가이드를 준수하는지에 대해 [열린(open) 풀 리퀘스트](https://github.com/kubernetes/website/pulls)를 매일 리뷰한다. + - 가장 작은 PR(`size/XS`)을 먼저 리뷰한 다음, 가장 큰(`size/XXL`) PR까지 옮겨가며 리뷰를 반복한다. + - 가능한 한 많은 PR을 리뷰한다. +- 각 기여자가 CLA에 서명했는지 확인한다. + - 새로운 기여자가 [CLA](https://github.com/kubernetes/community/blob/master/CLA.md)에 서명하도록 도와준다. + - CLA에 서명하지 않은 기여자에게 CLA에 서명하도록 자동으로 알리려면 [이](https://github.com/zparnold/k8s-docs-pr-botherer) 스크립트를 사용한다. +- 제안된 변경 사항에 대한 피드백을 제공하고 다른 SIG의 멤버로부터의 기술 리뷰가 잘 진행되게 조율한다. + - 제안된 콘텐츠 변경에 대해 PR에 인라인 제안(inline suggestion)을 제공한다. + - 내용을 확인해야 하는 경우, PR에 코멘트를 달고 자세한 내용을 요청한다. + - 관련 `sig/` 레이블을 할당한다. + - 필요한 경우, 파일의 머리말(front matter)에 있는 `reviewers:` 블록의 리뷰어를 할당한다. + - PR의 리뷰 상태를 표시하기 위해 `Docs Review` 와 `Tech Review` 레이블을 할당한다. + - 아직 리뷰되지 않은 PR에 `Needs Doc Review` 나 `Needs Tech Review` 를 할당한다. + - 리뷰가 진행되었고, 병합하기 전에 추가 입력이나 조치가 필요한 PR에 `Doc Review: Open Issues` 나 `Tech Review: Open Issues` 를 할당한다. + - 병합할 수 있는 PR에 `/lgtm` 과 `/approve` 를 할당한다. +- PR이 준비가 되면 병합하거나, 수락해서는 안되는 PR을 닫는다. +- 새로운 이슈를 매일 심사하고 태그를 지정한다. SIG Docs가 메타데이터를 사용하는 방법에 대한 지침은 [이슈 심사 및 분류](/ko/docs/contribute/review/for-approvers/#이슈-심사와-분류)를 참고한다. + +## 랭글러에게 유용한 GitHub 쿼리 + +다음의 쿼리는 랭글러에게 도움이 된다. 이 쿼리들을 수행하여 작업한 후에는, 리뷰할 나머지 PR 목록은 +일반적으로 작다. 이 쿼리들은 특히 현지화 PR을 제외하고, `master` 브랜치만 포함한다(마지막 쿼리는 제외). + +- [CLA 서명 없음, 병합할 수 없음](https://github.com/kubernetes/website/pulls?q=is%3Aopen+is%3Apr+label%3A%22cncf-cla%3A+no%22+-label%3Ado-not-merge+label%3Alanguage%2Fen): + CLA에 서명하도록 기여자에게 상기시킨다. 봇과 사람이 이미 알렸다면, PR을 닫고 + CLA에 서명한 후 PR을 열 수 있음을 알린다. + **작성자가 CLA에 서명하지 않은 PR은 리뷰하지 않는다!** +- [LGTM 필요](https://github.com/kubernetes/website/pulls?utf8=%E2%9C%93&q=is%3Aopen+is%3Apr+-label%3Ado-not-merge+label%3Alanguage%2Fen+-label%3Algtm+): + 기술 리뷰가 필요한 경우, 봇이 제안한 리뷰어 중 한 명을 지정한다. 문서 리뷰나 + 교정이 필요한 경우, 변경 사항을 제안하거나 교정하는 커밋을 PR에 추가하여 진행한다. +- [LGTM 보유, 문서 승인 필요](https://github.com/kubernetes/website/pulls?q=is%3Aopen+is%3Apr+-label%3Ado-not-merge+label%3Alanguage%2Fen+label%3Algtm): + PR을 병합하기 위해 추가 변경이나 업데이트가 필요한지 여부를 결정한다. PR을 병합할 준비가 되었다고 생각되면, `/approve` 코멘트를 남긴다. +- [퀵윈(Quick Wins)](https://github.com/kubernetes/website/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+base%3Amaster+-label%3A%22do-not-merge%2Fwork-in-progress%22+-label%3A%22do-not-merge%2Fhold%22+label%3A%22cncf-cla%3A+yes%22+label%3A%22size%2FXS%22+label%3A%22language%2Fen%22+): 명확한 결격 사유가 없는 master에 대한 작은 PR인 경우. ([XS, S, M, L, XL, XXL] 크기의 PR을 작업할 때 크기 레이블에서 "XS"를 변경한다) +- [master 이외의 브랜치에 대한 PR](https://github.com/kubernetes/website/pulls?utf8=%E2%9C%93&q=is%3Aopen+is%3Apr+-label%3Ado-not-merge+label%3Alanguage%2Fen+-base%3Amaster): `dev-` 브랜치에 대한 것일 경우, 곧 출시될 예정인 릴리스이다. `/assign @` 을 코멘트로 추가하여 [릴리스 마이스터](https://github.com/kubernetes/sig-release/tree/master/release-team)가 그것에 대해 알고 있는지 확인한다. 오래된 브랜치에 대한 PR인 경우, PR 작성자가 가장 적합한 브랜치를 대상으로 하고 있는지 여부를 파악할 수 있도록 도와준다. + +### 풀 리퀘스트를 종료하는 시기 + +리뷰와 승인은 PR 대기열을 최신 상태로 유지하는 도구 중 하나이다. 또 다른 도구는 종료(closure)이다. + +- CLA가 2주 동안 서명되지 않은 모든 PR을 닫는다. +PR 작성자는 CLA에 서명한 후 PR을 다시 열 수 있으므로, 이는 어떤 것도 CLA 서명없이 병합되지 않게 하는 위험이 적은 방법이다. + +- 작성자가 2주 이상 동안 코멘트나 피드백에 응답하지 않은 모든 PR을 닫는다. + +풀 리퀘스트를 닫는 것을 두려워하지 말자. 기여자는 진행 중인 작업을 쉽게 다시 열고 다시 시작할 수 있다. 종종 종료 통지는 작성자가 기여를 재개하고 끝내도록 자극하는 것이다. + +풀 리퀘스트를 닫으려면, PR에 `/close` 코멘트를 남긴다. + +{{< note >}} + +[`fejta-bot`](https://github.com/fejta-bot)이라는 자동화 서비스는 90일 동안 활동이 없으면 자동으로 이슈를 오래된 것으로 표시한 다음, 그 상태에서 추가로 30일 동안 활동이 없으면 종료한다. PR 랭글러는 14-30일 동안 활동이 없으면 이슈를 닫아야 한다. + +{{< /note >}} + +## 개선 제안 + +SIG Docs [멤버](/ko/docs/contribute/participating/#멤버)는 개선을 제안할 수 있다. + +한 동안 쿠버네티스 문서에 기여한 후에, +[스타일 가이드](/docs/contribute/style/style-guide/), +[컨텐츠 가이드](/docs/contribute/style/content-guide/), 문서 작성에 사용되는 툴체인, +website 스타일, 풀 리퀘스트 리뷰와 병합 +프로세스 또는 문서 작성의 다른 측면을 개선하기 위한 아이디어가 있을 수 있다. 투명성을 극대화하려면, +이러한 유형의 제안을 SIG Docs 회의나 +[kubernetes-sig-docs 메일링리스트](https://groups.google.com/forum/#!forum/kubernetes-sig-docs)에서 논의해야 한다. +또한, 현재의 작업 방식과 과거의 결정이 왜 획기적인 변경을 +제안하기 전에 결정되었는지에 대한 맥락을 이해하는 데 실제로 +도움이 될 수 있다. 현재의 문서 작업이 어떻게 진행되는지에 대한 질문의 +답변을 얻는 가장 빠른 방법은 [kubernetes.slack.com](https://kubernetes.slack.com)의 +`#sig-docs` 슬랙 채널에 문의하는 것이다. + +토론이 진행되고 원하는 결과에 SIG가 동의한 +후에는, 제안한 변경 사항과 가장 적합한 방식으로 +작업할 수 있다. 예를 들어, 스타일 가이드나 website의 +기능을 업데이트하려면, sig-testing과 함께 작업이 필요할 수 있는 +문서 테스트와 관련된 변경에 대해 풀 리퀘스트를 열어야 할 수 있다. + +## 쿠버네티스 릴리스를 위한 문서 조정 + +SIG Docs [승인자](/ko/docs/contribute/participating/#승인자)는 쿠버네티스 +릴리스에 대한 문서를 조정할 수 있다. + +각 쿠버네티스 릴리스는 sig-release SIG(Special Interest Group)에 참여하는 +사람들의 팀에 의해 조정된다. 특정 릴리스에 대한 릴리스 팀의 다른 구성원에는 +전체 릴리스 리드와 sig-pm, sig-testing 및 기타 담당자가 +포함된다. 쿠버네티스 릴리스 프로세스에 대한 자세한 내용은 +[https://github.com/kubernetes/sig-release](https://github.com/kubernetes/sig-release)를 +참고한다. + +특정 릴리스의 SIG Docs 담당자는 다음 작업을 조정한다. + +- 문서에 영향을 미치는 새로운 기능이나 변경된 기능이 있는지 기능-추적 스프레드시트를 + 모니터링한다. 특정 기능에 대한 문서가 릴리스를 위해 준비가 + 되지 않은 경우, 해당 기능이 릴리스 되지 않을 수 있다. +- sig-release 미팅에 정기적으로 참석하고 릴리스에 대한 문서의 + 상태를 업데이트한다. +- 기능 구현을 담당하는 SIG가 작성한 기능 문서를 + 리뷰하고 교정한다. +- 릴리스 관련 풀 리퀘스트를 병합하고 릴리스에 대한 Git 기능 브랜치를 + 유지 보수한다. +- 앞으로 이 역할을 수행하는 방법을 배우려는 다른 SIG Docs 기여자들을 + 멘토링한다. 이것을 "섀도잉"이라고 한다. +- 릴리스에 대한 산출물이 공개될 때 릴리스와 관련된 문서 변경 + 사항을 공개한다. + +릴리스 조정은 일반적으로 3-4개월의 책임이며, SIG Docs 승인자 +사이에서 의무가 순환된다. + +## 새로운 기여자 홍보대사로 봉사 + +SIG Docs [승인자](/ko/docs/contribute/participating/#승인자)는 새로운 기여자 +홍보대사로 활동할 수 있다. + +새로운 기여자 홍보대사는 SIG-Docs에 기여한 새 기여자를 환영하고, +새 기여자에게 PR을 제안하고, 첫 몇 번의 PR 제출을 통해 +새 기여자를 멘토링한다. + +새로운 기여자 홍보대사의 책임은 다음과 같다. + +- [#sig-docs 슬랙 채널](https://kubernetes.slack.com)에서 새로운 기여자의 질문을 모니터링한다. +- PR 랭글러와 협력하여 새로운 기여자에게 좋은 첫 이슈를 파악한다. +- 문서 리포지터리에 대한 처음 몇 번의 PR을 통해 새로운 기여자를 멘토링한다. +- 새로운 기여자가 쿠버네티스 멤버가 되기 위해 필요한 보다 복잡한 PR을 작성하도록 지원한다. +- 쿠버네티스 멤버 가입을 위해 [기여자를 후원](/ko/docs/contribute/advanced/#새로운-기여자-후원)한다. + +현재 새로운 기여자 홍보대사는 각 SIG-Docs 회의와 [쿠버네티스 #sig-docs 채널](https://kubernetes.slack.com)에서 발표된다. + +## 새로운 기여자 후원 + +SIG Docs [리뷰어](/ko/docs/contribute/participating/#리뷰어)는 새로운 기여자를 +후원할 수 있다. + +새로운 기여자가 하나 이상의 쿠버네티스 리포지터리에 5개의 +실질적인 풀 리퀘스트를 성공적으로 제출한 후에는 +쿠버네티스 조직의 [멤버십](/ko/docs/contribute/participating#멤버)을 +신청할 수 있다. 기여자의 멤버십은 이미 리뷰어인 두 명의 스폰서가 +후원해야 한다. + +새로운 문서 기여자는 [쿠버네티스 슬랙 인스턴스](https://kubernetes.slack.com)의 #sig-docs +채널이나 [SIG Docs 메일링리스트](https://groups.google.com/forum/#!forum/kubernetes-sig-docs)에서 +스폰서를 요청할 수 있다. +신청자의 작업에 대해 확신이 있다면, 리뷰어는 신청자를 후원한다. +신청자가 멤버십 신청서를 제출할 때, 신청서에 "+1"로 코멘트를 남기고 +신청자가 쿠버네티스 조직의 멤버십에 +적합한 이유에 대한 세부 정보를 포함한다. + +## SIG 공동 의장으로 봉사 + +SIG Docs [승인자](/ko/docs/contribute/participating/#승인자)는 SIG Docs의 공동 의장 역할을 할 수 있다. + +### 전제 조건 + +승인자는 공동 의장이 되려면 다음의 요구 사항을 충족해야 한다. + +- 6개월 이상 SIG Docs 승인자로 활동한다. +- [쿠버네티스 문서 릴리스 주도](/ko/docs/contribute/advanced/#쿠버네티스-릴리스를-위한-문서-조정) 또는 두 개의 릴리스에서 섀도잉을 수행한다. +- SIG Docs 워크플로와 툴링을 이해한다(git, Hugo, 현지화, 블로그 하위 프로젝트). +- [k/org의 팀](https://github.com/kubernetes/org/blob/master/config/kubernetes/sig-docs/teams.yaml), [k/community의 프로세스](https://github.com/kubernetes/community/tree/master/sig-docs), [k/test-infra](https://github.com/kubernetes/test-infra/)의 플러그인 및 [SIG 아키텍처](https://github.com/kubernetes/community/tree/master/sig-architecture)의 역할을 포함하여 다른 쿠버네티스 SIG와 리포지터리가 SIG Docs 워크플로에 미치는 영향을 이해한다. +- 최소 6개월 동안 일주일에 5시간 이상(대부분 더)을 역할에 책임진다. + +### 책임 + +공동 의장의 역할은 서비스 중 하나이다. 공동 의장은 기여자 역량 확보, 프로세스와 정책 처리, 회의 예약과 진행, PR 랭글러 스케줄링, 쿠버네티스 커뮤니티의 문서에 대한 지지, 쿠버네티스 릴리스 주기에서 성공적으로 문서화되는지 확인하고, SIG Docs를 효과적인 우선순위에 놓이도록 집중한다. + +다음과 같은 책임을 가진다. + +- SIG Docs가 우수한 문서화를 통해 개발자의 행복을 극대화하는 데 집중한다. +- 스스로가 [커뮤니티 행동 강령](https://github.com/cncf/foundation/blob/master/code-of-conduct-languages/ko.md)을 준수하여 예를 보이고, SIG 멤버들이 지킬 수 있도록 책임을 진다. +- 기여에 대한 새로운 지침을 확인하여 SIG에 대한 모범 사례를 배우고 설정한다. +- SIG 회의를 예약하고 진행한다. 주간 상태 업데이트, 브랜치별 회고/기획 세션과 필요에 따라 그 외 세션을 진행한다. +- KubeCon 이벤트 및 기타 컨퍼런스에서 문서 스프린트를 스케줄링하고 진행한다. +- {{< glossary_tooltip text="CNCF" term_id="cncf" >}}와 플래티넘 파트너인 Google, Oracle, Azure, IBM 및 Huawei를 통해 SIG Docs를 대신하여 채용과 지지를 보낸다. +- SIG를 원활하게 운영한다. + +### 효과적인 회의 운영 + +효과적으로 회의를 예약하고 진행하기 위해, 이 지침은 수행할 작업, 수행 방법과 이유를 보여준다. + +**[커뮤니티 행동 강령](https://github.com/cncf/foundation/blob/master/code-of-conduct-languages/ko.md)을 지킨다**. + +- 정중함을 유지하고, 포괄적인 언어로, 정중하고 포괄적인 토론을 한다. + +**명확한 안건을 설정한다**. + +- 주제의 명확한 안건을 설정한다. +- 안건을 미리 게시한다. + +주간 회의의 경우, 지난 주 회의록을 회의록의 "지난 회의" 섹션에 복사하여 붙여 넣는다. + +**정확한 회의록에 대해 공동 작업한다**. + +- 회의의 토론 내용을 기록한다. +- 회의록 작성자의 역할을 위임한다. + +**조치 항목을 명확하고 정확하게 지정한다**. + +- 조치 항목, 조치 항목에 할당된 멤버 그리고 예상 완료 날짜를 기록한다. + +**필요에 따라 완급을 조절한다**. + +- 토론이 안건에서 벗어난 경우, 참가자의 초점을 현재의 주제로 다시 맞춘다. +- 토론에 집중하고 사람들의 시간을 존중하면서 다양한 토론 스타일을 위한 공간을 확보한다. + +**사람들의 시간을 존중한다**. + +정시에 회의를 시작하고 끝낸다. + +**줌(Zoom)을 효과적으로 사용한다**. + +- [쿠버네티스에 대한 줌 가이드라인](https://github.com/kubernetes/community/blob/master/communication/zoom-guidelines.md)에 익숙해진다. +- 호스트 키를 입력하여 로그인할 때 호스트 역할을 선택한다. + +줌에서 호스트 역할 신청 + +### 줌에서 회의 녹화 + +녹화를 시작할 준비가 되면, Record to Cloud를 클릭한다. + +녹화를 중지하려면, Stop을 클릭한다. + +비디오가 자동으로 유튜브에 업로드된다. + +{{% /capture %}} diff --git a/content/ko/docs/contribute/review/for-approvers.md b/content/ko/docs/contribute/review/for-approvers.md index c6ebb465ac..6713d5a50b 100644 --- a/content/ko/docs/contribute/review/for-approvers.md +++ b/content/ko/docs/contribute/review/for-approvers.md @@ -73,8 +73,7 @@ PR 코멘트를 남기는 것이 도움이 되지만, 대신 다른 사람의 PR [Prow](https://github.com/kubernetes/test-infra/blob/master/prow/README.md)는 풀 리퀘스트 (PR)에 대한 작업을 실행하는 쿠버네티스 기반 CI/CD 시스템이다. Prow는 챗봇 스타일 명령으로 쿠버네티스 -조직 전체에서 [레이블 추가와 -제거](#이슈-레이블-추가와-제거), 이슈 종료 및 승인자 할당과 같은 GitHub 작업을 처리할 수 ​​있다. `/` 형식을 사용하여 Prow 명령을 GitHub 코멘트로 입력한다. +조직 전체에서 [레이블 추가와 제거](#이슈-레이블-추가와-제거), 이슈 종료 및 승인자 할당과 같은 GitHub 작업을 처리할 수 ​​있다. `/` 형식을 사용하여 Prow 명령을 GitHub 코멘트로 입력한다. 리뷰어와 승인자가 사용하는 가장 일반적인 Prow 명령은 다음과 같다. diff --git a/content/ko/docs/contribute/suggesting-improvements.md b/content/ko/docs/contribute/suggesting-improvements.md new file mode 100644 index 0000000000..ca2e8862ed --- /dev/null +++ b/content/ko/docs/contribute/suggesting-improvements.md @@ -0,0 +1,65 @@ +--- +title: 콘텐츠 개선 제안 +slug: suggest-improvements +content_template: templates/concept +weight: 10 +card: + name: contribute + weight: 20 +--- + +{{% capture overview %}} + +쿠버네티스 문서에 문제가 있거나, 새로운 내용에 대한 아이디어가 있으면, 이슈를 연다. [GitHub 계정](https://github.com/join)과 웹 브라우저만 있으면 된다. + +대부분의 경우, 쿠버네티스 문서에 대한 새로운 작업은 GitHub의 이슈로 시작된다. 그런 다음 +쿠버네티스 기여자는 필요에 따라 이슈를 리뷰, 분류하고 태그를 지정한다. 다음으로, 여러분이나 +다른 쿠버네티스 커뮤니티 멤버가 문제를 해결하기 위한 변경 사항이 있는 풀 리퀘스트를 연다. + +{{% /capture %}} + +{{% capture body %}} + +## 이슈 열기 + +기존 콘텐츠에 대한 개선을 제안하거나, 오류를 발견하면, 이슈를 연다. + +1. 페이지 하단으로 이동하여 **이슈 생성하기** 버튼을 클릭한다. 그러면 헤더가 + 미리 채워진 GitHub 이슈 페이지로 리디렉션된다. +2. 개선을 위한 문제나 제안 사항을 설명한다. 가능한 한 많은 정보를 제공한다. +3. **Submit new issue** 를 클릭한다. + +이슈를 제출한 후, 가끔 확인하거나 GitHub 알림을 켜자. +리뷰어와 다른 커뮤니티 멤버가 이슈에 대한 조치를 취하기 전에 +여러분에게 질문을 할 수 있다. + +## 새로운 콘텐츠 제안 + +새로운 콘텐츠에 대한 아이디어가 있지만, 어디로 가야 할지 확실하지 않은 경우에도 +이슈를 제기할 수 있다. 다음 중 하나를 선택하면 된다. + +- 콘텐츠가 속한 섹션에서 기존 페이지를 선택하고 **이슈 생성하기** 를 클릭한다. +- [GitHub](https://github.com/kubernetes/website/issues/new/)으로 이동하여 이슈를 직접 제기한다. + +## 이슈를 제기하는 좋은 방법 + + +이슈를 제기할 때 다음의 사항에 유의한다. + +- 명확하게 이슈에 대한 설명을 제공한다. 구체적으로 무엇이 누락되었거나, 오래되었거나, + 잘못되었거나, 개선이 필요한 사항인지를 설명한다. +- 이 이슈가 사용자에게 미치는 영향을 설명한다. +- 주어진 이슈의 범위를 합리적인 작업 단위로 제한한다. 넓은 범위에 대한 + 이슈의 경우 더 작은 이슈로 분류한다. 예를 들어, "보안 문서 수정"은 + 너무 광범위하지만, "'네트워크 접근 제한' 주제에 세부 사항 추가"는 + 실행할 수 있을 정도로 구체적이다. +- 기존 이슈를 검색하여 새로운 이슈와 관련이 있거나 비슷한 것이 있는지 + 확인한다. +- 새로운 이슈가 다른 이슈나 풀 리퀘스트와 관련이 있는 경우, 전체 URL이나 + `#` 문자로 시작하는 이슈나 풀 리퀘스트의 번호로 + 참고한다. 예를 들면, `#987654 와 관련있습니다.` 와 같이 하면 된다. +- [행동 강령](/ko/community/code-of-conduct/)을 따른다. 동료 기여자를 + 존중한다. 예를 들어, "문서가 끔찍하다"는 도움이 + 되지 않거나 예의 바르지 않은 피드백이다. + +{{% /capture %}} diff --git a/content/ko/docs/reference/glossary/node.md b/content/ko/docs/reference/glossary/node.md index 311e2ea0b5..18bfa19736 100755 --- a/content/ko/docs/reference/glossary/node.md +++ b/content/ko/docs/reference/glossary/node.md @@ -15,3 +15,5 @@ tags: 작업 노드는 클러스터에 따라 VM이거나 물리 머신일 것이다. {{< glossary_tooltip text="파드" term_id="pod" >}} 실행에 필요한 로컬 데몬과 서비스를 가지고 있으며, 콘트롤 플레인에 의해서 관리된다. 노드에 있는 데몬은 {{< glossary_tooltip text="kubelet" term_id="kubelet" >}}, {{< glossary_tooltip text="kube-proxy" term_id="kube-proxy" >}}와 {{< glossary_tooltip term_id="docker" >}} 같이 컨테이너 런타임을 구현한 {{< glossary_tooltip text="CRI" term_id="cri" >}}를 포함한다. + +초기 쿠버네티스 버전에서는 노드를 "미니언(Minions)"으로 불렀었다. \ No newline at end of file diff --git a/content/ko/docs/reference/glossary/taint.md b/content/ko/docs/reference/glossary/taint.md index 4e50003e92..323580ee6d 100644 --- a/content/ko/docs/reference/glossary/taint.md +++ b/content/ko/docs/reference/glossary/taint.md @@ -2,7 +2,7 @@ title: 테인트(Taint) id: taint date: 2019-01-11 -full_link: /docs/concepts/configuration/taint-and-toleration/ +full_link: /docs/concepts/scheduling-eviction/taint-and-toleration/ short_description: > 세 가지 필수 속성: 키(key), 값(value), 효과(effect)로 구성된 코어 오브젝트. 테인트는 파드가 노드나 노드 그룹에 스케줄링되는 것을 방지한다. diff --git a/content/ko/docs/reference/glossary/toleration.md b/content/ko/docs/reference/glossary/toleration.md index 469a86dd99..44200ee028 100644 --- a/content/ko/docs/reference/glossary/toleration.md +++ b/content/ko/docs/reference/glossary/toleration.md @@ -2,7 +2,7 @@ title: 톨러레이션(Toleration) id: toleration date: 2019-01-11 -full_link: /docs/concepts/configuration/taint-and-toleration/ +full_link: /docs/concepts/scheduling-eviction/taint-and-toleration/ short_description: > 세 가지 필수 속성: 키(key), 값(value), 효과(effect)로 구성된 코어 오브젝트. 톨러레이션은 매칭되는 테인트(taint)를 가진 노드나 노드 그룹에 파드가 스케줄링되는 것을 활성화한다. diff --git a/content/ko/docs/reference/issues-security/_index.md b/content/ko/docs/reference/issues-security/_index.md new file mode 100644 index 0000000000..a1f56bc08e --- /dev/null +++ b/content/ko/docs/reference/issues-security/_index.md @@ -0,0 +1,5 @@ +--- +title: 쿠버네티스 이슈와 보안 +weight: 10 +toc-hide: true +--- diff --git a/content/ko/docs/setup/learning-environment/minikube.md b/content/ko/docs/setup/learning-environment/minikube.md index 3efc951e1b..08a0767754 100644 --- a/content/ko/docs/setup/learning-environment/minikube.md +++ b/content/ko/docs/setup/learning-environment/minikube.md @@ -33,116 +33,151 @@ Minikube는 다음과 같은 쿠버네티스의 기능을 제공한다. 여기서 기술하는 간단한 데모는 어떻게 로컬에서 Minikube를 시작하고, 사용하고 삭제하는지를 안내한다. 다음의 주어진 단계를 따라서 Minikube를 시작하고 탐구한다. 1. Minikube를 시작하고 클러스터를 생성 - ```shell + + ```shell minikube start - ``` + ``` + 결과는 다음과 비슷하다. - ``` - Starting local Kubernetes cluster... - Running pre-create checks... - Creating machine... - Starting local Kubernetes cluster... - ``` - 특정 쿠버네티스 버전, VM, 컨테이너 런타임 상에서 클러스터를 시작하기 위한 보다 상세한 정보는 [클러스터 시작하기](#클러스터-시작하기)를 참조한다. + ``` + Starting local Kubernetes cluster... + Running pre-create checks... + Creating machine... + Starting local Kubernetes cluster... + ``` + + 특정 쿠버네티스 버전, VM, 컨테이너 런타임 상에서 클러스터를 시작하기 위한 보다 상세한 정보는 [클러스터 시작하기](#클러스터-시작하기)를 참조한다. 2. 이제, kubectl을 통해서 클러스터와 상호작용할 수 있다. 보다 상세한 정보는 [클러스터와 상호 작용하기](#클러스터와-상호-작용하기)를 참조한다. - 단순한 HTTP 서버인 `echoserver` 이미지를 사용해서 쿠버네티스 디플로이먼트를 만들고 `--port`를 이용해서 8080 포트로 노출해보자. - ```shell - kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10 - ``` - 결과는 다음과 비슷하다. - ``` - deployment.apps/hello-minikube created - ``` -3. `hello-minikube` 디플로이먼트에 액세스하기 위해, 서비스로 노출시킨다. - ```shell - kubectl expose deployment hello-minikube --type=NodePort --port=8080 - ``` - `--type=NodePort` 옵션은 서비스 타입을 지정한다. + 간단한 HTTP 서버인 `echoserver` 이미지를 사용해서 쿠버네티스 디플로이먼트를 만들고 `--port`를 이용해서 8080 포트로 노출해보자. + + ```shell + kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10 + ``` 결과는 다음과 비슷하다. - ``` - service/hello-minikube exposed - ``` + + ``` + deployment.apps/hello-minikube created + ``` +3. `hello-minikube` 디플로이먼트에 액세스하기 위해, 서비스로 노출시킨다. + + ```shell + kubectl expose deployment hello-minikube --type=NodePort --port=8080 + ``` + + `--type=NodePort` 옵션은 서비스 타입을 지정한다. + + 결과는 다음과 비슷하다. + + ``` + service/hello-minikube exposed + ``` + 4. `hello-minikube` 파드가 이제 시작되었지만 노출된 서비스를 통해서 접근하기 전에 파드가 뜨기를 기다려야한다. - 파드가 떠서 구동되고 있는지 확인한다. - ```shell - kubectl get pod - ``` - 출력에서 `STATUS`가 `ContainerCreating`으로 나타나는 경우, 파드는 아직 생성 중이다. - ``` - NAME READY STATUS RESTARTS AGE - hello-minikube-3383150820-vctvh 0/1 ContainerCreating 0 3s - ``` - 출력에서 `STATUS`가 `Running`으로 나타나는 경우, 파드는 이제 떠서 기동 중이다. - ``` - NAME READY STATUS RESTARTS AGE - hello-minikube-3383150820-vctvh 1/1 Running 0 13s - ``` + 파드가 시작되고 실행 중인지 확인한다. + + ```shell + kubectl get pod + ``` + + 출력에서 `STATUS`가 `ContainerCreating`으로 나타나는 경우, 파드는 아직 생성 중이다. + + ``` + NAME READY STATUS RESTARTS AGE + hello-minikube-3383150820-vctvh 0/1 ContainerCreating 0 3s + ``` + + 출력에서 `STATUS`가 `Running`으로 나타나는 경우, 파드는 이제 시작돼서 실행 중이다. + + ``` + NAME READY STATUS RESTARTS AGE + hello-minikube-3383150820-vctvh 1/1 Running 0 13s + ``` + 5. 서비스 상세를 보기 위해서 노출된 서비스의 URL을 얻는다. - ```shell - minikube service hello-minikube --url - ``` -6. 로컬 클러스터의 상세를 보기위해서, 출력에서 얻은 URL을 브라우저에 복사해서 붙여 넣는다. - 출력은 다음과 비슷하다. - ``` - Hostname: hello-minikube-7c77b68cff-8wdzq + ```shell + minikube service hello-minikube --url + ``` - Pod Information: - -no pod information available- +6. 로컬 클러스터의 상세를 보기위해서, 출력에서 얻은 URL을 브라우저에 복사해서 붙여넣는다. - Server values: - server_version=nginx: 1.13.3 - lua: 10008 + 출력은 다음과 비슷하다. - Request Information: - client_address=172.17.0.1 - method=GET - real path=/ - query= - request_version=1.1 - request_scheme=http - request_uri=http://192.168.99.100:8080/ + ``` + Hostname: hello-minikube-7c77b68cff-8wdzq - Request Headers: + Pod Information: + -no pod information available- + + Server values: + server_version=nginx: 1.13.3 - lua: 10008 + + Request Information: + client_address=172.17.0.1 + method=GET + real path=/ + query= + request_version=1.1 + request_scheme=http + request_uri=http://192.168.99.100:8080/ + + Request Headers: accept=*/* host=192.168.99.100:30674 user-agent=curl/7.47.0 - Request Body: + Request Body: -no body in request- - ``` - 서비스나 클러스터가 더 이상 구동되지 않도록 하려면, 삭제한다. + ``` + + 서비스나 클러스터가 더 이상 구동되지 않도록 하려면, 삭제한다. + 7. `hello-minikube` 서비스 삭제 - ```shell - kubectl delete services hello-minikube - ``` - 출력은 다음과 비슷하다. - ``` - service "hello-minikube" deleted - ``` + + ```shell + kubectl delete services hello-minikube + ``` + + The output is similar to this: + + ``` + service "hello-minikube" deleted + ``` + 8. `hello-minikube` 디플로이먼트 삭제 - ```shell - kubectl delete deployment hello-minikube - ``` - 출력은 다음과 비슷하다. - ``` - deployment.extensions "hello-minikube" deleted - ``` + + ```shell + kubectl delete deployment hello-minikube + ``` + + The output is similar to this: + + ``` + deployment.extensions "hello-minikube" deleted + ``` + 9. 로컬 Minikube 클러스터 중지 - ```shell - minikube stop - ``` - 출력은 다음과 비슷하다. - ``` - Stopping "minikube"... - "minikube" stopped. - ``` - 보다 상세한 정보는 [클러스터 중지하기](#클러스터-중지하기)를 참조한다. + + ```shell + minikube stop + ``` + + The output is similar to this: + + ``` + Stopping "minikube"... + "minikube" stopped. + ``` + + 보다 상세한 정보는 [클러스터 중지하기](#클러스터-중지하기)를 참조한다. + 10. 로컬 Minikube 클러스터 삭제 + ```shell minikube delete ``` @@ -188,14 +223,15 @@ minikube start --kubernetes-version {{< param "fullversion" >}} ```shell minikube start --driver= ``` - Minikube는 다음의 드라이버를 지원한다. - {{< note >}} - 지원되는 드라이버와 플러그인 설치 방법에 대한 보다 상세한 정보는 [드라이버](https://minikube.sigs.k8s.io/docs/reference/drivers/)를 참조한다. +Minikube는 다음의 드라이버를 지원한다. +{{< note >}} +지원되는 드라이버와 플러그인 설치 방법에 대한 보다 상세한 정보는 [드라이버](https://minikube.sigs.k8s.io/docs/reference/drivers/)를 참조한다. {{< /note >}} -* virtualbox +* docker ([드라이버 설치](https://minikube.sigs.k8s.io/docs/drivers/docker/)) +* virtualbox ([드라이버 설치](https://minikube.sigs.k8s.io/docs/drivers/virtualbox/)) +* podman ([드라이버 설치](https://minikube.sigs.k8s.io/docs/drivers/podman/)) (EXPERIMENTAL) * vmwarefusion -* docker ([드라이버 설치](https://minikube.sigs.k8s.io/docs/drivers/docker/) * kvm2 ([드라이버 설치](https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/)) * hyperkit ([드라이버 설치](https://minikube.sigs.k8s.io/docs/reference/drivers/hyperkit/)) * hyperv ([드라이버 설치](https://minikube.sigs.k8s.io/docs/reference/drivers/hyperv/)) diff --git a/content/ko/docs/setup/production-environment/container-runtimes.md b/content/ko/docs/setup/production-environment/container-runtimes.md index 0331440eac..5f0ad0bb75 100644 --- a/content/ko/docs/setup/production-environment/container-runtimes.md +++ b/content/ko/docs/setup/production-environment/container-runtimes.md @@ -18,8 +18,8 @@ weight: 10 악성 컨테이너는 이 결함을 사용하여 runc 바이너리의 내용을 덮어쓸 수 있으며 따라서 컨테이너 호스트 시스템에서 임의의 명령을 실행할 수 있다. -이 문제에 대한 자세한 내용은 -[cve-2019-5736 : runc 취약점 ] (https://access.redhat.com/security/cve/cve-2019-5736) 참고하자. +문제에 대한 자세한 내용은 [CVE-2019-5736](https://access.redhat.com/security/cve/cve-2019-5736) +를 참고한다. {{< /caution >}} ### 적용 가능성 @@ -49,7 +49,7 @@ Control group은 프로세스에 할당된 리소스를 제한하는데 사용 리소스가 부족할 때 불안정해지는 사례를 본 적이 있다. 컨테이너 런타임과 kubelet이 `systemd`를 cgroup 드라이버로 사용하도록 설정을 변경하면 -시스템이 안정화된다. 아래의 Docker 설정에서 `native.cgroupdriver=systemd` 옵션을 확인하라. +시스템이 안정화된다. 아래의 도커 설정에서 `native.cgroupdriver=systemd` 옵션을 확인하라. {{< caution >}} 클러스터에 결합되어 있는 노드의 cgroup 관리자를 변경하는 것은 권장하지 않는다. @@ -59,38 +59,48 @@ kubelet을 재시작 하는 것은 에러를 해결할 수 없을 것이다. 추천하는 방법은 워크로드에서 노드를 제거하고, 클러스터에서 제거한 다음 다시 결합시키는 것이다. {{< /caution >}} -## Docker +## 도커 -각 머신들에 대해서, Docker를 설치한다. +각 머신들에 대해서, 도커를 설치한다. 버전 19.03.8이 추천된다. 그러나 1.13.1, 17.03, 17.06, 17.09, 18.06 그리고 18.09도 동작하는 것으로 알려져 있다. -쿠버네티스 릴리스 노트를 통해서, 최신에 검증된 Docker 버전의 지속적인 파악이 필요하다. +쿠버네티스 릴리스 노트를 통해서, 최신에 검증된 도커 버전의 지속적인 파악이 필요하다. -시스템에 Docker를 설치하기 위해서 아래의 커맨드들을 사용한다. +시스템에 도커를 설치하기 위해서 아래의 커맨드들을 사용한다. {{< tabs name="tab-cri-docker-installation" >}} -{{< tab name="Ubuntu 16.04+" codelang="bash" >}} -# Docker CE 설치 +{{< tab name="Ubuntu 16.04+" >}} + +```shell +# (도커 CE 설치) ## 리포지터리 설정 ### apt가 HTTPS 리포지터리를 사용할 수 있도록 해주는 패키지 설치 apt-get update && apt-get install -y \ apt-transport-https ca-certificates curl software-properties-common gnupg2 +``` -### Docker의 공식 GPG 키 추가 +```shell +# 도커 공식 GPG 키 추가 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - +``` -### Docker apt 리포지터리 추가. +```shell +# 도커 apt 리포지터리 추가. add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" +``` -## Docker CE 설치. +```shell +# 도커 CE 설치. apt-get update && apt-get install -y \ containerd.io=1.2.13-1 \ docker-ce=5:19.03.8~3-0~ubuntu-$(lsb_release -cs) \ docker-ce-cli=5:19.03.8~3-0~ubuntu-$(lsb_release -cs) +``` -# 데몬 설정. +```shell +# 도커 데몬 설정 cat > /etc/docker/daemon.json < /etc/docker/daemon.json <}} -{{< tab name="CentOS/RHEL 7.4+" codelang="bash" >}} +{{< tab name="CentOS/RHEL 7.4+" >}} -# Docker CE 설치 +```shell +# (도커 CE 설치) ## 리포지터리 설정 -### 필요한 패키지 설치. +### 필요한 패키지 설치 yum install -y yum-utils device-mapper-persistent-data lvm2 +``` -### Docker 리포지터리 추가 +```shell +## 도커 리포지터리 추가 yum-config-manager --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo +``` -## Docker CE 설치. +```shell +# 도커 CE 설치. yum update -y && yum install -y \ containerd.io-1.2.13 \ docker-ce-19.03.8 \ docker-ce-cli-19.03.8 +``` -## /etc/docker 디렉터리 생성. +```shell +## /etc/docker 생성. mkdir /etc/docker +``` -# 데몬 설정. +```shell +# 도커 데몬 설정. cat > /etc/docker/daemon.json < /etc/docker/daemon.json <}} {{< /tabs >}} -자세한 내용은 [공식 Docker 설치 가이드](https://docs.docker.com/engine/installation/) +자세한 내용은 [공식 도커 설치 가이드](https://docs.docker.com/engine/installation/) 를 참고한다. ## CRI-O @@ -182,53 +211,78 @@ sysctl --system ``` {{< tabs name="tab-cri-cri-o-installation" >}} -{{< tab name="Debian" codelang="bash" >}} +{{< tab name="Debian" >}} + +```shell # Debian 개발 배포본(Unstable/Sid) echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_Unstable/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/Debian_Unstable/Release.key -O- | sudo apt-key add - +``` +```shell # Debian Testing echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_Testing/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/Debian_Testing/Release.key -O- | sudo apt-key add - +``` +```shell # Debian 10 echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_10/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/Debian_10/Release.key -O- | sudo apt-key add - +``` +```shell # Raspbian 10 echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Raspbian_10/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/Raspbian_10/Release.key -O- | sudo apt-key add - +``` -# CRI-O 설치 +그리고 다음과 같이 CRI-O 설치한다. +```shell sudo apt-get install cri-o-1.17 +``` {{< /tab >}} -{{< tab name="Ubuntu 18.04, 19.04 and 19.10" codelang="bash" >}} -# 리포지터리 설치 +{{< tab name="Ubuntu 18.04, 19.04 and 19.10" >}} + +```shell +# 패키지 리포지터리 설정 . /etc/os-release sudo sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/x${NAME}_${VERSION_ID}/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list" wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/x${NAME}_${VERSION_ID}/Release.key -O- | sudo apt-key add - sudo apt-get update +``` +```shell # CRI-O 설치 sudo apt-get install cri-o-1.17 +``` {{< /tab >}} -{{< tab name="CentOS/RHEL 7.4+" codelang="bash" >}} +{{< tab name="CentOS/RHEL 7.4+" >}} + +```shell # 선행 조건 설치 -yum-config-manager --add-repo=https://cbs.centos.org/repos/paas7-crio-115-release/x86_64/os/ +curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/CentOS_7/devel:kubic:libcontainers:stable.repo +curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:{{< skew latestVersion >}}.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:{{< skew latestVersion >}}/CentOS_7/devel:kubic:libcontainers:stable:cri-o:{{< skew latestVersion >}}.repo +``` +```shell # CRI-O 설치 -yum install --nogpgcheck -y cri-o +yum install -y cri-o +``` -{{< tab name="openSUSE Tumbleweed" codelang="bash" >}} +{{< tab name="openSUSE Tumbleweed" >}} + +```shell sudo zypper install cri-o +``` {{< /tab >}} {{< /tabs >}} ### CRI-O 시작 -``` +```shell systemctl daemon-reload systemctl start crio ``` @@ -266,51 +320,75 @@ sysctl --system ### containerd 설치 {{< tabs name="tab-cri-containerd-installation" >}} -{{< tab name="Ubuntu 16.04" codelang="bash" >}} -# containerd 설치 +{{< tab name="Ubuntu 16.04" >}} + +```shell +# (containerd 설치) ## 리포지터리 설정 ### apt가 HTTPS로 리포지터리를 사용하는 것을 허용하기 위한 패키지 설치 apt-get update && apt-get install -y apt-transport-https ca-certificates curl software-properties-common +``` -### Docker의 공식 GPG 키 추가 +```shell +## 도커 공식 GPG 키 추가 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - +``` -### Docker apt 리포지터리 추가. +```shell +## 도커 apt 리포지터리 추가. add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" +``` +```shell ## containerd 설치 apt-get update && apt-get install -y containerd.io +``` +```shell # containerd 설정 mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml +``` +```shell # containerd 재시작 systemctl restart containerd +``` {{< /tab >}} -{{< tab name="CentOS/RHEL 7.4+" codelang="bash" >}} -# containerd 설치 +{{< tab name="CentOS/RHEL 7.4+" >}} + +```shell +# (containerd 설치) ## 리포지터리 설정 ### 필요한 패키지 설치 yum install -y yum-utils device-mapper-persistent-data lvm2 +``` -### Docker 리포지터리 추가리 +```shell +## 도커 리포지터리 추가 yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo +``` +```shell ## containerd 설치 yum update -y && yum install -y containerd.io +``` -# containerd 설정 +```shell +## containerd 설정 mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml +``` +```shell # containerd 재시작 systemctl restart containerd +``` {{< /tab >}} {{< /tabs >}} diff --git a/content/ko/docs/setup/production-environment/windows/user-guide-windows-containers.md b/content/ko/docs/setup/production-environment/windows/user-guide-windows-containers.md index c1ba8d3646..1cb79cb113 100644 --- a/content/ko/docs/setup/production-environment/windows/user-guide-windows-containers.md +++ b/content/ko/docs/setup/production-environment/windows/user-guide-windows-containers.md @@ -67,7 +67,7 @@ spec: - -command - "<#code used from https://gist.github.com/wagnerandrade/5424431#> ; $$listener = New-Object System.Net.HttpListener ; $$listener.Prefixes.Add('http://*:80/') ; $$listener.Start() ; $$callerCounts = @{} ; Write-Host('Listening at http://*:80/') ; while ($$listener.IsListening) { ;$$context = $$listener.GetContext() ;$$requestUrl = $$context.Request.Url ;$$clientIP = $$context.Request.RemoteEndPoint.Address ;$$response = $$context.Response ;Write-Host '' ;Write-Host('> {0}' -f $$requestUrl) ; ;$$count = 1 ;$$k=$$callerCounts.Get_Item($$clientIP) ;if ($$k -ne $$null) { $$count += $$k } ;$$callerCounts.Set_Item($$clientIP, $$count) ;$$ip=(Get-NetAdapter | Get-NetIpAddress); $$header='

Windows Container Web Server

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

IP {0} callerCount {1} ' -f $$ip[1].IPAddress,$$callerCounts.Item($$_) } ;$$footer='' ;$$content='{0}{1}{2}' -f $$header,$$callerCountsString,$$footer ;Write-Output $$content ;$$buffer = [System.Text.Encoding]::UTF8.GetBytes($$content) ;$$response.ContentLength64 = $$buffer.Length ;$$response.OutputStream.Write($$buffer, 0, $$buffer.Length) ;$$response.Close() ;$$responseStatus = $$response.StatusCode ;Write-Host('< {0}' -f $$responseStatus) } ; " nodeSelector: - beta.kubernetes.io/os: windows + kubernetes.io/os: windows ``` {{< note >}} diff --git a/content/ko/docs/setup/release/notes.md b/content/ko/docs/setup/release/notes.md new file mode 100644 index 0000000000..270287b1b3 --- /dev/null +++ b/content/ko/docs/setup/release/notes.md @@ -0,0 +1,1372 @@ +--- +title: v1.18 릴리스 노트 +weight: 10 +card: + name: 다운로드 + weight: 20 + anchors: + - anchor: "#" + title: 최신 릴리스 노트 + - anchor: "#긴급-업그레이드-노트" + title: 긴급 업그레이드 노트 +--- + + + +# v1.18.0 + +[문서](https://docs.k8s.io) + +## v1.18.0 다운로드 + +파일명 | sha512 해시 +-------- | ----------- +[kubernetes.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes.tar.gz) | `cd5b86a3947a4f2cea6d857743ab2009be127d782b6f2eb4d37d88918a5e433ad2c7ba34221c34089ba5ba13701f58b657f0711401e51c86f4007cb78744dee7` +[kubernetes-src.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-src.tar.gz) | `fb42cf133355ef18f67c8c4bb555aa1f284906c06e21fa41646e086d34ece774e9d547773f201799c0c703ce48d4d0e62c6ba5b2a4d081e12a339a423e111e52` + +### 클라이언트 바이너리 + +파일명 | sha512 해시 +-------- | ----------- +[kubernetes-client-darwin-386.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-client-darwin-386.tar.gz) | `26df342ef65745df12fa52931358e7f744111b6fe1e0bddb8c3c6598faf73af997c00c8f9c509efcd7cd7e82a0341a718c08fbd96044bfb58e80d997a6ebd3c2` +[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-client-darwin-amd64.tar.gz) | `803a0fed122ef6b85f7a120b5485723eaade765b7bc8306d0c0da03bd3df15d800699d15ea2270bb7797fa9ce6a81da90e730dc793ea4ed8c0149b63d26eca30` +[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-client-linux-386.tar.gz) | `110844511b70f9f3ebb92c15105e6680a05a562cd83f79ce2d2e25c2dd70f0dbd91cae34433f61364ae1ce4bd573b635f2f632d52de8f72b54acdbc95a15e3f0` +[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-client-linux-amd64.tar.gz) | `594ca3eadc7974ec4d9e4168453e36ca434812167ef8359086cd64d048df525b7bd46424e7cc9c41e65c72bda3117326ba1662d1c9d739567f10f5684fd85bee` +[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-client-linux-arm.tar.gz) | `d3627b763606557a6c9a5766c34198ec00b3a3cd72a55bc2cb47731060d31c4af93543fb53f53791062bb5ace2f15cbaa8592ac29009641e41bd656b0983a079` +[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-client-linux-arm64.tar.gz) | `ba9056eff1452cbdaef699efbf88f74f5309b3f7808d372ebf6918442d0c9fea1653c00b9db3b7626399a460eef9b1fa9e29b827b7784f34561cbc380554e2ea` +[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-client-linux-ppc64le.tar.gz) | `f80fb3769358cb20820ff1a1ce9994de5ed194aabe6c73fb8b8048bffc394d1b926de82c204f0e565d53ffe7562faa87778e97a3ccaaaf770034a992015e3a86` +[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-client-linux-s390x.tar.gz) | `a9b658108b6803d60fa3cd4e76d9e58bf75201017164fe54054b7ccadbb68c4ad7ba7800746940bc518d90475e6c0a96965a26fa50882f4f0e56df404f4ae586` +[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-client-windows-386.tar.gz) | `18adffab5d1be146906fd8531f4eae7153576aac235150ce2da05aee5ae161f6bd527e8dec34ae6131396cd4b3771e0d54ce770c065244ad3175a1afa63c89e1` +[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-client-windows-amd64.tar.gz) | `162396256429cef07154f817de2a6b67635c770311f414e38b1e2db25961443f05d7b8eb1f8da46dec8e31c5d1d2cd45f0c95dad1bc0e12a0a7278a62a0b9a6b` + +### 서버 바이너리 + +파일명 | sha512 해시 +-------- | ----------- +[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-server-linux-amd64.tar.gz) | `a92f8d201973d5dfa44a398e95fcf6a7b4feeb1ef879ab3fee1c54370e21f59f725f27a9c09ace8c42c96ac202e297fd458e486c489e05f127a5cade53b8d7c4` +[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-server-linux-arm.tar.gz) | `62fbff3256bc0a83f70244b09149a8d7870d19c2c4b6dee8ca2714fc7388da340876a0f540d2ae9bbd8b81fdedaf4b692c72d2840674db632ba2431d1df1a37d` +[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-server-linux-arm64.tar.gz) | `842910a7013f61a60d670079716b207705750d55a9e4f1f93696d19d39e191644488170ac94d8740f8e3aa3f7f28f61a4347f69d7e93d149c69ac0efcf3688fe` +[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-server-linux-ppc64le.tar.gz) | `95c5b952ac1c4127a5c3b519b664972ee1fb5e8e902551ce71c04e26ad44b39da727909e025614ac1158c258dc60f504b9a354c5ab7583c2ad769717b30b3836` +[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-server-linux-s390x.tar.gz) | `a46522d2119a0fd58074564c1fa95dd8a929a79006b82ba3c4245611da8d2db9fd785c482e1b61a9aa361c5c9a6d73387b0e15e6a7a3d84fffb3f65db3b9deeb` + +### 노드 바이너리 + +파일명 | sha512 해시 +-------- | ----------- +[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-node-linux-amd64.tar.gz) | `f714f80feecb0756410f27efb4cf4a1b5232be0444fbecec9f25cb85a7ccccdcb5be588cddee935294f460046c0726b90f7acc52b20eeb0c46a7200cf10e351a` +[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-node-linux-arm.tar.gz) | `806000b5f6d723e24e2f12d19d1b9b3d16c74b855f51c7063284adf1fcc57a96554a3384f8c05a952c6f6b929a05ed12b69151b1e620c958f74c9600f3db0fcb` +[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-node-linux-arm64.tar.gz) | `c207e9ab60587d135897b5366af79efe9d2833f33401e469b2a4e0d74ecd2cf6bb7d1e5bc18d80737acbe37555707f63dd581ccc6304091c1d98dafdd30130b7` +[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-node-linux-ppc64le.tar.gz) | `a542ed5ed02722af44ef12d1602f363fcd4e93cf704da2ea5d99446382485679626835a40ae2ba47a4a26dce87089516faa54479a1cfdee2229e8e35aa1c17d7` +[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-node-linux-s390x.tar.gz) | `651e0db73ee67869b2ae93cb0574168e4bd7918290fc5662a6b12b708fa628282e3f64be2b816690f5a2d0f4ff8078570f8187e65dee499a876580a7a63d1d19` +[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.18.0/kubernetes-node-windows-amd64.tar.gz) | `d726ed904f9f7fe7e8831df621dc9094b87e767410a129aa675ee08417b662ddec314e165f29ecb777110fbfec0dc2893962b6c71950897ba72baaa7eb6371ed` + +## v1.17.0 이후 체인지로그 + +릴리스 노트의 전체 체인지로그는 이제 [https://relnotes.k8s.io][1]에서 사용자 정의 가능한 +형식으로 호스팅된다. 확인하고 의견을 보내주기 +바란다! + +[1]: https://relnotes.k8s.io/?releaseVersions=1.18.0 + +## 새로운 소식 (주요 테마) + +### 쿠버네티스 토폴로지 매니저가 베타로 전환 - 정렬! + +릴리스 1.18의 쿠버네티스 베타 기능인 [토폴로지 매니저 기능](https://github.com/nolancon/website/blob/f4200307260ea3234540ef13ed80de325e1a7267/content/en/docs/tasks/administer-cluster/topology-manager.md)은 저-지연(low-latency)에 최적화된 환경에서 워크로드를 실행할 수 있도록 CPU 및 장치(예: SR-IOV VF)를 NUMA 정렬 할 수 있다. 토폴로지 매니저가 도입되기 전에, CPU와 장치 관리자는 서로 독립적으로 리소스 할당 결정을 내렸다. 이로 인해 다중-소켓 시스템에 의도하지 않은 할당이 발생하여, 지연에 민감한 애플리케이션의 성능을 저하시킬 수 있었다. + +### 서버 사이드(server-side) 적용 - 베타 2 + +서버-사이드 적용은 1.16에서 베타로 승격되었지만, 1.18에서 두 번째 베타가 도입된다. 이 새 버전은 모든 새로운 쿠버네티스 오브젝트의 필드 변경 사항을 추적하고 관리하여, 리소스의 변경된 부분과 시기를 알 수 있다. + +### 인그레스 확장 및 IngressClass로 사용 중단(deprecated) 어노테이션을 교체 + +쿠버네티스 1.18에서 인그레스에 두 가지 중요한 추가 사항이 있는데, 그것은 새로운 `pathType` 필드와 새로운 `IngressClass` 리소스이다. `pathType` 필드는 경로(path)를 일치시키는 방법을 지정한다. 기본 `ImplementationSpecific` 유형 외에도 새로운 `Exact` 와 `Prefix` 경로 유형이 있다. + +`IngressClass` 리소스는 쿠버네티스 클러스터 내에서 인그레스 유형을 설명하는 데 사용된다. 인그레스는 인그레스에서 새로운 `ingressClassName` 필드를 사용하여 연관된 클래스를 지정할 수 있다. 이 새 리소스와 필드는 사용 중단된 `kubernetes.io/ingress.class` 어노테이션을 대체한다. + +### SIG CLI의 kubectl 디버그 소개 + +SIG CLI는 이미 오랫동안 디버그 유틸리티의 필요성에 대해 논의하고 있었다. [임시(ephemeral) 컨테이너](https://kubernetes.io/ko/docs/concepts/workloads/pods/ephemeral-containers/)가 개발되면서, `kubectl exec` 위에 구축된 도구를 통해 개발자를 지원할 수 있는 방법이 더욱 분명해졌다. `kubectl debug` [커맨드](https://github.com/kubernetes/enhancements/blob/master/keps/sig-cli/20190805-kubectl-debug.md) 추가(알파이지만 피드백은 언제나 환영)로 개발자는 클러스터 내에서 파드를 쉽게 디버깅할 수 있다. 우리는 이 추가 기능이 매우 유용하다고 생각한다. 이 커맨드를 사용하면 검사하려는 파드 바로 옆에서 실행되는 임시 컨테이너를 만들 수 있고, 대화식 문제 해결을 위해 콘솔에 연결할 수도 있다. + +### 쿠버네티스를 위한 윈도우 CSI 지원 알파 소개 + +쿠버네티스 1.18 릴리스에서는 윈도우 용 CSI 프록시(CSI Proxy)의 알파 버전이 릴리스 된다. CSI 프록시를 사용하면 권한이 없는(사전 승인된) 컨테이너가 윈도우에서 권한이 있는 스토리지 작업을 수행할 수 있다. CSI 프록시를 활용하여 윈도우에서 CSI 드라이버를 지원할 수 있다. +SIG 스토리지는 1.18 릴리스에서 많은 진전을 이루었다. +특히, 다음 스토리지 기능이 쿠버네티스 1.18에서 GA 되었다. +- 원시(Raw) 블록 지원: 볼륨을 마운트된 파일시스템 대신, 컨테이너 내에 블록 장치로 표시할 수 있다. +- 볼륨 복제: CSI를 통해 쿠버네티스 API를 사용하여 퍼시스턴트볼륨클레임(PersistentVolumeClaim) 및 기본 스토리지 볼륨을 복제한다. +- CSIDriver 쿠버네티스 API 오브젝트: CSI 드라이버 검색을 단순화하고 CSI 드라이버가 쿠버네티스 동작을 사용자 정의할 수 있게 한다. + +SIG 스토리지는 쿠버네티스 1.18에서 다음과 같은 새로운 스토리지 기능을 알파로 도입했다. +- 윈도우 CSI 지원: 새로운 [CSIProxy](https://github.com/kubernetes-csi/csi-proxy)를 통해 윈도우에서 컨테이너화 된 CSI 노드 플러그인 활성화한다. +- 재귀 볼륨 소유권 OnRootMismatch 옵션: 소유권 변경이 필요하고 많은 디렉터리와 파일이 있는 볼륨의 마운트 시간을 단축할 수 있는 새로운 “OnRootMismatch” 정책을 추가한다. + +### 다른 중요한 발표 + +새로운 CI 작업으로 테스트 커버리지를 크게 늘린 이후, SIG 네트워크는 쿠버네티스 1.18에서 IPv6를 베타로 전환한다. + +NodeLocal DNSCache는 dnsCache 파드를 데몬셋으로 실행하여 clusterDNS 성능과 안정성을 향상시키는 애드온이다. 이 기능은 1.13 릴리스 이후 알파 버전으로 존재해왔다. SIG 네트워크는 Node Local DNSCache [#1351](https://github.com/kubernetes/enhancements/pull/1351)의 GA를 발표한다. + +## 알려진 이슈 + +알려진 이슈가 보고되지 않음 + +## 긴급 업그레이드 노트 + +### (업그레이드하기 전에 반드시 읽어야 한다) + +#### kube-apiserver: +- `--encryption-provider-config` 설정 파일에서, 명시적인 `cacheSize: 0` 파라미터는 이전에는 묵시적으로 1000개의 키를 캐싱하도록 기본으로 설정되었다. 쿠버네티스 1.18에서 이것은 이제 설정 유효성 검사 오류를 반환한다. 캐싱을 비활성화하려면 쿠버네티스 1.18 이상에서 음의 cacheSize 값을 지정할 수 있다. +- 'certificatesigningrequests/approval' API 사용자는 이제 CSR이 요청한 특정 서명자(signer)에 대해 CSR을 '승인'할 권한이 있어야 한다. 새 signerName 필드 및 필수 권한 부여에 대한 자세한 정보는 https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests#authorization ([#88246](https://github.com/kubernetes/kubernetes/pull/88246), [@munnerz](https://github.com/munnerz)) [SIG API Machinery, 앱, 인증, CLI, 노드 및 테스트] 에서 확인할 수 있다. +- 다음 기능은 무조건 활성화되며, 다음의 `--feature-gates`의 플래그가 제거되었다. `PodPriority`, `TaintNodesByCondition`, `ResourceQuotaScopeSelectors` 및 `ScheduleDaemonSetPods` ([#86210](https://github.com/kubernetes/kubernetes/pull/86210), [@draveness](https://github.com/draveness)) [SIG 앱과 스케줄] + +#### kubelet: +- `--enable-cadvisor-endpoints` 는 이제 기본적으로 비활성화되어 있다. cAdvisor v1 Json API에 접근해야 하는 경우, kubelet 커맨드 라인에서 명시적으로 활성화한다. 이 플래그는 1.15에서 사용 중단되었으며 1.19에서 제거될 것이다. ([#87440](https://github.com/kubernetes/kubernetes/pull/87440), [@dims](https://github.com/dims)) [SIG Instrumentation, 노드 및 테스트] +- CSIMigrationOpenStack을 베타로 승격한다(OpenStack Cinder CSI 드라이버를 설치해야 하므로 기본적으로 해제되어 있다). 인-트리(in-tree) AWS OpenStack Cinder 드라이버 "kubernetes.io/cinder"는 1.16에서 사용 중단되었으며, 1.20에서 제거될 것이다. 사용자는 CSIMigration + CSIMigrationOpenStack 기능을 활성화하고 OpenStack Cinder CSI 드라이버 (https://github.com/kubernetes-sigs/cloud-provider-openstack)를 설치하여 기존 파드와 PVC 오브젝트가 중단되지 않도록 해야한다. 사용자는 새 볼륨에 대해 OpenStack Cinder CSI 드라이버를 직접 사용해야 한다. ([#85637](https://github.com/kubernetes/kubernetes/pull/85637), [@dims](https://github.com/dims)) [SIG 클라우드 공급자] + +#### kubectl: +- `kubectl` 및 k8s.io/client-go의 기본값은 더 이상 `http://localhost:8080`의 서버 주소가 아니다. 이러한 레거시 클러스터 중 하나를 소유한 경우, 서버를 안전하게 보호하는 것을 *강력히* 권장한다. 서버를 보호할 수 없다면, `$KUBERNETES_MASTER` 환경 변수를 `http://localhost:8080`으로 설정하여 서버 주소의 기본값을 계속 유지할 수 있다. `kubectl` 사용자는 `--server` 플래그를 사용하거나 `--kubeconfig` 또는 `$KUBECONFIG`를 통해 지정된 kubeconfig 파일에서 서버 주소를 설정할 수도 있다. ([#86173](https://github.com/kubernetes/kubernetes/pull/86173), [@soltysh](https://github.com/soltysh)) [SIG API Machinery, CLI 및 테스트] +- `kubectl run`은 파드 생성과 관련이 없는 플래그와 함께, 이전에 사용 중단된 생성기(generator)를 삭제했다. `kubectl run`은 이제 파드만 생성한다. 파드 이외의 오브젝트를 만드려면, 특정 `kubectl create` 하위 커맨드를 참조한다. +([#87077](https://github.com/kubernetes/kubernetes/pull/87077), [@soltysh](https://github.com/soltysh)) [SIG Architecture, CLI 및 테스트] +- 사용 중단된 커맨드 `kubectl rolling-update`는 삭제되었다. ([#88057](https://github.com/kubernetes/kubernetes/pull/88057), [@julianvmodesto](https://github.com/julianvmodesto)) [SIG 아키텍처, CLI 및 테스트] + +#### client-go: +- 생성된 클라이언트 세트, 동적, 메타데이터 및 스케일 클라이언트의 메소드에 대한 서명이 `context.Context`를 첫 번째 인수로 채택하도록 수정되었다. Create, Update 및 Patch 메소드의 서명이 각각 CreateOptions, UpdateOptions 및 PatchOptions를 허용하도록 업데이트되었다. Delete 및 DeleteCollection 메소드의 서명은 이제 참조 대신 값으로 DeleteOptions를 허용한다. 이전 인터페이스를 사용하여 생성된 클라이언트 세트가 새로운 "사용 중단된" 패키지에 추가되어 새로운 API로 증분(incremental) 마이그레이션 할 수 있다. 사용 중단된 패키지는 1.21 릴리스에서 제거된다. http://sigs.k8s.io/clientgofix 에서 도구를 사용하여 새로운 서명에 대한 메소드 호출을 다시 쓸 수 있다. + +- 다음의 사용 중단된 메트릭이 제거되었다. 해당 메트릭으로 변환한다. + - 다음 교체 메트릭은 v1.14.0부터 제공된다. + - `rest_client_request_latency_seconds` -> `rest_client_request_duration_seconds` + - `scheduler_scheduling_latency_seconds` -> `scheduler_scheduling_duration_seconds ` + - `docker_operations` -> `docker_operations_total` + - `docker_operations_latency_microseconds` -> `docker_operations_duration_seconds` + - `docker_operations_errors` -> `docker_operations_errors_total` + - `docker_operations_timeout` -> `docker_operations_timeout_total` + - `network_plugin_operations_latency_microseconds` -> `network_plugin_operations_duration_seconds` + - `kubelet_pod_worker_latency_microseconds` -> `kubelet_pod_worker_duration_seconds` + - `kubelet_pod_start_latency_microseconds` -> `kubelet_pod_start_duration_seconds` + - `kubelet_cgroup_manager_latency_microseconds` -> `kubelet_cgroup_manager_duration_seconds` + - `kubelet_pod_worker_start_latency_microseconds` -> `kubelet_pod_worker_start_duration_seconds` + - `kubelet_pleg_relist_latency_microseconds` -> `kubelet_pleg_relist_duration_seconds` + - `kubelet_pleg_relist_interval_microseconds` -> `kubelet_pleg_relist_interval_seconds` + - `kubelet_eviction_stats_age_microseconds` -> `kubelet_eviction_stats_age_seconds` + - `kubelet_runtime_operations` -> `kubelet_runtime_operations_total` + - `kubelet_runtime_operations_latency_microseconds` -> `kubelet_runtime_operations_duration_seconds` + - `kubelet_runtime_operations_errors` -> `kubelet_runtime_operations_errors_total` + - `kubelet_device_plugin_registration_count` -> `kubelet_device_plugin_registration_total` + - `kubelet_device_plugin_alloc_latency_microseconds` -> `kubelet_device_plugin_alloc_duration_seconds` + - `scheduler_e2e_scheduling_latency_microseconds` -> `scheduler_e2e_scheduling_duration_seconds` + - `scheduler_scheduling_algorithm_latency_microseconds` -> `scheduler_scheduling_algorithm_duration_seconds` + - `scheduler_scheduling_algorithm_predicate_evaluation` -> `scheduler_scheduling_algorithm_predicate_evaluation_seconds` + - `scheduler_scheduling_algorithm_priority_evaluation` -> `scheduler_scheduling_algorithm_priority_evaluation_seconds` + - `scheduler_scheduling_algorithm_preemption_evaluation` -> `scheduler_scheduling_algorithm_preemption_evaluation_seconds` + - `scheduler_binding_latency_microseconds` -> `scheduler_binding_duration_seconds` + - `kubeproxy_sync_proxy_rules_latency_microseconds` -> `kubeproxy_sync_proxy_rules_duration_seconds` + - `apiserver_request_latencies` -> `apiserver_request_duration_seconds` + - `apiserver_dropped_requests` -> `apiserver_dropped_requests_total` + - `etcd_request_latencies_summary` -> `etcd_request_duration_seconds` + - `apiserver_storage_transformation_latencies_microseconds ` -> `apiserver_storage_transformation_duration_seconds` + - `apiserver_storage_data_key_generation_latencies_microseconds` -> `apiserver_storage_data_key_generation_duration_seconds` + - `apiserver_request_count` -> `apiserver_request_total` + - `apiserver_request_latencies_summary` + - 다음 교체 메트릭은 v1.15.0부터 제공된다. + - `apiserver_storage_transformation_failures_total` -> `apiserver_storage_transformation_operations_total` ([#76496](https://github.com/kubernetes/kubernetes/pull/76496), [@danielqsj](https://github.com/danielqsj)) [SIG API Machinery, 클러스터 라이프사이클, Instrumentation, 네트워크, 노드 및 스케줄링] + +## 종류(Kind)별 변경 + +### 사용 중단 + +#### kube-apiserver: +- 다음의 사용 중단된 API는 더 이상 제공되지 않는다. + - `apps/v1beta1`와 `apps/v1beta2`의 모든 리소스 대신 `apps/v1`을 사용한다. + - `extensions/v1beta1`의 `daemonsets`, `deployments`, `replicasets` 리소스 대신 `apps/v1`을 사용한다. + - `extensions/v1beta1`의 `networkpolicies` 리소스 대신 `networking.k8s.io/v1`을 사용한다. + - `extensions/v1beta1`의 `podsecuritypolicies`의 리소스 대신 `policy/v1beta1`을 사용한다. ([#85903](https://github.com/kubernetes/kubernetes/pull/85903), [@liggitt](https://github.com/liggitt)) [SIG API Machinery, 앱, 클러스터 라이프사이클, Instrumentation 및 테스트] + +#### kube-controller-manager: +- Azure 서비스 어노테이션 service.beta.kubernetes.io/azure-load-balancer-disable-tcp-reset은 사용 중단되었다. 향후 릴리스에서는 지원이 제거될 것이다. ([#88462](https://github.com/kubernetes/kubernetes/pull/88462), [@feiskyer](https://github.com/feiskyer)) [SIG 클라우드 공급자] + +#### kubelet: +- StreamingProxyRedirects 기능과 `--redirect-container-streaming` 플래그는 사용 중단되었으며, 향후 릴리스에서 제거될 예정이다. 디폴트 동작 (kubelet을 통한 프록시 스트리밍 요청)이 유일하게 지원되는 옵션이다. `--redirect-container-streaming=true`로 설정하는 경우, 이 설정으로부터 마이그레이션 해야 한다. v1.20부터는 이 플래그를 더 이상 사용할 수 없다. 플래그를 설정하지 않으면, 아무것도 할 필요가 없다. ([#88290](https://github.com/kubernetes/kubernetes/pull/88290), [@tallclair](https://github.com/tallclair)) [SIG API Machinery와 노드] +- `/metrics/resource/v1alpha1` 리소스 메트릭 엔드포인트와 이 엔드포인트 이하 모든 메트릭은 사용 중단되었다. `/metrics/resource` 엔드포인트에서 생성된 다음의 메트릭으로 변환해야 한다. + - scrape_error --> scrape_error + - node_cpu_usage_seconds_total --> node_cpu_usage_seconds + - node_memory_working_set_bytes --> node_memory_working_set_bytes + - container_cpu_usage_seconds_total --> container_cpu_usage_seconds + - container_memory_working_set_bytes --> container_memory_working_set_bytes + - scrape_error --> scrape_error + ([#86282](https://github.com/kubernetes/kubernetes/pull/86282), [@RainbowMango](https://github.com/RainbowMango)) [SIG 노드] +- 향후 릴리스에서, kubelet은 CSI 명세에 따라 더 이상 CSI NodePublishVolume 대상 디렉터리를 만들지 않는다. 대상 경로를 적절하게 생성하고 처리하려면 CSI 드라이버를 상황에 맞게 업데이트해야 한다. ([#75535](https://github.com/kubernetes/kubernetes/issues/75535)) [SIG 스토리지] + +#### kube-proxy: +- `--healthz-port`와 `--metrics-port` 플래그는 사용 중단되었으므로, 대신 `--healthz-bind-address`와 `--metrics-bind-address`를 사용한다. ([#88512](https://github.com/kubernetes/kubernetes/pull/88512), [@SataQiu](https://github.com/SataQiu)) [SIG 네트워크] +- kube-proxy에서 엔드포인트슬라이스(EndpointSlice)의 사용을 제어하기 위해 새로운 `EndpointSliceProxying` 기능 게이트가 추가되었다. 이 동작을 제어하는데 사용된 엔드포인트슬라이스 기능 게이트는 더 이상 kube-proxy에 영향을 미치지 않는다. 이 기능은 기본적으로 비활성화되어 있다. ([#86137](https://github.com/kubernetes/kubernetes/pull/86137), [@robscott](https://github.com/robscott)) + +#### kubeadm: +- `kubeadm upgrade node`에 대한 커맨드 라인 옵션 "kubelet-version"은 사용 중단되었으며 향후 릴리스에서 제거될 예정이다. ([#87942](https://github.com/kubernetes/kubernetes/pull/87942), [@SataQiu](https://github.com/SataQiu)) [SIG 클러스터 라이프사이클] +- `kubeadm alpha certs renew` 커맨드에서 실험용 플래그 `--use-api`의 사용을 중단한다. ([#88827](https://github.com/kubernetes/kubernetes/pull/88827), [@neolit123](https://github.com/neolit123)) [SIG 클러스터 라이프사이클] +- kube-dns는 사용 중단되었으며 향후 버전에서 지원되지 않는다. ([#86574](https://github.com/kubernetes/kubernetes/pull/86574), [@SataQiu](https://github.com/SataQiu)) [SIG 클러스터 라이프사이클] +- kubeadm-config 컨피그맵(ConfigMap)에 있는 `ClusterStatus` 구조체는 사용 중단되었으며, 향후 버전에서 제거될 예정이다. 제거될 때까지 kubeadm에 의해 유지 관리된다. 동일 정보는 `etcd`, `kube-apiserver` 파드 어노테이션, `kubeadm.kubernetes.io/etcd.advertise-client-urls`, `kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint`에서 각각 찾을 수 있다. ([#87656](https://github.com/kubernetes/kubernetes/pull/87656), [@ereslibre](https://github.com/ereslibre)) [SIG 클러스터 라이프사이클] + +#### kubectl: +- --dry-run 플래그의 boolean 값과 설정되지 않은 값은 사용 중단되었으며 이후 버전에서는 --dry-run=server|client|none 값이 필요하다. ([#87580](https://github.com/kubernetes/kubernetes/pull/87580), [@julianvmodesto](https://github.com/julianvmodesto)) [SIG CLI] +- `kubectl apply --server-dry-run` 은 사용 중단되었으며 --dry-run=server로 대체되었다. ([# 87580] (https://github.com/kubernetes/kubernetes/pull/87580), [@julianvmodesto](https://github.com/julianvmodesto) [SIG CLI] + +#### add-ons: +- 클러스터-모니터링 애드온을 제거한다. ([#85512](https://github.com/kubernetes/kubernetes/pull/85512), [@serathius](https://github.com/serathius)) [SIG 클러스터 라이프사이클, Instrumentation, 확장성, 테스트] + +#### kube-scheduler: +- `scheduling_duration_seconds` 요약 메트릭은 사용 중단되었다. ([#86586](https://github.com/kubernetes/kubernetes/pull/86586), [@xiaoanyunfei](https://github.com/xiaoanyunfei)) [SIG 스케줄링] +- `scheduling_algorithm_predicate_evaluation_seconds`, + `scheduling_algorithm_priority_evaluation_seconds` 메트릭은 사용 중단되었으며, `framework_extension_point_duration_seconds[extension_point="Filter"]`, `framework_extension_point_duration_seconds[extension_point="Score"]`으로 대체되었다. ([#86584](https://github.com/kubernetes/kubernetes/pull/86584), [@xiaoanyunfei](https://github.com/xiaoanyunfei)) [SIG 스케줄링] +- 스케줄러 정책 API에서 `AlwaysCheckAllPredicates`는 사용 중단되었다. ([#86369](https://github.com/kubernetes/kubernetes/pull/86369), [@Huang-Wei](https://github.com/Huang-Wei)) [SIG 스케줄링] + +#### 기타 사용 중단: +- k8s.io/node-api 컴포넌트는 더 이상 업데이트되지 않는다. 대신, k8s.io/api의 RuntimeClass 타입과 k8s.io/client-go의 생성된 클라이언트를 사용한다. ([#87503](https://github.com/kubernetes/kubernetes/pull/87503), [@liggitt](https://github.com/liggitt)) [SIG 노드와 릴리스] +- apiserver_request_total에서 'client' 레이블을 제거했다. ([#87669](https://github.com/kubernetes/kubernetes/pull/87669), [@logicalhan](https://github.com/logicalhan)) [SIG API Machinery 와 Instrumentation] + +### API 변경 + +#### 새로운 API 타입/버전: +- 새로운 IngressClass 리소스가 추가되어 보다 나은 인그레스 구성이 가능하다. ([#88509](https://github.com/kubernetes/kubernetes/pull/88509), [@robscott](https://github.com/robscott)) [SIG API Machinery, 앱, CLI, 네트워크, 노드, 테스트] +- CSIDriver API는 storage.k8s.io/v1을 졸업했으며, 이제 사용이 가능하다. ([#84814](https://github.com/kubernetes/kubernetes/pull/84814), [@huffmanca](https://github.com/huffmanca)) [SIG 스토리지] + +#### 새로운 API 필드: +- autoscaling/v2beta2 HorizontalPodAutoscaler는 스케일 동작을 구성할 수 있는 `spec.behavior` 필드를 추가했다. 스케일 업과 다운에 대한 동작은 별도로 지정된다. 정책 목록과 정책 선택 방법 뿐만 아니라, 양 방향에서 안정화 윈도우를 지정할 수 있다. 정책은 추가되거나 제거되는 절대 파드 개수 또는 파드 비율을 제한할 수 있다.] ([#74525](https://github.com/kubernetes/kubernetes/pull/74525), [@gliush](https://github.com/gliush)) [SIG API Machinery, 앱, 오토스케일링, CLI] +- 인그레스: + - `spec.ingressClassName`은 사용 중단된 `kubernetes.io/ingress.class` 어노테이션을 대체하고, 인그레스 오브젝트를 특정 컨트롤러와 연결할 수 있게 한다. + - 경로 정의는 `pathType` 필드를 추가했는데, 지정 경로가 유입되는 요청과 어떻게 일치해야 하는지 표시하는 것을 허용한다. 유효한 값은 `Exact`, `Prefix`, `ImplementationSpecific` 이다. ([#88587](https://github.com/kubernetes/kubernetes/pull/88587), [@cmluciano](https://github.com/cmluciano)) [SIG 앱, 클러스터 라이프사이클과 네트워크] +- 알파 기능인 `AnyVolumeDataSource`는 퍼시스턴트볼륨클레임 오브젝트가 spec.dataSource 필드를 사용하여 사용자 정의 유형을 데이터 소스로 참조할 수 있도록 한다. ([#88636](https://github.com/kubernetes/kubernetes/pull/88636), [@bswartz](https://github.com/bswartz)) [SIG 앱, 스토리지] +- 알파 기능인 `ConfigurableFSGroupPolicy`는 v1 파드가 spec.securityContext.fsGroupChangePolicy 정책을 지정하여 파드에 마운트된 볼륨에 파일 권한이 적용되는 방식을 제어할 수 있다. ([#88488](https://github.com/kubernetes/kubernetes/pull/88488), [@gnufied](https://github.com/gnufied)) [SIG 스토리지] +- 알파 기능인 `ServiceAppProtocol`을 사용하면 ServicePort 및 EndpointPort 정의에서 `appProtocol` 필드를 설정할 수 있다. ([#88503](https://github.com/kubernetes/kubernetes/pull/88503), [@robscott](https://github.com/robscott)) [SIG 앱, 네트워크] +- 알파 기능인 `ImmutableEphemeralVolumes`는 시크릿(Secret) 및 컨피그맵 오브젝트의 `immutable` 필드를 통해 내용을 변경할 수 없는(immutable) 것으로 표시할 수 있다. ([#86377](https://github.com/kubernetes/kubernetes/pull/86377), [@wojtek-t](https://github.com/wojtek-t)) [SIG 앱, CLI, 테스팅] + +#### 다른 API 변경: +- 베타 기능인 `ServerSideApply`는 모든 새로운 오브젝트에 대해 변경된 필드를 추적하고 관리할 수 있게 해준다. 이는 관리자와 그것의 자체 필드에 대한 목록과 함께 `metadata`에 `managedFields`가 있음을 의미한다. +- 알파 기능인 `ServiceAccountIssuerDiscovery`는 서비스 어카운트 토큰을 발행하도록 구성된 API 서버에 의해 `/.well-known/openid-configuration` 및 `/openid/v1/jwks` 엔드포인트에 위치한 OIDC 디스커버리 정보 및 서비스 어카운트 토큰 검증 키를 공개할 수 있게 한다. ([#80724](https://github.com/kubernetes/kubernetes/pull/80724), [@cceckman](https://github.com/cceckman)) [SIG API Machinery, 인증, 클러스터 라이프사이클, 테스트] +- `x-kubernetes-list-map-keys`를 사용하여 목록 아이템을 고유하게 식별하는 속성을 지정하는 커스텀리소스데피니션(CustomResourceDefinition) 스키마는 해당 속성이 모든 목록 아이템에 존재하도록 하기 위해, 해당 속성을 필수로 설정하거나 기본값을 가져야 한다. 자세한 내용은 https://kubernetes.io/docs/reference/using-api/api-concepts/#merge-strategy 를 확인한다. ([#88076](https://github.com/kubernetes/kubernetes/pull/88076), [@eloyekunle](https://github.com/eloyekunle)) [SIG API Machinery, 테스트] +- `x-kubernetes-list-type: map` 또는 `x-kubernetes-list-type: set`을 사용하는 커스텀리소스데피니션 스키마는 이제 해당 커스텀 리소스의 목록 아이템이 고유한지 확인할 수 있다. ([#84920](https://github.com/kubernetes/kubernetes/pull/84920), [@sttts](https://github.com/sttts)) [SIG API Machinery] + +#### 설정 파일 변경: + +#### kube-apiserver: +- `--egress-selector-config-file` 설정 파일은 이제 apiserver.k8s.io/v1beta1 EgressSelectorConfiguration 설정 오브젝트를 수용하며, 네트워크 프록시에 대한 HTTP 또는 GRPC 연결을 지정할 수 있도록 업데이트되었다. ([#87179](https://github.com/kubernetes/kubernetes/pull/87179), [@Jefftree](https://github.com/Jefftree)) [SIG API Machinery, 클라우드 공급자, 클러스터 라이프사이클] + +#### kube-scheduler: +- 다중 스케줄링 프로파일을 지원하는 kubescheduler.config.k8s.io/v1alpha2 설정 파일 버전이 승인되었다. ([#87628](https://github.com/kubernetes/kubernetes/pull/87628), [@alculquicondor](https://github.com/alculquicondor)) [SIG 스케줄링] + - `kubescheduler.config.k8s.io/v1alpha2`에서 HardPodAffinityWeight가 최상위 ComponentConfig 파라미터에서 InterPodAffinity 플러그인의 PluginConfig 파라미터로 이동했다. ([#88002](https://github.com/kubernetes/kubernetes/pull/88002), [@alculquicondor](https://github.com/alculquicondor)) [SIG 스케줄링, 테스트] + - Kube-scheduler는 둘 이상의 스케줄링 프로파일을 실행할 수 있다. 파드가 주어지면, 프로파일은 `.spec.schedulerName`을 사용하여 선택된다. ([#88285](https://github.com/kubernetes/kubernetes/pull/88285), [@alculquicondor](https://github.com/alculquicondor)) [SIG 앱, 스케줄링, 테스트] + - v1alpha2 컴포넌트 설정에서 스케줄러 확장자(Scheduler Extender)를 설정할 수 있다. ([#88768](https://github.com/kubernetes/kubernetes/pull/88768), [@damemi](https://github.com/damemi)) [SIG 릴리스, 스케줄링, 테스트] + - 스케줄러 프레임워크의 PostFilter는 kubescheduler.config.k8s.io/v1alpha2에서 PreScore로 이름이 변경되었다. ([#87751](https://github.com/kubernetes/kubernetes/pull/87751), [@skilxn-go](https://github.com/skilxn-go)) [SIG 스케줄링, 테스트] + +#### kube-proxy: +- IPVS 연결 타임아웃을 설정하기 위해 kube-proxy 플래그 `--ipvs-tcp-timeout`, `--ipvs-tcpfin-timeout`, `--ipvs-udp-timeout`을 추가했다. ([#85517](https://github.com/kubernetes/kubernetes/pull/85517), [@andrewsykim](https://github.com/andrewsykim)) [SIG 클러스터 라이프사이클, 네트워크] +- kube-proxy에 옵션 `--detect-local-mode` 플래그를 추가했다. 유효한 값은 "ClusterCIDR"(기본값은 이전 동작과 일치)과 "NodeCIDR"이다. ([#87748](https://github.com/kubernetes/kubernetes/pull/87748), [@satyasm](https://github.com/satyasm)) [SIG 클러스터 라이프사이클, 네트워크, 스케줄링] +- Kube-controller-manager와 kube-scheduler는 기본적으로 kube-apiserver와 일치하도록 프로파일링을 노출한다. 비활성화하려면 `--enable-profiling=false`를 사용한다. ([#88663](https://github.com/kubernetes/kubernetes/pull/88663), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, 클라우드 공급자, 스케줄링] +- Kubelet 파드 리소스 API는 이제 활성화(active)된 파드에 대한 정보만 제공한다. ([#79409](https://github.com/kubernetes/kubernetes/pull/79409), [@takmatsu](https://github.com/takmatsu)) [SIG 노드] +- kube-controller-manager의 새로운 플래그 `--endpointslice-updates-batch-period`를 사용하여 파드 변경으로 생성된 엔드포인트슬라이스 업데이트 수를 줄일 수 있다. ([#88745](https://github.com/kubernetes/kubernetes/pull/88745), [@mborsz](https://github.com/mborsz)) [SIG API Machinery, 앱, 네트워크] +- kube-proxy, kubelet, kube-controller-manager 및 kube-scheduler의 새로운 플래그 `--show-hidden-metrics-for-version`은 이전 마이너 릴리스에서 사용 중단된 모든 숨겨진 메트릭을 표시하는 데 사용할 수 있다. ([#85279](https://github.com/kubernetes/kubernetes/pull/85279), [@RainbowMango](https://github.com/RainbowMango)) [SIG 클러스터 라이프사이클, 네트워크] + +#### 베타가 된 기능: + - StartupProbe ([#83437](https://github.com/kubernetes/kubernetes/pull/83437), [@matthyx](https://github.com/matthyx)) [SIG 노드, Scalability, 테스트] + +#### GA 된 기능: + - VolumePVCDataSource ([#88686](https://github.com/kubernetes/kubernetes/pull/88686), [@j-griffith](https://github.com/j-griffith)) [SIG 스토리지] + - TaintBasedEvictions ([#87487](https://github.com/kubernetes/kubernetes/pull/87487), [@skilxn-go](https://github.com/skilxn-go)) [SIG API Machinery, 앱, 노드, 스케줄링, 테스트] + - BlockVolume 및 CSIBlockVolume ([#88673](https://github.com/kubernetes/kubernetes/pull/88673), [@jsafrane](https://github.com/jsafrane)) [SIG 스토리지] + - 윈도우 RunAsUserName ([#87790](https://github.com/kubernetes/kubernetes/pull/87790), [@marosset](https://github.com/marosset)) [SIG 앱 및 윈도우] +- 이전 릴리스에서는 관련 기능이 무조건 활성화되었으므로, 다음 기능 게이트가 제거되었다. CustomResourceValidation, CustomResourceSubresources, CustomResourceWebhookConversion, CustomResourcePublishOpenAPI, CustomResourceDefaulting ([#87475](https://github.com/kubernetes/kubernetes/pull/87475), [@liggitt](https://github.com/liggitt)) [SIG API Machinery] + +### 기능 + +- (많은 요청으로 인한) API 요청량 제한이 이제 로그 레벨 2의 client-go 로그에 리포트 된다. 메시지는 `Throttling request took 1.50705208s, request: GET:` 형태이다. 이러한 메시지가 있으면 관리자에게 클러스터를 적절히 조정해야 함을 알릴 수 있다. ([#87740](https://github.com/kubernetes/kubernetes/pull/87740), [@jennybuckley](https://github.com/jennybuckley)) [SIG API Machinery] +- FC 볼륨 플러그인에 마운트 옵션 지원이 추가된다. ([#87499](https://github.com/kubernetes/kubernetes/pull/87499), [@ejweber](https://github.com/ejweber)) [SIG 스토리지] +- 이용자 그룹(audience) 클레임의 spn: 접두사 없이 AAD 토큰을 가져올 수 있도록 azure 인증 모듈에 config-mode 플래그를 추가한다. 지정하지 않으면, 디폴트 동작이 변경되지 않는다. ([#87630](https://github.com/kubernetes/kubernetes/pull/87630), [@weinong](https://github.com/weinong)) [SIG API Machinery, 인증, CLI, 클라우드 공급자] +- CoreDNS 레플리카 개수 설정을 허용한다. ([#85837](https://github.com/kubernetes/kubernetes/pull/85837), [@pickledrick](https://github.com/pickledrick)) [SIG 클러스터 라이프사이클] +- kubectl exec 호출 시 --filename 플래그를 사용하여 리소스를 지정할 수 있도록 허용 ([#88460](https://github.com/kubernetes/kubernetes/pull/88460), [@soltysh](https://github.com/soltysh)) [SIG CLI, 테스트] +- Apiserver는 HTTP/2 클라이언트가 단일 apiserver에 갇히는 것을 방지하기 위해 그레이스풀(GOAWAY)하게 닫히게 하는 요청의 일부인 새로운 플래그 --goaway-chance를 추가했다. ([#88567](https://github.com/kubernetes/kubernetes/pull/88567), [@answer1991](https://github.com/answer1991)) [SIG API Machinery] +- Azure 클라우드 공급자는 이제 쿠버네티스 클러스터와 다른 AAD 테넌트 및 구독에서 Azure 네트워크 리소스(가상 네트워크, 로드 밸런서, 퍼블릭 IP, 라우팅 테이블, 네트워크 보안 그룹 등) 사용을 지원한다. 이 기능을 사용하려면, 다음을 참고한다. https://github.com/kubernetes-sigs/cloud-provider-azure/blob/master/docs/cloud-provider-config.md#host-network-resources-in-different-aad-tenant-and-subscription. ([#88384](https://github.com/kubernetes/kubernetes/pull/88384), [@bowen5](https://github.com/bowen5)) [SIG 클라우드 공급자] +- Azure VMSS/VMSSVM 클라이언트는 이제 스로틀링(throttling) 요청을 금지한다. ([#86740](https://github.com/kubernetes/kubernetes/pull/86740), [@feiskyer](https://github.com/feiskyer)) [SIG 클라우드 공급자] +- Azure 클라우드 공급자 캐시 TTL은 설정 가능하며, Azure 클라우드 공급자 목록은 다음과 같다. + - "availabilitySetNodesCacheTTLInSeconds" + - "vmssCacheTTLInSeconds" + - "vmssVirtualMachinesCacheTTLInSeconds" + - "vmCacheTTLInSeconds" + - "loadBalancerCacheTTLInSeconds" + - "nsgCacheTTLInSeconds" + - "routeTableCacheTTLInSeconds" + ([#86266](https://github.com/kubernetes/kubernetes/pull/86266), [@zqingqing1](https://github.com/zqingqing1)) [SIG 클라우드 공급자] +- Azure 글로벌 속도 제한(rate limit)은 클라이언트별로 전환된다. 새로운 속도 제한 설정 옵션이 도입되었고, 다음과 같다. routeRateLimit, SubnetsRateLimit, InterfaceRateLimit, RouteTableRateLimit, LoadBalancerRateLimit, PublicIPAddressRateLimit, SecurityGroupRateLimit, VirtualMachineRateLimit, StorageAccountRateLimit, DiskRateLimit, SnapshotRateLimit, VirtualMachineScaleSetRateLimit, VirtualMachineSizeRateLimit. 원래 속도 제한 옵션은 새 클라이언트의 속도 리미터(limiter)의 디폴트 값이다. ([#86515](https://github.com/kubernetes/kubernetes/pull/86515), [@feiskyer](https://github.com/feiskyer)) [SIG 클라우드 공급자] +- Azure 네트워크 및 VM 클라이언트가 이제 스로틀링 요청을 금지한다. ([#87122](https://github.com/kubernetes/kubernetes/pull/87122), [@feiskyer](https://github.com/feiskyer)) [SIG 클라우드 공급자] +- Azure 스토리지 클라이언트가 이제 스로틀링 요청을 금지한다. ([#87306](https://github.com/kubernetes/kubernetes/pull/87306), [@feiskyer](https://github.com/feiskyer)) [SIG 클라우드 공급자] +- Azure: 단일 스택 IPv6에 대한 지원을 추가한다. ([#88448](https://github.com/kubernetes/kubernetes/pull/88448), [@aramase](https://github.com/aramase)) [SIG 클라우드 공급자] +- 스케줄러의 ComponentConfig에서 PodTopologySpread 플러그인에 대한 DefaultConstraints를 지정할 수 있다. ([#88671](https://github.com/kubernetes/kubernetes/pull/88671), [@alculquicondor](https://github.com/alculquicondor)) [SIG 스케줄링] +- VMSS 클러스터의 VM list 작업을 피하기 위해 DisableAvailabilitySetNodes가 추가되었다. vmType이 "vmss"이고 모든 노드(컨트롤 플레인 노드 포함)가 VMSS 가상 머신인 경우에만 사용해야 한다. ([#87685](https://github.com/kubernetes/kubernetes/pull/87685), [@feiskyer](https://github.com/feiskyer)) [SIG 클라우드 공급자] +- Elasticsearch는 advertise 주소 자동 설정을 지원한다. ([#85944](https://github.com/kubernetes/kubernetes/pull/85944), [@SataQiu](https://github.com/SataQiu)) [SIG 클러스터 라이프사이클, Instrumentation] +- 엔드포인트슬라이스가 이제 디폴트로 활성화된다. 새로운 `EndpointSliceProxying` 기능 게이트는 kube-proxy가 엔드포인트슬라이스를 사용할지 여부를 결정하며, 디폴트로 비활성화되어 있다. ([#86137](https://github.com/kubernetes/kubernetes/pull/86137), [@robscott](https://github.com/robscott)) [SIG 네트워크] +- Kube-proxy: iptables 프록시에 이중 스택 IPv4/IPv6 지원이 추가되었다. ([#82462](https://github.com/kubernetes/kubernetes/pull/82462), [@vllry](https://github.com/vllry)) [SIG 네트워크] +- Kubeadm은 이제 kube-controller-manager에 대한 이중 스택 노드 cidr 마스크의 자동 계산을 지원한다. ([#85609](https://github.com/kubernetes/kubernetes/pull/85609), [@Arvinderpal](https://github.com/Arvinderpal)) [SIG 클러스터 라이프사이클] +- Kubeadm: 잡(Job)을 배포하는 업그레이드된 헬스 체크를 추가한다. ([#81319](https://github.com/kubernetes/kubernetes/pull/81319), [@neolit123](https://github.com/neolit123)) [SIG 클러스터 라이프사이클] +- Kubeadm: 실험 기능 게이트 PublicKeysECDSA를 추가하여 "kubeadm init"에서 ECDSA 인증서가 있는 +클러스터를 생성할 수 있게 한다. "kubeadm alpha certs renew"을 사용하여 기존 ECDSA 인증서의 갱신도 지원되지만, 즉시 또는 업그레이드 중에 RSA와 ECDSA 알고리즘간에 전환하지는 않는다. ([#86953](https://github.com/kubernetes/kubernetes/pull/86953), [@rojkov](https://github.com/rojkov)) [SIG API Machinery, Auth 및 클러스터 라이프사이클] +- Kubeadm: JSON, YAML, Go 템플릿 및 JsonPath 형식으로 'kubeadm config images list' 커맨드의 구조화된 출력을 구현했다. ([#86810](https://github.com/kubernetes/kubernetes/pull/86810), [@bart0sh](https://github.com/bart0sh)) [SIG 클러스터 라이프사이클] +- Kubeadm: kubeconfig 인증서 갱신 시, 내장된 CA를 디스크의 CA와 동기화된 상태로 유지한다. ([#88052](https://github.com/kubernetes/kubernetes/pull/88052), [@neolit123](https://github.com/neolit123)) [SIG 클러스터 라이프사이클] +- Kubeadm: 같은 이름의 노드가 이미 존재하는 경우 클러스터에 조인하려는 노드를 거부한다. ([#81056](https://github.com/kubernetes/kubernetes/pull/81056), [@neolit123](https://github.com/neolit123)) [SIG 클러스터 라이프사이클] +- Kubeadm: kubeadm-flags.env에서 윈도우 특화된 kubelet 플래그를 지원한다. ([#88287](https://github.com/kubernetes/kubernetes/pull/88287), [@gab-satchi](https://github.com/gab-satchi)) [SIG 클러스터 라이프사이클, 윈도우] +- Kubeadm: 이미지를 가져오는 데 실패한 후 자동 재시도를 지원한다. ([#86899](https://github.com/kubernetes/kubernetes/pull/86899), [@SataQiu](https://github.com/SataQiu)) [SIG 클러스터 라이프사이클] +- Kubeadm: 알 수 없는 k8s 버전이 전달되면 가장 근접한 알려진 etcd 버전으로 폴백(fallback) 업그레이드를 지원한다. ([#88373](https://github.com/kubernetes/kubernetes/pull/88373), [@SataQiu](https://github.com/SataQiu)) [SIG 클러스터 라이프사이클] +- Kubectl/drain: 축출 비활성화(disable-eviction) 옵션을 추가한다. 축출이 지원되는 경우에도, 삭제하기 위해 강제로 드레인(drain)한다. 이것은 PodDisruptionBudgets 확인을 우회하므로 주의해서 사용해야 한다. ([#85571](https://github.com/kubernetes/kubernetes/pull/85571), [@michaelgugino](https://github.com/michaelgugino)) [SIG CLI] +- Kubectl/drain: skip-wait-for-delete-timeout 옵션을 추가한다. 파드의 `DeletionTimestamp`가 N초 보다 오래된 경우, 파드를 기다리는 것을 건너뛴다. 건너뛰려면 0초보다 커야 한다. ([#85577](https://github.com/kubernetes/kubernetes/pull/85577), [@michaelgugino](https://github.com/michaelgugino)) [SIG CLI] +- 사전 구성된 로드 밸런서의 Azure 클라우드 공급자에 `preConfiguredBackendPoolLoadBalancerTypes` 옵션이 추가됐다. 가능한 값: `""`, `"internal"`, `"external"`,`"all"` ([#86338](https://github.com/kubernetes/kubernetes/pull/86338), [@gossion](https://github.com/gossion)) [SIG 클라우드 공급자] +- PodTopologySpread 플러그인은 이제 스케줄링 결정을 할 때 terteringPod를 제외한다. ([#87845](https://github.com/kubernetes/kubernetes/pull/87845), [@Huang-Wei](https://github.com/Huang-Wei)) [SIG 스케줄링] +- 클라우드 공급자/azure : 네트워크 보안 그룹은 이제 별도의 리소스 그룹에 있을 수 있다. ([#87035](https://github.com/kubernetes/kubernetes/pull/87035), [@CecileRobertMichon](https://github.com/CecileRobertMichon)) [SIG 클라우드 공급자] +- SafeSysctlWhitelist: net.ipv4.ping_group_range를 추가한다. ([#85463](https://github.com/kubernetes/kubernetes/pull/85463), [@AkihiroSuda](https://github.com/AkihiroSuda)) [SIG 인증] +- 스케줄러 프레임워크 허용 플러그인은 이제 예약 플러그인 후 스케줄링 주기가 끝나는 시점에 플러그인이 실행된다. 바인딩 주기 시작 시 허가 대기 상태가 유지된다. ([#88199](https://github.com/kubernetes/kubernetes/pull/88199), [@mateuszlitwin](https://github.com/mateuszlitwin)) [SIG 스케줄링] +- 스케줄러: DefaultBinder 플러그인을 추가한다. ([#87430](https://github.com/kubernetes/kubernetes/pull/87430), [@alculquicondor](https://github.com/alculquicondor)) [SIG 스케줄링, 테스트] +- TopologySpreadConstraints를 정의하는 파드에 대한 디폴트 스프레드 스코어링(spreading scoring) 플러그인을 건너뛴다. ([#87566](https://github.com/kubernetes/kubernetes/pull/87566), [@skilxn-go](https://github.com/skilxn-go)) [SIG 스케줄링] +- kubectl --dry-run 플래그는 이제 클라이언트-사이드와 서버-사이드의 dry-run 전략을 지원하기 위해 'client', 'server', 'none' 값을 허용한다. --dry-run 플래그의 boolean 값과 설정되지 않은 값은 사용 중단(deprecated)되었으며 향후 버전에서는 값이 필요하다. ([#87580](https://github.com/kubernetes/kubernetes/pull/87580), [@julianvmodesto](https://github.com/julianvmodesto)) [SIG CLI] +- apply, patch, create, run, annotate, label, set, autoscale, drain, rollout undo, 그리고 expose를 포함한 명령에 대해 --dry-run=server를 사용하여 kubectl에서 서버-사이드 dry-run을 지원한다. ([#87714](https://github.com/kubernetes/kubernetes/pull/87714), [@julianvmodesto](https://github.com/julianvmodesto)) [SIG API Machinery, CLI, 테스트] +- --dry-run=server|client를 kubectl delete, taint, replace에 추가한다. ([#88292](https://github.com/kubernetes/kubernetes/pull/88292), [@julianvmodesto](https://github.com/julianvmodesto)) [SIG CLI, 테스트] +- PodTopologySpread(기능 게이트 `EvenPodsSpread`) 기능은 1.18에서 디폴트로 활성화되었다. ([#88105](https://github.com/kubernetes/kubernetes/pull/88105), [@Huang-Wei](https://github.com/Huang-Wei)) [SIG 스케줄링, 테스트] +- kubelet 및 디폴트 도커 런타임은 이제 대상 컨테이너의 리눅스 프로세스 네임스페이스에서 임시 컨테이너 실행을 지원한다. 다른 컨테이너 런타임은 이 기능에 대한 지원을 구현해야 해당 런타임에서 사용할 수 있다. ([#84731](https://github.com/kubernetes/kubernetes/pull/84731), [@verb](https://github.com/verb)) [SIG 노드] +- `CPUManager` 상태 파일의 기본 형식이 변경되었다. 업그레이드는 원활해야 하지만, 이전 형식을 참조하는 써드파티 도구는 업데이트해야 한다. ([#84462](https://github.com/kubernetes/kubernetes/pull/84462), [@klueska](https://github.com/klueska)) [SIG 노드, 테스트] +- CNI 버전을 v0.8.5로 업데이트한다. ([#78819](https://github.com/kubernetes/kubernetes/pull/78819), [@justaugustus](https://github.com/justaugustus)) [SIG API Machinery, 클러스터 라이프사이클, 네트워크, 릴리스, 테스트] +- Webhook은 네트워크 프록시를 알파 버전으로 지원한다. ([#85870](https://github.com/kubernetes/kubernetes/pull/85870), [@Jefftree](https://github.com/Jefftree)) [SIG API Machinery, 인증, 테스트] +- 클라이언트 인증서 파일이 제공되면, 새 연결을 위해 파일을 다시 로드하고 인증서가 변경되면 연결을 닫는다. ([#79083](https://github.com/kubernetes/kubernetes/pull/79083), [@jackkleeman](https://github.com/jackkleeman)) [SIG API Machinery, 인증, 노드, 테스트] +- --force 플래그로 kubectl을 사용하여 오브젝트를 삭제할 때, 더 이상 --grace-period=0을 지정할 필요가 없다. ([#87776](https://github.com/kubernetes/kubernetes/pull/87776), [@brianpursley](https://github.com/brianpursley)) [SIG CLI] +- GCE의 윈도우 노드는 컨트롤 플레인에 가상 TPM-기반 인증을 사용할 수 있다. ([#85466](https://github.com/kubernetes/kubernetes/pull/85466), [@pjh](https://github.com/pjh)) [SIG 클러스터 라이프사이클] +- 이제 "--node-ip ::"를 kubelet에 전달하여 노드의 기본 주소로 사용할 IPv6 주소를 자동으로 감지해야 함을 나타낼 수 있다. ([#85850](https://github.com/kubernetes/kubernetes/pull/85850), [@danwinship](https://github.com/danwinship)) [SIG 클라우드 공급자, 네트워크, 노드] +- `kubectl`은 이제 `kubectl alpha debug` 명령을 포함한다. 이 명령을 사용하면 디버깅 목적으로 임시 컨테이너를 실행 중인 파드에 연결할 수 있다. ([#88004](https://github.com/kubernetes/kubernetes/pull/88004), [@verb](https://github.com/verb)) [SIG CLI] +- kubeconfig 파일 및 kubectl의 --tls-server-name을 통해 TLS 서버 이름 재정의를 지정할 수 있다. ([#88769](https://github.com/kubernetes/kubernetes/pull/88769), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, 인증, CLI] + +#### 메트릭: +- `rest_client_rate_limiter_duration_seconds` 메트릭을 컴포넌트 기반에 추가하여 클라이언트 사이드 속도 제한기(rate limiter) 지연(latency)을 초 단위로 추적한다. 동사(verb)와 URL로 분류된다. ([#88134](https://github.com/kubernetes/kubernetes/pull/88134), [@jennybuckley](https://github.com/jennybuckley)) [SIG API Machinery, 클러스터 라이프사이클, Instrumentation] +- exec 인증에 대한 두 개의 클라이언트 인증서 메트릭을 추가했다. + - `rest_client_certificate_expiration_seconds`는 현재 클라이언트 인증서의 수명을 보고하는 측정기이다. UTC 1970년 1월 1일 이후 만료 시간을 초 단위로 보고한다. + - `rest_client_certificate_rotation_age`는 방금 교체한 클라이언트 인증서의 수명을 초 단위로 보고하는 히스토그램이다. ([#84382](https://github.com/kubernetes/kubernetes/pull/84382), [@sambdavidson](https://github.com/sambdavidson)) [SIG API Machinery, 인증, 클러스터 라이프사이클, Instrumentation] +- 컨트롤러 관리자는 작업큐 메트릭을 제공한다. ([#87967](https://github.com/kubernetes/kubernetes/pull/87967), [@zhan849](https://github.com/zhan849)) [SIG API Machinery] +- 다음의 메트릭 기능이 꺼져 있다. + - kubelet_pod_worker_latency_microseconds + - kubelet_pod_start_latency_microseconds + - kubelet_cgroup_manager_latency_microseconds + - kubelet_pod_worker_start_latency_microseconds + - kubelet_pleg_relist_latency_microseconds + - kubelet_pleg_relist_interval_microseconds + - kubelet_eviction_stats_age_microseconds + - kubelet_runtime_operations + - kubelet_runtime_operations_latency_microseconds + - kubelet_runtime_operations_errors + - kubelet_device_plugin_registration_count + - kubelet_device_plugin_alloc_latency_microseconds + - kubelet_docker_operations + - kubelet_docker_operations_latency_microseconds + - kubelet_docker_operations_errors + - kubelet_docker_operations_timeout + - network_plugin_operations_latency_microseconds ([#83841](https://github.com/kubernetes/kubernetes/pull/83841), [@RainbowMango](https://github.com/RainbowMango)) [SIG 네트워크, 노드] +- Kube-apiserver 메트릭은 이제 /healthz, /livez, /readyz 요청에 대한 요청 수, 대기 시간 및 응답 크기를 포함한다. ([#83598](https://github.com/kubernetes/kubernetes/pull/83598), [@jktomer](https://github.com/jktomer)) [SIG API Machinery] +- Kubelet은 이제 인증서 로테이션(rotation)을 수행할 수 없는 경우, `server_expiration_renew_failure` 및 `client_expiration_renew_failure` 메트릭 카운터를 제공한다. ([#84614](https://github.com/kubernetes/kubernetes/pull/84614), [@rphillips](https://github.com/rphillips)) [SIG API Machinery, 인증, CLI, 클라우드 공급자, 클러스터 라이프사이클, Instrumentation, 노드, 릴리스] +- Kubelet: 메트릭 process_start_time_seconds는 ALPHA 안정성 레벨로 표시된다. ([#85446](https://github.com/kubernetes/kubernetes/pull/85446), [@RainbowMango](https://github.com/RainbowMango)) [SIG API Machinery, 클러스터 라이프사이클, Instrumentation, 노드] +- 헬스 상태가 좋지 않은 PLEG의 진단을 돕기 위한 새로운 메트릭 `kubelet_pleg_last_seen_seconds`를 추가한다. ([#86251](https://github.com/kubernetes/kubernetes/pull/86251), [@bboreham](https://github.com/bboreham)) [SIG 노드] + +### 기타 (버그, 정리(Cleanup) or Flake(플레이크)) + +- 1.16 이상의 API 서버에 대해, 1.15 이전으로 클라이언트 회귀가 파드 상태의 podIP 또는 노드 명세의 podCIDR을 업데이트할 수 없었던 문제를 수정했다. ([#88505](https://github.com/kubernetes/kubernetes/pull/88505), [@liggitt](https://github.com/liggitt)) [SIG 앱, 네트워크] +- 롤링 업데이트 파티션에 대한 "kubectl describe statefulsets.apps" 출력 가비지를 수정했다. ([#85846](https://github.com/kubernetes/kubernetes/pull/85846), [@phil9909](https://github.com/phil9909)) [SIG CLI] +- PV의 파일시스템이 디스크의 실제 파일시스템과 일치하지 않을 때 PV에 이벤트를 추가한다. ([#86982](https://github.com/kubernetes/kubernetes/pull/86982), [@gnufied](https://github.com/gnufied)) [SIG 스토리지] +- azure 디스크 WriteAccelerator 지원을 추가한다. ([#87945](https://github.com/kubernetes/kubernetes/pull/87945), [@andyzhangx](https://github.com/andyzhangx)) [SIG 클라우드 공급자, 스토리지] +- VM 인스턴스 업데이트를 위해 고 루틴(goroutines) 간 지연(delay)을 추가한다. ([#88094](https://github.com/kubernetes/kubernetes/pull/88094), [@aramase](https://github.com/aramase)) [SIG 클라우드 공급자] +- 클러스터 덤프 정보에 init 컨테이너 로그를 추가한다. ([#88324](https://github.com/kubernetes/kubernetes/pull/88324), [@zhouya0](https://github.com/zhouya0)) [SIG CLI] +- 애드온 : elasticsearch 디스커버리는 IPv6를 지원한다. ([#85543](https://github.com/kubernetes/kubernetes/pull/85543), [@SataQiu](https://github.com/SataQiu)) [SIG 클러스터 라이프사이클, Instrumentation] +- PV 및 PVC에 "volume.beta.kubernetes.io/migrated-to" 어노테이션을 추가하면, PV 및 PVC가 마이그레이션되어 프로비저닝과 삭제를 위해 해당 오브젝트를 선택할 수 있도록 외부 프로비저너에 신호를 보낸다. ([#87098](https://github.com/kubernetes/kubernetes/pull/87098), [@davidz627](https://github.com/davidz627)) [SIG 스토리지] +- 모든 api-server 로그 요청 라인은 grep으로 찾기 쉬운 형식으로 되어 있다. ([#87203](https://github.com/kubernetes/kubernetes/pull/87203), [@lavalamp](https://github.com/lavalamp)) [SIG API Machinery] +- Azure VMSS LoadBalancerBackendAddressPools 업데이트는 순차적-동기(sequential-sync) + 동시-비동기(concurrent-async) 요청으로 개선되었다. ([#88699](https://github.com/kubernetes/kubernetes/pull/88699), [@feiskyer](https://github.com/feiskyer)) [SIG 클라우드 공급자] +- Azure 클라우드 공급자는 이제 이용자 그룹 클레임에 spn: 접두사가 없는 AAD 토큰을 얻는다. ([#87590](https://github.com/kubernetes/kubernetes/pull/87590), [@weinong](https://github.com/weinong)) [SIG 클라우드 공급자] +- AzureFile 및 CephFS는 민감한 마운트 옵션의 로깅을 방지하는 새로운 마운트 라이브러리를 사용한다. ([#88684](https://github.com/kubernetes/kubernetes/pull/88684), [@saad-ali](https://github.com/saad-ali)) [SIG 스토리지] +- 리눅스 노드와 윈도우 노드를 포함하는 쿠버네티스 클러스터에서 윈도우 스케줄링을 피하기 위해, dns-horizontal 컨테이너를 리눅스 노드에 바인딩한다. ([#83364](https://github.com/kubernetes/kubernetes/pull/83364), [@wawa0210](https://github.com/wawa0210)) [SIG 클러스터 라이프사이클, 윈도우] +- 윈도우 스케줄링을 피하기 위해 kube-dns 컨테이너를 리눅스 노드에 바인딩한다. ([#83358](https://github.com/kubernetes/kubernetes/pull/83358), [@wawa0210](https://github.com/wawa0210)) [SIG 클러스터 라이프사이클, 윈도우] +- 리눅스 노드와 윈도우 노드를 포함하는 쿠버네티스 클러스터에서 윈도우 스케줄링을 피하기 위해, metadata-agent 컨테이너를 리눅스 노드에 바인딩한다. ([#83363](https://github.com/kubernetes/kubernetes/pull/83363), [@wawa0210](https://github.com/wawa0210)) [SIG 클러스터 라이프사이클, Instrumentation, 윈도우] +- 리눅스 노드와 윈도우 노드를 포함하는 쿠버네티스 클러스터에서 윈도우 스케줄링을 피하기 위해, metrics-server 컨테이너를 리눅스 노드에 바인딩한다. ([#83362](https://github.com/kubernetes/kubernetes/pull/83362), [@wawa0210](https://github.com/wawa0210)) [SIG 클러스터 라이프사이클, Instrumentation, 윈도우] +- 버그 수정: 최신 패키지 노드를 포함해야 한다. #351 (@caseydavenport) ([#84163](https://github.com/kubernetes/kubernetes/pull/84163), [@david-tigera](https://github.com/david-tigera)) [SIG 클러스터 라이프사이클] +- CPU 상한(limit)은 이제 윈도우 컨테이너에 적용된다. 노드가 오버-프로비저닝된 경우, 가중치가 사용되지 않으며 상한만 고려된다. ([#86101](https://github.com/kubernetes/kubernetes/pull/86101), [@PatrickLang](https://github.com/PatrickLang)) [SIG 노드, 테스트, 윈도우] +- COS 노드의 core_pattern을 절대 경로로 변경했다. ([#86329](https://github.com/kubernetes/kubernetes/pull/86329), [@mml](https://github.com/mml)) [SIG 클러스터 라이프사이클, 노드] +- Client-go 인증서 관리자 교체는 발급된 인증서와 함께 선택적인 중급(intermediate)의 체인을 유지하는 기능을 얻었다. ([#88744](https://github.com/kubernetes/kubernetes/pull/88744), [@jackkleeman](https://github.com/jackkleeman)) [SIG API Machinery, 인증] +- 클라우드 공급자 설정인 CloudProviderBackoffMode가 더 이상 사용되지 않으므로 제거되었다. ([#88463](https://github.com/kubernetes/kubernetes/pull/88463), [@feiskyer](https://github.com/feiskyer)) [SIG 클라우드 공급자] +- debian-hyperkube-base 이미지가 사용 중단되고 제거되므로 적합(Conformance) 이미지는 이제 stretch-slim에 의존한다. ([#88702](https://github.com/kubernetes/kubernetes/pull/88702), [@dims](https://github.com/dims)) [SIG 클러스터 라이프사이클, 릴리스, 테스트] +- kubectl create 커맨드에서 --generator 플래그는 사용 중단(deprecated)됨 ([#88655](https://github.com/kubernetes/kubernetes/pull/88655), [@soltysh](https://github.com/soltysh)) [SIG CLI] +- 초기화 단계(preflight) 동안, kubeadm은 이제 conntrack 실행 파일이 있는지 확인한다. ([#85857](https://github.com/kubernetes/kubernetes/pull/85857), [@hnanni](https://github.com/hnanni)) [SIG 클러스터 라이프사이클] +- 엔드포인트슬라이스에는 파드 종료를 위한 엔드포인트가 없어야 한다. ([#89056](https://github.com/kubernetes/kubernetes/pull/89056), [@andrewsykim](https://github.com/andrewsykim)) [SIG 앱, 네트워크] +- 임시 저장 한도를 초과하는 파드로 인한 축출은 이제 `kubelet_evictions` 메트릭에 의해 기록되며 경고할 수 있다. ([#87906](https://github.com/kubernetes/kubernetes/pull/87906), [@smarterclayton](https://github.com/smarterclayton)) [SIG 노드] +- kubectl이 널(null) 값을 잘못 거부하지 않도록 하기 위해 널 입력 가능(nullable), 필수/비필수 필드를 만들어 공개된 OpenAPI 스키마를 필터링한다. ([#85722](https://github.com/kubernetes/kubernetes/pull/85722), [@sttts](https://github.com/sttts)) [SIG API Machinery] +- --shutdown-delay-duration이 경과하기 전에, 종료가 시작된 직후 오류를 반환하도록 /readyz를 수정한다. ([#88911](https://github.com/kubernetes/kubernetes/pull/88911), [@tkashem](https://github.com/tkashem)) [SIG API Machinery] +- 감시(watch) 요청 처리 시 API Server 잠재적 메모리 누수 이슈를 수정한다. ([#85410](https://github.com/kubernetes/kubernetes/pull/85410), [@answer1991](https://github.com/answer1991)) [SIG API Machinery] +- 엔드포인트슬라이스 컨트롤러 경합 조건(race condition)을 수정하고 엔드포인트슬라이스의 외부 변경을 처리하는지 확인한다. ([#85703](https://github.com/kubernetes/kubernetes/pull/85703), [@robscott](https://github.com/robscott)) [SIG 앱, 네트워크] +- 순수한 ipv6 vsphere 환경에서 손실된 IPv6 주소 이슈를 수정한다. ([#86001](https://github.com/kubernetes/kubernetes/pull/86001), [@hubv](https://github.com/hubv)) [SIG 클라우드 공급자] +- 예기치 않은 LoadBalancer 업데이트가 발생하지 않도록 LoadBalancer 규칙 검사를 수정한다. ([#85990](https://github.com/kubernetes/kubernetes/pull/85990), [@feiskyer](https://github.com/feiskyer)) [SIG 클라우드 공급자] +- Kube-proxy에서 다른 IP 군으로 로드 밸런서를 사용할 때 다운되는 버그를 수정한다. ([#87117](https://github.com/kubernetes/kubernetes/pull/87117), [@aojea](https://github.com/aojea)) [SIG 네트워크] +- port-forward 버그 수정: 이름이 지정된 포트가 서비스와 작동하지 않는 문제를 수정한다. ([#85511](https://github.com/kubernetes/kubernetes/pull/85511), [@oke-py](https://github.com/oke-py)) [SIG CLI] +- 오래된 IPv6 엔드포인트가 정리되지 않은 이중 스택 IPVS 프록시의 버그를 수정한다. ([#87695](https://github.com/kubernetes/kubernetes/pull/87695), [@andrewsykim](https://github.com/andrewsykim)) [SIG 네트워크] +- orphan 리비전(revision)을 채택할 수 없고 스테이트풀셋(statefulset)을 동기화 할 수 없는 버그를 수정한다. ([#86801](https://github.com/kubernetes/kubernetes/pull/86801), [@likakuli](https://github.com/likakuli)) [SIG 앱] +- ExternalTrafficPolicy가 ExternalIP 서비스에 적용되지 않는 버그를 수정한다. ([#88786](https://github.com/kubernetes/kubernetes/pull/88786), [@freehan](https://github.com/freehan)) [SIG 네트워크] +- kubenet이 tc 출력을 파싱(parse)하지 못하는 버그를 수정한다. ([#83572](https://github.com/kubernetes/kubernetes/pull/83572), [@chendotjs](https://github.com/chendotjs)) [SIG 네트워크] +- 파드가 IP 주소를 얻지 못하게 하는 kubenet의 회귀 문제를 수정한다. ([#85993](https://github.com/kubernetes/kubernetes/pull/85993), [@chendotjs](https://github.com/chendotjs)) [SIG 네트워크, 노드] +- azure 파일 AuthorizationFailure를 수정한다. ([#85475](https://github.com/kubernetes/kubernetes/pull/85475), [@andyzhangx](https://github.com/andyzhangx)) [SIG 클라우드 공급자, 스토리지] +- 엔드포인트슬라이스 컨트롤러가 공유 오브젝트를 수정하려고 하는 버그를 수정한다. ([#85368](https://github.com/kubernetes/kubernetes/pull/85368), [@robscott](https://github.com/robscott)) [SIG API Machinery, 앱, 네트워크] +- aws-load-balancer-security-groups 어노테이션 처리 문제를 수정한다. 이 어노테이션이 할당된 보안 그룹은 더 이상 쿠버네티스에 의해 수정되지 않으며, 대부분의 사용자가 예상하는 동작이다. 이 어노테이션을 사용하면, 더 이상 불필요한 보안 그룹이 만들어지지 않는다. ([#83446](https://github.com/kubernetes/kubernetes/pull/83446), [@Elias481](https://github.com/Elias481)) [SIG 클라우드 공급자] +- 부정확한 캐시로 인한 잘못된 VMSS 업데이트를 수정한다. ([#89002](https://github.com/kubernetes/kubernetes/pull/89002), [@ArchangelSDY](https://github.com/ArchangelSDY)) [SIG 클라우드 공급자] +- hostname의 종속성을 제거하여 윈도우 용 isCurrentInstance를 수정한다. ([#89138](https://github.com/kubernetes/kubernetes/pull/89138), [@feiskyer](https://github.com/feiskyer)) [SIG 클라우드 공급자] +- LoadBalancer가 또다른 리소스 그룹에 지정된 경우 azure 클라우드 공급자에서 찾을 수 없는 리소스에 대한 이슈 #85805를 수정한다. ([#86502](https://github.com/kubernetes/kubernetes/pull/86502), [@levimm](https://github.com/levimm)) [SIG 클라우드 공급자] +- local=true로 설정한 경우 kubectl annotate 오류를 수정한다. ([#86952](https://github.com/kubernetes/kubernetes/pull/86952), [@zhouya0](https://github.com/zhouya0)) [SIG CLI] +- kubectl create deployment 커맨드가 사용하는 이미지 이름을 수정한다. ([#86636](https://github.com/kubernetes/kubernetes/pull/86636), [@zhouya0](https://github.com/zhouya0)) [SIG CLI] +- `kubectl drain ignore` 데몬셋(daemonset) 및 기타 오류를 수정한다. ([#87361](https://github.com/kubernetes/kubernetes/pull/87361), [@zhouya0](https://github.com/zhouya0)) [SIG CLI] +- 노드 이벤트에서 "involvedObject"에 대한 "apiVersion"이 누락되는 문제를 수정한다. ([#87537](https://github.com/kubernetes/kubernetes/pull/87537), [@uthark](https://github.com/uthark)) [SIG 앱, 노드] +- azure 클라우드 공급자에서 nil 포인터 역참조를 수정한다. ([#85975](https://github.com/kubernetes/kubernetes/pull/85975), [@ldx](https://github.com/ldx)) [SIG 클라우드 공급자] +- 스테이트풀셋을 여러 번 적용하지 못하게 하는 스테이트풀셋 변환에서 회귀 문제를 수정 ([#87706](https://github.com/kubernetes/kubernetes/pull/87706), [@liggitt](https://github.com/liggitt)) [SIG 앱, 테스트] +- 여러 경로를 함께 업데이트 할 때 경로 충돌된 경로 업데이트 작업을 수정한다. ([#88209](https://github.com/kubernetes/kubernetes/pull/88209), [@feiskyer](https://github.com/feiskyer)) [SIG 클라우드 공급자] +- 파드 볼륨 처리가 실패할 때 kubelet이 PVC/PV 오브젝트를 반복적으로 가져오는 것을 방지하도록 수정한다. 이렇게 하면 이 같은 오류 시나리오에서 API 서버로의 계속적인 연결시도(hammering)를 막을 수 있지만, 파드 볼륨 처리의 일부 오류가 재시도되기까지 최대 2-3분이 소요될 수 있다. ([#88141](https://github.com/kubernetes/kubernetes/pull/88141), [@tedyu](https://github.com/tedyu)) [SIG 노드, 스토리지] +- DNS 레이블 서비스 어노테이션이 설정되지 않은 경우, PIP의 DNS가 삭제되는 버그를 수정한다. ([#87246] ([#87246](https://github.com/kubernetes/kubernetes/pull/87246), [@nilo19](https://github.com/nilo19)) [SIG 클라우드 공급자] +- 컨트롤 플레인을 사용할 수 없게 하는 etcd LIST에서 썬더링 허드(thundering herd)를 야기하는 컨트롤 플레인 호스트 롤링 업그레이드를 수정한다. ([#86430](https://github.com/kubernetes/kubernetes/pull/86430), [@wojtek-t](https://github.com/wojtek-t)) [SIG API Machinery, 노드, 테스트] +- 수정: CSINode에 대한 azure 디스크 마이그레이션 지원을 추가한다. ([#88014](https://github.com/kubernetes/kubernetes/pull/88014), [@andyzhangx](https://github.com/andyzhangx)) [SIG 클라우드 공급자, 스토리지] +- 수정: azure 클라이언트에서 다시 시도할 수 없는(non-retriable) 오류를 추가한다. ([#87941](https://github.com/kubernetes/kubernetes/pull/87941), [@andyzhangx](https://github.com/andyzhangx)) [SIG 클라우드 공급자] +- 수정: azure 디스크 연결/해제 시 복구를 추가한다. ([#88444](https://github.com/kubernetes/kubernetes/pull/88444), [@andyzhangx](https://github.com/andyzhangx)) [SIG 클라우드 공급자] +- 수정: azure 데이터 디스크는 기본적으로 os 디스크와 동일한 키를 사용해야 한다. ([#86351](https://github.com/kubernetes/kubernetes/pull/86351), [@andyzhangx](https://github.com/andyzhangx)) [SIG 클라우드 공급자] +- 수정: azure 디스크를 Standard_DC4s/DC2s 인스턴스에 마운트할 수 없다. ([#86612](https://github.com/kubernetes/kubernetes/pull/86612), [@andyzhangx](https://github.com/andyzhangx)) [SIG 클라우드 공급자, 스토리지] +- 수정: azure 파일 마운트 타임아웃 이슈를 해결한다. ([#88610](https://github.com/kubernetes/kubernetes/pull/88610), [@andyzhangx](https://github.com/andyzhangx)) [SIG 클라우드 공급자, 스토리지] +- 수정: azure 디스크 전에 디스크 상태를 확인한다. ([#88360](https://github.com/kubernetes/kubernetes/pull/88360), [@andyzhangx](https://github.com/andyzhangx)) [SIG 클라우드 공급자] +- 수정: csi 드라이버에서 손상된 마운트 포인트를 해결한다. ([#88569](https://github.com/kubernetes/kubernetes/pull/88569), [@andyzhangx](https://github.com/andyzhangx)) [SIG 스토리지] +- 수정: azure 디스크 lun 이슈를 해결한다. ([#88158](https://github.com/kubernetes/kubernetes/pull/88158), [@andyzhangx](https://github.com/andyzhangx)) [SIG 클라우드 공급자, 스토리지] +- 수정: azure 디스크 최대 개수를 업데이트한다. ([#88201](https://github.com/kubernetes/kubernetes/pull/88201), [@andyzhangx](https://github.com/andyzhangx)) [SIG 클라우드 공급자, 스토리지] +- AWS에서 "디바이스 X를 ​​요청했지만 Y를 찾음" 연결 오류를 수정했다. ([#85675](https://github.com/kubernetes/kubernetes/pull/85675), [@jsafrane](https://github.com/jsafrane)) [SIG 클라우드 공급자, 스토리지] +- CIDR 범위를 벗어나면 `Except` 값이 허용되는 네트워크폴리시(NetworkPolicy) 유효성 검사를 수정했다. ([#86578](https://github.com/kubernetes/kubernetes/pull/86578), [@tnqn](https://github.com/tnqn)) [SIG 네트워크] +- TopologyManager의 버그를 수정했다. 이전에는 컨테이너 생성이 직렬화된(serialized) 상황에서만 TopologyManager가 정렬을 보장했다. 이제는 컨테이너 생성의 모든 시나리오에서 정렬이 보장된다. ([#87759](https://github.com/kubernetes/kubernetes/pull/87759), [@klueska](https://github.com/klueska)) [SIG 노드] +- 노드가 추가될 때 공급자 ID를 판별하는 중에 오류가 발생하면 공급자 ID가 노드에 대해 설정되지 않는 버그가 수정되었다. ([#87043](https://github.com/kubernetes/kubernetes/pull/87043), [@zjs](https://github.com/zjs)) [SIG 앱, 클라우드 공급자] +- kubelet 이미지 관리자에서 스태틱(static) 파드 워커가 아무 경고 없이 작업을 중지시킬 수 있는 데이터 경합을 수정했다. ([#88915](https://github.com/kubernetes/kubernetes/pull/88915), [@roycaihw](https://github.com/roycaihw)) [SIG 노드] +- kubelet이 파드 볼륨을 정리하는 문제를 수정했다. ([#86277](https://github.com/kubernetes/kubernetes/pull/86277), [@tedyu](https://github.com/tedyu)) [SIG 스토리지] +- kubelet이 파드의 준비(ready) 상태를 업데이트하지 못하는 회귀 문제를 수정했다. ([#84951](https://github.com/kubernetes/kubernetes/pull/84951), [@tedyu](https://github.com/tedyu)) [SIG 노드] +- kubelet이 동시 파드 조정(reconciliation) 루프를 잘못 실행하여 충돌하는 문제를 수정했다. ([#89055](https://github.com/kubernetes/kubernetes/pull/89055), [@tedyu](https://github.com/tedyu)) [SIG 노드] +- 타임아웃 후 블록 CSI 볼륨 정리 문제를 수정했다. ([#88660](https://github.com/kubernetes/kubernetes/pull/88660), [@jsafrane](https://github.com/jsafrane)) [SIG 스토리지] +- 타임아웃 후 CSI 원시 블록 볼륨 정리 문제를 수정했다. ([#87978](https://github.com/kubernetes/kubernetes/pull/87978), [@jsafrane](https://github.com/jsafrane)) [SIG 스토리지] +- AWS 클라우드 공급자가 프로비저닝하지 않은 LoadBalancer 보안 그룹을 삭제 시도하도록 수정했으며, `service.beta.kubernetes.io/aws-load-balancer-security-groups` 어노테이션이 있더라도 AWS 클라우드 공급자가 기본 LoadBalancer 보안 그룹을 생성하도록 수정했다. aws-load-balancer-security-groups의 의도된 동작은 로드 밸런서에 할당된 모든 보안 그룹을 바꾸는 것이다. ([#84265](https://github.com/kubernetes/kubernetes/pull/84265), [@bhagwat070919](https://github.com/bhagwat070919)) [SIG 클라우드 공급자] +- 두 개의 스케줄러 메트릭(pending_pods와 schedule_attempts_total)이 기록되지 않는 문제를 수정했다. ([#87692](https://github.com/kubernetes/kubernetes/pull/87692), [@everpeace](https://github.com/everpeace)) [SIG 스케줄링] +- 삭제/재생성된 파드에 대해 kubelet이 보고한(kubelet-reported) 파드 상태와 관련된 이슈를 수정했다. ([#86320](https://github.com/kubernetes/kubernetes/pull/86320), [@liggitt](https://github.com/liggitt)) [SIG 노드] +- 커스텀 리소스의 no-op 패치 또는 업데이트 시 metadata.generation의 증가를 야기하는 멀티-버전 커스텀 리소스의 변환(conversion) 오류를 수정했다. ([#88995](https://github.com/kubernetes/kubernetes/pull/88995), [@liggitt](https://github.com/liggitt)) [SIG API Machinery] +- kubectl이 획득한 AAD 토큰이 on-behalf-of flow 및 oidc와 호환되지 않는 문제를 수정했다. 이 수정 이전의 이용자 그룹은 "spn:" 접두사를 가진다. 이 수정 후에는 "spn:" 접두사가 생략된다. ([#86412](https://github.com/kubernetes/kubernetes/pull/86412), [@weinong](https://github.com/weinong)) [SIG API Machinery, 인증, 클라우드 공급자] +- c2, n2, m1, m2 머신 유형에 15개 이상의 GCE 퍼시스턴트(Persistent) 디스크를 연결할 수 없는 문제를 수정했다. ([#88602](https://github.com/kubernetes/kubernetes/pull/88602), [@yuga711](https://github.com/yuga711)) [SIG 스토리지] +- 윈도우에서 엔드포인트슬라이스 기능 게이트를 활성화할 때 kube-proxy가 지원하도록 수정한다. ([#86016](https://github.com/kubernetes/kubernetes/pull/86016), [@robscott](https://github.com/robscott)) [SIG 인증, 네트워크] +- 클라이언트 인증서 교체 사례에서 kubelet이 크래시되는 이슈를 수정한다. ([#88079](https://github.com/kubernetes/kubernetes/pull/88079), [@liggitt](https://github.com/liggitt)) [SIG API Machinery, 인증, 노드] +- 서비스 어카운트(service account) 토큰 컨트롤러를 실행하지 않는 클러스터에서 서비스 어카운트 토큰 승인 오류를 수정한다. ([#87029](https://github.com/kubernetes/kubernetes/pull/87029), [@liggitt](https://github.com/liggitt)) [SIG 인증] +- 65536개의 IP 주소보다 큰 IPv4 범위를 사용하여 --service-cluster-ip-range 처리 중 v1.17.0 회귀 문제를 수정한다. ([#86534](https://github.com/kubernetes/kubernetes/pull/86534), [@liggitt](https://github.com/liggitt)) [SIG 네트워크] +- 네트워크 폴리시(NetworkPolicy) PolicyTypes의 잘못된 유효성 검사 결과를 수정한다. ([#85747](https://github.com/kubernetes/kubernetes/pull/85747), [@tnqn](https://github.com/tnqn)) [SIG 네트워크] +- 하위 프로토콜 교섭(negotiation)의 경우 클라이언트 및 서버 프로토콜이 모두 필요하다. ([#86646](https://github.com/kubernetes/kubernetes/pull/86646), [@tedyu](https://github.com/tedyu)) [SIG API Machinery, 노드] +- 여러 노드에서 연결을 허용하는 볼륨의 경우 이제 다른 노드에서 연결 및 분리 작업이 병렬로 실행된다. ([#88678](https://github.com/kubernetes/kubernetes/pull/88678), [@verult](https://github.com/verult)) [SIG 스토리지] +- 분리(orphan) 전파 정책으로 스테이트풀셋이 삭제되면 가비지 수집기가 ControllerRevisions를 올바르게 분리할 수 있다. ([#84984](https://github.com/kubernetes/kubernetes/pull/84984), [@cofyc](https://github.com/cofyc)) [SIG 앱] +- `Get-kube.sh`는 공급자가 메타데이터 서버 기본값 대신 GCE 또는 GKE 인 경우, 인증을 위해 gcloud의 현재 로컬 GCP 서비스 계정을 사용한다. ([#88383](https://github.com/kubernetes/kubernetes/pull/88383), [@BenTheElder](https://github.com/BenTheElder)) [SIG 클러스터 라이프사이클] +- CVE-2020-9283에 대한 수정 사항을 제공하도록 Golang/x/net이 업데이트되었다. ([#88381](https://github.com/kubernetes/kubernetes/pull/88381), [@BenTheElder](https://github.com/BenTheElder)) [SIG API Machinery, CLI, 클라우드 공급자, 클러스터 라이프사이클, Instrumentation] +- 서빙 인증서(serving certificate)의 파라미터가 SNI 인증서의 IP인 이름을 지정하면 서버 연결에 응답하는 데 우선 순위가 부여된다. ([#85308](https://github.com/kubernetes/kubernetes/pull/85308), [@deads2k](https://github.com/deads2k)) [SIG API Machinery] +- yaml 파싱 성능을 개선했다. ([#85458](https://github.com/kubernetes/kubernetes/pull/85458), [@cjcullen](https://github.com/cjcullen)) [SIG API Machinery, CLI, 클라우드 공급자, 클러스터 라이프사이클, Instrumentation, 노드] +- 노드 인증자(authorizer)의 성능을 개선한다. ([#87696](https://github.com/kubernetes/kubernetes/pull/87696), [@liggitt](https://github.com/liggitt)) [SIG 인증] +- GKE 알파 클러스터에서는 서비스 어노테이션 `cloud.google.com/network-tier: Standard`를 사용할 수 있다. ([#88487](https://github.com/kubernetes/kubernetes/pull/88487), [@zioproto](https://github.com/zioproto)) [SIG 클라우드 공급자] +- CSI 퍼시스턴트 볼륨을 설명할 때 FSType을 포함한다. ([#85293](https://github.com/kubernetes/kubernetes/pull/85293), [@huffmanca](https://github.com/huffmanca)) [SIG CLI, 스토리지] +- Iptables/유저스페이스(userspace) 프록시: 모든 외부 IP 대신, 동기화 루프 당 하나씩 로컬 주소를 가져옴으로써 성능을 개선한다 ([#85617](https://github.com/kubernetes/kubernetes/pull/85617), [@andrewsykim](https://github.com/andrewsykim)) [SIG API Machinery, CLI, 클라우드 공급자, 클러스터 라이프사이클, Instrumentation , 네트워크] +- Kube-aggregator: 항상 서비스의 현재 상태를 반영하기 위해 unavailableGauge 메트릭을 설정한다. ([#87778](https://github.com/kubernetes/kubernetes/pull/87778), [@p0lyn0mial](https://github.com/p0lyn0mial)) [SIG API Machinery] +- Kube-apiserver: gracePeriodSeconds=0 및 resourceVersion 전제 조건(precondition)이 있는 파드를 삭제하는 중에 발생하는 충돌 오류를 수정했다. ([#85516](https://github.com/kubernetes/kubernetes/pull/85516), [@michaelgugino](https://github.com/michaelgugino)) [SIG API Machinery] +- Kube-proxy가 더 이상 공유 엔드포인트슬라이스를 수정하지 않는다. ([#86092](https://github.com/kubernetes/kubernetes/pull/86092), [@robscott](https://github.com/robscott)) [SIG 네트워크] +- Kube-proxy: 이중 스택 모드에서 엔드포인트의 IP Family를 얻을 수 없는 경우, 주소가 없는 엔드포인트에 대한 로그가 넘치지 않도록 경고 대신 InfoV(4) 레벨로 로그를 남긴다. ([#88934](https://github.com/kubernetes/kubernetes/pull/88934), [@aojea](https://github.com/aojea)) [SIG 네트워크] +- Kubeadm을 사용하면 이중 스택이 활성화된 경우 단일 스택 클러스터를 구성할 수 있다. ([#87453](https://github.com/kubernetes/kubernetes/pull/87453), [@aojea](https://github.com/aojea)) [SIG API Machinery, 클러스터 라이프사이클, 네트워크] +- Kubeadm에 이제 CoreDNS 버전 1.6.7이 포함된다. ([#86260](https://github.com/kubernetes/kubernetes/pull/86260), [@rajansandeep](https://github.com/rajansandeep)) [SIG 클러스터 라이프사이클] +- Kubeadm 업그레이드는 항상 스택에 대한 etcd 백업을 유지한다. ([#86861](https://github.com/kubernetes/kubernetes/pull/86861), [@SataQiu](https://github.com/SataQiu)) [SIG 클러스터 라이프사이클] +- Kubeadm: 'kubeadm alpha kubelet config download'가 제거되었다. 대신 'kubeadm upgrade node phase kubelet-config'를 사용한다. ([#87944](https://github.com/kubernetes/kubernetes/pull/87944), [@SataQiu](https://github.com/SataQiu)) [SIG 클러스터 라이프사이클] +- Kubeadm: 클러스터 이름을 controller-manager 인수(argument)로 포워딩한다. ([#85817](https://github.com/kubernetes/kubernetes/pull/85817), [@ereslibre](https://github.com/ereslibre)) [SIG 클러스터 라이프사이클] +- Kubeadm: 더 이상 존재하지 않는 "ci-cross/*" 대신 "ci/k8s-master" 버전 레이블 지원을 추가한다. ([#86609](https://github.com/kubernetes/kubernetes/pull/86609), [@Pensu](https://github.com/Pensu)) [SIG 클러스터 라이프사이클] +- Kubeadm: 동시 etcd 멤버 조인에 대한 잠정 지원을 추가로 개선한다. 여러 구성원이 동일한 호스트 이름을 받을 수 있는 버그를 수정한다. etcd 클라이언트 다이얼 타임아웃을 늘리고 추가/제거/... 작업에 대한 타임아웃을 다시 시도한다. ([#87505](https://github.com/kubernetes/kubernetes/pull/87505), [@neolit123](https://github.com/neolit123)) [SIG 클러스터 라이프사이클] +- Kubeadm: "upgrade apply"에 kubelet 환경 파일을 쓰지 않도록 한다. ([#85412](https://github.com/kubernetes/kubernetes/pull/85412), [@boluisa](https://github.com/boluisa)) [SIG 클러스터 라이프사이클] +- Kubeadm: 손상된 kubelet.conf 파일로 "kubeadm reset"을 실행할 때 발생할 수 있는 문제를 수정한다. ([#86216](https://github.com/kubernetes/kubernetes/pull/86216), [@neolit123](https://github.com/neolit123)) [SIG 클러스터 라이프사이클] +- Kubeadm: 단일 노드 클러스터에서 'kubeadm upgrade'가 멈추는 버그를 수정한다. ([#88434](https://github.com/kubernetes/kubernetes/pull/88434), [@SataQiu](https://github.com/SataQiu)) [SIG 클러스터 라이프사이클] +- Kubeadm: 태그가 변경되지 않았지만 내용이 변경된 경우에도 이미지를 미리 가져오도록 한다. ([#85603](https://github.com/kubernetes/kubernetes/pull/85603), [@bart0sh](https://github.com/bart0sh)) [SIG 클러스터 라이프사이클] +- Kubeadm: v1.15에서 사용 중단(deprecated) 되었으므로 'kubeadm upgrade node config' 명령을 제거한다. 대신 'kubeadm upgrade node phase kubelet-config'를 사용한다. ([#87975](https://github.com/kubernetes/kubernetes/pull/87975), [@SataQiu](https://github.com/SataQiu)) [SIG 클러스터 라이프사이클] +- Kubeadm: 사용 중단된 CoreDNS 기능-게이트(feature-gate)를 제거한다. 기능이 GA로 전환된 v1.11 이후부터 'true'로 설정되었다. v1.13에서는 CLI에서 사용 중단(deprecated) 및 히든(hidden)으로 표시되었다. ([#87400](https://github.com/kubernetes/kubernetes/pull/87400), [@neolit123](https://github.com/neolit123)) [SIG 클러스터 라이프사이클] +- Kubeadm: apiserver가 응답하지 않으면 `kubeadm-config` 컨피그맵 생성 또는 변경(mutation)을 다시 시도한다. 이것은 새로운 컨트롤 플레인 노드에 조인할 때 복원력을 향상시킨다. ([#85763](https://github.com/kubernetes/kubernetes/pull/85763), [@ereslibre](https://github.com/ereslibre)) [SIG 클러스터 라이프사이클] +- Kubeadm: kubeconfig 파일에서 인증 기관(certificate authority) PEM 데이터의 유효성을 검사할 때 공백을 허용한다. ([#86705](https://github.com/kubernetes/kubernetes/pull/86705), [@neolit123](https://github.com/neolit123)) [SIG 클러스터 라이프사이클] +- Kubeadm: bind-address 옵션을 사용하여 kube-controller-manager 및 kube-scheduler http 프로브(probe)를 구성한다. ([#86493](https://github.com/kubernetes/kubernetes/pull/86493), [@aojea](https://github.com/aojea)) [SIG 클러스터 라이프사이클] +- Kubeadm: api-server AdvertiseAddress IP family를 사용하여 비 외부(non external) etcd 클러스터에 대한 etcd 엔드포인트 IP family를 선택한다. ([#85745](https://github.com/kubernetes/kubernetes/pull/85745), [@aojea](https://github.com/aojea)) [SIG 클러스터 라이프사이클] +- kubectl cluster-info dump --output-directory=xxx 는 이제 출력 형식에 따라 확장자가 있는 파일을 생성한다. ([#82070](https://github.com/kubernetes/kubernetes/pull/82070), [@olivierlemasle](https://github.com/olivierlemasle)) [SIG CLI] +- `kubectl describe ` 및 `kubectl top pod`는 표시할 결과가 없는 경우 `"No resources found"` 또는 `"No resources found in namespace"` 라는 메시지를 반환한다. ([#87527](https://github.com/kubernetes/kubernetes/pull/87527), [@brianpursley](https://github.com/brianpursley)) [SIG CLI] +- `kubectl drain node --dry-run`은 축출되거나 삭제될 파드를 나열한다. ([#82660](https://github.com/kubernetes/kubernetes/pull/82660), [@sallyom](https://github.com/sallyom)) [SIG CLI] +- `kubectl set resources`는 리소스에 대한 빈(empty) 변경 사항을 전달하면 더 이상 오류를 반환하지 않는다. `kubectl set subject`는 리소스에 대한 빈 변경 사항을 전달하면 더 이상 오류를 반환하지 않는다. ([#85490](https://github.com/kubernetes/kubernetes/pull/85490), [@sallyom](https://github.com/sallyom)) [SIG CLI] +- metrics-server 또는 prometheus를 통해 수집한 Kubelet 메트릭은 더 이상 3개 이상의 파드를 실행하는 윈도우 노드에 대해 타임아웃되지 않아야 한다. ([#87730](https://github.com/kubernetes/kubernetes/pull/87730), [@marosset](https://github.com/marosset)) [SIG 노드, 테스트, 윈도우] +- kubelet 메트릭이 버킷(bucket)으로 변경되었다. 예를 들어 `exec/{podNamespace}/{podID}/{containerName}`은 이제 exec 일뿐이다. ([#87913](https://github.com/kubernetes/kubernetes/pull/87913), [@cheftako](https://github.com/cheftako)) [SIG 노드] +- kubelet은 API 서버에서 불필요한 파드 상태 업데이트 작업을 줄인다. ([#88591](https://github.com/kubernetes/kubernetes/pull/88591), [@smarterclayton](https://github.com/smarterclayton)) [SIG 노드, 확장성] +- 쿠버네티스는 매초가 아닌 5초 동안 100 msec마다 iptables 잠금을 획득하려고 시도한다. 이는 이탈률이 높은 iptables 모드에서 kube-proxy를 사용하는 환경에 특히 유용하다. ([#85771](https://github.com/kubernetes/kubernetes/pull/85771), [@aojea](https://github.com/aojea)) [SIG 네트워크] +- GCE 대상 풀에 대한 단일 업데이트의 인스턴스 수를 1000으로 제한한다. ([#87881](https://github.com/kubernetes/kubernetes/pull/87881), [@wojtek-t](https://github.com/wojtek-t)) [SIG 클라우드 공급자, Network, 확장성] +- Azure 클라이언트가 지정된 HTTP 상태 코드에서만 다시 시도한다. ([#88017](https://github.com/kubernetes/kubernetes/pull/88017), [@feiskyer](https://github.com/feiskyer)) [SIG 클라우드 공급자] +- 오류 메시지 및 서비스 이벤트 메시지를 보다 명확하게 만든다. ([#86078](https://github.com/kubernetes/kubernetes/pull/86078), [@feiskyer](https://github.com/feiskyer)) [SIG 클라우드 공급자] +- externalTrafficPolicy가 로컬로 설정된 경우 AWS NLB 헬스 체크 타임아웃을 최소화한다. ([#73363](https://github.com/kubernetes/kubernetes/pull/73363), [@kellycampbell](https://github.com/kellycampbell)) [SIG 클라우드 공급자] +- Pause 이미지에 non-amd64 이미지의 "Architecture"가 포함된다. ([#87954](https://github.com/kubernetes/kubernetes/pull/87954), [@BenTheElder](https://github.com/BenTheElder)) [SIG 릴리스] +- kubelet 및 kubeadm에서 pause 이미지가 3.2로 업그레이드되었다. ([#88173](https://github.com/kubernetes/kubernetes/pull/88173), [@BenTheElder](https://github.com/BenTheElder)) [SIG CLI, 클러스터 라이프사이클, 노드, 테스트] +- 스케줄러를 실행할 때 플러그인/PluginConfig 및 정책 API는 상호 배타적이다. ([#88864](https://github.com/kubernetes/kubernetes/pull/88864), [@alculquicondor](https://github.com/alculquicondor)) [SIG 스케줄링] +- `PreScore` 인터페이스에서 `FilteredNodesStatuses` 인수를 제거한다. ([#88189](https://github.com/kubernetes/kubernetes/pull/88189), [@skilxn-go](https://github.com/skilxn-go)) [SIG 스케줄링, 테스트] +- 노드 인증자(node authorizer) 인덱스 유지보수에서 성능 문제를 해결했다. ([#87693](https://github.com/kubernetes/kubernetes/pull/87693), [@liggitt](https://github.com/liggitt)) [SIG 인증] +- v1.17.0-rc.1에서 승인(admission), 인증(authentication) 및 권한(authorization) 웹훅(webhook) 성능의 회귀를 해결했다. ([#85810](https://github.com/kubernetes/kubernetes/pull/85810), [@liggitt](https://github.com/liggitt)) [SIG API Machinery, 테스트] +- `kubectl get all` 과 `NewDiscoveryClientForConfig` 또는 `NewDiscoveryClientForConfigOrDie`를 사용하여 구성된 client-go 디스커버리 클라이언트에서 성능 회귀를 해결했다. ([#86168](https://github.com/kubernetes/kubernetes/pull/86168), [@liggitt](https://github.com/liggitt)) [SIG API Machinery] +- oidc claim spn: 접두사가 생략되어 기존 Azure AD OIDC 활성화된 api-server와의 동작이 중단되는 kubectl azure 인증 모듈 변경을 되돌렸다. ([#87507](https://github.com/kubernetes/kubernetes/pull/87507), [@weinong](https://github.com/weinong)) [SIG API Machinery, 인증, 클라우드 공급자] +- 공유 정보 제공자(Shared informers)는 이제 네트워크 중단 시에 더 안정적이다. ([#86015](https://github.com/kubernetes/kubernetes/pull/86015), [@squeed](https://github.com/squeed)) [SIG API Machinery] +- 동일한 플러그인에 대해 PluginConfig를 두 번 이상 지정하면 스케줄러 시작을 실패한다. +  Extender 지정 및 NodeResourcesFit 플러그인에 대한 .ignoredResources 구성이 실패된다. ([#88870](https://github.com/kubernetes/kubernetes/pull/88870), [@alculquicondor](https://github.com/alculquicondor)) [SIG 스케줄링] +- restartPolicy=Never 파드의 종료(terminate)가 실제로 실패했을 때 더 이상 파드가 성공했다고 보고할 수 없다. ([#88440](https://github.com/kubernetes/kubernetes/pull/88440), [@smarterclayton](https://github.com/smarterclayton)) [SIG 노드, 테스트] +- CSR 서명 인증서/키 페어는 kube-apiserver 인증서/키 페어와 같이 디스크에서 다시 로드된다. ([#86816](https://github.com/kubernetes/kubernetes/pull/86816), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, 앱, 인증] +- k8s.io/client-go/tools/events의 EventRecorder는 관련 오브젝트에 설정되어 있지 않은 경우 (kube-system 대신) 디폴트 네임스페이스에 이벤트를 생성한다. ([#88815](https://github.com/kubernetes/kubernetes/pull/88815), [@enj](https://github.com/enj)) [SIG API Machinery] +- 이제 감사(audit) 이벤트 소스 IP 목록은 요청을 API 서버로 보낸 IP로 항상 끝난다. ([#87167](https://github.com/kubernetes/kubernetes/pull/87167), [@tallclair](https://github.com/tallclair)) [SIG API Machinery, 인증] +- 쿠버네티스 v1.17.0 샘플 apiserver를 사용하도록 sample-apiserver 집계 적합성 테스트가 업데이트되었다. ([#84735](https://github.com/kubernetes/kubernetes/pull/84735), [@liggitt](https://github.com/liggitt)) [SIG API Machinery, 아키텍처, CLI, 테스트] +- 스로틀링 가능성을 줄이기 위해, Azure 노드 프로비저닝 상태가 삭제될 때 VM 캐시가 nil로 설정된다. ([#87635](https://github.com/kubernetes/kubernetes/pull/87635), [@feiskyer](https://github.com/feiskyer)) [SIG 클라우드 공급자] +- VMSS 캐시가 추가되어 VMSS GET 스로틀링 가능성이 감소한다. ([#85885](https://github.com/kubernetes/kubernetes/pull/85885), [@nilo19](https://github.com/nilo19)) [SIG 클라우드 공급자] +- 윈도우 노드에서 10초 이내로 kubelet 및 kube-proxy가 준비될 때까지 대기한다. ([#85228](https://github.com/kubernetes/kubernetes/pull/85228), [@YangLu1031](https://github.com/YangLu1031)) [SIG 클러스터 라이프사이클] +- `kubectl apply -f --prune -n ​​`는 cli 지정 네임스페이스에서 파일에 정의되지 않은 모든 리소스를 제거(prune)해야 한다. ([#85613](https://github.com/kubernetes/kubernetes/pull/85613), [@MartinKaburu](https://github.com/MartinKaburu)) [SIG CLI] +- `kubectl create clusterrolebinding`는 rbac.authorization.k8s.io/v1 오브젝트를 생성한다. ([#85889](https://github.com/kubernetes/kubernetes/pull/85889), [@oke-py](https://github.com/oke-py)) [SIG CLI] +- `kubectl diff`는 이제 diff가 변경 내역을 찾은 경우에만 1을, kubectl 오류에서는 >1을 반환한다. "exit status code 1" 메시지도 뮤트(mute)되었다. ([#87437](https://github.com/kubernetes/kubernetes/pull/87437), [@apelisse](https://github.com/apelisse)) [SIG CLI, 테스트] + +## 의존성(Dependencies) + +- v3.8.4로 칼리코(Calico) 업데이트 ([#84163](https://github.com/kubernetes/kubernetes/pull/84163), [@david-tigera](https://github.com/david-tigera))[SIG 클러스터 라이프사이클] +- v1.28.2로 aws-sdk-go 의존성 업데이트 ([#87253](https://github.com/kubernetes/kubernetes/pull/87253), [@SaranBalaji90](https://github.com/SaranBalaji90))[SIG API Machinery, 클라우드 공급자] +- v0.8.5로 CNI 버전 업데이트 ([#78819](https://github.com/kubernetes/kubernetes/pull/78819), [@justaugustus](https://github.com/justaugustus))[SIG 릴리스, 테스트, 네트워크, 클러스터 라이프사이클, API Machinery] +- v1.17.0으로 cri-tools 업데이트 ([#86305](https://github.com/kubernetes/kubernetes/pull/86305), [@saschagrunert](https://github.com/saschagrunert))[SIG 릴리스, 클러스터 라이프사이클] +- kubelet 및 kubeadm에서 Pause 이미지가 3.2로 업그레이드 ([#88173](https://github.com/kubernetes/kubernetes/pull/88173), [@BenTheElder](https://github.com/BenTheElder))[SIG CLI, 노드, 테스트, 클러스터 라이프사이클] +- kubeadm에서 1.6.7로 CoreDNS 버전 업데이트 ([#86260](https://github.com/kubernetes/kubernetes/pull/86260), [@rajansandeep](https://github.com/rajansandeep))[SIG 클러스터 라이프사이클] +- CVE-2020-9283을 수정하기 위해 golang.org/x/crypto를 업데이트 ([#8838](https://github.com/kubernetes/kubernetes/pull/88381), [@BenTheElder](https://github.com/BenTheElder))[SIG CLI, Instrumentation, API Machinery, 클러스터 라이프사이클, 클라우드 공급자] +- 1.13.8로 Go 업데이트 ([#87648](https://github.com/kubernetes/kubernetes/pull/87648), [@ialidzhikov](https://github.com/ialidzhikov))[SIG 릴리스, 테스트] +- 1.18.0으로 Cluster-Autoscaler 업데이트 ([#89095](https://github.com/kubernetes/kubernetes/pull/89095), [@losipiuk](https://github.com/losipiuk))[SIG 오토스케일링, 클러스터 라이프사이클] + + + +# v1.18.0-rc.1 + +[Documentation](https://docs.k8s.io) + +## Downloads for v1.18.0-rc.1 + +filename | sha512 hash +-------- | ----------- +[kubernetes.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes.tar.gz) | `c17231d5de2e0677e8af8259baa11a388625821c79b86362049f2edb366404d6f4b4587b8f13ccbceeb2f32c6a9fe98607f779c0f3e1caec438f002e3a2c8c21` +[kubernetes-src.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-src.tar.gz) | `e84ffad57c301f5d6e90f916b996d5abb0c987928c3ca6b1565f7b042588f839b994ca12c43fc36f0ffb63f9fabc15110eb08be253b8939f49cd951e956da618` + +### Client Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-client-darwin-386.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-client-darwin-386.tar.gz) | `1aea99923d492436b3eb91aaecffac94e5d0aa2b38a0930d266fda85c665bbc4569745c409aa302247df3b578ce60324e7a489eb26240e97d4e65a67428ea3d1` +[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-client-darwin-amd64.tar.gz) | `07fa7340a959740bd52b83ff44438bbd988e235277dad1e43f125f08ac85230a24a3b755f4e4c8645743444fa2b66a3602fc445d7da6d2fc3770e8c21ba24b33` +[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-client-linux-386.tar.gz) | `48cebd26448fdd47aa36257baa4c716a98fda055bbf6a05230f2a3fe3c1b99b4e483668661415392190f3eebb9cb6e15c784626b48bb2541d93a37902f0e3974` +[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-client-linux-amd64.tar.gz) | `c3a5fedf263f07a07f59c01fea6c63c1e0b76ee8dc67c45b6c134255c28ed69171ccc2f91b6a45d6a8ec5570a0a7562e24c33b9d7b0d1a864f4dc04b178b3c04` +[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-client-linux-arm.tar.gz) | `a6b11a55bd38583bbaac14931a6862f8ce6493afe30947ba29e5556654a571593358278df59412bbeb6888fa127e9ae4c0047a9d46cb59394995010796df6b14` +[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-client-linux-arm64.tar.gz) | `9e15331ac8010154a9b64f5488969fc8ee2f21059639896cb84c5cf4f05f4c9d1d8970cb6f9831de6b34013848227c1972c12a698d07aac1ecc056e972fe6f79` +[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-client-linux-ppc64le.tar.gz) | `f828fe6252678de9d4822e482f5873309ae9139b2db87298ab3273ce45d38aa07b6b9b42b76c140705f27ba71e101d58b43e59ac7259d7c08dc647ea809e207c` +[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-client-linux-s390x.tar.gz) | `19da4b45f0666c063934af616f3e7ed3caa99d4ee1e46d53efadc7a8a4d38e43a36ced7249acd7ad3dcc4b4f60d8451b4f7ec7727e478ee2fadd14d353228bce` +[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-client-windows-386.tar.gz) | `775c9afb6cb3e7c4ba53e9f48a5df2cf207234a33059bd74448bc9f177dd120fb3f9c58ab45048a566326acc43bc8a67e886e10ef99f20780c8f63bb17426ebd` +[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-client-windows-amd64.tar.gz) | `208d2595a5b57ac97aac75b4a2a6130f0c937f781a030bde1a432daf4bc51f2fa523fca2eb84c38798489c4b536ee90aad22f7be8477985d9691d51ad8e1c4dc` + +### Server Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-server-linux-amd64.tar.gz) | `dcf832eae04f9f52ff473754ef5cfe697b35f4dc1a282622c94fa10943c8c35f4a8777a0c58c7de871c3c428c8973bf72d6bcd8751416d4c682125268b8fcefe` +[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-server-linux-arm.tar.gz) | `a04e34bea28eb1c8b492e8b1dd3c0dd87ebee71a7dbbef72be10a335e553361af7e48296e504f9844496b04e66350871114d20cfac3f3b49550d8be60f324ba3` +[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-server-linux-arm64.tar.gz) | `a6af086b07a8c2e498f32b43e6511bf6a5e6baf358c572c6910c8df17cd6cae94f562f459714fcead1595767cb14c7f639c5735f1411173bbd38d5604c082a77` +[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-server-linux-ppc64le.tar.gz) | `5a960ef5ba0c255f587f2ac0b028cd03136dc91e4efc5d1becab46417852e5524d18572b6f66259531ec6fea997da3c4d162ac153a9439672154375053fec6c7` +[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-server-linux-s390x.tar.gz) | `0f32c7d9b14bc238b9a5764d8f00edc4d3bf36bcf06b340b81061424e6070768962425194a8c2025c3a7ffb97b1de551d3ad23d1591ae34dd4e3ba25ab364c33` + +### Node Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-node-linux-amd64.tar.gz) | `27d8955d535d14f3f4dca501fd27e4f06fad84c6da878ea5332a5c83b6955667f6f731bfacaf5a3a23c09f14caa400f9bee927a0f269f5374de7f79cd1919b3b` +[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-node-linux-arm.tar.gz) | `0d56eccad63ba608335988e90b377fe8ae978b177dc836cdb803a5c99d99e8f3399a666d9477ca9cfe5964944993e85c416aec10a99323e3246141efc0b1cc9e` +[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-node-linux-arm64.tar.gz) | `79bb9be66f9e892d866b28e5cc838245818edb9706981fab6ccbff493181b341c1fcf6fe5d2342120a112eb93af413f5ba191cfba1ab4c4a8b0546a5ad8ec220` +[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-node-linux-ppc64le.tar.gz) | `3e9e2c6f9a2747d828069511dce8b4034c773c2d122f005f4508e22518055c1e055268d9d86773bbd26fbd2d887d783f408142c6c2f56ab2f2365236fd4d2635` +[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-node-linux-s390x.tar.gz) | `4f96e018c336fa13bb6df6f7217fe46a2b5c47f806f786499c429604ccba2ebe558503ab2c72f63250aa25b61dae2d166e4b80ae10f6ab37d714f87c1dcf6691` +[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.18.0-rc.1/kubernetes-node-windows-amd64.tar.gz) | `ab110d76d506746af345e5897ef4f6993d5f53ac818ba69a334f3641047351aa63bfb3582841a9afca51dd0baff8b9010077d9c8ec85d2d69e4172b8d4b338b0` + +## Changelog since v1.18.0-beta.2 + +## Changes by Kind + +### API Change + +- Removes ConfigMap as suggestion for IngressClass parameters ([#89093](https://github.com/kubernetes/kubernetes/pull/89093), [@robscott](https://github.com/robscott)) [SIG Network] + +### Other (Bug, Cleanup or Flake) + +- EndpointSlice should not contain endpoints for terminating pods ([#89056](https://github.com/kubernetes/kubernetes/pull/89056), [@andrewsykim](https://github.com/andrewsykim)) [SIG Apps and Network] +- Fix a bug where ExternalTrafficPolicy is not applied to service ExternalIPs. ([#88786](https://github.com/kubernetes/kubernetes/pull/88786), [@freehan](https://github.com/freehan)) [SIG Network] +- Fix invalid VMSS updates due to incorrect cache ([#89002](https://github.com/kubernetes/kubernetes/pull/89002), [@ArchangelSDY](https://github.com/ArchangelSDY)) [SIG Cloud Provider] +- Fix isCurrentInstance for Windows by removing the dependency of hostname. ([#89138](https://github.com/kubernetes/kubernetes/pull/89138), [@feiskyer](https://github.com/feiskyer)) [SIG Cloud Provider] +- Fixed a data race in kubelet image manager that can cause static pod workers to silently stop working. ([#88915](https://github.com/kubernetes/kubernetes/pull/88915), [@roycaihw](https://github.com/roycaihw)) [SIG Node] +- Fixed an issue that could cause the kubelet to incorrectly run concurrent pod reconciliation loops and crash. ([#89055](https://github.com/kubernetes/kubernetes/pull/89055), [@tedyu](https://github.com/tedyu)) [SIG Node] +- Kube-proxy: on dual-stack mode, if it is not able to get the IP Family of an endpoint, logs it with level InfoV(4) instead of Warning, avoiding flooding the logs for endpoints without addresses ([#88934](https://github.com/kubernetes/kubernetes/pull/88934), [@aojea](https://github.com/aojea)) [SIG Network] +- Update Cluster Autoscaler to 1.18.0; changelog: https://github.com/kubernetes/autoscaler/releases/tag/cluster-autoscaler-1.18.0 ([#89095](https://github.com/kubernetes/kubernetes/pull/89095), [@losipiuk](https://github.com/losipiuk)) [SIG Autoscaling and Cluster Lifecycle] + + +# v1.18.0-beta.2 + +[Documentation](https://docs.k8s.io) + +## Downloads for v1.18.0-beta.2 + +filename | sha512 hash +-------- | ----------- +[kubernetes.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes.tar.gz) | `3017430ca17f8a3523669b4a02c39cedfc6c48b07281bc0a67a9fbe9d76547b76f09529172cc01984765353a6134a43733b7315e0dff370bba2635dd2a6289af` +[kubernetes-src.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-src.tar.gz) | `c5fd60601380a99efff4458b1c9cf4dc02195f6f756b36e590e54dff68f7064daf32cf63980dddee13ef9dec7a60ad4eeb47a288083fdbbeeef4bc038384e9ea` + +### Client Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-client-darwin-386.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-client-darwin-386.tar.gz) | `7e49ede167b9271d4171e477fa21d267b2fb35f80869337d5b323198dc12f71b61441975bf925ad6e6cd7b61cbf6372d386417dc1e5c9b3c87ae651021c37237` +[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-client-darwin-amd64.tar.gz) | `3f5cdf0e85eee7d0773e0ae2df1c61329dea90e0da92b02dae1ffd101008dc4bade1c4951fc09f0cad306f0bcb7d16da8654334ddee43d5015913cc4ac8f3eda` +[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-client-linux-386.tar.gz) | `b67b41c11bfecb88017c33feee21735c56f24cf6f7851b63c752495fc0fb563cd417a67a81f46bca091f74dc00fca1f296e483d2e3dfe2004ea4b42e252d30b9` +[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-client-linux-amd64.tar.gz) | `1fef2197cb80003e3a5c26f05e889af9d85fbbc23e27747944d2997ace4bfa28f3670b13c08f5e26b7e274176b4e2df89c1162aebd8b9506e63b39b311b2d405` +[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-client-linux-arm.tar.gz) | `84e5f4d9776490219ee94a84adccd5dfc7c0362eb330709771afcde95ec83f03d96fe7399eec218e47af0a1e6445e24d95e6f9c66c0882ef8233a09ff2022420` +[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-client-linux-arm64.tar.gz) | `ba613b114e0cca32fa21a3d10f845aa2f215d3af54e775f917ff93919f7dd7075efe254e4047a85a1f4b817fc2bd78006c2e8873885f1208cbc02db99e2e2e25` +[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-client-linux-ppc64le.tar.gz) | `502a6938d8c4bbe04abbd19b59919d86765058ff72334848be4012cec493e0e7027c6cd950cf501367ac2026eea9f518110cb72d1c792322b396fc2f73d23217` +[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-client-linux-s390x.tar.gz) | `c24700e0ed2ef5c1d2dd282d638c88d90392ae90ea420837b39fd8e1cfc19525017325ccda71d8472fdaea174762208c09e1bba9bbc77c89deef6fac5e847ba2` +[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-client-windows-386.tar.gz) | `0d4c5a741b052f790c8b0923c9586ee9906225e51cf4dc8a56fc303d4d61bb5bf77fba9e65151dec7be854ff31da8fc2dcd3214563e1b4b9951e6af4aa643da4` +[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-client-windows-amd64.tar.gz) | `841ef2e306c0c9593f04d9528ee019bf3b667761227d9afc1d6ca8bf1aa5631dc25f5fe13ff329c4bf0c816b971fd0dec808f879721e0f3bf51ce49772b38010` + +### Server Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-server-linux-amd64.tar.gz) | `b373df2e6ef55215e712315a5508e85a39126bd81b7b93c6b6305238919a88c740077828a6f19bcd97141951048ef7a19806ef6b1c3e1772dbc45715c5fcb3af` +[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-server-linux-arm.tar.gz) | `b8103cb743c23076ce8dd7c2da01c8dd5a542fbac8480e82dc673139c8ee5ec4495ca33695e7a18dd36412cf1e18ed84c8de05042525ddd8e869fbdfa2766569` +[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-server-linux-arm64.tar.gz) | `8f8f05cf64fb9c8d80cdcb4935b2d3e3edc48bdd303231ae12f93e3f4d979237490744a11e24ba7f52dbb017ca321a8e31624dcffa391b8afda3d02078767fa0` +[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-server-linux-ppc64le.tar.gz) | `b313b911c46f2ec129537407af3f165f238e48caeb4b9e530783ffa3659304a544ed02bef8ece715c279373b9fb2c781bd4475560e02c4b98a6d79837bc81938` +[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-server-linux-s390x.tar.gz) | `a1b6b06571141f507b12e5ef98efb88f4b6b9aba924722b2a74f11278d29a2972ab8290608360151d124608e6e24da0eb3516d484cb5fa12ff2987562f15964a` + +### Node Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-node-linux-amd64.tar.gz) | `20e02ca327543cddb2568ead3d5de164cbfb2914ab6416106d906bf12fcfbc4e55b13bea4d6a515e8feab038e2c929d72c4d6909dfd7881ba69fd1e8c772ab99` +[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-node-linux-arm.tar.gz) | `ecd817ef05d6284f9c6592b84b0a48ea31cf4487030c9fb36518474b2a33dad11b9c852774682e60e4e8b074e6bea7016584ca281dddbe2994da5eaf909025c0` +[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-node-linux-arm64.tar.gz) | `0020d32b7908ffd5055c8b26a8b3033e4702f89efcfffe3f6fcdb8a9921fa8eaaed4193c85597c24afd8c523662454f233521bb7055841a54c182521217ccc9d` +[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-node-linux-ppc64le.tar.gz) | `e065411d66d486e7793449c1b2f5a412510b913bf7f4e728c0a20e275642b7668957050dc266952cdff09acc391369ae6ac5230184db89af6823ba400745f2fc` +[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-node-linux-s390x.tar.gz) | `082ee90413beaaea41d6cbe9a18f7d783a95852607f3b94190e0ca12aacdd97d87e233b87117871bfb7d0a4b6302fbc7688549492a9bc50a2f43a5452504d3ce` +[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.18.0-beta.2/kubernetes-node-windows-amd64.tar.gz) | `fb5aca0cc36be703f9d4033eababd581bac5de8399c50594db087a99ed4cb56e4920e960eb81d0132d696d094729254eeda2a5c0cb6e65e3abca6c8d61da579e` + +## Changelog since v1.18.0-beta.1 + +## Urgent Upgrade Notes + +### (No, really, you MUST read this before you upgrade) + +- `kubectl` no longer defaults to `http://localhost:8080`. If you own one of these legacy clusters, you are *strongly- encouraged to secure your server. If you cannot secure your server, you can set `KUBERNETES_MASTER` if you were relying on that behavior and you're a client-go user. Set `--server`, `--kubeconfig` or `KUBECONFIG` to make it work in `kubectl`. ([#86173](https://github.com/kubernetes/kubernetes/pull/86173), [@soltysh](https://github.com/soltysh)) [SIG API Machinery, CLI and Testing] + +## Changes by Kind + +### Deprecation + +- AlgorithmSource is removed from v1alpha2 Scheduler ComponentConfig ([#87999](https://github.com/kubernetes/kubernetes/pull/87999), [@damemi](https://github.com/damemi)) [SIG Scheduling] +- Kube-proxy: deprecate `--healthz-port` and `--metrics-port` flag, please use `--healthz-bind-address` and `--metrics-bind-address` instead ([#88512](https://github.com/kubernetes/kubernetes/pull/88512), [@SataQiu](https://github.com/SataQiu)) [SIG Network] +- Kubeadm: deprecate the usage of the experimental flag '--use-api' under the 'kubeadm alpha certs renew' command. ([#88827](https://github.com/kubernetes/kubernetes/pull/88827), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle] + +### API Change + +- A new IngressClass resource has been added to enable better Ingress configuration. ([#88509](https://github.com/kubernetes/kubernetes/pull/88509), [@robscott](https://github.com/robscott)) [SIG API Machinery, Apps, CLI, Network, Node and Testing] +- Added GenericPVCDataSource feature gate to enable using arbitrary custom resources as the data source for a PVC. ([#88636](https://github.com/kubernetes/kubernetes/pull/88636), [@bswartz](https://github.com/bswartz)) [SIG Apps and Storage] +- Allow user to specify fsgroup permission change policy for pods ([#88488](https://github.com/kubernetes/kubernetes/pull/88488), [@gnufied](https://github.com/gnufied)) [SIG Apps and Storage] +- BlockVolume and CSIBlockVolume features are now GA. ([#88673](https://github.com/kubernetes/kubernetes/pull/88673), [@jsafrane](https://github.com/jsafrane)) [SIG Apps, Node and Storage] +- CustomResourceDefinition schemas that use `x-kubernetes-list-map-keys` to specify properties that uniquely identify list items must make those properties required or have a default value, to ensure those properties are present for all list items. See https://kubernetes.io/docs/reference/using-api/api-concepts/#merge-strategy for details. ([#88076](https://github.com/kubernetes/kubernetes/pull/88076), [@eloyekunle](https://github.com/eloyekunle)) [SIG API Machinery and Testing] +- Fixes a regression with clients prior to 1.15 not being able to update podIP in pod status, or podCIDR in node spec, against >= 1.16 API servers ([#88505](https://github.com/kubernetes/kubernetes/pull/88505), [@liggitt](https://github.com/liggitt)) [SIG Apps and Network] +- Ingress: Add Exact and Prefix maching to Ingress PathTypes ([#88587](https://github.com/kubernetes/kubernetes/pull/88587), [@cmluciano](https://github.com/cmluciano)) [SIG Apps, Cluster Lifecycle and Network] +- Ingress: Add alternate backends via TypedLocalObjectReference ([#88775](https://github.com/kubernetes/kubernetes/pull/88775), [@cmluciano](https://github.com/cmluciano)) [SIG Apps and Network] +- Ingress: allow wildcard hosts in IngressRule ([#88858](https://github.com/kubernetes/kubernetes/pull/88858), [@cmluciano](https://github.com/cmluciano)) [SIG Network] +- Kube-controller-manager and kube-scheduler expose profiling by default to match the kube-apiserver. Use `--enable-profiling=false` to disable. ([#88663](https://github.com/kubernetes/kubernetes/pull/88663), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, Cloud Provider and Scheduling] +- Move TaintBasedEvictions feature gates to GA ([#87487](https://github.com/kubernetes/kubernetes/pull/87487), [@skilxn-go](https://github.com/skilxn-go)) [SIG API Machinery, Apps, Node, Scheduling and Testing] +- New flag --endpointslice-updates-batch-period in kube-controller-manager can be used to reduce number of endpointslice updates generated by pod changes. ([#88745](https://github.com/kubernetes/kubernetes/pull/88745), [@mborsz](https://github.com/mborsz)) [SIG API Machinery, Apps and Network] +- Scheduler Extenders can now be configured in the v1alpha2 component config ([#88768](https://github.com/kubernetes/kubernetes/pull/88768), [@damemi](https://github.com/damemi)) [SIG Release, Scheduling and Testing] +- The apiserver/v1alph1#EgressSelectorConfiguration API is now beta. ([#88502](https://github.com/kubernetes/kubernetes/pull/88502), [@caesarxuchao](https://github.com/caesarxuchao)) [SIG API Machinery] +- The storage.k8s.io/CSIDriver has moved to GA, and is now available for use. ([#84814](https://github.com/kubernetes/kubernetes/pull/84814), [@huffmanca](https://github.com/huffmanca)) [SIG API Machinery, Apps, Auth, Node, Scheduling, Storage and Testing] +- VolumePVCDataSource moves to GA in 1.18 release ([#88686](https://github.com/kubernetes/kubernetes/pull/88686), [@j-griffith](https://github.com/j-griffith)) [SIG Apps, CLI and Cluster Lifecycle] + +### Feature + +- Add `rest_client_rate_limiter_duration_seconds` metric to component-base to track client side rate limiter latency in seconds. Broken down by verb and URL. ([#88134](https://github.com/kubernetes/kubernetes/pull/88134), [@jennybuckley](https://github.com/jennybuckley)) [SIG API Machinery, Cluster Lifecycle and Instrumentation] +- Allow user to specify resource using --filename flag when invoking kubectl exec ([#88460](https://github.com/kubernetes/kubernetes/pull/88460), [@soltysh](https://github.com/soltysh)) [SIG CLI and Testing] +- Apiserver add a new flag --goaway-chance which is the fraction of requests that will be closed gracefully(GOAWAY) to prevent HTTP/2 clients from getting stuck on a single apiserver. + After the connection closed(received GOAWAY), the client's other in-flight requests won't be affected, and the client will reconnect. + The flag min value is 0 (off), max is .02 (1/50 requests); .001 (1/1000) is a recommended starting point. + Clusters with single apiservers, or which don't use a load balancer, should NOT enable this. ([#88567](https://github.com/kubernetes/kubernetes/pull/88567), [@answer1991](https://github.com/answer1991)) [SIG API Machinery] +- Azure: add support for single stack IPv6 ([#88448](https://github.com/kubernetes/kubernetes/pull/88448), [@aramase](https://github.com/aramase)) [SIG Cloud Provider] +- DefaultConstraints can be specified for the PodTopologySpread plugin in the component config ([#88671](https://github.com/kubernetes/kubernetes/pull/88671), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling] +- Kubeadm: support Windows specific kubelet flags in kubeadm-flags.env ([#88287](https://github.com/kubernetes/kubernetes/pull/88287), [@gab-satchi](https://github.com/gab-satchi)) [SIG Cluster Lifecycle and Windows] +- Kubectl cluster-info dump changed to only display a message telling you the location where the output was written when the output is not standard output. ([#88765](https://github.com/kubernetes/kubernetes/pull/88765), [@brianpursley](https://github.com/brianpursley)) [SIG CLI] +- Print NotReady when pod is not ready based on its conditions. ([#88240](https://github.com/kubernetes/kubernetes/pull/88240), [@soltysh](https://github.com/soltysh)) [SIG CLI] +- Scheduler Extender API is now located under k8s.io/kube-scheduler/extender ([#88540](https://github.com/kubernetes/kubernetes/pull/88540), [@damemi](https://github.com/damemi)) [SIG Release, Scheduling and Testing] +- Signatures on scale client methods have been modified to accept `context.Context` as a first argument. Signatures of Get, Update, and Patch methods have been updated to accept GetOptions, UpdateOptions and PatchOptions respectively. ([#88599](https://github.com/kubernetes/kubernetes/pull/88599), [@julianvmodesto](https://github.com/julianvmodesto)) [SIG API Machinery, Apps, Autoscaling and CLI] +- Signatures on the dynamic client methods have been modified to accept `context.Context` as a first argument. Signatures of Delete and DeleteCollection methods now accept DeleteOptions by value instead of by reference. ([#88906](https://github.com/kubernetes/kubernetes/pull/88906), [@liggitt](https://github.com/liggitt)) [SIG API Machinery, Apps, CLI, Cluster Lifecycle, Storage and Testing] +- Signatures on the metadata client methods have been modified to accept `context.Context` as a first argument. Signatures of Delete and DeleteCollection methods now accept DeleteOptions by value instead of by reference. ([#88910](https://github.com/kubernetes/kubernetes/pull/88910), [@liggitt](https://github.com/liggitt)) [SIG API Machinery, Apps and Testing] +- Webhooks will have alpha support for network proxy ([#85870](https://github.com/kubernetes/kubernetes/pull/85870), [@Jefftree](https://github.com/Jefftree)) [SIG API Machinery, Auth and Testing] +- When client certificate files are provided, reload files for new connections, and close connections when a certificate changes. ([#79083](https://github.com/kubernetes/kubernetes/pull/79083), [@jackkleeman](https://github.com/jackkleeman)) [SIG API Machinery, Auth, Node and Testing] +- When deleting objects using kubectl with the --force flag, you are no longer required to also specify --grace-period=0. ([#87776](https://github.com/kubernetes/kubernetes/pull/87776), [@brianpursley](https://github.com/brianpursley)) [SIG CLI] +- `kubectl` now contains a `kubectl alpha debug` command. This command allows attaching an ephemeral container to a running pod for the purposes of debugging. ([#88004](https://github.com/kubernetes/kubernetes/pull/88004), [@verb](https://github.com/verb)) [SIG CLI] + +### Documentation + +- Update Japanese translation for kubectl help ([#86837](https://github.com/kubernetes/kubernetes/pull/86837), [@inductor](https://github.com/inductor)) [SIG CLI and Docs] +- `kubectl plugin` now prints a note how to install krew ([#88577](https://github.com/kubernetes/kubernetes/pull/88577), [@corneliusweig](https://github.com/corneliusweig)) [SIG CLI] + +### Other (Bug, Cleanup or Flake) + +- Azure VMSS LoadBalancerBackendAddressPools updating has been improved with squential-sync + concurrent-async requests. ([#88699](https://github.com/kubernetes/kubernetes/pull/88699), [@feiskyer](https://github.com/feiskyer)) [SIG Cloud Provider] +- AzureFile and CephFS use new Mount library that prevents logging of sensitive mount options. ([#88684](https://github.com/kubernetes/kubernetes/pull/88684), [@saad-ali](https://github.com/saad-ali)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation and Storage] +- Build: Enable kube-cross image-building on K8s Infra ([#88562](https://github.com/kubernetes/kubernetes/pull/88562), [@justaugustus](https://github.com/justaugustus)) [SIG Release and Testing] +- Client-go certificate manager rotation gained the ability to preserve optional intermediate chains accompanying issued certificates ([#88744](https://github.com/kubernetes/kubernetes/pull/88744), [@jackkleeman](https://github.com/jackkleeman)) [SIG API Machinery and Auth] +- Conformance image now depends on stretch-slim instead of debian-hyperkube-base as that image is being deprecated and removed. ([#88702](https://github.com/kubernetes/kubernetes/pull/88702), [@dims](https://github.com/dims)) [SIG Cluster Lifecycle, Release and Testing] +- Deprecate --generator flag from kubectl create commands ([#88655](https://github.com/kubernetes/kubernetes/pull/88655), [@soltysh](https://github.com/soltysh)) [SIG CLI] +- FIX: prevent apiserver from panicking when failing to load audit webhook config file ([#88879](https://github.com/kubernetes/kubernetes/pull/88879), [@JoshVanL](https://github.com/JoshVanL)) [SIG API Machinery and Auth] +- Fix /readyz to return error immediately after a shutdown is initiated, before the --shutdown-delay-duration has elapsed. ([#88911](https://github.com/kubernetes/kubernetes/pull/88911), [@tkashem](https://github.com/tkashem)) [SIG API Machinery] +- Fix a bug where kubenet fails to parse the tc output. ([#83572](https://github.com/kubernetes/kubernetes/pull/83572), [@chendotjs](https://github.com/chendotjs)) [SIG Network] +- Fix describe ingress annotations not sorted. ([#88394](https://github.com/kubernetes/kubernetes/pull/88394), [@zhouya0](https://github.com/zhouya0)) [SIG CLI] +- Fix handling of aws-load-balancer-security-groups annotation. Security-Groups assigned with this annotation are no longer modified by kubernetes which is the expected behaviour of most users. Also no unnecessary Security-Groups are created anymore if this annotation is used. ([#83446](https://github.com/kubernetes/kubernetes/pull/83446), [@Elias481](https://github.com/Elias481)) [SIG Cloud Provider] +- Fix kubectl create deployment image name ([#86636](https://github.com/kubernetes/kubernetes/pull/86636), [@zhouya0](https://github.com/zhouya0)) [SIG CLI] +- Fix missing "apiVersion" for "involvedObject" in Events for Nodes. ([#87537](https://github.com/kubernetes/kubernetes/pull/87537), [@uthark](https://github.com/uthark)) [SIG Apps and Node] +- Fix that prevents repeated fetching of PVC/PV objects by kubelet when processing of pod volumes fails. While this prevents hammering API server in these error scenarios, it means that some errors in processing volume(s) for a pod could now take up to 2-3 minutes before retry. ([#88141](https://github.com/kubernetes/kubernetes/pull/88141), [@tedyu](https://github.com/tedyu)) [SIG Node and Storage] +- Fix: azure file mount timeout issue ([#88610](https://github.com/kubernetes/kubernetes/pull/88610), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage] +- Fix: corrupted mount point in csi driver ([#88569](https://github.com/kubernetes/kubernetes/pull/88569), [@andyzhangx](https://github.com/andyzhangx)) [SIG Storage] +- Fixed a bug in the TopologyManager. Previously, the TopologyManager would only guarantee alignment if container creation was serialized in some way. Alignment is now guaranteed under all scenarios of container creation. ([#87759](https://github.com/kubernetes/kubernetes/pull/87759), [@klueska](https://github.com/klueska)) [SIG Node] +- Fixed block CSI volume cleanup after timeouts. ([#88660](https://github.com/kubernetes/kubernetes/pull/88660), [@jsafrane](https://github.com/jsafrane)) [SIG Node and Storage] +- Fixes issue where you can't attach more than 15 GCE Persistent Disks to c2, n2, m1, m2 machine types. ([#88602](https://github.com/kubernetes/kubernetes/pull/88602), [@yuga711](https://github.com/yuga711)) [SIG Storage] +- For volumes that allow attaches across multiple nodes, attach and detach operations across different nodes are now executed in parallel. ([#88678](https://github.com/kubernetes/kubernetes/pull/88678), [@verult](https://github.com/verult)) [SIG Apps, Node and Storage] +- Hide kubectl.kubernetes.io/last-applied-configuration in describe command ([#88758](https://github.com/kubernetes/kubernetes/pull/88758), [@soltysh](https://github.com/soltysh)) [SIG Auth and CLI] +- In GKE alpha clusters it will be possible to use the service annotation `cloud.google.com/network-tier: Standard` ([#88487](https://github.com/kubernetes/kubernetes/pull/88487), [@zioproto](https://github.com/zioproto)) [SIG Cloud Provider] +- Kubelets perform fewer unnecessary pod status update operations on the API server. ([#88591](https://github.com/kubernetes/kubernetes/pull/88591), [@smarterclayton](https://github.com/smarterclayton)) [SIG Node and Scalability] +- Plugin/PluginConfig and Policy APIs are mutually exclusive when running the scheduler ([#88864](https://github.com/kubernetes/kubernetes/pull/88864), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling] +- Specifying PluginConfig for the same plugin more than once fails scheduler startup. + + Specifying extenders and configuring .ignoredResources for the NodeResourcesFit plugin fails ([#88870](https://github.com/kubernetes/kubernetes/pull/88870), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling] +- Support TLS Server Name overrides in kubeconfig file and via --tls-server-name in kubectl ([#88769](https://github.com/kubernetes/kubernetes/pull/88769), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, Auth and CLI] +- Terminating a restartPolicy=Never pod no longer has a chance to report the pod succeeded when it actually failed. ([#88440](https://github.com/kubernetes/kubernetes/pull/88440), [@smarterclayton](https://github.com/smarterclayton)) [SIG Node and Testing] +- The EventRecorder from k8s.io/client-go/tools/events will now create events in the default namespace (instead of kube-system) when the related object does not have it set. ([#88815](https://github.com/kubernetes/kubernetes/pull/88815), [@enj](https://github.com/enj)) [SIG API Machinery] +- The audit event sourceIPs list will now always end with the IP that sent the request directly to the API server. ([#87167](https://github.com/kubernetes/kubernetes/pull/87167), [@tallclair](https://github.com/tallclair)) [SIG API Machinery and Auth] +- Update to use golang 1.13.8 ([#87648](https://github.com/kubernetes/kubernetes/pull/87648), [@ialidzhikov](https://github.com/ialidzhikov)) [SIG Release and Testing] +- Validate kube-proxy flags --ipvs-tcp-timeout, --ipvs-tcpfin-timeout, --ipvs-udp-timeout ([#88657](https://github.com/kubernetes/kubernetes/pull/88657), [@chendotjs](https://github.com/chendotjs)) [SIG Network] + + +# v1.18.0-beta.1 + +[Documentation](https://docs.k8s.io) + +## Downloads for v1.18.0-beta.1 + +filename | sha512 hash +-------- | ----------- +[kubernetes.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes.tar.gz) | `7c182ca905b3a31871c01ab5fdaf46f074547536c7975e069ff230af0d402dfc0346958b1d084bd2c108582ffc407484e6a15a1cd93e9affbe34b6e99409ef1f` +[kubernetes-src.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-src.tar.gz) | `d104b8c792b1517bd730787678c71c8ee3b259de81449192a49a1c6e37a6576d28f69b05c2019cc4a4c40ddeb4d60b80138323df3f85db8682caabf28e67c2de` + +### Client Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-client-darwin-386.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-client-darwin-386.tar.gz) | `bc337bb8f200a789be4b97ce99b9d7be78d35ebd64746307c28339dc4628f56d9903e0818c0888aaa9364357a528d1ac6fd34f74377000f292ec502fbea3837e` +[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-client-darwin-amd64.tar.gz) | `38dfa5e0b0cfff39942c913a6bcb2ad8868ec43457d35cffba08217bb6e7531720e0731f8588505f4c81193ce5ec0e5fe6870031cf1403fbbde193acf7e53540` +[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-client-linux-386.tar.gz) | `8e63ec7ce29c69241120c037372c6c779e3f16253eabd612c7cbe6aa89326f5160eb5798004d723c5cd72d458811e98dac3574842eb6a57b2798ecd2bbe5bcf9` +[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-client-linux-amd64.tar.gz) | `c1be9f184a7c3f896a785c41cd6ece9d90d8cb9b1f6088bdfb5557d8856c55e455f6688f5f54c2114396d5ae7adc0361e34ebf8e9c498d0187bd785646ccc1d0` +[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-client-linux-arm.tar.gz) | `8eab02453cfd9e847632a774a0e0cf3a33c7619fb4ced7f1840e1f71444e8719b1c8e8cbfdd1f20bb909f3abe39cdcac74f14cb9c878c656d35871b7c37c7cbe` +[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-client-linux-arm64.tar.gz) | `f7df0ec02d2e7e63278d5386e8153cfe2b691b864f17b6452cc824a5f328d688976c975b076e60f1c6b3c859e93e477134fbccc53bb49d9e846fb038b34eee48` +[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-client-linux-ppc64le.tar.gz) | `36dd5b10addca678a518e6d052c9d6edf473e3f87388a2f03f714c93c5fbfe99ace16cf3b382a531be20a8fe6f4160f8d891800dd2cff5f23c9ca12c2f4a151b` +[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-client-linux-s390x.tar.gz) | `5bdbb44b996ab4ccf3a383780270f5cfdbf174982c300723c8bddf0a48ae5e459476031c1d51b9d30ffd621d0a126c18a5de132ef1d92fca2f3e477665ea10cc` +[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-client-windows-386.tar.gz) | `5dea3d4c4e91ef889850143b361974250e99a3c526f5efee23ff9ccdcd2ceca4a2247e7c4f236bdfa77d2150157da5d676ac9c3ba26cf3a2f1e06d8827556f77` +[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-client-windows-amd64.tar.gz) | `db298e698391368703e6aea7f4345aec5a4b8c69f9d8ff6c99fb5804a6cea16d295fb01e70fe943ade3d4ce9200a081ad40da21bd331317ec9213f69b4d6c48f` + +### Server Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-server-linux-amd64.tar.gz) | `c6284929dd5940e750b48db72ffbc09f73c5ec31ab3db283babb8e4e07cd8cbb27642f592009caae4717981c0db82c16312849ef4cbafe76acc4264c7d5864ac` +[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-server-linux-arm.tar.gz) | `6fc9552cf082c54cc0833b19876117c87ba7feb5a12c7e57f71b52208daf03eaef3ca56bd22b7bce2d6e81b5a23537cf6f5497a6eaa356c0aab1d3de26c309f9` +[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-server-linux-arm64.tar.gz) | `b794b9c399e548949b5bfb2fe71123e86c2034847b2c99aca34b6de718a35355bbecdae9dc2a81c49e3c82fb4b5862526a3f63c2862b438895e12c5ea884f22e` +[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-server-linux-ppc64le.tar.gz) | `fddaed7a54f97046a91c29534645811c6346e973e22950b2607b8c119c2377e9ec2d32144f81626078cdaeca673129cc4016c1a3dbd3d43674aa777089fb56ac` +[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-server-linux-s390x.tar.gz) | `65951a534bb55069c7419f41cbcdfe2fae31541d8a3f9eca11fc2489addf281c5ad2d13719212657da0be5b898f22b57ac39446d99072872fbacb0a7d59a4f74` + +### Node Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-node-linux-amd64.tar.gz) | `992059efb5cae7ed0ef55820368d854bad1c6d13a70366162cd3b5111ce24c371c7c87ded2012f055e08b2ff1b4ef506e1f4e065daa3ac474fef50b5efa4fb07` +[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-node-linux-arm.tar.gz) | `c63ae0f8add5821ad267774314b8c8c1ffe3b785872bf278e721fd5dfdad1a5db1d4db3720bea0a36bf10d9c6dd93e247560162c0eac6e1b743246f587d3b27a` +[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-node-linux-arm64.tar.gz) | `47adb9ddf6eaf8f475b89f59ee16fbd5df183149a11ad1574eaa645b47a6d58aec2ca70ba857ce9f1a5793d44cf7a61ebc6874793bb685edaf19410f4f76fd13` +[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-node-linux-ppc64le.tar.gz) | `a3bc4a165567c7b76a3e45ab7b102d6eb3ecf373eb048173f921a4964cf9be8891d0d5b8dafbd88c3af7b0e21ef3d41c1e540c3347ddd84b929b3a3d02ceb7b2` +[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-node-linux-s390x.tar.gz) | `109ddf37c748f69584c829db57107c3518defe005c11fcd2a1471845c15aae0a3c89aafdd734229f4069ed18856cc650c80436684e1bdc43cfee3149b0324746` +[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.18.0-beta.1/kubernetes-node-windows-amd64.tar.gz) | `a3a75d2696ad3136476ad7d811e8eabaff5111b90e592695e651d6111f819ebf0165b8b7f5adc05afb5f7f01d1e5fb64876cb696e492feb20a477a5800382b7a` + +## Changelog since v1.18.0-beta.0 + +## Urgent Upgrade Notes + +### (No, really, you MUST read this before you upgrade) + +- The StreamingProxyRedirects feature and `--redirect-container-streaming` flag are deprecated, and will be removed in a future release. The default behavior (proxy streaming requests through the kubelet) will be the only supported option. + If you are setting `--redirect-container-streaming=true`, then you must migrate off this configuration. The flag will no longer be able to be enabled starting in v1.20. If you are not setting the flag, no action is necessary. ([#88290](https://github.com/kubernetes/kubernetes/pull/88290), [@tallclair](https://github.com/tallclair)) [SIG API Machinery and Node] + +- Yes. + + Feature Name: Support using network resources (VNet, LB, IP, etc.) in different AAD Tenant and Subscription than those for the cluster. + + Changes in Pull Request: + + 1. Add properties `networkResourceTenantID` and `networkResourceSubscriptionID` in cloud provider auth config section, which indicates the location of network resources. + 2. Add function `GetMultiTenantServicePrincipalToken` to fetch multi-tenant service principal token, which will be used by Azure VM/VMSS Clients in this feature. + 3. Add function `GetNetworkResourceServicePrincipalToken` to fetch network resource service principal token, which will be used by Azure Network Resource (Load Balancer, Public IP, Route Table, Network Security Group and their sub level resources) Clients in this feature. + 4. Related unit tests. + + None. + + User Documentation: In PR https://github.com/kubernetes-sigs/cloud-provider-azure/pull/301 ([#88384](https://github.com/kubernetes/kubernetes/pull/88384), [@bowen5](https://github.com/bowen5)) [SIG Cloud Provider] + +## Changes by Kind + +### Deprecation + +- Azure service annotation service.beta.kubernetes.io/azure-load-balancer-disable-tcp-reset has been deprecated. Its support would be removed in a future release. ([#88462](https://github.com/kubernetes/kubernetes/pull/88462), [@feiskyer](https://github.com/feiskyer)) [SIG Cloud Provider] + +### API Change + +- API additions to apiserver types ([#87179](https://github.com/kubernetes/kubernetes/pull/87179), [@Jefftree](https://github.com/Jefftree)) [SIG API Machinery, Cloud Provider and Cluster Lifecycle] +- Add Scheduling Profiles to kubescheduler.config.k8s.io/v1alpha2 ([#88087](https://github.com/kubernetes/kubernetes/pull/88087), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling and Testing] +- Added support for multiple sizes huge pages on a container level ([#84051](https://github.com/kubernetes/kubernetes/pull/84051), [@bart0sh](https://github.com/bart0sh)) [SIG Apps, Node and Storage] +- AppProtocol is a new field on Service and Endpoints resources, enabled with the ServiceAppProtocol feature gate. ([#88503](https://github.com/kubernetes/kubernetes/pull/88503), [@robscott](https://github.com/robscott)) [SIG Apps and Network] +- Fixed missing validation of uniqueness of list items in lists with `x-kubernetes-list-type: map` or x-kubernetes-list-type: set` in CustomResources. ([#84920](https://github.com/kubernetes/kubernetes/pull/84920), [@sttts](https://github.com/sttts)) [SIG API Machinery] +- Introduces optional --detect-local flag to kube-proxy. + Currently the only supported value is "cluster-cidr", + which is the default if not specified. ([#87748](https://github.com/kubernetes/kubernetes/pull/87748), [@satyasm](https://github.com/satyasm)) [SIG Cluster Lifecycle, Network and Scheduling] +- Kube-scheduler can run more than one scheduling profile. Given a pod, the profile is selected by using its `.spec.SchedulerName`. ([#88285](https://github.com/kubernetes/kubernetes/pull/88285), [@alculquicondor](https://github.com/alculquicondor)) [SIG Apps, Scheduling and Testing] +- Moving Windows RunAsUserName feature to GA ([#87790](https://github.com/kubernetes/kubernetes/pull/87790), [@marosset](https://github.com/marosset)) [SIG Apps and Windows] + +### Feature + +- Add --dry-run to kubectl delete, taint, replace ([#88292](https://github.com/kubernetes/kubernetes/pull/88292), [@julianvmodesto](https://github.com/julianvmodesto)) [SIG CLI and Testing] +- Add huge page stats to Allocated resources in "kubectl describe node" ([#80605](https://github.com/kubernetes/kubernetes/pull/80605), [@odinuge](https://github.com/odinuge)) [SIG CLI] +- Kubeadm: The ClusterStatus struct present in the kubeadm-config ConfigMap is deprecated and will be removed on a future version. It is going to be maintained by kubeadm until it gets removed. The same information can be found on `etcd` and `kube-apiserver` pod annotations, `kubeadm.kubernetes.io/etcd.advertise-client-urls` and `kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint` respectively. ([#87656](https://github.com/kubernetes/kubernetes/pull/87656), [@ereslibre](https://github.com/ereslibre)) [SIG Cluster Lifecycle] +- Kubeadm: add the experimental feature gate PublicKeysECDSA that can be used to create a + cluster with ECDSA certificates from "kubeadm init". Renewal of existing ECDSA certificates is + also supported using "kubeadm alpha certs renew", but not switching between the RSA and + ECDSA algorithms on the fly or during upgrades. ([#86953](https://github.com/kubernetes/kubernetes/pull/86953), [@rojkov](https://github.com/rojkov)) [SIG API Machinery, Auth and Cluster Lifecycle] +- Kubeadm: on kubeconfig certificate renewal, keep the embedded CA in sync with the one on disk ([#88052](https://github.com/kubernetes/kubernetes/pull/88052), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle] +- Kubeadm: upgrade supports fallback to the nearest known etcd version if an unknown k8s version is passed ([#88373](https://github.com/kubernetes/kubernetes/pull/88373), [@SataQiu](https://github.com/SataQiu)) [SIG Cluster Lifecycle] +- New flag `--show-hidden-metrics-for-version` in kube-scheduler can be used to show all hidden metrics that deprecated in the previous minor release. ([#84913](https://github.com/kubernetes/kubernetes/pull/84913), [@serathius](https://github.com/serathius)) [SIG Instrumentation and Scheduling] +- Scheduler framework permit plugins now run at the end of the scheduling cycle, after reserve plugins. Waiting on permit will remain in the beginning of the binding cycle. ([#88199](https://github.com/kubernetes/kubernetes/pull/88199), [@mateuszlitwin](https://github.com/mateuszlitwin)) [SIG Scheduling] +- The kubelet and the default docker runtime now support running ephemeral containers in the Linux process namespace of a target container. Other container runtimes must implement this feature before it will be available in that runtime. ([#84731](https://github.com/kubernetes/kubernetes/pull/84731), [@verb](https://github.com/verb)) [SIG Node] + +### Other (Bug, Cleanup or Flake) + +- Add delays between goroutines for vm instance update ([#88094](https://github.com/kubernetes/kubernetes/pull/88094), [@aramase](https://github.com/aramase)) [SIG Cloud Provider] +- Add init containers log to cluster dump info. ([#88324](https://github.com/kubernetes/kubernetes/pull/88324), [@zhouya0](https://github.com/zhouya0)) [SIG CLI] +- CPU limits are now respected for Windows containers. If a node is over-provisioned, no weighting is used - only limits are respected. ([#86101](https://github.com/kubernetes/kubernetes/pull/86101), [@PatrickLang](https://github.com/PatrickLang)) [SIG Node, Testing and Windows] +- Cloud provider config CloudProviderBackoffMode has been removed since it won't be used anymore. ([#88463](https://github.com/kubernetes/kubernetes/pull/88463), [@feiskyer](https://github.com/feiskyer)) [SIG Cloud Provider] +- Evictions due to pods breaching their ephemeral storage limits are now recorded by the `kubelet_evictions` metric and can be alerted on. ([#87906](https://github.com/kubernetes/kubernetes/pull/87906), [@smarterclayton](https://github.com/smarterclayton)) [SIG Node] +- Fix: add remediation in azure disk attach/detach ([#88444](https://github.com/kubernetes/kubernetes/pull/88444), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider] +- Fix: check disk status before disk azure disk ([#88360](https://github.com/kubernetes/kubernetes/pull/88360), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider] +- Fixed cleaning of CSI raw block volumes. ([#87978](https://github.com/kubernetes/kubernetes/pull/87978), [@jsafrane](https://github.com/jsafrane)) [SIG Storage] +- Get-kube.sh uses the gcloud's current local GCP service account for auth when the provider is GCE or GKE instead of the metadata server default ([#88383](https://github.com/kubernetes/kubernetes/pull/88383), [@BenTheElder](https://github.com/BenTheElder)) [SIG Cluster Lifecycle] +- Golang/x/net has been updated to bring in fixes for CVE-2020-9283 ([#88381](https://github.com/kubernetes/kubernetes/pull/88381), [@BenTheElder](https://github.com/BenTheElder)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle and Instrumentation] +- Kubeadm now includes CoreDNS version 1.6.7 ([#86260](https://github.com/kubernetes/kubernetes/pull/86260), [@rajansandeep](https://github.com/rajansandeep)) [SIG Cluster Lifecycle] +- Kubeadm: fix the bug that 'kubeadm upgrade' hangs in single node cluster ([#88434](https://github.com/kubernetes/kubernetes/pull/88434), [@SataQiu](https://github.com/SataQiu)) [SIG Cluster Lifecycle] +- Optimize kubectl version help info ([#88313](https://github.com/kubernetes/kubernetes/pull/88313), [@zhouya0](https://github.com/zhouya0)) [SIG CLI] +- Removes the deprecated command `kubectl rolling-update` ([#88057](https://github.com/kubernetes/kubernetes/pull/88057), [@julianvmodesto](https://github.com/julianvmodesto)) [SIG Architecture, CLI and Testing] + + +# v1.18.0-alpha.5 + +[Documentation](https://docs.k8s.io) + +## Downloads for v1.18.0-alpha.5 + +filename | sha512 hash +-------- | ----------- +[kubernetes.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes.tar.gz) | `6452cac2b80721e9f577cb117c29b9ac6858812b4275c2becbf74312566f7d016e8b34019bd1bf7615131b191613bf9b973e40ad9ac8f6de9007d41ef2d7fd70` +[kubernetes-src.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-src.tar.gz) | `e41d9d4dd6910a42990051fcdca4bf5d3999df46375abd27ffc56aae9b455ae984872302d590da6aa85bba6079334fb5fe511596b415ee79843dee1c61c137da` + +### Client Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-client-darwin-386.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-client-darwin-386.tar.gz) | `5c95935863492b31d4aaa6be93260088dafea27663eb91edca980ca3a8485310e60441bc9050d4d577e9c3f7ffd96db516db8d64321124cec1b712e957c9fe1c` +[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-client-darwin-amd64.tar.gz) | `868faa578b3738604d8be62fae599ccc556799f1ce54807f1fe72599f20f8a1f98ad8152fac14a08a463322530b696d375253ba3653325e74b587df6e0510da3` +[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-client-linux-386.tar.gz) | `76a89d1d30b476b47f8fb808e342f89608e5c1c1787c4c06f2d7e763f9482e2ae8b31e6ad26541972e2b9a3a7c28327e3150cdd355e8b8d8b050a801bbf08d49` +[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-client-linux-amd64.tar.gz) | `07ad96a09b44d1c707d7c68312c5d69b101a3424bf1e6e9400b2e7a3fba78df04302985d473ddd640d8f3f0257be34110dbe1304b9565dd9d7a4639b7b7b85fd` +[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-client-linux-arm.tar.gz) | `c04fed9fa370a75c1b8e18b2be0821943bb9befcc784d14762ea3278e73600332a9b324d5eeaa1801d20ad6be07a553c41dcf4fa7ab3eadd0730ab043d687c8c` +[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-client-linux-arm64.tar.gz) | `4199147dea9954333df26d34248a1cb7b02ebbd6380ffcd42d9f9ed5fdabae45a59215474dab3c11436c82e60bd27cbd03b3dde288bf611cd3e78b87c783c6a9` +[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-client-linux-ppc64le.tar.gz) | `4f6d4d61d1c52d3253ca19031ebcd4bad06d19b68bbaaab5c8e8c590774faea4a5ceab1f05f2706b61780927e1467815b3479342c84d45df965aba78414727c4` +[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-client-linux-s390x.tar.gz) | `e2a454151ae5dd891230fb516a3f73f73ab97832db66fd3d12e7f1657a569f58a9fe2654d50ddd7d8ec88a5ff5094199323a4c6d7d44dcf7edb06cca11dd4de1` +[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-client-windows-386.tar.gz) | `14b262ba3b71c41f545db2a017cf1746075ada5745a858d2a62bc9df7c5dc10607220375db85e2c4cb85307b09709e58bc66a407488e0961191e3249dc7742b0` +[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-client-windows-amd64.tar.gz) | `26353c294755a917216664364b524982b7f5fc6aa832ce90134bb178df8a78604963c68873f121ea5f2626ff615bdbf2ffe54e00578739cde6df42ffae034732` + +### Server Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-server-linux-amd64.tar.gz) | `ba77e0e7c610f59647c1b2601f82752964a0f54b7ad609a89b00fcfd553d0f0249f6662becbabaa755bb769b36a2000779f08022c40fb8cc61440337481317a1` +[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-server-linux-arm.tar.gz) | `45e87b3e844ea26958b0b489e8c9b90900a3253000850f5ff9e87ffdcafba72ab8fd17b5ba092051a58a4bc277912c047a85940ec7f093dff6f9e8bf6fed3b42` +[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-server-linux-arm64.tar.gz) | `155e136e3124ead69c594eead3398d6cfdbb8f823c324880e8a7bbd1b570b05d13a77a69abd0a6758cfcc7923971cc6da4d3e0c1680fd519b632803ece00d5ce` +[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-server-linux-ppc64le.tar.gz) | `3fa0fb8221da19ad9d03278961172b7fa29a618b30abfa55e7243bb937dede8df56658acf02e6b61e7274fbc9395e237f49c62f2a83017eca2a69f67af31c01c` +[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-server-linux-s390x.tar.gz) | `db3199c3d7ba0b326d71dc8b80f50b195e79e662f71386a3b2976d47d13d7b0136887cc21df6f53e70a3d733da6eac7bbbf3bab2df8a1909a3cee4b44c32dd0b` + +### Node Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-node-linux-amd64.tar.gz) | `addcdfbad7f12647e6babb8eadf853a374605c8f18bf63f416fa4d3bf1b903aa206679d840433206423a984bb925e7983366edcdf777cf5daef6ef88e53d6dfa` +[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-node-linux-arm.tar.gz) | `b2ac54e0396e153523d116a2aaa32c919d6243931e0104cd47a23f546d710e7abdaa9eae92d978ce63c92041e63a9b56f5dd8fd06c812a7018a10ecac440f768` +[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-node-linux-arm64.tar.gz) | `7aab36f2735cba805e4fd109831a1af0f586a88db3f07581b6dc2a2aab90076b22c96b490b4f6461a8fb690bf78948b6d514274f0d6fb0664081de2d44dc48e1` +[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-node-linux-ppc64le.tar.gz) | `a579936f07ebf86f69f297ac50ba4c34caf2c0b903f73190eb581c78382b05ef36d41ade5bfd25d7b1b658cfcbee3d7125702a18e7480f9b09a62733a512a18a` +[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-node-linux-s390x.tar.gz) | `58fa0359ddd48835192fab1136a2b9b45d1927b04411502c269cda07cb8a8106536973fb4c7fedf1d41893a524c9fe2e21078fdf27bfbeed778273d024f14449` +[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.5/kubernetes-node-windows-amd64.tar.gz) | `9086c03cd92b440686cea6d8c4e48045cc46a43ab92ae0e70350b3f51804b9e2aaae7178142306768bae00d9ef6dd938167972bfa90b12223540093f735a45db` + +## Changelog since v1.18.0-alpha.3 + +### Deprecation + +- Kubeadm: command line option "kubelet-version" for `kubeadm upgrade node` has been deprecated and will be removed in a future release. ([#87942](https://github.com/kubernetes/kubernetes/pull/87942), [@SataQiu](https://github.com/SataQiu)) [SIG Cluster Lifecycle] + +### API Change + +- Kubelet podresources API now provides the information about active pods only. ([#79409](https://github.com/kubernetes/kubernetes/pull/79409), [@takmatsu](https://github.com/takmatsu)) [SIG Node] +- Remove deprecated fields from .leaderElection in kubescheduler.config.k8s.io/v1alpha2 ([#87904](https://github.com/kubernetes/kubernetes/pull/87904), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling] +- Signatures on generated clientset methods have been modified to accept `context.Context` as a first argument. Signatures of generated Create, Update, and Patch methods have been updated to accept CreateOptions, UpdateOptions and PatchOptions respectively. Clientsets that with the previous interface have been added in new "deprecated" packages to allow incremental migration to the new APIs. The deprecated packages will be removed in the 1.21 release. ([#87299](https://github.com/kubernetes/kubernetes/pull/87299), [@mikedanese](https://github.com/mikedanese)) [SIG API Machinery, Apps, Auth, Autoscaling, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Scheduling, Storage, Testing and Windows] +- The k8s.io/node-api component is no longer updated. Instead, use the RuntimeClass types located within k8s.io/api, and the generated clients located within k8s.io/client-go ([#87503](https://github.com/kubernetes/kubernetes/pull/87503), [@liggitt](https://github.com/liggitt)) [SIG Node and Release] + +### Feature + +- Add indexer for storage cacher ([#85445](https://github.com/kubernetes/kubernetes/pull/85445), [@shaloulcy](https://github.com/shaloulcy)) [SIG API Machinery] +- Add support for mount options to the FC volume plugin ([#87499](https://github.com/kubernetes/kubernetes/pull/87499), [@ejweber](https://github.com/ejweber)) [SIG Storage] +- Added a config-mode flag in azure auth module to enable getting AAD token without spn: prefix in audience claim. When it's not specified, the default behavior doesn't change. ([#87630](https://github.com/kubernetes/kubernetes/pull/87630), [@weinong](https://github.com/weinong)) [SIG API Machinery, Auth, CLI and Cloud Provider] +- Introduced BackoffManager interface for backoff management ([#87829](https://github.com/kubernetes/kubernetes/pull/87829), [@zhan849](https://github.com/zhan849)) [SIG API Machinery] +- PodTopologySpread plugin now excludes terminatingPods when making scheduling decisions. ([#87845](https://github.com/kubernetes/kubernetes/pull/87845), [@Huang-Wei](https://github.com/Huang-Wei)) [SIG Scheduling] +- Promote CSIMigrationOpenStack to Beta (off by default since it requires installation of the OpenStack Cinder CSI Driver) + The in-tree AWS OpenStack Cinder "kubernetes.io/cinder" was already deprecated a while ago and will be removed in 1.20. Users should enable CSIMigration + CSIMigrationOpenStack features and install the OpenStack Cinder CSI Driver (https://github.com/kubernetes-sigs/cloud-provider-openstack) to avoid disruption to existing Pod and PVC objects at that time. + Users should start using the OpenStack Cinder CSI Driver directly for any new volumes. ([#85637](https://github.com/kubernetes/kubernetes/pull/85637), [@dims](https://github.com/dims)) [SIG Cloud Provider] + +### Design + +- The scheduler Permit extension point doesn't return a boolean value in its Allow() and Reject() functions. ([#87936](https://github.com/kubernetes/kubernetes/pull/87936), [@Huang-Wei](https://github.com/Huang-Wei)) [SIG Scheduling] + +### Other (Bug, Cleanup or Flake) + +- Adds "volume.beta.kubernetes.io/migrated-to" annotation to PV's and PVC's when they are migrated to signal external provisioners to pick up those objects for Provisioning and Deleting. ([#87098](https://github.com/kubernetes/kubernetes/pull/87098), [@davidz627](https://github.com/davidz627)) [SIG Apps and Storage] +- Fix a bug in the dual-stack IPVS proxier where stale IPv6 endpoints were not being cleaned up ([#87695](https://github.com/kubernetes/kubernetes/pull/87695), [@andrewsykim](https://github.com/andrewsykim)) [SIG Network] +- Fix kubectl drain ignore daemonsets and others. ([#87361](https://github.com/kubernetes/kubernetes/pull/87361), [@zhouya0](https://github.com/zhouya0)) [SIG CLI] +- Fix: add azure disk migration support for CSINode ([#88014](https://github.com/kubernetes/kubernetes/pull/88014), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage] +- Fix: add non-retriable errors in azure clients ([#87941](https://github.com/kubernetes/kubernetes/pull/87941), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider] +- Fixed NetworkPolicy validation that Except values are accepted when they are outside the CIDR range. ([#86578](https://github.com/kubernetes/kubernetes/pull/86578), [@tnqn](https://github.com/tnqn)) [SIG Network] +- Improves performance of the node authorizer ([#87696](https://github.com/kubernetes/kubernetes/pull/87696), [@liggitt](https://github.com/liggitt)) [SIG Auth] +- Iptables/userspace proxy: improve performance by getting local addresses only once per sync loop, instead of for every external IP ([#85617](https://github.com/kubernetes/kubernetes/pull/85617), [@andrewsykim](https://github.com/andrewsykim)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation and Network] +- Kube-aggregator: always sets unavailableGauge metric to reflect the current state of a service. ([#87778](https://github.com/kubernetes/kubernetes/pull/87778), [@p0lyn0mial](https://github.com/p0lyn0mial)) [SIG API Machinery] +- Kubeadm allows to configure single-stack clusters if dual-stack is enabled ([#87453](https://github.com/kubernetes/kubernetes/pull/87453), [@aojea](https://github.com/aojea)) [SIG API Machinery, Cluster Lifecycle and Network] +- Kubeadm: 'kubeadm alpha kubelet config download' has been removed, please use 'kubeadm upgrade node phase kubelet-config' instead ([#87944](https://github.com/kubernetes/kubernetes/pull/87944), [@SataQiu](https://github.com/SataQiu)) [SIG Cluster Lifecycle] +- Kubeadm: remove 'kubeadm upgrade node config' command since it was deprecated in v1.15, please use 'kubeadm upgrade node phase kubelet-config' instead ([#87975](https://github.com/kubernetes/kubernetes/pull/87975), [@SataQiu](https://github.com/SataQiu)) [SIG Cluster Lifecycle] +- Kubectl describe and kubectl top pod will return a message saying "No resources found" or "No resources found in namespace" if there are no results to display. ([#87527](https://github.com/kubernetes/kubernetes/pull/87527), [@brianpursley](https://github.com/brianpursley)) [SIG CLI] +- Kubelet metrics gathered through metrics-server or prometheus should no longer timeout for Windows nodes running more than 3 pods. ([#87730](https://github.com/kubernetes/kubernetes/pull/87730), [@marosset](https://github.com/marosset)) [SIG Node, Testing and Windows] +- Kubelet metrics have been changed to buckets. + For example the exec/{podNamespace}/{podID}/{containerName} is now just exec. ([#87913](https://github.com/kubernetes/kubernetes/pull/87913), [@cheftako](https://github.com/cheftako)) [SIG Node] +- Limit number of instances in a single update to GCE target pool to 1000. ([#87881](https://github.com/kubernetes/kubernetes/pull/87881), [@wojtek-t](https://github.com/wojtek-t)) [SIG Cloud Provider, Network and Scalability] +- Make Azure clients only retry on specified HTTP status codes ([#88017](https://github.com/kubernetes/kubernetes/pull/88017), [@feiskyer](https://github.com/feiskyer)) [SIG Cloud Provider] +- Pause image contains "Architecture" in non-amd64 images ([#87954](https://github.com/kubernetes/kubernetes/pull/87954), [@BenTheElder](https://github.com/BenTheElder)) [SIG Release] +- Pods that are considered for preemption and haven't started don't produce an error log. ([#87900](https://github.com/kubernetes/kubernetes/pull/87900), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling] +- Prevent error message from being displayed when running kubectl plugin list and your path includes an empty string ([#87633](https://github.com/kubernetes/kubernetes/pull/87633), [@brianpursley](https://github.com/brianpursley)) [SIG CLI] +- `kubectl create clusterrolebinding` creates rbac.authorization.k8s.io/v1 object ([#85889](https://github.com/kubernetes/kubernetes/pull/85889), [@oke-py](https://github.com/oke-py)) [SIG CLI] + +# v1.18.0-alpha.4 + +[Documentation](https://docs.k8s.io) + +## Important note about manual tag + +Due to a [tagging bug in our Release Engineering tooling](https://github.com/kubernetes/release/issues/1080) during `v1.18.0-alpha.3`, we needed to push a manual tag (`v1.18.0-alpha.4`). + +**No binaries have been produced or will be provided for `v1.18.0-alpha.4`.** + +The changelog for `v1.18.0-alpha.4` is included as part of the [changelog since v1.18.0-alpha.3][#changelog-since-v1180-alpha3] section. + +# v1.18.0-alpha.3 + +[Documentation](https://docs.k8s.io) + +## Downloads for v1.18.0-alpha.3 + +filename | sha512 hash +-------- | ----------- +[kubernetes.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes.tar.gz) | `60bf3bfc23b428f53fd853bac18a4a905b980fcc0bacd35ccd6357a89cfc26e47de60975ea6b712e65980e6b9df82a22331152d9f08ed4dba44558ba23a422d4` +[kubernetes-src.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-src.tar.gz) | `8adf1016565a7c93713ab6fa4293c2d13b4f6e4e1ec4dcba60bd71e218b4dbe9ef5eb7dbb469006743f498fc7ddeb21865cd12bec041af60b1c0edce8b7aecd5` + +### Client Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-client-darwin-386.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-client-darwin-386.tar.gz) | `abb32e894e8280c772e96227b574da81cd1eac374b8d29158b7f222ed550087c65482eef4a9817dfb5f2baf0d9b85fcdfa8feced0fbc1aacced7296853b57e1f` +[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-client-darwin-amd64.tar.gz) | `5e4b1a993264e256ec1656305de7c306094cae9781af8f1382df4ce4eed48ce030827fde1a5e757d4ad57233d52075c9e4e93a69efbdc1102e4ba810705ccddc` +[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-client-linux-386.tar.gz) | `68da39c2ae101d2b38f6137ceda07eb0c2124794982a62ef483245dbffb0611c1441ca085fa3127e7a9977f45646788832a783544ff06954114548ea0e526e46` +[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-client-linux-amd64.tar.gz) | `dc236ffa8ad426620e50181419e9bebe3c161e953dbfb8a019f61b11286e1eb950b40d7cc03423bdf3e6974973bcded51300f98b55570c29732fa492dcde761d` +[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-client-linux-arm.tar.gz) | `ab0a8bd6dc31ea160b731593cdc490b3cc03668b1141cf95310bd7060dcaf55c7ee9842e0acae81063fdacb043c3552ccdd12a94afd71d5310b3ce056fdaa06c` +[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-client-linux-arm64.tar.gz) | `159ea083c601710d0d6aea423eeb346c99ffaf2abd137d35a53e87a07f5caf12fca8790925f3196f67b768fa92a024f83b50325dbca9ccd4dde6c59acdce3509` +[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-client-linux-ppc64le.tar.gz) | `16b0459adfa26575d13be49ab53ac7f0ffd05e184e4e13d2dfbfe725d46bb8ac891e1fd8aebe36ecd419781d4cc5cf3bd2aaaf5263cf283724618c4012408f40` +[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-client-linux-s390x.tar.gz) | `d5aa1f5d89168995d2797eb839a04ce32560f405b38c1c0baaa0e313e4771ae7bb3b28e22433ad5897d36aadf95f73eb69d8d411d31c4115b6b0adf5fe041f85` +[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-client-windows-386.tar.gz) | `374e16a1e52009be88c94786f80174d82dff66399bf294c9bee18a2159c42251c5debef1109a92570799148b08024960c6c50b8299a93fd66ebef94f198f34e9` +[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-client-windows-amd64.tar.gz) | `5a94c1068c19271f810b994adad8e62fae03b3d4473c7c9e6d056995ff7757ea61dd8d140c9267dd41e48808876673ce117826d35a3c1bb5652752f11a044d57` + +### Server Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-server-linux-amd64.tar.gz) | `a677bec81f0eba75114b92ff955bac74512b47e53959d56a685dae5edd527283d91485b1e86ad74ef389c5405863badf7eb22e2f0c9a568a4d0cb495c6a5c32f` +[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-server-linux-arm.tar.gz) | `2fb696f86ff13ebeb5f3cf2b254bf41303644c5ea84a292782eac6123550702655284d957676d382698c091358e5c7fe73f32803699c19be7138d6530fe413b6` +[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-server-linux-arm64.tar.gz) | `738e95da9cfb8f1309479078098de1c38cef5e1dd5ee1129b77651a936a412b7cd0cf15e652afc7421219646a98846ab31694970432e48dea9c9cafa03aa59cf` +[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-server-linux-ppc64le.tar.gz) | `7a85bfcbb2aa636df60c41879e96e788742ecd72040cb0db2a93418439c125218c58a4cfa96d01b0296c295793e94c544e87c2d98d50b49bc4cb06b41f874376` +[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-server-linux-s390x.tar.gz) | `1f1cdb2efa3e7cac857203d8845df2fdaa5cf1f20df764efffff29371945ec58f6deeba06f8fbf70b96faf81b0c955bf4cb84e30f9516cb2cc1ed27c2d2185a6` + +### Node Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-node-linux-amd64.tar.gz) | `4ccfced3f5ba4adfa58f4a9d1b2c5bdb3e89f9203ab0e27d11eb1c325ac323ebe63c015d2c9d070b233f5d1da76cab5349da3528511c1cd243e66edc9af381c4` +[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-node-linux-arm.tar.gz) | `d695a69d18449062e4c129e54ec8384c573955f8108f4b78adc2ec929719f2196b995469c728dd6656c63c44cda24315543939f85131ebc773cfe0de689df55b` +[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-node-linux-arm64.tar.gz) | `21df1da88c89000abc22f97e482c3aaa5ce53ec9628d83dda2e04a1d86c4d53be46c03ed6f1f211df3ee5071bce39d944ff7716b5b6ada3b9c4821d368b0a898` +[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-node-linux-ppc64le.tar.gz) | `ff77e3aacb6ed9d89baed92ef542c8b5cec83151b6421948583cf608bca3b779dce41fc6852961e00225d5e1502f6a634bfa61a36efa90e1aee90dedb787c2d2` +[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-node-linux-s390x.tar.gz) | `57d75b7977ec1a0f6e7ed96a304dbb3b8664910f42ca19aab319a9ec33535ff5901dfca4abcb33bf5741cde6d152acd89a5f8178f0efe1dc24430e0c1af5b98f` +[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.3/kubernetes-node-windows-amd64.tar.gz) | `63fdbb71773cfd73a914c498e69bb9eea3fc314366c99ffb8bd42ec5b4dae807682c83c1eb5cfb1e2feb4d11d9e49cc85ba644e954241320a835798be7653d61` + +## Changelog since v1.18.0-alpha.2 + +### Deprecation + +- Remove all the generators from kubectl run. It will now only create pods. Additionally, deprecates all the flags that are not relevant anymore. ([#87077](https://github.com/kubernetes/kubernetes/pull/87077), [@soltysh](https://github.com/soltysh)) [SIG Architecture, SIG CLI, and SIG Testing] +- kubeadm: kube-dns is deprecated and will not be supported in a future version ([#86574](https://github.com/kubernetes/kubernetes/pull/86574), [@SataQiu](https://github.com/SataQiu)) [SIG Cluster Lifecycle] + +### API Change + +- Add kubescheduler.config.k8s.io/v1alpha2 ([#87628](https://github.com/kubernetes/kubernetes/pull/87628), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling] +- --enable-cadvisor-endpoints is now disabled by default. If you need access to the cAdvisor v1 Json API please enable it explicitly in the kubelet command line. Please note that this flag was deprecated in 1.15 and will be removed in 1.19. ([#87440](https://github.com/kubernetes/kubernetes/pull/87440), [@dims](https://github.com/dims)) [SIG Instrumentation, SIG Node, and SIG Testing] +- The following feature gates are removed, because the associated features were unconditionally enabled in previous releases: CustomResourceValidation, CustomResourceSubresources, CustomResourceWebhookConversion, CustomResourcePublishOpenAPI, CustomResourceDefaulting ([#87475](https://github.com/kubernetes/kubernetes/pull/87475), [@liggitt](https://github.com/liggitt)) [SIG API Machinery] + +### Feature + +- aggragation api will have alpha support for network proxy ([#87515](https://github.com/kubernetes/kubernetes/pull/87515), [@Sh4d1](https://github.com/Sh4d1)) [SIG API Machinery] +- API request throttling (due to a high rate of requests) is now reported in client-go logs at log level 2. The messages are of the form + + Throttling request took 1.50705208s, request: GET: + + The presence of these messages, may indicate to the administrator the need to tune the cluster accordingly. ([#87740](https://github.com/kubernetes/kubernetes/pull/87740), [@jennybuckley](https://github.com/jennybuckley)) [SIG API Machinery] +- kubeadm: reject a node joining the cluster if a node with the same name already exists ([#81056](https://github.com/kubernetes/kubernetes/pull/81056), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle] +- disableAvailabilitySetNodes is added to avoid VM list for VMSS clusters. It should only be used when vmType is "vmss" and all the nodes (including masters) are VMSS virtual machines. ([#87685](https://github.com/kubernetes/kubernetes/pull/87685), [@feiskyer](https://github.com/feiskyer)) [SIG Cloud Provider] +- The kubectl --dry-run flag now accepts the values 'client', 'server', and 'none', to support client-side and server-side dry-run strategies. The boolean and unset values for the --dry-run flag are deprecated and a value will be required in a future version. ([#87580](https://github.com/kubernetes/kubernetes/pull/87580), [@julianvmodesto](https://github.com/julianvmodesto)) [SIG CLI] +- Add support for pre-allocated hugepages for more than one page size ([#82820](https://github.com/kubernetes/kubernetes/pull/82820), [@odinuge](https://github.com/odinuge)) [SIG Apps] +- Update CNI version to v0.8.5 ([#78819](https://github.com/kubernetes/kubernetes/pull/78819), [@justaugustus](https://github.com/justaugustus)) [SIG API Machinery, SIG Cluster Lifecycle, SIG Network, SIG Release, and SIG Testing] +- Skip default spreading scoring plugin for pods that define TopologySpreadConstraints ([#87566](https://github.com/kubernetes/kubernetes/pull/87566), [@skilxn-go](https://github.com/skilxn-go)) [SIG Scheduling] +- Added more details to taint toleration errors ([#87250](https://github.com/kubernetes/kubernetes/pull/87250), [@starizard](https://github.com/starizard)) [SIG Apps, and SIG Scheduling] +- Scheduler: Add DefaultBinder plugin ([#87430](https://github.com/kubernetes/kubernetes/pull/87430), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling, and SIG Testing] +- Kube-apiserver metrics will now include request counts, latencies, and response sizes for /healthz, /livez, and /readyz requests. ([#83598](https://github.com/kubernetes/kubernetes/pull/83598), [@jktomer](https://github.com/jktomer)) [SIG API Machinery] + +### Other (Bug, Cleanup or Flake) + +- Fix the masters rolling upgrade causing thundering herd of LISTs on etcd leading to control plane unavailability. ([#86430](https://github.com/kubernetes/kubernetes/pull/86430), [@wojtek-t](https://github.com/wojtek-t)) [SIG API Machinery, SIG Node, and SIG Testing] +- `kubectl diff` now returns 1 only on diff finding changes, and >1 on kubectl errors. The "exit status code 1" message as also been muted. ([#87437](https://github.com/kubernetes/kubernetes/pull/87437), [@apelisse](https://github.com/apelisse)) [SIG CLI, and SIG Testing] +- To reduce chances of throttling, VM cache is set to nil when Azure node provisioning state is deleting ([#87635](https://github.com/kubernetes/kubernetes/pull/87635), [@feiskyer](https://github.com/feiskyer)) [SIG Cloud Provider] +- Fix regression in statefulset conversion which prevented applying a statefulset multiple times. ([#87706](https://github.com/kubernetes/kubernetes/pull/87706), [@liggitt](https://github.com/liggitt)) [SIG Apps, and SIG Testing] +- fixed two scheduler metrics (pending_pods and schedule_attempts_total) not being recorded ([#87692](https://github.com/kubernetes/kubernetes/pull/87692), [@everpeace](https://github.com/everpeace)) [SIG Scheduling] +- Resolved a performance issue in the node authorizer index maintenance. ([#87693](https://github.com/kubernetes/kubernetes/pull/87693), [@liggitt](https://github.com/liggitt)) [SIG Auth] +- Removed the 'client' label from apiserver_request_total. ([#87669](https://github.com/kubernetes/kubernetes/pull/87669), [@logicalhan](https://github.com/logicalhan)) [SIG API Machinery, and SIG Instrumentation] +- `(*"k8s.io/client-go/rest".Request).{Do,DoRaw,Stream,Watch}` now require callers to pass a `context.Context` as an argument. The context is used for timeout and cancellation signaling and to pass supplementary information to round trippers in the wrapped transport chain. If you don't need any of this functionality, it is sufficient to pass a context created with `context.Background()` to these functions. The `(*"k8s.io/client-go/rest".Request).Context` method is removed now that all methods that execute a request accept a context directly. ([#87597](https://github.com/kubernetes/kubernetes/pull/87597), [@mikedanese](https://github.com/mikedanese)) [SIG API Machinery, SIG Apps, SIG Auth, SIG Autoscaling, SIG CLI, SIG Cloud Provider, SIG Cluster Lifecycle, SIG Instrumentation, SIG Network, SIG Node, SIG Scheduling, SIG Storage, and SIG Testing] +- For volumes that allow attaches across multiple nodes, attach and detach operations across different nodes are now executed in parallel. ([#87258](https://github.com/kubernetes/kubernetes/pull/87258), [@verult](https://github.com/verult)) [SIG Apps, SIG Node, and SIG Storage] +- kubeadm: apply further improvements to the tentative support for concurrent etcd member join. Fixes a bug where multiple members can receive the same hostname. Increase the etcd client dial timeout and retry timeout for add/remove/... operations. ([#87505](https://github.com/kubernetes/kubernetes/pull/87505), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle] +- Reverted a kubectl azure auth module change where oidc claim spn: prefix was omitted resulting a breaking behavior with existing Azure AD OIDC enabled api-server ([#87507](https://github.com/kubernetes/kubernetes/pull/87507), [@weinong](https://github.com/weinong)) [SIG API Machinery, SIG Auth, and SIG Cloud Provider] +- Update cri-tools to v1.17.0 ([#86305](https://github.com/kubernetes/kubernetes/pull/86305), [@saschagrunert](https://github.com/saschagrunert)) [SIG Cluster Lifecycle, and SIG Release] +- kubeadm: remove the deprecated CoreDNS feature-gate. It was set to "true" since v1.11 when the feature went GA. In v1.13 it was marked as deprecated and hidden from the CLI. ([#87400](https://github.com/kubernetes/kubernetes/pull/87400), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle] +- Shared informers are now more reliable in the face of network disruption. ([#86015](https://github.com/kubernetes/kubernetes/pull/86015), [@squeed](https://github.com/squeed)) [SIG API Machinery] +- the CSR signing cert/key pairs will be reloaded from disk like the kube-apiserver cert/key pairs ([#86816](https://github.com/kubernetes/kubernetes/pull/86816), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, SIG Apps, and SIG Auth] +- "kubectl describe statefulsets.apps" prints garbage for rolling update partition ([#85846](https://github.com/kubernetes/kubernetes/pull/85846), [@phil9909](https://github.com/phil9909)) [SIG CLI] + + + + + +# v1.18.0-alpha.2 + +[Documentation](https://docs.k8s.io) + +## Downloads for v1.18.0-alpha.2 + + +filename | sha512 hash +-------- | ----------- +[kubernetes.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes.tar.gz) | `7af83386b4b35353f0aa1bdaf73599eb08b1d1ca11ecc2c606854aff754db69f3cd3dc761b6d7fc86f01052f615ca53185f33dbf9e53b2f926b0f02fc103fbd3` +[kubernetes-src.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-src.tar.gz) | `a14b02a0a0bde97795a836a8f5897b0ee6b43e010e13e43dd4cca80a5b962a1ef3704eedc7916fed1c38ec663a71db48c228c91e5daacba7d9370df98c7ddfb6` + +### Client Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-client-darwin-386.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-client-darwin-386.tar.gz) | `427f214d47ded44519007de2ae87160c56c2920358130e474b768299751a9affcbc1b1f0f936c39c6138837bca2a97792a6700896976e98c4beee8a1944cfde1` +[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-client-darwin-amd64.tar.gz) | `861fd81ac3bd45765575bedf5e002a2294aba48ef9e15980fc7d6783985f7d7fcde990ea0aef34690977a88df758722ec0a2e170d5dcc3eb01372e64e5439192` +[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-client-linux-386.tar.gz) | `7d59b05d6247e2606a8321c72cd239713373d876dbb43b0fb7f1cb857fa6c998038b41eeed78d9eb67ce77b0b71776ceed428cce0f8d2203c5181b473e0bd86c` +[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-client-linux-amd64.tar.gz) | `7cdefb4e32bad9d2df5bb8e7e0a6f4dab2ae6b7afef5d801ac5c342d4effdeacd799081fa2dec699ecf549200786c7623c3176252010f12494a95240dd63311d` +[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-client-linux-arm.tar.gz) | `6212bbf0fa1d01ced77dcca2c4b76b73956cd3c6b70e0701c1fe0df5ff37160835f6b84fa2481e0e6979516551b14d8232d1c72764a559a3652bfe2a1e7488ff` +[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-client-linux-arm64.tar.gz) | `1f0d9990700510165ee471acb2f88222f1b80e8f6deb351ce14cf50a70a9840fb99606781e416a13231c74b2bd7576981b5348171aa33b628d2666e366cd4629` +[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-client-linux-ppc64le.tar.gz) | `77e00ba12a32db81e96f8de84609de93f32c61bb3f53875a57496d213aa6d1b92c09ad5a6de240a78e1a5bf77fac587ff92874f34a10f8909ae08ca32fda45d2` +[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-client-linux-s390x.tar.gz) | `a39ec2044bed5a4570e9c83068e0fc0ce923ccffa44380f8bbc3247426beaff79c8a84613bcb58b05f0eb3afbc34c79fe3309aa2e0b81abcfd0aa04770e62e05` +[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-client-windows-386.tar.gz) | `1a0ab88f9b7e34b60ab31d5538e97202a256ad8b7b7ed5070cae5f2f12d5d4edeae615db7a34ebbe254004b6393c6b2480100b09e30e59c9139492a3019a596a` +[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-client-windows-amd64.tar.gz) | `1966eb5dfb78c1bc33aaa6389f32512e3aa92584250a0164182f3566c81d901b59ec78ee4e25df658bc1dd221b5a9527d6ce3b6c487ca3e3c0b319a077caa735` + +### Server Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-server-linux-amd64.tar.gz) | `f814d6a3872e4572aa4da297c29def4c1fad8eba0903946780b6bf9788c72b99d71085c5aef9e12c01133b26fa4563c1766ba724ad2a8af2670a24397951a94d` +[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-server-linux-arm.tar.gz) | `56aa08225e546c92c2ff88ac57d3db7dd5e63640772ea72a429f080f7069827138cbc206f6f5fe3a0c01bfca043a9eda305ecdc1dcb864649114893e46b6dc84` +[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-server-linux-arm64.tar.gz) | `fb87128d905211ba097aa860244a376575ae2edbaca6e51402a24bc2964854b9b273e09df3d31a2bcffc91509f7eecb2118b183fb0e0eb544f33403fa235c274` +[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-server-linux-ppc64le.tar.gz) | `6d21fbf39b9d3a0df9642407d6f698fabdc809aca83af197bceb58a81b25846072f407f8fb7caae2e02dc90912e3e0f5894f062f91bcb69f8c2329625d3dfeb7` +[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-server-linux-s390x.tar.gz) | `ddcda4dc360ca97705f71bf2a18ddacd7b7ddf77535b62e699e97a1b2dd24843751313351d0112e238afe69558e8271eba4d27ab77bb67b4b9e3fbde6eec85c9` + +### Node Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-node-linux-amd64.tar.gz) | `78915a9bde35c70c67014f0cea8754849db4f6a84491a3ad9678fd3bc0203e43af5a63cfafe104ae1d56b05ce74893a87a6dcd008d7859e1af6b3bce65425b5d` +[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-node-linux-arm.tar.gz) | `3218e811abcb0cb09d80742def339be3916db5e9bbc62c0dc8e6d87085f7e3d9eeed79dea081906f1de78ddd07b7e3acdbd7765fdb838d262bb35602fd1df106` +[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-node-linux-arm64.tar.gz) | `fa22de9c4440b8fb27f4e77a5a63c5e1c8aa8aa30bb79eda843b0f40498c21b8c0ad79fff1d841bb9fef53fe20da272506de9a86f81a0b36d028dbeab2e482ce` +[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-node-linux-ppc64le.tar.gz) | `bbda9b5cc66e8f13d235703b2a85e2c4f02fa16af047be4d27a3e198e11eb11706e4a0fbb6c20978c770b069cd4cd9894b661f09937df9d507411548c36576e0` +[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-node-linux-s390x.tar.gz) | `b2ed1eda013069adce2aac00b86d75b84e006cfce9bafac0b5a2bafcb60f8f2cb346b5ea44eafa72d777871abef1ea890eb3a2a05de28968f9316fa88886a8ed` +[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.2/kubernetes-node-windows-amd64.tar.gz) | `bd8eb23dba711f31b5148257076b1bbe9629f2a75de213b2c779bd5b29279e9bf22f8bde32f4bc814f4c0cc49e19671eb8b24f4105f0fe2c1490c4b78ec3c704` + +## Changelog since v1.18.0-alpha.1 + +### Other notable changes + +* Bump golang/mock version to v1.3.1 ([#87326](https://github.com/kubernetes/kubernetes/pull/87326), [@wawa0210](https://github.com/wawa0210)) +* fix a bug that orphan revision cannot be adopted and statefulset cannot be synced ([#86801](https://github.com/kubernetes/kubernetes/pull/86801), [@likakuli](https://github.com/likakuli)) +* Azure storage clients now suppress requests on throttling ([#87306](https://github.com/kubernetes/kubernetes/pull/87306), [@feiskyer](https://github.com/feiskyer)) +* Introduce Alpha field `Immutable` in both Secret and ConfigMap objects to mark their contents as immutable. The implementation is hidden behind feature gate `ImmutableEphemeralVolumes` (currently in Alpha stage). ([#86377](https://github.com/kubernetes/kubernetes/pull/86377), [@wojtek-t](https://github.com/wojtek-t)) +* EndpointSlices will now be enabled by default. A new `EndpointSliceProxying` feature gate determines if kube-proxy will use EndpointSlices, this is disabled by default. ([#86137](https://github.com/kubernetes/kubernetes/pull/86137), [@robscott](https://github.com/robscott)) +* kubeadm upgrades always persist the etcd backup for stacked ([#86861](https://github.com/kubernetes/kubernetes/pull/86861), [@SataQiu](https://github.com/SataQiu)) +* Fix the bug PIP's DNS is deleted if no DNS label service annotation isn't set. ([#87246](https://github.com/kubernetes/kubernetes/pull/87246), [@nilo19](https://github.com/nilo19)) +* New flag `--show-hidden-metrics-for-version` in kube-controller-manager can be used to show all hidden metrics that deprecated in the previous minor release. ([#85281](https://github.com/kubernetes/kubernetes/pull/85281), [@RainbowMango](https://github.com/RainbowMango)) +* Azure network and VM clients now suppress requests on throttling ([#87122](https://github.com/kubernetes/kubernetes/pull/87122), [@feiskyer](https://github.com/feiskyer)) +* `kubectl apply -f --prune -n ` should prune all resources not defined in the file in the cli specified namespace. ([#85613](https://github.com/kubernetes/kubernetes/pull/85613), [@MartinKaburu](https://github.com/MartinKaburu)) +* Fixes service account token admission error in clusters that do not run the service account token controller ([#87029](https://github.com/kubernetes/kubernetes/pull/87029), [@liggitt](https://github.com/liggitt)) +* CustomResourceDefinition status fields are no longer required for client validation when submitting manifests. ([#87213](https://github.com/kubernetes/kubernetes/pull/87213), [@hasheddan](https://github.com/hasheddan)) +* All apiservers log request lines in a more greppable format. ([#87203](https://github.com/kubernetes/kubernetes/pull/87203), [@lavalamp](https://github.com/lavalamp)) +* provider/azure: Network security groups can now be in a separate resource group. ([#87035](https://github.com/kubernetes/kubernetes/pull/87035), [@CecileRobertMichon](https://github.com/CecileRobertMichon)) +* Cleaned up the output from `kubectl describe CSINode `. ([#85283](https://github.com/kubernetes/kubernetes/pull/85283), [@huffmanca](https://github.com/huffmanca)) +* Fixed the following ([#84265](https://github.com/kubernetes/kubernetes/pull/84265), [@bhagwat070919](https://github.com/bhagwat070919)) + * - AWS Cloud Provider attempts to delete LoadBalancer security group it didn’t provision + * - AWS Cloud Provider creates default LoadBalancer security group even if annotation [service.beta.kubernetes.io/aws-load-balancer-security-groups] is present +* kubelet: resource metrics endpoint `/metrics/resource/v1alpha1` as well as all metrics under this endpoint have been deprecated. ([#86282](https://github.com/kubernetes/kubernetes/pull/86282), [@RainbowMango](https://github.com/RainbowMango)) + * Please convert to the following metrics emitted by endpoint `/metrics/resource`: + * - scrape_error --> scrape_error + * - node_cpu_usage_seconds_total --> node_cpu_usage_seconds + * - node_memory_working_set_bytes --> node_memory_working_set_bytes + * - container_cpu_usage_seconds_total --> container_cpu_usage_seconds + * - container_memory_working_set_bytes --> container_memory_working_set_bytes + * - scrape_error --> scrape_error +* You can now pass "--node-ip ::" to kubelet to indicate that it should autodetect an IPv6 address to use as the node's primary address. ([#85850](https://github.com/kubernetes/kubernetes/pull/85850), [@danwinship](https://github.com/danwinship)) +* kubeadm: support automatic retry after failing to pull image ([#86899](https://github.com/kubernetes/kubernetes/pull/86899), [@SataQiu](https://github.com/SataQiu)) +* TODO ([#87044](https://github.com/kubernetes/kubernetes/pull/87044), [@jennybuckley](https://github.com/jennybuckley)) +* Improved yaml parsing performance ([#85458](https://github.com/kubernetes/kubernetes/pull/85458), [@cjcullen](https://github.com/cjcullen)) +* Fixed a bug which could prevent a provider ID from ever being set for node if an error occurred determining the provider ID when the node was added. ([#87043](https://github.com/kubernetes/kubernetes/pull/87043), [@zjs](https://github.com/zjs)) +* fix a regression in kubenet that prevent pods to obtain ip addresses ([#85993](https://github.com/kubernetes/kubernetes/pull/85993), [@chendotjs](https://github.com/chendotjs)) +* Bind kube-dns containers to linux nodes to avoid Windows scheduling ([#83358](https://github.com/kubernetes/kubernetes/pull/83358), [@wawa0210](https://github.com/wawa0210)) +* The following features are unconditionally enabled and the corresponding `--feature-gates` flags have been removed: `PodPriority`, `TaintNodesByCondition`, `ResourceQuotaScopeSelectors` and `ScheduleDaemonSetPods` ([#86210](https://github.com/kubernetes/kubernetes/pull/86210), [@draveness](https://github.com/draveness)) +* Bind dns-horizontal containers to linux nodes to avoid Windows scheduling on kubernetes cluster includes linux nodes and windows nodes ([#83364](https://github.com/kubernetes/kubernetes/pull/83364), [@wawa0210](https://github.com/wawa0210)) +* fix kubectl annotate error when local=true is set ([#86952](https://github.com/kubernetes/kubernetes/pull/86952), [@zhouya0](https://github.com/zhouya0)) +* Bug fixes: ([#84163](https://github.com/kubernetes/kubernetes/pull/84163), [@david-tigera](https://github.com/david-tigera)) + * Make sure we include latest packages node #351 ([@caseydavenport](https://github.com/caseydavenport)) +* fix kuebctl apply set-last-applied namespaces error ([#86474](https://github.com/kubernetes/kubernetes/pull/86474), [@zhouya0](https://github.com/zhouya0)) +* Add VolumeBinder method to FrameworkHandle interface, which allows user to get the volume binder when implementing scheduler framework plugins. ([#86940](https://github.com/kubernetes/kubernetes/pull/86940), [@skilxn-go](https://github.com/skilxn-go)) +* elasticsearch supports automatically setting the advertise address ([#85944](https://github.com/kubernetes/kubernetes/pull/85944), [@SataQiu](https://github.com/SataQiu)) +* If a serving certificates param specifies a name that is an IP for an SNI certificate, it will have priority for replying to server connections. ([#85308](https://github.com/kubernetes/kubernetes/pull/85308), [@deads2k](https://github.com/deads2k)) +* kube-proxy: Added dual-stack IPv4/IPv6 support to the iptables proxier. ([#82462](https://github.com/kubernetes/kubernetes/pull/82462), [@vllry](https://github.com/vllry)) +* Azure VMSS/VMSSVM clients now suppress requests on throttling ([#86740](https://github.com/kubernetes/kubernetes/pull/86740), [@feiskyer](https://github.com/feiskyer)) +* New metric kubelet_pleg_last_seen_seconds to aid diagnosis of PLEG not healthy issues. ([#86251](https://github.com/kubernetes/kubernetes/pull/86251), [@bboreham](https://github.com/bboreham)) +* For subprotocol negotiation, both client and server protocol is required now. ([#86646](https://github.com/kubernetes/kubernetes/pull/86646), [@tedyu](https://github.com/tedyu)) +* kubeadm: use bind-address option to configure the kube-controller-manager and kube-scheduler http probes ([#86493](https://github.com/kubernetes/kubernetes/pull/86493), [@aojea](https://github.com/aojea)) +* Marked scheduler's metrics scheduling_algorithm_predicate_evaluation_seconds and ([#86584](https://github.com/kubernetes/kubernetes/pull/86584), [@xiaoanyunfei](https://github.com/xiaoanyunfei)) + * scheduling_algorithm_priority_evaluation_seconds as deprecated. Those are replaced by framework_extension_point_duration_seconds[extenstion_point="Filter"] and framework_extension_point_duration_seconds[extenstion_point="Score"] respectively. +* Marked scheduler's scheduling_duration_seconds Summary metric as deprecated ([#86586](https://github.com/kubernetes/kubernetes/pull/86586), [@xiaoanyunfei](https://github.com/xiaoanyunfei)) +* Add instructions about how to bring up e2e test cluster ([#85836](https://github.com/kubernetes/kubernetes/pull/85836), [@YangLu1031](https://github.com/YangLu1031)) +* If a required flag is not provided to a command, the user will only see the required flag error message, instead of the entire usage menu. ([#86693](https://github.com/kubernetes/kubernetes/pull/86693), [@sallyom](https://github.com/sallyom)) +* kubeadm: tolerate whitespace when validating certificate authority PEM data in kubeconfig files ([#86705](https://github.com/kubernetes/kubernetes/pull/86705), [@neolit123](https://github.com/neolit123)) +* kubeadm: add support for the "ci/k8s-master" version label as a replacement for "ci-cross/*", which no longer exists. ([#86609](https://github.com/kubernetes/kubernetes/pull/86609), [@Pensu](https://github.com/Pensu)) +* Fix EndpointSlice controller race condition and ensure that it handles external changes to EndpointSlices. ([#85703](https://github.com/kubernetes/kubernetes/pull/85703), [@robscott](https://github.com/robscott)) +* Fix nil pointer dereference in azure cloud provider ([#85975](https://github.com/kubernetes/kubernetes/pull/85975), [@ldx](https://github.com/ldx)) +* fix: azure disk could not mounted on Standard_DC4s/DC2s instances ([#86612](https://github.com/kubernetes/kubernetes/pull/86612), [@andyzhangx](https://github.com/andyzhangx)) +* Fixes v1.17.0 regression in --service-cluster-ip-range handling with IPv4 ranges larger than 65536 IP addresses ([#86534](https://github.com/kubernetes/kubernetes/pull/86534), [@liggitt](https://github.com/liggitt)) +* Adds back support for AlwaysCheckAllPredicates flag. ([#86496](https://github.com/kubernetes/kubernetes/pull/86496), [@ahg-g](https://github.com/ahg-g)) +* Azure global rate limit is switched to per-client. A set of new rate limit configure options are introduced, including routeRateLimit, SubnetsRateLimit, InterfaceRateLimit, RouteTableRateLimit, LoadBalancerRateLimit, PublicIPAddressRateLimit, SecurityGroupRateLimit, VirtualMachineRateLimit, StorageAccountRateLimit, DiskRateLimit, SnapshotRateLimit, VirtualMachineScaleSetRateLimit and VirtualMachineSizeRateLimit. ([#86515](https://github.com/kubernetes/kubernetes/pull/86515), [@feiskyer](https://github.com/feiskyer)) + * The original rate limit options would be default values for those new client's rate limiter. +* Fix issue [#85805](https://github.com/kubernetes/kubernetes/pull/85805) about resource not found in azure cloud provider when lb specified in other resource group. ([#86502](https://github.com/kubernetes/kubernetes/pull/86502), [@levimm](https://github.com/levimm)) +* `AlwaysCheckAllPredicates` is deprecated in scheduler Policy API. ([#86369](https://github.com/kubernetes/kubernetes/pull/86369), [@Huang-Wei](https://github.com/Huang-Wei)) +* Kubernetes KMS provider for data encryption now supports disabling the in-memory data encryption key (DEK) cache by setting cachesize to a negative value. ([#86294](https://github.com/kubernetes/kubernetes/pull/86294), [@enj](https://github.com/enj)) +* option `preConfiguredBackendPoolLoadBalancerTypes` is added to azure cloud provider for the pre-configured load balancers, possible values: `""`, `"internal"`, "external"`, `"all"` ([#86338](https://github.com/kubernetes/kubernetes/pull/86338), [@gossion](https://github.com/gossion)) +* Promote StartupProbe to beta for 1.18 release ([#83437](https://github.com/kubernetes/kubernetes/pull/83437), [@matthyx](https://github.com/matthyx)) +* Fixes issue where AAD token obtained by kubectl is incompatible with on-behalf-of flow and oidc. ([#86412](https://github.com/kubernetes/kubernetes/pull/86412), [@weinong](https://github.com/weinong)) + * The audience claim before this fix has "spn:" prefix. After this fix, "spn:" prefix is omitted. +* change CounterVec to Counter about PLEGDiscardEvent ([#86167](https://github.com/kubernetes/kubernetes/pull/86167), [@yiyang5055](https://github.com/yiyang5055)) +* hollow-node do not use remote CRI anymore ([#86425](https://github.com/kubernetes/kubernetes/pull/86425), [@jkaniuk](https://github.com/jkaniuk)) +* hollow-node use fake CRI ([#85879](https://github.com/kubernetes/kubernetes/pull/85879), [@gongguan](https://github.com/gongguan)) + + + +# v1.18.0-alpha.1 + +[Documentation](https://docs.k8s.io) + +## Downloads for v1.18.0-alpha.1 + + +filename | sha512 hash +-------- | ----------- +[kubernetes.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes.tar.gz) | `0c4904efc7f4f1436119c91dc1b6c93b3bd9c7490362a394bff10099c18e1e7600c4f6e2fcbaeb2d342a36c4b20692715cf7aa8ada6dfac369f44cc9292529d7` +[kubernetes-src.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-src.tar.gz) | `0a50fc6816c730ca5ae4c4f26d5ad7b049607d29f6a782a4e5b4b05ac50e016486e269dafcc6a163bd15e1a192780a9a987f1bb959696993641c603ed1e841c8` + +### Client Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-client-darwin-386.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-client-darwin-386.tar.gz) | `c6d75f7f3f20bef17fc7564a619b54e6f4a673d041b7c9ec93663763a1cc8dd16aecd7a2af70e8d54825a0eecb9762cf2edfdade840604c9a32ecd9cc2d5ac3c` +[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-client-darwin-amd64.tar.gz) | `ca1f19db289933beace6daee6fc30af19b0e260634ef6e89f773464a05e24551c791be58b67da7a7e2a863e28b7cbcc7b24b6b9bf467113c26da76ac8f54fdb6` +[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-client-linux-386.tar.gz) | `af2e673653eb39c3f24a54efc68e1055f9258bdf6cf8fea42faf42c05abefc2da853f42faac3b166c37e2a7533020b8993b98c0d6d80a5b66f39e91d8ae0a3fb` +[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-client-linux-amd64.tar.gz) | `9009032c3f94ac8a78c1322a28e16644ce3b20989eb762685a1819148aed6e883ca8e1200e5ec37ec0853f115c67e09b5d697d6cf5d4c45f653788a2d3a2f84f` +[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-client-linux-arm.tar.gz) | `afba9595b37a3f2eead6e3418573f7ce093b55467dce4da0b8de860028576b96b837a2fd942f9c276e965da694e31fbd523eeb39aefb902d7e7a2f169344d271` +[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-client-linux-arm64.tar.gz) | `04fc3b2fe3f271807f0bc6c61be52456f26a1af904964400be819b7914519edc72cbab9afab2bb2e2ba1a108963079367cedfb253c9364c0175d1fcc64d52f5c` +[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-client-linux-ppc64le.tar.gz) | `04c7edab874b33175ff7bebfff5b3a032bc6eb088fcd7387ffcd5b3fa71395ca8c5f9427b7ddb496e92087dfdb09eaf14a46e9513071d3bd73df76c182922d38` +[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-client-linux-s390x.tar.gz) | `499287dbbc33399a37b9f3b35e0124ff20b17b6619f25a207ee9c606ef261af61fa0c328dde18c7ce2d3dfb2eea2376623bc3425d16bc8515932a68b44f8bede` +[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-client-windows-386.tar.gz) | `cf84aeddf00f126fb13c0436b116dd0464a625659e44c84bf863517db0406afb4eefd86807e7543c4f96006d275772fbf66214ae7d582db5865c84ac3545b3e6` +[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-client-windows-amd64.tar.gz) | `69f20558ccd5cd6dbaccf29307210db4e687af21f6d71f68c69d3a39766862686ac1333ab8a5012010ca5c5e3c11676b45e498e3d4c38773da7d24bcefc46d95` + +### Server Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-server-linux-amd64.tar.gz) | `3f29df2ce904a0f10db4c1d7a425a36f420867b595da3fa158ae430bfead90def2f2139f51425b349faa8a9303dcf20ea01657cb6ea28eb6ad64f5bb32ce2ed1` +[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-server-linux-arm.tar.gz) | `4a21073b2273d721fbf062c254840be5c8471a010bcc0c731b101729e36e61f637cb7fcb521a22e8d24808510242f4fff8a6ca40f10e9acd849c2a47bf135f27` +[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-server-linux-arm64.tar.gz) | `7f1cb6d721bedc90e28b16f99bea7e59f5ad6267c31ef39c14d34db6ad6aad87ee51d2acdd01b6903307c1c00b58ff6b785a03d5a491cc3f8a4df9a1d76d406c` +[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-server-linux-ppc64le.tar.gz) | `8f2b552030b5274b1c2c7c166eacd5a14b0c6ca0f23042f4c52efe87e22a167ba4460dcd66615a5ecd26d9e88336be1fb555548392e70efe59070dd2c314da98` +[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-server-linux-s390x.tar.gz) | `8d9f2c96f66edafb7c8b3aa90960d29b41471743842aede6b47b3b2e61f4306fb6fc60b9ebc18820c547ee200bfedfe254c1cde962d447c791097dd30e79abdb` + +### Node Binaries + +filename | sha512 hash +-------- | ----------- +[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-node-linux-amd64.tar.gz) | `84194cb081d1502f8ca68143569f9707d96f1a28fcf0c574ebd203321463a8b605f67bb2a365eaffb14fbeb8d55c8d3fa17431780b242fb9cba3a14426a0cd4a` +[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-node-linux-arm.tar.gz) | `0091e108ab94fd8683b89c597c4fdc2fbf4920b007cfcd5297072c44bc3a230dfe5ceed16473e15c3e6cf5edab866d7004b53edab95be0400cc60e009eee0d9d` +[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-node-linux-arm64.tar.gz) | `b7e85682cc2848a35d52fd6f01c247f039ee1b5dd03345713821ea10a7fa9939b944f91087baae95eaa0665d11857c1b81c454f720add077287b091f9f19e5d3` +[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-node-linux-ppc64le.tar.gz) | `cd1f0849e9c62b5d2c93ff0cebf58843e178d8a88317f45f76de0db5ae020b8027e9503a5fccc96445184e0d77ecdf6f57787176ac31dbcbd01323cd0a190cbb` +[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-node-linux-s390x.tar.gz) | `e1e697a34424c75d75415b613b81c8af5f64384226c5152d869f12fd7db1a3e25724975b73fa3d89e56e4bf78d5fd07e68a709ba8566f53691ba6a88addc79ea` +[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.18.0-alpha.1/kubernetes-node-windows-amd64.tar.gz) | `c725a19a4013c74e22383ad3fb4cb799b3e161c4318fdad066daf806730a89bc3be3ff0f75678d02b3cbe52b2ef0c411c0639968e200b9df470be40bb2c015cc` + +## Changelog since v1.17.0 + +### Action Required + +* action required ([#85363](https://github.com/kubernetes/kubernetes/pull/85363), [@immutableT](https://github.com/immutableT)) + * 1. Currently, if users were to explicitly specify CacheSize of 0 for KMS provider, they would end-up with a provider that caches up to 1000 keys. This PR changes this behavior. + * Post this PR, when users supply 0 for CacheSize this will result in a validation error. + * 2. CacheSize type was changed from int32 to *int32. This allows defaulting logic to differentiate between cases where users explicitly supplied 0 vs. not supplied any value. + * 3. KMS Provider's endpoint (path to Unix socket) is now validated when the EncryptionConfiguration files is loaded. This used to be handled by the GRPCService. + +### Other notable changes + +* fix: azure data disk should use same key as os disk by default ([#86351](https://github.com/kubernetes/kubernetes/pull/86351), [@andyzhangx](https://github.com/andyzhangx)) +* New flag `--show-hidden-metrics-for-version` in kube-proxy can be used to show all hidden metrics that deprecated in the previous minor release. ([#85279](https://github.com/kubernetes/kubernetes/pull/85279), [@RainbowMango](https://github.com/RainbowMango)) +* Remove cluster-monitoring addon ([#85512](https://github.com/kubernetes/kubernetes/pull/85512), [@serathius](https://github.com/serathius)) +* Changed core_pattern on COS nodes to be an absolute path. ([#86329](https://github.com/kubernetes/kubernetes/pull/86329), [@mml](https://github.com/mml)) +* Track mount operations as uncertain if operation fails with non-final error ([#82492](https://github.com/kubernetes/kubernetes/pull/82492), [@gnufied](https://github.com/gnufied)) +* add kube-proxy flags --ipvs-tcp-timeout, --ipvs-tcpfin-timeout, --ipvs-udp-timeout to configure IPVS connection timeouts. ([#85517](https://github.com/kubernetes/kubernetes/pull/85517), [@andrewsykim](https://github.com/andrewsykim)) +* The sample-apiserver aggregated conformance test has updated to use the Kubernetes v1.17.0 sample apiserver ([#84735](https://github.com/kubernetes/kubernetes/pull/84735), [@liggitt](https://github.com/liggitt)) +* The underlying format of the `CPUManager` state file has changed. Upgrades should be seamless, but any third-party tools that rely on reading the previous format need to be updated. ([#84462](https://github.com/kubernetes/kubernetes/pull/84462), [@klueska](https://github.com/klueska)) +* kubernetes will try to acquire the iptables lock every 100 msec during 5 seconds instead of every second. This specially useful for environments using kube-proxy in iptables mode with a high churn rate of services. ([#85771](https://github.com/kubernetes/kubernetes/pull/85771), [@aojea](https://github.com/aojea)) +* Fixed a panic in the kubelet cleaning up pod volumes ([#86277](https://github.com/kubernetes/kubernetes/pull/86277), [@tedyu](https://github.com/tedyu)) +* azure cloud provider cache TTL is configurable, list of the azure cloud provider is as following: ([#86266](https://github.com/kubernetes/kubernetes/pull/86266), [@zqingqing1](https://github.com/zqingqing1)) + * - "availabilitySetNodesCacheTTLInSeconds" + * - "vmssCacheTTLInSeconds" + * - "vmssVirtualMachinesCacheTTLInSeconds" + * - "vmCacheTTLInSeconds" + * - "loadBalancerCacheTTLInSeconds" + * - "nsgCacheTTLInSeconds" + * - "routeTableCacheTTLInSeconds" +* Fixes kube-proxy when EndpointSlice feature gate is enabled on Windows. ([#86016](https://github.com/kubernetes/kubernetes/pull/86016), [@robscott](https://github.com/robscott)) +* Fixes wrong validation result of NetworkPolicy PolicyTypes ([#85747](https://github.com/kubernetes/kubernetes/pull/85747), [@tnqn](https://github.com/tnqn)) +* Fixes an issue with kubelet-reported pod status on deleted/recreated pods. ([#86320](https://github.com/kubernetes/kubernetes/pull/86320), [@liggitt](https://github.com/liggitt)) +* kube-apiserver no longer serves the following deprecated APIs: ([#85903](https://github.com/kubernetes/kubernetes/pull/85903), [@liggitt](https://github.com/liggitt)) + * All resources under `apps/v1beta1` and `apps/v1beta2` - use `apps/v1` instead + * `daemonsets`, `deployments`, `replicasets` resources under `extensions/v1beta1` - use `apps/v1` instead + * `networkpolicies` resources under `extensions/v1beta1` - use `networking.k8s.io/v1` instead + * `podsecuritypolicies` resources under `extensions/v1beta1` - use `policy/v1beta1` instead +* kubeadm: fix potential panic when executing "kubeadm reset" with a corrupted kubelet.conf file ([#86216](https://github.com/kubernetes/kubernetes/pull/86216), [@neolit123](https://github.com/neolit123)) +* Fix a bug in port-forward: named port not working with service ([#85511](https://github.com/kubernetes/kubernetes/pull/85511), [@oke-py](https://github.com/oke-py)) +* kube-proxy no longer modifies shared EndpointSlices. ([#86092](https://github.com/kubernetes/kubernetes/pull/86092), [@robscott](https://github.com/robscott)) +* allow for configuration of CoreDNS replica count ([#85837](https://github.com/kubernetes/kubernetes/pull/85837), [@pickledrick](https://github.com/pickledrick)) +* Fixed a regression where the kubelet would fail to update the ready status of pods. ([#84951](https://github.com/kubernetes/kubernetes/pull/84951), [@tedyu](https://github.com/tedyu)) +* Resolves performance regression in client-go discovery clients constructed using `NewDiscoveryClientForConfig` or `NewDiscoveryClientForConfigOrDie`. ([#86168](https://github.com/kubernetes/kubernetes/pull/86168), [@liggitt](https://github.com/liggitt)) +* Make error message and service event message more clear ([#86078](https://github.com/kubernetes/kubernetes/pull/86078), [@feiskyer](https://github.com/feiskyer)) +* e2e-test-framework: add e2e test namespace dump if all tests succeed but the cleanup fails. ([#85542](https://github.com/kubernetes/kubernetes/pull/85542), [@schrodit](https://github.com/schrodit)) +* SafeSysctlWhitelist: add net.ipv4.ping_group_range ([#85463](https://github.com/kubernetes/kubernetes/pull/85463), [@AkihiroSuda](https://github.com/AkihiroSuda)) +* kubelet: the metric process_start_time_seconds be marked as with the ALPHA stability level. ([#85446](https://github.com/kubernetes/kubernetes/pull/85446), [@RainbowMango](https://github.com/RainbowMango)) +* API request throttling (due to a high rate of requests) is now reported in the kubelet (and other component) logs by default. The messages are of the form ([#80649](https://github.com/kubernetes/kubernetes/pull/80649), [@RobertKrawitz](https://github.com/RobertKrawitz)) + * Throttling request took 1.50705208s, request: GET: + * The presence of large numbers of these messages, particularly with long delay times, may indicate to the administrator the need to tune the cluster accordingly. +* Fix API Server potential memory leak issue in processing watch request. ([#85410](https://github.com/kubernetes/kubernetes/pull/85410), [@answer1991](https://github.com/answer1991)) +* Verify kubelet & kube-proxy can recover after being killed on Windows nodes ([#84886](https://github.com/kubernetes/kubernetes/pull/84886), [@YangLu1031](https://github.com/YangLu1031)) +* Fixed an issue that the scheduler only returns the first failure reason. ([#86022](https://github.com/kubernetes/kubernetes/pull/86022), [@Huang-Wei](https://github.com/Huang-Wei)) +* kubectl/drain: add skip-wait-for-delete-timeout option. ([#85577](https://github.com/kubernetes/kubernetes/pull/85577), [@michaelgugino](https://github.com/michaelgugino)) + * If pod DeletionTimestamp older than N seconds, skip waiting for the pod. Seconds must be greater than 0 to skip. +* Following metrics have been turned off: ([#83841](https://github.com/kubernetes/kubernetes/pull/83841), [@RainbowMango](https://github.com/RainbowMango)) + * - kubelet_pod_worker_latency_microseconds + * - kubelet_pod_start_latency_microseconds + * - kubelet_cgroup_manager_latency_microseconds + * - kubelet_pod_worker_start_latency_microseconds + * - kubelet_pleg_relist_latency_microseconds + * - kubelet_pleg_relist_interval_microseconds + * - kubelet_eviction_stats_age_microseconds + * - kubelet_runtime_operations + * - kubelet_runtime_operations_latency_microseconds + * - kubelet_runtime_operations_errors + * - kubelet_device_plugin_registration_count + * - kubelet_device_plugin_alloc_latency_microseconds + * - kubelet_docker_operations + * - kubelet_docker_operations_latency_microseconds + * - kubelet_docker_operations_errors + * - kubelet_docker_operations_timeout + * - network_plugin_operations_latency_microseconds +* - Renamed Kubelet metric certificate_manager_server_expiration_seconds to certificate_manager_server_ttl_seconds and changed to report the second until expiration at read time rather than absolute time of expiry. ([#85874](https://github.com/kubernetes/kubernetes/pull/85874), [@sambdavidson](https://github.com/sambdavidson)) + * - Improved accuracy of Kubelet metric rest_client_exec_plugin_ttl_seconds. +* Bind metadata-agent containers to linux nodes to avoid Windows scheduling on kubernetes cluster includes linux nodes and windows nodes ([#83363](https://github.com/kubernetes/kubernetes/pull/83363), [@wawa0210](https://github.com/wawa0210)) +* Bind metrics-server containers to linux nodes to avoid Windows scheduling on kubernetes cluster includes linux nodes and windows nodes ([#83362](https://github.com/kubernetes/kubernetes/pull/83362), [@wawa0210](https://github.com/wawa0210)) +* During initialization phase (preflight), kubeadm now verifies the presence of the conntrack executable ([#85857](https://github.com/kubernetes/kubernetes/pull/85857), [@hnanni](https://github.com/hnanni)) +* VMSS cache is added so that less chances of VMSS GET throttling ([#85885](https://github.com/kubernetes/kubernetes/pull/85885), [@nilo19](https://github.com/nilo19)) +* Update go-winio module version from 0.4.11 to 0.4.14 ([#85739](https://github.com/kubernetes/kubernetes/pull/85739), [@wawa0210](https://github.com/wawa0210)) +* Fix LoadBalancer rule checking so that no unexpected LoadBalancer updates are made ([#85990](https://github.com/kubernetes/kubernetes/pull/85990), [@feiskyer](https://github.com/feiskyer)) +* kubectl drain node --dry-run will list pods that would be evicted or deleted ([#82660](https://github.com/kubernetes/kubernetes/pull/82660), [@sallyom](https://github.com/sallyom)) +* Windows nodes on GCE can use TPM-based authentication to the master. ([#85466](https://github.com/kubernetes/kubernetes/pull/85466), [@pjh](https://github.com/pjh)) +* kubectl/drain: add disable-eviction option. ([#85571](https://github.com/kubernetes/kubernetes/pull/85571), [@michaelgugino](https://github.com/michaelgugino)) + * Force drain to use delete, even if eviction is supported. This will bypass checking PodDisruptionBudgets, and should be used with caution. +* kubeadm now errors out whenever a not supported component config version is supplied for the kubelet and kube-proxy ([#85639](https://github.com/kubernetes/kubernetes/pull/85639), [@rosti](https://github.com/rosti)) +* Fixed issue with addon-resizer using deprecated extensions APIs ([#85793](https://github.com/kubernetes/kubernetes/pull/85793), [@bskiba](https://github.com/bskiba)) +* Includes FSType when describing CSI persistent volumes. ([#85293](https://github.com/kubernetes/kubernetes/pull/85293), [@huffmanca](https://github.com/huffmanca)) +* kubelet now exports a "server_expiration_renew_failure" and "client_expiration_renew_failure" metric counter if the certificate rotations cannot be performed. ([#84614](https://github.com/kubernetes/kubernetes/pull/84614), [@rphillips](https://github.com/rphillips)) +* kubeadm: don't write the kubelet environment file on "upgrade apply" ([#85412](https://github.com/kubernetes/kubernetes/pull/85412), [@boluisa](https://github.com/boluisa)) +* fix azure file AuthorizationFailure ([#85475](https://github.com/kubernetes/kubernetes/pull/85475), [@andyzhangx](https://github.com/andyzhangx)) +* Resolved regression in admission, authentication, and authorization webhook performance in v1.17.0-rc.1 ([#85810](https://github.com/kubernetes/kubernetes/pull/85810), [@liggitt](https://github.com/liggitt)) +* kubeadm: uses the apiserver AdvertiseAddress IP family to choose the etcd endpoint IP family for non external etcd clusters ([#85745](https://github.com/kubernetes/kubernetes/pull/85745), [@aojea](https://github.com/aojea)) +* kubeadm: Forward cluster name to the controller-manager arguments ([#85817](https://github.com/kubernetes/kubernetes/pull/85817), [@ereslibre](https://github.com/ereslibre)) +* Fixed "requested device X but found Y" attach error on AWS. ([#85675](https://github.com/kubernetes/kubernetes/pull/85675), [@jsafrane](https://github.com/jsafrane)) +* addons: elasticsearch discovery supports IPv6 ([#85543](https://github.com/kubernetes/kubernetes/pull/85543), [@SataQiu](https://github.com/SataQiu)) +* kubeadm: retry `kubeadm-config` ConfigMap creation or mutation if the apiserver is not responding. This will improve resiliency when joining new control plane nodes. ([#85763](https://github.com/kubernetes/kubernetes/pull/85763), [@ereslibre](https://github.com/ereslibre)) +* Update Cluster Autoscaler to 1.17.0; changelog: https://github.com/kubernetes/autoscaler/releases/tag/cluster-autoscaler-1.17.0 ([#85610](https://github.com/kubernetes/kubernetes/pull/85610), [@losipiuk](https://github.com/losipiuk)) +* Filter published OpenAPI schema by making nullable, required fields non-required in order to avoid kubectl to wrongly reject null values. ([#85722](https://github.com/kubernetes/kubernetes/pull/85722), [@sttts](https://github.com/sttts)) +* kubectl set resources will no longer return an error if passed an empty change for a resource. ([#85490](https://github.com/kubernetes/kubernetes/pull/85490), [@sallyom](https://github.com/sallyom)) + * kubectl set subject will no longer return an error if passed an empty change for a resource. +* kube-apiserver: fixed a conflict error encountered attempting to delete a pod with gracePeriodSeconds=0 and a resourceVersion precondition ([#85516](https://github.com/kubernetes/kubernetes/pull/85516), [@michaelgugino](https://github.com/michaelgugino)) +* kubeadm: add a upgrade health check that deploys a Job ([#81319](https://github.com/kubernetes/kubernetes/pull/81319), [@neolit123](https://github.com/neolit123)) +* kubeadm: make sure images are pre-pulled even if a tag did not change but their contents changed ([#85603](https://github.com/kubernetes/kubernetes/pull/85603), [@bart0sh](https://github.com/bart0sh)) +* kube-apiserver: Fixes a bug that hidden metrics can not be enabled by the command-line option `--show-hidden-metrics-for-version`. ([#85444](https://github.com/kubernetes/kubernetes/pull/85444), [@RainbowMango](https://github.com/RainbowMango)) +* kubeadm now supports automatic calculations of dual-stack node cidr masks to kube-controller-manager. ([#85609](https://github.com/kubernetes/kubernetes/pull/85609), [@Arvinderpal](https://github.com/Arvinderpal)) +* Fix bug where EndpointSlice controller would attempt to modify shared objects. ([#85368](https://github.com/kubernetes/kubernetes/pull/85368), [@robscott](https://github.com/robscott)) +* Use context to check client closed instead of http.CloseNotifier in processing watch request which will reduce 1 goroutine for each request if proto is HTTP/2.x . ([#85408](https://github.com/kubernetes/kubernetes/pull/85408), [@answer1991](https://github.com/answer1991)) +* kubeadm: reset raises warnings if it cannot delete folders ([#85265](https://github.com/kubernetes/kubernetes/pull/85265), [@SataQiu](https://github.com/SataQiu)) +* Wait for kubelet & kube-proxy to be ready on Windows node within 10s ([#85228](https://github.com/kubernetes/kubernetes/pull/85228), [@YangLu1031](https://github.com/YangLu1031)) diff --git a/content/ko/docs/tasks/access-application-cluster/access-cluster.md b/content/ko/docs/tasks/access-application-cluster/access-cluster.md index bdb42ba3a2..2f527c4676 100644 --- a/content/ko/docs/tasks/access-application-cluster/access-cluster.md +++ b/content/ko/docs/tasks/access-application-cluster/access-cluster.md @@ -277,7 +277,7 @@ heapster is running at https://104.197.5.247/api/v1/namespaces/kube-system/servi 예를 들어 위 클러스터는 클러스터 수준의 logging(Elasticsearch 사용)이 활성화되었으므로 적절한 인증을 통과하여 `https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/`로 액세스할 수 있다. 예를 들어 kubectl proxy로 `http://localhost:8080/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/`를 통해 logging에 액세스할 수도 있다. -(인증을 통과하는 방법이나 kubectl proxy를 사용하는 것은 [위 내용](#rest-api에-직접-액세스)을 참조한다.) +(인증을 통과하는 방법이나 kubectl proxy를 사용하는 것은 [쿠버네티스 API를 사용해서 클러스터에 접근하기](/docs/tasks/administer-cluster/access-cluster-api/)을 참조한다.) #### 수작업으로 apiserver proxy URL을 구축 diff --git a/content/ko/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md b/content/ko/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md index 659abc69ba..841a489b84 100644 --- a/content/ko/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md +++ b/content/ko/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md @@ -346,7 +346,7 @@ export KUBECONFIG=$KUBECONFIG:$HOME/.kube/config ``` ### Windows Powershell ```shell - $Env:KUBECONFIG=($Env:KUBECONFIG;$HOME/.kube/config) + $Env:KUBECONFIG="$Env:KUBECONFIG;$HOME\.kube\config" ``` 이제 `KUBECONFIG` 환경 변수에 리스트에 포함된 모든 파일들이 합쳐진 구성 정보를 보자. diff --git a/content/ko/docs/tasks/access-application-cluster/web-ui-dashboard.md b/content/ko/docs/tasks/access-application-cluster/web-ui-dashboard.md index 92ef718d2b..73b59d9810 100644 --- a/content/ko/docs/tasks/access-application-cluster/web-ui-dashboard.md +++ b/content/ko/docs/tasks/access-application-cluster/web-ui-dashboard.md @@ -93,7 +93,7 @@ Kubeconfig 인증 방법은 외부 아이덴티티 프로파이더 또는 x509 예를 들면: - ```conf +```conf release=1.0 tier=frontend environment=pod diff --git a/content/ko/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes.md b/content/ko/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes.md new file mode 100644 index 0000000000..ddb7beee5d --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes.md @@ -0,0 +1,182 @@ +--- +title: Windows 노드 추가 +min-kubernetes-server-version: 1.17 +content_template: templates/tutorial +weight: 30 +--- + +{{% capture overview %}} + +{{< feature-state for_k8s_version="v1.18" state="beta" >}} + +쿠버네티스를 사용하여 리눅스와 Windows 노드를 혼합하여 실행할 수 있으므로, 리눅스에서 실행되는 파드와 Windows에서 실행되는 파드를 혼합할 수 있다. 이 페이지는 Windows 노드를 클러스터에 등록하는 방법을 보여준다. + +{{% /capture %}} + + +{{% capture prerequisites %}} {{< version-check >}} + +* Windows 컨테이너를 호스팅하는 Windows 노드를 구성하려면 +[Windows Server 2019 라이선스](https://www.microsoft.com/en-us/cloud-platform/windows-server-pricing) 이상이 필요하다. +VXLAN/오버레이 네트워킹을 사용하는 경우 [KB4489899](https://support.microsoft.com/help/4489899)도 설치되어 있어야 한다. + +* 컨트롤 플레인에 접근할 수 있는 리눅스 기반의 쿠버네티스 kubeadm 클러스터([kubeadm을 사용하여 단일 컨트롤 플레인 클러스터 생성](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/) 참고)가 필요하다. + +{{% /capture %}} + + +{{% capture objectives %}} + +* 클러스터에 Windows 노드 등록 +* 리눅스 및 Windows의 파드와 서비스가 서로 통신할 수 있도록 네트워킹 구성 + +{{% /capture %}} + + +{{% capture lessoncontent %}} + +## 시작하기: 클러스터에 Windows 노드 추가 + +### 네트워킹 구성 + +리눅스 기반 쿠버네티스 컨트롤 플레인 노드가 있으면 네트워킹 솔루션을 선택할 수 있다. 이 가이드는 VXLAN 모드의 플란넬(Flannel)을 사용하는 방법을 짧막하게 보여준다. + +#### 플란넬 구성 + +1. 플란넬을 위한 쿠버네티스 컨트롤 플레인 준비 + + 클러스터의 쿠버네티스 컨트롤 플레인에서 약간의 준비가 필요하다. 플란넬을 사용할 때 iptables 체인에 브릿지된 IPv4 트래픽을 활성화하는 것을 권장한다. 아래 명령을 모든 리눅스 노드에서 실행해야만 한다. + + ```bash + sudo sysctl net.bridge.bridge-nf-call-iptables=1 + ``` + +1. 리눅스용 플란넬 다운로드 및 구성 + + 가장 최근의 플란넬 매니페스트를 다운로드한다. + + ```bash + wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml + ``` + + VNI를 4096으로 설정하고 포트를 4789로 설정하려면 플란넬 매니페스트의 `net-conf.json` 섹션을 수정한다. 다음과 같을 것이다. + + ```json + net-conf.json: | + { + "Network": "10.244.0.0/16", + "Backend": { + "Type": "vxlan", + "VNI" : 4096, + "Port": 4789 + } + } + ``` + + {{< note >}}리눅스의 플란넬이 Windows의 플란넬과 상호 운용되도록 하려면 VNI를 4096으로, 포트를 4789로 설정해야 한다. 이 필드들에 대한 설명은 [VXLAN 문서](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#vxlan)를 + 참고한다.{{< /note >}} + + {{< note >}}L2Bridge/Host-gateway 모드를 대신 사용하려면 `Type` 의 값을 `"host-gw"` 로 변경하고 `VNI` 와 `Port` 를 생략한다.{{< /note >}} + +1. 플란넬 매니페스트 적용 및 유효성 검사 + + 플란넬 구성을 적용해보자. + + ```bash + kubectl apply -f kube-flannel.yml + ``` + + 몇 분 후에, 플란넬 파드 네트워크가 배포되었다면 모든 파드가 실행 중인 것으로 표시된다. + + ```bash + kubectl get pods -n kube-system + ``` + + 출력 결과에 리눅스 flannel 데몬셋(DaemonSet)이 실행 중인 것으로 나와야 한다. + + ``` + NAMESPACE NAME READY STATUS RESTARTS AGE + ... + kube-system kube-flannel-ds-54954 1/1 Running 0 1m + ``` + +1. Windows 플란넬 및 kube-proxy 데몬셋 추가 + + 이제 Windows 호환 버전의 플란넬과 kube-proxy를 추가할 수 있다. 호환 가능한 + kube-proxy 버전을 얻으려면, 이미지의 태그를 + 대체해야 한다. 다음의 예시는 쿠버네티스 {{< param "fullversion" >}}의 사용법을 보여주지만, + 사용자의 배포에 맞게 버전을 조정해야 한다. + + ```bash + curl -L https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/kube-proxy.yml | sed 's/VERSION/{{< param "fullversion" >}}/g' | kubectl apply -f - + kubectl apply -f https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/flannel-overlay.yml + ``` + {{< note >}} + host-gateway를 사용하는 경우 https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/flannel-host-gw.yml 을 대신 사용한다. + {{< /note >}} + + {{< note >}} +Windows 노드에서 이더넷이 아닌 다른 인터페이스(예: "Ethernet0 2")를 사용하는 경우, flannel-host-gw.yml이나 flannel-overlay.yml 파일에서 다음 라인을 수정한다. + +```powershell +wins cli process run --path /k/flannel/setup.exe --args "--mode=overlay --interface=Ethernet" +``` + +그리고, 이에 따라 인터페이스를 지정해야 한다. + +```bash +# 예시 +curl -L https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/flannel-overlay.yml | sed 's/Ethernet/Ethernet0 2/g' | kubectl apply -f - +``` + {{< /note >}} + + + +### Windows 워커 노드 조인(joining) +{{< note >}} +`Containers` 기능을 설치하고 도커를 설치해야 한다. +[Windows Server에 Docker Engine - Enterprise 설치](https://docs.docker.com/ee/docker-ee/windows/docker-ee/#install-docker-engine---enterprise)에서 설치에 대한 내용을 참고할 수 있다. +{{< /note >}} + +{{< note >}} +Windows 섹션의 모든 코드 스니펫(snippet)은 Windows 워커 노드의 +높은 권한(관리자)이 있는 PowerShell 환경에서 실행해야 한다. +{{< /note >}} + +1. wins, kubelet 및 kubeadm 설치 + + ```PowerShell + curl.exe -LO https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/PrepareNode.ps1 + .\PrepareNode.ps1 -KubernetesVersion {{< param "fullversion" >}} + ``` + +1. 노드에 조인하기 위해 `kubeadm` 실행 + + 컨트롤 플레인 호스트에서 `kubeadm init` 실행할 때 제공된 명령을 사용한다. + 이 명령이 더 이상 없거나, 토큰이 만료된 경우, `kubeadm token create --print-join-command` + (컨트롤 플레인 호스트에서)를 실행하여 새 토큰 및 조인 명령을 생성할 수 있다. + + +#### 설치 확인 +이제 다음을 실행하여 클러스터에서 Windows 노드를 볼 수 있다. + +```bash +kubectl get nodes -o wide +``` + +새 노드가 `NotReady` 상태인 경우 플란넬 이미지가 여전히 다운로드 중일 수 있다. +`kube-system` 네임스페이스에서 flannel 파드를 확인하여 이전과 같이 진행 상황을 확인할 수 있다. + +```shell +kubectl -n kube-system get pods -l app=flannel +``` + +flannel 파드가 실행되면, 노드는 `Ready` 상태가 되고 워크로드를 처리할 수 있어야 한다. + +{{% /capture %}} + +{{% capture whatsnext %}} + +- [Windows kubeadm 노드 업그레이드](/ko/docs/tasks/administer-cluster/kubeadm/upgrading-windows-nodes) + +{{% /capture %}} diff --git a/content/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md b/content/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md new file mode 100644 index 0000000000..cc5f3c81c1 --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md @@ -0,0 +1,243 @@ +--- +title: kubeadm을 사용한 인증서 관리 +content_template: templates/task +weight: 10 +--- + +{{% capture overview %}} + +{{< feature-state for_k8s_version="v1.15" state="stable" >}} + +[kubeadm](/docs/reference/setup-tools/kubeadm/kubeadm/)으로 생성된 클라이언트 인증서는 1년 후에 만료된다. 이 페이지는 kubeadm으로 인증서 갱신을 관리하는 방법을 설명한다. + +{{% /capture %}} + +{{% capture prerequisites %}} + +[쿠버네티스의 PKI 인증서와 요구 조건](/ko/docs/setup/best-practices/certificates/)에 익숙해야 한다. + +{{% /capture %}} + +{{% capture steps %}} + +## 사용자 정의 인증서 사용 {#custom-certificates} + +기본적으로, kubeadm은 클러스터를 실행하는 데 필요한 모든 인증서를 생성한다. +사용자는 자체 인증서를 제공하여 이 동작을 무시할 수 있다. + +이렇게 하려면, `--cert-dir` 플래그 또는 kubeadm `ClusterConfiguration` 의 +`certificatesDir` 필드에 지정된 디렉터리에 배치해야 한다. +기본적으로 `/etc/kubernetes/pki` 이다. + +`kubeadm init` 을 실행하기 전에 지정된 인증서와 개인 키(private key) 쌍이 존재하면, +kubeadm은 이를 덮어 쓰지 않는다. 이는 예를 들어, 기존 CA를 +`/etc/kubernetes/pki/ca.crt` 와 `/etc/kubernetes/pki/ca.key` 에 +복사할 수 있고, kubeadm은 이 CA를 사용하여 나머지 인증서에 서명한다는 걸 의미한다. + +## 외부 CA 모드 {#external-ca-mode} + +`ca.key` 파일이 아닌 `ca.crt` 파일만 제공할 +수도 있다(이는 다른 인증서 쌍이 아닌 루트 CA 파일에만 사용 가능함). +다른 모든 인증서와 kubeconfig 파일이 있으면, kubeadm은 이 조건을 +인식하고 "외부 CA" 모드를 활성화한다. kubeadm은 디스크에 +CA 키없이 진행한다. + +대신, `--controllers=csrsigner` 사용하여 controller-manager를 +독립적으로 실행하고 CA 인증서와 키를 가리킨다. + +[PKI 인증서와 요구 조건](/ko/docs/setup/best-practices/certificates/)은 외부 CA를 +사용하도록 클러스터 설정에 대한 지침을 포함한다. + +## 인증서 만료 확인 + +`check-expiration` 하위 명령을 사용하여 인증서가 만료되는 시기를 확인할 수 있다. + +``` +kubeadm alpha certs check-expiration +``` + +출력 결과는 다음과 비슷하다. + +``` +CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED +admin.conf Dec 30, 2020 23:36 UTC 364d no +apiserver Dec 30, 2020 23:36 UTC 364d ca no +apiserver-etcd-client Dec 30, 2020 23:36 UTC 364d etcd-ca no +apiserver-kubelet-client Dec 30, 2020 23:36 UTC 364d ca no +controller-manager.conf Dec 30, 2020 23:36 UTC 364d no +etcd-healthcheck-client Dec 30, 2020 23:36 UTC 364d etcd-ca no +etcd-peer Dec 30, 2020 23:36 UTC 364d etcd-ca no +etcd-server Dec 30, 2020 23:36 UTC 364d etcd-ca no +front-proxy-client Dec 30, 2020 23:36 UTC 364d front-proxy-ca no +scheduler.conf Dec 30, 2020 23:36 UTC 364d no + +CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED +ca Dec 28, 2029 23:36 UTC 9y no +etcd-ca Dec 28, 2029 23:36 UTC 9y no +front-proxy-ca Dec 28, 2029 23:36 UTC 9y no +``` + +이 명령은 `/etc/kubernetes/pki` 폴더의 클라이언트 인증서와 kubeadm이 사용하는 KUBECONFIG 파일(`admin.conf`, `controller-manager.conf` 및 `scheduler.conf`)에 포함된 클라이언트 인증서의 만료/잔여 기간을 표시한다. + +또한, kubeadm은 인증서가 외부에서 관리되는지를 사용자에게 알린다. 이 경우 사용자는 수동으로 또는 다른 도구를 사용해서 인증서 갱신 관리를 해야 한다. + +{{< warning >}} +`kubeadm` 은 외부 CA가 서명한 인증서를 관리할 수 없다. +{{< /warning >}} + +{{< note >}} +kubeadm은 자동 인증서 갱신을 위해 kubelet을 구성하기 때문에 `kubelet.conf` 는 위 목록에 포함되어 있지 않다. +{{< /note >}} + +{{< warning >}} +kubeadm 1.17 이전의 버전에서 `kubeadm init` 으로 작성된 노드에는 +`kubelet.conf` 의 내용을 수동으로 수정해야 하는 [버그](https://github.com/kubernetes/kubeadm/issues/1753)가 있다. `kubeadm init` 수행 완료 후, `client-certificate-data` 및 `client-key-data` 를 다음과 같이 교체하여, +로테이트된 kubelet 클라이언트 인증서를 가리키도록 `kubelet.conf` 를 업데이트해야 한다. + +```yaml +client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem +client-key: /var/lib/kubelet/pki/kubelet-client-current.pem +``` +{{< /warning >}} + +## 자동 인증서 갱신 + +kubeadm은 컨트롤 플레인 [업그레이드](/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/) 동안 모든 인증서를 갱신한다. + +이 기능은 가장 간단한 유스케이스를 해결하기 위해 설계되었다. +인증서 갱신에 대해 특별한 요구 사항이 없고 쿠버네티스 버전 업그레이드를 정기적으로(매 1년 이내 업그레이드 수행) 수행하는 경우, kubeadm은 클러스터를 최신 상태로 유지하고 합리적으로 보안을 유지한다. + +{{< note >}} +보안을 유지하려면 클러스터를 자주 업그레이드하는 것이 가장 좋다. +{{< /note >}} + +인증서 갱신에 대해 보다 복잡한 요구 사항이 있는 경우, `--certificate-renewal=false` 를 `kubeadm upgrade apply` 또는 `kubeadm upgrade node` 와 함께 사용하여 기본 동작이 수행되지 않도록 할 수 있다. + +{{< warning >}} +kubeadm 1.17 이전 버전에는 `kubeadm upgrade node` 명령에서 +`--certificate-renewal` 의 기본값이 `false` 인 [버그](https://github.com/kubernetes/kubeadm/issues/1818)가 +있다. 이 경우 `--certificate-renewal=true` 를 명시적으로 설정해야 한다. +{{< /warning >}} + +## 수동 인증서 갱신 + +`kubeadm alpha certs renew` 명령을 사용하여 언제든지 인증서를 수동으로 갱신할 수 있다. + +이 명령은 `/etc/kubernetes/pki` 에 저장된 CA(또는 프론트 프록시 CA) 인증서와 키를 사용하여 갱신을 수행한다. + +{{< warning >}} +HA 클러스터를 실행 중인 경우, 모든 컨트롤 플레인 노드에서 이 명령을 실행해야 한다. +{{< /warning >}} + +{{< note >}} +`alpha certs renew` 는 기존 인증서를 kubeadm-config 컨피그맵(ConfigMap) 대신 속성(공통 이름, 조직, SAN 등)의 신뢰할 수 있는 소스로 사용한다. 둘 다 동기화 상태를 유지하는 것을 강력히 권장한다. +{{< /note >}} + +`kubeadm alpha certs renew` 는 다음의 옵션을 제공한다. + +쿠버네티스 인증서는 일반적으로 1년 후 만료일에 도달한다. + +- `--csr-only` 는 실제로 인증서를 갱신하지 않고 인증서 서명 요청을 생성하여 외부 CA로 인증서를 갱신하는 데 사용할 수 있다. 자세한 내용은 다음 단락을 참고한다. + +- 모든 인증서 대신 단일 인증서를 갱신할 수도 있다. + +## 쿠버네티스 인증서 API를 사용하여 인증서 갱신 + +이 섹션에서는 쿠버네티스 인증서 API를 사용하여 수동 인증서 갱신을 실행하는 방법에 대한 자세한 정보를 제공한다. + +{{< caution >}} +조직의 인증서 인프라를 kubeadm으로 생성된 클러스터에 통합해야 하는 사용자를 위한 고급 주제이다. 기본 kubeadm 구성이 요구 사항을 충족하면 kubeadm이 인증서를 대신 관리하도록 해야 한다. +{{< /caution >}} + +### 서명자 설정 + +쿠버네티스 인증 기관(Certificate Authority)은 기본적으로 작동하지 않는다. +[cert-manager][cert-manager-issuer] 와 같은 외부 서명자를 설정하거나, 빌트인 서명자를 사용할 수 있다. + +빌트인 서명자는 [`kube-controller-manager`][kcm] 의 일부이다. + +빌트인 서명자를 활성화하려면, `--cluster-signing-cert-file` 와 `--cluster-signing-key-file` 플래그를 전달해야 한다. + +새 클러스터를 생성하는 경우, kubeadm [구성 파일][config]을 사용할 수 있다. + + ```yaml + apiVersion: kubeadm.k8s.io/v1beta2 + kind: ClusterConfiguration + controllerManager: + extraArgs: + cluster-signing-cert-file: /etc/kubernetes/pki/ca.crt + cluster-signing-key-file: /etc/kubernetes/pki/ca.key + ``` + +[cert-manager-issuer]: https://docs.cert-manager.io/en/latest/tasks/issuers/setup-ca.html +[kcm]: /docs/reference/command-line-tools-reference/kube-controller-manager/ +[config]: https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2 + +### 인증서 서명 요청(CSR) 생성 + +`kubeadm alpha certs renew --use-api` 로 쿠버네티스 인증서 API에 대한 인증서 서명 요청을 만들 수 있다. + +[cert-manager][cert-manager] 와 같은 외부 서명자를 설정하면, 인증서 서명 요청(CSR)이 자동으로 승인된다. +그렇지 않으면, [`kubectl certificate`][certs] 명령을 사용하여 인증서를 수동으로 승인해야 한다. +다음의 kubeadm 명령은 승인할 인증서 이름을 출력한 다음, 승인이 발생하기를 차단하고 기다린다. + +```shell +sudo kubeadm alpha certs renew apiserver --use-api & +``` +출력 결과는 다음과 비슷하다. +``` +[1] 2890 +[certs] certificate request "kubeadm-cert-kube-apiserver-ld526" created +``` + +### 인증서 서명 요청(CSR) 승인 + +외부 서명자를 설정하면, 인증서 서명 요청(CSR)이 자동으로 승인된다. + +그렇지 않으면, [`kubectl certificate`][certs] 명령을 사용하여 인증서를 수동으로 승인해야 한다. 예를 들어 다음과 같다. + +```shell +kubectl certificate approve kubeadm-cert-kube-apiserver-ld526 +``` +출력 결과는 다음과 비슷하다. +```shell +certificatesigningrequest.certificates.k8s.io/kubeadm-cert-kube-apiserver-ld526 approved +``` + +`kubectl get csr` 명령으로 보류 중인 인증서 목록을 볼 수 있다. + +## 외부 CA로 인증서 갱신 + +이 섹션에서는 외부 CA를 사용하여 수동 인증서 갱신을 실행하는 방법에 대한 자세한 정보를 제공한다. + +외부 CA와 보다 효과적으로 통합하기 위해 kubeadm은 인증서 서명 요청(CSR)을 생성할 수도 있다. +CSR은 클라이언트의 서명된 인증서에 대한 CA 요청을 나타낸다. +kubeadm 관점에서, 일반적으로 온-디스크(on-disk) CA에 의해 서명되는 모든 인증서는 CSR로 생성될 수 있다. 그러나 CA는 CSR로 생성될 수 없다. + +### 인증서 서명 요청(CSR) 생성 + +`kubeadm alpha certs renew --csr-only` 로 인증서 서명 요청을 만들 수 있다. + +CSR과 함께 제공되는 개인 키가 모두 출력된다. +`--csr-dir` 로 사용할 디텍터리를 전달하여 지정된 위치로 CSR을 출력할 수 있다. +`--csr-dir` 을 지정하지 않으면, 기본 인증서 디렉터리(`/etc/kubernetes/pki`)가 사용된다. + +`kubeadm alpha certs renew --csr-only` 로 인증서를 갱신할 수 있다. +`kubeadm init` 과 마찬가지로 출력 디렉터리를 `--csr-dir` 플래그로 지정할 수 있다. + +CSR에는 인증서 이름, 도메인 및 IP가 포함되지만, 용도를 지정하지는 않는다. +인증서를 발행할 때 [올바른 인증서 용도][cert-table]를 지정하는 것은 CA의 책임이다. + +* `openssl` 의 경우 [`openssl ca` command][openssl-ca] 명령으로 수행한다. +* `cfssl` 의 경우 [설정 파일에 용도][cfssl-usages]를 지정한다. + +선호하는 방법으로 인증서에 서명한 후, 인증서와 개인 키를 PKI 디렉터리(기본적으로 `/etc/kubernetes/pki`)에 복사해야 한다. + +[cert-manager]: https://github.com/jetstack/cert-manager +[openssl-ca]: https://superuser.com/questions/738612/openssl-ca-keyusage-extension +[cfssl-usages]: https://github.com/cloudflare/cfssl/blob/master/doc/cmd/cfssl.txt#L170 +[certs]: /ko/docs/setup/best-practices/certificates/ +[cert-cas]: /ko/docs/setup/best-practices/certificates/#단일-루트-ca +[cert-table]: /ko/docs/setup/best-practices/certificates/#모든-인증서 + +{{% /capture %}} diff --git a/content/ko/docs/tasks/administer-cluster/kubeadm/upgrading-windows-nodes.md b/content/ko/docs/tasks/administer-cluster/kubeadm/upgrading-windows-nodes.md new file mode 100644 index 0000000000..63b271e1b9 --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/kubeadm/upgrading-windows-nodes.md @@ -0,0 +1,93 @@ +--- +title: Windows 노드 업그레이드 +min-kubernetes-server-version: 1.17 +content_template: templates/task +weight: 40 +--- + +{{% capture overview %}} + +{{< feature-state for_k8s_version="v1.18" state="beta" >}} + +이 페이지는 [kubeadm으로 생성된](/ko/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes) Windows 노드를 업그레이드하는 방법을 설명한다. + +{{% /capture %}} + + +{{% capture prerequisites %}} +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} +* [남은 kubeadm 클러스터를 업그레이드하는 프로세스](/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade)에 +익숙해져야 한다. Windows 노드를 +업그레이드하기 전에 컨트롤 플레인 노드를 업그레이드해야 한다. + +{{% /capture %}} + + +{{% capture steps %}} + +## 워커 노드 업그레이드 + +### kubeadm 업그레이드 + +1. Windows 노드에서, kubeadm을 업그레이드한다. + + ```powershell + # replace {{< param "fullversion" >}} with your desired version + curl.exe -Lo C:\k\kubeadm.exe https://dl.k8s.io/{{< param "fullversion" >}}/bin/windows/amd64/kubeadm.exe + ``` + +### 노드 드레인 + +1. 쿠버네티스 API에 접근할 수 있는 머신에서, + 스케줄 불가능한 것으로 표시하고 워크로드를 축출하여 유지 보수할 노드를 준비한다. + + ```shell + # 을 드레이닝하려는 노드 이름으로 바꾼다 + kubectl drain --ignore-daemonsets + ``` + + 다음과 비슷한 출력이 표시되어야 한다. + + ``` + node/ip-172-31-85-18 cordoned + node/ip-172-31-85-18 drained + ``` + +### kubelet 구성 업그레이드 + +1. Windows 노드에서, 다음의 명령을 호출하여 새 kubelet 구성을 동기화한다. + + ```powershell + kubeadm upgrade node + ``` + +### kubelet 업그레이드 + +1. Windows 노드에서, kubelet을 업그레이드하고 다시 시작한다. + + ```powershell + stop-service kubelet + curl.exe -Lo C:\k\kubelet.exe https://dl.k8s.io/{{< param "fullversion" >}}/bin/windows/amd64/kubelet.exe + restart-service kubelet + ``` + +### 노드에 적용된 cordon 해제 + +1. 쿠버네티스 API에 접근할 수 있는 머신에서, +스케줄 가능으로 표시하여 노드를 다시 온라인으로 가져온다. + + ```shell + # 을 노드의 이름으로 바꾼다 + kubectl uncordon + ``` +### kube-proxy 업그레이드 + +1. 쿠버네티스 API에 접근할 수 있는 머신에서, 다음을 실행하여, +{{< param "fullversion" >}}을 원하는 버전으로 다시 바꾼다. + + ```shell + curl -L https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/kube-proxy.yml | sed 's/VERSION/{{< param "fullversion" >}}/g' | kubectl apply -f - + ``` + + +{{% /capture %}} diff --git a/content/ko/docs/tasks/administer-cluster/manage-resources/_index.md b/content/ko/docs/tasks/administer-cluster/manage-resources/_index.md new file mode 100644 index 0000000000..0f5fb03054 --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/manage-resources/_index.md @@ -0,0 +1,4 @@ +--- +title: 메모리, CPU 와 API 리소스 관리 +weight: 20 +--- diff --git a/content/ko/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace.md b/content/ko/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace.md new file mode 100644 index 0000000000..ed926b338f --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace.md @@ -0,0 +1,269 @@ +--- +title: 네임스페이스에 대한 CPU의 최소 및 최대 제약 조건 구성 +content_template: templates/task +weight: 40 +--- + + +{{% capture overview %}} + +이 페이지는 네임스페이스에서 컨테이너와 파드가 사용하는 CPU 리소스의 최솟값과 최댓값을 설정하는 +방법을 보여준다. [리밋레인지(LimitRange)](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#limitrange-v1-core) +오브젝트에 CPU의 최솟값과 최댓값을 +지정한다. 리밋레인지에 의해 부과된 제약 조건을 파드가 충족하지 않으면, 네임스페이스에서 +생성될 수 없다. + +{{% /capture %}} + + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + +태스크 예제를 실행하려면 클러스터에 적어도 1 CPU 이상이 사용 가능해야 한다. + +{{% /capture %}} + + +{{% capture steps %}} + +## 네임스페이스 생성 + +이 연습에서 생성한 리소스가 클러스터의 나머지와 +격리되도록 네임스페이스를 생성한다. + +```shell +kubectl create namespace constraints-cpu-example +``` + +## 리밋레인지와 파드 생성 + +다음은 리밋레인지에 대한 구성 파일이다. + +{{< codenew file="admin/resource/cpu-constraints.yaml" >}} + +리밋레인지를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints.yaml --namespace=constraints-cpu-example +``` + +리밋레인지에 대한 자세한 정보를 본다. + +```shell +kubectl get limitrange cpu-min-max-demo-lr --output=yaml --namespace=constraints-cpu-example +``` + +출력 결과는 예상대로 CPU의 최소와 최대 제약 조건을 보여준다. 그러나 +참고로 리밋레인지에 대한 구성 파일에 기본값을 +지정하지 않아도 자동으로 생성된다. + +```yaml +limits: +- default: + cpu: 800m + defaultRequest: + cpu: 800m + max: + cpu: 800m + min: + cpu: 200m + type: Container +``` + +이제 constraints-cpu-example 네임스페이스에 컨테이너가 생성될 때마다, 쿠버네티스는 +다음 단계를 수행한다. + +* 컨테이너가 자체 CPU 요청량(request)과 상한(limit)을 지정하지 않으면, 컨테이너에 +CPU 요청량과 상한의 기본값(default)을 지정한다. + +* 컨테이너가 200 millicpu 이상의 CPU 요청량을 지정하는지 확인한다. + +* 컨테이너가 800 millicpu 이하의 CPU 상한을 지정하는지 확인한다. + +{{< note >}} +`LimitRange` 오브젝트를 생성할 때, huge-pages +또는 GPU에도 상한을 지정할 수 있다. 그러나, 이 리소스들에 `default` 와 `defaultRequest` 가 +모두 지정되어 있으면, 두 값은 같아야 한다. +{{< /note >}} + +컨테이너가 하나인 파드의 구성 파일은 다음과 같다. 컨테이너 매니페스트는 +500 millicpu의 CPU 요청량 및 800 millicpu의 CPU 상한을 지정한다. 이는 리밋레인지에 +의해 부과된 CPU의 최소와 최대 제약 조건을 충족시킨다. + +{{< codenew file="admin/resource/cpu-constraints-pod.yaml" >}} + +파드를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints-pod.yaml --namespace=constraints-cpu-example +``` + +파드의 컨테이너가 실행 중인지 확인한다. + +```shell +kubectl get pod constraints-cpu-demo --namespace=constraints-cpu-example +``` + +파드에 대한 자세한 정보를 본다. + +```shell +kubectl get pod constraints-cpu-demo --output=yaml --namespace=constraints-cpu-example +``` + +출력 결과는 컨테이너의 CPU 요청량이 500 millicpu이고, CPU 상한이 800 millicpu임을 +나타낸다. 이는 리밋레인지에 의해 부과된 제약 조건을 만족시킨다. + +```yaml +resources: + limits: + cpu: 800m + requests: + cpu: 500m +``` + +## 파드 삭제 + +```shell +kubectl delete pod constraints-cpu-demo --namespace=constraints-cpu-example +``` + +## CPU 최대 제약 조건을 초과하는 파드 생성 시도 + +컨테이너가 하나인 파드의 구성 파일은 다음과 같다. 컨테이너는 +500 millicpu의 CPU 요청량과 1.5 cpu의 CPU 상한을 지정한다. + +{{< codenew file="admin/resource/cpu-constraints-pod-2.yaml" >}} + +파드 생성을 시도한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-2.yaml --namespace=constraints-cpu-example +``` + +컨테이너가 너무 큰 CPU 상한을 지정하므로, 출력 결과에 파드가 생성되지 않은 것으로 +표시된다. + +``` +Error from server (Forbidden): error when creating "examples/admin/resource/cpu-constraints-pod-2.yaml": +pods "constraints-cpu-demo-2" is forbidden: maximum cpu usage per Container is 800m, but limit is 1500m. +``` + +## 최소 CPU 요청량을 충족하지 않는 파드 생성 시도 + +컨테이너가 하나인 파드의 구성 파일은 다음과 같다. 컨테이너는 +100 millicpu의 CPU 요청량과 800 millicpu의 CPU 상한을 지정한다. + +{{< codenew file="admin/resource/cpu-constraints-pod-3.yaml" >}} + +파드 생성을 시도한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-3.yaml --namespace=constraints-cpu-example +``` + +컨테이너가 너무 작은 CPU 요청량을 지정하므로, 출력 결과에 파드가 생성되지 +않은 것으로 표시된다. + +``` +Error from server (Forbidden): error when creating "examples/admin/resource/cpu-constraints-pod-3.yaml": +pods "constraints-cpu-demo-3" is forbidden: minimum cpu usage per Container is 200m, but request is 100m. +``` + +## CPU 요청량 또는 상한을 지정하지 않은 파드 생성 + +컨테이너가 하나인 파드의 구성 파일은 다음과 같다. 컨테이너는 +CPU 요청량을 지정하지 않으며, CPU 상한을 지정하지 않는다. + +{{< codenew file="admin/resource/cpu-constraints-pod-4.yaml" >}} + +파드를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-4.yaml --namespace=constraints-cpu-example +``` + +파드에 대한 자세한 정보를 본다. + +``` +kubectl get pod constraints-cpu-demo-4 --namespace=constraints-cpu-example --output=yaml +``` + +출력 결과는 파드의 컨테이너에 대한 CPU 요청량이 800 millicpu이고, CPU 상한이 800 millicpu임을 나타낸다. +컨테이너는 어떻게 이런 값을 얻었을까? + +```yaml +resources: + limits: + cpu: 800m + requests: + cpu: 800m +``` + +컨테이너가 자체 CPU 요청량과 상한을 지정하지 않았으므로, 리밋레인지로부터 +[CPU 요청량과 상한의 기본값](/ko/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/)이 +주어졌다. + +이 시점에서, 컨테이너는 실행 중이거나 실행 중이 아닐 수 있다. 이 태스크의 전제 조건은 클러스터에 1 CPU 이상 사용 가능해야 한다는 것이다. 각 노드에 1 CPU만 있는 경우, 노드에 할당할 수 있는 CPU가 800 millicpu의 요청량을 수용하기에 충분하지 않을 수 있다. 2 CPU인 노드를 사용하는 경우에는, CPU가 800 millicpu 요청량을 수용하기에 충분할 것이다. + +파드를 삭제한다. + +``` +kubectl delete pod constraints-cpu-demo-4 --namespace=constraints-cpu-example +``` + +## CPU의 최소 및 최대 제약 조건의 적용 + +리밋레인지에 의해 네임스페이스에 부과된 CPU의 최대 및 최소 제약 조건은 +파드를 생성하거나 업데이트할 때만 적용된다. 리밋레인지를 변경해도, 이전에 생성된 파드에는 +영향을 미치지 않는다. + +## CPU의 최소 및 최대 제약 조건에 대한 동기 + +클러스터 관리자는 파드가 사용할 수 있는 CPU 리소스에 제한을 둘 수 있다. +예를 들면 다음과 같다. + +* 클러스터의 각 노드에는 2 CPU가 있다. 클러스터의 어떤 노드도 요청량을 지원할 수 없기 때문에, +2 CPU 이상을 요청하는 파드를 수락하지 않으려고 한다. + +* 클러스터는 프로덕션과 개발 부서에서 공유한다. +프로덕션 워크로드가 최대 3 CPU를 소비하도록 하고 싶지만, 개발 워크로드는 1 CPU로 +제한하려고 한다. 프로덕션과 개발을 위해 별도의 네임스페이스를 생성하고, 각 네임스페이스에 CPU 제약 조건을 +적용한다. + +## 정리 + +네임스페이스를 삭제한다. + +```shell +kubectl delete namespace constraints-cpu-example +``` + +{{% /capture %}} + +{{% capture whatsnext %}} + +### 클러스터 관리자를 위한 문서 + +* [네임스페이스에 대한 기본 메모리 요청량과 상한 구성](/ko/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/) + +* [네임스페이스에 대한 기본 CPU 요청량과 상한 구성](/ko/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/) + +* [네임스페이스에 대한 메모리의 최소 및 최대 제약 조건 구성](/ko/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/) + +* [네임스페이스에 대한 메모리 및 CPU 쿼터 구성](/ko/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/) + +* [네임스페이스에 대한 파드 쿼터 구성](/ko/docs/tasks/administer-cluster/manage-resources/quota-pod-namespace/) + +* [API 오브젝트에 대한 쿼터 구성](/docs/tasks/administer-cluster/quota-api-object/) + +### 앱 개발자를 위한 문서 + +* [컨테이너 및 파드 메모리 리소스 할당](/ko/docs/tasks/configure-pod-container/assign-memory-resource/) + +* [컨테이너와 파드 CPU 리소스 할당](/docs/tasks/configure-pod-container/assign-cpu-resource/) + +* [파드에 대한 서비스 품질(QoS) 구성](/docs/tasks/configure-pod-container/quality-service-pod/) + + +{{% /capture %}} diff --git a/content/ko/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace.md b/content/ko/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace.md new file mode 100644 index 0000000000..1e1850e02b --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace.md @@ -0,0 +1,191 @@ +--- +title: 네임스페이스에 대한 기본 CPU 요청량과 상한 구성 +content_template: templates/task +weight: 20 +--- + +{{% capture overview %}} + +이 페이지는 네임스페이스에 대한 기본 CPU 요청량(request) 및 상한(limit)을 구성하는 방법을 보여준다. +쿠버네티스 클러스터는 네임스페이스로 나눌 수 있다. 기본 CPU 상한이 있는 네임스페이스에서 +컨테이너가 생성되고, 컨테이너가 자체 CPU 상한을 지정하지 않으면, +컨테이너에 기본 CPU 상한이 할당된다. 쿠버네티스는 이 문서의 뒷부분에서 +설명하는 특정 조건에서 기본 CPU 요청량을 할당한다. + +{{% /capture %}} + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} +{{% /capture %}} + +{{% capture steps %}} + +## 네임스페이스 생성 + +이 연습에서 생성한 리소스가 클러스터의 나머지와 +격리되도록 네임스페이스를 생성한다. + +```shell +kubectl create namespace default-cpu-example +``` + +## 리밋레인지(LimitRange)와 파드 생성 + +다음은 리밋레인지 오브젝트의 구성 파일이다. 구성은 +기본 CPU 요청량 및 기본 CPU 상한을 지정한다. + +{{< codenew file="admin/resource/cpu-defaults.yaml" >}} + +default-cpu-example 네임스페이스에 리밋레인지를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults.yaml --namespace=default-cpu-example +``` + +이제 컨테이너가 default-cpu-example 네임스페이스에 생성되고, +컨테이너가 CPU 요청량 및 CPU 상한에 대해 고유한 값을 지정하지 않으면, +컨테이너에 CPU 요청량의 기본값 0.5와 CPU 상한 +기본값 1이 부여된다. + +컨테이너가 하나인 파드의 구성 파일은 다음과 같다. 컨테이너는 +CPU 요청량과 상한을 지정하지 않는다. + +{{< codenew file="admin/resource/cpu-defaults-pod.yaml" >}} + +파드를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod.yaml --namespace=default-cpu-example +``` + +파드의 사양을 확인한다. + +```shell +kubectl get pod default-cpu-demo --output=yaml --namespace=default-cpu-example +``` + +출력 결과는 파드의 컨테이너에 500 milicpu의 CPU 요청량과 +1 cpu의 CPU 상한이 있음을 나타낸다. 이것은 리밋레인지에 의해 지정된 기본값이다. + +```shell +containers: +- image: nginx + imagePullPolicy: Always + name: default-cpu-demo-ctr + resources: + limits: + cpu: "1" + requests: + cpu: 500m +``` + +## 컨테이너 상한은 지정하고, 요청량을 지정하지 않으면 어떻게 되나? + +컨테이너가 하나인 파드의 구성 파일은 다음과 같다. 컨테이너는 +CPU 상한을 지정하지만, 요청량은 지정하지 않는다. + +{{< codenew file="admin/resource/cpu-defaults-pod-2.yaml" >}} + +파드를 생성한다. + + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod-2.yaml --namespace=default-cpu-example +``` + +파드 사양을 확인한다. + +``` +kubectl get pod default-cpu-demo-2 --output=yaml --namespace=default-cpu-example +``` + +출력 결과는 컨테이너의 CPU 요청량이 CPU 상한과 일치하도록 설정되었음을 보여준다. +참고로 컨테이너에는 CPU 요청량의 기본값인 0.5 cpu가 할당되지 않았다. + +``` +resources: + limits: + cpu: "1" + requests: + cpu: "1" +``` + +## 컨테이너의 요청량은 지정하고, 상한을 지정하지 않으면 어떻게 되나? + +컨테이너가 하나인 파드의 구성 파일은 다음과 같다. 컨테이너는 +CPU 요청량을 지정하지만, 상한은 지정하지 않았다. + +{{< codenew file="admin/resource/cpu-defaults-pod-3.yaml" >}} + +파드를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod-3.yaml --namespace=default-cpu-example +``` + +파드 사양을 확인한다. + +``` +kubectl get pod default-cpu-demo-3 --output=yaml --namespace=default-cpu-example +``` + +출력 결과는 컨테이너의 CPU 요청량이 컨테이너의 구성 파일에 지정된 값으로 +설정되었음을 보여준다. 컨테이너의 CPU 상한은 1 cpu로 설정되며, 이는 +네임스페이스의 CPU 상한 기본값이다. + +``` +resources: + limits: + cpu: "1" + requests: + cpu: 750m +``` + +## CPU 상한 및 요청량의 기본값에 대한 동기 + +네임스페이스에 [리소스 쿼터](/ko/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/)가 있는 경우, +CPU 상한에 대해 기본값을 설정하는 것이 좋다. +다음은 리소스 쿼터가 네임스페이스에 적용하는 두 가지 제한 사항이다. + +* 네임스페이스에서 실행되는 모든 컨테이너에는 자체 CPU 상한이 있어야 한다. +* 네임스페이스의 모든 컨테이너가 사용하는 총 CPU 양은 지정된 상한을 초과하지 않아야 한다. + +컨테이너가 자체 CPU 상한을 지정하지 않으면, 상한 기본값이 부여되고, 쿼터에 +의해 제한되는 네임스페이스에서 실행될 수 있다. + +## 정리 + +네임스페이스를 삭제한다. + +```shell +kubectl delete namespace default-cpu-example +``` + +{{% /capture %}} + +{{% capture whatsnext %}} + +### 클러스터 관리자를 위한 문서 + +* [네임스페이스에 대한 기본 메모리 요청량과 상한 구성](/ko/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/) + +* [네임스페이스에 대한 메모리의 최소 및 최대 제약 조건 구성](/ko/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/) + +* [네임스페이스에 대한 CPU의 최소 및 최대 제약 조건 구성](/ko/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/) + +* [네임스페이스에 대한 메모리 및 CPU 쿼터 구성](/ko/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/) + +* [네임스페이스에 대한 파드 쿼터 구성](/ko/docs/tasks/administer-cluster/manage-resources/quota-pod-namespace/) + +* [API 오브젝트에 대한 쿼터 구성](/docs/tasks/administer-cluster/quota-api-object/) + +### 앱 개발자를 위한 문서 + +* [컨테이너 및 파드 메모리 리소스 할당](/ko/docs/tasks/configure-pod-container/assign-memory-resource/) + +* [컨테이너 및 파드 CPU 리소스 할당](/docs/tasks/configure-pod-container/assign-cpu-resource/) + +* [파드에 대한 서비스 품질(QoS) 구성](/docs/tasks/configure-pod-container/quality-service-pod/) + +{{% /capture %}} diff --git a/content/ko/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace.md b/content/ko/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace.md new file mode 100644 index 0000000000..080839b86a --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace.md @@ -0,0 +1,268 @@ +--- +title: 네임스페이스에 대한 메모리의 최소 및 최대 제약 조건 구성 +content_template: templates/task +weight: 30 +--- + + +{{% capture overview %}} + +이 페이지는 네임스페이스에서 실행되는 컨테이너가 사용하는 메모리의 최솟값과 최댓값을 +설정하는 방법을 보여준다. [리밋레인지(LimitRange)](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#limitrange-v1-core) +오브젝트에 최소 및 최대 메모리 값을 +지정한다. 파드가 리밋레인지에 의해 부과된 제약 조건을 충족하지 않으면, +네임스페이스에서 생성될 수 없다. + +{{% /capture %}} + + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + +클러스터의 각 노드에는 최소 1GiB의 메모리가 있어야 한다. + +{{% /capture %}} + + +{{% capture steps %}} + +## 네임스페이스 생성 + +이 연습에서 생성한 리소스가 클러스터의 나머지와 +격리되도록 네임스페이스를 생성한다. + +```shell +kubectl create namespace constraints-mem-example +``` + +## 리밋레인지와 파드 생성 + +다음은 리밋레인지의 구성 파일이다. + +{{< codenew file="admin/resource/memory-constraints.yaml" >}} + +리밋레인지를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints.yaml --namespace=constraints-mem-example +``` + +리밋레인지에 대한 자세한 정보를 본다. + +```shell +kubectl get limitrange mem-min-max-demo-lr --namespace=constraints-mem-example --output=yaml +``` + +출력 결과는 예상대로 메모리의 최소 및 최대 제약 조건을 보여준다. 그러나 +참고로 리밋레인지의 구성 파일에 기본값(default)을 +지정하지 않아도 자동으로 생성된다. + +``` + limits: + - default: + memory: 1Gi + defaultRequest: + memory: 1Gi + max: + memory: 1Gi + min: + memory: 500Mi + type: Container +``` + +이제 constraints-mem-example 네임스페이스에 컨테이너가 생성될 때마다, 쿠버네티스는 +다음 단계를 수행한다. + +* 컨테이너가 자체 메모리 요청량(request)과 상한(limit)을 지정하지 않으면, 기본 메모리 요청량과 +상한을 컨테이너에 지정한다. + +* 컨테이너에 500MiB 이상의 메모리 요청량이 있는지 확인한다. + +* 컨테이너의 메모리 상한이 1GiB 이하인지 확인한다. + +컨테이너가 하나인 파드의 구성 파일은 다음과 같다. 컨테이너 매니페스트는 +600MiB의 메모리 요청량과 800MiB의 메모리 상한을 지정한다. 이들은 +리밋레인지에 의해 부과된 메모리의 최소 및 최대 제약 조건을 충족한다. + +{{< codenew file="admin/resource/memory-constraints-pod.yaml" >}} + +파드를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints-pod.yaml --namespace=constraints-mem-example +``` + +파드의 컨테이너가 실행 중인지 확인한다. + +```shell +kubectl get pod constraints-mem-demo --namespace=constraints-mem-example +``` + +파드에 대한 자세한 정보를 본다. + +```shell +kubectl get pod constraints-mem-demo --output=yaml --namespace=constraints-mem-example +``` + +출력 결과는 컨테이너의 메모리 요청량이 600MiB이고 메모리 상한이 800MiB임을 +나타낸다. 이는 리밋레인지에 의해 부과된 제약 조건을 충족한다. + +```yaml +resources: + limits: + memory: 800Mi + requests: + memory: 600Mi +``` + +파드를 삭제한다. + +```shell +kubectl delete pod constraints-mem-demo --namespace=constraints-mem-example +``` + +## 최대 메모리 제약 조건을 초과하는 파드 생성 시도 + +컨테이너가 하나인 파드의 구성 파일은 다음과 같다. 컨테이너는 +800MiB의 메모리 요청량과 1.5GiB의 메모리 상한을 지정한다. + +{{< codenew file="admin/resource/memory-constraints-pod-2.yaml" >}} + +파드 생성을 시도한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints-pod-2.yaml --namespace=constraints-mem-example +``` + +컨테이너가 너무 큰 메모리 상한을 지정하므로, 출력 결과에 파드가 생성되지 않은 것으로 +표시된다. + +``` +Error from server (Forbidden): error when creating "examples/admin/resource/memory-constraints-pod-2.yaml": +pods "constraints-mem-demo-2" is forbidden: maximum memory usage per Container is 1Gi, but limit is 1536Mi. +``` + +## 최소 메모리 요청량을 충족하지 않는 파드 생성 시도 + +컨테이너가 하나인 파드의 구성 파일은 다음과 같다. 컨테이너는 +100MiB의 메모리 요청량과 800MiB의 메모리 상한을 지정한다. + +{{< codenew file="admin/resource/memory-constraints-pod-3.yaml" >}} + +파드 생성을 시도한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints-pod-3.yaml --namespace=constraints-mem-example +``` + +컨테이너가 너무 작은 메모리 요청량을 지정하므로, 출력 결과에 파드가 생성되지 +않은 것으로 표시된다. + +``` +Error from server (Forbidden): error when creating "examples/admin/resource/memory-constraints-pod-3.yaml": +pods "constraints-mem-demo-3" is forbidden: minimum memory usage per Container is 500Mi, but request is 100Mi. +``` + +## 메모리 요청량 또는 상한을 지정하지 않은 파드 생성 + + + +컨테이너가 하나인 파드의 구성 파일은 다음과 같다. 컨테이너는 +메모리 요청량을 지정하지 않으며, 메모리 상한을 지정하지 않는다. + +{{< codenew file="admin/resource/memory-constraints-pod-4.yaml" >}} + +파드를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints-pod-4.yaml --namespace=constraints-mem-example +``` + +파드에 대한 자세한 정보를 본다. + +``` +kubectl get pod constraints-mem-demo-4 --namespace=constraints-mem-example --output=yaml +``` + +출력 결과는 파드의 컨테이너에 1GiB의 메모리 요청량과 1GiB의 메모리 상한이 있음을 보여준다. +컨테이너는 이러한 값을 어떻게 얻었을까? + +``` +resources: + limits: + memory: 1Gi + requests: + memory: 1Gi +``` + +컨테이너가 자체 메모리 요청량과 상한을 지정하지 않았으므로, +리밋레인지의 [메모리의 요청량과 상한 기본값](/ko/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/)이 +제공되었다. + +이 시점에서, 컨테이너가 실행 중이거나 실행 중이 아닐 수 있다. 이 태스크의 전제 조건은 +노드에 최소 1GiB의 메모리가 있어야 한다는 것이다. 각 노드에 +1GiB의 메모리만 있는 경우, 노드에 할당할 수 있는 메모리가 1GiB의 메모리 요청량을 수용하기에 충분하지 +않을 수 있다. 메모리가 2GiB인 노드를 사용하는 경우에는, 메모리가 +1GiB 요청량을 수용하기에 충분할 것이다. + +파드를 삭제한다. + +``` +kubectl delete pod constraints-mem-demo-4 --namespace=constraints-mem-example +``` + +## 메모리의 최소 및 최대 제약 조건 적용 + +리밋레인지에 의해 네임스페이스에 부과된 메모리의 최대 및 최소 제약 조건은 +파드를 생성하거나 업데이트할 때만 적용된다. 리밋레인지를 변경해도, 이전에 생성된 +파드에는 영향을 미치지 않는다. + +## 메모리의 최소 및 최대 제약 조건에 대한 동기 + +클러스터 관리자는 파드가 사용할 수 있는 메모리 양에 제한을 둘 수 있다. +예를 들면 다음과 같다. + +* 클러스터의 각 노드에는 2GB의 메모리가 있다. 클러스터의 어떤 노드도 2GB 이상의 요청량을 +지원할 수 없으므로, 2GB 이상의 메모리를 요청하는 파드를 수락하지 않으려고 한다. + +* 클러스터는 운영 부서와 개발 부서에서 공유한다. +프로덕션 워크로드가 최대 8GB의 메모리를 소비하도록 하려면, +개발 워크로드를 512MB로 제한해야 한다. 프로덕션 및 개발을 위해 +별도의 네임스페이스를 만들고, 각 네임스페이스에 메모리 제약 조건을 적용한다. + +## 정리 + +네임스페이스를 삭제한다. + +```shell +kubectl delete namespace constraints-mem-example +``` + +{{% /capture %}} + +{{% capture whatsnext %}} + +### 클러스터 관리자를 위한 문서 + +* [네임스페이스에 대한 기본 메모리 요청량과 상한 구성](/ko/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/) + +* [네임스페이스에 대한 기본 CPU 요청량과 상한 구성](/ko/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/) + +* [네임스페이스에 대한 CPU의 최소 및 최대 제약 조건 구성](/ko/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/) + +* [네임스페이스에 대한 메모리 및 CPU 쿼터 구성](/ko/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/) + +* [네임스페이스에 대한 파드 쿼터 구성](/ko/docs/tasks/administer-cluster/manage-resources/quota-pod-namespace/) + +* [API 오브젝트에 대한 쿼터 구성](/docs/tasks/administer-cluster/quota-api-object/) + +### 앱 개발자를 위한 문서 + +* [컨테이너 및 파드 메모리 리소스 할당](/ko/docs/tasks/configure-pod-container/assign-memory-resource/) + +* [컨테이너 및 파드 CPU 리소스 할당](/docs/tasks/configure-pod-container/assign-cpu-resource/) + +* [파드에 대한 서비스 품질(QoS) 구성](/docs/tasks/configure-pod-container/quality-service-pod/) + +{{% /capture %}} diff --git a/content/ko/docs/tasks/administer-cluster/manage-resources/memory-default-namespace.md b/content/ko/docs/tasks/administer-cluster/manage-resources/memory-default-namespace.md new file mode 100644 index 0000000000..547d1783c4 --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/manage-resources/memory-default-namespace.md @@ -0,0 +1,199 @@ +--- +title: 네임스페이스에 대한 기본 메모리 요청량과 상한 구성 +content_template: templates/task +weight: 10 +--- + +{{% capture overview %}} + +이 페이지는 네임스페이스에 대한 기본 메모리 요청량(request)과 상한(limit)을 구성하는 방법을 보여준다. +기본 메모리 상한이 있는 네임스페이스에서 컨테이너가 생성되고, 컨테이너가 +자체 메모리 상한을 지정하지 않으면, 컨테이너에 기본 메모리 상한이 할당된다. +쿠버네티스는 이 문서의 뒷부분에서 설명하는 특정 조건에서 기본 메모리 요청량을 할당한다. + +{{% /capture %}} + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + +클러스터의 각 노드에는 최소 2GiB의 메모리가 있어야 한다. + +{{% /capture %}} + +{{% capture steps %}} + +## 네임스페이스 생성 + +이 연습에서 생성한 리소스가 클러스터의 다른 리소스와 +격리되도록 네임스페이스를 생성한다. + +```shell +kubectl create namespace default-mem-example +``` + +## 리밋레인지(LimitRange)와 파드 생성 + +다음은 리밋레인지 오브젝트의 구성 파일이다. 구성은 +메모리 요청량 기본값(default)과 메모리 상한 기본값을 지정한다. + +{{< codenew file="admin/resource/memory-defaults.yaml" >}} + +default-mem-example 네임스페이스에 리밋레인지를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults.yaml --namespace=default-mem-example +``` + +이제 컨테이너가 default-mem-example 네임스페이스에 생성되고, +컨테이너가 메모리 요청량 및 메모리 상한에 대해 고유한 값을 지정하지 않으면, +컨테이너에 메모리 요청량 기본값 256MiB와 메모리 상한 기본값 +512MiB가 지정된다. + +컨테이너가 하나인 파드의 구성 파일은 다음과 같다. 컨테이너는 +메모리 요청량 및 상한을 지정하지 않는다. + +{{< codenew file="admin/resource/memory-defaults-pod.yaml" >}} + +파드를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod.yaml --namespace=default-mem-example +``` + +파드에 대한 자세한 정보를 본다. + +```shell +kubectl get pod default-mem-demo --output=yaml --namespace=default-mem-example +``` + +출력 결과는 파드의 컨테이너에 256MiB의 메모리 요청량과 +512MiB의 메모리 상한이 있음을 나타낸다. 이것은 리밋레인지에 의해 지정된 기본값이다. + +```shell +containers: +- image: nginx + imagePullPolicy: Always + name: default-mem-demo-ctr + resources: + limits: + memory: 512Mi + requests: + memory: 256Mi +``` + +파드를 삭제한다. + +```shell +kubectl delete pod default-mem-demo --namespace=default-mem-example +``` + +## 컨테이너 상한은 지정하고, 요청량을 지정하지 않으면 어떻게 되나? + +컨테이너가 하나인 파드의 구성 파일은 다음과 같다. 컨테이너는 +메모리 상한을 지정하지만, 요청량은 지정하지 않는다. + +{{< codenew file="admin/resource/memory-defaults-pod-2.yaml" >}} + +파드를 생성한다. + + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod-2.yaml --namespace=default-mem-example +``` + +파드에 대한 자세한 정보를 본다. + +```shell +kubectl get pod default-mem-demo-2 --output=yaml --namespace=default-mem-example +``` + +출력 결과는 컨테이너의 메모리 요청량이 메모리 상한과 일치하도록 설정되었음을 보여준다. +참고로 컨테이너에는 기본 메모리 요청량의 값인 256Mi가 할당되지 않았다. + +``` +resources: + limits: + memory: 1Gi + requests: + memory: 1Gi +``` + +## 컨테이너의 요청량은 지정하고, 상한을 지정하지 않으면 어떻게 되나? + +컨테이너가 하나인 파드의 구성 파일은 다음과 같다. 컨테이너는 +메모리 요청량을 지정하지만, 상한은 지정하지 않았다. + +{{< codenew file="admin/resource/memory-defaults-pod-3.yaml" >}} + +파드를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod-3.yaml --namespace=default-mem-example +``` + +파드 사양을 확인한다. + +```shell +kubectl get pod default-mem-demo-3 --output=yaml --namespace=default-mem-example +``` + +출력 결과는 컨테이너의 메모리 요청량이 컨테이너의 구성 파일에 지정된 값으로 +설정되었음을 보여준다. 컨테이너의 메모리 상한은 네임스페이스의 +기본 메모리 상한인 512Mi로 설정되어 있다. + +``` +resources: + limits: + memory: 512Mi + requests: + memory: 128Mi +``` + +## 기본 메모리 상한 및 요청량에 대한 동기 + +네임스페이스에 리소스 쿼터가 있는 경우, +메모리 상한에 기본값을 설정하는 것이 좋다. +다음은 리소스 쿼터가 네임스페이스에 적용하는 두 가지 제한 사항이다. + +* 네임스페이스에서 실행되는 모든 컨테이너에는 자체 메모리 상한이 있어야 한다. +* 네임스페이스의 모든 컨테이너가 사용하는 총 메모리 양은 지정된 상한을 초과하지 않아야 한다. + +컨테이너가 자체 메모리 상한을 지정하지 않으면, 기본 상한이 부여되고, +쿼터에 의해 제한되는 네임스페이스에서 실행될 수 있다. + +## 정리 + +네임스페이스를 삭제한다. + +```shell +kubectl delete namespace default-mem-example +``` + +{{% /capture %}} + +{{% capture whatsnext %}} + +### 클러스터 관리자를 위한 문서 + +* [네임스페이스에 대한 기본 CPU 요청량과 상한 구성](/ko/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/) + +* [네임스페이스에 대한 메모리의 최소 및 최대 제약 조건 구성](/ko/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/) + +* [네임스페이스에 대한 CPU의 최소 및 최대 제약 조건 구성](/ko/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/) + +* [네임스페이스에 대한 메모리 및 CPU 쿼터 구성](/ko/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/) + +* [네임스페이스에 대한 파드 쿼터 구성](/ko/docs/tasks/administer-cluster/manage-resources/quota-pod-namespace/) + +* [API 오브젝트에 대한 쿼터 구성](/docs/tasks/administer-cluster/quota-api-object/) + +### 앱 개발자를 위한 문서 + +* [컨테이너 및 파드 메모리 리소스 할당](/ko/docs/tasks/configure-pod-container/assign-memory-resource/) + +* [컨테이너 및 파드 CPU 리소스 할당](/docs/tasks/configure-pod-container/assign-cpu-resource/) + +* [파드에 대한 서비스 품질(QoS) 구성](/docs/tasks/configure-pod-container/quality-service-pod/) + +{{% /capture %}} diff --git a/content/ko/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace.md b/content/ko/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace.md new file mode 100644 index 0000000000..b7251a7712 --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace.md @@ -0,0 +1,175 @@ +--- +title: 네임스페이스에 대한 메모리 및 CPU 쿼터 구성 +content_template: templates/task +weight: 50 +--- + + +{{% capture overview %}} + +이 페이지는 네임스페이스에서 실행 중인 모든 컨테이너가 사용할 수 있는 +총 메모리 및 CPU 양에 대한 쿼터를 설정하는 방법을 보여준다. +[리소스쿼터(ResourceQuota)](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#resourcequota-v1-core) +오브젝트에 쿼터를 지정한다. + +{{% /capture %}} + + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + +클러스터의 각 노드에는 최소 1GiB의 메모리가 있어야 한다. + +{{% /capture %}} + + +{{% capture steps %}} + +## 네임스페이스 생성 + +이 연습에서 생성한 리소스가 클러스터의 나머지와 +격리되도록 네임스페이스를 생성한다. + +```shell +kubectl create namespace quota-mem-cpu-example +``` + +## 리소스쿼터 생성 + +다음은 리소스쿼터 오브젝트의 구성 파일이다. + +{{< codenew file="admin/resource/quota-mem-cpu.yaml" >}} + +리소스쿼터를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu.yaml --namespace=quota-mem-cpu-example +``` + +리소스쿼터에 대한 자세한 정보를 본다. + +```shell +kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml +``` + +리소스쿼터는 이러한 요구 사항을 quota-mem-cpu-example 네임스페이스에 배치한다. + +* 모든 컨테이너에는 메모리 요청량(request), 메모리 상한(limit), CPU 요청량 및 CPU 상한이 있어야 한다. +* 모든 컨테이너에 대한 총 메모리 요청량은 1GiB를 초과하지 않아야 한다. +* 모든 컨테이너에 대한 총 메모리 상한은 2GiB를 초과하지 않아야 한다. +* 모든 컨테이너에 대한 총 CPU 요청량은 1 cpu를 초과해서는 안된다. +* 모든 컨테이너에 대한 총 CPU 상한은 2 cpu를 초과해서는 안된다. + +## 파드 생성 + +파드의 구성 파일은 다음과 같다. + +{{< codenew file="admin/resource/quota-mem-cpu-pod.yaml" >}} + + +파드를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu-pod.yaml --namespace=quota-mem-cpu-example +``` + +파드의 컨테이너가 실행 중인지 확인한다. + +``` +kubectl get pod quota-mem-cpu-demo --namespace=quota-mem-cpu-example +``` + +다시 한 번, 리소스쿼터에 대한 자세한 정보를 본다. + +``` +kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml +``` + +출력 결과는 쿼터와 사용된 쿼터를 함께 보여준다. +파드의 메모리와 CPU 요청량 및 상한이 쿼터를 초과하지 않은 것을 +볼 수 있다. + +``` +status: + hard: + limits.cpu: "2" + limits.memory: 2Gi + requests.cpu: "1" + requests.memory: 1Gi + used: + limits.cpu: 800m + limits.memory: 800Mi + requests.cpu: 400m + requests.memory: 600Mi +``` + +## 두 번째 파드 생성 시도 + +다음은 두 번째 파드의 구성 파일이다. + +{{< codenew file="admin/resource/quota-mem-cpu-pod-2.yaml" >}} + +구성 파일에서, 파드의 메모리 요청량이 700MiB임을 알 수 있다. +사용된 메모리 요청량과 이 새 메모리 요청량의 합계가 +메모리 요청량 쿼터를 초과한다. 600MiB + 700MiB > 1GiB + +파드 생성을 시도한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu-pod-2.yaml --namespace=quota-mem-cpu-example +``` + +두 번째 파드는 생성되지 않는다. 출력 결과는 두 번째 파드를 생성하면 +메모리 요청량의 총 합계가 메모리 요청량 쿼터를 초과함을 보여준다. + +``` +Error from server (Forbidden): error when creating "examples/admin/resource/quota-mem-cpu-pod-2.yaml": +pods "quota-mem-cpu-demo-2" is forbidden: exceeded quota: mem-cpu-demo, +requested: requests.memory=700Mi,used: requests.memory=600Mi, limited: requests.memory=1Gi +``` + +## 토론 + +이 연습에서 보았듯이, 리소스쿼터를 사용하여 +네임스페이스에서 실행 중인 모든 컨테이너에 대한 메모리 요청량의 총 합계를 제한할 수 있다. +메모리 상한, CPU 요청량 및 CPU 상한의 총 합계를 제한할 수도 있다. + +모든 컨테이너에 대한 합계 대신 개별 컨테이너를 제한하려면, +[리밋레인지(LimitRange)](/ko/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/)를 사용한다. + +## 정리 + +네임스페이스를 삭제한다. + +```shell +kubectl delete namespace quota-mem-cpu-example +``` + +{{% /capture %}} + +{{% capture whatsnext %}} + +### 클러스터 관리자를 위한 문서 + +* [네임스페이스에 대한 기본 메모리 요청량과 상한 구성](/ko/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/) + +* [네임스페이스에 대한 기본 CPU 요청량과 상한 구성](/ko/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/) + +* [네임스페이스에 대한 메모리의 최소 및 최대 제약 조건 구성](/ko/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/) + +* [네임스페이스에 대한 CPU의 최소 및 최대 제약 조건 구성](/ko/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/) + +* [네임스페이스에 대한 파드 쿼터 구성](/ko/docs/tasks/administer-cluster/manage-resources/quota-pod-namespace/) + +* [API 오브젝트에 대한 쿼터 구성](/docs/tasks/administer-cluster/quota-api-object/) + +### 앱 개발자를 위한 문서 + +* [컨테이너 및 파드 메모리 리소스 할당](/ko/docs/tasks/configure-pod-container/assign-memory-resource/) + +* [컨테이너 및 파드 CPU 리소스 할당](/docs/tasks/configure-pod-container/assign-cpu-resource/) + +* [파드에 대한 서비스 품질(QoS) 구성](/docs/tasks/configure-pod-container/quality-service-pod/) + +{{% /capture %}} diff --git a/content/ko/docs/tasks/administer-cluster/manage-resources/quota-pod-namespace.md b/content/ko/docs/tasks/administer-cluster/manage-resources/quota-pod-namespace.md new file mode 100644 index 0000000000..cbda51f074 --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/manage-resources/quota-pod-namespace.md @@ -0,0 +1,136 @@ +--- +title: 네임스페이스에 대한 파드 쿼터 구성 +content_template: templates/task +weight: 60 +--- + + +{{% capture overview %}} + +이 페이지는 네임스페이스에서 실행할 수 있는 총 파드 수에 대한 쿼터를 +설정하는 방법을 보여준다. +[리소스쿼터(ResourceQuota)](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#resourcequota-v1-core) +오브젝트에 쿼터를 지정한다. + +{{% /capture %}} + + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + +{{% /capture %}} + + +{{% capture steps %}} + +## 네임스페이스 생성 + +이 실습에서 생성한 리소스가 클러스터의 나머지와 +격리되도록 네임스페이스를 생성한다. + +```shell +kubectl create namespace quota-pod-example +``` + +## 리소스쿼터 생성 + +다음은 리소스쿼터 오브젝트의 구성 파일이다. + +{{< codenew file="admin/resource/quota-pod.yaml" >}} + +리소스쿼터를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/quota-pod.yaml --namespace=quota-pod-example +``` + +리소스쿼터에 대한 자세한 정보를 본다. + +```shell +kubectl get resourcequota pod-demo --namespace=quota-pod-example --output=yaml +``` + +출력 결과는 네임스페이스에 두 개의 파드 쿼터가 있고, 현재 파드가 없음을 +보여준다. 즉, 쿼터 중 어느 것도 사용되지 않았다. + +```yaml +spec: + hard: + pods: "2" +status: + hard: + pods: "2" + used: + pods: "0" +``` + +다음은 디플로이먼트(Deployment) 구성 파일이다. + +{{< codenew file="admin/resource/quota-pod-deployment.yaml" >}} + +구성 파일에서, `replicas: 3` 은 쿠버네티스가 모두 동일한 애플리케이션을 실행하는 세 개의 파드를 만들도록 지시한다. + +디플로이먼트를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/admin/resource/quota-pod-deployment.yaml --namespace=quota-pod-example +``` + +디플로이먼트에 대한 자세한 정보를 본다. + +```shell +kubectl get deployment pod-quota-demo --namespace=quota-pod-example --output=yaml +``` + +출력 결과는 디플로이먼트에서 3개의 레플리카를 지정하더라도, 쿼터로 +인해 2개의 파드만 생성되었음을 보여준다. + +```yaml +spec: + ... + replicas: 3 +... +status: + availableReplicas: 2 +... +lastUpdateTime: 2017-07-07T20:57:05Z + message: 'unable to create pods: pods "pod-quota-demo-1650323038-" is forbidden: + exceeded quota: pod-demo, requested: pods=1, used: pods=2, limited: pods=2' +``` + +## 정리 + +네임스페이스를 삭제한다. + +```shell +kubectl delete namespace quota-pod-example +``` + +{{% /capture %}} + +{{% capture whatsnext %}} + +### 클러스터 관리자를 위한 문서 + +* [네임스페이스에 대한 기본 메모리 요청량과 상한 구성](/ko/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/) + +* [네임스페이스에 대한 기본 CPU 요청량과 상한 구성](/ko/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/) + +* [네임스페이스에 대한 메모리의 최소 및 최대 제약 조건 구성](/ko/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/) + +* [네임스페이스에 대한 CPU의 최소 및 최대 제약 조건 구성](/ko/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/) + +* [네임스페이스에 대한 메모리 및 CPU 쿼터 구성](/ko/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/) + +* [API 오브젝트에 대한 쿼터 구성](/docs/tasks/administer-cluster/quota-api-object/) + +### 앱 개발자를 위한 문서 + +* [컨테이너 및 파드 메모리 리소스 할당](/ko/docs/tasks/configure-pod-container/assign-memory-resource/) + +* [컨테이너 및 파드 CPU 리소스 할당](/docs/tasks/configure-pod-container/assign-cpu-resource/) + +* [파드에 대한 서비스 품질(QoS) 구성](/docs/tasks/configure-pod-container/quality-service-pod/) + +{{% /capture %}} diff --git a/content/ko/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity.md b/content/ko/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity.md index c0c92c8b0a..945fd88085 100644 --- a/content/ko/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity.md +++ b/content/ko/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity.md @@ -115,6 +115,6 @@ weight: 120 {{% /capture %}} {{% capture whatsnext %}} -[노드 어피니티](/ko/docs/concepts/configuration/assign-pod-node/#node-affinity)에 +[노드 어피니티](/ko/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity)에 대해 더 알아보기. {{% /capture %}} diff --git a/content/ko/docs/tasks/configure-pod-container/pull-image-private-registry.md b/content/ko/docs/tasks/configure-pod-container/pull-image-private-registry.md new file mode 100644 index 0000000000..2eadc8450c --- /dev/null +++ b/content/ko/docs/tasks/configure-pod-container/pull-image-private-registry.md @@ -0,0 +1,214 @@ +--- +title: 프라이빗 레지스트리에서 이미지 받아오기 +content_template: templates/task +weight: 100 +--- + +{{% capture overview %}} + +이 페이지는 프라이빗 도커 레지스트리나 리포지터리로부터 이미지를 받아오기 위해 시크릿(Secret)을 +사용하는 파드(Pod)를 생성하는 방법을 보여준다. + +{{% /capture %}} + +{{% capture prerequisites %}} + +* {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + +* 이 실습을 수행하기 위해, +[도커 ID](https://docs.docker.com/docker-id/)와 비밀번호가 필요하다. + +{{% /capture %}} + +{{% capture steps %}} + +## 도커 로그인 + +노트북에 프라이빗 이미지를 받아오기 위하여 레지스트리 인증을 필수로 수행해야 한다. + +```shell +docker login +``` + +프롬프트가 나타나면, 도커 사용자 이름(username)과 비밀번호(password)를 입력하자. + +로그인 프로세스는 권한 토큰 정보를 가지고 있는 `config.json` 파일을 생성하거나 업데이트 한다. + +`config.json` 파일을 확인하자. + +```shell +cat ~/.docker/config.json +``` + +하단과 유사한 결과를 확인할 수 있다. + +```json +{ + "auths": { + "https://index.docker.io/v1/": { + "auth": "c3R...zE2" + } + } +} +``` + +{{< note >}} +도커 자격 증명 저장소를 사용하는 경우, `auth` 항목이 아닌, 저장소의 이름을 값으로 사용하는 `credsStore` 항목을 확인할 수 있다. +{{< /note >}} + +## 기존의 도커 자격 증명을 기반으로 시크릿 생성하기 {#registry-secret-existing-credentials} + +쿠버네티스 클러스터는 프라이빗 이미지를 받아올 때, 컨테이너 레지스트리에 인증하기 위하여 +`docker-registry` 타입의 시크릿을 사용한다. + +만약 이미 `docker login` 을 수행하였다면, 이 때 생성된 자격 증명을 쿠버네티스 클러스터로 복사할 수 있다. + +```shell +kubectl create secret generic regcred \ + --from-file=.dockerconfigjson= \ + --type=kubernetes.io/dockerconfigjson +``` + +오브젝트에 대한 더 세밀한 제어(새로운 시크릿에 대한 네임스페이스나 레이블을 지정하는 등)가 필요할 경우, +시크릿을 사용자 정의한 후에 저장할 수도 있다. +다음을 확인하자. + +- 데이터 항목의 이름을 `.dockerconfigjson` 으로 설정한다 +- 도커 파일을 base64로 인코딩하고 그 문자열을 `data[".dockerconfigjson"]` + 필드에 자르지 않고 한 줄로 이어서 붙여넣는다 +- `type` 을 `kubernetes.io/dockerconfigjson` 으로 설정한다 + +예: + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: myregistrykey + namespace: awesomeapps +data: + .dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg== +type: kubernetes.io/dockerconfigjson +``` + +만약 `error: no objects passed to create` 메세지가 출력될 경우, base64로 인코딩된 문자열이 유효하지 않음을 의미한다. +또한 `Secret "myregistrykey" is invalid: data[.dockerconfigjson]: invalid value ...` 메세지가 출력될 경우, +base64로 인코딩된 문자열이 정상적으로 디코딩되었으나, `.docker/config.json` 파일로 파싱되지 못한 것을 의미한다. + +## 커맨드 라인에서 자격 증명을 통하여 시크릿 생성하기 + +`regcred` 라는 이름의 시크릿을 생성하자. + +```shell +kubectl create secret docker-registry regcred --docker-server= --docker-username= --docker-password= --docker-email= +``` + +아래의 각 항목에 대한 설명을 참고한다. + +* `` 은 프라이빗 도커 저장소의 FQDN 주소이다. (도커허브(DockerHub)의 경우, https://index.docker.io/v1/) +* `` 은 도커 사용자의 계정이다. +* `` 은 도커 사용자의 비밀번호이다. +* `` 은 도커 사용자의 이메일 주소이다. + +이를 통해 `regcred` 라는 시크릿으로 클러스터 내에서 도커 자격 증명을 생성했다. + +{{< note >}} +커맨드 라인에서 시크릿을 입력하는 경우, 보호되지 않는 셸 히스토리에 내용이 저장될 수 있으며, +이러한 시크릿들은 `kubectl` 이 구동 중인 동안 사용자의 PC의 다른 사용자들에게 +보일 수도 있다. +{{< /note >}} + + +## 시크릿 `regcred` 검증하기 + +방금 생성한 `regcred` 시크릿의 내용을 확인하기 위하여, YAML 형식으로 시크릿을 확인하자. + +```shell +kubectl get secret regcred --output=yaml +``` + +결과는 다음과 같다. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + ... + name: regcred + ... +data: + .dockerconfigjson: eyJodHRwczovL2luZGV4L ... J0QUl6RTIifX0= +type: kubernetes.io/dockerconfigjson +``` + +`.dockerconfigjson` 필드의 값은 도커 자격 증명의 base64 인코딩 결과이다. + +`.dockerconfigjson` 필드의 값을 확인하기 위하여, 시크릿 데이터를 읽을 수 있는 +형식으로 변경한다. + +```shell +kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode +``` + +결과는 다음과 같다. + +```json +{"auths":{"your.private.registry.example.com":{"username":"janedoe","password":"xxxxxxxxxxx","email":"jdoe@example.com","auth":"c3R...zE2"}}} +``` + +`auth` 필드의 값을 확인하기 위하여, base64로 인코딩된 데이터를 읽을 수 있는 형식으로 변경한다. + +```shell +echo "c3R...zE2" | base64 --decode +``` + +결과로, 사용자 이름과 비밀번호가 `:` 로 연결되어 아래와 같이 표현된다. + +```none +janedoe:xxxxxxxxxxx +``` + +참고로 시크릿 데이터에는 사용자의 로컬에 있는 `~/.docker/config.json` 파일과 유사한 인증 토큰이 포함되어 있다. + +이를 통해 `regcred` 라는 시크릿으로 클러스터 내에서 도커 자격 증명을 생성했다. + +## 시크릿을 사용하는 파드 생성하기 + +다음은 `regcred` 에 있는 도커 자격 증명에 접근해야 하는 파드의 구성 파일이다. + +{{< codenew file="pods/private-reg-pod.yaml" >}} + +아래의 파일을 다운로드받는다. + +```shell +wget -O my-private-reg-pod.yaml https://k8s.io/examples/pods/private-reg-pod.yaml +``` + +`my-private-reg-pod.yaml` 파일 안에서, `` 값을 다음과 같은 프라이빗 저장소 안의 이미지 경로로 변경한다. + +```none +your.private.registry.example.com/janedoe/jdoe-private:v1 +``` + +프라이빗 저장소에서 이미지를 받아오기 위하여, 쿠버네티스에서 자격 증명이 필요하다. +구성 파일의 `imagePullSecrets` 필드를 통해 쿠버네티스가 `regcred` 라는 시크릿으로부터 자격 증명을 가져올 수 있다. + +시크릿을 사용해서 파드를 생성하고, 파드가 실행되는지 확인하자. + +```shell +kubectl apply -f my-private-reg-pod.yaml +kubectl get pod private-reg +``` + +{{% /capture %}} + +{{% capture whatsnext %}} + +* [시크릿](/docs/concepts/configuration/secret/)에 대해 더 배워 보기. +* [프라이빗 레지스트리 사용](/ko/docs/concepts/containers/images/#프라이빗-레지스트리-사용)에 대해 더 배워 보기. +* [서비스 어카운트에 풀 시크릿(pull secret) 추가하기](/docs/tasks/configure-pod-container/configure-service-account/#add-imagepullsecrets-to-a-service-account)에 대해 더 배워 보기. +* [kubectl create secret docker-registry](/docs/reference/generated/kubectl/kubectl-commands/#-em-secret-docker-registry-em-)에 대해 읽어보기. +* [시크릿](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#secret-v1-core)에 대해 읽어보기. +* [PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core)의 `imagePullSecrets` 필드에 대해 읽어보기. + +{{% /capture %}} diff --git a/content/ko/docs/tasks/configure-pod-container/quality-service-pod.md b/content/ko/docs/tasks/configure-pod-container/quality-service-pod.md new file mode 100644 index 0000000000..e2552c3f6d --- /dev/null +++ b/content/ko/docs/tasks/configure-pod-container/quality-service-pod.md @@ -0,0 +1,266 @@ +--- +title: 파드에 대한 서비스 품질(QoS) 구성 +content_template: templates/task +weight: 30 +--- + + +{{% capture overview %}} + +이 페이지는 특정 서비스 품질(QoS) 클래스를 할당하기 위해 어떻게 파드를 +구성해야 하는지 보여준다. 쿠버네티스는 QoS 클래스를 사용하여 파드 +스케줄링과 축출을 결정한다. + +{{% /capture %}} + + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + +{{% /capture %}} + + +{{% capture steps %}} + +## QoS 클래스 + +쿠버네티스가 파드를 생성할 때, 파드에 다음의 QoS 클래스 중 하나를 할당한다. + +* Guaranteed +* Burstable +* BestEffort + +## 네임스페이스 생성 + +이 연습에서 생성한 리소스가 클러스터의 나머지와 +격리되도록 네임스페이스를 생성한다. + +```shell +kubectl create namespace qos-example +``` + +## Guaranteed QoS 클래스가 할당되는 파드 생성 + +파드에 Guaranteed QoS 클래스 할당을 위한 전제 조건은 다음과 같다. + +* 파드 내 모든 컨테이너는 메모리 상한과 메모리 요청량을 가지고 있어야 하며, 이는 동일해야 한다. +* 파드 내 모든 컨테이너는 CPU 상한과 CPU 요청량을 가지고 있어야 하며, 이는 동일해야 한다. + +이것은 하나의 컨테이너를 갖는 파드의 구성 파일이다. 해당 컨테이너는 메모리 상한과 +메모리 요청량을 갖고 있고, 200MiB로 동일하다. 해당 컨테이너는 CPU 상한과 CPU 요청량을 가지며, 700 milliCPU로 동일하다. + +{{< codenew file="pods/qos/qos-pod.yaml" >}} + +파드를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod.yaml --namespace=qos-example +``` + +파드의 상세 정보를 본다. + +```shell +kubectl get pod qos-demo --namespace=qos-example --output=yaml +``` + +출력 결과는 쿠버네티스가 파드에 Guaranteed QoS 클래스를 부여했음을 보여준다. 또한 +파드의 컨테이너가 메모리 요청량과 일치하는 메모리 상한을 가지며, +CPU 요청량과 일치하는 CPU 상한을 갖고 있음을 확인할 수 있다. + +```yaml +spec: + containers: + ... + resources: + limits: + cpu: 700m + memory: 200Mi + requests: + cpu: 700m + memory: 200Mi +... + qosClass: Guaranteed +``` + +{{< note >}} +컨테이너가 자신의 메모리 상한을 지정하지만, 메모리 요청량을 지정하지 않는 경우, +쿠버네티스는 상한과 일치하는 메모리 요청량을 자동으로 할당한다. 이와 유사하게, 만약 컨테이너가 자신의 +CPU 상한을 지정하지만, CPU 요청량을 지정하지 않은 경우, 쿠버네티스는 상한과 일치하는 CPU 요청량을 자동으로 +할당한다. +{{< /note >}} + +파드를 삭제한다. + +```shell +kubectl delete pod qos-demo --namespace=qos-example +``` + +## Burstable QoS 클래스가 할당되는 파드 생성 + +다음의 경우 파드에 Burstable QoS 클래스가 부여된다. + +* 파드가 Guaranteed QoS 클래스 기준을 만족하지 않는다. +* 파드 내에서 최소한 하나의 컨테이너가 메모리 또는 CPU 요청량을 가진다. + +컨테이너가 하나인 파드의 구성 파일은 다음과 같다. 컨테이너는 +200MiB의 메모리 상한과 100MiB의 메모리 요청량을 가진다. + +{{< codenew file="pods/qos/qos-pod-2.yaml" >}} + +파드를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod-2.yaml --namespace=qos-example +``` + +파드의 상세 정보를 본다. + +```shell +kubectl get pod qos-demo-2 --namespace=qos-example --output=yaml +``` + +출력 결과는 쿠버네티스가 파드에 Burstable QoS 클래스를 부여했음을 보여준다. + +```yaml +spec: + containers: + - image: nginx + imagePullPolicy: Always + name: qos-demo-2-ctr + resources: + limits: + memory: 200Mi + requests: + memory: 100Mi +... + qosClass: Burstable +``` + +파드를 삭제한다. + +```shell +kubectl delete pod qos-demo-2 --namespace=qos-example +``` + +## BestEffort QoS 클래스가 할당되는 파드 생성 + +파드에 QoS 클래스 BestEffort를 제공하려면, 파드의 컨테이너에 +메모리 또는 CPU의 상한이나 요청량이 없어야 한다. + +컨테이너가 하나인 파드의 구성 파일이다. 해당 컨테이너는 메모리 또는 CPU의 +상한이나 요청량을 갖지 않는다. + +{{< codenew file="pods/qos/qos-pod-3.yaml" >}} + +파드를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod-3.yaml --namespace=qos-example +``` + +파드의 상세 정보를 본다. + +```shell +kubectl get pod qos-demo-3 --namespace=qos-example --output=yaml +``` + +출력 결과는 쿠버네티스가 파드에 BestEffort QoS 클래스를 부여했음을 보여준다. + +```yaml +spec: + containers: + ... + resources: {} + ... + qosClass: BestEffort +``` + +파드를 삭제한다. + +```shell +kubectl delete pod qos-demo-3 --namespace=qos-example +``` + +## 컨테이너가 두 개인 파드 생성 + +컨테이너가 두 개인 파드의 구성 파일이다. 한 컨테이너는 200MiB의 메모리 +요청량을 지정한다. 다른 컨테이너는 어떤 요청량이나 상한을 지정하지 않는다. + +{{< codenew file="pods/qos/qos-pod-4.yaml" >}} + +참고로 이 파드는 Burstable QoS 클래스의 기준을 충족한다. 즉, Guaranteed QoS 클래스에 대한 +기준을 충족하지 않으며, 해당 컨테이너 중 하나가 메모리 요청량을 갖는다. + +파드를 생성한다. + +```shell +kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod-4.yaml --namespace=qos-example +``` + +파드의 상세 정보를 본다. + +```shell +kubectl get pod qos-demo-4 --namespace=qos-example --output=yaml +``` + +출력 결과는 쿠버네티스가 파드에 Burstable QoS 클래스를 부여했음을 보여준다. + +```yaml +spec: + containers: + ... + name: qos-demo-4-ctr-1 + resources: + requests: + memory: 200Mi + ... + name: qos-demo-4-ctr-2 + resources: {} + ... + qosClass: Burstable +``` + +파드를 삭제한다. + +```shell +kubectl delete pod qos-demo-4 --namespace=qos-example +``` + +## 정리 + +네임스페이스를 삭제한다. + +```shell +kubectl delete namespace qos-example +``` + +{{% /capture %}} + +{{% capture whatsnext %}} + + +### 앱 개발자를 위한 문서 + +* [컨테이너 및 파드 메모리 리소스 할당](/ko/docs/tasks/configure-pod-container/assign-memory-resource/) + +* [컨테이너 및 파드 CPU 리소스 할당](/docs/tasks/configure-pod-container/assign-cpu-resource/) + +### 클러스터 관리자를 위한 문서 + +* [네임스페이스에 대한 기본 메모리 요청과 상한 구성](/ko/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/) + +* [네임스페이스에 대한 기본 CPU 요청과 상한 구성](/ko/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/) + +* [네임스페이스에 대한 메모리의 최소 및 최대 메모리 제약 조건 구성](/ko/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/) + +* [네임스페이스에 대한 CPU의 최소 및 최대 제약 조건 구성](/ko/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/) + +* [네임스페이스에 대한 메모리 및 CPU 쿼터 구성](/ko/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/) + +* [네임스페이스에 대한 파드 쿼터 구성](/ko/docs/tasks/administer-cluster/manage-resources/quota-pod-namespace/) + +* [API 오브젝트 할당량 구성](/docs/tasks/administer-cluster/quota-api-object/) + +* [노드의 토폴로지 관리 정책 제어](/docs/tasks/administer-cluster/topology-manager/) +{{% /capture %}} diff --git a/content/ko/docs/tasks/debug-application-cluster/resource-metrics-pipeline.md b/content/ko/docs/tasks/debug-application-cluster/resource-metrics-pipeline.md index 9bddc81234..fd6a5bd8a0 100644 --- a/content/ko/docs/tasks/debug-application-cluster/resource-metrics-pipeline.md +++ b/content/ko/docs/tasks/debug-application-cluster/resource-metrics-pipeline.md @@ -49,7 +49,7 @@ CPU는 일정 기간 동안 [CPU 코어](https://kubernetes.io/docs/concepts/con [메트릭 서버](https://github.com/kubernetes-incubator/metrics-server)는 클러스터 전역에서 리소스 사용량 데이터를 집계한다. `kube-up.sh` 스크립트에 의해 생성된 클러스터에는 기본적으로 메트릭 서버가 디플로이먼트 오브젝트로 배포된다. 만약 다른 쿠버네티스 설치 메커니즘을 사용한다면, 제공된 -[배포 yaml들](https://github.com/kubernetes-incubator/metrics-server/tree/master/deploy)을 사용하여 메트릭 서버를 배포할 수 있다. +[디플로이먼트 components.yaml](https://github.com/kubernetes-sigs/metrics-server/releases) 파일을 사용하여 메트릭 서버를 배포할 수 있다. 메트릭 서버는 각 노드에서 [Kubelet](/docs/admin/kubelet/)에 의해 노출된 Summary API에서 메트릭을 수집한다. diff --git a/content/ko/docs/tasks/manage-kubernetes-objects/declarative-config.md b/content/ko/docs/tasks/manage-kubernetes-objects/declarative-config.md index 013854884a..da73445d78 100644 --- a/content/ko/docs/tasks/manage-kubernetes-objects/declarative-config.md +++ b/content/ko/docs/tasks/manage-kubernetes-objects/declarative-config.md @@ -235,7 +235,7 @@ kubectl scale deployment/nginx-deployment --replicas=2 `kubectl get`을 사용하여 활성 구성을 출력한다. ```shell -kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -o yaml +kubectl get deployment nginx-deployment -o yaml ``` 출력은 `replicas` 필드가 2로 설정된 것을 보여주며, `last-applied-configuration` @@ -294,7 +294,7 @@ kubectl apply -f https://k8s.io/examples/application/update_deployment.yaml `kubectl get`을 사용하여 활성 구성을 출력한다. ```shell -kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -o yaml +kubectl get -f https://k8s.io/examples/application/update_deployment.yaml -o yaml ``` 출력은 활성 구성에 다음의 변경사항을 보여준다. diff --git a/content/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md b/content/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md index 332abfbce9..b36f773884 100644 --- a/content/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md +++ b/content/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md @@ -109,7 +109,7 @@ php-apache Deployment/php-apache/scale 0% / 50% 1 10 1 ```shell -kubectl run --generator=run-pod/v1 -it --rm load-generator --image=busybox /bin/sh +kubectl run -it --rm load-generator --image=busybox /bin/sh Hit enter for command prompt diff --git a/content/ko/docs/tasks/tools/install-kubectl.md b/content/ko/docs/tasks/tools/install-kubectl.md index c77bbf4f43..7754978e42 100644 --- a/content/ko/docs/tasks/tools/install-kubectl.md +++ b/content/ko/docs/tasks/tools/install-kubectl.md @@ -62,6 +62,7 @@ echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/ sudo apt-get update sudo apt-get install -y kubectl {{< /tab >}} + {{< tab name="CentOS, RHEL 또는 Fedora" codelang="bash" >}}cat < /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes @@ -86,17 +87,23 @@ snap install kubectl --classic kubectl version --client ``` + {{% /tab %}} + {{% tab name="Homebrew" %}} 리눅스 상에서 [Homebrew](https://docs.brew.sh/Homebrew-on-Linux) 패키지 관리자를 사용한다면, [설치](https://docs.brew.sh/Homebrew-on-Linux#install)를 통해 kubectl을 사용할 수 있다. + ```shell brew install kubectl kubectl version --client ``` + {{% /tab %}} + {{< /tabs >}} + ## macOS에 kubectl 설치 ### macOS에서 curl을 사용하여 kubectl 바이너리 설치 @@ -125,6 +132,7 @@ kubectl version --client ``` sudo mv ./kubectl /usr/local/bin/kubectl ``` + 4. 설치한 버전이 최신 버전인지 확인한다. ``` @@ -140,6 +148,7 @@ macOS에서 [Homebrew](https://brew.sh/) 패키지 관리자를 사용하는 경 ``` brew install kubectl ``` + 또는 ``` @@ -184,11 +193,13 @@ macOS에서 [Macports](https://macports.org/) 패키지 관리자를 사용하 최신의 안정 버전(예: 스크립팅을 위한)을 찾으려면, [https://storage.googleapis.com/kubernetes-release/release/stable.txt](https://storage.googleapis.com/kubernetes-release/release/stable.txt)를 참고한다. 2. 바이너리를 PATH가 설정된 디렉터리에 추가한다. + 3. `kubectl` 의 버전이 다운로드한 버전과 같은지 확인한다. ``` kubectl version --client ``` + {{< note >}} [Windows용 도커 데스크톱](https://docs.docker.com/docker-for-windows/#kubernetes)은 자체 버전의 `kubectl` 을 PATH에 추가한다. 도커 데스크톱을 이전에 설치한 경우, 도커 데스크톱 설치 프로그램에서 추가한 PATH 항목 앞에 PATH 항목을 배치하거나 도커 데스크톱의 `kubectl` 을 제거해야 할 수도 있다. @@ -205,9 +216,9 @@ Windows에서 [Powershell Gallery](https://www.powershellgallery.com/) 패키지 install-kubectl.ps1 [-DownloadLocation ] ``` - {{< note >}}`DownloadLocation` 을 지정하지 않으면, `kubectl` 은 사용자의 임시 디렉터리에 설치된다.{{< /note >}} +{{< note >}}`DownloadLocation` 을 지정하지 않으면, `kubectl` 은 사용자의 임시 디렉터리에 설치된다.{{< /note >}} - 설치 프로그램은 `$HOME/.kube` 를 생성하고 구성 파일을 작성하도록 지시한다. + 설치 프로그램은 `$HOME/.kube` 를 생성하고 구성 파일을 작성하도록 지시한다. 2. 설치한 버전이 최신 버전인지 확인한다. @@ -215,11 +226,14 @@ Windows에서 [Powershell Gallery](https://www.powershellgallery.com/) 패키지 kubectl version --client ``` - {{< note >}}설치 업데이트는 1 단계에서 나열한 두 명령을 다시 실행하여 수행한다.{{< /note >}} +{{< note >}} +설치 업데이트는 1 단계에서 나열한 두 명령을 다시 실행하여 수행한다. +{{< /note >}} ### Chocolatey 또는 Scoop을 사용하여 Windows에 설치 -Windows에 kubectl을 설치하기 위해서 [Chocolatey](https://chocolatey.org) 패키지 관리자나 [Scoop](https://scoop.sh) 커맨드 라인 설치 프로그램을 사용할 수 있다. +1. Windows에 kubectl을 설치하기 위해서 [Chocolatey](https://chocolatey.org) 패키지 관리자나 [Scoop](https://scoop.sh) 커맨드 라인 설치 프로그램을 사용할 수 있다. + {{< tabs name="kubectl_win_install" >}} {{% tab name="choco" %}} @@ -232,6 +246,8 @@ Windows에 kubectl을 설치하기 위해서 [Chocolatey](https://chocolatey.org {{% /tab %}} {{< /tabs >}} + + 2. 설치한 버전이 최신 버전인지 확인한다. ``` @@ -261,13 +277,14 @@ Windows에 kubectl을 설치하기 위해서 [Chocolatey](https://chocolatey.org New-Item config -type file ``` - {{< note >}}메모장과 같은 텍스트 편집기를 선택하여 구성 파일을 편집한다.{{< /note >}} +{{< note >}}메모장과 같은 텍스트 편집기를 선택하여 구성 파일을 편집한다.{{< /note >}} ## Google Cloud SDK의 일부로 다운로드 kubectl을 Google Cloud SDK의 일부로 설치할 수 있다. 1. [Google Cloud SDK](https://cloud.google.com/sdk/)를 설치한다. + 2. `kubectl` 설치 명령을 실행한다. ``` @@ -289,6 +306,7 @@ kubectl이 쿠버네티스 클러스터를 찾아 접근하려면, [kube-up.sh]( ```shell kubectl cluster-info ``` + URL 응답이 표시되면, kubectl이 클러스터에 접근하도록 올바르게 구성된 것이다. 다음과 비슷한 메시지가 표시되면, kubectl이 올바르게 구성되지 않았거나 쿠버네티스 클러스터에 연결할 수 없다. @@ -346,18 +364,17 @@ source /usr/share/bash-completion/bash_completion ```shell echo 'source <(kubectl completion bash)' >>~/.bashrc ``` - - 완성 스크립트를 `/etc/bash_completion.d` 디렉터리에 추가한다. ```shell kubectl completion bash >/etc/bash_completion.d/kubectl ``` -- kubectl에 대한 앨리어스(alias)가 있는 경우, 해당 앨리어스로 작업하도록 셸 완성을 확장할 수 있다. +kubectl에 대한 앨리어스(alias)가 있는 경우, 해당 앨리어스로 작업하도록 셸 완성을 확장할 수 있다. - ```shell - echo 'alias k=kubectl' >>~/.bashrc - echo 'complete -F __start_kubectl k' >>~/.bashrc - ``` +```shell +echo 'alias k=kubectl' >>~/.bashrc +echo 'complete -F __start_kubectl k' >>~/.bashrc +``` {{< note >}} bash-completion은 `/etc/bash_completion.d` 에 있는 모든 완성 스크립트를 소싱한다. @@ -450,9 +467,9 @@ export BASH_COMPLETION_COMPAT_DIR="/usr/local/etc/bash_completion.d" - Homebrew로 kubectl을 설치한 경우([위](#macos에서-homebrew를-사용하여-설치)의 설명을 참고), kubectl 완성 스크립트는 이미 `/usr/local/etc/bash_completion.d/kubectl` 에 있어야 한다. 이 경우, 아무 것도 할 필요가 없다. -{{< note >}} -bash-completion v2의 Homebrew 설치는 `BASH_COMPLETION_COMPAT_DIR` 디렉터리의 모든 파일을 소싱하므로, 후자의 두 가지 방법이 적용된다. -{{< /note >}} + {{< note >}} + bash-completion v2의 Homebrew 설치는 `BASH_COMPLETION_COMPAT_DIR` 디렉터리의 모든 파일을 소싱하므로, 후자의 두 가지 방법이 적용된다. + {{< /note >}} 어쨌든, 셸을 다시 로드 한 후에, kubectl 완성이 작동해야 한다. {{% /tab %}} @@ -485,6 +502,7 @@ compinit {{% /tab %}} {{< /tabs >}} + {{% /capture %}} {{% capture whatsnext %}} diff --git a/content/ko/docs/templates/feature-state-alpha.txt b/content/ko/docs/templates/feature-state-alpha.txt deleted file mode 100644 index a8247ff422..0000000000 --- a/content/ko/docs/templates/feature-state-alpha.txt +++ /dev/null @@ -1,8 +0,0 @@ -이 기능은 현재 *알파(alpha)* 상태로, 다음을 의미한다. - -* 버전 이름에는 알파(예: v1alpha1)가 포함되어 있다. -* 버그가 있을 수 있다. 기능을 활성화하면 버그가 노출될 수 있다. 기본적으로 비활성화되어 있다. -* 기능 지원은 예고 없이 언제든지 중단될 수 있다. -* API는 이후 소프트웨어 릴리즈에서 예고 없이 호환되지 않는 방식으로 변경될 수 있다. -* 버그에 의한 위험 증가와 장기적인 지원 부족으로, 단기 테스트 클러스터에서만 사용할 것을 권장한다. - diff --git a/content/ko/docs/templates/feature-state-beta.txt b/content/ko/docs/templates/feature-state-beta.txt deleted file mode 100644 index 0314381585..0000000000 --- a/content/ko/docs/templates/feature-state-beta.txt +++ /dev/null @@ -1,8 +0,0 @@ -이 기능은 현재 *베타(beta)* 상태로, 다음을 의미한다. - -* 버전 이름에는 베타(예: v2beta3)가 포함된다. -* 코드의 테스트가 완료되었다. 기능을 활성화해도 안전한 것으로 간주한다. 기본으로 활성화되어 있다. -* 자세한 내용은 변경될 수 있지만, 전체 기능에 대한 지원은 중단되지 않는다. -* 오브젝트의 스키마 및(또는) 의미(semantics)는 후속 베타 또는 안정적인 릴리즈에서 호환되지 않는 방식으로 변경될 수 있다. 이 경우, 다음 버전으로 마이그레이션하기 위한 지침을 제공할 것이다. 이를 위해서는 API 오브젝트의 삭제, 수정 또는 재생성이 필요할 수 있다. 편집 과정에서 약간의 생각이 필요할 수 있다. 이 기능을 사용하는 애플리케이션은 가동 중지 시간(downtime)이 필요할 수 있다. -* 후속 릴리즈에서 호환되지 않는 변경 가능성이 있으므로 오직 업무상 중요하지 않은 용도로만 권장한다. 만약 사용자가 독립적으로 업그레이드가 가능한 다중 클러스터를 가지고 있다면, 이 제약은 완화될 수 있다. -* **베타 기능을 사용해보고, 우리에게 피드백을 주십시오! 베타가 종료된 후에 많은 것을 변경하는 것은 타당하지 않을 수 있습니다.** diff --git a/content/ko/docs/templates/feature-state-deprecated.txt b/content/ko/docs/templates/feature-state-deprecated.txt deleted file mode 100644 index d1e0298f7c..0000000000 --- a/content/ko/docs/templates/feature-state-deprecated.txt +++ /dev/null @@ -1,2 +0,0 @@ - -이 기능은 *사용중단(deprecated)* 상태이다. 이 상태에 대한 더 많은 정보는 [쿠버네티스 사용중단(deprecation) 정책](/docs/reference/deprecation-policy/)을 참조한다. diff --git a/content/ko/docs/templates/feature-state-stable.txt b/content/ko/docs/templates/feature-state-stable.txt deleted file mode 100644 index d2e4357f73..0000000000 --- a/content/ko/docs/templates/feature-state-stable.txt +++ /dev/null @@ -1,5 +0,0 @@ - -이 기능은 *안정적(stable)* 이며, 다음을 의미한다. - -* 버전 이름은 vX 로 표시되며 여기서 X는 정수를 의미한다. -* 여러 후속 버전으로 릴리스되는 소프트웨어에서는 안정적인 버전의 기능들이 나타날 것이다. diff --git a/content/ko/docs/templates/index.md b/content/ko/docs/templates/index.md deleted file mode 100644 index 9d7bccd143..0000000000 --- a/content/ko/docs/templates/index.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -headless: true - -resources: -- src: "*alpha*" - title: "alpha" -- src: "*beta*" - title: "beta" -- src: "*deprecated*" - title: "deprecated" -- src: "*stable*" - title: "stable" ---- diff --git a/content/ko/docs/tutorials/clusters/apparmor.md b/content/ko/docs/tutorials/clusters/apparmor.md index e3f9246a4f..59de6a63f6 100644 --- a/content/ko/docs/tutorials/clusters/apparmor.md +++ b/content/ko/docs/tutorials/clusters/apparmor.md @@ -340,7 +340,7 @@ Events: 스케줄러는 어떤 프로파일이 어떤 노드에 적재되는지 고려하지 않으니, 프로파일 전체 집합이 모든 노드에 적재되어야 한다. 대안적인 방법은 각 프로파일(혹은 프로파일의 클래스)을 위한 노드 레이블을 노드에 추가하고, -[노드 셀렉터](/ko/docs/concepts/configuration/assign-pod-node/)를 이용하여 +[노드 셀렉터](/ko/docs/concepts/scheduling-eviction/assign-pod-node/)를 이용하여 파드가 필요한 프로파일이 있는 노드에서 실행되도록 한다. ### PodSecurityPolicy로 프로파일 제한하기 {#restricting-profiles-with-the-podsecuritypolicy} diff --git a/content/ko/docs/tutorials/hello-minikube.md b/content/ko/docs/tutorials/hello-minikube.md index 7334c6b0c7..3a843087eb 100644 --- a/content/ko/docs/tutorials/hello-minikube.md +++ b/content/ko/docs/tutorials/hello-minikube.md @@ -7,7 +7,7 @@ menu: title: "Get Started" weight: 10 post: > -

Ready to get your hands dirty? Build a simple Kubernetes cluster that runs "Hello World" for Node.js.

+

작업할 준비가 되었나요? 샘플 애플리케이션을 실행하는 간단한 쿠버네티스 클러스터를 구축합니다.

card: name: tutorials weight: 10 @@ -16,7 +16,7 @@ card: {{% capture overview %}} 이 튜토리얼에서는 [Minikube](/ko/docs/setup/learning-environment/minikube)와 Katacoda를 이용하여 -쿠버네티스에서 Node.js 로 작성된 간단한 Hello World 애플리케이션을 어떻게 실행하는지 살펴본다. +쿠버네티스에서 샘플 애플리케이션을 어떻게 실행하는지 살펴본다. Katacode는 무료로 브라우저에서 쿠버네티스 환경을 제공한다. {{< note >}} @@ -27,7 +27,7 @@ Katacode는 무료로 브라우저에서 쿠버네티스 환경을 제공한다. {{% capture objectives %}} -* hello world 애플리케이션을 Minikube에 배포한다. +* 샘플 애플리케이션을 Minikube에 배포한다. * 배포한 애플리케이션을 실행한다. * 애플리케이션의 로그를 확인한다. @@ -35,13 +35,7 @@ Katacode는 무료로 브라우저에서 쿠버네티스 환경을 제공한다. {{% capture prerequisites %}} -이 튜토리얼에서 아래 파일들을 빌드한 컨테이너 이미지를 제공한다. - -{{< codenew language="js" file="minikube/server.js" >}} - -{{< codenew language="conf" file="minikube/Dockerfile" >}} - -`docker build`명령에 대한 자세한 설명은 [Docker 문서](https://docs.docker.com/engine/reference/commandline/build/)를 읽어보자. +이 튜토리얼은 NGINX를 사용해서 모든 요청에 응답하는 컨테이너 이미지를 제공한다. {{% /capture %}} @@ -165,7 +159,7 @@ Katacode는 무료로 브라우저에서 쿠버네티스 환경을 제공한다. 5. Katacoda 환경에서만: 서비스 출력에서 `8080`의 반대편에 표시되는 5자리 포트 번호를 기록 한다. 이 포트 번호는 무작위로 생성되며, 사용자마다 다를 수 있다. 포트 번호 텍스트 상자에 포트 번호를 입력한 다음, 포트 표시를 클릭한다. 이전 예시를 사용해서 `30369` 를 입력한다. - 이렇게 하면 당신의 앱을 서비스하는 브라우저 윈도우를 띄우고 "Hello World" 메시지를 보여준다. + 이렇게 하면 당신의 앱을 서비스하는 브라우저 윈도우를 띄우고 애플리케이션의 응답을 볼 수 있다. ## 애드온 사용하기 @@ -281,4 +275,4 @@ minikube delete * [애플리케이션 배포](/docs/tasks/run-application/run-stateless-application-deployment/)에 대해서 더 배워 본다. * [서비스 오브젝트](/ko/docs/concepts/services-networking/service/)에 대해서 더 배워 본다. -{{% /capture %}} \ No newline at end of file +{{% /capture %}} diff --git a/content/ko/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk.md b/content/ko/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk.md index 6d6ddf4e1e..a72d694e10 100644 --- a/content/ko/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk.md +++ b/content/ko/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk.md @@ -10,9 +10,9 @@ card: --- {{% capture overview %}} -이 튜토리얼은 [Redis를 이용한 PHP 방명록](../guestbook) 튜토리얼을 기반으로 한다. Elastic의 경량 로그, 메트릭, 네트워크 데이터 오픈소스 배송기인 *Beats* 를 방명록과 동일한 쿠버네티스 클러스터에 배포한다. Beats는 데이터를 수집하고 구문분석하여 Elasticsearch에 색인화하므로, Kibana에서 동작 정보를 결과로 보며 분석할 수 있다. 이 예시는 다음과 같이 구성되어 있다. +이 튜토리얼은 [Redis를 이용한 PHP 방명록](/ko/docs/tutorials/stateless-application/guestbook) 튜토리얼을 기반으로 한다. Elastic의 경량 로그, 메트릭, 네트워크 데이터 오픈소스 배송기인 *Beats* 를 방명록과 동일한 쿠버네티스 클러스터에 배포한다. Beats는 데이터를 수집하고 구문분석하여 Elasticsearch에 색인화하므로, Kibana에서 동작 정보를 결과로 보며 분석할 수 있다. 이 예시는 다음과 같이 구성되어 있다. -* [Redis를 이용한 PHP 방명록](../guestbook)을 실행한 인스턴스 +* [Redis를 이용한 PHP 방명록](/ko/docs/tutorials/stateless-application/guestbook)을 실행한 인스턴스 * Elasticsearch와 Kibana * Filebeat * Metricbeat @@ -35,7 +35,7 @@ card: 추가로 다음이 필요하다. -* 실행 중인 [Redis를 이용한 PHP 방명록](../guestbook) 튜토리얼의 배포본. +* 실행 중인 [Redis를 이용한 PHP 방명록](/ko/docs/tutorials/stateless-application/guestbook) 튜토리얼의 배포본. * 실행 중인 Elasticsearch와 Kibana 디플로이먼트. [Elastic Cloud의 Elasticsearch 서비스](https://cloud.elastic.co)를 사용하거나, [파일을 내려받아](https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-elastic-stack.html) 워크스테이션이나 서버에서 운영하거나, [Elastic의 Helm 차트](https://github.com/elastic/helm-charts)를 이용한다. @@ -44,7 +44,7 @@ card: {{% capture lessoncontent %}} ## Redis를 이용한 PHP 방명록 시작 -이 튜토리얼은 [Redis를 이용한 PHP 방명록](../guestbook)을 기반으로 한다. 방명록 애플리케이션을 실행 중이라면, 이를 모니터링할 수 있다. 실행되지 않은 경우라면 지침을 따라 방명록을 배포하고 **정리하기** 단계는 수행하지 말자. 방명록을 실행할 때 이 페이지로 돌아오자. +이 튜토리얼은 [Redis를 이용한 PHP 방명록](/ko/docs/tutorials/stateless-application/guestbook)을 기반으로 한다. 방명록 애플리케이션을 실행 중이라면, 이를 모니터링할 수 있다. 실행되지 않은 경우라면 지침을 따라 방명록을 배포하고 **정리하기** 단계는 수행하지 말자. 방명록을 실행할 때 이 페이지로 돌아오자. ## 클러스터 롤 바인딩 추가 [클러스터 단위 롤 바인딩](/docs/reference/access-authn-authz/rbac/#rolebinding-and-clusterrolebinding)을 생성하여, 클러스터 수준(kube-system 안에)으로 kube-state-metrics와 Beats를 배포할 수 있게 한다. @@ -66,7 +66,7 @@ kubectl get pods --namespace=kube-system | grep kube-state ```shell git clone https://github.com/kubernetes/kube-state-metrics.git kube-state-metrics -kubectl create -f examples/standard +kubectl apply -f kube-state-metrics/examples/standard kubectl get pods --namespace=kube-system | grep kube-state-metrics ``` kube-state-metrics이 실행 중이고 준비되었는지 확인한다. @@ -77,7 +77,7 @@ kubectl get pods -n kube-system -l app.kubernetes.io/name=kube-state-metrics 출력 ```shell NAME READY STATUS RESTARTS AGE -kube-state-metrics-89d656bf8-vdthm 2/2 Running 0 21s +kube-state-metrics-89d656bf8-vdthm 1/1 Running 0 21s ``` ## Elastic의 예제를 GitHub 리포지터리에 클론한다. ```shell @@ -356,10 +356,14 @@ kubectl scale --replicas=2 deployment/frontend ```shell deployment.extensions/frontend scaled ``` +frontend의 파드를 최대 3개의 파드로 확장한다. +```shell +kubectl scale --replicas=3 deployment/frontend +``` ## Kibana에서 변화 확인하기 스크린 캡처를 확인하여, 표시된 필터를 추가하고 해당 열을 뷰에 추가한다. ScalingReplicaSet 항목이 표시되고, 여기에서 이벤트 목록의 맨 위에 풀링되는 이미지, 마운트된 볼륨, 파드 시작 등을 보여준다. -![Kibana 디스커버리](https://raw.githubusercontent.com/elastic/examples/master/beats-k8s-send-anywhere/scaling-discover.png) +![Kibana 디스커버리](https://raw.githubusercontent.com/elastic/examples/master/beats-k8s-send-anywhere/scaling-up.png) {{% /capture %}} diff --git a/content/ko/examples/admin/resource/cpu-constraints-pod-2.yaml b/content/ko/examples/admin/resource/cpu-constraints-pod-2.yaml new file mode 100644 index 0000000000..b5c7348f26 --- /dev/null +++ b/content/ko/examples/admin/resource/cpu-constraints-pod-2.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Pod +metadata: + name: constraints-cpu-demo-2 +spec: + containers: + - name: constraints-cpu-demo-2-ctr + image: nginx + resources: + limits: + cpu: "1.5" + requests: + cpu: "500m" diff --git a/content/ko/examples/admin/resource/cpu-constraints-pod-3.yaml b/content/ko/examples/admin/resource/cpu-constraints-pod-3.yaml new file mode 100644 index 0000000000..0a2083acd8 --- /dev/null +++ b/content/ko/examples/admin/resource/cpu-constraints-pod-3.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Pod +metadata: + name: constraints-cpu-demo-3 +spec: + containers: + - name: constraints-cpu-demo-3-ctr + image: nginx + resources: + limits: + cpu: "800m" + requests: + cpu: "100m" diff --git a/content/ko/examples/admin/resource/cpu-constraints-pod-4.yaml b/content/ko/examples/admin/resource/cpu-constraints-pod-4.yaml new file mode 100644 index 0000000000..3c102158db --- /dev/null +++ b/content/ko/examples/admin/resource/cpu-constraints-pod-4.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Pod +metadata: + name: constraints-cpu-demo-4 +spec: + containers: + - name: constraints-cpu-demo-4-ctr + image: vish/stress diff --git a/content/ko/examples/admin/resource/cpu-constraints-pod.yaml b/content/ko/examples/admin/resource/cpu-constraints-pod.yaml new file mode 100644 index 0000000000..7db23f26c8 --- /dev/null +++ b/content/ko/examples/admin/resource/cpu-constraints-pod.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Pod +metadata: + name: constraints-cpu-demo +spec: + containers: + - name: constraints-cpu-demo-ctr + image: nginx + resources: + limits: + cpu: "800m" + requests: + cpu: "500m" diff --git a/content/ko/examples/admin/resource/cpu-constraints.yaml b/content/ko/examples/admin/resource/cpu-constraints.yaml new file mode 100644 index 0000000000..6fc4239027 --- /dev/null +++ b/content/ko/examples/admin/resource/cpu-constraints.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: LimitRange +metadata: + name: cpu-min-max-demo-lr +spec: + limits: + - max: + cpu: "800m" + min: + cpu: "200m" + type: Container diff --git a/content/ko/examples/admin/resource/cpu-defaults-pod-2.yaml b/content/ko/examples/admin/resource/cpu-defaults-pod-2.yaml new file mode 100644 index 0000000000..9ca216dee1 --- /dev/null +++ b/content/ko/examples/admin/resource/cpu-defaults-pod-2.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Pod +metadata: + name: default-cpu-demo-2 +spec: + containers: + - name: default-cpu-demo-2-ctr + image: nginx + resources: + limits: + cpu: "1" diff --git a/content/ko/examples/admin/resource/cpu-defaults-pod-3.yaml b/content/ko/examples/admin/resource/cpu-defaults-pod-3.yaml new file mode 100644 index 0000000000..214cdee34b --- /dev/null +++ b/content/ko/examples/admin/resource/cpu-defaults-pod-3.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Pod +metadata: + name: default-cpu-demo-3 +spec: + containers: + - name: default-cpu-demo-3-ctr + image: nginx + resources: + requests: + cpu: "0.75" diff --git a/content/ko/examples/admin/resource/cpu-defaults-pod.yaml b/content/ko/examples/admin/resource/cpu-defaults-pod.yaml new file mode 100644 index 0000000000..56b06d9a69 --- /dev/null +++ b/content/ko/examples/admin/resource/cpu-defaults-pod.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Pod +metadata: + name: default-cpu-demo +spec: + containers: + - name: default-cpu-demo-ctr + image: nginx diff --git a/content/ko/examples/admin/resource/cpu-defaults.yaml b/content/ko/examples/admin/resource/cpu-defaults.yaml new file mode 100644 index 0000000000..b53d297181 --- /dev/null +++ b/content/ko/examples/admin/resource/cpu-defaults.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: LimitRange +metadata: + name: cpu-limit-range +spec: + limits: + - default: + cpu: 1 + defaultRequest: + cpu: 0.5 + type: Container diff --git a/content/ko/examples/admin/resource/memory-constraints-pod-2.yaml b/content/ko/examples/admin/resource/memory-constraints-pod-2.yaml new file mode 100644 index 0000000000..0b1ae569c4 --- /dev/null +++ b/content/ko/examples/admin/resource/memory-constraints-pod-2.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Pod +metadata: + name: constraints-mem-demo-2 +spec: + containers: + - name: constraints-mem-demo-2-ctr + image: nginx + resources: + limits: + memory: "1.5Gi" + requests: + memory: "800Mi" diff --git a/content/ko/examples/admin/resource/memory-constraints-pod-3.yaml b/content/ko/examples/admin/resource/memory-constraints-pod-3.yaml new file mode 100644 index 0000000000..f97cd4a8ac --- /dev/null +++ b/content/ko/examples/admin/resource/memory-constraints-pod-3.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Pod +metadata: + name: constraints-mem-demo-3 +spec: + containers: + - name: constraints-mem-demo-3-ctr + image: nginx + resources: + limits: + memory: "800Mi" + requests: + memory: "100Mi" diff --git a/content/ko/examples/admin/resource/memory-constraints-pod-4.yaml b/content/ko/examples/admin/resource/memory-constraints-pod-4.yaml new file mode 100644 index 0000000000..657530c41e --- /dev/null +++ b/content/ko/examples/admin/resource/memory-constraints-pod-4.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Pod +metadata: + name: constraints-mem-demo-4 +spec: + containers: + - name: constraints-mem-demo-4-ctr + image: nginx + diff --git a/content/ko/examples/admin/resource/memory-constraints-pod.yaml b/content/ko/examples/admin/resource/memory-constraints-pod.yaml new file mode 100644 index 0000000000..06954d10d6 --- /dev/null +++ b/content/ko/examples/admin/resource/memory-constraints-pod.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Pod +metadata: + name: constraints-mem-demo +spec: + containers: + - name: constraints-mem-demo-ctr + image: nginx + resources: + limits: + memory: "800Mi" + requests: + memory: "600Mi" diff --git a/content/ko/examples/admin/resource/memory-constraints.yaml b/content/ko/examples/admin/resource/memory-constraints.yaml new file mode 100644 index 0000000000..3a2924c032 --- /dev/null +++ b/content/ko/examples/admin/resource/memory-constraints.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: LimitRange +metadata: + name: mem-min-max-demo-lr +spec: + limits: + - max: + memory: 1Gi + min: + memory: 500Mi + type: Container diff --git a/content/ko/examples/admin/resource/memory-defaults-pod-2.yaml b/content/ko/examples/admin/resource/memory-defaults-pod-2.yaml new file mode 100644 index 0000000000..aa80610d84 --- /dev/null +++ b/content/ko/examples/admin/resource/memory-defaults-pod-2.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Pod +metadata: + name: default-mem-demo-2 +spec: + containers: + - name: default-mem-demo-2-ctr + image: nginx + resources: + limits: + memory: "1Gi" diff --git a/content/ko/examples/admin/resource/memory-defaults-pod-3.yaml b/content/ko/examples/admin/resource/memory-defaults-pod-3.yaml new file mode 100644 index 0000000000..09ee8b39a9 --- /dev/null +++ b/content/ko/examples/admin/resource/memory-defaults-pod-3.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Pod +metadata: + name: default-mem-demo-3 +spec: + containers: + - name: default-mem-demo-3-ctr + image: nginx + resources: + requests: + memory: "128Mi" diff --git a/content/ko/examples/admin/resource/memory-defaults-pod.yaml b/content/ko/examples/admin/resource/memory-defaults-pod.yaml new file mode 100644 index 0000000000..ce7a50fb55 --- /dev/null +++ b/content/ko/examples/admin/resource/memory-defaults-pod.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Pod +metadata: + name: default-mem-demo +spec: + containers: + - name: default-mem-demo-ctr + image: nginx diff --git a/content/ko/examples/admin/resource/memory-defaults.yaml b/content/ko/examples/admin/resource/memory-defaults.yaml new file mode 100644 index 0000000000..b98a5ae262 --- /dev/null +++ b/content/ko/examples/admin/resource/memory-defaults.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: LimitRange +metadata: + name: mem-limit-range +spec: + limits: + - default: + memory: 512Mi + defaultRequest: + memory: 256Mi + type: Container diff --git a/content/ko/examples/admin/resource/quota-mem-cpu-pod-2.yaml b/content/ko/examples/admin/resource/quota-mem-cpu-pod-2.yaml new file mode 100644 index 0000000000..380e900fda --- /dev/null +++ b/content/ko/examples/admin/resource/quota-mem-cpu-pod-2.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: quota-mem-cpu-demo-2 +spec: + containers: + - name: quota-mem-cpu-demo-2-ctr + image: redis + resources: + limits: + memory: "1Gi" + cpu: "800m" + requests: + memory: "700Mi" + cpu: "400m" diff --git a/content/ko/examples/admin/resource/quota-mem-cpu-pod.yaml b/content/ko/examples/admin/resource/quota-mem-cpu-pod.yaml new file mode 100644 index 0000000000..b0fd0a9451 --- /dev/null +++ b/content/ko/examples/admin/resource/quota-mem-cpu-pod.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: quota-mem-cpu-demo +spec: + containers: + - name: quota-mem-cpu-demo-ctr + image: nginx + resources: + limits: + memory: "800Mi" + cpu: "800m" + requests: + memory: "600Mi" + cpu: "400m" diff --git a/content/ko/examples/admin/resource/quota-mem-cpu.yaml b/content/ko/examples/admin/resource/quota-mem-cpu.yaml new file mode 100644 index 0000000000..5c4bcd81b8 --- /dev/null +++ b/content/ko/examples/admin/resource/quota-mem-cpu.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: ResourceQuota +metadata: + name: mem-cpu-demo +spec: + hard: + requests.cpu: "1" + requests.memory: 1Gi + limits.cpu: "2" + limits.memory: 2Gi diff --git a/content/ko/examples/admin/resource/quota-pod-deployment.yaml b/content/ko/examples/admin/resource/quota-pod-deployment.yaml new file mode 100644 index 0000000000..86e85aa468 --- /dev/null +++ b/content/ko/examples/admin/resource/quota-pod-deployment.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: pod-quota-demo +spec: + selector: + matchLabels: + purpose: quota-demo + replicas: 3 + template: + metadata: + labels: + purpose: quota-demo + spec: + containers: + - name: pod-quota-demo + image: nginx diff --git a/content/ko/examples/admin/resource/quota-pod.yaml b/content/ko/examples/admin/resource/quota-pod.yaml new file mode 100644 index 0000000000..0a07f055ca --- /dev/null +++ b/content/ko/examples/admin/resource/quota-pod.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: ResourceQuota +metadata: + name: pod-demo +spec: + hard: + pods: "2" diff --git a/content/ko/examples/minikube/Dockerfile b/content/ko/examples/minikube/Dockerfile deleted file mode 100644 index dd58cb7e75..0000000000 --- a/content/ko/examples/minikube/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM node:6.14.2 -EXPOSE 8080 -COPY server.js . -CMD [ "node", "server.js" ] diff --git a/content/ko/examples/minikube/server.js b/content/ko/examples/minikube/server.js deleted file mode 100644 index 76345a17d8..0000000000 --- a/content/ko/examples/minikube/server.js +++ /dev/null @@ -1,9 +0,0 @@ -var http = require('http'); - -var handleRequest = function(request, response) { - console.log('Received request for URL: ' + request.url); - response.writeHead(200); - response.end('Hello World!'); -}; -var www = http.createServer(handleRequest); -www.listen(8080); diff --git a/content/ko/examples/pods/private-reg-pod.yaml b/content/ko/examples/pods/private-reg-pod.yaml new file mode 100644 index 0000000000..4029588dd0 --- /dev/null +++ b/content/ko/examples/pods/private-reg-pod.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Pod +metadata: + name: private-reg +spec: + containers: + - name: private-reg-container + image: + imagePullSecrets: + - name: regcred + diff --git a/content/ko/examples/pods/qos/qos-pod-2.yaml b/content/ko/examples/pods/qos/qos-pod-2.yaml new file mode 100644 index 0000000000..115d4de21e --- /dev/null +++ b/content/ko/examples/pods/qos/qos-pod-2.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Pod +metadata: + name: qos-demo-2 + namespace: qos-example +spec: + containers: + - name: qos-demo-2-ctr + image: nginx + resources: + limits: + memory: "200Mi" + requests: + memory: "100Mi" diff --git a/content/ko/examples/pods/qos/qos-pod-3.yaml b/content/ko/examples/pods/qos/qos-pod-3.yaml new file mode 100644 index 0000000000..dac3629942 --- /dev/null +++ b/content/ko/examples/pods/qos/qos-pod-3.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Pod +metadata: + name: qos-demo-3 + namespace: qos-example +spec: + containers: + - name: qos-demo-3-ctr + image: nginx diff --git a/content/ko/examples/pods/qos/qos-pod-4.yaml b/content/ko/examples/pods/qos/qos-pod-4.yaml new file mode 100644 index 0000000000..d4818b277e --- /dev/null +++ b/content/ko/examples/pods/qos/qos-pod-4.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Pod +metadata: + name: qos-demo-4 + namespace: qos-example +spec: + containers: + + - name: qos-demo-4-ctr-1 + image: nginx + resources: + requests: + memory: "200Mi" + + - name: qos-demo-4-ctr-2 + image: redis diff --git a/content/ko/examples/pods/qos/qos-pod.yaml b/content/ko/examples/pods/qos/qos-pod.yaml new file mode 100644 index 0000000000..b4a6b1ea82 --- /dev/null +++ b/content/ko/examples/pods/qos/qos-pod.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Pod +metadata: + name: qos-demo + namespace: qos-example +spec: + containers: + - name: qos-demo-ctr + image: nginx + resources: + limits: + memory: "200Mi" + cpu: "700m" + requests: + memory: "200Mi" + cpu: "700m"