Curl init: PHP: curl_init — Manual
Содержание
контейнеров инициализации | Kubernetes
На этой странице представлен обзор контейнеров инициализации: специализированных контейнеров, которые запускаются
перед контейнерами приложений в Pod.
Контейнеры инициализации могут содержать утилиты или сценарии установки, отсутствующие в образе приложения.
Вы можете указать init-контейнеры в спецификации Pod вместе с контейнерами
массив (описывающий контейнеры приложений).
Понимание контейнеров инициализации
Под может иметь несколько контейнеров
запуск приложений внутри него, но он также может иметь один или несколько контейнеров инициализации, которые запускаются
перед запуском контейнеров приложений.
Контейнеры инициализации точно такие же, как обычные контейнеры, за исключением:
- Контейнеры инициализации всегда выполняются до завершения.
- Каждый контейнер инициализации должен быть успешно завершен до запуска следующего.
Если init-контейнер Pod дает сбой, kubelet многократно перезапускает этот init-контейнер, пока не добьется успеха.
Однако, если у пода есть restartPolicy
«Никогда», и происходит сбой контейнера инициализации во время запуска этого пода, Kubernetes рассматривает весь под как сбойный.
Чтобы указать контейнер инициализации для пода, добавьте поле initContainers
в
спецификация пода,
как массив из контейнеров
элементов (аналогично полю приложения контейнеров
и его содержимому).
См. Контейнер в
Справочник по API для более подробной информации.
Состояние контейнеров инициализации возвращается в .status.initContainerStatuses
поле в виде массива статусов контейнера (аналогично .status.containerStatuses
поле).
Отличия от обычных контейнеров
Контейнеры инициализации поддерживают все поля и функции контейнеров приложений,
включая ограничения ресурсов, объемы и параметры безопасности. Однако
запросы ресурсов и ограничения для контейнера инициализации обрабатываются по-разному,
как описано в Ресурсах.
Кроме того, контейнеры инициализации не поддерживают жизненный цикл
, livenessProbe
, readynessProbe
или
startupProbe
, потому что они должны быть выполнены до завершения, прежде чем Pod будет готов.
Если вы укажете несколько контейнеров инициализации для пода, kubelet запускает каждый контейнер инициализации.
контейнер последовательно. Каждый контейнер инициализации должен завершиться успешно, прежде чем сможет запуститься следующий.
Когда все контейнеры инициализации завершены, kubelet инициализирует
контейнеры приложений для Pod и запускает их как обычно.
Использование контейнеров инициализации
Поскольку контейнеры инициализации имеют отдельные образы из контейнеров приложений, они
имеют некоторые преимущества для кода, связанного с запуском:
- Контейнеры инициализации могут содержать утилиты или пользовательский код для установки, которых нет в приложении.
изображение. Например, нет необходимости делать изображениеИЗ
другое изображение, просто чтобы использовать такой инструмент, как
sed
,awk
,python
илиdig
во время установки. - Роли создателя образа приложения и развертывателя могут работать независимо без
необходимость совместного создания единого образа приложения. - Контейнеры инициализации могут работать с другим представлением файловой системы, чем контейнеры приложений в
тот же Под. Следовательно, им может быть предоставлен доступ к
Секреты, к которым контейнеры приложений не имеют доступа. - Поскольку контейнеры инициализации запускаются до запуска любых контейнеров приложений, контейнеры инициализации предлагают
механизм блокировки или задержки запуска контейнера приложения до тех пор, пока не будет выполнен набор предварительных условий. Один раз
предварительные условия выполнены, все контейнеры приложений в поде могут запускаться параллельно. - Контейнеры инициализации могут безопасно запускать утилиты или пользовательский код, который в противном случае сделал бы приложение
образ контейнера менее безопасен. Разделяя ненужные инструменты, вы можете ограничить атаку
Поверхность вашего образа контейнера приложения.
Примеры
Вот несколько идей по использованию контейнеров инициализации:
быть создан с помощью однострочной команды оболочки, например:
для i в {1..100}; спать 1; если копать мой сервис; затем выход 0; фи; сделанный; выход 1
Зарегистрируйте этот модуль на удаленном сервере из нисходящего API с помощью команды вроде:
curl -X POST http://$MANAGEMENT_SERVICE_HOST:$MANAGEMENT_SERVICE_PORT/register -d 'instance=$(
)&ip= $( )' Подождите некоторое время, прежде чем запускать контейнер приложения с помощью команды вроде
sleep 60
Клонирование репозитория Git в том
Поместите значения в файл конфигурации и запустите инструмент шаблона для динамического
создать файл конфигурации для основного контейнера приложения. Например,
поместитеЗначение POD_IP
в конфигурации и создание основного приложения
конфигурационный файл с помощью Jinja.
Используемые контейнеры инициализации
В этом примере определяется простой под, который имеет два контейнера инициализации.
Первый ждет myservice
, а второй ждет mydb
. Как только оба
init контейнеры завершены, Pod запускает контейнер приложения из своего раздела spec
.
APIВерсия: v1 вид: стручок метаданные: имя: myapp-стручок этикетки: app.kubernetes.io/имя: MyApp спецификация: контейнеры: - имя: myapp-контейнер изображение: Busybox: 1.28 команда: ['sh', '-c', 'echo Приложение запущено! && спать 3600'] initContainers: - имя: init-myservice изображение: Busybox: 1.28 команда: ['sh', '-c', "до nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; выполнить эхо-ожидание myservice; спать 2 ; сделанный"] - имя: init-mydb изображение: Busybox: 1.28 команда: ['sh', '-c', "до nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; выполнить эхо-ожидание mydb; спать 2 ; сделанный"]
Вы можете запустить этот модуль, выполнив:
kubectl apply -f myapp.yaml
Вывод примерно такой:
pod/myapp-pod создан
И проверьте его статус с помощью:
kubectl get -f myapp.yaml
Вывод примерно такой:
ИМЯ ГОТОВ СТАТУС ПЕРЕЗАПУСКА ВОЗРАСТ myapp-pod 0/1 Инициализация: 0/2 0 6 м
или для более подробной информации:
kubectl описать -f myapp.yaml
Вывод аналогичен этому:
Имя: myapp-pod Пространство имен: по умолчанию [...] Ярлыки: app.kubernetes.io/name=MyApp Статус: ожидание [...] Инициальные контейнеры: init-моя служба: [...] Состояние: работает [...] инициализация-mydb: [...] Состояние: Ожидание Причина: Инициализация пода Готово: Ложь [...] Контейнеры: myapp-контейнер: [...] Состояние: Ожидание Причина: Инициализация пода Готово: Ложь [...] События: FirstSeen LastSeen Count From SubObjectPath Тип Причина Сообщение --------- -------- ----- ---- ------------- -------- --- --- ------- 16s 16s 1 {default-scheduler} Обычный Запланировано Успешно назначен myapp-pod на 172.17.4.201 16s 16s 1 {kubelet 172.17.4.201} spec.initContainers{init-myservice} Обычный Вытягивание извлекающего образа "busybox" 13 с 13 с 1 {kubelet 172.17.4.201} spec.initContainers{init-myservice} Обычный Получено Успешно получено изображение "busybox" 13s 13s 1 {kubelet 172.17.4.201} spec.initContainers{init-myservice} Обычный Создан Создан контейнер init-myservice 13s 13s 1 {kubelet 172.17.4.201} spec.initContainers{init-myservice} Обычный Запущенный Запущенный контейнер init-myservice
Чтобы просмотреть журналы для контейнеров инициализации в этом поде, выполните:
kubectl logs myapp-pod -c init-myservice # Проверить первый контейнер инициализации kubectl logs myapp-pod -c init-mydb # Проверка второго контейнера инициализации
В этот момент эти контейнеры инициализации будут ожидать обнаружения служб с именем
mydb
и myservice
.
Вот конфигурация, которую вы можете использовать для отображения этих служб:
--- апиВерсия: v1 вид: сервис метаданные: имя: мойсервис спецификация: порты: - протокол: TCP порт: 80 целевой порт: 9376 --- апиВерсия: v1 вид: сервис метаданные: имя: mydb спецификация: порты: - протокол: TCP порт: 80 целевой порт: 9377
Чтобы создать службы mydb
и myservice
:
kubectl apply -f services.yaml
Вывод аналогичен этому:
service/myservice created сервис/mydb создан
Затем вы увидите, что эти контейнеры инициализации завершены, и что myapp-pod
Pod переходит в состояние Running:
kubectl получить -f myapp.yaml
Вывод примерно такой:
ИМЯ ГОТОВ СТАТУС ПЕРЕЗАПУСКА ВОЗРАСТ myapp-pod 1/1 Бег 0 9м
Этот простой пример должен вдохновить вас на создание собственного
инициировать контейнеры. Что дальше содержит ссылку на более подробный пример.
Подробное поведение
Во время запуска пода kubelet откладывает запуск контейнеров инициализации до тех пор, пока
и хранилище готовы. Затем kubelet запускает контейнеры инициализации пода в порядке
они появляются в спецификации Pod.
Каждый контейнер инициализации должен быть успешно завершен до
начинается следующий контейнер. Если контейнер не запускается из-за среды выполнения или
завершается с ошибкой, попытка повторяется в соответствии с политикой перезапуска пода
. Однако,
если для параметра restartPolicy Pod установлено значение «Всегда», контейнеры инициализации используют
restartPolicy
OnFailure.
Pod не может быть готов
, пока все контейнеры инициализации не будут успешно завершены. Порты на
init-контейнер не агрегируется в сервисе. Под, который инициализируется
находится в Состояние ожидания
, но условие должно иметь значение Initialized
, равное false.
Если модуль перезапускается или перезапускается, все контейнеры инициализации
должен выполнить снова.
Изменения спецификации контейнера инициализации ограничены полем образа контейнера.
Изменение поля изображения контейнера инициализации эквивалентно перезапуску пода.
Поскольку контейнеры инициализации можно перезапустить, повторить попытку или выполнить повторно, контейнер инициализации
код должен быть идемпотентным. В частности, код, записывающий файлы на ПустыеКаталоги
следует быть готовым к тому, что выходной файл уже существует.
Контейнеры инициализации содержат все поля контейнера приложения. Тем не менее, Кубернетес
запрещает использование readinessProbe
, поскольку контейнеры инициализации не могут
определяют готовность, отличную от завершения. Это выполняется во время проверки.
Используйте activeDeadlineSeconds
на модуле, чтобы предотвратить сбой контейнеров инициализации навсегда.
Активный крайний срок включает контейнеры инициализации.
Однако рекомендуется использовать activeDeadlineSeconds
, только если команды развертывают свое приложение
как задание, потому что activeDeadlineSeconds
действует даже после завершения initContainer.
Pod, который уже работает правильно, будет уничтожен на activeDeadlineSeconds
, если вы установите.
Имя каждого приложения и контейнера инициализации в поде должно быть уникальным; а
ошибка проверки выдается для любого контейнера, разделяющего имя с другим.
Ресурсы
Учитывая порядок и выполнение для контейнеров инициализации, следующие правила
для использования ресурсов применяются:
- Наивысший из всех запросов ресурсов или ограничений, определенных для всех инициализаций.
контейнеры - это действующий запрос/лимит инициализации . Если какой-либо ресурс не имеет
Указанный лимит ресурсов считается максимальным лимитом. - Эффективный запрос/лимит пода для ресурса больше:
- сумма запросов/лимитов всех контейнеров приложений для ресурса
- эффективный запрос/лимит инициализации для ресурса
- Планирование выполнено на основе действующих запросов/лимитов, что означает
Контейнеры init могут резервировать ресурсы для инициализации, которые не используются
при жизни Под. - Уровень QoS (качество обслуживания) эффективного уровня QoS пода — это
Уровень QoS как для контейнеров инициализации, так и для контейнеров приложений.
Квоты и лимиты применяются на основе действующего запроса Pod и
предел.
Группы управления на уровне пода (cgroups) основаны на действующем запросе пода и
лимит, то же, что планировщик.
Причины перезапуска пода
Под может перезапуститься, вызывая повторное выполнение контейнеров инициализации, для следующих
причины:
- Контейнер инфраструктуры Pod перезапущен. Это редкость и будет
должен быть сделан кем-то с корневым доступом к узлам. - Все контейнеры в поде завершаются, пока для параметра
restartPolicy
установлено значение «Всегда»,
принудительный перезапуск, и запись о завершении контейнера инициализации была потеряна из-за
к сбору мусора.
Модуль не будет перезапущен при изменении образа инициализационного контейнера или
Запись завершения контейнера инициализации была потеряна из-за сборки мусора. Этот
применяется для Kubernetes v1.20 и более поздних версий. Если вы используете более раннюю версию
Kubernetes, обратитесь к документации по используемой версии.
Что дальше? )
Установить Rust - Язык программирования Rust
Использование rustup (рекомендуется)
Похоже, вы используете macOS, Linux или другую Unix-подобную ОС. Чтобы загрузить Rustup и установить Rust, запустите в своем терминале следующее, а затем следуйте инструкциям на экране. См. «Другие методы установки», если вы используете Windows.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Похоже, вы используете Windows. Чтобы начать использовать Rust, загрузите установщик, затем запустите программу и следуйте инструкциям на экране. Вам может потребоваться установить инструменты сборки Visual Studio C++, когда будет предложено сделать это. Если вы не используете Windows, см. «Другие способы установки».
Подсистема Windows для Linux
Если вы являетесь пользователем подсистемы Windows для Linux, запустите в своем терминале следующее, а затем следуйте инструкциям на экране, чтобы установить Rust.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | ш
Rust работает на Windows, Linux, macOS, FreeBSD и NetBSD. Если вы используете одну из этих платформ и видите это, сообщите о проблеме со следующими значениями:
навигатор.платформа:
MacIntel
navigator.appВерсия:
5.0 (Macintosh)
Сообщить о проблеме
Чтобы установить Rust, если вы используете Unix,
, запустите в своем терминале следующее, а затем следуйте инструкциям на экране.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | ш
Если вы используете Windows, загрузите
и запустите rustup-init.exe, затем следуйте инструкциям на экране.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | ш
Если вы используете Windows, загрузите
и запустите rustup-init. exe, затем следуйте инструкциям на экране.
Примечания по установке Rust
Начало работы
Если вы только начинаете
Rust и хотел бы более подробное прохождение, см.
начальная страница.
Рекомендации по Windows
В Windows для Rust дополнительно требуются инструменты сборки C++.
для Visual Studio 2013 или более поздней версии. Самый простой способ приобрести сборку
инструменты путем установки
Инструменты сборки Microsoft Visual C++ 2019
который предоставляет только инструменты сборки Visual C++. В качестве альтернативы вы
можно установить
Визуальная студия 2019, Visual Studio 2017, Visual Studio 2015 или Visual
Studio 2013 и во время установки выберите «Инструменты C++».
Для получения дополнительной информации о настройке Rust в Windows см.
Документация по rustup для Windows .
Управление набором инструментов с помощью
rustup
Rust устанавливается и управляется
ржавчина
инструмент. У Rust есть 6 недель
процесс быстрого выпуска
и поддерживает
большой
количество платформ, поэтому существует множество сборок Rust, доступных на
в любой момент. rustup
последовательно управляет этими сборками.
на каждой платформе, которую поддерживает Rust, что позволяет установить Rust
из каналов бета-тестирования и ночных выпусков, а также поддержку
дополнительные цели кросс-компиляции.
Если вы ранее устанавливали rustup
, вы можете обновить
вашу установку, запустив rustup update
.
Для получения дополнительной информации см.
рустап
документация.
Настройка
ПУТЬ
среда
переменная
В среде разработки Rust все инструменты устанавливаются в
~/.груз/бен
%USERPROFILE%\.cargo\bin
каталог, и именно здесь вы найдете набор инструментов Rust,
включая rustc
, грузов
и rustup
.