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

최종 업데이트 날짜: 2021년 4월 21일

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

간략한 설명

클러스터에서 실행 중인 Kubernetes 서비스를 공개하려면 샘플 애플리케이션을 생성합니다. 그런 다음, 샘플 애플리케이션에 ClusterIP, NodePortLoadBalancer 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은 서비스에 대해 자동으로 생성된 NodePortClusterIP입니다. 앞의 명령에 대한 출력은 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 대상을 사용하는 로드 밸런서를 생성합니다.


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


결제 또는 기술 지원이 필요하세요?