kind ( Kubernetes in Docker ) を PXEブートしたFedora CoreOSで


インフラの設定もサーバ側に設定を重ねるのではなく、
例えばKubernetesのワーカーノードはゼロからセットアップ、アプリケーションもデプロイし直す事でimutableな構成にできないか、更にワーカーノードはCoreOS使えたらシンプルな構成にできないかな、と検証してます(途上)

あと再起動するだけでクリーンなDocker環境として使えるの地味に便利かも。

今回は手軽にKubernetesを検証する目的で、( 以前のこちらの内容で作ったPXEブート環境で )1台のCoreOSをPXEブートし、kindセットアップ、
マスターとワーカーノードを1台のサーバに混在する形でkubernetesの検証環境を作ってみました。

起動の流れ

Kubernetes in Docker ( kind )のセットアップ

CoreOSの起動に必要なignitionファイルを作ります。

HDDのマウント

最初、imutable、サーバ側に設定を持たない構成なら全てオンメモリで動作できるのでは?と思ったのですが、
自宅サーバのメモリが4GBしかなく、Dockerイメージのサイズが足りなくて、tmpfsの領域がいっぱいになってしまった...
このため仕方なくHDDをマウントしています。

マウントの方法としては2つあり
1. CoreOS の ignition の filesystems で行う方法
2. systemd の mount を使う方法
あたりがありそうで、

今回は systemd の mountを用いました。
HDDボリュームの初期化を行う場合はignitionのfilesystemsの wipe_filesystem などと組み合わせると便利そう
(今回、HDDは検証とは別にストレージのバックアップ用途としても使っていて消せなかったのでsystemdのmound、bindでマウントしています )

しかしsystemdでのマウント、 /var/mnt にマウントする場合、ユニット名は var-mnt.mount としなければならないんですね慣れていきたい...

マウントはdockerが起動する前に行われている必要があります。そこでsystemdのユニットの起動順序を下記のようにしました。

  1. HDDを/var/mntにマウント
  2. ( 私の環境では、HDD内に他のデータも混在していたので ) /var/mnt/docker を /var/lib/docker にマウント
  3. dockerサービスの起動

kind のセットアップ

2箇所で設定しています。
1. ファイルの設置はignitionファイル内の storage.files で行う( ファイルを置くだけなら、こちらが便利 )
2. CLIで実行したい内容は、一旦、bashスクリプトで記述 storage.files で設置した上で、 systemd.units 内で実行するようにしました。

2で、当初は systemd.units内に直接スクリプトを書いていました。
( ExecStart= での処理をどんどん続けて、バックスラッシュで改行していく形 )
ただこの場合、コマンド置換が難しそうだったので、別のファイルに切り出すことにしました。

できたingnitionファイル

やってみると、ignitionによる設定って contents: |

      contents: |
        [Unit]
          いろんな処理

でignition内にいろいろ書けるので、見通しやすいかも。

variant: fcos
version: 1.0.0
passwd:
  users:
    - name: core
      groups:
        - adm
        - sudo
      ssh_authorized_keys:
        - ssh-rsa AAhimituv [email protected]
systemd:
  units:
    - name: var-mnt.mount
      enabled: true
      contents: |
        [Unit]
        Description=disk mount

        [Mount]
        What=/dev/backup/export
        Where=/var/mnt
        Type=xfs
        Options=defaults

        [Install]
        WantedBy = multi-user.target
    - name: var-lib-docker.mount
      enabled: true
      contents: |
        [Unit]
        Description=symbolick link for docker strage
        After=var-mnt.mount
        RequiresMountsFor=/var/mnt
        Before=docker.service

        [Mount]
        What=/var/mnt/docker
        Where=/var/lib/docker
        Type=none
        Options=bind

        [Install]
        WantedBy=multi-user.target
    - name: shell.service
      enabled: true
      contents: |
        [Unit]
        Description=Alpine CLI Shell
        After=NetworkManager-wait-online.service

        [Service]
        Type=simple
        ExecStart=/usr/bin/podman run --rm --privileged -v /:/host -ti alpine:latest /bin/ash

        [Install]
        WantedBy=multi-user.target
    - name: kubernetes_setup.service
      enabled: true
      contents: |
        [Unit]
        Description=kubernetes setup
        After=network.target var-mnt.mount

        [Service]
        Type=oneshot
        WorkingDirectory=/var/home/core
        ExecStart=/var/home/core/kind_setup.bash

        [Install]
        WantedBy=multi-user.target

storage:
  files:
    - path: /var/home/core/kind.conf
      mode: 0644
      contents:
        inline: |
          kind: Cluster
          apiVersion: kind.x-k8s.io/v1alpha4
          nodes:
          - role: control-plane
          - role: worker
    - path: /usr/local/bin/kind
      mode: 0755
      contents:
        source: https://kind.sigs.k8s.io/dl/v0.7.0/kind-Linux-amd64
    - path: /etc/sysctl.d/k8s.conf
      mode: 0644
      contents:
      mode: 0644
      contents:
        inline: |
          net.bridge.bridge-nf-call-iptables  = 1
          net.ipv4.ip_forward                 = 1
          net.bridge.bridge-nf-call-ip6tables = 1
    - path: /var/home/core/kind_setup.bash
      mode: 0744
      contents:
        inline: |
          #!/bin/bash

          sudo systemctl enable docker.service
          # 一般ユーザでもdockerを操作できるように
          sudo usermod -a -G docker core
          # kubectl のダウンロード
          version=`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`
          curl -LO https://storage.googleapis.com/kubernetes-release/release/${version}/bin/linux/amd64/kubectl
          mv ./kubectl /usr/local/bin/
          chmod 755 /usr/local/bin/kubectl
          # kind でクラスターを作成
          kind create cluster --config /var/home/core/kind.conf
          # 初回起動時は ~/.kube をrootの所有権で作成するので、coreユーザに変更
          chown -R core:core /var/home/core/.kube