k8s(四)、微服務框架istio安裝測試
阿新 • • 發佈:2019-02-16
一、前言
Istio是Google/IBM/Lyft聯合開發的開源專案,2017年5月釋出第一個release 0.1.0,Service Mesh微服務新秀,採用sidecar的實現方式,有著高效能、極低的資源開銷、無程式碼入侵等優秀特性,扛起微服務大旗,並與當下火熱的k8s Paas容器雲平臺深度整合。官方描述為:
An open platform to connect, manage, and secure microservices
Istio提供一種簡單的方式來建立已部署的服務的網路,具備負載均衡,服務到服務認證,監控等等功能,與k8s深度整合。
各元件工作圖:
控制層面元件:
1.Pilot:負責將排程的配置下發到各svc endpoint後pod中注入的Envoys
2.Mixer:負責流量策略等統一排程
3.Citadel:負責安全策略,如TLS證書頒發
資料層面元件:
Envroys:將envroys proxy容器,以sidecar的方式注入到svc後端的pod中,與控制層面元件互動。一圖助你理解sidecar工作方式(即:邊三輪~):
二、部署安裝
1.部署前準備
這裡使用較新的istio 0.7版本(目前最新為0.8),要求k8s版本1.9以上,同時對k8s有以下要求
# k8s 1.9 版本以後才能使用
# 檢視是否支援
kubectl api-versions | grep admissionregistration
# 除了要滿足以上條件外還需要檢查kube-apiserver啟動的引數
# k8s 1.9 版本要確保 --admission-control 裡有 MutatingAdmissionWebhook,ValidatingAdmissionWebhook
# k8s 1.9 之後的版本要確保 --enable-admission-plugins 裡有MutatingAdmissionWebhook,ValidatingAdmissionWebhook
# kubeadm預設安裝的k8s 1.9版本,kube-apiserver啟動引數 --admission-control 裡沒有 MutatingAdmissionWebhook,ValidatingAdmissionWebhook
#需要修改vim /etc/kubernetes/manifests/kube-apiserver.yaml,給--admission-control 新增兩個引數 MutatingAdmissionWebhook,ValidatingAdmissionWebhook
#新增完成儲存退出後重啟kubelet服務
2.安裝istio
wget https://github.com/istio/istio/releases/download/0.7.1/istio-0.7.1-linux.tar.gz
tar xf istio-0.7.1-linux.tar.gz
# 安裝配置環境變數
mv istio-0.7.1 /usr/local/
ln -sv /usr/local/istio-0.7.1 /usr/local/istio
echo 'export PATH=/usr/local/istio/bin:$PATH' > /etc/profile.d/istio.sh
source /etc/profile.d/istio.sh
istioctl version
# 如果環境不是雲環境,不支援LoadBalancer
# 在公司生產環境中ingress-controller使用的是traefik,因此我這裡是以ClusterIP的方式部署的istio-ingress service
# 若沒有其他的ingress,可以直接使用istio-ingress,修改 Istio-ingress service type使用 NodePort
# 大概在1548-1590行左右
cd /usr/local/istio
cp install/kubernetes/istio.yaml install/kubernetes/istio.yaml.ori
vim install/kubernetes/istio.yaml
...
apiVersion: v1
kind: Service
metadata:
name: istio-ingress
namespace: istio-system
labels:
istio: ingress
spec:
# type: LoadBlance
type: ClusterIP
ports:
- port: 80
# nodePort: 32000
name: http
- port: 443
name: https
selector:
istio: ingress
...
# 安裝不使用認證(不使用tls)
kubectl apply -f install/kubernetes/istio.yaml
3.啟用自動注入sidecar
#注意上方講的鉤子一定給kube-apiserver要配置上
# 生成所需要的證書
./install/kubernetes/webhook-create-signed-cert.sh \
--service istio-sidecar-injector \
--namespace istio-system \
--secret sidecar-injector-certs
# 建立配置configmap
kubectl apply -f install/kubernetes/istio-sidecar-injector-configmap-release.yaml
# 生成相關yaml
cat install/kubernetes/istio-sidecar-injector.yaml | \
./install/kubernetes/webhook-patch-ca-bundle.sh > \
install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml
# 安裝webhook
kubectl apply -f install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml
# 檢視
kubectl -n istio-system get deployment -listio=sidecar-injector
kubectl get namespace -L istio-injection
# 開啟注入前,建立測試用例
kubectl apply -f samples/sleep/sleep.yaml
kubectl get deployment -o wide
kubectl get pod
# 設定 default namespace 開啟自動注入
kubectl label namespace default istio-injection=enabled
kubectl get namespace -L istio-injection
# 刪除建立的pod,等待重建
kubectl delete pod $(kubectl get pod | grep sleep | cut -d ' ' -f 1)
# 檢視重建後的pod
# 檢視描述,看看建立pod過程中是否有istio-proxy容器(即sidecar)
kubectl get pod
kubectl describe pod $(kubectl get pod | grep sleep | cut -d ' ' -f 1)
# 清理
kubectl delete -f samples/sleep/sleep.yaml
# 關閉default名稱空間自動注入
kubectl label namespace default istio-injection-
# 關閉部分pod的自動注入功能
...
template:
metadata:
annotations:
sidecar.istio.io/inject: "false"
...
若不開啟針對名稱空間的自動注入,只想對部分部署使用自動注入,可以使用:
#不開啟自動注入部署應用需要使用如下方式的命令,即給原有的部署yaml檔案內容器部分新增一個istio-proxy容器
kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo.yaml)
4.訪問測試
GATEWAY_URL=$(kubectl get po -l istio=ingress -n istio-system -o 'jsonpath={.items[0].status.hostIP}'):$(kubectl get svc istio-ingress -n istio-system -o 'jsonpath={.spec.ports[0].nodePort}')
curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
5.清理:
k8s建立和清理部署應用非常簡單,建立使用apply/create,清理使用delete,檔案指向部署yaml即可。
# 清理官方用例
samples/bookinfo/kube/cleanup.sh
# 清理istio
kubectl delete -f install/kubernetes/istio.yaml
# kubectl delete -f install/kubernetes/istio-auth.yaml