c12s-kubespray/roles/download/templates/kubeadm-images.yaml.j2
Florent Monbillard 061f5a313b Explicitely set etcd endpoint in kubeadm-images.yaml (#4063)
Currently, the task `container_download | download images for kubeadm config images` fetches etcd image even though it's not required (etcd is bootstrapped by kubespray, not kubeadm).

`kubeadm-images.yaml` is only a subset of `kubeadm-config.yaml`, therefore ``kubeadm config images pull` will try to get all this list (including etcd)

```
# kubeadm config images list --config /etc/kubernetes/kubeadm-images.yaml
k8s.gcr.io/kube-apiserver:v1.13.2
k8s.gcr.io/kube-controller-manager:v1.13.2
k8s.gcr.io/kube-scheduler:v1.13.2
k8s.gcr.io/kube-proxy:v1.13.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/coredns:1.2.6
```

When using the `kubeadm-config.yaml` though, it doesn't list etcd image:

```
# kubeadm config images list --config /etc/kubernetes/kubeadm-config.yaml
k8s.gcr.io/kube-apiserver:v1.13.2
k8s.gcr.io/kube-controller-manager:v1.13.2
k8s.gcr.io/kube-scheduler:v1.13.2
k8s.gcr.io/kube-proxy:v1.13.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/coredns:1.2.6
```

This change just adds the etcd endpoints in the `kubeadm-images.yaml` to give a hint to kubeadm it doesn't need etcd image for its boostrapping as etcd is "external".
I confess it is a ugly hack, a better way would be to use a single `kubeadm-config.yaml` for both tasks, but they are triggered by different roles (`kubeadm-images.yaml` is used by download, `kubeadm-config.yaml` by kubernetes/master) at different steps and I didn't want to refactor too many things to prevent breakage. 

This is specially useful for offline installation where a whitelist of container images is mirrored on a local private container registry. `k8s.gcr.io/etcd` and `quay.io/coreos/etcd`  are two different repositories hosting the same images but using *different tags*! 
* coreos/etcd:v3.2.24   
* k8s.gcr.io/etcd:3.2.24 (note the missing 'v' in the tag name)
2019-02-13 12:44:12 -08:00

50 lines
1.5 KiB
Django/Jinja

{% if kube_version is version('v1.12.0', '>=') %}
{% if kube_version is version('v1.12.0', '>=') and kube_version is version('v1.13.0', '<') %}
apiVersion: kubeadm.k8s.io/v1alpha3
{% else %}
apiVersion: kubeadm.k8s.io/v1beta1
{% endif %}
kind: InitConfiguration
nodeRegistration:
{% if container_manager == 'crio' %}
criSocket: /var/run/crio/crio.sock
{% elif container_manager == 'rkt' %}
criSocket: /var/run/rkt.sock
{% else %}
criSocket: /var/run/dockershim.sock
{% endif %}
---
{% endif %}
{% if kube_version is version('v1.11.0', '<') %}
apiVersion: kubeadm.k8s.io/v1alpha1
{% elif kube_version is version('v1.11.0', '>=') and kube_version is version('v1.12.0', '<') %}
apiVersion: kubeadm.k8s.io/v1alpha2
{% elif kube_version is version('v1.12.0', '>=') and kube_version is version('v1.13.0', '<') %}
apiVersion: kubeadm.k8s.io/v1alpha3
{% else %}
apiVersion: kubeadm.k8s.io/v1beta1
{% endif %}
{% if kube_version is version('v1.12.0', '<') %}
kind: MasterConfiguration
{% else %}
kind: ClusterConfiguration
{% endif %}
imageRepository: {{ kube_image_repo }}
kubernetesVersion: {{ kube_version }}
etcd:
external:
endpoints:
{% for endpoint in etcd_access_addresses.split(',') %}
- {{ endpoint }}
{% endfor %}
{% if kube_version is version('v1.12.0', '<') %}
nodeRegistration:
{% if container_manager == 'crio' %}
criSocket: /var/run/crio/crio.sock
{% elif container_manager == 'rkt' %}
criSocket: /var/run/rkt.sock
{% else %}
criSocket: /var/run/dockershim.sock
{% endif %}
{% endif %}