2015-06-24 13 views
12

Ho una configurazione di lancio EC2 che costruisce l'AMI ottimizzato ECS. Ho un gruppo di ridimensionamento automatico che garantisce che ho almeno due istanze disponibili in ogni momento. Finalmente, ho un bilanciamento del carico.Perché il servizio ECS non può registrare le istanze EC2 disponibili con il mio ELB?

Sto tentando di creare un servizio ECS che distribuisca le mie attività tra le istanze nel servizio di bilanciamento del carico.

Dopo aver letto la documentazione per il bilanciamento del carico ECS, è a mia conoscenza che il mio ASG non dovrebbe registrare automaticamente le mie istanze EC2 con l'ELB, perché ECS si occupa di questo. Quindi, il mio ASG non specifica un ELB. Allo stesso modo, il mio ELB non ha alcuna istanza EC2 registrata.

Quando creo il mio servizio ECS, scelgo l'ELB e seleziono anche ecsServiceRole. Dopo aver creato il servizio, non vedo mai istanze disponibili nella scheda Istanze ECS. Il servizio non riesce ad avviare alcuna attività, con un errore molto generico di ...

il servizio non è stato in grado di eseguire un'attività perché non è stato possibile trovare le risorse.

Sono stato a questo per circa due giorni e non riesco a capire quali impostazioni di configurazione non sono configurate correttamente. Qualcuno ha qualche idea su cosa potrebbe causare che questo non funzioni?

Aggiornamento @ 2015/06/25:

Penso che questo possa avere qualcosa a che fare con l'impostazione dei dati ECS_CLUSTER utente.

Nella configurazione di avvio del ridimensionamento automatico EC2, se lascio l'immissione dati utente completamente vuota, le istanze vengono create con un valore "predefinito" ECS_CLUSTER. Quando ciò accade, vedo un cluster creato automaticamente, denominato "default". In questo cluster predefinito, vedo le istanze e posso registrare le attività con l'ELB come previsto. Il mio controllo di integrità ELB (HTTP) passa una volta che i compiti sono registrati con ELB e tutto è buono nel mondo.

Ma, se cambio l'impostazione ECS_CLUSTER in qualcosa di personalizzato, non vedo mai un cluster creato con quel nome. Se creo manualmente un cluster con quel nome, le istanze non diventano mai visibili all'interno del cluster. Non posso mai registrare attività con ELB in questo scenario.

Qualche idea?

+0

Solo alcune idee casuali da verificare: AZ/sottoreti di ELB e gruppo di ridimensionamento? (sono nella stessa? Possono accedervi l'un l'altro? Come funziona l'healthcheck nel ELB? Vedi qualche istanza allegata nella pagina dei dettagli ELB? Hai dei registri sul processo sull'istanza ECS che registra l'istanza sul ELB? –

+0

Sì, tutto sta utilizzando lo stesso VPC e subnet.La verifica dello stato ELB è HTTP, che se ECS registra correttamente i contenitori con le istanze funzionerà. Sto seguendo la documentazione di bilanciamento del carico ECS, che dice di saltare le istanze di registrazione con l'ELB, perché ECS si prende cura di questo.Penso che il problema sia con l'impostazione dei dati utente 'ECS_CLUSTER'. Se lo lascio come predefinito, vedo un cluster" predefinito "creato automaticamente, in cui posso vedere le istanze e posso registrare attività, se lo cambio a qualcosa di personalizzato, non vedo un cluster creato e non posso registrare attività – Ryan

risposta

13

Alla fine, è risultato che le mie istanze EC2 non venivano assegnate a indirizzi IP pubblici. Sembra che ECS debba essere in grado di comunicare direttamente con ogni istanza EC2, che richiederebbe a ogni istanza di avere un IP pubblico. Non stavo assegnando le mie istanze di contenitore agli indirizzi IP pubblici perché pensavo di averle tutte dietro a un servizio di bilanciamento del carico pubblico, e ogni istanza di contenitore sarebbe privata.

+8

Le tue istanze non dovrebbero avere indirizzi IP pubblici, ma hanno solo bisogno di accedere per raggiungere gli endpoint ECS (questo circa n significa l'accesso a Internet tramite IGW o NAT o un proxy HTTP che consente l'accesso a ECS). –

+1

@ SamuelK sembra che abbia bisogno di un IP pubblico: se eseguo l'istanza in una sottorete con un IGW senza IP pubblico, non si registra. Stesse impostazioni ma con IP pubblico e registri. Il gruppo di sicurezza non ha bisogno di porte in ingresso aperte, quindi è sicuro in ogni caso, con l'ulteriore vantaggio di essere in grado di SSH se necessario. –

+0

@Ryan Grazie! Questo ha funzionato per me. – Janpan

1

Un altro problema che potrebbe sorgere non è l'assegnazione di un ruolo con la politica corretta alla Configurazione di avvio. Il mio ruolo non ha avuto il criterio AmazonEC2ContainerServiceforEC2Role (o le autorizzazioni che esso contiene) come specified here.

2

Potrebbe anche essere che l'agente ECS crea un file in/var/lib/ecs/data che memorizza il nome del cluster.

Se l'agente prima si avvia con il nome cluster di "predefinito", sarà necessario eliminare questo file e quindi riavviare l'agente.

8

ho avuto sintomi simili, ma finito per trovare la risposta nei file di registro:

/var/log/ecs/ecs-agent.2016-04-06-03:

2016-04-06T03:05:26Z [ERROR] Error registering: AccessDeniedException: User: arn:aws:sts::<removed>:assumed-role/<removed>/<removed is not authorized to perform: ecs:RegisterContainerInstance on resource: arn:aws:ecs:us-west-2:<removed:cluster/MyCluster-PROD 
    status code: 400, request id: <removed> 

In Nel mio caso, la risorsa esisteva ma non era accessibile. Sembra che OP stia puntando a una risorsa che non esiste o non è visibile. I tuoi cluster e istanze si trovano nella stessa regione? I registri dovrebbero confermare i dettagli.

In risposta ad altri post:

non hai bisogno di indirizzi IP pubblici.

È necessario: l'ecsServiceRole o il ruolo IAM equivalente assegnato all'istanza EC2 per parlare con il servizio ECS. È inoltre necessario specificare il cluster ECS e può essere fatta tramite i dati degli utenti durante il lancio istanza o configurazione di lancio definizione, in questo modo:

#!/bin/bash 
echo ECS_CLUSTER=GenericSericeECSClusterPROD >> /etc/ecs/ecs.config 

Se si riesce a fare questo su istanze, lanciato di recente, è possibile farlo dopo l'istanza ha avviato e quindi riavviato il servizio.

+0

Grazie per le posizioni dei file di registro ... Ho avuto lo stesso problema descritto in questo post anche se avevo impostato correttamente l'ip pubblico. Dopo aver esaminato i registri, ho potuto determinare che si trattava di un problema politico, in particolare la politica di attendibilità, come documentato nel seguente link: http://docs.aws.amazon.com/AmazonECS/latest/developerguide/instance_IAM_role.html – Metallikanz

-1

Là dove diversi livelli di problemi nel nostro caso. Li elencherò in modo che possa darti un'idea dei problemi da perseguire.

Il mio carcere doveva avere 1 ECS in 1 host. Ma ECS ti costringe ad avere 2 sottoreti sotto il tuo VPC e ciascuna ha 1 istanza di host di docker. Stavo cercando di avere solo un host di docker in 1 zona di disponibilità e non riuscivo a farlo funzionare.

Quindi l'altro problema era che l'unica delle sottoreti aveva un gateway Internet collegato ad esso. Quindi uno di questi non era accessibile dal pubblico.

Il risultato finale era che DNS stava servendo 2 IP per il mio ELB. E uno degli IP funzionerebbe e l'altro no. Quindi vedevo 404s casuali quando accedevo al NLB usando il DNS pubblico.

2

Si consiglia di fare non necessario indirizzi IP pubblici per ciascuna delle istanze private. Il modo corretto (e più sicuro) per farlo è impostare un gateway NAT e collegare quel gateway alla tabella di routing che è collegata alla sottorete privata.

Questo è documentato in dettaglio nella documentazione VPC, in particolare Scenario 2: VPC with Public and Private Subnets (NAT).