4.5K Views
June 10, 22
スライド概要
社内向けに最近のインフラ周りの動向やキーワード・ツールを知って貰い、今後の勉強の足がかりや問題解決の選択肢にしてもらいたいのを目的に作成した資料です
仮想化技術の進化によりインフラがオンプレ時代からクラウドネイティブ時代へと移り変わった流れに簡単に触れ、いわゆる DevOps ツールと呼ばれるもの達がどういった思想の元作られているのか説明します
その後に具体的にどういった役割や目的を持ったツールがあるのかを一通り紹介します
今回はきっかけ作りが目的なので、ツールの簡単な使い方には触れますがインストール・設定の書き方・コマンドの実行の仕方といった詳細には今回は触れませんのでご注意ください
DevOps ⼊⾨
⽬的 最近のソフトウェア開発のインフラ的な領域の 動向やキーワードを知ってもらう キーワードを知ることにより 問題解決の幅や将来の選択肢を増やす
アジェンダ 思想・理論編 ツール/サービス編
思想・理論編
⽤語説明 DevOps Infrastructure as Code
DevOps Development (開発) と Operations (運⽤) の混成語 Dev と Ops を密に協調・連携させ 新たなビジネス価値を迅速かつ安定して 届け続ける考えや⽂化のこと
DevOps 働き⽅や開発⼿法だけでなく 組織づくりなど広い範囲を含める ⽬的が近いのでアジャイル開発の⼿法を 取り⼊れたりはよくある
Infrastructure as Code 簡単に⾔うとインフラのコード化 コード化によりソフトウェア開発⼿法を インフラの領域に適⽤し恩恵を得て改善していく バージョン管理・コードレビュー・CI・⾃動化・etc…
Infrastructure as Code ⼿作業によりブラックボックス化した サーバの運⽤は避けたいのが⽬的 緩くはシェルスクリプトから始めるでも OK 専⽤ツールを使うことの恩恵はもちろんある
インフラの歴史 オンプレミス時代 クラウドファースト時代 クラウドネイティブ時代
オンプレミス時代 いわゆる物理サーバの時代 CPU やメモリといった PC の構成や HDD の RAID 化 ルータや HUB 選びといったネットワーク構成 こういったものを物理レベルで考え運⽤・保守していた
クラウドファースト時代 システムを構築する際にクラウドの利⽤を優先する考え 仮想化技術の進化により開発者が 物理レベルの管理をする事が少なくなった
クラウドファースト時代 ブラウザや CLI で操作するだけで 仮想マシンやネットワークの構築ができる 仮想マシン等をコードで管理するツールが出来始めた パフォーマンスは物理マシンの⽅が出るので DB だけ物理とかは現在もよくある
クラウドネイティブ時代 クラウドの利点を最⼤限活かしてシステムを構築する考え CNCF の定義 柔軟でスケーラブルなシステムの 構築および実現を⽬指している 実現する為のツールやサービスが多数開発されている 代表的なものとしてコンテナ、 サービスメッシュ、マイクロサービスなど
クラウドネイティブ時代 既存の技術もクラウドネイティブなものが作られ始めてる CI / CD、監視、ログの集積/分析、etc… AWS や GCP といった⼤⼿のクラウドは サービスとして提供もしている
仮想化技術
仮想化技術の種類 ホスト型 ハイパーバイザ型 コンテナ型 アプリ アプリ アプリ ゲストOS 仮想化ソフトウェア ゲストOS コンテナエンジン ホストOS ハイパーバイザ ホストOS ホストマシン ホストマシン ホストマシン
ホスト型 ホスト OS 上に仮想化ソフトウェアを インストールし動作させる ゲスト OS はこの仮想化ソフトウェア上で動作させる 導⼊が簡単だがオーバーヘッドが⼤きい VirtualBox, VMWare Player などがこれにあたる
ハイパーバイザ型 ホストマシン上に直接仮想化ソフトウェアを インストールし動作させる ホスト OS がないのでゲスト OS より 効率的にリソースを扱える 当然だが対象マシンは仮想環境専⽤機となる Hyper-V, VMware ESXi などがこれにあたる
コンテナ型 ホスト OS 上にコンテナエンジンを インストールし動作させる その上でコンテナと呼ばれる仮想環境を動作させる
コンテナ型 Linux カーネルの機能を使った論理的な分離なので オーバーヘッドは極めて少ない Docker, LXC などがこれにあたる
ツール/サービス編
ツール/サービスの種類 マシンの構成管理 インフラの構成管理 デプロイ 継続的インテグレーション 継続的デリバリー その他
マシンの構成管理 (Configuration Management) ミドルウェアのインストール、アプリのデプロイ 設定の適⽤といったマシン構成を管理する
マシンの構成管理 基本的には処理⼿順ではなく あるべき状態を書くので理解しやすい (宣⾔的) 何度実⾏しても同じ結果になる (冪等性) 複数台に並⾏して実⾏できる
マシンの構成管理 代表的なツール Ansible, Chef, Puppet
インフラの構成管理 (Infrastructure Provisioning) 仮想マシンやネットワークやストレージといった クラウドのインフラ構成を管理する 許可する IP アドレスのリストや 環境毎の台数差などをコードで管理できる
インフラの構成管理 代表的なツール Terraform, DeploymentManager, CloudFormation
デプロイ 簡単に⾔うとシェルスクリプトの上位互換的なツール デプロイでよくある処理は容易されていたりする ⾼機能なものだと何世代か残して ロールバックできるものもある 代表的なツール: Capistrano, Fabric, Deployer
継続的インテグレーション (Continuous Integration) メインへのマージ頻度が下がる程、巨⼤な変更となり バグの解決等のコストも⼤きくなる 対策としてビルドやテストを⾃動化し メインへのマージを継続的に⾏えるようにする
継続的インテグレーション ⾃動化を補助する為のツールやサービス トリガーとタスクを設定することに特化している 代表的なツール: Jenkins, GitHub Action, Circle CI
継続的デリバリー (Continuous Delivery) 短いサイクルでシステムを⽣産し いつでもリリース可能な状態にする 本番環境へのデプロイには⼿動の承認が 必要なのが継続的デプロイとの違い
継続的デリバリー CI ツール + シェルスクリプトや デプロイツールで実現する事が多い 最近では GitOps という⼿作業を挟まずに 全てコードで管理しようという動きもある GitOps を⽀援するツール: Argo, Flux, JenkinsX
その他 Packer Vagrant Docker
Packer 仮想マシンのイメージを作成するツール GCP, AWS などのクラウドや VirtualBox など 様々な仮想マシンに対応している Packer Document
Vagrant 仮想化環境の構築及び設定を⾏うツール 初期は VirtualBox のみだったが 最近は Amazon EC2 や docker にも対応している
Vagrant Vagrant.configure("2") do |config| config.vm.box = "ubuntu/bionic64" config.vm.network "private_network", bridge: "192.168.1.15" config.disksize.size = "100GB" config.vm.provider "virtualbox" do |vb| vb.cpus = 4 vb.memory = "4096" end end イメージは Vagrant Cloud に公開されている
Docker コンテナ型仮想環境を利⽤できるツール コンテナのイメージをビルドしたり動かしたり ⼿元で作業する際は基本これを使う ⼤体のミドルウェアは既にイメージ化され Docker Hub にて公開されている
デモ
クラウドネイティブなツール
Prometheus 監視対象が動的に変化するのを意識し 設計されたインフラ監視ツール 集約したデータを専⽤クエリで可視化できる Prometheus Overview
ElasticStack Elasticsearch, Kibana, Beats, Logstash これらの連携するツールの総称 分散型のデータを集約/検索するサービス 過去はログデータが中⼼だったが Beats の登場により様々なデータが扱えるように ElasticStack
参考 DevOps の能⼒ | Google Cloud DevOps Roadmap CNCF Cloud Native Interactive Landscape
まとめ
まとめ 以前は⾃作したり⼿作業でしていたものが 専⽤ツールにより簡単 or ⾃動的にできる時代へ ⼿作業で都度対応コストを取られているなら 検討してもいいかも
まとめ ただしコード化し始めると別の問題も出てくる
まとめ 全てコード化しよう よく使いそうな部分は共通化しよう ここは拡張しやすい構造にしておこう 出来たけどコードが汚いのでリファクタリングしよう
まとめ コードとして残るのは良いことですが 本来の⽬的を⾒失って不要にこだわり過ぎないように
まとめ 本当にコード化が必要な部分か 共通化や汎⽤的にしたりする必要があるものか よく考えて利⽤しましょう