在微服務架構下,確保服務安全地暴露至外部網路至關重要。Istio 作為服務網格,提供簡化此過程的機制。本文將深入探討如何在 Istio 中設定 HTTPS 入口閘道器,保護服務對外通訊的安全。HTTPS 透過 SSL/TLS 加密,保障資料在傳輸過程中的機密性與完整性,有效防止中間人攻擊和資料竊聽,是現代網路安全不可或缺的環節。此組態流程包含建立自簽名憑證、設定 Kubernetes Secret、組態 Gateway 和 VirtualService 資源,以及使用 curl 進行連線測試,確保設定正確無誤。此外,文章也涵蓋了使用受信任 CA 憑證的設定方式,以及 kubectl 的實務操作技巧,提供更全面的 Istio 安全設定指引。

在Istio中組態HTTPS入口閘道器

在現代微服務架構中,安全地將服務暴露至外部網路是至關重要的。作為一個服務網格,Istio提供了豐富的功能來簡化這一過程。本文將詳細介紹如何在Istio中組態HTTPS入口閘道器,確保服務能夠安全地對外提供服務。

為什麼需要HTTPS?

在開始組態之前,瞭解為什麼需要HTTPS是非常重要的。HTTPS(超文字傳輸安全協定)是一種安全的通訊協定,它透過使用SSL/TLS加密來保護資料在客戶端和伺服器之間的傳輸。這種加密確保了資料的機密性和完整性,防止了中間人攻擊和資料竊聽。

自簽名證書的產生與組態

在實際生產環境中,通常會使用由受信任的證書頒發機構(CA)簽發的證書。但在開發和測試階段,自簽名證書可以作為一個快速且方便的選擇。以下是產生自簽名證書並在Istio中組態HTTPS入口閘道器的步驟。

步驟1:產生自簽名證書

首先,需要產生一個自簽名證書和私鑰。可以使用OpenSSL工具來完成這一步。

# 建立目錄儲存證書相關檔案
mkdir -p certs
cd certs

# 產生根CA私鑰
openssl genrsa -out ca.key 2048

# 產生根CA證書
openssl req -x509 -new -nodes -key ca.key -sha256 -days 365 -out ca.crt -subj "/C=TW/O=Example CA/CN=example.ca"

# 產生伺服器私鑰
openssl genrsa -out server.key 2048

# 產生伺服器證書籤名請求(CSR)
openssl req -new -key server.key -out server.csr -subj "/C=TW/O=Example/CN=helloworld.example.com"

# 使用根CA簽署伺服器證書
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365

內容解密:

上述指令首先建立了一個根CA,然後使用該CA簽署伺服器證書。這種方式模擬了實際的證書籤發過程。在生產環境中,通常會使用受信任的CA。

步驟2:建立Kubernetes Secret

有了證書和私鑰後,需要在Kubernetes中建立一個Secret,以便Istio的入口閘道器可以使用它。

kubectl create secret tls istio-ingressgateway-certs -n istio-system --key server.key --cert server.crt

內容解密:

這個Secret包含了入口閘道器所需的TLS證書和私鑰。Istio的入口閘道器會自動掛載這個Secret到指定的路徑。

步驟3:組態Gateway和VirtualService

接下來,需要更新Gateway和VirtualService資源,以使用新的證書。

# Gateway組態
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: public-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    tls:
      mode: SIMPLE
      serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
      privateKey: /etc/istio/ingressgateway-certs/tls.key
    hosts:
    - helloworld.example.com
# VirtualService組態
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: helloworld
spec:
  hosts:
  - helloworld.example.com
  gateways:
  - public-gateway
  http:
  - route:
    - destination:
        host: helloworld.default.svc.cluster.local
        port:
          number: 80

內容解密:

Gateway組態定義了入口閘道器的HTTPS設定,包括證書和私鑰的路徑。VirtualService組態則定義了流量的路由規則,將外部請求路由到後端的helloworld服務。

步驟4:測試HTTPS連線

最後,可以使用curl命令來測試HTTPS連線是否正常工作。

export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
export INGRESS_PORT=$(kubectl get svc istio-ingressgateway -n istio-system -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
curl -v --resolve helloworld.example.com:443:$INGRESS_HOST --cacert ca.crt https://helloworld.example.com

內容解密:

這個測試命令模擬了客戶端對伺服器的HTTPS請求。透過使用--resolve選項,可以將網域名稱解析到指定的IP位址,從而測試入口閘道器的HTTPS組態。

使用受信任的證書

在生產環境中,應該使用由受信任的CA簽發的證書。Let’s Encrypt是一個免費且廣泛被接受的CA。以下是取得Let’s Encrypt證書並在Istio中組態的步驟。

步驟1:取得Let’s Encrypt證書

  1. 使用Certbot工具取得Let’s Encrypt證書。
  2. 組態DNS驗證您的網域名稱所有權。
  3. 下載證書檔案(包括fullchain.pemprivkey.pem)。

步驟2:更新Kubernetes Secret

使用下載的證書檔案更新Kubernetes Secret。

kubectl delete secret istio-ingressgateway-certs -n istio-system
kubectl create secret tls istio-ingressgateway-certs -n istio-system --key privkey.pem --cert fullchain.pem

Kubernetes 命令列工具實務

Kubernetes 命令列工具(kubectl)是管理 Kubernetes 叢集的重要工具。本文將深入探討 kubectl 的各種用法和技巧。

基本資源資訊操作

以下是一些基本的 kubectl 命令:

# 列出目前名稱空間中的所有 Pod
kubectl get pod

# 列出指定名稱空間中的所有 Pod
kubectl get pod -n mynamespace

# 顯示指定 Pod 的詳細資訊
kubectl describe pod mypod

內容解密:

這些命令可以用於檢視和管理 Kubernetes 中的 Pod 資源。kubectl get 命令用於列出資源,而 kubectl describe 命令則提供更詳細的資源資訊。

資源排序和篩選

在管理大量資源時,排序和篩選是非常有用的功能。以下是一些相關的 kubectl 命令:

# 按名稱排序 Pod
kubectl get pod --sort-by=.metadata.name

# 篩選具有特定標籤的 Pod
kubectl get pod -l app=myapp

資源標籤和註解操作

以下是一些相關的 kubectl 命令:

# 為 Pod 新增標籤
kubectl label pod mypod mylabel=myvalue

# 移除 Pod 的標籤
kubectl label pod mypod mylabel-

Kubernetes 資源管理流程圖

  flowchart TD
    A[開始] --> B{資源型別}
    B -->|Pod| C[執行 Pod 相關操作]
    B -->|Service| D[執行 Service 相關操作]
    B -->|Deployment| E[執行 Deployment 相關操作]
    C --> F[列出 Pod]
    C --> G[描述 Pod]
    D --> H[列出 Service]
    D --> I[描述 Service]
    E --> J[列出 Deployment]
    E --> K[描述 Deployment]

圖表翻譯:

此圖示展示了 Kubernetes 資源管理的一般流程。首先根據資源型別(Pod、Service 或 Deployment)選擇相應的操作。接著,可以執行列出或描述資源的操作。

Kubernetes 資源操作流程圖

  flowchart TD
    A[開始] --> B{操作型別}
    B -->|建立| C[執行建立操作]
    B -->|刪除| D[執行刪除操作]
    B -->|更新| E[執行更新操作]
    C --> F[使用 kubectl create 命令]
    D --> G[使用 kubectl delete 命令]
    E --> H[使用 kubectl apply 命令]

圖表翻譯:

此圖示展示了 Kubernetes 資源操作的一般流程。根據操作型別(建立、刪除或更新),選擇相應的 kubectl 命令進行操作。

本文詳細介紹瞭如何在Istio中組態HTTPS入口閘道器,包括使用自簽名證書和受信任的CA證書。同時,還介紹了kubectl的基本用法和進階技巧。這些知識對於管理和維護Kubernetes叢集以及確保服務的安全性至關重要。透過實踐這些步驟和命令,可以有效地提高Kubernetes叢集的管理效率和安全性。

從系統整合度的角度來看,在 Istio 中組態 HTTPS 入口閘道器是確保微服務架構安全性的關鍵步驟。本文深入探討了使用自簽名證書和受信任 CA 證書兩種方式,並佐以 kubectl 的實務操作,展現了 Istio 在服務暴露和安全控管方面的優勢。然而,證書管理本身的複雜性以及與不同 CA 整合的流程仍是技術團隊需要面對的挑戰。尤其在自動化證書更新和金鑰輪替方面,需要更完善的解決方案以降低維運成本和風險。對於追求高度自動化的企業而言,整合自動化證書管理工具與 Istio 將是未來的趨勢。玄貓認為,隨著服務網格技術的普及,Istio 的入口閘道器組態將成為微服務架構安全性的根本,其易用性和安全性也將持續提升,在未來更複雜的雲原生環境中扮演更重要的角色。