From 6fa47ea1c3abdf3c1f4922113854109e79273ccf Mon Sep 17 00:00:00 2001 From: showjason Date: Thu, 17 Feb 2022 13:26:18 +0800 Subject: [PATCH] comment version requirement for example statefulset --- examples/rollout-daemonset.py | 112 +++++++++++++++++++++++++ examples/rollout-statefulset.py | 142 ++++++++++++++++++++++++++++++++ 2 files changed, 254 insertions(+) create mode 100644 examples/rollout-daemonset.py create mode 100644 examples/rollout-statefulset.py diff --git a/examples/rollout-daemonset.py b/examples/rollout-daemonset.py new file mode 100644 index 000000000..b337d0c88 --- /dev/null +++ b/examples/rollout-daemonset.py @@ -0,0 +1,112 @@ +""" +This example covers the following: + - Create daemonset + - Update daemonset + - List contoller revisions which belong to specified daemonset + - Roll out daemonset +""" + + +from kubernetes import client, config + + +def create_daemon_set_object(): + container = client.V1Container( + name="ds-redis", + image="redis", + image_pull_policy="IfNotPresent", + ports=[client.V1ContainerPort(container_port=6379)], + ) + # Template + template = client.V1PodTemplateSpec( + metadata=client.V1ObjectMeta(labels={"app": "redis"}), + spec=client.V1PodSpec(containers=[container])) + # Spec + spec = client.V1DaemonSetSpec( + selector=client.V1LabelSelector( + match_labels={"app": "redis"} + ), + template=template) + # DaemonSet + daemonset = client.V1DaemonSet( + api_version="apps/v1", + kind="DaemonSet", + metadata=client.V1ObjectMeta(name="daemonset-redis"), + spec=spec) + + return daemonset + + +def create_daemon_set(apps_v1_api, daemon_set_object): + # Create the Daemonset in default namespace + # You can replace the namespace with you have created + apps_v1_api.create_namespaced_daemon_set( + namespace="default", body=daemon_set_object + ) + + +def update_daemon_set(apps_v1_api, daemonset): + # Update container image + daemonset.spec.template.spec.containers[0].image = "redis:6.2" + daemonset_name = daemonset.metadata.name + # Patch the daemonset + apps_v1_api.patch_namespaced_daemon_set( + name=daemonset_name, namespace="default", body=daemonset + ) + + +def list_controller_revision(apps_v1_api, namespace, daemon_set_name): + # Get all controller revisions in specified namespace + controller_revision_list = apps_v1_api.list_namespaced_controller_revision( + namespace) + # Get all controller revisions which belong to specified daemonset. + controller_revision_belong_to_ds = [] + for controller_revision in controller_revision_list.items: + owner_kind = controller_revision.metadata.owner_references[0].kind + owner_name = controller_revision.metadata.owner_references[0].name + if owner_kind == "DaemonSet" and owner_name == daemon_set_name: + controller_revision_belong_to_ds.append( + (controller_revision.metadata.name, controller_revision.revision)) + return sorted(controller_revision_belong_to_ds, key=lambda x: x[1]) + + +def rollout_namespaced_daemon_set( + apps_v1_api, + name, + namespace, + controller_revision_name): + + # Get the specified controller revision object + _controller_revision = apps_v1_api.read_namespaced_controller_revision( + controller_revision_name, namespace) + # Roll out daemonset to the specified revision + apps_v1_api.patch_namespaced_daemon_set( + name, namespace, body=_controller_revision.data) + + +def main(): + # Loading the local kubeconfig + config.load_kube_config() + apps_v1_api = client.AppsV1Api() + core_v1_api = client.CoreV1Api() + daemon_set_obj = create_daemon_set_object() + + create_daemon_set(apps_v1_api, daemon_set_obj) + + update_daemon_set(apps_v1_api, daemon_set_obj) + + # Wait for finishing creation of controller revision + import time + time.sleep(15) + # List the controller revison + controller_revisions = list_controller_revision( + apps_v1_api, "default", "daemonset-redis") + rollout_namespaced_daemon_set( + apps_v1_api, + "daemonset-redis", + "default", + controller_revisions[0][0]) + + +if __name__ == "__main__": + main() diff --git a/examples/rollout-statefulset.py b/examples/rollout-statefulset.py new file mode 100644 index 000000000..86f91c726 --- /dev/null +++ b/examples/rollout-statefulset.py @@ -0,0 +1,142 @@ +""" +This example covers the following: + - Create headless server + - Create statefulset + - Update statefulset + - List contoller revisions which belong to specified statefulset + - Roll out statefulset +Note: + If your kubernetes version is lower than 1.22(exclude 1.22), the kubernetes-client version must be lower than 1.22(alse exclude 1.22). + Because new feature 'AvailableReplicas' for StatefulSetStatus is supported in native kubernetes since version 1.22, mismatch version between kubernetes and kubernetes-client will raise execption ValueError +""" + + +from kubernetes import client, config + + +def create_service(core_v1_api): + body = client.V1Service( + api_version="v1", + kind="Service", + metadata=client.V1ObjectMeta( + name="redis-test-svc" + ), + spec=client.V1ServiceSpec( + selector={"app": "redis"}, + cluster_ip="None", + type="ClusterIP", + ports=[client.V1ServicePort( + port=6379, + target_port=6379 + )] + ) + ) + # Create the service in specified namespace + # (Can replace "default" with a namespace you may have created) + core_v1_api.create_namespaced_service(namespace="default", body=body) + + +def create_stateful_set_object(): + container = client.V1Container( + name="sts-redis", + image="redis", + image_pull_policy="IfNotPresent", + ports=[client.V1ContainerPort(container_port=6379)], + ) + # Template + template = client.V1PodTemplateSpec( + metadata=client.V1ObjectMeta(labels={"app": "redis"}), + spec=client.V1PodSpec(containers=[container])) + # Spec + spec = client.V1StatefulSetSpec( + replicas=1, + service_name="redis-test-svc", + selector=client.V1LabelSelector( + match_labels={"app": "redis"} + ), + template=template) + # StatefulSet + statefulset = client.V1StatefulSet( + api_version="apps/v1", + kind="StatefulSet", + metadata=client.V1ObjectMeta(name="statefulset-redis"), + spec=spec) + + return statefulset + + +def create_stateful_set(apps_v1_api, stateful_set_object): + # Create the Statefulset in default namespace + # You can replace the namespace with you have created + apps_v1_api.create_namespaced_stateful_set( + namespace="default", body=stateful_set_object + ) + + +def update_stateful_set(apps_v1_api, statefulset): + # Update container image + statefulset.spec.template.spec.containers[0].image = "redis:6.2" + statefulset_name = statefulset.metadata.name + # Patch the statefulset + apps_v1_api.patch_namespaced_stateful_set( + name=statefulset_name, namespace="default", body=statefulset + ) + + +def list_controller_revision(apps_v1_api, namespace, stateful_set_name): + # Get all controller revisions in specified namespace + controller_revision_list = apps_v1_api.list_namespaced_controller_revision( + namespace) + # Get all controller revisions which belong to specified statefulset. + controller_revision_belong_to_sts = [] + for controller_revision in controller_revision_list.items: + owner_kind = controller_revision.metadata.owner_references[0].kind + owner_name = controller_revision.metadata.owner_references[0].name + if owner_kind == "StatefulSet" and owner_name == stateful_set_name: + controller_revision_belong_to_sts.append( + (controller_revision.metadata.name, controller_revision.revision)) + return sorted(controller_revision_belong_to_sts, key=lambda x: x[1]) + + +def rollout_namespaced_stateful_set( + apps_v1_api, + name, + namespace, + controller_revision_name): + + # Get the specified controller revision object + _controller_revision = apps_v1_api.read_namespaced_controller_revision( + controller_revision_name, namespace) + # Roll out statefulset to the specified revision + apps_v1_api.patch_namespaced_stateful_set( + name, namespace, body=_controller_revision.data) + + +def main(): + # Loading the local kubeconfig + config.load_kube_config() + apps_v1_api = client.AppsV1Api() + core_v1_api = client.CoreV1Api() + stateful_set_obj = create_stateful_set_object() + + create_service(core_v1_api) + + create_stateful_set(apps_v1_api, stateful_set_obj) + + update_stateful_set(apps_v1_api, stateful_set_obj) + + # Wait for finishing creation of controller revision + import time + time.sleep(15) + # List the controller revison + controller_revisions = list_controller_revision( + apps_v1_api, "default", "statefulset-redis") + rollout_namespaced_stateful_set( + apps_v1_api, + "statefulset-redis", + "default", + controller_revisions[0][0]) + + +if __name__ == "__main__": + main()