K8s3️⃣资源管理
1、资源管理
K8s 本质是一组服务器集群,万物皆资源对象
通过操作资源对象,实现对 K8s 的管理。
示例:(下划线粗体部分是资源)
-
部署服务:在 Pod 中运行容器,在容器中部署微服务应用。
-
访问服务:通过 K8s 提供的 Service。
-
数据持久化:通过 K8s 提供的存储系统。
2、资源管理方式
关于
kubectl
命令,见👉 本文附 1
Hint:对同一个资源对象的单次操作,只能选用其中一种方式。
-
指令式命令:直接使用命令操作资源。
-
对象配置:先编写配置文件,再使用命令操作资源(指令式、声明式)。
指令式命令 对象配置(指令式) 对象配置(声明式) 操作方式 命令 + 追加选项 命令 + 配置文件 apply + 配置文件 操作对象 活跃对象 单个文件 目录 适用环境 测试、开发 生产 生产 审计和跟踪(历史记录) ❌ ✔ ✔ 复用性(模板) ❌ ✔ ✔ 其它 简单易用 项目庞大时配置文件多,操作麻烦 不易于调试
2.1、指令式命令
指令式命令:命令 + 追加选项
以参数的形式,将选项追加在命令之后。
示例:创建一个 namespace 和 pod,演示基本命令。
2.1.1、创建 ns
创建并查看 namespace
# 创建 kubectl create namespace 名称 # 查看 kubectl get namespace
-
列出 ns
-
创建一个名为 temp 的 ns,查看
2.1.2、创建 Pod
操作 Pod 时,若没有指定
ns
,默认是 default。
-
创建并运行一个 Pod
-
run
通过 pod 控制器运行 Pod -
--image
指定 Nginx 最新镜像,-n
指定 ns 为 temp -
若创建 Pod 时没有指定 ns,默认属于 default。
kubectl run pod --image=nginx:latest -n temp
-
-
查看 Pod
-
若没有指定任何参数,默认列出 default 命名空间下的 Pod。
-
参数可搭配使用,更多参数👉
kubectl get --help
。# default下的 kubectl get pod # 指定ns下的 kubectl get pod -n 命名空间 # 指定名称 kubectl get pod 名称 # 以yaml格式展示 kubectl get pod pod_name -o yaml
-
-
-
查看 Pod 创建过程
-
kubectl describe pod 名称 -n 命名空间
-
2.1.3、删除
删除 Pod 和 ns
# 指定pod名称 kubectl delete pod 名称 # 指定ns名称 kubectl delete namespace 名称
-
Pod:原来的 Pod 被删除,但 Pod 控制器启动了一个新的 Pod
-
ns:ns 和 Pod 均被删除。
2.2、对象配置(❗)
Hint:在配置文件中定义对象的属性选项(推荐 YAML)
2.2.1、指令式
指令式对象配置:命令 + 配置文件
需指定命令,即对资源的操作(见 2.1)。
示例:定义配置文件,实现 3.1 中的案例命令。
① YAML 文件
# ns
apiVersion: v1
kind: Namespace
metadata:
name: temp
---
# Pod
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: temp
spec:
containers:
- name: nginx-containers
image: nginx:latest
② 创建:create
-
kubectl 根据指定的 create 指令,
-f
指定 nginx.yaml 文件,创建资源。kubectl create -f nginx.yaml
-
若重复执行指令,会提示资源已创建。
③ 查看:get
-
kubectl 根据指定给的
get
指令,-f
指定 nginx.yaml 文件,查看资源 -
查看 pod 和 ns
④ 删除:delete
-
kubectl 根据指定给的
delete
指令,-f
指定 nginx.yaml 文件,删除资源 -
删除资源后(未创建资源时),再次执行删除(查询)指令,会提示资源不存在。
2.2.2、声明式
声明式对象配置:apply 命令 + 配置文件
无需指定对资源的操作,kubectl 会自动检测创建/更新/删除。
① YAML 文件
(同 3.2.1)
# ns
apiVersion: v1
kind: Namespace
metadata:
name: temp
---
# Pod
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: temp
spec:
containers:
- name: nginx-containers
image: nginx:latest
② apply 指令
kubectl apply -f 文件名
-
kubectl 检测到资源未创建,创建资源。
-
kubectl 检测到资源已创建、配置文件未变动,没有任何变动。
-
修改配置文件
-
修改 Nginx 版本,再次执行 apply 指令。
-
kubectl 检测到资源已创建、配置文件有变动,更新配置。
-
-
查看 Pod 资源情况:注意 Nginx 版本变化
-
kubectl describe pod 名称 -。n 命名空间
-
最佳实践(❗)
如何正确选用资源管理方式?
适用场景 | 命令 | |
---|---|---|
指令式命令 | 查询 | kubectl get(describe) 资源名称 |
对象配置(指令式) | 删除 | kubectl delete -f XXX.yaml |
对象配置(声明式) | 创建,更新 | kubectl apply -f XXX.yaml |
附
1、kubectl(❗)
与 K8s 集群的控制面板(master)进行通信的命令行工具,用于管理资源。
语法: (kubectl 命令补全见附 2)
-
command:对资源执行的操作
-
TYPE:资源类型(不区分大小写/单复数/缩写)
-
NAME:资源名称(可选,大小写敏感)
-
flags:选项/参数(可选)
kubectl [command] [TYPE] [NAME] [flags]
1.1、操作(command)
Hint:输入
kubectl help
查看可用操作。
常用操作如下:
① 基本
含义 | |
---|---|
create | 创建资源 |
expose | 暴露服务端口 |
run | 运行镜像(容器) |
get | 获取资源 |
edit | 编辑资源 |
delete | 删除资源 |
② 部署 & 排错 & 调试
含义 | |
---|---|
cluster-info | 集群信息 |
describe | 描述资源详情 |
logs | 查看容器在 Pod 中的日志 |
attach | 进入运行中的容器 |
exec | 在容器中执行命令 |
cp | 在容器内外复制文件 |
③ 高级 & 设置
含义 | |
---|---|
apply | 对资源应用指定配置 |
patch | 更新资源的信息 |
replace | 覆盖资源 |
label | 更新资源标签 |
④ 其它
含义 | |
---|---|
api-resources | 列出服务器支持的 API 资源 |
api-versions | 列出服务器支持的 API 版本 |
version | 列出 Client 和 Server 版本 |
1.2、类型(TYPE)
Hint:通过
kubectl api-resources
查看可用资源类型。
常见资源如下:
① 集群级别
缩写 | |
---|---|
namespace | ns |
nodes | no |
② Pod 相关
缩写 | |
---|---|
Pods | po |
replicationcontrollers | rc |
daemonsets | ds |
deployments | deploy |
replicasets | rs |
statefulsets | sts |
horizontalpodautoscalers | hpa |
cronjobs | cj |
jobs |
③ 服务发现
缩写 | |
---|---|
services | svc |
ingresses | ing |
④ 存储资源
缩写 | |
---|---|
volumeattachments | |
persistentvolumeclaims | pvc |
persistentvolumes | pv |
⑤ 配置资源
作用 | |
---|---|
configmaps | cm |
secrets |
1.3、选项(flag)
kubectl
命令默认输出为纯文本格式,使用
-o
(--output
)选项,指定详细信息
常用输出选项值:
含义 | |
---|---|
-o json | JSON 格式输出 |
-o name | 仅输出资源名称 |
-o wide | 纯文本格式输出,包含所有附加信息 |
-o yaml | YAML 格式输出 |
除了
-o
,flag 有其它👉 输出选项
1
2、kubectl 命令补全
Linux 服务器默认没有
kubectl
的命令补全,需要额外配置。配置后,按
tab
即可实现命令补全。
-
安装
bash-completion
并执行yum install -y bash-completion source /usr/share/bash-completion/bash_completion
-
加载
kubectl completion
# 本次会话临时生效 source <(kubectl completion bash) # 重启会话后永久生效 echo "source <(kubectl completion bash)" >> ~/.bashrc
3、node 节点使用
kubectl
:与 K8s 集群的控制面板(master)进行通信的命令行工具,用于管理资源。
Q:kubectl 可以在 node 节点上运行吗 ?
A:可以(但不建议),仅需一个配置文件 👉 将 master 节点的 $HOME/.kube
文件,复制到 node 节点。
# 在master节点执行以下命令
scp -r HOME/.kube node1: HOME/