一、Dashboard简介
Kubernetes 还开发了一个基于 Web 的 Dashboard,用户可以用 Kubernetes Dashboard 部署容器化的应用、监控应用的状态、执行故障排查任务以及管理 Kubernetes 各种资源。
在 Kubernetes Dashboard 中可以查看集群中应用的运行状态,也能够创建和修改各种 Kubernetes 资源,比如 Deployment、Job、DaemonSet 等。用户可以 Scale Up/Down Deployment、执行 Rolling Update、重启某个 Pod 或者通过向导部署新的应用。Dashboard 能显示集群中各种资源的状态以及日志信息。
Dashboard认证访问:https://github.com/kubernetes/dashboard
官方文档:https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/
二、RABC简介
因为我们使用kubeadm搭建的集群会默认开启RABC(角色访问控制机制),所以我们必须要进行额外的设置。
RBAC
K8S 1.6引进,是让用户能够访问 k8S API 资源的授权方式【不授权就没有资格访问K8S的资源】
用户
K8S有两种用户:User和Service Account。其中,User给人用,Service Account给进程用,让进程有相关权限。如Dashboard就是一个进程,我们就可以创建一个Service Account给它
角色
Role是一系列权限的集合,例如一个Role可包含读取和列出 Pod的权限【 ClusterRole 和 Role 类似,其权限范围是整个集群】
角色绑定
RoleBinding把角色映射到用户,从而让这些用户拥有该角色的权限【ClusterRoleBinding 和RoleBinding 类似,可让用户拥有 ClusterRole 的权限】
Secret
Secret是一个包含少量敏感信息如密码,令牌,或秘钥的对象。把这些信息保存在 Secret对象中,可以在这些信息被使用时加以控制,并可以降低信息泄露的风险
灰色是“角色”,蓝色是“用户”,绿色是“角色绑定”,黄色是该角色拥有的权限。简言之 ,角色绑定将角色和用户进行挂钩
该文件分为以下几部分:
Dashboard Service
Dashboard Deployment
Dashboard Role
RoleBinding
Dashboard Service Account
Dashboard Secret
三、安装
下载dashboard
# 下载dashboard
root@manager ~]# [root@manager ~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
- 部署
[root@manager ~]# kubectl apply -f recommended.yaml
# 查看命名空间状态
[root@manager ~]# kubectl get pods --all-namespaces
kubernetes-dashboard dashboard-metrics-scraper-566cddb686-hvh46 1/1 Running 0 65s
kubernetes-dashboard kubernetes-dashboard-7b5bf5d559-ntfgs 1/1 Running 0 65s
- 代理
# 如果要在本地访问dashboard,我们需要创建一个安全通道,可运行如下命令:
[root@manager ~]# kubectl proxy
Starting to serve on 127.0.0.1:8001
# 外部网络访问
[root@manager ~]# kubectl proxy --address='0.0.0.0' --accept-hosts='^*$'
Starting to serve on [::]:8001
# 端口转发
kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 10443:443 --address 0.0.0.0
本机可以通过:(只能在本机访问)
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/.访问Dashborad UI。
- 创建用户
首先创建一个叫admin-user的服务账号,并放在kube-system名称空间下:
[root@manager ~]# vi admin-user.yaml
# admin-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
# 执行kubectl create命令
[root@manager ~]# kubectl create -f admin-user.yaml
- 绑定角色
默认情况下,kubeadm创建集群时已经创建了admin角色,我们直接绑定即可:
[root@manager ~]# 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命令:
[root@manager ~]# kubectl create -f admin-user-role-binding.yaml
- 获取Token
现在我们需要找到新创建的用户的Token,以便用来登录dashboard:
[root@manager ~]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
Name: admin-user-token-2brvh
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-user
kubernetes.io/service-account.uid: af809363-ae0b-4c98-adb5-1e30c45a3738
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkJBRjlGVFVxNnZCMDZLZ3BMcWxSM0E5WllPZDNBU0ZrZFpoc3Y3b3BsYmsifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTJicnZoIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJhZjgwOTM2My1hZTBiLTRjOTgtYWRiNS0xZTMwYzQ1YTM3MzgiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.L7th-TZHBunon3jhIXuHQQnSVrIiM-3k3DLHPHlzM_JMJJfPi-Oj5XXHfBuok7G07XFBaxPMUai_wEqJS3jQGSE0NOzUQnAmz8qBF3tXPnU0xTZDuQS2fJjEVd0Ax-GBmqdTb6EcP556-Mnl9ms2o6aDu_ePDSbkS7_K0GToDhLI5i0qHxzQUJd8hZ6sDDUSz1giNOOh11D_U_m9NCTD5Riml4UBQpXgr6ObJVWoclVA6tMUAjDdTztfHTEIMH6VqerTjfRv3wxkv2J20ILn-UfTI1mcjXxR30XX3u51DfUtn5SKRYaUbbiwYpnUvr6cxrSR6kM9Jw_5NcI_0BxzXg
# 获取dashboard的外网访问端口:
[root@manager ~]# kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper NodePort 10.104.77.220 <none> 8000:31823/TCP 3m4s
kubernetes-dashboard ClusterIP 10.104.147.24 <none> 443/TCP 3m4s
# 启动相关服务
[root@manager ~]# kubectl get pods -n kubernetes-dashboard -o wide
[root@manager ~]# kubectl get services -n kubernetes-dashboard
- 浏览器测试
[root@manager ~]# kubectl proxy --address='0.0.0.0' --accept-hosts='^*$'
由于https证书的问题,暂时只能先通过火狐浏览器增加安全例外的方式访问:
一定要使用Https访问:
Google Chrome浏览器:
可以使用其它的任可地址进行访问。
http://192.168.77.129:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/.
四、访问方式
Kubernetes提供了以下四种访问服务的方式:
- kubectl proxy
kubectl proxy,它在您的机器与Kubernetes API之间创建一个代理,默认情况下,只能从本地访问(启动它的机器)。
可以使用kubectl cluster-info命令来检查配置是否正确,集群是否可以访问等:
[root@manager ~]# kubectl cluster-info
Kubernetes master is running at https://192.168.77.129:6443
KubeDNS is running at https://192.168.77.129:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
在外网访问http://192.168.77.129:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/.,可以成功访问到登录界面,但是却无法登录
,这是因为Dashboard只允许localhost和127.0.0.1使用HTTP连接进行访问,而其它地址只允许使用HTTPS。因此,如果需要在非本机访问Dashboard的话,只能选择其他访问方式。
- NodePort
NodePort是将节点直接暴露在外网的一种方式,只建议在开发环境,单节点的安装方式中使用。
修改:recommended.yaml
[root@manager ~]# vi recommended.yaml
kind: Service
apiVersion: v1
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 30036
selector:
k8s-app: kubernetes-dashboard
type: NodePort
添加 type: NodePort 与 nodePort: 30036。
# 删除
[root@manager ~]# kubectl delete -f recommended.yaml
# 重新布署
[root@manager ~]# kubectl apply -f recommended.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@manager ~]# kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.102.92.72 <none> 8000/TCP 4s
kubernetes-dashboard NodePort 10.96.100.89 <none> 443:30036/TCP 5s
[root@manager ~]# kubectl -n kubernetes-dashboard get service kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard NodePort 10.96.100.89 <none> 443:30036/TCP 3h24m
# 获取token
[root@manager ~]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
Name: admin-user-token-2brvh
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-user
kubernetes.io/service-account.uid: af809363-ae0b-4c98-adb5-1e30c45a3738
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token:
XXXXXXXXXX
浏览测试:(https火狐浏览器), 一下要使用https访问。
https://192.168.77.129:30036/
需要注意的是,在多节点的集群中,必须找到运行Dashboard节点的IP来访问,而不是Master节点的IP。
由于证书问题,Google Chrome我们无法访问,需要在部署Dashboard时指定有效的证书,才可以访问。由于在正式环境中,并不推荐使用NodePort的方式来访问Dashboard。
- API Server
布署Dashboard即可,无需启动代理。
[root@manager ~]# kubectl apply -f recommended.yaml
# 获取访问地址:
[root@manager ~]# kubectl cluster-info
Kubernetes master is running at https://192.168.77.129:6443
KubeDNS is running at https://192.168.77.129:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
如果Kubernetes API服务器是公开的,并可以从外部访问,那我们可以直接使用API Server的方式来访问,也是比较推荐的方式。
Dashboard的访问地址为:
https://192.168.77.129:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
[root@manager ~]# netstat -anpl|grep 6443
返回的结果可能如下:
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "services \"https:kubernetes-dashboard:\" is forbidden: User \"system:anonymous\" cannot get resource \"services/proxy\" in API group \"\" in the namespace \"kubernetes-dashboard\"",
"reason": "Forbidden",
"details": {
"name": "https:kubernetes-dashboard:",
"kind": "services"
},
"code": 403
}
这是因为最新版的k8s默认启用了RBAC,并未为认证用户赋予了一个默认的身份:anonymous。
对于API Server来说,它是使用证书进行认证的,我们需要先创建一个证书。
# 首先找到kubectl命令的配置文件,默认情况下为/etc/kubernetes/admin.conf,复制到了$HOME/.kube/config中
# 生成client-certificate-data
[root@manager ~]# grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt
# 生成client-key-data
[root@manager ~]# grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key
# 生成p12,设定密码,两次相同
[root@manager ~]# openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"
Enter Export Password:
Verifying - Enter Export Password:
# 查看生成
[root@manager ~]# ls kubecfg*
kubecfg.crt kubecfg.key kubecfg.p12
测试所有浏览器全是以下错误。
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "services \"kube-dns:dns\" is forbidden: User \"system:anonymous\" cannot get resource \"services/proxy\" in API group \"\" in the namespace \"kube-system\"",
"reason": "Forbidden",
"details": {
"name": "kube-dns:dns",
"kind": "services"
},
"code": 403
}
对于生产系统,我们应该为每个用户应该生成自己的证书,因为不同的用户会有不同的命名空间访问权限。
- loadbalacer方式
首先需要部署metallb负载均衡器
修改kubernetes-dashboard.yaml文件,最后service部分改为type: LoadBalancer即可:
[centos@k8s-master ~]$ vim kubernetes-dashboard.yaml
......
---
# ------------------- Dashboard Service ------------------- #
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
type: LoadBalancer
ports:
- port: 443
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
重新应用yaml文件:
kubectl apply -f kubernetes-dashboard.yaml --force
注意由nodeport改为其他类型需要添加–forece才能执行成功。
查看service,TYPE类型已经变为LoadBalancer,并且分配了EXTERNAL-IP:
[centos@k8s-master ~]$ kubectl get service kubernetes-dashboard -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard LoadBalancer 10.107.160.197 192.168.92.202 443:32471/TCP 10m
浏览器输入https://192.168.77.129访问,填写之前申请的token进行登录:
- Ingress方式访问
1)Ingress-nginx简介
Pod的IP以及service IP只能在集群内访问,如果想在集群外访问kubernetes提供的服务,可以使用nodeport、proxy、loadbalacer以及ingress等方式,由于service的IP集群外不能访问,就是使用ingress方式再代理一次,即ingress代理service,service代理pod。
github地址
https://github.com/kubernetes/ingress-nginx
https://kubernetes.github.io/ingress-nginx
部署nginx-ingress-controller
$ wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
$ kubectl apply -f mandatory.yaml
创建Dashboard TLS证书:
$ mkdir -p /usr/local/src/kubernetes/certs
$ cd /usr/local/src/kubernetes
$ openssl genrsa -des3 -passout pass:x -out certs/dashboard.pass.key 2048
$ openssl rsa -passin pass:x -in certs/dashboard.pass.key -out certs/dashboard.key
$ openssl req -new -key certs/dashboard.key -out certs/dashboard.csr -subj '/CN=kube-dashboard'
$ openssl x509 -req -sha256 -days 365 -in certs/dashboard.csr -signkey certs/dashboard.key -out certs/dashboard.crt
$ rm certs/dashboard.pass.key
$ kubectl create secret generic kubernetes-dashboard-certs --from-file=certs -n kube-system
创建ingress规则:
文件末尾添加tls配置项即可。
[centos@k8s-master ~]$ vim kubernetes-dashboard-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
labels:
k8s-app: kubernetes-dashboard
annotations:
kubernetes.io/ingress.class: "nginx"
# https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
name: kubernetes-dashboard
namespace: kube-system
spec:
rules:
- host: dashboard.host.com
http:
paths:
- path: /
backend:
servicePort: 443
serviceName: kubernetes-dashboard
tls:
- hosts:
- dashboard.host.com
secretName: kubernetes-dashboard-certs
查看创建的ingress:
[centos@k8s-master ~]$ kubectl get ingress -n kube-system
NAME HOSTS ADDRESS PORTS AGE
kubernetes-dashboard dashboard.host.com 80, 443 30h
[centos@k8s-master ~]$
五、Heapster 插件
heapster整个安装需要三个组件:heapster、grafana和influxdb
heapster用于收集监控数据,granfana用于图表展示,influxdb用于存储数据
由于缺少 Heapster 插件,当前 dashboard 不能展示 Pod、Nodes 的 CPU、内存等 metric 图形。
# wget https://github.com/kubernetes-retired/heapster/archive/v1.5.4.tar.gz
# tar xf v1.5.4.tar.gz
查看部署所用相关配置文件:
# cd heapster-1.5.4/deploy/kube-config/
# ls influxdb/ && ls rbac/
grafana.yaml heapster.yaml influxdb.yaml
heapster-rbac.yaml
新建文件夹,用于存放 Heapster 部署所需的 yaml 文件,将上述文件拷贝至此目录
# mkdir heapster
# ls heapster/
grafana.yaml heapster-rbac.yaml heapster.yaml influxdb.yaml
2.修改 yaml 中 image 的值
# grep 'image:' heapster.yaml
image: mirrorgooglecontainers/heapster-amd64:v1.5.3
# grep 'image:' grafana.yaml
image: mirrorgooglecontainers/heapster-grafana-amd64:v4.4.3
# grep 'image:' influxdb.yaml
image: mirrorgooglecontainers/heapster-influxdb-amd64:v1.3.3
k8s.gcr.io 全部修改为mirrorgooglecontainers或者registry.cn-hangzhou.aliyuncs.com/google_containers
3.修改 grafana.yaml 文件,暴露服务到外部
4.部署 Heapster
# cd heapster/
# kubectl apply -f .
6.访问grafana
地址:http://192.168.20.203:30001
六、kubectl 常用命令
- 获取所有namespace
[root@manager ~]# kubectl get ns
NAME STATUS AGE
default Active 44m
kube-node-lease Active 44m
kube-public Active 44m
kube-system Active 44m
- 在指定的namespace下获取资源
kubectl -n {$nameSpace} get pods
使用示例:
# 查看所有 pod 列表, -n 后跟 namespace, 查看指定的命名空间
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
busybox-555c656b9-gvzrb 1/1 Running 0 13m
test-7b48b75784-8zt5n 1/1 Running 0 137m
test-7b48b75784-jfxmm 1/1 Running 0 137m
test-7b48b75784-lncjz 1/1 Running 0 137m
# 获取default 命名空间的pod
[root@master ~]# kubectl get pod -n default
NAME READY STATUS RESTARTS AGE
busybox-555c656b9-gvzrb 1/1 Running 0 15m
test-7b48b75784-8zt5n 1/1 Running 0 139m
test-7b48b75784-jfxmm 1/1 Running 0 139m
test-7b48b75784-lncjz 1/1 Running 0 139m
# 查看 RC 和 service 列表, -o wide 查看详细信息
[root@master ~]# kubectl get rc,svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h41m
[root@master ~]# kubectl get pod,svc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/busybox-555c656b9-gvzrb 1/1 Running 0 16m 192.168.219.68 master <none> <none>
pod/test-7b48b75784-8zt5n 1/1 Running 0 140m 192.168.166.130 node1 <none> <none>
pod/test-7b48b75784-jfxmm 1/1 Running 0 140m 192.168.104.1 node2 <none> <none>
pod/test-7b48b75784-lncjz 1/1 Running 0 140m 192.168.166.129 node1 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h42m <none>
# 获取pod(busybox-555c656b9-gvzrb )的配置
[root@master ~]# kubectl get pod busybox-555c656b9-gvzrb -o yaml
# 显示 Node 的详细信息
[root@master ~]# kubectl describe node master
# 显示 Pod (test-7b48b75784-jfxmm )的详细信息, 特别是查看 pod 无法创建的时候的日志
[root@master ~]# kubectl describe pod test-7b48b75784-jfxmm
# 根据 yaml 创建资源, apply 可以重复执行,create 不行
[root@master ~]# kubectl create -f pod.yaml
[root@master ~]# kubectl apply -f pod.yaml
# 基于 pod.yaml 定义的名称删除 pod
[root@master ~]# kubectl delete -f pod.yaml
# 删除所有包含某个 label 的pod 和 service
[root@master ~]# kubectl delete pod,svc -l name=<label-name>
# 删除所有 Pod
[root@master ~]# kubectl delete pod --all
# 查看 endpoint 列表
[root@master ~]# kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.247.130:6443 3h47m
# 执行 pod 的 date 命令
kubectl exec <pod-name> -- date
kubectl exec <pod-name> -- bash
kubectl exec <pod-name> -- ping 10.24.51.9
# 通过bash获得 pod 中某个容器的TTY,相当于登录容器
kubectl exec -it <pod-name> -c <container-name> -- bash
eg:
kubectl exec -it redis-master-cln81 -- bash
# 查看容器的日志
kubectl logs <pod-name>
# 实时查看日志
kubectl logs -f <pod-name>
# Pod的扩容与缩容
kubectl scale rc redis --replicas=3
# Pod的滚动升级
kubectl rolling-update redis -f redis-rc.update.yaml
七、常见问题:
serviceaccount/kubernetes-dashboard unchanged
The connection to the server 192.168.77.129:6443 was refused - did you specify the right host or port?
重新初始化节点。
# 1、实始化
[root@manager ~]# sudo kubeadm init --apiserver-advertise-address 192.168.77.129 --kubernetes-version=v1.16.2 --pod-network-cidr=10.244.0.0/16
# 加入
kubeadm join 192.168.77.129:6443 --token fmswj9.ak4dnahj4aqcb1li \
--discovery-token-ca-cert-hash sha256:74c0f48a4fdd7ab070ddcf12e896ade697ee4976bde9cd6dd4d8b1c87cd72437
# 重新执行网络
[root@manager ~]# kubectl apply -f kube-flannel.yml
- kubernetes启动时候错误(Unable to connect to the server: x509: certificate signed by unknown authority )
[root@manager ~]# mkdir -p $HOME/.kube
[root@manager ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@manager ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
- kubernetes-dashboard-6896c6dbc-x558k ContainerCreating 问题
[root@manager ~]# kubectl describe pod kubernetes-dashboard-6896c6dbc-x558k --namespace=kube-system
# 查看原因:Events:
[root@manager ~]# kubectl describe pod kubernetes-dashboard-6896c6dbc-x558k --namespace=kube-system
- Unable to mount volumes for pod "prometheus&expired waiting for volumes to attach or mount for pod
[root@node2 ~]# yum install -y nfs-utils
-
coredns 0/1 Pending 一直处于等待中
重启所有服务。
MountVolume.SetUp failed for volume "kubernetes-dashboard-certs" : secret "kubernetes-dashboard-certs" not found
ImagePullBackOff
错误的容器镜像/非法的仓库权限解决方案:
最常见的有两个问题:
(a)指定了错误的容器镜像
(b)使用私有镜像却不提供仓库认证信息
- the server could not find the requested resource
原因是Kubernetes版本太低,虽然node节点的状态显示是Ready,但无法创建Pod。
版本信息查看:
[root@manager ~]# kubectl api-versions
1.9版本之后:apps/v1。
- 解决谷歌浏览器无法访问的问题
dashboard的默认webui证书是自动生成的,由于时间和名称存在问题,导致谷歌和ie浏览器无法打开登录界面。
解决证书过期问题
(1)生成证书:通过openssl生成自签名证书
openssl genrsa -out dashboard.key 2048
openssl req -x509 -new -nodes -key dashboard.key -subj "/CN=192.168.20.203" -days 3650 -out dashboard.crt
(2)删除dashboard服务,修改配置文件:将配置文件中创建secret的配置文件信息去掉
kubectl delete -f kubernetes-dashboard.yaml
将配置文件中如下内容注释或删除:
(3)重现生成secret:创建同名称的secret,名称为: kubernetes-dashboard-certs
kubectl -n kube-system create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt
(4)重新生成
kubectl apply -f kubernetes-dashboard.yaml
如上通过重新生成secret,解决了由于证书过期导致的谷歌浏览器无法访问的问题,再此基础上我们可以通过查看kubernetes-dashboard-certs的YAML文件,将里面的内容添加到kubernetes-dashboard.yaml文件中。