diff --git a/.mk/k8s.mk b/.mk/k8s.mk index ad26b56849..30b803a1ff 100644 --- a/.mk/k8s.mk +++ b/.mk/k8s.mk @@ -14,6 +14,10 @@ $(TOOLSBIN)/kubectl: sudo -E curl -fsSL -o $(TOOLSBIN)/kubectl https://storage.googleapis.com/kubernetes-release/release/v1.20.1/bin/linux/amd64/kubectl && \ sudo -E chmod a+x $(TOOLSBIN)/kubectl +$(TOOLSBIN)/jq: + sudo wget -O $@ https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 && \ + sudo chmod a+x $@ + # NodePorts are in the 30000-32767 range by default, which means a NodePort is # unlikely to match a service’s intended port (for example, 8080 may be exposed # as 31020). diff --git a/contrib/charts/skydive-analyzer/Makefile b/contrib/charts/skydive-analyzer/Makefile index 15727d9129..5de6f385d1 100644 --- a/contrib/charts/skydive-analyzer/Makefile +++ b/contrib/charts/skydive-analyzer/Makefile @@ -1,11 +1,11 @@ include ../../../.mk/k8s.mk # must be within the range of k8s nodePort -ANALYZER_NODEPORT?=30000 +ANALYZER_NODEPORT?=30082 ANALYZER_PORT?=8082 ANALYZER_SERVICE?=skydive-analyzer -ETCD_NODEPORT?=30001 -NEWUI_NODEPORT?=30002 +ETCD_NODEPORT?=30079 +NEWUI_NODEPORT?=30080 .PHONY: uninstall uninstall: $(TOOLSBIN)/helm @@ -14,10 +14,12 @@ uninstall: $(TOOLSBIN)/helm .PHONY: install install: $(TOOLSBIN)/helm helm install skydive-analyzer . \ + --set service.type=NodePort \ --set service.port=${ANALYZER_PORT} \ --set service.nodePort=${ANALYZER_NODEPORT} \ --set etcd.nodePort=${ETCD_NODEPORT} \ --set elasticsearch.enabled=true \ + --set newui.enabled=true \ --set newui.nodePort=${NEWUI_NODEPORT} \ .PHONY: status diff --git a/contrib/charts/skydive-analyzer/fleet.yaml b/contrib/charts/skydive-analyzer/fleet.yaml new file mode 100644 index 0000000000..92568dd1c9 --- /dev/null +++ b/contrib/charts/skydive-analyzer/fleet.yaml @@ -0,0 +1,70 @@ +defaultNamespace: default +targetCustomizations: +- name: broker + helm: + values: + newui: + enabled: false + service: + type: NodePort + nodePort: 30082 + etcd: + nodePort: 30079 + extraEnvs: + - name: SKYDIVE_HOST_ID + value: "broker" + - name: SKYDIVE_ANALYZER_TOPOLOGY_FABRIC + value: null + - name: SKYDIVE_ANALYZER_TOPOLOGY_K8S_CLUSTER_NAME + value: "broker" + clusterSelector: + matchLabels: + name: local + +- name: east + helm: + values: + newui: + enabled: false + service: + type: ClusterIP + extraEnvs: + - name: SKYDIVE_HOST_ID + value: "east" + - name: SKYDIVE_ANALYZERS + value: "broker:30082" + - name: SKYDIVE_ANALYZER_TOPOLOGY_FABRIC + value: null + - name: SKYDIVE_ANALYZER_TOPOLOGY_K8S_CLUSTER_NAME + value: "east" + - name: SKYDIVE_ETCD_EMBEDDED + value: "false" + - name: SKYDIVE_ETCD_SERVERS + value: "http://broker:30079" + clusterSelector: + matchLabels: + env: east + +- name: west + helm: + values: + newui: + enabled: false + service: + type: ClusterIP + extraEnvs: + - name: SKYDIVE_HOST_ID + value: "west" + - name: SKYDIVE_ANALYZERS + value: "broker:30082" + - name: SKYDIVE_ANALYZER_TOPOLOGY_FABRIC + value: null + - name: SKYDIVE_ANALYZER_TOPOLOGY_K8S_CLUSTER_NAME + value: "west" + - name: SKYDIVE_ETCD_EMBEDDED + value: "false" + - name: SKYDIVE_ETCD_SERVERS + value: "http://broker:30079" + clusterSelector: + matchLabels: + env: west diff --git a/contrib/charts/skydive-analyzer/values.yaml b/contrib/charts/skydive-analyzer/values.yaml index 86da679e21..24da234883 100644 --- a/contrib/charts/skydive-analyzer/values.yaml +++ b/contrib/charts/skydive-analyzer/values.yaml @@ -22,7 +22,7 @@ etcd: nodePort: newui: - enabled: true + enabled: false image: repository: "skydive/skydive-ui" tag: "latest" diff --git a/contrib/fleet/Makefile b/contrib/fleet/Makefile new file mode 100644 index 0000000000..53456eab23 --- /dev/null +++ b/contrib/fleet/Makefile @@ -0,0 +1,9 @@ +include ../../.mk/k8s.mk + +.PHONY: install uinstall status logs +install uninstall status logs: $(TOOLSBIN)/k3d $(TOOLSBIN)/helm $(TOOLSBIN)/kubectl $(TOOLSBIN)/jq + ./skydive.sh $@ + +.PHONY: broker east west +broker east west: $(TOOLSBIN)/kubectl + kubectl --context k3d-$@ port-forward service/skydive-analyzer 8082:8082 diff --git a/contrib/fleet/skydive.sh b/contrib/fleet/skydive.sh new file mode 100755 index 0000000000..95abc433aa --- /dev/null +++ b/contrib/fleet/skydive.sh @@ -0,0 +1,309 @@ +#/usr/bin/env bash + +set -x +set -e + +WITHOUT_BROKER=${WITHOUT_BROKER:-false} +WITHOUT_SPOKE=${WITHOUT_SPOKE:-false} +K3D_AGENTS=${K3D_AGENTS:-0} +FLEET_VERSION=${FLEET_VERSION:-0.3.0} +ANALYZER_NODEPORTS=${ANALYZER_NODEPORTS:-30082} +ETCD_NODEPORTS=${ETCD_NODEPORTS:-30079} + +GIT_REPO=https://github.com/hunchback/skydive/ +GIT_BRANCH=charts-fleet +GIT_PATH=contrib/charts/skydive-analyzer +GIT_APP=skydive-analyzer + +K3D_SPOKES=${K3D_SPOKES:-east west} + +k3d_install() { + which k3d 2>/dev/null && return + curl -s https://raw.githubusercontent.com/rancher/k3d/main/install.sh | TAG=v3.0.0 bash +} + +tools() { + k3d_install +} + +k3d_delete() { + local name=$1 + k3d cluster delete $name 2>/dev/null || true +} + +k3d_coredns_broker_entry() { + local hostname=broker + local ipaddr=$(hostname -I) + local nodehosts="$(kubectl get configmap coredns -n kube-system -o json | jq -r .data.NodeHosts)" + kubectl patch configmap coredns -n kube-system -p \ +"{ + \"data\":{ + \"NodeHosts\": + \"${nodehosts}\n $ipaddr $hostname\n\" + } +}" + kubectl get configmap coredns -n kube-system -o json | jq .data.NodeHosts +} + +k3d_create() { + local name=$1; shift + k3d cluster create --agents $K3D_AGENTS $name $* + sleep 5 + k3d_coredns_broker_entry +} + +helm_uninstall() { + local context=$1; shift + local name=$1; shift + helm --kube-context $context --namespace fleet-system uninstall $name 2>/dev/null || true +} + +helm_install() { + local context=$1; shift + local name=$1; shift + helm --kube-context $context --namespace fleet-system install --create-namespace $* \ + $name https://github.com/rancher/fleet/releases/download/v${FLEET_VERSION}/${name}-${FLEET_VERSION}.tgz +} + +helm_status() { + local context=$1; shift + helm --kube-context $context --namespace fleet-system list +} + +#################### +##### broker ###### +#################### + +broker_delete() { + k3d_delete broker +} + +broker_create() { + k3d_create broker \ + -p "${ANALYZER_NODEPORTS}:${ANALYZER_NODEPORTS}@server[0]" \ + -p "${ETCD_NODEPORTS}:${ETCD_NODEPORTS}@server[0]" +} + +broker_install() { + local context=k3d-broker + local url=broker:8080 + helm_install $context fleet-crd + helm_install $context fleet \ + --wait \ + --set apiServerURL=$url +} + +broker_status() { + local context=k3d-broker + helm_status $context +} + +broker_token() { + local context=k3d-broker + local name=token + local namespace=clusters + + cat < /tmp/values.yaml + cat /tmp/values.yaml +} + +broker_proxy_kill() { + sudo killall -9 kubectl 2>/dev/null || true +} + +broker_proxy() { + local context=k3d-broker + kubectl proxy --accept-hosts '^.*' --address 0.0.0.0 --port 8080 --context $context& +} + +broker_logs() { + local context=k3d-broker + kubectl --context $context --namespace fleet-system logs -l app=fleet-controller || true + kubectl --context $context --namespace fleet-system get pods -l app=fleet-controller || true +} + +broker() { + broker_create + broker_install + broker_status + broker_token + broker_proxy +} + +#################### +##### spoke ###### +#################### + +spoke_delete() { + local name=$1; shift + k3d_delete $name +} + +spoke_create() { + local name=$1; shift + k3d_create $name +} + +spoke_install() { + local name=$1; shift + local context=k3d-$name + helm_install $context fleet-crd + helm_install $context fleet-agent \ + --set-string labels.env=$name \ + --values /tmp/values.yaml +} + +spoke_status() { + local name=$1; shift + local context=k3d-$name + helm_status $context +} + +spoke_logs() { + local name=$1; shift + local context=k3d-$name + kubectl --context $context --namespace fleet-system logs -l app=fleet-agent || true + kubectl --context $context --namespace fleet-system get pods -l app=fleet-agent || true +} + +spoke() { + local name=$1; shift + spoke_delete $name + spoke_create $name + spoke_install $name +} + +#################### +##### app ###### +#################### + +gitrepo_create() { + local context=k3d-broker + local namespace=$1; shift + kubectl --context $context create namespace $namespace 2>/dev/null || true + cat <