1.概述

访问k8s集群时候,需要经过三个步骤完成具体操作
第一步:认证
第二步:鉴权(授权)
第三步:准入控制
图片.png

第一步 认证 传输安全
传输安全:对外不暴露8080端口,只能内部访问,对外使用端口6443

客户端身份证常用认证方式:
https证书认证,基于ca证书
http token认证,通过token识别用户
http基本认证,用户名+密码认证

第二步 鉴权(授权)
基于RBAC进行鉴权操作
基于角色访问控制

第三步 准入控制
就是准入控制器的列表,如果列表有请求内容,通过,不拒绝

2.RBAC 基于角色的访问控制

就是先设置一个角色role,然后给这个role授权,在把这个有操作权限的role和需要权限的主体绑定,这样这个主体也就有这个角色的权限了

角色
role:特定命名空间访问权限
ClusterRole:所有命名空间访问权限

角色绑定
roleBinding: 角色绑定到主体
ClusterRoleBinding: 集群角色绑定到主体

主体
user: 用户
group: 用户组
serviceAccount: 服务账号
图片.png

3.RBAC实践

创建命名空间
kubectl create ns roledemo

在新创建的命名空间中创建pod
kubectl run nginx —image=nginx -n roledemo

创建角色
# vi rbac-role.yaml

  1. kind: Role
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. namespace: ctnrs
  5. name: pod-reader
  6. rules:
  7. - apiGroups: [""] # "" indicates the core API group
  8. resources: ["pods"]
  9. verbs: ["get", "watch", "list"]

kubectl apply -f rbac-role.yaml
kubectl get role -n roledemo

绑定角色
# vi rbac-rolebinding.yaml

  1. kind: RoleBinding
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. name: read-pods
  5. namespace: roletest
  6. subjects:
  7. - kind: User
  8. name: lucy # Name is case sensitive
  9. apiGroup: rbac.authorization.k8s.io
  10. roleRef:
  11. kind: Role #this must be Role or ClusterRole
  12. name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to
  13. apiGroup: rbac.authorization.k8s.io

kubectl apply -f rbac.rolebinding.yaml
kubectl get role,rolebinding -n roledemo

使用证书识别身份
# vi rbac-user.sh

  1. cat > mary-csr.json <<EOF
  2. {
  3. "CN": "mary",
  4. "hosts": [],
  5. "key": {
  6. "algo": "rsa",
  7. "size": 2048
  8. },
  9. "names": [
  10. {
  11. "C": "CN",
  12. "L": "BeiJing",
  13. "ST": "BeiJing"
  14. }
  15. ]
  16. }
  17. EOF
  18. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes mary-csr.json | cfssljson -bare mary
  19. kubectl config set-cluster kubernetes \
  20. --certificate-authority=ca.pem \
  21. --embed-certs=true \
  22. --server=https://192.168.10.20:6443 \
  23. --kubeconfig=mary-kubeconfig
  24. kubectl config set-credentials mary \
  25. --client-key=mary-key.pem \
  26. --client-certificate=mary.pem \
  27. --embed-certs=true \
  28. --kubeconfig=mary-kubeconfig
  29. kubectl config set-context default \
  30. --cluster=kubernetes \
  31. --user=mary \
  32. --kubeconfig=mary-kubeconfig
  33. kubectl config use-context default --kubeconfig=mary-kubeconfig

在二进制安装的集群上进行测试,把之前安装集群时候生成的ca证书拷贝过来
bash rbac-user.sh

kubectl get pods -n roledemo