一、环境情况
环境: Ubuntu20.04
机器数量: 单机1台
IP: 10.9.2.83
二、准备知识
为什么使用 Istio?
Istio提供了一种更高级别的服务网格解决方案,它可以简化和加强 Kubernetes 集群中的服务间通信、流量管理、安全性和可观测性。使用 Istio,你可以减少依赖大量的 Ingress 资源和 Service 对象来处理网络的路由和代理。
安装istio为什么要先安装k8s?
istio是基于k8s来部署与使用的,所以安装istio前要先安装k8s环境
- 本文只是为了入门,所以基于单机的方式搭建k8s也就是使用minikube的方式来搭建k8s
- 🎯minikube的网络情况与kubectl搭建的有所不同,minikube本身就类似个虚拟机。所以nodeport对应的ip并不是主机ip,而是minikube虚拟的ip,这点比较重要,后续步骤里也会有提到。
安装istio前需要先安装些什么?
安装istio前要先安装docker、minikube。关联到的应用名软件有:
- docker
- minikube
- hello-minikube
- bookinfo
- kiali
- istio
- kubectl
- istioctl
三、安装步骤
3.1、Docker安装
- 更新 Ubuntu 20.04 系统的包信息,并安装使用 HTTPS 来访问 Docker 软件的工具包。
sql
apt update
apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
- 导入 Docker 的官方 GPG 密钥,并添加 Docker APT 软件源。
markdown
curl -fsSL [4](https://download.docker.com/linux/ubuntu/gpg) | sudo apt-key add -
add-apt-repository "deb [arch=amd64] [5](https://download.docker.com/linux/ubuntu) $(lsb_release -cs) stable"
- 安装最新版本的 docker-ce。
sql
apt update
apt install docker-ce
验证 Docker 是否已经成功安装,您可以运行一个测试容器。
docker -v

到这里docker就安装好了,如果速度慢可以修改一下docker国内源。
3.2、k8s-minikube安装
安装minikube,并启动 minikube。
- 下载 minikube 的二进制文件,并将其安装到 /usr/local/bin 目录下。
ruby
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
- 下载 kubectl 的二进制文件,并将其安装到 /usr/local/bin 目录下。
bash
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
sudo install kubectl /usr/local/bin/kubectl
- 启动 minikube
css
minikube start --image-mirror-country=cn --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version=1.23.8
p.s.如果安装好了,下次机器重启使用minikube start就可以启动minikube了。
- 启动后,查看一下安装了哪些pod
arduino
kubectl get pods -A

- 现在我们来测试一下minikube环境,安装一个测试应用
ini
kubectl create deployment hello-minikube --image=kicbase/echo-server:1.0
kubectl expose deployment hello-minikube --type=NodePort --port=8080
- 查询安装的情况(需要等待一会执行,因为此时需要pull相应的docker镜像)
arduino
kubectl get pods

arduino
kubectl get services hello-minikube

可以看到已经在minikube环境下部署好到hello-minikube应用,我们来方式试试。
一般来说k8s访问service的方式是主机ip+nodeport端口,可以发现这样是访问不了的。这里有点不一样,就是之前说的minikube本身就是个虚拟机,k8s是部署在minikube虚拟机上的。所以我们要先获取minikube虚拟机的ip再加上nodeport的端口来访问。
arduino
# minikube ip
192.168.49.2
# curl 192.168.49.2:31322


还有一种比较简单的方式获取访问地址的方式:minikube service hello-minikube --url
输入以上命令地址就会直接输入了。
- 那么如何在主机上访问hello-minikube呢?
通过以下端口转发的方式这种就可以在主机访问它了。执行后会在前台启动,不要关闭,关闭就不效果了。当然你想在后台启动它就用nohub来启动。
bash
kubectl port-forward service/hello-minikube 7080:8080

再开个窗口,curl localhost:7080

p.s.关于minikube网络我们也可以尝试一下在主机上执行以下命令
ruby
#结果就是主机上只有minikube这个容器
root@ubuntu:/# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ee755138e97 kicbase/stable:v0.0.42 "/usr/local/bin/entr..." 23 hours ago Up 23 hours 127.0.0.1:32772->22/tcp, 127.0.0.1:32771->2376/tcp, 127.0.0.1:32770->5000/tcp, 127.0.0.1:32769->8443/tcp, 127.0.0.1:32768->32443/tcp minikube
#进入容器,类似进入虚拟机
root@ubuntu:/# docker exec -it 5ee755138e97 bash
#发现在容器里执行curl localhost:31322就可以访问
root@minikube:/# curl localhost:31322
Request served by hello-minikube-fdf664d87-zftgp
HTTP/1.1 GET /
Host: localhost:31322
Accept: */*
User-Agent: curl/7.81.0
到这时minikube就安装与测试完成。
3.3、istio安装步骤
- 下载 istio 的安装包
arduino
curl -L https://istio.io/downloadIstio | sh -
下载后,解压到/usr/local/istio
- istioctl 命令添加到 PATH 中。
bash
export PATH=/usr/local/istio/bin:$PATH
这里是临时生效,如果要永久生成就修改vi /etc/profile。
- 查看是否安装成功
arduino
istioctl version
no running Istio pods in "istio-system"
1.12.1
- 使用 istioctl install 命令安装 istio,并选择一个合适的配置文件,例如 demo。
-
- 安装 istio,并使用 demo 配置文件,该配置文件启用了高级别的追踪和访问日志,以及额外的组件,例如 Egress gateway 和 Ingress gateway。
ini
istioctl install --set profile=demo

istioctl version
再执行stioctl version就已经有安装好的东西了。

当然也可以通过以下命令,看看安装了些什么
sql
kubectl -n istio-system get deploy

此至istio就搭建完成了,后面还有篇介绍istio简单使用与测试的文章,大家感兴趣也可以接着看一看。