KVM創建ubuntu20.04虛機,部署K8S,再克隆出二份,做為Worker節點加入集群,通過Helm創建2個Pod,讓它們之間通過域名互訪

KVM創建ubuntu20.04虛機,部署K8S,再克隆出二份,做為Worker節點加入集群,通過Helm創建2個Pod,讓它們之間通過域名互訪

  • 一.背景
  • 二.操作步驟
    • 1.安裝KVM
      • A.在BIOS中開啟VT-d
      • B.修改grub,開啟iommu
        • 在/etc/default/grub 中 GRUB_CMDLINE_LINUX行 添加 intel_iommu=on iommu=pt
        • 重新創建引導
        • 重啟服務器
        • 驗證iommu是否開啟
      • C.SSH開啟X11-forwarding,用于可交互式安裝
        • 修改`/etc/ssh/sshd_config`如下:
        • 重啟SSH服務
      • D.安裝依賴
    • 2.創建第一臺KVM虛擬機,做為Master節點
      • A.創建存儲目錄
      • B.下載ubuntu 20.04鏡像
      • C.創建虛擬機
        • 通過virt-install創建虛機,在界面上配置ubutnu20.04
        • 重啟虛機
        • 通過遠程桌面登錄ubuntu20.04,查看IP(如:`192.168.122.140`)
        • 在物理機上通過SSH登錄虛機
        • 修改為靜態IP
        • 更新apt源
        • 關閉swap
        • 開啟網絡轉發
        • 安裝docker-ce
        • 設置docker國內鏡像
        • 安裝kubelet
        • 創建K8S集群
        • 關閉虛機
        • 在物理機上,克隆出二臺虛機,設置成不同的MAC
        • 依次啟動三臺虛機
        • 通過ssh登錄ubuntu20節點,獲取join命令
        • 通過ssh登錄ubuntu20_node1,將其加入集群
        • 通過ssh登錄ubuntu20_node2,將其加入集群
        • 回到ubuntu20節點,獲取node列表,設置node1、node2為工作節點
        • 在ubuntu20上安裝Helm
        • 在ubuntu20上創建Helm工程
        • 在ubuntu20上通過Helm命令創建pod
        • 獲取K8S集群的DNS服務器地址
        • 進入第一個pod,配置DNS,使其能通過域名訪問pod1
        • 進入第二個pod,配置DNS,使能通過域名訪問pod0
        • 刪除資源
    • 3.遇到的問題及解決辦法
  • 三.補充知識點
    • **1. Deployment**
      • **特點:**
      • **行為:**
      • **適用場景:**
    • **2. StatefulSet**
      • **特點:**
      • **行為:**
      • **適用場景:**
    • **3. 主要區別**
    • **4. 具體示例**
      • **Deployment 示例**
      • **StatefulSet 示例**
    • **5. 選擇使用 Deployment 還是 StatefulSet 的指南**
      • **使用 Deployment:**
      • **使用 StatefulSet:**
    • **6. 常見誤區**
    • **7. 總結**

一.背景

  • 在centos7.9上安裝KVM ubuntu20.04虛擬機
  • 在該虛機中部署K8S單節點
  • 將該虛擬機克隆出二份,設置MAC和IP,并加入到K8S集群
  • 在Mastet節點安裝Helm
  • 通過Helm模板創建二個Pod,每個Pod一個容器,Pod之間可通過固定的域名訪問

二.操作步驟

1.安裝KVM

A.在BIOS中開啟VT-d

B.修改grub,開啟iommu

在/etc/default/grub 中 GRUB_CMDLINE_LINUX行 添加 intel_iommu=on iommu=pt

修改如下

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_DISABLE_RECOVERY="true"
GRUB_CMDLINE_LINUX="crashkernel=384M rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet intel_iommu=on iommu=pt"
重新創建引導
*EFI模式:  grub2-mkconfig -o /boot/efi/EFI/bclinux/grub.cfg
*BIOS模式: grub2-mkconfig -o /boot/grub2/grub.cfg
重啟服務器
sync;sync;ipmitool power cycle
驗證iommu是否開啟
dmesg | grep iommu -i

C.SSH開啟X11-forwarding,用于可交互式安裝

修改/etc/ssh/sshd_config如下:
AddressFamily inet
AllowTcpForwarding yes
X11Forwarding yes
重啟SSH服務
systemctl restart sshd

D.安裝依賴

yum -y install qemu qemu-kvm libvirt libvirt-python libguestfs- \tools virt-install tigervnc virt-viewer virt-manager
systemctl enable libvirtd
systemctl start libvirtd				

2.創建第一臺KVM虛擬機,做為Master節點

A.創建存儲目錄

mkdir -p /var/lib/libvirt/boot/
mkdir -p /var/lib/libvirt/images/

B.下載ubuntu 20.04鏡像

cd /var/lib/libvirt/boot/
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/20.04/ubuntu-20.04.5-live-server-amd64.iso

C.創建虛擬機

通過virt-install創建虛機,在界面上配置ubutnu20.04
virt-install \--virt-type=kvm \--name ubuntu20 \--ram 21920 \--vcpus=16 \--os-type linux \--os-variant ubuntu20.04 \--console pty,target_type=serial\--connect qemu:///system \--cdrom=/var/lib/libvirt/boot/ubuntu-20.04.5-live-server-amd64.iso \--network=bridge=virbr0,model=virtio \--graphics vnc \--disk path=/var/lib/libvirt/images/ubuntu20.qcow2,size=20,bus=virtio,format=qcow2

注意事項

  • 開啟SSH
  • Configure Proxy可選:http://mirrors.aliyun.com/ubuntu/
重啟虛機
virsh shutdown ubuntu20
virsh start ubuntu20
通過遠程桌面登錄ubuntu20.04,查看IP(如:192.168.122.140)
virt-viewer
在物理機上通過SSH登錄虛機
ssh kvm@192.168.122.140
sudo su
修改為靜態IP
cat >/etc/netplan/00-installer-config.yaml <<-'EOF'
network:version: 2renderer: networkdethernets:ens3:addresses:- 192.168.122.140/24gateway4: 192.168.122.1nameservers:addresses: [8.8.8.8,8.8.4.4]
EOF
netplan apply
更新apt源
sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
apt update
apt install net-tools -y
關閉swap
sudo sed -i 's/.*swap.*/#&/' /etc/fstab
swapoff -a
開啟網絡轉發
bash -c "cat >> /etc/sysctl.conf" << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
安裝docker-ce
sudo apt install -y apt-transport-https ca-certificates software-properties-common
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg |sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-cache madison docker-ce
dpkg -l | grep docker
apt remove --purge docker-ce*
sudo apt install docker-ce=5:19.03.15~3-0~ubuntu-focal docker-ce-cli=5:19.03.15~3-0~ubuntu-focal containerd.io -y
設置docker國內鏡像
bash -c "cat >> /etc/docker/daemon.json" << EOF
{"dns": ["8.8.8.8", "8.8.4.4"],"registry-mirrors": ["https://docker.m.daocloud.io/","https://huecker.io/","https://dockerhub.timeweb.cloud","https://noohub.ru/","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn","https://xx4bwyg2.mirror.aliyuncs.com","http://f1361db2.m.daocloud.io","https://registry.docker-cn.com","http://hub-mirror.c.163.com"]
}
EOF
systemctl restart docker
安裝kubelet
sudo curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg |sudo apt-key add -
sudo bash -c "cat > /etc/apt/sources.list.d/kubernetes.list" <<EOF
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF
sudo apt install -y kubeadm=1.20.0-00 kubelet=1.20.0-00 kubectl=1.20.0-00 
systemctl enable kubelet && sudo systemctl start kubelet
創建K8S集群
rm /var/lib/etcd -rf
kubeadm reset
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.0 --pod-network-cidr=10.244.0.0/16mkdir -p $HOME/.kube
sudo cp -f /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/configkubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl taint nodes --all node-role.kubernetes.io/master-
kubectl get pods --all-namespaces 
#等待所有pod為running狀態
kubectl get node

輸出

NAMESPACE      NAME                             READY   STATUS    RESTARTS   AGE
kube-flannel   kube-flannel-ds-jvlns            1/1     Running   0          17m
kube-system    coredns-7f89b7bc75-558sb         0/1     Running   0          17m
kube-system    coredns-7f89b7bc75-5mhgm         0/1     Running   0          17m
kube-system    etcd-111111                      0/1     Running   1          17m
kube-system    kube-apiserver-111111            1/1     Running   1          17m
kube-system    kube-controller-manager-111111   0/1     Running   1          17m
kube-system    kube-proxy-g7nsd                 1/1     Running   1          17m
kube-system    kube-scheduler-111111            0/1     Running   1          17m
關閉虛機
poweroff
在物理機上,克隆出二臺虛機,設置成不同的MAC
virt-clone -o ubuntu20 -n ubuntu20_node1 -f /var/lib/libvirt/images/ubuntu20_node1.qcow2 --mac 52:54:00:3b:d9:17
virt-clone -o ubuntu20 -n ubuntu20_node2 -f /var/lib/libvirt/images/ubuntu20_node2.qcow2 --mac 52:54:00:3b:d9:27
依次啟動三臺虛機
virsh start ubuntu20_node1
virsh start ubuntu20_node2
virsh start ubuntu20

每啟動一臺node節點,執行以下步驟

  • 修改/etc/netplan/00-installer-config.yaml中的IP地址,之后執行netplan apply生效
通過ssh登錄ubuntu20節點,獲取join命令
kubeadm token create --print-join-command

輸出

kubeadm join 192.168.122.140:6443 --token v0wuxs.cqduc5dw0t50fis6 \--discovery-token-ca-cert-hash sha256:aa14d393d6e693d6a1bea6e6b6d75c55e3bb38a29071fe7166ce9d49606b6b0e
通過ssh登錄ubuntu20_node1,將其加入集群
# 修改主機名
hostnamectl set-hostname  node1# join到K8S集群
kubeadm reset
rm -f /etc/kubernetes/pki/ca.crt /etc/kubernetes/kubelet.conf
kubeadm join 192.168.122.140:6443 --token v0wuxs.cqduc5dw0t50fis6 \--discovery-token-ca-cert-hash sha256:aa14d393d6e693d6a1bea6e6b6d75c55e3bb38a29071fe7166ce9d49606b6b0e
通過ssh登錄ubuntu20_node2,將其加入集群
# 修改主機名
hostnamectl set-hostname  node2# join到K8S集群
kubeadm reset
rm -f /etc/kubernetes/pki/ca.crt /etc/kubernetes/kubelet.conf
kubeadm join 192.168.122.140:6443 --token v0wuxs.cqduc5dw0t50fis6 \--discovery-token-ca-cert-hash sha256:aa14d393d6e693d6a1bea6e6b6d75c55e3bb38a29071fe7166ce9d49606b6b0e
回到ubuntu20節點,獲取node列表,設置node1、node2為工作節點
kubectl get nodes
kubectl label nodes node1 node-role.kubernetes.io/worker=
kubectl label nodes node2 node-role.kubernetes.io/worker=
kubectl get nodes --show-labels
在ubuntu20上安裝Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
在ubuntu20上創建Helm工程
# 創建工程
helm create llama-training
cd llama-training# 刪除無用的文件
rm templates/deployment.yaml
rm templates/service.yaml
rm templates/ingress.yaml
rm -rf templates/tests
rm templates/hpa.yaml
rm templates/serviceaccount.yaml
rm templates/NOTES.txt# 創建 values.yaml 文件,包含可變參數
cat > values.yaml << EOF
replicaCount: 2
image:repository: ubuntutag: "20.04"pullPolicy: IfNotPresent
masterPort: "29500"
worldSize: "16"
EOF# 創建 StatefulSet 模板,為每個 Pod 分配穩定的主機名
cat > templates/statefulset.yaml <<-'EOF'
apiVersion: apps/v1
kind: StatefulSet
metadata:name: {{ include "llama-training.fullname" . }}labels:{{- include "llama-training.labels" . | nindent 4 }}
spec:serviceName: "{{ include "llama-training.fullname" . }}-headless"replicas: {{ .Values.replicaCount }}selector:matchLabels:{{- include "llama-training.selectorLabels" . | nindent 6 }}template:metadata:labels:{{- include "llama-training.selectorLabels" . | nindent 8 }}spec:containers:- name: {{ .Chart.Name }}image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"imagePullPolicy: {{ .Values.image.pullPolicy }}securityContext:allowPrivilegeEscalation: falseenv:- name: MASTER_ADDRvalue: "{{ include "llama-training.fullname" . }}-headless"- name: MASTER_PORTvalue: "{{ .Values.masterPort }}"- name: WORLD_SIZEvalue: "{{ .Values.worldSize }}"command: [ "/bin/bash", "-c", "--" ]args: [ "while true; do sleep 30; done;" ]
EOF# 創建 Headless Service,讓 Pod 之間可以通過域名訪問,解決 IP 地址不固定的問題
cat > templates/headless-service.yaml <<-'EOF'
apiVersion: v1
kind: Service
metadata:name: {{ include "llama-training.fullname" . }}-headlesslabels:{{- include "llama-training.labels" . | nindent 4 }}
spec:clusterIP: None  # 使其成為 Headless Serviceselector:{{- include "llama-training.selectorLabels" . | nindent 4 }}
EOF# 設置網絡策略,讓 Pod 可以訪問外網
cat > templates/networkpolicy.yaml <<-'EOF'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: {{ include "llama-training.fullname" . }}-egressnamespace: {{ .Release.Namespace }}labels:{{- include "llama-training.labels" . | nindent 4 }}
spec:podSelector:matchLabels:{{- include "llama-training.selectorLabels" . | nindent 6 }}policyTypes:- Egressegress:- {}
EOF
在ubuntu20上通過Helm命令創建pod
helm install llama-training .
kubectl get pods -o wide

輸出

NAME               READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
llama-training-0   1/1     Running   0          15s   10.244.2.194   node1    <none>           <none>
llama-training-1   1/1     Running   0          14s   10.244.1.106   master   <none>           <none>
獲取K8S集群的DNS服務器地址
kubectl get endpoints -n kube-system -o wide|grep kube-dns
kube-dns   10.244.1.104:53,10.244.1.105:53,10.244.1.104:53 + 3 more...   63m
進入第一個pod,配置DNS,使其能通過域名訪問pod1
# 進入pod
kubectl exec -it llama-training-0 -- bash# 配置DNS
cat > /etc/resolv.conf <<-'EOF'
nameserver 10.244.1.104
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
nameserver 8.8.8.8
EOF# 下載相關工具
apt update
apt install net-tools iputils-ping -y# 通過域名ping二個pod
ping llama-training-0.llama-training-headless.default.svc.cluster.local -c 2
ping llama-training-1.llama-training-headless.default.svc.cluster.local -c 2# 退出
exit

輸出

64 bytes from llama-training-0.llama-training-headless.default.svc.cluster.local (10.244.2.194): icmp_seq=1 ttl=64 time=0.035 ms
64 bytes from llama-training-0.llama-training-headless.default.svc.cluster.local (10.244.2.194): icmp_seq=2 ttl=64 time=0.032 ms64 bytes from llama-training-1.llama-training-headless.default.svc.cluster.local (10.244.1.106): icmp_seq=1 ttl=62 time=0.319 ms
64 bytes from llama-training-1.llama-training-headless.default.svc.cluster.local (10.244.1.106): icmp_seq=2 ttl=62 time=0.457 ms
進入第二個pod,配置DNS,使能通過域名訪問pod0
# 進入pod
kubectl exec -it llama-training-1 -- bash# 配置DNS
cat > /etc/resolv.conf <<-'EOF'
nameserver 10.244.1.104
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
nameserver 8.8.8.8
EOF# 下載相關工具
apt update
apt install net-tools iputils-ping -y# 通過域名ping二個pod
ping llama-training-0.llama-training-headless.default.svc.cluster.local -c 2
ping llama-training-1.llama-training-headless.default.svc.cluster.local -c 2# 退出
exit

輸出

64 bytes from llama-training-0.llama-training-headless.default.svc.cluster.local (10.244.2.194): icmp_seq=1 ttl=64 time=0.035 ms
64 bytes from llama-training-0.llama-training-headless.default.svc.cluster.local (10.244.2.194): icmp_seq=2 ttl=64 time=0.032 ms64 bytes from llama-training-1.llama-training-headless.default.svc.cluster.local (10.244.1.106): icmp_seq=1 ttl=62 time=0.319 ms
64 bytes from llama-training-1.llama-training-headless.default.svc.cluster.local (10.244.1.106): icmp_seq=2 ttl=62 time=0.457 ms
刪除資源
helm uninstall llama-training
kubectl get pods -o wide
# 等待資源釋放

3.遇到的問題及解決辦法

  • “cni0” already has an IP address different from
ifconfig cni0 down    
ip link delete cni0
  • DNC異常,重啟 CoreDNS
kubectl delete pod -n kube-system -l k8s-app=kube-dns
kubectl get pods -n kube-system

三.補充知識點


在 Kubernetes(k8s)中,Pod 是最小的可部署單位,它代表了在集群中運行的一個或多個容器。每個 Pod 都運行在單個節點(服務器)上,無法跨越多個節點。也就是說,一個 Pod 不能同時分布在多個服務器上運行

如果您需要在多個服務器上運行應用程序,以實現高可用性和負載均衡,您可以使用 Deployment、ReplicaSet 或 StatefulSet 等更高級別的控制器來管理多個 Pod 實例。Kubernetes 會根據資源情況和調度策略,將這些 Pod 分布到集群中的不同節點上運行。

總結來說,Pod 本身不能跨服務器,但您可以通過創建多個 Pod,并利用 Kubernetes 的調度和管理功能,讓這些 Pod 分布在不同的節點上,以滿足跨服務器的需求。


在Kubernetes中,Pod之間可以通過主機名進行訪問,通常是通過以下幾種方式實現的:

  1. 直接使用Pod的DNS:每個Pod在Kubernetes集群中都有一個DNS條目,你可以直接使用Pod的名稱來進行訪問,不過這種方法不推薦用在生產環境,因為Pod的IP地址會隨著重啟發生變化。

  2. 使用Service進行訪問

    • ClusterIP:這是Kubernetes中Service的默認類型。Service為一組Pod提供了一個穩定的IP地址和DNS名稱。你可以通過Service的名稱來訪問Pod,Service會自動進行負載均衡。

    • Headless Service:如果需要直接獲取Pod的IP地址,可以創建一個Headless Service。通過將Service的clusterIP字段設置為None來創建。這樣,Kubernetes會為這個Service的每個Pod創建一個DNS記錄。

  3. StatefulSets

    • 對于有狀態應用,比如ZooKeeper、Cassandra等,可以使用StatefulSets來部署。這種資源類型會為每個Pod分配穩定的主機名,格式通常為<podname>.<headless-service-name>.<namespace>.svc.cluster.local

在 Kubernetes 中,DeploymentStatefulSet 是兩種常用的工作負載(Workload)資源類型,它們用于管理 Pod 的部署和伸縮。雖然它們都可以用于管理應用程序的副本,但它們在處理 Pod 的方式和適用的場景上有著顯著的區別。

以下將詳細解釋 DeploymentStatefulSet 的主要區別,以及它們各自的適用場景。


1. Deployment

特點:

  • 無狀態服務(Stateless):Deployment 主要用于管理無狀態的應用程序,如 Web 前端、API 服務器等。
  • Pod 的可互換性:Deployment 中的所有 Pod 都是可互換的,沒有特定的身份。

行為:

  • 滾動更新(Rolling Update):支持無中斷地更新應用程序到新版本。
  • Pods 的命名:Pod 的名稱是隨機生成的,不保證穩定的主機名(Hostname)或網絡標識(Network Identity)。
  • 副本數(Replica)管理:可以輕松地水平伸縮 Pod 的數量。

適用場景:

  • 無需持久化存儲的無狀態應用。
  • 對于應用程序的實例間沒有嚴格的順序或身份需求。

2. StatefulSet

特點:

  • 有狀態服務(Stateful):StatefulSet 用于管理有狀態的應用程序,如數據庫(例如 MySQL、MongoDB)、分布式系統(例如 Kafka、Zookeeper)等。
  • 穩定的網絡標識:每個 Pod 都有一個穩定的、唯一的網絡標識(主機名),該標識在 Pod 重建或調度到其他節點時保持不變。
  • 持久化存儲:可以為每個 Pod 關聯一個持久化的存儲卷(PersistentVolume),即使 Pod 被刪除或重新調度,數據也不會丟失。

行為:

  • 有序部署和更新:Pod 的創建、更新和刪除按照指定的順序進行(從 0 到 N-1)。
  • Pods 的命名:Pod 的名稱遵循固定的模式:<StatefulSet 名稱>-<序號>,例如 my-app-0my-app-1
  • 持久化存儲卷的綁定:通過 VolumeClaimTemplates,每個 Pod 都有自己的持久化存儲卷。

適用場景:

  • 需要持久化數據的有狀態應用程序。
  • 應用程序實例需要穩定的身份(例如,需要特定的主機名或 IP 地址)。
  • 應用程序實例之間需要有序部署或終止。

3. 主要區別

特性DeploymentStatefulSet
適用應用類型無狀態應用程序有狀態應用程序
Pod 可互換性Pods 可互換,無需穩定身份Pods 有穩定的身份,不可互換
網絡標識Pod 名稱隨機,無穩定的主機名或網絡標識每個 Pod 有穩定的主機名,網絡標識長期保持不變
存儲卷通常使用共享的存儲卷,或不需要存儲每個 Pod 關聯一個專屬的持久化存儲卷
部署和更新順序無序,Pods 可并行創建、更新或刪除有序,按照序號順序創建、更新或刪除 Pods
滾動更新支持,更新時可同時更新多個實例更新時按順序進行,一個接一個地更新 Pods
擴縮容支持,同時創建或刪除多個 Pods按序號增減 Pods,擴容時創建新的序號的 Pod

4. 具體示例

Deployment 示例

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 3  # 副本數,可以隨意調整selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.21

說明:

  • 部署了 3 個 Nginx 實例,Pod 名稱隨機生成,例如 nginx-deployment-xxxxxxxxxx-yyyyy
  • Pods 之間沒有穩定的身份或順序,可以隨意擴縮容。

StatefulSet 示例

apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-statefulset
spec:serviceName: "mysql"replicas: 3  # 副本數,按照序號創建selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:8.0volumeMounts:- name: mysql-datamountPath: /var/lib/mysqlvolumeClaimTemplates:- metadata:name: mysql-dataspec:accessModes: ["ReadWriteOnce"]storageClassName: "standard"resources:requests:storage: 10Gi

說明:

  • 部署了 3 個 MySQL 實例,Pod 名稱為 mysql-statefulset-0mysql-statefulset-1mysql-statefulset-2
  • 每個 Pod 都有一個名為 mysql-data 的持久化存儲卷,數據不會因 Pod 重建而丟失。
  • Pods 的創建、更新和刪除按序號進行,確保順序性和穩定性。

5. 選擇使用 Deployment 還是 StatefulSet 的指南

使用 Deployment:

  • 無狀態應用程序:應用程序不需要持久化數據。
  • Pod 可互換:實例之間沒有區別,可以隨意替換。
  • 無需穩定網絡標識:Pods 的主機名和 IP 地址可變。
  • 需要快速擴縮容:可以迅速增加或減少 Pods 數量。
  • 快速滾動更新:可同時更新多個實例,減少更新時間。

使用 StatefulSet:

  • 有狀態應用程序:如數據庫、緩存系統等,需要持久化數據。
  • Pod 需要穩定身份:實例需要固定的主機名或網絡標識。
  • 需要持久化存儲:每個 Pod 需要綁定獨立的存儲卷。
  • 有序部署和更新:需要按照特定順序啟動或停止實例。
  • 對實例間關系有要求:實例之間存在關聯,需要穩定的通信。

6. 常見誤區

  • 誤用 Deployment 管理有狀態服務:可能導致數據丟失、網絡通信失敗等問題。
  • 誤用 StatefulSet 管理無狀態服務:增加了不必要的復雜性,降低了部署效率。

7. 總結

  • Deployment:適用于無狀態、可快速擴展的應用程序,管理簡單,部署效率高。
  • StatefulSet:適用于有狀態、需要持久化存儲和穩定網絡標識的應用程序,確保應用程序的可靠性和一致性。

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

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

相關文章

【機器學習實戰入門項目】使用Python創建自己的表情符號

深度學習項目入門——讓你更接近數據科學的夢想 表情符號或頭像是表示非語言暗示的方式。這些暗示已成為在線聊天、產品評論、品牌情感等的重要組成部分。這也促使數據科學領域越來越多的研究致力于表情驅動的故事講述。 隨著計算機視覺和深度學習的進步&#xff0c;現在可以…

BEVFusion論文閱讀

1. 簡介 融合激光雷達和相機的信息已經變成了3D目標檢測的一個標準&#xff0c;當前的方法依賴于激光雷達傳感器的點云作為查詢&#xff0c;以利用圖像空間的特征。然而&#xff0c;人們發現&#xff0c;這種基本假設使得當前的融合框架無法在發生 LiDAR 故障時做出任何預測&a…

OSI七層協議——分層網絡協議

OSI七層協議&#xff0c;顧名思義&#xff0c;分為七層&#xff0c;實際上七層是不存在的&#xff0c;是人為的進行劃分,讓人更好的理解 七層協議包括&#xff0c;物理層(我),數據鏈路層(據),網絡層(網),傳輸層(傳輸),會話層(會),表示層(表),應用層(用)(記憶口訣->我會用表…

6. NLP自然語言處理(Natural Language Processing)

自然語言是指人類日常使用的語言&#xff0c;如中文、英語、法語等。 自然語言處理是人工智能&#xff08;AI&#xff09;領域中的一個重要分支&#xff0c;它結合了計算機科學、語言學和統計學的方法&#xff0c;通過算法對文本和語音進行分析&#xff0c;使計算機能夠理解、解…

Ubuntu使用指南

Ubuntu使用指南 一、Ubuntu虛擬機1、本地如何連接虛擬機&#xff0c;并設置虛擬機可以訪問外網 一、Ubuntu虛擬機 1、本地如何連接虛擬機&#xff0c;并設置虛擬機可以訪問外網 本地&#xff1a;WMware設置為橋接模式&#xff08;此時虛擬機可以看作一臺獨立主機&#xff09;…

【Mysql進階知識】Mysql 程序的介紹、選項在命令行配置文件的使用、選項在配置文件中的語法

目錄 一、程序介紹 二、mysqld--mysql服務器介紹 三、mysql - MySQL 命令行客戶端 3.1 客戶端介紹 3.2 mysql 客戶端選項 指定選項的方式 mysql 客戶端命令常用選項 在命令行中使用選項 選項(配置)文件 使用方法 選項文件位置及加載順序 選項文件語法 使用舉例&am…

wireshark抓路由器上的包 抓包路由器數據

文字目錄 抓包流程概述設置抓包配置選項 設置信道設置無線數據包加密信息設置MAC地址過濾器 抓取聯網過程 抓包流程概述 使用Omnipeek軟件分析網絡數據包的流程大概可以分為以下幾個步驟&#xff1a; 掃描路由器信息&#xff0c;確定抓包信道&#xff1b;設置連接路由器的…

【藍橋杯】43687.贏球票

題目描述 某機構舉辦球票大獎賽。獲獎選手有機會贏得若干張球票。 主持人拿出 N 張卡片&#xff08;上面寫著 1?N 的數字&#xff09;&#xff0c;打亂順序&#xff0c;排成一個圓圈。 你可以從任意一張卡片開始順時針數數: 1,2,3 ? ? 如果數到的數字剛好和卡片上的數字…

SQL-leetcode—626. 換座位

626. 換座位 表: Seat -------------------- | Column Name | Type | -------------------- | id | int | | student | varchar | -------------------- id 是該表的主鍵&#xff08;唯一值&#xff09;列。 該表的每一行都表示學生的姓名和 ID。 ID 序列始終從 1 開始并連續…

微軟開源AI Agent AutoGen 詳解

AutoGen是微軟發布的一個用于構建AI Agent系統的開源框架,旨在簡化事件驅動、分布式、可擴展和彈性Agent應用程序的創建過程。 開源地址: GitHub - microsoft/autogen: A programming framework for agentic AI ?? PyPi: autogen-agentchat Discord: https://aka.ms/auto…

【Elasticsearch】全文搜索與相關性排序

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

用css和html制作太極圖

目錄 css相關參數介紹 邊距 邊框 偽元素選擇器 太極圖案例實現、 代碼 效果 css相關參數介紹 邊距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …

【React】插槽渲染機制

目錄 通過 children 屬性結合條件渲染通過 children 和 slot 屬性實現具名插槽通過 props 實現具名插槽 在 React 中&#xff0c;并沒有直接類似于 Vue 中的“插槽”機制&#xff08;slot&#xff09;。但是&#xff0c;React 可以通過 props和 children 來實現類似插槽的功能…

【Go】Go Gorm 詳解

1. 概念 Gorm 官網&#xff1a;https://gorm.io/zh_CN/docs/ Gorm&#xff1a;The fantastic ORM library for Golang aims to be developer friendly&#xff0c;這是官網的介紹&#xff0c;簡單來說 Gorm 就是一款高性能的 Golang ORM 庫&#xff0c;便于開發人員提高效率 那…

【MySQL實戰】mysql_exporter+Prometheus+Grafana

要在Prometheus和Grafana中監控MySQL數據庫&#xff0c;如下圖&#xff1a; 可以使用mysql_exporter。 以下是一些步驟來設置和配置這個監控環境&#xff1a; 1. 安裝和配置Prometheus&#xff1a; - 下載和安裝Prometheus。 - 在prometheus.yml中配置MySQL通過添加以下內…

【Apache Doris】周FAQ集錦:第 29 期

引言 歡迎查閱本周的 Apache Doris 社區 FAQ 欄目&#xff01; 在這個欄目中&#xff0c;每周將篩選社區反饋的熱門問題和話題&#xff0c;重點回答并進行深入探討。旨在為廣大用戶和開發者分享有關 Apache Doris 的常見問題。 通過這個每周 FAQ 欄目&#xff0c;希望幫助社…

Linux:文件描述符fd、系統調用open

目錄 一、文件基礎認識 二、C語言操作文件的接口 1.> 和 >> 2.理解“當前路徑” 三、相關系統調用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基礎認識 文件 內容 屬性。換句話說&#xff0c;如果在電腦上新建了一個空白文檔&#xff0…

鴻蒙動態路由實現方案

背景 隨著CSDN 鴻蒙APP 業務功能的增加&#xff0c;以及為了與iOS、Android 端統一頁面跳轉路由&#xff0c;以及動態下發路由鏈接&#xff0c;路由重定向等功能。鴻蒙動態路由方案的實現迫在眉睫。 實現方案 鴻蒙版本動態路由的實現原理&#xff0c;類似于 iOS與Android的實…

計算機網絡 (42)遠程終端協議TELNET

前言 Telnet&#xff08;Telecommunication Network Protocol&#xff09;是一種網絡協議&#xff0c;屬于TCP/IP協議族&#xff0c;主要用于提供遠程登錄服務。 一、概述 Telnet協議是一種遠程終端協議&#xff0c;它允許用戶通過終端仿真器連接到遠程主機&#xff0c;并在遠程…

汽車網絡信息安全-ISO/SAE 21434解析(上)

目錄 概述 第四章-概述 1. 研究對象和范圍 2. 風險管理 第五章-組織級網絡安全管理 1. 網絡安全治理&#xff08;cybersecurity governance&#xff09; 2. 網絡安全文化&#xff08;cybersecurity culture) 3. 信息共享&#xff08;Information Sharing) 4. 管理體系…