二进制部署k8s集群 部署高可用master节点
目录
本次部署的环境
一、master02 节点部署
二、负载均衡部署
安装nginx服务
部署keepalive服务
修改node节点上的配置文件
在master节点上创建pod
三、部署 Dashboard
二进制部署k8s集群部署的步骤总结
(1)k8s的数据存储中中心的搭建 etcd
(2)单机master节点的部署
(3)k8s的node节点的部署
(4)高可用k8s的搭建
在上一篇文章中,就已经完成了二进制k8s集群部署的搭建,但是单机master并不适用于企业的实际运用(因为单机master中,仅仅只有一台master作为节点服务器的调度指挥,一旦宕机。就意味着整个集群的瘫痪,所以成熟的k8s的集群一定要考虑到master的高可用。)
企业的运用一般至少存在两台master及其以上的部署(一般都是三台),本次将根据前面的部署,再添加一台master(三个master或者更多,也可以根据本次添加步骤重复添加)。添加master后,我们会将借助keepalived+nginx的架构,来实现高可用的master【也可以使用haproxy+keepalived或则是keepalived+lvs(不推荐,步骤过于复杂)】
除此之外,我们还将搭建出k8s的ui管理界面
本次部署的环境
| mater节点 | ||
| mater01 | 192.168.80.7 | kube-apiserver kube-controller-manager kube-scheduler |
| master02 | 192.168.80.17 | kube-apiserver kube-controller-manager kube-scheduler |
| node节点 | ||
| node01 | 192.168.80.11 | kubelet kube-proxy docker (容器引擎) |
| node02 | 192.168.80.12 | kubelet kube-proxy docker (容器引擎) |
| etcd cluster集群 | ||
| etcd节点1 | 192.168.80.7(mater01) | etcd |
| etcd节点2 | 192.168.80.11(node01) | etcd |
| etcd节点3 | 192.168.80.12(node02) | etcd |
| load balance(高可用调度器) | ||
| 主调度器 | 192.168.80.13 | nginx,keepalived |
| 从调度器 | 192.168.80.16 | nginx,keepalived |

架构说明:
node节点的kubelet只能对接一个master节点的apiserver,不可能同时对接多个master节点的apiserver。简而言之,node节只能有一个master来领导。
kubelet和kube-proxy是通过kubelet.kubeconfig和kube-proxy.kubeconfig文件中的server参数进行对接 master节点的。
所以在多master节点的环境下,需要有nginx负载均衡器来进行调度,而且需要进行keepalived高可用的构建(主从两个节点) ,防止主节点宕机导致整个k8s集群的不可用。
一、master02 节点部署
从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点scp -r /opt/etcd/ root@192.168.80.17:/opt/
scp -r /opt/kubernetes/ root@192.168.80.17:/opt/
scp -r /root/.kube root@192.168.80.17:/root
scp -r /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@192.168.80.17:/usr/lib/systemd/system/
修改master02配置文件kube-apiserver中的IP
vim /opt/kubernetes/cfg/kube-apiserverKUBE_APISERVER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/opt/kubernetes/logs \
--etcd-servers=https://192.168.80.7:2379,https://192.168.80.11:2379,https://192.168.80.12:2379 \
--bind-address=192.168.80.17 \
--secure-port=6443 \
--advertise-address=192.168.80.17 \
......

在 master02 节点上启动各服务并设置开机自启
systemctl enable --now kube-apiserver.service
systemctl enable --now kube-controller-manager.service
systemctl enable --now kube-scheduler.service
查看node节点状态
ln -s /opt/kubernetes/bin/* /usr/local/bin/
kubectl get nodes
kubectl get nodes -o wide#-o=wide:输出额外信息;对于Pod,将输出Pod所在的Node名
//此时在master02节点查到的node节点状态仅是从etcd查询到的信息,而此时node节点实际上并未与master02节点建立通信连接,因此需要使用一个VIP把node节点与master节点都关联起来

二、负载均衡部署
安装nginx服务
//配置load balancer集群双机热备负载均衡(nginx实现负载均衡,keepalived实现双机热备)
##### 在lb01、lb02节点上操作 #####
//配置nginx的官方在线yum源,配置本地nginx的yum源 (注意 epel源下载的 nginx 不支持stream)
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
EOFyum install nginx -y//修改nginx配置文件,配置四层反向代理负载均衡,指定k8s群集2台master的节点ip和6443端口
vim /etc/nginx/nginx.conf
events {worker_connections 1024;
}#添加
stream {log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';access_log /var/log/nginx/k8s-access.log main;upstream k8s-apiserver {server 192.168.80.7:6443;server 192.168.80.17:6443;}server {listen 6443;proxy_pass k8s-apiserver;}
}http {
......//检查配置文件语法
nginx -t //启动nginx服务,查看已监听6443端口
systemctl start nginx
systemctl enable nginx
netstat -natp | grep nginx

部署keepalive服务
//部署keepalived服务yum install keepalived -y//修改keepalived配置文件
vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {# 接收邮件地址notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}# 邮件发送地址notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id NGINX_MASTER #lb01节点的为 NGINX_MASTER,lb02节点的为 NGINX_BACKUPvrrp_skip_check_adv_addr#vrrp_strict #这里要注释vrrp_garp_interval 0vrrp_gna_interval 0
}#添加一个周期性执行的脚本
vrrp_script check_nginx {script "/etc/nginx/check_nginx.sh" #指定检查nginx存活的脚本路径
}vrrp_instance VI_1 {state MASTER #lb01节点的为 MASTER,lb02节点的为 BACKUPinterface ens33 #指定网卡名称 ens33virtual_router_id 51 #指定vrid,两个节点要一致priority 100 #lb01节点的为 100,lb02节点的为 90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.80.100/24 #指定 VIP}track_script {check_nginx #指定vrrp_script配置的脚本}
}//创建nginx状态检查脚本
vim /etc/nginx/check_nginx.sh
#!/bin/bash
#egrep -cv "grep|$$" 用于过滤掉包含grep 或者 $$ 表示的当前Shell进程ID,即脚本运行的当前进程ID号
count=$(ps -ef | grep nginx | egrep -cv "grep|$$")if [ "$count" -eq 0 ];thensystemctl stop keepalived
fichmod +x /etc/nginx/check_nginx.shscp /etc/keepalived/keepalived.conf root@192.168.80.16:/etc/keepalived/keepalived.confscp /etc/nginx/check_nginx.sh root@192.168.80.16:/etc/nginx/check_nginx.sh注意另外一台keepalive配置也要进行修改(需改内容已经用注释提示)
//启动keepalived服务(一定要先启动了nginx服务,再启动keepalived服务)
systemctl start keepalived
systemctl enable keepalived
ip a #查看VIP是否生成

关闭主节点的nginx服务,模拟故障,测试keepalived#关闭主节点lb01的Nginx服务,模拟宕机,观察VIP是否漂移到备节点systemctl stop nginxip addrsystemctl status keepalived #此时keepalived被脚本杀掉了 #备节点查看是否生成了VIPip addr #此时VIP漂移到备节点lb02#恢复主节点systemctl start nginx #先启动nginxsystemctl start keepalived #再启动keepalivedip addr

修改node节点上的配置文件
//修改node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP
cd /opt/kubernetes/cfg/
vim bootstrap.kubeconfig
server: https://192.168.80.100:6443vim kubelet.kubeconfig
server: https://192.168.80.100:6443vim kube-proxy.kubeconfig
server: https://192.168.80.100:6443//重启kubelet和kube-proxy服务
systemctl restart kubelet.service
systemctl restart kube-proxy.service//在 lb01 上查看 nginx 和 node 、 master 节点的连接状态
netstat -natp | grep nginx

在master节点上创建pod
/测试创建pod
kubectl run nginx --image=nginx//查看Pod的状态信息
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 0/1 ContainerCreating 0 14s #正在创建中kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 34m #创建完成,运行中kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 39m 10.244.0.3 192.168.80.11 <none> <none>
//READY为1/1,表示这个Pod中有1个容器
在对应网段的node节点上操作,可以直接使用浏览器或者curl命令访问

这时在master01节点上查看nginx日志
kubectl logs nginx

三、部署 Dashboard
Dashboard 介绍
仪表板是基于Web的Kubernetes用户界面。您可以使用仪表板将容器化应用程序部署到Kubernetes集群,对容器化应用程序进行故障排除,并管理集群本身及其伴随资源。您可以使用仪表板来概述群集上运行的应用程序,以及创建或修改单个Kubernetes资源(例如deployment,job,daemonset等)。
例如,您可以使用部署向导扩展部署,启动滚动更新,重新启动Pod或部署新应用程序。仪表板还提供有关群集中Kubernetes资源状态以及可能发生的任何错误的信息。
//在 master01 节点上操作
#上传 recommended.yaml 文件到 /opt/k8s 目录中
cd /opt/k8s
vim recommended.yaml
#默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:ports:- port: 443targetPort: 8443nodePort: 30001 #添加type: NodePort #添加 NodePort测试环境使用,生产环境不使用。selector:k8s-app: kubernetes-dashboardkubectl apply -f recommended.yaml#创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kube-systemkubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-adminkubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

使用输出的token登录Dashboard








二进制部署k8s集群部署的步骤总结
(1)k8s的数据存储中中心的搭建 etcd
etcd 安装步骤
准备 CA 证书和 私钥文件 ,首先 CA 签发服务端证书 和 私钥文件
使用 CA 证书 、服务端证书、私钥文件 还有etcd 集群配置文件 启动etcd服务
复制etcd工作目录和管理文件到另外几个etcd节点上并修改etcd的配置文件,然后启动etcd服务
最后使用 etcdctl 命令查看etcd集群的状态
(2)单机master节点的部署
master 组件
1、先安装 apiserver
1.1 准备apiserver的证书和私钥文件
准备bootstrap token 认证文件 (用于kubelet启动时签发证书时使用)
准备apiserver的配置文件
启动 apiserver 服务 端口是 6443 https
2、再安装controller-manager 和 scheduler
2.1 先准备相关的启动配置文件
然后再准备相关证书和私钥文件 生成 kubeconfig 文件(用于指定对接apiserver,使用什么证书认证)启动服务
准备kubeconfig文件 把kubectl 加入到集群中(指定对接apiserver,使用什么证书认证)
(3)k8s的node节点的部署
先部署docker 引擎
准备kubeconfig文件、kube-proxy.kubeconfig文件还有kubenetes组件(kubelet、kube-proxy)
对kubelet-bootstrap 用户授予权限,启动相应服务并通过 CSR 请求
- 安装CNI 网络插件实现 pod 跨主机的通信
- 安装CoreDNS 插件实现 service 名称解析到 clusterIP
(4)高可用k8s的搭建
首先引入新的master节点,然后把master01 节点上的证书文件、各master组件的配置文件和服务管理文件拷贝到 其它master 节点并修改配置文件。最后启动相关服务。
搭建nginx/Haproxy keepalived 高可用负载均衡器对master节点
修改 node节点上kubelet kube-proxy的 kubeconfig配置文件对接VIP
kubectl的配置文件也要对接VIP或者当前的节点
相关文章:
二进制部署k8s集群 部署高可用master节点
目录 本次部署的环境 一、master02 节点部署 二、负载均衡部署 安装nginx服务 部署keepalive服务 修改node节点上的配置文件 在master节点上创建pod 三、部署 Dashboard 二进制部署k8s集群部署的步骤总结 (1)k8s的数据存储中中心的搭建 etcd &…...
linux创建私有docker仓库以及推拉
创建私有仓库: 1.下载 registry镜像。 2.执行 registry 镜像(#为注释内容,\为换行): docker run -d \# --restartalways每次都是开机自动启动--restartalways \# --name registry 表示容器名--name registry \# 表示…...
如何将照片从 iPhone 传输到闪存驱动器【无质量损坏】
概括 人们喜欢用 iPhone 拍照,因为照片通常都很漂亮,这都要归功于 iPhone 令人惊叹的技术。但照片更新后会占用更多空间,并且您可能会开始收到没有存储空间的通知。因此,您可以将照片传输到 USB 驱动器,然后从 iPhone…...
【MySQL精通之路】InnoDB(7)-锁和事务模型(2)-事务模型
主博客: 【MySQL精通之路】InnoDB(7)-锁和事务模型-CSDN博客 上一篇: 【MySQL精通之路】InnoDB(7)-锁和事务模型(1)-锁-CSDN博客 下一篇: 目录 1.事务隔离级别 2.1 可重复读 2.2 读已提交 2.3 读取未提交 2.4 序列化读 2.自动提交、…...
python中的可哈希和不可哈希
python 中的每一个对象都有一个哈希值,哈希值是一个固定长度的整数,它通常用于快速比较对象的相等性。 如果在对象的生命周期里该对象的哈希值从未改变,那么这个对象是可哈希的(hashable),也称为不可变的。…...
docker命令详解大全
Docker是一种流行的容器化平台,用于快速部署应用程序并管理容器的生命周期。以下是一些常用的Docker命令及其用途的概述: docker run:创建一个新容器并运行一个命令。docker ps:列出当前运行的容器。docker stop:停止…...
体检系统商业源码,C/S架构的医院体检系统源码,大型健康体检中心管理系统源码
体检系统商业源码,C/S架构的医院体检系统源码,大型健康体检中心管理系统源码 体检信息管理系统软件是对医院体检中心进行系统化和规范化的管理。系统从检前,检中,检后整个业务流程提供标准化以及精细化的解决方案。实现体检业务市…...
Vue CLI 的服务介绍与使用(2024-05-20)
1、介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,提供: 通过 vue/cli 实现的交互式的项目脚手架。 通过 vue/cli vue/cli-service-global 实现的零配置原型开发。 一个运行时依赖 (vue/cli-service),该依赖: 可升级…...
java连接ldap实现查询
文章目录 一、项目背景二、准备工作三、验证结果四、易错点讲解易错点1:java: 无法访问org.springframework.ldap.core.LdapTemplate易错点2:java: 无法访问org.springframework.context.ConfigurableApplicationContext易错点3:[LDAP: error…...
openjudge_2.5基本算法之搜索_2990:符号三角形
题目 2990:符号三角形 总时间限制: 1000ms 内存限制: 65536kB 描述 符号三角形的第1行有n个由“”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”“,2个异号下面是”-“ 。计算有多少个不同的符号三角形,使其所含”…...
springboot错误
错误总结 1、使用IDEA 的 initialalzer显示2、IDEA 新建文件 没有 java class3、java: 错误: 不支持发行版本 22解决方法4、IDEA-SpringBoot项目yml配置文件不自动提示解决办法 1、使用IDEA 的 initialalzer显示 IDEA创建SpringBoot项目时出现:Initialization fail…...
linux的用户管理
新建用户:1.useradd 2.passwd 完成的操作: (1)/etc/passwd添加一行 (2)/etc/shadow添加一行 (3)/etc/group添加一行 (4)创建用户家目录 (5)创建用户邮件文件 例:创建用户jerry,要求: uid:777&am…...
数美滑块研究
周一,在清晨的阳光照耀下,逆向山脚下的小镇宁静而安详。居民们忙碌地开始一天的生活,而在爬虫镇子的边缘,一座古朴的道观显得格外神秘。 阿羊正静静地坐在青石长凳上,摸鱼养神。突然,一道清脆的声音在他耳…...
【GESP试卷】2024年03月Scratch四级试卷
2024年GESP03月认证Scratch四级试卷 分数:100 题数:27 一、单选题(共15题,每题2分,共30分) 010203040506070809101112131415CDBBACBCDCDADBA 1、小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙&…...
每日一题《leetcode--398.随机数索引》
https://leetcode.cn/problems/random-pick-index/ 根据题目所知,所给的数组中有重复的元素。让我们随机输出给定的目标数字的下标索引。 typedef struct {int *sum;int length; } Solution;Solution* solutionCreate(int* nums, int numsSize) {Solution* obj (So…...
【MySQL精通之路】MySQL的使用(9)-设置环境变量
可以在命令提示符下设置环境变量,以影响命令处理器的当前调用,也可以永久设置环境变量以影响未来的调用。 要永久设置变量,可以在启动文件中进行设置,也可以使用系统为此提供的接口进行设置。 有关具体细节,请参阅命…...
JDBC(Java DataBase Connectivity)Java数据库连接
JDBC(Java DataBase Connectivity) Java 语言连接数据库 再本模块中,java提供里一组用于连接数据库的类和接口Java 语言开发者,本身没有提供如何具体连接数据库的功能只是定义了一组java程序连接数据库的访问接口 连接到数据库向数据库发送增,修改,删除这一类的sql发送查询sq…...
1.Redis之初识Redis分布式系统
1.初识Redis 1.1 官网 Redis中文网 Redis 教程 | 菜鸟教程 (runoob.com) 1.2 解释 在内存中存储数据 定义变量,不就是在内存中存储数据嘛?? Redis 是在分布式系统(进程的隔离性:Redis 就是基于网络,可以把自己内存中的变量给别的进程…...
基于SpringBoot的网盘系统设计与实现
第1章 绪论... 1 1.1 研究背景与意义... 1 1.1.1 研究背景... 1 1.1.1 研究意义... 1 1.2 国内外研究现状... 2 1.2.1 国内研究现状... 2 1.2.2 国外研究现状... 3 1.3 论文组织架构... 4 第2章 关键技术介绍... 5 2.1 SpringBoot. 5 2.2 MySQL数据库... 5 2.3 MVC架…...
【C++初阶】vector
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
