Skip to content

Commit

Permalink
Merge pull request #2204 from liangzai006/manifest
Browse files Browse the repository at this point in the history
Support specifying Kubernetes when creating a manifest
  • Loading branch information
ks-ci-bot committed Apr 10, 2024
2 parents 52a36db + 3f8b9ef commit 0b5f9e1
Show file tree
Hide file tree
Showing 3 changed files with 156 additions and 9 deletions.
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

0 comments on commit 0b5f9e1

Please sign in to comment.