はじめに
テスト系での障害検証のために通常は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 の手順に従っています。
参考情報
公式 CRI-O(crio.mdファイル)の読み方
kubesprayのガイドを読む前に、k8s-cluster.ymlファイルに、container_manager: docker
の記述があるのは知っていたので、ここをcrioにすれば良いのかと思っていたら見事にはまりました。
metallbを有効にしているなど冗長ですが、inventory/mycluster/全体の差分を残しておきます。
ポイント1 - 公式ガイドに書かれているように全体を変更する
設定内容は各指定されたファイルに存在するものもありますし、デフォルト値と同じ指定もあるので、設定せずとも動く可能性はありますが、各ファイルで漏れなく、重複なく指定するようにしましょう。
下にあるdiffファイル全体のセクションを見てもらうのが良いと思います。
ポイント2 - コンテナイメージのmirrorsは必要がある場合に指定しましょう
all/crio.yml という存在しないファイルを配置するように指示がありますが、この内容は反映されます。
ただ記載されている内容は、local registoryやGKE(GCP)を利用していることを想定していると思われるので、mirrors:のセクションは環境に合わせて設定する必要があります。
私の環境では全て削除しました。間違って指定すると、コンテナイメージのpullに失敗します。
設定の詳細は、下にある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 -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: {}