简体   繁体   中英

Memory Sev3 alerts in Azure kubernetes cluster with default resource allocations for 2 pods - mySQL db and Spring app

I deployed few days ago 2 services into Azure Kube.netes cluster. I set up cluster with 1 node, virtual machine parameters: B2s: 2 Cores, 4 GB RAM, 8 GB Temporary storage. Then I placed 2 pods on the same node:

  • MySQL database with 4Gib storage persistent volume, 5 tables at the moment
  • Spring boot java application There is no replicas.

Take a look on kubectl output regarding the deployed pods:

在此处输入图像描述

The purpose is to create internal application in company where I work which will be used by company team. There won't be a lot of data in DB.

When we started to test connection with API from front-end I received memory alert like below:

在此处输入图像描述

mySQL deployment yaml file looks like:

apiVersion: v1
kind: Service
metadata:
    name: mysql-db-testing-service
    namespace: testing
spec:
    type: LoadBalancer
    ports:
    - port: 3307
      targetPort: 3306
    selector:
        app: mysql-db-testing
---
apiVersion: apps/v1
kind: Deployment
metadata:
    name: mysql-db-testing
    namespace: testing
spec:
    selector:
        matchLabels:
            app: mysql-db-testing
    replicas: 1
    strategy:
        type: Recreate
    template:
        metadata:
            labels:
                app: mysql-db-testing
        spec:
            containers: 
            - name: mysql-db-container-testing 
              image: mysql:8.0.31
              env: 
              - name: MYSQL_ROOT_PASSWORD
                valueFrom:
                    secretKeyRef:
                        name: mysqldb-secret-testing 
                        key:  password
              ports:
              - containerPort: 3306
                name: mysql-port
              volumeMounts:
              - mountPath: "/var/lib/mysql"
                name: mysql-persistent-storage
            volumes:
            - name: mysql-persistent-storage
              persistentVolumeClaim:
                claimName: azure-managed-disk-pvc-mysql-testing
            nodeSelector:
                env: preprod

Spring app deployment yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-app-api-testing
  namespace: testing
  labels:
    app: spring-app-api-testing
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-app-api-testing
  template:
    metadata:
      labels:
        app: spring-app-api-testing
    spec:
      containers:
        - name: spring-app-api-testing
          image: techradaracr.azurecr.io/technology-radar-be:$(Build.BuildId)
          env:
          - name: MYSQL_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysqldb-secret-testing
                key: password
          - name: MYSQL_PORT
            valueFrom:
              configMapKeyRef:
                name: spring-app-testing-config-map
                key: mysql_port
          - name: MYSQL_HOST
            valueFrom:
              configMapKeyRef:
                name: spring-app-testing-config-map
                key: mysql_host
      nodeSelector:
        env: preprod
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: spring-app-api-testing
    k8s-app: spring-app-api-testing
  name: spring-app-api-testing-service
  namespace: testing
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
  type: LoadBalancer
  selector:
    app: spring-app-api-testing

First I deployed MySQl database, then java Spring API. I guess the problem is with default resource allocation and MySQL db is using 90 % of overall RAM memory. That's why I'm receiving memory alert.I know that there are sections for resources allocation in yaml config:

  resources:
      requests:
        cpu: 250m
        memory: 64Mi
      limits:
        cpu: 500m
        memory: 256Mi

for minimum and maximum cpu and memory resources. Question is how many of them should I allocate for spring app and how many for mySQL database in order to avoid memory problems? I would be grateful for help.

First of all, running the whole cluster on only one VM defeats the purpose of using Kube.netes, specially that you are using a small SKU for the VMSS. Have you considered running the application outside of k8s?

To answer your question, there is no given formula or set values for the request/limits. The values you choose for resource requests and limits will depend on the specific requirements of your application and the resources available in your cluster.

In detail, you should consider the workload characteristics, cluster capacity, performance (if the values are too small, the application will struggle) and cost.

Please refer to the best practices here: https://learn.microsoft.com/en-us/azure/aks/developer-best-practices-resource-management

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM