とある案件でGitOpsについて調査しており、その調査の中でOktetoという便利なサービスがあったので、ご紹介しようと思います。
Oktetoとは
公式サイトには次のように書かれています。
Make Development Faster(開発をより速くする)
Instantly spin up pre-configured environments in the cloud and start developing within seconds (クラウド内の事前設定された環境を即座にスピンアップし、数秒以内に開発を始められる)
簡単に機能解説すると、OktetoはいわゆるマネージドKubernetesであり、無料から利用できます。 無料プランでも十分利用できますが、有料のプランへ移行すると使い勝手が向上します。 オンプレ環境にデプロイするプランもあるようです。
QuickStart
実際に使ってみたい場合は、QuickStartの手順に従うだけです。必要なものはkubectl CLIとokteto CLIです。10分もあればOktetoを使ったGitOpsの環境を作れてしまうと思います。
環境構築の手順
CLIのダウンロード
okteto
CLIを次のようにダウンロードします。kubectl CLIも後ほど使うので、まだインストールしていない場合はkubectlツールをインストールしておきます。
% curl https://get.okteto.com -sSfL | sh > Downloading https://github.com/okteto/okteto/releases/latest/download/okteto-Darwin-arm64 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 143 100 143 0 0 324 0 --:--:-- --:--:-- --:--:-- 331 100 658 100 658 0 0 953 0 --:--:-- --:--:-- --:--:-- 953 100 68.8M 100 68.8M 0 0 9776k 0 0:00:07 0:00:07 --:--:-- 12.2M > Installing /usr/local/bin/okteto > Okteto successfully installed!
oktetoへのログイン
okteto CLIでサービスにログインしておきます。
% okteto context use https://cloud.okteto.com ✓ Using context ytooyama @ cloud.okteto.com i Run 'okteto kubeconfig' to set your kubectl credentials
kubeconfigの設定
コマンドを実行して~.kube/config
にOktetoのコンテキストを追加します。
% okteto kubeconfig ✓ Updated kubernetes context 'cloud_okteto_com/ytooyama' in '[/Users/ytooyama/.kube/config]' % kubectl config current-context cloud_okteto_com % kubectl get no Error from server (Forbidden): nodes is forbidden: User "system:serviceaccount:okteto:2abd1575-5740-4b7e-b54e-d8eab33a8a4c" cannot list resource "nodes" in API group "" at the cluster scope
Kubernetesクラスターとして使ってみる
Kubernetesクラスターとして使ってみましょう。次のようなYAMLを作ります。
apiVersion: v1 kind: Pod metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx:1.21.5 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: hello-nginx labels: app: nginx annotations: dev.okteto.com/auto-ingress: "true" spec: type: LoadBalancer ports: - port: 8080 protocol: TCP targetPort: 80 selector: app: nginx
先に作ったYAMLを使って、Podを作ってみます。
% kubectl apply -f deploy.yaml pod/nginx created service/hello-nginx created % kubectl get po NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 20s % kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-nginx ClusterIP 10.152.115.213 <none> 8080/TCP 26s % kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE okteto-hello-nginx <none> hello-nginx-ytooyama.cloud.okteto.net 35.225.69.73 80, 443 30s
ちょっと待ってからブラウザでアクセスすると、NGINXのデフォルトページが表示されると思います。
Welcome to nginx! If you see this page, the nginx web server is successfully installed and working. Further configuration is required. For online documentation and support please refer to nginx.org. Commercial support is available at nginx.com. Thank you for using nginx.
Oktetoは、他の人に作成中のコンテナプリケーションを見せたい時に便利そうですね。 次はOktetoのGitOps機能を触ってみます。
OktetoのGitOps機能を触ってみる
OktetoのGitOps機能も試してみます。GUIとCLIで利用できるようですが、GUIから設定したほうが簡単なので、GUIでやってみます。
Oktetoサイトにアクセスしてログインします。
すると、次のような画面が現れます。
「Deploy」と言うボタンを押すと次のような画面が表示されます。GitのリポジトリーURLを選ぶだけであっという間に完了です。
指定したGitリポジトリーに変更(コミット)があると、最新のコミットのソースをベースとしてアプリケーションがデプロイされます。
アプリケーションが展開されました。LBのURLにアクセスするとアプリケーションにアクセスできます。
サンプルで使ったコードを見てみる
今回使ったコードは次のものです。
アプリケーションのコードが複数置かれていますが、OktetoのGitOps部分のパイプライン定義は、次のファイルに書かれているようです。実際使うとすると、こういった内容のファイルがリポジトリに必要みたいですね。
中を覗いてみると、oktetoコマンドとhelmコマンドを使ってアプリのデプロイをしているようです。
それぞれのサービスはディレクトリ配下のokteto.yml
に書くようですね。
api/okteto.yml
frontend/okteto.yml
GitOpsとDevOps、CI/CDの違い
DevOpsの考え方であるCI/CDはプランから開発、リリースまでのサイクルを速く回すことで製品の品質の向上や機能の追加を効率よくやろうという考え方であり、開発者はコーディングからテスト、デプロイまでを終始一貫して行う。ざっくりいうとこれがDevOpsです。
一方、GitOpsはWeaveworks社が提唱し始めたCDの手法のことです。
詳細は「Guide To GitOps」に書かれていているため省略しますが、宣言的なインフラストラクチャとアプリケーションの単一の情報源としてGitを使用する開発のやり方です。デプロイ先としてはKubernetesのようなコンテナが使われます。
GitOpsは、ざっくり言うと「Gitソースが更新されたらGitソース上にあるYAMLファイルを使って、管理されているKubernrtesクラスター上にアプリケーションをデプロイする仕組み」であると考えていただければ問題ないと思います。
DevOps CI/CD(いわゆるCIを中心とした手法)とGitOpsを図にすると次のようになります。 まずはDevOps CI/CD。開発者が開発、イメージ作成、テスト、デプロイまでを一括で行なっています。
それに対してGitOpsは開発者とオペレーターで役割が分離しています。
どちらもGitをソースコード管理、CI(継続的インテグレーション)ツールを使うのは一緒です。実際のアプリケーションのデプロイ、デリバリーの部分が開発サイドとリリースサイクルが分離されている点がDevOps CI/CDとGitOpsの大きな違いになります。
つまり、開発者はアプリケーション開発とテストに注力し、アプリケーションを利用したサービスを提供する管理者(オペレーター)は最終的な試験とリリースからデプロイまでのサイクルの自動化だけに注力できる。これがGitOpsと言う開発サイクルの手法と言うわけです。
GitOpsやGitOpsツールについては今後とことんDevOpsブログで取り上げる予定です。是非、こちらのブログにアクセスいただいて、ブログの購読もよろしくお願いします!「とことんDevOpsブログ」では、DevOpsやその周辺のソフトウェア、および開発に関する情報をお届けする予定です。