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

#服务器 #部署 #云原生 #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-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 192.168.16.200bindPort: 6443
nodeRegistration:criSocket: unix:///var/run/containerd/containerd.sockimagePullPolicy: IfNotPresentname: k8s-master1 #这里是机子的hosttaints: null
---
apiServer:timeoutForControlPlane: 4m0scertSANs:- 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.localserviceSubnet: 10.96.0.0/12podSubnet: 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.rhkb.cn/news/116675.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科技探究之旅--亲子研学活动

2023年8月26日,广州市从化区齐家社会工作服务中心(以下简称“齐家”)的“星乐园-乡村儿童公益辅导服务项目”组织了新开村及西湖村助学点24对亲子到广州市白云区文搏3D打印基地进行“科技探究之旅--亲子研学”活动,旨在发现、点燃…

用Go编写ChatGPT插件

ChatGPT插件平台有望成为影响深远的"下一件大事",因此对于开发者来说,有必要对ChatGPT插件的开发有一定的了解。原文: Writing a ChatGPT Plugin With Go[1] 我工作的附带福利之一是偶尔可以接触试用一些很酷的新技术,最近的一项技…

实战:基于卷积的MNIST手写体分类

前面实现了基于多层感知机的MNIST手写体识别,本章将实现以卷积神经网络完成的MNIST手写体识别。 1. 数据的准备 在本例中,依旧使用MNIST数据集,对这个数据集的数据和标签介绍,前面的章节已详细说明过了,相对于前面章…

控制goroutine 的并发执行数量

goroutine的数量上限是1048575吗? 正常项目,协程数量超过十万就需要引起重视。如果有上百万goroutine,一般是有问题的。 但并不是说协程数量的上限是100多w 1048575的来自类似如下的demo代码: package mainimport ( "fmt" "ma…

MySQL的mysql-bin.00xx binlog日志文件的清理

目录 引言手工清理配置自动清理 引言 公司一个项目生产环境mysql数据盘占用空间增长得特别快,经过排查发现是开启了mysql的binlog日志。如果把binlog日志关闭,如果操作万一出现问题,就没有办法恢复数据,很不安全,只能…

WPF怎么实现文件拖放功能winform怎么实现拖拽功能

WPF怎么实现文件拖放功能winform怎么实现文件拖拽功能,在管理员模式下wpf winform怎么实现文件的拖拽功能 WPF实现文件拖放功能,正常情况并没有什么问题,但是如果你的程序使用管理员身份启动,你就会发现文件拖放功能就会失效。同…

css元素定位:通过元素的标签或者元素的id、class属性定位

前言 大部分人在使用selenium定位元素时,用的是xpath元素定位方式,因为xpath元素定位方式基本能解决定位的需求。xpath元素定位方式更直观,更好理解一些。 css元素定位方式往往被忽略掉了,其实css元素定位方式也有它的价值&…

全新纠错码将量子计算提效10倍!

上周,来自两个研究小组的最新模拟报告称,一类新兴的量子纠错码的效率比目前的“黄金标准”(即表面码)高出一个数量级。 量子纠错码的工作原理都是将大量容易出错的量子比特转换成更小的“受保护”量子比特,这些量子比特…

前端Vue仿企查查天眼查高管信息列表组件

随着技术的不断发展,传统的开发方式使得系统的复杂度越来越高。在传统开发过程中,一个小小的改动或者一个小功能的增加可能会导致整体逻辑的修改,造成牵一发而动全身的情况。为了解决这个问题,我们采用了组件化的开发模式。通过组…

Ansible学习笔记8

group模块: 创建一个group组: [rootlocalhost ~]# ansible group1 -m group -a "nameaaa gid5000" 192.168.17.105 | CHANGED > {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}…

穿上App外衣,保持Web灵魂——PWA温故

早在2015年,设计师弗朗西斯贝里曼和Google Chrome的工程师亚历克斯罗素提出“PWA(渐进式网络应用程序)”概念,将网络之长与应用之长相结合,其核心目标就是提升 Web App 的性能,改善 Web App以媲美Native的流…

HttPClient简介及示例:学习如何与Web服务器进行通信

文章目录 前言一、引入依赖二、使用步骤1.创建被调用者2.创建调用者三、结果被调用者服务:调用者服务: 总结 前言 欢迎来到本篇博客,这是一个关于HttPClient的入门案例的指南。🎉 在今天的网络世界中,与服务器进行数据…

qt.qpa.plugin:找不到Qt平台插件“wayland“|| (下载插件)Ubuntu上解决方案

相信大家也都知道这个地方应该做什么,当然是下载这个qt平台的插件wayland,但是很多人可能不知道怎么下载这个插件。 那么我现在要说的这个方法就是针对这种的。 sudo apt install qtwayland5完事儿了奥兄弟们。 看看效果 正常了奥。

FFmpeg5.0源码阅读——FFmpeg大体框架(以GIF转码为示例)

摘要:前一段时间熟悉了下FFmpeg主流程源码实现,对FFmpeg的整体框架有了个大概的认识,因此在此做一个笔记,希望以比较容易理解的文字描述FFmpeg本身的结构,加深对FFmpeg的框架进行梳理加深理解,如果文章中有…

java从入门到起飞(六)——用Socket实现网络通信

文章目录 背景网络编程网络编程三要素 2.DatagramSocket之UDP通信程序2.1 UDP发送数据2.2UDP接收数据2.3 3. Socket之TCP通信程序3.1TCP发送数据3.2TCP接收数据 背景 网络编程 ● 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线…

Matlab图像处理-加法运算

加法运算 图像加法运算的一个应用是将一幅图像的内容叠加到另一幅图像上,生成叠加图像效果,或给图像中每个像素叠加常数改变图像的亮度。 在MATLAB图像处理工具箱中提供的函数imadd()可实现两幅图像的相加或者一幅图像和常量的相加。 程序代码 I1 i…

剑指 Offer 44. 数字序列中某一位的数字(中等)

题目: class Solution { //本题单纯找规律,要注意通过n%digits来判断有几个位数为digits的数 public:int findNthDigit(int n) {long base 9, digits 1; //digits代表位数while(n-base*digits>0){ //该循环是为了确定目标数字所在…

指针(一)------指针概念+指针类型+野指针+指针运算+二级指针

💓博主csdn个人主页:小小unicorn ⏩专栏分类:C语言 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 指针(一) 指针是什么指针…

WordPress关注公众号可见内容插件源码

Wordpress公众号引流工具——关注公众号可见内容插件推荐 通过关注微信公众号,获取随机验证码从而获得隐藏文本的访问权限。 插件特点 隐藏内容扫码关注获取验证码 可以作为引流公众号 支持无必须API接口,无备案域名也可以 自定义验证接口URL 自定…

java八股文面试[数据库]——B树和B+树的区别

B树是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(logn)的时间复杂度进行查找、顺序读取、插入和删除等操作。 1、B树的特性 B树中允许一个结点中包含多个key,可以是3个、4个、5个甚至更多,并不确定,需要看具体的实…