kubernetes でGolangのGrahpqlをRaspberryPiで動かしてみる
目次
はじめに
最近、RaspberryPiでKubernetes(k8s)を構築する記事が流行っていると思います。
3日間クッキング【Kubernetes のラズペリーパイ包み “サイバーエージェント風”】 を筆頭に、数多くの記事が公開されています。
実際に私も勢いで作成してみたのですが、k8sはおろかDockerも知識がなかったので、k8sのpodを立ててみたいと思います。
前提
APIは以前の記事で作成したAPIを流用します。
Go言語で作ったGraphqlサーバになります。
githubにソースも載せています。
Dockerfile
k8sで使用するDockerfileを作成します。
Go言語のバージョンを決めて、make build してバイナリファイルを作成します。
Makefileはプロジェクト内に配置してあります。
FROM golang:1.11
COPY . /go/src/github.com/mitsuyoshi4/graphqlchat
WORKDIR /go/src/github.com/mitsuyoshi4/graphqlchat
RUN make setup && make build
CMD ["./bin/GraphQLChat"]
docker build してタグつけまで行います。また、registryは既にlocalで立てているものとします。
% sudo docker build -t mitsuyoshi4/graphq-chat:v1 .
% sudo docker tag mitsuyoshi4/graphql-chat:v1 localhost:443/mitsuyoshi4/graphql-chat:v1
% sudo docker push localhost:443/mitsuyoshi4/graphql-chat:v1
docker-compose.yml
k8sには必要ありませんが、自分はこのファイルを作成してから作ると理解しやすいので作成しました。
komposeを使用するとk8sのファイルに変換できるので作っておいて損はないと思います。
version: "3"
services:
redis:
image: redis
gqlgen:
image: localhost:443/mitsuyoshi4/graphql-chat
ports:
- "8080:8080"
environment:
- REDIS_URL=reids:3679
depends_on:
redis
API
k8sの設定ファイルを作成します。
API用にapi-deployment.yaml, api-service.yamlを作成します。
deploymentでpodを作成して、serviceでnode外からアクセスできるようにします。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: api
spec:
replicas: 1
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: localhost:443/mitsuyoshi4/graphql-chat:v1
ports:
- containerPort: 8080
env:
- name: REDIS_URL
value: redis-service.default:6379
- name: PORT
value: "8080"
REDIS_URLでredisを指定しています。
これはk8sのcoreDNSを使用しているため、ドメイン名でアクセスできます。
apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
type: NodePort
ports:
- port: 8080
protocol: TCP
targetPort: 8080
nodePort: 30080
selector:
app: api
外部からアクセスできるようにNodePortを設定しています。30080ポートは好みです。
redis
APIはデータストアにredisを使用するため、redisの設定ファイルも作成します。
DNSで名前解決するためにredis-service.yamlも作成します。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: redis
spec:
replicas: 1
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis
ports:
- containerPort: 6379
apiVersion: v1
kind: Service
metadata:
name: redis-service
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
apply
上記の設定ファイルをk8sディレクトリに配置し、下記のコマンドでpod,service を作成します。
% kubectl -f k8s/ apply
これによってRaspberryPiのマスターのIPAddr:30080にアクセスするとGraphqlの画面が出ると思います。
後片付けは以下のコマンドで行います。
% kubectl -f k8s/ delete
まとめ
Dockerとkubernetesの基本的な使い方が理解できたと思います。
RaspberryPiでもbuild等にあまり時間がかからないので、不満なく構築できると思います。
また、本来の目的のgitlabのCI/CDも手を出したいですね。
参考ページ
komposeの使い方
Docker ComposeからMinikube + Komposeに移行してみよう
registryの立て方
privateなdockerレジストリを構築する
kubect applyについて
Kubernetes: kubectl apply の動作