added hautoproxy auto-configuring haproxy
This image configures haproxy to forward connections for all available kubernetes services. It is meant to be run alongside other contains in a kubernetes pod to provide access to "remote" services at a consistent address so that keystone api endpoints can be configured in a sane fashion. Change-Id: Ic923c6a772f1bdf36b97b05a1d04de9e5b841ddd
This commit is contained in:
parent
9414ab5cad
commit
154e2781d9
8
docker/hautoproxy/Dockerfile
Normal file
8
docker/hautoproxy/Dockerfile
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
FROM fedora
|
||||||
|
|
||||||
|
RUN yum -y install haproxy python-jinja2; yum clean all
|
||||||
|
RUN mkdir -p /etc/haproxy/templates
|
||||||
|
ADD haproxy.cfg.tmpl /etc/haproxy/templates/haproxy.cfg.tmpl
|
||||||
|
ADD start.py /start.py
|
||||||
|
CMD ["/start.py"]
|
||||||
|
|
1
docker/hautoproxy/build
Symbolic link
1
docker/hautoproxy/build
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../../tools/build-docker-image
|
26
docker/hautoproxy/haproxy.cfg.tmpl
Normal file
26
docker/hautoproxy/haproxy.cfg.tmpl
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
global
|
||||||
|
daemon
|
||||||
|
maxconn 4096
|
||||||
|
pidfile /var/run/haproxy.pid
|
||||||
|
|
||||||
|
defaults
|
||||||
|
mode tcp
|
||||||
|
timeout connect 5s
|
||||||
|
timeout client 1m
|
||||||
|
timeout server 1m
|
||||||
|
option redispatch
|
||||||
|
balance roundrobin
|
||||||
|
|
||||||
|
listen stats :1936
|
||||||
|
mode http
|
||||||
|
stats enable
|
||||||
|
stats hide-version
|
||||||
|
#stats realm Haproxy\ Statistics
|
||||||
|
stats uri /
|
||||||
|
#stats auth Username:Password
|
||||||
|
|
||||||
|
{% for service in services %}
|
||||||
|
listen {{ service.service_name }}
|
||||||
|
bind 127.0.0.1:{{service.local_port}}
|
||||||
|
server {{ service.remote_name }} {{ service.remote_addr }}:{{ service.remote_port}} check inter 2s rise 3 fall 2
|
||||||
|
{% endfor %}
|
65
docker/hautoproxy/start.py
Executable file
65
docker/hautoproxy/start.py
Executable file
@ -0,0 +1,65 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
'''This script configures and starts a local haproxy instances, bound to
|
||||||
|
127.0.0.1, that forwards connections all of the discovered
|
||||||
|
docker/kubernetes environment variables.'''
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from jinja2 import Environment, FileSystemLoader
|
||||||
|
import re
|
||||||
|
import urlparse
|
||||||
|
|
||||||
|
re_url = re.compile(
|
||||||
|
'^(?P<name>.*)_PORT_(?P<port>\d+)_(?P<proto>(UDP|TCP))$')
|
||||||
|
|
||||||
|
def parse_args():
|
||||||
|
p = argparse.ArgumentParser()
|
||||||
|
p.add_argument('--output', '-o',
|
||||||
|
default='/etc/haproxy/haproxy.cfg')
|
||||||
|
p.add_argument('--no-start', '-n',
|
||||||
|
action='store_true')
|
||||||
|
p.add_argument('--template-dir', '-t',
|
||||||
|
default='/etc/haproxy/templates')
|
||||||
|
return p.parse_args()
|
||||||
|
|
||||||
|
def discover_services():
|
||||||
|
services = []
|
||||||
|
for k in os.environ:
|
||||||
|
mo = re_url.match(k)
|
||||||
|
|
||||||
|
if mo:
|
||||||
|
parts = urlparse.urlparse(os.environ[k])
|
||||||
|
remote_host,remote_port = parts.netloc.split(':')
|
||||||
|
service_name = '%(name)s-%(port)s' % mo.groupdict()
|
||||||
|
|
||||||
|
services.append({
|
||||||
|
'remote_name': mo.group('name'),
|
||||||
|
'remote_addr': remote_host,
|
||||||
|
'remote_port': remote_port,
|
||||||
|
'remote_proto': parts.scheme,
|
||||||
|
'local_port': mo.group('port'),
|
||||||
|
'service_name': service_name,
|
||||||
|
})
|
||||||
|
|
||||||
|
return services
|
||||||
|
|
||||||
|
def main():
|
||||||
|
args = parse_args()
|
||||||
|
services = discover_services()
|
||||||
|
|
||||||
|
env = Environment(loader=FileSystemLoader(['.',
|
||||||
|
args.template_dir]))
|
||||||
|
template = env.get_template('haproxy.cfg.tmpl')
|
||||||
|
with open(args.output, 'w') as fd:
|
||||||
|
fd.write(template.render(services=services))
|
||||||
|
|
||||||
|
if args.no_start:
|
||||||
|
return
|
||||||
|
|
||||||
|
os.execlp('haproxy', 'haproxy', '-f', args.output, '-db')
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user