我正在尝试创建一个Kubernetes
集群以供学习。因此,我用Vagrant
创建了3个虚拟机,其中主服务器的IP地址为172.17.8.101
,另外两个是172.17.8.102
和172.17.8.103
。
很明显,我们需要Flannel
,以便不同机器中的容器可以相互连接而无需端口映射。为了使Flannel
工作,我们需要Etcd
,因为法兰绒使用此Datastore
来放置和获取其数据。
我在主节点上安装了Etcd
,并用命令Flannel
在其上放置了etcdctl set /coreos.com/network/config '{"Network": "10.33.0.0/16"}'
网络地址
要启用ip masquerading
并在虚拟机中也使用专用网络接口,我在--ip-masq --iface=enp0s8
文件的FLANNEL_OPTIONS
中添加了/etc/sysconfig/flannel
。
为了使Docker
使用Flannel
网络,我在--bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU}'
文件的OPTIONS
变量中添加了/etc/sysconfig/docker
。请注意,FLANNEL_SUBNET
和FLANNEL_MTU
变量的值是Flannel
文件中/run/flannel/subnet.env
设置的值。
所有这些设置之后,我在主节点上安装了kubernetes-master
和kubernetes-client
,在所有节点上安装了kubernetes-node
。对于最终配置,我将KUBE_SERVICE_ADDRESSES
文件中的/etc/kubernetes/apiserver
值更改为--service-cluster-ip-range=10.33.0.0/16
和KUBELET_API_SERVER
文件中的/etc/kubernetes/kubelet
值复制到--api-servers=http://172.17.8.101:8080
。
这是带有完整文件的k8s-tutorial project存储库的链接。
所有这些努力之后,所有服务均成功启动并正常运行。显然,当我使用命令kubectl get nodes
时,有3个节点正在运行。我可以使用命令nginx
成功创建一个kubectl run nginx-pod --image=nginx --port=80 --labels="app=nginx"
吊舱,并使用kubectl expose pod nginx-pod --port=8000 --target-port=80 --name="service-pod"
命令创建一个服务。
命令kubectl describe service service-pod
输出以下结果:
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.
挑战在于,当我尝试使用curl 10.33.79.222:8000
连接到创建的服务时,会得到curl: (7) Failed connect to 10.33.72.2:8000; Connection refused
,但是如果尝试curl 10.33.72.2:80
,则会得到默认的nginx
页面。另外,我无法ping 10.33.79.222
,所有数据包都丢失了。
有人建议停止并禁用Firewalld
,但是它根本不在节点上运行。在版本1.13之后,Docker
在FORWARD
中将DROP
链策略更改为Iptables
时,我将其更改回ACCEPT
,但也无济于事。我最终尝试更改CIDR
并使用其他IP /子网,但没有运气。
有人知道我要去哪里哪里或如何找出我无法连接到所创建服务的问题吗?
答案 0 :(得分:2)
我唯一看到的与您冲突的是用于服务的PodCidr和Cidr。
法兰绒网络:'{"Network": "10.33.0.0/16"}'
。然后在kube-apiserver --service-cluster-ip-range=10.33.0.0/16
上。该范围相同,应该有所不同,因此您需要为10.33.0.0/16
设置kube-proxy,然后您的叠加层认为它需要路由到在10.33.0.0/16
上运行的Pod。首先,请为您的广告连播和服务选择完全不重叠的Cidrs。
例如,在我的集群上(我正在使用Calico),我的podCidr为192.168.0.0/16
,服务的Cidr为10.96.0.0/12
注意:由于在这种情况下不允许使用ICMP,因此您将无法ping 10.33.79.222
。
答案 1 :(得分:0)
您的服务属于ClusterIP类型,这意味着该服务只能由其他Kubernetes容器访问。要实现您要尝试执行的操作,请考虑切换到NodePort类型的服务。然后,您可以使用命令curl <Kubernetes-IP-address>:<exposedServicePort>
有关使用NodePort的示例,请参见https://kubernetes.io/docs/tasks/access-application-cluster/service-access-application-cluster/。