Kubernetes

Implantando e executando um microsserviço Devprime no kubernetes

Para publicar uma imagem de container no kubernetes é necessário ter uma imagem pública no docker hub ou em repositórios como Azure Container Registry (ACR), Amazon Elastic Container Registry, Google Container Registry, Oracle Cloud Infrastructure Container Registry e outros.

Nós recomendamos uma leitura na documentação sobre o Docker que demonstra como construir uma imagem docker e publicar em um repositório.

Criando um arquivo de deployment “deployment.yml”
O procedimento padrão no kubernetes é criar um arquivo de deployment como “deployment.yml” e incluir o conteúdo abaixo modificando a configuração da imagem. Os parâmetros “env” que representam as variáveis de ambiente.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
apiVersion : apps/v1
kind: Deployment
metadata:
  name: ms-order
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ms-order
  template:
    metadata:
      labels:
        app: ms-order
    spec:
      containers:
        - name: ms-order
          image: ms-order:latest
          imagePullPolicy: Always
          readinessProbe:  # Disponivel para receber trafego
            httpGet:
              path: /healthcheck #/healthz  # Endpoint que a sonda de prontidão deve verificar
              port: 80  # Porta em que o contêiner está escutando
            initialDelaySeconds: 30  # Tempo de espera inicial antes de iniciar as verificações
            periodSeconds: 10  # Frequência de verificação da prontidão
            timeoutSeconds: 1
            successThreshold: 1
            failureThreshold: 3
          livenessProbe:  # Disponivel para receber trafego
            httpGet:
              path: /healthcheck #/healthz  # Endpoint que a sonda de prontidão deve verificar
              port: 80  # Porta em que o contêiner está escutando
            initialDelaySeconds: 40  # Tempo de espera inicial antes de iniciar as verificações
            periodSeconds: 10 # Frequência de verificação da prontidão
            timeoutSeconds: 1 # How long to wait for a response
            successThreshold: 1 # Criterio para considerar sucesso
            failureThreshold: 3 # Number of failures to tolerate before restarting
            terminationGracePeriodSeconds: 90 # Override pod-level termination
          ports:
          - containerPort: 80
          env:
           - name: Devprime_app
             value: "license=Put your license|||debug=false|||debugstate=false|||debugstream=false|||debugweb=false|||showenviromentvariables=false|||tenancy=[enable=false,type=Shared,cache=State2,gateway=https://localhost:5003]"
           - name: Devprime_observability
             value: "enable=true|||saveinfile=false|||hidedetails=false|||hidedatetime=false|||showhttperrors=400"
           - name: Devprime_web
             value: "url=http://*:80|||enable=true|||enableswagger=true|||postsuccess=201|||postfailure=500|||getsuccess=200|||getfailure=500|||patchsuccess=200|||patchfailure=500|||putsuccess=200|||putfailure=500|||deletesuccess=200|||deletefailure=500"
           - name: Devprime_stream1
             value: "alias=Stream1|||enable=true|||default=true|||streamtype=RabbitMQ|||hostname=rabbitmq.default.svc|||user=guest|||password=guest|||port=5672|||exchange=Devprime|||exchangetype=direct|||retry=3|||fallback=State1"
           - name: Devprime_state1
             value: "alias=State1|||dbtype=mongodb|||connection=mongodb://mongoadmin:LltF8Nx*yo@mongodb.default.svc:27017|||timeout=5|||retry=2|||dbname=ms-order|||isssl=true|||numberofattempts=4|||durationofbreak=45"
           - name: Devprime_Custom
             value: "stream.orderevents=OrderEvents"
           - name: Devprime_Security
             value: ""
           - name: Devprime_Services
             value: "enable=true|||retry=3|||circuitbreak=45|||timeout=10|||connections=[clientid=your client id,clientsecret=your client secret,granttype=client_credentials,name=Services1,tokenuri=your token uri]"        

          resources:
            requests:
             memory: "75Mi"
             cpu: "1m"
            limits:
             memory: "130Mi"
             cpu: "150m"

Após criar o arquivo basta executar o apply.
kubectl apply -f .\deployment.yml

Depois basta listar os pods
kubectl get pods

NAME                        READY   STATUS    RESTARTS   AGE
ms-order-848cc9c6bf-sxkhr   1/1     Running   0          10m

Criando um arquivo de service “service.yml”
Nós também criaremos um serviço para obter um ip público para esse pod. Crie o arquivo
“service.yml”.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
apiVersion: v1
kind: Service
metadata:  
  name: ms-order
spec:
  selector:    
    app: ms-order
  type: LoadBalancer
  ports:  
  - name: http
    port: 80
    targetPort: 80

Execute o apply para criar o serviço no kubernetes
kubectl apply -f .\service.yml

Depois basta consultar e obter o endereço ip.

NAME         TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
ms-order     LoadBalancer   10.0.146.208   20.85.248.63   80:30549/TCP   35m

Agora basta abrir a sua aplicação no endereço ip do EXTERNAL-IP.

Exportando as configurações para o Kubernetes
O Devprime oferece um comando para exportar as configurações iniciais do arquivo Deployment e Servicces. Ao executar na pasta do projeto ele faz todos os passos iniciais.
dp export kubernetes

Devprime microsserviços kubernetes

Considerações
Nós demonstramos como é simples publicar um microsserviços Devprime no kubernetes.

  • Utilize um processo de DevOps e serviços como AKS, GKE, EKS, OKE
  • Utilize serviços de cofres para as credenciais.
Última modificação March 29, 2024 (2268b42e)