ラベル Kubernetes の投稿を表示しています。 すべての投稿を表示
ラベル Kubernetes の投稿を表示しています。 すべての投稿を表示

2024年10月19日土曜日

Kubernetesで使用されていないPVCを一覧表示する

Kubernetesで使用されていないPVCを一覧表示するには、以下のコマンドを実行します。Name, Namespace, Used Byフィールドが表示されます。
kubectl describe -A pvc | grep -E "^Name:.*|^Namespace:.*|^Used By:.*" | sed -e 's/^.*: *//' | awk '{printf("%s ", $1);} NR%3==0 {printf("\n");}' | grep '<none>'

2024年10月18日金曜日

KubernetesでPostgreSQLの共有メモリを増やす

KubernetesでPostgreSQLの共有メモリを増やすには以下の手順を実行します。

1. 現在の設定の確認
kubectl exec --stdin --tty ※ポッド名 --container ※コンテナ名 -- /usr/local/bin/psql -U postgres
クライアントから確認
show shared_buffers;

2. 設定変更
PVに割り当てられたディレクトリからpostgresql.confを変更
■変更前
shared_buffers = 128MB                  # min 128kB
                                        # (change requires restart)
■変更後
shared_buffers = 256MB                  # min 128kB
                                        # (change requires restart)

Documentationでは1GB以上のRAMがあればshared_buffersに対する妥当な初期値はシステムメモリの25%。
https://www.postgresql.jp/document/16/html/runtime-config-resource.html

3. 再起動して変更を反映
kubectl rollout restart deployment ※デプロイメント名

4. 再度設定確認

2024年10月17日木曜日

KubernetesでPostgreSQLをアップグレードする方法

KubernetesでPostgreSQLをアップグレードする場合、以下の順序でバージョンアップを行います。

1. 現バージョンでバックアップを取得
kubectl exec --stdin ※ポッド名 --container ※コンテナ名 -- /usr/local/bin/pg_dumpall -U postgres > dumpall.sql

2. バージョンアップ後に使用するPV/PVCを作成

3. deploymentなどで使用するPostgreSQLのイメージを新しいものに変更し、PVCもあたらしいものを参照するようにymlを更新。kubectl applyで反映。

4. 新バージョンでデータをインポート
cat dumpall.sql | kubectl exec --stdin ※ポッド名 --container ※コンテナ名 -- /usr/local/bin/psql -U postgres

5. 動作確認後、古いバージョンのPV/PVCを削除

2024年10月16日水曜日

Kubernetesでポッド内のコンテナのマウント名とパスを一覧表示する

Kubernetesでポッド内のコンテナのマウント名とパスを一覧表示するには、以下のコマンドを実行します

1.ポッド一覧を取得
kubectl get pods

2.ポッドのコンテナ内のマウント名とパスを一覧表示
kubectl get pod ※1で取得したポッド名 -o jsonpath='{range .spec.containers[*]}{.name}{"\n"}{range .volumeMounts[*]}{"- "}{.name}{":"}{.mountPath}{"\n"}{end}{end}'

2024年10月15日火曜日

Kubernetesでポッド内のコンテナ名とイメージ名を一覧表示する

Kubernetesでポッド内のコンテナ名とイメージ名を一覧表示するには、以下のコマンドを実行します
1.ポッド一覧を取得
kubectl get pods

2.コンテナ名とイメージ名を一覧表示
kubectl get pod ※1で取得したポッド名 -o jsonpath='{range .spec.containers[*]}{.name}{":"}{.image}{"\n"}{end}'

2022年4月30日土曜日

Kubernetes python clientでMicrok8sの永続ボリュームを削除する

以下のようなKubernetes python clientサンプルプログラムでMicrok8sの永続ボリュームを削除することが出来ます。

実行手順

1. 実行環境の構築・設定
以下のページを参照して、実行環境の構築・設定を行います。
Kubernetes python clientでMicrok8sのnamespaceを列挙する

2. サンプルプログラムの作成と実行
以下のサンプルプログラムで永続ボリュームを削除することが出来ます。
delete-pv.py
from kubernetes import config, client
from kubernetes.client.exceptions import ApiException

# configを読み込み
cfg = config.load_kube_config()

# クライアントを作成
with client.ApiClient(cfg) as api_client:
  api = client.CoreV1Api(api_client)
  namespace = 'default'
  pv_name = 'local-httpd-pv'
  # 永続ボリュームの削除
  try:
    api.delete_persistent_volume(pv_name)
  except ApiException as ex:
    print(ex)

・実行コマンド
python3 delete-pv.py

関連情報

・Kubernetes Python Clientのリポジトリ
https://github.com/kubernetes-client/python

2022年4月29日金曜日

Kubernetes python clientでMicrok8sの永続ボリューム要求を削除する

以下のようなKubernetes python clientサンプルプログラムでMicrok8sの永続ボリューム要求を削除することが出来ます。

実行手順

1. 実行環境の構築・設定
以下のページを参照して、実行環境の構築・設定を行います。
Kubernetes python clientでMicrok8sのnamespaceを列挙する

2. サンプルプログラムの作成と実行
以下のサンプルプログラムで永続ボリューム要求を削除することが出来ます。
delete-pvc.py
from kubernetes import config, client
from kubernetes.client.exceptions import ApiException

# configを読み込み
cfg = config.load_kube_config()

# クライアントを作成
with client.ApiClient(cfg) as api_client:
  api = client.CoreV1Api(api_client)
  namespace = 'default'
  pvc_name = 'local-httpd-pvc'
  # 永続ボリューム要求の削除
  try:
    api.delete_namespaced_persistent_volume_claim(pvc_name, namespace)
  except ApiException as ex:
    print(ex)

・実行コマンド
python3 delete-pvc.py

関連情報

・Kubernetes Python Clientのリポジトリ
https://github.com/kubernetes-client/python

2022年4月28日木曜日

Kubernetes python clientでMicrok8sのServiceを削除する

以下のようなKubernetes python clientサンプルプログラムでMicrok8sのServiceを削除することが出来ます。

実行手順

1. 実行環境の構築・設定
以下のページを参照して、実行環境の構築・設定を行います。
Kubernetes python clientでMicrok8sのnamespaceを列挙する

2. サンプルプログラムの作成と実行
以下のサンプルプログラムでServiceを削除することが出来ます。
delete-service.py
from kubernetes import config, client
from kubernetes.client.exceptions import ApiException

# configを読み込み
cfg = config.load_kube_config()

# クライアントを作成
with client.ApiClient(cfg) as api_client:
  api = client.CoreV1Api(api_client)
  namespace = 'default'
  service_name = 'httpd-service'
  # Serviceの削除
  try:
    api.delete_namespaced_service(service_name, namespace)
  except ApiException as ex:
    print(ex)

・実行コマンド
python3 delete-service.py

関連情報

・Kubernetes Python Clientのリポジトリ
https://github.com/kubernetes-client/python

2022年4月27日水曜日

Kubernetes python clientでMicrok8sの永続ボリューム/永続ボリューム要求/Deployment/Serviceを作成する

以下のようなKubernetes python clientサンプルプログラムでMicrok8sの永続ボリューム/永続ボリューム要求/Deployment/Serviceを作成することが出来ます。

実行手順

1. 実行環境の構築・設定
以下のページを参照して、実行環境の構築・設定を行います。
Kubernetes python clientでMicrok8sのnamespaceを列挙する

2. サンプルプログラムの作成と実行
以下のサンプルプログラムでMicrok8sの永続ボリューム/永続ボリューム要求/Deployment/Serviceを作成することが出来ます。ローカルストレージの永続ボリュームを使用するApache Httpdをデプロイ&サービス作成しています。
deploy-httpd.py
from kubernetes import config, client
from kubernetes.client.exceptions import ApiException

# 永続ボリュームの作成
def create_pv(api):
  pv = client.V1PersistentVolume()
  # 永続ボリューム名
  pv.metadata = client.V1ObjectMeta(
    name="local-httpd-pv"
  )
  pv.spec = client.V1PersistentVolumeSpec(
    # 容量
    capacity = {"storage":"50Mi"},
    # local volume
    local = client.V1LocalVolumeSource(path="/var/mywww/html"),
    # アクセスモード
    access_modes = [
      "ReadOnlyMany"
    ],
    # node affinityの設定
    node_affinity = client.V1VolumeNodeAffinity(
      required = client.V1NodeSelector(
        node_selector_terms = [
          client.V1NodeSelectorTerm(
            match_expressions = [
              client.V1NodeSelectorRequirement(
                key = "kubernetes.io/hostname",
                operator = "In",
                values = ["ub2004server1"] # 適宜ホスト名を変更してください
              )
            ]
          )
        ]
      )
    ),
    # storage class設定
    storage_class_name = "local-storage",
  )
  # 永続ボリュームを作成
  api.create_persistent_volume(pv)

# 永続ボリューム要求の作成
def create_pvc(api, namespace):
  pv = client.V1PersistentVolumeClaim()
  pv.metadata = client.V1ObjectMeta(
    name="local-httpd-pvc"
  )
  pv.spec = client.V1PersistentVolumeClaimSpec(
    access_modes = [
      "ReadOnlyMany"
    ],
    resources = client.V1ResourceRequirements(
      requests = {"storage": "50Mi"}
    ),
    storage_class_name = "local-storage",
  )
  api.create_namespaced_persistent_volume_claim(namespace, pv)

# Deploymentの作成
def create_deployment(api, namespace):
  dp = client.V1Deployment()
  dp.metadata = client.V1ObjectMeta(
    name="httpd-deployment",
    labels={"app":"myhttpd"}
  )
  dp.spec = client.V1DeploymentSpec(
    replicas = 1,
    selector = client.V1LabelSelector(
      match_labels = {"app":"myhttpd"}
    ),
    template = client.V1PodTemplateSpec(
      metadata = client.V1ObjectMeta(
        labels={"app":"myhttpd"}
      ),
      spec = client.V1PodSpec(
        containers = [
          client.V1Container(
            name = "myhttpd",
            image = "httpd:2.4-alpine",
            ports = [
              client.V1ContainerPort(container_port=80)
            ],
            volume_mounts = [
              client.V1VolumeMount(
                name = "documentroot",
                mount_path = "/usr/local/apache2/htdocs"
              )
            ]
          )
        ],
        volumes = [
          client.V1Volume(
            name = "documentroot",
            persistent_volume_claim = client.V1PersistentVolumeClaimVolumeSource(
              claim_name = "local-httpd-pvc"
            )
          )
        ]
      )
    )
  )
  api.create_namespaced_deployment(namespace, dp)

# Serviceの作成
def create_service(api, namespace):
  sv = client.V1Service()
  sv.metadata = client.V1ObjectMeta(
    name="httpd-service"
  )
  sv.spec = client.V1ServiceSpec(
    selector = {"app":"myhttpd"},
    type = "LoadBalancer",
    external_i_ps = ["192.168.1.10"], # 適宜IPアドレスを変更してください
    ports = [
      client.V1ServicePort(
        port = 8080,
        target_port = 80,
        protocol = "TCP"
      )
    ]
  )
  api.create_namespaced_service(namespace, sv)



# configを読み込み
cfg = config.load_kube_config()

# クライアントを作成
with client.ApiClient(cfg) as api_client:
  api = client.CoreV1Api(api_client)
  namespace = 'default'
  # 永続ボリュームの作成
  try:
    create_pv(api)
  except ApiException as ex:
    if ex.reason == 'Conflict':
      print("already exists.")
    else:
      print(ex)

  # 永続ボリューム要求の作成
  try:
    create_pvc(api, namespace)
  except ApiException as ex:
    if ex.reason == 'Conflict':
      print("already exists.")
    else:
      print(ex)

  # Deploymentの作成
  try:
    apps_api = client.AppsV1Api(api_client)
    create_deployment(apps_api, namespace)
  except ApiException as ex:
    if ex.reason == 'Conflict':
      print("already exists.")
    else:
      print(ex)

  # Serviceの作成
  try:
    create_service(api, namespace)
  except ApiException as ex:
    if ex.reason == 'Conflict':
      print("already exists.")
    else:
      print(ex)

・実行コマンド
python3 deploy-httpd.py

関連情報

・Kubernetes Python Clientのリポジトリ
https://github.com/kubernetes-client/python

・kubectlを使用して同様のデプロイを行う場合は、以下のページを参照してください。
Microk8sでlocal永続ボリュームを使用するApache Httpdをデプロイする

2022年4月26日火曜日

Kubernetes python clientでMicrok8sのNodeを列挙する

以下のようなKubernetes python clientサンプルプログラムでMicrok8sのNodeを列挙することが出来ます。

実行手順

1. 実行環境の構築・設定
以下のページを参照して、実行環境の構築・設定を行います。
Kubernetes python clientでMicrok8sのnamespaceを列挙する

2. サンプルプログラムの作成と実行
以下のサンプルプログラムでNodeを列挙することが出来ます。
list-node.py
from kubernetes import config, client

# configを読み込み
cfg = config.load_kube_config()

# クライアントを作成
with client.ApiClient(cfg) as api_client:
  api = client.CoreV1Api(api_client)
  # Nodeの列挙
  nodes = api.list_node(watch=False)
  for node in nodes.items:
    # node名を表示
    print("node name: {}".format(node.metadata.name))
    # conditionsを表示
    for condition in node.status.conditions:
      if condition.status == 'True':
        print("  condition: {}".format(condition.type))
    # address
    for address in node.status.addresses:
      print("  address:{}".format(address))

・実行コマンド
python3 list-node.py

関連情報

・Kubernetes Python Clientのリポジトリ
https://github.com/kubernetes-client/python

2022年4月25日月曜日

Kubernetes python clientでMicrok8sの永続ボリューム要求を列挙する

以下のようなKubernetes python clientサンプルプログラムでMicrok8sの永続ボリューム要求(Persistent volume claim)を列挙することが出来ます。

実行手順

1. 実行環境の構築・設定
以下のページを参照して、実行環境の構築・設定を行います。
Kubernetes python clientでMicrok8sのnamespaceを列挙する

2. サンプルプログラムの作成と実行
以下のサンプルプログラムで永続ボリュームを列挙することが出来ます。
list-pvc.py
from kubernetes import config, client

# configを読み込み
cfg = config.load_kube_config()

# クライアントを作成
with client.ApiClient(cfg) as api_client:
  api = client.CoreV1Api(api_client)
  # Persistent Volume Claimの列挙
  pvcs = api.list_persistent_volume_claim_for_all_namespaces(watch=False)
  for pvc in pvcs.items:
    # Persistent volume Claim名を表示
    print("persistent volume claim name: {}".format(pvc.metadata.name))
    # phaseを表示
    print("  phase: {}".format(pvc.status.phase))
    # access mode
    for access_mode in pvc.spec.access_modes:
      print("  access mode:{}".format(access_mode))
    # 容量を表示
    print("  capacity: {}".format(pvc.status.capacity))
    # Persistent volume nameを表示
    print("  persistent volume name: {}".format(pvc.spec.volume_name))

・実行コマンド
python3 list-pvc.py

関連情報

・Kubernetes Python Clientのリポジトリ
https://github.com/kubernetes-client/python

2022年4月24日日曜日

Kubernetes python clientでMicrok8sの永続ボリュームを列挙する

以下のようなKubernetes python clientサンプルプログラムでMicrok8sの永続ボリュームを列挙することが出来ます。

実行手順

1. 実行環境の構築・設定
以下のページを参照して、実行環境の構築・設定を行います。
Kubernetes python clientでMicrok8sのnamespaceを列挙する

2. サンプルプログラムの作成と実行
以下のサンプルプログラムで永続ボリュームを列挙することが出来ます。
list-pv.py
from kubernetes import config, client

# configを読み込み
cfg = config.load_kube_config()

# クライアントを作成
with client.ApiClient(cfg) as api_client:
  api = client.CoreV1Api(api_client)
  # Persistent Volumeの列挙
  volumes = api.list_persistent_volume(watch=False)
  for volume in volumes.items:
    # volume名を表示
    print("volume name: {}".format(volume.metadata.name))
    # phaseを表示
    print("  phase: {}".format(volume.status.phase))
    # access mode
    for access_mode in volume.spec.access_modes:
      print("  access mode:{}".format(access_mode))
    # 容量を表示
    print("  capacity: {}".format(volume.spec.capacity))
    # storage class nameを表示
    print("  storage class name: {}".format(volume.spec.storage_class_name))
    # local volume path
    if volume.spec.local is not None:
      print("  local volume path: {}".format(volume.spec.local.path))

・実行コマンド
python3 list-pv.py

関連情報

・Kubernetes Python Clientのリポジトリ
https://github.com/kubernetes-client/python

2022年4月23日土曜日

Microk8sとKubernetes python clientでServiceを列挙する

以下のようなMicrok8sとKubernetes python clientサンプルプログラムでServiceを列挙することが出来ます。

実行手順

1. 実行環境の構築・設定
以下のページを参照して、実行環境の構築・設定を行います。
Kubernetes python clientでMicrok8sのnamespaceを列挙する

2. サンプルプログラムの作成と実行
以下のサンプルプログラムでServiceを列挙することが出来ます。
list-service.py
from kubernetes import config, client

# configを読み込み
cfg = config.load_kube_config()

# クライアントを作成
with client.ApiClient(cfg) as api_client:
  api = client.CoreV1Api(api_client)
  # serviceの列挙
  services = api.list_namespaced_service('default', watch=False)
  for service in services.items:
    # service名を表示
    print("service name: {}".format(service.metadata.name))
    print("type: {}".format(service.spec.type))
    # ポート
    for port in service.spec.ports:
      print("  port: {} -> target port: {}".format(port.port, port.target_port))

・実行コマンド
python3 list-service.py

関連情報

・Kubernetes Python Clientのリポジトリ
https://github.com/kubernetes-client/python

2022年4月22日金曜日

Kubernetes python clientでMicrok8sのPodを列挙する

以下のようなKubernetes python clientサンプルプログラムでMicrok8sのPodを列挙することが出来ます。

実行手順

1. 実行環境の構築・設定
以下のページを参照して、実行環境の構築・設定を行います。
Kubernetes python clientでMicrok8sのnamespaceを列挙する

2. サンプルプログラムの作成と実行
以下のサンプルプログラムでPodを列挙することが出来ます。
list-pod.py
from kubernetes import config, client

# configを読み込み
cfg = config.load_kube_config()

namespace = 'default'
# クライアントを作成
with client.ApiClient(cfg) as api_client:
  api = client.CoreV1Api(api_client)
  # podの列挙
  pods = api.list_namespaced_pod(namespace, watch=False)
  for pod in pods.items:
    # print(type(pod))
    print("-----------")
    # pod名とphase
    print("{}:{}".format(pod.metadata.name, pod.status.phase))
    # pod内のコンテナ
    for container in pod.spec.containers:
      # イメージ名
      print("  image: {}".format(container.image))
      # ポート
      if container.ports is not None:
        for port in container.ports:
          print("    container port: {}".format(port.container_port))
          print("    host port: {}".format(port.host_port))
    # restart policy
    print("restart policy: {}".format(pod.spec.restart_policy))
    # スケジューラ名
    print("scheduler_name: {}".format(pod.spec.scheduler_name))
    # サービスアカウント
    print("service_account_name: {}".format(pod.spec.service_account_name))
    # ボリューム
    for volume in pod.spec.volumes:
      # ボリューム名
      print("  volume name: {}".format(volume.name))
      # Persistent Volume Claim
      print("  PVC: {}".format(volume.persistent_volume_claim))

・実行コマンド
python3 list-pod.py

関連情報

・Kubernetes Python Clientのリポジトリ
https://github.com/kubernetes-client/python

2022年4月14日木曜日

k3sで同一ポッド内にn8n.ioとPostgreSQLを配置する

n8n.ioは自動化ワークフローツールです。k3s同一ポッド内にn8n.ioとPostgreSQLを配置するには、以下の手順を実行します。データはlocal永続ボリュームに保存します。

実行手順

1. local永続ボリュームで使用するディレクトリの作成
k3sがインストールされているホスト上でlocal永続ボリュームで使用するディレクトリを作成します。
sudo mkdir -p /var/n8n-pg-data

sudo mkdir -p /var/n8n-data

2. local永続ボリュームの作成
以下のコマンドでlocal永続ボリュームを作成します。
※PostgreSQLデータ用
cat << EOF > local-pg-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pg-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/n8n-pg-data
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているk3sがインストールされているホスト名になります。適宜変更してください。
sudo k3s kubectl apply -f ./local-pg-pv.yml

※n8n.io用
cat << EOF > local-n8n-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-n8n-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/n8n-data
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているk3sがインストールされているホスト名になります。適宜変更してください。
sudo k3s kubectl apply -f ./local-n8n-pv.yml

3. 永続ボリューム要求の作成
以下のコマンドで永続ボリューム要求を作成します。
※PostgreSQLデータ用
cat << EOF > local-pg-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-pg-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-pg-pv
EOF

sudo k3s kubectl apply -f ./local-pg-pvc.yml

※n8n.io用
cat << EOF > local-n8n-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-n8n-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-n8n-pv
EOF

sudo k3s kubectl apply -f ./local-n8n-pvc.yml

4. n8n.ioとPostgreSQLのDeploymentの作成
以下のコマンドでn8n.ioとPostgreSQLを含むポッドと作成したlocal永続ボリュームを使用するDeploymentを作成します。
cat << EOF > n8n-pg-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: n8n-pg-deployment
  labels:
    app: n8n-pg
spec:
  replicas: 1
  selector:
    matchLabels:
      app: n8n-pg
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: n8n-pg
    spec:
      containers:
      - name: mypg
        image: postgres:14-alpine
        env:
        - name: POSTGRES_DB
          value: n8n
        - name: POSTGRES_USER
          value: n8n
        - name: POSTGRES_PASSWORD
          value: n8n
        ports:
        - containerPort: 5432
        volumeMounts:
        - name: pgdata
          mountPath: /var/lib/postgresql/data
      - name: n8n
        image: n8nio/n8n
        env:
        - name: DB_TYPE
          value: postgresdb
        - name: DB_POSTGRESDB_DATABASE
          value: n8n
        - name: DB_POSTGRESDB_HOST
          value: 127.0.0.1
        - name: DB_POSTGRESDB_PORT
          value: "5432"
        - name: DB_POSTGRESDB_USER
          value: n8n
        - name: DB_POSTGRESDB_PASSWORD
          value: n8n
        - name: GENERIC_TIMEZONE
          value: Asia/Tokyo
        - name: TZ
          value: Asia/Tokyo
        ports:
        - containerPort: 5678
        volumeMounts:
        - name: n8n-data
          mountPath: /home/node/.n8n
      dnsConfig:
        options:
        - name: ndots
          value: "1"
      volumes:
      - name: n8n-data
        persistentVolumeClaim:
          claimName: local-n8n-pvc
      - name: pgdata
        persistentVolumeClaim:
          claimName: local-pg-pvc
EOF

sudo k3s kubectl apply -f ./n8n-pg-deployment.yml

5. サービスの作成
以下のコマンドでサービスを作成します。
cat << EOF > n8n-service.yml
apiVersion: v1
kind: Service
metadata:
  name: n8n-service
spec:
  selector:
    app: n8n-pg
  type: LoadBalancer
  externalIPs:
  - xxx.xxx.xxx.xxx  # 外部からアクセスできるk3sをインストールしたホストのIPを設定します。
  ports:
  - name: http
    protocol: TCP
    port: 8080
    targetPort: 5678
  - name: db
    protocol: TCP
    port: 3306
    targetPort: 3306
EOF

sudo k3s kubectl apply -f ./n8n-service.yml

ブラウザからhttp://<ホスト名またはIP>:8080/ にアクセスしてワークフローを作成します。

2022年4月13日水曜日

k3sで同一ポッド内にMariaDBとMetabaseを配置する

Metabaseはオープンソースのデータ解析・可視化ツールです。k3sで同一ポッド内にMariaDBとMetabaseを配置するには、以下の手順を実行します(metabase公式のイメージはamd64のみです)。

〇Metabaseの画面

実行手順

1. local永続ボリュームで使用するディレクトリの作成
以下のコマンドでlocal永続ボリュームで使用するディレクトリを作成します。
sudo mkdir -p /var/mymariadb

sudo mkdir -p /var/metabase

2. local永続ボリュームの作成
以下のコマンドでlocal永続ボリュームを作成します。
※MariaDBデータ用
cat << EOF > local-mariadb-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-mariadb-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/mymariadb
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているk3sがインストールされているホスト名になります。適宜変更してください。
sudo k3s kubectl apply -f ./local-mariadb-pv.yml

※Metabase用
cat << EOF > local-metabase-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-metabase-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/metabase
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているk3sがインストールされているホスト名になります。適宜変更してください。
sudo k3s kubectl apply -f ./local-metabase-pv.yml

3. 永続ボリューム要求の作成
以下のコマンドで永続ボリューム要求を作成します。
※MariaDBデータ用
cat << EOF > local-mariadb-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-mariadb-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-mariadb-pv
EOF

sudo k3s kubectl apply -f ./local-mariadb-pvc.yml

※Metabase用
cat << EOF > local-metabase-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-metabase-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-metabase-pv
EOF

sudo k3s kubectl apply -f ./local-metabase-pvc.yml

4. MetabaseとMariaDBのDeploymentの作成
以下のコマンドでMetabaseとMariaDBを含むポッドと作成したlocal永続ボリュームを使用するDeploymentを作成します。
cat << EOF > metabase-mariadb-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: metabase-mariadb-deployment
  labels:
    app: metabase-mariadb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: metabase-mariadb
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: metabase-mariadb
    spec:
      containers:
      - name: mymariadb
        image: mariadb:10.7-focal
        args: ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: mymariadb
        - name: MYSQL_DATABASE
          value: metabase
        - name: MYSQL_USER
          value: metabase
        - name: MYSQL_PASSWORD
          value: metabase
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mariadb-data
          mountPath: /var/lib/mysql
      - name: metabase
        image: metabase/metabase
        env:
        - name: MB_DB_FILE
          value: /metabase-data/metabase.db
        - name: MB_DB_TYPE
          value: mysql
        - name: MB_DB_DBNAME
          value: metabase
        - name: MB_DB_PORT
          value: "3306"
        - name: MB_DB_USER
          value: metabase
        - name: MB_DB_PASS
          value: metabase
        - name: MB_DB_HOST
          value: 127.0.0.1
        ports:
        - containerPort: 3000
        volumeMounts:
        - name: metabase-data
          mountPath: /metabase-data
      volumes:
      - name: mariadb-data
        persistentVolumeClaim:
          claimName: local-mariadb-pvc
      - name: metabase-data
        persistentVolumeClaim:
          claimName: local-metabase-pvc
EOF

sudo k3s kubectl apply -f ./metabase-mariadb-deployment.yml

5. サービスの作成
以下のコマンドでサービスを作成します。
cat << EOF > metabase-service.yml
apiVersion: v1
kind: Service
metadata:
  name: metabase-service
spec:
  selector:
    app: metabase-mariadb
  type: LoadBalancer
  externalIPs:
  - xxx.xxx.xxx.xxx  # 外部からアクセスできるk3sをインストールしたホストのIPを設定します。
  ports:
  - name: http
    protocol: TCP
    port: 8080
    targetPort: 3000
  - name: db
    protocol: TCP
    port: 3306
    targetPort: 3306
EOF

sudo k3s kubectl apply -f ./metabase-service.yml

ブラウザからhttp://<ホスト名:8080 にアクセスします。

言語、ユーザアカウント情報を入力して、「3.データを追加する」で以下の様に入力します。
データベースのタイプ: MySQL
名前: mariadb
ホスト: 127.0.0.1
ポート: 3306
データベース名: metabase
ユーザ: metabase
パスワード: metabase

2022年4月12日火曜日

k3sで同一ポッド内にPostgreSQLとMetabaseを配置する

Metabaseはオープンソースのデータ解析・可視化ツールです。k3sで同一ポッド内にPostgreSQLとMetabaseを配置するには、以下の手順を実行します(metabase公式のイメージはamd64のみです)。

〇Metabaseの画面

実行手順

1. local永続ボリュームで使用するディレクトリの作成
以下のコマンドでlocal永続ボリュームで使用するディレクトリを作成します。
sudo mkdir -p /var/pgdata

sudo mkdir -p /var/metabase

2. local永続ボリュームの作成
以下のコマンドでlocal永続ボリュームを作成します。
※PostgreSQLデータ用
cat << EOF > local-pg-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pg-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/pgdata
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているk3sがインストールされているホスト名になります。適宜変更してください。
sudo k3s kubectl apply -f ./local-pg-pv.yml

※Metabase用
cat << EOF > local-metabase-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-metabase-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/metabase
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているk3sがインストールされているホスト名になります。適宜変更してください。
sudo k3s kubectl apply -f ./local-metabase-pv.yml

3. 永続ボリューム要求の作成
以下のコマンドで永続ボリューム要求を作成します。
※PostgreSQL用
cat << EOF > local-pg-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-pg-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-pg-pv
EOF

sudo k3s kubectl apply -f ./local-pg-pvc.yml

※Metabase用
cat << EOF > local-metabase-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-metabase-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-metabase-pv
EOF

sudo k3s kubectl apply -f ./local-metabase-pvc.yml

4. MetabaseとPostgrelSQLのDeploymentの作成
以下のコマンドでMetabaseとPostgreSQLを含むポッドと作成したlocal永続ボリュームを使用するDeploymentを作成します。
cat << EOF > metabase-pg-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: metabase-pg-deployment
  labels:
    app: metabase-pg
spec:
  replicas: 1
  selector:
    matchLabels:
      app: metabase-pg
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: metabase-pg
    spec:
      containers:
      - name: mypg
        image: postgres:14-alpine
        env:
        - name: POSTGRES_DB
          value: metabase
        - name: POSTGRES_PASSWORD
          value: mypostgres
        ports:
        - containerPort: 5432
        volumeMounts:
        - name: pgdata
          mountPath: /var/lib/postgresql/data
      - name: metabase
        image: metabase/metabase
        env:
        - name: MB_DB_FILE
          value: /metabase-data/metabase.db
        - name: MB_DB_TYPE
          value: postgres
        - name: MB_DB_DBNAME
          value: metabase
        - name: MB_DB_PORT
          value: "5432"
        - name: MB_DB_USER
          value: postgres
        - name: MB_DB_PASS
          value: mypostgres
        - name: MB_DB_HOST
          value: 127.0.0.1
        ports:
        - containerPort: 3000
        volumeMounts:
        - name: metabase-data
          mountPath: /metabase-data
      volumes:
      - name: pgdata
        persistentVolumeClaim:
          claimName: local-pg-pvc
      - name: metabase-data
        persistentVolumeClaim:
          claimName: local-metabase-pvc
EOF

sudo k3s kubectl apply -f ./metabase-pg-deployment.yml

5. サービスの作成
以下のコマンドでサービスを作成します。
cat << EOF > metabase-service.yml
apiVersion: v1
kind: Service
metadata:
  name: metabase-service
spec:
  selector:
    app: metabase-pg
  type: LoadBalancer
  externalIPs:
  - xxx.xxx.xxx.xxx  # 外部からアクセスできるk3sをインストールしたホストのIPを設定します。
  ports:
  - name: http
    protocol: TCP
    port: 8080
    targetPort: 3000
  - name: db
    protocol: TCP
    port: 5432
    targetPort: 5432
EOF

sudo k3s kubectl apply -f ./metabase-service.yml

ブラウザからhttp://<ホスト名:8080 にアクセスします。

言語、ユーザアカウント情報を入力して、「3.データを追加する」で以下の様に入力します。
データベースのタイプ: PostgreSQL
名前: pg
ホスト: 127.0.0.1
ポート: 5432
データベース名: metabase
ユーザ: postgres
パスワード: mypostgres

2022年4月11日月曜日

k3sで同一ポッド内にPostgreSQLとKanboardを配置する(local永続ボリューム使用)

Kanboardはタスク管理をおこなうPHP製のソフトウェアです。k3sで同一ポッド内にPostgreSQLとKanboardを配置するには、以下の手順を実行します。PostgreSQLとKanboardのデータはlocal永続ボリュームに保存します。

実行手順

1. KanboardとPostgreSQLデータ格納用ディレクトリを作成
以下のコマンドでPostgreSQLデータ格納用ディレクトリを作成します。
sudo mkdir -p /var/pgdata

sudo mkdir -p /var/kanboard_data

sudo mkdir -p /var/kanboard_plugins

sudo mkdir -p /var/kanboard_ssl

2. local永続ボリュームの作成
以下のコマンドでlocal永続ボリュームを作成します。
※PostgreSQLデータ用
cat << EOF > local-pg-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pg-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/pgdata
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているk3sがインストールされているホスト名になります。適宜変更してください。
sudo k3s kubectl apply -f ./local-pg-pv.yml

※Kanboardデータ用
cat << EOF > local-kanboard-data-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-kanboard-data-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/kanboard_data
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているk3sがインストールされているホスト名になります。適宜変更してください。
sudo k3s kubectl apply -f ./local-kanboard-data-pv.yml

※Kanboardプラグイン用
cat << EOF > local-kanboard-plugins-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-kanboard-plugins-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/kanboard_data
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているk3sがインストールされているホスト名になります。適宜変更してください。
sudo k3s kubectl apply -f ./local-kanboard-plugins-pv.yml

※KanboardのSSL用
cat << EOF > local-kanboard-ssl-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-kanboard-ssl-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/kanboard_ssl
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているk3sがインストールされているホスト名になります。適宜変更してください。
sudo k3s kubectl apply -f ./local-kanboard-ssl-pv.yml

3. 永続ボリューム要求の作成
以下のコマンドで永続ボリューム要求を作成します。
※PostgreSQLデータ用
cat << EOF > local-pg-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-pg-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-pg-pv
EOF

sudo k3s kubectl apply -f ./local-pg-pvc.yml

※Kanboardデータ用
cat << EOF > local-kanboard-data-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-kanboard-data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-kanboard-data-pv
EOF

sudo k3s kubectl apply -f ./local-kanboard-data-pvc.yml

※Kanboardプラグイン用
cat << EOF > local-kanboard-plugins-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-kanboard-plugins-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-kanboard-plugins-pv
EOF

sudo k3s kubectl apply -f ./local-kanboard-plugins-pvc.yml

※KanboardのSSL用
cat << EOF > local-kanboard-ssl-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-kanboard-ssl-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-kanboard-ssl-pv
EOF

sudo k3s kubectl apply -f ./local-kanboard-ssl-pvc.yml

4. KanboardとPostgreSQLのDeploymentの作成
以下のコマンドでkanboardとpostgresqlを含むポッドと作成したlocal永続ボリュームを使用するDeploymentを作成します。
cat << EOF > kanboard-pg-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kanboard-pg-deployment
  labels:
    app: kanboard-pg
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kanboard-pg
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: kanboard-pg
    spec:
      containers:
      - name: mypg
        image: postgres:14-alpine
        env:
        - name: POSTGRES_DB
          value: kanboard
        - name: POSTGRES_USER
          value: kanboard
        - name: POSTGRES_PASSWORD
          value: kanboard
        ports:
        - containerPort: 5432
        volumeMounts:
        - name: pg-data
          mountPath: /var/lib/postgresql/data
      - name: kanboard
        image: kanboard/kanboard:latest
        env:
        - name: DATABASE_URL
          value: postgres://kanboard:kanboard@127.0.0.1:5432/kanboard
        ports:
        - containerPort: 80
          name: http
        - containerPort: 443
          name: https
        volumeMounts:
        - name: kanboard-data
          mountPath: /var/www/app/data
        - name: kanboard-plugins
          mountPath: /var/www/app/plugins
        - name: kanboard-ssl
          mountPath: /etc/nginx/ssl
      volumes:
      - name: pg-data
        persistentVolumeClaim:
          claimName: local-pg-pvc
      - name: kanboard-data
        persistentVolumeClaim:
          claimName: local-kanboard-data-pvc
      - name: kanboard-plugins
        persistentVolumeClaim:
          claimName: local-kanboard-plugins-pvc
      - name: kanboard-ssl
        persistentVolumeClaim:
          claimName: local-kanboard-ssl-pvc
EOF

sudo k3s kubectl apply -f ./kanboard-pg-deployment.yml

5. KanboardとPostgreSQLのサービスの作成
以下のコマンドでサービスを作成します。
cat << EOF > kanboard-pg-service.yml
apiVersion: v1
kind: Service
metadata:
  name: kanboard-pg-service
spec:
  selector:
    app: kanboard-pg
  type: LoadBalancer
  externalIPs:
  - xxx.xxx.xxx.xxx # 外部からアクセスできるk3sをインストールしたホストのIPを設定します。
  ports:
  - name: http
    protocol: TCP
    port: 8080
    targetPort: 80
  - name: https
    protocol: TCP
    port: 443
    targetPort: 8443
  - name: db
    protocol: TCP
    port: 3306
    targetPort: 3306
EOF

sudo k3s kubectl apply -f ./kanboard-pg-service.yml

ブラウザから以下のURLからKanboardにアクセスします。
http://<k3sをインストールしたホストのIP>:8080/
初期ログインはユーザadmin、パスワードadminでログインしてください。

関連情報

・Kanboardの設定・操作方法については「Kanboardの設定・操作」を参照してください。

・Python API Client for Kanboardのついてのまとめは「Python API Client for KanboardでKanboardをコントロールする」を参照してください。

・Kanboardに関する他の情報はこちらを参照してください。

・Kanboardのgithubリポジトリ
https://github.com/kanboard/kanboard

2022年4月10日日曜日

Microk8sでPyMySQLとipython-sqlをインストールしたJupyterLabをデプロイする

Microk8sでPyMySQLとipython-sqlをインストールしたJupyterLabをデプロイするには、以下の手順を実行します。データはlocal永続ボリュームに保存します。

実行手順

1. local永続ボリュームで使用するディレクトリの作成
以下のコマンドでlocal永続ボリュームで使用するディレクトリを作成します。
sudo mkdir -p /var/nb_jovyan
sudo mkdir -p /var/start-notebook.d

sudo chown 1000:100 /var/nb_jovyan

cat << EOF | sudo tee /var/start-notebook.d/install_packages.sh
conda install -c anaconda pymysql -y
conda install -c conda-forge ipython-sql -y
EOF
sudo chmod +x /var/start-notebook.d/install_packages.sh

2. local永続ボリュームの作成
以下のコマンドでlocal永続ボリュームを作成します。
※jovyan用の永続ボリューム
cat << EOF > local-jovyan-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-jovyan-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/nb_jovyan
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているMicrok8sがインストールされているホスト名になります。適宜変更してください。
microk8s kubectl apply -f ./local-jovyan-pv.yml

※スタートアップスクリプト用の永続ボリューム
cat << EOF > local-startnb-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-startnb-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/start-notebook.d
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているMicrok8sがインストールされているホスト名になります。適宜変更してください。
microk8s kubectl apply -f ./local-startnb-pv.yml

3. 永続ボリューム要求の作成
以下のコマンドで永続ボリューム要求を作成します。
※jovyan用の永続ボリューム
cat << EOF > local-jovyan-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-jovyan-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-jovyan-pv
EOF

microk8s kubectl apply -f ./local-jovyan-pvc.yml

※スタートアップスクリプト用の永続ボリューム要求
cat << EOF > local-startnb-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-startnb-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-startnb-pv
EOF

microk8s kubectl apply -f ./local-startnb-pvc.yml

4. Deploymentの作成
以下のコマンドでjupyterのイメージと作成したlocal永続ボリュームを使用するDeploymentを作成します。
cat << EOF > jupyter-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jupyter-deployment
  labels:
    app: jupyter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jupyter
  template:
    metadata:
      labels:
        app: jupyter
    spec:
      containers:
      - name: jupyter
        image: jupyter/scipy-notebook:latest
        ports:
        - containerPort: 8888
        env:
        - name: JUPYTER_TOKEN
          value: "jupyter"
        - name: DOCKER_STACKS_JUPYTER_CMD
          value: "lab"
        volumeMounts:
        - name: nb-jovyan
          mountPath: /home/jovyan/work
        - name: startnb
          mountPath: /usr/local/bin/start-notebook.d
      volumes:
      - name: nb-jovyan
        persistentVolumeClaim:
          claimName: local-jovyan-pvc
      - name: startnb
        persistentVolumeClaim:
          claimName: local-startnb-pvc
EOF

microk8s kubectl apply -f ./jupyter-deployment.yml

5. サービスの作成
以下のコマンドでサービスを作成します。
cat << EOF > jupyter-service.yml
apiVersion: v1
kind: Service
metadata:
  name: jupyter-service
spec:
  selector:
    app: jupyter
  type: LoadBalancer
  externalIPs:
  - xxx.xxx.xxx.xxx # 外部からアクセスできるMicrok8sをインストールしたホストのIPを設定します。
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8888
EOF

microk8s kubectl apply -f ./jupyter-service.yml

6. 動作確認
ブラウザからhttp://<ホスト名:8080/?token=jupyter にアクセスします。
ipython-sqlをインストールしているのでSQLマジックセルでSQLを実行できるか確認します。
以下のusername, password, dbhost, dbnameを書き換えて、MariaDBデータベースに接続/実行確認します。
%load_ext sql
dsl = 'mysql+pymysql://username:password@dbhost:3306/dbname'
%sql $dsl
%%sql
select version();

2022年4月9日土曜日

k3sで同一ポッド内にGhostとMySQLを配置する

Ghostはブログプラットフォームです。k3sで同一ポッド内にGhostとMySQLを配置するには、以下の手順を実行します(official mysqlイメージにはarm 32bit版は無いようです)。

実行手順

1. local永続ボリュームで使用するディレクトリの作成
以下のコマンドでlocal永続ボリュームで使用するディレクトリを作成します。
sudo mkdir -p /var/mysql-data

sudo mkdir -p /var/ghost-data

2. local永続ボリュームの作成
以下のコマンドでlocal永続ボリュームを作成します。
※MySQLデータ用
cat << EOF > local-mysql-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-mysql-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/mysql-data
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているk3sがインストールされているホスト名になります。適宜変更してください。
sudo k3s kubectl apply -f ./local-mysql-pv.yml

※Ghost用
cat << EOF > local-ghost-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-ghost-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/ghost-data
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているk3sがインストールされているホスト名になります。適宜変更してください。
sudo k3s kubectl apply -f ./local-ghost-pv.yml

3. 永続ボリューム要求の作成
以下のコマンドで永続ボリューム要求を作成します。
※MySQLデータ用
cat << EOF > local-mysql-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-mysql-pv
EOF

sudo k3s kubectl apply -f ./local-mysql-pvc.yml

※Ghost用
cat << EOF > local-ghost-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-ghost-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-ghost-pv
EOF

sudo k3s kubectl apply -f ./local-ghost-pvc.yml

4. GhostとMySQLのDeploymentの作成
以下のコマンドでGhostとMySQLを含むポッドと作成したlocal永続ボリュームを使用するDeploymentを作成します。
cat << EOF > ghost-mysql-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ghost-mysql-deployment
  labels:
    app: ghost-mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ghost-mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: ghost-mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: ghost
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
      - name: ghost
        image: ghost:4-alpine
        env:
        - name: url
          value: http://xxx.xxx.xxx.xxx:8080 # ここは外部からアクセスできるk3sをインストールしたホスト名・IPに変更します
        - name: database__client
          value: mysql
        - name: database__connection__host
          value: 127.0.0.1
        - name: database__connection__user
          value: root
        - name: database__connection__password
          value: ghost
        - name: database__connection__database
          value: ghost
        ports:
        - containerPort: 2368
        volumeMounts:
        - name: ghost-data
          mountPath: /var/lib/ghost/content
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: local-mysql-pvc
      - name: ghost-data
        persistentVolumeClaim:
          claimName: local-ghost-pvc
EOF

sudo k3s kubectl apply -f ./ghost-mysql-deployment.yml

5. サービスの作成
以下のコマンドでサービスを作成します。
cat << EOF > ghost-service.yml
apiVersion: v1
kind: Service
metadata:
  name: ghost-service
spec:
  selector:
    app: ghost-mysql
  type: LoadBalancer
  externalIPs:
  - xxx.xxx.xxx.xxx  # 外部からアクセスできるk3sをインストールしたホストのIPを設定します。
  ports:
  - name: http
    protocol: TCP
    port: 8080
    targetPort: 2368
  - name: db
    protocol: TCP
    port: 3306
    targetPort: 3306
EOF

sudo k3s kubectl apply -f ./ghost-service.yml

ブラウザからhttp://<ホスト名またはIP:8080>/ghost/ にアクセスしてユーザ登録などを行います。