1
16
17
18 package main
19
20 import (
21 "bufio"
22 "context"
23 "flag"
24 "fmt"
25 "os"
26 "path/filepath"
27
28 appsv1 "k8s.io/api/apps/v1"
29 apiv1 "k8s.io/api/core/v1"
30 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
31 "k8s.io/client-go/kubernetes"
32 "k8s.io/client-go/tools/clientcmd"
33 "k8s.io/client-go/util/homedir"
34 "k8s.io/client-go/util/retry"
35
36
37
38
39
40
41
42
43 )
44
45 func main() {
46 var kubeconfig *string
47 if home := homedir.HomeDir(); home != "" {
48 kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
49 } else {
50 kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
51 }
52 flag.Parse()
53
54 config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
55 if err != nil {
56 panic(err)
57 }
58 clientset, err := kubernetes.NewForConfig(config)
59 if err != nil {
60 panic(err)
61 }
62
63 deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault)
64
65 deployment := &appsv1.Deployment{
66 ObjectMeta: metav1.ObjectMeta{
67 Name: "demo-deployment",
68 },
69 Spec: appsv1.DeploymentSpec{
70 Replicas: int32Ptr(2),
71 Selector: &metav1.LabelSelector{
72 MatchLabels: map[string]string{
73 "app": "demo",
74 },
75 },
76 Template: apiv1.PodTemplateSpec{
77 ObjectMeta: metav1.ObjectMeta{
78 Labels: map[string]string{
79 "app": "demo",
80 },
81 },
82 Spec: apiv1.PodSpec{
83 Containers: []apiv1.Container{
84 {
85 Name: "web",
86 Image: "nginx:1.12",
87 Ports: []apiv1.ContainerPort{
88 {
89 Name: "http",
90 Protocol: apiv1.ProtocolTCP,
91 ContainerPort: 80,
92 },
93 },
94 },
95 },
96 },
97 },
98 },
99 }
100
101
102 fmt.Println("Creating deployment...")
103 result, err := deploymentsClient.Create(context.TODO(), deployment, metav1.CreateOptions{})
104 if err != nil {
105 panic(err)
106 }
107 fmt.Printf("Created deployment %q.\n", result.GetObjectMeta().GetName())
108
109
110 prompt()
111 fmt.Println("Updating deployment...")
112
113
114
115
116
117
118
119
120
121
122
123
124
125 retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error {
126
127
128 result, getErr := deploymentsClient.Get(context.TODO(), "demo-deployment", metav1.GetOptions{})
129 if getErr != nil {
130 panic(fmt.Errorf("Failed to get latest version of Deployment: %v", getErr))
131 }
132
133 result.Spec.Replicas = int32Ptr(1)
134 result.Spec.Template.Spec.Containers[0].Image = "nginx:1.13"
135 _, updateErr := deploymentsClient.Update(context.TODO(), result, metav1.UpdateOptions{})
136 return updateErr
137 })
138 if retryErr != nil {
139 panic(fmt.Errorf("Update failed: %v", retryErr))
140 }
141 fmt.Println("Updated deployment...")
142
143
144 prompt()
145 fmt.Printf("Listing deployments in namespace %q:\n", apiv1.NamespaceDefault)
146 list, err := deploymentsClient.List(context.TODO(), metav1.ListOptions{})
147 if err != nil {
148 panic(err)
149 }
150 for _, d := range list.Items {
151 fmt.Printf(" * %s (%d replicas)\n", d.Name, *d.Spec.Replicas)
152 }
153
154
155 prompt()
156 fmt.Println("Deleting deployment...")
157 deletePolicy := metav1.DeletePropagationForeground
158 if err := deploymentsClient.Delete(context.TODO(), "demo-deployment", metav1.DeleteOptions{
159 PropagationPolicy: &deletePolicy,
160 }); err != nil {
161 panic(err)
162 }
163 fmt.Println("Deleted deployment.")
164 }
165
166 func prompt() {
167 fmt.Printf("-> Press Return key to continue.")
168 scanner := bufio.NewScanner(os.Stdin)
169 for scanner.Scan() {
170 break
171 }
172 if err := scanner.Err(); err != nil {
173 panic(err)
174 }
175 fmt.Println()
176 }
177
178 func int32Ptr(i int32) *int32 { return &i }
179
View as plain text