Skip to content
This repository has been archived by the owner on Sep 26, 2021. It is now read-only.

Issue #1947 CoreOS provisioner does not properly bootstrap etcd #1971

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions libmachine/provision/coreos.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,32 @@ const (

hostname: %s
EOF
`

cloudConfigTmpl = `sudo tee /var/tmp/cloudinit.yml << EOF
#cloud-config

coreos:
etcd:
discovery: {{.Token}}
addr: {{.IP}}:4001
peer-addr: {{.IP}}:7001
# give etcd more time if it's under heavy load - prevent leader election thrashing
peer-election-timeout: 4000
# heartbeat interval should ideally be 1/4 or 1/5 of peer election timeout
peer-heartbeat-interval: 1000
# don't keep all day in memory
snapshot: true
fleet:
public-ip: {{.IP}}
# allow etcd to slow down at times
etcd-request-timeout: 15
units:
- name: etcd.service
command: start
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you need to use etcd2

- name: fleet.service
command: start
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why are you starting fleet?

EOF
`
)

Expand Down Expand Up @@ -80,6 +106,43 @@ func (provisioner *CoreOSProvisioner) SetHostname(hostname string) error {
return nil
}

func (provisioner *CoreOSProvisioner) SetCloudInit(hostname string) error {
log.Debugf("SetCloudInit: %s", hostname)

ip, err := provisioner.Driver.GetIP()
if err != nil {
log.Fatalf("Could not get IP address for created machine: %s", err)
}

token, err := provisioner.SSHCommand("curl -sSL https://discovery.etcd.io/new?size=3")
if err != nil {
return err
}

data := map[string]interface{}{
"IP": ip,
"HostName": hostname,
"Token": token,
}

t := template.Must(template.New("cloudinit").Parse(cloudConfigTmpl))
buf := &bytes.Buffer{}
if err := t.Execute(buf, data); err != nil {
panic(err)
}
cloudConfigTmpl := buf.String()

if _, err := provisioner.SSHCommand(cloudConfigTmpl); err != nil {
return err
}

if _, err := provisioner.SSHCommand("sudo systemctl start system-cloudinit@var-tmp-cloudinit.yml.service"); err != nil {
return err
}

return nil
}

func (provisioner *CoreOSProvisioner) GenerateDockerOptions(dockerPort int) (*DockerOptions, error) {
var (
engineCfg bytes.Buffer
Expand Down Expand Up @@ -137,6 +200,10 @@ func (provisioner *CoreOSProvisioner) Provision(swarmOptions swarm.SwarmOptions,
return err
}

if err := provisioner.SetCloudInit(provisioner.Driver.GetMachineName()); err != nil {
return err
}

if err := makeDockerOptionsDir(provisioner); err != nil {
return err
}
Expand Down