k8s学习笔记(3)

135 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Pod

Pod生命周期

image-20200827092313725

生命周期中的重要行为:

  1. 初始化容器
  2. 生命周期回调
  3. 容器探测

状态

  • Pending, Pod 已被 Kubernetes 接受,但尚未创建一个或多个容器镜像。这包括被调度之前的时间以及通过网络下载镜像所花费的时间,执行需要一段时间。
  • Running, Pod 已经被绑定到了一个节点,所有容器已被创建。至少一个容器正在运行,或者正在启动或重新启动。
  • Failed, 所有容器终止,至少有一个容器以失败方式终止。也就是说,这个容器要么已非 0 状态退出,要么被系统终止。
  • Succeeded, 所有容器成功终止,也不会重启。
  • Unkown, 由于一些原因,Pod 的状态无法获取,通常是与 Pod 通信时出错导致的

容器探测

  • livenessProbe:指示容器是否正在运行,如果活动探测失败,则 kubelet 会杀死容器,并且容器将受其重启策略的约束。如果不指定活动探测,默认状态是 Success。

    apiVersion: v1
    kind: Pod
    metadata:
      name: liveness-exec-pod
      namespace: default
    spec:
      containers:
      - name: liveness-exec-container
        image: busybox:latest
        imagePullPolicy: IfNotPresent
        command: ["/bin/sh", "-c", "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 3600"]
        livenessProbe:
          exec:
            command: ["test", "-e", "/tmp/healthy"]
          initialDelaySeconds: 1
          periodSeconds: 3
    
  • readinessProbe:指示容器是否已准备好为请求提供服务,如果准备情况探测失败,则控制器会从与 Pod 匹配的所有服务的端点中删除 Pod 的 IP 地址。初始化延迟之前的默认准备状态是 Failure,如果容器未提供准备情况探测,则默认状态为 Success。

探针类型

  • ExecAction:在容器内部执行指定的命令,如果命令以状态代码 0 退出,则认为诊断成功。
  • TCPSocketAction:对指定 IP 和端口的容器执行 TCP 检查,如果端口打开,则认为诊断成功。
  • HTTPGetAction:对指定 IP + port + path路径上的容器的执行 HTTP Get 请求。如果响应的状态代码大于或等于 200 且小于 400,则认为诊断成功。

生命周期回调

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      postStart:            #在postStart启动时,ENTRYPOINT有可能还没结束
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:              #发生在容器被杀死之前,它会阻塞当前的容器杀死进程,直到这个Hook定义操作完成之后,才允许容器被杀死
        exec:
          command: ["/usr/sbin/nginx","-s","quit"]

Pod 控制器

ReplicaSet

ReplicaSet确保Pod资源一直符合用户期望的replicas数量的状态。

核心资源

  1. 用户期望副本数,确保所控制的资源满足用户期望。
  2. 标签选择器,控制指定的资源。
  3. Pod 资源模板,当资源不满足时,根据资源模板完成创建。

A ReplicaSet ensures that a specified number of pod replicas are running at any given time. However, a Deployment is a higher-level concept that manages ReplicaSets and provides declarative updates to Pods along with a lot of other useful features. Therefore, we recommend using Deployments instead of directly using ReplicaSets, unless you require custom update orchestration or don't require updates at all.

ReplicaSet可确保指定数量的pod“replicas”在任何设定的时间运行。然而,Deployments是一个更高层次的概念,它管理ReplicaSets,并提供对pod的声明性更新以及许多其他的功能。因此,我们建议您使用Deployments而不是直接使用ReplicaSets,除非您需要自定义更新编排或根本不需要更新。

配置清单

apiVersion: apps/v1
kind: ReplicaSet
metadata:
    name: rs-demo
    namespace: default
spec:
    replicas: 2 # 副本数
    selector: # 托管pod的label选择器
        matchLabels:
            app: rs-demo-pod
            release: stable
    template: # 模板,控制器会根据模板创建pods
        metadata:
            name: rs-demo-pod # 无用字段,pod会以replicaSet的名称+'_随机码'命名
            labels: # 需与replicaSet的selector相符
                app: rs-demo-pod
                release: stable
                enviroment: qa
        spec:
            containers:
            - name: rs-demo-container
              image: nginx
              imagePullPolicy: IfNotPresent
              ports:
              - name: http
                containerPort: 80

扩容缩容

# 使用edit命令
kubectl edit rs rs-demo
# 修改replicas的值即可

# 使用scale命令
kubectl scale --replicas=2 rs rs-demo

更新镜像版本

kubectl edit rs rs-demo
# 修改了模板,但已有pod镜像并不会更新,因为副本数目正确,pod不会重建。后续重建的pod才会使用更新的镜像。

image-20200901160500700

Deployment

Deployment建构在ReplicaSet上,不直接控制Pod,而是通过控制ReplicaSet来控制Pod。只用于管控无状态应用。

作用

  1. 创建部署PodReplicaSet
  2. 扩容、缩容
  3. 滚动更新、回滚应用
  4. 暂停和继续Deployment

Deployments - ReplicaSets - Pods 结构

image-20200901164018864

创建Deployment后,查询ReplicaSet发现自动创建了ReplicaSet

[root@master ~]# kubectl get deploy
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
deploy-demo   2/2     2            2           4m12s
[root@master ~]# kubectl get rs
NAME                     DESIRED   CURRENT   READY   AGE
deploy-demo-7b5b46db88   2         2         2       4m16s
# rs的后缀随机码为模板的hash值,以便追踪到关联到的模板创建pods
[root@master ~]# kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
deploy-demo-7b5b46db88-hnflh   1/1     Running   0          4m20s
deploy-demo-7b5b46db88-mc6z4   1/1     Running   0          4m20s

配置清单

apiVersion: apps/v1
kind: Deployment
metadata:
    name: myapp-deploy
    namespace: default
spec:
    replicas: 3
    selector:
        matchLabels:
            app: myapp
            release: stable
    strategy: # 更新策略
        type: RollingUpdate # 更新方式
        rollingUpdate: # 滚动更新策略
            maxSurge: 1 # 在滚动中,可以创建多少个新pod
            maxUnavailable: 0 # 在滚动中,可以删除多少个旧pod
    template:
        metadata:
            name: myapp-deploy-pod
            namespace: default
            labels:
                app: myapp
                release: stable
        spec:
            containers:
            - name: myapp-deploy-container
              image: ikubernetes/myapp:v1
              imagePullPolicy: IfNotPresent
              ports:
              - name: http
                containerPort: 80

滚动更新

kubectl edit deployment deploy-demo
kubectl set image deployment deploy-demo deploy-demo-container=nginx
# 查看更新历史
kubectl rollout history deployment deploy-demo
# 回滚至指定版本(不指定则默认上一版本)
kubectl rollout undo deployment deploy-demo --to-revision=1

DaemonSet

用于确保集群中每一个节点运行且只运行一个特定的Pod副本。常用来部署一些集群的日志、监控或者其他系统管理应用。

当节点新加入集群时,会自动添加这些Pod到这些节点。

当节点从集群中删除时,这些Pod会被删除。

常用于:

  1. 日志收集
  2. 系统监控
  3. 系统程序

Job

Job负责处理一次性任务。

Pod任务完成后退出,不需要作为守护进程运行。

重启策略为:仅当任务未完成的异常退出时重启。

CronJob

CronJob周期性运行任务,即定时任务,重复创建Job来执行任务。

StatefulSet

管理有状态应用(对应Deployments和ReplicaSets是为无状态应用而设计),并且每个副本被单独管理。

常用于持久化存储。

Service

ServicePod提供固定访问端点。避免Pod重启后ip改变无法访问。

Service通过selector关联到对应的Pods

代理模式

  • userspace

    效率低

    image-20200909165554593

  • iptables

    灵活、功能强大

    规则遍历匹配和更新

    可扩展性

    image-20200909165818388

  • IPVS

    工作在内核态,有更好的性能

    调度算法丰富

    image-20200909165235117

DNS资源记录

DNS服务监视Kubernetes API,为每个Service创建DNS记录用于域名解析。

可通过DNS名称访问Pods

SVC_NAME.NAMESPACE_NAME.svc.cluster.local

类型

  • ClusterIP集群内部通讯
  • NodePort对外暴露
  • LoadBalancer对外暴露和负载均衡,仅限部分云平台

配置清单

apiVersion: v1
kind: Service
metadata:
    name: myapp 
    namespace: default
spec:
    selector:
        app: myapp
        release: stable
    type: NodePort
    ports: 
    - port: 80
      targetPort: 80

参考资料

kubeadm故障排查

Kubernetes Pod 生命周期 - 简书

安装Kubernetes单Master节点