Kubernetes,法兰绒和露天服务

时间:2015-12-18 18:16:54

标签: docker kubernetes coreos flannel flanneld

我有一个运行良好的kubernetes设置,但我似乎无法在外部公开服务。我认为我的网络设置不正确:

kubernetes服务地址: - service-cluster-ip-range = 172.16.0.1 / 16

法兰绒网络配置:etcdctl get /test.lan/network/config {“网络”:“172.17.0.0/16”}

docker subnet setting:--bip = 10.0.0.1 / 24

Hostnode IP:192.168.4.57

我已经运行了nginx服务,并且我试图像这样公开它:

[root@kubemaster ~]# kubectl get pods
NAME          READY     STATUS    RESTARTS   AGE
nginx-px6uy   1/1       Running   0          4m
[root@kubemaster ~]# kubectl get services
NAME         LABELS                                    SELECTOR    IP(S)           PORT(S)    AGE
kubernetes   component=apiserver,provider=kubernetes   <none>      172.16.0.1      443/TCP    31m
nginx        run=nginx                                 run=nginx   172.16.84.166   9000/TCP   3m

然后我暴露了这样的服务:

kubectl expose rc nginx --port=9000 --target-port=9000 --type=NodePort
NAME      LABELS      SELECTOR    IP(S)     PORT(S)    AGE
nginx     run=nginx   run=nginx             9000/TCP   292y

我现在希望能够访问主机节点IP(192.168.4.57)上的nginx容器 - 我误解了网络吗?如果我有,可以解释一下:(

注意:这是在物理硬件上没有云提供商提供的负载均衡器,所以我认为NodePort是我唯一的选择吗?

3 个答案:

答案 0 :(得分:2)

所以这里的问题是当你使用nodePort时,这个谜题有一个缺失。

我的命令也犯了错误。

首先,您需要确保公开正确的端口,在本例中为80,用于nginx:

kubectl expose rc nginx --port=80 --type=NodePort

其次,您需要使用kubectl describe svc nginx,它会显示在每个节点上分配的NodePort:

[root@kubemaster ~]# kubectl describe svc nginx
Name:           nginx
Namespace:      default
Labels:         run=nginx
Selector:       run=nginx
Type:           NodePort
IP:         172.16.92.8
Port:           <unnamed>   80/TCP
NodePort:       <unnamed>   32033/TCP
Endpoints:      10.0.0.126:80,10.0.0.127:80,10.0.0.128:80
Session Affinity:   None
No events.

您当然可以在部署时分配一个,但在使用随机分配的端口时我错过了这个信息。

答案 1 :(得分:1)

是的,你需要使用NodePort。 当您点击服务时,destPort应该等于NodePort。 服务的destIP应该被节点视为本地的。例如。你可以使用其中一个节点的hostIP ..

负载均衡器有帮助,因为它可以处理节点出现故障的情况,但其他节点仍然可以处理服务..

答案 2 :(得分:1)

如果您在裸机上运行群集或不在提供负载均衡器的提供商处运行群集,您还可以将端口定义为您的pod上的hostPort

定义容器和端口

containers:
- name: ningx
  image: nginx
  ports:
  - containerPort: 80
    hostPort: 80
    name: http

这会将容器绑定到主机网络并使用定义的端口。

这里的2个限制显然是: 1)每个主机上最多只能有一个这样的pod。 2)IP是它绑定的节点的主机IP

这主要是云提供商负载均衡器的工作方式。

使用新的DaemonSet功能,可以定义pod将登陆的节点并修复IP。但是,这必然会影响高可用性方面,但在某些时候没有太多选择,因为DNS负载平衡不会避免转发到死节点