Merge pull request #30310 from bang9211/bang9211/setup-konnectivity/v0.1
[ko] Translate tasks/extend-kubernetes/setup-konnectivity.md in Koreanpull/30412/head
commit
dee445dded
|
@ -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
|
Loading…
Reference in New Issue