쿠버네티스(kubernetes) 모니터링 전용 config 파일 만들기

Moon Blue의 IT 로그 📝·2024년 11월 23일
0

💡 쿠버네티스 클러스터에서 리소스 조작이 불가능한 모니터링용 config 파일을 스크립트로 만드는 방법을 소개합니다 📝

모니터링 전용 config 스크립트 생성

1. 필요한 리소스 생성

  • config 파일을 구성하는 네가지 리소스들이 있다
  • 먼저 이 리소스들의 이름을 변수에 지정해준다
  • 변수명은 각자의 상황에 맞게 자유롭게 구성
# 리소스 이름 변수에 지정
SERVICE_ACCOUNT="monitoring-sa"
SECRET="monitoring-sa-secret"
CLUSTER_ROLE="monitoring-role"
CLUSTER_ROLE_BINDING="monitoring-role-binding"

# config 파일 이름 변수에 지정
KUBECONFIG_FILE="config"

2. ServiceAccount 생성

  • Kubernetes 리소스에 접근하기 위한 인증 주체
  • API 서버와 통신할 때 사용할 고유한 ID를 제공
kubectl create serviceaccount $SERVICE_ACCOUNT

3. Secret 생성

  • 쿠버네티스 1.24 버전 이후로 ServiceAccount를 생성하더라도 secret이 자동으로 생성되지 않음
  • ServiceAccount와 연결 및 인증 토큰 및 CA 인증서를 저장
  • Config 파일 생성 시 토큰과 인증서를 가져오기 위해 필요
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

4. ClusterRole 생성

  • 클러스터 수준에서 리소스에 대한 권한(예: get, list, watch)을 정의
  • 모니터링 목적에 맞게 리소스 접근 범위를 설정
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

5. ClusterRoleBinding 생성

  • ClusterRole을 특정 ServiceAccount와 연결
  • 정의된 권한을 ServiceAccount가 사용할 수 있도록 허용
kubectl create clusterrolebinding $CLUSTER_ROLE_BINDING \
  --clusterrole=$CLUSTER_ROLE \
  --serviceaccount=default:$SERVICE_ACCOUNT

6. config 파일 생성

  • 앞전에 생성한 리소스 (ServiceAccount, Secret, ClusterRole, ClusterRoleBinding) 를 이용하여 config 구성
# 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

7. config 파일 위치 지정

  • ~/.kube/ 디렉토리가 없다면 생성
  • 내 로컬 PC의 ~/.kube/ 디렉토리에 생성한 파일을 위치시킨다
mv config_monitoring ~/.kube

8. 권한 테스트

  • 먼저 생성한 config 파일을 통하여 클러스터에 접속
  • 읽기 권한 및 조작 권한에 대하여 테스트
# 파일명 지정
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
profile
What a Beautiful World~ 🌏

0개의 댓글