From 20b498f76c77cbeba0ffd01aaac891544fa37abb Mon Sep 17 00:00:00 2001 From: Marco Vito Moscaritolo Date: Sat, 20 Jun 2020 21:37:46 +0200 Subject: [PATCH] Helm chart refactoring & automation (#31) * remove test data * Create helm chart using the suggested structure from helm3 * Fix minor naming consistency in Dockerfile * Move skaffold to use helm chart * improve skaffold configuration * Update chart name to use the naming convenction * update sample path * Update contribution guideline * Add helm chart validation rules * Add chart home since is a required field * Add linting action for helm charts * Add fixes to chart definition * fix timeout duration * Update kind cluster * test CI with minikube * Add MetalLB to test load balancer feature * Publish chart when merged on master * test publishing chart with fake tag * move charts dir * finalize charts publishing CI * reformat skaffold --- .github/workflows/dockerimage.yml | 20 +- .github/workflows/helmchart-release.yml | 24 ++ .github/workflows/helmchart.yml | 54 +++ CONTRIBUTING.md | 56 ++-- Dockerfile | 4 +- charts/caddy-ingress-controller/.helmignore | 23 ++ charts/caddy-ingress-controller/Chart.yaml | 15 + .../templates/_helpers.tpl | 63 ++++ .../templates/clusterrole.yaml | 6 +- .../templates/clusterrolebinding.yaml | 15 + .../templates/deployment.yaml | 81 +++++ .../templates/loadbalancer.yaml | 10 +- .../templates/serviceaccount.yaml | 13 + .../values.schema.json | 154 +++++++++ charts/caddy-ingress-controller/values.yaml | 68 ++++ ct.yaml | 10 + kubernetes/deploy/00_namespace.yaml | 4 - kubernetes/deploy/01_metallb.yaml | 307 ------------------ kubernetes/generated/clusterrole.yaml | 26 -- kubernetes/generated/clusterrolebinding.yaml | 13 - kubernetes/generated/configmap.yaml | 69 ---- kubernetes/generated/deployment.yaml | 80 ----- kubernetes/generated/loadbalancer.yaml | 20 -- kubernetes/generated/serviceaccount.yaml | 12 - .../helm/caddyingresscontroller/Chart.yaml | 4 - .../templates/clusterrolebinding.yaml | 15 - .../templates/deployment.yaml | 77 ----- .../templates/serviceaccount.yaml | 18 - .../helm/caddyingresscontroller/values.yaml | 36 -- .../sample/example-deployment1.yaml | 12 +- .../sample}/example-deployment2.yaml | 0 .../sample}/example-ingress.yaml | 36 +- .../sample/example-service1.yaml | 7 +- .../sample}/example-service2.yaml | 3 +- skaffold.yaml | 49 ++- 35 files changed, 624 insertions(+), 780 deletions(-) create mode 100644 .github/workflows/helmchart-release.yml create mode 100644 .github/workflows/helmchart.yml create mode 100644 charts/caddy-ingress-controller/.helmignore create mode 100644 charts/caddy-ingress-controller/Chart.yaml create mode 100644 charts/caddy-ingress-controller/templates/_helpers.tpl rename {kubernetes/helm/caddyingresscontroller => charts/caddy-ingress-controller}/templates/clusterrole.yaml (78%) create mode 100644 charts/caddy-ingress-controller/templates/clusterrolebinding.yaml create mode 100644 charts/caddy-ingress-controller/templates/deployment.yaml rename {kubernetes/helm/caddyingresscontroller => charts/caddy-ingress-controller}/templates/loadbalancer.yaml (64%) create mode 100644 charts/caddy-ingress-controller/templates/serviceaccount.yaml create mode 100644 charts/caddy-ingress-controller/values.schema.json create mode 100644 charts/caddy-ingress-controller/values.yaml create mode 100644 ct.yaml delete mode 100644 kubernetes/deploy/00_namespace.yaml delete mode 100644 kubernetes/deploy/01_metallb.yaml delete mode 100755 kubernetes/generated/clusterrole.yaml delete mode 100755 kubernetes/generated/clusterrolebinding.yaml delete mode 100644 kubernetes/generated/configmap.yaml delete mode 100755 kubernetes/generated/deployment.yaml delete mode 100755 kubernetes/generated/loadbalancer.yaml delete mode 100755 kubernetes/generated/serviceaccount.yaml delete mode 100644 kubernetes/helm/caddyingresscontroller/Chart.yaml delete mode 100644 kubernetes/helm/caddyingresscontroller/templates/clusterrolebinding.yaml delete mode 100644 kubernetes/helm/caddyingresscontroller/templates/deployment.yaml delete mode 100644 kubernetes/helm/caddyingresscontroller/templates/serviceaccount.yaml delete mode 100644 kubernetes/helm/caddyingresscontroller/values.yaml rename hack/test/example-deployment.yaml => kubernetes/sample/example-deployment1.yaml (67%) rename {hack/test => kubernetes/sample}/example-deployment2.yaml (100%) rename {hack/test => kubernetes/sample}/example-ingress.yaml (71%) rename hack/test/example-service.yaml => kubernetes/sample/example-service1.yaml (63%) rename {hack/test => kubernetes/sample}/example-service2.yaml (82%) diff --git a/.github/workflows/dockerimage.yml b/.github/workflows/dockerimage.yml index d32f780..a4f16f5 100644 --- a/.github/workflows/dockerimage.yml +++ b/.github/workflows/dockerimage.yml @@ -2,19 +2,19 @@ name: Docker Image CI on: push: - branches: [ master ] + branches: [master] jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Build and push Docker images - uses: docker/build-push-action@v1.1.0 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - repository: caddy/ingress - tag_with_ref: true - tag_with_sha: true + - uses: actions/checkout@v2 + - name: Build and push Docker images + uses: docker/build-push-action@v1.1.0 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + repository: caddy/ingress + tag_with_ref: true + tag_with_sha: true diff --git a/.github/workflows/helmchart-release.yml b/.github/workflows/helmchart-release.yml new file mode 100644 index 0000000..7afd7a3 --- /dev/null +++ b/.github/workflows/helmchart-release.yml @@ -0,0 +1,24 @@ +name: Release Charts + +on: + push: + branches: [master] + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v1 + + - name: Configure Git + run: | + git config user.name "$GITHUB_ACTOR" + git config user.email "$GITHUB_ACTOR@users.noreply.github.com" + + - name: Run chart-releaser + uses: helm/chart-releaser-action@master + with: + charts_dir: charts + env: + CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/helmchart.yml b/.github/workflows/helmchart.yml new file mode 100644 index 0000000..72f5973 --- /dev/null +++ b/.github/workflows/helmchart.yml @@ -0,0 +1,54 @@ +name: Lint and Test Charts + +on: pull_request + +jobs: + lint-test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Fetch history + run: git fetch --prune --unshallow + + - name: Run chart-testing (lint) + id: lint + uses: helm/chart-testing-action@v1.0.0-rc.1 + with: + image: quay.io/helmpack/chart-testing:v3.0.0-rc.1 + command: lint + + - name: Create kind cluster + uses: helm/kind-action@v1.0.0-rc.1 + with: + version: "v0.8.1" + # Only build a kind cluster if there are chart changes to test. + if: steps.lint.outputs.changed == 'true' + + - name: Install MetalLB to allow LoadBalancer services + run: | + kubectl create ns metallb-system + kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.9.3/manifests/metallb.yaml + cat <> cluster.yml +cat < 33 - runAsUser: 0 - runAsGroup: 0 - ports: - - name: http - containerPort: 80 - - name: https - containerPort: 443 - - name: metrics - containerPort: 9090 - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - # args: - # - -tls - # - -tls-use-staging - # - -email=test@test.com diff --git a/kubernetes/generated/loadbalancer.yaml b/kubernetes/generated/loadbalancer.yaml deleted file mode 100755 index d32b7e1..0000000 --- a/kubernetes/generated/loadbalancer.yaml +++ /dev/null @@ -1,20 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: caddy-ingress-controller - namespace: caddy-system - labels: - app: caddy-ingress-controller -spec: - ports: - - name: http - port: 80 - protocol: TCP - targetPort: http - - name: https - port: 443 - protocol: TCP - targetPort: https - selector: - app: caddy-ingress-controller - type: "LoadBalancer" \ No newline at end of file diff --git a/kubernetes/generated/serviceaccount.yaml b/kubernetes/generated/serviceaccount.yaml deleted file mode 100755 index 62f8203..0000000 --- a/kubernetes/generated/serviceaccount.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - namespace: caddy-system - labels: - app: caddy-ingress-controller - chart: "caddy-ingress-controller-v0.1.0" - release: "release-name" - heritage: "Tiller" - version: v0.1.0 - - name: caddy-ingress-controller \ No newline at end of file diff --git a/kubernetes/helm/caddyingresscontroller/Chart.yaml b/kubernetes/helm/caddyingresscontroller/Chart.yaml deleted file mode 100644 index d579f81..0000000 --- a/kubernetes/helm/caddyingresscontroller/Chart.yaml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: v1 -description: A helm chart for the Caddy Kubernetes ingress controller -name: caddy-ingress-controller -version: v0.1.0 diff --git a/kubernetes/helm/caddyingresscontroller/templates/clusterrolebinding.yaml b/kubernetes/helm/caddyingresscontroller/templates/clusterrolebinding.yaml deleted file mode 100644 index 9e2f8d9..0000000 --- a/kubernetes/helm/caddyingresscontroller/templates/clusterrolebinding.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if .Values.caddyingresscontroller.rbac.create }} -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ .Values.name }}-role-binding - namespace: {{ .Release.Namespace }} -roleRef: - kind: ClusterRole - name: {{ .Values.name }}-role - apiGroup: rbac.authorization.k8s.io -subjects: -- kind: ServiceAccount - name: {{ .Values.serviceAccountName }} - namespace: {{ .Release.Namespace }} -{{- end }} \ No newline at end of file diff --git a/kubernetes/helm/caddyingresscontroller/templates/deployment.yaml b/kubernetes/helm/caddyingresscontroller/templates/deployment.yaml deleted file mode 100644 index 1e9474b..0000000 --- a/kubernetes/helm/caddyingresscontroller/templates/deployment.yaml +++ /dev/null @@ -1,77 +0,0 @@ -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: {{ .Values.name }} - namespace: {{ .Release.Namespace }} - labels: - app: {{ .Values.name }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - release: {{ .Release.Name | quote }} - heritage: {{ .Release.Service | quote }} -{{- if .Values.caddyingresscontroller.deployment.labels }} -{{ toYaml .Values.caddyingresscontroller.deployment.labels | indent 4 }} -{{- end }} -spec: - replicas: 1 - revisionHistoryLimit: 2 - selector: - matchLabels: - app: {{ .Values.name }} - release: {{ .Release.Name | quote }} - template: - metadata: - labels: - app: {{ .Values.name }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - release: {{ .Release.Name | quote }} - heritage: {{ .Release.Service | quote }} -{{- if .Values.caddyingresscontroller.deployment.labels }} -{{ toYaml .Values.caddyingresscontroller.deployment.labels | indent 8 }} -{{- end }} - spec: - serviceAccountName: {{ .Values.serviceAccountName }} - containers: - - name: {{ .Values.name }} - image: "{{ .Values.caddyingresscontroller.image.name }}:{{ .Values.caddyingresscontroller.image.tag }}" - imagePullPolicy: {{ .Values.caddyingresscontroller.image.pullPolicy }} - securityContext: - allowPrivilegeEscalation: true - capabilities: - drop: - - ALL - add: - - NET_BIND_SERVICE - # www-data -> 33 - runAsUser: 0 - runAsGroup: 0 - ports: - - name: http - containerPort: 80 - {{- if .Values.minikube }} - hostPort: 80 # optional, required if running in minikube - {{- end }} - - name: https - containerPort: 443 - {{- if .Values.minikube }} - hostPort: 443 # optional, required if running in minikube - {{- end }} - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - volumeMounts: - - name: tmp - mountPath: /tmp - args: - {{- if .Values.autotls }} - - -tls - - -email={{ .Values.email }} - {{- end }} - volumes: - - name: tmp - emptyDir: {} diff --git a/kubernetes/helm/caddyingresscontroller/templates/serviceaccount.yaml b/kubernetes/helm/caddyingresscontroller/templates/serviceaccount.yaml deleted file mode 100644 index 15ece1a..0000000 --- a/kubernetes/helm/caddyingresscontroller/templates/serviceaccount.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if .Values.caddyingresscontroller.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - namespace: {{ .Release.Namespace }} - labels: - app: {{ .Values.name }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - release: {{ .Release.Name | quote }} - heritage: {{ .Release.Service | quote }} -{{- if .Values.caddyingresscontroller.serviceAccount.labels }} -{{ toYaml .Values.caddyingresscontroller.serviceAccount.labels | indent 4 }} -{{- end }} -{{- if .Values.caddyingresscontroller.matchLabels }} -{{ toYaml .Values.caddyingresscontroller.matchLabels | indent 4 }} -{{- end }} - name: {{ .Values.serviceAccountName }} -{{- end }} \ No newline at end of file diff --git a/kubernetes/helm/caddyingresscontroller/values.yaml b/kubernetes/helm/caddyingresscontroller/values.yaml deleted file mode 100644 index c3d15f0..0000000 --- a/kubernetes/helm/caddyingresscontroller/values.yaml +++ /dev/null @@ -1,36 +0,0 @@ -# Default values for the caddy ingress controller. -kubernetes: - host: https://kubernetes.default - -caddyingresscontroller: - tolerations: {} - deployment: - labels: - version: "v0.1.0" - config: - labels: - version: "v0.1.0" - rbac: - create: true - # Service account config for the agent pods - serviceAccount: - # Specifies whether a ServiceAccount should be created - create: true - labels: - version: "v0.1.0" - # The name of the ServiceAccount to use. - # If not set and create is true, a name is generated using the fullname template - name: caddy-ingress-controller - image: - name: "gcr.io/danny-239313/ingresscontroller" - tag: "v0.1.0" - pullPolicy: IfNotPresent - -name: "caddy-ingress-controller" -serviceAccountName: "caddy-ingress-controller" -minikube: false - -# If setting autotls the following email value must be set -# to an email address that you manage -autotls: false -email: "" \ No newline at end of file diff --git a/hack/test/example-deployment.yaml b/kubernetes/sample/example-deployment1.yaml similarity index 67% rename from hack/test/example-deployment.yaml rename to kubernetes/sample/example-deployment1.yaml index aef7177..2576c2c 100644 --- a/hack/test/example-deployment.yaml +++ b/kubernetes/sample/example-deployment1.yaml @@ -1,24 +1,24 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: example + name: example1 labels: - app: example + app: example1 spec: replicas: 1 selector: matchLabels: - app: example + app: example1 template: metadata: labels: - app: example + app: example1 spec: containers: - name: httpecho image: hashicorp/http-echo args: - "-listen=:8080" - - "-text=hello world" + - "-text=hello world 1" ports: - - containerPort: 8080 \ No newline at end of file + - containerPort: 8080 diff --git a/hack/test/example-deployment2.yaml b/kubernetes/sample/example-deployment2.yaml similarity index 100% rename from hack/test/example-deployment2.yaml rename to kubernetes/sample/example-deployment2.yaml diff --git a/hack/test/example-ingress.yaml b/kubernetes/sample/example-ingress.yaml similarity index 71% rename from hack/test/example-ingress.yaml rename to kubernetes/sample/example-ingress.yaml index e673ab4..c4bbe85 100644 --- a/hack/test/example-ingress.yaml +++ b/kubernetes/sample/example-ingress.yaml @@ -6,29 +6,29 @@ metadata: kubernetes.io/ingress.class: caddy spec: rules: - - host: example1.MYDOMAIN.TDL + - host: example1.kubernetes.localhost http: paths: - - path: /hello2 - backend: - serviceName: example2 - servicePort: 8080 - - path: /hello - backend: - serviceName: example - servicePort: 8080 - - host: example2.MYDOMAIN.TDL - http: - paths: - - path: /hello2 - backend: - serviceName: example2 - servicePort: 8080 - path: /hello1 backend: - serviceName: example + serviceName: example1 + servicePort: 8080 + - path: /hello2 + backend: + serviceName: example2 + servicePort: 8080 + - host: example2.kubernetes.localhost + http: + paths: + - path: /hello1 + backend: + serviceName: example1 + servicePort: 8080 + - path: /hello2 + backend: + serviceName: example2 servicePort: 8080 # tls: -# - secretName: ssl-example2.MYDOMAIN.TDL +# - secretName: ssl-example2.kubernetes.localhost # hosts: # - example2.caddy.dev diff --git a/hack/test/example-service.yaml b/kubernetes/sample/example-service1.yaml similarity index 63% rename from hack/test/example-service.yaml rename to kubernetes/sample/example-service1.yaml index 3b93905..4d59b75 100644 --- a/hack/test/example-service.yaml +++ b/kubernetes/sample/example-service1.yaml @@ -1,12 +1,13 @@ kind: Service apiVersion: v1 metadata: - name: example + name: example1 spec: type: ClusterIP selector: - app: example + app: example1 ports: - - protocol: TCP + - name: http + protocol: TCP port: 8080 targetPort: 8080 diff --git a/hack/test/example-service2.yaml b/kubernetes/sample/example-service2.yaml similarity index 82% rename from hack/test/example-service2.yaml rename to kubernetes/sample/example-service2.yaml index b635d78..3247795 100644 --- a/hack/test/example-service2.yaml +++ b/kubernetes/sample/example-service2.yaml @@ -7,6 +7,7 @@ spec: selector: app: example2 ports: - - protocol: TCP + - name: http + protocol: TCP port: 8080 targetPort: 8080 diff --git a/skaffold.yaml b/skaffold.yaml index 9c0450d..deba087 100644 --- a/skaffold.yaml +++ b/skaffold.yaml @@ -1,33 +1,30 @@ -apiVersion: skaffold/v2alpha1 +apiVersion: skaffold/v2beta3 kind: Config +metadata: + name: caddy-ingress-controller build: artifacts: - - image: docker.io/MYACCOUNT/caddy-ingress-controller + - image: caddy/ingress deploy: + helm: + releases: + - name: caddy-ingress-development + namespace: caddy-system + chartPath: charts/caddy-ingress-controller + recreatePods: true kubectl: manifests: - - kubernetes/deploy/00_namespace.yaml - - kubernetes/deploy/01_metallb.yaml - - hack/test/example-deployment.yaml - - hack/test/example-ingress.yaml - - hack/test/example-deployment2.yaml - - hack/test/example-service2.yaml - - hack/test/example-service.yaml - - kubernetes/generated/clusterrole.yaml - - kubernetes/generated/clusterrolebinding.yaml - - kubernetes/generated/deployment.yaml - - kubernetes/generated/serviceaccount.yaml - - kubernetes/generated/loadbalancer.yaml + - kubernetes/sample/*.yaml portForward: -- resourceType: service - resourceName: caddy-ingress-controller - namespace: caddy-system - address: 0.0.0.0 - port: 80 - localPort: 80 -- resourceType: service - resourceName: caddy-ingress-controller - namespace: caddy-system - address: 0.0.0.0 - port: 443 - localPort: 443 + - resourceType: service + resourceName: caddy-ingress-development-caddy-ingress-controller + namespace: caddy-system + address: 0.0.0.0 + port: 80 + localPort: 8080 + - resourceType: service + resourceName: caddy-ingress-development-caddy-ingress-controller + namespace: caddy-system + address: 0.0.0.0 + port: 443 + localPort: 8443