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.
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.
Também tem a ver mais o que cada comando com
podman pod faz:
# podman pod create --help
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
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
Acesso via browser na porta 8080:
Pronto!
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