Amazon EKS 클러스터에서 실행 중인 Kubernetes 서비스를 공개하려면 어떻게 해야 합니까?
Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터에서 실행 중인 Kubernetes 서비스를 공개하려고 합니다.
간략한 설명
클러스터에서 실행 중인 Kubernetes 서비스를 공개하려면 우선 샘플 애플리케이션을 생성합니다. 그런 다음, 샘플 애플리케이션에 ClusterIP, NodePort 및 LoadBalancer Kubernetes ServiceTypes를 적용합니다.
다음 세부 사항에 유의하세요.
- ClusterIP는 클러스터 내부 IP 주소에 서비스를 공개합니다.
- NodePort는 정적 포트에서 각 노드의 IP 주소에 서비스를 공개합니다.
- LoadBalancer는 로드 밸런서를 사용하여 서비스를 외부에 공개합니다.
참고: Amazon EKS는 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스 워커 노드에서 실행되는 포드에 대해 Network Load Balancer와 Classic Load Balancer를 지원합니다. Amazon EKS는 LoadBalancer를 사용하여 이러한 지원을 제공합니다. 네트워크 트래픽의 부하를 Network Load Balancer(인스턴스 또는 IP 대상) 또는 Classic Load Balancer(인스턴스 대상만)로 분산할 수 있습니다.
해결 방법
샘플 애플리케이션 생성
1. 배포 파일을 정의하고 적용합니다. 다음 예제에서는 두 개의 nginx 포드를 회전하는 ReplicaSet를 생성한 다음 nginx-deployment.yaml이라는 파일을 만듭니다.
cat <<EOF > nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 EOF
2. 배포를 생성합니다.
kubectl apply -f nginx-deployment.yaml
3. 포드가 실행 중이고 자체 내부 IP 주소가 있는지 확인합니다.
kubectl get pods -l 'app=nginx' -o wide | awk {'print $1" " $3 " " $6'} | column -t
출력:
NAME STATUS IP nginx-deployment-574b87c764-hcxdg Running 192.168.20.8 nginx-deployment-574b87c764-xsn9s Running 192.168.53.240
ClusterIP 서비스 생성
1. clusterip.yaml이라는 파일을 생성한 다음 유형을 ClusterIP로 설정합니다. 예:
cat <<EOF > clusterip.yaml apiVersion: v1 kind: Service metadata: name: nginx-service-cluster-ip spec: type: ClusterIP selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 EOF
2. 선언적 또는 명령적 명령을 사용하여 Kubernetes에서 ClusterIP 객체를 생성합니다.
객체를 생성하고 clusterip.yaml 파일을 적용하려면 다음 선언적 명령을 실행합니다.
kubectl create -f clusterip.yaml
출력:
service/nginx-service-cluster-ip created
-또는-
ClusterIP 유형의 배포를 공개하려면 다음 명령형 명령을 실행합니다.
kubectl expose deployment nginx-deployment --type=ClusterIP --name=nginx-service-cluster-ip
출력:
service "nginx-service-cluster-ip" exposed
참고: expose 명령은 YAML 파일을 생성하지 않고 서비스를 생성합니다. 그러나 kubectl은 명령형 명령을 선언적 Kubernetes 배포 객체로 변환합니다.
3. 애플리케이션에 액세스하여 ClusterIP 번호를 가져옵니다.
kubectl get service nginx-service-cluster-ip
출력:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-service-cluster-ip ClusterIP 10.100.12.153 <none> 80/TCP 23s
4. ClusterIP 서비스를 삭제합니다.
kubectl delete service nginx-service-cluster-ip
출력:
service "nginx-service-cluster-ip" deleted
NodePort 서비스 생성
1. NodePort 서비스를 생성하려면 nodeport.yaml이라는 파일을 생성한 다음 유형을 NodePort로 설정합니다. 예:
cat <<EOF > nodeport.yaml apiVersion: v1 kind: Service metadata: name: nginx-service-nodeport spec: type: NodePort selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 EOF
2. 선언적 또는 지시적 명령을 사용하여 Kubernetes에서 NodePort 객체를 생성합니다.
객체를 생성하고 nodeport.yaml 파일을 적용하려면 다음 선언적 명령을 실행합니다.
kubectl create -f nodeport.yaml
-또는-
NodePort 유형의 배포를 공개하려면 다음 명령형 명령을 실행합니다.
kubectl expose deployment nginx-deployment --type=NodePort --name=nginx-service-nodeport
출력:
service/nginx-service-nodeport exposed
3. nginx-service에 대한 정보를 가져옵니다.
kubectl get service/nginx-service-nodeport
출력:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-service-nodeport NodePort 10.100.106.151 <none> 80:30994/TCP 27s
중요: ServiceType은 서비스에 대해 자동으로 생성된 NodePort 및 ClusterIP입니다. 앞의 명령에 대한 출력은 NodePort 서비스가 사용 가능한 작업자 노드의 EC2 인스턴스에 대한 포트(30994)에서 외부적으로 공개되었음을 보여줍니다. 클러스터 외부에서 NodeIP:NodePort에 액세스하기 전에 수신 트래픽을 허용하도록 노드의 보안 그룹을 설정해야 합니다. 앞의 kubectl get service 명령 출력에 나열된 포트(30994)를 통한 수신 트래픽을 허용할 수 있습니다.
4. 노드가 퍼블릭 서브넷에 있고 인터넷에서 연결할 수 있는 경우 노드의 퍼블릭 IP 주소를 확인합니다.
kubectl get nodes -o wide | awk {'print $1" " $2 " " $7'} | column -t
출력:
NAME STATUS EXTERNAL-IP ip-10-0-3-226.eu-west-1.compute.internal Ready 1.1.1.1 ip-10-1-3-107.eu-west-1.compute.internal Ready 2.2.2.2
-또는-
노드가 프라이빗 서브넷에 있고 VPC 내부 또는 VPC를 통해서만 연결할 수 있는 경우 노드의 프라이빗 IP 주소를 확인합니다.
kubectl get nodes -o wide | awk {'print $1" " $2 " " $6'} | column -t
출력:
NAME STATUS INTERNAL-IP ip-10-0-3-226.eu-west-1.compute.internal Ready 10.0.3.226 ip-10-1-3-107.eu-west-1.compute.internal Ready 10.1.3.107
5. NodePort 서비스를 삭제합니다.
kubectl delete service nginx-service-nodeport
출력:
service "nginx-service-nodeport" deleted
LoadBalancer 서비스 생성
1. LoadBalancer 서비스를 생성하려면 loadbalancer.yaml이라는 파일을 생성한 다음 유형을 LoadBalancer로 설정합니다. 예:
cat <<EOF > loadbalancer.yaml apiVersion: v1 kind: Service metadata: name: nginx-service-loadbalancer spec: type: LoadBalancer selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 EOF
2. loadbalancer.yaml 파일을 적용합니다.
kubectl create -f loadbalancer.yaml
출력:
service/nginx-service-loadbalancer created
-또는-
LoadBalancer 유형의 배포를 공개합니다.
kubectl expose deployment nginx-deployment --type=LoadBalancer --name=nginx-service-loadbalancer
출력:
service "nginx-service-loadbalancer" exposed
3. nginx-service에 대한 정보를 가져옵니다.
kubectl get service/nginx-service-loadbalancer | awk {'print $1" " $2 " " $4 " " $5'} | column -t
출력:
NAME TYPE EXTERNAL-IP PORT(S) nginx-service-loadbalancer LoadBalancer *****.eu-west-1.elb.amazonaws.com 80:30039/TCP
4. 외부에서 로드 밸런서에 액세스할 수 있는지 확인합니다.
curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title
HTML 제목 태그 사이에 다음과 같은 출력이 표시되어야 합니다. "Welcome to nginx!"
5. LoadBalancer 서비스를 삭제합니다.
kubectl delete service nginx-service-loadbalancer
출력:
service "nginx-service-loadbalancer" deleted
참고: 기본적으로 앞의 LoadBalancer 서비스에서 Classic Load Balancer를 생성합니다.
6. 인스턴스 유형 대상으로 Network Load Balancer를 생성하려면 다음의 주석을 서비스 매니페스트에 추가합니다.
service.beta.kubernetes.io/aws-load-balancer-type: nlb
-또는-
IP 대상을 사용하여 Network Load Balancer를 생성하려면 AWS 로드 밸런서 컨트롤러를 배포한 다음, IP 대상을 사용하는 로드 밸런서를 생성합니다.
관련 콘텐츠
- 질문됨 일 년 전lg...
- 질문됨 일 년 전lg...
- AWS 공식업데이트됨 2년 전
- AWS 공식업데이트됨 3달 전