[Kong 與 Konga 與 Postgres資料庫] 之 Kuberneres 部署
阿新 • • 發佈:2020-08-14
# 1、Kong的概述
Kong是一個clould-native、快速的、可擴充套件的、分散式的微服務抽象層(也稱為API閘道器、API中介軟體或在某些情況下稱為服務網格)框架。Kong作為開源專案在2015年推出,它的核心價值是高效能和可擴充套件性。Kong被廣泛用於從初創企業到全球5000家公司以及政府組織的生產環境中。
如果構建Web、移動或IoT(物聯網)應用,可能最終需要使用通用的功能來實現這些應用。Kong充當微服務請求的閘道器(或側車),通過外掛能夠提供**負載平衡**、**日誌記錄、身份驗證、速率限制、轉換**等能力。
[![img](https://user-gold-cdn.xitu.io/2018/12/12/167a2a6e88aed7bb?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)](https://konghq.com/)
# 2、功能特性
- 雲本土化(**Cloud-Native**):Kong可以在Kubernetes或物理環境上執行;
- 動態**負載平衡**(**Dynamic Load Balancing**):跨多個上游服務的負載平衡業務。
- 基於雜湊的負載平衡(**Hash-based Load Balancing**):一致的雜湊/粘性會話的負載平衡。
- 斷路器(**Circuit-Breaker**):智慧跟蹤不健康的上游服務。
- 健康檢查(**Health Checks**):主動和被動監控您的上游服務。
- **服務發現**(**Service Discovery**):解決如Consul等第三方DNS解析器的SRV記錄。
- 無伺服器(**Serverless**):從Kong中直接呼叫和保證AWS或OpenWhisk函式安全。
- **WebSockets**:通過**WebSockets**與上游服務進行通訊。
- OAuth2.0:輕鬆的向API中新增OAuth2.0認證。
- **日誌記錄**(**Logging**):通過HTTP、TCP、UDP記錄請求或者相應的日誌,儲存在磁碟中。
- **安全**(**Security**):ACL,Bot檢測,IPs白名單/黑名單等。
- 系統日誌(**Syslog**):記錄資訊到系統日誌。
- SSL:為基礎服務或API設定特定的SSL證書。
- **監視**(**Monitoring)**:能夠實時對關鍵負載和效能指標進行監控。
- 轉發代理(**Forward Proxy**):使埠連線到中間透明的HTTP代理。
- **認證**(**Authentications**):支援HMAC,JWT和BASIC方式進行認證等等。
- **速率限制**(**Rate-limiting**):基於多個變數的阻塞和節流請求。
- 轉換(**Transformations**):新增、刪除或操作HTTP請求和響應。
- **快取**(**Caching**):在代理層進行快取和服務響應。
- 命令列工具(CLI):能夠通過命令列控制Kong的叢集。
- REST API:可以通過REST API靈活的操作Kong。
- GEO複製:在不同的區域,配置總是最新的。
- **故障檢測與恢**復(**Failure Detection & Recovery**):如果Cassandra節點失效,Kong並不會受影響。
- 群集(**Clustering**):所有的Kong節點會自動加入群集,並更新各個節點上的配置。
- 可擴充套件性(**Scalability**):通過新增節點,實現水平縮放。
- 效能(**Performance**):通過縮放和使用Nigix,Kong能夠輕鬆處理負載。
- 外掛(**Plugins**):基於外掛的可擴充套件體系結構,能夠方便的向Kong和API新增功能。
# 3、Kong依賴的技術
Kong部署在Nginx和Apache Cassandra或PostgreSQL等可靠技術之上,並提供了易於使用的RESTful API來操作和配置系統。下面是Kong的技術邏輯圖。基於這些技術,Kong提供相關的特性支援:
- Nginx
- 經過驗證的高效能基礎;
- HTTP和反向代理伺服器;
- 處理低層級的操作。
- OpenRestry
- 支援Lua指令碼;
- 攔截請求/響應生命週期;
- 基於Nginx進行擴充套件。
- Clustering&Datastore
- 支援Cassandra或PostgreSQL資料庫;
- 記憶體級的快取;
- 支援水平擴充套件。
- Plugins
- 使用Lua建立外掛;
- 功能強大的定製能力;
- 與第三方服務實現整合。
- Restful Administration API
- 通過Restful API管理Kong;
- 支援CI/CD&DevOps;
- 基於外掛的可擴充套件。
![img](https://www.kubernetes.org.cn/img/2018/12/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20181213063707.png)
# 實踐Kong for Kubernetes
Kong之前都是使用Admin API來進行管理的,Kong主要暴露兩個埠管理埠8001和代理埠8000,管理Kong主要的是為上游服務配置Service、Routes、Plugins、Consumer等實體資源,Kong按照這些配置規則進行對上游服務的請求進行路由分發和控制。在Kubernetes叢集環境下,Admin API方式不是很適應Kubernetes宣告式管理方式。所以Kong在Kubernetes叢集環境下推出Kong Ingress Controller。Kong Ingress Controller定義了四個CRDs(CustomResourceDefinitions),基本上涵蓋了原Admin API的各個方面。
- kongconsumers:Kong的使用者,給不同的API使用者提供不同的消費者身份。
- kongcredentials:Kong使用者的認證憑證。
- kongingresses:定義代理行為規則,是對Ingress的補充配置。
- kongplugins:外掛的配置。
```
Kong建立的CRDs:
[root@localhost konga]# kubectl get crds
NAME CREATED AT
kongclusterplugins.configuration.konghq.com 2020-08-12T13:16:56Z
kongconsumers.configuration.konghq.com 2020-08-12T13:16:56Z
kongcredentials.configuration.konghq.com 2020-08-12T13:16:56Z
kongingresses.configuration.konghq.com 2020-08-12T13:16:56Z
kongplugins.configuration.konghq.com 2020-08-12T13:16:56Z
```
## 先決條件
- **Kubernetes叢集**:您可以使用[Minikube](https://kubernetes.io/docs/setup/minikube/)或[GKE](https://cloud.google.com/kubernetes-engine/)叢集。Kong與Kubernetes的所有發行版相容。
- **kubectl訪問許可權**:您應該已經`kubectl`安裝並配置為與Kubernetes叢集通訊。
## 為Kubernetes安裝Kong
使用以下安裝方法之一安裝Kong for Kubernetes:
- [YAML清單](https://docs.konghq.com/2.1.x/kong-for-kubernetes/install/#yaml-manifests)
- [helm](https://docs.konghq.com/2.1.x/kong-for-kubernetes/install/#helm-chart)
- [Kustomize](https://docs.konghq.com/2.1.x/kong-for-kubernetes/install/#kustomize)
### YAML清單
要通過部署Kong `kubectl`,請使用:
```
kubectl apply -f https://bit.ly/kong-ingress-dbless
```
> 重要!這不是生產級部署。根據您的用例調整“引數”:
>
> - 副本:確保您正在執行Kong的多個例項,以防止由於單個節點故障而造成的中斷。
> - 效能優化:調整Kong的記憶體設定,並根據使用情況定製部署。
> - 負載均衡器:確保在Kong前面執行基於4層或TCP的均衡器。這使Kong可以提供TLS證書並與證書管理器整合。
### helm部署
Kong有一個官方的Helm Chart。要將Kong部署到帶有Helm的Kubernetes叢集上,請使用:
```
$ helm repo add kong https://charts.konghq.com
$ helm repo update
# Helm 2
$ helm install kong/kong
# Helm 3
$ helm install kong/kong --generate-name --set ingressController.installCRDs=false
```
### Kustomize
可以使用Kubernetes的[kustomize](https://kustomize.io/)宣告性地修補Kong的[Kubernetes清單](https://kustomize.io/)。遠端定製構建的一個示例是:
```
kustomize build github.com/kong/kubernetes-ingress-controller/deploy/manifests/base
```
在Kong的[儲存庫](https://github.com/Kong/kubernetes-ingress-controller/tree/master/deploy/manifests)中可以使用Kustomization 進行不同型別的部署。
## 使用託管的Kubernetes雲產品
如果您正在使用雲提供商將Kong安裝在託管的Kubernetes產品上,例如Google Kubernetes Engine(GKE),Amazon EKS(EKS),Azure Kubernetes Service(AKS)等,請確保已設定Kubernetes群集在雲提供程式上,並已`kubectl`在您的工作站上進行了配置。
一旦您配置了Kubernetes叢集並配置了kubectl,任何雲提供商的安裝都將使用上述方法之一([YAML manifests](https://docs.konghq.com/2.1.x/kong-for-kubernetes/install/#yaml-manifests),[Helm Chart](https://docs.konghq.com/2.1.x/kong-for-kubernetes/install/#helm-chart)或[Kustomize](https://docs.konghq.com/2.1.x/kong-for-kubernetes/install/#kustomize))來安裝Kong。
每個雲提供商在允許如何配置特定資源(例如負載均衡器,儲存卷等)方面都有一些細微的不同。我們建議您參考其文件來調整這些設定。
## 關於Kong的資料庫使用
如果您使用的是資料庫,我們建議您在Kubernetes內部以記憶體模式(也稱為無DB)執行Kong,因為所有配置都儲存在Kubernetes控制面板中。此設定簡化了Kong的操作,因此無需擔心資料庫的設定,備份,可用性,安全性等。如果您決定使用資料庫,建議您在Kubernetes之外執行資料庫。您可以從雲提供商使用Amazon RDS之類的服務或類似的託管Postgres服務來自動執行資料庫操作。
我們不建議在Kubernetes部署中將Kong與Cassandra一起使用,因為Kong的Cassandra使用所涵蓋的功能是通過Kubernetes中的其他方式處理的。
## 當前採用yaml清單方式實踐
### 下載官方yaml 檔案
通過瀏覽器開啟官方下載地址https://bit.ly/kong-ingress-dbless,下載對應的yaml檔案
```js
wget https://raw.githubusercontent.com/Kong/kubernetes-ingress-controller/master/deploy/single/all-in-one-dbless.yaml
```
### 修改yaml檔案
當前我們deployment配置的kong 最新版本預設沒有用資料庫,前面[關於kong的資料庫使用]章節,我們已經說明。
當前kong:2.1,kong-ingress-controller:0.9.1版本,為適應當前環境,我們修改瞭如下的配置,漏掉的位置會在yaml 檔案中進行標識
1. 修改service配置為NodePort,預設是LoadBalancer
2. 預設只開通了8444介面,對與接入不方便,修改成新增8001埠,KONG_ADMIN_LISTEN :value: 0.0.0.0:8001, 0.0.0.0:8444 ssl 引數
3. 對應的service 裡面也增加的8001埠進行對我對映
整體配置檔案如下:
```js
[root@localhost kong-gateway]# cat kong-all-in-one-dbless.yaml
apiVersion: v1
kind: Namespace
metadata:
name: kong
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: kongclusterplugins.configuration.konghq.com
spec:
additionalPrinterColumns:
- JSONPath: .plugin
description: Name of the plugin
name: Plugin-Type
type: string
- JSONPath: .metadata.creationTimestamp
description: Age
name: Age
type: date
- JSONPath: .disabled
description: Indicates if the plugin is disabled
name: Disabled
priority: 1
type: boolean
- JSONPath: .config
description: Configuration of the plugin
name: Config
priority: 1
type: string
group: configuration.konghq.com
names:
kind: KongClusterPlugin
plural: kongclusterplugins
shortNames:
- kcp
scope: Cluster
validation:
openAPIV3Schema:
properties:
config:
type: object
configFrom:
properties:
secretKeyRef:
properties:
key:
type: string
name:
type: string
namespace:
type: string
required:
- name
- namespace
- key
type: object
type: object
disabled:
type: boolean
plugin:
type: string
protocols:
items:
enum:
- http
- https
- grpc
- grpcs
- tcp
- tls
type: string
type: array
run_on:
enum:
- first
- second
- all
type: string
required:
- plugin
version: v1
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: kongconsumers.configuration.konghq.com
spec:
additionalPrinterColumns:
- JSONPath: .username
description: Username of a Kong Consumer
name: Username
type: string
- JSONPath: .metadata.creationTimestamp
description: Age
name: Age
type: date
group: configuration.konghq.com
names:
kind: KongConsumer
plural: kongconsumers
shortNames:
- kc
scope: Namespaced
validation:
openAPIV3Schema:
properties:
credentials:
items:
type: string
type: array
custom_id:
type: string
username:
type: string
version: v1
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: kongcredentials.configuration.konghq.com
spec:
additionalPrinterColumns:
- JSONPath: .type
description: Type of credential
name: Credential-type
type: string
- JSONPath: .metadata.creationTimestamp
description: Age
name: Age
type: date
- JSONPath: .consumerRef
description: Owner of the credential
name: Consumer-Ref
type: string
group: configuration.konghq.com
names:
kind: KongCredential
plural: kongcredentials
scope: Namespaced
validation:
openAPIV3Schema:
properties:
consumerRef:
type: string
type:
type: string
required:
- consumerRef
- type
version: v1
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: kongingresses.configuration.konghq.com
spec:
group: configuration.konghq.com
names:
kind: KongIngress
plural: kongingresses
shortNames:
- ki
scope: Namespaced
validation:
openAPIV3Schema:
properties:
proxy:
properties:
connect_timeout:
minimum: 0
type: integer
path:
pattern: ^/.*$
type: string
protocol:
enum:
- http
- https
- grpc
- grpcs
- tcp
- tls
type: string
read_timeout:
minimum: 0
type: integer
retries:
minimum: 0
type: integer
write_timeout:
minimum: 0
type: integer
type: object
route:
properties:
headers:
additionalProperties:
items:
type: string
type: array
type: object
https_redirect_status_code:
type: integer
methods:
items:
type: string
type: array
path_handling:
enum:
- v0
- v1
type: string
preserve_host:
type: boolean
protocols:
items:
enum:
- http
- https
- grpc
- grpcs
- tcp
- tls
type: string
type: array
regex_priority:
type: integer
strip_path:
type: boolean
upstream:
properties:
algorithm:
enum:
- round-robin
- consistent-hashing
- least-connections
type: string
hash_fallback:
type: string
hash_fallback_header:
type: string
hash_on:
type: string
hash_on_cookie:
type: string
hash_on_cookie_path:
type: string
hash_on_header:
type: string
healthchecks:
properties:
active:
properties:
concurrency:
minimum: 1
type: integer
healthy:
properties:
http_statuses:
items:
type: integer
type: array
interval:
minimum: 0
type: integer
successes:
minimum: 0
type: integer
type: object
http_path:
pattern: ^/.*$
type: string
timeout:
minimum: 0
type: integer
unhealthy:
properties:
http_failures:
minimum: 0
type: integer
http_statuses:
items:
type: integer
type: array
interval:
minimum: 0
type: integer
tcp_failures:
minimum: 0
type: integer
timeout:
minimum: 0
type: integer
type: object
type: object
passive:
properties:
healthy:
properties:
http_statuses:
items:
type: integer
type: array
interval:
minimum: 0
type: integer
successes:
minimum: 0
type: integer
type: object
unhealthy:
properties:
http_failures:
minimum: 0
type: integer
http_statuses:
items:
type: integer
type: array
interval:
minimum: 0
type: integer
tcp_failures:
minimum: 0
type: integer
timeout:
minimum: 0
type: integer
type: object
type: object
threshold:
type: integer
type: object
host_header:
type: string
slots:
minimum: 10
type: integer
type: object
version: v1
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: kongplugins.configuration.konghq.com
spec:
additionalPrinterColumns:
- JSONPath: .plugin
description: Name of the plugin
name: Plugin-Type
type: string
- JSONPath: .metadata.creationTimestamp
description: Age
name: Age
type: date
- JSONPath: .disabled
description: Indicates if the plugin is disabled
name: Disabled
priority: 1
type: boolean
- JSONPath: .config
description: Configuration of the plugin
name: Config
priority: 1
type: string
group: configuration.konghq.com
names:
kind: KongPlugin
plural: kongplugins
shortNames:
- kp
scope: Namespaced
validation:
openAPIV3Schema:
properties:
config:
type: object
configFrom:
properties:
secretKeyRef:
properties:
key:
type: string
name:
type: string
required:
- name
- key
type: object
type: object
disabled:
type: boolean
plugin:
type: string
protocols:
items:
enum:
- http
- https
- grpc
- grpcs
- tcp
- tls
type: string
type: array
run_on:
enum:
- first
- second
- all
type: string
required:
- plugin
version: v1
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: tcpingresses.configuration.konghq.com
spec:
additionalPrinterColumns:
- JSONPath: .status.loadBalancer.ingress[*].ip
description: Address of the load balancer
name: Address
type: string
- JSONPath: .metadata.creationTimestamp
description: Age
name: Age
type: date
group: configuration.konghq.com
names:
kind: TCPIngress
plural: tcpingresses
scope: Namespaced
subresources:
status: {}
validation:
openAPIV3Schema:
properties:
apiVersion:
type: string
kind:
type: string
metadata:
type: object
spec:
properties:
rules:
items:
properties:
backend:
properties:
serviceName:
type: string
servicePort:
format: int32
type: integer
type: object
host:
type: string
port:
format: int32
type: integer
type: object
type: array
tls:
items:
properties:
hosts:
items:
type: string
type: array
secretName:
type: string
type: object
type: array
type: object
status:
type: object
version: v1beta1
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: kong-serviceaccount
namespace: kong
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: kong-ingress-clusterrole
rules:
- apiGroups:
- ""
resources:
- endpoints
- nodes
- pods
- secrets
verbs:
- list
- watch
- apiGroups:
- ""
resources:
- nodes
verbs:
- get
- apiGroups:
- ""
resources:
- services
verbs:
- get
- list
- watch
- apiGroups:
- networking.k8s.io
- extensions
- networking.internal.knative.dev
resources:
- ingresses
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- events
verbs:
- create
- patch
- apiGroups:
- networking.k8s.io
- extensions
- networking.internal.knative.dev
resources:
- ingresses/status
verbs:
- update
- apiGroups:
- configuration.konghq.com
resources:
- tcpingresses/status
verbs:
- update
- apiGroups:
- configuration.konghq.com
resources:
- kongplugins
- kongclusterplugins
- kongcredentials
- kongconsumers
- kongingresses
- tcpingresses
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- configmaps
verbs:
- create
- get
- update
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: kong-ingress-clusterrole-nisa-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kong-ingress-clusterrole
subjects:
- kind: ServiceAccount
name: kong-serviceaccount
namespace: kong
---
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
service.beta.kubernetes.io/aws-load-balancer-type: nlb
name: kong-proxy
namespace: kong
spec:
ports:
- name: proxy
port: 80
protocol: TCP
targetPort: 8000
- name: proxy-ssl
port: 443
protocol: TCP
targetPort: 8443
- name: kong-admin
port: 8001
protocol: TCP
targetPort: 8001
- name: kong-admin-ssl
port: 8444
protocol: TCP
targetPort: 8444
selector:
app: ingress-kong
type: NodePort
---
apiVersion: v1
kind: Service
metadata:
name: kong-validation-webhook
namespace: kong
spec:
ports:
- name: webhook
port: 443
protocol: TCP
targetPort: 8080
selector:
app: ingress-kong
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: ingress-kong
name: ingress-kong
namespace: kong
spec:
replicas: 3
selector:
matchLabels:
app: ingress-kong
template:
metadata:
annotations:
kuma.io/gateway: enabled
prometheus.io/port: "8100"
prometheus.io/scrape: "true"
traffic.sidecar.istio.io/includeInboundPorts: ""
labels:
app: ingress-kong
spec:
containers:
- env:
- name: KONG_PROXY_LISTEN
value: 0.0.0.0:8000, 0.0.0.0:8443 ssl http2
- name: KONG_ADMIN_LISTEN
value: 0.0.0.0:8001, 0.0.0.0:8444 ssl
- name: KONG_STATUS_LISTEN
value: 0.0.0.0:8100
- name: KONG_DATABASE
value: "off"
- name: KONG_NGINX_WORKER_PROCESSES
value: "1"
- name: KONG_ADMIN_ACCESS_LOG
value: /dev/stdout
- name: KONG_ADMIN_ERROR_LOG
value: /dev/stderr
- name: KONG_PROXY_ERROR_LOG
value: /dev/stderr
image: kong:2.1
lifecycle:
preStop:
exec:
command:
- /bin/sh
- -c
- kong quit
livenessProbe:
failureThreshold: 3
httpGet:
path: /status
port: 8100
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
name: proxy
ports:
- containerPort: 8000
name: proxy
protocol: TCP
- containerPort: 8443
name: proxy-ssl
protocol: TCP
- containerPort: 8100
name: metrics
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /status
port: 8100
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
securityContext:
runAsUser: 1000
- env:
- name: CONTROLLER_KONG_ADMIN_URL
value: https://127.0.0.1:8444
- name: CONTROLLER_KONG_ADMIN_TLS_SKIP_VERIFY
value: "true"
- name: CONTROLLER_PUBLISH_SERVICE
value: kong/kong-proxy
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
image: kong-docker-kubernetes-ingress-controller.bintray.io/kong-ingress-controller:0.9.1
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
name: ingress-controller
ports:
- containerPort: 8080
name: webhook
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
serviceAccountName: kong-serviceaccount
```
### 執行該yaml 檔案
```js
[root@localhost kong-gateway]# kubectl apply -f all-in-one-dbless.yaml
namespace/kong created
customresourcedefinition.apiextensions.k8s.io/kongclusterplugins.configuration.konghq.com created
customresourcedefinition.apiextensions.k8s.io/kongconsumers.configuration.konghq.com created
customresourcedefinition.apiextensions.k8s.io/kongcredentials.configuration.konghq.com created
customresourcedefinition.apiextensions.k8s.io/kongingresses.configuration.konghq.com created
customresourcedefinition.apiextensions.k8s.io/kongplugins.configuration.konghq.com created
customresourcedefinition.apiextensions.k8s.io/tcpingresses.configuration.konghq.com created
serviceaccount/kong-serviceaccount created
clusterrole.rbac.authorization.k8s.io/kong-ingress-clusterrole created
clusterrolebinding.rbac.authorization.k8s.io/kong-ingress-clusterrole-nisa-binding created
service/kong-proxy created
service/kong-validation-webhook created
deployment.apps/ingress-kong created
```
### 檢視啟動情況
```js
[root@localhost kong-gateway]# kubectl get po -n kong -l app=ingress-kong
NAME READY STATUS RESTARTS AGE
ingress-kong-5f8b45fbff-4cdtv 2/2 Running 2 20m
ingress-kong-5f8b45fbff-mkkq9 2/2 Running 2 20m
ingress-kong-5f8b45fbff-qt8tw 2/2 Running 1 12h
[root@localhost kong-gateway]# kubectl get svc -n kong
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kong-proxy NodePort 10.97.22.195 80:32284/TCP,443:32083/TCP,8001:32704/TCP,8444:30658/TCP 39h
service/kong-validation-webhook ClusterIP 10.101.75.177 443/TCP
```
### 開放kong-proxy對外8001介面ingress配置檔案
當前配置檔案時為了開放kong-proxy-admin的介面,可以讓使用者使用ingress域名進行訪問,限制kong admin管理介面為8001和8443
```js
[root@localhost kong-gateway]# cat kong-proxy-admin.ingress-demo.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
labels:
ingresscontroller: kong
annotations:
kubernetes.io/ingress.class: kong
name: kong-proxy
namespace: kong
spec:
rules:
- host: kong-proxy-admin.mydomain.com
http:
paths:
- backend:
serviceName: kong-proxy
servicePort: 8001
path: /
```
```js
[root@localhost kong-gateway]# kubectl get ing -n kong
kong-proxy kong-proxy-admin.mydomain.com 172.18.0.2 80 10h
[root@localhost kong-gateway]# kubectl describe ing -n kong kong-proxy
Name: kong-proxy
Namespace: kong
Address: 172.18.0.2
Default backend: default-http-backend:80 ()
Rules:
Host Path Backends
---- ---- --------
kong-proxy-admin.mydomain.com
/ kong-proxy:8001 (10.244.0.20:8001,10.244.0.21:8001,10.244.0.22:8001)
Annotations: kubernetes.io/ingress.class: kong
Events:
```
# 安裝Konga 管理UI
Kong 企業版提供了管理UI,開源版本是沒有的。但是有很多的開源的管理 UI ,其中比較好用的是Konga。專案地址:[https://github.com/pantsel/konga](https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fpantsel%2Fkonga)
![img](http://static.iocoder.cn/de0d2613cbb8f50f3666707c95621b97.jpg)
## Konga 特性
Konga 主要是用 AngularJS 寫的,運行於nodejs服務端。具有以下特性:
- 管理所有Kong Admin API物件。
- 支援從遠端源(資料庫,檔案,API等)匯入使用者。
- 管理多個Kong節點。使用快照備份,還原和遷移Kong節點。
- 使用執行狀況檢查監視節點和API狀態。
- 支援電子郵件和閒置通知。
- 支援多使用者。
- 易於資料庫整合(MySQL,postgresSQL,MongoDB,SQL Server)。
## Kubernetes安裝Konga資料庫postgres
1. 我們今天通過Kubernetes來安裝Konga。安裝步驟同樣遵循先配置postgres資料庫,初始化資料庫,啟動容器的流程
2. 第二步配置konga 容器,然後連線postgres資料庫,啟動konga
3. 配置konga連線kong admin 8001或者8444埠,配置kong的引數
### Kubernetes 部署 Konga資料庫容器postgres
要在Kubernetes上部署PostgreSQL,我們需要遵循以下步驟:
- Postgres Docker映像
- 用於儲存Postgres配置的配置對映
- 永久儲存量
- PostgreSQL部署
- PostgreSQL服務
### PostgreSQL Docker映像
我們正在使用公共登錄檔中的**PostgreSQL 10.4** Docker映像。該映像將提供提供PostgreSQL自定義配置/環境變數(如使用者名稱,密碼,資料庫名稱和路徑等)的功能。
### PostgreSQL配置的配置對映
我們將使用配置對映來儲存PostgreSQL相關資訊。在這裡,我們在配置對映中使用資料庫,使用者和密碼,部署模板中的PostgreSQL pod將使用該資料庫,使用者和密碼。
檔案:postgres-configmap.yaml
```
[root@localhost postgres]# cat postgres-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-config
namespace: kong
labels:
app: postgres
data:
POSTGRES_DB: postgresdb
POSTGRES_USER: admin
POSTGRES_PASSWORD: admin
```
建立Postgres配置資源
```
$ kubectl create -f postgres-configmap.yaml
```
### 永久儲存量StorageClass
眾所周知,容器本質上是短暫的。容器例項終止後,由容器或容器中生成的所有資料都將丟失。
為了儲存資料,我們將在Kubernetes中使用持久卷和持久卷宣告資源將資料儲存在持久儲存中。
當前我們配置了StorageClass 動態儲存使用,會在下面進行呼叫,不過配置Deployment模式不支援直接掛載StorageClass ,需要將控制器修改成StatefulSet 模式進行掛載。
### PostgreSQL部署
用於部署PostgreSQL容器的PostgreSQL清單使用PostgreSQL 10.4映像。它使用的是PostgreSQL配置,例如使用者名稱,密碼和我們之前建立的configmap中的資料庫名。它還會掛載從持久卷建立的卷,並宣告使PostgreSQL容器的資料持久化。
```js
[root@localhost postgres]# cat postgres-statefulSet.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
namespace: kong
spec:
serviceName: postgres
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:10.4
imagePullPolicy: "IfNotPresent"
ports:
- containerPort: 5432
envFrom:
- configMapRef:
name: postgres-config
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgredb
volumeClaimTemplates:
- metadata:
name: postgredb
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 5Gi
storageClassName: "standard"
```
建立Postgres部署
```
$ kubectl create -f postgres-deployment.yaml
```
### PostgreSQL Service
要訪問部署或容器,我們需要配置PostgreSQL服務。Kubernetes提供了不同型別的服務,例如ClusterIP,NodePort和LoadBalancer。
使用ClusterIP,我們可以在Kubernetes中訪問PostgreSQL服務。NodePort可以在Kubernetes節點上公開服務端點。為了從外部訪問PostgreSQL,我們需要使用Load Balancer服務型別,該服務型別可以在外部公開該服務。
檔案:postgres-service.yaml
```
[root@localhost postgres]# cat postgres-service.yaml
apiVersion: v1
kind: Service
metadata:
name: postgres
namespace: kong
labels:
app: postgres
spec:
type: NodePort
ports:
- port: 5432
selector:
app: postgres
```
建立Postgres服務
```
$ kubectl create -f postgres-service.yaml
```
### 連線到PostgreSQL
為了連線PostgreSQL,我們需要從服務部署中獲取Node埠。
```
[root@localhost postgres]# kubectl get svc postgres -n kong
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
postgres NodePort 10.98.211.186 5432:30761/TCP 14h
```
我們需要使用埠31070從kubernetes叢集中存在的機器/節點連線到PostgreSQL,並使用前面configmap中給出的憑據。
```
$ psql -h localhost -U admin --password -p 30761 postgresdb
# 通過psql 命令進行連線
```
### PostgreSQL結論
與僅使用虛擬機器時相比,在Kubernetes上執行PostgreSQL有助於以更好的方式利用資源。Kubernetes還使用同一虛擬機器或Kubernetes叢集中的PostgreSQL提供其他應用程式的隔離。
### 是否可以使用StatefulSets嗎?
在Kubernetes中,需要[StatefulSets](https://kubernetes.io/blog/2017/02/postgresql-clusters-kubernetes-statefulsets/)來擴充套件有狀態的應用程式。可以使用StatefulSets通過單個命令輕鬆擴充套件PostgreSQL。
## Kubernetes安裝Konga
1. 我們今天通過Kubernetes來安裝Konga。安裝步驟同樣遵循先配置postgres資料庫,初始化資料庫,啟動容器的流程
2. 第二步配置konga 容器,然後連線postgres資料庫,啟動konga
3. 配置konga連線kong admin 8001或者8444埠,配置kong的引數
### 配置konga Secret加密資訊
建立配置konga Secret加密資訊連線PostgreSQL資料庫。
```
[root@localhost konga]# cat konga-creds.yaml
apiVersion: v1
kind: Secret
metadata:
name: kongcreds
namespace: kong
type: Opaque
data:
username: YWRtaW4=
password: YWRtaW4=
postgresdbname: cG9zdGdyZXNkYg==
#your secret in base64 echo -n 'admin' | base64 YWRtaW4=
```
```
[root@localhost konga]# kubectl get secret -n kong
NAME TYPE DATA AGE
kongcreds Opaque 3 26h
```
### 配置konga Deployment Pod
通過Konga Deployment 引用secret 配置檔案,同時在配置連線地址時,設定成service 內部dns 域名連線,具體配置檔案如下:
```
[root@localhost konga]# cat konga-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: konga
namespace: kong
spec:
replicas: 1
selector:
matchLabels:
app: konga
template:
metadata:
labels:
name: konga
app: konga
spec:
containers:
- name: konga
image: pantsel/konga:latest
env:
- name: DB_ADAPTER
value: postgres
- name: DB_HOST
value: postgres.kong.svc.cluster.local.
- name: DB_USER
valueFrom:
secretKeyRef:
name: kongcreds
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: kongcreds
key: password
- name: DB_DATABASE
value: postgresdb
- name: TOKEN_SECRET
value: somesecretstring
ports:
- containerPort: 1337
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
labels:
app: konga
name: konga-svc
namespace: kong
spec:
ports:
- protocol: TCP
port: 443
targetPort: 1337
selector:
app: konga
```
### 配置konga Ingress 域名對外
```
[root@localhost konga]# cat konga-admin-ingress-demo.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
labels:
ingresscontroller: kong
annotations:
kubernetes.io/ingress.class: kong
name: kong-admin
namespace: kong
spec:
rules:
- host: konga-admin.mydomain.com
http:
paths:
- backend:
serviceName: konga-svc
servicePort: 443
path: /
```
### 測試訪問konga 頁面
通過Ingress 域名 konga-admin.mydomain.com訪問,首先會進行管理員賬號和密碼建立,然後進入Connections 介面 連線對應kong節點。
> 注意當前我沒有使用Ingress 域名,是直接使用埠對映進去的,生產情況下建議使用Ingress 域名。
1. 登入Konga 介面
![](https://raw.githubusercontent.com/PassZhang/passzhang.github.io/images-picgo/20200814135738.png)
2. 建立一個新的Kong 節點連線
![](https://raw.githubusercontent.com/PassZhang/passzhang.github.io/images-picgo/20200814140251.png)
3. 建立成功之後點選連線
![](https://raw.githubusercontent.com/PassZhang/passzhang.github.io/images-picgo/20200814140325.png)
4. 連線成功之後,可以看到整體的kong節點的配置和概況
![](https://raw.githubusercontent.com/PassZhang/passzhang.github.io/images-picgo/20200814140425.png)
![](https://raw.githubusercontent.com/PassZhang/passzhang.github.io/images-picgo/20200814140516.png)
![](https://raw.githubusercontent.com/PassZhang/passzhang.github.io/images-picgo/20200814140450.png)
5. 因為我之前建立了兩個Ingress 對映域名,所以在konga service選項和Routes選項會展示出來
![](https://raw.githubusercontent.com/PassZhang/passzhang.github.io/images-picgo/20200814140544.png)
![](https://raw.githubusercontent.com/PassZhang/passzhang.github.io/images-picgo/20200814140650.png)
6. 配置好konga管理後臺之後,我們可以通過konga 後臺直接對kong進行管理,圖形化介面建立Service和Routes 或者其他功能和引數的修改,都可以在konga web 介面進行操作。本章到這裡也就告一段落了,後面我會介紹下關於kong節點的配置檔案。
# [Kong API Gateway 配置檔案詳解](https://linuxops.org/blog/kong/config.html)
> 配置檔案這塊轉載該部落格,https://linuxops.org/blog/kong/config.html
>
> 下面介紹的配置檔案,可以直接在自定義映象修改對應的配置,也可以在konga web介面進行修改。
## 兩個主要元件
- Kong Server,基於 nginx 的伺服器,用來接收 API 請求。下面主要是對配置檔案進行詳解。後面也可以通過[Kong API Gateway 管理API詳解](https://linuxops.org/blog/kong/admin.html),對kong進行操作。Kong 功能強大注意還是因為它支援強大的外掛功能。
- Apache Cassandra,用來儲存操作資料。
## 一、前言
Kong配置檔案是Kong服務的核心檔案,它配置了Kong以怎麼的方式執行,並且依賴於這個配置生成Nginx的配置檔案,本文通過解讀Kong配置檔案,以瞭解Kong的執行和配置。
在成功安裝Kong以後,會有一個名為`kong.conf.default`預設的配置檔案示例,如果是通過包管理器安裝的,通常位於`/etc/kong/kong.conf.default`,我們要將其複製為`kong.conf`以便於我們修改使用他。
在Kong的配置檔案中,約定了以下的幾條規則:
- 配置檔案中以`#`開頭的行均為註釋行,程式不會讀取這些內容。
- 在官方提供的預設配置檔案中,以`#`開頭的有值的配置專案均為預設配置。
- 所有的配置項,均可以在系統環境變數中配置,但是必須要加上`KONG_`為字首。
- 值為布林型的配置,可以使用`on`/`off`或者`true`/`false`。
- 值為列表的,必須使用半形逗號分割。
Kong的配置,大概分為幾種,分別是:
- 常規配置:配置服務執行目錄,外掛載入,日誌等等
- NGINX配置:配置Nginx注入,例如監聽IP和埠配置等等,用於Kong在啟動的時候生成Nginx配置檔案
- 資料庫儲存配置:配資料庫型別,地址、使用者名稱密碼等等資訊
- 資料庫快取配置:配置資料的快取規則,Kong會快取諸如API資訊、使用者、憑證等資訊,以減少訪問資料庫次數提高效能
- DNS解析器配置:預設情況會使用系統設定,如`hosts`和`resolv.conf`的配置,你也可以通過DNS的解析器配置來修改
- 其他雜項配置:繼承自lua-nginx模組的其他設定允許更多的靈活性和高階用法。
下面我們一個模組一個模組解釋一下各項的配置。
## 二、常規配置
在常規配置中,主要是控制Kong一些執行時的一些配置,主要有如下配置:
| 配置項 | 預設值 | 說明 |
| :---------------- | :-------------------- | :----------------------------------------------------------- |
| prefix | /usr/local/kong/ | 配置Kong的工作目錄,相當於Nginx的工作目錄,這個目錄存放執行時的臨時檔案和日誌,包括Kong啟動的時候自動生成的Nginx的配置檔案。 每一個Kong經常必須有一個單獨的工作目錄 |
| log_level | notice | Nginx的日誌級別。日誌存放/logs/error.log |
| proxy_access_log | logs/access.log | 代理埠請求的日誌檔案,可以設定為`off`來關閉日誌的記錄,也可以通過設定絕對路徑也可以設定相對路徑。 如果設定了相對路徑,則日誌檔案會儲存在的目錄下 |
| proxy_error_log | logs/error.log | 代理埠請求的錯誤日誌檔案,可以設定為`off`來關閉日誌的記錄,也可以通過設定絕對路徑也可以設定相對路徑。 如果設定了相對路徑,則日誌檔案會儲存在的目錄下 |
| admin_access_log | logs/admin_access.log | Kong管理的API埠請求的日誌檔案,可以設定為`off`來關閉日誌的記錄,也可以通過設定絕對路徑也可以設定相對路徑。 如果設定了相對路徑,則日誌檔案會儲存在的目錄下 |
| admin_error_log | logs/error.log | Kong管理的API埠請求的錯誤日誌檔案,可以設定為`off`來關閉日誌的記錄,也可以通過設定絕對路徑也可以設定相對路徑。 如果設定了相對路徑,則日誌檔案會儲存在的目錄下 |
| plugins | bundled | Kong啟動的時候載入的外掛,如果多個必須要使用半形逗號分割。預設情況下,只有捆綁官方發行版本的外掛通過 `bundled` 這個值來載入。 載入外掛只是Kong在啟動的時候載入外掛的程式碼,但是並不會使用它,如果要使用他,還必須要通過管理API來配置 當然,如果你不想載入任何外掛,可以使用`off`來關閉它,值得強調的一點`bundled`值可以和其他外掛名稱一起使用,`bundled`並不是一個外掛名稱,它代表了隨官方發行的所有外掛。 |
| anonymous_reports | on | 如果Kong程序發生了錯誤,會以匿名的方式將錯誤提交給Kong官方, 以幫助改善Kong。 |
在常規的配置中,主要配置了Kong執行的目錄日誌等資訊。
無論如何,配置的檔案或者目錄Kong必須要用許可權訪問,否則會報錯。
## 三、Nginx注入配置
Kong基於Nginx,當然需要配置Nginx來滿足Kong的執行要求,Kong提供了Nginx的注入配置,使得我們更輕鬆控制。
在Nginx注入配置中,有如下配置:
| 配置項 | 預設值 | 說明 |
| :---------------------- | :--------------------------------- | :----------------------------------------------------------- |
| proxy_listen | 0.0.0.0:8000, 0.0.0.0:8443 ssl | 配置Kong代理監聽的地址和埠,這個是Kong的入口,API呼叫都將通過這個埠請求。這個配置和Ngxin中的配置一致,通過`SSL`可以指定接受https的請求 支援IPv4和IPv6 |
| admin_listen | 127.0.0.1:8001, 127.0.0.1:8444 ssl | 配置Kong的管理API監聽的埠,和proxy_listen配置一樣,但是這個配置不建議監聽在公網IP上。 |
| nginx_user | nobody nobody | 配置Nginx的使用者名稱和使用者組,和Nginx的配置規則一樣 |
| nginx_worker_processes | auto | 設定Nginx的程序書,通常等於CPU核心數 |
| nginx_daemon | on | 是否以daemon的方式執行Ngxin |
| mem_cache_size | 128m | 記憶體的快取大小,可以使用`k`和`m`為單位 |
| ssl_cipher_suite | modern | 定義Nginx提供的TLS密碼,可以配置的值有:`modern`,`intermediate`, `old`, `custom`. |
| ssl_ciphers | | 定義Nginx提供的TLS密碼的列表,參考Nginx的配置 |
| ssl_cert | | 配置SSL證書的crt路徑,必須是要絕對路徑 |
| ssl_cert_key | | 設定SSL證書的key檔案,必須是絕對路徑 |
| client_ssl | off | ..... |
| client_ssl_cert | | ..... |
| client_ssl_cert_key | | ..... |
| admin_ssl_cert | | ..... |
| admin_ssl_cert_key | | ..... |
| headers | server_tokens, latency_tokens | 設定再相應客戶端時候應該注入的頭部,可以設定的值如下: - `server_tokens`: 注入'Via'和'Server'頭部. - `latency_tokens`: 注入'X-Kong-Proxy-Latency'和'X-Kong-Upstream-Latency' 頭部. - `X-Kong-`: 只有在適當的時候注入特定的頭部 這個配置可以被設定為`off`。當然,即便設定了`off`以後,外掛依然可以注入頭部 |
| trusted_ips | | 定義可信的IP地址段,通常不建議在此處限制請求,應該再外掛中過濾 |
| real_ip_header | X-Real-IP | 獲取客戶端真實的IP,將值通過同步的形式傳遞給後端 |
| real_ip_recursive | off | 這個值在Nginx配置中設定了同名的ngx_http_realip_module指令 |
| client_max_body_size | 0 | 配置Nginx接受客戶端最大的body長度,如果超過此配置 將返回413。 設定為`0`則不檢查長度 |
| client_body_buffer_size | 8k | 設定讀取緩衝區大小,如果超過記憶體緩衝區大小,那麼NGINX會快取在磁碟中,降低效能。 |
| error_default_type | text/plain | 當請求' Accept '頭丟失,Nginx返回請求錯誤時使用的預設MIME型別。可以配置的值為: `text/plain`,`text/html`, `application/json`, `application/xml`. |
在Nginx注入配置中,配置了Nginx的基本的引數,這些引數大部分和NGINX的配置值是一樣的,可以通過Nginx的配置文件瞭解一下。
## 四、 資料庫儲存配置
資料庫配置的模組配置資料庫相關的連線資訊等等。主要有如下配置:
| 配置項 | 預設值 | 說明 |
| :--------------------------------- | :------------- | :----------------------------------------------------------- |
| database | postgres | 設定資料庫型別,Kong支援兩種資料庫,一種是postgres,一種是cassandra |
| PostgreSQL配置 | | 如果`database`設定為`postgres`以下配置生效 |
| pg_host | 127.0.0.1 | 設定PostgreSQL的連線地址 |
| pg_port | 5432 | 設定PostgreSQL的埠 |
| pg_user | kong | 設定PostgreSQL的使用者名稱 |
| pg_password | | 設定PostgreSQL的密碼 |
| pg_database | kong | 設定資料庫名稱 |
| pg_ssl | off | 是否開啟ssl連線 |
| pg_ssl_verify | off | 如果啟用了' pg_ssl ',則切換伺服器證書驗證。 |
| cassandra配置 | | 如果`database`設定為`cassandra`以下配置生效 |
| cassandra_contact_points | 127.0.0.1 | ..... |
| cassandra_port | 9042 | ..... |
| cassandra_keyspace | kong | ..... |
| cassandra_timeout | 5000 | ..... |
| cassandra_ssl | off | ..... |
| cassandra_ssl_verify | off | ..... |
| cassandra_username | kong | ..... |
| cassandra_password | | ..... |
| cassandra_consistency | ONE | ..... |
| cassandra_lb_policy | RoundRobin | ..... |
| cassandra_local_datacenter | | ..... |
| cassandra_repl_strategy | SimpleStrategy | ..... |
| cassandra_repl_factor | 1 | ..... |
| cassandra_data_centers | dc1:2,dc2:3 | ..... |
| cassandra_schema_consensus_timeout | 10000 | ..... |
> 推薦使用PostgreSQL資料庫作為生產環境的儲存,PostgreSQL具有良好的效能和穩定性,是一個非常優秀的開源資料庫。
## 五、 資料庫快取配置
在上一節中,配置了Kong持久化儲存,顯然如果每次的請求都需要去查詢資料庫中的相關資訊那無疑是非常消耗資源,效能和穩定性也會大大降低,作為一個API閘道器肯定是不能忍的,解決這個問題的辦法就是快取,Kong將資料快取在記憶體中,這樣會大大提高效能,本節介紹Kong的快取配置。
| 配置項 | 預設值 | 說明 |
| :-------------------- | :----- | :----------------------------------------------------------- |
| db_update_frequency | 5 | 節點更新資料庫的時間,以秒為單位。 這個配置設定了節點查詢資料庫的時間,假如有3臺Kong伺服器節點ABC,如果再A節點增加了一個API閘道器,那麼B和C節點最多需要等待`db_update_frequency`時間才能被更新到。 |
| db_update_propagation | 0 | 資料庫節點的更新時間。 如果使用了Cassandra資料庫叢集,那麼如果資料庫有更新,最多需要`db_update_propagation`時間來同步所有的資料庫副本。 如果使用PostgreSQL或者單資料庫,這個值可以被設定為0 |
| db_cache_ttl | 0 | 快取生效時間,單位秒。如果設定為0表示永不過期 Kong從資料庫中讀取資料並且快取,在ttl過期後會刪除這個快取然後再一次讀取資料庫並快取 |
| db_resurrect_ttl | 30 | 快取重新整理時間,單位秒。當資料儲存中的陳舊實體無法重新整理時(例如,資料儲存不可訪問),應該對其進行恢復。當這個TTL過期時,將嘗試重新整理陳舊的實體。 |
## 六、 DNS解析器配置
預設情況下,DNS解析器將使用標準配置檔案`/etc/hosts`和`/etc/resolv.conf`。如果設定了環境變數`LOCALDOMAIN`和`RES_OPTIONS`,那麼後一個檔案中的設定將被覆蓋。
| 配置項 | 預設值 | 說明 |
| :---------------- | :--------------- | :----------------------------------------------------------- |
| dns_resolver | | 配置DNS伺服器列表,用半形逗號分割,每個條目使用ip[:port]的格式,這個配置僅提供給Kong使用,不會覆蓋節點系統的配置,如果沒有配置則使用系統的設定。接受IPv4和IPv6的地址。 |
| dns_hostsfile | /etc/hosts | 配置Kong的hosts檔案,這個配置同樣僅提供給Kong使用,不會覆蓋節點系統的配置。 需要說明的是這個檔案僅讀取一次,讀取的內容會快取再記憶體中,如果修改了此檔案,必須要重啟Kong才能生效。 |
| dns_order | LAST,SRV,A,CNAME | 解析不同記錄型別的順序。“LAST”型別表示最後一次成功查詢的型別(用於指定的名稱) |
| dns_stale_ttl | 4 | 配置DNS記錄快取過期時間 |
| dns_not_found_ttl | 30 | 這個配置值不知道該如何理解?? |
| dns_error_ttl | 1 | ..... |
| dns_no_sync | off | 如果啟用了該項,那麼在DNS快取過期之後,每一次請求都會發起DNS查詢。在禁用此項時,那麼相同的域名多次請求會同步到一個查詢中共享返回值。 |
在DNS配置中,我們基本上不需要更改,官網的配置給出了最優的配置。如果我們需要在`host`檔案中定義後端繫結的域名,一定要在編輯`hosts`檔案後重載Kong的配置,或者重啟Kong,無論`hosts`的檔案是否是`/etc/hosts`,否則都不會生效的。
## 七、 其他雜項配置
雜項配置基本上關於LUA的配置,如果不熟悉請不要修改,按照官方預設即可。
| 配置項 | 預設值 | 說明 |
| :-------------------------- | :-------------------- | :--- |
| lua_ssl_trusted_certificate | | .... |
| lua_ssl_verify_depth | 1 | .... |
| lua_package_path | ./?.lua;./?/init.lua; | .... |
| lua_package_cpath | | .... |
| lua_socket_pool_size | 30 | .... |
# Kong基本功能說明
## 基礎功能(konga為例)
![在這裡插入圖片描述](https://user-gold-cdn.xitu.io/2020/6/5/172844d6d843ff5a?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)
### **應用級選單**
1. Connections Kong連線,用於配置Kong的AdminAPI地址,配置成功之後,將會開啟Kong級選單。
2. Snapshots 快照,用於儲存Kong節點快照,可快速恢復節點配置。
### **API閘道器選單**
1. Consumers API閘道器消費者,用於各類認證以及限流控制等;
2. Services 服務,用於配置上游服務的資訊,主要包括服務名稱、上游的Host以及Port等;
3. Routes 路由,用於配置下游的路由資訊,定義服務的出口路徑,主要包括路由名稱、Host、Path、Methods以及Http/Https等;
4. Plugins 外掛,可配置於Service或Route,主要包括認證、安全、限流、監控、日誌以及自定義幾大模組,官方提供了較為全面的基礎外掛功能;
5. Upstreams 類nginx中的Upstream,用於配置上游的服務資訊;
6. Certificates 證書管理。
### **服務配置**
1.新增服務: Services -> Create Services 例項:
![在這裡插入圖片描述](https://user-gold-cdn.xitu.io/2020/6/5/172844d6d860f940?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)
說明:由於這裡的Kong部署在K8S環境中,所以可以直接使用K8S中的服務名+埠號來定義服務的Host和Port。
2.新增路由: Services -> Service Detail -> Routes -> Add Route 例項:
![在這裡插入圖片描述](https://user-gold-cdn.xitu.io/2020/6/5/172844d6dae6f1f4?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)
配置完成之後,我們就可以訪問我們的服務了。
```
# https://192.168.0.231:31617/config 或 http://192.168.0.231:32740/config Host: config.kong
> curl -ik -H "Host":"config.kong" https://192.168.0.231:31617/config/basic/dev
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Date: Thu, 17 Oct 2019 02:05:16 GMT
Server: Kestrel
X-Kong-Upstream-Latency: 3
X-Kong-Proxy-Latency: 10007
Via: kong/1.3.0
{"logLevel":"Debug",...}
複製程式碼
```
## 外掛配置
外掛新增有兩個入口: 1.服務外掛 Servcies -> Service Detail -> Plugins -> Add Plugin 2.路由外掛 Routes -> Route Detail -> Plugins -> Add Plugin
**認證**
```
1.Basic 認證
Header: Authorization Basic base64(username:password)
2.Jwt認證
支援三種認證引數傳遞:uri param,cookie and header,可自定義鍵名
key claim一般為iss
jwt生成 & 校驗:https://jwt.io/
3.OAuth2認證
認證地址:oauth2/authorize
獲取token地址: oauth2/token
重新整理token地址: oauth2/token
```
**安全**
```
1. Acl 訪問控制列表
2. Cors 跨域資源共享
3. Ip Restriction IP限制
4. Bot Detection 機器人檢測
```
**限流**
```
1. Rate Limiting 速率限制
2. Response Ratelimiting 響應速率限制
3. Request Size Limiting 請求大小限制
4. Request Termination 請求阻斷/終止
```
**日誌**
**監控**
**請求轉發**
**自定義**
## Kong Admin API
[AdminAPI](https://docs.konghq.com/1.3.x/admin-api/)
# 感謝參考
[AdminAPI](https://docs.konghq.com/1.3.x/admin-api/)
[shoy160](https://juejin.im/user/501033035644414)
[kirito-moe](https://cloud.tencent.com/developer/user/1655091)
[非學無以廣才](https://segmentfault.com/blog/yueli)
https://linuxops.org/blog/kong/admin.html
https://blog.csdn.net/twingao/article/details/10