【云原生之k8s】k8s控制器


在这里插入图片描述

引言

控制器:又称之为工作负载,分别包含以下类型控制器

  1. Deployment(无状态)
  2. StatefulSet(有状态)
  3. DaemonSet(只要)
  4. Job
  5. CronJob

Pod与控制器之间的关系

  1. controllers:在集群上管理和运行容器的对象通过label-selector相关联
  2. Pod通过控制器实现应用的运维,如伸缩,升级等
    在这里插入图片描述

1、Deployment(无状态)

  1. 部署无状态应用
  2. 管理Pod和ReplicaSet
  3. 具有上线部署、副本设定、滚动升级、回滚等功能
  4. 提供声明式更新,例如只更新一个新的Image
  5. 应用场景:web服务
[root@master ~]# vim nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80

在这里插入图片描述

kubectl create -f nginx-deployment.yaml
kubectl get pods,deploy,rs

在这里插入图片描述

查看控制器

kubectl edit deployment/nginx-deployment

在这里插入图片描述

查看历史版本

kubectl rollout history deployment/nginx-deployment

在这里插入图片描述

2、SatefulSet(有状态)

  1. 部署有状态应用
  2. 解决Pod独立生命周期,保持Pod启动顺序和唯一性
  3. 稳定,唯一的网络标识符,持久存储(例如:etcd配置文件,节点地址发生变化,将无法使用)
  4. 有序,优雅的部署和扩展、删除和终止(例如:mysql主从关系,先启动主,再启动从)
  5. 有序,滚动更新
  6. 应用场景:数据库

2.1 有状态与无状态的区别

无状态

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

有状态

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

2.2 常规service和无头服务区别

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

2.2.1 Service类型

  1. Cluster_IP
  2. NodePort:使用Pod所在节点的IP和其端口范围
  3. Headless
  4. HostPort(ingress、kubesphere)
  5. LoadBalance负载均衡(F5硬件负载均衡器)

ps:k8s暴露方式主要就3种:ingress loadbalance(SLB/ALB K8S集群外的负载均衡器、Ng、harproxy、KONG、traefik等等) service

vim nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
[root@master ~]# kubectl create -f nginx-service.yaml 
service/nginx-svc created
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        5d7h
nginx-svc    NodePort    10.105.83.81   <none>        80:30676/TCP   2s

在这里插入图片描述
在node节点操作,查看集群间通讯
在这里插入图片描述

2.2.2 headless方式

因为Pod动态IP地址,所以常用于绑定DNS访问—来尽可能固定Pod的位置

[root@master demo]# vim headless.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx

在这里插入图片描述

kubectl apply -f headless.yaml
kubectl get svc

在这里插入图片描述
再定义一个pod

[root@master demo]# vim dns-test.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

在这里插入图片描述

验证dns解析

kubectl create -f dns-test.yaml
kubectl get svc

在这里插入图片描述
解析kubernetes和nginx-svc名称

kubectl exec -it dns-test sh

在这里插入图片描述
创建StatefulSet.yaml文件

vim statefulSet.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 statefulSet.yaml
kubectl get pods,svc

在这里插入图片描述
解析pod的唯一域名和自身的ip

kubectl apply -f dns-test.yaml

kubectl exec -it dns-test sh

nslookup nginx-statefulset-0.nginx
nslookup nginx-statefulset-1.nginx
nslookup nginx-statefulset-2.nginx

在这里插入图片描述
总结
StatefulSet与Deployment区别:有身份的!
身份三要素:

  1. 域名 nginx-statefulset-0.nginx
  2. 主机名 nginx-statefulset-0
  3. 存储(PVC)

3、DaemonSet(守护进程集)

  1. 在每一个Node上运行一个Pod
  2. 新加入的Node也同样会自动运行一个Pod
  3. 应用场景:Agent
[root@master demo]# vim daemonSet.yaml

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

在这里插入图片描述
DaemonSet会在每个node节点都创建一个Pod

kubectl apply -f daemonSet.yaml
kubectl get pods

在这里插入图片描述

4、Job

  1. Job分为普通任务(Job)和定时任务(CronJob)
  2. 一次性执行
  3. 应用场景:离线数据处理,视频解码等业务

示例
重试次数默认是6次,修改为4次,当遇到异常时Never状态会重启,所以要设定次数。

[root@master demo]# vim job.yaml 

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

在这里插入图片描述

在node1节点下载perl镜像,因为镜像比较大所以提前下载好

docker pull perl

在这里插入图片描述
在这里插入图片描述

创建
在这里插入图片描述
查看到完成状态
在这里插入图片描述

结果输出到控制台
在这里插入图片描述
清除job资源

kubectl get job
kubectl delete -f job.yaml

在这里插入图片描述

5、CronJob

  1. 周期性任务,像Linux的Crontab一样。
  2. 周期性任务
  3. 应用场景:通知,备份

示例

[root@master demo]# vim cronjob.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: lcdb
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: lcdb
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo lcdb from the Kubernetes cluster
          restartPolicy: OnFailure

在这里插入图片描述

kubectl apply -f cronjob.yaml

在这里插入图片描述

kubectl get pod
kubectl get cronjob

在这里插入图片描述
清除cronjob资源

kubectl delete -f cronjob.yaml

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45088125/article/details/126139671