service
service
暴露服务,以便可以访问,动态负载均衡,(容器环境,ip地址动态,)
Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。
service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)
service的类型:
ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。
NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个NodeIP:nodePort都将路由到ClusterIP。
LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 :NodePort,此模式只能在云服务器上使用。
ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)。集群内部访问外部
联系之前的docker-Proxy学习
Service 是由 kube-proxy 组件,加上 iptables 来共同实现的.
kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的 iptables 规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源。
IPVS模式
的service,可以使K8s集群支持更多量级的Pod。
默认ClusterIP
实验环境
[root@server2 ~]# kubectl apply -f rs.yml
deployment.apps/deployment created
[root@server2 ~]# cat rs.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: myapp:v1
[root@server2 ~]# kubectl expose deployment deployment --port=80
service/deployment exposed
[root@server2 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
deployment ClusterIP 10.104.98.119 <none> 80/TCP 7s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9d
[root@server2 ~]# kubectl describe svc deployment
Name: deployment
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=nginx
Type: ClusterIP
IP Families: <none>
IP: 10.104.98.119
IPs: 10.104.98.119
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.71:80,10.244.1.72:80,10.244.1.73:80
Session Affinity: None
Events: <none>
通过iptables规则
[root@server2 ~]# iptables -t nat -nL | grep :80
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 /* default/deployment */ tcp to