Skip to content

Commit f1bee44

Browse files
author
Zhang Jun
committed
update
1 parent a9067e7 commit f1bee44

File tree

1 file changed

+104
-94
lines changed

1 file changed

+104
-94
lines changed

client-go/开发笔记.md

Lines changed: 104 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ DeltaFIFO Watch apiserver 过程中可能因网络等问题出现丢事件的
5353

5454
创建 AolPod 的语句:
5555

56+
``` go
5657
func 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
9498
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+
```
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

216221
1. 命令行:
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

220227
2. 简单编写 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

249257
3. 复杂的 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

Comments
 (0)