containerd搭建keepalived + haproxy

木木2年前技术文章746

环境说明

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


相关文章

Yarn界面详解

Yarn界面详解

1.Active Nodes:表示Yarn集群管理的节点的个数,其实就是NodeManager的个数,集群有2个NodeManager从配置中可以看到每一个NodeManager管理的内存大小是163...

PG的多版本并发控制(二)

PG的多版本并发控制(二)

二、 PG数据库DML操作的相关概念xmin、xmax、cmin、cmax是每个数据行tuple上的隐藏字段,主要用于区别不同事务以及相同事务内tuple的行版本。在了解这四个参数概念前,我们首先需要...

MySQL 初始化推荐关注的参数

MySQL 初始化推荐关注的参数

前言新部署的 MySQL 实例如何配置?本 SOP 将提供一些 MySQL 关键参数及设置方法。必须设置的参数1. innodb_buffer_pool_size对于 innodb 表引擎来说,用户数...

Linux Firewall规则配置

Linux Firewall规则配置

1、Firewalld是否启动成功systemctl start firewalld && systemctl enable firewalld2、开启规则需求:客户由于网络审查问题。...

python脚本--检查域名证书到期时间

需要的依赖:pip install python-dateutil pip install pytzpython脚本内容:#!/usr/bin/env python3      import s...

Elasticsearch写入优化

1.1 基本优化手段Elasticsearch默认的设置和参数配置下,是综合考虑了数据的可靠性、搜索实时性、写入速度等因素。但在安平实际场景中,业务对数据的可靠性和搜索实时性要求并不高,反而对写入速度...

发表评论    

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