Search code examples
kubernetesmediawikikubernetes-pod

How to create multiple instances of Mediawiki in a Kubernetes Cluster


I´m about to deploy multiple Mediawiki instances on my Kubernetes-cluster. In my case the YAML deploymentfile for the DB (MySQL) works as it supposed to do, the deploymentfile for Mediawiki deploys as many pods as expected, but I can´t access them from outside of the cluster even if I create a Service for this case.

If I try to create one single Mediawiki pod and a service to access it from outside of the cluster it works as it should. If I try to create a deploymentfile for Mediawiki equal to the one for MySQL it does creates the pods and the requiered service but it´s not accessible from the externel-IP assigned to it.

My deploymentfile for Mediawiki:

apiVersion: v1
kind: Service
metadata:
 name: mediawiki-service
 labels:
  name: mediawiki-service
  app: mediawiki
spec:
 type: LoadBalancer
 ports:
 - port: 80
   targetPort: 80
 selector:
  name: mediawiki-pod
  app: mediawiki
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mediawiki
spec:
  replicas: 6
  selector:
    matchLabels:
      app: mediawiki
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mediawiki
    spec:
      containers:
      - image: mediawiki
        name: mediawiki
        ports:
        - containerPort: 80
          name: mediawiki

This is the pod-definition file:

apiVersion: v1
kind: Pod
metadata:
 name: mediawiki-pod
 labels:
  name: mediawiki-pod
  app: mediawiki
spec:
 containers:
 - name: mediawiki
   image: mediawiki
   ports:
   - containerPort: 80

This is the service-definition file:

apiVersion: v1
kind: Service
metadata:
 name: mediawiki-service
 labels:
  name: mediawiki-service
  app: mediawiki
spec:
 type: LoadBalancer
 ports:
 - port: 80
   targetPort: 80
 selector:
  name: mediawiki-pod

The accual resault should be that I can deploy multiple instances of Mediawiki on my cluster and can access them from outside with the externel-IP.


Solution

  • If you look at kubectl describe service mediawiki-service in both scenarios, I expect you will see that in the single-pod case, there is an Endpoints: list that includes a single IP address (the pod's, but that's an implementation detail) but in the deployment case, it says <none>.

    Your Service only matches pods that have both name and app labels:

    apiVersion: v1
    kind: Service
    spec:
     selector:
      name: mediawiki-pod
      app: mediawiki
    

    But the pods deployed by your deployment only have app labels:

    apiVersion: apps/v1
    kind: Deployment
    spec:
      template:
        metadata:
          labels:
            app: mediawiki
    

    So at that specific point (the labels inside the template for the deployment; also adding them at the top level doesn't hurt, but this embedded point is what's important) you need to add the second label name: mediawiki-pod.