servermemoのブログ

サーバー構築の手順をまとめる予定です。

Oracle Linux 8でkubeadmを使ってKubernetesを動かす(containerd)

動作確認したバージョン

忙しい人向け

Kubernetesコミュニティ提供のkubeadm公式ドキュメントCentOS 8向けのセットアップ方法と同じように設定すれば環境の準備はできる。

以下、Kubernetes 1.20.0時点のセットアップ方法を記述している。

Oracle Linuxのダウンロード

次からダウンロードする。

public-yum.oracle.com

リポジトリーの有効化

containerdパッケージはDocker Engineのリポジトリーのパッケージを利用する(EL8には標準リポジトリーにDockerがないため。これはRHEL8やCentOS8と一緒)。 本来Oracle LinuxはDocker EngineのサポートOSではないが、CentOS向けパッケージを利用することにする。Kubernetesにおけるdockershimを用いたDockerのサポートは間も無く終了なので、containerdを推奨。

$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

containerdのインストール

$ sudo yum intall containerd

ランタイム由来の設定の適用

ランタイムを入れるときの事前設定方法は公式の設定に従う。

https://kubernetes.io/docs/setup/production-environment/container-runtimes/

$ sudo mkdir -p /etc/containerd
$ containerd config default | sudo tee /etc/containerd/config.toml

「Using the systemd cgroup driver」で述べられている設定を忘れずに。インデント注意。

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

設定変更後にサービスを起動。

$ sudo systemctl enable --now containerd

kubeadmツールなどの導入

kubeadmツールなどのインストールは、公式に従うと最新のバージョンをセットアップできる。

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

ファイアウォールの設定

共通

2行目は実際のネットワークセグメントを許可する。

$ sudo firewall-cmd --permanent --add-port=10250/tcp     #kubelet API
$ sudo firewall-cmd --zone trusted --add-source 192.168.0.0/24 --permanent   #物理ネットワークセグメント許可
$ sudo firewall-cmd --zone=public --add-masquerade
$ sudo firewall-cmd --permanent --zone=public --add-masquerade
$ sudo firewall-cmd --reload

master

2行目はCNIで実際指定するネットワークセグメントを許可する。

$ sudo firewall-cmd --permanent --add-port=6443/tcp     #Kubernetes API server
$ sudo firewall-cmd --zone trusted --add-source 10.244.0.0/16 --permanent
$ sudo firewall-cmd --reload

worker

2行目はCNIで実際指定するネットワークセグメントを許可する。

$ sudo firewall-cmd --permanent --add-port=30000-32767/tcp      #NodePort Services
$ sudo firewall-cmd --zone trusted --add-source 10.244.0.0/16 --permanent
$ sudo firewall-cmd --reload

Calicoを使う場合は以下のポートなども許可。シングルノードでは特に設定しないでも良い。

https://docs.projectcalico.org/getting-started/kubernetes/requirements

kubeadmツールを使ったクラスター作成

クラスターを作成するにはkubeadm initコマンドを使う。は外からアクセスできるIPアドレスを指定。エンドポイントを外部にさらさない(内部で使うだけ)ならローカルネットワークアドレスで良い。

$ sudo kubeadm init --kubernetes-version 1.21.0 --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint=<Public IP Address>

シングルクラスターにする(もしくはmasterでもPodスケジュールしたい)場合は以下を実施

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

Workerを別に用意する場合は以下を実施して出力されるコマンドをノードで実行

$ kubeadm token create --print-join-command
kubeadm join 10.211.55.44:6443 --token ....

CNIを導入。様々なネットワークアドオンが存在する。Calicoの場合は

https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises

構築後のクラスターの状態(シングルクラスターの場合)

$ kubectl get nodes
NAME                    STATUS   ROLES                  AGE   VERSION
localhost.localdomain   Ready    control-plane,master   58m   v1.21.0

$ kubectl get pods -A
NAMESPACE     NAME                                            READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-6d8ccdbf46-pxr84        1/1     Running   0          57m
kube-system   calico-node-vj9cs                               1/1     Running   0          57m
kube-system   coredns-558bd4d5db-2t6sw                        1/1     Running   0          58m
kube-system   coredns-558bd4d5db-p84zs                        1/1     Running   0          58m
kube-system   etcd-localhost.localdomain                      1/1     Running   0          58m
kube-system   kube-apiserver-localhost.localdomain            1/1     Running   0          58m
kube-system   kube-controller-manager-localhost.localdomain   1/1     Running   0          58m
kube-system   kube-proxy-xsdt9                                1/1     Running   0          58m
kube-system   kube-scheduler-localhost.localdomain            1/1     Running   0          58m

$ kubectl get svc -A
NAMESPACE     NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
default       kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP                  58m
kube-system   kube-dns     ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   58m