k8s中的Controller

什么是controller

在集群上管理和运行容器的对象

Pod和Controller的关系

Pod通过Controller实现应用的运维,比如伸缩、滚动升级等等。
Pod和Controller之间通过label标签建立关系。
控制器又叫工作负载。

在这里插入图片描述

Deployment

应用场景

  • 部署无状态应用
  • 管理Pod和ReplicaSet
  • 部署、滚动升级等功能
  • web服务、微服务

使用deployment部署应用

# 导入yaml文件
kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
# 使用yaml部署应用
kubectl apply -f web.yaml
# 对外发布(暴露对外端口号)
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml
kubectl apply -f web1.yaml
kubectl get pods,svc
# 使用任意节点IP+分配的端口即可访问Pod

应用升级回滚和弹性伸缩

# 应用升级
kubectl set image deployment web nginx=nginx:1.15
# 查看升级状态
kubectl rollout status deployment web
# 查看历史版本
kubectl rollout history deployment web
# 回退到上一个版本
kubectl rollout undo deployment web
# 回滚到指定版本
kubectl rollout undo deployment web --to-reversion=2

# 弹性伸缩
kubectl scale deployment web --replicas=10

StatefulSet

有状态和无状态

无状态:

  • 认为Pod都是相同的
  • 没有顺序要求
  • 不用考虑在哪个node上运行
  • 随即进行伸缩和扩展

有状态:

  • 上面因素都需要考虑到
  • 让每个Pod都是独立的,保持Pod的启动顺序和唯一性

部署有状态应用

无头service:ClusterIP值为None

使用StatefulSet部署有状态应用

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels: 
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: nginx-statefulset
  namespace: default
spec:
  serviceName: nginx
  replicas: 3
  selector: 
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
kubectl apply -f sts.yaml
kubectl get pods

可以看到有三个Pod,每个都有唯一名称

kubectl get svc

查看创建的无头service

deployment和statefulset区别在于statefulset中Pod有唯一标识
唯一域名格式:主机名称.service名称.名称空间.svc.cluster.local

DaemonSet

部署守护进程,确保所有node运行同一个应用

apiVersion: apps/v1
kind: DaemonSet
metadata: 
  name: ds-test
  labels:
    app: filebeat
spec:
  selector:
    matchLabels:
      app: filebeat
  template:
    metadata: 
     labels:
       app: filebeat
   spec:
     containers:
     - name: logs
       images: nginx
       ports:
       - containerPort: 80
       volumeMounts:
       - name: varlog
         mountPath: /tmp/log
     volumes:
     - name: varlog
       hostpath:
         path: /var/log
kubectl apply -f ds.yaml
kubectl get pods
kubectl exec -it ds-test-cbk6v bash
ls /tmp/log

一次性任务Job和定时任务Cronjob

一次性任务

apiVersion: batch/v1
kind: Job
metadata: 
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl","-Mbignum=bpi","-wle","print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4
kubectl create -f job.yaml
kubectl get jobs
kubectl get pods

可以看到pi已经完成计算,STATUS显示Completed。

kubectl delete -f job.yaml

定时任务cronjob

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate: 
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args: 
            - /bin/sh
            - -c
            - data; echo Hello from the Kubernetes Cluster
          restartPolicy: OnFailure
kubectl apply -f cronjob.yaml
kubectl get pods

可以看出每隔一段时间执行任务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值