Kubernetes應用遷移問題定位

這個帖子記錄全部的應用遷移中遇到的問題。nginx

 

  • 關於鏡像沒法啓動後沒法定位問題

在原有的Dockerfile中修改,加入docker

RUN echo "aaa" > /etc/a.log

CMD ["tail",「-f","/etc/a.log"]

而後經過kubectl exec -it ... bash進去手工運行進行定位tomcat

 

  • Zookeeper基本操做命令

查找生產者消費者信息bash

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

ls /dubbo

 

查看消費者app

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

查看生產者curl

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

 

  • 刪除一直在Terminating狀態的Pod

使用命令ide

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

以前採用的命令是ui

systemctl restart flanneld docker kubelet kube-proxy

但問題是會把這臺主機全部的容器從新啓動一次。google

仔細觀察了一下有幾臺常常處於這種狀態的主機,發現機器配置是2C,4G的內存,tomcat配置的是Xmx1G,但由於程序的緣由,每次啓動之後,若是3個實例分在三臺不一樣的機器上,最後宿主機的free memory在500-700m,程序吃掉大量內存,這時候若是一旦從新部署,常常發生兩個實例同在一臺機器上的狀況時,就會出現沒法釋放資源,一直在terminating的狀態,從新啓動也花費很長的時間。url

但若是三個實例均分三臺機器,系統還算能保持正常,所以修改部署文件爲

在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   這個基本問題折騰了半天。

相關文章
相關標籤/搜索