前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【K8s】Kubernetes 生成特定 Kubeconfig 文件

【K8s】Kubernetes 生成特定 Kubeconfig 文件

作者头像
行者Sun
发布2024-09-02 12:47:05
2460
发布2024-09-02 12:47:05
举报
文章被收录于专栏:Kubernetes

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

如果对您有帮助,烦请点赞、关注、转发!如果您有其他想要了解的,欢迎私信联系我~

背景介绍

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

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

基本概念

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

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

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

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

生成流程

1、创建密钥

代码语言:javascript
复制
openssl genrsa -out demo-user.key 2048

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

代码语言:javascript
复制
openssl req -new -key demo-user.key -out demo-user.csr -subj "/CN=demo-user/O=demo-group"
 
🔔 demo-user:用户名
🔔 demo-group:组

3、提交 CSR

代码语言:javascript
复制
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、生成证书

代码语言:javascript
复制
kubectl certificate approve demo-user

5、导出证书

代码语言:javascript
复制
kubectl get certificatesigningrequests/demo-user -o jsonpath='{.status.certificate}' | openssl base64 -d -A > demo-user.crt

6、删除文件

代码语言:javascript
复制
# 删除 CSR
rm -rf demo-user.csr
 
# 删除证书
kubectl delete certificatesigningrequests/demo-user

7、生成 Kubeconfig

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

代码语言:javascript
复制
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、创建命名空间

代码语言:javascript
复制
kubectl create namespace demo-user

9、创建 admin 角色

代码语言:javascript
复制
kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: demo-user
  name: admin
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
EOF

10、创建角色绑定

代码语言:javascript
复制
# 将 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、测试权限

代码语言:javascript
复制
# 查看当前命名空间 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

常用命令

代码语言:javascript
复制
# 查看所有上下文
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
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-08-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 实施运维知识交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档