使用k8s部署springcloud解決三大問題


1.正式環境使用的話啟動時需要指定使用正式的配置文件,這個要咋處理?

解決辦法

文章地址:https://www.cnblogs.com/sanduzxcvbnm/p/13262411.html

分析步驟

Dockerfile文件內容如下:

# tag:0.3
FROM idocker.io/jre:1.8.251
VOLUME /tmp
ADD target/hkd-gateway-1.0.jar hkd-gateway-1.0.jar
RUN sh -c 'touch /hkd-gateway-1.0.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /hkd-gateway-1.0.jar" ]

可以在啟動容器的時候把要使用的配置文件給傳遞給JAVA_OPTS,這樣就能解決啟動時采用哪個配置文件的問題了

spring.profiles.active=dev|test|prod

原shell啟動腳本內容:

#!/bin/bash
java -jar -Xms256m -Xmx256m -XX:+UseParNewGC -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=9 -XX:+UseConcMarkSweepGC \
 -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintGCDateStamps -XX:+CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0 \
 -XX:+PrintGCDetails  -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow \
 -Xloggc:/opt/hkd-cloud/hkd-gateway/logs/heap_trace.txt -XX:HeapDumpPath=/opt/hkd-cloud/hkd-gateway/logs/HeapDumpOnOutOfMemoryError/ /opt/hkd-cloud/hkd-gateway/hkd-gateway-1.0.jar  \
 --spring.profiles.active=dev >> /opt/hkd-cloud/hkd-gateway/logs/hkd-gateway.out 2>&1

本地測試環境使用


正式環境使用


可以把這個配置給寫入到ConfigMap 中,然后引用這個就可以了

shell腳本中附加的運行參數處理:


2.日志現在是直接查看的,沒有存儲到文件中,以后查看日志要咋處理?

解決辦法

文章地址:https://www.cnblogs.com/sanduzxcvbnm/p/13259957.html
注:文章中使用logstash了,可以擴展使用redis使用

分析步驟

進一步延申一下問題,容器運行在pod中,容器中的程序日志是輸出到pod的控制台中的。所以可以換種說法,如何收集pod的控制台日志?

通過咨詢了解到,pod的控制台日志是默認存放在宿主機上,也就是存放在宿主機中的/var/log/pods目錄下,這就好辦多了,直接使用filebeat讀取整個目錄下的所有子目錄以及日志文件等,具體看下圖
當刪除該pod或者pod數調整為0的時候,對應的目錄和日志文件也就自動沒有了

查看上圖可以知道。每創建一個新pod,就會在該目錄下新建一個文件夾,一個pod有多個副本,則每個副本也都會創建一個文件夾,每個文件夾下是一個以容器名稱命名的子文件夾,在這個子文件夾有一個以log結尾的鏈接文件,實際指向docker中的路徑/var/lib/docker/containers

參考文章:k8s 容器控制台日志收集

優點: 如果業務里面把日志全部往控制台輸出,對於日志管理是非常的方便的。當刪除容器了,日志文件也就沒有了,所有不需要額外再寫腳本全定時管理日志
缺點: 如果業務中有多種日志需要收集,當然也就可以通過logstash來做,只不過比較麻煩。還需要業務協調

重要:再次參考文章:https://www.cnblogs.com/sanduzxcvbnm/p/13259957.html

這里采用單獨的filebeat來收集日志,傳輸給redis,logstash從redis中拉取數據,在logstash中根據目錄名稱創建es索引

filebeat配置文件

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/pods/*/*/*.log # paths中的正則會匹配k8s中所有的pod控制台日志
  symlinks: true # 日志文件是軟連接形式到docker目錄中去的 所以這個開關需要開啟

  #json.overwrite_keys: true # #對於同名的key,覆蓋原有key值
  #json.add_error_key: true # #將解析錯誤的消息記錄儲存在error.message字段中
  #json.keys_under_root: true # #keys_under_root可以讓字段位於根節點,默認為false
  #json.message_key: log # #message_key是用來合並多行json日志使用的,如果配置該項還需要配置multiline的設置
  #tail_files: true # 如果設置為true,Filebeat從文件尾開始監控文件新增內容,把新增的每一行文件作為一個事件依次發送,而不是從文件開始處重新發送所有內容  

  #multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
  #multiline.negate: true
  #multiline.match: after
  #multiline.timeout: 10s
 
output.redis:
  hosts: ["192.168.75.21:6379"]
  key: pods_log
  db: 0
  timeout: 5

logstash

使用logstash從redis中拉取數據,處理收集的文件的目錄 根據目錄名字輸出到不同的索引

input { 
  redis {
    host => "192.168.75.21"
    port => 6379
    data_type => "list"
    key => "pods_log"
    db => 0
  }
}

output {

    #stdout { 
    #   codec => rubydebug  
    #}
  
    elasticsearch {
        hosts => ["192.168.75.21:9200"]
        index => "%{[container][id]}-%{+yyyy.MM.dd}"
        user => "elastic"
        password => "IjGj8QwWYeXY7rVoLLQ6"
    }
}

第二天再次啟動k8s主機后,這個pod也隨之啟動了,相對應的日志文件新生成一份。
若是pod一直運行下去,是不是日志文件始終就只有一個?有待進一步驗證

3.發布更新的話需要先把服務從注冊中心給down下來,然后才能更新模塊,這個要咋處理?

解決辦法

文章地址:https://www.cnblogs.com/sanduzxcvbnm/p/13268486.html
注:直接看文章最后的內容

分析步驟

使用k8s的postStart和preStop功能,pod的生命周期管理

  • postStart 容器啟動時,Kubernetes 立刻發送 postStart 事件,但不確保對應的 handler 是否能在容器的 EntryPoint 之前執行
  • preStop 容器停止前,Kubernetes 發送 preStop 事件

參考之前的相關功能:

curl -v -X PUT http://localhost:8761/eureka/apps/HKD-GATEWAY/hkd-cluster1:hkd-gateway:5000/status?value=DOWN
curl -v -X PUT http://localhost:8761/eureka/apps/HKD-GATEWAY/hkd-cluster1:hkd-gateway:5000/status?value=UP

需要在容器中使用到curl命令,但是tag:0.3鏡像中並不包含此命令,所以重構了一個含有curl命令的docker基礎鏡像,參考文章:https://www.cnblogs.com/sanduzxcvbnm/p/13220054.html
這里以config模塊為例

結合現有的信息,改造使用的curl命令等,結果如下:

curl -v -X PUT http://cloud-eureka-0.cloud-eureka.hkd.svc.cluster.local:8761/eureka/apps/HKD-CONFIG/cloud-config-0.cloud-config.hkd.svc.cluster.local:hkd-config:8888/status?value=DOWN
curl -v -X PUT http://cloud-eureka-0.cloud-eureka.hkd.svc.cluster.local:8761/eureka/apps/HKD-CONFIG/cloud-config-0.cloud-config.hkd.svc.cluster.local:hkd-config:8888/status?value=UP

說明:

修改config模塊的Dockerfile文件,具體如下:

# tag:0.3
#FROM idocker.io/jre:1.8.251
#VOLUME /tmp
#ADD target/hkd-config-1.0.jar hkd-config-1.0.jar
#RUN sh -c 'touch /hkd-config-1.0.jar'
#ENV JAVA_OPTS=""
#ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /hkd-config-1.0.jar" ]


# tag:0.4
FROM idocker.io/jre:1.8.0_212
VOLUME /tmp
ADD target/hkd-config-1.0.jar hkd-config-1.0.jar
RUN sh -c 'touch /hkd-config-1.0.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /hkd-config-1.0.jar" ]

然后使用提交到gitlab,使用jenkins打包,編譯,制作docker鏡像提交到nexus倉庫,接下來是在kuboard界面上操作
postStart上使用UP

preStop使用Down

kuboard界面上顯示

日志顯示;

關鍵分析:日志顯示中的區別

使用命令down后,關閉這行pod,啟用一個新pod,這中間間隔的時間太短了,會有問題,還有待改善

暫定改善方法:在preStop中增加等待時間
直接加命令后添加sleep等待時間報錯:


1.這個日志表述的含義是在關閉pod之前執行preStop中的down命令,eureka注冊中心仍會顯示這個服務,但是狀態是DOWN
2020-07-01 17:31:28.369 INFO 1 --- [nio-8761-exec-1] c.n.e.r.InstanceResource : Status updated: HKD-CONFIG - cloud-config-0.cloud-config.hkd.svc.cluster.local:hkd-config:8888 - DOWN

2.這個日志表述的含義是pod關閉導致這個服務停止了,eureka注冊中心不顯示這個服務
2020-07-01 17:31:28.796 INFO 1 --- [io-8761-exec-10] c.n.e.r.AbstractInstanceRegistry : Registered instance HKD-CONFIG/cloud-config-0.cloud-config.hkd.svc.cluster.local:hkd-config:8888 with status DOWN (replication=false)

3.這個日志表述的含義是啟動pod時,preStart中的up命令,eureka中狀態改成up
2020-07-01 17:31:46.688 INFO 1 --- [nio-8761-exec-7] c.n.e.r.InstanceResource : Status updated: HKD-CONFIG - cloud-config-0.cloud-config.hkd.svc.cluster.local:hkd-config:8888 - UP

4.這個日志表述的是含義是啟動pod,config服務往eureka上注冊,也就是顯示出來
2020-07-01 17:32:04.033 INFO 1 --- [nio-8761-exec-1] c.n.e.r.AbstractInstanceRegistry : Registered instance HKD-CONFIG/cloud-config-0.cloud-config.hkd.svc.cluster.local:hkd-config:8888 with status UP (replication=false)

如下是單獨使用命令操作的日志顯示

down

執行的命令

eureka日志查看

eureka界面查看

up

執行的命令

eureka日志查看

eureka界面查看

關於上面所說的間隔時間太短的問題處理
可以使用如下方法進行:

# postStart命令
curl -X PUT http://cloud-eureka-0.cloud-eureka.test.svc.cluster.local:8761/eureka/apps/HKD-CONFIG/cloud-config-0.cloud-config.test.svc.cluster.local:hkd-config:8888/status?value=UP;sleep 300

# preStop命令
curl -v -X PUT http://cloud-eureka-0.cloud-eureka.test.svc.cluster.local:8761/eureka/apps/HKD-CONFIG/cloud-config-0.cloud-config.test.svc.cluster.local:hkd-config:8888/status?value=DOWN;sleep 300

yaml文件:

          lifecycle:
            postStart:
              exec:
                command:
                  - /bin/sh
                  - '-c'
                  - >-
                    curl -X PUT
                    http://cloud-eureka-0.cloud-eureka.test.svc.cluster.local:8761/eureka/apps/HKD-CONFIG/cloud-config-0.cloud-config.test.svc.cluster.local:hkd-config:8888/status?value=UP;sleep
                    300
            preStop:
              exec:
                command: 
                  - /bin/sh
                  - '-c'
                  - >-
                    curl -v -X PUT
                    http://cloud-eureka-0.cloud-eureka.test.svc.cluster.local:8761/eureka/apps/HKD-CONFIG/cloud-config-0.cloud-config.test.svc.cluster.local:hkd-config:8888/status?value=DOWN;sleep
                    300

或者換成如下這倆命令,功能都是一樣的,只不過顯示有些區別

          lifecycle:
            postStart:
              exec:
                command: ["/bin/sh","-c","curl -v -X PUT http://cloud-eureka-0.cloud-eureka.test.svc.cluster.local:8761/eureka/apps/HKD-CONFIG/cloud-config-0.cloud-config.test.svc.cluster.local:hkd-config:8888/status?value=UP;sleep 300"]
            preStop:
              exec:
                command: ["/bin/sh","-c","curl -v -X PUT http://cloud-eureka-0.cloud-eureka.test.svc.cluster.local:8761/eureka/apps/HKD-CONFIG/cloud-config-0.cloud-config.test.svc.cluster.local:hkd-config:8888/status?value=DOWN;sleep 300"]

pod開始啟動時,先執行postStart中的命令,此時,服務是先注冊到eureka中,狀態是up,但是服務還沒有啟動,需要等待300秒后才開始啟動

pod刪除時,先執行preStop中的命令,把服務從eureka中摘除,然后等待300面后刪除pod,但是有個很嚴重的問題:把服務從eureka中摘除,若是有副本pod,這倆pod都會從eureka中摘除,但是只會刪除一個pod,另一個pod雖在運行,但是沒有注冊到eureka中

參考文章:
這篇文章是使用純命令的形式
https://www.cnblogs.com/sunsky303/p/11571545.html

這篇文章是使用命令執行腳本的形式
https://gitee.com/sunshanpeng/blog/blob/master/在k8s中使用eureka的幾種姿勢.md


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM