Service存在的意义
pod IP不固定?
增加一个控制器负责动态获取Pod列表IP,动态更新到负载均衡器配置
Pod是多副本?
前面增加一个负载均衡器
为了解决上面两个问题,K8S引入Service。
kubectl create deployment nginx --image=nginx --dry-run -o yaml > zf.yaml
kubectl apply -f zf.yaml #创建pod
kubectl expose deployment nginx --port=80 --target-port=80 --dry-run=client -o yaml > service.yaml #创建service yaml
cat serice.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx
spec:
ports:
- port: 80 #负载均衡器端口
protocol: TCP #网络协议
targetPort: 80 #容器中服务的端口
selector: #标签选择器,这里用来关联pod
app: nginx
负载均衡器四层和7层怎么理解?
四层是指传输层:基于IP+端口转发
七层应用层,基于应用层协议,例如HTTP(域名,cookie,request)
查看关联的Pod
如何查找关联pod的sevice
Kubectl get ep #模糊查找service
kubectl get pods -l app=nginx #精确查找关联的pod
service三种常用类型
ClusterIp:集群内部使用(默认)
NodePort:对外暴露应用
LoadBalancer:对外暴露应用,适用于公有云
访问pod
#任意节点IP+端口即可访问,没有指定类型默认clusterip,只能内部集群访问
curl 10.104.233.167
Nodeport类型
在每个节点上启用一个端口来暴露服务,可以在集群外部访问,也会分配一个稳定内部集群ip地址。 端口范围 : 30000-32767
创建nodeport类型svc
vim service2.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx2
spec:
type: NodePort #增加一行指定类型
ports:
- port: 80 #负载均衡器端口
protocol: TCP #网络协议
targetPort: 80 #容器中服务的端口
#nodePort:30001 #可以固定端口
selector: #标签选择器,这里用来关联pod
app: nginx
kubectl get svc #查看svc,可以看到刚才创建的svc,任意节点ip+32608都可以访问
LoadBalancer 类型
与nodeport 类型,在每个节点上启用一个端口来暴露鲁夫,除此之外,kubernetes会 请求底层云平台上的负载均衡器,将每个node作为后端添加进去。
#缺点:只支持公有云,因为他们有统一的api访问接口
service代理模式
1.userspace: k8s自带,效率低下
2.iptables : 默认实现的负载均衡
3.ipvs(lvs):
kubectl logs kube-proxy-wkdh4 -n kube-system #查看默认使用iptables代理模块!
更改代理模式
kubectl edit configmap kube-proxy -n kube-system
所有节点生效的话,需要更改所有节点,然后重建pod
二进制方式
vim kube-proxy-config.yaml
kubectl delete pod kube-proxy-wkdh4 -n kube-system #删除后自动拉起
更新过后可以看到ipvs
yum -y install ipvsadm #安装ipvs
ipvsadm -L -n #查看规则
iptables特点:
1.灵活,功能强大
2.规则遍历匹配和更新,呈线性时延
IPVS特点:
1.工作在内核态,有更好的性能
2.调度算法丰富,rr wrr lc wlc,ip hash....
#小规模,iptables够用,大规模pod,用ipvs。
service dns名称
CoreDns:是一个dns服务器,kubernetes默认采用,以pod部署在集群中,coredns服务监视kubernetes api 为每一个service创建dns记录用于域名解析。
工作流程
Ingress 为弥补nodeport 不足而生
nodeport 缺点:
一个端口只能一个服务使用,端口需要提前规划
只支持负载均衡4层协议
Ingress : 公开从集群外部到集群内服务的http和https路由的规则集合,而具体实现流量路由则是由Ingress负责
Ingress k8s中的一个抽象资源,给管理员提供一个暴露应用的入口定义方法
Ingress Controller 根据ingress生成具体的路由规则,并对pod负载均衡器
Ingress Controller有很多实现,我们这里采用官方维护的Nginx控制器。
项目地址:https://github.com/kubernetes/ingress-nginx
1.0创建ingress controller
#准备好service已经暴露的应用,我这里之前已经创建一个nginx pod作为示例
kubectl create deploy web --image=nginx
kubectl expose deploy web --port=80 --target-port=80 --type=NodePort
1.1下载ingress controller
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-
0.30.0/deploy/static/mandatory.yaml
# wget http://120.78.77.38/file/ingress-controller.yaml
修改YAML:
• 镜像地址修改成国内的:lizhenliang/nginx-ingress-controller:0.30.0
• 将Ingress Controller暴露,一般使用宿主机网络(hostNetwork: true)或者使用NodePort
#启动 ingress controller
kubectl apply -f ingress-controller.yaml
#检擦
kubectl get pods -n ingress-nginx
2.0 编写ingress控制器域
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: zhangfan
spec:
rules:
- host: www.zhangfan.com #域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web #svc名称
port:
number: 80 #端口
可以看到ingress控制器在cka-node节点上
3.0 测试ingress控制器
本地hosts添加一个域名解析
192.168.106.201 www.zhangfan.com
最终实现了如图的架构 使用域名80端口访问到pod
4.0 测试https
1、准备域名证书文件(来自:openssl/cfssl工具自签或者权威机构颁发)
2、将证书文件保存到Secret
kubectl create secret tls www.zhangfan.com \
--cert=www.zhangfan.com.pem \
--key=www.zhangfan.com-key.pem
3、Ingress规则配置tls
cat ingress-https.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: www.zhangfan.com
spec:
tls:
- hosts:
- web.aliangedu.cn #域名
secretName: www.zhangfan.com #Secret创建时的名字
rules:
- host: www.zhangfan.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
kubectl apply -f ingress-https.yaml #生成证书
再次访问该域名自动跳转到https www.zhangfan.com