共计 10533 个字符,预计需要花费 27 分钟才能阅读完成。
1. 应用 yaml 文件创建资源对象
❝
每种资源的 apiVersion 和 kind 可通过 kubectl api-resources 命令进行查看
❞
tantianran@test-b-k8s-master:~$ kubectl api-resources | grep Deployment
deployments deploy apps/v1 true Deployment
tantianran@test-b-k8s-master:~$
goweb-demo.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test-a
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: goweb-demo
namespace: test-a
spec:
replicas: 10
selector:
matchLabels:
app: goweb-demo
template:
metadata:
labels:
app: goweb-demo
spec:
containers:
- name: goweb-demo
image: 192.168.11.247/web-demo/goweb-demo:20221229v3
---
apiVersion: v1
kind: Service
metadata:
name: goweb-demo
namespace: test-a
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8090
selector:
app: goweb-demo
type: NodePort
❝
对于标签的次要作用:标记、过滤、关联 (次要体现在 deployment、pod、service,3 者标签保持一致),可设定多个标签,倡议设定至多 2 个标签,一个为我的项目标签,一个为利用标签。
❞
- 对于创立、更新和删除的命令
# 只用于创立
kubectl create -f xxx.yaml
# 创立和更新(须要 yaml 文件里的字段反对更新,并不是所有字段都反对更新)kubectl apply -f xxx.yaml
# 卸载
kubectl delete -f xxx.yaml
2. 编写 yaml 的套路分享
- 套路 1:能够间接手写,但容易出错
- 套路 2:参考官网示例,而后改成本人的
- 套路 3:通过命令行来获取,也是有 2 个形式,一是利用尝试运行(–dry-run)的机制再配合 - o 来输入一个 yaml 文件),二是通过 get 来失去 yaml 文件,失去 yaml 文件后再自行批改
上面演示通过 create 来失去 yaml
# 在 kubectl 级别上进行验证
kubectl create deployment web1 --image=nginx --replicas=5 --dry-run=client
# 指的是提交到 apiserver 进行验证
kubectl create deployment web1 --image=nginx --replicas=5 --dry-run=server
# 上面来一个 deployment 的例子,失去其余资源的 yaml 也是这个套路
tantianran@test-b-k8s-master:~$ kubectl create deployment web1 --image=nginx --replicas=5 --dry-run=client -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web1
name: web1
spec:
replicas: 5
selector:
matchLabels:
app: web1
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: web1
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}
# 还能够配合重定向输入到 yaml 文件
kubectl create deployment web1 --image=nginx --replicas=5 --dry-run=client -o yaml > test.yaml
上面演示通过 get 命令来失去 yaml 文件,应用 - o 来指定 yaml 的格局输入,其余资源也是这个套路
kubectl get pods -n test-a -o yaml
编写 yaml 的时候,字段名太多记不住或者想不起来怎么办?能够应用 explain 来查看字段层级
# 找第一级
kubectl explain deployment
# 找第二级
kubectl explain deployment.spec
# 再比方查 pod 相干的
kubectl explain pods.spec.containers
3. 利用生命周期治理
❝
deployment 是最罕用的 k8s 工作负载控制器(Workload Controllers),是 k8s 的一个抽象概念,用于更高级档次对象,部署和治理 Pod,卡控制器还有 DaemonSet、StatefulSet 等。
❞
3.1 Deployment
「Deployment 次要性能:」
- 治理 Pod 和 ReplicaSet
- 具备上线部署、正本设定、滚动降级、回滚等性能
「Deployment 利用场景:」 网站、API、微服务
「Pod 与控制器的关系图:」
「利用生命周期治理流程:」
3.2 利用部署的根本流程
❝
部署 -> 降级 -> 回滚 -> 删除
❞
3.2.1 部署
# 举荐的形式
kubectl apply -f xxx.yaml
# 或者
kubectl create deployment web --image=nginx --replicas=3
在本示例中,部署的是我本人应用 go 语言写的一个很简略的 web demo
拜访一下看看
3.2.2 降级
❝
所谓的降级,其实就是更新镜像,且有 3 种形式,主动触发滚动降级
❞
# 形式 1:间接批改 yaml 文件中的镜像,而后 apply
kubectl apply -f xxx.yaml
# 形式 2:应用命令设置 deployment 应用的镜像
kubectl set image deployment/web nginx=nginx1.17
# 应用零碎编辑器关上进行编辑
kubectl edit deployment
「公布形式有 3 种:」滚动公布、蓝绿公布、灰度公布(金丝雀、A/ B 测试、冒烟测试。灰度公布是最简单的形式,公布的形式是为了防止上线后呈现的问题。)
「K8S 默认是滚动降级:」滚动公布是指每次只降级一个或多个服务,降级实现后退出生产环境,一直执行这个过程,直到集群中的全副旧版本升级新版本。
「滚动降级在 k8s 中的实现:」它是通过 1 个 Deployment 和 2 个 ReplicaSet 来实现的,滚动更新一次只降级一小部分 pod,胜利后,再降级一部分 pod,最终实现所有 Pod 降级,整个过程始终有 Pod 在运行,从而保障了业务的连续性。
「ReplicaSet:」正本集,次要保护 Pod 正本数量,一直比照以后 Pod 数量于冀望 Pod 数量。「ReplicaSet 用处:」Deployment 每次公布都会创立一个 RS(ReplicaSet 的缩写)作为记录,用于实现滚动降级和回滚
能够查看 deployment 的详情,详情里其实是记录了降级的过程
kubectl get deployment -n test-a
kubectl describe deployment goweb-demo -n test-a
查看 ReplicaSet(RS)记录(首次的部署和后续降级都会新创建一个 RS,降级多少次就会创立多少个)
tantianran@test-b-k8s-master:~$ kubectl get rs -n test-a
NAME DESIRED CURRENT READY AGE
goweb-demo-6fbb74fdbb 0 0 0 41m
goweb-demo-7b6649f789 20 20 20 32m # 此处 DESIRED 和 CURRENT 以及 READY 字段有值的话,示意是以后正在应用的 RS
goweb-demo-8665796599 0 0 0 24h
# 查看正在应用的 RS 的详情
kubectl describe rs goweb-demo-7b6649f789 -n test-a
❝
留神:降级后,旧的 RS 会被保留,次要用于前面回滚应用,且每次只能有一个 RS 在应用。
❞
「当新版的镜像曾经做好须要滚动更新的时候,那就要批改 deployment 中指定的镜像,批改的形式有 2 种:应用命令和间接批改 yaml 文件」形式 1:应用命令
# 命令格局
kubectl set image deployment <DeploymentName> <ContainerName>=<Image> -n <Namespace>
# 例子
# step 1:获取 deployment
kubectl get deployment -n test-a
# step 2:查看 deployment 详情
kubectl describe deployment goweb-demo -n test-a
...
Pod Template:
Labels: app=goweb-demo
Containers:
goweb-demo: # 容器名字
Image: 192.168.11.247/web-demo/goweb-demo:20221229v3 # 镜像
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
...
# step 3:设置 deployment 的镜像
kubectl set image deployment goweb-demo goweb-demo=192.168.11.247/web-demo/goweb-demo:20221229v3 -n test-a
形式 2:间接批改 yaml(举荐)
apiVersion: apps/v1
kind: Deployment
metadata:
name: goweb-demo # deployment 名称
namespace: test-a
spec:
replicas: 50 # 正本
selector:
matchLabels:
app: goweb-demo
template:
metadata:
labels:
app: goweb-demo
spec:
containers:
- name: goweb-demo
image: 192.168.11.247/web-demo/goweb-demo:20221229v3 # 镜像
「程度扩缩容,也就是批改正本的数量,也有 2 种形式,命令和批改 yaml 文件」形式 1:命令
kubectl scale deployment goweb-demo --replicas=5 -n test-a
形式 2:批改 yaml 文件中的 replicas 参数,再 apply
apiVersion: apps/v1
kind: Deployment
metadata:
name: goweb-demo
namespace: test-a
spec:
replicas: 5 #批改正本数量
...
...
3.2.3 回滚
❝
当利用公布失败,须要回滚时。
❞
查看发过有哪些版本
# 查看历史
kubectl rollout history deployment -n test-a
deployment.apps/goweb-demo
REVISION CHANGE-CAUSE
4 <none>
6 <none>
8 <none>
9 <none>
# 通过命令批改 deployment 的镜像进行降级时,前面加 --record 参数,再查看历史后就会记录这条命令
kubectl set image deployment goweb-demo goweb-demo=192.168.11.247/web-demo/goweb-demo:20221229v2 -n test-a --record
Flag --record has been deprecated, --record will be removed in the future
deployment.apps/goweb-demo image updated
# 下面加了 --record 参数,再查看历史,能够看到记录的这条命令
kubectl rollout history deployment -n test-a
deployment.apps/goweb-demo
REVISION CHANGE-CAUSE
4 <none>
6 <none>
9 <none>
10 kubectl set image deployment goweb-demo goweb-demo=192.168.11.247/web-demo/goweb-demo:20221229v2 --namespace=test-a --record=true # 就是这里
查看版本号和 RS 的对应关系,以及和镜像的对应关系
# 查看 RS
tantianran@test-b-k8s-master:~$ kubectl get rs -n test-a
NAME DESIRED CURRENT READY AGE
goweb-demo-6fbb74fdbb 0 0 0 5h15m
goweb-demo-7b6649f789 0 0 0 5h6m
goweb-demo-8665796599 0 0 0 29h
goweb-demo-b98869456 5 5 5 4h22m # 以后应用的 RS
# 查看以后应用的 RS 详情
tantianran@test-b-k8s-master:~$ kubectl describe rs goweb-demo-b98869456 -n test-a
...
Annotations: deployment.kubernetes.io/desired-replicas: 5
deployment.kubernetes.io/max-replicas: 7
deployment.kubernetes.io/revision: 11 # 这个 11 就是以后版本号
deployment.kubernetes.io/revision-history: 7,9 # 历史版本
kubernetes.io/change-cause:
kubectl set image deployment goweb-demo goweb-demo=192.168.11.247/web-demo/goweb-demo:20221229v3 --namespace=test-a --record=true
Controlled By: Deployment/goweb-demo
Replicas: 5 current / 5 desired
Pods Status: 5 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=goweb-demo
pod-template-hash=b98869456
Containers:
goweb-demo:
Image: 192.168.11.247/web-demo/goweb-demo:20221229v3 # 应用的镜像
Port: <none>
Host Port: <none>
...
# 查看历史版本
tantianran@test-b-k8s-master:~$ kubectl rollout history deployment -n test-a
deployment.apps/goweb-demo
REVISION CHANGE-CAUSE
4 <none>
6 <none>
10 kubectl set image deployment goweb-demo goweb-demo=192.168.11.247/web-demo/goweb-demo:20221229v2 --namespace=test-a --record=true
11 kubectl set image deployment goweb-demo goweb-demo=192.168.11.247/web-demo/goweb-demo:20221229v3 --namespace=test-a --record=true # 这个 REVISION 是 11
通过过滤来获取到公布版本和对应的镜像
# 过滤 revision 和 Image
tantianran@test-b-k8s-master:~$ kubectl describe $(kubectl get rs -o name -n test-a | grep "goweb-") -n test-a | grep -E "revision:|Image:"
deployment.kubernetes.io/revision: 4
Image: 192.168.11.247/web-demo/goweb-demo:20221229v1
deployment.kubernetes.io/revision: 10
Image: 192.168.11.247/web-demo/goweb-demo:20221229v2
deployment.kubernetes.io/revision: 6
Image: 192.168.11.247/web-demo/goweb-demo:20221228v1
deployment.kubernetes.io/revision: 11
Image: 192.168.11.247/web-demo/goweb-demo:20221229v3
tantianran@test-b-k8s-master:~$
# 过滤更具体的,过滤 revision、Image、Name、Replicas
tantianran@test-b-k8s-master:~$ kubectl describe $(kubectl get rs -o name -n test-a | grep "goweb-") -n test-a | grep -E "revision:|Image:|Name:|Replicas:"
Name: goweb-demo-6fbb74fdbb
deployment.kubernetes.io/revision: 4
Replicas: 0 current / 0 desired
Image: 192.168.11.247/web-demo/goweb-demo:20221229v1
Name: goweb-demo-7b6649f789
deployment.kubernetes.io/revision: 10
Replicas: 0 current / 0 desired
Image: 192.168.11.247/web-demo/goweb-demo:20221229v2
Name: goweb-demo-8665796599
deployment.kubernetes.io/revision: 6
Replicas: 0 current / 0 desired
Image: 192.168.11.247/web-demo/goweb-demo:20221228v1
Name: goweb-demo-b98869456
deployment.kubernetes.io/revision: 11
Replicas: 5 current / 5 desired
Image: 192.168.11.247/web-demo/goweb-demo:20221229v3
只回滚到上一个版本
tantianran@test-b-k8s-master:~$ kubectl rollout undo deployment goweb-demo -n test-a
deployment.apps/goweb-demo rolled back
回滚到指定的历史版本
# 查看以后正在应用哪个版本
tantianran@test-b-k8s-master:~$ kubectl describe $(kubectl get rs -o name -n test-a | grep "goweb-") -n test-a | grep -E "revision:|Replicas:"
deployment.kubernetes.io/revision: 4
Replicas: 0 current / 0 desired
deployment.kubernetes.io/revision: 14 # 以后正在应用的版本,版本号 14,且正本是 5
Replicas: 5 current / 5 desired # 正本数量
deployment.kubernetes.io/revision: 6
Replicas: 0 current / 0 desired
deployment.kubernetes.io/revision: 13
Replicas: 0 current / 0 desired
# 假如要回滚到最后的版本,也就是版本号是 4
tantianran@test-b-k8s-master:~$ kubectl rollout undo deployment goweb-demo --to-revision=4 -n test-a
deployment.apps/goweb-demo rolled back
tantianran@test-b-k8s-master:~$
3.2.4 删除(当我的项目须要下线时)
# 如果该我的项目是间接编写 yaml 的,可这样删除(下线)kubectl delete -f goweb-demo.yaml
# 如果该项目标命名空间、deployment、service 是用命令的,那就须要手动删除下线
kubectl delete deployment goweb-demo -n test-a
kubectl delete svc goweb-demo -n test-a
kubectl delete ns test-a
最初
❝
如须要 go 开发的 web demo 源码的敌人可私信我,一起交换,感激!
❞
本文转载于(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/jB…