创建限定命名空间的kubeconfig文件

2025-07-30 17:57:00
丁国栋
原创 12
摘要:本文记录如何创建一个限定命名空间的kubeconfig文件来管理集群上的资源。

在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

参见:

发表评论
博客分类