0%

从零开始搭建k8s集群环境(六)——部署Dashboard UI

从零开始搭建 k8s 集群环境系列笔记:

在上一篇博客中,我们的 k8s 集群基本就已经部署完成了。但是为了方便了解 k8s 的各项概念,我们再继续把 k8s 的 Dashboard UI图形化界面 插件搭建起来。

环境说明:

  • Master:VBox虚拟机/Centos_7.5-1804/192.168.56.100
  • Images:VBox虚拟机/Centos_7.5-1804/192.168.56.101
  • Node01:VBox虚拟机/Centos_7.5-1804/192.168.56.102

软件环境说明:

  • docker-ce-17.03.2
  • kubernetes-v1.9.0
  • harbor-v1.4.0

一、准备镜像和 yaml 文件

镜像

老规矩,阿里云走起:

docker pull registry.cn-shenzhen.aliyuncs.com/lx0758/kubernetes-dashboard-amd64:v1.8.3
docker tag registry.cn-shenzhen.aliyuncs.com/lx0758/kubernetes-dashboard-amd64:v1.8.3 k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3
docker rmi registry.cn-shenzhen.aliyuncs.com/lx0758/kubernetes-dashboard-amd64:v1.8.3

yaml 文件

wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

修改 yaml 文件

实际操作发现,服务器的 yaml 有些地方并不太合理,所以还得手动修改一下。

更改镜像下载策略

yml 中默认强制走服务器下拉镜像,在国内网络环境明显是不合理的,需要改成 “如果本地没有再去拉取”。

修改镜像 pull 策略

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  template:
    spec:
      containers:
        image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3
        # 修改镜像 pull 策略
        imagePullPolicy: IfNotPresent

更改部署节点

通过节点名称改变

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  template:
    spec:
      # nodeName 和 containers 同级
      # 强制指定调度节点为 localhost.master
      nodeName: localhost.master

通过节点标签改变

查看所有节点所有 label

[root@localhost ~]# kubectl get nodes localhost.master --show-labels
NAME               STATUS    ROLES     AGE       VERSION   LABELS
localhost.master   Ready     master    14h       v1.9.0    beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=localhost.master,node-role.kubernetes.io/master=

这里我们使用 k8s 自带的 lable 操作:

kubernetes.io/hostname=localhost.master

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  template:
    spec:
      # nodeSelector 和 containers 同级
      nodeSelector:
        # 指定调度节点label标记为:
        # kubernetes.io/hostname=localhost.master 的节点
        kubernetes.io/hostname: localhost.master

修改 apiserver Host

必须指向自己的 Master 的 apiserver:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  template:
    spec:
      containers:
      - args:
          - --auto-generate-certificates
          # Uncomment the following line to manually specify Kubernetes API server Host
          # If not specified, Dashboard will attempt to auto discover the API server and connect
          # to it. Uncomment only if the default does not work.
          # - --apiserver-host=http://my-address:port
          # 这里对应 apiserver 的访问地址,如果是 https 还需要下面那一句
          - --apiserver-host=https://192.168.56.100:6443
          # 因为 apiserver 是证书认证,所以需要加上证书信息(这个文件是挂载的)
          - --kubeconfig=/etc/kubernetes/master-kubeconfig.yaml

由于 apiserver 使用的是 https 协议证书授权,我们还需要向 pod 配置证书挂载:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  template:
    spec:
      containers:
        volumeMounts:
        # 添加一个容器内挂载目标,和上一步 --kubeconfig 定义路径相同
        - mountPath: /etc/kubernetes/master-kubeconfig.yaml
          name: kubeconfig
      volumes:
      # 添加挂载文件所在主机的位置
      - name: kubeconfig
        hostPath:
          path: /root/.kube/config

添加直接访问端口

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  # 添加端口类型
  type: NodePort
  ports:
    - port: 443
      # 添加直接访问端口
      nodePort: 30000
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard

二、正式部署

应用 yaml 文件

kubectl create -f ./kubernetes-dashboard.yaml

开始使用

没有问题的话,就可以通过浏览器访问了(可能需要在浏览器添加例外):

https://192.168.56.100:30000/

Token登录

这里有一个简单的命令:

kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token

也可以自己手动查询:

# 输入下面命令查询kube-system命名空间下的所有secret
kubectl get secret -n kube-system

# 然后获取token。只要是type为service-account-token的secret的token都可以使用。
# 比如我们获取replicaset-controller-token-wsv4v的touken
kubectl -n kube-system describe replicaset-controller-token-wsv4v

Kubeconfig验证

只需要在 kubeadm 生成的 admin.conf 文件末尾加上刚刚获取的 token 就好了。

- name: kubernetes-admin
  user:
    client-certificate-data: xxxxxxxx
    client-key-data: xxxxxx
    token: "在这里加上token"

三、问题总结

Dashboard 自动在节点运行,导致不可用

具体表现症状是 Pod 运行出错,但镜像已经下拉成功。加改变运行节点的配置,强制在 Master 节点运行。

其他问题

其实遇到的问题还很多,虽然部署是成功了,但是有些问题我也还没弄明白原理,就先不写出来了。

四、参考文献

  1. kubernetes1.8原生dashboard部署
  2. Web UI (Dashboard) - kubernetes