应用程序 pod 可以使用环境变量或 DNS 访问服务。如果使用环境变量,当 pod 在节点上运行时,对于每个活跃服务,则 kubelet 的变量都会注入。集群感知 DNS 服务器监视 Kubernetes API 提供了新服务,并为每个服务创建一组 DNS 记录。如果整个集群中启用了 DNS,则所有 pod 都应自动根据其 DNS 名称解析服务。如果您必须超过 5000 服务,可以使用 DNS 进行服务发现。当使用环境变量进行服务发现时,参数列表超过了命名空间中 5000 服务后允许的长度,则 pod 和部署将失败。要解决这个问题,请禁用部署的服务规格文件中的服务链接:
---
apiVersion: v1
kind: Template
metadata:
name: deployment-config-template
creationTimestamp:
annotations:
description: This template will create a deploymentConfig with 1 replica, 4 env vars and a service.
tags: ''
objects:
- apiVersion: v1
kind: DeploymentConfig
metadata:
name: deploymentconfig${IDENTIFIER}
spec:
template:
metadata:
labels:
name: replicationcontroller${IDENTIFIER}
spec:
enableServiceLinks: false
containers:
- name: pause${IDENTIFIER}
image: "${IMAGE}"
ports:
- containerPort: 8080
protocol: TCP
env:
- name: ENVVAR1_${IDENTIFIER}
value: "${ENV_VALUE}"
- name: ENVVAR2_${IDENTIFIER}
value: "${ENV_VALUE}"
- name: ENVVAR3_${IDENTIFIER}
value: "${ENV_VALUE}"
- name: ENVVAR4_${IDENTIFIER}
value: "${ENV_VALUE}"
resources: {}
imagePullPolicy: IfNotPresent
capabilities: {}
securityContext:
capabilities: {}
privileged: false
restartPolicy: Always
serviceAccount: ''
replicas: 1
selector:
name: replicationcontroller${IDENTIFIER}
triggers:
- type: ConfigChange
strategy:
type: Rolling
- apiVersion: v1
kind: Service
metadata:
name: service${IDENTIFIER}
spec:
selector:
name: replicationcontroller${IDENTIFIER}
ports:
- name: serviceport${IDENTIFIER}
protocol: TCP
port: 80
targetPort: 8080
portalIP: ''
type: ClusterIP
sessionAffinity: None
status:
loadBalancer: {}
parameters:
- name: IDENTIFIER
description: Number to append to the name of resources
value: '1'
required: true
- name: IMAGE
description: Image to use for deploymentConfig
value: gcr.io/google-containers/pause-amd64:3.0
required: false
- name: ENV_VALUE
description: Value to use for environment variables
generate: expression
from: "[A-Za-z0-9]{255}"
required: false
labels:
template: deployment-config-template
---apiVersion: v1
kind: Template
metadata:name: deployment-config-template
creationTimestamp:annotations:description: This template will create a deploymentConfig with 1 replica, 4 env vars and a service.
tags:''objects:-apiVersion: v1
kind: DeploymentConfig
metadata:name: deploymentconfig${IDENTIFIER}spec:template:metadata:labels:name: replicationcontroller${IDENTIFIER}spec:enableServiceLinks:falsecontainers:-name: pause${IDENTIFIER}image:"${IMAGE}"ports:-containerPort:8080protocol: TCP
env:-name: ENVVAR1_${IDENTIFIER}value:"${ENV_VALUE}"-name: ENVVAR2_${IDENTIFIER}value:"${ENV_VALUE}"-name: ENVVAR3_${IDENTIFIER}value:"${ENV_VALUE}"-name: ENVVAR4_${IDENTIFIER}value:"${ENV_VALUE}"resources:{}imagePullPolicy: IfNotPresent
capabilities:{}securityContext:capabilities:{}privileged:falserestartPolicy: Always
serviceAccount:''replicas:1selector:name: replicationcontroller${IDENTIFIER}triggers:-type: ConfigChange
strategy:type: Rolling
-apiVersion: v1
kind: Service
metadata:name: service${IDENTIFIER}spec:selector:name: replicationcontroller${IDENTIFIER}ports:-name: serviceport${IDENTIFIER}protocol: TCP
port:80targetPort:8080portalIP:''type: ClusterIP
sessionAffinity: None
status:loadBalancer:{}parameters:-name: IDENTIFIER
description: Number to append to the name of resources
value:'1'required:true-name: IMAGE
description: Image to use for deploymentConfig
value: gcr.io/google-containers/pause-amd64:3.0required:false-name: ENV_VALUE
description: Value to use for environment variables
generate: expression
from:"[A-Za-z0-9]{255}"required:falselabels:template: deployment-config-template
Copy to ClipboardCopied!Toggle word wrapToggle overflow
可在命名空间中运行的应用程序 pod 数量取决于服务数量以及环境变量用于服务发现时的服务名称长度。系统中的ARG_MAX 为新进程定义最大参数长度,默认设置为 2097152 KiB。Kubelet 将环境变量注入到要在命名空间中运行的每个 pod 中,包括:
<SERVICE_NAME>_SERVICE_HOST=<IP>
<SERVICE_NAME>_SERVICE_PORT=<PORT>
<SERVICE_NAME>_PORT=tcp://<IP>:<PORT>
<SERVICE_NAME>_PORT_<PORT>_TCP=tcp://<IP>:<PORT>
<SERVICE_NAME>_PORT_<PORT>_TCP_PROTO=tcp
<SERVICE_NAME>_PORT_<PORT>_TCP_PORT=<PORT>
<SERVICE_NAME>_PORT_<PORT>_TCP_ADDR=<ADDR>
如果参数长度超过允许的值,服务名称中的字符数会受到影响,命名空间中的 pod 将开始失败。例如,在一个带有 5000 服务的命名空间中,服务名称的限制为 33 个字符,它可让您在命名空间中运行 5000 个 Pod。