Merge pull request #10499 from alex-mohr/release-0.20

Release 0.20.1
This commit is contained in:
Alex Robinson 2015-06-29 15:06:34 -07:00
commit 92e58c4f2b
14 changed files with 67 additions and 73 deletions

View File

@ -648,9 +648,6 @@ function kube::release::create_docker_images_for_server() {
kube::log::status "Deleting docker image ${docker_image_tag}" kube::log::status "Deleting docker image ${docker_image_tag}"
"${DOCKER[@]}" rmi ${docker_image_tag} 2>/dev/null || true "${DOCKER[@]}" rmi ${docker_image_tag} 2>/dev/null || true
# Now, that we have created docker images we can safely delete raw binary.
rm -f $1/${binary_name}
) & ) &
done done

View File

@ -22,10 +22,6 @@ spec:
containers: containers:
- image: gcr.io/google_containers/heapster:v0.14.3 - image: gcr.io/google_containers/heapster:v0.14.3
name: heapster name: heapster
resources:
limits:
cpu: 200m
memory: 2.5Gi
command: command:
- /heapster - /heapster
- --source=kubernetes:'' - --source=kubernetes:''

View File

@ -22,10 +22,6 @@ spec:
containers: containers:
- image: gcr.io/google_containers/heapster:v0.14.3 - image: gcr.io/google_containers/heapster:v0.14.3
name: heapster name: heapster
resources:
limits:
cpu: 200m
memory: 2.5Gi
command: command:
- /heapster - /heapster
- --source=kubernetes:'' - --source=kubernetes:''

View File

@ -22,10 +22,6 @@ spec:
containers: containers:
- image: gcr.io/google_containers/heapster:v0.14.3 - image: gcr.io/google_containers/heapster:v0.14.3
name: heapster name: heapster
resources:
limits:
cpu: 200m
memory: 2.5Gi
command: command:
- /heapster - /heapster
- --source=kubernetes:'' - --source=kubernetes:''

View File

@ -22,10 +22,6 @@ spec:
containers: containers:
- image: gcr.io/google_containers/heapster_influxdb:v0.3 - image: gcr.io/google_containers/heapster_influxdb:v0.3
name: influxdb name: influxdb
resources:
limits:
cpu: 300m
memory: 2Gi
ports: ports:
- containerPort: 8083 - containerPort: 8083
hostPort: 8083 hostPort: 8083

View File

@ -22,10 +22,6 @@ spec:
containers: containers:
- image: gcr.io/google_containers/heapster:v0.14.3 - image: gcr.io/google_containers/heapster:v0.14.3
name: heapster name: heapster
resources:
limits:
cpu: 200m
memory: 2.5Gi
command: command:
- /heapster - /heapster
- --source=kubernetes:'' - --source=kubernetes:''

View File

@ -109,7 +109,7 @@ Create a file named busybox.yaml with the
following contents: following contents:
```yaml ```yaml
apiVersion: v1beta3 apiVersion: v1
kind: Pod kind: Pod
metadata: metadata:
name: busybox name: busybox

View File

@ -1,12 +1,20 @@
* Fri May 15 2015 Tim Hockin <thockin@google.com> ## Version 1.10 (Jun 19 2015 Tim Hockin <thockin@google.com>)
- First Changelog entry - Fall back on service account tokens if no other auth is specified.
- Current version is 1.4
## Version 1.9 (May 28 2015 Abhishek Shah <abshah@google.com>)
- Add SRV support.
## Version 1.8 (May 28 2015 Vishnu Kannan <vishnuk@google.com>)
- Avoid making connections to the master insecure by default
- Let users override the master URL in kubeconfig via a flag
## Version 1.7 (May 25 2015 Vishnu Kannan <vishnuk@google.com>) ## Version 1.7 (May 25 2015 Vishnu Kannan <vishnuk@google.com>)
- Adding support for headless services. All pods backing a headless service is addressible via DNS RR. - Adding support for headless services. All pods backing a headless service is
addressible via DNS RR.
## Version 1.8 (May 18 2015 Vishnu Kannan <vishnuk@google.com>) ## Version 1.4 (Fri May 15 2015 Tim Hockin <thockin@google.com>)
- Avoid making connections to the master insecure by default - First Changelog entry
- Let users override the master URL in kubeconfig via a flag

View File

@ -4,7 +4,7 @@
.PHONY: all kube2sky container push clean test .PHONY: all kube2sky container push clean test
TAG = 1.9 TAG = 1.10
PREFIX = gcr.io/google_containers PREFIX = gcr.io/google_containers
all: container all: container

View File

@ -46,10 +46,11 @@ import (
) )
var ( var (
// TODO: switch to pflag and make - and _ equivalent.
argDomain = flag.String("domain", "cluster.local", "domain under which to create names") argDomain = flag.String("domain", "cluster.local", "domain under which to create names")
argEtcdMutationTimeout = flag.Duration("etcd_mutation_timeout", 10*time.Second, "crash after retrying etcd mutation for a specified duration") argEtcdMutationTimeout = flag.Duration("etcd_mutation_timeout", 10*time.Second, "crash after retrying etcd mutation for a specified duration")
argEtcdServer = flag.String("etcd-server", "http://127.0.0.1:4001", "URL to etcd server") argEtcdServer = flag.String("etcd-server", "http://127.0.0.1:4001", "URL to etcd server")
argKubecfgFile = flag.String("kubecfg_file", "", "Location of kubecfg file for access to kubernetes service") argKubecfgFile = flag.String("kubecfg_file", "", "Location of kubecfg file for access to kubernetes master service; --kube_master_url overrides the URL part of this; if neither this nor --kube_master_url are provided, defaults to service account tokens")
argKubeMasterURL = flag.String("kube_master_url", "", "URL to reach kubernetes master. Env variables in this flag will be expanded.") argKubeMasterURL = flag.String("kube_master_url", "", "URL to reach kubernetes master. Env variables in this flag will be expanded.")
) )
@ -405,7 +406,7 @@ func newEtcdClient(etcdServer string) (*etcd.Client, error) {
return client, nil return client, nil
} }
func getKubeMasterURL() (string, error) { func expandKubeMasterURL() (string, error) {
parsedURL, err := url.Parse(os.ExpandEnv(*argKubeMasterURL)) parsedURL, err := url.Parse(os.ExpandEnv(*argKubeMasterURL))
if err != nil { if err != nil {
return "", fmt.Errorf("failed to parse --kube_master_url %s - %v", *argKubeMasterURL, err) return "", fmt.Errorf("failed to parse --kube_master_url %s - %v", *argKubeMasterURL, err)
@ -423,31 +424,34 @@ func newKubeClient() (*kclient.Client, error) {
err error err error
masterURL string masterURL string
) )
// If the user specified --kube_master_url, expand env vars and verify it.
if *argKubeMasterURL != "" { if *argKubeMasterURL != "" {
masterURL, err = getKubeMasterURL() masterURL, err = expandKubeMasterURL()
if err != nil { if err != nil {
return nil, err return nil, err
} }
} }
if *argKubecfgFile == "" { if masterURL != "" && *argKubecfgFile == "" {
if masterURL == "" { // Only --kube_master_url was provided.
return nil, fmt.Errorf("--kube_master_url must be set when --kubecfg_file is not set")
}
config = &kclient.Config{ config = &kclient.Config{
Host: masterURL, Host: masterURL,
Version: "v1beta3", Version: "v1",
} }
} else { } else {
// We either have:
// 1) --kube_master_url and --kubecfg_file
// 2) just --kubecfg_file
// 3) neither flag
// In any case, the logic is the same. If (3), this will automatically
// fall back on the service account token.
overrides := &kclientcmd.ConfigOverrides{} overrides := &kclientcmd.ConfigOverrides{}
if masterURL != "" { overrides.ClusterInfo.Server = masterURL // might be "", but that is OK
overrides.ClusterInfo.Server = masterURL rules := &kclientcmd.ClientConfigLoadingRules{ExplicitPath: *argKubecfgFile} // might be "", but that is OK
} if config, err = kclientcmd.NewNonInteractiveDeferredLoadingClientConfig(rules, overrides).ClientConfig(); err != nil {
if config, err = kclientcmd.NewNonInteractiveDeferredLoadingClientConfig(
&kclientcmd.ClientConfigLoadingRules{ExplicitPath: *argKubecfgFile},
overrides).ClientConfig(); err != nil {
return nil, err return nil, err
} }
} }
glog.Infof("Using %s for kubernetes master", config.Host) glog.Infof("Using %s for kubernetes master", config.Host)
glog.Infof("Using kubernetes API %s", config.Version) glog.Infof("Using kubernetes API %s", config.Version)
return kclient.New(config) return kclient.New(config)

View File

@ -1,21 +1,22 @@
apiVersion: v1beta3 apiVersion: v1
kind: ReplicationController kind: ReplicationController
metadata: metadata:
name: kube-dns-v3 name: kube-dns-v4
namespace: default namespace: default
labels: labels:
k8s-app: kube-dns-v3 k8s-app: kube-dns
version: v4
kubernetes.io/cluster-service: "true" kubernetes.io/cluster-service: "true"
spec: spec:
replicas: {{ pillar['dns_replicas'] }} replicas: {{ pillar['dns_replicas'] }}
selector: selector:
k8s-app: kube-dns k8s-app: kube-dns
version: v3 version: v4
template: template:
metadata: metadata:
labels: labels:
k8s-app: kube-dns k8s-app: kube-dns
version: v3 version: v4
kubernetes.io/cluster-service: "true" kubernetes.io/cluster-service: "true"
spec: spec:
containers: containers:
@ -30,15 +31,10 @@ spec:
- -initial-cluster-token - -initial-cluster-token
- skydns-etcd - skydns-etcd
- name: kube2sky - name: kube2sky
image: gcr.io/google_containers/kube2sky:1.9 image: gcr.io/google_containers/kube2sky:1.10
args: args:
# command = "/kube2sky" # command = "/kube2sky"
- -domain={{ pillar['dns_domain'] }} - -domain={{ pillar['dns_domain'] }}
- -kubecfg_file=/etc/dns_token/kubeconfig
volumeMounts:
- mountPath: /etc/dns_token
name: dns-token
readOnly: true
- name: skydns - name: skydns
image: gcr.io/google_containers/skydns:2015-03-11-001 image: gcr.io/google_containers/skydns:2015-03-11-001
args: args:
@ -58,11 +54,7 @@ spec:
command: command:
- /bin/sh - /bin/sh
- -c - -c
- nslookup kubernetes.default.{{ pillar['dns_domain'] }} localhost >/dev/null - nslookup kubernetes.default.svc.{{ pillar['dns_domain'] }} localhost >/dev/null
initialDelaySeconds: 30 initialDelaySeconds: 30
timeoutSeconds: 5 timeoutSeconds: 5
dnsPolicy: Default # Don't use cluster DNS. dnsPolicy: Default # Don't use cluster DNS.
volumes:
- name: dns-token
secret:
secretName: token-system-dns

View File

@ -1,4 +1,4 @@
apiVersion: v1beta3 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: kube-dns name: kube-dns
@ -10,7 +10,7 @@ metadata:
spec: spec:
selector: selector:
k8s-app: kube-dns k8s-app: kube-dns
portalIP: {{ pillar['dns_server'] }} clusterIP: {{ pillar['dns_server'] }}
ports: ports:
- name: dns - name: dns
port: 53 port: 53

View File

@ -156,13 +156,22 @@ const watchWaitDuration = 100 * time.Millisecond
// and a versioner, the versioner must be able to handle the objects that transform creates. // and a versioner, the versioner must be able to handle the objects that transform creates.
func newEtcdWatcher(list bool, include includeFunc, filter FilterFunc, encoding runtime.Codec, versioner EtcdVersioner, transform TransformFunc, cache etcdCache) *etcdWatcher { func newEtcdWatcher(list bool, include includeFunc, filter FilterFunc, encoding runtime.Codec, versioner EtcdVersioner, transform TransformFunc, cache etcdCache) *etcdWatcher {
w := &etcdWatcher{ w := &etcdWatcher{
encoding: encoding, encoding: encoding,
versioner: versioner, versioner: versioner,
transform: transform, transform: transform,
list: list, list: list,
include: include, include: include,
filter: filter, filter: filter,
etcdIncoming: make(chan *etcd.Response), // Buffer this channel, so that the etcd client is not forced
// to context switch with every object it gets, and so that a
// long time spent decoding an object won't block the *next*
// object. Basically, we see a lot of "401 window exceeded"
// errors from etcd, and that's due to the client not streaming
// results but rather getting them one at a time. So we really
// want to never block the etcd client, if possible. The 50 is
// arbitrary; there's a V(4) log message that prints the length
// so we can monitor how much of this buffer is actually used.
etcdIncoming: make(chan *etcd.Response, 50),
etcdError: make(chan error, 1), etcdError: make(chan error, 1),
etcdStop: make(chan bool), etcdStop: make(chan bool),
outgoing: make(chan watch.Event), outgoing: make(chan watch.Event),
@ -250,6 +259,10 @@ func (w *etcdWatcher) translate() {
return return
case res, ok := <-w.etcdIncoming: case res, ok := <-w.etcdIncoming:
if ok { if ok {
if curLen := len(w.etcdIncoming); curLen > 0 {
// Monitor if this gets backed up, and how much.
glog.V(4).Infof("watch: %v objects queued in channel.", curLen)
}
w.sendResult(res) w.sendResult(res)
} }
// If !ok, don't return here-- must wait for etcdError channel // If !ok, don't return here-- must wait for etcdError channel

View File

@ -36,8 +36,8 @@ package version
var ( var (
// TODO: Deprecate gitMajor and gitMinor, use only gitVersion instead. // TODO: Deprecate gitMajor and gitMinor, use only gitVersion instead.
gitMajor string = "0" // major version, always numeric gitMajor string = "0" // major version, always numeric
gitMinor string = "20.0" // minor version, numeric possibly followed by "+" gitMinor string = "20.1+" // minor version, numeric possibly followed by "+"
gitVersion string = "v0.20.0" // version from git, output of $(git describe) gitVersion string = "v0.20.1-dev" // version from git, output of $(git describe)
gitCommit string = "" // sha1 from git, output of $(git rev-parse HEAD) gitCommit string = "" // sha1 from git, output of $(git rev-parse HEAD)
gitTreeState string = "not a git tree" // state of git tree, either "clean" or "dirty" gitTreeState string = "not a git tree" // state of git tree, either "clean" or "dirty"
) )