Load Balancer Access Control List 연동

Prev Next

VPC 환경에서 이용 가능합니다.

KVM 기반 Ncloud Kubernetes Service를 이용하는 경우, Load Balancer Access Control List(ACL)을 Kubernetes에서 Custom Resource Definition를 통해 선언적으로 관리할 수 있습니다. 이를 통해 Kubernetes에 배포된 Service와 Ingress에 ACL을 적용하여 Subnet 접근을 제어할 수 있습니다. NCloud Kubernetes Service 1.31 버전부터 사용 가능합니다.

주의
  • ACL 기능을 활용하기 위해서는 ACL이 등록될 Service에서 service.beta.kubernetes.io/ncloud-load-balancer-enable-acl-operator 또는 Ingress에서 alb.ingress.kubernetes.io/enable-acl-operator 설정이 "true"로 지정되어야 합니다. 해당 annotation이 설정되어 있지 않으면 상태 동기화가 정상적으로 이루어지지 않을 수 있습니다.

Ncloud Kubernetes Service와 연동되는 Load Balancer 인스턴스 ACL 적용 예제

ACL을 Ncloud Kubernetes Service와 연동되는 Load Balancer 인스턴스에 적용하기 위해 Load Balancer 타입의 Service 오브젝트를 생성해야 합니다. 아래의 코드를 복사하여 service.yaml 파일로 저장해 주십시오.

apiVersion: v1
kind: Service
metadata:
  name: test-lb
  annotations:
    service.beta.kubernetes.io/ncloud-load-balancer-enable-acl-operator: "true"
spec:
  type: LoadBalancer
  selector:
    app: test-lb
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      name: http
    - protocol: TCP
      port: 443
      targetPort: 443
      name: https
    - protocol: TCP
      port: 8080
      targetPort: 8080
      name: api

아래 명령을 실행해 Service를 배포해 주십시오.

kubectl apply -f service.yaml

Service 오브젝트가 배포되면 Load Balancer가 생성되고 포트가 3개이므로 3개의 리스너가 하위에 등록됩니다. 각 리스너에 바인딩 될 Access Control List를 아래의 코드를 복사하여 acl.yaml 파일로 저장해 주십시오.

apiVersion: loadbalancer.vnks.ncloud.com/v1alpha1
kind: AccessControlList
metadata:
  name: example-acl
spec:
  rules:
    - priority: 1
      action: DENY
      ipBlockCidr: 0.0.0.0/0
      portRange: 1-65535

아래 명령을 실행해 Access Control List를 배포해 주십시오.

kubectl apply -f acl.yaml

해당 Access Control List 오브젝트는 ACL처럼 우선순위, 정책, CIDR, 포트 범위를 가집니다. 오브젝트를 배포하면 우선순위 1, 접근 소스 0.0.0.0/0, 포트 1-65535, 액션 허용으로 설정된 ACL이 생성됩니다. 이때 spec.rules[].action값에는 "DENY" 또는 "ALLOW"를 사용할 수 있습니다. 오브젝트가 올바르게 배포된 경우, 아래의 명령어를 통해 오브젝트와 연결된 ACL을 확인하십시오.

kubectl get acl example-acl -o jsonpath='{.status}'

Access Control List 오브젝트에 대한 전체 스펙을 확인하려면 다음 명령을 이용하십시오.

kubectl get crds accesscontrollists.loadbalancer.vnks.ncloud.com -o yaml

다음으로 생성한 ACL을 Access Control List Binding 오브젝트를 배포하여 Load Balancer 타입을 갖는 Service 오브젝트와 연결할 수 있습니다. ACL 연결을 위해 다음 코드를 복사하여 aclbinding.yaml 파일로 저장해 주십시오.

apiVersion: loadbalancer.vnks.ncloud.com/v1alpha1
kind: AccessControlListBinding
metadata:
  name: example-aclb
spec:
  loadBalancerRef:
    serviceRef: test-lb
  bindingMap:
    - accessControlListName: example-acl
      port: 80
      protocol: TCP
    - accessControlListName: example-acl
      port: 443
      protocol: TCP
    - accessControlListName: example-acl
      port: 8080
      protocol: TCP

아래 명령을 실행해 Access Control List Binding을 배포해 주십시오.

kubectl apply -f aclbinding.yaml

위의 오브젝트는 Service 오브젝트에서 생성된 Load Balancer 인스턴스의 리스너에 어떤 Access Control List 오브젝트를 연결할지 정의합니다. 예시는 Load Balancer 인스턴스의 80, 443, 8080 TCP 포트에 모든 접속을 차단하는 ACL을 부여하여 통신이 불가능하도록 구성합니다. 현재 spec.loadBalancerRef로 사용 가능한 값은 serviceRef: <service-name>ingressRef: <ingress-name>입니다. 이때 Access Control List Binding 오브젝트와 지정할 Service, Ingress 오브젝트는 같은 네임스페이스에 존재해야 합니다.

아래의 명령어를 통해 Load Balancer 리스너와 연결된 ACL의 상태를 확인하십시오.

kubectl get aclb example-aclb -o jsonpath='{.status}'

Access Control List Binding 오브젝트에 대한 전체 스펙을 확인하려면 다음 명령을 이용하십시오.

kubectl get crds accesscontrollistbindings.loadbalancer.vnks.ncloud.com -o yaml