浅析Kubernrtes服务类型(Service Types)

scofield 菜鸟运维杂谈

先上图


在Kubernetes集群中,service通过标签选择器选着对应的pod,然后对请求进行转发,看个动画,能直接了当体会到便签选择器

pod,endpoints,service三者关系


1、举个栗子说明
先看部署文件,主要看注释部分。因为文件太长,本文删除了yaml文件的部分字段

---apiVersion: apps/v1kind: StatefulSetmetadata:  name: gogs  labels:       # 定义StatefulSet的标签,为后面Service选择器提供标签    app: gogsspec:  serviceName: gogs  replicas: 1  selector:    matchLabels:  # 标签选择器,StatefulSet通过该标签选择pod      app: gogs  template:    metadata:      labels:    # 定义pod的标签        app: gogs    spec:      terminationGracePeriodSeconds: 180.......---apiVersion: v1kind: Servicemetadata:  name: gogs  labels:    app: gogsspec:  type: NodePort  ports:  - port: 3000    targetPort: 3000  selector:      # 标签匹配器,Service通过该标签匹配到对应的Pod    app: gogs

2、查看运行结果

[root@k8s-node001 ~]# kubectl  get po,ep,svcNAME                                READY   STATUS    RESTARTS   AGEpod/gogs-0                          1/1     Running   0          3d1hNAME                   ENDPOINTS                                                        AGEendpoints/gogs         100.68.150.197:3000                                              3d1hNAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGEservice/gogs         NodePort    10.106.102.74   <none>        3000:30526/TCP   3d1h

3、通过kubectl describe来查看pod,endpoints,service详情

4、从上图可以看出关联信息:
1、Pod和Endpoint的的IP是一致的,Endpoint是用来映射那些能对外提供服务的pod,如果pod运行状态不是running,就不会产出Endpoint
2、StatefulSet 和 Pod 的关系是通过 label-selector 来关联的
3、 Service可以简单理解为 Kubernetes 内置的一个 LoadBalancer,它的作用就是给多个 Pod 提供负载均衡。
4、Service通过标签 app: gogs来匹配它所要做负载均衡的 Pod

好了,对pod,endpoints,service三者关系做了简单介绍,接下来我们来介绍Kubernetes中的几种Service Type

ClusterIP


通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的 ServiceType
缺点:服务只能够在集群内部可以访问
栗子

apiVersion: v1kind: Servicemetadata:  name: gogs-clusteripspec:  type: ClusterIP  ports:  - port: 3000    targetPort: 3000  selector:    app: gogs

结果

NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGEgogs-clusterip   ClusterIP   10.104.1.9      <none>        3000/TCP         2m11s

可以看到10.104.1.9是集群内部的一个IP,在集群外是无法访问到的

NodePort


如果将 type 字段设置为 NodePort,则 Kubernetes将在指定的范围内分配端口(默认值:30000-32767)。每个节点将随机分配的端口代理到服务中。
举栗子

apiVersion: v1kind: Servicemetadata:  name: gogsspec:  type: NodePort  ports:  - port: 3000    targetPort: 3000  selector:    app: gogs

结果

NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGEgogs             NodePort    10.106.102.74   <none>        3000:30526/TCP   3d2h

这里可以看到,随机分配了端口30526,现在可以通过集群任意节点的IP+30526访问到该服务

Ingress


Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。流量路由由 Ingress 资源上定义的规则控制。
可以将 Ingress 配置为服务提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及提供基于名称的虚拟主机等能力。Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。
栗子

---apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: gogs-gogs  annotations:    kubernetes.io/ingress.class: nginxspec:  rules:  - host: gogs.test.cn    http:      paths:      - path: /        backend:          serviceName: gogs          servicePort: 3000

结果

NAME    CLASS    HOSTS             ADDRESS       PORTS   AGEgogs-gogs   <none>    gogs.test.cn   10.26.25.21   80      3d19h

现在通过域名gogs.test.cn就可以访问到gogs了
注意,gogs.test.cn需要自行添加DNS解析到ingress所在机器的IP

LoadBalancer


创建服务时,你可以选择自动创建云网络负载均衡器。这提供了一个外部可访问的 IP 地址, 可将流量分配到集群节点上的正确端口上,LoadBalancer一般都是公有云厂商提供,不需要自建,这里就介绍了。


PS:后续文章会同步到dev.kubeops.net

注:文中图片来源于网络,如有侵权,请联系我及时删除。

©著作权归作者所有:来自51CTO博客作者mb5fdb131956bf3的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Kubeadm 部署高可用 K8S 集群
  2. redis高可用集群架构总结
  3. redis 哨兵模式集群搭建
  4. MGR集群搭建(单主模式)
  5. openGauss集群搭建
  6. kubernetes生产实践之mysql
  7. k8s1.18高可用集群安装-超详细中文官方文档
  8. kubeadm初始化k8s集群延长证书过期时间
  9. k8s1.18多master节点高可用集群安装-超详细中文官方文档

随机推荐

  1. linux下开启mysql慢查询,分析查询语句
  2. Linux 的磁盘格式化、挂载、磁盘检验、df
  3. linux_locale的设定中LANG、LC_ALL、LANG
  4. Linux文件权限查看及修改命令chmod
  5. fedora下vim的安装
  6. Centos7 安装部署 Python-3.6.1
  7. 在Linux中使用PAM进行身份验证为什么它可
  8. 删除目录软链接注意事项
  9. linux网卡实现高可用:team链路聚合
  10. Linux网络设备驱动架構學習(三)