Kubernetes

Kubernetes ServiceAccount로 kubeconfig 파일 생성

DevelopC 2022. 9. 20. 09:01
728x90

Kubernetes ServiceAccount로 kubeconfig 파일 생성

kubernetes에서 ServiceAccount를 생성하여, kubeconfig 파일을 생성하는 방법입니다. ServiceAccount를 사용하여 kubernetes 클러스터 외부에서 접근시 활용할 수 있습니다.

ServiceAccount 생성

아래의 명령어를 사용하여 ServiceAccount를 생성합니다. ServiceAccount를 생성하면 service-account-token이 secret에 생성됩니다.

# serviceaccount 생성
$ kubectl create sa test-sa -n default

# serviceaccount 조회
$ ktest get sa test-sa -n default -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: "2022-09-19T23:55:11Z"
  name: test-sa
  namespace: default
  resourceVersion: "196396539"
  uid: d0d43af0-e222-4ec3-83d8-2e472a696bad
secrets:
# serviceaccount에 할당된 token을 가진 secret입니다.
- name: test-sa-token-79rvs

RBAC 권한설정

kubernetes에서 다른 리소스에 접근하기위해서 권한설정을 해주셔야합니다. 아래의 예제는 cluster-admin 권한을 설정하였습니다. 예제작성을위해 cluster-admin권한을 설정하였지만, 최소권한으로 설정하는걸 추천드립니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: test-sa-clusterrolebinding
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
subjects:
  - kind: ServiceAccount
    name: test-sa
    namespace: default

kubeconfig 파일 생성

아래의 스크립트를 저장해서 실행하면 kubeconfig 파일이 생성됩니다.

#!/bin/bash

API_SERVER_URL=$1
NAMESPACE=$2
SERVICEACCOUNT=$3

if [ -z "${API_SERVER_URL}" ]; then
  echo "requried API_SERVER_URL"
  echo "usage: make_kubeconfig.sh API_SERVER_URL NAMESPACE SERVICEACCOUNT"
  exit 1
fi

if [ -z "${NAMESPACE}" ]; then
  echo "requried NAMESPACE"
  echo "usage: make_kubeconfig.sh API_SERVER_URL NAMESPACE SERVICEACCOUNT"
  exit 1
fi

if [ -z "${SERVICEACCOUNT}" ]; then
  echo "requried SERVICEACCOUNT"
  echo "usage: make_kubeconfig.sh API_SERVER_URL NAMESPACE SERVICEACCOUNT"
  exit 1
fi

SECRET_NAME=$(kubectl -n $NAMESPACE get serviceaccount $SERVICEACCOUNT -o jsonpath='{.secrets[].name}')
CA=$(kubectl -n $NAMESPACE get secret $SECRET_NAME -o jsonpath='{.data.ca\.crt}')
TOKEN=$(kubectl -n $NAMESPACE get secret $SECRET_NAME -o jsonpath='{.data.token}' | base64 --decode)

echo "
apiVersion: v1
kind: Config
clusters:
- name: default-cluster
  cluster:
    certificate-authority-data: ${CA}
    server: ${API_SERVER_URL}
contexts:
- name: default-context
  context:
    cluster: default-cluster
    namespace: ${NAMESPACE}
    user: ${SERVICEACCOUNT}
current-context: default-context
users:
- name: ${SERVICEACCOUNT}
  user:
    token: ${TOKEN}
"
728x90

'Kubernetes' 카테고리의 다른 글

Amazon EFS CSI Driver  (0) 2022.09.23
Kubernetes RBAC 알아보기  (0) 2022.09.22
CoreDNS NXDOMAIN 오류 해결  (0) 2022.09.21
Resizing StatefulSet Persistent Volumes with zero downtime  (2) 2022.09.20
Amazon EBS CSI driver  (4) 2022.09.19