-
k8s中pod配置文件详解
[root@leader /zpf/k8s/resource]$cat nginx-demo.yaml
apiVersion: v1 #api文档版本
kind: Pod #资源对象类型,可以是Pod,Deployment,StatefulSet,等相关对象
metadata:
name: nginx-demo ##Pod 的名称
labels: #定义pod的标签
type: app
test: 1.0.0 #自定义pod的版本号
namespace: 'default' #命名空间的配置
spec: ##期望Pod按照这里的描述进行创建
terminationGracePeriodSeconds: 40 #当被删除的时候,给pod预留多少时间的停止预留时间.
containers: #对于pod中的容器描述
- name: nginx # 容器的名称
image: nginx:1.7.9 #z指定容器的景象以及版本号
imagePullPolicy: IfNotPresent #镜像拉取策略 这里的意思是总是拉取最新镜像,Never 表示仅使用本地镜像, ifNotPresent 表示如果本地有就用本地的
lifecycle: #生命周期的配置
postStart: #生命周期启动阶段做的事情,不一定在容器的command之前运行
exec:
command:
- sh
- -c
- "echo '<h1>pre stop</h1>' > /usr/share/nginx/html/poststop.html"
preStop: #生命周期结束阶段要做的事情.
exec:
command:
- sh
- -c
- "sleep 50;echo 'sleep finished ...' >> /usr/share/nginx/html/poststop.html "
command:
- nginx
- -g
- 'daemon off;' #指定容器启动时执行的命令,这里要添加;分号,表示命令结束.
workingDir: /usr/share/nginx/html #定义容器启动后的工作目录
ports:
- name: http #端口名称
containerPort: 80 #描述容器内要暴漏什么端口
protocol: TCP #描述该端口是基于那种协议
env: #环境变量信息
- name: JVM_OPTS #环境变量名称
value: '-Xms128m -Xmx128m' #环境变量的值
resources:
requests:
cpu: 100m #表示使用0.1个核心. 1000m表示使用一个核心.
memory: 128Mi #这里表示使用多少M内存空间
limits:
cpu: 200m #表示cpu最多使用0.2个核心
memory: 256Mi #内存最多使用256M
restartPolicy: Always #服务重启策略,OnFailure,表示异常情况下退出时才会进行重启.Never表示从不重启该pod 这里配置的是Always 表示无论什么情况都会重启
-
添加label可以在命令行中直接添加临时lable标签.
使用配置文件创建 pod
kubectl apply -f nginx-demo.yaml
查看创建好的pod中的标签
kubectl get pod nginx-demo --show-labels
临时修改pod中的标签信息
kubectl label po nginx-demo language=java
-
也可以使用修改配置文件来修改label信息.
[root@leader /zpf/k8s/resource]$cat nginx-demo.yaml
apiVersion: v1 #api文档版本
kind: Pod #资源对象类型,可以是Pod,Deployment,StatefulSet,等相关对象
metadata:
name: nginx-demo ##Pod 的名称
labels: #定义pod的标签
type: app
test: 1.0.0 #自定义pod的版本号
language: java #这里添加一个label信息到配置文件中.
namespace: 'default' #命名空间的配置
spec: ##期望Pod按照这里的描述进行创建
terminationGracePeriodSeconds: 40 #当被删除的时候,给pod预留多少时间的停止预留时间.
containers: #对于pod中的容器描述
- name: nginx # 容器的名称
image: nginx:1.7.9 #z指定容器的景象以及版本号
imagePullPolicy: IfNotPresent #镜像拉取策略 这里的意思是总是拉取最新镜像,Never 表示仅使用本地镜像, ifNotPresent 表示如果本地有就用本地的
lifecycle: #生命周期的配置
postStart: #生命周期启动阶段做的事情,不一定在容器的command之前运行
exec:
command:
- sh
- -c
- "echo '<h1>pre stop</h1>' > /usr/share/nginx/html/poststop.html"
preStop: #生命周期结束阶段要做的事情.
exec:
command:
- sh
- -c
- "sleep 50;echo 'sleep finished ...' >> /usr/share/nginx/html/poststop.html "
command:
- nginx
- -g
- 'daemon off;' #指定容器启动时执行的命令,这里要添加;分号,表示命令结束.
workingDir: /usr/share/nginx/html #定义容器启动后的工作目录
ports:
- name: http #端口名称
containerPort: 80 #描述容器内要暴漏什么端口
protocol: TCP #描述该端口是基于那种协议
env: #环境变量信息
- name: JVM_OPTS #环境变量名称
value: '-Xms128m -Xmx128m' #环境变量的值
resources:
requests:
cpu: 100m #表示使用0.1个核心. 1000m表示使用一个核心.
memory: 128Mi #这里表示使用多少M内存空间
limits:
cpu: 200m #表示cpu最多使用0.2个核心
memory: 256Mi #内存最多使用256M
restartPolicy: Always #服务重启策略,OnFailure,表示异常情况下退出时才会进行重启.Never表示从不重启该pod 这里配置的是Always 表示无论什么情况都会重启
这里在配置文件中添加了一个languang:java的标签.
使用命令行获取指定标签下的pod.
kubectl get po -l language=java
查看指定label下的对应的pod,并查看该pod的所有的label信息.
kubectl get po -l language=java --show-labels
通过条件删选label标签对应的pod信息,
kubectl get pod -l 'test in (1.0.0,1.1.0,1.2.0)'
这表示test标签的值是1.0.0 或者 1.1.0 或者1.2.0 满足任意一个test value就可以被查询出来.
查询条件指定排除某些条件进行查询.
kubectl get pod -l version!=1.2.0,language=java --show-labels
这里表示满足version!= 1.2.0 并且language=java的pod筛选出来
-
一个简单的deployment的相关信息注解
apiVersion: apps/v1 #deploy api版本
kind: Deployment #资源类型为deployment
metadata: #原数据标签
labels: #标签
app: nginx-deploy #这里是deploy的label标签用来与后面的rs与pod进行关联
name: nginx-deploy #deployment 名字
namespace: default #默认命名空间
spec: #
replicas: 1 #期望副本数
revisionHistoryLimit: 10 #进行滚动更新后,保留的历史版本数量
selector: #选择器,用于找到匹配的RS
matchLabels: #按照标签匹配
app: nginx-deploy #在deploy中关联rs的字段使用的就是selector
strategy:
rollingUpdate: #滚动更新配置
maxSurge: 25% #表示在更新的时候可以有25%额外的pod出现.超过期望副本数的比例是25%
maxUnavailable: 25% #最多可以允许25%的pod在更新时处于不可用状态.
type: RollingUpdate #更新类型,指定为滚动更新
template: #pod模板,
metadata: #pod原数据信息
labels: #pod标签
app: nginx-deploy #这里是rs与pod之间的关联字段
spec: #pod期望信息
containers: #破的容器相关信息
- image: nginx:1.7.9 #pod使用的镜像版本
imagePullPolicy: IfNotPresent #pod镜像拉取策略
name: nginx #pod名称
restartPolicy: Always #重启策略
terminationGracePeriodSeconds: 30 #宽限时间
#说明一下,这里三个资源类型的关联就是使用文中的nginx-deploy来进行关联的.
说明一下,label标签中如果有数字类型,那么需要使用引号引起来.因为label标签中默认支持string类型,
deployment滚动更新
一般滚动更新的触发条件是修改了pod的版本号会触发重新拉取镜像的操作,这个过程会触发滚动更新,滚动更新结果可以使用
[root@leader /zpf/k8s/resource]$kubectl get deploy -w NAME READY UP-TO-DATE AVAILABLE AGE nginx-deploy 3/3 3 3 34m
其中
UP-TO-DATE: 字段表示的就是容器更新次数.
AVAILABLE : 表示当前最大可用副本数,
或者使用
$kubectl rollout status deploy nginx-deploy deployment "nginx-deploy" successfully rolled out
查看表示这个deployment已经滚动更新完成
如果想要查看滚动更新的历史过程可以使用
$kubectl describe deploy nginx-deploy . . . Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 45m deployment-controller Scaled up replica set nginx-deploy-845964f5bf to 3 Normal ScalingReplicaSet 37m deployment-controller Scaled up replica set nginx-deploy-845964f5bf to 5 Normal ScalingReplicaSet 15m deployment-controller Scaled down replica set nginx-deploy-845964f5bf to 3 Normal ScalingReplicaSet 12m deployment-controller Scaled down replica set nginx-deploy-845964f5bf to 0 Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deploy-845964f5bf to 1 Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set nginx-deploy-968b78ccf to 2 Normal ScalingReplicaSet 11m (x2 over 12m) deployment-controller Scaled up replica set nginx-deploy-968b78ccf to 2 Normal ScalingReplicaSet 11m (x2 over 14m) deployment-controller Scaled up replica set nginx-deploy-968b78ccf to 1 Normal ScalingReplicaSet 11m (x2 over 12m) deployment-controller Scaled down replica set nginx-deploy-845964f5bf to 2 Normal ScalingReplicaSet 11m (x2 over 12m) deployment-controller Scaled down replica set nginx-deploy-845964f5bf to 1 Normal ScalingReplicaSet 11m (x2 over 12m) deployment-controller Scaled up replica set nginx-deploy-968b78ccf to 3 Normal ScalingReplicaSet 11m (x5 over 11m) deployment-controller (combined from similar events): Scaled down replica set nginx-deploy-845964f5bf to 0
其中Events中会详细的记录滚动更新的过程.包括每次新建副本的数量以及结束副本的数量.
查看deploy历史版本,
这里说明一下,只有重新拉取镜像操作才会出发版本更新,只有副本数的变化不属于版本更新,
说明一下,先决条件1,
在更新版本的时候不要使用kubectl delete rs nginx-deploy 删除历史rs信息.会导致版本的缺失.因为在回退的时候会用deploy与rs进行关联,如果将rs删除,那么就无将两者进行关联,导致无法找到回滚版本,
先决条件2,
要在deploy的yaml文件中注明,revisionHistorylimit:10 表示留存过去10个版本.如果没有声明的话那么就无法保留历史版本信息,就无法进行回滚.
spec: # replicas: 3 #期望副本数 revisionHistoryLimit: 10 #进行滚动更新后,保留的历史版本数量
- 查看deployment的历史版本信息.历史版本不会显示当前正在运行的版本.
$kubectl rollout history deployment nginx-deploy deployment.apps/nginx-deploy REVISION CHANGE-CAUSE 4 <none> 5 <none>
查看指定版本的deployment信息.
$kubectl rollout history deployment nginx-deploy --revision=4 deployment.apps/nginx-deploy with revision #4 Pod Template: Labels: app=nginx-deploy pod-template-hash=968b78ccf Containers: nginx: Image: nginx:1.9.1 Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none>
使用命令退回之前指定版本操作
$kubectl rollout undo deploy nginx-deploy --to-revision=4 deployment.apps/nginx-deploy rolled back $kubectl rollout undo deploy nginx-deploy --to-revision=5 deployment.apps/nginx-deploy rolled back
更新后的版本会进行版本递增操作.被回滚的版本会变成新的版本.
$kubectl rollout history deploy nginx-deploy deployment.apps/nginx-deploy REVISION CHANGE-CAUSE 6 <none> 7 <none>
-
deployment 扩缩容
使用scale进行deploy的扩缩容服务.可以直接进行副本数量的变更,副本数变更不属于版本变更,所以不适用于版本回滚.
这里使用sacle将 nginx-deploy的副本数扩容到5个.
$kubectl scale --replicas=5 deploy nginx-deploy deployment.apps/nginx-deploy scaled [root@leader /zpf/k8s/resource]$kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE nginx-deploy 5/5 5 5 138m
缩容方式同理,将--replicas的数量变更成指定数量即可.
-
deployment暂停与恢复
暂停已经启动的deployment,这里的暂停是指服务版本以及修改的版本等信息是无法直接更新的,(针对edit来说的),
这里使用rollout pause 来暂停指定的deployment
<$kubectl rollout pause deploy nginx-deploy deployment.apps/nginx-deploy paused