From a95243450e16ecffe40cfeaa683f6087c8eb69fe Mon Sep 17 00:00:00 2001 From: Eric Paris Date: Tue, 31 Mar 2015 18:05:36 -0400 Subject: [PATCH] Set up flannel in your cluster! --- contrib/ansible/README.md | 4 ++++ contrib/ansible/cluster.yml | 11 +++++++++ contrib/ansible/group_vars/all.yml | 19 +++++++++++++++ .../ansible/roles/flannel/handlers/main.yml | 18 +++++++++++++++ contrib/ansible/roles/flannel/meta/main.yml | 3 +++ .../ansible/roles/flannel/tasks/client.yml | 17 ++++++++++++++ .../ansible/roles/flannel/tasks/config.yml | 23 +++++++++++++++++++ contrib/ansible/roles/flannel/tasks/main.yml | 5 ++++ .../flannel/templates/flannel-conf.json.j2 | 1 + .../roles/flannel/templates/flanneld.j2 | 11 +++++++++ 10 files changed, 112 insertions(+) create mode 100644 contrib/ansible/roles/flannel/handlers/main.yml create mode 100644 contrib/ansible/roles/flannel/meta/main.yml create mode 100644 contrib/ansible/roles/flannel/tasks/client.yml create mode 100644 contrib/ansible/roles/flannel/tasks/config.yml create mode 100644 contrib/ansible/roles/flannel/tasks/main.yml create mode 100644 contrib/ansible/roles/flannel/templates/flannel-conf.json.j2 create mode 100644 contrib/ansible/roles/flannel/templates/flanneld.j2 diff --git a/contrib/ansible/README.md b/contrib/ansible/README.md index 189e4b5d55..8813f9d773 100644 --- a/contrib/ansible/README.md +++ b/contrib/ansible/README.md @@ -47,4 +47,8 @@ Only the kubernetes nodes: `INVENTORY=myinventory ./setup.sh` +Only flannel: + + $ ./setup.sh --tags=flannel + [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/contrib/ansible/README.md?pixel)]() diff --git a/contrib/ansible/cluster.yml b/contrib/ansible/cluster.yml index e951d91617..11829488a0 100644 --- a/contrib/ansible/cluster.yml +++ b/contrib/ansible/cluster.yml @@ -8,6 +8,17 @@ tags: - etcd +# install flannel +- hosts: + - etcd + - masters + - nodes + sudo: yes + roles: + - flannel + tags: + - flannel + # install kube master services - hosts: masters sudo: yes diff --git a/contrib/ansible/group_vars/all.yml b/contrib/ansible/group_vars/all.yml index ae9d7dc2fb..456854204a 100644 --- a/contrib/ansible/group_vars/all.yml +++ b/contrib/ansible/group_vars/all.yml @@ -1,3 +1,7 @@ +# Only used for the location to store flannel info in etcd, but may be used +# for dns purposes and cluster id purposes in the future. +cluster_name: kube.local + # Account name of remote user. Ansible will use this user account to ssh into # the managed machines. The user must be able to use sudo without asking # for password unless ansible_sudo_pass is set @@ -15,3 +19,18 @@ ansible_ssh_user: root # This range must not conflict with anything in your infrastructure. These # addresses do not need to be routable and must just be an unused block of space. kube_service_addresses: 10.254.0.0/16 + +# Flannel internal network (optional). When flannel is used, it will assign IP +# addresses from this range to individual pods. +# This network must be unused in your network infrastructure! +flannel_subnet: 172.16.0.0 + +# Flannel internal network total size (optional). This is the prefix of the +# entire flannel overlay network. So the entirety of 172.16.0.0/12 must be +# unused in your environment. +flannel_prefix: 12 + +# Flannel internal network (optional). This is the size allocation that flannel +# will give to each node on your network. With these defaults you should have +# room for 4096 nodes with 254 pods per node. +flannel_host_prefix: 24 diff --git a/contrib/ansible/roles/flannel/handlers/main.yml b/contrib/ansible/roles/flannel/handlers/main.yml new file mode 100644 index 0000000000..e64c241cec --- /dev/null +++ b/contrib/ansible/roles/flannel/handlers/main.yml @@ -0,0 +1,18 @@ +--- +- name: restart flannel + service: name=flanneld state=restarted + notify: + - stop docker + - delete docker0 + - start docker + when: inventory_hostname in groups['nodes'] + +- name: stop docker + service: name=docker state=stopped + +- name: delete docker0 + command: ip link delete docker0 + ignore_errors: yes + +- name: start docker + service: name=docker state=started diff --git a/contrib/ansible/roles/flannel/meta/main.yml b/contrib/ansible/roles/flannel/meta/main.yml new file mode 100644 index 0000000000..0764e31482 --- /dev/null +++ b/contrib/ansible/roles/flannel/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - { role: common } diff --git a/contrib/ansible/roles/flannel/tasks/client.yml b/contrib/ansible/roles/flannel/tasks/client.yml new file mode 100644 index 0000000000..6f124404a7 --- /dev/null +++ b/contrib/ansible/roles/flannel/tasks/client.yml @@ -0,0 +1,17 @@ +--- +- name: Install flannel + action: "{{ ansible_pkg_mgr }}" + args: + name: flannel + state: latest + when: not is_atomic + +- name: Install Flannel config file + template: src=flanneld.j2 dest=/etc/sysconfig/flanneld + notify: + - restart flannel + +- name: Launch Flannel + service: name=flanneld state=started enabled=yes + notify: + - restart flannel diff --git a/contrib/ansible/roles/flannel/tasks/config.yml b/contrib/ansible/roles/flannel/tasks/config.yml new file mode 100644 index 0000000000..654576fe8b --- /dev/null +++ b/contrib/ansible/roles/flannel/tasks/config.yml @@ -0,0 +1,23 @@ +--- +- name: Set facts about etcdctl command + set_fact: + peers: "{% for hostname in groups['etcd'] %}http://{{ hostname }}:2379{% if not loop.last %},{% endif %}{% endfor %}" + conf_file: "/tmp/flannel-conf.json" + conf_loc: "/{{ cluster_name }}/network/config" + run_once: true + delegate_to: "{{ groups['etcd'][0] }}" + +- name: Create flannel config file to go in etcd + template: src=flannel-conf.json.j2 dest={{ conf_file }} + run_once: true + delegate_to: "{{ groups['etcd'][0] }}" + +- name: Load the flannel config file into etcd + shell: "/usr/bin/etcdctl --no-sync --peers={{ peers }} set {{ conf_loc }} < {{ conf_file }}" + run_once: true + delegate_to: "{{ groups['etcd'][0] }}" + +- name: Clean up the flannel config file + file: path=/tmp/flannel-config.json state=absent + run_once: true + delegate_to: "{{ groups['etcd'][0] }}" diff --git a/contrib/ansible/roles/flannel/tasks/main.yml b/contrib/ansible/roles/flannel/tasks/main.yml new file mode 100644 index 0000000000..be7e7501b9 --- /dev/null +++ b/contrib/ansible/roles/flannel/tasks/main.yml @@ -0,0 +1,5 @@ +--- +- include: config.yml + +- include: client.yml + when: inventory_hostname in groups['masters'] + groups['nodes'] diff --git a/contrib/ansible/roles/flannel/templates/flannel-conf.json.j2 b/contrib/ansible/roles/flannel/templates/flannel-conf.json.j2 new file mode 100644 index 0000000000..15c68e5934 --- /dev/null +++ b/contrib/ansible/roles/flannel/templates/flannel-conf.json.j2 @@ -0,0 +1 @@ +{ "Network": "{{ flannel_subnet }}/{{ flannel_prefix }}", "SubnetLen": {{ flannel_host_prefix }}, "Backend": { "Type": "vxlan" } } diff --git a/contrib/ansible/roles/flannel/templates/flanneld.j2 b/contrib/ansible/roles/flannel/templates/flanneld.j2 new file mode 100644 index 0000000000..7345c10216 --- /dev/null +++ b/contrib/ansible/roles/flannel/templates/flanneld.j2 @@ -0,0 +1,11 @@ +# Flanneld configuration options + +# etcd url location. Point this to the server where etcd runs +FLANNEL_ETCD="http://{{ groups['etcd'][0] }}:2379" + +# etcd config key. This is the configuration key that flannel queries +# For address range assignment +FLANNEL_ETCD_KEY="/{{ cluster_name }}/network" + +# Any additional options that you want to pass +#FLANNEL_OPTIONS=""