部署第一个 master 节点

初始化 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 的问题一定要解决了再继续执行下去。

第一次启动时基本都不能顺利启动, 修复好所有的错误后, 再次执行就可以了。我将大部分常用的错误列举成单独的一个部分, 参考 启动时常见错误修复

初始化成功

重新执行 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.126: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 /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

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

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

显示目前节点是 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 reset
kubeadm init --pod-network-cidr=10.244.0.0/16
kubectl taint nodes --all node-role.kubernetes.io/master-

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

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

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

Design by Quanzaiyu | Power by VuePress