CentOS 7 に kubeadm をインストール

kubeadm

Installing kubeadm – Kubernetes” を参考に CentOS 7 に kubeadm をインストールします

各種バージョン情報

  • CentOS Linux release 7.5.1804
  • kubeadm v1.11.2 (GitCommit:”bb9ffb1654d4a729bb4cec18ff088eacc153c239″)
  • docker 1.13.1 (docker-1.13.1-68.gitdded712.el7.centos.x86_64)
  • kubelet v1.11.2 (Kubernetes v1.11.2)

Before you begin

  • サポートされている OS は沢山あるが今回は CentOS 7 を使います
  • 2GB 以上のメモリ
  • 2つ以上の CPU
  • ホストは互いに通信可能なこと
  • 一意な hostname, MAC address, product_uuid (`sudo cat /sys/class/dmi/id/product_uuid`)
  • 必要なポートが開いていること(用途によって異なる)
  • swap の無効化 (kubelet の動作のために必要)

Installing Docker

yum install -y docker
systemctl enable docker && systemctl start docker

Installing kubeadm, kubelet and kubectl

次のパッケージをインストールします

kubeadm
クラスタ構築用コマンド
kubelet
クラスタ内のすべてのホストで実行され、pod やコンテナの起動などを行う
kubectl
クラスタ操作用コマンド

kubeadmkubeletkubectl のインストールや更新を行わないため、kubeadm でインストールされる kubernetes のコントロールプレーンバージョンと合わせる必要があります。kubelet のバージョンはコントロールプレーンのバージョンの一つ前のマイナーバージョンまではサポートされます。たとえば、1.7.0 の kubelet は 1.8.0 のコントロールプレーンとは互換性があります。

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
mkdir /var/lib/kubelet
cat <<EOF > /var/lib/kubelet/config.yaml
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: "systemd"
EOF
systemctl enable kubelet

SELinux を無効にするため setenforce 0 の実行が必要です。kubelet の SELinux 対応が改善されるまではこれが必要です。

永続化

sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config

iptables がバイパスされるために正しくルーティングされないという問題が報告されているため sysctlnet.bridge.bridge-nf-call-iptables1 にする必要があります。

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

Configure cgroup driver used by kubelet on Master Node

「Docker を使う場合、kubeadm は自動で cgroup driver を検出し、/var/lib/kubelet/kubeadm-flags.env にセットします」。別の CRI を使う場合は /etc/default/kubelet で次のように cgroup-driver を指定する必要があります」と書いてあるけど CentOS 7 の docker では kubeadm-flags.env は生成されなかった。

ドキュメントには KUBELET_KUBEADM_EXTRA_ARGS とあるが、systemd の unit ファイルにこの変数は無いので KUBELET_EXTRA_ARGS だろうか。

KUBELET_EXTRA_ARGS=--cgroup-driver=<value>

変更の反映には kubelet の次のようにして再起動する必要があります

systemctl daemon-reload
systemctl restart kubelet

しかし、1.10 以降、--cgroup-driver などの引数はすべて DEPRECATED となっており --config で指定するファイルに書けということになっている。”Set Kubelet parameters via a config file
項目と値は types.go を見て探す。

/etc/systemd/system/kubelet.service.d/10-kubeadm.conf

Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"

と書かれているのでこのファイルを使うのが良いと思うが、ディレクトリは存在しないので作成する必要がある。設定内容はセットアップするものや環境に依存するようなので、それぞれのセットアップにて試してみる。

参考:
Kubernetes 1.10のkubeletの起動オプションをKubelet ConfigファイルとPodSecurityPolicyで置き換える

後に、コントロールプレーン用に kubeadm init を実行したらその処理の中で /var/lib/kubelet/kubeadm-flags.env/var/lib/kubelet/config.yaml が作成されていた。

[preflight/images] Pulling images required for setting up a Kubernetes cluster
[preflight/images] This might take a minute or two, depending on the speed of your internet connection
[preflight/images] You can also perform this action in beforehand using 'kubeadm config images pull'
[kubelet] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[preflight] Activating the kubelet service

Troubleshooting

なにか問題にぶつかったら “Troubleshooting kubeadm” を見てみましょう。