2017-08-01 5 views
2

Azureでホストされているkubernetesクラスタにマルチブローカーkafkaを設定しようとしています。私は1つのブローカセットアップが動作しています。マルチブローカーの設定では、カフカサービスを管理する飼育係ノード(3)のアンサンブルがあります。私はkafkaクラスターを複製係数3の複製コントローラーとして展開しています。それは3つのブローカーです。 3つのブローカーをZookeeperに登録するにはどうすればZookeeperと異なるIPアドレスを登録するのですか?kubernetes上のKafkaマルチブローカーのセットアップのために宣伝されたリスナーを指定する方法と、そのクラスターを経験的に公開する方法はありますか?

サービスの展開後にレプリケーションコントローラを起動し、レプリケーションコントローラのyamlファイルでCluster IPを使用して、SSL用とPLAINTEXTの2つのadvertised.listenersを指定します。ただし、このシナリオでは、すべてのブローカーが同じIPで登録し、レプリカへの書き込みに失敗します。スケーラビリティが問題になるため、各ブローカを個別のレプリケーションコントローラ/ポッドとサービスとして展開する必要はありません。私は本当にこれに関する考え/アイデアを感謝します。

編集1:

私はさらに、クラウド内の別のVPCにクラスタを公開しようとしています。私は、advertized.listenersを使ってクライアントにSSLとPLAINTEXTポートを公開する必要があります。複製ファクタが3のステートフルセットを使用し、kubernetesがポッドの正規のホスト名をホスト名として公開する場合、これらは外部クライアントからは解決できません。私がこの作業を行う唯一の方法は、各ブローカに対応する外部サービスを使用/公開することです。しかし、これはスケールされません。

+0

この問題を解決できましたか? –

+0

こんにちはマイク、私はカフカの "スケーラビリティの容易さ"の問題を解決していません。私は、ブローカーごとに異なるポートを持つingress-IP-address(私のkubernetesクラスター):portとして、アドバタイズされたホストでステートフルセット(一貫性のあるボリューム用)で各ブローカーを使用しています。これは、新しいポートをより多くのブローカのために開く必要があり、broker.yamlのアドバタイズされたポートをそれに応じて変更する必要があるため、スケーリングが困難です。 – Annu

答えて

1

Kubernetesは、これらの問題を解決するためにStatefulsetsという概念を持っています。ステートフルセットの各インスタンスには独自のDNS名があるため、各インスタンスをDNS名で参照できます。

このコンセプトは、hereで詳しく説明されています。このcomplete exampleを見ることもできます:

apiVersion: v1 
kind: Service 
metadata: 
    name: zk-headless 
    labels: 
    app: zk-headless 
spec: 
    ports: 
    - port: 2888 
    name: server 
    - port: 3888 
    name: leader-election 
    clusterIP: None 
    selector: 
    app: zk 
--- 
apiVersion: v1 
kind: ConfigMap 
metadata: 
    name: zk-config 
data: 
    ensemble: "zk-0;zk-1;zk-2" 
    jvm.heap: "2G" 
    tick: "2000" 
    init: "10" 
    sync: "5" 
    client.cnxns: "60" 
    snap.retain: "3" 
    purge.interval: "1" 
--- 
apiVersion: policy/v1beta1 
kind: PodDisruptionBudget 
metadata: 
    name: zk-budget 
spec: 
    selector: 
    matchLabels: 
     app: zk 
    minAvailable: 2 
--- 
apiVersion: apps/v1beta1 
kind: StatefulSet 
metadata: 
    name: zk 
spec: 
    serviceName: zk-headless 
    replicas: 3 
    template: 
    metadata: 
     labels: 
     app: zk 
     annotations: 
     pod.alpha.kubernetes.io/initialized: "true" 

    spec: 
     affinity: 
     podAntiAffinity: 
      requiredDuringSchedulingIgnoredDuringExecution: 
      - labelSelector: 
       matchExpressions: 
        - key: "app" 
        operator: In 
        values: 
        - zk-headless 
       topologyKey: "kubernetes.io/hostname" 
     containers: 
     - name: k8szk 
     imagePullPolicy: Always 
     image: gcr.io/google_samples/k8szk:v1 
     resources: 
      requests: 
      memory: "4Gi" 
      cpu: "1" 
     ports: 
     - containerPort: 2181 
      name: client 
     - containerPort: 2888 
      name: server 
     - containerPort: 3888 
      name: leader-election 
     env: 
     - name : ZK_ENSEMBLE 
      valueFrom: 
      configMapKeyRef: 
       name: zk-config 
       key: ensemble 
     - name : ZK_HEAP_SIZE 
      valueFrom: 
      configMapKeyRef: 
       name: zk-config 
       key: jvm.heap 
     - name : ZK_TICK_TIME 
      valueFrom: 
      configMapKeyRef: 
       name: zk-config 
       key: tick 
     - name : ZK_INIT_LIMIT 
      valueFrom: 
      configMapKeyRef: 
       name: zk-config 
       key: init 
     - name : ZK_SYNC_LIMIT 
      valueFrom: 
      configMapKeyRef: 
       name: zk-config 
       key: tick 
     - name : ZK_MAX_CLIENT_CNXNS 
      valueFrom: 
      configMapKeyRef: 
       name: zk-config 
       key: client.cnxns 
     - name: ZK_SNAP_RETAIN_COUNT 
      valueFrom: 
      configMapKeyRef: 
       name: zk-config 
       key: snap.retain 
     - name: ZK_PURGE_INTERVAL 
      valueFrom: 
      configMapKeyRef: 
       name: zk-config 
       key: purge.interval 
     - name: ZK_CLIENT_PORT 
      value: "2181" 
     - name: ZK_SERVER_PORT 
      value: "2888" 
     - name: ZK_ELECTION_PORT 
      value: "3888" 
     command: 
     - sh 
     - -c 
     - zkGenConfig.sh && zkServer.sh start-foreground 
     readinessProbe: 
      exec: 
      command: 
      - "zkOk.sh" 
      initialDelaySeconds: 15 
      timeoutSeconds: 5 
     livenessProbe: 
      exec: 
      command: 
      - "zkOk.sh" 
      initialDelaySeconds: 15 
      timeoutSeconds: 5 
     volumeMounts: 
     - name: datadir 
      mountPath: /var/lib/zookeeper 
     securityContext: 
     runAsUser: 1000 
     fsGroup: 1000 
    volumeClaimTemplates: 
    - metadata: 
     name: datadir 
    spec: 
     accessModes: [ "ReadWriteOnce" ] 
     resources: 
     requests: 
      storage: 20Gi 
+0

こんにちはルーカス、応答に感謝します。しかし、私の懸念は、レプリケート・コントローラの一部であるすべてのブローカがzookeeperと同じadvertised.listenerホストとポートに登録していることです。彼らはステートフルセットの一部である場合、彼らは異なって登録しますか?彼らはまだ同じホストとポートを宣伝していますか?それにもかかわらず、私はアプローチを試してみましょう! – Annu

+0

こんにちは@Annu、このアプローチはKubernetesで複数の飼い犬飼育係と複数のブローカーKafkaクラスターを実行する実績のある方法です。あなたは、HelmとKubernetesで良いデフォルトのKafka展開を示すhttps://github.com/kubernetes/charts/tree/master/incubator/kafkaを見ることができます。 –

+0

こんにちは@Luckas、私はまだこれをStatefulSetで動作させるのに苦労しています。私は、SSLとPLAINTEXTポートを公開するためにadvertised.listenersを使用しています。私の問題は、クラウド内の別のVPCを介してクラスタにアクセスできる必要があることです。私のカフカの理解は、プロデューサー/消費者がブローカーにデータを読み書きするために直接接続(解決)できる必要があるということです。私は私のブローカーを公開するために3つの異なるサービスを使用したくありません。しかし、私はそれについて別の方法を見ていない。 – Annu

関連する問題