使用 Kubeadm 搭建 Kubernetes 集群

Kubeadm 简介

Kubeadm 是一个工具,它提供了 kubeadm init 以及 kubeadm join 这两个命令作为快速创建 kubernetes 集群的最佳实践。

kubeadm 通过执行必要的操作来启动和运行一个最小可用的集群。它被故意设计为只关心启动集群,而不是之前的节点准备工作。同样的,诸如安装各种各样值得拥有的插件,例如 Kubernetes Dashboard、监控解决方案以及特定云提供商的插件,这些都不在它负责的范围。

相反,我们期望由一个基于 kubeadm 从更高层设计的更加合适的工具来做这些事情;并且,理想情况下,使用 kubeadm 作为所有部署的基础将会使得创建一个符合期望的集群变得容易。

与 minikube 的区别

minikube基本上你可以认为是一个实验室工具,只能单机部署,里面整合了 k8s 最主要的组件,无法真正搭建集群,且由于程序做死无法安装各种扩展插件(比如网络插件、dns插件、ingress插件等等),主要作用是给你了解 k8s 用的。而 kudeadm 搭建出来是一个真正的 k8s 集群,可用于生产环境(HA需要自己做),和二进制搭建出来的集群几乎没有区别。

准备工作

  • BIOS中开启VT-X (如果是虚拟机注意设置)
  • 科学上网 (由于GFW)

配置三台CentOS虚拟机, 分别为:

  • 192.168.126.129 k8s-master
  • 192.168.126.130 k8s-node1
  • 192.168.126.131 k8s-node2

配置主机互通

所有节点配置hosts, 使三台机子能够互通

$ cat <<EOF >> /etc/hosts
192.168.126.129 k8s-master
192.168.126.130 k8s-node1
192.168.126.131 k8s-node2
EOF

关闭防火墙

$ systemctl stop firewalld
$ systemctl disable firewalld

禁用SELinux

$ setenforce 0

永久生效, 编辑文件 /etc/selinux/config,将SELINUX修改为disabled,如下:

$ vim /etc/selinux/config
SELINUX=disabled
$ sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
#SELINUX=disabled

关闭系统Swap

Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动。方法一,通过kubelet的启动参数–fail-swap-on=false更改这个限制。方法二,关闭系统的Swap。

$ swapoff -a

修改 /etc/fstab 文件,注释掉SWAP的自动挂载,使用 free -m 确认swap已经关闭。

#注释掉swap分区
$ sed -i 's/.*swap.*/#&/' /etc/fstab
$ cat /etc/fstab
#/dev/mapper/centos-swap swap                    swap    defaults        0 0
$ free -m
              total        used        free      shared  buff/cache   available
Mem:            962         154         446           6         361         612
Swap:             0           0           0

检查Docker的安装情况

检查系统是否已经安装Docker, 若已安装不符合规格的版本, 需要将其卸载:

$ rpm -qa | grep docker
docker-client-1.13.1-94.gitb2f74b2.el7.centos.x86_64
docker-common-1.13.1-94.gitb2f74b2.el7.centos.x86_64
docker-1.13.1-94.gitb2f74b2.el7.centos.x86_64
$ rpm -e docker-client-1.13.1-94.gitb2f74b2.el7.centos.x86_64 docker-common-1.13.1-94.gitb2f74b2.el7.centos.x86_64 docker-1.13.1-94.gitb2f74b2.el7.centos.x86_64

本文撰写时使用的是 Docker version 18.06.1-ce

设置源

在开始之前, 我们先对系统进行一整套的换源操作, 以保证后续操作能正常进行

$ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # 备份
$ curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
$ curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

执行下列命令刷新yum源缓存

$ yum clean all
$ yum makecache
$ yum repolist

执行那么多命令也很烦, 我的习惯是写一个 shell 脚本, 然后直接执行即可:

set-origin.sh

$ touch set-origin.sh && chmod 744 set-origin.sh && vim set-origin.sh
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum clean all
yum makecache
yum repolist

安装必要的软件

docker

# 设置源(如果没有设置过的话)
$ yum -y install yum-utils # 安装 yum-config-manager
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ yum makecache fast
$ yum install -y docker-ce

docker基本操作

$ systemctl start docker # 启动
$ systemctl stop docker # 关闭
$ systemctl enable docker # 开机自启
$ systemctl restart docker # 重启

docker基本信息

$ docker -v
$ docker info

kubeadm

$ yum install -y kubeadm

系统会帮我们自动安装最新版的kubeadm,一共会安装 kubelet、kubeadm、kubectl、kubernetes-cni 这四个程序。

  • kubeadm: k8s集群的一键部署工具,通过把k8s的各类核心组件和插件以pod的方式部署来简化安装过程
  • kubelet: 运行在每个节点上的node agent,k8s集群通过kubelet真正的去操作每个节点上的容器,由于需要直接操作宿主机的各类资源,所以没有放在pod里面,还是通过服务的形式装在系统里面
  • kubectl: kubernetes的命令行工具,通过连接api-server完成对于k8s的各类操作
  • kubernetes-cni: k8s的虚拟网络设备,通过在宿主机上虚拟一个cni0网桥,来完成pod之间的网络通讯,作用和docker0类似。

初始化 kubeadm

执行 kubeadm init 开始master节点的初始化工作

$ kubeadm init --pod-network-cidr=10.244.0.0/16

注意这边的 --pod-network-cidr=10.244.0.0/16,是k8s的网络插件所需要用到的配置信息,用来给node分配子网段,我这边用到的网络插件是 flannel,就是这么配,其他的插件也有相应的配法,官网上都有详细的说明,具体参考这个网页

初始化检测

初始化的时候kubeadm会做一系列的校验,以检测你的服务器是否符合kubernetes的安装条件,检测结果分为[WARNING]和[ERROR]两种,类似如下的信息:

CGROUPS_MEMORY: enabled
	[WARNING Hostname]: hostname "k8s-master" could not be reached
	[WARNING Hostname]: hostname "k8s-master": lookup k8s-master on 192.168.126.2: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 CRI]: container runtime is not running: output: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
, error: exit status 1
	[ERROR Service-Docker]: docker service is not active, please run 'systemctl start docker.service'
	[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist
	[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
	[ERROR Swap]: running with swap on is not supported. Please disable swap
	[ERROR SystemVerification]: failed to get docker info: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
  • [WARNING] 的有比如docker服务没设置成自动启动啦,docker版本不符合兼容性要求啦,hostname设置不规范之类,这些一般问题不大,不影响安装,当然尽量你按照它提示的要求能改掉是最好。
  • [ERROR] 的话就要重视,虽然可以通过 --ignore-preflight-errors 忽略错误强制安装,但为了不出各种奇怪的毛病,所以强烈建议error的问题一定要解决了再继续执行下去。

启动时常见错误修复

ERROR Swap

完整错误:

[ERROR Swap]: running with swap on is not supported. Please disable swap

解决方案: 关闭swap, 执行: swapoff -a

ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables

完整错误:

[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]

解决方案: 执行 echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

ERROR FileContent--proc-sys-net-ipv4-ip_forward

完整错误:

[ERROR FileContent--proc-sys-net-ipv4-ip_forward]

解决方案: 执行 echo 1 > /proc/sys/net/ipv4/ip_forward

ERROR Service-Docker

完整错误

[ERROR Service-Docker]
[ERROR CRI]
[ERROR SystemVerification]: failed to parse kernel config: unable to load kernel module: "configs", output: "modprobe: FATAL: Module configs not found.\n", err: exit status 1
[WARNING Service-Docker]: docker service is not enabled, please run 'systemctl enable docker.service'

解决方案: 启动 Docker, 并设置其开机自启

  • 启动Docker: systemctl start docker
  • 开机启动Docker: systemctl enable docker

ERROR DirAvailable--var-lib-etcd

完整错误

[ERROR DirAvailable--var-lib-etcd]

解决方案: 删除文件夹, 执行 rm -rf /var/lib/etcd

ERROR FileAvailable--etc-kubernetes-manifests-kube-xxx.yaml

完整错误

[ERROR FileAvailable--etc-kubernetes-manifests-kube-xxx.yaml]

其中xxx为具体文件名称

解决方案: 删除文件夹: rm -rf /etc/kubernetes/manifests

ERROR NumCPU

完整错误:

[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2

将虚拟机CPU增加至2核以上

WARNING Firewalld

完整错误

[WARNING Firewalld]

解决方案: 直接关闭防火墙, 执行 systemctl stop firewalld

WARNING Hostname

完整错误

[WARNING Hostname]

解决方案: 在 /etc/hosts 中映射本机域名, 比如 127.0.0.1 k8s-master

WARNING Service-Kubelet

完整错误

[WARNING Service-Kubelet]

解决方案: 开机启动kubelet, 执行 systemctl enable kubelet.service

ERROR ImagePull

拉取镜像出错, 一般是由于 GFW 的缘故, 解决方案是换源拉取相关镜像, 再重新取tag

可以创建一个 pull-images.sh 脚本:

$ touch pull-images.sh && chmod 744 pull-images.sh && vim pull-images.sh
# 从阿里云拉取容器
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.14.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.14.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.14.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.14.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.3.10
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.3.1
# 将阿里云拉取的容器打标签
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.14.0 k8s.gcr.io/kube-apiserver:v1.14.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.14.0 k8s.gcr.io/kube-controller-manager:v1.14.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.14.0 k8s.gcr.io/kube-scheduler:v1.14.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.14.0 k8s.gcr.io/kube-proxy:v1.14.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
# 删除阿里云拉取的容器
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.14.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.14.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.14.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.14.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.3.10
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.3.1

以上操作的目的是: 先从国内可访问的阿里镜像源中拉取相关的镜像, 然后修改其tag, 使其骗过docker已经拉取了官方镜像。

初始化成功

重新执行 kubeadm init, 初始化成功后, 会提示

$ kubeadm init --pod-network-cidr=10.244.0.0/16
Your Kubernetes control-plane 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/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.126.129:6443 --token wyotbp.oni1wbnrctsqrxx8 \
    --discovery-token-ca-cert-hash sha256:e0b9865ce6c197c26dc7580229f953e256c817ff7a2336030d106511566f2000

可以看到终于初始化成功了,kudeadm帮你做了大量的工作,包括kubelet配置、各类证书配置、kubeconfig配置、插件安装等等(这些东西自己搞不知道要搞多久,反正估计用过kubeadm没人会再愿意手工安装了)。注意最后一行,kubeadm提示你,其他节点需要加入集群的话,只需要执行这条命令就行了,里面包含了加入集群所需要的token。同时kubeadm还提醒你,要完成全部安装,还需要安装一个网络插件 kubectl apply -f [podnetwork].yaml

同时也提示你,需要执行

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

把相关配置信息拷贝入.kube的目录,这个是用来配置kubectl和api-server之间的认证,其他node节点的话需要将此配置信息拷贝入node节点的对应目录。此时我们执行一下:

$ kubectl get node
NAME         STATUS     ROLES    AGE    VERSION
k8s-master   NotReady   master   9m8s   v1.13.4

显示目前节点是notready状态。

同样地, 操作很繁琐, 将基本的命令封装成一个脚本:

start-k8s.sh

$ touch start-k8s.sh && chmod 744 start-k8s.sh && vim start-k8s.sh
systemctl enable docker
systemctl start docker
rm -rf /etc/kubernetes/manifests
rm -rf /var/lib/etcd
systemctl stop firewalld
swapoff -a
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/ipv4/ip_forward
kubeadm init --pod-network-cidr=10.244.0.0/16

初始化后的操作也可封装为一个脚本:

k8s-init.sh

$ touch k8s-init.sh && chmod 744 k8s-init.sh && vim k8s-init.sh
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

如果初始化过程出现问题,使用如下命令重置:

$ kubeadm reset
$ rm -rf /var/lib/cni/ $HOME/.kube/config

k8s核心组件

前面介绍过,kudeadm的思路,是通过把k8s主要的组件容器化,来简化安装过程。这时候你可能就有一个疑问,这时候k8s集群还没起来,如何来部署pod?难道直接执行docker run?当然是没有那么low,其实在kubelet的运行规则中,有一种特殊的启动方法叫做“静态pod”(static pod),只要把pod定义的yaml文件放在指定目录下,当这个节点的kubelet启动时,就会自动启动yaml文件中定义的pod。从这个机制你也可以发现,为什么叫做static pod,因为这些pod是不能调度的,只能在这个节点上启动,并且pod的ip地址直接就是宿主机的地址。在k8s中,放这些预先定义yaml文件的位置是 /etc/kubernetes/manifests,我们来看一下:

$ ll
总用量 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

以下四个就是k8s的核心组件了,以静态pod的方式运行在当前节点上

  • etcd: k8s的数据库,所有的集群配置信息、密钥、证书等等都是放在这个里面
  • kube-apiserver: 提供了HTTP restful api接口的关键服务进程, 是kubernetes里所有资源的增删改查等操作的唯一入口, 也是集群的入口进程,所有其他的组件都是通过apiserver来操作kubernetes的各类资源
  • kube-controller-manager: 负责管理容器pod的生命周期, kubernetes 里的所有资源对象的自动化控制中心, 可以理解为资源对象的"大总管"
  • kube-scheduler: 负责pod在集群中的调度, 相当于公交公司的"调度室"

具体操作来说,在之前的文章中已经介绍过,docker架构调整后,已经拆分出containerd组件,所以现在是kubelet直接通过cri-containerd来调用containerd进行容器的创建(不走docker daemon了),从进程信息里面可以看出

$ ps -ef | grep containerd
root      3075     1  0 00:29 ?        00:00:55 /usr/bin/containerd
root      4740  3075  0 01:35 ?        00:00:01 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/ec93247aeb737218908557f825344b33dd58f0c098bd750c71da1bc0ec9a49b0 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
root      4754  3075  0 01:35 ?        00:00:01 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/f738d56f65b9191a63243a1b239bac9c3924b5a2c7c98e725414c247fcffbb8f -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
root      4757  3

其中3075这个进程就是由docker服务启动时带起来的containerd daemon,4740和4754是由containerd进程创建的cotainerd-shim子进程,用来真正的管理容器进程。多说一句,之前的docker版本这几个进程名字分别叫docker-containerd,docker-cotainerd-shim,docker-runc, 现在的进程名字里面已经完全看不到docker的影子了,去docker化越来越明显了。

k8s插件(addon)

  • CoreDNS: cncf项目,主要是用来做服务发现,目前已经取代kube-dns作为k8默认的服务发现组件
  • kube-proxy: 基于iptables来做的负载均衡,service会用到,这个性能不咋地,知道一下就好

我们执行一下

$ kubectl get pods -n kube-system
NAME                                      READY   STATUS    RESTARTS   AGE
coredns-86c58d9df4-284kz                  0/1     Pending   0          5m28s
coredns-86c58d9df4-mlxjl                  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-fcjtg                          1/1     Running   0          5m28s
kube-scheduler-miwifi-r1cm-srv            1/1     Running   0          4m45s

可以看到kubeadm帮我们安装的,就是我上面提到的那些组件,并且都是以pod的形式安装。同时你也应该注意到了,coredns的两个pod都是pending状态,这是因为网络插件还没有安装。我们根据前面提到的官方页面的说明安装网络插件,这边我用到的是flannel,安装方式也很简单,标准的k8s式的安装

网络插件 kube-flannel

换源拉取镜像

docker pull registry.cn-shenzhen.aliyuncs.com/cp_m/flannel:v0.10.0-amd64
docker tag registry.cn-shenzhen.aliyuncs.com/cp_m/flannel:v0.10.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64
docker rmi registry.cn-shenzhen.aliyuncs.com/cp_m/flannel:v0.10.0-amd64

安装 kube-flannel

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml

安装完之后我们再看一下pod的状态

$ kubectl get pods -n kube-system
NAME                                 READY   STATUS    RESTARTS   AGE
coredns-86c58d9df4-284kz             1/1     Running   0          24m
coredns-86c58d9df4-mlxjl             1/1     Running   0          24m
etcd-k8s-master                      1/1     Running   0          23m
kube-apiserver-k8s-master            1/1     Running   0          23m
kube-controller-manager-k8s-master   1/1     Running   0          23m
kube-flannel-ds-amd64-d4bbn          1/1     Running   0          24m
kube-proxy-fcjtg                     1/1     Running   0          24m
kube-scheduler-k8s-master            1/1     Running   0          23m

可以看到coredns的两个pod都已经启动,同时还多了一个 kube-flannel-ds-amd64-d4bbn,这正是我们刚才安装的网络插件flannel。

注意

如果 kube-flannel-ds-amd64-d4bbn 的状态为 ImagePullBackOff, 则说明拉取镜像失败, 需要换源拉取, 参看前面的 "ERROR ImagePull" 错误解决

这时候我们再来看一下核心组件的状态

$ kubectl get componentstatus
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health": "true"}

可以看到组件的状态都已经ok了,我们再看看node的状态

$ kubectl get node
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   32m   v1.13.4

node的状态是Ready,说明我们的master安装成功,至此大功告成!

默认的master节点是不能调度应用pod的,所以我们还需要给master节点打一个污点标记

$ kubectl taint nodes --all node-role.kubernetes.io/master-

如果在配置过程中有任何错误, 比如 kube-flannel-ds-amd64-d4bbn 出错, 可以使用以下命令查看错误 (比如会有拉取镜像错误):

$ kubectl describe pod kube-flannel-ds-amd64-d4bbn --namespace=kube-system

部署其他节点

其他节点同样地安装 docker-cekubeadm, 并执行 kubeadm join (k8s-masterkubeadm init 的时候可以看到) 即可加入到 k8s-master 所在的集群中

node1

[root@k8s-node1 ~]# kubeadm join 192.168.126.129:6443 --token beqorm.1p6tzeashcwyhdwm \
>     --discovery-token-ca-cert-hash sha256:e0b9865ce6c197c26dc7580229f953e256c817ff7a2336030d106511566f2000
[preflight] Running pre-flight checks
	[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
	[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.14" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Activating the kubelet service
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

node2

[root@k8s-node2 ~]# kubeadm join 192.168.126.129:6443 --token beqorm.1p6tzeashcwyhdwm \
>     --discovery-token-ca-cert-hash sha256:e0b9865ce6c197c26dc7580229f953e256c817ff7a2336030d106511566f2000
[preflight] Running pre-flight checks
	[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
	[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.14" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Activating the kubelet service
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

k8s-master

[root@k8s-master ~]# ksys get nodes
NAME         STATUS   ROLES    AGE     VERSION
k8s-master   Ready    master   4h5m    v1.14.0
k8s-node1    Ready    <none>   3m45s   v1.14.0
k8s-node2    Ready    <none>   4m8s    v1.14.0

在 dashboard 中查看

各种apiVersion的含义

查看当前 Kubernetes 版本

$ kubelet --version
Kubernetes v1.14.0

查看当前可用的API版本

$ kubectl api-versions

alpha

  • 该软件可能包含错误。启用一个功能可能会导致bug
  • 随时可能会丢弃对该功能的支持,恕不另行通知

beta

  • 软件经过很好的测试。启用功能被认为是安全的。
  • 默认情况下功能是开启的
  • 细节可能会改变,但功能在后续版本不会被删除

stable

  • 该版本名称命名方式:vX这里X是一个整数
  • 稳定版本、放心使用
  • 将出现在后续发布的软件版本中

v1

Kubernetes API的稳定版本,包含很多核心对象:pod、service等

apps/v1beta2

在kubernetes1.8版本中,新增加了apps/v1beta2的概念,apps/v1beta1同理 DaemonSet,Deployment,ReplicaSet 和 StatefulSet的当时版本迁入apps/v1beta2,兼容原有的extensions/v1beta1

apps/v1

在kubernetes1.9版本中,引入apps/v1,deployment等资源从extensions/v1beta1, apps/v1beta1 和 apps/v1beta2迁入apps/v1,原来的v1beta1等被废弃。

apps/v1代表:包含一些通用的应用层的api组合,如:Deployments, RollingUpdates, and ReplicaSets

batch/v1

代表job相关的api组合

在kubernetes1.8版本中,新增了batch/v1beta1,后CronJob 已经迁移到了 batch/v1beta1,然后再迁入batch/v1

autoscaling/v1

代表自动扩缩容的api组合,kubernetes1.8版本中引入。 这个组合中后续的alpha 和 beta版本将支持基于memory使用量、其他监控指标进行扩缩容

extensions/v1beta1

deployment等资源在1.6版本时放在这个版本中,后迁入到apps/v1beta2,再到apps/v1中统一管理

certificates.k8s.io/v1beta1

安全认证相关的api组合

authentication.k8s.io/v1

资源鉴权相关的api组合

查看当前可用的API版本

使用 kubectl api-versions

参考资料

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress