1
1
---
2
- reviewers :
3
- title : kubeadm으로 컨트롤 플레인 사용자 정의하기
2
+
3
+
4
+ title : kubeadm API로 컴포넌트 사용자 정의하기
4
5
content_type : concept
5
6
weight : 40
6
7
---
7
8
8
9
<!-- overview -->
9
10
11
+ 이 페이지는 kubeadm이 배포하는 컴포넌트(component)들을 사용자 정의하는 방법을 다룬다. 컨트롤 플레인 컴포넌트에
12
+ 대해서는 ` ClusterConfiguration ` 구조에서 플래그를 사용하거나 노드당 패치를 사용할 수 있다. kubelet과
13
+ kube-proxy의 경우, ` KubeletConfiguration ` 과 ` KubeProxyConfiguration ` 을 각각 사용할 수 있다.
14
+
15
+ 이 모든 옵션이 kubeadm 구성 API를 통해 가용하다.
16
+ 구성의 각 필드 상세 사항은
17
+ [ API 참조 페이지] ( https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3 ) 에서 찾아볼 수 있다.
18
+
19
+ {{< note >}}
20
+ kubeadm의 CoreDNS 디플로이먼트 사용자 정의는 현재 제공되지 않는다.
21
+ ` kube-system/coredns ` {{< glossary_tooltip text="컨피그맵" term_id="configmap" >}}을 수동으로
22
+ 패치하고, 그 이후에 CoreDNS {{< glossary_tooltip text="파드" term_id="pod" >}}를 다시 생성해야 한다. 또는,
23
+ 기본 CoreDNS 디플로이먼트를 생략하고 자체 변형(variant)을 배포할 수 있다.
24
+ 더 자세한 사항은 [ kubeadm에서 초기화 단계 사용하기] ( /docs/reference/setup-tools/kubeadm/kubeadm-init/#init-phases ) 을 참고한다.
25
+ {{< /note >}}
26
+
27
+ <!-- body -->
28
+
10
29
{{< feature-state for_k8s_version="v1.12" state="stable" >}}
11
30
12
- kubeadm의 ` ClusterConfiguration ` 오브젝트는 API 서버, 컨트롤러매니저, 스케줄러와 같은 컨트롤 플레인 구성요소에 전달되는
13
- 기본 플래그 ` extraArgs ` 필드를 노출한다. 이 구성요소는 다음 필드를 사용하도록 정의되어 있다.
31
+ ## ` ClusterConfiguration ` 의 플래그로 컨트롤 플레인 사용자 정의하기
32
+
33
+ kubeadm의 ` ClusterConfiguration ` 오브젝트는 API 서버, 컨트롤러매니저, 스케줄러, Etcd와 같은 컨트롤 플레인 컴포넌트에 전달되는
34
+ 기본 플래그를 사용자가 덮어쓸 수 있도록 노출한다.
35
+ 이 컴포넌트는 다음 구조체를 사용하여 정의된다.
14
36
15
37
- ` apiServer `
16
38
- ` controllerManager `
17
39
- ` scheduler `
40
+ - ` etcd `
18
41
19
- ` extraArgs ` 필드는 ` key: value ` 쌍으로 구성되어 있다. 컨트롤 플레인 구성요소를 위한 플래그를 대체하려면 다음을 수행한다.
42
+ 이 구조체들은 공통 필드인 ` extraArgs ` 를 포함하며, 이 필드는 ` 키: 값 ` 쌍으로 구성된다.
43
+ 컨트롤 플레인 컴포넌트를 위한 플래그를 덮어쓰려면 다음을 수행한다.
20
44
21
- 1 . 사용자 구성에서 적절한 필드를 추가한다.
22
- 2 . 필드에 대체할 플래그를 추가한다.
45
+ 1 . 사용자 구성에 적절한 ` extraArgs ` 필드를 추가한다.
46
+ 2 . ` extraArgs ` 필드에 플래그를 추가한다.
23
47
3 . ` kubeadm init ` 에 ` --config <CONFIG YAML 파일> ` 파라미터를 추가해서 실행한다.
24
48
25
- 각 필드의 구성에서 자세한 정보를 보려면,
26
- [ API 참고 문서] ( /docs/reference/config-api/kubeadm-config.v1beta2/ ) 에서 확인해 볼 수 있다.
27
-
28
49
{{< note >}}
29
- ` kubeadm config print init-defaults ` 를 실행하고 원하는 파일에 출력을 저장하여 기본값인 ` ClusterConfiguration ` 오브젝트를 생성할 수 있다.
50
+ ` kubeadm config print init-defaults ` 를 실행하고 원하는 파일에 출력을
51
+ 저장하여 기본값들로 구성된 ` ClusterConfiguration ` 오브젝트를 생성할 수 있다.
30
52
{{< /note >}}
31
53
54
+ {{< note >}}
55
+ ` ClusterConfiguration ` 오브젝트는 현재 kubeadm 클러스터에서 전역(global)으로 사용된다. 즉, 사용자가 추가하는 모든 플래그는
56
+ 다른 노드에 있는 동일한 컴포넌트에도 모두 적용될 것이다. 다른 노드에서
57
+ 컴포넌트별로 개별 구성을 적용하려면 [ 패치] ( #patches ) 를 사용하면 된다.
58
+ {{< /note >}}
32
59
60
+ {{< note >}}
61
+ 플래그(키)를 복제하거나 동일한 플래그 ` --foo ` 를 여러 번 전달하는 것은 현재 지원하지 않는다.
62
+ 이 문제를 해결하려면 [ 패치] ( #patches ) 를 사용해야 한다.
63
+ {{< /note >}}
33
64
34
- <!-- body -->
35
-
36
- ## APIServer 플래그
65
+ ### APIServer 플래그
37
66
38
67
자세한 내용은 [ kube-apiserver 레퍼런스 문서] ( /docs/reference/command-line-tools-reference/kube-apiserver/ ) 를 확인한다.
39
68
40
- 예시:
69
+ 사용 예시:
70
+
41
71
``` yaml
42
- apiVersion : kubeadm.k8s.io/v1beta2
72
+ apiVersion : kubeadm.k8s.io/v1beta3
43
73
kind : ClusterConfiguration
44
74
kubernetesVersion : v1.16.0
45
75
apiServer :
46
76
extraArgs :
47
- advertise-address : 192.168.0.103
48
77
anonymous-auth : " false"
49
78
enable-admission-plugins : AlwaysPullImages,DefaultStorageClass
50
79
audit-log-path : /home/johndoe/audit.log
51
80
` ` `
52
81
53
- ## 컨트롤러매니저 플래그
82
+ ### 컨트롤러매니저 플래그
54
83
55
84
자세한 내용은 [kube-controller-manager 레퍼런스 문서](/docs/reference/command-line-tools-reference/kube-controller-manager/)를 확인한다.
56
85
57
- 예시:
86
+ 사용 예시:
87
+
58
88
` ` ` yaml
59
- apiVersion : kubeadm.k8s.io/v1beta2
89
+ apiVersion : kubeadm.k8s.io/v1beta3
60
90
kind : ClusterConfiguration
61
91
kubernetesVersion : v1.16.0
62
92
controllerManager :
63
93
extraArgs :
64
94
cluster-signing-key-file : /home/johndoe/keys/ca.key
65
- bind-address : 0.0.0.0
66
95
deployment-controller-sync-period : " 50"
67
96
` ` `
68
97
69
- ## 스케줄러 플래그
98
+ ### 스케줄러 플래그
70
99
71
100
자세한 내용은 [kube-scheduler 레퍼런스 문서](/docs/reference/command-line-tools-reference/kube-scheduler/)를 확인한다.
72
101
73
- 예시:
102
+ 사용 예시:
103
+
74
104
` ` ` yaml
75
- apiVersion : kubeadm.k8s.io/v1beta2
105
+ apiVersion : kubeadm.k8s.io/v1beta3
76
106
kind : ClusterConfiguration
77
107
kubernetesVersion : v1.16.0
78
108
scheduler :
@@ -85,3 +115,96 @@ scheduler:
85
115
readOnly : true
86
116
pathType : " File"
87
117
` ` `
118
+
119
+ ### Etcd 플래그
120
+
121
+ 자세한 사항은 [etcd 서버 문서](https://etcd.io/docs/)를 확인한다.
122
+
123
+ 사용 예시:
124
+
125
+ ` ` ` yaml
126
+ apiVersion : kubeadm.k8s.io/v1beta3
127
+ kind : ClusterConfiguration
128
+ etcd :
129
+ local :
130
+ extraArgs :
131
+ election-timeout : 1000
132
+ ` ` `
133
+
134
+ ## 패치를 통해 컨트롤 플레인 사용자 정의하기 {#patches}
135
+
136
+ {{< feature-state for_k8s_version="v1.22" state="beta" >}}
137
+
138
+ Kubeadm을 사용하면 패치 파일이 있는 디렉토리를 개별 노드에 대한 ` InitConfiguration`과 `JoinConfiguration`에
139
+ 전달할 수 있다. 이 패치는 컨트롤 플레인 컴포넌트 메니패스트가 디스크에 기록되기 전에
140
+ 최종 사용자 정의 단계로 사용될 수 있다.
141
+
142
+ ` --config <YOUR CONFIG YAML>` 을 사용하여 이 파일을 `kubeadm init`에 전달할 수 있다.
143
+
144
+ ` ` ` yaml
145
+ apiVersion: kubeadm.k8s.io/v1beta3
146
+ kind: InitConfiguration
147
+ nodeRegistration:
148
+ patches:
149
+ directory: /home/user/somedir
150
+ ` ` `
151
+
152
+ {{< note >}}
153
+ ` kubeadm init` 의 경우, `---`로 구분된 `ClusterConfiguration`과 `InitConfiguration`을 모두
154
+ 포함하는 파일을 전달할 수 있다.
155
+ {{< /note >}}
156
+
157
+ ` --config <YOUR CONFIG YAML>` 을 사용하여 이 파일을 `kubeadm join`에 전달할 수 있다.
158
+
159
+ ` ` ` yaml
160
+ apiVersion: kubeadm.k8s.io/v1beta3
161
+ kind: JoinConfiguration
162
+ nodeRegistration:
163
+ patches:
164
+ directory: /home/user/somedir
165
+ ` ` `
166
+
167
+ 디렉토리는 `target[suffix][+patchtype].extension` 형태의 파일을 포함해야 한다.
168
+ 예를 들면, `kube-apiserver0+merge.yaml` 또는 단순히 `etcd.json`의 형태이다.
169
+
170
+ - ` target` 은 `kube-apiserver`, `kube-controller-manager`, `kube-scheduler` 그리고 `etcd` 중 하나가 될 수 있다.
171
+ - ` patchtype` 은 `strategic`, `merge` 그리고 `json` 중 하나가 될 수 있으며
172
+ [kubectl에서 지원하는](/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch) 패치 형식을 준수해야 한다.
173
+ ` patchtype` 의 기본값은 `strategic`이다.
174
+ - ` extension` 은 `json` 또는 `yaml` 중 하나여야 한다.
175
+ - ` suffix` 는 어떤 패치가 먼저 적용되는지를 결정하는 데 사용할 수 있는 영숫자 형태의
176
+ 선택적 문자열이다.
177
+
178
+ {{< note >}}
179
+ ` kubeadm upgrade` 를 사용하여 kubeadm 노드를 업그레이드하는 경우, 업그레이드 이후에도
180
+ 사용자 정의를 유지하려면 동일한 패치를 다시 제공해야 한다. 이는 동일한 디렉토리로 지정된 `--patches`
181
+ 플래그를 사용하여 처리할 수 있다. `kubeadm upgrade`는 동일 목적으로 재사용할 수 있는 구성
182
+ API 구조를 현재는 지원하지 않는다.
183
+ {{< /note >}}
184
+
185
+ # # kubelet 사용자 정의하기
186
+
187
+ kubelet을 사용자 정의하려면, `KubeletConfiguration`을 동일한 구성 파일 내에서 `---`로 구분된 `ClusterConfiguration`이나 `InitConfiguration` 다음에 추가하면
188
+ 된다. 그런 다음 `kubeadm init`에 해당 파일을 전달한다.
189
+
190
+ {{< note >}}
191
+ kubeadm은 클러스터의 모든 노드에 동일한 `KubeletConfiguration`을 적용한다. 노드별 설정을
192
+ 적용하려면 kubelet 플래그를 덮어쓰기(overrides)로 사용하여, `InitConfiguration` 및
193
+ ` JoinConfiguration` 모두에서 지원되는 `nodeRegistration.kubeletExtraArgs`에 전달할 수 있다.
194
+ 일부 kubelet 플래그는 더 이상 사용되지 않는다(deprecated). 따라서 사용하기 전에 [kubelet 참조 문서](/docs/reference/command-line-tools-reference/kubelet)를 통해
195
+ 상태를 확인해야 한다.
196
+ {{< /note >}}
197
+
198
+ 자세한 사항은 [kubeadm을 통해 클러스터의 각 kubelet 구성하기](/docs/setup/production-environment/tools/kubeadm/kubelet-integration)에서 살펴본다.
199
+
200
+ # # kube-proxy 사용자 정의하기
201
+
202
+ kube-proxy를 사용자 정의하려면, `KubeProxyConfiguration`을 `---`로 구분된 `ClusterConfiguration`이나 `InitConfiguration`
203
+ 다음에 두고 `kubeadm init`에 전달하면 된다.
204
+
205
+ 자세한 사항은 [API 참조 페이지](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3)에서 살펴볼 수 있다.
206
+
207
+ {{< note >}}
208
+ kubeadm은 kube-proxy를 {{< glossary_tooltip text="데몬셋" term_id="daemonset" >}}으로 배포한다. 이것은
209
+ ` KubeProxyConfiguration` 이 클러스터의 모든 kube-proxy 인스턴스에 적용된다는 것을 의미한다.
210
+ {{< /note >}}
0 commit comments