我如何向全世界公开我的服务?

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