前回はUbuntu 18.04でCRI-Oランタイムを使ってKubernetesを構築する流れをまとめました。
今回は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に設定する必要があるようです。
kubeletの設定
次のように設定して、 runtime-endpoint
と runtime-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向けのパッケージを使ってみたらそのまま動かすことができました。その後の設定手順は同様です。ただし、あくまで「動いた」程度の確認です。
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