在這一篇中我們將使用kubeadm基于ubuntu22.04部署一個控制、工作節(jié)點分離的雙節(jié)點集群用于測試,沒有高可用加入,使用kubeadm的原因首先是它支持生產(chǎn)級部署,穩(wěn)定性上沒問題,而這里的測試環(huán)境也沒有基礎(chǔ)設(shè)施自動化相關(guān)的需求。注意,在部署k8s方面,官方文檔已經(jīng)非常詳盡,此處不再做太多的細節(jié)說明,如果有細節(jié)問題請查看列出的官方參考,或者可以通過評論提出問題。
這里需要注意kubeadm的版本,它決定了k8s的版本,參考istio的Getting Started文檔,里面指出了能夠支持的k8s最新版本為1.28。所以我們的根參考文檔是k8s1.28的文檔:https://v1-28.docs.kubernetes.io/docs/setup/production-environment/tools/kubeadm/,注意鏈接中的v1-28
字樣,博客中所有官方文檔鏈接都是1.28版本的。
如果你從k8s官網(wǎng)進入文檔,記得在文檔右上角切換版本:
準備
有兩個節(jié)點:
- m,master節(jié)點,運行控制面組件
- w,worker節(jié)點,運行應(yīng)用負載
基礎(chǔ)環(huán)境
參考Before you begin,這里僅列出容易出現(xiàn)問題的點:
- 最低配置為2c2g
- 集群內(nèi)機器hostname、mac、product_uuid唯一,k8s利用后兩者標識不同的節(jié)點
- 必須關(guān)閉swap,因為cgroupv1不支持swap,kubeadm雖然已經(jīng)包含支持swap的beat特性但默認關(guān)閉,并且默認情況下它檢測到使用swap會退出,實際上,swap是內(nèi)存昂貴時代的解決方案,以降低服務(wù)質(zhì)量(換入換出會對程序性能產(chǎn)生很大的影響)來換取可用性,但以當今的服務(wù)量級,服務(wù)質(zhì)量下降可能帶來其他更多的問題,所以大多數(shù)情況下都不建議開啟swap,內(nèi)存不夠可以增加,也不必再關(guān)注swap內(nèi)存回收的細節(jié),感興趣可以閱讀為什么 Linux 需要 Swapping
- 在每個節(jié)點安裝容器運行時,在本系列第一篇中已經(jīng)部署了contianerd
在后面的安裝k8s集群部分還有一些準備工作。
安裝kubeadm和組件
在每個節(jié)點安裝kubeadm、kubelet,在需要命令行客戶端的節(jié)點安裝kubectl,參考Installing kubeadm, kubelet and kubectl,因為是全新安裝所以不必關(guān)注k8s組件版本兼容規(guī)則,需要注意三點:
- 安裝istio支持的1.28版本,使用1.28版本文檔中的命令就會安裝1.28的最新修訂版本
- 為kubelet指定cgroup driver為systemd,與容器運行時保持一致
- 別遺漏命令
sudo apt-mark hold kubelet kubeadm kubectl
以鎖定版本,否則自動升級會帶來比較大的風(fēng)險。
以上步驟中不太清晰的是配置kubelet的cgroup driver,需要在m節(jié)點創(chuàng)建配置文件kubeadm-config.yaml
并在kubeadm初始化時使用,這個文件會被kubeadm傳遞成為所有節(jié)點的/var/lib/kubelet/config.yaml
文件,并會保存為kube-system
namespace下的configmap對象??梢詮腃onfiguring the kubelet cgroup driver文檔獲取最小配置,已經(jīng)修改kubernetesVersion
:
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.28.0
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
使用配置文件的詳細信息可以從Using kubeadm init with a configuration file文檔中看到,如果執(zhí)行命令kubeadm config print init-defaults
可以看到輸出中kubernetesVersion
的值為1.28.0
,雖然當前的實際版本是1.28.5
。
安裝k8s集群
準備
主要是對網(wǎng)絡(luò)、容器運行時和鏡像的準備。
在本系列第一篇的基礎(chǔ)環(huán)境部分介紹了測試環(huán)境的網(wǎng)絡(luò)架構(gòu),在所有節(jié)點執(zhí)行命令ip route show
可以看到指向默認網(wǎng)關(guān)的接口為nat網(wǎng)絡(luò)接口,kubeadm與其他k8s組件一樣使用與默認網(wǎng)關(guān)關(guān)聯(lián)接口的ip作為工作ip,對于這個ip的要求是:
- 固定的ip,因為它會被自動寫入到很多配置當中去
- 節(jié)點間能夠通過工作ip互通
網(wǎng)絡(luò)配置文件/etc/netplan/00-installer-config.yaml
示例:
# This is the network config written by 'subiquity'
network:
ethernets:
enp0s3: # 僅主機網(wǎng)絡(luò)接口
addresses:
- 192.168.56.60/24
enp0s8: # nat網(wǎng)絡(luò)接口
dhcp4: false # 靜態(tài)ip
routes: # 默認網(wǎng)關(guān)
- to: default
via: 10.0.2.1
addresses:
- 10.0.2.51/24
nameservers: # dns
addresses:
- 8.8.8.8
version: 2
另外,參考Troubleshooting kubeadm文檔的Pods are not accessible via their Service IP部分可知,對于virtualbox,需要確保命令hostname -i
能夠返回一個路由可達的地址,具體的方法是將/etc/hosts
文件中與主機名對應(yīng)的127.0.0.1
修改為該節(jié)點的工作ip,/etc/hosts
部分示例:
127.0.0.1 localhost
10.0.2.51 ubuntu-dev60-k8sm1
執(zhí)行命令kubeadm config images list
可以看到kubeadm需要的鏡像,其中pause鏡像為registry.k8s.io/pause:3.9
,所以需要執(zhí)行命令sudo vim /etc/containerd/config.toml
,修改配置文件中sandbox_image
的值與之匹配。在本系列第一篇中已經(jīng)為contianerd配置了對應(yīng)倉庫的mirror,kubeadm初始化時可以直接pull鏡像,不用提前準備,當然也可以預(yù)先在每個節(jié)點執(zhí)行命令sudo kubeadm config images pull
拉取鏡像,這樣在初始化的時候能夠更加快速的看到反饋。拉取至本地的鏡像可以執(zhí)行命令sudo crictl images list
查看。
初始化控制平面m節(jié)點
在初始化控制平面節(jié)點之前,首先應(yīng)該確定初始化命令的參數(shù),之前已經(jīng)為設(shè)置cgroup dirver準備了一個配置文件,不做高可用的話主要是考慮網(wǎng)絡(luò)插件的訴求,此時所有節(jié)點上未添加cni插件配置,/etc/cni/net.d/
目錄為空。
官方在Installing Addons文檔中列出了不完全的網(wǎng)絡(luò)插件列表,流行網(wǎng)絡(luò)插件的對比可以參考rancher的文檔CNI 網(wǎng)絡(luò)插件,這里選擇flannel,從項目主頁可以看到它默認使用10.244.0.0/16
作為pod cidr(包含在kube-flannel.yml
文件中),插件的cidr必須與kubeadm中ClusterConfiguration中的對應(yīng)設(shè)置保持一致,否則flannel pod無法啟動。一個問題是flannel的默認cidr很容易看到,kubeadm卻不容易(前面提到的打印初始化默認配置看不到),可以參考kubeadm Configuration (v1beta3)文檔,其中的podSubnet
配置對應(yīng)kubeadm命令行參數(shù)--pod-network-cidr
(文檔中并沒有提到兩項配置的對應(yīng)關(guān)系),可以看到其默認值是10.244.0.0/24
,必須使之保持一致的話,修改哪一方都是可以的。還有一個問題,對于kubeadm來說參數(shù)--pod-network-cidr
與 --config
無法同時使用,否則會產(chǎn)生錯誤can not mix '--config' with arguments [pod-network-cidr]
。這里選擇在kubeadm-config.yaml
中添加目前需要的配置,最終的配置內(nèi)容為:
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.28.0
networking:
podSubnet: "10.244.0.0/16"
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
現(xiàn)在,在m節(jié)點執(zhí)行初始化命令:
sudo kubeadm init --config kubeadm-config.yaml
當看到這樣的輸出信息時:
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.3.15:6443 --token b4ci5u.nwpagzl6cq4y035n \
--discovery-token-ca-cert-hash sha256:cf300f9a479d5988c3d8a655530866d2abb69581812dae1626cad16dd3e381bb
說明控制面節(jié)點已經(jīng)初始化成功(不能等同于節(jié)點部署成功),接下來按照輸出中提示的命令配置kubectl訪問集群的憑證($HOME/.kube/config
),完成后就可以執(zhí)行命令kubectl get pods -A
查看pod的狀態(tài)。可以看到coredns pod因為網(wǎng)絡(luò)插件未就緒而處于pending狀態(tài)。接下來執(zhí)行命令安裝網(wǎng)絡(luò)插件flannel,參考Deploying Flannel with kubectl,為避免網(wǎng)絡(luò)緩慢,可以提前準備kube-flannel.yml
文件:
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
flannel會在/etc/cni/net.d
目錄下創(chuàng)建網(wǎng)絡(luò)配置。當看到所有的pod都處于running狀態(tài)后,說明節(jié)點部署成功。
處理初始化失敗
如果初始化過程失敗,參考Clean up文檔reset后再修復(fù)問題重新初始化,文檔中命令假定root用戶,如果用sudo提權(quán),注意執(zhí)行命令sudo sh -c "iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X"
清理iptables,還有一些清理行為是包含在kubeadm命令輸出中的,同樣需要注意。
加入工作節(jié)點
現(xiàn)在可以在其他節(jié)點執(zhí)行初始化打印中的join命令加入w節(jié)點了。
其余操作從Managed node labels開始根據(jù)情況自行處理即可,主要關(guān)注的是控制面節(jié)點隔離(禁止工作負載調(diào)度至控制面節(jié)點)。
安裝容器管理工具kuboard
k8s的dashboard有些簡陋,這里安裝一個輕量的管理界面kuboard以簡化對k8s的操作。參考安裝 Kuboard v3 - 內(nèi)建用戶庫,這里不使用docker,而是使用nerdctl(注意修改ip與掛載至容器的本地目錄):
sudo nerdctl run -d \
--restart=unless-stopped \
--name=kuboard \
-p 80:80/tcp \
-p 10081:10081/tcp \
-e KUBOARD_ENDPOINT="http://192.168.56.60:80" \
-e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \
-v /home/ian/opt/kuboard/data:/data \
eipwork/kuboard:v3
總結(jié)
雖然k8s的官方文檔很詳盡,但是想要一帆風(fēng)順也不容易。本篇因為沒有使用高可用架構(gòu),相對簡單一些,如果使用高可用,就需要使用一個負載均衡(例如kube-vip)來分發(fā)訪問多個控制面節(jié)點的流量,更進一步的話可以把存儲etcd集群放到外部(參考Options for Highly Available Topology)。
從部署過程可以看出,kubeadm無法自動化眾多的準備工作,如果規(guī)模化使用,需要結(jié)合標準的操作系統(tǒng)鏡像和ansible之類的自動化工具,可以嘗試看看其他部署工具的方案。文章來源:http://www.zghlxwxcb.cn/news/detail-817547.html
k8s做了很多抽象,是一個復(fù)雜度很高的基礎(chǔ)設(shè)施,在下一篇中會直接部署istio的demo應(yīng)用,然后在下下篇中會對k8s相關(guān)的概念做一個整體的介紹,再然后才能談得上體驗istio。對于k8s,建議至少刷一遍官方文檔。文章來源地址http://www.zghlxwxcb.cn/news/detail-817547.html
到了這里,關(guān)于體驗istio(二):kubeadm安裝k8s集群的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!