1.RBAC
角色:Role:某个空间的角色,属于局部资源
ClusterRole:整个集群的角色,属于集群资源
查看角色:kubectl get clusterrole
规则
主题:User:用户自定义名称,一般是给人用的
ServiceAccount:服务账号,一般是给程序用的
Gro up:给一个组使用
K8S内置集群角色:
cluster-admin:超级管理员,有集群所有权限。
admin:主要用于授权命名空间所有读写权限。
edit:允许对大多数对象读写操作,不允许查看或者修改角色,角色绑定。
view: 允许对命名空间大多数对象只读权限,不允许查看角色,角色绑定和secret。
2.基于用户的权限管理
1.使用k8s ca签发客户端证书
解压证书管理工具包:tar xf cfssl.tar.gz -C /usr/bin/ && chmod +x /usr/bin/cfssl*
编写证书请求:
cat > ca-config.json <<EOF
{"signing": {"default": {"expiry": "87600h"},"profiles": {"kubernetes": {"usages": ["signing","key encipherment","server auth","client auth"],"expiry": "87600h"}}}
}
EOFcat >lxc-csr.json <<EOF
{"CN": "lxc","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "k8s","OU": "System"}]
}
EOF
生成证书:cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes lxc-csr.json | cfssljson -bare lxc
2.生成kubeconfig授权文件
2.1kubeconfig文件的脚本
vim kubeconfig.sh
# 配置集群
# --certificate-authority
# 指定K8s的ca根证书文件路径
# --embed-certs
# 如果设置为true,表示将根证书文件的内容写入到配置文件中,
# 如果设置为false,则只是引用配置文件,将kubeconfig
# --server
# 指定APIServer的地址。
# --kubeconfig
# 指定kubeconfig的配置文件名称
kubectl config set-cluster lxc-linux \--certificate-authority=/etc/kubernetes/pki/ca.crt \--embed-certs=true \--server=https://10.0.0.231:6443 \--kubeconfig=lxc-linux.kubeconfig# 设置客户端认证
kubectl config set-credentials lxc \--client-key=lxc-key.pem \--client-certificate=lxc.pem \--embed-certs=true \--kubeconfig=lxc-linux.kubeconfig# 设置默认上下文
kubectl config set-context linux \--cluster=lxc-linux \--user=lxc \--kubeconfig=lxc-linux.kubeconfig# 设置当前使用的上下文
kubectl config use-context linux --kubeconfig=lxc-linux.kubeconfig
2.2生成kubeconfig文件
bash kubeconfig.sh
3. 创建RBAC授权策略
3.1 创建rbac等配置文件
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:namespace: defaultname: linux-role-reader
rules:# API组,""表示核心组,该组包括但不限于"configmaps","nodes","pods","services"等资源.
- apiGroups: ["","apps/v1"]# 资源类型,不支持写简称,必须写全称哟!!# resources: ["pods","deployments"] resources: ["pods","deployments","services"]# 对资源的操作方法.# verbs: ["get", "list"] verbs: ["get", "list","delete"]
- apiGroups: ["","apps"]resources: ["configmaps","secrets","daemonsets"]verbs: ["get", "list"]
- apiGroups: [""]resources: ["secrets"]verbs: ["delete"]---kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: lxc-linux81-resources-readernamespace: default
subjects:# 主体类型
- kind: User# 用户名name: lxcapiGroup: rbac.authorization.k8s.io
roleRef:# 角色类型kind: Role# 绑定角色名称name: linux-role-readerapiGroup: rbac.authorization.k8s.io
3.2应用rbac授权
kubectl apply -f rbac.yaml
3.3访问测试(需要将kubeconfig传到对应的节点上)
kubectl get po,cm,secret --kubeconfig=lxc-linux.kubeconfig
3.RBAC基于组的方式认证:
CN: 代表用户,O: 组。上一个案例生成的csr证书请求就是使用CN,下面生成的csr证书请求则使用O
1.使用k8s ca签发客户端证书
1.1 编写证书请求
cat > ca-config.json <<EOF
{"signing": {"default": {"expiry": "87600h"},"profiles": {"kubernetes": {"usages": ["signing","key encipherment","server auth","client auth"],"expiry": "87600h"}}}
}
EOFcat > lxcgroup-csr.json <<EOF { "CN": "lxcgroup","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "lxcgroup","OU": "System"}]
}
EOF
1.2生成证书(需要安装cfssl,上一个案例已经安装):cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes lxcgroup-csr.json | cfssljson -bare lxcgroup-groups
2.生成kubeconfig授权文件
2.1 编写生成kubeconfig文件的脚本
vim kubeconfig.sh
#!/bin/bash# 设置集群配置
kubectl config set-cluster lxc-groups \--certificate-authority=/etc/kubernetes/pki/ca.crt \--embed-certs=true \--server=https://10.0.0.231:6443 \--kubeconfig=lxcgroups-linux.kubeconfig# 设置客户端认证
kubectl config set-credentials lxcgroups \--client-key=lxcgroup-groups-key.pem \--client-certificate=lxcgroup-groups.pem \--embed-certs=true \--kubeconfig=lxcgroups-linux.kubeconfig# 设置默认上下文
kubectl config set-context lxcgroups \--cluster=lxc-groups \--user=lxcgroups \--kubeconfig=lxcgroups-linux.kubeconfig# 设置当前使用的上下文
kubectl config use-context lxcgroups \--kubeconfig=lxcgroups-linux.kubeconfig
生成kubeconfig文件:sh kubeconfig.sh
3.创建rbac授权策略
vim rbac.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:namespace: defaultname: linux-role-reader
rules:# API组,""表示核心组,该组包括但不限于"configmaps","nodes","pods","services"等资源.
- apiGroups: ["","apps"]# 资源类型,不支持写简称,必须写全称哟!!resources: ["pods","nodes","services","deployments","configmaps"]# 对资源的操作方法.verbs: ["get", "watch", "list"]---kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: lxc-groups-role-readernamespace: default
subjects:# 主体类型
- kind: Group# 用户名name: lxcgroupapiGroup: rbac.authorization.k8s.io
roleRef:# 角色类型kind: Role# 绑定角色名称name: linux-role-readerapiGroup: rbac.authorization.k8s.io
5.创建新用户加入lxcgroup组
5.1编写证书请求
5.1.1 vim ca-config.json
{"signing": {"default": {"expiry": "87600h"},"profiles": {"kubernetes": {"usages": ["signing","key encipherment","server auth","client auth"],"expiry": "87600h"}}}
}
5.1.2 vim yunwei01-csr.json
{"CN": "yunwei01","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "lxcgroup","OU": "System"}]
}
5.2 生成证书
cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes yunwei01-csr.json | cfssljson -bare lxcgroup-yunwei01
5.3生成kubeconfig文件
vim kubeconfig.sh
kubectl config set-cluster lxc-group-yunwei001 \--certificate-authority=/etc/kubernetes/pki/ca.crt \--embed-certs=true \--server=https://10.0.0.231:6443 \--kubeconfig=lxc-group-yunwei001.kubeconfig# 设置客户端认证
kubectl config set-credentials yunwei001 \--client-key=lxcgroup-yunwei01-key.pem \--client-certificate=lxcgroup-yunwei01.pem \--embed-certs=true \--kubeconfig=lxc-group-yunwei001.kubeconfig# 设置默认上下文
kubectl config set-context yunwei001 \--cluster=lxc-group-yunwei001 \--user=yunwei001 \--kubeconfig=lxc-group-yunwei001.kubeconfig# 设置当前使用的上下文
kubectl config use-context yunwei001 --kubeconfig=lxc-group-yunwei001.kubeconfig
bash kubeconfig.sh
5.4配置文件传送
scp lxc-group-yunwei001.kubeconfig 10.0.0.233:/tmp/
5.5验证权限
kubectl get po,cm,deploy --kubeconfig=/tmp/lxc-group-yunwei001.kubeconfig
4.RBAC安全框架之serviceAccount主体案例
响应式创建serviceAccount:kubectl create serviceaccount lxc
声明式创建serviceAccount:
vim 01-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: lxc
授权容器中的Python程序对K8S API访问权限案例
授权容器中Python程序对K8S API访问权限步骤:
- 创建ServiceAccount;
- 创建Role;
- 将ServiceAccount于Role绑定;
- 为Pod指定自定义的SA;
- 进入容器执行Python程序测试操作K8S API权限;
创建ServiceAccount:
vim 01-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: web-python
创建Role:
vim 02-Role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: pod-reader
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "watch", "list"]
创建RoleBinding将ServiceAccount于Role绑定
vim 03-RoleBinding.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: sa-to-role
subjects:
- kind: ServiceAccountname: web-python
roleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.io
创建pod,为Pod指定自定义的SA
vim 04-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: linux-web
spec:replicas: 1selector:matchExpressions:- key: appsoperator: Existstemplate:metadata:labels:apps: webspec:# 指定sa的名称,请确认该账号是有权限访问K8S集群的哟!serviceAccountName: web-pythoncontainers:- image: harbor.lxcedu.com/base-img/python:3.9.16name: webcommand: ["tail","-f","/etc/hosts"]
运行这四个资源:kubectl apply -f .
进入python的容器:kubectl exec linux-web-78d965b968-wh5sb -it -- sh
编写Python程序,执行以下Python代码即可
cat > k8s.py <<'EOF'
from kubernetes import client, configwith open('/var/run/secrets/kubernetes.io/serviceaccount/token') as f:token = f.read()# print(token)
configuration = client.Configuration()
configuration.host = "https://kubernetes" # APISERVER地址
configuration.ssl_ca_cert="/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" # CA证书
configuration.verify_ssl = True # 启用证书验证
configuration.api_key = {"authorization": "Bearer " + token} # 指定Token字符串
client.Configuration.set_default(configuration)
apps_api = client.AppsV1Api()
core_api = client.CoreV1Api()
try:print("###### Deployment列表 ######")#列出default命名空间所有deployment名称for dp in apps_api.list_namespaced_deployment("default").items:print(dp.metadata.name)
except:print("没有权限访问Deployment资源!")try:#列出default命名空间所有pod名称print("###### Pod列表 ######")for po in core_api.list_namespaced_pod("default").items:print(po.metadata.name)
except:print("没有权限访问Pod资源!")
EOF
安装Python程序依赖的软件包并测试:
1.安装:pip install kubernetes -i https://pypi.tuna.tsinghua.edu.cn/simple/
2.测试:python3 k8s.py
如图所示表示可以访问到k8s集群的pod资源
5.pv与pvc
PV是Kubernetes集群中的一块网络存储,它独立于Pod存在,可以被视为集群级别的资源,用于存储Pod产生的数据。
PV提供了稳定的存储资源给Pod使用,确保Pod即使在被重新调度或删除后,其数据也能保持不变。PV可以是各种存储系统,如云提供商的存储、NFS、iSCSI、本地存储等。
PVC是对PV的请求,它定义了Pod对存储的需求。
PVC声明了对持久卷的需求,而PV则提供了实际的存储资源。K8s会自动将PVC与合适的PV进行匹配和绑定,实现了Pod与存储资源的解耦,使得Pod可以独立于存储资源的变化而运行。
传统方式的缺陷:
在Kubernetes(K8s)中,如果不使用PersistentVolume(PV)和PersistentVolumeClaim(PVC)进行存储管理,那么容器的存储挂载通常需要在Pod的资源清单(如YAML文件)中硬编码指定。
集群依赖性:如果Pod的存储挂载依赖于特定的集群资源(如NFS服务器),那么当Pod被迁移到另一个没有该资源的集群时,它将无法访问其存储。
灵活性不足:硬编码的存储挂载方式使得Pod的存储配置缺乏灵活性。如果需要更改存储配置(如存储容量、访问模式等),则需要修改Pod的资源清单,并重新部署Pod。
管理复杂性:在多个集群或环境中管理硬编码的存储挂载配置会增加管理的复杂性。每个集群或环境可能需要不同的存储配置,这导致需要维护多个版本的Pod资源清单。
使用PV和PVC进行存储管理具有以下优势:
解耦与灵活性:PV和PVC的设计实现了Pod与存储资源的解耦。Pod可以通过PVC声明对存储的需求,而不需要关心具体的存储实现。这使得Pod可以独立于存储资源的变化而运行,提高了系统的灵活性和可移植性。
动态匹配与资源优化:PVC可以指定所需的存储容量、访问模式等参数,而不需要指定具体的PV。K8s会自动根据PVC的要求选择合适的PV进行绑定。这种动态匹配机制使得存储资源的分配更加灵活和高效。
简化存储管理:通过PV和PVC的使用,K8s提供了简化的存储管理机制。集群管理员可以集中管理PV资源,而用户则可以通过PVC来请求所需的存储资源。这种集中管理机制使得存储资源的管理更加简单和高效。
提高可移植性和兼容性:使用PV和PVC可以使得Pod在不同的K8s集群之间迁移时更加容易。只要目标集群提供了与PVC相匹配的PV资源,Pod就可以无缝地访问其存储,而无需修改Pod的资源清单。
6.pv的回收策略
Retain:
"保留回收"策略允许手动回收资源,删除pvc时,pv仍然存在,并且该卷被视为"已释放(Released)"。
在管理员手动回收资源之前,使用该策略其他Pod将无法直接使用。
Recycle:
对于"回收利用"策略官方已弃用。相反,推荐的方法是使用动态资源调配。 删除pv时候nfs存储卷的数据被删除
如果Retain需要重新使用,可以备份数据,然后删除pv,重新创建pv资源
7.动态存储类StorageClass
storageclasses
PersistentVolume(PV):PV是Kubernetes集群中的一块持久存储资源,可以是物理存储设备、网络存储或云存储等。PV独立于Pod的生命周期,并可以在不同的Pod之间共享和重用。PersistentVolumeClaim(PVC):PVC是Pod对PV的请求,用于声明Pod所需的持久存储资源。Pod可以通过PVC来请求所需的存储资源,而无需关心存储的实际配置细节。
pv,pvc,sc关系
- PVC可以引用StorageClass来请求动态供应的PV。这意味着管理员无需手动创建PV,而是根据PVC的请求和指定的StorageClass动态创建PV。
- 另一方面,PVC也可以引用现有的PV来静态绑定PV。这种情况下,PV需要由管理员手动创建。
8.动态存储类sc实战:
(1)k8s组件原生并不支持NFS动态存储
https://kubernetes.io/docs/concepts/storage/storage-classes/#provisioner
(2)NFS不提供内部配置器实现动态存储,但可以使用外部配置器。
git clone https://gitee.com/yinzhengjie/k8s-external-storage.git
(3)进入项目修改配置文件
cd k8s-external-storage/nfs-client/deploy
vim deployment.yaml (修改nfs服务器地址和挂载点即共享路径)
(4)nfs服务器端创建sc需要共享路径
(5)创建动态存储类
kubectl apply -f class.yaml && kubectl get sc
(6)创建授权角色
kubectl apply -f rbac.yaml
(7)部署nfs动态存储配置器
需要先将镜像改为gmoney23/nfs-client-provisioner:latest
kubectl apply -f deployment.yaml
(8)查看是否部署成功
(9)此时可以看到,nfs共享的目录已经有文件写入