今回はおうち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倍速く進むのでおススメ。