From 4f9ee8164f01092fe6575f098d91aecbbcfb6f59 Mon Sep 17 00:00:00 2001 From: Julien Stroheker Date: Thu, 30 Jan 2020 01:01:06 -0500 Subject: [PATCH] Juliens/ingress and charts (#8) * add docs * add gitignore rules * update charts * update favicon --- .gitignore | 6 +++- charts/api/templates/NOTES.txt | 28 ++++++---------- charts/api/templates/deployment.yaml | 2 +- charts/client/templates/NOTES.txt | 28 ++++++---------- charts/client/templates/deployment.yaml | 2 +- charts/client/templates/ingress.yaml | 41 ------------------------ charts/client/values.yaml | 21 +++--------- charts/ingress/ingress.yaml | 22 +++++++++++++ charts/ingress/values.yaml | 13 ++++++++ charts/worker/templates/deployment.yaml | 2 +- cmd/web/public/favicon.ico | Bin 3870 -> 15406 bytes cmd/web/public/index.html | 5 +-- cmd/web/public/logo192.png | Bin 5347 -> 9734 bytes cmd/web/public/logo512.png | Bin 9664 -> 27212 bytes cmd/web/public/manifest.json | 4 +-- docs/deploy-aks-cluster.md | 20 ++++++++++++ docs/setup-k8s-cluster.md | 25 +++++++++++++++ 17 files changed, 116 insertions(+), 103 deletions(-) delete mode 100644 charts/client/templates/ingress.yaml create mode 100644 charts/ingress/ingress.yaml create mode 100644 charts/ingress/values.yaml create mode 100644 docs/deploy-aks-cluster.md create mode 100644 docs/setup-k8s-cluster.md diff --git a/.gitignore b/.gitignore index 9d62d53..676abc7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,8 @@ node_modules bin ihaq-* -.env \ No newline at end of file +.env +**.pub +juihaq +sshkey +id_rsa diff --git a/charts/api/templates/NOTES.txt b/charts/api/templates/NOTES.txt index dc76300..03fd657 100644 --- a/charts/api/templates/NOTES.txt +++ b/charts/api/templates/NOTES.txt @@ -1,21 +1,13 @@ -1. Get the application URL by running these commands: -{{- if .Values.ingress.enabled }} -{{- range $host := .Values.ingress.hosts }} - {{- range .paths }} - http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }} - {{- end }} -{{- end }} -{{- else if contains "NodePort" .Values.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "api.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. +################################################### +############## IHAQ API running ! ############## +################################################### +###### Logs : + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "api.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + kubectl logs $POD_NAME --namespace {{ .Release.Namespace }} +###### Service : +NOTE: It may take a few minutes for the LoadBalancer IP to be available. You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "api.fullname" . }}' export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "api.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") echo http://$SERVICE_IP:{{ .Values.service.port }} -{{- else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "api.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - echo "Visit http://127.0.0.1:8080 to use your application" - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:80 -{{- end }} +################################################### +################################################### diff --git a/charts/api/templates/deployment.yaml b/charts/api/templates/deployment.yaml index bde838d..46a4a42 100644 --- a/charts/api/templates/deployment.yaml +++ b/charts/api/templates/deployment.yaml @@ -27,7 +27,7 @@ spec: {{- toYaml .Values.securityContext | nindent 12 }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} - args: ["-redis-server-name", "api-redis-master"] + args: ["-redis-server-name", "ihaq-api-redis-master"] ports: - name: http containerPort: 8080 diff --git a/charts/client/templates/NOTES.txt b/charts/client/templates/NOTES.txt index 1b52f54..3fe1c4b 100644 --- a/charts/client/templates/NOTES.txt +++ b/charts/client/templates/NOTES.txt @@ -1,21 +1,13 @@ -1. Get the application URL by running these commands: -{{- if .Values.ingress.enabled }} -{{- range $host := .Values.ingress.hosts }} - {{- range .paths }} - http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }} - {{- end }} -{{- end }} -{{- else if contains "NodePort" .Values.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "client.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. +################################################### +############## IHAQ Client running ! ############## +################################################### +###### Logs : + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "client.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + kubectl logs $POD_NAME --namespace {{ .Release.Namespace }} +###### Service : +NOTE: It may take a few minutes for the LoadBalancer IP to be available. You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "client.fullname" . }}' export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "client.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") echo http://$SERVICE_IP:{{ .Values.service.port }} -{{- else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "client.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - echo "Visit http://127.0.0.1:8080 to use your application" - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:80 -{{- end }} +################################################### +################################################### diff --git a/charts/client/templates/deployment.yaml b/charts/client/templates/deployment.yaml index 8cd5412..03ce68f 100644 --- a/charts/client/templates/deployment.yaml +++ b/charts/client/templates/deployment.yaml @@ -27,7 +27,7 @@ spec: {{- toYaml .Values.securityContext | nindent 12 }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} - args: ["-i", "192.168.64.2:31834"] + args: ["-i", "api.ihaq.juin.me"] ports: - name: http containerPort: 80 diff --git a/charts/client/templates/ingress.yaml b/charts/client/templates/ingress.yaml deleted file mode 100644 index 20f8cf8..0000000 --- a/charts/client/templates/ingress.yaml +++ /dev/null @@ -1,41 +0,0 @@ -{{- if .Values.ingress.enabled -}} -{{- $fullName := include "client.fullname" . -}} -{{- $svcPort := .Values.service.port -}} -{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1beta1 -{{- else -}} -apiVersion: extensions/v1beta1 -{{- end }} -kind: Ingress -metadata: - name: {{ $fullName }} - labels: - {{- include "client.labels" . | nindent 4 }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: -{{- if .Values.ingress.tls }} - tls: - {{- range .Values.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} -{{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ .host | quote }} - http: - paths: - {{- range .paths }} - - path: {{ . }} - backend: - serviceName: {{ $fullName }} - servicePort: {{ $svcPort }} - {{- end }} - {{- end }} -{{- end }} diff --git a/charts/client/values.yaml b/charts/client/values.yaml index da00a88..7c7d95f 100644 --- a/charts/client/values.yaml +++ b/charts/client/values.yaml @@ -23,10 +23,12 @@ serviceAccount: # If not set and create is true, a name is generated using the fullname template name: -podSecurityContext: {} +podSecurityContext: + {} # fsGroup: 2000 -securityContext: {} +securityContext: + {} # capabilities: # drop: # - ALL @@ -35,22 +37,9 @@ securityContext: {} # runAsUser: 1000 service: - type: NodePort + type: LoadBalancer port: 80 -ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - hosts: - - host: chart-example.local - paths: [] - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - resources: # We usually recommend not to specify default resources and to leave this as a conscious # choice for the user. This also increases chances charts run on environments with little diff --git a/charts/ingress/ingress.yaml b/charts/ingress/ingress.yaml new file mode 100644 index 0000000..375aa70 --- /dev/null +++ b/charts/ingress/ingress.yaml @@ -0,0 +1,22 @@ +kind: Ingress +apiVersion: extensions/v1beta1 +metadata: + name: ingress + annotations: + kubernetes.io/ingress.class: traefik +spec: + rules: + - host: api.ihaq.juin.me + http: + paths: + - path: / + backend: + serviceName: ihaq-api + servicePort: 8080 + - host: ihaq.juin.me + http: + paths: + - path: / + backend: + serviceName: ihaq-client + servicePort: http diff --git a/charts/ingress/values.yaml b/charts/ingress/values.yaml new file mode 100644 index 0000000..1980e3a --- /dev/null +++ b/charts/ingress/values.yaml @@ -0,0 +1,13 @@ +dashboard: + enabled: true + domain: dashboard.juin.me + auth: + basic: + julien: $apr1$4hq6z3e8$nXeunzoTgvUfcHslqQPAY. # Generated by htpasswd tool +kubernetes: + namespaces: + - default + - kube-system + +rbac: + enabled: true diff --git a/charts/worker/templates/deployment.yaml b/charts/worker/templates/deployment.yaml index d4ad7fa..94092db 100644 --- a/charts/worker/templates/deployment.yaml +++ b/charts/worker/templates/deployment.yaml @@ -27,7 +27,7 @@ spec: {{- toYaml .Values.securityContext | nindent 12 }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} - args: ["-redis-server-name", "api-redis-master"] + args: ["-redis-server-name", "ihaq-api-redis-master"] resources: {{- toYaml .Values.resources | nindent 12 }} {{- with .Values.nodeSelector }} diff --git a/cmd/web/public/favicon.ico b/cmd/web/public/favicon.ico index a11777cc471a4344702741ab1c8a588998b1311a..385733140d82dc2f2dcd84759bdc10e3ae65c36a 100644 GIT binary patch literal 15406 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 literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/cmd/web/public/index.html b/cmd/web/public/index.html index a254ba4..cfd9be2 100644 --- a/cmd/web/public/index.html +++ b/cmd/web/public/index.html @@ -5,10 +5,7 @@ - + 5|7YyEcfyGxW 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/cmd/web/public/manifest.json b/cmd/web/public/manifest.json index 080d6c7..e58b92b 100644 --- a/cmd/web/public/manifest.json +++ b/cmd/web/public/manifest.json @@ -1,6 +1,6 @@ { - "short_name": "React App", - "name": "Create React App Sample", + "short_name": "IHAQ", + "name": "I Have A Question ?", "icons": [ { "src": "favicon.ico", diff --git a/docs/deploy-aks-cluster.md b/docs/deploy-aks-cluster.md new file mode 100644 index 0000000..59ac619 --- /dev/null +++ b/docs/deploy-aks-cluster.md @@ -0,0 +1,20 @@ +# Deploy an AKS Cluster + +> Install helm +> az aks install-cli + +```bash +export AKS_SUB_ID= +export AKS_SSH_KEY= +export AKS_RG_NAME= +export AKS_CLUSTER_NAME= + + +az login +az account -set $AKS_SUB_ID +az aks create -n $AKS_CLUSTER_NAME -g $AKS_RG_NAME --ssh-key-value $AKS_SSH_KEY + +az aks get-credentials -n $AKS_CLUSTER_NAME -g $AKS_RG_NAME + +helm repo add stable https://kubernetes-charts.storage.googleapis.com/ +``` diff --git a/docs/setup-k8s-cluster.md b/docs/setup-k8s-cluster.md new file mode 100644 index 0000000..6ca99af --- /dev/null +++ b/docs/setup-k8s-cluster.md @@ -0,0 +1,25 @@ +# Setup your Kubernetes Cluster + +## Deploy the app + +```bash +helm install ihaq-api charts/api --set redis.usePassword=false +helm install ihaq-worker charts/worker +helm install ihaq-client charts/client +``` + +Validate your deployment `kubectl get pods` + +## Deploy Ingress + +```bash +# Deploy Traefik +helm install traefik --namespace kube-system --values charts/ingress/values.yaml stable/traefik +# Apply Ingress rules +kubectl apply -f charts/ingress/ingress.yaml +``` + +Get the traefix External IP using `kubectl get svc -n kube-system` command and add the following DNS record to your zone : +- dashboard +- api.ihaq +- ihaq