diff --git a/cluster/addons/metadata-proxy/OWNERS b/cluster/addons/metadata-proxy/OWNERS new file mode 100644 index 00000000000..bfa927212c5 --- /dev/null +++ b/cluster/addons/metadata-proxy/OWNERS @@ -0,0 +1,8 @@ +approvers: +- q-lee +- cjcullen +- mikedanese +reviewers: +- q-lee +- cjcullen +- mikedanese diff --git a/cluster/addons/metadata-proxy/README.md b/cluster/addons/metadata-proxy/README.md new file mode 100644 index 00000000000..73b0e2d0c7b --- /dev/null +++ b/cluster/addons/metadata-proxy/README.md @@ -0,0 +1,5 @@ +# Metadata proxy +============== + +This metadata proxy returns a 403 for kubelet's kube-env data, but otherwise allows +pods access to the metadata server. diff --git a/cluster/addons/metadata-proxy/gce/metadata-proxy-configmap.yaml b/cluster/addons/metadata-proxy/gce/metadata-proxy-configmap.yaml new file mode 100644 index 00000000000..5be4cbe3b61 --- /dev/null +++ b/cluster/addons/metadata-proxy/gce/metadata-proxy-configmap.yaml @@ -0,0 +1,60 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: metadata-proxy-config + namespace: kube-system + labels: + addonmanager.kubernetes.io/mode: EnsureExists +data: + nginx.conf: |- + user www-data; + worker_processes 4; + pid /run/nginx.pid; + error_log /dev/stdout; + + events { + worker_connections 20; + } + + http { + access_log /dev/stdout; + server { + listen 127.0.0.1:988; + + # By default, return 403. This protects us from new API versions. + location / { + return 403; + } + + # Allow for REST discovery. + location = / { + proxy_pass http://169.254.169.254; + } + location = /computeMetadata/ { + proxy_pass http://169.254.169.254; + } + + # By default, allow the v0.1, v1beta1, and v1 APIs. + location /0.1/ { + proxy_pass http://169.254.169.254; + } + location /computeMetadata/v1beta1/ { + proxy_pass http://169.254.169.254; + } + location /computeMetadata/v1/ { + proxy_pass http://169.254.169.254; + } + + # Return a 403 for the kube-env attribute in all allowed API versions. + location /0.1/meta-data/attributes/kube-env { + return 403; + } + location /computeMetadata/v1beta1/instance/attributes/kube-env { + return 403; + } + location /computeMetadata/v1/instance/attributes/kube-env { + return 403; + } + } + } + diff --git a/cluster/addons/metadata-proxy/gce/metadata-proxy.yaml b/cluster/addons/metadata-proxy/gce/metadata-proxy.yaml new file mode 100644 index 00000000000..feb6e5ea546 --- /dev/null +++ b/cluster/addons/metadata-proxy/gce/metadata-proxy.yaml @@ -0,0 +1,52 @@ +apiVersion: extensions/v1beta1 +kind: DaemonSet +metadata: + name: metadata-proxy-v0.1 + namespace: kube-system + labels: + k8s-app: metadata-proxy + kubernetes.io/cluster-service: "true" + addonmanager.kubernetes.io/mode: Reconcile + version: v0.1 +spec: + updateStrategy: + type: RollingUpdate + template: + metadata: + labels: + k8s-app: metadata-proxy + kubernetes.io/cluster-service: "true" + version: v0.1 + # This annotation ensures that the proxy does not get evicted if the node + # supports critical pod annotation based priority scheme. + # Note that this does not guarantee admission on the nodes (#40573). + annotations: + scheduler.alpha.kubernetes.io/critical-pod: '' + spec: + hostNetwork: true + dnsPolicy: Default + containers: + - name: metadata-proxy + image: gcr.io/google-containers/metadata-proxy:0.1 + imagePullPolicy: Always + securityContext: + privileged: true + command: + - '/start-proxy.sh' + resources: + requests: + memory: "32Mi" + cpu: "50m" + limits: + memory: "32Mi" + cpu: "50m" + volumeMounts: + - name: config-volume + mountPath: /etc/nginx/ + nodeSelector: + beta.kubernetes.io/metadata-proxy-ready: "true" + terminationGracePeriodSeconds: 30 + volumes: + - name: config-volume + configMap: + name: metadata-proxy-config diff --git a/cluster/gce/config-default.sh b/cluster/gce/config-default.sh index 2358d52d103..f454de48759 100755 --- a/cluster/gce/config-default.sh +++ b/cluster/gce/config-default.sh @@ -129,7 +129,13 @@ NODE_LABELS="${KUBE_NODE_LABELS:-beta.kubernetes.io/fluentd-ds-ready=true}" # To avoid running Calico on a node that is not configured appropriately, # label each Node so that the DaemonSet can run the Pods only on ready Nodes. if [[ ${NETWORK_POLICY_PROVIDER:-} == "calico" ]]; then - NODE_LABELS="$NODE_LABELS,projectcalico.org/ds-ready=true" + NODE_LABELS="${NODE_LABELS},projectcalico.org/ds-ready=true" +fi + +# Turn the simple metadata proxy on by default. +ENABLE_METADATA_PROXY="${ENABLE_METADATA_PROXY:-simple}" +if [[ ${ENABLE_METADATA_PROXY} != "false" ]]; then + NODE_LABELS="${NODE_LABELS},beta.kubernetes.io/metadata-proxy-ready=true" fi # Optional: Enable node logging. diff --git a/cluster/gce/config-test.sh b/cluster/gce/config-test.sh index 76cccb6ec2e..7d82a495fad 100755 --- a/cluster/gce/config-test.sh +++ b/cluster/gce/config-test.sh @@ -173,6 +173,12 @@ if [[ ${NETWORK_POLICY_PROVIDER:-} == "calico" ]]; then NODE_LABELS="$NODE_LABELS,projectcalico.org/ds-ready=true" fi +# Turn the simple metadata proxy on by default. +ENABLE_METADATA_PROXY="${ENABLE_METADATA_PROXY:-simple}" +if [[ ${ENABLE_METADATA_PROXY} != "false" ]]; then + NODE_LABELS="${NODE_LABELS},beta.kubernetes.io/metadata-proxy-ready=true" +fi + # Optional: Enable node logging. ENABLE_NODE_LOGGING="${KUBE_ENABLE_NODE_LOGGING:-true}" LOGGING_DESTINATION="${KUBE_LOGGING_DESTINATION:-gcp}" # options: elasticsearch, gcp diff --git a/cluster/gce/configure-vm.sh b/cluster/gce/configure-vm.sh index 2d1dad42284..d5a90b909c9 100755 --- a/cluster/gce/configure-vm.sh +++ b/cluster/gce/configure-vm.sh @@ -419,6 +419,7 @@ enable_cluster_ui: '$(echo "$ENABLE_CLUSTER_UI" | sed -e "s/'/''/g")' enable_node_problem_detector: '$(echo "$ENABLE_NODE_PROBLEM_DETECTOR" | sed -e "s/'/''/g")' enable_l7_loadbalancing: '$(echo "$ENABLE_L7_LOADBALANCING" | sed -e "s/'/''/g")' enable_node_logging: '$(echo "$ENABLE_NODE_LOGGING" | sed -e "s/'/''/g")' +enable_metadata_proxy: '$(echo "$ENABLE_METADATA_PROXY" | sed -e "s/'/''/g")' enable_rescheduler: '$(echo "$ENABLE_RESCHEDULER" | sed -e "s/'/''/g")' logging_destination: '$(echo "$LOGGING_DESTINATION" | sed -e "s/'/''/g")' elasticsearch_replicas: '$(echo "$ELASTICSEARCH_LOGGING_REPLICAS" | sed -e "s/'/''/g")' diff --git a/cluster/gce/gci/configure-helper.sh b/cluster/gce/gci/configure-helper.sh index 8215720b702..127d54df051 100644 --- a/cluster/gce/gci/configure-helper.sh +++ b/cluster/gce/gci/configure-helper.sh @@ -1487,6 +1487,9 @@ function start-kube-addons { if [[ "${NON_MASQUERADE_CIDR:-}" == "0.0.0.0/0" ]]; then setup-addon-manifests "addons" "ip-masq-agent" fi + if [[ "${ENABLE_METADATA_PROXY:-}" == "simple" ]]; then + setup-addon-manifests "addons" "metadata-proxy/gce" + fi # Place addon manager pod manifest. cp "${src_dir}/kube-addon-manager.yaml" /etc/kubernetes/manifests diff --git a/cluster/saltbase/salt/kube-addons/init.sls b/cluster/saltbase/salt/kube-addons/init.sls index 6dd5b1c07ef..ba51e78aab5 100644 --- a/cluster/saltbase/salt/kube-addons/init.sls +++ b/cluster/saltbase/salt/kube-addons/init.sls @@ -178,6 +178,17 @@ addon-dir-create: - file_mode: 644 {% endif %} +{% if pillar.get('enable_metadata_proxy', '').lower() == 'true' %} +/etc/kubernetes/addons/metadata-proxy/gce: + file.recurse: + - source: salt://kube-addons/metadata-proxy/gce + - include_pat: E@^.+\.yaml$ + - user: root + - group: root + - dir_mode: 755 + - file_mode: 644 +{% endif %} + {% if pillar.get('enable_cluster_ui', '').lower() == 'true' %} /etc/kubernetes/addons/dashboard: file.recurse: