From a29ca9bfeb405d984a2d8d55ba937367b6e6760e Mon Sep 17 00:00:00 2001 From: Ge Song Date: Fri, 18 Sep 2020 16:22:39 +0800 Subject: [PATCH] support statefulset (#58) --- README.md | 1 + cmd/kail/main.go | 29 ++++++++++++++----------- ds.go | 23 ++++++++++++-------- ds_builder.go | 55 ++++++++++++++++++++++++++++++++++++------------ go.mod | 2 +- go.sum | 2 ++ 6 files changed, 77 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 9781c85..00e7cdc 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ Flag | Selection `--rc NAME` | match pods belonging to the given replication controller `--rs NAME` | match pods belonging to the given replica set `-d, --deploy NAME` | match pods belonging to the given deployment +`--sts NAME` | match pods belonging to the given statefulset `-j, --job NAME` | match pods belonging to the given job `--node NODE-NAME` | match pods running on the given node `--ing NAME` | match pods belonging to services targeted by the given ingress diff --git a/cmd/kail/main.go b/cmd/kail/main.go index 87b481c..569431e 100644 --- a/cmd/kail/main.go +++ b/cmd/kail/main.go @@ -32,18 +32,19 @@ var ( var ( flagIgnore = kingpin.Flag("ignore", "ignore selector").PlaceHolder("SELECTOR").Default("kail.ignore=true").Strings() - flagLabel = kingpin.Flag("label", "label").Short('l').PlaceHolder("SELECTOR").Strings() - flagPod = kingpin.Flag("pod", "pod").Short('p').PlaceHolder("NAME").Strings() - flagNs = kingpin.Flag("ns", "namespace").Short('n').PlaceHolder("NAME").Strings() - flagIgnoreNs = kingpin.Flag("ignore-ns", "ignore namespace").PlaceHolder("NAME").Default("kube-system").Strings() - flagSvc = kingpin.Flag("svc", "service").PlaceHolder("NAME").Strings() - flagRc = kingpin.Flag("rc", "replication controller").PlaceHolder("NAME").Strings() - flagRs = kingpin.Flag("rs", "replica set").PlaceHolder("NAME").Strings() - flagDs = kingpin.Flag("ds", "daemonset").PlaceHolder("NAME").Strings() - flagDeployment = kingpin.Flag("deploy", "deployment").Short('d').PlaceHolder("NAME").Strings() - flagJob = kingpin.Flag("job", "job").Short('j').PlaceHolder("NAME").Strings() - flagNode = kingpin.Flag("node", "node").PlaceHolder("NAME").Strings() - flagIng = kingpin.Flag("ing", "ingress").PlaceHolder("NAME").Strings() + flagLabel = kingpin.Flag("label", "label").Short('l').PlaceHolder("SELECTOR").Strings() + flagPod = kingpin.Flag("pod", "pod").Short('p').PlaceHolder("NAME").Strings() + flagNs = kingpin.Flag("ns", "namespace").Short('n').PlaceHolder("NAME").Strings() + flagIgnoreNs = kingpin.Flag("ignore-ns", "ignore namespace").PlaceHolder("NAME").Default("kube-system").Strings() + flagSvc = kingpin.Flag("svc", "service").PlaceHolder("NAME").Strings() + flagRc = kingpin.Flag("rc", "replication controller").PlaceHolder("NAME").Strings() + flagRs = kingpin.Flag("rs", "replica set").PlaceHolder("NAME").Strings() + flagDs = kingpin.Flag("ds", "daemonset").PlaceHolder("NAME").Strings() + flagDeployment = kingpin.Flag("deploy", "deployment").Short('d').PlaceHolder("NAME").Strings() + flagStatefulSet = kingpin.Flag("sts", "statefulset").PlaceHolder("NAME").Strings() + flagJob = kingpin.Flag("job", "job").Short('j').PlaceHolder("NAME").Strings() + flagNode = kingpin.Flag("node", "node").PlaceHolder("NAME").Strings() + flagIng = kingpin.Flag("ing", "ingress").PlaceHolder("NAME").Strings() flagContext = kingpin.Flag("context", "kubernetes context").PlaceHolder("CONTEXT-NAME").String() @@ -254,6 +255,10 @@ func createDSBuilder() kail.DSBuilder { dsb = dsb.WithDeployment(ids...) } + if ids := parseIds("sts", *flagStatefulSet); len(ids) > 0 { + dsb = dsb.WithStatefulSet(ids...) + } + if ids := parseIds("job", *flagJob); len(ids) > 0 { dsb = dsb.WithJob(ids...) } diff --git a/ds.go b/ds.go index 8c3457b..7ffccba 100644 --- a/ds.go +++ b/ds.go @@ -13,6 +13,7 @@ import ( "github.com/boz/kcache/types/replicaset" "github.com/boz/kcache/types/replicationcontroller" "github.com/boz/kcache/types/service" + "github.com/boz/kcache/types/statefulset" ) type DS interface { @@ -30,18 +31,20 @@ type datastore struct { rssBase replicaset.Controller dssBase daemonset.Controller deploymentsBase deployment.Controller + statefulsetBase statefulset.Controller jobsBase job.Controller ingressesBase ingress.Controller - pods pod.Controller - services service.Controller - nodes node.Controller - rcs replicationcontroller.Controller - rss replicaset.Controller - dss daemonset.Controller - deployments deployment.Controller - jobs job.Controller - ingresses ingress.Controller + pods pod.Controller + services service.Controller + nodes node.Controller + rcs replicationcontroller.Controller + rss replicaset.Controller + dss daemonset.Controller + deployments deployment.Controller + statefulsets statefulset.Controller + jobs job.Controller + ingresses ingress.Controller readych chan struct{} donech chan struct{} @@ -117,6 +120,7 @@ func (ds *datastore) controllers() []cacheController { ds.rssBase, ds.dssBase, ds.deploymentsBase, + ds.statefulsetBase, ds.ingressesBase, ds.pods, ds.services, @@ -125,6 +129,7 @@ func (ds *datastore) controllers() []cacheController { ds.rss, ds.dss, ds.deployments, + ds.statefulsets, ds.ingresses, } diff --git a/ds_builder.go b/ds_builder.go index 5b6f01d..a06adb2 100644 --- a/ds_builder.go +++ b/ds_builder.go @@ -2,6 +2,7 @@ package kail import ( "context" + "github.com/boz/kcache/types/job" logutil "github.com/boz/go-logutil" @@ -15,6 +16,7 @@ import ( "github.com/boz/kcache/types/replicaset" "github.com/boz/kcache/types/replicationcontroller" "github.com/boz/kcache/types/service" + "github.com/boz/kcache/types/statefulset" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/kubernetes" @@ -32,6 +34,7 @@ type DSBuilder interface { WithRS(id ...nsname.NSName) DSBuilder WithDS(id ...nsname.NSName) DSBuilder WithDeployment(id ...nsname.NSName) DSBuilder + WithStatefulSet(id ...nsname.NSName) DSBuilder WithJob(id ...nsname.NSName) DSBuilder WithIngress(id ...nsname.NSName) DSBuilder @@ -43,19 +46,20 @@ func NewDSBuilder() DSBuilder { } type dsBuilder struct { - ignore []labels.Selector - selectors []labels.Selector - pods []nsname.NSName - namespaces []string - ignoreNS []string - services []nsname.NSName - nodes []string - rcs []nsname.NSName - rss []nsname.NSName - dss []nsname.NSName - deployments []nsname.NSName - jobs []nsname.NSName - ingresses []nsname.NSName + ignore []labels.Selector + selectors []labels.Selector + pods []nsname.NSName + namespaces []string + ignoreNS []string + services []nsname.NSName + nodes []string + rcs []nsname.NSName + rss []nsname.NSName + dss []nsname.NSName + deployments []nsname.NSName + statefulsets []nsname.NSName + jobs []nsname.NSName + ingresses []nsname.NSName } func (b *dsBuilder) WithIgnore(selector ...labels.Selector) DSBuilder { @@ -113,6 +117,11 @@ func (b *dsBuilder) WithDeployment(id ...nsname.NSName) DSBuilder { return b } +func (b *dsBuilder) WithStatefulSet(id ...nsname.NSName) DSBuilder { + b.statefulsets = append(b.statefulsets, id...) + return b +} + func (b *dsBuilder) WithJob(id ...nsname.NSName) DSBuilder { b.jobs = append(b.jobs, id...) return b @@ -329,6 +338,26 @@ func (b *dsBuilder) Create(ctx context.Context, cs kubernetes.Interface) (DS, er } } + if len(b.statefulsets) != 0 { + ds.statefulsetBase, err = statefulset.NewController(ctx, log, cs, namespace) + if err != nil { + ds.closeAll() + return nil, log.Err(err, "statefulset base controller") + } + + ds.statefulsets, err = ds.statefulsetBase.CloneWithFilter(filter.NSName(b.statefulsets...)) + if err != nil { + ds.closeAll() + return nil, log.Err(err, "statefulset controller") + } + + ds.pods, err = join.StatefulSetPods(ctx, ds.statefulsets, ds.pods) + if err != nil { + ds.closeAll() + return nil, log.Err(err, "statefulset join") + } + } + if len(b.jobs) != 0 { ds.jobsBase, err = job.NewController(ctx, log, cs, namespace) if err != nil { diff --git a/go.mod b/go.mod index 7e017fd..b99f93d 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/boz/go-lifecycle v0.1.0 github.com/boz/go-logutil v0.1.0 - github.com/boz/kcache v0.4.0 + github.com/boz/kcache v0.4.1-0.20200916082658-69f5988adb8d github.com/dgrijalva/jwt-go v0.0.0-20170608005149-a539ee1a749a // indirect github.com/fatih/color v1.7.0 github.com/googleapis/gnostic v0.0.0-20170807220725-57b029087370 // indirect diff --git a/go.sum b/go.sum index 42d60a1..2834427 100644 --- a/go.sum +++ b/go.sum @@ -24,6 +24,8 @@ github.com/boz/kcache v0.3.0 h1:g0Fe6j6C06pydQuCNf8bKh4u9z1kd0v/gq8WhwFVOQM= github.com/boz/kcache v0.3.0/go.mod h1:hQl4JnUxZ9Dv46mY+9aEFu5mQdFSOEN7abv28NCUcIc= github.com/boz/kcache v0.4.0 h1:zM55IqBD2eDHSG0W8nIb0vYmh/L7Q8lHkPYhYfiqeIM= github.com/boz/kcache v0.4.0/go.mod h1:hQl4JnUxZ9Dv46mY+9aEFu5mQdFSOEN7abv28NCUcIc= +github.com/boz/kcache v0.4.1-0.20200916082658-69f5988adb8d h1:ULH+DBFNbq7TD5MfYeJ/qTmpct3wv0fWl2d0RW0cPGU= +github.com/boz/kcache v0.4.1-0.20200916082658-69f5988adb8d/go.mod h1:hQl4JnUxZ9Dv46mY+9aEFu5mQdFSOEN7abv28NCUcIc= github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw= github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e h1:V9a67dfYqPLAvzk5hMQOXYJlZ4SLIXgyKIE+ZiHzgGQ= github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo=