
# 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의 사용 여부 설정. <br />'false'로 설정 시 `ingressController.enable=ture`로 설정해야함 | 'true' |
| `deployment.daemonset` | 배포되는 kong의 리소스 타입을 설정.<br />'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
```