Kubernetes 日記 2019/10/07

こんにちは。Kubernetes の季節ですね。岡部・宮崎研究室でも Kubernetes を構築し始めました。

Kubernetes (k8s) とは?

https://kubernetes.io/

Kubernetes とはコンテナオーケストレーションシステムです。サービスを立ち上げる際のコンテナ配置やネットワーク構成をやってくれるありがたいものです。

構築する

今日から実際にサーバーに k8s を立てていきます。基本的に公式ドキュメントを読みながらやっていきます。

https://kubernetes.io/docs/setup/

世の中には様々な k8s の管理をしてくれるツールがありますが、今回はそれを使わず kubeadm で構築しました。やる気MAXなので minikube でもありません。

OS を選ぶ

kubeadm が対応している OS 一覧から選びます。

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

今回は

  • 最適化されていそう
  • 軽そう
  • 最先端で楽しそう

といった理由から Container Linux (元 CoreOS) を選択しました。

Container Linux を virt で何台か立ち上げます。主に下のドキュメントを参考にしました。

https://coreos.com/os/docs/latest/booting-with-libvirt.html

Container Linux Config を YAML で書いて、ct というツールで ignition (cloud-init ライクなもの) の JSON に変換して起動します。

Runtime を選ぶ

コンテナを動かすためには Container Runtime が必要になります。

先程の kubeadm のドキュメントには

  • Docker
  • containerd
  • CRI-O
  • rkt

あたりがあります。CRI-O や rkt で冒険する案もありましたが、結局慣れている Docker を使うことにしました。

ネットワークプラグインを選ぶ

ネットワークプラグインについては、色々使ってみる予定なのですが、今回は Calico を使いました。

立ち上げる

kubeadm を使うと証明書関係や Systemd Unit の生成、 config の生成などを良しなにやってくれます。

kubelet が立ち上がると kubectl で操作できるようになるので、ここで Calico を入れます。

Calico を入れる

Calico のドキュメントに従って入れていきます。k8s のドキュメントでは URL を指定して直接 apply していましたが、CIDR を変更している場合は manifest を書き換える必要があることに注意しましょう。私は apply し直しました。

https://docs.projectcalico.org/v3.9/getting-started/kubernetes/

結果

Calico が立ち上がらない

Calico をインストールしましたが、 kubectl get pods -A してもずっと Initializing となっていて立ち上がりません。

kube-controller-manager-XXX pod でも、CIDR がないという話でした。

I1010 20:14:52.419362       1 event.go:255] Event(v1.ObjectReference{Kind:"Node", Namespace:"", Name:"container-linux1", UID:"XXXXX", APIVersion:"", ResourceVersion:"", FieldPath:""}): type: 'Normal' reason: 'CIDRNotAvailable' Node container-linux1 status is now: CIDRNotAvailable
E1010 20:15:52.472319       1 controller_utils.go:255] Error while processing Node Add/Delete: failed to allocate cidr from cluster cidr at idx:0: CIDR allocation failed; there are no remaining CIDRs left to allocate in the accepted range
I

CIDR は /16 で空いている場所をとったはずだし、おかしいな…と思っていたのですが、ログではなくイベントを見ることで理由が分かりました。(kubelet のログにも出ていました)

$ kubectl get events -A
...
kube-system   31m         Warning   FailedMount               pod/calico-node-5blnh                          (combined from similar events): Unable to attach
or mount volumes: unmounted volumes=[flexvol-driver-host], unattached volumes=[policysync cni-net-dir lib-modules xtables-lock var-lib-calico cni-bin-dir flex
vol-driver-host host-local-net-dir calico-node-token-chj9m var-run-calico]: timed out waiting for the condition
kube-system   11m         Warning   FailedMount               pod/calico-node-5blnh                          MountVolume.SetUp failed for volume "flexvol-driver-host" : mkdir /usr/libexec/kubernetes: read-only file system
...

Calico のコンテナ自体が立ち上がっていないので、ログを見ても見つからなかったみたいです。

このログで検索すると Calico の issue がヒット。Container Linux との兼ね合いみたいです。

https://github.com/projectcalico/calico/issues/2712

ここに書いてあるとおり、 flexvol-driver-host の path を修正すると動きました。

$ kubectl get pods -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-b7fb7899c-s8lrz    1/1     Running   0          3d18h
kube-system   calico-node-tbpff                          1/1     Running   0          46h
kube-system   coredns-5644d7b6d9-fkcrr                   1/1     Running   0          3d19h
kube-system   coredns-5644d7b6d9-v7ckx                   1/1     Running   0          3d19h
kube-system   etcd-container-linux1                      1/1     Running   3          3d19h
kube-system   kube-apiserver-container-linux1            1/1     Running   3          3d19h
kube-system   kube-controller-manager-container-linux1   1/1     Running   3          3d19h
kube-system   kube-proxy-skwb7                           1/1     Running   3          3d19h
kube-system   kube-scheduler-container-linux1            1/1     Running   3          3d19h

次はサービスたててみる予定です。落ち着いたら kubernetes-the-hard-way もやってみたい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です