Revisão do Skaffold para desenvolvimento do Kubernetes

Revisão do Skaffold para desenvolvimento do Kubernetes

Há um ano e meio, em 5 de março de 2018, o Google lançou a primeira versão alfa de seu projeto Open Source para CI/CD chamado Andaime, cujo objetivo era criar “desenvolvimento Kubernetes simples e repetível” para que os desenvolvedores pudessem se concentrar no desenvolvimento e não na administração. O que pode ser interessante sobre Skaffold? Acontece que ele tem alguns truques na manga que podem torná-lo uma ferramenta poderosa para o desenvolvedor e talvez até para o engenheiro de operações. Vamos conhecer o projeto e suas capacidades.

NB: Aliás, já falamos brevemente sobre Skaffold em nosso geral revisão das ferramentas do desenvolvedor, cujas vidas estão conectadas ao Kubernetes.

Teoria. Finalidade e capacidades

Portanto, de modo geral, o Skaffold resolve o problema de automatizar o ciclo CI/CD (nos estágios de construção, envio e implantação), oferecendo ao desenvolvedor feedback imediato, ou seja, a capacidade de receber rapidamente o resultado de alterações subsequentes no código - na forma de um aplicativo atualizado em execução no cluster Kubernetes. E pode funcionar em diferentes circuitos (desenvolvimento, estágio, produção...), para os quais Skaffold ajuda a descrever os pipelines correspondentes para implementação.

O código-fonte do Skaffold é escrito em Go, distribuído por sob a licença gratuita Apache 2.0 (GitHub).

Vejamos as principais funções e recursos. O primeiro inclui o seguinte:

  • Skaffold oferece ferramentas para criar pipelines de CI/CD.
  • Permite monitorar alterações no código-fonte em segundo plano e executar um processo automatizado de montagem de código em imagens de contêiner, publicando essas imagens no Docker Registry e implantando-as no cluster Kubernetes.
  • Sincroniza arquivos no repositório com o diretório de trabalho no contêiner.
  • Testa automaticamente usando teste de estrutura de contêiner.
  • Encaminha portas.
  • Lê os logs de um aplicativo em execução em um contêiner.
  • Ajuda na depuração de aplicativos escritos em Java, Node.js, Python, Go.

Agora sobre os recursos:

  • O próprio Skaffold não possui componentes do lado do cluster. Ou seja, não há necessidade de configurar ainda mais o Kubernetes para usar este utilitário.
  • Diferentes pipelines para sua aplicação. Você precisa implementar o código no Minikube local enquanto está desenvolvendo e, em seguida, para o estágio ou produção? Para este efeito existem Perfis e configurações de usuário, variáveis ​​de ambiente e sinalizadores, que permitem descrever diferentes pipelines para um aplicativo.
  • CLI. Somente utilitário de console e configurações em YAML. Na Internet você pode encontrar referências a tentativas de criar GUI experimental, no entanto, no momento isso provavelmente significa apenas que alguém precisa dele, mas não realmente.
  • Modularidade. Skaffold não é uma colheitadeira independente, mas se esforça para usar módulos individuais ou soluções existentes para tarefas específicas.

Ilustração deste último:

  • Na fase de montagem você pode usar:
    • docker build localmente, em um cluster usando kaniko ou no Google Cloud Build;
    • Bazel localmente;
    • Jib Maven e Jib Gradle localmente ou no Google Cloud Build;
    • scripts de construção personalizados são executados localmente. Se você precisar executar outra solução de construção (mais flexível/familiar/...), ela será descrita no script para que o Skaffold a inicie (exemplo da documentação). Isso permite que você use qualquer coletor que possa ser chamado por meio de um script;
  • Na fase de testes, o já mencionado teste de estrutura de contêiner;
  • Para implantação são fornecidos:
    • Kubectl;
    • Leme;
    • customizar.

Graças a isso, Skaffold pode ser chamado de único estrutura para construção de CI/CD. Aqui está um exemplo de fluxo de trabalho ao usá-lo (da documentação do projeto):

Revisão do Skaffold para desenvolvimento do Kubernetes

Como é o trabalho de Skaffold em termos gerais?

  1. O utilitário monitora alterações no diretório do código-fonte. Se forem feitas modificações nos arquivos, eles serão sincronizados com o pod do aplicativo no cluster Kubernetes. Se possível, sem remontar a imagem. Caso contrário, uma nova imagem é montada.
  2. A imagem montada é verificada usando container-structure-test, marcada e enviada para o Docker Registry.
  3. Depois disso, a imagem é implantada – implantada no cluster Kubernetes.
  4. Se o lançamento foi inicializado usando o comando skaffold dev, então começamos a receber logs do aplicativo e o Skaffold aguarda as alterações para repetir todas as ações novamente.

Revisão do Skaffold para desenvolvimento do Kubernetes
Ilustração das principais etapas da operação do Skaffold

Prática. Tentando o andaime

Para demonstrar o uso do Skaffold, pegarei um exemplo de Repositório de projetos GitHub. Aliás ibid Você pode encontrar muitos outros exemplos que levam em consideração várias especificidades. Realizarei todas as ações localmente no Minikube. A instalação é simples e leva alguns minutos, e você precisará do kubectl para começar.

Instale o Skaffold:

curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64
chmod +x skaffold
sudo mv skaffold /usr/local/bin
skaffold version
v0.37.1

Vamos clonar o repositório do Skaffold com os exemplos necessários:

git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices

Escolhi um exemplo com dois pods, cada um contendo um pequeno aplicativo Go. Um aplicativo é o frontend (leeroy-web), que redireciona a solicitação para o segundo aplicativo - o backend (leeroy-app). Vamos ver como é:

~/skaffold/examples/microservices # tree
.
├── leeroy-app
│   ├── app.go
│   ├── Dockerfile
│   └── kubernetes
│       └── deployment.yaml
├── leeroy-web
│   ├── Dockerfile
│   ├── kubernetes
│   │   └── deployment.yaml
│   └── web.go
├── README.adoc
└── skaffold.yaml
 
4 directories, 8 files

leeroy-app e leeroy-web contêm código Go e Dockerfiles simples para construir este código localmente:

~/skaffold/examples/microservices # cat leeroy-app/Dockerfile
FROM golang:1.12.9-alpine3.10 as builder
COPY app.go .
RUN go build -o /app .
 
FROM alpine:3.10
CMD ["./app"]
COPY --from=builder /app .

Não vou fornecer o código do aplicativo - basta saber disso leeroy-web aceita solicitações e faz proxy delas para leeroy-app. Portanto nos arquivos Deployment.yaml existe um serviço apenas para app (para roteamento interno). Porta do pod web iremos encaminhá-lo para nós mesmos para acesso rápido ao aplicativo.

Parece skaffold.yaml:

~/skaffold/examples/microservices # cat skaffold.yaml
apiVersion: skaffold/v1beta13
kind: Config
build:
  artifacts:
    - image: leeroy-web
      context: ./leeroy-web/
    - image: leeroy-app
      context: ./leeroy-app/
deploy:
  kubectl:
    manifests:
      - ./leeroy-web/kubernetes/*
      - ./leeroy-app/kubernetes/*
portForward:
  - resourceType: deployment
    resourceName: leeroy-web
    port: 8080
    localPort: 9000

Todas as etapas mencionadas acima são descritas aqui. Além desta configuração, há também um arquivo com configurações globais - ~/.skaffold/config. Ele pode ser editado manualmente ou via CLI - por exemplo, assim:

skaffold config set --global local-cluster true

Este comando definirá a variável global local-cluster em significado true, após o qual o Skaffold não tentará enviar imagens para o registro remoto. Se estiver desenvolvendo localmente, você poderá usar este comando para construir imagens localmente.

Voltar para skaffold.yaml:

  • No palco build especificamos que você precisa coletar e salvar a imagem localmente. Depois que a compilação for executada pela primeira vez, veremos o seguinte:
    // т.к. Minikube создает кластер в отдельной виртуальной машине,
    // придется проникнуть внутрь, чтобы найти образы
    # minikube ssh
    $ docker images
    REPOSITORY                                TAG                                                                IMAGE ID            CREATED             SIZE 
    leeroy-app                                7d55a50803590b2ff62e47e6f240723451f3ef6f8c89aeb83b34e661aa287d2e   7d55a5080359        4 hours ago         13MB 
    leeroy-app                                v0.37.1-171-g0270a0c-dirty                                         7d55a5080359        4 hours ago         13MB
    leeroy-web                                5063bfb29d984db1ff70661f17d6efcc5537f2bbe6aa6907004ad1ab38879681   5063bfb29d98        5 hours ago         13.1MB
    leeroy-web                                v0.37.1-171-g0270a0c-dirty                                         5063bfb29d98        5 hours ago         13.1MB

    Como você pode ver, o próprio Skaffold marcou as imagens. A propósito, várias políticas de marcação são suportadas.

  • Mais adiante na configuração está indicado context: ./leeroy-app/, ou seja o contexto em que a imagem é coletada é especificado.
  • Na fase de implantação, está determinado que usaremos kubectl e uma máscara para os manifestos necessários.
  • PortForward: semelhante a como normalmente encaminhamos portas usando kubectl port-forward, damos instruções ao Skaffold para chamar este comando. Neste caso, a porta local 9000 é encaminhada para 8080 em Deployment com o nome leeroy-web.

É hora de lançar skaffold dev: A equipe criará um “ciclo de feedback” contínuo, ou seja, ele não apenas coletará tudo e implantará no cluster, mas também informará sobre o estado dos pods no momento, monitorará as alterações e atualizará o estado dos pods.

Aqui está o resultado do lançamento skaffold dev --port-forward ao remontar:

Revisão do Skaffold para desenvolvimento do Kubernetes

Primeiro, você pode ver que o cache está sendo usado. Em seguida, o aplicativo é montado, implantado e as portas são encaminhadas. Desde que especificado --port-forward, Skaffold encaminhou a porta para web, como lhe foi perguntado, mas aqui app ele jogou a seu critério (escolheu o livre mais próximo). Depois disso, recebemos os primeiros logs das aplicações.

Vamos verificar se funciona?

~/skaffold/examples/microservices # kubectl get po
NAME                          READY   STATUS    RESTARTS   AGE
leeroy-app-6998dfcc95-2nxvf   1/1     Running   0          103s
leeroy-web-69f7d47c9d-5ff77   1/1     Running   0          103s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy app!!!

Modificando o arquivo leeroy-app/app.go - alguns segundos se passam... e:

~/skaffold/examples/microservices # kubectl get po
NAME                          READY   STATUS    RESTARTS   AGE
leeroy-app-ffd79d986-l6nwp    1/1     Running   0          11s
leeroy-web-69f7d47c9d-5ff77   1/1     Running   0          4m59s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy Habr!!!

Ao mesmo tempo, o próprio Skaffold exibiu no console a mesma coisa de antes, com exceção de um ponto: ele apenas foi lançado leeroy-app, e não de uma vez.

Mais prática

Vale ressaltar também que ao criar um novo projeto, as configurações do Skaffold podem ser inicializadas usando o comando init, o que é muito conveniente. Além disso, você pode escrever várias configurações: realizar o desenvolvimento na configuração padrão e, em seguida, implementar no cenário com o comando run (mesmo processo que dev, apenas não monitora alterações), usando uma configuração diferente.

No Katacoda existe orientar É ainda mais fácil com um exemplo. Mas oferece um sandbox pronto com Kubernetes, um aplicativo e Skaffold. Uma ótima opção se você estiver interessado em experimentar o básico sozinho.

Um possível caso de uso do Skaffold é conduzir o desenvolvimento em um cluster remoto. Nem todo mundo se sente confortável executando o Minikube em seu próprio hardware, depois implementando o aplicativo e esperando que ele funcione adequadamente... Nesse caso, o Skaffold resolve o problema perfeitamente, o que pode ser confirmado, por exemplo, pelos engenheiros do Reddit, como temos já discutido писали em nosso blog.

E em esta publicação no Weaveworks você pode encontrar um exemplo de criação de um pipeline para produção.

Conclusão

Skaffold é uma ferramenta conveniente para construir pipelines que envolvem a implementação de aplicativos no Kubernetes e são focados principalmente nas necessidades de desenvolvimento. Torna bastante fácil criar um pipeline “curto” que leva em conta as necessidades básicas do desenvolvedor, mas se desejar, você pode organizar processos maiores. Como um dos exemplos claros de uso do Skaffold em processos de CI/CD é dada tal projeto de teste de 10 microsserviços usando os recursos de Kubernetes, gRPC, Istio e OpenCensus Tracing.

Skaffold já tem quase 8000 estrelas no GitHub, é desenvolvido pelo Google e faz parte do GoogleContainerTools — em geral, neste momento há todos os motivos para acreditar que o projeto se desenvolverá feliz para sempre.

PS

Leia também em nosso blog:

Fonte: habr.com

Adicionar um comentário