我是golang
的新手,我有以下要求:
- 我有一个使用图像
nginx:latest
运行的部署 - 然后手动更新此图像到其他内容(例如:
nginx:1.22
) - 我需要得到旧的图像版本和新的图像版本
所以,我研究了"共享信息者"。在Go Lang。我这样写:
func main() {
. . .
// create shared informers for resources in all known API group versions with a reSync period and namespace
factory := informers.NewSharedInformerFactoryWithOptions(clientSet, 1*time.Hour, informers.WithNamespace(namespace_to_watch))
podInformer := factory.Core().V1().Pods().Informer()
defer runtime.HandleCrash()
// start informer ->
go factory.Start(stopper)
// start to sync and call list
if !cache.WaitForCacheSync(stopper, podInformer.HasSynced) {
runtime.HandleError(fmt.Errorf("Timed out waiting for caches to sync"))
return
}
podInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: onAdd, // register add eventhandler
UpdateFunc: onUpdate,
DeleteFunc: onDelete,
})
}
func onUpdate(oldObj interface{}, newObj interface{}) {
oldPod := oldObj.(*corev1.Pod)
newPod := newObj.(*corev1.Pod)
for container_old := range oldPod.Spec.Containers {
fmt.Printf("Container Old :%s", container_old.Image )
}
for container_new := range newPod.Spec.Containers {
fmt.Printf("Container New :%s", container_new.Image )
}
}
如上所述,根据onUpdate
函数,我应该获得两个值,相反,我在每次更新中获得相同的值,如下所示:
Container Old: nginx:latest
Container New: nginx:latest
Container Old: nginx:1.22
Container New: nginx:1.22
Container Old: nginx:1.22
Container New: nginx:1.22
上面的输出是因为不知何故,onUpdate
函数被触发了三次,但是正如您所看到的,在所有的时间里,值都是相同的(对于每个输出)。但我期待的是下面这样的内容:
Container Old: nginx:latest
有人能帮我一下吗?Container New: nginx:1.22
在部署中更新映像时,将使用新的映像容器重新启动pod,并且不会留下旧的pod规范的痕迹。您应该观察部署而不是pod,并检查旧部署和新部署对象之间的映像。下面是一个如何修改onUpdate
方法的示例。
func onUpdate(oldObj interface{}, newObj interface{}) {
oldDepl := oldObj.(*v1.Deployment)
newDepl := newObj.(*v1.Deployment)
for oldContainerID := range oldDepl.Spec.Template.Spec.Containers {
for newContainerID := range newDepl.Spec.Template.Spec.Containers {
if oldDepl.Spec.Template.Spec.Containers[oldContainerID].Name == newDepl.Spec.Template.Spec.Containers[newContainerID].Name {
if oldDepl.Spec.Template.Spec.Containers[oldContainerID].Image != newDepl.Spec.Template.Spec.Containers[newContainerID].Image {
fmt.Printf("CONTAINER IMAGE UPDATED FROM %s to %s",
oldDepl.Spec.Template.Spec.Containers[oldContainerID].Image, newDepl.Spec.Template.Spec.Containers[newContainerID].Image)
}
}
}
}
}