Как запустить Pod от имени gMSA в Kubernetes

Windows Server Docker Kubernetes k8s

Цели и задачи

  1. установить Docker на Ubuntu 18.04 LTS (будет использована как мастер узел)
  2. установить Docker на Windows Server 2019 (1809) (будет использоваться как рабочий узел)
  3. установить Kubernetes на мастер узле
  4. добавить в Kubernetes узел на базе Windows Server 2019 (1809)
  5. настроить Active Directory для использования gMSA
  6. настроить Kubernetes для использования gMSA
  7. запустить Pod от имени gMSA в Kubernetes

Как запустить Pod от имени gMSA в Kubernetes

Создаем учетную запись:

New-ADServiceAccount $serviceaccount -DNSHostName $hostname –PrincipalsAllowedToRetrieveManagedPassword $principals

Здесь:

  • $serviceaccount - имя учетной записи (gMSA)
  • $hostname - $serviceaccount.domain.com (имя учетной записи + имя домена)
  • $principals - Список компьютеров, имеющих права на получение пароля от очетной записи

Теперь ее необходимо установить на всех Windows узлах в кластере. Подключаемся к каждому узлу и выполняем:

Add-WindowsFeature RSAT-AD-PowerShell
Install-ADServiceAccount -Identity $serviceaccount
Test-ADServiceAccount -Identity $serviceaccount

Получаем данные нашей учетной записи:

Install-Module CredentialSpec
New-CredentialSpec -AccountName $serviceaccount

В результате у нас получится json вида:

{
  "CmsPlugins": [
    "ActiveDirectory"
  ],
  "DomainJoinConfig": {
    "Sid": "S-1-5-21-173000223-3773341904-835667822",
    "MachineAccountName": "vitaliy-org",
    "Guid": "4013ea6c-1050-4ed3-9ce0-10912b11769d",
    "DnsTreeName": "vitaliy.org",
    "DnsName": "vitaliy.org",
    "NetBiosName": "VITALIY"
  },
  "ActiveDirectoryConfig": {
    "GroupManagedServiceAccounts": [
      {
        "Name": "vitaliy-org",
        "Scope": "vitaliy.org"
      },
      {
        "Name": "vitaliy-org",
        "Scope": "VITALIY"
      }
    ]
  }
}

Теперь нам надо получить gmsa.yaml такого вида:

apiVersion: windows.k8s.io/v1alpha1
kind: GMSACredentialSpec
metadata:
  name: gmsa-vitaliy-org
credspec:
  ActiveDirectoryConfig:
    GroupManagedServiceAccounts:
    - Name: vitaliy-org
      Scope: VITALIY
    - Name: vitaliy-org
      Scope: vitaliy.org
  CmsPlugins:
  - ActiveDirectory
  DomainJoinConfig:
    DnsName: vitaliy.org
    DnsTreeName: vitaliy.org
    Guid: 4013ea6c-1050-4ed3-9ce0-10912b11769d
    MachineAccountName: vitaliy-org
    NetBiosName: VITALIY
    Sid: S-1-5-21-173000223-3773341904-835667822

Отправляем его в kubernetes:

kubectl apply -f gmsa.yaml

Теперь нам надо создать кластерную роль для получения доступа к ресурсу gmsa-vitaliy-org:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: gmsa-vitaliy-org-role
rules:
- apiGroups: ["windows.k8s.io"]
  resources: ["gmsacredentialspecs"]
  verbs: ["use"]
  resourceNames: ["gmsa-vitaliy-org"]

И последнее - к спецификации Pod'а добавляем:

apiVersion: apps/v1
kind: Pod
spec:
  securityContext:
    windowsOptions:
      gmsaCredentialSpecName: gmsa-vitaliy-org

Всё!