쿠버네티스 클러스터 설정하기

쿠버네티스 클러스터 설정하기

이 모듈에서는 Istio가 설치된 쿠버네티스 클러스터와, 튜토리얼 내내 사용할 네임스페이스를 설정하는 방법을 배워요.

출처: Istio 문서

본문

이 모듈에서는 Istio가 설치된 쿠버네티스 클러스터와, 튜토리얼 내내 사용할 네임스페이스를 설정해요.

  1. 쿠버네티스 클러스터에 접근할 수 있는지 확인하세요. Google Kubernetes Engine이나 IBM Cloud Kubernetes Service를 사용할 수 있어요.
  2. 튜토리얼 명령을 실행할 때 사용할 네임스페이스 이름을 저장할 환경 변수를 만드세요. 아무 이름이나 쓸 수 있어요(예: tutorial).
$ export NAMESPACE=tutorial
  1. 네임스페이스를 생성하세요.
$ kubectl create namespace $NAMESPACE

강사라면 참가자마다 별도의 네임스페이스를 할당해야 해요. 튜토리얼은 여러 참가자가 여러 네임스페이스에서 동시에 작업할 수 있게 지원해요.

  1. demo 프로필을 사용해 Istio를 설치하세요.
  2. 이 예제에서는 Kiali와 Prometheus 애드온이 사용되므로 설치해야 해요. 모든 애드온은 다음 명령으로 설치해요.
$ kubectl apply -f @samples/addons@

애드온 설치 중 오류가 있으면 명령을 다시 실행해 보세요. 타이밍 문제가 있을 수 있는데 명령을 다시 실행하면 해결될 거예요.

  1. 다음 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
  1. 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
  1. 참가자별로 서비스 어카운트를 생성하세요.
$ kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: ${NAMESPACE}-user
  namespace: $NAMESPACE
EOF
  1. 각 참가자의 권한을 제한하세요. 튜토리얼 동안 참가자는 자신의 네임스페이스에서 리소스를 만들고 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
  1. 각 참가자는 자신의 쿠버네티스 구성 파일을 사용해야 해요. 이 구성 파일은 클러스터 세부 정보, 서비스 어카운트, 자격 증명, 참가자의 네임스페이스를 지정해요. 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
  1. ${NAMESPACE}-user-config.yaml 구성 파일을 위해 KUBECONFIG 환경 변수를 설정하세요.
$ export KUBECONFIG=$PWD/${NAMESPACE}-user-config.yaml
  1. 현재 네임스페이스를 출력해서 구성이 적용됐는지 확인하세요.
$ kubectl config view -o jsonpath="{.contexts[?(@.name==\"$(kubectl config current-context)\")].context.namespace}"
tutorial

출력에서 네임스페이스 이름이 보여야 해요.

  1. 클러스터를 직접 설정하는 경우, 앞선 단계에서 언급한 ${NAMESPACE}-user-config.yaml 파일(여기서 ${NAMESPACE}는 앞선 단계에서 지정한 네임스페이스 이름, 예: tutorial-user-config.yaml)을 로컬 컴퓨터로 복사하세요. 이 파일은 튜토리얼 뒷부분에서 필요해요. 강사라면 생성된 구성 파일을 각 참가자에게 보내세요. 참가자들은 자신의 구성 파일을 로컬 컴퓨터로 복사해야 해요.

축하합니다, 튜토리얼을 위한 클러스터를 설정했어요!

이제 로컬 컴퓨터 설정하기로 넘어갈 준비가 됐어요.

더 알아보기 (Learn more)