Azure-sdk-для-python AKS — Как обновить kubernetes на AKS

#python-3.x #azure-functions #azure-aks

Вопрос:

Я попытался выяснить, какой python sdk я могу использовать для обновления Kubernetes на AKS, другими словами, как запустить эту команду через python sdk?

 az aks upgrade --name mycluster --resource-group myrg --kubernetes-version newversion
 

однако мои поиски не увенчались успехом.

Вот часть моей функции: init.py

 import logging
from azure.mgmt.containerservice import ContainerServiceClient
from azure.identity import ClientSecretCredential
from azure.mgmt.subscription import SubscriptionClient
from azure.mgmt.resource import ResourceManagementClient
....
for group in list(group_list):
              #print("ResourceGroupName:", group.name)
              resource_list = resource_client.resources.list_by_resource_group(group.name)
              print("Fetching AKS resourcen")
              
              for resource in list(resource_list):
                if resource.type== "Microsoft.ContainerService/managedClusters":
                  print("ResourceName:", resource.name, "ResourceType:", resource.type)
                  containerservice_client = ContainerServiceClient(credential, sub.subscription_id)
                  
                  print("Getting availabele versions...n")
                  aks_get_version = containerservice_client.managed_clusters.get_upgrade_profile(group.name, resource.name)
                  
                  
                  aks_get_upgrade = aks_get_version.control_plane_profile
                  upgrades = aks_get_upgrade.upgrades
                  print("AKS_current_controlPlane", aks_get_upgrade.kubernetes_version)
                  for i in upgrades:
                    print("AKSGetUpdate_upgrade_controlPlane", i.kubernetes_version,i.is_preview)
 

Кажется

 managed_clusters.update 
 

может быть решением, но тогда вопрос в том, как передать properties.kubernetesVersion и свойства.agentPoolProfiles[0].Значения orchestratorVersion в нем?

 parameters = {"properties.kubernetesVersion": i.kubernetes_version, "properties.agentPoolProfiles[0].orchestratorVersion": i.kubernetes_version}
containerservice_client.managed_clusters.create_or_update(group.name, resource.name, parameters)
 

Однако я получаю эту ошибку:

 Exception: AttributeError: 'ManagedClustersOperations' object has no attribute 'create_or_update'
 

Я был бы признателен, если бы кто-нибудь мог помочь с этим.

Обновленный

Изменил код на основе данного ответа, однако он не обновляет мой кластер и не выдает мне никаких ошибок, я не знаю, чего мне не хватает и как устранить неполадки на этом этапе:

 print("Getting availabele versions on AKS:", resource.name)
aks_get_version = containerservice_client.managed_clusters.get_upgrade_profile(group.name, resource.name)
            
aks_get_upgrade = aks_get_version.control_plane_profile
upgrades = aks_get_upgrade.upgrades
print("AKS_current_controlPlane", aks_get_upgrade.kubernetes_version)
                  
agent_pool=containerservice_client.agent_pools.list(group.name, resource.name)
 for i in upgrades:
      print("AKSAvailable_Versions_List:", i.kubernetes_version,i.is_preview)
      latest_version = i.kubernetes_version
 print("LatestVersion:", latest_version)  
                    
 for x in agent_pool:
     agent_pool_name=x.name
     print("Agent_Pool_Name:",x.name)
 ManagedClusterAgentPoolProfile(orchestrator_version=latest_version,name=agent_pool_name)

param=ManagedCluster(location=location, 
kubernetes_version=latest_version,agent_pool_profiles=[ManagedClusterAgentPoolProfile(orchestrator_version=latest_version,name=agent_pool_name,mode=x.mode,type=x.type_properties_type)])
              
update_aks=containerservice_client.managed_clusters.begin_create_or_update(resource_group_name=group.name ,resource_name=resource.name ,parameters=param) 
 

выход:
AKS_current_controlPlane 1.19.11
Последняя версия: 1.20.9
Имя пула агентов: по умолчанию

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

1. @AnsumanBal-MT спасибо за комментарий. ты имеешь в виду, что я не могу передать это через параметры?

2. да , вы будете передавать их в параметрах, но вам нужно выбрать версию kubernetes , которую вы должны обновить, прямо из списка опций, поэтому, я думаю, вам нужно будет указать это во входных данных и сохранить в переменной, а затем передать ее в параметрах.. и если это единственный выход в доступном обновлении, то вы можете напрямую пройти .. позвольте мне протестировать его и вернуться сюда

3. приятно, спасибо, тогда я услышу от тебя 🙂

4. конечно, я установлю его как принятый ответ, как только закончу его тестирование.

5. обновил ответ.. после тестирования в соответствии с требованиями

Ответ №1:

Вы можете использовать приведенный ниже код, который я протестировал в своей среде:

 from azure.identity import AzureCliCredential
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.containerservice import ContainerServiceClient
from azure.mgmt.containerservice.models import (ManagedClusterAgentPoolProfile,
                                                ManagedCluster)

credential = AzureCliCredential()
subscription_id = "my sub"
resource_group= 'rg name'
resouce_client=ResourceManagementClient(credential,subscription_id)
container_client=ContainerServiceClient(credential,subscription_id)
resouce_list=resouce_client.resources.list_by_resource_group(resource_group)
for resource in list (resouce_list) :
    if resource.type == 'Microsoft.ContainerService/managedClusters':
       kub_name=resource.name
       location=resource.location
       print("ResourceName:", kub_name, "ResourceLocation:",location )
       get_aks = container_client.managed_clusters.get(resource_group, resource.name)
       aks_get_details = container_client.managed_clusters.get_upgrade_profile(resource_group, resource.name)
       aks_control_plane_upgrade = aks_get_details.control_plane_profile
       upgrades = aks_control_plane_upgrade.upgrades
       print("AKS_current_controlPlane_version:", aks_control_plane_upgrade.kubernetes_version)
       agent_pool=container_client.agent_pools.list(resource_group_name=resource_group, resource_name=kub_name)
       for i in upgrades:
           available_version=i.kubernetes_version
       print("Available_Versions_List:",available_version)
       #version_to_upgrade=input("PLease enter the version you want to upgrade to from the above list:")
       for x in agent_pool:
           agent_pool_name=x.name
           print("Agent_Pool_Name:",x.name)
       param=ManagedCluster(location=location, kubernetes_version=available_version,agent_pool_profiles=[ManagedClusterAgentPoolProfile(orchestrator_version=available_version,name=agent_pool_name,mode=x.mode,type=x.type_properties_type)])
       update_aks=container_client.managed_clusters.begin_create_or_update(resource_group_name=resource_group ,resource_name=kub_name ,parameters=param) 
 

Выходы:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

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

1. Спасибо 🙂 Я тестирую его, но для меня это не увенчалось успехом. не могли бы вы, пожалуйста, проверить обновленную часть моего вопроса и сообщить мне, чего мне там не хватает?

2. Спасибо за ответ. способ, которым я печатаю latest_version, — это последняя версия, которая печатается. таким образом, выводится только одна версия: последняя версия: 1.20.9. Я не использовал ввод, потому что хочу запускать этот скрипт автоматически каждую неделю, не вводя его каждый раз. Как вы думаете, проблема все еще связана с переменной версии?

3. @Матрица, тогда, я думаю, это не должно быть проблемой, позвольте мне сбегать со своей стороны и посмотреть, применимо это или нет

4. @Matrix, я обновил код в соответствии с требованиями , и он успешно запущен, я также обновил ответ

5. Большое спасибо, он только начал нормально работать 🙂 В конце концов мне не хватало роли «Microsoft. Контейнерный сервис/управляемые кластеры/пулы агентов/запись» в функции azure, как только я ее добавил, она начала обновляться.