该篇文章已经被专栏《从零开始学k8s》收录
上一篇文章:k8s核心技术service 点击跳转
创建 Service 资源
- #查看定义 Service 资源需要的字段有哪些?
- [root@k8smaster node]# kubectl explain service
- KIND: Service
- VERSION: v1
- DESCRIPTION:
- Service is a named abstraction of software service (for example, mysql)
- consisting of local port (for example 3306) that the proxy listens on, and
- the selector that determines which pods will answer requests sent through
- the proxy.
- FIELDS:
- apiVersion <string> #service 资源使用的 api 组
- kind <string> #创建的资源类型
- metadata <Object> #定义元数据
- spec <Object>
- status <Object>
-
- #查看 service 的 spec 字段如何定义?
- [root@k8smaster node]# kubectl explain service.spec
- KIND: Service
- VERSION: v1
- RESOURCE: spec <Object>
- DESCRIPTION:
- Spec defines the behavior of a service.
- https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
- ServiceSpec describes the attributes that a user creates on a service.
- FIELDS:
- clusterIP <string> #动态分配的地址,也可以自己在创建的时候指定,创建之后就改不了了
- externalIPs <[]string>
- externalName <string>
- externalTrafficPolicy <string>
- healthCheckNodePort <integer>
- ipFamilies <[]string>
- ipFamilyPolicy <string>
- loadBalancerIP <string>
- loadBalancerSourceRanges <[]string>
- ports <[]Object> #定义 service 端口,用来和后端 pod 建立联系
- publishNotReadyAddresses <boolean>
- selector <map[string]string> #通过标签选择器选择关联的 pod 有哪些
- sessionAffinity <string>
- sessionAffinityConfig <Object>
- #service 在实现负载均衡的时候还支持 sessionAffinity,sessionAffinity 什么意思?会话联系,默认是 none,随机调度的(基于 iptables 规则调度的);如果我们定义 sessionAffinity 的 client ip,那就表示把来自同一客户端的 IP 请求调度到同一个 pod 上
- topologyKeys <[]string>
- type <string> #定义 service 的类型
复制代码 Service 的四种范例
- #查看定义 Service.spec.type 需要的字段有哪些?
- [root@k8smaster node]# kubectl explain service.spec.type
- KIND: Service
- VERSION: v1
- FIELD: type <string>
- DESCRIPTION:
- type determines how the Service is exposed. Defaults to ClusterIP. Valid
- options are ExternalName, ClusterIP, NodePort, and LoadBalancer.
- "ExternalName" maps to the specified externalName. "ClusterIP" allocates a
- cluster-internal IP address for load-balancing to endpoints. Endpoints are
- determined by the selector or if that is not specified, by manual
- construction of an Endpoints object. If clusterIP is "None", no virtual IP
- is allocated and the endpoints are published as a set of endpoints rather
- than a stable IP. "NodePort" builds on ClusterIP and allocates a port on
- every node which routes to the clusterIP. "LoadBalancer" builds on NodePort
- and creates an external load-balancer (if supported in the current cloud)
- which routes to the clusterIP. More info:
- https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types
-
- 1、ExternalName:
- 适用于 k8s 集群内部容器访问外部资源,它没有 selector,也没有定义任何的端口和 Endpoint。
- 以下 Service 定义的是将 prod 名称空间中的 my-service 服务映射到 my.database.example.com
- kind: Service
- apiVersion: v1
- metadata:
- name: my-service
- namespace: prod
- spec:
- type: ExternalName
- externalName: my.database.example.com
- 当查询主机 my-service.prod.svc.cluster.local 时,群集 DNS 将返回值为 my.database.example.com 的 CNAME 记录。
- service 的 FQDN(带有主机名的域名) 是: <service_name>.<namespace>.svc.cluster.local
- my-service.prod.svc.cluster.local #访问这个域名就相当于解析my.database.example.com域名对应的服务(这是个数据库)
- #k8s内部的pod都可以用这个域名,用这个域名都可以访问k8s内部的pod。
- 2、ClusterIP:
- 通过 k8s 集群内部 IP 暴露服务,选择该值,服务只能够在集群内部访问,这也是默认的 ServiceType。
-
- 3、NodePort:
- 通过每个 Node 节点上的 IP 和静态端口暴露 k8s 集群内部的服务。
- 通过请求<NodeIP>:<NodePort>可以把请求代理到内部的 pod,每个service端口都会在物理机映射一个端口,访问物理机的端口会代理到service内部的ip和端口,然后代理到与service关联的podip与pod里容器(pod里容器和pod共享ip)的ip。
- Client----->NodeIP:NodePort----->ServiceIp:ServicePort----->PodIP:ContainerPort。
- 4、LoadBalancer:
- 使用云提供商的负载均衡器,可以向外部暴露服务。外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务。
复制代码 Service 的端口
- #查看 service 的 spec.ports 字段如何定义?
- [root@k8smaster node]# kubectl explain service.spec.ports
- KIND: Service
- VERSION: v1
- RESOURCE: ports <[]Object>
- DESCRIPTION:
- The list of ports that are exposed by this service. More info:
- https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies
- ServicePort contains information on service's port.
- FIELDS:
- appProtocol <string>
- name <string> #定义端口的名字
- nodePort <integer>
- #宿主机上映射的端口,比如一个Web应用需要被k8s集群之外的其他用户访问,那么需要配置type=NodePort,比如nodePort=30001,那么其他机器就可以通过浏览器访问scheme://k8s集群中的任何一个节点ip:30001即可访问到该服务。
- #例如:http://192.168.11.139:30001。如果在 k8s 中部署 MySQL 数据库,MySQL 可能不需要被外界访问,只需被内部服务访问,那么就不需要设置 NodePort
- port <integer> -required- #service 的端口,这个是 k8s 集群内部服务可访问的端口
- protocol <string> #端口协议
- targetPort <string> #service关联的目标pod具体容器的端口,是pod上的端口,从port和nodePort上来的流量,经过kube-proxy流入到后端pod的targetPort上,最后进入容器。与制作容器时暴露的端口一致(使用DockerFile中的EXPOSE)例如官方的 nginx 暴露 80 端口,在target写80,他就会找到所关联的pod里关联80端口的容器,然后代理。
复制代码 创建Service:type范例是ClusterIP
写在末了
创作不易,如果觉得内容对你有帮助,麻烦给个三连关注支持一下我!如果有错误,请在批评区指出,我会及时更改!
目前正在更新的系列:从零开始学k8s
感谢各位的观看,文章掺杂个人理解,如有错误请接洽我指出~
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |