资讯专栏INFORMATION COLUMN

如何为Keepalived服务创建基于Rancher的Catalog

William_Sang / 1715人阅读

摘要:首先我们简要说明一下的相关启动脚本及配置文件是核心的脚本用来启动服务,文件则是该服务的配置文件。官方手册链接在此结合,我们来看具体的是如何创建的吧。

Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived 将检测到,并将有故障的服务器从系统中剔除,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

首先我们简要说明一下Keepalived 的相关启动脚本及配置文件:keepalived.sh是核心的脚本用来启动服务,keepalived.conf文件则是该服务的配置文件。对于 Keepalived,我们需要关心的几个重要参数如下:

虚拟IP地址及其掩码

VRRP所侦听检测的端口(也就是HA针对具体哪一个端口做健康检查)

VRRP基于哪个网卡接口发布。

我相信Rancher的官方手册已经对Catalog的制作流程做了详尽的说明,但是仍然有一些朋友看了Rancher手册上Catalog那一节,晕晕乎乎,不懂如何制作应用的 Catalog。

(官方手册链接在此):http://docs.rancher.com/ranch...

结合Keepalived,我们来看具体的Catalog是如何创建的吧。

首先,你需要在github或者你自己的gitlab上创建一个项目,这个项目只要能被git clone指令正常处理就 OK。 例如我们在github网站上创建的项目结构如下图所示:

templates目录里对应的是我们Rancher里Cattle环境的Catalog。kubernetes-templates和swarm-templates以及mesos-templates则对应不同环境的模板。进入这个templates,我们可以看见在Rancher Catalog页面对应的那些软件模板名。

我们进入Keepalived文件夹看个究竟,就会很容易的了解官方文档对Catalog编制的流程指引。

这个catalogIcon-keepalived.png图正是我们看见的它:

config.yml文件则是该catalog的基础描述;0目录是指第一个版本,那么下一次你发新版的Catalog,则需另建立一个1目录。

每个版本文件夹例如0里面均包含了三个文件。

这正是我们创建一个Stack所需要的docker-compose.yml以及rancher-compose.yml,当然还有一个README.md 文件,用以对Stack进行详细描述。

对于这个Keepalived,其 docker-compose.yml特别的简单:

Keepalived:

labels:
  io.rancher.scheduler.global: "true"   environment:
  VIRTUAL_IP: "${virtual_ip}" 
  CHECK_PORT: "${check_port}" 
  VRID: 150
  INTERFACE: "${network_interface}"
  NETMASK_BIT: "${netmask_bit}"
tty: true
image: alanpeng/rancher-keepalived stdin_open: true
net: host
cap_add:
  - NET_ADMIN
  - NET_BROADCAST

不过这里的image你可需要花点功夫了,你需要处理正确的环境变量、参数的传递。否则我们在Rancher Catalog里看到的这些参数传递一旦出现问题,那么服务肯定跑不起来了,用于制作image的Dockerfile内容如下 :

FROM alpine:latest
RUN echo "http://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories && apk --update -t addkeepalived iproute2 grep bash tcpdump sed && rm -f /var/cache/apk/* /tmp/*
COPY keepalived.sh /usr/bin/keepalived.sh
COPY keepalived.conf /etc/keepalived/keepalived.confRUN chmod +x /usr/bin/keepalived.sh
ENTRYPOINT ["/usr/bin/keepalived.sh"] 

这些自定义配置选项是如何实现的呢?

官方文档告诉我们,是在 rancher-compose文件里来定义。还是以我们的Keepalived服务为例子:

.catalog:
name: "Keepalived for Rancher"
version: 0.1
description: |
  Keepalived for Rancher HA-Proxy Loadbalancer
questions:
- variable: "virtual_ip" 
  type: string
  required: true
  label: "Virtual Floating IP Address"
  description: "Virtual IP address given to the HA-Proxy Cluster"
- variable: "netmask_bit"
  type: string
  required: true
  label: "Netmask Bit"
  description: "Network mask bits for the Virtual IP address"default: "16"
- variable: "check_port"
  type: string
  required: true
  label: "Listening port"
  description: "The listening port of the HA-Proxy loadbalancer"default: "80"
- variable: "network_interface"
  type: string
  required: true
  label: "Network Interface"
  description: "Network Interface of the Virtual Floating IP address (Host NIC)"default: "eno16777984" 

在rancher-compse.yml文件的question小节里定义了很多UI对象的属性(例如:变量名、数据类型、是否必选项、标签、描述、默认值等等),而在answers.txt文件中则相应的给出了这些项目的默认值状态。

以实际的Keepalived服务而言,我们可以看见docker-compose.yml文件里定义了四个环境变量 (VIRTUAL_IP、 CHECK_PORT、 INTERFACE、 NETMASK_BIT)以及一个常量VRID:

VIRTUAL_IP: "${virtual_ip}"
CHECK_PORT: "${check_port}"
VRID: 150
INTERFACE: "${network_interface}"NETMASK_BIT: "${netmask_bit}"

以上四个环境变量是可以被容器的shell所直接调用的,例如keepalived.sh脚本中就调用了这四个变量,而这四个变量的具体赋值正是在Catalog制作阶段完成的,其值由rancher-compose.yml文件里的变量进行输出,也就是:

VIRTUAL_IP由virtual_ip传值而来(具体值由用户在 UI 里填写)
CHECK_PORT由check_port传值而来(具体值由用户在 UI 里填写)
INTERFACE由network_interface传值而来(具体值由用户在 UI 里填写)NETMASK_BIT由netmask_bit传值而来(具体值由用户在 UI 里填写)

特别需要注意的是 keepalived.sh 脚本在运行期是需要读取配置文件 keepalived.conf 文件里的参数的,特别是上述这四个参数,那么由于 keepalived.conf 文件必须在 images 生成之前在 Dockerfile 里写好,因此在 Dockerfile 里,它们一定是变量,而在容器运行起来之后,keepalive.sh 运行之前需要把变量赋值,这些值正是用户填写的。我们看一下 keepalived.sh 是如何实现的呢?

通过关键的四句 sed 指令配合正则表达式:

keepalived.sh脚本成功的将容器运行期的 keepalived.conf配置文件中的变量参数替换为了常量(这个常量由容器的环境变量传递进 Linux Shell 环境)。

这样一个完整的Catalog创建流程包括如何处理环境变量与自定义参数的传递机制就解释清晰了,按照这种思路,我们可以很方便地创建各种不同的应用模板,以实现 Rancher 的一键部署功能。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28009.html

相关文章

  • SUSE Portus + Docker Registry在Rancher环境下部署实战

    摘要:用户访问通过使用负载均衡服务的和端口。的负载均衡服务,需要做源会话保持配置。其次,自身没有基于角色权限访问控制,所有可以访问负载均衡服务的用户都能随意的推送和拉取镜像。 在正文之前,我们先来看一下,如果没有容器,通常会如何部署 Docker Registry?关于这个问题,我简单画了一个草图: showImg(https://segmentfault.com/img/bVGld7?w...

    Half 评论0 收藏0
  • 从零开始建立Rancher Catalog模板 - Part 1

    摘要:提供了许多可重用的预先构建好的程序栈的模板。从我们的目的来看,是一个能够部署基于容器的程序栈并管理其生命周期的开源的软件。注意和栈被展开以显示每一个程序栈中的多个容器。文件是与模板相关的元数据的初始资源。 Rancher提供了许多可重用的、预先构建好的程序栈的模板。拓展这些已有的模板或者创建并分享已完成的新模板,是参与Rancher用户社区的好方式。同时,这也可以帮助你的组织更高效地利...

    darkbaby123 评论0 收藏0
  • 从零开始建立Rancher Catalog模板 - Part 1

    摘要:提供了许多可重用的预先构建好的程序栈的模板。从我们的目的来看,是一个能够部署基于容器的程序栈并管理其生命周期的开源的软件。注意和栈被展开以显示每一个程序栈中的多个容器。文件是与模板相关的元数据的初始资源。 Rancher提供了许多可重用的、预先构建好的程序栈的模板。拓展这些已有的模板或者创建并分享已完成的新模板,是参与Rancher用户社区的好方式。同时,这也可以帮助你的组织更高效地利...

    RobinTang 评论0 收藏0
  • OpenStack 与 Rancher 融合新玩法

    摘要:本次分享给大家带来与能够融合使用的一些玩法。计算节点的进程不能在运行在中。部署的过程需要拉取很多镜像,需要耐心的等待。之前的计划应该是在版会添加的支持,差不多就是今年月份左右。 OpenStack是开源Iaas云的事实标准,功能大而全,除了能管理虚机同时也能管理容器,OpenStack项目中的Magnum、Kuryr、Kolla、Murano、Nova-docker等都是与容器场景很不...

    android_c 评论0 收藏0

发表评论

0条评论

William_Sang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<