37.云原生之springcloud+k8s+GitOps+istio+安全實踐

云原生專欄大綱

文章目錄

  • 準備工作
  • 項目結構介紹
  • 配置安全測試
    • 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部署項目

準備工作

  1. 安裝gitlab,將https://gitee.com/zhouwei1996/spring-cloud-bookinfo.git遷移至gitlab
  2. gitlab中創建全局變量,如鏡像倉庫賬號密碼,保證gitlab-ci.yaml中內容安全
  3. 共享runner創建,獲取token如下:glrt-wfzAecJmszsZb3GorS8J

image.png

  1. 安裝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"]

image.png

  1. 安裝harbor,此處小編使用阿里云鏡像倉庫
  2. 安裝sealed-secrets,參考24.云原生ArgoCD高級之數據加密seale sealed | 使用 Sealed Secrets 在 Kubernetes 中管理密鑰安全
  3. 開啟istio自動注入,參考:29.云原生KubeSphere服務網格實戰之Istio安裝配置

項目結構介紹

image.png
整個微服務應用中包含了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: "*"

此時訪問頁面一直是紅星
image.png

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

明文數據如下
image.png

使用Secret中數據的方式

  1. 通過環境變量傳遞Secret中的數據
    • 在 Pod 的配置文件中,將 Secret 中的數據通過環境變量傳遞給容器。你可以在 Pod 的 spec.containers.env 部分中設置環境變量,將 Secret 中的數據作為值傳遞給容器。示例:
env:- name: server.portvalueFrom:secretKeyRef:name: detailskey: server-port
  1. 通過卷掛載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配置

image.png

          env:- name: reviews-v1valueFrom:secretKeyRef:name: gatewaykey: reviews-v1- name: reviews-v2valueFrom:secretKeyRef:name: gatewaykey: reviews-v2

訪問頁面測試,多次訪問出現v1和v2版本頁面
image.png
image.png

Secret加密

  1. 創建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

image.png

  1. 加密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
  1. 查看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
  1. 刪除bookinfo-gateway-secret.yaml部署

image.png

  1. 部署bookinfo-gateway-secret-sealed.yaml
kubectl apply -f bookinfo-gateway-secret-sealed.yaml

執行上述命令會創建原始的secret,生成如下:
image.png
image.png

  1. 重新部署Gateway

image.png

  1. 訪問頁面測試

此時無論怎么訪問都是顯示紅色星
image.png

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

image.png

SealedSecret

  1. 加密Secret
kubeseal --format=yaml --cert ./public-cert-0.26.0.pem < bookinfo-reviews-secret.yaml > bookinfo-reviews-secret-sealed.yaml
  1. 加密后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綁定
image.png

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 可以為服務提供以下幾個重要用途:

  1. 身份驗證:ServiceAccount 可以用于驗證服務的身份。在 Istio 中,每個服務都有一個關聯的 ServiceAccount,可以使用該 ServiceAccount 來驗證服務的身份,確保只有經過身份驗證的服務才能相互通信。
  2. 授權和訪問控制:通過 ServiceAccount,可以為服務定義訪問控制策略。在 Istio 中,可以使用 ServiceAccount 來定義哪些服務可以與其他服務通信,以及允許的通信方式和權限級別。
  3. 安全策略:ServiceAccount 可以與 Istio 的安全功能結合使用,如基于角色的訪問控制(RBAC)和網絡策略,以實現微服務之間的安全通信。通過為每個服務分配特定的 ServiceAccount,并為這些 ServiceAccount 配置適當的權限,可以確保服務之間的通信是安全的。
  4. 跟蹤和監控:使用 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

  1. kubesphere中安裝devops組件,參考16.云原生之kubesphere組件安裝卸載
  2. 暴露argocd,參考19.云原生CICD之ArgoCD入門CD過程實戰
  3. 登錄argocd,配置倉庫地址

image.png

  1. 創建應用,參考23.云原生之ArgoCD CICD實戰

image.pngimage.pngimage.png

查看部署情況

  1. 查看ArgoCD部署情況

image.png
image.png

  1. 查看kubesphere部署情況

image.png
image.png

注意:通過上述觀察發現我們部署的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
  1. 刪除所有資源
kubectl delete all --all -n <namespace>
kubectl delete all --all -n spring-cloud

查看istio資源

Istio 是一個服務網格解決方案,它引入了許多自定義資源(Custom Resource Definitions,CRDs)來管理服務間的通信、流量控制和安全策略等。以下是 Istio 中常見的一些資源類型:

  1. VirtualService:定義了服務之間的路由規則,允許你控制流量的路由和轉發。
  2. DestinationRule:定義了服務的目標規則,用于指定服務的負載均衡策略、連接池設置等。
  3. Gateway:定義了入口網關,允許外部流量訪問 Istio 網格中的服務。
  4. ServiceEntry:允許你將外部服務引入 Istio 網格,或者定義對外部服務的訪問規則。
  5. VirtualServiceSubset:用于定義虛擬服務的子集,可以用于進一步細化路由規則。
  6. IstioOperator:用于配置和管理 Istio 控制平面的自定義資源。
  7. AuthorizationPolicy:定義了服務間的訪問控制策略,用于實現服務級別的安全控制。
  8. 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:
image.png
該錯誤是服務賬戶沒有訪問權限,配置如下:
image.png

刪除Argocd部署

image.png
在 Argo CD 中刪除應用程序(app)時,可以選擇不同的刪除策略,包括 Foreground、Background 和 Non-cascading。這些策略決定了刪除操作的行為方式。下面是它們的區別:

  1. Foreground(前臺)
    • 在 Foreground 刪除策略下,Argo CD 將首先刪除應用程序的資源對象,然后再刪除應用程序本身。
    • 這意味著刪除應用程序的操作會等待所有資源對象被刪除后才會完成,這可能會導致刪除操作需要一些時間才能完成。
    • Foreground 刪除策略通常用于確保資源對象被正確清理,以避免可能的沖突或問題。
  2. Background(后臺)
    • 在 Background 刪除策略下,Argo CD 將直接刪除應用程序本身,而不等待資源對象被刪除。
    • 這意味著刪除應用程序的操作會立即返回,而資源對象的刪除將在后臺進行,不會阻塞刪除操作的完成。
    • Background 刪除策略通常用于快速刪除應用程序,而不需要等待資源對象的清理。
  3. 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流量入口
image.png
訪問頁面,若是訪問出錯檢查bookinfo-productpage部署時環境變量API_SERVER是否配置
image.png

Istio流量加密

回顧ingress入口流量加密

參考下述文章進行配置:
4. 服務暴露方式
5.云原生安全之kubesphere應用網關配置域名TLS證書
驗證結果如下:
image.png
bookinfo安全暴露服務:
image.png
image.png
修改愛快軟路由暴露192.168.31.12內網ip
image.png
訪問測試

istio-gateway暴露服務

  1. 配置LoadBalancer暴露

image.png

  1. ip訪問測試

image.png

  1. 配置愛快映射內網ip

image.png
這個內網和外網端口保持一致,端口為istio-ingressgateway服務端口如下:
image.png

  1. 域名訪問

image.png

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 可以設置為以下幾種模式之一:

  1. SIMPLE: 這是最基本的 TLS 模式,用于啟用基本的 TLS 加密和解密。在 SIMPLE 模式下,必須提供證書和私鑰,以便進行 TLS 握手和加密通信。
  2. MUTUAL: 在 MUTUAL 模式下,除了要求客戶端驗證服務器的證書外,還要求服務器驗證客戶端的證書。這種模式也稱為雙向 TLS 或 mTLS(mutual TLS)。在這種模式下,客戶端和服務器之間的通信將進行雙向身份驗證,增強了通信的安全性。
  3. ISTIO_MUTUAL: 這是 Istio 特定的一種 TLS 模式,類似于 MUTUAL 模式,但是 Istio 自動處理證書的生成和分發。在 ISTIO_MUTUAL 模式下,Istio Pilot 會自動為服務生成證書,并確保雙向 TLS 通信的安全性。

在 Istio Gateway 中配置 TLS 模式時,根據您的安全需求和環境,選擇適當的 tls.mode 設置是很重要的。您可以根據實際情況選擇 SIMPLE、MUTUAL 或 ISTIO_MUTUAL 模式,以保障通信的安全性和完整性。

此處配置訪問測試【問題暫時還未解決】
image.png

通過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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712014.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712014.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712014.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

132557-72-3,2,3,3-三甲基-3H-吲哚-5-磺酸,具有優異的反應活性和光學性能

132557-72-3&#xff0c;5-Sulfo-2,3,3-trimethyl indolenine sodium salt&#xff0c;2,3,3-三甲基-3H-吲哚-5-磺酸&#xff0c;具有優異的反應活性和光學性能&#xff0c;一種深棕色粉末 您好&#xff0c;歡迎來到新研之家 文章關鍵詞&#xff1a;132557-72-3&#xff0c;5…

ROS2體系框架

文章目錄 1.ROS2的系統架構2.ROS2的編碼風格3.細談初始化和資源釋放4.細談配置文件5.ROS2的一些命令6.ROS2的核心模塊6.1 通信模塊6.2 功能包6.3 分布式6.4 終端命令和rqt6.5 launch6.6 TF坐標變換6.7 可視化RVIZ 1.ROS2的系統架構 開發者的工作內容一般都在應用層&#xff0c;…

MySQL學習Day24—數據庫的設計規范

一、數據庫設計的重要性: 1.糟糕的數據庫設計產生的問題: (1)數據冗余、信息重復、存儲空間浪費 (2)數據更新、插入、刪除的異常 (3)無法正確表示信息 (4)丟失有效信息 (5)程序性能差 2.良好的數據庫設計有以下優點: (1)節省數據的存儲空間 (2)能夠保證數據的完整性 …

力扣138.隨機鏈表的復制

給你一個長度為 n 的鏈表&#xff0c;每個節點包含一個額外增加的隨機指針 random &#xff0c;該指針可以指向鏈表中的任何節點或空節點。 構造這個鏈表的 深拷貝。 深拷貝應該正好由 n 個 全新 節點組成&#xff0c;其中每個新節點的值都設為其對應的原節點的值。新節點的 n…

編寫一個自動合并代碼到不同分支的腳本小工具

新建一個 autoMerge.sh 的文件&#xff0c;文件內容如下 # 提示用戶確認繼續執行 read -p "確認要執行腳本嗎&#xff1f;(輸入 yes 繼續): " userInput# 檢查用戶輸入是否為 "yes" if [ "$userInput" ! "yes" ]; thenecho "用戶…

《TCP/IP詳解 卷一》第9章 廣播和組播

目錄 9.1 引言 9.2 廣播 9.2.1 使用廣播地址 9.2.2 發送廣播數據報 9.3 組播 9.3.1 將組播IP地址轉換為組播MAC地址 9.3.2 例子 9.3.3 發送組播數據報 9.3.4 接收組播數據報 9.3.5 主機地址過濾 9.4 IGMP協議和MLD協議 9.4.1 組成員的IGMP和MLD處理 9.4.2 組播路由…

可用于智能客服的完全開源免費商用的知識庫項目

介紹 FastWiki項目是一個高性能、基于最新技術棧的知識庫系統&#xff0c;專為大規模信息檢索和智能搜索設計。利用微軟Semantic Kernel進行深度學習和自然語言處理&#xff0c;結合.NET 8和MasaBlazor前端框架&#xff0c;后臺采用.NET 8MasaFrameworkSemanticKernel&#xff…

嵌入式Linux學習DAY26

管道的作用&#xff1a;進程間的通信 無名管道&#xff1a; 只能在父子進程中進行通信 pipe int pipe(int pipefd[2]); 功能: 創建一個無名管道 參數: pipefd[0]:讀管道文件描述符 pipefd[1]:寫管道文件描述符 …

【InternLM 實戰營筆記】基于 InternLM 和 LangChain 搭建MindSpore知識庫

InternLM 模型部署 準備環境 拷貝環境 /root/share/install_conda_env_internlm_base.sh InternLM激活環境 conda activate InternLM安裝依賴 # 升級pip python -m pip install --upgrade pippip install modelscope1.9.5 pip install transformers4.35.2 pip install str…

【大廠AI課學習筆記NO.53】2.3深度學習開發任務實例(6)數據采集

這個系列寫了53期了&#xff0c;很多朋友收藏&#xff0c;看來還是覺得有用。 后續我會把相關的內容&#xff0c;再次整理&#xff0c;做成一個人工智能專輯。 今天學習到了數據采集的環節。 這里有個問題&#xff0c;數據準備包括什么&#xff0c;還記得嗎&#xff1f; 數…

ZStack Cube超融合入選IDC《中國超融合基礎架構市場評估》報告

近日&#xff0c;IDC發布了《中國超融合基礎架構市場評估&#xff0c;2023》。IDC針對中國超融合基礎架構市場的發展現狀展開了調研&#xff0c;明確了最終用戶構建融合型云平臺的痛點和難點&#xff0c;闡述了市場中各技術服務提供商的服務方案和優勢&#xff0c;并對未來中國…

vue3+ts+vite數據大屏自適應總結(兩種方法)

總結一下我常用的數據大屏自適應方法 目錄 1、通過css縮放方案&#xff1a; 利用transform&#xff1a;scale 進行適配2、采用rem布局&#xff0c; 根據屏幕分辨率大小不同&#xff0c;調整根元素html的font-size&#xff0c; 從而達到每個元素寬高自動變化&#xff0c;適配不…

接口測試實戰--mock測試、日志模塊

一、mock測試 在前后端分離項目中,當后端工程師還沒有完成接口開發的時候,前端開發工程師利用Mock技術,自己用mock技術先調用一個虛擬的接口,模擬接口返回的數據,來完成前端頁面的開發。 接口測試和前端開發有一個共同點,就是都需要用到后端工程師提供的接口。所以,當…

Redis速學

一、介紹Redis 基本概念和特點 Redis是一個開源的內存數據庫&#xff0c;它主要用于數據緩存和持久化。其數據存儲在內存中&#xff0c;這使得它具有非常快的讀寫速度。Redis支持多種數據結構&#xff0c;包括字符串、哈希、列表、集合和有序集合&#xff0c;這使得它非常靈活…

書生·浦語大模型圖文對話Demo搭建

前言 本節我們先來搭建幾個Demo來感受一下書生浦語大模型 InternLM-Chat-7B 智能對話 Demo 我們將使用 InternStudio 中的 A100(1/4) 機器和 InternLM-Chat-7B 模型部署一個智能對話 Demo 環境準備 在 InternStudio 平臺中選擇 A100(1/4) 的配置&#xff0c;如下圖所示鏡像…

微店商品詳情 API 支持哪些商品信息的獲取?

微店&#xff08;Weidian&#xff09;并沒有一個公開的、官方維護的API文檔來供開發者使用。這意味著&#xff0c;如果你想要獲取微店商品詳情或其他相關信息&#xff0c;你通常需要通過微店官方提供的方式來實現&#xff0c;例如使用其開放平臺、官方SDK或聯系微店的技術支持獲…

Spring常見面試題知識點總結(三)

7. Spring MVC&#xff1a; MVC架構的概念。 MVC&#xff08;Model-View-Controller&#xff09;是一種軟件設計模式&#xff0c;旨在將應用程序分為三個主要組成部分&#xff0c;以實現更好的代碼組織、可維護性和可擴展性。每個組件有著不同的職責&#xff0c;相互之間解耦…

11.Prometheus常見PromeQL表達式

平凡也就兩個字: 懶和惰; 成功也就兩個字: 苦和勤; 優秀也就兩個字: 你和我。 跟著我從0學習JAVA、spring全家桶和linux運維等知識&#xff0c;帶你從懵懂少年走向人生巔峰&#xff0c;迎娶白富美&#xff01; 關注微信公眾號【 IT特靠譜 】&#xff0c;每天都會分享技術心得~ …

YOLO算法

YOLO介紹 YOLO&#xff0c;全稱為You Only Look Once: Unified, Real-Time Object Detection&#xff0c;是一種實時目標檢測算法。目標檢測是計算機視覺領域的一個重要任務&#xff0c;它不僅需要識別圖像中的物體類別&#xff0c;還需要確定它們的位置。與分類任務只關注對…

【矩陣】【方向】【素數】3044 出現頻率最高的素數

作者推薦 動態規劃的時間復雜度優化 本文涉及知識點 素數 矩陣 方向 LeetCode 3044 出現頻率最高的素數 給你一個大小為 m x n 、下標從 0 開始的二維矩陣 mat 。在每個單元格&#xff0c;你可以按以下方式生成數字&#xff1a; 最多有 8 條路徑可以選擇&#xff1a;東&am…