containerd搭建keepalived + haproxy

木木1年前技术文章383

环境说明

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


相关文章

Doris部署介绍

标准部署该文档主要介绍了部署 Doris 所需软硬件环境、建议的部署方式、集群扩容缩容,以及集群搭建到运行过程中的常见问题。在阅读本文档前,请先根据编译文档编译 Doris。软硬件需求概述Doris...

CPU及磁盘性能监测

CPU及磁盘性能监测

一、简述sysstat 包含了常用的 Linux 性能工具,用来监控和分析系统的性能。本次内容会用到这个包的两个命令 mpstat 和iostat。mpstat 是一个常用的多核 CPU 性能分析工具...

Flume使用案例之Flume与Flume之间数据传递,多Flume汇总数据到单Flume

目标:flume11监控文件hive.log,flume-22监控某一个端口的数据流,flume11与flume-22将数据发送给flume-33,flume33将最终数据写入到HDFS。分步实现:1...

使用Sqoop将数据从MySQL导入HBase (二)

使用Sqoop将数据从MySQL导入HBase (二)

创建hbase表create_namespace 'data';create 'data:data', {NAME => 'cf1'}, {NAME => 'cf2'}, {NAME =&...

为什么根据时间戳获取topic的offset为空呢

为什么根据时间戳获取topic的offset为空呢

一、前言最近有一个需求,要查询某一时间戳对应的offset值,于是就想到了使用 ./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --time &...

PG体系结构(一)

PG体系结构(一)

一、进程结构PG数据库启动时会先启动一个主进程(9.3之前称为postmaster,9.3以后称为postgres server process),然后fork出一些辅助子进程(backend、bac...

发表评论    

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