# Copyright 2016 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ The example covers the following: - Creation of a deployment using AppsV1Api - update/patch to perform rolling restart on the deployment - deletetion of the deployment """ import datetime import pytz from kubernetes import client, config DEPLOYMENT_NAME = "nginx-deployment" def create_deployment_object(): # Configureate Pod template container container = client.V1Container( name="nginx", image="nginx:1.15.4", ports=[client.V1ContainerPort(container_port=80)], resources=client.V1ResourceRequirements( requests={"cpu": "100m", "memory": "200Mi"}, limits={"cpu": "500m", "memory": "500Mi"}, ), ) # Create and configure a spec section template = client.V1PodTemplateSpec( metadata=client.V1ObjectMeta(labels={"app": "nginx"}), spec=client.V1PodSpec(containers=[container]), ) # Create the specification of deployment spec = client.V1DeploymentSpec( replicas=3, template=template, selector={ "matchLabels": {"app": "nginx"}}) # Instantiate the deployment object deployment = client.V1Deployment( api_version="apps/v1", kind="Deployment", metadata=client.V1ObjectMeta(name=DEPLOYMENT_NAME), spec=spec, ) return deployment def create_deployment(api, deployment): # Create deployment resp = api.create_namespaced_deployment( body=deployment, namespace="default" ) print("\n[INFO] deployment `nginx-deployment` created.\n") print("%s\t%s\t\t\t%s\t%s" % ("NAMESPACE", "NAME", "REVISION", "IMAGE")) print( "%s\t\t%s\t%s\t\t%s\n" % ( resp.metadata.namespace, resp.metadata.name, resp.metadata.generation, resp.spec.template.spec.containers[0].image, ) ) def update_deployment(api, deployment): # Update container image deployment.spec.template.spec.containers[0].image = "nginx:1.16.0" # patch the deployment resp = api.patch_namespaced_deployment( name=DEPLOYMENT_NAME, namespace="default", body=deployment ) print("\n[INFO] deployment's container image updated.\n") print("%s\t%s\t\t\t%s\t%s" % ("NAMESPACE", "NAME", "REVISION", "IMAGE")) print( "%s\t\t%s\t%s\t\t%s\n" % ( resp.metadata.namespace, resp.metadata.name, resp.metadata.generation, resp.spec.template.spec.containers[0].image, ) ) def restart_deployment(api, deployment): # update `spec.template.metadata` section # to add `kubectl.kubernetes.io/restartedAt` annotation deployment.spec.template.metadata.annotations = { "kubectl.kubernetes.io/restartedAt": datetime.datetime.now(tz=pytz.UTC) .isoformat() } # patch the deployment resp = api.patch_namespaced_deployment( name=DEPLOYMENT_NAME, namespace="default", body=deployment ) print("\n[INFO] deployment `nginx-deployment` restarted.\n") print("%s\t\t\t%s\t%s" % ("NAME", "REVISION", "RESTARTED-AT")) print( "%s\t%s\t\t%s\n" % ( resp.metadata.name, resp.metadata.generation, resp.spec.template.metadata.annotations, ) ) def delete_deployment(api): # Delete deployment resp = api.delete_namespaced_deployment( name=DEPLOYMENT_NAME, namespace="default", body=client.V1DeleteOptions( propagation_policy="Foreground", grace_period_seconds=5 ), ) print("\n[INFO] deployment `nginx-deployment` deleted.") def main(): # Configs can be set in Configuration class directly or using helper # utility. If no argument provided, the config will be loaded from # default location. config.load_kube_config() apps_v1 = client.AppsV1Api() # Uncomment the following lines to enable debug logging # c = client.Configuration() # c.debug = True # apps_v1 = client.AppsV1Api(api_client=client.ApiClient(configuration=c)) # Create a deployment object with client-python API. The deployment we # created is same as the `nginx-deployment.yaml` in the /examples folder. deployment = create_deployment_object() create_deployment(apps_v1, deployment) update_deployment(apps_v1, deployment) restart_deployment(apps_v1, deployment) delete_deployment(apps_v1) if __name__ == "__main__": main()