2022-03-11 day103 kubernetes

要求: 能看得懂就行,甚至不太懂都行

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"'

image.png

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


image.png

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"]

image.png

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 #角色名称
image.png

执行


image.png

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


image.png

kubectl get role
查看角色


image.png

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


image.png

kubectl get secrets
查看新建的token


image.png

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


image.png

复制到dashboard网页的token中


image.png
image.png

登录成功后查看情况


image.png

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


image.png

创建2个pod


image.png
image.png

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


image.png

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


image.png

2.编写集群角色
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: pod-cr
rules:

  • apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list", "watch"]
image.png

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

执行资源配置


image.png

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


image.png

kubectl get ClusterRole


image.png

kubectl get rolebindings.rbac.authorization.k8s.io


image.png

image.png

kubectl get secrets


image.png

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


image.png

复制到dashboard打开


image.png

查看pod


image.png

测试删除pod


image.png

发现没有权限
因为没有设置删除权限
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

image.png

image.png

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


image.png

第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

image.png

第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


image.png

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


image.png

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


image.png

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


image.png

第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


image.png

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


image.png

image.png

再次发送


image.png

image.png

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

image.png

重新执行一遍


image.png

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


image.png

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

image.png

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


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容