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.
Just include additional option.
First of all run this command:
Above command will return output like this:
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.
and to assign external IP to frontend service run this command.
Now get namespace service to check either external IPs assignment:
We get an output like this:
Cheers!!! Kubernetes External IPs are now assigned .
You can just Patch an External IP
CMD:
$ kubectl patch svc svc_name -p '{"spec":{"externalIPs":["your_external_ip"]}}'
Eg:-
$ kubectl patch svc kubernetes -p '{"spec":{"externalIPs":["10.2.8.19"]}}'
If this is just for testing, then try
Then you can
I don't know if that helps in your particular case but what I did (and I'm on a Bare Metal cluster) was to use the
LoadBalancer
and set theloadBalancerIP
as well as theexternalIPs
to my server IP as you did it.After that the correct external IP showed up for the load balancer.
You can try to add "type: NodePort" in your yaml file for the service and then you'll have a port to access it via the web browser or from the outside. For my case, it helped.