Amazon EKS containerd 노드의 HTTP 프록시 구성을 자동화하려면 어떻게 해야 하나요?

4분 분량
0

containerd 런타임을 사용하는 Amazon Elastic Kubernetes Service(Amazon EKS) 노드의 HTTP 프록시 구성을 자동화하고 싶습니다.

간략한 설명

Amazon EKS 버전 1.23 이하에서 생성한 관리형 노드 그룹에서 기본 컨테이너 런타임은 Docker입니다. 이에 해당하는 경우, 해결 방법의 모든 단계에 따라 containerd 런타임을 지정해야 합니다. Amazon EKS 버전 1.24 이상에서 생성된 관리형 노드 그룹에서 containerd의 기본 컨테이너 런타임입니다.

관리형 노드 그룹에서 dockerd 대신 containerd를 사용하려면 userdatacontainerd 런타임을 지정해야 합니다.

관리형 노드 그룹을 containerd 런타임으로 전환한 후 AMI ID로 사용자 지정 시작 템플릿을 생성합니다. 그런 다음 HTTP 프록시에 대한 설정과 클러스터의 환경 값을 구성할 수 있습니다.

참고: 다음 해결 방법은 기본 런타임이 containerd인 노드에만 적용되며 Docker 런타임을 사용하는 노드에는 적용되지 않습니다. Docker 런타임을 사용하는 노드의 경우, Docker를 사용하여 Amazon EKS 워커 노드의 HTTP 프록시 구성을 자동화하려면 어떻게 해야 하나요?를 참조하세요.

해결 방법

사용자 지정 시작 템플릿 생성

  1. containerd를 관리형 노드 그룹의 런타임으로 지정합니다. userdata에서 bootstrap.sh--container-runtime=containerd 옵션을 사용합니다.
  2. AMI ID로 사용자 지정 시작 템플릿을 생성합니다. 그렇지 않으면 AMI ID가 지정되지 않은 경우, 관리형 노드 그룹이 userdata를 자동으로 병합합니다.
  3. 프록시 구성을 containerd, sandbox-imagekubelet으로 설정합니다. Sandbox-image는 containerd용 샌드박스 이미지를 가져오는 서비스 단위입니다. 이 구성을 설정하려면 GitHub의 sandbox-image.servicepull-sandbox-image.sh 스크립트를 참조하세요.
  4. 이제 다음 필드를 사용하여 userdata를 설명할 수 있습니다.
    참고: XXXXXXX:3128, YOUR_CLUSTER_CA, API_SERVER_ENDPOINTEKS_CLUSTER_NAME을 관련 프록시, 클러스터 CA, 서버 엔드포인트 및 클러스터 이름으로 바꾸세요. VPC 엔드포인트를 생성한 후 NO_PROXYno_proxy에 AWS 서비스 엔드포인트를 추가할 수 있습니다.
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==BOUNDARY=="

--==BOUNDARY==
Content-Type: text/cloud-boothook; charset="us-ascii"

#Set the proxy hostname and port
PROXY=XXXXXXX:3128
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
MAC=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://169.254.169.254/latest/meta-data/mac/)
VPC_CIDR=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://169.254.169.254/latest/meta-data/network/interfaces/macs/$MAC/vpc-ipv4-cidr-blocks | xargs | tr ' ' ',')

#Create the containerd and sandbox-image systemd directory
mkdir -p /etc/systemd/system/containerd.service.d
mkdir -p /etc/systemd/system/sandbox-image.service.d

#[Option] Configure yum to use the proxy
cloud-init-per instance yum_proxy_config cat << EOF >> /etc/yum.conf
proxy=http://$PROXY
EOF

#Set the proxy for future processes, and use as an include file
cloud-init-per instance proxy_config cat << EOF >> /etc/environment
http_proxy=http://$PROXY
https_proxy=http://$PROXY
HTTP_PROXY=http://$PROXY
HTTPS_PROXY=http://$PROXY
no_proxy=$VPC_CIDR,localhost,127.0.0.1,169.254.169.254,.internal,.eks.amazonaws.com
NO_PROXY=$VPC_CIDR,localhost,127.0.0.1,169.254.169.254,.internal,.eks.amazonaws.com
EOF

#Configure Containerd with the proxy
cloud-init-per instance containerd_proxy_config tee <<EOF /etc/systemd/system/containerd.service.d/http-proxy.conf >/dev/null
[Service]    
EnvironmentFile=/etc/environment
EOF

#Configure sandbox-image with the proxy
cloud-init-per instance sandbox-image_proxy_config tee <<EOF /etc/systemd/system/sandbox-image.service.d/http-proxy.conf >/dev/null
[Service]    
EnvironmentFile=/etc/environment
EOF

#Configure the kubelet with the proxy
cloud-init-per instance kubelet_proxy_config tee <<EOF /etc/systemd/system/kubelet.service.d/proxy.conf >/dev/null
[Service]
EnvironmentFile=/etc/environment
EOF

cloud-init-per instance reload_daemon systemctl daemon-reload

--==BOUNDARY==
Content-Type:text/x-shellscript; charset="us-ascii"

#!/bin/bash
set -o xtrace

#Set the proxy variables before running the bootstrap.sh script
set -a
source /etc/environment

#Run the bootstrap.sh script
B64_CLUSTER_CA=YOUR_CLUSTER_CA
API_SERVER_URL=API_SERVER_ENDPOINT

/etc/eks/bootstrap.sh EKS_CLUSTER_NAME --b64-cluster-ca $B64_CLUSTER_CA --apiserver-endpoint $API_SERVER_URL --container-runtime containerd

--==BOUNDARY==--

aws-node 및 kube-proxy의 프록시 설정 구성

ConfigMap을 생성하여 환경 값을 구성합니다. 그런 다음 클러스터에 적용합니다. 다음 스크립트를 ConfigMap의 예로 사용하세요. 참고: KUBERNETES_SERVICE_CIDR_RANGEVPC_CIDR_RANGE를 사용자의 CIDR 범위의 관련 값으로 바꾸세요. 예를 들어, KUBERNETES_SERVICE_CIDR_RANGE10.100.0.0/16, VPC_CIDR_RANGE192.168.0.0/16으로 바꾸세요. VPC 엔드포인트를 생성한 후 NO_PROXYno_proxy에 AWS 서비스 엔드포인트를 추가할 수 있습니다.

apiVersion: v1
kind: ConfigMap

metadata:

   name: proxy-environment-variables

   namespace: kube-system

data:

   HTTP_PROXY: http://XXXXXXX:3128

   HTTPS_PROXY: http://XXXXXXX:3128

   NO_PROXY: KUBERNETES_SERVICE_CIDR_RANGE,localhost,127.0.0.1,VPC_CIDR_RANGE,169.254.169.254,.internal,.eks.amazonaws.com

그런 다음 HTTP 프록시 구성을 aws-nodekube-proxy로 설정합니다.

$ kubectl patch -n kube-system -p '{ "spec": {"template":{ "spec": { "containers": [ { "name": "aws-node", "envFrom": [ { "configMapRef": {"name": "proxy-environment-variables"} } ] } ] } } } }' daemonset aws-node
$ kubectl patch -n kube-system -p '{ "spec": {"template":{ "spec": { "containers": [ { "name": "kube-proxy", "envFrom": [ { "configMapRef": {"name": "proxy-environment-variables"} } ] } ] } } } }' daemonset kube-proxy

관리형 노드 그룹 생성

이전에 생성한 사용자 지정 시작 템플릿을 사용하는 새 관리형 노드 그룹을 생성합니다. 관리형 노드 그룹 생성의 단계를 따르세요.

프록시 테스트

노드 상태를 확인하려면 다음 명령을 실행합니다.

$ kubectl get nodes

        $ kubectl run test-pod --image=amazonlinux:2 --restart=Never -- sleep 300

        $ kubectl get pods -A

다음 예와 유사한 출력이 표시됩니다.

$ kubectl get nodes -o wide
NAME                                                 STATUS   ROLES    AGE     VERSION                INTERNAL-IP       EXTERNAL-IP   OS-IMAGE         KERNEL-VERSION                 CONTAINER-RUNTIME

ip-192-168-100-114.ap-northeast-1.compute.internal   Ready    <none>   2m27s   v1.23.13-eks-fb459a0   192.168.100.114   <none>        Amazon Linux 2   5.4.219-126.411.amzn2.x86_64   containerd://1.6.6



$ kubectl run test-pod --image=amazonlinux:2 --restart=Never -- sleep 300

pod/test-pod created



$ kubectl get pods -A

NAMESPACE     NAME                       READY   STATUS    RESTARTS   AGE

default       test-pod                   1/1     Running   0          14s

kube-system   aws-node-cpjcl             1/1     Running   0          3m34s

kube-system   coredns-69cfddc4b4-c7rpd   1/1     Running   0          26m

kube-system   coredns-69cfddc4b4-z5jxq   1/1     Running   0          26m

kube-system   kube-proxy-g2f4g           1/1     Running   0          3m34s

프록시 로그에서 노드 연결에 대한 추가 정보를 확인하세요.

192.168.100.114 TCP_TUNNEL/200 6230 CONNECT registry-1.docker.io:443 - HIER_DIRECT/XX.XX.XX.XX -
192.168.100.114 TCP_TUNNEL/200 10359 CONNECT auth.docker.io:443 - HIER_DIRECT/XX.XX.XX.XX -
192.168.100.114 TCP_TUNNEL/200 6633 CONNECT registry-1.docker.io:443 - HIER_DIRECT/XX.XX.XX.XX -
192.168.100.114 TCP_TUNNEL/200 10353 CONNECT auth.docker.io:443 - HIER_DIRECT/XX.XX.XX.XX -
192.168.100.114 TCP_TUNNEL/200 8767 CONNECT registry-1.docker.io:443 - HIER_DIRECT/XX.XX.XX.XX -

관련 정보

Amazon EKS에서 클러스터를 생성한 후 다른 AWS Identity and Access Management(IAM) 사용자 및 역할에 대한 액세스를 제공하려면 어떻게 해야 하나요?

AWS 공식
AWS 공식업데이트됨 9달 전