仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

CentOS 7 / CentOS 8 でCRI-OをKubernetesで使う

前回はUbuntu 18.04でCRI-Oランタイムを使ってKubernetesを構築する流れをまとめました。

tech.virtualtech.jp

今回はCentOS 7の場合をご紹介します。ちなみについでにCentOS 8.1で動かしてみたのでそちらもご紹介します。

[2/18 更新] 余計な手順を削除

基本的な流れ

CRI-Oランタイムを使ってKubernetesを使う方法はKubernetesの公式ドキュメントにあるとおりです。

ただ、paas7-crio-115-releaseにあるパッケージにバグが有り、インストール直後は動作しますが再起動後にServiceが起動しなくなる問題が発生するので注意が必要です。

また、overlayやbr_netfilterの永続化の設定が抜けている気がします。これについても対処が必要です。 それでは早速、インストールしてみましょう。

初期設定

必要なLinuxカーネルモジュールを有効化します。

% sudo -i
# modprobe overlay
# modprobe br_netfilter

また、次のように必要なモジュールを永続化します。これにより、システム再起動後もモジュールが読み込まれます。カーネルモジュールの永続化方法の詳細についてはHow do I load kernel modules during boot time in RHEL 7 or 8?をご覧ください。

# vi /etc/modules-load.d/crio.conf
overlay
br_netfilter

# systemctl restart systemd-modules-load
# lsmod |egrep "overlay|br_netfilter"
br_netfilter           22256  0
bridge                151336  1 br_netfilter
overlay                91659  0

IPフォワードやブリッジの設定を行っておきます。これは公式の手順そのままです。

# cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# sysctl --system

リポジトリーの有効化

公式の手順では一行目のリポジトリーのみ有効化しています。そのバージョンは2020年1月27日時点では正常に動かないため、paas7-crio-115-candidateのパッケージリポジトリーも有効化します。paas7-crio-115-releaseが更新されたら対応するようにしましょう。

# yum-config-manager --add-repo=https://cbs.centos.org/repos/paas7-crio-115-release/x86_64/os/
# yum-config-manager --add-repo=https://cbs.centos.org/repos/paas7-crio-115-candidate/x86_64/os/

CRI-Oのインストール

CRI-Oをインストールします。このリポジトリーではGPGキーが用意されていないようなので、 --nogpgcheck オプションを有効化するかrepoファイルの該当箇所に gpgcheck=0 を追記してください。

# yum install --nogpgcheck cri-o socat

common & network_dir path & add the registries.searchなどの変更

network_dirには /etc/cni/net.d/ が指定されています。このディレクトリーは kubeadmがresetを実行するときにクリアしてしまい、CRI-Oブリッジの設定も一緒に吹っ飛んでしまいます。それでは困るので別のディレクトリーを作って、そこにCRI-O関連のネットワークインターフェイスを保存するように構成します。

conmonはバージョンによってパスが変わる可能性がありますので、 ls /usr/libexec/crio/conmon などのコマンドを実行して、正しいディレクトリーを確認してください。

次のように設定します。設定ファイルは長いので、一部 ... を使って省略しています。

# mkdir -p /etc/cni/crio/net.d
# vi /etc/crio/crio.conf
...
conmon = "/usr/libexec/crio/conmon"
...
[crio.network]
network_dir = "/etc/cni/net.d/"
...
[registries.search]
registries = ['docker.io', 'registry.fedoraproject.org', 'registry.access.redhat.com', 'k8s.gcr.io']

CRI-Oサービスの起動

サービスの永続化も行っておきます。

# systemctl daemon-reload
# systemctl restart crio
# systemctl enable crio

ホスト名の設定

kubeadm実行時の要件で、hostsにFQDNが必要らしいので設定します。 次のようなコマンドを実行して、ホスト名を確認します。 ホスト名を /etc/hosts に追記します。

# cat /etc/hostname
cent7-criodemo2.novalocal

# hostname -A
cent7-criodemo2.novalocal


# echo "127.0.1.1  cent7-criodemo2.novalocal" >> /etc/hosts

kubeadmやkubeletなどのインストール

次の手順に従ってkubeadmやkubelet、後々必要なのでkubectlもインストールします。 kuneadmを使う要件としてSELinuxをpermissiveに設定する必要があるようです。

kubernetes.io

kubeletの設定

次のように設定して、 runtime-endpointruntime-request-timeout の設定を変更します。パラメーターは以下の情報を参考にしています。RHEL/RHELクローンでは /etc/sysconfig/kubelet に記述します。

# vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=--feature-gates="AllAlpha=false,RunAsGroup=true" --container-runtime=remote --cgroup-driver=systemd --container-runtime-endpoint='unix:///var/run/crio/crio.sock' --runtime-request-timeout=5m

変更した構成を適用するために実行します。kubeletが正常に起動していることを確認してください。

# systemctl daemon-reload
# systemctl restart kubelet

クラスターの作成

kubeadm init コマンドを実行して、Kubernetes クラスターを作成します。pod-network-cidrはCNIの要件にあったCIDRを設定します。今回はFlannelを使う例とします。kubernetes-versionはインストールしたkubeadm、kubeletなどに沿ったバージョンを指定します。特に必要がない限りは最新のバージョンを入れればよいでしょう。

control-plane-endpointは外部からアクセスする場合のエンドポイントを指定します。今回この環境はOpenStackインスタンス上で動かしたのでFloating IPアドレスを指定しました。

# kubeadm init --cri-socket=/var/run/crio/crio.sock --kubernetes-version 1.17.2 --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint=172.16.214.160 

あとはクラスターの作成が終わるのをしばらく待つだけです。終わったら、kubeconfigの作成、1ノードで動かすなら kubectl taint nodes --all node-role.kubernetes.io/master- の実行、Master & Worker構成にする場合は、同じようなCRI-Oの設定を行い、インストールしたものと同じバージョンのkubeadm、kubeletをインストールして、kubeadmによってクラスター作成後に出力された kubeadm join コマンドを各Workerノードでroot権限で実行します。

kubeconfigの作成

kubectlをインストールしたノードで実行。

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

1ノードで動かす場合

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

2ノード以上で動かす場合

各Workerノードで実行(実際に実行するべきコマンドはkubeadm initの実行後に出力されます)

# kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

CNIのセットアップ

このあと、CNIをセットアップします。

Flannelの場合(2020年1月27日時点)

次を実行します。

# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

以上で完了です。 Podの状態などはkubectlコマンドで確認しますが、KubernetesとCRI-Oがきちんと動作しているとcrictlコマンドを使ってもいろいろな情報を出力できます。

# crictl images
IMAGE                                TAG                 IMAGE ID            SIZE
docker.io/library/alpine             latest              e7d92cdc71fea       5.86MB
docker.io/library/nginx              alpine              764297b381ccd       24.9MB
docker.io/library/redis              latest              9b188f5fb1e6e       102MB
k8s.gcr.io/coredns                   1.6.5               70f311871ae12       41.7MB
k8s.gcr.io/etcd                      3.4.3-0             303ce5db0e90d       290MB
k8s.gcr.io/kube-apiserver            v1.17.2             41ef50a5f06a7       173MB
k8s.gcr.io/kube-controller-manager   v1.17.2             da5fd66c4068c       162MB
k8s.gcr.io/kube-proxy                v1.17.2             cba2a99699bdf       118MB
k8s.gcr.io/kube-scheduler            v1.17.2             f52d4c527ef2f       96MB
k8s.gcr.io/pause                     3.1                 da86e6ba6ca19       747kB
quay.io/coreos/flannel               v0.11.0-amd64       ff281650a721f       55.4MB


# crictl pods
POD ID              CREATED             STATE               NAME                                                NAMESPACE           ATTEMPT
35c8656662c86       18 minutes ago      Ready               nginxapp1-7b8cc7cb5c-2f2mx                          default             0
9c639a3a008a2       33 minutes ago      Ready               kube-flannel-ds-amd64-pk27z                         kube-system         0
9463f05175df7       39 minutes ago      Ready               coredns-6955765f44-c7s7x                            kube-system         0
bcbcf8c9ffe92       39 minutes ago      Ready               coredns-6955765f44-lvfmc                            kube-system         0
31d622bc8a957       39 minutes ago      Ready               kube-proxy-82dd7                                    kube-system         0
00ff766a111cc       39 minutes ago      Ready               etcd-cent7-criodemo2.novalocal                      kube-system         0
37221592beea9       39 minutes ago      Ready               kube-controller-manager-cent7-criodemo2.novalocal   kube-system         0
2a0cf1a44c889       39 minutes ago      Ready               kube-apiserver-cent7-criodemo2.novalocal            kube-system         0
cd68ab7f0707d       39 minutes ago      Ready               kube-scheduler-cent7-criodemo2.novalocal            kube-system         0

CentOS 8.1で動かしてみた

CentOS 8向けのCRI-OはCentOS Projectでは現時点で用意されていませんが、CentOS 7向けのパッケージを使ってみたらそのまま動かすことができました。その後の設定手順は同様です。ただし、あくまで「動いた」程度の確認です。

f:id:virtualtech:20200127111754p:plain

CentOS 8にCRI-Oのインストール

# yum-config-manager --add-repo=https://cbs.centos.org/repos/paas7-crio-115-release/x86_64/os/
# yum-config-manager --add-repo=https://cbs.centos.org/repos/paas7-crio-115-candidate/x86_64/os/

# yum install --nogpgcheck cri-o socat