您现在的位置是:首页 >技术教程 >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 ~]$