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
方式一 使用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:
Selector: k8s-app=kubernetes-dashboard
Type: NodePort
IP: 10.97.101.40
Port: 443/TCP
TargetPort: 8443/TCP
NodePort: 30001/TCP
Endpoints:
Session Affinity: None
External Traffic Policy: Cluster
Events:
找到NodePort,然后直接访问
需要注意的是,在多节点的集群中,必须找到运行Dashboard节点的IP来访问,而不是Master节点的IP
http://: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 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
需要确认 所有的节点中都包含 需要的镜像,否则会报错。
解决方式
所有节点都准备好需要的镜像即可。
成功登录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:
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点击登录无法跳转页面
使用命令
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证书。
首先需要确认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证书
第一步:把生成的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 443/TCP 33d
[root@k8s ~]# kubectl describe svc/kubernetes
Name: kubernetes
Namespace: default
Labels: component=apiserver
provider=kubernetes
Annotations:
Selector:
Type: ClusterIP
IP: 10.96.0.1
Port: https 443/TCP
TargetPort: 6443/TCP
Endpoints: 192.168.11.90:6443
Session Affinity: None
Events:
[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。