概述
集群中的服务该如何供集群外访问?K8S 提供了 ingress 特性,而可实现 ingress 的软件有 nginx、haproxy、traefix 等,本文描述如何将 API 网关服务 Kong 作为 ingress 来暴露集群提供的服务。
Kong安装
注意 :本文采用Helm 方式安装,否则可用原始 YAMLs 文件方式安装,如:
# db is pgsql
% kubectl apply -f https://bit.ly/kong-ingress
# or
# db-less
% kubectl apply -f https://bit.ly/kong-ingress-dbless
可选。若主机无法访问 gcr.io 网站,需将 charts 下载到本地主机:
git clone https://github.com/helm/charts.git
创建 namespace:
% kubectl create namespace kong
如下以 db-less 模式安装 kong,并启用其k8s ingress control:
# 若主机可访问 gcr.io,则第一步骤可省略,此时执行:% helm install stable/kong \
--name kong
--namespace kong \
--set ingressController.enabled=true \
--set postgresql.enabled=false \
--set env.database=off
# 否则:% cd charts/stable/kong
% mv requirements.yaml requirements.yaml.orig # db-less 模式安装,可将数据库依赖删掉
% helm install . \
--name kong \
--namespace kong \
--set ingressController.enabled=true \
--set postgresql.enabled=false \
--set env.database=off
安装完成后检查。注意 :默认helm 安装采用 NodePort 方式暴露 kong-proxy(代理)端口,故端口是随机生成的,如下所示,通过主机的 30569 可访问 kong 的 80 端口,通过 32461 端口可访问 kong 的 443 端口。
% oc get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kong-kong 1 1 1 1 1h
% oc get pod
NAME READY STATUS RESTARTS AGE
kong-kong-695d4dd564-89skv 2/2 Running 3 1h
% oc get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kong-kong-admin NodePort 172.30.35.72 <none> 8444:32192/TCP 1h
kong-kong-proxy NodePort 172.30.69.93 <none> 80:30569/TCP,443:32461/TCP 1h
# crd
% kubectl get crd|grep konghq
kongconsumers.configuration.konghq.com 2019-08-20T08:15:32Z
kongcredentials.configuration.konghq.com 2019-08-20T08:15:32Z
kongingresses.configuration.konghq.com 2019-08-20T08:15:32Z
kongplugins.configuration.konghq.com 2019-08-20T08:15:32Z
访问 kong-proxy 测试:
# 如下所示,选择任何一台 Node 节点的 IP:<NodePort> 访问测试:% curl -i okd-m01.zyl.io:30569
HTTP/1.1 404 Not Found
Date: Tue, 27 Aug 2019 08:46:25 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Content-Length: 48
Server: kong/1.2.2
{"message":"no Route matched with those values"}
配置 Ingress
创建测试用例:
% kubectl create namespace demo
% kubectl run echo --image=googlecontainer/echoserver:1.10
% kubectl expose deploy echo --port=8080 --target-port=8080
创建Ingress:
% kubectl create -f - <<EOF
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: echo
annotations:
kubernetes.io/ingress.class: "kong"
spec:
rules:
- http:
paths:
- path: /echo
backend:
serviceName: echo
servicePort: 8080
EOF
注意 :kubernetes.io/ingress.class 可选,其指定 Ingress 由kong解析,此关键字与 kong 部署配置的 –ingress-class 一致。
% oc get deploy kong-kong -o yaml|more
...
spec:
containers:
- args:
- /kong-ingress-controller
- --publish-service=kong/kong-kong-proxy
- --ingress-class=kong
- --election-id=kong-ingress-controller-leader-kong
- --kong-url=https://localhost:8444
...
检查 Ingress 并测试:
注意:
- 本例部署的 kong 有一个 replicat,其 pod 当前运行在节点 134.194.18.11 上,故此处 ADDRESS 显示为此节点地址,但因将 kong 通过 NodePort 方式暴露端口,故实际上可通过任一节点访问;
- PORTS 此处永远显示为标准端口 80,但上节通过 NodePorts 方式将 kong 代理暴露到集群外部,其端口映射关系为80:30569/TCP,443:32461/TCP。
% kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
echo * 134.194.18.11 80 3m
通过 kong 代理访问服务:
% curl http://134.194.18.11:30569/echo
...
Hostname: echo-56f4bd4f84-rx8wx
Pod Information:
node name: okd-c01.zyl.io
pod name: echo-56f4bd4f84-rx8wx
pod namespace: demo
pod IP: 10.128.2.243
...
参考文档
- kubernetes-ingress-controller:https://github.com/Kong/kuber…;
- helm with kong:https://github.com/helm/chart…;
- kubernetes-ingress-controller文档:https://github.com/Kong/kuber…;