Merge pull request #30310 from bang9211/bang9211/setup-konnectivity/v0.1
[ko] Translate tasks/extend-kubernetes/setup-konnectivity.md in Korean
This commit is contained in:
@@ -0,0 +1,88 @@
|
|||||||
|
---
|
||||||
|
title: Konnectivity 서비스 설정
|
||||||
|
content_type: task
|
||||||
|
weight: 70
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- overview -->
|
||||||
|
|
||||||
|
Konnectivity 서비스는 컨트롤 플레인에 클러스터 통신을 위한 TCP 수준 프록시를
|
||||||
|
제공한다.
|
||||||
|
|
||||||
|
## {{% heading "prerequisites" %}}
|
||||||
|
|
||||||
|
{{< include "task-tutorial-prereqs.md" >}}
|
||||||
|
|
||||||
|
<!-- steps -->
|
||||||
|
|
||||||
|
## 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" >}}
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
Reference in New Issue
Block a user