七、kubernetes 1.29 之 Service 的工作原理及其使用
一、概念和原理
Kubernetes
Service
定义了这样一种抽象:一个Pod
的逻辑分组,一种可以访问它们的策略 —— 通常称为微服务。这一组Pod
能够被Service
访问到,通常是通过Label Selector
。
1、为什么需要
如图所示 的两个pod控制器, 创建了 nginx(处理静态资源) 和 tomcat(处理动态资源)的多个 pod ,,二者之间互相有通信,在nginx 中 有着 pod - ip 的信息,当有一个 tomcat挂了(nginx具有七层感知),不会去访问挂掉的 tomcat,但是新的 tomcat他不知道,没有 service处理起来比较麻烦
条件:就绪 和 标签匹配
加入 service后 tomcat死掉会被 service踢掉,然后将新的 tomcat-ip 抓取到负载均衡集群中,对于nginx来说,是无感的,只需要每次去service获取ip就好了
2、迭代
在 Kubernetes 集群中,每个 Node 运行一个
kube-proxy
进程。kube-proxy
负责为Service
实现了一种 VIP(虚拟 IP) 的形式。在 Kubernetes v1.0 版本,代理完全在 userspace。在 Kubernetes v1.1 版本,新增了 iptables 代理,但并不是默认的运行模式。从 Kubernetes v1.2 起,默认就是 iptables 代理。在 Kubernetes v1.8.0-beta.0 中,添加了 ipvs 代理。
3、工作原理
3.1 用户空间 userspace
kube - proxy
监听apiservice 将 service 变化修改本地的 iptables 规则
代理点前 节点 pod 来自用户的请求
pod数量多可能会有压力
3.2 iptables
kube - proxy
监听apiservice 将 service 变化修改本地的 iptables 规则
优点:
kube - proxy压力小、解耦
3.3 ipvs
与第二种的区别就是 将 iptables 换成 ipvs
ipvs是四层负载均衡,相对来说性能更好、效率高
3.4 将 iptables 修改为 ipvs
1、检查自己kubernetes 集群有无 ipvs
2、修改 kube - proxy 资源清单
kubectl edit configmap kube-proxy -n kube-system
将mode改成ipvs
3、根据标签选择器,干干掉pod
kubectl delete pod -n kube-system -l k8s-app=kube-proxy
完成了
下面 edit是去资源对象的 etcd 中修改资源清单 从根源上改
这样的发那是不永许你修改错误的值,如果错了第一次保存退出会停留在编辑页面,第二次才会退出,退出后报错且不会做改变且将错误的资源清单保存下来
kubectl edit dployment myapp
二、工作模式和使用
1、Kubernetes Service 类型
ClusterIP
类型:默认类型
功能:自动分配一个仅 Cluster 内部可以访问的虚拟IP
集群内部
NodePort
基础:在 ClusterIP 基础上
功能:为 Service 在每台机器 网卡 上绑定一个端口,供外部访问
访问方式:可以通过
<NodeIP>:<NodePort>
来访问该服务
LoadBalancer
基础:在 NodePort 的基础上,只能在云的环境中使用
功能:借助 cloud provider 创建一个外部负载均衡器
转发机制:将请求转发到
<NodeIP>:<NodePort>
多个调度器:解决nodeport无法提供的高可用
ExternalName
功能:把集群外部的服务引入到集群内部来,在集群内部直接使用
特点:没有任何类型代理被创建
版本要求:只有 Kubernetes 1.7 或更高版本的 kube-dns 才支持
域名别名的机制
2、Service - internalTrafficPolicy
3、Server - externalTrafficPolicy
nodeport
cluster:外部浏览器访问集群的任意ip都可以被负载均衡
Local:只会将路由,路由到当前节点所在的pod.
如果节点没有pod,这个请求会被丢弃
4、LVS 持久化链接
ipvsadm -A -t ip:80 -s rr -p 120
# 每次访问时间会被刷新
应用场景: HTTPS 请求
service.spec.sessionAffinity: ClientIP
三、实验
1、ClusterIP
组件协同
结构
资源清单
创 建 m y a p p - d e p l o y . y a m l 文 件
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-clusterip-deploynamespace: default
spec:replicas: 3selector:matchLabels:app: myapprelease: stabelsvc: clusteriptemplate:metadata:labels:app: myapprelease: stabelenv: testsvc: clusteripspec:containers:- name: myapp-containerimage: wangyanglinux/myapp:v1.0imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80readinessProbe:httpGet:port: 80path: /index1.htmlinitialDelaySeconds: 1periodSeconds: 3
创建 Service 信息
svc选择pod条件
就绪
标签子集匹配
同一名称空间
apiVersion: v1
kind: Service
metadata:name: myapp-clusteripnamespace: default
spec:type: ClusterIPselector:app: myapprelease: stabelsvc: clusteripports:- name: httpport: 80targetPort: 80
安装dns解析插件(没做)
yum -y install bind-utils
myapp-clusterip
apiVersion: v1
kind: Service
metadata:name: myapp-clusteripnamespace: default
spec:type: ClusterIPselector:app: myapprelease: stabelsvc: clusteripports:- name: httpport: 80targetPort: 80
2、会话保持( IPVS 持久化连接)
主要用在https的链接上
改回Cluster
2.1 不加
---> node01
-
客户
-
---> node 02
会在来回切换
2.2 加上
---> node01
-
客户
node 02
在规定时间内定向访问某个节点
ipvsadm -Ln
查看
有这个意味着开起了持久化
3、NodePort
deployment
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-nodeport-deploynamespace: default
spec:replicas: 3selector:matchLabels:app: myapprelease: stabelsvc: nodeporttemplate:metadata:labels:app: myapprelease: stabelenv: testsvc: nodeportspec:containers:- name: myapp-containerimage: wangyanglinux/myapp:v1.0imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80
service
apiVersion: v1
kind: Service
metadata:name: myapp-nodeportnamespace: default
spec:type: NodePortselector:app: myapprelease: stabelsvc: nodeportports:- name: httpport: 80targetPort: 80nodePort: 30010
这样就可以外部访问了
4、LoadBalancer
因为需要腾讯云、阿里云提供服务,所以这里不实验。以后用的时候去向阿里云申请
详细说明:https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/use-an-existing-slb-instance-to-expose-an-application
其中:labls标签选择是在集群内部做匹配什么的
annotations和第三方软件的某种约定
apiVersion: v1
kind: Service
metadata:annotations:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${YOUR_LB_ID}service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: 'true'labels:app: nginxname: my-nginx-svcnamespace: default
spec:ports:- port: 80protocol: TCPtargetPort: 80selector:app: nginxtype: LoadBalancer
这是一个用于阿里云环境的 LoadBalancer 类型 Service
需要将
${YOUR_LB_ID}
替换为实际的负载均衡器 ID服务将暴露 80 端口,并将流量转发到具有
app: nginx
标签的 Pod 的 80 端口注解
alicloud-loadbalancer-force-override-listeners: 'true'
表示强制覆盖现有监听器配置
5、ExternalNaml
ExternalNaml
apiVersion: v1
kind: Service
metadata:name: my-service-1namespace: default
spec:type: ExternalNameexternalName: www.baidu.com
作用是:访问这个service的时候,将请求转到百度
创建
访问,是百度
svc dns 域名
svcName.nsName.svc.domainName.
domaninNmae 默认:cluster.local.