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

최종 업데이트 날짜: 2020년 10월 30일

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.    배포 파일을 정의하고 적용합니다. 다음 예제에서는 두 개의 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
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

HTML 제목 태그 사이에 다음과 같은 출력이 표시되어야 야 합니다. "Welcome to nginx!"</p


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요합니까?