istio部署-快速入门

2023-07-12,,

参考

istio/istio
Quick Start Evaluation Install
fleeto/sleep
fleeto/flaskapp

本文为 istio 快速入门部署,一般用于演示环境。

1. 准备工作

k8s集群要支持istio自动注入,需要检查api server的启动参数,确保 admission control 部分按顺序启用 MutatingAdmissionWebhookValidatingAdmissionWebhook;
通过 kube-apiserver -h | grep enable-admission-plugins 查看已启用的 admission control
Which plugins are enabled by default

2. 下载

# 下载1.1.7版本
wget https://github.com/istio/istio/releases/download/1.1.7/istio-1.1.7-linux.tar.gz # 解压
tar -zxvf istio-1.1.7-linux.tar.gz

3. 实施

cd istio-1.1.7
kubectl apply -f install/kubernetes/istio-demo.yaml # "-w" 参数用于持续查询pod状态变化;
# pod状态为 "Completed" 时, 表示执行 "Job" 留下的pod, "Completed" 状态说明 "Job" 执行成功
kubectl get pod -n istio-system -w

4. 应用示例

4.1 部署应用

git clone https://github.com/fleeto/flaskapp.git
cd flaskapp cat flask.istio.yaml
apiVersion: v1
kind: Service
metadata:
name: flaskapp
labels:
app: flaskapp
spec:
# "selector" 仅使用1个标签,则 "Service" 对两个 "Deployment" 均有效
selector:
app: flaskapp
ports:
# 根据istio规范对端口进行命名
- name: http
port: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: flaskapp-v1
spec:
replicas: 1
template:
metadata:
# 两个标签,其中以不同的 "version" 标签进行区分;
# istio中通常使用这两个标签作为应用与版本的标识
labels:
app: flaskapp
version: v1
spec:
containers:
- name: flaskapp
# image一致
image: dustise/flaskapp
imagePullPolicy: Always
# 注册一个名为 "version" 的环境变量,两个应用取值不同
env:
- name: version
value: v1
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: flaskapp-v2
spec:
replicas: 1
template:
metadata:
labels:
app: flaskapp
version: v2
spec:
containers:
- name: flaskapp
image: dustise/flaskapp
imagePullPolicy: Always
env:
- name: version
value: v2 # 部署应用
kubectl apply -f flask.istio.yaml

4.2 部署istio

使用 istioctl 进行注入, 其修改 Deployment , 在Pod中注入 Sidecar 容器;
本节采用手工注入,实际生产环境中一般会打开pod的自动注入功能。

# 注入 "sidecar"
istioctl kube-inject -f flask.istio.yaml | kubectl apply -f - # 查看pod
# pod中容器数量从"1"变为"2"
kubectl get pod -w # 注入容器 "istio-proxy" ;
# 另有初始化劫持容器 "istio-init"
kubectl describe pod flaskapp-v1-66b59cdfc6-zk9sz

4.3 部署客户端服务

git clone https://github.com/fleeto/sleep.git
cd sleep/kubernetes/ # 虽然客户端服务不需要提供对外服务能力, 但 "sleep.yaml" 仍然需要创建 "Service" 资源对象;
# istio注入要求: 没有 "Service" 的 "Deployment" 无法被istio发现并进行操作
istioctl kube-inject -f sleep.yaml | kubectl apply -f - # 验证
kubectl get pod -w

4.4 验证服务

# 重复获取 "http://flaskapp/env/version" 的内容;
# 返回结果:"v2" 与 "v1" 结果随机出现,大约各一半
kubectl exec -it sleep-5f47f5c866-9xtsf -c sleep bash
bash-4.4# for i in `seq 10` ; do http --body http://flaskapp/env/version ; done

4.5 创建目标规则与默认路由

4.5.1 目标规则

# 使用 Pod 标签将 "flaskapp" 服务分成两个 "subset"
cat flaskapp/flaskapp-destinationrule.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: flaskapp
spec:
host: flaskapp
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2

4.5.2 默认路由

建议:无论是否进行进一步的流量控制,都建议为网格中的服务创建默认的路由规则,以防发生意料之外的访问结果。

# "VirtualService" 资源对象,接管对 "flaskapp" 主机名的访问,将所有流量转发到 "DestinationRule" 资源对象定义的 "v2 subset"
cat flaskapp/flaskapp-default-vs-v2.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: flaskapp-default-v2
spec:
hosts:
- flaskapp
http:
- route:
- destination:
host: flaskapp
subset: v2

4.5.3 验证

# 重复获取 "http://flaskapp/env/version" 的内容;
# 返回结果:只有 "v2" 返回,默认路由已生效
kubectl exec -it sleep-5f47f5c866-9xtsf -c sleep bash
bash-4.4# for i in `seq 10` ; do http --body http://flaskapp/env/version ; done

5. 总结

典型流程:注入-->部署-->创建目标规则-->创建默认路由。

istio部署-快速入门的相关教程结束。

《istio部署-快速入门.doc》

下载本文的Word格式文档,以方便收藏与打印。