利用 kube-vip 实现 K3s 高可用部署

news2024/11/15 23:25:49

作者简介
王海龙,Rancher 中国社区技术经理,Linux Foundation APAC Evangelist,负责 Rancher 中国技术社区的维护和运营。拥有 9 年的云计算领域经验,经历了 OpenStack 到 Kubernetes 的技术变革,无论底层操作系统 Linux,还是虚拟化 KVM 或是 Docker 容器技术都有丰富的运维和实践经验。

容器化和云原生应用快速发展,K3s 成为了备受瞩目的轻量级 Kubernetes 发行版。在生产环境中,单点故障可能导致整个集群的不可用,高可用对用户至关重要。

K3s 本身可以自动实现控制平面的高可用,但缺少一个具有高可用的访问控制平面入口;毕竟,用户不想依靠一个单一的节点来访问 Kubernetes 集群的 API。对此,用户可以借助 kube-vip 工具来实现 K3s 控制平面的高可用,从而确保 K3s 集群在面临故障时仍能提供稳定可靠的服务。本文将对此进行详细介绍。

什么是 kube-vip

kube-vip 是一个功能强大的工具,它可以通过虚拟 IP(VIP)来实现 Kubernetes 集群的高可用。它可以监控集群中的 Master 节点,并在主节点故障时自动切换到备用节点,以确保集群的持续可用性。

kube-vip 有两种使用模式:ARP 模式和 BGP 模式。这两种模式都可用于在 Kubernetes 集群中创建和管理高可用虚拟 IP 地址。

  • ARP 模式:在 ARP 模式下,kube-vip 使用 ARP(地址解析协议)来实现 IP 转发。它通过在集群中的节点之间发送 ARP 请求和响应来实现负载均衡和故障转移。当一个节点接收到 ARP 请求时,它会回答请求并接管 IP 地址。这种模式简单且易于配置,不需要任何其他的外部依赖。

  • BGP 模式:在 BGP 模式下,kube-vip 使用 BGP(边界网关协议)来实现 IP 转发。BGP 是一种用于在不同自治系统(AS)之间交换路由信息的路由协议。在 BGP 模式中,kube-vip 在 Kubernetes 集群内部模拟了一个 BGP 路由器,各个节点通过 BGP 会话将路由信息交换给 kube-vip,并由 kube-vip 将流量导向适当的节点。这种模式通常在需要与外部网络进行互连或实现更高级的路由策略时使用,它需要额外的配置和与网络设备(如路由器)的集成。

选择哪种模式取决于集群的需求和网络环境。ARP 模式简单易用,适合于较小规模的集群或在没有复杂网络配置的情况下。BGP 模式则适用于更大规模的集群,需要与外部网络进行交互或实现高级路由策略的情况下。

本文演示的示例采用的是 ARP 模式。更多使用方式可参考 kube-vip 文档:https://kube-vip.io/docs/

通过 kube-vip 实现 K3s 控制平面高可用

在下面的示例中,首先生成一个用于部署在 K3s 集群中的 kube-vip Manifest,然后再启动一个高可用的 K3s 集群,启动 K3s 集群时会自动部署 kube-vip 的 Manifest 文件,从而通过 kube-vip 实现控制平面的高可用。

创建 Manifests 文件夹

K3s 有一个可选的 Manifests 目录,K3s 启动时将检查该目录中的 yaml 文件,并自动在 K3s 中部署,参考:https://docs.k3s.io/installation/packaged-components#auto-deploying-manifests-addons

首先创建此目录,以便稍后将 kube-vip 资源放入其中:

mkdir -p /var/lib/rancher/k3s/server/manifests/

获取 kube-vip RBAC 清单

kube-vip 在 K3s 下作为 DaemonSet 运行,我们需要 RBAC 资源来确保 ServiceAccount 存在并进行绑定,来确保它具有与 API 服务器通信所需的权限。

获取 RBAC 清单并将其放置在自动部署目录中:

curl https://kube-vip.io/manifests/rbac.yaml > /var/lib/rancher/k3s/server/manifests/kube-vip-rbac.yaml

生成 kube-vip DaemonSet 清单

export VIP=192.168.205.200 # 设置虚拟 IP 用于访问控制平面的地址
export INTERFACE=ens3 # 设置控制平面所在主机的网卡名称
KVVERSION=$(curl -sL https://api.github.com/repos/kube-vip/kube-vip/releases | jq -r ".[0].name")  # 获取 kube-vip 版本
alias kube-vip="docker run --network host --rm ghcr.io/kube-vip/kube-vip:$KVVERSION" # 针对 docker 环境设置别名

# 创建 kube-vip 清单
kube-vip manifest daemonset \
    --interface $INTERFACE \
    --address $VIP \
    --inCluster \
    --taint \
    --controlplane \
    --services \
    --arp \
    --leaderElection > /var/lib/rancher/k3s/server/manifests/kube-vip.yaml

安装 HA K3s 集群

K3s 支持多种 HA 安装方式,本次示例采用嵌入式 ETCD 的方式搭建高可用的 K3s 集群,这样集群中就存在了 3 个控制平面,然后通过 kube-vip 实现这些控制平面的高可用。

安装 K3s 时需要指定 --tls-san 参数,这样 K3s 就会使用 kube-vip 虚拟 IP 地址生成 API 服务器证书。

启动第一个节点:

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \
    K3S_TOKEN=SECRET sh -s - server \
    --cluster-init \
    --system-default-registry "registry.cn-hangzhou.aliyuncs.com" \
    --tls-san 192.168.205.200

使用相同命令启动第二和第三个节点:

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \
    K3S_TOKEN=SECRET  sh -s - server \
    --server https://<ip or hostname of server1>:6443 \
    --system-default-registry "registry.cn-hangzhou.aliyuncs.com" \
    --tls-san 192.168.205.200

检查节点运行情况:

检查 kube-vip daemonset,我们应该会看到 kube-vip-ds 已经成功启动:

验证 K3s 控制平面的高可用

检查虚拟 IP 地址是否有效

kube-vip daemonset 启动成功后,应该看到 kube-vip 配置的虚拟 IP 地址可以 ping 通:

将 kubeconfig 更改为 kube-vip 的虚拟 IP 地址

将 K3s 生成的 kubeconfig 文件下载到本地,并将默认的 127.0.0.1 改为虚拟 IP 地址:192.168.205.200。

可以看到,使用虚拟机 IP 可以继续通过 kubeconfig 访问 Kubernetes API。

模拟 K3s 控制平面故障,kube-vip 虚拟 IP 切换

现在我们已经配置了 kube-vip,并且可以通过虚拟 IP 访问到某个控制平面。接下来让我们执行实际测试,看看 kube-vip 虚拟 IP 是否按预期进行故障转移。

此时,可以通过 ip addr show ens3 确认虚拟 IP 落在了 k3s1 主机上:

接下来,我们可以将 k3s1 主机关机,模拟故障:

正如所看到的,当 k3s1 主机发生故障,kube-vip 的虚拟 IP 可以自动切换到其他主机,并且我们可以继续使用该虚拟机 IP 去访问 Kubernetes API:

总 结

通过使用 kube-vip,我们可以轻松实现 K3s 控制平面的高可用。kube-vip 提供了一个简单而强大的解决方案,通过虚拟 IP 和自动切换机制,确保在 Master 节点故障时,集群仍能持续对外提供服务。

kube-vip 可以通过指定虚拟 IP 和监听端口来监控集群中的 Master 节点的健康状态,并在主节点故障时自动将虚拟 IP 切换到其他节点上。

总之,kube-vip 是实现 K3s 控制平面高可用的理想工具。它简单的安装和配置过程让任何用户都可以轻松部署和管理高可用的 K3s 集群。通过使用 kube-vip,用户可以放心地在生产环境中运行 K3s,并确保集群的持续可用性和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/739418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯音乐娱乐集团2023校园招聘技术类岗位编程题合集

字符串操作 题解&#xff1a;先变为没出现过的字符&#xff0c;然后在正常的变换 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** 返回满足题意的最小操作数* param str string字符串 给定…

Python绘制直方图

文章目录 初步参数绘图类型多组数据直方图对比 初步 对于大量样本来说&#xff0c;如果想快速获知其分布特征&#xff0c;最方便的可视化方案就是直方图&#xff0c;即统计落入不同区间中的样本个数。 以正态分布为例 import numpy as np import matplotlib.pyplot as pltxs…

用c++实现大小端序互转(字符串方法)

今天在逆一个RC4加密算法&#xff0c;忘了IDA如何自动将大小端序互转的按键&#xff0c;索性自己写了一个&#xff0c;因为是用字符串方法&#xff0c;所以理论上长度是管够的 #include <iostream> #include <string> using namespace std; int main() {string m_…

macOS 14 Sonoma Beta 测试版体验,不影响主力系统

今年的 WWDC 上 Apple 依旧保持往年的发布节奏&#xff0c;公布了今年的 macOS 新版本&#xff1a;macOS Sonoma&#xff0c;不过和以往有些不太一样的是&#xff0c;这一次 Apple 将测试版系统直接下发给了普通开发者账户&#xff0c;对于一般用户简单注册就可以直接获得 macO…

Windows VScode如何配置与使用git?

当我们在VScode中编写代码后&#xff0c;需要提交到git仓库时&#xff0c;但是我们又不想切换到git的命令行窗口&#xff0c;我们可以在VScode中配置git&#xff0c;然后就可以很方便快捷的把代码提交到仓库中。 1. 官网下载安装Git命令行工具 根据自己的电脑系统&#xff0c…

分布式ELK日志文件分析系统(曾经沧海难为水,除却巫山不是云)

文章目录 一、ELK 概述1. 为什么要使用 ELK2. 完整日志系统基本特征3. ELK 简介3.1 ElasticSearch&#xff08;ES&#xff09;3.2 Kiabana3.3 Logstash3.4 其它组件Filebeat缓存/消息队列Fluentd 4. ELK 的工作原理5. Linux 系统内核日志消息的优先级别 二、 部署 ELK 集群服务…

基于matlab检测交通视频中的汽车(附源码)

一、前言 此示例说明如何使用工具箱可视化和分析视频或图像序列。此示例来检测交通视频中的浅色汽车。请注意&#xff0c;VideoReader 的有些功能特定于平台&#xff0c;可能无法在某些平台上读取提供的 Motion JPEG2000 视频。 二、步骤 步骤 1&#xff1a;使用 VideoReade…

用IDEA写第一个Spring程序 HelloWorld

用IDEA写第一个Spring程序 HelloWorld 环境 Orcal JDK&#xff1a;1.8.0_341 maven&#xff1a;3.9.3 Spring&#xff1a;5.3.10 IDEA&#xff1a;2023.1.2 1. 安装JDK和IDEA 2. 安装maven并配置环境变量、换源 3. IDEA中maven属性配置&#xff0c;主要是版本和settings文件及…

React 新版官方文档 (一) useReducer 用法详解

useReducer useReducer 是一个可以让你向组件中添加 reducer 的 Hook const [state, dispatch] useReducer(reducer, initialArg, init?)基本用法 const reducer (state, action) > { ... } const MyComponent () > {const [state, dispatch] useReducer(reducer…

820. 递归求斐波那契数列

链接&#xff1a; 原题 题目&#xff1a; 请使用递归的方式求斐波那契数列的第 nn 项&#xff0c;下标从1开始。 斐波那契数列&#xff1a;1,1,2,3,5…1,1,2,3,5…&#xff0c;这个数列从第 33 项开始&#xff0c;每一项都等于前两项之和 输入格式 共一行&#xff0c;包含整数 …

npm 包和模块简介

目录 1、关于公共npm注册表 2、关于包和模块 2.1、关于包 2.2、关于包格式 2.3、npm包git URL格式 2.4、关于模块 3、关于范围 3.1、作用域和包的可见性 4、关于公共软件包 5、关于私有包 6、npm包范围、访问级别和可见性 1、关于公共npm注册表 公共npm注册表是Jav…

学习单片机的三个步骤:基础知识、编程语言和实践项目

当然&#xff01;学习单片机的过程可以分为以下三个步骤&#xff1a; 学习基础知识&#xff1a;在开始学习单片机之前&#xff0c;首先需要掌握一些基础知识。了解数字电子学和模拟电子学的基本原理是很重要的&#xff0c;包括数字和模拟信号、逻辑门、计数器、寄存器等。还需…

K8S应用安全检测(调用分析 容器健康 审计日志)

应用安全检测 1 应用安全检测1.1 调用分析1.1.1 sysdig基础1.1.2 命令实践 1.2 容器监控1.2.1 CAdvisor1.2.2 Falco基础1.2.3 Falco实践1.2.4 进阶实践1.2.5 可视化实践 1.3 审计日志1.3.1 日志解读1.3.2 审计日志 1 应用安全检测 1.1 调用分析 1.1.1 sysdig基础 学习目标 …

第六章 mac上用的软件

1、brew.sh/index_zh-cn 2、网易有道词典 3、SizeUP 4、 5、chrome浏览器插件 6、快捷键

最近,智慧公厕空位引导系统非常受园区、写字楼、工厂、大型商场青睐,大家都在争着上!

随着城市化进程的不断推进&#xff0c;楼宇智慧公厕管理系统的应用已经成为城市管理的重要一环。通过智能化的监控和管理&#xff0c;公厕的卫生状况得到了有效控制&#xff0c;为市民提供了更好的公厕服务。一、楼宇智慧公厕系统案例展示楼宇智慧公厕系统是一种基于智能科技的…

基础算法-差分矩阵

&#xff08;一&#xff09;课堂笔记 &#xff08;二&#xff09;思路详解 如果扩展到二维&#xff0c;我们需要让二维数组被选中的子矩阵中的每个元素的值加上c,是否也可以达到O(1)的时间复杂度。答案是可以的&#xff0c;考虑二维差分。 a[][]数组是b[][]数组的前缀和数组&a…

less预处理语言的运用之-变量拼接那点事

less语法的技巧总结&#xff0c;很基础&#xff0c;熟练掌握后能提高我们在大型项目中的开发效率 a:0.5; showdaw-px:100; mkcolor1:#6ec5ff; num:1; .outer{//拼接的字符串在变量后面&#xff0c;需要在冒号后面加~width:~"{showdaw-px}px";//拼接的字符串在冒号后…

Vue脚手架使用 【实战篇】

一、一个组件引用另一个组件&#x1f349; (1) 引入被引用的组件&#x1f95d; 自己创建的组件 lzq.vue 组件必须创建在components文件夹下 将自己创建的组件导入到主页面中 (2)声明该组件&#x1f95d; 本人理解&#xff1a; 声明组件可以理解为声明一个变量一样 (3)使用组…

【sql注入-报错注入2】GTID_SUBTRACT()函数 报错注入

目录 GTID_SUBTRACT()报错注入 一、语法介绍&#xff1a; 二、报错原因 网络安全小圈子 &#xff08;***注&#xff1a;注意看版本要求&#xff09; GTID_SUBTRACT()报错注入 一、语法介绍&#xff1a; 版本&#xff1a; MySQL >5.6 GTID_SUBTRACT()函数是MySQL中的一…

Unity20223.4f1中添加Tile的方法

如图&#xff0c;按顺序选择添加Rectangular&#xff08;矩形地图&#xff09;即可&#xff0c;矩形是常规瓦片地图 除常规瓦片地图外&#xff0c;Unity 还提供 Hexagonal Point Top Tilemap 和 Hexagonal Flat Top Tilemap 瓦片地图。六角形瓦片通常用于战略类桌面游戏&#x…