Kubernetes超入門 part1 クラスタの構築

最近、proxmoxとkubernetesでめちゃくちゃ遊んでました。

## 目標
kubernetesがまったく何もわからない状態から、仕事である程度使える状態にする。
ある程度使える状態というのは、「reactやnode.jsのアプリケーションを公開する」、「ingressでサブドメインごとにアプリを公開する」、「Argo CDを用いて継続的デリバリを行う」、「HAProxyとKeepalivedで高可用性を実現する」、「Fissionを使用してFAASっぽいことをやってみる」など。

## 必要なもの
サーバー1個でもいけますが、マシンが3個くらいあると良いです。
n100を32GBに換装し、proxmoxでメモリ6GB * 3の構成くらいにするとよいかと思います。
お金がなければ昔使ってたメモリ16GBのノートPCでサーバー1台構成でも、まあなんとか動くと思います。
OSはubuntu serverを使用します。22.04ltsで良いかと思います。

マスターノードが3個、ワーカーノードも3個とかの構築にすると高可用性（HA)が保たれるのですが、今回は学習用として3台のマシンでやります。
また、本場のkubernetesではなくk3sを使用するため、今後、マスターノードをserver, ワーカーノードをagentと呼びます。頭のなかで適宜変換してください。

## マシーンの初期設定

僕はこんな感じでやってます。
・rootパス設定
・sshでログインできるようにする
・時刻を日本にあわせる
・Dockerを入れる
・ufwを止める

```sh
timedatectl set-timezone Asia/Tokyo
apt update -y && apt install -y curl wget
curl -fsSL https://get.docker.com -o get-docker.sh
./get-docker.sh
ufw disable
```
など。

3台あるので、ここまでは全部ansibleにしておくと良いでしょう。
ややこしくなったらすぐに作り直せるようにしておくと吉。
proxmoxならスナップショットを撮っておきましょう。

それではいよいよk3sを入れていきます。
3台用意していたら、1台をメインサーバーとして考えます。
```
k3s-server-1: 192.168.0.70
k3s-server-2: 192.168.0.71
k3s-server-3: 192.168.0.72
```
としましょう。
今後、HAProxyとKeepAlivedで60をVIPとし、61,62でkubernetesの高可用性を実現したりもするのですが、ひとまずそれは忘れてください。

## 1台目のセットアップ

ひとまず練習としてrootでやっていきます。
もし外部に公開するのであればパスワードログインは不可にしておく必要があります。

```sh
curl -sfL https://get.k3s.io | \
INSTALL_K3S_VERSION=v1.27.11+k3s1 sh -s - server \
--server https://192.168.0.70:6443 \
--tls-san=192.168.0.70
```

versionはrancherが動くことを確認している最新のバージョンにしています。ひとまずserverとtls-sanは同じものを入れておけばよいです。HAProxyとKeepalivedを使用するときは、VIPのIPを入れておくと良いでしょう（でもこれは次回）。

インストールが問題なく終了したら、コマンドを打って確かめてみましょう。

```sh
kubectl get nodes
```
すると、NAME, STATUS,ROLESなどが表示されるかと思います。
されたら成功です。

インストールに失敗したら、uninstallしてからもう一度やってみましょう。
```
sh /usr/local/bin/k3s-uninstall.sh 
```
これでやり直せます。

2台目以降は、クラスタとして設定するために1台目のTOKENが必要です。
```
cat /var/lib/rancher/k3s/server/node-token
```
これで出てきたTOKENをどこかに控えておいてください。

また、自動生成されたkubeconfigをコピーする必要があります。
```
cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
```

~/.bashrcに下記を追加しておくと良いです。

```
export KUBECONFIG=~/.kube/config
alias k="kubectl"
```
kubeconfigを設定しておかないとhelmとかargocdでハマります。
（HAProxy,KeepalivedでVIPを作成したときは、kubeconfigのなかのserverをVIPのアドレスにする必要があります）

aliasは必要ないかもしれませんが、kubectlって結構打つのでkにしておくと良いでしょう。kuとかでも良いと思います。お好きなaliasを設定してください。
これもansibleで自動的に追加とかにしておくと楽です。

これで1台目のセットアップが完了します。

## 2台目以降のセットアップ

コマンドが少し変わるだけです。

```
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.27.11+k3s1 K3S_TOKEN=K10a..... sh -s - server --server https://192.168.0.70:6443 --tls-san=192.168.0.70
```

これでOK。TOKENはさっき控えておいたやつを入れてください。
インストールが終了したら、```k get nodes```などでクラスタに追加されたことを確認しましょう。また、.kubeconfigとかは1台目と同じように設定してあげると良いでしょう。

また、agentを追加したいときは以下のコマンドになります。
```
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.27.11+k3s1 K3S_URL=https://192.168.0.70:6443 K3S_TOKEN=sakkino_token sh -
```

これでkubernetes環境は完成です。

## HAProxyとKeepalivedを使用した高可用性の実現

今回の作り方だと、192.168.0.70のサーバーが死んだらkubectlがうまく動かなくなります。
そうなると非常に困るので、サーバーが1つ死んだら他のサーバーが対応できるように、HAProxyとKeepalivedを使って対応してみましょう。

準備として2台のマシーンが必要です。最低限のスペックでOK。proxmoxであればubuntu22,メモリ512MBとかで大丈夫です。
それぞれ、masterとbackupとします。
```master:192.168.0.61```
```backup:192.168.0.62```

```sh
apt update -y && apt upgrade -y && apt install -y vim haproxy keepalived
```
これでHAProxyとkeepalivedがインストールされます。
設定ファイルは`/etc/haproxy/haproxy.cfg`と`/etc/keepalived/keepalived.conf`となります。

```cfg:haproxy.cfg
global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http

frontend k3s-frontend
    bind *:6443
    mode tcp
    option tcplog
    default_backend k3s-backend

backend k3s-backend
    mode tcp
    option tcp-check
    balance roundrobin
    default-server inter 10s downinter 5s
    server server-1 192.168.0.70:6443 check
    server server-2 192.168.0.71:6443 check
    server server-3 192.168.0.72:6443 check
```
こんな感じで70,71,72をそれぞれチェックしてくれます。
ラウンドロビン形式なので毎回変えるんだったかな。


```cfg:keepalived.conf
vrrp_script chk_haproxy {
    script 'killall -0 haproxy' # faster than pidof
    interval 2
}

vrrp_instance haproxy-vip {
   interface eth0
    state MASTER # 61番サーバーはMASTER、62番はBACKUPとします。
    priority 200 # 61番は200, 62番は100とします。数字の大きいほうが優先されます。

    virtual_router_id 51

    virtual_ipaddress {
        192.168.0.60/24
    }

    track_script {
        chk_haproxy
    }
}
```
これで、192.168.0.60:6443がクラスタのkubeのAPIエンドポイントになっているわけです。
61が死んでいたら62が60番として振舞うようになります。

さきほどのインストール時の設定ですが
```
--server https://192.168.0.70:6443 --tls-san=192.168.0.70
```
この部分を192.168.0.60にしてあげるといい感じにHA(High Availability)になります。
あとkubeconfigの中身のアドレスも192.168.0.60にしてあげると良いです。

いまいちHAProxy, Keepalivedの使い方がわからないときは
Master, Backupのどちらにもnginxを入れてみてください。
そしてVIP60番としてbackendをお互いのport80を見るようにしてみると、60番サーバーにアクセスしたとき、普段は61番のnginxでサーブされたhtmlが表示され、61番がお亡くなりになると62番でサーブされたhtmlが表示されます。で、監視するのを80番ではなく6443にして70,71,72というkubernetesたちのエンドポイントを見てあげるようになるわけです。

ぶっちゃけ家で遊ぶ程度ならHAProxyとかはなくても大丈夫だと思います。

ということで脱線も多かったですが導入編は以上。

次はkubernetesをGUIで操作できるRancherを導入編です。