在这个例子中,我们将设计一个架构,Kubernetes Nginx Ingress控制器和内部Nginx代理一起工作,将流量转移到相关服务/平台。这是通过在Ingress层面首先读取域名,然后在内部Nginx代理层面读取URL的其余部分来处理的。为什么我们不在Ingress层面上做所有的事情,是因为它有一些限制,如后台调用,操纵头文件等。
我们接受来自外部的HTTPS请求,使用HTTP进行内部通信。Ingress负责SSL终止。请看下面的整个工作流程。下面的设计有一个小提示;通常你会在客户端和Ingress之间放一个额外的代理,以防止你的Kubernetes集群完全暴露在外面,但在这个阶段,这已经脱离了背景。
-
**GATEWAY。**这是我们实际的Ingress,暴露在外部流量中。接受外部的HTTPS请求,并将HTTP请求转发给内部服务。
-
**DOC:**这代表我们公司的API文档,在
doc.my-company.com域提供服务。Ingress直接与该服务对话。 -
**PROXY:**这是内部Nginx代理应用程序。Ingress直接与该服务对话。任何
api.my-company.com域的特定流量都由这个服务处理,并转到相关的服务/pod。 -
**OAUTH:**这是我们内部的OAuth服务。每个请求都可以先发送到这个服务,然后再传递给其他服务进行认证/授权。
-
**API。**这是一些随机的内部服务。
API
├── Makefile
文件
deployment.yaml
apiVersion: apps/v1
service.yaml
apiVersion: v1
Docker文件
#
main.go
package main
制作文件
## Build application binary.
OAUTH
├── Makefile
文件
deployment.yaml
apiVersion: apps/v1
service.yaml
apiVersion: v1
Docker文件
#
main.go
package main
制作文件
## Build application binary.
DOC
├── Makefile
文件
部署.yaml
apiVersion: apps/v1
service.yaml
apiVersion: v1
Docker文件
#
main.go
package main
制作文件
## Build application binary.
替换文件(PROXY
├── Makefile
文件
deployment.yaml
apiVersion: apps/v1
service.yaml
apiVersion: v1
Docker文件
FROM nginx:1.19.5-alpine
default.conf
server {
制作文件
## Build, tag and push application image to registry then clean up.
GATEWAY
├── Makefile
文件
ingress.yaml
apiVersion: networking.k8s.io/v1beta1
cert.conf
[ req ]
制作文件
## Deploy application to kubernetes cluster.
设置
我们需要创建SSL证书、Kubernetes秘密,并将域名添加到/etc/hosts 文件。这是GATEWAY服务所需要的。
证书
$ openssl req -nodes -new -x509 -sha256 -days 1825 \
秘密
$ kubectl create secret tls gateway-tls-secret \
主机
你通常会在部署GATEWAY服务后做这个,但我已经知道了,所以在这里展示。你将需要改变下面的IP,kubectl get ingress gateway-ingress -o yaml | grep ip 命令输出。
# /etc/hosts
部署
首先,你需要推送你的服务图像,然后进行部署。
api$ make push
api$ make deploy
测试
gateway$ make k8s-test-doc
gateway$ make k8s-test-api