文章目录
Service资源是Kubernetes中最核心的资源对象之一,其定义了一个统一访问的服务入口地址,客户端可以通过这个入口地址访问其背后的一组由Pod副本组成的集群实例。 Service与其后端Pod副本集群之间则是通过Label Selector标签选择器来实现动态注册和调度的。
1、为什么需要Service资源?
通过分析、识别并建模系统中所有服务为微服务—Kubernetes Service,最终我们的系统由多个提供不同业务能力而又彼此独立的微服务单元组成,服务之间通过TCP/IP进行通信,从而拥有了强大的分布式能力、弹性扩展能力、容错能力
既然每个Pod都会被分配一个单独的IP地址,而且每个Pod都提供了一个独立的Endpoint(Pod IP+ContainerPort)以被客户端访问,现在多个Pod副本组成了一个集群来提供访问。
Kubernetes 需要在每个Node上安装kube-proxy,kube-proxy进程其实就是一个智能的软件负载均衡器,它负责把对Service的请求转发到后端的某个Pod实例上,并在内部实现服务的负载均衡与会话保持机制。
Kubernetes发明了一个很巧明的设计,Service不是共用一个负载均衡器的IP地址,而是每个Service分配了一个全局唯一的虚拟IP地址,这个虚拟IP被称为Cluster IP。这样每个服务就变成了具备唯一IP地址的"通信节点",服务调用就变成了最基础的TCP网络通信问题
Pod的Endpoint地址会随着Pod的销毁和重新创建而发生改变,因为新的Pod地址与之前的旧的Pod不同。而Service一旦被创建,Kubernetes就会自动为它分配一个可用的Cluster IP,而且在Service的整个声明周期内,它的Cluster IP不会发生改变。所以只要将Service的name与Service的Cluster IP地址做一个DNS域名映射即可解决问题
2、Service资源如何管理Pod
1.service通过标签选择器关联至拥有相关标签的Pod对象
2.客户端向Service进行请求,而非直接请求Pod对象
3.Service默认类型为ClusterIP,还有ExternalName,NodePort,LoadBalancer和Headless,共5种类型
service配置字段的查看命令:
kubectl explain svc
1、ClusterIP
客户端Pod对象访问服务端Pod对象时不会进行源地址转换:
二者在同一主机时,源地址为客户端pod地址;
二者不在同一主机时,源地址为客户端pod所在节点的flannel或cni地址。
只能在集群内部被访问
2、NodePort
可以被集群外部访问到,节点的请求会DNAT到Serviceip,然后再调度至PodIP
3、LoadBalancer
需要结合公有云的LBAAS(需要付费),支持动态接入功能。
4、ExternalName
将集群外部Service引入集群内部供各客户端使用,需要设置标签选择器,并手动定义一个endpoint资源,指向外部的资源地址。
5、Headless
这是一个比较特殊的service类型,有时候,你没必要或者不需要负载均衡和一个对外提供服务的ip地址。
在这种情况下,你可以在.spec.clusterIp中定义None字段,来申明一个Headless Service。
他可以通过coredns组件内部的解析功能,以完成相关地址解析的支持作用。
此外,我们之后会讲到StatefulSet控制器,它就是基于Headless网络所构筑的。
3、Endpoints
endpoints为service中的网络端点,用于接收service发来的请求,并将其转发至相关的上游服务(deployment)。
1、命令补充
#API配置查看
kubectl explain endpoints
#endpoints信息查看
kubectl get endpoints -A
2、注意:自定义endpoints时,需要与service同名
[root@centos-1 dingqishi]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4d23h
ngx-new ClusterIP 10.96.232.218 <none> 80/TCP 2d5h
[root@centos-1 dingqishi]# kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.0.104:6443 4d23h
ngx-new 10.244.2.8:80,10.244.2.9:80 2d5h
4、创建Service
1、编写Service的Yaml
[root@centos-1 dingqishi]# cat > Lq-server.yaml <<EOF
kind: Service
apiVersion: v1
metadata:
name: Lq-server
namespace: Lq-server
spec:
selector:
app: Lq-server
type: NodePort
ports:
- protocol: TCP #仅支持TCP和UDP,不写默认TCP
port: 3017
targetPort: 5003
nodePort: 31122
EOF
参数 | 解释 |
---|---|
Port | port表示:service暴露在cluster ip(Seriver ip )上的端口,:port 是提供给集群内部客户访问service的入口。 |
NodePort | nodePort是kubernetes提供给集群外部客户访问service入口的一种方式(另一种方式是LoadBalancer,:nodePort 是提供给集群外部客户访问service的入口。 |
targetPort | targetPort很好理解,targetPort是pod上的端口,从port和nodePort上到来的数据最终经过kube-proxy流入到后端pod的targetPort上进入容器。 |
2、创建
[root@centos-1 dingqishi]# kubectl create -f Lq-server.yaml
service/Lq-server created
3、查看server详细信息
[root@centos-1 dingqishi]# kubectl get service --namespace=Lq-server
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
Lq-server NodePort 10.254.22.153 <none> 3017:31122/TCP 13m
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。