1 - Контейнери Windows у Kubernetes
Застосунки Windows становлять значну частину сервісів та застосунків, що працюють у багатьох організаціях. Контейнери Windows забезпечують спосіб інкапсуляції процесів та пакування залежностей, що спрощує використання практик DevOps та слідування хмарним рідним патернам для застосунків Windows.
Організації, що вклались у застосунки на базі Windows та Linux, не мають шукати окремі оркестратори для управління своїми навантаженнями, що призводить до збільшення оперативної ефективності у їх розгортаннях, незалежно від операційної системи.
Windows-вузли у Kubernetes
Для увімкнення оркестрування контейнерів Windows у Kubernetes, додайте Windows-вузли до вашого поточного Linux-кластера. Планування розміщення контейнерів Windows у Podʼах на Kubernetes подібне до планування розміщення контейнерів на базі Linux.
Для запуску контейнерів Windows ваш Kubernetes кластер має включати декілька операційних систем.
Хоча панель управління можна запускати лише на Linux, ви можете розгортати робочі вузли, що працюють як на Windows, так і на Linux.
Windows вузли є підтримуваними, за умови, що операційна система є Windows Server 2019 або Windows Server 2022.
Цей документ використовує термін контейнери Windows для позначення контейнерів Windows з
ізоляцією на рівні процесу. Kubernetes не підтримує запуск контейнерів Windows з
ізоляцією Hyper-V.
Сумісність та обмеження
Деякі функції вузла доступні лише при використанні певного середовища для виконання контейнерів; інші не доступні на Windows-вузлах, зокрема:
- HugePages: не підтримуються для контейнерів Windows
- Привілейовані контейнери: не підтримуються для контейнерів Windows. Контейнери HostProcess пропонують схожий функціонал.
- TerminationGracePeriod: вимагає containerD
Не всі функції спільних просторів імен підтримуються. Дивіться Сумісність API для детальнішої інформації.
Дивіться Сумісність версій Windows OS для деталей щодо версій Windows, з якими Kubernetes протестовано.
З точки зору API та kubectl, контейнери Windows поводяться майже так само, як і контейнери на базі Linux. Проте, існують деякі помітні відмінності у ключовому функціоналі, які окреслені в цьому розділі.
Порівняння з Linux
Ключові елементи Kubernetes працюють однаково в Windows, як і в Linux. Цей розділ описує кілька ключових абстракцій робочих навантажень та їх співвідносяться у Windows.
Podsʼи
Pod є базовим будівельним блоком Kubernetes — найменшою та найпростішою одиницею в моделі об’єктів Kubernetes, яку ви створюєте або розгортаєте. Ви не можете розгортати Windows та
Linux контейнери в одному Podʼі. Всі контейнери в Podʼі плануються на один вузол, де кожен вузол представляє певну платформу та архітектуру. Наступні можливості, властивості та події Podʼа підтримуються з контейнерами Windows:
Один або кілька контейнерів на Pod з ізоляцією процесів та спільним використанням томів
Поля status
Podʼа
Проби готовності, життєздатності та запуску
Хуки життєвого циклу контейнера postStart & preStop
ConfigMap, Secrets: як змінні оточення або томи
Томи emptyDir
Монтування іменованих каналів хоста
Ліміти ресурсів
Поле OS:
Значення поля .spec.os.name
має бути встановлено у windows
, щоб вказати, що поточний Pod використовує контейнери Windows.
Якщо ви встановлюєте поле .spec.os.name
у windows
, вам не слід встановлювати наступні поля в .spec
цього Podʼа:
spec.hostPID
spec.hostIPC
spec.securityContext.seLinuxOptions
spec.securityContext.seccompProfile
spec.securityContext.fsGroup
spec.securityContext.fsGroupChangePolicy
spec.securityContext.sysctls
spec.shareProcessNamespace
spec.securityContext.runAsUser
spec.securityContext.runAsGroup
spec.securityContext.supplementalGroups
spec.containers[*].securityContext.seLinuxOptions
spec.containers[*].securityContext.seccompProfile
spec.containers[*].securityContext.capabilities
spec.containers[*].securityContext.readOnlyRootFilesystem
spec.containers[*].securityContext.privileged
spec.containers[*].securityContext.allowPrivilegeEscalation
spec.containers[*].securityContext.procMount
spec.containers[*].securityContext.runAsUser
spec.containers[*].securityContext.runAsGroup
У вищезазначеному списку, символи зірочки (*
) вказують на всі елементи у списку. Наприклад, spec.containers[*].securityContext
стосується обʼєкта SecurityContext для всіх контейнерів. Якщо будь-яке з цих полів вказано, Pod не буде прийнято API сервером.
[Ресурси робочих навантажень]](/docs/concepts/workloads/controllers/):
- ReplicaSet
- Deployment
- StatefulSet
- DaemonSet
- Job
- CronJob
- ReplicationController
Service. Дивіться Балансування навантаження та Service для деталей.
Podʼи, ресурси робочого навантаження та Service є критичними елементами для управління Windows навантаженнями у Kubernetes. Однак, самі по собі вони недостатні для забезпечення належного управління життєвим циклом Windows навантажень у динамічному хмарному середовищі.
Параметри командного рядка для kubelet
Деякі параметри командного рядка для kubelet ведуть себе по-іншому у Windows, як описано нижче:
- Параметр
--windows-priorityclass
дозволяє встановлювати пріоритет планування процесу kubelet (див. Управління ресурсами процесора) - Прапорці
--kube-reserved
, --system-reserved
та --eviction-hard
оновлюють NodeAllocatable - Виселення за допомогою
--enforce-node-allocable
не реалізовано - При запуску на вузлі Windows kubelet не має обмежень памʼяті або процесора.
--kube-reserved
та --system-reserved
віднімаються лише від NodeAllocatable
і не гарантують ресурсів для навантаження. Дивіться Управління ресурсами для вузлів Windows для отримання додаткової інформації. - Умова
PIDPressure
не реалізована - Kubelet не вживає дій щодо виселення з приводу OOM (Out of memory)
Сумісність API
Існують важливі відмінності в роботі API Kubernetes для Windows через ОС та середовище виконання контейнерів. Деякі властивості навантаження були розроблені для Linux, і їх не вдається виконати у Windows.
На високому рівні концепції ОС відрізняються:
- Ідентифікація — Linux використовує ідентифікатор користувача (UID) та ідентифікатор групи (GID), які представлені як цілі числа. Імена користувачів і груп не є канонічними — це просто псевдоніми у
/etc/groups
або /etc/passwd
до UID+GID. Windows використовує більший бінарний ідентифікатор безпеки (SID), який зберігається в базі даних Windows Security Access Manager (SAM). Ця база даних не використовується спільно між хостом та контейнерами або між контейнерами. - Права доступу до файлів — Windows використовує список управління доступом на основі (SID), тоді як POSIX-системи, такі як Linux, використовують бітову маску на основі дозволів обʼєкта та UID+GID, плюс опціональні списки управління доступом.
- Шляхи до файлів — у Windows зазвичай використовується
\
замість /
. Бібліотеки вводу-виводу Go зазвичай приймають обидва і просто забезпечують їх роботу, але коли ви встановлюєте шлях або командний рядок, що інтерпретується всередині контейнера, можливо, буде потрібен символ \
. - Сигнали — інтерактивні програми Windows обробляють завершення по-іншому і можуть реалізувати одне або декілька з цього:
- UI-потік обробляє чітко визначені повідомлення, включаючи
WM_CLOSE
. - Консольні програми обробляють Ctrl-C або Ctrl-break за допомогою обробника керування.
- Служби реєструють функцію обробника керування службами, яка може приймати коди керування
SERVICE_CONTROL_STOP
.
Коди виходу контейнера дотримуються тієї ж самої конвенції, де 0 є успіхом, а ненульове значення є помилкою. Конкретні коди помилок можуть відрізнятися між Windows та Linux. Однак коди виходу, передані компонентами Kubernetes (kubelet, kube-proxy), залишаються незмінними.
Сумісність полів для специфікацій контейнера
Наступний список документує відмінності у роботі специфікацій контейнерів Podʼа між Windows та Linux:
- Великі сторінки не реалізовані в контейнері Windows та недоступні. Вони потребують встановлення привілеїв користувача, які не налаштовуються для контейнерів.
requests.cpu
та requests.memory
— запити віднімаються від доступних ресурсів вузла, тому вони можуть використовуватися для уникнення перевстановлення вузла. Проте вони не можуть гарантувати ресурси в перевстановленому вузлі. Їх слід застосовувати до всіх контейнерів як найкращу практику, якщо оператор хоче уникнути перевстановлення повністю.securityContext.allowPrivilegeEscalation
— неможливо на Windows; жодна з можливостей не підключенаsecurityContext.capabilities
— можливості POSIX не реалізовані у WindowssecurityContext.privileged
— Windows не підтримує привілейовані контейнери, замість них використовуйте Контейнери HostProcesssecurityContext.procMount
— Windows не має файлової системи /proc
securityContext.readOnlyRootFilesystem
— неможливо на Windows; запис доступу необхідний для реєстру та системних процесів, щоб виконуватися всередині контейнераsecurityContext.runAsGroup
— неможливо на Windows, оскільки відсутня підтримка GIDsecurityContext.runAsNonRoot
— це налаштування перешкоджатиме запуску контейнерів як ContainerAdministrator
, який є найближчим еквівалентом користувача root у Windows.securityContext.runAsUser
— використовуйте runAsUserName
замість цьогоsecurityContext.seLinuxOptions
— неможливо у Windows, оскільки SELinux специфічний для LinuxterminationMessagePath
— у цьому є деякі обмеження, оскільки Windows не підтримує зіставлення одного файлу. Стандартне значення — /dev/termination-log
, що працює, оскільки воно стандартно не існує у Windows.
Сумісність полів для специфікацій Podʼа
Наступний список документує відмінності у роботі специфікацій Podʼа між Windows та Linux:
hostIPC
та hostpid
— спільне використання простору імен хосту неможливе у WindowshostNetwork
— див. нижчеdnsPolicy
— встановлення dnsPolicy
Podʼа на ClusterFirstWithHostNet
не підтримується у Windows, оскільки мережа хосту не надається. Podʼи завжди працюють з мережею контейнера.podSecurityContext
див. нижчеshareProcessNamespace
— це бета-функція, яка залежить від просторів імен Linux, які не реалізовані у Windows. Windows не може ділитися просторами імен процесів або кореневою файловою системою контейнера. Можлива лише спільна мережа.terminationGracePeriodSeconds
— це не повністю реалізовано в Docker у Windows, див. тікет GitHub. Поведінка на сьогодні полягає в тому, що процес ENTRYPOINT отримує сигнал CTRL_SHUTDOWN_EVENT, потім Windows типово чекає 5 секунд, і нарешті вимикає всі процеси за допомогою звичайної поведінки вимкнення Windows. Значення 5 секунд визначаються в реєстрі Windows всередині контейнера, тому їх можна перевизначити при збиранні контейнера.volumeDevices
— це бета-функція, яка не реалізована у Windows. Windows не може підключати блочні пристрої безпосередньо до Podʼів.volumes
- Якщо ви визначаєте том
emptyDir
, ви не можете встановити його джерело тома на memory
.
- Ви не можете активувати
mountPropagation
для монтування томів, оскільки це не підтримується у Windows.
Сумісність полів для hostNetwork
СТАН ФУНКЦІОНАЛУ:
Kubernetes v1.26 [alpha]
Тепер kubelet може вимагати, щоб Podʼи, що працюють на вузлах Windows, використовували мережевий простір імен хоста замість створення нового простору імен мережі Podʼа. Щоб увімкнути цю функціональність, передайте --feature-gates=WindowsHostNetwork=true
в kubelet.
Примітка:
Ця функціональність потребує контейнерного середовища, яке підтримує цю функціональність.Сумісність полів для контексту безпеки Podʼа
Тільки поля securityContext.runAsNonRoot
та securityContext.windowsOptions
з поля Podʼа securityContext
працюють у Windows.
Виявлення проблем вузла
Механізм виявлення проблем вузла (див. Моніторинг справності вузла) має попередню підтримку для Windows. Для отримання додаткової інформації відвідайте сторінку проєкту на GitHub.
Контейнер паузи
У кластері Kubernetes спочатку створюється інфраструктурний або контейнер "пауза", щоб вмістити інший контейнер. У Linux, групи керування та простори імен, що утворюють з Pod, потребують процесу для підтримки їхнього подальшого існування; процес паузи забезпечує це. Контейнери, які належать до одного Podʼа, включаючи інфраструктурні та робочі контейнери, мають спільну мережеву точку доступу (з тою ж самою IPv4 та / або IPv6 адресою, тими самими просторами портів мережі). Kubernetes використовує контейнери паузи для того, щоб дозволити робочим контейнерам виходити з ладу або перезапускатися без втрати будь-якої конфігурації мережі.
Kubernetes підтримує багатоархітектурний образ, який включає підтримку для Windows. Для Kubernetes v1.31.0 рекомендований образ паузи — registry.k8s.io/pause:3.6
. Вихідний код доступний на GitHub.
Microsoft підтримує інший багатоархітектурний образ, з підтримкою Linux та Windows amd64, це mcr.microsoft.com/oss/kubernetes/pause:3.6
. Цей образ побудований з того ж вихідного коду, що й образ, підтримуваний Kubernetes, але всі виконавчі файли Windows підписані authenticode Microsoft. Проєкт Kubernetes рекомендує використовувати образ, підтримуваний Microsoft, якщо ви розгортаєте в операційному середовищі або середовищі подібному до операційного, яке вимагає підписаних виконавчих файлів.
Середовища виконання контейнерів
Вам потрібно встановити середовище виконання контейнерів на кожний вузол у кластері, щоб Podʼи могли там працювати.
Наступні середовища виконання контейнерів ппрацюютьу Windows:
Примітка: Цей розділ містить посилання на проєкти сторонніх розробників, які надають функціонал, необхідний для Kubernetes. Автори проєкту Kubernetes не несуть відповідальності за ці проєкти. Проєкти вказано в алфавітному порядку. Щоб додати проєкт до цього списку, ознайомтеся з
посібником з контенту перед надсиланням змін.
Докладніше. ContainerD
СТАН ФУНКЦІОНАЛУ:
Kubernetes v1.20 [stable]
Ви можете використовувати ContainerD версії 1.4.0+ як середовище виконання контейнера для вузлів Kubernetes, які працюють на Windows.
Дізнайтеся, як встановити ContainerD на вузол Windows.
Примітка:
Є
відоме обмеження при використанні GMSA з containerd для доступу до мережевих ресурсів Windows, яке потребує
патча ядра.
Mirantis Container Runtime
Mirantis Container Runtime (MCR) є доступним середовищем виконання контейнерів для всіх версій Windows Server 2019 та пізніших.
Для отримання додаткової інформації дивіться Встановлення MCR на серверах Windows.
Сумісність версій операційної системи Windows
На вузлах Windows діють строгі правила сумісності, де версія операційної системи хосту повинна відповідати версії операційної системи базового образу контейнера. Повністю підтримуються лише Windows контейнери з операційною системою контейнера Windows Server 2019.
Для Kubernetes v1.31, сумісність операційної системи для вузлів Windows (та Podʼів) виглядає так:
- Випуск LTSC Windows Server
- Windows Server 2019
- Windows Server 2022
- Випуск SAC Windows Server
- Windows Server версії 20H2
Також застосовується політика відхилення версій Kubernetes.
Рекомендації та важливі аспекти апаратного забезпечення
Примітка: Цей розділ містить посилання на проєкти сторонніх розробників, які надають функціонал, необхідний для Kubernetes. Автори проєкту Kubernetes не несуть відповідальності за ці проєкти. Проєкти вказано в алфавітному порядку. Щоб додати проєкт до цього списку, ознайомтеся з
посібником з контенту перед надсиланням змін.
Докладніше. Примітка:
Наведені тут апаратні характеристики слід розглядати як розумні стандартні значення. Вони не призначені представляти мінімальні вимоги або конкретні рекомендації для операційних середовищ. Залежно від вимог вашого навантаження ці значення можуть потребувати коригування.- 64-бітний процесор з 4 ядрами CPU або більше, здатний підтримувати віртуалізацію
- 8 ГБ або більше оперативної памʼяті
- 50 ГБ або більше вільного місця на диску
Для отримання найновішої інформації про мінімальні апаратні вимоги дивіться Вимоги апаратного забезпечення для Windows Server у документації Microsoft. Для керівництва у виборі ресурсів для операційних робочих вузлів дивіться Робочі вузли для операційного середовища в документації Kubernetes.
Для оптимізації ресурсів системи, якщо не потрібний графічний інтерфейс, бажано використовувати операційну систему Windows Server, яка не включає опцію встановлення
Windows Desktop Experience, оскільки така конфігурація зазвичай звільняє більше ресурсів системи.
При оцінці дискового простору для робочих вузлів Windows слід враховувати, що образи контейнера Windows зазвичай більші за образи контейнера Linux, розмір образів контейнерів може становити
від 300 МБ до понад 10 ГБ для одного образу. Додатково, слід зауважити, що типово диск C:
в контейнерах Windows являє собою віртуальний вільний розмір 20 ГБ, це не фактично використаний простір, а лише розмір диска, який може займати один контейнер при використанні локального сховища на хості. Дивіться Контейнери на Windows — Документація зберігання контейнерів для отримання більш детальної інформації.
Отримання допомоги та усунення несправностей
Для усунення несправностей звертайтесь до відповідного розділу цієї документації, він стане вашим головним джерелом в отриманні потрібних відомостей.
Додаткова допомога з усунення несправностей, специфічна для Windows, є в цьому розділі. Логи є важливою складовою усунення несправностей у Kubernetes. Переконайтеся, що ви додаєте їх кожного разу, коли звертаєтеся за допомогою у розвʼязані проблем до інших учасників. Дотримуйтесь інструкцій у керівництві щодо збору логів від SIG Windows.
Повідомлення про проблеми та запити нових функцій
Якщо у вас є підозра на помилку або ви хочете подати запит на нову функцію, будь ласка, дотримуйтесь настанов з участі від SIG Windows, щоб створити новий тікет. Спочатку вам слід переглянути список проблем у разі, якщо вона вже була повідомлена раніше, і додавати коментар зі своїм досвідом щодо проблеми та додавати додаткові логи. Канал SIG Windows у Slack Kubernetes також є чудовим способом отримати підтримку та ідеї для усунення несправностей перед створенням тікету.
Перевірка правильності роботи кластера Windows
Проєкт Kubernetes надає специфікацію Готовності до роботи у середовищі Windows разом з структурованим набором тестів. Цей набір тестів розділений на два набори тестів: базовий та розширений, кожен з яких містить категорії, спрямовані на тестування конкретних областей. Його можна використовувати для перевірки всіх функцій системи Windows та гібридної системи (змішана з Linux вузлами) з повним охопленням.
Щоб налаштувати проєкт на новому створеному кластері, дивіться інструкції у посібнику проєкту.
Інструмент kubeadm допомагає вам розгортати кластер Kubernetes, надаючи панель управління для управління кластером та вузли для запуску ваших робочих навантажень.
Проєкт кластерного API Kubernetes також надає засоби для автоматизації розгортання вузлів Windows.
Канали поширення Windows
Для докладного пояснення каналів поширення Windows дивіться документацію Microsoft.
Інформацію про різні канали обслуговування Windows Server, включаючи їх моделі підтримки, можна знайти на сторінці каналів обслуговування Windows Server.
2 - Посібник з запуску контейнерів Windows у Kubernetes
Ця сторінка надає покроковий опис, які ви можете виконати, щоб запустити контейнери Windows за допомогою Kubernetes. На сторінці також висвітлені деякі специфічні для Windows функції в Kubernetes.
Важливо зауважити, що створення та розгортання служб і робочих навантажень у Kubernetes працює практично однаково для контейнерів Linux та Windows. Команди kubectl, щоб працювати з кластером, ідентичні. Приклади на цій сторінці надаються для швидкого старту з контейнерами Windows.
Цілі
Налаштувати приклад розгортання для запуску контейнерів Windows на вузлі з операційною системою Windows.
Перш ніж ви розпочнете
Ви вже повинні мати доступ до кластера Kubernetes, який містить робочий вузол з операційною системою Windows Server.
Початок роботи: Розгортання робочого навантаження Windows
Наведений нижче приклад файлу YAML розгортає простий вебсервер, який працює в контейнері Windows.
Створіть файл маніфесту з назвою win-webserver.yaml
з наступним вмістом:
---
apiVersion: v1
kind: Service
metadata:
name: win-webserver
labels:
app: win-webserver
spec:
ports:
# порт, на якому має працювати ця служба
- port: 80
targetPort: 80
selector:
app: win-webserver
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: win-webserver
name: win-webserver
spec:
replicas: 2
selector:
matchLabels:
app: win-webserver
template:
metadata:
labels:
app: win-webserver
name: win-webserver
spec:
containers:
- name: windowswebserver
image: mcr.microsoft.com/windows/servercore:ltsc2019
command:
- powershell.exe
- -command
- "<#code used from https://gist.github.com/19WAS85/5424431#> ; $$listener = New-Object System.Net.HttpListener ; $$listener.Prefixes.Add('http://*:80/') ; $$listener.Start() ; $$callerCounts = @{} ; Write-Host('Listening at http://*:80/') ; while ($$listener.IsListening) { ;$$context = $$listener.GetContext() ;$$requestUrl = $$context.Request.Url ;$$clientIP = $$context.Request.RemoteEndPoint.Address ;$$response = $$context.Response ;Write-Host '' ;Write-Host('> {0}' -f $$requestUrl) ; ;$$count = 1 ;$$k=$$callerCounts.Get_Item($$clientIP) ;if ($$k -ne $$null) { $$count += $$k } ;$$callerCounts.Set_Item($$clientIP, $$count) ;$$ip=(Get-NetAdapter | Get-NetIpAddress); $$header='<html><body><H1>Windows Container Web Server</H1>' ;$$callerCountsString='' ;$$callerCounts.Keys | % { $$callerCountsString+='<p>IP {0} callerCount {1} ' -f $$ip[1].IPAddress,$$callerCounts.Item($$_) } ;$$footer='</body></html>' ;$$content='{0}{1}{2}' -f $$header,$$callerCountsString,$$footer ;Write-Output $$content ;$$buffer = [System.Text.Encoding]::UTF8.GetBytes($$content) ;$$response.ContentLength64 = $$buffer.Length ;$$response.OutputStream.Write($$buffer, 0, $$buffer.Length) ;$$response.Close() ;$$responseStatus = $$response.StatusCode ;Write-Host('< {0}' -f $$responseStatus) } ; "
nodeSelector:
kubernetes.io/os: windows
Примітка:
Зіставлення портів також підтримується, але для спрощення цей приклад використовує прямий доступ до порту 80 контейнера у Service.Перевірте, що всі вузли справні:
Розгорніть Service та спостерігайте за оновленнями робочих навантажень:
kubectl apply -f win-webserver.yaml
kubectl get pods -o wide -w
Коли служба розгорнута правильно, обидва робочі навантаження позначаються як готові. Щоб вийти з команди спостереження, натисніть Ctrl+C.
Перевірте успішність розгортання. Для перевірки:
- Кілька Podʼів показуються з вузла керування Linux, скористайтеся
kubectl get pods
- Комунікація від вузла до Podʼа через мережу, за допомогою
curl
перевірте доступність порту 80 за IP-адресою Podʼів з вузла керування Linux, щоб перевірити відповідь вебсервера - Комунікація від Podʼа до Podʼа, пінг між Podʼами (і між хостами, якщо у вас більше одного вузла Windows) за допомогою
kubectl exec
- Комунікація Service-Pod, за допомогою
curl
перевірте віртуальний IP-адрес служби (вказаний у kubectl get services
) з вузла керування Linux і з окремих Podʼів - Виявлення Service, за допомогою
curl
перевірте імʼя Service з типовим суфіксом DNS Kubernetes - Вхідне підключення, за допомогою
curl
перевірте NodePort з вузла керування Linux або зовнішніх машин поза кластером - Вихідне підключення, за допомогою
curl
перевірте зовнішні IP-адреси зсередини Podʼа за допомогою kubectl exec
Примітка:
Хости контейнерів Windows не можуть отримати доступ до IP-адрес служб, запланованих на них через поточні обмеження платформи мережі Windows. Здатність до доступу до IP-адрес служб мають лише Podʼи Windows.Спостережуваність
Збір логів з навантажень
Логи — важливий елемент спостереження; вони дозволяють користувачам отримувати інформацію про роботу навантажень та є ключовим інгредієнтом для розвʼязання проблем. Оскільки контейнери Windows та робочі навантаження всередині контейнерів Windows поводяться по-іншому ніж контейнери в Linux, користувачі мали проблеми зі збором логів, що обмежувало операційну видимість. Робочі навантаження Windows, наприклад, зазвичай налаштовані на ведення логу подій ETW (Event Tracing for Windows) або надсилання записів в журнал подій програми. LogMonitor, відкритий інструмент від Microsoft, є рекомендованим способом моніторингу налаштованих джерел логів всередині контейнера Windows. LogMonitor підтримує моніторинг логів подій, провайдерів ETW та власних логів програм, перенаправляючи їх у STDOUT для використання за допомогою kubectl logs <pod>
.
Дотримуйтеся інструкцій на сторінці GitHub LogMonitor, щоб скопіювати його бінарні файли та файли конфігурації до всіх ваших контейнерів та додати необхідні точки входу для LogMonitor, щоб він міг надсилати ваші логи у STDOUT.
Налаштування користувача для роботи контейнера
Використання налаштовуваних імен користувача контейнера
Контейнери Windows можуть бути налаштовані для запуску своїх точок входу та процесів з іншими іменами користувачів, ніж ті, що типово встановлені в образі. Дізнайтеся більше про це тут.
Управління ідентифікацією робочого навантаження за допомогою групових керованих облікових записів служб
Робочі навантаження контейнерів Windows можна налаштувати для використання облікових записів керованих служб групи (Group Managed Service Accounts — GMSA). Облікові записи керованих служб групи є конкретним типом облікових записів Active Directory, які забезпечують автоматичне керування паролями, спрощене керування іменами службових принципалів (service principal name — SPN) та можливість делегування управління іншим адміністраторам на кількох серверах. Контейнери, налаштовані з GMSA, можуть отримувати доступ до зовнішніх ресурсів домену Active Directory, надаючи тим самим ідентифікацію, налаштовану за допомогою GMSA. Дізнайтеся більше про налаштування та використання GMSA для контейнерів Windows тут.
Заплямованість та Толерантність
Користувачам необхідно використовувати певну комбінацію taintʼів та селекторів вузлів, щоб розміщувати робочі навантаження Linux та Windows на відповідних вузлах з операційними системами. Рекомендований підхід викладений нижче, однією з його головних цілей є те, що цей підхід не повинен порушувати сумісність для наявних робочих навантажень Linux.
Ви можете (і повинні) встановлювати значення .spec.os.name
для кожного Pod, щоб вказати операційну систему, для якої призначені контейнери у цьому Pod. Для Podʼів, які запускають контейнери Linux, встановіть .spec.os.name
на linux
. Для Podʼів, які запускають контейнери Windows, встановіть .spec.os.name
на windows
.
Примітка:
Якщо ви використовуєте версію Kubernetes старішу за 1.24, вам може знадобитися увімкнути
функціональну можливість IdentifyPodOS
, щоб мати можливість встановлювати значення для
.spec.pod.os
.
Планувальник не використовує значення .spec.os.name
при призначенні Podʼів вузлам. Ви повинні використовувати звичайні механізми Kubernetes для призначення Podʼів вузлам, щоб забезпечити, що панель управління вашого кластера розміщує Podʼи на вузлах, на яких працюють відповідні операційні системи.
Значення .spec.os.name
не впливає на планування Podʼів Windows, тому все ще потрібні taint та толерантності (або селектори вузлів), щоб забезпечити, що Podʼи Windows розміщуються на відповідних вузлах Windows.
Забезпечення того, що навантаження, специфічні для ОС, розміщуються на відповідний хост
Користувачі можуть забезпечувати, що Windows контейнери можуть бути заплановані на відповідний хост за допомогою taint та толерантностей. Усі вузли Kubernetes, які працюють під керуванням Kubernetes 1.31, типово мають такі мітки:
- kubernetes.io/os = [windows|linux]
- kubernetes.io/arch = [amd64|arm64|...]
Якщо специфікація Pod не вказує селектор вузла, такий як "kubernetes.io/os": windows
, це може означати можливість розміщення Pod на будь-якому хості, Windows або Linux. Це може бути проблематичним, оскільки Windows контейнер може працювати лише на Windows, а Linux контейнер може працювати лише на Linux. Найкраща практика для Kubernetes 1.31 — використовувати селектор вузлів.
Однак у багатьох випадках користувачі мають вже наявну велику кількість розгортань для Linux контейнерів, а також екосистему готових конфігурацій, таких як Helm-чарти створені спільнотою, і випадки програмної генерації Podʼів, такі як оператори. У таких ситуаціях ви можете мати сумнів що до того, щоб внести зміну конфігурації для додавання полів nodeSelector
для всіх Podʼів і шаблонів Podʼів. Альтернативою є використання taint. Оскільки kubelet може встановлювати taint під час реєстрації, його можна легко змінити для автоматичного додавання taint при запуску лише на Windows.
Наприклад: --register-with-taints='os=windows:NoSchedule'
Додавши taint до всіх вузлів Windows, на них нічого не буде заплановано (це стосується наявних Podʼів Linux). Щоб запланувати Pod Windows на вузлі Windows, для цього потрібно вказати як nodeSelector
, так і відповідну толерантність для вибору Windows.
nodeSelector:
kubernetes.io/os: windows
node.kubernetes.io/windows-build: '10.0.17763'
tolerations:
- key: "os"
operator: "Equal"
value: "windows"
effect: "NoSchedule"
Робота з кількома версіями Windows в одному кластері
Версія Windows Server, що використовується кожним Pod, повинна відповідати версії вузла. Якщо ви хочете використовувати кілька версій Windows Server в одному кластері, то вам слід встановити додаткові мітки вузлів та поля nodeSelector
.
Kubernetes автоматично додає мітку,
node.kubernetes.io/windows-build
для спрощення цього.
Ця мітка відображає основний, додатковий і номер збірки Windows, які повинні збігатись для сумісності. Ось значення, що використовуються для кожної версії Windows Server:
Назва продукту | Версія |
---|
Windows Server 2019 | 10.0.17763 |
Windows Server 2022 | 10.0.20348 |
Спрощення за допомогою RuntimeClass
RuntimeClass може бути використаний для спрощення процесу використання taints та tolerations. Адміністратор кластера може створити обʼєкт RuntimeClass
, який використовується для інкапсуляції цих taint та toleration.
Збережіть цей файл як runtimeClasses.yml
. Він містить відповідний nodeSelector
для ОС Windows, архітектури та версії.
---
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: windows-2019
handler: example-container-runtime-handler
scheduling:
nodeSelector:
kubernetes.io/os: 'windows'
kubernetes.io/arch: 'amd64'
node.kubernetes.io/windows-build: '10.0.17763'
tolerations:
- effect: NoSchedule
key: os
operator: Equal
value: "windows"
Виконайте команду kubectl create -f runtimeClasses.yml
з правами адміністратора кластера.
Додайте runtimeClassName: windows-2019
відповідно до специфікацій Pod.
Наприклад:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: iis-2019
labels:
app: iis-2019
spec:
replicas: 1
template:
metadata:
name: iis-2019
labels:
app: iis-2019
spec:
runtimeClassName: windows-2019
containers:
- name: iis
image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
resources:
limits:
cpu: 1
memory: 800Mi
requests:
cpu: .1
memory: 300Mi
ports:
- containerPort: 80
selector:
matchLabels:
app: iis-2019
---
apiVersion: v1
kind: Service
metadata:
name: iis
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 80
selector:
app: iis-2019