쿠버네티스 클러스터 설정하기
쿠버네티스 클러스터 설정하기
이 모듈에서는 Istio가 설치된 쿠버네티스 클러스터와, 튜토리얼 내내 사용할 네임스페이스를 설정하는 방법을 배워요.
출처: Istio 문서
본문
이 모듈에서는 Istio가 설치된 쿠버네티스 클러스터와, 튜토리얼 내내 사용할 네임스페이스를 설정해요.
- 쿠버네티스 클러스터에 접근할 수 있는지 확인하세요. Google Kubernetes Engine이나 IBM Cloud Kubernetes Service를 사용할 수 있어요.
- 튜토리얼 명령을 실행할 때 사용할 네임스페이스 이름을 저장할 환경 변수를 만드세요. 아무 이름이나 쓸 수 있어요(예:
tutorial).
$ export NAMESPACE=tutorial
- 네임스페이스를 생성하세요.
$ kubectl create namespace $NAMESPACE
강사라면 참가자마다 별도의 네임스페이스를 할당해야 해요. 튜토리얼은 여러 참가자가 여러 네임스페이스에서 동시에 작업할 수 있게 지원해요.
- demo 프로필을 사용해 Istio를 설치하세요.
- 이 예제에서는 Kiali와 Prometheus 애드온이 사용되므로 설치해야 해요. 모든 애드온은 다음 명령으로 설치해요.
$ kubectl apply -f @samples/addons@
애드온 설치 중 오류가 있으면 명령을 다시 실행해 보세요. 타이밍 문제가 있을 수 있는데 명령을 다시 실행하면 해결될 거예요.
- 다음 kubectl 명령을 사용해 이 일반적인 Istio 서비스들(Grafana, Jaeger, Prometheus, Kiali)을 위한 Kubernetes Ingress 리소스를 생성하세요. 튜토리얼의 이 시점에서 각 서비스에 익숙할 필요는 없어요. kubectl 명령은 인라인 구성을 받아 각 서비스의 Ingress 리소스를 만들 수 있어요.
$ kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: istio-system
namespace: istio-system
annotations:
kubernetes.io/ingress.class: istio
spec:
rules:
- host: my-istio-dashboard.io
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: grafana
port:
number: 3000
- host: my-istio-tracing.io
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tracing
port:
number: 9411
- host: my-istio-logs-database.io
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: prometheus
port:
number: 9090
- host: my-kiali.io
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kiali
port:
number: 20001
EOF
- istio-system 네임스페이스에 읽기 접근을 제공하는 롤을 생성하세요. 이 롤은 아래 단계에서 참가자들의 권한을 제한하는 데 필요해요.
$ kubectl apply -f - <<EOF
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: istio-system-access
namespace: istio-system
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["*"]
verbs: ["get", "list"]
EOF
- 참가자별로 서비스 어카운트를 생성하세요.
$ kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: ${NAMESPACE}-user
namespace: $NAMESPACE
EOF
- 각 참가자의 권한을 제한하세요. 튜토리얼 동안 참가자는 자신의 네임스페이스에서 리소스를 만들고 istio-system 네임스페이스에서 리소스를 읽기만 하면 돼요. 자체 클러스터를 사용하더라도 클러스터의 다른 네임스페이스와 간섭하지 않도록 하는 것이 좋은 관행이에요. 각 참가자의 네임스페이스에 읽기-쓰기 접근을 허용하는 롤을 만들고, 참가자의 서비스 어카운트를 이 롤과 istio-system 리소스를 읽는 롤에 바인딩하세요.
$ kubectl apply -f - <<EOF
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: ${NAMESPACE}-access
namespace: $NAMESPACE
rules:
- apiGroups: ["", "extensions", "apps", "networking.k8s.io", "networking.istio.io", "authentication.istio.io",
"rbac.istio.io", "config.istio.io", "security.istio.io"]
resources: ["*"]
verbs: ["*"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: ${NAMESPACE}-access
namespace: $NAMESPACE
subjects:
- kind: ServiceAccount
name: ${NAMESPACE}-user
namespace: $NAMESPACE
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: ${NAMESPACE}-access
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: ${NAMESPACE}-istio-system-access
namespace: istio-system
subjects:
- kind: ServiceAccount
name: ${NAMESPACE}-user
namespace: $NAMESPACE
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: istio-system-access
EOF
- 각 참가자는 자신의 쿠버네티스 구성 파일을 사용해야 해요. 이 구성 파일은 클러스터 세부 정보, 서비스 어카운트, 자격 증명, 참가자의 네임스페이스를 지정해요. kubectl 명령은 이 구성 파일을 사용해 클러스터에서 작업해요. 각 참가자에 대한 쿠버네티스 구성 파일을 생성하세요. 이 명령은 클러스터 이름이 tutorial-cluster라고 가정해요. 클러스터 이름이 다르다면 모든 참조를 클러스터 이름으로 바꾸세요.
$ cat <<EOF > ./${NAMESPACE}-user-config.yaml
apiVersion: v1
kind: Config
preferences: {}
clusters:
- cluster:
certificate-authority-data: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath='{.data.ca\.crt}')
server: $(kubectl config view -o jsonpath="{.clusters[?(.name==\"$(kubectl config view -o jsonpath=\"{.contexts[?(.name==\"$(kubectl config current-context)\")].context.cluster}\")\")].cluster.server}")
name: ${NAMESPACE}-cluster
users:
- name: ${NAMESPACE}-user
user:
as-user-extra: {}
client-key-data: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath='{.data.ca\.crt}')
token: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath={.data.token} | base64 --decode)
contexts:
- context:
cluster: ${NAMESPACE}-cluster
namespace: ${NAMESPACE}
user: ${NAMESPACE}-user
name: ${NAMESPACE}
current-context: ${NAMESPACE}
EOF
${NAMESPACE}-user-config.yaml구성 파일을 위해 KUBECONFIG 환경 변수를 설정하세요.
$ export KUBECONFIG=$PWD/${NAMESPACE}-user-config.yaml
- 현재 네임스페이스를 출력해서 구성이 적용됐는지 확인하세요.
$ kubectl config view -o jsonpath="{.contexts[?(@.name==\"$(kubectl config current-context)\")].context.namespace}"
tutorial
출력에서 네임스페이스 이름이 보여야 해요.
- 클러스터를 직접 설정하는 경우, 앞선 단계에서 언급한
${NAMESPACE}-user-config.yaml파일(여기서${NAMESPACE}는 앞선 단계에서 지정한 네임스페이스 이름, 예:tutorial-user-config.yaml)을 로컬 컴퓨터로 복사하세요. 이 파일은 튜토리얼 뒷부분에서 필요해요. 강사라면 생성된 구성 파일을 각 참가자에게 보내세요. 참가자들은 자신의 구성 파일을 로컬 컴퓨터로 복사해야 해요.
축하합니다, 튜토리얼을 위한 클러스터를 설정했어요!
이제 로컬 컴퓨터 설정하기로 넘어갈 준비가 됐어요.