Udostępnij za pośrednictwem


Nawiązywanie połączenia z węzłami klastra usługi Azure Kubernetes Service (AKS) 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.

W tym artykule opisano dwie opcje bezpiecznego połączenia z węzłami AKS Linux i węzłami Windows. 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 informacje o prywatnych 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ć lub prywatnego adresu IP hosta.

Uzyskiwanie dostępu do węzłów za pomocą interfejsu API platformy Kubernetes

Ta metoda wymaga 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ć te kroki, musisz Azure CLI w wersji 2.0.64 lub nowszej. Uruchom polecenie , aby sprawdzić wersję. Jeśli musisz zainstalować lub uaktualnić, zobacz Install Azure CLI.

Wykonaj te kroki, jeśli nie masz klucza SSH. Utwórz klucz SSH w zależności od obrazu systemu operacyjnego węzła dla macOS i Linux lub Windows. Zapisz parę kluczy w formacie OpenSSH i unikaj nieobsługiwanych formatów, takich jak . 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 swojego węzła przy użyciu lub prywatnego adresu IP. Użytkownicy Windows powinni przejść do sekcji serwera proxy dla Windows Server, aby znaleźć obejście problemu z używaniem SSH przez serwer proxy.

Nawiązywanie połączenia za pomocą debugowania narzędzia kubectl

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

  1. Aby wyświetlić listę węzłów, użyj 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 , 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/azurelinux/busybox:1.36
    

    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 komunikować się z sesją węzła, uruchamiając polecenie w uprzywilejowanym kontenerze.

Zamykanie trybu debugowania kubectl

Po zakończeniu pracy z węzłem wprowadź polecenie , aby zakończyć interakcyjną sesję powłoki. Po zamknięciu interaktywnej sesji kontenera usuń zasobnik debugowania używany z .

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

Windows Server połączenie serwera proxy dla protokołu SSH

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

Tworzenie serwera proxy

Obecnie nie można nawiązać połączenia z węzłem Windows Server bezpośrednio przy użyciu kubectl debug. Zamiast tego należy najpierw nawiązać połączenie z innym węzłem w klastrze przy użyciu kubectl, a następnie połączyć się z węzłem 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 polecenia . Aby uzyskać więcej informacji, wykonaj poprzednie kroki w sekcji kubectl. Utwórz połączenie SSH z węzłem 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 Windows Server.

Ważne

Poniższe kroki tworzenia połączenia SSH z węzłem Windows Server z innego węzła mogą być używane tylko w przypadku utworzenia klastra usługi AKS przy użyciu Azure CLI z parametrem --generate-ssh-keys. Jeśli zamiast tego chcesz użyć własnych kluczy SSH, możesz użyć polecenia 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 Azure Bastion, aby nawiązać połączenie.

  1. Użyj polecenia , 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/azurelinux/busybox:1.36
    

    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 polecenia , aby uzyskać nazwę zasobnika uruchomionego przez .

    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 jest nazwą zasobnika uruchomionego przez .

  3. 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 na komputerze deweloperskim do portu na wdrożonym zasobniku. W przypadku używania polecenia do otwierania połączenia i przesyłania dalej ruchu sieciowego połączenie pozostaje otwarte do momentu zatrzymania polecenia.

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

    kubectl get nodes -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
    aksnpwin000000                      10.224.0.62
    

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

  5. Utwórz połączenie SSH z węzłem 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 węzła serwera 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 . 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
    

Użyj kontenera procesów hosta do uzyskania dostępu do węzła Windows

  1. Uruchom następujący skrypt, aby utworzyć plik . W skrypcie zastąp AKSWINDOWSNODENAME nazwą węzła usługi AKS Windows.

    Ta specyfikacja używa obrazu podstawowego nanoserver. Obraz podstawowy nie ma programu PowerShell, ale ponieważ działa jako kontener procesów hosta (HPC), program PowerShell jest dostępny na podstawowej maszynie wirtualnej.

    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/nanoserver:ltsc2022 # Use nanoserver: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 kubectl apply -f hostprocess.yaml, aby wdrożyć Windows HPC w określonym węźle Windows.

  3. Użyj witryny .

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

Uwaga

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

Protokół SSH z Azure Bastion

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

Protokół SSH z prywatnymi adresami IP z sieci wirtualnej klastra

Dla wygody węzły AKS są dostępne w sieci wirtualnej klastra poprzez prywatne adresy IP. Musisz jednak być w wirtualnej sieci klastra, aby połączyć się przez SSH z węzłem.

  1. Jeśli nie masz dostępu do interfejsu API platformy Kubernetes, możesz uzyskać dostęp do właściwości, takich jak i za pośrednictwem interfejsu API puli agentów usługi AKS , (dostępnego w stabilnych wersjach lub nowszych), aby nawiązać połączenie z węzłami usługi AKS. Uzyskaj prywatne adresy IP, używając polecenia , skierowanego na wszystkie maszyny wirtualne w określonej puli węzłów, z flagą .

    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 skierować działania na określony węzeł w puli węzłów, użyj flagi .

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

    Następujące przykładowe dane wyjściowe pokazują wewnętrzny adres IP określonego węzła:

    Name                               Ip         Family
    ---------------------------------  -----------  -----------
    aks-nodepool1-33555069-vmss000000  10.224.0.5   IPv4
    
  2. Połącz się z węzłem przez SSH, używając prywatnego adresu IP uzyskanego w poprzednim kroku. Ten krok dotyczy tylko węzłów systemu Linux.

    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 kubelet oraz dzienniki płaszczyzny kontrolnej Kubernetes.

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