这一节基本上会遇到很多异常错误信息,需要耐心的去解决它,跟环境等很多因素有关系。

初始化集群

在master 机器上初始化集群 会自动拉取相关的镜像 需要等待一下

kubeadm init --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.0.213

正常情况下 这里会报错,[ERROR ImagePull]: failed to pull image registry.aliyuncs.com/google_containers/coredns:v1.8.0: output: Error response from daemon: manifest for registry.aliyuncs.com/google_containers/coredns:v1.8.0 not found: manifest unknown: manifest unknown

原因是 期望自动下载的镜像为 registry.aliyuncs.com/google_containers/coredns:v1.8.0,然后仓库中并这个容器镜像,查了资料可以手动下载指定版本号的时候把v去掉即可,下载后并重命名一下版本号

手动拉取镜像

下载
#docker pull registry.aliyuncs.com/google_containers/coredns:1.8.0
重命名
#docker tag registry.aliyuncs.com/google_containers/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns:v1.8.0

然后再执行 kubeadm init --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.0.213 就不会报错了。执行完成后打印
执行完成后打印Your Kubernetes control-plane has initialized successfully!表示已经成功初始化。

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

在初始化结果日志中还打印了加入集群的令牌(token),令牌用于控制平面节点和加入节点之间的相互身份验证。 这里包含的令牌是密钥。确保它的安全, 因为拥有此令牌的任何人都可以将经过身份验证的节点添加到你的集群中。

节点加入集群

在work机器上执行加入节点到机器操作 要保证work机器上要能和master网络保持畅通,直接复制init 命令日志中最后一段话命令就行。
加入的时候要保证work节点上的docker服务是开启的。不然要报错。

kubeadm join 192.168.0.213:6443 --token 5aqi11.werqxkrz4e46vnih --discovery-token-ca-cert-hash sha256:4794a2e13e2c566070d6b289981abb267a0fce1dbf78d60c21db618719d764e7

加入成功后在master上执行kubectl get nodes会发现多了一个节点 但是状态是NotReady,这是不同的机器上容器内部网络不互通 接下来就来整一下网络。

网络模型插件

目前Kubernetes比较常用的网络组建 主要是flannelCalico 这里我们选用flannel做网络模型。安装方法也就是允许容器 还是比较方便。需要在master上执行

下载yml文件

wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

在集群中运行容器

kubectl apply  -f kube-flannel.yml

这里可能会遇到很多问题,安装好网络插件了 怎么节点还是NotReady状态呢?这些就要对问题进行进一步排查了。这个命令可以看到node上一些问题journalctl -u kubelet -n 300.
节点还是依然处理NotReady,就可能是环境有什么问题了,在Master上执行kubectl describe node test1 test1为状态异常的节点名称,就能看到这个节点当前的调度操作日志。比如这次有一台work机器日志显示为

Normal  Starting                 18s                kubelet  Starting kubelet.
Normal NodeHasSufficientPID 1s kubelet Node test1 status is now: NodeHasSufficientPID
Normal Starting 1s kubelet Starting kubelet.
Normal NodeHasSufficientMemory 1s kubelet Node test1 status is now: NodeHasSufficientMemory
Normal NodeHasNoDiskPressure 1s kubelet Node test1 status is now: NodeHasNoDiskPressure

能看到一些有用的信息 如 磁盘空间不足。

出现了异常 看哪些命令没有启动成功 可以参考以下的命令日志

journalctl -l -u kube-apiserver
journalctl -l -u kube-controller-manager
journalctl -l -u kube-scheduler
journalctl -l -u kubelet
journalctl -l -u kube-proxy

如果节点状态都为Ready 那真是太幸运了。安装好网络插件后 一般要等待1-2分钟才会变为Ready,接下来就可能把应用部署在k8s集群中去。