Kubernetes

From ArchWiki
Jump to navigation Jump to search

Kubernetes はコンテナ化されたアプリケーションのデプロイ・スケーリング・管理を自動化するためのオープンソースシステムです。Kubernetes は k8s とも呼ばれます。

Arch Linux の Kubernetes

Arch Linux で Kubernetes を使用するための AUR パッケージが複数存在します:

  • kubernetesAUR[リンク切れ: パッケージが存在しません]: GitHub から Kubernetes の Go のソースコードをビルドします。
  • kubernetes-binAUR: ビルド済みのバイナリと kubernetes パッケージの設定をインストールします。ビルドは必要ありません。

Arch Linux の Kubectl プラグイン

Kubectl プラグインは独立したバイナリであり、サブコマンドを追加して Kubectl の機能を拡張します。

Arch Linux には Kubectl プラグインの AUR パッケージが存在します:

  • kubectl-trace-gitAUR: kubectl を使って kubernetes クラスタの bpftrace プログラムをスケジュールします。

基本設定

kubeadm ヘルパーを使用するか手動で kubernetes クラスタを設定します。

kubeadm を使う

以下はマスターとスレーブがひとつずつの構成を取っており、両ノードとも 192.168.122.0/24 ネットワーク内に存在し、マスターは kubernetes クラスタを 192.168.122.1 でホストします。ポッドはそれぞれ CIDR を持っており、ここでは 192.168.123.0/24 とします。

マスター

まず、kubelet サービスの設定ファイルを設定:

/etc/kubernetes/kubelet
KUBELET_ARGS="--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
              --kubeconfig=/etc/kubernetes/kubelet.conf \
              --config=/var/lib/kubelet/config.yaml \
              --network-plugin=cni \
              --pod-infra-container-image=k8s.gcr.io/pause:3.1"

引数に存在しないファイルを指定していますが心配はいりません。ファイルは kubeadm の初期化時に作成されます。プロキシ環境あるいは特殊な DNS 設定を使っている場合、以下の引数を追加してコンテナで使用する resolv.conf を指定してください:

--resolv-conf=/the/path/to/the/resolv.conf

それから、以下のコマンドを実行:

# kubeadm init --advertise-address=192.168.122.1 --pod-network-cidr=192.168.123.0/24

初期化の進捗が表示され、それから以下のように出力されます:

[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp 127.0.0.1:10248: connect: connection refused.

ここで、kubelet.service起動してください。kubelet によって kubernetes のコンポーネントが起動します。kubeadm で確認できます。問題なく起動が完了したら、以下のようなメッセージが表示されます:

Your Kubernetes master has initialized successfully!

新しく作成した kubernetes クラスタの管理者としてアカウントを設定します:

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

それからポッドネットワークをデプロイします。こちら に様々な方法が載っています。全ての方法にはそれぞれデフォルトのポッドネットワーク CIDR が存在します。--pod-network-cidr で指定した値にあわせて設定を修正してください。

最後に、マスターの状態を確認:

$ kubectl get componentstatus

ノード

マスターの成功メッセージの最後の行に入力してクラスタに参加:

kubeadm join --token <token> 192.168.122.1:6443 --discovery-token-ca-cert-hash sha256:<hash>

トラブルシューティング

settings behind proxy

kubeadmhttps_proxy, http_proxy, no_proxy 環境変数を読み込みます。Kubernetes の内部ネットワークは最後の環境変数に記述します。例:

export no_proxy="192.168.122.0/24,10.96.0.0/12,192.168.123.0/24"

2番目の CIDR がデフォルトのサービスネットワーク CIDR です。

また、CNI プラグインが追加で必要です:

$ go get -d github.com/containernetworking/plugins
$ cd ~/go/src/github.com/containernetworking/plugins
$ bash ./build_linux.sh 
# cp bin/* /opt/cni/bin/

fatal error: runtime: out of memory

ソースから kubernetes をビルドしたときに発生します。zram 領域を設定することで回避できます:

# modprobe zram
# echo lz4 > /sys/block/zram0/comp_algorithm
# echo 16G > /sys/block/zram0/disksize
# mkswap --label zram0 /dev/zram0
# swapon --priority 100 /dev/zram0

error when creating "xxx.yaml": No API token found for service account "default"

stackoverflow を見てください。

Error: unable to load server certificate

サービスの起動時に発生することがあります。*.key ファイルのパーミッションの設定が正しいか確認してください。