Tag Archives: kubernetes

k8s服务访问

k8s基本网络模型 约法三单 pod之间可以直接通信,无需显式使用NAT接收和地址转换 node与pod之间可以直接通信,无需要明显地址转换 pod可以看到自己的ip跟别人看到它所用的ip是一样的,中间不经过转换 分类 underlay:与Host网络同层 ovrelay:只要与Host网络不冲突,ip可以自由分配 Kubenets Service Service工作原理: 通过kube-proxy设置宿主机iptables规则来实现,kube-proxy通过观察service的创建,然后通过修改本机的iptables规则,将访问service vip的请求转发到真实的Pod上。 基于iptables规则的service的实现,宿主机上有大量Pod时,规则的不断刷新占用大量CPU资源,新的模式:ipvs,通过把规则放到内核态,降低了维护规则的代价 Service的DNS记录:<myservice>.<mynamespace>.svc.cluster.local,访问这条记录时,返回的是Service的VIP或代理Pod的IP地址集合 Pod的DNS记录:<pod_hostname>.<subdomain>.<mynamespace>.svc.cluster.local,注意pod的hostname和subdomain都是在Pod中定义的 集群内访问 环境变量 Headless ServiceclusterIP: None不再提供虚拟IP来负载均衡 集群外访问(外部宿主机访问) NodePort:外部client访问任意一台宿主机的8080端口,就是访问Servicer所代理的Pod的80端口,由接收外部请示请求的宿主机做转发,即client -> nodeIP:nodePort -> serviceVIP:port -> podIp:targetIp LoadBalance:公有云提供的k8s服务自带的loadbalancer做负载均衡和外部流量 的入口 ExternalName:通过ExternalName或ExternalIp给Service挂在一个公有IP或者域名,当访问这个公有IP地址时,就会转发到Service所代理的Pod服务上。类似于软链或快捷方式 ClusterIP:虚拟IP地址,外部网络无法访问,只有k8s内部访问使用。更像是一个伪造的IP网络 仅仅用于Service这个对象,并由k8s管理和分配IP地址 无法被Ping通,没有一个“实体网络对象”来响应 只能结合Service Port组成一个具体的通信端口,单独的ClusterIP不具备通信的基础,并且它们属于k8s集群这样一个封闭的空间 不同Service下的Pod节点在集群间相互访问可以通过ClusterIP Service与Ingress Ingress:全局的、为了代理不同后端Sercie而设置的负载均衡服务,只能工作在7层,而service工作在四层 … Continue reading

Posted in Kubernetes | Tagged , | Leave a comment

k8s三层网络实现

字典 下一跳:如果ip包从主机A发送到主机B,需要经过路由设备X的中转,那么X的IP地址就应该配置为主机A的下一跳地址。 Host-gw模式:将每个 Flannel 子网(Flannel Subnet,比如10.244.1.0/24)的下一跳 ,设置成该子网对应宿主机的IP地址。也就是主机(host)充当这条容器通信路径里的网关(gateway),也就是host-gw的含义;无封装,纯路由,只经过协议栈一次,性能较高 边际网关协议:BGP,Border Gateway Protocol,大规模数据中心维护不同“自治系统”之间路由信息、无中心的路由协议; 它不会在宿主上创建任何网桥设备相当于:每个边界网关上运行着一个小程序,它们会将各自的路由表信息,通过TCP传输给其它边界网关。其它边界网关上的这个小程序,则会对收到的这些数据进行分析,然后把需要的信息添加到自己的路由表。 CNI:与k8s对接的部分 Felix:DeamonSet,wmgm宿主机上插入路由规则,即写入Linux内核的FIB转发信息库,以及维护Calico所需要的网络设备等工作 BIRD:BGP客户端,专门负责在集群里分发路由信息 边际网关:负责把自治系统连接在一起的路由器。它的路由表中有其它自治系统里的主机路由信息; Calico:集群中所有的节点,都是边界路由器,被称为BGP Peer;默认情况下,是一个Node-to-Node Mesh的模式。随着节点的增多,会以N^2的规模快速增长。一般推荐在少于100个节点的集群中 Calico Route Reflector的模式,大集群,它指定一个或几个专门节点,来负责与所有节点建立BGP连接,从而学习全局路由规则,其它节点,只需要给它交换路由信息。 Calico IPIP模式:添加的路由规则10.233.2.0/24 via 192.168.2.2 tunl0,下一跳地址是Node2 IP地址,但发出去包的设备是tunl0(注意,不是flannel UDP模式的tun0,它们的功能是不同的)它是一个IP隧道设备(IP tunnel),IP包进入IP隧道后,被内核IPIP驱动接管。它会将这个IP包直接封装在一个宿主机网络的Ip包中。 Calico IPIP模式: Flannel Host-gw模式 $ ip route … 10.244.1.0/24 via 10.168.0.3 … Continue reading

Posted in Kubernetes | Tagged , | Leave a comment

Pod生命周期

Pod容器 Init Container: 支持应用容器的全部字段与特性,包括资源限制,存储券和安全设置 由于需要在pod就绪之前运行完成,所以不支持reaadinessProbe 定义多个init容器,它们会按定义顺序执行 init容器失败,如果restartPolicy不为Nerver,则会不断重启,直到成功为止 作用: 具有与应用容器分离的单独镜像,可包含不建议在生产镜像中包含的实用工具 应用程序镜像基于它可以分离出创建和部署的角色 使用linux namespace,相对应用容器来说有不同的文件系统视图,因此有访问secret的权限,应用容器则不能 可以阻塞或延迟应用容器的启动 Pod Hook 如果postStart,postStop失败,会杀死容器 postStart:容器创建后立即执行,不保证钩子在容器EntryPoint之前运行。主要用于资源部署、环境准备等。如果运行时间过长以至不能运行或者挂起容器将无法到达Running状态 preStop:容器终止之前立即调用,阻塞,同步的,必须在删除容器调用发出之前完成。主要用于优雅关闭应用程序、通知其它系统等。如果执行期间被挂起,pod将永远在running状态,并不会到达failed状态 健康检查 Pod状态 PodStatus.phase字段 挂起(Pending)信息已提交集群,但没有被调度器调度到合适的节点或pod镜像正在下载 运行中(Running)已绑定到一个节点,所有容器已被创建。至少一个正在运行,或者处理启动或重启状态 成功(Successed)所有容器成功终止,并且不会重启 失败(Failed)所有容器已终止,并且至少一个容器是因为失败终止,也就是说容器以非0状态退出或被系统终止 未知(UnKnow)无法获得状态,通常是主机通信失败导致的 PodStatus.PodCondition 描述当前Status的具体原因 PodScheduled:pod已调度到某节点 ContainersReady:pod内所有容器已就绪 Initialized:所有的init容器都已成功完成 Unschedulable Ready:可以提供服务,并且应该被添加到对应服务的负载均衡池中 Pod 资源定义(CPU、内存) 调度 Volume Projected Volume 投射数据卷 … Continue reading

Posted in Kubernetes | Tagged , | Leave a comment