今天我來分享一些,之前在部署 istio 時,碰到的一些小地雷。
首先大家不知道還記不記得這篇k8s Service 介紹。像下面這個設定黨
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
# type 有四種 ClusterIP, NodePort, LoadBalancer, ExternalName
# 預設是 ClusterIP
type: ClusterIP
# 選擇帶有 "app=nginx" 的 pod
selector:
app: nginx
ports:
- protocol: TCP
port: 80
name: http-web
targetPort: 80
裡面spec.ports.name
這個欄位在 istio 模式下是有意義的,之前我剛開始在練習部署時,就發現明明在原本模式都正常運作的服務,切換到 istio 模式下,發現原本要呼叫相應 api 的服務,通通都 request 不到,後來才發現,原來在 istio 模式下 name 是有意義的。
他的命名方式是 <protocol>[-<suffix>-]
,支援的 protocol 如下
這個功能會發生在 istio 1.6之前的版本,如果採用默認的 mtls,它會定期的自動更新,更新當下,如果有長連線的行為的服務,會中斷掉,這個對我們也困擾很久,大家可以對自己任一個服務下
$ kubectl exec $POD -c istio-proxy -n $NAMESPACE -- curl http://localhost:15000/certs | head -c 1000
Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 21292 0 21292 0 0 138k 0 --:--:-- --:--:-- --:--:-- 144k
{
"certificates": [
{
"ca_cert": [
{
"path": "./var/run/secrets/istio/root-cert.pem",
"serial_number": "e9637e5fba66f5bdef5c49a3174f4a60",
"subject_alt_names": [],
"days_until_expiration": "3647",
"valid_from": "2020-09-28T01:21:47Z",
"expiration_time": "2030-09-26T01:21:47Z"
}
],
"cert_chain": [
{
"path": "\u003cinline\u003e",
"serial_number": "cfc8a63c1161ce98200ad46c98d553b1",
"subject_alt_names": [
{
"uri": "spiffe://cluster.local/ns/test-istio/sa/default"
}
],
"days_until_expiration": "0",
"valid_from": "2020-09-30T01:12:39Z",
"expiration_time": "2020-10-01T01:12:39Z"
}
]
},
{
"ca_cert": [
{
"path": "\u003cinline\u003e",
"serial_number": "e9637e5fba66f5bdef5c49a3174f4a60",
"subject_alt_names": [],
"days_until_expiration": "3647",
"valid_from": "2020-09-28T01:21:47Z",
"expiration_time": "2030-09-26T01:21:47Z"
}
],
"cer%
主要以 cert_chain
的 expiration_time 為主。 他憑證一定會在那個時間之前就做自動更新的動作
1.6 之後的版本,他更新憑證不會造成連線中斷。
但是如果原本是用 1.6 之前的版本,要注意 1.6 是一個很大的分歧點,istio 在 1.6 做了很大的更新,架構上差異極大,甚至安裝方式也跟之前有差異,所以有需要升級的要注意這一點。