commit
1da0e96ea2
50
templates/keepalived/0/README.md
Executable file
50
templates/keepalived/0/README.md
Executable file
@ -0,0 +1,50 @@
|
|||||||
|
# Keepalived
|
||||||
|
|
||||||
|
This catalog recipe enables unicast VRRP based failover for one or more floating IP Addresses. It's intended deployment is for use on a pair edge or ingress nodes where forward-facing load-balancers or other like services will be scheduled.
|
||||||
|
|
||||||
|
|
||||||
|
### Form Fields
|
||||||
|
* **Update Host Sysctl** - If `true` automatically sets the needed sysctl setting on the host.
|
||||||
|
* **Host Label Name** - Host label key name used to schedule keepalived master and backup instances.
|
||||||
|
* **Master Label** - The value of the keepalived host Label to signify the master instance.
|
||||||
|
* **Backup Label** - The value of the keepalived host Label to signify the backup instance.
|
||||||
|
* **Interface Name** - The host interface that keepalived will monitor and use for VRRP traffic.
|
||||||
|
* **Virtual Router ID** - A unique number from 0 to 255 that should identify the VRRP group.
|
||||||
|
* **Master IP** - The IP on the master host that the keepalived daemon should bind to.
|
||||||
|
* **Backup IP** - The IP on the backup host that the keepalived daemon should bind to.
|
||||||
|
* **Virtual IP** - Virtual IP to be created. Must be in ip notation: `<ipaddress>/<mask> dev <interface>`
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
The host must have the sysctl setting `net.ipv4.ip_nonlocal_bind=1` configured.
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
This service is intended to be deployed to edge nodes with a `master` and `backup` deployed respectively. One or more Virtual IPs may then be bound to hosts. These hosts should have an additional label used for load-balancer scheduling e.g. `ingress=true`
|
||||||
|
|
||||||
|
#### Adding an HA Load Balancer Service
|
||||||
|
|
||||||
|
**Ensure your edge hosts have an additional host label before proceeding**
|
||||||
|
|
||||||
|
1. From the Stack menu add a new `Load Balancer`.
|
||||||
|
2. Set `Scale` to be `Always run one instance of this container on every host`.
|
||||||
|
3. Add an appropriate `Name` and `Description`.
|
||||||
|
4. In the `Port Rules` section, click `Show host IP address options.` This enables the Host IP Field.
|
||||||
|
5. Update the `Port Rules` with the `Host IP` field set to your `Virtual IP` as defined in the keepalived config. Configure the rest of the fields as needed for your application.
|
||||||
|
6. Click on the `Scheduling` tab and click on `Add Scheduling Rule`.
|
||||||
|
7. Create a rule where "The host `must` have a `host label` of `<edge node host label>` = `<edge node host label value>`.
|
||||||
|
8. Click Create.
|
||||||
|
|
||||||
|
#### Adding additional Virtual IPs to the keepalived Service
|
||||||
|
|
||||||
|
1. From the Stack menu expand the `keepalived` service.
|
||||||
|
2. Select upgrade on the `keepalived-backup` service.
|
||||||
|
3. Add a new Environment Variable called `KEEPALIVED_VIRTUAL_IPADDRESS_<number>`. Where `<number>` should be a unique value from 0-999. e.g. `KEEPALIVED_VIRTUAL_IPADDRESS_2`.
|
||||||
|
4. Set the value to be a **QUOTED STRING** with an additional virtual IP following the standard ip format of `<ipaddress>/<mask> dev <interface>`. e.g. `10.255.33.102/24 dev eth0`.
|
||||||
|
5. Press `Upgrade`.
|
||||||
|
6. Repeat the same steps for the `keepalived-master` service.
|
||||||
|
|
||||||
|
|
||||||
|
### Troubleshooting
|
||||||
|
|
||||||
|
For further help see the main [arc-ts/keepalived git repo](https://github.com/arc-ts/keepalived)
|
56
templates/keepalived/0/docker-compose.yml.tpl
Executable file
56
templates/keepalived/0/docker-compose.yml.tpl
Executable file
@ -0,0 +1,56 @@
|
|||||||
|
version: '2'
|
||||||
|
services:
|
||||||
|
keepalived-master:
|
||||||
|
restart: always
|
||||||
|
image: arcts/keepalived:1.1.0
|
||||||
|
network_mode: host
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
environment:
|
||||||
|
KEEPALIVED_AUTOCONF: true
|
||||||
|
KEEPALIVED_STATE: MASTER
|
||||||
|
KEEPALIVED_INTERFACE: ${interface}
|
||||||
|
KEEPALIVED_VIRTUAL_ROUTER_ID: ${router_id}
|
||||||
|
KEEPALIVED_UNICAST_SRC_IP: ${master_ip}
|
||||||
|
KEEPALIVED_UNICAST_PEER_0: ${backup_ip}
|
||||||
|
KEEPALIVED_TRACK_INTERFACE_1: ${interface}
|
||||||
|
KEEPALIVED_VIRTUAL_IPADDRESS_1: "\"${virtual_ip}\""
|
||||||
|
labels:
|
||||||
|
io.rancher.scheduler.affinity:host_label: ${host_label}=${master_label}
|
||||||
|
{{- if eq .Values.update_sysctl "true" }}
|
||||||
|
io.rancher.sidekicks: keepalived-sysctl
|
||||||
|
{{- end}}
|
||||||
|
|
||||||
|
keepalived-backup:
|
||||||
|
restart: always
|
||||||
|
image: arcts/keepalived:1.1.0
|
||||||
|
network_mode: host
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
environment:
|
||||||
|
KEEPALIVED_AUTOCONF: true
|
||||||
|
KEEPALIVED_STATE: BACKUP
|
||||||
|
KEEPALIVED_INTERFACE: ${interface}
|
||||||
|
KEEPALIVED_VIRTUAL_ROUTER_ID: ${router_id}
|
||||||
|
KEEPALIVED_UNICAST_SRC_IP: ${backup_ip}
|
||||||
|
KEEPALIVED_UNICAST_PEER_0: ${master_ip}
|
||||||
|
KEEPALIVED_TRACK_INTERFACE_1: ${interface}
|
||||||
|
KEEPALIVED_VIRTUAL_IPADDRESS_1: "\"${virtual_ip}\""
|
||||||
|
labels:
|
||||||
|
io.rancher.scheduler.affinity:host_label: ${host_label}=${backup_label}
|
||||||
|
{{- if eq .Values.update_sysctl "true" }}
|
||||||
|
io.rancher.sidekicks: keepalived-sysctl
|
||||||
|
{{- end}}
|
||||||
|
|
||||||
|
{{- if eq .Values.update_sysctl "true" }}
|
||||||
|
keepalived-sysctl:
|
||||||
|
image: rawmind/alpine-sysctl:0.1-1
|
||||||
|
network_mode: none
|
||||||
|
privileged: true
|
||||||
|
environment:
|
||||||
|
SYSCTL_KEY: net.ipv4.ip_nonlocal_bind
|
||||||
|
SYSCTL_VALUE: 1
|
||||||
|
labels:
|
||||||
|
io.rancher.container.start_once: true
|
||||||
|
{{- end}}
|
||||||
|
|
63
templates/keepalived/0/rancher-compose.yml
Executable file
63
templates/keepalived/0/rancher-compose.yml
Executable file
@ -0,0 +1,63 @@
|
|||||||
|
.catalog:
|
||||||
|
name: "keepalived"
|
||||||
|
version: v1.0.1
|
||||||
|
description: "Keepalived VRRP based HA service."
|
||||||
|
minimum_rancher_version: v0.46.0
|
||||||
|
uuid: keepalived-1
|
||||||
|
questions:
|
||||||
|
- variable: "update_sysctl"
|
||||||
|
description: |
|
||||||
|
Set true to update sysctl.
|
||||||
|
WARN: If set to true, sysctl key net.ipv4.ip_nonlocal_bind will be set to 1.
|
||||||
|
label: "Update Host Sysctl:"
|
||||||
|
type: "enum"
|
||||||
|
default: "false"
|
||||||
|
options:
|
||||||
|
- "true"
|
||||||
|
- "false"
|
||||||
|
required: true
|
||||||
|
- variable: "host_label"
|
||||||
|
description: "Host label key name used to schedule keepalived master and backup instances."
|
||||||
|
label: "Host Label Name:"
|
||||||
|
type: "string"
|
||||||
|
default: "vrrp_role"
|
||||||
|
required: true
|
||||||
|
- variable: "master_label"
|
||||||
|
description: "The value of the keepalived host Label to signify the master instance."
|
||||||
|
label: "Master Label:"
|
||||||
|
type: "string"
|
||||||
|
default: "master"
|
||||||
|
required: true
|
||||||
|
- variable: "backup_label"
|
||||||
|
description: "The value of the keepalived host Label to signify the backup instance."
|
||||||
|
label: "Backup Label:"
|
||||||
|
type: "string"
|
||||||
|
default: "backup"
|
||||||
|
required: true
|
||||||
|
- variable: "interface"
|
||||||
|
description: "The name of the host interface."
|
||||||
|
label: "Interface Name:"
|
||||||
|
type: "string"
|
||||||
|
default: "eth0"
|
||||||
|
required: true
|
||||||
|
- variable: "router_id"
|
||||||
|
description: "The virtual Router ID to assign to the VRRP Pair."
|
||||||
|
label: "Virtual Router ID:"
|
||||||
|
type: "int"
|
||||||
|
default: "2"
|
||||||
|
required: true
|
||||||
|
- variable: "master_ip"
|
||||||
|
description: "Host IP of master node"
|
||||||
|
label: "Master IP:"
|
||||||
|
type: "string"
|
||||||
|
required: true
|
||||||
|
- variable: "backup_ip"
|
||||||
|
description: "Host IP of backup node"
|
||||||
|
label: "Backup IP:"
|
||||||
|
type: "string"
|
||||||
|
required: true
|
||||||
|
- variable: "virtual_ip"
|
||||||
|
description: "Virtual IP to be created. MUST be in ip notation: <IPADDRESS>/<MASK> dev <INTERFACE>"
|
||||||
|
label: "Virtual IP:"
|
||||||
|
type: "string"
|
||||||
|
required: true
|
293
templates/keepalived/catalogIcon-keepalived.svg
Normal file
293
templates/keepalived/catalogIcon-keepalived.svg
Normal file
@ -0,0 +1,293 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="96"
|
||||||
|
height="96"
|
||||||
|
id="svg6517"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="icon.svg"
|
||||||
|
viewBox="0 0 96 96">
|
||||||
|
<defs
|
||||||
|
id="defs6519">
|
||||||
|
<linearGradient
|
||||||
|
id="Background">
|
||||||
|
<stop
|
||||||
|
id="stop4178"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#b8b8b8;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
id="stop4180"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#c9c9c9;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
style="color-interpolation-filters:sRGB;"
|
||||||
|
inkscape:label="Inner Shadow"
|
||||||
|
id="filter1121">
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.59999999999999998"
|
||||||
|
flood-color="rgb(0,0,0)"
|
||||||
|
result="flood"
|
||||||
|
id="feFlood1123" />
|
||||||
|
<feComposite
|
||||||
|
in="flood"
|
||||||
|
in2="SourceGraphic"
|
||||||
|
operator="out"
|
||||||
|
result="composite1"
|
||||||
|
id="feComposite1125" />
|
||||||
|
<feGaussianBlur
|
||||||
|
in="composite1"
|
||||||
|
stdDeviation="1"
|
||||||
|
result="blur"
|
||||||
|
id="feGaussianBlur1127" />
|
||||||
|
<feOffset
|
||||||
|
dx="0"
|
||||||
|
dy="2"
|
||||||
|
result="offset"
|
||||||
|
id="feOffset1129" />
|
||||||
|
<feComposite
|
||||||
|
in="offset"
|
||||||
|
in2="SourceGraphic"
|
||||||
|
operator="atop"
|
||||||
|
result="composite2"
|
||||||
|
id="feComposite1131" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
style="color-interpolation-filters:sRGB;"
|
||||||
|
inkscape:label="Drop Shadow"
|
||||||
|
id="filter950">
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.25"
|
||||||
|
flood-color="rgb(0,0,0)"
|
||||||
|
result="flood"
|
||||||
|
id="feFlood952" />
|
||||||
|
<feComposite
|
||||||
|
in="flood"
|
||||||
|
in2="SourceGraphic"
|
||||||
|
operator="in"
|
||||||
|
result="composite1"
|
||||||
|
id="feComposite954" />
|
||||||
|
<feGaussianBlur
|
||||||
|
in="composite1"
|
||||||
|
stdDeviation="1"
|
||||||
|
result="blur"
|
||||||
|
id="feGaussianBlur956" />
|
||||||
|
<feOffset
|
||||||
|
dx="0"
|
||||||
|
dy="1"
|
||||||
|
result="offset"
|
||||||
|
id="feOffset958" />
|
||||||
|
<feComposite
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="offset"
|
||||||
|
operator="over"
|
||||||
|
result="composite2"
|
||||||
|
id="feComposite960" />
|
||||||
|
<feBlend
|
||||||
|
blend="normal"
|
||||||
|
id="feBlend3895"
|
||||||
|
in2="composite2" />
|
||||||
|
</filter>
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath873">
|
||||||
|
<g
|
||||||
|
transform="matrix(0,-0.66666667,0.66604479,0,-258.25992,677.00001)"
|
||||||
|
id="g875"
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline">
|
||||||
|
<path
|
||||||
|
style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
|
||||||
|
d="m 46.702703,898.22775 50.594594,0 C 138.16216,898.22775 144,904.06497 144,944.92583 l 0,50.73846 c 0,40.86071 -5.83784,46.69791 -46.702703,46.69791 l -50.594594,0 C 5.8378378,1042.3622 0,1036.525 0,995.66429 L 0,944.92583 C 0,904.06497 5.8378378,898.22775 46.702703,898.22775 Z"
|
||||||
|
id="path877"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssssssss" />
|
||||||
|
</g>
|
||||||
|
</clipPath>
|
||||||
|
<filter
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="filter891"
|
||||||
|
inkscape:label="Badge Shadow">
|
||||||
|
<feGaussianBlur
|
||||||
|
inkscape:collect="always"
|
||||||
|
stdDeviation="0.71999962"
|
||||||
|
id="feGaussianBlur893" />
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="8.1490724"
|
||||||
|
inkscape:cx="49.021381"
|
||||||
|
inkscape:cy="46.975739"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer3"
|
||||||
|
showgrid="true"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1056"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
showborder="true"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:guide-bbox="true"
|
||||||
|
inkscape:showpageshadow="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid821" />
|
||||||
|
<sodipodi:guide
|
||||||
|
orientation="1,0"
|
||||||
|
position="16,48"
|
||||||
|
id="guide823" />
|
||||||
|
<sodipodi:guide
|
||||||
|
orientation="0,1"
|
||||||
|
position="64,80"
|
||||||
|
id="guide825" />
|
||||||
|
<sodipodi:guide
|
||||||
|
orientation="1,0"
|
||||||
|
position="80,40"
|
||||||
|
id="guide827" />
|
||||||
|
<sodipodi:guide
|
||||||
|
orientation="0,1"
|
||||||
|
position="64,16"
|
||||||
|
id="guide829" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata6522">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="BACKGROUND"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(268,-635.29076)"
|
||||||
|
style="display:inline">
|
||||||
|
<path
|
||||||
|
style="fill:#333333;fill-opacity:0.93333334000000001;stroke:none;display:inline;filter:url(#filter1121);opacity:0.7"
|
||||||
|
d="m -268,700.15563 0,-33.72973 c 0,-27.24324 3.88785,-31.13513 31.10302,-31.13513 l 33.79408,0 c 27.21507,0 31.1029,3.89189 31.1029,31.13513 l 0,33.72973 c 0,27.24325 -3.88783,31.13514 -31.1029,31.13514 l -33.79408,0 C -264.11215,731.29077 -268,727.39888 -268,700.15563 Z"
|
||||||
|
id="path6455"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssssssss" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer3"
|
||||||
|
inkscape:label="PLACEHOLDER LETTER"
|
||||||
|
style="display:inline">
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter950)"
|
||||||
|
x="17.458124"
|
||||||
|
y="69.1772"
|
||||||
|
id="text3891"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3893"
|
||||||
|
x="17.458124"
|
||||||
|
y="69.1772"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:56px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';fill:#ffffff;fill-opacity:1">ka</tspan></text>
|
||||||
|
<rect
|
||||||
|
style="opacity:0.7;fill:none;stroke:none"
|
||||||
|
id="rect3021"
|
||||||
|
width="64"
|
||||||
|
height="64"
|
||||||
|
x="16"
|
||||||
|
y="15.449201" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer2"
|
||||||
|
inkscape:label="BADGE"
|
||||||
|
style="display:none"
|
||||||
|
sodipodi:insensitive="true">
|
||||||
|
<g
|
||||||
|
style="display:inline"
|
||||||
|
transform="translate(-340.00001,-581)"
|
||||||
|
id="g4394"
|
||||||
|
clip-path="none">
|
||||||
|
<g
|
||||||
|
id="g855">
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="maskhelper"
|
||||||
|
id="g870"
|
||||||
|
clip-path="url(#clipPath873)"
|
||||||
|
style="opacity:0.6;filter:url(#filter891)">
|
||||||
|
<path
|
||||||
|
transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-237.54282)"
|
||||||
|
d="m 264,552.36218 a 12,12 0 0 1 -12,12 12,12 0 0 1 -12,-12 12,12 0 0 1 12,-12 12,12 0 0 1 12,12 z"
|
||||||
|
sodipodi:ry="12"
|
||||||
|
sodipodi:rx="12"
|
||||||
|
sodipodi:cy="552.36218"
|
||||||
|
sodipodi:cx="252"
|
||||||
|
id="path844"
|
||||||
|
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g862">
|
||||||
|
<path
|
||||||
|
sodipodi:type="arc"
|
||||||
|
style="color:#000000;fill:#f5f5f5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
|
id="path4398"
|
||||||
|
sodipodi:cx="252"
|
||||||
|
sodipodi:cy="552.36218"
|
||||||
|
sodipodi:rx="12"
|
||||||
|
sodipodi:ry="12"
|
||||||
|
d="m 264,552.36218 a 12,12 0 0 1 -12,12 12,12 0 0 1 -12,-12 12,12 0 0 1 12,-12 12,12 0 0 1 12,12 z"
|
||||||
|
transform="matrix(1.4999992,0,0,1.4999992,-29.999795,-238.54282)" />
|
||||||
|
<path
|
||||||
|
transform="matrix(1.25,0,0,1.25,33,-100.45273)"
|
||||||
|
d="m 264,552.36218 a 12,12 0 0 1 -12,12 12,12 0 0 1 -12,-12 12,12 0 0 1 12,-12 12,12 0 0 1 12,12 z"
|
||||||
|
sodipodi:ry="12"
|
||||||
|
sodipodi:rx="12"
|
||||||
|
sodipodi:cy="552.36218"
|
||||||
|
sodipodi:cx="252"
|
||||||
|
id="path4400"
|
||||||
|
style="color:#000000;fill:#dd4814;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<path
|
||||||
|
sodipodi:type="star"
|
||||||
|
style="color:#000000;fill:#f5f5f5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
|
id="path4459"
|
||||||
|
sodipodi:sides="5"
|
||||||
|
sodipodi:cx="666.19574"
|
||||||
|
sodipodi:cy="589.50385"
|
||||||
|
sodipodi:r1="7.2431178"
|
||||||
|
sodipodi:r2="4.3458705"
|
||||||
|
sodipodi:arg1="1.0471976"
|
||||||
|
sodipodi:arg2="1.6755161"
|
||||||
|
inkscape:flatsided="false"
|
||||||
|
inkscape:rounded="0.1"
|
||||||
|
inkscape:randomized="0"
|
||||||
|
d="m 669.8173,595.77657 c -0.39132,0.22593 -3.62645,-1.90343 -4.07583,-1.95066 -0.44938,-0.0472 -4.05653,1.36297 -4.39232,1.06062 -0.3358,-0.30235 0.68963,-4.03715 0.59569,-4.47913 -0.0939,-0.44198 -2.5498,-3.43681 -2.36602,-3.8496 0.18379,-0.41279 4.05267,-0.59166 4.44398,-0.81759 0.39132,-0.22593 2.48067,-3.48704 2.93005,-3.4398 0.44938,0.0472 1.81505,3.67147 2.15084,3.97382 0.3358,0.30236 4.08294,1.2817 4.17689,1.72369 0.0939,0.44198 -2.9309,2.86076 -3.11469,3.27355 -0.18379,0.41279 0.0427,4.27917 -0.34859,4.5051 z"
|
||||||
|
transform="matrix(1.511423,-0.16366377,0.16366377,1.511423,-755.37346,-191.93651)" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 10 KiB |
5
templates/keepalived/config.yml
Executable file
5
templates/keepalived/config.yml
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
name: keepalived
|
||||||
|
description: |
|
||||||
|
Keepalived enables services to be deployed in HA with VRRP based failover across multiple hosts.
|
||||||
|
version: v1.0.1
|
||||||
|
category: Networking
|
Loading…
x
Reference in New Issue
Block a user