Amazon EKS containerd 노드의 HTTP 프록시 구성을 자동화하려면 어떻게 해야 하나요?
containerd 런타임을 사용하는 Amazon Elastic Kubernetes Service(Amazon EKS) 노드의 HTTP 프록시 구성을 자동화하고 싶습니다.
간략한 설명
Amazon EKS 버전 1.23 이하에서 생성한 관리형 노드 그룹에서 기본 컨테이너 런타임은 Docker입니다. 이에 해당하는 경우, 해결 방법의 모든 단계에 따라 containerd 런타임을 지정해야 합니다. Amazon EKS 버전 1.24 이상에서 생성된 관리형 노드 그룹에서 containerd의 기본 컨테이너 런타임입니다.
관리형 노드 그룹에서 dockerd 대신 containerd를 사용하려면 userdata에 containerd 런타임을 지정해야 합니다.
관리형 노드 그룹을 containerd 런타임으로 전환한 후 AMI ID로 사용자 지정 시작 템플릿을 생성합니다. 그런 다음 HTTP 프록시에 대한 설정과 클러스터의 환경 값을 구성할 수 있습니다.
참고: 다음 해결 방법은 기본 런타임이 containerd인 노드에만 적용되며 Docker 런타임을 사용하는 노드에는 적용되지 않습니다. Docker 런타임을 사용하는 노드의 경우, Docker를 사용하여 Amazon EKS 워커 노드의 HTTP 프록시 구성을 자동화하려면 어떻게 해야 하나요?를 참조하세요.
해결 방법
사용자 지정 시작 템플릿 생성
- containerd를 관리형 노드 그룹의 런타임으로 지정합니다. userdata에서 bootstrap.sh의 --container-runtime=containerd 옵션을 사용합니다.
- AMI ID로 사용자 지정 시작 템플릿을 생성합니다. 그렇지 않으면 AMI ID가 지정되지 않은 경우, 관리형 노드 그룹이 userdata를 자동으로 병합합니다.
- 프록시 구성을 containerd, sandbox-image 및 kubelet으로 설정합니다. Sandbox-image는 containerd용 샌드박스 이미지를 가져오는 서비스 단위입니다. 이 구성을 설정하려면 GitHub의 sandbox-image.service 및 pull-sandbox-image.sh 스크립트를 참조하세요.
- 이제 다음 필드를 사용하여 userdata를 설명할 수 있습니다.
참고: XXXXXXX:3128, YOUR_CLUSTER_CA, API_SERVER_ENDPOINT 및 EKS_CLUSTER_NAME을 관련 프록시, 클러스터 CA, 서버 엔드포인트 및 클러스터 이름으로 바꾸세요. VPC 엔드포인트를 생성한 후 NO_PROXY 및 no_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_RANGE 및 VPC_CIDR_RANGE를 사용자의 CIDR 범위의 관련 값으로 바꾸세요. 예를 들어, KUBERNETES_SERVICE_CIDR_RANGE를 10.100.0.0/16, VPC_CIDR_RANGE를 192.168.0.0/16으로 바꾸세요. VPC 엔드포인트를 생성한 후 NO_PROXY 및 no_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-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 $ 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 -
관련 정보
관련 콘텐츠
- 질문됨 5달 전lg...
- 질문됨 3달 전lg...
- 질문됨 3일 전lg...
- AWS 공식업데이트됨 일 년 전
- AWS 공식업데이트됨 2년 전
- AWS 공식업데이트됨 2년 전
- AWS 공식업데이트됨 7달 전