一、案例分析
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)资源清单常用字段解释
- 必要存在的属性
参数名 | 字段类型 | 说明 |
version | String | Kubernetes API 的版本,目前基本上是 v1,可以用 kubectl api-versions 命令查询。 |
kind | String | YAML 文件定义的资源类型和角色,比如:Pod、 deployment、service。 |
metadata | Object | 元数据对象,固定值为 metadata。 |
metadata.name | String | 元数据对象的名字,一般自主定义,如 Pod 的名字。 |
metadata.namespace | String | 元数据对象的命名空间,一般自主定义,如果不定义,默认使用"default"命名空间。 |
Spec | Object | 详细定义对象,固定值为 Spec。 |
资源清单常用字段的必要属性
- 主要对象
参数名 | 字段类型 | 说明 |
spec.containers[] | List | Spect 对象的容器列表定义,是个列表。 |
spec.containers[].name | String | 定义容器的名字。 |
spec.containers[].image | String | 定义要用到的镜像名称。 |
spec.containers[]. imagePullPolicy | String | 定义镜像拉取策略,有 Always、Never、 ifNotPresent 三个值可选,默认值为 Always。 1)Always:表示每次都尝试从远程仓库重新拉取镜像。 2)Never:表示仅使用本地镜像,没有的话则不使用。 3)ifNotPresent:如果本地有镜像就使用本地镜像,没有就从远程仓库拉取镜像。 建议使用 ifNotPresent。 |
spec.containers[]. command[] | List | 指定容器启动命令,可以指定多个。不指定则使用镜像打包时使用的启动命令。 |
spec.containers[].args[] | List | 指定容器的启动命令参数,可以指定多个。 |
spec.containers[]. workingDir | String | 定义容器的工作目录。 |
spec.containers[].volumeMounts[] | List | 指定容器内部的存储卷配置。 |
spec.containers[]. volumeMounts[].name | String | 指定可以被容器挂载的存储卷名称。 |
spec.containers[]. volumeMounts[] .mountPath | String | 指定可以被容器挂载的存储卷路径。 |
spec.containers[]. volumeMounts[]readOnly | String | 设置存储卷路径的读写模式,true 或者 false。 |
spec.containers[]. ports[] | List | 指定容器需要用到的端口列表。 |
spec.containers[]. ports[].name | String | 指定端口名称。 |
spec.containers[]. ports[].containerPort | String | 指定容器需要监听的端口号。 |
spec.containers[]. hostPort | String | 指定容器所在主机需要监听的端口号,默认跟上面 containerPort 相同,注意设置 hostPort 同一台主机无法启动该容器的相同副本,因为主机的端口号不能相同,这样会冲突。 |
spec.containers[]. protocol | String | 指定端口协议,支持 Tcp 和 UDP,默认为 TCP。 |
spec.containers[].env[] | List | 指定容器运行前需设置的环境变量列表。 |
spec.containers[]. env[].name | String | 指定环境变量名称。 |
spec.containers[]. env[].value | String | 指定环境变量值。 |
spec.containers[].resources | Object | 指定资源限制和资源请求的值。 |
spec.containers[]. resources.limits | Object | 指定设置容器运行时资源运行上限。 |
spec.containers[]. resources.limits.cpu | String | 指定 CPU 的限制,单位为 core 数,将用于 docker run --cpu-shares 参数。 |
spec.containers[]. resources.limits.memory | String | 指定 MEM 内存的限制,单位为 MIB 或 GIB。 |
spec.containers[]. resources.requests | Object | 指定容器启动和调度时的限制设置。 |
spec.containers[].resources. requests.cpu | String | CPU 请求,单位为 core 数,容器启动时初始化可用数量。 |
spec.containers[].resources. requests.memory | String | 内存请求,单位 MIB、GIB,容器启动的初始化可用数量。 |
资源清单常用字段的主要对象
- 额外参数选项
参数名 | 字段类型 | 说明 |
spec.restartPolicy | String | 定义 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.nodeSelector | Object | 定义 Node 的 Label 过滤标签,以 key:value 格式指定 |
spec.imagePullsecrets | Object | 定义 pull 镜像时使用 secret 名称,以 name:secrekey 格式指定 |
spec.hostNetwork | Boolean | 定义是否使用主机网络模式,默认值为 false。设置 true 表示使用宿主机网络,不使用 docker 网桥,同时设置了 true 将无法再同一台宿主机上启动第二个副本 |
资源清单常用字段的额外参数选项
4)YAML 语言
YAML 语言是一个可读性高,用来表达数据序列的格式。YAML 是"YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
- 基本语法
- 缩进时不允许使用 Tab 键,只允许使用空格 [];
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可;
- # 用于标识注释,从这个字符一直到行尾,都会被解释器忽略。
- 支持的数据结构
- 对象:键值对的集合,又称为映射(mapping)/哈希(hashes)/ 字典(dictionary);
- 数组:一组按次序排列的值,又称为序列(sequence)/ 列表(list);
- 纯量(scalars):单个的、不可再分的值字符串。包括布尔值、整数、浮点数、Null、 时间、日期。
1.3、案例环境
1)本案例环境
本案例环境如下表所示。
主机 | 操作系统 | 主机名/IP地址 | 主要软件及版本 |
master | CentOS 7.6 x86_64 | k8s-master/192.168.23.211 | kube-apiserver kube-controller-manager kube-scheduler Etcd Docker-ce-19.03.15 Docker-ce-cli-19.03.05 |
node | CentOS 7.6 x86_64 | k8s-node01/192.168.23.212 | kubelet kube-proxy docker flannel Etcd Docker-ce-19.03.15 Docker-ce-cli-19.03.05 |
node | CentOS 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
使用浏览器访问