Rancher on AKS
はじめに
こちらは エーピーコミュニケーションズ Advent Calendar 2021 初日の記事となります。
振り返ると、この Advent Calendar も今年で4年目になります。そんな今回は 原点に立ち返り Rancher を取り上げようと思います。
↓2018年の記事
今回は 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台になります。
$ 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 のバージョンにもよるかと思いますが、設定がないとデプロイに失敗したので追加してます。
---
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
@@ -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