Kubernetes实战系列文章(三) 之 K8S运维常用命令

目录

1、K8S集群控制命令

(1)、集群&节点

(2)、命名空间

(3)、Pod操作

(4)、Ddeployment操作

(5)、service操作

2、crictl工具常用命令

(1)、信息与状态相关内容

(2)、镜像相关操作

(3)、Pod沙箱操作(pause容器)

(4)、业务容器操作

3、containerd原生工具ctr常用命令

(1)、命名空间操作

(2)、镜像管理images(简写i)

(3)、实战小示例


1、K8S集群控制命令

基础通用语法:

复制代码
kubectl [command] [TYPE] [NAME] [flags]

参数详解:
[command]: 指操作动作get/create/delete/describe/apply/logs/exec;
[TYPE]: 指资源类型pod/deployment/service/namespace/node;
[NAME]: 指资源名称,省略则列出全部资源;
[flags]: 可选参数,命名空间、输出格式、过滤等。
    通用高频参: 
        -n/--namespace <命名空间名称>: 指定命名空间,不写默认是t命名空间"defaul";
        -A/--all-namespaces: 查看所有命名空间资源;
        -o wide: 宽格式输出,显示更多信息(节点、IP);
        -o yaml: 输出yaml格式资源定义;
        -o json: 输出json格式;
        --dry-run=client: 客户端模拟执行,不真正创建资源,调试用;
        --help: 查看该命令完整帮助。

(1)、集群&节点

  • 查看集群版本信息

    root@controller:~# kubectl version

  • 查看集群节点信息

    root@controller:~# kubectl get nodes
    root@controller:~# kubectl get nodes -o wide

  • 查看集群某个节点详细信息

    root@controller:~# kubectl describe node controller

    此处controller为集群节点名称。

  • 查看K8S可操作的API资源

    root@controller:~# kubectl api-resources

(2)、命名空间

  • 获取所有命名空间

    root@controller:~# kubectl get namespace

  • 创建命名空间

    root@controller:~# kubectl create namespace test

    test是命名空间的名称,可以自定义。

  • 删除命名空间

    root@controller:~# kubectl delete namespace test

    此处删除名称为test的命名空间

(3)、Pod操作

  • 查看指定命名空间下的所有pod

    查看简要信息

    root@controller:~# kubectl get pods --namespace test-ns
    此处查看命名空间test-ns下的所有pod

    输出更多信息

    root@controller:~# kubectl get pods --namespace test-ns -o wide
    此处查看命名空间test-ns下的所有pod

  • 查看指定pod的详细信息

    方式一

    root@controller:~# kubectl describe pod tomcat-deployment-54655d9bd7-bdtrn --namespace test-ns
    此处查看的是命名空间test-ns下的pod名称为tomcat-deployment-54655d9bd7-bdtrn的详细信息。

    方式二

    root@controller:~# kubectl get pod nginx-deployment-9fdcf75b8-gsffc --namespace test-ns -o yaml
    此处查看的是命名空间test-ns下的pod名称为nginx-deployment-9fdcf75b8-gsffc的详细信息。

需要重点关注的是最后的Events事件,主要输出pod的报错事件,如镜像拉取失败、调度失败、CrashLoopBackOff 等都会在这里记录。

  • 查看指定pod的日志

    root@controller:~# kubectl logs -f --tail=10 tomcat-deployment-54655d9bd7-w6hmf --namespace test-ns
    参数说明:
    -f: 实时跟踪日志流(类似tail -f);
    --tail=10: 只取最后10行日志;
    tomcat-deployment-54655d9bd7-w6hmf: 此处查询的pod名称;
    -c <容器名>: 一个pod有多个容器时,指定查看日志的容器。

  • 进入pod容器内部

    root@controller:~# kubectl exec -it nginx-deployment-9fdcf75b8-gsffc -c nginx --namespace test-ns -- /bin/bash
    参数说明:
    -i: 保持标准输入打开;
    -t: 分配伪终端;
    nginx-deployment-9fdcf75b8-gsffc: 指定的pod名称;
    -c: 当pod中有多个容器时,后面跟的是pod中指定容器的名称,即spec.containers.name的值,此处是nginx;通过kubectl get pod nginx-deployment-9fdcf75b8-gsffc -n test-ns -o yaml命令可以查看到;
    --: 分割符,后面是容器内执行的命令,此处是/bin/bash;部分轻量镜像没有bash,可以用/bin/sh

  • 删除指定pod

    root@controller:~# kubectl delete pod tomcat-deployment-54655d9bd7-bdtrn --namespace test-ns
    根据pod名称tomcat-deployment-54655d9bd7-bdtrn删除pod

如果pod属于deployment控制器,删除pod会被控制器自动重建。

(4)、Ddeployment操作

  • 查询当前所有的deployment

    输出简要信息

    root@controller:~# kubectl get deployment --namespace test-ns

    输出详细信息

    root@controller:~# kubectl get deployment --namespace test-ns -o wide

  • 查看指定deployment的详细信息

    root@controller:~# kubectl describe deployment nginx-deployment --namespace test-ns

  • 创建deployment

    root@controller:~# kubectl create deployment mysql-deployment --image=mysql:8.4 --replicas=1 --namespace test-ns

    参数说明:
    kubectl: k8s命令行客户端工具,用来和apiserver交互;
    create: 资源创建子命令,新建k8s资源对象;
    deployment: 指创建的资源类型,此处创建Deployment控制器,用来管理Pod,实现副本维持、滚动更新等,Pod 挂掉会自动重建;
    mysql-deployment: 自定义的Deployment资源名称,后续删除、查询都用这个名称;
    --image=mysql:8.4: 指定容器的镜像,mysql是指镜像名,8.4是指镜像标签(版本);
    --replicas=1: 指副本数,启动1个mysql Pod实例,mysql-deployment会保证始终运行1个Pod。
    -namespace: 指将该deployment资源放到命名空间test-ns下。

  • 删除指定deployment

    root@controller:~# kubectl delete deployment mysql-deployment --namespace test-ns
    此处删除mysql-deployment

  • 调整指定deployment的副本数

    root@controller:~# kubectl scale deployment tomcat-deployment --replicas=3 --namespace test-ns
    此处将tomcat-deployment的副本调整为3个。

  • 更新deployment镜像版本

    root@controller:~# kubectl set image deployment nginx-deployment nginx=nginx:1.28 --namespace test-ns
    将nginx-deployment的镜像版本更新为nginx:1.28

nginx-deployment更新前镜像版本为nginx:1.26

nginx-deployment更新后镜像版本为nginx:1.28

(5)、service操作

  • 查看所有service

    root@controller:~# kubectl get service --namespace test-ns
    查看命名空间test-ns下的所有service

  • 将deployment暴露为Service(即创建service)

    将nginx-deployment暴露为Service

    root@controller:~# kubectl expose deployment nginx-deployment --name=nginx-service --type=NodePort --port=80 --target-port=80 --namespace test-ns

    参数说明:
    expose: 将Deployment后端Pod封装为Service,实现负载均衡、统一访问入口;
    deployment: 指定要暴露的资源类型;
    nginx-deployment: 指定要暴露的deployment的名称;
    --name=nginx-service: 指定Service的名称,不指定默认和deployment同名;
    --type=NodePort: 指定Service的类型;每个节点监听一个端口,节点IP+NodePort访问业务;
    --port=80: 指定Service服务的端口(集群内部访问service的端口);
    --target-port=80: 指定容器内部的端口,此处指定nginx容器内部监听80端口,流量转发到Pod容器的这个80端口;
    -namespace: 指将该service资源放到命名空间test-ns下。

    将外部访问端口更新为30080

    root@controller:~# kubectl patch service nginx-service --namespace test-ns -p '{"spec":{"ports":[{"port":80,"targetPort":80,"nodePort":30080}]}}'

  • 删除指定service

    root@controller:~# kubectl delete service tomcat-service --namespace test-ns
    删除命名空间test-ns下的tomcat-service


2、crictl工具常用命令

crictl工具用于对本机节点的镜像、Pod、业务容器等资源进行相关操作。

(1)、信息与状态相关内容

  • 查看crictl工具版本

    root@node01:~# crictl version

  • 查询containerd运行时信息

    root@node01:~# crictl info

  • 监控容器资源使用情况

    root@node01:~# crictl stats

(2)、镜像相关操作

  • 列出本地镜像

    root@node01:~# crictl images

由上可见,已经成功拉取httpd:2.4镜像到本地。

(3)、Pod沙箱操作(pause容器)

  • 查询所有的Pod沙箱

    列出所有pod沙箱

    root@node01:~# crictl pods

    根据指定的命名空间列出pod沙箱

    root@node01:~# crictl pods --namespace test-ns

  • 删除指定Pod沙箱

    root@node01:~# crictl rmp 6dd6a58f81394
    删除Pod ID为6dd6a58f81394的沙箱。

(4)、业务容器操作

  • 列出所有运行中的容器

    列出所有正在运行的容器

    root@node01:~# crictl ps

    列出所有容器,包括已停止的

    root@node01:~# crictl ps -a

    列出指定命名空间下的容器

    root@node01:~# crictl ps --namespace test-ns

  • 查看指定容器的详细信息

    root@node01:~# crictl inspect 0e42ee9ae774a
    此处查看容器ID为0e42ee9ae774a的详细信息。

  • 查看指定容器的日志信息

    查看指定容器的日志

    root@node01:~# crictl logs 0e42ee9ae774a

    实时查看指定容器的日志

    root@node01:~# crictl logs -f 0e42ee9ae774a

    查看指定容器最后10行日志

    root@node01:~# crictl logs --tail 10 0e42ee9ae774a

  • 进入指定容器内部命令行

    进入容器0e42ee9ae774a内部命令行

    root@node01:~# crictl exec -it 0e42ee9ae774a /bin/bash
    参数说明:
    -i: 保持标准输入打开;
    -t: 分配伪终端;
    /bin/bash: 此处也可以使用/bin/sh


3、containerd原生工具ctr常用命令

ctr是containerd自带的原生客户端工具,用于与containerd服务进行交互。ctr是containerd原生工具,没有 Pod 概念。K8s集群的镜像和容器放在"k8s.io"命名空间,操作k8s集群相关的资源时必须带上命名空间"--namespace k8s.io"。

(1)、命名空间操作

列出所有命名空间

复制代码
root@controller:~# ctr namespace list

(2)、镜像管理images(简写i)

  • 列出命名空间k8s.io下的本地镜像

    root@node01:~# ctr --namespace k8s.io images ls

ctr不会读取/etc/containerd/config.toml镜像加速器。crictl走CRI配置,会读取config.toml里面的mirror加速器。ctr(原生containerd命令)完全忽略CRI镜像加速配置,直接硬连docker.io官方地址,国内环境极易超时。ctr命令拉取镜像必须写完整镜像地址

复制代码
root@node01:~# ctr --namespace k8s.io images pull docker.io/library/nginx:1.26

若是私有http仓库,需要追加"--plain-http"参数
  • 给镜像打标签

    打标签

    root@node01:~# ctr --namespace k8s.io images tag docker.io/library/nginx:1.27 mynginx:1.0

    查询镜像

    root@node01:~# ctr --namespace k8s.io images ls | grep "mynginx:1.0"

  • 删除镜像

    root@node01:~# ctr --namespace k8s.io images rm mynginx:1.0

    此处删除镜像mynginx:1.0

  • 将本地镜像导出为tar包(离线使用)

    root@node01:~# ctr --namespace k8s.io images export nginx_1_26.tar docker.io/library/nginx:1.26
    root@node01:~# ll nginx_1_26.tar

  • 导出离线tar包

    root@node01:~# ctr --namespace k8s.io images import nginx_1_26.tar mynginx:1.26

  • 校验本地镜像完整性

    root@node01:~# ctr --namespace k8s.io images check

(3)、实战小示例

复制代码
# 1.拉取nginx镜像
ctr --namespace k8s.io images pull docker.io/library/nginx:1.27

# 2.创建容器定义
ctr --namespace k8s.io container create docker.io/library/nginx:1.27 test-nginx

# 3.启动task
ctr --namespace k8s.io task start -d test-nginx

# 4.查看运行task
ctr --namespace k8s.io task ls

# 5.进入容器
ctr --namespace k8s.io task exec --exec-id mysh -t test-nginx /bin/sh

# 6.退出后,停止、清理
ctr --namespace k8s.io task kill test-nginx
ctr --namespace k8s.io container rm test-nginx
ctr --namespace k8s.io images rm docker.io/library/nginx:1.27

相关推荐
fpcc1 小时前
计算机原理—Linux是如何加载可执行文件到内存
linux
码农客栈1 小时前
linux 设备树下的 platform 驱动编写
linux
小HANN1 小时前
Linux建站实战:CentOS7+LNMP 从零部署 ECShop 开源电商系统
linux·运维·服务器·经验分享
做运维的阿瑞1 小时前
Shell 脚本经典十三问:引号、变量、子 Shell 与重定向一次讲清问:引号、变量、子 Shell 与重定向一次讲清
linux·tcp/ip
昌原的儿子LEO2 小时前
Linux IO多路复用与SQLite数据库核心知识点总结
linux·数据库·oracle
GeW2 小时前
RHCE通关秘籍:从零基础到高分拿证的5个加速器
linux
前端世界2 小时前
基于 Linux 的本地 AI 智能问答平台搭建实践 —— Ollama + FastAPI + Nginx 实现本地大模型 Web 服务
linux·运维·人工智能
倔强的石头1062 小时前
【Linux指南】动静态库系列(七):符号表与重定位:链接器如何把函数调用接起来
linux·前端·javascript
山岚的运维笔记2 小时前
mysql 专业笔记 -- 第 8 章:使用变量
运维·数据库·笔记·后端·学习·mysql·dba