Skip to main content
  • »
  • KUBERNETES »
  • Instalowanie i uruchamianie przepływów pracy Argo na platformie NSIS Magnum Kubernetes

Instalowanie i uruchamianie przepływów pracy Argo na platformie NSIS Magnum Kubernetes

Argo Workflows umożliwia uruchamianie złożonych przepływów zadań na Kubernetes. Może

  • zapewniają niestandardową logikę zarządzania zależnościami między zadaniami,

  • zarządzać sytuacjami, w których niektóre etapy przepływu pracy kończą się niepowodzeniem,

  • równoległe uruchamianie zadań w celu przetwarzania danych lub zadań uczenia maszynowego,

  • uruchamiać potoki CI/CD,

  • tworzenie przepływów pracy za pomocą skierowanych grafów acyklicznych (DAG) itp.

Argo stosuje zorientowane na mikrousługi, natywne dla kontenerów podejście, w którym każdy krok przepływu pracy działa jako kontener.

Co będziemy omawiać

  • Uwierzytelnianie w klastrze

  • Zastosuj wstępną konfigurację do PodSecurityPolicy.

  • Zainstaluj Argo Workflows w klastrze

  • Uruchamiaj przepływy pracy Argo z chmury

  • Uruchamiaj przepływy pracy Argo lokalnie

  • Uruchom przykładowy przepływ pracy z dwoma zadaniami

Wymagania wstępne

Nr 1 Konto

Potrzebne jest konto hostingowe NSIS z dostępem do interfejsu Horizon: https://horizon.cloudferro.com.

Nr 2 kubectl wskazał na klaster Kubernetes

Jeśli tworzysz nowy klaster, na potrzeby tego artykułu nazwij go argo-cluster. Zobacz Jak uzyskać dostęp do klastra Kubernetes po wdrożeniu przy użyciu Kubectl na NSIS OpenStack Magnum?.

Uwierzytelnianie w klastrze

Uwierzytelnijmy się w argo-cluster. Uruchom z komputera lokalnego następujące polecenie, aby utworzyć plik konfiguracyjny w bieżącym katalogu roboczym:

openstack coe cluster config argo-cluster

Spowoduje to wyświetlenie polecenia ustawiającego zmienną środowiskową KUBECONFIG wskazującą lokalizację klastra, np.

export KUBECONFIG=/home/eouser/config

Uruchom to polecenie.

Zastosuj wstępną konfigurację

OpenStack Magnum domyślnie stosuje pewne ograniczenia bezpieczeństwa dla kapsuł działających w klastrze, zgodnie z praktyką „najmniejszych uprawnień”. Argo Workflows będzie wymagać dodatkowych uprawnień, aby działać poprawnie.

Najpierw utwórz dedykowaną przestrzeń nazw dla artefaktów Argo Workflows:

kubectl create namespace argo

Następnym krokiem jest utworzenie RoleBinding, który doda magnum:podsecuritypolicy:privileged ClusterRole. Utwórz plik argo-rolebinding.yaml z następującą zawartością:

argo-rolebinding.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: argo-rolebinding
  namespace: argo
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:serviceaccounts
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: magnum:podsecuritypolicy:privileged

i złożyć wniosek za pomocą:

kubectl apply -f argo-rolebinding.yaml

Instalacja przepływów pracy Argo

Aby wdrożyć Argo na klastrze, uruchom następujące polecenie:

kubectl apply -n argo -f https://github.com/argoproj/argo-workflows/releases/download/v3.4.4/install.yaml

Dostępny jest również Argo CLI do uruchamiania zadań z wiersza poleceń. Jego instalacja wykracza poza zakres tego artykułu.

Uruchamiaj przepływy pracy Argo z chmury

Zwykle konieczne jest uwierzytelnienie na serwerze za pomocą loginu interfejsu użytkownika. Tutaj zamierzamy przełączyć tryb uwierzytelniania, stosując następującą poprawkę do wdrożenia. (W przypadku produkcji może być konieczne włączenie odpowiedniego mechanizmu uwierzytelniania). Prześlij następujące polecenie:

kubectl patch deployment \
  argo-server \
  --namespace argo \
  --type='json' \
  -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/args", "value": [
  "server",
  "--auth-mode=server"
]}]'

Usługa Argo domyślnie udostępniana jest jako usługa Kubernetes typu ClusterIp, co można zweryfikować wpisując poniższe polecenie:

kubectl get services -n argo
NAME          TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)          AGE
argo-server   ClusterIP   10.254.132.118      <none>         2746:31294/TCP   1d

Aby udostępnić tę usługę w Internecie, należy przekonwertować typ ClusterIP na LoadBalancer, łatając usługę następującym poleceniem:

kubectl -n argo patch service argo-server -p '{"spec": {"type": "LoadBalancer"}}'

Po kilku minutach zostanie wygenerowany LoadBalancer w chmurze, a zewnętrzny adres IP zostanie wypełniony:

kubectl get services -n argo
NAME          TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)          AGE
argo-server   LoadBalancer   10.254.132.118   64.225.134.153   2746:31294/TCP   1d

Adres IP w naszym przypadku to 64.225.134.153.

Argo jest domyślnie obsługiwane przez HTTPS z samopodpisanym certyfikatem, na porcie 2746. Tak więc, wpisując https://<your-service-external-ip>:2746 powinieneś być w stanie uzyskać dostęp do usługi:

../_images/image2023-2-15_16-41-491.png

Uruchom przykładowy przepływ pracy z dwoma zadaniami

Aby uruchomić przykładowy przepływ pracy, należy najpierw zamknąć początkowe wyskakujące okienka w interfejsie użytkownika. Następnie przejdź do ikony „Workflows” w lewym górnym rogu i kliknij ją, po czym może być konieczne naciśnięcie przycisku „Continue” w kolejnym wyskakującym okienku.

Następnym krokiem jest kliknięcie przycisku „Submit New Workflow” w lewej górnej części ekranu, co spowoduje wyświetlenie ekranu podobnego do poniższego:

../_images/first_argo_example1.png

Chociaż można uruchomić przepływ pracy dostarczony przez Argo jako początek, zapewniamy tutaj alternatywny minimalny przykład. Aby go uruchomić, należy utworzyć plik, który możemy nazwać argo-article.yaml i skopiować w miejsce przykładowego manifestu YAML:

argo-article.yaml

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: workflow-
  namespace: argo
spec:
  entrypoint: my-workflow
  serviceAccountName: argo
  templates:
  - name: my-workflow
    dag:
      tasks:
      - name: downloader
        template: downloader-tmpl
      - name: processor
        template: processor-tmpl
        dependencies: [downloader]
  - name: downloader-tmpl
    script:
      image: python:alpine3.6
      command: [python]
      source: |
        print("Files downloaded")
  - name: processor-tmpl
    script:
      image: python:alpine3.6
      command: [python]
      source: |
        print("Files processed")

Ta próbka makietuje przepływ pracy z 2 zadaniami. Najpierw uruchamiane jest zadanie downloadera, a po jego zakończeniu zadanie procesora wykonuje swoją część. Kilka najważniejszych informacji na temat tej definicji przepływu pracy:

  • Oba zadania działają jako kontenery. Tak więc dla każdego zadania kontener python:alpine3.6 jest najpierw pobierany z rejestru DockerHub. Następnie kontener ten wykonuje prostą pracę polegającą na wydrukowaniu tekstu. W produkcyjnym przepływie pracy, zamiast używać skryptu, kod z logiką zostanie pobrany z rejestru kontenerów jako niestandardowy obraz Docker.

  • Kolejność wykonywania skryptu jest tutaj definiowana przy użyciu DAG (Directed Acyclic Graph). Pozwala to na określenie zależności zadań w sekcji zależności. W naszym przypadku zależność jest umieszczona na Processorze, więc rozpocznie się dopiero po zakończeniu Downloadera. Gdybyśmy pominęli zależności od Processora, działałby on równolegle z Downloaderem.

  • Każde zadanie w tej sekwencji jest uruchamiane jako kapsuła Kubernetes. Po wykonaniu zadania kapsuła kończy działanie, co zwalnia zasoby w klastrze.

Możesz uruchomić tę próbkę, klikając przycisk „+Create”. Po zakończeniu przepływu pracy powinieneś zobaczyć wynik, jak poniżej:

../_images/image2023-2-15_17-50-441.png

Ponadto po kliknięciu każdego kroku po prawej stronie ekranu wyświetlanych jest więcej informacji. Np. klikając na krok Procesor, możemy zobaczyć jego logi w prawej dolnej części ekranu.

Wyniki pokazują, że rzeczywiście w kontenerze został wydrukowany komunikat „Pliki przetworzone”:

../_images/image2023-2-15_18-13-511.png

Co robić dalej

W przypadku produkcji należy rozważyć alternatywny mechanizm uwierzytelniania i zastąpienie samodzielnie podpisanych certyfikatów HTTPS certyfikatami wygenerowanymi przez urząd certyfikacji.