파란하늘의 지식창고
article thumbnail
Published 2022. 12. 28. 17:39
kubernetes ingress 사용해보기 Study/CI&CD
반응형

Ingress 소개

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

Ingress는 kubernetes cluster 내의 서비스에 대한 외부 접근을 관리하는 API Object이고 일반적으로 http를 관리한다.

로컬에 kubernetes를 설치하고 점점 pod가 늘어나기 시작하면서 port를 분배하여 사용하는 서비스를 호출하는 게 점점 버거워지기 시작했다.
localhost:30000은 어떤 서비스인지 localhost:30120은 어떤 서비스인지 일일이 기억하기 힘들어서 매번 매칭하는 표를 찾아서 찾아갔다.
이럴 때 jenkins.bluesky.local, nexus.bluesky.local 같이 도메인 주소를 사용하면 서비스별로 기억하기 쉽다.

kubernetes ingress를 사용하면 설정한 도메인으로 접근할 수 있기 때문에 port 번호를 일일이 찾을 필요가 없다.

Ingress 설정

IngressController 설정하기

Ingress를 사용하기 위해서는 IngressController가 먼저 설정되어 있어야 한다.

https://kubernetes.io/ko/docs/concepts/services-networking/ingress-controllers/

IngressController의 경우 AWS, GCE. nginx를 지원하고 그에 대한 다양한 써드파티가 있다.
그중 하나 또는 여러 개를 설정하고 사용할 수도 있다.

nginx의 경우 아래에서 추가할 수 있다.

https://github.com/kubernetes/ingress-nginx

tag에서 controller를 검색하고 선택한다.

이 글을 작성한 시점엔 1.5.1이 가장 최신 버전이다.

해당 버전의 tag를 선택하고 deploy/static/provider/cloud/deploy.yaml을 찾는다.

해당 파일을 적용하면 된다.

C:\Users\bluesky>kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/cloud/deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx unchanged
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx unchanged
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx unchanged
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission configured

Ingress 설정하기

개인적으로 사용한 Ingress 설정은 다음과 같다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: bluesky-default-ingress
  namespace: default
spec:
  ingressClassName: nginx
  rules:
  - host: jenkins.bluesky.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: jenkins-service
            port:
              number: 8080
  - host: nexus.bluesky.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nexus-service
            port:
              number: 8082
  - host: minio.bluesky.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: minio-service
            port:
              number: 9090
  - host: eureka.cloud.bluesky.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: bluesky-cloud-netflix-eureka-server-service
            port:
              number: 30100
  - host: config.cloud.bluesky.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: bluesky-cloud-config-server-service
            port:
              number: 30101
  - host: admin.cloud.bluesky.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: bluesky-cloud-admin-server-service
            port:
              number: 30102
  - host: swagger.web.bluesky.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: bluesky-web-swagger-ui-service
            port:
              number: 30120
  - host: bookkeeping.api.bluesky.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: bluesky-api-bookkeeping-service
            port:
              number: 30130
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: bluesky-spinnaker-ingress
  namespace: spinnaker
spec:
  ingressClassName: nginx
  rules:
  - host: spinnaker.bluesky.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: spin-deck
            port:
              number: 9000
  - host: spinnaker.gate.bluesky.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: spin-gate
            port:
              number: 8084

해당 설정을 host파일에 다음과 같이 추가하였다.

127.0.0.1	jenkins.bluesky.local
127.0.0.1	nexus.bluesky.local
127.0.0.1	minio.bluesky.local
127.0.0.1	eureka.cloud.bluesky.local
127.0.0.1	config.cloud.bluesky.local
127.0.0.1	admin.cloud.bluesky.local
127.0.0.1	swagger.web.bluesky.local
127.0.0.1	bookkeeping.api.bluesky.local
127.0.0.1	spinnaker.bluesky.local
127.0.0.1	spinnaker.gate.bluesky.local

이제 port 번호를 찾는 번거로움 없이 바로 브라우저에서 http://xxx.bluesky.local과 같이 입력하여 호출하면 된다. 

또한 각각의 pod에 대해 노출할 port를 따로 각각의 service로 설정하지 않아도 된다.


위에서는 IngressController를 설치하고 Ingress를 설정할 때 대상 IngressClass를 "ingressClassName"으로 지정하였다.
만약 IngressClass 중에 metatdata.annotations에 ingressclass.kubernetes.io/is-default-class: "true"가 설정되어 있는 경우 기본 Ingress로 지정된 것으로 Ingress에서 "ingressClassName" 설정을 생략하는 경우 기본 IngressClass를 사용하게 된다

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  labels:
    app.kubernetes.io/component: controller
  name: nginx-example
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: k8s.io/ingress-nginx

Rancher Desktop의 경우 IngressClassName을 지정하면 동작하지 않았고 해당 설정을 제거하면 기본 IngressClass를 찾는 것인지 동작하였다.
(kubectl get IngressClass로는 보이지 않았다.)
이 부분은 왜 그런 건지 원인을 찾지는 못했다.

 

반응형
profile

파란하늘의 지식창고

@Bluesky_

내용이 유익했다면 광고 배너를 클릭 해주세요