Kubernetes VPA: проблема с селектором targetref + минимальные ресурсы - PullRequest
0 голосов
/ 19 марта 2019

У меня 2 вопроса: - мой автоскалер Vertical pod не соответствует моей минимальной политике в отношении ресурсов:

Spec:
  Resource Policy:
    Container Policies:
      Min Allowed:
        Cpu:     50m        <==== mini allowed for CPU
        Memory:  75Mi
      Mode:      auto
  Target Ref:
    API Version:  extensions/v1beta1
    Kind:         Deployment
    Name:         hello-world
  Update Policy:
    Update Mode:  Auto
Status:
  Conditions:
    Last Transition Time:  2019-03-19T19:11:36Z
    Status:                True
    Type:                  RecommendationProvided
  Recommendation:
    Container Recommendations:
      Container Name:  hello-world
      Lower Bound:
        Cpu:     25m
        Memory:  262144k
      Target:
        Cpu:     25m       <==== actual CPU configured by the VPA
        Memory:  262144k
  • Я настроил свой VPA для использования нового типа селектора меток с помощью targetref, но в журналах рекомендаций указано, что я использую устаревший:

    Error while fetching legacy selector. Reason: v1beta1 selector not found
    

Вот моя конфигурация развертывания:

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hello-world
  namespace: hello-world
  labels:
    name: hello-world
spec:
  selector:
    matchLabels:
      name: hello-world
  replicas: 2
  template:
    metadata:
      labels:
        name: hello-world
    spec:
      securityContext:
        fsGroup: 101
      containers:
        - name: hello-world
          image: xxx/hello-world:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 3000
              protocol: TCP
          resources:
            limits:
              cpu: 500m
              memory: 500Mi
            requests:
              cpu: 100m
              memory: 150Mi
          volumeMounts:
          - mountPath: /u/app/www/images
            name: nfs-volume
      volumes:
      - name: nfs-volume
        persistentVolumeClaim:
          claimName: hello-world

Вот моя конфигурация VPA:

---
apiVersion: "autoscaling.k8s.io/v1beta2"
kind: VerticalPodAutoscaler
metadata:
  name: hello-world
  namespace: hello-world
spec:
  targetRef:
    apiVersion: "extensions/v1beta1"
    kind: Deployment
    name: hello-world
  resourcePolicy:
    containerPolicies:
    - minAllowed:
        cpu: 50m
        memory: 75Mi
      mode: auto
  updatePolicy:
    updateMode: "Auto"

Я использую kubernetes v1.13.2, VPA v0.4, и вот его конфигурация:

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: vpa-recommender
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: vpa-recommender
    spec:
      serviceAccountName: vpa-recommender
      containers:
      - name: recommender
        image: k8s.gcr.io/vpa-recommender:0.4.0
        imagePullPolicy: Always
        resources:
          limits:
            cpu: 200m
            memory: 1000Mi
          requests:
            cpu: 50m
            memory: 500Mi
        ports:
        - containerPort: 8080
        command:
        - ./recommender
        - --alsologtostderr=false
        - --logtostderr=false
        - --prometheus-address=http://prometheus-service.monitoring:9090/
        - --prometheus-cadvisor-job-name=cadvisor
        - --v=10

Спасибо

1 Ответ

2 голосов
/ 20 марта 2019

Я не думаю, что вы используете старый сборщик.

Вот код :

legacySelector, fetchLegacyErr := feeder.legacySelectorFetcher.Fetch(vpa)
if fetchLegacyErr != nil {
    glog.Errorf("Error while fetching legacy selector. Reason: %+v", fetchLegacyErr)
}
selector, fetchErr := feeder.selectorFetcher.Fetch(vpa)
if fetchErr != nil {
    glog.Errorf("Cannot get target selector from VPA's targetRef. Reason: %+v", fetchErr)
}

Autoscaler, просто сначала попытайтесь получить устаревший селектор, а затемиспользуйте новый.

Об ограничениях ресурса.

Вот комментарий в исходном коде (PodResourcePolicy - это блок «resourcePolicy» в спецификации):

PodResourcePolicy контролирует, как autoscaler вычисляет рекомендуемые ресурсыдля контейнеров, принадлежащих к стручку.Для каждого именованного контейнера может быть не более одной записи и, необязательно, одна групповая запись с containerName = '*', которая обрабатывает все контейнеры, не имеющие отдельных политик.

Я думаю,Вы также должны установить ContainerName в своей спецификации, потому что вы хотите одну политику для всего модуля:

apiVersion: "autoscaling.k8s.io/v1beta2"
kind: VerticalPodAutoscaler
metadata:
  name: hello-world
  namespace: hello-world
spec:
  targetRef:
    apiVersion: "extensions/v1beta1"
    kind: Deployment
    name: hello-world
  resourcePolicy:
    containerPolicies:
    - minAllowed:
        cpu: 50m
        memory: 75Mi
      mode: auto
      containerName: "*" # Added line
  updatePolicy:
    updateMode: "Auto"
...