1.5 部署 web 服务 dashboard

GitHub项目地址:

https://github.com/kubernetes/dashboard

dashboard的兼容性不太好,这里选择v2.3.1版本

1.5.1 部署 dashboard v2.3.1

默认官方的yaml文件中没有定义暴露端口,所以直接拿来用是无法使用的,需要暴露一个端口。

# 加nodePort参数暴露端口
[root@k8s-master1 ~]# vim dashboard-v2.3.1.yaml
......
 30 ---
 31 
 32 kind: Service
 33 apiVersion: v1
 34 metadata:
 35   labels:
 36     k8s-app: kubernetes-dashboard
 37   name: kubernetes-dashboard
 38   namespace: kubernetes-dashboard
 39 spec:
 40   type: NodePort    # 添加此行
 41   ports:
 42     - port: 443
 43       targetPort: 8443
 44       nodePort: 30002   # 添加此行
 45   selector:
 46     k8s-app: kubernetes-dashboard
......

1.5.2 下载镜像并传至 harbor

1.5.2.1 下载镜像

# 查询镜像
[root@k8s-master1 ~]# grep image dashboard-v2.3.1.yaml
          image: kubernetesui/dashboard:v2.3.1
          imagePullPolicy: Always
          image: kubernetesui/metrics-scraper:v1.0.6
[root@k8s-master1 ~]# 

# 拉取镜像
[root@k8s-master1 ~]# docker pull kubernetesui/dashboard:v2.3.1
v2.3.1: Pulling from kubernetesui/dashboard
b82bd84ec244: Pull complete 
21c9e94e8195: Pull complete 
Digest: sha256:ec27f462cf1946220f5a9ace416a84a57c18f98c777876a8054405d1428cc92e
Status: Downloaded newer image for kubernetesui/dashboard:v2.3.1
docker.io/kubernetesui/dashboard:v2.3.1
[root@k8s-master1 ~]# 

# 打标签
[root@k8s-master1 ~]# docker tag e1482a24335a harbor.waluna.top/baseimages/dashboard:v2.3.1
[root@k8s-master1 ~]# 

# 修改hosts解析
[root@k8s-master1 ~]# vim /etc/hosts
10.0.0.59 harbor.waluna.top

# 上传镜像,默认无法上传
[root@k8s-master1 ~]# docker push harbor.waluna.top/baseimages/dashboard:v2.3.1
The push refers to repository [harbor.waluna.top/baseimages/dashboard]
Get "https://harbor.waluna.top/v2/": dial tcp 10.0.0.59:443: connect: connection refused
[root@k8s-master1 ~]# 

1.5.2.2 配置 docker 及 harbor

# 修改docker非安全的镜像仓库列表
[root@k8s-master1 ~]# dockerd --help|grep insecure
      --insecure-registry list                  Enable insecure registry communication
[root@k8s-master1 ~]# 

# 修改docker.service文件
[root@k8s-master1 ~]# vim /lib/systemd/system/docker.service
[root@k8s-master1 ~]# grep ExecStart /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry harbor.waluna.top  # 修改此行,添加后面参数
[root@k8s-master1 ~]# 

# 重启docker
[root@k8s-master1 ~]# systemctl daemon-reload
[root@k8s-master1 ~]# systemctl restart docker.service
[root@k8s-master1 ~]# 

# 需要在其他master和node节点进行同样操作
[root@k8s-master1 ~]# scp /lib/systemd/system/docker.service 10.0.0.19:/lib/systemd/system/docker.service
[root@k8s-master1 ~]# scp /lib/systemd/system/docker.service 10.0.0.29:/lib/systemd/system/docker.service
[root@k8s-master1 ~]# scp /lib/systemd/system/docker.service 10.0.0.69:/lib/systemd/system/docker.service
[root@k8s-master1 ~]# scp /lib/systemd/system/docker.service 10.0.0.79:/lib/systemd/system/docker.service
[root@k8s-master1 ~]# scp /lib/systemd/system/docker.service 10.0.0.89:/lib/systemd/system/docker.service

# 修改hosts
[root@k8s-master2 ~]# echo "10.0.0.59 harbor.waluna.top" >> /etc/hosts
[root@k8s-master3 ~]# echo "10.0.0.59 harbor.waluna.top" >> /etc/hosts
[root@node1 ~]# echo "10.0.0.59 harbor.waluna.top" >> /etc/hosts
[root@node2 ~]# echo "10.0.0.59 harbor.waluna.top" >> /etc/hosts
[root@node3 ~]# echo "10.0.0.59 harbor.waluna.top" >> /etc/hosts

# 重启docker
[root@k8s-master2 ~]# systemctl daemon-reload && systemctl restart docker.service
[root@k8s-master3 ~]# systemctl daemon-reload && systemctl restart docker.service
[root@node1 ~]# systemctl daemon-reload && systemctl restart docker.service
[root@node2 ~]# systemctl daemon-reload && systemctl restart docker.service
[root@node3 ~]# systemctl daemon-reload && systemctl restart docker.service

# 登录harbor
[root@k8s-master1 ~]# docker login harbor.waluna.top                    
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@k8s-master1 ~]# 

# 上传镜像
[root@k8s-master1 ~]# docker push harbor.waluna.top/baseimages/dashboard:v2.3.1
The push refers to repository [harbor.waluna.top/baseimages/dashboard]
c94f86b1c637: Pushed 
8ca79a390046: Pushed 
v2.3.1: digest: sha256:e5848489963be532ec39d454ce509f2300ed8d3470bdfb8419be5d3a982bb09a size: 736
[root@k8s-master1 ~]# 

查看 harbor 中的镜像

复制镜像地址

docker pull harbor.waluna.top/baseimages/dashboard:v2.3.1

去 node 节点进行测试

[root@node1 ~]# docker pull harbor.waluna.top/baseimages/dashboard:v2.3.1
v2.3.1: Pulling from baseimages/dashboard
b82bd84ec244: Pull complete 
21c9e94e8195: Pull complete 
Digest: sha256:e5848489963be532ec39d454ce509f2300ed8d3470bdfb8419be5d3a982bb09a
Status: Downloaded newer image for harbor.waluna.top/baseimages/dashboard:v2.3.1
harbor.waluna.top/baseimages/dashboard:v2.3.1
[root@node1 ~]# 

1.5.2.3 部署 dashboard

# 将另外一个镜像也上传至harbor
[root@k8s-master1 ~]# grep image dashboard-v2.3.1.yaml
          image: kubernetesui/dashboard:v2.3.1
          imagePullPolicy: Always
          image: kubernetesui/metrics-scraper:v1.0.6
[root@k8s-master1 ~]# docker pull kubernetesui/metrics-scraper:v1.0.6
v1.0.6: Pulling from kubernetesui/metrics-scraper
47a33a630fb7: Pull complete 
62498b3018cb: Pull complete 
Digest: sha256:1f977343873ed0e2efd4916a6b2f3075f310ff6fe42ee098f54fc58aa7a28ab7
Status: Downloaded newer image for kubernetesui/metrics-scraper:v1.0.6
docker.io/kubernetesui/metrics-scraper:v1.0.6
[root@k8s-master1 ~]# docker tag docker.io/kubernetesui/metrics-scraper:v1.0.6 harbor.waluna.top/baseimages/metrics-scraper:v1.0.6
[root@k8s-master1 ~]# docker push harbor.waluna.top/baseimages/metrics-scraper:v1.0.6
The push refers to repository [harbor.waluna.top/baseimages/metrics-scraper]
a652c34ae13a: Pushed 
6de384dd3099: Pushed 
v1.0.6: digest: sha256:c09adb7f46e1a9b5b0bde058713c5cb47e9e7f647d38a37027cd94ef558f0612 size: 736
[root@k8s-master1 ~]# 

# 修改yaml文件
[root@k8s-master1 ~]# vim dashboard-v2.3.1.yaml
[root@k8s-master1 ~]# grep image dashboard-v2.3.1.yaml
          image: harbor.waluna.top/baseimages/dashboard:v2.3.1
          imagePullPolicy: Always
          image: harbor.waluna.top/baseimages/metrics-scraper:v1.0.6
[root@k8s-master1 ~]# 

# 权限控制文件,默认没有,个人编写
[root@k8s-master1 ~]# cat admin-user.yml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
[root@k8s-master1 ~]# 

# 创建dashboard
[root@k8s-master1 ~]# kubectl apply -f dashboard-v2.3.1.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
[root@k8s-master1 ~]# kubectl apply -f admin-user.yml       
serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created
[root@k8s-master1 ~]# 

1.5.2.4 验证 dashboard 状态

# 查看pod状态
[root@k8s-master1 ~]# kubectl get pod -A|grep dashboard
kubernetes-dashboard   dashboard-metrics-scraper-5b8df6cd57-6n9cg       1/1     Running   0          2m29s
kubernetes-dashboard   kubernetes-dashboard-695b8fd8ff-zm4mq            1/1     Running   0          2m29s
[root@k8s-master1 ~]# 

# 查看service
[root@k8s-master1 ~]# kubectl get service -A
NAMESPACE              NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
default                kubernetes                  ClusterIP   10.20.0.1       <none>        443/TCP                  3h2m
kube-system            kube-dns                    ClusterIP   10.20.0.10      <none>        53/UDP,53/TCP,9153/TCP   3h1m
kubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   10.20.138.149   <none>        8000/TCP                 22m
kubernetes-dashboard   kubernetes-dashboard        NodePort    10.20.56.249    <none>        443:30002/TCP            10m
[root@k8s-master1 ~]# 

# 查看端口
[root@k8s-master1 ~]# ss -nrl |grep 30002
tcp               LISTEN              0                    128                                                                                          0.0.0.0:30002                                             0.0.0.0:*                     
[root@k8s-master1 ~]# 

# 会在每个node节点都会监听30002端口
[root@node1 ~]# ss -ntl|grep 30002
LISTEN   0         128                 0.0.0.0:30002            0.0.0.0:*       
[root@node1 ~]# 

1.5.2.5 访问 dashboard

因为每个node节点都会监听30002端口,所以可以访问任意一个node节点

直接访问会提示使用https

访问 https://10.0.0.69:30002/

需要一个token登录

在有权限的节点上获取token

[root@k8s-master1 ~]# kubectl get secret -A|grep admin
kubernetes-dashboard   admin-user-token-4pmmf                           kubernetes.io/service-account-token   3      28m
[root@k8s-master1 ~]# 

# 查看详细信息
[root@k8s-master1 ~]# kubectl describe secret admin-user-token-4pmmf -n kubernetes-dashboard
Name:         admin-user-token-4pmmf
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: admin-user
              kubernetes.io/service-account.uid: 978398fa-49df-43eb-bdd2-fd9b789f0892

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1066 bytes
namespace:  20 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6Ii1LZnRuc0ZjM0ZXQV9NT1hidlNWOXhEbVVvSzQ1S1JzTVFKWkpaa3BReHMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTRwbW1mIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NzgzOThmYS00OWRmLTQzZWItYmRkMi1mZDliNzg5ZjA4OTIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.F4lOn-CwbOS-Su_qgky7k0MA0k8HamswZa9XO44DTrj9JZUzoKTWittvMl2maN0uhY1Wyn7KidRcYlteMu92-P5WxU2kY3UnearOc8TkvdcRPeKHSp0NQuMOymwQxJmYHifTOG0imc01CnJ0sZSDuBqzRYlWDSyUUu1AphU-VSgZr1zXUB8hmspQgqP_6cyKWNqeXoH5km4d_OToXDlSym5rCKY_eaNWZXp7GH0n6DQ9nLzmaNrnro9eOUch95DyBCqzZnYr1_FvnWr_BS5bQP5xezOKyRXgFvm4tLAivMtNsNa-xXdhiyQJt-dZBv1Z-nFOLz_VcfXHagrcKChDuQ
[root@k8s-master1 ~]# 

复制到浏览器点击登录

成功登录