在新版的 Kubernetes 官方推荐使用 Deployment 来取代 Replication Controller(rc),两者间主要相同点包括确保处在服务状态的 Pod 数量(replicas)能满足先前所设定的值以及支援滚动升级(Rolling update),前者额外支援回滚(Roll back)的机制,因此接下来会介绍如何利用 Deployment 来进行滚动升级。
简单提一下为什麽k8s yaml中的kind
是使用Deployment
,而不是使用Pod
呢。
虽然二者都可以把yaml部署到k8s上面,但是行为面来看还是有差异性的。
最直观的差异性
1.Deployment管理的对象是ReplicaSet,而ReplicaSet管理的对象是Pod
2.Deployment controller会去调度pod
3.对pod进行health check
4.pod坏掉时会监测到并进行重启
5.使用rolling update的方法更新pod,可以不停机的方式更新pod
6.根据使用资源(CPU/MEM)进行pod的自动扩充/缩减
用Pod
就需要自行处理啦~~~
有Deployment
没烦恼
推荐kubernetes deployment cheatsheet By jimmy song,有兴趣可以看看,那张图画的很棒rrrr
Deployment 结构示意图
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-myapp
labels:
app: myapp
spec:
replicas: 3 #定义pod的数量要几个,k8s会根据此设定值,维持pod数量
template:
spec:
containers:
- name: myapp #container的名称
image: myapp:latest #container image
imagePullPolicy: Always #拉image的策略,分成Always,Nerver,IfNotPresent
env: #环境变数
- name: MY_ENV
value: "12345"
ports: #container对外的port,如果服务本身除了http外还有grpc接口的需求,可以直接在里面加入另一种grpc的设定
- name: http
containerPort: 80
protocol: TCP #
- name: grpc
containerPort: 8787
protocol: TCP #
readinessProbe: #检测container是否正常的探测设定
httpGet:
path: "/healthcheck" #指定http route
port: 80
initialDelaySeconds: 2 #启动container延迟几秒後探测pod健康度
periodSeconds: 5 #每几秒做一次
command: ["./myapp", "start"] #启动成功後要执行的shell
resources: #container的资源设定
requests:
cpu: 300m
nodeSelector:
- Always :每次都检查
- Nerver :不检查
- IfNotPresent :如果local有image就不检查,local没有时才pull image
initialDelaySeconds
的秒数要设定的比http service ready的时间要长一点。- `CPU`资源一般来说就是vCPU,大概就是1 thread,1000m = 1vCPU,如果node是4vCPU规格,对应就有4000m的cpu资源
- `Memory`这边是使用Mi(Megabyte)
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
如果pod资源超过设定值,有可能会发生以下情形就是了
这边有篇关於pod resources的文章,有兴趣可以看看
[Kubernetes] 分配 & 管理 container 所使用到的计算资源
nodeSelector:
kubernetes.io/os: linux #指定到k8s os为linux的node,如果cluster有多种os的node时,可以透过这个label去部署到linux的node上
因为本系列的部署是使用helm
,所以就不会特别介绍kubectl的部署作法啦,下面是一些deployment的指令用法
# 建立deployment
kubectl create deployment <deployment_name> --image=<image>
# 更新deployment image版本
kubectl set image deployment/<deployment> <container-name>=image:<version>
# 检查deployment升级的历史记录
kubectl rollout history deployment/<deployment>
# 退版
kubectl rollout undo deployment/<deployment>
# 退到特定版本
kubectl rollout undo deployment/<deployment> --to-revision=2
# 重新启动deployment
kubectl rollout restart deployment/<deployment>
# 扩充到指定数量的pod
kubectl scale --replicas=5 deployment/<deployment>
>>: Day 17:RecyclerView 跳页&资料传递(2)
昨天有尝试将验证字串编码,但还是容易被逆向找到程序逻辑并绕过。今天尝试透过 Fuzzing 将程序位...
10.3 几个简单的 Leetcode 例题 如果边的权重都相等,那麽使用 BFS 就可以为我们找出...
27. Remove Element Given an integer array nums and...
每星期及每个月都会有一次固定的会议,加上其他大大小小的会议,一个月至少有6次以上的会议,每次会议看到...
承接上篇,抓日成交资讯时,我们得知道股票代码,那如果我想要有一个可以定时更新的股票代码清单,要去哪里...