跳到主要内容

8 篇博文 含有标签「Istio」

查看所有标签

Istio 多集群管理

· 阅读需 7 分钟

多主架构安装

https://istio.io/v1.10/zh/docs/setup/install/multicluster/multi-primary/ ![istio跨网络多主集群架构](/img/Istio 多集群管理/istio跨网络多主集群架构.png)

第二个集群操作

kubeadm config view
#podSubnet: 10.244.0.0/16
#serviceSubnet: 10.96.0.0/12

# 修改一下网段,让两个k8s集群的相对应网段不唯一
kubeamd config view > config.yaml
kubectl get nodes
#k8s-master
#k8s-slave1
kubectl drain k8s-slave1 --ignore-daemonsets
kubectl delete nodes k8s-slave1
kubectl drain k8s-master --ignore-daemonsets
kubectl delete nodes k8s-master
rm -rf /etc/kubernetes/pki/*

# 修改配置文件
vim config.yaml
podSubnet: 10.250.0.0/16
serviceSubnet: 10.120.0.0/12

ssh root@192.168.26.92 #slave1
kubeadm reset
rm -rf /etc/kubernetes/pki/*

ssh root@192.168.26.91 #master
kubeadm reset
kubeadm --config=config.yaml init
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# slave1 加入集群:
kubeadm join 192.168.26.91:6443 xxxxxxxxxxxxxxxx

# 安装网络插件
kubectl apply -f calico.yaml

第一套集群

cd ./kube && cp config config.bak
vim config

apiVersion: v1
clusters:
- cluster:
certificate-authority-data: xxxxxxxx 第一套集群copy过来
server: https://192.168.26.81:6443
name: cluster1
- cluster:
certificate-authority-data: xxxxxxxx 第二套集群copy过来
server: https://192.168.26.91:6443
name: cluster2
contexts:
- context:
cluster: cluster1
namespace: ns1
user: admin1
name: cluster1
- context:
cluster: cluster2
namespace: default
user: admin2
name: cluster2
current-context: cluster1
kind: Config
preferences: {}
users:
- name: admin1
user:
client-certificate-data:
client-key-data:
- name: admin2
user:
client-certificate-data:
client-key-data:


cat ~/.kube/config.bak #分别两个集群的对应信息拿来
#certificate-authority-data
#client-certificate-data
#client-key-data

kubectl config get-contexts
* cluster1 cluster1 admin1 ns1
cluster2 cluster2 admin2 default

#查看切换集群
kubectl config use-context cluster2
kubectl get nodes
kubectl config use-context cluster1

#设置环境变量
export CTX_CLUSTER1=cluster1
export CTX_CLUSTER2=cluster2

# 在 Istio 安装包的顶层目录下,创建一个目录来存放证书和密钥:
# https://istio.io/v1.10/zh/docs/tasks/security/cert-management/plugin-ca-cert/
cd istio-1.10.3
mkdir -p certs
pushd certs

#生成根证书和密钥:
make -f ../tools/certs/Makefile.selfsigned.mk root-ca
# 将会生成以下文件:
root-cert.pem:生成的根证书
root-key.pem:生成的根密钥
root-ca.conf:生成根证书的 openssl 配置
root-cert.csr:为根证书生成的 CSR

#对于每个集群,为 Istio CA 生成一个中间证书和密钥
make -f ../tools/certs/Makefile.selfsigned.mk cluster1-cacerts #给cluster1创建
make -f ../tools/certs/Makefile.selfsigned.mk cluster2-cacerts #给cluster2创建

# 在每个集群中,创建一个私密 cacerts,包括所有输入文件 ca-cert.pem,ca-key.pem,root-cert.pem 和 cert-chain.pem。例如,在 cluster1 集群上:
kubectl create namespace istio-system #创建istio命名空间
kubectl create secret generic cacerts -n istio-system \
--from-file=cluster1/ca-cert.pem \
--from-file=cluster1/ca-key.pem \
--from-file=cluster1/root-cert.pem \
--from-file=cluster1/cert-chain.pem

#给cluster2也创建上
kubectl create --context=${CTX_CLUSTER2=cluster2} namespace istio-system
kubectl create --context=${CTX_CLUSTER2=cluster2} secret generic cacerts -n istio-system \
--from-file=cluster2/ca-cert.pem \
--from-file=cluster2/ca-key.pem \
--from-file=cluster2/root-cert.pem \
--from-file=cluster2/cert-chain.pem

跨网络多主架构安装

https://istio.io/v1.10/zh/docs/setup/install/multicluster/multi-primary_multi-network/

# 为 cluster1 设置缺省网络
kubectl --context="${CTX_CLUSTER1}" get namespace istio-system && \
kubectl --context="${CTX_CLUSTER1}" label namespace istio-system topology.istio.io/network=network1

#为 cluster2 设置缺省网络
kubectl --context="${CTX_CLUSTER2}" get namespace istio-system && \
kubectl --context="${CTX_CLUSTER2}" label namespace istio-system topology.istio.io/network=network2

# 为 cluster1 创建 Istio 配置文件:
cat <<EOF > cluster1.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
values:
global:
meshID: mesh1
multiCluster:
clusterName: cluster1
network: network1
EOF

vim cluster1.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
profile: demo
values:
global:
meshID: mesh1
multiCluster:
clusterName: cluster1
network: network1

#将配置文件应用到 cluster1
istioctl install --context="${CTX_CLUSTER1}" -f cluster1.yaml

# 为 cluster2 创建 Istio 配置文件:
cat <<EOF > cluster2.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
values:
global:
meshID: mesh1
multiCluster:
clusterName: cluster2
network: network2
EOF

vim cluster2.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
profile: demo
values:
global:
meshID: mesh1
multiCluster:
clusterName: cluster2
network: network2

#将配置文件应用到 cluster2
istioctl install --context="${CTX_CLUSTER2}" -f cluster2.yaml

## 启用端点发现
# 在 cluster2 中安装一个提供 cluster1 API Server 访问权限的远程 Secret。
istioctl x create-remote-secret \
--context="${CTX_CLUSTER1}" \
--name=cluster1 | \
kubectl apply -f - --context="${CTX_CLUSTER2}"
kubectl get secrets -n istio-system

# 在 cluster1 中安装一个提供 cluster2 API Server 访问权限的远程 Secret。
istioctl x create-remote-secret \
--context="${CTX_CLUSTER2}" \
--name=cluster2 | \
kubectl apply -f - --context="${CTX_CLUSTER1}"

验证安装结果

https://istio.io/v1.10/zh/docs/setup/install/multicluster/verify/

# 首先,在每个集群中创建命名空间 sample:
kubectl create --context="${CTX_CLUSTER1}" namespace sample
kubectl create --context="${CTX_CLUSTER2}" namespace sample

# 为命名空间 sample 开启 sidecar 自动注入:
kubectl label --context="${CTX_CLUSTER1}" namespace sample \
istio-injection=enabled
kubectl label --context="${CTX_CLUSTER2}" namespace sample \
istio-injection=enabled

# 在每个集群中创建 HelloWorld 服务:
kubectl apply --context="${CTX_CLUSTER1}" \
-f samples/helloworld/helloworld.yaml \
-l service=helloworld -n sample
kubectl apply --context="${CTX_CLUSTER2}" \
-f samples/helloworld/helloworld.yaml \
-l service=helloworld -n sample

部署 V1 版的 HelloWorld

# 把应用 helloworld-v1 部署到 cluster1:
kubectl apply --context="${CTX_CLUSTER1}" \
-f samples/helloworld/helloworld.yaml \
-l version=v1 -n sample

# 确认 helloworld-v1 pod 的状态:
kubectl get pod --context="${CTX_CLUSTER1}" -n sample -l app=helloworld
NAME READY STATUS RESTARTS AGE
helloworld-v1-86f77cd7bd-cpxhv 2/2 Running 0 40s

#等待 helloworld-v1 的状态最终变为 Running 状态:

等待 helloworld-v1 的状态最终变为 Running 状态:

#把应用 helloworld-v2 部署到 cluster2:
kubectl apply --context="${CTX_CLUSTER2}" \
-f samples/helloworld/helloworld.yaml \
-l version=v2 -n sample

# 确认 helloworld-v2 pod 的状态:
kubectl get pod --context="${CTX_CLUSTER2}" -n sample -l app=helloworld
NAME READY STATUS RESTARTS AGE
helloworld-v2-758dd55874-6x4t8 2/2 Running 0 40s

# 等待 helloworld-v2 的状态最终变为 Running 状态:

部署 Sleep

# 把应用 Sleep 部署到每个集群:
kubectl apply --context="${CTX_CLUSTER1}" \
-f samples/sleep/sleep.yaml -n sample
kubectl apply --context="${CTX_CLUSTER2}" \
-f samples/sleep/sleep.yaml -n sample

# 确认 cluster1 上 Sleep 的状态:
kubectl get pod --context="${CTX_CLUSTER1}" -n sample -l app=sleep
NAME READY STATUS RESTARTS AGE
sleep-754684654f-n6bzf 2/2 Running 0 5s

# 等待 Sleep 的状态最终变为 Running 状态:
# 确认 cluster2 上 Sleep 的状态:
kubectl get pod --context="${CTX_CLUSTER2}" -n sample -l app=sleep
NAME READY STATUS RESTARTS AGE
sleep-754684654f-dzl9j 2/2 Running 0 5s

# 等待 Sleep 的状态最终变为 Running 状态:

验证跨集群流量

要验证跨集群负载均衡是否按预期工作,需要用 Sleep pod 重复调用服务 HelloWorld。 为了确认负载均衡按预期工作,需要从所有集群调用服务 HelloWorld

# 从 cluster1 中的 Sleep pod 发送请求给服务 HelloWorld:
kubectl exec --context="${CTX_CLUSTER1}" -n sample -c sleep \
"$(kubectl get pod --context="${CTX_CLUSTER1}" -n sample -l \
app=sleep -o jsonpath='{.items[0].metadata.name}')" \
-- curl helloworld.sample:5000/hello

# 重复几次这个请求,验证 HelloWorld 的版本在 v1 和 v2 之间切换:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8
Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv
...

# 现在,用 cluster2 中的 Sleep pod 重复此过程:
kubectl exec --context="${CTX_CLUSTER2}" -n sample -c sleep \
"$(kubectl get pod --context="${CTX_CLUSTER2}" -n sample -l \
app=sleep -o jsonpath='{.items[0].metadata.name}')" \
-- curl helloworld.sample:5000/hello

# 重复几次这个请求,验证 HelloWorld 的版本在 v1 和 v2 之间切换:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8
Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv
...

# 恭喜! 你已成功的在多集群环境中安装、并验证了 Istio!。。。

Envoy 配置及策略

· 阅读需 8 分钟

Envoy 的配置使用

https://www.envoyproxy.io/docs

# 启动一个 nginx 环境
docker pull nginx
docker run -dit --name=web nginx
docker exec -it web bash
/# echo 111 > /usr/share/nginx/html/index.html
/# exit
docker inspect web | grep -i ipaddress
# 172.17.0.2

# 启动 envoy
docker pull envoyproxy/envoy:latest

# 先将下面的 envoy 配置文件写了再启动
docker run -d -p 10000:10000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml --name myenvoy envoyproxy/envoy:latest
# 关键是在于写 envoy 的配置文件 envoy.yaml
docker logs myenvoy

#修改hosts
vim /etc/hosts
192.168.26.23<本级IP> bb.yuan.cc bb

# 客户端测试, envoy设置了: domains: [bb.yuan.cc] #只转发此条
curl bb.yuan.cc bb:10000
#没有返回
curl -H "Host: bb.yuan.cc" bb.yuan.cc bb:10000
#返回111

Envoy配置文件结构

listen -- 监听器
1.我监听的地址
2.过滤链
filter1
路由: 转发到哪里
virtual_hosts
只转发什么
转发到哪里 --> 由后面的 cluster 来定义
filter2
filter3
#envoyproxy.io/docs/envoy/v1.19.1/api-v3/config/filter/filter
cluster
转发规则
endpoints
--指定了我的后端地址

vim envoy.yaml 比较老旧的写法了

admin:
access_log_path: /tmp/admin_access.log
address:
socket_address: { address: 127.0.0.1, port_value: 9901 } #定义管理

static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 10000 } #要监听的地址
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager #指明使用哪个过滤器,这个是做普通的转发
#typed_config:
# "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
# extensions.filters.network.http_connection_manager.v3.HttpConnectionManager 为具体值,type.googleapis.com/envoy为固定前缀
config:
stat_prefix: ingress_http
codec_type: AUTO #都允许
#codec_type: HTTP2 #只允许HTTP2协议访问,(如果是访问nginx容器,要先开启nginx的http2)
#access_log: #添加访问日志
#- name: envoy.file_access_log
# config:
# path: "/tmp/aa.log"
route_config:
name: myroute1
virtual_hosts:
- name: local_service
domains: ["*"] #都允许
#domains: [bb.yuan.cc] #只转发此条
routes:
- match: { prefix: "/" }
#- match: { prefix: "/demo1" } #只匹配 相对目录 的 demo1 目录
route: { cluster: some_service } #可以自定义名字
#- name: local_service2
# domains: ["cc.yuan.cc"]
# routes:
# - match: { prefix: "/" }
# route: { cluster: some_service2 }
http_filters:
#- name: envoy.router #旧的写法,快被废弃了
- name: envoy.filters.http.router
clusters:
- name: some_service #与上面route对应
connect_timeout: 0.25s
type: STATIC
#type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
hosts: [ #指定后端地址
#{ socket_address: { address: 192.168.26.23, port_value: 808 }},
{ socket_address: { address: 172.17.0.2, port_value: 80 }}

]
#- name: some_service2 #与上面route对应
# connect_timeout: 0.25s
# type: STATIC
# dns_lookup_family: V4_ONLY
# lb_policy: ROUND_ROBIN
# hosts: [
# { socket_address: { address: 172.17.0.4, port_value: 80 }}
# ]

Filter的写法语法1

name: 指定使用哪个过滤器

config:

​ 参数1:值1

​ 参数2:值2

​ 。。。

这里选择什么参数,要看name里选择的什么参数要根据所选择的过滤器来判定

和http相关的,一般选择 HTTP connection manager。

https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/filter/filter里找参数

name的位置应该写envoy.filters.network.http_connection_manager

http_connection_manager 常见的参数包括:

codec_type -- 可选值为AUTO(默认)、HTTP1、

HTTP2

stat_prefix

route_config

http_filters

access_log

Filter的写法语法2

name: 指定使用哪个过滤器

typed_config:

​ "@type": type.googleapis.com/envoy.过滤器的具体值

​ 参数1:值1

​ 参数2:值2

​ 。。。

这里选择什么参数,要看name里选择的什么参数要根据所选择的过滤器来判定

和http相关的,一般选择 HTTP connection manager。

https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/filter/filter 里找参数

name的位置应该写envoy.filters.network.http_connection_manager

@type的值到文档里找具体的值

vim envoy.yaml 现在的写法有所改动

admin:
access_log_path: /tmp/admin_access.log
address:
socket_address: { address: 127.0.0.1, port_value: 9901 } #定义管理

static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 10000 } #要监听的地址
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager #指明使用哪个过滤器,这个是做普通的转发
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
# extensions.filters.network.http_connection_manager.v3.HttpConnectionManager 为具体值,type.googleapis.com/envoy为固定前缀
#config:
stat_prefix: ingress_http
codec_type: AUTO #都允许
route_config:
name: myroute1
virtual_hosts:
- name: local_service
domains: ["*"] #都允许
#domains: [bb.yuan.cc] #只转发此条
routes:
- match: { prefix: "/" }
route: { cluster: some_service }
http_filters:
- name: envoy.filters.http.router
clusters:
- name: some_service #与上面route对应
connect_timeout: 0.25s
type: STATIC
#type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
#hosts: [
# { socket_address: { address: 172.17.0.2, port_value: 80 }}
#]
load_assignment:
cluster_name: some_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 172.17.0.2
port_value: 80
#- endpoint:
# address:
# socket_address:
# address: 172.17.0.4
# port_value: 80

使用 lua

vim envoy.yaml

admin:
access_log_path: /tmp/admin_access.log
address:
socket_address: { address: 127.0.0.1, port_value: 9901 } #定义管理
static_resources:
listeners:
- name: main
address:
socket_address:
address: 0.0.0.0 #要监听的地址
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager #指明使用哪个过滤器,这个是做普通的转发
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
# extensions.filters.network.http_connection_manager.v3.HttpConnectionManager 为具体值,type.googleapis.com/envoy为固定前缀
#config:
stat_prefix: ingress_http
codec_type: AUTO #都允许
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains:
- "*"
routes:
- match:
prefix: "/"
route:
cluster: some_service
http_filters:
- name: envoy.filters.http.lua #修改为 lua
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
#inline_code:
inlineCode: |
function envoy_on_response(response_handle)
response_handle:headers():add("X-User-Header","===X====")
end
- name: envoy.filters.http.router
typed_config: {}
clusters:
- name: some_service #与上面route对应
connect_timeout: 0.25s
type: STATIC_DNS #static
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: some_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 172.17.0.2
port_value: 80

EnvoyFilter

EnvoyFilter用来自定义 Istio Pilot 生成的 Envoy 配置。使用 EnvoyFilter 可以修改某些

envoy的字段,添加特定的过滤器,甚至添加全新的监听器、集群等。必须谨慎使用此功能

docker ps | grep pod1
#k8s_istio_proxy_pod1_ns1 #sidecar
#k8s_pod1_pod1_ns1 #业务容器,nginx

docker top 713f7358dbf8 #sidecar 的 conternerId
#运行了两个主要的进程
# /usr/local/bin/pilot-agent proxy sidecar ...
# /usr/local/bin/envoy -c etc/istio/proxy/envpy-rev0.json #envoy 的配置文件有两种,静态|动态

#查看 envoyFilter
kubectl get envoyFilter
#No resources found in ns1 namespace

workloadSelector: 用于指定作用在谁

configPatches:用于配置补丁,下面的属性包括3个大类

- apply_To: 应用到谁

match:指定匹配规则

patch:新的规则

applyTo: 给哪个位置打补丁,可用的值包括

​ INVALID

​ LISTENER #将补丁应用到监听器

​ FILTER_CHAIN #将补丁应用到过滤器链

​ NETWORK_FILTER #将补丁应用到网络过滤器链

​ HTTP_FILTER #将补丁应用到HTTP过滤器链

​ ROUTE_CONFIGURATION

​ VIRTUAL_HOST

​ HTTP_ROUTE

​ CLUSTER

match:

​ context: SIDECAT_OUTBOUNT/SIDECAR_INBOUNT/GATEWAY(弃用)

​ listener:

​ name: 格式为ip:端口

​ portNumber:

​ filterChain:

​ filter:

​ name: 这4行用于定义过滤器

​ 格式为 envoy.filters.network.http_connection_manager

patch:

​ operation: 操作的意思,对应值有

​ MERG

​ ADD

​ REMOVE

​ INSERT_BEFOR

​ INSERT_AFTER

value

举个例子

mkdir chap6 && cd chap6
kubectl get pods -n istio-system -l istio=ingressgateway
#istio-ingressgateway-5h354d356-jdmc4

vim ef1.yaml

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: lua-filter
namespace: istio-system #指定命名空间
spec:
workloadSelector:
labels:
istio: ingressgateway
configPatches:
- applyTo: HTTP_FILTER
match:
context: GATEWAY
listener:
filterChain:
filter:
name: "envoy.filters.network.http_connection_manager"
subFilter:
name: "envoy.filters.http.router"
patch:
operation: INSERT_BEFORE #插入过滤器
value:
name: envoy.filters.http.lua #插入此过滤器
type_config:
"@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
inlineCode: |
function envoy_on_response(response_handle)
response_handle:headers():add("X-User-Header","===X===")
end

# 启动 envoyFilter
kubectl apply -f ef1.yaml
kubectl get envoyFilter -n istio-system
#lua-filter
curl -I aa.yuan.cc
# x-user-header: ===X=== #改变了标题的报文信息

-----------------------------------------------------------

kubectl delete -f ef1.yaml
vim ef2.yaml #阿里云提供的一个demo,用此作些修改

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: addheader-into-ingressgateway
namespace: istio-system #指定命名空间
spec:
workloadSelector:
# select by label in the same namespace
labels:
istio: ingressgateway
configPatches:
# The Envoy config you want to modify
- applyTo: HTTP_FILTER
match:
context: GATEWAY
proxy:
proxyVersion: '^1\.10.*' #改为自己 istio 的版本
listener:
filterChain:
filter:
name: "envoy.filters.network.http_connection_manager"
subFilter:
name: "envoy.filters.http.router"
patch:
operation: INSERT_BEFORE #插入过滤器
value: # lua filter specification
name: envoy.filters.http.lua #插入此过滤器
type_config:
"@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
inlineCode: |-
function envoy_on_response(response_handle)
function hasFrameAncestors(rh)
s = rh:headers():get("Content-Security-Policy");
delimiter = ";";
defined = false;
for match in (s..delimiter):gmatch("(.-)"..delimiter) do
match = match:gsub("%s+", "");
if match:sub(1,15)=="frame-ancestors" then
return true;
end
end
return false;
end
if not response_handle:headers():get("Content-Security-Policy") then
csp = "frame-ancestors none;";
response_handle:headers():add("Content-Security-Policy", csp);
elseif response_handle:headers():get("Content-Security-Policy") then
if not hasFrameAncestors(response_handle) then
csp = response_handle:headers():get("Content-Security-Policy");
csp = csp .. ";frame-ancestors none;";
response_handle:headers():replace("Content-Security-Policy", csp);
end
end
if not response_handle:headers():get("X-Frame-Options") then
response_handle:headers():add("X-Frame-Options", "deny");
end
if not response_handle:headers():get("X-XSS-Protection") then
response_handle:headers():add("X-XSS-Protection", "1; mode=block");
end
if not response_handle:headers():get("X-Content-Type-Options") then
response_handle:headers():add("X-Content-Type-Options", "nosniff");
end
if not response_handle:headers():get("Referrer-Policy") then
response_handle:headers():add("Referrer-Policy", "no-referrer");
end
if not response_handle:headers():get("X-Download-Options") then
response_handle:headers():add("X-Download-Options", "noopen");
end
if not response_handle:headers():get("X-DNS-Prefetch-Control") then
response_handle:headers():add("X-DNS-Prefetch-Control", "off");
end
if not response_handle:headers():get("Feature-Policy") then
response_handle:headers():add("Feature-Policy",
"camera 'none';"..
"microphone 'none';"..
"geolocation 'none';"..
"encrypted-media 'none';"..
"payment 'none';"..
"speaker 'none';"..
"usb 'none';")..
end
if response_handle:headers():get("X-Powered-By") then
response_handle:headers():remove("X-Powered-By");
end
end

# 应用 ef2
kubectl apply -f ef2.yaml
# 测试
curl -I aa.yuan.cc
# 加入了对应的信息

Istio 架构介绍

· 阅读需 1 分钟

pilot-agent --- 运行在 sidecar 里,主要作用是:

  • 动态的生成 envoy 的设置
  • 启动 envoy 进程
  • 监控 envoy 进程
kubectl get pods -n istio-system -owide

docker top 8fj3n4df356f(istiod conterneId)
#/usr/local/bin/pilot-discovery #控制中心

Discovery Services:pilot-discovery,扮演服务注册中心、istio控制面到envoy之间的桥梁作用:

1)监控服务注册中心 (例如:k8s) 的服务注册情况。k8s下会监控service、endpoint、pod、node等资源信息。

2)监控 istio 控制面信息变化,在k8s下,会监控routerule、virtualservice、Gateway、EgressRule、

ServiceEntry等以k8s CRD形式存在的 istio 控制面配置信息。

3)将1)和2)的两类信息合并组合为envoy可以理解的xds配置信息,以gRPC协议提供给envoy

Agent : pilot-agent,生成envoy配置文件,管理envoy生命周期:

1)生成envoy的配置

2)启动envoy

3)监控和管理envoy的运行情况

Mixer :在 1.5 之后就被废弃了