安装dashboard监控界面 (仅主节点运行)

dashboard官网参考

使用命令

kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

输出如下:

[root@k8s kubernetes]# kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
secret/kubernetes-dashboard-certs created
serviceaccount/kubernetes-dashboard created
role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
deployment.apps/kubernetes-dashboard created
service/kubernetes-dashboard created

查看dashboard镜像是否正常运行

[root@k8s kubernetes]# kubectl get pod --namespace=kube-system
NAME                                   READY     STATUS         RESTARTS   AGE
coredns-78fcdf6894-jf5tn               1/1       Running        0          2h
coredns-78fcdf6894-ljmmh               1/1       Running        0          2h
etcd-k8s                               1/1       Running        0          2h
kube-apiserver-k8s                     1/1       Running        0          2h
kube-controller-manager-k8s            1/1       Running        0          2h
kube-flannel-ds-amd64-8p2px            1/1       Running        0          1h
kube-flannel-ds-amd64-fvpj7            1/1       Running        0          2h
kube-flannel-ds-amd64-p6g4w            1/1       Running        0          1h
kube-proxy-c8rrg                       1/1       Running        0          2h
kube-proxy-hp4lj                       1/1       Running        0          1h
kube-proxy-tn2fl                       1/1       Running        0          1h
kube-scheduler-k8s                     1/1       Running        0          2h
kubernetes-dashboard-6948bdb78-mf7tm   0/1       ErrImagePull   0          1m

显示获取错误,我们首先需要知道需要的是哪个版本的镜像,把yaml文件下载下来,使用命令

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

使用命令可以找到需要的镜像版本号如: image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3

cat  kubernetes-dashboard.yaml|grep kubernetes-dashboard

我们仍然去找国内的镜像地址获取再改名,使用命令如下(所有节点都需要获取镜像):

docker pull  anjia0532/kubernetes-dashboard-amd64:v1.8.3
docker tag   anjia0532/kubernetes-dashboard-amd64:v1.8.3 k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3

dashboard默认的 yaml 文件中对于 image 拉取策略的定义是 无论何时都会去拉取镜像,导致即使我们已经docker pull镜像,重命名好仍然会去外网拉取,我们需要修改一下获取镜像策略,最后再 create -f 即可。
使用命令

vi kubernetes-dashboard.yaml

找到imagePullPolicy设置,把 Always 改成 IfNotPresent(本地没有再去拉取) 或者 Never(从不去拉取) 即可。
如果没有找到,则在image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3下增加

imagePullPolicy: Never

如图
在这里插入图片描述

使用命令重新安装dashboard

kubectl delete -f kubernetes-dashboard.yaml
kubectl create -f kubernetes-dashboard.yaml

使用命令查看是否dashboard镜像是否正常运行

[root@k8s ~]#  kubectl get pod --namespace=kube-system
NAME                                    READY     STATUS    RESTARTS   AGE
coredns-78fcdf6894-jf5tn                1/1       Running   0          3h
coredns-78fcdf6894-ljmmh                1/1       Running   0          3h
etcd-k8s                                1/1       Running   0          3h
kube-apiserver-k8s                      1/1       Running   3          3h
kube-controller-manager-k8s             1/1       Running   1          3h
kube-flannel-ds-amd64-8p2px             1/1       Running   0          2h
kube-flannel-ds-amd64-fvpj7             1/1       Running   0          3h
kube-flannel-ds-amd64-p6g4w             1/1       Running   0          2h
kube-proxy-c8rrg                        1/1       Running   0          3h
kube-proxy-hp4lj                        1/1       Running   0          2h
kube-proxy-tn2fl                        1/1       Running   0          2h
kube-scheduler-k8s                      1/1       Running   0          3h
kubernetes-dashboard-69c58954fc-99dkn   1/1       Running   0          15s

访问dashboard

这时有两种方式访问dashboard

方式一 使用kubectl proxy

使用kubectl proxy命令就可以使API server监听在本地的8001端口上
使用命令如下:

kubectl proxy --address='0.0.0.0'  --accept-hosts='^*$'

则在内网的任意节点浏览器中可以使用地址访问

192.168.11.90:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ 

方式二 设置NodePort

通过设置nodePort暴露出外网可访问的服务的地址.

NodePort是将节点直接暴露在外网的一种方式,只建议在开发环境,单节点的安装方式中使用。

修改yaml,添加NodePort.
使用命令

vi kubernetes-dashboard.yaml 

找到kind: Service
如下:

# ------------------- Dashboard Service ------------------- #

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard

修改代码如下:

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  # 添加Service的type为NodePort
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      # 添加映射到虚拟机的端口,k8s只支持30000以上的端口
      nodePort: 30001
  selector:
    k8s-app: kubernetes-dashboard

重启dashboard

kubectl delete -f kubernetes-dashboard.yaml
kubectl create -f kubernetes-dashboard.yaml

通过describe命令我们可以查看其暴露出的 NodePoint,然后便可访问
使用命令输出如下:

[root@k8s ~]# kubectl describe services kubernetes-dashboard -n kube-system
Name:                     kubernetes-dashboard
Namespace:                kube-system
Labels:                   k8s-app=kubernetes-dashboard
Annotations:              <none>
Selector:                 k8s-app=kubernetes-dashboard
Type:                     NodePort
IP:                       10.97.101.40
Port:                     <unset>  443/TCP
TargetPort:               8443/TCP
NodePort:                 <unset>  30001/TCP
Endpoints:                <none>
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

找到NodePort,然后直接访问
需要注意的是,在多节点的集群中,必须找到运行Dashboard节点的IP来访问,而不是Master节点的IP

http://<ip>:30001

就能够进入dashboard。

例如:

http://192.168.11.90:30001/

如果访问不了的话使用以下命令排查

# 查看pod 运行状态
kubectl get pod -n kube-system | grep dashboard
kubernetes-dashboard-7c74685c48-9qdpn   1/1       Running   0          22s
# 查看dashboard service
kubectl get svc -n kube-system|grep dashboard
kubernetes-dashboard   NodePort    10.68.219.38   <none>        443:24108/TCP                   53s
# 查看集群服务
kubectl cluster-info|grep dashboard
kubernetes-dashboard is running at https://192.168.1.1:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
# 查看pod 运行日志,关注有没有错误
kubectl logs kubernetes-dashboard-7c74685c48-9qdpn -n kube-system

如果局域网还是访问不了需要注意防火墙和转发的问题,尝试运行命令

iptables -P FORWARD ACCEPT

可能遇到的问题–is not present with pull policy of Never

需要确认 所有的节点中都包含 需要的镜像,否则会报错。
解决方式
所有节点都准备好需要的镜像即可。

配置访问权限

成功登录dashboard后发现需要配置用户才能继续访问
如图
在这里插入图片描述

我们这里使用令牌 token的方式如下:

##创建用户
1.创建服务账号

首先创建一个叫admin-user的服务账号,并放在kube-system名称空间下:
使用命令

vi admin-user.yaml

输入内容如下:

# admin-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system

执行kubectl create命令:

kubectl create -f admin-user.yaml

2.绑定角色

默认情况下,kubeadm创建集群时已经创建了admin角色,我们直接绑定即可:
使用命令

vi admin-user-role-binding.yaml

输入内容如下:

# admin-user-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system

执行kubectl create命令:

kubectl create -f  admin-user-role-binding.yaml

3.获取Token

现在我们需要找到新创建的用户的Token,以便用来登录dashboard:

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

输出类似:

[root@k8s ~]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
Name:         admin-user-token-7zmcs
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name=admin-user
              kubernetes.io/service-account.uid=a7bddc3e-b80b-11e8-94e4-000c29993cc5

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTd6bWNzIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJhN2JkZGMzZS1iODBiLTExZTgtOTRlNC0wMDBjMjk5OTNjYzUiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.IA6CVBVLMd-mn1F7LyGLcqomKvSyjodnqdxI3KXHK8-62EOKSL-vyi8K9oNunf3B0at-qCo8ff1U_YeMlebu0wcYJXm9YwFwyBkLTTfbtXm4tDOV-Oys8WTn96h2urcxl9zqKbkt03DUJt_PWnNi92SyPw5P7etJAjga6_QMKgHmHvnTx9bQ7tm9BvUr56SJU5tS5NUl5MkNcdgP45LMcUCR_P7xXngxSTITlaTWf5R2F6YxfjO_IPdmaqoaQ9tCbwEMVW4nxPjTj3zzEz7riP7EWSHyCqzfj6KEDbjsk0wwsPUDc8pT9kxXOMlLwh2m1n6ZL9o83NTs7S8hLBHMUg
[root@k8s ~]# 

然后把Token复制到登录界面的Token输入框中,登入后显示如下:
在这里插入图片描述

可能遇到的问题-点击登录没反应

方式的选择

需要注意的是 想要登录到dashboard进行操作监控需要访问的权限,跟我们采用的访问方式有关。

使用kubectl proxy代理的方式来访问webUI。
使用这个代理的方式访问发现输入token或者k k8s的config后点击登录无响应。
原因是
在dashboard1.7 以上的版本只有localhost访问和127.0.0.1时才能使用http的方式去访问。
如果使用其他ip,只能使用https的方式去查看。

使用NodePort方式会强制要求使用https的方式, 可以登陆成功。

如下:
在这里插入图片描述

如果使用kubectl proxy方式需要安装证书。

详情参看
Accessing Dashboard 1.7.X and above

Can’t sign in into dashboard

Kubernetes 仪表板通过config和token点击登录无法跳转页面

安装配置https访问

使用命令

kubectl cluster-info

输出如下:

[root@k8s ~]# kubectl cluster-info
Kubernetes master is running at https://192.168.11.90:6443
KubeDNS is running at https://192.168.11.90:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

在浏览器中访问,输出如下:

{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {
    
  },
  "status": "Failure",
  "message": "services \"kube-dns:dns\" is forbidden: User \"system:anonymous\" cannot get services/proxy in the namespace \"kube-system\"",
  "reason": "Forbidden",
  "details": {
    "name": "kube-dns:dns",
    "kind": "services"
  },
  "code": 403
}

这时需要配置https证书。

p12文件模式

首先需要确认kubectl命令的配置文件,默认情况下为/etc/kubernetes/admin.conf,而且已经自动创建在$HOME/.kube/config中,如果没有创建则需要手动赋值。
使用命令

cat $HOME/.kube/config

如果确认有集群的配置则运行以下命令产生认证证书

# 生成client-certificate-data
grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt

# 生成client-key-data
grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key

# 生成p12
openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"

要求输入密码直接回车即可。
运行完后在当前目录会有个kubecfg.p12证书文件。

手动导入证书
正常情况下,Chrome的证书都是自动导入的。手动导入证书,只是非正常情况下才会用到,比如遇到“您打开的链接不是私密连接”,这个时候就需要手动导入证书了。
点击浏览器 菜单-设置-下翻点击“显示高级设置”-点击“管理证书”
选择“受信任的根证书颁发机构”这一栏,然后点击导入
根据步骤操作即可。
导入上面生成的p12文件,重新打开浏览器,弹出证书信息,点击确定即可。

###crt模式
另外一种方式是自己使用OpenSSL生成dashboard.crt和dashboard.key.然后使用者两个文件重新生成secret kubernetes-dashboard-certs。
使用命令

#生成dashboard.pass.key
openssl genrsa -des3 -passout pass:x -out dashboard.pass.key 2048

# 使用dashboard.pass.key生成dashboard.key
openssl rsa -passin pass:x -in dashboard.pass.key -out dashboard.key

#使用dashboard.key生成dashboard.crt
#这里让输入一个复杂的密码,不用输入,直接按回车,留空就行。This password is used by Certificate Authorities to authenticate the certificate owner when they want to revoke their certificate. Since this is a self-signed certificate, there’s no way to revoke it via CRL (Certificate Revocation List)。

#意思是这个密码是证书拥有者用来撤销这个证书的,因为这是个个人证书所以无法撤销所以就不需要使用。

rm dashboard.pass.key
openssl req -new -key dashboard.key -out dashboard.csr

#生成一个ssl certificate
openssl x509 -req -sha256 -days 365 -in dashboard.csr -signkey dashboard.key -out dashboard.crt

然后生成的dashboard.crt和dashboard.key就可以用生成dashboard使用的secret了。

这里有两种方式使用crt证书

生成替换secret

第一步:把生成的dashboard.crt和dashboard.key放到$HOME/certs文件夹内,且文件夹内只有这俩文件。
使用命令创建secret

kubectl create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs -n kube-system

把Kubernetes-dashboard.yaml文件中的部署secret配置删除,如下内容。

# ------------------- Dashboard Secret ------------------- #

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-certs
  namespace: kube-system
type: Opaque

然后重新部署dashboard
使用命令

kubectl create -f kubernetes-dashboard.yaml

####挂载证书
另一种方式
生成crt证书放到目录后
修改dashboard的yml文件,挂载证书目录

 volumes:
    - name: kubernetes-dashboard-certs
      hostPath:
        path: /home/share/certs
        type: Directory

完整Dashboard Deployment如下:

# ------------------- Dashboard Deployment ------------------- #

kind: Deployment
apiVersion: apps/v1beta2
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: kubernetes-dashboard
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
    spec:
      containers:
      - name: kubernetes-dashboard
        image: registry.cn-hangzhou.aliyuncs.com/kube_containers/kubernetes-dashboard-amd64:v1.8.3
        ports:
        - containerPort: 8443
          protocol: TCP
        args:
          - --auto-generate-certificates
          - --token-ttl=5400   # 设置token过期时间
          # 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
        volumeMounts:
        - name: kubernetes-dashboard-certs
          mountPath: /certs
          # Create on-disk volume to store exec logs
        - mountPath: /tmp
          name: tmp-volume
        livenessProbe:
          httpGet:
            scheme: HTTPS
            path: /
            port: 8443
          initialDelaySeconds: 30
          timeoutSeconds: 30
      volumes:
      - name: kubernetes-dashboard-certs
        hostPath:
          path: /home/share/certs
          type: Directory
      - name: tmp-volume
        emptyDir: {}
      serviceAccountName: kubernetes-dashboard
      # Comment the following tolerations if Dashboard must not be deployed on master
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule

参考
Certificate management
API Server配置证书

#集成Heapster

Heapster是容器集群监控和性能分析工具,天然的支持Kubernetes和CoreOS。

Heapster可以收集Node节点上的cAdvisor数据,还可以按照kubernetes的资源类型来集合资源,比如Pod、Namespace域,可以分别获取它们的CPU、内存、网络和磁盘的metric。默认的metric数据聚合时间间隔是1分钟。

Heapster支持多种储存方式,本示例中使用influxdb,直接执行下列命令即可:

kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/influxdb.yaml
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/grafana.yaml
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/heapster.yaml
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/rbac/heapster-rbac.yaml

上面命令中用到的yaml是从

https://github.com/kubernetes/heapster/tree/master/deploy/kube-config/influxdb

复制的,并将k8s.gcr.io修改为国内镜像。

然后,查看一下Pod的状态:

[root@k8s ~]# kubectl get pods --namespace=kube-system 
NAME                                    READY     STATUS              RESTARTS   AGE
heapster-844d66dcb7-drdq7               1/1       Running             0          1m
monitoring-grafana-555bb9c5c9-q9rgk     0/1       ContainerCreating   0          1m
monitoring-influxdb-ddbcd4f99-2snqx     1/1       Running             0          1m

等待这三个服务的状态变成Running,刷新一下浏览器,最新的效果如下:
现在再打开Dashboard页面就可以看到CPU和Memory的监控信息了。

如果没有UI图形,说明有报错。
需要使用命令排查
dashboard和heapster有没有异常

kubectl logs heapster-844d66dcb7-drdq7  -f --namespace=kube-system
kubectl logs kubernetes-dashboard-69c58954fc-z4mwm  -f --namespace=kube-system

可能遇到的问题

 error while getting containers from Kubelet: failed to get all container stats from Kubelet URL "http://192.168.11.91:10255/stats/container/": Post http://192.168.11.91:10255/stats/container/: dial tcp 192.168.11.91:10255: getsockopt: connection refused

推测是权限认证问题。

查看yaml文件

wget  http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/heapster.yaml
cat heapster.yaml

发现使用的default的认证方式

    spec:
      serviceAccountName: heapster
      containers:
      - name: heapster
        image: reg.qiniu.com/k8s/heapster-amd64:v1.4.2
        imagePullPolicy: IfNotPresent
        command:
        - /heapster
        - --source=kubernetes:https://kubernetes.default
        - --sink=influxdb:http://monitoring-influxdb.kube-system.svc:8086

heapster启动时有两个启动参数:
source指示数据源,heapster是支持多种数据源的,这里用的是“kubernetes”类型的数据源,地址是:kubernetes.default。这个域名的全名是:kubernetes.default.svc.cluster.local,就是service “kubernetes”在cluster中的域名,而”kubernetes”服务就是kube-apiserver,它的信息如下:

[root@k8s ~]# kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   33d
[root@k8s ~]# kubectl describe svc/kubernetes
Name:              kubernetes
Namespace:         default
Labels:            component=apiserver
                   provider=kubernetes
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.96.0.1
Port:              https  443/TCP
TargetPort:        6443/TCP
Endpoints:         192.168.11.90:6443
Session Affinity:  None
Events:            <none>
[root@k8s ~]# 

因此,该域名在k8s DNS中会被resolve为clusterip:192.168.11.90。外加https的默认端口是443,因此实际上heapster试图访问的apiserver地址是:https://192.168.11.90:443。

我们的APIServer在secure port上是有client端证书校验的,那么以这样的启动参数启动的heapster是连接不上kube-apiserver的。

接下来,我们按照”Configuring Source”中的方法,将heapster与kube-apiserver之间的连接方式改为通过insecure port进行:
insecure-bind-address ip
用于监听–insecure-port的IP地址 (设置成0.0.0.0表示监听所有接口)。(默认值127.0.0.1)
insecure-port int
用于监听不安全和为认证访问的端口。这个配置假设你已经设置了防火墙规则,使得这个端口不能从集群外访问。对集群的公共地址的443端口的访问将被代理到这个端口。默认设置中使用nginx实现。(默认值8080)

关于Heapster更详细的用法可参考官方文档:https://github.com/kubernetes/heapster。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐