k8s-service-基本概念与域名访问

service背景

客户端与pod通信,并得到实时响应。但是Pod因为以下几个特征,导致无法实现预期的通信:
1、Pod是短暂的,他们随时会启动或者关闭
2、Pod的ip地址是动态分布的
3、水平伸缩能力需要Pod对IP地址的透明化管理

service概念

通过创建service,可以为一组具有相同功能的容器应用提供一个统一的、不变的入口地址,并且将请求进行负载分发到后端的各个容器应用上。客户端不需要知道每个单独的提供服务的Pod的地址,这样,这些Pod就可以在集群中随时被创建、调度和移除。service从设计上看是一个虚拟概念,逻辑上代理后端的Pod。
k8s-service-基本概念与域名访问_第1张图片
内部和外部客户端是通过service连接到Pod:
对于外部客户端,无须关心服务器数量;对于内部客户端,例如前端Pod也通过service连接后端Pod,这样,后端Pod的动态移动也不会对前端Pod造成影响。
通过创建service,就可以通过一个单一稳定的IP地址访问到pod,在整个生命周期内这个地址保持不变。在服务后面的pod可能删除重建,它们的地址可能改变,数量也可能增减,但是始终可以通过服务的单一不变地址访问到这些pod。

特点

1、通过yaml文件创建service
2、三种方法向service发送请求:
(1)由已创建的Pod将请求发送给service;
(2)ssh远程登录到集群的某个节点上,使用curl命令;
(3)通过kubectl exec命令在一个已经存在的Pod中执行curl
3、service的会话亲和性:
(1)多次执行相同的请求,默认是在不同的Pod上被执行;
(2)通过设置sessionAffinity实现同一请求将转发到同一Pod上;
(3)支持两种形式的会话亲和性:None和ClientIP

k8s-service-基本概念与域名访问_第2张图片

域名访问

service可以实现“pod的发现和副本间负载均衡”,但访问service也需要ip和端口号,因此又引出了service的发现的问题。得益于kube-dns插件,通过修改容器的/etc/resolv.conf配置,使service以域名来访问。

原理

k8s将service的名称当做域名注册到kube-dns中。从图中可以发现,pod查询DNS是通过ServiceName.Namespace子域名来查询的。当service的默认namespace为default时,域名可以通过ServiceName成功查询。

k8s-service-基本概念与域名访问_第3张图片1、skydns是用于服务发现的开源框架,构建于etcd之上,作用是为pod提供DNS查询接口;
2、etcd是一种开源的分布式键值存储,在kube-dns中的作用是存储skydns的数据;
3、exec-healthz是k8s提供的一种辅助容器,多用于sidecar模式中。它的原理是定期执行指定的linux命令,从而判断当前pod中关键容器的健康状态。在kube-dns场景中的作用就是通过nslookup指令检查DNS查询服务的健康状态,livenessProbe通过访问exec-healthz提供的http api监控健康状态,并在出现故障时重启容器。

kubectl get all -n kube-system
#其他省略
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

service/kube-dns ClusterIP 10.96.0.10 > 53/UDP,53/TCP,9153/TCP 49d

域名测试

创建容器验证dns解析

apiVersion: v1
kind: Pod
metadata:
labels:
 name: busybox3
 role: master
name: busybox3
spec:
containers:
  - name: busybox3
    image: docker.io/busybox:1.28.4
    imagePullPolicy: IfNotPresent
    command:
    - sleep
    - "3600"
nslookup   kubia-service
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
​
Name:      kubia-service
Address 1: 10.107.249.0 kubia-service.ycloans-repayment-namespace.svc.cluster.local

执行nslookup service_name或service_cluster_ip即可显示出该服务的相关信息。
至此DNS服务已配置成功,以后可以直接用service_name来访问该service。 *如果某个service属于不同的namespace,那么在进行service查找时,需要补充该namespace的名称(service_name.namespace),组合成完整的域名,否则会查找失败。

你可能感兴趣的:(k8s,kubernetes,容器)