9、Kubernetes控制器Controller详解

一、Statefulset(有状态应用)

Statefulset主要是用来部署有状态应用

对于StatefulSet中的Pod,每个Pod挂载自己独立的存储,如果一个Pod出现故障,从其他节点启动一个同样名字的Pod,要挂载上原来Pod的存储继续以它的状态提供服务。

1.1 无状态应用

原来使用 deployment,部署的都是无状态的应用,那什么是无状态应用?

  • 认为Pod都是一样的
  • 没有顺序要求
  • 不考虑应用在哪个node上运行
  • 能够进行随意伸缩和扩展

1.2 有状态应用

上述的因素都需要考虑到

  • 让每个Pod独立的
  • 让每个Pod独立的,保持Pod启动顺序和唯一性
  • 唯一的网络标识符,持久存储
  • 有序,比如mysql中的主从

适合StatefulSet的业务包括数据库服务MySQL 和 PostgreSQL,集群化管理服务Zookeeper、etcd等有状态服务

StatefulSet的另一种典型应用场景是作为一种比普通容器更稳定可靠的模拟虚拟机的机制。传统的虚拟机正是一种有状态的宠物,运维人员需要不断地维护它,容器刚开始流行时,我们用容器来模拟虚拟机使用,所有状态都保存在容器里,而这已被证明是非常不安全、不可靠的。

使用StatefulSet,Pod仍然可以通过漂移到不同节点提供高可用,而存储也可以通过外挂的存储来提供 高可靠性,StatefulSet做的只是将确定的Pod与确定的存储关联起来保证状态的连续性。


1.3 部署有状态应用

无头service, ClusterIp:none

这里就需要使用 StatefulSet 部署有状态应用

[root@k8s-master ~]$ cat > sts.yaml << EOF
apiVersion: v1  #无状态service
kind: Service
metadata:
 name: nginx
 labels:
  app: nginx
spec:
 ports:
 - port: 80
   name: web
 clusterIP: None  #ip为none
 selector:
   app: nginx

---

apiVersion: apps/v1
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

EOF

执行这个yaml文件

[root@k8s-master ~]$ kubectl apply -f sts.yaml
service/nginx created
statefulset.apps/nginx-statefulset created

然后通过查看pod,能否发现每个pod都有唯一的名称

[root@k8s-master ~]$ kubectl get pods
NAME                  READY   STATUS    RESTARTS   AGE
nginx-statefulset-0   1/1     Running   0          118s
nginx-statefulset-1   1/1     Running   0          113s
nginx-statefulset-2   1/1     Running   0          110s

然后我们在查看service,发现是无头的service

[root@k8s-master ~]$ kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        24h
nginx        ClusterIP   None           <none>        80/TCP         114m
web          NodePort    10.99.52.163   <none>        80:32180/TCP   16

这里有状态的约定,肯定不是简简单单通过名称来进行约定,而是更加复杂的操作

  • deployment: 是有身份的,有唯一标识
  • statefulset: 根据主机名 + 按照一定规则生成域名

每个pod有唯一的主机名,并且有唯一的域名

格式: 主机名称.service名称.名称空间.svc.cluster.local
举例: nginx-statefulset-0.default.svc.cluster.local


二、DaemonSet(守护进程)

DaemonSet 即后台支撑型服务,主要是用来部署守护进程。所有node部署到同一个pod中

长期伺服型和批处理型的核心在业务应用,可能有些节点运行多个同类业务的Pod,有些节点上又没有这类的Pod运行;而后台支撑型服务的核心关注点在K8S集群中的节点(物理机或虚拟机),要保证每个节点上都有一个此类Pod运行。节点可能是所有集群节点,也可能是通过 nodeSelector选定的一些特定节点。典型的后台支撑型服务包括:存储、日志和监控等。在每个节点上支撑K8S集群运行的服务。

守护进程在我们每个节点上,运行的是同一个pod,新加入的节点也同样运行在同一个pod里面

例子: 在每个node节点安装数据采集工具

[root@k8s-master ~]$ kubectl delete statefulset --all
[root@k8s-master ~]$ kubectl delete svc nginx

[root@k8s-master ~]$ cat > ds.yaml << EOF
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
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: varlog
          mountPath: /tmp/log
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
EOF



[root@k8s-master ~]$ kubectl apply -f ds.yaml
daemonset.apps/ds-test created

[root@k8s-master ~]$ kubectl get pods
NAME            READY   STATUS    RESTARTS   AGE
ds-test-ljb52   1/1     Running   0          43s

进入某个 Pod里面

[root@k8s-master ~]$ kubectl exec -it ds-test-ljb52 bash

#查看采集的日志
root@ds-test-ljb52:/$ ls /tmp/log

三Job和CronJob(定时任务)

一次性任务 和 定时任务

  • 一次性任务(job): 一次性执行完就结束
  • 定时任务(cronjob): 周期性执行

Job是K8S中用来控制批处理型任务的API对象。批处理业务与长期伺服业务的主要区别就是批处理业务的运行有头有尾,而长期伺服业务在用户不停止的情况下永远运行。Job管理的Pod根据用户的设置把任务成功完成就自动退出了。成功完成的标志根据不同的 spec.completions 策略而不同:单Pod型任务有一个Pod成功就标志完成;定数成功行任务保证有N个任务全部成功;工作队列性任务根据应用确定的全局成功而标志成功。

3.1 Job

Job也即一次性任务

[root@k8s-master ~]$ cat > job.yaml << EOF
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  #失败尝试次数
EOF

[root@k8s-master ~]$ kubectl create -f job.yaml

[root@k8s-master ~]$ kubectl get jobs
NAME   COMPLETIONS   DURATION   AGE
pi     1/1           4m6s       7m31s

通过查看日志,查看到一次性任务的结果

[root@k8s-master ~]$ kubectl logs pi-qpqff
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956

[root@k8s-master ~]$ kubectl get pods
NAME            READY   STATUS      RESTARTS   AGE
ds-test-ljb52   1/1     Running     0          20m
#计算完成,一次性任务
pi-lg88j        0/1     Completed   0          8m7s

#删除
[root@k8s-master ~]$ kubectl delete -f job.yaml

3.2 CronJob

[root@k8s-master ~]$ cat > cronjob.yaml << EOF
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
EOF

[root@k8s-master ~]$ kubectl apply -f cronjob.yaml

创建完成后,我们就可以通过下面命令查看定时任务

[root@k8s-master ~]$ kubectl get cronjobs
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        <none>          21s

可以通过日志进行查看

[root@k8s-master ~]$ kubectl logs hello-1599100140-wkn79

然后每次执行,就会多出一个 pod

[root@k8s-master ~]$ kubectl get pods

四、删除svc 和 statefulset

使用下面命令,可以删除我们添加的svc 和 statefulset

[root@k8s-master ~]$ kubectl delete svc web

[root@k8s-master ~]$ kubectl delete statefulset --all

五、Replication Controller

Replication Controller 简称 RC,是K8S中的复制控制器。RC是K8S集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。指定的数目可以是多个也可以是1个;少于指定数目,RC就会启动新的Pod副本;多于指定数目,RC就会杀死多余的Pod副本。

即使在指定数目为1的情况下,通过RC运行Pod也比直接运行Pod更明智,因为RC也可以发挥它高可用的能力,保证永远有一个Pod在运行。RC是K8S中较早期的技术概念,只适用于长期伺服型的业务类型,比如控制Pod提供高可用的Web服务。

5.1 Replica Set

Replica Set 检查 RS,也就是副本集。RS是新一代的RC,提供同样高可用能力,区别主要在于RS后来居上,能够支持更多种类的匹配模式。副本集对象一般不单独使用,而是作为Deployment的理想状态参数来使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值