Попытка использовать Azure Pod Identity несколько раз завершается неудачей, прежде чем, наконец, это удается - PullRequest
2 голосов
/ 01 апреля 2019

Введение: Я пытаюсь заставить Azure Pod Identity работать в нашем кластере для чтения секретов из KeyVault, и в большинстве случаев у меня это получается (пока все хорошо).В настоящее время у нас есть два хранилища ключей: два AzureIdentity, два AzureIdentityBinding и два модуля Pod, каждый из которых использует свое keyvault.

Во время тестирования оба модуля одинаковы - разница только в их aadpodidbinding и переменной окружения, указывающей, какой ключ использовать.При запуске модуль подключается к KeyVault, считывает два значения и печатает их с Console.WriteLine.Если не удается установить соединение, модуль аварийно завершает работу, и k8s перезапускает его.

Проблема: При запуске одного модуля может сразу же произойти чтение из keyvault, а в другом случае происходит сбой и перезапуск.для - то, что кажется - довольно последовательно 5 раз, прежде чем он сможет получить токен доступа.

При сбое выдается следующее исключение:

Unhandled Exception: Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException: Parameters: Connection String: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.windows.net/******************. Exception Message: Tried the following 3 methods to get an access token, but none of them worked.
Parameters: Connection String: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.windows.net/******************. Exception Message: Tried to get token using Managed Service Identity. Access token could not be acquired. MSI ResponseCode: Forbidden, Response: no AzureAssignedIdentity found for pod:default/kv-test-be

Parameters: Connection String: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.windows.net/******************. Exception Message: Tried to get token using Visual Studio. Access token could not be acquired. Environment variable LOCALAPPDATA not set.
Parameters: Connection String: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.windows.net/******************. Exception Message: Tried to get token using Azure CLI. Access token could not be acquired. No such file or directory

   at Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider.GetAuthResultAsyncImpl(String authority, String resource, String scope)
   at Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider.<get_KeyVaultTokenCallback>b__8_0(String authority, String resource, String scope)
   at Microsoft.Azure.KeyVault.KeyVaultCredential.PostAuthenticate(HttpResponseMessage response)
   at Microsoft.Azure.KeyVault.KeyVaultCredential.ProcessHttpRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at Microsoft.Azure.KeyVault.KeyVaultClient.GetSecretsWithHttpMessagesAsync(String vaultBaseUrl, Nullable`1 maxresults, Dictionary`2 customHeaders, CancellationToken cancellationToken)
   at Microsoft.Azure.KeyVault.KeyVaultClientExtensions.GetSecretsAsync(IKeyVaultClient operations, String vaultBaseUrl, Nullable`1 maxresults, CancellationToken cancellationToken)
   at Microsoft.Extensions.Configuration.AzureKeyVault.AzureKeyVaultConfigurationProvider.LoadAsync()
   at Microsoft.Extensions.Configuration.AzureKeyVault.AzureKeyVaultConfigurationProvider.Load()
   at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
   at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
   at KeyvaultTest.Program.Main(String[] args) in /app/src/Program.cs:line 16

Поведение аналогично, когдаиспользуя FlexVolume (который в конечном итоге одна группа наших модулей будет использовать в производстве), но я считаю, что проще связать ошибку с двумя равными модулями.

В ожидании успеха модуля я вижу обаСообщения о «привязке удалены» и «привязке применены» в журнале микрофона.

Мои вопросы:

  • Является ли это поведение "намеренным" и, возможно, где-то задокументировано?
  • Есть ли настройка, которую можно применить, чтобы ускорить цикл «удалить - применить»?
  • Есть ли что-нибудь еще, что можно сделать, чтобы улучшить время между созданием модуля и применением привязки идентификатора?Возможно, эта проблема связана с https://github.com/Azure/aad-pod-identity/issues/145

Исходный код : Program.cs

using System;
using System.IO;
using System.Threading;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;

namespace KeyvaultTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Starting Keyvault read");

            var configuration = new ConfigurationBuilder()
                .AddAzureKeyVault()
                .Build();

            var test1 = configuration.GetValue<string>("jtest");
            Console.WriteLine(test1);
            var test2 = configuration.GetValue<string>("jtest:jtest");

            Console.WriteLine(test2);
            Console.WriteLine("Finished Keyvault read");
        }
    }
}

KeyVaultConfiguration.cs.cs

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Threading;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Azure.KeyVault;
using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.AzureKeyVault;

namespace KeyvaultTest
{
    public static class KeyVaultConfiguration
    {
        public static IConfigurationBuilder AddAzureKeyVault(this IConfigurationBuilder builder)
        {
            var builtConfig = builder.Build();
            var keyVaultName = Environment.GetEnvironmentVariable("KV_NAME");

            if (string.IsNullOrWhiteSpace(keyVaultName))
            {
                throw new Exception("KV_NAME is not defined");
            }

            Console.WriteLine($"Using KV_NAME = {keyVaultName}");

            var azureServiceTokenProvider = new AzureServiceTokenProvider();
            var keyVaultClient = new KeyVaultClient(
                new KeyVaultClient.AuthenticationCallback(
                    azureServiceTokenProvider.KeyVaultTokenCallback));

            builder.AddAzureKeyVault(
                $"https://{keyVaultName}.vault.azure.net/",
                keyVaultClient,
                new DefaultKeyVaultSecretManager());

            return builder;
        }
    }
}

Любая помощь, советы или идеи очень ценятся.

Примечание: я отправил этот же вопрос на доску вопросов на странице github проекта https://github.com/Azure/aad-pod-identity/issues/181

...