From a3721fb21c873b7dbbb361ee344761d76f9f599e Mon Sep 17 00:00:00 2001 From: zhangdiandian <1635468471@qq.com> Date: Mon, 10 Apr 2023 17:03:04 +0800 Subject: [PATCH] add two examples for karmada deploy workloads Signed-off-by: zhangdiandian <1635468471@qq.com> --- karmada-HA-workload-example1/finish.md | 3 + karmada-HA-workload-example1/foreground.sh | 147 +++++++++++++++++ .../image/success.png | Bin 0 -> 6824 bytes karmada-HA-workload-example1/index.json | 37 +++++ karmada-HA-workload-example1/intro.md | 7 + karmada-HA-workload-example1/step1/text.md | 14 ++ karmada-HA-workload-example1/step1/verify.sh | 3 + karmada-HA-workload-example1/step2/text.md | 5 + karmada-HA-workload-example1/step2/verify.sh | 3 + karmada-HA-workload-example1/step3/text.md | 3 + karmada-HA-workload-example1/step3/verify.sh | 3 + karmada-HA-workload-example1/step4/text.md | 7 + karmada-HA-workload-example2/finish.md | 3 + karmada-HA-workload-example2/foreground.sh | 156 ++++++++++++++++++ .../image/success.png | Bin 0 -> 6824 bytes karmada-HA-workload-example2/index.json | 37 +++++ karmada-HA-workload-example2/intro.md | 7 + karmada-HA-workload-example2/step1/text.md | 14 ++ karmada-HA-workload-example2/step1/verify.sh | 4 + karmada-HA-workload-example2/step2/text.md | 5 + karmada-HA-workload-example2/step2/verify.sh | 3 + karmada-HA-workload-example2/step3/text.md | 3 + karmada-HA-workload-example2/step3/verify.sh | 3 + karmada-HA-workload-example2/step4/text.md | 7 + 24 files changed, 474 insertions(+) create mode 100644 karmada-HA-workload-example1/finish.md create mode 100644 karmada-HA-workload-example1/foreground.sh create mode 100644 karmada-HA-workload-example1/image/success.png create mode 100644 karmada-HA-workload-example1/index.json create mode 100644 karmada-HA-workload-example1/intro.md create mode 100644 karmada-HA-workload-example1/step1/text.md create mode 100644 karmada-HA-workload-example1/step1/verify.sh create mode 100644 karmada-HA-workload-example1/step2/text.md create mode 100644 karmada-HA-workload-example1/step2/verify.sh create mode 100644 karmada-HA-workload-example1/step3/text.md create mode 100644 karmada-HA-workload-example1/step3/verify.sh create mode 100644 karmada-HA-workload-example1/step4/text.md create mode 100644 karmada-HA-workload-example2/finish.md create mode 100644 karmada-HA-workload-example2/foreground.sh create mode 100644 karmada-HA-workload-example2/image/success.png create mode 100644 karmada-HA-workload-example2/index.json create mode 100644 karmada-HA-workload-example2/intro.md create mode 100644 karmada-HA-workload-example2/step1/text.md create mode 100644 karmada-HA-workload-example2/step1/verify.sh create mode 100644 karmada-HA-workload-example2/step2/text.md create mode 100644 karmada-HA-workload-example2/step2/verify.sh create mode 100644 karmada-HA-workload-example2/step3/text.md create mode 100644 karmada-HA-workload-example2/step3/verify.sh create mode 100644 karmada-HA-workload-example2/step4/text.md diff --git a/karmada-HA-workload-example1/finish.md b/karmada-HA-workload-example1/finish.md new file mode 100644 index 0000000..1aa0b5b --- /dev/null +++ b/karmada-HA-workload-example1/finish.md @@ -0,0 +1,3 @@ +**Summary** + +In this scenario, we learned how deploy workloads across multiple clusters using PropagationPolicy to duplicate the nginx deployment. diff --git a/karmada-HA-workload-example1/foreground.sh b/karmada-HA-workload-example1/foreground.sh new file mode 100644 index 0000000..0ef70bc --- /dev/null +++ b/karmada-HA-workload-example1/foreground.sh @@ -0,0 +1,147 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +# variable define +kind_version=v0.17.0 +host_cluster_ip=172.30.1.2 #host node where Karmada is located +member_cluster_ip=172.30.2.2 +local_ip=127.0.0.1 +KUBECONFIG_PATH=${KUBECONFIG_PATH:-"${HOME}/.kube"} + +function installKind() { + cat << EOF > installKind.sh + wget https://github.com/kubernetes-sigs/kind/releases/download/${kind_version}/kind-linux-amd64 + chmod +x kind-linux-amd64 + sudo mv kind-linux-amd64 /usr/local/bin/kind +EOF +} + +function createCluster() { + cat << EOF > createCluster.sh + kind create cluster --name=member1 --config=cluster1.yaml + mv $HOME/.kube/config ~/config-member1 + kind create cluster --name=member2 --config=cluster2.yaml + mv $HOME/.kube/config config-member2 + KUBECONFIG=~/config-member1:~/config-member2 kubectl config view --merge --flatten >> ${KUBECONFIG_PATH}/config + # modify ip + sed -i "s/${local_ip}/${member_cluster_ip}/g" config-member1 + scp config-member1 root@${host_cluster_ip}:$HOME/.kube/config-member1 + sed -i "s/${local_ip}/${member_cluster_ip}/g" config-member2 + scp config-member2 root@${host_cluster_ip}:$HOME/.kube/config-member2 +EOF +} + +function cluster1Config() { + touch cluster1.yaml + cat << EOF > cluster1.yaml + kind: Cluster + apiVersion: kind.x-k8s.io/v1alpha4 + networking: + apiServerAddress: "${member_cluster_ip}" + apiServerPort: 6443 +EOF +} + +function cluster2Config() { + touch cluster2.yaml + cat << EOF > cluster2.yaml + kind: Cluster + apiVersion: kind.x-k8s.io/v1alpha4 + networking: + apiServerAddress: "${member_cluster_ip}" + apiServerPort: 6444 +EOF +} + +function nginxDeployment() { + cat << EOF > nginxDeployment.yaml + apiVersion: apps/v1 + kind: Deployment + metadata: + name: nginx + labels: + app: nginx + spec: + replicas: 1 + selector: + matchLabels: + app: nginx + template: + metadata: + labels: + app: nginx + spec: + containers: + - image: nginx + name: nginx +EOF +} + +function propagationPolicy() { + cat << EOF > propagationPolicy.yaml + apiVersion: policy.karmada.io/v1alpha1 + kind: PropagationPolicy + metadata: + name: nginx-propagation + spec: + resourceSelectors: + - apiVersion: apps/v1 + kind: Deployment + name: nginx + placement: + clusterAffinity: + clusterNames: + - kind-member1 + - kind-member2 + replicaScheduling: + replicaSchedulingType: Duplicated +EOF +} + + +function copyConfigFilesToNode() { + scp installKind.sh root@${member_cluster_ip}:~ + scp createCluster.sh root@${member_cluster_ip}:~ + scp cluster1.yaml root@${member_cluster_ip}:~ + scp cluster2.yaml root@${member_cluster_ip}:~ +} + +kubectl delete node node01 +kubectl taint node controlplane node-role.kubernetes.io/control-plane:NoSchedule- + +# install kind and create member clusters +installKind +createCluster +cluster1Config +cluster2Config +copyConfigFilesToNode + +# generate nginx config +mkdir nginx +cd nginx +nginxDeployment +propagationPolicy + +# create cluster in node01 machine +ssh root@${member_cluster_ip} "bash ~/installKind.sh" & +sleep 10 +ssh root@${member_cluster_ip} "bash ~/createCluster.sh" & +sleep 90 + +# install karmadactl +curl -s https://raw.githubusercontent.com/karmada-io/karmada/master/hack/install-cli.sh | sudo bash + +# init karmada +karmadactl init + +# join member clusters +MEMBER_CLUSTER_NAME=kind-member1 +karmadactl --kubeconfig /etc/karmada/karmada-apiserver.config join ${MEMBER_CLUSTER_NAME} --cluster-kubeconfig=$HOME/.kube/config-member1 --cluster-context=kind-member1 +MEMBER_CLUSTER_NAME=kind-member2 +karmadactl --kubeconfig /etc/karmada/karmada-apiserver.config join ${MEMBER_CLUSTER_NAME} --cluster-kubeconfig=$HOME/.kube/config-member2 --cluster-context=kind-member2 + +# clean screen +clear diff --git a/karmada-HA-workload-example1/image/success.png b/karmada-HA-workload-example1/image/success.png new file mode 100644 index 0000000000000000000000000000000000000000..7edb1f70e0128c3a5d75eed07ee65e6bbce869ac GIT binary patch literal 6824 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 L8tW9@fIt5)*0ApH literal 0 HcmV?d00001 diff --git a/karmada-HA-workload-example1/index.json b/karmada-HA-workload-example1/index.json new file mode 100644 index 0000000..2f303c0 --- /dev/null +++ b/karmada-HA-workload-example1/index.json @@ -0,0 +1,37 @@ +{ + "title": "HA workload deployment1", + "description": "propagate workload through karmada duplicated mode", + "details": { + "intro": { + "text": "intro.md", + "foreground": "foreground.sh" + }, + "steps": [ + { + "title": "Check member cluster has been joined", + "text": "step1/text.md", + "verify": "step1/verify.sh" + }, + { + "title": "Create deployment", + "text": "step2/text.md", + "verify": "step2/verify.sh" + }, + { + "title": "Create propagationPolicy and deploy deployment", + "text": "step3/text.md", + "verify": "step3/verify.sh" + }, + { + "title": "Check the status and quantity distribution of pods and deployments", + "text": "step4/text.md" + } + ], + "finish": { + "text": "finish.md" + } + }, + "backend": { + "imageid": "kubernetes-kubeadm-2nodes" + } + } diff --git a/karmada-HA-workload-example1/intro.md b/karmada-HA-workload-example1/intro.md new file mode 100644 index 0000000..5721939 --- /dev/null +++ b/karmada-HA-workload-example1/intro.md @@ -0,0 +1,7 @@ +# What is Karmada? + +Karmada (Kubernetes Armada) is a Kubernetes management system that enables you to run your cloud-native applications across multiple Kubernetes clusters and clouds, with no changes to your applications. By speaking Kubernetes-native APIs and providing advanced scheduling capabilities, Karmada enables truly open, multi-cloud Kubernetes. + +Karmada aims to provide turnkey automation for multi-cluster application management in multi-cloud and hybrid cloud scenarios, with key features such as centralized multi-cloud management, high availability, failure recovery, and traffic scheduling. + +In this scenario, we'll learn how to deploy workloads across multiple clusters using PropagationPolicy to duplicate the nginx deployment. diff --git a/karmada-HA-workload-example1/step1/text.md b/karmada-HA-workload-example1/step1/text.md new file mode 100644 index 0000000..4b79b23 --- /dev/null +++ b/karmada-HA-workload-example1/step1/text.md @@ -0,0 +1,14 @@ +### Background: + +1. The kubeconfig files for the host cluster, member1 cluster, and member2 cluster are located in the $HOME/.kube directory. These files are named config, config-member1, and config-member2 respectively. + + ```shell + $HOME/.kube/config + $HOME/.kube/config-member1 + $HOME/.kube/config-member2 + ``` +2. Check whether the member cluster has been joined + + RUN `kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get cluster`{{exec}} + +**Note**: Initializing the testing environment may take a few minutes. diff --git a/karmada-HA-workload-example1/step1/verify.sh b/karmada-HA-workload-example1/step1/verify.sh new file mode 100644 index 0000000..2f53c33 --- /dev/null +++ b/karmada-HA-workload-example1/step1/verify.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get cluster diff --git a/karmada-HA-workload-example1/step2/text.md b/karmada-HA-workload-example1/step2/text.md new file mode 100644 index 0000000..84050b0 --- /dev/null +++ b/karmada-HA-workload-example1/step2/text.md @@ -0,0 +1,5 @@ +### create deployment + +create deployment named nginx + + RUN `kubectl --kubeconfig /etc/karmada/karmada-apiserver.config apply -f ~/nginx/nginxDeployment.yaml`{{exec}} diff --git a/karmada-HA-workload-example1/step2/verify.sh b/karmada-HA-workload-example1/step2/verify.sh new file mode 100644 index 0000000..ca91f78 --- /dev/null +++ b/karmada-HA-workload-example1/step2/verify.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get deployment nginx diff --git a/karmada-HA-workload-example1/step3/text.md b/karmada-HA-workload-example1/step3/text.md new file mode 100644 index 0000000..d8aad94 --- /dev/null +++ b/karmada-HA-workload-example1/step3/text.md @@ -0,0 +1,3 @@ +### create propagationpolicy and deploy nginx to specific clusters + + RUN `kubectl --kubeconfig /etc/karmada/karmada-apiserver.config create -f ~/nginx/propagationPolicy.yaml`{{exec}} diff --git a/karmada-HA-workload-example1/step3/verify.sh b/karmada-HA-workload-example1/step3/verify.sh new file mode 100644 index 0000000..077dcc6 --- /dev/null +++ b/karmada-HA-workload-example1/step3/verify.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get PropagationPolicy nginx-propagation diff --git a/karmada-HA-workload-example1/step4/text.md b/karmada-HA-workload-example1/step4/text.md new file mode 100644 index 0000000..b5fa453 --- /dev/null +++ b/karmada-HA-workload-example1/step4/text.md @@ -0,0 +1,7 @@ +### Check the status and quantity distribution of pods and deployments + +RUN `karmadactl --kubeconfig /etc/karmada/karmada-apiserver.config get deployment +`{{exec}} + +RUN `karmadactl --kubeconfig /etc/karmada/karmada-apiserver.config get pods +`{{exec}} diff --git a/karmada-HA-workload-example2/finish.md b/karmada-HA-workload-example2/finish.md new file mode 100644 index 0000000..57f8b95 --- /dev/null +++ b/karmada-HA-workload-example2/finish.md @@ -0,0 +1,3 @@ +**Summary** + +In this scenario, we learned how deploy workloads across multiple clusters using PropagationPolicy with StaticWeight configuration to divide the nginx deployment. diff --git a/karmada-HA-workload-example2/foreground.sh b/karmada-HA-workload-example2/foreground.sh new file mode 100644 index 0000000..b8cbf6a --- /dev/null +++ b/karmada-HA-workload-example2/foreground.sh @@ -0,0 +1,156 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +# variable define +kind_version=v0.17.0 +host_cluster_ip=172.30.1.2 #host node where Karmada is located +member_cluster_ip=172.30.2.2 +local_ip=127.0.0.1 +KUBECONFIG_PATH=${KUBECONFIG_PATH:-"${HOME}/.kube"} + +function installKind() { + cat << EOF > installKind.sh + wget https://github.com/kubernetes-sigs/kind/releases/download/${kind_version}/kind-linux-amd64 + chmod +x kind-linux-amd64 + sudo mv kind-linux-amd64 /usr/local/bin/kind +EOF +} + +function createCluster() { + cat << EOF > createCluster.sh + kind create cluster --name=member1 --config=cluster1.yaml + mv $HOME/.kube/config ~/config-member1 + kind create cluster --name=member2 --config=cluster2.yaml + mv $HOME/.kube/config config-member2 + KUBECONFIG=~/config-member1:~/config-member2 kubectl config view --merge --flatten >> ${KUBECONFIG_PATH}/config + # modify ip + sed -i "s/${local_ip}/${member_cluster_ip}/g" config-member1 + scp config-member1 root@${host_cluster_ip}:$HOME/.kube/config-member1 + sed -i "s/${local_ip}/${member_cluster_ip}/g" config-member2 + scp config-member2 root@${host_cluster_ip}:$HOME/.kube/config-member2 +EOF +} + +function cluster1Config() { + cat << EOF > cluster1.yaml + kind: Cluster + apiVersion: kind.x-k8s.io/v1alpha4 + networking: + apiServerAddress: "${member_cluster_ip}" + apiServerPort: 6443 +EOF +} + +function cluster2Config() { + cat << EOF > cluster2.yaml + kind: Cluster + apiVersion: kind.x-k8s.io/v1alpha4 + networking: + apiServerAddress: "${member_cluster_ip}" + apiServerPort: 6444 +EOF +} + +function nginxDeployment() { + cat << EOF > nginxDeployment.yaml + apiVersion: apps/v1 + kind: Deployment + metadata: + name: nginx + labels: + app: nginx + spec: + replicas: 3 + selector: + matchLabels: + app: nginx + template: + metadata: + labels: + app: nginx + spec: + containers: + - image: nginx + name: nginx +EOF +} + +function propagationPolicy() { + cat << EOF > propagationPolicy.yaml + apiVersion: policy.karmada.io/v1alpha1 + kind: PropagationPolicy + metadata: + name: nginx-propagation + spec: + resourceSelectors: + - apiVersion: apps/v1 + kind: Deployment + name: nginx + placement: + clusterAffinity: + clusterNames: + - kind-member1 + - kind-member2 + replicaScheduling: + replicaDivisionPreference: Weighted + replicaSchedulingType: Divided + weightPreference: + staticWeightList: + - targetCluster: + clusterNames: + - kind-member1 + weight: 2 + - targetCluster: + clusterNames: + - kind-member2 + weight: 1 +EOF +} + + +function copyConfigFilesToNode() { + scp installKind.sh root@${member_cluster_ip}:~ + scp createCluster.sh root@${member_cluster_ip}:~ + scp cluster1.yaml root@${member_cluster_ip}:~ + scp cluster2.yaml root@${member_cluster_ip}:~ +} + +kubectl delete node node01 +kubectl taint node controlplane node-role.kubernetes.io/control-plane:NoSchedule- + +# install kind and create member clusters +installKind +createCluster +cluster1Config +cluster2Config +copyConfigFilesToNode + +# generate nginx config +mkdir nginx +cd nginx +nginxDeployment +propagationPolicy + +# create cluster in node01 machine +ssh root@${member_cluster_ip} "bash ~/installKind.sh" & +sleep 10 +ssh root@${member_cluster_ip} "bash ~/createCluster.sh" & +sleep 90 + +# install karmadactl +curl -s https://raw.githubusercontent.com/karmada-io/karmada/master/hack/install-cli.sh | sudo bash + +# init karmada +karmadactl init + +# join member clusters +MEMBER_CLUSTER_NAME=kind-member1 +karmadactl --kubeconfig /etc/karmada/karmada-apiserver.config join ${MEMBER_CLUSTER_NAME} --cluster-kubeconfig=$HOME/.kube/config-member1 --cluster-context=kind-member1 +MEMBER_CLUSTER_NAME=kind-member2 +karmadactl --kubeconfig /etc/karmada/karmada-apiserver.config join ${MEMBER_CLUSTER_NAME} --cluster-kubeconfig=$HOME/.kube/config-member2 --cluster-context=kind-member2 + +# clean screen +clear diff --git a/karmada-HA-workload-example2/image/success.png b/karmada-HA-workload-example2/image/success.png new file mode 100644 index 0000000000000000000000000000000000000000..7edb1f70e0128c3a5d75eed07ee65e6bbce869ac GIT binary patch literal 6824 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 L8tW9@fIt5)*0ApH literal 0 HcmV?d00001 diff --git a/karmada-HA-workload-example2/index.json b/karmada-HA-workload-example2/index.json new file mode 100644 index 0000000..2664aae --- /dev/null +++ b/karmada-HA-workload-example2/index.json @@ -0,0 +1,37 @@ +{ + "title": "HA workload deployment2", + "description": "propagate workload through karmada divided mode", + "details": { + "intro": { + "text": "intro.md", + "foreground": "foreground.sh" + }, + "steps": [ + { + "title": "Check member cluster has joined", + "text": "step1/text.md", + "verify": "step1/verify.sh" + }, + { + "title": "create deployment", + "text": "step2/text.md", + "verify": "step2/verify.sh" + }, + { + "title": "Create propagationPolicy and deploy deployment", + "text": "step3/text.md", + "verify": "step3/verify.sh" + }, + { + "title": "Check the status and quantity distribution of pods and deployments", + "text": "step4/text.md" + } + ], + "finish": { + "text": "finish.md" + } + }, + "backend": { + "imageid": "kubernetes-kubeadm-2nodes" + } + } diff --git a/karmada-HA-workload-example2/intro.md b/karmada-HA-workload-example2/intro.md new file mode 100644 index 0000000..23a29eb --- /dev/null +++ b/karmada-HA-workload-example2/intro.md @@ -0,0 +1,7 @@ +# What is Karmada? + +Karmada (Kubernetes Armada) is a Kubernetes management system that enables you to run your cloud-native applications across multiple Kubernetes clusters and clouds, with no changes to your applications. By speaking Kubernetes-native APIs and providing advanced scheduling capabilities, Karmada enables truly open, multi-cloud Kubernetes. + +Karmada aims to provide turnkey automation for multi-cluster application management in multi-cloud and hybrid cloud scenarios, with key features such as centralized multi-cloud management, high availability, failure recovery, and traffic scheduling. + +In this scenario, we'll learn how to deploy workloads across multiple clusters using PropagationPolicy with StaticWeight configuration to divide the nginx deployment. diff --git a/karmada-HA-workload-example2/step1/text.md b/karmada-HA-workload-example2/step1/text.md new file mode 100644 index 0000000..4b79b23 --- /dev/null +++ b/karmada-HA-workload-example2/step1/text.md @@ -0,0 +1,14 @@ +### Background: + +1. The kubeconfig files for the host cluster, member1 cluster, and member2 cluster are located in the $HOME/.kube directory. These files are named config, config-member1, and config-member2 respectively. + + ```shell + $HOME/.kube/config + $HOME/.kube/config-member1 + $HOME/.kube/config-member2 + ``` +2. Check whether the member cluster has been joined + + RUN `kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get cluster`{{exec}} + +**Note**: Initializing the testing environment may take a few minutes. diff --git a/karmada-HA-workload-example2/step1/verify.sh b/karmada-HA-workload-example2/step1/verify.sh new file mode 100644 index 0000000..fc88cfc --- /dev/null +++ b/karmada-HA-workload-example2/step1/verify.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get cluster + diff --git a/karmada-HA-workload-example2/step2/text.md b/karmada-HA-workload-example2/step2/text.md new file mode 100644 index 0000000..84050b0 --- /dev/null +++ b/karmada-HA-workload-example2/step2/text.md @@ -0,0 +1,5 @@ +### create deployment + +create deployment named nginx + + RUN `kubectl --kubeconfig /etc/karmada/karmada-apiserver.config apply -f ~/nginx/nginxDeployment.yaml`{{exec}} diff --git a/karmada-HA-workload-example2/step2/verify.sh b/karmada-HA-workload-example2/step2/verify.sh new file mode 100644 index 0000000..ca91f78 --- /dev/null +++ b/karmada-HA-workload-example2/step2/verify.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get deployment nginx diff --git a/karmada-HA-workload-example2/step3/text.md b/karmada-HA-workload-example2/step3/text.md new file mode 100644 index 0000000..d8aad94 --- /dev/null +++ b/karmada-HA-workload-example2/step3/text.md @@ -0,0 +1,3 @@ +### create propagationpolicy and deploy nginx to specific clusters + + RUN `kubectl --kubeconfig /etc/karmada/karmada-apiserver.config create -f ~/nginx/propagationPolicy.yaml`{{exec}} diff --git a/karmada-HA-workload-example2/step3/verify.sh b/karmada-HA-workload-example2/step3/verify.sh new file mode 100644 index 0000000..077dcc6 --- /dev/null +++ b/karmada-HA-workload-example2/step3/verify.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get PropagationPolicy nginx-propagation diff --git a/karmada-HA-workload-example2/step4/text.md b/karmada-HA-workload-example2/step4/text.md new file mode 100644 index 0000000..b5fa453 --- /dev/null +++ b/karmada-HA-workload-example2/step4/text.md @@ -0,0 +1,7 @@ +### Check the status and quantity distribution of pods and deployments + +RUN `karmadactl --kubeconfig /etc/karmada/karmada-apiserver.config get deployment +`{{exec}} + +RUN `karmadactl --kubeconfig /etc/karmada/karmada-apiserver.config get pods +`{{exec}}