commit 2230cc9b98ded252ef5de3e534eb0074e9724483 Author: Joakim Olsson Date: Tue Sep 14 08:32:10 2021 +0200 feat: initial commit 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 .