RancherをMicroK8s(Kubernetes 1.17.0)で動かす

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

スタイルズアドベントカレンダーの23日目です。

Stylez Advent Calendar 2019 - Qiita
https://qiita.com/advent-calendar/2019/stylez

# 0. RancherをKubernetesで動かしたいけど、1サーバーで完結したいのでMicroK8s上で動かしたかった

章題のとおりでございます。

Rancherと言えば、シングル構成で動かすにはDockerで動かしてKubernetesを別途RKE等で起動してからインポートしたりすることをよくすると思います。
しかし、その場合
1. Rancherを動かすサーバー
2. Kubernetesを動かすサーバー
の最低2台が必要になります。

Dockerを入れたサーバーにKubernetesを入れてRancher入れればいいじゃん？と思いますが、KubernetesとDockerがcontainerdを取り合っちゃったりするので動くのかもしれませんが、私の所では動いた試しがありません。

そこで、どこかのサーバー(今回はAWS EC2)にMicroK8sを入れて、その上にRancherを動かせばよいのではないかと考えました。

# 1. MicroK8sを入れる

## 1-1. Ubuntuを動かす
MicroK8sを入れる前にUbuntuを必要とするのですが、AWSであればUbuntu公式のAMIイメージがあるので楽々動かすことができます。
t3aとかのインスタンスで動かしみましょう

```
aws ec2 run-instances \
  --image-id ami-0f6b4f4104d26f399 \
  --count 1 \
  --instance-type t3a.medium \
  --key-name Test-Key \
  --security-group-ids sg-Test.key \
  --subnet-id subnet-xxxxxxxxxxxxxxx \
  --private-ip-address=10.x.y.z \
  --block-device-mappings 'DeviceName=/dev/sda1,Ebs={DeleteOnTermination=true,VolumeType=gp2,VolumeSize=50}' \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=MicroK8s},{Key=owner,Value=hogehoge}]' \
  --credit-specification "CpuCredits=standard"
```

## 1-2. アップデート

アップデートしておきます。

```
sudo apt update && sudo apt upgrade
```

## 1-3. snapをインストール

SNAPをインストールします。

```
sudo apt install -y snap
```

## 1-4. microk8sをインストール

MicroK8sをインストールしてログインユーザーをMicroK8sのグループに追加します

```
sudo snap install microk8s --classic
sudo usermod -a -G microk8s <ログインID>
```
一旦ログインし直す

インストールされて動いているか確認とプラグインを有効にする

```
microk8s.status
microk8s.enable dns dashboard storage ingress helm
```

インストールされたKubernetesのバージョンは、`v1.17.0`
snap infoで確認する

```
$ snap info microk8s
name:      microk8s
summary:   Kubernetes for workstations and appliances
publisher: Canonical✓
contact:   https://github.com/ubuntu/microk8s
license:   unset
description: |
  MicroK8s is a small, fast, secure, single node Kubernetes that installs on just about any Linux
  box. Use it for offline development, prototyping, testing, or use it on a VM as a small, cheap,
  reliable k8s for CI/CD. It's also a great k8s for appliances - develop your IoT apps for k8s and
  deploy them to MicroK8s on your boxes.
commands:
  - microk8s.add-node
  - microk8s.cilium
  - microk8s.config
  - microk8s.ctr
  - microk8s.disable
  - microk8s.enable
  - microk8s.helm
  - microk8s.inspect
  - microk8s.istioctl
  - microk8s.join
  - microk8s.juju
  - microk8s.kubectl
  - microk8s.leave
  - microk8s.linkerd
  - microk8s.remove-node
  - microk8s.reset
  - microk8s.start
  - microk8s.status
  - microk8s.stop
services:
  microk8s.daemon-apiserver:          simple, enabled, active
  microk8s.daemon-apiserver-kicker:   simple, enabled, active
  microk8s.daemon-cluster-agent:      simple, enabled, active
  microk8s.daemon-containerd:         simple, enabled, active
  microk8s.daemon-controller-manager: simple, enabled, active
  microk8s.daemon-etcd:               simple, enabled, active
  microk8s.daemon-flanneld:           simple, enabled, active
  microk8s.daemon-kubelet:            simple, enabled, active
  microk8s.daemon-proxy:              simple, enabled, active
  microk8s.daemon-scheduler:          simple, enabled, active
snap-id:      EaXqgt1lyCaxKaQCU349mlodBkDCXRcg
tracking:     stable
refresh-date: today at 07:56 UTC
installed:          v1.17.0             (1107) 179MB classic
```

## 1-5. kube-apiserverにallow-privilegedを追加

cattle-node-agentがPrivilegeを必要とするので、kube-apiserverに追加して再起動する

```
sudo sh -c 'echo "--allow-privileged=true" >> /var/snap/microk8s/current/args/kube-apiserver'
sudo systemctl restart snap.microk8s.daemon-apiserver.service
```

## 1-6. Helmをセットアップする

RancherをHelmでインストールするので、Helmをセットアップします。

```
sudo microk8s.kubectl create serviceaccount tiller --namespace kube-system
sudo microk8s.kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
sudo microk8s.helm init --service-account=tiller
```

## 1-7. CertManagerをインストールする

```
sudo microk8s.helm repo add jetstack https://charts.jetstack.io
sudo microk8s.kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.9/deploy/manifests/00-crds.yaml
sudo microk8s.kubectl create namespace cert-manager
sudo microk8s.kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true
sudo microk8s.helm install --name cert-manager --namespace cert-manager --version v0.9.1 jetstack/cert-manager
```

## 1-8. /etc/hostsに外部参照のホスト名を入れる

```
sudo vi /etc/hosts
```

```file:/etc/hosts
127.0.0.1 localhost ecx-x-x-x-x.ap-northeast-1.compute.amazonaws.com
```

## 1-9. Rancherをインストールする

RancherをHelmでインストールしますが、`--set hostname=`は外部から参照できる1-8で指定したホスト名にする

```
sudo microk8s.helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
sudo microk8s.helm install rancher-latest/rancher --name rancher --namespace cattle-system  --set replicas=1 --set hostname=ecx-x-x-x-x.ap-northeast-1.compute.amazonaws.com
```

## 1-10. Rancherインストールが終わるまで待つ

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

# 2. ブラウザーでRancherにアクセスする

https://ecx-x-x-x-x.ap-northeast-1.compute.amazonaws.com

パスワード設定画面が出るはずなので、パスワードをセットする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/becf42c2-fa25-ca3b-4583-f5080c3fbb05.png)

インストールされたRancherのバージョンは、`v2.3.3`

# 3. 参考

5-minute home server with microk8s and Rancher
https://suda.pl/5-minute-home-server-with/

Install Rancher
https://rancher.com/docs/rancher/v2.x/en/installation/ha/helm-rancher/

# 4. 付録というか備忘

microk8s.kubectlとmicrok8s.helmのaliasを作っておく(やり方をよく忘れるので備忘で書いておく)

```
sudo snap alias microk8s.kubectl kubectl
sudo snap alias microk8s.helm helm
```