YJWANG

kubernetes ingress 구축 (bare-metal / nodeport) 본문

60.Cloud/80.Kubernetes

kubernetes ingress 구축 (bare-metal / nodeport)

왕영주 2020. 11. 26. 16:57

test1 test1 htttpd 리소스들을 ingress로 묶을 예정이다.

계획은 <IP or Domain>:port/test1 로 접속하면 test1로 분기 <IP or Domain>:port/test2 로 접속하면 test2로 분기이다.
bare-metal 환경이기에 ingress controller 서비스로 80 direct 접근은 불가능 하여 nodeport를 사용해야한다.

아래 내용을 참고하면 잘 이해할 수 있다.
https://kubernetes.github.io/ingress-nginx/deploy/baremetal/

구성하려는 구성도는 kubernetes 홈페이지에 너무 잘 나와있다.

refer to : https://kubernetes.io/docs/concepts/services-networking/ingress/

(rewrite 참고) : https://kubernetes.github.io/ingress-nginx/examples/rewrite/

direct로 80으로 분기하기 위해 external IP를 붙이는 법과 metallb를 이용하는 법이 있는데 이는 다른 포스팅에서 다룰 예정이다.


분기될 서비스들

cluster ip 로 http 접속 시 아래와 같이 나타난다.

  [root@master1 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.233.0.1      <none>        443/TCP    24h
test1        ClusterIP   10.233.43.104   <none>        8080/TCP   6m30s
test2        ClusterIP   10.233.6.184    <none>        8080/TCP   6m16s

[root@master1 ~]# curl 10.233.43.104:8080 #test1
test1

[root@master1 ~]# curl 10.233.6.184:8080 #test2
test2

자세히 들여다보면 아래와 같이 8080을 타고 pod들의 80으로 분기된다.

  [root@master1 ~]# kubectl describe svc test1
Name:              test1
Namespace:         default
Labels:            app=test1-dep
Annotations:       <none>
Selector:          app=test1-dep
Type:              ClusterIP
IP:                10.233.43.104
Port:              <unset>  8080/TCP
TargetPort:        80/TCP
Endpoints:         10.233.103.18:80,10.233.110.6:80
Session Affinity:  None
Events:            <none>

Ingress controller 설치

Ingress controller를 설치해야 한다. 정확히 말하면 Ingress를 구현할 controller 서비스를 실행시켜야 한다.
여기서는 nginx ingress를 사용할 예정이다.

refer to : https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal

아래와 같이 controller pod가 실행되면 설치는 끝이다.

[root@wyj05_deploy_0 ingress]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/baremetal/deploy.yaml

[root@wyj05_deploy_0 ingress]# kubectl get pods -n ingress-nginx \
  -l app.kubernetes.io/name=ingress-nginx --watch
  ...
  ingress-nginx-controller-5dbd9649d4-w8npw   1/1     Running             0          22s

Ingress 설정

이제 Ingress를 설정해보자
refer to : https://kubernetes.io/docs/concepts/services-networking/ingress/

[root@wyj05_deploy_0 ingress]# cat test_ingress.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /test1
        pathType: Prefix
        backend:
          service:
            name: test1
            port:
              number: 8080
      - path: /test2
        pathType: Prefix
        backend:
          service:
            name: test2
            port:
              number: 8080

위 manifest yaml 파일을 통해 apply 한다

[root@wyj05_deploy_0 ingress]# kubectl apply -f test_ingress.yaml 
ingress.networking.k8s.io/test-ingress created

Ingress 학인
아래와 같이 ADDRESS가 지정되면 구축은 끝이다. 이후 deployment를 수정하여 replicas를 수정하는 것도 가능하다.

[root@wyj05_deploy_0 ingress]# kubectl get ingress
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
NAME           CLASS    HOSTS   ADDRESS       PORTS   AGE
test-ingress   <none>   *       10.95.90.20   80      72s

위에서 말했다시피 bare-metal Ingress는 기본적으로 nodeport를 통해 접근해야 하기에 nodeport를 확인해준다.

[root@wyj05_deploy_0 ingress]# kubectl get service -n ingress-nginx 
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.233.46.81    <none>        80:31904/TCP,443:32128/TCP   5m37s
...

31904 임을 확인했으니 접속 테스트를 진행한다. 물론 이 포트도 당연히 수정 가능하다.
예) 이런식으로 수정 가능

[root@wyj05_deploy_0 ingress]# kubectl edit svc ingress-nginx-controller -n ingress-nginx 

테스트 진행
위에서 계획한 대로 test1 시 test1로 잘 분기가 됨을 알 수 있다.

[root@wyj05_deploy_0 ingress]# curl 10.95.90.20:31904 #default
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
[root@wyj05_deploy_0 ingress]# curl 10.95.90.20:31904/test1 #test1
test1
[root@wyj05_deploy_0 ingress]# curl 10.95.90.20:31904/test2 #test2
test2
반응형