kubernetes でGolangのGrahpqlをRaspberryPiで動かしてみる

@aintek on Sat Feb 02 2019
8.7 min

目次

はじめに

最近、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 の動作

日別に記事を見る