22

2 つのミニオンで実行されている kubernetes クラスターがあります。現在、私は2つのステップでサービスにアクセスできるようにしています:

  1. レプリケーション コントローラーとポッドを開始する
  2. kubectl get minions( を使用して)ミニオン IP を取得し、それを Service のpublicIPsとして設定します。

サービスを公開するために推奨される方法は何ですか? 個々のミニオン IP の IP をハードコーディングしているため、私のアプローチは間違っているようです。また、クライアントは個々のミニオンで実行されているサービスに直接アクセスする必要があるため、kubernetes サービスの負荷分散機能をバイパスしているようにも見えます。

私が使用するレプリケーションコントローラーとポッドをセットアップするには:

id: frontend-controller
kind: ReplicationController
apiVersion: v1beta1
desiredState:
  replicas: 2
  replicaSelector:
    name: frontend-pod
  podTemplate:
    desiredState:
      manifest:
        version: v1beta1
        id: frontend-pod
        containers:
          - name: sinatra-docker-demo
            image: madisn/sinatra_docker_demo
            ports:
              - name: http-server
                containerPort: 4567
    labels:
      name: frontend-pod

サービスをセットアップするには (minion ip-s を取得した後):

kind: Service
id: frontend-service
apiVersion: v1beta1
port: 8000
containerPort: http-server
selector:
  name: frontend-pod
labels:
  name: frontend
publicIPs: [10.245.1.3, 10.245.1.4]
4

5 に答える 5

8

上記のコメントで述べたように、createExternalLoadBalancer はあなたが探している適切な抽象化ですが、残念ながらすべてのクラウド プロバイダー、特にローカルで使用している vagrant にはまだ実装されていません。

1 つのオプションは、外部化するすべてのサービスのクラスター内のすべてのミニオンにパブリック IP を使用することです。サービス宛てのトラフィックはミニオンの 1 つに到達し、そこで kube-proxy プロセスによってインターセプトされ、サービスのラベル セレクターに一致するポッドにリダイレクトされます。これにより、ネットワーク全体で余分なホップが発生する可能性があります (ポッドがローカルで実行されていないノードに到達した場合) が、ネットワーク遅延の影響をあまり受けないアプリケーションの場合、これはおそらく気にならないでしょう。

于 2015-04-23T04:36:09.820 に答える
7

ロバートが返信で言ったように、これは近々登場するものですが、残念ながらまだ利用できません.

現在、データセンター ネットワークで Kubernetes クラスターを実行しています。1 つのマスターと 3 つのミニオンがすべて CentOS 7 仮想 (vcenter) で実行されています。これを処理した方法は、専用の「kube-proxy」サーバーを作成することでした。私は基本的に、Kube-Proxy サービスを (ネットワーク用の Flannel と共に) 実行し、このサーバーに接続されたネットワーク アダプターに「パブリック」IP アドレスを割り当てています。パブリックとは、ローカル データセンター ネットワーク上のアドレスを意味します。次に、クラスターの外部にアクセスするサービスを作成するときに、publicIPs 値を kube-proxy サーバーで使用可能な IP アドレスの 1 つに設定します。誰かまたは何かがクラスターの外部からこのサービスに接続しようとすると、kube-proxy にヒットし、適切なミニオンにリダイレクトされます。

これは回避策のように思えるかもしれませんが、実際には、この問題に対するビルトイン ソリューションを思いついたときに起こると予想されることと似ています。

于 2015-04-27T00:48:39.783 に答える
2

クラスターをローカルで実行している場合、私が使用した解決策は、サービス定義で nodeport ディレクティブを使用して kubernetes ノードでサービスを公開し、HAproxy を使用してクラスター内のすべてのノードにラウンドロビンすることでした。

ノードポートの公開は次のようになります。

apiVersion: v1
kind: Service
metadata:
  name: nginx-s
  labels:
    name: nginx-s
spec:
  type: NodePort
  ports:
    # must match the port your container is on in your replication controller
    - port: 80
      nodePort: 30000
  selector:
    name: nginx-s

注: 指定する値は、ノード ポートの設定範囲内にある必要があります。(デフォルト: 30000-32767)

これにより、クラスター内のすべてのノードの特定のノードポートでサービスが公開されます。次に、haproxy を実行する内部ネットワーク上に別のマシンをセットアップし、指定したノードポートで外部から到達可能なファイアウォールを公開します。

ホストの 1 つで nat テーブルを見ると、それが何をしているかがわかります。

root@kube01:~# kubectl create -f nginx-s.yaml
You have exposed your service on an external port on all nodes in your
cluster.  If you want to expose this service to the external internet, you may
need to set up firewall rules for the service port(s) (tcp:30000) to serve traffic.

See http://releases.k8s.io/HEAD/docs/user-guide/services-firewalls.md for more details.
services/nginx-s
root@kube01:~# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
KUBE-PORTALS-CONTAINER  all  --  anywhere             anywhere             /* handle ClusterIPs; NOTE: this must be before the NodePort rules */
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL
KUBE-NODEPORT-CONTAINER  all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL /* handle service NodePorts; NOTE: this must be the last rule in the chain */

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
KUBE-PORTALS-HOST  all  --  anywhere             anywhere             /* handle ClusterIPs; NOTE: this must be before the NodePort rules */
DOCKER     all  --  anywhere            !127.0.0.0/8          ADDRTYPE match dst-type LOCAL
KUBE-NODEPORT-HOST  all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL /* handle service NodePorts; NOTE: this must be the last rule in the chain */

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        anywhere

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Chain KUBE-NODEPORT-CONTAINER (1 references)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             anywhere             /* default/nginx-s: */ tcp dpt:30000 redir ports 42422

Chain KUBE-NODEPORT-HOST (1 references)
target     prot opt source               destination
DNAT       tcp  --  anywhere             anywhere             /* default/nginx-s: */ tcp dpt:30000 to:169.55.21.75:42422

Chain KUBE-PORTALS-CONTAINER (1 references)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             192.168.3.1          /* default/kubernetes: */ tcp dpt:https redir ports 51751
REDIRECT   tcp  --  anywhere             192.168.3.192        /* default/nginx-s: */ tcp dpt:http redir ports 42422

Chain KUBE-PORTALS-HOST (1 references)
target     prot opt source               destination
DNAT       tcp  --  anywhere             192.168.3.1          /* default/kubernetes: */ tcp dpt:https to:169.55.21.75:51751
DNAT       tcp  --  anywhere             192.168.3.192        /* default/nginx-s: */ tcp dpt:http to:169.55.21.75:42422
root@kube01:~#

特にこの一行

DNAT       tcp  --  anywhere             anywhere             /* default/nginx-s: */ tcp dpt:30000 to:169.55.21.75:42422

最後に、netstat を見ると、kube-proxy がそのポートでそのサービスをリッスンして待機していることがわかります。

root@kube01:~# netstat -tupan | grep 42422
tcp6       0      0 :::42422                :::*                    LISTEN      20748/kube-proxy
root@kube01:~#

Kube-proxy は、各サービスのポートをリッスンし、コンテナーが存在する仮想サブネットにネットワーク アドレスを変換します。


2 ノード クラスターの場合、HAproxy 構成は次のようになります。

listen sampleservice 0.0.0.0:80
    mode http
    stats enable
    balance roundrobin
    option httpclose
    option forwardfor
    server noname 10.120.216.196:30000 check
    server noname 10.155.236.122:30000 check
    option httpchk HEAD /index.html HTTP/1.0

そして、HAproxy を介してポート 80 でサービスに到達できるようになりました。いずれかのノードがダウンした場合、コンテナーはレプリケーション コントローラーのおかげで別のノードに移動され、HAproxy は稼働中のノードにのみルーティングされます。

他の人がどのような方法を使用したのか興味がありますが、それは私が思いついたものです. 通常、スタック オーバーフローについて投稿することはないので、規則や適切な書式に従っていない場合は申し訳ありません。

于 2016-05-05T00:15:37.433 に答える
1

This is for MrE. I did not have enough space in the comments area to post this answer so I had to create another answer. Hope this helps:

We have actually moved away from Kubernetes since posting this reply. If I remember correctly though all I really had to do was run the kube-proxy executable on a dedicated CentOS VM. Here is what I did:

First I removed Firewalld and put iptables in place. Kube-proxy relies on iptables to handle its NAT and redirections.

Second, you need to install flanneld so you can have a bridge adapter on the same network as the Docker services running on your minions.

Then what I did was assign multiple ip addresses to the local network adapter installed on the machine. These will be the ip addresses you can use when setting up a service. These will be the addresses available OUTSIDE your cluster.

Once that is all taken care of you can start the proxy service. It will connect to the Master, and grab an IP address for the flannel bridge network. Then it will sync up all the IPtables rules and you should be set. Every time a new service is added it will create the proxy rules and replicate those rules across all minions (and your proxy). As long as you specified an ip address available on your proxy server then that proxy server will forward all traffic for that ip address over to the proper minion.

Hope this is a little more clear. Remember though I have not been part of the Kubernetes project for about 6 months now so I am not sure what changed have been made since I left. They might even have a feature in place that handles this sort of thing. If not hopefully this helps you get it taken care of.

于 2015-12-20T13:16:58.483 に答える