Kong 시리즈 - 15 - 맞춤형 플러그인 for Kong Ingress Controller

Kong for Kubernetes에서 사용자 정의 플러그인을 로드하는 방법을 보여 줍니다.
먼저 사용자 정의 플러그인에 대한 Lua 코드를 준비합니다.
mkdir myheader
cd myheader

vi handler.lua
local MyHeader = {}

MyHeader.PRIORITY = 1000

function MyHeader:header_filter(conf)
  -- do custom logic here
  kong.response.set_header("myheader", conf.header_value)
end

return MyHeader

vi schema.lua
return {
  name = "myheader",
  fields = {
    { config = {
        type = "record",
        fields = {
          { header_value = { type = "string", default = "twingao", }, },
        },
    }, },
  }
}

tree myheader/
myheader/
├── handler.lua
└── schema.lua

Configmap 또는 Secret을 만들고 사용자 정의 플러그인 myheader를 Kubernetes에 로드합니다.
kubectl create configmap kong-plugin-myheader --from-file=myheader -n kong

  

kubectl create secret generic kong-plugin-myheader --from-file=myheader

kubectl get cm
NAME                                        DATA   AGE
kong-plugin-myheader                        2      25s

kubectl get secret
NAME                                                 TYPE                                  DATA   AGE
kong-plugin-myheader                                 Opaque                                2      29s

Kong 시리즈-04-Helm에 따라 Kong 1.3.0 with PostgreSQL and with Ingress Controller가 helm에 설치된 Kong을 설치한 경우, 사용자 정의 플러그인을 Kong에 불러오려면 helm의values를 수정해야 합니다.yaml 파일의 설정입니다. 그러나 응용 프로그램의 일부 설정을 업그레이드하는 방법을 알지 못하여gateway 응용 프로그램을 마운트 해제하고 자동으로 생성된 pvc를 삭제할 수 있습니다.
helm uninstall gateway

kubectl delete pvc data-gateway-postgresql-0

kong을 직접 다운로드하고values를 수정합니다.yaml 파일 설정.Kong을 재배치합니다.사용자 정의 플러그 인이 자동으로 로드됩니다.
helm pull stable/kong --version 0.26.1 --untar

vi kong/values.yaml
#         
plugins:
  configMaps:
  - name: kong-plugin-myheader
    pluginName: myheader

  

plugins:
  secrets:
  - name: kong-plugin-myheader
    pluginName: myheader

helm install gateway kong \
    --set admin.useTLS=false \
    --set admin.nodePort=32444 \
    --set proxy.http.nodePort=32080 \
    --set proxy.tls.nodePort=32443 \
    --set replicaCount=2 \
    --set ingressController.enabled=true \
    --set plugins.configMaps.name=kong-plugin-myheader \
    --set plugins.configMaps.pluginName=myheader
    --set postgresql.persistence.storageClass="nfs-client" \
    --set postgresql.persistence.size=1Gi

설정을 보면 사용자 정의 플러그인을 불러온 것을 알 수 있습니다.
curl http://192.168.1.55:32444 -s | python -m json.tool
{
......
        "loaded_plugins": {
            "acl": true,
            "aws-lambda": true,
            "azure-functions": true,
            "basic-auth": true,
            "bot-detection": true,
            "correlation-id": true,
            "cors": true,
            "datadog": true,
            "file-log": true,
            "hmac-auth": true,
            "http-log": true,
            "ip-restriction": true,
            "jwt": true,
            "key-auth": true,
            "kubernetes-sidecar-injector": true,
            "ldap-auth": true,
            "loggly": true,

            "myheader": true,   #    

            "oauth2": true,
            "post-function": true,
            "pre-function": true,
            "prometheus": true,
            "proxy-cache": true,
            "rate-limiting": true,
            "request-size-limiting": true,
            "request-termination": true,
            "request-transformer": true,
            "response-ratelimiting": true,
            "response-transformer": true,
            "session": true,
            "statsd": true,
            "syslog": true,
            "tcp-log": true,
            "udp-log": true,
            "zipkin": true
        },
......
}

효과를 시험해 보다.
vi myheader-plugin.yaml
apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
  name: myheader-plugin
plugin: myheader

vi echo-server-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: echo
  name: echo
spec:
  ports:
  - port: 8080
    name: high
    protocol: TCP
    targetPort: 8080
  selector:
    app: echo
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: echo
  name: echo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: echo
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: echo
    spec:
      containers:
      - image: e2eteam/echoserver:2.2
        name: echo
        ports:
        - containerPort: 8080
        env:
          - name: NODE_NAME
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
          - name: POD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
        resources: {}

vi echo-server-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: echo-server-ingress
  annotations:
    plugins.konghq.com: myheader-plugin
spec:
  rules:
  - http:
      paths:
      - path: /bar
        backend:
          serviceName: echo
          servicePort: 80

kubectl apply -f myheader-plugin.yaml
kubectl apply -f echo-server-service.yaml
kubectl apply -f echo-server-ingress.yaml

curl -I http://192.168.1.55:32080/bar
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Connection: keep-alive
Date: Thu, 26 Dec 2019 10:05:24 GMT
Server: echoserver
myheader: twingao       #   header
X-Kong-Upstream-Latency: 2
X-Kong-Proxy-Latency: 8
Via: kong/1.3.0

좋은 웹페이지 즐겨찾기