Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save maurobaraldi/1fcfcfbb6bc907565f45bc10fccf9371 to your computer and use it in GitHub Desktop.
Save maurobaraldi/1fcfcfbb6bc907565f45bc10fccf9371 to your computer and use it in GitHub Desktop.

Revisions

  1. @ivanbrennan ivanbrennan revised this gist Dec 9, 2018. 5 changed files with 106 additions and 78 deletions.
    24 changes: 9 additions & 15 deletions postgres-in-minikube.sh
    Original file line number Diff line number Diff line change
    @@ -1,10 +1,5 @@
    # this setup doesn't include a persistent volume, just what's needed
    # to test connectivity from inside and outside the cluster.

    # create resources
    kubectl --context=minikube create -f ./postgres-secret.yaml
    kubectl --context=minikube create -f ./postgres-statefulset.yaml
    kubectl --context=minikube create -f ./postgres-service.yaml
    # create/update resources
    kubectl --context=minikube apply -f ./postgres.yaml

    # In order for the service to reach the statefulset, the following should
    # be true:
    @@ -15,14 +10,14 @@ kubectl --context=minikube create -f ./postgres-service.yaml
    # ...

    # test the connection from outside the cluster
    url=$(minikube service postgres --url \
    --format={{.IP}}:{{.Port}})
    psql --host=${url%:*} --port=${url#*:} --username=postgres --dbname=postgres \
    --command='SELECT refobjid FROM pg_depend LIMIT 1'
    psql --host=$(minikube ip) \
    --port=$(minikube service postgres --url --format={{.Port}}) \
    --username=postgres \
    --dbname=postgres

    # test the connection from within the cluster
    url=$(kubectl --context=minikube get service postgres \
    --output=jsonpath='{.spec.clusterIP}:{.spec.ports[0].port}')
    --output=jsonpath='{.spec.clusterIP}:{.spec.ports[0].port}')
    kubectl --context=minikube run pgbox --image=postgres:9.6 \
    --rm -it --restart=Never -- \
    bash -c "read &&
    @@ -31,6 +26,5 @@ kubectl --context=minikube run pgbox --image=postgres:9.6 \
    --command='SELECT refobjid FROM pg_depend LIMIT 1'"

    # remove resources
    kubectl --context=minikube delete service postgres
    kubectl --context=minikube delete statefulset postgres
    kubectl --context=minikube delete secret postgres
    kubectl --context=minikube delete -f ./postgres.yaml --ignore-not-found
    # Data will survive the above operation, and be available next time you revive postgres.
    8 changes: 0 additions & 8 deletions postgres-secret.yaml
    Original file line number Diff line number Diff line change
    @@ -1,8 +0,0 @@
    apiVersion: v1
    kind: Secret
    metadata:
    name: postgres
    type: Opaque
    data:
    POSTGRES_USER: cG9zdGdyZXM= # printf postgres | base64
    POSTGRES_PASSWORD: cGFzc3dvcmQ= # printf password | base64
    17 changes: 0 additions & 17 deletions postgres-service.yaml
    Original file line number Diff line number Diff line change
    @@ -1,17 +0,0 @@
    apiVersion: v1
    kind: Service
    metadata:
    name: postgres
    labels:
    app: postgres
    role: service
    spec:
    selector:
    app: postgres
    role: service
    type: NodePort
    ports:
    - name: postgres
    port: 5432
    targetPort: 5432
    protocol: TCP
    38 changes: 0 additions & 38 deletions postgres-statefulset.yaml
    Original file line number Diff line number Diff line change
    @@ -1,38 +0,0 @@
    apiVersion: apps/v1beta2
    kind: StatefulSet
    metadata:
    name: postgres
    labels:
    app: postgres
    role: service
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: postgres
    role: service
    serviceName: postgres
    template:
    metadata:
    labels:
    app: postgres
    role: service
    spec:
    containers:
    - name: postgres
    image: postgres:9.6
    env:
    - name: POSTGRES_USER
    valueFrom:
    secretKeyRef:
    key: POSTGRES_USER
    name: postgres
    - name: POSTGRES_PASSWORD
    valueFrom:
    secretKeyRef:
    key: POSTGRES_PASSWORD
    name: postgres
    ports:
    - containerPort: 5432
    name: postgres
    protocol: TCP
    97 changes: 97 additions & 0 deletions postgres.yaml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,97 @@
    apiVersion: v1
    kind: PersistentVolume
    metadata:
    name: postgres
    spec:
    accessModes:
    - ReadWriteOnce
    capacity:
    storage: 2Gi
    hostPath:
    path: /data/postgres
    storageClassName: standard
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: postgres
    spec:
    accessModes:
    - ReadWriteOnce
    resources:
    requests:
    storage: 2Gi
    volumeName: postgres
    ---
    apiVersion: v1
    kind: Secret
    metadata:
    name: postgres
    type: Opaque
    data:
    POSTGRES_USER: cG9zdGdyZXM= # printf postgres | base64
    POSTGRES_PASSWORD: cGFzc3dvcmQ= # printf password | base64
    ---
    apiVersion: apps/v1beta2
    kind: StatefulSet
    metadata:
    name: postgres
    labels:
    app: postgres
    role: service
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: postgres
    role: service
    serviceName: postgres
    template:
    metadata:
    labels:
    app: postgres
    role: service
    spec:
    containers:
    - name: postgres
    image: postgres:9.6
    env:
    - name: POSTGRES_USER
    valueFrom:
    secretKeyRef:
    key: POSTGRES_USER
    name: postgres
    - name: POSTGRES_PASSWORD
    valueFrom:
    secretKeyRef:
    key: POSTGRES_PASSWORD
    name: postgres
    ports:
    - containerPort: 5432
    name: postgres
    protocol: TCP
    volumeMounts:
    - name: postgres
    mountPath: /var/lib/postgresql/data
    volumes:
    - name: postgres
    persistentVolumeClaim:
    claimName: postgres
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: postgres
    labels:
    app: postgres
    role: service
    spec:
    selector:
    app: postgres
    role: service
    type: NodePort
    ports:
    - name: postgres
    port: 5432
    targetPort: 5432
    protocol: TCP
  2. @ivanbrennan ivanbrennan created this gist Dec 8, 2018.
    36 changes: 36 additions & 0 deletions postgres-in-minikube.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,36 @@
    # this setup doesn't include a persistent volume, just what's needed
    # to test connectivity from inside and outside the cluster.

    # create resources
    kubectl --context=minikube create -f ./postgres-secret.yaml
    kubectl --context=minikube create -f ./postgres-statefulset.yaml
    kubectl --context=minikube create -f ./postgres-service.yaml

    # In order for the service to reach the statefulset, the following should
    # be true:
    # statefulset.spec.selector.matchLabels.app == service.spec.selector.app
    # statefulset.spec.selector.matchLabels.role == service.spec.selector.role

    # give the server some time to start up
    # ...

    # test the connection from outside the cluster
    url=$(minikube service postgres --url \
    --format={{.IP}}:{{.Port}})
    psql --host=${url%:*} --port=${url#*:} --username=postgres --dbname=postgres \
    --command='SELECT refobjid FROM pg_depend LIMIT 1'

    # test the connection from within the cluster
    url=$(kubectl --context=minikube get service postgres \
    --output=jsonpath='{.spec.clusterIP}:{.spec.ports[0].port}')
    kubectl --context=minikube run pgbox --image=postgres:9.6 \
    --rm -it --restart=Never -- \
    bash -c "read &&
    psql --host=${url%:*} --port=${url#*:} \
    --username=postgres --dbname=postgres \
    --command='SELECT refobjid FROM pg_depend LIMIT 1'"

    # remove resources
    kubectl --context=minikube delete service postgres
    kubectl --context=minikube delete statefulset postgres
    kubectl --context=minikube delete secret postgres
    8 changes: 8 additions & 0 deletions postgres-secret.yaml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,8 @@
    apiVersion: v1
    kind: Secret
    metadata:
    name: postgres
    type: Opaque
    data:
    POSTGRES_USER: cG9zdGdyZXM= # printf postgres | base64
    POSTGRES_PASSWORD: cGFzc3dvcmQ= # printf password | base64
    17 changes: 17 additions & 0 deletions postgres-service.yaml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,17 @@
    apiVersion: v1
    kind: Service
    metadata:
    name: postgres
    labels:
    app: postgres
    role: service
    spec:
    selector:
    app: postgres
    role: service
    type: NodePort
    ports:
    - name: postgres
    port: 5432
    targetPort: 5432
    protocol: TCP
    38 changes: 38 additions & 0 deletions postgres-statefulset.yaml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,38 @@
    apiVersion: apps/v1beta2
    kind: StatefulSet
    metadata:
    name: postgres
    labels:
    app: postgres
    role: service
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: postgres
    role: service
    serviceName: postgres
    template:
    metadata:
    labels:
    app: postgres
    role: service
    spec:
    containers:
    - name: postgres
    image: postgres:9.6
    env:
    - name: POSTGRES_USER
    valueFrom:
    secretKeyRef:
    key: POSTGRES_USER
    name: postgres
    - name: POSTGRES_PASSWORD
    valueFrom:
    secretKeyRef:
    key: POSTGRES_PASSWORD
    name: postgres
    ports:
    - containerPort: 5432
    name: postgres
    protocol: TCP