istio 基础环境搭建

K8s 部署环境操作省略

K8s version: 1.21.1

环境的准备:

https://metallb.universe.tf/ #官网

https://metallb.universe.tf/installation/#installation-by-manifest #install

1
2
3
4
kubectl create ns metallb-system

wget https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/metallb.yaml

创建 metallb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看镜像
grep image metallb.yaml

# 拉取镜像
docker pull quay.io/metallb/speaker:v0.10.2
docker pull quay.io/metallb/controller:v0.10.2

# 修改metallb.yaml 镜像拉取策略
image: quay.io/metallb/speaker:v0.10.2
imagePullPolicy: IfNotPresent #新增

image: quay.io/metallb/controller:v0.10.2
imagePullPolicy: IfNotPresent #新增

# 安装
kubectl apply -f metallb.yaml

# 查看是否创建
kubectl get pods -n metallb-system

创建configmap

https://metallb.universe.tf/configuration/#layer-2-configuration

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 创建地址池
vim pool.yaml

apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.15.230-192.168.15.240

# 创建
kubectl apply -f pool.yaml

# 所有的 work 节点都需拉取镜像
docker pull yauritux/busybox-curl
docker pull nginx

istio 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 下载二进制包
wget https://github.com/istio/istio/releases/download/1.10.3/istio-1.10.3-linux-amd64.tar.gz
#wget https://github.com/istio/istio/releases/download/1.10.3/istioctl-1.10.3-linux-amd64.tar.gz

tar xvf istio-1.10.3-linux-amd64.tar.gz

ls istio-1.10.3/bin/
cp istio-1.10.3/bin/istioctl /bin/

#查看 istio 安装的组件
istioctl profile list

# 查看 istio 组件的内容
istioctl profile dump demo #查看demo组件信息,一般demo用于学习环境

# 安装 demo 环境
istioctl install --set profile=demo
y

# 查看
kubectl get pods -n istio-system #查看 有对应的ns和pod被创建出来
kubectl get svc -n istio-system #创建出了LoadBalancer类型的 istio-ingressgateway,ip地址为192.168.15.230
# 如果没有配置metallb的话,可以把 istio-ingressgateway 的类型改为 NodePort

# 如果需要卸载
istioctl x uninstall --purge
y
# 删除命名空间
kubectl delete ns istio-system

istio 注入

好用的命名空间切换工具 kubens 下载

1
2
3
4
5
curl -L https://github.com/ahmetb/kubectx/releases/download/v0.9.1/kubens -o /bin/kubens

chmod +x /bin/kubens

# 使用kubens命令即可列出当前所有的namespace

测试一下看之前创建的pod流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
mkdir chap1
cd chap1
kubectl create ns ns1

# 切换namespace
kubens ns1
#Context "kubernetes-admin@kubernetes" modifued.
#Active namespace is "ns1".

# 创建一个pod的yaml
kubectl run pod1 --image=nginx --image-pull-policy=IfNotPresent --dry-run=client -o yaml > pod1.yaml

# 查询参数值
kubectl explain pods.spec

vim /del.txt
terminationGracePeriodSeconds: 0

# 编辑pod1
vim pod1.yaml

spec:
terminationGracePeriodSeconds: 0
containers:

# 创建pod
kubectl apply -f pod1.yaml
kubectl get pods #此时这个pod里只有一个容器,即没有sidecar

# 删除测试的pod
kubectl delete pod pod1

使用 istio 单独的注入一个pod

1
2
3
4
5
6
7
8
9
10
11
12
# 创建
istioctl kube-inject -f pod1.yaml | kubectl apply -f -

# 查看pod数量
kubectl get pods #此时READY数为2

#这个pod新增的docker,就是 pilot,envoy


## 在创建一个 pod 测试
sed 's/pod1/pod2/' pod1.yaml | kubectl apply -f -
kubectl get pods # 发现这个 pod2 是没有被注入的

设置自动 istio 注入,可以通过 namespace 去做

1
2
3
4
5
#给ns1的命名空间添加istio标签,那么在这个标签里,所有创建的 pod 都会被自动注入 istio
kubectl label ns ns1 istio-injection=enabled

# 查看labels
kubectl get ns --show-labels

安装kiali :图形化工具,可以直观的查看流量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
kubectl get pods -n istio-system

# 安装
kubectl apply -f istio-1.10.3/samples/addons/kiali.yaml
# 或者可以选择直接全部都安装上
kubectl apply -f istio-1.10.3/samples/addons/

kubectl get svc -n istio-system
# kiali 的PORT:20001,TYPE为 ClusterIP

# 修改 kiali 的 svc
kubectl edit svc kiali -n istio-system

sessionAffinity: None
type: LoadBalancer #把ClusterIP修改为NodePort或者LoadBalancer

# 查看并验证
kubectl get svc -n istio-system
# 查看 kiali 的 ip 和端口,使用浏览器访问
# 进入浏览器后可以测试一下,进入 Graph 页面,选择 istio-system 和 ns1 的 Namespace,可以看到我们现在环境中的拓扑图