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をデプロイする

0 件のコメント:

コメントを投稿