Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support specifying Kubernetes when creating a manifest #2204

Merged
merged 1 commit into from
Apr 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 10 additions & 1 deletion cmd/kk/cmd/create/manifest.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ type CreateManifestOptions struct {
Name string
KubeConfig string
FileName string
Kubernetes string
registry bool
Arch []string
}

func NewCreateManifestOptions() *CreateManifestOptions {
Expand Down Expand Up @@ -86,11 +89,17 @@ func (o *CreateManifestOptions) Run() error {
FilePath: o.FileName,
KubeConfig: o.KubeConfig,
}
return artifact.CreateManifest(arg, o.Name)
if o.Kubernetes != "" {
return artifact.CreateManifestSpecifyVersion(arg, o.Name, o.Kubernetes, o.registry, o.Arch)
}
return artifact.CreateManifest(arg, o.Name, o.registry)
}

func (o *CreateManifestOptions) AddFlags(cmd *cobra.Command) {
cmd.Flags().StringVarP(&o.Name, "name", "", "sample", "Specify a name of manifest object")
cmd.Flags().StringVarP(&o.FileName, "filename", "f", "", "Specify a manifest file path")
cmd.Flags().StringVar(&o.KubeConfig, "kubeconfig", "", "Specify a kubeconfig file")
cmd.Flags().StringVarP(&o.Kubernetes, "with-kubernetes", "", "", "Specify a supported version of kubernetes")
cmd.Flags().BoolVar(&o.registry, "with-registry", false, "Specify a supported registry components")
cmd.Flags().StringArrayVar(&o.Arch, "arch", []string{"amd64"}, "Specify a supported arch")
}
139 changes: 138 additions & 1 deletion cmd/kk/pkg/artifact/manifest.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ import (
"bufio"
"context"
"fmt"
"github.com/kubesphere/kubekey/v3/cmd/kk/pkg/core/connector"
"github.com/kubesphere/kubekey/v3/cmd/kk/pkg/files"
"github.com/kubesphere/kubekey/v3/cmd/kk/pkg/images"
"os"
"sort"
"strings"
Expand All @@ -36,7 +39,7 @@ import (
"github.com/kubesphere/kubekey/v3/cmd/kk/pkg/core/util"
)

func CreateManifest(arg common.Argument, name string) error {
func CreateManifest(arg common.Argument, name string, registry bool) error {
checkFileExists(arg.FilePath)

client, err := kubernetes.NewClient(arg.KubeConfig)
Expand Down Expand Up @@ -171,6 +174,12 @@ func CreateManifest(arg common.Argument, name string) error {
Images: imageArr,
}

if registry {
options.Components.DockerRegistry.Version = kubekeyv1alpha2.DefaultRegistryVersion
options.Components.DockerCompose.Version = kubekeyv1alpha2.DefaultDockerComposeVersion
options.Components.Harbor.Version = kubekeyv1alpha2.DefaultHarborVersion
}

manifestStr, err := templates.RenderManifest(options)

if err := os.WriteFile(arg.FilePath, []byte(manifestStr), 0644); err != nil {
Expand Down Expand Up @@ -204,3 +213,131 @@ func checkFileExists(fileName string) {
}
}
}

func CreateManifestSpecifyVersion(arg common.Argument, name, version string, registry bool, arch []string) error {
checkFileExists(arg.FilePath)

var kubernetesDistribution []kubekeyv1alpha2.KubernetesDistribution

k8sVersion := strings.Split(version, ",")

imageNames := []string{
"pause",
"kube-apiserver",
"kube-controller-manager",
"kube-scheduler",
"kube-proxy",

// network
"coredns",
"k8s-dns-node-cache",
"calico-kube-controllers",
"calico-cni",
"calico-node",
"calico-flexvol",
"calico-typha",
"flannel",
"flannel-cni-plugin",
"cilium",
"cilium-operator-generic",
"hybridnet",
"kubeovn",
"multus",
// storage
"provisioner-localpv",
"linux-utils",
// load balancer
"haproxy",
"kubevip",
// kata-deploy
"kata-deploy",
// node-feature-discovery
"node-feature-discovery",
}
var imageArr []string
for _, v := range k8sVersion {
versionutil.MustParseGeneric(v)

for _, a := range arch {
_, ok := files.FileSha256["kubeadm"][a][v]
if !ok {
return fmt.Errorf("invalid kubernetes version %s", v)
}
}

kubernetesDistribution = append(kubernetesDistribution, kubekeyv1alpha2.KubernetesDistribution{
Type: "kubernetes",
Version: v,
})

for _, imageName := range imageNames {
repo := images.GetImage(&common.KubeRuntime{
BaseRuntime: connector.NewBaseRuntime("image list", connector.NewDialer(), arg.Debug, arg.IgnoreErr),
}, &common.KubeConf{
Cluster: &kubekeyv1alpha2.ClusterSpec{
Kubernetes: kubekeyv1alpha2.Kubernetes{Version: v},
Registry: kubekeyv1alpha2.RegistryConfig{PrivateRegistry: "docker.io"},
},
}, imageName).ImageName()
if !imageIsExist(repo, imageArr) {
imageArr = append(imageArr, repo)
}

}
}

options := &templates.Options{
Name: name,
Arches: arch,
OperatingSystems: []kubekeyv1alpha2.OperatingSystem{{
Arch: "amd64",
Type: "linux",
Id: "ubuntu",
Version: "20.04",
OsImage: "Ubuntu 20.04.6 LTS",
}},
KubernetesDistributions: kubernetesDistribution,
Components: kubekeyv1alpha2.Components{
Helm: kubekeyv1alpha2.Helm{Version: kubekeyv1alpha2.DefaultHelmVersion},
CNI: kubekeyv1alpha2.CNI{Version: kubekeyv1alpha2.DefaultCniVersion},
ETCD: kubekeyv1alpha2.ETCD{Version: kubekeyv1alpha2.DefaultEtcdVersion},
Crictl: kubekeyv1alpha2.Crictl{Version: kubekeyv1alpha2.DefaultCrictlVersion},
Calicoctl: kubekeyv1alpha2.Calicoctl{Version: kubekeyv1alpha2.DefaultCalicoVersion},
ContainerRuntimes: []kubekeyv1alpha2.ContainerRuntime{
{
Type: "docker",
Version: kubekeyv1alpha2.DefaultDockerVersion,
},
{
Type: "containerd",
Version: kubekeyv1alpha2.DefaultContainerdVersion,
},
},
},
Images: imageArr,
}

if registry {
options.Components.DockerRegistry.Version = kubekeyv1alpha2.DefaultRegistryVersion
options.Components.DockerCompose.Version = kubekeyv1alpha2.DefaultDockerComposeVersion
options.Components.Harbor.Version = kubekeyv1alpha2.DefaultHarborVersion
}

manifestStr, err := templates.RenderManifest(options)

if err = os.WriteFile(arg.FilePath, []byte(manifestStr), 0644); err != nil {
return errors.Wrap(err, fmt.Sprintf("write file %s failed", arg.FilePath))
}

fmt.Println("Generate KubeKey manifest file successfully")
return nil
}

func imageIsExist(s string, arr []string) bool {
for _, s2 := range arr {
if s2 == s {
return true
}
}
return false
}
15 changes: 8 additions & 7 deletions cmd/kk/pkg/artifact/templates/manifest.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,14 @@ spec:
version: {{ .Options.Components.Calicoctl.Version }}
crictl:
version: {{ .Options.Components.Crictl.Version }}
##
# docker-registry:
# version: "2"
# harbor:
# version: v2.4.1
# docker-compose:
# version: v2.2.2
{{ if .Options.Components.DockerRegistry.Version -}}
docker-registry:
version: "{{ .Options.Components.DockerRegistry.Version }}"
harbor:
version: {{ .Options.Components.Harbor.Version }}
docker-compose:
version: {{ .Options.Components.DockerCompose.Version }}
{{- end }}
images:
{{- range .Options.Images }}
- {{ . }}
Expand Down