2020年11月26日 | Leave a comment https://blog.csdn.net/f_qwerdf/article/details/93618202 最近在学习k8s,学习第一步当然就是手动搭建它了,搭建的过程中好坎坷好坎坷,所以写篇博客记录一下全部工作以及遇到的问题和解决办法。 1.搭建前的准备 关闭防火墙 1 systemctl stop firewalld systemctl disable firewalld 1 禁用SELinux setenforce 0 1 setenforce 0 编辑文件/etc/selinux/config,将SELINUX修改为disabled,如下: 1 sed -i ‘s/SELINUX=permissive/SELINUX=disabled/’ /etc/sysconfig/selinux #SELINUX=disabled 1 关闭系统swap Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动。方法一,通过kubelet的启动参数–fail-swap-on=false更改这个限制。方法二,关闭系统的Swap。 swapoff -a 1 swapoff -a 修改/etc/fstab文件,注释掉SWAP的自动挂载,使用free -m确认swap已经关闭。 1 #注释掉swap分区 [root@localhost /]# sed -i ‘s/.*swap.*/#&/’ /etc/fstab #/dev/mapper/centos-swap swap swap defaults 0 0 [root@localhost /]# free -m total used free shared buff/cache available Mem: 962 154 446 6 361 612 Swap: 0 0 0 1 2.设置yum源 首先去/etc/yum.repos.d/目录,删除该目录下所有repo文件(先做好备份) rm -f /etc/yum.repos.d/ 1 rm -f /etc/yum.repos.d/ 下载centos基础yum源配置(这里用的是阿里云的镜像) curl -o CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 1 curl -o CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 配置kubernetes的yum源 1 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF 1 执行下列命令刷新yum源缓存 1 # yum clean all # yum makecache # yum repolist 1 得到这面这个列表,说明源配置正确 1 [root@MiWiFi-R1CM-srv yum.repos.d]# yum repolist 已加载插件:fastestmirror Loading mirror speeds from cached hostfile 源标识 源名称 状态 base/7/x86_64 CentOS-7 – Base – 163.com 10,019 docker-ce-stable/x86_64 Docker CE Stable – x86_64 28 extras/7/x86_64 CentOS-7 – Extras – 163.com 321 kubernetes Kubernetes 299 updates/7/x86_64 CentOS-7 – Updates – 163.com 628 repolist: 11,295 1 3.安装docker yum <span class="hljs-keyword">install</span> -y docker-ce 1 yum <span class="hljs-keyword">install</span> -y docker-ce 如果对于版本有要求,可以先执行 1 # yum list docker-ce –showduplicates | sort -r 已加载插件:fastestmirror 已安装的软件包 可安装的软件包 Loading mirror speeds from cached hostfile docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.1-3.el7 @docker-ce-stable docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable 列出所有版本,再执行 yum install -y docker-ce-<VERSION STRING> 1 安装完成后,执行 1 # systemctl start docker # systemctl enable docker # docker info Containers: 24 Running: 21 Paused: 0 Stopped: 3 Images: 11 Server Version: 18.09.1 Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 9754871865f7fe2f4e74d43e2fc7ccd237edcbce runc version: 96ec2177ae841256168fcf76954f7177af9446eb init version: fec3683 Security Options: seccomp Profile: default Kernel Version: 3.10.0-957.1.3.el7.x86_64 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 2 Total Memory: 1.795GiB Name: MiWiFi-R1CM-srv ID: DSTM:KH2I:Y4UV:SUPX:WIP4:ZV4C:WTNO:VMZR:4OKK:HM3G:3YFS:FXMY Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false Product License: Community Engine WARNING: bridge-nf-call-ip6tables is disabled 1 出现类似这样的说明安装正确 4.kubeadm安装k8s 目前来说kubeadm搭建出来的k8集群master还是单节点的,要做高可用还需要自己手动搭建etcd集群。 由于之前已经设置好了kubernetes的yum源,我们只要执行 yum install -y kubeadm 1 yum install -y kubeadm 系统就会帮我们自动安装最新版的kubeadm了(我安装的时候是1.13.1),一共会安装kubelet、kubeadm、kubectl、kubernetes-cni这四个程序。 kubeadm:k8集群的一键部署工具,通过把k8的各类核心组件和插件以pod的方式部署来简化安装过程 kubelet:运行在每个节点上的node agent,k8集群通过kubelet真正的去操作每个节点上的容器,由于需要直接操作宿主机的各类资源,所以没有放在pod里面,还是通过服务的形式装在系统里面 kubectl:kubernetes的命令行工具,通过连接api-server完成对于k8的各类操作 kubernetes-cni:k8的虚拟网络设备,通过在宿主机上虚拟一个cni0网桥,来完成pod之间的网络通讯,作用和docker0类似。 安装完后,执行 kubeadmin init --pod-network-cidr=10.244.0.0/16 1 kubeadmin init --pod-network-cidr=10.244.0.0/16 开始master节点的初始化工作,注意这边的--pod-network-cidr=10.244.0.0/16,是k8的网络插件所需要用到的配置信息,用来给node分配子网段,我这边用到的网络插件是flannel,就是这么配。 初始化的时候kubeadm会做一系列的校验,以检测你的服务器是否符合kubernetes的安装条件,检测结果分为[WARNING]和[ERROR]两种,类似如下的信息(一般第一次执行都会失败。。) 1 I0112 00:30:18.868179 13025 version.go:94] could not fetch a Kubernetes version from the internet: unable to get URL “https://dl.k8s.io/release/stable-1.txt”: Get https://storage.googleapis.com/kubernetes-release/release/stable-1.txt: net/http: request canceled (Client.Timeout exceeded while awaiting headers) I0112 00:30:18.868645 13025 version.go:95] falling back to the local client version: v1.15.0 [init] Using Kubernetes version: v1.15.0 [preflight] Running pre-flight checks [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 18.09.1. Latest validated version: 18.06 [WARNING Hostname]: hostname “miwifi-r1cm-srv” could not be reached [WARNING Hostname]: hostname “miwifi-r1cm-srv”: lookup miwifi-r1cm-srv on 192.168.31.1:53: no such host [WARNING Service-Kubelet]: kubelet service is not enabled, please run ‘systemctl enable kubelet.service’ error execution phase preflight: [preflight] Some fatal errors occurred: [ERROR FileContent–proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1 [ERROR Swap]: running with swap on is not supported. Please disable swap [preflight] If you know what you are doing, you can make a check non-fatal with --ignore-preflight-errors=... 1 意思就是无法拉取,kubeadm init 命令默认使用的docker镜像仓库为k8s.gcr.io,国内无法直接访问,于是需要变通一下。需要我们去手动pull镜像。 首先查看需要使用哪些镜像 1 kubeadm config images list #输出如下类似结果 k8s.gcr.io/kube-apiserver:v1.12.2 k8s.gcr.io/kube-controller-manager:v1.12.2 k8s.gcr.io/kube-scheduler:v1.12.2 k8s.gcr.io/kube-proxy:v1.12.2 k8s.gcr.io/pause:3.1 k8s.gcr.io/etcd:3.2.24 k8s.gcr.io/coredns:1.2.2 1 重新下载镜像,注意你的kubeadm需要的版本号,这里我也是复制的。 1 #注意版本号,这里我也是复制的 docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.14.0 docker pull mirrorgooglecontainers/kube-controller-manager-amd64:v1.14.0 docker pull mirrorgooglecontainers/kube-scheduler-amd64:v1.14.0 docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.14.0 docker pull mirrorgooglecontainers/pause:3.1 docker pull mirrorgooglecontainers/etcd-amd64:3.3.10 docker pull coredns/coredns:1.3.1 1 重新打标签 1 docker tag mirrorgooglecontainers/kube-apiserver-amd64:v1.14.0 k8s.gcr.io/kube-apiserver:v1.14.0 docker tag mirrorgooglecontainers/kube-controller-manager-amd64:v1.14.0 k8s.gcr.io/kube-controller-manager:v1.14.0 docker tag mirrorgooglecontainers/kube-scheduler-amd64:v1.14.0 k8s.gcr.io/kube-scheduler:v1.14.0 docker tag mirrorgooglecontainers/kube-proxy-amd64:v1.14.0 k8s.gcr.io/kube-proxy:v1.14.0 docker tag mirrorgooglecontainers/etcd-amd64:3.3.10 k8s.gcr.io/etcd:3.3.10 docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1 1 镜像都搞定后再次执行 kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 1 kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 出现类似这么一堆东西 1 Your Kubernetes master has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run “kubectl apply -f [podnetwork].yaml” with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ You can now join any number of machines by running the following on each node as root: kubeadm join 192.168.31.175:6443 –token wde86i.tmjaf7d18v26zg03 –discovery-token-ca-cert-hash sha256:b05fa53d8f8c10fa4159ca499eb91cf11fbb9b27801b7ea9eb7d5066d86ae366 1 说明安装成功了 kudeadm帮你做了大量的工作,包括kubelet配置、各类证书配置、kubeconfig配置、插件安装等等(这些东西自己搞不知道要搞多久,反正估计用过kubeadm没人会再愿意手工安装了)。注意最后一行,kubeadm提示你,其他节点需要加入集群的话,只需要执行这条命令就行了,里面包含了加入集群所需要的token。同时kubeadm还提醒你,要完成全部安装,还需要安装一个网络插件kubectl apply -f [podnetwork].yaml,并且连如何安装网络插件的网址都提供给你了(很贴心啊有木有)。同时也提示你,需要执行 1 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config 1 把相关配置信息拷贝入.kube的目录,这个是用来配置kubectl和api-server之间的认证,其他node节点的话需要将此配置信息拷贝入node节点的对应目录。此时我们执行一下 1 kubectl get node NAME STATUS ROLES AGE VERSION miwifi-r1cm-srv NotReady master 4h56m v1.13.1 1 显示目前节点是notready状态,先不要急,我们先来看一下kudeadm帮我们安装了哪些东西: 核心组件 前面介绍过,kudeadm的思路,是通过把k8主要的组件容器化,来简化安装过程。这时候你可能就有一个疑问,这时候k8集群还没起来,如何来部署pod?难道直接执行docker run?当然是没有那么low,其实在kubelet的运行规则中,有一种特殊的启动方法叫做“静态pod”(static pod),只要把pod定义的yaml文件放在指定目录下,当这个节点的kubelet启动时,就会自动启动yaml文件中定义的pod。从这个机制你也可以发现,为什么叫做static pod,因为这些pod是不能调度的,只能在这个节点上启动,并且pod的ip地址直接就是宿主机的地址。在k8中,放这些预先定义yaml文件的位置是/etc/kubernetes/manifests,我们来看一下 1 [root@MiWiFi-R1CM-srv manifests]# ls -l 总用量 16 -rw——-. 1 root root 1999 1月 12 01:35 etcd.yaml -rw——-. 1 root root 2674 1月 12 01:35 kube-apiserver.yaml -rw——-. 1 root root 2547 1月 12 01:35 kube-controller-manager.yaml -rw——-. 1 root root 1051 1月 12 01:35 kube-scheduler.yaml 1 这四个就是k8的核心组件了,以静态pod的方式运行在当前节点上 etcd:k8s的数据库,所有的集群配置信息、密钥、证书等等都是放在这个里面,所以生产上面一般都会做集群,挂了不是开玩笑的 kube-apiserver: k8的restful api入口,所有其他的组件都是通过api-server来操作kubernetes的各类资源,可以说是k8最底层的组件 kube-controller-manager: 负责管理容器pod的生命周期 kube-scheduler: 负责pod在集群中的调度 我们执行一下 1 kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-86c58d9df4-gbgzx 0/1 Pending 0 5m28s coredns-86c58d9df4-kzljk 0/1 Pending 0 5m28s etcd-miwifi-r1cm-srv 1/1 Running 0 4m40s kube-apiserver-miwifi-r1cm-srv 1/1 Running 0 4m52s kube-controller-manager-miwifi-r1cm-srv 1/1 Running 0 5m3s kube-proxy-9c8cs 1/1 Running 0 5m28s kube-scheduler-miwifi-r1cm-srv 1/1 Running 0 4m45s 1 可以看到kubeadm帮我们安装的,就是我上面提到的那些组件,并且都是以pod的形式安装。同时你也应该注意到了,coredns的两个pod都是pending状态,这是因为网络插件还没有安装。我们根据前面提到的官方页面的说明安装网络插件,这边我用到的是flannel,安装方式也很简单,标准的k8式的安装 <span class="hljs-attribute">kubectl</span> apply -f https://raw.githubusercontent.com/coreos/flannel/bc<span class="hljs-number">79</span>dd<span class="hljs-number">1505</span>b<span class="hljs-number">0</span>c<span class="hljs-number">8681</span>ece<span class="hljs-number">4</span>de<span class="hljs-number">4</span>c<span class="hljs-number">0</span>d<span class="hljs-number">86</span>c<span class="hljs-number">5</span>cd<span class="hljs-number">2643275</span>/Documentation/kube-flannel.yml 1 <span class="hljs-attribute">kubectl</span> apply -f https://raw.githubusercontent.com/coreos/flannel/bc<span class="hljs-number">79</span>dd<span class="hljs-number">1505</span>b<span class="hljs-number">0</span>c<span class="hljs-number">8681</span>ece<span class="hljs-number">4</span>de<span class="hljs-number">4</span>c<span class="hljs-number">0</span>d<span class="hljs-number">86</span>c<span class="hljs-number">5</span>cd<span class="hljs-number">2643275</span>/Documentation/kube-flannel.yml 安装完之后我们再看一下pod的状态 1 kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns–86c58d9df4-gbgzx 1/1 Running 0 11m coredns–86c58d9df4-kzljk 1/1 Running 0 11m etcd-miwifi-r1cm-srv 1/1 Running 0 11m kube-apiserver-miwifi-r1cm-srv 1/1 Running 0 11m kube-controller-manager-miwifi-r1cm-srv 1/1 Running 0 11m kube-flannel-ds-amd64-kwx59 1/1 Running 0 57s kube-proxy-9c8cs 1/1 Running 0 11m kube-scheduler-miwifi-r1cm-srv 1/1 Running 0 11m 1 再来看一下核心组件的状态 1 kubectl get componentstatus NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {“health”: “true”} 1 node的状态是Ready,说明我们的master安装成功,至此大功告成! 默认的master节点是不能调度应用pod的,所以我们还需要给master节点打一个污点标记 kubectl taint nodes <span class="hljs-comment">--all node-role.kubernetes.io/master-</span> 1 kubectl taint nodes <span class="hljs-comment">--all node-role.kubernetes.io/master-</span> 5.安装DashBoard k8项目提供了一个官方的dashboard,虽然平时还是命令行用的多,但是有个UI总是好的,我们来看看怎么安装。 这里如果你已经安装过dashboard,那就先删掉, 1 kubectl get pods –all-namespaces #会出现一堆pod,找到dashboard的那个,运行以下命令 kubectl delete pod kubernetes-dashboard-latest-3447225518-f39cr –namespace=kube-system 1 如果你发现你的dashboard又启动了,然后你又删除,它又启动,反正就是无限重启。解决方法:需要删除deployments才能完全删除那个pod,执行以下命令 1 kubectl get deployments –all-namespaces NAMESPACE NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kube-system kubernetes-dashboard-latest 1 1 1 0 2d kubectl delete deployments kubernetes-dashboard-latest -n kube-system 1 然后dashboard终于可以正常删掉。 重新安装 使用wget命令 下载kubernetes-dashboard.yaml 如果提示wget命令找不到就先安装wget yum <span class="hljs-keyword">install</span> wget 1 yum <span class="hljs-keyword">install</span> wget 执行 1 wget https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml #然后修改里面的内容 找到 spec: containers: – name: kubernetes-dashboard image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1 这个image后面的镜像地址修改成国内的 我用的是这个:registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1 1 然后执行 1 然后执行 kubectl <span class="hljs-keyword">create</span> -f kubernetes-dashboard.yaml 1 kubectl <span class="hljs-keyword">create</span> -f kubernetes-dashboard.yaml 安装完后查看pod信息 1 kubectl get po -n kube-system NAME READY STATUS RESTARTS AGE coredns–86c58d9df4-gbgzx 1/1 Running 0 4h45m coredns–86c58d9df4-kzljk 1/1 Running 0 4h45m etcd-miwifi-r1cm-srv 1/1 Running 0 4h44m kube-apiserver-miwifi-r1cm-srv 1/1 Running 0 4h44m kube-controller-manager-miwifi-r1cm-srv 1/1 Running 0 4h44m kube-flannel-ds-amd64-kwx59 1/1 Running 0 4h34m kube-proxy-9c8cs 1/1 Running 0 4h45m kube-scheduler-miwifi-r1cm-srv 1/1 Running 0 4h44m kubernetes-dashboard-57df4db6b-bn5vn 1/1 Running 0 4h8m 1 可以看到多了一个kubernetes-dashboard-57df4db6b-bn5vn,并且已经正常启动。但出于安全性考虑,dashboard是不提供外部访问的,官方提供了几种方式 proxy,nodeport,ingress 现在使用nodeport方式 <span class="hljs-attr">kubectl</span> <span class="hljs-string">-n kube-system edit service kubernetes-dashboard</span> 1 <span class="hljs-attr">kubectl</span> <span class="hljs-string">-n kube-system edit service kubernetes-dashboard</span> 设置成以下内容 1 apiVersion: v1 kind: Service metadata: creationTimestamp: “2019-01-11T18:12:43Z” labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system resourceVersion: “6015” selfLink: /api/v1/namespaces/kube-system/services/kubernetes-dashboard uid: 7dd0deb6-15cc-11e9-bb65-08002726d64d spec: clusterIP: 10.102.157.202 externalTrafficPolicy: Cluster ports: – nodePort: 30443 #增加这里 port: 443 protocol: TCP targetPort: 8443 selector: k8s-app: kubernetes-dashboard sessionAffinity: None type: NodePort #修改这里 status: loadBalancer: {} 1 dashboard应用的默认端口是8443,这边我们指定一个30443端口进行映射,提供外部访问入口。这时候我们就可以通过https://ip:30443来访问dashboard了,注意用官方的yaml创建出来的servcieaccount登陆的话,是啥权限都没有的,全部是forbidden,因为官方的给了一个minimal的role。。。我们这边为了测试方便,直接创建一个超级管理员的账号, 在node节点上创建: <span class="hljs-attr">vim</span> <span class="hljs-string">admin-sa.yaml</span> 1 <span class="hljs-attr">vim</span> <span class="hljs-string">admin-sa.yaml</span> 配置如下 1 apiVersion: v1 kind: ServiceAccount metadata: name: dashboard namespace: kube-system — kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: dashboard subjects: – kind: ServiceAccount name: dashboard namespace: kube-system roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io 1 执行: kubectl <span class="hljs-keyword">create</span> -f <span class="hljs-keyword">admin</span>-sa.yaml 1 kubectl <span class="hljs-keyword">create</span> -f <span class="hljs-keyword">admin</span>-sa.yaml 上面的admin用户创建完成后我们就可以获取到该用户对应的token了,如下命令: 1 kubectl describe secret dashboard -n kube-system dashboard-token-s9hqc Namespace: kube-system Labels: <none> Annotations: kubernetes.io/service-account.name: dashboard kubernetes.io/service-account.uid: 63c43e1e-15d6-11e9-bb65-08002726d64d Type: kubernetes.io/service-account-token Data ==== ca.crt: 1025 bytes namespace: 11 bytes token: eyJhbGciOiJSUzI1NiIsImtpZC……. 1 将该token填入登陆界面中的token位置,即可登陆,并具有全部权限。 至此完成!撒花完结!以下是参考网站 使用kubeadm快速搭建单机kubernetes 1.13集群 DashBoard-身份验证 kubernetes dashboard 访问问题 Kubernetes之(十六)Dashboard认证访问 解决k8s删除pod以后无限重启该pod的问题 使用kubeadm 安装 kubernetes 1.12.0 kubeadm reset操作步骤 使用Kubeadm搭建Kubernetes(1.12.2)集群 kubeadm–init kubeadm 无法下载镜像问题 centos7下kubernetes(5。部署kubernetes dashboard)