华子目录
- 什么是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>



















