containerd搭建keepalived + haproxy
环境说明
ip地址 | 角色 |
---|---|
172.16.0.100 | vip |
172.16.0.11 | master1,lb1 |
172.16.0.12 | master2,lb2 |
172.16.0.13 | master3,lb3 |
keepalived和haproxy配置文件
haproxy配置文件
路径/opt/haproxy/haproxy.cfg
global log /dev/log local0 log /dev/log local1 notice stats socket /tmp/haproxy.sock mode 660 level admin expose-fd listeners stats timeout 30s user haproxy group haproxy daemon defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 # 下方为新增内容(非docker安装情况下) frontend kube-apiserver bind *:8443 mode tcp option tcplog default_backend kube-apiserver backend kube-apiserver mode tcp option tcplog option tcp-check balance roundrobin default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100 server kube-apiserver-1 172.16.0.11:6443 check server kube-apiserver-2 172.16.0.12:6443 check server kube-apiserver-3 172.16.0.13:6443 check
keepalived配置文件
master1
路径 /opt/keepalived/keepalived.conf
global_defs { notification_email { } router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_garp_interval 0 vrrp_gna_interval 0 } # 定义检查规则或脚本 vrrp_script haproxy_check { script "/bin/bash -c 'if [[ $(netstat -nlp | grep 8443) ]]; then exit 0; else exit 1; fi'" interval 2 weight 2 } vrrp_instance haproxy-vip { state BACKUP priority 100 interface ens3 #vip绑定网卡 virtual_router_id 60 advert_int 1 authentication { auth_type PASS auth_pass 1111 } unicast_src_ip 172.16.0.11 #当前机器地址 unicast_peer { 172.16.0.12 #peer中其它地址 172.16.0.13 #peer中其它地址 } virtual_ipaddress { 172.16.0.100/24 #vip地址 } track_script { haproxy_check } }
master2
路径 /opt/keepalived/keepalived.conf
global_defs { notification_email { } router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_garp_interval 0 vrrp_gna_interval 0 } # 定义检查规则或脚本 vrrp_script haproxy_check { script "/bin/bash -c 'if [[ $(netstat -nlp | grep 8443) ]]; then exit 0; else exit 1; fi'" interval 2 weight 2 } vrrp_instance haproxy-vip { state BACKUP priority 100 interface ens3 #vip绑定网卡 virtual_router_id 60 advert_int 1 authentication { auth_type PASS auth_pass 1111 } unicast_src_ip 172.16.0.12 #当前机器地址 unicast_peer { 172.16.0.11 #peer中其它地址 172.16.0.13 #peer中其它地址 } virtual_ipaddress { 172.16.0.100/24 #vip地址 } track_script { haproxy_check } }
master3
路径 /opt/keepalived/keepalived.conf
global_defs { notification_email { } router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_garp_interval 0 vrrp_gna_interval 0 } # 定义检查规则或脚本 vrrp_script haproxy_check { script "/bin/bash -c 'if [[ $(netstat -nlp | grep 8443) ]]; then exit 0; else exit 1; fi'" interval 2 weight 2 } vrrp_instance haproxy-vip { state BACKUP priority 100 interface ens3 #vip绑定网卡 virtual_router_id 60 advert_int 1 authentication { auth_type PASS auth_pass 1111 } unicast_src_ip 172.16.0.13 #当前机器地址 unicast_peer { 172.16.0.11 #peer中其它地址 172.16.0.12 #peer中其它地址 } virtual_ipaddress { 172.16.0.100/24 #vip地址 } track_script { haproxy_check } }
containerd配置
这里我们使用containerd来创建haproxy和keepalived的容器
配置环境
Haproxy容器
拉取镜像
拉取镜像的命令与docker类似
# docker 命令(对比观察使用,此环境未安装docker,无法使用) docker images pull haproxy:2.1-alpine # ctr命令 ctr i pull docker.io/library/haproxy:2.1-alpine
这里我们是从docker hub拉取镜像,所以镜像的名称前面要加上docker.io/library
创建容器
# docker 命令(对比观察使用,此环境未安装docker,无法使用) docker run -d --name=haproxy01 --net=host -v /opt/haproxy:/usr/local/etc/haproxy/ haproxy:2.1-alpine # ctr命令 ctr c create --mount type=bind,src=/opt/haproxy,dst=/usr/local/etc/haproxy,options=rbind:rw --net-host docker.io/library/haproxy:2.1-alpine haproxy01
使用host网络
--net-host
这里需要注意挂载路径的格式
--mount type=bind,src=/opt/haproxy,dst=/usr/local/etc/haproxy,options=rbind:rw
type:bind
src:宿主机路径
dst:容器内路径
options:权限
启动容器
ctr task start -d haproxy01
进入容器
# 和 docker 的操作类似,但必须要指定 --exec-id,这个 id 可以随便写,只要唯一就行 ctr task exec --exec-id 0 -t haproxy01 /bin/sh
暂停容器
ctr task pause haproxy01
删除容器
ctr无法stop容器,只能删除或者暂停
ctr task kill haproxy01
直接启动容器
ctr run -d --mount type=bind,src=/opt/haproxy,dst=/usr/local/etc/haproxy,options=rbind:rw --net-host docker.io/library/haproxy:2.1-alpine haproxy01
查看运行中的容器
ctr task ls
keepalived
拉取镜像
# docker 命令(对比观察使用,此环境未安装docker,无法使用) docker images pull osixia/keepalived:2.0.20 # ctr命令 ctr i pull docker.io/osixia/keepalived:2.0.20
创建运行容器
# docker 命令(对比观察使用,此环境未安装docker,无法使用) sudo docker run -d --name=keepalived01 --net=host -v /opt/keepalived/keepalived.conf:/container/service/keepalived/assets/keepalived.conf --cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW osixia/keepalived:2.0.20 --copy-service # ctr命令 ctr c create --mount type=bind,src=/opt/keepalived/keepalived.conf,dst=/container/service/keepalived/assets/keepalived.conf,options=rbind:rw --net-host --privileged docker.io/osixia/keepalived:2.0.20 keepalived01
这里我们权限设置并没有直接使用—cap-add
而是直接--privileged
运行后发现有报错,无法对keepalived.conf进行sed操作。这里我们要知道keepalived.conf是挂载进入容器的。而挂载目录无法进行sed是正常的
这里我选择重新构建这个进行,把配置文件直接丢进去。
buildkit
下载安装
下载地址
https://github.com/moby/buildkit/releases
tar -zxvf buildkit-v0.9.0.linux-amd64.tar.gz
解压后得到一个bin文件夹,将这个文件夹里面的东西直接拷贝到/bin
目录去
cp bin/* /bin
启动buildkit
因为我们不会经常构建镜像,直接启动在前台
buildkitd --oci-worker=false --containerd-worker=true
编写Dockerfile
mkdir /tmp/mykeepalived cd /tmp/mykeepalived cp /opt/keepalived/keepalived.conf . vim /tmp/mykeepalived/Dockerfile # dockerfile内容 FROM osixia/keepalived:2.0.20 MAINTAINER mumu w2799521098@outlook.com ADD keepalived.conf /container/service/keepalived/assets/keepalived.conf
构建镜像
buildctl build \ --frontend=dockerfile.v0 \ --local context=. \ --local dockerfile=. \ --output type=image,name=docker.io/mumu/keepalived01:1.0.0
--frontend可以使用网关做前端,未做其他尝试,这里直接使用dockerfile.0
--local context 指向当前目录,这是Dockerfile执行构建时的路径上下文,比如在从目录中拷贝文件到镜像里
--local dockerfile指向当前目录,表示Dockerfile在此目录
--output 的 name 表示构建的镜像名称
构建完成后镜像会存在本地containerd的buildkit名字空间下
查看构建好的镜像
ctr -n buildkit i ls
导出并重新导入镜像
因为containerd存在命名空间隔离,所以我们重新导出并导入下镜像
ctr -n buildkit i export kp.tar.gz docker.io/mumu/keepalived01:1.0.0 ctr i import kp.tar.gz
查看下
创建容器
#ctr run -d --net-host --privileged docker.io/mumu/keepalived01:1.0.0 keepalived01 ctr c create --net-host --privileged docker.io/mumu/keepalived01:1.0.0 keepalived01 ctr task start keepalived01
运行正常,后台启动吧
ctr task start -d keepalived01
剩下的两个节点如法炮制
查看和测试
查看vip
ip a s
测试vip
当前vip在master1上,体脂master1上的haproxy容器看戏
ctr task kill haproxy01
查看vip是否漂移
vip成功漂移,基于containerd搭建keepalived + haproxy 搭建成功