作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122794334
目录
第1章 Pods概述
1.1 官网链接
Pods | Kuberneteshttps://kubernetes.io/zh/docs/concepts/workloads/pods/
1.2 什么是Pods
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算/应用单元。
Pod 是由一组(一个或多个) 容器组成; 这些容器共享存储、网络、以及怎样运行这些容器的声明。
Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。
Pod 所建模的是特定于应用的“逻辑主机”,其中包含一个或多个应用容器, 这些容器是相对紧密的耦合在一起的。
在非云环境中,在相同的物理机或虚拟机上运行的应用类似于在同一逻辑主机上运行的云应用。
Pod 的共享上下文包括一组 Linux 名字空间、控制组(cgroup)和可能一些其他的隔离 方面,即用来隔离 Docker 容器的技术。 在 Pod 的上下文中,每个独立的应用可能会进一步实施隔离。
1.3 为什么需要Pods
容器是微服务的最小管理单元,每个容器承载一个微服务,微服务通过IP:端口号提供对外的网络服务。
微服务的粒度太小,且每个微服务是相互独立的,然后,大多数应用中,多个紧密相关联的微服务组成一个整体,完成某种功能,因此,需要一种机制,把多个紧密相关联的微服务整合在一起,这些微服务是一起部署的,这就是Pods。
1.4 Pods的本质是Scurm Team
如果把每个微服务比成是敏捷团队的一个个开发程序员的话,那么Pod就是一个个敏捷团队Scurm Team。在端到端的软件开发中,Scurm Team作为一个整体,承担任务Task的开发 。
1.5 Pods如何管理多个容器
Pod 被设计成支持形成高内聚的微服务单元的多个协作过程(形式为容器)。
Pod 中的容器被自动安排到集群中的同一物理机或虚拟机上,并可以一起进行调度。
容器之间可以共享资源和依赖、彼此通信、协调何时以及何种方式终止自身。
例如,你可能有一个容器,为共享卷中的文件提供 Web 服务器支持,以及一个单独的 “sidecar(挂斗)”容器负责从远端更新这些文件,如下图所示:
1.6 由Pods组成的集群
1.7 Pods的状态与阶段
1.8 Pod中容器的状态
第2章 Pods管理的主要手段与方法
2.1 kubectl 命令行操作
kubectl get pod
2.2 yaml配置的方式操作
(1)vi 创建配置文件xxx.yaml
(2)配置文件解读
# 声明api的版本。
apiVersion: v1
# kind代表资源的类型,资源是Pod。
kind: Pod
# 资源叫什么名字,是在其属性metadata里面的。
metadata:
# 第一个属性name的值是nginx,即Pod的名字就叫做Nginx。
name: nginx
# 给Pod贴上了一个标签,标签是app: web,标签是有一定的作用的。
labels:
app: web
# spec是详细,详细里面定义了一个容器。
spec:
# 定义一个容器,可以声明多个容器的。
containers:
# 容器的名称叫做nginx
- name: nginx
# 使用了什么镜像,可以使用官方公有的,也可以使用私有的。
image: nginx:1.13
# ports定义容器的端口。
ports:
# 容器的端口是80,如果容器有多个端口,可以在后面接着写一行即可。
- containerPort: 80
(3)实施/应用配置文件
kubectl create -f xxx.yaml
kubectl apply -f xxx.yaml
2.3 dashboard UI操作
本文以命令行操作为主,UI方式为辅。
第3章 Pods服务的主要操作方法
3.1 获取当前Pods服务
# 获取指定pod的部署信息
$ kubectl get pod nginx
# 获取默认名字空间的pods部署
$ kubectl get pods
# 显示详细详细
$ kubectl get pods -owide
# 获取所有名字空间的pods部署
$ kubectl get pods -A
# 获得当前已经创建的名字空间
$ kubectl get ns
$ kubectl get namespace
# 获取指定名字空间的pods部署
$ kubectl get pods --namespace xxxx
$ kubectl get pods -n xxx
3.2 Pod的详细信息查询
$ kubectl describe pod XXXX -n xxxx
$ kubectl describe pod kubernetes-dashboard-546cbc58cd-292dr -n kubernetes-dashboard
3.3 创建新只有一个容器的Pod
创建Pods服务时,并不需要指定Pods部署在哪个Node上,K8S会自动选择一个Node部署Pods服务。
$ kubectl run xxxpod-name --image=yyy-image-name:version
$ kubectl run mynginx --image=nginx:latest
xxxpod-name:pod的名字
yyy-image-name:容器镜像名称
如果本地无yyy-image-name,该名会自动从docker仓库中下载。
[root@k8s-master1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready control-plane,master 4d3h v1.23.3
k8s-node1 Ready <none> 3d22h v1.23.3
root@k8s-master1 ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mynginx 1/1 Running 0 38s 192.168.36.66 k8s-node1 <none> <none>
很显然:
- kubectl会自动选择一个节点k8s-node1来部署应用,不需要用户指定。
- 每个pod都有自己独立的IP地址: 192.168.36.66 ,这个地址不同于节点的IP地址。
3.4 创建新包含多个容器的Pod
(1)通过yaml文件
$ touch my-pods.yaml
$ vi my-pods.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-app
labels:
name: my-app
spec:
containers:
- name: tomcat
image: tomcat:latest
ports:
- containerPort: 8080
- name: mynginx
image: nginx:latest
ports:
- containerPort: 80
在该pod中,pod name = my-app
包括2个容器镜像:tomcat, nginx
(2)应用
#方法1
root@k8s-master1 ~]# kubectl create -f my-pod.yaml
#方法2
root@k8s-master1 ~]# kubectl apply -f my-pod.yaml
(3)展现结果
root@k8s-master1 ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-app 2/2 Running 0 67s 192.168.36.68 k8s-node1 <none> <none>
mynginx 1/1 Running 0 8m22s 192.168.36.66 k8s-node1 <none> <none>
- pod mynginx:只有一个容器,IP = 192.168.36.66,部署节点:k8s-node1
- pod my-app :有两个容器, IP = 192.168.36.68, 部署节点:k8s-node1
3.5 命令方式进入Pods内部(在master上执行)
# 进入mynginx pod默认容器的内部
$ kubectl exec -it mynginx -- /bin/sh
# 进入my-app pod默认容器的内部
$ kubectl exec -it my-app -- /bin/sh
Defaulted container "tomcat" out of: tomcat, mynginx
进入my-app pod指定的容器mynginx的内部
$ kubectl exec -it my-app -c mynginx -- /bin/sh
3.6 Pod内部不同容器之间的相互访问
相当于传统的一个物理机内部不同线程或进程之间的网络访问,可以通过127.0.0.1:port来访问。
# curl 127.0.0.1:80
<!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>
3.7 集群内部不同节点之间访问Pods
相同于传统的不同物理机器的进程或线程之间的网络访问,可以Pod私有网络IP地址:port来访问。
$ curl ip-address:port
[root@k8s-master1 ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-app 2/2 Running 0 12m 192.168.36.68 k8s-node1 <none> <none>
mynginx 1/1 Running 0 19m 192.168.36.66 k8s-node1 <none> <none>
[root@k8s-master1 ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-app 2/2 Running 0 15m 192.168.36.68 k8s-node1 <none> <none>
mynginx 1/1 Running 0 22m 192.168.36.66 k8s-node1 <none> <none>
[root@k8s-master1 ~]# curl 192.168.36.68:80
<!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>
[root@k8s-master1 ~]# curl 192.168.36.68:8080
<!doctype html><html lang="en"><head><title>HTTP Status 404 鈥Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 鈥Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/10.0.14</h3></body></html>
[root@k8s-master1 ~]# curl 192.168.36.66:80
<!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>
3.8 集群外部访问集群内部的Pods
需要进行特定的端口映射,后续再继续讨论。
3.9 删除Pods服务
(1)通过kubectl delete删除指定Pod
# 默认名字空间
$ kubectl delete pod mynginx
# 指定名字空间
$ kubectl delete pod mynginx -n dev
(2)通过kubectl delete批量删除全部Pod
$ kubectl delete pod --all
(3)根据配置文件的要求删除
$ kubectl delete -f xxx.yaml
第4章 Pod服务的主要优良特征
(1)自动Node节点选择
不需要创建者指定Pod部署在集群中的哪个节点上,K8S会根据当前部署的实际情况,自动选择部署Pod的节点。
(2)资源共享:IP和Volume
一个Pod里的多个容器可以看作一个逻辑的主机,可以共享的资源有:
- 存储
- IP网络
- namespace,
- cgroups
- 或者其他的隔离资源。
多个容器共享同一个network namespace,由此在一个Pod里的多个容器共享Pod的IP和端口namespace,所以一个Pod内的多个容器之间可以通过localhost来进行通信,所需要注意的是不同容器要注意不要有端口冲突即可。不同的Pod有不同的IP,不同Pod内的多个容器之前通信,不可以使用IPC(如果没有特殊指定的话)通信,通常情况下使用Pod的IP进行通信。
k8s要求底层网络支持集群内任意两个pod直接的TCP/IP直接通信,这通常才有虚拟二层网络技术来实现,例如Flannel,Openswitch等。
一个Pod里的多个容器可以共享存储卷,这个存储卷会被定义为Pod的一部分,并且可以挂载到该Pod里的所有容器的文件系统上。
(3)自动重新部署
Pod属于生命周期比较短暂的组件,比如,当Pod所在节点发生故障,那么该节点上的Pod会被调度到其他节点,但需要注意的是,被重新调度的Pod是一个全新的Pod,跟之前的Pod没有半毛钱关系。
(4)平坦的网络
K8s集群中的所有Pod都在同一个共享网络地址空间中,也就是说每个Pod都可以通过其他Pod的IP地址来实现访问。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122794334