Kubernetes 系列:Service 和网络
2018-07-17
概要
Kubernetes 中, Service 用于对外暴露网络。
主要内容
关于 Service 和网络:
- type: Service 的类型,常用的有 NodePort、ClusterIP.
NodePort:Service 集群外部访问;ClusterIP:Service 集群内部访问;
- protocol:service 使用的协议,常用的有:
TCP、UDP、HTTP - name:为 port 定义一个name
- 名为
my-service.my-ns的 Service - 有一个协议为
TCP,名叫http的端口 - 则,对
_http._tcp.my-service.my-ns做一次 DNS SRV 查询来发现http的端口号。
- 名为
关于端口号 port、nodePort、targetPort:
- port:集群内部访问,ClusterIP 模式的 Service,暴露在cluster ip上的端口,
<cluster ip>:port,提供给集群内部访问service的入口。 - nodePort:集群外部访问,NodePort 模式的 Service,
<nodeIP>:nodePort- 还有一种方式,Service 也可以提供集群外部访问。(
LoadBalancer)
- 还有一种方式,Service 也可以提供集群外部访问。(
- targetPort:
pod的端口,从 port 和 nodePort 上到来的数据,经过kube-proxy,流入到后端pod的targetPort上进入容器。
port、nodePort总结:
port和nodePort都是 service 的端口port集群内访问nodePort集群外访问port和nodePort的数据,都需要经过反向代理kube-proxy流入后端pod的targetPod,从而到达pod上的容器内。
使用calico等overlay网络,可能导致hostport不可用,可以增加 hostNetwork: true 配置启用 host 模式 (在pod中定义)
关键问题
Kubernetes的网络方式主要解决以下几个问题:
- Pod 内部:紧耦合的容器之间通信,通过 Pod 和 localhost 访问解决。
- Pod 之间:Pod之间通信,建立
通信子网,比如隧道、路由,Flannel、Open vSwitch、Weave。 - Pod 和外部:Pod和Service,以及外部系统和Service的通信,引入Service解决。
Kubernetes的网络会给每个Pod分配一个IP地址,不需要在Pod之间建立链接,也基本不需要去处理容器和主机之间的端口映射。(疑问:什么含义?)
注意:Pod重建后,IP会被重新分配,所以内网通信不要依赖Pod IP;通过Service环境变量或者DNS解决。
参考资料
- Kubernetes Documentation
- Kubernetes 指南
- Kubernetes Service & Network
- 闲谈 Kubernetes 的主要特性和经验分享
- Labels and Selectors
原文地址:https://ningg.top/kubernetes-series-04-service-introduction/