Kubernetes 进阶
Service 控制器
Ingress 对象(对外暴露应用)
管理应用程序配置
K8s 数据卷与持久数据卷
再谈有状态应用部署:StatefulSet控制器
K8s 安全访问控制
K8s 部署利器Helm初探
Service 控制器
•
Service存在的意义
•
Pod与Service的关系
•
Service定义与创建
•
Service三种类型
•
Service代理模式
•
Service DNS名称
Service 存在的意义
Service引入主要是解决Pod的动态变化,提供统一访问入口:
•
防止Pod失联,找到提供同一个服务的Pod(服务发现)
•
定义一组Pod的访问策略(负载均衡)
Pod与Service的关系
•
Service通过标签关联一组Pod
•
Service为一组Pod提供负载均衡能力
Service定义与创建
创建service:
kubectl apply -f service.yaml
查看service:
kubectl get service
apiVersion: v1kind: Servicemetadata:labels:app: webname: webspec:type: ClusterIP # 服务类型ports:- port: 80 # Service端口protocol: TCP # 协议targetPort: 80 # 容器端口selector:app: web # 指定关联Pod的标签
定义Service
多端口Service定义:
对于某些服务,需要公开多个端口,
Service也需要配置多个端口定义,通过端口名称区分。
apiVersion: v1kind: Servicemetadata:name: webspec:type: ClusterIPports:- name: httpport: 80protocol: TCPtargetPort: 80- name: httpsport: 443protocol: TCPtargetPort: 443selector:app: web
多端口Service定义
Service三种常用类型
ClusterIP:默认,分配一个稳定的IP地址,即VIP,只能在集群内部访问。
spec:type: ClusterIPports:- port: 80protocol: TCPtargetPort: 80selector:app: web
NodePort:
在每个节点上启用一个端口来暴露服务,可以在集群
外部访问。也会分配一个稳定内部集群IP地址。
访问地址:<任意NodeIP>:<NodePort>
默认NodePort端口范围:30000-32767
spec:type: NodePortports:- port: 80protocol: TCPtargetPort: 80nodePort: 30009selector:app: web
NodePort:
会在每台Node上监听端口接收用户流量,在实际情
况下,对用户暴露的只会有一个IP和端口,那这么多台Node该使
用哪台让用户访问呢?
这时就需要前面加一个公网负载均衡器为项目提供统一访问入口了。
LoadBalancer:
与NodePort类似,在每个节点上启用一个端口来暴
露服务。除此之外,Kubernetes会请求底层云平台(例如阿里云、腾
讯云、AWS等)上的负载均衡器,将每个Node
([NodeIP]:[NodePort])作为后端添加进去。
Service代理模式
Service的底层实现主要有iptables和ipvs二种网络模式,决定了如何转发流量。
kubeadm方式修改ipvs模式:
# kubectl edit configmap kube-proxy -n kube-system
...
mode: “ipvs“
...
# kubectl delete pod kube-proxy-btz4p -n kube-system
注:
1、kube-proxy配置文件以configmap方式存储
2、如果让所有节点生效,需要重建所有节点kube-proxy pod
二进制方式修改ipvs模式:
# vi kube-proxy-config.yml
mode: ipvs
ipvs:
scheduler: "rr“
# systemctl restart kube-proxy
注:配置文件路径根据实际安装目录为准
流程包流程:客户端 ->NodePort/ClusterIP(iptables/Ipvs负载均衡规则) -> 分布在各节点Pod
查看负载均衡规则:
•
iptables模式
iptables-save |grep <SERVICE-NAME>
•
ipvs模式
ipvsadm -L -n
Service工作流程图
Iptables VS IPVS
Iptables:
•
灵活,功能强大
•
规则遍历匹配和更新,呈线性时延
IPVS:
•
工作在内核态,有更好的性能
•
调度算法丰富:rr,wrr,lc,wlc,ip hash...
Service DNS名称
CoreDNS:是一个DNS服务器,Kubernetes默认采用,以Pod部署在集群中,
CoreDNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析。
ClusterIP A记录格式:
<service-name>.<namespace-name>.svc.cluster.local