由於Argo CD會定時同步Git倉庫和叢集中應用的狀態,會和通過容器水平伸縮(HPA)來控制Pod副本數的行為發生衝突。因此對於使用GitOps發布的應用,如果使用容器水平伸縮控制Pod副本數,您需要對應用進行相應配置避免產生衝突。配置方式按照副本數分為預設1個副本和預設多個副本兩種情境。
預設1個副本
如果您的應用預設的Pod副本數為1,並且應用使用HPA來控制副本數,則僅需要將Git倉庫應用中的Deployment資源的replicas欄位注釋掉。
樣本如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
# do not include replicas in the manifests if you want replicas to be controlled by HPA
# replicas: 1
template:
spec:
containers:
- image: nginx:1.7.9
name: nginx
ports:
- containerPort: 80
...預設多個副本
如果您的應用需要預設使用多個副本,該情境下需要根據Diffing Customization進行配置,忽略spec.replicas的Differences,這樣Argo CD不會去管理Pod的副本數,副本數會被HPA單獨管理。
以下為您提供應用層級和系統層級兩種配置方式,更多資訊,請參見Argo CD Diffing Customization。
Ignore Differences應用層級的配置
應用層級的配置是指僅對於指定Application中的資源生效,配置Application的.spec.ignoreDifferences忽略Deployment資源的spec.replicas。
如需對確定Deployment生效,可以指定其name和namespace。
樣本如下:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: app-test
namespace: argocd
spec:
ignoreDifferences:
- group: apps
kind: Deployment
#name: test
#namespace: default
jsonPointers:
- /spec/replicas
...Ignore Differences系統層級的配置
系統層級的配置是指對於整個艦隊的資源生效。在argocd/argocd-cm中配置,忽略由managers管理的Kubernetes資源的spec.replicas。
配置樣本如下,其中ACK One GitOps需要配置manager controlplane-kcm:
apiVersion: v1
data:
...
resource.customizations.ignoreDifferences.all: |
managedFieldsManagers:
- kube-controller-manager
- controlplane-kcm
jsonPointers:
- /spec/replicas
kind: ConfigMap
metadata:
name: argocd-cm
namespace: argocd相關文檔
如何為應用開啟HPA,請參見容器水平伸縮(HPA)。
有關Pod水平自動擴縮的演算法,請參見演算法細節。