又到开学季,准备好出发了吗?

2023-10-30 19:07:53 浏览数 (1)

## 近日见闻

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:

代码语言:javascript复制
```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:

代码语言:javascript复制
```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:

代码语言:javascript复制
```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 秒检查一次。

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

0 人点赞