servermemoのブログ

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

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

動作確認したバージョン

Oracle Linuxのダウンロード

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

public-yum.oracle.com

リポジトリーの有効化

add-onsリポジトリーを有効にすると、Dockerおよびcontainerdをインストールできる。このパッケージを使って構築できる。Kubernetesにおけるdockershimを用いたDockerのサポートは間も無く終了なので、containerdを推奨。

public-yum.oracle.com

$ sudo yum-config-manager --enable ol7_addons

containerdのインストール

$ sudo yum intall containerd

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

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

kubernetes.io

$ 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ツールなどのインストールは、公式に従うと最新のバージョンをセットアップできる。

kubernetes.io

ファイアウォールの設定

共通

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を使う場合は以下のポートなども許可。シングルノードでは特に設定しないでも良い。

docs.projectcalico.org

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の場合は

docs.projectcalico.org

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

$ 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