创建限定命名空间的kubeconfig文件
- 2025-07-30 17:57:00
- 丁国栋
- 原创 12
在K8S、K3s中创建限定命名空间的kubeconfig文件来管理集群上的资源,需要完成以下步骤:
1. 创建ServiceAccount
首先,为特定命名空间创建一个ServiceAccount:
kubectl create serviceaccount <service-account-name> -n <namespace-name>
2. 创建Role和RoleBinding
然后,创建一个Role定义权限,并将其绑定到ServiceAccount:
正是这个Role决定了ServiceAccount能做什么,它有哪些权限。
# 创建Role
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: namespace-admin
namespace: <namespace-name>
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
EOF
# 创建RoleBinding
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: namespace-admin-binding
namespace: <namespace-name>
subjects:
- kind: ServiceAccount
name: <service-account-name>
namespace: <namespace-name>
roleRef:
kind: Role
name: namespace-admin
apiGroup: rbac.authorization.k8s.io
EOF
3. 获取ServiceAccount的token
# 获取secret名称
SECRET_NAME=$(kubectl get serviceaccount <service-account-name> -n <namespace-name> -o jsonpath='{.secrets[0].name}')
# 获取token
TOKEN=$(kubectl get secret $SECRET_NAME -n <namespace-name> -o jsonpath='{.data.token}' | base64 --decode)
注意: 某些 Kubernetes 版本(例如 1.24+)不再自动为 ServiceAccount 创建关联的 Secret,需要手动为 ServiceAccount 创建 Token。
如果 kubectl get serviceaccount <service-account-name> -n <namespace-name> -o yaml
仍然没有显示 secrets
字段,说明 Kubernetes(或 K3s)没有自动为这个 ServiceAccount 创建关联的 Secret。
使用 kubectl create token
在 Kubernetes 1.24+ 和 K3s 中,ServiceAccount
不再自动生成 secrets
,而是改用 临时 Token(通过 TokenRequest
API)。
可以直接用 kubectl create token
获取 Token,而无需依赖 secrets
:
# 获取 Token(默认有效期 1 小时)
TOKEN=$(kubectl create token <service-account-token> -n <namespace-name>)
# 获取长期 Token(例如 1 年)
TOKEN=$(kubectl create token <service-account-token> -n <namespace-name> --duration=8760h)
# 查看 Token
echo $TOKEN
4. 创建kubeconfig文件
# 获取集群信息
CLUSTER_NAME=$(kubectl config view --flatten -o jsonpath='{.clusters[0].name}')
APISERVER=$(kubectl config view --flatten -o jsonpath='{.clusters[0].cluster.server}')
# 创建kubeconfig
cat <<EOF > restricted-kubeconfig.yaml
apiVersion: v1
kind: Config
clusters:
- name: ${CLUSTER_NAME}
cluster:
certificate-authority-data: $(kubectl config view --flatten -o jsonpath='{.clusters[0].cluster.certificate-authority-data}')
server: ${APISERVER}
users:
- name: <service-account-name>
user:
token: ${TOKEN}
contexts:
- name: <service-account-name>-context
context:
cluster: ${CLUSTER_NAME}
user: <service-account-name>
namespace: <namespace-name>
current-context: <service-account-name>-context
EOF
5. 验证kubeconfig
kubectl --kubeconfig=restricted-kubeconfig.yaml get pods -n <namespace-name> # 应该能正常工作
kubectl --kubeconfig=restricted-kubeconfig.yaml get pods -n default # 应该被拒绝
附:安装 kubectl 工具
以下操作可能需要访问互联网,需要提前做好网络配置。
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
echo "$(cat kubectl.sha256) kubectl" | sha256sum --check
参见:
发表评论