ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kubernetes Ingress 설정 방법 (LoadBalancer)
    IT 2021. 1. 12. 22:25
    반응형

    k8s-ingress

    Kubernetes Cluster 구축 후 아마도 가장 먼저 확인하는 부분이 외부와의 접속 테스트일것이다.
    관련 문서를 찾아보면 NodePort, LoadBalance와 MetalLB를 사용한 방법이 있는것을 확인 할 수 있다.

    NodePort를 사용하게 되면 Kubernetes를 구성하는 Worker Node에 동일한 포트가 오픈되며 Client와 Node 사이에 Reverse Proxy를 구성하여 내부 Ingress Controller에 접속 가능하도록 설정 할 수 있다. 하지만 이 구성의 경우 Reverse Proxy와 Worker Node 사이에 포트를 매번 설정하여 오픈하기 어렵고 worker 노드를 선택하여 접속이 필요하므로 좋은 방법이라고 할 순 없다.

    이번 글에서는 ExternalIP를 사용한 서비스를 구성 후 외부 접속을 제공하는 방법을 정리해 보았다.

    Run Simple http server

    busybox container를 이용하여 8080로 접속하여 200과 함께 현재 시간을 표시하는 간단한 컨테이너를 먼저 실행하자.

    cat << EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        run: simple-http-server
      name: simple-http-server
    spec:
      containers:
      - image: busybox
        name: simple-http-server
        command:
        - /bin/sh
        - -c
        - while true; do nc -l -p 8080 -e sh -c 'echo -e "HTTP/1.1 200 OK\n\n$(date)"'; done
        ports:
        - containerPort: 8080
    EOF
    

    Internal Sevice for Simple HTTP Server

    simple http server 접속이 가능하도록 service를 생성하자. service는 2가지 방법으로 생성가능하다. 아래는 그 첫번째인 yaml로 생성하는 방법이다.

    cat << EOF | kubectl apply -f -
    apiVersion: v1
    kind: Service
    metadata:
      name: simple-service
    spec:
      ports:
        - name: http
          port: 8080
          targetPort: 8080
      selector:
        run: simple-http-server
      type: ClusterIP
    EOF

    CLI를 사용하면 좀 더 간편하게 생성가능하다.

    
    $ k expose pod simple-http-server --port=8080 --target-port=8080 --name=simple-service --type=ClusterIP
    service/simple-service exposed
    $ k get service
    NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE
    kube-dns         ClusterIP   172.96.0.10    <none>        53/UDP,53/TCP,9153/TCP   8d
    simple-service   ClusterIP   172.96.17.92   <none>        8080/TCP                 5s
    $
    

    Create nginx ingress controller

    Pod간 통신은 간단한 서비스 생성만으로 접속이 가능하지만 외부에서 들어오는 네트워크 패킷을 컨트롤 하기에는 서비스 만으로는 불가능하다. 만약 외부에서 들어오는 패킷을 HTTP, HTTPS 또는 로드 밸런싱을 하려면 Ingress를 사용해야 한다. Kubernetes에서 Ingress는 여러가지 제공되지만 기본적으로 많이 사용되는 Load Balancer는 Nginx Load Balancer이다.

    ingress-nginx는 github에서 다운로드 가능하며 아래의 명령으로 바로 생성이 가능하다.

    
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.29.0/deploy/static/mandatory.yaml
    

    Create ingress role

    Ingress 생성이 완료되었다면 위에서 언급한 대로 ingress에 대한 규칙을 생성한다. simple-http-server를 외부에서 접속 시도하므로 Pod와 Service에서 설정한 정보를 Ingress 세부 항목으로 적용한다.

    simple-http-service pod에 대한 service 정보를 확인한다.

    $ kubectl get service
    NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE
    kube-dns         ClusterIP   172.96.0.10    <none>        53/UDP,53/TCP,9153/TCP   9d
    simple-service   ClusterIP   172.96.17.92   <none>        8080/TCP                 23h

    위에서 확인한 service 정보를 사용하여 ingress를 설정한다. host는 서비스할 URL을 지정해주면 된다.

    cat << EOF | kubectl apply -f -
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: nginx-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
        kubernetes.io/ingress.class: "nginx"
    spec:
      rules:
      - host: external.k8s.homelab.local
        http:
          paths:
          - path: /simple-service
            backend:
              serviceName: simple-service
              servicePort: 8080
    EOF

    Bind Endpoint IP

    ingress를 설정하면 외부 패킷에 대한 포워딩 규칙만 설정되었을뿐 외부에서 접속을 하려면 설정한 Ingress를 다시 Service로 외부 노출을 해주어야 한다. 외부에 노출하는 방법은 Node Port, External IP 또는 MetalLB 등이 있으며 Node Port와 MetalLB는 정리하기로 한 내용에 해당이 되지 않으므로 External IP에 대한 내용을 좀 더 알아보려고 한다.

    Service 설정 방법은 위와 크게 다르지 않지만 외부에서의 접근이 필요하므로 외부 접근에 대한 설정이 들어가야 한다. 그리고 ExternalIPs는 Worker 서버에 바인딩되어 있는 Public IP를 입력해주어야 한다. 즉 여러대의 Worker 노드로 LB 될 수 있어야 하며 이는 Front에 LB가 필요하다는 뜻이기도 하다.

    cat << EOF | kubectl apply -f -
    apiVersion: v1
    kind: Service
    metadata:
      name: ingress-nginx
      namespace: ingress-nginx
    spec:
      ports:
        - name: service
          port: 80
          targetPort: 80
      selector:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
      externalIPs:
      - 192.168.11.63
    EOF
    반응형

    'IT' 카테고리의 다른 글

    Home Assistant 설치  (0) 2021.01.17
    CKA 인증  (0) 2021.01.13
    CentOS kickstart example  (0) 2021.01.01
    Kubernetes Cluster Version 업그레이드  (0) 2021.01.01
    UEFI를 위한 PXE Boot 서버 구축  (0) 2020.12.05
Designed by Tistory.