領(lǐng)導(dǎo)讓我部署一套 Kubernetes 集群,我咔咔咔給他搞定(1.32無坑版)
分享如何搭建一個1主2從的Kuberntes集群,我這里使用1.32版本,后續(xù)會基于該版本升級到1.33,下面我們先將該集群搭建起來。

一、系統(tǒng)初始化配置
所有節(jié)點同步操作:
1. 部署環(huán)境(1主2從)
名稱 | IP地址 | 操作系統(tǒng) | 配置 |
k8s-master | 10.0.0.210 | RockyLinux9.5 | 2核4G |
k8s-node1 | 10.0.0.211 | RockyLinux9.5 | 2核2G |
k8s-node2 | 10.0.0.212 | RockyLinux9.5 | 2核2G |
2. 關(guān)閉防火墻和SELinux
# 關(guān)閉防火墻并設(shè)置為開機自動關(guān)閉
systemctl disable --now firewalld
# 關(guān)閉SELinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 臨時關(guān)閉SELinux
setenforce 03. 修改主機名
master節(jié)點:
hostnamectl set-hostname k8s-master
node1節(jié)點:
hostnamectl set-hostname k8s-node1
node2節(jié)點:
hostnamectl set-hostname k8s-node24. 配置hosts文件
cat >> /etc/hosts <<EOF
10.0.0.210 k8s-master
10.0.0.211 k8s-node1
10.0.0.212 k8s-node2
EOF5. 時間同步
可選步驟,主要是讓三個節(jié)點的時間同步。
yum install -y chrony
sed -ri 's/^pool.*/#&/' /etc/chrony.conf
cat >> /etc/chrony.conf << EOF
pool ntp1.aliyun.com iburst
EOF
systemctl restart chronyd
chronyc sources
# 修改時區(qū),如果之前是這個時區(qū)就不用修改
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' > /etc/timezone6. 關(guān)閉交換分區(qū)
kubernetes強制要求禁止:
# 關(guān)閉當前交換分區(qū)
swapoff -a
# 禁止開機自動啟動交換分區(qū)
sed -ri 's/.*swap.*/#&/' /etc/fstab7. 內(nèi)核參數(shù)優(yōu)化
將橋接的IPv4流量傳遞到iptables的鏈:
# 加載內(nèi)核模塊
cat << EOF > /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# 加載
modprobe overlay
modprobe br_netfilter
cat >> /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 加載生效
sysctl -p /etc/sysctl.d/kubernetes.conf
sysctl --system
lsmod | grep br_netfilter # 查看是否加載完成
8. 配置免密登錄
可選操作,主要便于批量管理:
ssh-keygen # 連續(xù)回車三次
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.210
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.211
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.212
測試登錄
ssh root@10.0.0.211
無需密碼登錄即成功9. 安裝ipvs轉(zhuǎn)發(fā)支持
在kubernetes中Service有兩種代理模型,一種是基于iptables的,一種是基于ipvs,兩者對比ipvs的性能要高。默認使用iptables,所以要手動加載ipvs。
# 安裝依賴包
yum install -y conntrack ipvsadm libseccomp
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod +x /etc/sysconfig/modules/ipvs.modules
# 執(zhí)行腳本
/etc/sysconfig/modules/ipvs.modules
# 驗證ipvs模塊
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
10. 安裝docker,containerd
# 獲取阿里云YUM源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安裝yum-config-manager配置工具
yum -y install yum-utils
# 設(shè)置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安裝docker-ce版本
yum install -y docker-ce
# 啟動并設(shè)置開機自啟動
systemctl enable --now docker
# 查看版本號
docker --version
# 查看版本具體信息
docker version
# Docker鏡像源設(shè)置
# 修改文件 /etc/docker/daemon.json,沒有這個文件就創(chuàng)建
# 添加以下內(nèi)容后,重啟docker服務(wù):
cat >/etc/docker/daemon.json<<EOF
{
"registry-mirrors": [
"https://registry.cn-hangzhou.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com",
"https://docker.1panel.live",
"https://hub.littlediary.cn",
"https://docker.kejilion.pro",
"https://docker.1ms.run",
"https://lispy.org",
"https://docker.xiaogenban1993.com",
"https://docker.xuanyuan.me",
"https://docker.mybacc.com",
"https://docker-0.unsee.tech",
"https://dockerpull.cn"
]
}
EOF
# 加載啟動Docker
systemctl enable --now docker
# 查看
systemctl status docker containerd說明:
- dockerd實際真實調(diào)用的還是containerd的api接口,containerd是dockerd和runC之間的一個中間交流組件。所以啟動docker服務(wù)的時候,也會啟動containerd服務(wù)的。
- kubernets自v1.24.0后,就不再使用docker.shim,替換采用containerd作為容器運行時端點。因此需要安裝containerd(在docker的基礎(chǔ)下安裝),上面安裝docker的時候就自動安裝了containerd了。這里的docker只是作為客戶端而已。容器引擎還是containerd。
- 其實也可以直接安裝container.io,而不用安裝docker
11. 配置containerd
# containerd生成配置文件
containerd config default > /etc/containerd/config.toml
# 配置containerd cgroup 驅(qū)動程序為systemd
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
# 將 sandbox_image 鏡像源設(shè)置為阿里云google_containers鏡像源
sed -i "s#registry.k8s.io/pause:3.8#registry.aliyuncs.com/google_containers/pause:3.10#g" /etc/containerd/config.toml
# 配置crictl連接containerd
cat >> /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
# 啟動containerd并設(shè)置開機自啟動
systemctl enable --now containerd
# 查看containerd狀態(tài)
systemctl status containerd二、安裝kubernetes集群
1. 配置阿里云上k8s的yum源
在所有節(jié)點上執(zhí)行:
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/
enabled=1
gpgcheck=0
EOF
## 查看所有的可用版本
yum list kubelet --showduplicates | sort -r |grep 1.32
2. 安裝kubectl,kubelet和kubeadm
所有節(jié)點執(zhí)行:
# 若不指定版本默認安裝最高版本
yum install -y kubectl-1.32.9 kubelet-1.32.9 kubeadm-1.32.9
# kubectl是命令行工具。kubeadm僅是一個集群搭建工具,不涉及啟動。kubelet是一個守護進程程序,由kubeadm在搭建過程中自動啟動,這里僅設(shè)置開機啟動即可。
systemctl enable kubelet
# 準備k8s-1.32.9 所需要的鏡像
kubeadm config images list --kubernetes-versinotallow=v1.32.9
# 可以提前把鏡像下載好,這樣安裝快(可選步驟)
crictl pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.32.9
crictl pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.32.9
crictl pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.32.9
crictl pull registry.aliyuncs.com/google_containers/kube-proxy:v1.32.9
crictl pull registry.aliyuncs.com/google_containers/pause:3.10
crictl pull registry.aliyuncs.com/google_containers/etcd:3.5.16-0
crictl pull registry.aliyuncs.com/google_containers/coredns:v1.11.33. 集群初始化(在master上執(zhí)行)
kubeadm init --kubernetes-versinotallow=v1.32.9 \
--pod-network-cidr=192.168.0.0/16 \
--apiserver-advertise-address=10.0.0.210 \
--service-cidr=10.224.0.0/16 \
--image-repository=registry.aliyuncs.com/google_containers--apiserver-advertise-address 集群apiServer地址(master節(jié)點IP即可) --image-repository 由于默認拉取鏡像地址k8s.gcr.io國內(nèi)無法訪問,這里指定阿里云鏡像倉庫地址 --kubernetes-version K8s版本,與上面安裝的一致 --service-cidr 集群內(nèi)部虛擬網(wǎng)絡(luò),Pod統(tǒng)一訪問入口 --pod-network-cidr Pod網(wǎng)絡(luò),與下面部署的CNI網(wǎng)絡(luò)組件yaml中保持一致
安裝成功會輸出以下內(nèi)容:
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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
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 10.0.0.210:6443 --token 8nlzcn.iq9ohzqjcfefdp0g \
--discovery-token-ca-cert-hash sha256:6c1d9a8cd03ac34de32226f78316f0d3b3b30322704d7845365e94f63f27eff14. 重置后再初始化(可選)
若集群初始化失敗,可以通過排障后重新初始化:
kubeadm reset -f
rm -fr ~/.kube/ /etc/kubernetes/* /var/lib/etcd/*5. 配置環(huán)境變量
這里是從上面初始化時輸出的信息,直接復(fù)制過來就行,在master節(jié)點上操作:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 臨時生效(退出當前窗口重連環(huán)境變量失效)
export KUBECONFIG=/etc/kubernetes/admin.conf
# 永久生效(推薦)
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile6. node工作節(jié)點加入k8s集群
根據(jù)master節(jié)點最后輸出的內(nèi)容,【切記不要復(fù)制我下面的】直接在node節(jié)點上執(zhí)行:
kubeadm join 10.0.0.210:6443 --token 8nlzcn.iq9ohzqjcfefdp0g \
--discovery-token-ca-cert-hash sha256:6c1d9a8cd03ac34de32226f78316f0d3b3b30322704d7845365e94f63f27eff1
如果沒有令牌,可以通過在控制平面節(jié)點上運行以下命令來獲取令牌:
kubeadm token list默認情況下, 令牌會在24小時后過期。如果要在當前令牌過期后將節(jié)點加入集群, 則可以通過在控制平面節(jié)點上運行以下命令來創(chuàng)建新令牌:
kubeadm token create --print-join-command7. 查看節(jié)點狀態(tài)
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 45m v1.32.9
k8s-node1 NotReady <none> 22s v1.32.9
k8s-node2 NotReady <none> 16s v1.32.9發(fā)現(xiàn)節(jié)點是NotReady狀態(tài),說明集群還不可以使用,還需要安裝網(wǎng)絡(luò)插件。

8. 安裝網(wǎng)絡(luò)插件(master節(jié)點操作)
網(wǎng)絡(luò)組件有很多種,只需要部署其中一個即可,推薦Calico。
Calico是一個純?nèi)龑拥臄?shù)據(jù)中心網(wǎng)絡(luò)方案,Calico支持廣泛的平臺,包括Kubernetes、OpenStack等。
Calico 在每一個計算節(jié)點利用 Linux Kernel 實現(xiàn)了一個高效的虛擬路由器( vRouter) 來負責數(shù)據(jù)轉(zhuǎn)發(fā),而每個 vRouter 通過 BGP 協(xié)議負責把自己上運行的 workload 的路由信息向整個 Calico 網(wǎng)絡(luò)內(nèi)傳播。
此外,Calico 項目還實現(xiàn)了 Kubernetes 網(wǎng)絡(luò)策略,提供ACL功能。
(1) 下載calico的yaml文件
curl -o /root/calico.yaml https://raw.githubusercontent.com/projectcalico/calico/v3.30.3/manifests/calico.yaml(2) 修改calico.yaml
下載完后還需要修改里面定義Pod網(wǎng)絡(luò)(CALICO_IPV4POOL_CIDR),與前面kubeadm init的 --pod-network-cidr指定的一樣。
# (3)修改倉庫
將docker.io修改為quay.io安裝calico:
kubectl apply -f calico.yaml9. 給node節(jié)點打標簽(可選)
kubectl label nodes k8s-node1 node-role.kubernetes.io/worker=worker
kubectl label nodes k8s-node2 node-role.kubernetes.io/worker=worker10. 驗證集群
(1)查看集群信息
[root@k8s-master ~]# kubectl cluster-info
Kubernetes control plane is running at https://10.0.0.210:6443
CoreDNS is running at https://10.0.0.210:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.(2)查看節(jié)點信息
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 48m v1.32.9
k8s-node1 Ready worker 3m51s v1.32.9
k8s-node2 Ready worker 3m45s v1.32.9
(3) 查看pod運行狀態(tài)
[root@k8s-master ~]# kubectl get pods -A
至此,集群已搭建完成,后期會分享3master高可用集群部署,敬請期待。



























