1.环境配置
关闭swapoff和防火墙
# 临时关闭swap
临时关闭swapoff命令 swapoff -a,每次重启电脑后都要手动关闭一次,永久关闭不推荐
# 禁用selinux
sudo vim /etc/selinux/config
SELINUX=disabled
# 关闭防火墙
ufw disable 关闭防火墙
systemctl status firewalld如果没有这个命令就别管了
# 验证
systemctl status firewalld
#确认swap已经关闭
free -m
# 添加内核配置
sudo sh -c 'echo "net.bridge.bridge-nf-call-ip6tables =1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward =1">/etc/sysctl.d/k8s.conf'
#执行命令让修改生效
modprobe br_netfilter
sudo sysctl -p /etc/sysctl.d/k8s.conf
# 配置IPVS模块
vim /etc/modules
ip_vs_rr
ip_vs_wrr
ip_vs_sh
ip_vs
sudo iptables -P FORWARD ACCEPT
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
#查看是否已经正确加载所需的内核模块
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
2.docker安装和配置
下载docker,网上很多教程,不在赘述,注意版本不要过低,下载好后,修改docker配置
vim /etc/docker/daemon.json
{"registry-mirrors":["https://dockerhub.azk8s.cn","https://reg-mirror.qiniu.com","https://quay-mirror.qiniu.com"],
"exec-opts":["native.cgroupdriver=systemd"]
}
sudo systemctl daemon-reload
sudo systemctl restart docker
然后就可以通过docker info | grep Cgroup来查看修改后的 docker cgroup 状态,发现变为systemd即为修改成功
3.安装 kubeadm、kubelet、kubectl
# 使得 apt 支持 ssl 传输
apt-get update && apt-get install -y apt-transport-https
# 下载 gpg 密钥
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# 添加 k8s 镜像源
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
# 更新源列表
apt-get update
# 列出所有可升级版本
sudo apt-cache madison kubeadm
sudo apt-cache madison kubelet
#安装
sudo apt-get update && apt-get install kubelet=1.21.12-00 kubeadm=1.21.12-00 kubectl=1.21.12-00 --allow-unauthenticated
4.拉取核心组件镜像
# 获取需要的镜像
sudo kubeadm config images list --kubernetes-version=v1.21.12
#阿里云下载
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.12
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.12
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.12
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.12
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.0
#打标签
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.12 k8s.gcr.io/kube-apiserver:v1.21.12
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.12 k8s.gcr.io/kube-controller-manager:v1.21.12
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.12 k8s.gcr.io/kube-scheduler:v1.21.12
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.12 k8s.gcr.io/kube-proxy:v1.21.12
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1 k8s.gcr.io/pause:3.4.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0 k8s.gcr.io/etcd:3.4.13-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.0 k8s.gcr.io/coredns:1.8.0
#删除旧镜像
docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.12
docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.12
docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.12
docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.12
docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1
docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.0
#查看镜像
docker images |grep k8s
5.初始化 master 节点
使用kubeadm的init命令就可以轻松的完成初始化,不过需要携带几个参数,如下。先不要直接复制执行,将赋值给--apiserver-advertise-address参数的 ip 地址修改为自己的master主机地址,然后再执行。
kubeadm init --apiserver-advertise-address=10.170.51.193 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=1.21.12
这里介绍一下一些常用参数的含义:
--apiserver-advertise-address: k8s 中的主要服务apiserver的部署地址,填自己的管理节点 ip
--image-repository: 拉取的 docker 镜像源,因为初始化的时候kubeadm会去拉 k8s 的很多组件来进行部署,所以需要指定国内镜像源,下不然会拉取不到镜像。
--pod-network-cidr: 这个是 k8s 采用的节点网络,因为我们将要使用flannel作为 k8s 的网络,所以这里填10.244.0.0/16就好
--kubernetes-version: 这个是用来指定你要部署的 k8s 版本的,一般不用填,不过如果初始化过程中出现了因为版本不对导致的安装错误的话,可以用这个参数手动指定。
--ignore-preflight-errors: 忽略初始化时遇到的错误,比如说我想忽略 cpu 数量不够 2 核引起的错误,就可以用--ignore-preflight-errors=CpuNum。错误名称在初始化错误时会给出来。
当你看到如下字样是,就说明初始化成功了,请把最后那行以kubeadm join开头的命令复制下来,之后安装工作节点时要用到的,如果你不慎遗失了该命令,可以在master节点上使用kubeadm token create --print-join-command命令来重新生成一条。
如果在初始化过程中出现了任何Error导致初始化终止了,使用kubeadm reset重置之后再重新进行初始化
#配置kubectl工具
mkdir -p /root/.kube
cp /etc/kubernetes/admin.conf /root/.kube/config
#从节点加入
执行上面的kubeadm join命令
#flannel插件部署
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
#calico部署
参照我之前的文章
一般到这里都不会有问题,我遇到了一个问题是
failed to delegate add: failed to find plugin "bridge" in path [/opt/cni/bin], failed to clean up sandbox container
解决方法是下载cni工具包
cd /opt/cni/bin
wget https://github.com/containernetworking/plugins/releases/download/v0.8.7/cni-plugins-linux-amd64-v0.8.7.tgz
tar -zxvf cni-plugins-linux-amd64-v0.8.7.tgz
5.插件卸载
#flannel插件
kubectl delete -f kube-flannel.yml
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/
rm -f /etc/cni/net.d/*
重启kubelet
systemctl restart kubelet
#calico插件
kubectl delete -f calico.yaml
modprobe -r ipip
rm -rf /var/lib/cni/
rm -f /etc/cni/net.d/*
重启kubelet
systemctl restart kubelet
完全卸载k8s
kubeadm reset -f
rm -rf /etc/cni /etc/kubernetes /var/lib/dockershim /var/lib/etcd /var/lib/kubelet /var/run/kubernetes ~/.kube/*
modprobe -r ipip
lsmod
rm-rf ~/.kube/
rm-rf /etc/kubernetes/
rm-rf /etc/systemd/system/kubelet.service.d
rm-rf /etc/systemd/system/kubelet.service
rm-rf /usr/bin/kube*
rm-rf /etc/cni
rm-rf /opt/cni
rm-rf /var/lib/etcd
rm-rf /var/etcd
iptables -F && iptables -X
iptables -t nat -F && iptables -t nat -X
iptables -t raw -F && iptables -t raw -X
iptables -t mangle -F && iptables -t mangle -X
systemctl restart docker
然后docker.io,在重新初始化集群之前,您需要重新安装、kubeadm、kubectl和kubelet并确保它们是您的发行版的最新版本。
编辑:发现 calico 将防火墙规则添加到raw表中,因此也需要清除。