1. 什么是Pod
Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。
一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker),多个容器间共享IPC、Network和UTC namespace。
注意:以下实验是在搭建好k8s的基础上进行的(见上一篇博文)
2.pod管理
- 1.用自主命令的方式运行pod
部署过程中所有需要的镜像均由server2 push到harbor仓库中
各个节点必须配置有certs.d/westos.org/ca.crt 认证
可以从harbor仓库中拉取镜像
运行服务nginx:
修改镜像仓库
docker run --name demo --image=westos.org/library/nginx
注意:创建时不指定namespace,默认都在default中
查看日志
kubeclt logs demo
容器中访问pod
删除pod:
kubectl delete pod demo
- 2.deployment方式运行pod(部署)
首先我们用自主命令方式运行nginx和myapp镜像:
kubectl run nginx --image=nginx
kubectl run myapp --image=myapp:v1
查看pod的运行状态:
kubectl get pod
kubectl get pod -o wide
删除myapp:
kubectl delete pod myapp
我们发现用这种方式运行的myapp可以顺利删除
用 deployment方式运行myapp:
kubectl create deployment myapp --image=myapp:v1
kubectl get pod
删除myapp:
kubectl delete pod myapp-7449b5b68f-ss8b8
kubectl get pod #可以看到又多出了myapp-7449b5b68f-pm5mn
kubectl get all
我们可以发现删除deployment方式运行的myapp,删除后会自动创建一个新的,这是通过副本来维护的
通过该方式创建的pod无法通过kubectl delete pod ,这是通过rs(副本)来维护的。
可以通过使用depolyment来删除
- 3.deloyment形式的pod拉伸
kubectl scale --replicas=2 deployment app
kubectl get pod
kubectl get pod -o wide
删除Pod:
kubectl delete pod app-6db489d4b7-2v97v
##由于--replicas=2,集群会自动创建Pod。
kubectl delete deployment nginx
- 4.创建服务Pod间的互相访问
service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务。
创建service
kubectl expose deployment app --port=80 --target-port=80
kubectl get deployments.apps
此时pod客户端可以通过service的名称访问后端的两个Pod
ClusterIP: 默认类型,自动分配一个仅集群内部可以访问的虚拟IP
kubectl get svc
kubectl describe svc app
测试:
kubectl run test1 -it --image=reg.westos.org/k8s/busyboxplus
kubectl attach test -it
curl 10.109.54.133/hostname.html
curl 10.109.54.133/hostname.html
我们可以看到它实现了pod的负载均衡
当我们拉伸pod时,它会自动识别,从而添加到负载均衡集群中
实现了Pod的负载均衡。
当拉伸时,会自动识别
但是这种方式实现的还是一个集群内部可以访问的虚拟ip
- 5.把pod暴露给集群外部主机
对于已经创建的Pod,可以手动修改type
NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort 来访问该服务
方法一:对于已经创建的pod,可以手动修改type
访问:
方法二:在创建时指定–type=NodePort
kubectl expose deployment app --port=80 --target-poet=80 --type=NodePort
kubectl get pod -o wide
kubectl get svc app
可以看到它对外提供的端口
测试:
curl 172.25.254.3:31365
curl 172.25.254.3:31365/hostname.html
此时在集群外部也可以访问到集群内部的pod
- 6.Pod扩容与缩容
$ kubectl scale --replicas=6 deployment nginx
$ kubectl scale --replicas=3 deployment nginx
- 7.pod的滚动更新以及回滚
更新pod镜像:
kubectl set image deployments app myapp=westos.org/library/myapp:v2 --record
回滚:
kubectl rollout history deployment app //查看历史版本
kubectl rollout undo deployment app --to-revision=1 //回滚版本
可以看到版本信息变成v2了:
回滚到v1版本: