目录
[deployment 的特点](#deployment 的特点)
概念
kubectl 是陈述式资源管理方式(命令行) 管理就是增删改查
资源对象包含pod、控制器、service,我们创建资源对象时会用声明式,用yaml文件写的
陈述式命令的开头是 kubectl
k8s项目的生命周期:发布------修改------更新------回滚------销毁
kubectl的基础命令
kubectl version 查看集群的版本
kubectl api-resources 查看资源对象的版本和简写
kubectl cluster-info 查看集群的信息
journalctl -u kubelet -f 和 tail -f /var/log/messages 查看集群的日志
*每天常用的查看集群的基本信息
kubectl get cs 查看集群组件的健康状态
kubectl get node 查看节点的状态
kubectl get pod 查看默认命名空间里面当前运行的pod 默认命名空间是default
了解即可:
name:pod的名称
ready:1/1 表示正常状态
status :running 表示运行
只有1/1和running才表示pod属于正常状态
restarts 表示pod的重启次数。因为自愈功能,pod在非正常状态下,会自动进行重启,状态正常之后就不会再进行重启。
AGE:当前pod的运行时间
kubectl create ns xy102 创建命名空间
kubectl delete ns xy102 删除命名空间
kubectl get all 查看当前命名空间的所有资源
kubectl get pod -o wide 查看pod的详细信息 (pod被部署在哪个节点上)
deployment的部署方式
资源对象的部署方式叫做deployment。它是无状态部署方式:pod的名称是随机生成的。
deployment 的特点
1.创建时可以指定副本数(pod的数量)、
2.滚动更新:先更新一个,更新好了之后再更新余下的pod
3.自我修复:默认的策略就是重启容器,删除pod相当于重启pod
4.支持回滚:如果更新有问题,可以恢复到上一个版本
5.支持pod数量的扩容和缩容(手动)
基于deployment创建pod
首先要kubectl create ns xy102 创建命名空间
kubectl create deployment test1 --image=nginx:1.22 --replicas=3 -n xy102 基于deployment创建的pod
kubectl delete pod test1-86776958-5br7q -n xy102 重启pod,不能删除
基于 deployment创建的pod, delete pod 相当于重启,不能删除pod
kubectl run nginx1 --image=nginx:1.22 -n xy102 run直接创建pod 删除这个就是真的删除
kubectl describepod -n xy102 test1-86776958-5br7q 查看这个pod的详细情况
创建pod流程:调度策略(把pod部署到哪个节点上)------拉取镜像------创建容器------运行容器
kubectl describe deployments.apps -n xy102 test1 查看创建的资源对象的信息
kubectl logs -f test1-86776958-5br7q -n xy102 查看pod的日志
kubectl exec -it -n xy102 test1-86776958-5br7q bash 进入pod内的容器
手动缩容
方式一:命令行: kubectl scale deployment nginx1 -n xy102 --replicas=1
方式二:在yaml文件:kubectl edit deployment nginx1 -n xy102
进入之后修改replicas即可
注:pod的ip地址随着pod的生命周期有可能会发生变化,内部访问我们通过pod的ip可以直接访问,外部访问不会受到影响。
service的类型以及工作原理
service如何与pod进行关联,这种关联不受pod的ip地址的变化影响
创建service
kubectl expose deployment nginx1 --port=80 --target-port=80 --name=nginx - n xy102
注:前一个port是集群的service的端口,是和容器内的80做的映射
kubectl get svc 查看service
service的类型
1.ClusterIP 默认类型,提供集群内部的一个虚拟ip地址。是用来让其他的pod来访问的,pod可以通过这个service的ip地址直接访问到内部的容器。只能内部访问,外部不能访问。是内部组件通信使用。(对内)
- NodePort:在每个节点(集群的所有节点)都会开放一个端口,外部就可以通过本机的ip+端口(nodeport端口)访问pod内的容器服务。每个节点nodeport的端口都是一致的,端口是有范围的:30000-32767 (对外)
修改service的类型为nodeport
kubectl edit svc -n xy102 nginx1
此时80是service端口 31151是所有节点上开放的端口(所有的节点主机本机ip都能访问)
访问的流程:在宿主机上开放的端口31151------service的80端口------pod里面容器的80端口
**nodeport实验:对外暴露端口
流程图:
deployment的标签是app=nginx1
由于service匹配的标签是app=nginx1,只要资源对象的标签包含app=nginx1,所以都可以通过service进行转发
kubectl edit pod nginx2 -n xy102 进入yaml文件
把labels指向app=nginx1
实验结果:
此时访问本机的31151端口 就能访问到所有的pod
总结:nodeport:service根据标签来匹配对应的pod,只要标签匹配,都能转发打到指定的pod内的容器。
3.LoadBalancer:云平台的运营商(阿里云、腾讯云)提供loadbalancer的地址 地址需要付费
提供之后也是通过访问负载均衡的地址,来实现pod的流量转发
4.ExternalName:把service的名称映射到DNS的域名上。就是让pod去访问集群外部的资源,而且设置为此类型service将不能提供四层负载均衡服务。
滚动更新以及回滚
对版本进行滚动更新
kubectl set image deployment/nginx1 nginx=nginx:1.18 -n xy102
此时 kubectl get pod -o wide -n xy102 即可查看是否正则更新
kubectl rollout history deployment/nginx1 -n xy102 查看还原点
数字大小决定了距离上次更新操作的远近,数字越大,就是最近的一次操作
kubectl set image deployment/nginx1 nginx=nginx:1.20 --record -n xy102 record添加更新记录
回滚
kubectl rollout undo deployment/nginx1 --to-revision=5 -n xy102 回滚
销毁
所以基于deployment创建的资源对象的pod如果要删除,首先要先删除deployment,然后再删除service,最后再删除命名空间。