【K8s】专题十:Kubernetes 生成特定 Kubeconfig 文件

本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发、订阅专栏!


专栏订阅入口

Linux 专栏 | Docker 专栏 | Kubernetes 专栏


往期精彩文章

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法(续)

【Docker】MySQL 源码构建 Docker 镜像(基于 ARM 64 架构)


目录

一、背景介绍

二、基本概念

三、生成流程

1、创建密钥

2、创建 CSR(证书签名申请)

3、提交 CSR

4、生成证书

5、导出证书

6、删除文件

7、生成 Kubeconfig

8、创建命名空间

9、创建 admin 角色

10、创建角色绑定

11、测试功能

四、常用命令


一、背景介绍

默认情况下,Kubernetes 集群原始的 Kubeconfig 文件,可以管理所有命名空间下的资源。但在实际情况中,如果 Kubernetes 集群被提供给多个项目组使用时,则需要将项目成员的资源管理权限限制在特定命名空间下,以防止其误操作不属于自己的项目环境。

本文将介绍一种只能管理特定命名空间的 Kubeconfig 文件的生成方法。


二、基本概念

Kubeconfig 是 Kubernetes 集群的配置文件,它允许用户通过命令行工具 kubectl 与 Kubernetes 集群进行交互。

Kubeconfig 文件默认位于用户家目录下的 .kube/config 文件,也可以指定其他路径。

Kubeconfig 文件是一个 YAML 格式的文件,它包含以下主要内容:

  • clusters:包含集群信息,如 API 服务器地址
  • users:包含用户认证信息,如用户名、密码或证书
  • contexts:定义了集群、用户和命名空间的上下文组合,用于快速切换不同的环境配置
  • current-context:指定当前使用的上下文


三、生成流程
1、创建密钥
openssl genrsa -out demo-user.key 2048
2、创建 CSR(证书签名申请)
openssl req -new -key demo-user.key -out demo-user.csr -subj "/CN=demo-user/O=demo-group"

🔔 demo-user:用户名
🔔 demo-group:组

3、提交 CSR
kubectl apply -f - <<EOF
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: demo-user
spec:
  groups:
  - system:authenticated
  request: $(openssl base64 -e -A < demo-user.csr)
  signerName: kubernetes.io/kube-apiserver-client
  usages:
  - client auth
EOF

4、生成证书
kubectl certificate approve demo-user

5、导出证书
kubectl get certificatesigningrequests/demo-user -o jsonpath='{.status.certificate}' | openssl base64 -d -A > demo-user.crt

6、删除文件
# 删除 CSR
rm -rf demo-user.csr

# 删除证书
kubectl delete certificatesigningrequests/demo-user

7、生成 Kubeconfig

通过 Python 脚本生成,需要在环境中提前安装 Python3。

kubectl config view --raw -o json | python3 -c '
import base64
import json
import sys

user_name = "demo-user"
with open(user_name + ".key") as f:
    ckd = base64.b64encode(f.read().encode()).decode()
with open(user_name + ".crt") as f:
    ccd = base64.b64encode(f.read().encode()).decode()

config = json.loads(sys.stdin.read())
for context in config["contexts"]:
    if context["name"] == config["current-context"]:
        context = context["context"]
        break
else:
    assert False
for cluster in config["clusters"]:
    if cluster["name"] == context["cluster"]:
        cluster = cluster["cluster"]
        break
else:
    assert False
sys.stdout.write(
    """\
apiVersion: v1
kind: Config
current-context: default
contexts:
- name: default
  context:
    cluster: default
    user: {user_name}
    namespace: {user_name}
clusters:
- name: default
  cluster:
    server: {s}
    certificate-authority-data: {cad}
users:
- name: {user_name}
  user:
    client-key-data: {ckd}
    client-certificate-data: {ccd}
""".format(
        user_name=user_name,
        s=cluster["server"],
        cad=cluster["certificate-authority-data"],
        ckd=ckd,
        ccd=ccd,
    )
)
' > demo-user.kubeconfig

8、创建命名空间
kubectl create namespace demo-user

9、创建 admin 角色
kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: demo-user
  name: admin
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
EOF

10、创建角色绑定
# 将 admin 角色绑定到 demo-user 用户上
kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: demo-user
  name: demo-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: demo-user
EOF

11、测试权限
# 查看当前命名空间 Pod 资源
KUBECONFIG=./demo-user.kubeconfig kubectl get pod
输出:No resources found in demo-user namespace

# 查看全部命名空间 Pod 资源,提示无权限
KUBECONFIG=./demo-user.kubeconfig kubectl get pod -A
输出:Error from server (Forbidden): pods is forbidden: User "demo-user" cannot list resource "pods" in API group "" at the cluster scope


四、常用命令
# 查看所有上下文
kubectl config get-contexts

# 查看当前上下文
kubectl config current-context

# 切换上下文
kubectl config use-context <context-name>

# 指定上下文
# 方式一:通过环境变量指定
KUBECONFIG=<kubeconfig-name> kubectl get pod
# 方式二:通过命令参数指定
kubectl --kubeconfig=<kubeconfig-name> get pod

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行者Sun1989

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值