一键生成基于 ServiceAccount 的 Kubernetes kubeconfig 文件

基于 ServiceAccount 的 kubeconfig 具有与 ServiceAccount 相同的权限,可以灵活地通过 ClusterRoleBinding 和/或 RoleBinding 进行权限控制,以及方便地进行账户吊销,本文介绍基于 ServiceAccount 快速生成 kubeconfig 文件的方法。

1. 准备 ServiceAccount

# 创建 ServiceAccount(例如 admin-user)
kubectl create sa admin-user -n kube-system

# 检查对应的 Secret 是否被自动创建
kubectl get secret -n kube-system admin-user
# 如果不存在,则需要手动创建 Secret(>=1.24 版本的 K8s 不再自动创建 Secret)
# 注意修改 kubernetes.io/service-account.name 为对应的 ServiceAccount 名字,这里即为 admin-user
# Secret 的 name 和 namespace 与 ServiceAccount 保持一致
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: admin-user
  namespace: kube-system
  annotations:
    kubernetes.io/service-account.name: admin-user
type: kubernetes.io/service-account-token
EOF

# 为 ServiceAccount 绑定权限(这里以绑定最高权限 cluster-admin 为例)
kubectl create clusterrolebinding admin-user --clusterrole=cluster-admin --serviceaccount=kube-system:admin-user

执行完上述操作,ServiceAccount 就准备好了

2. 生成 kubeconfig 文件

创建 generate-kubeconfig.sh 脚本,内容如下:

#!/bin/bash

# 开启错误捕获和显示
set -e
trap 'echo "Error occurred at line $LINENO while executing command: $BASH_COMMAND"' ERR

# 参数校验
if [ "$#" -ne 3 ]; then
    echo "Usage: $0 <serviceaccount-name> <namespace> <output-file>"
    exit 1
fi

SERVICE_ACCOUNT_NAME=$1
NAMESPACE=$2
OUTPUT_FILE=$3

# 获取当前上下文和集群名称
CURRENT_CONTEXT=$(kubectl config current-context)
CLUSTER_NAME=$(kubectl config get-contexts "$CURRENT_CONTEXT" | awk '{print $3}' | tail -n 1)

# 获取集群 API server 地址
SERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')

# 获取 ServiceAccount 的 Secret 名称,直接使用 SERVICE_ACCOUNT_NAME
SECRET_NAME=$SERVICE_ACCOUNT_NAME

# 获取 Token 和 CA 证书数据
TOKEN=$(kubectl get secret "$SECRET_NAME" -n "$NAMESPACE" -o jsonpath='{.data.token}' | base64 --decode)
CA_DATA=$(kubectl get secret "$SECRET_NAME" -n "$NAMESPACE" -o jsonpath='{.data.ca\.crt}')

# 创建 kubeconfig 文件
cat <<EOF > "$OUTPUT_FILE"
apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority-data: "$CA_DATA"
    server: "$SERVER"
  name: "$CLUSTER_NAME"
contexts:
- context:
    cluster: "$CLUSTER_NAME"
    user: "$SERVICE_ACCOUNT_NAME"
    namespace: "$NAMESPACE"
  name: "$SERVICE_ACCOUNT_NAME@$CLUSTER_NAME"
current-context: "$SERVICE_ACCOUNT_NAME@$CLUSTER_NAME"
users:
- name: "$SERVICE_ACCOUNT_NAME"
  user:
    token: "$TOKEN"
EOF
echo "Kubeconfig file has been written to $OUTPUT_FILE"

执行上述脚本,生成 kubeconfig:

用法参数列表:

generate-kubeconfig.sh [serviceaccount-name] [namespace] [output-file]

例如,本例即为:

bash generate-kubeconfig.sh admin-user kube-system admin-user-kubeconfig

3. 验证生成的 kubeconfig

kubectl get node --kubeconfig admin-user-kubeconfig

OUTPUT EXAMPLE:
NAME                 STATUS   ROLES           AGE     VERSION
1.28-control-plane   Ready    control-plane   5d22h   v1.28.0

4. 如何吊销该 kubeconfig

4.1 暂时禁用权限

可以通过删除 ServiceAccount 关联的 clusterrolebinding 禁用权限:

kubectl delete clusterrolebinding admin-user

kubeconfig 还能连接集群,但执行操作会报权限不足的错误:

kubectl get node --kubeconfig admin-user-kubeconfig

OUTPUT ERROR EXAMPLE:
Error from server (Forbidden): nodes is forbidden: User "system:serviceaccount:kube-system:admin-user" cannot list resource "nodes" in API group "" at the cluster scope

此种方式,可以暂时下掉用户权限,需要恢复时再创建 clusterrolebinding 恢复即可

4.2 完全禁止访问(永久)

可以通过删除 ServiceAccount 禁止访问:

kubectl delete sa admin-user -n kube-system

旧的 kubeconfig 已无法通过鉴权:

kubectl get node --kubeconfig admin-user-kubeconfig

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

此种方式难以再恢复旧的 kubeconfig,属于永久删除,使用时需要重新生成新的 kubeconfig 文件。

附加 (基于 kubeadm 的方式)

使用 kubeadm 工具可以生成基于客户端证书鉴权的 kubeconfig 文件

例如生成 admin.conf 文件:

kubeadm kubeconfig user --client-name=kubernetes-admin --org system:masters > admin.conf

注意,上述命令生成的 kubeconfig 使用了 system:masters 特权组,不支持吊销,永久有效,不要泄漏!!!

可以通过使用 clusterrolebinding 的方式为 User 绑定权限,从而支持权限吊销,例如:

kubectl create clusterrolebinding foo-user --clusterrole=cluster-admin --user=foo-user
kubeadm kubeconfig user --client-name=foo-user > foo-user-kubeconfig

生成的 foo-user-kubeconfig 的样式如下,采用 client 证书鉴权:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: XXXXX
    server: https://172.18.0.2:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: foo-user
  name: foo-user@kubernetes
current-context: foo-user@kubernetes
kind: Config
preferences: {}
users:
- name: foo-user
  user:
    client-certificate-data: XXXXX
    client-key-data: XXXXX

验证 foo-user-kubeconfig 有效:

kubectl get node --kubeconfig foo-user-kubeconfig 

OUTPUT EXAMPLE:
NAME                 STATUS   ROLES           AGE     VERSION
1.28-control-plane   Ready    control-plane   5d22h   v1.28.0

吊销时,可以直接删除 clusterrolebinding,下掉权限即可:

kubectl delete clusterrolebinding foo-user

验证权限已被吊销:

kubectl get node --kubeconfig foo-user-kubeconfig 
Error from server (Forbidden): nodes is forbidden: User "foo-user" cannot list resource "nodes" in API group "" at the cluster scope
### Ubuntu 上搭建 Kubernetes 集群并部署 KubeSphere 平台 #### 准备工作 为了确保顺利安装,在开始之前需确认系统环境已准备好。对于Ubuntu系统,建议先更新软件源列表并升级现有包。 ```bash sudo apt-get update && sudo apt-get upgrade -y ``` #### 安装 CRI-Dockerd 由于Kubernetes不再支持原生Docker作为容器运行时,因此需要安装`cri-dockerd`来兼容旧版应用[^2]。 1. 下载适用于Ubuntu系统的`.deb`包: ```bash wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd_0.3.4.3-0.ubuntu-focal_amd64.deb ``` 2. 使用 `dpkg` 命令完成安装: ```bash sudo dpkg -i cri-dockerd_0.3.4.3-0.ubuntu-focal_amd64.deb ``` 3. 修改服务启动参数以适应CNI网络插件的要求: ```bash sudo sed -i -e 's#ExecStart=.*#ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint unix:///var/run/cri-dockerd.sock --network-plugin cni#g' /lib/systemd/system/cri-docker.service ``` 4. 启动并启用该服务: ```bash sudo systemctl daemon-reload sudo systemctl enable cri-dockerd sudo systemctl start cri-dockerd ``` #### 初始化 Kubernetes 主节点 接下来按照官方文档指导进行主控节点初始化操作。这里假设读者已经熟悉了基本概念以及相关命令行工具的使用方法。 ```bash sudo kubeadm init --pod-network-cidr=10.244.0.0/16 ``` 此过程会生成一系列用于加入其他worker节点所需的token信息,请妥善保存以便后续步骤中使用。 #### 设置kubectl认证配置 为了让当前用户能够管理新创建出来的集群,还需要复制管理员证书到默认路径下,并设置相应的环境变量。 ```bash mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` #### 安装 Pod 网络附加组件 (Flannel) 只有当Pod之间可以互相通信之后才能继续下一步骤;推荐采用Calico或Weave Net等方案实现跨主机间的Layer 2/Layer 3连通性。 ```bash kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml ``` 等待几分钟直到所有核心组件都处于正常状态(`Running`)为止。 #### 部署 KubeSphere 控制面板 现在万事俱备只欠东风——通过YAML定义文件一键式安装企业级PaaS平台! 1. 创建必要的命名空间和服务账户对象: ```yaml apiVersion: v1 kind: Namespace metadata: name: kubesphere-system --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: ks-admin-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: default namespace: kubesphere-system ``` 2. 应用上述资源描述符至目标环境中: ```bash kubectl apply -f - ``` 3. 获取最新的稳定发行版本号: ```bash export VERSION=$(curl -L -s https://get.kubesphere.io/simple | grep "latest version" | awk '{print $NF}') echo ${VERSION} ``` 4. 执行实际安装动作: ```bash ./kk create config --with-kubesphere=${VERSION} config-sample.yaml kubectl apply -f kk/kustomize/ ``` 5. 实时跟踪整个流程的状态变化情况: ```bash watch kubectl get pods -n kubesphere-system ``` 一旦看到所有的Pod均进入就绪阶段,则表示成功完成了全部准备工作。此时可以通过浏览器访问<http://Master_IP:30080>页面来进行图形化的向导式体验啦!默认超级管理员账号为admin/Kuboard123[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值