A aplicação flask é uma simples API que serve as horas de acordo com o horário do servidor no formato json:
from flask import Flask, jsonify
from datetime import datetime
app = Flask(__name__)
@app.route('/')
def get_current_time():
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return jsonify({'time': current_time})
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0', port=5000)
O Dockerfile abaixo:
1 - Define qual imagem Linux eu quero utilizar, nesse caso, uma imagem especifica para trabalhar com python.
2 - Define um diretório para por os arquivos da aplicação
3 - Copia os conteúdos do diretório atual para o diretório especificado. Nesse caso o mesmo que o da linha 2, mas poderia ser um terceiro diretório.
4 - Instala as dependências utilizadas pelo app.py
5 - Expôe uma porta, nesse caso, a utiliza pela aplicação flask:
6 - Comando que coloca a aplicação flask para funcionar.
1 FROM python:3-alpine3.15
2 WORKDIR /time-server
3 COPY . /time-server
4 RUN pip install -r requirements.txt
5 EXPOSE 5000
6 CMD python ./app.py
Para construir a imagem a partir do Dockerfile:
$ docker build --tag clusterminator/time-server:2.0 .
Para executar o servidor apenas com o docker, basta usar:
$ docker run -d -p 80:5000 clusterminator/time-server:2.0
Ao acessar o endereço localhost você terá uma resposta similar à:
{
"time": "2024-04-04 23:14:18"
}
Para executar a aplicação usando kubernetes, acesse o diretório dos containers:
$ cd kubernetes-yaml-files
Você vai encontrar dois arquivos:
1 apiVersion: v1
2 kind: Pod
3 metadata:
4 name: pod-time-server
5 labels:
6 app: pod-time-server
7 spec:
8 containers:
9 - name: time-server-container
10 image: clusterminator/time-server:2.0
11 ports:
12 - containerPort: 5000
-
apiVersion
: Especifica a versão da API Kubernetes que está sendo usada, nesse caso, a versão 1. -
kind
: Especifica o tipo de objeto que queremos criar, nesse caso, um Pod. -
metadados
: Contém metadados sobre o pod, como nome e rótulos. -
name
: Especifica o nome do Pod comopod-time-server
. -
labels
: Campo para especificar rótulos que serão usados para selecionar o pod. -
app
: Atribui o rótulopod-time-server
ao pod. Este rótulo pode ser usado por outros pod e serviços para identificar e selecionar pods com este rótulo. -
spec
: Define a especificação do Pod, incluindo seus contêineres e outras configurações. -
containers
: Especifica uma lista de contêineres a serem executados dentro do Pod. -
name
: Define o nome do contêiner. -
image: clusterminator/time-server:2.0
: Especifica a imagem Docker a ser usada para o contêiner. -
ports
: Especifica uma lista de portas a serem expostas no contêiner. -
containerPort
: Indica que o contêiner escuta na porta5000
. Essa porta será exposta e poderá ser acessada de dentro do pod e, se configurada, também de fora do pod.
apiVersion: v1
kind: Service
metadata:
name: NodePort-time-server
spec:
1 type: NodePort
2 selector:
3 app: time-server-pod
4 ports:
5 - port: 80
6 targetPort: 5000
7 nodePort: 30000
-
type:
: Especifica o tipo de serviço comoNodePort
. Este tipo expõe o Serviço no IP de cada Node em uma porta estática (onodePort
). -
selector
: Especifica os pods para os quais este serviço encaminhará o tráfego. Nesse caso, ele seleciona Pods com o rótuloapp: time-server-pod
. -
ports
: Especifica uma lista de portas a serem expostas pelo Serviço. -
port
: Indica que o Serviço irá escutar na porta80
. Esta é a porta à qual os clientes se conectarão ao acessar o Serviço. -
targetPort
: Especifica a porta nos pods para a qual o serviço encaminhará o tráfego. Nesse caso, é a porta5000
, que é a porta em que os Pods estão escutando. -
nodePort
: Especifica o número da porta estática em cada nó onde o serviço será exposto. Esta é uma porta com numeração alta na faixa30000-32767
que clientes externos podem usar para acessar o Serviço. Neste caso, é30000
.
Depois execute os comandos abaixo:
$ kubectl apply -f pod-time-server.yaml
$ kubectl apply -f NodePort-time-server.yaml
O primeiro vai inicializar o servidor em si e o segundo vai criar o serviço de NodePort, expondo o servidor na porta 30000 do seu host (isso é, sua máquina) a aplicação vai estar disponível em localhost:30000.