LoginSignup
1
1

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

Last updated at Posted at 2024-04-10

最近、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となります。

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をそれぞれチェックしてくれます。
ラウンドロビン形式なので毎回変えるんだったかな。

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を導入編です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1