티스토리 뷰
개요
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 노드에서 관리한다면, 보다 효율적인 운영관리가 될 수 있지 않을까 싶다.
'③ 클라우드 > ⓚ Kubernetes' 카테고리의 다른 글
Kubernetes 활용성을 높이는 플러그인 & krew 패키지 매니저 (0) | 2022.03.03 |
---|---|
Pod 생성 및 종료 관리 (Health Check & Graceful Shutdown) (0) | 2022.02.27 |
Kubeflow를 활용하여 머신러닝 분석환경 구축하기 (0) | 2021.01.19 |
Kubernetes 환경변수 구성하기 (ConfigMap, Secret) (2) | 2021.01.03 |
Podman, Buildah, Skopeo를 활용하여 Docker CLI 대체하기 (4) | 2020.12.30 |
- Total
- Today
- Yesterday
- openstack token issue
- 마이크로서비스 아키텍처
- kubernetes
- TA
- wildfly
- git
- Docker
- MSA
- aws
- Architecture
- openstack tenant
- API Gateway
- OpenStack
- apache
- 오픈스택
- 아키텍처
- k8s
- nodejs
- webtob
- 쿠버네티스
- SA
- JEUS7
- node.js
- JEUS6
- 마이크로서비스
- jeus
- SWA
- Da
- JBoss
- aa
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |