Kubernetes

  • Kubernetes简称K8S;
  • Kubernetes是Google开源的容器集群管理平台;
  • 利用K8S能很方便的管理多台Docker主机中的容器;
  • 用于跨主机群集自动部署,扩展和操作应用程序容器;
  • 提供以容器为中心的基础架构;
  • 官网: https://kubernetes.io/
  • Kubernetes 版本查阅地址: https://github.com/kubernetes/kubernetes/releases
  • Kubernetes的目标:是建立一个组件和工具的生态系统,以减轻在公共云和私有云中运行应用程序的负担。
  • K8S主要功能:
  • 将多台Docker主机抽象为一个资源,以集群方式管理容器,包括任务调度、资源管理、弹性伸缩、滚动升级等功能;
  • 使用编排系统(YAML File)快速构建容器集群,提供负载均衡,解决容器直接关联及通信问题;
  • 自动管理和修复容器,简单说,比如创建一个集群,里面有10个容器,若某个容器异常关闭,那么,会尝试重启或重新分配容器,始终保证有10个容器在运行,而杀死多余的。
  • 使用Kubernetes,可以快速高效地响应客户需求:
  • 快速,可预测地部署应用程序。
  • 在运行中扩展应用程序。
  • 无缝推出新功能。
  • 仅使用您需要的资源来优化硬件的使用。

kubernetes角色组成:

1)Pod:

  • 是k8s的最小操作单元,一个pod可以由一个或多个容器组成;
  • 同一个pod只能运行在同一个主机上,共享相同的volumes、network、namespace;

2)ReplicationController(RC)

  • RC用来管理pod,一个RC可以由一个或多个pod组成,在RC被创建后,系统会根据定义好的副本数来创建pod数量;
  • 在运行过程中,若pod数量小于定义的,就会重启停止的或重新分配pod,反之杀死多余的;
  • 当然,也可以动态伸缩运行的pods规模;
  • RC通过label关联对应的pods,在滚动升级中,RC采用一个一个替换要更新的整个pods中的pod;

3)Service

  • Service定义了一个pod逻辑集合的抽象资源,pod集合中的容器提供相同的功能;
  • 集合根据定义的Label和selector完成,
  • 当创建一个Service后,会分配一个Cluster IP,这个IP与定义的端口提供这个集合一个统一的访问接口,并且实现负载均衡;

4)Label

  • Label是用于区分Pod、Service、RC的key/value键值对;
  • Pod、Service、RC可以有多个label,但是每个label的key只能对应一个;
  • 主要是将Service的请求通过label转发给后端提供服务的Pod集合;

kubernetes组件组成:

1)kubectl

  • 客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口;

2)kube-apiserver

  • 作为整个系统的控制入口,以REST API服务提供接口;

3)kube-controller-manager

  • 用来执行整个系统中的后台任务,包括节点状态状况、pod个数、pods和service的关联等;

4)kube-scheduler

  • 负责节点资源管理,接受来自kube-apiserver创建pods任务,并分配到某个节点;

5)etcd

  • 负责节点间的服务发现和配置共享;

6)kube-proxy

  • 运行在每个计算节点上,负责pod网络代理。定时从etcd获取到service信息来做相应的策略;

7)kubelet

  • 运行在每个计算节点上,作为agent,接受分配该节点的pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver;

8)DNS

  • 一个可选的DNS服务,用于为每个Service对象创建DNS记录,这样所有的Pod就可以通过DNS访问服务了;

部署K8S

  • 系统要求: 至少2核CPU、2G内存、20G硬盘
  • K8S版本1.13,对应的docker版本1.13.1、17.03、17.06、17.09、18.06、18.09

0.环境拓扑

  • 主机部署

ip地址 主机名 角色 CPU 内存 192.168.4.11 master #master、etcd >=2c >=2G 192.168.4.12 node1 #worker >=2c >=2G 192.168.4.13 node2 #worker >=2c >=2G

  • 软件版本

系统类型 Docker版本 Kubernetes版本 Kubeadm版本 Kubectl版本 Kubelet版本 CentOS-7.4 18.06.1-ce v1.13 v1.13 v1.13 v1.13

[#####==========我说过这是分割线吗==========#####]

一、环境准备

1.配置免密登陆

sed -i '/^Host */a \    StrictHostKeyChecking no' /etc/ssh/ssh_config   #关闭严格的主机密钥检测
ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa                                #生成密钥
for i in 192.168.4.{11..13}                                             #分发
do
    ssh-copy-id $i
done

2.配置hosts

echo "
192.168.4.11    master
192.168.4.12    node1
192.168.4.13    node2
" >> /etc/hosts
for i in 192.168.4.{11..13}
do
    scp /etc/hosts $i:/etc/
done
# 修改主机名
for i in 192.168.4.{11..13}
do
    if [ "$i" == "192.168.4.11" ]; then
        name=master
    elif [ "$i" == "192.168.4.12" ]; then
        name=node1
    else
        name=node2
    fi
    ssh $i "hostnamectl set-hostname $name"
done

3.关闭防火墙、SELinux、SWAP

for i in 192.168.4.{11..13}
do
    ssh $i 'systemctl stop firewalld;systemctl disable firewalld;               #关闭防火墙
            setenforce 0;                                                       #关闭SELinux
            sed -i "/^SELINUX=/c SELINUX=disabled" /etc/selinux/config;
            sed -i "/^SELINUX=/c SELINUX=disabled" /etc/sysconfig/selinux;
            swapoff -a;                                                         #关闭SWAP
            sed -i "s/.*swap.*/#&/" /etc/fstab
'
done

4.修改iptables相关参数

for i in 192.168.4.{11..13}
do
    ssh $i "
            echo 'vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
' > /etc/sysctl.d/k8s.conf
modprobe br_netfilter                       #使配置生效
sysctl -p /etc/sysctl.d/k8s.conf
lsmod |grep br_netfilter                    #确认模块生效
"
done
for i in 192.168.4.{11..13}                             #开机自动加载模块
do
    ssh $i "
            echo '#!/bin/bash
for file in /etc/sysconfig/modules/*.modules
do
    [ -x $file ] && file
done' > /etc/rc.sysinit
            echo 'modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
' > /etc/sysconfig/modules/br_netfilter.modules
            chmod 755 /etc/sysconfig/modules/br_netfilter.modules
"
done

5.加载ipvs相关模块

for i in 192.168.4.{11..13}
do
    ssh $i "
            echo '#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4' > /etc/sysconfig/modules/ipvs.modules
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
"
done

6.修改Linux 资源配置文件,调高ulimit最大打开数和systemctl管理的服务文件最大打开数

for i in 192.168.4.{11..13}
do
    ssh $i '
            echo "* soft nofile 655360" >> /etc/security/limits.conf
            echo "* hard nofile 655360" >> /etc/security/limits.conf
            echo "* soft nproc 655360" >> /etc/security/limits.conf
            echo "* hard nproc 655360" >> /etc/security/limits.conf
            echo "* soft memlock unlimited" >> /etc/security/limits.conf
            echo "* hard memlock unlimited" >> /etc/security/limits.conf
            echo "DefaultLimitNOFILE=1024000" >> /etc/systemd/system.conf
            echo "DefaultLimitNPROC=1024000" >> /etc/systemd/system.conf
'
done
for i in 192.168.4.{11..13}
do
    ssh $i "ulimit -Hn"                     #确认ulimit
done

7.配置yum源

- 安装yum工具
    yum -y install yum-utils

- 阿里基础源
    yum-config-manager --add-repo http://mirrors.aliyun.com/repo/Centos-7.repo

- epel源
    yum -y install epel-release

- 阿里docker源
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

- 阿里K8S源
    echo "
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
" > /etc/yum.repos.d/kubernetes.repo

- 分发repo
for i in 192.168.4.{11..13}
do
    scp -r /etc/yum.repos.d $i:/etc/
    ssh $i "
        ssh $i 'yum clean all; yum repolist' &
"
done

8.配置时间同步

- 配置master节点
    yum -y install chrony
    sed -i 's/^server/#&/' /etc/chrony.conf
    echo 'server 0.asia.pool.ntp.org iburst
server 1.asia.pool.ntp.org iburst
server 2.asia.pool.ntp.org iburst
server 3.asia.pool.ntp.org iburst
allow all' >> /etc/chrony.conf
    systemctl enable chronyd && systemctl restart chronyd
    timedatectl set-ntp true

- 配置node节点
for i in 192.168.4.{12..13}
do
    ssh $i "
        yum install -y chrony
        sed -i 's/^server/#&/' /etc/chrony.conf
        echo 'server 192.168.4.11 iburst' >> /etc/chrony.conf
        systemctl enable chronyd && systemctl restart chronyd
" &
done

- 确认时间同步
for i in 192.168.4.{11..13}
do
    ssh $i "chronyc sources"
done

9.安装其它软件

for i in 192.168.4.{11..13}
do
    ssh $i "
        yum -y install ipset ipvsadm              #ipvs使用
        yum -y install bash-completion            #自动补全使用
" &
done

10.重启主机

- 配置完成后最好重启一次主机
for i in 192.168.4.{12,13,11}
do
    ssh $i "reboot"
done

[#####==========我说过这是分割线吗==========#####]

二、部署Docker(所有节点)

1.安装docker

yum list docker-ce --showduplicates                         #显示docker-ce的所有版本
for i in 192.168.4.{11..13}
do
    ssh $i "yum -qy install docker-ce-18.06.1.ce-3.el7" &
done

2.配置镜像加速器和docker数据存放路径

mkdir -p /etc/docker
echo '{
"registry-mirrors": ["https://r8h1ihfn.mirror.aliyuncs.com"],
"graph": "/tol/docker-data"
}' > /etc/docker/daemon.json
for i in 192.168.4.{11..13}
do
    scp -r /etc/docker $i:/etc/
    ssh $i "systemctl daemon-reload"
done

3.启动docker

for i in 192.168.4.{11..13}
do
    ssh $i "
        systemctl start docker && systemctl enable docker               #启动并自启
        systemctl status docker | awk '/Active/{print \$1,\$2,\$3}'     #查看状态
        docker --version                                                #确认版本
"
done

[#####==========我说过这是分割线吗==========#####]

三、部署kubernetes

0.工具说明

  • kubeadm: 引导启动k8s集群用的命令行工具,用户初始化cluster
  • kubelet: 在集群中每台机器上都要运行的组件,负责管理pod、容器(containers)的声明周期等操作
  • kubectl: k8s命令行集群管理工具,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
  • kubernetes-cni: 上边三个工具的依赖包,上述工具对此软件版本有对应限制

1.安装kubeadm、kubelet、kubectl(所有节点)

for i in 192.168.4.{11..13}
do
    ssh $i "yum -y install \
        kubernetes-cni-0.6.0 \
        kubelet-1.13.0 \
        kubeadm-1.13.0 \
        kubectl-1.13.0" &
done

2.启动kubelet(所有节点)

for i in 192.168.4.{11..13}
do
    ssh $i "systemctl enable kubelet && systemctl start kubelet" &        #没配置网络,kubelet可能启不来,不用管
done

3.部署master节点

3.1 master节点初始化

kubeadm init \ --kubernetes-version v1.13.0 \ --image-repository registry.aliyuncs.com/google_containers \ --apiserver-advertise-address=192.168.4.11 \ --pod-network-cidr=10.244.0.0/16#kubeadm join... 注意记录此条命令,在配置node节点时会用到 #解释: #--kubernetes-version=v1.13.0,指定具体安装版本 #--image-repository,指定阿里云镜像下载,默认是k8s.gcr.io被墙 #--apiserver-advertise-address,指明用master的哪个interface与cluster的其它节点通信, ##若有多个interface,要明确指定。若不明确指定,kubeadm会选择默认网关的interface #--pod-network-cidr,指定pod网络的范围,此处使用flannel网络方案,必须设置成这个CIDR #若初始化失败,需要使用 kubeadm reset 命令进行清理,之后再执行初始化 #初始化过程说明: #[preflight] kubeadm 执行初始化前的检查。 #[kubelet-start] 生成kubelet的配置文件”/var/lib/kubelet/config.yaml” #[certificates] 生成相关的各种token和证书 #[kubeconfig] 生成 KubeConfig 文件,kubelet 需要这个文件与 Master 通信 #[control-plane] 安装 Master 组件,会从指定的 Registry 下载组件的 Docker 镜像。 #[bootstraptoken] 生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到 #[addons] 安装附加组件 kube-proxy 和 kube-dns。 #Kubernetes Master 初始化成功,提示如何配置普通用户使用kubectl访问集群。 #提示如何安装 Pod 网络。 #提示如何注册其他节点到 Cluster。

3.2 配置kubectl

  • 初始化后提示,推荐使用Linux普通用户执行kubectl
  • kubectl默认会使用.kube目录下的授权信息访问k8s集群,避免每次使用kubectl都要声明环境变量
  • 创建普通用户
    useradd k8s && echo 123456 | passwd --stdin k8s
  • 配置用户sudo权限,并配置sudo免密
    sed -i "/^root/a k8s ALL=(ALL) NOPASSWD:ALL" /etc/sudoers
  • 保存集群安全配置文件到当前用户的.kube目录
    su - k8s
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 启用kubectl自动命令补全功能
    source <(kubectl completion bash) #立即生效
    echo "source <(kubectl completion bash)" >> ~/.bashrc #重登生效

3.3 查看状态

kubectl get cs #查看集群组件状态,cs=componentstatuses=组件状态 #NAME STATUS MESSAGE ERROR #确认各组件处于healthy #scheduler Healthy ok #controller-manager Healthy ok #etcd-0 Healthy {"health": "true"} kubectl get nodes #查看节点状态 #NAME STATUS ROLES AGE VERSION #master NotReady master 44m v1.13.0 #master节点还未准备好 kubectl describe node master #查看节点详细信息 #master节点未准备好的原因是: # kubelet和kube-proxy未启动 kubectl get pods -n kube-system -o wide #查看本节点各个系统的pod状态 # -n=namespace # -o=

3.4 部署网络插件

  • k8s集群工作必须安装pod网络,否则pod之间无法通信
  • k8s支持多种网络方案,这里使用flannel
  • 部署flannel

curl https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml -O kubectl apply -f kube-flannel.yml kubectl get pod -n kube-system -o wide #查看pod状态 #需要一些时间,才能全部Running kubectl get nodes #查看节点状态 #master状态Ready

3.5 查看master下载的镜像

]$ sudo docker images | awk '{print $1,$2}' | column -t #REPOSITORY TAG #quay.io/coreos/flannel v0.11.0-amd64 #registry.aliyuncs.com/google_containers/kube-proxy v1.13.0 #registry.aliyuncs.com/google_containers/kube-scheduler v1.13.0 #registry.aliyuncs.com/google_containers/kube-apiserver v1.13.0 #registry.aliyuncs.com/google_containers/kube-controller-manager v1.13.0 #registry.aliyuncs.com/google_containers/coredns 1.2.6 #registry.aliyuncs.com/google_containers/etcd 3.2.24 #registry.aliyuncs.com/google_containers/pause 3.1

四、部署worker节点

  • K8S的master节点比worker节点多运行了 kube-apiserver、kube-scheduler、kube-controller-manager 三个系统pod

4.1 将节点加入集群

  • 执行master初始化后生成的 kubeadm join 命令
join=`kubeadm token create --print-join-command`        #输出加入集群的命令
for i in 192.168.4.{12..13}
do
    sudo ssh $i "
        $join
"
done

4.2 查看状态

]# kubectl get nodes                                   #查看节点状态,稍等一会儿
    #NAME     STATUS   ROLES    AGE   VERSION
    #master   Ready    master   90m   v1.13.0
    #node1    Ready    <none>   79s   v1.13.0
    #node2    Ready    <none>   77s   v1.13.0
]# kubectl get pod --all-namespaces -o wide            #查看所有节点pod状态
    #所有节点Running

4.3 删除节点

  • master执行删除节点
]# kubectl drain node2 --delete-local-data --force --ignore-daemonsets    #删除node2节点
]# kubectl delete node node2
  • node节点重置kubeadm,执行清理
]$ sudo ssh node2 "kubeadm reset"

4.4 将master设置为worker节点

  • 出于安全考虑,默认配置下K8S不会将Pod调度到Master节点
]$ kubectl describe node master | grep Taints
    #Taints:             node-role.kubernetes.io/master:NoSchedule
  • 使master成为worker
]$ kubectl taint node master主机名 node-role.kubernetes.io/master-
    #node/master untainted
]$ kubectl describe node master | grep Taints
    #Taints:             <none>
  • 恢复Master Only状态
]$ kubectl taint node master主机名 node-role.kubernetes.io/master=:NoSchedule

4.5 查看worker下载的镜像

]$ sudo ssh node1 "docker images | awk '{print \$1,\$2}' | column -t"
    REPOSITORY                                          TAG
    quay.io/coreos/flannel                              v0.11.0-amd64
    registry.aliyuncs.com/google_containers/kube-proxy  v1.13.0
    registry.aliyuncs.com/google_containers/pause       3.1

[#####==========我说过这是分割线吗==========#####]

五、#测试集群各组件

1 部署一个 Nginx Deployment,包含2个Pod

]# kubectl create deployment nginx --image=nginx:alpine
]# kubectl scale deployment nginx --replicas=2

2 验证Nginx Pod

]# kubectl get pods -l app=nginx -o wide
    #nginx处于Running,并分配10.244.开头的集群内部ip
    #NAME                     READY   STATUS    RESTARTS   AGE     IP           NODE    NOMINATED NODE   READINESS GATES
    #nginx-54458cd494-s6r7v   1/1     Running   0          2m58s   10.244.2.2   node2   <none>           <none>
    #nginx-54458cd494-wrhkj   1/1     Running   0          3m4s    10.244.1.2   node1   <none>           <none>

3 验证kube-proxy

  • 以 NodePort 方式对外提供服务
]# kubectl expose deployment nginx --port=80 --type=NodePort       #暴露随机端口给nginx80端口
  • 查看nginx服务\
]# kubectl get services nginx
    #NAME    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    #nginx   NodePort   10.101.85.192   <none>        80:30627/TCP   105s
  • 在集群外部访问服务
]# curl 192.168.4.11:30627

4 验证dns、pod、network

  • 运行busybox,并进入交互模式
]# kubectl run -it curl --image=radial/busyboxplus:curl
  • 验证dns
]# nslookup nginx
    #可以正确解析集群内的ip
  • 验证kube-proxy,访问服务名
]# curl http://nginx/
  • 验证Node网络通信,访问pod内网ip
]# curl 10.244.1.2
]# curl 10.244.2.2

[#####==========我说过这是分割线吗==========#####]

六、开启kube-proxy的ipvs

1.修改kube-system/kube-proxy中的mode

]# kubectl edit cm kube-proxy -n kube-system       #cm=configmaps
:%s/mode: ""/mode: "ipvs"/
:wq

2.重启各个节点的kube-proxy pod

]# kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
]# kubectl get pod -n kube-system | grep kube-proxy
    #kube-proxy-gftmx                 1/1     Running   0          24s
    #kube-proxy-kgc5w                 1/1     Running   0          11s
    #kube-proxy-ntr4p                 1/1     Running   0          22s

3.查看日志

]# kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl logs " $1 " -n kube-system")}' | grep "Using"
    #I0422 07:51:12.884170       1 server_others.go:189] Using ipvs Proxier.    #已开启ipvs

[#####==========我说过这是分割线吗==========#####]

七、部署dashboard可视插件

  • DashBoard,为用户提供一个可视化的web界面来查看当前集群的各种信息。
  • dashboard可以部署容器化的应用、监控应用状态、执行故障排查任务、管理K8S各种资源。

1.部署证书,不然后面会因为证书过期而无法访问登陆https

1.1 生成私钥

]$ sudo mkdir -p /etc/kubernetes/certs
]$ cd /etc/kubernetes/certs
]$ sudo openssl genrsa -des3 -passout pass:x -out dashboard.pass.key 2048
]$ sudo openssl rsa -passin pass:x -in dashboard.pass.key -out dashboard.key
]$ sudo rm -rf dashboard.pass.key                                      #删除刚才生成的dashboard.pass.key

1.2 生成证书签名请求文件csr

]$ sudo openssl req -new -key dashboard.key -out dashboard.csr          #一路回车

1.3 生成SSL证书

]$ sudo openssl x509 -req -sha256 -days 365 -in dashboard.csr -signkey dashboard.key -out dashboard.crt

1.4 创建dashboard的secret证书

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

2.部署dashboard

2.1 下载kubernetes-dashboard.yaml文件

]# cd
]# curl https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.0/src/deploy/recommended/kubernetes-dashboard.yaml -O

2.2 修改配置文件(NodePort类型,token登陆)

  • 改为国内仓库
]# sed -i  -e "s/image:/#&/" -e "/image:/a \        image: registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.0" kubernetes-dashboard.yaml
  • 使用刚生成的密钥认证(把Secret类注释掉)
]# let n=`awk '/Dashboard Secret/{print NR}' kubernetes-dashboard.yaml`+1
]# sed -i "$n,+10s/^/#/" kubernetes-dashboard.yaml

2.3 选择dashboard的访问方式:

1)使用NodePort方式访问
]# sed -i "/targetPort: /a \  type: NodePort" kubernetes-dashboard.yaml        #使用NodePort类型
]# sed -i "/targetPort: /a \      nodePort: 32767" kubernetes-dashboard.yaml   #映射给外部32767端口
2)API Server方式访问
  • 生成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" #输入证书密码
  • 发送p12证书到访问dashboard的主机
    ]# scp kubecfg.p12 root@192.168.4.1:/root
  • 访问机浏览器导入p12证书,需要输入证书密码
  • 访问机重启浏览器

2.3 部署dashboard

]# kubectl create -f kubernetes-dashboard.yaml

2.4 创建dashboard登陆用户

  • 在kube-system空间创建admin-user的服务帐号
  • K8S创建集群时已经创建cluster-admin角色,直接将其绑定到admin-user帐号
    ]# curl https://gitee.com/xinsui1314x/k8s/raw/master/dashboard_admin-user.yaml -O]# kubectl create -f dashboard_admin-user.yaml
  • 查看admin-user帐号的token,登陆dashboard时会用到
    ]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

3.验证

  • 查看pod状态
    kubectl get pod --namespace=kube-system -o wide | grep dashboard
  • Dashboard会在kube-system中创建Deployment和Service
    kubectl get deployment kubernetes-dashboard --namespace=kube-systemkubectl get service kubernetes-dashboard --namespace=kube-system | grep dashboard #kubernetes-dashboard NodePort 10.102.84.225 <none> 443:32767/TCP 18m
  • 访问web
  • NodePort访问
]# firefox https://192.168.4.11:32767
    #选择令牌(token)
    #复制刚才的token进去,并登陆
  • API Server访问
]# firefox https://192.168.4.11:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
    #确认证书
    #选择令牌(token)
    #复制刚才的token进去,并登陆