service mesh 開源實現 istio安裝測試

bluetooth發表於2021-09-09

簡介

istio是一個service mesh開源實現,由Google/IBM/Lyft共同開發。與之類似的還有conduit,但是功能不如istio豐富穩定。架構圖如下:

圖片描述

image

安裝

# 去下面的地址下載壓縮包#  
tar xf istio-0.7.1-linux.tar.gz# 使用官方的安裝指令碼安裝curl -L  | sh -# 安裝配置環境變數mv istio-0.7.1 /usr/local/
ln -sv /usr/local/istio-0.7.1 /usr/local/istioecho 'export PATH=/usr/local/istio/bin:$PATH' > /etc/profile.d/istio.shsource /etc/profile.d/istio.sh
istioctl version# 如果環境不是雲環境,不支援LoadBalancer# 作如下修改,使得 ingress 監聽在80和443埠# 修改 Istio ingress 使用 NodePort# 修改使用主機埠對映# 使用此修改版本之後,每臺機器只能執行單個例項# 大概在1548-1590行左右cd /usr/local/istio
cp install/kubernetes/istio.yaml install/kubernetes/istio.yaml.ori
vim install/kubernetes/istio.yaml
...################################# Istio ingress################################apiVersion: v1
kind: Service
metadata:
  name: istio-ingress
  namespace: istio-system
  labels:
    istio: ingress
spec:  #type: LoadBalancer
  # 使用NodePort方式
  type: NodePort
  ports:
  - port: 80#   nodePort: 32000
    name: http
  - port: 443
    name: https
  selector:
    istio: ingress
---
apiVersion: extensions/v1beta1#kind: Deployment# 使用DaemonSet部署方式kind: DaemonSet
metadata:
  name: istio-ingress
  namespace: istio-system
spec:  #DaemonSet不支援replicas
  #replicas: 1
  template:
...
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80          #主機80埠對映
          hostPort: 80
        - containerPort: 443          #主機443埠對映
          hostPort: 443
...# 以下兩種選擇一種安裝方式# 安裝不使用認證(不使用tls)kubectl apply -f install/kubernetes/istio.yaml# 安裝使用認證(使用tls)kubectl apply -f install/kubernetes/istio-auth.yaml# 檢視狀態kubectl get svc -n istio-system
kubectl get pods -n istio-system

啟用自動注入 sidecar

  • 不開啟自動注入部署應用需要使用如下方式的命令

    kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo.yaml)

  • 開啟自動注入後,使用正常命令即可部署應用

    kubectl apply -f samples/bookinfo/kube/bookinfo.yaml

# 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# 生成所需要的證書./install/kubernetes/webhook-create-signed-cert.sh 
    --service istio-sidecar-injector 
    --namespace istio-system 
    --secret sidecar-injector-certs    
# 建立配置configmapkubectl apply -f install/kubernetes/istio-sidecar-injector-configmap-release.yaml# 生成相關yamlcat install/kubernetes/istio-sidecar-injector.yaml | 
     ./install/kubernetes/webhook-patch-ca-bundle.sh > 
     install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml     
# 安裝webhookkubectl 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# 檢視是否有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"...

部署官方測試用例

# 啟動(未開啟自動注入)kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo.yaml)# 啟動(已開啟自動注入)kubectl apply -f samples/bookinfo/kube/bookinfo.yaml# 檢視狀態kubectl get services
kubectl get pods
kubectl get ingress -o wide

訪問測試

# 命令列訪問測試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" {GATEWAY_URL}/productpage# 瀏覽器訪問測試NODE_PORT=$(kubectl get svc istio-ingress -n istio-system -o jsonpath='{.spec.ports[0].nodePort}')
NODE_IP='11.11.11.112'echo {NODE_IP}:${NODE_PORT}/productpage# 使用daemonset方式部署可以使用如下方式訪問# 11.11.11.112為其中一個node節點的ipcurl 

清理

# 清理官方用例samples/bookinfo/kube/cleanup.sh# 清理istiokubectl delete -f install/kubernetes/istio.yaml# kubectl delete -f install/kubernetes/istio-auth.yaml



作者:CountingStars_
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3402/viewspace-2820096/,如需轉載,請註明出處,否則將追究法律責任。

相關文章