本篇内容介绍了“怎么使用Kubernetes服务暴露app”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
Kubernetes服务概述
Kubernetes Pods 是会挂掉的。 Pods 实际上是有生命周期的。 当一个工作节点死亡时,运行在该节点上的 Pods也会丢失。 ReplicaSet能通过创建新的pod来动态地将集群恢复到所需状态,以保持应用程序运行。 另一个例子是,考虑一个带有3个副本的图像处理后端。 这些副本是可以交换的; 前端系统不应该关心后端副本,甚至不应该关心Pod丢失和重新创建。 也就是说,Kubernetes集群中的每个Pod都有一个惟一的IP地址,甚至是同一个节点上的Pod,因此需要一种自动协调Pod之间更改的方法,以便您的应用程序继续运行。
Kubernetes中的服务是一个抽象概念,它定义了一组逻辑Pods和访问它们的策略。 服务支持独立的Pods之间的松散耦合。 服务是使用YAML (preferred) 或JSON定义的,就像所有Kubernetes对象一样。 服务所针对的pod集合通常由标签选择器决定。
虽然每个Pod都有一个惟一的IP地址,但是如果没有服务,这些IP不会暴露在集群之外。 服务允许应用程序接收流量。 通过在ServiceSpec中指定类型,可以以不同的方式公开服务:
ClusterIP(默认) -- 在集群中的内部IP上暴露服务。 这种类型使得服务只能从集群内部访问。
NodePort -- 使用NAT在集群中每个选定节点的相同端口上暴露服务。 使用 <NodeIP>:<NodePort>
让服务可以从集群外部访问。 Superset of ClusterIP.
LoadBalancer -- 在当前云中创建一个外部负载均衡器(如果支持),并向服务分配一个固定的外部IP。 Superset of NodePort.
ExternalName -- 通过返回带有名称的CNAME记录,使用任意名称(由规范中的externalName指定)暴露服务。 不使用代理。 这种类型需要v1.7或更高的 kube-dns
关于不同类型的服务的更多信息可以在使用源IP教程中找到。 也请看 Connecting Applications with Services.
另外,请注意,有些服务用例没有在 spec 中定义 selector
。 没有 selector 的服务被创建时也不会创建相应的端点对象。 这允许用户手动将服务映射到特定的端点。 没有选择器的另一种可能是您严格使用type: ExternalName。
服务和标签
服务在一组 Pods 之间路由流量。 服务是一种抽象,它允许pod死亡并且在Kubernetes中存在多复本而不会影响应用程序。 依赖于 Pods (如应用程序中的前端和后端组件)之间的发现和路由是由Kubernetes服务处理。 服务使用标签和选择器匹配一组pod,选择器是允许对Kubernetes中的对象进行逻辑操作的分组原语。 标签是附加到对象上的 key/value对,可以以任何方式使用:
为开发、测试和生产指定对象
嵌入版本标记
使用标记对对象进行分类
标签可以在创建时或以后附加到对象上。 它们可以随时被修改。 可以使用下面的环境练习服务暴露。
kubectl get
命令可以查看现有的Pods: kubectl get pods
kubectl get services
命令可以查现有的服务: kubectl get services
命令结果可以看到有一个名为kubernetes的服务,它是在minikube启动集群时默认创建的。
要创建一个新服务并将其公开给外部流量,我们将使用带有NodePort参数的expose命令 (minikube还不支持LoadBalancer选项): kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
,接着再运行kubectl get services查看服务。 我们现在有一个正在运行的服务叫做kubernetes-bootcamp。 在这里,我们看到服务接收到一个惟一的集群ip、一个内部端口和一个外部ip ( 节点的IP )。
为了查明外部打开了哪个端口(通过NodePort选项),我们将运行describe service命令 : kubectl describe services/kubernetes-bootcamp
创建一个名为 NODE_PORT的环境变量,该变量具有指定的节点端口的值 : export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}');echo "NODE_PORT=$NODE_PORT"
现在,我们可以使用curl、节点的IP和外部公开的端口测试应用程序是否在集群外部公开 curl $(minikube ip):$NODE_PORT
“怎么使用Kubernetes服务暴露app”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注天达云网站,小编将为大家输出更多高质量的实用文章!