Egress-TLS-Origination

img

目录

image-20231119105642407

文章目录

    • 目录
    • 本节实战
    • 1、出口网关TLS发起
    • 2、通过 egress 网关发起双向 TLS 连接
    • 关于我
    • 最后

本节实战

实战名称
🚩 实战:Egress TLS Origination-2023.11.19(failed)
🚩 实战:通过 egress 网关发起双向 TLS 连接-2023.11.19(测试成功)

1、出口网关TLS发起

img

接下来我们将学习如何通过配置 Istio 去实现对发往外部服务的流量的 TLS Origination(TLS 发起)。 若此时原始的流量为 HTTP,则 Istio 会将其转换为 HTTPS 连接。TLS Origination 的概念前面我们也已经介绍过了。

假设有一个传统应用正在使用 HTTP 和外部服务进行通信,如果有一天突然有一个新的需求,要求必须对所有外部的流量进行加密。此时,使用 Istio 便可通过修改配置实现此需求,而无需更改应用中的任何代码。该应用可以发送未加密的 HTTP 请求,由 Istio 为请求进行加密。

从应用源头发起未加密的 HTTP 请求,并让 Istio 执行 TLS 升级的另一个好处是可以产生更好的遥测并为未加密的请求提供更多的路由控制

下面我们就来学习下如何配置 Istio 实现 TLS Origination。

🚩 实战:Egress TLS Origination-2023.11.19(failed)

实验环境:

k8s v1.27.6(containerd://1.6.20)(cni:flannel:v0.22.2)
istio v1.19.3(--set profile=demo)

应用程序在以下链接里:

链接:https://pan.baidu.com/s/1pMnJxgL63oTlGFlhrfnXsA?pwd=7yqb
提取码:7yqb
2023.11.5-实战:BookInfo 示例应用-2023.11.5(测试成功)

image-20231105111842627

本次yaml内容直接在文档里拷贝就好。

准备测试客户端

  • 同样我们这里使用 sleep 示例应用来作为测试源,如果启用了自动注入 Sidecar,那么可以直接部署 sleep 应用:
kubectl apply -f samples/sleep/sleep.yaml

否则在部署 sleep 应用之前,必须手动注入 Sidecar:

kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml)
  • 创建一个环境变量来保存用于将请求发送到外部服务 Pod 的名称:
export SOURCE_POD=$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})
echo $SOURCE_POD

配置对外部服务的访问

我们之前已经默认配置了.spec.meshConfig.outboundTrafficPolicy.mode=REGISTRY_ONLY了,因此开始创建如下 ServiceEntry

[root@master1 istio-1.19.3]#kubectl get istiooperator installed-state -n istio-system -o jsonpath='{.spec.meshConfig.outboundTrafficPolicy.mode}'
REGISTRY_ONLY
  • 首先使用 ServiceEntry 对象来配置对外部服务 edition.cnn.com 的访问。这里我们将使用单个 ServiceEntry 来启用对服务的 HTTP 和 HTTPS 访问。创建一个如下所示的 ServiceEntry 对象:
#tls-ori.yaml
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:name: edition-cnn-com
spec:hosts:- edition.cnn.comports:- number: 80name: http-portprotocol: HTTP- number: 443name: https-portprotocol: HTTPSresolution: DNS

上面的 ServiceEntry 对象中我们指定了 edition.cnn.com 服务的主机名,然后在 ports 中指定了需要暴露的端口及其属性,表示该 ServiceEntry 对象代表对 edition.cnn.com 的访问,这里我们定义了 80443 两个端口,分别对应 httphttps 服务,resolution: DNS 定义了如何解析指定的 hosts,这里我们使用 DNS 来解析。

  • 直接应用该资源对象,然后向外部的 HTTP 服务发送请求:
[root@master1 istio-1.19.3]#kubectl apply -f tls-ori.yaml 
serviceentry.networking.istio.io/edition-cnn-com created$ kubectl exec "${SOURCE_POD}" -c sleep -- curl -sSL -o /dev/null -D - http://edition.cnn.com/politics
# 输出如下结果
HTTP/1.1 301 Moved Permanently
# ......
location: https://edition.cnn.com/politicsHTTP/2 200
content-type: text/html; charset=utf-8
# ......

上面我们在使用 curl 命令的时候添加了一个 -L 标志,该标志指示 curl 将遵循重定向。 在这种情况下,服务器将对到 http://edition.cnn.com/politics 的 HTTP 请求进行重定向响应,而重定向响应将指示客户端使用 HTTPS 向 https://edition.cnn.com/politics 重新发送请求,对于第二个请求,服务器则返回了请求的内容和 200 状态码。

尽管 curl 命令简明地处理了重定向,但是这里有两个问题。第一个问题是请求冗余,它使获取 http://edition.cnn.com/politics 内容的延迟加倍。第二个问题是 URL 中的路径(在本例中为 politics)被以明文的形式发送。如果有人嗅探你的应用与 edition.cnn.com 之间的通信,他将会知晓该应用获取了此网站中哪些特定的内容。出于隐私的原因,我们可能希望阻止这些内容被嗅探到。通过配置 Istio 执行 TLS 发起,则可以解决这两个问题

用于 egress 流量的 TLS 发起

image-20231119072632082

  • edition.cnn.com 创建一个出口网关,端口为 80,接收 HTTP 流量,如下所示:
---
#tls-ori.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: istio-egressgateway
spec:selector:istio: egressgatewayservers:- port:number: 80name: tls-origination-portprotocol: HTTPhosts:- edition.cnn.com
  • 然后为 istio-egressgateway 创建一个 DestinationRule 对象,如下所示:
---
#tls-ori.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: egressgateway-for-cnn
spec:host: istio-egressgateway.istio-system.svc.cluster.localsubsets:- name: cnn
  • 接着我们只需要创建一个 VirtualService 对象,将流量从 Sidecar 引导至 Egress Gateway,再从 Egress Gateway 引导至外部服务,如下所示:
---
#tls-ori.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: direct-cnn-through-egress-gateway
spec:hosts:- edition.cnn.comgateways:- istio-egressgateway # Egress Gateway- mesh # 网格内部的流量http:- match:- gateways:- meshport: 80route:- destination:host: istio-egressgateway.istio-system.svc.cluster.localsubset: cnnport:number: 80weight: 100- match:- gateways:- istio-egressgatewayport: 80route:- destination:host: edition.cnn.comport:number: 443 # 443 端口weight: 100
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: originate-tls-for-edition-cnn-com
spec:host: edition.cnn.comtrafficPolicy:loadBalancer:simple: ROUND_ROBINportLevelSettings:- port:number: 443tls:mode: SIMPLE # initiates HTTPS for connections to edition.cnn.com

需要注意的是上面最后针对 edition.cnn.comDestinationRule 对象,在 trafficPolicy 中指定了 portLevelSettings 用于对不同的端口定义不同的流量策略,这里我们定义了 443 端口的 tls 模式为 SIMPLE,表示当访问 edition.cnn.com 的 HTTP 请求时执行 TLS 发起。

  • 应用上面的资源对象,然后再次向 http://edition.cnn.com/politics 发送 HTTP 请求:
[root@master1 istio-1.19.3]#kubectl apply -f tls-ori.yaml 
serviceentry.networking.istio.io/edition-cnn-com unchanged
destinationrule.networking.istio.io/egressgateway-for-cnn created
virtualservice.networking.istio.io/direct-cnn-through-egress-gateway created
destinationrule.networking.istio.io/originate-tls-for-edition-cnn-com created$ kubectl exec "${SOURCE_POD}" -c sleep -- curl -sSL -o /dev/null -D - http://edition.cnn.com/politics
# 直接输出200状态码
HTTP/1.1 200 OK
content-length: 2474958
content-type: text/html; charset=utf-8
# ......

image-20231119073546995

这次将会收到唯一的 200 OK 响应,因为 Istio 为 curl 执行了 TLS 发起,原始的 HTTP 被升级为 HTTPS 并转发到 edition.cnn.com。服务器直接返回内容而无需重定向,这消除了客户端与服务器之间的请求冗余,使网格保持加密状态,隐藏了你的应用获取 edition.cnn.compolitics 端点的信息。


⚠️ 注意:

自己测试后,这里一直报503错误,服务不可用。

服务不可用(503)。

image-20231119074150936

看下istio-egressgateway-556f6f58f4-7kcjc日志:(无输出)

image-20231119074458588

看下sleep-9454cc476-5v8hb istio-proxy日志:

image-20231119074744374

自己删除后续的用于 egress 流量的 TLS 发起部分,再次测试,还是可以正常访问目的网站的呀,但是一配置后,就不行了,老师的是可以的,奇怪。。。🤣

先这样吧,搁置。。。

  • 删除刚才创建的资源
[root@master1 istio-1.19.3]#kubectl delete  -f tls-ori.yaml 
serviceentry.networking.istio.io "edition-cnn-com" deleted
destinationrule.networking.istio.io "egressgateway-for-cnn" deleted
virtualservice.networking.istio.io "direct-cnn-through-egress-gateway" deleted
destinationrule.networking.istio.io "originate-tls-for-edition-cnn-com" deleted

如果我们在代码中有去访问外部服务,那么我们就可以不用修改代码了,只需要通过配置 Istio 来获得 TLS 发起即可,而无需更改一行代码。

到这里我们就学习了如何通过配置 Istio 实现对外部服务的 TLS 发起。

TLS 与 mTLS 基本概念

前面我们学习了如何通过配置 Istio 实现对外部服务的 TLS 发起,这里其实还有一个 mTLS 的概念呢,由于 TLS 本身就比较复杂,对于双向 TLS(mTLS)就更复杂了。

CA:证书颁发机构

TLS 是一个连接层协议,旨在为 TCP 连接提供安全保障。TLS 在连接层工作,可以与任何使用 TCP 的应用层协议结合使用。例如,HTTPS 是 HTTP 与 TLS 的结合(HTTPS 中的 S 指的是 SSL,即 TLS 的前身),TLS 认证的流程大致如下所示:

  • 首先向第三方机构 CA 提交组织信息、个人信息(域名)等信息并申请认证。
  • CA 通过多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等。如信息审核通过,CA 会向申请者签发认证文件-证书
  • 证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名。其中签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA 的私钥对信息摘要进行加密,密文即签名
  • 客户端向服务端发出请求时,服务端返回证书文件。
  • 客户端读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA 的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性。
  • 客户端还会验证证书相关的域名信息、有效时间等信息; 客户端会内置信任 CA 的证书信息(包含公钥),比如浏览器基本上都带有知名公共 CA 机构的证书,如 VerisignDigicert 等,这些证书在发布时被打包在一起,当我们下载浏览器时,就经把正确的证书放进了浏览器,如果 CA 不被信任,则找不到对应 CA 的证书,证书也会被判定非法。

img

当然 HTTPS 的工作流程和这个过程基本就一致了:

  • 1.客户端发起一个 HTTPS 请求。
  • 2.服务端把配置好的证书返回给客户端。
  • 3.客户端验证证书:比如是否在有效期内,证书的用途是不是匹配 Client 请求的站点,是不是在 CRL 吊销列表里面,它的上一级证书是否有效等。
  • 4.客户端使用伪随机数生成对称密钥,并通过证书里服务器的公钥进行加密,后续使用该对称密钥进行传输信息。
  • 5.服务端使用自己的私钥解密这个消息,得到对称密钥。至此,客户端和服务端都持有了相同的对称密钥。
  • 6.服务端使用对称密钥加密明文内容 A,发送给客户端。
  • 7.客户端使用对称密钥解密响应的密文,得到明文内容 A
  • 8.客户端再次发起 HTTPS 的请求,使用对称密钥加密请求的明文内容 B,然后服务器使用对称密钥解密密文,得到明文内容 B

img

当然双向 TLS 就更为复杂了,Mutual TLS(双向 TLS),或称 mTLS,对于常规的 TLS,只需要服务端认证,mTLS 相对来说有一个额外的规定:客户端也要经过认证在 mTLS 中,客户端和服务器都有一个证书,并且双方都使用它们的公钥/私钥对进行身份验证

TLS 保证了真实性,但默认情况下,这只发生在一个方向上:客户端对服务器进行认证,但服务器并不对客户端进行认证。为什么 TLS 的默认只在一个方向进行认证?因为客户端的身份往往是不相关的。例如我们在访问优点知识的时候,你的浏览器已经验证了要访问的网站服务端的身份,但服务端并没有验证你的浏览器的身份,它实际上并不关心你的浏览器的身份,这对于互联网上的 Web 项目来说足够了。但是在某些情况下,服务器确实需要验证客户端的身份,例如,当客户端需要访问某些敏感数据时,服务器可能需要验证客户端的身份,以确保客户端有权访问这些数据,这就是 mTLS 的用武之地,mTLS 是保证微服务之间跨服务通信安全的好方法

  • 首先,你想要安全的通信。当我们把我们的应用程序拆分为多个服务时,我们最终会在这些服务之间的网络上发送敏感数据。任何能够进入网络的人都有可能读取这些敏感数据并伪造请求。
  • 其次,你关心客户端的身份。首先,你要确保你能知道调用是什么时候发生的,以便进行诊断,并正确记录指标等事项。此外,你可能想对这些身份进行授权(允许 A 调用 B 吗)。当然授权是另外的话题了。

接下来我们就来测试下如何通过 egress 网关发起双向 TLS 连接。

2、通过 egress 网关发起双向 TLS 连接

img

🚩 实战:通过 egress 网关发起双向 TLS 连接-2023.11.19(测试成功)

实验环境:

k8s v1.27.6(containerd://1.6.20)(cni:flannel:v0.22.2)
istio v1.19.3(--set profile=demo)

应用程序在以下链接里:

链接:https://pan.baidu.com/s/1pMnJxgL63oTlGFlhrfnXsA?pwd=7yqb
提取码:7yqb
2023.11.5-实战:BookInfo 示例应用-2023.11.5(测试成功)

image-20231105111842627

本次yaml内容均在文档里。

是有点绕哦……🤣

  • 首先使用 openssl 命令生成客户端和服务器的证书与密钥,为你的服务签名证书创建根证书和私钥:
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=example Inc./CN=example.com' -keyout example.com.key -out example.com.crt
# 生成 CA 证书和私钥
  • my-nginx.mesh-external.svc.cluster.local 创建证书和私钥:
# 为 my-nginx.mesh-external.svc.cluster.local 创建私钥和证书签名请求
$ openssl req -out my-nginx.mesh-external.svc.cluster.local.csr -newkey rsa:2048 -nodes -keyout my-nginx.mesh-external.svc.cluster.local.key -subj "/CN=my-nginx.mesh-external.svc.cluster.local/O=some organization"# 使用 CA 公钥和私钥以及证书签名请求为 my-nginx.mesh-external.svc.cluster.local 创建证书
$ openssl x509 -req -sha256 -days 365 -CA example.com.crt -CAkey example.com.key -set_serial 0 -in my-nginx.mesh-external.svc.cluster.local.csr -out my-nginx.mesh-external.svc.cluster.local.crt
  • 然后生成客户端证书和私钥:
# 为 client.example.com 创建私钥和证书签名请求
$ openssl req -out client.example.com.csr -newkey rsa:2048 -nodes -keyout client.example.com.key -subj "/CN=client.example.com/O=client organization"# 使用相同的 CA 公钥和私钥以及证书签名请求为 client.example.com 创建证书
$ openssl x509 -req -sha256 -days 365 -CA example.com.crt -CAkey example.com.key -set_serial 1 -in client.example.com.csr -out client.example.com.crt

接着我们来部署一个双向 TLS 服务器,为了模拟一个真实的支持双向 TLS 协议的外部服务,我们在 Kubernetes 集群中部署一个 NGINX 服务,该服务运行在 Istio 服务网格之外,比如运行在一个没有开启 Istio Sidecar proxy 注入的命名空间中。

nginx里默认是支持双向认证的。

image-20231119090006681

  • 创建一个命名空间 mesh-external 表示 Istio 网格之外的服务,注意在这个命名空间中,Sidecar 自动注入是没有开启的,不会在 Pod 中自动注入 Sidecar proxy。
kubectl create namespace mesh-external
  • 然后创建 Kubernetes Secret,保存服务器和 CA 的证书。
$ kubectl create -n mesh-external secret tls nginx-server-certs --key my-nginx.mesh-external.svc.cluster.local.key --cert my-nginx.mesh-external.svc.cluster.local.crt$ kubectl create -n mesh-external secret generic nginx-ca-certs --from-file=example.com.crt
  • 生成 NGINX 服务器的配置文件:
$ cat <<\EOF > ./nginx.conf
events {
}http {log_format main '$remote_addr - $remote_user [$time_local]  $status ''"$request" $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;error_log  /var/log/nginx/error.log;server {listen 443 ssl;root /usr/share/nginx/html;index index.html;server_name my-nginx.mesh-external.svc.cluster.local;ssl_certificate /etc/nginx-server-certs/tls.crt;ssl_certificate_key /etc/nginx-server-certs/tls.key;ssl_client_certificate /etc/nginx-ca-certs/example.com.crt;ssl_verify_client on;}
}
EOF
  • 生成 Kubernetes ConfigMap 保存 NGINX 服务器的配置文件:
kubectl create configmap nginx-configmap -n mesh-external --from-file=nginx.conf=./nginx.conf
  • 然后就可以部署 NGINX 服务了:
kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:name: my-nginxnamespace: mesh-externallabels:run: my-nginx
spec:ports:- port: 443protocol: TCPselector:run: my-nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:name: my-nginxnamespace: mesh-external
spec:selector:matchLabels:run: my-nginxtemplate:metadata:labels:run: my-nginxspec:containers:- name: my-nginximage: nginxports:- containerPort: 443volumeMounts:- name: nginx-configmountPath: /etc/nginxreadOnly: true- name: nginx-server-certsmountPath: /etc/nginx-server-certsreadOnly: true- name: nginx-ca-certsmountPath: /etc/nginx-ca-certsreadOnly: truevolumes:- name: nginx-configconfigMap:name: nginx-configmap- name: nginx-server-certssecret:secretName: nginx-server-certs- name: nginx-ca-certssecret:secretName: nginx-ca-certs
EOF
  • 现在如果我们在网格内部去直接访问这个 my-nginx 服务,是无法访问的。
[root@master1 istio-1.19.3]#kubectl exec "$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})" -c sleep -- curl -sS http://my-nginx.mesh-external.svc.cluster.local
[root@master1 istio-1.19.3]#kubectl exec "$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})" -c sleep -- curl -sS https://my-nginx.mesh-external.svc.cluster.local
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.se/docs/sslcerts.htmlcurl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
command terminated with exit code 60
[root@master1 istio-1.19.3]#kubectl exec "$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})" -c sleep -- curl -k -sS https://my-nginx.mesh-external.svc.cluster.local
<html>
<head><title>400 No required SSL certificate was sent</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>No required SSL certificate was sent</center>
<hr><center>nginx/1.21.5</center>
</body>
</html>

为 egress 流量配置双向 TLS

image-20231119093149372

  • 创建 Kubernetes Secret 保存客户端证书:
kubectl create secret -n istio-system generic client-credential --from-file=tls.key=client.example.com.key \--from-file=tls.crt=client.example.com.crt --from-file=ca.crt=example.com.crt

Secret 所在的命名空间必须与出口网关部署的位置一致,我们这里是 istio-system 命名空间。

  • 然后为 my-nginx.mesh-external.svc.cluster.local 创建一个端口为 443 的 Egress Gateway,以及目标规则和虚拟服务来引导流量流经 egress 网关并从 egress 网关流向外部服务。
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: istio-egressgateway
spec:selector:istio: egressgatewayservers:- port:number: 443name: httpsprotocol: HTTPShosts:- my-nginx.mesh-external.svc.cluster.localtls:mode: ISTIO_MUTUAL
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: egressgateway-for-nginx
spec:host: istio-egressgateway.istio-system.svc.cluster.localsubsets:- name: nginxtrafficPolicy:loadBalancer:simple: ROUND_ROBINportLevelSettings:- port:number: 443tls:mode: ISTIO_MUTUALsni: my-nginx.mesh-external.svc.cluster.local
EOF

上面我们定义的 Gateway 对象和前面的一样,只是将端口改为了 443,然后在 tls 中指定了 mode: ISTIO_MUTUAL,表示该 Gateway 对象用于 TLS 双向认证协议的请求。

然后同样在后面的 DestinationRule 对象中配置了通过 istio-egressgateway 的流量的规则,这里我们定义了 443 端口的 tls 模式为 ISTIO_MUTUAL,表示当访问 my-nginx.mesh-external.svc.cluster.local 的 TLS 请求时执行 TLS 双向认证。

  • 最后我们定义一个 VirtualService 对象来引导流量流经 egress 网关:
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: direct-nginx-through-egress-gateway
spec:hosts:- my-nginx.mesh-external.svc.cluster.localgateways:- istio-egressgateway- mesh  # 网格内部的流量http:- match:- gateways:- meshport: 80route:- destination:host: istio-egressgateway.istio-system.svc.cluster.localsubset: nginxport:number: 443weight: 100- match:- gateways:- istio-egressgatewayport: 443route:- destination:host: my-nginx.mesh-external.svc.cluster.localport:number: 443weight: 100
EOF

上面的 VirtualService 对象定义网格内部对 my-nginx.mesh-external.svc.cluster.local 服务的访问引导至 istio-egressgateway,然后再由 istio-egressgateway 引导流量流向外部服务。

  • 添加 DestinationRule 执行双向 TLS:
kubectl apply -n istio-system -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: originate-mtls-for-nginx
spec:host: my-nginx.mesh-external.svc.cluster.localtrafficPolicy:loadBalancer:simple: ROUND_ROBINportLevelSettings:- port:number: 443tls:mode: MUTUALcredentialName: client-credential # 这必须与之前创建的用于保存客户端证书的 Secret 相匹配sni: my-nginx.mesh-external.svc.cluster.local
EOF
  • 发送一个 HTTP 请求至 http://my-nginx.mesh-external.svc.cluster.local
$ kubectl exec "$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})" -c sleep -- curl -sS http://my-nginx.mesh-external.svc.cluster.local
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

image-20231119094421688

  • 检查 istio-egressgateway Pod 日志,有一行与请求相关的日志记录。如果 Istio 部署在命名空间 istio-system 中,打印日志的命令为:
kubectl logs -l istio=egressgateway -n istio-system | grep 'my-nginx.mesh-external.svc.cluster.local' | grep HTTP

将显示类似如下的一行:

[2023-11-17T08:23:51.203Z] "GET / HTTP/1.1" 200 - via_upstream - "-" 0 615 17 16 "10.244.1.100" "curl/7.81.0-DEV" "434b5755-54da-9924-9e2a-a204b5a2124c" "my-nginx.mesh-external.svc.cluster.local" "10.244.1.106:443" outbound|443||my-nginx.mesh-external.svc.cluster.local 10.244.2.239:35198 10.244.2.239:8443 10.244.1.100:56448 my-nginx.mesh-external.svc.cluster.local -

即使我们直接在网格中访问的是 HTTP 的服务,但是通过配置 Istio,我们也可以实现对外部服务的双向 TLS 认证。

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码
x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号
《云原生架构师实战》

image-20230107215126971

🍀 个人博客站点

http://onedayxyy.cn/

image-20231113073017981

image-20231113073039083

🍀 语雀

https://www.yuque.com/xyy-onlyone

image-20231113073101271

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎

https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!

image-20231016062113861

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/147714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32_SPI总线驱动OLED详细原理讲解

目录 这里写目录标题 第13章 Cortex-M4-SPI总线13.1 SPI总线概述13.1.1 SPI总线介绍13.1.2 SPI总线接口与物理拓扑结构13.1.3 SPI总线通信原理13.1.4 SPI总线数据格式 13.2 IO口模拟SPI操作OLED13.2.1 常见的显示设备13.2.2 OLED显示屏概述13.2.3 OLED特征13.2.4 显示原理13.2.…

【图数据库实战】HugeGraph架构

一、概述 作为一款通用的图数据库产品&#xff0c;HugeGraph需具备图数据的基本功能&#xff0c;如下图所示。HugeGraph包括三个层次的功能&#xff0c;分别是存储层、计算层和用户接口层。 HugeGraph支持OLTP和OLAP两种图计算类型&#xff0c;其中OLTP实现了Apache TinkerPop3…

webAPP基础学习

###视觉基础 part-I ####1.面试中常见的像素问题 >什么是像素? *1.什么是px? px-虚拟像素,css像素的单位 px是一个相对单位,相对于设备像素而言 >相对性 a.相对于同一个设备,css像素的可变的 css像素物理像素>会受到缩放的影响 css像素缩放倍数*单个物理像…

QEMU显示虚拟化的几种选项

QEMU可以通过通过命令行"-vga type"选择为客户机模拟的VGA卡的类别,可选择的类型有多个: -vga typeSelect type of VGA card to emulate. Valid values for type arecirrusCirrus Logic GD5446 Video card. All Windows versions starting from Windows 95 should …

MySQL集群高可用架构之MMM

目录 一、MMM概述 1.1 MMM 简介 1.2 MMM高可用架构 1.3 MMM工作原理 1.4 工作流程图 二、MMM高可用双主双从架构部署 1、架构&#xff1a; 2、搭建 MySQL 多主多从模式 3、安装配置 MySQL-MMM 4、故障测试 一、MMM概述 1.1 MMM 简介 MMM&#xff08;Master-Master re…

Linux网络应用层协议之http/https

文章目录 目录 一、http协议 1.URL 2.http协议格式 3.http的方法 4.http的状态码 5.http常见header 6.实现一个http服务器 二、https协议 1.加密 2.为什么要加密 3.常见的加密方式 对称加密 非对称加密 4.https的工作过程探究 方案1 只使用对称加密 方案2 只使…

开发知识点-Git

团队协作-Git Giteegitee 创建仓库打开项目所在目录&#xff0c;右键选择Git Bush Here(你要确定电脑上已经安装了Git&#xff09;初始化本地仓库配置验证信息。 完美解决github访问速度慢介绍Git 与 SVN 区别IDEA 添加 gitee Gitee Git Gitee 大家都知道国内访问 Github 速度…

Azure Machine Learning - Azure AI 搜索中的矢量搜索

矢量搜索是一种信息检索方法&#xff0c;它使用内容的数字表示形式来执行搜索方案。 由于内容是数字而不是纯文本&#xff0c;因此搜索引擎会匹配与查询最相似的矢量&#xff0c;而不需要匹配确切的字词。本文简要介绍了 Azure AI 搜索中的矢量支持。 其中还解释了与其他 Azure…

Web之HTML笔记

Web之HTML、CSS、JS Web标准一、HTML&#xff08;超文本标记语言&#xff09;HTML 基本结构标签常用标签1.font标签2.p标签3.注释4.h系列标题5.img6.超链接a7.列表8.表格9.表单 Web之CSS笔记 Web标准 结构标准用于对网页元素进行整理和分类(HTML)表现标准用于设置网页元素的版…

LoRa模块空中唤醒功能原理和物联网应用

LoRa模块是一种广泛应用于物联网领域的无线通信模块&#xff0c;支持低功耗、远距离和低成本的无线通信。 其空中唤醒功能是一项重要的应用&#xff0c;可以实现设备的自动唤醒&#xff0c;从而在没有人工干预的情况下实现设备的远程监控和控制。 LoRa模块空中唤醒功能的原理…

HTTPS加密为什么能保证网络安全?

随着互联网的普及和发展&#xff0c;网络安全问题日益严重。为了保护用户的隐私和数据安全&#xff0c;许多网站都采用了HTTPS加密技术。那么&#xff0c;HTTPS加密为什么可以保证网络安全呢&#xff1f; 原因是HTTP协议采用的是数据明文传输方式。用户从客户端浏览器提交数据…

PDF控件Spire.PDF for .NET【转换】演示:将PDF 转换为 HTML

由于各种原因&#xff0c;您可能想要将 PDF 转换为 HTML。例如&#xff0c;您需要在社交媒体上共享 PDF 文档或在网络上发布 PDF 内容。在本文中&#xff0c;您将了解如何使用Spire.PDF for .NET在 C# 和 VB.NET 中将 PDF 转换为 HTML。 Spire.Doc 是一款专门对 Word 文档进行…

虹科示波器 | 汽车免拆检修 | 2015款奔驰G63AMG车发动机偶尔自动熄火

一、故障现象 一辆2015款奔驰G63AMG车&#xff0c;搭载157发动机&#xff0c;累计行驶里程约为9.4万km。车主反映&#xff0c;该车低速行驶时&#xff0c;发动机偶尔会自动熄火&#xff0c;故障大概1个星期出现1次。 二、故障诊断 接车后路试&#xff0c;故障未能再现。用故障检…

机器人制作开源方案 | 智能快递付件机器人

一、作品简介 作者&#xff1a;贺沅、聂开发、王兴文、石宇航、盛余庆 单位&#xff1a;黑龙江科技大学 指导老师&#xff1a;邵文冕、苑鹏涛 1. 项目背景 受新冠疫情的影响&#xff0c;大学校园内都采取封闭式管理来降低传染的风险&#xff0c;导致学生不能外出&#xff0c…

SpringCloud微服务:Nacos和Eureka的区别

目录 配置&#xff1a; 区别&#xff1a; ephemeral设置为true时 ephemeral设置为false时&#xff08;这里我使用的服务是order-service&#xff09; 1. Nacos与eureka的共同点 都支持服务注册和服务拉取 都支持服务提供者心跳方式做健康检测 2. Nacos与Eu…

【广州华锐互动】VR可视化政务服务为公众提供更直观、形象的政策解读

虚拟现实&#xff08;VR&#xff09;技术正在逐渐应用于政务服务领域&#xff0c;为公众提供更加便捷、高效和个性化的服务体验。通过VR眼镜、手机等设备&#xff0c;公众可以在虚拟环境中参观政务服务中心&#xff0c;并根据自己的需求选择不同的办事窗口或事项进行咨询和办理…

SQL零基础入门教程,贼拉详细!贼拉简单! 速通数据库期末考!(七)

LEFT JOIN LEFT JOIN 同样用于关联两个表&#xff0c;ON 关键字后指定两个表共有的字段作为匹配条件&#xff0c;与 INNER JOIN 不同的地方在于匹配不上的数据行&#xff0c;INNER JOIN 对两表匹配不上的数据行不返回结果&#xff0c;而 LEFT JOIN 只对右表&#xff08;table2…

STM32外部中断(EXTI)与RTOS多任务处理的协同设计

当在STM32上使用外部中断&#xff08;EXTI&#xff09;与RTOS&#xff08;Real-Time Operating System&#xff0c;实时操作系统&#xff09;进行多任务处理时&#xff0c;需要设计合适的协同机制&#xff0c;以确保可靠的中断处理和任务调度。在下面的概述中&#xff0c;我将介…

AnimateDiff搭配Stable diffution制作AI视频

话不多说&#xff0c;先看视频 1. AnimateDiff的技术原理 AnimateDiff可以搭配扩散模型算法&#xff08;Stable Diffusion&#xff09;来生成高质量的动态视频&#xff0c;其中动态模型&#xff08;Motion Models&#xff09;用来实时跟踪人物的动作以及画面的改变。我们使用 …

MongoDB之索引和聚合

文章目录 一、索引1、说明2、原理3、相关操作3.1、创建索引3.2、查看集合索引3.3、查看集合索引大小3.4、删除集合所有索引&#xff08;不包含_id索引&#xff09;3.5、删除集合指定索引 4、复合索引 二、聚合1、说明2、使用 总结 一、索引 1、说明 索引通常能够极大的提高查…