Kubernetes探索学习003--关于Kubernetes的Pod
关于Pod
关于Pod我们要慢慢去体会去接受它去使用它,尤其是运维人员这块需要从逻辑上形成认识,首先理解Pod是Kubernetes项目的原子调度单位。为什么是Pod而不是单个DockerContainer?因为“容器设计模式”,一种把容器组合起来使用的方法模式。用大脑去想象,单个DockerContainer是未来云计算系统中的进程,容器镜像是系统中形形色色的安装包,Kubernetes是这个系统。Pod作为一个逻辑抽象概念,可以想成是这个系统上的虚拟机,我们难道不应该掌握虚拟机的使用方法吗😂
1.具体实践
1.Pod级别俩个容器共享一个Volume的例子
1.编写YAML文件
[root@kubernetes01 ~]# cat two-container.yaml
apiVersion: v1
kind: Pod
metadata:
name: two-containers
spec:
restartPolicy: Never
volumes:
- name: shared-data
hostPath:
path: "/home/data/kubernetes/shared-data"
containers:
- name: nginx-container-01
image: nginx
volumeMounts:
- name: shared-data
mountPath: /usr/share/nginx/html
- name: debian-container-01
image: debian
volumeMounts:
- name: shared-data
mountPath: /pod-data
command: ["/bin/sh"]
args: ["-c", "echo Welcome to debian container > /pod-data/index.html"]
2.启动之后查看pod信息
[root@kubernetes01 ~]# kubectl describe pod two-containers
Name: two-containers
Namespace: default
Priority: 0
PriorityClassName: <none>
Node: kubernetes02/10.5.0.207
Start Time: Mon, 11 Mar 2019 14:59:58 +0800
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"two-containers","namespace":"default"},"spec":{"containers":[{"image"...
Status: Running
IP: 10.44.0.3
Containers:
nginx-container-01:
Container ID: docker://00373fd44ec787b57c373e3bb8bc9869ae0706630d7f34f786f8c5ae2d896af2
Image: nginx
Image ID: docker-pullable://nginx@sha256:98efe605f61725fd817ea69521b0eeb32bef007af0e3d0aeb6258c6e6fe7fc1a
Port: <none>
Host Port: <none>
State: Running
Started: Mon, 11 Mar 2019 15:00:17 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/usr/share/nginx/html from shared-data (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-8j8dl (ro)
debian-container-01:
Container ID: docker://a95c3d84fc0b3cce966f3db53a97f7d3681f723c5aa83dadbfc2ddf9b7be677f
Image: debian
Image ID: docker-pullable://debian@sha256:72e996751fe42b2a0c1e6355730dc2751ccda50564fec929f76804a6365ef5ef
Port: <none>
Host Port: <none>
Command:
/bin/sh
Args:
-c
echo Welcome to use debian container > /pod-data/index.html
State: Terminated
Reason: Completed
Exit Code: 0
Started: Mon, 11 Mar 2019 15:00:37 +0800
Finished: Mon, 11 Mar 2019 15:00:37 +0800
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/pod-data from shared-data (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-8j8dl (ro)
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
shared-data:
Type: HostPath (bare host directory volume)
Path: /home/data/kubernetes/shared-data
HostPathType:
default-token-8j8dl:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-8j8dl
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 117s default-scheduler Successfully assigned default/two-containers to kubernetes02
Normal Pulling 117s kubelet, kubernetes02 pulling image "nginx"
Normal Pulled 98s kubelet, kubernetes02 Successfully pulled image "nginx"
Normal Created 98s kubelet, kubernetes02 Created container
Normal Started 98s kubelet, kubernetes02 Started container
Normal Pulling 98s kubelet, kubernetes02 pulling image "debian"
Normal Pulled 78s kubelet, kubernetes02 Successfully pulled image "debian"
Normal Created 78s kubelet, kubernetes02 Created container
Normal Started 78s kubelet, kubernetes02 Started container
3.访问测试
这块儿nginx镜像默认是80端口
so
[root@kubernetes01 ~]# curl 10.44.0.3
Welcome to debian container
2.挂载war包到tomcat中的例子
1.编写YAML文件
[root@kubernetes01 ~]# cat java-web-001.yaml
apiVersion: v1
kind: Pod
metadata:
name: java-web-001
spec:
initContainers:
- image: registry:5000/jenkins:v2
name: war
command: ["cp","/jenkins.war","/app"]
volumeMounts:
- name: java-test001-volume
mountPath: "/app"
containers:
- image: tomcat:latest
name: tomcat
volumeMounts:
- name: java-test001-volume
mountPath: "/usr/local/tomcat/webapps"
ports:
- containerPort: 8080
hostPort: 8004
volumes:
- name: java-test001-volume
emptyDir: {}
2.启动之后通过kubectl describe pod java-web-001无报错,访问测试
[root@kubernetes01 ~]# curl 10.40.0.7:8080/jenkins/
<html><head><meta http-equiv='refresh' content='1;url=/jenkins/login?from=%2Fjenkins%2F'/><script>window.location.replace('/jenkins/login?from=%2Fjenkins%2F');</script></head><body style='background-color:white; color:white;'>
Authentication required
<!--
You are authenticated as: anonymous
Groups that you are in:
Permission you need to have (but didn't): hudson.model.Hudson.Administer
-->
</body></html>
当然也可以直接在浏览器中访问节点IP的URL来测试。这块jenkins的war包镜像是直接把war包放在了busybox标准镜像的根目录下,tomcat用的是标准镜像。用initContainer优先运行WAR包镜像,这种模式叫做sidecar!解决的俩者之间的耦合问题!
这块儿需要强调下,研究Kubernetes之前需要具备一些docker的基础知识,比如Dokerfile的基本编写规则,本地docker仓库怎么搭建,以及一些docker常用命令。
关于Dockerfile的常用字段描述,帮你回忆一下
FROM 基础镜像
MAINTAINER 维护者信息
RUN 想要执行的命令
ADD copy文件到镜像中
WORKDIR 当前工作目录
VOLUME 目录挂载
EXPOSE 端口设置
RUN 运行进程
2.感悟总结
要去理解Pod实现的原理,Pod其实是一组共享了某些资源的容器,还有就是sidecar这种玩法儿,值得回味!明确一点,一个容器就是一个进程!Pod提供的是一种容器编排的思想!
3.遇到的问题
Back-off restarting failed container的问题,这种问题需要追本溯源去查,如果遇到就去刨根问底,你一定会发现问题的所在!有时候你去某某群里请教大佬们,大佬们也不一定能立马解决你的问题,所以谨慎细心提高自己解决问题的能力才是关键所在!特别感谢张磊老师,感谢他的精品课!

听君一席话,胜读十年书。🙏
PS:文中服务器使用的是国内某☁️的机器
欢迎大家留言讨论,欢迎大家和我一起学习😄~~~
分类:
Kubernetes
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现