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当作交换机