Global outage event
If you're experiencing issues with your AWS services, then please refer to the AWS Health Dashboard. You can find the overall status of ongoing outages, the health of AWS services, and the latest updates from AWS engineers.
Amazon EKS containerd 노드의 HTTP 프록시 구성을 자동화하려면 어떻게 해야 합니까?
containerd 런타임을 사용하는 Amazon Elastic Kubernetes Service(Amazon EKS) 노드의 HTTP 프록시 구성을 자동화하고 싶습니다.
간략한 설명
사용자 데이터에 프록시 설정이 포함된 사용자 지정 시작 템플릿을 사용하여 Amazon EKS 노드의 HTTP 프록시 구성을 자동화할 수 있습니다. 구성 접근 방식은 Amazon Linux 2, Amazon Linux 2023 또는 Bottlerocket 등 AMI 제품군에 따라 다릅니다.
참고: Amazon EKS 클러스터 버전 1.24 이상에서는 containerd가 기본 컨테이너 런타임입니다.
해결 방법
HTTP 프록시 설정으로 관리형 노드 그룹을 구성하려면 Amazon Machine Image(AMI) ID를 사용하여 사용자 지정 시작 템플릿을 만듭니다. 그런 다음 HTTP 프록시에 대한 적절한 설정과 클러스터의 환경 값을 구성할 수 있습니다.
AMI 제품군에 따라 구성 접근 방식을 선택하십시오.
Amazon Linux 2 노드용 HTTP 프록시 구성
시작 템플릿 만들기
- Amazon Elastic Compute Cloud(Amazon EC2) 콘솔을 엽니다.
- 탐색 창에서 시작 템플릿을 선택합니다.
- 시작 템플릿 생성을 선택합니다.
- 시작 템플릿 이름에 템플릿 이름을 입력합니다.
- **애플리케이션 및 OS 이미지(Amazon Machine Image)**에서 Amazon Linux 2 AMI ID를 선택합니다.
- 다음 옵션을 구성합니다.
인스턴스 유형에서 필요한 인스턴스 유형을 선택합니다.
키 페어 이름에서 Amazon EC2 SSH 키 페어를 선택합니다.
보안 그룹에서 보안 그룹을 선택합니다. - 고급 세부 정보를 확장합니다.
- 사용자 데이터에서 다음 구성을 입력합니다.
참고: XXXXXXX:3128을 프록시 호스트 이름 및 포트로 바꾸십시오. YOUR_CLUSTER_CA를 클러스터 인증 기관(CA)으로 바꾸십시오. API_SERVER_ENDPOINT를 서버 엔드포인트로 바꾸십시오. EKS_CLUSTER_NAME을 클러스터 이름으로 바꾸십시오.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://[IP_ADDRESS]/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` MAC=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://[IP_ADDRESS]/latest/meta-data/mac/) VPC_CIDR=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://[IP_ADDRESS]/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 #[Optional] 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,[IP_ADDRESS],[IP_ADDRESS],[IP_ADDRESS],.internal,.eks.amazonaws.com NO_PROXY=$VPC_CIDR,[IP_ADDRESS],[IP_ADDRESS],[IP_ADDRESS],.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 --==BOUNDARY==-- - 시작 템플릿 생성을 선택합니다.
구성 확인
시작 템플릿을 사용하여 관리형 노드 그룹을 만든 후 프록시 구성을 확인합니다.
-
노드 상태를 확인하려면 다음 명령을 실행합니다.
kubectl get nodes -o wide -
프록시 환경 변수가 설정되었는지 확인하려면 노드에 연결하고 다음 명령을 실행합니다.
systemctl show containerd | grep Environment
출력은 containerd에 대해 구성된 프록시 환경 변수를 보여줍니다.
Amazon Linux 2023 노드용 HTTP 프록시 구성
참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
Amazon Linux 2023에는 YAML 구성 스키마를 사용하는 nodeadm이라는 새로운 노드 초기화 프로세스가 도입되었습니다. 이 프로세스에서 nodeadm은 구성과 실행이라는 두 단계로 실행됩니다. noadm-config 단계는 cloud-init 이전에 실행되고, nodeadm-run은 cloud-init 이후에 실행됩니다.
nodeadm-config 단계에서 시스템은 Amazon EC2 서비스를 호출하여 인스턴스 세부 정보를 검색합니다. 프록시 설정을 구성하기 전에 Amazon EC2 호출을 방지하려면 nodeadm의 InstanceIdNodeName 기능 게이트를 사용하십시오.
워커 노드 IAM 역할 만들기
-
필요한 정책을 사용하여 새 워커 노드 AWS Identity and Access Management(IAM) 역할을 만듭니다.
-
다음 옵션 중 하나를 사용하여 워커 노드 IAM 역할에 적절한 액세스 권한을 제공합니다.
옵션 1: EKS 액세스 항목 만들기
EC2 유형의 액세스 항목을 만들려면 다음 create-access-entry AWS CLI 명령을 실행합니다.aws eks create-access-entry --cluster-name EKS_CLUSTER_NAME --principal-arn WORKER_NODE_IAM_ROLE_ARN --type EC2참고: EKS_CLUSTER_NAME을 클러스터 이름으로 바꾸십시오. WORKER_NODE_IAM_ROLE_ARN을 워커 노드 IAM 역할 ARN으로 바꾸십시오.
옵션 2: aws-auth ConfigMap 업데이트
다음 구성을 aws-auth ConfigMap에 YAML 형식으로 추가합니다.- groups: - system:bootstrappers - system:nodes rolearn: ROLE_ARN username: system:node:{{SessionName}}참고: ROLE_ARN을 워커 노드 IAM 역할 ARN으로 바꾸십시오. 이 구성은 워커 노드 IAM 역할에 필요한 Kubernetes RBAC 권한을 부여합니다.
시작 템플릿 만들기
- Amazon EC2 콘솔을 엽니다.
- 탐색 창에서 시작 템플릿을 선택합니다.
- 시작 템플릿 생성을 선택합니다.
- 시작 템플릿 이름에 템플릿 이름을 입력합니다.
- **애플리케이션 및 OS 이미지(Amazon Machine Image)**에서 Amazon Linux 2023 AMI ID를 선택합니다.
- 다음 옵션을 구성합니다.
인스턴스 유형에서 필요한 인스턴스 유형을 선택합니다.
키 페어 이름에서 Amazon EC2 SSH 키 페어를 선택합니다.
보안 그룹에서 보안 그룹을 선택합니다. - 고급 세부 정보를 확장합니다.
- 사용자 데이터에서 다음 구성을 입력합니다.
참고: XXXXXXX:3128을 프록시 호스트 이름 및 포트로 바꾸십시오. YOUR_CLUSTER_CA를 클러스터 인증 기관(CA)으로 바꾸십시오. API_SERVER_ENDPOINT를 서버 엔드포인트로 바꾸십시오. EKS_CLUSTER_NAME을 클러스터 이름으로 바꾸십시오. KUBERNETES_SERVICE_CIDR_RANGE를 클러스터의 서비스 CIDR 범위로 바꾸십시오. 사용자 데이터에 서비스 CIDR이 제공되지 않으면 nodeadm-config 단계가 실패합니다.MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==BOUNDARY==" --==BOUNDARY== Content-Type: text/cloud-boothook; charset="us-ascii" #!/bin/bash #Set the proxy hostname and port PROXY=XXXXXXX:3128 TOKEN=`curl -X PUT "http://[IP_ADDRESS]/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` MAC=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://[IP_ADDRESS]/latest/meta-data/mac/) VPC_CIDR=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://[IP_ADDRESS]/latest/meta-data/network/interfaces/macs/$MAC/vpc-ipv4-cidr-blocks | xargs | tr ' ' ',') #[Optional] 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,[IP_ADDRESS],[IP_ADDRESS],[IP_ADDRESS],.internal,.eks.amazonaws.com NO_PROXY=$VPC_CIDR,[IP_ADDRESS],[IP_ADDRESS],[IP_ADDRESS],.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 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: application/node.eks.aws --- apiVersion: node.eks.aws/v1alpha1 kind: NodeConfig spec: featureGates: InstanceIdNodeName: true cluster: name: EKS_CLUSTER_NAME apiServerEndpoint: API_SERVER_ENDPOINT certificateAuthority: YOUR_CLUSTER_CA cidr: KUBERNETES_SERVICE_CIDR_RANGE --==BOUNDARY==-- - 시작 템플릿 생성을 선택합니다.
구성 확인
시작 템플릿을 사용하여 관리형 노드 그룹을 만든 후 프록시 구성을 확인합니다.
-
노드 상태를 확인하려면 다음 명령을 실행합니다.
kubectl get nodes -o wide -
프록시 환경 변수가 설정되었는지 확인하려면 노드에 연결하고 다음 명령을 실행합니다.
systemctl show containerd | grep Environment
출력은 containerd에 대해 구성된 프록시 환경 변수를 보여줍니다.
Bottlerocket 노드에 대한 HTTP 프록시 구성
시작 템플릿 만들기
-
Amazon EC2 콘솔을 엽니다.
-
탐색 창에서 시작 템플릿을 선택합니다.
-
시작 템플릿 생성을 선택합니다.
-
시작 템플릿 이름에 템플릿 이름을 입력합니다.
-
**애플리케이션 및 OS 이미지(Amazon Machine Image)**에서 Bottlerocket AMI ID를 선택합니다.
-
다음 옵션을 구성합니다.
인스턴스 유형에서 필요한 인스턴스 유형을 선택합니다.
키 페어 이름에서 Amazon EC2 SSH 키 페어를 선택합니다.
보안 그룹에서 보안 그룹을 선택합니다. -
고급 세부 정보를 확장합니다.
-
사용자 데이터에서 다음 구성을 입력합니다.
[settings.kubernetes] "cluster-name" = "EKS_CLUSTER_NAME" "api-server" = "API_SERVER_ENDPOINT" "cluster-certificate" = "YOUR_CLUSTER_CA" [settings.network] no-proxy = ["VPC_CIDR_RANGE","[IP_ADDRESS]","[IP_ADDRESS]","[IP_ADDRESS]",".internal",".eks.amazonaws.com"] https-proxy = "XXXXXXX:3128"참고: XXXXXXX:3128을 프록시 호스트 이름 및 포트로 바꾸십시오. YOUR_CLUSTER_CA를 클러스터 인증 기관(CA)으로 바꾸십시오. API_SERVER_ENDPOINT를 서버 엔드포인트로 바꾸십시오. EKS_CLUSTER_NAME을 클러스터 이름으로 바꾸십시오. VPC_CIDR_RANGE를 VPC CIDR로 바꾸십시오. Bottlerocket은 containerd 및 kubelet 서비스에 대한 프록시 설정을 자동으로 구성합니다.
Bottlerocket 인스턴스에 자체 서명 인증서를 추가하려면 사용자 데이터 섹션에서 다음 구성을 사용하십시오.
[settings.pki.proxy-bundle] data="ENCODED_CA_DATA" trusted=true참고: ENCODED_CA_DATA를 base64로 인코딩된 인증서 데이터로 바꾸십시오.
인증서 파일을 인코딩하려면 다음 명령을 실행합니다.
base64 -i FILE -w0 -
시작 템플릿 생성을 선택합니다.
구성 확인
시작 템플릿을 사용하여 관리형 노드 그룹을 만든 후 프록시 구성을 확인합니다.
-
노드 상태를 확인하려면 다음 명령을 실행합니다.
kubectl get nodes -o wide -
프록시 설정을 확인하려면 AWS Systems Manager Session Manager를 사용하여 Bottlerocket 노드에 연결하고 다음 명령을 실행합니다.
apiclient get settings.network
노드에 대해 구성된 프록시 설정이 출력에 표시됩니다.
관리형 노드 그룹 만들기
시작 템플릿을 만든 후 사용자 지정 시작 템플릿을 사용하는 새 관리형 노드 그룹을 만듭니다.
시작 템플릿을 사용하여 관리형 노드 그룹을 만드는 방법에 대한 자세한 내용은 시작 템플릿을 사용하여 관리형 노드 사용자 지정을 참조하십시오.
완전 사설 클러스터용 프록시 구성
중요: EKS Pod Identity 연결을 프록시 구성과 함께 사용하는 경우 no_proxy/NO_PROXY 환경 변수에 [IP_ADDRESS] (IPv4) 또는 [[IP_ADDRESS]] (IPv6)도 포함해야 합니다.
프라이빗 API 서버 엔드포인트 액세스, 프라이빗 서브넷이 있으며 인터넷 액세스가 가능하지 않은 Amazon EKS 클러스터에는 추가 엔드포인트가 필요합니다. 위 구성을 사용하여 클러스터를 구축하는 경우 다음 서비스에 대한 엔드포인트를 만들고 추가해야 합니다.
- Amazon EC2
- 컨테이너 이미지를 풀하는 Amazon Elastic Container Registry
- Application Load Balancer 및 Network Load Balancer를 위한 Amazon Elastic Load Balancing
- Amazon CloudWatch Logs
- AWS Security Token Service(서비스 계정에 IAM 역할을 사용하는 경우)
- Amazon EKS Auth(Pod Identity 연결을 사용하는 경우)
- Amazon EKS
이러한 엔드포인트를 만든 후 Amazon EC2 인스턴스 시작 템플릿 사용자 데이터에 NO_PROXY 및 no_proxy 변수를 구성하십시오. AWS 리전 및 서비스와 관련된 퍼블릭 엔드포인트 하위 도메인을 포함하십시오.
예를 들면 다음과 같습니다.
Amazon Simple Storage Service(Amazon S3):
- 버킷이 us-east-1에 있는 경우 .s3.us-east-1.amazonaws.com 추가
- 버킷이 eu-west-1에 있는 경우 .s3.eu-west-1.amazonaws.com 추가
Amazon EKS(프라이빗 엔드포인트 액세스를 사용하는 경우):
- 클러스터가 us-east-1에 있는 경우 .us-east-1.eks.amazonaws.com 추가
- 클러스터가 eu-west-1에 있는 경우 .eu-west-1.eks.amazonaws.com 추가
참고: 리전 식별자를 리소스를 배포한 AWS 리전으로 바꾸고 이러한 엔드포인트를 NO_PROXY 및 no_proxy 변수 모두에 추가하십시오. 클러스터의 워크로드와 추가 기능에 따라 프록시 구성에 다른 서비스를 추가합니다.
퍼블릭 클러스터용 프록시 구성
참고: 구성이 다른 경우 이러한 단계는 선택 사항입니다.
HTTP 프록시를 통해 클러스터에서 인터넷으로 트래픽을 라우팅하고 Amazon EKS 엔드포인트가 퍼블릭 엔드포인트인 경우 다음 작업을 완료하십시오.
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,[IP_ADDRESS],[IP_ADDRESS],VPC_CIDR_RANGE,[IP_ADDRESS],.internal,.eks.amazonaws.com,ec2.us-east-1.amazonaws.com no_proxy: KUBERNETES_SERVICE_CIDR_RANGE,[IP_ADDRESS],[IP_ADDRESS],VPC_CIDR_RANGE,[IP_ADDRESS],.internal,.eks.amazonaws.com,ec2.us-east-1.amazonaws.com
참고: KUBERNETES_SERVICE_CIDR_RANGE 및 VPC_CIDR_RANGE를 사용자의 CIDR 범위의 해당 값으로 바꾸십시오. VPC 엔드포인트(Amazon EKS 및 Amazon EC2)를 만든 후 NO_PROXY 및 no_proxy에 AWS 서비스 엔드포인트를 추가할 수 있습니다.
ConfigMap 적용:
kubectl apply -f proxy-configmap.yaml
aws-node 및 kube-proxy 구성
HTTP 프록시 구성을 aws-node 및 kube-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 -o wide -
프록시를 통한 포드 연결을 테스트하려면 다음 명령을 실행합니다.
kubectl run test-pod --image=amazonlinux:2 --restart=Never -- sleep 300 kubectl get pods -A -
프록시 로그에서 노드 연결에 대한 추가 정보를 확인합니다. 컨테이너 레지스트리 엔드포인트에 대한 성공적인 연결(TCP_TUNNEL/200)이 로그에 표시되어야 합니다.
출력 예시: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 -
관련 정보
- 언어
- 한국어

관련 콘텐츠
- 질문됨 2년 전