Chuyển tới nội dung chính

Tạo Kubeconfig dài hạn với quyền tùy chỉnh


1. Overview

Tính năng này là gì?

Kubeconfig dài hạn cho phép bạn tự tạo file kubeconfig riêng với thời hạn và quyền hạn do bạn quyết định, thay vì phụ thuộc vào kubeconfig từ FPT Portal (chỉ có hiệu lực 24 giờ).

Vấn đề được giải quyết

Kubeconfig tải từ FPT Portal hết hạn sau 24 giờ. Khi dùng cho hệ thống bên thứ ba hoạt động liên tục (ArgoCD, Rancher, Jenkins, Vault, monitoring…), kết nối sẽ bị gián đoạn và bạn phải tải lại, cập nhật lại thủ công.

Bạn đạt được gì?

Sau khi hoàn thành hướng dẫn này, bạn sẽ có file kubeconfig hoạt động ổn định, không gián đoạn với quyền hạn phù hợp cho từng hệ thống hoặc từng thành viên trong team.


2. Who Should Use This

Vai tròKhi nào cần dùng
DevOps / Platform EngineerKết nối ArgoCD, Rancher, Jenkins, Vault, monitoring, backup, hoặc script tự động với cluster M-FKE
DeveloperCần kubeconfig cá nhân dài hạn cho môi trường phát triển
Team LeadCấp kubeconfig với quyền hạn phù hợp cho từng thành viên trong team

3. Key Capabilities

Khả năngMô tả
Tùy chỉnh thời hạnToken không hết hạn, hoặc tự chọn thời hạn cụ thể (ví dụ: 90 ngày, 1 năm)
Tùy chỉnh quyền (RBAC)Toàn quyền cluster, chỉ đọc, giới hạn theo namespace, hoặc quyền chi tiết đến từng loại tài nguyên
Hỗ trợ 2 phương thức xác thựcServiceAccount + Bearer token (cho máy-với-máy) hoặc Client certificate mTLS (cho cá nhân)
Tự quản lý & thu hồiTạo, theo dõi, thu hồi credential ngay lập tức mà không cần gửi yêu cầu hỗ trợ
Tích hợp đa nền tảngDùng được với ArgoCD, Rancher, Jenkins, Vault, Prometheus, và bất kỳ hệ thống nào hỗ trợ kubeconfig

4. How to Use — Step-by-Step

Chọn phương án phù hợp

Phương án 1: ServiceAccount + TokenPhương án 2: Client Certificate
Xác thựcBearer tokenChứng chỉ (mTLS)
Thời hạnKhông hết hạn, hoặc tự chọnTự chọn, tối đa 30 ngày
Phù hợpKết nối máy-với-máy (ArgoCD, Rancher, Jenkins, Vault…)Kubeconfig cá nhân cho từng thành viên
Khuyến nghịDùng phương án này cho hầu hết trường hợpKhi cần định danh cá nhân theo User/Group

Điều kiện tiên quyết

Trước khi bắt đầu, hãy đảm bảo:

  • Đã cài đặt kubectl trên máy làm việc
  • Đã tải kubeconfig của cluster từ FPT Portal (file còn trong thời hạn 24 giờ)
  • Máy kết nối được tới API server (đã mở whitelist IP nếu cluster bật giới hạn truy cập)

Lưu ý: Các lệnh dùng shell Linux/macOS. Trên Windows, khuyến nghị chạy trong WSL hoặc Git Bash.


Bước chuẩn bị chung (bắt buộc cho cả hai phương án)

Bước CB-1: Kết nối cluster bằng kubeconfig Portal

Hành động: Export kubeconfig Portal và kiểm tra kết nối:

export KUBECONFIG=/path/to/kubeconfig-portal.yaml
kubectl get nodes

Kết quả mong đợi:

NAME                    STATUS   ROLES    AGE   VERSION
fke-node-abc Ready <none> 10d v1.28.x
fke-node-def Ready <none> 10d v1.28.x

⚠️ Nếu lệnh báo lỗi, kiểm tra lại đường dẫn file kubeconfig và thời hạn (24 giờ kể từ lúc tải).


Bước CB-2: Lấy thông tin cluster (SERVER & CA)

Hành động: Lấy địa chỉ API server và CA certificate:

SERVER=$(kubectl config view --minify --raw -o jsonpath='{.clusters[0].cluster.server}')
CA_B64=$(kubectl config view --minify --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}')

echo "$SERVER"

Kết quả mong đợi:

https://api.fke-xxxxxxxx.fptcloud.com:443

Quan trọng: Hai giá trị SERVERCA_B64 thuộc về cluster — không hết hạn cùng kubeconfig Portal. Bạn sẽ dùng chúng ở các bước sau.


Use Case 1: Tạo Kubeconfig với ServiceAccount + Token (Khuyến nghị)

Phù hợp cho: ArgoCD, Rancher, Jenkins, Vault, monitoring, backup, và mọi kết nối máy-với-máy.


Bước 1.1: Tạo ServiceAccount

Hành động: Tạo ServiceAccount mới. Nên tạo mỗi hệ thống một tài khoản riêng:

NAMESPACE=kube-system       # hoặc namespace riêng, ví dụ: external-access
SA_NAME=argocd-deployer # đặt tên theo hệ thống sử dụng

kubectl create serviceaccount "$SA_NAME" -n "$NAMESPACE"

Kết quả mong đợi:

serviceaccount/argocd-deployer created

Mẹo: Đặt tên gợi nhớ hệ thống: argocd-deployer, jenkins-ci, rancher-agent, monitoring-reader.


Bước 1.2: Gán quyền (RBAC)

Hành động: Chọn một mẫu quyền phù hợp với nhu cầu của bạn:

Mẫu A — Toàn quyền trên cluster (tương đương kubeconfig Portal):

kubectl create clusterrolebinding "${SA_NAME}-admin" \
--clusterrole=cluster-admin \
--serviceaccount="${NAMESPACE}:${SA_NAME}"

Mẫu B — Chỉ đọc toàn cluster (monitoring, dashboard):

kubectl create clusterrolebinding "${SA_NAME}-view" \
--clusterrole=view \
--serviceaccount="${NAMESPACE}:${SA_NAME}"

Mẫu C — Toàn quyền trong một số namespace (CI/CD):

for ns in app-dev app-staging; do
kubectl create rolebinding "${SA_NAME}-edit" -n "$ns" \
--clusterrole=edit \
--serviceaccount="${NAMESPACE}:${SA_NAME}"
done

Mẫu D — Quyền tùy chỉnh chi tiết (ví dụ: chỉ deploy workload, không đọc/sửa Secret):

Tạo file custom-deployer-rbac.yaml:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: custom-deployer
rules:
- apiGroups: ["apps"]
resources: ["deployments", "statefulsets", "daemonsets", "replicasets"]
verbs: ["*"]
- apiGroups: [""]
resources: ["services", "configmaps", "pods", "pods/log"]
verbs: ["*"]
- apiGroups: ["networking.k8s.io"]
resources: ["ingresses"]
verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: argocd-deployer-custom
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: custom-deployer
subjects:
- kind: ServiceAccount
name: argocd-deployer
namespace: kube-system

Áp dụng:

kubectl apply -f custom-deployer-rbac.yaml

Mẹo: Kubernetes có sẵn các ClusterRole: cluster-admin (toàn quyền), admin, edit (đọc/ghi, không sửa RBAC), view (chỉ đọc). Liệt kê bằng kubectl get clusterroles.


Bước 1.3: Lấy token

Chọn một trong hai cách tùy nhu cầu:

Cách A — Token KHÔNG hết hạn (khuyến nghị cho hệ thống tự động):

kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
name: ${SA_NAME}-token
namespace: ${NAMESPACE}
annotations:
kubernetes.io/service-account.name: ${SA_NAME}
type: kubernetes.io/service-account-token
EOF

# Đợi vài giây để hệ thống điền token, rồi lấy ra
TOKEN=$(kubectl get secret "${SA_NAME}-token" -n "$NAMESPACE" \
-o jsonpath='{.data.token}' | base64 -d)

Token có hiệu lực vô thời hạn — chỉ mất hiệu lực khi bạn xóa Secret hoặc ServiceAccount.

Cách B — Token có thời hạn tự chọn (an toàn hơn, cần gia hạn):

# Ví dụ 90 ngày = 2160h
TOKEN=$(kubectl create token "$SA_NAME" -n "$NAMESPACE" --duration=2160h)

Token tự hết hạn — đến hạn bạn cần tạo token mới và cập nhật vào hệ thống đang dùng.


Bước 1.4: Tạo file kubeconfig mới

Hành động:

CLUSTER_NAME=my-fke-cluster   # đặt tên tùy ý

cat > kubeconfig-${SA_NAME}.yaml <<EOF
apiVersion: v1
kind: Config
clusters:
- name: ${CLUSTER_NAME}
cluster:
certificate-authority-data: ${CA_B64}
server: ${SERVER}
contexts:
- name: ${SA_NAME}@${CLUSTER_NAME}
context:
cluster: ${CLUSTER_NAME}
user: ${SA_NAME}
current-context: ${SA_NAME}@${CLUSTER_NAME}
users:
- name: ${SA_NAME}
user:
token: ${TOKEN}
EOF

Kết quả: File kubeconfig-argocd-deployer.yaml được tạo trong thư mục hiện tại.


Bước 1.5: Kiểm tra kubeconfig mới

Hành động:

export KUBECONFIG=$PWD/kubeconfig-${SA_NAME}.yaml

# Xác nhận danh tính
kubectl auth whoami

# Kiểm tra kết nối
kubectl get nodes

# Kiểm tra quyền cụ thể
kubectl auth can-i create deployments -n app-dev

Kết quả mong đợi:

# kubectl auth whoami
ATTRIBUTE VALUE
Username system:serviceaccount:kube-system:argocd-deployer
Groups [system:serviceaccounts system:serviceaccounts:kube-system system:authenticated]

# kubectl get nodes
NAME STATUS ROLES AGE VERSION
fke-node-abc Ready <none> 10d v1.28.x

# kubectl auth can-i create deployments -n app-dev
yes

Kết quả:

✅ File kubeconfig-argocd-deployer.yaml sẵn sàng import vào ArgoCD, Rancher, Jenkins, Vault… Kết nối không bị gián đoạn sau 24 giờ.


Use Case 2: Tạo Kubeconfig cá nhân với Client Certificate

Phù hợp cho: Cấp kubeconfig cho từng thành viên trong team, định danh theo User/Group.

⚠️ Giới hạn: Chứng chỉ có thời hạn tối đa 30 ngày. Nếu cần kết nối dài hạn cho hệ thống tự động, dùng Use Case 1.


Bước 2.1: Tạo private key và CSR

Hành động:

USER_NAME=dev-nguyenvana
GROUP=dev-team # dùng để phân quyền theo nhóm

# Tạo private key
openssl genrsa -out ${USER_NAME}.key 2048

# Tạo Certificate Signing Request
openssl req -new -key ${USER_NAME}.key -out ${USER_NAME}.csr \
-subj "/CN=${USER_NAME}/O=${GROUP}"

Kết quả mong đợi:

Generating RSA private key, 2048 bit long modulus
...

Giải thích: CN (Common Name) = tên user, O (Organization) = tên group. Kubernetes dùng hai giá trị này để phân quyền.


Bước 2.2: Gửi CSR lên cluster

Hành động:

kubectl apply -f - <<EOF
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: ${USER_NAME}
spec:
request: $(base64 -w 0 < ${USER_NAME}.csr)
signerName: kubernetes.io/kube-apiserver-client
expirationSeconds: 2592000 # 30 ngày = 2592000 giây
usages:
- client auth
EOF

Kết quả mong đợi:

certificatesigningrequest.certificates.k8s.io/dev-nguyenvana created

Bước 2.3: Phê duyệt CSR và lấy chứng chỉ

Hành động:

# Phê duyệt
kubectl certificate approve ${USER_NAME}

# Lấy chứng chỉ đã ký
kubectl get csr ${USER_NAME} -o jsonpath='{.status.certificate}' | base64 -d > ${USER_NAME}.crt

# Kiểm tra thời hạn thực tế
openssl x509 -in ${USER_NAME}.crt -noout -enddate

Kết quả mong đợi:

certificatesigningrequest.certificates.k8s.io/dev-nguyenvana approved
notAfter=Oct 3 07:30:00 2026 GMT

Bước 2.4: Phân quyền cho User/Group

Hành động:

kubectl create clusterrolebinding ${GROUP}-edit \
--clusterrole=edit \
--group=${GROUP}

Quyền gán theo Group (O=dev-team trong chứng chỉ), nên mọi thành viên cùng Group sẽ có chung quyền — không cần gán lại khi thêm người mới.


Bước 2.5: Tạo file kubeconfig

Hành động:

cat > kubeconfig-${USER_NAME}.yaml <<EOF
apiVersion: v1
kind: Config
clusters:
- name: my-fke-cluster
cluster:
certificate-authority-data: ${CA_B64}
server: ${SERVER}
contexts:
- name: ${USER_NAME}@my-fke-cluster
context:
cluster: my-fke-cluster
user: ${USER_NAME}
current-context: ${USER_NAME}@my-fke-cluster
users:
- name: ${USER_NAME}
user:
client-certificate-data: $(base64 -w 0 < ${USER_NAME}.crt)
client-key-data: $(base64 -w 0 < ${USER_NAME}.key)
EOF

Kết quả:

✅ File kubeconfig-dev-nguyenvana.yaml sẵn sàng giao cho thành viên. Có hiệu lực trong 30 ngày.

Gia hạn:

Khi chứng chỉ sắp hết hạn, lặp lại Bước 2.1 → 2.3 và 2.5 (phần phân quyền giữ nguyên vì CN/O không đổi). Có thể gia hạn bằng chính kubeconfig cũ (khi còn hạn) nếu user có quyền trên tài nguyên certificatesigningrequests.


Use Case 3: Tích hợp kubeconfig với hệ thống bên thứ ba

Sau khi có kubeconfig/token từ Use Case 1, tích hợp vào các hệ thống sau:


ArgoCD

Cách 1 — CLI:

argocd cluster add argocd-deployer@my-fke-cluster \
--kubeconfig kubeconfig-argocd-deployer.yaml

Cách 2 — Declarative (cluster Secret): Dùng bearerToken (giá trị TOKEN) và caData (giá trị CA_B64) trong Secret manifest.


Rancher (Import Cluster)

Hành động: Chạy lệnh import của Rancher với kubeconfig mới.

⚠️ Cần quyền cluster-admin (Mẫu A ở Bước 1.2) để cài Rancher agent.


Jenkins

Hành động:

  1. Vào JenkinsManage JenkinsCredentials
  2. Thêm credential mới loại Secret file, upload file kubeconfig-argocd-deployer.yaml
  3. Trong pipeline, sử dụng qua withKubeConfig hoặc biến môi trường KUBECONFIG

Vault (Kubernetes Auth Method)

Cấu hình:

Tham sốGiá trị
kubernetes_hostGiá trị SERVER
kubernetes_ca_certNội dung CA (decode từ CA_B64)
token_reviewer_jwtToken của ServiceAccount được gán ClusterRole system:auth-delegator

5. Interface Explanation — Các lệnh & tham số quan trọng

Lệnh / Tham sốMô tảVí dụ
kubectl create serviceaccountTạo tài khoản dịch vụ trong clusterkubectl create sa argocd-deployer -n kube-system
kubectl create clusterrolebindingGán quyền trên toàn cluster--clusterrole=cluster-admin
kubectl create rolebindingGán quyền trong một namespace-n app-dev --clusterrole=edit
kubectl create token --durationTạo token có thời hạn--duration=2160h (90 ngày)
kubectl auth whoamiXác nhận danh tính đang dùngTrả về tên ServiceAccount/User
kubectl auth can-iKiểm tra quyền cụ thểkubectl auth can-i create deployments
kubectl certificate approvePhê duyệt CSR (Phương án 2)kubectl certificate approve dev-nguyenvana
kubectl delete secretThu hồi token (xóa Secret)kubectl delete secret argocd-deployer-token
--clusterrole=cluster-adminToàn quyền clusterTương đương kubeconfig Portal
--clusterrole=viewChỉ đọc toàn clusterCho monitoring, dashboard
--clusterrole=editĐọc/ghi, không sửa RBACCho CI/CD, developer

6. System States — Các trạng thái kết quả

Trạng thái thành công

$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
fke-node-abc Ready <none> 10d v1.28.x

→ Kubeconfig hoạt động bình thường, kết nối ổn định.


Trạng thái lỗi: Unauthorized (401)

error: You must be logged in to the server (Unauthorized)

→ Token không hợp lệ hoặc đã bị thu hồi. Xem mục Xử lý sự cố.


Trạng thái lỗi: Forbidden (403)

Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:kube-system:argocd-deployer" 
cannot list resource "pods" in API group "" in the namespace "default"

→ ServiceAccount thiếu quyền RBAC cho tài nguyên/namespace này. Cần gán thêm quyền.


Trạng thái lỗi: Certificate Error

Unable to connect to the server: x509: certificate signed by unknown authority

→ Trường certificate-authority-data sai hoặc thiếu. Lấy lại từ kubeconfig Portal.


Trạng thái: Token tạo thành công

$ kubectl get secret argocd-deployer-token -n kube-system
NAME TYPE DATA AGE
argocd-deployer-token kubernetes.io/service-account-token 3 5s

→ Secret đã được tạo và hệ thống đã điền token. Sẵn sàng sử dụng.


7. Common Issues & Solutions

Vấn đềNguyên nhânGiải pháp
Lỗi Unauthorized (401) với token mới tạoSecret chưa được hệ thống điền xong; hoặc token copy thiếu/thừa ký tự xuống dòngĐợi 5–10 giây rồi lấy lại token; kiểm tra không có ký tự thừa khi copy
Lỗi Forbidden (403) khi truy cập tài nguyênThiếu quyền RBAC cho tài nguyên hoặc namespace đóKiểm tra: kubectl auth can-i --list --as=system:serviceaccount:<ns>:<sa-name>, rồi gán thêm quyền
Lỗi x509: certificate signed by unknown authoritycertificate-authority-data sai hoặc thiếu trong kubeconfigLấy lại CA_B64 từ kubeconfig Portal theo Bước CB-2
CSR đã Approved nhưng chưa có chứng chỉCluster chưa ký xongĐợi vài giây. Nếu lâu: kubectl get csr <tên> -o yaml — đảm bảo signerNamekubernetes.io/kube-apiserver-client
Chứng chỉ được cấp ngắn hơn thời hạn yêu cầuHệ thống giới hạn tối đa 30 ngàyBình thường — đây là giới hạn của cluster. Dùng Phương án 1 nếu cần dài hơn
Token (kubectl create token) ngắn hơn yêu cầuHệ thống giới hạn thời hạn tối đa cho loại token nàyChuyển sang Cách A (token không hết hạn qua Secret)
Kubeconfig ngừng hoạt động sau bảo trìCluster thực hiện xoay vòng chứng chỉ (certificate rotation)Kiểm tra lại CA_B64 và token; tạo lại nếu cần

8. Tips & Best Practices

Bảo mật

Việc cần làmChi tiết
Lưu token trong secret storeVault, Jenkins Credentials, GitLab CI/CD Variables — không lưu plain text
Không commit vào gitThêm kubeconfig-*.yaml vào .gitignore
Thu hồi ngay khi nghi ngờ lộkubectl delete secret ${SA_NAME}-token -n ${NAMESPACE} — token mất hiệu lực lập tức
Không gửi qua kênh không mã hóaKhông gửi token qua Slack, email plain text, hoặc chat

Quản lý

Việc cần làmChi tiết
Mỗi hệ thống một ServiceAccountKhông dùng chung — khi thu hồi sẽ không ảnh hưởng hệ thống khác
Gắn label cho mọi credentialkubectl label sa "$SA_NAME" -n "$NAMESPACE" managed-by=customer purpose=argocd
Ưu tiên quyền tối thiểuBắt đầu với view hoặc edit, chỉ dùng cluster-admin khi thực sự cần
Tự theo dõi danh sách credentialCác credential tự tạo không hiển thị trên Portal — bạn chịu trách nhiệm
Liệt kê credential đã tạokubectl get sa -l managed-by=customer --all-namespaces

Quy trình khuyến nghị

BướcHành động
1Tạo ServiceAccount + gắn label
2Gán quyền tối thiểu đủ dùng
3Lấy token (ưu tiên có thời hạn)
4Tạo kubeconfig → kiểm tra bằng kubectl auth can-i
5Import vào hệ thống đích
6Đặt lịch nhắc gia hạn (nếu token có thời hạn)

9. FAQ — Câu hỏi thường gặp

Kubeconfig tự tạo có bị ảnh hưởng khi tôi tải kubeconfig mới từ Portal không?
→ Không. Kubeconfig Portal và credential tự tạo hoạt động hoàn toàn độc lập, dùng song song được.

Kubeconfig tự tạo có dùng được sau khi nâng cấp Kubernetes?
→ Có. Nâng cấp phiên bản không làm mất ServiceAccount, token hay RBAC đã tạo.

Tôi có thể tạo bao nhiêu ServiceAccount?
→ Không giới hạn thực tế. Nên tạo có chủ đích, mỗi hệ thống một tài khoản, và thu hồi khi không dùng nữa.

Làm sao biết token đang dùng có quyền gì?
→ Chạy kubectl auth can-i --list với kubeconfig chứa token đó.

Khi cluster xoay vòng chứng chỉ (certificate rotation) thì sao?
→ Trường certificate-authority-data và token có thể cần cập nhật. Khi nhận thông báo bảo trì từ FPT Cloud, kiểm tra lại các kubeconfig tự tạo.

Khi xóa và tạo lại cluster thì sao?
→ Toàn bộ credential tự tạo mất theo cluster — cần chạy lại quy trình cho cluster mới.

Có thể gia hạn chứng chỉ (Phương án 2) mà không cần kubeconfig Portal không?
→ Có, nếu user được cấp quyền trên tài nguyên certificatesigningrequests — dùng kubeconfig cũ khi còn hạn để gia hạn.


Tài liệu thuộc FPT Managed Kubernetes Engine (M-FKE) — FPT Cloud.
Nếu gặp vấn đề, vui lòng liên hệ đội ngũ hỗ trợ FPT Cloud.