pod管理
应用部署
上传测试镜像
[root@k8s1 docker]# docker push reg.westos.org/library/myapp:v1
[root@k8s1 docker]# docker push reg.westos.org/library/myapp:v2
创建自助式pod(生产不推荐)
[root@k8s2 ~]# kubectl run demo --image=myapp:v1
[root@k8s2 ~]# kubectl get pod -o wide //使用 wide 输出格式,可以展示更多的列,包括 Node(Pod 所在的节点)、IP、状态、重启次数、版本等信息
查看pod详情
[root@k8s2 ~]# kubectl describe pod demo //获取指定 Pod 的各项详细信息,包括容器的状态、日志、事件等
删除pod
[root@k8s2 ~]# kubectl delete pod demo
创建控制器(推荐)
[root@k8s2 ~]# kubectl create deployment myapp --image=myapp:v1 --replicas=3
//创建一个 Deployment 对象的命令,用于管理 Pod,管理的pod副本数为3
控制器自动维护pod副本数
[root@k8s2 ~]# kubectl get pod
[root@k8s2 ~]# kubectl get deployments.apps //返回所有 Deployments 的名称、可用副本数、所需副本数、更新策略等详细信息
[root@k8s2 ~]# kubectl delete pod myapp-67984c8646-4j6fs
[root@k8s2 ~]# kubectl get deployments.apps
[root@k8s2 ~]# kubectl get pod
在远程pod中执行命令
[root@k8s2 ~]# kubectl exec myapp-67984c8646-nwtl9 -- ls /usr/share/nginx/html
//在 Pod myapp-678fcbc488-gqdgk 中执行命令 ls /usr/share/nginx/html
扩容pod数量
[root@k8s2 ~]# kubectl scale deployment myapp --replicas=6
[root@k8s2 ~]# kubectl get pod
缩容pod数量
[root@k8s2 ~]# kubectl scale deployment myapp --replicas=3
[root@k8s2 ~]# kubectl get pod
通过service暴露pod
[root@k8s2 ~]# kubectl expose deployment myapp --port=80 --target-port=80
//kubectl expose deployment myapp 命令创建了一个 Service,并将 Deployment myapp 暴露在集群内部的网络中。
--port 参数指定了 Service 监听的端口号,这里为 80;
--target-port 参数指定了 Service 转发流量到 Deployment 中的 Pod 时所使用的端口号,这里同样为 80。
查看svc详情
[root@k8s2 ~]# kubectl describe svc myapp
//获取了名为 myapp 的 Service 的详细信息。该命令输出的信息包括:
Service 的名称、命名空间、标签等基本信息;
Service 的类型(ClusterIP、NodePort、LoadBalancer 等);
Service 的端口信息,包括监听的端口号、协议(TCP/UDP)等;
Service 关联的 Pod 信息,包括选择器、关联的 Pod 的 IP 地址、副本数等;
Service 的 Endpoints 信息,包括关联的 Pod 的 IP 地址和端口号。
[root@k8s2 ~]# curl 10.96.20.8
[root@k8s2 ~]# curl 10.96.20.8/hostname.html
service自动发现pod扩容与缩容,自动更新endpoints,实现对应用的负载均衡
service默认使用clusterip类型,只能在集群中访问
nodeport类型,可以在集群外部访问
[root@k8s2 ~]# kubectl edit svc myapp
[root@k8s2 ~]# kubectl get svc
访问集群任意节点+端口
更新应用版本
[root@k8s2 ~]# kubectl set image deployment/myapp myapp=myapp:v2 //将 myapp 容器的镜像更新为 myapp:v2
[root@k8s1 docker]# curl 192.168.81.11:31902
查看应用历史版本
[root@k8s2 ~]# kubectl rollout history deployment myapp //用于查看 Deployment myapp中所有副本集的升级历史记录
回滚
[root@k8s2 ~]# kubectl rollout undo deployment myapp --to-revision=1
删除应用
[root@k8s2 ~]# kubectl delete deployments.apps myapp
[root@k8s2 ~]# kubectl delete svc myapp
[root@k8s2 ~]# kubectl get ns
集群通过namespace来做资源隔离,默认操作的资源都指向default
编写yaml文件
获取帮助
[root@k8s2 pod]# kubectl explain pod.spec.containers
获取yaml模版
[root@k8s2 pod]# kubectl run demo --image nginx --dry-run=client -o yaml > pod.yaml
//--dry-run=client:使用客户端模式,即不会真正创建 Pod,仅会返回 YAML 格式的定义文件
-o yaml:以 YAML 格式输出定义文件
> pod.yaml:将输出的 YAML 定义文件保存到当前目录下的 pod.yaml 文件中
执行该命令会生成一个名为 pod.yaml 的文件,其中包含了一个定义 nginx 镜像 Pod 的 YAML 文件
[root@k8s2 pod]# vim pod.yaml
apiVersion: v1 //Kubernetes API的版本
kind: Pod //资源类型,这里是pod
metadata: //元数据对象,用于述 Pod 的基本信息,例如标签,名称等。
labels:
run: demo
name: demo
spec: //制定了pod的具体配置
containers: //定义了 Pod 中的容器
- image: nginx // 指定容器使用的镜像,这里使用的是nginx。
name: demo
imagePullPolicy: IfNotPresent //指定镜像拉取策略为IfNotPresent,表示如果本地已经存在相同版本的镜像,则不会从镜像仓库中拉取
创建pod
[root@k8s2 pod]# kubectl create -f pod.yaml //根据pod.yaml文件中的定义来创建一个新的 Kubernetes Pod对象
查看详情
[root@k8s2 pod]# kubectl get pod -o wide
[root@k8s2 pod]# kubectl describe pod demo
[root@k8s2 pod]# kubectl get pod demo -o yaml
//kubectl get pod -o wide命令会以表格形式显示所有的 Pod 对象,其中包括名称、状态、所在节点、IP地址、版本等信息。-o wide选项可以扩展输出内容,显示更多信息。
kubectl describe pod demo命令会以文本形式展示指定名称为 demo 的 Pod 对象的详细信息,包括 Pod 的元数据、各容器的信息、生命周期事件、存储和网络配置等。
kubectl get pod demo -o yaml命令会以 YAML 格式展示指定名称为 demo 的 Pod 对象的详细信息,包括 Pod 的元数据、各容器的信息、存储和网络配置等。这种格式的输出可以用于创建或修复 Pod 对象。
示例
1、
2、
3、
Guaranteed
,保证级别:Pod 中的容器都设置了 CPU 和 Memory 的 requests 和 limits,并且这些值相等。此时,如果资源满足所有 Guaranteed 类别的 Pod 的需求,则这些 Pod 会被同时调度在集群中,保证它们的运行。Burstable
,突发级别:Pod 中至少有一个容器设置了 CPU 和 Memory 的 requests 和 limits,但是这些值不相等。此时,如果资源足够,那么这些 Pod 会被相应地调度,但是它们的性能可能会受到限制,因为它们能够使用的资源是有上限的。BestEffort
,尽力级别:Pod 中的容器没有设置 CPU 和 Memory 的 requests 和 limits。此时,这些容器会尽力地获取集群中未被占用的资源,但是它们的资源使用是无法保证的,因为它们需要等待集群中已分配的所有资源使用完毕才能够获得更多的资源。
4、
5、
[root@k8s2 pod]# kubectl apply -f pod.yml //更新该 Pod 的配置
[root@k8s2 pod]# kubectl delete -f pod.yml //删除pod
init容器
[root@k8s2 pod]# vim init-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app.kubernetes.io/name: MyApp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox
command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
[root@k8s2 pod]# kubectl apply -f init-pod.yaml
[root@k8s2 pod]# kubectl get pod
在init容器没有成功运行之前,主容器不会被运行
添加svc定义
[root@k8s2 pod]# vim myservice.yaml
---
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
svc解析成功后,init容器退出,主容器运行
[root@k8s2 pod]# yum install -y bind-utils
[root@k8s2 pod]# dig -t A myservice.default.svc.cluster.local. @10.96.0.10
探针
存活探针
[root@k8s2 pod]# vim liveness-pod.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: nginx
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 3
periodSeconds: 3
[root@k8s2 pod]# kubectl apply -f liveness-pod.yaml