Skip to content

Commit bb34ae4

Browse files
Merge pull request #19383 from mfojtik/up-40-volumes
up: copy configs to remote host
2 parents c3d0a82 + 0252f6e commit bb34ae4

File tree

7 files changed

+204
-50
lines changed

7 files changed

+204
-50
lines changed

pkg/oc/bootstrap/clusteradd/cmd.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ func NewCmdAdd(name, fullName string, out, errout io.Writer) *cobra.Command {
111111
// Start runs the start tasks ensuring that they are executed in sequence
112112
func (c *ClusterAddConfig) Run() error {
113113
componentsToInstall := []componentinstall.Component{}
114-
installContext, err := componentinstall.NewComponentInstallContext(c.openshiftImage(), c.imageFormat(), c.BaseDir, c.ServerLogLevel)
114+
installContext, err := componentinstall.NewComponentInstallContext(c.openshiftImage(), c.imageFormat(), c.BaseDir,
115+
c.ServerLogLevel)
115116
if err != nil {
116117
return err
117118
}

pkg/oc/bootstrap/clusteradd/components/registry/registry_install.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package registry
22

33
import (
44
"fmt"
5+
"os"
56
"path"
67

78
"github.com/openshift/origin/pkg/oc/bootstrap/clusteradd/componentinstall"
89
"github.com/openshift/origin/pkg/oc/bootstrap/clusterup/kubeapiserver"
910
"github.com/openshift/origin/pkg/oc/bootstrap/docker/dockerhelper"
11+
"github.com/openshift/origin/pkg/oc/bootstrap/docker/host"
1012
"github.com/openshift/origin/pkg/oc/bootstrap/docker/run"
1113
"github.com/openshift/origin/pkg/oc/errors"
1214
apierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -48,7 +50,13 @@ func (r *RegistryComponentOptions) Install(dockerClient dockerhelper.Interface,
4850
return err
4951
}
5052

51-
masterConfigDir := path.Join(r.InstallContext.BaseDir(), kubeapiserver.KubeAPIServerDirName)
53+
// If docker is on remote host, the base dir is different.
54+
baseDir := r.InstallContext.BaseDir()
55+
if len(os.Getenv("DOCKER_HOST")) > 0 {
56+
baseDir = path.Join(host.RemoteHostOriginDir, r.InstallContext.BaseDir())
57+
}
58+
59+
masterConfigDir := path.Join(baseDir, kubeapiserver.KubeAPIServerDirName)
5260
flags := []string{
5361
"adm",
5462
"registry",

pkg/oc/bootstrap/clusteradd/components/router/router_install.go

+15
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
goruntime "runtime"
1212

1313
"github.com/golang/glog"
14+
"github.com/openshift/origin/pkg/oc/bootstrap/docker/host"
1415

1516
apierrors "k8s.io/apimachinery/pkg/api/errors"
1617
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -110,7 +111,21 @@ func (c *RouterComponentOptions) Install(dockerClient dockerhelper.Interface, lo
110111
return errors.NewError("cannot create aggregate router cert").WithCause(err)
111112
}
112113

114+
dockerHelper := dockerhelper.NewHelper(dockerClient)
115+
116+
// This snowflake makes sure that when the Docker is on remote host, we copy the generated cert into
117+
// the Docker host master config dir.
118+
if len(os.Getenv("DOCKER_HOST")) > 0 {
119+
hostHelper := host.NewHostHelper(dockerHelper, c.InstallContext.ClientImage())
120+
remoteMasterConfigDir := path.Join(host.RemoteHostOriginDir, c.InstallContext.BaseDir(), kubeapiserver.KubeAPIServerDirName)
121+
if err := hostHelper.CopyToHost(masterConfigDir, remoteMasterConfigDir); err != nil {
122+
return err
123+
}
124+
masterConfigDir = remoteMasterConfigDir
125+
}
126+
113127
routerCertPath := masterConfigDir + "/router.pem"
128+
114129
flags := []string{
115130
"adm", "router",
116131
"--host-ports=true",

pkg/oc/bootstrap/docker/down.go

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ func (c *ClientStopConfig) Stop() error {
6161
if err = helper.StopAndRemoveContainer(openshift.ContainerName); err != nil {
6262
glog.V(2).Infof("Error stopping origin container: %v", err)
6363
}
64+
6465
names, err := helper.ListContainerNames()
6566
if err != nil {
6667
return err

pkg/oc/bootstrap/docker/host/host.go

+60-11
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ package host
22

33
import (
44
"fmt"
5+
"path"
56

7+
"github.com/docker/docker/api/types"
8+
"github.com/golang/glog"
69
"github.com/openshift/origin/pkg/oc/bootstrap/docker/dockerhelper"
710
"github.com/openshift/origin/pkg/oc/bootstrap/docker/errors"
811
"github.com/openshift/origin/pkg/oc/bootstrap/docker/run"
@@ -17,24 +20,25 @@ nsenter --mount=/rootfs/proc/1/ns/mnt mkdir -p %[1]s
1720
grep -F %[1]s /rootfs/proc/1/mountinfo || nsenter --mount=/rootfs/proc/1/ns/mnt mount -o bind %[1]s %[1]s
1821
grep -F %[1]s /rootfs/proc/1/mountinfo | grep shared || nsenter --mount=/rootfs/proc/1/ns/mnt mount --make-shared %[1]s
1922
`
23+
24+
// RemoteHostOriginDir is a directory on the remote machine that runs Docker
25+
RemoteHostOriginDir = "/var/lib/origin/cluster-up"
2026
)
2127

2228
// HostHelper contains methods to help check settings on a Docker host machine
2329
// using a privileged container
2430
type HostHelper struct {
25-
client dockerhelper.Interface
26-
runHelper *run.RunHelper
27-
image string
28-
volumesDir string
31+
client dockerhelper.Interface
32+
runHelper *run.RunHelper
33+
image string
2934
}
3035

3136
// NewHostHelper creates a new HostHelper
32-
func NewHostHelper(dockerHelper *dockerhelper.Helper, image, volumesDir string) *HostHelper {
37+
func NewHostHelper(dockerHelper *dockerhelper.Helper, image string) *HostHelper {
3338
return &HostHelper{
34-
runHelper: run.NewRunHelper(dockerHelper),
35-
client: dockerHelper.Client(),
36-
image: image,
37-
volumesDir: volumesDir,
39+
runHelper: run.NewRunHelper(dockerHelper),
40+
client: dockerHelper.Client(),
41+
image: image,
3842
}
3943
}
4044

@@ -50,10 +54,55 @@ func (h *HostHelper) CanUseNsenterMounter() (bool, error) {
5054
return err == nil && rc == 0, err
5155
}
5256

57+
func (h *HostHelper) CopyToHost(src, dst string) error {
58+
containerID, err := h.runner().
59+
Image(h.image).
60+
DiscardContainer().
61+
Privileged().
62+
HostPid().
63+
Bind("/:/rootfs:rw").
64+
Entrypoint("/bin/bash").
65+
Command("-c", fmt.Sprintf("mkdir -p /rootfs/%s && sleep infinity", dst)).Start()
66+
if err != nil {
67+
return err
68+
}
69+
defer func() {
70+
h.client.ContainerStop(containerID, 1)
71+
h.client.ContainerRemove(containerID, types.ContainerRemoveOptions{})
72+
}()
73+
err = dockerhelper.UploadFileToContainer(h.client, containerID, src, path.Join("/rootfs", dst))
74+
if err != nil {
75+
return err
76+
}
77+
glog.V(2).Infof("Succesfully copied %s to %s:%s", src, containerID, dst)
78+
return nil
79+
}
80+
81+
func (h *HostHelper) CopyFromHost(src, dst string) error {
82+
containerID, err := h.runner().
83+
Image(h.image).
84+
DiscardContainer().
85+
Privileged().
86+
HostPid().
87+
Bind("/:/rootfs:rw").
88+
Entrypoint("/bin/bash").
89+
Command("-c", "sleep infinity").Start()
90+
if err != nil {
91+
return err
92+
}
93+
defer h.client.ContainerStop(containerID, 1)
94+
err = dockerhelper.DownloadDirFromContainer(h.client, containerID, src, path.Join("/rootfs", dst))
95+
if err != nil {
96+
return err
97+
}
98+
glog.V(2).Infof("Succesfully copied %s to %s:%s", src, containerID, dst)
99+
return nil
100+
}
101+
53102
// EnsureVolumeUseShareMount ensures that the host Docker VM has a shared directory that can be used
54103
// for OpenShift volumes. This is needed for Docker for Mac.
55-
func (h *HostHelper) EnsureVolumeUseShareMount() error {
56-
cmd := fmt.Sprintf(ensureVolumeShareCmd, h.volumesDir)
104+
func (h *HostHelper) EnsureVolumeUseShareMount(volumesDir string) error {
105+
cmd := fmt.Sprintf(ensureVolumeShareCmd, volumesDir)
57106
_, rc, err := h.runner().
58107
Image(h.image).
59108
DiscardContainer().

pkg/oc/bootstrap/docker/run_self_hosted.go

+86-26
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"time"
1212

1313
"github.com/golang/glog"
14+
"github.com/openshift/origin/pkg/oc/bootstrap/docker/host"
1415
kruntime "k8s.io/apimachinery/pkg/runtime"
1516
"k8s.io/kubernetes/pkg/api/legacyscheme"
1617

@@ -34,12 +35,6 @@ import (
3435
_ "github.com/openshift/origin/pkg/api/install"
3536
)
3637

37-
// This is a special case for Docker for Mac where we need to have a directory inside the VM
38-
// that we can re-mount with --make-shared flag. We can't use the host directories mounts as
39-
// they are handled by the Docker for Mac directly (via fuse.osxfs).
40-
// TODO: Figure out how to remove this snowflake
41-
const NonLinuxHostVolumeDirPrefix = "/var/lib/origin/volumes"
42-
4338
var (
4439
// staticPodLocations should only include those pods that *must* be run statically because they
4540
// bring up the services required to run the workload controllers.
@@ -122,7 +117,7 @@ func (c *ClusterUpConfig) StartSelfHosted(out io.Writer) error {
122117
"LOGLEVEL": fmt.Sprintf("%d", c.ServerLogLevel),
123118
}
124119

125-
clientConfigBuilder, err := kclientcmd.LoadFromFile(filepath.Join(configDirs.masterConfigDir, "admin.kubeconfig"))
120+
clientConfigBuilder, err := kclientcmd.LoadFromFile(filepath.Join(c.LocalDirFor(kubeapiserver.KubeAPIServerDirName), "admin.kubeconfig"))
126121
if err != nil {
127122
return err
128123
}
@@ -133,6 +128,7 @@ func (c *ClusterUpConfig) StartSelfHosted(out io.Writer) error {
133128
return err
134129
}
135130

131+
clientConfig.Host = c.ServerIP + ":8443"
136132
// wait for the apiserver to be ready
137133
glog.Info("Waiting for the kube-apiserver to be ready.")
138134
if err := waitForHealthyKubeAPIServer(clientConfig); err != nil {
@@ -204,11 +200,29 @@ type configDirs struct {
204200
nodeConfigDir string
205201
kubeDNSConfigDir string
206202
podManifestDir string
203+
baseDir string
207204
err error
208205
}
209206

207+
// LocalDirFor returns a local directory path for the given component.
208+
func (c *ClusterUpConfig) LocalDirFor(componentName string) string {
209+
return filepath.Join(c.BaseDir, componentName)
210+
}
211+
212+
// RemoteDirFor returns a directory path on remote host
213+
func (c *ClusterUpConfig) RemoteDirFor(componentName string) string {
214+
return filepath.Join(host.RemoteHostOriginDir, c.BaseDir, componentName)
215+
}
216+
217+
func (c *ClusterUpConfig) copyToRemote(source, component string) (string, error) {
218+
if err := c.hostHelper.CopyToHost(source, c.RemoteDirFor(component)); err != nil {
219+
return "", err
220+
}
221+
return c.RemoteDirFor(component), nil
222+
}
223+
210224
func (c *ClusterUpConfig) BuildConfig() (*configDirs, error) {
211-
configLocations := &configDirs{
225+
configs := &configDirs{
212226
masterConfigDir: filepath.Join(c.BaseDir, kubeapiserver.KubeAPIServerDirName),
213227
openshiftAPIServerConfigDir: filepath.Join(c.BaseDir, kubeapiserver.OpenShiftAPIServerDirName),
214228
openshiftControllerConfigDir: filepath.Join(c.BaseDir, kubeapiserver.OpenShiftControllerManagerDirName),
@@ -217,61 +231,107 @@ func (c *ClusterUpConfig) BuildConfig() (*configDirs, error) {
217231
podManifestDir: filepath.Join(c.BaseDir, kubelet.PodManifestDirName),
218232
}
219233

220-
if _, err := os.Stat(configLocations.masterConfigDir); os.IsNotExist(err) {
234+
originalMasterConfigDir := configs.masterConfigDir
235+
originalNodeConfigDir := configs.nodeConfigDir
236+
var err error
237+
238+
if _, err := os.Stat(configs.masterConfigDir); os.IsNotExist(err) {
221239
_, err = c.makeMasterConfig()
222240
if err != nil {
223241
return nil, err
224242
}
225243
}
226-
if _, err := os.Stat(configLocations.openshiftAPIServerConfigDir); os.IsNotExist(err) {
227-
_, err = c.makeOpenShiftAPIServerConfig(configLocations.masterConfigDir)
244+
if c.isRemoteDocker {
245+
configs.masterConfigDir, err = c.copyToRemote(configs.masterConfigDir, kubeapiserver.KubeAPIServerDirName)
246+
if err != nil {
247+
return nil, err
248+
}
249+
}
250+
251+
if _, err := os.Stat(configs.openshiftAPIServerConfigDir); os.IsNotExist(err) {
252+
_, err = c.makeOpenShiftAPIServerConfig(originalMasterConfigDir)
253+
if err != nil {
254+
return nil, err
255+
}
256+
}
257+
if c.isRemoteDocker {
258+
configs.openshiftAPIServerConfigDir, err = c.copyToRemote(configs.openshiftAPIServerConfigDir, kubeapiserver.OpenShiftAPIServerDirName)
259+
if err != nil {
260+
return nil, err
261+
}
262+
}
263+
264+
if _, err := os.Stat(configs.openshiftControllerConfigDir); os.IsNotExist(err) {
265+
_, err = c.makeOpenShiftControllerConfig(originalMasterConfigDir)
266+
if err != nil {
267+
return nil, err
268+
}
269+
}
270+
if c.isRemoteDocker {
271+
configs.openshiftControllerConfigDir, err = c.copyToRemote(configs.openshiftControllerConfigDir, kubeapiserver.OpenShiftControllerManagerDirName)
228272
if err != nil {
229273
return nil, err
230274
}
231275
}
232-
if _, err := os.Stat(configLocations.openshiftControllerConfigDir); os.IsNotExist(err) {
233-
_, err = c.makeOpenShiftControllerConfig(configLocations.masterConfigDir)
276+
277+
if _, err := os.Stat(configs.nodeConfigDir); os.IsNotExist(err) {
278+
_, err = c.makeNodeConfig(configs.masterConfigDir)
234279
if err != nil {
235280
return nil, err
236281
}
237282
}
238-
if _, err := os.Stat(configLocations.nodeConfigDir); os.IsNotExist(err) {
239-
_, err = c.makeNodeConfig(configLocations.masterConfigDir)
283+
if c.isRemoteDocker {
284+
configs.nodeConfigDir, err = c.copyToRemote(configs.nodeConfigDir, kubelet.NodeConfigDirName)
240285
if err != nil {
241286
return nil, err
242287
}
243288
}
244-
if _, err := os.Stat(configLocations.kubeDNSConfigDir); os.IsNotExist(err) {
245-
_, err = c.makeKubeDNSConfig(configLocations.nodeConfigDir)
289+
290+
if _, err := os.Stat(configs.kubeDNSConfigDir); os.IsNotExist(err) {
291+
_, err = c.makeKubeDNSConfig(originalNodeConfigDir)
246292
if err != nil {
247293
return nil, err
248294
}
295+
249296
}
250-
if _, err := os.Stat(configLocations.podManifestDir); os.IsNotExist(err) {
251-
if err := os.MkdirAll(configLocations.podManifestDir, 0755); err != nil {
297+
if c.isRemoteDocker {
298+
configs.kubeDNSConfigDir, err = c.copyToRemote(configs.kubeDNSConfigDir, kubelet.KubeDNSDirName)
299+
if err != nil {
252300
return nil, err
253301
}
254302
}
255-
glog.V(2).Infof("configLocations = %#v", *configLocations)
256303

304+
if _, err := os.Stat(configs.podManifestDir); os.IsNotExist(err) {
305+
if err := os.MkdirAll(configs.podManifestDir, 0755); err != nil {
306+
return nil, err
307+
}
308+
309+
}
257310
substitutions := map[string]string{
258-
"/path/to/master/config-dir": configLocations.masterConfigDir,
259-
"/path/to/openshift-apiserver/config-dir": configLocations.openshiftAPIServerConfigDir,
311+
"/path/to/master/config-dir": configs.masterConfigDir,
312+
"/path/to/openshift-apiserver/config-dir": configs.openshiftAPIServerConfigDir,
260313
"ETCD_VOLUME": "emptyDir:\n",
261314
}
262315
if len(c.HostDataDir) > 0 {
263316
substitutions["ETCD_VOLUME"] = `hostPath:
264317
path: ` + c.HostDataDir + "\n"
265318
}
266319

267-
glog.V(2).Infof("Creating static pod definitions in %q", configLocations.podManifestDir)
320+
glog.V(2).Infof("Creating static pod definitions in %q", configs.podManifestDir)
268321
for _, staticPodLocation := range staticPodLocations {
269-
if err := staticpods.UpsertStaticPod(staticPodLocation, substitutions, configLocations.podManifestDir); err != nil {
322+
if err := staticpods.UpsertStaticPod(staticPodLocation, substitutions, configs.podManifestDir); err != nil {
323+
return nil, err
324+
}
325+
}
326+
if c.isRemoteDocker {
327+
configs.podManifestDir, err = c.copyToRemote(configs.podManifestDir, kubelet.PodManifestDirName)
328+
if err != nil {
270329
return nil, err
271330
}
272331
}
332+
glog.V(2).Infof("configLocations = %#v", *configs)
273333

274-
return configLocations, nil
334+
return configs, nil
275335
}
276336

277337
// makeMasterConfig returns the directory where a generated masterconfig lives
@@ -282,7 +342,7 @@ func (c *ClusterUpConfig) makeMasterConfig() (string, error) {
282342
container.MasterImage = c.openshiftImage()
283343
container.Args = []string{
284344
"--write-config=/var/lib/origin/openshift.local.config",
285-
"--master=127.0.0.1",
345+
fmt.Sprintf("--master=%s", c.ServerIP),
286346
fmt.Sprintf("--images=%s", c.imageFormat()),
287347
fmt.Sprintf("--dns=0.0.0.0:%d", c.DNSPort),
288348
fmt.Sprintf("--public-master=https://%s:8443", publicHost),

0 commit comments

Comments
 (0)