Kubernetes 资源控制管理

一、案例分析

1.1、案例概述

Kubectl 是一个用于操作 Kubernetes 集群的命令行接口,利用 Kubectl 的各种命令可以实现各种功能,在使用 Kubernetes 过程中是非常常用的工具。 

在 Kubernetes 中,一般使用 YAML 格式的文件来创建符合预期期望的 Pod,这样的 YAML 文件一般称之为资源清单。 

1.2、案例前置知识点 

 1)Kubectl 命令工具

Kubernetes 通过 kube-apiserver 成为整个 Kubernetes 集群管理的入口。API Server 是 Kubernetes 集群的主管理节点,用户通过 API Server 配置和组织集群,同时集群中各节点与 Etcd 存储的交互也是通过 API Server 来进行的。 

API Server 实现了一套 RESTfull 的接口,用户可以直接使用 API 与 API Server 进行交互。另外官方还提供了一个客户端 Kubectl 工具集打包,可直接通过 Kubectl 以命令行的方式与集群进行交互。

kubectl 命令行的语法如下所示。

kubectl  [command]  [TYPE]  [NAME]  [flags]

  • command:子命令,用于操作 Kubernetes 集群资源对象的命令。例如:create、delete、 describe、get、apply 等。
  • TYPE:资源对象的类型,区分大小写,能以单数、复数或者简写形式表示。例如:kubectl get pod pod1、kubectl get pods pod1、kubectl get po pod1 三种 TYPE 是等价的。
  • NAME:资源对象名称,区分大小写。如果不指定名称,系统则返回属于 TYPE 的全部对象列表,例如,执行 kubectl get pods 命令即可返回所有 Pod 的列表。 
  • flags:kubectl 子命令的可选参数,例如使用“-s”指定 API Server 的 URL 地址而不用默认值。

kubectl 的子命令非常丰富,涵盖了对 Kubernetes 集群的主要操作,包括资源对象的创建、删除、查看、修改、配置、运行等操作。详细的子命令如下表所示。 

类型子命令描述
基础命令create通过配置文件或标准输入(stdin)创建资源对象
expose将已经存在的 RC、Service、Deployment 或 Pod 暴露为一个新的 Service
run基于镜像在 Kubernetes 集群上启动一个 Deployment
set在资源对象上设置特定的功能
get显示一个或多个资源对象的概要信息
explain对资源对象属性的详细说明
edit编辑资源对象的属性,在线更新
delete通过配置文件、标准输入、资源名称或标签选择器删除资源
部署命令rollout管理资源的发布
rolling-update对给定的复制控制器进行滚动更新
scale扩容或缩容 Pod 数量,Deployment、ReplicaSet、RC 或 Job
autoscale对 Deployment、ReplicaSet、RC 进行水平自动扩容或缩容的设置
集群管理命令certificate修改证书资源
cluster-info显示集群信息
top显示资源(CPU/Memory/Storage)使用。需要 Heapster 运行
cordon标记节点不可调度
uncordon标记节点可调度
drain驱逐节点上的应用,准备下线维护
taint修改节点 taint 标记
故障诊断和调试命令describe显示特定资源对象或资源组的详细信息
logs在一个 Pod 中打印一个容器日志。如果 Pod 只有一个容器,容器名称是可选的
attach附加到一个运行的容器
exec执行命令到容器
port-forward映射本机的端口号到 Pod 的端口号
proxy运行一个 proxy 到 Kubernetes API server
cp拷贝文件或目录到容器中
auth检查授权
高级命令apply通过配置文件或标准输入对资源对象进行配置更新
patch使用补丁修改、更新资源的字段
replace通过配置文件或标准输入替换资源对象
convert不同的 API 版本之间转换配置文件
设置命令label更新资源上的标签
annotate更新资源上的注释
completion用于实现 Kubectl 工具自动补全
其他命令api-versions打印受支持的 API 版本
config修改 kubeconfig 文件(用于访问 API,比如配置认证信息)
help所有命令帮助
plugin运行一个命令行插件
version打印客户端和服务版本信息

2)资源清单 

Kubernetes 中所有的内容都被抽象为资源,资源实例化之后称之为对象。资源分为以下几种类型。 

  • 名称空间级别 

名称空间级别是仅在此名称空间下生效。例如:Kubernetes 的系统组件默认放在 kube-system 名称空间下,而 kubectl get pod 等价于 kubectl get pod -n default,因此查看不到 Kubernetes 的系统组件。 

名称空间级别的资源主要分为以下几种类型。 

1)工作负载型资源(workload) 

  • Pod:K8S 最小组成部分,共享网络栈共享存储卷;
  • ReplicaSet:RS,调度器、控制器,通过标签去控制 Pod 的创建、副本数量;
  • Deployment:控制器,通过控制 RS 的创建去创建 Pod;
  • StatefulSet:为有状态服务所建立的管理器;
  • DaemonSet:可以在每一个节点都运行一个 Pod 的组件;
  • Job:工作、任务;
  • CronJob:轮询工作、轮询任务,为批处理而生的。

2)服务发现及负载均衡型资源(ServiceDiscovery LoadBalance)

  • Service:服务(简称 svc),将服务暴露出去;Service 是后端真实服务的抽象,一个 Service 可以代表多个相同的后端服务;
  • Ingress:将服务暴露出去;Ingress 是反向代理规则,用来规定 HTTP/S 请求应该被转发到哪个 Service 上;

3)配置与存储型资源

  • Volume(存储卷):给 Pod 提供持久化的能力;
  • CSI:容器存储接口,可以扩展各种各样的第三方存储卷;

4)特殊类型的存储卷

  • ConfigMap:当配置中心来使用的资源类型,一般用来存储配置文件达到热更新的状态;
  • Secret:保存敏感数据,加密方案存储数据,一般用来保存密码文件、密钥等等;
  • DownwardAPI:把外部环境中的信息输出给容器,类似于 CS。

Kubernetes 一般都是通过定义资源清单的方式去创建资源,资源清单等价于剧本,写好每一步应该如何去做。 

  • 集群级别

不管在任何名称空间下定义,在其他的名称空间下都能看得到,在定义的时候无需指定名称空间。例如:Namespace(名称空间)、Node(节点)、Role(角色)、ClusterRole、 RoleBinding、ClusterRoleBinding。 

  • 元数据级别 

提供一个指标,不像是名称空间类型又不像集群级别,本质上更像是在两者之间,但是它有自己的特点,所以更应该作为一个单独的分类。一般根据指标进行对应的操作,例如: HPA、PodTemplate(Pod 模板)、LimitRange(资源限制)。 

3)资源清单常用字段解释 

  • 必要存在的属性 
参数名字段类型说明
versionStringKubernetes API 的版本,目前基本上是 v1,可以用 kubectl api-versions 命令查询。
kindStringYAML 文件定义的资源类型和角色,比如:Pod、 deployment、service。
metadataObject元数据对象,固定值为 metadata。
metadata.nameString元数据对象的名字,一般自主定义,如 Pod 的名字。
metadata.namespaceString元数据对象的命名空间,一般自主定义,如果不定义,默认使用"default"命名空间。
SpecObject详细定义对象,固定值为 Spec。

资源清单常用字段的必要属性 

  • 主要对象 
参数名字段类型说明
spec.containers[]ListSpect 对象的容器列表定义,是个列表。
spec.containers[].nameString定义容器的名字。
spec.containers[].imageString定义要用到的镜像名称。
spec.containers[]. imagePullPolicyString

定义镜像拉取策略,有 Always、Never、 ifNotPresent 三个值可选,默认值为 Always。

1)Always:表示每次都尝试从远程仓库重新拉取镜像。

2)Never:表示仅使用本地镜像,没有的话则不使用。

3)ifNotPresent:如果本地有镜像就使用本地镜像,没有就从远程仓库拉取镜像。

建议使用 ifNotPresent。

spec.containers[]. command[]List指定容器启动命令,可以指定多个。不指定则使用镜像打包时使用的启动命令。
spec.containers[].args[]List指定容器的启动命令参数,可以指定多个。
spec.containers[]. workingDirString定义容器的工作目录。
spec.containers[].volumeMounts[]List指定容器内部的存储卷配置。
spec.containers[]. volumeMounts[].nameString指定可以被容器挂载的存储卷名称。
spec.containers[]. volumeMounts[] .mountPathString指定可以被容器挂载的存储卷路径。
spec.containers[]. volumeMounts[]readOnlyString设置存储卷路径的读写模式,true 或者 false。
spec.containers[]. ports[]List指定容器需要用到的端口列表。
spec.containers[]. ports[].nameString指定端口名称。
spec.containers[]. ports[].containerPortString指定容器需要监听的端口号。
spec.containers[]. hostPortString指定容器所在主机需要监听的端口号,默认跟上面 containerPort 相同,注意设置 hostPort 同一台主机无法启动该容器的相同副本,因为主机的端口号不能相同,这样会冲突。
spec.containers[]. protocolString指定端口协议,支持 Tcp 和 UDP,默认为 TCP。
spec.containers[].env[]List指定容器运行前需设置的环境变量列表。
spec.containers[]. env[].nameString指定环境变量名称。
spec.containers[]. env[].valueString指定环境变量值。
spec.containers[].resourcesObject指定资源限制和资源请求的值。
spec.containers[]. resources.limitsObject指定设置容器运行时资源运行上限。
spec.containers[]. resources.limits.cpuString指定 CPU 的限制,单位为 core 数,将用于 docker run --cpu-shares 参数。
spec.containers[]. resources.limits.memoryString指定 MEM 内存的限制,单位为 MIB 或 GIB。
spec.containers[]. resources.requestsObject指定容器启动和调度时的限制设置。
spec.containers[].resources. requests.cpuStringCPU 请求,单位为 core 数,容器启动时初始化可用数量。
spec.containers[].resources. requests.memoryString内存请求,单位 MIB、GIB,容器启动的初始化可用数量。

资源清单常用字段的主要对象 

  • 额外参数选项 
参数名字段类型说明
spec.restartPolicyString

定义 Pod 的重启策略,可选值为 Always、OnFilure,默认值为 Always

1)Always:默认值。Pod 一旦终止运行,则无论容器是如何终止的,kubelet 服务都将重启它。

[Pod 里面运行的是容器,容器有可能会退出,容器退出, Pod 就会出现一个退出的状态,kubelet 是负责整个生命 周期,负责重启。如果是"Always"会一直重启,重启很多 次还是不行的话,默认是意外退出的,就不会在重启了]

2)OnFailure:只有 Pod 以非零退出码终止时,kubelet 才会重启该容器。如果容器正常结束(退出码为 0),则 kubelet 将不会重启它。

3)Never:Pod 终止后,kubelet 将退出码报告给 Master, 不会重启该 Pod。

spec.nodeSelectorObject定义 Node 的 Label 过滤标签,以 key:value 格式指定
spec.imagePullsecretsObject定义 pull 镜像时使用 secret 名称,以 name:secrekey 格式指定
spec.hostNetworkBoolean定义是否使用主机网络模式,默认值为 false。设置 true 表示使用宿主机网络,不使用 docker 网桥,同时设置了 true 将无法再同一台宿主机上启动第二个副本

 资源清单常用字段的额外参数选项

4)YAML 语言 

YAML 语言是一个可读性高,用来表达数据序列的格式。YAML 是"YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。 

  • 基本语法 
  1. 缩进时不允许使用 Tab 键,只允许使用空格 [];
  2. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可;
  3. # 用于标识注释,从这个字符一直到行尾,都会被解释器忽略。 
  • 支持的数据结构 
  1. 对象:键值对的集合,又称为映射(mapping)/哈希(hashes)/ 字典(dictionary);
  2. 数组:一组按次序排列的值,又称为序列(sequence)/ 列表(list);
  3. 纯量(scalars):单个的、不可再分的值字符串。包括布尔值、整数、浮点数、Null、 时间、日期。 

1.3、案例环境 

1)本案例环境 

本案例环境如下表所示。 

主机操作系统主机名/IP地址主要软件及版本
masterCentOS 7.6 x86_64k8s-master/192.168.23.211kube-apiserver kube-controller-manager kube-scheduler Etcd Docker-ce-19.03.15 Docker-ce-cli-19.03.05
nodeCentOS 7.6 x86_64k8s-node01/192.168.23.212kubelet kube-proxy docker flannel Etcd Docker-ce-19.03.15 Docker-ce-cli-19.03.05
nodeCentOS 7.6 x86_64

k8s-node02/192.168.23.213

kubelet kube-proxy docker flannel Etcd Docker-ce-19.03.15 Docker-ce-cli-19.03.05

案例环境 

2)案例需求 

通过 Kubectl 工具与资源清单管理容器资源。 

3)案例实现思路

  • 使用 Kubectl 工具容器资源。
  • 通过资源清单管理容器资源。 

二、案例实施 

2.1、使用 Kubectl 工具容器资源 

Kubectl 是管理 K8S 集群的命令行工具,通过生成的 json 格式传递给 API Server 进行创建、查看、管理的操作。 

使用 kubectl --help 命令可以查看 Kubectl 帮助命令,其中包括基本命令、部署命令、 群集管理命令、调试命令以及高级命令等。查看并学习 Kubectl 帮助命令可以使用我们更加系统地了解 kubectl 命令。 

[root@k8s-master ~]# kubectl --help

在一个完整的项目周期中,包含创建->发布->更新->回滚->删除等过程,下面针对该过程依次进行操作命令的演示。 

查看命名空间

[root@k8s-master ~]# kubectl get namespace
NAME              STATUS   AGE
default           Active   2d21h
kube-node-lease   Active   2d21h
kube-public       Active   2d21h
kube-system       Active   2d21h

创建一个命名空间 

[root@k8s-master ~]# kubectl create namespace yjst29
namespace/yjst29 created

1)创建容器 

kubectl run 命令可以创建并运行一个或多个容器镜像,也可以创建一个 deployment 或 job 来管理容器。此命令和 docker run 相类似,也是实现容器镜像的创建,先从仓库中拉取基础镜像,然后对容器进行操作。kubectl run 的命令语法如下所示。 

kubectl  run  NAME  --image=image  [--env="key=value"]  [--port=port]  [--replicas=replicas]  [--dry-run=bool]  [--overrides=inline-json]  [--command]  -- [COMMAND]  [args...]  [options] 

上述命令语法中,各选项的作用分别如下所示。 

  • NAME:指定容器运行的名称;
  • Image:指定运行的基础镜像;
  • env:指定在容器中设置的环境参数;
  • port:指定容器暴露的端口;
  • replicas:指定启动容器设置的副本数;
  • dry-run:dry-run 值如果为 true,则只打印要发送的对象,而不发送它;
  • overrides:生成对象的内联 JSON 重写。如果非空,则用于覆盖生成的对象。要求对象提供有效的 apiVersion 字段。 

通过 kubectl run 命令创建 Nginx 容器, 指定名称为 nginx-deployment,指定基础镜像为 Nginx 目前最新版本,指定对外暴露的端口为 80 以及副本数为 3。Nginx 容器创建完成后使用 get pod 命令查看 Pod 的信息,可以发现确实有 3 个容器资源,并且处于 Running 状态。还可以查看 deployment,也显示的是 3。 

[root@k8s-master ~]# kubectl run nginx-deployment --image=nginx --port=80 --replicas=3 -n yjst29
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx-deployment created

-n 表示指定将容器创建到刚刚创建的 yjst29 命名空间,若不指定,默认容器创建在 default 命名空间。 

查看 pod 信息

[root@k8s-master ~]# kubectl get pod -n yjst29
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5567b746cd-bfvcm   1/1     Running   0          117s
nginx-deployment-5567b746cd-dh7br   1/1     Running   0          117s
nginx-deployment-5567b746cd-sglnk   1/1     Running   0          117s

2)发布服务 

容器资源创建完成,就需要完成发布工作,确保 Pod 能够提供服务,保证客户端能够正常访问,使用 kubectl expose 命令可以实现该目的。kubectl expose 的命令语法如下所示。 

kubectl  expose  (-f FILENAME | TYPE NAME)  [--port=port]  [--protocol=TCP|UDP]  [--target -port=number-or-name]  [--name=name]  [--external-ip=external-ip-of-service]  [--type=type] 

上述命令语法中,各选项的作用分别如下所示。 

  • -f:标识公开服务的资源的文件的文件名,目录或 URL;
  • TYPE NAME:指定 deployment 名称;
  • port:指定内部通信端口;
  • protocol:指定网络协议,tcp 或者 udp;
  • target-port:指定暴露在外部的端口;
  • name:指定最新创建的对象的名称;
  • external-ip:为 service 的外部 IP 地址;
  • type:指定此服务的类型 ClusterIP,NodePort,LoadBalancer 或 ExternalName, 默认 ClusterIP。 

通过 kubectl expose 命令创建 Service,设置内部通信端口和外部暴露的端口均为 80、 名称为 nginx-service、类型是 NodePort。 

[root@k8s-master ~]# kubectl expose deployment nginx-deployment --port=80 --target-port=80 --name=nginx-service --type=NodePort -n yjst29
service/nginx-service exposed

创建 Service 完后,就可以通过 kubectl get svc 命令查看到对外暴露的端口是 44837,内部通信的地址是 10.10.10.6。 

[root@k8s-master ~]# kubectl get pod,service -n yjst29
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-5567b746cd-bfvcm   1/1     Running   0          8m11s
pod/nginx-deployment-5567b746cd-dh7br   1/1     Running   0          8m11s
pod/nginx-deployment-5567b746cd-sglnk   1/1     Running   0          8m11s

NAME                    TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
service/nginx-service   NodePort   10.10.10.6   <none>        80:44837/TCP   64s

执行 kubectl get endpoints 查看容器自带的负载均衡。从执行结果可以得知容器自带的负载均衡分别是 172.17.42.2:80、172.17.42.3:80、172.17.43.2:80。 

[root@k8s-master ~]# kubectl get endpoints -n yjst29
NAME            ENDPOINTS                                      AGE
nginx-service   172.17.42.2:80,172.17.42.3:80,172.17.43.2:80   2m57s

执行 kubectl get pods 命令时加参数 -o wide 可以查看到 Node 真实节点上的分布。 

[root@k8s-master ~]# kubectl get pod -o wide -n yjst29
NAME                                READY   STATUS    RESTARTS   AGE   IP            NODE             NOMINATED NODE   READINESS GATES
nginx-deployment-5567b746cd-bfvcm   1/1     Running   0          10m   172.17.42.2   192.168.23.212   <none>           <none>
nginx-deployment-5567b746cd-dh7br   1/1     Running   0          10m   172.17.43.2   192.168.23.213   <none>           <none>
nginx-deployment-5567b746cd-sglnk   1/1     Running   0          10m   172.17.42.3   192.168.23.212   <none>           <none>

完成上述步骤就已经完成了发布,并且可以进行对其访问。 

 

 

3)版本更新 

一般来说,生产环境中的线上项目会随着时间的推进不断地进行更新、维护、版本升级、 兼容老版本。而此时如果需要对 Nginx 更换版本,就需要更新。 

执行以下命令可以得知,Nginx 是目前 Docker 仓库中最新的版本 1.25.5。 

[root@k8s-master ~]# kubectl get pod -n yjst29
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5567b746cd-bfvcm   1/1     Running   0          29m
nginx-deployment-5567b746cd-dh7br   1/1     Running   0          29m
nginx-deployment-5567b746cd-sglnk   1/1     Running   0          29m
[root@k8s-master ~]# kubectl exec nginx-deployment-5567b746cd-bfvcm -n yjst29 -- nginx -v
nginx version: nginx/1.25.5

通过 set 选项将 Nginx 版本换成 1.21.6,再监使用 -w 先处于监听状态进行听,更新速度快。如果不使用 Ctrl+c 中断监听,会一直持续。 

[root@k8s-master ~]# kubectl get deployment,pod -n yjst29
NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   3/3     3            3           32m

NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-5567b746cd-bfvcm   1/1     Running   0          32m
pod/nginx-deployment-5567b746cd-dh7br   1/1     Running   0          32m
pod/nginx-deployment-5567b746cd-sglnk   1/1     Running   0          32m

更新版本为 1.21.6 

[root@k8s-master ~]# kubectl set image deployment.apps/nginx-deployment nginx-deployment=nginx:1.21.6 -n yjst29
deployment.apps/nginx-deployment image updated

监听更新状态 

[root@k8s-master ~]# kubectl get pods -w -n yjst29
NAME                                READY   STATUS              RESTARTS   AGE
nginx-deployment-5567b746cd-bfvcm   1/1     Running             0          34m
nginx-deployment-5567b746cd-dh7br   1/1     Running             0          34m
nginx-deployment-5567b746cd-sglnk   1/1     Running             0          34m
nginx-deployment-699f8bff5b-tqs2j   0/1     ContainerCreating   0          29s
nginx-deployment-699f8bff5b-tqs2j   0/1     ErrImagePull        0          31s
nginx-deployment-699f8bff5b-tqs2j   0/1     ImagePullBackOff    0          44s
nginx-deployment-699f8bff5b-tqs2j   1/1     Running             0          76s
nginx-deployment-5567b746cd-sglnk   1/1     Terminating         0          34m
nginx-deployment-699f8bff5b-mvqkb   0/1     Pending             0          0s
nginx-deployment-699f8bff5b-mvqkb   0/1     Pending             0          0s
nginx-deployment-699f8bff5b-mvqkb   0/1     ContainerCreating   0          0s
nginx-deployment-5567b746cd-sglnk   0/1     Terminating         0          34m

查看新版本 

[root@k8s-master ~]# kubectl get pod -n yjst29
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-699f8bff5b-jbbvt   1/1     Running   0          43s
nginx-deployment-699f8bff5b-mvqkb   1/1     Running   0          97s
nginx-deployment-699f8bff5b-tqs2j   1/1     Running   0          2m53s
[root@k8s-master ~]# kubectl exec nginx-deployment-699f8bff5b-jbbvt -n yjst29 -- nginx -v
nginx version: nginx/1.21.6

4)版本回滚 

若想回滚到上一个版本可以使用 rollout 参数。 

使用 --help 查看 rollout 帮助信息 

[root@k8s-master ~]# kubectl rollout --help
Manage the rollout of a resource.
  
 Valid resource types include:

  *  deployments
  *  daemonsets
  *  statefulsets

Examples:
  # Rollback to the previous deployment
  kubectl rollout undo deployment/abc
  
  # Check the rollout status of a daemonset
  kubectl rollout status daemonset/foo

Available Commands:
  history     显示 rollout 历史
  pause       标记提供的 resource 为中止状态
  restart     Restart a resource
  resume      继续一个停止的 resource
  status      显示 rollout 的状态
  undo        撤销上一次的 rollout

Usage:
  kubectl rollout SUBCOMMAND [options]

Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).

通过 history 查看历史信息 

[root@k8s-master ~]# kubectl rollout history deployment.apps/nginx-deployment -n yjst29
deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>


[root@k8s-master ~]# kubectl rollout history deployment.apps/nginx-deployment -n yjst29 --revision=1
deployment.apps/nginx-deployment with revision #1
Pod Template:
  Labels:	pod-template-hash=5567b746cd
	run=nginx-deployment
  Containers:
   nginx-deployment:
    Image:	nginx
    Port:	80/TCP
    Host Port:	0/TCP
    Environment:	<none>
    Mounts:	<none>
  Volumes:	<none>

[root@k8s-master ~]# kubectl rollout history deployment.apps/nginx-deployment -n yjst29 --revision=2
deployment.apps/nginx-deployment with revision #2
Pod Template:
  Labels:	pod-template-hash=699f8bff5b
	run=nginx-deployment
  Containers:
   nginx-deployment:
    Image:	nginx:1.21.6
    Port:	80/TCP
    Host Port:	0/TCP
    Environment:	<none>
    Mounts:	<none>
  Volumes:	<none>

通过 undo 回滚 (默认回滚到前一个版本,指定回滚版本加 --to-revision=版本编号)

[root@k8s-master ~]# kubectl rollout undo deployment.apps/nginx-deployment -n yjst29
deployment.apps/nginx-deployment rolled back

通过 status 检查回滚 

[root@k8s-master ~]# kubectl rollout status deployment.apps/nginx-deployment -n yjst29
deployment "nginx-deployment" successfully rolled out

从上面可以看出,已经回滚成功 

查看状态

[root@k8s-master ~]# kubectl get pods -n yjst29
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5567b746cd-28752   1/1     Running   0          3m4s
nginx-deployment-5567b746cd-gn5g6   1/1     Running   0          3m49s
nginx-deployment-5567b746cd-tlqns   1/1     Running   0          3m27s

查看版本号 

[root@k8s-master ~]# kubectl exec nginx-deployment-5567b746cd-28752 -n yjst29 -- nginx -v
nginx version: nginx/1.25.5

可以看到,版本已经回滚到 1.25.5 

5)删除资源 

通过以上步骤,完成了创建、发布、更新、回滚操作,接下来进行删除操作。 

查看 deployment 信息

[root@k8s-master ~]# kubectl get deployment -n yjst29
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           25h

查看 service 信息 

[root@k8s-master ~]# kubectl get service -n yjst29
NAME            TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
nginx-service   NodePort   10.10.10.6   <none>        80:44837/TCP   25h

删除 service  

[root@k8s-master ~]# kubectl delete service/nginx-service -n yjst29
service "nginx-service" deleted

删除 deployment

[root@k8s-master ~]# kubectl delete deployment/nginx-deployment -n yjst29
deployment.apps "nginx-deployment" deleted

删除命名空间

[root@k8s-master ~]# kubectl get namespace
NAME              STATUS   AGE
default           Active   4d
kube-node-lease   Active   4d
kube-public       Active   4d
kube-system       Active   4d
yjst29            Active   26h
[root@k8s-master ~]# kubectl delete namespace yjst29
namespace "yjst29" deleted
[root@k8s-master ~]# kubectl get namespace
NAME              STATUS   AGE
default           Active   4d
kube-node-lease   Active   4d
kube-public       Active   4d
kube-system       Active   4d

 

6)查看资源使用情况 

通过 describe 可以查看较为详细的容器资源使用情况,包括一些错误信息都能检测出来。 

创建命名空间 

[root@k8s-master ~]# kubectl create namespace yjst29
namespace/yjst29 created

创建容器

[root@k8s-master ~]# kubectl run nginx --image=nginx:latest --port=80 --replicas=2 -n yjst29
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx created

查看 pod

[root@k8s-master ~]# kubectl get pod -n yjst29
NAME                    READY   STATUS    RESTARTS   AGE
nginx-dd6b5d745-gtsdj   1/1     Running   0          30s
nginx-dd6b5d745-xjvm9   1/1     Running   0          30s

查看容器详细资源使用情况

[root@k8s-master ~]# kubectl describe pod nginx-dd6b5d745-gtsdj -n yjst29
Name:         nginx-dd6b5d745-gtsdj
Namespace:    yjst29
Node:         192.168.23.212/192.168.23.212
Start Time:   Fri, 17 May 2024 13:55:54 +0800
Labels:       pod-template-hash=dd6b5d745
              run=nginx
Annotations:  <none>
Status:       Running
IP:           172.17.42.2
IPs:
  IP:           172.17.42.2
Controlled By:  ReplicaSet/nginx-dd6b5d745
Containers:
  nginx:
    Container ID:   docker://f2795123a629ce195c8702bf4b1fe1039ffbb7c1b8a8e6f6ec4c9b427c8910fc
    Image:          nginx:latest
    Image ID:       docker-pullable://nginx@sha256:a484819eb60211f5299034ac80f6a681b06f89e65866ce91f356ed7c72af059c
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Fri, 17 May 2024 13:56:17 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-xbtwx (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-xbtwx:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-xbtwx
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     <none>
Events:
  Type    Reason     Age        From                     Message
  ----    ------     ----       ----                     -------
  Normal  Scheduled  <unknown>  default-scheduler        Successfully assigned yjst29/nginx-dd6b5d745-gtsdj to 192.168.23.212
  Normal  Pulling    103s       kubelet, 192.168.23.212  Pulling image "nginx:latest"
  Normal  Pulled     82s        kubelet, 192.168.23.212  Successfully pulled image "nginx:latest"
  Normal  Created    82s        kubelet, 192.168.23.212  Created container nginx
  Normal  Started    82s        kubelet, 192.168.23.212  Started container nginx

查看 deployment 资源

[root@k8s-master ~]# kubectl describe deployment/nginx -n yjst29
Name:                   nginx
Namespace:              yjst29
CreationTimestamp:      Fri, 17 May 2024 13:55:54 +0800
Labels:                 run=nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               run=nginx
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  run=nginx
  Containers:
   nginx:
    Image:        nginx:latest
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-dd6b5d745 (2/2 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  2m40s  deployment-controller  Scaled up replica set nginx-dd6b5d745 to 2

7)执行容器命令 

进入 pod。使用 exec 可以进入容器,完成相关操作。 

[root@k8s-master ~]# kubectl exec -it nginx-dd6b5d745-gtsdj /bin/bash -n yjst29
root@nginx-dd6b5d745-gtsdj:/# ls
bin  boot  dev	docker-entrypoint.d  docker-entrypoint.sh  etc	home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@nginx-dd6b5d745-gtsdj:/# /etc/init.d/nginx status
nginx is running.
root@nginx-dd6b5d745-gtsdj:/# nginx -v
nginx version: nginx/1.25.5

2.2、通过资源清单管理容器资源 

前面介绍了使用 kubectl 命令创建容器资源方法。基于这种命令方式创建容器资源,优点在于简单直观快捷、上手比较快,适合临时测试或实验。除了 kubectl 命令方式创建资源之外,还可以通过 YAML 配置文件来创建容器资源。 

基于 YAML 配置文件创建容器资源的方式,优点在于配置文件提供了创建资源的模板, 能够重复部署,可以像管理代码一样管理部署,适合正式的、跨环境的、规模化部署。 

YAML 语法格式:

  • 缩进标识层级关系;
  • 不支持制表符缩进,使用空格缩进;
  • 通常开头缩进两个空格;
  • 字符后缩进一个空格,如冒号、逗号等;
  • “---”表示 YAML 格式,一个文件的开始;
  • “#”表示注释。

通过 kubectl api-versions 查看以 group/version 的格式显示服务器所支持的 API 版本。 

[root@k8s-master ~]# kubectl api-versions
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
discovery.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1

1)创建 deployment 资源清单 

在创建 Deployment 资源清单之前先创建 demo 目录,用于存放资源清单的文件。在创建的 nginx-deployment 资源清单中,定义以下信息。 

  • kind:指定资源类型为 deployment;
  • metadata:为元数据对象;
  • name:指定资源 deployment 的名称;
  • labels:为标签,定义标签选择器为 app: web01,和 template 定义的遥相呼应,目的在于明确标识对象的属性。启动 Pod 的时候,通过 nodeSelector 指定要调度到 的 node 节点的标签;
  • spec:为详细定义对象;
  • replicas:定义副本数为 3;
  • matchLabels:用于定义一组 Label,与直接写在 Selector 中作用相同。matchExpression 用于定义一组基于集合的筛选条件,可用的条件运算符包括:In、 NotIn、Exists 和 DoesNotExist; 
  • template:为模板,这里是 Pod 的定义。定义标签选择器为 app: web01,容器名称为 web01,为镜像 nginx:latest(最新版本),对外暴露的端口为 80。
[root@k8s-master ~]# mkdir demo
[root@k8s-master ~]# cd demo/
[root@k8s-master demo]# vim web01.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web01
  namespace: yjst29
  labels:
    app: web01
spec:
  selector:
    matchLabels:
      app: web01
  replicas: 2
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: web01
    spec:
      # initContainers:
        # Init containers are exactly like regular containers, except:
          # - Init containers always run to completion.
          # - Each init container must complete successfully before the next one starts.
      containers:
      - name: web01
        image: nginx:latest
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort:  80
          name: web01

        volumeMounts:
        - name: localtime
          mountPath: /etc/localtime
      volumes:
        - name: localtime
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai
      restartPolicy: Always

创建完 Deployment 的资源清单之后,使用 create 执行资源清单来创建容器。

[root@k8s-master demo]# kubectl create -f web01.yaml 
deployment.apps/web01 created

通过 get pods 可以查看到 Pod 容器资源已经自动创建完成。 

[root@k8s-master demo]# kubectl get pod -n yjst29
NAME                     READY   STATUS    RESTARTS   AGE
nginx-dd6b5d745-gtsdj    1/1     Running   0          16m
nginx-dd6b5d745-xjvm9    1/1     Running   0          16m
web01-76cfcb78b9-mmkth   1/1     Running   0          61s
web01-76cfcb78b9-v9s5v   1/1     Running   0          61s

2)创建 service 资源清单 

在创建的 nginx-service 资源清单中,定义名称为 web01-service 的 Service、标签选择器为 app: web01、type 为 NodePort 指明外部流量可以访问内部容器。在 ports 中定义暴露的端口库号列表,对外暴露访问的端口是 80,容器内部的端口也是 80。 

[root@k8s-master demo]# vim web01-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: web01-service
  namespace: yjst29
spec:
  selector:
    app: web01
  type: NodePort
  sessionAffinity: None
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800
  ports:
  - name: web01-service
    protocol: TCP
    port: 80
    targetPort: 80
    # If you set the `spec.type` field to `NodePort` and you want a specific port number,
    # you can specify a value in the `spec.ports[*].nodePort` field.
    #nodePort:

[root@k8s-master demo]# kubectl create -f web01-service.yaml 
service/web01-service created
[root@k8s-master demo]# kubectl get pod -o wide -n yjst29
NAME                     READY   STATUS    RESTARTS   AGE     IP            NODE             NOMINATED NODE   READINESS GATES
nginx-dd6b5d745-gtsdj    1/1     Running   0          23m     172.17.42.2   192.168.23.212   <none>           <none>
nginx-dd6b5d745-xjvm9    1/1     Running   0          23m     172.17.43.2   192.168.23.213   <none>           <none>
web01-76cfcb78b9-mmkth   1/1     Running   0          8m36s   172.17.43.3   192.168.23.213   <none>           <none>
web01-76cfcb78b9-v9s5v   1/1     Running   0          8m36s   172.17.42.3   192.168.23.212   <none>           <none>
[root@k8s-master demo]# kubectl get svc -n yjst29
NAME            TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
web01-service   NodePort   10.10.10.68   <none>        80:37277/TCP   118s

使用浏览器访问

  • 28
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值