1、设置服务器本机代理,要不有可能无法访问到github等地址,导致程序包下载失败(非必要)

vim set-proxy.sh

export HTTPS_PROXY=http://192.168.31.215:7890   #我本地的代理地址
export NO_PROXY="127.0.0.1/8,192.168.100.0/24,*.haoge.com,.cluster.local,.svc.cluster.local,10.100.0.0/16,10.200.0.0/16"
exec bash

开启代理:chmod +x set-proxy.sh && ./set-proxy.sh

2、本机开启代理,登录istio官网:https://istio.io/

3、找到Documentation–>Getting Started,然后根据官网步骤执行

1、cd /usr/local && curl -L https://istio.io/downloadIstio | sh -
2、ln -sv istio-1.17.1 istio
   ln -sv /usr/local/istio/bin/istioctl /usr/local/bin/istioctl

4、使用istioctl命令部署

​ 查看列表:istioctl profile list

​ 部署测试环境: istioctl install –set profile=demo

5、部署完成后会在istio-system名称空间下创建istio等pod

​ kubectl get pods -n istio-system

​ 再次执行 istioctl version ,可以看到控制平面和数据平面的版本信息

6、修改网关的外部地址,修改为nodePort模式

​ kubectl get svc -n istio-system #可以看到数据平面的 入口网关服务的类型为LoadBalancer

​ 直接修改svc: kubectl edit svc -n istio-system istio-ingressgateway,type类型修改为NodePort

也可以使用Openelb 本地测试使用loadbalancer类型的svc,具体可参考网上文档

7、为指定需要注入istio代理的名称空间打标签

kubectl label namespace default istio-injection=enabled

查看名称空间是否打上标签: kubectl get ns –show-labels

8、启动一个测试容器

kubectl run client-$RANDOM –image=ikubernetes/admin-box:v1.2 –restart=Never -it –rm –command – /bin/bash

发现报错:

Error from server (InternalError): Internal error occurred: failed calling webhook "namespace.sidecar-injector.istio.io": failed to call webhook: Post "https://istiod.istio-system.svc:443/inject?timeout=10s": context deadline exceeded

解决方案:

在每个k8s-master节点修改kube-apiserver.service文件

vim /etc/systemd/system/kube-apiserver.service ,新增如下两行参数,第一行如果存在的话就只新增第二行

  --enable-aggregator-routing=true \
  --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,NodeRestriction \

9、部署istio的附件服务

cd /usr/local/istio/samples/addons && kubectl apply -f .

会部署grafana,jaeger(链路追踪),kiali(可视化),prometheus等服务,默认会部署到istio-system

10、通过Ingress Gateway开放各个服务,使用类似基于FQDN虚拟主机,统一通过Ingress gateway的外部地址进行访问,也可以使用NodePort方式访问

kubectl get crds 负责流量治理的crd服务

kubectl api-resources –api-group=networking.istio.io

可以看到有三个比较重要的资源

查看哪些服务注入了istio代理:istioctl proxy-status 或者简写为 istioctl ps

A、通过将kiali的svc模式改为NodePort模式的访问方式

kubectl edit svc -n istio-system kiali 将类型修改为NodePort模式,并配置nodePort端口等即可

B、使用ingressgateway方式给kiali配置访问域名

vim kiali-gateway.yaml 流量接入网关,配置访问域名

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: kiali-gateway
  namespace: istio-system
spec:
  selector:
    app: istio-ingressgateway
  servers:
  - port:
      number: 80
      name: http-kiali
      protocol: HTTP
    hosts:
    - "kiali.haoge.com"
---

vim kiali-virtualservice.yaml 确认gateway与哪些服务关联

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: kiali-virtualservice
  namespace: istio-system
spec:
  hosts:
  - "kiali.haoge.com"
  gateways:
  - kiali-gateway
  http:
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        host: kiali
        port:
          number: 20001
---

vim kiali-destinationrule.yaml

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: kiali
  namespace: istio-system
spec:
  host: kiali
  trafficPolicy:
    tls:
      mode: DISABLE
---

部署gateway、vs、destinationrule等资源

kubectl apply -f kiali-gateway.yaml
kubectl apply -f kiali-virtualservice.yaml
kubectl apply -f kiali-destinationrule.yaml

会看到会创建如下资源:

kubectl get gateway -n istio-system
NAME            AGE
kiali-gateway   3m55s

kubectl get VirtualService -n istio-system
NAME                   GATEWAYS            HOSTS                 AGE
kiali-virtualservice   ["kiali-gateway"]   ["kiali.haoge.com"]   3m18s

kubectl get DestinationRule -n istio-system
NAME    HOST    AGE
kiali   kiali   4m40s

11、配置haproxy,使用一个虚拟IP负责调度三个node节点的31245端口

我这里使用了8080端口,因我部署haproxy的服务器80端口被占用了,默认最好使用80端口,虚拟IP为192.168.100.31

vim /etc/haproxy/haproxy.cfg 部分配置

...
listen k8s-istio-ingressgateway-8080
        bind 192.168.100.31:8080
        mode tcp
        server master1 192.168.100.23:31245 check inter 3s fall 3 rise 1
        server master2 192.168.100.24:31245 check inter 3s fall 3 rise 1
        server master3 192.168.100.25:31245 check inter 3s fall 3 rise 1

12、本地配置host解析,浏览器打开kiali.haoge.com:8080 即可看到kiali页面

vim C:\Windows\System32\drivers\etc\hosts

...
192.168.100.31 kiali.haoge.com

13、部署bookinfo

cd /usr/local/istio/samples

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

istioctl ps

root@k8s-master1:~# istioctl  ps
NAME                                                   CLUSTER        CDS        LDS        EDS        RDS          ECDS         ISTIOD                     VERSION
details-v1-698b5d8c98-8qrxr.default                    Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED       NOT SENT     istiod-c564cfff6-58t62     1.17.1
istio-egressgateway-89bcb88bb-rkgtq.istio-system       Kubernetes     SYNCED     SYNCED     SYNCED     NOT SENT     NOT SENT     istiod-c564cfff6-58t62     1.17.1
istio-ingressgateway-75ffbf99d6-877lg.istio-system     Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED       NOT SENT     istiod-c564cfff6-58t62     1.17.1
productpage-v1-bf4b489d8-vvxhn.default                 Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED       NOT SENT     istiod-c564cfff6-58t62     1.17.1
ratings-v1-5967f59c58-ptw4p.default                    Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED       NOT SENT     istiod-c564cfff6-58t62     1.17.1
reviews-v1-9c6bb6658-hf4jt.default                     Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED       NOT SENT     istiod-c564cfff6-58t62     1.17.1
reviews-v2-8454bb78d8-tl7bt.default                    Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED       NOT SENT     istiod-c564cfff6-58t62     1.17.1
reviews-v3-6dc9897554-5mgh4.default                    Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED       NOT SENT     istiod-c564cfff6-58t62     1.17.1
sleep-75bbc86479-dsd9b.default                         Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED       NOT SENT     istiod-c564cfff6-58t62     1.17.1

可以部署客户端验证服务

kubectl apply -f sleep/sleep.yaml

此时可以进入容器客户端进行访问

kubectl exec -it sleep-75bbc86479-dsd9b -- sh
   curl 192.168.100.31:8080/productpage

14、需要外部访问bookinfo页面,执行如下命令

kubectl apply -f bookinfo/networking/bookinfo-gateway.yaml

浏览器访问: http://192.168.100.31:8080/productpage 即可访问bookinfo页面

此时不停刷新浏览器访问的productpage页面,在观测kiali的页面,即可看到访问流程图信息

15、部署destination-rule,控制访问流量到指定版本

kubectl apply -f bookinfo/networking/destination-rule-reviews.yaml

此时,如果想把所有的访问流量都发送至v1版本,执行如下命令即可

kubectl apply -f bookinfo/networking/virtual-service-all-v1.yaml

此时浏览器访问后,每次刷新的版本即都是v1了

如果登录了jason用户,就定位到v2版本,否则默认就是v1版本

kubectl apply -f bookinfo/networking/virtual-service-reviews-test-v2.yaml

16、拆除Istio服务

cd /usr/local/istio/samples/
#拆除附件
kubectl delete -f addons
# 拆除bookinfo相关资源
kubectl delete -f bookinfo/networking/virtual-service-reviews-test-v2.yaml
kubectl delete -f bookinfo/networking/destination-rule-reviews.yaml
kubectl delete -f bookinfo/networking/bookinfo-gateway.yaml
kubectl delete -f sleep/sleep.yaml
kubectl delete  -f bookinfo/platform/kube/bookinfo.yaml
# 卸载istio服务
istioctl uninstall -y --purge
kubectl delete namespace istio-system
kubectl label namespace default istio-injection-
作者:于浩  创建时间:2023-03-21 19:38
最后编辑:于浩  更新时间:2024-05-20 16:57