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:是 Kubernetes 的默认服务。它给你一个集群内的服务,集群内的其它应用都可以访问该服务。集群外部无法访问它。
     NodePort 服务是引导外部流量到你的服务的最原始方式。NodePort,在所有节点(虚拟机)上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务。
     LoadBalancer 服务是暴露服务到 internet 的标准方式。在 GKE 上,这种方式会启动一个 Network Load Balancer[2],它将给你一个单独的 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

猜你喜欢

转载自www.cnblogs.com/weiyiming007/p/12714224.html