Rancher Server(v2.6)の構築

# はじめに
オンプレミスでK8sクラスタをGUI管理できるRancherを構築した際のメモ。
k3sの機能の一つであるHelm CRDで詰まったのでその際のトラブルシューティング方法も記載。

今回、オンプレでの他の構築ツールとしては下記も調べてみたが、vCenterと相性が良くクラスタ作成がWeb GUI画面したかったためRancherを選んだ。

- Kubespray
- kubeadm


# Rancherとは
Rancher Labsが提供しているマルチクラウドでKubernetesクラスタを管理するためのプラットフォームを提供するサーバ。
Rancher Labsは、他にもk3sやLonghornなども開発しておりドキュメントもしっかりしているため比較的Kubernetes導入しやすく感じる。
また、2020/12にRancher LabsはSUSEに買収され、[コミュニティ](https://rancher.connpass.com/)イベントもかなり活発化している。

![platform.png](https://rancher.com/docs/img/rancher/platform.png)

# 全体構成
Rancher Serverを構築してクラスタまで作成したときの全体イメージは下記図の通り。
クラスタを管理するための`Rancher Server`と`Downstream User Cluster`で構成される。
本記事では、`Rancher Server`の構築のみを紹介する。
Rancher ServerはDockerでコンテナを一つ作成するだけでも作れるらしいが、今回は将来的な拡張も考え、シングル構成のk3sとhelm CRDを使ってデプロイする。

:::note info
k3sでは、kubernetesマニフェストを特定ディレクトリに置くと自動でデプロイされる。
helm CRDは、そのマニフェストの中でhelmチャートを自動的にデプロイできるようにするためのk3sの機能
:::

![architecture.png](https://rancher.com/docs/img/rancher/rancher-architecture-rancher-api-server.svg)

# 構築時点のバージョン
OS: CentOS 7.9
k8s: v1.21.4+k3s1
Rancher: 2.6
cert-manager: 1.5.3

# 構築手順
## 1. Linuxサーバ構築
特に、記載する内容はない
念の為、下記実施
- firewalldの無効化
- SELinuxの無効化

## 2. k3sインストール
ドキュメントのQuick Start通りで下記コマンドで自動的にcontainerdからk3sまで自動的にインストールされる
インストール後は、コンテナ間のネットワークがうまくつながらないため、再起動が必要

```bash
curl -sfL https://get.k3s.io | sh -
```

## 3. cert-managerのインストールとCRDs定義
Rancher ServerはSSL必須となるため、証明書が別途必要となる。
証明書は下記オプションがあるが、今回はデフォルトのRancherにて自動作成する方法ですすめるためcert-managerをインストールする。

| 設定                                    | HELM CHARTオプション                | cert-managerが必要かどうか |
|------------------------|--------------------------------|---------------------|
| ランチャーが生成した証明書（デフォルト）   | ingress.tls.source=rancher     | yes                 |
| Let’s Encrypt利用した証明書生成           | ingress.tls.source=letsEncrypt | yes                 |
| ファイルからの証明書インポート             | ingress.tls.source=secret      | no                  |

### 3.1 cert-manager CRDsインストール
CRDsはマニフェスト定義では作成されないため、手動でデプロイする必要がある。
インストールするcert-managerのバージョンと合わせて下記コマンドを実行

```bash
k3s kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.1/cert-manager.crds.yaml
```

### 3.2 cert-manager定義作成
cert-managerのマニフェストを定義

```yaml:/var/lib/rancher/k3s/server/manifests/cert-manager.yaml
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: cert-manager
  namespace: cert-manager
spec:
  version: v1.5.3
  chart: cert-manager
  repo: https://charts.jetstack.io
```

### 3.3 cert-managerネームスペース作成
上記マニフェスト定義をしても、対象のネームスペースがないとデプロイされない。
下記コマンドにて、`cert-manager`ネームスペースを作成

```bash
k3s kubectl create namespace cert-manager
```

## 4. Rancherインストール
Rancher ServerをKubernetes環境にデプロイする。
デプロイタイミングで、cert-managerを使って証明書作成される。

### 4.1 rancher定義作成
Rancherのマニフェスト定義
Rancherのドキュメントに合わせて、ネームスペースは`cattle-system`としている。
初回ログイン時の初回パスワードを事前定義(今回では、rancherにしている)

```yaml:/var/lib/rancher/k3s/server/manifests/rancher.yaml
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: rancher
  namespace: cattle-system
spec:
  chart: rancher
  repo: https://releases.rancher.com/server-charts/latest
  set:
    hostname: rancher.example.com
    bootstrapPassword: rancher
    replicas: 1
```

### 4.2 cattle-systemネームスペース作成
下記コマンドにて、`cattle-system`ネームスペースを作成

```bash
k3s kubectl create namespace cattle-system
```

### 5. Rancherサーバにアクセス
4.の`set.hostname`でで定義したFQDNでサーバにアクセスｓると初回ログイン画面が表示されるので、4.の`set.bootstrapPassword`でログインすると利用可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/0a52233b-6732-f7c5-836e-4d17bec99b3c.png)

:::note warn
FQDNを使ってのアクセスはDNSへの登録もしくはhostsへの定義をする必要がある。
:::

# Helm CRDのトラブルシューティング
Helm CRDを利用したときに引っかかったポイントと対応方法をメモ

- helmとHelm CRDの定義の相関関係がわからない
    - [ここ](https://rancher.com/docs/k3s/latest/en/helm/#helmchart-field-definitions)を参照
    - `helm repo add XXX`は`spec.repo`で定義
    - `helm install XXX`は`spec.chart`で定義
    - 他は`spec.set`と`spec.version`を使えれば大丈夫。`spec.targetNamespace`は`metadata`で代替できている？
- helm CRDの仕様がわからない
    - すみません。私もわからなかったです。
    - 動き的には、ファイル作成されたタイミングで即座に実行される
    - 削除時は、特に何もされない？(確証なし)ため、ネームスペースでまとめて削除がいい
- kubernetesのデプロイエラー確認
    - helm CRDが正しく動いているかは、`/var/log/messages`を確認
    - kubernetesのデプロイ時エラーは、`k3s kubectl logs -n <namespace> <pod名>`で確認
    - pod名はデプロイのたびに変わるため、別窓で右記コマンドで定期的にpod名を列挙`watch k3s kubectl get pods --all-namespaces`

# さいごに
rancherとk3sを利用することで、Kubernetes構築に必要な手順をかなり簡略化できるようになった。
Ansible AWXでもKubernetes利用が前提となっているなどKubernetes環境が基盤構築で必要となる世界になってきたので他OS利用していたとしても容易なKubernetes構築が可能になるようにしていきたい。
~~特にpodmanとは今後も仲良くはしたいが...~~

今後は、VMware環境でのクラスタ作成とLonghornを使ったストレージ管理をしてみたいと思う。

# 参考
- [Rancher Install document](https://rancher.com/docs/rancher/v2.6/en/installation/install-rancher-on-k8s/chart-options/)
- [k3s Install document](https://rancher.com/docs/k3s/latest/en/quick-start/)