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

DevOpsをシステム化してみた on GCP(GKE)

DevOpsをシステム化してみた on GCP(GKE)

・DevOpsの概念
・GKE(kubernetes)とは
・事例紹介/アプリケーション基盤
・事例紹介/モニタリング基盤
・まとめ
・弊社サービス紹介 - AerithCloud(エアリスクラウド)

Avatar for showakusano

showakusano

May 28, 2018

Other Decks in Technology

Transcript

  1. ひとことでいうと・・ 8 無駄を省いた( Lean )組織のもと、 意識( Cluture )や情報を共有( Sharing )した

    チームで、自動的にデリバリ( Automation )されたシス テムをモニタリング( Measurement )し、 そのフィードバックから次のサイクル(開発・改善)を高速 で回していく。
  2. DevOpsを訴求するとすれば・・ 9 素早い変化についていける、逆に言うと素早い変化を即 すインフラを提供する。 (お客様ビジネスの機会損失原因にならないインフラ 無駄を省いた( Lean )組織のもと、意識( Cluture )や情

    報を共有( Sharing )した チームで、自動的にデリバリ( Automation )されたシス テムをモニタリング( Measurement )し、 そのフィードバックから次のサイクル(開発・改善)を高速 で回していく。
  3. システムとして提供するコンポーネント 11 Sharing • バージョン管理システムの共有 • 課題管理システムの共有 • ナレッジ管理システムの共有 Automation

    • 自動化されたインフラストラクチャ • ワンステップビルドとデリバリ/デプロイ • インスタントメッセンジャー Bot(通知機能) Measurement • メトリクスの共有 • レポーティング
  4. コンテナを選ぶ理由 17 PaaS 各言語のランタイムがセッ トされている アプリケーション開発にだ け集中すればいい 管理にかかるオーバー ヘッドが少ない IaaS

    サーバ、ストレージ、ネット ワークの詳細な設計が必 要 管理にかかるオーバーヘッ ドが多い managed infrastructure (DevOps) managed services (NoOps) Virtual Machine PaaS Container Virtual Machine Container PaaS サポート言語 Any Any クラウド指定 サービスモデル IaaS Hybrid PaaS ユースケース 一般的なワークロード コンテナベースのワークロー ド Webやモバイルのアプリケーショ ン
  5. GKE(GoogleKubernetesEngine) 18 GCP の Kuberenets フルマネージドサービス Dockerコンテナを管理するためのオーケストレーションツール ✓ クラスタ構成 ✓

    コンテナ負荷分散管理 ✓ Volume(DISK)管理 ✓ 機密情報ファイル管理 ✓ コンフィグファイル管理 ✓ スケールアウト、スケールイン管理 Kubernetesの仕組み自体を理解していなくてもAPIを利用して 実現したいことに集中させてくれるありがたいPaaSです。
  6. インスタンス料金の比較 20 各Cloudの料金比較 IaaS GCP AZURE AWS Type N1-standard-4 Standard

    B4MS t2.xlarge vCPU 4 4 4 Memory(GB) 15 16 16 OS Linux Free CentOS Linux 利用料/1ヶ月 $ 124.68 $ 204.506 $ 178.03 kubernetes GKE AKS(US central) EKS Preview Type N1-standard-4 Standard B4MS -- vCPU 4 4 -- Memory(GB) 15 16 -- OS Linux Free CentOS -- 利用料/1ヶ月 $ 97.09 $ 161.53 --
  7. Kubernetes コンポーネント(Kind) 22 • Pod • ReplicaSet • Limit •

    Horizonal Pod Autoscaler • Deployment • Service • Ingress • Cronjob
  8. Kubernetes API 24 Kubernetesで利用可能なAPIは利用しているバージョンによって変わる ため、バージョンアップ後は一度確認しておくとよい。 利用可能なAPIは kubectl api-versions で確認できる。 #

    kubectl api-versions ・・・ v1 autoscaling/v1 autoscaling/v2beta1 batch/v1 batch/v1beta1 certificates.k8s.io/v1beta1 crd.projectcalico.org/v1 extensions/v1beta1 ・・・
  9. POD 27 PODのアーキテクチャについてはGoogleから Design Patterns for Container-Based Distributed Systems というレポートが公開さてれています。

    いくつかのデザインパターンがあります。 その中のサイドカーパターンをベースに設計します。 localnet [MainContainer] Web Server [SideCar] Proxy Container Volume [SideCar] Logging Container
  10. 31 Proxyはノード起動時に Kube-proxyというPODで必ず起動します。 Daemonsetで設定されているため、ノードのスケールに合わせて必ず1ノードに 1POD存在してます。 # kubectl -n kube-system get

    po -l component=kube-proxy -o wide NAME READY STATUS RESTARTS AGE IP NODE kube-proxy-gke-cluster-1-default-pool-c7ec541b-23bk 1/1 Running 0 10d 10.146.0.2 gke-cluster-1-default-pool-c7ec541b-23bk kube-proxy-gke-cluster-1-default-pool-c7ec541b-xm6j 1/1 Running 0 5h 10.146.0.4 gke-cluster-1-default-pool-c7ec541b-xm6j 見づらいので改行しています。
  11. NODE POD Container NODE 32 Kuberttensのネットワーク POD Container Clusterネットワーク 10.3.240.0/22

    PODネットワーク 10.0.0.0/22 POD NW 10.0.0.0/24 POD NW 10.0.3.0/24 Intenal(external)ネットワーク 10.146.0.0/22
  12. 33 Serviceは3種類のタイプが選択出来ます。 • Cluster • ClusterネットワークからIPアドレスがアサインされます。 このアドレスはkube-dnsで名前が付きますので、POD間の通信が必要な 場合に指定すると便利です。 命名規則:my-svc.my-namespace.svc.my-cluster.local •

    LoadBalancer • Clusterネットワーク+ExternalネットワークからもIPアドレスが付与され外 部公開出来ます。 • NodePort • ノードポート(3000~32767)を自動で割り当て、iptableでそれぞれのPOD (PODネットワーク)に転送します。外部からinternalでアクセスしたい場合 に利用します。
  13. Kubernetes: Ingress 34 Ingressを指定するとGCE ロードバランサー(L7)が作成されそのバックエンドと してGKE Serviceが指定可能になります。 KubectlでGCE LBのデプロイが一括で出来るため、管理がしやすいメリットがあ ります。

    Ingressの提供機能 • HTTP(S)ロードバランサー • SSLターミネーション • CloudCDNのバックエンド • バックエンドURLルーティング POD Service Ingress nodeport POD Service nodeport
  14. 35

  15. memcache redis 移行前の構成 38 サイト 運営者 Wordpress 管理者 サイト開発 [php]

    Wordpress 記事更新 利用者 サイト閲覧 Wp Plugin 画像取得 Html5 アプリ URL Routing read wordpress cloudFront apicache.moteco-web.jp read api2.apicache.moteco-web.jp api1.apicache.moteco-web.jp read replica API1 API2 4/8 Elastic Search mySQL slave2 mySQL slave1 cloudFront moteco-web.jp R H E V R H E V RH EV RH EV RH EV RH EV DB master MotecoBeautyシステムは弊社オンプレミスのホスティング環境とAWSのハ イブリッド構成で動いていましたが、今回まとめてGCPに移行します。 Wordpress Web HTML5 App
  16. GCP: Wordpress web 構成図 39 wordpress サイト開発[php] Wordpress 記事更新 利用者

    サイト閲覧 ssl endpoint moteco-web.jp サイト 運営者 letsEnqript sftp NFS-serve r POD
  17. GCP: Wordpress web 構成概要 40 • Wordpressをオートスケール対応するためにNFSサーバを用意NFS自体 もGKEで提供 • Wordpressは動的な更新があるため、外部リポジトリ管理が難しい。

    そのため、wordpress開発はsftpアクセスで行えるようwordpress volume へのアクセスをNFSサーバ経由で実装 • SSLはIngressで終端する。無料証明書がGKEでは提供されていないた め、LetsEnqriptで提供 #初期導入、更新すべて自動実行 • データベースはCloudSQLで実装 wordpressコンテナと同PODで接続を管理する
  18. NFS-Server On GKE 接続範囲 リージョン ゾーン ゾーン アクセスモード ReadWriteMany ReadWriteOnce

    ReadWriteMany パフォーマンス ・気になる遅さ (Fuse利用時) ・早い ・サイズにより動的 ・普通 パラメータ次第 で向上(async) NFS Server 41
  19. SSL証明書 自動運用 44 GKEには無料SSL証明書はない(GAEにはある) そのため、自前で無料証明書を手に入れ、かつ自動運用するべくACMEのツー ルであるLetsEnqriptを導入。 ACME   Automatic Certificate Management

    Environment LetsEnqriptの自動運用はいくつかOSSで提供されてますが、GCEロードバラン サーと連携した仕組みで、安定しているkube-legoを採用しています。
  20. 45 Ingress+tlsの設定例 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: wordpress labels:

    app: wordpress annotations: kubernetes.io/tls-acme: "true“ kubernetes.io/ingress.class: "gce" kubernetes.io/ingress.allow-http: "true“ spec: tls: - hosts: - moteco-web.jp secretName: wordpress-tls
  21. 48 ✓ コンテナでアカウントを管理したくない ✓ www-dataアカウントでログインしてもらうようにした ✓ www-dataはnologinアカウントなのでssh接続はそもそもできない ✓ SSH鍵での認証のみにしてパスワードは廃止 ✓

    メンテナンスする際のファイルのオーナー権問題も解決 ✓ IngresではなくserviceのLoadBalancerを選択しソースIPアドレスでフィルタ Match all Protocol 2 PubkeyAuthentication yes PasswordAuthentication no Subsystem sftp internal-sftp –u 002 sshd_config
  22. memcache redis 移行前の構成(再掲) 49 サイト 運営者 Wordpress 管理者 サイト開発 [php]

    Wordpress 記事更新 利用者 サイト閲覧 Wp Plugin 画像取得 Html5 アプリ URL Routing read wordpress cloudFront apicache.moteco-web.jp read api2.apicache.moteco-web.jp api1.apicache.moteco-web.jp read replica API1 API2 4/8 Elastic Search mySQL slave2 mySQL slave1 cloudFront moteco-web.jp R H E V R H E V RH EV RH EV RH EV RH EV DB master MotecoBeautyシステムは弊社オンプレミスのホスティング環境とAWSのハ イブリッド構成で動いていましたが、今回まとめてGCPに移行します。 Wordpress Web HTML5 App
  23. GCP: HTML5 App 構成図 50 ElasticSea rch Redis API-b API-a

    html5ア プリ read api.moteco-web.jp NFS-Serve r 開発者 stg-api.moteco-web.jp Memcache apicache.moteco-web.jp Ranking Job sync CloudFront AWS ACM letsEnqript Blue/Green
  24. 52 Cronjob マニフェスト apiVersion: batch/v1beta1 kind: CronJob metadata: name: ranking-job

    labels: app: ranking-job spec: schedule: "30 15 * * *" jobTemplate: spec: template: spec: containers: - name: ranking-job image: asia.gcr.io/aerith-pj/ranking:latest
  25. 54 • Set-Cookie • データ部分が 10MB超え • Vary で Accept,

    Accept-Encoding, Origin 以外 • Cache-Control: no-store / no-cache / private キャッシュしてくれないヘッダや容量
  26. CDフロー 56 開発者 ①Develop Branch push html5アプリ https://apicache.moteco-web.jp ②テストの結果受信 ③Master

    Branch push ④切替完了通知 ①イメージ更新 ⑤ラベル切替 CI 同期 ②デプロイ ③切り替え ③ユニットテスト ④通知 CI 同期 ⑥通知 トリガ API-b API-a Blue/Green
  27. Blue/Greenデプロイメント 57 api.moteco-web.jp POD Label: blue Service Production Ingress Production

    POD Label: green Service Develop Ingress Develop stg-api.moteco-web.jp ServiceがSelectorで振り分けの対象にするlabelがblueかgreenかで外 部からの接続するドメインが変わる。
  28. 58 Service(Production) apiVersion: v1 kind: Service metadata: name: api-prd labels:

    app: api spec: type: NodePort selector: app: api label: blue ports: - name: http protocol: TCP port: 80 targetPort: 80 Ingress(Production) apiVersion: extensions/v1beta1 kind: Ingress metadata: name: api-prd labels: app: api spec: tls: - secretName: api-tls hosts: - "api.moteco-web.jp" rules: - host: "api.moteco-web.jp" http: paths: - path: "/*" backend: serviceName: api-prd servicePort: 80
  29. 59 api-a metadata: name: api-a spec: replicas: 1 template: metadata:

    labels: app: api label: blue api-b metadata: name: api-b spec: replicas: 1 template: metadata: labels: app: api label: green 切替コマンド # kubectl get selector service api-prd app=api, label=blue # kubectl get selector service api-stg app=api, label=green blueをProductionに切り替える。
  30. 65 PrometheusはGKEにPODとしてデプロイしてExporterというメトリクス収集 を行うモジュールと連携して一括管理します。 このシステムで起動しているexporter一覧 Exporter 役割 備考 heapster CPU・メモリ・ネットワークといったリソース単位で メトリクスを管理

    GKE標準 Node-exporter ノードのリソース情報 追加 Kube-state-metrics Pod, Deployment, DeamonSetといった Kubernetesで抽象化された単位でメトリクスを管 理 追加 stackdriver Stackdriver APIを実行 追加
  31. 67 PromQL sum ( container_memory_working_set_bytes{ pod_name=~"wordpress.*", container_name!="POD“ } ) by

    (pod_name) 集めたメトリクスはPromQLでクエリをカスタマイズ
  32. 69

  33. 70

  34. Prometheus + Mackerel 71 Promethus ✓ 集めたメトリクスを集計・表示するのが得意(PromQL) ✓ グラフィカルな表示やログイン機能等、外部公開用ページとしての機 能は苦手

    ✓ アラートマネージャがあるものの少し敷居が高い印象 Mackerel ✓ メトリクスを取得してきれいにグラフ化してくれる ✓ アラートの設定も簡単 ✓ ログイン認証や外部ツールを利用した通知方法が豊富 ✓ SaaSで提供されるため、監視装置の管理から開放される WeaveScope ✓ デプロイされているKubernetesの状態を視覚化してくれる
  35. システムとして提供するコンポーネント(再掲) 78 Sharing • バージョン管理システムの共有 • 課題管理システムの共有 • ナレッジ管理システムの共有 Automation

    • 自動化されたインフラストラクチャ • ワンステップビルドとデリバリ/デプロイ • インスタントメッセンジャー Bot(通知機能) Measurement • メトリクスの共有 • レポーティング
  36. 79

  37. エアリスクラウド(仮) とは 81 以下をご検討のお客様に提供 ✓ コンテナを利用した開発に興味がある ✓ 属人的な開発スキームを統合し、ビルド・テスト・デプロイの工程を自動化 したい ✓

    プラットフォーム環境(HW・NW・OS)の対応時間を短縮したい ✓ 複数のサービスを適切に分離して最適化したい ✓ サービスの利用状況に併せてスケール(拡張/縮小)させたい
  38. 82 クラウド コード管理 今後Aerithで対応予定 On-Premise Cloud Service CODE COMMIT BUILD

    TEST DEPLOY GCP </> </> ハードウェア ハイパーバイザー Pod (Container) CI/CD お客様/開発者 エアリスクラウド(仮) システム モニタリング ビリング モニタリング CRE CI ID 統合 カタログ ポータル ネットワーク 「Aerith-Cloud」は、お客様の継続的インテグレーション(CI)標準化をサポート し、開発以降の作業を自動化するためのコンテナプラットフォームサービスで す。 Pod (Container) Pod (Container) コンテナプラットフォーム
  39. 提供サービス 83 提供サービス 提供形態 概要 システムモニタリング Aerith 標準提供 標準で提供されますが、項目についてはご相談になります。 設定数等の上限はありません。

    アラート通知 アラート発生時にシステムから任意の宛先へ通知します。 ビリングモニタリング お客様の利用状況(従量課金)をモニタリングして表示します。 CRE システムの導入検討から事前検証も含めて対応し最適なカタログを導入します。 保守(障害対応) サービス障害時の対応。必要に応じてエスカレーションを行います。 ポータル クラウド利用料、モニタリング、ご請求情報等の閲覧機能を提要します。 カタログ 課金 ベースとなるコンテナプラットフォーム用のカタログが利用できます。 サービス提供までのリリースを短縮できます。 ID統合 オプション Aerith利用時のIDをお客様環境のIDと統合します。 利用しない場合、弊社でアカウントを発行・管理します。 ネットワーク オプション VPN接続や閉域網接続 CI標準化ハンズオン  コンテナ構築フロー  CI実装フロー オプション Dockerコンテナの構築手順から実際に環境(検証)に起動するまでの手順レビュー・ 共有 オプション Dockerイメージの自動更新、環境適用前までのデリバリを自動化する手順のレ ビュー・共有
  40. アプリケーション コンテナ ログ収集 コンテナ ストレージ接続 コンテナ データベース接続 コンテナ 86 GKE+PaaS

    + SSL(ingress) • ロードバランサーの設定 • SSL証明書の追加・更新 • ドメインのDNS管理 マイクロサービス化 SSL運用 コンテナ
  41. 88 開発者 ①Develop Branch push ②テストの結果受信 ③Master Branch push ④切替完了通知

    ①イメージ更新 ⑤ラベル切替 CI 同期 ②デプロイ ③切り替え ③ユニットテスト ④通知 CI 同期 ⑥通知 トリガ GCP CI