?
博主介紹:?全網粉絲5W+,全棧開發工程師,從事多年軟件開發,在大廠呆過。持有軟件中級、六級等證書。可提供微服務項目搭建與畢業項目實戰,博主也曾寫過優秀論文,查重率極低,在這方面有豐富的經驗?
博主作品:《Java項目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+MySQL+Vue等前后端分離項目,可以在左邊的分類專欄找到更多項目。《Uniapp項目案例》有幾個有uniapp教程,企業實戰開發。《微服務實戰》專欄是本人的實戰經驗總結,《Spring家族及微服務系列》專注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源碼解讀、熱門面試題、架構設計等。除此之外還有不少文章等你來細細品味,更多驚喜等著你哦
🍅uniapp微信小程序🍅面試題軟考題免費使用,還可以使用微信支付,掃碼加群。由于維護成本問題得不到解決,可能將停止線上維護。
🍅文末獲取聯系🍅精彩專欄推薦訂閱👇🏻👇🏻 不然下次找不到喲
Java項目案例《100套》
https://blog.csdn.net/qq_57756904/category_12173599.html
uniapp小程序《100套》https://blog.csdn.net/qq_57756904/category_12173599.html
有需求代碼永遠寫不完,而方法才是破解之道,抖音有實戰視頻課程,某馬某千等培訓都是2萬左右,甚至廣東有本科院校單單一年就得3萬4年就12萬學費,而且還沒有包括吃飯的錢。所以很劃算了。另外博客左側有源碼閱讀專欄,對于求職有很大幫助,當然對于工作也是有指導意義等。在大城市求職,你面試來回一趟多多少少都在12塊左右,而且一般不會一次性就通過,還得面試幾家。而如果你對源碼以及微服務等有深度認識,這無疑給你的面試添磚加瓦更上一層樓。
最后再送一句:最好是學會了,而不是學廢了!!
目錄
Kubernetes介紹
Kubernetes具備的功能
Kubernetes集群角色
Master管理節點組件
Node工作節點組件
非必須的集群插件
Kubernetes集群類型
Kubernetes集群規劃
集群前期環境準備(所有節點執行)
禁用 SELinux
關閉防火墻
禁用 swap
開啟Bridge網橋過濾
安裝Containerd軟件包
安裝 Kubernetes 組件(所有節點執行)
Master 節點初始化
在master節點查看集群所需鏡像文件
使用阿里云的源拉取鏡像
改tag
使用阿里云鏡像
執行初始化命令(使用阿里云鏡像)
初始化成功并按照如圖所示執行相應命令
根據提示將node節點加入集群(在node1和node2執行)
?編輯
加入成功后在master節點驗證
Kubernetes介紹
kubernetes(k8s)是2014年由Google公司基于Go語言編寫的一款開源的容器集群編排系統,用于自動化容器的部署、擴縮容和管理;
kubernetes(k8s)是基于Google內部的Borg系統的特征開發的一個版本,集成了Borg系統大部分優勢;
官方地址:Kubernetes
代碼托管平臺:https://github.com/Kubernetes
Kubernetes具備的功能
- 自我修復:k8s可以監控容器的運行狀況,并在發現容器出現異常時自動重啟故障實例;
- 彈性伸縮:k8s可以根據資源的使用情況自動地調整容器的副本數。例如,在高峰時段,k8s可以自動增加容器的副本數以應對更多的流量;而在低峰時段,k8s可以減少應用的副本數,節省資源;
- 資源限額:k8s允許指定每個容器所需的CPU和內存資源,能夠更好的管理容器的資源使用量;
- 滾動升級:k8s可以在不中斷服務的情況下滾動升級應用版本,確保在整個過程中仍有足夠的實例在提供服務;
- 負載均衡:k8s可以根據應用的負載情況自動分配流量,確保各個實例之間的負載均衡,避免某些實例過載導致的性能下降;
- 服務發現:k8s可以自動發現應用的實例,并為它們分配一個統一的訪問地址。這樣,用戶只需要知道這個統一的地址,就可以訪問到應用的任意實例,而無需關心具體的實例信息;
- 存儲管理:k8s可以自動管理應用的存儲資源,為應用提供持久化的數據存儲。這樣,在應用實例發生變化時,用戶數據仍能保持一致,確保數據的持久性;
- 密鑰與配置管理:Kubernetes 允許你存儲和管理敏感信息,例如:密碼、令牌、證書、ssh密鑰等信息進行統一管理,并共享給多個容器復用;
Kubernetes集群角色
k8s集群需要建?在多個節點上,將多個節點組建成一個集群,然后進?統?管理,但是在k8s集群內部,這些節點?被劃分成了兩類??:
一類??為管理節點,叫Master,負責集群的所有管理工作;
?類??為?作節點,叫Node,負責運行集群中所有用戶的容器應用 ;
Master管理節點組件
API Server:作為集群的管理入口,處理外部和內部通信,接收用戶請求并處理集群內部組件之間的通信;
Scheduler:作為集群資源調度計算,根據調度策略,負責將待部署的 Pods 分配到合適的 Node 節點上;
Controller Manager:管理集群中的各種控制器,例如 Deployment、ReplicaSet、DaemonSet等,管理集群中的各種資源;
etcd:作為集群的數據存儲,保存集群的配置信息和狀態信息;
Node工作節點組件
Kubelet:負責與 Master 節點通信,并根據 Master 節點的調度決策來創建、更新和刪除 Pod,同時維護 Node 節點上的容器狀態;
容器運行時(如 Docker、containerd 等):負責運行和管理容器,提供容器生命周期管理功能。例如:創建、更新、刪除容器等;
Kube-proxy:負責為集群內的服務實現網絡代理和負載均衡,確保服務的訪問性;
非必須的集群插件
DNS服務:嚴格意義上的必須插件,在k8s中,很多功能都需要用到DNS服務,例如:服務發現、負載均衡、有狀態應用的訪問等;
Dashboard: 是k8s集群的Web管理界面;
資源監控:例如metrics-server監視器,用于監控集群中資源利用率;
Kubernetes集群類型
一主多從集群:由一臺Master管理節點和多臺Node工作節點組成,生產環境下Master節點存在單點故障的風險,適合學習和測試環境使用;
多主多從集群:由多臺Master管理節點和多Node工作節點組成,安全性高,適合生產環境使用;
Kubernetes集群規劃
給這些虛擬機操作,關閉防火墻和selinux,進行時間同步。 ?
主機 | IP地址 | 角色 | 操作系統 | 硬件配置 |
master | 192.168.252.128 | 管理節點 | Rocky Linux9.6 | 2CPU/2G內存/20G |
node1 | 192.168.252.129 | 工作節點 | Rocky Linux9.6 | 1CPU/2G內存/20G |
node2 | 192.168.252.130 | 工作節點 | Rocky Linux9.6 | 1CPU/2G內存/20G |
集群前期環境準備(所有節點執行)
按照集群規劃修改每個節點主機名。hostnamectl執行可以查看是否設置成功,名稱是否對。
# 對192.168.252.128操作
hostnamectl set-hostname master# 對192.168.252.129操作
hostnamectl set-hostname node1# 對192.168.252.130操作
hostnamectl set-hostname node2
配置本地域名解析,配置集群之間本地解析,集群在初始化時需要能夠解析主機名,三臺都要配
# 編輯 hosts 文件
sudo vi /etc/hosts# 添加以下內容(替換為實際IP)
192.168.252.128 k8s-master
192.168.252.129 k8s-node1
192.168.252.130 k8s-node2
禁用 SELinux
sudo setenforce 0sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
關閉防火墻
sudo systemctl stop firewalldsudo systemctl disable firewalld
禁用 swap
sudo swapoff -asudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
開啟Bridge網橋過濾
?
bridge(橋接) 是 Linux 系統中的一種虛擬網絡設備,它充當一個虛擬的交換機,為集群內的容器提供網絡通信功能,容器就可以通過這個 bridge 與其他容器或外部網絡通信了。
# 配置內核參數
cat <<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
EOFsudo sysctl --system
?參數解釋:
net.bridge.bridge-nf-call-ip6tables = 1 //對網橋上的IPv6數據包通過iptables處理
net.bridge.bridge-nf-call-iptables = 1 //對網橋上的IPv4數據包通過iptables處理
net.ipv4.ip_forward = 1 //開啟IPv4路由轉發,來實現集群中的容器與外部網絡的通信
由于開啟bridge功能,需要加載br_netfilter模塊來允許在bridge設備上的數據包經過iptables防火墻處理
modprobe br_netfilter && lsmod | grep br_netfilter
命令解釋:
modprobe //命令可以加載內核模塊
br_netfilter //模塊模塊允許在bridge設備上的數據包經過iptables防火墻處理
加載配置文件,使上述配置生效
sysctl -p /etc/sysctl.d/k8s.conf
安裝Containerd軟件包
添加阿里云docker-ce倉庫(containerd軟件包在docker倉庫)
dnf install -y yum-utilsyum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安裝containerd軟件包
dnf install -y containerd.io#或者帶上版本
dnf install -y containerd.io-1.6.20-3.1.el9.x86_64
生成containerd配置文件
sudo mkdir -p /etc/containerdcontainerd config default | sudo tee /etc/containerd/config.toml
啟用Cgroup用于限制進程的資源使用量,如CPU、內存資源?
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
替換文件中pause鏡像的下載地址為阿里云倉庫,3.8是自己的版本在config.toml查找
sed -i 's#sandbox_image = "registry.k8s.io/pause:3.8"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#' /etc/containerd/config.toml
?為Containerd配置鏡像加速器,在文件中找到[plugins."io.containerd.grpc.v1.cri".registry.mirrors],在下方添加阿里云鏡像加速器
vi /etc/containerd/config.toml
#...大約帶153行左右[plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]endpoint = ["https://docker.rainbond.cc", "https://do.nark.eu.org", "https://dc.j8.work", "https://pilvpemn.mirror.aliyuncs.com", "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://docker.mirrors.ustc.edu.cn", "https://docker.nju.edu.cn"]
指定contaienrd接口文件地址,在k8s環境中,kubelet通過 containerd.sock 文件與containerd進行通信
cat <<EOF | tee /etc/crictl.yaml
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
EOF
參數解釋:
runtime-endpoint //指定了容器運行時的sock文件位置
image-endpoint //指定了容器鏡像使用的sock文件位置
timeout //容器運行時或容器鏡像服務之間的通信超時時間
debug //指定了crictl工具的調試模式,false表示調試模式未啟用,true則會在輸出中包含更多的調試日志信息,有助于故障排除和問題調試
啟動containerd并設置隨機自啟?
systemctl enable containerd --now
安裝 Kubernetes 組件(所有節點執行)
kubernetes集群有多種部署方式,目前常用的部署方式有如下兩種:
kubeadm部署方式:kubeadm是一個快速搭建kubernetes的集群工具;
二進制包部署方式:從官網下載每個組件的二進制包,依次去安裝,部署麻煩;
其他方式:通過一些開源的工具搭建,例如:sealos;
配置kubeadm倉庫,本實驗使用阿里云YUM源
cat > /etc/yum.repos.d/k8s.repo <<EOF
[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
EOF
安裝以下軟件包:
kubeadm:用于初始化集群,并配置集群所需的組件并生成對應的安全證書和令牌;
kubelet:負責與 Master 節點通信,并根據 Master 節點的調度決策來創建、更新和刪除 Pod,同時維護 Node 節點上的容器狀態;
kubectl:用于管理k8集群的一個命令行工具;
yum -y install kubeadm-1.28.2 kubelet-1.28.2 kubectl-1.28.2
kubelet啟用Cgroup控制組,用于限制進程的資源使用量,如CPU、內存
tee > /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF
設置kubelet開機自啟動即可,集群初始化后自動啟動
systemctl enable kubelet
Master 節點初始化
在master節點查看集群所需鏡像文件
[root@master01 ~]# kubeadm config images list
W0813 20:45:03.587714 ? ?2189 version.go:104] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get "https://cdn.dl.k8s.io/release/stable-1.txt": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
W0813 20:45:03.587821 ? ?2189 version.go:105] falling back to the local client version: v1.28.2
registry.k8s.io/kube-apiserver:v1.28.15
registry.k8s.io/kube-controller-manager:v1.28.15
registry.k8s.io/kube-scheduler:v1.28.15
registry.k8s.io/kube-proxy:v1.28.15
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.9-0
registry.k8s.io/coredns/coredns:v1.10.1
使用阿里云的源拉取鏡像
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.28.15
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.28.15
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.28.15
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.28.15
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.9-0
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.10.1
改tag
ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.28.15 registry.k8s.io/kube-apiserver:v1.28.15ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.28.15 registry.k8s.io/kube-controller-manager:v1.28.15ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.28.15 registry.k8s.io/kube-scheduler:v1.28.15ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.28.15 registry.k8s.io/kube-proxy:v1.28.15ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 registry.k8s.io/pause:3.9ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.9-0 registry.k8s.io/etcd:3.5.9-0ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.10.1 registry.k8s.io/coredns/coredns:v1.10.1
使用阿里云鏡像
# 手動拉取鏡像
sudo crictl pull registry.aliyuncs.com/google_containers/pause:3.9# 查看 containerd 鏡像
sudo crictl images
執行初始化命令(使用阿里云鏡像)
sudo kubeadm init \--pod-network-cidr=10.244.0.0/16 \--apiserver-advertise-address=<master_ip> \--image-repository=registry.aliyuncs.com/google_containers \--cri-socket=unix:///var/run/containerd/containerd.sock
初始化成功并按照如圖所示執行相應命令
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
根據提示將node節點加入集群(在node1和node2執行)
kubeadm join 192.168.252.128:6443 --token 5upatr.oghll4vh1pkecs5a \--discovery-token-ca-cert-hash sha256:289b53fd07d2ff1b213f99c221e59329b06c4f369019ad4895498449a69f91d4
加入成功后在master節點驗證
kubectl get nodes
部署集群網絡Calico
Calico 和 Flannel 是兩種流行的 k8s 網絡插件,它們都為集群中的 Pod 提供網絡功能。然而,它們在實現方式和功能上有一些重要區別:
網絡模型的區別:
Calico 使用 BGP(邊界網關協議)作為其底層網絡模型。它利用 BGP 為每個 Pod 分配一個唯一的 IP 地址,并在集群內部進行路由。Calico 支持網絡策略,可以對流量進行精細控制,允許或拒絕特定的通信。
Flannel 則采用了一個簡化的覆蓋網絡模型。它為每個節點分配一個 IP 地址子網,然后在這些子網之間建立覆蓋網絡。Flannel 將 Pod 的數據包封裝到一個更大的網絡數據包中,并在節點之間進行轉發。Flannel 更注重簡單和易用性,不提供與 Calico 類似的網絡策略功能。
性能的區別:
由于 Calico 使用 BGP 進行路由,其性能通常優于 Flannel。Calico 可以實現直接的 Pod 到 Pod 通信,而無需在節點之間進行額外的封裝和解封裝操作。這使得 Calico 在大型或高度動態的集群中具有更好的性能。
Flannel 的覆蓋網絡模型會導致額外的封裝和解封裝開銷,從而影響網絡性能。對于較小的集群或對性能要求不高的場景,這可能并不是一個嚴重的問題。
master01節點下載Calico文件
wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml
?注意:如果無法下載,就瀏覽器打開該網頁直接復制網頁內容粘貼到master01中即可。
創建calico網絡
kubectl apply -f calico.yaml?
查看Calico Pod狀態是否為Running
?需要耐心等會讓其一個一個啟動,系統配置夠的話大概幾分鐘即可。
驗證集群節點狀態
在master節點查看集群信息
部署Nginx測試集群
NodePort 服務
在master節點部署nginx程序測試
[root@master01 ~]# vim nginx-test.yml
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:app: nginx
spec:containers:- name: nginximage: nginx:1.20.2ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-svc
spec:type: NodePortselector:app: nginxports:- name: httpprotocol: TCPport: 80targetPort: 80nodePort: 30002
將 nginx-test.yml 文件中定義的 Kubernetes 資源應用到集群中。?
kubectl apply -f nginx-test.yml
查看Pod狀態是否為Running
kubectl get pod
查看Service代理信息
kubectl get service
瀏覽器訪問測試:http://192.168.252.128:30002/
部署Kuboard v3
新增一臺虛擬機,關閉防火墻和selinux,進行時間同步。?
安裝Docker并配置加速器
# step 1: 安裝必要的一些系統工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加軟件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安裝Docker-CE
sudo yum makecache
sudo yum -y install docker-ce
# Step 4: 開啟Docker服務
sudo service docker start# Step 5:配置加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://docker.rainbond.cc" ,"https://do.nark.eu.org","https://dc.j8.work","https://pilvpemn.mirror.aliyuncs.com","https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Kuboard v3官方文檔:安裝 Kuboard v3 - kubernetes | Kuboard
安裝 Kuboard v3.x 版本的指令如下:?
sudo docker run -d \--restart=unless-stopped \--name=kuboard \-p 80:80/tcp \-p 10081:10081/tcp \-e KUBOARD_ENDPOINT="http://192.168.252.131:80" \-e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \-v /root/kuboard-data:/data \eipwork/kuboard:v3# 也可以使用鏡像 swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3 ,可以更快地完成鏡像下載。# 請不要使用 127.0.0.1 或者 localhost 作為內網 IP \# Kuboard 不需要和 K8S 在同一個網段,Kuboard Agent 甚至可以通過代理訪問 Kuboard Server \
瀏覽器訪問:http://192.168.252.131/
默認用戶名:admin? ? 初始化密碼:Kuboard123
3
所以我需要復制這個命令如下,然后拿到master主機執行。
然后執行成功后,查看狀態
4