• Kubernetes应用迁移问题定位


    这个帖子记录所有的应用迁移中遇到的问题。

    • 关于镜像无法启动后无法定位问题

    在原有的Dockerfile中修改,加入

    RUN echo "aaa" > /etc/a.log
    
    CMD ["tail",“-f","/etc/a.log"]

    然后通过kubectl exec -it ... bash进去手工运行进行定位

    • Zookeeper基本操作命令

    查找生产者消费者信息

    ./zkCli.sh -server 192.168.5.130:2888
    ls /

    ls /dubbo

    查看消费者

    ls /dubbo/com.ivan.service.provider.UserService/consumers

    查看生产者

    ls /dubbo/com.ivan.service.provider.UserService/providers
    • 删除一直在Terminating状态的Pod

    使用命令

    kubectl delete pod NAME --grace-period=0 --force

    之前采用的命令是

    systemctl restart flanneld docker kubelet kube-proxy

    但问题是会把这台主机所有的容器重新启动一次。

    仔细观察了一下有几台经常处于这种状态的主机,发现机器配置是2C,4G的内存,tomcat配置的是Xmx1G,但因为程序的原因,每次启动以后,如果3个实例分在三台不同的机器上,最后宿主机的free memory在500-700m,程序吃掉大量内存,这时候如果一旦重新部署,经常发生两个实例同在一台机器上的情况时,就会出现无法释放资源,一直在terminating的状态,重新启动也花费很长的时间。

    但如果三个实例均分三台机器,系统还算能保持正常,因此修改部署文件为

    在spec下加入podAntiAffinity选项。

    template:
        metadata:
          labels:
            app: zk
        spec:
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                - labelSelector:
                    matchExpressions:
                      - key: "app"
                        operator: In
                        values: 
                        - zk
                  topologyKey: "kubernetes.io/hostname"
          containers:
          - name: k8szk
            imagePullPolicy: Always
            image: gcr.io/google_samples/k8szk:v3
            resources:
              requests:
                memory: "2Gi"
                cpu: "500m"

      

    • 字符集
     JAVA_OPTS="-Xms64m -Xmx256m -XX:MaxPermSize=128m -Dfile.encoding=GBK $JAVA_OPTS"

    登录容器内部,通过

    locale -a

    查看所有的字符集,然后在Dockerfile中设置

    ENV LANG C.UTF-8

    c.UTF-8本身是带有中文字符支持的。

    如果有log4j,需要在properties文件中设置

    log4j.appender.console.Encoding=UTF-8
    log4j.appender.logfile.Encoding=UTF-8
    • 容器内外的文件拷贝
    kubectl cp pod_id:/pod_directory /host_directory
    • 容器化的Nginx出现host not found in upstream

    原理是nginx会先解析你的upstream,如果这个upstream指向一个Kubernetes服务,而这个服务没有启动的话,就无法解析,从而导致Nginx停止运行或者启动不成功。

    解决办法,让nginx动态的解析upstream,而不是在启动的时候静态解析,这需要在location中间来设置,比如

    upstream fp_tomcat {
    server tomcattest:8080
    }

    location /foo { resolver 127.0.0.11 ipv6=off; # or some other DNS (you company/internal DNS server) #resolver 8.8.8.8 valid=30s; set $upstream_foo fp_tomcat; proxy_pass http://$upstream_foo; }

    启动的时候,如果tomcattest服务不存在,日志中会报错,但不会影响其他的运行,当tomcattest启动以后,服务就会被成功调度

    另外这个/foo路径千万小心,nginx会把foo路径带到后面的tomcat中,其实你访问

    curl http://nginxsvc:nginxport/foo 就是访问tomcattest:8080/foo   这个基本问题折腾了半天。

  • 相关阅读:
    Spring实现Nacos作为配置中心
    Machine Learning(2)——knearest neighbor算法
    Yahoo邮箱中全部邮件的下载保存
    C++中的枚举值类型转化为整数和字符串
    使用两次Hash的Hash表——Twice_Hash_Map
    符号化表达式设计(一)
    Flex和Bison的一些笔记(一)
    Makefile
    硬件设置
    谁知道广东省DB44的GPS算法?
  • 原文地址:https://www.cnblogs.com/ericnie/p/8872748.html
Copyright © 2020-2023  润新知