2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GraphQLの旅(1) Kubernetes上でPrisma/PostgreSQLによるGraphQL開発

Last updated at Posted at 2018-07-01

Prisma/PostgreSQLをKubernetes上に起動する

目的:PrismaでGraphQLサーバを楽に構築したい。環境はDockerじゃなくKubernetes!

Prismaでは、GraphQLのエンドポイントやデータベースのスキーマを自動で作成してくれます。

参考: Prismaの位置づけはDevelopment toolだと思う

graphql.png

この力をKubernetesでも活用したい、と思ったらデータベースインスタンス構築部分は現状docker-composeのみに対応。

今回はこれをKubernetes上に構築します。
本家ドキュメントには MySQLをKubernetesに構築する例がございます。

今回は、個人的な趣味でPostgreSQLをデータベースに使用します。

方針

  • prisma initでdocker-compose.yamlが出力される。
  • これをKomposeでkubernetes用Yamlに変換。

Prismaインストール

# Prismaのインストール
npm install -g prisma

新規Prismaプロジェクト作成

$ prisma init graphql-psql-k8s

  You can set up Prisma for local development (based on docker-compose)
  Use existing database      Connect to existing database
❯ Create new database        Set up a local database using Docker

? What kind of database do you want to deploy to?
  MySQL             MySQL compliant databases like MySQL or MariaDB
❯ PostgreSQL        PostgreSQL database

Created 3 new files:

  prisma.yml           Prisma service definition
  datamodel.graphql    GraphQL SDL-based datamodel (foundation for database)
  docker-compose.yml   Docker configuration file

Next steps:

  1. Open folder: cd graphql-psql-k8s
  2. Start your Prisma server: docker-compose up -d
  3. Deploy your Prisma service: prisma deploy
  4. Read more about Prisma server:
     http://bit.ly/prisma-server-overview

フォルダに入ってみる。

cd graphql-psql-k8s/

内部構造はこんな感じ。

.
├── datamodel.graphql
├── docker-compose.yml
└── prisma.yml

Komposeを使ってKubernetes用に変換

Komposeはdocker-composeファイルからkubernetesファイルを作るツールで、Kubernetesのサブプロジェクトです。

Linuxの場合は下記でインストールします。

curl -L https://github.com/kubernetes/kompose/releases/download/v1.15.0/kompose-linux-amd64 -o kompose
chmod +x kompose
sudo mv ./kompose /usr/local/bin/kompose

Komposeを使って、先ほど作成したPrismaフォルダ内でファイル変換を実施します。

$ mkdir k8s
$ kompose convert -f docker-compose.yml -o k8s
INFO Kubernetes file "k8s/prisma-service.yaml" created
INFO Kubernetes file "k8s/postgres-deployment.yaml" created
INFO Kubernetes file "k8s/postgres-persistentvolumeclaim.yaml" created
INFO Kubernetes file "k8s/prisma-deployment.yaml" created

そうするとk8sフォルダ内に.yamlファイル群が作成されています。

今回はk8s/prisma-service.yamlを下記のように変更し、PrismaにNodePort方式でアクセスします。

- type: ClusterIP
+ type: NodePort
  port:
+   nodePort: 30432 (Kubernetesが許可したポート範囲で空いている任意のポート番号を指定)

また、postgresにserviceができていないので、追加します。

echo << EOS > k8s/postgres-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: postgres
spec:
  type: ClusterIP
  ports:
  - name: "5432"
    port: 5432
    targetPort: 5432
  selector:
    io.kompose.service: postgres
status:
  loadBalancer: {}
EOS

Kubernetesを整備

kubernetesにPrismaを起動するためのnamespaceを作ります。これは本家ドキュメントと同じです。

そのあと、デプロイ先としてprismaというnamespaceを規定にしておきます。

kubectl create namespace prisma
kubectl config set-context <current-context名> --namespace=prisma 
Context <current-context名> modified.

Databaseを起動

もともとdocker-compose用に作られたPostgreSQL/Prisma起動はしなくてよいです。
そのかわり、下記を実施。

# docker-compose up -dはしなくてよい
$ kubectl create -f ./k8s
deployment.extensions/postgres created
persistentvolumeclaim/postgres created
deployment.extensions/prisma created
service/postgres created
service/prisma created

ここまで来て、kubectl get podで問題なくprismaが起動したようなら、<kubernetesのIP>:<prismaのnodePort>にブラウザでアクセスします。

image.png

Prismaの設定ファイルを変更

prisma.yamlを変更し、Kubernetes内のprismaのserviceに宛先を変更します。

endpoint: http://<kubernetesのIP>:<prismaのnodePort>

Prisma起動(データベースにスキーマをインストール)

$ prisma deploy
Creating stage default for service default ✔
Deploying service `default` to stage `default` to server `default` 8.2s

Changes:

  User (Type)
  + Created type `User`
  + Created field `id` of type `GraphQLID!`
  + Created field `name` of type `String!`
  + Created field `updatedAt` of type `DateTime!`
  + Created field `createdAt` of type `DateTime!`

Applying changes 5.7s

結果:Prismaにアクセス

下記のように、Prismaのschama.graphqlで指定されているスキーマ(Users)がちゃんとPostgreSQLとPrisma上で構築されていて、GraphQLが試せることがわかります。

image.png

その他参考

単純にdocker-composeで起動するなら

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?