1:容器内部时间和node节点的系统时间不一致
详细描述:
容器内部时间和node节点的系统时间不一致
例如: kubectl exec -it <pod-name> date
UTC 2019
node 上的date CST
解题思路:
无
原因分析:
这个不单单是K8s问题, 单纯使用docker也存在类似的问题
解决步骤:
将物理机的时区文件以hostpath方式只读挂载,这样只要保证物理机的系统时间正确即可
修改yaml文件中:
containers:
-mountPath: /etc/localtime
name: vol-localtime
readOnly: true
volumes:
-name: vol-localtime
hostpath:
path: /etc/localtime
2:pod内部hosts文件问题
详细描述:
pod内部hosts文件问题
解题思路:
原因分析:
默认情况下, k8s会将pod的hostname和ip地址添加到hosts文件里面,实际应用场景下会有手动去追加hosts文件记录的需求,而pod的生存周期是不固定的,增对这部分官方提供了hostalias解决方案:https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
解决步骤:
通过配置pod内部hosts文件的初衷有两个:
1: 有些微服务之间的调用走的是公网的解析,效率低且DNS有时候会出现响应超时问题
2:目前开放、测试和现网环境,本质上代码是同一套
我们可以通过配置hosts记录,可以将程序连接mysql、mongodb、mq这些公共服务的名称固定,不同的环境对应的公共服务的IP地址通过hostalias方式注入,可以有效避免由于配置的原因导致的问题。
对应yaml中的内容:
spec:
hostAliases:
- ip: "xx.xxx.xx.xxx"
hostnames:
- "mysql-master"
- "proxysql-server"
- "redis-server"
3:Pod 滚动更新问题
详细描述:
Pod 滚动更新问题
在只配置一个POD副本且为配置滚动升级的情况下,需要对POD进行升级重启的时候,会马上把仅有的一个正常的POD关闭掉,同时启动一个新的POD,这个过程中服务会短暂不可用。
解题思路:
无
原因分析:
无
解决步骤:
配置滚动更新策略
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
revisionHistoryLimit: 10
progressDeadlineSeconds: 600
4: 存活检测和工作负载检测
详细描述:
存活检测和工作负载检测
当POD内的进程不工作或者OOM了,需要进行自我重启工作,未配置liveness情况下是无法检测和处理类似情况
解题思路:
无
原因分析:
无
解决步骤:
配置liveness和readiness探针
livenessProbe:
exec:
command:
- curl
- "http://127.0.0.1:8080"
initialDelaySeconds: 60
timeoutSeconds: 2
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
readlinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 90
timeoutSeconds: 3
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
这里需要说明一下liveness探针主要用来判断POD内的进程是否存活,readiness探针用来判断pod内的进程是否已准备就绪,在未就绪之前,对应service的流量不会转发到pod内。
5:java应用时区同步问题
详细描述:
java应用时区同步问题
JVM启动时候的时区。如果不指定,则默认取系统时区,这就会导致java应用的时间和容器时间差8个小时。
解题思路:
无
原因分析:
无
解决步骤:
通过配置JAVA_OPTS设置java时区(同样JVM的内存参数也可以通过这种方式配置)
-Duser.timezone=GMT+08 或者 -Duser.timezone=Asia/Shanghai
yaml文件:
env:
-name: JAVA_OPTS
value: >-
-Duser.timezone=Asia/Shanghai
6:集群内外网络互通问题
详细描述:
集群内外网络互通问题
解题思路:
K8s集群不同node上的pod网络通信是通过cni网络插件(例如flannel、calico等)实现的,路由信息保存在etcd中,pod网络访问互联网通过node的iptables nat实现。
但在实际应用环境中,需求总是多样的,当在k8s集群外部的主机需要直接访问pod网络的时候,就需要通过配置路由手段才能实现
原因分析:
无
解决步骤:
对应解决方案为添加路由:
和node节点在同一个网段内的主机,将对应的网络的下一跳地址指向相应的node节点即可。
和node节点不在同一网段内的主机,需要在上层路由器进行配置。
7:Pod间网络隔离
详细描述:
Pod间网络隔离
解题思路:
无
原因分析:
默认Pod是未隔离的,POD之间的网络畅通无阻,实际应用中,会有配置网络隔离的需求,比如需要在pod间做流量的精细控制。
解决步骤:
使用networkpolicy(要求集群的CNI插件可以支持networkpolicy)