前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >keepalived in docker

keepalived in docker

作者头像
sealyun
发布2019-07-25 15:15:33
2.5K0
发布2019-07-25 15:15:33
举报
文章被收录于专栏:sealyun

kubernetes集群三步安装

概述

目前keepalived作为kubernetes集群高可用的重要组件,保障虚拟ip可以在多个主机间漂移,sealos 也是使用了,只是在方案上与传统的方式有很大区别

首先把keepalived放到容器里了,版本也用了比较新的2.x.x以上

然后使用kubernetes static pod去管理keepalived服务

keepalived放到容器里的好处

  • 安装成功率更高,更跨平台, 传统方式如用yum安装或者其它,如果采用那些办法在别的一些发型版系统上sealos就不可用。其次,很多系统的源不一样导致版本不一致造成问题,如果通过源码编译可能一些系统库版本直接导致编译不通过,所以为了提高高可用的安装成功率,放容器里是最好的方式
  • 无需额外对keepalived增加监控, 因为是pod,而sealos又已经集成了prometheus,所以不需要再额外添加监控信息
  • 统一管理, keepalived异常退出什么的kubelet也会将其拉起,与其它的kubernetes组件就有了一个统一的方式管理

keepalived在k8s中高可用中的作用

sealos中图中LVS的地方替换成HAproxy了

kubelet kubeproxy在连接master时,如果配置某个具体的master节点的IP,当该master宕机时集群中节点就不能正常工作,所以需要keepalived提供一个虚拟IP在多个节点之间漂移。

然后组件就可以通过vip访问haproxy,haproxy去负载多个master节点

实现

keepalived的Dockerfile:

代码语言:javascript
复制
FROM centos:7.4.1708

RUN yum install -y  wget  && yum install -y gcc-c++ openssl-devel openssl && yum install -y net-tools

RUN wget http://www.keepalived.org/software/keepalived-2.0.8.tar.gz && tar zxvf keepalived-2.0.8.tar.gz && cd keepalived-2.0.8 && ./configure && make && make install  

CMD ["keepalived", "-n","--all", "-d", "-D",  "-f", "/etc/keepalived/keepalived.conf",

这里需要用-n参数让keepalived在前台启动,之前在前台启动有一些无法执行检测脚本的问题,和官方沟通后解决, 不然可能需要用一些守护进程去守护,就比较恶心了.

keepalived配置, 模板文件

模板里的值对应下文host文件里的一些值

代码语言:javascript
复制
global_defs {

router_id kubernetes

}

vrrp_script Checkhaproxy {

script "/etc/keepalived/check_haproxy.sh"

interval 3

weight -25 

}

vrrp_instance VI_1 {

state {{ lb }}

interface {{ ansible_default_ipv4.interface }}

virtual_router_id  100

priority {{ priority }}

advert_int 1

authentication {

auth_type PASS

auth_pass kubernetes

}

virtual_ipaddress {

{{ vip }}

}

track_script {

Checkhaproxy

}

}

这里的检测脚本检测失败后优先级就-25,这样主原先的优先级是100,从是80,优先级低于从了,vip就会漂移到从上面。

再看一下keepalived检测脚本, 如果HAproxy代理的master节点返回值异常了,就漂移:

代码语言:javascript
复制
#!/bin/bash

if [ `curl https://{{ ansible_default_ipv4.address }}:6444 --insecure |grep kind |wc -l` -eq 0 ] ; then

exit 1 # just exit, MASTER will reduce weight(-25), so vip will move on BACKUP node

fi

这里网上有很多人简单粗暴的配置检测haproxy进程在不在,其实是有问题的,因为一旦haproxy假死,其实已经不正常了 但是IP漂移不走。

haproxy配置了check功能,所以不论哪个master挂了,都能负载到其它master上

代码语言:javascript
复制
global

daemon

log 127.0.0.1 local0

log 127.0.0.1 local1 notice

maxconn 4096

defaults

log               global

retries           3

maxconn           2000

timeout connect   5s

timeout client    50s

timeout server    50s

frontend k8s

bind *:6444

mode tcp

default_backend k8s-backend

backend k8s-backend

balance roundrobin

mode tcp

{% for host in groups['k8s-master'] %}

server {{hostvars[host].name}} {{ host }}:6443 check port 6443  inter 1500 rise 1 fall 3

{% endfor %}

测试过程

我安装了一个集群,具体安装参考文档,host文件为:

代码语言:javascript
复制
[k8s-master]

10.1.86.201 name=node01 order=1 role=master lb=MASTER lbname=lbmaster priority=100

10.1.86.202 name=node02 order=2 role=master lb=BACKUP lbname=lbbackup priority=80

10.1.86.203 name=node03 order=3 role=master

[k8s-node]

10.1.86.205 name=node04 role=node

[k8s-all:children]

k8s-master

k8s-node

[all:vars]

vip=10.1.86.209

k8s_version=1.13.2

ip_interface=eth.*

安装完之后查看vip是否正常:

代码语言:javascript
复制
[root@dev-86-201 ~]# ip addr|grep 209

inet 10.1.86.209/32 scope global eth0  # 能看到vip

停掉haproxy检查vip是不是漂移到202上:

代码语言:javascript
复制
[root@dev-86-201 ~]# mv /etc/kubernetes/manifests/haproxy.yaml .

再看vip:

代码语言:javascript
复制
[root@dev-86-201 ~]# ip addr|grep 209 # 已经不在

[root@dev-86-201 ~]# 

vip正常漂移到202上:

代码语言:javascript
复制
[root@dev-86-202 ~]# ip addr|grep 209

inet 10.1.86.209/32 scope global eth0  # 能看到vip

再恢复haproxy:

代码语言:javascript
复制
mv haproxy.yaml /etc/kubernetes/manifests/

vip再次漂回201:

代码语言:javascript
复制
[root@dev-86-201 ~]# ip addr|grep 209

inet 10.1.86.209/32 scope global eth0  # 能看到vip

如果关闭机器或者拔掉网卡也会与上述结果一致,请各位可自测

其它

sealos非常简单轻量,不追求大而全的功能,而提供核心的实现,这样无论是使用还是定制修改,或者把其中某一块哪出来都非常方便。

比如只需要用keepalived+haproxy的场景, 只需要装etcd高可用集群的场景等等

不管你懂不懂ansible,我相信看看看都能很容易看懂sealos的代码,然后根据自己的需要去做一些定制等

QQ群:98488045

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 sealyun 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • kubernetes集群三步安装
  • 概述
  • keepalived放到容器里的好处
  • keepalived在k8s中高可用中的作用
  • 实现
  • 测试过程
  • 其它
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档