1. 应用yaml文件创建资源对象

每种资源的apiVersion和kind可通过 kubectl api-resources 命令进行查看

tantianran@test-b-k8s-master:~$ kubectl api-resources | grep Deploymentdeployments                       deploy       apps/v1                                true         Deploymenttantianran@test-b-k8s-master:~$ 

goweb-demo.yaml

apiVersion: v1kind: Namespacemetadata:  name: test-a---apiVersion: apps/v1kind: Deploymentmetadata:  name: goweb-demo  namespace: test-aspec:  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: v1kind: Servicemetadata:  name: goweb-demo  namespace: test-aspec:  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 yamlapiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: web1  name: web1spec:  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文件中的镜像,而后applykubectl 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-akubectl describe deployment goweb-demo -n test-a

查看ReplicaSet(RS)记录(首次的部署和后续降级都会新创建一个RS,降级多少次就会创立多少个)

tantianran@test-b-k8s-master:~$ kubectl get rs -n test-aNAME                    DESIRED   CURRENT   READY   AGEgoweb-demo-6fbb74fdbb   0         0         0       41mgoweb-demo-7b6649f789   20        20        20      32m # 此处DESIRED和CURRENT以及READY字段有值的话,示意是以后正在应用的RSgoweb-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:获取deploymentkubectl 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/v1kind: Deploymentmetadata:  name: goweb-demo # deployment名称  namespace: test-aspec:  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/v1kind: Deploymentmetadata:  name: goweb-demo  namespace: test-aspec:  replicas: 5 #批改正本数量......

3.2.3 回滚

当利用公布失败,须要回滚时。

查看发过有哪些版本

# 查看历史kubectl rollout history deployment -n test-adeployment.apps/goweb-demo REVISION  CHANGE-CAUSE4         <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 --recordFlag --record has been deprecated, --record will be removed in the futuredeployment.apps/goweb-demo image updated# 下面加了--record参数,再查看历史,能够看到记录的这条命令kubectl rollout history deployment -n test-adeployment.apps/goweb-demo REVISION  CHANGE-CAUSE4         <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的对应关系,以及和镜像的对应关系

# 查看RStantianran@test-b-k8s-master:~$ kubectl get rs -n test-aNAME                    DESIRED   CURRENT   READY   AGEgoweb-demo-6fbb74fdbb   0         0         0       5h15mgoweb-demo-7b6649f789   0         0         0       5h6mgoweb-demo-8665796599   0         0         0       29hgoweb-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=trueControlled By:  Deployment/goweb-demoReplicas:       5 current / 5 desiredPods Status:    5 Running / 0 Waiting / 0 Succeeded / 0 FailedPod 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-adeployment.apps/goweb-demo REVISION  CHANGE-CAUSE4         <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=true11        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和Imagetantianran@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:20221229v3tantianran@test-b-k8s-master:~$ # 过滤更具体的,过滤revision、Image、Name、Replicastantianran@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: 4Replicas:       0 current / 0 desired    Image:        192.168.11.247/web-demo/goweb-demo:20221229v1Name:           goweb-demo-7b6649f789                deployment.kubernetes.io/revision: 10Replicas:       0 current / 0 desired    Image:        192.168.11.247/web-demo/goweb-demo:20221229v2Name:           goweb-demo-8665796599                deployment.kubernetes.io/revision: 6Replicas:       0 current / 0 desired    Image:        192.168.11.247/web-demo/goweb-demo:20221228v1Name:           goweb-demo-b98869456                deployment.kubernetes.io/revision: 11Replicas:       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-adeployment.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: 4Replicas:       0 current / 0 desired                deployment.kubernetes.io/revision: 14 # 以后正在应用的版本,版本号14,且正本是5Replicas:       5 current / 5 desired # 正本数量                deployment.kubernetes.io/revision: 6Replicas:       0 current / 0 desired                deployment.kubernetes.io/revision: 13Replicas:       0 current / 0 desired# 假如要回滚到最后的版本,也就是版本号是4tantianran@test-b-k8s-master:~$ kubectl rollout undo deployment goweb-demo --to-revision=4 -n test-adeployment.apps/goweb-demo rolled backtantianran@test-b-k8s-master:~$ 

3.2.4 删除(当我的项目须要下线时)

# 如果该我的项目是间接编写yaml的,可这样删除(下线)kubectl delete -f goweb-demo.yaml# 如果该项目标命名空间、deployment、service是用命令的,那就须要手动删除下线kubectl delete deployment goweb-demo -n test-akubectl delete svc goweb-demo -n test-akubectl delete ns test-a

最初

如须要go开发的web demo源码的敌人可私信我,一起交换,感激!

本文转载于(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/jB...