web UI
    dashboard
    用户授权
    https://www.kubernetes.org.cn/4062.html
    https://kubernetes.io/docs/reference/access-authn-authz/authorization/
    部署dashboard

    1. # kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta1/aio/deploy/recommended.yaml
    2. namespace/kubernetes-dashboard created
    3. serviceaccount/kubernetes-dashboard created
    4. service/kubernetes-dashboard created
    5. secret/kubernetes-dashboard-certs created
    6. secret/kubernetes-dashboard-csrf created
    7. secret/kubernetes-dashboard-key-holder created
    8. configmap/kubernetes-dashboard-settings created
    9. role.rbac.authorization.k8s.io/kubernetes-dashboard created
    10. clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
    11. rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
    12. clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
    13. deployment.apps/kubernetes-dashboard created
    14. service/dashboard-metrics-scraper created
    15. deployment.apps/kubernetes-metrics-scraper created
    16. # kubectl get pods --namespace kubernetes-dashboard
    17. NAME READY STATUS RESTARTS AGE
    18. kubernetes-dashboard-5c8f9556c4-mcl44 1/1 Running 0 3m47s
    19. kubernetes-metrics-scraper-86456cdd8f-6jhh8 1/1 Running 0 3m46s
    20. # kubectl proxy
    21. Starting to serve on 127.0.0.1:8001

    由于 Dashboard 是一个 Web Server,为了避免公网暴露端口带来安全隐患,k8s1.7 版本之后的 Dashboard 项目部署完成后,只能通过 Proxy 的方式在执行了kubectl proxy的主机上访问到UI接口,要想在集群外部访问到dashboard需要通过loadbalance或者ingress

    1. # kubectl get svc --namespace kubernetes-dashboard
    2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    3. dashboard-metrics-scraper ClusterIP 10.98.63.13 <none> 8000/TCP 26m
    4. kubernetes-dashboard ClusterIP 10.105.6.68 <none> 443/TCP 26m

    将kubernetes-dashboard的Service类型改成NodePort

    1. # kubectl patch svc kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}' -n kubernetes-dashboard
    2. service/kubernetes-dashboard patched
    3. # kubectl get svc --namespace kubernetes-dashboard
    4. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    5. dashboard-metrics-scraper ClusterIP 10.98.63.13 <none> 8000/TCP 36m
    6. kubernetes-dashboard NodePort 10.105.6.68 <none> 443:30794/TCP 36m

    创建用于认证的用户
    创建ServiceAccount类型的认证账号,被dashboard pod拿来由kubernetes进行认证

    1. # kubectl apply -f dashboard-adminuser.yaml
    2. # cat dashboard-adminuser.yaml
    3. apiVersion: v1
    4. kind: ServiceAccount
    5. metadata:
    6. name: admin-user
    7. namespace: kube-system

    绑定授权,使用clusterrolebinding绑定至合理role或clusterrole

    1. # kubectl apply -f role-binding.yaml
    2. # cat role-binding.yaml
    3. apiVersion: rbac.authorization.k8s.io/v1
    4. kind: ClusterRoleBinding
    5. metadata:
    6. name: admin-user
    7. roleRef:
    8. apiGroup: rbac.authorization.k8s.io
    9. kind: ClusterRole
    10. name: cluster-admin
    11. subjects:
    12. - kind: ServiceAccount
    13. name: admin-user
    14. namespace: kube-system

    查看ServiceAccount的secret的详细信息,获取token

    1. # kubectl -n kube-system get secret | grep admin-user
    2. admin-user-token-7hnfg kubernetes.io/service-account-token 3 160m
    3. # kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

    此时可以访问随机的端口
    image.png
    查看namespace
    image.png
    node资源情况
    image.png
    由于证书问题,Google浏览器无法访问
    image.png
    通过openssl生成自签名证书配置本地认证

    1. # cd /etc/kubernetes/pki
    2. # (umask 077; openssl genrsa -out dashboard.key 2048)
    3. Generating RSA private key, 2048 bit long modulus
    4. ................+++
    5. ..................................+++
    6. e is 65537 (0x10001)
    7. # openssl req -new -key dashboard.key -out dashboard.csr -subj "/CN=WebUI"
    8. # openssl x509 -req -in dashboard.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out dashboard.crt -days 365
    9. Signature ok
    10. subject=/CN=WebUI
    11. Getting CA Private Key
    12. # openssl x509 -in dashboard.crt -text
    13. Certificate:
    14. Data:
    15. Version: 1 (0x0)
    16. Serial Number:
    17. a2:51:72:85:3d:8f:7c:d6
    18. Signature Algorithm: sha256WithRSAEncryption
    19. Issuer: CN=kubernetes
    20. Validity
    21. Not Before: Aug 5 10:43:54 2019 GMT
    22. Not After : Aug 4 10:43:54 2020 GMT
    23. Subject: CN=WebUI
    24. Subject Public Key Info:
    25. Public Key Algorithm: rsaEncryption
    26. Public-Key: (2048 bit)
    27. ......................................................

    重新生成secret

    # kubectl create secret generic kubernetes-dashboard-certs -n kubernetes-dashboard --from-file=dashboard.key --from-file=dashboard.crt
    secret/kubernetes-dashboard-certs created
    
    # kubectl get secret -n kubernetes-dashboard
    NAME                               TYPE                                  DATA   AGE
    default-token-ncd29                kubernetes.io/service-account-token   3      19m
    kubernetes-dashboard-certs         Opaque                                2      19m
    kubernetes-dashboard-csrf          Opaque                                1      6m31s
    kubernetes-dashboard-key-holder    Opaque                                2      6m30s
    kubernetes-dashboard-token-7gjt9   kubernetes.io/service-account-token   3      13m
    
    # kubectl describe secret  kubernetes-dashboard-certs -n kubernetes-dashboard
    Name:         kubernetes-dashboard-certs
    Namespace:    kubernetes-dashboard
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    dashboard.key:  1679 bytes
    dashboard.crt:  973 bytes
    

    将配置文件中创建secret的相关信息去掉,重新apply

    ---
    apiVersion: v1
    kind: Secret
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
      name: kubernetes-dashboard-certs
      namespace: kube-system
    type: Opaque
    ---
    也可以修改svc类型为NodePort并指定映射端口,范围为30000-32767
    ---
    kind: Service
    apiVersion: v1
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kubernetes-dashboard
    spec:
      type: NodePort
      ports:
        - port: 443
          nodePort: 31777
          targetPort: 8443
      selector:
        k8s-app: kubernetes-dashboard
    ---
    # kubectl apply -f create-dashboard.yml
    

    再次使用Google浏览器访问即可正常查看证书信息
    image.png