【雲原生 | 從零開始學 Kubernetes】二、使用 kubeadm 搭建 K8S 集羣
安裝要求
-
兩台或者多台機器,為 centos7
-
2GB 及以上內存,2 個 CPU 及以上,硬盤 30G
-
集羣中所有機器之間網絡互通
-
可以訪問外網
-
禁止 swap 分區
kubeadm 是官方社區推出的一個用於快速部署 kubernetes 集羣的工具。
準備環境
初始化
首先,我們要在三台機子上做一些操作。關閉防火牆,selinux,swap,設置主機名,ip 解析,時間同步。
# 關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
# 關閉selinux
# 永久關閉
sed -i 's/enforcing/disabled/' /etc/selinux/config
# 臨時關閉
setenforce 0
# 關閉swap
# 臨時
swapoff -a
# 永久關閉
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 根據規劃設置主機名【master節點上操作】
hostnamectl set-hostname k8smaster
# 根據規劃設置主機名【node1節點操作】
hostnamectl set-hostname k8snode1
# 根據規劃設置主機名【node2節點操作】
hostnamectl set-hostname k8snode2
# 在master添加hosts
vim /etc/hosts
192.168.11.139 k8smaster
192.168.11.140 k8snode1
192.168.11.141 k8snode2
# 將橋接的IPv4流量傳遞到iptables的鏈
vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
# 生效
sysctl --system
# 時間同步
yum install ntpdate -y
ntpdate time.windows.com
複製代碼
安裝 Docker/kubeadm/kubelet
首先配置一下 Docker 的阿里 yum 源
vim /etc/yum.repos.d/docker.repo
[docker-ce-edge]
name=Docker CE Edge - \$basearch
baseurl=http://mirrors.aliyun.com/docker-ce/linux/centos/7/\$basearch/edge
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/docker-ce/linux/centos/gpg
複製代碼
然後 yum 方式安裝 docker
# yum安裝
yum -y install docker-ce
# 查看docker版本
docker --version
# 啟動docker
systemctl enable docker
systemctl start docker
複製代碼
配置 docker 的鏡像源
vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://b9pmyelo.mirror.aliyuncs.com"]
}
複製代碼
然後重啟 docker
添加 kubernetes 軟件源 三台機子
然後我們還需要配置一下 yum 的 k8s 軟件源
<code data-type="codeline">vim /etc/yum.repos.d/kubernetes.repo</code><code data-type="codeline">[kubernetes]</code><code data-type="codeline">name=Kubernetes</code><code data-type="codeline">baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64</code><code data-type="codeline">enabled=1</code><code data-type="codeline">gpgcheck=0</code><code data-type="codeline">repo_gpgcheck=0</code><code data-type="codeline">gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg</code>
複製代碼
安裝 kubeadm,kubelet 和 kubectl
由於版本更新頻繁,這裏指定版本號部署
# 安裝kubelet、kubeadm、kubectl,同時指定版本
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 設置開機啟動
systemctl enable kubelet
複製代碼
部署 Kubernetes Master
在 192.168.177.139 執行,也就是 master 節點
kubeadm init \
--apiserver-advertise-address=192.168.11.139 \ # 當前主機ip
--image-repository registry.aliyuncs.com/google_containers \ # 鏡像
--kubernetes-version v1.18.0 \ # 版本
--service-cidr=10.96.0.0/12 \ # 這個參數後的IP地址直接就套用10.96.0.0/12 ,以後安裝時也套用即可,不要更改
--pod-network-cidr=10.244.0.0/16 #k8s內部的pod節點之間網絡可以使用的IP段,不能和service-cidr寫一樣,如果不知道怎麼配,就先用這個10.244.0.0/16
複製代碼
由於默認拉取鏡像地址 k8s.gcr.io 國內無法訪問,這裏指定阿里雲鏡像倉庫地址,我們 docker images 命令即可查看已經拉取的鏡像。
當我們出現下面的情況時,表示 kubernetes 的鏡像已經安裝成功 然後用裏面提示的命令
![](http://mdimg.wxwenku.com/getimg/356ed03bdc643f9448b3f6485edc229bb514aa53c59b91f667ac4501bf0593411d9c1ca378a911222384ec5866df3cb0.jpg)
使用 kubectl 工具
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
複製代碼
執行完成後,我們使用下面命令,查看我們正在運行的節點
kubectl get nodes
複製代碼
能夠看到,目前有一個 master 節點已經運行了,但是還處於未準備狀態
下面我們還需要在 Node 節點執行其它的命令,將 node1 和 node2 加入到我們的 master 節點上
加入 Kubernetes Node
下面我們需要到 node1 和 node2 服務器,執行下面的代碼向集羣添加新節點
執行在 kubeadm init 輸出的 kubeadm join 命令:
注意,以下的命令是在 master 初始化完成後,每個人的都不一樣!!!需要複製自己生成的
kubeadm join 192.168.11.139:6443 --token oheovn.apns356uiesu58pa \
--discovery-token-ca-cert-hash sha256:fff629d1ea3a0f082a23a94965adbcc30159b3b9fc50743300f7d75b9653a4be
複製代碼
默認 token 有效期為 24 小時,當過期之後,該 token 就不可用了。這時就需要重新創建 token,操作如下:
kubeadm token create --print-join-command
複製代碼
當我們把兩個節點都加入進來後,我們就可以去 Master 節點 執行下面命令查看情況
kubectl get node
複製代碼
部署 CNI 網絡插件 master
上面的狀態還是 NotReady,下面我們需要網絡插件,來進行聯網訪問
# 下載網絡插件配置
wget http://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
複製代碼
默認鏡像地址無法訪問,sed 命令修改為 docker hub 鏡像倉庫。
# 添加
kubectl apply -f http://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 查看狀態 【kube-system是k8s中的最小單元】
kubectl get pods -n kube-system
複製代碼
運行完成後,我們查看狀態可以發現,已經變成了 Ready 狀態了
![](http://mdimg.wxwenku.com/getimg/356ed03bdc643f9448b3f6485edc229b3dbc926c6a11611b64166697c6c9725b51ac2fa642e6377d239b2ae4aafdc20b.jpg)
如果上述操作完成後,還存在某個節點處於 NotReady 狀態,可以在 Master 將該節點刪除
# master節點將該節點刪除
#20210223 yan 查閲資料添加###kubectl drain k8snode1 --delete-local-data --force --ignore-daemonsets
kubectl delete node k8snode1
# 然後到k8snode1節點進行重置
kubeadm reset
# 重置完後在加入
kubeadm join 192.168.11.139:6443 --token oheovn.apns356uiesu58pa \
--discovery-token-ca-cert-hash sha256:fff629d1ea3a0f082a23a94965adbcc30159b3b9fc50743300f7d75b9653a4be
複製代碼
測試 kubernetes 集羣
我們都知道 K8S 是容器化技術,它可以聯網去下載鏡像,用容器的方式進行啟動
在 Kubernetes 集羣中創建一個 pod,驗證是否正常運行:
# 下載nginx 【會聯網拉取nginx鏡像】
kubectl create deployment nginx --image=nginx
# 查看狀態
kubectl get pod
複製代碼
如果我們出現 Running 狀態的時候,表示已經成功運行了
![](http://mdimg.wxwenku.com/getimg/6b990ce30fa9193e296dd37902816f4bd0a60e7a1409b6646e54dd3c5d42331ccd7fea0e5085b8852d8fd785fadb4143.jpg)
下面我們就需要將端口暴露出去,讓其它外界能夠訪問
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看一下對外的端口
kubectl get pod,svc
複製代碼
能夠看到,我們已經成功暴露了 80 端口 到 31865 了
![](http://mdimg.wxwenku.com/getimg/ccdf080c7af7e8a10e9b88444af98393becf009cae9add18186ff9c9227f7068dc98d6debd3ed67f60578f80865afba5.jpg)
我們到我們的宿主機瀏覽器上,訪問如下地址
http://192.168.177.130:30529/
複製代碼
發現我們的 nginx 已經成功啟動了
![](http://mdimg.wxwenku.com/getimg/356ed03bdc643f9448b3f6485edc229b67c1a88b61357f78cb64efd548e782597b6c0a9d2eef6bd5f867feab135ffe2e.jpg)
到這裏為止,我們就搭建了一個單 master 的 k8s 集羣
寫在最後
創作不易,如果覺得內容對你有幫助,麻煩給個三連關注支持一下我!如果有錯誤,請在評論區指出,我會及時更改!
目前正在更新的系列:從零開始學 k8s
感謝各位的觀看,文章摻雜個人理解,如有錯誤請聯繫我指出~
- 那些 Go 語言發展歷史上的重大決策
- 從趨勢到挑戰,一站式解讀操作系統運維和可觀測性
- 百萬級 Topic,騰訊雲的 Apache Pulsar 穩定性實踐
- Apache Doris 在思必馳的應用優化實踐:海量語音通話數據下,實時、離線一體的數倉架構設計實踐
- 愛數正式開源認知智能開發框架 KWeaver
- 運維智能化的三大關鍵技術
- “抄我的還‘反捅’我一刀”,Gary Marcus 發文駁斥圖靈獎得主 Yann LeCun
- 當出海成為必選項,企業如何構建全場景全生態技術底座?
- 數智底座必備能力三:快速構建創新應用
- Docker 多階段構建實戰 (multi-stage builds)
- 工作筆記之 SELECT 語句在 SAP ABAP 中的用法總結(上)
- 經久不衰的設計定律是不要讓我思考的設計
- 不要指望下一個像 GPT 這樣的大型語言模型會民主化
- Java 近期新聞:Helidon Níma、Spring Framework、MicroProfile、MicroStream、Kotlin 和 Piranha
- 一文入門 jQuery
- C 學習 ---__libc_open 函數的原理
- 監控系統工作原理
- 甲骨文新微服務框架 Helidon Níma:使用虛擬線程實現高性能
- 【雲原生 | 從零開始學 Kubernetes】二、使用 kubeadm 搭建 K8S 集羣
- Elasticsearch 聚合學習之四:結果排序