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表中,因此也需要清除。