diff --git a/kubernetes/70-idx-storage-db.yml b/kubernetes/70-idx-storage-db.yml new file mode 100644 index 0000000..a952e20 --- /dev/null +++ b/kubernetes/70-idx-storage-db.yml @@ -0,0 +1,131 @@ +--- +apiVersion: v1 +kind: PersistentVolume +metadata: + name: idx-storage-db-pv +spec: + capacity: + storage: 10Gi + volumeMode: Filesystem + accessModes: + - ReadWriteOnce + persistentVolumeReclaimPolicy: Delete + storageClassName: idx-storage-db + local: + path: /srv/softwareheritage-kube/dev/idx-storage-db + nodeAffinity: + required: + nodeSelectorTerms: + - matchExpressions: + # TODO adapt for your needs + - key: kubernetes.io/os + operator: In + values: + - linux +--- +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: idx-storage-db-pvc +spec: + accessModes: + - ReadWriteOnce + storageClassName: idx-storage-db + resources: + requests: + storage: 10Gi +--- +## TODO Change this to your real postgresql password +apiVersion: v1 +kind: Secret +metadata: + name: idx-storage-db +type: Opaque +# data: +# POSTGRES_PASSWORD: | +# "echo 'strong password' | base64" +stringData: + POSTGRES_PASSWORD: swh +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: idx-storage-db +data: + # property-like keys; each key maps to a simple value + POSTGRES_USER: swh + POSTGRES_DB: swh +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: idx-storage-db + labels: + app: idx-storage-db +spec: + replicas: 1 + selector: + matchLabels: + app: idx-storage-db + template: + metadata: + labels: + app: idx-storage-db + spec: + containers: + - name: idx-storage-db + image: postgres:13.0 + imagePullPolicy: Always + ports: + - containerPort: 5432 + args: + - "-c" + - "shared_buffers=256MB" + - "-c" + - "effective_cache_size=256MB" + - "-c" + - "random_page_cost=1.5" + - "-c" + - "max_wal_size=256MB" + env: + - name: POSTGRES_USER + valueFrom: + configMapKeyRef: + name: idx-storage-db + key: POSTGRES_USER + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: idx-storage-db + key: POSTGRES_PASSWORD + - name: POSTGRES_DB + valueFrom: + configMapKeyRef: + name: idx-storage-db + key: POSTGRES_DB + volumeMounts: + - mountPath: "/var/lib/postgresql/data" + name: idx-storage-db-pvc + resources: + requests: + memory: "256Mi" + cpu: "100m" + limits: + memory: "512Mi" + cpu: "250m" + volumes: + - name: idx-storage-db-pvc + persistentVolumeClaim: + claimName: idx-storage-db-pvc +--- +apiVersion: v1 +kind: Service +metadata: + name: idx-storage-db +spec: + type: ClusterIP + selector: + app: idx-storage-db + ports: + - port: 5432 + targetPort: 5432 diff --git a/kubernetes/Readme.md b/kubernetes/Readme.md index ce25465..fa7e9cd 100644 --- a/kubernetes/Readme.md +++ b/kubernetes/Readme.md @@ -1,113 +1,113 @@ ## Prerequisite ### Directories ``` -sudo mkdir -p /srv/softwareheritage-kube/dev/{objects,storage-db,scheduler-db,kafka,web-db,prometheus,zookeeper/data,zookeeper/datalog,grafana,elasticsearch,redis,registry} +sudo mkdir -p /srv/softwareheritage-kube/dev/{objects,storage-db,scheduler-db,kafka,web-db,prometheus,zookeeper/data,zookeeper/datalog,grafana,elasticsearch,redis,registry,idx-storage-db} sudo chown 1000:1000 /srv/softwareheritage-kube/dev/{objects,elasticsearch} sudo chown -R 999:999 /srv/softwareheritage-kube/dev/*-db sudo chown 472:0 /srv/softwareheritage-kube/dev/grafana sudo chown nobody:nogroup /srv/softwareheritage-kube/dev/prometheus ``` ### Registry - Add the following line on your `/etc/hosts` file. It's needed to be able to push the image to it from docker ``` 127.0.0.1 registry.default ``` - Start the registry in kubernetes ``` kubectl apply -f kubernetes/registry/00-registry.yml ``` If you are using k3s, the registry must be declared on the `/etc/rancher/k3s/registries.yaml` as it's insecure: ``` mirrors: registry.default: endpoint: - "http://registry.default/v2/" ``` ## Build the base image ``` cd docker docker build --no-cache -t swh/stack . docker tag swh/stack:latest registry.default/swh/stack:latest docker push registry.default/swh/stack:latest ``` ## Development To access the services, they must be declared on the `/etc/hosts` file: ``` 127.0.0.1 objstorage.default storage.default webapp.default scheduler.default rabbitmq.default grafana.default prometheus.default counters.default registry-ui ``` ### Skaffold To start the development environment using skaffold, use the following command: ``` skaffold --default-repo registry.default dev ``` It will build the images, deploy them on the local registry and start the services. It will monitor the projects to detect the changes and restart the containers when needed ## Basic commands Hint: Use tabulation to ease finding out new commands - List pods: ``` $ kubectl get pods NAME READY STATUS RESTARTS AGE registry-deployment-7595868dc8-657ps 1/1 Running 0 46m objstorage-8587d58b68-76jbn 1/1 Running 0 12m ``` - List services: ``` $ kubectl get services objstorage NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE objstorage ClusterIP 10.43.185.191 5003/TCP 17m ``` - Check service is responding: ``` $ curl http://$(kubectl get services objstorage -o jsonpath='{.spec.clusterIP}'):5003 SWH Objstorage API server% $ curl http://$(kubectl get services scheduler -o jsonpath='{.spec.clusterIP}'):5008 Software Heritage scheduler RPC server

You have reached the Software Heritage scheduler RPC server.
See its documentation and API for more information

% ``` - Force a pod to redeploy itself ``` kubectl delete pod storage-db-- ``` - Clean up registry due to too much disk space used ``` kubectl exec -ti $(kubectl get pods --no-headers -l app=registry | grep -i running | awk '{print $1}) -- /bin/registry garbage-collect -m /etc/docker/registry/config.yml ``` diff --git a/skaffold.yaml b/skaffold.yaml index dda0a40..ccbd3ad 100644 --- a/skaffold.yaml +++ b/skaffold.yaml @@ -1,88 +1,89 @@ apiVersion: skaffold/v2beta13 kind: Config metadata: name: swh-environment build: local: useBuildkit: true concurrency: 2 artifacts: - image: swh/stack-base context: docker docker: dockerfile: Dockerfile - image: swh/objstorage docker: dockerfile: Dockerfile.objstorage requires: - image: swh/stack-base alias: BASE - image: swh/storage docker: dockerfile: Dockerfile.storage requires: - image: swh/stack-base alias: BASE - image: swh/scheduler docker: dockerfile: Dockerfile.scheduler requires: - image: swh/stack-base alias: BASE - image: swh/webapp docker: dockerfile: Dockerfile.webapp requires: - image: swh/stack-base alias: BASE - image: swh/loaders docker: dockerfile: Dockerfile.loaders requires: - image: swh/stack-base alias: BASE - image: swh/listers docker: dockerfile: Dockerfile.listers requires: - image: swh/stack-base alias: BASE - image: swh/grafana docker: dockerfile: Dockerfile.grafana - image: swh/search docker: dockerfile: Dockerfile.search requires: - image: swh/stack-base alias: BASE - image: swh/counters docker: dockerfile: Dockerfile.counters requires: - image: swh/stack-base alias: BASE deploy: kubectl: manifests: - kubernetes/01-journal.yml - kubernetes/02-monitoring.yml - kubernetes/05-storage-db.yml - kubernetes/10-objstorage.yml - kubernetes/11-storage.yml - kubernetes/15-scheduler-db.yml - kubernetes/16-rabbitmq.yml - kubernetes/20-scheduler.yml - kubernetes/21-scheduler-runner.yml - kubernetes/22-scheduler-listener.yml - kubernetes/23-scheduler-journal-client.yml - kubernetes/29-web-db.yml - kubernetes/30-webapp.yml - kubernetes/40-loaders.yml - kubernetes/45-listers.yml - kubernetes/50-elasticsearch.yml - kubernetes/55-search.yml - kubernetes/56-search-journal-client.yml - kubernetes/60-redis.yml - kubernetes/61-counters.yml - kubernetes/62-counters-journal-client.yml + - kubernetes/70-idx-storage-db.yml