云原生專欄大綱
文章目錄
- 準備工作
- 項目結構介紹
- 配置安全測試
- ConfigMap
- Secret
- 使用Secret中數據的方式
- Deployment使用Secret配置
- Secret加密
- kustomize部署清單
- ConfigMap改造
- Secret
- SealedSecret
- Deployment改造
- Service
- istio相關資源
- DestinationRule
- Gateway
- VirtualService
- ServiceAccount
- kustomize-bookinfo-apps
- rootapp.yaml
- bookinfo-productpage.yaml
- bookinfo-gateway.yaml
- bookinfo-details.yaml
- bookinfo-reviews-v1.yaml
- bookinfo-reviews-v2.yaml
- bookinfo-ratings.yaml
- 通過argocd一鍵部署bookinfo
- 在argocd中創建app
- 查看部署情況
- 查看istio資源
- 查看項目日志
- 刪除Argocd部署
- 刪除k8s中部署資源
- 訪問測試
- Istio流量加密
- 回顧ingress入口流量加密
- istio-gateway暴露服務
- istio-gateway配置https
- 通過gitops部署項目
準備工作
- 安裝gitlab,將https://gitee.com/zhouwei1996/spring-cloud-bookinfo.git遷移至gitlab
- gitlab中創建全局變量,如鏡像倉庫賬號密碼,保證gitlab-ci.yaml中內容安全
- 共享runner創建,獲取token如下:glrt-wfzAecJmszsZb3GorS8J
- 安裝gitlab-runner,參考:22.云原生之GitLab CICD實戰及解析
#以下兩個在gitlab頁面獲取
gitlabUrl: http://192.168.31.3:83/
runnerRegistrationToken: "glrt-wfzAecJmszsZb3GorS8J" #gitlab-runner注冊用到的tockenconcurrent: 10 #最大作業并發數
checkInterval: 30 #新作業檢查間隔
tags: "shared" #runner的標簽
#rbac權限打開
rbac:create: trueresources: ["pods", "pods/exec", "secrets","configmaps"]verbs: ["get", "list", "watch", "create", "patch", "delete","update"]
修改ConfigMap下config.template.toml配置:
[[runners]]builds_dir = "/builds"[runners.kubernetes]namespace = "base"image = "alpine"pull_policy = "if-not-present" # 拉取鏡像策略,本地有是有本地無需拉取[[runners.kubernetes.volumes.pvc]] # 掛載數據卷持久化name = "k8s-running-pod-data"mount_path = "/builds"[[runners.kubernetes.volumes.host_path]] # 使用docker命令需要配置引擎name = "docker"mount_path = "/var/run/docker.sock"host_path = "/var/run/docker.sock"[[runners.kubernetes.host_aliases]] # 用于解析內網中的harbor域名ip = "192.168.31.11"hostnames = ["harbor域名"][[runners.kubernetes.host_aliases]] # 用于解析k8s集群中Kubernetes API Server 的地址ip = "192.168.31.21" # k8s集群master iphostnames = ["lb.kubesphere.local"]
- 安裝harbor,此處小編使用阿里云鏡像倉庫
- 安裝sealed-secrets,參考24.云原生ArgoCD高級之數據加密seale sealed | 使用 Sealed Secrets 在 Kubernetes 中管理密鑰安全
- 開啟istio自動注入,參考:29.云原生KubeSphere服務網格實戰之Istio安裝配置
項目結構介紹
整個微服務應用中包含了5個組件
productpage 是一個由 react 開發的前端組件
gateway 是一個由 spring-cloud-gateway 提供的 API 網關服務
details 是一個 spring-cloud 微服務,提供了書籍詳情 API
reviews提供了基礎的書籍評論信息, review-v2 在 review-v1 的基礎之上額外的提供了評分數據,依賴 ratings 服務
ratings 是一個 golang 開發的微服務組件
配置安全測試
改造Springcloud-bookinfo中Gateway網關,將reviews權重加密,從Secret中獲取權重值進行測試
ConfigMap
ConfigMap 主要用于存儲非敏感的配置數據
application.yml中經常會配置賬號密碼這些,此時資源清單中這些內容就不能以明文暴露到gitlab中
server:port: ${SERVER_PORT:8080}
spring:application:name: gatewaycloud:gateway:routes:- id: ratingsuri: lb://ratingspredicates:- Path=/api/v1/reviews/*/ratings- id: detailsuri: lb://detailspredicates:- Path=/api/v1/products/*- id: reviews-v1uri: lb://reviews-v1predicates:- Path=/api/v1/products/*/reviews- Weight=reviews, ${reviews-v1:0}- id: reviews-v2uri: lb://reviews-v2predicates:- Path=/api/v1/products/*/reviews- Weight=reviews, ${reviews-v2:100}management:endpoints:web:exposure:include: "*"
此時訪問頁面一直是紅星
Secret
Secret 用于存儲敏感數據,例如密碼、API 密鑰等。
kind: Secret
apiVersion: v1
metadata:name: gatewaynamespace: spring-cloudannotations:kubesphere.io/creator: admin
data:reviews-v1: NTA=reviews-v2: NTA=
type: Opaque
明文數據如下
使用Secret中數據的方式
- 通過環境變量傳遞Secret中的數據:
- 在 Pod 的配置文件中,將 Secret 中的數據通過環境變量傳遞給容器。你可以在 Pod 的 spec.containers.env 部分中設置環境變量,將 Secret 中的數據作為值傳遞給容器。示例:
env:- name: server.portvalueFrom:secretKeyRef:name: detailskey: server-port
- 通過卷掛載Secret中的數據:
- 你還可以將 Secret 中的數據作為文件掛載到 Pod 中。在 Pod 的配置文件中,可以通過 volumes 和 volumeMounts 將 Secret 中的數據掛載到容器中。示例:
volumes:- name: secret-volumesecret:secretName: my-secret
containers:volumeMounts:- name: secret-volumemountPath: /etc/my-app
這樣,你可以在 ConfigMap 中引用這些環境變量或掛載的文件,間接地使用 Secret 中的數據。記住,Secret 中的數據是加密存儲的,應該小心處理以確保安全性。
Deployment使用Secret配置
env:- name: reviews-v1valueFrom:secretKeyRef:name: gatewaykey: reviews-v1- name: reviews-v2valueFrom:secretKeyRef:name: gatewaykey: reviews-v2
訪問頁面測試,多次訪問出現v1和v2版本頁面
Secret加密
- 創建bookinfo-gateway-secret.yaml
kind: Secret
apiVersion: v1
metadata:name: gatewaynamespace: spring-cloudannotations:kubesphere.io/creator: admin
data:reviews-v1: MA==reviews-v2: MTAw
type: Opaque
- 加密bookinfo-gateway-secret.yaml
# 備份公鑰
kubeseal --fetch-cert > public-cert.pemkubeseal --format=yaml --cert ./public-cert-0.26.0.pem < bookinfo-gateway-secret.yaml > bookinfo-gateway-secret-sealed.yaml
- 查看bookinfo-gateway-secret-sealed.yaml
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:creationTimestamp: nullname: gatewaynamespace: spring-cloud
spec:encryptedData:reviews-v1: AgCQ1PwFXeAitYGhDd5Pz+VFZYzsKsGUEqhK/mSQk/3Fhxut+z7lX8+fZReEAt+CPGpOObdHvTwPMeT9eCD3KrKulUgRfLU0ViJw5oU8ESXfoHOIcmAFi58ChtW3vA6Ww6bKoPmdtbKH8OVkLou+8Rw/BG3N+H3+NqSeBvLE7ITv2ZCX2eaH0pOARWG8vQfw65eAnwuYb7LyRoizlAO7eXdJ1V4r7mhqvYGIPMISFw7h3P229ZRYoXwZpOdPyfA3fb6eKQU2JBXUNWp+IT9iNImEt8j6ZGbH/Q49C+tvDRb27Yw13OzAf0QCy88ZbQr4ZixhWi7qUHv3Lhfso++/Ps8/V6svz+p2Ecfsb/+2B7cpBvTLeIH3s6IE+hm7OomnnyQT5wEenBchflsf4/PWd6AuJBm94rtquy5QmPplpy4mig3C68anSYe2fARgK4CPBgczqeVjUJVmOd0HuNjsGXnssC5j8C10y92pXNvu9f7txIANEj5UCul+ovIUZslqof3wMs7OCGsDpJTXVHCL6fF4N0EAHTgjHJgaZQIvjPm1CGmG1igK6wM4QyGmfSGtfc9mn68v1xVKFqAE3eWJsoWuMOaZ09HGwNfS8oMN1DUUjTZfZbR7iJgtAkUcrwoSKfxe4kKrXAa3RDff/9WK/WzQl5/beLNOT5XwcC8lXK43xcILH1MNqrP5zYdv+erIH3DOreviews-v2: AgBtPBz/ANesC/HP7UVhtJbZ2g5oyI08RWck3tQ78pCJzF1w7r9s4p1YWB3zbZ+xgL+rjCnl6IVlaB5UBwsYG1EgkT/g5e0Nfxy0aUigcKu87Qvaj1zmtn3rzP/xZ1RNmcKfK8MRiU4NTj8OwhyjKYe/Qy/pPX7D53880wTdZsuhLFTyF5egZCnRdJekq297hwGH+B7cp4pCbfxoZmTjO5b8jim2YGmc1hEMFKhqObb1AyqMMTJ1G3kF2dmVenlU+jTDRGAlndZLRO9HbeGjBPtjhZuLO4sOLPp6Nd0Cjzzkxe9CylzsTT4SynKN6cgpWcYRweYnelMnVDBoa58X47quMc6LTvo7UmYobfIk//NT34r6qDZ4MR160onHxYUxtGyI3k6ZQJn2wqdDIJEWdMaY+r/DYqG7pgM4XGickNtgKS8o1UFh7fip71a5HGy0q/dPb9URtbKzzABcd91SsVnxK9QYFDFqsUblmpDkCcWm7hMSClAvE8+wvC5+s1bq6+V6QO21coXMqoulU3DVujh0zJE8VSuxIbKvzeVOs0peCNSRpxfF53DCf5JSawseKFkwNn2E47zPHSsHZ2sxQy9Wm7lrfIIsc26oyFhwBhDR416bZ7mRNyJbvjSKWN2iUtF7cLr+WMU2LFszroQMbwkBlciWA9W9pgTrV3Tv+Zi+10yTq199KxShuZ09rcEGsoXWtqQ=template:metadata:annotations:kubesphere.io/creator: admincreationTimestamp: nullname: gatewaynamespace: spring-cloudtype: Opaque
- 刪除bookinfo-gateway-secret.yaml部署
- 部署bookinfo-gateway-secret-sealed.yaml
kubectl apply -f bookinfo-gateway-secret-sealed.yaml
執行上述命令會創建原始的secret,生成如下:
- 重新部署Gateway
- 訪問頁面測試
此時無論怎么訪問都是顯示紅色星
kustomize部署清單
https://gitee.com/zhouwei1996/kustomize
kustomize-bookinfo-reviews通過Istio實現金絲雀部署,結構中資源與其他項目有區別
下述以reviews項目為例,其他項目類似,可編寫為kustomize資源清單,通過app of apps模式一鍵部署。
├─kustomize(父kustomize)
│ ├─kustomize-bookinfo-reviews(bookinfo-reviews部署清單)
│ ├─├─base(公用資源)
│ ├─├─├─kustomization.yaml(組織資源)
│ ├─├─├─svc.yaml
│ ├─├─├─dr.yaml
│ ├─├─├─sa.yaml
│ ├─├─├─vs.yaml
│ ├─├─build(cicd過程生成匯總資源)
│ ├─├─├─build.yaml
│ ├─├─├─kustomization.yaml
│ ├─├─overlay(補丁路徑)
│ ├─├─├─v1
│ ├─├─├─configmap.yaml(存放springboot的application.yml配置)
│ ├─├─├─deployment.yaml
│ ├─├─├─kustomization.yaml
│ ├─├─├─v2
│ ├─├─├─configmap.yaml(存放springboot的application.yml配置)
│ ├─├─├─deployment.yaml
│ ├─├─├─kustomization.yaml
------------------------------------
│ ├─kustomize-bookinfo-productpage(bookinfo-productpage部署清單)
│ ├─├─base(公用資源)
│ ├─├─├─kustomization.yaml(組織資源)
│ ├─├─├─istio-gateway.yaml
│ ├─├─├─svc.yaml
│ ├─├─├─dr.yaml
│ ├─├─├─sa.yaml
│ ├─├─├─vs.yaml
│ ├─├─├─deployment.yaml
│ ├─├─build(cicd過程生成匯總資源)
│ ├─├─├─build.yaml
│ ├─├─├─kustomization.yaml
│ ├─├─overlay(補丁路徑)
│ ├─├─├─dev
│ ├─├─├─kustomization.yaml
----------------------------------------
│ ├─kustomize-bookinfo-gateway(bookinfo-productpage部署清單)
│ ├─├─base(公用資源)
│ ├─├─├─kustomization.yaml(組織資源)
│ ├─├─├─configmap.yaml
│ ├─├─├─svc.yaml
│ ├─├─├─dr.yaml
│ ├─├─├─sa.yaml
│ ├─├─├─vs.yaml
│ ├─├─├─deployment.yaml
│ ├─├─build(cicd過程生成匯總資源)
│ ├─├─├─build.yaml
│ ├─├─├─kustomization.yaml
│ ├─├─overlay(補丁路徑)
│ ├─├─├─dev
│ ├─├─├─kustomization.yaml
--------------下述結構類似查看gitee---------------------
|--kustomize-bookinfo-admin
|--kustomize-bookinfo-ratings
|--kustomize-bookinfo-details
ConfigMap改造
假設配置中ratings下所有內容為需加密數據,改造如下:
kind: ConfigMap
apiVersion: v1
metadata:name: reviewsnamespace: spring-cloudannotations:kubesphere.io/creator: admin
data:application.yml: |-server:port: ${SERVER_PORT:8080}spring:application:name: reviewsratings:enabled: ${ratings_enabled:false}server-addr: ${ratings_server_addr:http://ratings}color: ${ratings_color:red}management:endpoints:web:exposure:include: "*"
Secret
bookinfo-reviews-secret.yaml
kind: Secret
apiVersion: v1
metadata:name: reviewsnamespace: spring-cloudannotations:kubesphere.io/creator: admin
data:ratings_color: cmVkratings_enabled: dHJ1ZQ==ratings_server_addr: aHR0cDovL3JhdGluZ3M=
type: Opaque
SealedSecret
- 加密Secret
kubeseal --format=yaml --cert ./public-cert-0.26.0.pem < bookinfo-reviews-secret.yaml > bookinfo-reviews-secret-sealed.yaml
- 加密后SealedSecret,替換部署清單中Secret
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:creationTimestamp: nullname: reviewsnamespace: spring-cloud
spec:encryptedData:ratings_color: AgCfoIXX43E/KCSqtmC2HPXqUky2tOMs5ZrOesM7c19eeGSLSZUJiZ58mv407couvVTAKy0f5HazHeGOvQzW5QmMQtFM38yrKrNrwInuWal8XGMRUo/pwbxlPQ2K5X8L9g/jJg7eykaXHoYA/n0r1XRq0ZgN3M8I+uhZqrABhtT7oxb+yQB2w2BCOdfCpnogblgfZQkgEiYoBqfmMH4SZ+Uz//fi3EKekIItBq94ZvjpaS/w+G1+DE7suhsYp4gKRUwcJBY9D6qWJc4LBXwOGKfKI6Lg5cKOs6UYi0qAUPeU0fU+zpp3uyFia2ghWuXHUhe2E4zwEFbMJ/CFiQO76bHHblo4+aLWi0SQHLVDR6h0jtNTjRk+IkxMwFlxji2UqHa5J6giCJwMpTx44UHicQ5RPbwbVCtpog/U+vjTejszxRZDU0SWeIlH2gHRtFdIIl8uKy2/SFhjE6i/0NN2F1hXGHfCGE7rLZXGXUxNRvvMa/IPHKahn/HfunURXODo/kwdqoEuaoRnEjk4LD1oWdhUZxume/jC2riTMTTcQBEEyNWJIwdJzooACj7Z0Qn5AG0Gs/A23yea6WCL5ZCn0b0k8KzHQHZRcIPWddZStYaqO5l2B4F8rblL7XwpDk9lXXbPgktKlou19HMcUmZu3Vuu7DNuehrAr0K5bUR8qiillfOLbO5RFmZsr7rOSAe4bhGCE2U=ratings_enabled: AgBsOa0HGRi+m/KArc1WZcHOB6pouyq4inkfDXUpKkOkZXhhJsk97qr/dTBQCae7ey+myUPPWpQhJLjcXFzE/f0lk0jRklZvUV8tdYUE6nj+MKmDHFf/tpe4+buB4nhcKOXsjzgBheuElXqObNmXaDxnHOdyDJJarG1eL3v+/cbcZ+mYPEmZQ4fzCSvLGQuN37ZKljjM5Mq5S6UhL8VK/2Niy+7weQZkVg5B/4P5L8I5n77//fUR5SNP79PxaeiY5dFgHU1+CiITTuC5igBTyqTFUrStZlo/pfbTtBDuAa//I1hgQhFF3l0Rb+HdySv1nrgbL6aWcJojpxIw3JJe4aEv/DGoF7jGRMsFPrSHk18DtO0+g0pLJ9SRxLCX8nNHDCynVFZfF6PIQx56kEFzv4I6zQEichstkTZq7rFPqjK7ROy8ctmJQHyVx3jbW4kBqAzwT5UhbVk0Kk/uwXjthgb+SA6EQoN5PNhcgtcU4YRxXgsmiy7r73qa5monqEBITD9icAVE2Ni8qtKDwU+q6j8L1qsSe2BM74JEeKmRQUTJYj2uzZjUCtS077BYAEQ6mts2eNOEIskHaDK09YwnZHThQ78Sslqv52scrHM65AT7UV1GVG/v010z9AWX8c0bRfObbFtYkxwy3l9GTWsyUw3ShJrGGY35jROsKBtlNdIg4Y6AOqSRyQ+7Hksz9CbkWA2Qaejqratings_server_addr: AgBpinPNNUcEwEQqAKnMZKrGLDr7f3RFJZTtDxJcjPX5/nWJ2W4Wo2OKu/7Cj9qp7L+KddEELPpuXZP5BfFfjHJrq/QOUAIQYxQnwof/rem6lWMs+bxN3GTzsVakBwW1zi9oLAbpWjB8mblFnskbtRFF7r7jAFX7UFi5Ad6WyF0Bxitys9Jb64trjhhDeb4+yzV61raL+jqs3dhU/ObFPHmu6XIb0I4EUEy2IHPfWkL3gIn2rEpLzX71Tp1WfOjHLPFuOK81jaqgVQOtempQ8USsZQMJ2K4Lft9Sm2XoUfYjDCl56RnGYqtUKYQfDRr/YV5wFhOt15VBO/M0xsaYTYFKoyUw8SS85slkPe5nIyoRe5MdCjsWlQsVWS/nCo3ZCwPzEzsPMDGf0k8mNg2POgRFARr8iFy4Zp1uTxhy2h1ohw9TRDkD6U/gyj+ETCXdlRGRC8UFuVOHXz4+H8aXMMmPeIlCZ3t/6HU4xFc9TOghZQQqxgEt+lQU8aBNJKmHFUqIdtG01OdZ39aYSK0kGUqdp+Gh8UdE/JXa4aXV0u5EWUt5gcPg+8sAjstyWeozr1cg/26KvKj3JfcGflmMIg0CWZxc/Rm1acuM4LuCFKgkGPg5dWuTo3ZbXVz4d8WZxRpXgBsd6VGCCDDOfFPvuwpsOmC7yMVsQo+4mbiP3gBqf+pl8zP7PbA+RT/5puvBODGBMGUYNXvTyTVst1zQlQ==template:metadata:annotations:kubesphere.io/creator: admincreationTimestamp: nullname: reviewsnamespace: spring-cloudtype: Opaque
Deployment改造
apiVersion: apps/v1
kind: Deployment
metadata:name: reviewslabels:app: reviewsversion: v1
spec:replicas: 1revisionHistoryLimit: 3selector:matchLabels:app: reviewsversion: v1template:metadata:labels:app: reviewsversion: v1spec:containers:- image: registry.cn-hangzhou.aliyuncs.com/yxymzw/reviews:latestname: reviewsports:- containerPort: 8080env:# 將secret加密配置引入- name: ratings_enabledvalueFrom:secretKeyRef:name: reviewskey: ratings_enabled - name: ratings_server_addrvalueFrom:secretKeyRef:name: reviewskey: ratings_server_addr- name: ratings_colorvalueFrom:secretKeyRef:name: reviewskey: ratings_color
Service
svc.yaml
apiVersion: v1
kind: Service
metadata: name: reviewslabels:app: reviewsservice: reviews
spec: ports: - port: 80 targetPort: 8080selector: app: reviews
istio相關資源
DestinationRule
dr.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: reviews
spec:host: reviewssubsets:- name: v1labels:version: v1
Gateway
istio-gateway.yaml,流量入口建議放在bookinfo-productpage項目中,或者通過ArgoCD的app of apps放在頂級app中
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:# 指定了這個 Gateway 的名稱name: kustomize-bookinfo-gateway
spec:# 指定了這個 Gateway 的目標選擇器為 istio: ingressgateway,表示這個網關將指向 Istio 中的 Ingress Gatewayselector:istio: ingressgatewayservers: # 定義了網關監聽的端口信息- port:number: 99name: httpprotocol: HTTPhosts:- "*"
該資源會與istio-ingressgateway綁定
VirtualService
vs.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: reviews
spec:hosts:- reviewshttp: # 定義了虛擬服務的 HTTP 路由規則- route: # 定義了路由規則,指定了流量的目的地- destination: # 指定了路由的目的地,即將流量發送到的服務host: reviews # 指定了目標服務的主機為 reviewssubset: v1 # 指定了要發送流量到的服務的子集為 v1,這表示將流量路由到 reviews 服務的 v1 版本
ServiceAccount
sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: bookinfo-reviewslabels:account: reviews
在 Istio 中,ServiceAccount 用于定義服務在 Istio 網格中的身份。Istio 構建在 Kubernetes 上,并擴展了 Kubernetes 的功能,包括對服務身份和訪問控制的增強支持。使用 ServiceAccount 可以為服務提供以下幾個重要用途:
- 身份驗證:ServiceAccount 可以用于驗證服務的身份。在 Istio 中,每個服務都有一個關聯的 ServiceAccount,可以使用該 ServiceAccount 來驗證服務的身份,確保只有經過身份驗證的服務才能相互通信。
- 授權和訪問控制:通過 ServiceAccount,可以為服務定義訪問控制策略。在 Istio 中,可以使用 ServiceAccount 來定義哪些服務可以與其他服務通信,以及允許的通信方式和權限級別。
- 安全策略:ServiceAccount 可以與 Istio 的安全功能結合使用,如基于角色的訪問控制(RBAC)和網絡策略,以實現微服務之間的安全通信。通過為每個服務分配特定的 ServiceAccount,并為這些 ServiceAccount 配置適當的權限,可以確保服務之間的通信是安全的。
- 跟蹤和監控:使用 ServiceAccount 可以幫助跟蹤和監控服務在 Istio 網格中的活動。通過為每個服務分配獨特的 ServiceAccount,可以更容易地跟蹤服務的活動、生成日志和監控指標。
總的來說,ServiceAccount 在 Istio 中扮演著關鍵的角色,用于定義和管理服務在 Istio 網格中的身份和訪問權限,從而確保服務之間的通信是安全、可控和可管理的。
kustomize-bookinfo-apps
通過該項目可以一鍵部署bookinfo
https://gitee.com/zhouwei1996/kustomize
kustomize-bookinfo-apps
|--root-app|--rootapp.yaml # 指定apps位置
|--apps # 指定各個項目位置|--bookinfo-productpage.yaml|--bookinfo-gateway.yaml|--bookinfo-details.yaml|--bookinfo-reviews.yaml|--bookinfo-ratings.yaml
如何編寫Application?部署一個測試Application,查看部署后生成的Application資源yaml
kubectl get app -n argocd
kubectl get app <application> -n argocd -o yaml
rootapp.yaml
apiVersion: argoproj.io/v1alpha1
# Application 資源,用于定義應用程序的部署配置
kind: Application
metadata:name: root-applicationnamespace: argocd
spec:# 指定了應用程序所屬的項目為 defaultproject: default# 指定了應用程序的源碼信息source:repoURL: https://gitee.com/zhouwei1996/kustomize.git# 指定了要部署的代碼版本為 HEADtargetRevision: HEAD# 指定了部署時的目錄配置path: ./kustomize-bookinfo-apps/appsdirectory:# 指定了不遞歸處理目錄recurse: false# 指定了應用程序的部署目的地destination:server: https://kubernetes.default.svc# 指定了部署到的命名空間為 defaultnamespace: default
targetRevision: HEAD
在軟件開發中,targetRevision: HEAD 表示在版本控制系統(如 Git)中使用最新的提交作為部署的目標版本。在 Git 中,HEAD 是指向當前所在分支最新提交的指針。
具體來說,當在部署流程中指定 targetRevision: HEAD 時,系統會將部署目標設置為當前所在分支的最新提交。這意味著每次部署時都會使用當前分支的最新代碼版本,確保部署的是最新的代碼更改。
使用 targetRevision: HEAD 可以確保部署的應用程序始終是基于最新的代碼提交構建的,有助于保持部署的應用程序與代碼倉庫的同步,并確保部署的應用程序包含了最新的功能和修復。
bookinfo-productpage.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:# 指定了 Application 資源的名稱name: bookinfo-ratings# 指定了資源所在的命名空間為 argocdnamespace: argocd
spec:# 指定了應用程序的部署目的地destination:# 指定了部署到的命名空間namespace: spring-cloud# 指定了部署到的 Kubernetes 集群的 API 服務器地址server: https://kubernetes.default.svc# 指定了應用程序所屬的項目為 defaultproject: defaultsource:# 指定了應用程序的路徑path: kustomize-bookinfo-ratings# 指定了應用程序的源代碼存儲庫的 URLrepoURL: https://gitee.com/zhouwei1996/kustomize.git# 指定了要部署的代碼版本為 main (分支名稱)targetRevision: HEAD# 指定了同步策略syncPolicy:# 指定了應用程序的同步策略為自動化,以便 Argo CD 可以自動監視并同步應用程序的狀態。automated: {} syncOptions: # 指定了同步選項# 啟用了創建命名空間的選項,即在部署應用程序時會創建指定的命名空間- CreateNamespace=true
bookinfo-gateway.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:name: bookinfo-gatewaynamespace: argocd
spec:destination:namespace: spring-cloudserver: https://kubernetes.default.svcproject: defaultsource:path: kustomize-bookinfo-gateway/baserepoURL: https://gitee.com/zhouwei1996/kustomize.gittargetRevision: HEADsyncPolicy:automated: {}syncOptions:- CreateNamespace=true
bookinfo-details.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:name: bookinfo-detailsnamespace: argocd
spec:destination:namespace: spring-cloudserver: https://kubernetes.default.svcproject: defaultsource:path: kustomize-bookinfo-details/baserepoURL: https://gitee.com/zhouwei1996/kustomize.gittargetRevision: HEADsyncPolicy:automated: {}syncOptions:- CreateNamespace=true
bookinfo-reviews-v1.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:name: bookinfo-reviewsnamespace: argocd
spec:destination:namespace: spring-cloudserver: https://kubernetes.default.svcproject: defaultsource:path: kustomize-bookinfo-reviews/overlay/v1repoURL: https://gitee.com/zhouwei1996/kustomize.gittargetRevision: HEADsyncPolicy:automated: {}syncOptions:- CreateNamespace=true
bookinfo-reviews-v2.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:name: bookinfo-reviewsnamespace: argocd
spec:destination:namespace: spring-cloudserver: https://kubernetes.default.svcproject: defaultsource:path: kustomize-bookinfo-reviews/overlay/v2repoURL: https://gitee.com/zhouwei1996/kustomize.gittargetRevision: HEADsyncPolicy:automated: {}syncOptions:- CreateNamespace=true
bookinfo-ratings.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:name: bookinfo-ratingsnamespace: argocd
spec:destination:namespace: spring-cloudserver: https://kubernetes.default.svcproject: defaultsource:path: kustomize-bookinfo-ratings/baserepoURL: https://gitee.com/zhouwei1996/kustomize.gittargetRevision: HEADsyncPolicy:automated: {}syncOptions:- CreateNamespace=true
通過argocd一鍵部署bookinfo
在argocd中創建app
- kubesphere中安裝devops組件,參考16.云原生之kubesphere組件安裝卸載
- 暴露argocd,參考19.云原生CICD之ArgoCD入門CD過程實戰
- 登錄argocd,配置倉庫地址
- 創建應用,參考23.云原生之ArgoCD CICD實戰
查看部署情況
- 查看ArgoCD部署情況
- 查看kubesphere部署情況
注意:通過上述觀察發現我們部署的svc資源帶上了前綴,跟我們VirtualService中使用的hosts不一致,這兒需要修改
查看istio資源是否也添加了前綴:
# kubectl get gw -A
NAMESPACE NAME AGE
bookinfo bookinfo-gateway 7d2h
spring-cloud devops-web-gateway 6m10s
spring-cloud gateway 6m10s
spring-cloud kustomize-devops-web-gateway 27m
spring-cloud kustomize-gateway 27m
spring-cloud reviews-gateway 6m10s
spring-cloud v2-kustomize-reviews-gateway 27m
- 刪除所有資源
kubectl delete all --all -n <namespace>
kubectl delete all --all -n spring-cloud
查看istio資源
Istio 是一個服務網格解決方案,它引入了許多自定義資源(Custom Resource Definitions,CRDs)來管理服務間的通信、流量控制和安全策略等。以下是 Istio 中常見的一些資源類型:
- VirtualService:定義了服務之間的路由規則,允許你控制流量的路由和轉發。
- DestinationRule:定義了服務的目標規則,用于指定服務的負載均衡策略、連接池設置等。
- Gateway:定義了入口網關,允許外部流量訪問 Istio 網格中的服務。
- ServiceEntry:允許你將外部服務引入 Istio 網格,或者定義對外部服務的訪問規則。
- VirtualServiceSubset:用于定義虛擬服務的子集,可以用于進一步細化路由規則。
- IstioOperator:用于配置和管理 Istio 控制平面的自定義資源。
- AuthorizationPolicy:定義了服務間的訪問控制策略,用于實現服務級別的安全控制。
- Sidecar:用于配置 Envoy sidecar 代理的自定義資源。
所有命名空間中的 Istio 資源
kubectl get virtualservices --all-namespaces
kubectl get destinationrules --all-namespaces
kubectl get gw --all-namespaces
kubectl get ServiceAccount --all-namespaceskubectl get serviceentries --all-namespaces
kubectl get istiooperators --all-namespaces
kubectl get authorizationpolicies --all-namespaces
kubectl get sidecars --all-namespaces
查看項目日志
gateway:
該錯誤是服務賬戶沒有訪問權限,配置如下:
刪除Argocd部署
在 Argo CD 中刪除應用程序(app)時,可以選擇不同的刪除策略,包括 Foreground、Background 和 Non-cascading。這些策略決定了刪除操作的行為方式。下面是它們的區別:
- Foreground(前臺):
- 在 Foreground 刪除策略下,Argo CD 將首先刪除應用程序的資源對象,然后再刪除應用程序本身。
- 這意味著刪除應用程序的操作會等待所有資源對象被刪除后才會完成,這可能會導致刪除操作需要一些時間才能完成。
- Foreground 刪除策略通常用于確保資源對象被正確清理,以避免可能的沖突或問題。
- Background(后臺):
- 在 Background 刪除策略下,Argo CD 將直接刪除應用程序本身,而不等待資源對象被刪除。
- 這意味著刪除應用程序的操作會立即返回,而資源對象的刪除將在后臺進行,不會阻塞刪除操作的完成。
- Background 刪除策略通常用于快速刪除應用程序,而不需要等待資源對象的清理。
- Non-cascading(非級聯):
- Non-cascading 刪除策略指示 Argo CD 僅刪除應用程序本身,而不會刪除應用程序創建的任何資源對象。
- 這意味著應用程序關聯的資源對象將保留在集群中,不會被刪除。
- Non-cascading 刪除策略通常用于保留應用程序創建的資源對象,以便稍后重新使用或進行其他操作。
在使用 Argo CD 刪除應用程序時,根據具體需求選擇適合的刪除策略是很重要的。根據是否需要等待資源對象的刪除以及是否需要級聯刪除資源對象,選擇合適的刪除策略可以更好地管理應用程序的生命周期。
刪除k8s中部署資源
刪除指定空間所有資源
kubectl delete all --all -n spring-cloud
刪除 Istio 資源:
kubectl delete virtualservice <virtualservice-name> -n <namespace>
kubectl delete destinationrule <destinationrule-name> -n <namespace>
kubectl delete gw <gateway-name> -n <namespace>
kubectl delete serviceentry <serviceentry-name> -n <namespace>
kubectl delete istiooperator <istiooperator-name> -n <namespace>
kubectl delete authorizationpolicy <authorizationpolicy-name> -n <namespace>
kubectl delete sidecar <sidecar-name> -n <namespace>
刪除查詢到的資源
kubectl get gw -n spring-cloud | awk '{print $1}' | xargs kubectl delete gw -n spring-cloudkubectl get virtualservice -n spring-cloud | awk '{print $1}' | xargs kubectl delete virtualservice -n spring-cloudkubectl get ServiceAccount -n spring-cloud | awk '{print $1}' | xargs kubectl delete ServiceAccount -n spring-cloudkubectl get destinationrule -n spring-cloud | awk '{print $1}' | xargs kubectl delete destinationrule -n spring-cloud
訪問測試
通過nodeport方式暴露istio-ingressgateway流量入口
訪問頁面,若是訪問出錯檢查bookinfo-productpage部署時環境變量API_SERVER是否配置
Istio流量加密
回顧ingress入口流量加密
參考下述文章進行配置:
4. 服務暴露方式
5.云原生安全之kubesphere應用網關配置域名TLS證書
驗證結果如下:
bookinfo安全暴露服務:
修改愛快軟路由暴露192.168.31.12內網ip
訪問測試
istio-gateway暴露服務
- 配置LoadBalancer暴露
- ip訪問測試
- 配置愛快映射內網ip
這個內網和外網端口保持一致,端口為istio-ingressgateway服務端口如下:
- 域名訪問
istio-gateway配置https
官網:理解 TLS 配置
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: kustomize-bookinfo-gateway
spec:selector:istio: ingressgatewayservers:- port:number: 99name: httpprotocol: HTTPhosts:- "*"# 重定向到https上tls:httpsRedirect: true- port:number: 77name: httpsprotocol: HTTPStls:mode: SIMPLE# 配置證書secretcredentialName: your-cert-secret-namehosts:- "*"
mode選項介紹:
在 Istio 中,當配置 Gateway 的 TLS 設置時,tls.mode 選項用于指定 TLS 連接的模式。tls.mode 可以設置為以下幾種模式之一:
- SIMPLE: 這是最基本的 TLS 模式,用于啟用基本的 TLS 加密和解密。在 SIMPLE 模式下,必須提供證書和私鑰,以便進行 TLS 握手和加密通信。
- MUTUAL: 在 MUTUAL 模式下,除了要求客戶端驗證服務器的證書外,還要求服務器驗證客戶端的證書。這種模式也稱為雙向 TLS 或 mTLS(mutual TLS)。在這種模式下,客戶端和服務器之間的通信將進行雙向身份驗證,增強了通信的安全性。
- ISTIO_MUTUAL: 這是 Istio 特定的一種 TLS 模式,類似于 MUTUAL 模式,但是 Istio 自動處理證書的生成和分發。在 ISTIO_MUTUAL 模式下,Istio Pilot 會自動為服務生成證書,并確保雙向 TLS 通信的安全性。
在 Istio Gateway 中配置 TLS 模式時,根據您的安全需求和環境,選擇適當的 tls.mode 設置是很重要的。您可以根據實際情況選擇 SIMPLE、MUTUAL 或 ISTIO_MUTUAL 模式,以保障通信的安全性和完整性。
此處配置訪問測試【問題暫時還未解決】
通過gitops部署項目
案例項目地址:https://gitee.com/zhouwei1996/spring-cloud-bookinfo.git
此處小編不進行演示給出關鍵gitlab-ci.yml流水線腳本,可根據實際情況改造
variables:KUBECONFIG: /etc/deploy/configMAVEN_OPTS: >--Dmaven.repo.local=/builds/maven-Dorg.slf4j.simpleLogger.showDateTime=true-Djava.awt.headless=trueMAVEN_CLI_OPTS: >---batch-mode--errors--fail-at-end--show-version--no-transfer-progress-DinstallAtEnd=true-DdeployAtEnd=true# 設置自定義的鏡像源# DOCKER_REGISTRY_MIRROR: https://registry.example.comDOCKER_IMAGE_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUGDOCKER_DRIVER: overlay
stages:- package- build- deploypackage:stage: packageimage: maven:3.6.3-jdk-8tags:- k8sscript:- mvn clean package -Dmaven.test.skip=true- rm -rf /builds/project-target/reviews- rm -rf /builds/project-target/productpage- cp -rf ./reviews /builds/project-target- cp -rf ./productpage /builds/project-targetdocker-build:image: docker:cliservices:- docker:lateststage: buildtags:- k8sscript:- cd /builds/project-target- docker login -u $aliimarepo_user -p $aliimarepo_password registry.cn-hangzhou.aliyuncs.com- docker build -t registry.cn-hangzhou.aliyuncs.com/yxymzw/productpage:latest -f ./productpage/Dockerfile ./productpage/- docker push registry.cn-hangzhou.aliyuncs.com/yxymzw/productpage:latest- docker build -t registry.cn-hangzhou.aliyuncs.com/yxymzw/reviews:latest -f ./reviews/Dockerfile ./reviews/- docker push registry.cn-hangzhou.aliyuncs.com/yxymzw/productpage:latestdeploy:stage: deployimage: cnych/kustomize:v1.0before_script:- git config --global user.email "gitlab@git.k8s.local"- git config --global user.name "GitLab CI/CD"script:- cd /builds/project-target- rm -rf ./kustomize- git clone http://$gitlab_user:$gitlab_password@192.168.31.3:83/root/kustomize.git- cd ./kustomize/kustomize-bookinfo-productpage/overlay/dev- kustomize edit set image registry.cn-hangzhou.aliyuncs.com/yxymzw/productpage:latest- kustomize build > ../../build/build.yaml- cd ./kustomize/kustomize-bookinfo-reviews/overlay/dev- kustomize edit set image registry.cn-hangzhou.aliyuncs.com/yxymzw/reviews:latest- kustomize build > ../../build/build.yaml- git add /builds/project-target/kustomize/kustomize-productpage/- git add /builds/project-target/kustomize/kustomize-reviews/- git commit -am "image update"- git push -u origin main