Přeskočit na obsah

Upgrade k3s clusteru pomocí System Upgrade Controller a Argo CD

Jak automatizovat upgrady k3s clusteru pomocí System Upgrade Controller a Argo CD s přístupem GitOps.

17. listopadu 2022

datum publikace

5 min

doba čtení

Nedávno jsem migroval svůj k3s cluster na Hetzneru z bare metalu na VM. Nepotřebuji tolik výpočetních zdrojů a nechci spravovat úložiště na Longhornu.

O této migraci možná někdy jindy. V tomto článku se chci zaměřit na to, jak jsem upgradoval svůj k3s cluster bez Ansible, automaticky, pomocí jednoduchého Plánu.

Co je k3s

Pro ty, kdo nevědí, co je k3s - jedná se o odlehčenou distribuci Kubernetes nejen pro edge. Můžete na ní provozovat cokoliv. Je to plnohodnotná distribuce Kubernetes.

V současné době je k3s distribucí Kubernetes používanou clustery nasazenými přes Rancher na VM. Např. v prostředích, kde nejsou k dispozici spravovaná řešení jako AWS EKS.

Trocha historie

k3s původně vytvořila společnost Rancher Labs a projekt k3s byl později darován CNCF spolu s dalšími projekty Rancher Labs, jako je Longhorn.

Je k3s stabilní?

Říkáte, že k3s není stabilní/vhodný pro produkci?

Zeptejte se lidí z CIVO. Všechny jejich clustery běží na k3s!

System Upgrade Controller

System Upgrade Controller je komponenta od Rancheru zaměřená na upgrade Kubernetes nodů. Nezávisí na k3s/rke/rke2/Rancher, lze ji použít kdekoliv.

V mém případě ji momentálně používám k upgradu verze k3s a plánuji ji použít i k upgradu kernelu nodů. Hostitelský OS nodů je Ubuntu 22.04 LTS.

V době psaní má System Upgrade Controller 424 GitHub hvězdiček.

POZNÁMKA: Job kontejner je velmi privilegovaný, více si přečtěte zde: https://github.com/rancher/system-upgrade-controller#considerations

Koncepty

Controller spravuje Plány tím, že vybírá Nody, na kterých spouští Joby. Plán definuje, které Nody jsou způsobilé pro upgrade, pomocí selektoru labelů. Když Job úspěšně doběhne, Controller označí Nod, na kterém běžel, podle Plánu, který byl aplikován Jobem.

To je oficiální popis SUC na jeho GitHub stránce.

Plán

Rád bych se trochu více zmínil o plánu.

V něm můžete nakonfigurovat, co chcete upgradovat - samotné k3s, kernel, apt balíčky a další…

Pro k3s si můžete zvolit konkrétní verzi pro upgrade nebo “channel”, takže automaticky upgradujete na nejnovější patch verzi, když je k dispozici, nebo dokonce na nejnovější minor verzi.

Můžete také nakonfigurovat chování nodu před samotným upgradem. Jestli chcete nod cordonovat nebo drainovat. Ve výchozím nastavení drain ignoruje DaemonSety.

Upgrade

V mém clusteru používám Argo CD ke správě Kubernetes resources způsobem GitOps.

Začal jsem tedy přidáním repozitáře System Upgrade Controller do Arga a vytvořil pro něj Application.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: system-upgrade-controller
  namespace: argocd
spec:
  destination:
    namespace: system-upgrade
    server: https://kubernetes.default.svc
  project: default
  source:
    path: manifests
    repoURL: https://github.com/rancher/system-upgrade-controller.git
    targetRevision: v0.10.0
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

Poté jsem vytvořil další samostatnou aplikaci pro samotné plány, aby mohly být spravovány odděleně od controlleru.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: upgrade-plans
  namespace: argocd
spec:
  destination:
    namespace: system-upgrade
    server: https://kubernetes.default.svc
  project: default
  source:
    path: cluster-components/upgrade-plans
    repoURL: https://gitlab.example.com/gitops/mareshq/bee.git
    targetRevision: HEAD
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

Poté jsem vytvořil Plány pro k3s-server (control-plane) a k3s-agent (worker).

Plány používají channel k zacílení na určitou minor verzi Kubernetes, takže upgrady patchů dostávám automaticky. Pokud toto chování nechcete a chcete zacílit na konkrétní verzi, použijte version v rámci spec. Pro více informací si přečtěte dokumentaci a vřele doporučuji nahlédnout do repozitáře k3s-upgrade.

apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
  name: k3s-server-v1.25
  namespace: system-upgrade
  labels:
    k3s-upgrade: server
spec:
  concurrency: 1 # Batch size (roughly maps to maximum number of unschedulable nodes)
  channel: https://update.k3s.io/v1-release/channels/v1.25
  nodeSelector:
    matchExpressions:
      - { key: k3s-upgrade, operator: Exists }
      - { key: k3s-upgrade, operator: NotIn, values: ["disabled", "false"] }
      - { key: k3os.io/mode, operator: DoesNotExist }
      - { key: node-role.kubernetes.io/control-plane, operator: Exists }
  serviceAccountName: system-upgrade
  cordon: true
  upgrade:
    image: rancher/k3s-upgrade
---
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
  name: k3s-agent-v1.25
  namespace: system-upgrade
  labels:
    k3s-upgrade: agent
spec:
  concurrency: 1 # Batch size (roughly maps to maximum number of unschedulable nodes)
  channel: https://update.k3s.io/v1-release/channels/v1.25
  nodeSelector:
    matchExpressions:
      - { key: k3s-upgrade, operator: Exists }
      - { key: k3s-upgrade, operator: NotIn, values: ["disabled", "false"] }
      - { key: k3os.io/mode, operator: DoesNotExist }
      - { key: node-role.kubernetes.io/control-plane, operator: DoesNotExist }
  serviceAccountName: system-upgrade
  prepare:
    # Defaults to the same "resolved" tag that is used for the `upgrade` container, NOT `latest`
    image: rancher/k3s-upgrade
    args: ["prepare", "k3s-server-v1.25"]
  drain:
    force: true
    skipWaitForDeleteTimeout: 60 # 1.18+ (honor pod disruption budgets up to 60 seconds per pod then moves on)
  upgrade:
    image: rancher/k3s-upgrade

Nemohl jsem najít seznam všech dostupných channels, ale existuje JSON seznam poskytovaný channelserverem.

JSON seznam channels: https://update.k3s.io/v1-release/channels.

Po tom všem je potřeba přidat label k3s-upgrade k vašim nodům. Labely můžete změnit na vlastní v spec.nodeSelector.matchExpressions.

Přidání takového labelu je opravdu jednoduché pomocí jediného kubectl příkazu.

kubectl label node <node name> k3s-upgrade=true

Mělo by být v pořádku označit všechny nody najednou, ale pro jistotu jsem nejprve upgradoval control-plane a poté worker nody.

Poté byste měli vidět nový job vytvořený v namespace system-upgrade. Job má ve svém názvu, který nod je tímto jobem upgradován.

Po dokončení jobu máte upgradovaný nod. Pokud jich máte více, controller automaticky začne upgradovat další nod.

Po pár minutách byl k3s control plane upgradovaný a přešel jsem k agentům (workerům).

Závěrečné myšlenky

Musím říct, že nastavení a upgrade jsou neuvěřitelně jednoduché, mnohem více, než jsem čekal.

Controller nepotřebuje nic speciálního k instalaci ani ke změně v clusteru. Plány jsou dobře zdokumentované a s repozitářem k3s-upgrade, který je plný příkladů a další dokumentace, to byl hračka.

Jediné, co mi přišlo trochu obtížné, bylo získat seznam channels, ale s trochou zkušeností a odhadem jsem seznam také našel.

Těším se, až přidám další plány pro upgrade kernelu nodů a dalších věcí.

Odkazy

DevOps školení

Sdílím své zkušenosti a znalosti z každodenní praxe formou školení a workshopů. Zaměřuji se především na open-source DevOps nástroje a technologie.

Ikona školení Kubernetes

Kubernetes

2 dnyod 11 400 CZK

Naučte se nasazovat a provozovat kontejnerové aplikace ve scale. Správa clusteru, Helm a každodenní provozní situace.

Ikona školení Argo CD

Argo CD

1 denod 5 400 CZK

Přestaňte ručně nasazovat do Kubernetes. Naučte se GitOps s Argo CD – verzovaná nasazení v Gitu, automatická synchronizace a snadný rollback.

Ikona školení Docker

Docker

2 dnyod 11 400 CZK

Naučte se zabalit aplikaci do kontejneru a nasadit ji do produkce. Od základů Dockeru po vícekontejnerové aplikace a best practices.

Ikona školení Git

Git

1 denod 5 400 CZK

Naučte se Git od základů po pokročilé techniky – větvení, merge strategie a řešení konfliktů. Paralelní práce bez ztráty kódu.

Ikona školení GitHub Actions

GitHub Actions

1 denod 5 400 CZK

Automatizujte testy, buildy a nasazování s GitHub Actions. Naučte se psát workflows, tvořit vlastní actions a nastavit CI/CD.

Ikona školení GitLab CI

GitLab CI

1 denod 5 400 CZK

Navrhněte efektivní GitLab CI/CD pipeline, nastavte Runnery a automatizujte cestu od commitu po produkci. Praktický workshop.

Ikona školení Postgres na Kubernetes

Postgres na Kubernetes

1 denod 5 400 CZK

Provozujte PostgreSQL na Kubernetes s CloudNativePG. Naučte se automatizovat upgrady, failover, zálohy a monitoring – praktický workshop.

Ikona školení Terraform

Terraform

1 denod 5 400 CZK

Získejte kontrolu nad cloudovou infrastrukturou. Naučte se spravovat prostředí jako kód s Terraformem – verzovaně, opakovatelně a auditovatelně.

Tento web používá soubory cookies k analýze návštěvnosti pomocí služby Google Analytics. Díky nim můžu zlepšovat svoje stránky na základě anonymních statistik. Více informací najdete v zásadách používání cookies.