需求:部分服务不想通过80端口被访问,网关上对80端口有限制,只允许内网访问80和443,所以外网域名必须带端口号访问。以前是直接映射到服务器的端口号,k8s不想通过label指定机子部署。于是研究一下ingress 开启除80和443以外的端口

创建tcp-service.yaml 暴露tcp端口

# tcp-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: LoadBalancer
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
    - name: proxied-tcp-9000
      port: 9000
      targetPort: 9000
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

创建tcp-data.yaml

# tcp-data.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
data:
# <namespace/service name>:<service port>:[PROXY]:[PROXY]
  9000: "test/test-openapi:80"

这个test/test-openapi:80 是namespace 为test下的service name 为test-openapi, service 端口为80的服务

应用2个yaml

kubectl apply -f  tcp-service.yaml
kubectl apply -f  tcp-data.yaml

比较ingress-nginx service应用前后的变化

kubectl get svc -n ingress-nginx

此时在label为ingress的node节点上可以看到端口9000已经开启,测试了80和443服务还是没有问题的。

查看configmap如下

kubectl edit cm/tcp-services -n ingress-nginx

进入ingress的pod查看ingress的生成的nginx配置

访问nodeip+9000端口测试服务是否可用

这里直接域名解析到nginx 再转发给ingress的node的9000端口或者域名直接指向ingress的服务器即可

原外网域名+端口

官方文档

https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐