又到开学季

9月心声

首先非常感谢关注公众号的朋友,最近关注的朋友慢慢变多了,后台朋友的私信我都看见了,需要领取资料的可以后台留言,如果没有及时回复消息,可以添加我的微信。欢迎大家技术交流。

8月已过去,原打算是主要分享前端相关知识,但是实际发现,因为上班业余时间不多,没有整块的时间去研究然后做很好的分享。但是又不能断更,我担心新关注的朋友以为我三天打鱼两天晒网。所以我基本上是每天有什么能分享就不断分享,后期分享到一定量了,我再根据分类进行分享,所以关注我的朋友,可以将想了解的后台私信,我都会看并回复的。

近日见闻

  1. 微软发布了 Visual Studio for Mac 停用的公告。 具体政策是,自2024年8月31日起,Visual Studio for Mac 将不会再获得任何支持。届时,Visual Studio for Mac 将只能通过 my.visualstudio.com,为已订阅 Visual Studio 的用户提供旧版安装,但不再提供服务或维护。

  2. Notary Project 维护人员自豪地宣布了一项重大发布,包括Notary Project 规范 v1.0.0[1]、notation v1.0.0[2]、notation-go v1.0.0[3] 和notation-core-go v1.0.0[4],已经可以用于生产环境!Notary Project 是一套旨在通过签名和验证、签名可移植性以及密钥/证书管理,为软件供应链提供跨行业标准的规范和工具。Notation 是 Notary Project 的一个子项目,包括 notation CLI 和两个实现最新Notary Project 规范[5]的 Golang 库。Notation 项目始于2019 年 12 月[6],经过几年的小版本和 RC 版本的发布,代码已经成熟;CLI 和库的第一个版本 v0.7.0-alpha.1[7] 在 2021 年 10 月发布。经过几个 alpha、beta 和 RC 版本的发布,二进制文件最终在 2023 年 5 月发布了最终版本 v1.0.0-RC.7[8]。

  3. Rust版本的sudo出道了!互联网安全研究小组(ISRG)的Prossimo项目最近宣布了sudo-rs的第一个稳定版本。没错就是那个“sudo rm -rf”中的sudo命令。

k8s中的daemonset、statfulset、以及deployment有什么区别

当使用 Kubernetes (K8s) 时,了解 DaemonSet、StatefulSet 和 Deployment 的详细特点和用途是很重要的。

DaemonSet (守护进程集)

DaemonSet 用于确保在集群的每个节点上都运行一个或多个副本的 Pod 实例。这意味着每个节点上都会有一个相同的 Pod 运行,无论集群中有多少个节点,DaemonSet 都会维护所需的 Pod 副本数量。

用途:

DaemonSet 通常用于部署系统级别的服务或守护进程,这些服务需要在每个节点上都有一个实例。例如,日志收集代理、监控代理、网络代理等。适用于需要在每个节点上运行的任务,以确保集群中的每个节点都具有特定的功能或服务。

特点:

当节点添加或删除时,DaemonSet 会自动调整 Pod 的数量,以确保在每个节点上都有一个实例运行。

Pod 的调度是基于节点的标签选择器来进行的,可以选择在特定类型的节点上运行 DaemonSet。 通常不支持有状态的应用,因为每个节点上的 Pod 实例都是相同的,没有唯一标识符。 StatefulSet (有状态集)

StatefulSet 用于管理有状态应用程序的部署,这些应用程序通常需要持久性存储和稳定的网络标识符。每个 StatefulSet 创建的 Pod 都有唯一的标识符,可以稳定地在节点之间迁移。

用途:

StatefulSet 适用于需要持久性存储和有序部署的应用程序,如数据库、消息队列、分布式存储等。

每个 Pod 都有一个唯一的标识符,通常通过名称来表示,这对于有状态应用程序非常重要。

StatefulSet 还支持有序的 Pod 启动和终止,确保应用在升级或扩展时的稳定性。

特点:

每个 Pod 都有一个稳定的网络标识符,通常以有序的方式命名,例如,pod-0, pod-1,这有助于维护有状态应用程序的稳定性。

StatefulSet 支持持久性存储卷的声明,以确保数据的持久性。

稳定的网络标识符和有序的启动/停止使得 StatefulSet 适用于需要节点间通信或数据复制的应用程序。

Deployment (部署)

Deployment 用于部署无状态应用程序,它负责在滚动升级、回滚和扩展应用时维护所需的 Pod 副本数量。

用途:

Deployment 适用于无状态的应用程序,如 web 服务器、API 服务、微服务等,这些应用程序不需要持久性存储或有状态的标识符。 通常,Deployment 使用 ReplicaSet 来管理 Pod 副本,以确保应用程序的高可用性和扩展性。

特点:

Deployment 允许您轻松进行滚动升级和回滚,以确保应用程序的连续可用性。 您可以定义所需的 Pod 副本数量,Deployment 会自动维护这个数量,可以根据需要扩展或收缩。 通常不支持有状态应用,因为 Pod 可能会在集群中的不同节点之间重新调度,没有稳定的标识符。 总的来说,DaemonSet 用于确保在每个节点上运行相同的 Pod,StatefulSet 用于有状态应用程序的管理,Deployment 用于无状态应用程序的管理。选择正确的资源控制器取决于您的应用的性质和需求。

DaemonSet 详细示例 YAML:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: my-daemonset
spec:
  selector:
    matchLabels:
      app: my-daemon-app
  template:
    metadata:
      labels:
        app: my-daemon-app
    spec:
      containers:
      - name: my-container
        image: my-image:latest
        ports:
        - containerPort: 80
      nodeSelector:
        disk: ssd
  • 这个示例创建了一个名为 my-daemonset 的 DaemonSet,确保在每个节点上都运行一个 Pod 实例。
  • Pod 使用了一个名为 my-container 的容器,该容器基于镜像 my-image:latest 运行,并打开了端口 80。
  • 通过 nodeSelector 字段,我们指定了一个节点标签选择器 disk: ssd,只有带有 disk=ssd 标签的节点才会运行这个 DaemonSet。

StatefulSet 详细示例 YAML:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-statefulset
spec:
  serviceName: "my-stateful-service"
  replicas: 3
  selector:
    matchLabels:
      app: my-stateful-app
  template:
    metadata:
      labels:
        app: my-stateful-app
    spec:
      containers:
      - name: my-container
        image: my-image:latest
        ports:
        - containerPort: 8080
      volumeClaimTemplates:
      - metadata:
          name: data
        spec:
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 10Gi
  • 这个示例创建了一个名为 my-statefulset 的 StatefulSet,它会创建 3 个有状态的 Pod。
  • 每个 Pod 使用了一个名为 my-container 的容器,该容器基于镜像 my-image:latest 运行,并打开了端口 8080。
  • StatefulSet 使用了 volumeClaimTemplates 字段,为每个 Pod 创建一个持久性存储卷,大小为 10Gi,访问模式为 ReadWriteOnce。

Deployment 详细示例 YAML:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: my-image:latest
        ports:
        - containerPort: 8080
      readinessProbe:
        httpGet:
          path: /health
          port: 8080
        initialDelaySeconds: 5
        periodSeconds: 10
  • 这个示例创建了一个名为 my-deployment 的 Deployment,它会创建 2 个无状态的 Pod。
  • 每个 Pod 使用了一个名为 my-container 的容器,该容器基于镜像 my-image:latest 运行,并打开了端口 8080。
  • Deployment 使用了 readinessProbe 字段,定期检查 Pod 的健康状态,确保它们可以正常处理请求。在这个示例中,健康检查路径是 /health,端口是 8080,初始延迟为 5 秒,每 10 秒检查一次。

掌握这些理论知识,再去测试环境实践,相信一定会收获更多。