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

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

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


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


#実行環境
```shell
# 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 で実行する場合は？

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

```

# 手順

**Namespace を作る**

```shell```
# kubectl create ns awx-target
```

**Deployment を作成する**

```yaml: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 の作成する**

```yaml: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 する***

```shell
# 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
```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"]
```