《 Kubernetes进阶实战》一2.4.3部署Service对象
2.4.3 部署Service对象
简单来说,一个Service对象可视作通过其标签选择器过滤出的一组Pod对象,并能够为此组Pod对象监听的套接字提供端口代理及调度服务。
1.创建Service对象
“kubectl expose”命令可用于创建Service对象以将应用程序“暴露”(expose)于网络中。例如,下面的命令即可将myapp创建的Pod对象使用“NodePort”类型的服务暴露到集群外部:
~]$ kubectl expose deployments/myapp --type="NodePort" --port=80 --name=myapp
service "myapp" exposed
上面的命令中,--type选项用于指定Service的类型,而--port则用于指定要暴露的容器端口,目标Service对象的名称为myapp。创建完成后,default名称空间中的对象及其通信示意图如图2-12所示。
下面通过运行于同一集群中的Pod对象中的客户端程序发起访问测试,来模拟图2-12中的源自myapp Client Pod对象的访问请求。首先,使用kubectl run命令创建一个Pod对象,并直接接入其交互式接口,如下命令的-it组合选项即用于交互式打开并保持其shell命令行接口;而后通过wget命令对此前创建的Service对象的名称发起访问请求,如下命令中的myapp即Service对象名称,default即其所属的Namespace对象的名称:
$ kubectl run client --image=busybox --restart=Never -it -- /bin/sh
If you don't see a command prompt, try pressing enter.
/ # wget -O - -q http://myapp.default:80
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
创建时,Service对象名称及其ClusterIP会由CoreDNS附件动态添加至名称解析库当中,因此,名称解析服务在对象创建后即可直接使用。
类似于列出Deployment控制器及Pod对象的方式,“kubectl get services”命令能够列出Service对象的相关信息,例如下面的命令显示了Service对象myapp的简要状态信息:
~]$ kubectl get svc/myapp
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp NodePort 10.109.39.145 <none> 80:31715/TCP 5m
其中,“PORT(s)”字段表明,集群中各工作节点会捕获发往本地的目标端口为31715的流量,并将其代理至当前Service对象的80端口,于是,集群外部的用户可以使用当前集群中任一节点的此端口来请求Service对象上的服务。CLUSTER-IP字段为当前Service的IP地址,它是一个虚拟IP,并没有配置于集群中的任何主机的任何接口之上,但每个node之上的kube-proxy都会为CLUSTER-IP所在的网络创建用于转发的iptables或ipvs规则。此时,用户可于集群外部任一浏览器请求集群任一节点的相关端口来进行访问测试。
创建Service对象的另一种方式是使用“kubectl create service”命令,对应于每个类型,它分别有一个专用的子命令,例如“kubectl create service clusterip”和“kubectl create service nodeport”等,各命令在使用方式上也略有区别。
2.?查看Service资源对象的描述
“kubectl describe services”命令用于打印Service对象的详细信息,它通常包括Service对象的Cluster IP,关联Pod对象时使用的标签选择器及关联到的Pod资源的端点等,示例如下:
~]$ kubectl describe services myapp-svc
Name: myapp
Namespace: default
Labels: run=myapp
Annotations: <none>
Selector: run=myapp
Type: NodePort
IP: 10.109.39.145
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 31715/TCP
Endpoints: 10.244.3.2:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
上面命令的执行结果输出基本上可以做到见名而知义,此处需要特别说明的几个字段具体如下:
1)Selector:当前Service对象使用的标签选择器,用于选择关联的Pod对象。
2)Type:即Service的类型,其值可以是ClusterIP、NodePort和LoadBalancer等其中之一。
3)IP:当前Service对象的ClusterIP。
4)Port:暴露的端口,即当前Service用于接收并响应请求的端口。
5)TargetPort:容器中的用于暴露的目标端口,由Service Port路由请求至此端口。
6)NodePort:当前Service的NodePort,它是否存在有效值与Type字段中的类型相关。
7)EndPoints:后端端点,即被当前Service的Selector挑中的所有Pod的IP及其端口。
8)Session Aff?inity:是否启用会话粘性。
9)External Traff?ic Policy:外部流量的调度策略。
- 点赞
- 收藏
- 关注作者
评论(0)