我有一个看起来像这样的kubernetes文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: <some_name>
spec:
replicas: 1
template:
spec:
dnsPolicy: ClusterFirst
restartPolicy: Always
terminationGracePeriodSeconds: 30
containers:
- image: <some_image>
imagePullPolicy: Always
name: <some_name>
env:
- name: ES_HOST
value: blahblah.us-west-2.es.amazonaws.com
- name: ES_PORT
value: "443"
- name: DATALOADER_QUEUE
value: some_sqs_queue
- name: AWS_DEFAULT_REGION
value: us-west-2
...<bunch of variable>
limits: &main_limits
cpu: 500m
memory: 256Mi
requests: *main_limits
如果我想将此暴露给外界流量,是因为说我的应用程序使用端口上的prometheus暴露了应用程序指标,那么我该如何将该端口暴露给外界?
我的应用程序有这两行来启动需要公开的http服务器:
METRICS_PORT=9100
start_http_server(METRICS_PORT)
那是一个普罗米修斯服务器
答案 0 :(得分:0)
在本地网络之外公开Prom指标有点奇怪,但除此之外,您还可以使用服务。通常为LoadBalancer类型,但在特殊情况下有时为NodeIP。查看the documentation了解更多信息。
答案 1 :(得分:0)
尝试以下示例
apiVersion: v1
kind: Service
metadata:
name: hello
spec:
selector:
app: hello
ports:
- protocol: "TCP"
port: 80
targetPort: 80
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello
spec:
selector:
matchLabels:
app: hello
replicas: 1
template:
metadata:
labels:
app: hello
spec:
containers:
- name: nginx
image: nginx
您应该可以在http://HOST_IP:NODE_PORT上访问hello服务
答案 2 :(得分:0)
有一些方法可以在Kubernetes中公开您的应用程序。
对于在同一群集中运行的其他应用程序(类型:ClusterIP),服务可以用于内部公开,将主机端口外部绑定到您的应用程序节点(类型:NodePort)或对节点之间的流量进行负载平衡(类型:LoadBalancer) )
ClusterIP :在群集内部IP上公开服务。选择此值将使服务仅可从群集内访问。这是默认的ServiceType。
NodePort :在静态端口(NodePort)的每个节点的IP上公开服务。将自动创建NodePort服务路由到的ClusterIP服务。您可以通过请求:。
从集群外部联系NodePort服务。LoadBalancer :使用云提供商的负载平衡器在外部公开服务。自动创建外部负载均衡器路由到的NodePort和ClusterIP服务。
如果您使用的是云提供商,则可以使用服务类型 LoadBalancer ,则您的服务将从云提供商处获取外部IP,并且可以公开访问:
apiVersion: v1
kind: Service
metadata:
name: <<some name>>
spec:
selector:
app: my_app_name # << HERE
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
请注意,要使其正常工作,您需要在部署文件中添加selector
,以了解哪些Pod重定向了请求。像这样:
apiVersion: apps/v1
kind: Deployment
metadata:
name: <some_name>
spec:
selector:
app: my_app_name # <= SELECTOR HERE
replicas: 1
template:
...
要检查一切正常,请使用以下命令并检查EXTERNAL-IP
:
kubectl get svc <some_name>
参考:
https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types
https://kubernetes.io/docs/concepts/services-networking/service/#with-selectors
https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer
答案 3 :(得分:0)
通常,建议通过服务公开Pod,而不要直接考虑Pod的短暂性来公开Pod。 如KoopaKiller上文所述,公开服务的方式包括:
ClusterIP:在群集内部IP上公开服务,从而使服务只能从群集内部访问。为了您的目的,这还不够。
NodePort:在静态端口上公开每个节点IP上的服务。为此,您可以通过连接到服务的节点端口来从群集外部连接NodePort服务。
LoadBalancer:使用云提供商的负载平衡器在外部公开服务。这是在较大规模下使用的更安全的选择,但是请注意,某些负载均衡器的成本相当可观。在选择之前,您可能需要考虑到这一点。