Docker para ciência de dados

7

Recentemente, comecei a ler artigos sobre o Docker.
Para mim, na ciência de dados, o Docker é útil porque:

1) Você possui um ambiente totalmente diferente, que o protege contra problemas de bibliotecas e dependências.

2) Se seu aplicativo modificar, por exemplo, o banco de dados da sua empresa, primeiro você deve garantir que o código funcione bem e que não tenha consequências ruins no banco de dados. Portanto, você usa o Docker para testar seu código primeiro.

minhas perguntas:

  • Estou certo se disser que apenas o segundo motivo é sobre boxe na areia? A primeira razão não tem nada a ver com o boxe na areia, certo?

  • Existem outras razões pelas quais o Docker é útil na ciência de dados?

  • Não encontro muitos trabalhos de pesquisa interessantes sobre o Docker para ciência de dados. Você conhece alguns famosos?

nolw38
fonte
Por fim, terminou de incorporar e respondeu provavelmente todas as suas perguntas e fez uma descrição detalhada dos recursos da parte + de segurança de conferências e casos de uso sobre por que e como o Data Scientist usa contêineres. Por favor, deixe-me saber se você precisa versão mais detalhada :)
n1tk

Respostas:

4

Em vez de focar no termo de tecnologia, fornecerá uma resposta generalizada e usará o termo “contêineres”.

Os contêineres executam apenas o que deveria ser executado, assumindo que algo desconhecido não é confiável; portanto, o que só reside no contêiner apenas durante a vida útil do contêiner; portanto, a modificação de um código no banco de dados para testar será a mesma abordagem em VMs (sandboxing) ou contêineres (janela de encaixe) e a maior diferença é o consumo de recursos e o tempo necessário para provisionar VMs versus girar contêineres / pods em alguns segundos para o aplicativo.

Mais detalhes:

Part1_ Do ponto de vista do aplicativo

Os contêineres são muito importantes quando se trata do mundo da ciência de dados a partir dos seguintes pontos:

  • Minimizar versões de bibliotecas conflitantes para diferentes projetos de desenvolvimento (cada projeto possui contêiner / pod próprio para execução).
  • Consistência entre ambientes e desenvolvedores em relação a critérios de design específicos.
  • Prototipagem Rápida com Nó de Borda Sob Demanda.

  • Evitando a necessidade de reinstalar tudo no novo hardware após uma atualização ou falha.

  • Portabilidade do seu ambiente de computação, desenvolver em sua máquina e se precisar de mais recursos, como CPU, RAM ou GPU você pode porta o seu ambiente de nuvem, grupos poderosos, máquina poderosa, grupo de recipientes que podem ser orquestradas com Kubernetes cluster ou Dockerized chamado Swarm .
  • Maximize a clareza da colaboração entre grupos. Bibliotecas consistentes, conjuntos de resultados etc.
  • Ampliando a autonomia / agilidade local para escalar e alcançar a nuvem.
  • Espaços de trabalho do projeto equipados com contêineres Docker para controle sobre a configuração do ambiente. Você pode instalar novos pacotes ou executar scripts de linha de comando diretamente do terminal interno.
  • Os recursos usados ​​pelos contêineres são muito poucos em comparação com o VM ou o Bare metal ... você pode ter vários contêineres em execução no VM ou no Bare metal, o que reduzirá bastante o custo de licença do SO e os projetos / aplicativos serão escalados com base nos recursos necessários e não nos recursos completos do host (observe aqui: você executará vários aplicativos / modelos em uma máquina ao usar contêineres comparados sem contêineres, usará recursos completos da máquina para um único aplicativo / modelo e isso é desperdício de recursos. Em ambientes de cluster, é possível gire vários pods / contêineres (aplicativos / modelos em todo o cluster e com custo zero do pod em comparação com VMs que você paga pelo SO de cada host e executa todos os recursos para essa tarefa).
  • fácil ter nova imagem com novos pacotes instalados e compartilhar com todos para lidar com ambientes virtuais em VMs e ter conflito de pacotes e muito mais (gostaria que os ambientes virtuais fossem movidos da abordagem tradicional para contêineres, isso será uma boa aprimoramento e ajudará muito os cientistas de dados a contornar a configuração de cada projeto individualmente com todos os conflitos e ativar / desativar e, em seguida, procurar requisitos ao colocar em produção, quando com contêineres tudo o que você precisa é um arquivo de configuração, este é o meu ponto de vista o que vejo diariamente no mundo da ciência de dados).
  • A plataforma independente de infraestrutura permite que os cientistas de dados executem os aplicativos de análise na infraestrutura melhor otimizada para os aplicativos
  • Capacite os cientistas de dados a criar modelos com as ferramentas e pacotes mais adequados para a pesquisa sem se preocupar com conflitos de aplicativos e ambiente.
  • Reprodutibilidade de pesquisa mais importante: o SCALE fornecido pelos contêineres, você escala facilmente com os contêineres e será idêntico em todos os ambientes e não se importa com o SO host, garantindo a repetibilidade da análise e pesquisa com contêineres imutáveis ​​e eliminando problemas em diferentes ambientes
  • Colaboração segura: A segurança integrada na plataforma e no ciclo de vida permite a colaboração sem risco de violação e integridade dos dados (mais detalhes nas Partes 2 e 3.

Aí entra Cloudera com o Cloudera Data Science Workbench e o Anaconda com o Anaconda Enterprise, ambos usam contêineres, portanto, podem trazer resultados rápidos para os negócios e implantar facilmente os modelos, do dev ao controle de qualidade e, finalmente, à produção.

Por que a última declaração é importante? é ter portabilidade de dev para prod sem alterações nos ambientes e sem custos para a parte operacional do DevOps.

Part2_ Do ponto de vista da segurança

Uma vantagem de segurança notória é que a segurança do sistema operacional host é separada do contêiner, o que significa que o sistema operacional com patches separado não afetaria seu aplicativo em contêiner (quantas vezes temos o problema ao corrigir o sistema operacional e afetar o aplicativo e serviço nesse SO (caminhos, portas, serviços etc.)?

  • Por exemplo: se você tiver um librarycódigo malicioso em seu aplicativo / código, esse malware residirá apenas nesse contêiner enquanto o contêiner estiver ativo, os contêineres serão executados como ponto de extremidade o tempo todo e não viram um caso que espalhe o malware na rede.
  • o monitoramento de um nó de contêiner é robusto e você pode colocar um complemento ou serviço para monitorar comportamentos de aplicativo ou nó e replicará apenas apenas um novo nó / contêiner e apenas com base no arquivo de configuração.

Comparando VMs x contêineres: com contêineres é uma história diferente, você cuida do SO separado dos contêineres (contêineres é uma tarefa separada quando a segurança está em vigor).

A segurança do Docker fornece informações detalhadas dos principais pontos de segurança.

Os padrões e conformidade do Docker fornecem uma lista completa de padrões e conformidade de segurança disponíveis para contêineres.

"O contêiner do Docker com um perfil seccomp bem criado (que bloqueia chamadas inesperadas do sistema) fornece segurança aproximadamente equivalente a um hipervisor".

Compartilhamento de pasta . Com os contêineres, você pode compartilhar uma pasta configurando uma montagem compartilhada e, como o Docker / kernel impõe permissões de arquivo usadas pelos contêineres, o sistema convidado não pode ignorar essas restrições. Isso é muito importante para aplicativos e usuários de ciência de dados, porque na empresa são usados ​​na maioria das vezes dados confidenciais / restritos e várias camadas de segurança ou restrições, uma abordagem para resolver esse problema de segurança é usar VDI ou VMs que com o grupo AD para restringir / compartilhar o acesso a dados e se torna problemático e dispendioso para manter e alocar recursos.

Quando se trata de depurar aplicativos ou SO com todos os serviços e logs gerados, acho que os contêineres estão ganhando e evoluindo agora para a abordagem da PNL: Um utilitário experimental de processamento de linguagem natural (PNL) também está incluído, para revisar narrativas de segurança.

Aqui vou citar Jianing Guo do Google: Uma VM devidamente protegida e atualizada fornece isolamento no nível do processo que se aplica a aplicativos regulares e cargas de trabalho de contêiner, e os clientes podem usar os módulos de segurança Linux para restringir ainda mais a superfície de ataque de um contêiner. Por exemplo, o Kubernetes, um sistema de orquestração de contêineres de código aberto para produção, suporta a integração nativa com AppArmor, Seccomp e SELinux para impor restrições aos syscalls expostos a contêineres. O Kubernetes também fornece ferramentas adicionais para suportar ainda mais o isolamento de contêineres. O PodSecurityPolicy permite que os clientes imponham restrições sobre o que uma carga de trabalho pode fazer ou acessar no nível do Nó. Para cargas de trabalho particularmente sensíveis que exigem isolamento no nível da VM,

Acima de tudo, o cluster kubernetes possui os seguintes recursos de segurança adicionais:

  1. Use TLS (Transport Layer Security) para todo o tráfego da API
  2. Autenticação de API
  3. Autorização de API
  4. Correção fácil de falhas de segurança e impacto mínimo no aplicativo / ambiente em comparação com VMs ou Bare metal dedicado.

Part3_ CIS benchmarks para o endurecimento recipientes: Docker & Kubernetes.

  1. A primeira etapa para tornar os contêineres mais seguros é preparar a máquina host planejada para a execução de cargas de trabalho com contenção. Ao proteger o host de contêineres e seguir as práticas recomendadas de segurança da infraestrutura, criaria uma base sólida e segura para a execução de cargas de trabalho em contêiner.

  2. Mantenha-se atualizado sobre as atualizações do Docker, vulnerabilidades no software.

  3. Tenha um diretório dedicado específico para arquivos relacionados ao Docker e aloque espaço suficiente para ver os contêineres serem executados (o caminho padrão é /var/lib/dockerapenas mudar para outro ponto de montagem e monitorar no nível do sistema operacional usando auditdou aide servicespara alterações ou tamanho / carga de trabalho indesejada, mantenha os logs e configure de acordo com as necessidades.

Nota: A melhor parte step 2é que, com VMs, você precisa monitorar muito mais locais para seu projeto de ciência de dados (bibliotecas em locais diferentes, várias versões de pacotes, locais / caminho até para python, execute cron jobs or systemdpara garantir que algum processo seja executado, faça logon de todos os logs etc, mas com contêineres é um ponto único para que todos esses trabalhos sejam executados e monitorem apenas um caminho em vez de vários).

  1. Verifique o tempo todo os usuários no dockergrupo para impedir unauthorized elevated accesso acesso ao sistema (o Docker permite o compartilhamento de diretório entre o host do Docker e um contêiner de convidado sem limitar os direitos de acesso do contêiner). Portanto, remova todos os usuários não confiáveis ​​do dockergrupo e não crie um mapeamento de diretórios confidenciais limita o host a volumes de contêiner. Aqui eu diria para usar um usuário separado para a instalação e tarefas específicas de contêiner "NUNCA usar rootpara contêineres executados dedique PIDapenas uma tarefa (terá acesso elevado, mas será baseado em tarefas, uso gravitacional para o cluster e ao instalar NUNCA use root).

  2. Audite todas as atividades do daemon do Docker (lembre-se de ocupar espaço nos logs em "mundo" em contêiner; portanto, prepare uma partição separada com espaço decente para armazenar os logs e a configuração necessária (rotação e período para armazenar os logs).

  3. Audite todos os arquivos do Docker e docker.service, etc, var e o que mais é aplicável.

  4. Restrinja toda a comunicação entre contêineres, vincule contêineres específicos que exijam comunicação (o melhor será criar uma rede personalizada e unir os contêineres que precisam se comunicar com essa rede personalizada). Essa abordagem de proteção impedirá a divulgação não intencional e indesejada de informações para outros contêineres.

  5. Todos os aplicativos na infraestrutura em contêiner devem ser configurados ou pelo menos ter essa opção Encryp All Sensitive Information(isso é muito importante para o Data Scientist, porque na maioria das vezes fazemos login nas plataformas para obter dados, inclusive sensitive datapara a empresa.

  6. Tem a opção de ter todas as informações confidenciais criptografadas em trânsito.

  7. Utiliza apenas aprovações específicas específicas Ports, Protocols and Services, as VMs têm uma superfície mais aberta quando um aplicativo / projeto é executado, com contêineres que você especifica apenas o que será usado e não se pergunta se todas as outras portas estão ouvindo, protocolos e serviços que são executados no nível do SO para proteger ou monitor, isso minimiza o "attack surface".

  8. As informações confidenciais armazenadas nos sistemas são criptografadas em repouso e requerem um mecanismo secundário de autenticação, não integrado ao sistema operacional, para acessar as informações.

  9. Permite ser ativado Operating System Anti-Exploitation Features/Deploy Anti-Exploit Technologies: como Data Execution Prevention(DEP)ou Address Space Layout Randomization (ASLR).

  10. A melhor diferença de segurança simples entre VMs e Containers é: ao atualizar ou executar um projeto, você não precisa de acesso elevado para fazê-lo em toda a VM ou rede, basta executar como um usuário definido e, se houver acesso elevado, existe apenas para o horário do contêiner e não é compartilhado entre o host (aqui vêm as bibliotecas da Data Science instalam, atualizam, executam o código do projeto etc.).

Part4_ Mais recursos (além dos links incorporados na Parte 1-3) relacionados aos contêineres para Data Science:

  1. Ciência de dados na janela de encaixe
  2. Conda, Docker e Kubernetes: o futuro nativo da nuvem da ciência de dados (patrocinado pela Anaconda)
  3. https://devblogs.nvidia.com/making-data-science-teams-productive-kubernetes-rapids/
  4. Por que os cientistas de dados amam o Kubernetes
  5. Um livro muito bom para entender o uso do docker para Data Science: Docker for Data Science: construindo uma infraestrutura de dados escalável e extensível em torno do servidor de notebook Jupyter .
n1tk
fonte
Muito obrigado !! Mas você não mencionou os motivos de segurança?
Nolw38 18/08/19
1

Com o Docker Swarm Mode, você pode configurar seu próprio cluster seguro de máquinas de baixo custo.

  • Portanto, se você estiver no processo distribuído de grandes conjuntos de dados, o Docker Swarm (e, em alternativa, talvez a ferramenta de gerenciamento de contêineres Kubernetes) pode ser a base para a implantação do Apache Spark (ou software semelhante) em muitos contêineres (e / ou hosts), para processamento paralelo.

  • Se você estiver analisando em tempo real os fluxos de dados, poderá expandir o cluster com relativa facilidade, de acordo com a demanda atual, sem comprar muitos equipamentos de rede caros ou software de gerenciamento dispendioso de fornecedores de tecnologias de virtualização.

(Eu não fiz isso pessoalmente, exceto por exemplos de brinquedos no contexto dos MOOCs. No entanto, aqui está uma postagem de blog de abril de 2019 sobre o Spark on Docker Swarm, por outra pessoa. - lembre-se de que o Swarm Mode já estava disponível apenas para o Docker Enterprise Edition , não a Community Edition gratuita. Agora, a documentação não diz mais isso, mas não tenho certeza)

knb
fonte
1

Ambas as razões são sobre ambientes virtuais e a cultura devops que integra atividades de desenvolvimento e operacionais. Prefiro usar a terminologia "ambiente de teste" do que o sandboxing para descrever essa função.

O Docker é útil para ferramenta de ciência de dados. Outras razões podem incluir isso facilita a colaboração entre diferentes partes, porque todo mundo está usando a mesma imagem (seu ponto de vista sobre dependências e problemas de bibliotecas) e facilita o compartilhamento e o gerenciamento de seu aplicativo / código / fluxo de trabalho com qualquer pessoa independente do sistema operacional que eles usam. Basicamente, é útil compartilhar código, seu gerenciamento com terceiros e solicitações de usuários em relação às dependências da biblioteca etc.

Não conheço trabalhos de pesquisa interessantes, mas acho que a pergunta é um pouco semelhante a perguntar, existem trabalhos de pesquisa interessantes sobre Python ou R.

Dr. H. Lecter
fonte
Então, na ciência de dados, o Docker não tem nada a ver com o Sandboxing? E o motivo da segurança seria melhor "Ter um ambiente de teste para o aplicativo"?
Nolw38 17/08/19
Não, eu quis dizer que o sandboxing é uma das muitas aplicações. O ambiente de teste é um pouco maior porque você deseja que seu ambiente seja o mais próximo possível daquele em que você executa suas operações e inclua sandboxing, mas também a correção de erros, por exemplo. Por segurança, está relacionado à cultura de devops na qual você não quer mexer com o que está funcionando (operações, por exemplo, seu banco de dados no exemplo que você deu) e desenvolvimentos (tentando coisas novas).
Dr. H. Lecter