Help us understand the problem. What is going on with this article?

Arch Linux に kubeadm で開発用 Kubernetes クラスタを構築してみる

はじめに

最近お仕事で Kubernetes クラスタをぼちぼち触り始めました。そういうわけで手元にも開発用に Kubernetes クラスタがほしくなってくるわけですが、いつも使っているのは Arch Linux です。そこで、今回は Arch Linux に kubeadm を使って Master と Worker が同居する1台構成の Kubernetes クラスタを作る方法を紹介します。

インストール前の準備

もちろん Arch Linux のインストールが必要ですが、下記の点によく注意してください。

Swap の無効化

Swap が有効化されていると kubeadm は動かすことができません。最近マシンスペック向上のおかげで Swap を作る機会は減っているかもしれませんが、もし有効にしているのであれば無効化しておいてください。

ファイルシステムについて

kubeadm では btrfs をサポートしていません。もし btrfs でディスクをフォーマットしてしまっていたら、ext4 で作り直す必要があります。要するに、クリーンインストールです......

AUR について

今回紹介する方法は AUR にしか存在していないパッケージを利用します。AUR の利用を容易にするために AUR が扱えるパッケージマネージャー (yayなど) を導入しておくことをオススメします。

Docker のインストール

何はともあれコンテナ基板として Docker をインストールします。

Docker パッケージのインストール

ひとまずリポジトリからインストールして、sudo コマンドなしでも動くように設定しておきます。usermod コマンドを実行したら一度ログアウトして再ログインします。

$ yay -S docker
$ sudo usermod -a -G docker ${USER}

設定の変更

/etc/docker/daemon.json ファイルを新規生成して、以下の内容を書き込んでください。特にストレージドライバの設定は重要です。

$ sudo mkdir /etc/docker
$ sudo vim /etc/docker/daemon.json
/etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}

Docker デーモンの起動

あとはさっくりと systemd で Docker デーモンを起動しておきましょう。

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now docker

Kubernetes のインストール

さて、準備が済んだのでいよいよ Kubernetes をインストールしていきます。

必要なパッケージの導入

Kubernetes そのものの動作や操作に必要な kubectl kubelet kubeadm を AUR からインストールします。また、後ほどクラスタ内ネットワークの構築に必要となる cni-plugins もここで入れておきます。

$ yay -S kubectl-bin kubelet-bin kubeadm-bin cni-plugins-bin

また、Kubernetes が必要とするネットワーク関連のパッケージを追加でインストールしてください。

$ yay -S ethtool ebtables socat conntrack-tools

kubelet の起動

ここまで終わったら kubelet を起動する設定を有効化します。

$ sudo systemctl enable --now kubelet

Master node の初期化

いよいよ Master node を初期化して、動作できるようにします。下記コマンドを流し込んで数分待つとできあがりです。なお pod-network-cidr に渡している IP アドレスですが、後ほど flannel (内部ネットワーク) を有効化する際に必要なものです。また、flannel のドキュメントによるとこの IP アドレスで固定されているようですので、他のものに変えたりはしないでください。

$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16

構築が終わったら表示されたコマンドを使って管理者として kubectl コマンドを実行できるようにしていきます。

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

最後に Master node にコンテナを建てられるように設定を変更します。通常はセキュリティ面から Master node にユーザーがコンテナを建てることはできませんが、今回は手元開発用の1台構成ですので、それを許可するようにしておきます。もちろん、本番環境で使う Master node ではこの設定を有効にしないでください。

$ kubectl taint nodes --all node-role.kubernetes.io/master-

Flannel のインストール

クラスタ内部ネットワークを構築するため Flannel をインストールします。以下のコマンドを流し込んでください。

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

動作テスト

Nginx のコンテナを建てて、クラスタが動作しているかどうか確認してみましょう。適当なディレクトリに nginx.yaml を下記の内容で用意してください。

$ vim nginx.yaml

yamlファイルの中身をざっくり説明すると、Nginx のコンテナを2個立てて、8080番ポートを露出させるという設定になっています。

nginx.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
    - name: nginx
      port: 8080
      targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

ファイルが書けたらクラスタにデプロイしてみましょう。

$ kubectl apply -f nginx.yaml

数分待って Pod と Service の一覧を取得します。定義通り Nginx のコンテナが2つ READY 状態になっており、 service/nginx ができあがっていることが確認できます。

$ kubectl get pods,services
NAME                        READY   STATUS    RESTARTS   AGE
pod/nginx-d46f5678b-sm685   1/1     Running   0          3m18s
pod/nginx-d46f5678b-whdbn   1/1     Running   0          3m18s

NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/kubernetes   ClusterIP      10.96.0.1        <none>        443/TCP          15m
service/nginx        LoadBalancer   10.111.243.255   <pending>     8080:30044/TCP   4m14s

Nginx にアクセスしたいときは localhost から PORT(S) 欄の右側に表示されている方のポート(今回であれば30044)にアクセスしてあげると繋がります。ここまで確認できればOKです。

$ curl http://localhost:30044/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<!-- 後略 -->

おわりに

この記事では Arch Linux に kubeadm を使って Kubernetes クラスタを構築する方法を紹介してきました。kubeadm を使えばこうして簡単に開発用のクラスタも構築できます。また、公式ドキュメントではサポートされていない Arch Linux でも以外と平気で動かせてしまうということも明らかになりました。皆さんもぜひご自分の Arch Linux 環境に Kubernetes 開発環境を用意して快適な開発者生活を送ってください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした