Skip to content

Commit c802e22

Browse files
openshift start network should pass stopCh down to DNS
Allow graceful shutdown of the DNS server so that we can remove ourselves from dnsmasq.
1 parent 9d78c24 commit c802e22

File tree

4 files changed

+30
-15
lines changed

4 files changed

+30
-15
lines changed

pkg/cmd/server/kubernetes/network/network.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ func (c *NetworkConfig) RunSDN() {
4848
}
4949

5050
// RunDNS starts the DNS server as soon as services are loaded.
51-
func (c *NetworkConfig) RunDNS() {
51+
func (c *NetworkConfig) RunDNS(stopCh <-chan struct{}) {
5252
go func() {
5353
glog.Infof("Starting DNS on %s", c.DNSServer.Config.DnsAddr)
54-
err := c.DNSServer.ListenAndServe()
54+
err := c.DNSServer.ListenAndServe(stopCh)
5555
glog.Fatalf("DNS server failed to start: %v", err)
5656
}()
5757
}

pkg/cmd/server/origin/dns_server.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66

77
"github.com/golang/glog"
88

9+
"k8s.io/apimachinery/pkg/util/wait"
10+
911
cmdutil "github.com/openshift/origin/pkg/cmd/util"
1012
"github.com/openshift/origin/pkg/dns"
1113
)
@@ -52,7 +54,7 @@ func (c *MasterConfig) RunDNSServer() {
5254

5355
go func() {
5456
s := dns.NewServer(config, services, endpoints, "apiserver")
55-
err := s.ListenAndServe()
57+
err := s.ListenAndServe(wait.NeverStop)
5658
glog.Fatalf("Could not start DNS: %v", err)
5759
}()
5860

pkg/cmd/server/start/start_allinone.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/spf13/cobra"
1717

1818
kerrors "k8s.io/apimachinery/pkg/api/errors"
19+
"k8s.io/apimachinery/pkg/util/wait"
1920
"k8s.io/apiserver/pkg/util/flag"
2021
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
2122
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
@@ -26,7 +27,6 @@ import (
2627
configapi "github.com/openshift/origin/pkg/cmd/server/apis/config"
2728
"github.com/openshift/origin/pkg/cmd/server/origin"
2829
tsbcmd "github.com/openshift/origin/pkg/templateservicebroker/cmd/server"
29-
"k8s.io/apimachinery/pkg/util/wait"
3030
)
3131

3232
type AllInOneOptions struct {
@@ -310,7 +310,7 @@ func (o AllInOneOptions) StartAllInOne() error {
310310
ConfigFile: o.NodeConfigFile,
311311
Output: o.MasterOptions.Output,
312312
}
313-
if err := nodeOptions.RunNode(); err != nil {
313+
if err := nodeOptions.RunNode(wait.NeverStop); err != nil {
314314
return err
315315
}
316316

pkg/cmd/server/start/start_node.go

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"path/filepath"
1010
"strings"
1111
"syscall"
12+
"time"
1213

1314
"github.com/coreos/go-systemd/daemon"
1415
"github.com/golang/glog"
@@ -18,11 +19,11 @@ import (
1819
kerrors "k8s.io/apimachinery/pkg/api/errors"
1920
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
2021
"k8s.io/apimachinery/pkg/util/sets"
21-
"k8s.io/apimachinery/pkg/util/wait"
2222
kubeletapp "k8s.io/kubernetes/cmd/kubelet/app"
2323
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
2424
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
2525
"k8s.io/kubernetes/pkg/master/ports"
26+
"k8s.io/kubernetes/pkg/util/interrupt"
2627

2728
"github.com/openshift/library-go/pkg/crypto"
2829
"github.com/openshift/origin/pkg/cmd/server/admin"
@@ -115,14 +116,26 @@ var networkLong = templates.LongDesc(`
115116

116117
// NewCommandStartNetwork provides a CLI handler for 'start network' command
117118
func NewCommandStartNetwork(basename string, out, errout io.Writer) (*cobra.Command, *NodeOptions) {
118-
options := &NodeOptions{Output: out}
119+
options := &NodeOptions{
120+
ExpireDays: crypto.DefaultCertificateLifetimeInDays,
121+
Output: out,
122+
}
119123

120124
cmd := &cobra.Command{
121125
Use: "network",
122126
Short: "Launch node network",
123127
Long: fmt.Sprintf(networkLong, basename),
124128
Run: func(c *cobra.Command, args []string) {
125-
options.Run(c, errout, args, wait.NeverStop)
129+
ch := make(chan struct{})
130+
interrupt.New(func(s os.Signal) {
131+
close(ch)
132+
fmt.Fprintf(errout, "interrupt: Gracefully shutting down ...\n")
133+
time.Sleep(200 * time.Millisecond)
134+
os.Exit(1)
135+
}).Run(func() error {
136+
options.Run(c, errout, args, ch)
137+
return nil
138+
})
126139
},
127140
}
128141

@@ -209,7 +222,7 @@ func (o NodeOptions) Complete(cmd *cobra.Command) error {
209222

210223
// StartNode calls RunNode and then waits forever
211224
func (o NodeOptions) StartNode(stopCh <-chan struct{}) error {
212-
if err := o.RunNode(); err != nil {
225+
if err := o.RunNode(stopCh); err != nil {
213226
return err
214227
}
215228

@@ -227,7 +240,7 @@ func (o NodeOptions) StartNode(stopCh <-chan struct{}) error {
227240
// 2. Reads fully specified node config OR builds a fully specified node config from the args
228241
// 3. Writes the fully specified node config and exits if needed
229242
// 4. Starts the node based on the fully specified config
230-
func (o NodeOptions) RunNode() error {
243+
func (o NodeOptions) RunNode(stopCh <-chan struct{}) error {
231244
nodeConfig, configFile, err := o.resolveNodeConfig()
232245
if err != nil {
233246
return err
@@ -277,7 +290,7 @@ func (o NodeOptions) RunNode() error {
277290
return originnode.WriteKubeletFlags(*nodeConfig)
278291
}
279292

280-
return StartNode(*nodeConfig, o.NodeArgs.Components)
293+
return StartNode(*nodeConfig, o.NodeArgs.Components, stopCh)
281294
}
282295

283296
// resolveNodeConfig creates a new configuration on disk by reading from the master, reads
@@ -421,7 +434,7 @@ func execKubelet(kubeletArgs []string) error {
421434
}
422435

423436
// StartNode launches the node processes.
424-
func StartNode(nodeConfig configapi.NodeConfig, components *utilflags.ComponentFlag) error {
437+
func StartNode(nodeConfig configapi.NodeConfig, components *utilflags.ComponentFlag, stopCh <-chan struct{}) error {
425438
kubeletArgs, err := nodeoptions.ComputeKubeletFlags(nodeConfig.KubeletArguments, nodeConfig)
426439
if err != nil {
427440
return fmt.Errorf("cannot create kubelet args: %v", err)
@@ -476,12 +489,12 @@ func StartNode(nodeConfig configapi.NodeConfig, components *utilflags.ComponentF
476489
networkConfig.RunProxy()
477490
}
478491
if components.Enabled(ComponentDNS) && networkConfig.DNSServer != nil {
479-
networkConfig.RunDNS()
492+
networkConfig.RunDNS(stopCh)
480493
}
481494

482-
networkConfig.InternalKubeInformers.Start(wait.NeverStop)
495+
networkConfig.InternalKubeInformers.Start(stopCh)
483496
if networkConfig.InternalNetworkInformers != nil {
484-
networkConfig.InternalNetworkInformers.Start(wait.NeverStop)
497+
networkConfig.InternalNetworkInformers.Start(stopCh)
485498
}
486499

487500
return nil

0 commit comments

Comments
 (0)