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
原文地址:https://www.cnblogs.com/weiyiming007/p/12714224.html