This is an automated email from the ASF dual-hosted git repository. wankai123 pushed a commit to branch support-HorizonUI in repository https://gitbox.apache.org/repos/asf/skywalking-showcase.git
commit 91ff581494322c032073f90859b39f5b3b35d6bc Author: wankai123 <[email protected]> AuthorDate: Wed May 20 11:36:16 2026 +0800 Support Horizon UI --- .github/workflows/publish-images.yaml | 4 + Makefile.in | 10 +- deploy/platform/kubernetes/Chart.yaml | 4 +- deploy/platform/kubernetes/Makefile | 1 - deploy/platform/kubernetes/templates/NOTES.txt | 4 +- .../templates/swck-eventexporter-extras.yaml | 193 +++++++++++++++++++++ deploy/platform/kubernetes/values.yaml | 20 ++- services/load-gen/Makefile | 9 +- 8 files changed, 226 insertions(+), 19 deletions(-) diff --git a/.github/workflows/publish-images.yaml b/.github/workflows/publish-images.yaml index 4acbc0a..d55258c 100644 --- a/.github/workflows/publish-images.yaml +++ b/.github/workflows/publish-images.yaml @@ -36,6 +36,10 @@ jobs: - uses: actions/checkout@v2 with: submodules: true + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 - name: Log in to the Container registry uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 with: diff --git a/Makefile.in b/Makefile.in index fd48b54..1dcc0c2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -33,10 +33,10 @@ ES_IMAGE ?= docker.elastic.co/elasticsearch/elasticsearch-oss ES_IMAGE_TAG ?= 7.10.2 SW_OAP_IMAGE ?= ghcr.io/apache/skywalking/oap -SW_OAP_IMAGE_TAG ?= dc77df696afb5d97cca79ec123d0e93f7ae84939 +SW_OAP_IMAGE_TAG ?= 5b481a41a99861249410118e4cfbf591c4508dae -SW_UI_IMAGE ?= ghcr.io/apache/skywalking/ui -SW_UI_IMAGE_TAG ?= dc77df696afb5d97cca79ec123d0e93f7ae84939 +SW_UI_IMAGE ?= ghcr.io/apache/skywalking-horizon-ui +SW_UI_IMAGE_TAG ?= 97950a600ceaece1d8056c4084d8551c1010d17d SW_CLI_IMAGE ?= ghcr.io/apache/skywalking-cli/skywalking-cli:bce7faaabbd57ed1f40156af8a8eb6c3eccea4ae SW_EVENT_EXPORTER_IMAGE ?= ghcr.io/apache/skywalking-kubernetes-event-exporter/skywalking-kubernetes-event-exporter:8a012a3f968cb139f817189afb9b3748841bba22 @@ -51,8 +51,8 @@ SW_SATELLITE_IMAGE_TAG ?= v8778e3e8a4ab4962102502ffc9ba7a3c73270609 SW_ROVER_IMAGE ?= ghcr.io/apache/skywalking-rover/skywalking-rover:67622c352b98fd32782a3e7afc7d3fbd6d6ec8e3 -SWCK_OPERATOR_IMAGE ?= docker.io/apache/skywalking-swck -SWCK_OPERATOR_IMAGE_TAG ?= v0.9.0 +SWCK_OPERATOR_IMAGE ?= ghcr.io/apache/skywalking-swck/operator +SWCK_OPERATOR_IMAGE_TAG ?= d299bc05ee230f5f366584054db5b099ca60166f SW_GRAFANA_PLUGIN_VERSION ?= 0.1.0 GRAFANA_IMAGE ?= grafana/grafana:12.4.2 diff --git a/deploy/platform/kubernetes/Chart.yaml b/deploy/platform/kubernetes/Chart.yaml index 614080e..9b66083 100644 --- a/deploy/platform/kubernetes/Chart.yaml +++ b/deploy/platform/kubernetes/Chart.yaml @@ -24,13 +24,13 @@ sources: dependencies: - name: skywalking-helm alias: skywalking - version: 0.0.0-bacca5ae7da89f41ce31f4b446ce1309b4ccc985 + version: 0.0.0-da0e267f877b9b8e5f7728ae4ea7dc7723a2a073 repository: oci://ghcr.io/apache/skywalking-helm # @feature: java-agent-injector; the java agent injector is a component of the swck operator, so we need to deploy the swck operator firstly - name: skywalking-helm-swck-operator alias: swck - version: 0.0.0-158f116af32e8824ec897c0c6d3022136e7481bb + version: 0.0.0-da0e267f877b9b8e5f7728ae4ea7dc7723a2a073 repository: oci://ghcr.io/apache/skywalking-helm condition: features.javaAgentInjector.enabled diff --git a/deploy/platform/kubernetes/Makefile b/deploy/platform/kubernetes/Makefile index 18238e4..8772b63 100644 --- a/deploy/platform/kubernetes/Makefile +++ b/deploy/platform/kubernetes/Makefile @@ -44,7 +44,6 @@ HELM_OPTIONS := $(HELM_OPTIONS) --set-json 'skywalking.banyandb.storage.data.per HELM_OPTIONS := $(HELM_OPTIONS) --set-json 'skywalking.banyandb.storage.data.persistentVolumeClaims[6]={"mountTargets":["stream","measure","property","trace"],"nodeRole":"cold","claimName":"cold-data","size":"500Gi","accessModes":["ReadWriteOnce"]$(PVC_STORAGE_CLASS_FIELD),"volumeMode":"Filesystem"}' HELM_OPTIONS := $(HELM_OPTIONS) --set skywalking.oap.image.repository=$(SW_OAP_IMAGE) --set skywalking.oap.image.tag=$(SW_OAP_IMAGE_TAG) HELM_OPTIONS := $(HELM_OPTIONS) --set skywalking.ui.image.repository=$(SW_UI_IMAGE) --set skywalking.ui.image.tag=$(SW_UI_IMAGE_TAG) -HELM_OPTIONS := $(HELM_OPTIONS) --set skywalking.ui.env.SW_ZIPKIN_ADDRESS=http://$(RELEASE)-oap.$(NAMESPACE).svc:9412 HELM_OPTIONS := $(HELM_OPTIONS) --set skywalking.satellite.image.repository=$(SW_SATELLITE_IMAGE) --set skywalking.satellite.image.tag=$(SW_SATELLITE_IMAGE_TAG) HELM_OPTIONS := $(HELM_OPTIONS) --set swck.image.repository=$(SWCK_OPERATOR_IMAGE) --set swck.image.tag=$(SWCK_OPERATOR_IMAGE_TAG) HELM_OPTIONS := $(HELM_OPTIONS) --set sampleServices.hub=$(HUB) --set sampleServices.tag=$(TAG) --set sampleServices.namespace=$(SAMPLE_SERVICES_NAMESPACE) diff --git a/deploy/platform/kubernetes/templates/NOTES.txt b/deploy/platform/kubernetes/templates/NOTES.txt index 8b35be5..9aadcc8 100644 --- a/deploy/platform/kubernetes/templates/NOTES.txt +++ b/deploy/platform/kubernetes/templates/NOTES.txt @@ -40,8 +40,8 @@ Get the UI URL by running these commands: export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "skywalking.ui.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo http://$SERVICE_IP:{{ .Values.skywalking.ui.service.externalPort }} {{- else if contains "ClusterIP" .Values.skywalking.ui.service.type }} - echo "Visit http://127.0.0.1:8080 to use your application" - kubectl port-forward svc/{{ printf "%s-ui" .Release.Name }} 8080:{{ .Values.skywalking.ui.service.externalPort }} --namespace {{ .Release.Namespace }} + echo "Visit http://127.0.0.1:8081 to use your application" + kubectl port-forward svc/{{ printf "%s-ui" .Release.Name }} 8081:{{ .Values.skywalking.ui.service.externalPort }} --namespace {{ .Release.Namespace }} {{- end }} {{- if .Values.skywalking.elasticsearch.enabled }} diff --git a/deploy/platform/kubernetes/templates/swck-eventexporter-extras.yaml b/deploy/platform/kubernetes/templates/swck-eventexporter-extras.yaml new file mode 100644 index 0000000..043f59d --- /dev/null +++ b/deploy/platform/kubernetes/templates/swck-eventexporter-extras.yaml @@ -0,0 +1,193 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +# Workaround for a gap in apache/skywalking-helm: the chart at the version +# pinned in Chart.yaml does not ship the EventExporter CRD or RBAC, but the +# pinned swck-operator image (Makefile.in: SWCK_OPERATOR_IMAGE_TAG) registers +# an EventExporterReconciler unconditionally. Without these, the operator +# fails cache sync and crashlooops, which takes its mutating webhook down +# and blocks pod creation in sample-services. +# +# Remove this file once apache/skywalking-helm ships EventExporter natively. +{{- if .Values.features.javaAgentInjector.enabled }} +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.19.0 + name: eventexporters.operator.skywalking.apache.org +spec: + group: operator.skywalking.apache.org + names: + kind: EventExporter + listKind: EventExporterList + plural: eventexporters + singular: eventexporter + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The version + jsonPath: .spec.version + name: Version + priority: 1 + type: string + - jsonPath: .spec.image + name: Image + priority: 1 + type: string + - description: The number of expected instances + jsonPath: .spec.instances + name: Instances + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: EventExporter is the Schema for the eventexporters API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: EventExporterSpec defines the desired state of EventExporter + properties: + config: + description: Config of filters and exporters + type: string + image: + description: Image is the event exporter Docker image to deploy. + type: string + replicas: + description: Replicas is the number of event exporter pods + format: int32 + type: integer + version: + description: Version of EventExporter. + type: string + required: + - replicas + - version + type: object + status: + description: EventExporterStatus defines the observed state of EventExporter + properties: + availableReplicas: + description: Total number of available pods targeted by this deployment. + format: int32 + type: integer + conditions: + description: Represents the latest available observations of the underlying + deployment's current state. + items: + description: DeploymentCondition describes the state of a deployment + at a certain point. + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + format: date-time + type: string + lastUpdateTime: + description: The last time this condition was updated. + format: date-time + type: string + message: + description: A human readable message indicating details about + the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type of deployment condition. + type: string + required: + - status + - type + type: object + type: array + configMapName: + description: Name of the configMap. + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ .Values.swck.fullnameOverride }}-eventexporter-extras +rules: +- apiGroups: + - operator.skywalking.apache.org + resources: + - eventexporters + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - operator.skywalking.apache.org + resources: + - eventexporters/finalizers + verbs: + - update +- apiGroups: + - operator.skywalking.apache.org + resources: + - eventexporters/status + verbs: + - get + - patch + - update +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ .Values.swck.fullnameOverride }}-eventexporter-extras +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ .Values.swck.fullnameOverride }}-eventexporter-extras +subjects: +- kind: ServiceAccount + name: {{ .Values.swck.fullnameOverride }}-controller-manager + namespace: {{ .Release.Namespace }} +{{- end }} \ No newline at end of file diff --git a/deploy/platform/kubernetes/values.yaml b/deploy/platform/kubernetes/values.yaml index 1ad0e25..b2e5f56 100644 --- a/deploy/platform/kubernetes/values.yaml +++ b/deploy/platform/kubernetes/values.yaml @@ -34,9 +34,6 @@ skywalking: zipkin-query: 9412 metrics: 1234 env: - SW_ADMIN_SERVER: default - SW_DSL_DEBUGGING: default - SW_RECEIVER_RUNTIME_RULE: default SW_HEALTH_CHECKER: default SW_OTEL_RECEIVER: default # @feature: so11y;,mysql;kubernetes-monitor enable OpenTelemetry receiver to receive OpenTelemetry metrics # @feature: vm; enable vm rules to analyze VM metrics @@ -157,8 +154,21 @@ skywalking: repository: ~ tag: ~ pullPolicy: IfNotPresent - env: - SW_ZIPKIN_ADDRESS: "" + # Minimal default so `make deploy.kubernetes` works for local dev — the + # upstream Horizon UI BFF refuses to start without at least one user. + # The hosted demo environment overrides this via demo-env-installer's + # demo-values.yaml; rotate before exposing outside trusted networks. + config: + auth: + backend: local + local: + users: + - username: admin # password: admin + passwordHash: "$argon2id$v=19$m=65536,t=3,p=4$eemqy1r72oSXR58y8VpRqw$Bn/dULrmJTHEi3263KfgWDEwQmUsqNLi3xwyv/DekHM" + roles: [admin] + - username: skywalking # password: skywalking + passwordHash: "$argon2id$v=19$m=65536,t=3,p=4$Zqj8HhQDqm8d5c2MipHYZw$BsaCnu4bdd4uadIldx3wwYLsdo47Thxb7Lv1MXpWG2Q" + roles: [ viewer, maintainer ] banyandb: enabled: false image: diff --git a/services/load-gen/Makefile b/services/load-gen/Makefile index 03eab0f..0128e8e 100644 --- a/services/load-gen/Makefile +++ b/services/load-gen/Makefile @@ -23,12 +23,13 @@ build: .PHONY: docker docker.build docker.push +# Multi-arch because chromium-base aborts under x86_64 QEMU on ARM hosts (SSE3 check vs /proc/cpuinfo). +LOAD_GEN_PLATFORMS ?= linux/amd64,linux/arm64 + docker: docker.build docker.build: docker build . -t $(HUB)/load-gen:$(TAG) -t $(HUB)/load-gen:$(TAG)-agentless -docker.push: docker.build - docker push $(HUB)/load-gen:$(TAG) - docker tag $(HUB)/load-gen:$(TAG) $(HUB)/load-gen:$(TAG)-agentless - docker push $(HUB)/load-gen:$(TAG)-agentless +docker.push: + docker buildx build --platform $(LOAD_GEN_PLATFORMS) --push . -t $(HUB)/load-gen:$(TAG) -t $(HUB)/load-gen:$(TAG)-agentless
