service:
工作模式3种:
userspace(1.1ver) --> iptables(1.10ver) --> ipvs(1.11ver);
要使用ipvs在安装初始化时指定,--feature-gates=SupportIPVSProxyMode=true;
要经2级调度;
4层调度,无法拆https报文,k8s有引入集群外部流量的方式ingress,7层调度;
service到pod,中间有endpoints(也是k8s对象),由endpoints连至后端,可为service手动创建endpoints资源;
类型,kubectl explain svc.spec.type:
ClusterIP #如果定义为None,则为headless server
NodePort #以ClusterIP为基础,client --> NodeIP:NodePort --> ClusterIP:ServicePort --> PodIP:containerPort
LoadBalancer #在NodePort上的增强,适用于云环境主机及IaaS层的loadbalance
ExternalName #适用于k8s集群内的pod client访问互联网
资源记录:
SVC_NAME.NS_NAME.DOMAIN.LTD.
svc.cluster.local.
redis.default.svc.cluster.local.
service_name: cluster_ip #可解析
client pod(user space) --> service IP(kernel space) --> kube-proxy(user space)封装报文代理至kernel space --> service IP(kernel space)--> 由kube-proxy负责调度,kube-proxy是工作在用户空间的进程,要转发2次效率低;
client pod --> service IP中的iptables规则直接调度;
k8s 1.11ver默认用ipvs,如果没有则自动降级为iptables;
如果后端的pod资源发生改变,如service标签选择器适用的pod多了1个,多的信息会立即反应到master中api server上的etcd中,kube-proxy会监控到这些变化,并将其转为iptables规则,这个过程是实时的;
kubectl explain svc
kubectl explain svc.spec
#
ports,service ip:port与后端容器的服务建立关联关系,port|targetPort,port为service的,targetPort为容器的,nodePort在使用NodePort类型时才用到;
selector关联到哪些pod资源上;
clusterIP,10.96.0.0/12,在此网段内可自定义,注意冲突,不建议自定义;若clusterIP定义为None或"",表示headless无头service,即service_name直接解析至后端pod,而不是server_name解析至clusterIP
type,默认ClusterIP|NodePort|LoadBalancer|ExternalName
sessionAffinity <string> #默认None
例:
vim redis-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: default
spec:
selector:
app: redis
role: logstore
clusterIP: 10.97.97.97
type: ClusterIP
ports:
- port: 6379
targetPort: 6379
kubectl apply -f redis-svc.yaml
kubectl get svc
kubectl describe svc redis #service到pod,中间有endpoints(也是k8s对象),由endpoints连至后端,可为service手动创建endpoints资源
kubectl get pods --show-labels
例:
vim myapp-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp #myapp-svc
namespace: default
spec:
selector:
app: myapp
release: canary
,无头service,statefulSet要用到
去掉
ports:
- port: 80
targetPort: 80
可以不指定,在宿主机上的端口会在30000-32797之间随机分配
kubectl apply -f myapp-svc.yaml
kubectl get svc
while true; do curl http://172.20.0.66:30080/hostname.html; sleep 1; done #要做2级转发,node port-->service port-->pod port
kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"ClientIP"}}'
kubectl describe svc myapp
kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"None"}}'
dig -t A myapp-svc.default.svc.cluster.local. @10.96.0.10
kubectl get svc -n kube-system
kubectl get svc