CyberAgent: How We Deployed
Production Kubernetes Clusters
on OpenStack without L3 Network
青山 真也 (Masaya Aoyama)
普段の主な仕事↓
世界で 138 番目
https://adtech.cyberagent.io/techblog/
archives/3086
adtech studio のプライベートクラウド環境
・OpenStack をベースとしたプライベートクラウド環境
・Network のレイテンシが許容されないアドテクシステム
そんな弊社にも Production で利用可能な
GKE ライクなコンテナ基盤
AKE (Adtech Container Engine)
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)
みなさん Kubernetes って
どういう環境で利用されていますか?
L3 Network の機能が必要
LoadBalancer as a Service が必要
細かい設定が困難
成熟度が高くはない
OpenStack 界隈の方々だと…
AKE の場合
Resource Group として作成し、スケーリング可能に
 Interface は別の Resource Group として作成し、
 Master 構築時に全 IP Address を利用(etcd など)
Heat の Custom Resource Plugins を自作
LoadBalancer を操作して VIP の払い出し
(自動割当て機構を含む)
参考: https://adtech.cyberagent.io/techblog/archives/2594
Designate を使った簡易 DNS Round Robin
クライアントからはクラスタ名だけで疎通可能になる VIPが
必要な場合、CLI からopenstack stack show して
 取得する必要があるが、結構レスポンスが悪いので …
Kubernetes の OpenStack Integration 機能(後述)を
有効化する設定をした Kubernetes をデプロイ
素の Kubernetes を構築した場合
① Dynamic Persistent Volume Provisioning が使えない
○ PVC の要求に応じて PV を動的に払い出す機能
3 GB の Persistent Volume
頂戴!
5 GBの Persistent Volume
あげる!
5GB
10 GB
7 GB
事前に作成
事前に作成する手間、容量の無駄が発生しやすい
素の Kubernetes を構築した場合
① Dynamic Persistent Volume Provisioning が使えない
○ PVC の要求に応じて PV を動的に払い出す機能
3 GB の Persistent Volume
頂戴!
3 GBの Persistent Volume
あげる!
3 GB
欲しいって言われたから
作って渡そう
利用者の管理コストが低下
おいでおいで〜
…
素の Kubernetes を構築した場合
② type LoadBalancer Service が使えない
○ クラスタ外 LoadBalancer を作成する機能
別の手段: type NodePort の話
eth0: 10.0.0.1:34567
VM α
Kubernets node
Internal
VM β
Kubernets node
apiVersion: v1
kind: Service
metadata:
name: svc1
spec:
type: NodePort
ports:
- name: "http-port"
protocol: "TCP"
port: 80
targetPort: 80
eth0: 10.0.0.2:34567
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
(別途登録が必要)
eth0: 10.0.0.2:34567
SNAT + NAPT
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
(別途登録が必要)
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
SNAT + NAPT
This is a slide title
① SNAT, NAPT が必須な構成
ボトルネック or リソースが必要
② 外部のコマンドでやってもらうの不便
自動 IP 払い出しとかも無い上、二度手間
おいでおいで〜
…
機能の実現と Cloud Provider
① Dynamic Persistent Volume Provisioning
● Kubernetes の Cloud Provider 連携機能を利用
● Persistent Volume Plugin (ScaleIO, Flusterfs)
② type LoadBalancer
● Kubernetes の Cloud Provider 連携機能を利用
○ 純粋なベアメタル/VM で Cloud Provider 連携してない場合は?
○ OpenStack で LBaaS 機能を利用していない場合は?
■ Neutron L3 Agent、Octavia は未使用
Kubernetes の CoudProvider プラグイン
CloudProvider プラグインには主に下記のようなものがあります
● Routing
● Host
● Zone
● BlockDevice
● LoadBalancer (今回はここの話)
(参考)
インターフェースの一覧: pkg/cloudprovider/cloud.go
OpenStack の場合、pkg/cloudprovider/providers/openstack/* 辺り
This is a slide title
今回は AKE の中でも、
LoadBalancer 周りの話をします。
Kubernetes の CloudProvider 連携機能(LBaaS)
① CloudProvider 連携で Neutron に LB の作成依頼
② Octavia で LB を作成(LBaaS v1 は 1.8.0 で打ち切り)
This is a slide titleKubernetes の CloudProvider 連携機能(LBaaS)
① CloudProvider 連携で Neutron に LB の作成依頼
② BIG-IP で LB を作成(多分プラグイン書けばいけるのかな…)
This is a slide titleKubernetes の CloudProvider 連携機能(LBaaS)
① Kubernetes の CloudProvider 連携のコードを変更して、
  直接 BIG-IP を操作
This is a slide title
① 外部 LoadBalancer の操作
② IP 払い出しの自動化
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
今後オンプレにより求められるのは、
パブリッククラウドとのシームレスな統合
コンテナ環境だとなおさら移行し易い
GKE > AKE & AKE > GKE
これでマルチクラウドでの展開も容易に
This is a slide title
ちょっとまった
Ingress ってのもいるよね?
おいでおいで〜
…
残すところ Ingress
HTTP LoadBalancer を提供する Ingress
● GKE 様だと L7 GCLB 様がいらっしゃられる
● それ以外は {nginx, nghttpx}-ingress-controller を使う
○ ちょっと使い勝手が悪い、手間が多い、 GKE とは結構違う
現在 GKE Like に Ingress を使えるように controller を実装中。
● 12/1 の Kubernetes Advent Calender で公開予定
This is a slide title
付録
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
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
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
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
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
This is a slide title
① SNAT, NAPT が必須な構成
ボトルネック or リソースが必要
② 外部のコマンドでやってもらうの不便
やっぱりGKE がいいって言われる
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)
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-* に転送
This is a slide title
① SNAT, NAPT が必須な構成
ボトルネック or リソースが必要
② 外部のコマンドでやってもらうの不便
やっぱりGKE がいいって言われる
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

More Related Content

PDF
自動化ハンズオン
PDF
On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"
PDF
Kubernetes をいじって Hardware LoadBalancer で "type LoadBalancer" を実現してみた @Kuberne...
PDF
Openstack ceph 20171115 vtj
PPTX
OpenStack Summit Sydney Report (NEC鳥居) - OpenStack最新情報セミナー
PPTX
Japan Container Day 2018
PPTX
OpenStack Summit & KubeConからみるコンテナ技術の最新トレンド - OpenStack Day Tokyo 2018講演資料
PPTX
○○○で作るOpenStack+Contrail環境
自動化ハンズオン
On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"
Kubernetes をいじって Hardware LoadBalancer で "type LoadBalancer" を実現してみた @Kuberne...
Openstack ceph 20171115 vtj
OpenStack Summit Sydney Report (NEC鳥居) - OpenStack最新情報セミナー
Japan Container Day 2018
OpenStack Summit & KubeConからみるコンテナ技術の最新トレンド - OpenStack Day Tokyo 2018講演資料
○○○で作るOpenStack+Contrail環境

What's hot (20)

PDF
実環境での運用自動化とその管理方法 - OpenStack Days 2017 講演資料
PPTX
ITコンサルタントが語る!OpenStackを活用した課題解決のやり方
PDF
NFV & OPNFV - OpenStack最新情報セミナー 2017年7月
PDF
OPNFV Summit Feedback - OpenStack最新情報セミナー 2017年7月
PPTX
サーバ脆弱性スキャナ Vuls を OpenStack 環境で使ってみた
PPTX
Edge Computing と k8s でなんか話すよ
PPTX
OpenStack概要 ~仮想ネットワーク~
PDF
OpenStack-Ansibleで作るOpenStack HA環境 手順書解説 - OpenStack最新情報セミナー 2016年3月
PDF
OpenStack & Container
PPTX
OCP, Kubernetes ハイパースケールアーキテクチャ 導入の道のり - OpenStack最新情報セミナー(2016年7月)
PDF
kpackによるコンテナイメージのビルド
PDF
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
PDF
AIの力で障害検知・解析をサポート!Loom(ログ解析ソリューション)のご紹介 - OpenStack最新情報セミナー 2017年7月
PPTX
Jenkins x Kubernetesが簡単だと思ったら大変だった話
PPTX
AmebaのOpenStack - OpenStack最新情報セミナー 2015年12月
PDF
20190722 OpenStack community past present future
PPTX
Container Networking Deep Dive
PPTX
パブリッククラウドConoHaを使ってOpenStack APIを理解する
PDF
コンテナ時代のOpenStack
PPTX
今さら聞けない人のためのDocker超入門 - KOF
実環境での運用自動化とその管理方法 - OpenStack Days 2017 講演資料
ITコンサルタントが語る!OpenStackを活用した課題解決のやり方
NFV & OPNFV - OpenStack最新情報セミナー 2017年7月
OPNFV Summit Feedback - OpenStack最新情報セミナー 2017年7月
サーバ脆弱性スキャナ Vuls を OpenStack 環境で使ってみた
Edge Computing と k8s でなんか話すよ
OpenStack概要 ~仮想ネットワーク~
OpenStack-Ansibleで作るOpenStack HA環境 手順書解説 - OpenStack最新情報セミナー 2016年3月
OpenStack & Container
OCP, Kubernetes ハイパースケールアーキテクチャ 導入の道のり - OpenStack最新情報セミナー(2016年7月)
kpackによるコンテナイメージのビルド
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
AIの力で障害検知・解析をサポート!Loom(ログ解析ソリューション)のご紹介 - OpenStack最新情報セミナー 2017年7月
Jenkins x Kubernetesが簡単だと思ったら大変だった話
AmebaのOpenStack - OpenStack最新情報セミナー 2015年12月
20190722 OpenStack community past present future
Container Networking Deep Dive
パブリッククラウドConoHaを使ってOpenStack APIを理解する
コンテナ時代のOpenStack
今さら聞けない人のためのDocker超入門 - KOF
Ad

Viewers also liked (20)

PPTX
OpenStack Summit Sydney Feedback (VTJ玉置) - OpenStack最新情報セミナー 2017年11月
PDF
最近のJuju/MAASについて 〜 15分版 - OpenStack最新情報セミナー 2017年11月
PPTX
2017-11-15 OpenStack最新情報セミナー Lightning Talk OpenStack環境における通信高速化 ~超入門~
PDF
OpenStack Swiftの最新機能とStorlets
PPTX
GPU on OpenStack 〜GPUインターナルクラウドのベストプラクティス
PDF
NFVアプリケーションをOpenStack上で動かす為に - OpenStack最新情報セミナー 2017年7月
PDF
10分でわかる Cilium と XDP / BPF
PDF
OpenStack Kilo with 6Wind VA High-Performance Networking Using DPDK - OpenSta...
PDF
コンテナ時代だからこそ要注目! Cloud Foundry
PDF
OPNFVをインストールしてみた
PDF
OpenStack Summit 2016 Barcelona NFV関連報告
PPTX
OpenStackで自動化ツールを使ってみた!(Ubuntu MAAS 1.7 対応版)
PPTX
Project calico introduction - OpenStack最新情報セミナー 2017年7月
PDF
OPNFV Doctor - OpenStack最新情報セミナー 2017年7月
PDF
OpenStackを利用したNFVの商用化 - OpenStack最新情報セミナー 2017年7月
PDF
Kubernetesを触ってみた
PDF
DockerとKubernetesが作る未来
PDF
TectonicはKubernetesの構築・管理基盤である -概要の章-/-構築の章-
PDF
Kubernetesにまつわるエトセトラ(主に苦労話)
PPTX
AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017
OpenStack Summit Sydney Feedback (VTJ玉置) - OpenStack最新情報セミナー 2017年11月
最近のJuju/MAASについて 〜 15分版 - OpenStack最新情報セミナー 2017年11月
2017-11-15 OpenStack最新情報セミナー Lightning Talk OpenStack環境における通信高速化 ~超入門~
OpenStack Swiftの最新機能とStorlets
GPU on OpenStack 〜GPUインターナルクラウドのベストプラクティス
NFVアプリケーションをOpenStack上で動かす為に - OpenStack最新情報セミナー 2017年7月
10分でわかる Cilium と XDP / BPF
OpenStack Kilo with 6Wind VA High-Performance Networking Using DPDK - OpenSta...
コンテナ時代だからこそ要注目! Cloud Foundry
OPNFVをインストールしてみた
OpenStack Summit 2016 Barcelona NFV関連報告
OpenStackで自動化ツールを使ってみた!(Ubuntu MAAS 1.7 対応版)
Project calico introduction - OpenStack最新情報セミナー 2017年7月
OPNFV Doctor - OpenStack最新情報セミナー 2017年7月
OpenStackを利用したNFVの商用化 - OpenStack最新情報セミナー 2017年7月
Kubernetesを触ってみた
DockerとKubernetesが作る未来
TectonicはKubernetesの構築・管理基盤である -概要の章-/-構築の章-
Kubernetesにまつわるエトセトラ(主に苦労話)
AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017
Ad

Similar to CyberAgent: How We Deployed Production Kubernetes Clusters on OpenStack without L3 Network - OpenStack最新情報セミナー 2017年11月 (20)

PDF
OpenStack上に展開するContainer as a Service を本番で利用するために必要だったこと
PPTX
サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術
PDF
Kubernetesと閉域網
PPTX
Let's Use OKE
PDF
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
PDF
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション④
PDF
[GKE & Spanner 勉強会] GKE 入門
PDF
NGINX東京ハッピーアワー「DevOpsプラクティスによるクラウドでのKubernetesの利用」
PDF
Architecting on Alibaba Cloud - Fundamentals - 2018
PPTX
Kubernetes etc.. & rancher 2.0 technical preview “Let’s import GKE/Bluemix/AK...
PPTX
OCHaCafe2#5 変幻自在♪ 広がるKubernetesのエコシステム
PDF
OpenStack Updates
PPTX
Java on Kubernetes on Azure
PDF
Tech Dojo 02/09 IBM Japan CSM
PDF
OpenStackネットワーク実装の現状 と運用自動化開発の実際
PDF
Webアプリ開発向け ゆるふわDocker使いが Cloud Naive開発に必要なetc.
PPTX
Getting Started With AKS
PDF
GKEで半年運用してみた
PDF
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tk
PPTX
コンテナネットワーキング(CNI)最前線
OpenStack上に展開するContainer as a Service を本番で利用するために必要だったこと
サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術
Kubernetesと閉域網
Let's Use OKE
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション④
[GKE & Spanner 勉強会] GKE 入門
NGINX東京ハッピーアワー「DevOpsプラクティスによるクラウドでのKubernetesの利用」
Architecting on Alibaba Cloud - Fundamentals - 2018
Kubernetes etc.. & rancher 2.0 technical preview “Let’s import GKE/Bluemix/AK...
OCHaCafe2#5 変幻自在♪ 広がるKubernetesのエコシステム
OpenStack Updates
Java on Kubernetes on Azure
Tech Dojo 02/09 IBM Japan CSM
OpenStackネットワーク実装の現状 と運用自動化開発の実際
Webアプリ開発向け ゆるふわDocker使いが Cloud Naive開発に必要なetc.
Getting Started With AKS
GKEで半年運用してみた
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tk
コンテナネットワーキング(CNI)最前線

More from VirtualTech Japan Inc. (20)

PDF
5G時代のアプリケーションとは 〜 5G+MECを活用した低遅延アプリの実現へ 〜
PPTX
エンジニアが幸せになれる会社を目指します
PDF
KubeVirt 201 How to Using the GPU
PDF
PDF
今からはじめる! Linuxコマンド入門
PDF
5G時代のアプリケーション開発とは - 5G+MECを活用した低遅延アプリの実現へ
PDF
Kubernetes雑にまとめてみた 2020年8月版
PDF
MS Teams + OBS Studio (+ OBS Mac Virtual Camera) でのオンラインセミナーのプロトタイプの構築
PDF
5G時代のアプリケーション開発とは
PDF
hbstudy#88 5G+MEC時代のシステム設計
PDF
通信への課題発掘ワークショップ 「5Gイノベーション」の取り組み
PDF
Kubernetes雑にまとめてみた 2019年12月版
PPTX
OpenStackを使用したGPU仮想化IaaS環境 事例紹介
PPTX
Docker超入門
PDF
5Gにまつわる3つの誤解 - 5G×ライブコンテンツ:5G時代の双方向コンテンツとは
PDF
KubeCon China & MWC Shangai 出張報告
PDF
NTT Docomo's Challenge looking ahead the world pf 5G × OpenStack - OpenStack最...
PDF
Introduction of private cloud in LINE - OpenStack最新情報セミナー(2019年2月)
PDF
Multi-access Edge Computing(MEC)における”Edge”の定義
PPTX
Edge Computing Architecture using GPUs and Kubernetes
5G時代のアプリケーションとは 〜 5G+MECを活用した低遅延アプリの実現へ 〜
エンジニアが幸せになれる会社を目指します
KubeVirt 201 How to Using the GPU
今からはじめる! Linuxコマンド入門
5G時代のアプリケーション開発とは - 5G+MECを活用した低遅延アプリの実現へ
Kubernetes雑にまとめてみた 2020年8月版
MS Teams + OBS Studio (+ OBS Mac Virtual Camera) でのオンラインセミナーのプロトタイプの構築
5G時代のアプリケーション開発とは
hbstudy#88 5G+MEC時代のシステム設計
通信への課題発掘ワークショップ 「5Gイノベーション」の取り組み
Kubernetes雑にまとめてみた 2019年12月版
OpenStackを使用したGPU仮想化IaaS環境 事例紹介
Docker超入門
5Gにまつわる3つの誤解 - 5G×ライブコンテンツ:5G時代の双方向コンテンツとは
KubeCon China & MWC Shangai 出張報告
NTT Docomo's Challenge looking ahead the world pf 5G × OpenStack - OpenStack最...
Introduction of private cloud in LINE - OpenStack最新情報セミナー(2019年2月)
Multi-access Edge Computing(MEC)における”Edge”の定義
Edge Computing Architecture using GPUs and Kubernetes

CyberAgent: How We Deployed Production Kubernetes Clusters on OpenStack without L3 Network - OpenStack最新情報セミナー 2017年11月

  • 1. CyberAgent: How We Deployed Production Kubernetes Clusters on OpenStack without L3 Network
  • 2. 青山 真也 (Masaya Aoyama) 普段の主な仕事↓ 世界で 138 番目 https://adtech.cyberagent.io/techblog/ archives/3086
  • 3. adtech studio のプライベートクラウド環境 ・OpenStack をベースとしたプライベートクラウド環境 ・Network のレイテンシが許容されないアドテクシステム そんな弊社にも Production で利用可能な GKE ライクなコンテナ基盤 AKE (Adtech Container Engine)
  • 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)
  • 6. L3 Network の機能が必要 LoadBalancer as a Service が必要 細かい設定が困難 成熟度が高くはない OpenStack 界隈の方々だと…
  • 8. Resource Group として作成し、スケーリング可能に  Interface は別の Resource Group として作成し、  Master 構築時に全 IP Address を利用(etcd など)
  • 9. Heat の Custom Resource Plugins を自作 LoadBalancer を操作して VIP の払い出し (自動割当て機構を含む) 参考: https://adtech.cyberagent.io/techblog/archives/2594
  • 10. Designate を使った簡易 DNS Round Robin クライアントからはクラスタ名だけで疎通可能になる VIPが 必要な場合、CLI からopenstack stack show して  取得する必要があるが、結構レスポンスが悪いので …
  • 11. Kubernetes の OpenStack Integration 機能(後述)を 有効化する設定をした Kubernetes をデプロイ
  • 12. 素の Kubernetes を構築した場合 ① Dynamic Persistent Volume Provisioning が使えない ○ PVC の要求に応じて PV を動的に払い出す機能 3 GB の Persistent Volume 頂戴! 5 GBの Persistent Volume あげる! 5GB 10 GB 7 GB 事前に作成 事前に作成する手間、容量の無駄が発生しやすい
  • 13. 素の Kubernetes を構築した場合 ① Dynamic Persistent Volume Provisioning が使えない ○ PVC の要求に応じて PV を動的に払い出す機能 3 GB の Persistent Volume 頂戴! 3 GBの Persistent Volume あげる! 3 GB 欲しいって言われたから 作って渡そう 利用者の管理コストが低下
  • 15. 素の Kubernetes を構築した場合 ② type LoadBalancer Service が使えない ○ クラスタ外 LoadBalancer を作成する機能
  • 16. 別の手段: type NodePort の話 eth0: 10.0.0.1:34567 VM α Kubernets node Internal VM β Kubernets node apiVersion: v1 kind: Service metadata: name: svc1 spec: type: NodePort ports: - name: "http-port" protocol: "TCP" port: 80 targetPort: 80 eth0: 10.0.0.2:34567
  • 17. 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 (別途登録が必要) eth0: 10.0.0.2:34567 SNAT + NAPT
  • 18. 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 (別途登録が必要) 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 SNAT + NAPT
  • 19. This is a slide title ① SNAT, NAPT が必須な構成 ボトルネック or リソースが必要 ② 外部のコマンドでやってもらうの不便 自動 IP 払い出しとかも無い上、二度手間
  • 21. 機能の実現と Cloud Provider ① Dynamic Persistent Volume Provisioning ● Kubernetes の Cloud Provider 連携機能を利用 ● Persistent Volume Plugin (ScaleIO, Flusterfs) ② type LoadBalancer ● Kubernetes の Cloud Provider 連携機能を利用 ○ 純粋なベアメタル/VM で Cloud Provider 連携してない場合は? ○ OpenStack で LBaaS 機能を利用していない場合は? ■ Neutron L3 Agent、Octavia は未使用
  • 22. Kubernetes の CoudProvider プラグイン CloudProvider プラグインには主に下記のようなものがあります ● Routing ● Host ● Zone ● BlockDevice ● LoadBalancer (今回はここの話) (参考) インターフェースの一覧: pkg/cloudprovider/cloud.go OpenStack の場合、pkg/cloudprovider/providers/openstack/* 辺り
  • 23. This is a slide title 今回は AKE の中でも、 LoadBalancer 周りの話をします。
  • 24. Kubernetes の CloudProvider 連携機能(LBaaS) ① CloudProvider 連携で Neutron に LB の作成依頼 ② Octavia で LB を作成(LBaaS v1 は 1.8.0 で打ち切り)
  • 25. This is a slide titleKubernetes の CloudProvider 連携機能(LBaaS) ① CloudProvider 連携で Neutron に LB の作成依頼 ② BIG-IP で LB を作成(多分プラグイン書けばいけるのかな…)
  • 26. This is a slide titleKubernetes の CloudProvider 連携機能(LBaaS) ① Kubernetes の CloudProvider 連携のコードを変更して、   直接 BIG-IP を操作
  • 27. This is a slide title ① 外部 LoadBalancer の操作 ② IP 払い出しの自動化
  • 28. 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
  • 30. This is a slide title ちょっとまった Ingress ってのもいるよね?
  • 32. 残すところ Ingress HTTP LoadBalancer を提供する Ingress ● GKE 様だと L7 GCLB 様がいらっしゃられる ● それ以外は {nginx, nghttpx}-ingress-controller を使う ○ ちょっと使い勝手が悪い、手間が多い、 GKE とは結構違う 現在 GKE Like に Ingress を使えるように controller を実装中。 ● 12/1 の Kubernetes Advent Calender で公開予定
  • 33. This is a slide title 付録
  • 34. 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
  • 35. 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
  • 36. 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
  • 37. 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
  • 38. 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
  • 39. This is a slide title ① SNAT, NAPT が必須な構成 ボトルネック or リソースが必要 ② 外部のコマンドでやってもらうの不便 やっぱりGKE がいいって言われる
  • 40. 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)
  • 41. 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-* に転送
  • 42. This is a slide title ① SNAT, NAPT が必須な構成 ボトルネック or リソースが必要 ② 外部のコマンドでやってもらうの不便 やっぱりGKE がいいって言われる
  • 43. 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