K8S之控制器理论+实战

文章目录

    • Controller介绍
    • Controller介绍与操作实例
      • Deployment介绍
      • Deployment操作实例
      • StatefulSet介绍
      • Stateful操作实例
      • DaemonSet介绍
      • DaemonSet操作实例
      • Job介绍
      • Job操作示例
      • CronJob介绍
      • CronJob操作实例

Controller介绍

  • 控制器:又称之为工作负载,分别包含以下类型控制器
    1:Deployment
    2:StatefulSet
    3:DaemonSet
    4:Job
    5:CronJob
  • Pod与控制器之间的关系
    控制器在集群上管理和运行容器的对象通过label-selector相关联
    Pod通过控制器实现应用的运维,如伸缩,升级等
    K8S之控制器理论+实战_第1张图片

Controller介绍与操作实例

Deployment介绍

  • 部署无状态应用
  • 管理Pod和ReplicaSet
  • 具有上线部署、副本设定、滚动升级、回滚等功能
  • 提供声明式更新,例如只更新一个新的Image

Deployment操作实例

  • 应用场景:web服务
#yaml文件之前博客有
kubectl create -f nginx-deployment.yaml
#Replicaset 是控制版本,副本数,回滚就是通过此来实现
kubectl get pods,deploy,rs

K8S之控制器理论+实战_第2张图片

  • 查看控制器
kubectl edit deployment/nginx-deployment

K8S之控制器理论+实战_第3张图片

  • 查看历史版本
kubectl rollout history deployment/nginx-deployment

在这里插入图片描述

StatefulSet介绍

  • 部署有状态应用

  • 解决Pod独立生命周期,保持Pod启动顺序和唯一性

  • 稳定,唯一的网络标识符,持久存储(例如:etcd配置文件,节点地址发生变化,将无法使用)

  • 有序,优雅的部署和扩展、删除和终止(例如:mysql主从关系,先启动主,再启动从)

  • 有序,滚动更新

  • 应用场景:数据库

  • 无状态:
    1)deployment 认为所有的pod都是一样的
    2)不用考虑顺序的要求
    3)不用考虑在哪个node节点上运行
    4)可以随意扩容和缩容

  • 有状态
    1)实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper
    2)实例之间不对等的关系,以及依靠外部存储的应用。

  • 常规service和无头服务区别
    1) service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
    2)Headless service 无头服务,不需要cluster-IP,直接绑定具体的Pod的IP

Stateful操作实例

  • Service
 #yaml文件之前博客有
 kubectl create -f nginx-service.yaml
 kubectl get svc

在这里插入图片描述

#在node节点上操作
systemctl restart flanneld.service 
systemctl restart docker
#查看群集间通讯
curl 10.0.0.204

在这里插入图片描述
K8S之控制器理论+实战_第4张图片
K8S之控制器理论+实战_第5张图片

  • Headless(因为Pod动态IP地址,所以常用于绑定DNS访问)
vim headless.yaml
kubectl create -f headless.yaml
kubectl get svc
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None #无群集内部通信地址
  selector:
    app: nginx

在这里插入图片描述

#复制coredns.yaml到master01的root家目录(Github下载)
kubectl create -f coredns.yaml
kubectl get pods -n kube-system

K8S之控制器理论+实战_第6张图片

cd demo/
vim pod3.yaml
#验证dns解析
kubectl create -f pod3.yaml
apiVersion: v1
kind: Pod
metadata:
  name: dns-test
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    args:
    - /bin/sh
    - -c
    - sleep 36000
  restartPolicy: Never

K8S之控制器理论+实战_第7张图片

#进入pod资源
kubectl exec -it dns-test sh

K8S之控制器理论+实战_第8张图片

#创建完整资源,验证headless
vim sts.yaml
kubectl apply -f sts.yaml 
 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 
#清理所有pod
kubectl delete -f .
kubectl create -f sts.yaml 
kubectl get pods

K8S之控制器理论+实战_第9张图片

kubectl apply -f pod3.yaml
kubectl exec -it dns-test sh
#查看是否已经绑定到PodIP,ClusterIP实际上是负载均衡
nslookup nginx-statefulset-0.nginx
nslookup nginx-statefulset-1.nginx
nslookup nginx-statefulset-2.nginx

K8S之控制器理论+实战_第10张图片
K8S之控制器理论+实战_第11张图片

  • 总结
    StatefulSet与Deployment区别:有身份的。
    身份三要素:
    域名 nginx-statefulset-0.nginx
    主机名 nginx-statefulset-0
    存储(PVC)

DaemonSet介绍

  • 在每一个Node上运行一个Pod(每个node上最多只能运行一个副本)
  • 新加入的Node也同样会自动运行一个Pod
  • 应用场景:存储Daemon:Ceph、glusterd;日志收集Daemon:fluentd、logstash;监控Daemon:Prometheus Node Exporter、colletcd。

DaemonSet操作实例

vim ds.yaml
kubectl apply -f ds.yaml
kubectl get pods -o wide
apiVersion: apps/v1
kind: DaemonSet 
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80

K8S之控制器理论+实战_第12张图片

Job介绍

  • 容器按照持续运行时间可分为两类:服务类容器和工作类容器。
  • 工作类容器就有Job
  • Job分为普通任务(Job)和定时任务(CronJob)
  • 一次性执行
  • 应用场景:离线数据处理,视频解码等业务

Job操作示例

#示例中,重试次数默认是6次,修改为4次,当遇到异常时Never状态会重启,所以要设定次数。
#计算圆周率
vim job.yaml
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
#在node节点上拉取perl镜像
docker pull perl

K8S之控制器理论+实战_第13张图片

kubectl apply -f job.yaml 
kubectl get pods
#在日志中查看结果
kubectl logs pi-6wtpp

K8S之控制器理论+实战_第14张图片
K8S之控制器理论+实战_第15张图片

CronJob介绍

  • CronJob也称定时Job周期性任务,像Linux的Crontab一样。
  • 应用场景:通知、备份。

CronJob操作实例

  • 创建一个定时任务没过1min创建一个pod,并输出Hello from the Kubernetes cluster
vim cronjob.yaml
kubectl apply -f cronjob.yaml
kubectl get pods
kubectl logs hello-1590859620-l89h8
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

K8S之控制器理论+实战_第16张图片
K8S之控制器理论+实战_第17张图片

你可能感兴趣的:(K8S)