K8s-----(二)Pod管理

1 什么是pod

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/hosts
        172.25.12.1  server1 reg.westos.org
	mkdir /etc/docker/certs.d/red.westos.org -p
	
	server1:
	cp /certs/westos.org.crt /etc/docker/certs.d/red.westos.org/ca.crt
	scp /certs/westos.org.crt server2:/etc/docker/certs.d/red.westos.org/ca.crt
	scp /certs/westos.org.crt server3:/etc/docker/certs.d/red.westos.org/ca.crt

什么是pod?

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的管理

2.1 创建Pod应用

(1)创建并运行一个或多个容器镜像

  • 查看命名空间:kubectl get namespaces

在这里插入图片描述

  • 集群内部任意节点可以访问Pod,但集群外部无法直接访问
[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@server2 ~]# kubectl run demo --image=busyboxplus -it
                            ## 名字     镜像      
If you don't see a command prompt, try pressing enter.
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
3: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue 
    link/ether d6:42:c6:df:91:2f brd ff:ff:ff:ff:ff:ff
    inet 10.244.2.3/24 brd 10.244.2.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # Session ended, resume using 'kubectl attach demo -c demo -i -t' command 
when the pod is running
## 如果一个pod中有多个容器,要查看具体的某个容器的的输出,需要在pod名后使用-c containers name指定运行的容器;如果一个pod中只有一个容器则不用指定

[root@server2 ~]# kubectl get pod 
NAME     READY   STATUS    RESTARTS   AGE
demo     1/1     Running   0          39s
nginx1   1/1     Running   0          7m
[root@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   <none>           <none>
nginx1   1/1     Running   0          7m3s   10.244.1.3   server3   <none>           <none>
[root@server2 ~]# kubectl attach demo -it
Defaulting container name to demo.
Use 'kubectl describe pod/demo -n default' to see all of the containers in this pod.
If you don't see a command prompt, try pressing enter.
/ # curl 10.244.1.3
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
/ # Session ended, resume using 'kubectl attach demo -c demo -i -t' command when the pod is running
  • 查看指定pod的详细信息:kubectl describe pod demo

在这里插入图片描述

  • 删除pod容器
[root@server2 ~]# kubectl delete pod nginx1
pod "nginx1" deleted
[root@server2 ~]# kubectl get pod  ## 名称为demo的pod成功删除
NAME                     READY   STATUS    RESTARTS   AGE
demo                     1/1     Running   0          14m

2.2 deployment类型的pod控制器

Controller可以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。

(1)创建一个deployment类型的pod控制器

## 创建一个deployment类型的pod控制器
[root@server2 ~]# kubectl create deployment nginx --image=myapp:v1 
deployment.apps/nginx created
[root@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

(2)查看rs的信息

  • ReplicaSet的名字总是<Deployment的名字>-<pod template的hash值>
[root@server2 ~]# kubectl get rs ## 列出rs的信息
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-67f9d9c97f   1/1     Running   0          41s
## nginx:名字,67f9d9c97f:控制器(replicaset)

(3)Replica Set将保证总是有1个nginx的 pod 存在

  • 删除pod容器,只是删除了pod容器,并没有删除pod控制器,相当于删除pod后,pod控制器在拉起一个新的pod
[root@server2 ~]# kubectl delete pod nginx-67f9d9c97f-jxpzz 
pod "nginx-67f9d9c97f-jxpzz" deleted
[root@server2 ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
demo                     1/1     Running   0          15m
nginx-67f9d9c97f-g9b5l   1/1     Running   0          4s
  • 删除控制器nginx:kubectl delete deployments.apps nginx,删除控制器后,控制器中的pod也会随之被删除

2.2 Deployment 扩容

(1)扩容或缩容 DeploymentPod数量

  • scale也可以指定多个前提条件,如:当前副本数量或 --resource-version,进行伸缩比例设置前,系统会先验证前提条件是否成立。设定了副本的数量时,如果删除其中的一个容器,会自动创建pod满足副本的数量
  • 收缩时默认回收最后运行的pod
## 将nginx控制器拉伸为两个副本
[root@server2 ~]# kubectl scale deployment --replicas=2 nginx 
deployment.apps/nginx scaled
[root@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@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@server2 ~]# kubectl scale deployment --replicas=4 nginx
deployment.apps/nginx scaled
[root@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@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@server2 ~]# kubectl scale deployment --replicas=2 nginx 
deployment.apps/nginx scaled
[root@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>

2.3 创建service

service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务

2.3.1 expose类型

(1)expose:集群内部访问

  • ClusterIP: 默认类型,自动分配一个仅集群内部可以访问的虚拟IP
[root@server2 ~]# kubectl expose deployment nginx --port=80
service/nginx exposed
## 此时pod客户端可以通过service的名称访问后端的Pod
[root@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@server2 ~]# curl 10.105.92.115
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server2 ~]# curl 10.105.92.115/hostname.html
nginx-67f9d9c97f-g9b5l
[root@server2 ~]# curl 10.105.92.115/hostname.html
nginx-67f9d9c97f-2tzjg
[root@server2 ~]# curl 10.105.92.115/hostname.html
nginx-67f9d9c97f-2tzjg
[root@server2 ~]# curl 10.105.92.115/hostname.html
nginx-67f9d9c97f-g9b5l
[root@server2 ~]# curl 10.105.92.115/hostname.html
nginx-67f9d9c97f-2tzjg

(2)查看service的信息:kubectl describe svc

  • 查看pod的信息:kubectl get pod -o wide

在这里插入图片描述

2.3.2 NodePort类型

NodePort类型暴露端口,实现外部访问Pod

  • 修改service的类型为NodePort:kubectl edit svc nginx

在这里插入图片描述
在这里插入图片描述

  • 查看 service的信息:kubectl get svc

在这里插入图片描述

  • NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,通过 NodeIP:NodePort来访问该服务
curl 172.25.12.2:30440/hostname.html

在这里插入图片描述

curl 172.25.12.4:30440/hostname.html

在这里插入图片描述

2.4 pod镜像的更新、回滚

(1)pod镜像的更新

  • 查看pod控制器或者pod信息:kubectl get pod -o wide

在这里插入图片描述

  • 查看pod的详细信息:kubectl describe pod nginx-67f9d9c97f-g9b5l

在这里插入图片描述

  • 更新pod镜像:kubectl set image deployment nginx myapp=myapp:v2 --record

在这里插入图片描述

curl 172.25.12.4:30440

在这里插入图片描述
(2)pod镜像的回滚

  • 查看历史版本:kubectl rollout history deployment nginx

在这里插入图片描述

  • 回滚版本:kubectl rollout undo deployment nginx --to-revision=3

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值