Pod介绍
Pod是Kubernetes中能够创建和部署的最小单元,是Kubernetes集群中的一个应用实例,总是部署在同一个节点Node上。(程序运行部署在容器中,容器必须存在pod中。pod可以认为是容器的封装,一个pod中可以存在一个或者多个容器。)
pod的工作方式
在K8s中,所有的资源都可以使用一个yaml文件来创建,创建Pod也可以使用yaml配置文件。或者使用kubectl run在命令行创建Pod(不常用)。
自主式Pod(不推荐):所谓的自主式Pod,就是直接定义一个Pod资源,但是自主式Pod是存在一个问题的,假如我们不小心删除了pod,那么pod就彻底删除了。
控制器管理的Pod(推荐)
常见的管理Pod的控制器:Replicaset、Deployment、Job、CronJob、Daemonset、Statefulset。控制器管理的Pod可以确保Pod始终维持在指定的副本数运行。如,通过Deployment管理Pod
namespace 名称空间的创建
#创建名称空间dev
[root@k8s-master dev]# kubectl create namespace dev
#查看名称空间
[root@k8s-master dev]# kubectl get ns
#在namespace名称空间下创建nginx的pod
[root@k8s-master dev]# kubectl run nginxpod --image nginx:1.17.1 -n dev
#查看新创建的pod
[root@k8s-master dev]# kubectl get pod -n de
同理删除指定的pod
再次查看pod显示没有,删除名称空间dev
[root@k8s-master dev]# kubectl delete ns de
#查看所有的pod,-A所有的名称空间
[root@k8s-master ~]# kubectl get pod -A
Pod配置
基本配置
创建pod-base.yaml文件,内容如下:
[root@k8s-master01 dev]# vim pod-base.yaml
#下面定义了一个比较简单Pod的配置,里面有两个容器:
nginx:用1.17.1版本的nginx镜像创建,(nginx是一个轻量级web容器)
busybox:用1.30版本的busybox镜像创建,(busybox是一个小巧的linux命令集合)
# 创建Pod
[root@master pod]# kubectl apply -f pod-base.yaml
pod/pod-base created# 查看Pod状况,状态为CrashLoopBackOff(表示 Pod 中的容器反复崩溃并重启)
[root@master pod]# kubectl get pod -n dev
解决busybox容器运行问题
原来busybox并不是一个程序,而是类似于一个工具类的集合,kubernetes集群启动管理后,它会自动关闭。解决方法就是让其一直在运行,这就用到了command配置。
#使用命令进行查看报错
[root@k8s-master01 dev]# kubectl describe pod pod-base -n dev
[root@k8s-master01 dev]# vim pod-base.yaml
#插入命令
command: ["/bin/sh","-c","touch /tmp/hello.txt;while true;do /bin/echo
$(date +%T) >> /tmp/hello.txt; sleep 3; done;"]
通过 Deployment 管理 Pod,利用控制器的滚动更新机制,直接更新 Pod 的不可变字段时,必须删除旧 Pod 后重新创建。
#删除pod
[root@k8s-master01 dev]# kubectl delete -f pod-base.yaml
#创建pod
[root@k8s-master01 dev]# kubectl apply -f pod-base.yaml#查看Pod状况,状态为Running正在运行
[root@master pod]# kubectl get pod -n dev
镜像拉取
配置imagePullPolicy参数,imagePullPolicy用于设置镜像拉取策略,kubernetes支持配置三种拉取策略:
Always:总是从远程仓库拉取镜像(一直远程下载)
IfNotPresent:本地有则使用本地镜像,本地没有则从远程仓库拉取镜像(本地有就本地 本地没远程下载)
Never:只使用本地镜像,从不去远程仓库拉取,本地没有就报错 (一直使用本地)
默认值说明:
如果镜像tag为具体版本号, 默认策略是:IfNotPresent
如果镜像tag为:latest(最终版本) ,默认策略是always
环境变量
env,环境变量,用于在pod中的容器设置环境变量。
#删除Pod
[root@k8s-master01 dev]# kubectl delete -f pod-base.yaml
[root@k8s-master01 dev]# vim pod-base.yaml
# 创建Pod
[root@master ~]# kubectl create -f pod-env.yaml
# 进入容器,输出环境变量
[root@master ~]# kubectl exec pod-env -n dev -c busybox -it /bin/sh
这种方式不是很推荐,推荐将这些配置单独存储在配置文件中,这种方式将在后面介绍。
资源配额
容器中的程序要运行,肯定是要占用一定资源的,比如cpu和内存等,如果不对某个容器的资源做限制,那么它就可能吃掉大量资源,导致其它容器无法运行。针对这种情况,kubernetes提供了对内存和cpu的资源进行配额的机制,这种机制主要通过resources选项实现。
他有两个子选项:
requests:用于设置容器需要的最小资源,如果环境资源不够用,容器无法启动
limits:用于限制运行容器的占用资源,当容器占用资源超过limits时会被终止
# 下载 安装Metrics-Server
[root@k8s-master01 dev]# wget https://mirrors.chenby.cn/https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 修改配置
[root@k8s-master01 dev]# vim components.yaml
# 修改此处 添加如下内容
# 修改镜像地址
sed -i "s#registry.k8s.io#k8s.chenby.cn#g" components.yaml
cat components.yaml | grep image#运行pod
[root@k8s-master01 ~]# kubectl apply -f components.yaml# 需要稍等一会才可查看到
[root@k8s-master01 ~]# kubectl top node