首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kubernetes、Flannel和曝露服务

Kubernetes、Flannel和曝露服务
EN

Stack Overflow用户
提问于 2015-12-18 18:16:53
回答 3查看 3.4K关注 0票数 3

我有一个kubernetes设置运行良好,但我似乎不能对外公开服务。我在想,我的关系网设置得不对:

kubernetes服务地址:-服务-集群-ip-range=172.16.0.1/16

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

docker子网设置:-bip=10.0.0.1/24

主机IP: 192.168.4.57

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

代码语言:javascript
复制
[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

然后我像这样公开了服务:

代码语言:javascript
复制
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是我唯一的选择?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-24 12:55:04

因此,这里的问题是,当您使用nodePort时,缺少了一块拼图。

我在命令上也犯了错误。

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

代码语言:javascript
复制
kubectl expose rc nginx --port=80 --type=NodePort

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

代码语言:javascript
复制
[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.

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

票数 2
EN

Stack Overflow用户

发布于 2015-12-18 18:33:30

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

负载均衡器有帮助,因为它可以处理节点崩溃的情况,但其他节点仍然可以处理服务。

票数 1
EN

Stack Overflow用户

发布于 2016-01-05 22:14:55

如果您在裸金属上运行集群,或者不在提供负载均衡器的提供者上运行群集,您还可以将端口定义为吊舱上的hostPort

定义容器和港口

代码语言:javascript
复制
containers:
- name: ningx
  image: nginx
  ports:
  - containerPort: 80
    hostPort: 80
    name: http

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

这里的两个限制很明显: 1)每个主机上最多只能有一个这样的豆荚。2) IP是它绑定到的节点的主机IP。

这就是云提供商负载平衡器在某种程度上的工作方式。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34361679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档