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


单位
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 重启机制

restartPolicy: Never
- Always:
- OnFailue
- Never: 批量任务,比如批量设置cronjob
Pod 健康检擦
livenessProbe (存活探针)》 如失败,则杀死容器,按照restartPolicy重启容器
readinessProbe (就绪探针)》 如果失败,Pod从Service endpoints剔除
支持的3种检查方法》
- httpGet 返回200-400为成功
- exec 执行shell返回0为成功
- tcpsocket 执行tcp socket建立链接
spec:
containers:
- name: liveness
livenessProbe:
# 执行玩下面的命令 cat /tmp/healthy 然后看echo $?的返回码
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5