仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

Oktetoを触ってみる

とある案件で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のダウンロード

oktetoCLIを次のようにダウンロードします。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サイトにアクセスしてログインします。

f:id:virtualtech:20220216175421p:plain

すると、次のような画面が現れます。

f:id:virtualtech:20220216175454p:plain

「Deploy」と言うボタンを押すと次のような画面が表示されます。GitのリポジトリーURLを選ぶだけであっという間に完了です。

f:id:virtualtech:20220216175522p:plain

指定したGitリポジトリーに変更(コミット)があると、最新のコミットのソースをベースとしてアプリケーションがデプロイされます。

f:id:virtualtech:20220216175603p:plain

アプリケーションが展開されました。LBのURLにアクセスするとアプリケーションにアクセスできます。

f:id:virtualtech:20220216175631p:plain

サンプルで使ったコードを見てみる

今回使ったコードは次のものです。

github.com

アプリケーションのコードが複数置かれていますが、OktetoのGitOps部分のパイプライン定義は、次のファイルに書かれているようです。実際使うとすると、こういった内容のファイルがリポジトリに必要みたいですね。

github.com

中を覗いてみると、oktetoコマンドとhelmコマンドを使ってアプリのデプロイをしているようです。 それぞれのサービスはディレクトリ配下のokteto.ymlに書くようですね。

api/okteto.yml

github.com

frontend/okteto.yml

github.com

GitOpsとDevOps、CI/CDの違い

DevOpsの考え方であるCI/CDはプランから開発、リリースまでのサイクルを速く回すことで製品の品質の向上や機能の追加を効率よくやろうという考え方であり、開発者はコーディングからテスト、デプロイまでを終始一貫して行う。ざっくりいうとこれがDevOpsです。

一方、GitOpsはWeaveworks社が提唱し始めたCDの手法のことです。

www.weave.works

詳細は「Guide To GitOps」に書かれていているため省略しますが、宣言的なインフラストラクチャとアプリケーションの単一の情報源としてGitを使用する開発のやり方です。デプロイ先としてはKubernetesのようなコンテナが使われます。

GitOpsは、ざっくり言うと「Gitソースが更新されたらGitソース上にあるYAMLファイルを使って、管理されているKubernrtesクラスター上にアプリケーションをデプロイする仕組み」であると考えていただければ問題ないと思います。

DevOps CI/CD(いわゆるCIを中心とした手法)とGitOpsを図にすると次のようになります。 まずはDevOps CI/CD。開発者が開発、イメージ作成、テスト、デプロイまでを一括で行なっています。

f:id:virtualtech:20220216180233p:plain

それに対してGitOpsは開発者とオペレーターで役割が分離しています。

f:id:virtualtech:20220216180420p:plain

どちらもGitをソースコード管理、CI(継続的インテグレーション)ツールを使うのは一緒です。実際のアプリケーションのデプロイ、デリバリーの部分が開発サイドとリリースサイクルが分離されている点がDevOps CI/CDとGitOpsの大きな違いになります。

つまり、開発者はアプリケーション開発とテストに注力し、アプリケーションを利用したサービスを提供する管理者(オペレーター)は最終的な試験とリリースからデプロイまでのサイクルの自動化だけに注力できる。これがGitOpsと言う開発サイクルの手法と言うわけです。

GitOpsやGitOpsツールについては今後とことんDevOpsブログで取り上げる予定です。是非、こちらのブログにアクセスいただいて、ブログの購読もよろしくお願いします!「とことんDevOpsブログ」では、DevOpsやその周辺のソフトウェア、および開発に関する情報をお届けする予定です。

20220216180922