1.TKE集群网络模式
1.1GlobalRouter 模式
GlobalRouter模式是在每个节点下起一个agent从整个VPC中指定一个子网进行通信和数据的传输。该模式其实就是在VPC下为每个节点分配一个子网进行网络通讯和传输
1.2VPC-CNI 模式
VPC-CNI模式是在某个VPC下提前规划好多个子网,pod服务通过每个节点上的弹性网卡从子网中随机分配ip来进行pod之间的通讯和数据传输。固定IP模式其实就是单独固定某个子网作为pod的ip和service分配使用。
1.3VPC-CNI和GlobalRouter对比
- 绝大多数情况下应该选择 GlobalRouter,容器网段地址充裕,扩展性强,能适应规模较大的业务
- 如果后期部分业务需要用到 VPC-CNI 模式,可以在 GlobalRouter 集群再开启 VPC-CNI 支持,也就是 GlobalRouter 与 VPC-CNI 混用,仅对 部分业务使用 VPC-CNI 模式
- 如果完全了解并接受 VPC-CNI 的各种限制,并且需要集群内所有 Pod 都用 VPC-CNI 模式,可以创建集群时选择 VPC-CNI 网络插件
2.TKE集群容器运行组件
2.1Docker
docker运行容器,主要是通过kubelet调用dockerd的进程,调用docker-containerd接口去启动对应的容器
2.2Containerd
containerd则主要是kubelet通过CRI插件去调用containerd的api接口来启动容器
2.3docker和containerd对比
- containerd 方案由于绕过了 dockerd,调用链更短,组件更少,占用节点资源更少,绕过了 dockerd 本身的一些 bug,但 containerd 自身也还存在一些 bug (已修复一些,灰度中)
- docker 方案历史比较悠久,相对更成熟,支持 docker api,功能丰富,符合大多数人的使用习惯
推荐使用docker方式,这样可以调用docker api以及命令,如果想对docker做优化也可以执行
3.servie的转发
3.1iptables
iptables支持的小场景下应用,更加稳定
3.2ipvs
- IPVS为大型集群提供了更好的可扩展性和性能。(规则的存储方式使用的数据结构更高效)
- IPVS支持比iptables更复杂的负载平衡算法(最小负载,最少连接,位置,加权等)。
- IPVS支持服务器健康检查和连接重试等。
4.集群故障定位
4.1pod退出错误码分析
- 129-255 表示进程因外界中断信号退出,最常见的是 137,表示被 SIGKILL 杀死,可能是 Cgroup OOM,系统 OOM,存 活检查失败或者被其它进程杀死导致
- 1-128 表示进程主动退出 (只是约定),具体状态码含义取决于应用程序逻辑;有时主动退出也会是 255 状态码: 代码里使 用类似 exit(-1) 时,-1 被自动转成 255,通常状态码为 1 和 255 是一般性错误,看不错具体含义,需要结合日志分析
4.2容器内抓包
nsenter命令仅进入该容器的网络命名空间,使用宿主机的命令调试容器网络
代码语言:javascript复制[root@VM_0_13_centos kubernetes-elasticsearch]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1421f7bbc523 goharbor/nginx-photon:v2.0.0 "nginx -g 'daemon of…" 6 days ago Up 6 days (healthy) 0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp nginx
e9ab5bf15849 goharbor/harbor-jobservice:v2.0.0 "/harbor/entrypoint.…" 6 days ago Up 6 days (healthy) harbor-jobservice
d04f14741f3d goharbor/harbor-core:v2.0.0 "/harbor/entrypoint.…" 6 days ago Up 6 days (healthy) harbor-core
c31d291b2425 goharbor/redis-photon:v2.0.0 "redis-server /etc/r…" 6 days ago Up 6 days (healthy) 6379/tcp redis
13f1de98a114 goharbor/registry-photon:v2.0.0 "/home/harbor/entryp…" 6 days ago Up 6 days (healthy) 5000/tcp registry
9e154ff22c54 goharbor/harbor-registryctl:v2.0.0 "/home/harbor/start.…" 6 days ago Up 6 days (healthy) registryctl
051736f00111 goharbor/harbor-db:v2.0.0 "/docker-entrypoint.…" 6 days ago Up 6 days (healthy) 5432/tcp harbor-db
b10b982a225a goharbor/harbor-portal:v2.0.0 "nginx -g 'daemon of…" 6 days ago Up 6 days (healthy) 8080/tcp harbor-portal
3a0d7ec954c5 goharbor/harbor-log:v2.0.0 "/bin/sh -c /usr/loc…" 6 days ago Up 6 days (healthy) 127.0.0.1:1514->10514/tcp harbor-log
[root@VM_0_13_centos kubernetes-elasticsearch]# nsenter --target 6128
[root@VM_0_13_centos kubernetes-elasticsearch]# docker inspect -f {{.State.Pid}} 1421f7bbc523
6128
[root@VM_0_13_centos kubernetes-elasticsearch]# nsenter -n --target 6128
进入之后可以执行对应的ip address
,ping
,telnet
,ss
,tcpdump命令
等
[root@VM_0_13_centos kubernetes-elasticsearch]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
31887: eth0@if31888: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:1f:00:0a brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.31.0.10/16 brd 172.31.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@VM_0_13_centos kubernetes-elasticsearch]# tcpdump -i eth0 tcp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
4.3在pod中通过busybox容器来修改系统参数失败
现在的版本中集群中如果节点使用TKE订制镜像,无法修改pod的内核参数,如果需要支持内核参数的修改,可以采用官方的centos和ubuntu镜像。