쿠버네티스 멀티 클러스터 접근: kubeconfig 병합 및 RBAC

💡 핵심 요약 (Executive Summary)

본 가이드는 kubeconfig Cluster 접근 구성의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.

관련 문서
본문
bash
#[Target Cluster]
## ServiceAccount 생성
export KUBE_SA=jenkins
export KUBE_NS=jenkins-Enterprise Cloud
kubectl create sa -n ${KUBE_NS} ${KUBE_SA}
## SA ClusterRoleBinding 생성
-
## 인증토큰 얻기
kubectl get secret -n ${KUBE_NS} $(kubectl get sa -n ${KUBE_NS} ${KUBE_SA} -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 -d

#[Source Cluster]
kubectl config set-cluster Enterprise Cloud --server=https://127.0.0.1:6443 --insecure-skip-tls-verify
kubectl config set-context jenkins@Enterprise Cloud --user=jenkins --cluster=Enterprise Cloud


sudo vi /etc/kubernetes/admin.conf
>>>
#추가된 클러스터에 항목 추가
## insecure-skip-tls-verify or certificate-authority-data중 택1
insecure-skip-tls-verify: true
certificate-authority-data: ${fromTargetKubeconfig}

## clusters
#proxy-url: https://100.0.0.191:26443 
# 해당 서버 내 apiserver.crt가 허용하는 SAN으로 /etc/hosts에 등록
server: https://127.0.0.1:6443 
server: https://100.0.0.191:26443 

## users
#users에 $TOKEN 추가
- name: jenkins
  user:
    token: {입력}
<<<

kubectl config use-context jenkins@Enterprise Cloud



##정리필요 coredns config
hosts {
           192.168.65.166 lb-apiserver.kubernetes.local
           fallthrough
        }


GPT::Create Resource: SA and Role

소스 클러스터(서비스 계정이 있는 위치):

  • 기존 서비스 계정 생성 또는 사용:
  • 액세스 권한을 부여하려는 소스 클러스터에서 기존 서비스 계정을 생성하거나 사용합니다. 특정 네임스페이스에 이를 생성할 수 있습니다.
  1. 소스 클러스터에서 RBAC 역할 정의:
    – 서비스 계정이 가져야 하는 권한을 정의하는 역할 또는 ClusterRole을 소스 클러스터에 생성합니다. 이 역할을 사용하면 서비스 계정이 대상 클러스터의 리소스에 액세스할 수 있습니다.
    – 포드에 대한 읽기 액세스 권한을 부여하는 역할에 대한 YAML의 예:
yaml
apiVersion: rbac.authorization.k8s.io/v1
   kind: Role
   metadata:
     name: access-target-cluster
     namespace: source-namespace
   rules:
   - apiGroups: [""]
     resources: ["pods"]
     verbs: ["get", "list"]
  1. 소스 서비스 계정에 대한 RoleBinding 만들기:
    – 2단계에서 생성된 역할을 1단계의 서비스 계정과 연결하는 RoleBinding을 생성합니다.
    – RoleBinding에 대한 YAML 예:
yaml
apiVersion: rbac.authorization.k8s.io/v1
   kind: RoleBinding
   metadata:
     name: access-target-cluster-binding
     namespace: source-namespace
   subjects:
   - kind: ServiceAccount
     name: your-service-account
     namespace: source-namespace
   roleRef:
     kind: Role
     name: access-target-cluster
     apiGroup: rbac.authorization.k8s.io

대상 클러스터(액세스가 허용되는 위치):

  • 기존 네임스페이스 생성 또는 사용:
  • 소스 클러스터의 서비스 계정이 리소스에 액세스할 대상 클러스터에서 기존 네임스페이스를 생성하거나 사용합니다.
  1. 대상 클러스터에서 RBAC 역할 정의:
    – 대상 클러스터 내의 리소스에 액세스하기 위해 소스 클러스터의 서비스 계정에 대한 권한을 정의하는 대상 클러스터에 Role 또는 ClusterRole을 생성합니다.
    – 대상 네임스페이스의 포드에 대한 읽기 액세스 권한을 부여하는 역할에 대한 YAML의 예:
yaml
apiVersion: rbac.authorization.k8s.io/v1
   kind: Role
   metadata:
     name: allow-access-from-source
     namespace: target-namespace
   rules:
   - apiGroups: [""]
     resources: ["pods"]
     verbs: ["get", "list"]
  1. 소스 서비스 계정에 대한 RoleBinding 만들기:
    – 2단계에서 생성된 역할을 소스 클러스터의 서비스 계정과 연결하는 대상 클러스터의 네임스페이스에 RoleBinding을 생성합니다.
    – 대상 클러스터의 RoleBinding에 대한 YAML 예:
yaml
apiVersion: rbac.authorization.k8s.io/v1
   kind: RoleBinding
   metadata:
     name: allow-access-binding
     namespace: target-namespace
   subjects:
   - kind: ServiceAccount
     name: your-service-account
     namespace: source-namespace
   roleRef:
     kind: Role
     name: allow-access-from-source
     apiGroup: rbac.authorization.k8s.io

연결 및 액세스:

이러한 구성이 적용되면 소스 클러스터의 서비스 계정(source-namespace의 your-service-account)은 대상 클러스터의 네임스페이스에 있는 리소스에 액세스하기 위해 access-target-cluster 역할에 의해 정의된 권한을 갖게 됩니다. (대상 네임스페이스). 소스 클러스터의 RoleBinding ‘access-target-cluster-bound’와 대상 클러스터의 RoleBinding ‘allow-access-bound’는 서비스 계정과 권한 간의 연결을 설정합니다.

클러스터 간의 네트워킹이 통신을 허용하도록 적절하게 구성되었는지 확인하고 서비스 계정이 두 클러스터에 모두 액세스할 수 있도록 인증 메커니즘(예: kubeconfig 파일 또는 기타 인증 방법)이 올바르게 설정되었는지 확인하세요.


GPT::Setting: Kubeconfig

소스 클러스터(서비스 계정이 있는 위치):

  • 기존 서비스 계정 생성 또는 사용:
  • 액세스 권한을 부여하려는 소스 클러스터에서 기존 서비스 계정을 생성하거나 사용합니다. 특정 네임스페이스에 이를 생성할 수 있습니다.
  1. 소스 서비스 계정에 대한 kubeconfig 생성:
    – 서비스 계정에 대한 kubeconfig 파일을 생성합니다. 이 kubeconfig는 서비스 계정에서 대상 클러스터를 인증하고 액세스하는 데 사용됩니다.
    – -as 및 -as-group 플래그와 함께 kubectl config 명령을 사용하여 서비스 계정을 가장하는 kubeconfig를 생성합니다.
bash
kubectl config set-credentials your-service-account --token=your-service-account-token
   kubectl config set-context target-cluster-context --user=your-service-account --cluster=target-cluster
   kubectl config use-context target-cluster-context

‘your-service-account’를 서비스 계정의 실제 이름으로 바꾸고, ‘your-service-account-token’을 실제 서비스 계정 토큰으로, ‘target-cluster’를 대상 클러스터 컨텍스트의 이름으로 바꾸세요.

대상 클러스터(액세스가 허용되는 위치):

  1. 기존 네임스페이스 생성 또는 사용:
    – 소스 클러스터의 서비스 계정이 리소스에 액세스할 대상 클러스터에서 기존 네임스페이스를 생성하거나 사용합니다.
  2. 대상 클러스터에서 RBAC 역할 정의:
    – 대상 클러스터 내의 리소스에 액세스하기 위해 소스 클러스터의 서비스 계정에 대한 권한을 정의하는 대상 클러스터에 Role 또는 ClusterRole을 생성합니다.
  3. 소스 서비스 계정에 대한 RoleBinding 만들기:
    – 2단계에서 생성된 역할을 소스 클러스터의 서비스 계정과 연결하는 대상 클러스터의 네임스페이스에 RoleBinding을 생성합니다.

소스 클러스터에서 액세스:

  • Kubeconfig 복사:
  • 소스 클러스터의 서비스 계정에 대해 생성한 kubeconfig 파일을 이를 사용할 애플리케이션이나 프로세스에서 액세스할 수 있는 위치에 복사합니다.
  1. 대상 클러스터의 리소스에 액세스:
    – 복사한 kubeconfig 파일을 사용하여 서비스 계정으로 대상 클러스터의 리소스에 액세스합니다. 예를 들어 -kubeconfig 플래그와 함께 kubectl 명령을 사용할 수 있습니다.
docker
kubectl --kubeconfig=path/to/source-service-account-kubeconfig.yaml get pods -n target-namespace

이 구성을 사용하면 원본 클러스터의 서비스 계정이 대상 클러스터 네임스페이스의 리소스에 액세스할 수 있습니다. 서비스 계정은 생성된 kubeconfig를 사용하여 자신을 가장하고 대상 클러스터의 RBAC 구성은 필요한 권한을 부여합니다.

kubeconfig 파일이 안전하게 유지되고 클러스터 간의 네트워크 구성이 통신을 허용하는지 확인하십시오. 또한 보다 정교한 다중 클러스터 관리 및 통신 시나리오를 위해 Kubernetes 페더레이션 또는 서비스 메시(예: Istio)와 같은 고급 도구를 사용하는 것이 좋습니다.


GPT::Get Secret Token of SA

kubeconfig 파일에 등록하기 위한 인증 토큰을 얻으려면 일반적으로 다음 단계를 따라야 합니다.

  1. 서비스 계정 만들기: 먼저 Kubernetes 서비스 계정을 만들어야 합니다. 서비스 계정은 Kubernetes 포드 및 기타 리소스가 클러스터를 인증하는 데 사용하는 ID입니다.
yaml
apiVersion: v1
   kind: ServiceAccount
   metadata:
     name: my-service-account

kubectl apply -f service-account.yaml을 사용하여 서비스 계정 구성을 적용합니다.

  1. 바인딩 역할 및 RoleBinding: 다음으로 Role 및 RoleBinding을 사용하여 서비스 계정에 필요한 권한을 부여해야 합니다.
yaml
apiVersion: rbac.authorization.k8s.io/v1
   kind: Role
   metadata:
     name: my-role
   rules:
   - apiGroups: [""]
     resources: ["pods", "pods/exec"]
     verbs: ["get", "list", "create", "delete"]
   ---
   apiVersion: rbac.authorization.k8s.io/v1
   kind: RoleBinding
   metadata:
     name: my-role-binding
   subjects:
   - kind: ServiceAccount
     name: my-service-account
   roleRef:
     kind: Role
     name: my-role
     apiGroup: rbac.authorization.k8s.io

kubectl apply -f role-and-role-binding.yaml을 사용하여 역할 및 RoleBinding 구성을 적용합니다.

  1. 토큰 검색: 서비스 계정과 연결된 토큰은 서비스 계정의 비밀에서 찾을 수 있습니다. 다음을 사용하여 토큰을 검색합니다.
bash
SECRET_NAME=$(kubectl get sa my-service-account -o jsonpath='{.secrets[0].name}')
   TOKEN=$(kubectl get secret $SECRET_NAME -o jsonpath='{.data.token}' | base64 --decode)
   echo $TOKEN
  1. kubeconfig 생성 또는 수정: 이제 검색된 토큰을 사용하여 kubeconfig 파일을 생성하거나 수정할 수 있습니다. CLUSTER_NAME, SERVER_URL, CONTEXT_NAME을 실제 클러스터 세부정보로 바꾸세요.
yaml
apiVersion: v1
   clusters:
   - name: CLUSTER_NAME
     cluster:
       server: SERVER_URL
       certificate-authority-data: CERTIFICATE_AUTHORITY_DATA
   contexts:
   - name: CONTEXT_NAME
     context:
       cluster: CLUSTER_NAME
       user: my-service-account
   current-context: CONTEXT_NAME
   kind: Config
   preferences: {}
   users:
   - name: my-service-account
     user:
       token: $TOKEN

SERVER_URL을 Kubernetes 클러스터의 API 서버 URL로 바꾸고 CERTIFICATE_AUTHORITY_DATA를 base64로 인코딩된 인증 기관 데이터로 바꿉니다.

  1. KUBECONFIG 환경 변수 설정: 수정된 kubeconfig 파일을 가리키도록 KUBECONFIG 환경 변수를 설정합니다.
bash
export KUBECONFIG=/path/to/modified/kubeconfig.yaml

이제 서비스 계정에 부여된 권한으로 kubectl 명령을 사용할 수 있습니다. 이러한 단계에서는 단순화된 시나리오를 가정합니다. 실제 설정에는 환경 및 사용 사례에 따라 추가 구성이 필요할 수 있습니다.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *