Pod 类型 |
Pod 数量 |
最大内存 |
CPU 核心数 |
持久性存储 |
apache |
100 |
500 MB |
0.5 |
1 GB |
node.js |
200 |
1 GB |
1 |
1 GB |
postgresql |
100 |
1 GB |
2 |
10 GB |
JBoss EAP |
100 |
1 GB |
1 |
1 GB |
推断的需求:550 个 CPU 核心、450 GB RAM 和 1.4 TB 存储。
节点的实例大小可以根据您的偏好进行上调或下调。节点通常会超额使用资源。在此部署方案中,您可以选择运行更多较小的节点或较少的较大节点以提供相同数量的资源。应考虑诸如运营敏捷性和每实例成本之类的因素。
节点类型 |
数量 |
CPU |
RAM (GB) |
节点(选项 1) |
100 |
4 |
16 |
节点(选项 2) |
50 |
8 |
32 |
节点(选项 3) |
25 |
16 |
64 |
某些应用程序适合超额使用环境,而某些应用程序则不适合。大多数 Java 应用程序和使用巨型页面的应用程序都是不允许超额使用的应用程序示例。该内存不能用于其他应用程序。在上面的示例中,环境大约超额使用了 30%,这是一个常见的比率。
应用 Pod 可以通过环境变量或 DNS 访问服务。如果使用环境变量,则对于每个活动服务,kubelet 在 Pod 在节点上运行时会注入变量。一个集群感知的 DNS 服务器监视 Kubernetes API 中的新服务,并为每个服务创建一组 DNS 记录。如果在整个集群中启用了 DNS,则所有 Pod 都应该能够自动通过其 DNS 名称解析服务。如果必须超过 5000 个服务,可以使用 DNS 进行服务发现。当使用环境变量进行服务发现时,如果命名空间中超过 5000 个服务,参数列表会超过允许的长度,那么 Pod 和 Deployment 将开始失败。禁用 deployment 服务规范文件中的服务链接可以解决此问题。
---
apiVersion: template.openshift.io/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: apps.openshift.io/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
clusterIP: ''
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
可以在命名空间中运行的应用程序 Pod 数量取决于服务数量以及使用环境变量进行服务发现时服务名称的长度。系统上的ARG_MAX
定义了新进程的最大参数长度,默认为 2097152 字节 (2 MiB)。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。