做國際網(wǎng)站的上海高端網(wǎng)站公司百度官網(wǎng)下載安裝
k8s概述
Kubernetes 是一個可移植、可擴展的開源平臺,用于管理容器化的工作負載和服務,可促進聲明式配置和自動化。 Kubernetes 擁有一個龐大且快速增長的生態(tài),其服務、支持和工具的使用范圍相當廣泛。
Kubernetes?這個名字源于希臘語,意為“舵手”或“飛行員”。k8s 這個縮寫是因為 k 和 s 之間有八個字符的關系。 Google 在 2014 年開源了 Kubernetes 項目。 Kubernetes 建立在?Google 大規(guī)模運行生產(chǎn)工作負載十幾年經(jīng)驗的基礎上, 結合了社區(qū)中最優(yōu)秀的想法和實踐。
Kubernetes 架構
K8s安裝步驟
1、環(huán)境要求及準備
- 一臺或多臺運行兼容 deb/rpm 的 Linux 操作系統(tǒng)的計算機;例如:Ubuntu 或 CentOS。
- 每臺機器 2 GB 以上的內(nèi)存,內(nèi)存不足時應用會受限制。
- 用作控制平面節(jié)點的計算機上至少有 2 個 CPU。
- 集群中所有計算機之間具有完全的網(wǎng)絡連接。你可以使用公共網(wǎng)絡或專用網(wǎng)絡。
?準備三臺虛擬機
節(jié)點IP | 節(jié)點角色 |
192.168.42.138 | k8s-master |
192.168.42.139 | k8s-node01 |
192.168.42.140 | k8s-node02 |
關閉防火墻firewalld
systemctl stop firewalld
systemctl disable firewalld
關閉selinux
setenforce 0? ?#臨時關閉
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config? ?#永久關閉
時間進行同步
yum install ntpdate -y?
ntpdate cn.pool.ntp.org (如果服務器時間不一致才做)
關閉swap
swapoff -a? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 臨時
sed -i 's/.swap./#&/' /etc/fstab? ? ?#永久注釋swap開機掛載行
三臺節(jié)點配置主機名解析
cat >> /etc/hosts << EOF
192.168.42.138 k8s-master
192.168.42.139 k8s-node01
192.168.42.140 k8s-node02
EOF
設置主機名
主機名根據(jù)自己的主機去使用這條命令,注意要跟上面的主機名解析保持一致
hostnamectl set-hostname xxxx
?轉發(fā) IPv4 并讓 iptables 看到橋接流量
執(zhí)行下述指令:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOFsudo modprobe overlay
sudo modprobe br_netfilter# 設置所需的 sysctl 參數(shù),參數(shù)在重新啟動后保持不變
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 參數(shù)而不重新啟動
sudo sysctl --system
通過運行以下指令確認?br_netfilter
?和?overlay
?模塊被加載:
lsmod | grep br_netfilter
lsmod | grep overlay
通過運行以下指令確認?net.bridge.bridge-nf-call-iptables
、net.bridge.bridge-nf-call-ip6tables
?和?net.ipv4.ip_forward
?系統(tǒng)變量在你的?sysctl
?配置中被設置為 1:
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
2、選擇容器運行時
容器運行時是負責運行容器的軟件。
在集群內(nèi)每個節(jié)點上都需要安裝一個?容器運行時?以使 Pod 可以運行在上面。
常見的容器運行時有:
- containerd
- CRI-O
- Docker Engine
- Mirantis Container Runtime
?說明:
v1.24 之前的 Kubernetes 版本直接集成了 Docker Engine 的一個組件,名為?dockershim。 這種特殊的直接整合不再是 Kubernetes 的一部分 (這次刪除被作為 v1.20 發(fā)行版本的一部分宣布)。
v1.20版本之后,docker已經(jīng)從k8s中剝離出來了,但是官方依然支持,只是不再是必須安裝的組件。
下面的表格包括被支持的操作系統(tǒng)的已知端點。
運行時 | Unix 域套接字 |
---|---|
containerd | unix:///var/run/containerd/containerd.sock |
CRI-O | unix:///var/run/crio/crio.sock |
Docker Engine(使用 cri-dockerd) | unix:///var/run/cri-dockerd.sock |
從kubernetes 1.24開始,dockershim已經(jīng)從kubelet中移除,但因為歷史問題docker卻不支持kubernetes主推的CRI(容器運行時接口)標準,所以docker不能再作為kubernetes的容器運行時了,即從kubernetesv1.24開始不再使用docker了。k8s已經(jīng)將容器運行時默認改為containerd。
3、安裝 kubeadm、kubelet 和 kubectl
-
kubeadm
:用來初始化集群的指令。 -
kubelet
:在集群中的每個節(jié)點上用來啟動 Pod 和容器等。 -
kubectl
:用來與集群通信的命令行工具。
注意:三臺節(jié)點都安裝
3.1?添加 Kubernetes 的?yum
?倉庫
# 此操作會覆蓋 /etc/yum.repos.d/kubernetes.repo 中現(xiàn)存的所有配置
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
3.2 安裝 kubelet、kubeadm 和 kubectl,并啟用 kubelet 以確保它在啟動時自動啟動
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
4、使用 kubeadm 創(chuàng)建集群
4.1 初始化控制平面節(jié)點
控制平面節(jié)點是運行控制平面組件的機器, 包括?etcd(集群數(shù)據(jù)庫) 和?API 服務器?(命令行工具?kubectl?與之通信)。
要初始化控制平面節(jié)點,請運行:
kubeadm init <args>
?實際命令:
注意:這個初始化命令只在k8s-master節(jié)點執(zhí)行
kubeadm init --apiserver-advertise-address=192.168.42.138 --control-plane-endpoint=k8s-master --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version v1.29.2 --service-cidr=10.96.0.0/16 --pod-network-cidr=10.244.0.0/16
參數(shù)解釋:
--apiserver-advertise-address
?可用于為控制平面節(jié)點的 API 服務器設置廣播地址
--control-plane-endpoint
?可用于為所有控制平面節(jié)點設置共享端點,允許 IP 地址和可以映射到 IP 地址的 DNS 名稱。
--image-repository?聲明使用阿里云官方鏡像
--kubernetes-version?指定k8s安裝的版本,這里我安裝最新的?
--service-cidr 集群內(nèi)部虛擬網(wǎng)絡,Pod統(tǒng)一訪問入口
--pod-network-cidr Pod網(wǎng)絡,與下面部署的CNI網(wǎng)絡組件yaml中保持一致
?初始化過程
kubeadm init
?首先運行一系列預檢查以確保機器為運行 Kubernetes 準備就緒。 這些預檢查會顯示警告并在錯誤時退出。然后?kubeadm init
?下載并安裝集群控制平面組件。這可能會需要幾分鐘。
?完成之后你應該看到:
?要使非 root 用戶可以運行 kubectl,請運行以下命令, 它們也是?kubeadm init
?輸出的一部分:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
?或者,如果你是?root
?用戶,則可以運行:
export KUBECONFIG=/etc/kubernetes/admin.conf
記錄?kubeadm init
?輸出的?kubeadm join
?命令。 你需要此命令將節(jié)點加入集群。
4.2 將節(jié)點加入集群
在其他從節(jié)點上執(zhí)行如下命令,這個命令的token以你的虛擬機kubeadm init為準
139執(zhí)行:
?140執(zhí)行:
?4.3?驗證安裝結果
提示使用kubectl get nodes在控制節(jié)點查看從節(jié)點的加入情況,當然其他節(jié)點也可以執(zhí)行
在139執(zhí)行命令報錯如下:
?出現(xiàn)這個問題的原因是kubectl命令需要使用kubernetes-admin來運行
解決辦法:
1.將主節(jié)點(master節(jié)點)中的【/etc/kubernetes/admin.conf】文件拷貝到從節(jié)點相同目錄下:
2.從節(jié)點配置環(huán)境變量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
3.立即生效
source ~/.bash_profile
兩個node執(zhí)行后則再指令kubectl get nodes命令則都可以返回
注意:以前老版本的Roles字段顯示master,新版本已經(jīng)被control-plane替代
?
5、安裝 Pod 網(wǎng)絡附加組件
[root@k8s-master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
5、驗證安裝結果
出現(xiàn)上述結果,說明我們已經(jīng)安裝成功!
也可通過查看kube-system名字空間下的pod資源判斷
當所有組件狀態(tài)都是running時才能確保k8s正常使用。
過程中報錯
1、CNI網(wǎng)絡插件未初始化
"Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized"
?解決方案:
三臺節(jié)點都重啟kubelet進程后再查看node狀態(tài)
2、無法從API端點獲取集群ConfigMap信息
Unable to fetch the kubeadm-config ConfigMap from cluster: failed to get config map: Get "https://master:6443/api/v1/namespaces/kube-system/configmaps/kubeadm-config?timeout=10s": dial tcp: lookup master on 223.5.5.5:53: no such host
這個報錯是由于我之前把kubeadm init命令那里的--control-plane-endpoint=master,我實際上是k8s-master,導致主機名解析失敗,找不到https://master:6443/api/v1/namespaces/kube-system/configmaps/kubeadm-config?timeout=10s這個api端點,那必然會報錯,修改正確后,使用kubeadm reset重置,然后重新Init就好了
3、拉取 registry.k8s.io/pause:3.6 鏡像失敗 導致sandbox 創(chuàng)建不了而報錯?
報錯:detected that the sandbox image "registry.k8s.io/pause:3.6" of the container runtime is inconsistent with that used by kubeadm.? It is recommended that using "registry.aliyuncs.com/google_containers/pause:3.9" as the CRI sandbox image.
?解決方案:
### 三臺節(jié)點執(zhí)行如下命令 生成 containerd 的默認配置文件
containerd config default > /etc/containerd/config.toml
### 查看 sandbox 的默認鏡像倉庫在文件中的第幾行
cat /etc/containerd/config.toml | grep -n "sandbox_image"
### 使用 vim 編輯器 定位到 sandbox_image,將 倉庫地址修改成 registry.aliyuncs.com/google_containers/pause:3.9/pause:3.6
vim /etc/containerd/config.toml
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
### 重啟 containerd 服務
systemctl daemon-reload
systemctl restart containerd.service
修改完成后記得重啟containerd服務
4、k8s初始化int時出現(xiàn)Initial timeout of 40s passed
可以先使用以下命令查看k8s的啟動日志:
systemctl status kubelet
或使用以下命令查看最近的k8s日志:
journalctl -xeu kubelet
具體參考:k8s初始化int時出現(xiàn)Initial timeout of 40s passed | 思維網(wǎng)絡|站長博客|陳配鋒