Skip to content
This repository has been archived by the owner on Sep 18, 2020. It is now read-only.

Fixed docker0 address conflict #209

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
2 changes: 0 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,2 @@
.vagrant/
log/
user-data
config.rb
6 changes: 4 additions & 2 deletions Vagrantfile
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ end

Vagrant.configure("2") do |config|
# always use Vagrants insecure key
config.ssh.insert_key = false
config.ssh.insert_key = true
config.ssh.forward_agent = true

config.vm.box = "coreos-%s" % $update_channel
if $image_version != "current"
Expand Down Expand Up @@ -120,8 +121,9 @@ Vagrant.configure("2") do |config|
vb.cpus = vm_cpus
end

ip = "172.17.8.#{i+100}"
ip = "172.19.8.#{i+100}"
config.vm.network :private_network, ip: ip
config.vm.network "public_network", bridge: "em1"

# Uncomment below to enable NFS for sharing the host machine into the coreos-vagrant VM.
#config.vm.synced_folder ".", "/home/core/share", id: "core", :nfs => true, :mount_options => ['nolock,vers=3,udp']
Expand Down
143 changes: 143 additions & 0 deletions Vagrantfile.orig
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
# -*- mode: ruby -*-
# # vi: set ft=ruby :

require 'fileutils'

Vagrant.require_version ">= 1.6.0"

CLOUD_CONFIG_PATH = File.join(File.dirname(__FILE__), "user-data")
CONFIG = File.join(File.dirname(__FILE__), "config.rb")

# Defaults for config options defined in CONFIG
$num_instances = 1
$instance_name_prefix = "core"
$update_channel = "alpha"
$image_version = "current"
$enable_serial_logging = false
$share_home = false
$vm_gui = false
$vm_memory = 1024
$vm_cpus = 1
$shared_folders = {}
$forwarded_ports = {}

# Attempt to apply the deprecated environment variable NUM_INSTANCES to
# $num_instances while allowing config.rb to override it
if ENV["NUM_INSTANCES"].to_i > 0 && ENV["NUM_INSTANCES"]
$num_instances = ENV["NUM_INSTANCES"].to_i
end

if File.exist?(CONFIG)
require CONFIG
end

# Use old vb_xxx config variables when set
def vm_gui
$vb_gui.nil? ? $vm_gui : $vb_gui
end

def vm_memory
$vb_memory.nil? ? $vm_memory : $vb_memory
end

def vm_cpus
$vb_cpus.nil? ? $vm_cpus : $vb_cpus
end

Vagrant.configure("2") do |config|
# always use Vagrants insecure key
config.ssh.insert_key = false

config.vm.box = "coreos-%s" % $update_channel
if $image_version != "current"
config.vm.box_version = $image_version
end
config.vm.box_url = "http://%s.release.core-os.net/amd64-usr/%s/coreos_production_vagrant.json" % [$update_channel, $image_version]

["vmware_fusion", "vmware_workstation"].each do |vmware|
config.vm.provider vmware do |v, override|
override.vm.box_url = "http://%s.release.core-os.net/amd64-usr/%s/coreos_production_vagrant_vmware_fusion.json" % [$update_channel, $image_version]
end
end

config.vm.provider :virtualbox do |v|
# On VirtualBox, we don't have guest additions or a functional vboxsf
# in CoreOS, so tell Vagrant that so it can be smarter.
v.check_guest_additions = false
v.functional_vboxsf = false
end

# plugin conflict
if Vagrant.has_plugin?("vagrant-vbguest") then
config.vbguest.auto_update = false
end

(1..$num_instances).each do |i|
config.vm.define vm_name = "%s-%02d" % [$instance_name_prefix, i] do |config|
config.vm.hostname = vm_name

if $enable_serial_logging
logdir = File.join(File.dirname(__FILE__), "log")
FileUtils.mkdir_p(logdir)

serialFile = File.join(logdir, "%s-serial.txt" % vm_name)
FileUtils.touch(serialFile)

["vmware_fusion", "vmware_workstation"].each do |vmware|
config.vm.provider vmware do |v, override|
v.vmx["serial0.present"] = "TRUE"
v.vmx["serial0.fileType"] = "file"
v.vmx["serial0.fileName"] = serialFile
v.vmx["serial0.tryNoRxLoss"] = "FALSE"
end
end

config.vm.provider :virtualbox do |vb, override|
vb.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"]
vb.customize ["modifyvm", :id, "--uartmode1", serialFile]
end
end

if $expose_docker_tcp
config.vm.network "forwarded_port", guest: 2375, host: ($expose_docker_tcp + i - 1), auto_correct: true
end

$forwarded_ports.each do |guest, host|
config.vm.network "forwarded_port", guest: guest, host: host, auto_correct: true
end

["vmware_fusion", "vmware_workstation"].each do |vmware|
config.vm.provider vmware do |v|
v.gui = vm_gui
v.vmx['memsize'] = vm_memory
v.vmx['numvcpus'] = vm_cpus
end
end

config.vm.provider :virtualbox do |vb|
vb.gui = vm_gui
vb.memory = vm_memory
vb.cpus = vm_cpus
end

ip = "172.17.8.#{i+100}"
config.vm.network :private_network, ip: ip

# Uncomment below to enable NFS for sharing the host machine into the coreos-vagrant VM.
#config.vm.synced_folder ".", "/home/core/share", id: "core", :nfs => true, :mount_options => ['nolock,vers=3,udp']
$shared_folders.each_with_index do |(host_folder, guest_folder), index|
config.vm.synced_folder host_folder.to_s, guest_folder.to_s, id: "core-share%02d" % index, nfs: true, mount_options: ['nolock,vers=3,udp']
end

if $share_home
config.vm.synced_folder ENV['HOME'], ENV['HOME'], id: "home", :nfs => true, :mount_options => ['nolock,vers=3,udp']
end

if File.exist?(CLOUD_CONFIG_PATH)
config.vm.provision :file, :source => "#{CLOUD_CONFIG_PATH}", :destination => "/tmp/vagrantfile-user-data"
config.vm.provision :shell, :inline => "mv /tmp/vagrantfile-user-data /var/lib/coreos-vagrant/", :privileged => true
end

end
end
end
92 changes: 92 additions & 0 deletions config.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# Size of the CoreOS cluster created by Vagrant
$num_instances=1

# Used to fetch a new discovery token for a cluster of size $num_instances
$new_discovery_url="https://discovery.etcd.io/new?size=#{$num_instances}"

# To automatically replace the discovery token on 'vagrant up', uncomment
# the lines below:
#
if File.exists?('user-data') && ARGV[0].eql?('up')
require 'open-uri'
require 'yaml'

token = open($new_discovery_url).read

data = YAML.load(IO.readlines('user-data')[1..-1].join)
if data['coreos'].key? 'etcd'
data['coreos']['etcd']['discovery'] = token
end
if data['coreos'].key? 'etcd2'
data['coreos']['etcd2']['discovery'] = token
end

# Fix for YAML.load() converting reboot-strategy from 'off' to `false`
if data['coreos']['update'].key? 'reboot-strategy'
if data['coreos']['update']['reboot-strategy'] == false
data['coreos']['update']['reboot-strategy'] = 'off'
end
end

yaml = YAML.dump(data)
File.open('user-data', 'w') { |file| file.write("#cloud-config\n\n#{yaml}") }
end
#

#
# coreos-vagrant is configured through a series of configuration
# options (global ruby variables) which are detailed below. To modify
# these options, first copy this file to "config.rb". Then simply
# uncomment the necessary lines, leaving the $, and replace everything
# after the equals sign..

# Change basename of the VM
# The default value is "core", which results in VMs named starting with
# "core-01" through to "core-${num_instances}".
#$instance_name_prefix="core"

# Change the version of CoreOS to be installed
# To deploy a specific version, simply set $image_version accordingly.
# For example, to deploy version 709.0.0, set $image_version="709.0.0".
# The default value is "current", which points to the current version
# of the selected channel
#$image_version = "current"

# Official CoreOS channel from which updates should be downloaded
$update_channel='stable'
#$update_channel='alpha'

# Log the serial consoles of CoreOS VMs to log/
# Enable by setting value to true, disable with false
# WARNING: Serial logging is known to result in extremely high CPU usage with
# VirtualBox, so should only be used in debugging situations
#$enable_serial_logging=false

# Enable port forwarding of Docker TCP socket
# Set to the TCP port you want exposed on the *host* machine, default is 2375
# If 2375 is used, Vagrant will auto-increment (e.g. in the case of $num_instances > 1)
# You can then use the docker tool locally by setting the following env var:
# export DOCKER_HOST='tcp://127.0.0.1:2375'
#$expose_docker_tcp=2375

# Enable NFS sharing of your home directory ($HOME) to CoreOS
# It will be mounted at the same path in the VM as on the host.
# Example: /Users/foobar -> /Users/foobar
#$share_home=false

# Customize VMs
$vm_gui = false
$vm_memory = 512
$vm_cpus = 1

# Share additional folders to the CoreOS VMs
# For example,
# $shared_folders = {'/path/on/host' => '/path/on/guest', '/home/foo/app' => '/app'}
# or, to map host folders to guest folders of the same name,
# $shared_folders = Hash[*['/home/foo/app1', '/home/foo/app2'].map{|d| [d, d]}.flatten]
#$shared_folders = {}
#$shared_folders = {'/Users/kcyeu/Desktop/git/coreos-vagrant' => '/home/core/vagrant'}
$shared_folders = {'/home/kcyeu/git/coreos-vagrant' => '/home/core/vagrant'}

# Enable port forwarding from guest(s) to host machine, syntax is: { 80 => 8080 }, auto correction is enabled by default.
#$forwarded_ports = {}
15 changes: 15 additions & 0 deletions coreos-screenrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
sessionname coreos
hardstatus alwayslastline '%{= bw} %-Lw%{= .}%> %n%f %t*%{= .}%+Lw%< %-=%{g}(%{d}%H/%l%{g})'
setenv PROMPT_COMMAND /usr/bin/true
#setenv VAGRANT_COMMAND /usr/local/bin/vagrant
screen -t bash bash

screen -t core-01 bash
stuff "vagrant ssh core-01"

screen -t core-02 bash
stuff "vagrant ssh core-02"

screen -t core-03 bash
stuff "vagrant ssh core-03"

Expand Down
15 changes: 15 additions & 0 deletions demo-screenrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
sessionname coreos
hardstatus alwayslastline '%{= bw} %-Lw%{= .}%> %n%f %t*%{= .}%+Lw%< %-=%{g}(%{d}%H/%l%{g})'
setenv PROMPT_COMMAND /usr/bin/true
#setenv VAGRANT_COMMAND /usr/local/bin/vagrant
screen -t bash bash

screen -t core-01 bash
stuff "ssh -A [email protected]"

screen -t core-02 bash
stuff "ssh -A [email protected]"

screen -t core-03 bash
stuff "ssh -A [email protected]"

Expand Down
27 changes: 27 additions & 0 deletions docker/nginx-lb/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
FROM nginx:latest
MAINTAINER Kuo-Cheng Yeu <[email protected]>

ENV DEBIAN_FRONTEND noninteractive

# Silently install basic packages
RUN apt-get -qq update && apt-get -qqy install \
nginx \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& mkdir -p /usr/local/bin \
&& mkdir -p /etc/confd/conf.d /etc/confd/templates \
&& rm /etc/nginx/conf.d/default.conf

# add confd
ADD https://github.com/kelseyhightower/confd/releases/download/v0.10.0/confd-0.10.0-linux-amd64 /usr/local/bin/confd

# add template, config, and script
ADD assets/nginx.toml /etc/confd/conf.d/nginx.toml
ADD assets/nginx.tmpl /etc/confd/templates/nginx.tmpl
ADD assets/confd-watch /usr/local/bin/confd-watch

RUN chmod +x /usr/local/bin/*

CMD ["bash"]


29 changes: 29 additions & 0 deletions docker/nginx-lb/assets/confd-watch
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/bin/bash

set -eo pipefail

# etcd2 use IANA-assigned port 2379 and 2380, but port 4001 and 7001 are
# still available for compatibility
export ETCD_PORT=${ETCD_PORT:-4001}
export HOST_IP=${HOST_IP:-172.17.8.1}
export ETCD=$HOST_IP:$ETCD_PORT

echo "[nginx] booting container. ETCD: $ETCD."

# Make initial configuration every 5 seconds until successful
until confd -onetime -node $ETCD -config-file /etc/confd/conf.d/nginx.toml; do
echo "[nginx] waiting for confd to create initial nginx configuration."
sleep 5
done

# Polling `confd` process for changes every 10 seconds
confd -interval 10 -node $ETCD -config-file /etc/confd/conf.d/nginx.toml &
echo "[nginx] confd is now monitoring etcd for changes..."

# Start the Nginx service using the generated config
echo "[nginx] starting nginx service..."
service nginx start

# Follow the logs to allow the script to continue running
tail -f /var/log/nginx/*.log

23 changes: 23 additions & 0 deletions docker/nginx-lb/assets/nginx.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
log_format upstreamlog '[$time_local] $remote_addr passed to: $upstream_addr: $request Upstream Response Time: $upstream_response_time Request time: $request_time';

upstream www_pool {
{{ range getvs "/services/redis-workbench/*" }}
server {{ . }}:80;
{{ end }}
}

server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

access_log /var/log/nginx/access.log upstreamlog;

location / {
proxy_pass http://www_pool;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

21 changes: 21 additions & 0 deletions docker/nginx-lb/assets/nginx.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
[template]

# The name of the template that will be used to render the application's configuration file
# Confd will look in `/etc/conf.d/templates` for these files by default
src = "nginx.tmpl"

# The location to place the rendered configuration file
dest = "/etc/nginx/conf.d/app.conf"

# The etcd keys or directory to watch. This is where the information to fill in
# the template will come from.
keys = [ "/services/redis-workbench" ]

# File ownership and mode information
owner = "root"
mode = "0644"

# These are the commands that will be used to check whether the rendered config is
# valid and to reload the actual service once the new config is in place
check_cmd = "/usr/sbin/nginx -t"
reload_cmd = "/usr/sbin/service nginx reload"
Loading