四、Kubernetes(k8s) 工作中的常用命令

本文详细介绍了Kubernetes中的命名空间(Namespace)和Pod的管理,包括命名空间的作用、查看与创建,以及Pod的基本操作、自愈、多副本、扩缩容和滚动更新等功能。强调了Deployment在Pod管理中的重要性,如提供声明式更新、自愈、故障转移、多副本管理和扩缩容能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Namespace

顾名思义,Namespace是命名空间的意思,在 Kubernetes 中,“命名空间(Namespace)” 提供一种机制,将同一集群中的资源划分为相互隔离的组。 同一命名空间内的资源名称要唯一,但跨命名空间时没有这个要求。 命名空间作用域仅针对带有命名空间的对象,例如 Deployment、Service、Pod 等, 这种作用域对集群访问的对象不适用,例如 StorageClass、Node、PersistentVolume 等。

1、查看Namespace

# 使用以下命令可以列出集群中所有现存的命名空间
kubectl get namespace

Kubernetes 会创建四个初始命名空间:

  • default: 没有指明使用其它命名空间的对象所使用的默认命名空间
  • kube-system: Kubernetes 系统创建对象所使用的命名空间
  • kube-public: 这个命名空间是自动创建的,所有用户(包括未经过身份验证的用户)都可以读取它。 这个命名空间主要用于集群使用,以防某些资源在整个集群中应该是可见和可读的。 这个命名空间的公共方面只是一种约定,而不是要求。
  • kube-node-lease: 此命名空间用于与各个节点相关的 租约(Lease)对象。 节点租期允许 kubelet 发送心跳,由此控制面能够检测到节点故障。

2、基本使用语法

# 创建命名空间  ns等价于namespace
kubectl create ns pangtaiyi

# 删除命名空间
kubectl delete ns pangtaiyi

# 更改默认命名空间名称(系统默认是default命名空间)
# 我们可以改成其他的命名空间
kubectl config set-context $(kubectl config current-context) --namespace=<新的命名空间>

3、使用请求参数

启动pod,指定pod 的命名空间,可以使用 --namespace 参数, 例如:

# 解释:在PangTaiYi命名空间下,运行一个Pod,Pod运行的镜像是Nginx
kubectl run nginx --image=nginx --namespace=PangTaiYi

# 解释:查询在PangTaiYi命名空间下,所有的Pod
kubectl get pods --namespace=PangTaiYi

# 也可以使用简写方式, --namespace = -n, 例如:
kubectl get pods -n=PangTaiYi
# 或者
kubectl get pods -n PangTaiYi

二、Pod

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元Pod 是一组(一个或多个)容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 所建模的是特定于应用的“逻辑主机”,其中包含一个或多个应用容器, 这些容器是相对紧密的耦合在一起的。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于在同一逻辑主机上运行的云应用。除了应用容器,Pod 还可以包含在 Pod 启动期间运行的 Init 容器。 你也可以在集群中支持临时性容器 的情况下,为调试的目的注入临时性容器。(注:通常工作中不需要直接创建 Pod,甚至单个实例的 Pod。因为会使用如 Deployment 或 Job 这类工作负载资源来创建 Pod。

1、获取Pod

# 1、获取Pod,默认获取default命名空间下的Pod
kubectl get pod

# 2、获取所有命名空间下的Pod(-A 区分大小写)
kubectl get pod -A

# 3、获取Pod的更加详细的信息,如下:
[root@master ~]# kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
my-dep-5b7868d854-6f9mz   1/1     Running   1          27h   10.244.1.8    node1   <none>           <none>
my-dep-5b7868d854-dklnq   1/1     Running   1          27h   10.244.1.7    node1   <none>           <none>
my-dep-5b7868d854-j5whk   1/1     Running   1          27h   10.244.1.10   node1   <none>           <none>
my-dep-5b7868d854-lx8nh   1/1     Running   1          23h   10.244.2.13   node2   <none>           <none>
my-dep-5b7868d854-n2gmq   1/1     Running   1          23h   10.244.2.11   node2   <none>           <none>
my-dep-5b7868d854-nd6bl   1/1     Running   1          27h   10.244.1.9    node1   <none>           <none>
my-dep-5b7868d854-p7nv8   1/1     Running   1          23h   10.244.2.12   node2   <none>           <none>
my-dep-5b7868d854-qz658   1/1     Running   1          23h   10.244.2.10   node2   <none>           <none>
my-dep-5b7868d854-sq65d   1/1     Running   1          23h   10.244.2.8    node2   <none>           <none>
my-dep-5b7868d854-zbbwf   1/1     Running   1          27h   10.244.1.11   node1   <none>           <none>

2、 操作Pod

# 1、创建Pod,运行一个nginx容器
kubectl run mynginx --image=nginx

# 2、删除Pod
kubectl delete mynginx

# 3、也可以通过yaml 文件来创建pod
kubectl apply -f <yaml文件地址>

3、查看Pod 的信息

# 1、获得Pod 的描述信息
kubectl describe pod <pod名称>

# 2、如果是其他命名空间下的pod,需要带上相应的命名空间
kubectl describe pod <pod名称> -n <命名空间名称>

# 3、当Pod 运行失败,可以查看pod的日志来查看运行日志
kubectl logs <Pod名称>

# 4、进入pod 的内部
kubectl exec -it mynginx -- /bin/bash

看到这里, 有Docker 基础的同学都发现了, 其实k8s 对于pod 的操作很像是 Docker 对于容器,镜像的操作。几乎没什么区别。由于 Pod 自身不具有自愈能力, 所以在工作中很少直接操作Pod ,所以这里就不过多介绍了。

三、Deployment

Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。由用户描述 Deployment 中的 目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态, 使其变为期望状态。你可以定义 Deployment 以创建新的 ReplicaSet,或删除现有 Deployment, 并通过新的 Deployment 收养其资源。(说简单点就是, Deployment可以控制Pod,使Pod拥有多副本,自愈,扩缩容等能力

1、自愈、故障转移

下面就使用基本的创建Pod的方式和Deployment 的方式创建Pod,来测试一下什么叫自愈能力。

# 前置环境:
# 运行一个Pod 和 一个Deploymnet
kubectl run mynginx --image=nginx
kubectl create deployment mynginx-deployment --image=nginx

可以看到, 两个pod 分别运行在Node1 和Node2 节点,下面就来进行测试。

1.1、误删除

同时删除两个pod,看会有什么效果,(注意:使用Deployment 方式创建pod所生成的名称 mynginx-deployment-679dd69446-h59xs) ​​​​

 可以看到, 同时删除两个pod , 普通方式删除之后就没了, Deployment 删除了pod 之后, 有重新拉起一个新的Pod。

1.2、宕机

如上图所示, 在node2 节点运行了两个Pod, 现在测试将node2节点宕机, 会有什么效果。

可以看到, Deployment方式创建的Pod, 在Node2节点宕机之后 ,又在Node1节点上拉起了一个新的Pod。所以就如我之前说的,在工作中使用Deployment方式比较多。

2、多副本

实际上多副本就是在创建 Deployment 的时候,可以指定创建自定义个Pod。例如:下面的语句可以一次性创建10 Pod。(这在部署集群环境的时候非常方便。)

# 创建是个nginx副本   --replicas后面跟副本数量
kubectl create deployment my-dep --image=nginx --replicas=10

3、扩缩容

扩缩容在实际工作中用的很多,例如:现在有1万个Pod(集群环境),双十一的时候,网站访问流量激增, 现有的配置无法维持系统的稳定运行,这个时候就需要对系统进行横向扩容,很简单, 下面的语句就可以让系统的Pod 从1万个扩容到2万个。

# 将Pod my-dep 扩容到2万个副本
kubectl scale --replicas=20000 deployment/my-dep

 双十一过了, 需要对系统进行缩容, 让系统继续维持 1万个Pod, 就只需要执行下面的命令, 又可以对系统进行缩容。

# 将Pod my-dep 缩容到1万个副本
kubectl scale --replicas=10000 deployment/my-dep

 4、滚动更新

在以往的工作中, 要想对一个系统进行版本更新, 需要将系统先暂停, 然后将发布后的程序更新上去, 一般都是这么搞的。但是这个方式有弊端, 那就是在更新的过程中, 程序不可用。 这在有些场景中是无法容忍的。

例如: 马上618购物狂欢节快到了, 各大电商平台又推出了抢红包的游戏。现有的系统版本是V.1.0,现在需要将系统升级到V.2.0 。那就可以使用滚动更新

# 语法:kubectl set image 工作负载方式/Pod名称 镜像名称=需要调整的镜像 --record
# --record 用作记录滚动更新的信息, 后面方便版本回退
kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record

 注意:上面语句的 nginx 是填写镜像的name 属性,可以使用“kubectl get deployment my-dep -oyaml” 来查看,结果如下图

5、版本回退 

 版本回退这个功能一般是当版本更新上去之后, 发现有问题, 需要将新版本进行回退到指定版本。这个回退也是“滚动”的。

1. 查看系统有哪些版本

我们在滚动更新的时候, 说过一个 “--record” 参数, 只有加了这个参数,更新的版本信息才会被记录下来。

# 查看系统有哪些历史版本
[root@master ~]# kubectl rollout history deployment/my-dep
deployment.apps/my-dep 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record=true
[root@master ~]# 

# 也可以单独查看某个历史详情
[root@master ~]# kubectl rollout history deployment/my-dep --revision=2
deployment.apps/my-dep with revision #2
Pod Template:
  Labels:       app=my-dep
        pod-template-hash=6b48cbf4f9
  Annotations:  kubernetes.io/change-cause: kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record=true
  Containers:
   nginx:
    Image:      nginx:1.16.1
    Port:       <none>
    Host Port:  <none>
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

2. 回滚

#回滚(回到上次)
kubectl rollout undo deployment/my-dep

#回滚(回到指定版本)
kubectl rollout undo deployment/my-dep --to-revision=2

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖太乙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值