4

私は Google の Container Engine サービスを使用しており、ポート 3000 でリッスンするサーバーを実行するポッドを取得しました。ポート 80 をそのポッドのポート 3000 に接続するようにサービスをセットアップしました。ノード内で、外部からではありません。ポート 80 を許可してノードに送信するようにファイアウォール ルールを設定しましたが、ネットワークの外部から「接続が拒否されました」というメッセージが表示され続けます。ポッドが 1 つしかなく、転送ルールには費用がかかり、負荷分散を行うように見えたため、転送ルールなしでこれを実行しようとしています。createExternalLoadBalancer: trueサービスの仕様にを追加すると、転送ルールによって作成された外部 IP が期待どおりに機能するため、ファイアウォール ルールは機能すると思います。他に何かする必要がありますか?ルート設定か何か?

コントローラー.yaml

kind: ReplicationController
apiVersion: v1beta3
metadata:
    name: app-frontend
    labels:
        name: app-frontend
        app: app
        role: frontend
spec:
    replicas: 1
    selector:
        name: app-frontend
    template:
        metadata:
            labels:
                name: app-frontend
                app: app
                role: frontend
        spec:
            containers:
                - name: node-frontend
                  image: gcr.io/project_id/app-frontend
                  ports:
                    - name: app-frontend-port
                      containerPort: 3000
                      targetPort: 3000
                      protocol: TCP

service.yaml

kind: Service
apiVersion: v1beta3
metadata:
  name: app-frontend-service
  labels:
    name: app-frontend-service
    app: app
    role: frontend
spec:
  ports:
    - port: 80
      targetPort: app-frontend-port
      protocol: TCP
  publicIPs:
   - 123.45.67.89
  selector:
    name: app-frontend

編集(追加の詳細): このサービスを作成すると、実行時に見つかったこれらの追加ルールが追加されますiptables -L -t nat

Chain KUBE-PORTALS-CONTAINER (1 references)
target     prot opt source               destination         
REDIRECT   tcp  --  anywhere             10.247.247.206       /* default/app-frontend-service: */ tcp dpt:http redir ports 56859
REDIRECT   tcp  --  anywhere             89.67.45.123.bc.googleusercontent.com  /* default/app-frontend-service: */ tcp dpt:http redir ports 56859
Chain KUBE-PORTALS-HOST (1 references)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             10.247.247.206       /* default/app-frontend-service: */ tcp dpt:http to:10.241.69.28:56859
DNAT       tcp  --  anywhere             89.67.45.123.bc.googleusercontent.com  /* default/app-frontend-service: */ tcp dpt:http to:10.241.69.28:56859

iptables を完全には理解していないため、宛先ポートが自分のサービスとどのように一致するかわかりません。89.67.45.123.bc.googleusercontent.comの DNS が に解決されることがわかりました123.45.67.89

kubectl get services は、指定した IP アドレスとポートを表示します。

NAME                             IP(S)               PORT(S)
app-frontend-service             10.247.243.151      80/TCP
                                 123.45.67.89

外部 IP からの最近のものが /var/log/kube-proxy.log に表示されない

4

3 に答える 3

6

TL;DR: ノードの内部 IP をサービス定義のパブリック IP として使用します。


kube-proxy で詳細ログを有効にすると、適切な IP テーブル ルールが作成されているように見えます。

I0602 04:07:32.046823   24360 roundrobin.go:98] LoadBalancerRR service "default/app-frontend-service:" did not exist, created
I0602 04:07:32.047153   24360 iptables.go:186] running iptables -A [KUBE-PORTALS-HOST -t nat -m comment --comment default/app-frontend-service: -p tcp -m tcp -d 10.119.244.130/32 --dport 80 -j DNAT --to-destination 10.240.121.42:36970]
I0602 04:07:32.048446   24360 proxier.go:606] Opened iptables from-host portal for service "default/app-frontend-service:" on TCP 10.119.244.130:80
I0602 04:07:32.049525   24360 iptables.go:186] running iptables -C [KUBE-PORTALS-CONTAINER -t nat -m comment --comment default/app-frontend-service: -p tcp -m tcp -d 23.251.156.36/32 --dport 80 -j REDIRECT --to-ports 36970]
I0602 04:07:32.050872   24360 iptables.go:186] running iptables -A [KUBE-PORTALS-CONTAINER -t nat -m comment --comment default/app-frontend-service: -p tcp -m tcp -d 23.251.156.36/32 --dport 80 -j REDIRECT --to-ports 36970]
I0602 04:07:32.052247   24360 proxier.go:595] Opened iptables from-containers portal for service "default/app-frontend-service:" on TCP 23.251.156.36:80
I0602 04:07:32.053222   24360 iptables.go:186] running iptables -C [KUBE-PORTALS-HOST -t nat -m comment --comment default/app-frontend-service: -p tcp -m tcp -d 23.251.156.36/32 --dport 80 -j DNAT --to-destination 10.240.121.42:36970]
I0602 04:07:32.054491   24360 iptables.go:186] running iptables -A [KUBE-PORTALS-HOST -t nat -m comment --comment default/app-frontend-service: -p tcp -m tcp -d 23.251.156.36/32 --dport 80 -j DNAT --to-destination 10.240.121.42:36970]
I0602 04:07:32.055848   24360 proxier.go:606] Opened iptables from-host portal for service "default/app-frontend-service:" on TCP 23.251.156.36:80

を使用して iptables エントリを一覧表示すると、ご覧-L -tのようにパブリック IP が逆引き DNS 名に変換されたことが示されます。

Chain KUBE-PORTALS-CONTAINER (1 references)
target     prot opt source               destination         
REDIRECT   tcp  --  anywhere             10.119.240.2         /* default/kubernetes: */ tcp dpt:https redir ports 50353
REDIRECT   tcp  --  anywhere             10.119.240.1         /* default/kubernetes-ro: */ tcp dpt:http redir ports 54605
REDIRECT   udp  --  anywhere             10.119.240.10        /* default/kube-dns:dns */ udp dpt:domain redir ports 37723
REDIRECT   tcp  --  anywhere             10.119.240.10        /* default/kube-dns:dns-tcp */ tcp dpt:domain redir ports 50126
REDIRECT   tcp  --  anywhere             10.119.244.130       /* default/app-frontend-service: */ tcp dpt:http redir ports 36970
REDIRECT   tcp  --  anywhere             36.156.251.23.bc.googleusercontent.com  /* default/app-frontend-service: */ tcp dpt:http redir ports 36970

ただし、-nオプションを追加すると、IP アドレスが表示されます (デフォルトで-Lは、IP アドレスの逆引きが行われるため、DNS 名が表示されます)。

Chain KUBE-PORTALS-CONTAINER (1 references)
target     prot opt source               destination         
REDIRECT   tcp  --  0.0.0.0/0            10.119.240.2         /* default/kubernetes: */ tcp dpt:443 redir ports 50353
REDIRECT   tcp  --  0.0.0.0/0            10.119.240.1         /* default/kubernetes-ro: */ tcp dpt:80 redir ports 54605
REDIRECT   udp  --  0.0.0.0/0            10.119.240.10        /* default/kube-dns:dns */ udp dpt:53 redir ports 37723
REDIRECT   tcp  --  0.0.0.0/0            10.119.240.10        /* default/kube-dns:dns-tcp */ tcp dpt:53 redir ports 50126
REDIRECT   tcp  --  0.0.0.0/0            10.119.244.130       /* default/app-frontend-service: */ tcp dpt:80 redir ports 36970
REDIRECT   tcp  --  0.0.0.0/0            23.251.156.36        /* default/app-frontend-service: */ tcp dpt:80 redir ports 36970

この時点で、内部 IP と外部 IP の両方を使用してクラスター内からサービスにアクセスできます。

$ curl 10.119.244.130:80
app-frontend-5pl5s
$ curl 23.251.156.36:80
app-frontend-5pl5s

ファイアウォール ルールを追加しないと、パブリック IP にリモートで接続しようとするとタイムアウトになります。ファイアウォール ルールを追加すると、確実に接続が拒否されます。

$ curl 23.251.156.36
curl: (7) Failed to connect to 23.251.156.36 port 80: Connection refused

一部の iptables ロギングを有効にする場合:

sudo iptables -t nat -I KUBE-PORTALS-CONTAINER -m tcp -p tcp --dport 
80 -j LOG --log-prefix "WTF: "

そして、サービスのパブリック IP として設定されていた一時的な外部 IP アドレスではなく、VM の IP アドレスにパケットが到着していることは明らかですdmesgWTF

問題は、GCE が 2 種類の外部 IP を持っていることであることが判明しました: ForwardingRules (DSTIP をそのまま転送する) と 1-to-1 NAT (実際には DSTIP を内部 IP に書き換えます)。VM の外部 IP は後者のタイプであるため、ノードがパケットを受信すると、IP テーブル ルールが一致しません。

修正は実際には非常に単純です (ただし直感的ではありません)。サービス定義でノードの内部 IP をパブリック IP として使用します。service.yaml ファイルを更新して publicIPs を内部 IP (例: 10.240.121.42) に設定すると、GCE ネットワークの外部からアプリケーションにアクセスできるようになります。

于 2015-06-02T05:44:11.827 に答える
0

ノードの外部 IP アドレスをサービスのpublicIPsフィールドに追加すると、ノードの IP アドレスでサービスにアクセスできるようになります。クラスターに複数のノードがある場合、それらのいずれかでポッドへのアクセスを有効にしたい場合は、複数の IP アドレスをフィールドに入れることができます。

今後のリリースでは、ロード バランサーなしで外部サービスをセットアップするための、よりシンプルな組み込みオプションが提供される予定です。興味がある場合、または将来これを読む場合は、このドキュメントNodePortの更新された「外部サービス」セクションをチェックして、同じことをより簡単に達成するために use を使用する方法を確認してください。

于 2015-05-26T06:05:50.860 に答える