Deployment也是控制器,它构建在 ReplicaSet控制器之上。后期我们只需要描述 Deployment资源清单,Deployment控制器就会按照我们所描述的资源清单进⾏ 资源的创建,并尽可能的向⽤户所期望的状态逼近。 也就是说,后期我们部署容器应⽤不直接使⽤Pod和ReplicaSet,⽽是使⽤ Deployment控制器来调⽤ReplicaSet来实现,Deployment控制器在ReplicaSet 原有基础上,添加了部分特性。

1、事件和状态查看:允许⽤户通过特定的命令查看Deployment对象的更新 进度和状态。

2、版本记录:将Deployment对象的更新操作都进⾏了保存,以便后续执⾏ 回滚操作使⽤;


创建ng-deploy.yaml的deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myng
  name: ng-deploy
spec:
  replicas: 2 ##副本数
  selector:
    matchLabels:
      app: myng
  template:
    metadata:
      labels:
        app: myng
    spec:
      containers:
        - name: myng
          image: nginx:1.23.2
          ports:
          - name: myng-port
            containerPort: 80

执行命令创建deployment: kubectl apply -f ng-deployment.yaml;

服务的暴露:vi ng-svc.yaml:

apiVersion: v1
kind: Service
metadata:
  name: ngx-svc
spec:
  selector:
    app: myng
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

执行命令创建svc: kubectl apply -f ng-svc.yaml;

Daemonset:有些场景需要在每一个node上运行Pod(比如,网络插件calico、监控、日志收集),Deployment无法做到,而Daemonset(简称ds)可以。Deamonset的目标是,在集群的每一个节点上运行且只运行一个Pod。

Daemonset不支持使用kubectl create获取YAML模板,所以只能照葫芦画瓢了,参考Deployment的YAML编写,其实Daemonset和Deployment的差异很小,除了Kind不一样,还需要去掉replica配置。

vi  dmset.yaml   如:

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

创建damonset: kubectl apply -f ds-demo.yaml

API资源对象Statefulset:

Pod的有状态和无状态:

    无状态:指的Pod运行期间不会产生重要数据,即使有数据产生,这些数据丢失了也不影响整个应用。比如Nginx、Tomcat等应用属于无状态。

    有状态:指的是Pod运行期间会产生重要的数据,这些数据必须要做持久化,比如MySQL、Redis、RabbitMQ等。

Deployment和Daemonset适合做无状态,而有状态也有一个对应的资源,那就是Statefulset(简称sts)。

vim redis-sts.yaml ,需要提前准备好pvc:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-sts

spec:
  serviceName: redis-svc ##这里要有一个serviceName,Sts必须和service关联
  volumeClaimTemplates:
  - metadata:
      name: redis-pvc
    spec:
      storageClassName: nfs-client
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 500Mi

  replicas: 2
  selector:
    matchLabels:
      app: redis-sts

  template:
    metadata:
      labels:
        app: redis-sts
    spec:
      containers:
      - image: redis:6.2
        name: redis
        ports:
        - containerPort: 6379

        volumeMounts:
        - name: redis-pvc
          mountPath: /data

创建关联的service:  vim redis-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: redis-svc

spec:
  selector:
    app: redis-sts

  ports:
  - port: 6379
    protocol: TCP
    targetPort: 6379

分别kubectl apply -f redis-sts.yaml && kubectl apply -f redis-service.yaml