Minikube 环境搭建
Kubernetes 的基本架构
Kubernetes 声明式语言 YAML
YAML操作Kubernetes核心对象
CentOs搭建Kubernetes集群
Kubernetes进阶对象Deployment、DaemonSet、Service
Kubernetes进阶对象Ingress、Ingress Class、Ingress Controller
Kubernetes集群部署项目实践
Kubernetes高级对象PersistentVolume、PersistentVolumeClaim、StorageClass
CentOS部署NFS
Kubernetes使用NFS实现数据持久化
Kubernetes高级对象StatefulSet
Kubernetes 应用滚动更新
Kubernetes 容器资源管理Resources和探针Probe
Kubernetes 名称空间Namespace
Kubernetes 系统监控Metrics Server、HorizontalPodAutoscaler、Prometheus
Kubernetes集群持久化部署实践
Kubernetes Dashboard
Pod
Kubernetes 最核心对象Pod
Pod 是对容器的“打包”,里面的容器(多个容器)是一个整体,总是能够一起调度、一起运行,绝不会出现分离的情况,而且 Pod 属于 Kubernetes,可以在不触碰下层容器的情况下任意定制修改。
Kubernetes 让 Pod 去编排处理容器,然后把 Pod 作为应用调度部署的最小单位。
以 Pod 为中心的 Kubernetes 资源对象关系图:
如何使用 YAML 描述 Pod
下面这段 YAML 代码就描述了一个简单的 Pod,名字是“busy-pod”,再附加上一些标签:
apiVersion: v1
kind: Pod
metadata:
name: busy-pod
labels:
owner: chrono
env: demo
region: north
tier: back
spec:
containers:
- image: busybox:latest
name: busy
imagePullPolicy: IfNotPresent
env:
- name: os
value: "ubuntu"
- name: debug
value: "on"
command:
- /bin/echo
args:
- "$(os), $(debug)"
“containers”是一个数组,里面的每一个元素又是一个 container 对象,也就是容器。
和 Pod 一样,container 对象也必须要有一个 name 表示名字,然后当然还要有一个 image 字段来说明它使用的镜像,这两个字段是必须要有的,否则 Kubernetes 会报告数据验证错误。
container 对象的其他字段
- ports:列出容器对外暴露的端口,和 Docker 的 -p 参数有点像。
- imagePullPolicy:指定镜像的拉取策略,可以是
- Always/Never/IfNotPresent,一般默认是 IfNotPresent,也就是说只有本地不存在才会远程拉取镜像,可以减少网络消耗。
- env:定义 Pod 的环境变量,和 Dockerfile 里的 ENV 指令有点类似,但它是运行时指定的,更加灵活可配置。
- command:定义容器启动时要执行的命令,相当于 Dockerfile 里的 ENTRYPOINT 指令。
- args:它是 command 运行时的参数,相当于 Dockerfile 里的 CMD 指令,这两个命令和 Docker 的含义不同,要特别注意。
如何使用 kubectl 操作 Pod
- kubectl apply、kubectl delete 这两个命令,它们可以使用 -f 参数指定 YAML 文件创建或者删除 Pod,例如:
kubectl apply -f busy-pod.yml
kubectl delete -f busy-pod.yml
- 如果在 YAML 里定义了“name”字段,也可以在删除的时候直接指定名字来删除:
kubectl delete pod busy-pod
- 使用命令 kubectl get pod 可以查看 Pod 列表和运行状态:
kubectl get pod
Kubernetes 的 Pod 不会在前台运行,只能在后台(相当于默认使用了参数 -d),所以输出信息不能直接看到。
- 可以用命令 kubectl logs,它会把 Pod 的标准输出流信息展示出来,在这里就会显示出预设的两个环境变量的值:
kubectl logs busy-pod
这个 Pod 运行有点不正常,状态是“CrashLoopBackOff”
可以使用命令 kubectl describe 来检查它的详细状态,它在调试排错时很有用:
kubectl describe pod busy-pod
需要关注的是末尾的“Events”部分,它显示的是 Pod 运行过程中的一些关键节点事件。
对于这个 busy-pod,因为它只执行了一条 echo 命令就退出了,而 Kubernetes 默认会重启 Pod,所以就会进入一个反复停止 - 启动的循环错误状态。因为 Kubernetes 里运行的应用大部分都是不会主动退出的服务,所以我们可以把这个 busy-pod 删掉
kubectl 也提供与 docker 类似的 cp 和 exec 命令,kubectl cp 可以把本地文件拷贝进 Pod,kubectl exec 是进入 Pod 内部执行 Shell 命令,用法也差不多。
- 启动一个之前的nginx pod试验一下
#启动nginx pod
kubectl apply -f ngx-pod.yml
#查看状态
kubectl get pod
#查看日志
kubectl logs
- 将一个“a.txt”文件,那么就可以使用 kubectl cp 拷贝进 Pod 的“/tmp”目录里
echo 'aaa' > a.txt
kubectl cp a.txt ngx-pod:/tmp
- kubectl exec 的命令格式与 Docker 有一点小差异,需要在 Pod 后面加上 --,把 kubectl 的命令与 Shell 命令分隔开,在用的时候需要小心一些:
kubectl exec -it ngx-pod -- sh
Job/CronJob
为什么要有 Job/CronJob
前面文章中运行了两个 Pod:Nginx