Deployment、Service、Pod是k8s最核心的3个资源对象。
**Deployment: ** 最常见的无状态应用的控制器,支持应用的扩缩容、滚动 更新等操作 。 **Servcie: **为弹性变动且存在生命周期的Pod对象提供了一个固定的访问接 口,用于服务发现和服务访问。
Pod: 是运行容器以及调度的最小单位。同一个Pod可以同时运行多个容 器,这些容器共享NET、UTS、IPC。除此之外还有 USER、PID、MOUNT。
**ReplicationController: **用于确保每个Pod副本在任意时刻都能满足目标 数量,简单点来说,它用于保证每个容器或容器组总是运行并且可以访问的: 老一代无状态的Pod应用控制器。
**ReplicaSet: ** 新一代的无状态的Pod应用控制器,它与RC的不同之处在于 支持的标签选择器不同,RC只支持等值选择器,RS还额外支持基于集合的选择器。
**StatefulSet: ** 用于管理有状态的持久化应用,如database服务程序,它与 Deployment不同之处在于,它会为每一个Pod创建一个独有的持久性标识 符,并确保每个Pod之间的顺序性。
**DaemonSet: **用于确保每一个节点都运行了某个Pod的一个副本,新增的 节点一样会被添加此类Pod,在节点移除时,此类Pod会被回收。
**Job: **用于管理运行完成后即可终止的应用,例如批量处理作业任务。
1、Namespace:名称空间
默认的名称空间: Default
#查看名称空间
[root@docker-k8s01 ~]# kubectl get ns
#查看名称空间详细信息
[root@docker-k8s01 ~]# kubectl describe ns default
#创建名称空间
[root@docker-k8s01 ~]# cat test1.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test1
[root@docker-k8s01 ~]# kubectl create ns test1.yaml
**注:Namespace资源对象仅用于资源对象的隔离,并不能隔绝不同名称空间的Pod之间的通信,那是网络策略资源的功能。 **
查看指定名称空间的资源可以使用--namespace 或者简写 -n 选项也可以
#删除名称空间
[root@docker-k8s01 ~]# kubectl delete ns test1
2、Pod
#编写例子yaml文件
[root@docker-k8s01 pod]# cat test-pod.yaml
kind: pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: httpd
Pod中镜像获取策略
//将上述Pod资源的镜像下载策略改为IfNotPresent
[root@docker-k8s01 pod]# cat test-pod.yaml
kind: pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: httpd
imagepullpolicy: IfNotPresent # 添加此行
# imagepullpolicy后可选参数如下:
Always:镜像标签为"latest"或镜像标签不存在时,总是从指定的仓库中获取镜像。
IfNotPresent:仅当本地镜像不存在时才从目标仓库中下载。也就意味 着,如果本地存在,直接使用本地镜像,无需再联网下载。
Never: 禁止从仓库中下载镜像,即只使用本地镜像。
注: 上述语句中提到的"本地"是指: docker images命令能够给查看到的镜像。
容器重启策略
//将上述Pod资源添加重启策略为OnFailure
[root@docker-k8s01 pod]# cat test-pod.yaml
kind: pod
apiVersion: v1
metadata:
name: test-pod
spec:
restartpolicy: OnFailure # 添加此行
containers:
- name: test-pod
image: httpd
imagepullpolicy: IfNotPresent
#可选参数如下:
Always: 但凡Pod对象终止就将其重启,此为默认设定;
OnFailure:仅在Pod对象出现错误时才将其重启;
Never:从不重启;
附:同一个yaml文件内,可以同时存在多种资源对象,但最好是同一个服务相关的资源。并且在写的时候,不同的资源需要用“---” 将资源隔离。其实默认是一个资源的yaml,最上方也有“---"不过是通常会省略不写。
---
apiVersion: v1
kind: Namespace
metadata:
name: test1
---
kind: pod
apiVersion: v1
metadata:
name: test-pod
spec:
restartpolicy: OnFailure
containers:
- name: test-pod
image: httpd
imagepullpolicy: IfNotPresent
3、Pod的默认健康检查
LivenessProbe(活跃度)
[root@docker-k8s01 liveness]# cat test-liveness.yaml
kind: Pod
apiVersion: v1
metadata:
name: liveness
labels:
test: liveness
spec:
restartPolicy: OnFailure
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/test; sleep 60; rm -rf /tmp/test; sleep 300
livenessProbe:
exec:
command:
- cat
- /tmp/test
initialDelaySeconds: 10 // pod运行10秒后开始探测
periodSeconds: 5 // 每5秒探测一次
**注: Liveness活跃度探测,根据探测某个文件是否存在,来确认某个服务 是否正常运行,如果存在则正常,否则,它会根据你设置的Pod的重启策略操作Pod。 **
Readiness(敏捷探测、就绪性探测)
[root@docker-k8s01 readiness]# cat test-readiness.yaml
kind: Pod
apiVersion: v1
metadata:
name: readiness
labels:
test: readiness
spec:
restartPolicy: OnFailure
containers:
- name: readiness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/test; sleep 60; rm -rf /tmp/test; sleep 300
readinessProbe:
exec:
command:
- cat
- /tmp/test
initialDelaySeconds: 10
periodSeconds: 5
总结liveness和 readiness探测 1、liveness和readiness是两种健康检查机制,如果不特意配置,k8s将两 种探测采取相同的默认行为,即通过判断容器启动进程的返回值是否为零,来判断探测是否成功。 2、两种探测配置方法完全一样,不同之处在于探测失败后的行为:liveness探测是根据Pod重启策略操作容器,大多数是重启容器。 readiness则是将容器设置为不可用,不接收Service转发的请求。 3、两种探测方法可以独立存在,也可以同时使用。用liveness判断容器是 否需要重启实现自愈;用readiness判断容器是否已经准备好对外提供服务。
4、健康检测的应用
在扩容中的应用:
[root@docker-k8s01 web]# cat test-web.yaml
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: web
spec:
replicas: 3
template:
metadata:
labels:
run: web
spec:
containers:
- name: web
image: httpd
ports:
- containerPort: 80
readinessProbe:
httpGet:
scheme: HTTP
path: /healthy
port: 80
initialDelaySeconds: 10
periodSeconds: 5
---
kind: Service
apiVersion: v1
metadata:
name: web-svc
spec:
type: NodePort
selector:
run: web
ports:
- protocol: TCP
port: 90
targetPort: 80
nodePort: 30321
在更新过程中的使用
[root@docker-k8s01 web]# cat app-v1.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: app
spec:
replicas: 10
template:
metadata:
labels:
run: app
spec:
containers:
- name: app
image: busybox
args:
- /bin/sh
- -c
- sleep 10; touch /tmp/healthy; sleep 3000
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 10
periodSeconds: 5
**maxSurge: 此参数控制滚动更新过程中,副本总数超过预期数的值。可以是整数,也可以是百分比,默认是1 ** maxUnavailable: 不可用Pod的值。默认为1.可以是整数,也可以是百分比。