Ajustando el acceso SSH e iniciando los contenedores al arranque

Complete todos los pasos descritos en página de configuración inicial antes de comenzar este tutorial. Asegúrese de haber creado el archivo ssh-key.pub siguiendo las instrucciones proporcionadas en prerequisites para el tutorial. Utilizaremos esta clave en el archivo de configuración de Butane que estamos a punto de escribir.

In this tutorial, we will set up SSH access and start a container at boot. Fedora CoreOS is focused on running applications/services in containers thus we recommend trying to run containers and avoid modifying the host directly. Running containers and keeping a pristine host layer makes automatic updates more reliable and allows for separation of concerns with the Fedora CoreOS team responsible for the OS and end-user operators/sysadmins responsible for the applications.

Como de costumbre, configuremos el inicio de sesión automático, un nombre de host, la configuración del paginador de systemd, pero además:

  • Añadiremos una Clave SSH para el usuario core desde el archivo local ssh-key.pub.

  • Añadiremos un servicio systemd (failure.service) que falla en el arranque.

  • Añade un contenedor de ejecución por medio de un Podman archivo contenedor ‘quadlet’ systemd.unit.

  • Este etcd-member.container entonces estará asociado con un etcd-member.service en el sistema en ejecución.

  • etcd-member.service lanzará y gestionará el ciclo de vida del contenedor usando podman.

Escribiremos la configuración Butane y la convertiremos a Ignition

De manera similar a lo que hicimos en el segundo escenario de aprovisionamiento, escribiremos la siguiente configuración Butane en un archivo llamado containers.bu:

Ejemplo con acceso a consola serie automática, clave SSH, y unidades systemd múltiple
variant: fcos
version: 1.6.0
passwd:
  users:
    - name: core
      ssh_authorized_keys_local:
        - ssh-key.pub
systemd:
  units:
    - name: serial-getty@ttyS0.service
      dropins:
      - name: autologin-core.conf
        contents: |
          [Service]
          # Override Execstart in main unit
          ExecStart=
          # Add new Execstart with `-` prefix to ignore failure
          ExecStart=-/usr/sbin/agetty --autologin core --noclear %I $TERM
          TTYVTDisallocate=no
    - name: failure.service
      enabled: true
      contents: |
        [Service]
        Type=oneshot
        ExecStart=/usr/bin/false
        RemainAfterExit=yes

        [Install]
        WantedBy=multi-user.target
storage:
  files:
    - path: /etc/hostname
      mode: 0644
      contents:
        inline: |
          tutorial
    - path: /etc/profile.d/systemd-pager.sh
      mode: 0644
      contents:
        inline: |
          # Tell systemd to not use a pager when printing information
          export SYSTEMD_PAGER=cat
    - path: /etc/containers/systemd/etcd-member.container
      mode: 0644
      contents:
        inline: |
          [Unit]
          Description=Run a single node etcd
          After=network-online.target
          Wants=network-online.target

          [Container]
          ContainerName=etcd
          Image=quay.io/coreos/etcd:v3.5.21
          Network=host
          Volume=etcd-data:/etcd-data
          Exec=/usr/local/bin/etcd                                \
              --name node1 --data-dir /etcd-data                  \
              --initial-advertise-peer-urls http://127.0.0.1:2380 \
              --listen-peer-urls http://127.0.0.1:2380            \
              --advertise-client-urls http://127.0.0.1:2379       \
              --listen-client-urls http://127.0.0.1:2379          \
              --initial-cluster node1=http://127.0.0.1:2380

          [Install]
          WantedBy=multi-user.target
yaml

Ejecute Butane para convertir eso a una config Ignition:

butane --pretty --strict --files-dir=./ containers.bu --output containers.ign
bash

Ahora vamos a proveerlo:

# Configura la etiqueta SELinux correcta para permitir acceso al config
chcon --verbose --type svirt_home_t containers.ign

#Inicia una máquina virtual de Fedora CoreOS
virt-install --name=fcos --vcpus=2 --ram=2048 --os-variant=fedora-coreos-stable \
    --import --network=bridge=virbr0 --graphics=none \
    --qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=${PWD}/containers.ign" \
    --disk="size=20,backing_store=${PWD}/fedora-coreos.qcow2"
bash

En la consola verás:

Fedora CoreOS 38.20230709.3.0
Kernel 6.3.11-200.fc38.x86_64 on an x86_64 (ttyS0)

SSH host key: SHA256:T5V4oXMZ0UJ7WRGzNiUOkggO7p5yojTVBUxa6N3vIoQ (ECDSA)
SSH host key: SHA256:oBAvj2kaKKKK++gnchTbxpp/iphvX6EHr0EynwXZ19c (ED25519)
SSH host key: SHA256:Yg2fdA7GC1eoHtIjawDA+WffTKTuNy5ZhQHUJx5GRHk (RSA)
enp1s0: 192.168.124.119 fe80::9b5c:330d:2020:1c9e
Ignition: ran on 2023/08/03 18:17:45 UTC (this boot)
Ignition: user-provided config was applied
Ignition: wrote ssh authorized keys file for user: core
tutorial login: core (automatic login)

Fedora CoreOS 38.20230709.3.0
[systemd]
Failed Units: 1
  failure.service
[core@tutorial ~]$

Si desea conectarse a través de SSH, desconéctese de la consola serie pulsando CTRL + ] y, a continuación, utilice la dirección IP indicada para la NIC desde la consola serie para iniciar sesión con el usuario core a través de SSH:

$ ssh core@192.168.124.119
La autenticidad del anfitrión '192.168.124.119 (192.168.124.119)' no se puede establecer.
ED25519 key fingerprint is SHA256:oBAvj2kaKKKK++gnchTbxpp/iphvX6EHr0EynwXZ19c.
Esta tecla no se conoce por ningún otro nombre
¿Seguro que quieres seguir conectándote? (yes/no/[fingerprint])? yes
Advertencia: Añadido permanentemente '192.168.124.119' (ED25519) a la lista de hosts conocidos.
Fedora CoreOS 38.20230709.3.0
Seguimiento: https://github.com/coreos/fedora-coreos-tracker
Discurso: https://discussion.fedoraproject.org/tag/coreos

Último acceso: Jue Ago  3 18:18:06 2023
[systemd]
Unidades fallidas: 1
  failure.service

El mensaje Unidades fallidas proviene de los ayudantes mensajes de ayuda para el inicio de sesión en la consola. Este ayudante en particular nos muestra cuando systemd tiene servicios que están en estado fallido. En este caso hicimos failure.service con ExecStart=/usr/bin/false, así que intencionadamente creamos un servicio que siempre fallará para ilustrar los mensajes del ayudante.

Ahora que estamos arriba y no tenemos ningún fallo real podemos comprobar el estado de etcd-member.service, que se generó a partir de nuestro archivo etcd-member.container.

[core@tutorial ~]$ systemctl status --full etcd-member.service
● etcd-member.service - Run a single node etcd
     Cargado: cargado (/etc/containers/systemd/etcd-member.container; generado)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: active (running) desde Jue 03/08/2023 18:17:57 UTC; hace 2min 24s
   PID maestra: 1553 (usual)
      Tareas: 10 (límite: 2238)
     Memoria: 86.5M
        CPU: 3.129s
     CGroup: /system.slice/etcd-member.service
             ├─libpod-payload-31af97b0ef902b3b3b3d717bd98947b209701b9585db2129ca53f4b33962415e
             │ └─1555 /usr/local/bin/etcd ...
             └─runtime
               └─1553 /usr/bin/conmon ...

Aug 03 18:17:58 tutorial etcd[1553]: 2023-08-03 18:17:58.745207 I | raft: b71f75320dc06a6c se convirtió en candidato a término 2
Aug 03 18:17:58 tutorial etcd[1553]: 2023-08-03 18:17:58.745372 I | raft: b71f75320dc06a6c recibido MsgVoteResp desde b71f75320dc06a6c en terminal 2
Aug 03 18:17:58 tutorial etcd[1553]: 2023-08-03 18:17:58.745499 I | raft: b71f75320dc06a6c se convirtió en líder en terminal 2
Aug 03 18:17:58 tutorial etcd[1553]: 2023-08-03 18:17:58.745628 I | raft: raft.node: b71f75320dc06a6c líder electo b71f75320dc06a6c en terminal 2
Aug 03 18:17:58 tutorial etcd[1553]: 2023-08-03 18:17:58.746402 I | etcdserver: configuración de la versión inicial del clúster para 3.3
Aug 03 18:17:58 tutorial etcd[1553]: 2023-08-03 18:17:58.747906 N | etcdserver/afiliación: establecer la versión inicial del clúster en 3.3
Aug 03 18:17:58 tutorial etcd[1553]: 2023-08-03 18:17:58.748211 I | etcdserver/api:capacidades habilitadas para la versión 3.3
Aug 03 18:17:58 tutorial etcd[1553]: 2023-08-03 18:17:58.748384 I | etcdserver: publicado {Name:node1 ClientURLs:[http://127.0.0.1:2379]} para racimo 1c45a069f3a1d796
Aug 03 18:17:58 tutorial etcd[1553]: 2023-08-03 18:17:58.748510 I | embed: preparado para servir soluciones cliente
Aug 03 18:17:58 tutorial etcd[1553]: 2023-08-03 18:17:58.750778 N | embed: sirviendo solicitud cliente insegura en 127.0.0.1:2379, esto es fuertemente desanimado!

También podemos inspeccionar el estado del contenedor que fue ejecutado por el servicio systemd:

[core@tutorial ~]$ sudo podman ps -a
CONTENEDOR ID  IMAGEN                       COMANDO               CREADO        ESTADO        PUERTOS       NOMBRES
31af97b0ef90  quay.io/coreos/etcd:latest  /usr/local/bin/et...  hace 4 minutos  Lleva 4 minutos              etcd

Y podemos establecer una pareja clave/valor en etcd. Por ahora vamos a establecer la clave fedora al valor fun:

[core@tutorial ~]$ curl -L http://127.0.0.1:2379/v3/kv/put -X POST -d '{"key": "ZmVkb3Jh", "value": "ZnVu"}'
{"header":{"cluster_id":"2037210783374497686","member_id":"13195394291058371180","revision":"4","raft_term":"2"}}
[core@tutorial ~]$ curl -sL http://127.0.0.1:2379/v3/kv/range -X POST -d '{"key": "AA==", "range_end": "AA=="}' | jq
{
  "header": {
    "cluster_id": "2037210783374497686",
    "member_id": "13195394291058371180",
    "revision": "4",
    "raft_term": "2"
  },
  "kvs": [
    {
      "key": "ZmVkb3Jh",
      "create_revision": "2",
      "mod_revision": "4",
      "version": "2",
      "value": "ZnVu"
    }
  ],
  "count": "2"
}

¡Parece que todo está funcionando!

Vaciado

Ahora vamos a destruir la instancia para la siguiente prueba. Desconéctate de la consola serie pulsando CTRL + ] o desde SSH y luego destruye la máquina:

virsh destroy fcos
virsh undefine --remove-all-storage fcos

Ahora puede proceder con el siguiente tutorial.