Kubesprayを利用してCRI-Oを利用するk8sクラスターを構築してみた

# はじめに

テスト系での障害検証のために通常はdockerを利用しているのですが、CRI-Oを有効にしたk8sクラスターをkubesprayで構築してみました。

検証結果は意味がなかった、となりましたが、今後のためにメモを残しておきます。

# 環境

この時点では kubespray に、v2.16.0 タグは存在していますが、テスト系をv2.15.1で構築しているので合わせています。

* kubespray v2.15.1 (kubernetes v1.19.9)
* ノード数: 3 (VMware Workstation v16 Pro, Mem:6GB, Disk:20GBx2, CPU:1)

導入は [kubespray/README.md](https://github.com/kubernetes-sigs/kubespray/blob/master/README.md) の手順に従っています。

# 参考情報

* [Kubespray公式 - CRI-O](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/cri-o.md)

# 公式 CRI-O(crio.mdファイル)の読み方

kubesprayのガイドを読む前に、k8s-cluster.ymlファイルに、``container_manager: docker`` の記述があるのは知っていたので、ここをcrioにすれば良いのかと思っていたら見事にはまりました。

metallbを有効にしているなど冗長ですが、inventory/mycluster/全体の差分を残しておきます。

## ポイント1 - 公式ガイドに書かれているように全体を変更する

設定内容は各指定されたファイルに存在するものもありますし、デフォルト値と同じ指定もあるので、設定せずとも動く可能性はありますが、各ファイルで漏れなく、重複なく指定するようにしましょう。

下にある[diffファイル全体](#diffファイル全体)のセクションを見てもらうのが良いと思います。

## ポイント2 - コンテナイメージのmirrorsは必要がある場合に指定しましょう

all/crio.yml という存在しないファイルを配置するように指示がありますが、この内容は反映されます。

ただ記載されている内容は、local registoryやGKE(GCP)を利用していることを想定していると思われるので、mirrors:のセクションは環境に合わせて設定する必要があります。

私の環境では全て削除しました。間違って指定すると、コンテナイメージのpullに失敗します。
設定の詳細は、下にある[diffファイル全体](#diffファイル全体)のセクションを確認してください。

ansible-playbook実行後の各ノードでは ``/etc/containers/registries.conf.d/docker.io.conf`` に反映されるので、ここを確認してください。

## ポイント3 - crio_pids_limitが反映されなくても気にしない

issuesに登録されていますが、``kubespray/roles/container-engine/cri-o/templates/crio.conf.j2`` で、pids_limit はハードコードされていたので、ここでは反映されていません。

masterブランチとv2.16.0タグではきちんと反映されます。

# diffファイル全体

```diff:kubespray/inventory/の変更点
diff -uNr inventory/sample/./credentials/kubeadm_certificate_key.creds inventory/mycluster/./credentials/kubeadm_certificate_key.creds
--- inventory/sample/./credentials/kubeadm_certificate_key.creds	1970-01-01 09:00:00.000000000 +0900
+++ inventory/mycluster/./credentials/kubeadm_certificate_key.creds	2021-07-20 09:39:15.779390811 +0900
@@ -0,0 +1 @@
+DA7C48FaD63d6e132Ad2C9eB651cD1dbdac489a5ac8FA2cDc8d15C35dCAcfC07
diff -uNr inventory/sample/./group_vars/all/all.yml inventory/mycluster/./group_vars/all/all.yml
--- inventory/sample/./group_vars/all/all.yml	2021-07-20 06:33:26.187367991 +0900
+++ inventory/mycluster/./group_vars/all/all.yml	2021-07-21 09:04:07.307993515 +0900
@@ -3,7 +3,7 @@
 etcd_data_dir: /var/lib/etcd
 
 ## Experimental kubeadm etcd deployment mode. Available only for new deployment
-etcd_kubeadm_enabled: false
+etcd_kubeadm_enabled: true
 
 ## Directory where the binaries will be installed
 bin_dir: /usr/local/bin
@@ -98,7 +98,7 @@
 # kube_read_only_port: 10255
 
 ## Set true to download and cache container
-# download_container: true
+download_container: false
 
 ## Deploy container engine
 # Set false if you want to deploy container engine manually.
@@ -117,3 +117,5 @@
 
 ## Check if access_ip responds to ping. Set false if your firewall blocks ICMP.
 # ping_access_ip: true
+#
+skip_downloads: false
diff -uNr inventory/sample/./group_vars/all/crio.yml inventory/mycluster/./group_vars/all/crio.yml
--- inventory/sample/./group_vars/all/crio.yml  1970-01-01 09:00:00.000000000 +0900
+++ inventory/mycluster/./group_vars/all/crio.yml       2021-07-21 12:12:14.696248167 +0900
@@ -0,0 +1,5 @@
+crio_registries_mirrors:
+  - prefix: docker.io
+    insecure: false
+    blocked: false
+    location: registry-1.docker.io
diff -uNr inventory/sample/./group_vars/etcd.yml inventory/mycluster/./group_vars/etcd.yml
--- inventory/sample/./group_vars/etcd.yml	2021-07-19 11:35:34.209627130 +0900
+++ inventory/mycluster/./group_vars/etcd.yml	2021-07-20 09:32:56.576889697 +0900
@@ -19,4 +19,4 @@
 # etcd_peer_client_auth: true
 
 ## Settings for etcd deployment type
-etcd_deployment_type: docker
+etcd_deployment_type: host
diff -uNr inventory/sample/./group_vars/k8s-cluster/addons.yml inventory/mycluster/./group_vars/k8s-cluster/addons.yml
--- inventory/sample/./group_vars/k8s-cluster/addons.yml	2021-07-20 06:33:26.187367991 +0900
+++ inventory/mycluster/./group_vars/k8s-cluster/addons.yml	2021-07-21 09:01:04.924486002 +0900
@@ -4,7 +4,7 @@
 # dashboard_enabled: true
 
 # Helm deployment
-helm_enabled: false
+helm_enabled: true
 
 # Registry deployment
 registry_enabled: false
@@ -13,10 +13,10 @@
 # registry_disk_size: "10Gi"
 
 # Metrics Server deployment
-metrics_server_enabled: false
-# metrics_server_kubelet_insecure_tls: true
-# metrics_server_metric_resolution: 60s
-# metrics_server_kubelet_preferred_address_types: "InternalIP"
+metrics_server_enabled: true
+metrics_server_kubelet_insecure_tls: true
+metrics_server_metric_resolution: 60s
+metrics_server_kubelet_preferred_address_types: "InternalIP"
 
 # Rancher Local Path Provisioner
 local_path_provisioner_enabled: false
@@ -125,11 +125,11 @@
 # cert_manager_namespace: "cert-manager"
 
 # MetalLB deployment
-metallb_enabled: false
-# metallb_ip_range:
-#   - "10.5.0.50-10.5.0.99"
-# metallb_version: v0.9.3
-# metallb_protocol: "layer2"
+metallb_enabled: true
+metallb_ip_range:
+  - "10.1.1.10-10.1.1.30"
+metallb_version: v0.10.2
+metallb_protocol: "layer2"
 # metallb_port: "7472"
 # metallb_limits_cpu: "100m"
 # metallb_limits_mem: "100Mi"
diff -uNr inventory/sample/./group_vars/k8s-cluster/k8s-cluster.yml inventory/mycluster/./group_vars/k8s-cluster/k8s-cluster.yml
--- inventory/sample/./group_vars/k8s-cluster/k8s-cluster.yml	2021-07-20 06:33:26.187367991 +0900
+++ inventory/mycluster/./group_vars/k8s-cluster/k8s-cluster.yml	2021-07-20 09:34:11.908892837 +0900
@@ -107,7 +107,7 @@
 
 # configure arp_ignore and arp_announce to avoid answering ARP queries from kube-ipvs0 interface
 # must be set to true for MetalLB to work
-kube_proxy_strict_arp: false
+kube_proxy_strict_arp: true
 
 # A string slice of values which specify the addresses to use for NodePorts.
 # Values may be valid IP blocks (e.g. 1.2.3.0/24, 1.2.3.4/32).
@@ -173,7 +173,7 @@
 
 ## Container runtime
 ## docker for docker, crio for cri-o and containerd for containerd.
-container_manager: docker
+container_manager: crio
 
 # Additional container runtimes
 kata_containers_enabled: false
@@ -313,3 +313,5 @@
 
 ## Automatically renew K8S control plane certificates on first Monday of each month
 auto_renew_certificates: false
+
+crio_pids_limit: 4096
diff -uNr inventory/sample/./hosts.yaml inventory/mycluster/./hosts.yaml
--- inventory/sample/./hosts.yaml	1970-01-01 09:00:00.000000000 +0900
+++ inventory/mycluster/./hosts.yaml	2021-07-20 06:34:58.886829344 +0900
@@ -0,0 +1,35 @@
+all:
+  hosts:
+    node1:
+      ansible_host: 10.1.1.183
+      ip: 10.1.1.183
+      access_ip: 10.1.1.183
+    node2:
+      ansible_host: 10.1.1.184
+      ip: 10.1.1.184
+      access_ip: 10.1.1.184
+    node3:
+      ansible_host: 10.1.1.136
+      ip: 10.1.1.136
+      access_ip: 10.1.1.136
+  children:
+    kube-master:
+      hosts:
+        node1:
+        node2:
+    kube-node:
+      hosts:
+        node1:
+        node2:
+        node3:
+    etcd:
+      hosts:
+        node1:
+        node2:
+        node3:
+    k8s-cluster:
+      children:
+        kube-master:
+        kube-node:
+    calico-rr:
+      hosts: {}
```