Skip to content

Commit dee445d

Browse files
authored
Merge pull request #30310 from bang9211/bang9211/setup-konnectivity/v0.1
[ko] Translate tasks/extend-kubernetes/setup-konnectivity.md in Korean
2 parents 6eb257f + ae23d6d commit dee445d

File tree

5 files changed

+259
-0
lines changed

5 files changed

+259
-0
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
---
2+
title: Konnectivity 서비스 설정
3+
content_type: task
4+
weight: 70
5+
---
6+
7+
<!-- overview -->
8+
9+
Konnectivity 서비스는 컨트롤 플레인에 클러스터 통신을 위한 TCP 수준 프록시를
10+
제공한다.
11+
12+
## {{% heading "prerequisites" %}}
13+
14+
{{< include "task-tutorial-prereqs.md" >}}
15+
16+
<!-- steps -->
17+
18+
## Konnectivity 서비스 설정
19+
20+
다음 단계에는 송신(egress) 설정이 필요하다. 예를 들면 다음과 같다.
21+
22+
{{< codenew file="admin/konnectivity/egress-selector-configuration.yaml" >}}
23+
24+
Konnectivity 서비스를 사용하고 네트워크 트래픽을 클러스터 노드로 보내도록
25+
API 서버를 구성해야 한다.
26+
27+
1. `ServiceAccountTokenVolumeProjection` [기능 게이트(feature gate)](/ko/docs/reference/command-line-tools-reference/feature-gates/)
28+
활성화되어 있는지
29+
확인한다. kube-apiserver에 다음과 같은 플래그를 제공하여
30+
[서비스 어카운트 토큰 볼륨 보호](/docs/tasks/configure-pod-container/configure-service-account/#service-account-token-volume-projection)
31+
활성화할 수 있다.
32+
```
33+
--service-account-issuer=api
34+
--service-account-signing-key-file=/etc/kubernetes/pki/sa.key
35+
--api-audiences=system:konnectivity-server
36+
```
37+
1. `admin/konnectivity/egress-selector-configuration.yaml`과 같은 송신 구성 파일을 생성한다.
38+
1. API 서버의 `--egress-selector-config-file` 플래그를
39+
API 서버 송신 구성 파일의 경로로 설정한다.
40+
1. UDS 연결을 사용하는 경우 kube-apiserver에 볼륨 구성을 추가한다.
41+
```yaml
42+
spec:
43+
containers:
44+
volumeMounts:
45+
- name: konnectivity-uds
46+
mountPath: /etc/kubernetes/konnectivity-server
47+
readOnly: false
48+
volumes:
49+
- name: konnectivity-uds
50+
hostPath:
51+
path: /etc/kubernetes/konnectivity-server
52+
type: DirectoryOrCreate
53+
```
54+
55+
konnectivity-server에 대한 인증서 및 kubeconfig를 생성하거나 얻는다.
56+
예를 들어 OpenSSL 커맨드라인 툴을 사용하여 컨트롤 플레인 호스트에서
57+
클러스터 CA 인증서 `/etc/kubernetes/pki/ca.crt`를 사용하여 X.509 인증서를 발급할 수 있다.
58+
59+
```bash
60+
openssl req -subj "/CN=system:konnectivity-server" -new -newkey rsa:2048 -nodes -out konnectivity.csr -keyout konnectivity.key -out konnectivity.csr
61+
openssl x509 -req -in konnectivity.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out konnectivity.crt -days 375 -sha256
62+
SERVER=$(kubectl config view -o jsonpath='{.clusters..server}')
63+
kubectl --kubeconfig /etc/kubernetes/konnectivity-server.conf config set-credentials system:konnectivity-server --client-certificate konnectivity.crt --client-key konnectivity.key --embed-certs=true
64+
kubectl --kubeconfig /etc/kubernetes/konnectivity-server.conf config set-cluster kubernetes --server "$SERVER" --certificate-authority /etc/kubernetes/pki/ca.crt --embed-certs=true
65+
kubectl --kubeconfig /etc/kubernetes/konnectivity-server.conf config set-context system:konnectivity-server@kubernetes --cluster kubernetes --user system:konnectivity-server
66+
kubectl --kubeconfig /etc/kubernetes/konnectivity-server.conf config use-context system:konnectivity-server@kubernetes
67+
rm -f konnectivity.crt konnectivity.key konnectivity.csr
68+
```
69+
70+
다음으로 Konnectivity 서버와 에이전트를 배포해야 한다.
71+
[kubernetes-sigs/apiserver-network-proxy](https://github.com/kubernetes-sigs/apiserver-network-proxy)에서
72+
구현을 참조할 수 있다.
73+
74+
컨트롤 플레인 노드에 Konnectivity 서버를 배포한다. 제공된
75+
`konnectivity-server.yaml` 매니페스트는
76+
쿠버네티스 구성 요소가 클러스터에 {{< glossary_tooltip text="스태틱 파드(static Pod)"
77+
term_id="static-pod" >}}로 배포되었다고 가정한다. 그렇지 않은 경우에는 Konnectivity
78+
서버를 데몬셋(DaemonSet)으로 배포할 수 있다.
79+
80+
{{< codenew file="admin/konnectivity/konnectivity-server.yaml" >}}
81+
82+
그런 다음 클러스터에 Konnectivity 에이전트를 배포한다.
83+
84+
{{< codenew file="admin/konnectivity/konnectivity-agent.yaml" >}}
85+
86+
마지막으로 클러스터에서 RBAC가 활성화된 경우 관련 RBAC 규칙을 생성한다.
87+
88+
{{< codenew file="admin/konnectivity/konnectivity-rbac.yaml" >}}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
apiVersion: apiserver.k8s.io/v1beta1
2+
kind: EgressSelectorConfiguration
3+
egressSelections:
4+
# 클러스터에 대한 송신(egress) 트래픽을 제어하기 위해
5+
# "cluster"를 name으로 사용한다. 기타 지원되는 값은 "etcd" 및 "master"이다.
6+
- name: cluster
7+
connection:
8+
# API 서버와 Konnectivity 서버 간의 프로토콜을
9+
# 제어한다. 지원되는 값은 "GRPC" 및 "HTTPConnect"이다. 두 모드 간에
10+
# 최종 사용자가 볼 수 있는 차이점은 없다. 동일한 모드에서 작동하도록
11+
# Konnectivity 서버를 설정해야 한다.
12+
proxyProtocol: GRPC
13+
transport:
14+
# API 서버가 Konnectivity 서버와 통신하는 데 사용하는
15+
# transport를 제어한다. Konnectivity 서버가 API 서버와 동일한 시스템에
16+
# 있는 경우 UDS를 사용하는 것이 좋다. 동일한 UDS 소켓에서
17+
# 수신 대기하도록 Konnectivity 서버를 구성해야 한다.
18+
# 지원되는 다른 전송은 "tcp"이다. TCP 전송을 보호하려면 TLS 구성을 설정해야 한다.
19+
uds:
20+
udsName: /etc/kubernetes/konnectivity-server/konnectivity-server.socket
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
apiVersion: apps/v1
2+
# 에이전트를 Deployment(디플로이먼트)로 배포할 수도 있다. 각 노드에 에이전트가
3+
# 있을 필요는 없다.
4+
kind: DaemonSet
5+
metadata:
6+
labels:
7+
addonmanager.kubernetes.io/mode: Reconcile
8+
k8s-app: konnectivity-agent
9+
namespace: kube-system
10+
name: konnectivity-agent
11+
spec:
12+
selector:
13+
matchLabels:
14+
k8s-app: konnectivity-agent
15+
template:
16+
metadata:
17+
labels:
18+
k8s-app: konnectivity-agent
19+
spec:
20+
priorityClassName: system-cluster-critical
21+
tolerations:
22+
- key: "CriticalAddonsOnly"
23+
operator: "Exists"
24+
containers:
25+
- image: us.gcr.io/k8s-artifacts-prod/kas-network-proxy/proxy-agent:v0.0.16
26+
name: konnectivity-agent
27+
command: ["/proxy-agent"]
28+
args: [
29+
"--logtostderr=true",
30+
"--ca-cert=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt",
31+
# konnectivity 서버는 hostNetwork=true로 실행되기 때문에,
32+
# 이것은 마스터 머신의 IP 주소이다.
33+
"--proxy-server-host=35.225.206.7",
34+
"--proxy-server-port=8132",
35+
"--admin-server-port=8133",
36+
"--health-server-port=8134",
37+
"--service-account-token-path=/var/run/secrets/tokens/konnectivity-agent-token"
38+
]
39+
volumeMounts:
40+
- mountPath: /var/run/secrets/tokens
41+
name: konnectivity-agent-token
42+
livenessProbe:
43+
httpGet:
44+
port: 8134
45+
path: /healthz
46+
initialDelaySeconds: 15
47+
timeoutSeconds: 15
48+
serviceAccountName: konnectivity-agent
49+
volumes:
50+
- name: konnectivity-agent-token
51+
projected:
52+
sources:
53+
- serviceAccountToken:
54+
path: konnectivity-agent-token
55+
audience: system:konnectivity-server
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
apiVersion: rbac.authorization.k8s.io/v1
2+
kind: ClusterRoleBinding
3+
metadata:
4+
name: system:konnectivity-server
5+
labels:
6+
kubernetes.io/cluster-service: "true"
7+
addonmanager.kubernetes.io/mode: Reconcile
8+
roleRef:
9+
apiGroup: rbac.authorization.k8s.io
10+
kind: ClusterRole
11+
name: system:auth-delegator
12+
subjects:
13+
- apiGroup: rbac.authorization.k8s.io
14+
kind: User
15+
name: system:konnectivity-server
16+
---
17+
apiVersion: v1
18+
kind: ServiceAccount
19+
metadata:
20+
name: konnectivity-agent
21+
namespace: kube-system
22+
labels:
23+
kubernetes.io/cluster-service: "true"
24+
addonmanager.kubernetes.io/mode: Reconcile
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
apiVersion: v1
2+
kind: Pod
3+
metadata:
4+
name: konnectivity-server
5+
namespace: kube-system
6+
spec:
7+
priorityClassName: system-cluster-critical
8+
hostNetwork: true
9+
containers:
10+
- name: konnectivity-server-container
11+
image: us.gcr.io/k8s-artifacts-prod/kas-network-proxy/proxy-server:v0.0.16
12+
command: ["/proxy-server"]
13+
args: [
14+
"--logtostderr=true",
15+
# 이것은 egressSelectorConfiguration에 설정된 값과 일치해야 한다.
16+
"--uds-name=/etc/kubernetes/konnectivity-server/konnectivity-server.socket",
17+
# 다음 두 줄은 Konnectivity 서버가 apiserver와
18+
# 동일한 시스템에 배포되고 API 서버의 인증서와
19+
# 키가 지정된 위치에 있다고 가정한다.
20+
"--cluster-cert=/etc/kubernetes/pki/apiserver.crt",
21+
"--cluster-key=/etc/kubernetes/pki/apiserver.key",
22+
# 이것은 egressSelectorConfiguration에 설정된 값과 일치해야 한다.
23+
"--mode=grpc",
24+
"--server-port=0",
25+
"--agent-port=8132",
26+
"--admin-port=8133",
27+
"--health-port=8134",
28+
"--agent-namespace=kube-system",
29+
"--agent-service-account=konnectivity-agent",
30+
"--kubeconfig=/etc/kubernetes/konnectivity-server.conf",
31+
"--authentication-audience=system:konnectivity-server"
32+
]
33+
livenessProbe:
34+
httpGet:
35+
scheme: HTTP
36+
host: 127.0.0.1
37+
port: 8134
38+
path: /healthz
39+
initialDelaySeconds: 30
40+
timeoutSeconds: 60
41+
ports:
42+
- name: agentport
43+
containerPort: 8132
44+
hostPort: 8132
45+
- name: adminport
46+
containerPort: 8133
47+
hostPort: 8133
48+
- name: healthport
49+
containerPort: 8134
50+
hostPort: 8134
51+
volumeMounts:
52+
- name: k8s-certs
53+
mountPath: /etc/kubernetes/pki
54+
readOnly: true
55+
- name: kubeconfig
56+
mountPath: /etc/kubernetes/konnectivity-server.conf
57+
readOnly: true
58+
- name: konnectivity-uds
59+
mountPath: /etc/kubernetes/konnectivity-server
60+
readOnly: false
61+
volumes:
62+
- name: k8s-certs
63+
hostPath:
64+
path: /etc/kubernetes/pki
65+
- name: kubeconfig
66+
hostPath:
67+
path: /etc/kubernetes/konnectivity-server.conf
68+
type: FileOrCreate
69+
- name: konnectivity-uds
70+
hostPath:
71+
path: /etc/kubernetes/konnectivity-server
72+
type: DirectoryOrCreate

0 commit comments

Comments
 (0)