diff --git a/cluster.yml b/cluster.yml index 6055ead7..fe7cccfc 100644 --- a/cluster.yml +++ b/cluster.yml @@ -9,6 +9,7 @@ auth: # flannel # calico # canal +# weave network: plugin: flannel options: diff --git a/cluster/defaults.go b/cluster/defaults.go index a317586f..1e47e8ea 100644 --- a/cluster/defaults.go +++ b/cluster/defaults.go @@ -27,6 +27,8 @@ const ( 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" 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 e043aeb9..3212abf1 100644 --- a/cluster/network.go +++ b/cluster/network.go @@ -25,6 +25,10 @@ const ( CanalNodeImage = "canal_node_image" CanalCNIImage = "canal_cni_image" CanalFlannelImage = "canal_flannel_image" + + WeaveNetworkPlugin = "weave" + WeaveImage = "weave_node_image" + WeaveCNIImage = "weave_cni_image" ) func (c *Cluster) DeployNetworkPlugin() error { @@ -36,6 +40,8 @@ func (c *Cluster) DeployNetworkPlugin() error { return c.doCalicoDeploy() case CanalNetworkPlugin: return c.doCanalDeploy() + case WeaveNetworkPlugin: + return c.doWeaveDeploy() default: return fmt.Errorf("[network] Unsupported network plugin: %s", c.Network.Plugin) } @@ -78,6 +84,11 @@ func (c *Cluster) doCanalDeploy() error { return c.doAddonDeploy(pluginYaml, NetworkPluginResourceName) } +func (c *Cluster) doWeaveDeploy() error { + pluginYaml := network.GetWeaveManifest(c.ClusterCIDR, c.Network.Options[WeaveImage], c.Network.Options[WeaveCNIImage]) + return c.doAddonDeploy(pluginYaml, NetworkPluginResourceName) +} + func (c *Cluster) setClusterNetworkDefaults() { setDefaultIfEmpty(&c.Network.Plugin, DefaultNetworkPlugin) @@ -99,5 +110,9 @@ func (c *Cluster) setClusterNetworkDefaults() { setDefaultIfEmptyMapValue(c.Network.Options, CanalCNIImage, DefaultCanalCNIImage) setDefaultIfEmptyMapValue(c.Network.Options, CanalNodeImage, DefaultCanalNodeImage) setDefaultIfEmptyMapValue(c.Network.Options, CanalFlannelImage, DefaultCanalFlannelImage) + + case c.Network.Plugin == WeaveNetworkPlugin: + setDefaultIfEmptyMapValue(c.Network.Options, WeaveImage, DefaultWeaveImage) + setDefaultIfEmptyMapValue(c.Network.Options, WeaveCNIImage, DefaultWeaveCNIImage) } } diff --git a/cluster/validation.go b/cluster/validation.go index e0870107..f0dc4740 100644 --- a/cluster/validation.go +++ b/cluster/validation.go @@ -46,7 +46,7 @@ func validateAuthOptions(c *Cluster) error { } func validateNetworkOptions(c *Cluster) error { - if c.Network.Plugin != FlannelNetworkPlugin && c.Network.Plugin != CalicoNetworkPlugin && c.Network.Plugin != CanalNetworkPlugin { + if c.Network.Plugin != FlannelNetworkPlugin && c.Network.Plugin != CalicoNetworkPlugin && c.Network.Plugin != CanalNetworkPlugin && c.Network.Plugin != WeaveNetworkPlugin { return fmt.Errorf("Network plugin [%s] is not supported", c.Network.Plugin) } return nil diff --git a/network/weave.go b/network/weave.go new file mode 100644 index 00000000..b325b74c --- /dev/null +++ b/network/weave.go @@ -0,0 +1,116 @@ +package network + +func GetWeaveManifest(clusterCIDR, image, cniImage string) string { + return `# This ConfigMap can be used to configure a self-hosted Weave Net installation. +apiVersion: v1 +kind: List +items: + - apiVersion: v1 + kind: ServiceAccount + metadata: + name: weave-net + namespace: kube-system + - apiVersion: extensions/v1beta1 + kind: DaemonSet + metadata: + name: weave-net + labels: + name: weave-net + namespace: kube-system + spec: + template: + metadata: + labels: + name: weave-net + spec: + containers: + - name: weave + command: + - /home/weave/launch.sh + env: + - name: HOSTNAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + - name: IPALLOC_RANGE + value: "` + clusterCIDR + `" + image: ` + image + ` + livenessProbe: + httpGet: + host: 127.0.0.1 + path: /status + port: 6784 + initialDelaySeconds: 30 + resources: + requests: + cpu: 10m + securityContext: + privileged: true + volumeMounts: + - name: weavedb + mountPath: /weavedb + - name: cni-bin + mountPath: /host/opt + - name: cni-bin2 + mountPath: /host/home + - name: cni-conf + mountPath: /host/etc + - name: dbus + mountPath: /host/var/lib/dbus + - name: lib-modules + mountPath: /lib/modules + - name: xtables-lock + mountPath: /run/xtables.lock + - name: weave-npc + args: [] + env: + - name: HOSTNAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + image: ` + cniImage + ` + resources: + requests: + cpu: 10m + securityContext: + privileged: true + volumeMounts: + - name: xtables-lock + mountPath: /run/xtables.lock + hostNetwork: true + hostPID: true + restartPolicy: Always + securityContext: + seLinuxOptions: {} + serviceAccountName: weave-net + tolerations: + - effect: NoSchedule + operator: Exists + volumes: + - name: weavedb + hostPath: + path: /var/lib/weave + - name: cni-bin + hostPath: + path: /opt + - name: cni-bin2 + hostPath: + path: /home + - name: cni-conf + hostPath: + path: /etc + - name: dbus + hostPath: + path: /var/lib/dbus + - name: lib-modules + hostPath: + path: /lib/modules + - name: xtables-lock + hostPath: + path: /run/xtables.lock + updateStrategy: + type: RollingUpdate +` +}