Sind VPS / RS für kubernetes/etcd production ready? [SOLVED 50%]

  • Ich teste jetzt seit Tagen mit verschiedenen K8s Setups und habe das Gefühl auf den NC Server läuft Kubernetes nicht einwandfrei.


    Kubernetes Cluster Setup:

    - 3 Master RS 1000 (RS 2000 und VPS 200 auch probiert)

    - 1 Worker RS 1000 (RS 2000 und VPS 200 auch probiert)

    - Debian 11 (10 und 12 auch schon probiert)

    - Die Server kommunizieren über Cloud vLAN 2,5 Gbit/s

    - kubernetes mit kubeadm aufgesetzt, und abgesehen von den privaten IPs ein absolutes Standard-Setup

    - CSN calico tigera operator

    - einzige Workload (bisher) prometheus-monitoring (Aber auch ohne gibt es die Probleme)


    Angemerkt: Das gleiche Setup habe ich im privaten Homelab mit HDD (nicht SSD!) und auch beim großen A bis Z Cloud Anbieter (SSD Disks) probiert und hatte keine Problem bisher.

    Zum Problem:


    Mit ist aufgefallen, dass ich immer wieder mal Warnings habe. So ca alle 30 bis 60 Minuten.


    Code
    kubectl get events -A | grep Warning
    kube-system   5m13s       Warning   Unhealthy   pod/kube-apiserver-test-k8s   Readiness probe failed: HTTP probe failed with statuscode: 500

    Und auch den ein oder anderen kube-system pod Restart


    Ich habe die Sache dann auf etcd zurückführen können, denn zeitgleich mit der Warning. Haben etcd logs folgendes ausgespuckt:


    Code
    {"level":"warn","ts":"2023-06-22T15:29:36.314Z","caller":"etcdserver/util.go:166","msg":"apply request took too long","took":"5.999710819s","expected-duration":"100ms","prefix":"read-only range ","request":"key:\"/registry/apiregistration.k8s.io/apiservices/\" range_end:\"/registry/apiregistration.k8s.io/apiservices0\" count_only:true ","response":"range_response_count:0 size:8"}
    {"level":"warn","ts":"2023-06-22T15:29:36.313Z","caller":"etcdserver/util.go:166","msg":"apply request took too long","took":"4.003310712s","expected-duration":"100ms","prefix":"read-only range ","request":"key:\"/registry/ranges/servicenodeports\" ","response":"range_response_count:1 size:119"}


    Also separaten etcd Cluster aufgesetzt und alle erdenklichen Benchmarks und Checks gemacht und das Ergebnis war: NC Disks sind einfach die schnellsten, einen Ticken besser wie A bis Z und deutlich besser wie meine Homelab HDDs. Und trotzem läuft es nicht rund.


    Also k8s und etcd Cluster getrennt:

    Neues Setup (mit VPS200 und RS1000 und RS2000 gestested - kein Unterschied)


    - 3 etcd nodes

    - 1 k8s master node

    - 0 k8s worker


    Anpassen der --heartbeat-interval --election-timeout parameter half auch nicht.


    Ergebnis wie oben, grundsätzlich läuft es, aber hier und da Warnings und Neustart von kube-system pods.


    etcd endpoint checks:

    Code
    docker exec etcd /usr/local/bin/etcdctl --write-out=table --endpoints $ENDPOINTS endpoint status
    +------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
    |     ENDPOINT     |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
    +------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
    | 10.241.0.17:2379 | 8b6b8d8fb98eca2e |   3.5.9 |  922 MB |     false |      false |        28 |    1090732 |            1090732 |        |
    | 10.241.0.18:2379 | 6592412b034dfc6c |   3.5.9 |  922 MB |     false |      false |        28 |    1090732 |            1090732 |        |
    | 10.241.0.19:2379 | 4dac3bf58bf8d547 |   3.5.9 |  922 MB |      true |      false |        28 |    1090732 |            1090732 |        |
    +------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

    Die große DB size kommt von den ganzen Benchmark tests.

    Code
    docker exec etcd /usr/local/bin/etcdctl --write-out=table --endpoints $ENDPOINTS endpoint health
    +------------------+--------+------------+-------+
    |     ENDPOINT     | HEALTH |    TOOK    | ERROR |
    +------------------+--------+------------+-------+
    | 10.241.0.19:2379 |   true | 2.831555ms |       |
    | 10.241.0.17:2379 |   true |  2.43684ms |       |
    | 10.241.0.18:2379 |   true | 3.251807ms |       |
    +------------------+--------+------------+-------+


    Hier mal ein Graph der Disk Operations in den letzten 3h. Die Spikes + Zeiten passen zu den entsprechenden Logs von oben.

    pasted-from-clipboard.png


    Im Vergleich der A-Z Laden: keine Spikes

    pasted-from-clipboard.png


    Und mit diesem aktuellen Stand fühle ich mich nicht wohl ein Production Cluster zu fahren, der auch ein wenig Workload bekommen würde.


    Hat jemand ähnliche Erfahrung? Wenn es bei euch läuft, welches OS habt ihr verwendet?


    -------

    Sideeffekts:


    - Bei dem ganzen Rumgeteste, hatte ich einen RS1000, welcher einfach nicht den etcd Cluster nutzen wollten. Timeout bei kubeadm init .... Ich bin wirklich verzweifelt zumal das selbe Setupscript bei jedem anderen Server funktioniert hat, als hätte ich einen "Montagsserver" erwischt.. Auch mehrmalige OS Neuinstallation halfen nicht.

    - Vermutlich purer Zufall, aber die RS1000 haben in den 2 Tagen Testen mehr Auffälligkeiten gezeigt, als die kleinen VPS200.

  • UPDATE:


    Jetzt gab es bei A-Z auch den ersten Spike:


    pasted-from-clipboard.png


    Und parallel dazu auch die entsprechende Warning:


    Code
    kube-system   29m         Warning   Unhealthy   pod/kube-apiserver-rs-etcd-k8s   Readiness probe failed: HTTP probe failed with statuscode: 500

    Mache ich mir umsonst Sorgen? Und das Verhalten ist akzeptabel?

  • Hallo Tom81


    ein Blick auf die Clusteranforderungen von etcd verrät, dass die 8GB pro Node verlangen, ohne dass da noch der K8S Master mitläuft.

    https://etcd.io/docs/v3.3/op-guide/hardware/#small-cluster


    Mit dem VPS 200 und RS 1000 sieht es da schon dünn aus.


    Wie ist dein Debian konfiguriert? Hast du das per Image oder per ISO installiert?

    Hast du den Swap deaktiviert?


    Hast du schon mal probiert Calico über die öffentlichen IPs zu schicken, statt über das CloudVLAN?

    Das CloudVLAN ist unter der Haube ein VXLAN, nutzt also UDP.

  • Also die etcd Warnung ("apply request took too long") ist eigentlich schon recht bedenklich mit einer Zeit von 5-6s. Ich habe jetzt schon recht viele Kubernetes Cluster aufgesetzt. Diese Warnungen bekomme ich auch sehr oft. Das ist eigentlich normal. Bei mir bewegen die sich aber dann meist im 100ms - 400ms Bereich (Warnung gibt es ab 100ms). Gut möglich, dass der 500er dann daher kommt.


    Kannst du die Tests mal mit nur 1 Master durchführen? Einfach 1 RS1000 dafür nehmen. Der sollte von den Specs her eigentlich völlig ausreichen. In einem Cluster reicht es ja oft, wenn es 1 Node gibt, der die anderen ausbremst. Man sollte auch mal überprüfen, ob das VLAN sauber läuft. Nicht dass die Probleme durch Fehler in diesem Bereich auftreten (daher meine Überlegung mit nur 1 Master, dann hat man zumindest schon mal keinen etcd Cluster).


    Die Graphen der Disk Auslastung sehen jetzt nicht so schlimm aus. Das sind ja noch recht niedrige Werte.


    Wenn du produktive Kubernetes Cluster bei Netcup betreiben willst, hast du dir schon überlegt wie du das mit dem Storage und dem LB machen willst? Das sind eigentlich genau die 2 Punkte, warum ich es eher nicht empfehlen würde. Es gibt zwar diverse Storage Cluster Lösungen, die man deployen könnte, aber da man bei Netcup keine zusätzlichen Disks einbinden kann, muss das alles mit der gleichen Disk gemacht werden, auf der schon das OS und alle Container laufen. Nicht wirklich ideal. Man könnte jetzt noch einen zusätzlichen Server als NFS nutzen, aber das sind dann am Ende ein SPOF und gerade im produktiven Betrieb wieder riskant.


    Das mit den VPS200 verstehe ich nur nicht so richtig. Die sind ja weder als Master noch als Worker zu gebrauchen (viel zu wenig CPU und RAM). Ich sehe da schon einen RS1000 als Minimum.

  • Sorry, falls der Text was kurz ist ( Hab nen Gipsarm ). Kann deine Beobachtungen teilweise bestätigen

    - RS4000 G9 mit Debian 12 über Preseed + Ansible, nicht Netcup Imge

    - Ich nutze Calico nur mit BGP und dem CloudVLAN, da DualStack

    - In den Etcd Logs sehe ich Meldung, dass Requests länger gebraucht haben, dass sind immer nur so sporadisch ~5 Sekunden

    pasted-from-clipboard.png

  • Mit dem VPS 200 und RS 1000 sieht es da schon dünn aus.

    VPS 200 zum Testen nur genutzt. RS 1000 4 Cores 8GB sollten ohne k8s Master absolut ausreichen ohne Belastung.

    Wie ist dein Debian konfiguriert? Hast du das per Image oder per ISO installiert?

    Hast du den Swap deaktiviert?

    Image von NC, Swap ist off

    Hast du schon mal probiert Calico über die öffentlichen IPs zu schicken, statt über das CloudVLAN?

    Das CloudVLAN ist unter der Haube ein VXLAN, nutzt also UDP.

    Ich werde es mal ohne VLAN testen die Tage

    Kannst du die Tests mal mit nur 1 Master durchführen? Einfach 1 RS1000 dafür nehmen

    Jop werde ich mal testen die Tage

    Wenn du produktive Kubernetes Cluster bei Netcup betreiben willst, hast du dir schon überlegt wie du das mit dem Storage und dem LB machen willst?

    Storage mit Longhorn, da seh ich auch keinen Grund die Workernodes Disks nicht zu verwenden. LB wird metallb

  • Moin, mal so interessehalber: sind das einzelne Pods oder ganze Nodes, die bei dir als nicht erreichbar gemeldet werden?


    Wir benutzen die netcup vlans relativ extensiv, bis auf eine instabilität kann ich

  • War gestern Abend noch fleissig, weil es mir keine Ruhe gelassen hat :)


    Das Ergebnis:


    - nur 1 single Master Node (kein weiterer Node)

    - RS2000!

    - Debain 12 NC Image

    - kein VLAN Interface attached

    - k8s mit stacked etcd installiert mit kubeadm init --upload-certs --pod-network-cidr 192.168.0.0/16

    - Danach noch calico drauf:


    Code
    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml
    curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml -O
    kubectl create -f custom-resources.yaml


    Logs des etcd pods:


    ca 1-2h nach installieren: 9.5 Sekunden - so hoch habe ich es noch nie gesehen.

    Code
    {"level":"warn","ts":"2023-06-22T23:54:00.061Z","caller":"etcdserver/util.go:170","msg":"apply request took too long","took":"9.516213776s","expected-duration":"100ms","prefix":"read-only range ","request":"key:\"/registry/clusterrolebindings/\" range_end:\"/registry/clusterrolebindings0\" count_only:true ","response":"range_response_count:0 size:8"}
    {"level":"warn","ts":"2023-06-22T23:54:00.061Z","caller":"etcdserver/util.go:170","msg":"apply request took too long","took":"6.226219627s","expected-duration":"100ms","prefix":"read-only range ","request":"key:\"/registry/operator.tigera.io/apiservers/\" range_end:\"/registry/operator.tigera.io/apiservers0\" count_only:true ","response":"range_response_count:0 size:8"}
    {"level":"warn","ts":"2023-06-22T23:54:00.061Z","caller":"etcdserver/util.go:170","msg":"apply request took too long","took":"7.71104878s","expected-duration":"100ms","prefix":"read-only range ","request":"key:\"/registry/jobs/\" range_end:\"/registry/jobs0\" count_only:true ","response":"range_response_count:0 size:6"}
    {"level":"warn","ts":"2023-06-22T23:54:00.061Z","caller":"etcdserver/util.go:170","msg":"apply request took too long","took":"7.816738481s","expected-duration":"100ms","prefix":"read-only range ","request":"key:\"/registry/services/endpoints/calico-system/calico-typha\" ","response":"range_response_count:1 size:670"}
    {"level":"warn","ts":"2023-06-22T23:54:00.061Z","caller":"etcdserver/util.go:170","msg":"apply request took too long","took":"3.632870759s","expected-duration":"100ms","prefix":"read-only range ","request":"key:\"/registry/crd.projectcalico.org/hostendpoints/\" range_end:\"/registry/crd.projectcalico.org/hostendpoints0\" count_only:true ","response":"range_response_count:0 size:6"}

    und geht dann so im gewohnten 1-2 mal pro Stunde Takt so weiter

    Das system ist absolut "clean and fresh"


    Die Pods:


  • FYI: So setze ich die Server nach Neuinstallation auf:


    Container Runtime

    Notwendiges für K8S

    Code
    echo "br_netfilter" >> /etc/modules-load.d/modules.conf
    echo "overlay" >> /etc/modules-load.d/modules.conf
    
    cat << 'EOF' | tee /etc/sysctl.d/99-kubernetes-cri.conf
    net.ipv4.ip_forward = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    EOF
    Code
    reboot

    K8S:

    Code
    apt install -y apt-transport-https ca-certificates curl
    
    curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg 
    
    echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list
    
    apt update
    apt install -y kubelet kubeadm kubectl
    apt-mark hold kubelet kubeadm kubectl

    kubeadm init../ join...

  • Tom81, der Anlass hier ist ja doof, aber vielen Dank für die geile sehr gute Übersicht zum Kubernetes-Server-Hochziehen. Ich habe schon lange mal vorgehabt, mir so ein Ding zum Spielen hinzustellen (privat reicht mir Docker-Compose, auf der Arbeit beschäftigen sich andere mit K8n).


    :)

  • SOLVED zu 50%: Umstellung auf SCSI verbessert, aber reduziert die nur die Häufigkeit des Auftretens.


    Grund für die Disk Spikes etc. ist der KVM VIRTIO Festplatten Treiber. Aber zum Glück kann man umstellen auf SCSI, was auch empfohlen ist, aber nicht der Default bei Serverneuinstallation. Sogar wenn man auf SCSI gestellt hat und danach den Server neu installiert, wird wieder automatisch VIRTIO gewählt.

    pasted-from-clipboard.png


    Man sieht es gut, gegen 18.40 Uhr habe ich alle etcd Server auf SCSI umgestellt.

    pasted-from-clipboard.png


    Drauf gekommen bin ich, weil mein Homelab mit Proxmox und KVM auf langsamen HDD (mit SCSI) ohne Probleme läuft.


    Die etcd Logs sind jetzt auch komplett frei von apply request took too long, nichtmal der 100ms Threshold wird gerissen.

  • Tom81

    Hat den Titel des Themas von „Sind VPS / RS für kubernetes/etcd production ready?“ zu „Sind VPS / RS für kubernetes/etcd production ready? [SOLVED]“ geändert.
  • Drauf gekommen bin ich, weil mein Homelab mit Proxmox und KVM auf langsamen HDD (mit SCSI) ohne Probleme läuft.

    Du darfst nicht vergessen, dass du dir im Gegensatz zu deinen Server Zuhause oder einen Dedicated Server beim Mitbewerber das SSD Array auf dem Host mit sehr vielen weiteren Kunden teilst, die eventuell auch sehr hungrige IO-Anwendungen nutzen könnten.

  • Tom81

    Hat den Titel des Themas von „Sind VPS / RS für kubernetes/etcd production ready? [SOLVED]“ zu „Sind VPS / RS für kubernetes/etcd production ready? [SOLVED 50%]“ geändert.
  • Danke für eure Hilfe etc. Ich habe das Thema erstmal auf Eis gelegt. Zumal die auch die etcd Doku sagt, dass Shared Virtual Disks nicht empfohlen sind. Hobbycluster lass ich mal weiter laufen, Production bleibt erstmal wo er ist.