仮想化通信

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

Rancher 2.6でGitOpsを試してみた

Rancher 2.6はEnterprise向けの機能が多数追加されると聞いていて気になっていました。特に気になっていたのはContinuous Delivery機能です。

www.suse.com

Rancher 2.6以前もRancherを通じて「コンテナでDevOps」のようなことをする方法は用意されていました。Rancher 2.6ではより大規模、遠隔、エッジコンピューティングなどを想定した設計に刷新されたともあって、先日、時間があったので触ってみることにしました。

Rancher Serverのインストール

基本的にいつものようにドキュメントをみながらインストールするだけでした。DockerやKubernetesベースで動かします。

インストール後ログインすると、デザインが大幅に変わったホーム画面が表示されました。

f:id:virtualtech:20211216153700p:plain

Rancherにノードを追加

まずいつもの様にノードを追加します。今回はオンプレベースで動かすことにしたため、LinuxをセットアップしてDockerをインストールすることにしました。

Linuxはいつもの様にMAASを使ったため、Ubuntu Server 18.04をデプロイした後、Installing Dockerのドキュメントのスクリプトを使ってDockerをセットアップしました。

準備ができたらRancherのホームに戻り、左上のハンバーガーメニュー(三本線)をクリックして、Cluster Managementを選び、Cluster Createをします。

f:id:virtualtech:20211216154237p:plain   いつもの様にCustomクラスターを追加します。Customクラスターの設定は、クラスター名とKubernetesのバージョン、CNI、Ingressの設定などを行います。終わったら「Next」ボタンを押します。

Cluster Options画面ではいつものようにetcd、Control Plane、Workerを展開するノード上で指示されたコマンドを実行します。今回は4つのノードを用意して、次のように構成しました。

f:id:virtualtech:20211216154302p:plain

  • node1 = etcd, Control Plane
  • node2 = Worker
  • node3 = Worker
  • node4 = Worker

しばらく待つと、RancherのRKEによって、Kubernetesクラスターが作成されます。 同じ要領でサーバーを別に4つ用意して、同様にKubernetesクラスターを作成しました。

KubernetesにストレージLonghornを導入

Kubernetesでは、コンテナーアプリケーションに対して永続ストレージを提供するにはいくつかの方法がありますが、Rancherでサクッと永続ストレージを使うにはLonghornが便利です。

f:id:virtualtech:20211216154339p:plain

Rancherで管理しているKubernetesにストレージLonghornを導入するのはすごく簡単です。RancherのカタログからLonghornを選んでデプロイするだけです。デフォルトの設定のままでも問題なく利用可能でした。

f:id:virtualtech:20211216154511p:plain

RancherでCDを試す

RancherでCDを試すには、「Continuous Delivery」の画面にある機能(Fleetという技術が使われています)を利用します。この機能はRancher 2.5でも利用できましたが、2.6では画面デザインが統一されています。

f:id:virtualtech:20211216154538p:plain   使い方はこの動画で説明してくれているので、この機能をざっくりと説明するとFleetは、「最大100万クラスターの管理、GitOpsを実現」するためのツールです。

f:id:virtualtech:20211216154603p:plain

(Fleetのアーキテクチャ。Fleetの公式サイトより引用)

一番簡単な使い方としては、Kubernetesクラスターをクラスターグループにします。クラスターグループにタグを設定します。こうすることでGitOpsを利用するときにそのタグを指定することにより、同じグループに属したクラスターに対してコンテナアプリケーションのクラスターグループへの一括デプロイが可能になります。

f:id:virtualtech:20211216154726p:plain

Rancher CD設定例

f:id:virtualtech:20211216155007p:plain

次の様な設定を行っています。

  • Name: gitops2 (GitOps名)
  • Description: (説明の入力が必要であれば何か書く)
  • Git Authentication: None (認証が必要であれば)
  • Helm Authentication: None (認証が必要であれば)
  • TLS Certificate Verification: Require a valid certificate
  • Repogitry URL: https://github.com/ytooyama/fleet-example2.git
  • Branch Name: (TagやコミットIDを指定する方法もある)
  • Paths: simple (Gitソースのフォルダ)
  • Deploy To
    • Target: tokyo-shibuya1-cluster (コンテナクラスタを指定)
    • Service Account Name: (オプション)
    • Target Namespace: (オプション)
  • Labels: None
  • Annotations: None

Rancher CDにCIを追加するには

f:id:virtualtech:20211216164528p:plain:w360

(上記画像はWikipediaから引用

DevOpsってCI/CDをセットにするのが一般的かと思います。一方RancherのContinuous Delivery機能はCDのみなので、別途CI側のロジックを考えないといけません。

ただそこは使っているGit Server側が対応するところなので、例えばGitHubをソースコード管理に使っているなら、GitHubに対応するCIツールを連携させれば良いことになります。代表的なのは、Circle CIとかTravis CIとかJenkinsとか、GitHubを使っているならGitHub Actionsなどでも。

いずれかのCIツールで「コードのPush→CIが実行→(成功したら)コードを別のブランチにコミット」のようなフローを設定すれば、テストが通ったソースコードのブランチの新しいコミットを定期的に監視しているRancher CDが新しいコミットを認識して、うまくGitベースによる継続的デプロイをおこなってくれます。

ただ、Git Server側のソースとCIの設定に注意する必要があります。例えばソースコード管理にGitHubを利用し、CIにGitHub Actionを使う環境で次のようなYAMLファイルを作ってCIを回そうとすると、「GitHubにコードがコミット→CIが回る」となってしまい、失敗するか成功するかわからないコードを使ってRancher CDが回ってしまいます。

name: Validate container image 
on:
  - push

jobs:
  validate-data-Docker:
    permissions:
      contents: read
    runs-on: ubuntu-latest
    container:
      image: gcr.io/google-samples/gb-frontend:v4
    steps:
      - name: Validate workflows
        run: |
          cat controllers.js
          cat index.html
          php guestbook.php
        working-directory: /var/www/html

そこで、次のActionsを利用して...

github.com

次の様に設定してみました。これによりコードのコミットはmainに行ない、CIが通ったコードはstableブランチにコミットされます。

あとはRancher CDで監視するブランチをmainではなくstableにすれば、テストが通ったコードを使ってコンテナアプリケーションの継続的デプロイが実現できそうです。

以下サンプルはファイルの表示のような単純なことしか行っていませんが、イメージの脆弱性チェックをおこなったりYAMLの構文チェックをおこなったり、ソースコードを色々なツールを使ってコード解析をおこなったりすると、より本格的になると思います。

name: Validate container image 
on:
  - push

jobs:
  validate-data-Docker:
    permissions:
      contents: read
    runs-on: ubuntu-latest
    container:
      image: gcr.io/google-samples/gb-frontend:v4
    steps:
      - name: Validate workflows
        run: |
          cat controllers.js
          cat index.html
          php guestbook.php
        working-directory: /var/www/html

      - name: Check the Container image
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          commit_message: Automated Change
          branch: stable

GitHub ActionsでCIが成功するとブランチstableにコミットされます。Fleetが設定したGitソースを定期的に監視しており、新しいコミットがされると新しいコードベースで継続的デプロイが実現できます。

f:id:virtualtech:20211216155105p:plain

コマンドラインツールを使って、アプリケーションを確認してみます。

[ytooyama@m1macmini] ~
% rancher kubectl get deployment
INFO[0000] Saving config to /Users/ytooyama/.rancher/cli2.json
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
frontend       2/2     2            2           21h
redis-master   1/1     1            1           21h
redis-slave    2/2     2            2           21h
[ytooyama@m1macmini] ~
% rancher kubectl get svc
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
frontend       NodePort    10.43.125.80    <none>        80:31750/TCP   21h
kubernetes     ClusterIP   10.43.0.1       <none>        443/TCP        2d1h
redis-master   ClusterIP   10.43.110.195   <none>        6379/TCP       21h
[ytooyama@m1macmini] ~
% rancher context switch
NUMBER    CLUSTER NAME   PROJECT ID        PROJECT NAME   PROJECT DESCRIPTION
1         testcluster4   c-2hhp6:p-qp8v8   System         System project created for the cluster
2         testcluster4   c-2hhp6:p-spcw6   Default        Default project created for the cluster
3         testcluster3   c-wj9ll:p-dfxwq   System         System project created for the cluster
4         testcluster3   c-wj9ll:p-xmx62   Default        Default project created for the cluster
5         local          local:p-hchcd     System         System project created for the cluster
6         local          local:p-sl9tj     Default        Default project created for the cluster
Select a Project:4
INFO[0023] Setting new context to project Default
INFO[0023] Saving config to /Users/ytooyama/.rancher/cli2.json
[ytooyama@m1macmini] ~
% rancher kubectl get deployment
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
frontend       2/2     2            2           21h
redis-master   1/1     1            1           21h
redis-slave    2/2     2            2           21h
[ytooyama@m1macmini] ~
% rancher kubectl get svc
NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
frontend       NodePort    10.43.55.148   <none>        80:31363/TCP   21h
kubernetes     ClusterIP   10.43.0.1      <none>        443/TCP        2d2h
redis-master   ClusterIP   10.43.65.117   <none>        6379/TCP       21h
redis-slave    ClusterIP   10.43.98.133   <none>        6379/TCP       21h

まとめ

Kubernetes環境はRancherにより短時間で簡単に構築できます。GitOps環境もKubernetesオブジェクトを構成するためのYAMLファイルなどをGitによってソースコード管理すれば、あとはそのGitに対応するCIツールを関連づけることでコンテナアプリケーションの継続的インテグレーション(CI)と継続的デプロイ(CD)が可能であることがわかりました。

Rancher 2.6は、なかなか良いですね。