Rumah >pembangunan bahagian belakang >Golang >Imej dari ECR ke EKS tidak berfungsi kerana Pod yang terhasil sentiasa 0/2
Apabila editor php Strawberry sedang menyelesaikan masalah penggunaan aplikasi kontena, beliau mendapati bahawa imej daripada ECR (Amazon Elastic Container Registry) kepada EKS (Amazon Elastic Kubernetes Service) tidak berfungsi dengan betul. Khususnya, Pod yang dijana sentiasa 0/2, yang bermaksud bahawa bekas tidak boleh bermula atau berjalan seperti biasa. Masalah ini mungkin melibatkan banyak aspek, termasuk masalah dengan imej itu sendiri, ralat dalam konfigurasi bekas atau pengehadan persekitaran rangkaian. Beberapa penyelesaian biasa akan diperkenalkan secara terperinci di bawah untuk membantu pembangun menyelesaikan masalah ini dengan cepat.
Saya telah mencuba hampir segala-galanya untuk mendapatkan sesuatu di jalan yang betul tetapi masih tidak dapat memastikan pod saya berada dalam keadaan yang boleh digunakan.
Jadi saya mempunyai apl asas yang ditulis dalam go.
Saya menggunakan docker build --tag docker-gs-ping .
untuk mencipta imej program
Kemudian saya cuba menjalankan arahan yang sama di dalam bekas docker run --publish 8080:8080 docker-gs-ping
Kemudian saya ingin menyimpan imej saya ke amazon ecr, untuk ini saya mencipta repositori dalam ecr.
Sekarang, selepas mencipta repositori, saya menandakan imej yang wujud dalam tempatan saya.
docker tag f49366b7f534 ****40312665.dkr.ecr.us-east-1.amazonaws.com/docker-gs-ping:latest
f49366b7f534
是我本地的图像标签。 docker-gs-ping
ialah nama repositori dalam ecr.
Kemudian saya memuat naik imej yang ditag ke ecr menggunakan arahan.
docker push ****40312665.dkr.ecr.us-east-1.amazonaws.com/docker-gs-ping:latest
Tidak pasti sama ada arahan di atas akan menolak imej berteg atau imej terkini daripada setempat kerana tiada cara untuk menyebut imej khusus untuk ditolak ke ecr.
Hasil semasa ialah
Selepas melengkapkan langkah di atas, saya mencipta vps menggunakan fail dan arahan berikut:
eks timbunan:
--- awstemplateformatversion: '2010-09-09' description: 'amazon eks cluster' parameters: clustername: type: string default: my-eks-cluster numberofworkernodes: type: number default: 1 workernodesinstancetype: type: string default: t2.micro kubernetesversion: type: string default: 1.22 resources: ########################################### ## roles ########################################### eksrole: type: aws::iam::role properties: rolename: my.eks.cluster.role assumerolepolicydocument: version: "2012-10-17" statement: - effect: allow principal: service: - eks.amazonaws.com action: - sts:assumerole path: / managedpolicyarns: - "arn:aws:iam::aws:policy/amazoneksclusterpolicy" eksnoderole: type: aws::iam::role properties: rolename: my.eks.node.role assumerolepolicydocument: version: "2012-10-17" statement: - effect: allow principal: service: - ec2.amazonaws.com action: - sts:assumerole path: / managedpolicyarns: - "arn:aws:iam::aws:policy/amazoneksworkernodepolicy" - "arn:aws:iam::aws:policy/amazonec2containerregistryreadonly" - "arn:aws:iam::aws:policy/amazoneks_cni_policy" ########################################### ## eks cluster ########################################### ekscluster: type: aws::eks::cluster properties: name: !ref clustername version: !ref kubernetesversion rolearn: !getatt eksrole.arn resourcesvpcconfig: securitygroupids: - !importvalue controlplanesecuritygroupid subnetids: !split [ ',', !importvalue privatesubnetids ] eksnodegroup: type: aws::eks::nodegroup dependson: ekscluster properties: clustername: !ref clustername noderole: !getatt eksnoderole.arn scalingconfig: minsize: ref: numberofworkernodes desiredsize: ref: numberofworkernodes maxsize: ref: numberofworkernodes subnets: !split [ ',', !importvalue privatesubnetids ]
Perintah: aws cloudformation create-stack --region us-east-1 --stack-name my-eks-cluster --capability capability_named_iam --template-body file://eks-stack.yaml
eks vpc yaml
--- awstemplateformatversion: '2010-09-09' description: 'amazon eks vpc - private and public subnets' parameters: vpcblock: type: string default: 192.168.0.0/16 description: the cidr range for the vpc. this should be a valid private (rfc 1918) cidr range. publicsubnet01block: type: string default: 192.168.0.0/18 description: cidrblock for public subnet 01 within the vpc publicsubnet02block: type: string default: 192.168.64.0/18 description: cidrblock for public subnet 02 within the vpc privatesubnet01block: type: string default: 192.168.128.0/18 description: cidrblock for private subnet 01 within the vpc privatesubnet02block: type: string default: 192.168.192.0/18 description: cidrblock for private subnet 02 within the vpc metadata: aws::cloudformation::interface: parametergroups: - label: default: "worker network configuration" parameters: - vpcblock - publicsubnet01block - publicsubnet02block - privatesubnet01block - privatesubnet02block resources: vpc: type: aws::ec2::vpc properties: cidrblock: !ref vpcblock enablednssupport: true enablednshostnames: true tags: - key: name value: !sub '${aws::stackname}-vpc' internetgateway: type: "aws::ec2::internetgateway" vpcgatewayattachment: type: "aws::ec2::vpcgatewayattachment" properties: internetgatewayid: !ref internetgateway vpcid: !ref vpc publicroutetable: type: aws::ec2::routetable properties: vpcid: !ref vpc tags: - key: name value: public subnets - key: network value: public privateroutetable01: type: aws::ec2::routetable properties: vpcid: !ref vpc tags: - key: name value: private subnet az1 - key: network value: private01 privateroutetable02: type: aws::ec2::routetable properties: vpcid: !ref vpc tags: - key: name value: private subnet az2 - key: network value: private02 publicroute: dependson: vpcgatewayattachment type: aws::ec2::route properties: routetableid: !ref publicroutetable destinationcidrblock: 0.0.0.0/0 gatewayid: !ref internetgateway privateroute01: dependson: - vpcgatewayattachment - natgateway01 type: aws::ec2::route properties: routetableid: !ref privateroutetable01 destinationcidrblock: 0.0.0.0/0 natgatewayid: !ref natgateway01 privateroute02: dependson: - vpcgatewayattachment - natgateway02 type: aws::ec2::route properties: routetableid: !ref privateroutetable02 destinationcidrblock: 0.0.0.0/0 natgatewayid: !ref natgateway02 natgateway01: dependson: - natgatewayeip1 - publicsubnet01 - vpcgatewayattachment type: aws::ec2::natgateway properties: allocationid: !getatt 'natgatewayeip1.allocationid' subnetid: !ref publicsubnet01 tags: - key: name value: !sub '${aws::stackname}-natgatewayaz1' natgateway02: dependson: - natgatewayeip2 - publicsubnet02 - vpcgatewayattachment type: aws::ec2::natgateway properties: allocationid: !getatt 'natgatewayeip2.allocationid' subnetid: !ref publicsubnet02 tags: - key: name value: !sub '${aws::stackname}-natgatewayaz2' natgatewayeip1: dependson: - vpcgatewayattachment type: 'aws::ec2::eip' properties: domain: vpc natgatewayeip2: dependson: - vpcgatewayattachment type: 'aws::ec2::eip' properties: domain: vpc publicsubnet01: type: aws::ec2::subnet metadata: comment: subnet 01 properties: mappubliciponlaunch: true availabilityzone: fn::select: - '0' - fn::getazs: ref: aws::region cidrblock: ref: publicsubnet01block vpcid: ref: vpc tags: - key: name value: !sub "${aws::stackname}-publicsubnet01" - key: kubernetes.io/role/elb value: 1 publicsubnet02: type: aws::ec2::subnet metadata: comment: subnet 02 properties: mappubliciponlaunch: true availabilityzone: fn::select: - '1' - fn::getazs: ref: aws::region cidrblock: ref: publicsubnet02block vpcid: ref: vpc tags: - key: name value: !sub "${aws::stackname}-publicsubnet02" - key: kubernetes.io/role/elb value: 1 privatesubnet01: type: aws::ec2::subnet metadata: comment: subnet 03 properties: availabilityzone: fn::select: - '0' - fn::getazs: ref: aws::region cidrblock: ref: privatesubnet01block vpcid: ref: vpc tags: - key: name value: !sub "${aws::stackname}-privatesubnet01" - key: kubernetes.io/role/internal-elb value: 1 privatesubnet02: type: aws::ec2::subnet metadata: comment: private subnet 02 properties: availabilityzone: fn::select: - '1' - fn::getazs: ref: aws::region cidrblock: ref: privatesubnet02block vpcid: ref: vpc tags: - key: name value: !sub "${aws::stackname}-privatesubnet02" - key: kubernetes.io/role/internal-elb value: 1 publicsubnet01routetableassociation: type: aws::ec2::subnetroutetableassociation properties: subnetid: !ref publicsubnet01 routetableid: !ref publicroutetable publicsubnet02routetableassociation: type: aws::ec2::subnetroutetableassociation properties: subnetid: !ref publicsubnet02 routetableid: !ref publicroutetable privatesubnet01routetableassociation: type: aws::ec2::subnetroutetableassociation properties: subnetid: !ref privatesubnet01 routetableid: !ref privateroutetable01 privatesubnet02routetableassociation: type: aws::ec2::subnetroutetableassociation properties: subnetid: !ref privatesubnet02 routetableid: !ref privateroutetable02 controlplanesecuritygroup: type: aws::ec2::securitygroup properties: groupdescription: cluster communication with worker nodes vpcid: !ref vpc outputs: publicsubnetids: description: public subnets ids in the vpc value: !join [ ",", [ !ref publicsubnet01, !ref publicsubnet02 ] ] export: name: publicsubnetids privatesubnetids: description: private subnets ids in the vpc value: !join [ ",", [ !ref privatesubnet01, !ref privatesubnet02 ] ] export: name: privatesubnetids controlplanesecuritygroupid: description: security group for the cluster control plane communication with worker nodes value: !ref controlplanesecuritygroup export: name: controlplanesecuritygroupid vpcid: description: the vpc id value: !ref vpc export: name: vpcid
Perintah: aws cloudformation create-stack --region us-east-1 --stack-name my-eks-vpc --template-body file://eks-vpc-stack.yaml
Hasil selepas arahan:
Kini saya cuba menggunakan fail deployment.yaml dan service.yaml
deployment.yaml
apiversion: apps/v1 kind: deployment metadata: name: helloworld namespace: default spec: replicas: 2 selector: matchlabels: app: helloworld template: metadata: labels: app: helloworld spec: containers: - name: new-container image: ****40312665.dkr.ecr.us-east-1.amazonaws.com/docker-gs-ping:latest ports: - containerport: 80
Arahan dan keputusan:
Sekarangservice.yaml
apiversion: v1 kind: service metadata: name: helloworld spec: type: loadbalancer selector: app: helloworld ports: - name: http port: 80 targetport: 80
Arahan dan keputusan:
Selepas semua ini selesai, apabila saya menjalankan kubectl get deploy, saya mendapat hasil berikut:
Untuk nyahpepijat, saya mencuba kubectl describe pod helloworld dan saya mendapat yang berikut
C:\Users\visratna\GolandProjects\testaws>kubectl describe pod helloworld Name: helloworld-c6dc56598-jmpvr Namespace: default Priority: 0 Service Account: default Node: docker-desktop/192.168.65.4 Start Time: Fri, 07 Jul 2023 22:22:18 +0530 Labels: app=helloworld pod-template-hash=c6dc56598 Annotations: <none> Status: Pending IP: 10.1.0.7 IPs: IP: 10.1.0.7 Controlled By: ReplicaSet/helloworld-c6dc56598 Containers: new-container: Container ID: Image: 549840312665.dkr.ecr.us-east-1.amazonaws.com/docker-gs-ping:latest Image ID: Port: 80/TCP Host Port: 0/TCP State: Waiting Reason: ImagePullBackOff Ready: False Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-sldvv (ro) Conditions: Type Status Initialized True Ready False ContainersReady False PodScheduled True Volumes: kube-api-access-sldvv: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 23m default-scheduler Successfully assigned default/helloworld-c6dc56598-jmpvr to docker-desktop Normal Pulling 22m (x4 over 23m) kubelet Pulling image "549840312665.dkr.ecr.us-east-1.amazonaws.com/docker-gs-ping:latest" Warning Failed 22m (x4 over 23m) kubelet Failed to pull image "549840312665.dkr.ecr.us-east-1.amazonaws.com/docker-gs-ping:latest": rpc error: code = Unknown desc = Error response from daemon: Head "https://549840312665.dkr.ecr.us-east-1.amazonaws.com/v2/docker-gs-ping/manifests/latest": no basic auth credentials Warning Failed 22m (x4 over 23m) kubelet Error: ErrImagePull Warning Failed 22m (x6 over 23m) kubelet Error: ImagePullBackOff Normal BackOff 3m47s (x85 over 23m) kubelet Back-off pulling image "549840312665.dkr.ecr.us-east-1.amazonaws.com/docker-gs-ping:latest" Name: helloworld-c6dc56598-r9b4d Namespace: default Priority: 0 Service Account: default Node: docker-desktop/192.168.65.4 Start Time: Fri, 07 Jul 2023 22:22:18 +0530 Labels: app=helloworld pod-template-hash=c6dc56598 Annotations: <none> Status: Pending IP: 10.1.0.6 IPs: IP: 10.1.0.6 Controlled By: ReplicaSet/helloworld-c6dc56598 Containers: new-container: Container ID: Image: 549840312665.dkr.ecr.us-east-1.amazonaws.com/docker-gs-ping:latest Image ID: Port: 80/TCP Host Port: 0/TCP State: Waiting Reason: ImagePullBackOff Ready: False Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-84rw4 (ro) Conditions: Type Status Initialized True Ready False ContainersReady False PodScheduled True Volumes: kube-api-access-84rw4: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 23m default-scheduler Successfully assigned default/helloworld-c6dc56598-r9b4d to docker-desktop Normal Pulling 22m (x4 over 23m) kubelet Pulling image "549840312665.dkr.ecr.us-east-1.amazonaws.com/docker-gs-ping:latest" Warning Failed 22m (x4 over 23m) kubelet Failed to pull image "549840312665.dkr.ecr.us-east-1.amazonaws.com/docker-gs-ping:latest": rpc error: code = Unknown desc = Error response from daemon: Head "https://549840312665.dkr.ecr.us-east-1.amazonaws.com/v2/docker-gs-ping/manifests/latest": no basic auth credentials Warning Failed 22m (x4 over 23m) kubelet Error: ErrImagePull Warning Failed 22m (x6 over 23m) kubelet Error: ImagePullBackOff Normal BackOff 3m43s (x86 over 23m) kubelet Back-off pulling image "549840312665.dkr.ecr.us-east-1.amazonaws.com/docker-gs-ping:latest"
Saya telah mencuba banyak penyelesaian seperti yang dicadangkan pada stackoverflow tetapi nampaknya tiada apa-apa yang berkesan untuk saya, apa-apa cadangan bagaimana saya boleh membuat sesuatu berfungsi? Terima kasih banyak-banyak terlebih dahulu.
Ada beberapa perkara. Pertama, anda harus mengelak daripada menggunakan teg terkini. Ini adalah anti-corak. Apabila anda menolak imej ke ECR, gunakan label binaan atau nombor versi sebagai label imej. Kedua, anda perlu mengesahkan bahawa nod pekerja anda mempunyai kebenaran untuk menarik imej daripada ECR, khususnya dasar AmazonEC2ContainerRegistryReadOnly. Jika tidak, kubelet tidak akan dapat menarik imej daripada ECR. Jika pendaftaran berada dalam akaun yang berbeza daripada kluster, anda perlu membuat dasar [sumber] repositori. Lihat https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html.
Atas ialah kandungan terperinci Imej dari ECR ke EKS tidak berfungsi kerana Pod yang terhasil sentiasa 0/2. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!