• kubernetes学习笔记之十一:kubernetes dashboard认证及分级授权


    第一章、部署dashboard

    作为Kubernetes的Web用户界面,用户可以通过Dashboard在Kubernetes集群中部署容器化的应用,对应用进行问题处理和管理,并对集群本身进行管理。通过Dashboard,用户可以查看集群中应用的运行情况,同时也能够基于Dashboard创建或修改部署、任务、服务等Kubernetes的资源。通过部署向导,用户能够对部署进行扩缩容,进行滚动更新、重启Pod和部署新应用。

    项目地址:https://github.com/kubernetes/dashboard,根据项目中的介绍,我们自己在线安装即可,但是实际上我们国内用户无法自己安装,需要下载后修改文件才能使用

    下载yaml文件

    [root@k8s-master01 manifests]# mkdir dashboard^C
    [root@k8s-master01 manifests]# cd dashboard/
    [root@k8s-master01 dashboard]# wget  https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

    修改yaml文件中镜像的地址及service的类型

    修改完成后,应用yaml文件

    [root@k8s-master01 dashboard]# kubectl apply -f kubernetes-dashboard.yaml 
    serviceaccount "kubernetes-dashboard" unchanged
    role.rbac.authorization.k8s.io "kubernetes-dashboard-minimal" unchanged
    rolebinding.rbac.authorization.k8s.io "kubernetes-dashboard-minimal" unchanged
    deployment.apps "kubernetes-dashboard" configured
    service "kubernetes-dashboard" configured
    [root@k8s-master01 dashboard]# kubectl get pod -n kube-system   #dashborad存在于kube-system名称空间中
    NAME                                    READY     STATUS    RESTARTS   AGE
    ......
    kubernetes-dashboard-7b689d867f-f67hm   1/1       Running   0          27s
    [root@k8s-master01 dashboard]# kubectl get svc -n kube-system  #查看service和端口是否开启
    NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
    ......
    kubernetes-dashboard   NodePort    10.101.22.15   <none>        443:32333/TCP   13m

    通过masterIP:port进行访问,正常应该会出现下面的界面

    从界面中可以看到访问dashboard需要通过config或者token授权才能登陆,但是dashboard本身不提供授权,因为dashborad是一个pod,实际上我们是使用这个pod认证到k8s的集群中去的,我们需要为dashborad的pod提供config或者token认证,所以这里的认证主体应该是serviceaccount

    如果出现以下界面

    这是因为yaml文件中创建secret有问题,我们需要手动创建一个证书来进行认证,下面我们创建一个证书

    [root@k8s-master01 dashboard]# cd /etc/kubernetes/pki/
    [root@k8s-master01 pki]# (umask 077; openssl genrsa -out dashboard.key 2048)  #创建一个证书
    Generating RSA private key, 2048 bit long modulus
    ............................................................................................+++
    .............+++
    e is 65537 (0x10001)
    [root@k8s-master01 pki]# openssl req -new -key dashboard.key -out dashboard.csr -subj "/O=qiangungun/CN=kubernetes-dashboard"    #建立证书的签署请求
    [root@k8s-master01 pki]# openssl x509 -req -in dashboard.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out dashboard.crt -days 3650 #使用集群的ca来签署证书
    Signature ok
    subject=/O=qiangungun/CN=kubernetes-dashboard
    Getting CA Private Key
    [root@k8s-master01 pki]# kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.crt=./dashboard.crt --from-file=dashboard.key=./dashboard.key  -n kube-system  #我们需要把我们创建的证书创建为secret给k8s使用
    secret "kubernetes-dashboard-certs" created

    注释dashborad yaml文件中secret的配置

    重新应用yaml文件

    [root@k8s-master01 dashboard]# kubectl delete  -f kubernetes-dashboard.yaml 
    [root@k8s-master01 dashboard]# kubectl apply  -f kubernetes-dashboard.yaml 

    再次访问应该就正常了

    第二章、创建以token方式登录dashborad的用户

    1.创建具有集群管理权限的用户登录dashborad

    [root@k8s-master01 dashboard]# kubectl create serviceaccount dashboard-admin -n kube-system #创建用于登录dashborad的serviceaccount账号
    serviceaccount "dashboard-admin" created
    [root@k8s-master01 dashboard]# kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin   #创建一个clusterrolebingding,将名称为cluster-admin的clusterrole绑定到我们刚刚从的serviceaccount上,名称空间和sa使用:作为间隔
    clusterrolebinding.rbac.authorization.k8s.io "dashboard-cluster-admin" created   
    [root@k8s-master01 dashboard]# kubectl get secret -n kube-system #创建完成后系统会自动创建一个secret,名称以serviceaccount名称开头
    NAME                                             TYPE                                  DATA      AGE
    ......
    dashboard-admin-token-pbsj9                      kubernetes.io/service-account-token   3         4m
    .....
    [root@k8s-master01 dashboard]# kubectl describe secret dashboard-admin-token-pbsj9 -n kube-system  #使用describe查看该secret的详细信息,主要是token一段
    Name:         dashboard-admin-token-pbsj9
    Namespace:    kube-system
    Labels:       <none>
    Annotations:  kubernetes.io/service-account.name=dashboard-admin
                  kubernetes.io/service-account.uid=b24fb2eb-f5e1-11e8-8969-5254001b07db
    
    Type:  kubernetes.io/service-account-token
    
    Data
    ====
    token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tcGJzajkiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYjI0ZmIyZWItZjVlMS0xMWU4LTg5NjktNTI1NDAwMWIwN2RiIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.jDtIZFrcAPkr71pSStWm1AD4_gJM9A4JeYics3Nxs0hm2NQSCgL_pAIlVlSiHELmn3TLasOcvy8SljQnZQJcLKSkP-ubSBe8IkzXJkBr3SOhEr6eHb1ZDHXtC9bx58QH6PEOnO3hwoUaEtcIMuzC8ULbMp5f4TCvZ5mSKL_WPwaVJgZZDteUBPOsZHfcfIyatjXOWZBhiWbD3UZIN47ghpZl6BdXVeqLT5ua8Z8G0qtRD-DoDiQOaQ5Z9nKo_yluyb5cLJgpAtAl9i4Df7exHgVRnPETk1fbnxCDTGYlEgmLKFU6tRCEKl5Q66O9TICpdJIeT4sUBJxDSFVScPNFrA
    ca.crt:     1025 bytes
    namespace:  11 bytes

    复制secret中的token,来访问dashborad

    选择令牌,并粘贴刚刚复制的token,点击登录

    可以看到,可以管理集群中的所有资源

    2、创建具有指定名称空间管理权限的用户登录dashborad

    [root@k8s-master01 dashboard]# kubectl create serviceaccount default-ns-admin -n default #再次创建一个serviceaccount,指定名称空间为default
    serviceaccount "default-ns-admin" created
    [root@k8s-master01 dashboard]# kubectl create rolebinding default-ns-admin --clusterrole=admin --serviceaccount=default:default-ns-admin #使用rolebinding绑定clusterrole用户admin到刚刚创建的serviceaccount上
    rolebinding.rbac.authorization.k8s.io "default-ns-admin" created
    [root@k8s-master01 dashboard]# kubectl get secret 
    NAME                           TYPE                                  DATA      AGE
    ......
    default-ns-admin-token-26xgs   kubernetes.io/service-account-token   3         2m
    ......
    [root@k8s-master01 dashboard]# kubectl describe secret default-ns-admin-token-26xgs 
    Name:         default-ns-admin-token-26xgs
    Namespace:    default
    Labels:       <none>
    Annotations:  kubernetes.io/service-account.name=default-ns-admin
                  kubernetes.io/service-account.uid=b13f19e9-f5ec-11e8-8969-5254001b07db
    
    Type:  kubernetes.io/service-account-token
    
    Data
    ====
    ca.crt:     1025 bytes
    namespace:  7 bytes
    token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtbnMtYWRtaW4tdG9rZW4tMjZ4Z3MiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdC1ucy1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImIxM2YxOWU5LWY1ZWMtMTFlOC04OTY5LTUyNTQwMDFiMDdkYiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQtbnMtYWRtaW4ifQ.T1TsD-SyHDgpMMLWk75TFtYxOzc6SQcUHD4FsNEEjx6p48G9smBoh7fO6_y9NIvZKCjIGvzKt-ZUhRg7Oxk6vL2JIODe2apQQQBYyIzzW2y1ZFSICPpEHs0FYwt84RsUefGLLfEq0BrGa22mV58UfcttSMZN9LAUuWYe_1UX81F9neAuknKO78BNzif854SFOLvOaqOqNfMSiXs8Fi3vWPLi8_QFihObrC_FkDBhzc62zYtXzpH8T7gzadfAIexLpX7__RmcY8Cuaf7XvRh-zn3SAcmwo8v2ydtwOwTOtPA-6gEXGSM2UfR-rZ0WloPCIvGonej8fbNgH8G9sT2KTg

    使用此token登录dashborad

    可以看到,出来default名称空间之外,无法看到其他名称空间了

    第三章、创建以config方式登录dashborad的用户

    为了方面我们直接使用刚刚创建的serviceaccount的token作为认证信息

    [root@k8s-master01 dashboard]# cd /etc/kubernetes/pki/
    [root@k8s-master01 pki]# kubectl config set-cluster kubernetes --certificate-authority=./ca.crt --server="https://172.16.150.212:6443" --embed-certs=true --kubeconfig=/root/def-ns-admin.conf  #新建一个cluster,名称为kubernetes,使用当前集群的ca进行认证,并指定kubeconfig文件位置
    Cluster "kubernetes" set.
    [root@k8s-master01 pki]# kubectl config view --kubeconfig=/root/def-ns-admin.conf  #查看创建信息
    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority-data: REDACTED
        server: https://172.16.150.212:6443
      name: kubernetes
    contexts: []
    current-context: ""
    kind: Config
    preferences: {}
    users: []
    [root@k8s-master01 pki]# cd 
    [root@k8s-master01 ~]# kubectl get secret 
    [root@k8s-master01 ~]# DEF_NS_ADMIN_TOKEN=$(kubectl get secret default-ns-admin-token-26xgs -o jsonpath={.data.token}|base64 -d) #k8s生成的token为base64加密,所有需要使用base64进行解密
    [root@k8s-master01 ~]# kubectl config set-credentials def-ns-admin --token=$DEF_NS_ADMIN_TOKEN --kubeconfig=/root/def-ns-admin.conf #创建一个serviceaccount的用户
    User "def-ns-admin" set.
    [root@k8s-master01 manifests]# kubectl config view --kubeconfig=/root/def-ns-admin.conf 
    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority-data: REDACTED
        server: https://172.16.150.212:6443
      name: kubernetes
    contexts:
    - context:
        cluster: kubernetes
        user: def-ns-admin
      name: def-ns-admin@kubernetes
    current-context: ""
    kind: Config
    preferences: {}
    users:
    - name: def-ns-admin
      user:
        token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtbnMtYWRtaW4tdG9rZW4tMjZ4Z3MiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdC1ucy1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImIxM2YxOWU5LWY1ZWMtMTFlOC04OTY5LTUyNTQwMDFiMDdkYiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQtbnMtYWRtaW4ifQ.T1TsD-SyHDgpMMLWk75TFtYxOzc6SQcUHD4FsNEEjx6p48G9smBoh7fO6_y9NIvZKCjIGvzKt-ZUhRg7Oxk6vL2JIODe2apQQQBYyIzzW2y1ZFSICPpEHs0FYwt84RsUefGLLfEq0BrGa22mV58UfcttSMZN9LAUuWYe_1UX81F9neAuknKO78BNzif854SFOLvOaqOqNfMSiXs8Fi3vWPLi8_QFihObrC_FkDBhzc62zYtXzpH8T7gzadfAIexLpX7__RmcY8Cuaf7XvRh-zn3SAcmwo8v2ydtwOwTOtPA-6gEXGSM2UfR-rZ0WloPCIvGonej8fbNgH8G9sT2KTg
    [root@k8s-master01 manifests]# kubectl config use-context def-ns-admin@kubernetes --kubeconfig=/root/def-ns-admin.conf #设置当前serviceaccount的上下文
    Switched to context "def-ns-admin@kubernetes".
    [root@k8s-master01 manifests]# kubectl config view --kubeconfig=/root/def-ns-admin.conf 
    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority-data: REDACTED
        server: https://172.16.150.212:6443
      name: kubernetes
    contexts:
    - context:
        cluster: kubernetes
        user: def-ns-admin
      name: def-ns-admin@kubernetes
    current-context: def-ns-admin@kubernetes
    kind: Config
    preferences: {}
    users:
    - name: def-ns-admin
      user:
        token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtbnMtYWRtaW4tdG9rZW4tMjZ4Z3MiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdC1ucy1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImIxM2YxOWU5LWY1ZWMtMTFlOC04OTY5LTUyNTQwMDFiMDdkYiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQtbnMtYWRtaW4ifQ.T1TsD-SyHDgpMMLWk75TFtYxOzc6SQcUHD4FsNEEjx6p48G9smBoh7fO6_y9NIvZKCjIGvzKt-ZUhRg7Oxk6vL2JIODe2apQQQBYyIzzW2y1ZFSICPpEHs0FYwt84RsUefGLLfEq0BrGa22mV58UfcttSMZN9LAUuWYe_1UX81F9neAuknKO78BNzif854SFOLvOaqOqNfMSiXs8Fi3vWPLi8_QFihObrC_FkDBhzc62zYtXzpH8T7gzadfAIexLpX7__RmcY8Cuaf7XvRh-zn3SAcmwo8v2ydtwOwTOtPA-6gEXGSM2UfR-rZ0WloPCIvGonej8fbNgH8G9sT2KTg

    导出/root/def-ns-admin.conf到客户端上,并选择kubeconfig方式登录,点击选择文件即可

    没有问题,登录成功

    第四章、Dashboard使用

    1 、Dashboard提供的功能

    在默认情况下,Dashboard显示默认(default)命名空间下的对象,也可以通过命名空间选择器选择其他的命名空间。在Dashboard用户界面中能够显示集群大部分的对象类型。
    
    1集群管理
    集群管理视图用于对节点、命名空间、持久化存储卷、角色和存储类进行管理。 节点视图显示CPU和内存的使用情况,以及此节点的创建时间和运行状态。 命名空间视图会显示集群中存在哪些命名空间,以及这些命名空间的运行状态。角色视图以列表形式展示集群中存在哪些角色,这些角色的类型和所在的命名空间。 持久化存储卷以列表的方式进行展示,可以看到每一个持久化存储卷的存储总量、访问模式、使用状态等信息;管理员也能够删除和编辑持久化存储卷的YAML文件。
    
    2工作负载
    工作负载视图显示部署、副本集、有状态副本集等所有的工作负载类型。在此视图中,各种工作负载会按照各自的类型进行组织。 工作负载的详细信息视图能够显示应用的详细信息和状态信息,以及对象之间的关系。
    
    3服务发现和负载均衡
    服务发现视图能够将集群内容的服务暴露给集群外的应用,集群内外的应用可以通过暴露的服务调用应用,外部的应用使用外部的端点,内部的应用使用内部端点。
    
    4存储
    存储视图显示被应用用来存储数据的持久化存储卷申明资源。
    
    5配置
    配置视图显示集群中应用运行时所使用配置信息,Kubernetes提供了配置字典(ConfigMaps)和秘密字典(Secrets),通过配置视图,能够编辑和管理配置对象,以及查看隐藏的敏感信息。
    
    6日志视图
    Pod列表和详细信息页面提供了查看日志视图的链接,通过日志视图不但能够查看Pod的日志信息,也能够查看Pod容器的日志信息。通过Dashboard能够根据向导创建和部署一个容器化的应用,当然也可以通过手工的方式输入指定应用信息,或者通过上传YAML和JSON文件来创建和不受应用。

    2 、部署应用

    1手动创建应用
    通过向导创建和部署容器化应用时,需要提供如下的一些信息:
    应用名称(App name 必需): 需要部署的应用的名称。带有此值的标签将会被添加至部署和服务中。在当前的Kubernetes命名空间中,应用名称必须是唯一的。同时,应用名称必须以小写字母开头,以小写字母和数字结尾,可以包含字母、数字和“-”。名称最长为24个字母。
    容器组个数(Number of pods 必需): 希望部署的容器组数量。值必须为整数。
    描述(Description): 对于应用的描述,将被添加至部署的注释中,并在应用详细信息中显示。
    标签(Labels): 应用的默认标签为应用的名称和版本。可以指定其它的标签,这些标签将会被应用至部署、服务、容器组等资源中。
    命名空间(Namespace):在同一个物理集群中,Kubernetes支持多个虚拟集群。这些虚拟集群被称为命名空间,通过命名空间可以将资源进行逻辑上的划分。通过下列菜单可以选择已有的命名空间,当然也可以创建新的命名空间。命名空间的名称最大的字符数为63,名词可以使用字母、数字“-”,不能包含大写字母,同时也不能全部使用数字。
    镜像拉取保密字典(Image Pull Secret): 如果Docker容器镜像是私有的,则有可能需要保密证书。Dashboard通过下拉菜单提供了所有的可用的保密凭证,也允许创建新的保密字典。保密字典名称必须遵循DNS域名语法,例如:new.image-pull.secret。保密字典的内容必须使用基于base64进行加密的,并在.dockercfg文件中进行指定。保密字典名称最长不能超过253个字符。
    环境变量(Environment variables): Kubernetes通过环境变量暴露服务, 可以创建环境变量或者使用环境变量的值将参数传递给命令。环境变量能够被应用用来发现服务,环境变量的值可以通过¥(VAR_NAME)语法被其它变量引用。
    2上传YAML或JSON文件创建应用 通过编译工具编写容器化应用的YAML和JSON文件,在Dashboard用户界面中通过上传文件创建和部署应用。

    部署步骤简单总结:

    1部署:
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
    2将Service改为NodePort
    kubectl patch svc kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}' -n kube-system
    3认证:
    认证时的账号必须为ServiceAccount:被dashboard pod拿来由kubernetes进行认证;
        token:
            (1)创建ServiceAccount,根据其管理目标,使用rolebinding或clusterrolebinding绑定至合理role或clusterrole;
            (2)获取到此ServiceAccount的secret,查看secret的详细信息,其中就有token;
        kubeconfig: 把ServiceAccount的token封装为kubeconfig文件
            (1)创建ServiceAccount,根据其管理目标,使用rolebinding或clusterrolebinding绑定至合理role或clusterrole;         
            (2)kubectl get secret | awk '/^ServiceAccount/{print $1}'
                 KUBE_TOKEN=$(kubectl get secret SERVCIEACCOUNT_SERRET_NAME -o jsonpath={.data.token} |base64 -d)
            (3)生成kubeconfig文件
                kubectl config set-cluster --kubeconfig=/PATH/TO/SOMEFILE
                kubectl config set-credentials NAME --token=$KUBE_TOKEN --kubeconfig=/PATH/TO/SOMEFILE kubectl config set-context
                kubectl config use-context

     

  • 相关阅读:
    java里面的设计模式
    MHRD_Guide
    flutter 入门(Mac)
    K8S实战-构建Django项目-03-使用共享存储
    《Effective Java》笔记45-56:通用程序设计
    机器学习实验二-集成学习
    -scp Linux之间复制文件和目录
    吴裕雄--天生自然 人工智能机器学习项目:地图数据及细胞图片数据处理报告(续五)
    吴裕雄--天生自然 人工智能机器学习项目:地图数据及细胞图片数据处理报告(续四)
    吴裕雄--天生自然 人工智能机器学习项目:地图数据及细胞图片数据处理报告(续二)
  • 原文地址:https://www.cnblogs.com/panwenbin-logs/p/10052554.html
Copyright © 2020-2023  润新知