一文记录 k8s 与 docker
k8s 网络
linux 虚拟网络 veth pair 和 bridge
- Network namespace 实现网络隔离
- Veth pair提供了一种连接两个network namespace的方法
- Bridge 实现同一网络中多个namespace的连接
- 添加路由信息,查看路由信息
- iptabels 和 NAT
- 实战练习
1 | sudo ip netns add ns1 |
docker 网络 和 docker0
- docker0网桥和缺省路由
- docker0
- route
- iptables 和 nat
1 | # 查看网桥 |
pod 网络
pause
- pause容器实现1个pod中多个container的网络共享
- Pause 用于实现容器之间共享网络,如果其中部分容器挂掉,其余容器网路正常工作
- https://github.com/kubernetes/kubernetes/blob/master/build/pause/linux/pause.c
1 | $ docker ps | grep etcd |
CNI 标准和插件
- CNI标准: https://github.com/containernetworking/cni
- CNI 插件:https://github.com/containernetworking/plugins
1 | $ ls -l /opt/cni/bin/ |
service 网络
背景
- Zookeeper提供名字服务,pod自身实现负载均衡,RPC框架实现负载均衡
- Service 为 Pods 提供的固定 IP,其他服务可以通过 Service IP 找到提供服务的Endpoints。
- Service提供负载均衡。Service 由多个 Endpoints 组成,kubernetes 对组成 Service 的 Pods 提供的负载均衡方案,例如随机访问、robin 轮询等。
- 暂时将Pod等同于Endpoint
实现原理
- Service IP IP 由API server分配,写入etcd
- Etcd 中存储service和endpoints
- Controllermanager watch etcd的变换生成endpoints
- node 中的kube-proxy watch service 和 endpoints的变化
kube-proxy 服务发现和负载均衡
- Order -> item 的流程
- 服务发现:环境变量和DNS
- servicename.namespace.svc.cluster.local
- kub-proxy 通过watch etcd中service和endpoint的变更,维护本地的iptables/ipvs
- kub-proxy 通过转发规则实现service ip 到 pod ip的转发,通过规则实现负载均衡
service 类型
- ClusterIP
- NodePort
- LoadBalancer
ingress 网络
背景
- 集群外部访问集群内部资源?nodeport,loadbalancer。一个服务一个port或者一个外网IP,一个域名
- Ingress 是 Kubernetes 中的一种 API 对象,用于管理入站网络流量,基于域名和URL路径把用户的请求转发到对应的service
- ingress相当于七层负载均衡器,是k8s对反向代理的抽象
- ingress负载均衡,将请求自动负载到后端的pod
实现原理
- ingress 资源对象用于编写资源配置规则
- Ingress-controller 监听apiserver感知集群中service和pod的变化动态更新配置规则,并重载proxy反向代理的配置
- proxy反向代理负载均衡器,例如ngnix,接收并按照ingress定义的规则进行转发,常用的是ingress-nginx等,直接转发到pod中
支持的路由方式
- 通过使用路径规则。例如: /app1 路径映射到一个服务,将 /app2 路径映射到另一个服务。路径匹配支持精确匹配和前缀匹配两种方式。
- 基于主机的路由匹配。例如,可以将 app1.example.com 主机名映射到一个服务,将 app2.example.com 主机名映射到另一个服务。主机匹配也可以与路径匹配结合使用,实现更细粒度的路由控制。
- 其他条件的路由匹配::请求方法(如 GET、POST)、请求头(如 Content-Type)、查询参数等。
docker k8s 常用命令
1 | minikube |
参考资料