diff --git a/.github/actions/chart-releaser-action b/.github/actions/chart-releaser-action new file mode 160000 index 0000000..6d70e85 --- /dev/null +++ b/.github/actions/chart-releaser-action @@ -0,0 +1 @@ +Subproject commit 6d70e8546cd3d35bc8981b932b83df0acc531bf4 diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index fd58add..30f2631 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -2,9 +2,6 @@ name: Lint and Test Charts on: pull_request: - push: - branches: - - main jobs: lint-test: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 47139fe..29949d9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,7 +3,7 @@ name: Release Charts on: push: branches: - - "**-release" + - main jobs: release: @@ -12,21 +12,22 @@ jobs: - name: Checkout uses: actions/checkout@v2 with: + submodules: recursive + # ct needs history to compare fetch-depth: 0 - name: Configure Git run: | git config user.name "$GITHUB_ACTOR" git config user.email "$GITHUB_ACTOR@users.noreply.github.com" + - name: Install Helm uses: azure/setup-helm@v1 with: - version: v3.4.1 + version: v3.8.1 - name: Run chart-releaser - uses: helm/chart-releaser-action@v1.1.0 - with: - charts_dir: charts + uses: ./.github/actions/chart-releaser-action env: CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - CR_SKIP_EXISTING: true \ No newline at end of file + CR_SKIP_EXISTING: true diff --git a/.gitmodules b/.gitmodules index 98fb360..e7cadd5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule ".github/actions/kind-action"] path = .github/actions/kind-action url = https://github.com/helm/kind-action.git +[submodule ".github/actions/chart-releaser-action"] + path = .github/actions/chart-releaser-action + url = https://github.com/helm/chart-releaser-action.git diff --git a/README.md b/README.md index f5e7369..fa0c370 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ -# shenyu-helm-chart +# shenyu-helm-chart + +See [here](./charts/shenyu/README.md) for more information. diff --git a/charts/shenyu/Chart.yaml b/charts/shenyu/Chart.yaml index 4ca434a..86696cf 100644 --- a/charts/shenyu/Chart.yaml +++ b/charts/shenyu/Chart.yaml @@ -2,8 +2,10 @@ apiVersion: v2 name: shenyu description: Helm Chart for deploying Apache ShenYu in Kubernetes type: application -version: 2.4.3 -appVersion: "1.16.0" +version: 0.1.0 +appVersion: "2.4.3" icon: https://shenyu.apache.org/img/logo.png maintainers: - name: erdengk + - name: aFlyBird0 + email: aflybird0@gmail.com diff --git a/charts/shenyu/README.md b/charts/shenyu/README.md index 0745e15..ea58d44 100644 --- a/charts/shenyu/README.md +++ b/charts/shenyu/README.md @@ -1,3 +1,139 @@ # shenyu-helm-chart -Helm deployment documentation written for Apache/Shenyu \ No newline at end of file +Helm deployment documentation written for Apache/Shenyu. + +[English] [[简体中文]](#使用Helm安装ShenYu) + +[Apache/ShenYu](https://shenyu.apache.org/docs/index/) is an asynchronous, high-performance, cross-language, responsive API gateway. + +## Get Repo Info + +```shell +helm repo add shenyu https://apache.github.io/shenyu-helm-chart +helm repo update +``` + +_See [helm repo](https://helm.sh/docs/helm/helm_repo/) for command documentation._ + +todo: complete English version + +--- + +## 使用Helm安装ShenYu +[[English]](#shenyu-helm-chart) [简体中文] + +[Apache/ShenYu](https://shenyu.apache.org/zh/docs/index) 是一个异步的,高性能的,跨语言的,响应式的 API 网关。 + +## 添加 Helm 仓库 + +```shell +helm repo add shenyu https://apache.github.io/shenyu-helm-chart +helm repo update +``` + +## 安装 +* helm 安装方式目前支持 h2 与 MySQL 两种数据库。默认使用 h2。 +* 默认同时安装 admin 与 bootstrap。 +* 使用 NodePort 暴露服务,admin 默认端口为 31095, bootstrap 为 31195。 + +### h2 作为数据库 + +运行以下命令,会在 shenyu namespace 下安装 admin 与 bootstrap ,并创建命名空间。 + +```shell +helm install shenyu shenyu/shenyu -n=shenyu --create-namespace +``` + +### MySQL 作为数据库 + +MySQL 安装方式需要提前安装好 MySQ,并提前创建好 pv 以存放 connector。详见 [部署先决条件](https://shenyu.apache.org/zh/docs/deployment/deployment-before/)。 + +#### 1. 提前创建 pv + +可复制以下 yaml,至少**替换以下两处内容**: + +* `YOUR_K8S_NODE_NAME`:存放 MySQL connector 的 K8s 节点名称 +* `YOUR_PATH_TO_STORE_MYSQL_CONNECTOR`:# 指定节点上的目录, 该目录下面需要包含 mysql-connector.jar + +```shell +apiVersion: v1 +kind: PersistentVolume +metadata: + name: shenyu-pv +spec: + capacity: + storage: 1Gi + volumeMode: Filesystem + accessModes: + - ReadWriteOnce + persistentVolumeReclaimPolicy: Delete + storageClassName: shenyu-local-storage + local: + path: YOUR_PATH_TO_STORE_MYSQL_CONNECTOR + nodeAffinity: + required: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/hostname + operator: In + values: + - YOUR_K8S_NODE_NAME +--- +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: shenyu-local-storage +provisioner: kubernetes.io/no-provisioner +volumeBindingMode: WaitForFirstConsumer +``` + +修改并保存为 `shenyu-store.yaml`, 然后执行: + +```shell +kubectl apply -f shenyu-store.yaml -n=shenyu +``` + +#### 2. 安装 + +修改以下命令并复制,执行: + +其中,storageClass 和上面的 yaml 创建的 StorageClass 的 name 对应。 + +```shell +helm install shenyu shenyu/shenyu -n=shenyu --create-namespace \ + --set dataSource.active=mysql \ + --set dataSource.mysql.ip=127.0.0.1 \ + --set dataSource.mysql.port=3306 \ + --set dataSource.mysql.password=123456 \ + --set dataSource.mysql.storageClass=shenyu-local-storage +``` + +## Q&A + +### 1. 如果只安装 admin 或 bootstrap + +* 只安装 admin: 在 helm 安装命令末尾加上 `--set bootstrap.enabled=false` +* 只安装 bootstrap: 在 helm 安装命令末尾加上 `--set admin.enabled=false` + +### 2. 如何安装旧版本 ShenYu + +```shell +helm search repo shenyu -l +``` + +你会得到类似的输出: + +```shell +NAME CHART VERSION APP VERSION DESCRIPTION +shenyu/shenyu 2.4.3 2.4.3 Helm Chart for deploying Apache ShenYu in Kuber... +... +... +``` + +其中 APP_VERSION 是 ShenYu 的版本,CHART_VERSION 是 helm chart 的版本。 + +根据要安装的 ShenYu 版本来选择对应的 Chart 版本,在命令末尾加上 `--version=CHART_VERSION` 参数即可。例如: + +```shell +helm install shenyu shenyu/shenyu -n=shenyu --version=2.4.3 --create-namespace +``` diff --git a/charts/shenyu/templates/ConfigMap.yaml b/charts/shenyu/templates/ConfigMap.yaml index 3de641f..be8cb4e 100644 --- a/charts/shenyu/templates/ConfigMap.yaml +++ b/charts/shenyu/templates/ConfigMap.yaml @@ -1,52 +1,86 @@ apiVersion: v1 kind: ConfigMap metadata: - name: shenyu-cm - namespace: default + namespace: {{.Release.Namespace}} + name: {{ template "shenyu.fullname" . }}-configmap + labels: + "app.kubernetes.io/name": '{{ template "shenyu.name" . }}' + "app.kubernetes.io/managed-by": "{{ .Release.Service }}" + "app.kubernetes.io/component": "shenyu-configmap" + "app.kubernetes.io/instance": "{{ .Release.Name }}" data: application-local.yml: | server: - port: 9195 - address: 0.0.0.0 + port: 9195 + address: 0.0.0.0 spring: - main: - allow-bean-definition-overriding: true - application: - name: shenyu-bootstrap + profiles: + active: {{ .Values.dataSource.active }} + main: + allow-bean-definition-overriding: true + application: + name: shenyu-bootstrap management: - health: - defaults: - enabled: false + health: + defaults: + enabled: false shenyu: - local: - enabled: true - file: - enabled: true - cross: - enabled: true - dubbo: - parameter: multi - sync: - websocket: - urls: ws://shenyu-admin-svc.shenyu.svc.cluster.local:9095/websocket - exclude: - enabled: false - paths: - - /favicon.ico - extPlugin: - enabled: true - threads: 1 - scheduleTime: 300 - scheduleDelay: 30 - scheduler: - enabled: false - type: fixed - threads: 16 + local: + enabled: true + file: + enabled: true + cross: + enabled: true + dubbo: + parameter: multi + sync: + websocket: + urls: ws://{{ template "shenyu.fullname" . }}-admin.shenyu.svc.cluster.local:9095/websocket + exclude: + enabled: false + paths: + - /favicon.ico + extPlugin: + enabled: true + threads: 1 + scheduleTime: 300 + scheduleDelay: 30 + scheduler: + enabled: false + type: fixed + threads: 16 logging: - level: - root: info - org.springframework.boot: info - org.apache.ibatis: info - org.apache.shenyu.bonuspoint: info - org.apache.shenyu.lottery: info - org.apache.shenyu: info + level: + root: info + org.springframework.boot: info + org.apache.ibatis: info + org.apache.shenyu.bonuspoint: info + org.apache.shenyu.lottery: info + org.apache.shenyu: info + {{- if eq .Values.dataSource.active "h2" }} + application-h2.yml: | + shenyu: + database: + dialect: h2 + init_script: "sql-script/h2/schema.sql" + init_enable: {{ .Values.dataSource.initEnabled }} + spring: + datasource: + url: jdbc:h2:mem:~/shenyu;DB_CLOSE_DELAY=-1;MODE=MySQL; + username: {{ .Values.dataSource.h2.username }} + password: {{ .Values.dataSource.h2.password }} + driver-class-name: org.h2.Driver + {{- end }} + {{- if eq .Values.dataSource.active "mysql" }} + application-mysql.yml: | + shenyu: + database: + dialect: mysql + init_enable: {{ .Values.dataSource.initEnabled }} + spring: + datasource: + url: jdbc:mysql://{{ template "shenyu.fullname" . }}-mysql.shenyu.svc.cluster.local:3306/shenyu?useUnicode=true&characterEncoding=utf-8&useSSL=false + username: {{ .Values.dataSource.mysql.username }} + password: {{ .Values.dataSource.mysql.password }} + driver-class-name: {{ .Values.dataSource.mysql.driverClass }} + {{- end }} diff --git a/charts/shenyu/templates/_helpers.tpl b/charts/shenyu/templates/_helpers.tpl new file mode 100644 index 0000000..28c199d --- /dev/null +++ b/charts/shenyu/templates/_helpers.tpl @@ -0,0 +1,13 @@ +{{- define "shenyu.name" -}} +{{- .Chart.Name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + + +{{- define "shenyu.fullname" -}} +{{- $name := .Chart.Name -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} diff --git a/charts/shenyu/templates/deployment.yaml b/charts/shenyu/templates/deployment.yaml deleted file mode 100644 index d9d79ae..0000000 --- a/charts/shenyu/templates/deployment.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - creationTimestamp: null - labels: - name: {{ .Release.Name }} - app: {{ .Chart.Name }}-{{ .Release.Name}} - name: {{ .Release.Name}} -spec: - replicas: {{ .Values.replicas}} - selector: - matchLabels: - app: {{ .Values.label}} - strategy: {} - template: - metadata: - creationTimestamp: null - labels: - app: {{ .Values.label}} - spec: - containers: - - name: shenyu-admin - image: {{ .Values.admin.image }}:{{ default "2.4.2" .Values.admin.tag }} - resources: {} - - name: shenyu-bootstrap - image: {{ .Values.bootstrap.image }}:{{ default "2.4.2" .Values.bootstrap.tag }} - resources: {} -status: {} \ No newline at end of file diff --git a/charts/shenyu/templates/service-admin.yaml b/charts/shenyu/templates/service-admin.yaml deleted file mode 100644 index 1bc8973..0000000 --- a/charts/shenyu/templates/service-admin.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - creationTimestamp: null - labels: - app: {{ .Release.Name}} - name: shenyu-admin -spec: - type: NodePort - ports: - - port: 9095 - protocol: TCP - targetPort: 9095 - nodePort: 31095 - selector: - app: {{ .Release.Name}} \ No newline at end of file diff --git a/charts/shenyu/templates/service-bootstrap.yaml b/charts/shenyu/templates/service-bootstrap.yaml deleted file mode 100644 index 103f431..0000000 --- a/charts/shenyu/templates/service-bootstrap.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{ if .Values.bootstrap.enabled }} -apiVersion: v1 -kind: Service -metadata: - creationTimestamp: null - labels: - app: {{ .Release.Name}} - name: shenyu-bootstrap -spec: - type: NodePort - ports: - - port: 9195 - protocol: TCP - targetPort: 9195 - nodePort: 31195 - selector: - app: {{ .Release.Name}} -status: - loadBalancer: {} -{{end}} diff --git a/charts/shenyu/templates/shenyu-admin-deployment.yaml b/charts/shenyu/templates/shenyu-admin-deployment.yaml new file mode 100644 index 0000000..87d7a4c --- /dev/null +++ b/charts/shenyu/templates/shenyu-admin-deployment.yaml @@ -0,0 +1,68 @@ +{{- if .Values.admin.enabled -}} +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: {{ .Release.Namespace }} + name: {{ template "shenyu.fullname" . }}-admin + labels: + "app.kubernetes.io/name": '{{ template "shenyu.name" . }}-admin' + "app.kubernetes.io/managed-by": "{{ .Release.Service }}" + "app.kubernetes.io/component": "shenyu-admin" + "app.kubernetes.io/instance": "{{ .Release.Name }}" +spec: + selector: + matchLabels: + "app.kubernetes.io/component": "shenyu-admin" + "app.kubernetes.io/instance": "{{ .Release.Name }}" + replicas: {{ .Values.replicas }} + template: + metadata: + labels: + "app.kubernetes.io/name": '{{ template "shenyu.name" . }}-admin' + "app.kubernetes.io/managed-by": "{{ .Release.Service }}" + "app.kubernetes.io/component": "shenyu-admin" + "app.kubernetes.io/instance": "{{ .Release.Name }}" + spec: + containers: + - name: shenyu-admin + image: {{ .Values.admin.image }}:{{ required "A valid .Values.version entry required!" .Values.version }} + imagePullPolicy: Always + ports: + - containerPort: 9095 + env: + - name: 'TZ' + value: 'Asia/Beijing' + {{- if eq .Values.dataSource.active "h2" }} + volumeMounts: + - name: shenyu-admin-config + mountPath: /opt/shenyu-admin/config/application-h2.yml + subPath: application-h2.yml + {{- end}} + {{- if eq .Values.dataSource.active "mysql" }} + volumeMounts: + - name: shenyu-admin-config + mountPath: /opt/shenyu-admin/config/application-mysql.yml + subPath: application-mysql.yml + - mountPath: /opt/shenyu-admin/ext-lib + name: mysql-connector-volume + {{- end}} + volumes: + {{- if eq .Values.dataSource.active "mysql" }} + - name: mysql-connector-volume + persistentVolumeClaim: + claimName: {{ template "shenyu.fullname" . }}-pvc + {{- end }} + - name: shenyu-admin-config + configMap: + name: {{ template "shenyu.fullname" . }}-configmap + items: + {{- if eq .Values.dataSource.active "mysql" }} + - key: application-mysql.yml + path: application-mysql.yml + {{- end }} + {{- if eq .Values.dataSource.active "h2" }} + - key: application-h2.yml + path: application-h2.yml + {{- end }} + +{{- end -}} diff --git a/charts/shenyu/templates/shenyu-admin-svc.yaml b/charts/shenyu/templates/shenyu-admin-svc.yaml new file mode 100644 index 0000000..ea311b0 --- /dev/null +++ b/charts/shenyu/templates/shenyu-admin-svc.yaml @@ -0,0 +1,23 @@ +{{- if .Values.admin.enabled -}} +# Now we only support NodePort mode +apiVersion: v1 +kind: Service +metadata: + namespace: {{ .Release.Namespace }} + name: {{ template "shenyu.fullname" . }}-admin + labels: + "app.kubernetes.io/name": '{{ template "shenyu.name" . }}-admin' + "app.kubernetes.io/managed-by": "{{ .Release.Service }}" + "app.kubernetes.io/component": "shenyu-admin" + "app.kubernetes.io/instance": "{{ .Release.Name }}" +spec: + selector: + "app.kubernetes.io/component": "shenyu-admin" + "app.kubernetes.io/instance": "{{ .Release.Name }}" + type: NodePort + ports: + - protocol: TCP + port: 9095 + targetPort: 9095 + nodePort: {{ .Values.admin.nodePort }} +{{- end -}} diff --git a/charts/shenyu/templates/shenyu-bootstrap-deployment.yaml b/charts/shenyu/templates/shenyu-bootstrap-deployment.yaml new file mode 100644 index 0000000..a5664bf --- /dev/null +++ b/charts/shenyu/templates/shenyu-bootstrap-deployment.yaml @@ -0,0 +1,46 @@ +{{- if .Values.bootstrap.enabled -}} +# shenyu-bootstrap +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: {{ .Release.Namespace }} + name: {{ template "shenyu.fullname" . }}-bootstrap + labels: + "app.kubernetes.io/name": '{{ template "shenyu.name" . }}-bootstrap' + "app.kubernetes.io/managed-by": "{{ .Release.Service }}" + "app.kubernetes.io/component": "shenyu-bootstrap" + "app.kubernetes.io/instance": "{{ .Release.Name }}" +spec: + selector: + matchLabels: + "app.kubernetes.io/component": "shenyu-bootstrap" + "app.kubernetes.io/instance": "{{ .Release.Name }}" + replicas: {{ .Values.replicas }} + template: + metadata: + labels: + "app.kubernetes.io/name": '{{ template "shenyu.name" . }}-bootstrap' + "app.kubernetes.io/managed-by": "{{ .Release.Service }}" + "app.kubernetes.io/component": "shenyu-bootstrap" + "app.kubernetes.io/instance": "{{ .Release.Name }}" + spec: + volumes: + - name: shenyu-bootstrap-config + configMap: + name: {{ template "shenyu.fullname" . }}-configmap + items: + - key: application-local.yml + path: application-local.yml + containers: + - name: shenyu-bootstrap + image: {{ .Values.bootstrap.image }}:{{ required "A valid .Values.version entry required!" .Values.version }} + ports: + - containerPort: 9195 + env: + - name: TZ + value: Asia/Beijing + volumeMounts: + - name: shenyu-bootstrap-config + mountPath: /opt/shenyu-bootstrap/conf/application-local.yml + subPath: application-local.yml +{{- end -}} diff --git a/charts/shenyu/templates/shenyu-bootstrap-svc.yaml b/charts/shenyu/templates/shenyu-bootstrap-svc.yaml new file mode 100644 index 0000000..eecb17c --- /dev/null +++ b/charts/shenyu/templates/shenyu-bootstrap-svc.yaml @@ -0,0 +1,23 @@ +{{- if .Values.bootstrap.enabled -}} +# Now we only support NodePort mode +apiVersion: v1 +kind: Service +metadata: + namespace: {{ .Release.Namespace }} + name: {{ template "shenyu.fullname" . }}-bootstrap + labels: + "app.kubernetes.io/name": '{{ template "shenyu.name" .}}-bootstrap' + "app.kubernetes.io/managed-by": "{{ .Release.Service }}" + "app.kubernetes.io/component": "shenyu-bootstrap" + "app.kubernetes.io/instance": "{{ .Release.Name }}" +spec: + selector: + "app.kubernetes.io/component": "shenyu-bootstrap" + "app.kubernetes.io/instance": "{{ .Release.Name }}" + type: NodePort + ports: + - protocol: TCP + port: 9195 + targetPort: 9195 + nodePort: {{ .Values.bootstrap.nodePort }} +{{- end -}} diff --git a/charts/shenyu/templates/shenyu-endpoint.yaml b/charts/shenyu/templates/shenyu-endpoint.yaml new file mode 100644 index 0000000..46712d9 --- /dev/null +++ b/charts/shenyu/templates/shenyu-endpoint.yaml @@ -0,0 +1,26 @@ +{{- if .Values.admin.enabled -}} +{{- if eq .Values.dataSource.active "mysql" -}} +kind: Service +apiVersion: v1 +metadata: + name: {{ template "shenyu.fullname" . }}-mysql + namespace: {{ .Release.Namespace }} +spec: + ports: + - port: 3306 + name: mysql + targetPort: {{ required "database.mysql.port is required" .Values.dataSource.mysql.port }} +--- +kind: Endpoints +apiVersion: v1 +metadata: + name: {{ template "shenyu.fullname" . }}-mysql + namespace: {{ .Release.Namespace }} +subsets: +- addresses: + - ip: {{ required "database.mysql.ip is required" .Values.dataSource.mysql.ip }} + ports: + - port: {{ required "database.mysql.port is required" .Values.dataSource.mysql.port }} + name: mysql +{{- end -}} +{{- end -}} diff --git a/charts/shenyu/templates/shenyu-store.yaml b/charts/shenyu/templates/shenyu-store.yaml new file mode 100644 index 0000000..ea77314 --- /dev/null +++ b/charts/shenyu/templates/shenyu-store.yaml @@ -0,0 +1,18 @@ +{{- if .Values.admin.enabled -}} +{{- if eq .Values.dataSource.active "mysql" -}} +--- +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: {{ template "shenyu.fullname" . }}-pvc + namespace: {{ .Release.Namespace }} +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageClassName: {{ required ".Values.dataSource.mysql.storageClass is required" .Values.dataSource.mysql.storageClass}} +--- +{{- end -}} +{{- end -}} diff --git a/charts/shenyu/values.yaml b/charts/shenyu/values.yaml index 1ea3621..f410d2b 100644 --- a/charts/shenyu/values.yaml +++ b/charts/shenyu/values.yaml @@ -1,13 +1,29 @@ +version: 2.4.3 replicas: 1 - -label: shenyu -version: 2.4.2 admin: enabled: true image: apache/shenyu-admin - tag: 2.4.2 - + nodePort: 31095 bootstrap: enabled: true image: apache/shenyu-bootstrap - tag: 2.4.2 + nodePort: 31195 +dataSource: + # options: [h2, mysql] + active: h2 + # init database and tables + initEnabled: true + h2: + username: sa + password: sa + mysql: + ip: + port: 3306 + username: root + password: + # the existing storage class which stores mysql-connector.jar + storageClass: + # mysql driver class name + # mysql5 : com.mysql.jdbc.Driver + # mysql6-8 : com.mysql.cj.jdbc.Driver + driverClass: com.mysql.cj.Driver