Проверка живучести с помощью кода C#, выдающего ошибку

#c# #kubernetes #.net-core #kubernetes-pod

Вопрос:

Я пытаюсь реализовать исследование живости с помощью кода C# (.Net core framework). Я просто хочу запустить команду curl внутри контейнера, как это . Ниже приведен фрагмент кода:

 IList<string> command = new List<string>();
V1Probe livnessconfig = null;
command.Add("curl http://localhost:5001/checkhealth/");
V1ExecAction execommand = new V1ExecAction(command);
livnessconfig = new V1Probe { Exec = execommand, InitialDelaySeconds = 10, PeriodSeconds = 10, TimeoutSeconds = 5, FailureThreshold = 3 };
 

Но получаю эту ошибку в описании модуля:

Ошибка в пробе живучести: ошибка rpc: код = Неизвестный desc = не удалось выполнить в контейнере: не удалось запустить exec «a80d33b5b2046b8e606ed622da7085013a725»: Сбой выполнения OCI: сбой выполнения: container_linux.go:380: запуск процесса контейнера вызван: exec: «завиток http://localhost:5001/checkhealth/»: завиток статистики http://localhost:5001/checkhealth/

Может ли кто-нибудь сообщить мне, является ли это правильным способом предоставления команды V1ExecAction. Его реализация метаданных в K8s.Модели, показывающие, что V1ExecAction принимает команду в списке:

     #region Assembly KubernetesClient, Version=3.0.0.0, Culture=neutral, PublicKeyToken=a0f90e8c9af122d

using Newtonsoft.Json;
using System.Collections.Generic;

namespace k8s.Models
{
    //
    // Summary:
    //     ExecAction describes a "run in container" action.
    public class V1ExecAction
    {
        //
        // Summary:
        //     Initializes a new instance of the V1ExecAction class.
        public V1ExecAction();
        //
        // Summary:
        //     Initializes a new instance of the V1ExecAction class.
        //
        // Parameters:
        //   command:
        //     Command is the command line to execute inside the container, the working directory
        //     for the command is root ('/') in the container's filesystem. The command is simply
        //     exec'd, it is not run inside a shell, so traditional shell instructions ('|',
        //     etc) won't work. To use a shell, you need to explicitly call out to that shell.
        //     Exit status of 0 is treated as live/healthy and non-zero is unhealthy.
        public V1ExecAction(IList<string> command = null);

        //
        // Summary:
        //     Gets or sets command is the command line to execute inside the container, the
        //     working directory for the command is root ('/') in the container's filesystem.
        //     The command is simply exec'd, it is not run inside a shell, so traditional shell
        //     instructions ('|', etc) won't work. To use a shell, you need to explicitly call
 

       //out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.
         [JsonProperty(PropertyName = "command")]
      public IList<string> Command { get; set; }
  } }
 

Комментарии:

1. Является ли код, выполняемый на контейнере, вашим? Если да, то почему бы вам не воспользоваться проверками здоровья: docs.microsoft.com/en-us/aspnet/core/host-and-deploy/… , это объясняет, как использовать живость в Kubernetes.

2. @DevRacker: Я использую класс V1Probe в клиенте Kubernetes : github.com/kubernetes-client/csharp/blob/…

Ответ №1:

Вы перепутали форму Exec с формой оболочки; вы можете либо изменить command ее, чтобы использовать оболочку явно, либо исправить вызов, чтобы он был совместим с exec. Вот что stat пытался сказать вам ответ: такого файла с именем нет curl http...

Использование sh

 command.Add("sh");
command.Add("-c");
command.Add("curl http://localhost:5001/checkhealth/");
 

Использование собственного exec

 command.Add("curl");
command.Add("http://localhost:5001/checkhealth/");
 

Хотя это было не то, о чем вы спрашивали, следующая проблема, с которой вы столкнетесь, заключается в том, что curl меняет свой статус выхода только в зависимости от того, может ли он подключиться, а не 200 по сравнению с не 200 кодами состояния HTTP. Вы захотите --fail , чтобы аргумент curl изменял свой код возврата в зависимости от статуса HTTP

Вы также можете захотеть включить --silent , так как вывод команды проверки работоспособности отображается в журналах kubelet и в kubectl describe pod