简介
istio
是一个service mesh
开源实现,由Google/IBM/Lyft共同开发。与之类似的还有conduit
,但是功能不如istio
丰富稳定。架构图如下:
image
istio-0.8
版本是第一个长期支持版本,相对于之前的版本配置改动较大。
安装
# 去下面的地址下载压缩包# https://github.com/istio/istio/releaseswget https://github.com/istio/istio/releases/download/0.8.0/istio-0.8.0-linux.tar.gz tar xf istio-0.8.0-linux.tar.gz# 使用官方的安装脚本安装curl -L https://git.io/getLatestIstio | sh -# 安装配置环境变量mv istio-0.8.0 /usr/local/ ln -sv /usr/local/istio-0.8.0 /usr/local/istioecho 'export PATH=/usr/local/istio/bin:$PATH' > /etc/profile.d/istio.shsource /etc/profile.d/istio.sh istioctl version# 如果环境不是云环境,不支持LoadBalancer# 作如下修改,使得 ingressgateway 监听在80和443端口# 修改使用主机端口映射# 使用此修改版本之后,每台机器只能运行单个实例# 大概在2661行左右cd /usr/local/istio cp install/kubernetes/istio-demo.yaml install/kubernetes/istio-demo.yaml.ori vim install/kubernetes/istio-demo.yaml ...# Source: istio/charts/ingressgateway/templates/deployment.yamlapiVersion: extensions/v1beta1# kind: Deployment# 使用DaemonSet部署方式kind: DaemonSet metadata: name: istio-ingressgateway namespace: istio-system labels: app: ingressgateway chart: ingressgateway-0.8.0 release: RELEASE-NAME heritage: Tiller istio: ingressgateway spec: # DaemonSet不支持replicas # replicas: template: metadata: labels: istio: ingressgateway annotations: sidecar.istio.io/inject: "false" spec: serviceAccountName: istio-ingressgateway-service-account containers: - name: ingressgateway image: "docker.io/istio/proxyv2:0.8.0" imagePullPolicy: IfNotPresent ports: - containerPort: 80 #主机80端口映射 hostPort: 80 - containerPort: 443 #主机443端口映射 hostPort: 443 - containerPort: 31400 #主机443端口映射 hostPort: 31400 ...# 由于镜像问题,提前拉取镜像# 在所有节点上执行如下命令输出的命令# 可能会失败,需要多次执行image=$(grep 'quay.io/coreos/hyperkube' install/kubernetes/istio-demo.yaml | head -1 | awk '{print $2}' | tr -d '"')echo "docker pull $image"# 以下两种选择一种安装方式# 安装不使用认证(不使用tls)kubectl apply -f install/kubernetes/istio-demo.yaml# 安装使用认证(使用tls)kubectl apply -f install/kubernetes/istio-demo-auth.yaml# 查看状态kubectl get svc -n istio-system kubectl get pods -n istio-system# 访问测试nodeName=$(kubectl get no | grep '<none>' | head -1 | awk '{print $1}') nodeIP=$(ping -c 1 $nodeName | grep PING | awk '{print $3}' | tr -d '()')echo "curl -I http://$nodeIP"
注意
istio-0.8.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-0.8.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"...
部署官方测试用例
# 启动(未开启自动注入)kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo.yaml)# 启动(已开启自动注入)kubectl apply -f samples/bookinfo/kube/bookinfo.yaml# 创建gatewayistioctl create -f samples/bookinfo/routing/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=="http")].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_PORTecho $GATEWAY_URLcurl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage# 浏览器访问测试echo "http://${GATEWAY_URL}/productpage"# 使用daemonset方式部署可以使用如下方式访问# 11.11.11.112为其中一个node节点的ipcurl http://11.11.11.112/productpage
清理
# 清理官方用例samples/bookinfo/kube/cleanup.sh# 清理istiokubectl delete -f install/kubernetes/istio-demo.yaml# kubectl delete -f install/kubernetes/istio-demo-auth.yaml
作者:CountingStars_
链接:https://www.jianshu.com/p/fc99fc05e86c