Amazon EKS 클러스터에서 실행 중인 Kubernetes 서비스를 공개하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 5월 15일

Amazon EKS(Amazon Elastic Kubernetes Service) 클러스터에서 실행 중인 Kubernetes 서비스를 공개하려고 합니다.

간략한 설명

다음 해결 방법에서는 샘플 애플리케이션을 생성한 다음, ClusterIP, NodePortLoadBalancer와 같은 Kubernetes ServiceTypes를 샘플 애플리케이션에 적용하는 방법을 보여줍니다.

다음 사항에 유의하십시오.

  • ClusterIP는 클러스터 내부 IP 주소에 서비스를 공개합니다.
  • NodePort는 정적 포트에서 각 노드의 IP 주소에 서비스를 공개합니다.
  • LoadBalancer는 로드 밸런서를 사용하여 서비스를 외부에 공개합니다.

참고: Amazon EKS는 LoadBalancer를 통해 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스 작업자 노드에서 실행되는 포드에 대해 Network Load Balancer와 Classic Load Balancer를 지원합니다. Amazon EKS는 AWS Fargate에서 실행되는 포드에 대해 Network Load Balancer 및 Classic Load Balancer를 지원하지 않습니다. Fargate 수신의 경우 Amazon EKS에서 Kubernetes용 AWS ALB(Application Load Balancer) 수신 컨트롤러(최소 버전 1.1.4)를 사용하는 것이 모범 사례입니다.

​해결 방법

샘플 애플리케이션 생성

1.    샘플 php-apache 배포를 생성하려면 다음 명령을 실행합니다.

kubectl run nginx  --replicas=2 --labels='app=nginx' --image=nginx --port=80

2.    포드가 실행 중이고 자체 내부 IP 주소가 있는지 확인하려면 다음 명령을 실행합니다.

kubectl get pods -l 'app=nginx' -o wide | awk {'print $1" " $3 " " $6'} | column -t

이 출력은 다음과 유사합니다.

NAME                   STATUS   IP
nginx-ab1cdef23-45ghi  Running  10.1.3.202
nginx-ab1cdef23-45ghi  Running  10.1.3.150

ClusterIP 서비스 생성

1.    clusterip.yaml이라는 파일을 생성한 다음 유형ClusterIP로 설정합니다. 다음 예제를 참조하십시오.

cat <<EOF > clusterip.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
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 created

-또는-

ClusterIP 유형의 배포를 공개하려면 다음 명령형 명령을 실행합니다.

kubectl expose deployment nginx  --type=ClusterIP  --name=nginx-service

다음과 같은 출력이 표시됩니다.

service "nginx-service" exposed

참고: 공개된 명령은 YAML 파일을 생성하지 않고 서비스를 생성합니다. 그러나 kubectl은 명령형 명령을 선언적 Kubernetes 배포 객체로 변환합니다.

3.    애플리케이션에 액세스하여 ClusterIP 번호를 가져오려면 다음 명령을 실행합니다.

kubectl get service nginx-service

다음과 같은 출력이 표시됩니다.

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginx-service   ClusterIP   172.20.65.130   <none>        80/TCP    15s

NodePort 서비스 생성

1.    NodePort 서비스를 생성하려면 nodeport.yaml이라는 파일을 생성한 다음 유형NodePort로 설정합니다. 다음 예제를 참조하십시오.

cat <<EOF > nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
EOF

2.    ClusterIP 서비스를 삭제하고 동일한 서비스 이름(nginx-service)으로 NodePort 서비스를 생성하려면 다음 명령을 실행합니다.

kubectl delete service nginx-service

다음과 같은 출력이 표시됩니다.

service "nginx-service" deleted

3.    선언적 또는 명령적 명령을 사용하여 Kubernetes에서 NodePort 객체를 생성합니다.

객체를 생성하고 nodeport.yaml 파일을 적용하려면 다음 선언적 명령을 실행합니다.

kubectl create -f nodeport.yaml

-또는-

NodePort 유형의 배포를 공개하려면 다음 명령형 명령을 실행합니다.

kubectl expose deployment nginx  --type=NodePort  --name=nginx-serviceservice "nginx-service" exposed

다음과 같은 출력이 표시됩니다.

service/nginx-service created

4.    nginx-service에 대한 정보를 가져오려면 다음 명령을 실행합니다.

kubectl get service/nginx-service

다음과 같은 출력이 표시됩니다.

NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx-service   NodePort   172.20.36.247   <none>        80:30648/TCP   11s

참고: ServiceTypeNodePort입니다. ClusterIP는 자동으로 생성되며 NodePort에서 경로를 가져옵니다. NodePort 서비스는 포트 30648에서 사용 가능한 작업자 노드에서 외부로 공개됩니다.

5.    노드의 퍼블릭 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

중요: 외부 클러스터에서 NodeIP: NodePort에 액세스하기 전에 노드의 보안 그룹을 활성화하여 포트 30648을 통한 수신 트래픽을 허용해야 합니다.

LoadBalancer 서비스 생성

1.    LoadBalancer 서비스를 생성하려면 loadbalancer.yaml이라는 파일을 생성한 다음 유형LoadBalancer로 설정합니다. 다음 예제를 참조하십시오.

cat <<EOF > loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
EOF

2.    ClusterIP 서비스를 삭제하고 동일한 서비스 이름(nginx-service)으로 LoadBalancer 서비스를 생성하려면 다음 명령을 실행합니다.

kubectl delete service nginx-service

다음과 같은 출력이 표시됩니다.

service "nginx-service" deleted

3.    loadbalancer.yaml 파일을 적용하려면 다음 명령을 실행합니다.

kubectl create -f loadbalancer.yaml

다음과 같은 출력이 표시됩니다.

service/nginx-service created

-또는-

LoadBalancer 유형의 배포를 공개하려면 다음 명령형 명령을 실행합니다.

kubectl expose deployment nginx  --type=LoadBalancer  --name=nginx-service

다음과 같은 출력이 표시됩니다.

service "nginx-service" exposed

4.    nginx-service에 대한 정보를 가져오려면 다음 명령을 실행합니다.

kubectl get service/nginx-service |  awk {'print $1" " $2 " " $4 " " $5'} | column -t

다음과 같은 출력이 표시됩니다.

NAME           TYPE          EXTERNAL-IP                        PORT(S)
nginx-service  LoadBalancer  *****.eu-west-1.elb.amazonaws.com  80:30039/TCP

5.    외부에서 로드 밸런서에 액세스할 수 있는지 확인하려면 다음 명령을 실행합니다.

curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title

다음과 같은 출력이 표시됩니다. <title> Welcome to nginx! </title >


이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?