Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Assign External IP to a Kubernetes Service

EDIT: The whole point of my setup is to achieve (if possible) the following :

  • I have multiple k8s nodes
  • When I contact an IP address (from my company's network), it should be routed to one of my container/pod/service/whatever.
  • I should be able to easily setup that IP (like in my service .yml definition)

I'm running a small Kubernetes cluster (built with kubeadm) in order to evaluate if I can move my Docker (old)Swarm setup to k8s. The feature I absolutely need is the ability to assign IP to containers, like I do with MacVlan.

In my current docker setup, I'm using MacVlan to assign IP addresses from my company's network to some containers so I can reach directly (without reverse-proxy) like if it's any physical server. I'm trying to achieve something similar with k8s.

I found out that:

  • I have to use Service
  • I can't use the LoadBalancer type, as it's only for compatible cloud providers (like GCE or AWS).
  • I should use ExternalIPs
  • Ingress Resources are some kind of reverse proxy ?

My yaml file is :

apiVersion: apps/v1beta1 kind: Deployment metadata:       name: nginx-deployment spec:   template:     metadata:       labels:         app: nginx     spec:       containers:       - name: nginx         image: nginx:1.7.9         ports:         - containerPort: 80       nodeSelector:         kubernetes.io/hostname: k8s-slave-3 --- kind: Service apiVersion: v1 metadata:   name: nginx-service spec:   type: ClusterIP   selector:     app: nginx   ports:     - name: http       protocol: TCP       port: 80       targetPort: 80   externalIPs:      - A.B.C.D 

I was hopping that my service would get the IP A.B.C.D (which is one of my company's network). My deployment is working as I can reach my nginx container from inside the k8s cluster using it's ClusterIP.

What am I missing ? Or at least, where can I find informations on my network traffic in order to see if packets are coming ?

EDIT :

$ kubectl get svc NAME            CLUSTER-IP     EXTERNAL-IP       PORT(S)   AGE kubernetes      10.96.0.1      <none>            443/TCP   6d nginx-service   10.102.64.83   A.B.C.D           80/TCP    23h 

Thanks.

like image 782
Jérôme Pin Avatar asked Jun 13 '17 11:06

Jérôme Pin


People also ask

Can a service have its own IP address in Kubernetes?

Kubernetes gives Pods their own IP addresses and a single DNS name for a set of Pods, and can load-balance across them.

How do I assign an IP address to POD in Kubernetes?

Assigning static IP addresses to PODs is not possible in OSS Kubernetes. But it is possible to configure via some CNI plugins. For instance, Calico provides a way to override IPAM and use fixed addresses by annotating pod. The address must be within a configured Calico IP pool and not currently in use.


2 Answers

First of all run this command:

kubectl get -n namespace services 

Above command will return output like this:

 NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE backend   NodePort   10.100.44.154         <none>          9400:3003/TCP   13h    frontend        NodePort   10.107.53.39     <none>        3000:30017/TCP   13h 

It is clear from the above output that External IPs are not assigned to the services yet. To assign External IPs to backend service run the following command.

 kubectl patch svc backend -p '{"spec":{"externalIPs":["192.168.0.194"]}}' 

and to assign external IP to frontend service run this command.

 kubectl patch svc frontend -p '{"spec":{"externalIPs":["192.168.0.194"]}}' 

Now get namespace service to check either external IPs assignment:

kubectl get -n namespace services 

We get an output like this:

NAME     TYPE     CLUSTER-IP     EXTERNAL-IP    PORT(S)             AGE backend  NodePort 10.100.44.154  192.168.0.194  9400:3003/TCP       13h frontend NodePort 10.107.53.39   192.168.0.194  3000:30017/TCP      13h 

Cheers!!! Kubernetes External IPs are now assigned .

like image 176
Umar Hayat Avatar answered Sep 24 '22 06:09

Umar Hayat


If this is just for testing, then try

kubectl port-forward service/nginx-service 80:80 

Then you can

curl http://localhost:80 
like image 23
Chuk Lee Avatar answered Sep 24 '22 06:09

Chuk Lee