Node安装与Master安装会相对简单,会单独说明

1. 故事背景

如果你存下以下情况或者需求,满足一个就可以往下读

  • 不想玩单机Master了
  • 囊中羞涩
  • 以上均是

2. 提前准备

  • 本次试验是在CentOS 7.4 64位系统,root用户下进行
  • 拥有访问Google的能力,如果你有科学上网的能力,应用到CentOS7可以参考
  • 拥有Kubernetes Master,如果没有可参考
  • 本次安装的Kubernetes版本是1.11.x

3. 安装kubeadm

这步和安装Master基本一致,其中第四部kubelet配置cgroup driver不需要处理。

我🖕原话说过”kubelet配置cgroup driver“,其实是错误的。在某一次测试集群挂掉,重启机器后发现有一个节点,一直是NotReady的状态,通过查询Kubelet日志journalctl -xeu kubelet,发现其中错误直指Cgroup driver,按照Master设置的方式重启Kubelet后,节点处于Ready状态了。

❗️注意❗️

  • kubectl可以不用装,管理k8s基本上在Master机器上就可以了

  • kubeadm、kubelet可以默认安装,但最好与master一致,否则会有版本不兼容的问题。查询对应版本kubeadm versionkubelet --version。安装对应版本如yum install -y kubelet-1.11.2 kubeadm-1.11.2

  • docker可以默认安装,但最好也与master一致,否则有可能无法成功加入master。查询对应版本yum list docker-ce。安装对应版本如docker install -y docker-ce-18.06.1.ce-3.el7

4. 准备k8s的镜像

注意:如果你可以顺利访问google,可以忽略!如果不能,请看提前准备的参考

因为装master的时候,相关的k8s镜像已经下过一遍,所以为了版本保持一致,最好先下载好,在master机器上通过docker images查看。

# master的版本
docker pull k8s.gcr.io/kube-apiserver-amd64:v1.11.0
docker pull k8s.gcr.io/kube-controller-manager-amd64:v1.11.0
docker pull k8s.gcr.io/kube-scheduler-amd64:v1.11.0
docker pull k8s.gcr.io/kube-proxy-amd64:v1.11.0
docker pull k8s.gcr.io/coredns:1.1.3
docker pull k8s.gcr.io/etcd-amd64:3.2.18
docker pull k8s.gcr.io/pause-amd64:3.1
docker pull k8s.gcr.io/pause:3.1

等镜像pull完,你可以把docker的科学上网去掉,你已经基本上不需要他了

加入master

在master初始化完毕后,会输出一段类似于以下的命令

kubeadm join 172.16.224.34:6443 --token fweifx.fs7f8w3f89sfhf --discovery-token-ca-cert-hash sha256:2174a53f2d7c7f59ee3d425e2da069a70c251e2192b3375e1361dcc50f46a066

如果你忘记了,没关系,下面这个命令会告诉你

# 注意:此命令在Master机器上执行,把输出结果在Node机器上执行
kubeadm token create --print-join-command

如果你记录下来了,那可以直接在Node机器上执行,其中token是24小时有效,如果已经过期,可以使用以下命令获取。

# 注意:此命令在Master机器上执行
# 创建token
> kubeadm token create
> kubeadm token list
TOKEN                     TTL       EXPIRES                     USAGES                   DESCRIPTION   EXTRA GROUPS
lc8imt.grx159aia7115ngk   2h        2018-09-12T20:18:49+08:00   authentication,signing   <none>        system:bootstrappers:kubeadm:default-node-token

# lc8imt.grx159aia7115ngk  就是你需要的token

所以最终的命令,替换如下

kubeadm join 172.16.224.34:6443 --token lc8imt.grx159aia7115ngk --discovery-token-ca-cert-hash sha256:2174a53f2d7c7f59ee3d425e2da069a70c251e2192b3375e1361dcc50f46a066

顺利的话,会告诉你加入成功,这个时候你在Master机器通过命令kubectl get nodes可以看到多了一个节点。 一开始可能是not ready状态,有一些pod是需要同步到新节点上的,同步并启动完成后,就会变成ready状态。

常见问题

一直处于not ready状态

你需要使用命令journalctl -xeu kubelet看看日志,具体问题具体分析

[ERROR FileContent–proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1

kubeadm join时,发生类似上述的错误。

编辑文件/etc/sysctl.conf,新增或修改如下内容

net.bridge.bridge-nf-call-iptables = 1

执行如下命令生效

sudo sysctl -p

搞乱了,想重新来

  1. 在master上删除node,kubectl delete node {NODE_NAME}
  2. 在worker上重置,kubeadm reset -f