實驗目的
本實驗旨在通過?Kubeadm?工具快速部署一個?Kubernetes 1.28.2?集群,包含?1 個 Master 節點和 2 個 Worker 節點,并驗證集群的基本功能。實驗涉及以下關鍵步驟:
-
環境準備:配置主機名、關閉防火墻、禁用 SELinux、設置時區、關閉 Swap 等。
-
安裝 Docker:使用高版本 Docker(27.3.1)并配置鏡像加速。
-
安裝 CRI-Docker:解決 Kubernetes 1.28+ 對 Docker 的支持問題。
-
部署 Kubernetes:通過?
kubeadm
?初始化 Master 節點并加入 Worker 節點。 -
安裝網絡插件:使用 Flannel 提供 Pod 網絡通信。
拓撲圖
主機名 | ip | 硬件最低要求 |
master | 10.1.1.85 | 2核,2G |
node1 | 10.1.1.86 | 1核,1G |
node2 | 10.1.1.79 | 1核,1G |
配置步驟
前期準備(三臺機子都需要,所以可以克隆)
(1)修改主機名
hostnamectl set-hostname ?xxx
exec bash
為了避免做dns,在/etc/hosts 文件中記錄主機名
(2)關閉防火墻,安裝iptables
?systemctl stop firewalld
?systemctl disable firewalld
(3)安裝iptables
?yum -y install iptables-services
各節點啟動
systemctl start iptables
清空規則
iptables -F
開機啟動
systemctl enable iptables
?(4)禁用selinux
?setenforce 0
?sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
?(5) 設置時區
timedatectl set-timezone Asia/Shanghai
?(6)關閉 swap 分區
swapoff -a
sed -i 's:/dev/mapper/rl-swap:#/dev/mapper/rl-swap:g' /etc/fstab
?(7) 安裝 ipvs
?yum install -y ipvsadm ipset
?(8)加載 bridge
?yum install -y epel-release
yum install -y bridge-utils
?modprobe br_netfilter
?echo 'br_netfilter' >> /etc/modules-load.d/bridge.conf
?echo 'net.bridge.bridge-nf-call-iptables=1' >> /etc/sysctl.conf
?echo 'net.bridge.bridge-nf-call-ip6tables=1' >> /etc/sysctl.conf
?echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
?sysctl -p
?(9)添加 docker-ce yum 源
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo?https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
?(10)安裝docker(27.3.1)
yum -y install docker-ce
注:不一定是這個版本,只是提醒一下,我們安裝的docker 是高版本;
如果下面不想使用cri-docker ,安裝的docker 版本不要高于20.10,因為kubeadm-1.23.6 不支持太高的版本;
(11) 配置 daemon.json ?重要的是配置源
?配置docker守護進程,創建docker服務目錄
cat > /etc/docker/daemon.json << EOF { ??"data-root": "/data/docker", ??"exec-opts": ["native.cgroupdriver=systemd"], ??"log-driver": "json-file", ??"log-opts": { ????"max-size": "100m", ????"max-file": "100" ??}, ??"registry-mirrors": [ ????"https://docker.m.daocloud.io", ????"https://docker.hcp.cloud", ????"https://docker.unsee.tech", ????"https://docker.ipanel.live", ????"http://mirrors.ustc.edu.cn", ????"https://docker.chenby.cn", ????"http://mirror.azure.cn", ????"https://dockerpull.org", ????"https://dockerhub.icu", ????"https://hub.rat.dev" ??] } EOF |
mkdir -p /etc/systemd/system/docker.service.d
(12) 重啟docker服務
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
(13)上傳CRI-Docker插件
(或者通過命令下載wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.9/cri dockerd-0.3.9.amd64.tgz)
下面是我的飛書資源下載鏈接
Docs
(14)解壓CRI-Dockerd插件,將解壓后的cri-dockerd可執行文件復制到/usr/bin/目錄,并設置執行權限
tar -xf cri-dockerd-0.3.9.amd64.tgz
cp cri-dockerd/cri-dockerd /usr/bin/
chmod +x /usr/bin/cri-dockerd
(15)配置CRI-Docker服務文件
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.service [Unit] Description=CRI Interface for Docker Application Container Engine Documentation=https://docs.mirantis.com After=network-online.target firewalld.service docker.service Wants=network-online.target Requires=cri-docker.socket [Service] Type=notify ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8 ExecReload=/bin/kill -s HUP $MAINPID TimeoutSec=0 RestartSec=2 Restart=always StartLimitBurst=3 StartLimitInterval=60s LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity Delegate=yes KillMode=process [Install] WantedBy=multi-user.target EOF |
(16)添加 cri-docker 套接字,創建CRI-Docker socket文件
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.socket [Unit] Description=CRI Docker Socket for the API PartOf=cri-docker.service [Socket] ListenStream=%t/cri-dockerd.sock SocketMode=0660 SocketUser=root SocketGroup=docker [Install] WantedBy=sockets.target EOF |
(17)重新加載systemd守護進程,啟用CRI-Docker服務,啟動該服務,并檢查服務是否處于活動狀態。
systemctl daemon-reload
systemctl enable cri-docker
systemctl start cri-docker
systemctl is-active cri-docker
(18)添加 kubeadm yum 源
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 https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF |
(19)安裝kubernetes 1.28.2
yum install -y kubelet-1.28.2 kubectl-1.28.2 kubeadm-1.28.2 ???這個只是告知怎么在安裝的過程中選擇版本
yum -y install kubelet kubeadm kubeadm
systemctl enable kubelet.service
kubelet 剛安裝完成后,通過 systemctl start kubelet 方式是無法啟動的,需要加入節點 或初始化為 master 后才可啟動成功。
以上的內容三臺都要做;所以偷懶的辦法就是,做好一臺克隆2個,改ip,改主機名就行。
在master節點的操作
(1)生成默認的初始化配置文件init-config.yaml
kubeadm config print init-defaults > init-config.yaml
(2)編輯配置文件
vi init-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3 bootstrapTokens: - groups: ??- system:bootstrappers:kubeadm:default-node-token ??token: abcdef.0123456789abcdef ??ttl: 24h0m0s ??usages: ??- signing ??- authentication kind: InitConfiguration localAPIEndpoint: ??advertiseAddress: 10.1.1.85 ??bindPort: 6443 nodeRegistration: ??criSocket: unix:///var/run/cri-dockerd.sock ??imagePullPolicy: IfNotPresent ??name: master ??taints: null --- apiServer: ??timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: {} etcd: ??local: ????dataDir: /var/lib/etcd imageRepository: registry.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: 1.28.2 networking: ??dnsDomain: cluster.local ??serviceSubnet: 10.96.0.0/12 ??podSubnet: 10.244.0.0/16 scheduler: {} |
(3)列出初始化集群所需的鏡像并拉取
kubeadm config images list --config=init-config.yaml
kubeadm config images pull --config=init-config.yaml
注:如果下載鏡像失敗,嘗試手動下載;舉例如下:
ctr -n k8s.io images pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.0
(4)初始化K8S集群
kubeadm init --config=init-config.yaml
(5)創建.kube目錄,復制管理員配置文件,修改文件權限
mkdir -p ?$HOME/.kube
cp ?-i /etc/kubernetes/admin.conf ?$HOME/.kube/config
chown ?$(id?-u):$(id?-g) ?$HOME/.kube/config
(6)將各節點加入到集群(注意要修改成自己的節點信息,初始化集群時可以看到)
kubeadm join 10.1.1.85:6443 \
??--token abcdef.0123456789abcdef \
??--discovery-token-ca-cert-hash sha256:15612baa3473388167c8ff2ca2ff06474909c9f1329d84e68f2966299347a62c \
??--cri-socket unix:///var/run/cri-dockerd.sock
(7)查看集群中的節點狀態
kubectl get nodes
(8)上傳flannel網絡插件(也可以用下面的命令下載)
Docs
(9)部署Pod網絡
wget -L?https://github.com/flannel-io/flannel/releases/latest/download/kube flannel.yml
kubectl apply -f kube-flannel.yml
(使用kubectl get nodes查看集群中的節點狀態,確認所有節點都已加入并處于Ready狀態。使用kubectl get pods -n kube-system查看kube-system命名空間下的Pod狀態,確認所有Pod都在運行
kubectl get nodes -o wide
kubectl get pod -n kube-system
至此,通過Kubeadm快速安裝Kubernetes集群已經完成。
實驗結論
本實驗通過標準化流程完成了 Kubernetes 集群的快速部署,驗證了集群的基本功能(節點管理、網絡通信)。實驗過程中遇到的典型問題(如運行時兼容性、鏡像拉取)通過替換組件和配置鏡像源解決,為后續深入學習 Kubernetes 運維和開發奠定了基礎。