什么是对象
K8s集群中创建的任何东西都可以被视为对象:Deployment、Pod、Service等等
对象类型
kubectl api-resources # 查询所有type
namespaces【命名空间,隔离Pod】
nodes【集群组成部分】
pods【装载容器】
deployments【Pod控制器】
services【统一Pod对外接口】
ingresses【统一Pod对外接口】
# 存储资源
csidrivers
csinodes
csistoragecapacities
storageclasses
volumeattachments
# 配置资源
configmaps
secrets
操作对象的指令
kubectl --help # 查询所有指令
create【创建资源】
get【显示资源】
delete【删除资源】
edit【编辑资源】
set【为对象设置指定特性】
run【在集群上运行特定镜像】
expose【暴露资源为Service】
describe【 显示特定资源或资源组的详细信息】
explain【显示资源文档】
logs【打印 Pod 中容器的日志】
attach【挂接到一个运行中的容器】
exec【在某个容器中执行一个命令】
port-forward【将一个或多个本地端口转发到某个 Pod】
proxy【运行一个指向 Kubernetes API 服务器的代理】
cp【在Pod内、外复制文件】
auth【检查授权】
debug【创建调试会话以排除工作负载和节点故障】
events【列出事件】
apply【根据文件名或stdin创建资源】
replace【根据文件名或stdin替换资源】
patch【更新资源】
diff【区分实时版本与潜在应用版本】
wait【Experimental: Wait for a specific condition on one or many resources】
kustomize【Build a kustomization target from a directory or URL】
label【更新某资源上的标签】
annotate【更新一个资源的注解】
completion【输出指定shell(bash、zsh、fish或powershell)的shell完成代码】
rollout【Manage the rollout of a resource】
scale【Set a new size for a deployment, replica set, or replication controller】
autoscale【Auto-scale a deployment, replica set, stateful set, or replication controller】
cluster-info【展示集群信息】
top【Display resource (CPU/memory) usage】
cordon【标记节点为不可调度】
uncordon【标记节点为可调度】
drain【 清空节点以准备维护】
taint【更新一个或者多个节点上的污点】
certificate【修改证书资源】
alpha【Commands for features in alpha】
api-resources【Print the supported API resources on the server】
api-versions【Print the supported API versions on the server, in the form of "group/version"】
config【修改 kubeconfig 文件】
plugin【Provides utilities for interacting with plugins】
version【输出客户端和服务端的版本信息】
对象管理
1、指令式命令(适合在集群中运行一次性任务,一般做测试使用)
直接使用命令去操作k8s的资源,操作简单,只能操作活动对象,无法审计和跟踪,所以通常用于测试
命令语法:kubectl command [type] [name] [flags]
command:指定要对资源执行的操作,create、apply、run、get、delete
type:指定资源的类型,deployment、pod、service、ingress
name:指定资源的名称(名称大小写敏感)
flags:指定额外的可选参数
案例:kubectl create deployment nginx --image nginx
2、指令式对象配置(目标对象为单个文件,可用于生产项目)
kubectl create -f nginx.yaml # 创建配置文件中定义的对象
kubectl replace -f nginx.yaml # 通过覆盖活动配置来更新配置文件中定义的对象
kubectl apply -f nginx.yaml # create和replace的组合
kubectl delete -f nginx.yaml -f redis.yaml # 删除两个配置文件中定义的对象
apiVersion: apps/v1 # 创建该对象所使用的 Kubernetes API 的版本
kind: Deployment # 创建对象的类别
metadata: # 唯一标识对象的一些数据
namespace: demo-ns
name: nginx-deployment
spec: # 该对象期望的状态
selector:
matchLabels:
app: nginx
replicas: 2 # 运行2个Pod
template: # Pod模板
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
3、声明式对象配置(目标对象为文件目录,可用于生产项目)
kubectl diff -R -f configs/
kubectl apply -R -f configs/
Kubernetes 名字空间
名字空间(Namespace)提供一种机制将同一集群中的资源划分为相互隔离的组
# Kubernetes 启动时会创建四个初始名字空间:
## default:默认
## kube-node-lease:该名字空间包含用于与各个节点关联的 Lease(租约)对象。 节点租约允许 kubelet 发送心跳, 由此控制面能够检测到节点故障
## kube-public:所有的客户端(包括未经身份验证的客户端)都可以读取该名字空间
## kube-system:用于 Kubernetes 系统创建的对象
kubectl create ns <名字空间名称> # 创建命名空间
kubectl get ns # 查询命名空间
kubectl delete ns <名字空间名称> --force --grace-period=0 # 删除命名空间,该空间下的所有资源也将被删除
# 设置当前上下文的默认命名空间
kubectl config set-context --current --namespace=<名字空间名称>
Kubernetes 标签(Labels)
- 标签用于指定对用户有意义且相关的Kubernetes对象的标识属性
- 标签可以在创建Kubernetes对象时附加到对象上,随后可以随时添加和修改
- 每个Kubernetes对象都可以定义一组键/值标签且每个键对于给定对象必须是唯一的
常用的实例标签
版本标签:"release" : "stable", "release" : "canary"
环境标签:"environment" : "dev", "environment" : "qa", "environment" : "production"
架构标签:"tier" : "frontend", "tier" : "backend", "tier" : "cache"
标签选择器
selector:
matchLabels:
component: redis
matchExpressions:
- { key: tier, operator: In, values: [cache] }
- { key: environment, operator: NotIn, values: [dev] }
# matchLabels 是由 {key,value} 对组成的映射,matchLabels 映射中的单个 {key,value} 等同于 matchExpressions 的元素
# matchExpressions 是 Pod 选择算符需求的列表。 有效的operator(运算符)包括 In、NotIn、Exists 和 DoesNotExist
- 打标签(命令)
```bash
kubectl label pod <Pod名称> -n <命名名称> version=1.0 # 给Pod添加标签(version=1.0)
kubectl label pod <Pod名称> -n <命名名称> version=2.0 --overwrite # 给Pod更新标签(version=2.0)
kubectl label pod <Pod名称> -n <命名名称> version- # 给Pod删除标签(version)
#
kubectl get pod nginx -n dev --show-labels # 查看Pod(nginx)的标签
# kubectl get pod -l "version=1.0" -n dev --show-labels # 筛选Pod中标签为version=1.0
# kubectl get pods -l environment=production,tier!=frontend
# kubectl get pods -l 'environment in (production),tier in (frontend)'
# kubectl get pods -l 'environment in (production, qa)'
# kubectl get pods -l 'environment,environment notin (frontend)'
自定义注解
"metadata": {
"annotations": {
"key1" : "value1",
"key2" : "value2"
}
}
# 自定义注解将元数据附加到 Kubernetes 对象。
# 标签可以用来选择对象和查找满足某些条件的对象集合,而注解不用于标识和选择对象
字段选择器
kubectl get pods --field-selector status.phase=Running # 筛选出 status.phase 字段值为 Running 的所有 Pod
kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always
kubectl get pods --field-selector metadata.namespace!=default