From 2230cc9b98ded252ef5de3e534eb0074e9724483 Mon Sep 17 00:00:00 2001 From: Joakim Olsson Date: Tue, 14 Sep 2021 08:32:10 +0200 Subject: [PATCH] feat: initial commit --- .gitignore | 1 + README.md | 49 ++++++++++++++++ kind.yaml | 38 +++++++++++++ kustomization.yaml | 7 +++ mysql.yaml | 60 ++++++++++++++++++++ postgres.yaml | 62 ++++++++++++++++++++ rabbitmq.yaml | 138 +++++++++++++++++++++++++++++++++++++++++++++ setup | 13 +++++ 8 files changed, 368 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 kind.yaml create mode 100644 kustomization.yaml create mode 100644 mysql.yaml create mode 100644 postgres.yaml create mode 100644 rabbitmq.yaml create mode 100755 setup diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1269488 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +data diff --git a/README.md b/README.md new file mode 100644 index 0000000..5ea7f07 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# Run Unbound environment in local K8S + +This is a setup for running the Unbound environment in K8S using [KinD](https://kind.sigs.k8s.io/) + +## Prerequisites + +- [KinD](https://kind.sigs.k8s.io/docs/user/quick-start/#installation) +- [kubectl](https://kubernetes.io/docs/tasks/tools/) + +## Creating the cluster + +Just run the following: + +```shell +./setup +``` + +Wait for the cluster to be ready. The K8S context should be set automatically. Check what's been deployed by running: + +```shell +kubectl get pod -A +``` + +## Stopping/starting the cluster + +If you need to stop the cluster to be able to use the exposed ports for other things, run: + +```shell +docker stop unbound-control-plane +``` + +To start it again: + +```shell +docker start unbound-control-plane +``` + +## Removing the cluster + +To remove the cluster completely, run: + +```shell +kind delete cluster --name unbound +``` + +## Cleaning up retained data + +The setup stores data for containers in the `data`-directory. To start from scratch, stop the cluster, empty the directory +and start the cluster again. diff --git a/kind.yaml b/kind.yaml new file mode 100644 index 0000000..05402e1 --- /dev/null +++ b/kind.yaml @@ -0,0 +1,38 @@ +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +name: unbound +nodes: +- role: control-plane + kubeadmConfigPatches: + - | + kind: InitConfiguration + nodeRegistration: + kubeletExtraArgs: + node-labels: "ingress-ready=true" + - | + kind: ClusterConfiguration + apiServer: + extraArgs: + service-node-port-range: 3000-39999 + extraPortMappings: + - containerPort: 80 + hostPort: 80 + protocol: TCP + - containerPort: 443 + hostPort: 443 + protocol: TCP + - containerPort: 5672 + hostPort: 5672 + protocol: TCP + - containerPort: 15672 + hostPort: 15672 + protocol: TCP + - containerPort: 3306 + hostPort: 3306 + protocol: TCP + - containerPort: 5432 + hostPort: 5432 + protocol: TCP + extraMounts: + - hostPath: ./data + containerPath: /data diff --git a/kustomization.yaml b/kustomization.yaml new file mode 100644 index 0000000..8bfea7c --- /dev/null +++ b/kustomization.yaml @@ -0,0 +1,7 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - mysql.yaml + - postgres.yaml + - rabbitmq.yaml + - https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml diff --git a/mysql.yaml b/mysql.yaml new file mode 100644 index 0000000..ca1cd94 --- /dev/null +++ b/mysql.yaml @@ -0,0 +1,60 @@ +apiVersion: v1 +kind: Secret +metadata: + name: mysql +stringData: + DB_HOST: mysql + DB_PORT: "3306" + DB_NAME: mysql + DB_USER: mysql + DB_PASSWORD: mysql +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mysql +spec: + selector: + matchLabels: + app: mysql + strategy: + type: Recreate + template: + metadata: + labels: + app: mysql + spec: + containers: + - image: mysql:8 + name: mysql + env: + - name: MYSQL_ROOT_PASSWORD + value: password + ports: + - containerPort: 3306 + name: mysql + volumeMounts: + - name: data + mountPath: /var/lib/mysql + volumes: + - name: data + hostPath: + path: /data/mysql +--- + +apiVersion: v1 +kind: Service +metadata: + labels: + app: mysql + name: mysql +spec: + ports: + - name: mysql + port: 3306 + nodePort: 3306 + protocol: TCP + selector: + app: mysql + sessionAffinity: None + type: NodePort diff --git a/postgres.yaml b/postgres.yaml new file mode 100644 index 0000000..e0715ab --- /dev/null +++ b/postgres.yaml @@ -0,0 +1,62 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: shared-postgres +data: + DB_HOST: "postgres-postgresql" + DB_PORT: "5432" + DB_USER: "postgres" +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: postgres +spec: + selector: + matchLabels: + app: postgres + replicas: 1 + template: + metadata: + labels: + app: postgres + spec: + containers: + - name: postgres + image: postgres:12.0 + imagePullPolicy: "IfNotPresent" + resources: + requests: + memory: 200Mi + limits: + memory: 300Mi + ports: + - containerPort: 5432 + env: + - name: POSTGRES_DB + value: postgres + - name: POSTGRES_USER + value: postgres + - name: POSTGRES_PASSWORD + value: postgres + volumeMounts: + - name: data + mountPath: /var/lib/postgresql/data + volumes: + - name: data + hostPath: + path: /data/postgres +--- +apiVersion: v1 +kind: Service +metadata: + name: postgres + labels: + app: postgres +spec: + ports: + - port: 5432 + nodePort: 5432 + selector: + app: postgres + type: NodePort diff --git a/rabbitmq.yaml b/rabbitmq.yaml new file mode 100644 index 0000000..e91429a --- /dev/null +++ b/rabbitmq.yaml @@ -0,0 +1,138 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: shared-rabbitmq +data: + RABBITMQ_SERVERS: rabbitmq + RABBITMQ_VHOST: / + RABBITMQ_USERNAME: user +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: rabbitmq + release: rabbitmq + name: rabbitmq +spec: + replicas: 1 + selector: + matchLabels: + app: rabbitmq + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate + template: + metadata: + labels: + app: rabbitmq + spec: + containers: + - env: + - name: RABBITMQ_DEFAULT_USER + value: user + - name: RABBITMQ_DEFAULT_PASS + value: password + - name: RABBITMQ_NODE_PORT_NUMBER + value: "5672" + - name: RABBITMQ_NODE_TYPE + value: stats + - name: RABBITMQ_NODENAME + value: rabbit@localhost + - name: RABBITMQ_CLUSTER_NODE_NAME + - name: RABBITMQ_DEFAULT_VHOST + value: / + - name: RABBITMQ_MANAGER_PORT_NUMBER + value: "15672" + - name: RABBITMQ_DISK_FREE_LIMIT + value: '"8GiB"' + image: sparetimecoders/rabbitmq:latest + imagePullPolicy: Always + livenessProbe: + exec: + command: + - rabbitmqctl + - status + failureThreshold: 6 + initialDelaySeconds: 120 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + name: rabbitmq + ports: + - containerPort: 4369 + name: epmd + protocol: TCP + - containerPort: 5672 + name: amqp + protocol: TCP + - containerPort: 25672 + name: dist + protocol: TCP + - containerPort: 15672 + name: stats + protocol: TCP + readinessProbe: + exec: + command: + - rabbitmqctl + - status + failureThreshold: 3 + initialDelaySeconds: 10 + periodSeconds: 5 + successThreshold: 1 + timeoutSeconds: 3 + resources: + requests: + cpu: 100m + memory: 256Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - name: data + mountPath: /var/lib/rabbitmq + volumes: + - name: data + hostPath: + path: /data/rabbitmq + dnsPolicy: ClusterFirst + restartPolicy: Always + +--- + +apiVersion: v1 +kind: Service +metadata: + labels: + app: rabbitmq + release: rabbitmq + name: rabbitmq +spec: + externalTrafficPolicy: Cluster + ports: + - name: epmd + nodePort: 31799 + port: 4369 + protocol: TCP + targetPort: epmd + - name: amqp + nodePort: 5672 + port: 5672 + protocol: TCP + targetPort: amqp + - name: dist + nodePort: 32687 + port: 25672 + protocol: TCP + targetPort: dist + - name: stats + nodePort: 15672 + port: 15672 + protocol: TCP + targetPort: stats + selector: + app: rabbitmq + sessionAffinity: None + type: NodePort diff --git a/setup b/setup new file mode 100755 index 0000000..62ddf3a --- /dev/null +++ b/setup @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +kind create cluster --config kind.yaml --wait 10m + +kubectl create secret docker-registry gitlab \ + --docker-server=registry.gitlab.com \ + --docker-username=gitlab \ + --docker-password="${GITLAB_TOKEN}" \ + --docker-email=gitlab@paidit.se + +kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "gitlab"}]}' + +kubectl apply -k .