Istio流量管理实践之(5): 使用cert-manager部署Istio自定义入口网关及进行证书管理...

Istio Gateway提供多个自定义入口网关的支持能力,通过开放一系列端口用于承载网格边缘的进入连接,同时可以使用不同loadbalancer来隔离不同的入口流量。cert-manager可用于使用存储在Kubernetes Secret资源中的任意签名密钥对来获取证书。本文提供了手动创建自定义入口网关的步骤说明,以及在该网关中如何使用cert-manager实现自动配置证书。

生成签名密钥对

CA Issuer不会自动创建和管理签名密钥对,要么用户自己提供,要么通过诸如OpenSSL的工具生成一个自签名CA的新签名密钥对。例如,通过如下命令可以生成x509类型的密钥和证书:

# Generate a CA private key
$ docker run -it -v $(pwd):/export frapsoft/openssl genrsa -out /export/ca.key 2048
# Create a self signed Certificate, valid for 10yrs with the 'signing' option set
$ docker run -it -v $(pwd):/export frapsoft/openssl req -x509 -new -nodes -key /export/ca.key -subj "/CN=${COMMON_NAME}" -days 3650 -reqexts v3_req -extensions v3_ca -out /export/ca.crt

这些命令的输出将是两个文件,ca.key以及ca.crt签名密钥对的密钥和证书。如果你已经有了自己的密钥对,你应该将私钥和证书分别命名为ca.key与ca.crt。

将签名密钥对保存为Secret

我们将创建一个将使用此密钥对生成签名证书的颁发者Issuer,为了允许颁发者Issuer引用我们的密钥对,我们将其存储在Kubernetes Secret资源中。
颁发者Issuer是命名空间资源,因此他们只能在自己的命名空间中引用Secrets。因此,我们将密钥对放入与Issuer相同的名称空间中。当然也可以创建一个面向集群范围版本的ClusterIssuer。
以下命令将在默认命名空间中创建包含签名密钥对的Secret:

kubectl create secret tls ca-key-pair \--cert=ca.crt \--key=ca.key \--namespace=default

准备K8s+Istio环境

阿里云容器服务Kubernetes 1.11.5目前已经支持 Istio 1.0.5的一键部署,可以通过容器服务管理控制台非常方便地快速创建 Kubernetes 集群以及部署Istio。具体过程可以参考创建Kubernetes集群、部署Istio。
请注意,当前部署Istio之后并不会创建IngressGateway。

部署Istio-init

点击左侧的应用目录,在右侧选中ack-istio-init,在右侧选择对应的集群,同时可以看到命名空间已设定为 istio-system ,发布名称已设定为istio-init,然后点击部署。几秒钟之后,Istio CRD在集群中被创建出来。
_

通过应用目录简便部署Istio certmanager

点击左侧的应用目录,在右侧选中ack-istio-certmanager,在打开的页面中点击参数, 可以通过修改参数配置进行定制化(当前不需要进行额外修改,保持默认值即可),如下所示:
图片.png

在右侧选择对应的集群,同时可以看到命名空间已设定为 istio-system ,发布名称已设定为istio-certmanager,然后点击部署。几秒钟之后,Istio certmanager发布就可以创建出来,如下图所示容器组certmanager的启动日志:
图片.png
可以看到certmanager已经成功启动。

创建引用Secret的Issuer

现在可以创建一个引用我们刚刚创建的Secret资源的颁发者Issuer:

kubectl apply -f - <<EOF
apiVersion: certmanager.k8s.io/v1alpha1
kind: Issuer
metadata:name: ca-issuernamespace: default
spec:ca:secretName: ca-key-pair
EOF

接下来准备获得证书!

获得签名证书

现在可以创建以下证书资源,该资源指定所需的证书。为了使用Issuer获取证书,我们必须在与Issuer相同的命名空间中创建Certificate资源,因为Issuer是命名空间资源,如本例所示。如果我们想要跨多个名称空间重用签名密钥对,那么就可以使用一个集群ClusterIssuer。

首先通过以下命令为域名myexample.com创建证书:

kubectl apply -f - <<EOF
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:name: myexample-certificatenamespace: default
spec:secretName: istio-myexample-customingressgateway-certsissuerRef:name: ca-issuer# 可以通过引用ClusterIssuer类型的颁发者Issuer;默认情况使用只适用于命名空间的Issuerkind: IssuercommonName: myexample.comorganization:- MyExample CAdnsNames:- myexample.com- www.myexample.com 
EOF

记下secretName因为接下来的步骤会需要引用它。

创建证书资源后,cert-manager将尝试使用颁发者ca-issuer获取证书。如果成功,证书将存储在与证书资源相同的命名空间(default)中的Secret资源istio-myexample-customingressgateway-certs中。

检查证书与密钥

由于我们已指定commonName字段,因此myexample.com将是证书的通用名称,并且通用名称和dnsNames阵列的所有元素都将是主题备用名称 (SAN)。如果我们没有指定公共名称,那么dnsNames列表的第一个元素 将用作公共名称,dnsNames列表的所有元素 也将是SAN。

创建上述证书后,我们可以检查是否已成功获取,如下所示查看了证书myexample-certificate:

kubectl describe certificate myexample-certificate
Name:         myexample-certificate
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:{"apiVersion":"certmanager.k8s.io/v1alpha1","kind":"Certificate","metadata":{"annotations":{},"name":"myexample-certificate","namespace":"...
API Version:  certmanager.k8s.io/v1alpha1
Kind:         Certificate
Metadata:Creation Timestamp:  2019-01-14T08:38:20ZGeneration:          1Resource Version:    19727Self Link:           /apis/certmanager.k8s.io/v1alpha1/namespaces/default/certificates/myexample-certificateUID:                 bf47b776-17d7-11e9-bafe-00163e069e12
Spec:Common Name:  myexample.comDns Names:myexample.comwww.myexample.comIssuer Ref:Kind:  IssuerName:  ca-issuerOrganization:MyExample CASecret Name:  istio-myexample-customingressgateway-certs
Status:Conditions:Last Transition Time:  2019-01-14T08:38:22ZMessage:               Certificate issued successfullyReason:                CertIssuedStatus:                TrueType:                  Ready
Events:Type    Reason      Age   From          Message----    ------      ----  ----          -------Normal  IssueCert   80s   cert-manager  Issuing certificate...Normal  CertIssued  80s   cert-manager  Certificate issued successfully

最后一行显示了证书成功被创建。

您还可以检查Issuer是否成功,应该看到base64编码的签名TLS密钥对。

kubectl get secret istio-myexample-customingressgateway-certs -oyaml

获得证书后,cert-manager将继续检查其有效性,并在接近到期时尝试更新。当证书上的“Not After”字段小于当前时间之后30天时,cert-manager认为证书即将到期。对于基于CA的颁发者,cert-manager将颁发证书,其中“Not After”字段设置为当前时间加上365天。

部署自定义网关

Gateway描述了在网格边缘操作的负载均衡器,用于接收传入或传出的HTTP / TCP连接。

点击左侧的应用目录,在右侧选中ack-istio-ingressgateway,在打开的页面中点击参数, 将在67行附近的名为istio-ingressgateway-certs的secretName修改为上述创建出的 istio-myexample-customingressgateway-certs 。修改如下如下所示:
图片.png

在右侧选择对应的集群,同时选择与保密字典istio-myexample-customingressgateway-certs相同的命名空间即上文中设定的default ,发布名称设定为myexample-customingressgateway,然后点击部署。几秒钟之后,自定义的Istio 网关发布就可以创建出来。其中网关配置设置代理以充当负载平衡器,为入口公开端口80和443(https)。如下图所示:
图片.png

定义内部服务

本示例中的内部服务是基于nginx实现的,首先为 NGINX 服务器创建配置文件。以域名myexample.com的内部服务为例,定义请求根路径直接返回字样"Welcome to myexample.com! This is one custom Istio Ingress Gateway powered by cert-manager!"及状态码200。

myexample-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 80;location / {return 200 'Welcome to myexample.com! This is one custom Istio Ingress Gateway powered by cert-manager!';add_header Content-Type text/plain;}}
}

创建 Kubernetes ConfigMap 存储 NGINX 服务器的配置:

kubectl create configmap myexample-nginx-configmap --from-file=nginx.conf=./myexample-nginx.conf

设置命名空间default,启用sidecar自动注入:

kubectl label namespace default istio-injection=enabled

注意: 确保该sidecar自动注入的Label需要在IngressGateway创建之后再进行标注,以确保IngressGateway不会自动注入。或者不启用自动注入,通过手工注入完成,具体参见手工注入。

部署 NGINX 服务器,创建域名myexample.com的内部服务:

kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:name: myexampleapplabels:app: myexampleapp
spec:ports:- port: 80protocol: TCPselector:app: myexampleapp
---
apiVersion: apps/v1
kind: Deployment
metadata:name: myexampleapp
spec:selector:matchLabels:app: myexampleappreplicas: 1template:metadata:labels:app: myexampleappspec:containers:- name: nginximage: nginxports:- containerPort: 80volumeMounts:- name: nginx-configmountPath: /etc/nginxreadOnly: truevolumes:- name: nginx-configconfigMap:name: myexample-nginx-configmapEOF

创建自定义网关配置对象

以域名myexample.com为例,创建Istio自定义网关配置对象,如下所示:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:annotations:name: istio-myexample-customingressgatewaynamespace: default
spec:selector:istio: ingressgatewayservers:- hosts:- '*.myexample.com'port:name: httpnumber: 80protocol: HTTPtls:httpsRedirect: true- hosts:- '*.myexample.com'port:name: httpsnumber: 443protocol: HTTPStls:mode: SIMPLEprivateKey: /etc/istio/ingressgateway-certs/tls.keyserverCertificate: /etc/istio/ingressgateway-certs/tls.crt
EOF

创建VirtualService

同样地,接下来以域名myexample.com为例,创建链接到istio-myexample-customingressgateway的VirtualService:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: istio-myexample-customvirtualservice
spec:hosts:- "www.myexample.com"gateways:- istio-myexample-customingressgatewayhttp:- route:- destination:host: myexampleappport:number: 80
EOF

通过网关访问服务

以域名myexample.com为例,获取对应的自定义网关服务的公网IP地址,执行以下命令获取:

kubectl get svc -l istio=ingressgateway
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
istio-ingressgateway   LoadBalancer   172.19.12.75   106.14.48.121   80:31144/TCP,443:30441/TCP   11m

设置INGRESS_HOST 以及 SECURE_INGRESS_PORT 这两个环境变量,确定它们的正确取值,即替换成你实际环境的地址值:

INGRESS_HOST=106.14.48.121
SECURE_INGRESS_PORT=443

检查 istio-ingressgateway Pod 是否正确的加载了证书和私钥:

kubectl exec -it -n default $(kubectl -n default get pods -l istio=ingressgateway -o jsonpath='{.items[0].metadata.name}') -- ls -al /etc/istio/ingressgateway-certs

tls.crt 和 tls.key 都应该保存在这个目录中。

检查 Ingress gateway 证书中的 Subject 字段的正确性:

kubectl exec -i -n default $(kubectl get pod -l istio=ingressgateway -n default -o jsonpath='{.items[0].metadata.name}')  -- cat /etc/istio/ingressgateway-certs/tls.crt | openssl x509 -text -noout | grep 'Subject:'Subject: O=MyExample CA, CN=myexample.com

检查 Ingress gateway 的代理能够正确访问证书:

kubectl exec -ti $(kubectl get po -l istio=ingressgateway -n default -o jsonpath={.items[0]..metadata.name}) -n default -- curl  127.0.0.1:15000/certs
{"ca_cert": "","cert_chain": "Certificate Path: /etc/istio/ingressgateway-certs/tls.crt, Serial Number: c181438895a781c98759fb56b9cc1508, Days until Expiration: 364"
}

至此,使用cert-manager部署自定义入口网关的所有步骤已完成。通过 HTTPS 协议访问 myexample.com 服务,即curl 发送 https 请求到istio-myexample-customingressgateway:

curl -k -HHost:www.myexample.com --resolve www.myexample.com:443:106.14.48.121  https://www.myexample.com
Welcome to myexample.com! This is one custom Istio Ingress Gateway powered by cert-manager!

回顾一下,获得证书后cert-manager将继续检查其有效性,并在接近到期时尝试更新。当证书上的“Not After”字段小于当前时间之后30天时,cert-manager认为证书即将到期。对于基于CA的颁发者,cert-manager将颁发证书,其中“Not After”字段设置为当前时间加上365天。

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

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

相关文章

log4配置

log4j 和 log4j2 方式一&#xff1a;log4j2.xml 添加 jar 包 1 <!-- log4j-core --> 2 <!-- 3 <dependency> 4 <groupId>org.apache.logging.log4j</groupId> 5 <artifactId>log4j-core</artifactId> 6 …

[bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)

3625: [Codeforces Round #250]小朋友和二叉树 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 650 Solved: 283[Submit][Status][Discuss]Description 我们的小朋友很喜欢计算机科学&#xff0c;而且尤其喜欢二叉树。考虑一个含有n个互异正整数的序列c[1],c[2],...,c[n]。…

常用内建模块

一.datetime 1.模块导入: from datetime import datetime 2.获取当前日期和时间: >>> now datetime.now() >>> print(now) 2019-01-13 14:19:38.1810003.获取指定日期和时间: >>> dt datetime(2019,1,10,15,0) >>> print(dt) 2019-01-10…

子序列进阶问题

题目&#xff1a; 有一个数组&#xff0c;让找到两个不重复的连续子序列A,B &#xff0c;求Max(Sum(A)-Sum(B) 分析&#xff1a; AB必定连续&#xff0c;设两端连接处index为{X&#xff0c;x1}&#xff0c;X可取0~n-1 设F(x)为连接处index为{X&#xff0c;x1}时 Max(Sum(A)…

day5-shelve模块

一、概述前面章节我们讲述了json和pickle模块的序列化和反序列化处理&#xff0c;他们有一个不足是在python 3中不能多次dump和load&#xff0c;shelve模块则可以规避这个问题。shelve模块是一个简单的k,v将内存数据通过文件持久化的模块&#xff0c;可以持久化任何pickle可支持…

程序员:请你不要对业务「置之不理」

成长是条孤独的路&#xff0c;一个人会走得更快&#xff1b;有志同道合者同行&#xff0c;会走得更远。本篇内容整理自 21 天鲲鹏新青年计划线上分享内容。鲲鹏新青年计划是由 TGO 鲲鹏会组织的线上分享活动&#xff0c;希望能帮助更多同学一起学习、成长。12 月 28 日&#xf…

在Ubuntu系统下如何将chrome浏览器的bookmarks导出到本地

1. 打开chrome浏览器在页面的右上角点击那个三个小点的位置&#xff0c;找到bookmarks&#xff0c;然后点击bookmarks manager,然后在organize右侧大倒三角下选择&#xff0c;export bookmarks to HTML&#xff0c;选择要保存的位置&#xff0c;利用同样的方法下次就可以直接导…

php基于数组的分页实现

关于数组的分页函数,用数组进行分页的好处是可以方便的进行联合多表查询,只需要将查询的结果放在数组中就可以了以下是数组分页的函数,函数page_array用于数组的分页&#xff0c;函数show_array用于分页函数的操作及显示&#xff0c;需要配合使用.两个函数通过全局变量$countpa…

028 -bash-4.1$ 出现故障的原理及解决办法?

最近在搭建分布式的时候&#xff0c;出现了这个问题&#xff0c;很不爽。下面是我的解决方式。 1.在用户下删除bash rm -rf /home/beifeng/.bash* 2.拷贝 cp /etc/skel/.bash* /home/beifeng 3.退出&#xff0c;再进入用户 4.解释 set |grep -i ps1 转载于:https://www.cnblogs…

弹出ifream

top.$.jBox("iframe:"${ctx}/synopsis/hmlwxSynopsis/addItem, {title: "添加作品",width: 1000, height: 500, buttons:{关闭: true,确定:ok},submit:function(v, h, f){},loaded: function (jboxContent) {$(jboxContent).css(overflow-x,);$(jboxConten…

ORB-SLAM2中的Loop Closinng中DetectLoopCandidates函数解析

/函数的三要素是&#xff1a;函数返回值类型&#xff0c;函数名称&#xff0c;函数参数 函数的返回值是装有关键帧指针的vector 该函数是类KeyFrameDatabase的成员函数,函数名是DetectLoopCandidate 该函数的参数分别是KeyFrame类型的指针变量 pKF和最小得分vector<KeyFrame…

NYOJ2—括号配对问题

括号配对问题 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB 难度&#xff1a;3描述现在&#xff0c;有一行括号序列&#xff0c;请你检查这行括号是否配对。输入第一行输入一个数N&#xff08;0<N<100&#xff09;,表示有N组测试数据。后面的N行输入多…

李彦宏千字愿景内部信:10次提到“用户”

中新网1月17日电 1月17日&#xff0c;百度公司创始人、董事长兼CEO李彦宏发出一封内部信&#xff0c;信中&#xff0c;李彦宏向员工阐述了百度愿景&#xff1a;成为最懂用户&#xff0c;并能帮助人们成长的全球顶级高科技公司。他提出&#xff0c;百度要持续创新&#xff0c;“…

spring-boot 速成(8) 集成druid+mybatis

spring-boot与druid、mybatis集成&#xff08;包括pageHelper分页插件&#xff09;, 要添加以下几个依赖项: compile(mysql:mysql-connector-java:6.0.5)compile(tk.mybatis:mapper-spring-boot-starter:1.1.1)compile(org.mybatis.spring.boot:mybatis-spring-boot-starter:1.…

ORB-SLAM2中生成金字塔提取FAST角点和计算BRIEF描述子

//这个是类ORBextractor的带参构造函数&#xff0c;并且使用初始化列表对该类中的这5个变量赋值 ORBextractor::ORBextractor(int _nfeatures, float _scaleFactor, int _nlevels,int _iniThFAST, int _minThFAST):nfeatures(_nfeatures), scaleFactor(_scaleFactor), nlevels(…

我们怎样确保从大数据计算中获得价值

我们怎样确保从大数据计算中获得价值 支持大数据方案并不是在硬件以及软件层次终止&#xff0c;企业要想真正地从大数据中受益&#xff0c;领导者必须改变思考与对待信息的方式。 我们怎样确保从大数据计算中获得价值&#xff1f; 当所有可用数据都可用时&#xff0c;大数据…

jsoncpp-src-0.5.0.tar.gz 源码错误!!!!

近期在做毕设&#xff0c;使用到了JsonCpp0.5.0版本号的源码&#xff01;依照网上的安装配置教程&#xff0c;搭建好环境后就能够使用了&#xff01; 在这里就不浪费空间去将怎样搭建开发环境了&#xff01;请大家去google一下就好了&#xff01;在解析一个Json文件时。程序总是…

青海省多地日降水量突破历史极值

受高原槽和西北冷空气的共同影响&#xff0c;青海省海西州茫崖等多地日降水量突破历史极值。 李万花 摄 受高原槽和西北冷空气的共同影响&#xff0c;青海省海西州茫崖等多地日降水量突破历史极值。 李万花 摄 中新网西宁1月18日电 (孙睿 赵海梅)记者18日从青海省气象局获悉&am…

ORB-SLAM2中四叉树管理特征点

当从图像金字塔中的每一层图像上提取特征点之后&#xff0c;都要先用四叉树技术对这些特征点进行管理 //该类中定义了四叉树创建的函数以及树中结点的属性 //bool bNoMore&#xff1a; 根据该结点中被分配的特征点的数目来决定是否继续对其进行分割 //DivisionNode()&#xff…

Python多线程3:queue

queue模块实现了多生产者。多消费者队列。在多线程环境下&#xff0c;该队列能实现多个线程间安全的信息交换。 queue模块介绍 模块实现了3种类型的队列&#xff0c;差别在于队列中条目检索的顺序不同。在FIFO队列中。依照先进先出的顺序检索条目。在LIFO队列中&#xff0c;最后…