Browse Source
Initial version of Flannel using CNI (#1486)
Initial version of Flannel using CNI (#1486)
* Updates Controller Manager/Kubelet with Flannel's required configuration for CNI * Removes old Flannel installation * Install CNI enabled Flannel DaemonSet/ConfigMap/CNI bins and config (with portmap plugin) on host * Uses RBAC if enabled * Fixed an issue that could occur if br_netfilter is not a module and net.bridge.bridge-nf-call-iptables sysctl was not setpull/1575/head
committed by
Matthew Mosesohn
16 changed files with 278 additions and 141 deletions
Unified View
Diff Options
-
7docs/flannel.md
-
2roles/docker/templates/docker-options.conf.j2
-
11roles/download/defaults/main.yml
-
22roles/kubernetes-apps/network_plugin/flannel/tasks/main.yml
-
3roles/kubernetes-apps/network_plugin/meta/main.yml
-
5roles/kubernetes/master/templates/manifests/kube-controller-manager.manifest.j2
-
2roles/kubernetes/node/templates/kubelet.j2
-
7roles/network_plugin/flannel/defaults/main.yml
-
4roles/network_plugin/flannel/handlers/main.yml
-
3roles/network_plugin/flannel/meta/main.yml
-
112roles/network_plugin/flannel/tasks/main.yml
-
19roles/network_plugin/flannel/tasks/pre-upgrade.yml
-
44roles/network_plugin/flannel/templates/cni-flannel-rbac.yml.j2
-
125roles/network_plugin/flannel/templates/cni-flannel.yml.j2
-
6roles/network_plugin/flannel/templates/flannel-options.conf.j2
-
47roles/network_plugin/flannel/templates/flannel-pod.yml
@ -1,3 +1,3 @@ |
|||||
[Service] |
[Service] |
||||
Environment="DOCKER_OPTS={{ docker_options | default('') }} \ |
Environment="DOCKER_OPTS={{ docker_options | default('') }} \ |
||||
--iptables={% if kube_network_plugin == 'flannel' %}true{% else %}false{% endif %}" |
--iptables=false" |
@ -0,0 +1,22 @@ |
|||||
|
--- |
||||
|
- name: "Flannel | Create ServiceAccount ClusterRole and ClusterRoleBinding" |
||||
|
command: "{{ bin_dir }}/kubectl apply -f {{ kube_config_dir }}/cni-flannel-rbac.yml" |
||||
|
run_once: true |
||||
|
when: rbac_enabled and flannel_rbac_manifest.changed |
||||
|
|
||||
|
- name: Flannel | Start Resources |
||||
|
kube: |
||||
|
name: "kube-flannel" |
||||
|
kubectl: "{{ bin_dir }}/kubectl" |
||||
|
filename: "{{ kube_config_dir }}/cni-flannel.yml" |
||||
|
resource: "ds" |
||||
|
namespace: "{{system_namespace}}" |
||||
|
state: "{{ item | ternary('latest','present') }}" |
||||
|
with_items: "{{ flannel_manifest.changed }}" |
||||
|
when: inventory_hostname == groups['kube-master'][0] |
||||
|
|
||||
|
- name: Flannel | Wait for flannel subnet.env file presence |
||||
|
wait_for: |
||||
|
path: /run/flannel/subnet.env |
||||
|
delay: 5 |
||||
|
timeout: 600 |
@ -1,83 +1,47 @@ |
|||||
--- |
--- |
||||
- name: Flannel | Set Flannel etcd configuration |
- include: pre-upgrade.yml |
||||
command: |- |
|
||||
{{ bin_dir }}/etcdctl --peers={{ etcd_access_addresses }} \ |
|
||||
set /{{ cluster_name }}/network/config \ |
|
||||
'{ "Network": "{{ kube_pods_subnet }}", "SubnetLen": {{ kube_network_node_prefix }}, "Backend": { "Type": "{{ flannel_backend_type }}" } }' |
|
||||
delegate_to: "{{groups['etcd'][0]}}" |
|
||||
run_once: true |
|
||||
|
|
||||
- name: Flannel | Create flannel certs directory |
- name: Flannel | Verify if br_netfilter module exists |
||||
file: |
shell: "modinfo br_netfilter" |
||||
dest: "{{ flannel_cert_dir }}" |
register: modinfo_br_netfilter |
||||
state: directory |
failed_when: modinfo_br_netfilter.rc not in [0, 1] |
||||
mode: 0750 |
|
||||
owner: root |
|
||||
group: root |
|
||||
|
|
||||
- name: Flannel | Link etcd certificates for flanneld |
|
||||
file: |
|
||||
src: "{{ etcd_cert_dir }}/{{ item.s }}" |
|
||||
dest: "{{ flannel_cert_dir }}/{{ item.d }}" |
|
||||
state: hard |
|
||||
force: yes |
|
||||
with_items: |
|
||||
- {s: "ca.pem", d: "ca_cert.crt"} |
|
||||
- {s: "node-{{ inventory_hostname }}.pem", d: "cert.crt"} |
|
||||
- {s: "node-{{ inventory_hostname }}-key.pem", d: "key.pem"} |
|
||||
|
|
||||
- name: Flannel | Create flannel pod manifest |
|
||||
template: |
|
||||
src: flannel-pod.yml |
|
||||
dest: "{{kube_manifest_dir}}/flannel-pod.manifest" |
|
||||
notify: Flannel | delete default docker bridge |
|
||||
|
|
||||
- name: Flannel | Wait for flannel subnet.env file presence |
|
||||
wait_for: |
|
||||
path: /run/flannel/subnet.env |
|
||||
delay: 5 |
|
||||
timeout: 600 |
|
||||
|
|
||||
- name: Flannel | Get flannel_subnet from subnet.env |
|
||||
shell: cat /run/flannel/subnet.env | awk -F'=' '$1 == "FLANNEL_SUBNET" {print $2}' |
|
||||
register: flannel_subnet_output |
|
||||
changed_when: false |
changed_when: false |
||||
check_mode: no |
|
||||
|
|
||||
- set_fact: |
- name: Flannel | Enable br_netfilter module |
||||
flannel_subnet: "{{ flannel_subnet_output.stdout }}" |
modprobe: |
||||
|
name: br_netfilter |
||||
|
state: present |
||||
|
when: modinfo_br_netfilter.rc == 0 |
||||
|
|
||||
- name: Flannel | Get flannel_mtu from subnet.env |
# kube-proxy needs net.bridge.bridge-nf-call-iptables enabled when found if br_netfilter is not a module |
||||
shell: cat /run/flannel/subnet.env | awk -F'=' '$1 == "FLANNEL_MTU" {print $2}' |
- name: Flannel | Check if bridge-nf-call-iptables key exists |
||||
register: flannel_mtu_output |
command: "sysctl net.bridge.bridge-nf-call-iptables" |
||||
|
failed_when: false |
||||
changed_when: false |
changed_when: false |
||||
check_mode: no |
register: sysctl_bridge_nf_call_iptables |
||||
|
- name: Flannel | Enable bridge-nf-call tables |
||||
- set_fact: |
sysctl: |
||||
flannel_mtu: "{{ flannel_mtu_output.stdout }}" |
name: "{{ item }}" |
||||
|
state: present |
||||
- set_fact: |
value: 1 |
||||
docker_options_file: >- |
reload: yes |
||||
{%- if ansible_os_family == "Debian" -%}/etc/default/docker{%- elif ansible_os_family == "RedHat" -%}/etc/sysconfig/docker{%- endif -%} |
when: modinfo_br_netfilter.rc == 1 and sysctl_bridge_nf_call_iptables.rc == 0 |
||||
tags: facts |
with_items: |
||||
|
- net.bridge.bridge-nf-call-iptables |
||||
- set_fact: |
- net.bridge.bridge-nf-call-arptables |
||||
docker_options_name: >- |
- net.bridge.bridge-nf-call-ip6tables |
||||
{%- if ansible_os_family == "Debian" -%}DOCKER_OPTS{%- elif ansible_os_family == "RedHat" -%}other_args{%- endif -%} |
|
||||
tags: facts |
|
||||
|
|
||||
- set_fact: |
|
||||
docker_network_options: '"--bip={{ flannel_subnet }} --mtu={{ flannel_mtu }}"' |
|
||||
|
|
||||
- name: Flannel | Ensure path for docker network systemd drop-in |
- name: Flannel | Create cni-flannel-rbac manifest |
||||
file: |
template: |
||||
path: "/etc/systemd/system/docker.service.d" |
src: cni-flannel-rbac.yml.j2 |
||||
state: directory |
dest: "{{ kube_config_dir }}/cni-flannel-rbac.yml" |
||||
owner: root |
register: flannel_rbac_manifest |
||||
|
when: inventory_hostname == groups['kube-master'][0] and rbac_enabled |
||||
|
|
||||
- name: Flannel | Create docker network systemd drop-in |
- name: Flannel | Create cni-flannel manifest |
||||
template: |
template: |
||||
src: flannel-options.conf.j2 |
src: cni-flannel.yml.j2 |
||||
dest: "/etc/systemd/system/docker.service.d/flannel-options.conf" |
dest: "{{ kube_config_dir }}/cni-flannel.yml" |
||||
notify: |
register: flannel_manifest |
||||
- Flannel | restart docker |
when: inventory_hostname == groups['kube-master'][0] |
@ -0,0 +1,19 @@ |
|||||
|
--- |
||||
|
- name: Flannel pre-upgrade | Purge legacy flannel systemd unit file |
||||
|
file: |
||||
|
path: "/etc/systemd/system/docker.service.d/flannel-options.conf" |
||||
|
state: absent |
||||
|
notify: |
||||
|
- Flannel | delete default docker bridge |
||||
|
|
||||
|
- name: Flannel pre-upgrade | Purge legacy Flannel static pod manifest |
||||
|
file: |
||||
|
path: "{{ kube_manifest_dir }}/flannel-pod.manifest" |
||||
|
state: absent |
||||
|
notify: |
||||
|
- Flannel | delete flannel interface |
||||
|
|
||||
|
- name: Flannel pre-upgrade | Remove Flannel's certificate directory not required by CNI |
||||
|
file: |
||||
|
dest: "{{ flannel_cert_dir }}" |
||||
|
state: absent |
@ -0,0 +1,44 @@ |
|||||
|
--- |
||||
|
apiVersion: v1 |
||||
|
kind: ServiceAccount |
||||
|
metadata: |
||||
|
name: flannel |
||||
|
namespace: "{{system_namespace}}" |
||||
|
--- |
||||
|
kind: ClusterRole |
||||
|
apiVersion: rbac.authorization.k8s.io/v1beta1 |
||||
|
metadata: |
||||
|
name: flannel |
||||
|
rules: |
||||
|
- apiGroups: |
||||
|
- "" |
||||
|
resources: |
||||
|
- pods |
||||
|
verbs: |
||||
|
- get |
||||
|
- apiGroups: |
||||
|
- "" |
||||
|
resources: |
||||
|
- nodes |
||||
|
verbs: |
||||
|
- list |
||||
|
- watch |
||||
|
- apiGroups: |
||||
|
- "" |
||||
|
resources: |
||||
|
- nodes/status |
||||
|
verbs: |
||||
|
- patch |
||||
|
--- |
||||
|
kind: ClusterRoleBinding |
||||
|
apiVersion: rbac.authorization.k8s.io/v1beta1 |
||||
|
metadata: |
||||
|
name: flannel |
||||
|
roleRef: |
||||
|
apiGroup: rbac.authorization.k8s.io |
||||
|
kind: ClusterRole |
||||
|
name: flannel |
||||
|
subjects: |
||||
|
- kind: ServiceAccount |
||||
|
name: flannel |
||||
|
namespace: "{{system_namespace}}" |
@ -0,0 +1,125 @@ |
|||||
|
--- |
||||
|
kind: ConfigMap |
||||
|
apiVersion: v1 |
||||
|
metadata: |
||||
|
name: kube-flannel-cfg |
||||
|
namespace: "{{system_namespace}}" |
||||
|
labels: |
||||
|
tier: node |
||||
|
app: flannel |
||||
|
data: |
||||
|
cni-conf.json: | |
||||
|
{ |
||||
|
"name":"cbr0", |
||||
|
"cniVersion":"0.3.1", |
||||
|
"plugins":[ |
||||
|
{ |
||||
|
"type":"flannel", |
||||
|
"delegate":{ |
||||
|
"forceAddress":true, |
||||
|
"isDefaultGateway":true |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
"type":"portmap", |
||||
|
"capabilities":{ |
||||
|
"portMappings":true |
||||
|
} |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
net-conf.json: | |
||||
|
{ |
||||
|
"Network": "{{ kube_pods_subnet }}", |
||||
|
"Backend": { |
||||
|
"Type": "{{ flannel_backend_type }}" |
||||
|
} |
||||
|
} |
||||
|
--- |
||||
|
apiVersion: extensions/v1beta1 |
||||
|
kind: DaemonSet |
||||
|
metadata: |
||||
|
name: kube-flannel |
||||
|
namespace: "{{system_namespace}}" |
||||
|
labels: |
||||
|
tier: node |
||||
|
k8s-app: flannel |
||||
|
spec: |
||||
|
template: |
||||
|
metadata: |
||||
|
labels: |
||||
|
tier: node |
||||
|
k8s-app: flannel |
||||
|
spec: |
||||
|
{% if rbac_enabled %} |
||||
|
serviceAccountName: flannel |
||||
|
{% endif %} |
||||
|
containers: |
||||
|
- name: kube-flannel |
||||
|
image: {{ flannel_image_repo }}:{{ flannel_image_tag }} |
||||
|
imagePullPolicy: {{ k8s_image_pull_policy }} |
||||
|
resources: |
||||
|
limits: |
||||
|
cpu: {{ flannel_cpu_limit }} |
||||
|
memory: {{ flannel_memory_limit }} |
||||
|
requests: |
||||
|
cpu: {{ flannel_cpu_requests }} |
||||
|
memory: {{ flannel_memory_requests }} |
||||
|
command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr"{% if flannel_interface is defined %}, "--iface={{ flannel_interface }}"{% endif %} ] |
||||
|
securityContext: |
||||
|
privileged: true |
||||
|
env: |
||||
|
- name: POD_NAME |
||||
|
valueFrom: |
||||
|
fieldRef: |
||||
|
fieldPath: metadata.name |
||||
|
- name: POD_NAMESPACE |
||||
|
valueFrom: |
||||
|
fieldRef: |
||||
|
fieldPath: metadata.namespace |
||||
|
volumeMounts: |
||||
|
- name: run |
||||
|
mountPath: /run |
||||
|
- name: cni |
||||
|
mountPath: /etc/cni/net.d |
||||
|
- name: flannel-cfg |
||||
|
mountPath: /etc/kube-flannel/ |
||||
|
- name: install-cni |
||||
|
image: {{ flannel_cni_image_repo }}:{{ flannel_cni_image_tag }} |
||||
|
command: ["/install-cni.sh"] |
||||
|
env: |
||||
|
# The CNI network config to install on each node. |
||||
|
- name: CNI_NETWORK_CONFIG |
||||
|
valueFrom: |
||||
|
configMapKeyRef: |
||||
|
name: kube-flannel-cfg |
||||
|
key: cni-conf.json |
||||
|
- name: CNI_CONF_NAME |
||||
|
value: "10-flannel.conflist" |
||||
|
volumeMounts: |
||||
|
- name: cni |
||||
|
mountPath: /host/etc/cni/net.d |
||||
|
- name: host-cni-bin |
||||
|
mountPath: /host/opt/cni/bin/ |
||||
|
hostNetwork: true |
||||
|
tolerations: |
||||
|
- key: node-role.kubernetes.io/master |
||||
|
operator: Exists |
||||
|
effect: NoSchedule |
||||
|
volumes: |
||||
|
- name: run |
||||
|
hostPath: |
||||
|
path: /run |
||||
|
- name: cni |
||||
|
hostPath: |
||||
|
path: /etc/cni/net.d |
||||
|
- name: flannel-cfg |
||||
|
configMap: |
||||
|
name: kube-flannel-cfg |
||||
|
- name: host-cni-bin |
||||
|
hostPath: |
||||
|
path: /opt/cni/bin |
||||
|
updateStrategy: |
||||
|
rollingUpdate: |
||||
|
maxUnavailable: 1 |
||||
|
type: RollingUpdate |
@ -1,6 +0,0 @@ |
|||||
[Service] |
|
||||
{% if ansible_os_family in ["CoreOS", "Container Linux by CoreOS"] %} |
|
||||
Environment="DOCKER_OPT_BIP=--bip={{ flannel_subnet }} --mtu={{ flannel_mtu }}" |
|
||||
{% else %} |
|
||||
Environment="DOCKER_NETWORK_OPTIONS=--bip={{ flannel_subnet }} --mtu={{ flannel_mtu }}" |
|
||||
{% endif %} |
|
@ -1,47 +0,0 @@ |
|||||
--- |
|
||||
kind: "Pod" |
|
||||
apiVersion: "v1" |
|
||||
metadata: |
|
||||
name: "flannel" |
|
||||
namespace: "{{system_namespace}}" |
|
||||
labels: |
|
||||
app: "flannel" |
|
||||
version: "v0.1" |
|
||||
spec: |
|
||||
tolerations: |
|
||||
- effect: NoSchedule |
|
||||
operator: Exists |
|
||||
volumes: |
|
||||
- name: "subnetenv" |
|
||||
hostPath: |
|
||||
path: "/run/flannel" |
|
||||
- name: "etcd-certs" |
|
||||
hostPath: |
|
||||
path: "{{ flannel_cert_dir }}" |
|
||||
containers: |
|
||||
- name: "flannel-container" |
|
||||
image: "{{ flannel_image_repo }}:{{ flannel_image_tag }}" |
|
||||
imagePullPolicy: {{ k8s_image_pull_policy }} |
|
||||
resources: |
|
||||
limits: |
|
||||
cpu: {{ flannel_cpu_limit }} |
|
||||
memory: {{ flannel_memory_limit }} |
|
||||
requests: |
|
||||
cpu: {{ flannel_cpu_requests }} |
|
||||
memory: {{ flannel_memory_requests }} |
|
||||
command: |
|
||||
- "/bin/sh" |
|
||||
- "-c" |
|
||||
- "/opt/bin/flanneld -etcd-endpoints {{ etcd_access_endpoint }} -etcd-prefix /{{ cluster_name }}/network -etcd-cafile {{ flannel_cert_dir }}/ca_cert.crt -etcd-certfile {{ flannel_cert_dir }}/cert.crt -etcd-keyfile {{ flannel_cert_dir }}/key.pem {% if flannel_interface is defined %}-iface {{ flannel_interface }}{% endif %} {% if flannel_public_ip is defined %}-public-ip {{ flannel_public_ip }}{% endif %}" |
|
||||
ports: |
|
||||
- hostPort: 10253 |
|
||||
containerPort: 10253 |
|
||||
volumeMounts: |
|
||||
- name: "subnetenv" |
|
||||
mountPath: "/run/flannel" |
|
||||
- name: "etcd-certs" |
|
||||
mountPath: "{{ flannel_cert_dir }}" |
|
||||
readOnly: true |
|
||||
securityContext: |
|
||||
privileged: true |
|
||||
hostNetwork: true |
|
xxxxxxxxxx