kubernetes使用kubeadm創(chuàng)建集群實(shí)操教程(全)
根據(jù)官方文檔,總共有三種使用部署工具安裝kubernetes的方式,分別是使用kubeadm 引導(dǎo)集群、使用kOps安裝 Kubernetes、使用Kubespray安裝 Kubernetes。
在本次部署設(shè)計(jì)中,采用kubeadm引導(dǎo)集群的方式,主要運(yùn)用了安裝kubeadm、對kubeadm進(jìn)行故障排查、使用kubeadm創(chuàng)建集群。目標(biāo)是要安裝單個(gè)控制平面的Kubernetes集群,在集群上安裝Pod網(wǎng)絡(luò),以便Pod可以相互連通。
一、虛擬機(jī)準(zhǔn)備
準(zhǔn)備三臺(tái)預(yù)先安裝docker、cri-docker環(huán)境、kubernetes組件、cri-docker環(huán)境的虛擬機(jī)。
(一)主機(jī)基本配置
創(chuàng)建虛擬機(jī),根據(jù)官方文檔,本次實(shí)驗(yàn)在CentOS 8環(huán)境下進(jìn)行,主機(jī)內(nèi)存設(shè)置4GB,處理器個(gè)數(shù)為4,采用NAT網(wǎng)絡(luò)適配器。
(二)安裝docker
詳細(xì)安裝過程:CentOS 8:在Linux環(huán)境下安裝和卸載Docker
1. 安裝docker
yum install -y yum-utils device-mapper-persistent-data lvm2
2. 設(shè)置阿里云源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3. 安裝 Docker Engine-Community
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
4. 設(shè)置docker開機(jī)自動(dòng)啟動(dòng)
systemctl enable docker
(三)配置cri-docker環(huán)境
1. 提前下載cri-docker環(huán)境拖入虛擬機(jī),解壓縮并移動(dòng)到指定位置
tar -xf cri-dockerd-0.3.4.amd64.tgz -C /usr/local/ ls /usr/local mv /usr/local/cri-dockerd/cri-dockerd /usr/local/bin/
2. 配置cri-dockerd.service文件
vim /etc/systemd/system/cri-dockerd.service
# cri-dockerd.service文件內(nèi)容 [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 [Service] Type=notify ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --docker-endpoint=unix:///var/run/docker.sock --cri-dockerd-root-directory=/var/lib/docker 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
3. 配置cri-dockerd.socket文件
vim /etc/systemd/system/cri-dockerd.socket
# cri-dockerd.socket文件內(nèi)容 [Unit] Description=CRI Docker Socket for the API PartOf=cri-docker.service [Socket] ListenStream=/var/run/cri-dockerd.sock SocketMode=0660 SocketUser=root SocketGroup=docker [Install] WantedBy=sockets.target
4. 啟動(dòng)cri-docker服務(wù)
systemctl daemon-reload systemctl start cri-dockerd.service systemctl enable cri-dockerd.service
(四)安裝kubeadm、kubelet、kubectl
kubeadm:用來初始化集群的指令。
kubelet:在集群中的每個(gè)節(jié)點(diǎn)上用來啟動(dòng) Pod 和容器等。
kubectl:用來與集群通信的命令行工具。
1. 配置kubernetes的yum源
vim /etc/yum.repos.d/kubernetes.repo
# kubernetes.repo文件內(nèi)容 [kubernetes] name = Kubernetes baseurl = https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled = 1 gpgcheck = 0 repo_gpgcheck = 0 gpgkey = https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
2. 安裝Kubernetes三大組件
dnf install kubelet kubeadm kubectl
3. 設(shè)置kubectl開機(jī)自動(dòng)啟動(dòng)
systemctl enable kubectl
(五)克隆主機(jī)
1. 進(jìn)入克隆虛擬機(jī)向?qū)?,選擇創(chuàng)建完整克隆
2. 根據(jù)需要為克隆主機(jī)重命名,修改存儲(chǔ)位置
二、環(huán)境配置工作
在三臺(tái)主機(jī)中均要進(jìn)行如下的環(huán)境配置工作
(一)修改主機(jī)名
對三臺(tái)主機(jī)分別修改主機(jī)名
hostnamectl set-hostname master
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2
(二)編輯hosts文件
1. 查看主機(jī)ip地址
ifconfig
2. 編輯/etc/hosts文件
vim /etc/hosts
# /etc/hosts文件內(nèi)容 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.211.137 master 192.168.211.136 slave1 192.168.211.138 slave2
(三)關(guān)閉防火墻、selinux、swap
1. 關(guān)閉防火墻
避免后續(xù)需要配置開放端口
systemctl stop firewalld.service systemctl disable firewalld.service
2. 關(guān)閉selinux
selinux會(huì)限制容器對宿主機(jī)文件系統(tǒng)和系統(tǒng)資源的訪問權(quán)限
setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
3. 關(guān)閉swap分區(qū),編輯/etc/fstab文件
kubelet要求必須禁用交換分區(qū),kubeadm初始化時(shí)會(huì)檢測swap是否關(guān)閉
vim /etc/fstab
修改/etc/fstab文件內(nèi)容,注釋swap行
# /etc/fstab文件內(nèi)容(局部) # /dev/mapper/cl-swap none swap defaults 0 0
(四)配置同步時(shí)間、系統(tǒng)模塊
1. 設(shè)置本地時(shí)區(qū),加載RTC設(shè)置
確保集群中的各個(gè)組件在進(jìn)行各種操作時(shí)具有一致的時(shí)間戳
timedatectl set-local-rtc 0 timedatectl set-timezone Asia/Shanghai hwclock –systohc
2. 加載和檢查系統(tǒng)模塊
確保Kubernetes網(wǎng)絡(luò)和容器的正常運(yùn)行
modprobe br_netfilter lsmod | grep br_netfilter
(五)配置SSH免密登錄
配置Kubernetes集群需要在不同的節(jié)點(diǎn)之間進(jìn)行通信和操作,配置SSH免密登錄能夠簡化操作,避免每次執(zhí)行操作都需要手動(dòng)輸入密碼。
1. 生成新的密鑰對
ssh-keygen
2. 將公鑰復(fù)制到目標(biāo)主機(jī)
ssh-copy-id root@master ssh-copy-id root@slave1 ssh-copy-id root@slave2
3. 檢驗(yàn)配置結(jié)果
ssh root@master ssh root@slave1 ssh root@slave2
三、準(zhǔn)備容器所需的鏡像
由于無法訪問外網(wǎng),不能下載存放在registry.k8s.io上的默認(rèn)容器鏡像,這里選擇在阿里云上進(jìn)行拉取鏡像,然后使用tag命令修改為它需求的鏡像標(biāo)簽,以下操作在三臺(tái)主機(jī)中都要進(jìn)行。
(一)查看所需鏡像文件
查看Kubernetes集群需要的鏡像
kubeadm config images list
(二)配置daemon.json文件
1. 在阿里云中啟用鏡像加速器
2. 配置/etc/docker/daemon.json文件
在阿里云操作文檔的基礎(chǔ)上添加驅(qū)動(dòng)命令修改docker的驅(qū)動(dòng)為systemd,使其與與k8s保持一致,避免沖突
tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors":["https://2nd8r72o.mirror.aliyuncs.com"], "exec-opts":[ "native.cgroupdriver=systemd" ] } EOF
3. 載入daemon.json文件并重啟docker
systemctl daemon-reload systemctl restart docker
(三)拉取鏡像文件
拉取阿里云里所需要的鏡像
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.4 docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.4 docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.4 docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.28.4 docker pull registry.aliyuncs.com/google_containers/pause:3.9 docker pull registry.aliyuncs.com/google_containers/etcd:3.5.9-0 docker pull registry.aliyuncs.com/google_containers/coredns:v1.10.1
(四)修改鏡像標(biāo)簽
使用tag修改為需求的鏡像標(biāo)簽
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.4 registry.k8s.io/kube-apiserver:v1.28.4 docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.4 registry.k8s.io/kube-controller-manager:v1.28.4 docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.4 registry.k8s.io/kube-scheduler:v1.28.4 docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.28.4 registry.k8s.io/kube-proxy:v1.28.4 docker tag registry.aliyuncs.com/google_containers/pause:3.9 registry.k8s.io/pause:3.9 docker tag registry.aliyuncs.com/google_containers/etcd:3.5.9-0 registry.k8s.io/etcd:3.5.9-0 docker tag registry.aliyuncs.com/google_containers/coredns:v1.10.1 registry.k8s.io/coredns/coredns:v1.10.1
(五)查看鏡像結(jié)果
查看本地鏡像,確認(rèn)是否有需要的鏡像
docker images
四、具體節(jié)點(diǎn)配置
(一)初始化Kubernetes集群
1. 在主節(jié)點(diǎn)執(zhí)行初始化的命令
apiserver-advertise-address用來指定API服務(wù)器的廣播地址。
kubernetes-version指定要安裝的Kubernetes版本。
service-cidr指定服務(wù)網(wǎng)絡(luò)的CIDR范圍。
pod-network-cidr指定Pod網(wǎng)絡(luò)的CIDR范圍。
ignore-preflight-errors=all忽略所有預(yù)檢錯(cuò)誤。
cri-socket指定容器運(yùn)行時(shí)的UNIX套接字路徑。
另外,由于前一步驟已經(jīng)安裝了集群所需的鏡像,在命令進(jìn)行時(shí)會(huì)提示鏡像已存在而不再拉取,故也不再需要設(shè)置image-repository的值
kubeadm init \ --apiserver-advertise-address=192.168.211.137 \ --kubernetes-version v1.28.4 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 \ --ignore-preflight-errors=all \ --cri-socket=unix:///var/run/cri-dockerd.sock
如果報(bào)錯(cuò)則輸入下面命令恢復(fù)原有狀態(tài)
systemctl stop kubelet rm -rf /etc/kubernetes/* systemctl stop docker rm -rf /var/lib/kubelet/ rm -rf /var/lib/etcd
在這一部分出現(xiàn)的主要問題是:在前期原本只安裝了docker而沒有安裝cri-dockerd,經(jīng)過查資料發(fā)現(xiàn)k8s在1.20.X版本以后就棄用了docker,于是臨時(shí)改用containerd,重新在containerd拉取鏡像和改標(biāo)簽,但在使用中仍有bug無法解決。于是選擇安裝cri-dockerd再次進(jìn)行以上命令,執(zhí)行成功。
2. 初始化成功顯示以下內(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 192.168.211.137:6443 --token ejgoxs.086hnhj7qipovd6v \ --discovery-token-ca-cert-hash sha256:6bbe9e754e2b0ab13301e76268c347b9f95b661b2399630ecfa8da9497ca5744
初始化成功后虛擬機(jī)卡頓嚴(yán)重,通過關(guān)閉后提高處理器、內(nèi)存等配置得以緩解
3. 根據(jù)提示運(yùn)行kubectl
我使用root用戶,可以直接設(shè)置KUBECONFIG環(huán)境變量,可以讓kubectl命令行工具自動(dòng)找到并使用這個(gè)配置文件
export KUBECONFIG=/etc/kubernetes/admin.conf
(二)部署Pod網(wǎng)絡(luò)
部署Pod網(wǎng)絡(luò)是為了提供容器間和跨節(jié)點(diǎn)的網(wǎng)絡(luò)通信,實(shí)現(xiàn)網(wǎng)絡(luò)策略和安全性,支持服務(wù)發(fā)現(xiàn)和負(fù)載均衡
1. 進(jìn)入提示的網(wǎng)站,選擇flannel網(wǎng)絡(luò)組件
2. 安裝CNI網(wǎng)絡(luò)插件
根據(jù)網(wǎng)站內(nèi)提示,F(xiàn)lannel默認(rèn)用作 CNI 網(wǎng)絡(luò)插件,部署Flannel時(shí)需確保CNI網(wǎng)絡(luò)插件有安裝,由于國內(nèi)訪問Github不穩(wěn)定,這里提前下載好插件,拖入虛擬機(jī)的主目錄,再進(jìn)行解壓等命令
mkdir -p /opt/cni/bin tar -C /opt/cni/bin -xzf cni-plugins-linux-amd64-v1.2.0.tgz
3. 使用kubectl部署flannel
根據(jù)網(wǎng)站內(nèi)提示,提前下載好yml文件,拖入虛擬機(jī)的主目錄,再輸入命令
kubectl apply -f kube-flannel.yml
(三)加入子節(jié)點(diǎn)
1. 在主節(jié)點(diǎn)中將kubeconfig環(huán)境變量分發(fā)到子節(jié)點(diǎn)
kubeconfig環(huán)境變量指定了kubectl命令使用的kubeconfig文件的路徑,該文件包含了連接到集群所需的認(rèn)證和配置信息,讓子節(jié)點(diǎn)上的kubectl命令能夠連接到Kubernetes集群的控制平面
scp /etc/kubernetes/admin.conf slave1:/etc/kubernetes/ scp /etc/kubernetes/admin.conf slave2:/etc/kubernetes/
設(shè)計(jì)結(jié)束后,在官方安裝文檔上注意到其實(shí)建議不要將admin.conf文件與任何人共享,應(yīng)該使用kubeadm kubeconfig user命令為其他用戶生成 kubeconfig文件
2. 在兩個(gè)node節(jié)點(diǎn)中輸入以下命令
由于同時(shí)有containerd和docker,在提示的命令基礎(chǔ)上加了cri-socket參數(shù),指定為cri-dockerd
kubeadm join 192.168.211.137:6443 \ --token ejgoxs.086hnhj7qipovd6v \ --discovery-token-ca-cert-hash sha256:6bbe9e754e2b0ab13301e76268c347b9f95b661b2399630ecfa8da9497ca5744 \ --cri-socket=unix:///var/run/cri-dockerd.sock
報(bào)錯(cuò)則輸入下面命令恢復(fù)原有狀態(tài),再根據(jù)報(bào)錯(cuò)提示進(jìn)行調(diào)整
rm -rf /etc/kubernetes/kubelet.conf rm -rf /etc/kubernetes/pki/ca.crt systemctl restart kubelet
(四)確保節(jié)點(diǎn)Ready狀態(tài)
1. 查看節(jié)點(diǎn)狀態(tài)
kubectl get nodes
2. 顯示NotReady,需要修改yml文件
原因是pod之間無法ping通,需要讓flanneld包發(fā)到指定網(wǎng)卡,數(shù)據(jù)包才能正常的經(jīng)過flannel進(jìn)行傳送
ifconfig vim kube-flannel.yml
在kube-flannel.yml文件第139行加上
- --iface=ens160
再次查看顯示正確
kubectl get nodes
3. 查看命名空間kube-system的pod的狀態(tài)
kubectl get pods -n kube-system
五、Kubernetes集群測試
(一)創(chuàng)建mynginx pod
創(chuàng)建一個(gè)nginx鏡像,向Kubernetes集群提交一個(gè)Pod創(chuàng)建的請求,控制平面會(huì)根據(jù)集群的配置和調(diào)度策略,在可用的節(jié)點(diǎn)上選擇一個(gè)節(jié)點(diǎn)來運(yùn)行這個(gè)Pod。
kubectl create deployment mynginx --image=nginx
(二)暴露端口
創(chuàng)建一個(gè)Service資源,并將其關(guān)聯(lián)到mynginx Pod,將其與集群的外部網(wǎng)絡(luò)連接起來,指定Service的端口為80,并使用NodePort類型,NodePort類型會(huì)在每個(gè)節(jié)點(diǎn)上選擇一個(gè)端口,將外部流量轉(zhuǎn)發(fā)到Service的端口上。
kubectl expose deployment mynginx --port=80 --type=NodePort
(三)訪問nginx
通過瀏覽器訪問任一節(jié)點(diǎn)的IP地址和暴露的NodePort端口,可以訪問到nginx服務(wù),說明測試成功
192.168.211.136:30619
192.168.211.138:30619
六、總結(jié)
到此這篇關(guān)于kubernetes使用kubeadm創(chuàng)建集群實(shí)操教程(全) 的文章就介紹到這了,更多相關(guān)kubernetes使用kubeadm創(chuàng)建集群內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Centos搭建KMS(vlmcsd)激活服務(wù)器的步驟
Kms是微軟官方認(rèn)可的一種系統(tǒng)激活方式,這個(gè)激活方式主要用于企業(yè)批量激活計(jì)算機(jī)的windows和office,這篇文章主要介紹了Centos搭建KMS(vlmcsd)激活服務(wù)器的方法,需要的朋友可以參考下2023-07-07VScode連接遠(yuǎn)程服務(wù)器踩坑實(shí)戰(zhàn)記錄(新版離線vscode-server安裝)
本文主要介紹了如何使用VScode連接遠(yuǎn)程服務(wù)器,并對離線安裝vscode-server進(jìn)行了詳細(xì)的操作步驟說明,其中包括VScode擴(kuò)展的安裝與配置,vscode-server的離線下載,文件的解壓縮和移動(dòng),以及VScode的一些更新設(shè)置,能夠幫助讀者更好地理解和掌握VScode連接遠(yuǎn)程服務(wù)器的方法2024-10-10服務(wù)器共享文件夾設(shè)置軟件、文件共享服務(wù)器軟件和共享文件夾加密工具的選擇
這篇文章主要介紹了服務(wù)器共享文件夾設(shè)置軟件、文件共享服務(wù)器軟件和共享文件夾加密工具的選擇,需要的朋友可以參考下2015-12-12git分支管理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了git分支管理的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08ssh更改默認(rèn)端口號及實(shí)現(xiàn)免密碼遠(yuǎn)程登錄
這篇文章主要介紹了ssh更改默認(rèn)端口號及實(shí)現(xiàn)免密碼遠(yuǎn)程登錄的相關(guān)資料,需要的朋友可以參考下2017-10-10HTTP與HTTP協(xié)作的Web服務(wù)器訪問流程圖解
記得以前剛接觸網(wǎng)站的時(shí)候,很奇怪一臺(tái)服務(wù)器上可以放很多個(gè)網(wǎng)站,不用的域名就可以訪問不同的目錄,今天看起來的理所當(dāng)然以前真是不可思議,今天剛好看到了這篇文章就為大家分享一下2018-10-10git自定義_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了自定義git的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08