ブログをK8sへ移行
こちらのサイトはNext.jsで作れれています。すでにcontainer化しているため簡単にK8sへ展開することができました。 K8sにdeployするためにはまずdocker imageをbuildしたらそれはregistryにpushしておく必要があります。それをK8sから参照してpodを生成するのです。K8sの設定は大きくpodを生成するのとそれをserviceとして公開する作業が必要です。
- private docker registry
- K8s config files
1. private docker registry
自分のprivate registryを立ち上げるのは簡単です。
$ docker run -d -p 5000:5000 --name registry registry:2
これで以下のようにimageをpushすることだできます。
$ docker pull ubuntu # docker imageを持ってくる # そのimageを localのregistryへpushする $ docker image tag ubuntu localhost:5000/myfirstimage $ docker push localhost:5000/myfirstimage
imageを使う側は以下のようになるのでしょう
docker pull localhost:5000/myfirstimage
docker run --rm -it localhost:5000/myfirstimage bash
では remoteでも使うためにはどうするんでしょうか?remoteで使う場合は基本、security対策が必要になります。もしpublicである場合なら誰でもアクセスすることが可能になったり通信に暗号化が必要になる、またSSL infrastructureの用意も必要です。自分の場合はlocal networkでしか使わないためlocal networkだけのための設定を行いました。
registryようにmachineを用意しました。
lxc launch images:ubuntu/22.04 docker-registry
docker-registry instance内部でdockerを起動する必要がります。これはcontainer内でcontainerを実装するような設定になります。
このlxc instanceには192.168.1.20というlocal ipを付与してlocal networkからアクセスできるようにしました。
以下のように起動させます。
$ lxc shell docker-registry
# docker run -d -p 5000:5000 --restart unless-stopped --name registry registry:2
microk8sの設定
sudo mkdir -p /var/snap/microk8s/current/args/certs.d/192.168.1.20:5000
sudo touch /var/snap/microk8s/current/args/certs.d/192.168.1.20:5000/hosts.toml
hosts.toml 内容
# /var/snap/microk8s/current/args/certs.d/192.168.1.20:5000/hosts.toml
server = "http://192.168.1.20:5000"
[host."http://192.168.1.20:5000"]
capabilities = ["pull", "resolve"]
microk8s restart
microk8s stop
microk8s start
2. K8s config files
deployment
apiVersion: apps/v1 kind: Deployment metadata: labels: app: "ryeonho.com" name: "ryeonho-com" namespace: default spec: replicas: 1 selector: matchLabels: app: "ryeonho.com" strategy: type: RollingUpdate template: metadata: labels: app: "ryeonho.com" spec: containers: - image: registry.funit.net:5000/ryeonho.com:latest imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 3 httpGet: path: /api/healthcheck port: 3000 scheme: HTTP periodSeconds: 10 successThreshold: 1 timeoutSeconds: 10 initialDelaySeconds: 60 readinessProbe: failureThreshold: 3 httpGet: path: /api/healthcheck port: 3000 scheme: HTTP periodSeconds: 10 successThreshold: 1 timeoutSeconds: 10 initialDelaySeconds: 30 name: "ryeonho-com" env: - name: "REACT_APP_ENVIRONMENT" value: "PROD" ports: - containerPort: 3000 protocol: TCP resources: requests: cpu: 1000m memory: 2G terminationMessagePath: /dev/termination-log terminationMessagePolicy: File dnsPolicy: ClusterFirst restartPolicy: Always