k8s之pod管理详解

一.控制器

1.Pod 的分类:
自主式 Pod:Pod 退出后不会被创建
控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目
2.控制器类型:
Replication Controller和ReplicaSet
Deployment
DaemonSet
StatefulSet
Job
CronJob
HPA全称Horizontal Pod Autoscaler

(一)Replication Controller和ReplicaSet
ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet。
ReplicaSet 和 Replication Controller 的唯一区别是选择器的支持,ReplicaSet 支持新的基于集合的选择器需求。
ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。
虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制
(二)Deployment
Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法。
典型的应用场景:
1.用来创建Pod和ReplicaSet
2.滚动更新和回滚
3.扩容和缩容
4.暂停与恢复

kubectl apply -f rs.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: myapp:v2

kubectl get pod --show-labels
kubectl label pod deployment-6d4f5bf58f-mbswv app=myapp --overwrite
# 根据标签控制,始终要满足三个副本

在这里插入图片描述
(三)DaemonSet
1.DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
2.DaemonSet 的典型用法:
在每个节点上运行集群存储 DaemonSet,例如 glusterd、ceph。
在每个节点上运行日志收集 DaemonSet,例如 fluentd、logstash。
在每个节点上运行监控 DaemonSet,例如 Prometheus Node Exporter、zabbix agent等
3.一个简单的用法是在所有的节点上都启动一个 DaemonSet,将被作为每种类型的 daemon 使用。
4.一个稍微复杂的用法是单独对每种 daemon 类型使用多个 DaemonSet,但具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求

vim daemonset.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-example
  labels:
    k8s-app: zabbix-agent
spec:
  selector:
    matchLabels:
      name: zabbix-agent
  template:
    metadata:
      labels:
        name: zabbix-agent
    spec:
      containers:
      - name: zabbix-agent
        image: zabbix-agent
      
kubectl apply -f daemonset.yml
kubectl get pod -o wide
kubectl get pod --show-labels

kubectl get daemonsets.apps  #控制器查看
kubectl describe daemonsets.apps

在这里插入图片描述
在这里插入图片描述
(四)Job
执行批处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束

# 拉取测试镜像,上传到本地仓库server1
docker pull per
docker tag perl:latest reg.westos.org/library/perl:latest
docker push reg.westos.org/library/perl:latest
vim job.yml
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 apply -f job.yml
kubectl logs pi-sxrl7

在这里插入图片描述
(五)CronJob
Cron Job 创建基于时间调度的 Jobs。
一个 CronJob 对象就像 crontab (cron table) 文件中的一行,它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job

vim cronjob.yml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busyboxplus
            imagePullPolicy: IfNotPresent
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

kubectl logs hello-1614059700-8sxjp
kubectl get cronjobs.batch
kubectl describe cronjobs.batch

在这里插入图片描述

二.service

(一)Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡;service默认只支持4层负载均衡能力,没有7层功能,可以通过其他方式(Ingress)实现
(二)service的类型
ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。
NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个NodeIP:nodePort都将路由到ClusterIP。
LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 :NodePort,此模式只能在云服务器上使用。
ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定
(三)IPVS模式的service
Service 是由 kube-proxy 组件,加上 iptables 来共同实现pod和service访问
kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的 iptables 规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源。
service->pod: IPVS模式的service,可以使K8s集群支持更多量级的Pod
pod->service: iptables
在这里插入图片描述

kubectl -n kube-system get pod etcd-server2  #所有的配置信息

vim demo1.yml
---
apiVersion: v1
kind: Service
metadata:
  name: myservice1
spec:
  selector:
    app: myapp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1

# 开启kube-proxy的ipvs模式
yum install -y ipvsadm  #所有节点安装
kubectl apply -f demo1.yml
kubectl -n kube-system edit cm kube-proxy  #修改IPVS模式,配置文件,需要重启pod
# mode: "ipvs"
kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'  #更新kube-proxy pod,就是重建pod
ipvsadm -ln
kubectl get all

kube-proxy通过linux的IPVS模块,以rr轮询方式调度service中的Pod
在这里插入图片描述
IPVS模式下,kube-proxy会在service创建后,在宿主机上添加一个虚拟网卡:kube-ipvs0,并分配service IP
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_49564346/article/details/113930399