diff --git a/cmd/helm/init.go b/cmd/helm/init.go index c7617e705..198f71ec1 100644 --- a/cmd/helm/init.go +++ b/cmd/helm/init.go @@ -34,6 +34,7 @@ import ( "k8s.io/helm/pkg/helm" "k8s.io/helm/pkg/helm/helmpath" "k8s.io/helm/pkg/helm/portforwarder" + "k8s.io/helm/pkg/tiller/environment" "k8s.io/helm/pkg/version" ) @@ -144,6 +145,9 @@ func newInitCmd(out io.Writer) *cobra.Command { f.StringArrayVar(&i.opts.Values, "override", []string{}, "Override values for the Tiller Deployment manifest (can specify multiple or separate values with commas: key1=val1,key2=val2)") f.BoolVar(&i.opts.AutoMountServiceAccountToken, "automount-service-account-token", true, "Auto-mount the given service account to tiller") + f.Int32Var(&i.opts.TillerPort, "tiller-port", environment.DefaultTillerPort, "Override Tiller port") + f.Int32Var(&i.opts.TillerProbePort, "tiller-probe-port", environment.DefaultTillerProbePort, "Override Tiller probe port") + return cmd } diff --git a/cmd/helm/installer/install.go b/cmd/helm/installer/install.go index 42c7132db..24656896a 100644 --- a/cmd/helm/installer/install.go +++ b/cmd/helm/installer/install.go @@ -36,7 +36,6 @@ import ( "k8s.io/helm/pkg/version" "k8s.io/helm/pkg/chartutil" - "k8s.io/helm/pkg/tiller/environment" ) // Install uses Kubernetes client to install Tiller. @@ -46,7 +45,7 @@ func Install(client kubernetes.Interface, opts *Options) error { if err := createDeployment(client.ExtensionsV1beta1(), opts); err != nil { return err } - if err := createService(client.CoreV1(), opts.Namespace); err != nil { + if err := createService(client.CoreV1(), opts); err != nil { return err } if opts.tls() { @@ -79,7 +78,7 @@ func Upgrade(client kubernetes.Interface, opts *Options) error { // that didn't deploy the service, so install it. _, err = client.CoreV1().Services(opts.Namespace).Get(serviceName, metav1.GetOptions{}) if apierrors.IsNotFound(err) { - return createService(client.CoreV1(), opts.Namespace) + return createService(client.CoreV1(), opts) } return err } @@ -131,16 +130,16 @@ func Deployment(opts *Options) (*v1beta1.Deployment, error) { } // createService creates the Tiller service resource -func createService(client corev1.ServicesGetter, namespace string) error { - obj := generateService(namespace) +func createService(client corev1.ServicesGetter, opts *Options) error { + obj := generateService(opts) _, err := client.Services(obj.Namespace).Create(obj) return err } // Service gets a service object that can be used to generate a manifest as a // string. This object should not be submitted directly to the Kubernetes api -func Service(namespace string) *v1.Service { - svc := generateService(namespace) +func Service(opts *Options) *v1.Service { + svc := generateService(opts) svc.TypeMeta = metav1.TypeMeta{ Kind: "Service", APIVersion: "v1", @@ -155,7 +154,7 @@ func TillerManifests(opts *Options) ([]string, error) { return []string{}, err } - svc := Service(opts.Namespace) + svc := Service(opts) objs := []runtime.Object{dep, svc} @@ -227,8 +226,12 @@ func generateDeployment(opts *Options) (*v1beta1.Deployment, error) { Image: opts.SelectImage(), ImagePullPolicy: opts.pullPolicy(), Ports: []v1.ContainerPort{ - {ContainerPort: environment.DefaultTillerPort, Name: "tiller"}, - {ContainerPort: environment.DefaultTillerProbePort, Name: "http"}, + {ContainerPort: opts.TillerPort, Name: "tiller"}, + {ContainerPort: opts.TillerProbePort, Name: "http"}, + }, + Args: []string{ + "-listen", fmt.Sprintf(":%v", opts.TillerPort), + "-probe-listen", fmt.Sprintf(":%v", opts.TillerProbePort), }, Env: []v1.EnvVar{ {Name: "TILLER_NAMESPACE", Value: opts.Namespace}, @@ -238,7 +241,7 @@ func generateDeployment(opts *Options) (*v1beta1.Deployment, error) { Handler: v1.Handler{ HTTPGet: &v1.HTTPGetAction{ Path: "/liveness", - Port: intstr.FromInt(environment.DefaultTillerProbePort), + Port: intstr.IntOrString{IntVal: opts.TillerProbePort}, }, }, InitialDelaySeconds: 1, @@ -248,7 +251,7 @@ func generateDeployment(opts *Options) (*v1beta1.Deployment, error) { Handler: v1.Handler{ HTTPGet: &v1.HTTPGetAction{ Path: "/readiness", - Port: intstr.FromInt(environment.DefaultTillerProbePort), + Port: intstr.IntOrString{IntVal: opts.TillerProbePort}, }, }, InitialDelaySeconds: 1, @@ -329,11 +332,11 @@ func generateDeployment(opts *Options) (*v1beta1.Deployment, error) { return d, nil } -func generateService(namespace string) *v1.Service { +func generateService(opts *Options) *v1.Service { labels := generateLabels(map[string]string{"name": "tiller"}) s := &v1.Service{ ObjectMeta: metav1.ObjectMeta{ - Namespace: namespace, + Namespace: opts.Namespace, Name: serviceName, Labels: labels, }, @@ -342,7 +345,7 @@ func generateService(namespace string) *v1.Service { Ports: []v1.ServicePort{ { Name: "tiller", - Port: environment.DefaultTillerPort, + Port: opts.TillerPort, TargetPort: intstr.FromString("tiller"), }, }, diff --git a/cmd/helm/installer/install_test.go b/cmd/helm/installer/install_test.go index 50cc8b1d8..eb3162866 100644 --- a/cmd/helm/installer/install_test.go +++ b/cmd/helm/installer/install_test.go @@ -151,7 +151,7 @@ func TestDeployment_WithTLS(t *testing.T) { } func TestServiceManifest(t *testing.T) { - svc := Service(v1.NamespaceDefault) + svc := Service(&Options{Namespace: v1.NamespaceDefault}) if got := svc.ObjectMeta.Namespace; got != v1.NamespaceDefault { t.Errorf("expected namespace %s, got %s", v1.NamespaceDefault, got) @@ -361,7 +361,7 @@ func TestUpgrade(t *testing.T) { ServiceAccount: "serviceAccountToReplace", UseCanary: false, }) - existingService := generateService(v1.NamespaceDefault) + existingService := generateService(&Options{Namespace: v1.NamespaceDefault}) fc := &fake.Clientset{} fc.AddReactor("get", "deployments", func(action testcore.Action) (bool, runtime.Object, error) { @@ -445,7 +445,7 @@ func TestUgrade_newerVersion(t *testing.T) { ServiceAccount: "serviceAccountToReplace", UseCanary: false, }) - existingService := generateService(v1.NamespaceDefault) + existingService := generateService(&Options{Namespace: v1.NamespaceDefault}) fc := &fake.Clientset{} fc.AddReactor("get", "deployments", func(action testcore.Action) (bool, runtime.Object, error) { @@ -505,7 +505,7 @@ func TestUpgrade_identical(t *testing.T) { ServiceAccount: "serviceAccountToReplace", UseCanary: false, }) - existingService := generateService(v1.NamespaceDefault) + existingService := generateService(&Options{Namespace: v1.NamespaceDefault}) fc := &fake.Clientset{} fc.AddReactor("get", "deployments", func(action testcore.Action) (bool, runtime.Object, error) { @@ -546,7 +546,7 @@ func TestUpgrade_canaryClient(t *testing.T) { ServiceAccount: "serviceAccountToReplace", UseCanary: false, }) - existingService := generateService(v1.NamespaceDefault) + existingService := generateService(&Options{Namespace: v1.NamespaceDefault}) fc := &fake.Clientset{} fc.AddReactor("get", "deployments", func(action testcore.Action) (bool, runtime.Object, error) { @@ -587,7 +587,7 @@ func TestUpgrade_canaryServer(t *testing.T) { ServiceAccount: "serviceAccountToReplace", UseCanary: false, }) - existingService := generateService(v1.NamespaceDefault) + existingService := generateService(&Options{Namespace: v1.NamespaceDefault}) fc := &fake.Clientset{} fc.AddReactor("get", "deployments", func(action testcore.Action) (bool, runtime.Object, error) { diff --git a/cmd/helm/installer/options.go b/cmd/helm/installer/options.go index 00cadac07..e3774dd8f 100644 --- a/cmd/helm/installer/options.go +++ b/cmd/helm/installer/options.go @@ -102,6 +102,12 @@ type Options struct { // Set merges additional values into the Tiller Deployment manifest. Values []string + + // TillerPort sets the gRPC port Tiller will listen on + TillerPort int32 + + // TillerProbePort sets the probe port Tiller will listen on + TillerProbePort int32 } // SelectImage returns the image according to whether UseCanary is true or not diff --git a/docs/helm/helm_init.md b/docs/helm/helm_init.md index 64f8bcf62..1fd26b427 100644 --- a/docs/helm/helm_init.md +++ b/docs/helm/helm_init.md @@ -49,6 +49,8 @@ helm init [flags] --skip-refresh Do not refresh (download) the local repository cache --stable-repo-url string URL for stable repository (default "https://kubernetes-charts.storage.googleapis.com") -i, --tiller-image string Override Tiller image + --tiller-port int32 Override Tiller port (default 44134) + --tiller-probe-port int32 Override Tiller probe port (default 44135) --tiller-tls Install Tiller with TLS enabled --tiller-tls-cert string Path to TLS certificate file to install with Tiller --tiller-tls-hostname string The server name used to verify the hostname on the returned certificates from Tiller @@ -75,4 +77,4 @@ helm init [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 16-May-2019 +###### Auto generated by spf13/cobra on 5-Jun-2019