https://www.2cto.com/kf/201805/749007.htmlhtml
https://blog.csdn.net/wenwenxiong/article/details/80068697node
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
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
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服务
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.启用自动注入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" ...
若不开启针对命名空间的自动注入,只想对部分部署使用自动注入,可使用:
#不开启自动注入部署应用须要使用以下方式的命令,即给原有的部署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