我如何向全世界公开我的服务?
How do I expose my service to the world?
我决定在自己的机器上设置 Kuberenetes,而不是使用 google 云。我制作了我的 hello-world 网络服务器的 docker 图像。我设置了你好-controller.yaml:
apiversion: v1
kind: ReplicationController
metadata:
name: hello
labels:
name: hello
spec:
replicas: 1
selector:
name: hello
template:
metadata:
labels:
name: hello
spec:
containers:
- name: hello
image: flaggy/hello
ports:
- containerPort: 8888
现在我想向全世界公开该服务。我认为 vagrant provider 没有负载均衡器(这似乎是最好的方法)。所以我尝试了 NodePort 服务类型。但是,新创建的 NodePort 似乎没有在我尝试的任何 IP 上被监听。你好-service.yaml:
apiversion: v1
kind: Service
metadata:
name: hello
labels:
name: hello
spec:
type: NodePort
selector:
name: hello
ports:
- port: 8888
如果我登录我的 minion,我可以访问端口 8888
$ curl 10.246.1.3:8888
Hello!
当我描述我的服务时,我得到的是:
$ kubectl.sh describe service/hello
W0628 15:20:45.049822 1245 request.go:302] field selector: v1 - events - involvedObject.name - hello: need to check if this is versioned correctly.
W0628 15:20:45.049874 1245 request.go:302] field selector: v1 - events - involvedObject.namespace - default: need to check if this is versioned correctly.
W0628 15:20:45.049882 1245 request.go:302] field selector: v1 - events - involvedObject.kind - Service: need to check if this is versioned correctly.
W0628 15:20:45.049887 1245 request.go:302] field selector: v1 - events - involvedObject.uid - 2c0005e7-1dc2-11e5-8369-0800279dd272: need to check if this is versioned correctly.
Name: hello
Labels: name=hello
Selector: name=hello
Type: NodePort
IP: 10.247.5.87
Port: <unnamed> 8888/TCP
NodePort: <unnamed> 31423/TCP
Endpoints: 10.246.1.3:8888
Session Affinity: None
No events.
我找不到任何人在端口 31423 上侦听,据我所知,该端口应该是我服务的外部端口。我也对IP 10.247.5.87感到困惑。
我注意到这个
$ kubectl.sh get nodes
NAME LABELS STATUS
10.245.1.3 kubernetes.io/hostname=10.245.1.3 Ready
为什么该 IP 与我在服务描述中看到的不同?我尝试访问主机上的两个 IP:
$ curl 10.245.1.3:31423
curl: (7) Failed to connect to 10.245.1.3 port 31423: Connection refused
$ curl 10.247.5.87:31423
curl: (7) Failed to connect to 10.247.5.87 port 31423: No route to host
$
所以 IP 10.245.1.3 是可以访问的,尽管端口 31423 没有绑定到它。我尝试将 10.247.5.87 路由到 vboxnet1,但它没有任何改变:
$ sudo route add -net 10.247.5.87 netmask 255.255.255.255 vboxnet1
$ curl 10.247.5.87:31423
curl: (7) Failed to connect to 10.247.5.87 port 31423: No route to host
如果我对 minion 做 sudo netstat -anp | grep 31423
什么也不会发生。奇怪的是,如果我这样做 sudo netstat -anp | grep 8888
也没有任何结果。
必须有一些 iptables 魔术或滥用混杂模式下的某些接口。
在裸机上运行也会这么难吗?我也没有尝试过 AWS 提供商,但我很担心。
几件事。
您的单个 pod 是 10.246.1.3:8888 - 这似乎有效。
你的服务是 10.247.5.87:8888 - 只要你在你的集群中它就应该工作(它是虚拟的 - 你不会在 netstat
中看到它)。这是首先要验证的。
您的节点是 10.245.1.3,您的服务也应该位于 10.245.1.3:31423 - 这是似乎无法正常工作的部分。与服务 IP 一样,此绑定是虚拟的 - 它应该显示在 iptables-save
而不是 netstat
中。如果您登录到您的节点(minion),您可以 curl localhost:31423
?
您可能会发现此文档很有用:https://github.com/thockin/kubernetes/blob/docs-debug-svcs/docs/debugging-services.md
我决定在自己的机器上设置 Kuberenetes,而不是使用 google 云。我制作了我的 hello-world 网络服务器的 docker 图像。我设置了你好-controller.yaml:
apiversion: v1
kind: ReplicationController
metadata:
name: hello
labels:
name: hello
spec:
replicas: 1
selector:
name: hello
template:
metadata:
labels:
name: hello
spec:
containers:
- name: hello
image: flaggy/hello
ports:
- containerPort: 8888
现在我想向全世界公开该服务。我认为 vagrant provider 没有负载均衡器(这似乎是最好的方法)。所以我尝试了 NodePort 服务类型。但是,新创建的 NodePort 似乎没有在我尝试的任何 IP 上被监听。你好-service.yaml:
apiversion: v1
kind: Service
metadata:
name: hello
labels:
name: hello
spec:
type: NodePort
selector:
name: hello
ports:
- port: 8888
如果我登录我的 minion,我可以访问端口 8888
$ curl 10.246.1.3:8888
Hello!
当我描述我的服务时,我得到的是:
$ kubectl.sh describe service/hello
W0628 15:20:45.049822 1245 request.go:302] field selector: v1 - events - involvedObject.name - hello: need to check if this is versioned correctly.
W0628 15:20:45.049874 1245 request.go:302] field selector: v1 - events - involvedObject.namespace - default: need to check if this is versioned correctly.
W0628 15:20:45.049882 1245 request.go:302] field selector: v1 - events - involvedObject.kind - Service: need to check if this is versioned correctly.
W0628 15:20:45.049887 1245 request.go:302] field selector: v1 - events - involvedObject.uid - 2c0005e7-1dc2-11e5-8369-0800279dd272: need to check if this is versioned correctly.
Name: hello
Labels: name=hello
Selector: name=hello
Type: NodePort
IP: 10.247.5.87
Port: <unnamed> 8888/TCP
NodePort: <unnamed> 31423/TCP
Endpoints: 10.246.1.3:8888
Session Affinity: None
No events.
我找不到任何人在端口 31423 上侦听,据我所知,该端口应该是我服务的外部端口。我也对IP 10.247.5.87感到困惑。
我注意到这个
$ kubectl.sh get nodes
NAME LABELS STATUS
10.245.1.3 kubernetes.io/hostname=10.245.1.3 Ready
为什么该 IP 与我在服务描述中看到的不同?我尝试访问主机上的两个 IP:
$ curl 10.245.1.3:31423
curl: (7) Failed to connect to 10.245.1.3 port 31423: Connection refused
$ curl 10.247.5.87:31423
curl: (7) Failed to connect to 10.247.5.87 port 31423: No route to host
$
所以 IP 10.245.1.3 是可以访问的,尽管端口 31423 没有绑定到它。我尝试将 10.247.5.87 路由到 vboxnet1,但它没有任何改变:
$ sudo route add -net 10.247.5.87 netmask 255.255.255.255 vboxnet1
$ curl 10.247.5.87:31423
curl: (7) Failed to connect to 10.247.5.87 port 31423: No route to host
如果我对 minion 做 sudo netstat -anp | grep 31423
什么也不会发生。奇怪的是,如果我这样做 sudo netstat -anp | grep 8888
也没有任何结果。
必须有一些 iptables 魔术或滥用混杂模式下的某些接口。
在裸机上运行也会这么难吗?我也没有尝试过 AWS 提供商,但我很担心。
几件事。
您的单个 pod 是 10.246.1.3:8888 - 这似乎有效。
你的服务是 10.247.5.87:8888 - 只要你在你的集群中它就应该工作(它是虚拟的 - 你不会在 netstat
中看到它)。这是首先要验证的。
您的节点是 10.245.1.3,您的服务也应该位于 10.245.1.3:31423 - 这是似乎无法正常工作的部分。与服务 IP 一样,此绑定是虚拟的 - 它应该显示在 iptables-save
而不是 netstat
中。如果您登录到您的节点(minion),您可以 curl localhost:31423
?
您可能会发现此文档很有用:https://github.com/thockin/kubernetes/blob/docs-debug-svcs/docs/debugging-services.md