Ryeonho Heo

Ryeonho Heo

ブログをK8sへ移行

こちらのサイトはNext.jsで作れれています。すでにcontainer化しているため簡単にK8sへ展開することができました。 K8sにdeployするためにはまずdocker imageをbuildしたらそれはregistryにpushしておく必要があります。それをK8sから参照してpodを生成するのです。K8sの設定は大きくpodを生成するのとそれをserviceとして公開する作業が必要です。

  1. private docker registry
  2. 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 docker tezyun

この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