From 579038a5a2af17e31b9e17b1edc5f3bf89e1e63e Mon Sep 17 00:00:00 2001 From: moelsayed Date: Thu, 7 Dec 2017 20:07:23 +0200 Subject: [PATCH] Enable AWS specific configuration for Calico --- cluster.yml | 3 +++ cluster/defaults.go | 21 +++++++++++-------- cluster/network.go | 40 +++++++++++++++++++++++++++--------- network/calico.go | 50 ++++++++++++++++++++++++++++++++++++++++++++- network/network.go | 3 +++ 5 files changed, 98 insertions(+), 19 deletions(-) diff --git a/cluster.yml b/cluster.yml index fe7cccfc..84968c1a 100644 --- a/cluster.yml +++ b/cluster.yml @@ -10,6 +10,9 @@ auth: # calico # canal # weave +# +# If you are using calico on AWS, use the network plugin config option: +# 'cloud_provider: aws' network: plugin: flannel options: diff --git a/cluster/defaults.go b/cluster/defaults.go index 1e47e8ea..e4081d7b 100644 --- a/cluster/defaults.go +++ b/cluster/defaults.go @@ -11,7 +11,8 @@ const ( DefaultAuthStrategy = "x509" - DefaultNetworkPlugin = "flannel" + DefaultNetworkPlugin = "flannel" + DefaultNetworkCloudProvider = "none" DefaultInfraContainerImage = "gcr.io/google_containers/pause-amd64:3.0" DefaultAplineImage = "alpine:latest" @@ -19,16 +20,20 @@ const ( DefaultCertDownloaderImage = "rancher/rke-cert-deployer:0.1.0" DefaultServiceSidekickImage = "rancher/rke-service-sidekick:0.1.0" - DefaultFlannelImage = "quay.io/coreos/flannel:v0.9.1" - DefaultFlannelCNIImage = "quay.io/coreos/flannel-cni:v0.2.0" + DefaultFlannelImage = "quay.io/coreos/flannel:v0.9.1" + DefaultFlannelCNIImage = "quay.io/coreos/flannel-cni:v0.2.0" + DefaultCalicoNodeImage = "quay.io/calico/node:v2.6.2" DefaultCalicoCNIImage = "quay.io/calico/cni:v1.11.0" DefaultCalicoControllersImage = "quay.io/calico/kube-controllers:v1.0.0" - DefaultCanalNodeImage = "quay.io/calico/node:v2.6.2" - DefaultCanalCNIImage = "quay.io/calico/cni:v1.11.0" - DefaultCanalFlannelImage = "quay.io/coreos/flannel:v0.9.1" - DefaultWeaveImage = "weaveworks/weave-kube:2.1.2" - DefaultWeaveCNIImage = "weaveworks/weave-npc:2.1.2" + DefaultCalicoctlImage = "quay.io/calico/ctl:v1.6.2" + + DefaultWeaveImage = "weaveworks/weave-kube:2.1.2" + DefaultWeaveCNIImage = "weaveworks/weave-npc:2.1.2" + + DefaultCanalNodeImage = "quay.io/calico/node:v2.6.2" + DefaultCanalCNIImage = "quay.io/calico/cni:v1.11.0" + DefaultCanalFlannelImage = "quay.io/coreos/flannel:v0.9.1" DefaultKubeDNSImage = "gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.5" DefaultDNSMasqImage = "gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.5" diff --git a/cluster/network.go b/cluster/network.go index fd3d68d0..66424d71 100644 --- a/cluster/network.go +++ b/cluster/network.go @@ -11,6 +11,7 @@ import ( const ( NetworkPluginResourceName = "rke-network-plugin" + CloudProvider = "cloud_provider" FlannelNetworkPlugin = "flannel" FlannelImage = "flannel_image" @@ -21,6 +22,7 @@ const ( CalicoNodeImage = "calico_node_image" CalicoCNIImage = "calico_cni_image" CalicoControllersImages = "calico_controllers_image" + CalicoctlImage = "calicoctl_image" CanalNetworkPlugin = "canal" CanalNodeImage = "canal_node_image" @@ -71,6 +73,8 @@ func (c *Cluster) doCalicoDeploy() error { network.CNIImage: c.Network.Options[CalicoCNIImage], network.NodeImage: c.Network.Options[CalicoNodeImage], network.ControllersImage: c.Network.Options[CalicoControllersImages], + network.CalicoctlImage: c.Network.Options[CalicoctlImage], + network.CloudProvider: c.Network.Options[CloudProvider], } pluginYaml := network.GetCalicoManifest(calicoConfig) return c.doAddonDeploy(pluginYaml, NetworkPluginResourceName) @@ -103,23 +107,39 @@ func (c *Cluster) setClusterNetworkDefaults() { // don't break if the user didn't define options c.Network.Options = make(map[string]string) } + networkPluginConfigDefaultsMap := make(map[string]string) switch { case c.Network.Plugin == FlannelNetworkPlugin: - setDefaultIfEmptyMapValue(c.Network.Options, FlannelImage, DefaultFlannelImage) - setDefaultIfEmptyMapValue(c.Network.Options, FlannelCNIImage, DefaultFlannelCNIImage) + networkPluginConfigDefaultsMap = map[string]string{ + FlannelImage: DefaultFlannelImage, + FlannelCNIImage: DefaultFlannelCNIImage, + } case c.Network.Plugin == CalicoNetworkPlugin: - setDefaultIfEmptyMapValue(c.Network.Options, CalicoCNIImage, DefaultCalicoCNIImage) - setDefaultIfEmptyMapValue(c.Network.Options, CalicoNodeImage, DefaultCalicoNodeImage) - setDefaultIfEmptyMapValue(c.Network.Options, CalicoControllersImages, DefaultCalicoControllersImage) + networkPluginConfigDefaultsMap = map[string]string{ + CalicoCNIImage: DefaultCalicoCNIImage, + CalicoNodeImage: DefaultCalicoNodeImage, + CalicoControllersImages: DefaultCalicoControllersImage, + CloudProvider: DefaultNetworkCloudProvider, + CalicoctlImage: DefaultCalicoctlImage, + } case c.Network.Plugin == CanalNetworkPlugin: - setDefaultIfEmptyMapValue(c.Network.Options, CanalCNIImage, DefaultCanalCNIImage) - setDefaultIfEmptyMapValue(c.Network.Options, CanalNodeImage, DefaultCanalNodeImage) - setDefaultIfEmptyMapValue(c.Network.Options, CanalFlannelImage, DefaultCanalFlannelImage) + networkPluginConfigDefaultsMap = map[string]string{ + CanalCNIImage: DefaultCanalCNIImage, + CanalNodeImage: DefaultCanalNodeImage, + CanalFlannelImage: DefaultCanalFlannelImage, + } case c.Network.Plugin == WeaveNetworkPlugin: - setDefaultIfEmptyMapValue(c.Network.Options, WeaveImage, DefaultWeaveImage) - setDefaultIfEmptyMapValue(c.Network.Options, WeaveCNIImage, DefaultWeaveCNIImage) + networkPluginConfigDefaultsMap = map[string]string{ + WeaveImage: DefaultWeaveImage, + WeaveCNIImage: DefaultWeaveCNIImage, + } } + + for k, v := range networkPluginConfigDefaultsMap { + setDefaultIfEmptyMapValue(c.Network.Options, k, v) + } + } diff --git a/network/calico.go b/network/calico.go index f1c41b9e..4171649c 100644 --- a/network/calico.go +++ b/network/calico.go @@ -1,6 +1,54 @@ package network func GetCalicoManifest(calicoConfig map[string]string) string { + awsIPPool := "" + if calicoConfig[CloudProvider] == AWSCloudProvider { + awsIPPool = ` +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: aws-ippool + namespace: kube-system +data: + aws-ippool: |- + apiVersion: v1 + kind: ipPool + metadata: + cidr: ` + calicoConfig[ClusterCIDR] + ` + spec: + nat-outgoing: true +--- +apiVersion: v1 +kind: Pod +metadata: + name: calicoctl + namespace: kube-system +spec: + hostNetwork: true + restartPolicy: OnFailure + containers: + - name: calicoctl + image: ` + calicoConfig[CalicoctlImage] + ` + command: ["/bin/sh", "-c", "calicoctl apply -f aws-ippool.yaml"] + env: + - name: ETCD_ENDPOINTS + valueFrom: + configMapKeyRef: + name: calico-config + key: etcd_endpoints + volumeMounts: + - name: ippool-config + mountPath: /root/ + volumes: + - name: ippool-config + configMap: + name: aws-ippool + items: + - key: aws-ippool + path: aws-ippool.yaml + ` + } return `# Calico Version master # https://docs.projectcalico.org/master/releases#master @@ -389,11 +437,11 @@ metadata: namespace: kube-system --- - apiVersion: v1 kind: ServiceAccount metadata: name: calico-node namespace: kube-system +` + awsIPPool + ` ` } diff --git a/network/network.go b/network/network.go index 3b53e0ba..1f1121d5 100644 --- a/network/network.go +++ b/network/network.go @@ -11,7 +11,10 @@ const ( CNIImage = "cniImage" NodeImage = "nodeImage" ControllersImage = "controllersImage" + CalicoctlImage = "calicoctlImage" FlannelImage = "flannelImage" FlannelCNIImage = "flannelCNIImage" FlannelIface = "flannelIface" + CloudProvider = "cloudprovider" + AWSCloudProvider = "aws" )