Commit 57f18a0e authored by Mathieu Velten's avatar Mathieu Velten

Add a dockercfg_path parameter to the Mesos scheduler (the main purpose is to…

Add a dockercfg_path parameter to the Mesos scheduler (the main purpose is to handle private repos auth). This is implemented by copying the dockercfg file in the executor work directory.
parent dee21c89
...@@ -137,6 +137,7 @@ type SchedulerServer struct { ...@@ -137,6 +137,7 @@ type SchedulerServer struct {
KubeletSyncFrequency time.Duration KubeletSyncFrequency time.Duration
KubeletNetworkPluginName string KubeletNetworkPluginName string
StaticPodsConfigPath string StaticPodsConfigPath string
DockerCfgPath string
executable string // path to the binary running this service executable string // path to the binary running this service
client *client.Client client *client.Client
...@@ -212,6 +213,7 @@ func (s *SchedulerServer) addCoreFlags(fs *pflag.FlagSet) { ...@@ -212,6 +213,7 @@ func (s *SchedulerServer) addCoreFlags(fs *pflag.FlagSet) {
fs.StringVar(&s.MesosAuthPrincipal, "mesos-authentication-principal", s.MesosAuthPrincipal, "Mesos authentication principal.") fs.StringVar(&s.MesosAuthPrincipal, "mesos-authentication-principal", s.MesosAuthPrincipal, "Mesos authentication principal.")
fs.StringVar(&s.MesosAuthSecretFile, "mesos-authentication-secret-file", s.MesosAuthSecretFile, "Mesos authentication secret file.") fs.StringVar(&s.MesosAuthSecretFile, "mesos-authentication-secret-file", s.MesosAuthSecretFile, "Mesos authentication secret file.")
fs.StringVar(&s.MesosAuthProvider, "mesos-authentication-provider", s.MesosAuthProvider, fmt.Sprintf("Authentication provider to use, default is SASL that supports mechanisms: %+v", mech.ListSupported())) fs.StringVar(&s.MesosAuthProvider, "mesos-authentication-provider", s.MesosAuthProvider, fmt.Sprintf("Authentication provider to use, default is SASL that supports mechanisms: %+v", mech.ListSupported()))
fs.StringVar(&s.DockerCfgPath, "dockercfg-path", s.DockerCfgPath, "Path to a dockercfg file that will be used by the docker instance of the minions.")
fs.BoolVar(&s.Checkpoint, "checkpoint", s.Checkpoint, "Enable/disable checkpointing for the kubernetes-mesos framework.") fs.BoolVar(&s.Checkpoint, "checkpoint", s.Checkpoint, "Enable/disable checkpointing for the kubernetes-mesos framework.")
fs.Float64Var(&s.FailoverTimeout, "failover-timeout", s.FailoverTimeout, fmt.Sprintf("Framework failover timeout, in sec.")) fs.Float64Var(&s.FailoverTimeout, "failover-timeout", s.FailoverTimeout, fmt.Sprintf("Framework failover timeout, in sec."))
fs.UintVar(&s.DriverPort, "driver-port", s.DriverPort, "Port that the Mesos scheduler driver process should listen on.") fs.UintVar(&s.DriverPort, "driver-port", s.DriverPort, "Port that the Mesos scheduler driver process should listen on.")
...@@ -265,33 +267,39 @@ func (s *SchedulerServer) AddHyperkubeFlags(fs *pflag.FlagSet) { ...@@ -265,33 +267,39 @@ func (s *SchedulerServer) AddHyperkubeFlags(fs *pflag.FlagSet) {
// returns (downloadURI, basename(path)) // returns (downloadURI, basename(path))
func (s *SchedulerServer) serveFrameworkArtifact(path string) (string, string) { func (s *SchedulerServer) serveFrameworkArtifact(path string) (string, string) {
serveFile := func(pattern string, filename string) {
s.mux.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, filename)
})
}
// Create base path (http://foobar:5000/<base>)
pathSplit := strings.Split(path, "/") pathSplit := strings.Split(path, "/")
var base string
var basename string
if len(pathSplit) > 0 { if len(pathSplit) > 0 {
base = pathSplit[len(pathSplit)-1] basename = pathSplit[len(pathSplit)-1]
} else { } else {
base = path basename = path
}
return s.serveFrameworkArtifactWithFilename(path, basename), basename
}
// returns downloadURI
func (s *SchedulerServer) serveFrameworkArtifactWithFilename(path string, filename string) string {
serveFile := func(pattern string, filepath string) {
s.mux.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, filepath)
})
} }
serveFile("/"+base, path)
serveFile("/"+filename, path)
hostURI := "" hostURI := ""
if s.AdvertisedAddress != "" { if s.AdvertisedAddress != "" {
hostURI = fmt.Sprintf("http://%s/%s", s.AdvertisedAddress, base) hostURI = fmt.Sprintf("http://%s/%s", s.AdvertisedAddress, filename)
} else if s.HA && s.HADomain != "" { } else if s.HA && s.HADomain != "" {
hostURI = fmt.Sprintf("http://%s.%s:%d/%s", SCHEDULER_SERVICE_NAME, s.HADomain, ports.SchedulerPort, base) hostURI = fmt.Sprintf("http://%s.%s:%d/%s", SCHEDULER_SERVICE_NAME, s.HADomain, ports.SchedulerPort, filename)
} else { } else {
hostURI = fmt.Sprintf("http://%s:%d/%s", s.Address.String(), s.Port, base) hostURI = fmt.Sprintf("http://%s:%d/%s", s.Address.String(), s.Port, filename)
} }
log.V(2).Infof("Hosting artifact '%s' at '%s'", path, hostURI) log.V(2).Infof("Hosting artifact '%s' at '%s'", filename, hostURI)
return hostURI, base return hostURI
} }
func (s *SchedulerServer) prepareExecutorInfo(hks hyperkube.Interface) (*mesos.ExecutorInfo, *uid.UID, error) { func (s *SchedulerServer) prepareExecutorInfo(hks hyperkube.Interface) (*mesos.ExecutorInfo, *uid.UID, error) {
...@@ -332,9 +340,13 @@ func (s *SchedulerServer) prepareExecutorInfo(hks hyperkube.Interface) (*mesos.E ...@@ -332,9 +340,13 @@ func (s *SchedulerServer) prepareExecutorInfo(hks hyperkube.Interface) (*mesos.E
ci.Arguments = append(ci.Arguments, fmt.Sprintf("--max-log-age=%d", s.MinionLogMaxAgeInDays)) ci.Arguments = append(ci.Arguments, fmt.Sprintf("--max-log-age=%d", s.MinionLogMaxAgeInDays))
} }
if s.DockerCfgPath != "" {
uri := s.serveFrameworkArtifactWithFilename(s.DockerCfgPath, ".dockercfg")
ci.Uris = append(ci.Uris, &mesos.CommandInfo_URI{Value: proto.String(uri), Executable: proto.Bool(false), Extract: proto.Bool(false)})
}
//TODO(jdef): provide some way (env var?) for users to customize executor config //TODO(jdef): provide some way (env var?) for users to customize executor config
//TODO(jdef): set -address to 127.0.0.1 if `address` is 127.0.0.1 //TODO(jdef): set -address to 127.0.0.1 if `address` is 127.0.0.1
//TODO(jdef): propagate dockercfg from RootDirectory?
apiServerArgs := strings.Join(s.APIServerList, ",") apiServerArgs := strings.Join(s.APIServerList, ",")
ci.Arguments = append(ci.Arguments, fmt.Sprintf("--api-servers=%s", apiServerArgs)) ci.Arguments = append(ci.Arguments, fmt.Sprintf("--api-servers=%s", apiServerArgs))
......
...@@ -60,6 +60,7 @@ dest-file ...@@ -60,6 +60,7 @@ dest-file
disable-filter disable-filter
docker-endpoint docker-endpoint
docker-exec-handler docker-exec-handler
dockercfg-path
driver-port driver-port
dry-run dry-run
duration-sec duration-sec
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment