CentOs搭建Kubernetes集群

kubeadm

minikube 還是太“迷你”了,方便的同時也隱藏了很多細節,離真正生產環境里的計算集群有一些差距,畢竟許多需求、任務只有在多節點的大集群里才能夠遇到,相比起來,minikube 真的只能算是一個“玩具”。

Kubernetes 是很多模塊構成的,而實現核心功能的組件像 apiserver、etcd、scheduler 等本質上都是可執行文件,所以也可以采用和其他系統差不多的方式,使用 Shell 腳本或者 Ansible 等工具打包發布到服務器上。

不過 Kubernetes 里的這些組件的配置和相互關系實在是太復雜了,用 Shell、Ansible 來部署的難度很高,需要具有相當專業的運維管理知識才能配置、搭建好集群,而且即使這樣,搭建的過程也非常麻煩。

為了簡化 Kubernetes 的部署工作,讓它能夠更“接地氣”,社區里就出現了一個專門用來在集群中安裝 Kubernetes 的工具,名字就叫“kubeadm”,意思就是“Kubernetes 管理員”。

下面使用kubeadm搭建一個1master,1work ,1console的k8s集群

安裝前的準備工作

改主機名

由于 Kubernetes 使用主機名來區分集群里的節點,所以每個節點的 hostname 必須不能重名。你需要修改“/etc/hostname”這個文件,把它改成容易辨識的名字,比如 Master 節點就叫 master,Worker 節點就叫 worker:

sudo vi /etc/hostname

改 Docker 配置

安裝完成docker后需要你再對 Docker 的配置做一點修改,在“/etc/docker/daemon.json”里把 cgroup 的驅動程序改成 systemd ,然后重啟 Docker 的守護進程

cat <<EOF | sudo tee /etc/docker/daemon.json
{"registry-mirrors": ["https://5pfmrxk8.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}
EOFsudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

改網絡設置

為了讓 Kubernetes 能夠檢查、轉發網絡流量,你需要修改 iptables 的配置,啟用“br_netfilter”模塊:

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOFcat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOFsudo sysctl --system

改交換分區

需要修改“/etc/fstab”,關閉 Linux 的 swap 分區,提升 Kubernetes 的性能:

sudo swapoff -a
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab

完成之后,最好記得重啟一下系統,然后給虛擬機拍個快照做備份,避免后續的操作失誤導致重復勞動。

安裝 kubeadm

在 Master 節點和 Worker 節點上都要安裝

1、添加 kubeadm 的國內庫

官方 Google Cloud 庫可能網速慢下載不下來

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF

2、安裝、更新所需的軟件包

# 安裝所需的軟件包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 添加 Kubernetes 軟件包倉庫
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/# 更新 yum 軟件包索引
sudo yum update -y

3、安裝 kubeadm, kubelet, 和 kubectl 指定版本(1.23.3)

sudo yum install -y kubelet-1.23.3 kubeadm-1.23.3 kubectl-1.23.3

在這里插入圖片描述

4、查看版本

kubeadm version
kubectl version --client

在這里插入圖片描述

5、標記 kubelet 包不自動更新

# 安裝 yum-plugin-versionlock 插件
sudo yum install yum-plugin-versionlock
#使用命令 apt-mark hold ,鎖定這三個軟件的版本
sudo apt-mark hold kubeadm kubelet kubectl
#或者 將軟件包添加到版本鎖定列表中
sudo yum versionlock add kubeadm kubelet kubectl

安裝 Master 節點

kubeadm 的用法非常簡單,只需要一個命令 kubeadm init 就可以把組件在 Master 節點上運行起來,不過它還有很多參數用來調整集群的配置,可以用 -h 查看。

常用的 3 個參數:

  • –pod-network-cidr,設置集群里 Pod 的 IP 地址段。
  • –apiserver-advertise-address,設置 apiserver 的 IP 地址,對于多網卡服務器來說很重要(比如 VirtualBox 虛擬機就用了兩塊網卡),可以指定 apiserver 在哪個網卡上對外提供服務。
  • –kubernetes-version,指定 Kubernetes 的版本號。

1、初始化kubernetes集群

指定了 Pod 的地址段是“10.244.0.0/16”,service的地址是 10.96.0.0/12 ,apiserver 的服務地址是“自己機器的ip”,Kubernetes 的版本號是“1.23.3”

kubeadm init \
--apiserver-advertise-address=本身的虛擬機ip \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

2、建立“.kube”目錄

To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config

在本地建立一個“.kube”目錄,然后拷貝 kubectl 的配置文件,你只要原樣拷貝粘貼就行。
在這里插入圖片描述

3、保存kubeadm join 信息

kubeadm join 172.16.*.*:6443 --token fnbir9.g81u885fcu8jvbji \--discovery-token-ca-cert-hash sha256:77423363c190a976de43ebe4e06bf90e35fdf918bda7ac995392714f0895c9de 

其他節點要加入集群必須要用指令里的 token 和 ca 證書,所以這條命令務必拷貝后保存好:
在這里插入圖片描述
token默認只有24個小時,如果過期了或者忘了,可以重新獲取加入集群的命令

kubeadm token create --print-join-command

4、檢查 Kubernetes 集群的節點狀態

kubectl version
kubectl get node

在這里插入圖片描述
Master 節點的狀態是“NotReady”,這是由于還缺少網絡插件,集群的內部網絡還沒有正常運作。

安裝 Flannel 網絡插件

使用項目的“kube-flannel.yml”在 Kubernetes 里部署一下就好了。不過因為它應用了 Kubernetes 的網段地址,需要修改文件里的“net-conf.json”字段,把 Network 改成剛才 kubeadm 的參數 --pod-network-cidr 設置的地址段。
kube-flannel.yml文件地址

1、kube-flannel.yml內容

apiVersion: v1
kind: Namespace
metadata:labels:k8s-app: flannelpod-security.kubernetes.io/enforce: privilegedname: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:labels:k8s-app: flannelname: flannelnamespace: kube-flannel
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:labels:k8s-app: flannelname: flannel
rules:
- apiGroups:- ""resources:- podsverbs:- get
- apiGroups:- ""resources:- nodesverbs:- get- list- watch
- apiGroups:- ""resources:- nodes/statusverbs:- patch
- apiGroups:- networking.k8s.ioresources:- clustercidrsverbs:- list- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:labels:k8s-app: flannelname: flannel
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: flannel
subjects:
- kind: ServiceAccountname: flannelnamespace: kube-flannel
---
apiVersion: v1
data:cni-conf.json: |{"name": "cbr0","cniVersion": "0.3.1","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]}net-conf.json: |{"Network": "10.244.0.0/16","Backend": {"Type": "vxlan"}}
kind: ConfigMap
metadata:labels:app: flannelk8s-app: flanneltier: nodename: kube-flannel-cfgnamespace: kube-flannel
---
apiVersion: apps/v1
kind: DaemonSet
metadata:labels:app: flannelk8s-app: flanneltier: nodename: kube-flannel-dsnamespace: kube-flannel
spec:selector:matchLabels:app: flannelk8s-app: flanneltemplate:metadata:labels:app: flannelk8s-app: flanneltier: nodespec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/osoperator: Invalues:- linuxcontainers:- args:- --ip-masq- --kube-subnet-mgrcommand:- /opt/bin/flanneldenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: EVENT_QUEUE_DEPTHvalue: "5000"image: docker.io/flannel/flannel:v0.25.1name: kube-flannelresources:requests:cpu: 100mmemory: 50MisecurityContext:capabilities:add:- NET_ADMIN- NET_RAWprivileged: falsevolumeMounts:- mountPath: /run/flannelname: run- mountPath: /etc/kube-flannel/name: flannel-cfg- mountPath: /run/xtables.lockname: xtables-lockhostNetwork: trueinitContainers:- args:- -f- /flannel- /opt/cni/bin/flannelcommand:- cpimage: docker.io/flannel/flannel-cni-plugin:v1.4.0-flannel1name: install-cni-pluginvolumeMounts:- mountPath: /opt/cni/binname: cni-plugin- args:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistcommand:- cpimage: docker.io/flannel/flannel:v0.25.1name: install-cnivolumeMounts:- mountPath: /etc/cni/net.dname: cni- mountPath: /etc/kube-flannel/name: flannel-cfgpriorityClassName: system-node-criticalserviceAccountName: flanneltolerations:- effect: NoScheduleoperator: Existsvolumes:- hostPath:path: /run/flannelname: run- hostPath:path: /opt/cni/binname: cni-plugin- hostPath:path: /etc/cni/net.dname: cni- configMap:name: kube-flannel-cfgname: flannel-cfg- hostPath:path: /run/xtables.locktype: FileOrCreatename: xtables-lock

修改net-conf.json:
如果不是10.244.0.0/16,net-conf.json修改成“自己設置的pod網段”:

  net-conf.json: |{"Network": "自己設置的pod網段","Backend": {"Type": "vxlan"}}

2、啟動Flannel插件

#創建文件
touch kube-flannel.yml
#編輯文件,將修改過的內容copy進去
vim kube-flannel.yml
#生成插件pod
kubectl apply -f kube-flannel.yml

kube-flannel.yml默認就是“10.244.0.0/16”,可以直接使用下面命令:

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

3、查看Flannel插件是否正常運行

#查看DaemonSet是否正常運行
#如果kube-flannel-ds的副本數顯示為1/1,則表示DaemonSet正在正常運行
kubectl get daemonset -n kube-system
#檢查kube-flannel的Pod是否正常運行
#如果輸出顯示Pod的狀態為Running,則表示kube-flannel插件正在正常運行。
kubectl get pods -n kube-system -l app=flannel#檢查kube-flannel的日志以查找任何錯誤
#查看日志是否顯示任何錯誤或警告信息。
kubectl logs -n kube-system <kube-flannel-pod-name>

在這里插入圖片描述

4、查看集群節點狀態

kubectl get node

在這里插入圖片描述
Master 節點的狀態是“Ready”,表明節點網絡也工作正常了

安裝 Worker 節點

1、安裝前置操作

把準備工作配置和kubeadm安裝好

2、執行kubeadm join

只需要用之前拷貝的那條 kubeadm join 命令就可以了,用 sudo 來執行:

sudo \
kubeadm join 172.16.*.*:6443 --token fnbir9.g81u885fcu8jvbji \--discovery-token-ca-cert-hash sha256:77423363c190a976de43ebe4e06bf90e35fdf918bda7ac995392714f0895c9de 

3、查看節點狀態

kubectl get node

在這里插入圖片描述
發現還是NotReady狀態

4、復制配置文件

遠程復制

sudo scp -r root@*.*.*.*:/etc/kubernetes/admin.conf /etc/kubernetes/admin.confmkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

手動復制

mkdir -p $HOME/.kube
#把/etc/kubernetes/admin.conf文件copy到本機,再執行命令
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

再次查看節點狀態,變成ready

在這里插入圖片描述

安裝Console

可以節點本身充當Console(就是不用單獨安裝)

1、安裝kubectl

# 下載:
curl -LO https://dl.k8s.io/release/v1.23.3/bin/linux/arm64/kubectl# 安裝
sudo install kubectl /usr/local/bin/kubectl# 從master節點復制文件sudo scp stark@192.168.88.134:/etc/kubernetes/admin.conf /etc/kubernetes/admin.conf

2、 從master節點復制文件

遠程復制

sudo scp -r root@*.*.*.*:/etc/kubernetes/admin.conf /etc/kubernetes/admin.confmkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

手動復制

mkdir -p $HOME/.kube
#把/etc/kubernetes/admin.conf文件copy到本機,再執行命令
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

測試集群

在console節點是執行kubectl run ,運行 Nginx 來測試一下:

kubectl run ngx --image=nginx:alpine
kubectl get pod -o wide

會發現,pod被調度到了work節點上運行
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11484.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11484.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11484.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

spring基礎使用(案例)

基于xml使用&#xff1a; 準備&#xff1a; 1.Dao層&#xff08;接口&#xff09;&#xff1a; public interface UserDao {public void save(); } 1.1 Dao層&#xff08;實現類&#xff09;&#xff1a; public class UserDaoIim implements UserDao {Overridepublic vo…

Day53代碼隨想錄動態規劃part13:300.最長遞增子序列、674. 最長連續遞增序列、718. 最長重復子數組

Day52 動態規劃part13 300.最長遞增子序列 leetcode鏈接&#xff1a;300. 最長遞增子序列 - 力扣&#xff08;LeetCode&#xff09; 題意&#xff1a;給你一個整數數組 nums &#xff0c;找到其中最長嚴格遞增子序列的長度。子序列是由數組派生而來的序列&#xff0c;刪除&a…

23種設計模式(軟考中級 軟件設計師)

設計模式 23個設計模式&#xff0c;23個意圖 1. 設計模式概要 設計模式的核心在于提供了相關問題的解決方案&#xff0c;使得人們可以更加簡單方便的復用成功的設計和體系結構 設計模式的類別 創建型結構型行為型類工廠方法模式適配器模式&#xff08;類&#xff09;解釋器模…

物聯網五層架構分析

物聯網五層架構分析 隨著科技的迅速發展&#xff0c;物聯網&#xff08;IoT&#xff09;作為日常生活中不可或缺的一部分&#xff0c;已融入人們的生活和工作中。物聯網五層架構&#xff0c;包括感知層、網絡層、數據層、應用層和業務層&#xff0c;扮演著關鍵的角色。 感知層 …

網絡庫-libcurl介紹

1.簡介 libcurl 是一個功能強大的庫&#xff0c;支持多種協議&#xff0c;用于數據傳輸。它廣泛應用于實現網絡操作&#xff0c;如HTTP、HTTPS、FTP、FTPS、SCP、SFTP等。libcurl 提供了豐富的 API&#xff0c;可以在多種編程語言中使用。 libcurl 主要特點 支持多種協議&am…

FreeRTOS計數型信號量

目錄 一、計數型信號量簡介 二、計數型信號量相關API 1、創建計數型信號量 2、釋放計數型信號量 3、獲取計數型信號量 4、獲取計數型信號量的計數值 三、計數型信號量實操 1、實驗需求 2、CubeMX配置 3、代碼實現 一、計數型信號量簡介 ①取值只有0與1兩種狀態的信號…

基于Springboot的滴答拍攝影

基于SpringbootVue的滴答拍攝影設計與實現 開發語言&#xff1a;Java數據庫&#xff1a;MySQL技術&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系統展示 用戶登錄 首頁 攝影作品 攝影服務 攝影論壇 后臺登錄 后臺首頁 用戶管理 攝影師管理 攝影作…

YOLOv8小白中的小白安裝環境教程!沒一個字廢話,看一遍不踩坑!

文章目錄 去哪里下代碼&#xff1f;怎么下代碼&#xff1f;怎么裝環境&#xff1f;命令行界面(CLI)指令和Python腳本區別&#xff1f;附錄1 conda常用指令附錄2 git常用指令附錄3 項目代碼文件作用 去哪里下代碼&#xff1f; 下載代碼請大家直接去 YOLOv8的官方倉庫下載&#…

HTTP和HTTPS的區別和聯系

目錄 1. 簡介2. TLS 握手過程3. 常見的加密算法3.1 對稱加密算法3.2 非對稱加密算法 1. 簡介 HTTPS在HTTP的基礎上引入了一個TLS層&#xff0c;采用密文進行傳輸&#xff0c;結合對稱加密技術和非對稱加密技術來實現數據的安全性和完整性。 客戶端會生成隨機密鑰&#xff0c;…

讓 計算機 將 數學 公式 表達式 的計算過程繪制出來 【mathematical-expression(MAE)】

目錄 文章目錄 目錄介紹開始實戰引入數學表達式計算庫引入流程圖代碼生成庫開始進行生成 介紹 大家好 今天我們來分享一個新知識&#xff0c;將數學表達式的整個計算過程&#xff0c;以及計算繁多結果在 Java 中繪制出來&#xff0c;計算機中的數學表達式計算的功能很常見了&a…

react 對輸入做出反應與狀態

React 提供了一種操作 UI 的聲明性方式。您無需直接操作 UI 的各個部分&#xff0c;而是描述組件可能處于的不同狀態&#xff0c;并在它們之間切換以響應用戶輸入。 聲明式 UI 與命令式 UI 的比較 在設計 UI 交互時&#xff0c;可能會考慮 UI 如何響應用戶操作而更改。考慮一…

[C語言]總覽

目錄 1. 框架、默認數據類型 2. 分支結構 &#xff08;1&#xff09;. if ... else ... &#xff08;2&#xff09;. switch ... case ... 3. 循環結構 &#xff08;1&#xff09;. while &#xff08;2&#xff09;. for &#xff08;3&#xff09;. do ... while 4. 函…

區塊鏈的跨鏈交互:從學校間交流看跨鏈技術

區塊鏈是一種去中心化的分布式賬本技術&#xff0c;它通過加密學和共識機制來確保數據的安全性和不可篡改性。每個區塊鏈就像一所獨立的學校&#xff0c;有自己的制度、學生和重點專業。它們各自運行&#xff0c;有時在同一領域展開不同的活動。隨著區塊鏈技術的不斷發展&#…

【組合博弈】Outcome Classes

Outcome Classes 一個游戲 G G G的outcome函數代表這個游戲最終的結果&#xff0c;就是說這個游戲最后的贏家是誰。outcome函數是一個從游戲 G G G映射到四個結果的函數&#xff0c;四個結果分別是 L , R , P , N L, R, P, N L,R,P,N。意義如下表&#xff1a; ClassNameDefin…

學習筆記:Adaptive Platform(AP)適配到RTOS

一、背景 1、AP版本 Adaptive Platform AUTOSAR R20-11版本標準支持C14。CM模塊支持DDS、SOME/IP協議 2、RTOS RTOS-A核&#xff0c;當前完全支持POSIX PSE51、POSIX PSE52接口&#xff0c;POSIX PSE53部分支持&#xff0c;POSIX PSE54基本不支持。詳細接口參考&#xff1a…

第十四天:PHP 開發,輸入輸出類留言板訪問 IPUA 頭來源

1.PHP-全局變量$_SERVER 2.MYSQL-插入語法INSERT 3.輸入輸出-XSS&反射&存儲 4.安全問題-XSS跨站&CSRF等 1.輸入輸出類安全問題 反射性xss 這個先準備一個數據&#xff0c;隨便弄一個表名字&#xff0c;在隨便弄一點數據存入即可 作為連接的數據庫&#xff0c…

排序-歸并排序(merge sort)

歸并排序&#xff08;Merge Sort&#xff09;是一種分而治之的算法&#xff0c;它將原始數組分成越來越小的子數組&#xff0c;直到每個子數組只有一個元素&#xff0c;然后將這些子數組兩兩合并&#xff0c;過程中保持排序狀態&#xff0c;最終合并成一個完全有序的數組。歸并…

《一》Word文字編輯軟件---架構設計分析

1&#xff0c;簡單介紹 今天&#xff0c;我們來模擬offic軟件中的word文檔&#xff0c;運行如圖&#xff1a; 運行程序后會出現主界面&#xff0c;頂端的菜單欄包括“文件”“編輯”“格式”“窗口”和“幫助五個主菜單。 菜單欄下面是工具欄&#xff0c;包含了系統常用的功能按…

如何判斷海外住宅ip的好壞?

在海外IP代理中&#xff0c;住宅IP屬于相對較好的資源&#xff0c;無論是用于工作、學習、還是娛樂&#xff0c;都能得到較好的使用效果。作為用戶&#xff0c;該如何判斷海外住宅IP的好壞呢&#xff1f; 穩定性與可靠性&#xff1a;海外住宅IP相比動態IP地址&#xff0c;通常具…

Java全局異常處理,@ControllerAdvice異常攔截原理解析【簡單易懂】

https://www.bilibili.com/video/BV1sS411c7Mo 文章目錄 一、全局異常處理器的類型1-1、實現方式一1-2、實現方式二 二、全局異常攔截點2-1、入口2-2、全局異常攔截器是如何注入到 DispatcherServlet 的 三、ControllerAdvice 如何解析、執行3-1、解析3-2、執行 四、其它4-1、設…