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 런타임으로 전환한 후 Amazon Machine Image(AMI) ID로 사용자 지정 시작 템플릿을 생성합니다. 그런 다음 HTTP 프록시에 대한 설정과 클러스터의 환경 값을 구성할 수 있습니다.

참고: Docker 런타임을 사용하는 노드의 경우, Docker를 사용하는 Amazon EKS 작업자 노드에 대해 HTTP 프록시를 자동 구성하는 방법은 무엇입니까?를 참조하세요.

해결 방법

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

Containerd를 런타임으로 지정하고 사용자 지정 시작 템플릿을 생성하려면 다음 단계를 완료하세요.

  1. Containerd를 관리형 노드 그룹의 런타임으로 지정합니다. userdata에서 bootstrap.sh--container-runtime=containerd 옵션을 사용합니다.

  2. AMI ID로 사용자 지정 사용자 지정 시작 템플릿을 생성합니다. 이 작업을 수행하지 않으면 관리 노드 그룹이 자동으로 userdata 데이터를 병합합니다.

  3. 프록시 구성을 Containerd, sandbox-imagekubelet으로 설정합니다.
    참고: Sandbox-imageContainerd용 샌드박스를 가져오는 서비스 단위입니다.

  4. 이제 다음 필드를 사용하여 userdata를 설명할 수 있습니다.

    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==--

    참고: XXXXXXX:3128, YOUR_CLUSTER_CA, API_SERVER_ENDPOINTEKS_CLUSTER_NAME을 해당 프록시, 클러스터 인증 기관(CA), 서버 엔드포인트 및 클러스터 이름으로 바꾸세요. 가상 프라이빗 클라우드(VPC) 엔드포인트를 생성한 후, AWS 서비스 엔드포인트를 NO_PROXYno_proxy에 추가합니다.

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

참고: HTTP 프록시를 통해 클러스터에서 인터넷으로 트래픽을 라우팅하고 EKS 엔드포인트가 공개인 경우 다음 단계를 완료해야 합니다. 구성이 다른 경우 이러한 단계는 선택 사항입니다.

ConfigMap을 생성하여 환경 값을 구성합니다. 그런 다음 클러스터에 ConfigMap을 적용합니다. 다음 스크립트를 ConfigMap의 예로 사용하세요.

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

참고: KUBERNETES_SERVICE_CIDR_RANGEVPC_CIDR_RANGE를 사용자의 CIDR 범위의 해당 값으로 바꾸세요. VPC 엔드포인트를 생성한 후 NO_PROXYno_proxy에 AWS 서비스 엔드포인트를 추가할 수 있습니다.

그런 다음 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에서 클러스터를 생성한 후 다른 IAM 사용자 및 역할에 대한 액세스를 제공하려면 어떻게 해야 하나요?

AWS 공식
AWS 공식업데이트됨 일 년 전
댓글 없음