k8s(四)、微服務框架istio安裝測試

 

資料:

https://www.2cto.com/kf/201805/749007.htmlhtml

https://blog.csdn.net/wenwenxiong/article/details/80068697node

1、前言

Istio是Google/IBM/Lyft聯合開發的開源項目,2017年5月發佈第一個release 0.1.0,Service Mesh微服務新秀,採用sidecar的實現方式,有着高性能、極低的資源開銷、無代碼入侵等優秀特性,扛起微服務大旗,並與當下火熱的k8s Paas容器雲平臺深度整合。官方描述爲:linux

An open platform to connect, manage, and secure microservices
  • 1

Istio提供一種簡單的方式來創建已部署的服務的網絡,具有負載均衡,服務到服務認證,監控等等功能,與k8s深度整合。 
各組件工做圖: 
這裏寫圖片描述git

控制層面組件: 
1.Pilot:負責將調度的配置下發到各svc endpoint後pod中注入的Envoys 
2.Mixer:負責流量策略等統一調度 
3.Citadel:負責安全策略,如TLS證書頒發github

數據層面組件: 
Envroys:將envroys proxy容器,以sidecar的方式注入到svc後端的pod中,與控制層面組件交互。一圖助你理解sidecar工做方式(即:邊三輪~): 
這裏寫圖片描述web

很是感謝: 
http://www.maogx.win/posts/25/json

2、部署安裝

1.部署前準備 
這裏使用較新的istio 0.7版本(目前最新爲0.8),要求k8s版本1.9以上,同時對k8s有如下要求vim

# 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服務
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

3.啓用自動注入sidecarapi

#注意上方講的鉤子必定給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"
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

若不開啓針對命名空間的自動注入,只想對部分部署使用自動注入,可使用:

#不開啓自動注入部署應用須要使用以下方式的命令,即給原有的部署yaml文件內容器部分添加一個istio-proxy容器
kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo.yaml)
  • 1
  • 2

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
  • 1
  • 2
  • 3
  • 4

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
相關文章
相關標籤/搜索