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?
Your service is of type ClusterIP which means it can only be accessed by other Kubernetes pods. To achieve what you are trying to do consider switching to a service of type NodePort. You can then connect to it using the command curl <Kubernetes-IP-address>:<exposedServicePort>
See https://kubernetes.io/docs/tasks/access-application-cluster/service-access-application-cluster/ for an example of using NodePort.
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.