2020-05-20【Kubernetes Service】
今日鸡汤:
人生就是一列开往坟墓的列车,
路途上具有很多站口,
没有一个人可以至始至终陪着你走完,
你会看到来来往往、上上下下的人。
如果幸运,会有人陪你走过一段,
当这个人要下车的时候,即使不舍,
也该心存感激,然后挥手道别。
因为,说不定下一站,
会有另外一个人会陪你走得更远。
520,祝大家都有陪你一起的人。
今天来学习Kubernetes重要的概念
——Service。
Kubernetes Service
通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上。
为什么需要Service?
直接通过Pod的IP地址和端口号就能够访问容器应用内的服务,但Pod的IP地址是不可靠的。另外,如果容器应用本身是分布式的部署方式,通过多个实例提供服务,就需要在这些实例前端设置一个负载均衡器实现请求的分发,也就是serivce。
Service支持哪几种访问方式?
可以通过在service定义的spec.type选择如下三种访问方式:
- ClusterIP:虚拟的服务IP地址,用于集群内部Pod的访问。
- NodePort:使用宿主机的端口,使能够访问各个Node的外部客户端通过Node的IP地址和端口号就能访问服务。
- LoadBalancer:使用外接负载均衡器完成到服务的负载分发。
有几种创建Service的方式?
第一种,通过kubectl expose
命令创建:比如kubectl expose rc webapp
(其中,webapp是一个RC资源)
第二种,通过配置文件定义service,再通过kubectl create
命令创建:如kubectl create -f webapp-svc.yaml
。(注意:需要用targetPort指定后端Pod的端口号)
通过kubectl get svc
查看创建好的service,通过Service的ClusterIP和port访问。
Kubernetes提供几种Service到Pod的负载分发策略?
两种,RoundRobin和SessionAffinity。
- RoundRobin(默认):轮询模式,轮询将请求发送给后端Pod。
- SessionAffinity:基于客户端IP地址进行会话保持。
如何从集群外部访问Pod?
将Pod的端口号映射到宿主机,以使客户端能够通过物理机访问容器应用。
- 设置Container级别的hostPort,将Pod端口号映射到物理机上。
spec:
containers:
- name: webapp
ports:
- containerPort: 8080
hostPort: 8081
这样,通过物理机IP和8081就可以访问Pod内的container。
- 设置Pod级别的hostNetwork=true,该Pod所有容器的端口号都直接映射到物理机上。
spec:
hostNetwork: true
containers:
- name: webapp
ports:
- containerPort: 8080
这样,通过物理机IP和8080就可以访问Pod内的container。
如何从集群外部访问Service?
将Service的端口号映射到宿主机,以使客户端能够通过物理机访问Service。
- 设置Service类型为NodePort,设置nodePort映射到物理机上。
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 8081
这样,通过物理机IP和nodePort 8081就可以访问Service。
- 设置LoadBalancer映射到云厂商的LoadBalancer地址。
spec:
type: LoadBalancer
loadBalancerIP: 78.11.24.19
ports:
- protocol: TCP
port: 80
targetPort: 9376
nodePort: 30061
clusterIP: 10.0.171.239
status:
loadBalancer:
ingress:
- ip: 146.148.47.155
这样,通过146.148.47.155就可以访问负载均衡器,由它来转发请求到后端Pod上。
这样,通过IP和8080就可以访问Pod内的container。