🐄

Rancher on AKS

2021/12/01に公開

https://qiita.com/advent-calendar/2021/ap-com

はじめに

こちらは エーピーコミュニケーションズ Advent Calendar 2021 初日の記事となります。

振り返ると、この Advent Calendar も今年で4年目になります。そんな今回は 原点に立ち返り Rancher を取り上げようと思います。

↓2018年の記事
https://qiita.com/t_ume/items/9ad3b34a83d40bc1d023

今回は AKS 上に Rancher を構築していきます。
今まではオンプレ環境に Vagrant + kubeadm + Rancher だったので、マネージドの良さを活かしてパパっとデプロイできればと思います。

環境情報

Kubernetes:1.20.9
helm:v3.4.0
Rancher:2.6.2
cert-manager:1.6.1
NGINX Ingress Controller:1.1.0

AKS 準備

こちらの記事でも紹介したようにサクっと AKS を起動します。
今回はノードの台数を指定していないので、デフォルトの3台になります。

https://zenn.dev/t_ume/articles/f1bd79086115b5

AKS作成
$ az aks create -n myAKSCluster -g xxxx -a monitoring --generate-ssh-keys

kubectl での操作を Azure Cloud Shell で実行するので、ついでに Azure Cloud Shell 上の環境をセットアップします。

環境セットアップ
# Kubernetes 接続用のクレデンシャル取得
$ az aks get-credentials -g xxxx -n myAKSCluster

# kubectl krew インストール(プラグイン)
$ ( set -x; cd "$(mktemp -d)" && \
  OS="$(uname | tr '[:upper:]' '[:lower:]')" \
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" && \
  KREW="krew-${OS}_${ARCH}" && \
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" && \
  tar zxvf "${KREW}.tar.gz" &&   ./"${KREW}" install krew; )

# namespace 切り替え用のプラグインインストール
$ kc krew install ns

# エイリアス、補完のためのシェル設定
$ vi ~/.bashrc 

※末尾に以下を追加
source <(kubectl completion bash)
alias kc=kubectl
complete -F __start_kubectl kc
export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"

# シェルの設定読み込み
$ source .bashrc

デプロイ前準備

Rancher デプロイ前に以下の必要なソフトウェアをデプロイしていきます。

  • NGINX Ingress Controller
  • cert-manager
# helm リポジトリ登録
$ helm repo add jetstack https://charts.jetstack.io
"jetstack" has been added to your repositories

$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
"ingress-nginx" has been added to your repositories

$ helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
"rancher-stable" has been added to your repositories

# リポジトリ情報更新
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "ingress-nginx" chart repository
...Successfully got an update from the "jetstack" chart repository
...Successfully got an update from the "rancher-stable" chart repository
Update Complete. ⎈Happy Helming!⎈

# namespace 作成
$ kubectl create ns cert-manager
namespace/cert-manager created

$ kubectl create ns ingress-nginx
namespace/ingress-nginx created

$ kubectl create ns cattle-system
namespace/cattle-system created

# cert-manager に必要な CRD デプロイ
$ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.6.1/cert-manager.crds.yaml
customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io created

# cert-manager デプロイ
$ helm install cert-manager jetstack/cert-manager -n cert-manager --version v1.6.1
・・・
cert-manager v1.6.1 has been deployed successfully!
・・・

# NGINX Ingress Controller デプロイ
$ helm install ingress-nginx ingress-nginx/ingress-nginx -n ingress-nginx
・・・
The ingress-nginx controller has been installed.
・・・

Ingress の設定のため、IngressClass を作成します。Kubenetes のバージョンにもよるかと思いますが、設定がないとデプロイに失敗したので追加してます。

IngressClass.yaml
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: nginx
spec:
  controller: nginx.org/ingress-controller
# IngressClass 作成
$ kubectl apply -f IngressClass.yaml 
ingressclass.networking.k8s.io/nginx created

Deploy Rancher

準備ができたので Rancher をデプロイします。
値をセットしたいので、ベースとなる values.yaml ファイルを取得して編集します。

$ helm pull rancher-stable/rancher --untar
rancher/values.yaml
@@ -44,5 +44,5 @@

 # Fully qualified name to reach your Rancher server
-# hostname: rancher.my.org
+hostname: www.rancher.internal

 ## Optional array of imagePullSecrets containing private registry credentials
@@ -59,5 +59,6 @@
   enabled: true
   includeDefaultExtraAnnotations: true
-  extraAnnotations: {}
+  extraAnnotations:
+    kubernetes.io/ingress.class: nginx

   # configurationSnippet - Add additional Nginx configuration. This example statically sets a header on the ingress

早速デプロイします。

$ helm install rancher rancher-stable/rancher -n cattle-system -f rancher/values.yaml
・・・
Rancher Server has been installed.
・・・
Happy Containering!

デプロイ処理に5分ほどかかるので、Pod の状況をみながら待ちます。
※Rancher 本体以外にも Operator や fleet などがデプロイされるようです。

# 起動確認
$ kubectl get deploy,pod
NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/rancher           3/3     3            3           6m18s
deployment.apps/rancher-webhook   1/1     1            1           4m24s

NAME                                   READY   STATUS      RESTARTS   AGE
pod/helm-operation-5t8r6               0/2     Completed   0          5m4s
pod/helm-operation-75hzv               0/2     Completed   0          4m27s
pod/helm-operation-qzq4j               0/2     Completed   0          4m35s
pod/rancher-7546f84756-46tr8           1/1     Running     0          6m18s
pod/rancher-7546f84756-498xl           1/1     Running     0          6m18s
pod/rancher-7546f84756-mqpp8           1/1     Running     0          6m18s
pod/rancher-webhook-6979fbd4bf-dt88l   1/1     Running     0          4m24s

アクセス確認

実際に Web画面 にアクセスしてみます。
今回は DNS の登録がないので、クライアントマシンの hosts にパブリック IP と hostname を登録します。パブリック IP は Ingress に紐付けられているので、確認します。

$ kubectl get ing
NAME      CLASS    HOSTS                  ADDRESS       PORTS     AGE
rancher   <none>   www.rancher.internal   20.xx.xx.xx   80, 443   8m58s

また、管理者(admin)の初期パスワードを取得します。
values.yaml に指定が可能で、デフォルトはランダムなパスワードが登録されます。

$ kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}{{"\n"}}'

hosts にパブリック IP の登録が済むと以下のアドレスでアクセスできます。

https://www.rancher.internal/

初回ログイン画面

先程取得した初期パスワードを入力すると、パスワード設定画面が出ます。

デフォルトでランダムなパスワードが設定されるので、適宜変更してください。
I agree to the terms and conditions for using Rancher をチェックし、Continue でトップ画面が表示されます。

トップ画面

まとめ

久々に Rancher を起動してみましたが、helm を使ってサクッとデプロイすることができました。以前と比べて、Kubernetes のバージョンの差があったので、その差分の分だけ手順の追加が必要でしたが、問題なくデプロイ出来ました。

久々に Rancher のメニュー画面を見たのですが、以前と全く別物になっていたのでびっくりです・・・
次回あたりで画面の紹介や使い勝手を見ていこうと思います。

明日以降も引き続き、エーピーコミュニケーションズ Advent Calendar 2021 をお楽しみください!

補足

デプロイ後の情報をいくつか。

namespace

namespaceが随分荒れてます・・・一時的な namespace っぽいものもあるみたいなので何とかしたい。

# AKS デフォルトの namespace
NAME                                     STATUS   AGE
default                                  Active   78m
kube-node-lease                          Active   78m
kube-public                              Active   78m
kube-system                              Active   78m

# Rancher デプロイ前に自分で作った namespace
NAME                                     STATUS   AGE
cattle-system                            Active   70m
cert-manager                             Active   70m
ingress-nginx                            Active   70m

# Rancher デプロイ後に自動的に作成された namespace
cattle-fleet-clusters-system             Active   24m
cattle-fleet-local-system                Active   24m
cattle-fleet-system                      Active   25m
cattle-global-data                       Active   25m
cattle-global-nt                         Active   25m
cattle-impersonation-system              Active   25m
cluster-fleet-local-local-1a3d67d0a899   Active   24m
fleet-default                            Active   25m
fleet-local                              Active   25m
local                                    Active   25m
p-hsqdb                                  Active   25m
p-zhg9h                                  Active   25m
user-pqctx                               Active   6m22s

リソースについて

request/limit の設定は values.yaml で設定できます。デフォルトでは設定無しなのですが、起動後の top は以下のとおりです。メモリはそれなりに使いそうですね。

$ kc top pod
NAME                               CPU(cores)   MEMORY(bytes)
rancher-7546f84756-46tr8           21m          488Mi
rancher-7546f84756-498xl           12m          680Mi
rancher-7546f84756-mqpp8           12m          457Mi
rancher-webhook-6979fbd4bf-dt88l   1m           55Mi

Discussion