Slide 1

Slide 1 text

Masaya Aoyama CyberAgent adtech studio ΦϯϓϨίϯςφج൫AKEͷ࡞Γํͱ ͜Ε͔Βࢼ͍ͨ͜͠ͱ @Tech-on MeetUp #02 ϚωʔδυαʔϏε͚ͩʹཔΒͳ͍ίϯςφج൫ MasayaAoyama @amsy810

Slide 2

Slide 2 text

Japan Container Days v18.04 Keynote 登壇 Cloud Native Meetup Tokyo Organizer (+ KubeCon日本人会 + JKD実行委員) CKA #138 / CKAD #2 連載「今こそ始めよう!Kubernetes 入門」 @ThinkIT Kubernetes / OpenStack Contributor Masaya Aoyama (@amsy810) Infrastructure Engineer

Slide 3

Slide 3 text

What is AKE?

Slide 4

Slide 4 text

AKE Container as a Service Platform OpenStack Heat をベースとして⾃動 deploy POINT #1 OpenStack Integrated な Container クラスタ POINT #2 アドテク領域での利⽤に耐えうる環境 POINT #3 カスタマイズ性の⾼い環境 複数のオーケストレーター、ランタイム、アドオン POINT #4 あくーえ

Slide 5

Slide 5 text

私達が目指すところ = オープンなオンプレとクラウドの共存 Google Kubernetes Engine Azure Kubernetes Service

Slide 6

Slide 6 text

What is merits?

Slide 7

Slide 7 text

細かい設定ができる 例えば… アドオンの仕組み  Datadog、Prometheus、Log integration、Dashboard unsafe sysctlの許可 ノードの障害検知の間隔  チェック間隔 Horizontal Pod Autoscalerの間隔

Slide 8

Slide 8 text

Horizontal Pod Autoscaler (HPA) Deployment Deployment 必要なレプリカ数  =ceil(SUM(現在のPodのCPU使⽤率)/HPAで設定するCPU使⽤率) スケールするかどうかの判断間隔=30 sec スケールアップ後、再度スケールアウトするまでの間隔=3 min スケールダウン後、再度スケールインするまでの間隔=5 min

Slide 9

Slide 9 text

Kubernetes力がつく 1.だいたいことに対応できるようになる 2.ソースコード読めるようになる   ドキュメントに書いていないことも多々ある   正直YAML書く時もGolangの構造体(./types.go)を⾒たほうが早い https://github.com/kubernetes/kubernetes/tree/master/pkg/apis/* ・その他 controller https://github.com/kubernetes/kubernetes/tree/master/pkg/controller cloudprovider https://github.com/kubernetes/kubernetes/tree/master/pkg/cloudprovider/providers scheduler https://github.com/kubernetes/kubernetes/tree/master/pkg/scheduler

Slide 10

Slide 10 text

What is Kubernetes?

Slide 11

Slide 11 text

Cloud Native for the future w/ K8s アプリケーション基盤としてのKubernetes 従来どおりコンテナを載せて Scalableなアプリケーションの実行環境 フレームワークとしてのKubernetes Clustom Resource DefinitionとCustom Controllerによる API Resourceのライフサイクル管理 XaaSプラットフォームとしてのKubernetes マネージド・サービス基盤としてのKubernetes XaaS、Serverless platform w/ Kuebrnetes

Slide 12

Slide 12 text

Cloud Native for the future w/ K8s アプリケーション基盤としてのKubernetes 従来どおりコンテナを載せて Scalableなアプリケーションの実行環境 フレームワークとしてのKubernetes Clustom Resource DefinitionとCustom Controllerによる API Resourceのライフサイクル管理 XaaSプラットフォームとしてのKubernetes マネージド・サービス基盤としてのKubernetes XaaS、Serverless platform w/ Kuebrnetes

Slide 13

Slide 13 text

XaaS Platform & Future of AKE (もともとPrivate Cloud作るのが大好き)

Slide 14

Slide 14 text

GCP XaaS Ceph as a Service Persistent Disk MySQL as a Service Cloud SQL Queue as a Service Cloud Pub/Sub ML as a Service Cloud ML マネージドサービスは現在の開発では有用 managed services

Slide 15

Slide 15 text

だからGKE使うの?

Slide 16

Slide 16 text

with CustomResourceDefinition and Operator Kubernetes Native XaaS Solution Ceph as a Service Rook MySQL as a Service Vitess Queue as a Service NATS ML as a Service Kubeflow 内部ではOperatorが使われており、Operatorがよしなにステートフルなアプリケーションを管理

Slide 17

Slide 17 text

apiVersion: "nats.io/v1alpha2" kind: "NatsCluster" metadata: name: "example-nats-cluster" spec: size: 3 version: "1.1.0” … Queue as a Service 開発者 Kubernetes NatsCluster リソースの登録 NATS Operator

Slide 18

Slide 18 text

apiVersion: "nats.io/v1alpha2" kind: "NatsCluster" metadata: name: "example-nats-cluster" spec: size: 3 version: "1.1.0” … Queue as a Service 開発者 Kubernetes NatsCluster リソースの登録 NATS Operator リソースをWatch

Slide 19

Slide 19 text

apiVersion: "nats.io/v1alpha2" kind: "NatsCluster" metadata: name: "example-nats-cluster" spec: size: 3 version: "1.1.0” … Queue as a Service 開発者 Kubernetes NatsCluster リソースの登録 NATS Operator リソースの登録を検知 StetafulSetでQueueクラスタをデプロイ リソースをWatch

Slide 20

Slide 20 text

apiVersion: "nats.io/v1alpha2" kind: "NatsCluster" metadata: name: "example-nats-cluster" spec: size: 3 version: "1.1.0” … Queue as a Service 開発者 Kubernetes NatsCluster リソースの登録 NATS Operator リソースの登録を検知 StetafulSetでQueueクラスタをデプロイ 変更要求 よしなにマネジメント リソースをWatch Kubernetes上でマネージド・サービス相当の機能  = Kubernetes環境があればどこでも可

Slide 21

Slide 21 text

Cloud Native Meetup

Slide 22

Slide 22 text

CNCF の公式meetupに認定されました http://bit.ly/cncfmeetupjp から メンバー登録お願いいたします。

Slide 23

Slide 23 text

個人的には マネージドサービス使うのもあり

Slide 24

Slide 24 text

Service Catalog via Open Service Broker API

Slide 25

Slide 25 text

GCP Service Broker Google Cloud SQL Google Cloud Pub/Sub Amazon RDS Amazon Kinesis AWS Service Broker Open Service Broker API マニフェストの登録 開発者 apiVersion: servicecatalog.k8s.io/v1beta1 kind: ServiceInstance metadata: name: db spec: clusterServiceClassExternalName: cloud-sql-mysql clusterServicePlanExternalName: beta parameters: instanceId: sample-cloudsql databaseVersion: MYSQL_5_7 region: asia-northeast1 事前に登録 ・clusterServiceClass ・clusterServicePlan

Slide 26

Slide 26 text

GCP Service Broker Google Cloud SQL Google Cloud Pub/Sub Amazon RDS Amazon Kinesis AWS Service Broker Open Service Broker API マニフェストの登録 開発者 apiVersion: servicecatalog.k8s.io/v1beta1 kind: ServiceInstance metadata: name: db spec: clusterServiceClassExternalName: cloud-sql-mysql clusterServicePlanExternalName: beta parameters: instanceId: sample-cloudsql databaseVersion: MYSQL_5_7 region: asia-northeast1 事前に登録 ・clusterServiceClass ・clusterServicePlan jacopenさんの資料とかも参考に https://www.slideshare.net/jacopen/cfopen-service-broker

Slide 27

Slide 27 text

AKE Networking すでに何回か話したため 本日は詳しくは話しません Japan Container Days の Keynote とか OpenStack Days とか https://speakerdeck.com/masayaaoyama/

Slide 28

Slide 28 text

Network for Ad-technology “type: LoadBalancer” with HW LoadBalancer GKE-like Ingress Controller For production use

Slide 29

Slide 29 text

Pod Network (Internal Network) NIC NIC IP: x.x.x.x IP: y.y.y.y Kubernetesで起動されるPodのネットワークは外部から疎通性がない 外部のエンドポイントを作成するにはServiceが必要 #1 “type: LoadBalancer” with HW Load Balancer Kubernetes Pod Network VM Network (External Network)

Slide 30

Slide 30 text

Pod Network (Internal Network) NIC NIC IP: x.x.x.x IP: y.y.y.y x.x.x.x:XX 宛のトラフィックが 各 Pod に転送される “type: NodePort” Service VM Network (External Network) #1 “type: LoadBalancer” with HW Load Balancer

Slide 31

Slide 31 text

“type: NodePort” Service Pod Network (Internal Network) NIC NIC IP: x.x.x.x IP: y.y.y.y y.y.y.y:YY 宛のトラフィックも同様に 各 Pod に転送される VM Network (External Network) #1 “type: LoadBalancer” with HW Load Balancer

Slide 32

Slide 32 text

“type: NodePort” Service + Manual LB NIC NIC LoadBalancer BIG-IP GCLB IP: x.x.x.x IP: y.y.y.y NodePort + Manual LoadBalancer VIP: z.z.z.z VIP: z.z.z.z 宛のトラフィックが 各 Pod に転送される NodePort Manual LoadBalancer #1 “type: LoadBalancer” with HW Load Balancer

Slide 33

Slide 33 text

問題点 01 02 03 04 スケール時にLBの操作が必要 Kubernetesで管理できない IPアドレスの管理が必要 SNAPTが必要 ノードの追加時にロードバランサのメンバーとして 追加しなければならない KubernetesのYAMLマニフェストで管理することができない  ≒ コード化することができない 利⽤者がLoadBalancerに割り当てるIPアドレスを 決めなければならない LB > NodePort へはポート変換が必要 DSR環境では利⽤できない #1 “type: LoadBalancer” with HW Load Balancer

Slide 34

Slide 34 text

スケール時にLBの操作が必要 NIC NIC LoadBalancer BIG-IP GCLB IP: x.x.x.x IP: y.y.y.y ノードのスケール時や障害時に LoadBalancer の操作が必要 VIP: z.z.z.z #1 “type: LoadBalancer” with HW Load Balancer

Slide 35

Slide 35 text

スケール時にLBの操作が必要 NIC NIC LoadBalancer BIG-IP GCLB IP: x.x.x.x IP: y.y.y.y ノードのスケール時や障害時に LoadBalancer の操作が必要 VIP: z.z.z.z NIC IP: w.w.w.w #1 “type: LoadBalancer” with HW Load Balancer

Slide 36

Slide 36 text

Kubernetes(マニフェスト)で管理できない #1 “type: LoadBalancer” with HW Load Balancer apiVersion: v1 kind: Service metadata: name: sample-lb spec: type: LoadBalancer ports: - name: "http-port" protocol: "TCP" port: 8080 targetPort: 80 selector: app: sample-app apiVersion: v1 kind: Service metadata: name: sample-lb spec: type: NodePort ports: - name: "http-port" protocol: "TCP" port: 8080 targetPort: 80 selector: app: sample-app LB操作 1. ランダムに割り当てられる NodePort番号を調べる 2. LBに利⽤するIPアドレスを 決める もちろん静的アドレスの設定も可能

Slide 37

Slide 37 text

IPアドレスの管理が必要 #1 “type: LoadBalancer” with HW Load Balancer NIC NIC IP: x.x.x.x IP: y.y.y.y ⼿動でLoadBalancerを作成する場合は 利⽤するIPアドレスを考えなければならない ? LoadBalancer BIG-IP GCLB

Slide 38

Slide 38 text

IPアドレスの管理が必要 #1 “type: LoadBalancer” with HW Load Balancer apiVersion: v1 kind: Service metadata: name: sample-lb spec: type: LoadBalancer ports: - name: "http-port" protocol: "TCP" port: 8080 targetPort: 80 selector: app: sample-app リソースの作成 NIC NIC LoadBalancer BIG-IP GCLB IP: x.x.x.x IP: y.y.y.y VIP: z.z.z.z

Slide 39

Slide 39 text

SNAPTが必要 = DSR不可 #1 “type: LoadBalancer” with HW Load Balancer NIC NIC LoadBalancer :30080 :30080 VIP: X.X.X.X:80 NIC NIC LoadBalancer :30081 :30081 VIP: Y.Y.Y.Y:80

Slide 40

Slide 40 text

SNAPTが必要 = DSR不可 #1 “type: LoadBalancer” with HW Load Balancer NIC NIC LoadBalancer :30081 :30081 VIP: Y.Y.Y.Y:80 HAProxy HAProxy HAProxy DSR SNAPT 弊社の初期Kubernetes

Slide 41

Slide 41 text

“type: LoadBalancer” Service #1 “type: LoadBalancer” with HW Load Balancer 01 02 03 04 スケール時にLBの操作が必要 Kubernetesで管理できない IPアドレスの管理が必要 SNAPTが必要 NIC NIC LoadBalancer GCLB IP: x.x.x.x IP: y.y.y.y VIP: z.z.z.z

Slide 42

Slide 42 text

“type: LoadBalancer” Service #1 “type: LoadBalancer” with HW Load Balancer Kubernetes CloudProviderが機能を提供 GCP CloudProviderでは  PersistentVolume: GCP Persistent Disk  “type: LoadBalancer”: Google Cloud LoadBalancer OpenStack CloudProviderでは  PersistentVolume: Cinder  “type: LoadBalancer”: Octavia アドテク領域の⽤途では性能不⾜

Slide 43

Slide 43 text

“type: LoadBalancer” Service #1 “type: LoadBalancer” with HW Load Balancer Kubernetes CloudProviderが機能を提供 GCP CloudProviderでは  PersistentVolume: GCP Persistent Disk  “type: LoadBalancer”: Google Cloud LoadBalancer OpenStack CloudProviderでは  PersistentVolume: Cinder  “type: LoadBalancer”: BIG-IP CloudProvider連携を独⾃実装(OpenStack Cloud Providerを改良)  ・BIG-IPの操作  ・使⽤可能なIPアドレスの決定 参考: https://developers.cyberagent.co.jp/blog/archives/12058/ 「GKE 互換のオンプレコンテナ基盤 AKE (Adtech Container Engine) 誕⽣秘話とアーキテクチャ完全公開!」

Slide 44

Slide 44 text

CloudProviderのCoreからの分離 #1 “type: LoadBalancer” with HW Load Balancer 従来はKubernetes Core(kubernetes/kubernetes)に内包されていた https://github.com/kubernetes/kubernetes/tree/master/pkg/cloudprovider/providers/openstack 現在は別バイナリとしてCloudProviderが実装されている https://github.com/kubernetes/cloud-provider-openstack Kubernetesバイナリのリビルドが不要 CloudProvider実装の変更をupstreamへ反映不要

Slide 45

Slide 45 text

Network for Ad-technology “type: LoadBalancer” with HW LoadBalancer GKE-like Ingress Controller For production use

Slide 46

Slide 46 text

Serviceリソース と Ingress リソース #3 GKE-like Ingress Controller Serviceリソース:L4 LoadBalancer Ingressリソース:L7 LoadBalancer NIC NIC LoadBalancer NIC NIC LoadBalancer over TCP over HTTP パスベースルーティング SSL終端 etc

Slide 47

Slide 47 text

Serviceリソース と Ingress リソース #3 GKE-like Ingress Controller Serviceリソース:L4 LoadBalancer Ingressリソース:L7 LoadBalancer NIC NIC LoadBalancer NIC NIC LoadBalancer over TCP over HTTP パスベースルーティング SSL終端 etc

Slide 48

Slide 48 text

Serviceリソース と Ingress リソース #3 GKE-like Ingress Controller Ingressリソース:L7 LoadBalancer (オンプレ) Ingressリソース:L7 LoadBalancer (GKE) LoadBalancer NIC NIC LoadBalancer パスベースルーティング SSL終端 etc NIC NIC nginx-ingress (L7処理を担当) 厳密にはLB > nginx-ingressの経路は複雑です また、nginx-ingressは各ノードに複数Pod存在します

Slide 49

Slide 49 text

Nginx Ingress Controller Wrapper #3 GKE-like Ingress Controller Create Ingress Resource GKE ingress controller Create Ingress Resource Create Ingress Controller Deployment Create HorizontalPodAutoscaler Create LoadBalancer Service Rewrite Ingress status for IP Addr nginx/nghttpx ingress controller 参考: https://adtech.cyberagent.io/techblog/archives/3758 「オンプレでも GKE Like な Ingress を使うために 自作 Ingress Controller を実装してみた」 Create Google Cloud Load Balancer Rewrite Ingress status for IP Addr Auto provisioning

Slide 50

Slide 50 text

Nginx Ingress Controller Wrapper #3 GKE-like Ingress Controller Create Ingress Resource GKE ingress controller Create Ingress Resource Create Ingress Controller Deployment Create HorizontalPodAutoscaler Create LoadBalancer Service Rewrite Ingress status for IP Addr AKE ingress controller 参考: https://adtech.cyberagent.io/techblog/archives/3758 「オンプレでも GKE Like な Ingress を使うために 自作 Ingress Controller を実装してみた」 Auto provisioning Create Google Cloud Load Balancer Rewrite Ingress status for IP Addr Auto provisioning

Slide 51

Slide 51 text

黒船襲来

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

To Be Continue… なくはないと思っているので、Early Accessには申し込んでます いろんな技術に柔軟に、先をなるべく見通して動くのが一番だと思います。

Slide 54

Slide 54 text

そもそも、Kubernetesって難しい?

Slide 55

Slide 55 text

2018年9⽉21⽇発売予定 https://bit.ly/k8s-amsy810 Kubernetesの各リソースについて体系的かつ網羅的に説明 Cloud Nativeな開発を促進させる周辺エコシステムについても紹介 ■⽬次案 第1章 Dockerの復習とHello, Kubernetes 第2章 なぜKubernetesが必要なのか? 第3章 Kubernetes環境の選択肢 第4章 APIリソースとkubectl 第5章 Workloadsリソース 第6章 Discovery & LBリソース 第7章 Config & Storageリソース 第8章 ClusterリソースとMetadataリソース 第9章 リソース管理とオートスケーリング 第10章 ヘルスチェックとコンテナのライフサイクル 第11章 メンテナンスとノードの停⽌ 第12章 ⾼度で柔軟なスケジューリング 第13章 セキュリティ 第14章 マニフェストの汎⽤化を⾏うオープンソースソフトウェア 第15章 モニタリング 第16章 コンテナログの集約 第17章 CI/CD環境 第18章 マイクロサービスとServiceMesh 第19章 Kubernetesのアーキテクチャ 第20章 Kubernetesとこれから 付録

Slide 56

Slide 56 text

What is mastering kubernetes? 『Kubernetes完全ガイド』 の特徴 網羅的・体系的 体系的かつ網羅的にほぼ全機能を解説 実際に利用している小ネタ・小技 公式ドキュメントには載っていない小ネタや 実運用上のハマりポイントなど 周辺エコシステムも説明 Helm / Ksonnet / Datadog / Prometheus Istio / Jenkins X / Skaffold / Fluentd… 豊富な図画 合計 288 枚 豊富なマニフェスト 合計 185 YAML 豊富なよくある質問 合計 150-200 質問

Slide 57

Slide 57 text

Thank you for your attension follow me: @amsy810