Deployment

1、什么是Deployment

Deployment是一个定义及管理多副本应用(即多个副本 Pod)的新一代对象,与Replication Controller相比,它提供了更加完善的功能,使用起来更加简单方便。
其作用简单来讲就是利用一个模板,提供对应数量的Pod
Deployment定义包括以下几个部分:

  • apiVersion:定义资源版本
  • kind:定义资源类型
  • metadata:定义资源的元数据信息
  • spec:定义Pod相关配置信息
  • status:运行后的状态信息(K8S自动生成,不需要手动定义)

2、Deployment示例

以下是一个启动busybox的Deployment示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - args:
        - /bin/sh
        - -c
        - sleep 10; touch /tmp/healthy; sleep 30000
        image: busybox
        imagePullPolicy: Always
        name: busybox
        readinessProbe:
          exec:
            command:
            - cat
            - /tmp/healthy
          failureThreshold: 3
          initialDelaySeconds: 10
          periodSeconds: 5
          successThreshold: 1
          timeoutSeconds: 1

Service

1、什么是Service

在k8s集群中,service是一个抽象概念,它通过一个虚拟的IP映射指定的端口,将代理客户端发来的请求转到后端一组pod中的一个上。
由于pod中的容器经常在不停地销毁和重建,因此pod的IP会不停的改变,这时候客户端就没法访问到pod了,现在有了service作为客户端和pod的中间层,它在这里抽象出一个虚拟IP,然后集群内部都可以通过这个虚拟IP访问到具体的pod。
Service有以下四种类型:

  • ClusterIP
  • NodePort
  • LoadBalancer
  • ExternalName

2、Service示例

apiVersion: v1
kind: Service
metadata:
  labels:
    app: busybox
  name: busybox
  namespace: default
spec:
  ports:
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
  type: ClusterIP

DaemonSet

1、什么是DaemonSet

DaemonSet用于在每个node上运行pod的场景下。

2、DaemonSet示例

apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: ds-demo
  name: ds-demo
spec:
  selector:
    matchLabels:
      app: ds-demo
  template:
    metadata:
      labels:
        app: ds-demo
    spec:
      containers:
        - name: ds-demo
          image: nginx:1.23.2
          ports:
          - name: mysql-port
            containerPort: 80

StatefulSet

1、什么是StatefulSet

Pod根据是否有数据存储分为有状态和无状态:
无状态:指的Pod运行期间不会产生重要数据,即使有数据产生,这些数据丢失了也不影响整个应用。比如Nginx、Tomcat等应用适合无状态。
有状态:指的是Pod运行期间会产生重要的数据,这些数据必须要做持久化,比如MySQL、Redis、RabbitMQ等。
Deployment和Daemonset用于无状态服务,StatefulSet用于有状态服务。
对于Sts的Pod,有如下特点:

  • Pod名固定有序,后缀从0开始,按顺序启动或停止,名称格式以redis为例:redis-0、redis-1、redis-2
  • 由于Pod名固定且可预测,域名信息也是固定且可预测的
  • 每个Pod对应的PVC也是固定的,即Pod重启或重建后还能挂载上原来的数据卷

2、StatefulSet示例

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: redis-svc ##这里要有一个serviceName,Sts必须和service关联
  replicas: 2
  selector:
    matchLabels:
      app: redis-sts
  template:
    metadata:
      labels:
        app: redis-sts
    spec:
      containers:
      - image: redis:6.2
        name: redis
        ports:
        - containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
  name: redis-svc
spec:
  selector:
    app: redis-sts
  ports:
  - port: 6379
    protocol: TCP
    targetPort: 6379
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐