I'm trying to create a Kubernetes
cluster for learning purposes. So, I created 3 virtual machines with Vagrant
where the master has IP address of 172.17.8.101
and the other two are 172.17.8.102
and 172.17.8.103
.
It's clear that we need Flannel
so that our containers in different machines can connect to each other without port mapping. And for Flannel
to work, we need Etcd
, because flannel uses this Datastore
to put and get its data.
I installed Etcd
on master node and put Flannel
network address on it with command etcdctl set /coreos.com/network/config '{"Network": "10.33.0.0/16"}'
To enable ip masquerading
and also using the private network interface in the virtual machine, I added --ip-masq --iface=enp0s8
to FLANNEL_OPTIONS
in /etc/sysconfig/flannel
file.
In order to make Docker
use Flannel
network, I added --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU}'
to OPTIONS
variable in /etc/sysconfig/docker
file. Note that the values for FLANNEL_SUBNET
and FLANNEL_MTU
variables are the ones set by Flannel
in /run/flannel/subnet.env
file.
After all these settings, I installed kubernetes-master
and kubernetes-client
on the master node and kubernetes-node
on all the nodes. For the final configurations, I changed KUBE_SERVICE_ADDRESSES
value in /etc/kubernetes/apiserver
file to --service-cluster-ip-range=10.33.0.0/16
and KUBELET_API_SERVER
value in /etc/kubernetes/kubelet
file to --api-servers=http://172.17.8.101:8080
.
This is the link to k8s-tutorial project repository with the complete files.
After all these efforts, all the services start successfully and work fine. It's clear that there are 3 nodes running when I use the command kubectl get nodes
. I can successfully create a nginx
pod with command kubectl run nginx-pod --image=nginx --port=80 --labels="app=nginx"
and create a service with kubectl expose pod nginx-pod --port=8000 --target-port=80 --name="service-pod"
command.
The command kubectl describe service service-pod
outputs the following results:
Name: service-pod
Namespace: default
Labels: app=nginx
Selector: app=nginx
Type: ClusterIP
IP: 10.33.39.222
Port: <unset> 8000/TCP
Endpoints: 10.33.72.2:80
Session Affinity: None
No events.
The challenge is that when I try to connect to the created service with curl 10.33.79.222:8000
I get curl: (7) Failed connect to 10.33.72.2:8000; Connection refused
but if I try curl 10.33.72.2:80
I get the default nginx
page. Also, I can't ping to 10.33.79.222
and all the packets get lost.
Some suggested to stop and disable Firewalld
, but it wasn't running at all on the nodes. As Docker
changed FORWARD
chain policy to DROP
in Iptables
after version 1.13 I changed it back to ACCEPT
but it didn't help either. I eventually tried to change the CIDR
and use different IP/subnets but no luck.
Does anybody know where am I going wrong or how to figure out what's the problem that I can't connect to the created service?
The only thing I can see that you have that is conflicting is the PodCidr with Cidr that you are using for the services.
The Flannel network: '{"Network": "10.33.0.0/16"}'
. Then on the kube-apiserver --service-cluster-ip-range=10.33.0.0/16
. That's the same range and it should be different so you have your kube-proxy setting up services for 10.33.0.0/16
and then you have your overlay thinking it needs to route to the pods running on 10.33.0.0/16
. I would start by choosing a completely non-overlapping Cidrs for both your pods and services.
For example on my cluster (I'm using Calico) I have a podCidr of 192.168.0.0/16
and I have a service Cidr of 10.96.0.0/12
Note: you wouldn't be able to ping 10.33.79.222
since ICMP is not allowed in this case.