k8sをUbuntu14.04から16.04に移行した

Kubernetesを14.04から16.04に移行した。
もともとAnsibleでk8sのクラスタは構築していたのでplaybookを修正していったが、 修正点のほとんどは、UpstartファイルをSystemdファイルの書き換えだけだった。

元にしているk8sのansibleはkubernetes/contribansibleディレクトリにある ubuntu16.04対応のPRはそのうち…

What is Systemd?

Systemdを真面目に触るのが初めてだったのでここから始めた。 以下ページを参考にした。

(4)はgroupなど変わっているので参考程度

File path

UbuntuはFedoraとファイルパスなどが微妙に違い、 システムデフォルト設定は/usr/lib/systemd/systemではなく/lib/systemd/systemにある。

EnvironmentFile

EnvironmentFile=-/etc/sysconfig/whatever

-の有無によってファイルが存在しなかった時の動作が以下のように変わる。(参考)

  • 有りの場合: ファイルが存在しなかった場合も無視
  • 無しの場合: ファイルが存在しないとエラーを発生させる

複数ファイルを読み込む時は複数のEnvironmentFileを定義する

Convert upstart file to systemd file

公式で変換方法についてわかりやすいドキュメントが公開されている。 ざっくりとした移行手順は以下の通り(細かいところは上記リンク参照)

  1. 設定ファイルを/etc/sysconfigに移行しEnvironmentFileで読み込み。
  2. start onの依存関係はUnitAfterに書き換え
  3. pre-startコマンドはServiceExecStartPreに書き換え
  4. execコマンドはServiceExecStartに書き換え

Sample Upstart file

description "Kube-Apiserver service"

respawn

# start in conjunction with etcd
start on started etcd
stop on stopping etcd

pre-start script
	# see also https://github.com/jainvipin/kubernetes-start
	KUBE_APISERVER=/opt/bin/$UPSTART_JOB
	if [ -f /etc/default/$UPSTART_JOB ]; then
		. /etc/default/$UPSTART_JOB
	fi
	if [ -f $KUBE_APISERVER ]; then
		exit 0
	fi
    exit 22
end script

script
	# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
	KUBE_APISERVER=/opt/bin/$UPSTART_JOB
	KUBE_APISERVER_OPTS=""
	if [ -f /etc/default/$UPSTART_JOB ]; then
		. /etc/default/$UPSTART_JOB
	fi
	exec "$KUBE_APISERVER" $KUBE_APISERVER_OPTS
end script

Sample Systemd file

[Unit]
Description=Kubernetes API Server
After=etcd2.service

[Service]
Restart=on-failure
EnvironmentFile=-/etc/sysconfig/kube-apiserver
ExecStart="$KUBE_APISERVER" $KUBE_APISERVER_OPTS

[Install]
WantedBy=multi-user.target

おわり

Systemdとのお友達度が1あがった

comments powered by Disqus