mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	Merge pull request #45565 from Q-Lee/mds
Automatic merge from submit-queue Adding a metadata proxy addon **What this PR does / why we need it**: adds a metadata server proxy daemonset to hide kubelet secrets. **Which issue this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close that issue when PR gets merged)*: this partially addresses #8867 **Special notes for your reviewer**: **Release note**: the gce metadata server can be hidden behind a proxy, hiding the kubelet's token. ```release-note The gce metadata server can be hidden behind a proxy, hiding the kubelet's token. ```
This commit is contained in:
		
							
								
								
									
										8
									
								
								cluster/addons/metadata-proxy/OWNERS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								cluster/addons/metadata-proxy/OWNERS
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					approvers:
 | 
				
			||||||
 | 
					- q-lee
 | 
				
			||||||
 | 
					- cjcullen
 | 
				
			||||||
 | 
					- mikedanese
 | 
				
			||||||
 | 
					reviewers:
 | 
				
			||||||
 | 
					- q-lee
 | 
				
			||||||
 | 
					- cjcullen
 | 
				
			||||||
 | 
					- mikedanese
 | 
				
			||||||
							
								
								
									
										5
									
								
								cluster/addons/metadata-proxy/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								cluster/addons/metadata-proxy/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -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.
 | 
				
			||||||
@@ -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;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										52
									
								
								cluster/addons/metadata-proxy/gce/metadata-proxy.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								cluster/addons/metadata-proxy/gce/metadata-proxy.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
				
			||||||
@@ -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, 
 | 
					# 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.
 | 
					# label each Node so that the DaemonSet can run the Pods only on ready Nodes.
 | 
				
			||||||
if [[ ${NETWORK_POLICY_PROVIDER:-} == "calico" ]]; then
 | 
					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
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Optional: Enable node logging.
 | 
					# Optional: Enable node logging.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -173,6 +173,12 @@ 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
 | 
					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.
 | 
					# Optional: Enable node logging.
 | 
				
			||||||
ENABLE_NODE_LOGGING="${KUBE_ENABLE_NODE_LOGGING:-true}"
 | 
					ENABLE_NODE_LOGGING="${KUBE_ENABLE_NODE_LOGGING:-true}"
 | 
				
			||||||
LOGGING_DESTINATION="${KUBE_LOGGING_DESTINATION:-gcp}" # options: elasticsearch, gcp
 | 
					LOGGING_DESTINATION="${KUBE_LOGGING_DESTINATION:-gcp}" # options: elasticsearch, gcp
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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_node_problem_detector: '$(echo "$ENABLE_NODE_PROBLEM_DETECTOR" | sed -e "s/'/''/g")'
 | 
				
			||||||
enable_l7_loadbalancing: '$(echo "$ENABLE_L7_LOADBALANCING" | 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_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")'
 | 
					enable_rescheduler: '$(echo "$ENABLE_RESCHEDULER" | sed -e "s/'/''/g")'
 | 
				
			||||||
logging_destination: '$(echo "$LOGGING_DESTINATION" | sed -e "s/'/''/g")'
 | 
					logging_destination: '$(echo "$LOGGING_DESTINATION" | sed -e "s/'/''/g")'
 | 
				
			||||||
elasticsearch_replicas: '$(echo "$ELASTICSEARCH_LOGGING_REPLICAS" | sed -e "s/'/''/g")'
 | 
					elasticsearch_replicas: '$(echo "$ELASTICSEARCH_LOGGING_REPLICAS" | sed -e "s/'/''/g")'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1487,6 +1487,9 @@ function start-kube-addons {
 | 
				
			|||||||
  if [[ "${NON_MASQUERADE_CIDR:-}" == "0.0.0.0/0" ]]; then
 | 
					  if [[ "${NON_MASQUERADE_CIDR:-}" == "0.0.0.0/0" ]]; then
 | 
				
			||||||
    setup-addon-manifests "addons" "ip-masq-agent"
 | 
					    setup-addon-manifests "addons" "ip-masq-agent"
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					  if [[ "${ENABLE_METADATA_PROXY:-}" == "simple" ]]; then
 | 
				
			||||||
 | 
					    setup-addon-manifests "addons" "metadata-proxy/gce"
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Place addon manager pod manifest.
 | 
					  # Place addon manager pod manifest.
 | 
				
			||||||
  cp "${src_dir}/kube-addon-manager.yaml" /etc/kubernetes/manifests
 | 
					  cp "${src_dir}/kube-addon-manager.yaml" /etc/kubernetes/manifests
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -178,6 +178,17 @@ addon-dir-create:
 | 
				
			|||||||
    - file_mode: 644
 | 
					    - file_mode: 644
 | 
				
			||||||
{% endif %}
 | 
					{% 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' %}
 | 
					{% if pillar.get('enable_cluster_ui', '').lower() == 'true' %}
 | 
				
			||||||
/etc/kubernetes/addons/dashboard:
 | 
					/etc/kubernetes/addons/dashboard:
 | 
				
			||||||
  file.recurse:
 | 
					  file.recurse:
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user