Fix kube-proxy configuration for kubeadm (#3958)

- Creates and defaults an ansible variable for every configuration option in the `kubeproxy.config.k8s.io/v1alpha1` type spec
  - Fixes vars that were orphaned by removing non-kubeadm
  - Fixes previously harcoded kubeadm values
- Introduces a `main` directory for role default files per component (requires ansible 2.6.0+)
  - Split out just `kube-proxy.yml` in this first effort
- Removes the kube-proxy server field patch task

We should continue to pull out other components from `main.yml` into their own defaults files as I did here for `defaults/main/kube-proxy.yml`. I hope for and will need others to join me in this refactoring across the project until each component config template has a matching role defaults file, with shared defaults in `kubespray-defaults` or `downloads`
This commit is contained in:
Chad Swenson 2019-01-03 02:04:26 -06:00 committed by Kubernetes Prow Robot
parent d58b338bd8
commit 80379f6cab
17 changed files with 193 additions and 125 deletions

View file

@ -141,7 +141,7 @@ plugins can be deployed for a given single cluster.
Requirements Requirements
------------ ------------
- **Ansible v2.5 (or newer) and python-netaddr is installed on the machine - **Ansible v2.6 (or newer) and python-netaddr is installed on the machine
that will run Ansible commands** that will run Ansible commands**
- **Jinja 2.9 (or newer) is required to run the Ansible Playbooks** - **Jinja 2.9 (or newer) is required to run the Ansible Playbooks**
- The target servers must have **access to the Internet** in order to pull docker images. Otherwise, additional configuration is required (See [Offline Environment](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/downloads.md#offline-environment)) - The target servers must have **access to the Internet** in order to pull docker images. Otherwise, additional configuration is required (See [Offline Environment](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/downloads.md#offline-environment))

View file

@ -7,7 +7,7 @@
msg: "Ansible V2.7.0 can't be used until: https://github.com/ansible/ansible/issues/46600 is fixed" msg: "Ansible V2.7.0 can't be used until: https://github.com/ansible/ansible/issues/46600 is fixed"
that: that:
- ansible_version.string is version("2.7.0", "!=") - ansible_version.string is version("2.7.0", "!=")
- ansible_version.string is version("2.5.0", ">=") - ansible_version.string is version("2.6.0", ">=")
tags: tags:
- check - check
vars: vars:

View file

@ -97,10 +97,16 @@ kube_apiserver_insecure_port: 0 # (disabled)
# Can be ipvs, iptables # Can be ipvs, iptables
kube_proxy_mode: ipvs kube_proxy_mode: ipvs
# Kube-proxy nodeport address. # A string slice of values which specify the addresses to use for NodePorts.
# cidr to bind nodeport services. Flag --nodeport-addresses on kube-proxy manifest # Values may be valid IP blocks (e.g. 1.2.3.0/24, 1.2.3.4/32).
kube_proxy_nodeport_addresses: false # The default empty string slice ([]) means to use all local addresses.
# kube_proxy_nodeport_addresses_cidr: 10.0.1.0/24 # kube_proxy_nodeport_addresses_cidr is retained for legacy config
kube_proxy_nodeport_addresses: >-
{%- if kube_proxy_nodeport_addresses_cidr is defined -%}
[{{ kube_proxy_nodeport_addresses_cidr }}]
{%- else -%}
[]
{%- endif -%}
## Encrypting Secret Data at Rest (experimental) ## Encrypting Secret Data at Rest (experimental)
kube_encrypt_secret_data: false kube_encrypt_secret_data: false

View file

@ -6,7 +6,7 @@
msg: "Ansible V2.7.0 can't be used until: https://github.com/ansible/ansible/issues/46600 is fixed" msg: "Ansible V2.7.0 can't be used until: https://github.com/ansible/ansible/issues/46600 is fixed"
that: that:
- ansible_version.string is version("2.7.0", "!=") - ansible_version.string is version("2.7.0", "!=")
- ansible_version.string is version("2.5.0", ">=") - ansible_version.string is version("2.6.0", ">=")
tags: tags:
- check - check
vars: vars:

View file

@ -1,4 +1,4 @@
ansible>=2.5.0,!=2.7.0 ansible>=2.6.0,!=2.7.0
jinja2>=2.9.6 jinja2>=2.9.6
netaddr netaddr
pbr>=1.6 pbr>=1.6

View file

@ -6,7 +6,7 @@
msg: "Ansible V2.7.0 can't be used until: https://github.com/ansible/ansible/issues/46600 is fixed" msg: "Ansible V2.7.0 can't be used until: https://github.com/ansible/ansible/issues/46600 is fixed"
that: that:
- ansible_version.string is version("2.7.0", "!=") - ansible_version.string is version("2.7.0", "!=")
- ansible_version.string is version("2.5.0", ">=") - ansible_version.string is version("2.6.0", ">=")
tags: tags:
- check - check
vars: vars:

View file

@ -92,21 +92,6 @@
- kubeadm_discovery_address != kube_apiserver_endpoint - kubeadm_discovery_address != kube_apiserver_endpoint
notify: restart kubelet notify: restart kubelet
- name: Update server field in kube-proxy kubeconfig
shell: >-
{{ bin_dir }}/kubectl --kubeconfig {{ kube_config_dir }}/admin.conf get configmap kube-proxy -n kube-system -o yaml
| sed 's#server:.*#server:\ {{ kube_apiserver_endpoint }}#g'
| {{ bin_dir }}/kubectl --kubeconfig {{ kube_config_dir }}/admin.conf replace -f -
delegate_to: "{{groups['kube-master']|first}}"
run_once: true
when:
- kubeadm_config_api_fqdn is not defined
- is_kube_master
- kubeadm_discovery_address != kube_apiserver_endpoint
- not kube_proxy_remove
tags:
- kube-proxy
# FIXME(mattymo): Reconcile kubelet kubeconfig filename for both deploy modes # FIXME(mattymo): Reconcile kubelet kubeconfig filename for both deploy modes
- name: Symlink kubelet kubeconfig for calico/canal - name: Symlink kubelet kubeconfig for calico/canal
file: file:
@ -116,18 +101,6 @@
force: yes force: yes
when: kube_network_plugin in ['calico','canal'] when: kube_network_plugin in ['calico','canal']
- name: Restart all kube-proxy pods to ensure that they load the new configmap
shell: "{{ bin_dir }}/kubectl --kubeconfig {{ kube_config_dir }}/admin.conf delete pod -n kube-system -l k8s-app=kube-proxy"
delegate_to: "{{groups['kube-master']|first}}"
run_once: true
when:
- kubeadm_config_api_fqdn is not defined
- is_kube_master
- kubeadm_discovery_address != kube_apiserver_endpoint
- not kube_proxy_remove
tags:
- kube-proxy
# FIXME(jjo): need to post-remove kube-proxy until https://github.com/kubernetes/kubeadm/issues/776 # FIXME(jjo): need to post-remove kube-proxy until https://github.com/kubernetes/kubeadm/issues/776
# is fixed # is fixed
- name: Delete kube-proxy daemonset if kube_proxy_remove set, e.g. kube_network_plugin providing proxy services - name: Delete kube-proxy daemonset if kube_proxy_remove set, e.g. kube_network_plugin providing proxy services

View file

@ -0,0 +1,105 @@
---
# bind address for kube-proxy
kube_proxy_bind_address: '0.0.0.0'
# acceptContentTypes defines the Accept header sent by clients when connecting to a server, overriding the
# default value of 'application/json'. This field will control all connections to the server used by a particular
# client.
kube_proxy_client_accept_content_types: ''
# burst allows extra queries to accumulate when a client is exceeding its rate.
kube_proxy_client_burst: 10
# contentType is the content type used when sending data to the server from this client.
kube_proxy_client_content_type: application/vnd.kubernetes.protobuf
# kubeconfig is the path to a KubeConfig file.
# Leave as empty string to generate from other fields
kube_proxy_client_kubeconfig: ''
# qps controls the number of queries per second allowed for this connection.
kube_proxy_client_qps: 5
# How often configuration from the apiserver is refreshed. Must be greater than 0.
kube_proxy_config_sync_period: 15m0s
### Conntrack
# max is the maximum number of NAT connections to track (0 to
# leave as-is). This takes precedence over maxPerCore and min.
kube_proxy_conntrack_max: 'null'
# maxPerCore is the maximum number of NAT connections to track
# per CPU core (0 to leave the limit as-is and ignore min).
kube_proxy_conntrack_max_per_core: 32768
# min is the minimum value of connect-tracking records to allocate,
# regardless of conntrackMaxPerCore (set maxPerCore=0 to leave the limit as-is).
kube_proxy_conntrack_min: 131072
# tcpCloseWaitTimeout is how long an idle conntrack entry
# in CLOSE_WAIT state will remain in the conntrack
# table. (e.g. '60s'). Must be greater than 0 to set.
kube_proxy_conntrack_tcp_close_wait_timeout: 1h0m0s
# tcpEstablishedTimeout is how long an idle TCP connection will be kept open
# (e.g. '2s'). Must be greater than 0 to set.
kube_proxy_conntrack_tcp_established_timeout: 24h0m0s
# Enables profiling via web interface on /debug/pprof handler.
# Profiling handlers will be handled by metrics server.
kube_proxy_enable_profiling: false
# bind address for kube-proxy health check
kube_proxy_healthz_bind_address: 0.0.0.0:10256
# If using the pure iptables proxy, SNAT everything. Note that it breaks any
# policy engine.
kube_proxy_masquerade_all: false
# If using the pure iptables proxy, the bit of the fwmark space to mark packets requiring SNAT with.
# Must be within the range [0, 31].
kube_proxy_masquerade_bit: 14
# The minimum interval of how often the iptables or ipvs rules can be refreshed as
# endpoints and services change (e.g. '5s', '1m', '2h22m').
kube_proxy_min_sync_period: 0s
# The maximum interval of how often iptables or ipvs rules are refreshed (e.g. '5s', '1m', '2h22m').
# Must be greater than 0.
kube_proxy_sync_period: 30s
# A comma-separated list of CIDR's which the ipvs proxier should not touch when cleaning up IPVS rules.
kube_proxy_exclude_cidrs: 'null'
# The ipvs scheduler type when proxy mode is ipvs
# rr: round-robin
# lc: least connection
# dh: destination hashing
# sh: source hashing
# sed: shortest expected delay
# nq: never queue
kube_proxy_scheduler: rr
# The IP address and port for the metrics server to serve on
# (set to 0.0.0.0 for all IPv4 interfaces and `::` for all IPv6 interfaces)
kube_proxy_metrics_bind_address: 127.0.0.1:10249
# A string slice of values which specify the addresses to use for NodePorts.
# Values may be valid IP blocks (e.g. 1.2.3.0/24, 1.2.3.4/32).
# The default empty string slice ([]) means to use all local addresses.
kube_proxy_nodeport_addresses: '[]'
# oom-score-adj value for kube-proxy process. Values must be within the range [-1000, 1000]
kube_proxy_oom_score_adj: -999
# portRange is the range of host ports (beginPort-endPort, inclusive) that may be consumed
# in order to proxy service traffic. If unspecified, 0, or (0-0) then ports will be randomly chosen.
kube_proxy_port_range: ''
# resourceContainer is the absolute name of the resource-only container to create and run
# the Kube-proxy in (Default: /kube-proxy).
kube_proxy_resource_container: /kube-proxy
# udpIdleTimeout is how long an idle UDP connection will be kept open (e.g. '250ms', '2s').
# Must be greater than 0. Only applicable for proxyMode=userspace.
kube_proxy_udp_idle_timeout: 250ms

View file

@ -40,7 +40,7 @@ kubeProxy:
mode: ipvs mode: ipvs
{% endif %} {% endif %}
{% if kube_proxy_nodeport_addresses %} {% if kube_proxy_nodeport_addresses %}
nodePortAddresses: [{{ kube_proxy_nodeport_addresses_cidr }}] nodePortAddresses: {{ kube_proxy_nodeport_addresses }}
{% endif %} {% endif %}
resourceContainer: "" resourceContainer: ""
authorizationModes: authorizationModes:

View file

@ -26,7 +26,7 @@ kubeProxy:
config: config:
mode: {{ kube_proxy_mode }} mode: {{ kube_proxy_mode }}
{% if kube_proxy_nodeport_addresses %} {% if kube_proxy_nodeport_addresses %}
nodePortAddresses: [{{ kube_proxy_nodeport_addresses_cidr }}] nodePortAddresses: {{ kube_proxy_nodeport_addresses }}
{% endif %} {% endif %}
resourceContainer: "" resourceContainer: ""
authorizationModes: authorizationModes:

View file

@ -221,39 +221,37 @@ schedulerExtraVolumes:
--- ---
apiVersion: kubeproxy.config.k8s.io/v1alpha1 apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration kind: KubeProxyConfiguration
bindAddress: 0.0.0.0 bindAddress: {{ kube_proxy_bind_address }}
clientConnection: clientConnection:
acceptContentTypes: "" acceptContentTypes: {{ kube_proxy_client_accept_content_types }}
burst: 10 burst: {{ kube_proxy_client_burst }}
contentType: application/vnd.kubernetes.protobuf contentType: {{ kube_proxy_client_content_type }}
kubeconfig: /var/lib/kube-proxy/kubeconfig.conf kubeconfig: {{ kube_proxy_client_kubeconfig }}
qps: 5 qps: {{ kube_proxy_client_kubeconfig }}
clusterCIDR: "" clusterCIDR: {{ kube_pods_subnet }}
configSyncPeriod: 15m0s configSyncPeriod: {{ kube_proxy_config_sync_period }}
conntrack: conntrack:
max: null max: {{ kube_proxy_conntrack_max }}
maxPerCore: 32768 maxPerCore: {{ kube_proxy_conntrack_max_per_core }}
min: 131072 min: {{ kube_proxy_conntrack_min }}
tcpCloseWaitTimeout: 1h0m0s tcpCloseWaitTimeout: {{ kube_proxy_conntrack_tcp_close_wait_timeout }}
tcpEstablishedTimeout: 24h0m0s tcpEstablishedTimeout: {{ kube_proxy_conntrack_tcp_established_timeout }}
enableProfiling: false enableProfiling: {{ kube_proxy_enable_profiling }}
healthzBindAddress: 0.0.0.0:10256 healthzBindAddress: {{ kube_proxy_healthz_bind_address }}
iptables: iptables:
masqueradeAll: false masqueradeAll: {{ kube_proxy_masquerade_all }}
masqueradeBit: 14 masqueradeBit: {{ kube_proxy_masquerade_bit }}
minSyncPeriod: 0s minSyncPeriod: {{ kube_proxy_min_sync_period }}
syncPeriod: 30s syncPeriod: {{ kube_proxy_sync_period }}
ipvs: ipvs:
excludeCIDRs: null excludeCIDRs: {{ kube_proxy_exclude_cidrs }}
minSyncPeriod: 0s minSyncPeriod: {{ kube_proxy_min_sync_period }}
scheduler: "" scheduler: {{ kube_proxy_scheduler }}
syncPeriod: 30s syncPeriod: {{ kube_proxy_sync_period }}
metricsBindAddress: 127.0.0.1:10249 metricsBindAddress: {{ kube_proxy_metrics_bind_address }}
mode: {{ kube_proxy_mode }} mode: {{ kube_proxy_mode }}
{% if kube_proxy_nodeport_addresses %} nodePortAddresses: {{ kube_proxy_nodeport_addresses }}
nodePortAddresses: [{{ kube_proxy_nodeport_addresses_cidr }}] oomScoreAdj: {{ kube_proxy_oom_score_adj }}
{% endif %} portRange: {{ kube_proxy_port_range }}
oomScoreAdj: -999 resourceContainer: {{ kube_proxy_resource_container }}
portRange: "" udpIdleTimeout: {{ kube_proxy_udp_idle_timeout }}
resourceContainer: ""
udpIdleTimeout: 250ms

View file

@ -227,39 +227,37 @@ scheduler:
--- ---
apiVersion: kubeproxy.config.k8s.io/v1alpha1 apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration kind: KubeProxyConfiguration
bindAddress: 0.0.0.0 bindAddress: {{ kube_proxy_bind_address }}
clientConnection: clientConnection:
acceptContentTypes: "" acceptContentTypes: {{ kube_proxy_client_accept_content_types }}
burst: 10 burst: {{ kube_proxy_client_burst }}
contentType: application/vnd.kubernetes.protobuf contentType: {{ kube_proxy_client_content_type }}
kubeconfig: /var/lib/kube-proxy/kubeconfig.conf kubeconfig: {{ kube_proxy_client_kubeconfig }}
qps: 5 qps: {{ kube_proxy_client_kubeconfig }}
clusterCIDR: "" clusterCIDR: {{ kube_pods_subnet }}
configSyncPeriod: 15m0s configSyncPeriod: {{ kube_proxy_config_sync_period }}
conntrack: conntrack:
max: null max: {{ kube_proxy_conntrack_max }}
maxPerCore: 32768 maxPerCore: {{ kube_proxy_conntrack_max_per_core }}
min: 131072 min: {{ kube_proxy_conntrack_min }}
tcpCloseWaitTimeout: 1h0m0s tcpCloseWaitTimeout: {{ kube_proxy_conntrack_tcp_close_wait_timeout }}
tcpEstablishedTimeout: 24h0m0s tcpEstablishedTimeout: {{ kube_proxy_conntrack_tcp_established_timeout }}
enableProfiling: false enableProfiling: {{ kube_proxy_enable_profiling }}
healthzBindAddress: 0.0.0.0:10256 healthzBindAddress: {{ kube_proxy_healthz_bind_address }}
iptables: iptables:
masqueradeAll: false masqueradeAll: {{ kube_proxy_masquerade_all }}
masqueradeBit: 14 masqueradeBit: {{ kube_proxy_masquerade_bit }}
minSyncPeriod: 0s minSyncPeriod: {{ kube_proxy_min_sync_period }}
syncPeriod: 30s syncPeriod: {{ kube_proxy_sync_period }}
ipvs: ipvs:
excludeCIDRs: null excludeCIDRs: {{ kube_proxy_exclude_cidrs }}
minSyncPeriod: 0s minSyncPeriod: {{ kube_proxy_min_sync_period }}
scheduler: "" scheduler: {{ kube_proxy_scheduler }}
syncPeriod: 30s syncPeriod: {{ kube_proxy_sync_period }}
metricsBindAddress: 127.0.0.1:10249 metricsBindAddress: {{ kube_proxy_metrics_bind_address }}
mode: {{ kube_proxy_mode }} mode: {{ kube_proxy_mode }}
{% if kube_proxy_nodeport_addresses %} nodePortAddresses: {{ kube_proxy_nodeport_addresses }}
nodePortAddresses: [{{ kube_proxy_nodeport_addresses_cidr }}] oomScoreAdj: {{ kube_proxy_oom_score_adj }}
{% endif %} portRange: {{ kube_proxy_port_range }}
oomScoreAdj: -999 resourceContainer: {{ kube_proxy_resource_container }}
portRange: "" udpIdleTimeout: {{ kube_proxy_udp_idle_timeout }}
resourceContainer: ""
udpIdleTimeout: 250ms

View file

@ -11,16 +11,6 @@ kubelet_bind_address: "{{ ip | default('0.0.0.0') }}"
# resolv.conf to base dns config # resolv.conf to base dns config
kube_resolv_conf: "/etc/resolv.conf" kube_resolv_conf: "/etc/resolv.conf"
# bind address for kube-proxy health check
kube_proxy_healthz_bind_address: "127.0.0.1"
# Can be ipvs, iptables
kube_proxy_mode: ipvs
# If using the pure iptables proxy, SNAT everything. Note that it breaks any
# policy engine.
kube_proxy_masquerade_all: false
# These options reflect limitations of running kubelet in a container. # These options reflect limitations of running kubelet in a container.
# Modify at your own risk # Modify at your own risk
kubelet_enable_cri: true kubelet_enable_cri: true
@ -49,11 +39,7 @@ kube_master_cpu_reserved: 200m
kubelet_status_update_frequency: 10s kubelet_status_update_frequency: 10s
# Limits for kube components and nginx load balancer app # Limits for nginx load balancer app
kube_proxy_memory_limit: 2000M
kube_proxy_cpu_limit: 500m
kube_proxy_memory_requests: 64M
kube_proxy_cpu_requests: 150m
nginx_memory_limit: 512M nginx_memory_limit: 512M
nginx_cpu_limit: 300m nginx_cpu_limit: 300m
nginx_memory_requests: 32M nginx_memory_requests: 32M
@ -63,10 +49,6 @@ nginx_cpu_requests: 25m
# - extensions/v1beta1/daemonsets=true # - extensions/v1beta1/daemonsets=true
# - extensions/v1beta1/deployments=true # - extensions/v1beta1/deployments=true
nginx_image_repo: nginx
nginx_image_tag: 1.13
nginx_config_dir: "/etc/nginx"
kubelet_flexvolumes_plugins_dir: /var/lib/kubelet/volume-plugins kubelet_flexvolumes_plugins_dir: /var/lib/kubelet/volume-plugins
# A port range to reserve for services with NodePort visibility. # A port range to reserve for services with NodePort visibility.

View file

@ -17,10 +17,16 @@ kube_version: v1.13.1
## Kube Proxy mode One of ['iptables','ipvs'] ## Kube Proxy mode One of ['iptables','ipvs']
kube_proxy_mode: ipvs kube_proxy_mode: ipvs
# Kube-proxy nodeport address. # A string slice of values which specify the addresses to use for NodePorts.
# cidr to bind nodeport services. Flag --nodeport-addresses on kube-proxy manifest # Values may be valid IP blocks (e.g. 1.2.3.0/24, 1.2.3.4/32).
kube_proxy_nodeport_addresses: false # The default empty string slice ([]) means to use all local addresses.
# kube_proxy_nodeport_addresses_cidr: 10.0.1.0/24 # kube_proxy_nodeport_addresses_cidr is retained for legacy config
kube_proxy_nodeport_addresses: >-
{%- if kube_proxy_nodeport_addresses_cidr is defined -%}
[{{ kube_proxy_nodeport_addresses_cidr }}]
{%- else -%}
[]
{%- endif -%}
# Set to true to allow pre-checks to fail and continue deployment # Set to true to allow pre-checks to fail and continue deployment
ignore_assert_errors: false ignore_assert_errors: false

View file

@ -7,7 +7,7 @@
msg: "Ansible V2.7.0 can't be used until: https://github.com/ansible/ansible/issues/46600 is fixed" msg: "Ansible V2.7.0 can't be used until: https://github.com/ansible/ansible/issues/46600 is fixed"
that: that:
- ansible_version.string is version("2.7.0", "!=") - ansible_version.string is version("2.7.0", "!=")
- ansible_version.string is version("2.5.0", ">=") - ansible_version.string is version("2.6.0", ">=")
tags: tags:
- check - check
vars: vars:

View file

@ -7,7 +7,7 @@
msg: "Ansible V2.7.0 can't be used until: https://github.com/ansible/ansible/issues/46600 is fixed" msg: "Ansible V2.7.0 can't be used until: https://github.com/ansible/ansible/issues/46600 is fixed"
that: that:
- ansible_version.string is version("2.7.0", "!=") - ansible_version.string is version("2.7.0", "!=")
- ansible_version.string is version("2.5.0", ">=") - ansible_version.string is version("2.6.0", ">=")
tags: tags:
- check - check
vars: vars: