清单举例:
[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 #节点端口设置非常用端口
创建服务:
[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
myapp NodePort 10.99.99.99
redis ClusterIP 10.97.97.97
测试访问:
[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
………
(进入轮训状态)
会话保持机制:
Service资源还支持Session affinity(粘性会话)机制,可以将来自同一个客户端的请求始终转发至同一个后端的Pod对象,这意味着它会影响调度算法的流量分发功用,进而降低其负载均衡的效果
因此,当客户端访问Pod中的应用程序时,如果有基于客户端身份保存某些私有信息,并基于这些私有信息追踪用户的活动等一类的需求时,那么应该启用session affinity机制
Service affinity的效果仅仅在一段时间内生效,默认值为10800秒,超出时长,客户端再次访问会重新调度,该机制仅能基于客户端IP地址识别客户端身份,它会将经由同一个NAT服务器进行原地址转换的所有客户端识别为同一个客户端,由此可知,其调度的效果并不理想
Service 资源 通过. spec. sessionAffinity 和. spec. sessionAffinityConfig 两个字段配置粘性会话,pec. sessionAffinity 字段用于定义要使用的粘性会话的类型,它仅支持使用“ None” 和“ ClientIP” 两种属性值
[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
重新应用之后,再测试一下,看看会话是否被保持住:
[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
也可以使用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