一 Kubernetes dashboard简介
1.1 Web UI简介
dashboard是基于Web的Kubernetes用户界面。可以使用dashboard将容器化应用程序部署到Kubernetes集群,对容器化应用程序进行故障排除,以及管理集群资源。可以使用dashboard来概述群集上运行的应用程序,以及创建或修改单个Kubernetes资源(例如部署、任务、守护进程等)。可以使用部署向导扩展部署,启动滚动更新,重新启动Pod或部署新应用程序。 dashboard还提供有关群集中Kubernetes资源状态以及可能发生的任何错误的信息。1.2 前置准备
本实验依赖于《附016.Kubernetes_v1.17高可用部署》,即已提前部署好Kubernetes。二 dashboard部署
2.1 设置标签
[root@master01 ~]# kubectl label nodes master01 k8srole=master [root@master01 ~]# kubectl label nodes master02 k8srole=master [root@master01 ~]# kubectl label nodes master03 k8srole=master [root@master01 ~]# kubectl taint nodes --all node-role.kubernetes.io/master- #允许master部署应用 提示:部署完内部应用后可使用kubectl taint node master01 node-role.kubernetes.io/master="":NoSchedule重新设置Master为Master Only 状态。2.2 创建证书
由于自动生成的证书可能过期,建议手动生成证书,而取消yaml中自动创建secret的部分。 [root@master01 ~]# cd /etc/kubernetes/pki/ [root@master01 pki]# openssl genrsa -out dashboard.key 2048 [root@master01 pki]# openssl req -new -out dashboard.csr -key dashboard.key -subj "/CN=dashboard" [root@master01 pki]# openssl x509 -req -sha256 -in dashboard.csr -out dashboard.crt -signkey dashboard.key -days 3650 [root@master01 pki]# openssl x509 -noout -text -in ./dashboard.crt #查看证书2.3 分发证书
[root@master01 pki]# for all_ip in ${ALL_IPS[@]} do echo ">>> ${all_ip}" scp /etc/kubernetes/pki/dashboard.* root@${all_ip}:/etc/kubernetes/pki/ done2.4 手动创建secret
[root@master01 ~]# ll /etc/kubernetes/pki/dashboard.* -rw-r--r-- 1 root root 1.2K Dec 3 03:10 /etc/kubernetes/pki/dashboard.crt -rw-r--r-- 1 root root 976 Dec 3 03:10 /etc/kubernetes/pki/dashboard.csr -rw-r--r-- 1 root root 1.7K Dec 3 03:09 /etc/kubernetes/pki/dashboard.key [root@master01 ~]# kubectl create ns kubernetes-dashboard #v2版本dashboard独立ns [root@master01 ~]# kubectl create secret generic kubernetes-dashboard-certs --from-file="/etc/kubernetes/pki/dashboard.crt,/etc/kubernetes/pki/dashboard.key" -n kubernetes-dashboard #以新证书创建dashboard的secret [root@master dashboard]# kubectl get secret kubernetes-dashboard-certs -n kubernetes-dashboard -o yaml #查看新证书2.5 下载yaml
[root@master01 ~]# mkdir /root/dashboard #建议将yaml存储到本地 [root@master01 ~]# cd /root/dashboard [root@master01 dashboard]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml2.6 修改为yaml
[root@master01 dashboard]# vi recommended.yaml1 …… #如下新增管理员及角色授权为cluster-admin 2 --- 3 4 5 apiVersion: v1 6 kind: ServiceAccount 7 metadata: 8 name: admin-user 9 namespace: kubernetes-dashboard 10 11 12 --- 13 …… 14 kind: Service 15 apiVersion: v1 16 metadata: 17 labels: 18 k8s-app: kubernetes-dashboard 19 name: kubernetes-dashboard 20 namespace: kubernetes-dashboard 21 spec: 22 type: NodePort #新增 23 ports: 24 - port: 443 25 nodePort: 30000 #新增 26 targetPort: 8443 27 selector: 28 k8s-app: kubernetes-dashboard 29 --- 30 …… #如下全部注释 31 #apiVersion: v1 32 #kind: Secret 33 #metadata: 34 # labels: 35 # k8s-app: kubernetes-dashboard 36 # name: kubernetes-dashboard-certs 37 # namespace: kubernetes-dashboard 38 #type: Opaque 39 …… 40 --- 41 42 43 apiVersion: rbac.authorization.k8s.io/v1 44 kind: ClusterRoleBinding 45 metadata: 46 name: admin-user 47 roleRef: 48 apiGroup: rbac.authorization.k8s.io 49 kind: ClusterRole 50 name: cluster-admin 51 subjects: 52 - kind: ServiceAccount 53 name: admin-user 54 namespace: kubernetes-dashboard 55 56 57 --- 58 …… 59 replicas: 3 #适当调整为3副本 60 …… 61 imagePullPolicy: IfNotPresent #修改 62 …… 63 nodeSelector: 64 "beta.kubernetes.io/os": linux 65 "k8srole": master #部署在master节点 66 …… 67 nodeSelector: 68 "beta.kubernetes.io/os": linux 69 "k8srole": master #部署在master节点 70 …… #注释从而实现在master的部署 71 #tolerations: 72 # - key: node-role.kubernetes.io/master 73 # effect: NoSchedule 74 …… 75 …… 76 kind: Service 77 apiVersion: v1 78 metadata: 79 labels: 80 k8s-app: dashboard-metrics-scraper 81 name: dashboard-metrics-scraper 82 namespace: kubernetes-dashboard 83 spec: 84 85 86 type: NodePort #新增 87 ports: 88 - port: 8000 89 nodePort: 30001 #新增 90 targetPort: 8000 91 selector: 92 k8s-app: dashboard-metrics-scraper 93 …… 94 replicas: 3 #适当调整为3副本 95 …… 96 nodeSelector: 97 "beta.kubernetes.io/os": linux 98 "k8srole": master #部署在master节点 99 …… #注释从而实现在master的部署 100 #tolerations: 101 # - key: node-role.kubernetes.io/master 102 # effect: NoSchedule 103 ……提示:具体完整yaml参考附件。
2.6 正式部署
[root@master01 dashboard]# kubectl apply -f recommended.yaml [root@master01 ~]# kubectl get deployment kubernetes-dashboard -n kubernetes-dashboard [root@master01 ~]# kubectl get services -n kubernetes-dashboard [root@master01 ~]# kubectl get pods -o wide -n kubernetes-dashboard 提示:master01 NodePort 30000/TCP映射到 dashboard pod 443 端口。三 访问dashboard
3.1 导入证书
将dashboard.crt导入浏览器,并设置为信任,导入操作略。3.2 创建kubeconfig文件
使用token相对复杂,可将token添加至kubeconfig文件中,使用KubeConfig 文件访问dashboard。 [root@k8smaster01 ~]# ADMIN_SECRET=$(kubectl get secrets -n kubernetes-dashboard | grep admin-user-token- | awk '{print $1}') [root@k8smaster01 ~]# DASHBOARD_LOGIN_TOKEN=$(kubectl describe secret -n kubernetes-dashboard ${ADMIN_SECRET} | grep -E '^token' | awk '{print $2}') [root@k8smaster01 ~]# kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/pki/ca.crt \ --embed-certs=true \ --server=172.24.8.254:16443 \ --kubeconfig=dashboard_admin.kubeconfig # 设置集群参数 [root@k8smaster01 ~]# kubectl config set-credentials dashboard_user \ --token=${DASHBOARD_LOGIN_TOKEN} \ --kubeconfig=dashboard_admin.kubeconfig # 设置客户端认证参数,使用上面创建的 Token [root@k8smaster01 ~]# kubectl config set-context default \ --cluster=kubernetes \ --user=dashboard_user \ --kubeconfig=dashboard_admin.kubeconfig # 设置上下文参数 [root@k8smaster01 ~]# kubectl config use-context default --kubeconfig=dashboard_admin.kubeconfig # 设置默认上下文 #将dashboard.kubeconfig文件导入,以便于浏览器使用该文件登录。3.3 测试访问dashboard
本实验采用nodeip:nodepord方式访问。 浏览器访问:https://172.24.8.254:30000 使用dashboard_admin.kubeconfig文件访问: 提示: 更多dashboard访问方式及认证可参考《附004.Kubernetes Dashboard简介及使用》。 dashboard登录整个流程可参考:https://www.cnadn.net/post/2613.htm 本试验基于apiserver访问方式+Kubeconfig身份验证进行登录。 通过apiserver形式访问:https://172.24.8.254:16443/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ 附001:导出当前Kubernetes证书 [root@master ~]# grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt [root@master ~]# grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key [root@master ~]# openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out k8s.crt -name "kubernetes-client" Enter Export Password:[x120952576] Verifying - Enter Export Password:[x120952576] 使用相应的密码,将k8s.crt导入IE浏览器,导入操作略。四 Metrics部署
4.1 Metrics
Kubernetes的早期版本依靠Heapster来实现完整的性能数据采集和监控功能,Kubernetes从1.8版本开始,性能数据开始以Metrics API的方式提供标准化接口,并且从1.10版本开始将Heapster替换为Metrics Server。在Kubernetes新的监控体系中,Metrics Server用于提供核心指标(Core Metrics),包括Node、Pod的CPU和内存使用指标。 对其他自定义指标(Custom Metrics)的监控则由Prometheus等组件来完成。4.2 开启聚合层
有关聚合层知识参考:https://blog.csdn.net/liukuan73/article/details/81352637 kubeadm方式部署默认已开启。4.3 获取部署文件
[root@master01 ~]# git clone https://github.com/kubernetes-incubator/metrics-server.git [root@master01 ~]# cd metrics-server/deploy/kubernetes/ [root@master01 kubernetes]# vi metrics-server-deployment.yaml1 …… 2 spec: 3 hostNetwork: true 4 …… 5 containers: 6 - name: metrics-server 7 image: gcr.azk8s.cn/google_containers/metrics-server-amd64:v0.3.6 #修改为国内源 8 imagePullPolicy: IfNotPresent 9 args: 10 - --cert-dir=/tmp 11 - --secure-port=4443 12 - --kubelet-insecure-tls 13 - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP #添加如上command 14 ……