背景与痛点分析
在AWS EKS环境中,默认的kubeconfig文件是动态生成的,依赖于IAM身份验证。这种机制虽然安全,但在某些场景下(如CI/CD流水线、第三方工具集成等)需要创建静态的、具有管理员权限的Kubernetes凭证。本文将详细介绍如何在EKS集群中创建永久有效的ServiceAccount Token,并生成稳定的kubeconfig文件。
方案概述
本方案通过以下步骤实现目标:
-
创建专用命名空间
-
创建ServiceAccount
-
绑定集群管理员权限
-
生成永久Token
-
构建kubeconfig文件
流程图
详细实施步骤
方法一:命令行快速创建
1. 创建专用命名空间
kubectl create ns vela-system
2. 创建ServiceAccount
kubectl create sa kubevela-vela-core -n vela-system
3. 绑定集群管理员权限
kubectl create clusterrolebinding default-sa-vela \
--clusterrole=cluster-admin \
--serviceaccount=vela-system:kubevela-vela-core
4. 生成临时Token(用于测试)
如果没有特别配置,kubectl create token
生成的 Token 有效期默认为 24 小时。这意味着 Token 在创建后的 24 小时内有效,之后将失效
kubectl create token kubevela-vela-core -n vela-system
5. 创建永久Token Secret
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: kubevela-vela-core-token
namespace: vela-system
annotations:
kubernetes.io/service-account.name: kubevela-vela-core
EOF
6. 获取Token值
kubectl describe secret kubevela-vela-core-token -n vela-system
7、配置kubeconfig
apiVersion: v1
kind: Config
clusters:
- cluster:
certificate-authority-data: BASE64ENCODED_JWT_TOKEN_NO_PREFIX
server: https://YOUR_KUBERNETES_API_SERVER
name: my-cluster
contexts:
- context:
cluster: my-cluster
user: my-user
name: my-context
current-context: my-context
users:
- name: my-user
user:
token: YOUR_SERVICE_ACCOUNT_TOKEN(把上面创建token的输出复制到此处)
方法二:YAML声明式创建(推荐)
# 创建命名空间
apiVersion: v1
kind: Namespace
metadata:
name: vela-system
labels:
app.kubernetes.io/name: vela-system
app.kubernetes.io/instance: vela-core
---
# 创建ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: kubevela-vela-core
namespace: vela-system
labels:
app.kubernetes.io/name: kubevela-vela-core
app.kubernetes.io/instance: vela-core
---
# 绑定集群管理员角色
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubevela-admin-binding
labels:
app.kubernetes.io/name: kubevela-admin-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubevela-vela-core
namespace: vela-system
---
# 创建永久Token Secret
apiVersion: v1
kind: Secret
metadata:
name: kubevela-vela-core-token
namespace: vela-system
annotations:
kubernetes.io/service-account.name: kubevela-vela-core
labels:
app.kubernetes.io/name: kubevela-token
type: kubernetes.io/service-account-token
# 执行方法一的第七步 ---> 7、配置kubeconfig