Red Hat OpenShift Image Registry not configured

Wer einfach zum spielen einen OpenShift Cluster (Assisted über Web mit je einer Zusatzdisk (200 GB pro Knoten) damit OpenShift Data Foundation einen StorageCluster mit Ceph erzeugt) erzeugt hat zwar am Ende einen Cluster aber keine (funktionierende) Image Registry (weil die kein Storage hat), will man eine Application dann deployen schlägt man sehr schnell (in meinem Fall beim Build) bei “Image Registry not configured” (oder so ähnlich, in irgendwelchen Events) auf.

Habs vermutlich nur überlesen aber man muss der Registry Storage besorgen (PVC, oc apply -f meineregistry.yml) und mitteilen (Cluster Config):

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: registry-storage-pvc
namespace: openshift-image-registry
spec:
accessModes:
  - ReadWriteMany
resources:
  requests:
     storage: 100Gi
storageClassName: ocs-storagecluster-cephfs
oc patch config.image/cluster -p '{"spec":{"managementState":"Managed","replicas":2,"storage":{"managementState":"Unmanaged","pvc":{"claim":"registry-storage-pvc"}}}}' --type=merge

Quelle (für 4.13, Version auswählbar): https://docs.openshift.com/container-platform/4.13/registry/configuring_registry_storage/configuring-registry-storage-rhodf.html#registry-configuring-registry-storage-rhodf-cephfs_configuring-registry-storage-rhodf

Superbilliger hochverfügbarer Ingress Load Balancer

Hintergrund: Kubernetes, mehrere Ingresses, 3 Ingressknoten (ingress1-3.fun), ein Ingress/Service kann mit Prefixen nicht umgehen (absoluter Redirect) – daher verschiedene externe Namen und ein externer Load Balancer notwendig (webservice1+2.fun).

Superbillige Lösung:

  • 2 VMs (1 vCPU, 1 GB RAM, 10 GB Disk)
  • je eine für Zielclients erreichbare Adresse für webservice1+2.fun
  • HAProxy mit zwei frontends für webservice1+2.fun
  • keepalived mit VRRP Failover (die zwei öffentlichen Adressen)
  • Ingress Rules gehen auf die Namen, also http://webserviceX.fun/ => pod_für_webserviceX:port_für_webserviceX
/etc/haproxy/haproxy.cfg:

frontend webservice1
    bind webservice1.fun:80
    mode tcp
    default_backend backendnodes

frontend webservice2
    bind webservice2.fun:80
    mode tcp
    default_backend backendnodes

backend backendnodes
    balance source
    server node1 ingress1.fun:80 check
    server node2 ingress2.fun:80 check
    server node3 ingress3.fun:80 check

/etc/keepalived/keepalived.conf:

vrrp_instance VI_1 {
    state MASTER    # BACKUP am zweiten Knoten
    interface eth0
    virtual_router_id 51
    priority 255    # 254 am zweiten Knoten
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345
    }
    virtual_ipaddress {
        1.2.3.1/24          # öffentliche Adresse webservice1.fun
        1.2.3.2/24          # öffentliche Adresse webservice2.fun
    }

    notify_master "systemctl restart haproxy"
}

Durch das “notify_master” wird nach Failover der Adresse der HAProxy am jeweiligen Knoten neu gestartet und kann sich auf die virtuellen Adressen binden.

Mit “vrrp_track_process”/”track_process” oder “vrrp_script”/”track_script” könnte man noch Healthprobes (Existenz eines Prozesses – haproxy in diesem Fall oder ganzes Healthcheck Script) einführen – in der o.a. Konfiguration spricht keepalived nur an wenn VRRP Heartbeats vom MASTER nicht mehr ankommen.

Ingress spec (Controller=ingress-nginx):

spec:
  ingressClassName: nginx
  rules:
    - host: webservice1.fun
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: webservice1-server
                port:
                  number: 80

Das Ganze macht mit HTTPS dann naturgemäß 200x mal mehr Spaß 😀

WinRT mit C# in WinForms (.NET Framework)

  • Normales WinForms Projekt erzeugen
  • NuGet Package Management Format auswählbar machen:
    • Tools / Options / NuGet Package Manager / Allow format selection on first package install
  • NuGet Microsoft.Windows.SDK.Contracts mit der Version passend zur gewünschten Mindest-Windows-Version installieren
    • wenn die Auswahl PackageReference auswählen
  • Fröhlich WinRT Methoden verwenden, Beispiel (völlig non-async mal zur Abwechslung):
public static void SetLockscreen(string sUserPaper)
{
   Windows.Storage.StorageFile oUserPaper;

   oUserPaper=Windows.Storage.StorageFile.GetFileFromPathAsync(sUserPaper).AsTask().GetAwaiter().GetResult();
   Windows.System.UserProfile.LockScreen.SetImageFileAsync(oUserPaper).AsTask().Wait();
}

FIDO2/U2F Key für SUDO nutzen (Arch)

PAM Modul installieren

sudo pacman -S pam-u2f

Token für User registrieren

mkdir ~/.config/u2f
pamu2fcfg >~/.config/u2f/u2f_keys

SUDO PAM Config (/etc/pam.d/sudo) anpassen (vorm ersten “auth” einfügen)

auth sufficient pam_u2f.so cue prompt authfile=.config/u2f/u2f_keys

So wird bei angestecktem Key und Mapping im Configverzeichnis Touch angefordert und wenn nicht angesteckt/konfiguriert ist auf Kennwort zurückgefallen.

Optional/praktisch:

  • pinverification=1
  • debug

Quellen: yubico, arch-wiki

HP lt4132 unter Linux nutzen

Dreist geklaut/zusammengefasst von hier.

Existenz des Modems feststellen:

usb-devices

SYSFS Pfad feststellen

grep lt4132 /sys/bus/usb/devices/*/product

Einmal aus/so einschalten dass es Network/ModemManager auch sieht (1-3 vom vorigen Kommando ableiten):

sudo chmod 777 /sys/bus/usb/devices/1-3/bConfigurationValue
sudo echo 0 > /sys/bus/usb/devices/1-3/bConfigurationValue
sleep 1
sudo echo 3 > /sys/bus/usb/devices/1-3/bConfigurationValue

udev Rulefile erzeugen damits immer passiert

# /etc/udev/rules.d/hp-lt4132.rules

ACTION=="add|change", SUBSYSTEM=="usb", ATTR{idVendor}=="03f0", ATTR{idProduct}=="a31d", ATTR{bConfigurationValue}!="3", ATTR{bConfigurationValue}:="0"
ACTION=="add|change", SUBSYSTEM=="usb", ATTR{idVendor}=="03f0", ATTR{idProduct}=="a31d", ATTR{bConfigurationValue}!="3", RUN+="/bin/sh -c 'sleep 1; echo 3 > %S%p/bConfigurationValue'"
ACTION=="add|change", SUBSYSTEM=="net", ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="a31d", ATTR{cdc_ncm/ndp_to_end}=="N", ATTR{cdc_ncm/ndp_to_end}:="Y"

PFX/P12 auf PEMmerl zerlegen

Public key aus PFX/P12:

openssl pkcs12 -in <zert>.pfx -nokeys -password pass:<passwort> -out <zert>.cert.pem   

Private key aus PFX/P12:

openssl pkcs12 -in <zert>.pfx -nocerts -nodes -password pass:<passwort> -out <zert>.key.pem

Private key in RSA Form:

openssl rsa -in <zert>.key.pem -out <zert>.rsakey.pem

RDP Connection auf Hyper-V VM Konsole

VM ID ermitteln:

Hyper-V: (Get-VM -ComputerName <host> -Name <vm>).VMId
VMM: (Get-SCVirtualMachine -VMMServer <vmm> -Name <vm>).VMId

RDP File erstellen

full address:s:<host>
pcb:s:<VMId>
server port:i:2179
negotiate security layer:i:0

RDP File starten 😀

Dreist geklaut von hier und erweitert um VMM.

DirectAccess DDNS Registrierung einschalten

Wurde mit Windows 10 2004 umgestellt, damit sich der Client im Unternehmens DNS registriert muss das Disable disabled werden:

New-ItemProperty -Path ‘HKLM:SYSTEM\CurrentControlSet\Services\Dnscache\Parameters\’ -Name DisableNRPTForAdapterRegistration -PropertyType DWORD -Value 0 -Force

alternativ

reg add HKLM\SYSTEM\CurrentControlSet\Services\DnsCache\Parameters /v DisableNRPTForAdapterRegistration /d 0 /t REG_DWORD /f

Quelle

CSS Grid Cheat Sheet

display:grid

Spaltendefinitiongrid-template-columnsSpaltenbreiten durch Blanks getrennt oder Funktion – z.B. repeat(5,1fr)
Zeilendefinitiongrid-template-rowsZeilenhöhen durch Blanks getrennt oder Funktion – z.B. repeat(5,1fr)
Spalten/Zeilendefinition (kurz)grid-templateZeilendefinition(en) / Spaltendefinition(en)
Grid Templategrid-template-areasDefinition Bezeichnung für eine Zelle, Beispiel (hd, mn, sb, ft werden später für grid-area verwendet):

"hd hd hd hd hd hd hd hd hd"
"mn mn mn mn mn mn mn sb sb"
"ft ft ft ft ft ft ft ft ft"
Grid Bereich festlegengrid-areaDefinition in welchen Bereich die aktuelle Klasse im Grid eingefügt wird (hd, mn, sb, ft im Beispiel)
Spaltenabstandcolumn-gapGröße
Zeilenabstandrow-gapGröße
Spalten/ZeilanbstandgapZeilenabstand Spaltenabstand oder nur einen Größe dann für Spalte/Zeile gleiche Abstand
Positionierung/Spanning (kurz)grid-column
grid-row
Anfang / Ende (Bespiel: 2/4)
Negative Werte: vom gegenüberliegenden Rand aus gesehen (oder Wrap nach links von der aktuellen Position weg)
"span x" für row/colspan
Positionierung/Spanning (lang)grid-column|row-start
grid-column|row-end
absolute Position
negative Werte relativ von start/end oder rechten/unteren Rand
"span x" für row/colspan
Positionierung/Spanning (superkurz)grid-arearow-start / col-start / row-end / col-end
Inhaltspositionierung place-contentalign-content justify-content
Reihenfolge ändernorderAnzahl Positionen links (-) oder rechts

https://cssgridgarden.com