mirror of https://github.com/kubernetes/kops.git
203 lines
5.6 KiB
Go
203 lines
5.6 KiB
Go
/*
|
|
Copyright 2019 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package cloudup
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"os"
|
|
|
|
"k8s.io/klog"
|
|
api "k8s.io/kops/pkg/apis/kops"
|
|
"k8s.io/kops/pkg/apis/kops/util"
|
|
"k8s.io/kops/pkg/assets"
|
|
"k8s.io/kops/util/pkg/hashing"
|
|
)
|
|
|
|
func usesCNI(c *api.Cluster) bool {
|
|
networkConfig := c.Spec.Networking
|
|
if networkConfig == nil || networkConfig.Classic != nil {
|
|
// classic
|
|
return false
|
|
}
|
|
|
|
if networkConfig.Kubenet != nil {
|
|
// kubenet is now configured via CNI
|
|
return true
|
|
}
|
|
|
|
if networkConfig.GCE != nil {
|
|
// GCE is kubenet at the node level
|
|
return true
|
|
}
|
|
|
|
if networkConfig.External != nil {
|
|
// external: assume uses CNI
|
|
return true
|
|
}
|
|
|
|
if networkConfig.Kopeio != nil {
|
|
// Kopeio uses kubenet (and thus CNI)
|
|
return true
|
|
}
|
|
|
|
if networkConfig.Weave != nil {
|
|
// Weave uses CNI
|
|
return true
|
|
}
|
|
|
|
if networkConfig.Flannel != nil {
|
|
// Flannel uses CNI
|
|
return true
|
|
}
|
|
|
|
if networkConfig.Calico != nil {
|
|
// Calico uses CNI
|
|
return true
|
|
}
|
|
|
|
if networkConfig.Canal != nil {
|
|
// Canal uses CNI
|
|
return true
|
|
}
|
|
|
|
if networkConfig.Kuberouter != nil {
|
|
// Kuberouter uses CNI
|
|
return true
|
|
}
|
|
|
|
if networkConfig.Romana != nil {
|
|
// Romana uses CNI
|
|
return true
|
|
}
|
|
|
|
if networkConfig.AmazonVPC != nil {
|
|
// AmazonVPC uses CNI
|
|
return true
|
|
}
|
|
|
|
if networkConfig.Cilium != nil {
|
|
// Cilium uses CNI
|
|
return true
|
|
}
|
|
|
|
if networkConfig.CNI != nil {
|
|
// CNI definitely uses CNI!
|
|
return true
|
|
}
|
|
|
|
if networkConfig.LyftVPC != nil {
|
|
// LyftVPC uses CNI
|
|
return true
|
|
}
|
|
|
|
// Assume other modes also use CNI
|
|
klog.Warningf("Unknown networking mode configured")
|
|
return true
|
|
}
|
|
|
|
// TODO: we really need to sort this out:
|
|
// https://github.com/kubernetes/kops/issues/724
|
|
// https://github.com/kubernetes/kops/issues/626
|
|
// https://github.com/kubernetes/kubernetes/issues/30338
|
|
|
|
const (
|
|
// defaultCNIAssetK8s1_9 is the CNI tarball for 1.9.x k8s.
|
|
defaultCNIAssetK8s1_9 = "https://storage.googleapis.com/kubernetes-release/network-plugins/cni-plugins-amd64-v0.6.0.tgz"
|
|
defaultCNIAssetHashStringK8s1_9 = "d595d3ded6499a64e8dac02466e2f5f2ce257c9f"
|
|
|
|
// defaultCNIAssetK8s1_11 is the CNI tarball for k8s >= 1.11
|
|
defaultCNIAssetK8s1_11 = "https://storage.googleapis.com/kubernetes-release/network-plugins/cni-plugins-amd64-v0.7.5.tgz"
|
|
defaultCNIAssetSHA1StringK8s1_11 = "52e9d2de8a5f927307d9397308735658ee44ab8d"
|
|
defaultCNIAssetSHA256StringK8s1_11 = "3ca15c0a18ee830520cf3a95408be826cbd255a1535a38e0be9608b25ad8bf64"
|
|
|
|
// defaultCNIAssetK8s1_18 is the CNI tarball for k8s >= 1.18
|
|
defaultCNIAssetK8s1_18 = "https://storage.googleapis.com/k8s-artifacts-cni/release/v0.8.5/cni-plugins-linux-amd64-v0.8.5.tgz"
|
|
defaultCNIAssetSHA256StringK8s1_18 = "bd682ffcf701e8f83283cdff7281aad0c83b02a56084d6e601216210732833f9"
|
|
|
|
// Environment variable for overriding CNI url
|
|
ENV_VAR_CNI_VERSION_URL = "CNI_VERSION_URL"
|
|
ENV_VAR_CNI_ASSET_HASH_STRING = "CNI_ASSET_HASH_STRING"
|
|
)
|
|
|
|
func findCNIAssets(c *api.Cluster, assetBuilder *assets.AssetBuilder) (*url.URL, *hashing.Hash, error) {
|
|
|
|
if cniVersionURL := os.Getenv(ENV_VAR_CNI_VERSION_URL); cniVersionURL != "" {
|
|
u, err := url.Parse(cniVersionURL)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("unable to parse %q as a URL: %v", cniVersionURL, err)
|
|
}
|
|
|
|
klog.Infof("Using CNI asset version %q, as set in %s", cniVersionURL, ENV_VAR_CNI_VERSION_URL)
|
|
|
|
if cniAssetHashString := os.Getenv(ENV_VAR_CNI_ASSET_HASH_STRING); cniAssetHashString != "" {
|
|
|
|
klog.Infof("Using CNI asset hash %q, as set in %s", cniAssetHashString, ENV_VAR_CNI_ASSET_HASH_STRING)
|
|
|
|
hash, err := hashing.FromString(cniAssetHashString)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("unable to parse CNI asset hash %q", cniAssetHashString)
|
|
}
|
|
return u, hash, nil
|
|
} else {
|
|
return u, nil, nil
|
|
}
|
|
}
|
|
|
|
sv, err := util.ParseKubernetesVersion(c.Spec.KubernetesVersion)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("failed to lookup kubernetes version: %v", err)
|
|
}
|
|
|
|
var cniAsset, cniAssetHash string
|
|
if util.IsKubernetesGTE("1.18", *sv) {
|
|
cniAsset = defaultCNIAssetK8s1_18
|
|
cniAssetHash = defaultCNIAssetSHA256StringK8s1_18
|
|
klog.V(2).Infof("Adding default CNI asset for k8s >= 1.18: %s", cniAsset)
|
|
} else if util.IsKubernetesGTE("1.15", *sv) {
|
|
// We're still on the same asset, but we use sha256
|
|
cniAsset = defaultCNIAssetK8s1_11
|
|
cniAssetHash = defaultCNIAssetSHA256StringK8s1_11
|
|
klog.V(2).Infof("Adding default CNI asset for 1.18 > k8s >= 1.11: %s", cniAsset)
|
|
} else if util.IsKubernetesGTE("1.11", *sv) {
|
|
cniAsset = defaultCNIAssetK8s1_11
|
|
cniAssetHash = defaultCNIAssetSHA1StringK8s1_11
|
|
klog.V(2).Infof("Adding default CNI asset for 1.18 > k8s >= 1.11: %s", cniAsset)
|
|
} else {
|
|
cniAsset = defaultCNIAssetK8s1_9
|
|
cniAssetHash = defaultCNIAssetHashStringK8s1_9
|
|
klog.V(2).Infof("Adding default CNI asset for 1.11 > k8s >= 1.9: %s", cniAsset)
|
|
}
|
|
|
|
u, err := url.Parse(cniAsset)
|
|
if err != nil {
|
|
return nil, nil, nil
|
|
}
|
|
|
|
hash, err := hashing.FromString(cniAssetHash)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("unable to parse CNI asset hash %q", cniAssetHash)
|
|
}
|
|
|
|
u, err = assetBuilder.RemapFileAndSHAValue(u, cniAssetHash)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
return u, hash, nil
|
|
}
|