Minikube

Istio 是 service mesh 的一个解决方案,已经有部分大厂开始落地的。本文将会通过官方提供的一个 BookInfo 案例来学习 Istio 的各种操作。

准备

准备开始

安装 Minikube

# brew 直接安装
brew install minikube

export HTTP_PROXY=http://<proxy hostname:port>
export HTTPS_PROXY=https://<proxy hostname:port>
export NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,192.168.99.0/24,192.168.39.0/24

设置 proxy

export HTTP_PROXY=http://192.168.64.1:7890 HTTPS_PROXY=http://192.168.64.1:7890 ALL_PROXY=socks5://192.168.64.1:7891 NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,192.168.64.0/24

export HTTP_PROXY=http://192.168.64.1:7890 HTTPS_PROXY=http://192.168.64.1:7890 ALL_PROXY=socks5://192.168.64.1:7891 NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,192.168.64.0/24

export SS_ADDR=192.168.64.1
export SS_HTTP_PORT=7890
export SS_SOCKET_PORT=7891

export HTTP_PROXY=http://$SS_ADDR:$SS_HTTP_PORT
export HTTPS_PROXY=http://$SS_ADDR:$SS_HTTP_PORT
export ALL_PROXY=socks5://$SS_ADDR:$SS_SOCKET_PORT
export NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16


export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7891

unset SS_ADDR
unset SS_HTTP_PORT
unset SS_SOCKET_PORT
unset HTTP_PROXY
unset HTTPS_PROXY
unset NO_PROXY

minikube docker-env HTTP_PROXY=http://$SS_ADDR:$SS_HTTP_PORT HTTPS_PROXY=http://192.168.64.1:7890 ALL_PROXY=socks5://192.168.64.1:7891 NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,192.168.64.0/24

minikube docker-env HTTPS_PROXY=http://192.168.64.1:7890

minikube config set cpus 8
minikube config set memory 10000
minikube config set  disk-size 100GB

minikube delete --all
minikube start --kubernetes-version=1.16.9

minikube start --memory=16384 --cpus=8 --kubernetes-version=1.18.2

minikube start --docker-env http_proxy=http://192.168.64.1:7890 \
                 --docker-env https_proxy=https://192.168.64.1:7890
kubectl create deployment hello-minikube1 --image=k8s.gcr.io/echoserver:1.4
kubectl expose deployment hello-minikube1 --type=LoadBalancer --port=8080
kubectl expose deployment kiali --type=LoadBalancer --port=8081
kubectl expose deployment dashboard-metrics-scraper --type=LoadBalancer --port10081


kubectl expose deployment productpage-v1 --type=LoadBalancer --port=9080
minikube service

Istio

curl -L https://git.io/getLatestIstio | sh -
cd istio-1.5.4
export PATH=$PWD/bin:$PATH
istioctl manifest apply --set profile=demo
  • 设置自动注入 Sidecar.
kubectl label namespace default istio-injection=enabled
  • 部署应用
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
  • 配置 Ingress 网关
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

提示如果遇到网络问题 image pull 不下来可以在本地 pull 镜像,再用 minikube 推到 kubernetes 上

Events:
  Type    Reason     Age        From               Message
  ----    ------     ----       ----               -------
  Normal  Scheduled  <unknown>  default-scheduler  Successfully assigned default/details-v1-6fc55d65c9-fn745 to minikube
  Normal  Pulled     63s        kubelet, minikube  Container image "docker.io/istio/proxyv2:1.5.4" already present on machine
  Normal  Created    63s        kubelet, minikube  Created container istio-init
  Normal  Started    63s        kubelet, minikube  Started container istio-init
  Normal  Pulling    62s        kubelet, minikube  Pulling image "docker.io/istio/examples-bookinfo-details-v1:1.15.0"
docker pull docker.io/istio/examples-bookinfo-details-v1:1.15.0
docker pull docker.io/istio/examples-bookinfo-productpage-v1:1.15.0
docker pull docker.io/istio/examples-bookinfo-ratings-v1:1.15.0
docker pull docker.io/istio/examples-bookinfo-ratings-v1:1.15.0
docker pull docker.io/istio/examples-bookinfo-reviews-v1:1.15.0
docker pull docker.io/istio/examples-bookinfo-reviews-v2:1.15.0
docker pull docker.io/istio/examples-bookinfo-reviews-v3:1.15.0

docker tag  istio/examples-bookinfo-details-v1 docker.io/istio/examples-bookinfo-details-v1:1.15.0

minikube cahce add docker.io/istio/examples-bookinfo-reviews-v3:1.15.0

dashboard

KUBERNETES_SERVICE_HOST and
KUBERNETES_SERVICE_PORT must be

export KUBERNETES_SERVICE_HOST=https://192.168.64.8
export KUBERNETES_SERVICE_PORT=8443
  controlz    Open ControlZ web UI
  envoy       Open Envoy admin web UI
  grafana     Open Grafana web UI
  jaeger      Open Jaeger web UI
  kiali       Open Kiali web UI
  prometheus  Open Prometheus web UI
  zipkin      Open Zipkin web UI

配置 Istio Gateway

export INGRESS_HOST=$(minikube ip)
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')

export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

echo  GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
GATEWAY_URL=192.168.64.8:32228

boofinfo

kubectl -n default delete  deployment  --all
kubectl -n default delete  services  --all
kubectl -n default delete  secrets  --all
kubectl -n default delete  gateway  --all
kubectl -n default delete  VirtualService  --all
kubectl -n default delete  DestinationRule  --all


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

kubectl get services
kubectl get pods
`kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"`

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


sh samples/bookinfo/platform/kube/cleanup.sh

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
  • Benchmark
while true; do
  curl -s http://192.168.64.8:32228/productpage > /dev/null
  echo -n .;
  sleep 0.2
done