一、设置Kubernetes安装源
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
二、安装kubectl、kubelet、kubeadm
安装命令:
yum install -y kubectl kubelet 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 类似。
设置kubelet为开机启动:
systemctl enable kubelet
三、部署 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 config images pull
这一步,说明k8s相关的镜像没有拉取成功。
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
可以事先拉取好镜像,或者设置 --image-repository
从阿里源拉取镜像(网络插件为 calico):
kubeadm init --kubernetes-version=1.19.3 \
--apiserver-advertise-address=192.168.34.128 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16
初始化检测
初始化的时候 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.34.128:6443 --token ebpu3f.pl7roaj6n18ht4at \
--discovery-token-ca-cert-hash sha256:2479b3359f98641fabe7557f1fb82683d01aab5150c7862ebefb3d3e7361ae7b
可以看到终于初始化成功了,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.19.3
显示目前节点是 notready 状态,因为还缺少网络插件。
如果初始化过程出现问题,使用如下命令重置:
kubeadm reset
rm -rf /var/lib/cni/ $HOME/.kube/config
默认的 master 节点是不能调度应用 pod 的,所以我们还需要给 master 节点打一个污点标记
kubectl taint nodes --all node-role.kubernetes.io/master-
脚本封装
操作很繁琐,将基本的命令封装成一个脚本: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
systemctl disable 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