2017-11-06 20:50:41 +00:00
|
|
|
package cluster
|
|
|
|
|
|
|
|
import (
|
2018-01-09 22:10:56 +00:00
|
|
|
"context"
|
2017-11-21 23:49:30 +00:00
|
|
|
"fmt"
|
|
|
|
|
2018-01-09 22:10:56 +00:00
|
|
|
"github.com/rancher/rke/log"
|
2017-11-21 23:49:30 +00:00
|
|
|
"github.com/rancher/rke/pki"
|
|
|
|
"github.com/rancher/rke/services"
|
2017-12-16 03:37:45 +00:00
|
|
|
"github.com/rancher/rke/templates"
|
2017-11-06 20:50:41 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
2017-11-30 14:49:00 +00:00
|
|
|
NetworkPluginResourceName = "rke-network-plugin"
|
2017-12-05 01:29:29 +00:00
|
|
|
|
|
|
|
FlannelNetworkPlugin = "flannel"
|
|
|
|
FlannelImage = "flannel_image"
|
|
|
|
FlannelCNIImage = "flannel_cni_image"
|
2017-12-12 16:14:18 +00:00
|
|
|
FlannelIface = "flannel_iface"
|
2017-12-05 01:29:29 +00:00
|
|
|
|
2017-12-16 03:37:45 +00:00
|
|
|
CalicoNetworkPlugin = "calico"
|
|
|
|
CalicoNodeImage = "calico_node_image"
|
|
|
|
CalicoCNIImage = "calico_cni_image"
|
|
|
|
CalicoControllersImage = "calico_controllers_image"
|
|
|
|
CalicoctlImage = "calicoctl_image"
|
|
|
|
CalicoCloudProvider = "calico_cloud_provider"
|
2017-12-05 01:29:29 +00:00
|
|
|
|
|
|
|
CanalNetworkPlugin = "canal"
|
|
|
|
CanalNodeImage = "canal_node_image"
|
|
|
|
CanalCNIImage = "canal_cni_image"
|
|
|
|
CanalFlannelImage = "canal_flannel_image"
|
2017-12-06 03:53:51 +00:00
|
|
|
|
|
|
|
WeaveNetworkPlugin = "weave"
|
|
|
|
WeaveImage = "weave_node_image"
|
|
|
|
WeaveCNIImage = "weave_cni_image"
|
2017-12-16 03:37:45 +00:00
|
|
|
|
|
|
|
// List of map keys to be used with network templates
|
|
|
|
|
|
|
|
// EtcdEndpoints is the server address for Etcd, used by calico
|
|
|
|
EtcdEndpoints = "EtcdEndpoints"
|
|
|
|
// APIRoot is the kubernetes API address
|
|
|
|
APIRoot = "APIRoot"
|
|
|
|
// kubernetes client certificates and kubeconfig paths
|
|
|
|
|
|
|
|
ClientCert = "ClientCert"
|
|
|
|
ClientKey = "ClientKey"
|
|
|
|
ClientCA = "ClientCA"
|
|
|
|
KubeCfg = "KubeCfg"
|
|
|
|
|
|
|
|
ClusterCIDR = "ClusterCIDR"
|
|
|
|
// Images key names
|
|
|
|
|
|
|
|
Image = "Image"
|
|
|
|
CNIImage = "CNIImage"
|
|
|
|
NodeImage = "NodeImage"
|
|
|
|
ControllersImage = "ControllersImage"
|
|
|
|
CanalFlannelImg = "CanalFlannelImg"
|
|
|
|
|
|
|
|
Calicoctl = "Calicoctl"
|
|
|
|
|
|
|
|
FlannelInterface = "FlannelInterface"
|
|
|
|
CloudProvider = "CloudProvider"
|
|
|
|
AWSCloudProvider = "aws"
|
|
|
|
RBACConfig = "RBACConfig"
|
2017-11-06 20:50:41 +00:00
|
|
|
)
|
|
|
|
|
2018-01-09 22:10:56 +00:00
|
|
|
func (c *Cluster) DeployNetworkPlugin(ctx context.Context) error {
|
|
|
|
log.Infof(ctx, "[network] Setting up network plugin: %s", c.Network.Plugin)
|
2017-11-21 23:49:30 +00:00
|
|
|
switch c.Network.Plugin {
|
2017-11-28 17:45:24 +00:00
|
|
|
case FlannelNetworkPlugin:
|
2018-01-09 22:10:56 +00:00
|
|
|
return c.doFlannelDeploy(ctx)
|
2017-11-28 17:45:24 +00:00
|
|
|
case CalicoNetworkPlugin:
|
2018-01-09 22:10:56 +00:00
|
|
|
return c.doCalicoDeploy(ctx)
|
2017-11-28 17:45:24 +00:00
|
|
|
case CanalNetworkPlugin:
|
2018-01-09 22:10:56 +00:00
|
|
|
return c.doCanalDeploy(ctx)
|
2017-11-30 11:35:31 +00:00
|
|
|
case WeaveNetworkPlugin:
|
2018-01-09 22:10:56 +00:00
|
|
|
return c.doWeaveDeploy(ctx)
|
2017-11-21 23:49:30 +00:00
|
|
|
default:
|
|
|
|
return fmt.Errorf("[network] Unsupported network plugin: %s", c.Network.Plugin)
|
|
|
|
}
|
|
|
|
}
|
2017-11-08 17:45:51 +00:00
|
|
|
|
2018-01-09 22:10:56 +00:00
|
|
|
func (c *Cluster) doFlannelDeploy(ctx context.Context) error {
|
2017-12-12 16:14:18 +00:00
|
|
|
flannelConfig := map[string]string{
|
2017-12-16 03:37:45 +00:00
|
|
|
ClusterCIDR: c.ClusterCIDR,
|
|
|
|
Image: c.Network.Options[FlannelImage],
|
|
|
|
CNIImage: c.Network.Options[FlannelCNIImage],
|
|
|
|
FlannelInterface: c.Network.Options[FlannelIface],
|
|
|
|
RBACConfig: c.Authorization.Mode,
|
|
|
|
}
|
|
|
|
pluginYaml, err := c.getNetworkPluginManifest(flannelConfig)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
2017-12-12 16:14:18 +00:00
|
|
|
}
|
2018-01-09 22:10:56 +00:00
|
|
|
return c.doAddonDeploy(ctx, pluginYaml, NetworkPluginResourceName)
|
2017-11-21 23:49:30 +00:00
|
|
|
}
|
2017-11-18 12:51:28 +00:00
|
|
|
|
2018-01-09 22:10:56 +00:00
|
|
|
func (c *Cluster) doCalicoDeploy(ctx context.Context) error {
|
2017-12-05 01:29:29 +00:00
|
|
|
calicoConfig := map[string]string{
|
2017-12-16 03:37:45 +00:00
|
|
|
EtcdEndpoints: services.GetEtcdConnString(c.EtcdHosts),
|
|
|
|
APIRoot: "https://127.0.0.1:6443",
|
|
|
|
ClientCert: pki.KubeNodeCertPath,
|
|
|
|
ClientKey: pki.KubeNodeKeyPath,
|
|
|
|
ClientCA: pki.CACertPath,
|
|
|
|
KubeCfg: pki.KubeNodeConfigPath,
|
|
|
|
ClusterCIDR: c.ClusterCIDR,
|
|
|
|
CNIImage: c.Network.Options[CalicoCNIImage],
|
|
|
|
NodeImage: c.Network.Options[CalicoNodeImage],
|
|
|
|
ControllersImage: c.Network.Options[CalicoControllersImage],
|
|
|
|
Calicoctl: c.Network.Options[CalicoctlImage],
|
|
|
|
CloudProvider: c.Network.Options[CalicoCloudProvider],
|
|
|
|
RBACConfig: c.Authorization.Mode,
|
|
|
|
}
|
|
|
|
pluginYaml, err := c.getNetworkPluginManifest(calicoConfig)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
2017-12-05 01:29:29 +00:00
|
|
|
}
|
2018-01-09 22:10:56 +00:00
|
|
|
return c.doAddonDeploy(ctx, pluginYaml, NetworkPluginResourceName)
|
2017-11-21 23:49:30 +00:00
|
|
|
}
|
|
|
|
|
2018-01-09 22:10:56 +00:00
|
|
|
func (c *Cluster) doCanalDeploy(ctx context.Context) error {
|
2017-12-05 01:29:29 +00:00
|
|
|
canalConfig := map[string]string{
|
2017-12-16 03:37:45 +00:00
|
|
|
ClientCert: pki.KubeNodeCertPath,
|
|
|
|
APIRoot: "https://127.0.0.1:6443",
|
|
|
|
ClientKey: pki.KubeNodeKeyPath,
|
|
|
|
ClientCA: pki.CACertPath,
|
|
|
|
KubeCfg: pki.KubeNodeConfigPath,
|
|
|
|
ClusterCIDR: c.ClusterCIDR,
|
|
|
|
NodeImage: c.Network.Options[CanalNodeImage],
|
|
|
|
CNIImage: c.Network.Options[CanalCNIImage],
|
|
|
|
CanalFlannelImg: c.Network.Options[CanalFlannelImage],
|
|
|
|
RBACConfig: c.Authorization.Mode,
|
|
|
|
}
|
|
|
|
pluginYaml, err := c.getNetworkPluginManifest(canalConfig)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
2017-12-05 01:29:29 +00:00
|
|
|
}
|
2018-01-09 22:10:56 +00:00
|
|
|
return c.doAddonDeploy(ctx, pluginYaml, NetworkPluginResourceName)
|
2017-11-06 20:50:41 +00:00
|
|
|
}
|
2017-12-05 01:29:29 +00:00
|
|
|
|
2018-01-09 22:10:56 +00:00
|
|
|
func (c *Cluster) doWeaveDeploy(ctx context.Context) error {
|
2017-12-14 21:56:19 +00:00
|
|
|
weaveConfig := map[string]string{
|
2017-12-16 03:37:45 +00:00
|
|
|
ClusterCIDR: c.ClusterCIDR,
|
|
|
|
Image: c.Network.Options[WeaveImage],
|
|
|
|
CNIImage: c.Network.Options[WeaveCNIImage],
|
|
|
|
RBACConfig: c.Authorization.Mode,
|
|
|
|
}
|
|
|
|
pluginYaml, err := c.getNetworkPluginManifest(weaveConfig)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
2017-12-14 21:56:19 +00:00
|
|
|
}
|
2018-01-09 22:10:56 +00:00
|
|
|
return c.doAddonDeploy(ctx, pluginYaml, NetworkPluginResourceName)
|
2017-11-30 11:35:31 +00:00
|
|
|
}
|
|
|
|
|
2017-12-05 01:29:29 +00:00
|
|
|
func (c *Cluster) setClusterNetworkDefaults() {
|
|
|
|
setDefaultIfEmpty(&c.Network.Plugin, DefaultNetworkPlugin)
|
|
|
|
|
|
|
|
if c.Network.Options == nil {
|
|
|
|
// don't break if the user didn't define options
|
|
|
|
c.Network.Options = make(map[string]string)
|
|
|
|
}
|
2017-12-07 18:07:23 +00:00
|
|
|
networkPluginConfigDefaultsMap := make(map[string]string)
|
2017-12-16 03:37:45 +00:00
|
|
|
switch c.Network.Plugin {
|
|
|
|
case FlannelNetworkPlugin:
|
2017-12-07 18:07:23 +00:00
|
|
|
networkPluginConfigDefaultsMap = map[string]string{
|
|
|
|
FlannelImage: DefaultFlannelImage,
|
|
|
|
FlannelCNIImage: DefaultFlannelCNIImage,
|
|
|
|
}
|
2017-12-05 01:29:29 +00:00
|
|
|
|
2017-12-16 03:37:45 +00:00
|
|
|
case CalicoNetworkPlugin:
|
2017-12-07 18:07:23 +00:00
|
|
|
networkPluginConfigDefaultsMap = map[string]string{
|
2017-12-16 03:37:45 +00:00
|
|
|
CalicoCNIImage: DefaultCalicoCNIImage,
|
|
|
|
CalicoNodeImage: DefaultCalicoNodeImage,
|
|
|
|
CalicoControllersImage: DefaultCalicoControllersImage,
|
|
|
|
CalicoCloudProvider: DefaultNetworkCloudProvider,
|
|
|
|
CalicoctlImage: DefaultCalicoctlImage,
|
2017-12-07 18:07:23 +00:00
|
|
|
}
|
2017-12-05 01:29:29 +00:00
|
|
|
|
2017-12-16 03:37:45 +00:00
|
|
|
case CanalNetworkPlugin:
|
2017-12-07 18:07:23 +00:00
|
|
|
networkPluginConfigDefaultsMap = map[string]string{
|
|
|
|
CanalCNIImage: DefaultCanalCNIImage,
|
|
|
|
CanalNodeImage: DefaultCanalNodeImage,
|
|
|
|
CanalFlannelImage: DefaultCanalFlannelImage,
|
|
|
|
}
|
2017-12-06 03:53:51 +00:00
|
|
|
|
2017-12-16 03:37:45 +00:00
|
|
|
case WeaveNetworkPlugin:
|
2017-12-07 18:07:23 +00:00
|
|
|
networkPluginConfigDefaultsMap = map[string]string{
|
|
|
|
WeaveImage: DefaultWeaveImage,
|
|
|
|
WeaveCNIImage: DefaultWeaveCNIImage,
|
|
|
|
}
|
2017-12-05 01:29:29 +00:00
|
|
|
}
|
2017-12-07 18:07:23 +00:00
|
|
|
for k, v := range networkPluginConfigDefaultsMap {
|
|
|
|
setDefaultIfEmptyMapValue(c.Network.Options, k, v)
|
|
|
|
}
|
|
|
|
|
2017-12-05 01:29:29 +00:00
|
|
|
}
|
2017-12-16 03:37:45 +00:00
|
|
|
|
|
|
|
func (c *Cluster) getNetworkPluginManifest(pluginConfig map[string]string) (string, error) {
|
|
|
|
switch c.Network.Plugin {
|
|
|
|
case FlannelNetworkPlugin:
|
|
|
|
return templates.CompileTemplateFromMap(templates.FlannelTemplate, pluginConfig)
|
|
|
|
case CalicoNetworkPlugin:
|
|
|
|
return templates.CompileTemplateFromMap(templates.CalicoTemplate, pluginConfig)
|
|
|
|
case CanalNetworkPlugin:
|
|
|
|
return templates.CompileTemplateFromMap(templates.CanalTemplate, pluginConfig)
|
|
|
|
case WeaveNetworkPlugin:
|
|
|
|
return templates.CompileTemplateFromMap(templates.WeaveTemplate, pluginConfig)
|
|
|
|
default:
|
|
|
|
return "", fmt.Errorf("[network] Unsupported network plugin: %s", c.Network.Plugin)
|
|
|
|
}
|
|
|
|
}
|