“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
- クラスタ操作用コマンド
kubeadm
は kubelet
と kubectl
のインストールや更新を行わないため、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 がバイパスされるために正しくルーティングされないという問題が報告されているため sysctl
で net.bridge.bridge-nf-call-iptables
を 1
にする必要があります。
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” を見てみましょう。