一、創建虛擬機
? ? ? ? 一臺32G內存,16核心的Win11,已經安裝了Hyper-V 管理器。然后也下載了CentOS-Stream-9-latest-x86_64-dvd1.iso的鏡像文件。
? ? ? ? 這里Hyper-V創建虛擬機的過程就不贅述了,如果出現虛擬機加載不到鏡像的問題,先把這個使用安全啟動給取消掉,按理應該就可以安裝系統了(注意安裝過程種有一個選項是否允許root通過ssh登錄,選上)。
? ? ? ? 安裝完一個系統,導出來,還原另外兩個出來,最好備份一個干凈的版本,因為很可能有什么問題,就要推倒重來。
????????另外就是值得一提的是,創建了一個內部虛擬交換機,然后共享這臺電腦的wifi對應的網卡給這個內部虛擬交換機,然后配置這個虛擬交換機的ip。
????????這個ip可以隨意設置,主要是給虛擬機做網關,下圖是Centos stream 9虛擬機中的手動的ip設置。
? ? ? ? 創建三個虛擬機。172.25.116.101、172.25.116.102、172.25.116.103,保證虛擬機可以上網,之間可以互通。
二、初始配置(所有節點)
1、關閉防火墻
systemctl stop firewalld && systemctl disable firewalld
2、關閉SELinux,都操作一遍
# 永久關閉
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config# 臨時關閉
setenforce 0
3、關閉交換分區
# 臨時關閉
sudo swapoff -a
# 永久關閉
sed -ri 's/.*swap.*/#&/' /etc/fstab
4、驗證(--show命令沒有輸出說明關閉成功)
sudo systemctl disable --now swap.target
sudo swapon --show
5、配置host解析(這里改成你自己的虛擬機ip)
我這里101想要作為master
cat >> /etc/hosts <<EOF
172.25.116.101 k8s-master
172.25.116.102 k8s-node1
172.25.116.103 k8s-node2
EOF
6、設置主機名(主節點/子節點)
# 這一句在101主節點執行
hostnamectl set-hostname k8s-master# 這一句在102子節點執行
hostnamectl set-hostname k8s-node1# 這一句在103子節點執行
hostnamectl set-hostname k8s-node2
7、配置內核參數(下面的代碼都要依次執行)
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
????????加載內核模塊?overlay
(覆蓋文件系統模塊)。這個命令在 ?容器運行時(如 Docker、containerd)?? 和 ?Kubernetes? 環境中非常重要,因為?overlay
?或?overlay2
?是容器鏡像分層存儲的默認文件系統驅動。
modprobe overlay
????????加載?br_netfilter
?內核模塊。這個模塊在 ?Kubernetes? 和 ?Docker? 網絡環境中非常重要,因為它允許 ?Linux 網橋(Bridge)處理 iptables/nftables 規則,確保容器和 Pod 之間的網絡通信正常。
modprobe br_netfilter
????????Kubernetes 使用 ?CNI 插件(如 flannel、calico)?? 創建虛擬網絡,依賴?iptables
?實現
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
????????應用 sysctl 參數而不重新啟動
sysctl --system
????????驗證net.ipv4.ip_forward 是否設置為 1
sysctl net.ipv4.ip_forward
三、安裝containerd(所有節點)
1、下載containerd
????????下載containerd,如果下載不動,可以想別的辦法下載到物理機在上傳到虛擬機里面。
wget https://github.com/containerd/containerd/releases/download/v1.7.22/containerd-1.7.22-linux-amd64.tar.gz
? ? ? ? 我就是通過別的方法下載的,下載完了上傳到了虛擬機的data目錄下,我自己手動創建的data目錄,然后進入這個目錄,進行解壓。
tar Cxzvf /usr/local containerd-1.7.22-linux-amd64.tar.gz
? ? ? ? 下載服務啟動文件
wget -O /etc/systemd/system/containerd.service https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
? ? ? ? 如果下載不動,執行下面的命令。
cat /etc/systemd/system/containerd.service
? ? ? ? 然后手動修改這個containerd.service文件,填入下面的內容。
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
2、啟動containerd
systemctl daemon-reloadsystemctl enable --now containerd
? ? ? ? 查看服務狀態
sudo systemctl status containerd
3、下載安裝Installing runc
wget https://github.com/opencontainers/runc/releases/download/v1.2.0-rc.3/runc.amd64
? ? ? ? 如果還是下載不動,想辦法下載傳到虛擬機中,我也是想別的辦法下載然后上傳到了data目錄下,然后執行
install -m 755 runc.amd64 /usr/local/sbin/runc
4、將containerd切換為國內源
# 創建配置目錄
mkdir /etc/containerd# 恢復默認配置文件
containerd config default > /etc/containerd/config.toml
? ? ? ? 這里要注意了,我之前花費了很久,就在這里的配置有問題。上面恢復默認配置之后,執行頁面兩個語句。
sed -i 's/registry.k8s.io/registry.aliyuncs.com\/google_containers/' /etc/containerd/config.tomlsed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
? ? ? ? 然后建議用可視化的方法打開這個配置文件,檢查這樣的一行(注意源和版本),恢復默認配置之后,我發現這里的版本是3.8,被我改成了3.10,是我后面安裝時發現拉取的鏡像是3.10,因為我是摸索了幾次,所以再次安裝的時候我就給改了。
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10"
5、重啟
systemctl daemon-reload
systemctl restart containerd
四、安裝kubeadm、kubelet 和 kubectl(所有節點)
1、添加 Kubernetes 的 yum 倉庫
? ? ? ? 注意其中的版本,我之前是參考網絡上的1.31版本,后來拉鏡像的時候就說遠端是1.33版本,不讓我拉,然后我沒找到解決的辦法,只好回來修改這個版本,重新安裝了。
# 此操作會覆蓋 /etc/yum.repos.d/kubernetes.repo 中現存的所有配置cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/corcce:/stable:/v1.33/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
或者下面這個,因為發現有時候使用上面的
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/repodata/repomd.xml.key
EOF
2、開始安裝
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetessudo systemctl enable --now kubelet
3、拉鏡像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
? ? ? ? 這里出現過的問題,之前因為是參考別人的文章。
????????第一個問題就是說網絡上的1.31版本,后來拉鏡像的時候就說遠端是1.33版本,不讓我拉。
? ? ? ? 第二個問題應該是containerd的配置有問題,導致這樣的錯誤validate service connection: validate CRI v1 runtime API for endpoint "unix:///var/run/containerd/containerd.sock": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService
五、安裝控制平面(主節點)
? ? ? ? 初始化配置文件
kubeadm config print init-defaults > /etc/kubernetes/init-default.yaml
? ? ? ? 修改源為阿里的源
sed -i 's/registry.k8s.io/registry.aliyuncs.com\/google_containers/' /etc/kubernetes/init-default.yaml
? ? ? ? 設置?apiServerIP 地址. 請自行替換172.25.116.101 這個IP
sed -i 's/1.2.3.4/172.25.116.101/' /etc/kubernetes/init-default.yaml
? ? ? ? 初始化主節點
kubeadm init --image-repository registry.aliyuncs.com/google_containers
? ? ? ? 如果這個步驟沒有出錯,那就ok了。如果卡在下面的地方,就是containerd的配置有問題。
? ? ? ? 如果執行成功,會出現如下內容。
? ? ? ? 注意其中的這幾句,如果初始化成功,需要執行下面這幾句,這是k8s給出的。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
????????然后記住最后的這句話,在子節點上運行可以加入到主節點。
kubeadm join 172.25.116.101:6443 --token io5c6p.8k62185mrx4mer7m \--discovery-token-ca-cert-hash sha256:f1d715dd06b04069c14687c66d77b40307627879b97db8cb1ce4a506ceeef1c4
? ? ? ? 這里面token是有過期時間的,如果過期,需要回到主節點執行下面的命令,重新獲取
kubeadm token create --print-join-command
六、校驗/結論
? ? ? ? 執行如果的兩個命令,可以看到節點和pods,我還有一個節點沒有配置,就著急忙慌的寫博客來了。
? ? ? ? 這是第一步,已經基本完成,后面還有一些步驟,比如儀表盤、部署等等,時間問題,暫時先步繼續,回頭測試完成在補充博客。