首页 > 其他分享 >如何在Kubernetes集群中使用kubectl工具来进行管理多个外部K8S集群接入与资源操作?

如何在Kubernetes集群中使用kubectl工具来进行管理多个外部K8S集群接入与资源操作?

时间:2022-12-27 21:33:50浏览次数:75  
标签:devopsuser kubectl kubernetes Kubernetes -- devops kubeconfig 集群

关注「WeiyiGeek」公众号




本章目录:

0x03 Kubernetes 中多集群接入管理实践

  • 1.本地集群创建指定用户管理集群
  • 2.外部集群创建指定用户管理集群

原文地址: https://blog.weiyigeek.top/2022/2-27-620.html


0x03 Kubernetes 中多集群接入管理实践

描述: 在pipeline中的CD环节,常常需要将业务产品部署到不同的K8S集群,比如开发环境、测试环境、生产环境,此时可以使用 ​​kubectl config​​相关命令来进行多个远程集群的配置并采用rbac授权机制来创建指定用户的权限 。

下面我们从两个方面进行验证,一是在本地集群创建指定用户只能访问特定名称空间的资源,二是指定用户接入远程集群中并且只能访问特定名称空间的资源, 我们需要重点关注三大要素即 ​​集群(clusters)、上下文(contexts)、用户(user)​

config 命令下重要配置项说明:

  • clusters :配置要访问的kubernetes集群
  • contexts :配置访问kubernetes集群的具体上下文环境
  • current-context : 配置当前使用的上下文环境
  • users :配置访问的用户信息,用户名以及证书信息


1.本地集群创建指定用户管理集群

为当前集群创建一个只管理指定名称空间权限的devopsuser用户
描述: kubernetes 中我们可将权限进行细化、使得使用者可以拥有最小的运行权限,保证集群的安全,特别是CI/CD环境中,下面将演示在kubernetes集群中创建一个只管理名称空间为devtest的devopsuser用户。

步骤 01.创建一个devtest的名称空间, 执行如下命令​​kubectl create namespace devtest​​.

步骤 02.执行​​kubectl config get-clusters​​​命令查看当前集群名称,通常默认为​​kubernetes​​.

步骤 03.准备​​cfssl​​工具以及生成用户证书的相关json文件。


$ tee ca-config.json << 'EOF'
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
EOF

$ tee devopsuser-csr.json << 'EOF'
{
"CN": "devopsuser",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "ChongQing",
"L": "ChongQing",
"O": "k8s",
"OU": "System"
}
]
}
EOF


步骤 04.执行如下命令为devopsuser用户生成相应的证书,并将证书复制到 ​​/etc/kubernetes/pki/user/​​目录中。


# 生成用户证书
cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config ./ca-config.json -profile=kubernetes ./devopsuser-csr.json | cfssljson -bare devopsuser
# 2022/03/16 19:40:19 [INFO] generate received request
# 2022/03/16 19:40:19 [INFO] received CSR
# 2022/03/16 19:40:19 [INFO] generating key: rsa-2048
# 2022/03/16 19:40:19 [INFO] encoded CSR
# 2022/03/16 19:40:19 [INFO] signed certificate with serial number 648194491978037048405922455454162128168023396626

# 查看生成的证书以及申请文件 (后三个新生成)
ls
ca-config.json devopsuser-csr.json devopsuser.csr devopsuser-key.pem devopsuser.pem

# 证书到期时间
openssl x509 -in devopsuser.pem -noout -text | grep -E 'Not'
Not Before: Mar 16 11:35:00 2022 GMT
Not After : Mar 13 11:35:00 2032 GMT

# 新建用户证书存放目录创建并将生成的证书密钥与证书复制到该目录中。
mkdir -vp /etc/kubernetes/pki/user/
cp -a devopsuser*.pem /etc/kubernetes/pki/user/


步骤 05.查看本地或者远程集群的API_SERVER地址,并将其写入到devopsuser.kubeconfig文件之中。


kubectl cluster-info  | grep "control plan"
# Kubernetes control plane is running at https://slb-vip.k8s:16443

# 设置集群参数写入到devopsuser.kubeconfig文件中
KUBE_APISERVER="https://slb-vip.k8s:16443"
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=/root/.kube/devopsuser.kubeconfig
# Cluster "kubernetes" set.


步骤 06.为devopsuser用户创建一个devops-ctx上下文,并指定名称空间为devtest(在此上下文中在有rbac权限的情况下,只能操作该空间下的资源)并将配置写入到devopsuser.kubeconfig中。


kubectl config set-context devopsuser-ctx --cluster=kubernetes --user=devopsuser --namespace=devtest --kubeconfig=/root/.kube/devopsuser.kubeconfig
# Context "devopsuser-ctx" created.


步骤 07.在kubeconfig中设置devopsuser用户条目客户端参数,并将配置写入到devopsuser.kubeconfig中。


kubectl config set-credentials devopsuser --cluster=kubernetes \
--client-certificate=/etc/kubernetes/pki/user/devopsuser.pem \
--client-key=/etc/kubernetes/pki/user/devopsuser-key.pem \
--embed-certs=true \
--kubeconfig=/root/.kube/devopsuser.kubeconfig
# User "devopsuser" set.


步骤 08.查看生成的devopsuser.kubeconfig文件.


$ cat devopsuser.kubeconfig
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: [api-server CA证书-base64编码]
server: https://slb-vip.k8s:16443 # API Server 地址
name: kubernetes
contexts:
- context:
cluster: kubernetes # 集群名称
namespace: devtest # 名称空间
user: devopsuser # 此上下文中的用户
name: devopsuser-ctx # 上下文名称
current-context: ""
kind: Config
preferences: {}
users:
- name: devopsuser # 创建的用户,认证方式为CA签名的证书。
user:
client-certificate-data: [客户端证书-base64编码]
client-key-data: [客户端密钥-base64编码]


步骤 09.RoleBinding 角色绑定,为​​devopsuser​​​用户创建​​role​​​和​​rolebinding​​,利用rbac进行资源访问操作权限的管控。


# 方式1.命令行方式(一步到位),生产环境中间建议为指定用户划分需要资源的权限。
kubectl create rolebinding devopsuser-admin --clusterrole=admin --user=devopsuser --namespace=devtest

# 方式2.资源清单方式
# Role 名称:devtest-role
# RoleBinding 名称:devopsuser-admin
tee devopsuser-rolebinding.yaml <<'EOF'
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: devtest-role
namespace: devtest
rules:
- apiGroups:
- ""
resources:
- pods
- pods/attach
- pods/exec
- pods/portforward
- pods/proxy
verbs:
- create
- delete
- deletecollection
- get
- list
- patch
- update
- watch
- apiGroups:
- ""
resources:
- configmaps
- endpoints
- persistentvolumeclaims
- replicationcontrollers
- replicationcontrollers/scale
- secrets
- serviceaccounts
- services
- services/proxy
verbs:
- create
- delete
- deletecollection
- get
- list
- patch
- update
- watch
- apiGroups:
- ""
resources:
- bindings
- events
- limitranges
- pods/log
- pods/status
- replicationcontrollers/status
- resourcequotas
- resourcequotas/status
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- serviceaccounts
verbs:
- impersonate
- apiGroups:
- apps
resources:
- deployments
- deployments/rollback
- deployments/scale
- statefulsets
verbs:
- create
- delete
- deletecollection
- get
- list
- patch
- update
- watch
- apiGroups:
- autoscaling
resources:
- horizontalpodautoscalers
verbs:
- create
- delete
- deletecollection
- get
- list
- patch
- update
- watch
- apiGroups:
- batch
resources:
- cronjobs
- jobs
- scheduledjobs
verbs:
- create
- delete
- deletecollection
- get
- list
- patch
- update
- watch
- apiGroups:
- extensions
resources:
- daemonsets
- deployments
- deployments/rollback
- deployments/scale
- ingresses
- replicasets
- replicasets/scale
- replicationcontrollers/scale
verbs:
- create
- delete
- deletecollection
- get
- list
- patch
- update
- watch
- apiGroups:
- authorization.k8s.io
resources:
- localsubjectaccessreviews
verbs:
- create
---
# roleRef 角色来源为 devtest-role
# subjects 赋予角色给 devopsuser 用户
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: devopsuser-admin
namespace: devtest
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: devtest-role
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: devopsuser
EOF

kubectl apply -f devopsuser-rolebinding.yaml
# role.rbac.authorization.k8s.io/devtest-role unchanged
# rolebinding.rbac.authorization.k8s.io/devopsuser-admin created


步骤 10.指定devopsuser用的kubeconfig并切换用户上下文。


# 切换用户上下文
kubectl config use-context devopsuser-ctx --kubeconfig=/root/.kube/devopsuser.kubeconfig
# Switched to context "devopsuser-ctx".

# 查看当前上下文
kubectl config current-context --kubeconfig=/root/.kube/devopsuser.kubeconfig
# devopsuser-ctx

# 当前上下文中的用户
kubectl config get-users --kubeconfig=/root/.kube/devopsuser.kubeconfig
# NAME
# devopsuser


步骤 11.验证创建devopsuser用户的权限。


# 无权限查看节点以及操作其它名称空间的资源
kubectl --kubeconfig=/root/.kube/devopsuser.kubeconfig get node
# Error from server (Forbidden): nodes is forbidden: User "devopsuser" cannot list resource "nodes" in API group "" at the cluster scope

# 创建一个pod
kubectl --kubeconfig=/root/.kube/devopsuser.kubeconfig run nginx --image=nginx:latest --namespace devtest --labels="app=nginx" --port=8080
# pod/nginx created

# 查看Pod运行状态
kubectl --kubeconfig=/root/.kube/devopsuser.kubeconfig get pod -n devtest
# NAME READY STATUS RESTARTS AGE
# nginx 1/1 Running 0 37s

# 保留Pod服务
kubectl --kubeconfig=/root/.kube/devopsuser.kubeconfig expose pod nginx -n devtest --port=8080 --name=nginx-frontend
# service/nginx-frontend exposed

# 查看服务
kubectl --kubeconfig=/root/.kube/devopsuser.kubeconfig get pod -n devtest -l app=nginx -o wide
# NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
# nginx 1/1 Running 0 3h29m 10.66.182.255 weiyigeek-226 <none> <none>

至此完毕!



2.外部集群创建指定用户管理集群

描述: 在本地集群接入外部集群时我们需要获得其api-server地址(注意如果没有域名解析请做硬解析),以及ca证书, 此处同样以访问devtes名称空间为例。

步骤 01.外部集群信息及其CA证获取。


# 远程集群中执行如下命令查看集群相关
$ kubectl cluster-info
# Kubernetes control plane is running at https://apiserver.cluster.weiyigeek:6443

$ ping apiserver.cluster.weiyigeek
# PING apiserver.cluster.weiyigeek (192.168.12.102) 56(84) bytes of data.
# 64 bytes from weiyigeek-102 (192.168.12.102): icmp_seq=1 ttl=64 time=0.134 ms

# 配置硬解析
sudo tee -a /etc/hosts <<'EOF'
192.168.12.102 apiserver.cluster.weiyigeek
EOF

# 将外部集群ca证书将其复制到现有机器上
ls /etc/kubernetes/pki/ca.crt && cat /etc/kubernetes/pki/ca.crt
cat > cluster.prod.ca.crt <<'EOF'
-----BEGIN CERTIFICATE-----
[上面显示的 base64 编码]
-----END CERTIFICATE-----
EOF


步骤02.在本地集群中利用​​kubectl config set-cluster​​命令设置远程集群。


KUBE_APISERVER="https://apiserver.cluster.weiyigeek:6443"
kubectl config set-cluster k8s-cluster \
--certificate-authority=./cluster.prod.ca.crt \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=/root/.kube/devops.kubeconfig


步骤03.在本地集群中利用 kubectl confi set-context 命令设置上下文。


kubectl config set-context devops-ctx \
--cluster=k8s-cluster \
--user=devops \
--namespace=devtest \
--kubeconfig=/root/.kube/devops.kubeconfig
# Context "devopsuser-ctx" created.


步骤04.在本地集群中,同样利用cfssl工具生成devops用户证书


# 证书相关配置文件
$ tee ca-config.json << 'EOF'
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
EOF

$ tee devops-csr.json << 'EOF'
{
"CN": "devops",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "ChongQing",
"L": "ChongQing",
"O": "k8s",
"OU": "System"
}
]
}
EOF

# 证书生成
tee cluster.prod.ca.key <<'EOF'
-----BEGIN RSA PRIVATE KEY-----
[远程集群 ca 私钥 base64 编码 ]
-----END RSA PRIVATE KEY-----
EOF

# 证书生成
cfssl gencert -ca=./cluster.prod.ca.crt -ca-key=./cluster.prod.ca.key -config ./ca-config.json -profile=kubernetes ./devops-csr.json | cfssljson -bare devops

# 将生成的证书以及密钥复制到/etc/kubernetes/pki/user目录中
sudo cp devops*.pem /etc/kubernetes/pki/user

步骤 05.在本地集群中利用 ​​kubectl confi set-credentials​​​ 命令设置devops用户, 注意集群、上下文以及用户认证拼接都是写入到​​/root/.kube/devops.kubeconfig​​。


kubectl config set-credentials devops \
--cluster=k8s-cluster \
--client-certificate=/etc/kubernetes/pki/user/devops.pem \
--client-key=/etc/kubernetes/pki/user/devops-key.pem \
--embed-certs=true \
--kubeconfig=/root/.kube/devops.kubeconfig

# 切换上下文为devops-ctx
kubectl config use-context devops-ctx --kubeconfig=/root/.kube/devops.kubeconfig
# Switched to context "devops-ctx".

# 查看当前上下文
kubectl config current-context --kubeconfig=/root/.kube/devops.kubeconfig
# devops-ctx

步骤 06.在远端集群中执行如下命令给devops用户绑定指定名称空间中(devtest)拥有的角色及其赋予的权限。


kubectl create rolebinding devops --clusterrole=admin --user=devops --namespace=devtest 
kubectl get rolebindings.rbac.authorization.k8s.io -n devtest
# NAME ROLE AGE
# devops ClusterRole/admin 2s

温馨提示: 上面为了演示采用了kubernetes默认的admin角色,在实践环境中建议自己按照所需权限创建role然后再绑定给指定用户。

步骤 07.在本地集群中使用--kubeconfig指定前面生成集群连接配置,访问远端集群中devtest名称空间下的资源, 如果访问其它名称空间的资源是没有权限的。


kubectl --kubeconfig=/root/.kube/devops.kubeconfig get pod -n devtest
# NAME READY STATUS RESTARTS AGE
# oa-dev-0 1/1 Running 24 (2d17h ago) 16d
# redis-single-0 1/1 Running 0 47d

# 非 devtest 名称空间下的 资源是无权限的。
kubectl --kubeconfig=/root/.kube/devops.kubeconfig get pod -n devops
# Error from server (Forbidden): pods is forbidden: User "devops" cannot list resource "pods" in API group "" in the na

本文至此完毕,更多技术文章,尽情期待下一章节!


原文地址: https://blog.weiyigeek.top/2022/2-27-620.html



如何在Kubernetes集群中使用kubectl工具来进行管理多个外部K8S集群接入与资源操作?_nginx 往期相关文章如何在Kubernetes集群中使用kubectl工具来进行管理多个外部K8S集群接入与资源操作?_nginx

​1.还不会部署高可用的kubernetes集群?看我手把手教你使用二进制部署v1.23.6的K8S集群实践(上)​

​2.还不会部署高可用的kubernetes集群?看我手把手教你使用二进制部署v1.23.6的K8S集群实践(下)​

​Jenkins Pipeline 流水线如何根据代仓库的 webhook 自动触发拉取提交的分支代码并构建?​

​如何在 Kubernetes 中进行 ingress-nginx 配置优化以及HTTP请求速率限制​

​如何配置Kubernetes仪表板dashboard支持http方式并使用ingress-nginx代理访问实践​

​在k8s集群中Kubernetes仪表板dashboard使用RABC机制限制指定用户针对指定名称空间中的资源进行管理实践​

​Let'sEncrypt快速颁发及自动续签泛域名证书实践指南​


如何在Kubernetes集群中使用kubectl工具来进行管理多个外部K8S集群接入与资源操作?_json_03



欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址​【master#weiyigeek.top】​或者个人公众号​【WeiyiGeek】​联系我。


更多文章来源于【WeiyiGeek Blog 个人博客 - 为了能到远方,脚下的每一步都不能少 】

个人主页: 【 ​​https://weiyigeek.top​​】

博客地址: 【 ​​https://blog.weiyigeek.top ​​】

如何在Kubernetes集群中使用kubectl工具来进行管理多个外部K8S集群接入与资源操作?_nginx_04


专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏 【点个赞、投个币、收个藏、关个注,转个发,留个言】(人间六大情),这将对我的肯定,谢谢!。


  • echo  "【点个赞】,动动你那粗壮的拇指或者芊芊玉手,亲!"
  • printf("%s", "【投个币】,万水千山总是情,投个硬币行不行,亲!")
  • fmt.Printf("【收个藏】,阅后即焚不吃灰,亲!")  
  • console.info("【转个发】,让更多的志同道合的朋友一起学习交流,亲!")
  • System.out.println("【关个注】,后续浏览查看不迷路哟,亲!")
  • cout << "【留个言】,文章写得好不好、有没有错误,一定要留言哟,亲! " << endl;


如何在Kubernetes集群中使用kubectl工具来进行管理多个外部K8S集群接入与资源操作?_Group_05


更多网络安全、系统运维、应用开发、全栈文章,尽在【个人博客 - https://blog.weiyigeek.top】站点,谢谢支持!

    帅哥、美女、大佬们点个【赞+在看】吧!

标签:devopsuser,kubectl,kubernetes,Kubernetes,--,devops,kubeconfig,集群
From: https://blog.51cto.com/weiyigeek/5973608

相关文章