【二】kubernetes master单节点拓展为集群

news2025/1/14 1:16:01

#服务器 #部署 #云原生 #k8s

一、 前言

一、ubuntu20.04上搭建containerd版( 1.2.4 以上)k8s及kuboard V3

接上文中,我们已经部署好了单节点master的k8s集群,在生产环境中,单节点的master肯定是不行的,那么我们如何对master进行集群的拓展呢?

对master拓展,实际上就是对api-server的拓展,只要对其做个负载均衡即可。

本文选型 haproxy + keepalive 方案来实现。当然也可以选择 nginx + keepalive。

二、 haproxy 介绍

HAProxy是一款专注于负载均衡和代理的高性能软件,它的核心功能就是负载均衡,能够有效地将来自客户端的请求分发到多个后端节点。

为什么选用 haproxy 而不是 nginx?

  • HAProxy主要专注于高可用性和负载均衡,将客户端请求分发到多个服务器,以实现高性能和高可用性的应用部署。
  • Nginx也可以用作反向代理和负载均衡,但它更广泛地被用于作为静态内容服务器和应用服务器,同时还能提供缓存、SSL终止等功能。
  • HAProxy提供了丰富的负载均衡算法,可以根据需求选择合适的算法,例如加权轮询、最少连接、源IP哈希等,以更好地适应不同的应用场景。Nginx在负载均衡算法方面的选择相对较少。
    这并不是说Nginx不适合用于Kubernetes集群的Master节点,而是在这个特定的场景下,HAProxy由于其专注性、负载均衡算法和高可用性特点,更容易满足Master节点集群的需求。

三、keepalive 介绍

Keepalived 是一个用于实现高可用性和故障转移的开源工具,它通常与负载均衡器(如HAProxy)等配合使用,以确保在集群中的服务器或服务发生故障时能够实现快速的切换和恢复,从而保证服务的持续可用性。

为什么有haproxy还需要keepalive?

尽管HAProxy可以实现负载均衡,但在发生主节点故障时,单独的HAProxy实例可能需要一些时间来进行重新配置和重新分发请求。Keepalived则提供了一种快速的故障切换机制,它能够迅速检测到主节点的失效,并将虚拟IP(VIP)迁移到备用节点,实现几乎无感知的故障转移。

四、实操

假设master的机子ip为192.168.16.200,201,202
worker的机子:192.168.16.203,192.168.16.204,192.168.16.205
虚拟ip为192.168.16.210

虚拟 IP 地址应该是网络上可用的、未被分配的,并且适合你要实现的服务或应用。在配置中,你会将这个虚拟 IP 地址列入 `virtual_ipaddress` 配置项中,使 Keepalived 的 MASTER 实例能够在活动时绑定并使用它。
vim /etc/hosts

将虚拟ip加入到hosts文件中

192.168.16.200 k8s-master1
192.168.16.201 k8s-master2
192.168.16.202 k8s-master3
192.168.16.203 k8s-node1
192.168.16.204 k8s-node2
192.168.16.205 k8s-node3
#将虚拟ip加入到hosts文件中
192.168.16.210 k8s-cluster

在不同的机子上 设置各自的hostname

hostname k8s-master1
hostname k8s-master2
hostname k8s-master3
hostname k8s-node1
hostname k8s-node2
hostname k8s-node3

1、haproxy

1)安装haproxy

在所有master机子上安装haproxy

sudo apt-get update
sudo apt-get install -y haproxy

2)编辑haproxy的配置文件

sudo vim /etc/haproxy/haproxy.cfg

在配置文件最下方加入 两个监听器

#配置了一个监听器,用于提供统计信息和管理界面。
listen  admin_stats
bind 0.0.0.0:1080
mode http
log 127.0.0.1 local0 err
stats refresh 30s
stats uri /status #管理界面的访问路径
stats realm welcome login\ Haproxy
stats auth admin:admin #登录认证
stats hide-version
stats admin if TRUE

#配置了一个监听器,用于转发流量到Kubernetes主节点。
listen kube-master
bind 0.0.0.0:8443 #负载均衡的端口为8848
mode tcp
option tcplog
balance source
server 192.168.16.200 192.168.16.200:6443 check inter 2000 fall 2 rise 2 weight 1
server 192.168.16.201 192.168.16.201:6443 check inter 2000 fall 2 rise 2 weight 1
server 192.168.16.202 192.168.16.202:6443 check inter 2000 fall 2 rise 2 weight 1

3)设置开机启动,并进入管理界面

systemctl enable haproxy && systemctl restart haproxy

查看haproxy页面:

http://192.168.16.200:1080/status

账号/密码:
admin/admin
请添加图片描述

💡 由于还没初始化k8s的master, 这里其余两台都还不可用。

2、keepalive

1)安装keepalive

在所有master机子上安装keepalive

apt-get install -y keepalived

2)编辑keepalive的配置文件

  • 查看可用的网卡
ip addr

我的是ens33

![[Pasted image 20230823231343.png]]

vim /etc/keepalived/keepalived.conf
  • master1 (192.168.16.200)
global_defs {
	script_user root
router_id k8s-lb
enable_script_security
}

vrrp_script check-haproxy {
script "/usr/bin/killall -0 haproxy"
interval 5
weight -30
}

vrrp_instance VI-kube-master {
state MASTER #200为主节点
priority 120 #主节点权重要大点
dont_track_primary
interface ens33 #上面的网卡
virtual_router_id 80
advert_int 3
track_script {
check-haproxy
}
virtual_ipaddress {
192.168.16.210
}
}
  • master2 (192.168.16.201) ,master3 (192.168.16.202)
global_defs {
	script_user root
router_id k8s-lb
enable_script_security
}

vrrp_script check-haproxy {
script "/usr/bin/killall -0 haproxy"
interval 5
weight -30
}

vrrp_instance VI-kube-master {
state BACKUP #设置为从节点
priority 110
dont_track_primary
interface ens33 #上面的网卡
virtual_router_id 68
advert_int 3
track_script {
check-haproxy
}
virtual_ipaddress {
192.168.16.210
}
}

3)依次在master1 master2 master3 上启动

systemctl enable keepalived  && systemctl start keepalived  && systemctl status keepalived

keepalived启动成功之后,在master1上通过ip addr可以看到vip(192.168.16.210)已经绑定到ens33这个网卡上了

![[Pasted image 20230823231446.png]]

3、k8s master集群拓展

1)以下操作在master1执行

备份一下之前k8s master的配置文件

mv init-default.yaml init-default.yaml.bak
vim init-default.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.16.200
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: k8s-master1 #这里是机子的host
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
  certSANs:
   - k8s-cluster
   - k8s-master1
   - k8s-master2
   - k8s-master3
   - k8s-node1
   - k8s-node2
   - k8s-node3
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.27.4 #根据实际版本修改
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16
scheduler: {}
controlPlaneEndpoint: k8s-cluster:8443
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind:  KubeProxyConfiguration
mode: ipvs
  • 主要修改的部分:
  1. controlPlaneEndpoint 为控制面设置一个稳定的 IP 地址或 DNS 名称。
controlPlaneEndpoint: k8s-cluster:8443
  1. 设置 API 服务器签署证书所用的额外主题替代名
certSANs:
 - k8s-master1
 - k8s-master2
 - k8s-master3
 - k8s-node1
 - k8s-node2
- k8s-node3

将k8s集群的host都加入到certSANs中,因为我只有三台服务器,所以node1和node2其实也是master2和master3。按你实际的服务器情况修改即可。

  1. 当前ubuntu系统默认开启了ipvs, 后续k8s部署的kube-proxy组件将会使用ipvs模式,提高转发效率。
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind:  KubeProxyConfiguration
mode: ipvs
  1. 重新初始化master
#重置初始化
kubeadm reset -f
#配置kubetl
rm -rf /root/.kube/
mkdir -p /root/.kube/

sudo kubeadm init --upload-certs --config=init-default.yaml --ignore-preflight-errors=all

跟第一章一样看到token信息,拷贝保存一下

  • master的join命令
kubeadm join k8s-cluster:8443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:8ae4635e544e225c19a0b303a75de62169a910c6d44095903340526f0fdd2c2d \
        --control-plane --certificate-key 7dbedbba04cb0f5582ecb06ef78eabfe587de17f4393fe38fd772c5573e66d3d
  • worker的join命令
kubeadm join k8s-cluster:8443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:8ae4635e544e225c19a0b303a75de62169a910c6d44095903340526f0fdd2c2d

执行以下命令

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

检查是否有启动成功

curl -k https://k8s-cluster:8443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s
  • 重新安装flannel
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

#如果你修改了`podCIDR` yml中也要修改
export POD_SUBNET=10.244.0.0/16
sed -i "s#10.244.0.0/16#${POD_SUBNET}#" kube-flannel.yml
kubectl apply -f kube-flannel.yml

使用以下命令查看镜像拉取状态,pending可能是还在下载镜像

watch kubectl get pods -n kube-system -o wide

等全部镜像变成RUNNING状态后,master状态也会变成Ready

kubectl get nodes

2)master2、master3加入集群

  1. 安装k8s

第一章已经安装过了,这里就不重复了

  1. 重新初始化节点的信息

由于我之前这两台服务器上初始过worker,所以重新清除掉

#重置初始化
kubeadm reset -f
#配置kubetl
rm -rf /root/.kube/
mkdir -p /root/.kube/
  1. master2 master3加入集群
kubeadm join k8s-cluster:8443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:8ae4635e544e225c19a0b303a75de62169a910c6d44095903340526f0fdd2c2d \
        --control-plane --certificate-key 7dbedbba04cb0f5582ecb06ef78eabfe587de17f4393fe38fd772c5573e66d3d

赋予权限

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

检查状态,全部READY

kubectl get nodes

进入haproxy查看集群状态
http://192.168.16.210:1080/status

请添加图片描述

全部正常启动!

3)worker集群重新加入master

kubeadm join k8s-cluster:8443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:8ae4635e544e225c19a0b303a75de62169a910c6d44095903340526f0fdd2c2d

在master1上检查状态

kubectl get nodes -o wide  
kubectl get pods --all-namespaces -o wide

至此整个k8s多master的环境就部署好啦!

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

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

相关文章

论文阅读_变分自编码器_VAE

英文名称: Auto-Encoding Variational Bayes 中文名称: 自编码变分贝叶斯 论文地址: http://arxiv.org/abs/1312.6114 时间: 2013 作者: Diederik P. Kingma, 阿姆斯特丹大学 引用量: 24840 1 读后感 VAE 变分自编码(Variational Autoencoder)是一种生…

9.1作业

字体对话框、颜色对话框、文件对话框、保存和打开文件 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void W…

rtsp 拉流 gb28181 收流 经AI 算法 再生成 rtsp server (一)

1、 rtsp 工具 1 vlc 必备工具 2 wireshark 必备工具 3 自己制作的工具 player 使用tcp 拉流,不自己写的话,使用ffmpeg 去写一个播放器就行 4 live555 编译好live555, 将live555的参数修改以下,主要是缓存大小 文章使用c 来写一…

Git的基本使用笔记——狂神说

版本控制 版本迭代, 版本控制( Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。 实现跨区域多人协同开发 追踪和记载一个或者多个文件的…

如何利用 Instagram Stories 促进小型企业发展

图片来源:SaleSmartly官网 社交媒体的存在对于小型企业来说是必须的。最近的一项研究表明,大约 80% 的客户在向小型企业购买产品之前会进行在线研究,超过 60% 的小型企业投资社交媒体营销以提供相关信息并吸引客户。 流行的社交媒体平台多种多…

2023年05月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:问题求解 给定一个正整数N,求最小的M满足比N大且M与N的二进制表示中有相同数目的1。 举个例子,假如给定N为78,二进制表示为1001110,包含4个1,那么最小的比N大的并且二进制表示中只包含4个1的数是83&a…

软件测试之“支付功能”测试

01、测试思维 要分析测试点之前,我们先来梳理一下测试思维。总结来说,任何事物的测试思路都可以总结如下: 第一步:梳理产品的核心业务流程:明白这是个什么项目,实现了什么业务,以及是怎么实现…

三、定长内存池

三、定长内存池 我们知道申请内存使用的是malloc,malloc其实就是一个通用的大众货,什么场景下都可以使用,而什么场景下都可以用就意味着什么场景下都不会有很高的性能,下面我们就先来设计一个定长内存池作为一个开胃菜&#xff0…

全能图片转文字:多功能图片处理软件

全能图片转文字是一款支持将图片文件实时转换为文字的处理软件。该软件可以帮助用户快速地获取图片文件中的文字内容,减少人工摘录的时间和成本,同时具备图片转excel、智能配音及PDF编辑等其他热门功能,轻松满足办公、学习中的各类需求。支持…

基于costas环的载波同步系统matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................................ I_Dataroun…

2001-2022年全国各区县最低工资数据

2001-2022年全国各区县最低工资数据 1、时间:2001-2022年 2、来源:人社部 3、指标:年份、行政区划代码、地区、所属省份、所属城市、经度、纬度、最低工资-每月、最低工资-小时 4、样本量:5.5万条 5、指标解释:最低工资标准是…

使用 Node-RED 构建 DolphinDB 低代码平台

前言 DolphinDB 是由浙江智臾科技有限公司研发的一款高性能分布式时序数据库,集成了功能强大的编程语言和高容量高速度的流数据分析系统,为海量结构化数据的快速存储、检索、分析及计算提供一站式解决方案。DolphinDB 数据库支持每秒百万级数据写入&…

Qt---对话框 事件处理 如何发布自己写的软件

目录 一、对话框 1.1 消息对话框(QMessageBox) 1> 消息对话框提供了一个模态的对话框,用来提示用户信息,或者询问用户问题并得到回答 2> 基于属性版本的API 3> 基于静态成员函数版本 4> 对话框案例 1、ui界面 …

天地图pc端显示正常,app不能显示

问题:天地图在pc端显示正常,但是app端不能显示 原因:天地图官网区分服务端key和客户端key 更换一下key就可以了 app端需要申请服务端key, pc端和h5使用客户端key

前端是leyui后端sqlserver和maraDB进行分页

项目场景&#xff1a; 前端是leyui后端sqlserver和maraDB进行分页,两种数据库在后端分页的不同写法 解决方案&#xff1a; 前端: 定义table,表格的格式在接口返回时进行创建,根据id进行绑定 <div class"layui-tab-item layui-show" style"padding-top: 10…

恒运资本:股票跌100%后怎么办?

在股票市场里&#xff0c;股票价格跌涨是日常的现象&#xff0c;有时候涨到令人惊喜&#xff0c;有时候却一路跌向谷底。股价跌到零的情况并不常见&#xff0c;可是&#xff0c;假如是跌了100%怎么办呢&#xff1f; 在探究该问题前&#xff0c;咱们需要了解股票跌100%是怎样的…

【Terraform学习】Terraform动态块基础操作(Terraform模块)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

微机原理 || 8253接口芯片知识点+4道经典例题+手写解题过程

&#xff08;二&#xff09;经典考题&#xff1a; 【例1】: 设8253端口地址为300H&#xff5e;303H&#xff0c;要求计数器2工作在方式5&#xff0c;二进制计数&#xff0c;CLK22MHz&#xff0c;OUT21KHz。试按上述要求完成8253的初始化。 【例2】&#xff1a;选择计数器0工…

【Postman】postman生成测试报告完整步骤(包含命令与newman安装教程链接)

文章目录 一、前提二、导出Postman脚本三、生成测试报告 一、前提 前提准备&#xff1a; 已安装好Newman 指引文章&#xff1a;Newman安装与环境配置完整版文章 Newman是一款基于nodejs开发的可以运行Postman脚本的工具&#xff0c;并可以生成测试报告。 二、导出Postman脚本…

探索UniApp分包

目录 什么是UniApp分包&#xff1f; UniApp分包的原理 优势 如何使用UniApp分包 1.manifest.json文件配置 2.静态图片资源分包注意事项 3.pages.json配置 结论 探索UniApp分包&#xff1a;优化移动应用性能与用户体验 在移动应用开发领域&#xff0c;性能和用户体验是至…