## Deployments são responsáveis de criar os Pods das aplicações, fazer a troca dos Pods ao trocar a versão,
## recriar os pods que forem excluídos, entre outras configurações.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
  namespace: example-ns
  ## Labels comuns - https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/
  labels:
    app.kubernetes.io/name: example-app
    app.kubernetes.io/instance: example-app-1
    app.kubernetes.io/version: "4.0.0"
    app.kubernetes.io/component: api
    app.kubernetes.io/part-of: example-app
    app.kubernetes.io/managed-by: manual
    app.kubernetes.io/created-by: manual
spec:
  selector:
    ## Indica quais Pods este Deployment controla
    matchLabels:
      app: example

  ## quantidade de pods que devem ser criados. Ignorado quando se usa o HorizontalPodAutoscaler
  replicas: 1 

  ## template da definição dos Pods
  template:
    metadata:
      ## labels da aplicação. Usado para filtrar os Pods que fazem parte do Deployment
      labels:
        app: example

    spec:
      ## restringe em quais servidores a aplicação pode executar
      nodeSelector:
        kubernetes.io/os: linux
      
      ## declaração dos volumes que podem ser usados nos containers do Pod
      volumes: 
      
      ## exemplo usando um arquivo que foi declarado em um ConfigMap
      - name: config
        configMap: 
          name: example-configmap
      
      ## exemplo usando um arquivo que foi declarado como Secret
      - name: secrets
        secret: 
          secretName: example-secret

      ## containers que serão executados dentro deste pod
      containers:
      - name: example-app
        image: xavero/weather:4.0.0 # usar versão 4.0.0 para demo do autoscale
        
        ports:
        ## nomeando a porta permite usar esse nome no service, ao invés do número da porta
        - name: http
          containerPort: 80
        
        ## rota que o k8s usará para checar se a aplicação está funcionando. 
        ## Pode ser substituído por um comando a ser executado dentro do container.
        livenessProbe:
          httpGet:
            path: /healthz
            port: http
          initialDelaySeconds: 10
          failureThreshold: 2
          periodSeconds: 3
          timeoutSeconds: 10
        
        ## limites de cpu e memória.
        ## O ideal é que nenhum Deployment suba sem definir estes limites
        resources:
          ## quantidade mínima que a aplicação precisa para subir.
          ## Se nenhum Node no cluster tiver esse mínimo disponível, o pod ficará pendente!
          requests: 
            memory: 150Mi
            cpu: 10m ## 1% de uma cpu
          
          ## quantidade máxima que a aplicação pode usar. 
          ## Se o pod ultrapassar esses valores, o k8s o reiniciará.
          limits: 
            memory: 150Mi
            cpu: 100m ## 10% de uma cpu
        
        ## configurações de variáveis de ambiente
        env:
        
        ## declarando o valor neste arquivo
        - name: EXAMPLE_VAR
          value: example_value

        ## usando um valor do configMap
        - name: ASPNETCORE_URLS
          valueFrom:
            configMapKeyRef:
              name: example-configmap
              key: listen_url
        
        ## configurações de volumes/persistência usando ConfigMap ou Secrets
        volumeMounts:
          ## é possível mapear para dentro do container um único arquivo...
          - name: config
            subPath: appsettings.Production.json
            mountPath: /app/appsettings.Production.json
          ##  ou uma pasta inteira
          - name: secrets
            mountPath: /secrets
