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


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

全体の構成

最小構成で試していきます.
Kubernetes用, Compute用, MySQL用の3台のノードを使ってやっていきます.
検証環境はmacOS Catalina環境でvagrantでノードを立ててます.
Kubernetesの導入はスキップします.

Keystoneとは

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

導入

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

1. MySQLインストール

チョット試したいだけなのでMySQL用のノードにdockerでさくっと立ててしまいます.

$ 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

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
keystone.conf
[database]
connection = mysql+pymysql://keystone:keystone@mysqlhost/keystone

[token]
provider = fernet
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
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を追加してローカルから取るようにしています.

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"
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ノードの同じディレクトリに設置します.
そしてビルド

$ 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
OpenStack Docs: Install and configure
Keystoneの動作と仕組み~エンドポイントと認証認可 (1/4):CodeZine(コードジン)