基于 kube-vip 部署 kubernetes 高可用集群

K8S LoadBalancer kube-vip 部署 阅读详情
AI摘要

本文介绍了kube-vip项目,它可简化Kubernetes集群负载均衡服务。详细阐述了基于kube-vip部署4节点Kubernetes集群的步骤,包括节点初始化、安装containerd和kubeadm、生成配置文件、拉取镜像、创建集群、安装网络插件等,最后验证了集群的高可用性。

kube-vip 简介

kube-vip 是一个开源项目,旨在简化为 Kubernetes 集群提供负载均衡服务。

kube-vip 为 Kubernetes 集群提供虚拟 IP 和负载均衡器,用于控制平面(用于构建高可用集群)和 Kubernetes 服务类型,而无需依赖LoadBalancer任何外部硬件或软件。

kube-vip 的最初目的是简化高可用(HA)Kubernetes 集群的构建,当时该集群涉及一些需要管理的组件和配置。随着项目的发展,它现在可以使用相同的技术为 LoadBalancer类型的 Kubernetes Service资源提供负载均衡功能。

在这里插入图片描述
官方网站:https://kube-vip.io/

项目地址:https://github.com/kube-vip/kube-vip

基于kube-vip部署kubernetes集群

本示例中的安装部署Kubernetes集群将基于以下环境进行:

  • OS: Ubuntu Server 22.04 LTS
  • Kubernetes:v1.28.1
  • Container Runtime: Containerd

前置要求:

  • 至少2个CPU、2G内存
  • 禁用swap交换分区
  • 允许 iptables 检查桥接流量

本次使用kubeadm部署4节点的 Kubernetes集群,包含3个master节点及1个worker节点。采用 kube-vip 来实现高可用,所有节点访问 VIP 来通讯。而且 kube-vip x 3 都运行在 Control Plane 所在的主机中,以减少集群主机数量。

注意:使用kube-vip管理vip需要保证vip和节点ip在同一子网中。

节点清单:

节点名称节点IP节点角色CPU内存磁盘OS
master1192.168.72.30master2C4G100GUbutnu 22.04 LTS
master2192.168.72.31master2C4G100GUbutnu 22.04 LTS
master3192.168.72.32master2C4G100GUbutnu 22.04 LTS
node1192.168.72.33worker2C4G100GUbutnu 22.04 LTS
kube-vip192.168.72.200

节点初始化

说明:以下操作在所有节点执行。

1、配置主机名

hostnamectl set-hostname master1
hostnamectl set-hostname master2
hostnamectl set-hostname master3
hostnamectl set-hostname node1

2、配置hosts解析

cat >> /etc/hosts << EOF
192.168.72.200 lb.k8s.local
192.168.72.30 master1
192.168.72.31 master2
192.168.72.32 master3
192.168.72.33 node1
EOF

3、关闭swap

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

4、确认时间同步

apt install -y chrony
systemctl enable --now chrony
chronyc sources

5、加载ipvs内核模块
参考:https://github.com/kubernetes/kubernetes/tree/master/pkg/proxy/ipvs

另外,针对Linux kernel 4.19以上的内核版本使用nf_conntrack 代替nf_conntrack_ipv4。

cat <<EOF | tee /etc/modules-load.d/ipvs.conf
# Load IPVS at boot
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF

modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack

#确认内核模块加载成功
lsmod | grep -e ip_vs -e nf_conntrack

#安装ipset和ipvsadm
apt install -y ipset ipvsadm

安装containerd

说明:以下操作在所有节点执行。

1、安装containerd容器运行时的前置条件

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# 应用 sysctl 参数而无需重新启动
sudo sysctl --system

2、安装containerd容器运行时,如果网络较差,建议使用浏览器下载到本地,在上传到服务器。

下载地址:https://github.com/containerd/nerdctl/releases

wget https://github.com/containerd/nerdctl/releases/download/v1.5.0/nerdctl-full-1.5.0-linux-amd64.tar.gz
tar Cxzvvf /usr/local nerdctl-full-1.5.0-linux-amd64.tar.gz

3、创建containerd配置文件

sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

4、配置使用 systemd cgroup 驱动程序

sed -i "s#SystemdCgroup = false#SystemdCgroup = true#g" /etc/containerd/config.toml

5、修改基础设施镜像,安装kubeadm后使用kubeadm config images list命令确认pause默认镜像tag

old_image='sandbox_image = "registry.k8s.io/pause:.*"'
new_image='sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"'
sed -i "s|$old_image|$new_image|" /etc/containerd/config.toml

6、启动containerd服务

systemctl enable --now containerd

7、查看containerd运行状态

systemctl status containerd

安装kubeadm

说明:以下操作在所有节点执行。

1、添加kubernetes源,使用阿里云apt源进行替换:

apt update -y
apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

2、查看可安装的版本

apt-get update
apt-cache madison kubectl | more

3、安装指定版本kubeadm、kubelet及kubectl

export KUBERNETES_VERSION=1.28.1-00
apt update -y
apt-get install -y kubelet=${KUBERNETES_VERSION} kubeadm=${KUBERNETES_VERSION} kubectl=${KUBERNETES_VERSION}
apt-mark hold kubelet kubeadm kubectl

4、启动kubelet服务

systemctl enable --now kubelet

生成kube-vip配置文件

说明:以下操作在第一个master节点执行。

1、生成kube-vip 静态yaml配置文件

export VIP=192.168.72.200
export INTERFACE=ens33
export KVVERSION=v0.6.2
nerdctl run -it --rm --net=host ghcr.io/kube-vip/kube-vip:$KVVERSION manifest pod \
  --interface $INTERFACE \
  --address $VIP \
  --controlplane \
  --services \
  --arp \
  --enableLoadBalancer \
  --leaderElection | tee /etc/kubernetes/manifests/kube-vip.yaml

2、修改镜像拉取策略

sed -i "s#imagePullPolicy: Always#imagePullPolicy: IfNotPresent#g" \
/etc/kubernetes/manifests/kube-vip.yaml

3、复制kube-vip.yaml到其他master节点

scp -r /etc/kubernetes/manifests/kube-vip.yaml 192.168.72.31:/etc/kubernetes/manifests/
scp -r /etc/kubernetes/manifests/kube-vip.yaml 192.168.72.32:/etc/kubernetes/manifests/

4、提前在所有master节点拉取kube-vip镜像

nerdctl -n k8s.io pull ghcr.io/kube-vip/kube-vip:v0.6.2

提前拉取k8s镜像

备注:以下操作在所有节点执行。

1、查看可安装的kubernetes版本

kubectl version --short

2、查看对应kubernetes版本的容器镜像

kubeadm config images list \
  --kubernetes-version=v1.28.1 \
  --image-repository registry.aliyuncs.com/google_containers

3、在所有节点执行以下命令,提前拉取镜像

kubeadm config images pull \
  --kubernetes-version=v1.28.1 \
  --image-repository registry.aliyuncs.com/google_containers

4、查看拉取的镜像

root@master1:~# nerdctl -n k8s.io images |grep -v none
REPOSITORY                                                         TAG        IMAGE ID        CREATED               PLATFORM       SIZE         BLOB SIZE
ghcr.io/kube-vip/kube-vip                                          v0.6.2     d9271fa975a4    2 minutes ago         linux/amd64    40.8 MiB     40.8 MiB
registry.aliyuncs.com/google_containers/coredns                    v1.10.1    90d3eeb2e210    About a minute ago    linux/amd64    51.1 MiB     15.4 MiB
registry.aliyuncs.com/google_containers/etcd                       3.5.9-0    b124583790d2    About a minute ago    linux/amd64    283.8 MiB    98.1 MiB
registry.aliyuncs.com/google_containers/kube-apiserver             v1.28.1    1e9a3ea7d1d4    2 minutes ago         linux/amd64    123.1 MiB    33.0 MiB
registry.aliyuncs.com/google_containers/kube-controller-manager    v1.28.1    f6838231cb74    2 minutes ago         linux/amd64    119.5 MiB    31.8 MiB
registry.aliyuncs.com/google_containers/kube-proxy                 v1.28.1    feb6017bf009    About a minute ago    linux/amd64    73.6 MiB     23.4 MiB
registry.aliyuncs.com/google_containers/kube-scheduler             v1.28.1    b76ea016d6b9    2 minutes ago         linux/amd64    60.6 MiB     17.9 MiB
registry.aliyuncs.com/google_containers/pause                      3.9        7031c1b28338    About a minute ago    linux/amd64    728.0 KiB    314.0 KiB

创建集群配置文件

说明:以下操作仅在第一个master节点执行。

1、生成默认的集群初始化配置文件。

kubeadm config print init-defaults --component-configs KubeProxyConfiguration > kubeadm.yaml

2、修改集群配置文件

$ cat kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.72.30
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: master1
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
  certSANs:
  - lb.k8s.local
  - master1
  - master2
  - master3
  - node1
  - 192.168.72.30
  - 192.168.72.31
  - 192.168.72.32
  - 192.168.72.33
controlPlaneEndpoint: lb.k8s.local:6443
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.28.1
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16
scheduler: {}
---
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 0s
    enabled: true
  x509:
    clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 0s
    cacheUnauthorizedTTL: 0s
cgroupDriver: systemd
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
containerRuntimeEndpoint: ""
cpuManagerReconcilePeriod: 0s
evictionPressureTransitionPeriod: 0s
fileCheckFrequency: 0s
healthzBindAddress: 127.0.0.1
healthzPort: 10248
httpCheckFrequency: 0s
imageMinimumGCAge: 0s
kind: KubeletConfiguration
logging:
  flushFrequency: 0
  options:
    json:
      infoBufferSize: "0"
  verbosity: 0
memorySwap: {}
nodeStatusReportFrequency: 0s
nodeStatusUpdateFrequency: 0s
resolvConf: /run/systemd/resolve/resolv.conf
rotateCertificates: true
runtimeRequestTimeout: 0s
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /etc/kubernetes/manifests
streamingConnectionIdleTimeout: 0s
syncFrequency: 0s
volumeStatsAggPeriod: 0s
---
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: 0.0.0.0
bindAddressHardFail: false
clientConnection:
  acceptContentTypes: ""
  burst: 0
  contentType: ""
  kubeconfig: /var/lib/kube-proxy/kubeconfig.conf
  qps: 0
clusterCIDR: ""
configSyncPeriod: 0s
conntrack:
  maxPerCore: null
  min: null
  tcpCloseWaitTimeout: null
  tcpEstablishedTimeout: null
detectLocal:
  bridgeInterface: ""
  interfaceNamePrefix: ""
detectLocalMode: ""
enableProfiling: false
healthzBindAddress: ""
hostnameOverride: ""
iptables:
  localhostNodePorts: null
  masqueradeAll: false
  masqueradeBit: null
  minSyncPeriod: 0s
  syncPeriod: 0s
ipvs:
  excludeCIDRs: null
  minSyncPeriod: 0s
  scheduler: ""
  strictARP: false
  syncPeriod: 0s
  tcpFinTimeout: 0s
  tcpTimeout: 0s
  udpTimeout: 0s
kind: KubeProxyConfiguration
logging:
  flushFrequency: 0
  options:
    json:
      infoBufferSize: "0"
  verbosity: 0
metricsBindAddress: ""
mode: "ipvs"
nodePortAddresses: null
oomScoreAdj: null
portRange: ""
showHiddenMetricsForVersion: ""
winkernel:
  enableDSR: false
  forwardHealthCheckVip: false
  networkName: ""
  rootHnsEndpointName: ""
  sourceVip: ""

3、在默认值基础之上需要配置的参数说明:

InitConfiguration

kind: InitConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
localAPIEndpoint:
  advertiseAddress: 192.168.72.30
  bindPort: 6443
nodeRegistration:

  name: master1

ClusterConfiguration

kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
controlPlaneEndpoint: lb.k8s.local:6443
imageRepository: registry.aliyuncs.com/google_containers
kubernetesVersion: 1.28.1
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16
apiServer:
  certSANs:
  - lb.k8s.local
  - master1
  - master2
  - master3
  - node1
  - 192.168.72.30
  - 192.168.72.31
  - 192.168.72.32
  - 192.168.72.33

KubeletConfiguration

kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
containerRuntimeEndpoint: ""

KubeProxyConfiguration

kind: KubeProxyConfiguration
apiVersion: kubeproxy.config.k8s.io/v1alpha1
mode: "ipvs"

初始化第一个master节点

1、在第一个master节点运行以下命令开始初始化master节点:

kubeadm init --upload-certs --config kubeadm.yaml

如果初始化报错可以执行以下命令检查kubelet相关日志。

journalctl -xeu kubelet

2、记录日志输出中的join control-plane和join worker命令。

3、查看master1节点生成的vip地址

root@master1:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:aa:75:9f brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.72.30/24 brd 192.168.72.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.72.200/32 scope global deprecated dynamic ens33
       valid_lft 58sec preferred_lft 0sec
    inet6 fe80::250:56ff:feaa:759f/64 scope link 
       valid_lft forever preferred_lft forever
3: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default 
    link/ether a2:de:63:b2:34:ce brd ff:ff:ff:ff:ff:ff
    inet 10.96.0.1/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 10.96.0.10/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever

4、master节点初始化完成后参考最后提示配置kubectl客户端连接

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

5、查看节点状态,当前还未安装网络插件节点处于NotReady状态

root@master1:~# kubectl get nodes
NAME   STATUS     ROLES           AGE   VERSION
node   NotReady   control-plane   40s   v1.28.1

6、查看pod状态,当前还未安装网络插件coredns pod处于Pending状态

root@master1:~# kubectl get pods -A
NAMESPACE     NAME                           READY   STATUS    RESTARTS   AGE
kube-system   coredns-66f779496c-44fcc       0/1     Pending   0          32s
kube-system   coredns-66f779496c-9cjmf       0/1     Pending   0          32s
kube-system   etcd-node                      1/1     Running   1          44s
kube-system   kube-apiserver-node            1/1     Running   1          44s
kube-system   kube-controller-manager-node   1/1     Running   1          44s
kube-system   kube-proxy-g4kns               1/1     Running   0          32s
kube-system   kube-scheduler-node            1/1     Running   1          44s
kube-system   kube-vip-node                  1/1     Running   1          46s

安装calico网络插件

说明:以下操作仅在第一个master节点执行。

参考:https://projectcalico.docs.tigera.io/getting-started/kubernetes/quickstart

1、在第一个master节点安装helm

version=v3.12.3
curl -LO https://repo.huaweicloud.com/helm/${version}/helm-${version}-linux-amd64.tar.gz
tar -zxvf helm-${version}-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm && rm -rf linux-amd64

2、添加calico helm 仓库

helm repo add projectcalico https://projectcalico.docs.tigera.io/charts

3、部署calico,如果无法访问dockerhub,可能需要提前拉取镜像

helm install calico projectcalico/tigera-operator \
--namespace tigera-operator --create-namespace

4、查看节点变为Ready状态

root@master1:~# kubectl get nodes
NAME   STATUS   ROLES           AGE   VERSION
node   Ready    control-plane   17m   v1.28.1

5、查看coredns pod状态变为Running

root@master1:~# kubectl get pods -A
NAMESPACE          NAME                                      READY   STATUS    RESTARTS   AGE
calico-apiserver   calico-apiserver-c7b9c94d5-ck6n8          1/1     Running   0          4m6s
calico-apiserver   calico-apiserver-c7b9c94d5-fjbbh          1/1     Running   0          4m6s
calico-system      calico-kube-controllers-9c4d4576f-rtbm5   1/1     Running   0          11m
calico-system      calico-node-vwkhs                         1/1     Running   0          11m
calico-system      calico-typha-76c649f99d-7gdsv             1/1     Running   0          11m
calico-system      csi-node-driver-fzlck                     2/2     Running   0          11m
kube-system        coredns-66f779496c-44fcc                  1/1     Running   0          17m
kube-system        coredns-66f779496c-9cjmf                  1/1     Running   0          17m
kube-system        etcd-node                                 1/1     Running   1          17m
kube-system        kube-apiserver-node                       1/1     Running   1          17m
kube-system        kube-controller-manager-node              1/1     Running   1          17m
kube-system        kube-proxy-g4kns                          1/1     Running   0          17m
kube-system        kube-scheduler-node                       1/1     Running   1          17m
kube-system        kube-vip-node                             1/1     Running   1          17m
tigera-operator    tigera-operator-94d7f7696-lzrrz           1/1     Running   0          11m

master节点加入集群

1、分别在第2和第3个master节点执行以下命令

kubeadm join lb.k8s.local:6443 --token abcdef.0123456789abcdef \
      --discovery-token-ca-cert-hash sha256:7e25d6bc9368f5ab747c8c0b3349c5441005e0e15914cd4be1eac6351fb1e320 \
      --control-plane --certificate-key fbae5ace48cf806fe5df818174859e3a837cf316156cd6e26ec14c7fca28fba3

2、如果master初始化后未记录节点加入集群命令,可以通过运行以下命令重新生成:

kubeadm token create --print-join-command --ttl 0

worker节点加入集群

1\在node1节点上执行如下命令,将其注册到 Cluster 中:

kubeadm join lb.k8s.local:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:7e25d6bc9368f5ab747c8c0b3349c5441005e0e15914cd4be1eac6351fb1e320 

2、通过 kubectl get nodes 查看节点的状态。

root@master1:~# kubectl get nodes -o wide
NAME      STATUS   ROLES           AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
master1   Ready    control-plane   22m     v1.28.1   192.168.72.30   <none>        Ubuntu 22.04.2 LTS   5.15.0-76-generic   containerd://1.7.3
master2   Ready    control-plane   4m34s   v1.28.1   192.168.72.31   <none>        Ubuntu 22.04.2 LTS   5.15.0-76-generic   containerd://1.7.3
master3   Ready    control-plane   3m48s   v1.28.1   192.168.72.32   <none>        Ubuntu 22.04.2 LTS   5.15.0-76-generic   containerd://1.7.3
node1     Ready    <none>          3m41s   v1.28.1   192.168.72.33   <none>        Ubuntu 22.04.2 LTS   5.15.0-76-generic   containerd://1.7.3

3、最终运行的pods

root@master1:~# kubectl get pods -A -o wide
NAMESPACE          NAME                                       READY   STATUS    RESTARTS      AGE   IP               NODE      NOMINATED NODE   READINESS GATES
calico-apiserver   calico-apiserver-866fdb498d-2jndc          1/1     Running   0             18m   10.244.137.69    master1   <none>           <none>
calico-apiserver   calico-apiserver-866fdb498d-672gj          1/1     Running   0             18m   10.244.137.70    master1   <none>           <none>
calico-system      calico-kube-controllers-57b4847fc8-zlf8t   1/1     Running   0             18m   10.244.137.66    master1   <none>           <none>
calico-system      calico-node-bxjhp                          1/1     Running   0             18m   192.168.72.30    master1   <none>           <none>
calico-system      calico-node-j2zxw                          1/1     Running   0             12m   192.168.72.31    master2   <none>           <none>
calico-system      calico-node-kjfhh                          1/1     Running   0             11m   192.168.72.33    node1     <none>           <none>
calico-system      calico-node-zmngb                          1/1     Running   0             11m   192.168.72.32    master3   <none>           <none>
calico-system      calico-typha-548dd44bd-hzj8b               1/1     Running   0             18m   192.168.72.30    master1   <none>           <none>
calico-system      calico-typha-548dd44bd-pjpn5               1/1     Running   0             11m   192.168.72.32    master3   <none>           <none>
calico-system      csi-node-driver-48xkx                      2/2     Running   0             18m   10.244.137.65    master1   <none>           <none>
calico-system      csi-node-driver-rtxt2                      2/2     Running   0             11m   10.244.136.1     master3   <none>           <none>
calico-system      csi-node-driver-ssfbh                      2/2     Running   0             11m   10.244.166.129   node1     <none>           <none>
calico-system      csi-node-driver-v8h9l                      2/2     Running   0             12m   10.244.180.1     master2   <none>           <none>
kube-system        coredns-66f779496c-ldfpv                   1/1     Running   0             23m   10.244.137.68    master1   <none>           <none>
kube-system        coredns-66f779496c-zx8rs                   1/1     Running   0             23m   10.244.137.67    master1   <none>           <none>
kube-system        etcd-master1                               1/1     Running   0             23m   192.168.72.30    master1   <none>           <none>
kube-system        etcd-master2                               1/1     Running   0             12m   192.168.72.31    master2   <none>           <none>
kube-system        etcd-master3                               1/1     Running   0             12m   192.168.72.32    master3   <none>           <none>
kube-system        kube-apiserver-master1                     1/1     Running   0             23m   192.168.72.30    master1   <none>           <none>
kube-system        kube-apiserver-master2                     1/1     Running   0             12m   192.168.72.31    master2   <none>           <none>
kube-system        kube-apiserver-master3                     1/1     Running   1 (12m ago)   12m   192.168.72.32    master3   <none>           <none>
kube-system        kube-controller-manager-master1            1/1     Running   1 (12m ago)   23m   192.168.72.30    master1   <none>           <none>
kube-system        kube-controller-manager-master2            1/1     Running   0             12m   192.168.72.31    master2   <none>           <none>
kube-system        kube-controller-manager-master3            1/1     Running   0             11m   192.168.72.32    master3   <none>           <none>
kube-system        kube-proxy-4dzjw                           1/1     Running   0             23m   192.168.72.30    master1   <none>           <none>
kube-system        kube-proxy-cqkbr                           1/1     Running   0             11m   192.168.72.32    master3   <none>           <none>
kube-system        kube-proxy-vcr8w                           1/1     Running   0             11m   192.168.72.33    node1     <none>           <none>
kube-system        kube-proxy-x6tkn                           1/1     Running   0             12m   192.168.72.31    master2   <none>           <none>
kube-system        kube-scheduler-master1                     1/1     Running   1 (12m ago)   23m   192.168.72.30    master1   <none>           <none>
kube-system        kube-scheduler-master2                     1/1     Running   0             12m   192.168.72.31    master2   <none>           <none>
kube-system        kube-scheduler-master3                     1/1     Running   0             12m   192.168.72.32    master3   <none>           <none>
kube-system        kube-vip-master1                           1/1     Running   1 (12m ago)   23m   192.168.72.30    master1   <none>           <none>
kube-system        kube-vip-master2                           1/1     Running   0             12m   192.168.72.31    master2   <none>           <none>
kube-system        kube-vip-master3                           1/1     Running   0             11m   192.168.72.32    master3   <none>           <none>
tigera-operator    tigera-operator-94d7f7696-b5fbl            1/1     Running   1 (12m ago)   19m   192.168.72.30    master1   <none>           <none>

验证集群高可用

1、关闭master1节点

root@master1:~# shutdown -h now

2、查看vip地址自动转移到master3节点

root@master3:~# ip a |grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.72.32/24 brd 192.168.72.255 scope global ens33
    inet 192.168.72.200/32 scope global ens33

3、在master3节点配置kubectl客户端连接信息

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

4、在master3节点验证依然能够正常访问集群

root@master3:~# kubectl get nodes
NAME      STATUS     ROLES           AGE   VERSION
master1   NotReady   control-plane   39m   v1.28.1
master2   Ready      control-plane   27m   v1.28.1
master3   Ready      control-plane   27m   v1.28.1
node1     Ready      <none>          27m   v1.28.1

至此,基于kube-vip的高可用集群部署完成。

Kubernetes kube-vip Kube-VIP 是一个轻量级、功能强大的 Kubernetes 虚拟 IP 管理工具,通过管理虚拟 IP 地址,提供了高可用性和负载均衡功能。它支持多种部署方式和网络协议,适用于多种场景,能够显著提高 Kubernetes 集群的可靠性和稳定性。 阅读详情

相关推荐

如何通过kube-vip实现K8S集群高可用及Service LB

与传统高可用+负载均衡机制相比较(如nginx/haproxy+keepalived) ,它属于云原生的高可用以及负载均衡机制,运行在群集之内,配置也更简单。当 kube-vip 启动后,将在所有匹配类型为 loadBalancer 的服务上启用一个名为 watcher 的监听器。此时可验证,群集master中的leader故障时(如关机),集群地址vip漂移到其他master节点,群集仍可用。注:如果有节点未加入群集,可修改如下参数,重新启动(以master03为例),

weixin_64274932的博客 1496

kube-vip实践

kube-vip 是一款专为 Kubernetes 设计的轻量级高可用(HA)和负载均衡工具,通过虚拟 IP(VIP)机制实现控制平面和服务的高可用性。kube-vip 通过简化高可用集群的部署和管理,成为 Kubernetes 生态中重要的轻量级工具。:利用 ARP 协议在局域网内广播 VIP 的 MAC 地址,通过领导者选举(Leader Election)动态绑定 VIP 到健康节点。:通过 BGP 协议将 VIP 路由信息广播到网络设备(如路由器),实现跨子网的高可用。

sre救赎之路 2030

告别云厂商LB:用kube-vip v0.6.2在Ubuntu 22.04上自建K8s高可用控制平面

本文详细介绍了如何使用kube-vip v0.6.2在Ubuntu 22.04上自建Kubernetes高可用控制平面,替代云厂商负载均衡服务。通过kube-vip的轻量级架构和原生K8s集成,实现低成本、高可靠的控制平面访问入口,特别适合私有云和边缘计算场景。文章包含完整的部署步骤、配置示例和故障转移测试,帮助用户快速构建生产级高可用集群。

weixin_30432579的博客 406

使用kube-vip的方式部署高可用的K8S集群

是一个轻量级、高性能的 Kubernetes主要用于在 Kubernetes 集群中实现或。👉 简单理解:kube-vip = 在 Kubernetes 里运行的 “VIP 浮动工具” + “内置的负载均衡器”。

ldl1116的博客 2246

基于BGP与UDM Pro实现Kubernetes高可用负载均衡的家庭实验室方案

在云原生和边缘计算场景中,负载均衡是确保服务高可用性的关键技术。其核心原理是通过智能分发网络流量,将请求导向多个后端服务实例,从而提升系统的容错能力和扩展性。传统方案如NodePort或硬件负载均衡器,往往存在配置复杂、成本高昂或灵活性不足的问题。随着BGP协议在小型网络设备中的普及,以及轻量级Kubernetes发行版如K3s的成熟,一种将企业级网络架构‘降维’应用于家庭实验室的创新方案成为可能。该方案利用BGP协议,让Kubernetes集群能动态向支持BGP的路由器宣告服务路由,实现流量的智能、高可用

weixin_33709219的博客 473

基于Rocky Linux 9 通过kubeadm部署Kubernetes + containerd + Cilium + Kube-vip高可用集群应用实践

本文详细介绍了在Rocky Linux 9上部署高可用Kubernetes集群的技术方案。采用三主节点架构,通过kubeadm工具集成了containerd容器运行时、Cilium网络插件(基于eBPF替代kube-proxy)和Kube-vip负载均衡组件。架构设计重点实现了控制平面的高可用性,包括etcd集群的Raft共识机制、API Server的VIP负载均衡,以及Cilium提供的高性能网络数据平面。拓扑图清晰展示了各节点组件间的交互关系,特别是kube-vip的VIP浮动机制和Cilium的跨节

pizicaiman的专栏 515

手把手教你使用 Kube-Vip 部署一个生产级别的高可用 Kubernetes 集群

公众号关注「奇妙的 Linux 世界」设为「星标」,每天带你玩转 Linux !kube-vip 可以在你的控制平面节点上提供一个 Kubernetes 原生的 HA 负载均衡,我们不需...

easylife206的专栏 6379

基于Docker运行时用kubespray部署国内高可用K8S集群实战

容器运行时是Kubernetes集群的底层依赖,Docker与containerd在CRI实现上存在差异。kubespray作为集群编排引擎,通过cri-dockerd适配层支持Docker运行时,结合国内镜像源和离线资源包可解决镜像拉取超时问题。该方案在私有化交付和信创环境中具有重要价值,适用于三master高可用集群部署、证书续签及版本升级等场景。本文聚焦基于Docker运行时的kubespray国内部署实践,涵盖镜像同步、参数配置与避坑指南。

weixin_29587015的博客 340

通过kube-vip实现K8S集群高可用及Service LB

下载方法:wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.8/cri-dockerd-0.3.8-3.el7.x86_64.rpm。下载方法:wget https://github.com/coreos/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz。下载或上传etcd-v3.5.0-linux-amd64.tar.gz包到/root目录。

2402_88627342的博客 1383

二进制高可用K8s集群一键部署实战指南

Kubernetes高可用集群是云原生基础设施的核心底座,其本质是通过多Master、多etcd、VIP漂移与强证书体系构建RPO=0、RTO<30s的容灾能力。二进制部署摒弃kubeadm黑盒抽象,直控kube-apiserver、etcd、kubelet等组件启动逻辑与TLS证书生命周期,实现配置可审计、故障可追溯、升级可灰度。该方案广泛应用于金融级订单系统、裸金属平台及SRE接管场景,尤其适合对SLA要求严苛、需深度定制cgroup driver、feature gate或证书SAN策略的生产环境。本

weixin_29274969的博客 5

kube-vip:Kubernetes 控制平面虚拟 IP 和负载均衡器

kube-vip 高可用性和负载平衡 概述 用于控制平面和 Kubernetes 服务的 Kubernetes 虚拟 IP 和负载均衡器 kube-vip背后的想法是一个适用于所有环境的小型独立的高可用性选项,尤其是: 裸机 边缘(手臂/树莓派) 虚拟化 几乎在其他任何地方:) 注意:所有使用和架构的文档现在都可以在。 特征 Kube-Vip 最初是为 Kubernetes 控制平面提供 HA 解决方案而创建的,随着时间的推移,它已经发展为将相同的功能合并到 Kubernetes 服务类型。 VIP 地址可以是 IPv4 或 IPv6 带有 ARP(第 2 层)或 BGP(第 3 层)的控制平面 使用或控制平面 带有 kubeadm(静态 Pod)的控制平面 HA 带有 K3s/和其他(守护进程)的控制平面 HA 使用 ARP服务负载均衡器(第 2 层) 通过 BGP 使

Kube-Vip服务负载均衡完全指南:提升K8s服务可用性

Kube-Vip是一款专为Kubernetes设计的Control Plane Virtual IP和Load-Balancer工具,它能够为Kubernetes集群提供高可用的虚拟IP服务和负载均衡能力,有效提升K8s服务的可用性和稳定性。 ## 什么是Kube-Vip? Kube-Vip是一个开源项目,主要功能是为Kubernetes集群提供虚拟IP(VIP)和负载均衡服务。它可以确保Ku

gitblog_00763的博客 642

【同花顺公式编辑教程】第3章 获取数据

学习同花顺公式编辑器,其提供的数据有量价数据以及财务数据。在本章中,我们讲解了编辑器执行代码的原理,并给出了可调用数据的汇总表。

LiaoYi2016218的博客 1万+

Kubeode:Kubernetes集群一键部署与高可用方案

Kubernetes作为容器编排的事实标准,其集群部署往往涉及复杂的证书配置、组件调优和网络设置。Kubeode通过封装这些底层细节,实现了真正意义上的二进制离线一键部署,特别适合国内网络环境。该工具整合了多版本k8s离线安装包,内置多Master高可用方案,并预集成Heketi+GlusterFS持久化存储、Prometheus监控等生态组件,形成完整的云原生解决方案。对于需要快速搭建生产级k8s平台的企业,Kubeode提供了一种高效可靠的部署方式,大幅降低了运维门槛。

weixin_33226548的博客 200

Coze视频混剪智能体工作流,1小时制作100条带货混剪视频,全平台通用

摘要:本文介绍如何利用Coze智能体工作流一键生成全平台带货混剪视频。该工作流支持双视频素材查重处理、智能文案重塑、画面重组等核心功能,通过多节点协同实现批量生产。系统可自动下载视频、提取字幕、生成新脚本,并完成剪辑合成,支持飞书表格批量操作。该工作流已在iThinkAi扣子团队空间开放复制使用,帮助用户高效制作爆款带货视频。

ai979290的博客 1084

深度学习十大算法之Word2Vec

Word2Vec的提出,标志着词嵌入技术的一次重大进步。Word2Vec是一种高效的词嵌入模型,由Google的研究团队于2013年开发。它使用一种称为神经网络的机器学习方法,通过学习大量文本数据,生成能够表达词语间丰富语义关系的词向量。Word2Vec的核心优势在于它能够捕捉到词语之间的细微关系。例如,在Word2Vec模型中,可以通过计算向量之间的距离来估计词语之间的相似度。这不仅能帮助理解语言的复杂性,还可以应用于各种NLP任务,如机器翻译和搜索引擎优化。

第欧根尼的酒桶的博客 1866

K8s 高可用集群搭建:两种架构方案与完整实战(Keepalived + HAProxy + MetalLB + Calico / Kube-VIP + Cilium)

手把手带你从零搭建一套生产可用的 Kubernetes 高可用集群。所谓「高可用」,就是当集群里的某台机器(尤其是负责入口流量的负载均衡节点)突然宕机时,整个集群依然能正常对外提供服务,不会因为单点故障而瘫痪。文章会介绍两套完整的高可用架构方案方案一:Keepalived + HAProxy + MetalLB + Calico。这是经典的传统方案,用 Keepalived 做 VIP 漂移、HAProxy 做流量分发、MetalLB 暴露服务、Calico 做容器网络,组件成熟、资料多、排障容易。

2302_81472886的博客 270

codevs 1620 轮船问题 DP 解题报告

某国家被一条河划分为南北两部分,在南岸和北岸总共有N对城市,每一城市在对岸都有唯一的友好城市,任何两个城市都没有相同的友好城市。

Hawo11的博客 818

Ubuntu 22.04部署Kubernetes集群的最佳实践

容器化技术通过cgroup和namespace实现资源隔离,其中Kubernetes作为容器编排系统的代表,依赖底层操作系统的支持。Ubuntu 22.04 LTS凭借其Linux 5.15内核对cgroup v2的原生支持,成为部署Kubernetes的理想平台。该版本不仅优化了容器调度性能,还预装了containerd 1.6+等关键组件,大幅提升了与kubelet的兼容性。在生产环境中,合理的硬件资源配置和系统调优(如网络参数调整、swap关闭等)对集群稳定性至关重要。通过kubeadm工具可以快速初

weixin_32667955的博客 241

013:无人机航线规划的概念

航线规划是无人机任务规划的核心环节,它决定了无人机在整个任务执行过程中的飞行路径。航线规划需要考虑多种因素,包括飞行时间、飞行距离、能源消耗、飞行安全等。

qq_31762031的博客 2444

实战交易策略 篇二十二:情绪流龙头交易策略

在股票市场中,机构主导趋势,游资驱动热点,散户易被情绪裹挟,形成“金字塔”式生态链,并存在情绪传递、强者恒强、物极必反的规律特点。股市是资金驱动的情绪博弈场,价格波动由群体心理、资金博弈和预期差共同驱动,核心是资本逐利性与人性贪婪恐惧的交织,兼具资源配置、财富再分配与风险定价功能。涨停加速与逃逸缺口(主升强化)凹字板/平台突破(趋势延续)天量弱转强(分歧买点)不参与首波(二波策略)情绪周期(道术合一)主线思维(聚焦核心)开盘抢筹(竞价博弈)一字助攻(情绪强化)分批进出(滚动操作)

生活在别处 1501

终极指南:如何快速部署轻量级Kubernetes集群使用k3s-ansible

k3s-ansible是部署自托管高可用性Kubernetes集群的最简单方法,通过自动化的方式使用kube-vip、MetalLB等组件实现完整的HA k3s etcd安装。本文将为新手和普通用户提供一份详细的部署指南,帮助你轻松构建属于自己的Kubernetes集群。 ## ✅ 系统准备要求 在开始部署之前,请确保你的环境满足以下要求: - **控制节点**:运行Ansible 2.11

gitblog_00077的博客 567

RK3588S之CPU--benchmark(一)

本章会基于RK3588S来介绍有关CPU常用的benchmark工具及测试过程

文艺小少年的博客 1499

Rocky Linux 二进制 安装K8S-1.35.0高可用集群

本文详细介绍了在Rocky Linux 10.1系统上部署Kubernetes v1.35.0集群的完整流程。主要内容包括: 环境准备:系统配置、网络规划、服务器信息 基础配置:关闭防火墙和SELinux、禁用swap分区、时间同步、内核参数优化 网络配置:IPVS模块加载和开机自启动 安全设置:SSH免密登录、证书生成 文章提供了详细的命令步骤,涵盖从系统初始化到Kubernetes基础环境搭建的全过程,适用于需要离线部署高可用Kubernetes集群的场景。

小五 1223

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: openstack-helm在kubernetes中部署单节点openstack
下一篇: Ubuntu 安装 jenkins
willops
博客等级 码龄12年 1816粉丝 232原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

willops

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值