一、内容回顾
二、service是什么
三、pod与service的关系
四、service定义与创建
五、service三种类型
六、service代理模式
七、service DNS名称
一、内容回顾
1、k8s基本使用
a、k8s集群架构及各个组件作用
b、kubectl管理集群
c、namespace 资源隔离,并进一步实现权力控制
2、Pod
a、基本管理: 存在意义,健康检查,容器配额,环境变量
b、调度:创建一个pod工作流程并扩展创建一个deployment工作流程;nodeSelector/nodeAffinity,污点和污点容忍;resource,request
3、常用控制器
a、deployment:部署无状态应用(如微服务,API,网站),滚动升级,RS控制器(管理Pod副本数,管理发布和回滚)
b、daemonset:在每个节点部署一个pod
c、job、cronjob:一次性任务和定时任务
二、service是什么
1、主要解决Pod的动态变化,提供统一访问入口:
a、防止Pod失联,准备找到提供同一个服务的Pod(服务发现)
b、定义一组Pod的访问策略(负载均衡)
三、pod与service的关系
a、service通过标签关联一组pod
b、service使用iptables或者ipvs为一组pod提供负载均衡能力
c、获取所有标签
# kubectl get pods --show-labels
d、获取指定标签
# kubectl get pods -l app=dev-market-trade
注:
service中的标签通过与pod中的
template:
metadata:
labels:
这个标签一致,达到servcie关联到相应的pod。
四、service定义与创建
1、定义
2、创建
# kubectl apply -f service.yaml
3、查看service
# kubectl get service
4、查看帮助
# kubectl expose --help
5、获取一个标准的service文件
# kubectl get deployment
# kubectl expose deployment dev-market-administration-intelligent-oilgas-system --port=80 --target-port=80 --dry-run=client -o yaml > /tmp/serivce.yaml
删除标红字段即为标准serviceyaml文件
6、删除services
# kubectl get svc
# kubectl delete svc dev-market-administration-intelligent-oilgas-system
7、查看service关联的后端ip及端口
五、service三种常用类型
1、clusterIP:集群内部使用
默认,分配一个稳定的IP地址,即vip,只能在集群内部访问。
解决的是如何让集群内部访问(node/pod)
2、NodePort:对外暴露应用(集群外)
解决的是如何让集群外部访问。但是也会创建一个clusterip。
在每个节点上启用一个端口来暴露访问,可以在集群外访问。也会分配一个稳定内部集群ip地址。
访问地址:任意NodeIp:NodePort
端口范围:3000-32767
nodePort会在每台node上监听端口接收用户流量,在时间情况下,对用户暴露的只会有一个ip和端口,那这么多台Node该使用那台让用户访问?这时可以在其前面加一个公网负载均衡器为项目提供统一访问入口。
3、LoadBalancer:对外暴露应用,使用公有云
与Nodeport类似,在每个节点上启用一个端口来暴露访问。除此之外,k8s会请求底层云平台(如阿里云,腾讯云等)上的负载均衡器,将每个Node([NodeIP]:[NodePort])作为后端添加进去。
六、service代理模式
1、iptables
2、ipvs
Service的底层实现主要有iptables和ipvs两种网络模式,决定了如何转发流量。
3、kubeadm代理模式修改ipvs
# # kubectl edit configmap kube-proxy -n kube-system
# kubectl delete pod kube-proxy-9wgzb -n kube-system 《删除即重启,删除所有的即可》
注:
1、kube-proxy配置文件以configmap方式存储
2、如果让所有节点生效,需要重建所有kube-proxy pod
3、mode: 为空,默认为iptables。
4、二进制方式修改ipvs模式
# vi kube-proxy-config.yml
mode: ipvs
ipvs:
scheduler: "rr"
# systemctl restart kube-proxy
注:参考不同资料,文件名可能不同
5、数据包流程
客户端--》NodePort/ClusterIP(iptables/Ipvs负载均衡规则)--》分布在各个节点Pod
6、 查看负载均衡规则
# yum install ipvsadm
a、iptable模式
# iptables-save |grep <SERVICE-NAME>
b、ipvs模式
# ipvsadm -L -n <查看所有规则>
7、ipvs
a、概念:
virtual server: 虚拟服务器(相当于nginx的一个server)
real server:真实服务器,指的后端服务
数据流:user--》kube-ipvs0(virtual server) -->pod(分布在每个节点)
8、小结工作流程
9、iptables VS ipvs
1、iptables:
a、灵活,功能强大
b、规则便利匹配和更新,呈线性时延
2、ipvs<建议>
a、工作在内核态,有更好的性能
b、调度算法丰富: rr,wrr,lc, wlc, ip, hash .......
七、service DNS名称
coreDNS: 是一个DNS服务器,kubenetes默认采用,以Pod部署在集群中,CoreDNS服务监视kubernetes API,为每一个Service创建DNS记录用于域名解析。
CoreDNS YAML文件:
https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns
ClusterIP A记录格式: <service-name>.<namespace-name>.svc.cluster.local
示例:my-svc.my-namespace.svc.cluster.local
测试:
解析时,建议带命名空间。默认只解析当前命名空间。