我们公司的外部服务需要连接到在我们的Kubernetes集群之一中运行的应用程序。外部服务必须通过具有静态端口(端口80)的IP地址(不能使用主机名)进行连接。这不是理想的选择,但是我们无法控制外部服务。
我们集群中唯一的外部公开服务运行HAProxy,该代理将流量路由到集群中所有内部(非公开公开)的pod /服务。 HAProxy的服务以LoadBalancer类型部署,该类型位于AWS ELB后面以进行SSL终止。
当我尝试使用静态端口部署HAProxy时出现问题。 According to the documentation,我应该能够在端口部分为服务类型= NodePort或LoadBalancer指定“ nodePort”:
Integer
因此,我当然使用以下k8s配置文件进行了尝试:
nodePort:
The port on each node on which this service is exposed when type=NodePort or
LoadBalancer. Usually assigned by the system. If specified, it will be
allocated to the service if unused or else creation of the service will fail.
Default is to auto-allocate a port if the ServiceType of this Service
requires one.
Note that this Service will be visible as both <NodeIP>:spec.ports[*].nodePort and .spec.clusterIP:spec.ports[*].port. (If the --nodeport-addresses flag in kube-proxy is set, would be filtered NodeIP(s).)
与Helm一起部署时会产生以下错误:
apiVersion: v1
kind : Service
metadata:
name: haproxy
labels:
app : haproxy
env : {{ .Values.env | lower }}
annotations:
dns.alpha.kubernetes.io/external: "{{ .Values.externalUrl | lower }}"
service.beta.kubernetes.io/aws-load-balancer-ssl-cert : {{ .Values.sslcert | lower }}
service.beta.kubernetes.io/aws-load-balancer-ssl-ports : "443"
service.beta.kubernetes.io/aws-load-balancer-backend-protocol : http
service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout : "500"
service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags: "Environment={{ .Values.env | lower }},Type=k8s"
spec:
type : LoadBalancer
ports:
- name : https
port : 443
targetPort: 80
nodePort : 80
selector:
app : haproxy
env : {{ .Values.env | lower }}
我只需要能够通过在浏览器中输入节点的ip来访问haproxy服务,但是也许我放错了nodePort配置密钥。它应该放在配置文件中的其他位置吗?我尝试将其移动到“端口”部分下的各个位置,但这只会引发解析错误。
提前谢谢!我完全不知所措。
答案 0 :(得分:1)
我相信,如果您只是不尝试配置nodePort
,它将满足您的要求。
port
和targetPort
很重要:在您的情况下,它们指定端口443(在ELB或Kubernetes服务端点haproxy.default.svc.cluster.local
上)将转发到端口80中。荚。在您所描述的AWS环境中,nodePort
主要是一个副作用:您将使用ClusterIP
服务在Pod之间进行通信,而LoadBalancer
服务则用于您想要暴露在外部的东西。立即群集,通常不直接与节点建立连接。
a more specific limitation nodePort
必须在30000到32767之间;您不能使用它从节点发布任意端口,这就是为什么您遇到错误的原因。