Ingress配置转发端口本质,还是利用service nodePort能力,通过暴露ingress的本地端口来转发。
Ingress默认不支持TCP or UDP services。因此Ingress controller使用--tcp-services-configmap和--udp-services-configmap这两个配置达到转发端口的目的。
(文中采用阿里云kubernetes v1.16.9)
检查一下这两个配置是否开启:
kubectl get deployment Nginx-ingress-controller -n kube-system -o yaml
如图所示,已经开启了,同时表明了,后面需要修改对应 tcp-services configmap
创建一个 namespaces,这个namespaces跟后面的 deployment和service,还有tcp-services configmap都有关系。
kubectl create ns dev
部署一个tomat应用kubectl create -f deployment-hello.yaml
# cat deployment-hello.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello
namespaces: dev
spec:
replicas: 4
template:
metadata:
labels:
run: hello
spec:
containers:
- name: hello
image: tomcat:8
imagePullPolicy: Always
ports:
- name: http
containerPort: 8080
创建一个service,kubectl create -f service-hello.yaml
#cat service-hello.yaml
apiVersion: v1
kind: Service
metadata:
name: hello
labels:
name: hello
namespaces: dev
spec:
clusterIP: "None"
ports:
- port: 8080
targetPort: 8080
protocol: TCP
selector:
run: hello
修改 namespace 为 kube-system 下的 ingress-nginx-lb service:
注意:
port可以改成其他端口,比如18080
targetPort要跟后面的tcp-services configmap配置保持一致,都是8080
kubectl edit svc/nginx-ingress-lb -n kube-system
- name: hello
port: 18080
protocol: TCP
targetPort: 8080
再去看这个nginx-ingress-lb,发现回自动给你添加一个nodePort: 32031。
看看是不是配置成功kubectl get svc -n kube-system
修改 namespace kube-system 下的 tcp-service configmap,添加配置:
kubectl edit configmap/tcp-services -n kube-system
data:
8080: dev/hello:8080
在配置data之前,你需要一个deploy+service来
其中 configmap data 的格式为: <namespace/service name>:<service port>:[PROXY]:[PROXY]
通过阿里云提供的 EXTERNAL-IP,也就是 对应阿里云负载均衡的外网IP,即可访问:
http://EXTERNAL-IP:18080
同时检查一下阿里云对应的负载均衡,发现对应的端口已经自动监听了,不用再手工在页面上处理。