虚拟化运维--K8S--Dashboard(十一)

一、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

三、安装

  1. 官网
    https://github.com/kubernetes/dashboard

  2. 下载dashboard

# 下载dashboard
root@manager ~]# [root@manager ~]#  wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
  1. 部署
[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
  1. 代理
# 如果要在本地访问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。

本机浏览访问

  1. 创建用户
    首先创建一个叫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
  1. 绑定角色
    默认情况下,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
  1. 获取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:       
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           8000:31823/TCP   3m4s
kubernetes-dashboard        ClusterIP   10.104.147.24           443/TCP          3m4s

# 启动相关服务
[root@manager ~]# kubectl get pods -n kubernetes-dashboard -o wide
[root@manager ~]# kubectl get services -n kubernetes-dashboard

  1. 浏览器测试
[root@manager ~]# kubectl proxy --address='0.0.0.0'  --accept-hosts='^*$'

由于https证书的问题,暂时只能先通过火狐浏览器增加安全例外的方式访问:
一定要使用Https访问:
Google Chrome浏览器:

Google Chrome浏览器

可以使用其它的任可地址进行访问。
http://192.168.77.129:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/.
浏览访问UI

火狐浏览器

四、访问方式

Kubernetes提供了以下四种访问服务的方式:

  1. 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的话,只能选择其他访问方式。

  1. 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           8000/TCP        4s
kubernetes-dashboard        NodePort    10.96.100.89           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           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:       
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。

  1. 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
}

对于生产系统,我们应该为每个用户应该生成自己的证书,因为不同的用户会有不同的命名空间访问权限。

  1. 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进行登录:


LoadBalancer
  1. Ingress方式访问
    1)Ingress-nginx简介
    Pod的IP以及service IP只能在集群内访问,如果想在集群外访问kubernetes提供的服务,可以使用nodeport、proxy、loadbalacer以及ingress等方式,由于service的IP集群外不能访问,就是使用ingress方式再代理一次,即ingress代理service,service代理pod。
    Ingress基本原理图

    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 文件,暴露服务到外部


image.png

4.部署 Heapster

# cd heapster/
# kubectl apply -f .
image.png

6.访问grafana
地址:http://192.168.20.203:30001

image.png

六、kubectl 常用命令

  1. 获取所有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
  1. 在指定的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            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              
pod/test-7b48b75784-8zt5n     1/1     Running   0          140m   192.168.166.130   node1               
pod/test-7b48b75784-jfxmm     1/1     Running   0          140m   192.168.104.1     node2               
pod/test-7b48b75784-lncjz     1/1     Running   0          140m   192.168.166.129   node1               

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE     SELECTOR
service/kubernetes   ClusterIP   10.96.0.1            443/TCP   3h42m   
# 获取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=

# 删除所有 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  -- date
kubectl exec  -- bash
kubectl exec  -- ping 10.24.51.9

# 通过bash获得 pod 中某个容器的TTY,相当于登录容器
kubectl exec -it  -c  -- bash
eg:
kubectl exec -it redis-master-cln81 -- bash

# 查看容器的日志
kubectl logs 
# 实时查看日志
kubectl logs -f 

# Pod的扩容与缩容
kubectl scale rc redis --replicas=3

# Pod的滚动升级
kubectl rolling-update redis -f redis-rc.update.yaml

七、常见问题:

  1. serviceaccount/kubernetes-dashboard unchanged

  2. 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 
  1. 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

  1. 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

  1. Unable to mount volumes for pod "prometheus&expired waiting for volumes to attach or mount for pod
[root@node2 ~]# yum install -y nfs-utils 

  1. coredns 0/1 Pending 一直处于等待中


    一直处于等待中

    重启所有服务。

  2. MountVolume.SetUp failed for volume "kubernetes-dashboard-certs" : secret "kubernetes-dashboard-certs" not found

  3. ImagePullBackOff
    错误的容器镜像/非法的仓库权限解决方案:
    最常见的有两个问题:
    (a)指定了错误的容器镜像
    (b)使用私有镜像却不提供仓库认证信息


  1. the server could not find the requested resource
    原因是Kubernetes版本太低,虽然node节点的状态显示是Ready,但无法创建Pod。
    版本信息查看:
[root@manager ~]#  kubectl api-versions

1.9版本之后:apps/v1。

  1. 解决谷歌浏览器无法访问的问题
    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文件中。

你可能感兴趣的:(虚拟化运维--K8S--Dashboard(十一))