清单举例:
    image.png

    [root@master manifests]# vim myapp-svc.yaml

    apiVersion: v1
    kind: Service
    metadata:
    name: myapp
    namespace: default
    spec:
    selector:
    app: myapp
    release: canary
    clusterIP: 10.99.99.99
    type: NodePort
    ports:
    - port: 80
    targetPort: 80
    nodePort: 31111 #节点端口设置非常用端口

    创建服务:
    image.png

    [root@master manifests]# kubectl apply -f myapp-svc.yaml

    service/myapp created

    [root@master manifests]# kubectl get svc

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    kubernetes ClusterIP 10.96.0.1 443/TCP 4d22h
    myapp NodePort 10.99.99.99 80:31111/TCP 8s
    redis ClusterIP 10.97.97.97 6379/TCP 10m

    测试访问:
    image.png

    [root@nfs ~]# while true;do curl http://10.0.0.11:31111/hostname.html;sleep 1;done

    myapp-deploy-65df64765c-czwkg
    myapp-deploy-65df64765c-czwkg
    myapp-deploy-65df64765c-hqmkd
    myapp-deploy-65df64765c-czwkg
    myapp-deploy-65df64765c-czwkg
    myapp-deploy-65df64765c-czwkg
    myapp-deploy-65df64765c-257gl
    myapp-deploy-65df64765c-czwkg
    myapp-deploy-65df64765c-257gl
    myapp-deploy-65df64765c-czwkg
    myapp-deploy-65df64765c-czwkg
    myapp-deploy-65df64765c-czwkg
    myapp-deploy-65df64765c-kvj92
    ………

    (进入轮训状态)

    会话保持机制:
    image.png

    Service资源还支持Session affinity(粘性会话)机制,可以将来自同一个客户端的请求始终转发至同一个后端的Pod对象,这意味着它会影响调度算法的流量分发功用,进而降低其负载均衡的效果

    因此,当客户端访问Pod中的应用程序时,如果有基于客户端身份保存某些私有信息,并基于这些私有信息追踪用户的活动等一类的需求时,那么应该启用session affinity机制

    Service affinity的效果仅仅在一段时间内生效,默认值为10800秒,超出时长,客户端再次访问会重新调度,该机制仅能基于客户端IP地址识别客户端身份,它会将经由同一个NAT服务器进行原地址转换的所有客户端识别为同一个客户端,由此可知,其调度的效果并不理想

    Service 资源 通过. spec. sessionAffinity 和. spec. sessionAffinityConfig 两个字段配置粘性会话,pec. sessionAffinity 字段用于定义要使用的粘性会话的类型,它仅支持使用“ None” 和“ ClientIP” 两种属性值

    image.png

    [root@master manifests]# vim myapp-svc-clientip.yaml

    apiVersion: v1
    kind: Service
    metadata:
    name: myapp
    namespace: default
    spec:
    selector:
    app: myapp
    release: canary
    sessionAffinity: ClientIP
    type: NodePort
    ports:
    - port: 80
    targetPort: 80
    nodePort: 31111

    image.png
    重新应用之后,再测试一下,看看会话是否被保持住:

    [root@nfs ~]# while true;do curl http://10.0.0.11:31111/hostname.html;sleep 1;done

    myapp-deploy-65df64765c-257gl
    myapp-deploy-65df64765c-257gl
    myapp-deploy-65df64765c-257gl
    myapp-deploy-65df64765c-257gl
    myapp-deploy-65df64765c-257gl
    myapp-deploy-65df64765c-257gl
    myapp-deploy-65df64765c-257gl
    myapp-deploy-65df64765c-257gl
    myapp-deploy-65df64765c-257gl
    myapp-deploy-65df64765c-257gl

    image.png
    也可以使用patch来进行修改:

    kubectl patch svc myapp -p ‘{“spec”:{“sessionAffinity”:”ClusterIP”}}’ #session保持,同一ip访问同一个pod

    kubectl patch svc myapp -p ‘{“spec”:{“sessionAffinity”:”None”}}’ #取消session

    总结:从以上例子,可以看到通过NodePort方式已经实现了从集群外部端口进行访问,实践中并不鼓励用户自定义使用节点的端口,因为容易和其他现存的Service冲突,建议留给系统自动配置

    相关文档:https://blog.csdn.net/kenkao/article/details/87375435
    相关文档:https://www.cnblogs.com/wlbl/p/10694316.html