Merge branch 'MichaelCade:main' into main
4
.github/workflows/deploy-blog-posts.yml
vendored
@ -22,7 +22,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v4
|
||||
- name: Publish articles on dev.to
|
||||
uses: sinedied/publish-devto@v2
|
||||
id: publish_devto
|
||||
@ -54,4 +54,4 @@ jobs:
|
||||
Changes result:
|
||||
```
|
||||
${{ steps.publish_devto.outputs.result_summary }}
|
||||
```
|
||||
```
|
||||
|
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
.DS_Store
|
BIN
2022/.DS_Store
vendored
@ -80,7 +80,6 @@ My advice is to watch all of the below and hopefully you also picked something u
|
||||
- [Continuous Testing - IBM YouTube](https://www.youtube.com/watch?v=RYQbmjLgubM)
|
||||
- [Continuous Integration - IBM YouTube](https://www.youtube.com/watch?v=1er2cjUq1UI)
|
||||
- [Continuous Monitoring](https://www.youtube.com/watch?v=Zu53QQuYqJ0)
|
||||
- [The Remote Flow](https://www.notion.so/The-Remote-Flow-d90982e77a144f4f990c135f115f41c6)
|
||||
- [FinOps Foundation - What is FinOps](https://www.finops.org/introduction/what-is-finops/)
|
||||
- [**NOT FREE** The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win](https://www.amazon.com/Phoenix-Project-DevOps-Helping-Business/dp/1942788290/)
|
||||
|
||||
|
@ -170,6 +170,5 @@ You can customise this portal with your branding and this might be something we
|
||||
- [Hybrid Cloud and MultiCloud](https://www.youtube.com/watch?v=qkj5W98Xdvw)
|
||||
- [Microsoft Azure Fundamentals](https://www.youtube.com/watch?v=NKEFWyqJ5XA&list=WL&index=130&t=12s)
|
||||
- [Google Cloud Digital Leader Certification Course](https://www.youtube.com/watch?v=UGRDM86MBIQ&list=WL&index=131&t=10s)
|
||||
- [AWS Basics for Beginners - Full Course](https://www.youtube.com/watch?v=ulprqHHWlng&t=5352s)
|
||||
|
||||
See you on [Day 31](day31.md)
|
||||
|
BIN
2022/es/.DS_Store
vendored
@ -43,43 +43,44 @@ Uma vez implantado, vamos operá-lo. E operá-lo pode envolver algo como você c
|
||||
|
||||
## Monitoramento
|
||||
|
||||
All of the above parts lead to the final step because you need to have monitoring, especially around operational issues auto-scaling troubleshooting like you don't know
|
||||
there's a problem if you don't have monitoring in place to tell you that there's a problem so some of the things you might build monitoring for are memory utilization CPU utilization disk space, API endpoint, response time, how quickly that endpoint is responding and a big part of that as well is logs. Logs give developers the ability to see what is happening without having to access production systems.
|
||||
Todas as partes acima levam à etapa final que é o monitoramento, especialmente em torno de questões operacionais como solução de problemas de escalonamento automático. Você não saberá que há um problema se não tiver monitoramento implementado.
|
||||
Algum dos elementos para os quais você pode desenvolver monitoramento incluem a utilização de memória, a utilização da CPU, o espaço em disco, API endpoint, tempo de resposta, e o quão rapidamente esse endpoint está respondendo.
|
||||
Além disso, uma parte significativa disso são os logs. Os logs proporcionam aos desenvolvedores a capacidade de ver o que está acontecendo sem precisar acessar sistemas de produção.
|
||||
|
||||
## Rinse & Repeat
|
||||
## Limpe & Repita
|
||||
|
||||
Once that's in place you go right back to the beginning to the planning stage and go through the whole thing again
|
||||
Uma vez implementado, você volta imediatamente à etapa de planejamento e passa por todo o processo novamente.
|
||||
|
||||
## Continuous
|
||||
## Contínuo
|
||||
|
||||
Many tools help us achieve the above continuous process, all this code and the ultimate goal of being completely automated, cloud infrastructure or any environment is often described as Continuous Integration/ Continuous Delivery/Continous Deployment or “CI/CD” for short. We will spend a whole week on CI/CD later on in the 90 Days with some examples and walkthroughs to grasp the fundamentals.
|
||||
Muitas ferramentas nos ajudam a alcançar o processo contínuo acima, onde todo esse código e o objetivo final de ser completamente automatizado, seja em infraestrutura na nuvem ou em qualquer outro ambiente é frequentemente descrito como Integração Contínua /Entrega Contínua/ Implantação Contínua, ou "CI/CD" de forma abreviada. Passaremos uma semana inteira focando em CI/CD mais adiante, no decorrer dos próximos 90 dias, com exemplos e demonstrações para compreender os fundamentos.
|
||||
|
||||
### Continuous Delivery
|
||||
### Entrega Contínua
|
||||
|
||||
Continuous Delivery = Plan > Code > Build > Test
|
||||
Entrega Contínua = Planejar > Codar > Construir > Testar
|
||||
|
||||
### Continuous Integration
|
||||
### Integração Contínua
|
||||
|
||||
This is effectively the outcome of the Continuous Delivery phases above plus the outcome of the Release phase. This is the case for both failure and success but this is fed back into continuous delivery or moved to Continuous Deployment.
|
||||
Este é efetivamente o resultado das fases de Entrega Contínua acima, mais o resultado da fase de Lançamento(Release). Esse é o caso tanto do fracasso quanto do sucesso, mas isso é realimentado na entrega contínua ou movido para a implantação contínua.
|
||||
|
||||
Continuous Integration = Plan > Code > Build > Test > Release
|
||||
Integração Contínua = Plano > Código > Construir > Teste > Lançamento(Release)
|
||||
|
||||
### Continuous Deployment
|
||||
### Implantação Contínua
|
||||
|
||||
If you have a successful release from your continuous integration then move to Continuous Deployment which brings in the following phases
|
||||
Se você tiver uma versão bem-sucedida de sua Integração Contínua, avance para a Implantação Contínua, que inclui as seguintes fases
|
||||
|
||||
CI Release is Success = Continuous Deployment = Deploy > Operate > Monitor
|
||||
Lançamento (Release) da Integração Contínua bem sucedido = Implantação Contínua = Implantação > Operação > Monitoramento
|
||||
|
||||
You can see these three Continuous notions above as the simple collection of phases of the DevOps Lifecycle.
|
||||
Você pode ver essas três noções contínuas acima como a simples coleção de fases do Ciclo de Vida DevOps.
|
||||
|
||||
This last bit was a bit of a recap for me on Day 3 but think this makes things clearer for me.
|
||||
Esta última parte foi uma recapitulação do Dia 3 para mim, mas acho que isso torna as coisas mais claras para mim.
|
||||
|
||||
### Resources
|
||||
### Recursos
|
||||
|
||||
- [DevOps for Developers – Software or DevOps Engineer?](https://www.youtube.com/watch?v=a0-uE3rOyeU)
|
||||
- [Techworld with Nana -DevOps Roadmap 2022 - How to become a DevOps Engineer? What is DevOps?](https://www.youtube.com/watch?v=9pZ2xmsSDdo&t=125s)
|
||||
- [How to become a DevOps Engineer in 2021 - DevOps Roadmap](https://www.youtube.com/watch?v=5pxbp6FyTfk)
|
||||
- [DevOps para desenvolvedores – Engenheiro de software ou DevOps?](https://www.youtube.com/watch?v=a0-uE3rOyeU)
|
||||
- [Techworld with Nana -DevOps Roadmap 2022 - Como se tornar um engenheiro DevOps? O que é DevOps?](https://www.youtube.com/watch?v=9pZ2xmsSDdo&t=125s)
|
||||
- [Como se tornar um engenheiro DevOps em 2021 - DevOps Roadmap](https://www.youtube.com/watch?v=5pxbp6FyTfk)
|
||||
|
||||
If you made it this far then you will know if this is where you want to be or not.
|
||||
Se você chegou até aqui, saberá se é aqui que deseja estar ou não.
|
||||
|
||||
See you on [Day 6](day06.md).
|
||||
Vejo você no [Dia 6](day06.md).
|
||||
|
75
2022/pt-br/Days/day06.md
Normal file
@ -0,0 +1,75 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - DevOps - As histórias reais - Day 6'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - DevOps - As histórias reais
|
||||
tags: 'devops, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1048855
|
||||
---
|
||||
|
||||
## DevOps - As histórias reais
|
||||
|
||||
No início, o DevOps era considerado fora do alcance de muitos de nós, pois não tínhamos empresas como a Netflix ou uma empresa da Fortune 500 praticando-o, mas acho que agora está começando a voltar ao normal, à medida que as empresas começam a adotar uma prática DevOps.
|
||||
|
||||
Você verá pelas referências abaixo que existem muitos setores e verticais diferentes que usam DevOps e, portanto, têm um enorme efeito positivo em seus objetivos de negócios.
|
||||
|
||||
O benefício geral aqui é que o DevOps, se feito corretamente, deve ajudar a melhorar a velocidade e a qualidade do desenvolvimento de software do seu negócio.
|
||||
|
||||
Queria aproveitar este dia para analisar empresas de sucesso que adotaram uma prática DevOps e compartilhar alguns recursos sobre isso. Esta será uma grande oportunidade para a comunidade mergulhar e ajudar aqui. Você adotou uma cultura DevOps em seu negócio? Foi bem sucedido?
|
||||
|
||||
Mencionei o Netflix acima e irei abordá-lo novamente, pois é um modelo muito bom e bastante avançado em comparação com o que geralmente vemos hoje, mas também mencionarei algumas outras grandes marcas que estão tendo sucesso nisso.
|
||||
|
||||
## Amazon
|
||||
|
||||
Em 2010, a Amazon mudou a área de seu servidor físico para a nuvem AWS (Amazon Web Services). Isso lhes permitiu economizar recursos aumentando e diminuindo a capacidade em incrementos muito pequenos. Também sabemos que a AWS gerou altas receitas enquanto administrava a filial de varejo da Amazon.
|
||||
|
||||
A Amazon adotou em 2011 (de acordo com o link abaixo) um processo de implantação contínua onde seus desenvolvedores poderiam implantar código sempre que quisessem e em qualquer servidor que precisassem. Isso permitiu que a Amazon conseguisse implantar novo software em servidores de produção em uma média de 11,6 segundos!
|
||||
|
||||
## Netflix
|
||||
|
||||
Quem não usa Netflix? É um serviço de streaming de alta qualidade e, pessoalmente falando, oferece uma ótima experiência ao usuário.
|
||||
|
||||
Por que a experiência do usuário é tão boa? Bem, a capacidade de fornecer um serviço sem nenhuma lembrança pessoal de falhas exige velocidade, flexibilidade e atenção à qualidade.
|
||||
|
||||
Os desenvolvedores da Netflix podem criar automaticamente trechos de código em imagens da web implantáveis, sem depender de operações de TI. À medida que as imagens são atualizadas, elas são integradas à infraestrutura da Netflix por meio de uma plataforma personalizada baseada na Web.
|
||||
|
||||
O monitoramento contínuo está em vigor para que, se a implantação das imagens falhar, as novas imagens sejam revertidas e o tráfego seja redirecionado de volta para a versão anterior.
|
||||
|
||||
Há uma ótima palestra listada abaixo que aborda mais sobre o que fazer e o que não fazer pela Netflix em suas equipes.
|
||||
|
||||
## Etsy
|
||||
|
||||
Tal como acontece com muitos de nós e com muitas empresas, houve uma verdadeira luta em torno de implementações lentas e dolorosas. Na mesma linha, também podemos ter experiência de trabalhar em empresas que possuem muitos silos e equipes que não trabalham bem juntas.
|
||||
|
||||
Pelo que pude perceber ao ler sobre Amazon e Netflix é que o Etsy pode ter adotado a permissão para que os desenvolvedores implantassem seu código por volta do final de 2009, o que pode ter sido antes mesmo dos outros dois. (Interessante!)
|
||||
|
||||
Uma conclusão interessante que li aqui foi que eles perceberam que, quando os desenvolvedores se sentem responsáveis pela implantação, eles também assumiriam a responsabilidade pelo desempenho do aplicativo, pelo tempo de atividade e por outros objetivos.
|
||||
|
||||
Uma cultura de aprendizagem é uma parte fundamental do DevOps. Até o fracasso pode ser um sucesso se as lições forem aprendidas. (não tenho certeza de onde veio essa citação, mas faz sentido!)
|
||||
|
||||
Adicionei algumas outras histórias em que o DevOps mudou o jogo em algumas dessas empresas de enorme sucesso.
|
||||
|
||||
## Resources
|
||||
|
||||
- [Como a Netflix pensa em DevOps](https://www.youtube.com/watch?v=UTKIT6STSVM)
|
||||
- [16 casos de uso populares de DevOps e aplicativos da vida real [2021]](https://www.upgrad.com/blog/devops-use-cases-applications/)
|
||||
- [DevOps: A história da Amazon](https://www.youtube.com/watch?v=ZzLa0YEbGIY)
|
||||
- [Como o Etsy faz o DevOps funcionar](https://www.networkworld.com/article/2886672/how-etsy-makes-devops-work.html)
|
||||
- [Adotando DevOps @ Scale Lições aprendidas na Hertz, Kaiser Permanente e IBM](https://www.youtube.com/watch?v=gm18-gcgXRY)
|
||||
- [DevOps interplanetário na NASA JPL](https://www.usenix.org/conference/lisa16/technical-sessions/presentation/isla)
|
||||
- [Target CIO explica como o DevOps se enraizou dentro do gigante do varejo](https://enterprisersproject.com/article/2017/1/target-cio-explains-how-devops-took-root-inside-retail-giant)
|
||||
|
||||
### Recapitulação dos nossos primeiros dias analisando DevOps
|
||||
|
||||
- DevOps é uma combinação de Desenvolvimento e Operações que permite que uma única equipe gerencie todo o ciclo de vida de desenvolvimento de aplicativos, que consiste em **Desenvolvimento**, **Testes**, **Implantação**, **Operações**.
|
||||
|
||||
- O principal foco e objetivo do DevOps é encurtar o ciclo de vida de desenvolvimento e, ao mesmo tempo, fornecer recursos, correções e funcionalidades frequentemente em estreito alinhamento com os objetivos de negócios.
|
||||
|
||||
- DevOps é uma abordagem de desenvolvimento de software por meio da qual o software pode ser entregue e desenvolvido de maneira confiável e rápida. Você também pode ver isso referenciado como **Desenvolvimento, teste, implantação, monitoramento contínuos**
|
||||
|
||||
Se você chegou até aqui, saberá se é aqui que deseja estar ou não. Vejo você no [Dia 7](day07.md).
|
||||
|
||||
No dia 7, mergulharemos em uma linguagem de programação. Não pretendo ser um desenvolvedor, mas quero entender o que os desenvolvedores estão fazendo.
|
||||
|
||||
Podemos conseguir isso em uma semana? Provavelmente não, mas se passarmos 7 dias ou 7 horas aprendendo algo, saberemos mais do que quando começamos.
|
71
2022/pt-br/Days/day07.md
Normal file
@ -0,0 +1,71 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Panorama geral: aprendendo uma linguagem de programação - Day 7'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Panorama geral: aprendendo uma linguagem de programação
|
||||
tags: 'devops, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1048856
|
||||
---
|
||||
|
||||
## Panorama geral: DevOps e aprendizado de uma linguagem de programação
|
||||
|
||||
Acho justo dizer que para ter sucesso no longo prazo como engenheiro de DevOps você precisa conhecer pelo menos uma linguagem de programação em um nível básico. Quero aproveitar esta primeira sessão desta seção para explorar por que essa é uma habilidade tão importante de se ter e, esperançosamente, até o final desta semana ou seção, você terá uma melhor compreensão do porquê, como e o que fazer. fazer para progredir em sua jornada de aprendizado.
|
||||
|
||||
Acho que se eu perguntasse nas redes sociais, você precisa ter habilidades de programação para funções relacionadas a DevOps, a resposta provavelmente seria um duro sim? Deixe-me saber se você pensa o contrário? Ok, mas então uma questão maior e é aqui que você não obterá uma resposta tão clara sobre qual linguagem de programação? A resposta mais comum que vi aqui foi Python ou cada vez mais, vemos que Golang ou Go deveria ser a linguagem que você aprenderá.
|
||||
|
||||
Para ter sucesso no DevOps, você precisa ter um bom conhecimento de habilidades de programação, pelo menos o que concluí. Mas temos que entender por que precisamos disso para escolher o caminho certo.
|
||||
|
||||
## Entenda por que você precisa aprender uma linguagem de programação.
|
||||
|
||||
A razão pela qual Python e Go são recomendados com tanta frequência para engenheiros de DevOps é que muitas das ferramentas de DevOps são escritas em Python ou Go, o que faz sentido se você pretende criar ferramentas de DevOps. Agora, isso é importante porque determinará realmente o que você deve aprender e o que provavelmente seria mais benéfico. Se você pretende construir ferramentas DevOps ou está se juntando a uma equipe que o faz, então faria sentido aprender a mesma linguagem. Se você estiver fortemente envolvido em Kubernetes ou Containers, é mais do que provável que você queira escolha Go como sua linguagem de programação. Para mim, a empresa em que trabalho (Kasten by Veeam) está no ecossistema Cloud-Native focado em gerenciamento de dados para Kubernetes e tudo é escrito em Go.
|
||||
|
||||
Mas então você pode não ter um raciocínio claro como esse para escolher se você pode ser um estudante ou estar em transição de carreira sem nenhuma decisão real tomada por você. Acho que nesta situação você deve escolher aquele que parece ressoar e se adequar aos aplicativos com os quais deseja trabalhar.
|
||||
|
||||
Lembre-se de que não pretendo me tornar um desenvolvedor de software aqui, só quero entender um pouco mais sobre a linguagem de programação para poder ler e entender o que essas ferramentas estão fazendo e, então, isso possivelmente nos levará a como podemos ajudar a melhorar as coisas.
|
||||
|
||||
Também é importante saber como você interage com as ferramentas DevOps que podem ser Kasten K10 ou Terraform e HCL. Isso é o que chamaremos de arquivos de configuração e é assim que você interage com essas ferramentas DevOps para fazer as coisas acontecerem, geralmente serão YAML. (Podemos usar o último dia desta seção para mergulhar um pouco no YAML)
|
||||
|
||||
## Acabei de me convencer a não aprender uma linguagem de programação?
|
||||
|
||||
Na maioria das vezes ou dependendo da função, você ajudará as equipes de engenharia a implementar DevOps em seu fluxo de trabalho, fazendo muitos testes em torno do aplicativo e garantindo que o fluxo de trabalho criado esteja alinhado aos princípios de DevOps que mencionamos nos primeiros dias. . Mas, na realidade, muitas vezes será necessário solucionar um problema de desempenho do aplicativo ou algo parecido. Isso volta ao meu argumento e raciocínio originais: a linguagem de programação que preciso saber é aquela em que o código está escrito? Se o aplicativo for escrito em NodeJS, não ajudará muito se você tiver um emblema Go ou Python.
|
||||
|
||||
## Por que Go?
|
||||
|
||||
Por que Golang é a próxima linguagem de programação para DevOps? Go se tornou uma linguagem de programação muito popular nos últimos anos. De acordo com a pesquisa StackOverflow para 2021, Go ficou em quarto lugar nas linguagens de programação, script e marcação mais procuradas, com Python sendo o principal, mas me escute. [Pesquisa de desenvolvedores StackOverflow 2021 – link mais procurado](https://insights.stackoverflow.com/survey/2021#section-most-loved-dreaded-and-wanted-programming-scripting-and-markup-languages)
|
||||
|
||||
Como também mencionei, algumas das ferramentas e plataformas DevOps mais conhecidas são escritas em Go, como Kubernetes, Docker, Grafana e Prometheus.
|
||||
|
||||
Quais são algumas das características do Go que o tornam excelente para DevOps?
|
||||
|
||||
## Construção e implantação de programas Go
|
||||
|
||||
Uma vantagem de usar uma linguagem como Python interpretada em uma função DevOps é que você não precisa compilar um programa python antes de executá-lo. Especialmente para tarefas de automação menores, você não quer ser retardado por um processo de construção que requer compilação, embora Go seja uma linguagem de programação compilada, **Go compila diretamente em código de máquina**. Go também é conhecido por tempos de compilação rápidos.
|
||||
|
||||
## Go vs Python para DevOps
|
||||
|
||||
Os programas Go são vinculados estaticamente, isso significa que quando você compila um programa go, tudo é incluído em um único executável binário e nenhuma dependência externa será necessária para ser instalada na máquina remota, o que facilita a implantação de programas go, em comparação com o programa python que usa bibliotecas externas, você deve ter certeza de que todas essas bibliotecas estão instaladas na máquina remota na qual deseja executar.
|
||||
|
||||
Go é uma linguagem independente de plataforma, o que significa que você pode produzir executáveis binários para todos os sistemas operacionais, Linux, Windows, macOS etc. e é muito fácil de fazer. Com Python, não é tão fácil criar esses executáveis binários para sistemas operacionais específicos.
|
||||
|
||||
Go é uma linguagem de muito desempenho, tem compilação rápida e tempo de execução rápido com menor uso de recursos como CPU e memória, especialmente em comparação com python, inúmeras otimizações foram implementadas na linguagem Go que a torna tão eficiente. (Recursos abaixo)
|
||||
|
||||
Ao contrário do Python, que geralmente requer o uso de bibliotecas de terceiros para implementar um programa Python específico, go inclui uma biblioteca padrão que possui a maioria das funcionalidades necessárias para DevOps integradas diretamente nela. Isso inclui processamento de arquivos de funcionalidade, serviços web HTTP, processamento JSON, suporte nativo para simultaneidade e paralelismo, bem como testes integrados.
|
||||
|
||||
Isso não é de forma alguma jogar o Python debaixo do ônibus. Estou apenas dando meus motivos para escolher Go, mas eles não são os Go vs Python acima, geralmente porque faz sentido, já que a empresa para a qual trabalho desenvolve software em Go, e é por isso.
|
||||
|
||||
Direi que, uma vez que você tenha feito isso, ou pelo menos me disseram que não estou lendo muitas páginas deste capítulo agora, é que depois que você aprende sua primeira linguagem de programação, fica mais fácil aprender outras linguagens. Você provavelmente nunca terá um único emprego em qualquer empresa em qualquer lugar onde não precise lidar com gerenciamento, arquitetura, orquestração e depuração de aplicativos JavaScript e Node JS.
|
||||
|
||||
## Resources
|
||||
|
||||
- [Pesquisa de desenvolvedores StackOverflow 2021](https://insights.stackoverflow.com/survey/2021)
|
||||
- [Por que estamos escolhendo Golang para aprender](https://www.youtube.com/watch?v=7pLqIIAqZD4&t=9s)
|
||||
- [Jake Wright - Aprenda em 12 minutos](https://www.youtube.com/watch?v=C8LgvuEBraI&t=312s)
|
||||
- [Techworld with Nana - Curso completo de Golang - 3 horas e 24 minutos](https://www.youtube.com/watch?v=yyUHQIec83I)
|
||||
- [**PAGO** Nigel Poulton Pluralsight - Fundamentos do Go - 3 horas e 26 minutos](https://www.pluralsight.com/courses/go-fundamentals)
|
||||
- [FreeCodeCamp - Aprenda Programação Go - Tutorial Golang para Iniciantes](https://www.youtube.com/watch?v=YS4e4q9oBaU&t=1025s)
|
||||
- [Hitesh Choudhary - lista de reprodução completa](https://www.youtube.com/playlist?list=PLRAV69dS1uWSR89FRQGZ6q9BR2b44Tr9N)
|
||||
|
||||
Agora, nos próximos 6 dias deste tópico, pretendo trabalhar com alguns dos recursos listados acima e documentar minhas anotações de cada dia. Você notará que geralmente duram cerca de 3 horas como um curso completo. Queria compartilhar minha lista completa para que, se você tiver tempo, siga em frente e trabalhe em cada um se o tempo permitir, vou me ater à minha hora de aprendizado cada dia.
|
||||
|
||||
Vejo você no [Dia 8](day08.md).
|
112
2022/pt-br/Days/day08.md
Normal file
@ -0,0 +1,112 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Configurando seu ambiente DevOps para Go & Hello World – Dia 8'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Configurando seu ambiente DevOps para Go & Hello World
|
||||
tags: 'devops, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1048857
|
||||
---
|
||||
|
||||
## Configurando seu ambiente DevOps para Go & Hello World
|
||||
|
||||
Antes de entrarmos em alguns dos fundamentos do Go, devemos instalá-lo em nossa estação de trabalho e fazer o que cada módulo de "aprendizado de programação 101" nos ensina: criar o aplicativo Hello World. Como este irá percorrer as etapas para instalar o Go em sua estação de trabalho, tentaremos documentar o processo em imagens para que as pessoas possam acompanhar facilmente.
|
||||
|
||||
Em primeiro lugar, vamos para [go.dev/dl](https://go.dev/dl/) e você será saudado com algumas opções disponíveis para downloads.
|
||||
|
||||

|
||||
|
||||
Se chegamos até aqui, você provavelmente sabe qual sistema operacional da estação de trabalho está executando, então selecione o download apropriado e então podemos começar a instalar. Estou usando o Windows para este passo a passo, basicamente, a partir da próxima tela, podemos deixar todos os padrões no lugar por enquanto. **_(observarei que no momento em que este artigo foi escrito, esta era a versão mais recente, portanto as capturas de tela podem estar desatualizadas)_**
|
||||
|
||||

|
||||
|
||||
Observe também que se você tiver uma versão mais antiga do Go instalada, você terá que removê-la antes de instalar. O Windows a possui integrada ao instalador e irá removê-la e instalá-la como uma só.
|
||||
|
||||
Depois de terminar, você deve abrir um prompt de comando/terminal e queremos verificar se temos o Go instalado. Se você não obtiver o resultado que vemos abaixo, o Go não está instalado e você precisará refazer seus passos.
|
||||
|
||||
`go version`
|
||||
|
||||

|
||||
|
||||
A seguir, queremos verificar nosso ambiente para Go. É sempre bom verificar se seus diretórios de trabalho estão configurados corretamente, como você pode ver abaixo, precisamos ter certeza de que você tem o seguinte diretório em seu sistema.
|
||||
|
||||

|
||||
|
||||
Você checou? Você está acompanhando? Você provavelmente obterá algo como o abaixo se tentar navegar até lá.
|
||||
|
||||

|
||||
|
||||
Ok, vamos criar esse diretório para facilitar. Vou usar o comando mkdir em meu terminal PowerShell. Também precisamos criar 3 pastas dentro da pasta Go, como você verá abaixo.
|
||||
|
||||

|
||||
|
||||
Agora temos que instalar o Go e temos nosso diretório de trabalho Go pronto para ação. Agora precisamos de um ambiente de desenvolvimento integrado (IDE). Agora existem muitos disponíveis que você pode usar, mas o mais comum e o que eu uso é o Visual Studio Code ou Code. Você pode aprender mais sobre IDEs [aqui](https://www.youtube.com/watch?v=vUn5akOlFXQ).
|
||||
|
||||
Se você ainda não baixou e instalou o VSCode em sua estação de trabalho, poderá fazê-lo acessando [aqui](https://code.visualstudio.com/download). Como você pode ver abaixo, você tem diferentes opções de sistema operacional.
|
||||
|
||||

|
||||
|
||||
Da mesma forma que na instalação do Go, vamos baixar e instalar e manter os padrões. Depois de concluído, você pode abrir o VSCode, selecionar Abrir arquivo e navegar até nosso diretório Go que criamos acima.
|
||||
|
||||

|
||||
|
||||
Você pode receber um pop-up sobre confiança, leia-o se quiser e clique em Sim, confie nos autores. (Eu não sou responsável mais tarde se você começar a abrir coisas em que não confia!)
|
||||
|
||||
Agora você deve ver as três pastas que também criamos anteriormente e o que queremos fazer agora é clicar com o botão direito na pasta src e criar uma nova pasta chamada `Hello`
|
||||
|
||||

|
||||
|
||||
Coisas muito fáceis que eu diria até agora? Agora vamos criar nosso primeiro Programa Go sem entender nada do que colocaremos nesta próxima fase.
|
||||
|
||||
Em seguida, crie um arquivo chamado `main.go` na sua pasta `Hello`. Assim que você pressionar enter no main.go você será perguntado se deseja instalar a extensão Go e também os pacotes. Você também pode verificar aquele arquivo pkg vazio que fizemos alguns passos atrás e perceber que devemos ter alguns novos pacotes aí agora?
|
||||
|
||||

|
||||
|
||||
Agora vamos colocar este aplicativo Hello World em funcionamento, copie o código a seguir em seu novo arquivo main.go e salve-o.
|
||||
|
||||
```
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
fmt.Println("Hello #90DaysOfDevOps")
|
||||
}
|
||||
```
|
||||
|
||||
Compreendo que o que foi dito acima pode não fazer sentido algum, mas abordaremos mais sobre funções, pacotes e muito mais posteriormente. Por enquanto, vamos executar nosso aplicativo. De volta ao terminal e à nossa pasta Hello podemos agora verificar se tudo está funcionando. Usando o comando abaixo podemos verificar se nosso programa de aprendizagem genérico está funcionando.
|
||||
|
||||
```
|
||||
go run main.go
|
||||
```
|
||||
|
||||

|
||||
|
||||
Mas não termina aí, e se agora quisermos pegar nosso programa e executá-lo em outras máquinas Windows? Podemos fazer isso construindo nosso binário usando o seguinte comando
|
||||
|
||||
```
|
||||
go build main.go
|
||||
```
|
||||
|
||||

|
||||
|
||||
Se executarmos isso, veríamos a mesma saída:
|
||||
|
||||
```bash
|
||||
$ ./main.exe
|
||||
Hello #90DaysOfDevOps
|
||||
```
|
||||
|
||||
## Resources
|
||||
|
||||
- [Pesquisa de desenvolvedores StackOverflow 2021](https://insights.stackoverflow.com/survey/2021)
|
||||
- [Por que estamos escolhendo Golang para aprender](https://www.youtube.com/watch?v=7pLqIIAqZD4&t=9s)
|
||||
- [Jake Wright - Aprenda Go em 12 minutos](https://www.youtube.com/watch?v=C8LgvuEBraI&t=312s)
|
||||
- [Techworld with Nana - Curso completo de Golang - 3 horas e 24 minutos](https://www.youtube.com/watch?v=yyUHQIec83I)
|
||||
- [**PAGO** Nigel Poulton Pluralsight - Fundamentos do Go - 3 horas e 26 minutos](https://www.pluralsight.com/courses/go-fundamentals)
|
||||
- [FreeCodeCamp - Aprenda Programação Go - Tutorial Golang para Iniciantes](https://www.youtube.com/watch?v=YS4e4q9oBaU&t=1025s)
|
||||
- [Hitesh Choudhary - Lista de reprodução completa](https://www.youtube.com/playlist?list=PLRAV69dS1uWSR89FRQGZ6q9BR2b44Tr9N)
|
||||
|
||||
Vejo você no [Dia 9](day09.md).
|
||||
|
||||

|
BIN
2022/tr/.DS_Store
vendored
@ -26,11 +26,11 @@ Nói chung, ít nhất là trên các máy trạm của nhà phát triển, tôi
|
||||
|
||||

|
||||
|
||||
Bây giờ chúng ta đã cập nhật Ubuntu VM với các bản cài đặt mới nhất. Bây giờ chúng tôi muốn cài thêm một số phần mềm ở đây.
|
||||
Bây giờ chúng ta đã cập nhật Ubuntu VM với các bản cài đặt mới nhất. Bây giờ chúng ta muốn cài thêm một số phần mềm ở đây.
|
||||
|
||||
Hãy chọn `figlet` - một chương trình tạo biểu ngữ văn bản.
|
||||
|
||||
Nếu chúng tôi nhập `figlet` trong terminal, bạn sẽ thấy rằng chúng ta chưa cài đặt nó trên hệ thống của mình.
|
||||
Nếu chúng ta nhập `figlet` trong terminal, bạn sẽ thấy rằng chúng ta chưa cài đặt nó trên hệ thống của mình.
|
||||
|
||||

|
||||
|
||||
@ -92,19 +92,19 @@ Trên Windows, bạn có ổ C: và đó là thứ mà chúng ta coi là gốc.
|
||||
|
||||

|
||||
|
||||
- `/lib` - Chúng tôi đã đề cập rằng `/bin` là nơi chứa các tệp nhị phân và tệp thực thi của chúng tôi, và `/lib` là nơi bạn sẽ tìm thấy các thư viện dùng chung cho các tệp đó.
|
||||
- `/lib` - Chúng ta đã đề cập rằng `/bin` là nơi chứa các tệp nhị phân và tệp thực thi, và `/lib` là nơi bạn sẽ tìm thấy các thư viện dùng chung cho các tệp đó.
|
||||
|
||||

|
||||
|
||||
- `/media` - Đây là nơi chúng tôi sẽ tìm thấy các thiết bị di động.
|
||||
- `/media` - Đây là nơi chúng ta sẽ tìm thấy các thiết bị di động.
|
||||
|
||||

|
||||
|
||||
- `/mnt` - Đây là điểm gắn kết tạm thời. Chúng tôi sẽ đề cập sâu hơn trong phần tiếp theo về lưu trữ.
|
||||
- `/mnt` - Đây là điểm gắn kết tạm thời. Chúng ta sẽ đề cập sâu hơn trong phần tiếp theo về lưu trữ.
|
||||
|
||||

|
||||
|
||||
- `/opt` - Optional software packages (gói phần mềm tùy chọn). Bạn sẽ nhận thấy ở đây rằng chúng tôi có một số phần mềm virtual box và vagrant được lưu trữ ở đây.
|
||||
- `/opt` - Optional software packages (gói phần mềm tùy chọn). Bạn sẽ nhận thấy ở đây rằng chúng ta có một số phần mềm virtual box và vagrant được lưu trữ ở đây.
|
||||
|
||||

|
||||
|
||||
@ -128,15 +128,15 @@ Trên Windows, bạn có ổ C: và đó là thứ mà chúng ta coi là gốc.
|
||||
|
||||

|
||||
|
||||
- `/usr` - Nếu chúng tôi với tư cách là người dùng đã cài đặt các gói phần mềm, gói phần mềm đó thường sẽ được cài đặt ở vị trí `/usr/bin`.
|
||||
- `/usr` - Nếu chúng ttaôi với tư cách là người dùng đã cài đặt các gói phần mềm, gói phần mềm đó thường sẽ được cài đặt ở vị trí `/usr/bin`.
|
||||
|
||||

|
||||
|
||||
- `/var` - Các ứng dụng của chúng tôi được cài đặt trong thư mục `bin`. Chúng tôi cần một nơi nào đó để lưu trữ tất cả các tệp logs, đó chính là `/var`
|
||||
- `/var` - Các ứng dụng của chúng ta được cài đặt trong thư mục `bin`. Chúng ta cần một nơi nào đó để lưu trữ tất cả các tệp logs, đó chính là `/var`
|
||||
|
||||
## Lưu trữ (Storage)
|
||||
|
||||
Khi đề cập tới một hệ thống Linux hoặc bất kỳ hệ thống nào, chúng ta có thể muốn biết các ổ đĩa có sẵn và chúng tôi có bao nhiêu dung lượng trống trên các đĩa đó. Một vài lệnh sau đây giúp xác định và sử dụng cũng như quản lý bộ lưu trữ.
|
||||
Khi đề cập tới một hệ thống Linux hoặc bất kỳ hệ thống nào, chúng ta có thể muốn biết các ổ đĩa có sẵn và chúng ta có bao nhiêu dung lượng trống trên các đĩa đó. Một vài lệnh sau đây giúp xác định và sử dụng cũng như quản lý bộ lưu trữ.
|
||||
|
||||
- `lsblk` Liệt kê các thiết bị khối (List Block devices). `sda` là đĩa vật lý của chúng ta và sau đó `sda1, sda2, sda3` là các phân vùng của chúng ta trên đĩa đó.
|
||||
|
||||
@ -156,7 +156,7 @@ Nếu bạn không muốn unmount ổ đĩa đó và bạn sẽ sử dụng nó
|
||||
|
||||
Sau khi bạn chỉnh sửa tệp cấu hình `fstab`, bạn có thể kiểm tra hoạt động bằng lệnh `sudo mount -a` nếu không có lỗi thì các thay đổi của bạn sẽ vẫn ở đó dù khởi động lại hệ thống.
|
||||
|
||||
Chúng tôi sẽ đề cập đến cách bạn chỉnh sửa tệp bằng trình soạn thảo văn bản trong ngày hôm sau
|
||||
Chúng ta sẽ đề cập đến cách bạn chỉnh sửa tệp bằng trình soạn thảo văn bản trong ngày hôm sau
|
||||
|
||||
## Tài liệu tham khảo
|
||||
|
||||
|
@ -19,7 +19,7 @@ Có rất nhiều tùy chọn ngoài kia nhưng tôi nghĩ có lẽ chúng ta n
|
||||
- Không có sẵn trên mọi hệ thống.
|
||||
- Dễ để bắt đầu hơn
|
||||
|
||||
Nếu bạn chạy `nano 90DaysOfDevOps.txt`, chúng ta sẽ có một tệp mới không có gì trong đó, từ đây chúng tôi có thể thêm văn bản của mình và hướng dẫn bên dưới là những gì chúng ta muốn thay đổi tệp đó.
|
||||
Nếu bạn chạy `nano 90DaysOfDevOps.txt`, chúng ta sẽ có một tệp mới không có gì trong đó, từ đây chúng ta có thể thêm văn bản của mình và hướng dẫn bên dưới là những gì chúng ta muốn thay đổi tệp đó.
|
||||
|
||||

|
||||
|
||||
|
@ -255,7 +255,7 @@ Bạn có thể thấy từ hình ảnh bên dưới rằng chúng ta đã thự
|
||||
|
||||
Yêu cầu cuối cùng là "Thông báo tạo tài khoản thành công được hiển thị." Chúng ta đã có dòng này ở dòng trên cùng của mã và có thể thấy ảnh chụp màn hình ở trên có dòng `90DaysOfDevOps user account being created` được hiển thị.
|
||||
|
||||
Bây giờ tập lệnh này có thể được sử dụng để nhanh chóng tích hợp và thiết lập người dùng mới trên hệ thống Linux của chúng ta. Nhưng có lẽ thay vì một vài người trong lịch sử phải giải quyết vấn đề này và sau đó phải lấy cho người khác tên người dùng hoặc mật khẩu mới của họ, chúng tôi có thể thêm một số đầu vào của người dùng mà chúng tôi đã đề cập trước đó để nắm bắt các biến của chúng tôi.
|
||||
Bây giờ tập lệnh này có thể được sử dụng để nhanh chóng tích hợp và thiết lập người dùng mới trên hệ thống Linux của chúng ta. Nhưng có lẽ thay vì một vài người trong lịch sử phải giải quyết vấn đề này và sau đó phải lấy cho người khác tên người dùng hoặc mật khẩu mới của họ, chúng ta có thể thêm một số đầu vào của người dùng mà chúng ta đã đề cập trước đó để nắm bắt các biến.
|
||||
|
||||
```
|
||||
#! /usr/bin/bash
|
||||
|
@ -16,7 +16,7 @@ Nhưng việc bắt đầu tìm hiểu về điện toán đám mây sẽ là m
|
||||
|
||||

|
||||
|
||||
Vậy các dịch vụ public cloud (đám mây công cộng) có yêu cầu tư duy DevOps không? Câu trả lời của tôi ở đây là không, nhưng để thực sự tận dụng được những lợi thế của điện toán đám mây và để tránh những hoá đơn khổng lồ cho dịch vụ điện todayán, việc nghĩ đến DevOps và Cloud cùng với nhau là điều rất quan trọng.
|
||||
Vậy các dịch vụ public cloud (đám mây công cộng) có yêu cầu tư duy DevOps không? Câu trả lời của tôi ở đây là không, nhưng để thực sự tận dụng được những lợi thế của điện toán đám mây và để tránh những hoá đơn khổng lồ cho dịch vụ điện toán, việc nghĩ đến DevOps và Cloud cùng với nhau là điều rất quan trọng.
|
||||
|
||||
Nếu chúng ta xem xét ý nghĩa của public cloud từ góc độ high level, thì có thể nói nó loại bỏ trách nhiệm quản lý các máy chủ và giúp chúng ta tập trung hơn vào những khía cạnh khác quan trọng hơn đó là ứng dụng và người sử dụng. Xét cho cùng, đám mây công cộng cũng chỉ là máy tính của người khác.
|
||||
|
||||
@ -90,7 +90,7 @@ Trước khi chúng ta đi vào một nhà cung cấp cụ thể, tôi đã tạ
|
||||
|
||||
[Link to Twitter Poll](https://twitter.com/MichaelCade1/status/1486814904510259208?s=20&t=x2n6QhyOXSUs7Pq0itdIIQ)
|
||||
|
||||
Bất kỳ nhà cung cấp nào nhận được tỷ lệ phần trăm cao nhất, chúng tôi sẽ tìm hiểu sâu hơn về cách dịch vụ của nhà cung cấp đó. Tôi nghĩ điều quan trọng cần đề cập là các dịch vụ từ các nhà cung cấp này đều khá giống nhau, đó là lý do tại sao tôi nói là hãy bắt đầu với một nhà cung cấp bất kì. Tôi nhận thấy rằng, khi biết nền tảng của một nhà cung cấp như cách tạo máy ảo, thiết lập mạng,... thì tôi đã có thể sử dụng dịch vụ của các nhà cung cấp khác và có thể nhanh chóng sử dụng chúng.
|
||||
Bất kỳ nhà cung cấp nào nhận được tỷ lệ phần trăm cao nhất, chúng ta sẽ tìm hiểu sâu hơn về cách dịch vụ của nhà cung cấp đó. Tôi nghĩ điều quan trọng cần đề cập là các dịch vụ từ các nhà cung cấp này đều khá giống nhau, đó là lý do tại sao tôi nói là hãy bắt đầu với một nhà cung cấp bất kì. Tôi nhận thấy rằng, khi biết nền tảng của một nhà cung cấp như cách tạo máy ảo, thiết lập mạng,... thì tôi đã có thể sử dụng dịch vụ của các nhà cung cấp khác và có thể nhanh chóng sử dụng chúng.
|
||||
|
||||
Dù như thế nào, tôi cũng sẽ chia sẻ một số tài nguyên **MIỄN PHÍ** về cả ba nhà cung cấp lớn nhất.
|
||||
|
||||
|
@ -61,7 +61,7 @@ Hãy nhớ rằng Microsoft Azure là một đám mây tính phí theo mô hình
|
||||
|
||||
Nếu bạn là một Doanh nghiệp thì bạn có thể muốn hoặc có một thoả thuận Doanh nghiệp với Microsoft để cho phép công ty của bạn sử dụng các dịch vụ của Azure.
|
||||
|
||||
Nếu bạn giống tôi và bạn đang sử dụng Microsoft Azure cho mục đích học tập thì chúng tôi có một số tùy chọn khác.
|
||||
Nếu bạn giống tôi và bạn đang sử dụng Microsoft Azure cho mục đích học tập thì chúng ta có một số tùy chọn khác.
|
||||
|
||||
Chúng ta có [tài khoản Microsoft Azure miễn phí](https://azure.microsoft.com/en-gb/free/) và thường sẽ có một số tín dụng (tiền) miễn phí để bạn có thể sử dụng Azure trong một khoảng thời gian.
|
||||
|
||||
@ -120,7 +120,7 @@ Tiếp theo, chúng ta có resource group, đây là nơi chúng ta kết hợp
|
||||
|
||||

|
||||
|
||||
Với những gì chúng ta có thể làm trong vài ngày tới, chúng tôi muốn tại resource group của riêng mình. Điều này được thực hiện dễ dàng trong console bằng cách nhấn "Create" trong hình ảnh ở trên.
|
||||
Với những gì chúng ta có thể làm trong vài ngày tới, chúng ta muốn tạo resource group của riêng mình. Điều này được thực hiện dễ dàng trong console bằng cách nhấn "Create" trong hình ảnh ở trên.
|
||||
|
||||

|
||||
|
||||
|
@ -62,7 +62,7 @@ Tôi chưa từng xem xét vấn đề này trước đây nhưng tôi có thể
|
||||
|
||||
### Role-Based Access Control
|
||||
|
||||
Chúng ta đã đề cập vào [ngày 29](day29.md) phạm vi mà chúng tôi sẽ đề cập ở đây, chúng tôi có thể đặt kiểm soát RBAC của mình cho một trong những dịch vụ dưới đây.
|
||||
Chúng ta đã đề cập vào [ngày 29](day29.md) phạm vi mà chúng ta sẽ đề cập ở đây, chúng ta có thể đặt kiểm soát RBAC của mình cho một trong những dịch vụ dưới đây.
|
||||
|
||||
- Subscriptions
|
||||
- Management Group
|
||||
@ -140,7 +140,7 @@ Sau đó, tôi thêm một người dùng user1@90DaysOfDevOps.com và nếu ch
|
||||
|
||||

|
||||
|
||||
Nếu có khoảng 100 yêu cầu như thế này, chúng ta sẽ không muốn thực hiện tất cả điều này trong bảng điều khiển mà chúng tôi muốn tận dụng hoặc là các tuỳ chọn hàng loạt (bulk options) để tạo, mời, và xoá người dùng hoặc bạn có thể muốn sử dụng Powershell để làm điều này một cách tự động để có thể scale.
|
||||
Nếu có khoảng 100 yêu cầu như thế này, chúng ta sẽ không muốn thực hiện tất cả điều này trong bảng điều khiển mà chúng ta muốn tận dụng hoặc là các tuỳ chọn hàng loạt (bulk options) để tạo, mời, và xoá người dùng hoặc bạn có thể muốn sử dụng Powershell để làm điều này một cách tự động để có thể scale.
|
||||
|
||||
Bây giờ, chúng ta có thể vào Resource group của mình và chỉ định rằng trong nhóm tài nguyên 90DaysOfDevOps, chúng ta muốn chủ sở hữu (owner) của nó là nhóm chúng ta vừa mới tạo.
|
||||
|
||||
|
@ -48,7 +48,7 @@ Sau đó, trong drop-down, bạn có thể thấy chúng ta có ba tuỳ chọn
|
||||
|
||||

|
||||
|
||||
Có rất nhiều tuỳ chọn nâng cao hơn có sẵn cho tài khoản lưu trữ của bạn, nhưng hiện tại, chúng tôi không cần phải truy cập vào các phần này. Các tuỳ chọn này là về mã hoá và bảo vệ dữ liệu.
|
||||
Có rất nhiều tuỳ chọn nâng cao hơn có sẵn cho tài khoản lưu trữ của bạn, nhưng hiện tại, chúng ta không cần phải truy cập vào các phần này. Các tuỳ chọn này là về mã hoá và bảo vệ dữ liệu.
|
||||
|
||||
### Ổ đĩa được quản lý - Managed Disks
|
||||
|
||||
|
@ -58,7 +58,7 @@ Chúng ta cũng có Virtual Network Peering. Điều này cho phép các mạng
|
||||
| ILB | 1010 | Azure LoadBalancer | \* | \* | 10000 | Allow |
|
||||
| Deny All Inbound | 4000 | \* | \* | \* | \* | DENY |
|
||||
|
||||
Chúng tôi cũng có Application Security Groups (ASGs)
|
||||
Chúng ta cũng có Application Security Groups (ASGs)
|
||||
|
||||
- Trường hợp NSG tập trung vào dải địa chỉ IP có thể khó duy trì đối với môi trường đang phát triển.
|
||||
- ASG cho phép xác định tên thật (Monikers) cho các vai trò ứng dụng khác nhau (Máy chủ web, máy chủ DB, WebApp1, v.v.)
|
||||
@ -106,7 +106,7 @@ Azure PowerShell is a set of cmdlets for managing Azure resources directly from
|
||||
|
||||
We can see below that you can connect to your subscription using the PowerShell command `Connect-AzAccount`
|
||||
|
||||
Trước khi chúng tôi bắt đầu với Azure PowerShell, chúng ta nên biết tới PowerShell. PowerShell là một framework quản lý cấu hình và tự động hóa tác vụ, một command-line shell và ngôn ngữ kịch bản. Nó giống với những gì chúng ta đã tìm hiểu trong phần shell scripting cho Linux. PowerShell lúc đầu được sử dụng rộng rãi trên hệ điều hành Windows nhưng giờ đây nó đã có trên nhiều nền tảng.
|
||||
Trước khi chúng ta bắt đầu với Azure PowerShell, chúng ta nên biết tới PowerShell. PowerShell là một framework quản lý cấu hình và tự động hóa tác vụ, một command-line shell và ngôn ngữ kịch bản. Nó giống với những gì chúng ta đã tìm hiểu trong phần shell scripting cho Linux. PowerShell lúc đầu được sử dụng rộng rãi trên hệ điều hành Windows nhưng giờ đây nó đã có trên nhiều nền tảng.
|
||||
|
||||
Azure PowerShell là một tập hợp các lệnh ghép ngắn để quản lý tài nguyên Azure trực tiếp từ dòng lệnh PowerShell.
|
||||
|
||||
|
@ -33,7 +33,7 @@ Sau đó, tôi đã tạo tập lệnh PowerShell và tham khảo từ module đ
|
||||
|
||||
Vui lòng đảm bảo rằng bạn thay đổi vị trí tệp trong tập lệnh phù hợp với môi trường của mình.
|
||||
|
||||
Ở giai đoạn đầu tiên này, chúng tôi không có mạng ảo hoặc máy ảo nào được tạo trong môi trường của mình, tôi chỉ có một cloud shell storage được định cấu hình trong resource group của mình.
|
||||
Ở giai đoạn đầu tiên này, chúng ta không có mạng ảo hoặc máy ảo nào được tạo trong môi trường của mình, tôi chỉ có một cloud shell storage được định cấu hình trong resource group của mình.
|
||||
|
||||
Trước hết, tôi chạy [PowerShell script](../../Days/Cloud/01VirtualNetworking/Module4_90DaysOfDevOps.ps1) của mình
|
||||
|
||||
@ -98,7 +98,7 @@ Tôi gặp một vấn đề khác ở đây là tài khoản của tôi không
|
||||

|
||||

|
||||
|
||||
Sau đó, tôi có thể quay lại tài khoản michael.cade@90DaysOfDevOps.com của mình và tiếp tục phần này. Ở đây chúng tôi đang chạy lại vài bài test tương tự nhưng bây giờ đã có thể truy cập được.
|
||||
Sau đó, tôi có thể quay lại tài khoản michael.cade@90DaysOfDevOps.com của mình và tiếp tục phần này. Ở đây chúng ta đang chạy lại vài bài test tương tự nhưng bây giờ đã có thể truy cập được.
|
||||
|
||||

|
||||
|
||||
@ -194,6 +194,6 @@ Bài lab này kết thúc phần tìm hiểu về Microsoft Azure nói riêng v
|
||||
- [Google Cloud Digital Leader Certification Course](https://www.youtube.com/watch?v=UGRDM86MBIQ&list=WL&index=131&t=10s)
|
||||
- [AWS Basics for Beginners - Full Course](https://www.youtube.com/watch?v=ulprqHHWlng&t=5352s)
|
||||
|
||||
Tiếp theo, chúng ta sẽ đi sâu vào các hệ thống kiểm soát phiên bản, cụ thể là xung quanh git và sau đó là tổng quan về kho lưu trữ mã và chúng tôi sẽ chọn GitHub vì đây là lựa chọn ưa thích của tôi.
|
||||
Tiếp theo, chúng ta sẽ đi sâu vào các hệ thống kiểm soát phiên bản, cụ thể là xung quanh git và sau đó là tổng quan về kho lưu trữ mã và chúng ta sẽ chọn GitHub vì đây là lựa chọn ưa thích của tôi.
|
||||
|
||||
Hẹn gặp lại vào [ngày 35](day35.md)
|
||||
|
@ -28,7 +28,7 @@ Tôi đã bắt đầu áp dụng quản lý phiên bản không chỉ đối v
|
||||
|
||||
Tuy nhiên, để tránh hiểu lầm **Quản lý phiên bản không hoạt động như một bản sao lưu**
|
||||
|
||||
Một lợi ích khác của quản lý phiên bản là khả năng quản lý nhiều phiên bản của một dự án. Lấy ví dụ như chúng ta có một ứng dụng miễn phí và sau đó là ứng dụng trả phí có sẵn trên tất cả các hệ điều hành. Phần lớn mã được chia sẽ giữa hai ứng dụng. Chúng tôi có thể sao chép và dán mã của mình cho từng commit vào từng ứng dụng, nhưng điều đó sẽ rất lộn xộn, đặc biệt là khi bạn mở rộng quy mô phát triển với nhiều nhân sự, cũng sẽ rất dễ mắc lỗi.
|
||||
Một lợi ích khác của quản lý phiên bản là khả năng quản lý nhiều phiên bản của một dự án. Lấy ví dụ như chúng ta có một ứng dụng miễn phí và sau đó là ứng dụng trả phí có sẵn trên tất cả các hệ điều hành. Phần lớn mã được chia sẽ giữa hai ứng dụng. Chúng ta có thể sao chép và dán mã của mình cho từng commit vào từng ứng dụng, nhưng điều đó sẽ rất lộn xộn, đặc biệt là khi bạn mở rộng quy mô phát triển với nhiều nhân sự, cũng sẽ rất dễ mắc lỗi.
|
||||
|
||||
Ứng dụng trả phí là nơi chúng ta có các chứ năng bổ sung, hãy gọi chúng là các commit trả phí, bản miễn phí sẽ chỉ chứa các commit bình thường.
|
||||
|
||||
|
@ -56,7 +56,7 @@ Hầu như tất cả các công cụ phát triển hiện đại đều hỗ tr
|
||||
- Công cụ nhóm - Cũng được đề cập trong các công cụ như Jenkins theo góc nhìn CI/CD, Slack từ góc độ dịch vụ nhắn tin và Jira từ góc độ quản lý dự án và theo dõi vấn đề.
|
||||
|
||||
- Cloud providers - Tất cả các nhà cung cấp điện toán đám mây lớn đều hỗ trợ git, Microsoft Azure, Amazon AWS và Google Cloud Platform.
|
||||
- Các dịch vụ dựa trên Git - Sau đó, chúng ta có GitHub, GitLab và BitBucket mà chúng tôi sẽ đề cập rõ hơn ở phần sau. Các dịch vụ này có thể coi như là một mạng xã hội dành cho mã nguồn.
|
||||
- Các dịch vụ dựa trên Git - Sau đó, chúng ta có GitHub, GitLab và BitBucket mà chúng ta sẽ đề cập rõ hơn ở phần sau. Các dịch vụ này có thể coi như là một mạng xã hội dành cho mã nguồn.
|
||||
|
||||
### Git Cheatsheet
|
||||
|
||||
|
@ -38,7 +38,7 @@ Tiếp theo chúng ta sẽ commit tệp này với commit đầu tiên của ch
|
||||
|
||||
### Commit các thay đổi
|
||||
|
||||
Chúng ta rất có thể muốn thêm nhiều tệp hơn hoặc thậm chí thay đổi các tệp chúng ta có trong thư mục của mình. Chúng tôi đã thực hiện commit đầu tiên của mình ở trên. Nhưng bây giờ, chúng ta sẽ thêm nhiều chi tiết và nhiều tệp hơn.
|
||||
Chúng ta rất có thể muốn thêm nhiều tệp hơn hoặc thậm chí thay đổi các tệp chúng ta có trong thư mục của mình. Chúng ta đã thực hiện commit đầu tiên của mình ở trên. Nhưng bây giờ, chúng ta sẽ thêm nhiều chi tiết và nhiều tệp hơn.
|
||||
|
||||
Chúng ta có thể lặp lại các quy trình của mình như trước đó, tạo hoặc chỉnh sửa tệp của mình > `git add .` để thêm tất cả các file vào khu vực staging sau đó sử dụng `git commit -m "meaningful message"`. Nhưng để đưa ra một thông điệp có ý nghĩa cho thay đổi trong commit của mình, bạn có lẽ không nên viết ra những thứ như `git commit -m "Chà, tôi đã thay đổi một số mã vì nó không hoạt động và khi tôi sửa mã đó, tôi cũng đã thêm một số thứ mới trong readme.md để đảm bảo rằng mọi người đều biết về trải nghiệm của người dùng và sau đó tôi pha một ấm trà."` Ý tôi là điều này cũng có thể sẽ hiệu quả mặc dù hơi dài dòng nhưng các tốt hơn ở đây là nên thêm thông điệp bằng một trình soạn thảo văn bản.
|
||||
|
||||
@ -68,7 +68,7 @@ Câu trả lời là có nhưng đừng coi đây là một lối tắt, bạn p
|
||||
|
||||
### Xoá tệp
|
||||
|
||||
Còn việc xoá tệp khỏi dự án của chúng tôi thì sao, có thể chúng ta có một tệp khác trong thư mục mà chúng ta đã cam kết nhưng hiện tại dự án không còn cần hoặc sử dụng tệp đó nữa, các tốt nhất là chúng ta nên xoá tệp đó.
|
||||
Còn việc xoá tệp khỏi dự án của chúng ta thì sao, có thể chúng ta có một tệp khác trong thư mục mà chúng ta đã cam kết nhưng hiện tại dự án không còn cần hoặc sử dụng tệp đó nữa, các tốt nhất là chúng ta nên xoá tệp đó.
|
||||
|
||||
Chỉ vì chúng ta xoá tệp đó khỏi thư mục, git vẫn biết tệp này và chúng ta cũng cần xoá tệp khỏi repository. Bạn có thể thấy workflow như bên dưới.
|
||||
|
||||
|
@ -89,7 +89,7 @@ Chúng ta có thể đảo ngược điều này và bắt đầu với commit h
|
||||
|
||||
### Xem một commit
|
||||
|
||||
Việc có thể xem nội dung commit là một điều tuyệt vời nếu bạn có ý thức tuân theo các best practices và có những nội dung commit có ý nghĩa. Tuy nhiên, cũng có lệnh `git show` cho phép chúng tôi kiểm tra và xem một commit.
|
||||
Việc có thể xem nội dung commit là một điều tuyệt vời nếu bạn có ý thức tuân theo các best practices và có những nội dung commit có ý nghĩa. Tuy nhiên, cũng có lệnh `git show` cho phép chúng ta kiểm tra và xem một commit.
|
||||
|
||||
Chúng ta có thể sử dụng `git log --oneline --reverse` để lấy danh sách các commit của mình rồi lấy chúng và chạy `git show <commit ID>`
|
||||
|
||||
@ -119,7 +119,7 @@ Sẽ có lúc bạn có thể đã sử dụng `git add .` nhưng có những t
|
||||
|
||||

|
||||
|
||||
Chúng ta cũng có thể thực hiện tương tự với các tệp đã sửa đổi, chẳng hạn như main.js và hủy thực hiện commit, như ở trên chúng tôi có chữ M màu xanh lá cây để sửa đổi và sau đó bên dưới chúng ta sẽ hủy thực hiện những thay đổi đó.
|
||||
Chúng ta cũng có thể thực hiện tương tự với các tệp đã sửa đổi, chẳng hạn như main.js và hủy thực hiện commit, như ở trên chúng ta có chữ M màu xanh lá cây để sửa đổi và sau đó bên dưới chúng ta sẽ hủy thực hiện những thay đổi đó.
|
||||
|
||||

|
||||
|
||||
@ -147,7 +147,7 @@ Ví dụ: hãy xóa tệp quan trọng nhất trong thư mục của chúng ta,
|
||||
|
||||

|
||||
|
||||
Bây giờ, không còn readme.md trong thư mục làm việc của chúng tôi. Chúng ta có thể đã sử dụng `git rm readme.md` và nó sẽ được phản ánh trong cơ sở dữ liệu git. Chúng ta cũng hãy xóa nó khỏi đây để mô phỏng việc nó bị xóa hoàn toàn.
|
||||
Bây giờ, không còn readme.md trong thư mục làm việc của chúng ta. Chúng ta có thể đã sử dụng `git rm readme.md` và nó sẽ được phản ánh trong cơ sở dữ liệu git. Chúng ta cũng hãy xóa nó khỏi đây để mô phỏng việc nó bị xóa hoàn toàn.
|
||||
|
||||

|
||||
|
||||
|
@ -27,11 +27,11 @@ Không có lựa chọn nào ở trên là đúng hay sai, nhưng chúng đều
|
||||
|
||||
Tôi cũng muốn nói rằng nếu bạn mới bắt đầu và đang phát triển một ứng dụng, bạn nên hướng tới các container đơn gỉan khi xét về tính hiệu quả, tốc độ và kích thước. Nhưng điều đó cũng đi kèm với một cái giá, nếu bạn không biết gì về container thì đó sẽ là một quá trình học tập để buộc bản thân bạn phải hiểu lý do tại sao chúng ta sử dụng và xây dựng một mindset mới. Nếu bạn đã phát triển các ứng dụng của mình theo một cách cụ thể hoặc chưa từng sử dụng containers thì bạn có thể có nhiều vấn đề khó giải quyết hơn trước cả khi xem xét đến việc sử dụng chúng.
|
||||
|
||||
Chúng tôi có nhiều sự lựa chọn khác nhau khi tải xuống một phần mềm nhất định, có rất nhiều hệ điều hành khác nhau mà chúng ta có thể đang sử dụng và hướng dẫn cụ thể về những gì chúng ta cần làm để cài đặt ứng dụng của mình.
|
||||
Chúng ta có nhiều sự lựa chọn khác nhau khi tải xuống một phần mềm nhất định, có rất nhiều hệ điều hành khác nhau mà chúng ta có thể đang sử dụng và hướng dẫn cụ thể về những gì chúng ta cần làm để cài đặt ứng dụng của mình.
|
||||
|
||||

|
||||
|
||||
Gần đây, tôi nhận thấy rằng các ứng dụng mà chúng tôi có thể đã từng cần một hệ điều hành máy chủ đầy đủ, một máy ảo, một instance vật lý hoặc điện toán đám mây hiện đang phát hành các phiên bản phần mềm trên container của chúng. Tôi thấy điều này khá thú vị vì nó đứa thế giới của container và sau đó là Kubernetes tới mọi người chứ không chỉ tập trung vào các nhà phát triển ứng dụng.
|
||||
Gần đây, tôi nhận thấy rằng các ứng dụng mà chúng ta có thể đã từng cần một hệ điều hành máy chủ đầy đủ, một máy ảo, một instance vật lý hoặc điện toán đám mây hiện đang phát hành các phiên bản phần mềm trên container của chúng. Tôi thấy điều này khá thú vị vì nó đứa thế giới của container và sau đó là Kubernetes tới mọi người chứ không chỉ tập trung vào các nhà phát triển ứng dụng.
|
||||
|
||||

|
||||
|
||||
@ -41,7 +41,7 @@ Như bạn có thể thấy như tôi đã nói trước đây, tôi sẽ không
|
||||
|
||||
Chúng ta đã có công nghệ container trong một thời gian dài, vậy tại sao trong 10 năm qua, điều này đã trở nên phổ biến, tôi có thể nói rằng thậm chí nó còn phổ biến hơn trong 5 năm qua. Chúng ta đã có container trong nhiều thập kỷ. Nó liên quan đến các thách thức của containers hay thậm chí các images, về cách chúng ta phân phối phần mềm của mình, bởi vì nếu chúng ta chỉ có công nghệ container, thì chúng ta vẫn sẽ gặp các vấn đề giống như chúng ta đã gặp phải với quản lý phần mềm.
|
||||
|
||||
Nếu chúng ta coi Docker như một công cụ, thì lý do khiến nó thành công là do hệ sinh thái images dễ tìm kiếm và sử dụng. Việc tích hợp vào hệ thống của bạn và thiết lập và chạy trở nên rất đơn giản. Một phần quan trọng của điều này là tính nhất quán, một trong những thách thức mà chúng ta phải đối mặt với việc triển phai, phát triển phần mềm. Không quan trọng đó là MongoDB hay nodeJS, quá trình thiết lập và chạy hai phần mềm này sẽ giống nhau. Việc tắt các ứng dụng trên cũng giống nhau. Tất cả những vấn đề vẫn sẽ tồn tại, nhưng điều tuyệt vời là khi chúng tôi kết hợp công nghệ images và containers với nhau, giờ đây chúng tôi có một bộ công cụ duy nhất giúp chúng tôi giải quyết tất cả các vấn đề được liệt kê dưới đây:
|
||||
Nếu chúng ta coi Docker như một công cụ, thì lý do khiến nó thành công là do hệ sinh thái images dễ tìm kiếm và sử dụng. Việc tích hợp vào hệ thống của bạn và thiết lập và chạy trở nên rất đơn giản. Một phần quan trọng của điều này là tính nhất quán, một trong những thách thức mà chúng ta phải đối mặt với việc triển phai, phát triển phần mềm. Không quan trọng đó là MongoDB hay nodeJS, quá trình thiết lập và chạy hai phần mềm này sẽ giống nhau. Việc tắt các ứng dụng trên cũng giống nhau. Tất cả những vấn đề vẫn sẽ tồn tại, nhưng điều tuyệt vời là khi chúng ta kết hợp công nghệ images và containers với nhau, giờ đây chúng ta có một bộ công cụ duy nhất giúp chúng ta giải quyết tất cả các vấn đề được liệt kê dưới đây:
|
||||
|
||||
- Đầu tiên chúng ta phải tìm phần mềm trên internet.
|
||||
- Sau đó chúng ta phải tải phần mềm này về.
|
||||
@ -111,7 +111,7 @@ Sử dụng các container, bạn có thể mở rộng các container và sử
|
||||
|
||||
### Container là gì?
|
||||
|
||||
Khi chúng ta chạy các ứng dụng trên máy tính, đây có thể là VSCode hoặc trình duyệt web mà bạn đang sử dụng để đọc bài viết này. Ứng dụng đó đang chạy dưới dạng một process hoặc một thứ gì đó coi là một process. Trên máy tính xách tay hoặc hệ thống của chúng ta, chúng ta có xu hướng chạy nhiều ứng dụng hoặc như chúng tôi đã nói là các process. Khi chúng ta mở một ứng dụng mới hoặc click vào biểu tượng ứng dụng, đây là ứng dụng chúng ta muốn chạy, đôi khi ứng dụng này có thể là một dịch vụ mà chúng tôi chỉ muốn chạy nền, hệ điều hành của chúng ta có rất nhiều các dịch vụ chạy nền cung cấp cho bạn trải nghiệm người dùng mà bạn có đang có với hệ thống.
|
||||
Khi chúng ta chạy các ứng dụng trên máy tính, đây có thể là VSCode hoặc trình duyệt web mà bạn đang sử dụng để đọc bài viết này. Ứng dụng đó đang chạy dưới dạng một process hoặc một thứ gì đó coi là một process. Trên máy tính xách tay hoặc hệ thống của chúng ta, chúng ta có xu hướng chạy nhiều ứng dụng hoặc như chúng ta đã nói là các process. Khi chúng ta mở một ứng dụng mới hoặc click vào biểu tượng ứng dụng, đây là ứng dụng chúng ta muốn chạy, đôi khi ứng dụng này có thể là một dịch vụ mà chúng ta chỉ muốn chạy nền, hệ điều hành của chúng ta có rất nhiều các dịch vụ chạy nền cung cấp cho bạn trải nghiệm người dùng mà bạn có đang có với hệ thống.
|
||||
|
||||
Biểu tượng ứng dụng đó đại diện cho một liên kết đến một tệp thực thi ở đâu đó trên hệ thống tệp của bạn, sau đó hệ điều hành sẽ tải tệp thực thi đó vào bộ nhớ. Thật thú vị, tệp thực thi đó đôi khi được nhắc tới như là một hình ảnh khi chúng ta đang nói về một process.
|
||||
|
||||
|
@ -82,7 +82,7 @@ Quay lại tab Containers/Apps, nhấp vào container đang chạy của bạn.
|
||||
|
||||

|
||||
|
||||
Khi chúng tôi nhấn vào nút đó ở trên, chắc chắn rằng một trang web sẽ được mở ra và hiển thị nội dung tương tự như bên dưới.
|
||||
Khi chúng ta nhấn vào nút đó ở trên, chắc chắn rằng một trang web sẽ được mở ra và hiển thị nội dung tương tự như bên dưới.
|
||||
|
||||
Container này cũng có thêm một số chi tiết về container và image của chúng ta.
|
||||
|
||||
@ -118,7 +118,7 @@ Bạn có thể thấy bên dưới khi chúng ta chạy lệnh, giờ đây ch
|
||||
|
||||

|
||||
|
||||
Chúng tôi có bash shell nhưng chúng ta không có gì khác, đó là lý do tại sao container image này nhỏ hơn 30 MB.
|
||||
Chúng ta có bash shell nhưng chúng ta không có gì khác, đó là lý do tại sao container image này nhỏ hơn 30 MB.
|
||||
|
||||

|
||||
|
||||
|
@ -50,7 +50,7 @@ Việc sử dụng phương pháp dockerfile phù hợp hơn nhiều với việ
|
||||
|
||||
Dockerfile là một quy trình gồm ba bước, theo đó bạn tạo dockerfile và thêm các lệnh bạn cần để tạo nên một image.
|
||||
|
||||
Bảng sau đây chứa một số câu lệnh dockerfile mà chúng tôi sẽ sử dụng và rất có thể bạn cũng sẽ sử dụng.
|
||||
Bảng sau đây chứa một số câu lệnh dockerfile mà chúng ta sẽ sử dụng và rất có thể bạn cũng sẽ sử dụng.
|
||||
|
||||
| Lệnh | Mục đích |
|
||||
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
|
@ -81,9 +81,9 @@ volumes:
|
||||
wordpress_data: {}
|
||||
```
|
||||
|
||||
Chúng ta khai báo một phiên bản và sau đó một phần lớn của tệp docker-compose.yml này được tạo thành từ các services, chúng tôi có service DB và service WordPress. Bạn có thể thấy mỗi trong số đó có một image được xác định bằng version tag. Bây giờ chúng ta sẽ tạo các volumes để có thể lưu trữ cơ sở dữ liệu của mình ở đó.
|
||||
Chúng ta khai báo một phiên bản và sau đó một phần lớn của tệp docker-compose.yml này được tạo thành từ các services, chúng ta có service DB và service WordPress. Bạn có thể thấy mỗi trong số đó có một image được xác định bằng version tag. Bây giờ chúng ta sẽ tạo các volumes để có thể lưu trữ cơ sở dữ liệu của mình ở đó.
|
||||
|
||||
Sau đó, chúng tôi có một số biến môi trường (environment) như mật khẩu và tên người dùng. Các tệp này có thể trở nên rất phức tạp nhưng tệp cấu hình YAML đơn giản hóa giao diện tổng thể của chúng.
|
||||
Sau đó, chúng ta có một số biến môi trường (environment) như mật khẩu và tên người dùng. Các tệp này có thể trở nên rất phức tạp nhưng tệp cấu hình YAML đơn giản hóa giao diện tổng thể của chúng.
|
||||
|
||||
### Xây dựng dự án
|
||||
|
||||
@ -103,7 +103,7 @@ Tiếp theo, chúng ta có thể xác thực việc đã thiết lập và chạ
|
||||
|
||||

|
||||
|
||||
Chúng tôi có thể trải qua quá trình thiết lập WordPress và sau đó có thể bắt đầu xây dựng trang web của mình với bảng điều khiển bên dưới.
|
||||
Chúng ta có thể trải qua quá trình thiết lập WordPress và sau đó có thể bắt đầu xây dựng trang web của mình với bảng điều khiển bên dưới.
|
||||
|
||||

|
||||
|
||||
@ -149,7 +149,7 @@ Bây giờ, khi chúng ta sử dụng lại `docker-compose up -d`, các ứng d
|
||||
|
||||
Thú thật rằng khi tôi bắt đầu tìm hiểu về docker-compose và các khả năng của nó, tôi đã bối rối không biết nó nằm ở đâu bên cạnh hoặc với các công cụ Điều phối containers (Container Orchestration) như Kubernetes, mọi thứ chúng ta đã làm ở đây trong bản demo ngắn này đều tập trung vào một máy chủ khi chạy WordPress và DB trên máy tính để bàn cục bộ. Chúng ta không có nhiều máy ảo hoặc nhiều máy chủ vật lý, chúng ta cũng không thể dễ dàng mở rộng và thu nhỏ các yêu cầu của ứng dụng của mình.
|
||||
|
||||
Phần tiếp theo của chúng tôi sẽ đề cập đến Kubernetes nhưng trước tiên chúng tôi có một vài ngày nữa về Container nói chung.
|
||||
Phần tiếp theo của chúng ta sẽ đề cập đến Kubernetes nhưng trước tiên chúng ta có một vài ngày nữa về Container nói chung.
|
||||
|
||||
Đây cũng là một nguồn tài nguyên tuyệt vời cho các mẫu ứng dụng docker-compose với nhiều tích hợp khác nhau. [Awesome-Compose](https://github.com/docker/awesome-compose)
|
||||
|
||||
|
@ -81,7 +81,7 @@ Bây giờ chúng ta cần địa chỉ IP cho máy chủ thực tế của mìn
|
||||
|
||||

|
||||
|
||||
Sau đó, chúng tôi có thể lấy IP này, mở trình duyệt và truy cập `http://172.25.218.154:8080/` IP của bạn có thể khác. Điều này xác nhận rằng có thể truy cập được NGINX.
|
||||
Sau đó, chúng ta có thể lấy IP này, mở trình duyệt và truy cập `http://172.25.218.154:8080/` IP của bạn có thể khác. Điều này xác nhận rằng có thể truy cập được NGINX.
|
||||
|
||||

|
||||
|
||||
|
@ -43,7 +43,7 @@ Bây giờ chúng ta có thể sử dụng rất nhiều lệnh tương tự v
|
||||
|
||||

|
||||
|
||||
Sau đó, chúng tôi có thể chạy hình ảnh Ubuntu của mình bằng cách sử dụng `podman run -dit ubuntu` và `podman ps` để xem hình ảnh đang chạy của chúng ta.
|
||||
Sau đó, chúng ta có thể chạy hình ảnh Ubuntu của mình bằng cách sử dụng `podman run -dit ubuntu` và `podman ps` để xem hình ảnh đang chạy của chúng ta.
|
||||
|
||||

|
||||
|
||||
|
@ -34,7 +34,7 @@ Là một phần của danh sách dài các ứng dụng có sẵn trong arkade,
|
||||
|
||||

|
||||
|
||||
Chúng tôi cũng sẽ cần kubectl như một phần của các công cụ, vì vậy bạn cũng có thể cài đặt nó thông qua arkade hoặc tôi tin rằng theo như tài liệu của minikube, nó cũng được cài đặt thông qua câu lệnh curl ở bên trên. Chúng ta sẽ nói về kubectl ở phần sau của bài viết.
|
||||
Chúng ta cũng sẽ cần kubectl như một phần của các công cụ, vì vậy bạn cũng có thể cài đặt nó thông qua arkade hoặc tôi tin rằng theo như tài liệu của minikube, nó cũng được cài đặt thông qua câu lệnh curl ở bên trên. Chúng ta sẽ nói về kubectl ở phần sau của bài viết.
|
||||
|
||||
### Bắt đầu và chạy Kubernetes cluster
|
||||
|
||||
|
@ -76,7 +76,7 @@ Bây giờ chúng ta đã có các nodes hoặc máy ảo sẵn sàng, sau đó
|
||||
|
||||

|
||||
|
||||
Chúng tôi sẽ chọn "custom" vì chúng ta không sử dụng một trong các nền tảng được tích hợp. Trang mở đầu là nơi bạn xác định tên cluster của mình (có ghi local ở dưới nhưng bạn không thể sử dụng local, cluster của chúng ta là vagrant). Bạn có thể xác định các phiên bản Kubernetes tại đây, nhà cung cấp mạng và một số tuỳ chọn cấu hình khác để khởi động và chạy cụm Kubernetes của bạn.
|
||||
Chúng ta sẽ chọn "custom" vì chúng ta không sử dụng một trong các nền tảng được tích hợp. Trang mở đầu là nơi bạn xác định tên cluster của mình (có ghi local ở dưới nhưng bạn không thể sử dụng local, cluster của chúng ta là vagrant). Bạn có thể xác định các phiên bản Kubernetes tại đây, nhà cung cấp mạng và một số tuỳ chọn cấu hình khác để khởi động và chạy cụm Kubernetes của bạn.
|
||||
|
||||

|
||||
|
||||
@ -100,7 +100,7 @@ sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kube
|
||||
|
||||

|
||||
|
||||
Trong 3 ngày vừa qua, chúng ta đã sử dụng một số cách khác nhau để thiết lập và chạy với Kubernetes cluster, trong những ngày còn lại, chúng tôi sẽ xem xét khía cạnh ứng dụng của nền tảng và nó được cho là phần quan trọng nhất. Chúng ta sẽ xem xét các dịch vụ và khả năng cung cấp cũng như sử dụng dịch vụ của chúng ta trong Kubernetes.
|
||||
Trong 3 ngày vừa qua, chúng ta đã sử dụng một số cách khác nhau để thiết lập và chạy với Kubernetes cluster, trong những ngày còn lại, chúng ta sẽ xem xét khía cạnh ứng dụng của nền tảng và nó được cho là phần quan trọng nhất. Chúng ta sẽ xem xét các dịch vụ và khả năng cung cấp cũng như sử dụng dịch vụ của chúng ta trong Kubernetes.
|
||||
|
||||
Tôi đã được nói rằng các yêu cầu xung quanh việc khởi động các rancher node yêu cầu các máy ảo phải có 4GB ram nếu không chúng sẽ gặp sự cố, tôi đã cập nhật vì các worker nodes của chúng ta chỉ có 2GB.
|
||||
|
||||
|
@ -33,7 +33,7 @@ Khi nói đến StatefulSets hoặc ứng dụng có trạng thái, những đi
|
||||
|
||||
Bạn có thể thấy một số thứ trong demo của chúng ta ngay sau đây về việc mỗi pods có một định danh riêng. Với ứng dụng phi trạng thái, bạn sẽ thấy các tên ngẫu nhiên, ví dụ: `app-7469bbb6d7-9mhxd` trong khi ứng dụng có trạng thái sẽ được sắp xếp nghiêm chỉnh hơn với `mongo-0` và khi được mở rộng quy mô, nó sẽ ạo một pod mới có tên là `mongo-1`.
|
||||
|
||||
Các pods này được tạo từ cùng một cấu hình, nhưng chúng không thể hoán đổi cho nhau. Mỗi nhóm StatefulSet có một mã định danh cố định trong mọi lần lập lịch lại. Điều này là cần thiết bởi vì khi chúng ta yêu cầu các workloads có trạng thái ví dụ như cơ sở dữ liệu nơi chúng ta có các yêu cầu ghi và đọc, chúng ta không thể có hai pods cùng ghi một lúc mà không biết về việc này vì chúng sẽ khiến dữ liệu mất đi tính nhất quán. Chúng ta cần đảm bảo rằng chỉ một trong số các pods của chúng ta ghi vào cơ sở dữ liệu tại bất kỳ thời điểm nào, tuy nhiên, chúng tôi có thể có nhiều pods đọc dữ liệu đó.
|
||||
Các pods này được tạo từ cùng một cấu hình, nhưng chúng không thể hoán đổi cho nhau. Mỗi nhóm StatefulSet có một mã định danh cố định trong mọi lần lập lịch lại. Điều này là cần thiết bởi vì khi chúng ta yêu cầu các workloads có trạng thái ví dụ như cơ sở dữ liệu nơi chúng ta có các yêu cầu ghi và đọc, chúng ta không thể có hai pods cùng ghi một lúc mà không biết về việc này vì chúng sẽ khiến dữ liệu mất đi tính nhất quán. Chúng ta cần đảm bảo rằng chỉ một trong số các pods của chúng ta ghi vào cơ sở dữ liệu tại bất kỳ thời điểm nào, tuy nhiên, chúng ta có thể có nhiều pods đọc dữ liệu đó.
|
||||
|
||||
Mỗi pod trong StatefulSet sẽ có quyền truy cập vào persistent volume và một bản sao của cơ sở dữ liệu để đọc từ đó, và nó sẽ được cập nhật liên tự từ bản gốc. Một điều thú vị khác cần lưu ý là mỗi pod cũng sẽ lưu trữ trạng thái pod của nó trong persistent volume này, nếu sau đó `mongo-0` bị chết thì một pod mới sẽ được cung cấp và nó sẽ tiếp quản trạng thái pod được lưu trong bộ lưu trữ.
|
||||
|
||||
|
@ -78,7 +78,7 @@ resource "aws_instance" "90daysofdevops" {
|
||||
}
|
||||
```
|
||||
|
||||
Từ ví dụ trên, bạn có thể thấy chúng tôi cũng đang chạy lệnh `yum update` và cài đặt `httpd` vào máy chủ EC2 của chúng tôi.
|
||||
Từ ví dụ trên, bạn có thể thấy chúng ta cũng đang chạy lệnh `yum update` và cài đặt `httpd` vào máy chủ EC2.
|
||||
|
||||
Nếu chúng ta nhìn vào toàn bộ tệp main.tf, nó có thể trông giống như sau:
|
||||
|
||||
|
@ -38,7 +38,7 @@ Trước khi chúng ta bắt đầu xem xét việc kiểm soát các node khác
|
||||
|
||||

|
||||
|
||||
Hoặc cách sử dụng thực tế cho một module có thể là `ansible webservers -m service -a "name=httpd state=started"` điều này sẽ cho chúng tôi biết liệu tất cả máy chủ web của chúng tôi có dịch vụ httpd đang chạy hay không. Thuật ngữ máy chủ web được sử dụng trong lệnh đó.
|
||||
Hoặc cách sử dụng thực tế cho một module có thể là `ansible webservers -m service -a "name=httpd state=started"` điều này sẽ cho chúng ta biết liệu tất cả máy chủ web có dịch vụ httpd đang chạy hay không. Thuật ngữ máy chủ web được sử dụng trong lệnh đó.
|
||||
|
||||
### hosts
|
||||
|
||||
@ -50,11 +50,11 @@ Cách tôi sử dụng máy chủ cục bộ ở trên để chạy module ping
|
||||
|
||||

|
||||
|
||||
Tệp chúng tôi muốn chỉnh sửa là tệp hosts, sử dụng trình soạn thảo văn bản, chúng ta có thể định nghĩa máy chủ của mình. Tệp hosts chứa nhiều hướng dẫn về cách sử dụng và sửa đổi tệp. Chúng ta sẽ cuộn xuống dưới cùng và sẽ tạo một nhóm mới có tên là [windows] và thêm địa chỉ IP `10.0.0.1` của chúng ta cho máy chủ lưu đó và lưu lại tệp.
|
||||
Tệp chúng ta muốn chỉnh sửa là tệp hosts, sử dụng trình soạn thảo văn bản, chúng ta có thể định nghĩa máy chủ của mình. Tệp hosts chứa nhiều hướng dẫn về cách sử dụng và sửa đổi tệp. Chúng ta sẽ cuộn xuống dưới cùng và sẽ tạo một nhóm mới có tên là [windows] và thêm địa chỉ IP `10.0.0.1` của chúng ta cho máy chủ lưu đó và lưu lại tệp.
|
||||
|
||||

|
||||
|
||||
Tuy nhiên, hãy nhớ rằng tôi đã nói rằng bạn sẽ cần có sẵn SSH để cho phép Ansible kết nối với hệ thống của bạn. Như bạn có thể thấy bên dưới khi tôi chạy `ansible windows -m ping`, chúng tôi không thể truy cập được vì mọi thứ không kết nối được qua SSH.
|
||||
Tuy nhiên, hãy nhớ rằng tôi đã nói rằng bạn sẽ cần có sẵn SSH để cho phép Ansible kết nối với hệ thống của bạn. Như bạn có thể thấy bên dưới khi tôi chạy `ansible windows -m ping`, chúng ta không thể truy cập được vì mọi thứ không kết nối được qua SSH.
|
||||
|
||||

|
||||
|
||||
|
@ -46,7 +46,7 @@ Bây giờ, nếu chúng ta muốn chỉ muốn nhắm tới proxy, chúng ta c
|
||||
|
||||

|
||||
|
||||
tags cũng có thể được thêm vào task để chúng ta có thể biết được chi tiết về nơi mà điều mà bạn muốn thực hiện. Đó có thể là các thẻ phân loại theo ứng dụng, chẳng hạn như chúng tôi có thể xem qua các tasks và gắn thẻ cho chúng dựa trên cài đặt (installation), cấu hình (configuration) hoặc xoá (removal). Một thẻ rất hữu ích khác mà bạn có thể sử dụng là `tag: always`, nó sẽ đảm bảo bất kể --tags bạn sử dụng trong lệnh của mình, lệnh ansible-playbook sẽ luôn được chạy khi có tags này.
|
||||
tags cũng có thể được thêm vào task để chúng ta có thể biết được chi tiết về nơi mà điều mà bạn muốn thực hiện. Đó có thể là các thẻ phân loại theo ứng dụng, chẳng hạn như chúng ta có thể xem qua các tasks và gắn thẻ cho chúng dựa trên cài đặt (installation), cấu hình (configuration) hoặc xoá (removal). Một thẻ rất hữu ích khác mà bạn có thể sử dụng là `tag: always`, nó sẽ đảm bảo bất kể --tags bạn sử dụng trong lệnh của mình, lệnh ansible-playbook sẽ luôn được chạy khi có tags này.
|
||||
|
||||
Chúng ta cũng có thể sử dụng nhiều tags với nhau và nếu chúng ta chạy `ansible-playbook playbook5.yml --tags proxy,web` thì nó sẽ chạy tất cả các thành phần có các tags đó. Rõ ràng, trong trường hợp của chúng ta, điều đó có nghãi giống như chạy toàn bộ playbook, nhưng nó sẽ trở nên có ích nếu chúng ta có thêm các plays mới được bổ sung.
|
||||
|
||||
|
@ -28,7 +28,7 @@ Dự án AWX hay viết tắt là AWX là một dự án cộng đồng mã ngu
|
||||
|
||||
Nếu bạn đang tìm kiếm một giải pháp cho doanh nghiệp thì bạn nên xem xét Automation Controller hoặc bạn có thể đã nghe tới cái tên Ansible Tower. Ansible Automation Controller là control plan cho nền tảng tự động của Ansible (Ansible Automation Platform).
|
||||
|
||||
Cả AWX và Automation Controller có những tính năng sau trong tất cả những tính năng khác mà chúng tôi đã đề cập trong loạt bài viết này cho tới thời điểm hiện tại.
|
||||
Cả AWX và Automation Controller có những tính năng sau trong tất cả những tính năng khác mà chúng ta đã đề cập trong loạt bài viết này cho tới thời điểm hiện tại.
|
||||
|
||||
- Giao diện người dùng
|
||||
- Kiểm soát truy cập dựa trên role (Role-Based Access Control)
|
||||
@ -138,6 +138,6 @@ Bây giờ, chúng ta đã từng sử dụng `ansible-galaxy` để tạo một
|
||||
|
||||
Playlist cuối cùng được liệt kê ở trên có rất nhiều đoạn mã và ý tưởng cho bài viết này, nó là một video hướng dẫn tuyệt vời.
|
||||
|
||||
Bài đăng này kết thúc phần về quản lý cấu hình, tiếp theo chúng ta sẽ chuyển qua phần về CI/CD Pipelines và một số công cụ và quy trình mà chúng tôi có thể thấy và sử dụng để đạt được quy trình làm việc cho quá trình phát triển và phát hành ứng dụng.
|
||||
Bài đăng này kết thúc phần về quản lý cấu hình, tiếp theo chúng ta sẽ chuyển qua phần về CI/CD Pipelines và một số công cụ và quy trình mà chúng ta có thể thấy và sử dụng để đạt được quy trình làm việc cho quá trình phát triển và phát hành ứng dụng.
|
||||
|
||||
Hẹn gặp lại vào [ngày 70](day70.md)
|
||||
|
@ -52,7 +52,7 @@ Như bạn mong đợi, Jenkins có nhiều đặc điểm bảo phủ nhiều l
|
||||
|
||||
### Jenkins Pipeline
|
||||
|
||||
Bạn sẽ thấy pipeline này nhưng được sử dụng ở phạm vi rộng hơn và ở đây chúng tôi đề cập tới các công cụ cụ thể.
|
||||
Bạn sẽ thấy pipeline này nhưng được sử dụng ở phạm vi rộng hơn và ở đây chúng ta đề cập tới các công cụ cụ thể.
|
||||
|
||||
Bạn commit mã nguồn tới Jenkins, nơi sau đó sẽ xây dựng ứng dụng của bạn, với tất cả bài kiểm thử tự động, nó sẽ phát hành và triển khai mã nguồn đó khi mỗi bước được hoàn thành. Jenkins sẽ tự động hoá quá trình này.
|
||||
|
||||
|
187
2022/vi/Days/day75.md
Normal file
@ -0,0 +1,187 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Tổng quan về GitHub Actions - Day 75'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Tổng quan về GitHub Actions
|
||||
tags: 'devops, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1049070
|
||||
---
|
||||
|
||||
## Tổng quan về GitHub Actions
|
||||
|
||||
Ở bài này, tôi muốn tiếp tục và xem xét có thể là ở một cách tiếp cận khác so với những gì chúng ta đã học ở các bài trước. Github Actions là điều chúng ta sẽ tập trung ở bài này.
|
||||
|
||||
Github Actions là một nền tảng CI/CD cho phép chúng ta xây dựng, kiểm thử và triển khai giữa các tác vụ trong pipeline. Nó mang trong mình khái niệm về các workflow để xây dựng và kiểm thử trên một kho lưu trữ GitHub. Bạn cũng có thể sử dụng GitHub Actions để điều hướng các luồng công việc khác dựa trên các sự kiện diễn ra trong kho lưu trữ của bạn.
|
||||
|
||||
### Workflows
|
||||
|
||||
Nhìn chung, trong Github Actions, tác vụ được gọi là **Workflow**:
|
||||
|
||||
- Một **workflow** là tiến trình tự động có thể cấu hình được.
|
||||
- Được định nghĩa dưới dạng tệp YAML.
|
||||
- Chứa và chạy một hoặc nhiều **jobs**
|
||||
- Được kích hoạt bởi một **event** trong kho lưu trữ hoặc có thể chạy thủ công
|
||||
- Có thể có nhiều workflows trên một kho lưu trữ
|
||||
- Một **workflow** sẽ chứa một **job** và sau đó là các **step** để hoàn thành **job**
|
||||
- Trong **workflow** chúng ta cũng có một **runner** mà **workflow** chạy trên đó.
|
||||
|
||||
Ví dụ, bạn có thể có một **workflow** để xây dựng và kiểm thử các pull requests, một **workflow** khác để triển khai ứng dụng mỗi khi một bản release được tạo, và một **workflow** để đánh nhãn mỗi khi ai đó mở một issue mới.
|
||||
|
||||
### Events
|
||||
|
||||
Các Event là sự kiện cụ thể trong một kho lưu trữ qua đó kích hoạt workflow chạy.
|
||||
|
||||
### Jobs
|
||||
|
||||
Một job bao gồm các step trong một workflow được thực thi trên một runner
|
||||
|
||||
### Steps
|
||||
|
||||
Mỗi step trong job có thể là một đoạn mã shell được thực thi hoặc một hành động. Các step được thực thi theo trình tự và chúng phụ thuộc vào nhau.
|
||||
|
||||
### Actions
|
||||
|
||||
Là một ứng dụng tùy chỉnh có thể lặp lại được sử dụng cho các tác vụ thường xuyên lặp lại.
|
||||
|
||||
### Runners
|
||||
|
||||
Một runner là một máy chủ thực thi workflow, mỗi runner chạy một job duy nhất tại một thời điểm. GitHub Actions cung cấp khả năng chạy các runner trên hệ điều hành Ubuntu Linux, Microsoft Windows và macOS. Bạn cũng có thể tự lưu trữ runner của mình trên một hệ điều hành hoặc phần cứng cụ thể.
|
||||
|
||||
Dưới đây, bạn có thể thấy cách mọi thứ hoạt động, sự kiện kích hoạt workflow của chúng ta > workflow của chúng ta bao gồm hai job > trong job, chúng ta có các step và sau đó là các action.
|
||||
|
||||

|
||||
|
||||
### YAML
|
||||
|
||||
Trước khi chúng ta bắt đầu với một trường hợp sử dụng thực tế, hãy nhìn nhanh vào hình ảnh trên dưới dạng một tệp YAML minh họa.
|
||||
|
||||
Tôi đã thêm dấu # để ghi chú vị trí chúng ta có thể tìm thấy các thành phần của YAML workflow.
|
||||
|
||||
```Yaml
|
||||
#Workflow
|
||||
name: 90DaysOfDevOps
|
||||
#Event
|
||||
on: [push]
|
||||
#Jobs
|
||||
jobs:
|
||||
check-bats-version:
|
||||
#Runners
|
||||
runs-on: ubuntu-latest
|
||||
#Steps
|
||||
steps:
|
||||
#Actions
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: '14'
|
||||
- run: npm install -g bats
|
||||
- run: bats -v
|
||||
```
|
||||
|
||||
### Thực hành với GitHub Actions
|
||||
|
||||
Tôi nghĩ rằng có rất nhiều tùy chọn khi nói đến GitHub Actions, nó sẽ đáp ứng nhu cầu CI/CD của bạn khi đến giai đoạn Xây dựng, Kiểm tra và Triển khai mã nguồn và các bước tiếp theo sau đó.
|
||||
|
||||
Tôi có thể thấy nhiều tùy chọn và các tác vụ tự động khác mà chúng ta có thể sử dụng GitHub Actions cho chúng.
|
||||
|
||||
### Sử dụng GitHub Actions để Kiểm tra mã nguồn của bạn
|
||||
|
||||
Một trong những tùy chọn là đảm bảo mã nguồn của bạn sạch sẽ và gọn gàng trong kho lưu trữ của bạn. Đây sẽ là ví dụ thực hiện đầu tiên của chúng ta.
|
||||
|
||||
Tôi sẽ sử dụng một đoạn mã mẫu được liên kết trong một trong những tài nguyên của bài này, chúng ta sẽ sử dụng `GitHub/super-linter` để kiểm tra mã nguồn của mình.
|
||||
|
||||
```Yaml
|
||||
name: Super-Linter
|
||||
|
||||
on: push
|
||||
|
||||
jobs:
|
||||
super-lint:
|
||||
name: Lint code base
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Run Super-Linter
|
||||
uses: github/super-linter@v3
|
||||
env:
|
||||
DEFAULT_BRANCH: main
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
```
|
||||
|
||||
**github/super-linter**
|
||||
Bạn có thể thấy phía trên rằng đối với một trong các bước, chúng ta có một action được gọi là `GitHub/super-linter` và điều này đang tham chiếu đến một step đã được cộng đồng viết trước đó. Bạn có thể tìm hiểu thêm về nó tại đây [Super-Linter](https://github.com/github/super-linter)
|
||||
|
||||
"Kho lưu trữ này dành cho GitHub Action để chạy Super-Linter. Đây là một sự kết hợp đơn giản của các trình kiểm tra mã nguồn khác nhau, được viết bằng bash, để giúp xác minh mã nguồn của bạn."
|
||||
|
||||
Cũng trong đoạn mã ở trên có đề cập đến GITHUB_TOKEN, nên tôi muốn tìm hiểu tại sao nó lại cần thiết và dùng để làm gì.
|
||||
|
||||
"GHI CHÚ: Nếu bạn truyền biến môi trường `GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}` trong workflow của bạn, thì GitHub Super-Linter sẽ đánh dấu trạng thái của mỗi lần chạy linter trong phần Kiểm tra của pull request. Nếu không, bạn chỉ sẽ thấy trạng thái tổng quan của toàn bộ quá trình chạy. **Không cần phải thiết lập GitHub Secret vì nó được cài đặt tự động bởi GitHub, chỉ cần truyền nó cho action.**"
|
||||
|
||||
Đoạn in đậm trên là điều quan trọng cần lưu ý ở giai đoạn này. Chúng ta đang sử dụng nó nhưng không cần phải thiết lập bất kỳ biến môi trường nào trong kho lưu trữ của chúng ta.
|
||||
|
||||
Chúng ta sẽ sử dụng kho lưu trữ mà chúng ta đã sử dụng trong bài thực hành Jenkins để kiểm tra.[Jenkins-HelloWorld](https://github.com/MichaelCade/Jenkins-HelloWorld)
|
||||
|
||||
Dưới đây là kho lưu trữ của chúng ta sau khi chúng ta kết thúc trong các buổi thực hành về Jenkins.
|
||||
|
||||

|
||||
|
||||
Để tận dụng, chúng ta có thể sử dụng tab Actions phía trên để chọn từ thư viện, điều mà tôi sẽ giải thích kỹ sau, hoặc chúng ta có thể tạo tệp của riêng mình bằng cách sử dụng mã super-linter ở trên. Để tạo một tệp của riêng mình, bạn phải tạo một tệp mới trong kho lưu trữ của bạn tại vị trí chính xác này: `.github/workflows/workflow_name` đảm bảo workflow_name là một cái gì đó hữu ích để nhận diện, trong đây, chúng ta có thể có nhiều workflow khác nhau thực hiện các job và nhiệm vụ khác nhau đối với kho lưu trữ của chúng ta.
|
||||
|
||||
Chúng ta sẽ tạo `.github/workflows/super-linter.yml.`
|
||||
|
||||

|
||||
|
||||
Sau đó, chúng ta có thể dán mã nguồn của mình và commit mã vào kho lưu trữ của mình. Sau đó, nếu chúng ta chuyển đến tab Actions, bây giờ chúng ta sẽ thấy Super-Linter workflow của mình được liệt kê dưới đây,
|
||||
|
||||

|
||||
|
||||
Chúng ta đã xác định trong mã của mình rằng workflow này sẽ chạy khi chúng ta đẩy bất kỳ thay đổi nào lên kho lưu trữ của mình, vì vậy khi đẩy super-linter.yml lên kho lưu trữ của mình, chúng ta đã kích hoạt worflow.
|
||||
|
||||

|
||||
|
||||
Như bạn có thể thấy từ trên, chúng ta có một số lỗi, có thể là do khả năng "hack" của tôi so với khả năng viết mã của tôi.
|
||||
|
||||
Dù đó không phải là mã của tôi, ít nhất là chưa phải, khi chạy điều này và nhận được một lỗi, tôi đã tìm thấy [issue](https://github.com/github/super-linter/issues/2255)
|
||||
|
||||
Lần thứ hai, tôi đã thay đổi phiên bản Super-Linter từ phiên bản 3 lên 4 và đã chạy lại tác vụ.
|
||||
|
||||

|
||||
|
||||
|
||||
Như dự đoán, việc "hack" mã của tôi đã gây ra một số vấn đề và bạn có thể thấy chúng ở đây trong [workflow](https://github.com/MichaelCade/Jenkins-HelloWorld/runs/5600278515?check_suite_focus=true).
|
||||
|
||||
Tôi muốn kể từ bây giờ sẽ hiển trị trên kho lưu trữ của chúng ta khi có điều gì đó trong workflow đã thất bại hoặc báo lỗi lại.
|
||||
|
||||

|
||||
|
||||
Bây giờ nếu chúng ta giải quyết lỗi trong commit trên với mã của tôi và đẩy lại các thay đổi, workflow của chúng ta sẽ chạy lại (bạn có thể thấy từ hình ảnh rằng nó mất một thời gian để giải quyết các "lỗi" của chúng ta). Xóa một tệp có thể không được khuyến nghị nhưng đó là một cách rất nhanh chóng để thể hiện vấn đề được giải quyết.
|
||||
|
||||

|
||||
|
||||
Nếu bạn nhấp vào nút **new workflow** được đánh dấu ở trên, điều này sẽ mở ra cửa sổ cho một loạt lớn các action. Một điều bạn có thể đã nhận thấy trong suốt thử thách này là chúng ta không muốn phải tạo lại mọi thứ, chúng ta muốn đứng trên vai những người khổng lồ và chia sẻ mã nguồn, tự động hóa và kỹ năng của mình rộng rãi để làm cuộc sống dễ dàng hơn.
|
||||
|
||||

|
||||
|
||||
Oh, tôi quên không cho bạn thấy dấu tích màu xanh trên kho lưu trữ khi workflow của chúng ta thành công.
|
||||
|
||||

|
||||
|
||||
Tôi nghĩ rằng những điều này đã bao quát mọi thứ từ quan điểm cơ bản về GitHub Actions, nhưng nếu bạn giống như tôi, bạn có thể đang nhìn thấy cách GitHub Actions có thể được sử dụng để tự động hóa nhiều nhiệm vụ khác.
|
||||
|
||||
Tiếp theo, chúng ta sẽ nói về một lĩnh vực khác của Continuous Deployment, chúng ta sẽ tìm hiểu về ArgoCD để triển khai ứng dụng của chúng ta tới môi trường của mình.
|
||||
|
||||
## Tài liệu tham khảo
|
||||
|
||||
- [Jenkins là một cách để xây dựng, kiểm thử, triển khai](https://www.youtube.com/watch?v=_MXtbjwsz3A)
|
||||
- [Jenkins.io](https://www.jenkins.io/)
|
||||
- [ArgoCD](https://argo-cd.readthedocs.io/en/stable/)
|
||||
- [Hướng dẫn ArgoCD cho người mới bắt đầu](https://www.youtube.com/watch?v=MeU5_k9ssrs)
|
||||
- [Jenkins là gì](https://www.youtube.com/watch?v=LFDrDnKPOTg)
|
||||
- [Hướng dẫn Jenkins đầy đủ](https://www.youtube.com/watch?v=nCKxl7Q_20I&t=3s)
|
||||
- [GitHub Actions](https://www.youtube.com/watch?v=R8_veQiYBjI)
|
||||
- [GitHub Actions CI/CD](https://www.youtube.com/watch?v=mFFXuXjVgkU)
|
||||
|
||||
Hẹn gặp lại vào [Ngày 76](day76.md)
|
84
2022/vi/Days/day76.md
Normal file
@ -0,0 +1,84 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Tổng quan về ArgoCD - Day 76'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Tổng quan về ArgoCD
|
||||
tags: 'devops, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1048809
|
||||
---
|
||||
|
||||
## Tổng quan về ArgoCD
|
||||
|
||||
“Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes”
|
||||
|
||||
Việc kiểm soát phiên bản là điều quan trọng ở đây. Bạn có từng thay đổi môi trường của mình một cách nhanh chóng mà không nhớ được điều đó, và bởi vì mọi thứ vẫn hoạt động bình thường, bạn tiếp tục thực hiện như bình thường chứ? Bạn có từng thực hiện một thay đổi và làm hỏng mọi thứ hoặc một phần của mọi thứ không? Có thể bạn đã biết rằng bạn đã thực hiện thay đổi và bạn có thể nhanh chóng quay lại trạng thái trước, bao gồm cả các tệp lệnh không tốt hoặc việc gõ sai chính tả. Việc thực hiện những điều này trên quy mô lớn có thể là không phải do bạn hoặc có thể không tìm thấy nguyên nhân ngay lập tức và khi đó doanh nghiệp sẽ gặp khó khăn. Do đó, việc kiểm soát phiên bản là vô cùng quan trọng. Không chỉ vậy mà "Định nghĩa ứng dụng, cấu hình, và môi trường nên tuân theo nguyên tắc khai báo và kiểm soát phiên bản." Ngoài ra (điều này được đề cập từ ArgoCD), đề cập rằng "Triển khai ứng dụng và quản lý vòng đời của ứng dụng nên được tự động hóa, có thể kiểm tra và dễ hiểu."
|
||||
|
||||
Từ lĩnh vực Quản trị nhưng đã nghiên cứu rất nhiều về Cơ sở hạ tầng dưới dạng mã, đây là bước tiếp theo để đảm bảo rằng tất cả những điều tốt lành đó được chăm sóc thông qua các luồng công việc triển khai / phát hành liên tục.".
|
||||
|
||||
|
||||
[ArgoCD là gì](https://argo-cd.readthedocs.io/en/stable/)
|
||||
|
||||
### Triển khai ArgoCD
|
||||
|
||||
Chúng ta sẽ sử dụng Kubernetes cluster với minikube cục bộ cho việc triển khai này.
|
||||
|
||||
```Shell
|
||||
kubectl create namespace argocd
|
||||
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
|
||||
```
|
||||
|
||||

|
||||
|
||||
Đảm bảo tất cả pods của ArgoCD đang hoạt động với lệnh `kubectl get pods -n argocd`
|
||||
|
||||

|
||||
|
||||
Cùng với đó, hãy kiểm tra mọi thứ chúng ta đã triển khai trong namespace `kubectl get all -n argocd`
|
||||
|
||||

|
||||
|
||||
Khi mọi thử ở trên đều ổn, chúng ta có thể cân nhắc truy cập nó qua port foward. Sử dụng lệnh `kubectl port-forward svc/argocd-server -n argocd 8080:443`. Hãy thực hiện điều này ở một cửa sổ terminal mới.
|
||||
|
||||
Sau đó mở một trình duyệt và truy cập `https://localhost:8080`
|
||||
|
||||

|
||||
|
||||
Để đăng nhập bạn cần một username của admin và sau đó lấy secret đã được tạo để làm password, sử dụng câu lệnh `kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo`
|
||||
|
||||

|
||||
|
||||
Khi đăng nhập thành công bạn sẽ thấy giao diện CD đang trống.
|
||||
|
||||

|
||||
|
||||
### Triển khai ứng dụng
|
||||
|
||||
Bây giờ chúng ta đã có ArgoCD hoạt động và có thể bắt đầu sử dụng nó để triển khai ứng dụng từ kho lưu trữ Git cũng như Helm.
|
||||
|
||||
Ứng dụng tôi muốn triển khai ở đây mà Pac-Man, một tựa game nổi tiếng và là thứ tôi sử dụng để chạy thử rất nhiều khi nói về quản lý dữ liệu, đây sẽ không phải là lần cuối chúng ta thấy Pac-Man.
|
||||
|
||||
Bạn có thể tìm thấy kho lưu trữ [Pac-Man](https://github.com/MichaelCade/pacman-tanzu.git) ở đây.
|
||||
|
||||
Thay vì đi qua từng bước sử dụng các screenshot, tôi nghĩ sẽ dễ dàng hơn bằng việc tạo một video hướng dẫn các bước cần thiết cho việc triển khai ứng dụng này.
|
||||
|
||||
[ArgoCD Demo - 90DaysOfDevOps](https://www.youtube.com/watch?v=w6J413_j0hA)
|
||||
|
||||
Ghi chú - Trong video, có một dịch vụ không bao giờ có một dịch vụ không bao giờ có status là healthy. Điều này xảy ra vì loại LoadBalancer được đặt cho dịch vụ Pacman đang có status là pending, trong Minikube chúng ta không có cấu hình load balancer. Nếu bạn muốn kiểm tra điều này, bạn có thể thay đổi YAML của dịch vụ thành ClusterIP và sử dụng port fowarding để chơi trò chơi.
|
||||
|
||||
Chúng ta kết thúc phần về Pipelines CI/CD tại đây. Tôi cảm thấy hiện tại khái niệm này đang được tập trung và bạn cũng sẽ nghe rất nhiều các thuật ngữ liên quan đến GitOps cũng như các phương pháp được sử dụng trong CICD trong công việc hàng ngày.
|
||||
|
||||
Phần tiếp theo chúng ta sẽ chuyển sang khía cạnh mới là Giám sát, một khái niệm hoặc lĩnh vực không mới nhưng ngày càng quan trọng hơn khi chúng ta muốn kiểm soát tốt hiệu suất của môi trường của mình.
|
||||
|
||||
## Tài liệu tham khảo
|
||||
|
||||
- [Jenkins là một cách để xây dựng, kiểm thử, triển khai](https://www.youtube.com/watch?v=_MXtbjwsz3A)
|
||||
- [Jenkins.io](https://www.jenkins.io/)
|
||||
- [ArgoCD](https://argo-cd.readthedocs.io/en/stable/)
|
||||
- [Hướng dẫn ArgoCD cho người mới bắt đầu](https://www.youtube.com/watch?v=MeU5_k9ssrs)
|
||||
- [Jenkins là gì](https://www.youtube.com/watch?v=LFDrDnKPOTg)
|
||||
- [Hướng dẫn Jenkins đầy đủ](https://www.youtube.com/watch?v=nCKxl7Q_20I&t=3s)
|
||||
- [GitHub Actions](https://www.youtube.com/watch?v=R8_veQiYBjI)
|
||||
- [GitHub Actions CI/CD](https://www.youtube.com/watch?v=mFFXuXjVgkU)
|
||||
|
||||
Hẹn gặp lại vào [Ngày 77](day77.md)
|
83
2022/vi/Days/day77.md
Normal file
@ -0,0 +1,83 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Bức tranh toàn cảnh: Giám sát - Ngày 77'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Bức tranh toàn cảnh: Giám sát
|
||||
tags: 'devops, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1048715
|
||||
---
|
||||
|
||||
## Bức tranh toàn cảnh: Giám sát
|
||||
|
||||
Trong tuần này chúng ta sẽ nói về giám sát, nó là gì và tại sao chúng ta cần nó?
|
||||
|
||||
### Giám sát là gì?
|
||||
|
||||
Giám sát là quá trình theo dõi chặt chẽ toàn bộ cơ sở hạ tầng
|
||||
|
||||
### và tại sao chúng ta cần nó?
|
||||
|
||||
Giả sử chúng ta đang quản lý một nghìn máy chủ, bao gồm nhiều loại máy chủ chuyên dụng như máy chủ ứng dụng, máy chủ cơ sở dữ liệu và máy chủ web. Chúng ta cũng có thể có các dịch vụ bổ sung và các nền tảng khác, bao gồm cả dịch vụ đám mây công cộng và Kubernetes.
|
||||
|
||||

|
||||
|
||||
Chúng ta chịu trách nhiệm đảm bảo rằng tất cả các dịch vụ, ứng dụng và tài nguyên trên máy chủ đều hoạt động bình thường.
|
||||
|
||||

|
||||
|
||||
Chúng ta làm điều đó như thế nào? có ba cách:
|
||||
|
||||
- Đăng nhập thủ công vào tất cả các máy chủ và kiểm tra tất cả dữ liệu về processes và tài nguyên, dịch vụ.
|
||||
- Viết script đăng nhập vào máy chủ và kiểm tra dữ liệu.
|
||||
|
||||
Cả hai lựa chọn này đều tạo ra một khối lượng công việc đáng cho chúng ta
|
||||
|
||||
Tùy chọn thứ ba dễ dàng hơn, chúng ta có thể sử dụng giải pháp giám sát có sẵn trên thị trường.
|
||||
|
||||
Nagios và Zabbix là những giải pháp sẵn có, chúng cho phép chúng ta nâng cấp cơ sở hạ tầng giám sát của mình để quản lý nhiều máy chủ như chúng ta muốn.
|
||||
|
||||
### Nagios
|
||||
|
||||
Nagios là một công cụ giám sát cơ sở hạ tầng được phát triển bởi một công ty cùng tên. Phiên bản mã nguồn mở của công cụ này được gọi là Nagios core trong khi phiên bản thương mại có tên là Nagios XI. [Trang web của Nagios](https://www.nagios.org/)
|
||||
|
||||
Công cụ này cho phép chúng ta giám sát các máy chủ của mình và xem liệu chúng có đang được sử dụng hiệu quả hoặc có bất kỳ tasks lỗi nào cần giải quyết hay không.
|
||||
|
||||

|
||||
|
||||
Về cơ bản, việc giám sát cho phép chúng ta đạt được hai mục tiêu này, kiểm tra trạng thái máy chủ và dịch vụ cũng như xác định tình trạng cơ sở hạ tầng. Nó cũng cung cấp cho chúng ta cái nhìn high-level về cơ sở hạ tầng hoàn chỉnh để xem liệu máy chủ có hoạt động hay không nếu các ứng dụng hoạt động hoạt động bình thường và các máy chủ web có thể truy cập được hay không.
|
||||
|
||||
Nó sẽ cho chúng ta biết rằng ổ đĩa của chúng ta đã tăng 10 phần trăm trong 10 tuần qua trên một máy chủ cụ thể, rằng nó sẽ cạn kiệt hoàn toàn trong vòng bốn hoặc năm ngày tới và nếu chúng ta không phản hồi sớm, nó sẽ cảnh báo khi đĩa hoặc máy chủ đang ở trạng thái nguy hiểm để chúng ta có thể thực hiện các hành động thích hợp nhằm tránh những sự cố ngừng hoạt động có thể xảy ra.
|
||||
|
||||
Trong trường hợp này, chúng ta có thể giải phóng một số dung lượng ổ đĩa và đảm bảo rằng máy chủ của chúng ta không bị lỗi và người dùng không bị ảnh hưởng.
|
||||
|
||||
Một câu hỏi khó đối với hầu hết các kỹ sư giám sát là chúng ta sẽ giám sát những gì? và có thể là chúng ta không giám sát những gì?
|
||||
|
||||
Mỗi hệ thống đều có một số tài nguyên, trong đó chúng ta nên theo dõi chặt chẽ tài nguyên nào và tài nguyên nào và chúng ta có thể nhắm mắt làm ngơ. Chẳng hạn như có cần thiết phải giám sát việc sử dụng CPU không, câu trả lời là rõ ràng là có, tuy nhiên đó vẫn là một quyết định cần phải được đưa ra. Có cần thiết phải theo dõi số lượng cổng mở trong hệ thống hay không, điều đó tùy thuộc vào tình huống. Nếu đó là một máy chủ đa năng thì chúng ta có thể sẽ không phải làm vậy, nhưng nếu đó là máy chủ web thì chúng ta nên làm điều đó.
|
||||
|
||||
### Giám sát liên tục
|
||||
|
||||
Giám sát không phải là một khái niệm mới và thậm chí giám sát liên tục đã được nhiều doanh nghiệp áp dụng trong nhiều năm qua.
|
||||
|
||||
Có ba lĩnh vực trọng tâm chính khi nói đến giám sát.
|
||||
|
||||
- Giám sát cơ sở hạ tầng
|
||||
- Giám sát ứng dụng
|
||||
- Giám sát mạng
|
||||
|
||||
Điều cần lưu ý là có rất nhiều công cụ có sẵn, chúng ta đã đề cập đến hai hệ thống và công cụ chung trong phần này nhưng còn rất nhiều công cụ khác. Lợi ích thực sự của một giải pháp giám sát thể hiện bạn dành thời gian để trả lời câu hỏi chúng ta nên giám sát những gì và không nên giám sát những gì?
|
||||
|
||||
Chúng ta có thể bật giải pháp giám sát trên bất kỳ nền tảng nào của chúng ta và nó sẽ bắt đầu lấy thông tin nhưng nếu thông tin đó quá nhiều thì bạn sẽ gặp khó khăn trong việc thấy các lợi ích từ giải pháp đó, bạn phải dành thời gian để định cấu hình nó.
|
||||
|
||||
Trong phần tiếp theo, chúng ta sẽ thực hành với một công cụ giám sát và xem chúng ta có thể bắt đầu giám sát những gì.
|
||||
|
||||
## Tài liệu tham khảo
|
||||
|
||||
- [The Importance of Monitoring in DevOps](https://www.devopsonline.co.uk/the-importance-of-monitoring-in-devops/)
|
||||
- [Understanding Continuous Monitoring in DevOps?](https://medium.com/devopscurry/understanding-continuous-monitoring-in-devops-f6695b004e3b)
|
||||
- [DevOps Monitoring Tools](https://www.youtube.com/watch?v=Zu53QQuYqJ0)
|
||||
- [Top 5 - DevOps Monitoring Tools](https://www.youtube.com/watch?v=4t71iv_9t_4)
|
||||
- [How Prometheus Monitoring works](https://www.youtube.com/watch?v=h4Sl21AKiDg)
|
||||
- [Introduction to Prometheus monitoring](https://www.youtube.com/watch?v=5o37CGlNLr8)
|
||||
|
||||
Hẹn gặp lại vào [ngày 78](day78.md)
|
97
2022/vi/Days/day78.md
Normal file
@ -0,0 +1,97 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Thực hành với công cụ giám sát - Ngày 78'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Thực hành với công cụ giám sát
|
||||
tags: 'devops, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1049056
|
||||
---
|
||||
|
||||
## Thực hành với công cụ giám sát
|
||||
|
||||
Hôm nay tôi sẽ nói về Prometheus, tôi đã thấy ngày càng nhiều hệ thống sử dụng Prometheus cho Cloud-Native nhưng nó cũng có thể được sử dụng để quản lý các tài nguyên vật lý cũng như Kubernetes và những thứ tương tự.
|
||||
|
||||
### Prometheus - Giám sát gần như mọi thứ
|
||||
|
||||
Trước hết, Prometheus là Mã nguồn mở có thể giúp bạn giám sát các containers và hệ thống micro-services cũng như các máy chủ vật lý, ảo hoá và các dịch vụ khác. Có một cộng đồng lớn đằng sau Prometheus.
|
||||
|
||||
Prometheus có rất nhiều [integrations and exporters](https://prometheus.io/docs/instrumenting/exporters/) Điều quan trọng là có thể export các metrics hiện có dưới dạng Prometheus metrics. Trên hết, nó còn hỗ trợ nhiều ngôn ngữ lập trình.
|
||||
|
||||
Phương thức pull - Nếu bạn đang nói chuyện với hàng nghìn micro-services hoặc hệ thống và dịch vụ thì các bạn sẽ thấy dịch vụ đẩy tới hệ thống giám sát bằng phương thức push. Điều này mang đến một số thách thức xung quanh việc làm quá tải hệ thống mạng, CPU cao và cũng xuất hiện single point of failure. Trong khi đó, phương thức pull mang đến cho chúng ta trải nghiệm tốt hơn nhiều, khi đó Prometheus sẽ lấy dữ liệu từ metrics endpoint trên các dịch vụ.
|
||||
|
||||
Một lần nữa chúng ta thấy YAML để cấu hình cho Prometheus.
|
||||
|
||||

|
||||
|
||||
Sau này, bạn sẽ thấy điều này trông như thế nào khi được triển khai vào Kubernetes, cụ thể là chúng ta có **PushGateway** lấy metrics từ các jobs/và exporters.
|
||||
|
||||
Chúng ta có **AlertManager** giúp đưa ra cảnh báo và đây là nơi chúng ta có thể tích hợp vào các dịch vụ bên ngoài như email, Slack và các công cụ khác.
|
||||
|
||||
Sau đó, chúng ta có máy chủ Prometheus quản lý việc truy xuất các pull metrics đó từ PushGateway và gửi các push alerts đó đến AlertManager. Máy chủ Prometheus cũng lưu trữ dữ liệu trên đĩa cục bộ. Mặc dù có thể tận dụng các giải pháp lưu trữ từ xa.
|
||||
|
||||
|
||||
Chúng ta cũng có PromQL, ngôn ngữ được sử dụng để tương tác với các metrics, bạn có thể thấy điều này trong Giao diện người dùng web của Prometheus nhưng ở phần sau trong bài viết này, bạn cũng sẽ thấy cách nó cũng được sử dụng trong các công cụ trực quan hóa dữ liệu như Grafana.
|
||||
|
||||
### Các cách triển khai Prometheus
|
||||
|
||||
Có nhiều cách cài đặt Prometheus khác nhau, [Trong phần tải xuống](https://prometheus.io/download/) cũng có sẵn docker image.
|
||||
|
||||
`docker run --name prometheus -d -p 127.0.0.1:9090:9090 prom/prometheus`
|
||||
|
||||
Nhưng chúng ta sẽ tập trung vào việc triển khai trên Kubernetes. Bản thân việc này cũng có một vài lựa chọn.
|
||||
|
||||
- Cấu hình bằng các tệp YAML
|
||||
- Sử dụng Operator (quản lý tất cả các thành phần của Kubernetes)
|
||||
- Sử dụng helm chart để triển khai operator
|
||||
|
||||
### Triển khai trên Kubernetes
|
||||
|
||||
Chúng ta sẽ sử dụng lại minikube cluster cục bộ của mình để cài đặt một cách nhanh chóng và đơn giản. Giống như các tương tác trước đây với minikube, chúng ta sẽ sử dụng heml để triển khai Prometheus heml chart.
|
||||
|
||||
`helm repo add prometheus-community https://prometheus-community.github.io/helm-charts`
|
||||
|
||||

|
||||
|
||||
Như bạn có thể thấy ở trên, chúng ta cũng đã chạy helm repo update, hiện tại chúng ta đã có thể triển khai Prometheus vào môi trường minikube của mình bằng cách sử dụng lệnh `helm install stable prometheus-community/prometheus`.
|
||||
|
||||

|
||||
|
||||
Sau vài phút, bạn sẽ thấy một số pods mới xuất hiện, trong demo này, tôi đã triển khai vào namespace mặc định, nhưng thông thường tôi sẽ triển khai trong namespace của nó.
|
||||
|
||||

|
||||
|
||||
Sau khi tất cả các pods đã chạy, chúng ta cũng có thể xem xét tất cả các thành phần đã được triển khai của Prometheus.
|
||||
|
||||

|
||||
|
||||
Bây giờ để truy cập vào Giao diện người của dùng máy chủ Prometheus, chúng ta có thể sử dụng lệnh sau để chuyển tiếp cổng.
|
||||
|
||||
```Shell
|
||||
export POD_NAME=$(kubectl get pods --namespace default -l "app=prometheus,component=server" -o jsonpath="{.items[0].metadata.name}")
|
||||
kubectl --namespace default port-forward $POD_NAME 9090
|
||||
```
|
||||
|
||||
Khi chúng ta lần đầu tiên mở trình duyệt của mình và truy cập `http://localhost:9090`, chúng ta thấy màn hình trống sau đây.
|
||||
|
||||

|
||||
|
||||
Vì chúng ta đã triển khai trên Kubernetes cluster nên sẽ được tự động chọn các metrics từ Kubernetes API để sử dụng PromQL nhằm đảm bảo ít nhất thì chúng ta đang thu tập các metrics `container_cpu_usage_seconds_total`
|
||||
|
||||

|
||||
|
||||
Nói ngắn gọn về việc học PromQL và áp dụng nó trong thực tế, điều này khá giống như tôi đã đề cập trước đây trong việc có được các metrics là rất tốt và việc giám sát cũng vậy, nhưng bạn phải biết bạn đang giám sát những gì và lý do cho việc đó, cũng như những gì bạn không theo dõi và lý do cho việc đó!
|
||||
|
||||
Tôi muốn nhắc lại về Prometheus nhưng bây giờ, tôi nghĩ chúng ta cần xem xét tới việc Quản lý log và Trực quan hóa dữ liệu để có thể quay lại Prometheus ở các phần sau.
|
||||
|
||||
## Tài liệu tham khảo
|
||||
|
||||
- [The Importance of Monitoring in DevOps](https://www.devopsonline.co.uk/the-importance-of-monitoring-in-devops/)
|
||||
- [Understanding Continuous Monitoring in DevOps?](https://medium.com/devopscurry/understanding-continuous-monitoring-in-devops-f6695b004e3b)
|
||||
- [DevOps Monitoring Tools](https://www.youtube.com/watch?v=Zu53QQuYqJ0)
|
||||
- [Top 5 - DevOps Monitoring Tools](https://www.youtube.com/watch?v=4t71iv_9t_4)
|
||||
- [How Prometheus Monitoring works](https://www.youtube.com/watch?v=h4Sl21AKiDg)
|
||||
- [Introduction to Prometheus monitoring](https://www.youtube.com/watch?v=5o37CGlNLr8)
|
||||
- [Promql cheat sheet with examples](https://www.containiq.com/post/promql-cheat-sheet-with-examples)
|
||||
|
||||
Hẹn gặp lại vào [ngày 79](day79.md)
|
@ -119,35 +119,35 @@ Cách nhanh nhất để liên lạc với tôi là thông qua Twitter tại [@M
|
||||
- [✔️] 📜 68 > [Tags, Variables, Inventory & Database Server config](Days/day68.md)
|
||||
- [✔️] 📜 69 > [Tất cả những thứ còn lại của Ansible - Automation Controller, AWX, Vault](Days/day69.md)
|
||||
|
||||
### Tạo CI/CD Pipelines
|
||||
### CI/CD pipelines
|
||||
|
||||
- [✔️] 🔄 70 > [The Big Picture: CI/CD Pipelines](Days/day70.md)
|
||||
- [✔️] 🔄 71 > [What is Jenkins?](Days/day71.md)
|
||||
- [✔️] 🔄 72 > [Getting hands on with Jenkins](Days/day72.md)
|
||||
- [✔️] 🔄 73 > [Building a Jenkins pipeline](Days/day73.md)
|
||||
- [✔️] 🔄 70 > [Bức tranh toàn cảnh: CI/CD Pipelines](Days/day70.md)
|
||||
- [✔️] 🔄 71 > [Jenkins là gì?](Days/day71.md)
|
||||
- [✔️] 🔄 72 > [Làm quen với Jenkins](Days/day72.md)
|
||||
- [✔️] 🔄 73 > [Xây dựng Jenkins pipeline](Days/day73.md)
|
||||
- [✔️] 🔄 74 > [Hello World - Jenkinsfile App Pipeline](Days/day74.md)
|
||||
- [✔️] 🔄 75 > [GitHub Actions Overview](Days/day75.md)
|
||||
- [✔️] 🔄 76 > [ArgoCD Overview](Days/day76.md)
|
||||
- [✔️] 🔄 75 > [Tổng quan về GitHub Actions](Days/day75.md)
|
||||
- [✔️] 🔄 76 > [Tổng quan về ArgoCD](Days/day76.md)
|
||||
|
||||
### Giám sát, quản lý logs và trực quan hóa dữ liệu
|
||||
|
||||
- [✔️] 📈 77 > [The Big Picture: Monitoring](Days/day77.md)
|
||||
- [✔️] 📈 78 > [Hands-On Monitoring Tools](Days/day78.md)
|
||||
- [✔️] 📈 79 > [The Big Picture: Log Management](Days/day79.md)
|
||||
- [✔️] 📈 77 > [Bức tranh toàn cảnh: Giám sát](Days/day77.md)
|
||||
- [✔️] 📈 78 > [Thực hành với công cụ giám sát](Days/day78.md)
|
||||
- [✔️] 📈 79 > [Bức tranh toàn cảnh: Quản lý log](Days/day79.md)
|
||||
- [✔️] 📈 80 > [ELK Stack](Days/day80.md)
|
||||
- [✔️] 📈 81 > [Fluentd & FluentBit](Days/day81.md)
|
||||
- [✔️] 📈 82 > [EFK Stack](Days/day82.md)
|
||||
- [✔️] 📈 83 > [Data Visualisation - Grafana](Days/day83.md)
|
||||
- [✔️] 📈 83 > [Trực quan hóa dữ liệu - Grafana](Days/day83.md)
|
||||
|
||||
### Lưu trữ & Bảo vệ Dữ liệu
|
||||
|
||||
- [✔️] 🗃️ 84 > [The Big Picture: Data Management](Days/day84.md)
|
||||
- [✔️] 🗃️ 85 > [Data Services](Days/day85.md)
|
||||
- [✔️] 🗃️ 86 > [Backup all the platforms](Days/day86.md)
|
||||
- [✔️] 🗃️ 87 > [Hands-On Backup & Recovery](Days/day87.md)
|
||||
- [✔️] 🗃️ 88 > [Application Focused Backups](Days/day88.md)
|
||||
- [✔️] 🗃️ 89 > [Disaster Recovery](Days/day89.md)
|
||||
- [✔️] 🗃️ 90 > [Data & Application Mobility](Days/day90.md)
|
||||
- [✔️] 🗃️ 84 > [Bức tranh toàn cảnh: Data Management](Days/day84.md)
|
||||
- [✔️] 🗃️ 85 > [Dịch vụ dữ liệu](Days/day85.md)
|
||||
- [✔️] 🗃️ 86 > [Sao lưu tất cả các nền tảng](Days/day86.md)
|
||||
- [✔️] 🗃️ 87 > [Thực hành với sao lưu & phục hồi](Days/day87.md)
|
||||
- [✔️] 🗃️ 88 > [Sao lưu theo hướng tập trung vào ứng dụng](Days/day88.md)
|
||||
- [✔️] 🗃️ 89 > [Khắc phục thảm họa (DR)](Days/day89.md)
|
||||
- [✔️] 🗃️ 90 > [Dữ liệu & ứng dụng: Tính di động](Days/day90.md)
|
||||
|
||||
## License
|
||||
|
||||
|
@ -1,76 +1,54 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - The Big Picture: DevOps and Linux - Day 14'
|
||||
title: '#90DaysOfDevOps - 概览: DevOps 与 Linux - 第十四天'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - The Big Picture DevOps and Linux
|
||||
description: 90DaysOfDevOps - 概览: DevOps 与 Linux
|
||||
tags: 'devops, 90daysofdevops, learning'
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1049033
|
||||
---
|
||||
## The Big Picture: DevOps and Linux
|
||||
Linux and DevOps share very similar cultures and perspectives; both are focused on customization and scalability. Both of these aspects of Linux are of particular importance for DevOps.
|
||||
## 概览: DevOps 与 Linux
|
||||
Linux和DevOps有着非常相似的文化和观点;两者都专注于定制化和可扩展性。Linux 的这两个方面对于 DevOps 来说都特别重要。
|
||||
|
||||
A lot of technologies start on Linux, especially if they are related to software development or managing infrastructure.
|
||||
许多技术都是从Linux开始的,特别是当它们与软件开发或基础设施管理有关的时候。
|
||||
|
||||
As well lots of open source projects, especially DevOps tools, were designed to run on Linux from the start.
|
||||
此外,许多开源项目,尤其是DevOps工具,从一开始就被设计为在Linux上运行。
|
||||
|
||||
From a DevOps perspective or in fact any operations role perspective you are going to come across Linux I would say mostly. There is a place for WinOps but the majority of the time you are going to be administering and deploying Linux servers.
|
||||
从DevOps或任何运营角色的角度来看,我会认为你将接触到Linux。WinOps是一种选择,但大多数时候你需要管理和部署Linux服务器。
|
||||
|
||||
I have been using Linux on a daily basis for a number of years but my go to desktop machine has always been either macOS or Windows. However, when I moved into the Cloud Native role I am in now I took the plunge to make sure that my laptop was fully Linux based and my daily driver, whilst I still needed Windows for work-based applications and a lot of my audio and video gear does not run on Linux I was forcing myself to run a Linux desktop full time to get a better grasp of a lot of the things we are going to touch on over the next 7 days.
|
||||
几年来,我一直在使用Linux,但我的桌面电脑一直是macOS或Windows。当我转变成为云原生角色(Cloud Native role)时,我需要确保我的笔记本电脑完全基于Linux和我的日常驱动程序,我仍然需要Windows用于工作的应用程序,而且我的许多音频和视频设备无法在Linux上运行,我强迫自己只运行Linux桌面以更好地掌握很多东西。我们将在接下来的7天里进行讨论。
|
||||
|
||||
## Getting Started
|
||||
I am not suggesting you do the same as me by any stretch as there are easier options and less destructive but I will say taking that full-time step forces you to learn faster on how to make things work on Linux.
|
||||
|
||||
For the majority of these 7 days, I am actually going to deploy a Virtual Machine in Virtual Box on my Windows machine. I am also going to deploy a desktop version of a Linux distribution, whereas a lot of the Linux servers you will be administering will likely be servers that come with no GUI and everything is shell-based. However, as I said at the start a lot of the tools that we covered throughout this whole 90 days started out on Linux I would also strongly encourage you to take the dive into running that Linux Desktop for that learning experience as well.
|
||||
|
||||
|
||||
|
||||
For the rest of this post, we are going to concentrate on getting a Ubuntu Desktop virtual machine up and running in our Virtual Box environment. Now we could just download [Virtual Box](https://www.virtualbox.org/) and grab the latest [Ubuntu ISO](https://ubuntu.com/download) from the sites linked and go ahead and build out our desktop environment but that wouldn't be very DevOps of us, would it?
|
||||
## 开始
|
||||
我并不是要求你和我一样完全使用Linux,因为有更简单、破坏性更小的选择。但我会说,只使用Linux可以迫使你更快地学习如何在Linux上工作。
|
||||
|
||||
在这7天的大部分时间里,我将在Windows电脑上的Virtual Box中部署虚拟机。我打算部署Linux发行版的桌面版本,而实际工作中你将管理的许多Linux服务器可能是没有GUI的服务器,并且一切都是基于shell的。但是,正如我在开始时所说,我们在整个90天学习中介绍的许多工具都是从Linux开始的,我也强烈建议你潜心使用该Linux桌面以获得学习体验。
|
||||
|
||||
在这篇文章的其余部分,我们将专注于在我们的Virtual Box环境中启动并运行Ubuntu桌面虚拟机。现在我们可以下载[Virtual Box](https://www.virtualbox.org/)并从链接的站点获取最新的[Ubuntu ISO](https://ubuntu.com/download),然后继续构建我们的桌面环境,但这一步对我们来说不是很DevOps,对吧?
|
||||
|
||||
Another good reason to use most Linux distributions is that they are free and open-source. We are also choosing Ubuntu as it is probably the most widely used distribution deployed not thinking about mobile devices and enterprise RedHat Enterprise servers. I might be wrong there but with CentOS and the history there I bet Ubuntu is high on the list and it's super simple.
|
||||
使用大多数Linux发行版的另一个理由是它们是免费和开源的。我们选择Ubuntu,因为它可能是使用最广泛的发行版,目前没有考虑移动设备和企业RedHat Enterprise服务器。我可能是错的,但对于 CentOS 和那里的历史,我敢打赌Ubuntu是比较热门的,而且它非常简单。
|
||||
|
||||
|
||||
## 简介:HashiCorp Vagrant
|
||||
Vagrant 是一个CLI程序,用于管理虚拟机的生命周期。我们可以使用vagrant在许多不同的平台上启动虚拟机,包括vSphere,Hyper-v,Virtual Box和Docker。它也有其他提供商,我们将使用Virtual Box,所以我们可以用到它。
|
||||
|
||||
## Introducing HashiCorp Vagrant
|
||||
我们需要做的第一件事是在我们的机器上安装Vagrant,当您转到下载页面时,您将看到供你选择的所有操作系统。[HashiCorp Vagrant](https://www.vagrantup.com/downloads) 我正在使用Windows,所以我下载了二进制文件并继续在我的系统上安装它。
|
||||
|
||||
接下来,我们还需要安装[Virtual Box](https://www.virtualbox.org/wiki/Downloads)。同样的,它也可以被安装在许多不同的操作系统上。如果你运行的是Windows,macOS或Linux,那么可以选择它和vagrant,我们的安装环节就到此为止。
|
||||
|
||||
这两个安装过程都非常简单,并且周围都有很棒的社区,所以如果你有问题,请随时联系他们,我也可以尝试提供帮助。
|
||||
|
||||
|
||||
## 我们的第一个VAGRANTFILE
|
||||
|
||||
Vagrant is a CLI utility that manages the lifecycle of your virtual machines. We can use vagrant to spin up and down virtual machines across many different platforms including vSphere, Hyper-v, Virtual Box and also Docker. It does have other providers but we will stick with that we are using Virtual Box here so we are good to go.
|
||||
VAGRANT文件描述了我们要部署的计算机类型,还定义了此计算机的配置和预配。
|
||||
|
||||
在保存这些和组织你的VAGRANT文件时,我倾向于将它们放在我工作区的文件夹中。您可以在下面看到这在我的系统上的外观。希望在此之后,你将与Vagrant一起玩,并体验启动不同系统的便利性,这可以帮助你不断探索Linux桌面。
|
||||
|
||||
|
||||

|
||||
|
||||
The first thing we need to do is get Vagrant installed on our machine, when you go to the downloads page you will see all the operating systems listed for your choice. [HashiCorp Vagrant](https://www.vagrantup.com/downloads) I am using Windows so I grabbed the binary for my system and went ahead and installed this to my system.
|
||||
|
||||
|
||||
|
||||
Next up we also need to get [Virtual Box](https://www.virtualbox.org/wiki/Downloads) installed. Again this can also be installed on many different operating systems again a good reason to choose this and vagrant is that if you are running Windows, macOS, or Linux then we have you covered here.
|
||||
|
||||
|
||||
|
||||
Both installations are pretty straightforward. If you have issues both have great communities around them also feel free to reach out and I can try to assist also.
|
||||
|
||||
|
||||
|
||||
## Our first VAGRANTFILE
|
||||
|
||||
|
||||
|
||||
The VAGRANTFILE describes the type of machine we want to deploy. It also defines how we want the configuration and provisioning of this machine need to look.
|
||||
|
||||
|
||||
|
||||
When it comes to saving these and organizing your VAGRANTFILEs I tend to put them in their own folders in my workspace. You can see below how this looks on my system. Hopefully following this you will play around with Vagrant and see the ease of spinning up different systems, it is also great for that rabbit hole is known as distro hopping for Linux Desktops.
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
Let's take a look at that VAGRANTFILE then and see what we are building.
|
||||
|
||||
让我们看一下VAGRANT文件,看看我们正在构建什么。
|
||||
|
||||
|
||||
```
|
||||
@ -93,12 +71,9 @@ end
|
||||
|
||||
```
|
||||
|
||||
This is a very simple VAGRANTFILE overall we are saying we want a specific "box" a box being possibly either a public image or private build of the system you are looking for. You can find a long list of "boxes" publicly available here in the [public catalog of Vagrant boxes](https://app.vagrantup.com/boxes/search)
|
||||
|
||||
|
||||
|
||||
Next line we are saying we want to use a specific provider in this case it is `VirtualBox` and then we want to define our machine's memory to `8GB and our number of CPUs to `4`. My experience also tells me that you may want to also add the following line if you experience display issues. This will set the video memory to what you want, I would ramp this right up to `128MB but depends on your system.
|
||||
总的来说,这是一个非常简单的VAGRANTFILE。我们想要一个特定的“盒子”,一个盒子可能是您正在寻找的系统的公共映像或私有版本。您可以在[public catalog of Vagrant boxes](https://app.vagrantup.com/boxes/search) 中找到一系列公开的“盒子”。
|
||||
|
||||
下一行我们说我们想使用特定的程序,这次使用的是`VirtualBox`。我们还将机器的内存`8GB`和CPU的数量定义为`4`。根据我的经验,如果您遇到问题,您可能还需要添加以下行。这会将视频内存设置为您想要的,我会将其提升到128MB ,但这取决于您的系统。
|
||||
|
||||
|
||||
```
|
||||
@ -107,66 +82,50 @@ v.customize ["modifyvm", :id, "--vram", ""]
|
||||
|
||||
```
|
||||
|
||||
I have also placed a copy of this specific vagrant file in the [Linux Folder](Linux/VAGRANTFILE)
|
||||
我还在[Linux 文件夹](Linux/VAGRANTFILE) 中放置了这个特定vagrant文件的副本。
|
||||
|
||||
|
||||
## 配置我们的 Linux 桌面
|
||||
|
||||
## Provisioning our Linux Desktop
|
||||
现在,我们已经准备好在工作站的终端中启动并运行我们的第一台机器。就我而言,我正在Windows机器上使用PowerShell。导航到您的项目文件夹,您将在其中找到您的VAGRANTFILE。到达那里后,您可以输入命令`vagrant up`,如果一切正常,您将看到类似以下内容。
|
||||
|
||||
|
||||
|
||||
We are now ready to get our first machine up and running, in your workstations terminal. In my case I am using PowerShell on my Windows machine, navigate to your projects folder and where you will find your VAGRANTFILE. Once there you can type the command `vagrant up` and if everything is correct then you will see something like the below.
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
此处要添加的另一样东西是,网络将设置为虚拟机上的网络`NAT`。在此阶段,我们不需要了解NAT,我计划在网络的章节中讨论它。这是在家庭网络上获取机器的简单按钮,它也是[Virtual Box documentation](https://www.virtualbox.org/manual/ch06.html#network_nat)上的默认网络模式。你可以在虚拟盒子文档中找到更多信息。
|
||||
|
||||
|
||||
|
||||
Another thing to add here is that the network will be set to `NAT` on your virtual machine, at this stage we don't really need to know about NAT and I plan to have a whole session talking about in the next section about Networking. But know that it is the easy button when it comes to getting a machine on your home network, it is also the default networking mode on Virtual Box. You can find out more in the [Virtual Box documentation](https://www.virtualbox.org/manual/ch06.html#network_nat)
|
||||
`vagrant up`完成后,我们现在可以使用`vagrant ssh`直接跳转到新 VM 的终端。
|
||||
|
||||
|
||||

|
||||
|
||||
Once `vagrant up` is complete we can now use `vagrant ssh` to jump straight into the terminal of our new VM.
|
||||
这是我们接下来的几天里将进行大部分探索的地方,但我还想深入了解我为您的开发人员工作站所做的一些自定义,当将其作为日常驱动程序运行时,使你的工作变得更加简单。当然,有一个很酷的非标准终端,才像是在做DevOps,对吧?
|
||||
|
||||
|
||||
|
||||

|
||||
在Virtual Box中进行确认,您应该会在选择VM时看到登录提示。
|
||||
|
||||
|
||||

|
||||
|
||||
This is where we will do most of our exploring over the next few days but I also want to dive into some customizations for your developer workstation that I have done and it makes your life much simpler when running this as your daily driver, and of course, are you really in DevOps unless you have a cool nonstandard terminal?
|
||||
|
||||
|
||||
|
||||
But just to confirm in Virtual Box you should see the login prompt when you select your VM.
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
Oh and if you made it this far and you have been asking "WHAT IS THE USERNAME & PASSWORD?"
|
||||
|
||||
|
||||
如果你做到了这一步,你会问“用户名和密码是什么?”
|
||||
|
||||
- Username = vagrant
|
||||
|
||||
- Password = vagrant
|
||||
|
||||
明天我们将了解一些命令以及它们的作用,终端将成为实现一切的地方。
|
||||
|
||||
|
||||
Tomorrow we are going to get into some of the commands and what they do, The terminal is going to be the place to make everything happen.
|
||||
|
||||
## Resources
|
||||
## 相关资料
|
||||
|
||||
- [Learn the Linux Fundamentals - Part 1](https://www.youtube.com/watch?v=kPylihJRG70)
|
||||
- [Linux for hackers (don't worry you don't need be a hacker!)](https://www.youtube.com/watch?v=VbEx7B_PTOE)
|
||||
|
||||
There are going to be lots of resources I find as we go through and much like the Go resources I am generally going to be keeping them to FREE content so we can all partake and learn here.
|
||||
随着我们的学习,我会发现很多资源,就像Go资源一样,我通常会将它们保留为免费内容,以便我们都可以在这里参与和学习。
|
||||
|
||||
As I mentioned next up we will take a look at the commands we might be using on a daily whilst in our Linux environments.
|
||||
正如我接下来会提到的,我们将看看我们在Linux环境中可能每天使用的命令。
|
||||
|
||||
See you on [Day15](day15.md)
|
||||
[第十五天](day15.md)见
|
||||
|
||||
|
@ -1,208 +1,190 @@
|
||||
---
|
||||
title: '#90DaysOfDevOps - Linux Commands for DevOps (Actually everyone) - Day 15'
|
||||
title: '#90DaysOfDevOps - DevOps 中的Linux命令 (通用) - 第十五天'
|
||||
published: false
|
||||
description: 90DaysOfDevOps - Linux Commands for DevOps (Actually everyone)
|
||||
description: 90DaysOfDevOps - DevOps 中的Linux命令 (通用)
|
||||
tags: "devops, 90daysofdevops, learning"
|
||||
cover_image: null
|
||||
canonical_url: null
|
||||
id: 1048834
|
||||
---
|
||||
## Linux Commands for DevOps (Actually everyone)
|
||||
## DevOps 中的Linux命令 (通用)
|
||||
|
||||
I mentioned it [yesterday](day14.md) that we are going to be spending a lot of time in the terminal with some commands to get stuff done.
|
||||
我[昨天](day14.md)提到,我们将在终端上花费大量时间使用一些命令来完成工作。
|
||||
|
||||
I also mentioned that with our vagrant provisioned VM we can use `vagrant ssh` and gain access to our box. You will need to be in the same directory as we provisioned it from.
|
||||
我还提到,通过我们的vagran提供的VM,我们可以使用`vagrant ssh`访问我们的盒子。你需要位于我们预配它的同一目录中。
|
||||
|
||||
For SSH you won't need the username and password, you will only need that if you decide to login to the Virtual Box console.
|
||||
对于 SSH,你不需要用户名和密码,只有在您决定登录Virtual Box控制台时才需要用户名和密码。
|
||||
|
||||
This is where we want to be as per below:
|
||||
这就是我们想要的地方,如图下所示:
|
||||
|
||||

|
||||

|
||||
|
||||
## Commands
|
||||
## 命令
|
||||
|
||||
Obviously I cannot cover all the commands here, there are pages and pages of documentation that cover these but also if you are ever in your terminal and you just need to understand options to a specific command we have the `man` pages short for manual. We can use this to go through each of the commands we touch on during this post to find out more options for each one. We can run `man man` which will give you the help for manual pages. To escape the man pages you should press `q` for quit.
|
||||
我无法涵盖此处的所有命令,有一页又一页的文档涵盖了这些命令,但是如果你在终端中并且只需要了解特定命令的选项,我们有`man`将手册的页面缩短。我们可以使用它来浏览我们在这篇文章中提到的每个命令,以找出每个命令的更多选项。我们可以运行`man man`它将为你提供手册页的帮助。若要退出手册页,你应该按`q`退出。
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
`sudo` If you are familar with Windows and the right click `run as administrator` we can think of `sudo` as very much this. When you run a command with this command you will be running it as `root` it will prompt you for the password before running the command.
|
||||
`sudo`如果您熟悉Windows和右键单击`以管理员身份运行`,`sudo`意义与之类似。当你将此命令与你要运行的命令一起使用时,会在运行命令之前提示您输入密码,并以`root`的身份运行命令。
|
||||
|
||||

|
||||

|
||||
|
||||
For one off jobs like installing applications or services you might need that `sudo command` but what if you have several tasks to deal with and you want to live as `sudo` for a while? This is where you can use `sudo su` again the same as `sudo` once entered you will be prompted for your `root` password. In a test VM like ours this is fine but I would find it very hard for us to be rolling around as `root` for prolonged periods, bad things can happen. To get out of this elevated position you simply type in `exit`
|
||||
对于安装应用程序或服务等一次性工作,您可能需要用到`sudo command`,但是如果您有多项任务要处理并且想`sudo`一段时间怎么办?你可以再次使用`sudo su`与使用`sudo`输入`root`密码相同的方法。在像我们这样的测试虚拟机中,这没什么问题。但我发现我们很难四处走动,因为 root 长时间可能会发生不好的事情。要摆脱这个更高的位置,您只需输入`exit`。
|
||||
|
||||

|
||||

|
||||
|
||||
I find myself using `clear` all the time, the `clear` command does exactly what it says it is going to clear the screen of all previous commands, putting your prompt to the top and giving you a nice clean workspace. Windows I think is `cls` in the .mdprompt.
|
||||
我发现自己一直在使用`clear`,`clear`命令完全按照它所说的去做,它将清除所有先前命令的显示内容,将您的提示放在顶部并为您提供一个漂亮干净的工作区。我认为在Windows中的命令提示符(cmd prompt)是`cls`。
|
||||
|
||||

|
||||

|
||||
|
||||
Let's now look at some commands where we can actually create things within our system and then visualise them in our terminal, first of all we have `mkdir` this will allow us to create a folder in our system. With the following command we can create a folder in our home directory called Day15 `mkdir Day15`
|
||||
现在让我们看一些命令,我们可以在其中实际创建系统内容,然后在终端中可视化它们,首先,我们有`mkdir`这将允许我们在系统中创建一个文件夹。使用以下命令,我们可以在主目录中创建一个名为 Day15 `mkdir Day15`的文件夹。
|
||||
|
||||

|
||||

|
||||
|
||||
With `cd` this allows us to change directory, so for us to move into our newly created directory we can do this with `cd Day15` tab can also be used to autocomplete the directory available. If we want to get back to where we started we can use `cd ..`
|
||||
有了`cd`,我们可以更改目录,因此对于我们移动到新创建的目录。我们可以使用tab用于自动完成可用的目录`cd Day15`。如果我们想回到我们开始的地方,我们可以使用`cd ..`。
|
||||
|
||||

|
||||

|
||||
|
||||
`rmdir` allows for us to remove the directory, if we run `rmdir Day15` then the folder will be removed (note that this will only work if you have nothing in the folder)
|
||||
`rmdir`允许我们删除目录,如果我们运行`rmdir Day15`,那么该文件夹将被删除(注意:这仅在文件夹中没有任何内容时才有效)
|
||||
|
||||

|
||||

|
||||
|
||||
I am sure we have all done it where we have navigated to the depths of our file system to a directory and not known where we are. `pwd` gives us the print out of the working directory, pwd as much as it looks like password it stands for print working directory.
|
||||
我敢肯定,我们都在导航到文件系统深处的目录并且不知道我们在哪里。`pwd`为我们提供了工作目录的打印输出,PWD就像密码的缩写,它代表打印工作目录。
|
||||
|
||||

|
||||

|
||||
|
||||
We know how to create folders and directories but how do we create files? We can create files using the `touch` command if we were to run `touch Day15` this would create a file. Ignore `mkdir` we are going see this again later.
|
||||
我们知道了如何创建文件夹和目录,但如何创建文件?如果我们运行`touch Day15`,我们将使用`touch`命令创建文件。忽略`mkdir`,稍后将再次看到这个命令。
|
||||
|
||||

|
||||

|
||||
|
||||
`ls` I can put my house on this, you will use this command so many times, this is going to list the all the files and folders in the current directory. Let's see if we can see that file we just created.
|
||||
`ls`我很肯定,你会多次使用这个命令,这将列出当前目录中的所有文件和文件夹。让我们看看我们是否可以看到我们刚刚创建的文件。
|
||||
|
||||

|
||||

|
||||
|
||||
How can we find files on our Linux system? `locate` is going to allow us to search our file system. If we use `locate Day15` it will report back that location of the file. Bonus round is that if you know that the file does exist but you get a blank result then run `sudo updatedb` which will index all the files in the file system then run your `locate` again. If you do not have `locate` available to you, you can install it using this command `sudo apt install mlocate`
|
||||
我们如何在Linux系统上找到文件?`locate`将允许我们搜索我们的文件系统。如果我们使用它`locate Day15`,它将报告文件的位置。如果您知道该文件确实存在,但得到一个空白结果,则可以运行`sudo updatedb`将再次索引文件系统中的所有你的`locate`文件。如果您没有`locate`,可以使用此命令`sudo apt install mlocate`安装它
|
||||
|
||||

|
||||

|
||||
|
||||
What about moving files from one location to another? `mv` is going to allow you to move your files. Example `mv Day15 90DaysOfDevOps` will move your file to the 90DaysOfDevOps folder.
|
||||
将文件从一个位置移动到另一个位置该怎么做?`mv`将允许你移动文件。示例:`mv Day15 90DaysOfDevOps`将文件移动到 90DaysOfDevOps 文件夹。
|
||||
|
||||

|
||||

|
||||
|
||||
We have moved our file but what if we want to rename it now to something else? We can do that using the `mv` command again... WOT!!!? yep we can simply use `mv Day15 day15` to change to upper case or we could use `mv day15 AnotherDay` to change it altogether, now use `ls` to check the file.
|
||||
我们已经移动了文件,但是如果我们现在想将其重命名怎么办?我们可以再次使用该`mv`命令来执行此操作...是的,我们可以简单地用`mv Day15 day15`更改为大写,或者我们可以完全`mv day15 AnotherDay`更改它,现在用`ls`检查文件。
|
||||
|
||||

|
||||

|
||||
|
||||
Enough is enough, let's now get rid (delete)of our file and maybe even our directory if we have one created. `rm` simply `rm AnotherDay` will remove our file. We will also use quite a bit `rm -R` which will recursively work through a folder or location. We might also use `rm -R -f` to force the removal of all of those files. Spoiler if you run `rm -R -f /` add sudo to it and you can say goodbye to your system....!
|
||||
现在让我们摆脱(删除)我们的文件,甚至我们的目录(如果我们创建了一个)。`rm AnotherDay`会删除我们的文件。我们还将经常使用`rm -R`的递归方式处理文件夹或位置。我们还可能使用`rm -R -f`强制删除所有这些文件。如果你运行`rm -R -f /`添加sudo,你可以说和你的系统说再见....!
|
||||
|
||||

|
||||

|
||||
|
||||
We have looked at moving files around but what if I just want to copy files from one folder to another, simply put its very similar to the `mv` command but we use `cp` so we can now say `cp Day15 Desktop`
|
||||
我们已经了解移动文件,但是如果我只想将文件从一个文件夹复制到另一个文件夹,与`mv`命令非常相似,但我们使用`cp`,因此我们现在可以用`cp Day15 Desktop`。
|
||||
|
||||

|
||||

|
||||
|
||||
We have created folders and files but we haven't actually put any contents into our folder, we can add contents a few ways but an easy way is `echo` we can also use `echo` to print out a lot of things in our terminal, I personally use echo a lot to print out system variables to know if they are set or not at least. we can use `echo "Hello #90DaysOfDevOps" > Day15` and this will add this to our file. We can also append to our file using `echo "Commands are fun!" >> Day15`
|
||||
我们已经创建了文件夹和文件,但我们没有将任何内容放入我们的文件夹中,我们可以通过几种方式添加内容,但一个简单的方法是`echo`我们还可以用`echo`在我们的终端中打印出很多东西。我经常使用echo来打印出系统变量,以了解它们是否被设置。我们可以使用`echo "Hello #90DaysOfDevOps" > Day15`,这会将其添加到我们的文件中。我们还可以使用以下命令`echo "Commands are fun!" >> Day15`附加到我们的文件。
|
||||
|
||||

|
||||

|
||||
|
||||
Another one of those commands you will use a lot! `cat` short for concatenate. We can use `cat Day15` to see the contents inside the file. Great for quickly reading those configuration files.
|
||||
您将经常使用其中的另一个命令!`cat`是连接词(concatenate)的缩写。我们可以用它来`cat Day15`查看文件内的内容。非常适合快速读取配置文件。
|
||||
|
||||

|
||||

|
||||
|
||||
If you have a long complex configuration file and you want or need to find something fast in that file vs reading every line then `grep` is your friend, this will allow us to search your file for a specific word using `cat Day15 | grep "#90DaysOfDevOps"`
|
||||
如果你有一个很长的复杂配置文件,并且你希望或需要在该文件中找到快速内容而不是阅读每一行,那么`grep`就是你的朋友。我们能够使用`cat Day15 | grep "#90DaysOfDevOps"`。
|
||||
|
||||

|
||||

|
||||
|
||||
If you are like me and you use that `clear` command a lot then you might miss some of the commands previously ran, we can use `history` to find out all those commands we have run prior. `history -c` will remove the history.
|
||||
如果您像我一样并且经常使用`clear`命令,那么您可能会丢失之前运行的一些命令,我们可以用来`history`找出我们之前运行过的所有`clear`命令。`history -c`将删除历史记录。
|
||||
|
||||
When you run `history` and you would like to pick a specific command you can use `!3` to choose the 3rd command in the list.
|
||||
当您运行`history`并想要选择一个特定命令时,您可以使用该命令选择列表中的第三个命令`!3`。
|
||||
|
||||
You are also able to use `history | grep "Command` to search for something specific.
|
||||
您还可以使用`history | grep "Command"`来搜索特定内容。
|
||||
|
||||
On servers to trace back when was a command executed, it can be useful to append the date and time to each command in the history file.
|
||||
在服务器上追溯已执行的命令,将日期和时间附加到历史记录文件的每个命令中可能很有用。
|
||||
|
||||
The following system variable controls this behaviour:
|
||||
以下系统变量控制此行为:
|
||||
```
|
||||
HISTTIMEFORMAT="%d-%m-%Y %T "
|
||||
```
|
||||
You can easily add to your bash_profile:
|
||||
您可以轻松地添加到bash_profile:
|
||||
```
|
||||
echo 'export HISTTIMEFORMAT="%d-%m-%Y %T "' >> ~/.bash_profile
|
||||
```
|
||||
So as useful to allow the history file grow bigger:
|
||||
为了将历史记录文件变大:
|
||||
|
||||
```
|
||||
echo 'export HISTSIZE=100000' >> ~/.bash_profile
|
||||
echo 'export HISTFILESIZE=10000000' >> ~/.bash_profile
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
Need to change your password? `passwd` is going allow us to change our password. Note that when you add your password in like this when it is hidden it will not be shown in `history` however if your command has `-p PASSWORD` then this will be visible in your `history`.
|
||||
需要更改密码?`passwd`允许我们更改密码。请注意,当你像这样添加隐藏密码时,它将不会显示在`history`。如果你的命令有`-p PASSWORD`,那么这将显示在你的`history`。
|
||||
|
||||

|
||||

|
||||
|
||||
We might also want to add new users to our system, we can do this with `useradd` we have to add the user using our `sudo` command, we can add a new user with `sudo useradd NewUser`
|
||||
我们可能还想在系统添加新用户,我们可以用到`useradd`。我们必须使用我们的`sudo`命令添加用户,我们可以添加一个新用户`sudo useradd NewUser`。
|
||||
|
||||

|
||||

|
||||
|
||||
Creating a group again requires `sudo` and we can use `sudo groupadd DevOps` then if we want to add our new user to that group we can do this by running `sudo usermod -a -G DevOps` `-a` is add and `-G` is group name.
|
||||
再次创建一个组需要用到`sudo`,我们可以使用`sudo groupadd DevOps`。如果我们想将新用户添加到该组,我们可以通过运行`sudo usermod -a -G DevOps`来做到这一点。`-a`是添加,`-G`是组名。
|
||||
|
||||

|
||||

|
||||
|
||||
How do we add users to the `sudo` group, this would be a very rare occassion for this to happen but in order to do this it would be `usermod -a -G sudo NewUser`
|
||||
我们如何将用户添加到`sudo`组中。这是非常罕见的情况,但要做到这一点可以使用`usermod -a -G sudo NewUser`。
|
||||
|
||||
### Permissions
|
||||
### 权限
|
||||
|
||||
read, write and execute are the permissions we have on all of our files and folders on our Linux system.
|
||||
读取、写入和执行是我们对Linux系统上所有文件和文件夹的权限。
|
||||
|
||||
A full list:
|
||||
完整列表:
|
||||
- 0 = 无 `---`
|
||||
- 1 = 仅执行 `--X`
|
||||
- 2 = 仅写入 `-W-`
|
||||
- 3 = 写入和执行 `-WX`
|
||||
- 4 = 只可读 `R--`
|
||||
- 5 = 可读和执行 `R-X`
|
||||
- 6 = 可读和写入 `RW-`
|
||||
- 7 = 可读、写入和执行 `RWX`
|
||||
|
||||
- 0 = None `---`
|
||||
- 1 = Execute only `--X`
|
||||
- 2 = Write only `-W-`
|
||||
- 3 = Write & Exectute `-WX`
|
||||
- 4 = Read Only `R--`
|
||||
- 5 = Read & Execute `R-X`
|
||||
- 6 = Read & Write `RW-`
|
||||
- 7 = Read, Write & Execute `RWX`
|
||||
你还将看到`777`或`775`,这些数字表示上述列表相同的含义,但每个数字代表**用户 - 组 - 每个人**的权限。
|
||||
|
||||
You will also see `777` or `775` and these represent the same numbers as the list above but each one represents **User - Group - Everyone**
|
||||
让我们看一下我们的文件。`ls -al Day15`,你可以看到上面提到的3个组,用户和组有读写,但每个人都只有读。
|
||||
|
||||
Let's take a look at our file. `ls -al Day15` you can see the 3 groups mentioned above, user and group has read & write but everyone only has read.
|
||||

|
||||
|
||||

|
||||
我们可以通过`chmod`更改此设置。如果你在系统上创建大量二进制文件,并且你需要提供执行这些二进制文件的能力,你可能会发现自己需要这样做。`chmod 750 Day15`,现在运行`ls -al Day15`。如果你想运行整个文件夹,那么你可以使用`-R`递归地做到这一点。
|
||||
|
||||
We can change this using `chmod` you might find yourself doing this if you are creating binaries a lot on your systems as well and you need to give the ability to execute those binaries. `chmod 750 Day15` now run `ls -al Day15` if you want to run this for a whole folder then you can use `-R` to recursively do that.
|
||||

|
||||
|
||||

|
||||
如何更改文件的所有者?我们可以使用`chown`。如果我们想将Day15的所有权从用户`vagrant`更改为`NewUser`,我们可以再次用到`sudo chown NewUser Day15`,并根据实际情况使用`-R`。
|
||||
|
||||
What about changing the owner of the file? We can use `chown` for this operation, if we wanted to change the ownership of our `Day15` from user `vagrant` to `NewUser` we can run `sudo chown NewUser Day15` again `-R` can be used.
|
||||

|
||||
|
||||

|
||||
当你有一个只需要特定的输出时,你会用到`awk`。比如运行`who`时,我们会得到包含信息的行,但也许我们只需要名称。我们可以运行`who | awk '{print $1}'`以获取第一列的列表。
|
||||
|
||||
A command that you will come across is `awk` where this comes in real use is when you have an output that you only need specific data from. like running `who` we get lines with information, but maybe we only need the names. We can run `who | awk '{print $1}'` to get just a list of that first column.
|
||||

|
||||
|
||||

|
||||
如果你希望从标准输入中读取数据流,并生成和执行命令行。这意味着它可以接受命令的输出并将其作为另一个命令的输入,`xargs`是此一个有用的工具。例如,我想要系统上所有Linux用户帐户的列表。运行`cut -d: -f1 < /etc/passwd`并获取我们在下面看到的长列表。
|
||||
|
||||
If you are looking to read streams of data from standard input, then generates and executes command lines; meaning it can take output of a command and passes it as argument of another command. `xargs` is a useful tool for this use case. If for example I want a list of all the Linux user accounts on the system I can run. `cut -d: -f1 < /etc/passwd` and get the long list we see below.
|
||||

|
||||
|
||||

|
||||
如果我想压缩该列表,我可以通过`cut -d: -f1 < /etc/passwd | sort | xargs`,使用`xargs`来实现。
|
||||
|
||||
If I want to compact that list I can do so by using `xargs` in a command like this `cut -d: -f1 < /etc/passwd | sort | xargs`
|
||||

|
||||
|
||||

|
||||
我也没有介绍`cut`,它允许我们从文件的每一行中删除部分内容。它可用于按字节位置、字符和字段剪切行的一部分。`cut -d " " -f 2 list.txt`命令允许我们删除我们拥有的第一个字母并仅显示我们的数字。这里有很多组合可以使用此命令,我确信我花了太多时间尝试使用此命令。而我可以手动提取数据,更快地完成这一操作。
|
||||
|
||||
I didn't mention the `cut` command either, this allows us to remove sections from each line of a file. It can be used to cut parts of a line by byte position, character and field. The `cut -d " " -f 2 list.txt` command allows us to remove that first letter we have and just display our numbers. There are so many combinations that can be used here with this command, I am sure I have spent too much time trying to use this command when I could have extracted data quicker manually.
|
||||
|
||||

|
||||

|
||||
|
||||
Also to note if you type a command and you are no longer with happy with it and you want to start again just hit control + c and this will cancel that line and start you fresh.
|
||||
还要注意的是,如果你输入一个命令并且不再满意它,你想重新开始,只需按下`control + c`,这将取消该行并重新开始。
|
||||
|
||||
## Resources
|
||||
## 相关资料
|
||||
|
||||
- [Learn the Linux Fundamentals - Part 1](https://www.youtube.com/watch?v=kPylihJRG70)
|
||||
- [Linux for hackers (don't worry you don't need be a hacker!)](https://www.youtube.com/watch?v=VbEx7B_PTOE)
|
||||
|
||||
See you on [Day16](day16.md)
|
||||
|
||||
This is a pretty heavy list already but I can safely say that I have used all of these commands in my day to day, be it from an administering Linux servers or in my Linux Desktop, it is very easy when you are in Windows or macOS to navigate the UI but in Linux Servers they are not there, everything is done through the terminal.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
[第十六天](day16.md)见
|
||||
|
||||
这是一个相当长的列表,但我可以肯定地说,我在日常中使用了所有这些命令。无论是从管理Linux服务器还是在我的Linux桌面上。在Windows或macOS中,你有图像界面。但在Linux服务器中,一切都是通过终端完成的。
|
||||
|
2
2023.md
@ -4,7 +4,7 @@
|
||||
<img src="logo.png?raw=true" alt="90DaysOfDevOps Logo" width="50%" height="50%" />
|
||||
</p>
|
||||
|
||||
English Version | [한국어](2023/ko/README.md)
|
||||
English Version | [한국어](2023/ko/README.md) | [Tiếng Việt](2023/vi/2023.md)
|
||||
|
||||
This repository is used to document my journey on getting a better foundational knowledge of "DevOps".
|
||||
|
||||
|
BIN
2023/.DS_Store
vendored
@ -42,4 +42,4 @@ Once you have access to your free tier account, there are a few additional steps
|
||||
[Create your free AWS account](https://youtu.be/uZT8dA3G-S4)
|
||||
|
||||
[Generate credentials, budget, and billing alarms via CLI](https://youtu.be/OdUnNuKylHg)
|
||||
See you in [Day 52](day52.md).
|
||||
See you in [Day 51](day51.md).
|
||||
|
@ -156,8 +156,8 @@ Once the control plane is initialised, the bootstrap machine is destroyed. If yo
|
||||
|
||||
We have covered the components that make up a Red Hat OpenShift Container Platform environment, why they are important to the environment, and what enteprise features they bring over a vanilla Kubernetes environment. We then dived into the methods available to deploy an OpenShift Cluster and the process that a Cluster build undertakes.
|
||||
|
||||
In [Day 58](/day58.md) will cover the steps to install Red Hat OpenShift to a VMware vSphere environment.
|
||||
In [Day 58](../day58.md) will cover the steps to install Red Hat OpenShift to a VMware vSphere environment.
|
||||
|
||||
# Resources
|
||||
|
||||
- [Glossary of common terms for OpenShift Container Platform architecture](https://docs.openshift.com/container-platform/4.12/architecture/index.html#openshift-architecture-common-terms_architecture-overview)
|
||||
- [Glossary of common terms for OpenShift Container Platform architecture](https://docs.openshift.com/container-platform/4.12/architecture/index.html#openshift-architecture-common-terms_architecture-overview)
|
||||
|
@ -9,7 +9,7 @@ These are small subset of challenges when it comes to running and managing appli
|
||||
Enter a Service Mesh. A Service Mesh is an application network layer that handles service-to-service communication, by providing a layer for granular traffic control, AuthN, AuthZ, and observability.
|
||||
|
||||
|
||||
### What are the challenges a Service Mesh aims to solve?m
|
||||
### What are the challenges a Service Mesh aims to solve?
|
||||
1. Unreliable and changing networks that are complex, while having to adapt while your microservices scale
|
||||
2. Ensuring a near zero-trust like environment where, RBAC, AuthZ and AuthN are critical.
|
||||
3. Ensuring a data-loss prevention approach using encryption and traffic filtration techniques
|
||||
|
BIN
2023/images/.DS_Store
vendored
279
2023/ko/days/day14.md
Normal file
@ -0,0 +1,279 @@
|
||||
# 컨테이너 이미지 스캐닝
|
||||
|
||||
컨테이너 이미지는 이미지 매니페스트, 파일 시스템 및 이미지 구성으로 구성됩니다. [1](https://opencontainers.org/about/overview/)
|
||||
|
||||
예를 들어, Java 애플리케이션용 컨테이너 이미지의 파일 시스템에는 Linux 파일 시스템, JVM 및 애플리케이션을 나타내는 JAR/WAR 파일이 있습니다.
|
||||
|
||||
컨테이너를 사용하는 경우 CI/CD 파이프라인의 중요한 부분은 이러한 컨테이너에 알려진 취약성이 있는지 스캐닝하는 프로세스여야 합니다.
|
||||
이를 통해 컨테이너 내부에 있는 취약성의 수에 대한 귀중한 정보를 얻을 수 있으며, 취약한 애플리케이션을 운영 환경에 배포하고 이러한 취약성으로 인해 해킹되는 것을 방지할 수 있습니다.
|
||||
|
||||
2021년 말 발견된 [Log4Shell](https://en.wikipedia.org/wiki/Log4Shell) 취약성을 예로 들어보겠습니다.
|
||||
너무 자세히 설명하지 않아도 응용프로그램에 이 취약성이 있다는 것은 공격자가 서버에서 임의 코드를 실행할 수 있다는 것을 의미합니다.
|
||||
이 취약성은 가장 인기 있는 Java 라이브러리 중 하나인 [Log4j](https://logging.apache.org/log4j/2.x/) 에 있기 때문에 더욱 악화되었습니다.
|
||||
꽤나 나쁘네요!
|
||||
|
||||
그렇다면 우리가 취약한지 어떻게 알 수 있을까요?
|
||||
|
||||
정답은 **Image Scanning**입니다.
|
||||
|
||||
이미지 스캐닝 프로세스는 컨테이너 내부를 살펴보고, 설치된 패키지 목록(리눅스 패키지일 수도 있지만 자바, Go, 자바스크립트 패키지 등일 수도 있음)을 가져오고, 패키지 목록을 각 패키지에 대해 알려진 취약성 데이터베이스와 교차 참조하고, 최종적으로 지정된 컨테이너 이미지에 대한 취약성 목록을 생성하는 것으로 구성됩니다.
|
||||
|
||||
컴퓨터 로컬이나 CI/CD 파이프라인에서 컨테이너 이미지를 바로 설치하고 스캔을 시작할 수 있는 오픈 소스 및 독점 이미지 스캐너가 많이 있습니다.
|
||||
가장 인기 있는 두 가지는 [Triby](https://github.com/aquasecurity/trivy) 와 [Grype](https://github.com/anchore/grype) 입니다.
|
||||
일부 독점 제품은 [Snyk](https://docs.snyk.io/products/snyk-container/snyk-cli-for-container-security) (계정 필요, Free tier 있음) 및 [VMware Carbon Black](https://carbonblack.vmware.com/resource/carbon-black-cloud-container-security-faq#overview) (계정 필요, Free tier 없음)입니다.
|
||||
|
||||
컨테이너 이미지를 스캔하는 것은 다음 중 하나를 설치하고 실행하는 것처럼 간단합니다:
|
||||
|
||||
```console
|
||||
$ grype ubuntu:latest
|
||||
✔ Vulnerability DB [updated]
|
||||
✔ Pulled image
|
||||
✔ Loaded image
|
||||
✔ Parsed image
|
||||
✔ Cataloged packages [101 packages]
|
||||
✔ Scanned image [16 vulnerabilities]
|
||||
NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITY
|
||||
bash 5.1-6ubuntu1 deb CVE-2022-3715 Medium
|
||||
coreutils 8.32-4.1ubuntu1 deb CVE-2016-2781 Low
|
||||
gpgv 2.2.27-3ubuntu2.1 deb CVE-2022-3219 Low
|
||||
libc-bin 2.35-0ubuntu3.1 deb CVE-2016-20013 Negligible
|
||||
libc6 2.35-0ubuntu3.1 deb CVE-2016-20013 Negligible
|
||||
libncurses6 6.3-2 deb CVE-2022-29458 Negligible
|
||||
libncursesw6 6.3-2 deb CVE-2022-29458 Negligible
|
||||
libpcre3 2:8.39-13ubuntu0.22.04.1 deb CVE-2017-11164 Negligible
|
||||
libsystemd0 249.11-0ubuntu3.6 deb CVE-2022-3821 Medium
|
||||
libtinfo6 6.3-2 deb CVE-2022-29458 Negligible
|
||||
libudev1 249.11-0ubuntu3.6 deb CVE-2022-3821 Medium
|
||||
login 1:4.8.1-2ubuntu2 deb CVE-2013-4235 Low
|
||||
ncurses-base 6.3-2 deb CVE-2022-29458 Negligible
|
||||
ncurses-bin 6.3-2 deb CVE-2022-29458 Negligible
|
||||
passwd 1:4.8.1-2ubuntu2 deb CVE-2013-4235 Low
|
||||
zlib1g 1:1.2.11.dfsg-2ubuntu9.2 deb CVE-2022-42800 Medium
|
||||
```
|
||||
|
||||
이 명령을 사용하여 `ubuntu:latest` 컨테이너 이미지를 스캔한 결과 16개의 취약점이 있는 것으로 나타났습니다.
|
||||
|
||||
각 취약성에는 [CVSS](https://nvd.nist.gov/vuln-metrics/cvss) 점수에 따라 심각도가 있습니다.
|
||||
심각도는 '낮음'부터 '심각함'까지 다양합니다.
|
||||
|
||||
16개의 취약점은 많아 보이지만, 어느 것도 '크리티컬(Critical)'한 심각성을 가지고 있지 않습니다.
|
||||
|
||||
또한 결과 테이블의 'FIXED-IN' 열이 비어 있습니다.
|
||||
이는 해당 패키지의 최신 버전에서 이 취약성이 수정되지 않음을 의미합니다.
|
||||
|
||||
`ubuntu:latest`는 Ubuntu의 공식 컨테이너 이미지의 최신 버전이기 때문에 이는 예상됩니다.
|
||||
일반적으로 이러한 이미지는 정기적으로 업데이트되므로 이러한 이미지에 많은 취약점이 있을 것으로 예상해서는 안 됩니다.(적어도 사용 가능한 수정 사항이 있는 이미지는 아님).
|
||||
|
||||
오래된 이미지, 임의의 이미지, 대기업에서 지원하지 않는 이미지 또는 자신이 관리하지 않는 이미지의 경우에는 그렇지 않을 수 있습니다.
|
||||
|
||||
예를 들어, Docker Hub의 `springio` 조직에서 임의 이미지 2년 된 이미지를 스캔하면 훨씬 더 많은 취약점이 잠재해 있음을 알 수 있습니다:
|
||||
|
||||
```console
|
||||
$ grype springio/petclinic:latest
|
||||
✔ Vulnerability DB [no update available]
|
||||
✔ Pulled image
|
||||
✔ Loaded image
|
||||
✔ Parsed image
|
||||
✔ Cataloged packages [213 packages]
|
||||
✔ Scanned image [167 vulnerabilities]
|
||||
NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITY
|
||||
bash 4.4.18-2ubuntu1.2 deb CVE-2022-3715 Medium
|
||||
bash 4.4.18-2ubuntu1.2 4.4.18-2ubuntu1.3 deb CVE-2019-18276 Low
|
||||
coreutils 8.28-1ubuntu1 deb CVE-2016-2781 Low
|
||||
dpkg 1.19.0.5ubuntu2.3 1.19.0.5ubuntu2.4 deb CVE-2022-1664 Medium
|
||||
e2fsprogs 1.44.1-1ubuntu1.3 1.44.1-1ubuntu1.4 deb CVE-2022-1304 Medium
|
||||
gcc-8-base 8.4.0-1ubuntu1~18.04 deb CVE-2020-13844 Medium
|
||||
gpgv 2.2.4-1ubuntu1.4 2.2.4-1ubuntu1.6 deb CVE-2022-34903 Medium
|
||||
gpgv 2.2.4-1ubuntu1.4 2.2.4-1ubuntu1.5 deb CVE-2019-13050 Low
|
||||
gpgv 2.2.4-1ubuntu1.4 deb CVE-2022-3219 Low
|
||||
gzip 1.6-5ubuntu1 1.6-5ubuntu1.2 deb CVE-2022-1271 Medium
|
||||
h2 1.4.200 2.0.202 java-archive GHSA-7rpj-hg47-cx62 High
|
||||
h2 1.4.200 2.0.206 java-archive GHSA-h376-j262-vhq6 Critical
|
||||
h2 1.4.200 java-archive CVE-2021-23463 Critical
|
||||
h2 1.4.200 java-archive CVE-2021-42392 Critical
|
||||
h2 1.4.200 java-archive CVE-2022-23221 Critical
|
||||
h2 1.4.200 2.1.210 java-archive GHSA-45hx-wfhj-473x Critical
|
||||
jackson-databind 2.11.4 2.12.7.1 java-archive GHSA-jjjh-jjxp-wpff High
|
||||
jackson-databind 2.11.4 2.12.7.1 java-archive GHSA-rgv9-q543-rqg4 High
|
||||
jackson-databind 2.11.4 java-archive CVE-2022-42004 High
|
||||
jackson-databind 2.11.4 java-archive CVE-2020-36518 High
|
||||
jackson-databind 2.11.4 java-archive CVE-2022-42003 High
|
||||
jackson-databind 2.11.4 2.12.6.1 java-archive GHSA-57j2-w4cx-62h2 High
|
||||
jquery 2.2.4 java-archive CVE-2019-11358 Medium
|
||||
jquery 2.2.4 java-archive CVE-2020-11022 Medium
|
||||
jquery 2.2.4 java-archive CVE-2015-9251 Medium
|
||||
jquery 2.2.4 java-archive CVE-2020-11023 Medium
|
||||
jquery 2.2.4 java-archive CVE-2007-2379 Medium
|
||||
jquery-ui 1.11.4 java-archive CVE-2021-41184 Medium
|
||||
jquery-ui 1.11.4 java-archive CVE-2016-7103 Medium
|
||||
jquery-ui 1.11.4 java-archive CVE-2021-41182 Medium
|
||||
jquery-ui 1.11.4 java-archive CVE-2021-41183 Medium
|
||||
libc-bin 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2020-29562 Low
|
||||
libc-bin 2.27-3ubuntu1.4 deb CVE-2016-20013 Negligible
|
||||
libc-bin 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2020-6096 Low
|
||||
libc-bin 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2020-27618 Low
|
||||
libc-bin 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2022-23218 Low
|
||||
libc-bin 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2016-10228 Negligible
|
||||
libc-bin 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2019-25013 Low
|
||||
libc-bin 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2021-3326 Low
|
||||
libc-bin 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2021-3999 Medium
|
||||
libc-bin 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2022-23219 Low
|
||||
libc-bin 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2021-35942 Low
|
||||
libc-bin 2.27-3ubuntu1.4 deb CVE-2009-5155 Negligible
|
||||
libc-bin 2.27-3ubuntu1.4 deb CVE-2015-8985 Negligible
|
||||
libc6 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2021-3999 Medium
|
||||
libc6 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2016-10228 Negligible
|
||||
libc6 2.27-3ubuntu1.4 deb CVE-2009-5155 Negligible
|
||||
libc6 2.27-3ubuntu1.4 deb CVE-2016-20013 Negligible
|
||||
libc6 2.27-3ubuntu1.4 deb CVE-2015-8985 Negligible
|
||||
libc6 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2021-3326 Low
|
||||
libc6 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2021-35942 Low
|
||||
libc6 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2020-27618 Low
|
||||
libc6 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2020-6096 Low
|
||||
libc6 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2020-29562 Low
|
||||
libc6 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2022-23218 Low
|
||||
libc6 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2022-23219 Low
|
||||
libc6 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2019-25013 Low
|
||||
libcom-err2 1.44.1-1ubuntu1.3 1.44.1-1ubuntu1.4 deb CVE-2022-1304 Medium
|
||||
libext2fs2 1.44.1-1ubuntu1.3 1.44.1-1ubuntu1.4 deb CVE-2022-1304 Medium
|
||||
libgcc1 1:8.4.0-1ubuntu1~18.04 deb CVE-2020-13844 Medium
|
||||
libgcrypt20 1.8.1-4ubuntu1.2 1.8.1-4ubuntu1.3 deb CVE-2021-40528 Medium
|
||||
libgcrypt20 1.8.1-4ubuntu1.2 1.8.1-4ubuntu1.3 deb CVE-2021-33560 Low
|
||||
libgmp10 2:6.1.2+dfsg-2 2:6.1.2+dfsg-2ubuntu0.1 deb CVE-2021-43618 Low
|
||||
libgnutls30 3.5.18-1ubuntu1.4 3.5.18-1ubuntu1.6 deb CVE-2021-4209 Low
|
||||
libgnutls30 3.5.18-1ubuntu1.4 deb CVE-2018-16868 Low
|
||||
libgnutls30 3.5.18-1ubuntu1.4 3.5.18-1ubuntu1.6 deb CVE-2022-2509 Medium
|
||||
libhogweed4 3.4-1ubuntu0.1 3.4.1-0ubuntu0.18.04.1 deb CVE-2021-3580 Medium
|
||||
libhogweed4 3.4-1ubuntu0.1 3.4.1-0ubuntu0.18.04.1 deb CVE-2018-16869 Low
|
||||
liblz4-1 0.0~r131-2ubuntu3 0.0~r131-2ubuntu3.1 deb CVE-2021-3520 Medium
|
||||
liblzma5 5.2.2-1.3 5.2.2-1.3ubuntu0.1 deb CVE-2022-1271 Medium
|
||||
libncurses5 6.1-1ubuntu1.18.04 deb CVE-2019-17594 Negligible
|
||||
libncurses5 6.1-1ubuntu1.18.04 deb CVE-2021-39537 Negligible
|
||||
libncurses5 6.1-1ubuntu1.18.04 deb CVE-2022-29458 Negligible
|
||||
libncurses5 6.1-1ubuntu1.18.04 deb CVE-2019-17595 Negligible
|
||||
libncursesw5 6.1-1ubuntu1.18.04 deb CVE-2019-17595 Negligible
|
||||
libncursesw5 6.1-1ubuntu1.18.04 deb CVE-2021-39537 Negligible
|
||||
libncursesw5 6.1-1ubuntu1.18.04 deb CVE-2022-29458 Negligible
|
||||
libncursesw5 6.1-1ubuntu1.18.04 deb CVE-2019-17594 Negligible
|
||||
libnettle6 3.4-1ubuntu0.1 3.4.1-0ubuntu0.18.04.1 deb CVE-2021-3580 Medium
|
||||
libnettle6 3.4-1ubuntu0.1 3.4.1-0ubuntu0.18.04.1 deb CVE-2018-16869 Low
|
||||
libpcre3 2:8.39-9 deb CVE-2017-11164 Negligible
|
||||
libpcre3 2:8.39-9 2:8.39-9ubuntu0.1 deb CVE-2020-14155 Negligible
|
||||
libpcre3 2:8.39-9 2:8.39-9ubuntu0.1 deb CVE-2019-20838 Low
|
||||
libsepol1 2.7-1 2.7-1ubuntu0.1 deb CVE-2021-36086 Low
|
||||
libsepol1 2.7-1 2.7-1ubuntu0.1 deb CVE-2021-36085 Low
|
||||
libsepol1 2.7-1 2.7-1ubuntu0.1 deb CVE-2021-36087 Low
|
||||
libsepol1 2.7-1 2.7-1ubuntu0.1 deb CVE-2021-36084 Low
|
||||
libss2 1.44.1-1ubuntu1.3 1.44.1-1ubuntu1.4 deb CVE-2022-1304 Medium
|
||||
libssl1.1 1.1.1-1ubuntu2.1~18.04.9 1.1.1-1ubuntu2.1~18.04.15 deb CVE-2022-0778 High
|
||||
libssl1.1 1.1.1-1ubuntu2.1~18.04.9 1.1.1-1ubuntu2.1~18.04.20 deb CVE-2022-2097 Medium
|
||||
libssl1.1 1.1.1-1ubuntu2.1~18.04.9 1.1.1-1ubuntu2.1~18.04.13 deb CVE-2021-3712 Medium
|
||||
libssl1.1 1.1.1-1ubuntu2.1~18.04.9 1.1.1-1ubuntu2.1~18.04.13 deb CVE-2021-3711 High
|
||||
libssl1.1 1.1.1-1ubuntu2.1~18.04.9 1.1.1-1ubuntu2.1~18.04.17 deb CVE-2022-1292 Medium
|
||||
libssl1.1 1.1.1-1ubuntu2.1~18.04.9 1.1.1-1ubuntu2.1~18.04.19 deb CVE-2022-2068 Medium
|
||||
libstdc++6 8.4.0-1ubuntu1~18.04 deb CVE-2020-13844 Medium
|
||||
libsystemd0 237-3ubuntu10.47 237-3ubuntu10.56 deb CVE-2022-2526 Medium
|
||||
libsystemd0 237-3ubuntu10.47 deb CVE-2022-3821 Medium
|
||||
libsystemd0 237-3ubuntu10.47 237-3ubuntu10.49 deb CVE-2020-13529 Low
|
||||
libsystemd0 237-3ubuntu10.47 237-3ubuntu10.49 deb CVE-2021-33910 High
|
||||
libtinfo5 6.1-1ubuntu1.18.04 deb CVE-2019-17595 Negligible
|
||||
libtinfo5 6.1-1ubuntu1.18.04 deb CVE-2021-39537 Negligible
|
||||
libtinfo5 6.1-1ubuntu1.18.04 deb CVE-2019-17594 Negligible
|
||||
libtinfo5 6.1-1ubuntu1.18.04 deb CVE-2022-29458 Negligible
|
||||
libudev1 237-3ubuntu10.47 237-3ubuntu10.49 deb CVE-2020-13529 Low
|
||||
libudev1 237-3ubuntu10.47 237-3ubuntu10.49 deb CVE-2021-33910 High
|
||||
libudev1 237-3ubuntu10.47 deb CVE-2022-3821 Medium
|
||||
libudev1 237-3ubuntu10.47 237-3ubuntu10.56 deb CVE-2022-2526 Medium
|
||||
locales 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2022-23219 Low
|
||||
locales 2.27-3ubuntu1.4 deb CVE-2016-20013 Negligible
|
||||
locales 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2021-3999 Medium
|
||||
locales 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2016-10228 Negligible
|
||||
locales 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2019-25013 Low
|
||||
locales 2.27-3ubuntu1.4 deb CVE-2009-5155 Negligible
|
||||
locales 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2021-35942 Low
|
||||
locales 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2022-23218 Low
|
||||
locales 2.27-3ubuntu1.4 deb CVE-2015-8985 Negligible
|
||||
locales 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2020-27618 Low
|
||||
locales 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2020-29562 Low
|
||||
locales 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2021-3326 Low
|
||||
locales 2.27-3ubuntu1.4 2.27-3ubuntu1.5 deb CVE-2020-6096 Low
|
||||
log4j-api 2.13.3 java-archive CVE-2021-45105 Medium
|
||||
log4j-api 2.13.3 java-archive CVE-2021-44832 Medium
|
||||
log4j-to-slf4j 2.13.3 java-archive CVE-2021-44832 Medium
|
||||
log4j-to-slf4j 2.13.3 java-archive CVE-2021-45105 Medium
|
||||
logback-core 1.2.3 1.2.9 java-archive GHSA-668q-qrv7-99fm Medium
|
||||
login 1:4.5-1ubuntu2 deb CVE-2013-4235 Low
|
||||
login 1:4.5-1ubuntu2 1:4.5-1ubuntu2.2 deb CVE-2018-7169 Low
|
||||
ncurses-base 6.1-1ubuntu1.18.04 deb CVE-2022-29458 Negligible
|
||||
ncurses-base 6.1-1ubuntu1.18.04 deb CVE-2019-17595 Negligible
|
||||
ncurses-base 6.1-1ubuntu1.18.04 deb CVE-2019-17594 Negligible
|
||||
ncurses-base 6.1-1ubuntu1.18.04 deb CVE-2021-39537 Negligible
|
||||
ncurses-bin 6.1-1ubuntu1.18.04 deb CVE-2021-39537 Negligible
|
||||
ncurses-bin 6.1-1ubuntu1.18.04 deb CVE-2022-29458 Negligible
|
||||
ncurses-bin 6.1-1ubuntu1.18.04 deb CVE-2019-17595 Negligible
|
||||
ncurses-bin 6.1-1ubuntu1.18.04 deb CVE-2019-17594 Negligible
|
||||
openssl 1.1.1-1ubuntu2.1~18.04.9 1.1.1-1ubuntu2.1~18.04.13 deb CVE-2021-3712 Medium
|
||||
openssl 1.1.1-1ubuntu2.1~18.04.9 1.1.1-1ubuntu2.1~18.04.19 deb CVE-2022-2068 Medium
|
||||
openssl 1.1.1-1ubuntu2.1~18.04.9 1.1.1-1ubuntu2.1~18.04.20 deb CVE-2022-2097 Medium
|
||||
openssl 1.1.1-1ubuntu2.1~18.04.9 1.1.1-1ubuntu2.1~18.04.13 deb CVE-2021-3711 High
|
||||
openssl 1.1.1-1ubuntu2.1~18.04.9 1.1.1-1ubuntu2.1~18.04.15 deb CVE-2022-0778 High
|
||||
openssl 1.1.1-1ubuntu2.1~18.04.9 1.1.1-1ubuntu2.1~18.04.17 deb CVE-2022-1292 Medium
|
||||
passwd 1:4.5-1ubuntu2 1:4.5-1ubuntu2.2 deb CVE-2018-7169 Low
|
||||
passwd 1:4.5-1ubuntu2 deb CVE-2013-4235 Low
|
||||
perl-base 5.26.1-6ubuntu0.5 5.26.1-6ubuntu0.6 deb CVE-2020-16156 Medium
|
||||
snakeyaml 1.27 java-archive GHSA-w37g-rhq8-7m4j Medium
|
||||
snakeyaml 1.27 1.32 java-archive GHSA-9w3m-gqgf-c4p9 Medium
|
||||
snakeyaml 1.27 1.31 java-archive GHSA-3mc7-4q67-w48m High
|
||||
snakeyaml 1.27 1.31 java-archive GHSA-c4r9-r8fh-9vj2 Medium
|
||||
snakeyaml 1.27 1.31 java-archive GHSA-hhhw-99gj-p3c3 Medium
|
||||
snakeyaml 1.27 1.31 java-archive GHSA-98wm-3w3q-mw94 Medium
|
||||
spring-core 5.3.6 java-archive CVE-2022-22950 Medium
|
||||
spring-core 5.3.6 java-archive CVE-2022-22965 Critical
|
||||
spring-core 5.3.6 java-archive CVE-2021-22096 Medium
|
||||
spring-core 5.3.6 java-archive CVE-2022-22968 Medium
|
||||
spring-core 5.3.6 java-archive CVE-2022-22970 Medium
|
||||
spring-core 5.3.6 java-archive CVE-2022-22971 Medium
|
||||
spring-core 5.3.6 java-archive CVE-2021-22118 High
|
||||
spring-core 5.3.6 java-archive CVE-2016-1000027 Critical
|
||||
spring-core 5.3.6 java-archive CVE-2021-22060 Medium
|
||||
tar 1.29b-2ubuntu0.2 1.29b-2ubuntu0.3 deb CVE-2021-20193 Low
|
||||
zlib1g 1:1.2.11.dfsg-0ubuntu2 1:1.2.11.dfsg-0ubuntu2.2 deb CVE-2022-37434 Medium
|
||||
zlib1g 1:1.2.11.dfsg-0ubuntu2 1:1.2.11.dfsg-0ubuntu2.1 deb CVE-2018-25032 Medium
|
||||
zlib1g 1:1.2.11.dfsg-0ubuntu2 deb CVE-2022-42800 Medium
|
||||
```
|
||||
|
||||
여기서 우리는 훨씬 더 많은 `중요한` 취약점을 볼 수 있을 뿐만 아니라 많은 취약점이 해당 종속성의 최신 버전에서 수정되었음을 알 수 있습니다.
|
||||
즉, 해당 종속성의 간단한 버전 업데이트만으로도 취약점을 제거하고 이미지를 더 안전하게 만들 수 있습니다.
|
||||
|
||||
물론 항상 그렇게 간단한 것은 아닙니다.
|
||||
때로는 종속성의 새 버전에 소스 코드를 변경해야 하는 API 변경 사항이 포함되거나, 종속성과 상호 작용하는 방식에 버그를 유발하는 동작 변경이 포함되거나, 수정될 때까지 피하고 싶은 버그가 발생할 수 있습니다.
|
||||
|
||||
또 한 가지 언급할 만한 점은 이러한 유형의 스캔은 _알려진_ 취약점만 탐지한다는 것입니다.
|
||||
즉, 보안 연구원이 발견하고 CVE를 지정한 취약점만 탐지합니다.
|
||||
아직 알려지지 않은 취약점이 코드/종속성에 숨어 있을 수 있습니다. (Log4Shell은 2013년부터 사용되었지만 2021년에야 발견됨)
|
||||
|
||||
요약하자면, 이미지 스캔은 만병통치약이 아닙니다.
|
||||
이미지 스캐너가 이미지에 취약점이 0개라고 알려준다고 해서 100% 안전하다는 의미는 아닙니다.
|
||||
|
||||
또한 취약점을 완화하는 것은 종속성 버전을 변경하거나 다운그레이드하는 것만큼 간단할 수도 있지만, 때로는 버전 변경을 위해 코드를 변경해야 할 수도 있기 때문에 더 까다로울 수 있습니다.
|
||||
|
||||
## CVEs
|
||||
|
||||
스캐너가 제공하는 취약점 표에서 'CVE-'로 시작하는 것을 볼 수 있습니다:
|
||||
|
||||
```text
|
||||
bash 4.4.18-2ubuntu1.2 deb CVE-2022-3715 Medium
|
||||
```
|
||||
|
||||
[CVE**](https://cve.mitre.org/)는 **C**ommon **V**ulnerability and **E**xposures.의 약자입니다.
|
||||
|
||||
취약점을 추적하고 쉽게 검색할 수 있도록 하는 시스템입니다.
|
||||
|
||||
새로운 취약점이 발견될 때마다 [CNA](https://www.cve.org/ProgramOrganization/CNAs)(CVE 번호 부여 기관)에서 CVE를 할당하고 해당 취약점이 포함된 모든 구성 요소와 연관시킵니다.
|
||||
|
||||
이 작업이 완료되면 이 정보는 취약점 데이터베이스로 전파되며 이미지 스캐너를 통해 컨테이너에 존재하는 CVE/취약점에 대해 경고하는 데 활용될 수 있습니다.
|
||||
|
||||
## 요약
|
||||
|
||||
이제 이미지 스캔이 중요한 이유와 보안을 강화하는 데 어떻게 도움이 되는지 알게 되었습니다.
|
||||
[15일차](day15.md)에서는 이미지 스캐너가 내부에서 작동하는 방식에 대해 자세히 살펴보고 SBOM과 취약성 데이터베이스 등을 살펴보겠습니다.
|
233
2023/ko/days/day15.md
Normal file
@ -0,0 +1,233 @@
|
||||
# 컨테이너 이미지 스캐닝 고급
|
||||
|
||||
## SBOM
|
||||
|
||||
**SBOM**은 **S**oftware **B**ill **O**f **M**aterials의 약자입니다.
|
||||
|
||||
이것은 소프트웨어 애플리케이션 또는 시스템을 구성하는 모든 구성 요소의 목록입니다.
|
||||
여기에는 소프트웨어를 구축하는 데 사용되는 다양한 타사 라이브러리, 프레임워크 및 기타 오픈 소스 또는 독점 구성 요소에 대한 정보가 포함됩니다.
|
||||
또한 SBOM에는 이러한 구성 요소의 버전, 라이선스 정보, 알려진 취약점 또는 보안 문제에 대한 세부 정보도 포함될 수 있습니다.
|
||||
|
||||
SBOM의 목적은 이러한 구성 요소를 나열하여 소프트웨어 사용자에게 소프트웨어 제품에 포함된 구성 요소에 대한 가시성을 제공하고 보안 또는 법적 이유로 유해할 수 있는 구성 요소를 피할 수 있도록 하는 것입니다.
|
||||
|
||||
[올해](https://www.immuniweb.com/blog/5-biggest-supply-chain-attacks-in-2022-so-far.html) 와 [작년](https://cyolo.io/blog/top-5-supply-chain-attacks-of-2021/) 지난 몇 년간 대규모 공급망 공격이 발생한 후 SBOM의 사용이 더욱 보편화되었습니다.
|
||||
|
||||
|
||||
컨테이너 이미지의 컨텍스트에서, 컨테이너 이미지에 대한 SBOM에는 다음이 포함됩니다:
|
||||
|
||||
- 컨테이너에 설치된 리눅스 패키지 및 라이브러리
|
||||
- 컨테이너에서 실행 중인 애플리케이션을 위해 설치된 언어별 패키지(예: Python 패키지, Go 패키지 등)
|
||||
|
||||
컨테이너 이미지에서 SBOM을 추출하는 데 도움이 되는 도구가 있습니다.
|
||||
|
||||
그러한 도구 중 하나는 [syft](https://github.com/anchore/syft)입니다.
|
||||
|
||||
예를 들어, syft를 사용하여 `ubuntu:latest` 컨테이너 이미지에 대한 SBOM을 생성할 수 있습니다:
|
||||
|
||||
```console
|
||||
$ syft ubuntu
|
||||
✔ Parsed image
|
||||
✔ Cataloged packages [101 packages]
|
||||
NAME VERSION TYPE
|
||||
adduser 3.118ubuntu5 deb
|
||||
apt 2.4.8 deb
|
||||
base-files 12ubuntu4.2 deb
|
||||
base-passwd 3.5.52build1 deb
|
||||
bash 5.1-6ubuntu1 deb
|
||||
bsdutils 1:2.37.2-4ubuntu3 deb
|
||||
coreutils 8.32-4.1ubuntu1 deb
|
||||
dash 0.5.11+git20210903+057cd650a4ed-3build1 deb
|
||||
debconf 1.5.79ubuntu1 deb
|
||||
debianutils 5.5-1ubuntu2 deb
|
||||
diffutils 1:3.8-0ubuntu2 deb
|
||||
dpkg 1.21.1ubuntu2.1 deb
|
||||
e2fsprogs 1.46.5-2ubuntu1.1 deb
|
||||
findutils 4.8.0-1ubuntu3 deb
|
||||
gcc-12-base 12.1.0-2ubuntu1~22.04 deb
|
||||
gpgv 2.2.27-3ubuntu2.1 deb
|
||||
grep 3.7-1build1 deb
|
||||
gzip 1.10-4ubuntu4.1 deb
|
||||
hostname 3.23ubuntu2 deb
|
||||
init-system-helpers 1.62 deb
|
||||
libacl1 2.3.1-1 deb
|
||||
libapt-pkg6.0 2.4.8 deb
|
||||
libattr1 1:2.5.1-1build1 deb
|
||||
libaudit-common 1:3.0.7-1build1 deb
|
||||
libaudit1 1:3.0.7-1build1 deb
|
||||
libblkid1 2.37.2-4ubuntu3 deb
|
||||
libbz2-1.0 1.0.8-5build1 deb
|
||||
libc-bin 2.35-0ubuntu3.1 deb
|
||||
libc6 2.35-0ubuntu3.1 deb
|
||||
libcap-ng0 0.7.9-2.2build3 deb
|
||||
libcap2 1:2.44-1build3 deb
|
||||
libcom-err2 1.46.5-2ubuntu1.1 deb
|
||||
libcrypt1 1:4.4.27-1 deb
|
||||
libdb5.3 5.3.28+dfsg1-0.8ubuntu3 deb
|
||||
libdebconfclient0 0.261ubuntu1 deb
|
||||
libext2fs2 1.46.5-2ubuntu1.1 deb
|
||||
libffi8 3.4.2-4 deb
|
||||
libgcc-s1 12.1.0-2ubuntu1~22.04 deb
|
||||
libgcrypt20 1.9.4-3ubuntu3 deb
|
||||
libgmp10 2:6.2.1+dfsg-3ubuntu1 deb
|
||||
libgnutls30 3.7.3-4ubuntu1.1 deb
|
||||
libgpg-error0 1.43-3 deb
|
||||
libgssapi-krb5-2 1.19.2-2 deb
|
||||
libhogweed6 3.7.3-1build2 deb
|
||||
libidn2-0 2.3.2-2build1 deb
|
||||
libk5crypto3 1.19.2-2 deb
|
||||
libkeyutils1 1.6.1-2ubuntu3 deb
|
||||
libkrb5-3 1.19.2-2 deb
|
||||
libkrb5support0 1.19.2-2 deb
|
||||
liblz4-1 1.9.3-2build2 deb
|
||||
liblzma5 5.2.5-2ubuntu1 deb
|
||||
libmount1 2.37.2-4ubuntu3 deb
|
||||
libncurses6 6.3-2 deb
|
||||
libncursesw6 6.3-2 deb
|
||||
libnettle8 3.7.3-1build2 deb
|
||||
libnsl2 1.3.0-2build2 deb
|
||||
libp11-kit0 0.24.0-6build1 deb
|
||||
libpam-modules 1.4.0-11ubuntu2 deb
|
||||
libpam-modules-bin 1.4.0-11ubuntu2 deb
|
||||
libpam-runtime 1.4.0-11ubuntu2 deb
|
||||
libpam0g 1.4.0-11ubuntu2 deb
|
||||
libpcre2-8-0 10.39-3ubuntu0.1 deb
|
||||
libpcre3 2:8.39-13ubuntu0.22.04.1 deb
|
||||
libprocps8 2:3.3.17-6ubuntu2 deb
|
||||
libseccomp2 2.5.3-2ubuntu2 deb
|
||||
libselinux1 3.3-1build2 deb
|
||||
libsemanage-common 3.3-1build2 deb
|
||||
libsemanage2 3.3-1build2 deb
|
||||
libsepol2 3.3-1build1 deb
|
||||
libsmartcols1 2.37.2-4ubuntu3 deb
|
||||
libss2 1.46.5-2ubuntu1.1 deb
|
||||
libssl3 3.0.2-0ubuntu1.7 deb
|
||||
libstdc++6 12.1.0-2ubuntu1~22.04 deb
|
||||
libsystemd0 249.11-0ubuntu3.6 deb
|
||||
libtasn1-6 4.18.0-4build1 deb
|
||||
libtinfo6 6.3-2 deb
|
||||
libtirpc-common 1.3.2-2ubuntu0.1 deb
|
||||
libtirpc3 1.3.2-2ubuntu0.1 deb
|
||||
libudev1 249.11-0ubuntu3.6 deb
|
||||
libunistring2 1.0-1 deb
|
||||
libuuid1 2.37.2-4ubuntu3 deb
|
||||
libxxhash0 0.8.1-1 deb
|
||||
libzstd1 1.4.8+dfsg-3build1 deb
|
||||
login 1:4.8.1-2ubuntu2 deb
|
||||
logsave 1.46.5-2ubuntu1.1 deb
|
||||
lsb-base 11.1.0ubuntu4 deb
|
||||
mawk 1.3.4.20200120-3 deb
|
||||
mount 2.37.2-4ubuntu3 deb
|
||||
ncurses-base 6.3-2 deb
|
||||
ncurses-bin 6.3-2 deb
|
||||
passwd 1:4.8.1-2ubuntu2 deb
|
||||
perl-base 5.34.0-3ubuntu1.1 deb
|
||||
procps 2:3.3.17-6ubuntu2 deb
|
||||
sed 4.8-1ubuntu2 deb
|
||||
sensible-utils 0.0.17 deb
|
||||
sysvinit-utils 3.01-1ubuntu1 deb
|
||||
tar 1.34+dfsg-1build3 deb
|
||||
ubuntu-keyring 2021.03.26 deb
|
||||
usrmerge 25ubuntu2 deb
|
||||
util-linux 2.37.2-4ubuntu3 deb
|
||||
zlib1g 1:1.2.11.dfsg-2ubuntu9.2 deb
|
||||
```
|
||||
|
||||
SBOM에는 컨테이너 이미지 내부에 설치된 패키지와 라이브러리가 포함되어 있을 뿐만 아니라,
|
||||
유형과 버전도 나열되어 있습니다.
|
||||
이제 이 목록을 취약점 데이터베이스와 상호 참조하여 컨테이너 내부에 취약점이 있는지 확인할 수 있습니다.
|
||||
|
||||
그렇다면 **취약점 데이터베이스(Vulnerability Database)**란 무엇인가요?
|
||||
|
||||
## 취약점 데이터베이스
|
||||
|
||||
취약점 데이터베이스는 소프트웨어, 하드웨어 및 기타 시스템의 알려진 취약점에 대한 정보 모음입니다.
|
||||
일반적으로 취약점의 유형, 취약점의 심각도, 취약점의 잠재적 영향과 같은 취약점의 특성에 대한 세부 정보가 포함됩니다.
|
||||
취약점 데이터베이스에는 취약점이 악용될 수 있는 방법과 해당 취약점에 대해 사용 가능한 패치 또는 수정 사항에 대한 정보도 포함될 수 있습니다.
|
||||
|
||||
일부 취약점 데이터베이스는 [vuldb.com](https://vuldb.com/), [NIST](https://nvd.nist.gov/vuln), [cvedetails.com](https://www.cvedetails.com/) 및 [Snyk 취약점 데이터베이스](https://security.snyk.io/) 등이 있습니다.
|
||||
|
||||
이들 기관은 사용자가 다운로드할 수 있는 API 또는 원시 데이터를 제공하며, SBOM의 패키지와 취약점 정보를 상호 참조할 수 있습니다.
|
||||
이렇게 하면 패키지에 주의해야 할 취약점이 있는지 확인할 수 있습니다.
|
||||
|
||||
일반적으로 이 취약점이 도입된 라이브러리 버전과 최신 버전에서 취약점이 수정되었는지 여부에 대한 정보도 찾을 수 있습니다.
|
||||
이 정보를 사용하여 취약점을 완화하기 위해 종속성을 업데이트/다운그레이드할지 여부를 결정할 수 있습니다.
|
||||
[14일차](./day14.md)에서 이미 설명했듯이, 종속성 업데이트에는 동작 또는 API 변경이 수반되는 경우가 있기 때문에 종속성을 업데이트하는 것이 항상 간단한 것은 아닙니다.
|
||||
|
||||
취약점에 대한 또 다른 중요한 정보는 취약점의 **CVSS 점수**입니다.
|
||||
|
||||
## CVSS
|
||||
|
||||
**CVSS**는 **C**ommon **V**ulnerability **S**coring **S**ystem의 약자입니다.
|
||||
|
||||
이 시스템은 취약점의 주요 특성을 파악하고 그 심각성을 반영하는 수치 점수를 생성하는 방법을 제공합니다.
|
||||
그런 다음 이 수치 점수를 정성적 표현(낮음, 중간, 높음, 심각 등)으로 변환하여 조직이 취약점 관리 프로세스를 적절히 평가하고 우선순위를 정할 수 있도록 도와줍니다.
|
||||
|
||||
기본적으로 하나의 취약점이 다른 취약점보다 더 심각할 수 있습니다.
|
||||
익스플로잇이 얼마나 쉬운지, 얼마나 큰 피해를 입힐 수 있는지에 따라 취약점의 순위를 객관적으로 매길 수 있는 시스템이 필요합니다.
|
||||
|
||||
이것이 바로 CVSS가 필요한 이유입니다.
|
||||
|
||||
CVSS v3는 CVSS 점수를 계산하는 8가지 기준을 정의합니다.
|
||||
이러한 기준은 다음과 같습니다:
|
||||
|
||||
### 공격 벡터 Attack Vector
|
||||
|
||||
취약점 악용이 가능한 컨텍스트를 반영합니다.
|
||||
|
||||
가능한 값 : **Network(N)**, **Adjacent(A)**, **Local(L)**, **Physical(P)**
|
||||
|
||||
### 공격 복잡성 Attack Complexity
|
||||
|
||||
취약점을 익스플로잇하기 위해 공격자가 통제할 수 없는 조건에 대해 설명합니다.
|
||||
|
||||
가능한 값 : **Low(L)**, **High(H)**
|
||||
|
||||
### 필요한 권한 Priviledges Required
|
||||
|
||||
공격자가 취약점을 성공적으로 익스플로잇하기 전에 보유해야 하는 권한 수준을 설명합니다.
|
||||
|
||||
가능한 값 : **None(N)**, **Low(L)**, **High(H)**
|
||||
|
||||
### 사용자 상호작용 User Interaction
|
||||
|
||||
공격자 이외의 사용자가 취약한 구성 요소의 성공적인 침해에 참여하기 위한 요구 사항입니다.
|
||||
|
||||
가능한 값 : **None(N)**, **Required(R)**
|
||||
|
||||
#### 범위 Scope
|
||||
|
||||
한 소프트웨어 구성 요소의 취약점이 리소스 또는 권한에 영향을 미칠 수 있는 능력입니다.
|
||||
|
||||
가능한 값 : **Unchanged(U)**, **Changed(C)**
|
||||
|
||||
### 기밀성 Confidentiality
|
||||
|
||||
성공적으로 익스플로잇된 취약점으로 인해 소프트웨어 구성 요소가 관리하는 정보 리소스의 기밀성에 미치는 영향입니다.
|
||||
|
||||
가능한 값 : **None(N)**, **Low(L)**, **High(H)**
|
||||
|
||||
### 무결성 Integrity
|
||||
|
||||
성공적으로 익스플로잇된 취약점이 무결성에 미치는 영향입니다.
|
||||
|
||||
가능한 값 : **None(N)**, **Low(L)**, **High(H)**
|
||||
|
||||
### 가용성 Availability
|
||||
|
||||
성공적으로 익스플로잇된 취약점으로 인해 영향을 받은 구성 요소의 가용성에 미치는 영향입니다.
|
||||
|
||||
가능한 값 : **None(N)**, **Low(L)**, **High(H)**
|
||||
|
||||
이 8가지 벡터의 조합에 따라 CVSS 점수가 결정됩니다.
|
||||
0에서 10 사이입니다.
|
||||
0이 가장 낮고 10이 가장 높습니다.(가장 위험)
|
||||
[이 곳](https://www.first.org/cvss/calculator/3.0)에서 각 취약점의 점수를 계산할 수 있는 CVSS 계산기를 찾을 수 있습니다.
|
||||
|
||||
## 리소스
|
||||
|
||||
<https://www.nist.gov/itl/executive-order-improving-nations-cybersecurity>
|
||||
|
||||
<https://www.aquasec.com/cloud-native-academy/supply-chain-security/sbom/>
|
||||
|
||||
|
||||
[16일차](day16.md)에서는 "Fuzzing" 또는 Fuzz Test에 대해 살펴보겠습니다.
|
94
2023/ko/days/day16.md
Normal file
@ -0,0 +1,94 @@
|
||||
# 퍼징 Fuzzing
|
||||
|
||||
'퍼즈 테스트'라고도 하는 퍼징은 컴퓨터 프로그램에 유효하지 않거나 예상치 못한 임의의 데이터를 입력으로 제공하는 소프트웨어 테스트 기법입니다.
|
||||
퍼징의 목표는 프로그램이 충돌하거나 의도하지 않은 동작을 나타내어 프로그램의 보안 취약점 및 기타 버그를 식별하는 것입니다.
|
||||
|
||||
퍼징은 수동으로 수행하거나 테스트 라이브러리/프레임워크를 사용하여 입력을 만들어서 수행할 수 있습니다.
|
||||
|
||||
퍼징을 더 잘 이해하기 위해 다음 코드를 예로 들어보겠습니다:
|
||||
|
||||
```go
|
||||
func DontPanic(s string) {
|
||||
if len(s) == 4 {
|
||||
if s[0] == 'f' {
|
||||
if s[1] == 'u' {
|
||||
if s[2] == 'z' {
|
||||
if s[3] == 'z' {
|
||||
panic("error: wrong input")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
이것은 '문자열'을 유일한 인수로 받아들이는 Go 함수입니다.
|
||||
|
||||
함수를 살펴보면, 제공된 입력이 '퍼즈'라는 단어인 경우 한 가지 조건에서만 함수가 'panic'(예: crash)을 일으키는 것처럼 보입니다.
|
||||
|
||||
물론 이 함수는 매우 간단하며 보기만 해도 그 동작을 알 수 있습니다.
|
||||
그러나 더 복잡한 시스템에서는 이러한 실패 지점이 명확하지 않을 수 있으며, 이를 테스트하거나 단위 테스트 케이스를 작성하는 사람이 놓칠 수 있습니다.
|
||||
|
||||
이때 퍼징이 유용합니다.
|
||||
|
||||
Go 퍼징 라이브러리(Go 1.18부터 표준 언어 라이브러리의 일부)는 테스트 케이스에 대한 많은 입력을 생성한 다음 커버리지와 결과에 따라 어떤 입력이 "흥미로운지"를 결정합니다.이 함수에 대한 퍼즈 테스트를 작성하면 다음과 같은 일이 발생합니다:
|
||||
|
||||
1. 퍼징 라이브러리가 작은 문자열부터 시작하여 크기가 커지는 무작위 문자열을 제공하기 시작합니다.
|
||||
2. 라이브러리가 길이 4의 문자열을 제공하면 테스트 범위의 변경을 감지하고(`if (len(s) == 4)`가 이제 `true`가 됨) 이 길이의 입력을 계속 생성합니다.
|
||||
3. 라이브러리가 `f`로 시작하는 길이 4의 문자열을 제공하면 테스트 커버리지의 또 다른 변경 사항(`if s[0] == "f"`는 이제 `true`)을 감지하고 `f`로 시작하는 입력을 계속 생성합니다.
|
||||
4. `u`와 이중 `z`에 대해서도 같은 일이 반복됩니다.
|
||||
5. `fuzz`를 입력으로 제공하면 함수가 패닉 상태에 빠지고 테스트가 실패합니다.
|
||||
6. __퍼즈__에 성공했습니다!
|
||||
|
||||
퍼징의 또 다른 좋은 방법은 코드 충돌을 일으킨 입력을 저장하고 매번 실행하여 퍼징을 통해 발견한 원래 오류가 다시는 코드에 도입되지 않도록 하는 것입니다.
|
||||
|
||||
이 역시 퍼징 프레임워크의 특징일 수 있습니다.
|
||||
|
||||
대부분의 퍼징 라이브러리에서는 테스트하려는 특정 값을 추가할 수 있습니다.
|
||||
이렇게 하면 우리가 이미 알고 있는 "흥미로운" 값을 라이브러리에 표시하여 생성된 값을 모델링할 수 있으므로 라이브러리에도 도움이 됩니다.
|
||||
|
||||
## 퍼징만으로는 충분하지 않은 경우
|
||||
|
||||
퍼징은 유용한 기술이지만 도움이 되지 않는 상황도 있습니다.
|
||||
|
||||
예를 들어, 코드에 실패하는 입력이 너무 구체적이어서 도움이 되는 단서가 없는 경우 퍼징 라이브러리가 이를 추측하지 못할 수 있습니다.
|
||||
|
||||
이전 단락의 예제 코드를 다음과 같이 변경해 보겠습니다.
|
||||
|
||||
```go
|
||||
func DontPanic(s input) {
|
||||
if (len(s) == 4) && s[0] == 'f' && s[1] == 'u' && s[2] == 'z' && s[3] == 'z' {
|
||||
panic("error")
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
또는
|
||||
|
||||
```go
|
||||
func DontPanic(s input) {
|
||||
if s == "fuzz" {
|
||||
panic("error")
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
이런 경우 퍼징은 아무런 단서 없이 정확한 문자열 `퍼즈`를 생성할 가능성이 적기 때문에 도움이 되지 않습니다.
|
||||
그리고 이전 사례에서 코드 커버리지 변경을 트리거했던 입력(크기 4의 문자열, `z`로 시작하는 크기 4의 문자열 등)은 이제 코드 커버리지를 트리거하지 않습니다. (이전 예제에서는 `if` 체크가 5개인데 비해 지금은 하나만 있기 때문입니다)
|
||||
|
||||
따라서 퍼징은 코드의 이상 징후와 코너 케이스를 감지하는 좋은 방법이지만 100% 올바른 코드를 위한 만병통치약은 아니라는 점을 이해하는 것이 중요합니다.
|
||||
|
||||
## 실제 예제
|
||||
|
||||
Go에서 퍼징을 직접 해보고 싶으시다면 [해당 주제에 대한 예제가 있는 내 리포지토리](https://github.com/asankov/go-fuzzing-101/tree/v1)를 확인하세요.
|
||||
|
||||
여기에는 이 글에서 사용한 예제와 실패를 트리거하는 퍼즈 테스트, 그리고 테스트를 직접 실행하는 방법에 대한 지침이 포함되어 있습니다.
|
||||
|
||||
## 리소스
|
||||
|
||||
- <https://en.wikipedia.org/wiki/Fuzzing>
|
||||
- [Fuzzing in Go by Valentin Deleplace, Devoxx Belgium 2022](https://www.youtube.com/watch?v=Zlf3s4EjnFU)
|
||||
- [Write applications faster and securely with Go by Cody Oss, Go Day 2022](https://www.youtube.com/watch?v=aw7lFSFGKZs)
|
||||
|
||||
[17일차](day17.md)에 뵙겠습니다.
|
247
2023/ko/days/day17.md
Normal file
@ -0,0 +1,247 @@
|
||||
# 퍼징(Fuzzing) 고급
|
||||
|
||||
어제 우리는 퍼징이 무엇인지, 그리고 퍼즈 테스트(퍼지 입력을 사용하는 단위 테스트)를 작성하는 방법을 배웠습니다.
|
||||
하지만 퍼즈 테스트는 단순한 단위 테스트 그 이상입니다.
|
||||
이 방법론을 사용하여 서버로 전송되는 요청을 퍼징하여 웹 애플리케이션을 테스트할 수 있습니다.
|
||||
|
||||
오늘은 웹 서버 퍼지 테스트에 대한 실용적인 접근 방식을 살펴보겠습니다.
|
||||
|
||||
이를 위해 다양한 도구가 도움이 될 수 있습니다.
|
||||
|
||||
[Burp Intruder](https://portswigger.net/burp/documentation/desktop/tools/intruder), [SmartBear](https://smartbear.com/) 등이 있습니다.
|
||||
하지만 유료 라이선스가 필요한 독점 도구(proprietary tools)도 있습니다.
|
||||
|
||||
|
||||
그렇기 때문에 오늘 데모에서는 `Burp Intruder`에서 영감을 받아 유사한 기능을 제공하는 Go로 작성된 간단한 오픈 소스 CLI를 사용하려고 합니다.
|
||||
이름은 [httpfuzz](https://github.com/JonCooperWorks/httpfuzz)입니다.
|
||||
|
||||
|
||||
## Getting started
|
||||
|
||||
이 도구는 아주 간단합니다.
|
||||
요청에 대한 템플릿(퍼지 데이터에 대한 placeholder를 정의), 단어 목록(퍼지 데이터)을 제공하면 `httpfuzz`가 요청을 렌더링하여 서버로 전송합니다.
|
||||
|
||||
먼저 요청에 대한 템플릿을 정의해야 합니다.
|
||||
다음 내용으로 `request.txt`라는 파일을 생성합니다.
|
||||
|
||||
```text
|
||||
POST / HTTP/1.1
|
||||
Content-Type: application/json
|
||||
User-Agent: PostmanRuntime/7.26.3
|
||||
Accept: */*
|
||||
Cache-Control: no-cache
|
||||
Host: localhost:8000
|
||||
Accept-Encoding: gzip, deflate
|
||||
Connection: close
|
||||
Content-Length: 35
|
||||
|
||||
{
|
||||
"name": "`S9`",
|
||||
}
|
||||
```
|
||||
|
||||
이것은 JSON 본문이 있는 `/` 경로에 대한 유효한 HTTP `POST` 요청입니다.
|
||||
본문의 "\`" 기호는 우리가 제공하는 데이터로 대체될 플레이스홀더를 정의합니다.
|
||||
|
||||
`httpfuzz`는 헤더, 경로, URL 매개변수를 퍼즈 처리할 수도 있습니다.
|
||||
|
||||
다음으로 요청에 넣을 입력의 단어 목록을 제공해야 합니다.
|
||||
다음 내용으로 `data.txt`라는 파일을 생성합니다:
|
||||
|
||||
```text
|
||||
SOME_NAME
|
||||
Mozilla/5.0 (Linux; Android 7.0; SM-G930VC Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36
|
||||
```
|
||||
|
||||
이 파일에서는 본문 내부에 대체될 두 개의 입력을 정의했습니다.
|
||||
실제 시나리오에서는 적절한 퍼즈 테스트를 위해 훨씬 더 많은 데이터를 여기에 넣어야 합니다.
|
||||
|
||||
이제 템플릿과 입력이 준비되었으니 도구를 실행해 보겠습니다.
|
||||
안타깝게도 이 도구는 바이너리로 배포되지 않으므로 소스에서 빌드해야 합니다.
|
||||
리포지토리를 복제하고 실행합니다.
|
||||
|
||||
```shell
|
||||
go build -o httpfuzz cmd/httpfuzz.go
|
||||
```
|
||||
(컴퓨터에 최신 버전의 Go가 설치되어 있어야 합니다.)
|
||||
|
||||
이제 바이너리를 얻었으니 실행해 보겠습니다.
|
||||
|
||||
```shell
|
||||
./httpfuzz \
|
||||
--wordlist data.txt \
|
||||
--seed-request request.txt \
|
||||
--target-header User-Agent \
|
||||
--target-param fuzz \
|
||||
--delay-ms 50 \
|
||||
--skip-cert-verify \
|
||||
--proxy-url http://localhost:8080 \
|
||||
```
|
||||
|
||||
- `httpfuzz`는 우리가 호출하는 바이너리입니다.
|
||||
- `--wordlist data.txt`는 우리가 제공한 입력이 포함된 파일입니다.
|
||||
- `--seed-request requests.txt`는 요청 템플릿입니다.
|
||||
- `--target-header User-Agent`는 `httpfuzz`가 `User-Agent` 헤더 대신에 제공된 입력을 사용하도록 지시합니다.
|
||||
- `--target-param fuzz`는 제공된 입력을 `fuzz` URL 매개변수의 값으로 사용하도록 `httpfuzz`에 지시합니다.
|
||||
- `--delay-ms 50`은 요청 사이에 50ms를 기다리도록 `httpfuzz`에 지시합니다.
|
||||
- `--skip-cert-verify`는 `httpfuzz`에게 TLS 확인을 수행하지 않도록 지시합니다.
|
||||
- `--proxy-url http://localhost:8080`는 `httpfuzz`에게 HTTP 서버의 위치를 알려줍니다.
|
||||
|
||||
2개의 입력과 3개의 위치(본문, `User-Agent` 헤더, `fuzz` 매개변수)에 배치할 수 있습니다.
|
||||
즉, `httpfuzz`는 6개의 요청을 생성하여 서버로 전송합니다.
|
||||
|
||||
실행해서 어떤 일이 일어나는지 봅시다.
|
||||
서버로 들어오는 요청을 확인할 수 있도록 모든 요청을 기록하는 간단한 웹 서버를 작성했습니다.
|
||||
|
||||
```shell
|
||||
$ ./httpfuzz \
|
||||
--wordlist data.txt \
|
||||
--seed-request request.txt \
|
||||
--target-header User-Agent \
|
||||
--target-param fuzz \
|
||||
--delay-ms 50 \
|
||||
--skip-cert-verify \
|
||||
--proxy-url http://localhost:8080 \
|
||||
|
||||
httpfuzz: httpfuzz.go:164: Sending 6 requests
|
||||
```
|
||||
|
||||
그리고 서버 로그입니다.
|
||||
|
||||
```text
|
||||
-----
|
||||
Got request to http://localhost:8000/
|
||||
User-Agent header = [SOME_NAME]
|
||||
Name = S9
|
||||
-----
|
||||
Got request to http://localhost:8000/?fuzz=SOME_NAME
|
||||
User-Agent header = [PostmanRuntime/7.26.3]
|
||||
Name = S9
|
||||
-----
|
||||
Got request to http://localhost:8000/
|
||||
User-Agent header = [PostmanRuntime/7.26.3]
|
||||
Name = SOME_NAME
|
||||
-----
|
||||
Got request to http://localhost:8000/
|
||||
User-Agent header = [Mozilla/5.0 (Linux; Android 7.0; SM-G930VC Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36]
|
||||
Name = S9
|
||||
-----
|
||||
Got request to http://localhost:8000/?fuzz=Mozilla%2F5.0+%28Linux%3B+Android+7.0%3B+SM-G930VC+Build%2FNRD90M%3B+wv%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Version%2F4.083+Mobile+Safari%2F537.36
|
||||
User-Agent header = [PostmanRuntime/7.26.3]
|
||||
Name = S9
|
||||
-----
|
||||
Got request to http://localhost:8000/
|
||||
User-Agent header = [PostmanRuntime/7.26.3]
|
||||
Name = Mozilla/5.0 (Linux; Android 7.0; SM-G930VC Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36
|
||||
```
|
||||
|
||||
6개의 HTTP 요청이 수신된 것을 확인할 수 있습니다.
|
||||
|
||||
이 중 2개는 `User-Agent` 헤더에 대한 값 파일의 값을 가지고 있고, 4개는 템플릿의 기본 헤더를 가지고 있습니다.
|
||||
|
||||
그 중 2개는 `fuzz` 쿼리 매개변수에 대한 값 파일의 값을 가지고 있고, 4개는 템플릿의 기본 헤더를 가지고 있습니다.
|
||||
|
||||
그 중 2개는 `Name` 본문 속성에 대한 값 파일에서 값을 가져오고, 4개는 템플릿의 기본 헤더를 사용합니다.
|
||||
|
||||
이 도구를 약간 개선하면 이러한 요청의 순열을 다르게 만들 수 있습니다(예: 값 파일의 값으로 `?fuzz=`와 `User-Agent`가 모두 있는 요청).
|
||||
|
||||
`httpfuzz`가 요청의 결과에 대한 정보를 제공하지 않는다는 점에 주목하세요.
|
||||
이를 파악하려면 서버에 대한 일종의 모니터링을 설정하거나 우리에게 의미 있는 방식으로 결과를 처리하는 `httpfuzz` 플러그인을 작성해야 합니다.
|
||||
그렇게 해봅시다.
|
||||
|
||||
사용자 정의 플러그인을 작성하려면 [`Listener`](https://github.com/JonCooperWorks/httpfuzz/blob/master/plugin.go#L13) 인터페이스를 구현해야합니다.
|
||||
|
||||
```go
|
||||
// Listener must be implemented by a plugin to users to hook the request - response transaction.
|
||||
// The Listen method will be run in its own goroutine, so plugins cannot block the rest of the program, however panics can take down the entire process.
|
||||
type Listener interface {
|
||||
Listen(results <-chan *Result)
|
||||
}
|
||||
```
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
|
||||
"github.com/joncooperworks/httpfuzz"
|
||||
)
|
||||
|
||||
type logResponseCodePlugin struct {
|
||||
logger *log.Logger
|
||||
}
|
||||
|
||||
func (b *logResponseCodePlugin) Listen(results <-chan *httpfuzz.Result) {
|
||||
for result := range results {
|
||||
b.logger.Printf("Got %d response from the server\n", result.Response.StatusCode)
|
||||
}
|
||||
}
|
||||
|
||||
// New returns a logResponseCodePlugin plugin that simple logs the response code of the response.
|
||||
func New(logger *log.Logger) (httpfuzz.Listener, error) {
|
||||
return &logResponseCodePlugin{logger: logger}, nil
|
||||
}
|
||||
```
|
||||
|
||||
이제 플러그인을 빌드해야 합니다.
|
||||
|
||||
```shell
|
||||
go build -buildmode=plugin -o log exampleplugins/log/log.go
|
||||
```
|
||||
|
||||
그리고 `--post-request` 플래그를 통해 `httpfuzz`에 연결할 수 있습니다:
|
||||
|
||||
```shell
|
||||
$ ./httpfuzz \
|
||||
--wordlist data.txt \
|
||||
--seed-request request.txt \
|
||||
--target-header User-Agent \
|
||||
--target-param fuzz \
|
||||
--delay-ms 50 \
|
||||
--skip-cert-verify \
|
||||
--proxy-url http://localhost:8080 \
|
||||
--post-request log
|
||||
|
||||
httpfuzz: httpfuzz.go:164: Sending 6 requests
|
||||
httpfuzz: log.go:15: Got 200 response from the server
|
||||
httpfuzz: log.go:15: Got 200 response from the server
|
||||
httpfuzz: log.go:15: Got 200 response from the server
|
||||
httpfuzz: log.go:15: Got 200 response from the server
|
||||
httpfuzz: log.go:15: Got 200 response from the server
|
||||
httpfuzz: log.go:15: Got 200 response from the server
|
||||
```
|
||||
|
||||
짜잔!
|
||||
이제 최소한 서버의 응답 코드가 무엇인지 확인할 수 있습니다.
|
||||
|
||||
물론 훨씬 더 많은 데이터를 출력하는 훨씬 더 정교한 플러그인을 작성할 수도 있지만, 이 연습의 목적상 이 정도면 충분합니다.
|
||||
|
||||
|
||||
## 요약
|
||||
|
||||
퍼징은 단위 테스트를 훨씬 뛰어넘는 매우 강력한 테스트 기법입니다.
|
||||
|
||||
퍼징은 유효한 HTTP 요청의 일부를 서버의 취약점이나 결함을 노출할 수 있는 데이터로 대체하여 HTTP 서버를 테스트하는 데 매우 유용할 수 있습니다.
|
||||
|
||||
웹 애플리케이션 퍼지 테스트에 도움이 되는 무료 및 유료 도구가 많이 있습니다.
|
||||
|
||||
## 리소스
|
||||
|
||||
[OWASP: Fuzzing](https://owasp.org/www-community/Fuzzing)
|
||||
|
||||
[OWASP: Fuzz Vectors](https://owasp.org/www-project-web-security-testing-guide/v41/6-Appendix/C-Fuzz_Vectors)
|
||||
|
||||
[Hacking HTTP with HTTPfuzz](https://medium.com/swlh/hacking-http-with-httpfuzz-67cfd061b616)
|
||||
|
||||
[Fuzzing the Stack for Fun and Profit at DefCamp 2019](https://www.youtube.com/watch?v=qCMfrbpuCBk&list=PLnwq8gv9MEKiUOgrM7wble1YRsrqRzHKq&index=33)
|
||||
|
||||
[HTTP Fuzzing Scan with SmartBear](https://support.smartbear.com/readyapi/docs/security/scans/types/fuzzing-http.html)
|
||||
|
||||
[Fuzzing Session: Finding Bugs and Vulnerabilities Automatically](https://youtu.be/DSJePjhBN5E)
|
||||
|
||||
[Fuzzing the CNCF Landscape](https://youtu.be/zIyIZxAZLzo)
|
||||
|
||||
[18일차](day18.md)에 뵙겠습니다.
|
40
2023/ko/days/day18.md
Normal file
@ -0,0 +1,40 @@
|
||||
# DAST (동적 애플리케이션 보안 테스트)
|
||||
DAST(Dynamic Application Security Testing)는 외부 소스로부터의 공격을 시뮬레이션하여 애플리케이션의 보안을 평가하는 데 사용되는 기술입니다.
|
||||
아이디어는 가능한 한 많은 블랙박스 침투 테스트를 자동화하는 것입니다.
|
||||
실제 사람의 시간을 절약하고 다른 보안 도구(예: IAST)로의 트래픽을 생성하는 데 추가로 사용할 수 있습니다.
|
||||
|
||||
그럼에도 불구하고 조직이 애플리케이션을 프로덕션 환경에 배포하기 전에 개발 프로세스 초기에 잠재적인 취약점을 발견할 수 있도록 도와주기 때문에 SSDLC의 필수 구성 요소입니다. DAST 테스트를 수행함으로써 조직은 보안 사고를 예방하고 공격자에 의해 데이터와 자산이 손상되지 않도록 보호할 수 있습니다.
|
||||
|
||||
## 도구
|
||||
|
||||
DAST를 수행하는 데 사용할 수 있는 다양한 오픈 소스 도구가 있습니다. ZAP, Burp Suite, Arachni 등이 있습니다.
|
||||
|
||||
이러한 도구는 SQL 인젝션, 크로스 사이트 스크립팅 및 기타 일반적인 취약점 등 애플리케이션에 대한 다양한 유형의 공격을 시뮬레이션할 수 있습니다.
|
||||
|
||||
예를 들어 애플리케이션이 SQL 인젝션에 취약한 경우, DAST 툴은 애플리케이션에 `OR 1=1 --`과 같은 악성 SQL 쿼리를 전송하고 응답을 평가하여 취약한지 여부를 확인할 수 있습니다. 애플리케이션이 취약한 경우 데이터베이스의 모든 레코드를 반환하여 SQL 인젝션 공격이 성공했음을 나타낼 수 있습니다.
|
||||
|
||||
일부 테스트는 상당히 침략적일 수 있으며(예: 'DROP TABLE' 또는 이와 유사한 것을 포함할 수 있음), 적어도 데이터베이스에 많은 양의 테스트 데이터를 넣거나 심지어 앱에 DOS를 가할 수도 있습니다.
|
||||
|
||||
> __DAST 도구는 프로덕션 환경에서 절대 실행해서는 안 됩니다!!!__
|
||||
|
||||
모든 도구에는 애플리케이션에 대한 인증 가능성이 있으며 이로 인해 프로덕션 자격 증명이 손상될 수 있습니다. 또한 테스트 환경에 대해 인증된 스캔을 실행할 때는 적절한 역할을 사용해야 합니다(물론 RBAC 모델이 존재하는 경우 애플리케이션에 대해). 예를 들어, DAST는 다른 사용자를 삭제하거나 수정할 수 있는 역할을 사용하면 전체 환경을 사용할 수 없게 될 수 있으므로 사용하지 않아야 합니다.
|
||||
다른 테스트 방법론과 마찬가지로 범위를 분석해야 하므로 불필요한 대상을 검사하지 않습니다.
|
||||
|
||||
## 사용법
|
||||
일반적인 오류는 실제 애플리케이션이 아닌 보상 보안 제어 (compensating security control, 예: WAF)를 스캔하는 것입니다.
|
||||
|
||||
DAST는 본질적으로 애플리케이션 보안 테스트 도구이며 보안 완화가 아닌 실제 애플리케이션에 대해 사용해야 합니다. 상당히 표준화된 공격을 사용하기 때문에 외부 제어가 공격 트래픽을 차단할 수 있으며, 이러한 방식으로 잠재적으로 악용될 수 있는 플로우를 커버할 수 있습니다.(정의에 따라 공격자는 결국 이러한 조치를 우회할 수 있음)
|
||||
|
||||
실제 스캔은 매우 느리기 때문에 때때로 DevOps 파이프라인 외부에서 실행해야 합니다. 야간이나 주말에 실행하는 것이 좋은 예입니다. 일부 간단한 도구(zap / arachny 등)를 파이프라인에 사용할 수 있지만 스캔의 특성으로 인해 전체 개발 프로세스의 속도가 느려질 수 있습니다.
|
||||
|
||||
DAST 테스트가 완료되면 결과를 분석하여 발견된 취약점을 식별합니다. 그런 다음 조직은 취약점을 해결하고 애플리케이션의 전반적인 보안을 개선하기 위해 적절한 수정 조치를 취할 수 있습니다. 여기에는 기본 코드 수정, 입력 유효성 검사 및 필터링과 같은 추가 보안 제어 구현 또는 두 가지 모두 포함될 수 있습니다.
|
||||
|
||||
결론적으로, 애플리케이션의 보안을 보장하기 위해서는 SSDLC에서 DAST를 사용하는 것이 필수적입니다. 개발 프로세스 초기에 DAST 테스트를 수행하고 취약점을 식별함으로써 조직은 보안 사고를 예방하고 잠재적인 위협으로부터 자산을 보호할 수 있습니다. ZAP, Burp Suite, Arachni와 같은 오픈 소스 도구를 사용하여 DAST 테스트를 수행하고 조직의 전반적인 보안 태세를 개선할 수 있습니다.
|
||||
DevSecOps 파이프라인의 다른 모든 도구와 마찬가지로 DAST가 유일한 스캐너가 되어서는 안 되며, 다른 모든 도구와 마찬가지로 모의 침투 테스트와 모범 개발 관행을 대체할 수 없습니다.
|
||||
|
||||
## 유용한 링크와 오픈소스 도구가 몇 가지
|
||||
- https://github.com/zaproxy/zaproxy
|
||||
- https://www.arachni-scanner.com/
|
||||
- https://owasp.org/www-project-devsecops-guideline/latest/02b-Dynamic-Application-Security-Testing
|
||||
|
||||
[19일차](day19.md)에 뵙겠습니다.
|
43
2023/ko/days/day19.md
Normal file
@ -0,0 +1,43 @@
|
||||
# IAST (Interactive Application Security Testing)
|
||||
IAST는 웹 애플리케이션의 취약점을 식별하고 개발자가 이를 수정할 수 있도록 설계된 보안 테스트 도구의 일종입니다. 이 도구는 애플리케이션의 런타임 환경에 작은 에이전트를 삽입하고 실시간으로 동작을 모니터링하는 방식으로 작동합니다. 따라서 IAST 도구는 정적 분석이나 모의 공격에 의존하지 않고 취약점이 발생할 때 이를 식별할 수 있습니다.
|
||||
|
||||
IAST는 소프트웨어 계측(software instrumentation) 또는 계측기를 사용하여 애플리케이션이 실행되는 동안 모니터링하고 애플리케이션이 수행하는 작업과 성능에 대한 정보를 수집하는 방식으로 작동합니다. IAST 솔루션은 실행 중인 애플리케이션에 에이전트와 센서를 배포하고 수동 테스트, 자동 테스트 또는 이 둘의 조합으로 시작된 모든 애플리케이션 상호 작용을 지속적으로 분석하여 실시간으로 취약성을 식별함으로써 애플리케이션을 계측합니다.
|
||||
IAST 에이전트는 애플리케이션 내부에서 실행되며 알려진 공격 패턴을 모니터링합니다. 애플리케이션의 일부이므로 서로 다른 구성 요소 간의 트래픽을 모니터링할 수 있습니다. (클래식 MVC 배포 및 마이크로서비스 배포 간)
|
||||
|
||||
## IAST의 전제조건
|
||||
- 애플리케이션을 계측해야 합니다. (Agent를 주입해야 함.)
|
||||
- 수동 또는 자동 테스트를 통해 트래픽을 생성해야 합니다. 또 다른 가능한 접근 방식은 DAST 도구를 사용하는 것입니다. (예를 들어 OWASP ZAP을 사용할 수 있음)
|
||||
|
||||
## 장점
|
||||
|
||||
IAST 도구의 주요 장점 중 하나는 취약점과 취약점 수정 방법에 대한 상세하고 정확한 정보를 제공할 수 있다는 것입니다. 개발자가 수동으로 취약점을 검색하거나 테스트 환경에서 취약점을 재현할 필요가 없으므로 많은 시간과 노력을 절약할 수 있습니다.
|
||||
|
||||
또한 IAST 도구는 사용자 상호 작용이 필요하거나 특정 조건에서 트리거되는 취약점 등 다른 테스트 방법으로는 놓칠 수 있는 취약점을 식별할 수 있습니다.
|
||||
|
||||
테스트 시간은 사용되는 테스트에 따라 다르며(IAST는 독립형 시스템이 아니므로), 더 빠른 테스트(자동화된 테스트)를 CI/CD 파이프라인에 포함할 수 있습니다. 다양한 종류의 취약점을 탐지하는 데 사용할 수 있으며 도구의 특성상('실제 트래픽만' 찾기 때문에) 다른 테스트 유형에 비해 위양성/위음성 결과가 상대적으로 뒤처집니다.
|
||||
IAST는 일반적인 테스트 도구와 실시간 보호(이 경우 RAST라고 함)의 두 가지 방식으로 사용할 수 있습니다. 두 가지 모두 동일한 원칙에 따라 작동하며 함께 사용할 수 있습니다.
|
||||
|
||||
## 몇 가지 단점
|
||||
- 비교적 새로운 기술이기 때문에 보안 팀과 도구 빌더(오픈 소스 또는 상용) 모두에 대한 지식과 경험이 많지 않습니다.
|
||||
- 이 솔루션은 단독으로 사용할 수 없으며 누군가(또는 무언가)가 트래픽 패턴을 생성해야 합니다. 테스트 중에 가능한 모든 엔드포인트를 쿼리하는 것이 중요합니다.
|
||||
- 결과는 트래픽을 기반으로 합니다. 앱/사이트의 일부에 대한 트래픽이 없는 경우 테스트가 이루어지지 않으므로 결과가 생성되지 않습니다.
|
||||
- 앱에 대한 계측이 필요하기 때문에 특히 소스 스캔 도구(SAST 또는 SCA)에 비해 상당히 복잡할 수 있습니다.
|
||||
|
||||
각각 고유한 특징과 기능을 갖춘 여러 가지 IAST 도구를 사용할 수 있습니다.
|
||||
|
||||
## IAST 도구의 일반적인 기능
|
||||
|
||||
- 실시간 모니터링: IAST 도구는 애플리케이션의 동작을 실시간으로 모니터링하여 취약점이 발생할 때 이를 식별할 수 있습니다.
|
||||
- 취약점 식별: IAST 도구는 인젝션 공격, 크로스 사이트 스크립팅(XSS), 크로스 사이트 요청 위조(CSRF)를 포함한 광범위한 취약점을 식별할 수 있습니다.
|
||||
- 수정 지침: IAST 도구는 코드 스니펫 및 보안 코딩 관행에 대한 권장 사항을 포함하여 식별된 취약점을 수정하는 방법에 대한 자세한 정보를 제공하는 경우가 많습니다.
|
||||
- 다른 도구와의 통합: IAST 도구는 정적 코드 분석 또는 침투 테스트 도구와 같은 다른 보안 테스트 도구와 통합하여 애플리케이션의 보안에 대한 보다 포괄적인 보기를 제공할 수 있습니다.
|
||||
|
||||
IAST 도구는 실시간으로 취약점을 식별하고 수정하여 시간과 노력을 절약할 수 있으므로 개발자의 툴킷에 추가할 수 있는 유용한 도구가 될 수 있습니다. 개발자로서 IAST 도구 사용에 관심이 있다면 다양한 옵션을 사용할 수 있으므로 여러 도구를 조사하고 비교하여 자신의 필요에 가장 적합한 도구를 찾는 것이 중요합니다.
|
||||
|
||||
## 도구 예시
|
||||
|
||||
시중에는 오픈 소스 도구가 거의 없습니다. 상용 도구를 예로 들 수 있습니다: Contrast Community Edition(CE) - 앱 1개와 최대 5명의 사용자를 위한 모든 기능을 갖춘 버전(일부 엔터프라이즈 기능은 비활성화됨). Contrast CE는 Java 및 .NET만 지원합니다.
|
||||
|
||||
여기에서 찾을 수 있습니다. https://www.contrastsecurity.com/contrast-community-edition
|
||||
|
||||
[20일차](day20.md)에 뵙겠습니다.
|
155
2023/ko/days/day20.md
Normal file
@ -0,0 +1,155 @@
|
||||
# IAST와 DAST의 결합 - 실습 시간
|
||||
|
||||
IAST와 DAST가 무엇인지 배웠다면 이제 실제 애플리케이션에서 이 프로세스를 사용하여 취약점을 찾아보는 실습을 해보겠습니다.
|
||||
|
||||
**참고: 오픈 소스 IAST 구현이 없으므로 상용 솔루션을 사용해야 합니다.
|
||||
무료 티어가 있으므로 비용을 지불하지 않고도 실습을 따라갈 수 있으니 걱정하지 마세요.
|
||||
|
||||
|
||||
|
||||
여기에는 테스트하고 활용할 취약한 Java 애플리케이션, 손쉬운 설정을 위한 Docker 및 Docker Compose, IAST 솔루션용 [Contrast Community Edition](https://www.contrastsecurity.com/contrast-community-edition?utm_campaign=ContrastCommunityEdition&utm_source=GitHub&utm_medium=WebGoatLab)이 포함되어 있습니다.
|
||||
|
||||
## 전제조건
|
||||
|
||||
- [Docker](https://www.docker.com/products/docker-desktop/)
|
||||
- [Docker Compose](https://docs.docker.com/compose/)
|
||||
- Contrast CE 계정. [이 곳](https://www.contrastsecurity.com/contrast-community-edition?utm_campaign=ContrastCommunityEdition&utm_source=GitHub&utm_medium=WebGoatLab)에서 무료로 회원가입하세요.
|
||||
|
||||
**참고** : 이 글과 90일간의 데브옵스 프로그램의 작성자는 Contrast Security와 어떤 식으로든 관련이 있거나 관련이 있습니다.
|
||||
오픈 소스 솔루션이 없고, 이 솔루션에는 결제나 신용카드 제공이 필요 없는 무료 티어가 있기 때문에 이 상용 솔루션을 사용하고 있습니다.
|
||||
|
||||
1. 오픈 소스 IAST 구현이 없기 때문에 일부 무료 라이선스가 있는 상용 소스를 사용합니다. 이를 위해 2 개의 구성 요소가 필요합니다:
|
||||
IAST 솔루션 - <https://github.com/rstatsinger/contrast-java-webgoat-docker>. Mac 또는 Linux 환경에 설치된 docker 및 docker-compose가 필요합니다(이 실습은 Mint에서 테스트되었습니다). README를 따라 Contrast에서 계정을 생성하세요.
|
||||
|
||||
## Getting started
|
||||
|
||||
|
||||
시작하려면 [리포지토리](https://github.com/rstatsinger/contrast-java-webgoat-docker)를 복제합니다.
|
||||
|
||||
Contrast Security에서 자격 증명을 받습니다.
|
||||
오른쪽 상단의 `Organization Settings` -> `Agent`에서 당신의 이름을 클릭합니다.
|
||||
그리고 `Agent Username`, `Agent Service Key` and `API Key`를 가져옵니다.
|
||||
새로 복제된 리포지토리의 `.env.template` 파일에서 이 값으로 바꿉니다.
|
||||
|
||||
**참고:** 이 값은 비밀입니다.
|
||||
Git에 커밋하지 마세요.
|
||||
실수로 이 값을 커밋하지 않도록 `.env.template`을 `.gitignore` 아래에 두는 것이 가장 좋습니다.
|
||||
|
||||
|
||||
## 취약한 애플리케이션 실행하기
|
||||
|
||||
취약한 애플리케이션을 실행합니다.
|
||||
|
||||
```sh
|
||||
./run.sh
|
||||
```
|
||||
|
||||
또는
|
||||
|
||||
```sh
|
||||
docker compose up
|
||||
```
|
||||
|
||||
준비가 완료되면 <http://localhost:8080/WebGoat>에서 애플리케이션 UI에 액세스할 수 있습니다.
|
||||
|
||||
## 피해 입히기
|
||||
|
||||
이제 취약한 애플리케이션이 생겼으니 이를 익스플로잇해 보겠습니다.
|
||||
|
||||
1. [여기](https://www.zaproxy.org/download/)에서 ZAP 프록시를 설치합니다.
|
||||
|
||||
가장 쉬운 방법은 DAST 스캐너를 이용하는 것입니다.
|
||||
이러한 스캐너 중 하나는 [ZAP Proxy](https://www.zaproxy.org/)입니다.
|
||||
무료 오픈소스 웹 앱 스캐너입니다.
|
||||
|
||||
2. [여기](https://github.com/Grunny/zap-cli)에서 `zap-cli`를 설치합니다.
|
||||
|
||||
다음으로 `zap-cli`를 설치합니다.
|
||||
`zap-cli`는 ZAP Proxy를 위한 오픈소스 CLI입니다.
|
||||
|
||||
3. ZAP 프록시 실행
|
||||
|
||||
설치된 위치에서 ZAP 프록시를 실행합니다.
|
||||
Linux Mint에서는 기본적으로 `/opt/zaproxy`에 있습니다.
|
||||
MacOS에서는 `Applications`에 있습니다.
|
||||
|
||||
4. `ZAP_API_KEY` 및 `ZAP_PORT`에 대한 환경 변수를 설정합니다.
|
||||
|
||||
ZAP 프록시에서 이 값을 가져옵니다.
|
||||
`Options...` -> `API`로 이동하여 API 키를 가져옵니다.
|
||||
|
||||
`Options...` -> `Network` -> `Local Servers/Proxies`로 이동하여 포트를 설정하고 가져옵니다.
|
||||
|
||||
5. `zap-cli`로 몇 가지 명령을 실행합니다.
|
||||
|
||||
예시:
|
||||
|
||||
```sh
|
||||
zap-cli quick-scan -s all --ajax-spider -r http://127.0.0.1:8080/WebGoat/login.mvc
|
||||
```
|
||||
|
||||
또는 [리포지토리](https://github.com/rstatsinger/contrast-java-webgoat-docker/blob/master/Lab-WebGoat.pdf)에 있는 지침에 따라 취약한 애플리케이션을 손상시킬 수 있습니다.
|
||||
|
||||
6. Constrast에서 결과 관찰
|
||||
|
||||
어느 쪽이든, Contrast에서 애플리케이션의 **Vulnerabilities** 탭으로 이동하면, Contrast가 취약점을 감지한 것을 확인할 수 있을 것입니다.
|
||||
조치를 취하라는 경고가 표시됩니다.
|
||||
|
||||
## 보너스: 이미지 스캐닝
|
||||
|
||||
애플리케이션의 동작을 관찰하여 공격을 탐지하는 데 IAST 솔루션이 어떻게 도움이 되었는지 살펴보았습니다.
|
||||
이러한 공격을 애초에 막을 수 있었는지 살펴봅시다.
|
||||
|
||||
이 데모에 사용한 취약한 애플리케이션은 컨테이너로 된 패키지였습니다.
|
||||
[14일차](day14.md)와 [15일차](day15.md)에서 배운 `grype` 스캐너를 통해 이 컨테이너를 스캔하고 결과를 확인해 보겠습니다.
|
||||
|
||||
```sh
|
||||
$ grype contrast-java-webgoat-docker-webgoat
|
||||
✔ Vulnerability DB [no update available]
|
||||
✔ Loaded image
|
||||
✔ Parsed image
|
||||
✔ Cataloged packages [316 packages]
|
||||
✔ Scanned image [374 vulnerabilities]
|
||||
NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITY
|
||||
apt 1.8.2.3 deb CVE-2011-3374 Negligible
|
||||
axis 1.4 java-archive GHSA-55w9-c3g2-4rrh Medium
|
||||
axis 1.4 java-archive GHSA-96jq-75wh-2658 Medium
|
||||
bash 5.0-4 deb CVE-2019-18276 Negligible
|
||||
bash 5.0-4 (won't fix) deb CVE-2022-3715 High
|
||||
bsdutils 1:2.33.1-0.1 deb CVE-2022-0563 Negligible
|
||||
bsdutils 1:2.33.1-0.1 (won't fix) deb CVE-2021-37600 Low
|
||||
commons-beanutils 1.8.3 java-archive CVE-2014-0114 High
|
||||
commons-beanutils 1.8.3 java-archive CVE-2019-10086 High
|
||||
commons-beanutils 1.8.3 1.9.2 java-archive GHSA-p66x-2cv9-qq3v High
|
||||
commons-beanutils 1.8.3 1.9.4 java-archive GHSA-6phf-73q6-gh87 High
|
||||
commons-collections 3.2.1 java-archive CVE-2015-6420 High
|
||||
commons-collections 3.2.1 3.2.2 java-archive GHSA-6hgm-866r-3cjv High
|
||||
commons-collections 3.2.1 3.2.2 java-archive GHSA-fjq5-5j5f-mvxh Critical
|
||||
commons-fileupload 1.3.1 java-archive CVE-2016-1000031 Critical
|
||||
commons-fileupload 1.3.1 java-archive CVE-2016-3092 High
|
||||
commons-fileupload 1.3.1 1.3.2 java-archive GHSA-fvm3-cfvj-gxqq High
|
||||
commons-fileupload 1.3.1 1.3.3 java-archive GHSA-7x9j-7223-rg5m Critical
|
||||
commons-io 2.4 java-archive CVE-2021-29425 Medium
|
||||
commons-io 2.4 2.7 java-archive GHSA-gwrp-pvrq-jmwv Medium
|
||||
coreutils 8.30-3 deb CVE-2017-18018 Negligible
|
||||
coreutils 8.30-3 (won't fix) deb CVE-2016-2781 Low
|
||||
curl 7.64.0-4+deb10u3 deb CVE-2021-22922 Negligible
|
||||
curl 7.64.0-4+deb10u3 deb CVE-2021-22923 Negligible
|
||||
<truncated>
|
||||
```
|
||||
|
||||
보시다시피 이 이미지는 취약점으로 가득 차 있습니다.
|
||||
|
||||
각 취약점을 자세히 살펴보면 RCE(원격 코드 실행), SQL 인젝션, XML 외부 엔티티 취약점 등과 같은 취약점이 있음을 알 수 있습니다.
|
||||
|
||||
## 주간 요약
|
||||
|
||||
IAST와 DAST는 애플리케이션의 동작을 모니터링하여 애플리케이션의 취약점을 찾는 데 도움이 되는 중요한 방법입니다.
|
||||
이 작업은 애플리케이션이 이미 배포된 후에 수행됩니다.
|
||||
|
||||
컨테이너 이미지 스캔은 컨테이너 내부에 있는 라이브러리를 기반으로 애플리케이션의 취약점을 찾는 데 도움이 될 수 있습니다.
|
||||
|
||||
이미지 스캔과 IAST/DAST는 상호 배타적이지 않습니다.
|
||||
둘 다 보안 SDLC에서 각자의 역할을 하며 공격자보다 먼저 다양한 문제를 발견하는 데 도움이 될 수 있습니다.
|
||||
|
||||
[21일차](day21.md)에 뵙겠습니다.
|
48
2023/ko/days/day49.md
Normal file
@ -0,0 +1,48 @@
|
||||
# Day 49: AWS 클라우드 개요
|
||||
|
||||
데브옵스의 90일의 AWS 섹션에 오신 것을 환영합니다! 배울 7가지 항목을 선택하는 것은 여러 가지 이유로 어렵습니다:
|
||||
|
||||
1. 마지막으로 집계했을 때 250개 이상의 AWS 서비스가 있었습니다
|
||||
2. 각각의 서비스는 며칠동안 깊게 파고들 수 있습니다 😅
|
||||
|
||||
그러한 이유로 우리는 쉽게 시작하여 DevOps에 매우 중요한 서비스를 소개하고 AWS DevOps 서비스에 대해 많이 노출할 수 있는 섹션 캡스톤 프로젝트로 마무리할 것입니다.
|
||||
|
||||
다음 7일 동안 제가 만든 것처럼 즐거운 시간을 보내시기 바랍니다. 궁금한 점이 있으면 언제든지 물어보세요!
|
||||
|
||||
AWS Cloud는 Amazon Web Services (AWS)가 제공하는 클라우드 컴퓨팅 플랫폼입니다. 컴퓨팅, 스토리지, 네트워킹, 데이터베이스, 분석, 기계 학습, 보안 등 다양한 서비스를 제공합니다. AWS Cloud는 사용한 만큼 비용을 지불하는 방식으로 비즈니스 및 조직이 이러한 서비스에 액세스할 수 있도록 하여 사용한 리소스에 대해서만 지불하고 필요에 따라 리소스를 확장 또는 축소할 수 있습니다.
|
||||
|
||||

|
||||
|
||||
## Flexibility
|
||||
|
||||
AWS Cloud의 주요 이점 중 하나는 유연성입니다. 귀하의 요구에 가장 적합한 서비스를 선택하고 사용한 만큼만 지불할 수 있습니다. 이는 소규모 기업, 스타트업 및 대기업에 이상적인 솔루션으로, 인프라에 대한 큰 초기 투자를 하지 않고 필요한 리소스에 액세스할 수 있도록 합니다.
|
||||
|
||||
## Security
|
||||
|
||||
AWS Cloud의 또 다른 이점은 보안입니다. AWS는 암호화, 자격 증명 및 액세스 관리, 네트워크 보안을 포함하여 데이터와 리소스를 보호하기 위해 여러 가지 보안 조치를 적용하고 있습니다. 또한 HIPAA, PCI DSS, GDPR을 포함하여 다양한 규정 준수 프로그램을 갖추고 있어 데이터가 안전하고 관련 규정을 준수하는지 확인합니다.
|
||||
|
||||
AWS Cloud는 리소스와 인프라를 관리하는 데 도움이 되는 다양한 도구와 서비스도 제공합니다. 예를 들어, AWS 관리 콘솔을 사용하면 단일 및 중앙 집중식 대시보드에서 리소스를 모니터링하고 제어할 수 있습니다. AWS Command Line Interface (CLI)를 사용하면 명령줄에서 리소스를 관리하여 작업을 자동화하고 다른 도구와 통합하기 쉽습니다.
|
||||
|
||||
## EC2
|
||||
|
||||
AWS Cloud가 제공하는 가장 인기 있는 서비스 중 하나는 Amazon Elastic Compute Cloud (EC2)입니다. EC2를 사용하면 클라우드에서 가상 서버를 쉽게 시작하고 관리할 수 있으며, 필요에 따라 리소스를 확장 또는 축소하기 쉽습니다. 여러 가지 인스턴스 유형과 크기 중에서 선택할 수 있으며, 사용한 리소스만큼만 비용을 지불하면 됩니다.
|
||||
|
||||

|
||||
|
||||
## S3
|
||||
|
||||
AWS Cloud가 제공하는 또 다른 인기 있는 서비스는 Amazon Simple Storage Service (S3)입니다. S3는 인터넷 어디에서나 대량의 데이터를 저장하고 찾을 수 있는 객체 저장 서비스입니다. 확장성이 높고 내구성이 있으며 안전하므로 클라우드에서 데이터를 저장하고 관리하는 데 이상적인 솔루션입니다.
|
||||
|
||||

|
||||
|
||||
## Databases
|
||||
|
||||
AWS Cloud는 데이터베이스 관리를 위한 Amazon Relational Database Service (RDS), 데이터 웨어하우징 및 분석을 위한 Amazon Redshift, 검색 및 분석을 위한 Amazon Elasticsearch Service와 같은 다양한 서비스도 제공합니다. 이러한 서비스를 사용하면 인프라나 확장에 대해 걱정할 필요 없이 클라우드에서 복잡한 애플리케이션을 구축하고 관리할 수 있습니다.
|
||||
|
||||

|
||||
|
||||
전반적으로 AWS Cloud는 다양한 규모의 기업과 조직을 위한 강력하고 유연한 클라우드 컴퓨팅 플랫폼으로, 다양한 서비스와 도구를 제공합니다. 소규모 기업, 스타트업 또는 대기업이든 상관없이 AWS Cloud는 여러분에게 무언가를 제공할 수 있습니다. 사용한 만큼 비용을 지불하는 방식, 보안 및 관리 도구를 갖추고 있어 클라우드 컴퓨팅의 이점을 활용하려는 누구에게나 이상적인 솔루션입니다.
|
||||
|
||||
## Resources
|
||||
|
||||
[Day 50](day50.md)에서 다시 만나요.
|
45
2023/ko/days/day50.md
Normal file
@ -0,0 +1,45 @@
|
||||
# Day 50: 무료 계층 계정 획득 및 청구 알람 활성화
|
||||
|
||||
AWS는 제한된 기간 동안 어떠한 요금도 부과받지 않고 다양한 AWS 서비스에 액세스하고 실험할 수 있는 무료 계층 계정을 제공합니다. 이 문서에서는 무료 계층 AWS 계정에 가입하는 단계를 안내해 드리겠습니다.
|
||||
|
||||
## Step 1: AWS 웹사이트로 이동
|
||||
|
||||
무료 계층 AWS 계정에 가입하기 위한 첫 번째 단계는 AWS 웹 사이트로 이동하는 것입니다. 웹사이트는 https://aws.amazon.com 로 접속할 수 있습니다. 웹 사이트에서 페이지 우측 상단의 "AWS 계정 만들기" 버튼을 클릭하면 됩니다.
|
||||

|
||||
|
||||
## Step 2: AWS 계정 생성
|
||||
|
||||
"AWS 계정 만들기" 버튼을 클릭하면 AWS 로그인 페이지로 이동합니다. 이미 AWS 계정이 있는 경우 이메일 주소와 비밀번호를 사용하여 로그인할 수 있습니다. 계정이 없는 경우 이메일 주소와 AWS 계정 이름을 입력하고 "이메일 주소 확인" 버튼을 클릭하면 확인 코드가 포함된 이메일이 전송되어 다시 제공됩니다.
|
||||

|
||||

|
||||
|
||||
## Step 3: 계정 정보 제공
|
||||
|
||||
다음 페이지에서 계정 정보를 제공하라는 메시지가 표시됩니다. 비밀번호, 전체 이름, 회사 이름, 전화 번호를 제공해야 합니다. 정보를 입력한 후 "계속" 버튼을 클릭하십시오.
|
||||

|
||||

|
||||
|
||||
|
||||
## Step 4: 결제 정보 제공
|
||||
|
||||
무료 계층 계정에 가입하려면 결제 정보를 제공해야 합니다. AWS는 본인 확인 및 사기 방지를 위해 이 정보를 요구합니다. 단, 무료 티어 서비스는 1년 동안 무료로 제공되기 때문에 요금이 부과되지 않습니다. 결제 정보를 제공한 후 "확인 및 계속" 버튼을 클릭하십시오. 다음 페이지에서는 본인 확인을 위한 SMS 또는 음성 통화를 전화로 전송합니다.
|
||||

|
||||

|
||||
|
||||
## Step 5: 지원 계획 선택
|
||||
|
||||
결제 정보를 제공한 후 지원 계획 페이지로 이동합니다. 여기에서 원하는 지원 수준을 선택할 수 있으며, 필요에 따라 *기본 지원 - 무료* 옵션을 사용합니다. 이 정보를 제공한 후 "가입 완료" 버튼을 클릭하십시오.
|
||||

|
||||
|
||||
## 다음 단계:
|
||||
|
||||
무료 계층 계정에 액세스한 후 추가적인 몇 가지 단계를 수행해야 합니다. 이러한 단계 중에서 요금 알림을 생성하는 것이 가장 중요하다고 주장할 수 있습니다. *그러니 건너뛰지 마세요!!*
|
||||
1. [청구 알람 생성](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html)
|
||||
2. [루트 사용자에서 MFA 활성화](https://docs.aws.amazon.com/accounts/latest/reference/root-user-mfa.html)
|
||||
3. [IAM 사용자 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html) 은 일반 작업용이고 그것이 필요한 경우를 제외하곤 *절대* 루트 사용자 계정을 사용하지 마세요.
|
||||
|
||||
## Resources
|
||||
[무료 AWS 계정 만들기](https://youtu.be/uZT8dA3G-S4)
|
||||
|
||||
[CLI를 사용하요 자격 증명, 예산 및 청구 알람 생성](https://youtu.be/OdUnNuKylHg)
|
||||
[Day 51](day51.md)에서 다시 만나요.
|
27
2023/ko/days/day51.md
Normal file
@ -0,0 +1,27 @@
|
||||
# Day 51: 코드로서의 인프라(IaC) 및 CloudFormation
|
||||
|
||||
IaC(Infrastructure as code)는 개발자와 운영팀이 수동 프로세스가 아닌 코드를 통해 인프라를 관리하고 프로비저닝할 수 있는 프로세스입니다. IaC를 사용하면 구성 파일과 자동화 도구를 사용하여 인프라 리소스를 관리할 수 있어 더 빠르고 일관되며 신뢰성 있는 인프라 배포가 가능합니다.
|
||||
|
||||
가장 인기 있는 IaC 툴 중 하나는 AWS CloudFormation으로 운영, 데브옵스 및 개발자가 YAML 또는 JSON 형식의 템플릿을 사용하여 인프라 리소스를 정의할 수 있습니다. 이러한 템플릿은 버전 제어 및 팀 간 공유가 가능하여 손쉽게 협업할 수 있고 구성 드리프트 가능성을 줄일 수 있습니다.
|
||||
|
||||

|
||||
|
||||
CloudFormation은 IaC를 구현하려는 사람들에게 여러 가지 이점을 제공합니다. 인프라 배포 및 관리를 자동화할 수 있다는 점이 주요 이점 중 하나로, 시간을 절약하고 인적 오류의 위험을 줄일 수 있습니다. 개발자와 운영 팀은 CloudFormation을 사용하여 가상 머신, 데이터베이스, 네트워킹 구성과 같은 인프라 리소스를 정의한 후 반복 가능하고 일관된 방식으로 배포할 수 있습니다.
|
||||
|
||||
CloudFormation을 사용하는 또 다른 장점은 인프라 리소스의 변경 사항을 추적할 수 있다는 점입니다. CloudFormation 템플릿이 변경되면 서비스는 새로운 구성을 반영하도록 리소스를 자동으로 업데이트할 수 있습니다. 이렇게 하면 모든 리소스가 동기화 상태로 유지되고 구성 오류가 발생할 가능성이 줄어듭니다.
|
||||
|
||||
CloudFormation은 리소스 간의 종속성을 관리할 수 있는 기능도 제공합니다. 이는 리소스를 올바른 순서와 올바른 구성으로 프로비저닝하여 오류 가능성을 줄이고 배포 프로세스를 더욱 효율적으로 만들 수 있음을 의미합니다.
|
||||
|
||||
이러한 이점 외에도 CloudFormation은 변경 사항을 롤백하는 기능, 전체 애플리케이션을 배포하는 데 사용할 수 있는 템플릿을 생성하는 기능과 같은 다양한 다른 기능도 제공합니다. 이러한 기능을 사용하면 인프라 리소스를 더 쉽게 관리하고 배포의 일관성과 신뢰성을 보장할 수 있습니다.
|
||||
|
||||
## Resources:
|
||||
|
||||
[AWS CloudFormation이 무엇인가? Pros & Cons?](https://youtu.be/0Sh9OySCyb4)
|
||||
|
||||
[CloudFormation 튜토리얼](https://www.youtube.com/live/gJjHK28b0cM)
|
||||
|
||||
[AWS CloudFormation 유저 가이드](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)
|
||||
|
||||
[AWS CloudFormation 시작 단계별 가이드](https://aws.amazon.com/cloudformation/getting-started/)
|
||||
|
||||
[Day 52](day52.md)에서 다시 만나요.
|
56
2023/ko/days/day52.md
Normal file
@ -0,0 +1,56 @@
|
||||
# Day 52: Identity and Access Management (IAM)
|
||||
|
||||
클라우드 컴퓨팅이 계속해서 인기를 얻으면서, 점점 더 많은 조직들이 그들의 인프라를 관리하기 위해 클라우드 플랫폼으로 관심을 돌리고 있습니다. 그러나, 이와 함께 데이터와 자원을 보호하기 위해 적절한 보안 조치가 시행되도록 보장해야 할 필요성이 뒤따릅니다. AWS에서 보안을 관리하기 위한 가장 중요한 도구 중 하나는 IAM(Identity and Access Management)입니다.
|
||||
|
||||
## AWS IAM이란?
|
||||
||
|
||||
|:-:|
|
||||
| <i>IAM is (1) WHO (2) CAN ACCESS (3) WHAT</i>|
|
||||
|
||||
AWS IAM은 AWS 리소스에 대한 사용자 및 사용자의 액세스를 관리할 수 있는 웹 서비스입니다. IAM을 사용하면 AWS 사용자 및 그룹을 생성 및 관리할 수 있고, AWS 리소스에 대한 액세스를 제어할 수 있으며, 사용자가 해당 리소스에 대해 수행할 수 있는 작업을 결정하는 권한을 설정할 수 있습니다. IAM은 세분화된 액세스 제어를 제공하므로 세분화된 수준에서 특정 리소스에 대한 권한을 부여하거나 거부할 수 있습니다.
|
||||
|
||||
IAM은 AWS 리소스를 보호하기 위한 필수 도구입니다. IAM이 없다면 AWS 계정에 액세스할 수 있는 모든 사람은 모든 리소스에 제한 없이 액세스할 수 있습니다. IAM을 사용하면 리소스에 액세스할 수 있는 사용자, 수행할 수 있는 작업, 액세스할 수 있는 리소스를 제어할 수 있습니다. 또한 IAM은 여러 AWS 계정을 생성하고 관리할 수 있도록 지원하는데, 이는 대규모 조직에는 항상 서로 어느 정도 수준의 상호 작용이 필요한 계정이 많이 있기 때문에 필수적입니다:
|
||||
|
||||
||
|
||||
|:-:|
|
||||
| <i>Multi-Account IAM access is essential knowledge</i>|
|
||||
|
||||
|
||||
## AWS IAM을 시작하는 방법
|
||||
|
||||
AWS IAM을 시작하는 것은 간단합니다. 여러분이 따라야 할 단계는 다음과 같습니다:
|
||||
|
||||
### Step 1: AWS 계정 만들기
|
||||
|
||||
첫번째 단계는 AWS 계정이 없는 경우 AWS 계정을 생성하는 것입니다. 50일차에 이렇게 했으니 가보는 것도 좋을 것 같아요 😉
|
||||
|
||||
### Step 2: IAM 설정
|
||||
|
||||
AWS 계정이 있으면 IAM 콘솔로 이동하여 IAM을 설정할 수 있습니다. 콘솔에서는 IAM 사용자, 그룹, 역할 및 정책을 관리할 수 있습니다.
|
||||
|
||||
### Step 3: IAM 사용자 생성
|
||||
|
||||
다음 단계는 IAM 사용자를 생성하는 것입니다. IAM 사용자는 AWS 리소스에 액세스해야 하는 개인 또는 서비스를 나타내는 IAM에서 생성하는 엔티티입니다. IAM 사용자를 생성할 때 사용자가 가져야 할 권한을 지정할 수 있습니다. 50일으로부터 숙제 중 하나는 [IAM 사용자 생성하기](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)이고, 완료하지 않은 경우 다시 돌아가서 지금 만들어 주십시오.
|
||||
|
||||
### Step 4: IAM 그룹 생성
|
||||
|
||||
IAM 사용자를 만든 후 다음 단계는 IAM 그룹을 만드는 것입니다. IAM 그룹은 IAM 사용자의 모음입니다. IAM 그룹을 만들 때 그룹이 가져야 할 권한을 지정할 수 있습니다. 이를 수행하려면 "IAM Basics"를 보고 리소스 섹션의 "IAM User Guide: Getting Started"를 읽으십시오.
|
||||
|
||||
### Step 5: IAM Group에 권한 할당
|
||||
|
||||
IAM 그룹을 만든 후에는 그룹에 권한을 할당할 수 있습니다. 여기에는 그룹이 가져야 할 권한을 정의하는 IAM 정책을 만드는 것이 포함됩니다. 그런 다음 해당 정책을 그룹에 연결할 수 있습니다. "IAM 튜토리얼 & 딥 다이브"를 보고 이를 달성하기 위해선 리소스 섹션의 IAM 튜토리얼을 살펴보십시오.
|
||||
|
||||
### Step 6: IAM 사용자 테스트
|
||||
|
||||
IAM 그룹에 권한을 할당한 후 IAM 사용자에게 올바른 권한이 있는지 테스트할 수 있습니다. 이를 수행하려면 IAM 사용자의 자격 증명을 사용하여 AWS Management Console에 로그인하고 사용자가 수행할 수 있어야 하는 작업을 수행할 수 있습니다.
|
||||
|
||||
## Resources:
|
||||
[IAM 기본](https://youtu.be/iF9fs8Rw4Uo)
|
||||
|
||||
[IAM 사용 설명서: 시작하기](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started.html)
|
||||
|
||||
[IAM 비디오 튜토리얼 & 딥 다이브](https://youtu.be/ExjW3HCFG1U)
|
||||
|
||||
[IAM 튜토리얼: AM 역할을 사용하여 AWS 계정 전체에 액세스 위임](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)
|
||||
|
||||
[Day 53](day53.md)에서 다시 만나요.
|
50
2023/ko/days/day53.md
Normal file
@ -0,0 +1,50 @@
|
||||
# Day 53: AWS Systems Manager
|
||||
|
||||

|
||||
|
||||
AWS Systems Manager는 사용자가 자신의 AWS 및 사내 리소스 모두에서 운영 태스크를 관리하고 자동화할 수 있는 완전 관리형 서비스입니다. AWS 리소스, 가상 머신 및 애플리케이션을 관리할 수 있는 중앙 집중화된 플랫폼을 제공합니다. DevOps 전문가가 운영 업무를 자동화하고 규정 준수를 유지하며 운영 비용을 절감할 수 있습니다.
|
||||
|
||||
AWS Systems Manager를 통해 사용자는 패치 관리 자동화, OS 및 애플리케이션 배포 자동화, Amazon Machine Images(AMI) 생성 및 관리, 리소스 활용도 모니터링 등의 작업을 수행할 수 있습니다. 또한 실행 명령, 상태 관리자, 인벤토리 및 유지 관리 창을 포함하는 인스턴스 구성 및 관리를 위한 일련의 도구를 제공합니다.
|
||||
|
||||
또한 AWS Systems Manager는 운영 데이터의 통합 뷰를 제공하여 사용자가 EC2 인스턴스, 사내 서버 및 AWS 서비스를 포함한 AWS 인프라 전반에 걸쳐 운영 데이터를 시각화하고 모니터링할 수 있습니다. 이를 통해 사용자는 문제를 보다 빠르게 파악하고 해결할 수 있어 운영 효율성이 향상되고 다운타임이 줄어듭니다.
|
||||
|
||||
## AWS System Manager을 시작하는 방법은 무엇일까요?
|
||||
|
||||
AWS System Manager를 시작하는 것은 1, 2, 3, 4만큼 쉽습니다 😄:
|
||||
|
||||

|
||||
|
||||
### Step 1: AWS System Manager 콘솔로 이동
|
||||
|
||||
AWS 계정이 있으면 2개의 윈도우 서버와 2개의 리눅스 서버(free tier 과정😉)를 생성하고 AWS System Manager 콘솔로 이동합니다. 이 콘솔은 EC2 인스턴스, 사내 서버 및 기타 리소스를 포함한 AWS 리소스를 관리하기 위한 통합 인터페이스를 제공합니다:
|
||||
|
||||

|
||||
시작하기 버튼을 클릭하고 원하는 지역을 선택합니다(저는 us-east-1을 선택했습니다)
|
||||
|
||||
### Step 2: 구성 유형 선택
|
||||
|
||||
다음 단계는 리소스를 관리하도록 AWS Systems Manager를 구성하는 것입니다. 빠른 설정 공통 작업 중 하나를 선택하여(또는 직접 선택한 사용자 지정 설정 유형을 생성) 이 작업을 수행할 수 있습니다:
|
||||

|
||||
필요에 따라 "Patch Manager(패치 매니저)"를 선택할 것입니다. 아래 리소스에는 테스트할 수 있는 추가 시나리오가 있습니다. "AWS Systems Manager를 사용하여 몇 분 안에 AWS 인스턴스를 패치 및 관리"를 참조하여 이 단계를 확인하십시오.
|
||||
|
||||
### Step 3: 구성 옵션 구체화
|
||||
|
||||
각 구성 유형에는 이 단계에 적용할 고유한 매개 변수 집합이 있습니다...
|
||||
||
|
||||
|:-:|
|
||||
| <i>선택한 빠른 시작 구성에 따라 다른 점이 나타납니다.</i>|
|
||||
|
||||
따라서 각 리소스에 필요한 인수에 대해서는 설명하지 않겠습니다. 일반적으로 다음 단계는 리소스 그룹을 만들어 리소스를 구성하는 것입니다. 리소스 그룹은 공통 속성을 공유하는 리소스 모음입니다. 리소스를 그룹화하면 리소스를 전체적으로 볼 수 있고 정책과 작업을 함께 적용할 수 있습니다. 이 단계를 실행하려면 "AWS Systems Manager를 사용하여 몇 분 안에 AWS 인스턴스를 패치 및 관리"를 참조하십시오.
|
||||
|
||||
### Step 4: 리소스 배포, 검토 및 관리
|
||||
|
||||
리소스 그룹을 생성한 후에는 AWS System Manager 콘솔에서 리소스를 보고 관리할 수 있습니다. 또한 자동화 워크플로우를 생성하고 패치 관리를 실행하며 리소스에 대한 다른 작업을 수행할 수 있습니다.
|
||||
|
||||
## Resources:
|
||||
[AWS Systems Manager 소개](https://youtu.be/pSVK-ingvfc)
|
||||
|
||||
[AWS Systems Manager를 사용하여 몇 분 안에 AWS 인스턴스를 패치 및 관리](https://youtu.be/DEQFJba3h4M)
|
||||
|
||||
[AWS System Manager 시작하기](https://docs.aws.amazon.com/systems-manager/latest/userguide/getting-started-launch-managed-instance.html)
|
||||
|
||||
[Day 54](day54.md)에서 다시 만나요.
|
32
2023/ko/days/day54.md
Normal file
@ -0,0 +1,32 @@
|
||||
# Day 54: AWS CodeCommit
|
||||
|
||||

|
||||
|
||||
AWS CodeCommit은 아마존웹서비스(AWS)가 제공하는 완전 관리형 소스 제어 서비스로, 개발자들이 개인 Git 저장소를 쉽게 호스팅하고 관리할 수 있도록 해줍니다. "GitHub이지만 기능이 적은"라고 생각하세요 🤣 (j/k, 자세한 내용은 "CodeCommit vs GitHub" 리소스 참조) 이를 통해 팀들은 코드 협업과 보안 액세스 제어, 암호화 및 자동 백업을 지원으로 코드를 클라우드에 안전하게 저장할 수 있습니다.
|
||||
|
||||
개발자들은 AWS CodeCommit을 통해 강력한 코드 리뷰 및 워크플로우 도구를 통해 Git 저장소를 쉽게 생성, 관리 및 협업할 수 있습니다. AWS CodePipeline 및 AWS CodeBuild와 같은 다른 AWS 서비스와 원활하게 통합되어 완벽하게 자동화된 방식으로 애플리케이션을 구축하고 배포할 수 있습니다.
|
||||
|
||||
AWS CodeCommit의 몇 가지 주요 기능은 다음과 같습니다:
|
||||
|
||||
- 코드 리뷰 및 pull requests을 지원하는 깃 기반 저장소
|
||||
- 안전한 액세스 제어를 위해 AWS IAM(Identity and Access Management)과의 통합(큰 이점)
|
||||
- 저장 및 전송 중인 데이터 암호화
|
||||
- 자동 백업 및 장애 조치 기능을 통한 뛰어난 확장성과 가용성
|
||||
- AWS CodePipeline 및 AWS CodeBuild와 같은 다른 AWS 개발자 도구와의 통합
|
||||
|
||||
CodeCommit을 효과적으로 활용하기 위해서는 Git을 사용하는 방법을 당연히 알아야 합니다.
|
||||
[many](https://www.youtube.com/playlist?list=PL2rC-8e38bUXloBOYChAl0EcbbuVjbE3t) [excellent](https://youtu.be/tRZGeaHPoaw) [Git](https://youtu.be/USjZcfj8yxE) [tutorials](https://youtu.be/RGOj5yH7evk)가 있고, (어쨋든 제 섹션이 아닙니다 😉) 그래서 저는 거기를 살펴보진 않을 것입니다.
|
||||
|
||||
전반적으로 AWS CodeCommit은 코드 협업, 저장소의 안전한 관리 및 개발 워크플로우의 효율화가 필요한 팀을 위한 강력한 도구입니다.
|
||||
|
||||
## Resources:
|
||||
|
||||
[AWS CodeCommit 사용자 안내서](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html)
|
||||
|
||||
[AWS CodeCommit 개요](https://youtu.be/5kFmfgFYOx4)
|
||||
|
||||
[AWS CodeCommit 튜토리얼: your first Repo, Commit and Push](https://youtu.be/t7M8pHCh5Xs)
|
||||
|
||||
[AWS CodeCommit vs GitHub: 2023에 빛날 것은?](https://appwrk.com/aws-codecommit-vs-github)
|
||||
|
||||
[Day 55](day55.md)에서 다시 만나요.
|
67
2023/ko/days/day55.md
Normal file
@ -0,0 +1,67 @@
|
||||
# Day 55: AWS CodePipeline
|
||||
|
||||
<i>AWS 서비스의 마지막 날에 우리는 움직이는 부분과 통합이 많은 큰 서비스에 대해 이야기할 것입니다. 이에 대한 학습/이해에 도움이 될 몇 가지 무료 리소스가 있지만 솔직히 가장 좋은 리소스 중 일부는 비용이 들 것입니다. 리소스 섹션에 별도로 나열하여 호출할 것이지만 이 복잡한 서비스를 학습하기에 환상적이기 때문에 언급하지 않는 것은 놓칠 수 있습니다</i>
|
||||
|
||||
<b>CodePipeline</b>은 IaC 또는 소프트웨어 릴리즈 프로세스를 자동화할 수 있는 완전 관리형 지속적 전달 서비스입니다. 이를 통해 코드 변경 사항을 (적절한 테스트를 수행하여)안정되게 지속적으로 빌드, 테스트 및 배포하는 파이프라인을 생성할 수 있습니다:
|
||||
|
||||

|
||||
|
||||
CodePipeline을 사용하면 빌드, 테스트 및 배포 워크플로우를 자동화하는 파이프라인을 생성하여 코드 변경 사항이 대상 환경에 안정적으로 배포되도록 할 수 있습니다. 이를 통해 빠른 릴리즈 주기를 달성하고 개발 및 운영 팀 간의 협업을 개선하며 소프트웨어 릴리스의 전반적인 품질과 신뢰성을 향상시킬 수 있습니다.
|
||||
|
||||
AWS CodePipeline은 다른 AWS 서비스와 통합됩니다:
|
||||
|
||||
- [Source Action Integrations](https://docs.aws.amazon.com/codepipeline/latest/userguide/integrations-action-type.html#integrations-source)
|
||||
- [Build Action Integrations](https://docs.aws.amazon.com/codepipeline/latest/userguide/integrations-action-type.html#integrations-build)
|
||||
- [Test Action Integrations](https://docs.aws.amazon.com/codepipeline/latest/userguide/integrations-action-type.html#integrations-test)
|
||||
- [Deploy Action Integrations](https://docs.aws.amazon.com/codepipeline/latest/userguide/integrations-action-type.html#integrations-deploy)
|
||||
- [Approval Action Integrations](https://docs.aws.amazon.com/codepipeline/latest/userguide/integrations-action-type.html#integrations-approval)
|
||||
- [Invoke Action Integrations](https://docs.aws.amazon.com/codepipeline/latest/userguide/integrations-action-type.html#integrations-invoke)
|
||||
|
||||
또한 깃허브(GitHub), 젠킨스(Jenkins), 비트버킷(Bitbucket)과 같은 타사 도구와 통합됩니다. AWS CodePipeline을 사용하여 여러 AWS 계정 및 리전에 걸쳐 애플리케이션 업데이트를 관리할 수 있습니다.
|
||||
|
||||
## AWS CodePipeline 시작하기
|
||||
|
||||
AWS CodePipeline을 시작하기 위해 [AWS User Guide](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 에 몇 가지 우수한 [tutorials](https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials.html)이 있습니다. 이들은 모두 기본적으로 다음과 같은 세 단계로 나뉩니다:
|
||||
|
||||
### Step 1: IAM 역할 만들기
|
||||
|
||||
AWS CodePipeline에서 파이프라인을 실행하는 데 필요한 AWS 리소스에 액세스할 수 있는 IAM 역할을 생성해야 합니다. IAM 역할을 생성하려면 [Day 52](day52.md)의 단계를 확인하십시오
|
||||
|
||||
### Step 2: CodePipeline 파이프라인 생성
|
||||
|
||||
CodePipeline 파이프라인을 만들려면 AWS CodePipeline 콘솔로 이동하여 "파이프라인 생성" 버튼을 클릭한 후 지시사항을 따라 파이프라인을 생성합니다. 코드의 소스 위치, 사용할 빌드 공급자, 사용할 배포 공급자 및 2단계에서 생성한 IAM 역할을 지정해야 합니다.
|
||||
|
||||
### Step 3: 코드 변경 테스트 및 배포
|
||||
|
||||
CodePipeline 파이프라인을 생성한 후 코드 변경사항을 테스트하고 배포할 수 있습니다. AWS CodePipeline은 자동으로 코드 변경사항을 빌드, 테스트하고 대상 환경에 배포합니다. AWS CodePipeline 콘솔에서 파이프라인의 진행 상황을 모니터링할 수 있습니다.
|
||||
Once you have created your CodePipeline pipeline, you can test and deploy your code changes. AWS CodePipeline will automatically build, test, and deploy your code changes to your target environments. You can monitor the progress of your pipeline in the AWS CodePipeline console.
|
||||
|
||||
## 캡스톤 프로젝트
|
||||
|
||||
데브옵스 90일의 이 AWS 섹션을 연결하려면 Adrian Canttrill의 우수한 미니 프로젝트인 [CatPipeline](https://www.youtube.com/playlist?list=PLTk5ZYSbd9MgARTJHbAaRcGSn7EMfxRHm) 을 살펴보시기를 권장합니다. 그 안에서 여러분은 데브옵스 엔지니어의 하루를 경험할 수 있는 재미있는 작은 프로젝트인 CodeCommit, CodeBuild, CodeDeploy 및 CodePipeline을 접할 수 있습니다.
|
||||
|
||||
- [YouTube CatPipeline Playlist](https://www.youtube.com/playlist?list=PLTk5ZYSbd9MgARTJHbAaRcGSn7EMfxRHm)
|
||||
- [GitHub CatPipeline Repo](https://github.com/acantril/learn-cantrill-io-labs/tree/master/aws-codepipeline-catpipeline)
|
||||
|
||||
## Resources (무료)
|
||||
|
||||
[AWS: Real-world CodePipeline CI/CD 예제](https://youtu.be/MNt2HGxClZ0)
|
||||
|
||||
[AWS CodePipeline 사용 설명서](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html)
|
||||
|
||||
[AWS CodePipeline 튜토리얼](https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials.html)
|
||||
|
||||
[AWS CodeCommit 튵ㅎ라올: your first Repo, Commit and Push](https://youtu.be/t7M8pHCh5Xs)
|
||||
|
||||
[AWS CodeCommit vs GitHub: 2023에 빛날 것은?](https://appwrk.com/aws-codecommit-vs-github)
|
||||
|
||||
## Resources (유료)
|
||||
|
||||
수많은 <i>훌륭한</i> 강사들이 있고 2-3명을 뽑는 것은 항상 어렵지만, [Adrian Canttrill](https://learn.cantrill.io/), [Andrew Brown](https://www.exampro.co/), 과 [Stephane Maarek](https://www.udemy.com/user/stephane-maarek/) 은 항상 환상적인 콘텐츠에 대해 이야기할 때 생각납니다.
|
||||
|
||||
## 마지막 생각
|
||||
|
||||
데브옵스 90일의 이 섹션을 통해 AWS 생태계에서 사용할 수 있는 것을 확인할 수 있기를 바랍니다.
|
||||
|
||||
공부에 행운을 빌어요! 다음은 Red Hat OpenShift 입니다!
|
||||
[Day 56](day56.md)에서 다시 만나요.
|
250
2024.md
@ -12,6 +12,14 @@ In 2024 we are going big and getting more of the community involved and explorin
|
||||
|
||||
A big thing about the repository has been the accessibility in regards that all tools and hands-on scenarios we have walked through are freely available to the community. This will continue to be the ethos of this community and event.
|
||||
|
||||
You will find all your 2024 sessions on the link below
|
||||
|
||||
<p align="center">
|
||||
<a href="https://www.youtube.com/playlist?list=PLsKoqAvws1psCnkDaTPRHaqcTLSTPDFBR">
|
||||
<img src="2024/Images/YouTubePlaylist.jpg?raw=true" alt="YouTube Playlist" width="50%" height="50%" />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
[](https://ko-fi.com/N4N33YRCS)
|
||||
|
||||
If you have questions and want to get involved then join the discord and share your questions and stories with the community.
|
||||
@ -20,137 +28,121 @@ If you have questions and want to get involved then join the discord and share y
|
||||
|
||||
Or contact us via Twitter, my handle is [@MichaelCade1](https://twitter.com/MichaelCade1) you can find the authors for 2023 also on Twitter linked below.
|
||||
|
||||
## Progress
|
||||
## Agenda
|
||||
|
||||
- [] ♾️ 1 > [](2024/day01.md)
|
||||
- [✔️][✔️] ♾️ 1 > [2024 - Community Edition - Introduction](2024/day01.md) - Michael Cade
|
||||
- [✔️][✔️] ♾️ 2 > [The Digital Factory](2024/day02.md) - Romano Roth
|
||||
- [✔️][✔️] ♾️ 3 > [High-performing engineering teams and the Holy Grail](2024/day03.md) - Jeremy Meiss
|
||||
- [✔️][✔️] ♾️ 4 > [Manage Kubernetes Add-Ons for Multiple Clusters Using Cluster Run-Time State](2024/day04.md) - Gianluca Mardente
|
||||
- [✔️][✔️] ♾️ 5 > [Cross-functional empathy](2024/day05.md) - Chris Kranz
|
||||
- [✔️][✔️] ♾️ 6 > [Kubernetes RBAC with Ansible](2024/day06.md) - Elif Samedin & Andrei Buzoianu
|
||||
- [✔️][✔️] ♾️ 7 > [Automate like a pro: Dealing with test automation hassles](2024/day07.md) - Mesut Durukal
|
||||
- [✔️][✔️] ♾️ 8 > [Culinary Coding: Crafting Infrastructure Recipes with OpenTofu](2024/day08.md) - Kaiwalya Koparkar
|
||||
- [✔️][✔️] ♾️ 9 > [Why should developers care about container security?](2024/day09.md) - Eric Smalling
|
||||
- [✔️][✔️] ♾️ 10 > [Is Kubernetes Too Complicated?](2024/day10.md) - Julia Furst
|
||||
- [✔️][✔️] ♾️ 11 > [Building Resilience: A Journey of Crafting and Validating Our Disaster Recovery Plan](2024/day11.md) - Yedidya Schwartz
|
||||
- [✔️][✔️] ♾️ 12 > [Know your data: The Stats behind the Alerts](2024/day12.md) - Dave McAllister
|
||||
- [✔️][✔️] ♾️ 13 > [Architecting for Versatility](2024/day13.md) - Tim Banks
|
||||
- [✔️][✔️] ♾️ 14 > [An introduction to API Security in Kubernetes](2024/day14.md) - Geoff Burke
|
||||
- [✔️][✔️] ♾️ 15 > [Using code dependency analysis to decide what to test](2024/day15.md) - Patrick Kusebauch
|
||||
- [✔️][✔️] ♾️ 16 > [Smarter, Better, Faster, Stronger - Testing at Scale](2024/day16.md) - Ada Lündhé
|
||||
- [✔️][✔️] ♾️ 17 > [From Chaos to Resilience: Decoding the Secrets of Production Readiness](2024/day17.md) - Alejandro Pedraza Borrero
|
||||
- [✔️][✔️] ♾️ 18 > [Platform Engineering Is Not About Tech](2024/day18.md) - Nicolò Cambiaso Erizzo & Francesca Carta
|
||||
- [✔️][✔️] ♾️ 19 > [Building Efficient and Secure Docker Images with Multi-Stage Builds](2024/day19.md) - Pradumna V Saraf
|
||||
- [✔️][✔️] ♾️ 20 > [Navigating the Vast DevOps Terrain: Strategies for Learning and Staying Current](2024/day20.md) - Kunal Kushwaha
|
||||
- [✔️][✔️] ♾️ 21 > [Azure ARM now got Bicep](2024/day21.md) - Tushar Kumar
|
||||
- [✔️][✔️] ♾️ 22 > [Test in Production with Kubernetes and Telepresence](2024/day22.md) - Mohammad-Ali A'râbi
|
||||
- [✔️][✔️] ♾️ 23 > [SQL Server 2022 on Linux Containers and Kubernetes from Zero to a Hero!](2024/day23.md) - Yitzhak David
|
||||
- [✔️][✔️] ♾️ 24 > [DevSecOps - Defined, Explained & Explored](2024/day24.md) - Sameer Paradkar
|
||||
- [✔️][✔️] ♾️ 25 > [Kube-Nation: Exploring the Land of Kubernetes](2024/day25.md) - Siddhant Khisty & Aakansha Priya
|
||||
- [✔️][✔️] ♾️ 26 > [Advanced Code Coverage with Jenkins and API Mocking](2024/day26.md) - Oleg Nenashev
|
||||
- [✔️][✔️] ♾️ 27 > [From Automated to Automatic - Event-Driven Infrastructure Management with Ansible](2024/day27.md) - Daniel Bodky
|
||||
- [✔️][✔️] ♾️ 28 > [Talos Linux on VMware vSphere](2024/day28.md) - Michael Cade
|
||||
- [✔️][✔️] ♾️ 29 > [Practical introduction to OpenTelemetry tracing](2024/day29.md) - Nicolas Fränkel
|
||||
- [✔️][✔️] ♾️ 30 > [How GitHub delivers GitHub using GitHub](2024/day30.md) - April Edwards
|
||||
- [✔️][✔️] ♾️ 31 > [GitOps on AKS](2024/day31.md) - Richard Hooper, Wesley Haakman, Karl Cooke
|
||||
- [✔️][✔️] ♾️ 32 > [Cracking Cholera’s Code: Victorian Insights for Today’s Technologist](2024/day32.md) - Simon Copsey
|
||||
- [✔️][✔️] ♾️ 33 > [GitOps made simple with ArgoCD and GitHub Actions](2024/day33.md) - Arsh Sharma
|
||||
- [✔️][✔️] ♾️ 34 > [How to Implement Automated Deployment Pipelines for Your DevOps Projects](2024/day34.md) - Neel Shah
|
||||
- [✔️][✔️] ♾️ 35 > [Azure for DevSecOps Operators](2024/day35.md) - Kevin Evans
|
||||
- [✔️][✔️] ♾️ 36 > [Policy-as-Code Super-Powers! Rethinking Modern IaC With Service Mesh And CNI](2024/day36.md) - Kat Morgan & Marino Wijay
|
||||
- [✔️][✔️] ♾️ 37 > [The Lean DevOps Playbook: Make it a success from Day one](2024/day37.md) - Aman Sharma
|
||||
- [✔️][✔️] ♾️ 38 > [Open Standards: Empowering Cloud-Native Innovation](2024/day38.md) - Kunal Verma
|
||||
- [✔️][✔️] ♾️ 39 > [Is TLS in Kubernetes really that hard to understand?](2024/day39.md) - Shivang Shandilya
|
||||
- [✔️][✔️] ♾️ 40 > [Infrastructure as Code - A look at Azure Bicep and Terraform](2024/day40.md) - Sarah Lean
|
||||
- [✔️][✔️] ♾️ 41 > [My journey to reimagining DevOps: Ushering in the Second Wave](2024/day41.md) - Brit Myers
|
||||
- [✔️][✔️] ♾️ 42 > [The North Star: Risk-driven security](2024/day42.md) - Jonny Tyers
|
||||
- [✔️][✔️] ♾️ 43 > [Let's go sidecarless in Ambient Mesh!](2024/day43.md) - Leon Nunes
|
||||
- [✔️][✔️] ♾️ 44 > [Exploring Firecracker](2024/day44.md) - Irine Kokilashvili
|
||||
- [✔️][✔️] ♾️ 45 > [Microsoft DevOps Solutions or how to integrate the best of Azure DevOps and GitHub](2024/day45.md) - Peter De Tender
|
||||
- [✔️][✔️] ♾️ 46 > [Mastering AWS Systems Manager: Simplifying Infrastructure Management](2024/day46.md) - Adit Modi
|
||||
- [✔️][✔️] ♾️ 47 > [Azure logic app, low / no code](2024/day47.md) - Ian Engelbrecht
|
||||
- [✔️][✔️] ♾️ 48 > [From Puddings to Platforms: Bringing Ideas to life with ChatGPT](2024/day48.md) - Anthony Spiteri
|
||||
- [✔️][✔️] ♾️ 49 > [From Confusion To Clarity: How Gherkin And Specflow Ensures Clear Requirements and Bug-Free Apps](2024/day49.md) - Steffen Jørgensen
|
||||
- [✔️][✔️] ♾️ 50 > [State of cloud native 2024](2024/day50.md) - Saiyam Pathak
|
||||
- [✔️][✔️] ♾️ 51 > [DevOps with Windows](2024/day51.md) - Nuno do Carmo
|
||||
- [✔️][✔️] ♾️ 52 > [Creating a custom Dev Container for your GitHub Codespace to start with Terraform on Azure](2024/day52.md) - Patrick Koch
|
||||
- [✔️][✔️] ♾️ 53 > [Gickup - Keep your repositories safe](2024/day53.md) - Andreas Wachter
|
||||
- [✔️][✔️] ♾️ 54 > [Mastering AWS OpenSearch: Terraform Provisioning and Cost Efficiency Series](2024/day54.md) - Ranjini Ganeshan
|
||||
- [✔️][✔️] ♾️ 55 > [Bringing Together IaC and CM with Terraform Provider for Ansible](2024/day55.md) - Razvan Ionescu
|
||||
- [✔️][✔️] ♾️ 56 > [Automated database deployment within the DevOps process](2024/day56.md) - Marc Müller
|
||||
- [✔️][✔️] ♾️ 57 > [A practical guide to Test-Driven Development of infrastructure code](2024/day57.md) - David Pazdera
|
||||
- [✔️][✔️] ♾️ 58 > [The Reverse Technology Thrust](2024/day58.md) - Rom Adams
|
||||
- [✔️][✔️] ♾️ 59 > [Continuous Delivery pipelines for cloud infrastructure](2024/day59.md) - Michael Lihs
|
||||
- [✔️][✔️] ♾️ 60 > [Migrating a monolith to Cloud-Native and the stumbling blocks that you don’t know about](2024/day60.md) - JJ Asghar
|
||||
- [✔️][✔️] ♾️ 61 > [Demystifying Modernisation: True Potential of Cloud Technology](2024/day61.md) - Anupam Phoghat
|
||||
- [✔️][✔️] ♾️ 62 > [Shifting Left for DevSecOps Using Modern Edge Platforms](2024/day62.md) - Michael Grimshaw & Lauren Bradley
|
||||
- [✔️][✔️] ♾️ 63 > [Diving into Container Network Namespaces](2024/day63.md) - Marino Wijay
|
||||
- [✔️][✔️] ♾️ 64 > [Let’s Do DevOps: Writing a New Terraform /Tofu AzureRm Data Source — All Steps!](2024/day64.md) - Kyler Middleton
|
||||
- [✔️][✔️] ♾️ 65 > [Azure pertinent DevOps for non-coders](2024/day65.md) - Sucheta Gawade
|
||||
- [✔️][✔️] ♾️ 66 > [A Developer's Journey to the DevOps: The Synergy of Two Worlds](2024/day66.md) - Jonah Andersson
|
||||
- [✔️][✔️] ♾️ 67 > [Art of DevOps: Harmonizing Code, Culture, and Continuous Delivery](2024/day67.md) - Rohit Ghumare
|
||||
- [✔️][✔️] ♾️ 68 > [Service Mesh for Kubernetes 101: The Secret Sauce to Effortless Microservices Management](2024/day68.md) - Mohd Imran
|
||||
- [✔️][✔️] ♾️ 69 > [Enhancing Kubernetes security, visibility, and networking control logic](2024/day69.md) - Dean Lewis
|
||||
- [✔️][✔️] ♾️ 70 > [Simplified Cloud Adoption with Microsoft's Terraforms Azure Landing Zone Module](2024/day70.md) - Simone Bennett
|
||||
- [ ][✔️] ♾️ 71 > [Chatbots are going to destroy infrastructures and your cloud bills](2024/day71.md) - Stanislas Girard
|
||||
- [ ][✔️] ♾️ 72 > [Infrastructure as Code with Pulumi](2024/day72.md) - Scott Lowe
|
||||
- [ ][ ] ♾️ 73 > [E2E Test Before Merge](2024/day73.md) - Natalie Lunbeck
|
||||
- [ ][✔️] ♾️ 74 > [Workload Identity Federation with Azure DevOps and Terraform](2024/day74.md) - Arindam Mitra
|
||||
- [ ][ ] ♾️ 75 > [Achieving Regulatory Compliance in Multi-Cloud Deployments with Terraform](2024/day75.md) - Eric Evans
|
||||
- [ ][ ] ♾️ 76 > [All you need to know about AWS CDK.](2024/day76.md) - Amogha Kancharla
|
||||
- [ ][ ] ♾️ 77 > [Connect to Microsoft APIs in Azure DevOps Pipelines using Workload Identity Federation](2024/day77.md) - Jan Vidar Elven
|
||||
- [ ][✔️] ♾️ 78 > [Scaling Terraform Deployments with GitHub Actions: Essential Configurations](2024/day78.md) - Thomas Thornton
|
||||
- [ ][✔️] ♾️ 79 > [DevEdOps](2024/day79.md) - Adam Leskis
|
||||
- [ ][ ] ♾️ 80 > [Unlocking K8s Troubleshooting Best Practices with Botkube](2024/day80.md) - Maria Ashby
|
||||
- [ ][✔️] ♾️ 81 > [Leveraging Kubernetes to build a better Cloud Native Development Experience](2024/day81.md) - Nitish Kumar
|
||||
- [ ][ ] ♾️ 82 > [Dev Containers in VS Code](2024/day82.md) - Chris Ayers
|
||||
- [ ][✔️] ♾️ 83 > [Saving Cloud Costs Using Existing Prometheus Metrics](2024/day83.md) - Pavan Gudiwada
|
||||
- [ ][✔️] ♾️ 84 > [Hacking Kubernetes For Beginners](2024/day84.md) - Benoit Entzmann
|
||||
- [ ][✔️] ♾️ 85 > [Reuse, Don't Repeat - Creating an Infrastructure as Code Module Library](2024/day85.md) - Sam Cogan
|
||||
- [ ][✔️] ♾️ 86 > [Tools To Make Your Terminal DevOps and Kubernetes Friendly](2024/day86.md) - Maryam Tavakkoli
|
||||
- [ ][✔️] ♾️ 87 > [Hands-on Performance Testing with k6](2024/day87.md) - Pepe Cano
|
||||
- [ ][✔️] ♾️ 88 > [What Developers Want from Internal Developer Portals](2024/day88.md) - Ganesh Datta
|
||||
- [ ][✔️] ♾️ 89 > [Seeding Infrastructures: Merging Terraform with Generative AI for Effortless DevOps Gardens](2024/day89.md) - Renaldi Gondosubroto
|
||||
- [ ][ ] ♾️ 90 > [Fighting fire with fire: Why we cannot always prevent technical issues with more tech](2024/day90.md) - Anaïs Urlichs
|
||||
|
||||
###
|
||||
- [ ][ ] ♾️ 91 > [Day 91 - March 31st 2024 - Closing](2024/day90.md) - Michael Cade
|
||||
|
||||
- [] ♾️ 2 > [](2024/day02.md)
|
||||
- [] ♾️ 3 > [](2024/day03.md)
|
||||
- [] ♾️ 4 > [](2024/day04.md)
|
||||
- [] ♾️ 5 > [](2024/day05.md)
|
||||
- [] ♾️ 6 > [](2024/day06.md)
|
||||
- Code, Connect, and Conquer: Mastering Personal Branding for Developers - Pavan Belagatti
|
||||
- Container Security for Enterprise Kubernetes environments - Imran Roshan
|
||||
- Navigating Cloud-Native DevOps: Strategies for Seamless Deployment - Yhorby Matias
|
||||
- Distracted Development - Josh Ether
|
||||
- Continuous Delivery: From Distributed Monolith to Microservices as a unit of deployment - Naresh Waswani
|
||||
- DevSecOps: Integrating Security into the DevOps Pipeline - Reda Hajjami
|
||||
- PCI Compliance in the Cloud - Barinua Kane
|
||||
- End to End Data Governance using AWS Serverless Stack - Ankit Sheth
|
||||
- Multi-Cloud Service Discovery and Load Balancing - Vladislav Bilay
|
||||
- Architecting the Future: Unlocking the Power of Diagrams as Code - Jason Benedicic
|
||||
- Implementing SRE (Site Reliability Engineering) - Andy Babiec
|
||||
- OSV Scanner: A Powerful Tool for Open Source Security - Paras Mamgain
|
||||
- Introduction to Database Operators for Kubernetes - Juarez Junior
|
||||
- IaC with Pulumi and GitHub Actions - Till Spindler
|
||||
- How to build DevOps skills for AI World - Aravind Putrevu
|
||||
|
||||
###
|
||||
## Sessions Accepted but now cannot deliver
|
||||
|
||||
- [] 🔐 7 > [](2024/day07.md)
|
||||
- [] 🔐 8 > [](2024/day08.md)
|
||||
- [] 🔐 9 > [](2024/day09.md)
|
||||
- [] 🔐 10 > [](2024/day10.md)
|
||||
- [] 🔐 11 > [](2024/day11.md)
|
||||
- [] 🔐 12 > [](2024/day12.md)
|
||||
- [] 🔐 13 > [](2024/day13.md)
|
||||
|
||||
###
|
||||
|
||||
- [] ⚒️ > [](2024/day14.md)
|
||||
- [] ⚒️ > [](2024/day15.md)
|
||||
- [] ⚒️ > [](2024/day16.md)
|
||||
- [] ⚒️ > [](2024/day17.md)
|
||||
- [] ⚒️ > [](2024/day18.md)
|
||||
- [] ⚒️ > [](2024/day19.md)
|
||||
- [] ⚒️ > [](2024/day20.md)
|
||||
|
||||
###
|
||||
|
||||
- [] 🚚 21 > [](2024/day21.md)
|
||||
- [] 🚚 22 > [](2024/day22.md)
|
||||
- [] 🚚 23 > [](2024/day23.md)
|
||||
- [] 🚚 24 > [](2024/day24.md)
|
||||
- [] 🚚 25 > [](2024/day25.md)
|
||||
- [] 🚚 26 > [](2024/day26.md)
|
||||
- [] 🚚 27 > [](2024/day27.md)
|
||||
|
||||
###
|
||||
|
||||
- [] 🏃 28 > [](2024/day28.md)
|
||||
- [] 🏃 29 > [](2024/day29.md)
|
||||
- [] 🏃 30 > [](2024/day30.md)
|
||||
- [] 🏃 31 > [](2024/day31.md)
|
||||
- [] 🏃 32 > [](2024/day32.md)
|
||||
- [] 🏃 33 > [](2024/day33.md)
|
||||
- [] 🏃 34 > [](2024/day34.md)
|
||||
|
||||
###
|
||||
|
||||
- [] 🕵 35 > [](2024/day35.md)
|
||||
- [] 🕵 36 > [](2024/day36.md)
|
||||
- [] 🕵 37 > [](2024/day37.md)
|
||||
- [] 🕵 38 > [](2024/day38.md)
|
||||
- [] 🕵 39 > [](2024/day39.md)
|
||||
- [] 🕵 40 > [](2024/day40.md)
|
||||
- [] 🕵 41 > [](2024/day41.md)
|
||||
|
||||
###
|
||||
|
||||
- [] 🐍 42 > [](2024/day42.md)
|
||||
- [] 🐍 43 > [](2024/day43.md)
|
||||
- [] 🐍 44 > [](2024/day44.md)
|
||||
- [] 🐍 45 > [](2024/day45.md)
|
||||
- [] 🐍 46 > [](2024/day46.md)
|
||||
- [] 🐍 47 > [](2024/day47.md)
|
||||
- [] 🐍 48 > [](2024/day48.md)
|
||||
|
||||
###
|
||||
|
||||
- [] ☁️ 49 > [](2024/day49.md)
|
||||
- [] ☁️ 50 > [](2024/day50.md)
|
||||
- [] ☁️ 51 > [](2024/day51.md)
|
||||
- [] ☁️ 52 > [](2024/day52.md)
|
||||
- [] ☁️ 53 > [](2024/day53.md)
|
||||
- [] ☁️ 54 > [](2024/day54.md)
|
||||
- [] ☁️ 55 > [](2024/day55.md)
|
||||
|
||||
###
|
||||
|
||||
- [] ⛑️ 56 > [](2024/day56.md)
|
||||
- [] ⛑️ 57 > [](2024/day57.md)
|
||||
- [] ⛑️ 58 > [](2024/day58.md)
|
||||
- [] ⛑️ 59 > [](2024/day59.md)
|
||||
- [] ⛑️ 60 > [](2024/day60.md)
|
||||
- [] ⛑️ 61 > [](2024/day61.md)
|
||||
- [] ⛑️ 62 > [](2024/day62.md)
|
||||
|
||||
###
|
||||
|
||||
- [] 🛢 63 > [](2024/day63.md)
|
||||
- [] 🛢 64 > [](2024/day64.md)
|
||||
- [] 🛢 65 > [](2024/day65.md)
|
||||
- [] 🛢 66 > [](2024/day66.md)
|
||||
- [] 🛢 67 > [](2024/day67.md)
|
||||
- [] 🛢 68 > [](2024/day68.md)
|
||||
- [] 🛢 69 > [](2024/day69.md)
|
||||
|
||||
###
|
||||
|
||||
- [] 👩🏿💻 70 > [](2024/day70.md)
|
||||
- [] 👩🏿💻 71 > [](2024/day71.md)
|
||||
- [] 👩🏿💻 72 > [](2024/day72.md)
|
||||
- [] 👩🏿💻 73 > [](2024/day73.md)
|
||||
- [] 👩🏿💻 74 > [](2024/day74.md)
|
||||
- [] 👩🏿💻 75 > [](2024/day75.md)
|
||||
- [] 👩🏿💻 76 > [](2024/day76.md)
|
||||
|
||||
###
|
||||
|
||||
- [] 🧩 77 > [](2024/day77.md)
|
||||
- [] 🧩 78 > [](2024/day78.md)
|
||||
- [] 🧩 79 > [](2024/day79.md)
|
||||
- [] 🧩 80 > [](2024/day80.md)
|
||||
- [] 🧩 81 > [](2024/day81.md)
|
||||
- [] 🧩 82 > [](2024/day82.md)
|
||||
- [] 🧩 83 > [](2024/day83.md)
|
||||
|
||||
###
|
||||
|
||||
|
||||
- [] 👷🏻♀️ 84 > [](2024/day84.md)
|
||||
- [] 👷🏻♀️ 85 > [](2024/day85.md)
|
||||
- [] 👷🏻♀️ 86 > [](2024/day86.md)
|
||||
- [] 👷🏻♀️ 87 > [](2024/day87.md)
|
||||
- [] 👷🏻♀️ 88 > [](2024/day88.md)
|
||||
- [] 👷🏻♀️ 89 > [](2024/day89.md)
|
||||
|
||||
###
|
||||
- [] 🏁 90 > [](2024/day90.md)
|
||||
- Streamlining Data Pipelines: CI/CD Best Practices for Efficient Deployments - Mounica Rajput
|
||||
- GitOps: The next Frontier in DevOps! - Megha Kadur
|
||||
- The Invisible Guardians: Unveiling the Power of Monitoring and Observability in the Digital Age - Santosh Kumar Perumal
|
||||
- Empowering Developers with No Container Knowledge to build & deploy app on OpenShift - Shan N/A
|
||||
- Building Scalable Infrastructure For Advanced Air Mobility - Dan Lambeth
|
BIN
2024/Images/YouTubePlaylist.jpg
Normal file
After Width: | Height: | Size: 4.4 KiB |
BIN
2024/Images/day02-1.jpg
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
2024/Images/day02-2.png
Normal file
After Width: | Height: | Size: 164 KiB |
BIN
2024/Images/day02-3.jpg
Normal file
After Width: | Height: | Size: 110 KiB |
BIN
2024/Images/day02-4.png
Normal file
After Width: | Height: | Size: 194 KiB |
BIN
2024/Images/day02-5.jpg
Normal file
After Width: | Height: | Size: 471 KiB |
BIN
2024/Images/day02-6.jpg
Normal file
After Width: | Height: | Size: 314 KiB |
BIN
2024/Images/day09-1.jpg
Normal file
After Width: | Height: | Size: 134 KiB |
BIN
2024/Images/day15-01.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
2024/Images/day26-1.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
2024/Images/day26-2.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
2024/Images/day26-3.png
Normal file
After Width: | Height: | Size: 93 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 540 KiB |
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 62 KiB |
After Width: | Height: | Size: 88 KiB |
After Width: | Height: | Size: 55 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 64 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 107 KiB |
After Width: | Height: | Size: 134 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 40 KiB |
After Width: | Height: | Size: 96 KiB |
After Width: | Height: | Size: 134 KiB |
After Width: | Height: | Size: 29 KiB |
@ -0,0 +1,77 @@
|
||||
Day 2: The Digital Factory
|
||||
=========================
|
||||
|
||||
## Video
|
||||
[](https://youtu.be/xeX4HGLeJQw?si=CJ75C8gUBcdWAQTR)
|
||||
|
||||
|
||||
## About Me
|
||||
I'm [Romano Roth](https://www.linkedin.com/in/romanoroth/), Chief of DevOps and Partner at [Zühlke](https://www.zuehlke.com/en). My journey with Zuhlke began 21 years ago. Over the years, I've evolved from an expert software engineer and software architect to a consultant. Throughout this journey, one question has always fueled my passion: **How can we continuously deliver value while ensuring quality and automation?**
|
||||
|
||||
When the DevOps movement began to gain momentum, I was naturally drawn to it. Today, I’m one of the organizers of the monthly [DevOps Meetup in Zürich](https://www.meetup.com/de-DE/DevOps-Meetup-Zurich/) and president of [DevOps Days Zürich](https://www.devopsdays.ch/), an annual conference part of the global DevOps movement. DevOps isn't just a professional interest; it's my passion. That’s why I’ve my own [YouTube channel](https://www.youtube.com/c/RomanoRoth), where I've curated over 100 videos centered on DevOps, architecture, and leadership.
|
||||
|
||||

|
||||
|
||||
## What is DevOps?
|
||||
DevOps is a mindset, a culture, and a set of technical practices. It provides communication, integration, automation, and close cooperation among all the people needed to plan, develop, test, deploy, release, and maintain a product.
|
||||
|
||||
In short: **Bringing People, Process, and Technology together to continuously deliver value!**
|
||||
|
||||

|
||||
|
||||
## What are the challenges with DevOps
|
||||
**Cultural Resistance:** One of the biggest challenges is changing the organizational culture. DevOps requires shifting from traditional siloed roles to a collaborative approach with shared responsibility. This can be met with resistance from teams used to working in siloed organizations.
|
||||
|
||||
**Cognitive Load:** Numerous technical practices and tools exist for various stages of the DevOps lifecycle, from ideation over continuous integration over continuous deployment to release on demand. Integrating and maintaining all these technical practices and tools to develop great products can be challenging.
|
||||
|
||||
**Scaling DevOps**: What works for a small team or a single project might not work for an entire organization. Scaling DevOps practices while maintaining speed and reliability is a significant challenge.
|
||||
|
||||

|
||||
|
||||
## How can we scale DevOps?
|
||||
Scaling DevOps, especially in larger organizations, requires a strategic approach beyond tools and technologies. Here are some considerations to scale DevOps effectively:
|
||||
- **Cultural Transformation**: Foster a collaborative environment that values learning from failures.
|
||||
- **Standardization**: Adopt consistent tools and processes across teams to maintain uniformity.
|
||||
- **Automation**: Streamline operations by automating tasks from ideation over continuous integration over continuous deployment to release on demand.
|
||||
- **Modular Architecture**: Utilize architecture styles like microservices to reduce interdependencies.
|
||||
- **Metrics**: Use metrics to measure performance, identify bottlenecks, and drive continuous improvement.
|
||||
- **Continuous Training**: Invest in ongoing skill development to ensure team members have the necessary skills to work in a DevOps environment.
|
||||
- **Feedback Loops**: Establish efficient channels for feedback to identify and address issues quickly.
|
||||
- **Decentralized Decision-making**: Empower teams to make decisions locally, reducing the need for top-down approvals and speeding up the development process.
|
||||
- **Pilot Programs**: Test and refine DevOps practices through specific pilot projects.
|
||||
- **Collaboration Platforms**: Use tools that enhance team communication like GitLab, GitHub, and Azure DevOps….
|
||||
- **Regular Reviews**: Continuously assess and adjust DevOps practices as the organization grows and changes.
|
||||
|
||||
## What is Is Platform Engineering?
|
||||
|
||||
Platform Engineering and DevOps are not the same, but they are closely related and often overlap in many organizations.
|
||||
|
||||
**DevOps** is a mindset, a culture, and a set of technical practices. It provides communication, integration, automation, and close cooperation among all the people needed to plan, develop, test, deploy, release, and maintain a product and deliver continuous value to the customer.
|
||||
|
||||
**Platform engineering** is designing and building toolchains and workflows that enable self-service capabilities for product teams that deliver continuous value to the customer.
|
||||
|
||||
**Platform engineering** uses **DevOps** practices, which enables product teams to do DevOps.
|
||||
|
||||

|
||||
|
||||
## What is a Digital Factory?
|
||||
|
||||
Throughout my work on various projects across diverse industries and clients, I've observed that **many companies share common challenges and objectives**. I think they all want to build great products, have a faster time to market, and be more efficient. And what they want is to **build up a digital factory**.
|
||||
|
||||
At the top of a company, you find the board of directors and the executive board. They shape the company's vision, mission, and strategy. All big ideas are prioritized in a **portfolio kanban**. The board prioritizes these ideas and gives product management the most important and promising ideas. For example, _building drones carrying heavy weight increases the market share_. The product management takes that idea and defines what features are needed for such a drone. Such a drone, for example, needs to have modified software, bigger batteries, and better engines. They give these features down to the teams. The existing teams have started to work on those features. For the new engine, a new team needs to be established. For that, **the platform engineering team will provide a standardized continuous delivery environment** so that that team can start right away. All the parts get assembled, and the drones can now be continuously delivered to the customers.
|
||||
|
||||
The teams constantly monitor the drones. **Telemetry and business data are collected**, like how many drones we have sold and customer satisfaction. These metrics are fed back to the portfolio level, where this information informs the board's future decisions.
|
||||
|
||||

|
||||
|
||||
## How can we implement Digital Factory?
|
||||
|
||||
To build a digital factory, you need a holistic approach.
|
||||
- **Architecture:** Design architectures that align with your technology strategy, ensuring adaptability, scalability, and flexibility.
|
||||
- **DevOps:** Utilize Platform Engineering to design and build toolchains and workflows that enable self-service capabilities for product teams to enable them to make quality and do DevOps.
|
||||
- **Data:** Streamline data pipelines for timely, actionable insights. Harness data science to extract value to inform decision-making.
|
||||
- **Customer experience:** Place user feedback at the heart of product development. Aim for a seamless end-to-end experience.
|
||||
- **Agile Programme Delivery:** Adopt a multi-team organization to optimize workflows and performance. Continuous discovery, coupled with transparent reporting, drives growth.
|
||||
- **Product Management for Maximized Value:** Connect the strategy with the execution. Align product initiatives with the company goals. Continuously refine management practices and leverage feedback for prioritization.
|
||||
|
||||

|
@ -0,0 +1,18 @@
|
||||
# Day 3: 90DaysofDevOps
|
||||
|
||||
## High-performing engineering teams and the Holy Grail
|
||||
|
||||
***Jeremy Meiss***
|
||||
- [Twitter](https://twitter.com/IAmJerdog)
|
||||
- [LinkedIn](https://linkedin.com/in/jeremymeiss)
|
||||
- [Dev.to](https://dev.to/jerdog]
|
||||
|
||||
### Overview
|
||||
|
||||
“High-performing engineering teams” are the Holy Grail for every CTO. But what are they, are they attainable, and if so, how? In this talk, we’ll look at CI/CD data from over 15mil anonymous workflows and compare it against the last few years on the CircleCI platform, and explore this rare specimen in its native habitat – right there in your organization, and how to activate them using some better DevOps and Continuous Delivery practices.
|
||||
|
||||
### Resource
|
||||
|
||||
- [2023 State of Software Delivery Report](go.jmeiss.me/SoSDR2023)
|
||||
- [2023 State of DevOps Report](https://cloud.google.com/devops/state-of-devops)
|
||||
- [2023 State of Continuous Delivery Report](https://cd.foundation/state-of-cd-2023/)
|
@ -0,0 +1 @@
|
||||
|
@ -0,0 +1,30 @@
|
||||
Day 9: Why should developers care about container security?
|
||||
=========================
|
||||
|
||||
## Video
|
||||

|
||||
|
||||
|
||||
## About Me
|
||||
[Eric Smalling](https://about.me/ericsmalling)<br>
|
||||
Staff Solutions Architect at [Chainguard](https://chainguard.dev)
|
||||
|
||||
For about 30 years, I've been an enterprise software developer, architect, and consultant with a focus on CI/CD, DevOps, and container-based solutions over the last decade.
|
||||
|
||||
I am also a Docker Captain, and am certified in Kubernetes (CKA, CKAD, CKS), and have been a Docker user since 2013.
|
||||
|
||||

|
||||
|
||||
## Description?
|
||||
Container scanning tools, industry publications, and application security experts are constantly telling us about best practices for how to build our images and run our containers.
|
||||
Often these non-functional requirements seem abstract and are not described well enough for those of us that don’t have an appsec background to fully understand why they are important.
|
||||
|
||||
This session explores several of the most common secure container practices, shows examples of how workloads can be exploited if not followed and, most importantly,
|
||||
how to easily find and fix issues when building containers BEFORE you ship them.
|
||||
Additionally, we'll discuss tactics to minimize exploit exposure by hardening runtime container and Kubernetes configurations.
|
||||
|
||||
## Links referenced in the video
|
||||
- Security Context blog: https://snyk.co/k8s-securitycontext
|
||||
- Network Policy recipes: https://github.com/ahmetb/kubernetes-...
|
||||
- Ko Build tool: https://ko.build
|
||||
- Jib Build tool: https://github.com/GoogleContainerToo...
|