kubectl 命令管理(1)
kubectl 管理
一: 陈述式资源管理方法
陈述式源管理方法:
-
kubernetes集群管理集群资源的唯一入口是通过相应的方法调用apiserver的接口
-
kubect1是官方的CTL 命令行工具,用于与apiserver进行通信,将用户在命令行输入的命令,组织并转化为apiserver能识别的信息,进而实现管理k8s各种资源的一种有效途径
-
kubect1的命令大全
- kubectl --help
- k8s中文文档: http://docs.kubernetes.org.cn/683.html
4·对资源的增、删、查操作比较方便,但对改的操作就不容易了
1.1 查看版本信息和tab补全
复制 #查看版本信息
kubectl version
复制#配置kubectl 自动补全
source <(kubectl completion bash)
#将命令写入到/root/.bashrc(root用户。如果是全局写入到/etc/bashrc),开机自动运行
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc
复制#查看资源对象简写
kubectl api-resources
复制#查看集群信息
kubectl cluster-info
复制#动态查看服务日志信息,此命令是centos7 开始有的。-f 表示动态查看
journalctl -u kubelet -f
1.2 基本信息查看
kubectl get [-n namespace] <resource> [-o wide | json | yaml]
获取资源的相关信息
-
-n指定命名空间,
-
-o指定输出格式
-
resource可以是具体资源名称,如pod nginx-xxx;也可以是资源类型,如pod;或者all (仅展示几种核心资源,并不完整)
-
--all-namespaces或-A :表示显示所有命令空间,
-
--show-labels :显示所有标签
- -l app :仅显示标签为app的资源
- -l app-nginx :仅显示包含app标签,且值为nginx的资源
复制#查看master 节点状态(可以简写cs)
[root@master ~]# kubectl get componentstatuses
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
复制#查看命名空间(可以简写ns)
[root@master ~]# kubectl get namespaces
NAME STATUS AGE
default Active 21h #默认使用default命名空间
kube-node-lease Active 21h
kube-public Active 21h
kube-system Active 21h
#查看defalut命名空间的所有资源(-n default 可以省略)
kubectl get all -n default
命名空间作用:用于允许不同 命名空间的相同类型的资源重名
复制#创建命名空间 test
kubectl create ns test
#查看命名空间
kubectl get ns
#删除命名空间test
kubectl delete ns test
复制#在命名空间kube-public 中创建副本控制器(deployment)来启动pod(nginx-wx),使用镜像nginx
kubectl create deployment nginx-wx --image=nginx -n kube-public
#查看命名空间kube-public 里的所有资源
kubectl get all -n kube-public
复制#描述命名空间kube-public里的deployment 副本控制的详细信息
kubectl describe -n kube-public deployment nginx-wx
#查看命名空间kube-public 里的pod(nginx-wx....)的详细信息
kubectl get pod -n kube-public nginx-wx-7d5458c6f5-hhjmh
复制 #查看命名空间kube-public里pod信息(使用pod,pods都可以)
kubectl get pods -n kube-public
复制#master节点上
#查看kube-public命名空间里的pod信息。-o 指定输出方式
[root@master ~]# kubectl get pods -o wide -n kube-public
#kubectl exec 跨主机登录docker
[root@master ~]# kubectl exec -it -n kube-public nginx-wx-7d5458c6f5-hhjmh bash
#在容器里创建abc.txt
root@nginx-wx-7d5458c6f5-hhjmh:/# touch abc.txt
root@nginx-wx-7d5458c6f5-hhjmh:/# ls
root@nginx-wx-7d5458c6f5-hhjmh:/# exit
#pod所在的node节点上
#找出对应容器的id
[root@node01 ~]# docker ps | grep 'nginx-wx'
#进入容器查看
[root@node01 ~]# docker exec -it d07e bash
root@nginx-wx-7d5458c6f5-hhjmh:/# ls
复制 #删除(重启)pod资源,由于存在deployment/rc之类的副本控制器,删除pod 也会重新拉起来
kubectl delete pod -n kube-public nginx-wx-7d5458c6f5-hhjmh
#若pod始终无法删除(如一值处于terminatin)可以使用此命令强制删除
kubectl delete pod -n kube-public nginx-wx-7d5458c6f5-rnhzc --force --grace-period=0
#grace-period:表示过度存活期。默认时30s。在删除pod之前允许pod慢慢的终止其上的容器进程。0表示立即终止pod
#--force 表示强制
复制#使用kubectl scale 进行扩容,缩容; --replicas=4 表示设置副本数为4
kubectl scale deployment -n kube-public nginx-wx --replicas=4
#设置副本数为2
kubectl scale deployment -n kube-public nginx-wx --replicas=2
复制#删除kube-public命名空间的副本控制器 nginx-wx
kubectl delete deployment -n kube-public nginx-wx
复制#获取default命名空间里的资源(如果没有,就使用create命令创建一个)
kubectl get all
#使用logs 查看资源日志
kubectl logs nginx-deployment-86b9454474-254n2
二: 项目的生命周期
项目生命周期: 创建---> 发布------> 更新------>回滚------->删除
2.1 使用kubectl run 命令创建并允许容器镜像
kubectl run 命令:
- 创建并运行一个或多个容器镜像
- 创建一个deployment 或 job 来管理容器
- run 命令会在后续版本废弃。可以使用create命令代替
- kubectl run --help 查看命令帮助
复制#启动nginx实例,暴露容器端口80(暴露在pod上),设置副本数3
kubectl run -n kube-public nginx --image=nginx:1.14 --port=80 --replicas=8
#使用-w 选项动态跟踪
kubectl get pods -n kube-public -w
kubectl get all -n kube-public
2.2 使用kubectl expose命令发布资源
使用kubectl expose命令,将资源暴露为新的service:
使用 kubectl expose --help 获取帮助
kubenetes之所以需要service
-
一方面因为pod的ip不是固定的(pod可能会重建)
-
另一方面则是因为一组pod实例之间总会有负载均衡的需求
-
对于容器而言,kubeletes提供了基于VIP的网桥方式访问service ,再由service 重定向到相应的pod
service的类型:
- ClusterIP:
- 提供一个集群内部的虚拟ip,以供pod访问(service的默认类型)
- NodePort:
- 在每个Node上打开一个端口以供外部访问,kubernetes将会在每个node上打开一个端口,并在每个node的端口都是一样的,
- 通过NodeIP:NodePort的方式,kubenetes集群外部的程序可以访问service
- LoadBalancer:
- 通过外部的负载均衡器来访问,通常在云平台部署LoadBalancer还需要额外的费用
2.2.1 发布
复制#为deployment的nginx创建service,并通过service的80端口转发至容器的80端口上,service的名称为nginx-service,类型为NodePort
kubectl expose deployment -n kube-public nginx --port=80 --target-port=80 --name=ngin-service --type=NodePort
#--port 指定node在service上的端口
#--target 指定 容器在pod 上的端口
#--type 指定类型。默认是cluster ip
2.2.2 查看pod网络信息和service暴露端口
复制#查看pod网络信息和service暴露端口
kubectl get pods,svc -o wide -n kube-public
2.2.3 查看service关联的资源
复制#通过查看service资源的详细信息里的endpoints信息查看关联的后端节点
kubectl describe service -n kube-public ngin-service
#直接查看endpoints关联的后端节点
kubectl get endpoints -n kube-public
2.2.4 在所有的node节点上查看负载均衡端口
复制yum -y install ipvsadm
ipvsadm -Ln
#在所有node节点都可以看到ClusterIP:80的转发(内部访问)
#以及可以看到对应node节点ip:30754(nodeip使用的端口)的转发(外部访问)
2.3 使用kubectl set 命令更新资源信息
kubectl set :
- 跟新现有资源的一些信息
- kubectl set --help 获取帮助信息
2.3.1 获取当前nginx的版本号
复制curl -I http://192.168.23.12:30754
curl -I http://192.168.23.13:30754
2.3.2 将版本跟新为1.15
复制#查看所有资源信息,找到deployment的资源名
kubectl get all -n kube-public
#查看相应deployment资源里的容器名
kubectl describe deployment.apps/nginx -n kube-public
#使用kubectl set image ,将nginx版本升级为1.15.
#nginx=nginx:1.15 表示容器nginx使用镜像nginx:1.15
kubectl set -n kube-public image deployment.apps/nginx nginx=nginx:1.15
#动态跟踪
kubectl get pod -n kube-public -w
#如果升级失败,可能时因为网络问题。可以先在node 节点上,将对应的镜像拉去下来
复制curl -I http://192.168.23.12:30754
curl -I http://192.168.23.13:30754
2.4 使用kubectl rollout 对资源进行回滚
kubectl rollout
- 对资源进行回滚
- kubectl rollout --help 查看帮助文档
复制#查看历史版本
kubectl rollout history -n kube-public deployment nginx
复制#执行回滚到上一个版本
kubectl rollout undo -n kube-public deployment nginx
#检查回滚状态
kubectl rollout status -n kube-public deployment nginx
复制curl -I http://192.168.23.12:30754
curl -I http://192.168.23.13:30754
2.5 使用kubectl delete删除资源
复制#删除副本控制器
kubectl delete -n kube-public deployments.apps nginx
#删除service
kubectl delete -n kube-public service/ngin-service
三: 金丝雀发布(Canary Release)
3.1 什么是金丝雀发布
金丝雀发布,又称灰度发布
Deployment控制器支持自定义控制更新过程中的滚动节奏,如"暂停(pause) "或“继续(resume)"更新操作。比如等待第一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。
然后,再筛选一小部分的用户请求路由到新版本的Pod应用,继续观察能否稳定地按期望的方式运行。确定没问题之后再继续完成余下的Pod资源滚动更新,否则立即回滚更新操作。这就是所谓的金丝雀发布。
3.2 配置deployment使用金丝雀发布
3.2.1 发布nginx服务
复制#使用nginx1.14版本镜像创建3个pod
kubectl run -n kube-public nginx --image=nginx:1.14 --port=80 --replicas=3
#发布服务
kubectl expose deployment -n kube-public nginx --port=80 --target-port=80 --name=ngin-service --type=NodePort
#获取服务的pod和service 信息
kubectl get pod,svc -n kube-public
#f范围cluster ip 或者nodeip:nodeport 3次,查看nginx的版本都是1.14.2
curl -I 10.1.216.211
3.2.1 更新deployment版本,并配置暂停deploymen
复制#另开一个master 终端,观察
kubectl get pods -n kube-public -w
#在第一个master终端将nginx升级到1.15.1 ,并配置藏听
kubectl set image -n kube-public deployment.apps/nginx nginx=nginx:1.15 && \
kubectl rollout -n kube-public pause deployment/nginx
#切换到第二个master终端查看
#查看运行的pod(此时有四个pod在运行)
kubectl get pods -n kube-public
3.2.2 访问测试,查看版本号
复制#访问cluster ip 4 次。查看nginx的版本号
curl -I 10.1.216.211
3.2.3 在确保更新的pod没有问题后,继续更新
复制#让deployment 继续更新
kubectl rollout -n kube-public resume deployment nginx
#使用clusterip 访问,查看nginx的版本号
curl -I 10.1.216.211
3.2.4 查看最后的更新情况
复制#查看pod 数量。发现回到了3个
kubectl get pods -n kube-public
#访问3 次以上,查看版本号
curl -I 10.1.216.211
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现