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.mzph.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…

《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…

【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; 数…

接口测试实战--mock测试、日志模块

一、mock测试 在前后端分离项目中,当后端工程师还没有完成接口开发的时候,前端开发工程师利用Mock技术,自己用mock技术先调用一个虚拟的接口,模拟接口返回的数据,来完成前端页面的开发。 接口测试和前端开发有一个共同点,就是都需要用到后端工程师提供的接口。所以,当…

书生·浦语大模型图文对话Demo搭建

前言 本节我们先来搭建几个Demo来感受一下书生浦语大模型 InternLM-Chat-7B 智能对话 Demo 我们将使用 InternStudio 中的 A100(1/4) 机器和 InternLM-Chat-7B 模型部署一个智能对话 Demo 环境准备 在 InternStudio 平台中选择 A100(1/4) 的配置&#xff0c;如下图所示镜像…

Spring常见面试题知识点总结(三)

7. Spring MVC&#xff1a; MVC架构的概念。 MVC&#xff08;Model-View-Controller&#xff09;是一种软件设计模式&#xff0c;旨在将应用程序分为三个主要组成部分&#xff0c;以实现更好的代码组织、可维护性和可扩展性。每个组件有着不同的职责&#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…

安装 Ubuntu 22.04.3 和 docker

文章目录 一、安装 Ubuntu 22.04.31. 简介2. 下载地址3. 系统安装4. 系统配置 二、安装 Docker1. 安装 docker2. 安装 docker compose3. 配置 docker 一、安装 Ubuntu 22.04.3 1. 简介 Ubuntu 22.04.3 是Linux操作系统的一个版本。LTS 版本支持周期到2032年。 系统要求双核 C…

代码随想录 二叉树第二周

目录 101.对称二叉树 100.相同的树 572.另一棵树的子树 104.二叉树的最大深度 559.N叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数 110.平衡二叉树 257.二叉树的所有路径 101.对称二叉树 101. 对称二叉树 已解答 简单 相关标签 相关企业 给你一…

《求生之路2》服务器如何选择合适的内存和CPU核心数,以避免丢包和延迟高?

根据求生之路2服务器的实际案例分析选择合适的内存和CPU核心数以避免丢包和延迟高的问题&#xff0c;首先需要考虑游戏的类型和对服务器配置的具体要求。《求生之路2》作为一款多人在线射击游戏&#xff0c;其服务器和网络优化对于玩家体验至关重要。 首先&#xff0c;考虑到游…

Java应用程序注册成Linux系统服务后,关闭Java应用程序打印系统日志

Java应用程序有自己的日志框架&#xff0c;有指定位置的日志文件&#xff0c;不需要在系统日志里记录&#xff0c;占用磁盘空间。 1.Linux系统文件目录 /etc/systemd/system/ 找到要修改的Java应用程序服务配置 比如bis-wz-80.service 2.设置不打印日志 StandardOutputnull S…

centos7 搭建 harbor 私有仓库

一、下载安装 1.1、harbor 可以直接从 github 上下载&#xff1a;Releases goharbor/harbor GitHub 这里选择 v2.10.0 的版本 wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz 1.2、解压 tar zxvf harbor-offlin…

L2 网络 Mint Blockchain 正式对外发布测试网

Mint Blockchain 是由 NFTScan Labs 发起的聚焦在 NFT 生态的 L2 网络&#xff0c;致力于促进 NFT 资产协议标准的创新和 NFT 在现实商业应用场景中的大规模采用。 Mint Blockchain 于 2024 年 2 月 28 号正式对外发布测试网&#xff0c;开始全面进入生态开发者测试开发阶段。 …

Springboot项目集成短信验证码(超简单)

操作流程 注册验证码平台创建验证码模版开始集成&#xff08;无需引入第三方库&#xff09; 注册并登陆中昱维信验证码平台 获取AppID和AppKey。 创建验证码模版 创建验证码模版&#xff0c;获取验证码模版id 开始集成 创建controller import org.springframework.web.bi…