1. Kubenetes Object对象

什么是K8s的对象

Kubernetes objects are persistent entities in the Kubernetes system. Kubernetes uses these entities to represent the state of your cluster.

  • what kind of containers running
  • the resources
  • the policies

called record of intent 对象就是 意向的记录

要和这些对象一起工作,就需要使用k8s API. API 会在之后的文章里提到(挖坑)。本质来说,kubectl就是调用合适的k8s API。或者也可以直接在自己程序里使用api。

对象里有什么

每个k8s对象里都有2个小对象分别是

  • object spec: 当你要创建一个对象,提供这个对象的特点。想让k8s达到的状态:its desired state
  • object status: 描述了当前对象的状态。这是由k8s control plane来管理

怎样来描述一个对象

一般是在一个yml文件里描述对象,比如说这里有一个deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec: # 这就是spec对象
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

利用以上描述文件,通过命令

kubectl apply -f deployment.yml

让k8s生成对象

yml文件里的项目

https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/deployment-v1/
https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#PodSpec
在上面这个文件里可以找到Deployment的具体细节

  • apiVersion: 您使用哪个版本的 Kubernetes API 来创建此对象
  • kind: 你想创建什么样的对象
  • metadata: 有助于唯一标识对象的数据,包括name字符串、UID和可选namespace
  • spec: 你希望对象处于什么状态
    ...
    • selector: pod的标签选择器,存在的replicaSets会被这个标签所选择。必须和pod的template的label一致
    • template: 描述了想要成立的pods
      • spec:
    • replicas: 想要的pod数量

Pod 的基本概念

  • pod是最小单元
  • k8s 不会直接处理容器,而是处理pod。 Pod是由一个或多个的container组成的
  • 1个pod共享网络命名空间
  • pod是短暂的,如果重启pod,ip是不同的

Pod的存在意义

  • Pod 是一个多进程的设计,运行多个container
  • Pod 可以应用间交互

Pod的实现机制

  • 共享网络
  • 共享存储

Pod 镜像拉取策略

imagePullPolicy: Always
IfNotPresent: default 镜像在宿主机上不存在时才拉
Always: 每次创建Pod都会拉取
Never: Pod永远不会主动拉取

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: write
    image: centos
    command: ["bash", "-c", "for i in {1..199}; do echo $si >> /data/hello ; sleep 1; done"]
    imagePullPolicy: Always
    volumeMounts:
    - name: data
      mountPath: /data
  - name: read
    image: centos
    command: ["bash", "-c", "tail -f /data/hello"]
    volumeMounts:
    - name: data
      mountPath: /data
  
  volumes:
  - name: data
    emptyDir: {}

Pod 资源限制 resources

Screenshot-2023-06-05-090809

Screenshot-2023-06-05-091329

单位
1c=1000m
250m = 0.25c

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: write
    image: centos
    command: ["bash", "-c", "for i in {1..199}; do echo $si >> /data/hello ; sleep 1; done"]
    imagePullPolicy: Always
    resources:
        requests:
            memory: "64Mi"
            cpu: "250m"
        limits:
            memory: "128Mi"
            cpu: "500m"
    volumeMounts:
    - name: data
      mountPath: /data
  - name: read
    image: centos
    command: ["bash", "-c", "tail -f /data/hello"]
    volumeMounts:
    - name: data
      mountPath: /data
  
  volumes:
  - name: data
    emptyDir: {}

Pod 重启机制

Screenshot-2023-06-05-091941
restartPolicy: Never

  • Always:
  • OnFailue
  • Never: 批量任务,比如批量设置cronjob

Pod 健康检擦

livenessProbe (存活探针)》 如失败,则杀死容器,按照restartPolicy重启容器
readinessProbe (就绪探针)》 如果失败,Pod从Service endpoints剔除

支持的3种检查方法》

  1. httpGet 返回200-400为成功
  2. exec 执行shell返回0为成功
  3. tcpsocket 执行tcp socket建立链接
spec:
  containers:
  - name: liveness
  livenessProbe:
    # 执行玩下面的命令 cat  /tmp/healthy 然后看echo  $?的返回码 
    exec:
      command:
      - cat
      - /tmp/healthy
    initialDelaySeconds: 5
    periodSeconds: 5