問題1: 服務發版等導緻的服務間接性不可用問題
原因1:請求需要10s完成,但是服務所在pod在第8秒被幹掉
解決:設定preStop和延遲銷毀pod, sleep時間要小于terminationGracePeriodSeconds.且sleep之後不會再有請求進入該pod
imagePullPolicy: Always
lifecycle:
preStop:
exec:
command:
- sleep
- '30'
.......
restartPolicy: Always
terminationGracePeriodSeconds: 40
原因2:pod啟動時,是running狀态(即容器建立成功),running 後被加入到 Endpoints ,但是其中的業務服務并沒有起來,無法正常處理請求
解決:添加就緒探針,服務可用後再将pod加入服務清單中
http請求:
name: coding-cloud-platform-cron
readinessProbe:
failureThreshold: 1
httpGet:
path: >-
/api/cron/stats/stu/review?key=idnehmC68npnUXDU&startTime=2021-06-08%2000:00:00&endTime=2021-06-08%2000:00:00
port: 8080
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 2
successThreshold: 2
timeoutSeconds: 1
端口監控(開啟isito邊車有問題):
name: coding-cloud-platform-api
readinessProbe:
failureThreshold: 3
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: 8080
timeoutSeconds: 1
在幫助田老師進行skywalking的的容器化的過程中發現如下問題:
k8s+isito,配置tcp存活或就緒指針,如果開啟了envoy自動注入,那麼所有的端口都可以被檢測到,進而導緻指針會存在失效問題。該問題可以通過增加如下配置解決:
traffic.sidecar.istio.io/excludeInboundPorts: '12800'
但是會影響後期isito相關流量治理功能的使用,是以推薦的存活或就緒指針還是http請求方式比較靠譜。
開啟了envoy自動注入,那麼所有的端口都可以被檢測到 怎麼立即呢?
pod中java服務提供的端口是1280,無論java服務是否起來,
telnet podIP 1280 總是通的;
注意如果java服務沒有啟動,那麼在pod内執行telnet localhost 1280是不通的,原因如下:
istio的邊車開啟後,會攔截所有端口對應的所有流量
問題2:因isito配置導緻的websocket關閉變慢問題,增加如下envoyfilter即可
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: delayed-close-timeout
namespace: istio-system
spec:
configPatches:
- applyTo: NETWORK_FILTER
match:
listener:
filterChain:
filter:
name: envoy.http_connection_manager
patch:
operation: MERGE
value:
typed_config:
'@type': >-
type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
delayed_close_timeout: 0s