您现在的位置是:首页 >技术教程 >k8s设置多个Context环境网站首页技术教程

k8s设置多个Context环境

@土豆 2023-06-04 20:00:02
简介k8s设置多个Context环境

目录

目的

一、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 ~]$

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。