手当たり次第に書くんだ

飽きっぽいのは本能

目次に戻る

概要

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

目次に戻る

Kubernetes CentOSコンテナ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る