containerd搭建keepalived + haproxy

木木2年前技术文章996

环境说明

ip地址角色
172.16.0.100vip
172.16.0.11master1,lb1
172.16.0.12master2,lb2
172.16.0.13master3,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的容器

配置环境

containerd 入门

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 搭建成功


相关文章

helm安装部署trino对接hive(一)

helm安装部署trino对接hive(一)

前提:本文前提是基于hive组件已经提前安装的情况下,安装部署好trino容器之后进行对hive组件的对接。helm trino地址:https://artifacthub.io/packages/h...

日志聚合工具loki

1、loki是什么Loki是一个水平可扩展,高可用性,多租户的日志聚合系统,受到Prometheus的启发。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签。...

MySQL的数据拆分

MySQL的数据拆分

一、拆分的概念数据拆分当数据过大,存储、SQL性能达到瓶颈;或多个业务共用一个数据库实例,一个小功能故障导致整个系统瘫痪;为解决类似问题,需考虑对数据进行拆分;粗一级的拆分,针对的是业务系统,将不同业...

MongoDB 单机安装部署

MongoDB 单机安装部署

说明本篇文章介绍 MongoDB 二进制安装的步骤,整个过程还是比较简单。1. 下载安装包进入 MongoDB 官网,获取安装包的下载链接:https://www.mongodb.com/try/do...

Flume使用案例之实时读取本地文件到HDFS

Flume实时读取本地文件到HDFS1.  创建flume-hdfs.conf文件# 1 agenta2.sources = r2a2.sinks = k2a2.channels = c2 # 2 s...

Prometheus 监控 Nginx

Prometheus 监控 Nginx

一、Nginx_exporter安装下载链接:https://github.com/discordianfish/nginx_exporter下载nginx_exporter的docker镜像。doc...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。