Tuan-Anh Tran
December 27, 2021

Public ECR and private subnets

Posted on December 27, 2021  •  3 minutes  • 528 words

Hôm trước mình hơi băn khoăn chút việc nếu sử dụng public ECR (public.ecr.aws) với sử dụng 1 k8s cluster trong private subnets, thì bandwidth từ việc pull images về trong private subnets sẽ đc tính thế nào.

  1. Tính vào cho NAT gateway?
  2. Hay tính vào cho S3 Gateway Endpoint?

Vì public ECR sử dụng S3 làm storage nên trong trường hợp ngon nghẻ nhất là bandwidth đc tính vào Gateway endpoint thì ngon :)

k8s pull images thế nào?

mặc định thì kubelet sẽ pull image tùy theo pull policy. trong trường hợp image ko có thì sẽ request lên registry.

container registry sẽ provide binary images hoặc container image index (trong trường hợp sử dụng nhiều image manifests cho multi-arch).

Trong mỗi image manifest này sẽ có thông tin về image bao gồm những layers nào: mediaType, size, digest như thế nào.

Từ digest này, kubelet sẽ gọi có thể lấy đc layer đó về qua registry API GET /v2/<name>/blobs/<digest>.

Cho tới đây thì chúng ta biết đc là kubelet sẽ pull image về như thế nào rồi đúng ko?

Cách tính bandwidth cho NAT hay cho S3 gateway endpoint thì sao?

Giả sử như public ECR trả về 1 cái pre-signed S3 URL thì mọi chuyện sẽ rất đơn giản đúng ko? Nhưng trong image index spec thì ko có cái đó và các layers đc serve thẳng từ registry API.

Quay lại việc S3 endpoint hoạt động như thế nào. Đơn giản là việc add thêm IP range của S3 vào trong network route table thế nên nếu cái endpoint kia resolve ra đc thì sao?

Câu trả lời là cũng ko đc. Cái registry URL này ko thể resolve ra IP range của VPC endpoint đc (để chúng ta có thể route nó qua vpc endpoint) vì nó là dùng chung của registry và còn serve các API khác nữa của registry nữa.

Thêm 1 điểm nữa để confirm là khi chúng ta dig public.ecr.aws thì ra awsglobalaccelerator.com. Cái này càng ko thể đc phép resolve ra IP range của VPC endpoint của từng service đc.

dig @1.1.1.1 public.ecr.aws

; <<>> DiG 9.16.15-Ubuntu <<>> @1.1.1.1 public.ecr.aws
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2555
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;public.ecr.aws.			IN	A

;; ANSWER SECTION:
public.ecr.aws.		300	IN	CNAME	a961edf72200aa9b1.awsglobalaccelerator.com.
a961edf72200aa9b1.awsglobalaccelerator.com. 300	IN A 99.83.145.10
a961edf72200aa9b1.awsglobalaccelerator.com. 300	IN A 75.2.101.78

;; Query time: 155 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Tue Dec 28 17:37:38 +07 2021
;; MSG SIZE  rcvd: 131

Thế kết luận là?

Thôi thì ngồi đoán mãi cũng chỉ tới vậy. Đơn giản nhất là spun up 1 instance lên rồi pull vài chục lần cái image to là đc mà phải ko :)

Có vẻ là nó đc tính cho NAT bandwidth từ cloudwatch metrics lúc mình test (trừ khi mình setup test sai =)). Và kết luận này có vẻ cũng hợp lý vì nếu bỏ NAT đi thì ko pull đc từ private subnets nữa.

Follow me

Here's where I hang out in social media