Kubernetes クラスターのセットアップ後、Keepalived はトラフィックを BACKUP ノードに転送しません

Kubernetes クラスターのセットアップ後、Keepalived はトラフィックを BACKUP ノードに転送しません

システム構造:

  • 10.10.1.86: Kubernetes マスターノード
  • 10.10.1.87: Kubernetes ワーカー 1 ノード; keepalivedMASTER ノード
  • 10.10.1.88: Kubernetes ワーカー 2 ノード;keepalivedバックアップ ノード
  • 10.10.1.90: VIP は、によって実装された.87& ;に負荷分散します。.88keepalived

この Kubernetes クラスターは開発環境であり、Netflow ログの収集をテストします。

私が達成したいことは次のとおりです。

  1. すべてのルータ/スイッチのネットフローログの最初の出力.90
  2. 次に、 (:) を使用して、2 つの Kubernetes ワーカーである&にkeepalived負荷分散します。lb_kindNAT.87.88
  3. NodePortこれらのトラフィックを Kubernetes クラスターにキャッチし、残りのデータ解析ジョブを実行するサービスがあります。
  • 何かのようなもの:
        |                {OS Network}                   |   {Kubernetes Network}

                                K8s Worker -> filebeat -> logstash (deployments)
                              /
<data> -> [VIP] load balance
                              \ 
                                K8s Worker -> filebeat -> logstash (deployments)
  • filebeat.yml (filebeat 後にトラフィックがすべて正常であることをテストしたので、file出力を使用して根本原因を絞り込みます。)
# cat filebeat.yml
filebeat.inputs:

- type: tcp
  max_message_size: 10MiB
  host: "0.0.0.0:5100"

- type: udp
  max_message_size: 10KiB
  host: "0.0.0.0:5150"




#output.logstash:
#  hosts: ["10.10.1.87:30044", "10.10.1.88:30044"]
output.file:
  path: "/tmp/"
  filename: tmp-filebeat.out

クベネフィット

  • マスターとワーカーは、GCP または AWS プロバイダーではなく、プライベート環境内の 3 つの VM です。
  • バージョン:
# kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:31:21Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:25:06Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"linux/amd64"}
  • サービス
# cat logstash.service.yaml
apiVersion: v1
kind: Service
metadata:
  name: logstash-service
spec:
  type: NodePort
  selector:
    app: logstash
  ports:
    - port: 9514
      name: tcp-port
      targetPort: 9514
      nodePort: 30044
  • データが Kubernetes に取り込まれると、すべて正常に動作します。
  • VIP ロードバランスが転送されていませんでした。

キープアライブ設定

!Configuration File for keepalived
global_defs {
  router_id proxy1   # `proxy 2` at the other node
}


vrrp_instance VI_1 {
  state MASTER       # `BACKUP` at the other node
  interface ens160
  virtual_router_id 41
  priority 100       # `50` at the other node
  advert_int 1
  virtual_ipaddress {
    10.10.1.90/23
  }
}

virtual_server 10.10.1.90 5100 {
  delay_loop 30
  lb_algo rr
  lb_kind NAT
  protocol TCP
  persistence_timeout 0

  real_server 10.10.1.87 5100 {
    weight 1
  }
  real_server 10.10.1.88 5100 {
    weight 1
  }
}
virtual_server 10.10.1.90 5150 {
  delay_loop 30
  lb_algo rr
  lb_kind NAT
  protocol UDP
  persistence_timeout 0

  real_server 10.10.1.87 5150 {
    weight 1
  }
  real_server 10.10.1.88 5150 {
    weight 1
  }

Kubernetesクラスタのセットアップ前に動作します

  • と の両方に.87.88インストールされておりkeepalivedrr(ラウンドロビン) 負荷分散は正常に機能します (TCP および UDP)。
  • 念のため、Kubernetes クラスターをセットアップするときは、keepalivedサービス ( ) を停止してください。systemctl stop keepalived

Kubernetesクラスタのセットアップ後に問題が発生しました

  • MASTER ノードのみが.87トラフィックを転送でき、VIP は BACKUP ノードに転送できないことがわかりました.88
  • MASTER から転送されたデータは、KubernetesNodePortとデプロイメントによって正常にキャッチされます。

問題テストnc

  • nc: VIP (マスター ノード) を保持しているユーザーのみがトラフィックを転送できます。BACKUPrrに転送する場合は、タイムアウトが表示されます。
  • 両方のサーバーでテストしましたがnc -l 5100、マスターノードのみが結果を取得しました。
# echo "test" | nc 10.10.1.90 5100
# echo "test" | nc 10.10.1.90 5100
Ncat: Connection timed out.
# echo "test" | nc 10.10.1.90 5100
# echo "test" | nc 10.10.1.90 5100
Ncat: Connection timed out.

いくつかの情報

  • パッケージバージョン
# rpm -qa |grep keepalived
keepalived-1.3.5-19.el7.x86_64
  • Kubernetes CNI:Calico
# kubectl get pod -n kube-system
NAME                                      READY   STATUS    RESTARTS   AGE
calico-kube-controllers-b656ddcfc-wnkcj   1/1     Running   2          78d
calico-node-vnf4d                         1/1     Running   8          78d
calico-node-xgzd5                         1/1     Running   1          78d
calico-node-zt25t                         1/1     Running   8          78d
coredns-558bd4d5db-n6hnn                  1/1     Running   2          78d
coredns-558bd4d5db-zz2rb                  1/1     Running   2          78d
etcd-a86.axv.bz                           1/1     Running   2          78d
kube-apiserver-a86.axv.bz                 1/1     Running   2          78d
kube-controller-manager-a86.axv.bz        1/1     Running   2          78d
kube-proxy-ddwsr                          1/1     Running   2          78d
kube-proxy-hs4dx                          1/1     Running   3          78d
kube-proxy-qg2nq                          1/1     Running   1          78d
kube-scheduler-a86.axv.bz                 1/1     Running   2          78d
  • ipvsadm.87( 、でも同じ結果.88)
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.10.1.90:5100 rr
  -> 10.10.1.87:5100              Masq    1      0          0
  -> 10.10.1.88:5100              Masq    1      0          0
UDP  10.10.1.90:5150 rr
  -> 10.10.1.87:5150              Masq    1      0          0
  -> 10.10.1.88:5150              Masq    1      0          0
  • Selinuxは常にPermissive
  • 停止してもfirewalld、まだ動作しません。
  • sysctl違い:
# before:
net.ipv4.conf.all.accept_redirects = 1
net.ipv4.conf.all.forwarding = 0
net.ipv4.conf.all.route_localnet = 0
net.ipv4.conf.default.forwarding = 0
net.ipv4.conf.lo.forwarding = 0
net.ipv4.ip_forward = 0

# after
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.all.route_localnet = 1
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.lo.forwarding = 1
net.ipv4.ip_forward = 1

今さらに確認できるかどうかわかりませんが、アドバイスをお願いします。ありがとうございます!

関連情報