小阿轩yx-Kubernetes Pod入门
前言
Kubernetes 中
- 一个重要的概念就是 Pod(豆荚)
- 并不直接管理容器,它的最小管理单元叫做 Pod。
Docker 应用中
- 把一个应用程序封装在一个镜像中,之后启动这个镜像并映射个宿主机端口号,就能访问这个应用。
既然单个容器就可以部署这个应用,为什么 Kubernetes不直接管理容器,而是要设计一个 Pod 呢?
什么是 Pod
- 是一个或多个容器的结合
- 容器共享存储、网络和命名空间以及运行规范
- 所有容器都被统一安排和调度,并运行在共享上下文中
- 是具体应用的逻辑主机
- 包含业务相关的多个应用容器
- 是一个组具有共享命名空间、IP 地址和端口的容器的集合
共享上下文是一种基于线程的内存位置
从使用的角度来看
- 实际的使用时,单个容器无法单独支撑应用,需要很多微服务才能组成一个系统,并且还会存在A服务依赖B服务,B服务需要和C服务共用某个目录。
- 使用裸容器时,很难实现对容器内进行健康检査以及横向扩容等操作,而 Pod 可以轻松解决这些问题
从 Kubernetes 的角度来看
- Docker 只是容器 Runtime(运行时)的一种们还有很多容器 Runtime,比如 Rkt、CRI-0等
- Kubernetes 作为目前最流行的容器编排工具,需要支持各个 Runtime 并且不依赖于底层Runtime 的实现技术,于是就抽象出了 Pod 这个概念,用于管理多个紧密相连的符合 CRI 标准的容器。
每个 Pod 还包含一个 Pause 容器
Pause 容器
- 是 Pod 的父容器,主要负责僵尸进程的回收管理。
- 同时,通过 Pause 容器可以使同一个 Pod里面的不同容器共享存储、网络、PID、IPC 等
Pod 两个必须知道的特点
网络
- 每一个 Pod 都会被指派一个唯一的 Ip 地址,在 Pod 中的每一个容器共享网络命名空间,包括 Ip 地址和网络端口。
- 同一个 Pod 中的容器可以同 locahost 进行互相通信。
- 当 Pod中的容器需要与 Pod 外的实体进行通信时,则需要通过端口等共享的网络资源。
存储
- Pod 能够被指定共享存储卷的集合,在 Pod 中所有的容器能够访问共享存储卷,允许这些容器共享数据。
- 存储卷也允许在一个 Pod 持久化数据,以防止其中的容器需要被重启。
结合 pod 大概回顾上一章
查看创建文件时为 pod 分配的地址
[root@k8s-master ~]# cat init-config.yaml
...省略部分内容
networking:
//为pod分配的地址
podSubnet: 10.244.0.0/16
查看所有 pod 状态
[root@k8s-master ~]# ku get pod -A
- 都显示 Running 为正常
将镜像文件通过 Xftp 上传至两个 node 计算节点
(102和103)
两个 node 节点进入镜像文件并导入镜像
[root@k8s-node01 ~]# cd images/
[root@k8s-node01 images]# bash imp_docker_img.sh
[root@k8s-node02 ~]# cd images/
[root@k8s-node02 images]# bash imp_docker_img.sh
Pod 的状态
在 master 主节点用 kubectl 命令创建 pod(101)
[root@k8s-master ~]# kubectl run nginx --image=nginx:1.7.9 --labels="app=nginx'
pod/nginx created
查看所有 pod 状态
[root@k8s-master ~]# ku get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 22s
- pod 后什么也不加是默认在 default 下查看状态
查看详细信息
[root@k8s-master ~]# ku get pod nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 54s 10.244.58.195 k8s-node02 <none> <none>
查看 pod 日志
[root@k8s-master ~]# curl 10.244.58.195
......
<p><em>Thank you for using nginx.</em></p>
......
或
[root@k8s-master ~]# ku logs nginx
显示资源的详细描述信息
[root@k8s-master ~]# ku describe pod nginx
- kubectl get:常用于查看同一资源类型的一个或多个资源对象,可以使用 -o 参数自定义输出格式
- kubectl describe:侧重于描述指定资源的各方面的详细信息,不仅会返回节点信息,还会返回在其运行的 Pod 的摘要、节点事件等信息
在 Pod 的容器中执行命令
[root@k8s-master ~]# ku exec nginx -c nginx -- date
或
[root@k8s-master ~]# ku exec -it nginx -c nginx -- date
- -c:指定 Pod 中容器的名字
登录到 Pod 中的容器中
[root@k8s-master ~]# ku exec -it nginx -c nginx -- bash
root@nginx:/# exit
exit
- ku exec -it nginx -c nginx -- bash(如果登录时不指定容器,就登录到 Pod 中的第一个容器中)
在线编辑运行中的资源对象
[root@k8s-master ~]# ku edit pod nginx
Edit cancelled, no changes made.
- Edit cancelled, no changes made.(没有修改文件)
将 pod 的端口映射到宿主机
[root@k8s-master ~]# ku port-forward --address 0.0.0.0 pod/nginx 8080:80
Forwarding from 0.0.0.0:8080 -> 80
其它主机访问测试
[root@k8s-node02 ~]# curl 192.168.10.101:8080
- 此命令会在前台运行,此时就可以在其他客户端用该 k8s 主机的 IP 地址和 8080 的端口号进行访问了,Ctrl+c停止,但停止后就没有这个映射了。
谷歌浏览器访问测试
- 192.168.10.101:8080
在宿主机和 Pod 的容器之间拷贝文件
[root@k8s-master ~]# ku cp nginx:etc/fstab /opt/aaa.txt
[root@k8s-master ~]# ku cp /opt/aaa.txt nginx:etc/bbb.txt
查看 aaa 文件内容
[root@k8s-master ~]# cat /opt/aaa.txt
# UNCONFIGURED FSTAB FOR BASE SYSTEM
删除 Pod
[root@k8s-master ~]# ku delete pod nginx
pod "nginx" deleted
Pod 状态不仅只有 Running,常见其它状态
Pod 状态字段 Phase(阶段)的不同取值
状态 | 说明 |
Pending(挂起) | Pod 已经被 Kubernetes 系统接收,但是仍有一个或多个容器未被创建,可以通过 kubectl describe 查看处于Pending 状态的原因 |
Running(运行中) | Pod 已经被绑定到一个节点上,并且所有的容器都已经被创建,而且至少有一个是运行的状态、正在启动或者重启,可以通过 kubectl logs 査看 Pod 的日志 |
Succeeded | 所有容器执行成功,并终止,并且不会再次重启,可以通过kubectl logs 査看 Pod 的日志 |
Faild(失败) | 所有容器都已终止,并且至少一个容器以失败的方式终止也就是说这个容器要么以非零状态退出,要么被系统终止,可以通过 logs 和 describe 査看 Pod 的日志和状态 |
Unknown(未知) | 通常是由于通信问题造成的无法获得 Pod 的状态 |
ImagePullBackOff ErrImagePull | 镜像拉取失败,一般是由于镜像不存在、网络不通或者需要登录认证引起的,可以使用 describe 命令查看具体的原因 |
CrashLoopBackOff | 容器启动失败,可以通过 logs 命令查看具体的原因,一般为启动命令不正确、健康检查不通过等原因 |
OOMKilled | 容器内存溢出,一般是容器的内存 Limit 设置的过小,或者程序本身有内存溢出,可以通过 logs 查看程序的启动日志 |
Terminating | Pod 正在被删除,可以通过 describe 查看状态 |
SysctlForbiden | Pod 自定义了内核配置,但 kubect1 没有添加内核配置或配置的内核参数不支持,可以通过 describe 查看具体原因 |
Completed | 容器内部主进程退出,一般计划任务执行结束会显示该该状态,此时可以通过 logs 查看容器日志 |
ContainerCreateing | Pod 正在创建,一般正在下载镜像,或者有配置不当的地方,可以通过 describe 查看具体原因 |
Pod 探针
- 生产环境中,进程正常启动并不代表应用能正常处理请求,所以合理的设计应用的健康检查尤其重要。
- 使用裸机或裸容器部署时,一般很难对应用做很完善的健康检査,而 Pod 提供的探针可以很方便的用来检测容器的应用是否正常。
- 目前探针有3种检测方式,可以根据不同的场景选择合适的健康检查方式。
Pod 探针的实现方式
实现方式 | 说明 |
ExecAction | 在容器内执行一个指定的命令,如果命令返回值为8,则认为容器健康 |
TCPSocketAction | 通过 TCP 连接检查容器指定的端口,如果端口开放,则认为容器健康 |
HTTPGetAction | 对指定的 URL 进行 Get 请求,如果状态码在 200-400 之间,则认为容 器健康 |
- 上述的检查方式可以被周期性的执行
每次检査容器后可能得到的容器状态
状态 | 说明 |
Success(成功) | 容器通过检查 |
Failure(失败) | 容器检查失败 |
Unknown(未知) | 诊断失败,因此不采取任何措施 |
Pod 探针有三类
- livenessProbe(存活探针)
- readinessProbe(就绪探针)
- startupProbe(启动探针)
livenessProbe(存活探针)
- 判断容器是否正常运行,如果失败则杀掉容器(不是pod),再根据重启策略决定是否重启容器
readinessProbe(就绪探针)
- 判断容器是否能够进入ready 状态,探针失败则进入noready 状态,并从service的endpoints中剔除此容器
startupProbe(启动探针)
- 判断容器内的应用是否启动成功,在success 状态前,其它探针都处于无效状态
指定重启策略
[root@k8s-master ~]# ku run nginx --image=nginx:1.7.9 --labels="app=nginx" --image-pull-policy=Never
pod/nginx created
- --image-pull-policy:拉取镜像策略
- policy:计算机里叫策略
查看状态
[root@k8s-master ~]# ku get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 5s
设置总是拉取
[root@k8s-master ~]# ku run nginx01 --image=nginx:1.7.9 --labels="app=nginx" --image-pull-policy=Always
pod/nginx created
- Always:总是
查看状态
[root@k8s-master ~]# ku get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 5s
nginx01 0/1 ContainerCreating 0 4s
- ContainerCreating:创建中
查看 nginx01 的状态
[root@k8s-master ~]# ku describe pod nginx01
Events:
Type Reason Age From Message
---- ------ --- ---- -------
Normal Scheduled18sSuccessfully assigned default/ngdefault-scheduler .inx01 to k8s-node02
Normal Pullingy 17s kubelet Pulling image "nginx:1.7.9"
- Pulling image:镜像处于拉取中,由于网络原因需要拉取一段时间,如果选择的镜像仓库没有,那么是拉不了的
- 用 describr 查,由于本地有这个镜像,但是指定了策略总是拉取,就是这样的状态了
删除 Pod
[root@k8s-master ~]# ku delete pod nginx
pod "nginx" deleted
[root@k8s-master ~]# ku delete pod nginx01
pod "nginx01" deleted
- 这一步会有延迟,因为上一步 Pulling image 正处于下载镜像状态
创建一个简单的 Pod
编写一个简单的 Pod
[root@k8s-master ~]# vim nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort:80
部署 nginx 的 pod 文件
[root@k8s-master ~]# ku apply -f nginx-pod.yaml
pod/nginx created
查看是否创建成功
[root@k8s-master ~]# ku get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 12s
删除 pod
[root@k8s-master ~]# ku delete -f nginx-pod.yaml
pod "nginx" deleted
以上就是资源清单
将 yaml 文件上传至主机(master节点)
创建拉取的文件
[root@k8s-master ~]# ku create -f frontend-localredis-pod.yaml
pod/redis-php created
查看是否创建成功
[root@k8s-master ~]# ku get pod
NAME READY STATUS RESTARTS AGE
redis 2/2 Running 0 12s
- 此时可以看到 pod 中有两个容器处于 running 状态中
再将一个 yaml 文件上传至主机
创建拉取的文件
[root@k8s-master ~]# ku create -f nginx-php.yaml
pod/nginx-php created
暴露端口
[root@k8s-master ~]# ku expose pod nginx-php --port=8080 --target-port=80 --name=nginx-php
service/nginx-php expose
查看端口映射
[root@k8s-master ~]# ku get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d18h
nginx-php ClusterIP 10.107.102.194 <none> 8080/TCP 25s
查看 pod 被分配的地址
[root@k8s-master ~]# ku get svc
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-php 2/2 Running 0 2m35s 172.25.244.199 k8s-master01 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/nginx-php NodePort 10.99.26.98 <none> 8080:32598/TCP 2m24s name=nginx-php
暴露端口
[root@k8s-master ~]# ku expose pod nginx-php --port=8080 --target-port=80 --type=NodePort --name=nginx-php01
service/nginx-php01 expose
查看端口映射
[root@k8s-master ~]# ku get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d18h
nginx-php ClusterIP 10.107.102.194 <none> 8080/TCP 25s
nginx-php01 NodePort 10.105.6.129 <none> 8080:30345/TCP 3s
用浏览器测试访问
- 192.168.10.101:30345
- 192.168.10.102:30345
- 192.168.10.103:30345
删除所有 pod
[root@k8s-master ~]# ku delete pod nginx-php
pod "nginx-php" deleted
[root@k8s-master ~]# ku delete pod redis-php
pod "redis-php" deleted
拷贝 nginx 的 yaml 文件到指定目录下
[root@k8s-master ~]# cp nginx-pod.yaml /etc/kubernetes/manifests/
查看状态
[root@k8s-master ~]# ku get pod
NAME READY STATUS RESTARTS AGE
nginx-k8s-master 1/1 Running 0 4s
进入目录
[root@k8s-master ~]# cd /etc/kubernetes/manifests/
删除 nginx 的 yaml 文件
[root@k8s-master ~]# rm -rf nginx-pod.yaml
查看状态
[root@k8s-master ~]# ku get pod
No resources found in default namespace.
小阿轩yx-Kubernetes Pod入门