K8s三种网络: node network
pod network
cluster network --> virtual ip --> service 规则
service: kube-proxy监控api-server,api-server数据发生改变,相应的kube-proxy就会改变service规则,
service有三种工作模式:userspace, 1.1版本之前
iptables, 1.10之前
ipvs ,1.11版本之后
kubectl delete svc redis
service service名
kubectl explain service
kubectl explain service.spec
service类型:
ExternalName, 集群外的服务引用到集群内 外部服务名称
ClusterIP, 仅用于集群内通信
NodePort, 用于与集群外通信
LoadBalancer,部署到虚拟机,虚拟机工作在环境中,云环境支持负载均衡,lbaas, 类似nodeport负载均衡
清单文件创建service
ClusterIP, 仅用于集群内通信 访问时service先指向clusterip,在指向pod ip
kubectl explain service.spec.ports
vim redis-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: redis service名称
namespace: default
spec:
selector: 选取的pod标签 关联到pod
app: redis
role: logstor
clusterIP: 10.97.97.97 设定clusterip
type: ClusterIP 选取clusterip类型的service
ports:
- port: 6379 service端口 引用的service端口与后端pod建立关系
targetPort: 6379 指定的pod的端口
kubectl apply -f redis-svc.yaml 创建service
kubectl get svc 查询service
kubectl describe svc redis service-redis的详细信息
Endpoints: 10.244.1.66:6379 后端地址,即关联的pod地址
资源记录:SVC_NAMe.NS_NAME.DOMAIN.LTD.
服务名 名称空间 集群域名后缀
集群域名默认后缀 svc.cluster.local.
比如:刚创建的service 名为redis, 那么域名为:
redis.default.svc.cluster.local.
直接访问域名就可以访问服务了,并解析pod地址了
nodeport默认分配端口 30000-32797
创建nodeport服务
引用前面deploy控制器myapp-deploy创建的pod
cp redis-svc.yaml myapp-svc.yaml
vim myapp-svc.yaml
apiVersion: v1
kind: Service
metadata: service属性
name: myapp
namespace: default
spec:
selector:
app: myapp 关联pod
release: canary
clusterIP: 10.99.99.99 指定clusterip
type: NodePort 指定service类型
ports:
- port: 80 service端口
targetPort: 80 关联的pod端口
nodePort: 30080 外部访问node的端口
kubectl create -f myapp-svc.yaml 创建service
kubectl get svc
80:30080/TCP
service端口80 映射 node端口30080
测试
在外面访问任一节点 比如192.168.81.10:30080
while true; do curl http://192.168.81.30:30080/hostname.html;sleep 1;done
ExternalName
集群内的pod访问集群外的资源,
kubectl explain svc.spec.externalName
sessionAffinity
kubectl explain svc.spec
sessionAffinity <string> 保持会话IP 同一个IP请求始终发往同一个后端pod
kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"ClientIP"}}'
kubectl describe svc myapp 查看是否加上sessionAffinity
kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"None"}}' 改回None,就不会始终发往一个pod
headless 无头service 无头服务 service直接指向pod IP
cp myapp-svc.yaml myapp-headless.yaml
vim myapp-headless.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: default
spec:
selector:
app: myapp
release: canary
clusterIP: None
ports:
- port: 80
targetPort: 80
kubectl apply -f myapp-headless.yaml
kubectl get svc
安装dig命令 yum install bind-utils -y
查询coreDns
kubectl get svc -n kube-system
解析service
dig -t A myapp-svc.default.svc.cluster.local. @10.96.0.10
服务域名 @指定coredns
解析的结果为后端pod的ip
对于前面service类型为clusterip的
dig -t A myapp.default.svc.cluster.local. @10.96.0.10
解析结果为CLUSTER-IP