Từ phiên bản Kubernetes 1.24 trở đi, các token vĩnh viễn (long-lived token) không còn được tự động sinh ra dưới dạng Secret khi bạn tạo một Service Account. Tuy nhiên, để tạo cấu hình M2M (Machine-to-Machine) cấp quyền cao nhất (cluster-admin) cho CI/CD giống hệt như cách ArgoCD hoạt động, bạn có thể chủ động tạo một Secret đặc biệt để ép Kubernetes sinh ra token vĩnh viễn.
Dưới đây là một script Bash hoàn chỉnh giúp bạn tự động hóa toàn bộ quá trình: Tạo Service Account, cấp quyền cluster-admin, lấy Token/CA Cert và xuất ra file kubeconfig.
Script tạo Kubeconfig tự động
Bạn hãy tạo một file tên là create-m2m-kubeconfig.sh, copy đoạn code sau vào và lưu lại:
#!/bin/bash
set -e
SA_NAME="cicd-admin"
NAMESPACE="kube-system"
KUBECONFIG_OUT="kubeconfig-${SA_NAME}.yaml"
echo "1. Creating ServiceAccount '${SA_NAME}' in namespace '${NAMESPACE}'..."
kubectl create serviceaccount ${SA_NAME} -n ${NAMESPACE} --dry-run=client -o yaml | kubectl apply -f -
echo "2. Granting cluster-admin role to the ServiceAccount..."
kubectl create clusterrolebinding ${SA_NAME}-cluster-admin \
--clusterrole=cluster-admin \
--serviceaccount=${NAMESPACE}:${SA_NAME} \
--dry-run=client -o yaml | kubectl apply -f -
echo "3. Creating a Secret to generate a long-lived token (for Kubernetes 1.24+)..."
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: ${SA_NAME}-secret
namespace: ${NAMESPACE}
annotations:
kubernetes.io/service-account.name: ${SA_NAME}
type: kubernetes.io/service-account-token
EOF
echo "Waiting for Kubernetes to generate the token..."
sleep 2
echo "4. Extracting cluster information, CA certificate, and token..."
SERVER_URL=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
CLUSTER_NAME=$(kubectl config view --minify -o jsonpath='{.clusters[0].name}')
TOKEN=$(kubectl get secret ${SA_NAME}-secret -n ${NAMESPACE} -o jsonpath='{.data.token}' | base64 --decode)
CA_DATA=$(kubectl get secret ${SA_NAME}-secret -n ${NAMESPACE} -o jsonpath='{.data.ca\.crt}')
echo "5. Generating kubeconfig file: ${KUBECONFIG_OUT}..."
cat <<EOF > ${KUBECONFIG_OUT}
apiVersion: v1
kind: Config
clusters:
- cluster:
certificate-authority-data: ${CA_DATA}
server: ${SERVER_URL}
name: ${CLUSTER_NAME}
contexts:
- context:
cluster: ${CLUSTER_NAME}
user: ${SA_NAME}
name: ${SA_NAME}-${CLUSTER_NAME}
current-context: ${SA_NAME}-${CLUSTER_NAME}
users:
- name: ${SA_NAME}
user:
token: ${TOKEN}
EOF
echo "Done! kubeconfig file has been created: ${KUBECONFIG_OUT}"
echo "Test it with:"
echo "kubectl --kubeconfig=${KUBECONFIG_OUT} get nodes"
Cách sử dụng
- Đảm bảo bạn đang login vào EKS bằng terminal hiện tại (kiểm tra bằng lệnh
kubectl get nodesbình thường). - Cấp quyền thực thi cho script:
chmod +x create-m2m-kubeconfig.sh - Chạy script:
./create-m2m-kubeconfig.sh - Sau khi chạy xong, trong thư mục của bạn sẽ xuất hiện file
kubeconfig-cicd-admin.yaml. Bạn chỉ cần copy file này đưa lên Jenkins, GitLab CI, hoặc GitHub Actions. Công cụ CI/CD sẽ có toàn quyền kiểm soát EKS cluster của bạn.
Lưu ý Bảo mật: File kubeconfig này chứa một Bearer Token không bao giờ hết hạn và có quyền tối cao nhất trên cluster. Nếu vô tình để lộ file này, bất kỳ ai cũng có thể toàn quyền xóa/sửa EKS của bạn. Bạn nên lưu trữ nó dưới dạng Secret/Variable bảo mật trên nền tảng CI/CD.[blog.csdn]
Bạn dùng tool CI/CD nào (Jenkins, GitLab CI, Github Action…) để mình hướng dẫn cách nhúng file kubeconfig này vào pipeline chuẩn nhất nhé?