From 5b883e0c480071fb45f87651ad03b98388b14cc0 Mon Sep 17 00:00:00 2001 From: Jason Chua <91486739+jchua99@users.noreply.github.com> Date: Sun, 11 Feb 2024 00:01:55 +0800 Subject: [PATCH] Added download yq to fix the issue. Seperated demo for node pool management Added overview and link to tutorial Added comments to CHANGELOG Signed-off-by: Jason Chua --- .gitignore | 1 + CHANGELOG.md | 3 + README.md | 2 +- docs/figures/knative-atop-openyurt.png | Bin 0 -> 67737 bytes go.work.sum | 3 + scripts/openyurt-deployer/README.md | 15 ++- scripts/openyurt-deployer/configurations.go | 6 +- scripts/openyurt-deployer/main.go | 33 ++++- scripts/openyurt-deployer/node.go | 137 ++++++++++---------- 9 files changed, 121 insertions(+), 79 deletions(-) create mode 100644 docs/figures/knative-atop-openyurt.png diff --git a/.gitignore b/.gitignore index 6fdb1fae9..057c378d7 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ # Binaries vhive setup_tool +go.work.sum diff --git a/CHANGELOG.md b/CHANGELOG.md index daafc50c1..01764d1ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ ### Added +- Added support for [`OpenYurt`](https://openyurt.io/), an open platform that extends upstream Kubernetes to run on edge node pools. More details on how to the `Knative-atop-OpenYurt` mode are described [here](scripts/openyurt-deployer/README.md). + + ### Changed - Removed the utils and examples from the vHive repo, moved to [vSwarm](https://github.com/vhive-serverless/vSwarm). diff --git a/README.md b/README.md index 043977dc6..c38911a1c 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ including functions autoscaling and cold-start delay optimization with several s vHive has added support for the state-of-the-art extension [eStargz](https://github.com/containerd/stargz-snapshotter) to container layers and lazy pull support for container images. -vHive has added support for [`OpenYurt`](https://openyurt.io/), an open platform that extends upstream Kubernetes to the edge. It will assist in node management for cloud and edge nodes and can be deployed with [`openyurt-deployer`](scripts/openyurt-deployer/README.md). +vHive supports running Knative on top of [`OpenYurt`](https://openyurt.io/), an open platform that extends upstream Kubernetes to run on edge node pools. More details on how to the `Knative-atop-OpenYurt` mode are described [here](scripts/openyurt-deployer/README.md). ## vHive architecture diff --git a/docs/figures/knative-atop-openyurt.png b/docs/figures/knative-atop-openyurt.png new file mode 100644 index 0000000000000000000000000000000000000000..a2c0f5882fd0c111e9fb50d6019922e376579d2a GIT binary patch literal 67737 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

53xg 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/JL3%Qx$lvOK*tP`5nuux`9ubU8pH|_ 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 %s", podsInfo[0], podsInfo[1]) - _, err = node.ExecShellCmd("kubectl -n %s delete pod %s", podsInfo[0], podsInfo[1]) - utils.CheckErrorWithMsg(err, "Failed to restart pods in the worker node!\n") - } } // Join existing Kubernetes worker node to Openyurt cluster @@ -932,24 +926,36 @@ func (node *Node) YurtWorkerJoin(addr string, port string, token string) { utils.WaitPrintf("Setting up Yurthub") _, err = node.ExecShellCmd( "cat '%s' | sed -e 's|__kubernetes_master_address__|%s:%s|' -e 's|__bootstrap_token__|%s|' | sudo tee /etc/kubernetes/manifests/yurthub-ack.yaml", - yurtTempFilePath, - addr, - port, - token) + yurtTempFilePath, addr, port, token) utils.CheckErrorWithMsg(err, "Failed to set up Yurthub!\n") - // Get kubele template from github + // Get kubelet template from github kubletTempFilePath, _ := node.DownloadToTmpDir("https://raw.githubusercontent.com/vhive-serverless/vHive/openyurt/scripts/openyurt-deployer/configs/kubeTemplate.yaml") // Configure Kubelet utils.WaitPrintf("Configuring kubelet") node.ExecShellCmd("sudo mkdir -p /var/lib/openyurt && cat '%s' | sudo tee /var/lib/openyurt/kubelet.conf", kubletTempFilePath) utils.CheckErrorWithMsg(err, "Failed to configure kubelet!\n") - node.ExecShellCmd(`sudo sed -i "s|KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=\/etc\/kubernetes\/bootstrap-kubelet.conf\ --kubeconfig=\/etc\/kubernetes\/kubelet.conf|KUBELET_KUBECONFIG_ARGS=--kubeconfig=\/var\/lib\/openyurt\/kubelet.conf|g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf`) + node.ExecShellCmd(`sudo sed -i "s|KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=\/etc\/kubernetes\/bootstrap-kubelet.conf\ --kubeconfig=\/etc\/kubernetes\/kubelet.conf|KUBELET_KUBECONFIG_ARGS=--kubeconfig=\/var\/lib\/openyurt\/kubelet.conf|g" \ + /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf`) utils.CheckErrorWithMsg(err, "Failed to configure kubelet!\n") node.ExecShellCmd("sudo systemctl daemon-reload && sudo systemctl restart kubelet") utils.CheckErrorWithMsg(err, "Failed to configure kubelet!\n") } +func (node *Node) YurtRestart(worker *Node) { + // Restart pods in the worker node + utils.WaitPrintf("Restarting pods in the worker node") + shellOutput, err := node.ExecShellCmd(GetRestartPodsShell(), worker.Configs.System.NodeHostName) + utils.CheckErrorWithMsg(err, "Failed to restart pods in the worker node!\n") + podsToBeRestarted := strings.Split(shellOutput, "\n") + for _, pods := range podsToBeRestarted { + podsInfo := strings.Split(pods, " ") + utils.WaitPrintf("Restarting pod: %s => %s", podsInfo[0], podsInfo[1]) + _, err = node.ExecShellCmd("kubectl -n %s delete pod %s", podsInfo[0], podsInfo[1]) + utils.CheckErrorWithMsg(err, "Failed to restart pods in the worker node!\n") + } +} + func (node *Node) YurtWorkerClean() { node.OnlyExecByWorker() var err error @@ -960,7 +966,7 @@ func (node *Node) YurtWorkerClean() { utils.CheckErrorWithMsg(err, "Failed to clean kubelet on node: %s", node.Name) } -// Builds cloud and edge nodepools +// Builds cloud and edge nodepools for node pool management func (masterNode *Node) BuildDemo(workerNodes []Node) { masterNode.GetUserHomeDir() @@ -970,42 +976,24 @@ func (masterNode *Node) BuildDemo(workerNodes []Node) { cloudPoolName := masterNode.Configs.Demo.CloudPoolName edgePoolName := masterNode.Configs.Demo.EdgePoolName + // copy cloudNP file over + cloudNPTmpFilePath, _ := masterNode.DownloadToTmpDir("https://raw.githubusercontent.com/vhive-serverless/vHive/openyurt/scripts/openyurt-deployer/configs/cloudNodePoolTemplate.yaml") cloudFile := fmt.Sprintf("%s/%s", masterNode.Configs.System.UserHomeDir, masterNode.Configs.Demo.CloudYamlFile) - edgeFile := fmt.Sprintf("%s/%s", masterNode.Configs.System.UserHomeDir, masterNode.Configs.Demo.EdgeYamlFile) - // yurtFile := utils.InfoPrintf("%s/%s", masterNode.Configs.System.UserHomeDir, masterNode.Configs.Demo.YurtAppSetYamlFile) - // cloud.yaml utils.WaitPrintf("Creating yaml files for cloud nodepool") - cloudNpcommand := fmt.Sprintf("yq '.metadata.name = %s' configs/cloudNodePoolTemplate.yaml > %s ", cloudPoolName, cloudFile) + cloudNpcommand := fmt.Sprintf("yq '.metadata.name = \"%s\"' %s > %s ", cloudPoolName, cloudNPTmpFilePath, cloudFile) _, err = masterNode.ExecShellCmd(cloudNpcommand) utils.CheckErrorWithTagAndMsg(err, "Failed to create yaml for cloud\n") + // Copy edgeNP file over + edgeNPTmpFilePath, _ := masterNode.DownloadToTmpDir("https://raw.githubusercontent.com/vhive-serverless/vHive/openyurt/scripts/openyurt-deployer/configs/edgeNodePoolTemplate.yaml") + edgeFile := fmt.Sprintf("%s/%s", masterNode.Configs.System.UserHomeDir, masterNode.Configs.Demo.EdgeYamlFile) // edge.yaml utils.WaitPrintf("Creating yaml files for edge nodepool") - edgeNpcommand := fmt.Sprintf("yq '.metadata.name = %s' configs/edgeNodePoolTemplate.yaml > %s ", edgePoolName, edgeFile) + edgeNpcommand := fmt.Sprintf("yq '.metadata.name = \"%s\"' %s > %s ", edgePoolName, edgeNPTmpFilePath, edgeFile) _, err = masterNode.ExecShellCmd(edgeNpcommand) utils.CheckErrorWithTagAndMsg(err, "Failed to create yaml for edge\n") - //label master as cloud TODO not just master, but all cloud nodes - utils.WaitPrintf("Labeling master") - _, err = masterNode.ExecShellCmd(`kubectl label node %s apps.openyurt.io/desired-nodepool=%s`, masterNode.Configs.System.NodeHostName, cloudPoolName) - utils.CheckErrorWithTagAndMsg(err, "Master Cloud label fail\n") - - //label edge - utils.WaitPrintf("Labeling workers") - for _, worker := range workerNodes { - worker.GetNodeHostName() - var desiredNpName string - if worker.NodeRole == "cloud" { - desiredNpName = cloudPoolName - } else { - desiredNpName = edgePoolName - } - _, err = masterNode.ExecShellCmd("kubectl label node %s apps.openyurt.io/desired-nodepool=%s", worker.Configs.System.NodeHostName, desiredNpName) - utils.CheckErrorWithTagAndMsg(err, "worker label fail\n") - } - utils.SuccessPrintf("Label success\n") - utils.WaitPrintf("Apply cloud.yaml") _, err = masterNode.ExecShellCmd("kubectl apply -f %s", cloudFile) utils.CheckErrorWithTagAndMsg(err, "Failed to apply cloud.yaml\n") @@ -1015,6 +1003,7 @@ func (masterNode *Node) BuildDemo(workerNodes []Node) { utils.CheckErrorWithTagAndMsg(err, "Failed to apply edge.yaml\n") } +// Add benchmarking image func (masterNode *Node) Demo(isCloud bool) { masterNode.GetUserHomeDir() @@ -1025,23 +1014,29 @@ func (masterNode *Node) Demo(isCloud bool) { edgePoolName := masterNode.Configs.Demo.EdgePoolName utils.WaitPrintf("Creating benchmark's yaml file and apply it") + benchmarkFilePath, _ := masterNode.DownloadToTmpDir("https://raw.githubusercontent.com/vhive-serverless/vHive/openyurt/scripts/openyurt-deployer/configs/benchmarkTemplate.yaml") if isCloud { - command := fmt.Sprintf(`yq '.metadata.name = \"helloworld-python-cloud\" | - .spec.template.spec.nodeSelector.\"apps.openyurt.io/nodepool\" = %s | - .spec.template.spec.containers[0].image = \"docker.io/vhiveease/hello-cloud:latest\" ' - configs/benchmarkTemplate.yaml > %s`, cloudPoolName, masterNode.Configs.Demo.CloudBenchYamlFile) + cloudOutputFile := fmt.Sprintf("%s/%s", masterNode.Configs.System.UserHomeDir, masterNode.Configs.Demo.CloudBenchYamlFile) + + command := fmt.Sprintf(`yq '.metadata.name = "helloworld-python-cloud" | + .spec.template.spec.nodeSelector."apps.openyurt.io/nodepool" = "%s" | + .spec.template.spec.containers[0].image = "docker.io/vhiveease/hello-cloud:latest"' %s > %s`, + cloudPoolName, benchmarkFilePath, cloudOutputFile) _, err = masterNode.ExecShellCmd(command) - utils.CheckErrorWithMsg(err, "benchmark command fail.") - _, err = masterNode.ExecShellCmd("kubectl apply -f %s", masterNode.Configs.Demo.CloudBenchYamlFile) + utils.CheckErrorWithMsg(err, "cloud benchmark command fail.") + + _, err = masterNode.ExecShellCmd("kubectl apply -f %s", cloudOutputFile) } else { - command := fmt.Sprintf(`yq '.metadata.name = \"helloworld-python-edge\" | - .spec.template.spec.nodeSelector.\"apps.openyurt.io/nodepool\" = %s | - .spec.template.spec.containers[0].image = \"docker.io/vhiveease/hello-edge:latest\" ' - configs/benchmarkTemplate.yaml > %s`, edgePoolName, masterNode.Configs.Demo.EdgeBenchYamlFile) + edgeOutputFile := fmt.Sprintf("%s/%s", masterNode.Configs.System.UserHomeDir, masterNode.Configs.Demo.EdgeBenchYamlFile) + + command := fmt.Sprintf(`yq '.metadata.name = "helloworld-python-edge" | + .spec.template.spec.nodeSelector."apps.openyurt.io/nodepool" = "%s" | + .spec.template.spec.containers[0].image = "docker.io/vhiveease/hello-edge:latest"' %s > %s`, + edgePoolName, benchmarkFilePath, edgeOutputFile) _, err = masterNode.ExecShellCmd(command) - utils.CheckErrorWithMsg(err, "benchmark command fail.") - _, err = masterNode.ExecShellCmd("kubectl apply -f %s", masterNode.Configs.Demo.EdgeBenchYamlFile) + utils.CheckErrorWithMsg(err, "edge benchmark command fail.") + _, err = masterNode.ExecShellCmd("kubectl apply -f %s", edgeOutputFile) } utils.CheckErrorWithTagAndMsg(err, "Failed to create benchmark's yaml file and apply it")