zoukankan      html  css  js  c++  java
  • 快给你的Kubernetes集群建一个只读账户(防止高管。。。后)

     需求:我们知道搭完k8s集群会创建一个默认的管理员kubernetes-admin用户该用户拥有所以权限,有一天开发或测试的同学需要登录到k8s集群了解业务pod的状态等,我们不可能提供管理员的账户给他不安全如果他因为某个高管。。。删库跑路啥办??,所以建一个只读账户迫在眉睫。

    kubectl conifg命令常见操作:

    • kubectl config view:打印kubeconfig⽂件内容。
    • kubectl config set-cluster:设置kubeconfig的clusters配置段。
    • kubectl config set-credentials:设置kubeconfig的users配置段。
    • kubectl config set-context:设置kubeconfig的contexts配置段。
    • kubectl config use-context:设置kubeconfig的current-context配置段。
    # kubectl config view 

     一、我是用kubeadm部署的集群,给只读账户jackhe创建私钥及证书文件,并保存在/etc/kubernetes/pki目录下。

    1)生成私钥文件。

    cd /etc/kubernetes/pki/
    umask 077;openssl genrsa -out jackhe.key 2048
    

     2)创建证书部署请求,关键点其中-subj选项中的CN的值将被kubeconfig最为用户名使用。

    openssl req -new -key jackhe.key -out jackhe.csr -subj "/CN=jackhe"
    

    3)用kubernetes集群生成的CA签署证书,设置有限时间3650天。

    openssl x509 -req -in jackhe.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out jackhe.crt -days 3650

     4)验证证书信息。

    openssl x509 -in jackhe.crt  -text -noout
    

     二、创建一个新的集群信息,因为最终我们是提供config给使用者,默认的config文件有管理员信息当我们执行:kubectl config use-context kubernetes-admin@kubernetes就拥有了管理权限,这是不被允许的。

    kubectl config set-cluster mycluster --kubeconfig=/tmp/config --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server="https://192.168.10.129:6443" 
    

      选项:

    --kubeconfig="":配置文件存放路径
    --certificate-authority="": 设置kuebconfig配置文件中集群选项中的certificate-authority路径。
    --embed-certs=false: 设置kuebconfig配置文件中集群选项中的embed-certs开关。
    --server="": 设置kuebconfig配置文件中集群选项中的server。
    

     三、配置客户端证书及密钥,⽤户名信息会通过命令从证书Subject的CN值中⾃动提取,例如前⾯创建csr时使⽤的“CN=jackhe”.

    kubectl config set-credentials jackhe --embed-certs=true --client-certificate=/etc/kubernetes/pki/jackhe.crt --client-key=/etc/kubernetes/pki/jackhe.key --kubeconfig=/tmp/config 
    

     选项:

    --client-certificate="": 设置kuebconfig配置文件中用户选项中的证书文件路径。
    --client-key="": 设置kuebconfig配置文件中用户选项中的证书密钥路径。
    --embed-certs=false: 设置kuebconfig配置文件中用户选项中的embed-certs开关。
    

     四、配置context,⽤来组合cluster和credentials,即访问的集群的上下⽂。

    kubectl config set-context jackhe@mycluster --cluster=mycluster --user=jackhe --kubeconfig=/tmp/config
    

      注意: jackhe@mycluster要对应上你新建的集群名字!!!
    五、指定上下文切换到jackhe访问集群,我们能看到现在是没有任何权限的。

    kubectl config use-context jackhe@mycluster --kubeconfig=/tmp/config
    kubectl config view --kubeconfig=/tmp/config 
    kubectl get pod --kubeconfig=/tmp/config

     六、接下来我们基于RBAC建立只读ClusterRole文件(权限可配置)。

     kubectl apply -f  readonly.yaml

    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRole
    metadata:
      name: cluster-readonly
    rules:
    - apiGroups:
      - ""
      resources:
      - pods
      - pods/attach
      - pods/exec
      - pods/portforward
      - pods/proxy
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - ""
      resources:
      - configmaps
      - endpoints
      - persistentvolumeclaims
      - replicationcontrollers
      - replicationcontrollers/scale
      - secrets
      - serviceaccounts
      - services
      - services/proxy
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - ""
      resources:
      - bindings
      - events
      - limitranges
      - namespaces/status
      - pods/log
      - pods/status
      - replicationcontrollers/status
      - resourcequotas
      - resourcequotas/status
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - ""
      resources:
      - namespaces
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - apps
      resources:
      - deployments
      - deployments/rollback
      - deployments/scale
      - statefulsets
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - autoscaling
      resources:
      - horizontalpodautoscalers
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - batch
      resources:
      - cronjobs
      - jobs
      - scheduledjobs
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - extensions
      resources:
      - daemonsets
      - deployments
      - ingresses
      - replicasets
      verbs:
      - get
      - list
      - watch
    

     七、创建基于用户jackhe的ClusterRoleBinding文件。

    kubectl apply -f readonly.yaml

    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      name: cluster-readonly
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-readonly
    subjects:
    - apiGroup: rbac.authorization.k8s.io
      kind: User
      name: jackhe
    

     八、我们这时再测试已经有了只读权限。

    kubectl get pod --kubeconfig=/tmp/config

     九、大功告成,接下来我们只要把/tmp/config文件放到用户的家目录.kube下就可以使用了。

    mkdir -p /home/jackhe/.kube
    cp /tmp/config /home/jackhe/.kube/
    chown -R jackhe.jackhe /home/jackhe/.kube/
    

     OS切换到jackhe用户,我们能看到只有只读权限,也无法 上下文切换到kubernetes-admin@kubernetes ,因为配置文件里并没有相关信息。哈哈,还想删库跑路!!!

  • 相关阅读:
    webservice底层使用Socket进行网络调用
    jquery事件绑定
    C#连接PostgreSQL查询中文字符出现乱码情况
    Engine加载ArcGIS Online和ArcGIS Server发布的地图服务
    【转载】MFC中tabcontrol控件的使用
    一、VS2010创建一个MFC项目
    二、VS2012配置OpenCV
    三、编译和配置GDAL
    Python调用百度地图API(路线规划、POI检索)
    【转载】Python操作Excel的读取以及写入
  • 原文地址:https://www.cnblogs.com/Dev0ps/p/12388718.html
Copyright © 2011-2022 走看看