通过控制器来运行托管的 pod,Pod失败的时候自动重新启动它们。
1. 保持pod健康
从外部检查应用程序的运行状况:
- HTTPGET探针对容器的 IP 地址
- TCP套接字探针尝试与容器指定端口建立TCP连接
- Exec探针在容器内执行任意命令,并检查命令的退出状态码。如果状态码是 0, 则探测成功。
务必记得设置一个初始延迟未说明应用程序的启动时间。
livenessProbe:
httpGet: HTTPGET探针
path: / 请求路径
port: 8080 请求端口
initialDelaySeconds: 15 初始延迟,应用启动后15s开始探测请求
# 获取崩溃容器的应用日志, 即上一个容器的日志
kubectl logs mypod --previous
# describe的内容来了解为什么必须重启容器
kubectl describe po kubia-liveness
1.1 describe 结果解释
退出代码为137, 这有特殊的含义 —-表示该进程由外部信号终止。数字137是两个数字的总和:128+x, 其中x是终止进程的信号编号。
在这个例子中,x等于9, 这是SIGKILL 的信号编号,意味着这个进程被强行终止。
- delay(延迟)delay=0s部分显示在容器启动后立即开始探测
- timeout(超时)设置为1秒,因此容器必须在1秒内进行响应, 不然这次
探测记作失败 - period(周期)等。在探测连续三次失败(#failure= 3)后重启容器。
2 了解ReplicationController
ReplicationController旨在创建和管理一个pod的多个副本。确保pod的数量始终与其标签选择器匹配。
ReplicationController有三个主要部分:
- label selector ( 标签选择器), 用于确定ReplicationController作用域中有哪些Pod
- replica count (副本个数), 指定应运行的pod 数量
- pod template (pod模板), 用于创建新的pod 副本
一些命令缺少命名空间,补上即可使用
kubectl create -f kubia-rc.yaml 创建了ReplicationController
kubectl get pods -A RC 根据Pod 模板启动3个kubia 的Pod,查看Pod
#NAME READY STATUS RESTARTS AGE
#kubia-53thy 0/1 ContainerCreating 0 2s
kubectl delete pod kubia-53thy 删除一个Pod,观察将会创建出一个
kubectl get re # 获取RC的信息 re作为rep让ca巨oncontroller的简写
# NAME DESIRED CURRENT READY AGE
# kubia 3 3 3 3m
kubectl describe rc kubia
通过更改pod的标签, 可以将它 从ReplicationController的作用域中添加或删除。
pod 在metadata.ownerReferences 中引用RC 控制器,可以找到属于哪个RC控制器。
将 pod 移入或移出RC的作用域
kubectl label pod kubia - dmdck type=special 给一个Pod增加type=sp ecial的标签,对原控制器无影响
kubectl label pod kubia-dmdck app=foo --overwrite 对Pod修改现有标签app=kubi,脱落RC 的管理
kubectl get pods -L app 使用-L app 选项在列中显示app的标签列
修改RC 中的 pod模板
更改 pod 模板后,会影响你之后创建的Pod,并且不会影响你已经创建的Pod。
kubectl edit rc kubia # 编辑RC kubia 的Yaml
修改模板中的容器图像, 删除现有的容器, 并让它们替换为新模板中的新容器, 可用来升级pod(后续有更好方法)
kubectl scale re kubia --replicas=3 也可修改副本数量实现水平缩放
kubectl delete rc kubia --cascade=false 删除 RC 时,使用--cascade=false保持 pod 的运行
3 使用ReplicaSet而不是ReplicationController
ReplicaSet 的选择器比RC强,RC已经被弃用。
kubectl create -f kubia-replicaset.yaml
kubectl get rs rs 是ReplicaSet的简写
kubectl describe rs
selector:
matchExpressions:
- key: app
operator: In
values:
- kubia
每个表达式都必须 包含一个key、一个operator (运算符),并且可能还有一个values的列表(取决于运算符),四个有效的运算符。如果同时指定matchLabels和matchExpressions, 则所有标签都必须匹配,并且所有表达式必须计算为true以使该pod与选择器匹配
• In : Label的值 必须与其中 一个指定的values 匹配。
• Notln : Label的值与任何指定的values 不匹配。
• Exists : pod 必须包含一个指定名称的标签(值不重要)。使用此运算符时,
不应指定 values字段。
• DoesNotExist : pod不得包含有指定名称的标签。values属性不得指定