Получение «контейнеров с не готовым статусом: []» ошибка в Kubernetes - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь развернуть Pod Kubernetes в AKS (я новичок в Kubernetes, поэтому на данном этапе я просто хочу создать контейнер, развернуть его в Kubernetes и подключиться к нему).

Мой файл Yaml выглядит следующим образом:

apiVersion: v1
kind: Pod
spec: 
  containers:
    - name: dockertest20190205080020
      image: dockertest20190205080020.azurecr.io    
      ports:
      - containerPort: 443
metadata: 
  name: my-test

Я создал образ в реестре контейнеров Azure и, согласно CLI, успешно развернул его в Kubernetes.

После развертывания я использовалследующая команда:

kubectl get service

И он говорит мне, что нет внешнего IP для подключения.Затем я попытался:

kubectl describe pod my-test

, что привело к следующим ошибкам:

 Events:
   Warning  Failed   4m (x2221 over 8h)  kubelet, aks-nodepool1-27401563-2  Error: ImagePullBackOff
   Normal   BackOff  0s (x2242 over 8h)  kubelet, aks-nodepool1-27401563-2  Back-off pulling image "dockertest20190205080020.azurecr.io"

Затем я попытался отредактировать развертывание:

kubectl edit pods my-test

В какой игре произошла ошибка:

message: 'containers with unready status: [dockertest20190205080020]'

Я не совсем уверен, каким будет мой следующий диагностический шаг.У меня создается впечатление, что есть проблема с контейнером или реестром контейнера, но я не уверен, как определить, что это может быть.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Я не уверен, знаете ли вы, что в вашем файле yaml что-то не так, или это просто показывает, как вы хотите в целях безопасности.Но я бы показал вам здесь:

apiVersion: v1
kind: Pod
spec: 
  containers:
    - name: dockertest20190205080020
      image: dockertest20190205080020.azurecr.io/image_name_and_version   
      ports:
      - containerPort: 443
metadata: 
  name: my-test

Кроме того, как показывает ошибка, которую вы получили, у вас нет разрешения на извлечение изображения из вашего ACR.

Со своей стороны, я бы лучше использовал секрет для извлечения всего изображения из ACR.Вы можете создать принципала службы для достижения этого.Шаги будут выглядеть так:

#!/bin/bash

ACR_NAME=myacrinstance
SERVICE_PRINCIPAL_NAME=acr-service-principal

# Populate the ACR login server and resource id.
ACR_LOGIN_SERVER=$(az acr show --name $ACR_NAME --query loginServer --output tsv)
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)

# Create acrpull role assignment with a scope of the ACR resource.
SP_PASSWD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --role acrpull --scopes $ACR_REGISTRY_ID --query password --output tsv)

# Get the service principal client id.
CLIENT_ID=$(az ad sp show --id http://$SERVICE_PRINCIPAL_NAME --query appId --output tsv)

# Output used when creating Kubernetes secret.
echo "Service principal ID: $CLIENT_ID"
echo "Service principal password: $SP_PASSWD"

# Create the secret 
kubectl create secret docker-registry acr-auth --docker-server <acr-login-server> --docker-username <service-principal-ID> --docker-password <service-principal-password> 

Затем вы можете изменить свой файл yaml следующим образом:

apiVersion: v1
kind: Pod
spec: 
  containers:
    - name: dockertest20190205080020
      image: dockertest20190205080020.azurecr.io/image_name_and_version   
      ports:
      - containerPort: 443
  imagePullSecrets:
  - name: acr-auth
metadata: 
  name: my-test
0 голосов
/ 07 февраля 2019

Что здесь происходит (скорее всего) - ваш AKS не имеет прав на получение изображений из ACR (это поведение по умолчанию).Вам нужно предоставить эти ( ссылка ):

#!/bin/bash

AKS_RESOURCE_GROUP=myAKSResourceGroup
AKS_CLUSTER_NAME=myAKSCluster
ACR_RESOURCE_GROUP=myACRResourceGroup
ACR_NAME=myACRRegistry

# Get the id of the service principal configured for AKS
CLIENT_ID=$(az aks show --resource-group $AKS_RESOURCE_GROUP --name $AKS_CLUSTER_NAME --query "servicePrincipalProfile.clientId" --output tsv)

# Get the ACR registry resource id
ACR_ID=$(az acr show --name $ACR_NAME --resource-group $ACR_RESOURCE_GROUP --query "id" --output tsv)

# Create role assignment
az role assignment create --assignee $CLIENT_ID --role acrpull --scope $ACR_ID

Альтернативой является использование секретного имени входа в докер (об этом также упоминается в статье).

Пример изображенияв ACR: enter image description here

имя изображения будет

clrtacr.azurecr.io / dns: tag (или без тега для последних)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...