おうちk8sに自作アプリを乗せる①(案の定k8sが上手くいかない #11)

スポンサーリンク
個人開発
スポンサーリンク

今回はおうちk8sに自作のアプリを乗せてみます。(アプリの詳細は今後記載していこうと思います)

まずはローカルで開発し、本番としてk8sで動かすことを目指します。

ローカルでの構成

ローカルではdocker composeで構築していました。

以下のような構成です。

version: '3.8'
 
services:
  go-slim-nginx:
    image: nginx:latest
    ・・・【略】・・・

  go-slim-frontend:
    container_name: go-slim-frontend-container
    build:
      context: ./frontend
      dockerfile: ./Dockerfile
    ports:
      - "8443:443"
      - "5173:5173"
    volumes:
      - ./frontend/go-slim:/app
    working_dir: /app
    ・・・【略】・・・

  go-slim-backend:
    container_name: go-slim-backend-container
    build:
      context: ./backend
      dockerfile: ./Dockerfile
    restart: always
    ports:
      - "8000:8000"
    command: sh -c "/code/entrypoint.sh"
    volumes:
      - ./backend/entrypoint.sh:/code/entrypoint.sh
      - ./backend/go_slim:/code
    depends_on:
      go-slim-db:
        condition: service_healthy
    networks:
      - go_slim_network

  go-slim-db:
    image: mysql:8.0.35
    container_name: go-slim-db-container
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=xxxxx
      - MYSQL_DATABASE=xxxxx_db
      - MYSQL_USER=xxxxxxuser
      - MYSQL_PASSWORD=xxxxxxpasswd
    ports:
      - 3306:3306
    volumes:
      - ./db/dml:/tmp/dml
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-uroot", "-proot"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s
    networks:
      - go_slim_network

networks:
  go_slim_network:
    ipam:
      driver: default
      config:
        - subnet: 172.19.1.0/24

これをk8sに移行していくにはどうすれば良いかを考えていました。

komposeというツールを使ってみましたが、運用しにくいのでやめました。

まずは、Docker imageをどうするかですね。

ということで、Dockerのリポジトリを設定していきます。

Dockerリポジトリにimageをpushする

Docker Hubにアカウントを作っていない場合はアカウントを作成します。

以下のコマンドを実施していく(master nodeにて実施)

✅ログイン

$ docker login

✅シークレットの作成(/home/XXXX/.docker/config.jsonのpathは適宜変更、-n go-slimのnamespaceも適宜変更)

$ kubectl create secret generic regcred --from-file=.dockerconfigjson=/home/XXXX/.docker/config.json --type=kubernetes.io/dockerconfigjson -n go-slim

✅dockerfileのあるディレクトリに移動してimageの作成

$ sudo docker build -t appare99/go-slim-frontend .

docker imageをpushするまで

次に作成したimageをpushする。

しかし、ここで、docker imageをpushしようとしたが、うまくできない。

$ sudo docker push appare99/go-slim-frontend
The push refers to repository [localhost:5000/go-slim-backend]
9e933548a1d7: Preparing
6a0c18a68795: Preparing
a3b3cdcc45c2: Preparing
a67c04294279: Preparing
2207d79bb41b: Preparing
631a94b65f8a: Waiting
7ff82b23b7a0: Waiting
b265d44e9595: Waiting
37e9a26e7ac0: Waiting
6f7485e323d2: Waiting
a6922fb351cb: Waiting
0916a4ff4c89: Waiting
2b8df6d15dfd: Waiting
aa8b464b75d8: Waiting

sudoを使うと、現在のユーザーのDocker認証情報が使用されない可能性があります。

で、まあsudoを使わずにdockerを使うと権限エラーになります。

$ docker push appare99/go-slim-frontend
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.45/images/localhost:5000/go-slim-backend/push?tag=v0.0.1": dial unix /var/run/docker.sock: connect: permission denied

認証情報をルートユーザーの環境にもコピーします。

$ sudo cp ~/.docker/config.json /root/.docker/config.json

で以下のようにできた。

$ sudo docker push appare99/go-slim-frontend
The push refers to repository [localhost:5000/go-slim-backend]
9e933548a1d7: Pushed
6a0c18a68795: Pushed
a3b3cdcc45c2: Pushed
a67c04294279: Pushed
2207d79bb41b: Pushed
631a94b65f8a: Pushed
7ff82b23b7a0: Pushed
b265d44e9595: Pushed
37e9a26e7ac0: Pushed
6f7485e323d2: Pushed
a6922fb351cb: Pushed
0916a4ff4c89: Pushed
2b8df6d15dfd: Pushed
aa8b464b75d8: Pushed

imageを指定したdeploymentのyamlは以下。(ハイライトの部分がimageを指定している)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-slim-frontend
  labels:
    app: go-slim
  namespace: go-slim
spec:
  replicas: 2
  selector:
    matchLabels:
      app: go-slim
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: go-slim
    spec:
      containers:
      - image: appare99/go-slim-frontend
        name: go-slim-frontend-container
        ports:
        - containerPort: 443  # HTTPSポート
          name: https
        - containerPort: 5173
          name: vite
        volumeMounts:
        - name: go-slim-frontend-persistent-storage
          mountPath: /app
        workingDir: /app
        command: ["sh", "-c", "HOST=0.0.0.0 npm run dev -- --host"]
      imagePullSecrets: 
      - name: regcred
      volumes:
      - name: go-slim-frontend-persistent-storage
        persistentVolumeClaim:
          claimName: go-slim-frontend-pvc

これで、podのimageを扱えるようになりました。

その他

デバッグの際は

command: ["sh", "-c", "echo Hello && sleep 3600"]

でexecで入って調べた方がトラブルシューティングが100倍速く進むのでおススメ。

タイトルとURLをコピーしました