简介

istio是一个service mesh开源实现,由Google/IBM/Lyft共同开发。与之类似的还有conduit,但是功能不如istio丰富稳定。架构图如下:

istio-0.8版本是第一个长期支持版本,相对于之前的版本配置改动较大。

安装

# 去下面的地址下载压缩包
# https://github.com/istio/istio/releases
wget 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/istio
echo 'export PATH=/usr/local/istio/bin:$PATH' > /etc/profile.d/istio.sh
source /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.yaml
apiVersion: 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

# 创建gateway
istioctl 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_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/kube/cleanup.sh

# 清理istio
kubectl delete -f install/kubernetes/istio-demo.yaml
# kubectl delete -f install/kubernetes/istio-demo-auth.yaml
复制代码

参考文档

  • 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
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐