k8s之ip和service总结

一. k8s 3种IP

Kubernetes集群里有三种IP地址,分别如下:

Node IP:Node节点的IP地址,即物理网卡的IP地址。
Pod IP:Pod的IP地址,即docker容器的IP地址,此为虚拟IP地址。
Cluster IP:Service的IP地址,此为虚拟IP地址。
Node IP
可以是物理机的IP(也可能是虚拟机IP)。每个Service都会在Node节点上开通一个端口,外部可以通过NodeIP:NodePort即可访问Service里的Pod,和我们访问服务器部署的项目一样,IP:端口/项目名

Pod IP
Pod IP是每个Pod的IP地址,他是Docker Engine根据docker网桥的IP地址段进行分配的,通常是一个虚拟的二层网络

同Service下的pod可以直接根据PodIP相互通信
不同Service下的pod在集群间pod通信要借助于 cluster ip
pod和集群外通信,要借助于node ip

Cluster IP
Service的IP地址,此为虚拟IP地址。外部网络无法ping通,只有kubernetes集群内部访问使用。

在kubernetes查询Cluster IP
kubectl -n 命名空间 get Service即可看到ClusterIP。

Cluster IP是一个虚拟的IP,但更像是一个伪造的IP网络,原因有以下几点

1)Cluster IP仅仅作用于Kubernetes Service这个对象,并由Kubernetes管理和分配P地址
2)Cluster IP无法被ping,他没有一个“实体网络对象”来响应
3)Cluster IP只能结合Service Port组成一个具体的通信端口,单独的Cluster IP不具备通信的基础,并且他们属于Kubernetes集群这样一个封闭的空间。
4)在不同Service下的pod节点在集群间相互访问可以通过Cluster IP。

举例:业务POD进入,然后通过servicename:3306访问。(也可以通过clusterip访问)
k8s之ip和service总结_第1张图片

二. k8s service的2种模式

1.ClusterIP模式
k8s之ip和service总结_第2张图片
NodePort模式:
k8s之ip和service总结_第3张图片

1 nodePort
外部流量访问k8s集群中service入口的一种方式(另一种方式是LoadBalancer),即nodeIP:nodePort是提供给外部流量访问k8s集群中service的入口。

2.port
k8s集群内部服务之间访问service的入口。即clusterIP:port是service暴露在clusterIP上的端口。比如 mysql容器暴露了3306端口,集群内其他容器通过33306端口访问mysql服务,但是外部流量不能访问mysql服务,因为mysql服务没有配置NodePort。

3.targetPort
容器的端口(最终的流量端口)。targetPort是pod上的端口,从port和nodePort上来的流量,经过kube-proxy流入到后端pod的targetPort上,最后进入容器。

三.其他

主机网络
这是一种直接定义Pod网络的方式。hostPort是直接将容器的端口与所调度的节点上的端口路由,这样用户就可以通过宿主机的IP加上来访问Pod了,如:

apiVersion: v1
kind: Pod
metadata:
  name: influxdb
spec:
  containers:
    - name: influxdb
      image: influxdb
      ports:
        - containerPort: 8086
          hostPort: 8086

这样做有个缺点,因为Pod重新调度的时候该Pod被调度到的宿主机可能会变动,这样就变化了,用户必须自己维护一个Pod与所在宿主机的对应关系。
使用了 hostPort 的容器只能调度到端口不冲突的 Node 上,除非有必要(比如运行一些系统级的 daemon 服务),不建议使用端口映射功能。如果需要对外暴露服务,建议使用 NodePort Service。

部署2个相同POD在同一个节点上:
2. hostnetwork模式下
不映射端口: 不支持相同pod 运行,
映射端口: 不支持相同pod运行,端口冲突,hostPort映射(容器端口—宿主机端口映射)

  1. 非hostnetwork模式下
    不映射端口: 可以正常启动,不存在端口冲突场景 只能通过POD IP进行访问
    映射端口: 不支持相同pod运行,端口冲突,hostPort映射(容器端口—宿主机端口映射)
    映射端口,无hostport模式 支持相同pod运行 只能通过POD IP进行访问

你可能感兴趣的:(k8s,kubernetes,docker,容器)