kubectl 是 Kubernetes 集群的命令行工具,通过 kubectl 能够对集群本身进行管理,并能够在集群上进行容器化应用的安装和部署。
kubectl [command] [type] [name] [flags]
参数:
kubectl get pod pod1
kubectl get pods pod1
kubectl get po pod1
kubectl get pods
命令 | 介绍 |
---|---|
create | 通过文件名或标准输入创建资源 |
expose | 将一个资源公开为一个新的 Service |
run | 在集群中运行一个特定的镜像 |
set | 在对象上设置特定的功能 |
get | 显示一个或多个资源 |
explain | 文档参考资料 |
edit | 使用默认的编辑器编辑一个资源 |
delete | 通过文件名,标准输入,资源名称或标签来删除资源 |
命令 | 介绍 |
---|---|
rollout | 管理资源的发布 |
rolling-update | 对给定的复制控制器滚动更新 |
scale | 扩容或缩容 Pod 数量,Deployment、ReplicaSet、RC 或 Job |
autoscale | 创建一个自动选择扩容或缩容并设置 Pod 数量 |
命令 | 介绍 |
---|---|
certificate | 修改证书资源 |
cluster-info | 显示集群信息 |
top | 显示资源 (CPU/M) |
cordon | 标记节点不可调度 |
uncordon | 标记节点可被调度 |
drain | 驱逐节点上的应用,准备下线维护 |
taint | 修改节点 taint 标记 |
命令 | 介绍 |
---|---|
describe | 显示特定资源或资源组的详细信息 |
logs | 在一个 Pod 中打印一个容器日志,如果 Pod 只有一个容器,容器名称是可选的 |
attach | 附加到一个运行的容器 |
exec | 执行命令到容器 |
port-forward | 转发一个或多个 |
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 | 打印客户端和服务版本信息 |
主要分为了两部分,一个是控制器的定义 和 被控制的对象。
在一个 YAML 文件的控制器定义中,有很多属性名称
属性名称 | 介绍 |
---|---|
apiVersion | API 版本 |
kind | 资源类型 |
metadata | 资源元数据 |
spec | 资源规格 |
replicas | 副本数量 |
selector | 标签选择器 |
template | Pod 模板 |
metadata | Pod 元数据 |
spec | Pod 规格 |
containers | 容器配置 |
一般来说,我们很少自己手写 YAML 文件,因为这里面涉及到了很多内容,我们一般都会借助工具来创建
这种方式一般用于资源没有部署的时候,我们可以直接创建一个 YAML 配置文件
# 尝试运行,并不会真正的创建镜像
kubectl create deployment web --image=nginx -o yaml --dry-run
或者我们可以输出到一个文件中
kubectl create deployment web --image=nginx -o yaml --dry-run > hello.yaml
然后我们就在文件中直接修改即可
可以首先查看一个目前已经部署的镜像
kubectl get deploy
然后我们导出 nginx 的配置
kubectl get deploy nginx -o=yaml --export > nginx.yaml
然后会生成一个 nginx.yaml 的配置文件
最小部署的单元
Pod 里面是由一个或多个容器组成【一组容器的集合】
一个 pod 中的容器是共享网络命名空间
Pod 是短暂的
每个 Pod 包含一个或多个紧密相关的用户业务容器
创建容器使用 docker,一个 docker 对应一个容器,一个容器运行一个应用进程
Pod 是多进程设计,运用多个应用程序,也就是一个 Pod 里面有多个容器,而一个容器里面运行一个应用程序
Pod 的存在是为了亲密性应用
两个应用之间进行交互
网络之间的调用【通过 127.0.0.1 或 socket】
两个应用之间需要频繁调用
Pod 主要有以下两大机制:共享网络 和 共享存储。
1、共享网络【容器通过 namespace 和 group 进行隔离】
Pod 中容器通信 过程:
同一个 namespace 下
在 Pod 中创建一个根容器: pause 容器
在 Pod 中创建业务容器 【nginx,redis 等】【创建时会添加到 pause 容器 中】
在 pause 容器 中会独立出 ip 地址,mac 地址,port 等信息,然后实现网络的共享
2、共享存储【Pod 持久化数据,专门存储到某个地方中,使用 Volumn 数据卷进行共享存储】
我们以具体实例来说,拉取策略就是imagePullPolicy
拉取策略主要分为了以下几种:
也就是我们 Pod 在进行调度的时候,可以对调度的资源进行限制
例如我们限制 Pod 调度是使用的资源是 2C4G,那么在调度对应的 node 节点时,只会占用对应的资源,对于不满足资源的节点,将不会进行调度。
这里分了两个部分:
因为 Pod 中包含了很多个容器,假设某个容器出现问题了,那么就会触发 Pod 重启机制
重启策略主要分为以下三种:
1、通过容器检查
kubectl get pod
2、通过应用检查
# 存活检查,如果检查失败,将杀死容器,根据 Pod 的 restartPolicy【重启策略】来操作
livenessProbe
# 就绪检查,如果检查失败,Kubernetes 会把 Pod 从 Service endpoints 中剔除
readinessProbe
Probe 支持以下三种检查方式
创建 Pod 流程:
Controller 是集群上管理和运行容器的对象
Pod 是通过 Controller 实现应用的运维,比如弹性收缩,滚动升级。
Pod 和 Controller 之间是通过 label 标签建立关系,同时 Controller 又被称为控制器工作负载。
Deployment 表示用户对 K8S 集群的一次更新操作。
Deployment 控制器可以部署无状态应用
使用 Deploment 部署应用
kubectrl create deployment web --image=nginx
使用 YAML 文件进行配置:【快速编写 YAML 文件】
kubectl create deployment web --image=nginx -o yaml --dry-run > nginx.yaml
nginx.yaml:【selector 和 label 就是我们 Pod 和 Controller 之间建立关系的桥梁】
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
# Pod
labels:
app: web
name: web
spec:
replicas: 1
# Controller
selector:
matchLabels:
app: web
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: web
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}
现在,使用nginx.yaml文件创建镜像:
kubectl apply -f nginx.yaml
然后,对外暴露端口:
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1
# 参数说明
# --port:就是我们内部的端口号
# --target-port:就是暴露外面访问的端口号
# --name:名称
# --type:类型
kubectl set image deployment web nginx=nginx:1.15
首先是开始的 nginx 1.14 版本的 Pod 在运行,然后 1.15 版本的在创建
然后在 1.15 版本创建完成后,就会暂停 1.14 版本
最后把 1.14 版本的 Pod 移除,完成我们的升级
这么做的好处就是:升级可以保证服务不中断
kubectl rollout status deployment web
kubectl rollout history deployment web
# 查看历史版本
kubectl rollout history deployment web
# 回滚到上一版本
kubectl rollout undo deployment web
# 回滚到指定版本
kubectl rollout undo deployment web --to-revision=2
# 通过命令创建多个副本
kubectl scale deployment web --replicas=10