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 の動作