Merge pull request #47345 from luxas/kubeadm_move_controlplane_phase

Automatic merge from submit-queue (batch tested with PRs 46928, 47345)

kubeadm: Move directory ./master to ./phases/controlplane

**What this PR does / why we need it**:

 - Moves app/master into phases/controlplane. It should be in the phases directory, was just overlooked earlier
 - Harmonizes the import names in phases/controlplane with the similar import names in cmd/kubeadm

**Which issue this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close that issue when PR gets merged)*: fixes #

**Special notes for your reviewer**:

Please review only second and third commit, based on https://github.com/kubernetes/kubernetes/pull/47339

Targets v1.8

**Release note**:

```release-note
NONE
```
@kubernetes/sig-cluster-lifecycle-pr-reviews @timothysc @pipejakob
pull/6/head
Kubernetes Submit Queue 2017-07-04 04:37:31 -07:00 committed by GitHub
commit 9385d50100
10 changed files with 175 additions and 170 deletions

View File

@ -72,7 +72,7 @@ package_group(
packages = [ packages = [
"//cmd/kubeadm/app", "//cmd/kubeadm/app",
"//cmd/kubeadm/app/cmd", "//cmd/kubeadm/app/cmd",
"//cmd/kubeadm/app/master", "//cmd/kubeadm/app/phases/controlplane",
], ],
) )

View File

@ -35,11 +35,11 @@ filegroup(
"//cmd/kubeadm/app/constants:all-srcs", "//cmd/kubeadm/app/constants:all-srcs",
"//cmd/kubeadm/app/discovery:all-srcs", "//cmd/kubeadm/app/discovery:all-srcs",
"//cmd/kubeadm/app/images:all-srcs", "//cmd/kubeadm/app/images:all-srcs",
"//cmd/kubeadm/app/master:all-srcs",
"//cmd/kubeadm/app/node:all-srcs", "//cmd/kubeadm/app/node:all-srcs",
"//cmd/kubeadm/app/phases/addons:all-srcs", "//cmd/kubeadm/app/phases/addons:all-srcs",
"//cmd/kubeadm/app/phases/apiconfig:all-srcs", "//cmd/kubeadm/app/phases/apiconfig:all-srcs",
"//cmd/kubeadm/app/phases/certs:all-srcs", "//cmd/kubeadm/app/phases/certs:all-srcs",
"//cmd/kubeadm/app/phases/controlplane:all-srcs",
"//cmd/kubeadm/app/phases/kubeconfig:all-srcs", "//cmd/kubeadm/app/phases/kubeconfig:all-srcs",
"//cmd/kubeadm/app/phases/token:all-srcs", "//cmd/kubeadm/app/phases/token:all-srcs",
"//cmd/kubeadm/app/preflight:all-srcs", "//cmd/kubeadm/app/preflight:all-srcs",

View File

@ -28,11 +28,11 @@ go_library(
"//cmd/kubeadm/app/cmd/phases:go_default_library", "//cmd/kubeadm/app/cmd/phases:go_default_library",
"//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/constants:go_default_library",
"//cmd/kubeadm/app/discovery:go_default_library", "//cmd/kubeadm/app/discovery:go_default_library",
"//cmd/kubeadm/app/master:go_default_library",
"//cmd/kubeadm/app/node:go_default_library", "//cmd/kubeadm/app/node:go_default_library",
"//cmd/kubeadm/app/phases/addons:go_default_library", "//cmd/kubeadm/app/phases/addons:go_default_library",
"//cmd/kubeadm/app/phases/apiconfig:go_default_library", "//cmd/kubeadm/app/phases/apiconfig:go_default_library",
"//cmd/kubeadm/app/phases/certs:go_default_library", "//cmd/kubeadm/app/phases/certs:go_default_library",
"//cmd/kubeadm/app/phases/controlplane:go_default_library",
"//cmd/kubeadm/app/phases/kubeconfig:go_default_library", "//cmd/kubeadm/app/phases/kubeconfig:go_default_library",
"//cmd/kubeadm/app/phases/token:go_default_library", "//cmd/kubeadm/app/phases/token:go_default_library",
"//cmd/kubeadm/app/preflight:go_default_library", "//cmd/kubeadm/app/preflight:go_default_library",

View File

@ -32,10 +32,10 @@ import (
kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation"
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
kubemaster "k8s.io/kubernetes/cmd/kubeadm/app/master"
addonsphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/addons" addonsphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/addons"
apiconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/apiconfig" apiconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/apiconfig"
certphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs" certphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs"
controlplanephase "k8s.io/kubernetes/cmd/kubeadm/app/phases/controlplane"
kubeconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubeconfig" kubeconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubeconfig"
tokenphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/token" tokenphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/token"
"k8s.io/kubernetes/cmd/kubeadm/app/preflight" "k8s.io/kubernetes/cmd/kubeadm/app/preflight"
@ -211,12 +211,12 @@ func (i *Init) Run(out io.Writer) error {
} }
// PHASE 3: Bootstrap the control plane // PHASE 3: Bootstrap the control plane
if err := kubemaster.WriteStaticPodManifests(i.cfg); err != nil { if err := controlplanephase.WriteStaticPodManifests(i.cfg); err != nil {
return err return err
} }
adminKubeConfigPath := filepath.Join(kubeadmapi.GlobalEnvParams.KubernetesDir, kubeadmconstants.AdminKubeConfigFileName) adminKubeConfigPath := filepath.Join(kubeadmapi.GlobalEnvParams.KubernetesDir, kubeadmconstants.AdminKubeConfigFileName)
client, err := kubemaster.CreateClientAndWaitForAPI(adminKubeConfigPath) client, err := kubeadmutil.CreateClientAndWaitForAPI(adminKubeConfigPath)
if err != nil { if err != nil {
return err return err
} }
@ -225,16 +225,6 @@ func (i *Init) Run(out io.Writer) error {
return err return err
} }
// Is deployment type self-hosted?
if i.cfg.SelfHosted {
// Temporary control plane is up, now we create our self hosted control
// plane components and remove the static manifests:
fmt.Println("[self-hosted] Creating self-hosted control plane...")
if err := kubemaster.CreateSelfHostedControlPlane(i.cfg, client); err != nil {
return err
}
}
// PHASE 4: Set up the bootstrap tokens // PHASE 4: Set up the bootstrap tokens
if !i.skipTokenPrint { if !i.skipTokenPrint {
fmt.Printf("[token] Using token: %s\n", i.cfg.Token) fmt.Printf("[token] Using token: %s\n", i.cfg.Token)
@ -271,6 +261,16 @@ func (i *Init) Run(out io.Writer) error {
return err return err
} }
// Is deployment type self-hosted?
if i.cfg.SelfHosted {
// Temporary control plane is up, now we create our self hosted control
// plane components and remove the static manifests:
fmt.Println("[self-hosted] Creating self-hosted control plane...")
if err := controlplanephase.CreateSelfHostedControlPlane(i.cfg, client); err != nil {
return err
}
}
ctx := map[string]string{ ctx := map[string]string{
"KubeConfigPath": filepath.Join(kubeadmapi.GlobalEnvParams.KubernetesDir, kubeadmconstants.AdminKubeConfigFileName), "KubeConfigPath": filepath.Join(kubeadmapi.GlobalEnvParams.KubernetesDir, kubeadmconstants.AdminKubeConfigFileName),
"KubeConfigName": kubeadmconstants.AdminKubeConfigFileName, "KubeConfigName": kubeadmconstants.AdminKubeConfigFileName,

View File

@ -8,36 +8,6 @@ load(
"go_test", "go_test",
) )
go_library(
name = "go_default_library",
srcs = [
"apiclient.go",
"manifests.go",
"selfhosted.go",
],
tags = ["automanaged"],
deps = [
"//cmd/kubeadm/app/apis/kubeadm:go_default_library",
"//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library",
"//cmd/kubeadm/app/constants:go_default_library",
"//cmd/kubeadm/app/images:go_default_library",
"//cmd/kubeadm/app/util/kubeconfig:go_default_library",
"//pkg/kubeapiserver/authorizer/modes:go_default_library",
"//pkg/kubectl/cmd/util:go_default_library",
"//pkg/kubelet/types:go_default_library",
"//pkg/util/version:go_default_library",
"//vendor/github.com/ghodss/yaml:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
"//vendor/k8s.io/client-go/kubernetes:go_default_library",
],
)
go_test( go_test(
name = "go_default_test", name = "go_default_test",
srcs = ["manifests_test.go"], srcs = ["manifests_test.go"],
@ -53,6 +23,35 @@ go_test(
], ],
) )
go_library(
name = "go_default_library",
srcs = [
"manifests.go",
"selfhosted.go",
],
tags = ["automanaged"],
deps = [
"//cmd/kubeadm/app/apis/kubeadm:go_default_library",
"//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library",
"//cmd/kubeadm/app/constants:go_default_library",
"//cmd/kubeadm/app/images:go_default_library",
"//cmd/kubeadm/app/util:go_default_library",
"//pkg/kubeapiserver/authorizer/modes:go_default_library",
"//pkg/kubectl/cmd/util:go_default_library",
"//pkg/kubelet/types:go_default_library",
"//pkg/util/version:go_default_library",
"//vendor/github.com/ghodss/yaml:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
"//vendor/k8s.io/client-go/kubernetes:go_default_library",
],
)
filegroup( filegroup(
name = "package-srcs", name = "package-srcs",
srcs = glob(["**"]), srcs = glob(["**"]),

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package master package controlplane
import ( import (
"bytes" "bytes"
@ -25,7 +25,7 @@ import (
"github.com/ghodss/yaml" "github.com/ghodss/yaml"
api "k8s.io/api/core/v1" "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/intstr"
@ -55,8 +55,8 @@ const (
// WriteStaticPodManifests builds manifest objects based on user provided configuration and then dumps it to disk // WriteStaticPodManifests builds manifest objects based on user provided configuration and then dumps it to disk
// where kubelet will pick and schedule them. // where kubelet will pick and schedule them.
func WriteStaticPodManifests(cfg *kubeadmapi.MasterConfiguration) error { func WriteStaticPodManifests(cfg *kubeadmapi.MasterConfiguration) error {
volumes := []api.Volume{k8sVolume()} volumes := []v1.Volume{k8sVolume()}
volumeMounts := []api.VolumeMount{k8sVolumeMount()} volumeMounts := []v1.VolumeMount{k8sVolumeMount()}
if isCertsVolumeMountNeeded() { if isCertsVolumeMountNeeded() {
volumes = append(volumes, certsVolume(cfg)) volumes = append(volumes, certsVolume(cfg))
@ -79,31 +79,31 @@ func WriteStaticPodManifests(cfg *kubeadmapi.MasterConfiguration) error {
} }
// Prepare static pod specs // Prepare static pod specs
staticPodSpecs := map[string]api.Pod{ staticPodSpecs := map[string]v1.Pod{
kubeAPIServer: componentPod(api.Container{ kubeAPIServer: componentPod(v1.Container{
Name: kubeAPIServer, Name: kubeAPIServer,
Image: images.GetCoreImage(images.KubeAPIServerImage, cfg, kubeadmapi.GlobalEnvParams.HyperkubeImage), Image: images.GetCoreImage(images.KubeAPIServerImage, cfg, kubeadmapi.GlobalEnvParams.HyperkubeImage),
Command: getAPIServerCommand(cfg, false, k8sVersion), Command: getAPIServerCommand(cfg, false, k8sVersion),
VolumeMounts: volumeMounts, VolumeMounts: volumeMounts,
LivenessProbe: componentProbe(int(cfg.API.BindPort), "/healthz", api.URISchemeHTTPS), LivenessProbe: componentProbe(int(cfg.API.BindPort), "/healthz", v1.URISchemeHTTPS),
Resources: componentResources("250m"), Resources: componentResources("250m"),
Env: getProxyEnvVars(), Env: getProxyEnvVars(),
}, volumes...), }, volumes...),
kubeControllerManager: componentPod(api.Container{ kubeControllerManager: componentPod(v1.Container{
Name: kubeControllerManager, Name: kubeControllerManager,
Image: images.GetCoreImage(images.KubeControllerManagerImage, cfg, kubeadmapi.GlobalEnvParams.HyperkubeImage), Image: images.GetCoreImage(images.KubeControllerManagerImage, cfg, kubeadmapi.GlobalEnvParams.HyperkubeImage),
Command: getControllerManagerCommand(cfg, false, k8sVersion), Command: getControllerManagerCommand(cfg, false, k8sVersion),
VolumeMounts: volumeMounts, VolumeMounts: volumeMounts,
LivenessProbe: componentProbe(10252, "/healthz", api.URISchemeHTTP), LivenessProbe: componentProbe(10252, "/healthz", v1.URISchemeHTTP),
Resources: componentResources("200m"), Resources: componentResources("200m"),
Env: getProxyEnvVars(), Env: getProxyEnvVars(),
}, volumes...), }, volumes...),
kubeScheduler: componentPod(api.Container{ kubeScheduler: componentPod(v1.Container{
Name: kubeScheduler, Name: kubeScheduler,
Image: images.GetCoreImage(images.KubeSchedulerImage, cfg, kubeadmapi.GlobalEnvParams.HyperkubeImage), Image: images.GetCoreImage(images.KubeSchedulerImage, cfg, kubeadmapi.GlobalEnvParams.HyperkubeImage),
Command: getSchedulerCommand(cfg, false), Command: getSchedulerCommand(cfg, false),
VolumeMounts: []api.VolumeMount{k8sVolumeMount()}, VolumeMounts: []v1.VolumeMount{k8sVolumeMount()},
LivenessProbe: componentProbe(10251, "/healthz", api.URISchemeHTTP), LivenessProbe: componentProbe(10251, "/healthz", v1.URISchemeHTTP),
Resources: componentResources("100m"), Resources: componentResources("100m"),
Env: getProxyEnvVars(), Env: getProxyEnvVars(),
}, k8sVolume()), }, k8sVolume()),
@ -111,16 +111,16 @@ func WriteStaticPodManifests(cfg *kubeadmapi.MasterConfiguration) error {
// Add etcd static pod spec only if external etcd is not configured // Add etcd static pod spec only if external etcd is not configured
if len(cfg.Etcd.Endpoints) == 0 { if len(cfg.Etcd.Endpoints) == 0 {
etcdPod := componentPod(api.Container{ etcdPod := componentPod(v1.Container{
Name: etcd, Name: etcd,
Command: getEtcdCommand(cfg), Command: getEtcdCommand(cfg),
VolumeMounts: []api.VolumeMount{certsVolumeMount(), etcdVolumeMount(cfg.Etcd.DataDir), k8sVolumeMount()}, VolumeMounts: []v1.VolumeMount{certsVolumeMount(), etcdVolumeMount(cfg.Etcd.DataDir), k8sVolumeMount()},
Image: images.GetCoreImage(images.KubeEtcdImage, cfg, kubeadmapi.GlobalEnvParams.EtcdImage), Image: images.GetCoreImage(images.KubeEtcdImage, cfg, kubeadmapi.GlobalEnvParams.EtcdImage),
LivenessProbe: componentProbe(2379, "/health", api.URISchemeHTTP), LivenessProbe: componentProbe(2379, "/health", v1.URISchemeHTTP),
}, certsVolume(cfg), etcdVolume(cfg), k8sVolume()) }, certsVolume(cfg), etcdVolume(cfg), k8sVolume())
etcdPod.Spec.SecurityContext = &api.PodSecurityContext{ etcdPod.Spec.SecurityContext = &v1.PodSecurityContext{
SELinuxOptions: &api.SELinuxOptions{ SELinuxOptions: &v1.SELinuxOptions{
// Unconfine the etcd container so it can write to the data dir with SELinux enforcing: // Unconfine the etcd container so it can write to the data dir with SELinux enforcing:
Type: "spc_t", Type: "spc_t",
}, },
@ -146,34 +146,34 @@ func WriteStaticPodManifests(cfg *kubeadmapi.MasterConfiguration) error {
return nil return nil
} }
func newVolume(name, path string) api.Volume { func newVolume(name, path string) v1.Volume {
return api.Volume{ return v1.Volume{
Name: name, Name: name,
VolumeSource: api.VolumeSource{ VolumeSource: v1.VolumeSource{
HostPath: &api.HostPathVolumeSource{Path: path}, HostPath: &v1.HostPathVolumeSource{Path: path},
}, },
} }
} }
func newVolumeMount(name, path string) api.VolumeMount { func newVolumeMount(name, path string) v1.VolumeMount {
return api.VolumeMount{ return v1.VolumeMount{
Name: name, Name: name,
MountPath: path, MountPath: path,
} }
} }
// etcdVolume exposes a path on the host in order to guarantee data survival during reboot. // etcdVolume exposes a path on the host in order to guarantee data survival during reboot.
func etcdVolume(cfg *kubeadmapi.MasterConfiguration) api.Volume { func etcdVolume(cfg *kubeadmapi.MasterConfiguration) v1.Volume {
return api.Volume{ return v1.Volume{
Name: "etcd", Name: "etcd",
VolumeSource: api.VolumeSource{ VolumeSource: v1.VolumeSource{
HostPath: &api.HostPathVolumeSource{Path: cfg.Etcd.DataDir}, HostPath: &v1.HostPathVolumeSource{Path: cfg.Etcd.DataDir},
}, },
} }
} }
func etcdVolumeMount(dataDir string) api.VolumeMount { func etcdVolumeMount(dataDir string) v1.VolumeMount {
return api.VolumeMount{ return v1.VolumeMount{
Name: "etcd", Name: "etcd",
MountPath: dataDir, MountPath: dataDir,
} }
@ -186,18 +186,18 @@ func isCertsVolumeMountNeeded() bool {
} }
// certsVolume exposes host SSL certificates to pod containers. // certsVolume exposes host SSL certificates to pod containers.
func certsVolume(cfg *kubeadmapi.MasterConfiguration) api.Volume { func certsVolume(cfg *kubeadmapi.MasterConfiguration) v1.Volume {
return api.Volume{ return v1.Volume{
Name: "certs", Name: "certs",
VolumeSource: api.VolumeSource{ VolumeSource: v1.VolumeSource{
// TODO(phase1+) make path configurable // TODO(phase1+) make path configurable
HostPath: &api.HostPathVolumeSource{Path: "/etc/ssl/certs"}, HostPath: &v1.HostPathVolumeSource{Path: "/etc/ssl/certs"},
}, },
} }
} }
func certsVolumeMount() api.VolumeMount { func certsVolumeMount() v1.VolumeMount {
return api.VolumeMount{ return v1.VolumeMount{
Name: "certs", Name: "certs",
MountPath: "/etc/ssl/certs", MountPath: "/etc/ssl/certs",
} }
@ -212,69 +212,69 @@ func isPkiVolumeMountNeeded() bool {
return false return false
} }
func pkiVolume() api.Volume { func pkiVolume() v1.Volume {
return api.Volume{ return v1.Volume{
Name: "pki", Name: "pki",
VolumeSource: api.VolumeSource{ VolumeSource: v1.VolumeSource{
// TODO(phase1+) make path configurable // TODO(phase1+) make path configurable
HostPath: &api.HostPathVolumeSource{Path: "/etc/pki"}, HostPath: &v1.HostPathVolumeSource{Path: "/etc/pki"},
}, },
} }
} }
func pkiVolumeMount() api.VolumeMount { func pkiVolumeMount() v1.VolumeMount {
return api.VolumeMount{ return v1.VolumeMount{
Name: "pki", Name: "pki",
MountPath: "/etc/pki", MountPath: "/etc/pki",
} }
} }
func flockVolume() api.Volume { func flockVolume() v1.Volume {
return api.Volume{ return v1.Volume{
Name: "var-lock", Name: "var-lock",
VolumeSource: api.VolumeSource{ VolumeSource: v1.VolumeSource{
HostPath: &api.HostPathVolumeSource{Path: "/var/lock"}, HostPath: &v1.HostPathVolumeSource{Path: "/var/lock"},
}, },
} }
} }
func flockVolumeMount() api.VolumeMount { func flockVolumeMount() v1.VolumeMount {
return api.VolumeMount{ return v1.VolumeMount{
Name: "var-lock", Name: "var-lock",
MountPath: "/var/lock", MountPath: "/var/lock",
ReadOnly: false, ReadOnly: false,
} }
} }
func k8sVolume() api.Volume { func k8sVolume() v1.Volume {
return api.Volume{ return v1.Volume{
Name: "k8s", Name: "k8s",
VolumeSource: api.VolumeSource{ VolumeSource: v1.VolumeSource{
HostPath: &api.HostPathVolumeSource{Path: kubeadmapi.GlobalEnvParams.KubernetesDir}, HostPath: &v1.HostPathVolumeSource{Path: kubeadmapi.GlobalEnvParams.KubernetesDir},
}, },
} }
} }
func k8sVolumeMount() api.VolumeMount { func k8sVolumeMount() v1.VolumeMount {
return api.VolumeMount{ return v1.VolumeMount{
Name: "k8s", Name: "k8s",
MountPath: kubeadmapi.GlobalEnvParams.KubernetesDir, MountPath: kubeadmapi.GlobalEnvParams.KubernetesDir,
ReadOnly: true, ReadOnly: true,
} }
} }
func componentResources(cpu string) api.ResourceRequirements { func componentResources(cpu string) v1.ResourceRequirements {
return api.ResourceRequirements{ return v1.ResourceRequirements{
Requests: api.ResourceList{ Requests: v1.ResourceList{
api.ResourceName(api.ResourceCPU): resource.MustParse(cpu), v1.ResourceName(v1.ResourceCPU): resource.MustParse(cpu),
}, },
} }
} }
func componentProbe(port int, path string, scheme api.URIScheme) *api.Probe { func componentProbe(port int, path string, scheme v1.URIScheme) *v1.Probe {
return &api.Probe{ return &v1.Probe{
Handler: api.Handler{ Handler: v1.Handler{
HTTPGet: &api.HTTPGetAction{ HTTPGet: &v1.HTTPGetAction{
Host: "127.0.0.1", Host: "127.0.0.1",
Path: path, Path: path,
Port: intstr.FromInt(port), Port: intstr.FromInt(port),
@ -287,8 +287,8 @@ func componentProbe(port int, path string, scheme api.URIScheme) *api.Probe {
} }
} }
func componentPod(container api.Container, volumes ...api.Volume) api.Pod { func componentPod(container v1.Container, volumes ...v1.Volume) v1.Pod {
return api.Pod{ return v1.Pod{
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
APIVersion: "v1", APIVersion: "v1",
Kind: "Pod", Kind: "Pod",
@ -299,8 +299,8 @@ func componentPod(container api.Container, volumes ...api.Volume) api.Pod {
Annotations: map[string]string{kubetypes.CriticalPodAnnotationKey: ""}, Annotations: map[string]string{kubetypes.CriticalPodAnnotationKey: ""},
Labels: map[string]string{"component": container.Name, "tier": "control-plane"}, Labels: map[string]string{"component": container.Name, "tier": "control-plane"},
}, },
Spec: api.PodSpec{ Spec: v1.PodSpec{
Containers: []api.Container{container}, Containers: []v1.Container{container},
HostNetwork: true, HostNetwork: true,
Volumes: volumes, Volumes: volumes,
}, },
@ -429,8 +429,8 @@ func getSchedulerCommand(cfg *kubeadmapi.MasterConfiguration, selfHosted bool) [
return command return command
} }
func getProxyEnvVars() []api.EnvVar { func getProxyEnvVars() []v1.EnvVar {
envs := []api.EnvVar{} envs := []v1.EnvVar{}
for _, env := range os.Environ() { for _, env := range os.Environ() {
pos := strings.Index(env, "=") pos := strings.Index(env, "=")
if pos == -1 { if pos == -1 {
@ -440,18 +440,18 @@ func getProxyEnvVars() []api.EnvVar {
name := env[:pos] name := env[:pos]
value := env[pos+1:] value := env[pos+1:]
if strings.HasSuffix(strings.ToLower(name), "_proxy") && value != "" { if strings.HasSuffix(strings.ToLower(name), "_proxy") && value != "" {
envVar := api.EnvVar{Name: name, Value: value} envVar := v1.EnvVar{Name: name, Value: value}
envs = append(envs, envVar) envs = append(envs, envVar)
} }
} }
return envs return envs
} }
func getSelfHostedAPIServerEnv() []api.EnvVar { func getSelfHostedAPIServerEnv() []v1.EnvVar {
podIPEnvVar := api.EnvVar{ podIPEnvVar := v1.EnvVar{
Name: "POD_IP", Name: "POD_IP",
ValueFrom: &api.EnvVarSource{ ValueFrom: &v1.EnvVarSource{
FieldRef: &api.ObjectFieldSelector{ FieldRef: &v1.ObjectFieldSelector{
FieldPath: "status.podIP", FieldPath: "status.podIP",
}, },
}, },

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package master package controlplane
import ( import (
"fmt" "fmt"
@ -25,7 +25,7 @@ import (
"sort" "sort"
"testing" "testing"
api "k8s.io/api/core/v1" "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/apimachinery/pkg/util/yaml" "k8s.io/apimachinery/pkg/util/yaml"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
@ -93,7 +93,7 @@ func TestWriteStaticPodManifests(t *testing.T) {
} }
defer manifest.Close() defer manifest.Close()
var pod api.Pod var pod v1.Pod
d := yaml.NewYAMLOrJSONDecoder(manifest, 4096) d := yaml.NewYAMLOrJSONDecoder(manifest, 4096)
if err := d.Decode(&pod); err != nil { if err := d.Decode(&pod); err != nil {
t.Error("WriteStaticPodManifests: error decoding manifests/kube-apiserver.yaml into Pod") t.Error("WriteStaticPodManifests: error decoding manifests/kube-apiserver.yaml into Pod")
@ -131,15 +131,15 @@ func TestNewVolume(t *testing.T) {
var tests = []struct { var tests = []struct {
name string name string
path string path string
expected api.Volume expected v1.Volume
}{ }{
{ {
name: "foo", name: "foo",
path: "/etc/foo", path: "/etc/foo",
expected: api.Volume{ expected: v1.Volume{
Name: "foo", Name: "foo",
VolumeSource: api.VolumeSource{ VolumeSource: v1.VolumeSource{
HostPath: &api.HostPathVolumeSource{Path: "/etc/foo"}, HostPath: &v1.HostPathVolumeSource{Path: "/etc/foo"},
}}, }},
}, },
} }
@ -167,12 +167,12 @@ func TestNewVolumeMount(t *testing.T) {
var tests = []struct { var tests = []struct {
name string name string
path string path string
expected api.VolumeMount expected v1.VolumeMount
}{ }{
{ {
name: "foo", name: "foo",
path: "/etc/foo", path: "/etc/foo",
expected: api.VolumeMount{ expected: v1.VolumeMount{
Name: "foo", Name: "foo",
MountPath: "/etc/foo", MountPath: "/etc/foo",
}, },
@ -201,16 +201,16 @@ func TestNewVolumeMount(t *testing.T) {
func TestEtcdVolume(t *testing.T) { func TestEtcdVolume(t *testing.T) {
var tests = []struct { var tests = []struct {
cfg *kubeadmapi.MasterConfiguration cfg *kubeadmapi.MasterConfiguration
expected api.Volume expected v1.Volume
}{ }{
{ {
cfg: &kubeadmapi.MasterConfiguration{ cfg: &kubeadmapi.MasterConfiguration{
Etcd: kubeadmapi.Etcd{DataDir: etcdDataDir}, Etcd: kubeadmapi.Etcd{DataDir: etcdDataDir},
}, },
expected: api.Volume{ expected: v1.Volume{
Name: "etcd", Name: "etcd",
VolumeSource: api.VolumeSource{ VolumeSource: v1.VolumeSource{
HostPath: &api.HostPathVolumeSource{Path: etcdDataDir}, HostPath: &v1.HostPathVolumeSource{Path: etcdDataDir},
}}, }},
}, },
} }
@ -236,10 +236,10 @@ func TestEtcdVolume(t *testing.T) {
func TestEtcdVolumeMount(t *testing.T) { func TestEtcdVolumeMount(t *testing.T) {
var tests = []struct { var tests = []struct {
expected api.VolumeMount expected v1.VolumeMount
}{ }{
{ {
expected: api.VolumeMount{ expected: v1.VolumeMount{
Name: "etcd", Name: "etcd",
MountPath: etcdDataDir, MountPath: etcdDataDir,
}, },
@ -268,14 +268,14 @@ func TestEtcdVolumeMount(t *testing.T) {
func TestCertsVolume(t *testing.T) { func TestCertsVolume(t *testing.T) {
var tests = []struct { var tests = []struct {
cfg *kubeadmapi.MasterConfiguration cfg *kubeadmapi.MasterConfiguration
expected api.Volume expected v1.Volume
}{ }{
{ {
cfg: &kubeadmapi.MasterConfiguration{}, cfg: &kubeadmapi.MasterConfiguration{},
expected: api.Volume{ expected: v1.Volume{
Name: "certs", Name: "certs",
VolumeSource: api.VolumeSource{ VolumeSource: v1.VolumeSource{
HostPath: &api.HostPathVolumeSource{ HostPath: &v1.HostPathVolumeSource{
Path: "/etc/ssl/certs"}, Path: "/etc/ssl/certs"},
}}, }},
}, },
@ -302,10 +302,10 @@ func TestCertsVolume(t *testing.T) {
func TestCertsVolumeMount(t *testing.T) { func TestCertsVolumeMount(t *testing.T) {
var tests = []struct { var tests = []struct {
expected api.VolumeMount expected v1.VolumeMount
}{ }{
{ {
expected: api.VolumeMount{ expected: v1.VolumeMount{
Name: "certs", Name: "certs",
MountPath: "/etc/ssl/certs", MountPath: "/etc/ssl/certs",
}, },
@ -333,13 +333,13 @@ func TestCertsVolumeMount(t *testing.T) {
func TestK8sVolume(t *testing.T) { func TestK8sVolume(t *testing.T) {
var tests = []struct { var tests = []struct {
expected api.Volume expected v1.Volume
}{ }{
{ {
expected: api.Volume{ expected: v1.Volume{
Name: "k8s", Name: "k8s",
VolumeSource: api.VolumeSource{ VolumeSource: v1.VolumeSource{
HostPath: &api.HostPathVolumeSource{ HostPath: &v1.HostPathVolumeSource{
Path: kubeadmapi.GlobalEnvParams.KubernetesDir}, Path: kubeadmapi.GlobalEnvParams.KubernetesDir},
}}, }},
}, },
@ -366,10 +366,10 @@ func TestK8sVolume(t *testing.T) {
func TestK8sVolumeMount(t *testing.T) { func TestK8sVolumeMount(t *testing.T) {
var tests = []struct { var tests = []struct {
expected api.VolumeMount expected v1.VolumeMount
}{ }{
{ {
expected: api.VolumeMount{ expected: v1.VolumeMount{
Name: "k8s", Name: "k8s",
MountPath: kubeadmapi.GlobalEnvParams.KubernetesDir, MountPath: kubeadmapi.GlobalEnvParams.KubernetesDir,
ReadOnly: true, ReadOnly: true,
@ -416,17 +416,17 @@ func TestComponentProbe(t *testing.T) {
var tests = []struct { var tests = []struct {
port int port int
path string path string
scheme api.URIScheme scheme v1.URIScheme
}{ }{
{ {
port: 1, port: 1,
path: "foo", path: "foo",
scheme: api.URISchemeHTTP, scheme: v1.URISchemeHTTP,
}, },
{ {
port: 2, port: 2,
path: "bar", path: "bar",
scheme: api.URISchemeHTTPS, scheme: v1.URISchemeHTTPS,
}, },
} }
for _, rt := range tests { for _, rt := range tests {
@ -465,8 +465,8 @@ func TestComponentPod(t *testing.T) {
} }
for _, rt := range tests { for _, rt := range tests {
c := api.Container{Name: rt.n} c := v1.Container{Name: rt.n}
v := api.Volume{} v := v1.Volume{}
actual := componentPod(c, v) actual := componentPod(c, v)
if actual.ObjectMeta.Name != rt.n { if actual.ObjectMeta.Name != rt.n {
t.Errorf( t.Errorf(

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package master package controlplane
import ( import (
"fmt" "fmt"
@ -23,7 +23,7 @@ import (
"time" "time"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
ext "k8s.io/api/extensions/v1beta1" extensions "k8s.io/api/extensions/v1beta1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
@ -31,6 +31,7 @@ import (
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
"k8s.io/kubernetes/cmd/kubeadm/app/images" "k8s.io/kubernetes/cmd/kubeadm/app/images"
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
"k8s.io/kubernetes/pkg/util/version" "k8s.io/kubernetes/pkg/util/version"
) )
@ -115,7 +116,7 @@ func launchSelfHostedAPIServer(cfg *kubeadmapi.MasterConfiguration, client *clie
return fmt.Errorf("unable to delete temporary API server manifest [%v]", err) return fmt.Errorf("unable to delete temporary API server manifest [%v]", err)
} }
WaitForAPI(client) kubeadmutil.WaitForAPI(client)
fmt.Printf("[self-hosted] self-hosted kube-apiserver ready after %f seconds\n", time.Since(start).Seconds()) fmt.Printf("[self-hosted] self-hosted kube-apiserver ready after %f seconds\n", time.Since(start).Seconds())
return nil return nil
@ -193,8 +194,8 @@ func waitForPodsWithLabel(client *clientset.Clientset, appLabel string, mustBeRu
} }
// Sources from bootkube templates.go // Sources from bootkube templates.go
func getAPIServerDS(cfg *kubeadmapi.MasterConfiguration, volumes []v1.Volume, volumeMounts []v1.VolumeMount, kubeVersion *version.Version) ext.DaemonSet { func getAPIServerDS(cfg *kubeadmapi.MasterConfiguration, volumes []v1.Volume, volumeMounts []v1.VolumeMount, kubeVersion *version.Version) extensions.DaemonSet {
ds := ext.DaemonSet{ ds := extensions.DaemonSet{
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
APIVersion: "extensions/v1beta1", APIVersion: "extensions/v1beta1",
Kind: "DaemonSet", Kind: "DaemonSet",
@ -204,7 +205,7 @@ func getAPIServerDS(cfg *kubeadmapi.MasterConfiguration, volumes []v1.Volume, vo
Namespace: "kube-system", Namespace: "kube-system",
Labels: map[string]string{"k8s-app": "self-hosted-" + kubeAPIServer}, Labels: map[string]string{"k8s-app": "self-hosted-" + kubeAPIServer},
}, },
Spec: ext.DaemonSetSpec{ Spec: extensions.DaemonSetSpec{
Template: v1.PodTemplateSpec{ Template: v1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{ Labels: map[string]string{
@ -237,8 +238,8 @@ func getAPIServerDS(cfg *kubeadmapi.MasterConfiguration, volumes []v1.Volume, vo
return ds return ds
} }
func getControllerManagerDeployment(cfg *kubeadmapi.MasterConfiguration, volumes []v1.Volume, volumeMounts []v1.VolumeMount, kubeVersion *version.Version) ext.Deployment { func getControllerManagerDeployment(cfg *kubeadmapi.MasterConfiguration, volumes []v1.Volume, volumeMounts []v1.VolumeMount, kubeVersion *version.Version) extensions.Deployment {
d := ext.Deployment{ d := extensions.Deployment{
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
APIVersion: "extensions/v1beta1", APIVersion: "extensions/v1beta1",
Kind: "Deployment", Kind: "Deployment",
@ -248,11 +249,11 @@ func getControllerManagerDeployment(cfg *kubeadmapi.MasterConfiguration, volumes
Namespace: "kube-system", Namespace: "kube-system",
Labels: map[string]string{"k8s-app": "self-hosted-" + kubeControllerManager}, Labels: map[string]string{"k8s-app": "self-hosted-" + kubeControllerManager},
}, },
Spec: ext.DeploymentSpec{ Spec: extensions.DeploymentSpec{
// TODO bootkube uses 2 replicas // TODO bootkube uses 2 replicas
Strategy: ext.DeploymentStrategy{ Strategy: extensions.DeploymentStrategy{
Type: ext.RollingUpdateDeploymentStrategyType, Type: extensions.RollingUpdateDeploymentStrategyType,
RollingUpdate: &ext.RollingUpdateDeployment{ RollingUpdate: &extensions.RollingUpdateDeployment{
MaxUnavailable: &maxUnavailable, MaxUnavailable: &maxUnavailable,
MaxSurge: &maxSurge, MaxSurge: &maxSurge,
}, },
@ -289,8 +290,8 @@ func getControllerManagerDeployment(cfg *kubeadmapi.MasterConfiguration, volumes
return d return d
} }
func getSchedulerDeployment(cfg *kubeadmapi.MasterConfiguration, volumes []v1.Volume, volumeMounts []v1.VolumeMount) ext.Deployment { func getSchedulerDeployment(cfg *kubeadmapi.MasterConfiguration, volumes []v1.Volume, volumeMounts []v1.VolumeMount) extensions.Deployment {
d := ext.Deployment{ d := extensions.Deployment{
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
APIVersion: "extensions/v1beta1", APIVersion: "extensions/v1beta1",
Kind: "Deployment", Kind: "Deployment",
@ -300,11 +301,11 @@ func getSchedulerDeployment(cfg *kubeadmapi.MasterConfiguration, volumes []v1.Vo
Namespace: "kube-system", Namespace: "kube-system",
Labels: map[string]string{"k8s-app": "self-hosted-" + kubeScheduler}, Labels: map[string]string{"k8s-app": "self-hosted-" + kubeScheduler},
}, },
Spec: ext.DeploymentSpec{ Spec: extensions.DeploymentSpec{
// TODO bootkube uses 2 replicas // TODO bootkube uses 2 replicas
Strategy: ext.DeploymentStrategy{ Strategy: extensions.DeploymentStrategy{
Type: ext.RollingUpdateDeploymentStrategyType, Type: extensions.RollingUpdateDeploymentStrategyType,
RollingUpdate: &ext.RollingUpdateDeployment{ RollingUpdate: &extensions.RollingUpdateDeployment{
MaxUnavailable: &maxUnavailable, MaxUnavailable: &maxUnavailable,
MaxSurge: &maxSurge, MaxSurge: &maxSurge,
}, },

View File

@ -11,14 +11,19 @@ load(
go_library( go_library(
name = "go_default_library", name = "go_default_library",
srcs = [ srcs = [
"apiclient.go",
"error.go", "error.go",
"template.go", "template.go",
"version.go", "version.go",
], ],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//cmd/kubeadm/app/constants:go_default_library",
"//cmd/kubeadm/app/preflight:go_default_library", "//cmd/kubeadm/app/preflight:go_default_library",
"//cmd/kubeadm/app/util/kubeconfig:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
"//vendor/k8s.io/client-go/kubernetes:go_default_library",
], ],
) )

View File

@ -1,5 +1,5 @@
/* /*
Copyright 2016 The Kubernetes Authors. Copyright 2017 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package master package util
import ( import (
"fmt" "fmt"