@@ -53,6 +53,7 @@ DeltaFIFO Watch apiserver 过程中可能因网络等问题出现丢事件的
5353
5454创建 AolPod 的语句:
5555
56+ ``` go
5657func newAolPod (pod *coreV1 .Pod ) *aolV1alpha1 .AolPod {
5758 labels := pod.ObjectMeta .Labels
5859 labels[" controller" ] = pod.ObjectMeta .Name
@@ -76,22 +77,26 @@ func newAolPod(pod *coreV1.Pod) *aolV1alpha1.AolPod {
7677 Status: pod.Status ,
7778 }
7879}
80+ ```
7981
8082后续创建:
8183
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+ ```
9194失败日志:
9295
96+ ``` txt
9397---> 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
9498inOnce: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+ ```
95100
96101解决办法:将自定义类型添加到 scheme.AddKnownTypes 中;
97102
@@ -215,100 +220,105 @@ E0124 11:40:25.318620 31235 reflector.go:134] gitlab.4pd.io/pht3/aol/pkg/clien
215220
2162211 . 命令行:
217222
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+ ` ` `
219226
2202272 . 简单编写 Patch :
221228
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+ ` ` `
248256
2492573 . 复杂的 Patch :
250258
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+ }
259268
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+ }
265274
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,
285293 },
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+ }
292301
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))
303312
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+ }
309318
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