K8s常见问题分析&解决(未分类问题二)

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)

 

发布了106 篇原创文章 · 获赞 13 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/CodeAsWind/article/details/104429451