Each of the individual kubernetes containers to be made accessible from Internet - is it possible?

5/16/2017

I'm considering kubernetes as a platform for my application. I will launch multiple StatefulSets, each containing up to, say, 32 containers. kubernetes cluster will contain a few nodes, and each node will be assigned for e.g. 32+ external IP addresses.

My application requires that clients running somewhere on the internet to be able to reach each individual server instance via a static IP address and port for client-based load balancing and failover. Servers can come up and die from tie to time, but server address should be stable while the server is running.

To summarise in simple words I would like to be able to access my containers from Internet like this:

  • StatefulSet 1:
    • container 1: node1.domain.com:1000
    • container 2: node2.domain.com:1000
  • StatefulSet 2:
    • container 1: node1.domain.com:1001
    • container 2: node2.domain.com:1001
  • StatefulSet 3:
    • container 1: node2.domain.com:1002
    • container 2: node3.domain.com:1002

Is this something that is possible to achieve with kubernetes? If so, could you provide a hint how and reference to relevant kubernetes documentation?

-- roman
kubernetes

2 Answers

5/16/2017

Any reason you're tied to a StatefulSet? Sounds more like a DaemonSet to me. If you want to stick with StatefulSet, just use the container/host port parameters in your container spec.

Example, run the apps overflow-foo, overflow-bar, overflow-baz each on their own ports on every node matching your selector criteria in the cluster.

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: overflow-app
  labels:
    app: overflow-app-agent
    version: v1
spec:
  template:
    metadata:
      labels:
        name: overflow-app
    spec:
      hostPID: true
      hostIPC: true
      hostNetwork: true
      containers:
      - image: overflow-foo:latest
        name: overflow-bar
        command: [ "bash", "-c", "run.sh" ]
        ports:
        - containerPort: 1000
          hostPort: 1000
      - image: overflow-bar:latest
        name: overflow-bar
        command: [ "bash", "-c", "run.sh" ]
        ports:
        - containerPort: 1001
          hostPort: 1001
      - image: overflow-baz:latest
        name: overflow-baz
        command: [ "bash", "-c", "run.sh" ]
        ports:
        - containerPort: 1002
          hostPort: 1002
-- thisguy123
Source: StackOverflow

5/16/2017

It sounds like you want to use Services for exposure of your StatefulSets. You would define a single service per Stateful Set and expose it to the outside world with a NodePort or LoadBalancer. A NodePort is available to address on every Node in the cluster and a LoadBalancer would be a single point of entry that also balances the load to the different PODs of your StatefulSet. For more information you can read the official docs for Services, especially the sections for NodePort and LoadBalancer.

One additional note - The NodePort uses a port range 30000-32767 by default, but you can change it with the cluster parameter service-node-port-range. See docs.

-- Oswin Noetzelmann
Source: StackOverflow