搭建高可用k8s

高可用只针对于api-server,需要用到nginx + keepalived,nginx提供4层负载,keepalived提供vip(虚拟IP)

系统采用openEuler 22.03 LTS

1. 前期准备

因为机器内存只有16G,所有我采用3master + 1node

1.1 修改主机配置(所有节点操作)

  1. 修改主机名

  2. 关闭防火墙,selinux

  3. 关闭swap

  4. 配置时间同步

主机过多,我只写master01的操作

# 修改主机名
[root@localhost ~]# hostnamectl set-hostname master01
[root@localhost ~]# bash
# 关闭防火墙,selinux
[root@master01 ~]# systemctl disable --now firewalld
[root@master01 ~]# setenforce 0
[root@master01 ~]# sed -i s"/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
# 关闭swap
[root@master01 ~]# swapoff -a
# 配置时间同步
[root@master01 ~]# yum install chrony -y
[root@master01 ~]# chronyc sources

1.2 开启ipvs(所有节点)

[root@master01 ~]# cat > /etc/sysconfig/modules/ipvs.modules << END
> #!/bin/bash
> ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
> for kernel_module in ${ipvs_modules};do
>   /sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
>   if [ 0 -eq 0]; then
>   /sbin/modprobe ${kernel_module}
>   fi
> done
> END
[root@master01 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules 
[root@master01 ~]# bash /etc/sysconfig/modules/ipvs.modules

1.3 配置k8s yum源(所有节点)

# 直接到华为镜像站搜索kubernetes
[root@master01 ~]#  cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.huaweicloud.com/kubernetes/yum/repos/kubernetes-el7-$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://mirrors.huaweicloud.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.huaweicloud.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

使用欧拉的话需要将$basearch 改为自己的架构 x86_64

2. 安装docker(所有节点)

由于欧拉目前最高支持k8s的版本是1.23 ,所以需要安装docker

2.1 安装

[root@master01 ~]# yum install docker -y

2.2 修改docker配置

[root@master01 ~]# vim /etc/docker/daemon.json
{"exec-opts":["native.cgroupdriver=systemd"]
}

2.3 重启docker

[root@master01 ~]# systemctl daemon-reload
[root@master01 ~]# systemctl restart docker

3. 配置高可用(所有master节点)

3.1 安装软件包

[root@master01 ~]#  yum install nginx nginx-all-modules keepalived -y

3.2 配置nginx负载

在nginx的配置文件内加入一下内容

[root@master01 ~]# vim /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;events {worker_connections 1024;
}
# 添加这一段,要写在http段之外,因为我们用的是四层负载,并不是七层负载
stream {upstream k8s-apiserver {server 192.168.200.163:6443;server 192.168.200.164:6443;server 192.168.200.165:6443;}server {listen 16443;proxy_pass k8s-apiserver;}
}
# 到这里结束# 检测语法
[root@master01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful# 重启
[root@master01 ~]# systemctl restart nginx

3.3 配置keepalived

# 备份原有配置
[root@master01 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# 修改配置
[root@master01 ~]# vim /etc/keepalived/keepalived.conf 
global_defs {router_id master1
}vrrp_instance Nginx {state MASTER           # 只有master01写MASTER,其他master写BACKUPinterface ens33        # 写上网卡virtual_router_id 51priority 200           # 其他节点的值要低于这个,另外2个节点的值也不要一样advert_int 1authentication {auth_type PASSauth_pass 123}virtual_ipaddress {192.168.200.200     # 写VIP}
}
# 重启
[root@master01 ~]# systemctl restart keepalived.service

将原本的配置项都删除,写入这些内容

注意:只有master01的 state 是MASTER,其他2个节点应该写为BACKUP。且priority要低于master01

3.4 验证keepalived

# 查看master01的ens33
[root@master01 ~]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:8d:ce:8a brd ff:ff:ff:ff:ff:ffaltname enp2s1inet 192.168.200.163/24 brd 192.168.200.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.200.200/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::ce91:fe4e:625d:6e32/64 scope link noprefixroute valid_lft forever preferred_lft forever

现在他有自己的iP和VIP

# 停掉keepalived
[root@master01 ~]# systemctl stop keepalived.service 
[root@master01 ~]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:8d:ce:8a brd ff:ff:ff:ff:ff:ffaltname enp2s1inet 192.168.200.163/24 brd 192.168.200.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::ce91:fe4e:625d:6e32/64 scope link noprefixroute valid_lft forever preferred_lft forever

停掉之后vip不存在了,切换到master02 来看看

[root@master02 ~]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:2d:b0:8a brd ff:ff:ff:ff:ff:ffaltname enp2s1inet 192.168.200.164/24 brd 192.168.200.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.200.200/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::f409:2f97:f02e:a8d4/64 scope link noprefixroute valid_lft forever preferred_lft forever

现在vip跑到master02了,将master01的keepalived启动,vip会回来,因为master01的

优先级高于他

[root@master01 ~]# systemctl restart keepalived.service 
[root@master01 ~]# systemctl enable --now nginx keepalived.service 
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service → /usr/lib/systemd/system/keepalived.service.

4. 部署k8s

欧拉目前只支持1.23版本,所以目前的容器运行时是docker,没有写执行节点那么就是master01

4.1 安装软件包(所有master节点)

[root@master01 ~]# yum install kubeadm kubelet kubectl -y
[root@master01 ~]# systemctl enable kubelet

4.3 生成部署文件

[root@master01 ~]# kubeadm config print init-defaults > init.yaml

4.3.1 修改部署文件
[root@master01 ~]# vim init.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.200.163       # 这个地方需要修改为自己的IP地址  bindPort: 6443
nodeRegistration:criSocket: /var/run/dockershim.sockimagePullPolicy: IfNotPresentname: master01 # 这个地方改成你的主机名或者IP,作用是集群部署出来之后在集群内显示的名称,这里写什么到时候就是什么taints: null
---
apiServer:timeoutForControlPlane: 4m0scertSANs:  # 添加这一整段,目的是让这些地址所在的主机都能够使用证书- master01- master02- master03- 127.0.0.1- localhost- kubernetes- kubernetes.default- kubernetes.default.svc- kubernetes.default.svc.cluster.local- 192.168.200.163  # 这里3个是master的IP地址- 192.168.200.164- 192.168.200.165- 192.168.200.200  # VIP也需要写上
controlPlaneEndpoint: 192.168.200.200:16443  # 添加这一行,IP为VIP
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:local:dataDir: /var/lib/etcd
imageRepository: swr.cn-east-3.myhuaweicloud.com/hcie_openeuler   # 镜像仓库要改为国内的
kind: ClusterConfiguration
kubernetesVersion: 1.23.1   # 改为kubeadm版本一样的
networking:dnsDomain: cluster.localpodSunbet: 10.244.0.0/12  # 添加这一行serviceSubnet: 10.96.0.0/12
scheduler: {}
---   # 添加这一整段
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs

4.4 提前拉取镜像

# 这是在部署之前提前先把镜像拉取下来
[root@master01 ~]# kubeadm config images pull --config ./init.yaml

4.5 开始部署

[root@master01 ~]# kubeadm init --upload-certs --config ./init.yaml 
# 如果安装失败了可以执行kubeadm reset -f 重置环境再来init,如果直接init会报错

执行成功之后会输出一些信息

  mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configYou can now join any number of the control-plane node running the following command on each as root:
# 加入新的master节点使用这个命令kubeadm join 192.168.200.200:16443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:de0e41b3bc59d2879af43da29f3f25cc1b133efda1f202d4c4ce5f865cad71d3 \--control-plane --certificate-key 8be5d0b8d4914a930d58c4171e748210cbdd118befa0635ffcc1031b7840386ePlease note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.Then you can join any number of worker nodes by running the following on each as root:
# 加入node节点就使用这个命令
kubeadm join 192.168.200.200:16443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:de0e41b3bc59d2879af43da29f3f25cc1b133efda1f202d4c4ce5f865cad71d3 

4.6 其他master节点加入集群

生成的token只有24小时有效,如果token过期了还需要有节点加入集群的话可以执行

[root@master01 ~]# kubeadm token create --print-join-commandkubeadm join 192.168.200.200:16443 --token gb00dz.tevdizf7mxqx1egj --discovery-token-ca-cert-hash sha256:de0e41b3bc59d2879af43da29f3f25cc1b133efda1f202d4c4ce5f865cad71d3 这个命令可以直接让node节点加入

如果需要加入master节点,那么需要加上 --control-plane --certificate-key 8be5d0b8d4914a930d58c4171e748210cbdd118befa0635ffcc1031b7840386e

[root@master02 ~]# kubeadm join 192.168.200.200:16443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:de0e41b3bc59d2879af43da29f3f25cc1b133efda1f202d4c4ce5f865cad71d3 \--control-plane --certificate-key 8be5d0b8d4914a930d58c4171e748210cbdd118befa0635ffcc1031b7840386e
[root@master02 ~]# mkdir -p $HOME/.kube
[root@master02 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master02 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config	[root@master03 ~]# kubeadm join 192.168.200.200:16443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:de0e41b3bc59d2879af43da29f3f25cc1b133efda1f202d4c4ce5f865cad71d3 \--control-plane --certificate-key 8be5d0b8d4914a930d58c4171e748210cbdd118befa0635ffcc1031b7840386e
[root@master03 ~]# mkdir -p $HOME/.kube
[root@master03 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master03 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config	

可以使用 --node-name 指定加入集群后的名字

4.7 node节点加入集群

[root@node ~]# kubeadm join 192.168.200.200:16443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:de0e41b3bc59d2879af43da29f3f25cc1b133efda1f202d4c4ce5f865cad71d3

4.8 查看集群节点

[root@master01 ~]# kubectl get nodes
NAME       STATUS     ROLES                  AGE   VERSION
master01   NotReady   control-plane,master   45m   v1.23.1
master02   NotReady   control-plane,master   27m   v1.23.1
master03   NotReady   control-plane,master   27m   v1.23.1
node       NotReady   <none>                 10s   v1.23.1

5. 安装网络插件 calico

没安装网络插件之前状态是NotReady,装完之后就是Ready

calico官方安装文档

在官方文档里面可以找到最新的版本

[root@master01 ~]# wget https://docs.projectcalico.org/archive/v3.23/manifests/calico.yaml
[root@master01 ~]# kubectl apply -f calico.yaml

稍等一会之后,查看集群节点状态

[root@master01 ~]# kubectl get nodes
NAME       STATUS   ROLES                  AGE     VERSION
master01   Ready    control-plane,master   5h38m   v1.23.1
master02   Ready    control-plane,master   5h21m   v1.23.1
master03   Ready    control-plane,master   5h21m   v1.23.1
node       Ready    <none>                 4h53m   v1.23.1

如果登了很久还没有ready的话可以使用

[root@master01 ~]# kubectl get pods -A

看看那些pod没有起来,找到原因并解决之后就可以了

6. 验证集群是否可用

[root@master01 ~]# kubectl run web01 --image nginx:1.24
pod/web01 created
[root@master01 ~]# kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
web01   1/1     Running   0          27s

能够正常启动pod

文章转载自:FuShudi

原文链接:https://www.cnblogs.com/fsdstudy/p/18233538

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

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

相关文章

扩散模型会成为深度学习的下一个前沿领域吗?

文章目录 一、说明二、 第 1 部分&#xff1a;了解扩散模型2.1 什么是扩散模型2.2 正向扩散2.3 反向扩散 三、他们的高成本四、扩散模型的用处五、为什么扩散模型如此出色六、第 2 部分&#xff1a;使用扩散模型生成6.1 用于自然语言处理和 LLM 的文本扩散6.2 音频视频生成6.3 …

下载安装Thonny并烧录MicroPython固件至ESP32

Thonny介绍 一、Thonny的基本特点 面向初学者&#xff1a;Thonny的设计初衷是为了帮助Python初学者更轻松、更快速地入门编程。它提供了直观易懂的用户界面和丰富的功能&#xff0c;降低了编程的门槛。轻量级&#xff1a;作为一款轻量级的IDE&#xff0c;Thonny不会占用过多的…

RDK X3(aarch64) 测试激光雷达思岚A1

0. 环境 - 亚博智能的ROSMASTER-X3 - RDK X3 1.0 0.1 资料 文档资料 https://www.slamtec.com/cn/Support#rplidar-a-series SDK https://github.com/slamtec/rplidar_sdk ROS https://github.com/slamtec/rplidar_ros https://github.com/Slamtec/sllidar_ros2 1. robostu…

NestJs Prisma常见问题(避坑指南)

关联模型操作 查询子模型多对一情况下&#xff0c;不需要include被关联模型也能查出自己外键id多对一模型新增数据时&#xff0c;被关联的外键传值&#xff0c;如果model配置的外键为非必填(?)&#xff0c;创建将会报错&#xff0c;多对一不能将外键设置为空持久化数据到数据…

SpringBoot实现上传头像(查看头像)

SpringBoot实现上传头像给功能和查看头像功能 文章目录 目录 文章目录 1.上传头像 1.这里的AppConfig记得定义一下 2.引入AppConfig 3.上传文件代码 2.获取头像 1.实现readFile方法 1.上传头像 首先我的代码中在application.properties中设置了上传文件的根目录 project.folder…

1310. 子数组异或查询 异或 前缀和 python

有一个正整数数组 arr&#xff0c;现给你一个对应的查询数组 queries&#xff0c;其中 queries[i] [Li, Ri]。 对于每个查询 i&#xff0c;请你计算从 Li 到 Ri 的 XOR 值&#xff08;即 arr[Li] xor arr[Li1] xor ... xor arr[Ri]&#xff09;作为本次查询的结果。 并返回一…

CPASSOC代码详解

加载环境 library("MASS") require(MASS) # Modern Applied Statistics with S&#xff0c;"S"指的是S语言&#xff0c;由贝尔实验室的约翰钱伯斯&#xff08;John Chambers&#xff09;等人开发。S语言是R语言的前身&#xff0c;许多R语言的语法和功能都…

《精通ChatGPT:从入门到大师的Prompt指南》附录B:推荐阅读资源

作者&#xff1a;斯图尔特拉塞尔 (Stuart Russell) 和 彼得诺维格 (Peter Norvig) 简介&#xff1a;这本书被誉为人工智能领域的经典教材&#xff0c;内容涵盖了AI的基本原理、算法及其应用。无论是入门者还是专业研究者&#xff0c;都能从中获得启发。 2. 《深度学习》 作者…

【目标跟踪网络训练 Market-1501 数据集】DeepSort 训练自己的跟踪网络模型

前言 Deepsort之所以可以大量避免IDSwitch&#xff0c;是因为Deepsort算法中特征提取网络可以将目标检测框中的特征提取出来并保存&#xff0c;在目标被遮挡后又从新出现后&#xff0c;利用前后的特征对比可以将遮挡的后又出现的目标和遮挡之前的追踪的目标重新找到&#xff0…

企业网页制作

随着互联网的普及&#xff0c;企业网站已成为企业展示自己形象、吸引潜在客户、开拓新市场的重要方式。而企业网页制作则是构建企业网站的基础工作&#xff0c;它的质量和效率对于企业网站的成败至关重要。 首先&#xff0c;企业网页制作需要根据企业的特点和需求进行规划。在网…

前端 移动端 手机调试 (超简单,超有效 !)

背景&#xff1a;webpack工具构建下的vue项目 1. 找出电脑的ipv4地址 2. 替换 host 3. 手机连接电脑热点或者同一个wifi 。浏览器打开链接即可。

Spring运维之业务层测试数据回滚以及设置测试的随机用例

业务层测试数据回滚 我们之前在写dao层 测试的时候 如果执行到这边的代码 会在数据库 里面留下数据 运行一次留一次数据 开发有开发数据库&#xff0c;运行有运行数据库 我们先连数据库 在pom文件里引入mysql的驱动和mybatis-plus的依赖 在数据层写接口 用mybatis-plus进…

浅谈JDBC

文章目录 一、什么是 JDBC&#xff1f;二、JDBC 操作流程三、JDBC代码例子 一、什么是 JDBC&#xff1f; JDBC是一种可用于执行SQL语句的JAVA API&#xff0c;是链接数据库和JAVA应用程序的纽带。JDBC一般需要进行3个步骤&#xff1a;与数据库建立一个链接、向数据库发送SQL语…

当AGI能够自我复制并传播到任意电脑时,会怎样?

当人工通用智能&#xff08;AGI&#xff09;具备自我复制能力&#xff0c;并能够传播到任何一台计算机作为宿主机时&#xff0c;这种情景可能带来一系列深远的影响和挑战。以下是一些潜在的影响和可能的结果&#xff1a; 1. 安全威胁与恶意利用 AGI的自我复制和传播能力可能被…

openh264 场景变化检测算法源码分析

文件位置 openh264/codec/processing/scenechangedetection/SceneChangeDetection.cppopenh264/codec/processing/scenechangedetection/SceneChangeDetection.h 代码流程 说明&#xff1a; 通过代码流程分析&#xff0c;当METHOD_SCENE_CHANGE_DETECTION_SCREEN场景类型为时…

Web前端工资调整:深入剖析与全面解读

Web前端工资调整&#xff1a;深入剖析与全面解读 在快速发展的互联网行业中&#xff0c;Web前端技术日新月异&#xff0c;而与之紧密相关的工资调整也成为了业内热议的话题。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;深入剖析Web前端工资调整的原因、趋势、…

Linux -- 了解 vim

目录 vim Linux 怎么编写代码&#xff1f; 了解 vim 的模式 什么是命令模式&#xff1f; 命令模式下 vim 的快捷键&#xff1a; 光标定位&#xff1a; 复制粘贴&#xff1a; 删除及撤销&#xff1a; 注释代码&#xff1a; 什么是底行模式&#xff1f; ​编辑 ​编辑…

Java:111-SpringMVC的底层原理(中篇)

这里续写上一章博客&#xff08;110章博客&#xff09;&#xff1a; 现在我们来学习一下高级的技术&#xff0c;前面的mvc知识&#xff0c;我们基本可以在67章博客及其后面相关的博客可以学习到&#xff0c;现在开始学习精髓&#xff1a; Spring MVC 高级技术&#xff1a; …

输入与随机数

Java的两个类库 输入 如何实现键盘输入&#xff1f;我们需要了解到Scanner这个类&#xff0c;其作用于及键盘输入。 类库&#xff1a;java.util 如何使用&#xff1f;分为3步走&#xff1a; 导入包&#xff08;一般idea会帮做&#xff09; import java.util.Scanner;创建对…

Java学习日志26:Double.NEGATIVE_INFINITY与Double.MIN_VALUE的区别

Double.NEGATIVE_INFINITY 和 Double.MIN_VALUE 都是 Java 中 Double 类的静态成员&#xff0c;但它们表示的含义不同。 Double.NEGATIVE_INFINITY 表示双精度浮点数的负无穷大。它是一个特殊的数值&#xff0c;在数值计算中通常用于表示一些特殊情况&#xff0c;比如除以零的…