2024年运维最全『K8S 入门』三:资源调度,Linux运维开发必学
strategy: # 更新策略rollingUpdate:# 滚动更新配置maxSurge: 25% # 进行滚动更新时,更新的个数最多可以超过期望副本数的个数/比例maxUnavailable: 25% # 进行滚动更新时,最大不可用比例更新比例,表示在所有副本数中,最多可以有多少个不更新成功type: RollingUpdate # 更新类型,采用滚动更新template: # pod 模板
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
strategy: # 更新策略
rollingUpdate: # 滚动更新配置
maxSurge: 25% # 进行滚动更新时,更新的个数最多可以超过期望副本数的个数/比例
maxUnavailable: 25% # 进行滚动更新时,最大不可用比例更新比例,表示在所有副本数中,最多可以有多少个不更新成功
type: RollingUpdate # 更新类型,采用滚动更新
template: # pod 模板
metadata: # pod 的元信息
#creationTimestamp: null
labels: # pod 的标签
app: nginx-deploy
spec: # pod 期望信息
containers: # pod 的容器
- image: nginx:1.7.9 # 镜像
imagePullPolicy: IfNotPresent # 拉取策略
name: nginx # 容器名称
#resources: {}
#terminationMessagePath: /dev/termination-log
#terminationMessagePolicy: File
#dnsPolicy: ClusterFirst
restartPolicy: Always # 重启策略
#schedulerName: default-scheduler
#securityContext: {}
terminationGracePeriodSeconds: 30 # 删除操作最多宽限多长时间
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/eafcc5db5aeb4786ab04abcae592aced.png)
2. **滚动更新**
* 滚动更新时,修改本地文件是无效果的
* 如果不更新 **template** 的配置,是不会触发自动更新
* 例如,先查看 deploy 中的标签
kubectl get deploy --show-labels
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9caa8e947b274112ae2618de97052526.png)
* 然后修改标签值,但是这时候并不会重发自动更新
kubectl edit deploy nginx-deploy
===== 更新 =====
…
labels:
app: nginx-deploy
test: “123” # 添加这个
…
通过这个命令可以看到 events 事件没有什么变化
kubectl describe deploy nginx-deploy
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f81cae9d277048249b449049f6af4579.png)
* 先做一个事情,增加一下副本数,这时候 po 变成 3 个,rs、deploy 还是 1 个
===== 更新 =====
…
spec:
progressDeadlineSeconds: 600
replicas: 3 # 更新这个
…
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1458ed5cb582429b86fc64c815f41a4c.png)
* (重点)尝试去修改镜像版本
===== 更新 =====
…
template:
metadata:
creationTimestamp: null
labels:
app: nginx-deploy
spec:
containers:
- image: nginx:1.9.1 # 更新这个
…
通过这个命令就可以看到 deploy 在更新
kubectl rollout status deploy nginx-deploy
或者用这个
kubectl get deploy --show-labels
或者看 events
kubectl describe deploy nginx-deploy
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/53b6b3e5ec41429997c995c5ad433a1c.png)
* 从这也可以看到这个更新过程(describe)
+ 先创建两个 rs,先把其中 1 个 rs 的 pod 移到另外 1 个 rs,最后再清理旧的 rs
+ 如果在更新过程中,快速地再次修改,k8s 会把上次的 rs 直接停止,再重新进行一次流程
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c9a8546d738b4af3847a2191f07abcff.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ca6853363ef54412ad761e767306ebed.png)
* 从这也可以看出来旧的 rs 已经被替代
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b6a4e174b6a2486fbedf3c8acc1db4eb.png)
3. **回滚**
* 首先先对版本更新一个有问题的版本,查看更新过程,发现版本已经卡死
kubectl set image deployment/nginx-deploy nginx=nginx:1.91
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6264bba052604ead8e6adffddc88f368.png)
* 因为相应的镜像死活拉不下来,其中一个 pod 拉取镜像失败,也可以通过下面命令查看一下情况
kubectl describe po nginx-deploy-f7f5656c7-z2bw7
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b628a8f8a9bd483ea867138d0c5661b7.png)
* 先查看历史版本(因为没使用, record,所以才 none),可以看到有 3 个历史版本
kubectl rollout history deployment/nginx-deploy
只有这样 change-cause 才不会显示 none
kubectl set image deployment/nginx-deploy nginx=nginx:1.91 --record ***
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/69c6bc043ad84de69ef4592911dd3f90.png)
* 查看 2 号版本的信息
kubectl rollout history deployment/nginx-deploy --revision=2
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f8422d7ca925406e98d52e75454115e0.png)
* (重点)回滚上一个版本
kubectl rollout undo deployment/nginx-deploy --to-revision=2
通过这个命令看到已经回退到 1.9.1 版本
kubectl edit deploy nginx-deploy
* 查看 rs 也可以看到也就只有第一个 rs 有数量了
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3d70c98c907e47b492b328bf2f5ea27c.png)
* (注意)可以通过设置 `.spec.revisonHistoryLimit` 来指定 deployment 保留多少 revison,如果设置为 0,则不允许 deployment 回退了
4. **扩容缩容**
* 扩容:执行下面命令进行扩缩容,这时候并不会变更 rs
kubectl scale --replicas=6 deploy nginx-deploy
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d0e2ee13b372419d808e5eca4bc619df.png)
* 缩容:其实一样的,只是设置数字少点
kubectl scale --replicas=3 deploy nginx-deploy
5. **暂停与恢复**
* 由于每次对 pod template 中的信息发生修改后,都会触发更新 deployment 操作,那么此时如果频繁修改信息,就会产生多次更新,而实际上只需要执行最后一次更新即可,当出现此类情况时我们就可以暂停 deployment 的 rollout
* 首先先暂停配置
kubectl rollout pause deploy nginx-deploy
* 然后往模板中添加下面配置,会发现 rs 并没有新增加
kubectl edit deploy nginx-deploy
===== 更新 =====
…
spec: # pod 期望信息
containers: # pod 的容器
…
resources: # 下面这部分都是更新
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
…
可以通过这个命令看到最新版本的 change 没改变
kubectl rollout history deploy nginx-deploy --revision=4
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ab25ce3a1e214adc8e6bfcf07ca52863.png)
* 恢复之后,通过 rs 或者 deploy 查看,已经有新增
kubectl rollout resume deploy nginx-deploy
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5235634421494aafa9f9875fcd32a354.png)
### 三、StatefulSet
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f65f919a8bfc430eac425b06dd179477.png)
1. **创建**
* 首先创建目录,并且把 *web.yml* 放到里面
mkdir statefulset
cd statefulset
touch web.yml
* 其中 *web.yml* 内容如下
— # 嵌套另外一个 yaml 的内容,暂时先不用管这个
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
apiVersion: apps/v1
kind: StatefulSet # StatefulSet 类型的资源
metadata:
name: web # StatefulSet 对象的名字
spec:
selector:
matchLabels:
app: nginx # 使用哪个 service 来管理 dns,就是和上面的 metadata.name 的 “nginx” 匹配
serviceName: “nginx”
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: nginx:1.7.9
ports: # 容器内部要暴露的端口
- containerPort: 80 # 具体暴露的端口号
name: web # 该端口配置的名字
* 执行 *web.yml*
kubectl create -f web.yml
如果出错可以执行下面的命令删除创建
kubectl delete sts web
kubectl delete svc nginx
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/745efcf2dcb240a8896bfbf748e31644.png)
* 通过下面命令会看到 pod 的创建
kubectl get po
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/55720067115c423b98f8f8bd802bb326.png)
* 下面尝试是否可以 ping 通。使用万能工具包
+ (**注意**)容器主机内,用宿主机无法 ping 通
kubectl run -it --image busybox:1.28.4 dns-test --restart=Never --rm /bin/sh
测试下面命令
ping web-0.nginx # DNS 命名格式为:statefulSetName-{0…N-1}.serviceName.namespace.svc.cluster.local 一般只要 statefulSetName-{0…N-1}.serviceName 就可
ping web-1.nginx
nslookup web-0.nginx
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/05274bc985204f4cb25c018784a576da.png)
2. **扩容缩容**
* 首先看到现在的容器也只有 3 个
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/994fcfc0bcee40bc9c775b669690b38f.png)
* 这时扩容到 5 个
kubectl scale sts web --replicas=5
查看扩容过程
kubectl describe sts web
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/febbf521767a40e2b6234da49e97a614.png)
* 缩容也是用同样的命令,他是按数字从大到小进行缩容
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/792142d7b490400fbbdc2f15123e0f52.png)
3. **镜像更新**
* 目前还不支持直接更新 image,需要 `patch` 来间接实现,通过补丁,可以发现版本已经更新到 1.9.1
kubectl patch sts web --type=‘json’ -p=‘[{“op”: “replace”, “path”: “/spec/template/spec/containers/0/image”, “value”:“nginx:1.9.1”}]’
查看版本更新版本
kubectl rollout history sts web
查看第 2 个版本的变化历史
kubectl rollout history sts web --revision=2
查看更新的动作
kubectl rollout status sts web
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/25bb3b71358645d48b39a6be34be5778.png)
* 因为我们在配置中配置的实现是 `RollingUpdate` 更新策略,在 StatefulSet 中更新时是基于 pod 的顺序倒序更新的。利用滚动更新中的 `partition` 属性,可以实现简易的灰度发布的效果
kubectl edit sts web
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d5b75c9664a44f3fac5fba92c81ef14d.png)
4. **灰度发布**
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a091d96927654a08be9a3e1814346fb5.png)
* 首先把服务扩容到 5 台
* 修改滚动策略的 `partition` 为 3
修改
kubectl edit sts web
* 其中修改配置如下
…
spec:
containers:
- image: nginx:1.7.9
…
updateStrategy:
rollingUpdate:
partition: 3
type: RollingUpdate
…
* 然后分别查看一下每个 web-\* 的 pod,会发现 3,4 已经更新版本到 1.7.9
kubectl describe po web-2
* 直接把 `partition` 改为 0,直接全量发布
5. **onDelete 策略**
* 只有在 pod 被删除时会进行更新操作
* 先修改更新策略
kubectl edit sts web
* 修改的配置如下
…
updateStrategy:
type: OnDelete
…
* 然后再次修改 nginx 版本配置为 1.9.1,你会发现每个 web-\* 的 pod 都根本不会变化,除非执行下面命令。你就可以每个 pod 操作一次之后,才会更新版本
kubectl describe pod web-4
6. **级联删除**
* 级联删除:删除 StatefulSet 时会同时删除 pod
kubectl delete statefulset web
* 非级联删除:删除 StatefulSet 时不会删除 pod,删除 sts 后,pod 就没人管了,此时再删除 pod 不会重建的
先重新创建
kubectl delete service nginx # 这个也要执行一下,好像 service 没删除
kubectl create -f web.yml
非级联删除
kubectl delete sts web --cascade=false
* StatefulSet 删除后 PVC 还会保留着,数据不再使用的话也需要删除
kubectl delete pvc ***
### 四、DaemonSet
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b5197ebe6c5f4adba844b02055516ed7.png)
1. **解释**
* 它是可以专门筛选节点,来帮助自动在节点层面创建 pod,例如那种专门采集日志数据的进程就有必要
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e5bc038a608d4705b3f72af0db1b8c54.png)
2. **不指定 Node 节点**
* 不指定 Node 创建文件
fluentd-ds.yml
apiVersion: apps/v1
kind: DaemonSet # 创建 DaemonSet 资源
metadata:
name: fluentd # 名字
spec:
selector: # 一定要写的
matchLabels:
app: logging # 匹配标签的值,和下面的 labels.app 对应
template: # 模板配置
metadata:
labels:
app: logging
id: fluentd
name: fluentd # 容器名
spec:
containers:
- name: fluentd-es
image: agilestacks/fluentd-elasticsearch:v1.3.0
env: # 环境变量
- name: FLUENTD_ARGS
value: -qq
volumeMounts: # 加载数据卷
- name: containers # 把下面命名为 containers 的容器卷加载到下面路径去
mountPath: /var/lib/docker/containers
- name: varlog
mountPath: /varlog
volumes: # 定义数据卷,主机路径模式,与 node 共享目录
- hostPath:
path: /var/lib/docker/containers # node 中的共享目录
name: containers
- hostPath:
path: /var/log
name: varlog
* 执行创建,默认会在我们的 2 个节点中创建
kubectl create -f fluentd-ds.yml
kubecttl get daemonset
kubectl get po -o wide
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ec7bb4ae94ae43c893741a632b40a125.png)
* 通过查看 Node 的时候,其实这时候并没有相应的 label,让我们 ds 选择部署到哪个节点去,所以默认就会往`非 master 节点`去部署
kubectl get nodes --show-labels
为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!
这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。
本份面试集锦涵盖了
- 174 道运维工程师面试题
- 128道k8s面试题
- 108道shell脚本面试题
- 200道Linux面试题
- 51道docker面试题
- 35道Jenkis面试题
- 78道MongoDB面试题
- 17道ansible面试题
- 60道dubbo面试题
- 53道kafka面试
- 18道mysql面试题
- 40道nginx面试题
- 77道redis面试题
- 28道zookeeper
总计 1000+ 道面试题, 内容 又全含金量又高
- 174道运维工程师面试题
1、什么是运维?
2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?
3、现在给你三百台服务器,你怎么对他们进行管理?
4、简述raid0 raid1raid5二种工作模式的工作原理及特点
5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
7、Tomcat和Resin有什么区别,工作中你怎么选择?
8、什么是中间件?什么是jdk?
9、讲述一下Tomcat8005、8009、8080三个端口的含义?
10、什么叫CDN?
11、什么叫网站灰度发布?
12、简述DNS进行域名解析的过程?
13、RabbitMQ是什么东西?
14、讲一下Keepalived的工作原理?
15、讲述一下LVS三种模式的工作过程?
16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
17、如何重置mysql root密码?
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
怎么对他们进行管理?
4、简述raid0 raid1raid5二种工作模式的工作原理及特点
5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
7、Tomcat和Resin有什么区别,工作中你怎么选择?
8、什么是中间件?什么是jdk?
9、讲述一下Tomcat8005、8009、8080三个端口的含义?
10、什么叫CDN?
11、什么叫网站灰度发布?
12、简述DNS进行域名解析的过程?
13、RabbitMQ是什么东西?
14、讲一下Keepalived的工作原理?
15、讲述一下LVS三种模式的工作过程?
16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
17、如何重置mysql root密码?
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
更多推荐
所有评论(0)