Now also dealing with deleted resources in the time interval. Making sure that new pods are not immediately synced on other nodes to avoid pull rate limits caused by this code.
73 lines
2.3 KiB
Go
73 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
goflags "flag"
|
|
"github.com/spf13/cobra"
|
|
"k8s.io/klog/v2"
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
func main() {
|
|
klogFlags := goflags.NewFlagSet("", goflags.PanicOnError)
|
|
klog.InitFlags(klogFlags)
|
|
|
|
clientset := GetKubernetesConnection()
|
|
config := &Config{}
|
|
|
|
cmd := &cobra.Command{
|
|
Use: "kube-fetcher",
|
|
Short: "Fetch images on a kubernetes node",
|
|
Long: `
|
|
Queries k8s for all running pods and makes sure that all
|
|
images referenced in pods are made available on the local k8s node and pinned
|
|
so they don't get garbage collected'`,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
serializer := make(chan func())
|
|
go func() {
|
|
for action := range serializer {
|
|
action()
|
|
}
|
|
}()
|
|
watcher := NewWatcher(clientset, config.monitoringWindowSize, config.KubernetesNamespace, serializer)
|
|
fetcher := NewFetcher(clientset, config, watcher)
|
|
|
|
ticker := time.NewTicker(config.PollInterval)
|
|
for {
|
|
select {
|
|
case <-ticker.C:
|
|
serializer <- func() {
|
|
klog.V(3).Infof("Fetcher.pullAndPin")
|
|
fetcher.pullAndPin()
|
|
}
|
|
}
|
|
}
|
|
},
|
|
}
|
|
|
|
cmd.PersistentFlags().StringVar(&config.KubernetesNamespace, "kubernetes-namespace",
|
|
"", "Kubernetes containerdNamespace to inspect (default is all namespaces)")
|
|
cmd.PersistentFlags().StringVar(&config.SocketPath, "socket",
|
|
"/run/containerd/containerd.sock", "Containerd socket")
|
|
cmd.PersistentFlags().StringVar(&config.ContainerdNamespace, "containerd-namespace",
|
|
"k8s.io", "Containerd namespace to use")
|
|
cmd.PersistentFlags().StringVar(&config.Nodename, "nodename", "",
|
|
"Kubernetes node name the fetcher is running on, it will only fetch images running on other nodes")
|
|
cmd.PersistentFlags().DurationVar(&config.ReadyDuration, "ready-duration",
|
|
1*time.Hour, "Time a pod must be ready before its image will be fetched")
|
|
cmd.PersistentFlags().BoolVar(&config.includeControllerNodes, "include-controllers",
|
|
false, "Include controller nodes")
|
|
cmd.PersistentFlags().DurationVar(&config.monitoringWindowSize, "monitoring-window",
|
|
6*time.Hour, "Monitoring window to see what pods were active")
|
|
cmd.PersistentFlags().DurationVar(&config.PollInterval, "poll-interval",
|
|
1*time.Minute, "Poll interval for checking whether to pull images. ")
|
|
cmd.Flags().AddGoFlagSet(klogFlags)
|
|
|
|
err := cmd.Execute()
|
|
if err != nil {
|
|
klog.Errorf("Error: %v", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
}
|