Help us understand the problem. What is going on with this article?

Ansible AWX 検証用に Kubernetes で systemd と sshd が動作する CentOS7 をデプロイする。

概要

Ansible AWX の検証用ホストに CentOS7 が欲しかったんや。
以下を満たすことができる CentOS7 の Docker image と、
kubernetes で動作させるナレッジがあればよかった。

  • systemd が動作すること
  • sshd が動作すること
  • yum install ができること

結論

そんなものはなかった。
作るしかない。

実行環境

# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.4", GitCommit:"c27b913fddd1a6c480c229191a087698aa92f0b1", GitTreeState:"clean", BuildDate:"2019-02-28T13:35:32Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"}

前提

  • kubernetes 構築済み
    ⇒ ベアメタル3台構成

  • Service で type: LoadBalancer が利用できるように metallb を設定済

  • LoadBalancerIP に ping が飛ぶようにルーティングはばっちり
    ⇒ それぞれの CentOS7 が別々の IP Address を持つようにするため

  • Docker image は自作
    ⇒ 以下にアップしています。
      https://cloud.docker.com/repository/docker/solaris64sparc/centos7

  • 残念セキュリティなので注意が必要

docker で実行する場合は?

# docker run --privileged --name centos7no1 -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 2222:22 -d solaris64sparc/centos7:systemd-sshd

手順

Namespace を作る

# kubectl create ns awx-target

Deployment を作成する

centos7no1-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.17.0 (a74acad)
  creationTimestamp: null
  labels:
    io.kompose.service: centos7no1
  name: centos7no1
  namespace: awx-target
spec:
  replicas: 1
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        io.kompose.service: centos7no1
    spec:
      containers:
      - image: solaris64sparc/centos7:systemd-sshd
        name: centos7no1
        ports:
        - containerPort: 22
        resources: {}
        securityContext:
          privileged: true ★ docker run --privileged に相当
        volumeMounts:
        - name: cgroup
          mountPath: /sys/fs/cgroup ★ -v /sys/fs/cgroup:/sys/fs/cgroup:ro に相当
          readOnly: true
      restartPolicy: Always
      volumes:
         - name: cgroup
           hostPath:
             path: /sys/fs/cgroup
             type: Directory

Service の作成する

centos7no1-service.yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.17.0 (a74acad)
  creationTimestamp: null
  labels:
    io.kompose.service: centos7no1
  name: centos7no1
  namespace: awx-target
spec:
  type: LoadBalancer
  loadBalancerIP: 172.16.13.201 ★ IP Address を固定する
  ports:
  - name: "22"
    port: 22
    targetPort: 22
  selector:
    io.kompose.service: centos7no1

deploy する

# ls centos7no1
centos7no1-deployment.yaml  centos7no1-service.yaml

# kubectl create -f centos7no1
deployment.extensions/centos7no1 created
service/centos7no1 created

動作確認

ssh で 172.16.13.201 にログインできるか確認します。
ユーザは次の通りです。

ユーザ パスワード
root P@ssw0rd!
user P@ssword!

使い方

Ansible AWX のホストに指定して playbook の対象にしてみたり、ssh でログインして設定変更してみたり。
reboot を実行すると初期化されるので便利です。

参考:Dockerfile

FROM centos:7
# change root password
RUN echo 'root:P@ssw0rd!' | chpasswd

# create new user
RUN useradd user
RUN echo 'user:P@ssw0rd!' | chpasswd
RUN echo 'user          ALL=(ALL)       ALL' >> /etc/sudoers

# yum update, install openssh-server and other
RUN yum -y update; yum clean all
RUN yum -y install openssh-server passwd sudo; yum clean all
RUN mkdir /var/run/sshd

# ssh-keygen
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''

EXPOSE 22

ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]

RUN systemctl enable sshd

CMD ["/usr/sbin/init"]
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away