4

We're running traefik on k8s, I'm able to build routes to http services but not TCP, e.g. I'm able to get the whoami service but not the postgres service.

Initial setups:

I installed postgres via standard helm chart

I installed traefik via it's helm chart as well.

This is working:

apiVersion: apps/v1
metadata:
  name: whoami
  namespace: shared
  labels:
    app: containous
    name: whoami

spec:
  replicas: 2
  selector:
    matchLabels:
      app: containous
      task: whoami
  template:
    metadata:
      labels:
        app: containous
        task: whoami
    spec:
      containers:
        - name: containouswhoami
          image: containous/whoami
          ports:
            - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: whoami
  namespace: shared

spec:
  ports:
    - name: http
      port: 80
  selector:
    app: containous
    task: whoami

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: whoami
  namespace: shared
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: example.com
    postgres:
      paths:
      - backend:
          serviceName: whoami
          servicePort: http

I'm able to open my browser, navigate to http://example.com and get the expected whomai page.

Since we deployed postgres via helm, and the service has type ClusterIP, how can I provide my developers access to the database? Again I went with the "k8s ingress" and not the CRD cuz I'm not an expert.

Here's where I think I'm missing something basic, what I know is they're trying to use a client to reach something like this:

jdbc:postgresql://example.com:5432/postgres (of course the client allows the input of user/pass/database)

  • Am I wrong in expecting to build a traefik TCP ingress that would allow such access?
  • Any examples of such access on k8s? cuz I found a few posts that deal with docker-compose
  • Any alternatives to traefik or generally a way to handle this challenge without opening a public IP (i.e. service type Loadbalancer).

Statefulset:

+ kubectl get statefulset -n shared
NAME                 READY   AGE
admindb-postgresql   1/1     23h

Service:

+ kubectl get service -n shared
NAME                          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
admindb-postgresql            ClusterIP   10.100.75.113   <none>        5432/TCP   23h
admindb-postgresql-headless   ClusterIP   None            <none>        5432/TCP   23h
whoami                        ClusterIP   10.100.25.131   <none>        80/TCP     44m

Statefulset description:

+ kubectl describe statefulset admindb-postgresql -n shared
Name:               admindb-postgresql
Namespace:          shared
CreationTimestamp:  Tue, 10 Mar 2020 11:05:43 +0200
Selector:           app=postgresql,release=admindb,role=master
Labels:             app=postgresql
                    chart=postgresql-8.3.3
                    heritage=Helm
                    release=admindb
Annotations:        <none>
Replicas:           1 desired | 1 total
Update Strategy:    RollingUpdate
Pods Status:        1 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=postgresql
           chart=postgresql-8.3.3
           heritage=Helm
           release=admindb
           role=master
  Init Containers:
   init-chmod-data:
    Image:      docker.io/bitnami/minideb:buster
    Port:       <none>
    Host Port:  <none>
    Command:
      /bin/sh
      -cx
      echo "current user id: `id`"
      mkdir -p /bitnami/postgresql/data
      chmod 700 /bitnami/postgresql/data
      find /bitnami/postgresql -mindepth 1 -maxdepth 1 -not -name ".snapshot" -not -name "lost+found" | \
        xargs chown -R 1001:1001
      chmod -R 777 /dev/shm

    Requests:
      cpu:        250m
      memory:     256Mi
    Environment:  <none>
    Mounts:
      /bitnami/postgresql from data (rw)
      /dev/shm from dshm (rw)
  Containers:
   admindb-postgresql:
    Image:      docker.io/bitnami/postgresql:11.6.0-debian-10-r5
    Port:       5432/TCP
    Host Port:  0/TCP
    Requests:
      cpu:      250m
      memory:   256Mi
    Liveness:   exec [/bin/sh -c exec pg_isready -U "postgres" -h 127.0.0.1 -p 5432] delay=30s timeout=5s period=10s #success=1 #failure=6
    Readiness:  exec [/bin/sh -c -e exec pg_isready -U "postgres" -h 127.0.0.1 -p 5432
[ -f /opt/bitnami/postgresql/tmp/.initialized ] || [ -f /bitnami/postgresql/.initialized ]
] delay=5s timeout=5s period=10s #success=1 #failure=6
    Environment:
      BITNAMI_DEBUG:           false
      POSTGRESQL_PORT_NUMBER:  5432
      POSTGRESQL_VOLUME_DIR:   /bitnami/postgresql
      PGDATA:                  /bitnami/postgresql/data
      POSTGRES_USER:           postgres
      POSTGRES_PASSWORD:       <set to the key 'postgresql-password' in secret 'pg-default-password'>  Optional: false
      POSTGRESQL_ENABLE_LDAP:  no
    Mounts:
      /bitnami/postgresql from data (rw)
      /dev/shm from dshm (rw)
  Volumes:
   dshm:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:     Memory
    SizeLimit:  1Gi
Volume Claims:
  Name:          data
  StorageClass:
  Labels:        <none>
  Annotations:   <none>
  Capacity:      30Gi
  Access Modes:  [ReadWriteOnce]
Events:          <none>

Service description:

+ kubectl describe svc -n shared admindb-postgresql
Name:              admindb-postgresql
Namespace:         shared
Labels:            app=postgresql
                   chart=postgresql-8.3.3
                   heritage=Helm
                   release=admindb
Annotations:       <none>
Selector:          app=postgresql,release=admindb,role=master
Type:              ClusterIP
IP:                10.100.75.113
Port:              tcp-postgresql  5432/TCP
TargetPort:        tcp-postgresql/TCP
Endpoints:         10.55.0.17:5432
Session Affinity:  None
Events:            <none>
Naim Salameh
  • 387
  • 4
  • 18

0 Answers0