Contents
概要
KubernetesでCentOSコンテナを実行します。
所感
以降の手順に示す通り、CentOSコンテナ上ではSystemdを実行できず、通常のCentOSのように使うことはできません。Systemdを使用して何らかのサービスを起動する場合は、Privilegedモードでコンテナを実行する必要があります。
Privilegedモードはセキュリティ上の理由から、プロダクション環境では推奨されない為、CentOSコンテナをベースに何らかのサービスを提供するコンテナイメージをビルドする場合は、そのサービスの起動方法を作りこむ必要があります。ちなみにPodmanではCapabilityが調整されており、PrivilegedモードではないコンテナでSystemdを実行できます。
コンテナは本来1コンテナ1プロセスを想定している為、これを前提とするとSystemdは必要ありません。この為、Docker Hub等で公開されているコンテナイメージは、OSベースではなくNgingやMySQL等のサービス単位の場合が多いです。これらは配布されている時点でサービスの起動方法が作りこまれており、サービス起動の意識をする必要はありません。
CentOS等のOSベースコンテナイメージを使うケースを整理すると、
- CentOSをベースイメージとしてSystemdを使用せずにサービスの作りこみを行いたい場合
- とにかくVMと同じようにCentOSを使用したい場合(Privilegedモードで実行するかCapabilityの調整が必要)
となります。単純なインフラエンジニアだとこの辺りの理解がない人が多い印象です。
手順
Podの作成
Manifestの作成
Manifestを作成します。このManifestはCentOSコンテナを起動する為の最小限のManifestです。これ以上記載を省くことはできません。また、KubernetesはデフォルトでDocker Hubからイメージを取得しますので、imageの指定はDockerと同じです。この例ではCentOSの最新版となります。
myadmin@ubuntu:~$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: centos
spec:
containers:
- name: centos
image: centos
command:
- "/sbin/init"
EOF
myadmin@ubuntu:~$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: apache2
spec:
containers:
- name: apache2
image: ubuntu-base
command:
- "/sbin/init"
EOF
root@k8s-01:~# vim /root/k8s/yaml/centos-min.yaml
apiVersion: v1
kind: Pod
metadata:
name: centos-min-pod
spec:
containers:
- name: centos
image: centos
command:
- "/sbin/init"
Manifestの実行
ManifestからPodを作成します。
root@k8s-01:~# kubectl create -f /root/k8s/yaml/centos-min.yaml
pod/centos-min-pod created
Podのステータス確認
Podのステータスを確認します。
root@k8s-01:~# kubectl get pod
NAME READY STATUS RESTARTS AGE
centos-min-pod 1/1 Running 0 34s
コンテナ内のコマンドを実行
Pod(コンテナ)を指定して/bin/bashを起動
execでコンテナ内(Pod内ではありません)のシェルを実行できます。
root@k8s-01:~# kubectl exec -it centos-min-pod -- /bin/bash [root@centos-min-pod /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
Systemdを確認
下記の通り、CentOSコンテナ内ではSystemdを実行することはできません。これは、セキュリティ観点でCapabilityを制限している為です(コンテナはホストOSのKernelを共有している)。
[root@centos-min-pod /]# systemctl status
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down