forked from kubernetes/kops
/
docker.go
109 lines (88 loc) · 3.48 KB
/
docker.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
Copyright 2016 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package components
import (
"fmt"
"github.com/golang/glog"
"k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/loader"
)
// DockerOptionsBuilder adds options for docker to the model
type DockerOptionsBuilder struct {
*OptionsContext
}
var _ loader.OptionsBuilder = &DockerOptionsBuilder{}
// BuildOptions is responsible for filling in the default setting for docker daemon
func (b *DockerOptionsBuilder) BuildOptions(o interface{}) error {
clusterSpec := o.(*kops.ClusterSpec)
sv, err := KubernetesVersion(clusterSpec)
if err != nil {
return fmt.Errorf("unable to determine kubernetes version from %q", clusterSpec.KubernetesVersion)
}
if clusterSpec.Docker == nil {
clusterSpec.Docker = &kops.DockerConfig{}
}
docker := clusterSpec.Docker
if fi.StringValue(clusterSpec.Docker.Version) == "" {
if clusterSpec.KubernetesVersion == "" {
return fmt.Errorf("KubernetesVersion is required")
}
dockerVersion := ""
if sv.Major == 1 && sv.Minor >= 9 {
dockerVersion = "17.03.2"
} else if sv.Major == 1 && sv.Minor >= 8 {
dockerVersion = "1.13.1"
} else if sv.Major == 1 && sv.Minor >= 6 {
dockerVersion = "1.12.6"
} else if sv.Major == 1 && sv.Minor >= 5 {
dockerVersion = "1.12.3"
} else if sv.Major == 1 && sv.Minor <= 4 {
dockerVersion = "1.11.2"
}
if dockerVersion == "" {
return fmt.Errorf("unknown version of kubernetes %q (cannot infer docker version)", clusterSpec.KubernetesVersion)
}
clusterSpec.Docker.Version = &dockerVersion
}
if sv.Major == 1 && sv.Minor >= 6 {
if len(clusterSpec.Docker.LogOpt) == 0 && clusterSpec.Docker.LogDriver == nil {
// Use built-in docker logging, if not configured otherwise (by the user)
logDriver := "json-file"
clusterSpec.Docker.LogDriver = &logDriver
clusterSpec.Docker.LogOpt = append(clusterSpec.Docker.LogOpt, "max-size=10m")
clusterSpec.Docker.LogOpt = append(clusterSpec.Docker.LogOpt, "max-file=5")
}
}
docker.LogLevel = fi.String("warn")
docker.IPTables = fi.Bool(false)
docker.IPMasq = fi.Bool(false)
// Note the alternative syntax... with a comma nodeup will try each of the filesystems in turn
if b.IsKubernetesGTE("1.11") {
// TODO(justinsb): figure out whether to use overlay2 on AWS jessie:
// The ContainerOS image now has docker configured to use overlay2 out-of-the-box
// and it is an error to specify the flag twice.
// But Jessie (still our default AWS image) isn't recommended by docker with overlay2
// (though that may be a kernel issue, and we run a custom kernel on our default image)
// But we still need to worry about users running generic AMIs (e.g. stock jessie)
docker.Storage = fi.String("overlay2,overlay,aufs")
} else {
docker.Storage = fi.String("overlay,aufs")
}
networking := clusterSpec.Networking
if networking == nil || networking.Classic != nil {
glog.Warningf("using deprecated (classic) networking")
docker.Bridge = fi.String("cbr0")
}
return nil
}