Pods com Podman

O conceito de pod foi introduzido pelo Kubernetes. Um pod é um grupo de contêineres que operam juntos. O Podman usa um conceito semelhante para gerenciar um grupo de contêineres em um servidor local. Todos os contêineres dentro do pod compartilham o mesmo namespace de rede, então eles podem se comunicar facilmente pelo localhost sem a necessidade de exportar nenhuma porta extra.

[ Hits: 5.556 ]

Por: Daniel Lara Souza em 14/10/2020 | Blog: http://danniel-lara.blogspot.com/


Pod



As pessoas associam Pods em execução ao Kubernetes. E quando eles executam contêineres em seus tempos de execução de desenvolvimento, eles nem mesmo pensam na função que os pods podem desempenhar - mesmo em um tempo de execução localizado.

A maioria das pessoas que vem do mundo Docker de execução de contêineres únicos, não imagina o conceito de execução de pods. Existem vários bons motivos para considerar o uso de pods localmente, além do uso de pods para agrupar naturalmente seus contêineres.

Por exemplo, suponha que você tenha vários contêineres que requerem o uso de um contêiner MariaDB. Mas você prefere não vincular esse banco de dados a uma rede roteável, em sua ponte ou mais longe. Usando um pod, você pode vincular ao localhost endereço do pod e todos os contêineres nesse pod poderão se conectar a ele devido ao espaço de nome de rede compartilhado.

O conceito de pod foi introduzido pelo Kubernetes. Os pods do Podman são semelhantes à definição do Kubernetes.
Linux: Pods com Podman
Cada pod do Podman inclui um contêiner "infra". Este contêiner não faz nada, mas vai dormir. Sua finalidade é manter os namespaces associados ao pod e permitir que o Podman conecte outros contêineres ao pod. Isso permite que você inicie e interrompa os contêineres no POD e o pod permanecerá em execução, onde, como se o contêiner principal controlasse o pod, isso não seria possível.

O infra-contêiner padrão é baseado na k8s.gcr.io/pauseimagem. A menos que você diga explicitamente o contrário, todos os pods terão um contêiner baseado na imagem padrão.

A maioria dos atributos que compõem o Pod são na verdade atribuídos ao contêiner "infra". Ligações de portas, valores cgroup-parent e namespaces de kernel são todos atribuídos ao contêiner "infra". É fundamental entender isso, porque uma vez que o pod é criado, esses atributos são atribuídos ao contêiner "infra" e não podem ser alterados.

Por exemplo, se você criar um pod e mais tarde decidir que deseja adicionar um contêiner que vincule novas portas, o Podman não poderá fazer isso. Você precisaria recriar o pod com as ligações de porta adicionais antes de adicionar o novo contêiner.

No diagrama acima, observe a caixa acima de cada contêiner, conmon, este é o monitor do contêiner. É um pequeno programa C, cujo trabalho é observar o processo primário do contêiner e, se o contêiner morrer, salve o código de saída. Ele também mantém aberto o TTY do contêiner, para que possa ser anexado posteriormente. Isso é o que permite que o Podman seja executado em modo separado (em segundo plano), para que o Podman possa sair, mas o conmon continue a ser executado. Cada contêiner tem sua própria instância de conmon.

Para usar pods com Podman, é fácil:

# podman pod [comando]

Onde podemos criar, reiniciar, excluir, listar.
Linux: Pods com Podman
Também tem a ver mais o que cada comando com podman pod faz:

# podman pod create --help
Linux: Pods com Podman
Bom, agora vamos subir uma aplicação em um pod no Podman, vamos usar algo simples, um banco de dados com MariaDB e um WordPress.

Bora lá, vamos criar o primeiro pod, vamos criar e já deixar uma porta publicada no caso a 8080 para a interna 80:

# podman pod create --name web -p 8080:80

Verificar:

# podman pod ls
Linux: Pods com Podman
Vamos agora rodar o nosso banco de dados em MariaDB já definindo senha, nome do banco:

# podman run \
-d --restart=always --pod=web \
-e MYSQL_ROOT_PASSWORD="centos" \
-e MYSQL_DATABASE="wp" \
-e MYSQL_USER="wordpress" \
-e MYSQL_PASSWORD="w0rdpr3ss" \
--name=dbwp mariadb


Agora vamos rodar o WordPress passando os paramentos de acesso ao banco local:

# podman run \
-d --restart=always --pod=web \
-e WORDPRESS_DB_NAME="wp" \
-e WORDPRESS_DB_USER="wordpress" \
-e WORDPRESS_DB_PASSWORD="w0rdpr3ss" \
-e WORDPRESS_DB_HOST="127.0.0.1" \
--name webwp wordpress


Agora vamos ver se está ok:

# podman ps -a --pod
Linux: Pods com Podman
Acesso via browser na porta 8080:
Linux: Pods com Podman
Pronto!
Linux: Pods com Podman
Bom, como falado no inicio, os pods do Podman são semelhantes à definição do Kubernetes e com isso posso gerar um arquivo YAML, o meu pod e exporta para um ambiente rodando Kubernetes.

Execute o comando:

# podman generate kube web >> web.yaml

E ao visualizar o conteúdo:

# cat web.yaml
# Generation of Kubernetes YAML is still under development!
#
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-1.6.4
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2020-09-30T00:26:23Z"
  labels:
    app: web
  name: web
spec:
  containers:
  - command:
    - mysqld
    env:
    - name: PATH
      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: TERM
      value: xterm
    - name: HOSTNAME
      value: web
    - name: container
      value: podman
    - name: GOSU_VERSION
      value: "1.12"
    - name: MARIADB_MAJOR
      value: "10.5"
    - name: MYSQL_DATABASE
      value: wp
    - name: MYSQL_USER
      value: wordpress
    - name: GPG_KEYS
      value: 177F4010FE56CA3336300305F1656F24C74CD1D8
    - name: MARIADB_VERSION
      value: 1:10.5.5+maria~focal
    - name: MYSQL_ROOT_PASSWORD
      value: centos
    - name: MYSQL_PASSWORD
      value: w0rdpr3ss
    image: docker.io/library/mariadb:latest
    name: dbwp
    ports:
    - containerPort: 80
      hostPort: 8080
      protocol: TCP
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities: {}
      privileged: false
      readOnlyRootFilesystem: false
    workingDir: /
  - command:
    - apache2-foreground
    env:
    - name: PATH
      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: TERM
      value: xterm
    - name: HOSTNAME
      value: web
    - name: container
      value: podman
    - name: PHP_ASC_URL
      value: https://www.php.net/distributions/php-7.4.10.tar.xz.asc
    - name: WORDPRESS_DB_USER
      value: wordpress
    - name: PHP_INI_DIR
      value: /usr/local/etc/php
    - name: APACHE_ENVVARS
      value: /etc/apache2/envvars
    - name: PHP_LDFLAGS
      value: -Wl,-O1 -pie
    - name: GPG_KEYS
      value: 42670A7FE4D0441C8E4632349E4FDC074A4EF02D 5A52880781F755608BF815FC910DEB46F53EA312
    - name: PHP_MD5
    - name: APACHE_CONFDIR
      value: /etc/apache2
    - name: PHP_EXTRA_CONFIGURE_ARGS
      value: --with-apxs2 --disable-cgi
    - name: PHP_CPPFLAGS
      value: -fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
    - name: PHP_SHA256
      value: c2d90b00b14284588a787b100dee54c2400e7db995b457864d66f00ad64fb010
    - name: WORDPRESS_SHA1
      value: d3316a4ffff2a12cf92fde8bfdd1ff8691e41931
    - name: WORDPRESS_DB_NAME
      value: wp
    - name: WORDPRESS_DB_PASSWORD
      value: w0rdpr3ss
    - name: WORDPRESS_DB_HOST
      value: 127.0.0.1
    - name: PHP_EXTRA_BUILD_DEPS
      value: apache2-dev
    - name: PHP_VERSION
      value: 7.4.10
    - name: PHP_URL
      value: https://www.php.net/distributions/php-7.4.10.tar.xz
    - name: WORDPRESS_VERSION
      value: 5.5.1
    - name: PHPIZE_DEPS
      value: "autoconf \t\tdpkg-dev \t\tfile \t\tg++ \t\tgcc \t\tlibc-dev \t\tmake
        \t\tpkg-config \t\tre2c"
    - name: PHP_CFLAGS
      value: -fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
    image: docker.io/library/wordpress:latest
    name: webwp
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities: {}
      privileged: false
      readOnlyRootFilesystem: false
    workingDir: /var/www/html
status: {}


Também podemos subir em outra máquina com o Podman só copiar o arquivos ".yaml" e rodar o comando:

# podman play kube ./web.yaml

Espero que ajude.

Guia de Referência


   

Páginas do artigo
   1. Pod
Outros artigos deste autor

GlusterFS - Um Sistema de Arquivos Distribuídos (parte 2)

Instalando Fedora CoreOS no KVM

AlmaLinux - Sua Alternativa ao CentOS

Docker Swarm no CentOS 8

Podman - um mecanismo de contêiner sem daemon

Leitura recomendada

Instalando Openshift Origin 3.11 com Ansible

Inicializando servidor Ubuntu na AWS e rodando apache em Container

Docker: Uma abordagem didática para tempos obscuros

Docker Swarm no CentOS 8

Configurando Docker Swarm no Rocky Linux

  
Comentários
[1] Comentário enviado por maurixnovatrento em 15/10/2020 - 13:23h

Muito Bom.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]




Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts