脚本一键生成管理下游k8s集群的kubeconfig

news2025/2/8 12:00:48

一、场景

1.1 需要管理下游k8s集群的场景。

1.2 不希望使用默认的cluster-admin权限的config.

二、脚本

**重点参数:

2.1 配置变量。
        1、有单独namespace的权限和集群只读权限。

        2、自签名的CA证书位置要正确。

2.2 如果配置错误,需要重新生成

进入集群删除CertificateSigningRequest对应的请求CSR

2.3 修改其中的Clusterrole可以修改权限。

2.4 注意每个集群的名称和用户名不能一致。

#!/bin/bash

# 配置变量
USERNAME="kody"
CLUSTER_NAME="rke2-01"
NAMESPACE="default"
PERMISSION_LEVEL="cluster-readonly"  # 可选 namespace 或 cluster-readonly
API_SERVER="https://172.31.0.32:6443"  # 指定API服务器地址
CA_CERT_PATH="/var/lib/rancher/rke2/server/tls/server-ca.crt"  # 指定CA证书路径

# 生成证书
openssl genrsa -out ${USERNAME}.key 2048
openssl req -new -key ${USERNAME}.key -out ${USERNAME}.csr -subj "/CN=${USERNAME}/O=my-group"

# 提交并批准 CSR
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: ${USERNAME}-csr
spec:
  request: $(cat ${USERNAME}.csr | base64 | tr -d '\n')
  signerName: kubernetes.io/kube-apiserver-client
  expirationSeconds: 86400
  usages:
  - client auth
EOF
kubectl certificate approve ${USERNAME}-csr
kubectl get csr ${USERNAME}-csr -o jsonpath='{.status.certificate}' | base64 -d > ${USERNAME}.crt

# 创建 RBAC 权限
if [ "$PERMISSION_LEVEL" == "namespace" ]; then
  cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: ${NAMESPACE}
  name: ${USERNAME}-role
rules:
- apiGroups: ["", "apps", "batch"]
  resources: ["pods", "deployments", "jobs", "services"]
  verbs: ["get", "list", "watch", "create", "update", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: ${USERNAME}-role-binding
  namespace: ${NAMESPACE}
subjects:
- kind: User
  name: ${USERNAME}
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: ${USERNAME}-role
  apiGroup: rbac.authorization.k8s.io
EOF
else
  cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: ${USERNAME}-readonly
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: ${USERNAME}-readonly-binding
subjects:
- kind: User
  name: ${USERNAME}
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: ${USERNAME}-readonly
  apiGroup: rbac.authorization.k8s.io
EOF
fi

# 生成 kubeconfig
kubectl config set-cluster ${CLUSTER_NAME} \
  --server=${API_SERVER} \
  --certificate-authority=${CA_CERT_PATH} \
  --embed-certs=true \
  --kubeconfig=${USERNAME}.kubeconfig

kubectl config set-credentials ${USERNAME} \
  --client-certificate=${USERNAME}.crt \
  --client-key=${USERNAME}.key \
  --embed-certs=true \
  --kubeconfig=${USERNAME}.kubeconfig

kubectl config set-context ${USERNAME}-context \
  --cluster=${CLUSTER_NAME} \
  --user=${USERNAME} \
  --namespace=${NAMESPACE} \
  --kubeconfig=${USERNAME}.kubeconfig

kubectl config use-context ${USERNAME}-context \
  --kubeconfig=${USERNAME}.kubeconfig

echo "完成!用户 ${USERNAME} 的 kubeconfig 文件: ${USERNAME}.kubeconfig"

三、测试

kubectl --kubeconfig=<生成的config> get pods

四、合并Kubeconfig文件

生成了的下游config使用下面的命名合并。

KUBECONFIG=~/.kube/config:/path/to/rke2-01.config:/path/to/rke2-02.config:/path/to/rke2-03.config kubectl config view --merge --flatten > ~/.kube/merged-config

例子:

cat ~/.kube/merged-config

五、切换

六、helm部署

helm install kafka appstore/kafka --set persistence.storageClass=longhorn --set persistence.size=3Gi  --namespace=kafka --set zookeeper.enabled=true --version=23.0.7 --set kraft.enabled=false --create-namespace --kube-context=kody-rke2-03-context 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2294766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

发布:大彩科技DN系列2.8寸高性价比串口屏发布!

一、产品介绍 该产品是一款2.8寸的工业组态串口屏&#xff0c;采用2.8寸液晶屏&#xff0c;分辨率为240*320&#xff0c;支持电阻触摸、电容触摸、无触摸。可播放动画&#xff0c;带蜂鸣器&#xff0c;默认为RS232通讯电平&#xff0c;用户短接屏幕PCB上J5短接点即可切换为TTL电…

简述mysql 主从复制原理及其工作过程,配置一主两从并验证

MySQL 主从复制原理及其工作过程 MySQL 主从复制&#xff08;Master-Slave Replication&#xff09;是一种数据同步技术&#xff0c;其中一个 MySQL 实例&#xff08;主库&#xff09;将其数据变更&#xff08;插入、更新、删除&#xff09;通过二进制日志&#xff08;Binary …

华北平原shp格式范围

华北平原是中国东部的重要地理区域&#xff0c;以下是对其的简要介绍&#xff1a; 此数据为付费数据&#xff0c;如有需求&#xff0c;请联系本人。 1. 地理位置与范围 位置&#xff1a;位于中国东部&#xff0c;西起太行山脉和伏牛山&#xff0c;东至黄海、渤海&#xff0c;北…

Unity 快速入门 1 - 界面操作

本项目将快速介绍 Unity 6的基本操作和功能&#xff0c;下载附件的项目&#xff0c;解压到硬盘&#xff0c;例如 D:\Unity Projects\&#xff0c; 注意整个文件路径中只有英文、空格或数字&#xff0c;不要有中文或其他特殊符合。 1. 打开Unity Hub&#xff0c;点击右上角的 O…

网站改HTTPS方法

默认的网站建设好后打开的样子那看起来像是钓鱼网站&#xff0c;现在的浏览器特别只能&#xff0c;就是你新买来的电脑默认的浏览器同样也会出现这样“不安全”提示。 传输协议启动了向全球用户安全传输网页内容的流程。然而&#xff0c;随着HTTPS的推出&#xff0c;传输协议通…

采用idea中的HTTP Client插件测试

1.安装插件 采用idea中的HTTP Client插件进行接口测试,好处是不用打开post/swagger等多个软件,并且可以保存测试时的参数,方便后续继续使用. 高版本(2020版本以上)的idea一般都自带这个插件,如果没有也可以单独安装. 2.使用 插件安装完成(或者如果idea自带插件),会在每个Con…

记录 | WPF基础学习Style局部和全局调用

目录 前言一、Style1.1 例子1.2 为样式起名字1.3 BasedOn 继承上一个样式 二、外部StyleStep1 创建资源字典BaseButtonStyle.xamlStep2 在资源字典中写入StyleStep3 App.xaml中写引用路径【全局】Step4 调用三、代码提供四、x:Key和x:Name区别 更新时间 前言 参考文章&#xff…

【STM32】HAL库USB虚拟U盘MSC配置及采用自带的Flash作为文件系统

【STM32】HAL库USB虚拟U盘MSC实现配置及采用自带的Flash作为文件系统 本文将自带的Flash作为文件系统 通过配置USB的MSC功能实现虚拟U盘 没有单独建立FATFS文件系统 仅仅是配置USB和Flash读写而已 当然 这里也可以用外部Flash等等 也可以配置文件系统来进行套壳 但总体而言不如…

深浅拷贝~

深浅拷贝&#xff1a;直接赋值给的是地址&#xff0c;如果修改赋值后的变量&#xff0c;实际上连同原变量的值一并修改了。 浅拷贝 展开运算符 {...obj} 拷贝对象 Object.assign(新&#xff0c;旧) 深拷贝 递归&#xff1a;自己调用自己 以下实际是浅拷贝 递归调用处理数组问题…

开源项目介绍-词云生成

开源词云项目是一个利用开源技术生成和展示词云的工具或框架&#xff0c;广泛应用于文本分析、数据可视化等领域。以下是几个与开源词云相关的项目及其特点&#xff1a; Stylecloud Stylecloud 是一个由 Maximilianinir 创建和维护的开源项目&#xff0c;旨在通过扩展 wordclou…

Zookeeper是如何解决脑裂问题的?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper是如何解决脑裂问题的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Zookeeper是如何解决脑裂问题的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper 通过多种机制来解决脑裂&…

算法13(力扣225)-用队列实现栈

1、问题 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。 int pop() 移除并返回栈顶元素。…

【Elasticsearch】文本分类聚合Categorize Text Aggregation

响应参数讲解: key &#xff08;字符串&#xff09;由 categorization_analyzer 提取的标记组成&#xff0c;这些标记是类别中所有输入字段值的共同部分。 doc_count &#xff08;整数&#xff09;与类别匹配的文档数量。 max_matching_length &#xff08;整数&#xff09;从…

【redis】缓存设计规范

本文是 Redis 键值设计的 14 个核心规范与最佳实践&#xff0c;按重要程度分层说明&#xff1a; 一、通用数据类型选择 这里我们先给出常规的选择路径图。 以下是对每个步骤的分析&#xff1a; 是否需要排序&#xff1f;&#xff1a; zset&#xff08;有序集合&#xff09;用…

2025简约的打赏系统PHP网站源码

源码介绍 2025简约的打赏系统PHP网站源码 源码上传服务器&#xff0c;访问域名/install.php安装 支持自定义金额打赏 集成支付宝当面付 后台管理系统 订单记录查询 效果预览 源码获取 2025简约的打赏系统PHP网站源码

交叉编译工具链下载和使用

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

BUU28 [GXYCTF2019]BabySQli1

常规万能密码&#xff0c;发现登不上去 过滤掉了or&#xff0c;&#xff0c;当尝试了n种方法以后&#xff0c;最关键的是发现()居然也被过滤了 哈哈&#xff0c;那玩个淡&#xff0c; 再搜wp&#xff01;&#xff01; 当输入admin的时候&#xff0c;提示密码错误&#xff0…

ubuntu20.04+RTX4060Ti大模型环境安装

装显卡驱动 这里是重点&#xff0c;因为我是跑深度学习的&#xff0c;要用CUDA&#xff0c;所以必须得装官方的驱动&#xff0c;Ubuntu的附件驱动可能不太行. 进入官网https://www.nvidia.cn/geforce/drivers/&#xff0c;选择类型&#xff0c;最新版本下载。 挨个运行&#…

Rust语言进阶之标准输入: stdin用法实例(一百零五)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

5G技术解析:从核心概念到关键技术

1. 引言 5G技术的迅猛发展正在重塑我们的生活方式和社会结构。它不仅仅是新一代的移动通信技术&#xff0c;更是一场深刻的技术革命。5G网络正在以其惊人的高速、低延迟和大带宽能力&#xff0c;为智能家居、自动驾驶、工业自动化、远程医疗等另一带来前所未有的可能性。 本文…