k8s设置多个Context环境

本文详细介绍了如何在K8s环境中创建多个Context运行环境,以便管理不同的集群和实现权限控制。通过生成和验证用户证书,设置Context、Cluster和用户绑定,并创建角色与角色绑定,确保用户只能访问和操作指定的资源。最后,将配置的kubeconfig文件发送到客户端,实现客户端的权限管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

目的

一、k8s创建Context运行环境

二、实际操作演示

三、将config发送到安装有kubectl命令行的指定客户端


目的

        配置个多个Context运行环境,既可以通过不同的运行环境来管理不同的k8s集群;同时也可以通过不同的Context运行环境实现权限的管理。

        这里我以同一个k8s集群设置不同的Context运行环境,并设置特定的权限,给相关的开发人员使用。给开发人员操作k8s集群的指定命名空间的指定资源,或者多个命名空间的指定资源。

一、k8s创建Context运行环境

1、创建deploy用户

                关键要点: 先生成私钥;再使用私钥并指定相关信息,生成请求文件;最后使用ca对请求文件完成ca自签,生成ca颁发的用户证书(ca为k8s集群的根证书和根私钥文件)

mkdir deploy 
cp /etc/kubernetes/pki/{ca.crt,ca.key} deploy/
cd deploy 
openssl genrsa  -out deploy.key 2048
openssl req -new -key deploy.key -out deploy.csr -subj "/O=kubernetes/CN=deploy"
openssl  x509 -req -in deploy.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out deploy.crt -days 36500

       说明:

               CN=deploy 表示创建的认证用户为 deploy ,后续要使用该用户进行k8s权限绑定,是是否能通过认证的关键点

2、验证证书命令

# 验证生成的正式是否成功,输出 OK 表示证书创建成功可用
openssl verify -CAfile ca.crt deploy.crt

# 查看证书 内容 
openssl x509 -in deploy.crt -noout -text

3、k8s设置 context 运行环境

     将指定的deploy用户、指定的context和指定cluster绑定,建议指定新的kubeconfig文件为config,要不然会修改到默认的 kubeconfig文件;指定运行文件集群信息和用户认证信息(默认--kubeconfig=/root/.kube/config)

# 说明:--embed-certs=true 表示不在配置文件中显示证书信息;(--embed-certs为true表示将--certificate-authority证书写入到kubeconfig中)

kubectl config set-cluster deploy --server=https://lb.kubesphere.local:6443 --certificate-authority=ca.crt --embed-certs=true --kubeconfig=config
kubectl config set-credentials deploy --client-certificate=deploy.crt --client-key=deploy.key --embed-certs=true --kubeconfig=config
kubectl config set-context deploy --cluster=deploy --user=deploy --namespace=rc-saas --kubeconfig=config

4、切换contexts

        不切换contexts ,直接使用生成的kubecofnig文件会提示报错:The connection to the server localhost:8080 was refused

# 看看当前的 Context 运行环境
kubectl config get-contexts --kubeconfig=config

# 切换 Context运行环境为 前面设置的  deploy 运行环境
kubectl config use-context deploy --kubeconfig=config

5、验证运行环境

# 这个时候不成功是因为没有进行权限绑定,需要创建 role或者ClusterRole 并且进行权限绑定相应用户

kubectl get pod

6、创建集群角色或者角色,完成角色权限操作需求

        要点:创建角色或者集群角色,并指定指定资源的指定操作权限,并完成用户和角色绑定

# 创建 deploy-role角色,并且授权为可以执行rc-saas命名空间的 deployments 类型的资源的所有操作 

kubectl create role deploy-role --verb="*" --resource=deployments/"*"  -n rc-saas

# 将创建角色绑定;实现将 deploy 用户和 deploy-role 角色绑定 
# clusterrole 不区分命名空间,role: 区分命名空间,需要指定命名空间
kubectl create rolebinding deploy-rolebinding  --role=deploy-role --user=deploy -n rc-saas

7、拷贝新建的kubeconfig文件    

将在deploy目录下生成的的config文件复制到指定的安装有kubectl 的客户端

kubectl 只能操作绑定角色指定的资源和动作

如: 上边的角色资源包括了 命名空间 rc-saas 所有的资源操作,但是无法查看或者查看rc-saas命名空间之外的 资源。

二、实际操作演示

[root@master01 ~]# 
[root@master01 ~]# # 创建deploy目录
[root@master01 ~]# mkdir deploy 
[root@master01 ~]# 
[root@master01 ~]# # 将 k8s 的证书和私钥复制到deploy目录
[root@master01 ~]# cp /etc/kubernetes/pki/{ca.crt,ca.key} deploy/
[root@master01 ~]# 
[root@master01 ~]# # 创建deploy用户的私钥
[root@master01 ~]# cd deploy
[root@master01 deploy]# openssl genrsa  -out deploy.key 2048
Generating RSA private key, 2048 bit long modulus
..............................+++
.................................+++
e is 65537 (0x10001)
[root@master01 deploy]# 
[root@master01 deploy]# # 创建deploy用户的请求文件
[root@master01 deploy]# openssl req -new -key deploy.key -out deploy.csr -subj "/O=kubernetes/CN=deploy"
[root@master01 deploy]# 
[root@master01 deploy]# # 使用 k8s ca证书和私钥签证,生成deploy可信的证书,证书过期时间为:36500天
[root@master01 deploy]# openssl  x509 -req -in deploy.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out deploy.crt -days 36500
Signature ok
subject=/O=kubernetes/CN=deploy
Getting CA Private Key
[root@master01 deploy]# 
[root@master01 deploy]# # 校验生成的deploy;校验证书内容命令为:openssl x509 -in deploy.crt -noout -text;证书内容过长,这里不执行了 
[root@master01 deploy]# openssl verify -CAfile ca.crt deploy.crt
deploy.crt: OK
[root@master01 deploy]# 
[root@master01 deploy]# # 设置Context运行环境集群名为:deploy;请替换server为你的 kube-apiserver地址;kubeconfig文件名为:config
[root@master01 deploy]# kubectl config set-cluster deploy --server=https://lb.kubesphere.local:6443 --certificate-authority=ca.crt --embed-certs=true --kubeconfig=config
Cluster "deploy" set.
[root@master01 deploy]# 
[root@master01 deploy]# # 设置context运行环境用户,将deploy用户的证书和私钥 和 运行环境绑定
[root@master01 deploy]# kubectl config set-credentials deploy --client-certificate=deploy.crt --client-key=deploy.key --embed-certs=true --kubeconfig=config
User "deploy" set.
[root@master01 deploy]# 
[root@master01 deploy]# # 设置context运行环境信息:用户:deploy 集群cluster:deploy 默认命名空间:rc-saas
[root@master01 deploy]# kubectl config set-context deploy --cluster=deploy --user=deploy --namespace=rc-saas --kubeconfig=config
Context "deploy" created.
[root@master01 deploy]# 
[root@master01 deploy]# # 查看使用的当前context运行环境情况(由于还没切换,context为空)
[root@master01 deploy]# kubectl config get-contexts --kubeconfig=config
CURRENT   NAME     CLUSTER   AUTHINFO   NAMESPACE
          deploy   deploy    deploy     rc-saas
[root@master01 deploy]# 
[root@master01 deploy]# # 由于当前使用的context为空,使用kubectl 获取资源 会报错
[root@master01 deploy]# kubectl get po -n rc-saas --kubeconfig=config
The connection to the server localhost:8080 was refused - did you specify the right host or port?
[root@master01 deploy]# 
[root@master01 deploy]# # 切换当前使用context为deploy
[root@master01 deploy]# kubectl config use-context deploy --kubeconfig=config
Switched to context "deploy".
[root@master01 deploy]# 
[root@master01 deploy]# # 再次查看当前使用的context发现为deploy
[root@master01 deploy]# kubectl config get-contexts --kubeconfig=config
CURRENT   NAME     CLUSTER   AUTHINFO   NAMESPACE
*         deploy   deploy    deploy     rc-saas
[root@master01 deploy]#
[root@master01 deploy]# # 此时由于还没有绑定角色,会报错权限问题
[root@master01 deploy]# kubectl get deploy -n rc-saas --kubeconfig=config
Error from server (Forbidden): deployments.apps is forbidden: User "deploy" cannot list resource "deployments" in API group "apps" in the namespace "rc-saas"
[root@master01 deploy]# 
[root@master01 deploy]# # 创建 deploy-role 角色,并授权,资源类型为 deployments ,动作:所有动作,由于之前创建过了deploy角色,所有提示已存在deploy角色
[root@master01 deploy]# kubectl create role deploy-role --verb="*" --resource=deployments/"*"  -n rc-saas
Error from server (AlreadyExists): roles.rbac.authorization.k8s.io "deploy-role" already exists
[root@master01 deploy]# 
[root@master01 deploy]# # 角色绑定,由于我之前已创建了角色绑定所以提示已存在
[root@master01 deploy]# kubectl create rolebinding deploy-rolebinding  --role=deploy-role --user=deploy -n rc-saas
error: failed to create rolebinding: rolebindings.rbac.authorization.k8s.io "deploy-rolebinding" already exists
[root@master01 deploy]# 
[root@master01 deploy]# # 使用新建的context查看deploy资源
[root@master01 deploy]# kubectl -n rc-saas get deploy --kubeconfig=config 
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
azkaban-web                 1/1     1            1           22d
[root@master01 deploy]# 
[root@master01 deploy]# pwd
/root/deploy
[root@master01 deploy]# ls -l
总用量 32
-rw-r--r-- 1 root root 1099 4月  19 11:27 ca.crt
-rw------- 1 root root 1675 4月  19 11:27 ca.key
-rw-r--r-- 1 root root   17 4月  19 11:31 ca.srl
-rw------- 1 root root 5408 4月  19 11:50 config
-rw-r--r-- 1 root root 1005 4月  19 11:31 deploy.crt
-rw-r--r-- 1 root root  915 4月  19 11:29 deploy.csr
-rw-r--r-- 1 root root 1679 4月  19 11:29 deploy.key
[root@master01 deploy]#

三、将config发送到安装有kubectl命令行的指定客户端

[deploy@deploy ~]$ # 保证客户端要能访问到 kube-apiserver,默认端口6443  
[deploy@deploy ~]$ 
[deploy@deploy ~]$ # 穿件config存放目录
[deploy@deploy ~]$  mkdir -p ${HOME}/.kube
[deploy@deploy ~]$  
[deploy@deploy ~]$ # 复制config 到当前用户的 ${HOME}/.kube/ 目录
[deploy@deploy ~]$ ls -rtl ${HOME}/.kube/config
-rw-rw-r-- 1 deploy deploy 5404 4月   6 10:46 /home/deploy/.kube/config
[deploy@deploy ~]$ 
[deploy@deploy ~]$ # 由于 deploy用户拥有访问rc-saas 命名空间的 deployments资源,所以可以成功查看
[deploy@deploy ~]$ kubectl -n rc-saas get deploy|head -n 2
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
azkaban-web                 1/1     1            1           22d
[deploy@deploy ~]$ 
[deploy@deploy ~]$ # 由于deploy用户没有访问kube-system 的权限所以会提示 forbidden,实现了权限管理
[deploy@deploy ~]$ kubectl -n kube-system  get deploy
Error from server (Forbidden): deployments.apps is forbidden: User "deploy" cannot list resource "deployments" in API group "apps" in the namespace "kube-system"
[deploy@deploy ~]$ 
[deploy@deploy ~]$

<think>嗯,用户想了解如何编写一个kubeconfig文件来连接Kubernetes环境。我需要先回忆一下kubeconfig的结构和作用。kubeconfig文件通常包含集群信息、用户凭证和上下文,对吧?用户可能是在搭建或者管理Kubernetes集群时需要这个文件,比如在本地kubectl配置连接远程集群的时候。 首先,我应该解释kubeconfig的基本组成部分。比如,clusters、users、contexts这几个部分。然后,每个部分的具体内容,比如集群的CA证书、API服务器地址,用户的客户端证书和密钥,或者token之类的认证信息。可能还需要提到不同的认证方式,比如客户端证书、token或者基本认证,但现在更常见的是证书或者token。 接下来,用户可能需要具体的示例。这时候我需要给出一个模板,用YAML格式展示,并且用$$...$$包裹,因为里面有代码块。注意要提醒用户替换其中的占位符,比如server地址、证书路径、名称等。还要确保他们了解各个字段的意义,比如cluster的证书颁发机构数据,user的client-certificate-data和client-key-data可能需要base64编码的内容,或者直接指定文件路径。 另外,可能需要说明如何生成这些凭证,比如通过kubectl命令或者手动生成。如果用户是从现有集群获取配置,可能kubectl config view可以查看当前的配置,或者使用kubectl config set-cluster等命令来生成。不过用户的问题更偏向于手动编写,所以重点放在文件结构上。 安全问题也是要考虑的,比如保护kubeconfig文件,避免泄露敏感信息。可能还要提到不同的context切换,使用kubectl config use-context命令来切换上下文。 用户可能遇到的问题,比如证书无效、权限不足,或者网络无法连接到API服务器,这时候需要检查证书是否正确,网络连通性,以及RBAC权限设置是否正确。同时,可能需要注意YAML格式的缩进是否正确,避免语法错误。 总结下来,步骤应该是:解释kubeconfig的结构,提供一个模板,说明如何替换各个部分,可能涉及的命令,以及常见问题的检查点。确保用户能够根据步骤一步步创建自己的kubeconfig文件,并成功连接到Kubernetes集群。</think>要编写用于连接Kubernetes集群的`kubeconfig`文件,需按以下步骤操作: ### 一、kubeconfig文件结构 `kubeconfig`文件是YAML格式,包含3个核心部分: 1. **集群信息**(Clusters):API Server地址和CA证书 2. **用户凭证**(Users):身份验证信息(证书、Token等) 3. **上下文**(Contexts):绑定集群与用户的关系 ### 二、基础模板示例 ```yaml $$ # 独立公式使用$$包裹 apiVersion: v1 kind: Config clusters: - name: my-cluster cluster: certificate-authority-data: <base64编码的CA证书> server: https://<API-Server-IP>:6443 users: - name: my-user user: client-certificate-data: <base64编码的用户证书> client-key-data: <base64编码的用户私钥> contexts: - name: my-context context: cluster: my-cluster user: my-user namespace: default current-context: my-context $$ ``` ### 三、关键参数说明 1. **证书获取方式**(二选一): - **直接引用文件路径**: ```yaml users: - name: my-user user: client-certificate: /path/to/client.crt client-key: /path/to/client.key ``` - **Base64编码数据**(推荐): ```shell # 生成base64编码 cat ca.crt | base64 -w0 ``` 2. **认证类型支持**: - X509客户端证书(如上例) - Bearer Token: ```yaml users: - name: token-user user: token: "Bearer xxxx.yyyy.zzzz" ``` - 基本认证(已不推荐) ### 四、验证配置文件 1. 设置环境变量指向配置文件: ```shell export KUBECONFIG=/path/to/kubeconfig ``` 2. 测试连接: ```shell kubectl get nodes ``` ### 五、常见问题排查 1. **证书错误**:检查CA证书是否与集群匹配,时间是否过期 2. **连接拒绝**:确认API Server地址和端口正确,检查防火墙规则 3. **权限不足**:通过RBAC配置用户权限 ### 六、高级配置技巧 1. **多集群管理**:在`clusters`和`contexts`中添加多个条目 2. **命名空间预设**: ```yaml contexts: - context: namespace: dev-env ``` > **注意**:生产环境中建议通过`kubectl config`命令生成配置文件,例如: > ```shell > kubectl config set-cluster my-cluster --server=https://1.2.3.4:6443 --certificate-authority=ca.crt > kubectl config set-credentials my-user --client-certificate=client.crt --client-key=client.key > kubectl config set-context my-context --cluster=my-cluster --user=my-user > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值