OpenStack on Kubernetesの検証その1 (Keystone)

22日目の記事です.
本当はインスタンスを起動させるとこまでやりたかったのですが, 時間がなかったのでとりあえず今回はkeystoneの導入だけ書きます. 続きはまた今度書きます.

# 全体の構成
最小構成で試していきます.
Kubernetes用, Compute用, MySQL用の3台のノードを使ってやっていきます.
検証環境はmacOS Catalina環境でvagrantでノードを立ててます.
Kubernetesの導入はスキップします.
![スクリーンショット 2019-12-22 23.36.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228406/694eab5d-28de-b1a1-e8a0-cdb6f2ff95e6.png)

# Keystoneとは
OpenStackの認証とエンドポイントを管理するサービスです. OpenStackはマイクロサービスアーキテクチャでできており, 各コンポーネントはKeystoneに問い合わせて認証などを行います.
ここに詳しい説明が載っています.
[Keystoneの動作と仕組み～エンドポイントと認証認可 (1/4)：CodeZine（コードジン）](https://codezine.jp/article/detail/9636)

# 導入
導入は基本的にドキュメント通りです.
https://docs.openstack.org/keystone/train/install/keystone-install-ubuntu.html

## 1. MySQLインストール
ﾁｮｯﾄ試したいだけなのでMySQL用のノードにdockerでさくっと立ててしまいます.

```bash
$ docker run -itd --name mysql -v $PWD/mysql:/src -w /src -p 3306:3306  -e MYSQL_ROOT_PASSWORD=pass mysql:5.7
```

## 2. DBのセットアップ
先程立てたMySQLコンテナに入りセットアップします.

```
$ docker exec -it mysql mysql -u root -p
mysql> CREATE DATABASE keystone;
mysql>  GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost'  IDENTIFIED BY 'keystone';
mysql>  GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%'  IDENTIFIED BY 'keystone';
```

## 3. Keystone用のコンテナの作成
Dockerfileとその他設定ファイルを用意します.
ドキュメント通りにするだけです.

```dockerfile:Dockerfile

FROM ubuntu:18.04

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && \
    apt-get install -y keystone apache2 libapache2-mod-wsgi

COPY keystone.conf /etc/keystone/keystone.conf
COPY setup.sh /root/setup.sh

RUN echo "ServerName keystone-server" >> /etc/apache2/apache2.conf

COPY ./exec.sh /root/exec.sh
RUN chmod +x /root/exec.sh /root/setup.sh

CMD ["/root/exec.sh"]

EXPOSE 5000
```

```conf:keystone.conf
[database]
connection = mysql+pymysql://keystone:keystone@mysqlhost/keystone

[token]
provider = fernet
```

```bash:setup.sh
#!/bin/bash
set -e

# データベースの作成
su -s /bin/sh -c "keystone-manage db_sync" keystone 

# fernetトークンの初期化
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone 
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone 

keystone-manage bootstrap --bootstrap-password ADMIN_PASS \
  --bootstrap-admin-url http://keystone-server:5000/v3/ \
  --bootstrap-internal-url http://keystone-server:5000/v3/ \
  --bootstrap-public-url http://keystone-server:5000/v3/ \
  --bootstrap-region-id RegionOne
```

```bash:exec.sh
#!/bin/bash
set -e

source /etc/apache2/envvars
apache2 -D FOREGROUND

```

setup.shは初回の設定のとき, exec.shは起動時に使用します.

## 4. yamlの用意
KubernetesのDeploymentとService用のyamlを用意します.
今回はローカルのコンテナを使用するためimagePullPolicy: IfNotPresentを追加してローカルから取るようにしています.

```yaml:keystone-deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
  name: keystone-pod
  labels:
    name: keystone-pod
spec:
  replicas: 1
  selector:
    matchLabels:
      name: keystone-pod
  template:
    metadata:
      labels:
        name: keystone-pod
    spec:
      containers:
      - name: keystone-pod
        image: keystone 
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 5000
        env:
        - name: OS_USERNAME
          value: "admin"
        - name: OS_PASSWORD
          value: "ADMIN_PASS"
        - name: OS_PROJECT_NAME
          value: "admin"
        - name: OS_USER_DOMAIN_NAME
          value: "Default"
        - name: OS_PROJECT_DOMAIN_NAME
          value: "Default" 
        - name: OS_AUTH_URL
          value: "http://keystone-server:5000/v3"
        - name: OS_IDENTITY_API_VERSION
          value: "3"
```

```yaml:keystone-service.yaml
kind: Service
apiVersion: v1
metadata:
  labels:
    name: keystone-server
  name: keystone-server
spec:
  ports:
  - port: 5000
  selector:
    name: keystone-pod
```

## 5. いざデプロイ
先程用意したDockerfileとその他ファイル群をkubernetesノードの同じディレクトリに設置します.
そしてビルド

```bash
$ docker build . -t keystone
```

次にopenstackネームスペースを作りDeploymentとServiceをapply

```
$ kubectl create namespace openstack
$ kubectl apply -f keystone-deployment.yaml -n openstack
$ kubectl apply -f keystone-service.yaml -n openstack
```

## 6. 初期設定
pod名を確認しpodの中に入ります.
そしてsetup.shを実行

```
$ kubectl get pods -n openstack
$ kubectl exec -it <pod-name> -n openstack /root/setup.sh
```

# おわりに
いかがでしたか? (検索回避)
今回はkeystoneをインストールしました.
次回(があれば)glanceをインストールします.

# 参考
[OpenStack on Kubernetesを、GKEで試してみる - Qiita](https://qiita.com/ttsubo/items/57ba2b508ef34f241b21#2-nova%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
[OpenStack Docs: Install and configure](https://docs.openstack.org/keystone/train/install/keystone-install-ubuntu.html)
[Keystoneの動作と仕組み～エンドポイントと認証認可 (1/4)：CodeZine（コードジン）](https://codezine.jp/article/detail/9636)