NOTE: Before you proceed you must know how to connect to kubernetes cluster, have nginx ingress controller setup with certificate manager, and have mysql database pod deployed. Follow this guide if you do not have mysql deployed. Follow this guide to setup nginx ingress and cert manager.

Phpmyadmin is a popular open source tool to manage mysql database server. In this guide you will learn how to create new deployment and expose it as a service to access phpmyadmin from internet using nginx ingress controller.

  1. Create a deployment file called phpmyadmin-deployment.yaml and paste below values:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: phpmyadmin-deployment
  labels:
    app: phpmyadmin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: phpmyadmin
  template:
    metadata:
      labels:
        app: phpmyadmin
    spec:
      containers:
        - name: phpmyadmin
          image: phpmyadmin/phpmyadmin
          ports:
            - containerPort: 80
          env:
            - name: PMA_HOST
              value: mysql-service
            - name: PMA_PORT
              value: "3306"
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secrets
                  key: ROOT_PASSWORD

NOTE: ROOT_PASSWORD value will be consumed from kubernetes secrets. If you want to learn more about kubernetes secrets. Follow this guide.

  1. Execute below command to create new deployment:
kubectl apply -f phpmyadmin-deployment.yaml

Output:

deployment.apps/phpmyadmin-deployment created

Exposing phpmyadmin via Services

  1. Create new file called phpmyadmin-service.yaml and paste below values:
apiVersion: v1
kind: Service
metadata:
  name: phpmyadmin-service
spec:
  type: NodePort
  selector:
    app: phpmyadmin
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  1. Execute below command to create service:
kubectl apply -f phpmyadmin-service.yaml

Output:

service/phpmyadmin-service created

Once you are done with above configurations, its time to expose phpmyadmin service via internet.

NOTE: I'm using digital ocean managed kubernetes where I manage my own DNS, and digitalocean take cares of creating load balancer for my nginx ingress controller. Once again if you want to follow this guide it will be very helpful.

Nginx Ingress configuration

  1. Create new yaml file called phpmyadmin-ingress.yaml and paste below values:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: echo-ingress
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
  tls:
  - hosts:
    - phpmyadmin.example.com
    secretName: echo-tls
  rules:
  - host: mydemo.example.com
    http:
      paths:
      - backend:
          serviceName: phpmyadmin-service
          servicePort: 80
  1. Apply the changes:
kubectl apply -f mydemo-ingress.yaml