Kubernetes 是如何控制复制的?

How does Kubernetes control replication?

我很好奇 Kubernetes 是如何控制复制的。我的配置 yaml 文件指定我想要三个 pods,每个都有一个 Nginx 服务器,例如(从这里 -- https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/#how-a-replicationcontroller-works

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

Kubernetes 如何知道何时关闭 pods 以及何时启动更多?例如,对于高流量负载,我想启动另一个 pod,但我不确定如何在 YAML 文件中配置它,所以我想知道 Kubernetes 是否有一些幕后魔术可以做到这一点你.

Kubernetes 在这里没有魔法 - 从您的配置来看,它根本不知道也不会更改副本的数量。 您正在寻找的概念称为 Autoscaler。它使用集群中的指标(也需要 enabled/installed),然后可以决定 Pods 是否必须扩大或缩小,并且实际上会改变部署或复制控制器中的副本数量. (请使用部署,而不是复制控制器,后者不支持应用程序的滚动更新。) 您可以在此处阅读有关自动缩放器的更多信息:https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

您可以将 Horizo​​ntalPodAutoscaler 与部署一起使用,如下所示。这将根据目标 CPU 利用率以声明方式自动缩放您的 pod。

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: $DEPLOY_NAME
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: $DEPLOY_NAME
    spec:
      containers:
      - name: $DEPLOY_NAME
        image: $DEPLOY_IMAGE
        imagePullPolicy: Always
        resources:
          requests:
            cpu: "0.2"
            memory: 256Mi            
          limits:
            cpu: "1"
            memory: 1024Mi
---
apiVersion: v1
kind: Service
metadata:
  name: $DEPLOY_NAME
spec:
  selector:
    app: $DEPLOY_NAME
  ports:
      - port: 8080
  type: ClusterIP
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: $DEPLOY_NAME
  namespace: $K8S_NAMESPACE
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: $DEPLOY_NAME
  minReplicas: 2
  maxReplicas: 6
  targetCPUUtilizationPercentage: 60