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.pswp.cn/news/252530.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252530.shtml
英文地址,請注明出處:http://en.pswp.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;最后…