From ae23d6d49236589162b69247e9b47a288ea8277d Mon Sep 17 00:00:00 2001 From: bang9211 Date: Mon, 1 Nov 2021 10:49:13 +0900 Subject: [PATCH] Translate tasks/extend-kubernetes/setup-konnectivity.md in Korean --- .../extend-kubernetes/setup-konnectivity.md | 88 +++++++++++++++++++ .../egress-selector-configuration.yaml | 20 +++++ .../konnectivity/konnectivity-agent.yaml | 55 ++++++++++++ .../admin/konnectivity/konnectivity-rbac.yaml | 24 +++++ .../konnectivity/konnectivity-server.yaml | 72 +++++++++++++++ 5 files changed, 259 insertions(+) create mode 100644 content/ko/docs/tasks/extend-kubernetes/setup-konnectivity.md create mode 100644 content/ko/examples/admin/konnectivity/egress-selector-configuration.yaml create mode 100644 content/ko/examples/admin/konnectivity/konnectivity-agent.yaml create mode 100644 content/ko/examples/admin/konnectivity/konnectivity-rbac.yaml create mode 100644 content/ko/examples/admin/konnectivity/konnectivity-server.yaml diff --git a/content/ko/docs/tasks/extend-kubernetes/setup-konnectivity.md b/content/ko/docs/tasks/extend-kubernetes/setup-konnectivity.md new file mode 100644 index 0000000000..fdf671a52a --- /dev/null +++ b/content/ko/docs/tasks/extend-kubernetes/setup-konnectivity.md @@ -0,0 +1,88 @@ +--- +title: Konnectivity 서비스 설정 +content_type: task +weight: 70 +--- + + + +Konnectivity 서비스는 컨트롤 플레인에 클러스터 통신을 위한 TCP 수준 프록시를 +제공한다. + +## {{% heading "prerequisites" %}} + +{{< include "task-tutorial-prereqs.md" >}} + + + +## Konnectivity 서비스 설정 + +다음 단계에는 송신(egress) 설정이 필요하다. 예를 들면 다음과 같다. + +{{< codenew file="admin/konnectivity/egress-selector-configuration.yaml" >}} + +Konnectivity 서비스를 사용하고 네트워크 트래픽을 클러스터 노드로 보내도록 +API 서버를 구성해야 한다. + +1. `ServiceAccountTokenVolumeProjection` [기능 게이트(feature gate)](/ko/docs/reference/command-line-tools-reference/feature-gates/)가 +활성화되어 있는지 +확인한다. kube-apiserver에 다음과 같은 플래그를 제공하여 +[서비스 어카운트 토큰 볼륨 보호](/docs/tasks/configure-pod-container/configure-service-account/#service-account-token-volume-projection)를 +활성화할 수 있다. + ``` + --service-account-issuer=api + --service-account-signing-key-file=/etc/kubernetes/pki/sa.key + --api-audiences=system:konnectivity-server + ``` +1. `admin/konnectivity/egress-selector-configuration.yaml`과 같은 송신 구성 파일을 생성한다. +1. API 서버의 `--egress-selector-config-file` 플래그를 +API 서버 송신 구성 파일의 경로로 설정한다. +1. UDS 연결을 사용하는 경우 kube-apiserver에 볼륨 구성을 추가한다. + ```yaml + spec: + containers: + volumeMounts: + - name: konnectivity-uds + mountPath: /etc/kubernetes/konnectivity-server + readOnly: false + volumes: + - name: konnectivity-uds + hostPath: + path: /etc/kubernetes/konnectivity-server + type: DirectoryOrCreate + ``` + +konnectivity-server에 대한 인증서 및 kubeconfig를 생성하거나 얻는다. +예를 들어 OpenSSL 커맨드라인 툴을 사용하여 컨트롤 플레인 호스트에서 +클러스터 CA 인증서 `/etc/kubernetes/pki/ca.crt`를 사용하여 X.509 인증서를 발급할 수 있다. + +```bash +openssl req -subj "/CN=system:konnectivity-server" -new -newkey rsa:2048 -nodes -out konnectivity.csr -keyout konnectivity.key -out konnectivity.csr +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 +SERVER=$(kubectl config view -o jsonpath='{.clusters..server}') +kubectl --kubeconfig /etc/kubernetes/konnectivity-server.conf config set-credentials system:konnectivity-server --client-certificate konnectivity.crt --client-key konnectivity.key --embed-certs=true +kubectl --kubeconfig /etc/kubernetes/konnectivity-server.conf config set-cluster kubernetes --server "$SERVER" --certificate-authority /etc/kubernetes/pki/ca.crt --embed-certs=true +kubectl --kubeconfig /etc/kubernetes/konnectivity-server.conf config set-context system:konnectivity-server@kubernetes --cluster kubernetes --user system:konnectivity-server +kubectl --kubeconfig /etc/kubernetes/konnectivity-server.conf config use-context system:konnectivity-server@kubernetes +rm -f konnectivity.crt konnectivity.key konnectivity.csr +``` + +다음으로 Konnectivity 서버와 에이전트를 배포해야 한다. +[kubernetes-sigs/apiserver-network-proxy](https://github.com/kubernetes-sigs/apiserver-network-proxy)에서 +구현을 참조할 수 있다. + +컨트롤 플레인 노드에 Konnectivity 서버를 배포한다. 제공된 +`konnectivity-server.yaml` 매니페스트는 +쿠버네티스 구성 요소가 클러스터에 {{< glossary_tooltip text="스태틱 파드(static Pod)" +term_id="static-pod" >}}로 배포되었다고 가정한다. 그렇지 않은 경우에는 Konnectivity +서버를 데몬셋(DaemonSet)으로 배포할 수 있다. + +{{< codenew file="admin/konnectivity/konnectivity-server.yaml" >}} + +그런 다음 클러스터에 Konnectivity 에이전트를 배포한다. + +{{< codenew file="admin/konnectivity/konnectivity-agent.yaml" >}} + +마지막으로 클러스터에서 RBAC가 활성화된 경우 관련 RBAC 규칙을 생성한다. + +{{< codenew file="admin/konnectivity/konnectivity-rbac.yaml" >}} diff --git a/content/ko/examples/admin/konnectivity/egress-selector-configuration.yaml b/content/ko/examples/admin/konnectivity/egress-selector-configuration.yaml new file mode 100644 index 0000000000..ca19321d80 --- /dev/null +++ b/content/ko/examples/admin/konnectivity/egress-selector-configuration.yaml @@ -0,0 +1,20 @@ +apiVersion: apiserver.k8s.io/v1beta1 +kind: EgressSelectorConfiguration +egressSelections: +# 클러스터에 대한 송신(egress) 트래픽을 제어하기 위해 +# "cluster"를 name으로 사용한다. 기타 지원되는 값은 "etcd" 및 "master"이다. +- name: cluster + connection: + # API 서버와 Konnectivity 서버 간의 프로토콜을 + # 제어한다. 지원되는 값은 "GRPC" 및 "HTTPConnect"이다. 두 모드 간에 + # 최종 사용자가 볼 수 있는 차이점은 없다. 동일한 모드에서 작동하도록 + # Konnectivity 서버를 설정해야 한다. + proxyProtocol: GRPC + transport: + # API 서버가 Konnectivity 서버와 통신하는 데 사용하는 + # transport를 제어한다. Konnectivity 서버가 API 서버와 동일한 시스템에 + # 있는 경우 UDS를 사용하는 것이 좋다. 동일한 UDS 소켓에서 + # 수신 대기하도록 Konnectivity 서버를 구성해야 한다. + # 지원되는 다른 전송은 "tcp"이다. TCP 전송을 보호하려면 TLS 구성을 설정해야 한다. + uds: + udsName: /etc/kubernetes/konnectivity-server/konnectivity-server.socket diff --git a/content/ko/examples/admin/konnectivity/konnectivity-agent.yaml b/content/ko/examples/admin/konnectivity/konnectivity-agent.yaml new file mode 100644 index 0000000000..19430460f5 --- /dev/null +++ b/content/ko/examples/admin/konnectivity/konnectivity-agent.yaml @@ -0,0 +1,55 @@ +apiVersion: apps/v1 +# 에이전트를 Deployment(디플로이먼트)로 배포할 수도 있다. 각 노드에 에이전트가 +# 있을 필요는 없다. +kind: DaemonSet +metadata: + labels: + addonmanager.kubernetes.io/mode: Reconcile + k8s-app: konnectivity-agent + namespace: kube-system + name: konnectivity-agent +spec: + selector: + matchLabels: + k8s-app: konnectivity-agent + template: + metadata: + labels: + k8s-app: konnectivity-agent + spec: + priorityClassName: system-cluster-critical + tolerations: + - key: "CriticalAddonsOnly" + operator: "Exists" + containers: + - image: us.gcr.io/k8s-artifacts-prod/kas-network-proxy/proxy-agent:v0.0.16 + name: konnectivity-agent + command: ["/proxy-agent"] + args: [ + "--logtostderr=true", + "--ca-cert=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt", + # konnectivity 서버는 hostNetwork=true로 실행되기 때문에, + # 이것은 마스터 머신의 IP 주소이다. + "--proxy-server-host=35.225.206.7", + "--proxy-server-port=8132", + "--admin-server-port=8133", + "--health-server-port=8134", + "--service-account-token-path=/var/run/secrets/tokens/konnectivity-agent-token" + ] + volumeMounts: + - mountPath: /var/run/secrets/tokens + name: konnectivity-agent-token + livenessProbe: + httpGet: + port: 8134 + path: /healthz + initialDelaySeconds: 15 + timeoutSeconds: 15 + serviceAccountName: konnectivity-agent + volumes: + - name: konnectivity-agent-token + projected: + sources: + - serviceAccountToken: + path: konnectivity-agent-token + audience: system:konnectivity-server diff --git a/content/ko/examples/admin/konnectivity/konnectivity-rbac.yaml b/content/ko/examples/admin/konnectivity/konnectivity-rbac.yaml new file mode 100644 index 0000000000..7687f49b77 --- /dev/null +++ b/content/ko/examples/admin/konnectivity/konnectivity-rbac.yaml @@ -0,0 +1,24 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: system:konnectivity-server + labels: + kubernetes.io/cluster-service: "true" + addonmanager.kubernetes.io/mode: Reconcile +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:auth-delegator +subjects: + - apiGroup: rbac.authorization.k8s.io + kind: User + name: system:konnectivity-server +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: konnectivity-agent + namespace: kube-system + labels: + kubernetes.io/cluster-service: "true" + addonmanager.kubernetes.io/mode: Reconcile diff --git a/content/ko/examples/admin/konnectivity/konnectivity-server.yaml b/content/ko/examples/admin/konnectivity/konnectivity-server.yaml new file mode 100644 index 0000000000..8d8ef56195 --- /dev/null +++ b/content/ko/examples/admin/konnectivity/konnectivity-server.yaml @@ -0,0 +1,72 @@ +apiVersion: v1 +kind: Pod +metadata: + name: konnectivity-server + namespace: kube-system +spec: + priorityClassName: system-cluster-critical + hostNetwork: true + containers: + - name: konnectivity-server-container + image: us.gcr.io/k8s-artifacts-prod/kas-network-proxy/proxy-server:v0.0.16 + command: ["/proxy-server"] + args: [ + "--logtostderr=true", + # 이것은 egressSelectorConfiguration에 설정된 값과 일치해야 한다. + "--uds-name=/etc/kubernetes/konnectivity-server/konnectivity-server.socket", + # 다음 두 줄은 Konnectivity 서버가 apiserver와 + # 동일한 시스템에 배포되고 API 서버의 인증서와 + # 키가 지정된 위치에 있다고 가정한다. + "--cluster-cert=/etc/kubernetes/pki/apiserver.crt", + "--cluster-key=/etc/kubernetes/pki/apiserver.key", + # 이것은 egressSelectorConfiguration에 설정된 값과 일치해야 한다. + "--mode=grpc", + "--server-port=0", + "--agent-port=8132", + "--admin-port=8133", + "--health-port=8134", + "--agent-namespace=kube-system", + "--agent-service-account=konnectivity-agent", + "--kubeconfig=/etc/kubernetes/konnectivity-server.conf", + "--authentication-audience=system:konnectivity-server" + ] + livenessProbe: + httpGet: + scheme: HTTP + host: 127.0.0.1 + port: 8134 + path: /healthz + initialDelaySeconds: 30 + timeoutSeconds: 60 + ports: + - name: agentport + containerPort: 8132 + hostPort: 8132 + - name: adminport + containerPort: 8133 + hostPort: 8133 + - name: healthport + containerPort: 8134 + hostPort: 8134 + volumeMounts: + - name: k8s-certs + mountPath: /etc/kubernetes/pki + readOnly: true + - name: kubeconfig + mountPath: /etc/kubernetes/konnectivity-server.conf + readOnly: true + - name: konnectivity-uds + mountPath: /etc/kubernetes/konnectivity-server + readOnly: false + volumes: + - name: k8s-certs + hostPath: + path: /etc/kubernetes/pki + - name: kubeconfig + hostPath: + path: /etc/kubernetes/konnectivity-server.conf + type: FileOrCreate + - name: konnectivity-uds + hostPath: + path: /etc/kubernetes/konnectivity-server + type: DirectoryOrCreate