华子目录
- 什么是pod
- 1.创建`自主式pod`(生产不推荐)
- 优点
- 缺点
- 示例1
- 示例2
- 示例3
- 示例4
- 2.利用`控制器`管理`pod`(推荐)
- 应用版本的更新
- 3.利用`yaml`文件部署应用
- 优点
- 3.1`yaml`配置文件参数
- 3.2如何获取资源帮助
- yaml文件编写示例
- 1.运行简单的单个容器pod
- 2.运行多个容器`pod`
- 3.理解`pod`间的网络整合
- 4.端口映射
- 5.如何设定`环境变量`
- 6.资源限制
- 7.容器启动管理
- 8.选择运行节点
- 9.共享宿主机网络
- `pod`的生命周期
- init容器
- `init容器`的功能
- init容器示例
什么是pod
pod
是可以创建和管理Kubernetes
计算的最小可部署单元
- 一个
pod
代表着集群
中运行的一个进程
,每个pod
都有一个唯一的ip
- 一个
pod
类似一个豌豆荚
,包含一个或多个容器
(通常是docker
) 多个容器
间共享Network
,memory
和UTC namespace
等
查看所有pod
[root@k8s-master ~]# kubectl get pods --all-namespaces
1.创建自主式pod
(生产不推荐)
- 所谓
自主式
,就是不是
在控制器
中的pod
优点
-
灵活性高
- 可以精确控制
pod
的各种配置参数
,包括容器的镜像、资源限制、环境变量、命令和参数
等,满足特定的应用需求。
- 可以精确控制
-
学习和调试方便
- 对于学习
Kubernetes
的原理和机制非常有帮助,通过手动创建pod
可以深入了解pod
的结构
和配置方式
。在调试问题时,可以更直接
地观察和调试pod
的设置。
- 对于学习
-
适用于特殊场景
- 在一些
特殊情况
下,如进行一次性任务
、快速验证
概念或在资源受限
的环境中进行特定配置
时,手动创建pod
可能是一种有效
的方式。
- 在一些
缺点
管理复杂
- 如果需要管理
大量的pod
,手动创建和维护
会变得非常繁琐和耗时
。难以实现自动化
的扩缩容、故障恢复等操作
。
- 如果需要管理
缺乏高级功能
- 无法自动享受
Kubernetes
提供的高级功能
,如自动部署、滚动更新、服务发现
等。这可能导致应用的部署和管理效率底下。
- 无法自动享受
可维护性差
- 手动创建的
pod
在更新应用版本
或修改配置
时需要手动干预
,容易出现错误
,并且难以保证一致性
。相比之下,通过声明式配置
或使用Kubernetes
的部署工具
可以更方便地进行应用地维护和更新。
- 手动创建的
示例1
#运行一个名为web的pod
[root@k8s-master ~]# kubectl run web --image nginx
pod/web created
#显示pod的较为详细的信息
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web 1/1 Running 0 14s 10.244.1.12 k8s-node1.org <none> <none>
示例2
#在一个pod中运行2个nginx
[root@k8s-master ~]# cat testpod1.yml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: huazi #pod的标签
name: huazi #pod的名字
spec:
containers:
- image: nginx #pod的第一个镜像
name: web1 #容器名
- image: nginx #pod中的第二个镜像
name: web2 #容器名
[root@k8s-master ~]# kubectl apply -f testpod1.yml
pod/huazi created
#我们发现一个pod中运行2个nginx,只能运行一个
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi 1/2 CrashLoopBackOff 5 (19s ago) 3m17s 10.244.2.21 k8s-node2.org <none> <none>
#查看日志后,发现80端口被占用
[root@k8s-master ~]# kubectl logs pods/huazi web2
- 从侧面可以反应出:
pod
是一个系统
,pod
中的容器
是一个应用程序
,一个系统
的一个应用程序
只能有一个
[root@k8s-master ~]# kubectl delete -f testpod1.yml
pod "huazi" deleted
[root@k8s-master ~]# kubectl get pods
No resources found in default namespace.
示例3
#在一个名为huazi的pod中,运行两个容器,一个是nginx,一个是buysboxplus
[root@k8s-master ~]# vim testpod1.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: huazi #pod的标签
name: huazi #pod的名字
spec:
containers:
- image: nginx #pod中第一个容器镜像
name: web1 #容器名
- image: busyboxplus #pod中第二个容器镜像
name: test #容器名
command: ["/bin/sh","-c","sleep 10000"]
[root@k8s-master ~]# kubectl apply -f testpod1.yml
pod/huazi created
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi 2/2 Running 0 10s 10.244.2.22 k8s-node2.org <none> <none>
- 进入
test
容器中,test
容器是一个busyboxplus
的镜像
[root@k8s-master ~]# kubectl exec pods/huazi -c test -it -- /bin/sh
/ # curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
- 这里我们发现,
test
是一个busyboxplus
的容器
,但是为什么可以访问到nginx容器
呢?原因就是:busyboxplus
和nginx
在一个pod
中,共用同一个资源
。也从侧面可以反应出:pod是一个系统
[root@k8s-master ~]# kubectl delete -f testpod1.yml
示例4
#在一个名为huazi的pod中,运行两个容器,一个是nginx,一个是buysboxplus
[root@k8s-master ~]# vim testpod1.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: huazi #pod的标签
name: huazi #pod的名字
spec:
containers:
- image: nginx #pod中第一个容器镜像
name: web1 #容器名
- image: busyboxplus #pod中第二个容器镜像
name: test #容器名
command: ["/bin/sh","-c","sleep 10000"]
[root@k8s-master ~]# kubectl apply -f testpod1.yml
pod/huazi created
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi 2/2 Running 0 10s 10.244.2.22 k8s-node2.org <none> <none>
我们在node2
节点上手动删除一个容器
[root@k8s-node2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7763a4447357 busyboxplus "/bin/sh -c 'sleep 1…" About a minute ago Up About a minute k8s_test_huazi_default_37d37ef9-27cc-4fb5-b955-286c192000d8_0
3f5c3411c80a nginx "/docker-entrypoint.…" About a minute ago Up About a minute k8s_web1_huazi_default_37d37ef9-27cc-4fb5-b955-286c192000d8_0
#当我们删除后,它会自动重新建立一个
[root@k8s-node2 ~]# docker rm -f k8s_test_huazi_default_37d37ef9-27cc-4fb5-b955-286c192000d8_0
k8s_test_huazi_default_37d37ef9-27cc-4fb5-b955-286c192000d8_0
[root@k8s-node2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b9af5119ad4 busyboxplus "/bin/sh -c 'sleep 1…" 5 seconds ago Up 4 seconds k8s_test_huazi_default_37d37ef9-27cc-4fb5-b955-286c192000d8_1
3f5c3411c80a nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes k8s_web1_huazi_default_37d37ef9-27cc-4fb5-b955-286c192000d8_0
但是master
上不会发现node2
上的容器重新建立过
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi 2/2 Running 2 4m5s 10.244.2.24 k8s-node2.org <none> <none>
2.利用控制器
管理pod
(推荐)
高可用性和可靠性:
自动故障恢复
:如果一个pod失败或被删除
,控制器
会自动
创建新的pod
来维持期望的副本数量
。确保
应用始终处于可用状态
,减少因单个pod
故障导致的服务中断
。(这里所说的副本
就是pod
)健康检查和自愈
:可以配置控制器
对pod
进行健康检查
(如存活探针
和就绪探针
)。如果pod
不健康,控制器
会采取适当的行动
,如重启pod
或删除
并重新创建它
,以保证应用的正常运行
。
可扩展性:
轻松扩缩容
:可以通过简单的命令
或配置
更改来增加
或减少pod
的数量
,以满足
不同的工作负载需求
。例如,在高流量
期间可以快速扩展
以处理更多请求
,在低流量
期间可以缩容
以节省资源
。水平自动扩缩容
(HPA
):可以基于自定义
指标(如CPU利用率
、内存使用
情况或应用特定
的指标)自动调整pod的数量
,实现动态的资源分配
和成本优化
。
版本管理和更新:
滚动更新
:对于Deployment
等控制器
,可以执行滚动更新
来逐步替换旧版本
的pod
为新版本
,确保应用
在更新过程中始终保持可用
。可以控制更新的速率和策略
,以减少
对用户的影响。回滚
:如果更新出现问题
,可以轻松回滚
到上一个稳定版本
,保证应用的稳定性
和可靠性
。
声明式配置:
- 简洁的
配置方式
:使用yaml
或json
格式的声明式配置文件
来定义应用的部署需求
。这种方式使得配置易于理解、维护和版本控制
,同时也方便团队协作。 期望状态管理
:只需要定义应用的期望状态
(如副本数量、容器镜像
等),控制器
会自动
调整实际状态
与期望状态
保持一致。无需手动管理
每个pod
的创建和删除
,提高了管理效率
。
服务发现和负载均衡:
自动
注册和发现:Kubernetes
中的服务(Service
)可以自动发现
由控制器
管理的pod
,并将流量
路由到它们。这使得应用的服务发现
和负载均衡
变得简单和可靠
,无需手动配置负载均衡器。
流量分发
:可以根据不同的策略
(如轮询、随机
等)将请求分发
到不同
的pod
,提高应用的性能和可用性。
多环境一致性:
一致的部署方式
:在不同的环境
(如开发、测试、生产
)中,可以使用相同的控制器
和配置
来部署应用
,确保应用在不同环境
中的行为一致
。这有助于减少部署
差异和错误,提高开发和运维效率
。
#建立控制器并在控制器中自动运行一个pod
[root@k8s-master ~]# kubectl create deployment huazi --image nginx
deployment.apps/huazi created
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi-79f7fdf69-4wksw 1/1 Running 0 22s 10.244.1.13 k8s-node1.org <none> <none>
#为huazi控制器扩容:扩容到3个pod
[root@k8s-master ~]# kubectl scale deployment huazi --replicas 3
deployment.apps/huazi scaled
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi-79f7fdf69-4wksw 1/1 Running 0 3m4s 10.244.1.13 k8s-node1.org <none> <none>
huazi-79f7fdf69-9qtg9 1/1 Running 0 23s 10.244.1.14 k8s-node1.org <none> <none>
huazi-79f7fdf69-mkfnq 1/1 Running 0 23s 10.244.2.19 k8s-node2.org <none> <none>
#为huazi控制器缩容:缩容到2个pod
[root@k8s-master ~]# kubectl scale deployment huazi --replicas 2
deployment.apps/huazi scaled
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi-79f7fdf69-4wksw 1/1 Running 0 4m58s 10.244.1.13 k8s-node1.org <none> <none>
huazi-79f7fdf69-mkfnq 1/1 Running 0 2m17s 10.244.2.19 k8s-node2.org <none> <none>
应用版本的更新
#利用控制器建立pod,控制器里面运行2个pod
[root@k8s-master ~]# kubectl create deployment huazi --image myapp:v1 --replicas 2
deployment.apps/huazi created
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi-646d7864fd-5qbzk 1/1 Running 0 16s 10.244.2.25 k8s-node2.org <none> <none>
huazi-646d7864fd-vn7dt 1/1 Running 0 16s 10.244.1.15 k8s-node1.org <none> <none>
- 端口暴露
[root@k8s-master ~]# kubectl expose deployment huazi --port 8080 --target-port 80
service/huazi exposed
[root@k8s-master ~]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
huazi ClusterIP 10.97.207.164 <none> 8080/TCP 29s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4d6h
- 访问服务
[root@k8s-master ~]# curl 10.97.207.164:8080
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
- 查看历史版本
[root@k8s-master ~]# kubectl rollout history deployment huazi
deployment.apps/huazi
REVISION CHANGE-CAUSE
1 <none>
- 更新控制器镜像版本
[root@k8s-master ~]# kubectl set image deployments/huazi myapp=myapp:v2
deployment.apps/huazi image updated
#查看历史版本
[root@k8s-master ~]# kubectl rollout history deployment huazi
deployment.apps/huazi
REVISION CHANGE-CAUSE
1 <none>
2 <none>
- 访问内容测试
[root@k8s-master ~]# curl 10.97.207.164:8080
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
- 版本回滚
[root@k8s-master ~]# kubectl rollout undo deployment huazi --to-revision 1
deployment.apps/huazi rolled back
[root@k8s-master ~]# curl 10.97.207.164:8080
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@k8s-master ~]# kubectl rollout history deployment huazi
deployment.apps/huazi
REVISION CHANGE-CAUSE
2 <none>
3 <none>
3.利用yaml
文件部署应用
优点
声明式配置:
- 清晰表达
期望状态
:以声明式
的方式描述应用的部署要求
,包括pod数量
、容器配置
、网络设置
等。这使得配置易于理解和维护
,并且可以方便地查看应用的预期状态
。 可重复性
和版本控制
:配置文件
可以被版本控制
,确保在不同环境
中的部署一致性
。可以轻松回滚
到以前的版本
或在不同环境
中重复
使用相同的配置
团队协作
:便于团队成员
之间共享和协作
,大家可以对配置文件
进行审查和修改
,提高部署
的可靠性
和稳定性。
灵活性和可扩展性
丰富
的配置选项
:可以通过yaml
文件详细地配置各种Kubernetes
资源,如Deployment
、Service
、ConfigMap
、Secret
等。可以根据应用地特定需求
进行高度定制化
。组合和扩展
:可以将多个资源
地配置组合在一个或多个yaml文件
中,实现复杂地应用部署框架
。同时,可以轻松地添加
新的资源
或修改现有资源
以满足不断变化的需求。
与工具集成
- 与
CI/CD
流程集成
:可以将yaml配置文件
与持续集成
和持续部署(CI/CD
)工具集成,实现自动化
的应用部署
。例如,可以在代码
提交后自动触发
部署流程,使用配置文件
来部署应用到不同的环境
。 命令行工具
支持:Kubernetes
的命令行
工具kubectl
对yaml
配置文件有很好的支持,可以方便地应用、更新、和删除配置
。同时,还可以使用其他工具来验证和分析yaml配置文件
,确保其正确性和安全性
。
3.1yaml
配置文件参数
参数名称 | 类型 | 参数说明 |
---|---|---|
apiVersion | string | 这里是指的是k8s api 的版本 ,目前基本上是v1 ,可以用kubectl api-version 命令查询 |
kind | string | 这里指的是yaml文件 定义的资源类型和角色 ,比如:Pod |
metadata | object | 元数据对象 ,固定值 ,就写metadata 就行,冒号后没有值 |
metadata.name | string | 元数据对象 的名字 ,自定义 ,比如Pod的名字 |
metadata.namespace | string | 元数据对象 的命名空间 ,自定义 |
spec | object | 详细定义对象 ,固定值 ,就写spec 就行,冒号后没有值 |
spec.containers[] | list | 这里是spec对象 的容器列表 定义,是个列表 。冒号后没有值 |
spec.containers[].image | string | 镜像名称 |
spec.containers[].name | string | 容器名称 |
spec.containers[].command[] | list | 指定容器运行时 启动的命令 ,若未指定 则运行容器打包时指定的命令 |
spec.containers[].imagePullPolicy | string | 定义镜像拉取策略 ,Always :每次都尝试重新拉取镜像 ;ifNotPresent :如果本地有镜像就使用本地镜像 ;Never :仅使用本地镜像 |
spec.containers[].args[] | list | 指定容器运行参数 ,可以指定多个 |
spec.containers[].workingDir | string | 指定容器工作目录 |
spec.containers[].volumeMounts[] | list | 指定容器内部 的存储卷 配置 |
spec.containers[].volumeMounts[].name | string | 指定可以被容器挂载的存储卷 的名称 |
spec.containers[].volumeMounts[].mountPath | string | 可以被容器 挂载的存储卷的路径 |
spec.containers[].volumeMounts[].readOnly | string | 设置存储卷路径 的读写模式 ,true或false ,默认为读写模式 |
spec.containers[].ports[] | list | 指定容器 需要用到的端口列表 |
3.2如何获取资源帮助
[root@k8s-master ~]# kubectl explain pod.spec.containers
yaml文件编写示例
1.运行简单的单个容器pod
- 用命令获取
yaml模板
[root@k8s-master ~]# kubectl run huazi --image myapp:v1 --dry-run=client -o yaml > pod.yml
[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: huazi #pod标签
name: huazi #pod名称
spec:
containers:
- image: myapp:v1 #pod镜像
name: huazi #容器名称
[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi 1/1 Running 0 6s 10.244.1.18 k8s-node1.org <none> <none>
2.运行多个容器pod
注意:如果多个容器
运行在一个pod
中,资源共享的同时在使用相同资源
时也会干扰
,比如端口
一个端口干扰示例:
#在一个pod中运行2个nginx
[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: huazi #pod的标签
name: huazi #pod的名字
spec:
containers:
- image: nginx #pod的第一个镜像
name: web1 #容器名
- image: nginx #pod中的第二个镜像
name: web2 #容器名
[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created
#我们发现一个pod中运行2个nginx,只能运行一个
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi 1/2 CrashLoopBackOff 5 (19s ago) 3m17s 10.244.2.21 k8s-node2.org <none> <none>
#查看日志后,发现80端口被占用
[root@k8s-master ~]# kubectl logs pods/huazi web2
- 从侧面可以反应出:
pod
是一个系统
,pod
中的容器
是一个应用程序
,一个系统
的一个应用程序
只能有`一个
在一个pod
中开启多个容器
时一定要确保容器彼此
不能相互干扰
[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: huazi
name: huazi
spec:
containers:
- image: nginx
name: web1
- image: busybox
name: busybox
command: ["/bin/sh","-c","sleep 10000"]
[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi 2/2 Running 0 10s 10.244.1.19 k8s-node1.org <none> <none>
3.理解pod
间的网络整合
同一个pod
中的容器公用一个网络
[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: huazi
name: huazi
spec:
containers:
- image: nginx
name: web1
- image: busyboxplus
name: busyboxplus
command: ["/bin/sh","-c","sleep 10000"]
[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi 2/2 Running 0 57s 10.244.2.28 k8s-node2.org <none> <none>
[root@k8s-master ~]# kubectl exec -it huazi -c busyboxplus -- /bin/sh
/ # curl 10.244.2.28
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
- 这里我们发现,
busyboxplus
是一个busyboxplus
的容器
,但是为什么可以访问到nginx容器
呢?原因就是:busyboxplus
和nginx
在一个pod
中,共用同一个资源
。也从侧面可以反应出:pod是一个系统
4.端口映射
[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: huazi
name: huazi
spec:
containers:
- image: myapp:v1
name: myapp1
ports:
- name: http
containerPort: 80 #容器中的服务端口
hostPort: 8080 #宿主机的端口
protocol: TCP
[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi 1/1 Running 0 12s 10.244.1.20 k8s-node1.org <none> <none>
[root@k8s-master ~]# curl k8s-node1.org:8080
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
5.如何设定环境变量
[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: huazi
name: huazi
spec:
containers:
- image: busybox
name: busybox
command: ["/bin/sh","-c","echo $NAME;sleep 10000"]
env:
- name: NAME #NAME为变量名
value: "hello world" #变量值
[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created
[root@k8s-master ~]# kubectl logs pods/huazi busybox
hello world
6.资源限制
资源限制
会影响pod
的Qos Class
资源优先级,资源优先级分为Guaranteed > Burstable > BestEffort
Qos
即服务质量
资源设定 | 优先级类型 |
---|---|
资源限定为设定 | BestEffort |
资源限定设定且最大和最小不一致 | Burstable |
资源限定设定且最大和最小一致 | Guaranteed |
[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: huazi
name: huazi
spec:
containers:
- image: myapp:v1
name: myapp
resources:
limits: #pod使用资源的最高限制
cpu: 500m
memory: 100M
requests: #pod期望使用的资源,不能大于limits
cpu: 500m
memory: 100M
[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi 1/1 Running 0 8s 10.244.1.21 k8s-node1.org <none> <none>
[root@k8s-master ~]# kubectl describe pods huazi
......
......
......
Limits:
cpu: 500m
memory: 100M
Requests:
cpu: 500m
memory: 100M
......
......
......
7.容器启动管理
[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: huazi
name: huazi
spec:
restartPolicy: Always #pod的重启策略
containers:
- image: myapp:v1
name: myapp
[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi 1/1 Running 0 8s 10.244.2.30 k8s-node2.org <none> <none>
[root@k8s-node2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d484c3dc3278 d4a5e0eaa84f "nginx -g 'daemon of…" 40 seconds ago Up 39 seconds k8s_myapp_huazi_default_3382f3a9-c6b0-4875-a58e-53afe799ab3d_0
[root@k8s-node2 ~]# docker rm -f k8s_myapp_huazi_default_3382f3a9-c6b0-4875-a58e-53af
k8s_myapp_huazi_default_3382f3a9-c6b0-4875-a58e-53afe799ab3d_0
#删了之后,又会重新起一个pod
[root@k8s-node2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c155437452b9 d4a5e0eaa84f "nginx -g 'daemon of…" 4 seconds ago Up 3 seconds k8s_myapp_huazi_default_3382f3a9-c6b0-4875-a58e-53afe799ab3d_1
8.选择运行节点
[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: huazi
name: huazi
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node1.org #node1
restartPolicy: Always
containers:
- image: myapp:v1
name: myapp
[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created
#我们发现在node1上运行了
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi 1/1 Running 0 13s 10.244.1.22 k8s-node1.org <none> <none>
9.共享宿主机网络
[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: huazi
name: huazi
spec:
hostNetwork: true
containers:
- image: busybox
name: busybox
command: ["/bin/sh","-c","sleep 10000"]
[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created
#我们可以发现eth0
[root@k8s-master ~]# kubectl exec -it pods/huazi -c busybox -- /bin/sh
/ # ifconfig
cni0 Link encap:Ethernet HWaddr 22:C0:49:80:83:77
inet addr:10.244.1.1 Bcast:10.244.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c0:49ff:fe80:8377/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:409 errors:0 dropped:0 overruns:0 frame:0
TX packets:230 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:29496 (28.8 KiB) TX bytes:21069 (20.5 KiB)
docker0 Link encap:Ethernet HWaddr 02:42:A8:49:89:52
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
eth0 Link encap:Ethernet HWaddr 00:0C:29:DB:48:D7
inet addr:172.25.254.10 Bcast:172.25.254.255 Mask:255.255.255.0
inet6 addr: fe80::7baa:9520:639b:5e48/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:811130 errors:0 dropped:0 overruns:0 frame:0
TX packets:429677 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:806703703 (769.3 MiB) TX bytes:47436488 (45.2 MiB)
flannel.1 Link encap:Ethernet HWaddr 86:D8:BA:15:B9:0F
inet addr:10.244.1.0 Bcast:0.0.0.0 Mask:255.255.255.255
inet6 addr: fe80::84d8:baff:fe15:b90f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
RX packets:87 errors:0 dropped:0 overruns:0 frame:0
TX packets:63 errors:0 dropped:81 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6371 (6.2 KiB) TX bytes:6801 (6.6 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:3441 errors:0 dropped:0 overruns:0 frame:0
TX packets:3441 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:291963 (285.1 KiB) TX bytes:291963 (285.1 KiB)
pod
的生命周期
init容器
pod
可以包含多个容器
,应用
运行在这些容器
里面,同时pod
也可以有一个或多个
先于应用容器
启动的init容器
。init
容器与普通的容器
非常像,除了如下两点:- 它们总是
运行到完成
init容器
不支持Readiness
,因为它们必须在pod
就绪之前运行完成
,一个init容器
必须运行成功
,下一个init
才能运行
。
- 它们总是
- 如果
pod
的init容器
失败,Kubernetes
会不断
地重启该pod
,直到init容器
成功为止。但是,如果pod
对应地restartPolicy
值为Never
,它不会重新启动
。
init容器
的功能
init容器
可以包含一些安装过程
中应用容器
中不存在
的实用工具
或个性化代码
init容器
可以安全地运行这些工具
,避免这些工具
导致应用镜像
地安全性降低应用镜像
的创建者
和部署者
可以各自独立工作
,而没有必要联合构建
一个单独的应用镜像
init容器
能以不同于Pod
内应用容器
的文件系统
视图运行
。因此,Init容器
可具有访问Secrets
的权限,而应用容器
不能够访问
。- 由于
Init容器
必须在应用容器
启动之前
运行完成,因此Init容器
提供了一种机制
来阻塞或延迟应用容器的启动
,直到满足
了一组先决条件
。一旦前置条件
满足,Pod
内的所有
的应用容器
会并行启动
。
init容器示例
[root@k8s-master ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: huazi
name: huazi
spec:
containers:
- image: myapp:v1
name: myapp
initContainers:
- image: busybox
name: init-myservice
command: ["sh","-c","until test -e /testfile;do echo wating for myservice;sleep 2;done"]
[root@k8s-master ~]# kubectl apply -f pod.yml
pod/huazi created
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi 0/1 Init:0/1 0 15s 10.244.2.31 k8s-node2.org <none> <none>
[root@k8s-master ~]# kubectl logs pods/huazi init-myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
#当创建完文件后,运行成功
[root@k8s-master ~]# kubectl exec pods/huazi -c init-myservice -- /bin/sh -c "touch /testfile"
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
huazi 1/1 Running 0 2m24s 10.244.2.31 k8s-node2.org <none> <none>