@@ -53,6 +53,7 @@ DeltaFIFO Watch apiserver 过程中可能因网络等问题出现丢事件的
53
53
54
54
创建 AolPod 的语句:
55
55
56
+ ``` go
56
57
func newAolPod (pod *coreV1 .Pod ) *aolV1alpha1 .AolPod {
57
58
labels := pod.ObjectMeta .Labels
58
59
labels[" controller" ] = pod.ObjectMeta .Name
@@ -76,22 +77,26 @@ func newAolPod(pod *coreV1.Pod) *aolV1alpha1.AolPod {
76
77
Status: pod.Status ,
77
78
}
78
79
}
80
+ ```
79
81
80
82
后续创建:
81
83
82
- aolPod, err := c.aolPodLister.AolPods(pod.ObjectMeta.Namespace).Get(podName)
83
- if errors.IsNotFound(err) {
84
- aolPod, err = c.aolclientset.AolV1alpha1().AolPods(pod.ObjectMeta.Namespace).Create(newAolPod(pod))
85
- }
86
- if err != nil {
87
- fmt.Printf("---> create failed: %#v\n", newAolPod(pod))
88
- return err
89
- }
90
-
84
+ ``` go
85
+ aolPod , err := c.aolPodLister .AolPods (pod.ObjectMeta .Namespace ).Get (podName)
86
+ if errors.IsNotFound (err) {
87
+ aolPod, err = c.aolclientset .AolV1alpha1 ().AolPods (pod.ObjectMeta .Namespace ).Create (newAolPod (pod))
88
+ }
89
+ if err != nil {
90
+ fmt.Printf (" ---> create failed: %#v \n " , newAolPod (pod))
91
+ return err
92
+ }
93
+ ```
91
94
失败日志:
92
95
96
+ ``` txt
93
97
---> create failed: &v1alpha1.AolPod{TypeMeta:v1.TypeMeta{Kind:"", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"my-aol-deploy-7996d57dfd-lqmtp", GenerateName:"", Namespace:"default", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string{"controller":"my-aol-deploy-7996d57dfd-lqmtp", "deploy.aol.4pd.io":"my-aol-deploy", "pod-template-hash":"3552813898", "run":"my-aol-nginx", "pod.aol.4pd.io":"my-aol-deploy-7996d57dfd-lqmtp", "aol.4pd.io":"true"}, Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference{v1.OwnerReference{APIVersion:"aol.4pd.io/v1alpha1", Kind:"Pod", Name:"my-aol-deploy-7996d57dfd-lqmtp", UID:"39242763-350f-11e9-b4fd-0cc47a2a835a", Controller:(*bool)(0xc000c1be49), BlockOwnerDeletion:(*bool)(0xc000c1be48)}}, Initializers:(*v1.Initializers)(nil), Finalizers:[]string(nil), ClusterName:"", ManagedFields:[]v1.ManagedFieldsEntry(nil)}, Spec:v1.PodSpec{Volumes:[]v1.Volume{v1.Volume{Name:"aol-deploy-configmap", VolumeSource:v1.VolumeSource{HostPath:(*v1.HostPathVolumeSource)(nil), EmptyDir:(*v1.EmptyDirVolumeSource)(nil), GCEPersistentDisk:(*v1.GCEPersistentDiskVolumeSource)(nil), AWSElasticBlockStore:(*v1.AWSElasticBlockStoreVolumeSource)(nil), GitRepo:(*v1.GitRepoVolumeSource)(nil), Secret:(*v1.SecretVolumeSource)(nil), NFS:(*v1.NFSVolumeSource)(nil), ISCSI:(*v1.ISCSIVolumeSource)(nil), Glusterfs:(*v1.GlusterfsVolumeSource)(nil), PersistentVolumeClaim:(*v1.PersistentVolumeClaimVolumeSource)(nil), RBD:(*v1.RBDVolumeSource)(nil), FlexVolume:(*v1.FlexVolumeSource)(nil), Cinder:(*v1.CinderVolumeSource)(nil), CephFS:(*v1.CephFSVolumeSource)(nil), Flocker:(*v1.FlockerVolumeSource)(nil), DownwardAPI:(*v1.DownwardAPIVolumeSource)(nil), FC:(*v1.FCVolumeSource)(nil), AzureFile:(*v1.AzureFileVolumeSource)(nil), ConfigMap:(*v1.ConfigMapVolumeSource)(0xc0006168c0), VsphereVolume:(*v1.VsphereVirtualDiskVolumeSource)(nil), Quobyte:(*v1.QuobyteVolumeSource)(nil), AzureDisk:(*v1.AzureDiskVolumeSource)(nil), PhotonPersistentDisk:(*v1.PhotonPersistentDiskVolumeSource)(nil), Projected:(*v1.ProjectedVolumeSource)(nil), PortworxVolume:(*v1.PortworxVolumeSource)(nil), ScaleIO:(*v1.ScaleIOVolumeSource)(nil), StorageOS:(*v1.StorageOSVolumeSource)(nil)}}, v1.Volume{Name:"aol-deploy-secret", VolumeSource:v1.VolumeSource{HostPath:(*v1.HostPathVolumeSource)(nil), EmptyDir:(*v1.EmptyDirVolumeSource)(nil), GCEPersistentDisk:(*v1.GCEPersistentDiskVolumeSource)(nil), AWSElasticBlockStore:(*v1.AWSElasticBlockStoreVolumeSource)(nil), GitRepo:(*v1.GitRepoVolumeSource)(nil), Secret:(*v1.SecretVolumeSource)(0xc000616980), NFS:(*v1.NFSVolumeSource)(nil), ISCSI:(*v1.ISCSIVolumeSource)(nil), Glusterfs:(*v1.GlusterfsVolumeSource)(nil), PersistentVolumeClaim:(*v1.PersistentVolumeClaimVolumeSource)(nil), RBD:(*v1.RBDVolumeSource)(nil), FlexVolume:(*v1.FlexVolumeSource)(nil), Cinder:(*v1.CinderVolumeSource)(nil), CephFS:(*v1.CephFSVolumeSource)(nil), Flocker:(*v1.FlockerVolumeSource)(nil), DownwardAPI:(*v1.DownwardAPIVolumeSource)(nil), FC:(*v1.FCVolumeSource)(nil), AzureFile:(*v1.AzureFileVolumeSource)(nil), ConfigMap:(*v1.ConfigMapVolumeSource)(nil), VsphereVolume:(*v1.VsphereVirtualDiskVolumeSource)(nil), Quobyte:(*v1.QuobyteVolumeSource)(nil), AzureDisk:(*v1.AzureDiskVolumeSource)(nil), PhotonPersistentDisk:(*v1.PhotonPersistentDiskVolumeSource)(nil), Projected:(*v1.ProjectedVolumeSource)(nil), PortworxVolume:(*v1.PortworxVolumeSource)(nil), ScaleIO:(*v1.ScaleIOVolumeSource)(nil), StorageOS:(*v1.StorageOSVolumeSource)(nil)}}, v1.Volume{Name:"default-token-86q99", VolumeSource:v1.VolumeSource{HostPath:(*v1.HostPathVolumeSource)(nil), EmptyDir:(*v1.EmptyDirVolumeSource)(nil), GCEPersistentDisk:(*v1.GCEPersistentDiskVolumeSource)(nil), AWSElasticBlockStore:(*v1.AWSElasticBlockStoreVolumeSource)(nil), GitRepo:(*v1.GitRepoVolumeSource)(nil), Secret:(*v1.SecretVolumeSource)(0xc0006169c0), NFS:(*v1.NFSVolumeSource)(nil), ISCSI:(*v1.ISCSIVolumeSource)(nil), Glusterfs:(*v1.GlusterfsVolumeSource)(nil), PersistentVolumeClaim:(*v1.PersistentVolumeClaimVolumeSource)(nil), RBD:(*v1.RBDVolumeSource)(nil), FlexVolume:(*v1.FlexVolumeSource)(nil), Cinder:(*v1.CinderVolumeSource)(nil), CephFS:(*v1.CephFSVolumeSource)(nil), Flocker:(*v1.FlockerVolumeSource)(nil), DownwardAPI:(*v1.DownwardAPIVolumeSource)(nil), FC:(*v1.FCVolumeSource)(nil), AzureFile:(*v1.AzureFileVolumeSource)(nil), ConfigMap:(*v1.ConfigMapVolumeSource)(nil), VsphereVolume:(*v1.VsphereVirtualDiskVolumeSource)(nil), Quobyte:(*v1.QuobyteVolumeSource)(nil), AzureDisk:(*v1.AzureDiskVolumeSource)(nil), PhotonPersistentDisk:(*v1.PhotonPersistentDiskVolumeSource)(nil), Projected:(*v1.ProjectedVolumeSource)(nil), PortworxVolume:(*v1.PortworxVolumeSource)(nil), ScaleIO:(*v1.ScaleIOVolumeSource)(nil), StorageOS:(*v1.StorageOSVolumeSource)(nil)}}}, InitContainers:[]v1.Container(nil), Containers:[]v1.Container{v1.Container{Name:"nginx", Image:"nginx", Command:[]string(nil), Args:[]string(nil), WorkingDir:"", Ports:[]v1.ContainerPort{v1.ContainerPort{Name:"", HostPort:0, ContainerPort:80, Protocol:"TCP", HostIP:""}}, EnvFrom:[]v1.EnvFromSource(nil), Env:[]v1.EnvVar{v1.EnvVar{Name:"CONFIGMAP", Value:"", ValueFrom:(*v1.EnvVarSource)(0xc000afd0c0)}, v1.EnvVar{Name:"SESCRET", Value:"", ValueFrom:(*v1.EnvVarSource)(0xc000afd100)}}, Resources:v1.ResourceRequirements{Limits:v1.ResourceList{"cpu":resource.Quantity{i:resource.int64Amount{value:100, scale:-3}, d:resource.infDecAmount{Dec:(*inf.Dec)(nil)}, s:"100m", Format:"DecimalSI"}, "memory":resource.Quantity{i:resource.int64Amount{value:100, scale:6}, d:resource.infDecAmount{Dec:(*inf.Dec)(nil)}, s:"100M", Format:"DecimalSI"}}, Requests:v1.ResourceList{"cpu":resource.Quantity{i:resource.int64Amount{value:100, scale:-3}, d:resource.infDecAmount{Dec:(*inf.Dec)(nil)}, s:"100m", Format:"DecimalSI"}, "memory":resource.Quantity{i:resource.int64Amount{value:100, scale:6}, d:resource.infDecAmount{Dec:(*inf.Dec)(nil)}, s:"100M", Format:"DecimalSI"}}}, VolumeMounts:[]v1.VolumeMount{v1.VolumeMount{Name:"aol-deploy-configmap", ReadOnly:false, MountPath:"/etc/configmap", SubPath:"", MountPropagation:(*v1.MountPropagationMode)(nil)}, v1.VolumeMount{Name:"aol-deploy-secret", ReadOnly:false, MountPath:"/etc/secret", SubPath:"", MountPropagation:(*v1.MountPropagationMode)(nil)}, v1.VolumeMount{Name:"default-token-86q99", ReadOnly:true, MountPath:"/var/run/secrets/kubernetes.io/serviceaccount", SubPath:"", MountPropagation:(*v1.MountPropagationMode)(nil)}}, VolumeDevices:[]v1.VolumeDevice(nil), LivenessProbe:(*v1.Probe)(nil), ReadinessProbe:(*v1.Probe)(nil), Lifecycle:(*v1.Lifecycle)(nil), TerminationMessagePath:"/dev/termination-log", TerminationMessagePolicy:"File", ImagePullPolicy:"Always", SecurityContext:(*v1.SecurityContext)(nil), Stdin:false, Std
94
98
inOnce:false, TTY:false}}, RestartPolicy:"Always", TerminationGracePeriodSeconds:(*int64)(0xc0004661d0), ActiveDeadlineSeconds:(*int64)(nil), DNSPolicy:"ClusterFirst", NodeSelector:map[string]string(nil), ServiceAccountName:"default", DeprecatedServiceAccount:"default", AutomountServiceAccountToken:(*bool)(nil), NodeName:"m7-power-k8s01", HostNetwork:false, HostPID:false, HostIPC:false, ShareProcessNamespace:(*bool)(nil), SecurityContext:(*v1.PodSecurityContext)(0xc0005b1560), ImagePullSecrets:[]v1.LocalObjectReference(nil), Hostname:"", Subdomain:"", Affinity:(*v1.Affinity)(nil), SchedulerName:"default-scheduler", Tolerations:[]v1.Toleration(nil), HostAliases:[]v1.HostAlias(nil), PriorityClassName:"", Priority:(*int32)(nil), DNSConfig:(*v1.PodDNSConfig)(nil), ReadinessGates:[]v1.PodReadinessGate(nil), RuntimeClassName:(*string)(nil), EnableServiceLinks:(*bool)(nil)}, Status:v1.PodStatus{Phase:"Pending", Conditions:[]v1.PodCondition{v1.PodCondition{Type:"PodScheduled", Status:"True", LastProbeTime:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, LastTransitionTime:v1.Time{Time:time.Time{wall:0x0, ext:63686264311, loc:(*time.Location)(0x1fc55e0)}}, Reason:"", Message:""}}, Message:"", Reason:"", NominatedNodeName:"", HostIP:"", PodIP:"", StartTime:(*v1.Time)(nil), InitContainerStatuses:[]v1.ContainerStatus(nil), ContainerStatuses:[]v1.ContainerStatus(nil), QOSClass:"Guaranteed"}}
99
+ ```
95
100
96
101
解决办法:将自定义类型添加到 scheme.AddKnownTypes 中;
97
102
@@ -215,100 +220,105 @@ E0124 11:40:25.318620 31235 reflector.go:134] gitlab.4pd.io/pht3/aol/pkg/clien
215
220
216
221
1 . 命令行:
217
222
218
- kubectl patch deploy xxx -n default --type =json -p=' [{"op":"remove", "path":"/metadata/finalizers/0"}]'
223
+ ` ` ` bash
224
+ kubectl patch deploy xxx -n default --type=json -p='[{"op":"remove", "path":"/metadata/finalizers/0"}]'
225
+ ` ` `
219
226
220
227
2 . 简单编写 Patch :
221
228
222
- deletePolicy := metav1.DeletePropagationForeground
223
- deleteOptions := metav1.DeleteOptions {
224
- PropagationPolicy : &deletePolicy,
225
- }
226
- listOptions := metav1.ListOptions {
227
- LabelSelector : fmt.Sprintf (" controller=%s " , object.GetName ()),
228
- }
229
- if list , err := c.kubeclientset .ExtensionsV1beta1 ().Deployments (object.GetNamespace ()).List (listOptions); err != nil {
230
- utilruntime.HandleError (err)
231
- return
232
- } else {
233
- for _ , deploy := range list.Items {
234
- if err := c.kubeclientset .ExtensionsV1beta1 ().Deployments (object.GetNamespace ()).Delete (deploy.GetName (), &deleteOptions); err != nil {
235
- utilruntime.HandleError (err)
236
- return
237
- }
238
- if dep , err := c.kubeclientset .ExtensionsV1beta1 ().Deployments (object.GetNamespace ()).Patch (
239
- deploy.GetName (),
240
- types.JSONPatchType ,
241
- []byte (fmt.Sprintf (` [{"op": "remove", "path": "/metadata/finalizerz"}]` ))); err != nil {
242
- utilruntime.HandleError (err)
243
- return
244
- }
245
- }
246
- }
247
-
229
+ ` ` ` go
230
+ deletePolicy := metav1.DeletePropagationForeground
231
+ deleteOptions := metav1.DeleteOptions{
232
+ PropagationPolicy: &deletePolicy,
233
+ }
234
+ listOptions := metav1.ListOptions{
235
+ LabelSelector: fmt.Sprintf("controller=%s", object.GetName()),
236
+ }
237
+ if list, err := c.kubeclientset.ExtensionsV1beta1().Deployments(object.GetNamespace()).List(listOptions); err != nil {
238
+ utilruntime.HandleError(err)
239
+ return
240
+ } else {
241
+ for _, deploy := range list.Items {
242
+ if err := c.kubeclientset.ExtensionsV1beta1().Deployments(object.GetNamespace()).Delete(deploy.GetName(), &deleteOptions); err != nil {
243
+ utilruntime.HandleError(err)
244
+ return
245
+ }
246
+ if dep, err := c.kubeclientset.ExtensionsV1beta1().Deployments(object.GetNamespace()).Patch(
247
+ deploy.GetName(),
248
+ types.JSONPatchType,
249
+ []byte(fmt.Sprintf(` [{" op" : " remove" , " path" : " /metadata/finalizerz" }]` ))); err != nil {
250
+ utilruntime.HandleError(err)
251
+ return
252
+ }
253
+ }
254
+ }
255
+ ` ` `
248
256
249
257
3 . 复杂的 Patch :
250
258
251
- // 参考值:
252
- // 1. https://github.com/tamalsaha/patch-demo/blob/master/main.go
253
- // 2. https://github.com/kubernetes/client-go/issues/236
254
- // 创建一个 Deploy
255
- ko, err = kubeClient.AppsV1beta1 ().Deployments (ko.Namespace ).Create (ko)
256
- if err != nil {
257
- log.Fatalln (err)
258
- }
259
+ ` ` ` go
260
+ // 参考值:
261
+ // 1. https://github.com/tamalsaha/patch-demo/blob/master/main.go
262
+ // 2. https://github.com/kubernetes/client-go/issues/236
263
+ // 创建一个 Deploy
264
+ ko, err = kubeClient.AppsV1beta1().Deployments(ko.Namespace).Create(ko)
265
+ if err != nil {
266
+ log.Fatalln(err)
267
+ }
259
268
260
- // 将该 Deploy JSON 编码
261
- oJson , err := json.Marshal (ko)
262
- if err != nil {
263
- log.Fatalln (err)
264
- }
269
+ // 将该 Deploy JSON 编码
270
+ oJson, err := json.Marshal(ko)
271
+ if err != nil {
272
+ log.Fatalln(err)
273
+ }
265
274
266
- // 修改 Deploy 的内容
267
- if ko.Annotations == nil {
268
- ko.Annotations = map [string ]string {}
269
- }
270
- ko.Annotations [" example.com" ] = " 123"
271
- ko.Spec .Replicas = gt.Int32P (2 )
272
- ko.Spec .Template .Spec .Containers = append (ko.Spec .Template .Spec .Containers , apiv1.Container {
273
- Name : " bnew" ,
274
- Image : " busybox" ,
275
- ImagePullPolicy : apiv1.PullIfNotPresent ,
276
- Command : []string {
277
- " sleep" ,
278
- " 3600" ,
279
- },
280
- VolumeMounts : []apiv1.VolumeMount {
281
- {
282
- Name: TestSourceDataVolumeName,
283
- MountPath: TestSourceDataMountPath,
284
- },
275
+ // 修改 Deploy 的内容
276
+ if ko.Annotations == nil {
277
+ ko.Annotations = map[string]string{}
278
+ }
279
+ ko.Annotations["example.com"] = "123"
280
+ ko.Spec.Replicas = gt.Int32P(2)
281
+ ko.Spec.Template.Spec.Containers = append(ko.Spec.Template.Spec.Containers, apiv1.Container{
282
+ Name: "bnew",
283
+ Image: "busybox",
284
+ ImagePullPolicy: apiv1.PullIfNotPresent,
285
+ Command: []string{
286
+ "sleep",
287
+ "3600",
288
+ },
289
+ VolumeMounts: []apiv1.VolumeMount{
290
+ {
291
+ Name: TestSourceDataVolumeName,
292
+ MountPath: TestSourceDataMountPath,
285
293
},
286
- })
287
- // 将修改后的 Deploy JSON 编码
288
- mJson , err := json.Marshal (ko)
289
- if err != nil {
290
- log.Fatalln (err)
291
- }
294
+ },
295
+ })
296
+ // 将修改后的 Deploy JSON 编码
297
+ mJson, err := json.Marshal(ko)
298
+ if err != nil {
299
+ log.Fatalln(err)
300
+ }
292
301
293
- // 获取两个 JSON 的差别
294
- patch , err := jsonpatch.CreatePatch (oJson, mJson)
295
- if err != nil {
296
- log.Fatalln (err)
297
- }
298
- pb , err := json.MarshalIndent (patch, " " , " " )
299
- if err != nil {
300
- log.Fatalln (err)
301
- }
302
- fmt.Println (string (pb))
302
+ // 获取两个 JSON 的差别
303
+ patch, err := jsonpatch.CreatePatch(oJson, mJson)
304
+ if err != nil {
305
+ log.Fatalln(err)
306
+ }
307
+ pb, err := json.MarshalIndent(patch, "", " ")
308
+ if err != nil {
309
+ log.Fatalln(err)
310
+ }
311
+ fmt.Println(string(pb))
303
312
304
- // 发送 Patch 请求
305
- final , err := kubeClient.AppsV1beta1 ().Deployments (ko.Namespace ).Patch (ko.Name , types.JSONPatchType , pb)
306
- if err != nil {
307
- log.Fatalln (err)
308
- }
313
+ // 发送 Patch 请求
314
+ final, err := kubeClient.AppsV1beta1().Deployments(ko.Namespace).Patch(ko.Name, types.JSONPatchType, pb)
315
+ if err != nil {
316
+ log.Fatalln(err)
317
+ }
309
318
310
- fb , err := json.MarshalIndent (final, " " , " " )
311
- if err != nil {
312
- log.Fatalln (err)
313
- }
314
- fmt.Println (string (fb))
319
+ fb, err := json.MarshalIndent(final, "", " ")
320
+ if err != nil {
321
+ log.Fatalln(err)
322
+ }
323
+ fmt.Println(string(fb))
324
+ ` ` `
0 commit comments