Kubernetes 服务发现使用介绍

一、基本介绍

Kubernetes 中 Pod 是有生命周期的,每个 Pod 都有属于自己的 IP 地址。 但是当我们创建和删除 Pod 时,它的 IP 地址并不是固定的。那么也就是说,当我们把 Pod 的 IP 提供给前端应用时,服务不可用的几率相当较大。官方说明

不过呢,Kubernetes 定义了一种 Service 资源,每个 Service 都有一个固定的 VIP 地址。我们可以 通过标签匹配的方式,来将 Service 自动的绑定到合适的 Pod 应用上,并且当我们请求 Service 时,它还会将请求转发到后端的 Pod 应用。
在这里插入图片描述

  1. 每个 node 主机上都会运行 Kube-Proxy 组件,并通过 APIServer 来实时监控 Service 和 Endpoints 服务。
  2. 当用户创建出含有标签选择器的 Service 时,Endpoints 也会随着创建出来,用来存放 Service 匹配到 Pod 的 IP 地址。
  3. Kube-Proxy 监控到 Service 和 Endpoints 发生改变后,将会对 iptablesipvs 进行规则配置(来实现基于四层的路由转发)
  4. 最终,用户通过 Kube-Proxy 提供的路由转发,来实现服务的映射访问。

上面其实是针对于 Pod 应用的,还有一种情况是 Pod 要访问外部的应用,如:现在有三台主机组成的一个 RabbitMQ 集群。此时 Pod 访问其中任意一台主机的 RabbitMQ 服务都是可以的,但是这样的话并没有冗余性。

所以我们可以通过直接 创建出 Service,但不给它配置标签选择器。这样的话,Endpoints 也就不会自动的创建出来。 接下来,我们便可以自定义的来创建 Endpoints,这里我们只需要将 Endpoints 名称和 Service 名称配置成一样的即可。

Service,Endpoints 与 Pod 的关系:
在这里插入图片描述

二、Kubernetes 服务发现使用介绍

[root@k8s-master01 ~]# vim nginx-web.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-web
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-web
    image: nginx:1.18.0
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: index
  volumes:
  - hostPath:
      path: /app/nginx/html
    name: index
[root@k8s-master01 ~]# mkdir -p /app/nginx/html && echo "This is Nginx:80" > /app/nginx/html/index.html
[root@k8s-master01 ~]# kubectl create -f nginx-web.yaml

在这里插入图片描述

1.ClusterIP

通过使用 K8s 内部定义的 IP 地址,来实现集群内部的服务访问(因为是在内部定义的,所以在外部并不能直接访问)

[root@k8s-master01 ~]# vim nginx-web-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-web
spec:
  type: ClusterIP							# Service 的默认类型
  ports:
  - name: nginx-web
    port: 8080								# Service 的显示端口
    targetPort: 80							# Pod 的服务端口
  selector:
    app: nginx
[root@k8s-master01 ~]# kubectl create -f nginx-web-svc.yaml

验证:
在这里插入图片描述

2.Headless Service

无头服务,主要适用于那种不需要 ClusterIP 的服务,通过配置标签选择器,CoreDNS 便可以将 Service 的名称解析到 Pod 应用上。

[root@k8s-master01 ~]# vim nginx-web-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-web
spec:
  ports:
  - name: nginx-web
    port: 8080
    targetPort: 80
  clusterIP: "None"
  selector:
    app: nginx
[root@k8s-master01 ~]# kubectl create -f nginx-web-svc.yaml

在这里插入图片描述


因为 CoreDNS 组件主要就是用来给 Service 提供一个域名和 IP 的对应解析关系,但是我们这里配置的无头服务,也就是说这个 Service 并没有提供 ClusterIP 地址。所以我们下面解析的时候,直接就解析到 Service 匹配到的 Pod 应用上。
在这里插入图片描述
需要了解的是,当我们配置的是无头服务时,Kube-Proxy 并不会将这个无头服务加入到 iptablesipvs 规则中。不过,我们可以通过在容器内部,以域名的方式去访问。如上图,我们使用 nc 命令判断容器到 nginx-web 域名的连通性是正常的。

3.NodePort

通过在所有的 node 主机上映射一个端口,之后便可以通过任意一台 node 主机的 IP 地址和映射端口 来路由到 Service 上。

[root@k8s-master01 ~]# vim nginx-web-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-web
spec:
  type: nodePort
  ports:
  - name: nginx-web
    port: 8080
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginx
[root@k8s-master01 ~]# kubectl create -f nginx-web-svc.yaml

在这里插入图片描述
Service 除了上面那几种类型,还可以使用 LoadBalancer 和 ExternalName 类型。

  • LoadBalancer:在 NodePort 基础上,通过借助 Cloud Provider(云厂商)来创建外部负载均衡器,并将请求转发到 NodePort 上。
  • ExternalName:用于将集群外部的服务引入到集群内部中,从而达到可以在集群内部直接使用(通过 CoreDNS 实现)
[root@k8s-master01 ~]# vim nginx-web-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-web
spec:
  type: ExternalName
  ports:
  - name: nginx-web
    port: 80
    targetPort: 80
    externalName: www.baidu.com
[root@k8s-master01 ~]# kubectl create -f nginx-web-svc.yaml

在这里插入图片描述

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
Kubernetes是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。它具有以下特点和特性: 1. 便携性:Kubernetes支持公有云、私有云和混合云环境,可以在不同的云平台上运行。 2. 可扩展性:Kubernetes是基于插件和模块的,因此具有良好的可扩展性,可以根据需要添加新的功能和扩展。 3. 自动化:Kubernetes可以实现容器的自动部署、复制和管理,包括弹性缩放和扩展等功能。 4. 自动装箱:Kubernetes可以自动将容器分配到主机上运行,根据主机负载情况进行资源管理和调度。 5. 自动修复:当运行Kubernetes的主机宕机时,Kubernetes会在其他主机上重新创建该主机上的所有容器,以保证业务的连续性。 6. 水平扩展:Kubernetes支持根据资源负载率进行水平扩展,可以通过简单的命令进行扩展。 7. 服务发现Kubernetes通过KubeDNS实现了服务发现功能,可以方便地进行服务间的通信和调用。 8. 负载均衡:Kubernetes可以通过iptables和ipvs等方式实现负载均衡,确保请求能够平均分配到不同的容器上。 9. 自动发布和回滚:Kubernetes支持灰度更新应用程序,可以逐步更新系统中的应用,防止出现BUG影响整个集群,并且可以快速回滚到原来的系统。 10. 密钥配置管理:Kubernetes允许存储和管理敏感信息,如OAuth令牌和SSH密钥,可以安全地部署和更新密码和应用程序配置。 11. 存储管理:Kubernetes支持多种存储系统,包括节点本地存储、云服务商的云存储和网络存储等。 12. 批量处理执行:除了服务应用Kubernetes还支持批处理作业和持续集成(CI)等场景。 总之,Kubernetes是一个功能强大的容器管理平台,可以帮助用户简化容器化应用的部署、管理和扩展。\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [Kubernetes详解(一)——Kubernetes基本知识](https://blog.csdn.net/weixin_40228200/article/details/124226071)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Kubernetes 介绍](https://blog.csdn.net/GaLiCHaoFan1/article/details/127678109)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿许浪尽天涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值