Upgrade to Pro — share decks privately, control downloads, hide ads and more …

オンプレコンテナ基盤AKEの作り方とこれから試したいこと@Tech-on Meetup #02 〜マネージドサービスだけに頼らないコンテナ基盤〜 / techon-2-ake-and-future

オンプレコンテナ基盤AKEの作り方とこれから試したいこと@Tech-on Meetup #02 〜マネージドサービスだけに頼らないコンテナ基盤〜 / techon-2-ake-and-future

オンプレコンテナ基盤AKEの作り方とこれから試したいこと

@Tech-on MeetUp #02
マネージドサービスだけに頼らないコンテナ基盤

Masaya Aoyama (@amsy810)

September 07, 2018
Tweet

More Decks by Masaya Aoyama (@amsy810)

Other Decks in Technology

Transcript

  1. 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
  2. AKE Container as a Service Platform OpenStack Heat をベースとして⾃動 deploy

    POINT #1 OpenStack Integrated な Container クラスタ POINT #2 アドテク領域での利⽤に耐えうる環境 POINT #3 カスタマイズ性の⾼い環境 複数のオーケストレーター、ランタイム、アドオン POINT #4 あくーえ
  3. Horizontal Pod Autoscaler (HPA) Deployment Deployment 必要なレプリカ数  =ceil(SUM(現在のPodのCPU使⽤率)/HPAで設定するCPU使⽤率) スケールするかどうかの判断間隔=30 sec

    スケールアップ後、再度スケールアウトするまでの間隔=3 min スケールダウン後、再度スケールインするまでの間隔=5 min
  4. 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
  5. 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
  6. 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
  7. 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がよしなにステートフルなアプリケーションを管理
  8. 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
  9. 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
  10. 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
  11. 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環境があればどこでも可
  12. 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
  13. 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
  14. 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)
  15. 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
  16. “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
  17. “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
  18. 問題点 01 02 03 04 スケール時にLBの操作が必要 Kubernetesで管理できない IPアドレスの管理が必要 SNAPTが必要 ノードの追加時にロードバランサのメンバーとして

    追加しなければならない KubernetesのYAMLマニフェストで管理することができない  ≒ コード化することができない 利⽤者がLoadBalancerに割り当てるIPアドレスを 決めなければならない LB > NodePort へはポート変換が必要 DSR環境では利⽤できない #1 “type: LoadBalancer” with HW Load Balancer
  19. スケール時に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
  20. スケール時に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
  21. 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アドレスを 決める もちろん静的アドレスの設定も可能
  22. 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
  23. 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
  24. 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
  25. 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
  26. “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
  27. “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 アドテク領域の⽤途では性能不⾜
  28. “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) 誕⽣秘話とアーキテクチャ完全公開!」
  29. 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へ反映不要
  30. 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
  31. 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
  32. 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存在します
  33. 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
  34. 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
  35. 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とこれから 付録
  36. What is mastering kubernetes? 『Kubernetes完全ガイド』 の特徴 網羅的・体系的 体系的かつ網羅的にほぼ全機能を解説 実際に利用している小ネタ・小技 公式ドキュメントには載っていない小ネタや

    実運用上のハマりポイントなど 周辺エコシステムも説明 Helm / Ksonnet / Datadog / Prometheus Istio / Jenkins X / Skaffold / Fluentd… 豊富な図画 合計 288 枚 豊富なマニフェスト 合計 185 YAML 豊富なよくある質問 合計 150-200 質問