containerd搭建keepalived + haproxy

木木2年前技术文章753

环境说明

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


相关文章

LINUX 安全运维-用户密码

密码策略linux作为一个多用户的系统,我们还是不可避免的会去新增很多用户,我们不能保证每一个用户具有很好的安全意识,所以只能在用户的密码以及用户的远程访问上做一些限制,我们先介绍Linux用户密码策...

大数据监控系列(二)——Prometheus+Grafana在CDH使用实践(包含Altermanager告警)

大数据监控系列(二)——Prometheus+Grafana在CDH使用实践(包含Altermanager告警)

1 概述我们之前在《大数据监控系列(一)——Promehteus+Grafana监控概述》中对Promehteus和Grafana的基本概念做了介绍,这里将介绍Promehteus和Grafana在c...

Kubernetes安全--基于sa和user的rbac认证机制

前言Kubernetes中的用户K8S中有两种用户(User)——服务账号(ServiceAccount)和普通意义上的用户(User)ServiceAccount是由K8S管理的,而User通常是在...

静默安装oracle11g单实例

环境: CentOS 7.8 11.2.0.4.0 orclp:172.16.104.31一、准备1、依赖包检查pdksh 在 redhat 上叫 ksh检查是否有安装root# rpm -q bin...

MySQL运维实战(4.2) 关于SQL_MODE

早期mysql对一些不符合SQL标准的SQL语句和数据的容忍度比较高。mysql 5.7 修改了默认sql mode。系统从低版本升级或迁移到高版本时,需要经过全面的测试,避免影响程序的正常运行。5....

NAS文件被删除问题排查

NAS文件被删除问题排查

一、问题现象客户业务方反馈服务器上挂载的nas文件被删除,业务中许多文件丢失,业务受到严重影响。需要我方协助排查。二、问题背景该nas挂载到两台业务服务器上,后端应用为java应用,存储内容为jpg、...

发表评论    

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