Service:一个Pod的逻辑分组,一种可以访问它们的策略 —— 通常称为微服务。这一组Pod能够被Service访问到,通常是通过Label Selector
Service能够提供负载均衡的能力,但是在使用上有以下限制:只提供 4 层负载均衡能力,而没有 7 层功能
在 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 over IP)概念。在 Kubernetes v1.1 版本,新增了Ingress API(beta 版),用来表示 “7层”(HTTP)服务
这种模式,kube-proxy 会监视 Kubernetes Service对象和Endpoints,调用netlink接口以相应地创建ipvs 规则并定期与 Kubernetes Service对象和Endpoints对象同步 ipvs 规则,以确保 ipvs 状态与期望一致。访问服务时,流量将被重定向到其中一个后端 Pod
与 iptables 类似,ipvs 于 netfilter 的 hook 功能,但使用哈希表作为底层数据结构并在内核空间中工作。这意味着 ipvs 可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外,ipvs 为负载均衡算法提供了更多选项,例如:
Service 在 K8s 中有以下四种类型
默认类型,自动分配一个仅 Cluster 内部可以访问的虚拟 IP
clusterIP 主要在每个 node 节点使用 iptables(ipvs),将发向 clusterIP 对应端口的数据,转发到 kube-proxy 中。然后 kube-proxy 自己内部实现有负载均衡的方法,并可以查询到这个 service 下对应 pod 的地址和端口,进而把数据转发给对应的 pod 的地址和端口
为了实现图上的功能,主要需要以下几个组件的协同工作:
#创建deployment
[root@k8s-master01 service]# cat myapp-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
release: stable
template:
metadata:
labels:
app: myapp
release: stable
env: test
spec:
containers:
- name: myapp
image: hub.dianchou.com/library/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
[root@k8s-master01 service]# kubectl create -f myapp-deploy.yaml
deployment.apps/myapp-deploy created
[root@k8s-master01 service]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
myapp-deploy 3/3 3 3 8s
[root@k8s-master01 service]# kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp-deploy-7cb48b56d7 3 3 3 11s
[root@k8s-master01 service]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-deploy-7cb48b56d7-9g2zm 1/1 Running 0 16s
myapp-deploy-7cb48b56d7-dxtbz 1/1 Running 0 16s
myapp-deploy-7cb48b56d7-gw4jn 1/1 Running 0 16s
[root@k8s-master01 service]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-deploy-7cb48b56d7-9g2zm 1/1 Running 0 23s 10.244.1.137 k8s-node01 <none> <none>
myapp-deploy-7cb48b56d7-dxtbz 1/1 Running 0 23s 10.244.1.138 k8s-node01 <none> <none>
myapp-deploy-7cb48b56d7-gw4jn 1/1 Running 0 23s 10.244.2.140 k8s-node02 <none> <none>
[root@k8s-master01 service]# curl 10.244.1.137
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
#创建service
[root@k8s-master01 service]# cat myapp-service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
type: ClusterIP
selector:
app: myapp
release: stable
ports:
- name: http
port: 80
targetPort: 80
[root@k8s-master01 service]# kubectl create -f myapp-service.yaml
service/myapp created
[root@k8s-master01 service]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 31h
myapp ClusterIP 10.98.224.21 <none> 80/TCP 30s
[root@k8s-master01 service]# curl 10.98.224.21
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@k8s-master01 service]# curl 10.98.224.21/hostname.html
myapp-deploy-7cb48b56d7-dxtbz
[root@k8s-master01 service]# curl 10.98.224.21/hostname.html
myapp-deploy-7cb48b56d7-9g2zm
[root@k8s-master01 service]# curl 10.98.224.21/hostname.html
myapp-deploy-7cb48b56d7-gw4jn在 ClusterIP 基础上为 Service 在每台机器上绑定一个端口,这样就可以通过NodeIp:NodePort 来访问该服务
在 NodePort 的基础上,借助 cloud provider 创建一个外部负载均衡器,并将请求转发到NodeIp:NodePort
把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有 kubernetes 1.7 或更高版本的 kube-dns 才支持
kubernetes(四)--service/ingress
原文:https://www.cnblogs.com/hujinzhong/p/12257146.html