K8S集群Master高可用实践

本文将在前文基础上介绍k8s集群的高可用实践,一般来讲,k8s集群高可用主要包含以下几个内容:
1、etcd集群高可用
2、集群dns服务高可用
3、kube-apiserver、kube-controller-manager、kube-scheduler等master组件的高可用

其中etcd实现的办法较为容易,具体实现办法可参考前文:
http://blog.51cto.com/ylw6006/2095871

集群dns服务高可用,可以通过配置dns的pod副本数为2,通过配置label实现2个副本运行在在不同的节点上实现高可用。

kube-apiserver服务的高可用,可行的方案较多,具体介绍可参考文档:
https://jishu.io/kubernetes/kubernetes-master-ha/

kube-controller-manager、kube-scheduler等master组件的高可用相对容易实现,运行多份实例即可。

一、环境介绍

master节点1: 192.168.115.5/24 主机名:vm1
master节点2: 192.168.115.6/24 主机名:vm2
VIP地址: 192.168.115.4/24 (使用keepalived实现)
Node节点1: 192.168.115.6/24 主机名:vm2
Node节点2: 192.168.115.7/24 主机名:vm3

操作系统版本:centos 7.2 64bit
K8s版本:1.9.6 二进制部署

本文演示环境是在前文的基础上,已有k8s集群(1个master节点、2个node节点上),实现k8s集群master组件的高可用,关于k8s环境的部署请参考前文链接!
1、配置Etcd集群和TLS认证 ——> http://blog.51cto.com/ylw6006/2095871
2、Flannel网络组件部署 ——> http://blog.51cto.com/ylw6006/2097303
3、升级Docker服务 ——> http://blog.51cto.com/ylw6006/2103064
4、K8S二进制部署Master节点 ——> http://blog.51cto.com/ylw6006/2104031
5、K8S二进制部署Node节点 ——> http://blog.51cto.com/ylw6006/2104692

二、证书更新

在vm1节点上完成证书的更新,重点是要把master相关ip全部全部加入到列表里面

# mkdir api-ha && cd api-ha
# cat k8s-csr.json    
{"CN": "kubernetes","hosts": ["127.0.0.1","192.168.115.4","192.168.115.5","192.168.115.6","10.254.0.1","kubernetes","kubernetes.default","kubernetes.default.svc","kubernetes.default.svc.cluster","kubernetes.default.svc.cluster.local"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "FuZhou","L": "FuZhou","O": "k8s","OU": "System"}]
}# cfssl gencert -ca=/etc/ssl/etcd/ca.pem \-ca-key=/etc/ssl/etcd/ca-key.pem \-config=/etc/ssl/etcd/ca-config.json \-profile=kubernetes k8s-csr.json | cfssljson -bare kubernetes# mv *.pem /etc/kubernetes/ssl/

三、配置master组件

1、复制vm1的kube-apiserver、kube-controller-manager、kube-scheduler文件到vm2节点上

# cd /usr/local/sbin
# scp -rp  kube-apiserver  kube-controller-manager  kube-scheduler  vm2:/usr/local/sbin/

2、复制vm1的证书文件到vm2节点上

# cd /etc/kubernetes/ssl
# scp -rp ./* vm2:/etc/kubernetes/ssl

3、配置服务并启动服务

# cat /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target[Service]
ExecStart=/usr/local/sbin/kube-apiserver \--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \--advertise-address=0.0.0.0 \--bind-address=0.0.0.0 \--insecure-bind-address=127.0.0.1 \--authorization-mode=RBAC \--runtime-config=rbac.authorization.k8s.io/v1alpha1 \--kubelet-https=true \--enable-bootstrap-token-auth=true \--token-auth-file=/etc/kubernetes/token.csv \--service-cluster-ip-range=10.254.0.0/16 \--service-node-port-range=1024-65535 \--tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem \--tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \--client-ca-file=/etc/ssl/etcd/ca.pem \--service-account-key-file=/etc/ssl/etcd/ca-key.pem \--etcd-cafile=/etc/ssl/etcd/ca.pem \--etcd-certfile=/etc/ssl/etcd/server.pem \--etcd-keyfile=/etc/ssl/etcd/server-key.pem \--etcd-servers=https://192.168.115.5:2379,https://192.168.115.6:2379,https://192.168.115.7:2379 \--enable-swagger-ui=true \--allow-privileged=true \--apiserver-count=3 \--audit-log-maxage=30 \--audit-log-maxbackup=3 \--audit-log-maxsize=100 \--audit-log-path=/var/lib/audit.log \--event-ttl=1h \--v=2
Restart=on-failure
RestartSec=5
Type=notify
LimitNOFILE=65536[Install]
WantedBy=multi-user.target
# cat /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/GoogleCloudPlatform/kubernetes[Service]
ExecStart=/usr/local/sbin/kube-scheduler \--address=127.0.0.1 \--master=http://127.0.0.1:8080 \--leader-elect=true \--v=2
Restart=on-failure
RestartSec=5[Install]
WantedBy=multi-user.target
# cat /usr/lib/systemd/system/kube-controller-manager.service 
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes[Service]
ExecStart=/usr/local/sbin/kube-controller-manager \--address=127.0.0.1 \--master=http://127.0.0.1:8080 \--allocate-node-cidrs=true \--service-cluster-ip-range=10.254.0.0/16 \--cluster-cidr=172.30.0.0/16 \--cluster-name=kubernetes \--cluster-signing-cert-file=/etc/ssl/etcd/ca.pem \--cluster-signing-key-file=/etc/ssl/etcd/ca-key.pem \--service-account-private-key-file=/etc/ssl/etcd/ca-key.pem \--root-ca-file=/etc/ssl/etcd/ca.pem \--leader-elect=true \--v=2
Restart=on-failure
RestartSec=5[Install]
WantedBy=multi-user.target
# systemctl enable kube-apiserver
# systemctl enable kube-controller-manager
# systemctl enable kube-scheduler
# systemctl start kube-apiserver
# systemctl start kube-controller-manager
# systemctl start kube-scheduler

注意:

vm1上的api-server配置文件需要将--advertise-address、--bind-address两个参数修改为全网监听

四、安装和配置keepalived

# yum -y install keepalived
# cat /etc/keepalived/keepalived.conf   
! Configuration File for keepalived  
global_defs {  notification_email {   ylw@fjhb.cn}   notification_email_from admin@fjhb.cnsmtp_server 127.0.0.1  smtp_connect_timeout 30  router_id LVS_MASTER  
}  vrrp_script check_apiserver {script "/etc/keepalived/check_apiserver.sh"interval 3
}  vrrp_instance VI_1 {  state MASTERinterface ens33virtual_router_id 60  priority 100  advert_int 1  authentication {  auth_type PASS  auth_pass k8s.59iedu.com}  virtual_ipaddress {  192.168.115.4/24}track_script {   check_apiserver}
}
# cat /usr/lib/systemd/system/keepalived.service  
[Unit]
Description=LVS and VRRP High Availability Monitor
After=syslog.target network-online.target kube-apiserver.service
Require=kube-apiserver.service[Service]
Type=forking
PIDFile=/var/run/keepalived.pid
KillMode=process
EnvironmentFile=-/etc/sysconfig/keepalived
ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID[Install]
WantedBy=multi-user.target

注意:

vm2节点上需要修改state为BACKUP, priority为99 (priority值必须小于master节点配置值)

# cat /etc/keepalived/check_apiserver.sh
#!/bin/bash
flag=$(systemctl status kube-apiserver &> /dev/null;echo $?)
if [[ $flag != 0 ]];thenecho "kube-apiserver is down,close the keepalived"systemctl stop keepalived
fi
# chmod +x /etc/keepalived/check_apiserver.sh 
# systemctl daemon-reload
# systemctl enable keepalived
# systemctl start keepalived

五、修改客户端配置

1、Kubelet.kubeconfig 、bootstrap.kubeconfig、kube-proxy.kubeconfig 配置

# grep 'server' /etc/kubernetes/kubelet.kubeconfig 
server: https://192.168.115.4:6443
# grep 'server' /etc/kubernetes/bootstrap.kubeconfig 
server: https://192.168.115.4:6443
# grep 'server' /etc/kubernetes/kube-proxy.kubeconfig server: https://192.168.115.4:6443

2、confing配置

# grep 'server' /root/.kube/config 
server: https://192.168.115.4:6443

3、重启客户端服务

# systemctl restart kubelet 
# systemctl restart kube-proxy

六、测试

1、关闭服务前的集群状态,VIP在vm1节点上
K8S集群Master高可用实践

K8S集群Master高可用实践

2、在vm1上将kube-apiserver服务停止,可以看到VIP消息,但任何可以连接master获取pod信息
K8S集群Master高可用实践
日志显示vip被自动移除
K8S集群Master高可用实践
3、在vm2上能看到自动注册上了VIP,且kubectl客户端连接正常
K8S集群Master高可用实践
K8S集群Master高可用实践
4、在vm1上将kube-apiserver、keepalived服务启动,由于配置的是主从模式,所以会抢占VIP
K8S集群Master高可用实践
5、在vm2上可以看到VIP的释放,keepalived重新进入backup状态
K8S集群Master高可用实践
6、在整个过程中可以用其他的客户端来连接master VIP来测试服务器的连续性
K8S集群Master高可用实践

七、使用haproxy改进

只用keepalived实现master ha,当api-server的访问量大的时候,会有性能瓶颈问题,通过配置haproxy,可以同时实现master的ha和流量的负载均衡。
1、安装和配置haproxy,两台master做同样的配置

# yum -y install haproxy
# cat /etc/haproxy/haproxy.cfg
globallog         127.0.0.1 local2chroot      /var/lib/haproxypidfile     /var/run/haproxy.pidmaxconn     4000user        haproxygroup       haproxydaemonstats socket /var/lib/haproxy/statsdefaultsmode                    tcplog                     globaloption                  tcplogoption                  dontlognulloption                  redispatchretries                 3timeout queue           1mtimeout connect         10stimeout client          1mtimeout server          1mtimeout check           10smaxconn                 3000listen statsmode   httpbind :10086stats   enablestats   uri     /admin?statsstats   auth    admin:adminstats   admin   if TRUEfrontend  k8s_https *:8443mode      tcpmaxconn      2000default_backend     https_sribackend https_sribalance      roundrobinserver s1 192.168.115.5:6443  check inter 10000 fall 2 rise 2 weight 1server s2 192.168.115.6:6443  check inter 10000 fall 2 rise 2 weight 1

2、修改kube-apiserver配置,ip地址根据实际情况修改

# grep 'address' /usr/lib/systemd/system/kube-apiserver.service     --advertise-address=192.168.115.5 \--bind-address=192.168.115.5 \--insecure-bind-address=127.0.0.1 \

3、修改keepalived启动脚本和配置文件,vrrp脚本的ip地址根据实际情况修改

# cat /usr/lib/systemd/system/keepalived.service            
[Unit]
Description=LVS and VRRP High Availability Monitor
After=syslog.target network-online.target 
Require=haproxy.service
########以下输出省略#########
# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived  
global_defs {  notification_email {   ylw@fjhb.cn}   notification_email_from admin@fjhb.cn  smtp_server 127.0.0.1  smtp_connect_timeout 30  router_id LVS_MASTER  
}  vrrp_script check_apiserver {script "curl -o /dev/null -s -w %{http_code} -k  https://192.168.115.5:6443"interval 3timeout 3fall 2rise 2
}  
########以下输出省略#########

4、修改kubelet和kubectl客户端配置文件,指向haproxy的端口8443

# grep '192' /etc/kubernetes/bootstrap.kubeconfig server: https://192.168.115.4:8443
# grep '192' /etc/kubernetes/kubelet.kubeconfig server: https://192.168.115.4:8443
# grep '192' /etc/kubernetes/kube-proxy.kubeconfig 
server: https://192.168.115.4:8443
# grep '192' /root/.kube/config 
server: https://192.168.115.4:8443

5、重启服务验证
master

# systemctl daemon-reload
# systemctl enable haproxy 
# systemctl start haproxy 
# systemctl restart keepalived 
# systemctl restart kube-apiserver 

kubelet

# systemctl restart kubelet
# systemctl restart kube-proxy

K8S集群Master高可用实践
K8S集群Master高可用实践

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

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

相关文章

[转载]智能科普:VR、AR、MR的区别

智能科普:VR、AR、MR的区别 http://news.zol.com.cn/553/5534833.html news.zol.com.cn 2015-11-23 16:00近日, 获得谷歌5亿美元融资的技术公司Magic Leap在WSJD展会中放出了一段实录视频,引起不小骚动。如今,也有媒体称他们为MR公…

PHP项目中,记录错误日志

一、场景介绍: 环境:LNMP 我们通常是通过nginx的错误日志来分析分错的,也就是我们在各个server中定义的error_log。 比如下面这样,就是将错误日志定义在/etc/nginx/logs/error/www.xiaobudiu.top.log,发生错误&#xf…

持续集成指南:GitLab 的 CI/CD 工具配置与使用

1前言写代码这项工作,本质就是将工作自动化,减少手工操作提供效率,因为人的本质都是懒狗,程序员也不能例外,为了各种意义的效率提升(懒),我们需要持续集成工具,将代码测试…

php 错误日志 redis' already loaded in Unknown on line 0

环境介绍:LNMP 报错信息:注:这个php_errors.log 是我在php.ini 中定义的错误日志路径 问题原因: 报错信息给出的意思是:redis和memcache 模块已经加载过问题解决: php加载模块有两种方式,一种是…

第一周作业

我的Git账号:AI1452349541 和代码图 这是我在电脑和手机上下的网易有道词典 , C也下了。 ***学习内容总结*** 感觉任务并不是很难,有些任务没完成是 因为还没买电脑不好弄,下周电脑一定到位。 ***遇到的问题…

升级MariaDB为10.1版本

2019独角兽企业重金招聘Python工程师标准>>> CentOS中升级mariadb为10.1GA版本。 1、如果有,停止服务 systemctl stop mariadb 2、卸载原来的数据库服务 yum -y remove mari* 3、删除数据库文件 rm -rf /var/lib/mysql/* 4.创建/etc/yum.repos.d/MariaDB…

第一篇文章

第一次写博客。欢迎各位大牛捧场转载于:https://www.cnblogs.com/clnchanpin/p/6753665.html

羊了个羊的Ignite大会又来啦

据说最近羊了个羊非常火啊~可惜没有时间精力研究。不过,薅微软羊毛的机会我是一定不会错过的,这不,薅羊毛的机会来了,哈哈哈。作为经常薅微软羊毛的老司机,今天收到了微软的邮件,告知有新的羊毛…

清除谷歌浏览器的dns缓存

谷歌地址栏输入: chrome://net-internals/#dns出现下面界面:找到DNS选项,选择clear host cache即可效果:这样,谷歌浏览器上的dns缓存就清理掉了。应用场景: 本地环境和线上环境用的是一个host,这…

什么样的代码称得上是好代码?

“软件自有其美感所在” --《重构》图片:崇礼瀚海梁的山花 拍摄于2022年8月13日 摄影师:刘先生这篇内容写作于4年前(2018年),是自己多年软件开发工作的一点感悟,现在看来虽有偏颇,但总体思想方…

Coding and Paper Letter(十四)

2019独角兽企业重金招聘Python工程师标准>>> 资源整理。 1 Coding: 1.R语言包ungeviz,ggplot2的拓展包,专门用来作不确定性的可视化。 ungeviz 2.计算机图形学相关开源项目。 计算机图形学光线追踪开源项目C源码。 computer graphics ray tra…

eclipse安装反编译插件

一、下载插件 1、官方地址:http://jd.benow.ca/ 2、百度网盘:http://pan.baidu.com/s/1eSJ7Tiq 密码:sr6p 二、打开eclipse,点击“Help > Install New Software” 三、Name填:JD-Eclipse Update Site(可…

PHP 项目中缓存的多种应用实现

一、CDN缓存原理和介绍 1、各地部署多套静态存储服务,本质上是空间成本换时间 2、CDN是域名和真实服务器中间的一个环节,添加cdn节点后,用户访问时,自动选择最近的节点内容,不存在再请求原始服务器 3、CDN本质上是一种…

【tomcat】servlet原理及其生命周期

1.什么是servlet? Servlet(Servlet Applet),全称Java Servlet,是用Java编写的服务器端程序。而这些Servlet都要实现Servlet这个接口。其主要功能在于交互式的浏览和修改数据,生成动态Web内容。Servlet运行于支持Java的…

实现一个监控 IP 的 windows 服务

实现一个监控 IP 的 windows 服务Intro我们公司的 VPN 用自己的电脑连公司的台式机的时候需要用 IP 地址,有一次尝试去连的时候发现连不上,第二天到公司发现 IP 变掉了,不是之前连的 IP 了,于是就想写一个简单 Windows 服务来监控…

微信企业号开发:启用回调模式

微信企业号开发怎样启用回调模式?就是简单的登陆PC版微信,点击应用中心,选择须要应用,再点击回调模式启用?似乎不是这么简单。!能够看到核心的仅仅有三个URL。Token,EncodingAESKey这三个參数能…

MVC中提交表单的4种方式

一,MVC HtmlHelper方法 Html.BeginForm(actionName,controllerName,method,htmlAttributes){} BeginRouteForm 方法 (HtmlHelper, String, Object, FormMethod) 二,传统Form表单Aciton属性提交 三,JqueryAjax 提交表单 四,MVC C…

photoshop制作网站圆形图标ico

1、选择左侧工具栏中的椭圆工具2、鼠标直接在图片上选择区域3、在图片上鼠标右键建立选区,在弹出的对话框直接点确定变成这样:4、点击选择,然后点击反选变成这样5、图层栏,在图片上右键复制图层,弹出对话框直接确定即可…

WPF 窗体设置亚克力效果

WPF 窗体设置亚克力效果控件名:WindowAcrylicBlur作者: WPFDevelopersOrg - 吴锋原文链接: https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40。Visual Studio 2022。项目使用 MIT 开源许可协议。WindowAcrylicB…

数据分块加载——BigPipe 技术【类似facebook】

一、原理 分块加载,加载完一块,就先把页面数据刷给用户,再加载下面的,直到加载完毕二、基础需知:三、服务端和php的相应配置 如果想实现分块加载【bigpipe技术】,还需要对nginx.conf 和 php.ini 进行相应配…