第四课:尚硅谷K8s学习-Service网络学习
tags:
- golang
- 2019尚硅谷
categories:
- K8s
- Service
- Ingress
- NodePort
第一节 Service的定义
1.1 Service的概念
-
Kubernetes Service定义了这样一种抽象: 一个Pod 的逻辑分组,一种可以访问它们的策略. 它通常称为微服务。通常是通过Label Selector标签选的的方式,匹配一组Pod然后对外访问服务的机制。
-
Service能够提供负载均衡的能力,但是在使用上有以下限制:
- 只提供4层负载均衡能力(只能通过IP+端口转发实现负载均衡),而没有7层功能(默认不能通过主机名或域名方式负载均衡),但有时我们可能需要更多的匹配规则来转发请求,这点上4层负载均衡是不支持的
- 可以通过ingress方案添加七层负载均衡的能力
-
SVC基础导图-实现流程
1.2 Service的类型
-
Service在K8s中有以下四种类型
- Clusterlp: 默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP
- NodePort: 在ClusterlP基础上为Service在每台机器上绑定一个端口, 这样就可以通过NodelP:NodePort来访问该服务
- LoadBalancer: 在NodePort的基础上,借助cloud provider创建一 个外部负载均衡器,并将请求转发到NodeIP: NodePort
- ExternalName: 把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有kubernetes 1.7或更高版本的kube-dns才支持
-
Clusterlp类型:other Pod通过集群内部ip访问到后面的pod, 并且实行负载均衡的方案。
-
NodePort类型:在每个物理机上绑定个端口,如果有一个宕机不会影响服务访问。
-
LoadBalancer类型:引入云供应商的服务(负载路由器的解决方案)接口即可。需要独立收费
-
ExternalName类型
1.3 Service的代理模式分类
-
在Kubernetes集群中,每个Node运行一个kube-proxy进程。kube- proxy负责为Service 实现了一种VIP (虚拟IP)的形式,而不是ExternalName的形式。在Kubernetes v1.0版本,代理完全在userspace。
-
在Kubernetes v1.1版本,新增了iptables代理,但并不是默认的运行模式。从Kubernetes v1.2起,默认就是iptables代理。在Kubernetes v1.8.0-beta.0中,添加了ipvs代理。在Kubernetes 1.14版本开始默认使用ipvs代理
-
在Kubernetes v1.0版本,Service 是“4层”(TCP/UDP overIP)概念。在Kubernetes v1.1版本,新增了Ingress API (beta 版),用来表示“7层”(HTTP) 服务
-
为何不使用round-robin DNS? DNS会在系统中进行缓存。。。就起不到负载均衡的效果。。。
-
userspace代理模式:每次访问都需要kube-proxy进行代理,而且kube-apiserver也监控kube-proxy进行服务更新和端点维护,所以kube-proxy的压力就会很大。
-
iptables代理模式:访问直接由防火墙iptables调度完成,不需要经过kube-proxy调度。大大提升速度,提到kube-proxy的稳定性。
-
ipvs代理模式(现在的标准):kube-proxy 会监视Kubernetes Service 对象和Endpoints,调用netlink 接口以相应地创建ipvs规则并定期与Kubernetes Service对象和Endpoints 对象同步ipvs规则,以确保ipvs状态与期望一致。访问服务时,流量将被重定向到其中一个后端Pod
- 查看ipvs命令: ipvsadm -Ln
- 与iptables类似,ipvs 于netfilter的hook功能,但使用哈希表作为底层数据结构并在内核空间中工作。这意味着ipvs可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外,ipvs为负载均衡算法提供了更多选项,例如:
- rr:轮询调度
- lc:最小连接数
- dh:目标哈希
- sh:源哈希
- sed:最短期望延迟
- nq:不排队调度
第二节 Service的实验讲解
2.1 Service实验内容
-
clusterIP主要在每个node节点使用iptables,将发向clusterIP对应端口的数据,转发到kube-proxy中。然后kube-proxy自己内部实现负载均衡的方法,可以查询到这个service下对应pod的地址和端口,进而把数据转发给对应的pod的地址和端口。
-
为了实现图上的功能,主要需要以下几个组件的协同工作:
- apiserver 用户通过kubectl命令向apiserver发送创建service的命令,apiserver接收到请求后将数据存储到etcd中
- kube-proxy kubernetes的每个节点中都有一个叫做kube-porxy的进程,这个进程负责感知service,pod的变化,并将变化的信息写入本地的iptables规则中
- iptables 使用NAT等技术将virtualIP的流量转至endpoint中
2.2 Service实验yaml文件
- 创建 myapp-deploy.yaml 文件。 通过Deployment 部署了 3 个 Pod 副本
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
release: stabel
template:
metadata:
labels:
app: myapp
release: stabel
env: test
spec:
containers:
- name: myapp
image: hub.qnhyn.com/library/myapp
imagePullPolicy: IfNotPresent
ports