Nawiązywanie połączenia z węzłami klastra usługi Azure Kubernetes Service na potrzeby konserwacji lub rozwiązywania problemów

W całym cyklu życia klastra usługi Azure Kubernetes Service (AKS) należy ostatecznie uzyskać bezpośredni dostęp do węzła usługi AKS. Ten dostęp może być przeznaczony dla operacji konserwacji, zbierania dzienników lub rozwiązywania problemów.

Uzyskujesz dostęp do węzła za pośrednictwem uwierzytelniania, które metody różnią się w zależności od systemu operacyjnego Node i metody połączenia. Bezpiecznie uwierzytelniasz się w węzłach AKS Linux i Windows za pomocą dwóch opcji omówionych w tym artykule. Jeden z nich wymaga dostępu do interfejsu API kubernetes, a drugi jest za pośrednictwem interfejsu API ARM usługi AKS, który zapewnia bezpośrednie prywatne informacje o adresach IP. Ze względów bezpieczeństwa węzły usługi AKS nie są uwidocznione w Internecie. Zamiast tego, aby nawiązać bezpośrednie połączenie z dowolnymi węzłami usługi AKS, musisz użyć kubectl debug prywatnego adresu IP lub prywatnego adresu IP hosta.

Uzyskiwanie dostępu do węzłów przy użyciu interfejsu API platformy Kubernetes

Ta metoda wymaga użycia kubectl debug polecenia.

Zanim rozpoczniesz

W tym przewodniku pokazano, jak utworzyć połączenie z węzłem usługi AKS i zaktualizować klucz SSH klastra usługi AKS. Aby wykonać poniższe kroki, musisz użyć interfejsu wiersza polecenia platformy Azure obsługującego wersję 2.0.64 lub nowszą. Uruchom polecenie az --version , aby sprawdzić wersję. Jeśli konieczna będzie instalacja lub uaktualnienie, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.

Wykonaj te kroki, jeśli nie masz klucza SSH. Utwórz klucz SSH w zależności od obrazu systemu operacyjnego Node, dla systemów macOS i Linux lub Windows. Pamiętaj, aby zapisać parę kluczy w formacie OpenSSH, unikaj nieobsługiwanych formatów, takich jak .ppk. Następnie zapoznaj się z tematem Zarządzanie konfiguracją protokołu SSH, aby dodać klucz do klastra.

Linux i macOS

Użytkownicy systemów Linux i macOS mogą uzyskiwać dostęp do węzła za pomocą protokołu SSH lub kubectl debug prywatnego adresu IP. Użytkownicy systemu Windows powinni przejść do sekcji Serwer proxy systemu Windows Server, aby obejść problem z protokołem SSH za pośrednictwem serwera proxy.

Protokół SSH przy użyciu debugowania kubectl

Aby utworzyć interaktywne połączenie powłoki, użyj kubectl debug polecenia , aby uruchomić uprzywilejowany kontener w węźle.

  1. Aby wyświetlić listę węzłów, użyj kubectl get nodes polecenia :

    kubectl get nodes -o wide
    

    Przykładowe dane wyjściowe:

    NAME                                STATUS   ROLES   AGE    VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE
    aks-nodepool1-37663765-vmss000000   Ready    agent   166m   v1.25.6   10.224.0.33   <none>        Ubuntu 22.04.2 LTS
    aks-nodepool1-37663765-vmss000001   Ready    agent   166m   v1.25.6   10.224.0.4    <none>        Ubuntu 22.04.2 LTS
    aksnpwin000000                      Ready    agent   160m   v1.25.6   10.224.0.62   <none>        Windows Server 2022 Datacenter
    
  2. Użyj polecenia , kubectl debug aby uruchomić uprzywilejowany kontener w węźle i nawiązać z nim połączenie.

    kubectl debug node/aks-nodepool1-37663765-vmss000000 -it --image=mcr.microsoft.com/cbl-mariner/busybox:2.0
    

    Przykładowe dane wyjściowe:

    Creating debugging pod node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx with container debugger on node aks-nodepool1-37663765-vmss000000.
    If you don't see a command prompt, try pressing enter.
    root@aks-nodepool1-37663765-vmss000000:/#
    

    Masz teraz dostęp do węzła za pośrednictwem uprzywilejowanego kontenera jako zasobnika debugowania.

    Uwaga

    Możesz wchodzić w interakcje z sesją węzła, uruchamiając polecenie chroot /host z uprzywilejowanego kontenera.

Zamykanie trybu debugowania kubectl

Po zakończeniu pracy z węzłem wprowadź polecenie , aby zakończyć sesję exit interakcyjnej powłoki. Po zamknięciu interakcyjnej sesji kontenera usuń zasobnik debugowania używany z kubectl delete podprogramem .

kubectl delete pod node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx

Połączenie serwera proxy systemu Windows Server dla protokołu SSH

Wykonaj następujące kroki jako obejście, aby nawiązać połączenie z protokołem SSH w węźle systemu Windows Server.

Tworzenie serwera proxy

Obecnie nie można nawiązać bezpośredniego połączenia z węzłem systemu Windows Server przy użyciu polecenia kubectl debug. Zamiast tego należy najpierw nawiązać połączenie z innym węzłem kubectlw klastrze za pomocą polecenia , a następnie nawiązać połączenie z węzłem systemu Windows Server z tego węzła przy użyciu protokołu SSH.

Aby nawiązać połączenie z innym węzłem w klastrze, użyj kubectl debug polecenia . Aby uzyskać więcej informacji, wykonaj powyższe kroki w sekcji kubectl. Utwórz połączenie SSH z węzłem systemu Windows Server z innego węzła przy użyciu kluczy SSH podanych podczas tworzenia klastra usługi AKS i wewnętrznego adresu IP węzła systemu Windows Server.

Ważne

Poniższe kroki tworzenia połączenia SSH z węzłem systemu Windows Server z innego węzła mogą być używane tylko w przypadku utworzenia klastra usługi AKS przy użyciu interfejsu wiersza polecenia platformy Azure z parametrem --generate-ssh-keys . Jeśli zamiast tego chcesz użyć własnych kluczy SSH, możesz użyć polecenia az aks update do zarządzania kluczami SSH w istniejącym klastrze usługi AKS. Aby uzyskać więcej informacji, zobacz Zarządzanie dostępem do węzła SSH.

Uwaga

Jeśli węzeł serwera proxy systemu Linux nie działa lub nie odpowiada, użyj metody usługi Azure Bastion , aby nawiązać połączenie.

  1. Użyj polecenia , kubectl debug aby uruchomić uprzywilejowany kontener w węźle serwera proxy (Linux) i nawiązać z nim połączenie.

    kubectl debug node/aks-nodepool1-37663765-vmss000000 -it --image=mcr.microsoft.com/cbl-mariner/busybox:2.0
    

    Przykładowe dane wyjściowe:

    Creating debugging pod node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx with container debugger on node aks-nodepool1-37663765-vmss000000.
    If you don't see a command prompt, try pressing enter.
    root@aks-nodepool1-37663765-vmss000000:/#
    
  2. Otwórz nowe okno terminalu i użyj kubectl get pods polecenia , aby uzyskać nazwę zasobnika uruchomionego przez kubectl debug.

    kubectl get pods
    

    Przykładowe dane wyjściowe:

    NAME                                                    READY   STATUS    RESTARTS   AGE
    node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx   1/1     Running   0          21s
    

    W przykładowych danych wyjściowych węzeł-debugger-aks-nodepool1-37663765-vmss000000-bkmmx jest nazwą zasobnika uruchomionego przez kubectl debugpolecenie .

  3. kubectl port-forward Użyj polecenia , aby otworzyć połączenie z wdrożonym zasobnikiem:

    kubectl port-forward node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx 2022:22
    

    Przykładowe dane wyjściowe:

    Forwarding from 127.0.0.1:2022 -> 22
    Forwarding from [::1]:2022 -> 22
    

    Poprzedni przykład rozpoczyna przekazywanie ruchu sieciowego z portu 2022 na komputerze deweloperskim do portu 22 na wdrożonym zasobniku. W przypadku używania kubectl port-forward polecenia do otwierania połączenia i przesyłania dalej ruchu sieciowego połączenie pozostaje otwarte do momentu zatrzymania kubectl port-forward polecenia.

  4. Otwórz nowy terminal i uruchom polecenie kubectl get nodes , aby wyświetlić wewnętrzny adres IP węzła systemu Windows Server:

    kubectl get no -o custom-columns=NAME:metadata.name,'INTERNAL_IP:status.addresses[?(@.type == \"InternalIP\")].address'
    

    Przykładowe dane wyjściowe:

    NAME                                INTERNAL_IP
    aks-nodepool1-19409214-vmss000003   10.224.0.8
    

    W poprzednim przykładzie 10.224.0.62 jest wewnętrznym adresem IP węzła systemu Windows Server.

  5. Utwórz połączenie SSH z węzłem systemu Windows Server przy użyciu wewnętrznego adresu IP i połącz się z portem 22 za pośrednictwem portu 2022 na komputerze dewelopera. Domyślną nazwą użytkownika węzłów usługi AKS jest azureuser. Zaakceptuj monit, aby kontynuować połączenie. Następnie zostanie wyświetlony monit powłoki bash o węźle systemu Windows Server:

    ssh -o 'ProxyCommand ssh -p 2022 -W %h:%p azureuser@127.0.0.1' azureuser@10.224.0.62
    

    Przykładowe dane wyjściowe:

    The authenticity of host '10.224.0.62 (10.224.0.62)' can't be established.
    ECDSA key fingerprint is SHA256:1234567890abcdefghijklmnopqrstuvwxyzABCDEFG.
    Are you sure you want to continue connecting (yes/no)? yes
    

    Uwaga

    Jeśli wolisz używać uwierzytelniania za pomocą hasła, dołącz parametr -o PreferredAuthentications=password. Na przykład:

     ssh -o 'ProxyCommand ssh -p 2022 -W %h:%p azureuser@127.0.0.1' -o PreferredAuthentications=password azureuser@10.224.0.62
    

Uzyskiwanie dostępu do węzła systemu Windows przy użyciu kontenera procesów hosta

  1. Utwórz hostprocess.yaml następującą zawartość i zastąp ciąg AKSWINDOWSNODENAME nazwą węzła systemu Windows usługi AKS.

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        pod: hpc
      name: hpc
    spec:
      securityContext:
        windowsOptions:
          hostProcess: true
          runAsUserName: "NT AUTHORITY\\SYSTEM"
      hostNetwork: true
      containers:
        - name: hpc
          image: mcr.microsoft.com/windows/servercore:ltsc2022 # Use servercore:1809 for WS2019
          command:
            - powershell.exe
            - -Command
            - "Start-Sleep 2147483"
          imagePullPolicy: IfNotPresent
      nodeSelector:
        kubernetes.io/os: windows
        kubernetes.io/hostname: AKSWINDOWSNODENAME
      tolerations:
        - effect: NoSchedule
          key: node.kubernetes.io/unschedulable
          operator: Exists
        - effect: NoSchedule
          key: node.kubernetes.io/network-unavailable
          operator: Exists
        - effect: NoExecute
          key: node.kubernetes.io/unreachable
          operator: Exists
    
  2. Uruchom polecenie kubectl apply -f hostprocess.yaml , aby wdrożyć kontener procesów hosta systemu Windows (HPC) w określonym węźle systemu Windows.

  3. Użyj witryny kubectl exec -it [HPC-POD-NAME] -- powershell.

  4. Aby uzyskać dostęp do węzła systemu Windows, możesz uruchomić dowolne polecenia programu PowerShell wewnątrz kontenera HPC.

Uwaga

Aby uzyskać dostęp do plików w węźle systemu Windows, należy przełączyć folder główny na C:\ wewnątrz kontenera HPC.

Protokół SSH przy użyciu usługi Azure Bastion dla systemu Windows

Jeśli węzeł proxy systemu Linux nie jest osiągalny, użycie usługi Azure Bastion jako serwera proxy jest alternatywą. Ta metoda wymaga skonfigurowania hosta usługi Azure Bastion dla sieci wirtualnej, w której znajduje się klaster. Aby uzyskać więcej informacji, zobacz Połączenie z usługą Azure Bastion.

Protokół SSH przy użyciu prywatnych adresów IP z interfejsu API usługi AKS (wersja zapoznawcza)

Jeśli nie masz dostępu do interfejsu API platformy Kubernetes, możesz uzyskać dostęp do właściwości, takich jak Node IP i Node Name za pośrednictwem interfejsu API puli agentów usługi AKS (wersja zapoznawcza) (dostępnego w wersjach zapoznawczych lub nowszych 07-02-2023 ), aby nawiązać połączenie z węzłami usługi AKS.

Ważne

Funkcje usługi AKS w wersji zapoznawczej są dostępne na zasadzie samoobsługi. Wersje zapoznawcze są udostępniane w wersji "as is" i "jako dostępne" i są wykluczone z umów dotyczących poziomu usług i ograniczonej gwarancji. Wersje zapoznawcze usługi AKS są częściowo objęte pomocą techniczną dla klientów. W związku z tym te funkcje nie są przeznaczone do użytku produkcyjnego. Aby uzyskać więcej informacji, zobacz następujące artykuły pomocy technicznej:

Tworzenie interaktywnego połączenia powłoki z węzłem przy użyciu adresu IP

Dla wygody węzły usługi AKS są uwidocznione w sieci wirtualnej klastra za pośrednictwem prywatnych adresów IP. Należy jednak znajdować się w sieci wirtualnej klastra do połączenia SSH z węzłem. Jeśli nie masz jeszcze skonfigurowanego środowiska, możesz użyć usługi Azure Bastion do ustanowienia serwera proxy, z którego można nawiązać połączenie SSH z węzłami klastra. Upewnij się, że usługa Azure Bastion jest wdrożona w tej samej sieci wirtualnej co klaster.

  1. Uzyskaj prywatne adresy IP przy użyciu az aks machine list polecenia , przeznaczone dla wszystkich maszyn wirtualnych w określonej puli węzłów z flagą --nodepool-name .

    az aks machine list --resource-group myResourceGroup  --cluster-name myAKSCluster --nodepool-name nodepool1 -o table
    

    W poniższych przykładowych danych wyjściowych przedstawiono wewnętrzne adresy IP wszystkich węzłów w puli węzłów:

    Name                               Ip           Family
    ---------------------------------  -----------  -----------
    aks-nodepool1-33555069-vmss000000  10.224.0.5   IPv4
    aks-nodepool1-33555069-vmss000001  10.224.0.6   IPv4
    aks-nodepool1-33555069-vmss000002  10.224.0.4   IPv4
    

    Aby zastosować element docelowy określonego węzła w puli węzłów, użyj flagi --machine-name :

    az aks machine show --cluster-name myAKScluster --nodepool-name nodepool1 -g myResourceGroup --machine-name aks-nodepool1-33555069-vmss000000 -o table
    

    W poniższych przykładowych danych wyjściowych przedstawiono wewnętrzny adres IP wszystkich określonego węzła:

    Name                               Ip         Family
    ---------------------------------  -----------  -----------
    aks-nodepool1-33555069-vmss000000  10.224.0.5   IPv4
    
  2. Połączenie SSH z węzłem przy użyciu prywatnego adresu IP uzyskanego w poprzednim kroku. Ten krok dotyczy tylko maszyn z systemem Linux. W przypadku maszyn z systemem Windows zobacz Połączenie z usługą Azure Bastion.

    ssh -i /path/to/private_key.pem azureuser@10.224.0.33
    

Następne kroki

Jeśli potrzebujesz więcej danych dotyczących rozwiązywania problemów, możesz wyświetlić dzienniki kubeletu lub wyświetlić dzienniki płaszczyzny sterowania kubernetes.

Aby dowiedzieć się więcej na temat zarządzania kluczami SSH, zobacz Zarządzanie konfiguracją protokołu SSH.