首先需要搭建docker+k8s環境,如何搭建這里就不再贅述,可以自行搜索。
打開命令行,運行命令:
curl -L https://git.io/getLatestIstio | ISTIO_VERSION=1.1.3 sh -
獲取最新版本istio並解壓,
接着進入istio目錄:
cd istio-1.1.3
該目錄下包含:
- 在
install/
目錄中包含了 Kubernetes 安裝所需的.yaml
文件 samples/
目錄中是示例應用istioctl
客戶端文件保存在bin/
目錄之中。istioctl
的功能是手工進行 Envoy Sidecar 的注入。istio.VERSION
配置文件
將istioctl加入PATH環境變量,這樣就可以在任何地方運行該命令:
export PATH=$PWD/bin:$PATH
此時需要安裝helm,來安裝istio到kubernetes集群:
brew install kubernetes-helm
安裝完成之后,進一步安裝tiller:
先給tiller新建一個serviceaccount:
kubectl apply -f install/kubernetes/helm/helm-service-account.yaml
然后使用helm安裝tiller:
helm init --service-account tiller
tiller安裝完成之后,安裝istio-init來對istio進行初始化,主要是一些CRD的創建:
helm install install/kubernetes/helm/istio-init --name istio-init --namespace istio-system
等一段時間之后,使用如下命令查看,是否有53個CRD被創建:
kubectl get crds | grep 'istio.io\|certmanager.k8s.io' | wc -l
53
接着創建istio相關組件,由於istio的ingressgateway的Service默認配置為LoadBalancer,集群環境沒有在雲提供商的平台上,所以需要改成NodePort對外提供訪問。所以要用以下命令進行安裝:
helm install install/kubernetes/helm/istio --name istio --namespace istio-system --set gateways.istio-ingressgateway.type=NodePort
如果你的機器內存不足,可以將pilot的內存降低,在上面命令再加一個參數:
--set pilot.resources.requests.memory="512Mi"
當上面命令成功運行之后,可以通過kubectl命令查看pod和svc的狀態:
kubectl get svc -n istio-system
結果如下:
kubectl get pods -n istio-system
結果如下:
此時,istio已經成功安裝到集群。
如果想要使用istio的sidecar自動注入功能,我們還需要以下配置:
首先,查看kubernetes的apiserver啟動參數:--admission-control是否包含MutatingAdmissionWebhook和ValidatingAdmissionWebhook兩項,如果沒有需要添加。
然后,要給需要使用自動注入功能的namespace加label
kubectl label namespace default istio-injection=enabled
這時,部署到default中的pod都會自動加上sidecar。
這時,istio的環境就已經搭建完成。
官方針對使用istio的Kubernetes環境還有幾項要求:
1、針對創建的Service,啟動的ports下得所有name都要遵循命名規則:<協議>[-<后綴>-],其中<協議>
部分可選擇范圍包括 grpc
、http
、http2
、https
、mongo
、redis
、tcp
、tls
以及 udp
,Istio 可以通過對這些協議的支持來提供路由能力。例如 name: http2-foo
和 name: http
都是有效的端口名,但 name: http2foo
就是無效的。如果沒有給端口進行命名,或者命名沒有使用指定前綴,那么這一端口的流量就會被視為普通 TCP 流量(除非顯式的用 Protocol: UDP
聲明該端口是 UDP 端口)
2、所有部署相關的Pod必須在containers.ports中使用containerPort明確指定監聽的端口列表,未列出的端口將不會經過istio的Proxy。如果是Deployment、StatefulSet、ReplicationController、DaemonSet等也一樣。
3、所有的Pod不論是否公開端口,都必須關聯到至少一個Service上,如果一個 Pod 綁定多個Service,這些服務不能在同一端口上使用不同協議,例如 HTTP 和 TCP。
4、Deployment 、StatefulSet、ReplicationController、DaemonSet等應帶有 app
以及 version
標簽:在使用其進行 Pod 部署的時候,建議顯式的為其加上 app
以及 version
標簽。每個部署都應該有一個有意義的 app
標簽和一個用於標識其版本的 version
標簽。app
標簽在分布式追蹤的過程中會被用來加入上下文信息。Istio 還會用 app
和 version
標簽來給遙測指標數據加入上下文信息。
5、Application UID:不能使用RunAsUser: 1337用戶運行Pod
6、NET_ADMIN
功能: 如果集群中實施了 Pod 安全策略,除非使用 Istio CNI 插件,否則 Pod 必須具有NET_ADMIN
功能。請參閱必需的 Pod 功能。