要求: 能看得懂就行,甚至不太懂都行
RBAC: 安全认证基于
Pod调度: 亲和性/反亲和性 污点/容忍
软件仓库: Helm
存储: PV/PVC
POD控制器: StatefulSet
第1章 基于角色访问控制RBAC
1.基本概念
账号:
User Account 给人在外面管理k8s的账号
用户账号,用户是外部独立服务管理的,不属于k8s内部的api
ServiceAccount #给POD在k8s里管理的账号
也一种账号,但他并不是给k8s集群的用户的,而是给运行的pod里的进程用的,他为pod里面的进程提供了必要的身份证明
角色:
Role #只适用单个命名空间,也就是和namespace关联的
ClusterRole #以集群作用域的,可以访问其他命名空间的资源,不指定命名空间
角色绑定是将角色中定义的权限赋予一个或一组用户
它包含若干主体(用户/组/服务账户)的列表和这些主体所获得的角色的引用
角色和账号绑定:
RoleBinding 将role角色绑定
在指定的命名空间中执行授权
ClusterRoleBinding 将clusterrole角色绑定
在集群范围执行授权
2.相关命令
查看API组里的资源
kubectl get --raw /api/v1|jq|grep '"name"'

kubectl get --raw /apis/apps/v1|jq|grep '"name"'apps/v1|jq|grep '"name"'
查看某个资源拥有哪些操作方法查看verbs字段内容
kubectl get --raw /api/v1|jq
第2章 编写一个只对在dashboard里只对defulat命名空间里的POD拥有查看权限的账号
1.创建ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: pod-sa
namespace: default

2.编写角色
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-role
rules: #权限规则
apiGroups: [""] #核心组API,如果为空""就表示是核心组API
resources: ["pods"] #核心组API里具体的资源对象
verbs: ["get", "watch", "list"] #可操作的权限apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list", "delete"]

3.编写角色绑定
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-rb
namespace: default
subjects: #要绑定的账号
- kind: ServiceAccount #账号类型
name: pod-sa #账号名称
namespace: default #命名空间
roleRef:
apiGroup: rbac.authorization.k8s.io #声明一下RABC资源组
kind: Role #角色类型
name: pod-role #角色名称

执行

4.应用并查看
kubectl get sa
查看服务账户

kubectl get role
查看角色

kubectl get rolebindings.rbac.authorization.k8s.io
查看rbac绑定情况

kubectl get secrets
查看新建的token

5.查看账户token
kubectl describe secrets pod-sa-token-rk9lc |grep token
查看具体的token密码

复制到dashboard网页的token中


登录成功后查看情况

创建测试pod
现在是没有任何pod

创建2个pod


第3章 编写一个只对在dashboard的POD拥有查看权限的账号
先清除所有的pod

1.创建ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: pod-sa
namespace: default

2.编写集群角色
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: pod-cr
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]

3.编写集群角色绑定
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: pod-crb
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: pod-cr
subjects:
-
kind: ServiceAccount
name: pod-sa
namespace: default
image.png
执行资源配置

4.应用并查看
kubectl get sa
查看服务账号

kubectl get ClusterRole

kubectl get rolebindings.rbac.authorization.k8s.io


kubectl get secrets

5.查看账户token
kubectl describe secrets pod-sa-token-w9bh2 |grep token

复制到dashboard打开

查看pod

测试删除pod

发现没有权限
因为没有设置删除权限
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: pod-cr
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
第4章 User Account
第一种方法:
1.创建用户凭证
创建一个key
openssl genrsa -out oldboy.key 2048
使用key生成证书
openssl req -new -key oldboy.key -out oldboy.csr -subj "/CN=oldboy/O=oldboy"
使用k8s自己的ca.crt和ca.key签发我们生成oldboy.csr
openssl x509 -req -in oldboy.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out oldboy.crt -days 300
创建一个用户
kubectl config set-credentials oldboy --client-certificate=oldboy.crt --client-key=oldboy.key
设置这个用户的运行环境
kubectl config set-context oldboy-context --cluster=kubernetes --namespace=default --user=oldboy
使用某个用户的运行环境执行命令
kubectl get pods --context=oldboy-context
2.创建角色
cat > oldboy-role.yaml << 'EOF'
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: oldboy-role
namespace: default
rules:
- apiGroups: ["", "apps"]
resources: ["deployments", "replicasets", "pods"]
verbs: ["*"]
EOF
kubectl apply -f oldboy-role.yaml
3.创建角色绑定
cat > oldboy-rolebinding.yml << 'EOF'
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: oldboy-rolebinding
namespace: default
subjects:
- kind: User
name: oldboy
apiGroup: ""
roleRef:
kind: Role
name: oldboy-role
apiGroup: rbac.authorization.k8s.io
EOF
kubectl apply -f oldboy-rolebinding.yml
4.测试访问
kubectl get pods --context=oldboy-context
5.生成config文件
从master的.kube文件里的config,删除管理员相关的信息
mkdir /root/.kube/
vim /root/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: xxxxxx
server: https://10.0.0.10:6443
name: kubernetes
contexts: - context:
cluster: kubernetes
namespace: default
user: oldboy
name: oldboy-context
current-context: oldboy-context
kind: Config
preferences: {}
users: - name: oldboy
user:
client-certificate: /root/.kube/oldboy.crt
client-key: /root/.kube/oldboy.key
6.修改权限
chmod 600 /root/.kube/config
7.发送证书
scp oldboy.crt oldboy.key 10.0.0.11:/root/.kube/
8.测试访问
kubectl get pods
使用第二种方法:
创建user目录
在这个目录测试
第1步:创建key
openssl genrsa -out oldboy.key 2048


第2步:使用key生成证书
openssl req -new -key oldboy.key -out oldboy.csr -subj "/CN=oldboy/O=oldboy"

第3步:使用k8s自己的ca.crt和ca.key签发我们生成oldboy.crt有效期300天
openssl x509 -req -in oldboy.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out oldboy.crt -days 300

第4步:生成集群配置
kubectl config set-cluster kubernetes --server=https://10.0.0.10:6443 --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --kubeconfig=oldboy.config

第5步:生成运行环境
kubectl config set-context oldboy-context --cluster=kubernetes --user=oldboy --namespace=default --kubeconfig=oldboy.config

第5步:设置配置文件里的运行环境
kubectl config set current-context oldboy-context --kubeconfig oldboy.config

第6步:指定用户的证书
kubectl config set-credentials oldboy --client-certificate=oldboy.crt --client-key=oldboy.key --embed-certs=true --kubeconfig=oldboy.config

第7步:创建角色
cat > oldboy-role.yaml << 'EOF'
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: oldboy-role
namespace: default
rules:
-
apiGroups: ["", "apps"]
resources: ["deployments", "replicasets", "pods"]
verbs: ["*"]
EOF
kubectl apply -f oldboy-role.yaml
image.png
第8步:创建角色绑定
cat > oldboy-rolebinding.yml << 'EOF'
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: oldboy-rolebinding
namespace: default
subjects:
-
kind: User
name: oldboy
apiGroup: ""
roleRef:
kind: Role
name: oldboy-role
apiGroup: rbac.authorization.k8s.io
EOF
kubectl apply -f oldboy-rolebinding.yml
image.png
第9步:将config配置发送到node节点
scp oldboy.config node1:/root/.kube/config

报错了没有这个目录
在node节点创建目录


再次发送


报错了应该是进错目录操作有问题

重新执行一遍

执行角色资源配置,并绑定

第10步:node节点测试访问
kubectl get pods

注意:报错原来是config文件,我新建成一个目录了
master节点也是config



