티스토리 뷰

728x90
반응형

개요

Kubernetes는 Cluster, User, Namespace를 조합한 Context라는 오브젝트를 제공한다. Context는 독립적인 단위로 흔히 우리가 생각하는 클러스터를 Context 단위로 볼 수도 있지만, 사실 그보다 더 세분화된 단위라고 볼 수 있다. 이번 포스팅에서는 멀티 Cluster 환경에 각 클러스터에 보다 빠르게 접근하여 변경을 관리할 수 있는 Context 적용 방법에 대해 알아보도록 하자.


멀티 클러스터 접근 구성

Kubernetes 클러스터를 처음 설정할 때 $HOME/.kube 디렉토리에 config 파일이 생성된다. config 파일은 우리가 흔히 이야기 하는 kubeconfig 파일이며, Kubernetes 클러스터와의 연결에 대한 정보를 저장하는데 사용된다. kubectl을 사용하여 명령을 실행하면 이 kubeconfig 파일을 통해 연결 정보를 얻어 온다.

kubeconfig 파일에는 클러스터 정보를 포함하여 user id/pw, 인증서 또는 token과 같은 인증 정보와 context를 함께 저장한다. context는 앞서 정의를 내렸지만, 클러스터 액세스 정보를 그룹화한 것이라 할 수 있다. 따라서 context에는 cluster, user 및 namespace가 포함된다.

앞서 언급한데로 Context는 Cluster와 비슷한 개념으로 동작하지만, Cluster 내에 User와 Namespace를 기준으로 여러 Context로 구분하여 관리도 가능하다. 즉 NRSON-EKS-CLUSTER내에 여러개의 Context를 생성하고, User별로 접근 권한을 분리하여, 하나의 Cluster를 여러개의 논리적인 Cluster로 동작하게 관리할 수 있다.


1. 사전준비 구성

멀티 클러스터를 테스트하기 위해 아래와 같이 AWS EKS와 MINIKUBE를 사전 구성해 둔 상태로 context 테스트를 진행한다.

[AWS EKS]
[root@ip-192-168-78-195 ~]# kubectl config get-contexts
CURRENT   NAME                                                          CLUSTER                                      AUTHINFO                                                      NAMESPACE
*         iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   
[root@ip-192-168-78-195 ~]#

[MINIKUBE]
[root@ip-192-168-84-159 ~]# kubectl config get-contexts
CURRENT   NAME                                                          CLUSTER                                      AUTHINFO                                                      NAMESPACE
*         minikube                                                      minikube                                     minikube                                                      default
[root@ip-192-168-84-159 ~]#

2. kubeconfig 복사

kubenetes는 클러스터 구축 시점에 ~/.kube/config 파일을 생성한다. multi cluster 환경에서 각각 생성된 파일을 아래와 같이 kubeconfig2라는 파일이름으로 복사한다.

[root@ip-192-168-78-195 .kube]# ls -al
total 36
drwxr-xr-x  4 root root   131 Feb 25 19:59 .
dr-xr-x--- 12 root root   323 Feb 25 19:57 ..
drwxr-x---  3 root root    23 Jan 25 07:30 cache
-rw-------  1 root root  2330 Feb 25 19:59 config
-rw-------  1 root root     0 Jan 25 07:24 config.eksctl.lock
drwxr-x---  3 root root 16384 Feb 25 20:17 http-cache
-rw-r--r--  1 root root  3057 Feb 25 19:04 kubeconfig2
[root@ip-192-168-78-195 .kube]#
  • config : AWS EKS kubeconfig
  • kubeconfig2 : MINIKUBE kubeconfig

3. kubeconfig 파일 반영

두개의 서로 다른 kubeconfig 파일을 아래와 같이 반영 후 context를 확인한다.

[root@ip-192-168-78-195 .kube]# export KUBECONFIG=~/.kube/config:~/.kube/kubeconfig2
[root@ip-192-168-78-195 .kube]# env | grep KUBECONFIG
KUBECONFIG=/root/.kube/config:/root/.kube/kubeconfig2
[root@ip-192-168-78-195 .kube]# kubectl config get-contexts
CURRENT   NAME                                                          CLUSTER                                      AUTHINFO                                                      NAMESPACE
*         iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   
          minikube                                                      minikube                                     minikube                                                      default
[root@ip-192-168-78-195 .kube]#

위와 같이 kubeconfig2로 추가한 minikube context가 추가된 것을 확인할 수 있다.

4. 현재 context 확인 (kubectl config current-context)

현재 사용 중인 context는 다음과 같이 확인할 수 있다.

[root@ip-192-168-78-195 .kube]# kubectl config current-context
iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io
[root@ip-192-168-78-195 .kube]#

5. 전체 context 리스트 (kubectl config get-contexts)

전체 context 리스트는 다음과 같이 확인한다.

[root@ip-192-168-78-195 .kube]# kubectl config get-contexts
CURRENT   NAME                                                          CLUSTER                                      AUTHINFO                                                      NAMESPACE
*         iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   
          minikube                                                      minikube                                     minikube                                                      default
[root@ip-192-168-78-195 .kube]#

6. context 변경 (kubectl config use-context minikube)

아래와 같이 context name을 기준으로 context를 변경할 수 있다.

[root@ip-192-168-78-195 .kube]# kubectl get nodes
NAME                                                 STATUS   ROLES    AGE   VERSION
ip-192-168-109-189.ap-northeast-2.compute.internal   Ready    <none>   93m   v1.21.5-eks-9017834
ip-192-168-129-19.ap-northeast-2.compute.internal    Ready    <none>   93m   v1.21.5-eks-9017834
[root@ip-192-168-78-195 .kube]# kubectl config use-context minikube
Switched to context "minikube".
[root@ip-192-168-78-195 .kube]# kubectl config get-contexts
CURRENT   NAME                                                          CLUSTER                                      AUTHINFO                                                      NAMESPACE
          iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   
*         minikube                                                      minikube                                     minikube                                                      default
[root@ip-192-168-78-195 .kube]# kubectl config current-context
minikube
[root@ip-192-168-78-195 .kube]# kubectl get nodes
NAME                                                STATUS   ROLES                  AGE    VERSION
ip-192-168-84-159.ap-northeast-2.compute.internal   Ready    control-plane,master   100m   v1.23.3
[root@ip-192-168-78-195 .kube]#

위와 같이 하나의 노드에서 multi cluster에 접근하기 위한 구성을 손쉽게 진행할 수 있다. context를 변경하기 전과 후의 nodes 정보를 통해 서로 다른 cluster에 접근한 것을 확인할 수 있다.

7. kubeconfig 확인 (kubectl config view)

kubeconfig는 아래와 같이 3가지 구성요소로 kubeconfig가 구성된다.

[root@ip-192-168-78-195 .kube]# kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://D521C278FE3ABBAFA91D288C8490A4D0.gr7.ap-northeast-2.eks.amazonaws.com
  name: NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io
- cluster:
    certificate-authority: /root/.minikube/ca.crt
    extensions:
    - extension:
        last-update: Fri, 25 Feb 2022 18:52:48 UTC
        provider: minikube.sigs.k8s.io
        version: v1.25.2
      name: cluster_info
    server: https://192.168.84.159:8443
  name: minikube
contexts:
- context:
    cluster: NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io
    user: iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io
  name: iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io
- context:
    cluster: minikube
    extensions:
    - extension:
        last-update: Fri, 25 Feb 2022 18:52:48 UTC
        provider: minikube.sigs.k8s.io
        version: v1.25.2
      name: context_info
    namespace: default
    user: minikube
  name: minikube
current-context: iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io
kind: Config
preferences: {}
users:
- name: iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      args:
      - eks
      - get-token
      - --cluster-name
      - NRSON-EKS-CLUSTER
      - --region
      - ap-northeast-2
      command: aws
      env:
      - name: AWS_STS_REGIONAL_ENDPOINTS
        value: regional
- name: minikube
  user:
    client-certificate: /root/.minikube/profiles/minikube/client.crt
    client-key: /root/.minikube/profiles/minikube/client.key
[root@ip-192-168-78-195 .kube]#
  • cluster : kubernetes로 구성되어 있는 클러스터 정보. Private은 물론, Public CSP Service, MSP Managed PaaS를 모두 포함한다.
  • user : cluster에 접근하기 위한 user 정보. ID/PW, 인증서, Token 인증 등을 통해 Cluster에 접근할 수 있다. 인증서로 로그인하는 경우 해당 인증서 파일을 복사해야 한다.
  • context : user, cluster, namespace 정보를 기준으로 context 단위를 생성하며, context 단위별로 multi cluster를 운영할 수 있다.

현재 사용중인 context의 정보만 확인하고자 할 경우에는 "--minify"을 붙여 준다.

[root@ip-192-168-78-195 .kube]# kubectl config view --minify
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://D521C278FE3ABBAFA91D288C8490A4D0.gr7.ap-northeast-2.eks.amazonaws.com
  name: NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io
contexts:
- context:
    cluster: NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io
    user: iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io
  name: iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io
current-context: iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io
kind: Config
preferences: {}
users:
- name: iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      args:
      - eks
      - get-token
      - --cluster-name
      - NRSON-EKS-CLUSTER
      - --region
      - ap-northeast-2
      command: aws
      env:
      - name: AWS_STS_REGIONAL_ENDPOINTS
        value: regional
[root@ip-192-168-78-195 .kube]#

8. context 추가 (kubectl config set-context)

다음으로 context를 추가해 보자. NRSON-EKS-CLUSTER를 사용하는 CLUSTER에 아래와 같이 NAMESPACE를 KUBE-SYSTEM을 사용하는 eks-default라는 context를 추가해 보자.

[root@ip-192-168-78-195 .kube]# kubectl config get-contexts
CURRENT   NAME                                                          CLUSTER                                      AUTHINFO                                                      NAMESPACE
          iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   
*         minikube                                                      minikube                                     minikube                                                      default
[root@ip-192-168-78-195 .kube]# kubectl config set-context eks-default --namespace=kube-system --cluster=NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io --user=iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io
Context "eks-default" created.
[root@ip-192-168-78-195 .kube]# kubectl config use-context eks-default
Switched to context "eks-default".
[root@ip-192-168-78-195 .kube]# kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
aws-node-2hwdl             1/1     Running   0          18h
aws-node-bqmvx             1/1     Running   0          18h
coredns-6dbb778559-flm4z   1/1     Running   0          18h
coredns-6dbb778559-kr44p   1/1     Running   0          18h
kube-proxy-bndss           1/1     Running   0          18h
kube-proxy-schg7           1/1     Running   0          18h
[root@ip-192-168-78-195 .kube]#

위와 같이 kubectl get pods 결과가 kube-system으로 나오는 것을 확인할 수 있다. 즉 별도로 namespace를 지정하지 않을 경우에는 deafult namespace가 자동으로 매핑된다.

9. kubeconfig 삭제 (kubectl unset cluster + context + user)

아래와 같이 생성한 context를 삭제할 수 있다.

[root@ip-192-168-78-195 .kube]# kubectl config unset clusters.minikube
Property "clusters.minikube" unset.
[root@ip-192-168-78-195 .kube]# kubectl config unset contexts.minikube
Property "contexts.minikube" unset.
[root@ip-192-168-78-195 .kube]# kubectl config unset users.minikube
Property "users.minikube" unset.
[root@ip-192-168-78-195 .kube]# kubectl config get-contexts
CURRENT   NAME                                                          CLUSTER                                      AUTHINFO                                                      NAMESPACE
*         iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   iam-root-account@NRSON-EKS-CLUSTER.ap-northeast-2.eksctl.io   
[root@ip-192-168-78-195 .kube]#

결론

kubernetes는 이제 Hybrid의 전환기에 놓여 있다. kubernetes context를 활용하여 이미 많은 상용 대시보드에서는 multi/hybrid 환경 상에서 접근이 가능하도록 구성을 지원하고 있다.

context 기능을 통해 개발/테스트/운영 환경 또는 각 도메인 영역을 구분하고, 통합 접근 관리 대시보드 또는 CLI 노드에서 관리한다면, 보다 효율적인 운영관리가 될 수 있지 않을까 싶다.

728x90
반응형