# Kong Ingress Controller 배포 ## 1. 배포 방법 ### 1) 배포시 주의 사항 - 배포 전 k8s service의 LoadBalancer를 사용할 수 있는지 확인 필요. - cert-manager가 배포되었는지 확인 필요 ### 2) 배포 방법 ``` sh git clone https://github.com/paasup/dip-catalog.git cd charts/kong helm upgrade kong ./ -f custom-values.yaml --install -n kong --create-namespace ``` ## 2. custom-values.yaml 설명 ### 1) Pod 설정 | Name | 설명 | 기본값 | | ---------------------- | ------------------------------------------------------------ | ------ | | `image.repository` |이미지 설정. 커스텀 플러그인이 설치된 이미지를 사용.|`"paasup/kong-oidc-keycloak-authz"`| | `image.tag` | 이미지 태그 설정 | "3.4.0-0.1.0" | | `deployment.kong.enabled` | Kong의 사용 여부 설정.
'false'로 설정 시 `ingressController.enable=ture`로 설정해야함 | 'true' | | `deployment.daemonset` | 배포되는 kong의 리소스 타입을 설정.
'true' : daemonset, 'false': deployment | "false" | - `proxy` 컨테이너의 TimeZone 설정 ``` yaml deployment: # proxy 컨테이너의 timezone 설정 # pod가 배포될 노드의 localtime 정보를 마운트, 노드의 해당 경로에 파일이 있는지 확인 필요. userDefinedVolumeMounts: - name: tz-config mountPath: /etc/localtime userDefinedVolumes: - name: tz-config hostPath: path: /usr/share/zoneinfo/Asia/Seoul ``` ### 2) Kong 서비스 설정 - `admin`, `manager`의 ingress 설정에 domain 정보 변경이 필요하다. `admin`, `manager`는 같은 도메인을 사용하고 path로 서비스를 구분한다. ``` yaml # Kong proxy 서비스 설정 proxy: enabled: true type: LoadBalancer ingress: enable: false # Kong admin API 서비스 설정 admin: annotations: konghq.com/protocol: https enabled: true type: ClusterIP ingress: enabled: true annotations: konghq.com/https-redirect-status-code: "301" konghq.com/protocols: https konghq.com/strip-path: "true" hostname: kong.example.org # 도메인 변경 필요 ingressClassName: kong path: /api # certificate 설정을 이용해 생성된 tls secret 이름을 설정 tls: kong-kong-admin-cert # Kong Manager(UI) 서비스 설정 manager: enabled: true type: ClusterIP annotations: konghq.com/protocol: https http: enabled: false ingress: enabled: true annotations: konghq.com/https-redirect-status-code: "301" hostname: kong.example.org # 도메인 변경 필요 ingressClassName: kong path: / # certificate 설정을 이용해 생성된 tls secret 이름을 설정 tls: kong-kong-admin-cert ``` ### 3) 인증서 생성 설정 - kong 서비스의 Ingress에서 사용할 인증서를 생성한다. - Cert-manager가 설치되어 있어야 사용 가능하다. 그리고 `ClusterIssuer`도 생성되어 있어야 하고 생성되어 있는 `ClusterIssuer`에 따라 values.yaml 값을 수정해야 한다. - 인증서는 `kong admin`과 `kong manager`에서 사용하고 있고 admin 인증서를 생성하여 같이 사용한다. ``` yaml certificates: enabled: true clusterIssuer: selfsigned-issuer # 배포될 issuer에 따라 설졍 변경 필요. admin: enabled: true commonName: kong.example.org # 도메인 변경 필요 portal: enabled: false proxy: enabled: false cluster: enabled: false ``` ### 4) Kong Configuration 설정 - Kong configuration은 환경변수를 추가하여 설정한다. - 내장 DB 설정에 맞춰 설정해야 한다. 외장 DB를 사용할 경우 설정 변경이 필요하다. ``` yaml env: admin_error_log: /dev/stdout admin_gui_access_log: /dev/stdout admin_gui_error_log: /dev/stdout admin_access_log: /dev/stdout cluster_data_plane_purge_delay: 60 cluster_listen: 0.0.0.0:8005 cluster_telemetry_listen: 0.0.0.0:8006 log_level: info lua_package_path: /opt/?.lua;; nginx_worker_processes: "2" database: postgres pg_database: kong pg_host: kong-postgresql.kong.svc.cluster.local pg_ssl: "off" pg_ssl_verify: "off" pg_user: kong pg_password: password # kong에서 사용할 db 사용자의 패스워드로 변경. plugins: bundled, oidc, keycloak-authz prefix: /kong_prefix/ proxy_access_log: /dev/stdout proxy_error_log: /dev/stdout proxy_stream_access_log: /dev/stdout proxy_stream_error_log: /dev/stdout status_listen: 0.0.0.0:8100 trusted_ips: 0.0.0.0/0,::/0 ``` ### 5) Ingress Controller 설정 ``` yaml ingressController: enabled: true image: repository: kong/kubernetes-ingress-controller tag: "3.3" # kong 3.4 버전을 지원하는 최신 ingress conroller 버전 env: kong_admin_filter_tag: ingress_controller_kong kong_admin_tls_skip_verify: true kong_admin_url: https://localhost:8444 publish_service: kong/kong-kong-proxy # {namespace}/{kong-proxy-service}으로 변경 # ingress-controller 컨테이너의 timezone 설정 customEnv: TZ: "Asia/Seoul" ``` ### 6) 내장 postgresql - 해당 설정에 따라서 `env`에 postgresql 연결정보를 수정해야 한다. ```yaml postgresql: enabled: true auth: database: kong username: kong password: password ``` ### 7) proxy 서비스 #### 7.1) Loadbalancer 사용 - ingress 서비스를 proxy가 사용하는 service의 타입을 LoadBalancer로 배포하여 서비스를 제공한다. ``` yaml proxy: enabled: true type: LoadBalancer ingress: enable: false ``` #### 7.2) host port 사용 - ingress 서비스를 위해 proxy의 80, 443을 worker node의 80, 443과 바인드하여 서비스를 제공한다. ``` yaml proxy: enabled: true type: ClusterIP ingress: enable: false http: hostPort: 80 tls: hostPort: 443 ```