diff --git a/cmd/delete.go b/cmd/delete.go
index 88e92b260ec17d57658d7eba7dd2810cf4337d0d..f7df57efdbd4e7c86d23d045ef5d3359c0d6d360 100644
--- a/cmd/delete.go
+++ b/cmd/delete.go
@@ -50,7 +50,7 @@ var deleteCmd = &cobra.Command{
 			return err
 		}
 
-		c.DefaultNamespace, _, err = clientConfig.Namespace()
+		c.DefaultNamespace, err = defaultNamespace(clientConfig)
 		if err != nil {
 			return err
 		}
diff --git a/cmd/diff.go b/cmd/diff.go
index dd5bff4155b0c6d476b06ae9c1540f1ee1d94885..22664a2215d192de30e6fd926a1b180f0df2828a 100644
--- a/cmd/diff.go
+++ b/cmd/diff.go
@@ -48,7 +48,7 @@ var diffCmd = &cobra.Command{
 			return err
 		}
 
-		c.DefaultNamespace, _, err = clientConfig.Namespace()
+		c.DefaultNamespace, err = defaultNamespace(clientConfig)
 		if err != nil {
 			return err
 		}
diff --git a/cmd/root.go b/cmd/root.go
index a812cae1c08f1744d3a874742eaed63c422443c4..1b836b76ebf0dae49a7f89bb33ad521e5af5a8c0 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -60,6 +60,7 @@ const (
 )
 
 var clientConfig clientcmd.ClientConfig
+var overrides clientcmd.ConfigOverrides
 
 func init() {
 	RootCmd.PersistentFlags().CountP(flagVerbose, "v", "Increase verbosity. May be given multiple times.")
@@ -74,7 +75,6 @@ func init() {
 	// The "usual" clientcmd/kubectl flags
 	loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
 	loadingRules.DefaultClientConfig = &clientcmd.DefaultClientConfig
-	overrides := clientcmd.ConfigOverrides{}
 	kflags := clientcmd.RecommendedConfigOverrideFlags("")
 	RootCmd.PersistentFlags().StringVar(&loadingRules.ExplicitPath, "kubeconfig", "", "Path to a kube config. Only required if out-of-cluster")
 	clientcmd.BindOverrideFlags(&overrides, RootCmd.PersistentFlags(), kflags)
@@ -108,6 +108,16 @@ var RootCmd = &cobra.Command{
 	},
 }
 
+// clientConfig.Namespace() is broken in client-go 3.0:
+// namespace in config erroneously overrides explicit --namespace
+func defaultNamespace(c clientcmd.ClientConfig) (string, error) {
+	if overrides.Context.Namespace != "" {
+		return overrides.Context.Namespace, nil
+	}
+	ns, _, err := c.Namespace()
+	return ns, err
+}
+
 func logLevel(verbosity int) log.Level {
 	switch verbosity {
 	case 0:
diff --git a/cmd/update.go b/cmd/update.go
index 987df5ae894bb8a75d1d9b51c141681468b7f626..41b104bde18b4c8741c2a73fe7cbc536298bbafe 100644
--- a/cmd/update.go
+++ b/cmd/update.go
@@ -91,7 +91,7 @@ local configuration. Accepts JSON, YAML, or Jsonnet.`,
 			return err
 		}
 
-		c.DefaultNamespace, _, err = clientConfig.Namespace()
+		c.DefaultNamespace, err = defaultNamespace(clientConfig)
 		if err != nil {
 			return err
 		}