service mesh istio-1.0 快速安裝體驗

_CountingStars發表於2018-08-04

簡介

istio是一個service mesh開源實現,由Google/IBM/Lyft共同開發。架構圖如下:

istio-arch

安裝

安裝k8s叢集

參考文章

安裝istioctl

# 去下面的地址下載壓縮包
# https://github.com/istio/istio/releases
wget https://github.com/istio/istio/releases/download/1.0.0/istio-1.0.0-linux.tar.gz
tar xf istio-1.0.0-linux.tar.gz

# 安裝配置環境變數
mv istio-1.0.0 /usr/local/
ln -sv /usr/local/istio-1.0.0 /usr/local/istio
echo 'export PATH=/usr/local/istio/bin:$PATH' > /etc/profile.d/istio.sh
source /etc/profile.d/istio.sh
istioctl version
複製程式碼

在k8s叢集中安裝istio

# 如果環境不是雲環境,不支援LoadBalancer
# 作如下修改,使得 ingressgateway 監聽在80和443埠
# 修改使用主機埠對映
# 使用此修改版本之後,每臺機器只能執行單個例項
# 大概在3027行左右
cd /usr/local/istio
sudo cp install/kubernetes/istio-demo.yaml install/kubernetes/istio-demo.yaml.ori
sudo vim install/kubernetes/istio-demo.yaml
...
apiVersion: extensions/v1beta1
# kind: Deployment
# 使用DaemonSet部署方式
kind: DaemonSet
metadata:
  name: istio-ingressgateway
  namespace: istio-system
  labels:
    app: ingressgateway
    chart: gateways-1.0.0
    release: RELEASE-NAME
    heritage: Tiller
    app: istio-ingressgateway
    istio: ingressgateway
spec:
  # DaemonSet不支援replicas
  # replicas: 1
  template:
    metadata:
      labels:
        app: istio-ingressgateway
        istio: ingressgateway
      annotations:
        sidecar.istio.io/inject: "false"
        scheduler.alpha.kubernetes.io/critical-pod: ""
    spec:
      serviceAccountName: istio-ingressgateway-service-account
      containers:
        - name: ingressgateway
          image: "gcr.io/istio-release/proxyv2:1.0.0"
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
              # 主機80埠對映
              hostPort: 80
            - containerPort: 443
              # 主機443埠對映
              hostPort: 443
...

# 替換映象地址
sudo sed -i 's@gcr.io/istio-release@docker.io/istio@g' install/kubernetes/istio-demo.yaml
sudo sed -i 's@quay.io/coreos/hyperkube:v1.7.6_coreos.0@registry.cn-shanghai.aliyuncs.com/gcr-k8s/hyperkube:v1.7.6_coreos.0@g' install/kubernetes/istio-demo.yaml

# 檢視映象地址
grep 'image:' install/kubernetes/istio-demo.yaml

# 安裝 CRDs
# 等待數秒
kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml -n istio-system
kubectl get crd

# 安裝不使用認證(不使用tls)
# 如果機器記憶體過小會無法成功啟動
# 實驗使用3臺虛擬機器每臺3G記憶體
kubectl apply -f install/kubernetes/istio-demo.yaml

# 檢視狀態
kubectl get svc -n istio-system
kubectl get pods -n istio-system
複製程式碼

注意

istio-1.0.0 預設已經開啟了自動注入功能以及其他日誌監控和追蹤的相關元件如

  • istio-tracing
  • istio-telemetry
  • grafana
  • prometheus
  • servicegraph

啟用自動注入 sidecar

  • 不開啟自動注入部署應用需要使用如下方式的命令 kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo.yaml)

  • 開啟自動注入後,使用正常命令即可部署應用 kubectl apply -f samples/bookinfo/kube/bookinfo.yaml

# istio-1.0.0 預設已經開啟了自動注入功能

# 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

# 測試自動注入
# 建立
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
# 檢視是否有istio-proxy容器
kubectl get pod
kubectl describe pod $(kubectl get pod | grep sleep | cut -d ' ' -f 1)

# 清理
kubectl delete -f samples/sleep/sleep.yaml 

# 關閉自動注入
kubectl label namespace default istio-injection-

# 關閉部分pod的自動注入功能
...
  template:
    metadata:
      annotations:
        sidecar.istio.io/inject: "false"
...
複製程式碼

部署官方測試用例

# default開啟自動注入
kubectl label namespace default istio-injection=enabled

# 部署 bookinfo
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

# 建立 gateway
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

# 檢視狀態
kubectl get services
kubectl get pods
istioctl get gateway
複製程式碼

訪問測試

# 命令列訪問測試
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
NODE_NAME=$(kubectl get no | grep '<none>' | head -1 | awk '{print $1}')
NODE_IP=$(ping -c 1 $NODE_NAME | grep PING | awk '{print $3}' | tr -d '()')
export GATEWAY_URL=$NODE_IP:$INGRESS_PORT
echo $GATEWAY_URL

curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage

# 瀏覽器訪問測試
echo "http://${GATEWAY_URL}/productpage"

# 使用daemonset方式部署可以使用如下方式訪問
# 11.11.11.112為其中一個node節點的ip
curl http://11.11.11.112/productpage

# 清理
samples/bookinfo/platform/kube/cleanup.sh
複製程式碼

清理

# 清理istio
kubectl delete -f install/kubernetes/helm/istio/templates/crds.yaml -n istio-system
kubectl delete -f install/kubernetes/istio-demo.yaml

# kubectl delete -f install/kubernetes/istio-demo-auth.yaml
複製程式碼

使用helm安裝istio

安裝helm

參考文章

安裝istio

# 檢視配置
cd /usr/local/istio
egrep -v "^$|#" install/kubernetes/helm/istio/values.yaml

# 安裝 CRDs
kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml
kubectl get crd

# 根據上面檢視的配置和需求配置相關引數
# 部署
helm install install/kubernetes/helm/istio --name istio --namespace istio-system \
--set ingress.enabled=false \
--set global.hub="docker.io/istio" \
--set global.hyperkube.hub="registry.cn-shanghai.aliyuncs.com/gcr-k8s" \
--set gateways.istio-ingressgateway.type=NodePort \
--set gateways.istio-egressgateway.type=NodePort

# 檢視
helm ls
kubectl get pods -n istio-system
kubectl get svc -n istio-system

# 執行之前的測試

# 清理
helm delete --purge istio
kubectl delete -f install/kubernetes/helm/istio/templates/crds.yaml -n istio-system
複製程式碼

參考文件

  • https://istio.io/docs/setup/kubernetes/quick-start.html
  • https://istio.io/docs/guides/bookinfo.html
  • https://istio.io/docs/setup/kubernetes/sidecar-injection.html#automatic-sidecar-injection

相關文章