k8s 介绍

 node:假如一个k8s集群三台机器:A、B、C,ABC称为节点。Node节点的IP地址,即物理机(宿主机)的网卡地址;

pod:k8s的中心思想是每个容器只安装1个进程,多个或1个容器属于一个pod。然后这个pod下的容器可以通过volume的方式共享磁盘。也就是说,应该把整个pod看作虚拟机,然后每个容器相当于运行的虚拟机的进程。

deployment:是最常用的 k8S 工作负载控制器(Workload Controllers),是 k8s 的一个抽象概念,用于更高级层次对象,部署和管理 Pod。主要功能:应用部署、应用升级、应用实例扩容、缩容、发布、失败回滚、应用下线。

k8s集群有3种IP地址,分别如下:

Node IP ,Node节点的IP地址,即物理机(宿主机)的网卡地址;从集群的VPC网络为节点分配IP地址

Pod IP,Pod的IP地址,docker0网桥分配的地址, 是虚拟的二层网络。可以实现不同node中pod之间的通信。通过–pod-cidr指定pod的可分配IP地址段。

Cluster IP,也可叫Service IP,由k8s管理和分配,来源于cluster ip地址池。无法被ping,因为没有“实体网络对象”。只能结合service port组成具体的通信端口。从集群的VPC网络为每项服务分配IP地址。

Node节点主机查看IP地址

# ifconfig 查看
 eth0: flags=4163<xxxx> mtu 1500
             inet 10.232.35.45 netmask 255.255.255.0   broadcast 10.232.35.255

k8s master通过kubectl describe node k8s-master命令查看Node IP地址

#  kubectl get node -o wide
NAME         STATUS       ROLES          AGE     VERSION   INTERNAL-IP          XXXX
K8s-master  Ready        master            23d     v1.19.0      10.232.35.45 

#  kubectl describe node k8s-master
name:                        k8s-master
....
Addresses: 
         InternalIp: 10.232.35.45
          Hostname:  k8s-master

当Service的type为NodePort时,Service将Pod端口映射到Node端口,集群外部可以通过NodeIP:NodePort访问Service里的Pod

apiVersion: v1
kind: service
metadata: 
     name: ingress-nginx
spec:
      ports:
        - port: 80
          protocal: TCP
          targetPort: 80
          nodePort: 32080
      type: NodePort

可通过NodeIP:NodePort(10.234.115.22:32080,10.234.15.23:32080)访问:

# kubectl get nodes -o wide
NAME         STATUS       ROLES          AGE     VERSION   INTERNAL-IP         
K8s-node1  Ready        master            23d     v1.19.0      10.234.115.22
K8s-master  Ready        master            23d     v1.19.0      10.234.15.23

# kubectl get svc -n ingress-nginx
NAME            TYPE                  CLUSTER-IP              EXTERNAL-IP        PORT(S)              AGE
ingress-nginx     NodePort        172.63.23.20            <none>              80:32080/TCP,      10d


# telnet 10.234.115.22 32080
Connected to 10.234.115.22
   

2. Pod IP

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

3. Cluster IP

Cluster IP是一个虚拟的IP,实际是一个伪造的IP网络。Service可以为一组具有相同功能的容器应用提供一个统一的入口地址, 并且将请求负载分发到后端的各个容器应用上,可以将后端的多个容器看做一个集群,Service是集群的入口。所以Service IP也叫做Cluster IP。

  • Cluster IP仅仅作用于kubernetes Service这个对象,并由Kubernetes管理和分配IP地址(来源于Cluster IP地址池)
  • Cluster IP无法被ping,因为没有一个“实体网络对象”来响应
  • Cluster IP只能结合Service Port组成一个具体的通信端口,单独的Cluster IP不具备TCP/IP通信的基础,并且它们属于Kubernetes集群这样一个封闭的空间,集群之外的节点如果要访问这个通信端口,则需要做一些额外的工作。
# kubectl  get  service  -n  ingress-nginx  -o  wide
NAME                              TYPE              CLUSTER-IP            EXTERNAL-IP         PORT(S)            AGE
default-http-backend     NodePort        172.63.223.10            <none>              80/TCP,              10d
ingress-nginx                 NodePort        172.63.23.20            <none>              80:32080/TCP,      10d

4. 集群DNS

完成从服务名到clusterIP的解析。

DNS服务经历从skyDNS到kubeDNS再到coreDNS的过程。k8s通过Add-On增值包的方式引入DNS系统,把服务名作为dns域名。程序就可以直接使用服务名来建立通信连接。

5. 3种IP 通信

集群外部访问Pod,先到Node网络(Node IP)的端口NodePort,再转到Service网络(Cluster IP)的port,最后代理给Pod网络(Pod IP)的targetPort。详细流程如下

6 容器中的数据到外网

从容器发出的数据包先到达br0,然后交给host机器的协议栈,由于目的IP是外网,且host主机开启了IP forward功能,数据包会通过eth0发出。因容器分配的网段都不在物理网络网段内,所以一般发出去之前先做NAT转换。(可以用iptables进行转换)
当涉及转发的目的IP地址是其他机器时,需要确保启用ip forward功能,即把linux当作交换机

Leave a Reply

Your email address will not be published. Required fields are marked *