最近、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を止める
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でやっていきます。
もし外部に公開するのであればパスワードログインは不可にしておく必要があります。
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を入れておくと良いでしょう(でもこれは次回)。
インストールが問題なく終了したら、コマンドを打って確かめてみましょう。
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
apt update -y && apt upgrade -y && apt install -y vim haproxy keepalived
これでHAProxyとkeepalivedがインストールされます。
設定ファイルは/etc/haproxy/haproxy.cfg
と/etc/keepalived/keepalived.conf
となります。
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をそれぞれチェックしてくれます。
ラウンドロビン形式なので毎回変えるんだったかな。
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を導入編です。