开发者社区> rqbarzitsudte> 正文

Kubernetes 服务发现使用介绍

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

Kubernetes 服务发现使用介绍



一、基本介绍


二、Kubernetes 服务发现使用介绍


1.ClusterIP

2.Headless Service

3.NodePort


一、基本介绍



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


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


image.png


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


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


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


Service,Endpoints 与 Pod 的关系:


image.png


二、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


image.png


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


验证:


image.png


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


image.png


因为 CoreDNS 组件主要就是用来给 Service 提供一个域名和 IP 的对应解析关系,但是我们这里配置的无头服务,也就是说这个 Service 并没有提供 ClusterIP 地址。所以我们下面解析的时候,直接就解析到 Service 匹配到的 Pod 应用上。


image.png


需要了解的是,当我们配置的是无头服务时,Kube-Proxy 并不会将这个无头服务加入到 iptables 或 ipvs 规则中。不过,我们可以通过在容器内部,以域名的方式去访问。如上图,我们使用 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


image.png


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


image.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
29152 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
16443 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20695 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
14900 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
22354 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23580 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
36448 0
82
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载