diff --git a/backend-services/feed-service/Dockerfile b/backend-services/feed-service/Dockerfile index 816c12e152289dfb1258fb580208b575cd30b082..4419eff213d22670ded3935632f14109f7bebe20 100644 --- a/backend-services/feed-service/Dockerfile +++ b/backend-services/feed-service/Dockerfile @@ -19,4 +19,4 @@ RUN unzip -d svc target/universal/feed-service-1.0.0.zip \ EXPOSE 9000 # Delete the RUNNING_PID fle that incorrectly tells Play there is already an instance running -CMD rm -f svc/RUNNING_PID && svc/bin/start +CMD rm -f svc/RUNNING_PID && svc/bin/start -Dplay.http.secret.key=$PLAY_HTTP_SECRET_KEY diff --git a/backend-services/feed-service/conf/application.conf b/backend-services/feed-service/conf/application.conf index 9d3697fda5e7b0fe38d862498d1901870c20fc22..7fd8d366175550e4ab708622b3fec0937f273a21 100644 --- a/backend-services/feed-service/conf/application.conf +++ b/backend-services/feed-service/conf/application.conf @@ -24,13 +24,8 @@ user.service.uri = "http://localhost:9000/" # Application Secret Key - https://www.playframework.com/documentation/2.8.x/ApplicationSecret play.http.secret.key="DUvbrcM2AbuB7oXboI1x`ZI_?1Iou>/ch2@lFXfrvVkWlHuA848y?GyR/0i2Ma:A" -# Disable CSRF -play.filters.disabled += play.filters.csrf.CSRFFilter - -# Enable and configure CORS -play.filters.enabled += play.filters.cors.CORSFilter -# play.filters.cors.allowedOrigins = ["localhost:9000"] -# play.filters.cors.allowedHttpMethods = ["GET", "POST"] +# Disable all default filters +play.filters.enabled=[] # Use a custom error handler to not return HTML views play.http.errorHandler = "models.CustomErrorHandler" diff --git a/docker-compose.yml b/docker-compose.yml index 143c052c6b32477b0c76fd5b483f1f1dc24434e8..3cd75caa960512a6cf43ded34a848f2f1d161989 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,12 +13,14 @@ services: build: context: "./backend-services/feed-service" dockerfile: Dockerfile + image: europe-west2-docker.pkg.dev/daily-384822/daily-repo/feed-service:v1 restart: unless-stopped ports: - "9000" environment: - MONGO_URI=mongodb://feed-mongo:27017/ - JWT_PRIVATE_KEY=yB/uX5KdyjHN9P34IE49HxAcrlQ4gfvpVJEzGbo5E/I= + - PLAY_HTTP_SECRET_KEY=DUvbrcM2AbuB7oXboI1x`ZI_?1Iou>/ch2@lFXfrvVkWlHuA848y?GyR/0i2Ma:A - FRIEND_SERVICE_URI=http://friend-service:9000/ - ENABLE_QUESTION_DB_SEEDING=true @@ -26,6 +28,7 @@ services: build: context: "./backend-services/user-service" dockerfile: Dockerfile + image: europe-west2-docker.pkg.dev/daily-384822/daily-repo/user-service:v1 restart: unless-stopped ports: - "9000" @@ -39,6 +42,7 @@ services: build: context: "./backend-services/friend-service" dockerfile: Dockerfile + image: europe-west2-docker.pkg.dev/daily-384822/daily-repo/friend-service:v1 restart: unless-stopped ports: - "9000" @@ -52,6 +56,7 @@ services: build: context: "./backend-services/comment-service-2" dockerfile: Dockerfile + image: europe-west2-docker.pkg.dev/daily-384822/daily-repo/comment-service:v1 restart: unless-stopped ports: - "9000" @@ -65,6 +70,7 @@ services: build: context: "./daily-thought-frontend" dockerfile: Dockerfile + image: europe-west2-docker.pkg.dev/daily-384822/daily-repo/frontend-service:v1 restart: unless-stopped ports: - "3000" diff --git a/gcloud/Deployment Steps.md b/gcloud/Deployment Steps.md new file mode 100644 index 0000000000000000000000000000000000000000..27844444f2b8b6c2a595eca319f41d7ccea425ec --- /dev/null +++ b/gcloud/Deployment Steps.md @@ -0,0 +1,178 @@ +## Artifact Registry + +Our dockerised services have to be accessible from our Google Cloud project. To do this we use Google's (Artifact Registry)[https://cloud.google.com/artifact-registry] Service. This allows us to create a repository where we can store our own repository Docker images. + +#### Creating the Repository + +We first need to create the repository: + +`gcloud artifacts repositories create daily-repo --repository-format=docker --location=europe-west2 --description="Docker repository"` + +#### Service Account Permission + +We now need to create a service account with read-only access to the repository we made. This is so that our container instances and other resources can pull images from it. + + gcloud artifacts repositories add-iam-policy-binding daily-repo \ + --location=europe-west2 + --member=serviceAccount:438503002799-compute@developer.gserviceaccount.com + --role="roles/artifactregistry.reader" + +## Pushing Docker Images + +Now that we have our own repository, we can push our custom images we defined in our (docker-compose.yml)[docker-compose.yml] file. + +- The **image** tag contains the repository to push the image to, as well as the name and tag of the image. + +First, we need to configure the Docker command-line tool to authenticate with the Artifact Registry: + +` gcloud auth configure-docker europe-west2-docker.pkg.dev` + +We can now push the images to our repository: + +`docker compose push` + +After the command has finished, you should see all our images on (Google Cloud)[https://console.cloud.google.com/artifacts/docker/daily-384822/europe-west2/daily-repo?project=daily-384822]. + +<br /> + +## Kubernetes Cluster + +Kubernetes is an _amazing_ open-source container orchestration system for automating software deployment, scaling, and management. We use it to manage our services!# + +First, we need to create a cluster: + +`gcloud container clusters create-auto daily-cluster --region=europe-west2` + +Verify the cluster is connected: + +`gcloud container clusters get-credentials daily-cluster --region europe-west2` + +The output should be: _kubeconfig entry generated for daily-cluster_. If so, you are now connected to the cluster! + +<br /> + +**We can now move on to deploying our images!!! :D** + +<br /> + +## Mongo Volumes + +### Storage Class + +Here we create a storage class that defines what properties the **default-mongo** class should have. + +`kubectl apply -f gcloud/mongo-pv/mongo-storage-class.yaml` + +You can check the current storage classes: + +`kubectl get storageclasses` + +### Creating Mongo Persistent Volumes + +We need a storage system for the Mongo instances. For this, we use (Persistent Volumes)[https://kubernetes.io/docs/concepts/storage/persistent-volumes/] + +- When we make a claim, Kubernetes automatically makes the Persistent Volume for us based on the Storage Class defined. + +#### User Mongo Volume + +`kubectl apply -f gcloud/user-mongo/user-mongo-pvc.yaml` + +#### Friend Mongo Volume + +`kubectl apply -f gcloud/friend-mongo/friend-mongo-pvc.yaml` + +#### Feed Mongo Volume + +`kubectl apply -f gcloud/feed-mongo/feed-mongo-pvc.yaml` + +#### Comment Mongo Volume + +`kubectl apply -f gcloud/comment-mongo/comment-mongo-pvc.yaml` + +### Checking Result + +You can check the current Persistent Volumes in our cluster: +`kubectl get pv` + +As well as the current Persistent Volume Claims in our cluster: +`kubectl get pvc` + +<br /> + +## Deploying Mongo Services + +Now that we have the storage for our Mongo instances, we can deploy the services. + +- The deployment defines that the instance should use our created volumes. + +#### User Mongo Service + +`kubectl apply -f gcloud/user-mongo/user-mongo-deployment.yaml` + +#### Friend Mongo Service + +`kubectl apply -f gcloud/friend-mongo/friend-mongo-deployment.yaml` + +#### Feed Mongo Service + +`kubectl apply -f gcloud/feed-mongo/feed-mongo-deployment.yaml` + +#### Comment Mongo Service + +`kubectl apply -f gcloud/comment-mongo/comment-mongo-deployment.yaml` + +<br /> + +## Deploying Main Services + +For our main services, we first define our Horizontal Autoscaler, then we deploy our service. + +### Frontend + +`kubectl apply -f gcloud/frontend-service/frontend-service-autoscaler.yaml` +`kubectl apply -f gcloud/frontend-service/frontend-service-deployment.yaml` + +### User Backend + +`kubectl apply -f gcloud/user-service/user-service-autoscaler.yaml` +`kubectl apply -f gcloud/user-service/user-service-deployment.yaml` + +### Friend Backend + +`kubectl apply -f gcloud/friend-service/friend-service-autoscaler.yaml` +`kubectl apply -f gcloud/friend-service/friend-service-deployment.yaml` + +### Feed Backend + +`kubectl apply -f gcloud/feed-service/feed-service-autoscaler.yaml` +`kubectl apply -f gcloud/feed-service/feed-service-deployment.yaml` + +### Comment Backend + +`kubectl apply -f gcloud/comment-service/comment-service-autoscaler.yaml` +`kubectl apply -f gcloud/comment-service/comment-service-deployment.yaml` + +<br /> + +## NGINX Service + +Thanks to our smort teammate Matt, we have a NGINX service. We use this service as a reverse proxy. What this means is that none of our services are exposed. Instead, we expose our NGINX service, and it manages our routes to services! + +### ConfigMap + +In Kubernetes, a ConfigMap is a key-value store that stores configuration data for your application. The ConfigMap can then be mounted as a volume inside a container, allowing the configuration data to be read by the application running inside the container. + +So we define the config in the (nginx.conf)[gcloud\nginx-service\nginx.conf] file and deploy it: + +`kubectl create configmap nginx-conf --from-file=gcloud/nginx-service/nginx.conf` + +### Deploying NGINX Service + +Before deploying the NGINX service, we define our Horizontal Autoscaler for it: +`kubectl apply -f gcloud/nginx-service/nginx-service-autoscaler.yaml` + +We can now deploy NGINX as a service: + +`kubectl apply -f gcloud/nginx-service/nginx-service-deployment.yaml` + +What is different about this service, is that it is on a public endpoint! diff --git a/gcloud/comment-mongo/comment-mongo-deployment.yaml b/gcloud/comment-mongo/comment-mongo-deployment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3534555e8243728c12c16bca607c75f53d9fd9d0 --- /dev/null +++ b/gcloud/comment-mongo/comment-mongo-deployment.yaml @@ -0,0 +1,40 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: comment-mongo-deployment +spec: + selector: + matchLabels: + app: comment-mongo + replicas: 1 + template: + metadata: + labels: + app: comment-mongo + spec: + containers: + - name: comment-mongo + image: mongo + ports: + - containerPort: 27017 + volumeMounts: + - name: mongo-data + mountPath: /data/db + volumes: + - name: mongo-data + persistentVolumeClaim: + claimName: comment-mongo-volume +--- +apiVersion: v1 +kind: Service +metadata: + name: comment-mongo-service +spec: + selector: + app: comment-mongo + ports: + - name: mongo-port + protocol: TCP + port: 27020 + targetPort: 27017 + type: ClusterIP diff --git a/gcloud/comment-mongo/comment-mongo-pvc.yaml b/gcloud/comment-mongo/comment-mongo-pvc.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a7c98d5de8a4b4444da45873ef233effbfc6d57c --- /dev/null +++ b/gcloud/comment-mongo/comment-mongo-pvc.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: comment-mongo-volume +spec: + storageClassName: default-mongo + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/gcloud/comment-service/comment-service-autoscaler.yaml b/gcloud/comment-service/comment-service-autoscaler.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4be63e516aa8027aa0108f6983e5d05b4106cadc --- /dev/null +++ b/gcloud/comment-service/comment-service-autoscaler.yaml @@ -0,0 +1,12 @@ +apiVersion: autoscaling/v1 +kind: HorizontalPodAutoscaler +metadata: + name: comment-backend-deployment-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: comment-backend-deployment + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 80 diff --git a/gcloud/comment-service/comment-service-deployment.yaml b/gcloud/comment-service/comment-service-deployment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e71598114c477118beec7badda59d44a5f85615b --- /dev/null +++ b/gcloud/comment-service/comment-service-deployment.yaml @@ -0,0 +1,41 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: comment-backend-deployment +spec: + selector: + matchLabels: + app: comment-backend + replicas: 1 + template: + metadata: + labels: + app: comment-backend + spec: + containers: + - name: comment-service + image: europe-west2-docker.pkg.dev/daily-384822/daily-repo/comment-service:v1 + ports: + - containerPort: 9000 + env: + - name: MONGO_HOST + value: "comment-mongo-service" + - name: MONGO_PORT + value: "27020" + - name: MONGO_DBNAME + value: "comments" + - name: JWT_PRIVATE_KEY + value: "yB/uX5KdyjHN9P34IE49HxAcrlQ4gfvpVJEzGbo5E/I=" +--- +apiVersion: v1 +kind: Service +metadata: + name: comment-backend-service +spec: + selector: + app: comment-backend + ports: + - name: http + port: 9000 + targetPort: 9000 + type: ClusterIP diff --git a/gcloud/feed-mongo/feed-mongo-deployment.yaml b/gcloud/feed-mongo/feed-mongo-deployment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..62948b4c598c831d113e7b391b0f6bb9eee0c768 --- /dev/null +++ b/gcloud/feed-mongo/feed-mongo-deployment.yaml @@ -0,0 +1,40 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: feed-mongo-deployment +spec: + selector: + matchLabels: + app: feed-mongo + replicas: 1 + template: + metadata: + labels: + app: feed-mongo + spec: + containers: + - name: feed-mongo + image: mongo + ports: + - containerPort: 27017 + volumeMounts: + - name: mongo-data + mountPath: /data/db + volumes: + - name: mongo-data + persistentVolumeClaim: + claimName: feed-mongo-volume +--- +apiVersion: v1 +kind: Service +metadata: + name: feed-mongo-service +spec: + selector: + app: feed-mongo + ports: + - name: mongo-port + protocol: TCP + port: 27017 + targetPort: 27017 + type: ClusterIP diff --git a/gcloud/feed-mongo/feed-mongo-pvc.yaml b/gcloud/feed-mongo/feed-mongo-pvc.yaml new file mode 100644 index 0000000000000000000000000000000000000000..923445b86c1231fdb9bc9881912829bcee74bc0f --- /dev/null +++ b/gcloud/feed-mongo/feed-mongo-pvc.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: feed-mongo-volume +spec: + storageClassName: default-mongo + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/gcloud/feed-service/feed-service-autoscaler.yaml b/gcloud/feed-service/feed-service-autoscaler.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8bfa24c20778922fd0ef71bc08dee2152c757f21 --- /dev/null +++ b/gcloud/feed-service/feed-service-autoscaler.yaml @@ -0,0 +1,12 @@ +apiVersion: autoscaling/v1 +kind: HorizontalPodAutoscaler +metadata: + name: feed-backend-deployment-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: feed-backend-deployment + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 80 diff --git a/gcloud/feed-service/feed-service-deployment.yaml b/gcloud/feed-service/feed-service-deployment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..59e7f2c9d4aaf1d151b8897582a50e8b53cf5e6e --- /dev/null +++ b/gcloud/feed-service/feed-service-deployment.yaml @@ -0,0 +1,43 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: feed-backend-deployment +spec: + selector: + matchLabels: + app: feed-backend + replicas: 1 + template: + metadata: + labels: + app: feed-backend + spec: + containers: + - name: feed-service + image: europe-west2-docker.pkg.dev/daily-384822/daily-repo/feed-service:v1 + ports: + - containerPort: 9000 + env: + - name: MONGO_URI + value: "mongodb://feed-mongo-service:27017/" + - name: FRIEND_SERVICE_URI + value: "http://friend-backend-service:9000/" + - name: ENABLE_QUESTION_DB_SEEDING + value: "true" + - name: JWT_PRIVATE_KEY + value: "yB/uX5KdyjHN9P34IE49HxAcrlQ4gfvpVJEzGbo5E/I=" + - name: PLAY_HTTP_SECRET_KEY + value: "DUvbrcM2AbuB7oXboI1x`ZI_?1Iou>/ch2@lFXfrvVkWlHuA848y?GyR/0i2Ma:A" +--- +apiVersion: v1 +kind: Service +metadata: + name: feed-backend-service +spec: + selector: + app: feed-backend + ports: + - name: http + port: 9000 + targetPort: 9000 + type: ClusterIP diff --git a/gcloud/friend-mongo/friend-mongo-deployment.yaml b/gcloud/friend-mongo/friend-mongo-deployment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..80380df902b98443f4b19ca812ae08716606b5f3 --- /dev/null +++ b/gcloud/friend-mongo/friend-mongo-deployment.yaml @@ -0,0 +1,40 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: friend-mongo-deployment +spec: + selector: + matchLabels: + app: friend-mongo + replicas: 1 + template: + metadata: + labels: + app: friend-mongo + spec: + containers: + - name: friend-mongo + image: mongo + ports: + - containerPort: 27017 + volumeMounts: + - name: mongo-data + mountPath: /data/db + volumes: + - name: mongo-data + persistentVolumeClaim: + claimName: friend-mongo-volume +--- +apiVersion: v1 +kind: Service +metadata: + name: friend-mongo-service +spec: + selector: + app: friend-mongo + ports: + - name: mongo-port + protocol: TCP + port: 27019 + targetPort: 27017 + type: ClusterIP diff --git a/gcloud/friend-mongo/friend-mongo-pvc.yaml b/gcloud/friend-mongo/friend-mongo-pvc.yaml new file mode 100644 index 0000000000000000000000000000000000000000..cb237340bc4f19982d43c0bebd1460b0c4033ca1 --- /dev/null +++ b/gcloud/friend-mongo/friend-mongo-pvc.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: friend-mongo-volume +spec: + storageClassName: default-mongo + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/gcloud/friend-service/friend-service-autoscaler.yaml b/gcloud/friend-service/friend-service-autoscaler.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1aab299fad3ee6bc82ecaa870f3430ee6966dc21 --- /dev/null +++ b/gcloud/friend-service/friend-service-autoscaler.yaml @@ -0,0 +1,12 @@ +apiVersion: autoscaling/v1 +kind: HorizontalPodAutoscaler +metadata: + name: friend-backend-deployment-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: friend-backend-deployment + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 80 diff --git a/gcloud/friend-service/friend-service-deployment.yaml b/gcloud/friend-service/friend-service-deployment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a6ab027fb41da3594ed09693ce1e3340b77822f5 --- /dev/null +++ b/gcloud/friend-service/friend-service-deployment.yaml @@ -0,0 +1,41 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: friend-backend-deployment +spec: + selector: + matchLabels: + app: friend-backend + replicas: 1 + template: + metadata: + labels: + app: friend-backend + spec: + containers: + - name: friend-service + image: europe-west2-docker.pkg.dev/daily-384822/daily-repo/friend-service:v1 + ports: + - containerPort: 9000 + env: + - name: MONGO_HOST + value: "friend-mongo-service" + - name: MONGO_PORT + value: "27019" + - name: MONGO_DBNAME + value: "friends" + - name: JWT_PRIVATE_KEY + value: "yB/uX5KdyjHN9P34IE49HxAcrlQ4gfvpVJEzGbo5E/I=" +--- +apiVersion: v1 +kind: Service +metadata: + name: friend-backend-service +spec: + selector: + app: friend-backend + ports: + - name: http + port: 9000 + targetPort: 9000 + type: ClusterIP diff --git a/gcloud/frontend-service/frontend-service-autoscaler.yaml b/gcloud/frontend-service/frontend-service-autoscaler.yaml new file mode 100644 index 0000000000000000000000000000000000000000..63215ac671198d7f35b595161c30f59c1d43bbc5 --- /dev/null +++ b/gcloud/frontend-service/frontend-service-autoscaler.yaml @@ -0,0 +1,12 @@ +apiVersion: autoscaling/v1 +kind: HorizontalPodAutoscaler +metadata: + name: frontend-deployment-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: frontend-deployment + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 80 diff --git a/gcloud/frontend-service/frontend-service-deployment.yaml b/gcloud/frontend-service/frontend-service-deployment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..bceeac19dd6ba3e627e7f2196b3fbf1e4d6eecc0 --- /dev/null +++ b/gcloud/frontend-service/frontend-service-deployment.yaml @@ -0,0 +1,32 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontend-deployment +spec: + selector: + matchLabels: + app: frontend + replicas: 1 + template: + metadata: + labels: + app: frontend + spec: + containers: + - name: frontend-service + image: europe-west2-docker.pkg.dev/daily-384822/daily-repo/frontend-service:v1 + ports: + - containerPort: 3000 +--- +apiVersion: v1 +kind: Service +metadata: + name: frontend-service +spec: + selector: + app: frontend + ports: + - name: http + port: 80 + targetPort: 3000 + type: ClusterIP diff --git a/gcloud/mongo-pv/mongo-pvc.yaml b/gcloud/mongo-pv/mongo-pvc.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c3fb9eb50c6c580d02ec7ba0b6296d43a5b019e0 --- /dev/null +++ b/gcloud/mongo-pv/mongo-pvc.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: mongo-volume +spec: + storageClassName: default-mongo + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/gcloud/mongo-pv/mongo-storage-class.yaml b/gcloud/mongo-pv/mongo-storage-class.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fc36a95609f8095a1bce2ed9a5257b01d1789682 --- /dev/null +++ b/gcloud/mongo-pv/mongo-storage-class.yaml @@ -0,0 +1,12 @@ +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: default-mongo +provisioner: kubernetes.io/gce-pd +volumeBindingMode: Immediate +allowVolumeExpansion: true +reclaimPolicy: Delete +parameters: + type: pd-standard + fstype: ext4 + replication-type: none diff --git a/gcloud/nginx-service/nginx-service-autoscaler.yaml b/gcloud/nginx-service/nginx-service-autoscaler.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3ab00c760ec2dc2c223fe1eac554e9767eda66be --- /dev/null +++ b/gcloud/nginx-service/nginx-service-autoscaler.yaml @@ -0,0 +1,12 @@ +apiVersion: autoscaling/v1 +kind: HorizontalPodAutoscaler +metadata: + name: nginx-deployment-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: nginx-deployment + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 80 diff --git a/gcloud/nginx-service/nginx-service-deployment.yaml b/gcloud/nginx-service/nginx-service-deployment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f470cb7333dd621a2d5b06002b3207c36a7c699e --- /dev/null +++ b/gcloud/nginx-service/nginx-service-deployment.yaml @@ -0,0 +1,39 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment +spec: + selector: + matchLabels: + app: nginx + replicas: 1 + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx:latest + volumeMounts: + - name: nginx-conf + mountPath: /etc/nginx/conf.d + ports: + - containerPort: 80 + volumes: + - name: nginx-conf + configMap: + name: nginx-conf +--- +apiVersion: v1 +kind: Service +metadata: + name: nginx-service +spec: + selector: + app: nginx + ports: + - name: http + port: 80 + targetPort: 80 + type: LoadBalancer diff --git a/gcloud/nginx-service/nginx.conf b/gcloud/nginx-service/nginx.conf new file mode 100644 index 0000000000000000000000000000000000000000..eda407a6c1a0e8562aa0493508c49a543da177f9 --- /dev/null +++ b/gcloud/nginx-service/nginx.conf @@ -0,0 +1,68 @@ +upstream frontend-service { + server frontend-service:80; +} + +upstream user-service { + server user-backend-service:9000; +} + +upstream friend-service { + server friend-backend-service:9000; +} + +upstream feed-service { + server feed-backend-service:9000; +} + +upstream comment-service { + server comment-backend-service:9000; +} + +server { + listen 80; + + location / { + rewrite ^//(.*) /$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://frontend-service/; + } + + location /api/user-service/ { + rewrite ^/user-service/(.*) /$1 break; # works for both /server1 and /server1/ + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://user-service/; + } + + location /api/friend-service/ { + rewrite ^/friend-service/(.*) /$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://friend-service/; + } + + location /api/feed-service/ { + rewrite ^/feed-service/(.*) /$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://feed-service/; + } + + location /api/comment-service/ { + rewrite ^/comment-service/(.*) /$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://comment-service/; + } +} diff --git a/gcloud/user-mongo/user-mongo-deployment.yaml b/gcloud/user-mongo/user-mongo-deployment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f9cae8254e78aeaa1bfd2745289d8ab4edfdeb21 --- /dev/null +++ b/gcloud/user-mongo/user-mongo-deployment.yaml @@ -0,0 +1,40 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: user-mongo-deployment +spec: + selector: + matchLabels: + app: user-mongo + replicas: 1 + template: + metadata: + labels: + app: user-mongo + spec: + containers: + - name: user-mongo + image: mongo + ports: + - containerPort: 27017 + volumeMounts: + - name: mongo-data + mountPath: /data/db + volumes: + - name: mongo-data + persistentVolumeClaim: + claimName: user-mongo-volume +--- +apiVersion: v1 +kind: Service +metadata: + name: user-mongo-service +spec: + selector: + app: user-mongo + ports: + - name: mongo-port + protocol: TCP + port: 27018 + targetPort: 27017 + type: ClusterIP diff --git a/gcloud/user-mongo/user-mongo-pvc.yaml b/gcloud/user-mongo/user-mongo-pvc.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fdee261f9cce78711b836871b02cc274680f3639 --- /dev/null +++ b/gcloud/user-mongo/user-mongo-pvc.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: user-mongo-volume +spec: + storageClassName: default-mongo + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/gcloud/user-service/user-service-autoscaler.yaml b/gcloud/user-service/user-service-autoscaler.yaml new file mode 100644 index 0000000000000000000000000000000000000000..dd8c74071460ddd7ec5132c054841fd58baec03b --- /dev/null +++ b/gcloud/user-service/user-service-autoscaler.yaml @@ -0,0 +1,12 @@ +apiVersion: autoscaling/v1 +kind: HorizontalPodAutoscaler +metadata: + name: user-backend-deployment-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: user-backend-deployment + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 80 diff --git a/gcloud/user-service/user-service-deployment.yaml b/gcloud/user-service/user-service-deployment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..0eda05aa68c63a7c722180b7d608df53ef7f758c --- /dev/null +++ b/gcloud/user-service/user-service-deployment.yaml @@ -0,0 +1,41 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: user-backend-deployment +spec: + selector: + matchLabels: + app: user-backend + replicas: 1 + template: + metadata: + labels: + app: user-backend + spec: + containers: + - name: user-service + image: europe-west2-docker.pkg.dev/daily-384822/daily-repo/user-service:v1 + ports: + - containerPort: 9000 + env: + - name: MONGO_URI + value: "mongodb://user-mongo-service:27018/userdb" + - name: ENABLE_USER_DB_SEEDING + value: "true" + - name: SEEDED_ADMIN_PASSWORD + value: "doesntreallymatter" + - name: JWT_PRIVATE_KEY + value: "yB/uX5KdyjHN9P34IE49HxAcrlQ4gfvpVJEzGbo5E/I=" +--- +apiVersion: v1 +kind: Service +metadata: + name: user-backend-service +spec: + selector: + app: user-backend + ports: + - name: http + port: 9000 + targetPort: 9000 + type: ClusterIP