Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。
Pod (就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的“逻辑主机”,其中包含一个或多个应用容器, 这些容器是相对紧密的耦合在一起的。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于 在同一逻辑主机上运行的云应用。
除了应用容器,Pod 还可以包含在 Pod 启动期间运行的 Init 容器。
实验环境:
(1)server1:搭建harbor仓库
(2)k8s的部署:
server2:k8s主节点server3、server4:k8s子节点
(3)k8s的各个节点可以使用harbor仓库
server1-4:vim /etc/hosts172.25.12.1 server1 reg.westos.orgmkdir /etc/docker/certs.d/red.westos.org -pserver1:cp /certs/westos.org.crt /etc/docker/certs.d/red.westos.org/ca.crtscp /certs/westos.org.crt server2:/etc/docker/certs.d/red.westos.org/ca.crtscp /certs/westos.org.crt server3:/etc/docker/certs.d/red.westos.org/ca.crt
Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。
一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker),多个容器间共享IPC、Network和UTC namespace
pod的理解
pod将容器绑定在一起,并将它们作为一个单元进行管理。在pod中,多个容器可以同时进行一些密切相关的进程,但又保持着一定的隔离。容器组内的容器共享一些资源,不是全部资源。
k8s通过配置docker让一个pod中的容器共享相同的linux命名空间,所以一个pod下的所有容器共享相同的主机名和网络接口。这些容器也都在相同的IPC命名空间下运行,能够通过IPC进行通信。同一pod下的容器需要注意不能绑定到相同的端口号,否则会导致端口冲突。每个pod有独立的端口空间,不同pod下的容器永远不会遇到端口冲突。一个pod中的所有容器都具有相同的loopback网络接口,容器可以通过localhost与同一pod的其他容器进行通信。
k8s中所有的pod都在同一个共享网络地址空间中,每个pod都有自己的IP,每个pod都可以通过其他pod的IP地址实现相互访问。无论pod是否在同一个工作节点上都能够相互通信
每个pod获得可路由的IP地址,其他pod都可以在该ip地址下看到该pod
通过pod管理容器: 将多层应用分散到多个pod中,基于扩缩容考虑分割到多个pod中。
何时在pod中使用多个容器:将多个容器添加到单个pod的主要原因是应用可能由一个主要进程和一个活多个辅助进程组成的
2 pod的管理(1)创建并运行一个或多个容器镜像
kubectl get namespaces
[root@server2 ~]# kubectl run nginx1 --image=myapp:v1(镜像)## 创建pod时不指定命名空间默认default
pod/nginx1 created
[root@server2 ~]# kubectl get pod -n default ## 使用-n 指定命名空间
NAME READY STATUS RESTARTS AGE
nginx1 1/1 Running 0 5s
[root@server2 ~]# kubectl get pod ## 列出所有运行的Pod信息
NAME READY STATUS RESTARTS AGE
nginx1 1/1 Running 0 17s
[root@server2 ~]# kubectl get pod -o wide ## 列出Pod以及运行Pod节点信息
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx1 1/1 Running 0 36s 10.244.1.3 server3 <none> <none>[root&#64;server2 ~]# kubectl run demo --image&#61;busyboxplus -it## 名字 镜像
If you don&#39;t see a command prompt, try pressing enter.
/ # ip addr
1: lo:
3: eth0&#64;if7:
/ # Session ended, resume using &#39;
when the pod is running
## 如果一个pod中有多个容器&#xff0c;要查看具体的某个容器的的输出&#xff0c;需要在pod名后使用-c containers name指定运行的容器&#xff1b;如果一个pod中只有一个容器则不用指定[root&#64;server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 39s
nginx1 1/1 Running 0 7m
[root&#64;server2 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo 1/1 Running 0 42s 10.244.2.3 server4
nginx1 1/1 Running 0 7m3s 10.244.1.3 server3
[root&#64;server2 ~]# kubectl attach demo -it
Defaulting container name to demo.
Use &#39;
If you don&#39;t see a command prompt, try pressing enter.
/ # curl 10.244.1.3
Hello MyApp | Version: v1 | <a href&#61;"hostname.html">Pod Name</a>
/ # Session ended, resume using &#39;kubectl attach demo -c demo -i -t&#39; command when the pod is running
kubectl describe pod demo
[root&#64;server2 ~]# kubectl delete pod nginx1
pod "nginx1" deleted
[root&#64;server2 ~]# kubectl get pod ## 名称为demo的pod成功删除
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 14m
Controller可以创建和管理多个Pod&#xff0c;提供副本管理、滚动升级和集群级别的自愈能力。例如&#xff0c;如果一个Node故障&#xff0c;Controller就能自动将该节点上的Pod调度到其他健康的Node上。
&#xff08;1&#xff09;创建一个deployment类型的pod控制器
## 创建一个deployment类型的pod控制器
[root&#64;server2 ~]# kubectl create deployment nginx --image&#61;myapp:v1
deployment.apps/nginx created
[root&#64;server2 ~]# kubectl get pod ## 查看pod控制器或者pod信息
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 14m
nginx-67f9d9c97f-jxpzz 1/1 Running 0 16s
&#xff08;2&#xff09;查看rs的信息
[root&#64;server2 ~]# kubectl get rs ## 列出rs的信息
NAME READY STATUS RESTARTS AGE
pod/nginx-67f9d9c97f 1/1 Running 0 41s
## nginx&#xff1a;名字&#xff0c;67f9d9c97f&#xff1a;控制器&#xff08;replicaset&#xff09;
&#xff08;3&#xff09;Replica Set将保证总是有1个nginx的 pod 存在
[root&#64;server2 ~]# kubectl delete pod nginx-67f9d9c97f-jxpzz
pod "nginx-67f9d9c97f-jxpzz" deleted
[root&#64;server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 15m
nginx-67f9d9c97f-g9b5l 1/1 Running 0 4s
kubectl delete deployments.apps nginx
&#xff0c;删除控制器后&#xff0c;控制器中的pod也会随之被删除&#xff08;1&#xff09;扩容或缩容 DeploymentPod数量
## 将nginx控制器拉伸为两个副本
[root&#64;server2 ~]# kubectl scale deployment --replicas&#61;2 nginx
deployment.apps/nginx scaled
[root&#64;server2 ~]# kubectl get pod ### 两个pod副本
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 17m
nginx-67f9d9c97f-2tzjg 1/1 Running 0 3s
nginx-67f9d9c97f-g9b5l 1/1 Running 0 76s
[root&#64;server2 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo 1/1 Running 0 17m 10.244.2.3 server4 <none> <none>
nginx-67f9d9c97f-2tzjg 1/1 Running 0 20s 10.244.1.5 server3 <none> <none>
nginx-67f9d9c97f-g9b5l 1/1 Running 0 93s 10.244.2.4 server4 <none> <none>
[root&#64;server2 ~]# kubectl scale deployment --replicas&#61;4 nginx
deployment.apps/nginx scaled
[root&#64;server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 17m
nginx-67f9d9c97f-2tzjg 1/1 Running 0 37s
nginx-67f9d9c97f-g9b5l 1/1 Running 0 110s
nginx-67f9d9c97f-h72md 0/1 ContainerCreating 0 3s
nginx-67f9d9c97f-xgr8g 0/1 ContainerCreating 0 3s
[root&#64;server2 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo 1/1 Running 0 17m 10.244.2.3 server4 <none> <none>
nginx-67f9d9c97f-2tzjg 1/1 Running 0 40s 10.244.1.5 server3 <none> <none>
nginx-67f9d9c97f-g9b5l 1/1 Running 0 113s 10.244.2.4 server4 <none> <none>
nginx-67f9d9c97f-h72md 1/1 Running 0 6s 10.244.1.7 server3 <none> <none>
nginx-67f9d9c97f-xgr8g 1/1 Running 0 6s 10.244.1.6 server3 <none> <none>## 收缩时默认回收最后运行的
[root&#64;server2 ~]# kubectl scale deployment --replicas&#61;2 nginx
deployment.apps/nginx scaled
[root&#64;server2 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo 1/1 Running 0 18m 10.244.2.3 server4 <none> <none>
nginx-67f9d9c97f-2tzjg 1/1 Running 0 62s 10.244.1.5 server3 <none> <none>
nginx-67f9d9c97f-g9b5l 1/1 Running 0 2m15s 10.244.2.4 server4 <none> <none>
service是一个抽象概念&#xff0c;定义了一个服务的多个pod逻辑合集和访问pod的策略&#xff0c;一般把service称为微服务
&#xff08;1&#xff09;expose&#xff1a;集群内部访问
[root&#64;server2 ~]# kubectl expose deployment nginx --port&#61;80
service/nginx exposed
## 此时pod客户端可以通过service的名称访问后端的Pod
[root&#64;server2 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h7m
nginx ClusterIP 10.105.92.115 <none> 80/TCP 18s
[root&#64;server2 ~]# curl 10.105.92.115
Hello MyApp | Version: v1 | <a href&#61;"hostname.html">Pod Name</a>
[root&#64;server2 ~]# curl 10.105.92.115/hostname.html
nginx-67f9d9c97f-g9b5l
[root&#64;server2 ~]# curl 10.105.92.115/hostname.html
nginx-67f9d9c97f-2tzjg
[root&#64;server2 ~]# curl 10.105.92.115/hostname.html
nginx-67f9d9c97f-2tzjg
[root&#64;server2 ~]# curl 10.105.92.115/hostname.html
nginx-67f9d9c97f-g9b5l
[root&#64;server2 ~]# curl 10.105.92.115/hostname.html
nginx-67f9d9c97f-2tzjg
&#xff08;2&#xff09;查看service的信息&#xff1a;kubectl describe svc
NodePort类型暴露端口&#xff0c;实现外部访问Pod
kubectl edit svc nginx
kubectl get svc
curl 172.25.12.2:30440/hostname.html
curl 172.25.12.4:30440/hostname.html
&#xff08;1&#xff09;pod镜像的更新
kubectl get pod -o wide
kubectl describe pod nginx-67f9d9c97f-g9b5l
kubectl set image deployment nginx myapp&#61;myapp:v2 --record
curl 172.25.12.4:30440
&#xff08;2&#xff09;pod镜像的回滚
kubectl rollout history deployment nginx
kubectl rollout undo deployment nginx --to-revision&#61;3