Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"

145 views

Published on

@サイバーエージェントとさくらインターネットのインフラ談義 11/14

サイバーエージェント アドテクスタジオ CIA では、プライベートクラウドに GKE互換のコンテナ基盤として AKE を提供しており、
既にプロダクションでも利用されています。
アドテクノロジーではレイテンシには非常にシビアなため、AKEではHardware LB と Kubernetes を連携することにしています。
オンプレ環境の Kubernetes の一方式として確立し、GKEと共存できるオンプレ環境を目指しています。

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"

  1. 1. On-premise コンテナ基盤と Hardware LB を使った “type LoadBalancer” @サイバーエージェントとさくらインターネットのインフラ談義
  2. 2. 青山 真也 (Masaya Aoyama) 普段の主な仕事↓ 世界で 138 番目 https://adtech.cyberagent.io/techblog/ archives/3086
  3. 3. adtech studio のプライベートクラウド環境 ・OpenStack をベースとしたプライベートクラウド環境 ・Network のレイテンシが許容されないアドテクシステム そんな弊社にも Production で利用可能な GKE ライクなコンテナ基盤 AKE (Adtech Container Engine)
  4. 4. GKE が Google Kubernetes Engine に GKE = Google Container Engine AKE = Adtech Container Engine 参考: https://cloudplatform.googleblog.com/2017/11/introducing-Certified-Kubernetes-and-Google-Kubernetes-Engine.html?utm_source=feedburner&ut m_medium=feed&utm_campaign=Feed:+ClPlBl+(Cloud+Platform+Blog)
  5. 5. みなさん Kubernetes って どういう環境で利用されていますか?
  6. 6. 素の Kubernetes を構築した場合 ① Dynamic Persistent Volume Provisioning が使えない ○ PVC の要求に応じて PV を動的に払い出す機能 3 GB の Persistent Volume 頂戴! 5 GBの Persistent Volume あげる! 5GB 10 GB 7 GB 事前に作成 事前に作成する手間、容量の無駄が発生しやすい
  7. 7. 素の Kubernetes を構築した場合 ① Dynamic Persistent Volume Provisioning が使えない ○ PVC の要求に応じて PV を動的に払い出す機能 3 GB の Persistent Volume 頂戴! 3 GBの Persistent Volume あげる! 3 GB 欲しいって言われたから 作って渡そう 利用者の管理コストが低下
  8. 8. おいでおいで〜 …
  9. 9. 素の Kubernetes を構築した場合 ② type LoadBalancer Service が使えない ○ クラスタ外 LoadBalancer を作成する機能
  10. 10. おいでおいで〜 …
  11. 11. 機能の実現と Cloud Provider ① Dynamic Persistent Volume Provisioning ● Kubernetes の Cloud Provider 連携機能を利用 ● Persistent Volume Plugin (ScaleIO, Flusterfs) ② type LoadBalancer ● Kubernetes の Cloud Provider 連携機能を利用 ○ 純粋なベアメタル/VM で Cloud Provider 連携してない場合は? ○ OpenStack で LBaaS 機能を利用していない場合は?
  12. 12. This is a slide title 今回は AKE の中でも、 LoadBalancer 周りの話をします。
  13. 13. AKE 1.0 の構成 (NodePort + Metal LB) eth0: 10.0.0.1:34567 VM α Kubernets node Internal VM β Kubernets node 52.0.0.1:80 LoadBalancer External apiVersion: v1 kind: Service metadata: name: svc1 spec: type: NodePort ports: - name: "http-port" protocol: "TCP" port: 80 targetPort: 80 52.0.0.1:80 > 10.0.0.1:34567 > 10.0.0.2:34567 (cli で登録が必要) eth0: 10.0.0.2:34567
  14. 14. AKE 1.0 の構成 (NodePort + Metal LB + (HAProxy)) VM α Kubernets node Internal VM β Kubernets node 52.0.0.1:80 LoadBalancer (+ HAProxy) External 52.0.0.1:80 > 10.0.0.1:34567 > 10.0.0.2:34567 (cli で登録が必要) apiVersion: v1 kind: Service metadata: name: svc1 spec: type: NodePort ports: - name: "http-port" protocol: "TCP" port: 80 targetPort: 80 eth0: 10.0.0.1:34567 eth0: 10.0.0.2:34567
  15. 15. SNAT, NAPT ができない場合 VM α Kubernets node Internal VM β Kubernets node 52.0.0.1:80 LoadBalancer External 仮に Service が増えたことを考えると、 こんな感じになります 52.0.0.1:80 > VM α:80 > VM β:80 52.0.0.2:80 > VM α:80 > VM β:80 lo.0: 52.0.0.1:80 lo.1: 52.0.0.2:80 lo.0: 52.0.0.1:80 lo.1: 52.0.0.2:80
  16. 16. SNAT, NAPT ができない場合 VM α Kubernets node Internal VM β Kubernets node 52.0.0.1:80 LoadBalancer External 52.0.0.1:80 > VM α:80 > VM β:80 52.0.0.2:80 > VM α:80 > VM β:80 NodePort は Interface 全てで Bind されてしまうため利用出来ない 例: *:80 apiVersion: v1 kind: Service metadata: name: svc2 spec: type: NodePort ports: - name: "http-port" protocol: "TCP" port: 80 targetPort: 80 apiVersion: v1 kind: Service metadata: name: svc1 spec: type: NodePort ports: - name: "http-port" protocol: "TCP" port: 80 targetPort: 80 lo.0: 52.0.0.1:80 lo.1: 52.0.0.2:80 lo.0: 52.0.0.1:80 lo.1: 52.0.0.2:80
  17. 17. SNAT, NAPT ができない場合 VM α Kubernets node Internal VM β Kubernets node 52.0.0.1:80 LoadBalancer External externalIPs 使えば いけないことも無いが … 利便性が著しく低い … metadata: name: svc1 spec: externalIPs: - 52.0.0.1 ports: - name: "http-port" protocol: "TCP" port: 80 targetPort: 80 52.0.0.1:80 > VM α:80 > VM β:80 52.0.0.2:80 > VM α:80 > VM β:80 … metadata: name: svc2 spec: externalIPs: - 52.0.0.2 ports: - name: "http-port" protocol: "TCP" port: 80 targetPort: 80 lo.0: 52.0.0.1:80 lo.1: 52.0.0.2:80 lo.0: 52.0.0.1:80 lo.1: 52.0.0.2:80
  18. 18. おいでおいで〜 …
  19. 19. This is a slide title ① SNAT, NAPT が必須な構成 ボトルネック or リソースが必要 ② 外部のコマンドでやってもらうの不便 やっぱりGKE がいいって言われる
  20. 20. VM α Kubernets node Internal VM β Kubernets node 52.0.0.1:80 LoadBalancer External 52.0.0.1:80 > VM α:80 > VM β:80 52.0.0.2:80 > VM α:80 > VM β:80 apiVersion: v1 kind: Service metadata: name: svc2 spec: type: ClusterIP ports: - name: "http-port" protocol: "TCP" port: 80 targetPort: 80 apiVersion: v1 kind: Service metadata: name: svc1 spec: type: ClusterIP ports: - name: "http-port" protocol: "TCP" port: 80 targetPort: 80 AKE 2.0 の構成 (ClusterIP + Metal LB)
  21. 21. VM α Kubernets node Internal VM β Kubernets node 52.0.0.1:80 LoadBalancer External 52.0.0.1:80 > VM α:80 > VM β:80 52.0.0.2:80 > VM α:80 > VM β:80 apiVersion: v1 kind: Service metadata: name: svc2 spec: type: ClusterIP ports: - name: "http-port" protocol: "TCP" port: 80 targetPort: 80 apiVersion: v1 kind: Service metadata: name: svc1 spec: type: ClusterIP ports: - name: "http-port" protocol: "TCP" port: 80 targetPort: 80 AKE 2.0 の構成 (ClusterIP + Metal LB) 自前で動的に iptables を書き換えて頑張る (listen しない、ClusterIP を利用) 52.0.0.1:80 宛にきたパケットを 該当 Service の KUBE-SVC-* に転送
  22. 22. This is a slide title ① SNAT, NAPT が必須な構成 ボトルネック or リソースが必要 ② 外部のコマンドでやってもらうの不便 やっぱりGKE がいいって言われる
  23. 23. This is a slide titleやっぱ諦められない type LoadBalancer
  24. 24. This is a slide title ① 外部 LoadBalancer の操作 ② IP 払い出しの自動化 ③ K8s Node の iptables 操作
  25. 25. type LoadBalancer のつくりかた CloudProvider プラグインを自作しましょう。 ● LoadBalancer (今回はここの話) ● Routing ● Host ● Zone ● BlockDevice (参考) インターフェースの一覧: pkg/cloudprovider/cloud.go OpenStack の場合、pkg/cloudprovider/providers/openstack/* 辺り
  26. 26. LoadBalancer 用の Interface GetLoadBalancer(clusterName string, service *v1.Service)  ・あまり変える部分はない EnsureLoadBalancer(clusterName string, service *v1.Service, nodes []*v1.Node)  ・LoadBalancer を作成する、IP の指定がない場合は自動アサイン UpdateLoadBalancer(clusterName string, service *v1.Service, nodes []*v1.Node)  ・LoadBalancer を更新する EnsureLoadBalancerDeleted(clusterName string, service *v1.Service)  ・LoadBalancer を削除する 大まかには上記 3 種類の Interface を実装してあげる形 渡ってくる構造体に必要な情報は大体揃っている service.Name service.Spec.LoadBalancerIP service.Spec.Ports[].Port service.Spec.Ports[].TargetPort nodes.[].Name
  27. 27. This is a slide title この 4 つの関数を作ると
  28. 28. VM α Kubernets node Internal VM β Kubernets node 52.0.0.1:80 LoadBalancer External 52.0.0.1:80 > VM α:80 > VM β:80 52.0.0.2:80 > VM α:80 > VM β:80 apiVersion: v1 kind: Service metadata: name: svc2 spec: type: LoadBalancer ports: - name: "http-port" protocol: "TCP" port: 80 targetPort: 80 apiVersion: v1 kind: Service metadata: name: svc1 spec: type: LoadBalancer ports: - name: "http-port" protocol: "TCP" port: 80 targetPort: 80 AKE 3.0 の構成 (LoadBalancer + Metal LB) GKE などと全く同じ type LoadBalancer
  29. 29. 今後オンプレにより求められるのは、 パブリッククラウドとのシームレスな統合 コンテナ環境だとなおさら移行し易い GKE > AKE & AKE > GKE これでマルチクラウドでの展開も容易に
  30. 30. This is a slide title ちょっとまった Ingress ってのもいるよね?
  31. 31. おいでおいで〜 …
  32. 32. 残すところ Ingress HTTP LoadBalancer を提供する Ingress ● GKE 様だと L7 GCLB 様がいらっしゃられる ● それ以外は {nginx, nghttpx}-ingress-controller を使う ○ ちょっと使い勝手が悪い、手間が多い、 GKE とは結構違う 現在 GKE Like に Ingress を使えるように controller を実装中。 ● 12/1 の Kubernetes Advent Calender で公開予定

×