haku-maiのブログ

インフラエンジニアですが、アプリも作ります。

【kubernetes/k3s/docker】1コマンドでk3s(kubernetes)クラスター(Control Plane×1/Worker×2)をdocker上で構築する

f:id:n-guitar:20211010180917p:plain:w800

本記事で行うこと

モチベーション

  • docker desktopに付属しているKubernetesはリソースを使うため絶対使いたくないため。 かなり重たいと思う。仕事用PCとかで実行した日には大変です。
  • メンバーが学習用に利用できるKubernetes環境がほしかったため。
  • docker環境さえあれば同じ環境が作れるようにしたかったため。
  • Control Plane×1 Worker×2の構成を作りたかったため。

環境

docker-compose.yamlの準備

  • 以下のようなdocker-composeを準備します。
  • 忙しい人は以下のリポジトリを用意したのでcloneしてください。

github.com

  • docker-compose.yaml
  • 80,443はingress用のポート、10080,20080,10443,20443はnodeport用ポート、6443はkubectlでアクセスする用のポート。
  • k3sのバージョンは何も指定しなければlatestにしています。
version: "3"
services:
  server:
    container_name: k3s-controller
    hostname: k3s-controller
    image: "rancher/k3s:${K3S_VERSION:-latest}"
    command:
      - server
      - --kube-apiserver-arg=cors-allowed-origins=['*']
    tmpfs:
      - /run
      - /var/run
    privileged: true
    environment:
      - K3S_TOKEN=${K3S_TOKEN:?err}
      - K3S_KUBECONFIG_OUTPUT=/output/kubeconfig.yaml
      - K3S_KUBECONFIG_MODE=600
    volumes:
      - k3s-server:/var/lib/rancher/k3s
      # This is just so that we get the kubeconfig file out
      - .:/output
      - ./localdir:/localdir
    ports:
      - 6443:6443
      - 80:80
      - 443:443

  agent1:
    container_name: k3s-worker1
    hostname: k3s-worker1
    image: "rancher/k3s:${K3S_VERSION:-latest}"
    tmpfs:
      - /run
      - /var/run
    privileged: true
    environment:
      - K3S_URL=https://server:6443
      - K3S_TOKEN=${K3S_TOKEN:?err}
    volumes:
      - ./localdir:/localdir
    ports:
      - 10080:80
      - 10443:443

  agent2:
    container_name: k3s-worker2
    hostname: k3s-worker2
    image: "rancher/k3s:${K3S_VERSION:-latest}"
    tmpfs:
      - /run
      - /var/run
    privileged: true
    environment:
      - K3S_URL=https://server:6443
      - K3S_TOKEN=${K3S_TOKEN:?err}
    volumes:
      - ./localdir:/localdir
    ports:
      - 20080:80
      - 20443:443

volumes:
  k3s-server: {}

k3sクラスターの起動

docker-compose up

  • このコマンド一発でクラスタが立ち上がります。
  • Docker Desktop 3.4.0以降では、docker-composeの代わりにdocker composeがデフォルトで利用できるようになりました。
  • docker composeについては以下をご参照ください。
    Compose V2 | Docker ドキュメント

  • 今回はdocker-composeで行いますがdocker composeで可能です。

$ K3S_TOKEN=${RANDOM}${RANDOM}${RANDOM} docker-compose up -d

$ K3S_TOKEN=${RANDOM}${RANDOM}${RANDOM} docker-compose ps   
     Name                   Command               State                                                       Ports                                                    
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
k3s-controller   /bin/k3s server --kube-api ...   Up      0.0.0.0:443->443/tcp,:::443->443/tcp, 0.0.0.0:6443->6443/tcp,:::6443->6443/tcp,                              
                                                          0.0.0.0:80->80/tcp,:::80->80/tcp                                                                             
k3s-worker1      /bin/k3s agent                   Up      0.0.0.0:10443->443/tcp,:::10443->443/tcp, 0.0.0.0:10080->80/tcp,:::10080->80/tcp                             
k3s-worker2      /bin/k3s agent                   Up      0.0.0.0:20443->443/tcp,:::20443->443/tcp, 0.0.0.0:20080->80/tcp,:::20080->80/tcp    

kubectlで確認

  • 以下のように出力されたkubeconfig.yamlを使って、kubectlを実行するとクラスターができていることがわかります。
$ export KUBECONFIG=./kubeconfig.yaml
$ chmod 600 kubeconfig.yaml

$ kubectl get nodes
NAME             STATUS   ROLES                  AGE   VERSION
k3s-controller   Ready    control-plane,master   38s   v1.22.2+k3s2
k3s-worker1      Ready    <none>                 31s   v1.22.2+k3s2
k3s-worker2      Ready    <none>                 30s   v1.22.2+k3s2

k3sクラスターの削除

remove k3s

  • 以下のコマンドでk3sの停止&削除
# run docker
$ K3S_TOKEN=${RANDOM}${RANDOM}${RANDOM} docker-compose down

remove data

  • 以下のコマンドでk3sのデータを削除
  • volume名は実行環境のディレクトリによって変わります。
$ docker volume rm mac-k3s-sample_k3s-server

あとがき

  • この環境に+ワイルドカードDNSを立ててあげれば、勉強環境としては十分です。 リポジトリにサンプルをのせているので参照ください。※、またどこかで記事を書きます。
  • ただしdocker上で簡易的に構築した環境のため、nodeのアップグレードとかはこの環境では動作できません。