Kubernetes集群内部通过服务名能进行相互调用,但如果Kubernetes中的pod需要调用外部服务,而且这些外部服务是属于不同的安全区域,就面临开墙的问题,因为Kubernetes Pod能够漂移道不同的宿主机中,因此很难做到只针对某几台确定的宿主机进行防火墙的开通。参考传统的架构中对外部服务的调用,在Kubernetes内部配置两台宿主机专门部署Nginx Pod,进行反向代理进行实现。

  •  外部调用内部,Ingress所在节点开墙

基于Nginx的开墙方案-LMLPHP

  •  内部调用外部,Nginx所在节点开墙

基于Nginx的开墙方案-LMLPHP

  • 为什么不在ingress内做反向代理,因为Ingress中的配置会随着pod的变化刷新掉,所以需要另外再启动个Nginx pod,固定在2台机器上。
  • Nginx的配置不能直接固定在Pod中,因为有新的外部服务进行接入时,需要更新nginx.conf,因此需要采用configmap进行配置。
  • 每个服务挂接一个不同的location
apiVersion: v1
data:
nginx.conf: |-
worker_processes ; events { worker_connections ; } http {
sendfile on; server {
listen ; # a test endpoint that returns http 200s
location /helloService {
proxy_pass http://somehost:somenodeport/;
proxy_set_header X-Real-IP $remote_addr;
}
} }
kind: ConfigMap
metadata:
name: nginx-config
namespace: default

nginx.yaml文件

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
run: my-nginx
spec:
replicas:
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: sz-pg-oam-docker-hub-.tendcloud.com/library/nginx:1.9
ports:
- containerPort:
volumeMounts:
- name: config-volume
mountPath: /etc/nginx
volumes:
- name: config-volume
configMap:
name: nginx-config

nginx启动后会替换/etc/nginx中的内容,变成只有一个nginx.config(我们配置的内容)

为了其他pod访问方面,还需要再建立一个services:nginxsvc

然后其他pod进去后通过

curl http://nginxsvc/helloService/hello

进行访问。

其他得命名空间访问

curl http://svcname:namespace/helloService/hello

这样在pod进行飘移后不需要再度进行不同主机的开墙,只需要保持部署nginx的两台机器开墙即可

此方案问题在于当有新的服务接入时,需要更新configmap配置,更新完后发现nginx内的目录文件也更新了,但是nginx没有reload配置。

需要将nginx重启后配置生效,可以通过kubectl delete pod方式进行逐个更新。

05-11 23:02