LightsailにシングルノードKubernetesクラスターを作る

AWSのLightsailに毎月2000円ぐらいの仮想マシンを建てて、シングルノードKubernetesクラスターを作る話。

OSのコンソールに直接アクセスしてdockerコマンドとかを実行できるので開発環境には都合が良い。今回の個人的な用途はOperator SDKでの開発用。

記事作成時点のKubernetesバージョンは1.17。OSは訳あって、と言うかOperator SDKと相性良さそうというか、でCentOS 7。

# Lightsailに仮想マシンを作る
https://lightsail.aws.amazon.com/ls/webapp/home/instances
OSのみ。CentOS 7 1901-01。月額$20の、4GB Memory、2 vCPUのインスタンスを作成。

# Lightsailコンソールを開く
インスタンスが出来たらコンソールを開き、何はともあれsudo -iを実行。

```
$ sudo -i
```

# Dockerとか、前提パッケージのインストール
https://kubernetes.io/docs/setup/production-environment/container-runtimes/
コマンドをコピペするときは、改行文字がCRLFで転送されない様に注意。notepad++の改行モードをUnix(LF)にして、それに貼り付けてから改めてLightsailコンソールに貼るとかね。

```
# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo  https://download.docker.com/linux/centos/docker-ce.repo
# yum update -y && yum install -y containerd.io-1.2.10 docker-ce-19.03.4 docker-ce-cli-19.03.4
# mkdir /etc/docker
# cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF
# mkdir -p /etc/systemd/system/docker.service.d
# systemctl daemon-reload
# systemctl restart docker
# systemctl enable docker
```

# kubelet、kubeadmのインストール
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

```
# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
# setenforce 0
# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# systemctl enable --now kubelet
# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# sysctl --system
```

# Kubernetesのインストール
ネットワーク・ドライバーはcalico。

```
# kubeadm init --pod-network-cidr=192.168.0.0/16
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# kubectl apply -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml
```

# CoreDNSが起動している事を確認
calicoインストール後、暫くするとCoreDNSが起動する。

```
[root@ip-172-26-4-124 ~]# kubectl get pod -n kube-system
NAME                                                                      READY   STATUS  
  RESTARTS   AGE
calico-kube-controllers-5b644bc49c-wgfzv                                  1/1     Running 
  0          44s
calico-node-ktkgn                                                         1/1     Running 
  0          45s
coredns-6955765f44-mgpjr                                                  1/1     Running 
  0          2m52s
coredns-6955765f44-xszrk                                                  1/1     Running 
  0          2m52s
etcd-ip-172-26-4-124.ap-northeast-1.compute.internal                      1/1     Running 
  0          3m8s
kube-apiserver-ip-172-26-4-124.ap-northeast-1.compute.internal            1/1     Running 
  0          3m8s
kube-controller-manager-ip-172-26-4-124.ap-northeast-1.compute.internal   1/1     Running 
  0          3m7s
kube-proxy-qctwk                                                          1/1     Running 
  0          2m52s
kube-scheduler-ip-172-26-4-124.ap-northeast-1.compute.internal            1/1     Running 
  0          3m8s
```

# taint解除
シングルノードクラスターのためMasterノードでアプリが起動する必要があり、taintを解除。

```
# kubectl taint nodes --all node-role.kubernetes.io/master-
```

# 動作確認
とりあえずnginx動かしてみてアクセスできるか。

```
# kubectl run nginx --image=nginx
# kubectl expose deploy/nginx --type=NodePort --port=80
# kubectl get svc
（最後のコマンドの出力結果）
[root@ip-172-26-4-124 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        57m
nginx        NodePort    10.96.212.196   <none>        80:30142/TCP   17m
```

手元のWebブラウザからアクセスするなら、NodePortで開いているポート番号（上の例なら30142）で仮想マシンにアクセスできるよう、Lightsailファイアウォールに許可するポートを追加。

で、「http://＜インスタンスのIPアドレス＞:＜NodePort＞」でWebブラウザからアクセスすれば以下の画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/d392bba7-1b5c-a0e7-c47c-a27047341ee6.png)

。。まあ、当初の目的がOperator SDK開発環境なので外部webアクセスは必要ないが。
Operator SDKのチュートリアルやってみましたを、気が向いたら日を改めて。

（追記）[Kubernetes Operator SDKチュートリアルをやってみる](https://qiita.com/rk05231977/items/93f68d3d7be3f84da3c0)