💡 쿠버네티스 클러스터에서 리소스 조작이 불가능한 모니터링용 config 파일을 스크립트로 만드는 방법을 소개합니다 📝
# 리소스 이름 변수에 지정
SERVICE_ACCOUNT="monitoring-sa"
SECRET="monitoring-sa-secret"
CLUSTER_ROLE="monitoring-role"
CLUSTER_ROLE_BINDING="monitoring-role-binding"
# config 파일 이름 변수에 지정
KUBECONFIG_FILE="config"
kubectl create serviceaccount $SERVICE_ACCOUNT
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: $SECRET
annotations:
kubernetes.io/service-account.name: $SERVICE_ACCOUNT
type: kubernetes.io/service-account-token
EOF
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: $CLUSTER_ROLE
rules:
- apiGroups: ["*"] # 모든 API 그룹
resources: ["*"] # 모든 리소스
verbs: ["get", "list", "watch"] # 읽기 전용 권한
EOF
kubectl create clusterrolebinding $CLUSTER_ROLE_BINDING \
--clusterrole=$CLUSTER_ROLE \
--serviceaccount=default:$SERVICE_ACCOUNT
# Secret 준비 대기 및 Token 가져오기
echo "Waiting for Secret to be ready..."
for i in {1..10}; do
TOKEN=$(kubectl get secret $SECRET -o jsonpath="{.data.token}" | base64 --decode)
if [[ -n "$TOKEN" ]]; then
break
fi
sleep 2
done
if [[ -z "$TOKEN" ]]; then
echo "Error: Failed to retrieve Token for Secret $SECRET"
exit 1
fi
# 클러스터 정보 가져오기
CLUSTER_NAME=$(kubectl config view --minify -o jsonpath="{.clusters[0].name}")
CLUSTER_SERVER=$(kubectl config view --minify -o jsonpath="{.clusters[0].cluster.server}")
CLUSTER_CA=$(kubectl get secret $SECRET -o jsonpath="{.data.ca\.crt}")
# Kubeconfig 파일 생성
cat <<EOF > $KUBECONFIG_FILE
apiVersion: v1
kind: Config
clusters:
- cluster:
certificate-authority-data: $CLUSTER_CA
server: $CLUSTER_SERVER
name: $CLUSTER_NAME
users:
- name: $SERVICE_ACCOUNT@$CLUSTER_NAME
user:
token: $TOKEN
contexts:
- context:
cluster: $CLUSTER_NAME
user: $SERVICE_ACCOUNT@$CLUSTER_NAME
name: $SERVICE_ACCOUNT@$CLUSTER_NAME
current-context: $SERVICE_ACCOUNT@$CLUSTER_NAME
EOF
mv config_monitoring ~/.kube
# 파일명 지정
KUBECONFIG_FILE="config"
# config 파일 권한 제한
chmod 600 $KUBECONFIG_FILE
# 리소스 읽기 권한 테스트
kubectl auth can-i get pods --kubeconfig=$KUBECONFIG_FILE
kubectl auth can-i list pods --kubeconfig=$KUBECONFIG_FILE
kubectl auth can-i watch pods --kubeconfig=$KUBECONFIG_FILE
# 리소스 조작 권한 테스트
kubectl auth can-i create pods --kubeconfig=$KUBECONFIG_FILE
kubectl auth can-i update pods --kubeconfig=$KUBECONFIG_FILE
kubectl auth can-i delete pods --kubeconfig=$KUBECONFIG_FILE