Kubernetes service资源-十
1、service工作模式
userspace、iptables、ipvs
userspace:1.1-
iptables: 1.10-
ipvs: 1.11+
资源清单的定义字段查询:
[root@master ~]# kubectl explain svc [root@master ~]# kubectl explain svc.spec ... clusterIP <string> #service的IP ports <[]Object> #把哪个端口与后端容器建立关联关系 selector <map[string]string> #关联到哪些pod资源上 sessionAffinity <string> #ClientIP:将同一个客户端的请求,始终发往同一个pod;None: 不生效 type <string> ExternalName, ClusterIP, NodePort, and LoadBalancer ... 类型: ExternalName, ClusterIP, NodePort, LoadBalancer ClusterIP:是k8s的默认服务。它给你一个集群内的服务,自动分配一个只能在集群内部访问的虚拟IP,集群内的其它应用都可以访问该服务。集群外部无法访问它。 NodePort: 服务是引导外部流量到你的服务的最原始方式。NodePort在所有节点(虚拟机)上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务。 LoadBalancer:服务是暴露服务到internet的标准方式。只能在Service上定义,它是一些特定公有云提供的负载均衡器,需要特定的云服务商支持(AWS、Azure),
它将给你一个单独的 IP 地址,转发所有流量到你的服务。
2、service资源清单定义
1、ClusterIP类型:
[root@master manifests]# vim redis-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: redis #service的名字
namespace: default
spec:
selector:
app: redis #选择拥有此标签的Pod
role: logstor
clusterIP: 10.97.97.97 #service的IP,不指定的话会动态分配
type: ClusterIP #type
ports:
- port: 6379 #service地址上的端口
targetPort: 6379 #容器上的端口
[root@master manifests]# kubectl apply -f redis-svc.yaml
2、NodePort类型
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
release: canary
clusterIP: 10.99.99.99
type: NodePort #type
ports:
- port: 80 #service地址上的端口
targetPort: 80 #容器上的端口
nodePort: 30080 #node节点的端口,不指定的话会动态分配
[root@master manifests]# kubectl apply -f myapp-svc.yaml
[root@master manifests]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10d
myapp NodePort 10.99.99.99 <none> 80:30080/TCP 25s
redis ClusterIP 10.97.97.97 <none> 6379/TCP 43m
然后再集群外就可以通过service访问pod了;
为service打补丁:
#为service打补丁,"sessionAffinity":"ClientIP":将同一个客户端的请求,始终发往同一个pod
[root@master manifests]# kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"ClientIP"}}'
3、
无头service(headless):
无头service,客户端直接访问的是pod的地址;
有头service,客户端访问的是service的地址;
[root@master manifests]# cat myapp-svc-headless.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: default
spec:
selector:
app: myapp
release: canary
clusterIP: None #clusterIP写为None,就表示无头;
ports:
- port: 80
targetPort: 80