Rancher: Migrating from an HA RKE Add-on Install

RKE Add-on での Rancher セットアップはもう古い

過去に試していた RKE での Rancher の HA セットアップ (続 Rancher 2.0 の HA 構成を試す) はどうやらもう古いらしい。2.0.8 までしかサポートしてないよというのには気づいていたのですが、改めてインストールページ(RKE Add-On Install)を確認するとこの方法はもう過去のものらしい。Helm 使ってねと。

Important: RKE add-on install is only supported up to Rancher v2.0.8

Please use the Rancher helm chart to install HA Rancher. For details, see the HA Install - Installation Outline.

If you are currently using the RKE add-on install method, see Migrating from an HA RKE Add-on Install for details on how to move to using the helm chart.

Helm を使ったセットアップへの変更

そんなわけで、構築済みの HA Rancher を RKE add-on から変更する手順をなぞってみます。Migrating from an HA RKE Add-on Install

kubectl を rancher cluster に向ける

私のセットアップでは RKE に rke.yml というファイルを渡したので kube_config_rke.yml が生成されています。環境変数 KUBECONFIG でこれを指定します。

export KUBECONFIG=$(pwd)/kube_config_rke.yml

Kubernetes は 1.11.6 だったので同じバージョンの kubectl コマンドを curl で取得します。とりあえずカレントディレクトリに置いておくので以降 ./kubectl として実行します。(後で出てくる helm コマンドも同様)
Install kubectl binary using curl

次のコマンドでここまでの設定が正しく行えているかを確認します。

./kubectl config view -o=jsonpath='{.clusters[*].cluster.server}'

出力が https://NODE:6443 の様に1つのノードの 6443 ポートを指していれば正しいです。

証明書の保存

Rancher クラスタの Ingress で TLS Termination を行っている場合は Helm でのインストール時に必要となるため、次のコマンドで取り出します。後で Kubernetes Secrets に登録します。

証明書

./kubectl -n cattle-system get secret cattle-keys-ingress \
  -o jsonpath --template='{ .data.tls\.crt }' | base64 -d > tls.crt

秘密鍵

./kubectl -n cattle-system get secret cattle-keys-ingress \
  -o jsonpath --template='{ .data.tls\.key }' | base64 -d > tls.key

プライベート CA を使っている場合は次のコマンドで CA の証明書も取得します。

./kubectl -n cattle-system get secret cattle-keys-server \
  -o jsonpath --template='{ .data.cacerts\.pem }' | base64 -d > cacerts.pem

古い Kubernetes オブジェクトを削除

RKE でのインストールで作られた Kubernetes オブジェクトを削除する。

./kubectl -n cattle-system delete ingress cattle-ingress-http
./kubectl -n cattle-system delete service cattle-service
./kubectl -n cattle-system delete deployment cattle
./kubectl -n cattle-system delete clusterrolebinding cattle-crb
./kubectl -n cattle-system delete serviceaccount cattle-admin

これらのコンポーネントを削除しても Rancher の設定やデータベースに影響はありませんが、何かメンテナンスを行う場合にバックアップを取得しておくのは良いことです。バックアップの取得方法は Creating Backups—High Availability Installs にあります。

Addon の削除

RKE で使う YAML (ここでは rke.yml) には Rancher で必要なリソースが全て入っています。今後の RKE 操作のためにここから addons セクションのまるっと削除しておきます。

addons: |-
  ---
  kind: Namespace
  apiVersion: v1
  metadata:
    name: cattle-system
  ---
  kind: ServiceAccount
  apiVersion: v1
  metadata:
    name: cattle-admin
    namespace: cattle-system
  ---
  kind: ClusterRoleBinding
  apiVersion: rbac.authorization.k8s.io/v1
  metadata:
    name: cattle-crb
    namespace: cattle-system
  subjects:
  - kind: ServiceAccount
    name: cattle-admin
    namespace: cattle-system
  roleRef:
    kind: ClusterRole
    name: cluster-admin
    apiGroup: rbac.authorization.k8s.io
  ---
  apiVersion: v1
  kind: Secret
  metadata:
    name: cattle-keys-ingress
    namespace: cattle-system
  type: Opaque
  data:
    tls.crt: <証明書の Base64>
    tls.key: <秘密鍵の Base64>
  ---
  apiVersion: v1
  kind: Service
  metadata:
    namespace: cattle-system
    name: cattle-service
    labels:
      app: cattle
  spec:
    ports:
    - port: 80
      targetPort: 80
      protocol: TCP
      name: http
    - port: 443
      targetPort: 443
      protocol: TCP
      name: https
    selector:
      app: cattle
  ---
  apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    namespace: cattle-system
    name: cattle-ingress-http
    annotations:
      nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
      nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"   # Max time in seconds for ws to remain shell window open
      nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"   # Max time in seconds for ws to remain shell window open
  spec:
    rules:
    - host: rancher.do.teraoka.me  # FQDN to access cattle server
      http:
        paths:
        - backend:
            serviceName: cattle-service
            servicePort: 80
    tls:
    - secretName: cattle-keys-ingress
      hosts:
      - rancher.do.teraoka.me      # FQDN to access cattle server
  ---
  kind: Deployment
  apiVersion: extensions/v1beta1
  metadata:
    namespace: cattle-system
    name: cattle
  spec:
    replicas: 1
    template:
      metadata:
        labels:
          app: cattle
      spec:
        serviceAccountName: cattle-admin
        containers:
        # Rancher install via RKE addons is only supported up to v2.0.8
        - image: rancher/rancher:v2.0.8
          args:
          - --no-cacerts
          imagePullPolicy: Always
          name: cattle-server
          livenessProbe:
            httpGet:
              path: /ping
              port: 80
            initialDelaySeconds: 60
            periodSeconds: 60
          readinessProbe:
            httpGet:
              path: /ping
              port: 80
            initialDelaySeconds: 20
            periodSeconds: 10
          ports:
          - containerPort: 80
            protocol: TCP
          - containerPort: 443
            protocol: TCP  

削ると残るのはこれだけ

nodes:
  - address: 192.168.100.1 # hostname or IP to access nodes
    user: rancher # root user (usually 'root')
    role: [controlplane,etcd,worker] # K8s roles for node
    ssh_key_path: id_rsa # path to PEM file
  - address: 192.168.100.2
    user: rancher
    role: [controlplane,etcd,worker]
    ssh_key_path: id_rsa
  - address: 192.168.100.3
    user: rancher
    role: [controlplane,etcd,worker]
    ssh_key_path: id_rsa

services:
  etcd:
    snapshot: true
    creation: 6h
    retention: 24h

Helm の初期化

ここからは Helm を使った通常のインストールする手順 (3. Initialize Helm (Install Tiller)) に進みます。Helm を使うためにはサーバーサイドコンポーネントの Tiller をインストールする必要があるようです。

helm コマンドは各種パッケージマネージャからもインストールできると思いますが、ここでは Github の releases ページからダウンロードします。cert-manager との組み合わせの問題で v2.12.1 以降が必要です。

まず、tiller という名前で Tiller 用のサービスアカウントを作成する。

./kubectl -n kube-system create serviceaccount tiller

次に、作成したサービスアカウントに cluster-admin ロールを付与します。

./kubectl create clusterrolebinding tiller \
  --clusterrole=cluster-admin \
  --serviceaccount=kube-system:tiller

Helm の初期化

./helm init --service-account tiller

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster. と表示されていれば Tiller のインストールが完了しているはず。

init 時に次のメッセージも出てました。必要であれば --tiller-tls-verify も付けることも検討。

Please note: by default, Tiller is deployed with an insecure ‘allow unauthenticated users’ policy. To prevent this, run `helm init` with the –tiller-tls-verify flag. For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation

Tiller の確認

Tiller が正しくインストールされているかどうかを次のコマンドで確かめます。

./kubectl -n kube-system  rollout status deploy/tiller-deploy

deployment "tiller-deploy" successfully rolled out と表示されれば OK.

バージョン確認

$ ./helm version
Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}

Rancher のインストール

次の手順はこちら 4. Install Rancher.

Helm Chart repository の追加

latest, stable, alpha から選んで追加します。Production 環境であれば stable を選択。(alpha は upgrade がサポートされていません)(Helm Chart Repositories)

./helm repo add rancher-latest https://releases.rancher.com/server-charts/latest

./helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

./helm repo add rancher-alpha https://releases.rancher.com/server-charts/alpha

SSL/TLS 設定の選択

証明書には3つの推奨設定があります。上2つには cert-manager が必要。

Rancher が生成 (default)

(chart option) ingress.tls.source=rancher

Let’s Encrypt

(chart option) ingress.tls.source=letsEncrypt

ファイルからの読み込み (Kubernetes の Secrets に入れる)

(chart option) ingress.tls.source=secret

cert-manager のインストール (必要な場合のみ)

Kubernetes Helm chart repository からインストールする。

./helm install stable/cert-manager \
  --name cert-manager \
  --namespace kube-system \
  --version v0.5.2

インストールが完了するまで待つ。次のコマンドで deployment "cert-manager" successfully rolled out と表示されるようになれば完了。

./kubectl -n kube-system rollout status deploy/cert-manager

Rancher のデプロイ (Rancher Generated Certificates)

デフォルトが Rancer Generated なので特に証明書に関するオプションは指定されていない。(この例はリポジトリが rancher-latest になっていることに注意)

./helm install rancher-latest/rancher \
  --name rancher \
  --namespace cattle-system \
  --set hostname=rancher.example.com

デプロイの状況を確認する。

./kubectl -n cattle-system rollout status deploy/rancher

Rancher のデプロイ (Let’s Encrypt)

Let’s Encrypt での証明書発行のためにメールアドレスを指定する必要がある。(この例はリポジトリが rancher-latest になっていることに注意)

./helm install rancher-latest/rancher \
  --name rancher \
  --namespace cattle-system \
  --set hostname=rancher.example.com \
  --set ingress.tls.source=letsEncrypt \
  --set letsEncrypt.email=me@example.org

デプロイの状況を確認する。

./kubectl -n cattle-system rollout status deploy/rancher

Rancher のデプロイ (Certificates from Files)

今回は RKE でのセットアップ時に使っていたものを取り出したファイルを使うのでこの手順で進めます。(この例はリポジトリが rancher-latest になっていることに注意)

./helm install rancher-latest/rancher \
  --name rancher \
  --namespace cattle-system \
  --set hostname=rancher.example.com \
  --set ingress.tls.source=secret

実行すると次のような出力がある。

NAME:   rancher
LAST DEPLOYED: Sun Mar 24 22:21:35 2019
NAMESPACE: cattle-system
STATUS: DEPLOYED

RESOURCES:
==> v1/ClusterRoleBinding
NAME     AGE
rancher  1s

==> v1/Deployment
NAME     READY  UP-TO-DATE  AVAILABLE  AGE
rancher  0/3    3           0          0s

==> v1/Pod(related)
NAME                     READY  STATUS             RESTARTS  AGE
rancher-f7467f757-9mpdp  0/1    ContainerCreating  0         0s
rancher-f7467f757-m5v49  0/1    ContainerCreating  0         0s
rancher-f7467f757-tq4jg  0/1    ContainerCreating  0         0s

==> v1/Service
NAME     TYPE       CLUSTER-IP   EXTERNAL-IP  PORT(S)  AGE
rancher  ClusterIP  10.43.23.29  80/TCP   1s

==> v1/ServiceAccount
NAME     SECRETS  AGE
rancher  1        1s

==> v1beta1/Ingress
NAME     HOSTS                ADDRESS  PORTS  AGE
rancher  rancher.example.com  80, 443  0s


NOTES:
Rancher Server has been installed.

NOTE: Rancher may take several minutes to fully initialize. Please standby while Certificates are being issued and Ingress comes up.

Check out our docs at https://rancher.com/docs/rancher/v2.x/en/

Browse to https://rancher.example.com

Happy Containering! 

Kubernetes Secrets に証明書を tls という secret タイプで tls-rancher-ingress という名前で登録します。

./kubectl -n cattle-system create secret tls tls-rancher-ingress \
  --cert=tls.crt \
  --key=tls.key

プライベート CA の場合はそれも登録する。こちらは generic タイプ。

./kubectl -n cattle-system create secret generic tls-ca \
  --from-file=cacerts.pem

デプロイの状況を確認する。

./kubectl -n cattle-system rollout status deploy/rancher

Rancher 2.1.7 に更新されました。次は https://github.com/yteraoka/rancher-ha-tf-do を Helm でのセットアップに変更しようと思います。

Built with Hugo
テーマ StackJimmy によって設計されています。