Kubernetes——pod的管理及优化
Kubernetes pod的管理及优化
一、Kubernetes 中的资源
1、资源管理介绍
- 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。
- kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务
- 所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。
- kubernetes的最小管理单元是pod而不是容器,只能将容器放在
Pod中, - kubernetes一般也不会直接管理Pod,而是通过
Pod控制器来管理Pod的。 - Pod中服务的访问是由kubernetes提供的
Service资源来实现。 - Pod中程序的数据需要持久化是由kubernetes提供的各种存储系统来实现

2、资源管理方式
| 类型 | 适用环境 | 优点 | 缺点 |
|---|---|---|---|
| 命令式对象管理 | 测试 | 简单 | 只能操作活动对象,无法审计、跟踪 |
| 命令式对象配置 | 开发 | 可以审计、跟踪 | 项目大时,配置文件多,操作麻烦 |
| 声明式对象配置 | 开发 | 支持目录操作 | 意外情况下难以调试 |
-
命令式对象管理:直接使用命令去操作kubernetes资源
kubectl run webserver --image nginx --port=80
# 建立pod
[root@k8s-master ~]# kubectl run webserver --image nginx --port 80
pod/webserver created
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
webserver 1/1 Running 0 6s
[root@k8s-master ~]# kubectl -n default get pods
NAME READY STATUS RESTARTS AGE
webserver 1/1 Running 0 21s
[root@k8s-master ~]# kubectl -n hxd get pods
No resources found in hxd namespace.
# 建立服务,暴露端口
[root@k8s-master ~]# kubectl expose pod webserver --port 80 --target-port 80 --external-ip 192.168.83.50
# 查看服务
[root@k8s-master ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 61m
[root@k8s-master ~]# kubectl describe service webserver
Name: webserver
Namespace: default
Labels: run=webserver
Annotations: <none>
Selector: run=webserver
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.103.65.125
IPs: 10.103.65.125
External IPs: 192.168.83.50
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.2.3:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
# 删除服务
[root@k8s-master ~]# kubectl delete services webserver
-
命令式对象配置:通过命令配置和配置文件去操作kubernetes资源
kubectl create/patch -f webserver.yml
# 试运行
[root@k8s-master ~]# kubectl run webserver --image nginx --port 80 --dry-run=client -o yaml
# 建立命令
[root@k8s-master pod]# kubectl run webserver --image nginx --port 80 --dry-run=client -o yaml > webserver.yml
[root@k8s-master pod]# cat webserver.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: webserver
name: webserver
spec:
containers:
- image: nginx
name: webserver
ports:
- containerPort: 80
restartPolicy: Always
[root@k8s-master pod]# kubectl create -f webserver.yml
pod/webserver created
[root@k8s-master pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
webserver 1/1 Running 0 21s
# 追加信息
[root@k8s-master pod]# kubectl expose pod webserver --port 80 --target-port 80 --external-ip 192.168.83.50 --dry-run=client -o yaml >> webserver.yml
# 进行修改
[root@k8s-master pod]# cat webserver.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: webserver
name: webserver
spec:
containers:
- image: nginx
name: webserver
ports:
- containerPort: 80
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
labels:
run: webserver
name: webserver
spec:
externalIPs:
- 192.168.83.50
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: webserver
[root@k8s-master pod]# kubectl delete pods webserver
pod "webserver" deleted
[root@k8s-master pod]# kubectl create -f webserver.yml
pod/webserver created
service/webserver created
[root@k8s-master pod]# curl 192.168.83.50
# 该方式不能更改
[root@k8s-master pod]# kubectl create -f webserver.yml
Error from server (AlreadyExists): error when creating "webserver.yml": pods "webserver" already exists
Error from server (AlreadyExists): error when creating "webserver.yml": services "webserver" already exists
# 删除
[root@k8s-master pod]# kubectl delete -f webserver.yml
-
声明式对象配置:通过apply命令和配置文件去操作kubernetes资源
kubectl apply -f webserver.yml
# 既可以创建也可以更改
[root@k8s-master pod]# kubectl apply -f webserver.yml
2.1、命令式对象管理
kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署
kubectl命令的语法如下:
kubectl [command] [type] [name] [flags]
comand:指定要对资源执行的操作,例如create、get、delete
type:指定资源类型,比如deployment、pod、service
name:指定资源的名称,名称大小写敏感
flags:指定额外的可选参数
# 查看所有pod
kubectl get pod
# 查看某个pod
kubectl get pod pod_name
# 查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml
2.2、资源类型
kubernetes中所有的内容都抽象为资源
kubectl api-resources
常用资源类型

kubect 常见命令操作

2.3、基本命令示例
kubectl的详细说明地址:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
#显示集群版本
[root@k8s-master ~]# kubectl version
Client Version: v1.30.0
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.30.0
#显示集群信息
[root@k8s-master ~]# kubectl cluster-info
Kubernetes control plane is running at https://172.25.254.100:6443
CoreDNS is running at https://172.25.254.100:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
# 查看命名空间
[root@k8s-master ~]# kubectl get namespace
NAME STATUS AGE
default Active 47m
kube-flannel Active 45m
kube-node-lease Active 47m
kube-public Active 47m
kube-system Active 47m
# 创建命名空间(不指定会创建在默认的default中)
[root@k8s-master ~]# kubectl create namespace hxd
namespace/hxd created
[root@k8s-master ~]# kubectl get namespace
NAME STATUS AGE
default Active 50m
hxd Active 3s
kube-flannel Active 48m
kube-node-lease Active 50m
kube-public Active 50m
kube-system Active 50m
# 删除
[root@k8s-master ~]# kubectl delete namespace hxd
# 创建一个webcluster控制器,控制器中pod数量为2
[root@k8s-master ~]# kubectl create deployment webserver --image myapp:v1 --replicas 2
# 查看控制器
[root@k8s-master ~]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
web 3/3 3 3 69m
# 查看资源帮助
[root@k8s-master ~]# kubectl explain deployment
GROUP: apps
KIND: Deployment
VERSION: v1
DESCRIPTION:
Deployment enables declarative updates for Pods and ReplicaSets.
FIELDS:
apiVersion <string>
APIVersion defines the versioned schema of this representation of an object.
Servers should convert recognized schemas to the latest internal value, and
may reject unrecognized values. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
kind <string>
Kind is a string value representing the REST resource this object
represents. Servers may infer this from the endpoint the client submits
requests to. Cannot be updated. In CamelCase. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
metadata <ObjectMeta>
Standard object's metadata. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
spec <DeploymentSpec>
Specification of the desired behavior of the Deployment.
status <DeploymentStatus>
Most recently observed status of the Deployment.
# 查看控制器参数帮助
[root@k8s-master ~]# kubectl explain deployment.spec
GROUP: apps
KIND: Deployment
VERSION: v1
FIELD: spec <DeploymentSpec>
DESCRIPTION:
Specification of the desired behavior of the Deployment.
DeploymentSpec is the specification of the desired behavior of the
Deployment.
FIELDS:
minReadySeconds <integer>
Minimum number of seconds for which a newly created pod should be ready
without any of its container crashing, for it to be considered available.
Defaults to 0 (pod will be considered available as soon as it is ready)
paused <boolean>
Indicates that the deployment is paused.
progressDeadlineSeconds <integer>
The maximum time in seconds for a deployment to make progress before it is
considered to be failed. The deployment controller will continue to process
failed deployments and a condition with a ProgressDeadlineExceeded reason
will be surfaced in the deployment status. Note that progress will not be
estimated during the time a deployment is paused. Defaults to 600s.
replicas <integer>
Number of desired pods. This is a pointer to distinguish between explicit
zero and not specified. Defaults to 1.
revisionHistoryLimit <integer>
The number of old ReplicaSets to retain to allow rollback. This is a pointer
to distinguish between explicit zero and not specified. Defaults to 10.
selector <LabelSelector> -required-
Label selector for pods. Existing ReplicaSets whose pods are selected by
this will be the ones affected by this deployment. It must match the pod
template's labels.
strategy <DeploymentStrategy>
The deployment strategy to use to replace existing pods with new ones.
template <PodTemplateSpec> -required-
Template describes the pods that will be created. The only allowed
template.spec.restartPolicy value is "Always".
# 编辑控制器配置
[root@k8s-master ~]# kubectl edit deployments.apps web
@@@@省略内容@@@@@@
spec:
progressDeadlineSeconds: 600
replicas: 2
[root@k8s-master ~]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
web 2/2 2 2 73m
# 利用补丁更改控制器配置
[root@k8s-master ~]# kubectl patch deployments.apps web -p '{"spec":{"replicas":4}}'
deployment.apps/web patched
[root@k8s-master ~]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
web 4/4 4 4 74m
# 删除资源
[root@k8s-master ~]# kubectl delete deployments.apps web
deployment.apps "web" deleted
[root@k8s-master ~]# kubectl get deployments.apps
No resources found in default namespace.
2.4、运行和调试命令示例
# 运行pod
[root@k8s-master ~]# kubectl run test --image myapp:v1
pod/testtest created
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
test 1/1 Running 0 7s
# 端口暴漏
[root@k8s-master ~]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d14h
[root@k8s-master ~]# kubectl expose pod testpod --port 80 --target-port 80
service/testpod exposed
[root@k8s-master ~]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d14h
testpod ClusterIP 10.106.78.42 <none> 80/TCP 18s
[root@k8s-master ~]# curl 10.106.78.42
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
#查看资源详细信息
[root@k8s-master ~]# kubectl describe pods test
#查看资源日志
[root@k8s-master ~]# kubectl logs pods/testpod
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
2024/08/29 05:37:29 [notice] 1#1: using the "epoll" event method
2024/08/29 05:37:29 [notice] 1#1: nginx/1.27.1
2024/08/29 05:37:29 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/08/29 05:37:29 [notice] 1#1: OS: Linux 5.14.0-427.13.1.el9_4.x86_64
2024/08/29 05:37:29 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1073741816:1073741816
2024/08/29 05:37:29 [notice] 1#1: start worker processes
2024/08/29 05:37:29 [notice] 1#1: start worker process 29
10.244.0.0 - - [29/Aug/2024:05:41:11 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.76.1" "-"
10.244.0.0 - - [29/Aug/2024:05:42:51 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.76.1" "-"
# 运行交互pod
[root@k8s-master ~]# kubectl run -it test --image busybox
If you don't see a command prompt, try pressing enter.
/ #
/ # #ctrl+pq退出不停止pod
# 运行非交互pod
[root@k8s-master ~]# kubectl run test --image myapp:v1
pod/myapp:v1 created
#进入到已经运行的容器,且容器有交互环境
[root@k8s-master ~]# kubectl attach pods/test -it
If you don't see a command prompt, try pressing enter.
/ #
/ #
#在已经运行的pod中运行指定命令
[root@k8s-master ~]# kubectl exec -it pods/test /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@test:/#
2.5、高级命令示例
#利用命令生成yaml模板文件
[root@k8s-master pod]# kubectl create deployment webserver --image myapp:v1 --replicas 2 --dry-run=client -o yaml > webserver.yml
#利用yaml文件生成资源
[root@k8s-master ~]# vim webserver.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webserver
name: webserver
spec:
replicas: 2
selector:
matchLabels:
app: webserver
template:
metadata:
labels:
app: webserver
spec:
containers:
- image: myapp:v1
name: myapp
[root@k8s-master pod]# kubectl apply -f webserver.yml
deployment.apps/webserver created
[root@k8s-master pod]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
webserver 2/2 2 2 7s
[root@k8s-master pod]# kubectl get deployments.apps --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
webserver 2/2 2 2 11s app=webserver
[root@k8s-master pod]# kubectl delete -f webserver.yml
deployment.apps "webserver" deleted
# 管理资源标签
[root@k8s-master pod]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
webserver-6f77cbf6fb-cgn48 1/1 Running 0 10s app=webserver,pod-template-hash=6f77cbf6fb
# 更改标签
[root@k8s-master ~]# kubectl label pods webserver-6f77cbf6fb-sfsfp app=test
# 删除标签
[root@k8s-master ~]# kubectl label pods webserver-6f77cbf6fb-sfsfp app- --overwrite
[root@k8s-master ~]# kubectl get pods nginx --show-labels
# 标签时控制器识别pod示例的标识
[root@k8s-master ~]# kubectl get pods --show-labels
# 删除pod上的标签
[root@k8s-master ~]# kubectl label pods webserver-6f77cbf6fb-sfsf app=test --overwrite
# 控制器会重新启动新pod
[root@k8s-master ~]# kubectl get pods --show-labels
二、什么是pod
1、pod的介绍
- Pod是可以创建和管理Kubernetes计算的最小可部署单元
- 一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。
- 一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker)
- 多个容器间共享IPC、Network和UTC namespace。
2、创建自主式pod (生产不推荐)
优点:
灵活性高:
- 可以精确控制 Pod 的各种配置参数,包括容器的镜像、资源限制、环境变量、命令和参数等,满足特定的应用需求。
学习和调试方便:
- 对于学习 Kubernetes 的原理和机制非常有帮助,通过手动创建 Pod 可以深入了解 Pod 的结构和配置方式。在调试问题时,可以更直接地观察和调整 Pod 的设置。
适用于特殊场景:
- 在一些特殊情况下,如进行一次性任务、快速验证概念或在资源受限的环境中进行特定配置时,手动创建 Pod 可能是一种有效的方式。
缺点:
管理复杂:
- 如果需要管理大量的 Pod,手动创建和维护会变得非常繁琐和耗时。难以实现自动化的扩缩容、故障恢复等操作。
缺乏高级功能:
- 无法自动享受 Kubernetes 提供的高级功能,如自动部署、滚动更新、服务发现等。这可能导致应用的部署和管理效率低下。
可维护性差:
- 手动创建的 Pod 在更新应用版本或修改配置时需要手动干预,容易出现错误,并且难以保证一致性。相比之下,通过声明式配置或使用 Kubernetes 的部署工具可以更方便地进行应用的维护和更新。
#查看所有pods
[root@k8s-master ~]# kubectl get pods
No resources found in default namespace.
# 建立一个名为websever的pod
[root@k8s-master ~]# kubectl run timinglee --image myapp:v1
pod/websever created
[root@k8s-master ~]# kubectl get pods
# 显示pod的较为详细的信息
[root@k8s-master ~]# kubectl get pods -o wide
3、利用控制器管理pod(推荐)
高可用性和可靠性:
- 自动故障恢复:如果一个 Pod 失败或被删除,控制器会自动创建新的 Pod 来维持期望的副本数量。确保应用始终处于可用状态,减少因单个 Pod 故障导致的服务中断。
- 健康检查和自愈:可以配置控制器对 Pod 进行健康检查(如存活探针和就绪探针)。如果 Pod 不健康,控制器会采取适当的行动,如重启 Pod 或删除并重新创建它,以保证应用的正常运行。
可扩展性:
- 轻松扩缩容:可以通过简单的命令或配置更改来增加或减少 Pod 的数量,以满足不同的工作负载需求。例如,在高流量期间可以快速扩展以处理更多请求,在低流量期间可以缩容以节省资源。
- 水平自动扩缩容(HPA):可以基于自定义指标(如 CPU 利用率、内存使用情况或应用特定的指标)自动调整 Pod 的数量,实现动态的资源分配和成本优化。
版本管理和更新:
- 滚动更新:对于 Deployment 等控制器,可以执行滚动更新来逐步替换旧版本的 Pod 为新版本,确保应用在更新过程中始终保持可用。可以控制更新的速率和策略,以减少对用户的影响。
- 回滚:如果更新出现问题,可以轻松回滚到上一个稳定版本,保证应用的稳定性和可靠性。
声明式配置:
- 简洁的配置方式:使用 YAML 或 JSON 格式的声明式配置文件来定义应用的部署需求。这种方式使得配置易于理解、维护和版本控制,同时也方便团队协作。
- 期望状态管理:只需要定义应用的期望状态(如副本数量、容器镜像等),控制器会自动调整实际状态与期望状态保持一致。无需手动管理每个 Pod 的创建和删除,提高了管理效率。
服务发现和负载均衡:
- 自动注册和发现:Kubernetes 中的服务(Service)可以自动发现由控制器管理的 Pod,并将流量路由到它们。这使得应用的服务发现和负载均衡变得简单和可靠,无需手动配置负载均衡器。
- 流量分发:可以根据不同的策略(如轮询、随机等)将请求分发到不同的 Pod,提高应用的性能和可用性。
多环境一致性:
- 一致的部署方式:在不同的环境(如开发、测试、生产)中,可以使用相同的控制器和配置来部署应用,确保应用在不同环境中的行为一致。这有助于减少部署差异和错误,提高开发和运维效率。
示例:
# 建立控制器并自动运行pod
[root@k8s-master ~]# kubectl run test --image myapp:v1 --dry-run=client -o yaml > test.yml
[root@k8s-master pod]# cat test.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: test
name: test
spec:
containers:
- image: myapp:v1
name: test
- image: myapp:v2
name: test2
command:
- /bin/sh
- -c
- sleep 10000
[root@k8s-master pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
test 2/2 Running 0 5s
# 缠绕
# 失败
[root@k8s-master pod]# kubectl attach pods/test -c test
If you don't see a command prompt, try pressing enter.
[root@k8s-master pod]# kubectl -it exec pods/test -c test /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ #
/ # curl localhost
# 查看日志
[root@k8s-master pod]# kubectl logs pods/test -c test2
# kube-flannel控制器
[root@k8s-master pod]# kubectl -n kube-flannel get daemonsets.apps
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-flannel-ds 3 3 3 3 3 <none> 30m
[root@k8s-master pod]# kubectl -n kube-flannel get daemonsets.apps -o wide
[root@k8s-master pod]# kubectl -n kube-flannel get pods
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-fsmmc 1/1 Running 0 33m
kube-flannel-ds-lxsw4 1/1 Running 0 33m
kube-flannel-ds-sklkp 1/1 Running 0 33m
[root@k8s-master pod]# kubectl -n kube-flannel get pods -o wide
# 为webserver扩容
[root@k8s-master pod]# kubectl scale deployment webserver --replicas 2
deployment.apps/webserver scaled
# 监控
[root@k8s-master pod]# watch -n1 kubectl get pods -o wide
# 为webserver缩容
[root@k8s-master pod]# kubectl scale deployment webserver --replicas 1
deployment.apps/webserver scaled
[root@k8s-master pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
webserver-6f77cbf6fb-qnz5r 1/1 Running 0 11m
4、应用版本的更新
# 利用控制器建立pod
[root@k8s-master ~]# kubectl create deployment webserver --image myapp:v1 --replicas 2
# 暴漏端口
[root@k8s-master ~]# kubectl expose deployment webserver --port 80 --target-port 80 external-ip 192.168.83.50
[root@k8s-master ~]# kubectl describe service webserver
# 访问服务
[root@k8s-master ~]# curl 10.104.163.6
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
# 产看历史版本
[root@k8s-master ~]# kubectl rollout history deployment webserver
deployment.apps/webserver
REVISION CHANGE-CAUSE
1 <none>
# 更新控制器镜像版本
[root@k8s-master ~]# kubectl set image deployments/webserver myapp=myapp:v2
deployment.apps/webserver image updated
# 查看历史版本
[root@k8s-master pod]# kubectl rollout history deployment webserver
deployment.apps/webserver
REVISION CHANGE-CAUSE
1 <none>
2 <none>
# 访问内容测试
[root@k8s-master pod]# curl 10.104.163.6
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
# 版本回滚
[root@k8s-master ~]# kubectl rollout undo deployment webserver --to-revision 1
deployment.apps/webserver rolled back
[root@k8s-master pod]# curl 10.104.163.6
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
5、利用yaml文件部署应用
5.1、用yaml文件部署应用有以下优点
声明式配置:
- 清晰表达期望状态:以声明式的方式描述应用的部署需求,包括副本数量、容器配置、网络设置等。这使得配置易于理解和维护,并且可以方便地查看应用的预期状态。
- 可重复性和版本控制:配置文件可以被版本控制,确保在不同环境中的部署一致性。可以轻松回滚到以前的版本或在不同环境中重复使用相同的配置。
- 团队协作:便于团队成员之间共享和协作,大家可以对配置文件进行审查和修改,提高部署的可靠性和稳定性。
灵活性和可扩展性:
- 丰富的配置选项:可以通过 YAML 文件详细地配置各种 Kubernetes 资源,如 Deployment、Service、ConfigMap、Secret 等。可以根据应用的特定需求进行高度定制化。
- 组合和扩展:可以将多个资源的配置组合在一个或多个 YAML 文件中,实现复杂的应用部署架构。同时,可以轻松地添加新的资源或修改现有资源以满足不断变化的需求。
与工具集成:
- 与 CI/CD 流程集成:可以将 YAML 配置文件与持续集成和持续部署(CI/CD)工具集成,实现自动化的应用部署。例如,可以在代码提交后自动触发部署流程,使用配置文件来部署应用到不同的环境。
- 命令行工具支持:Kubernetes 的命令行工具
kubectl对 YAML 配置文件有很好的支持,可以方便地应用、更新和删除配置。同时,还可以使用其他工具来验证和分析 YAML 配置文件,确保其正确性和安全性。
5.2、资源清单参数
| 参数名称 | 类型 | 参数说明 |
|---|---|---|
| version | String | 这里是指的是K8S API的版本,目前基本上是v1,可以用kubectl api-versions命令查询 |
| kind | String | 这里指的是yaml文件定义的资源类型和角色,比如:Pod |
| metadata | Object | 元数据对象,固定值就写metadata |
| metadata.name | String | 元数据对象的名字,这里由我们编写,比如命名Pod的名字 |
| metadata.namespace | String | 元数据对象的命名空间,由我们自身定义 |
| Spec | Object | 详细定义对象,固定值就写Spec |
| spec.containers[] | list | 这里是Spec对象的容器列表定义,是个列表 |
| spec.containers[].name | String | 这里定义容器的名字 |
| spec.containers[].image | string | 这里定义要用到的镜像名称 |
| spec.containers[].imagePullPolicy | String | 定义镜像拉取策略,有三个值可选: (1) Always: 每次都尝试重新拉取镜像 (2) IfNotPresent:如果本地有镜像就使用本地镜像 (3) )Never:表示仅使用本地镜像 |
| spec.containers[].command[] | list | 指定容器运行时启动的命令,若未指定则运行容器打包时指定的命令 |
| spec.containers[].args[] | list | 指定容器运行参数,可以指定多个 |
| spec.containers[].workingDir | String | 指定容器工作目录 |
| spec.containers[].volumeMounts[] | list | 指定容器内部的存储卷配置 |
| spec.containers[].volumeMounts[].name | String | 指定可以被容器挂载的存储卷的名称 |
| spec.containers[].volumeMounts[].mountPath | String | 指定可以被容器挂载的存储卷的路径 |
| spec.containers[].volumeMounts[].readOnly | String | 设置存储卷路径的读写模式,ture或false,默认为读写模式 |
| spec.containers[].ports[] | list | 指定容器需要用到的端口列表 |
| spec.containers[].ports[].name | String | 指定端口名称 |
| spec.containers[].ports[].containerPort | String | 指定容器需要监听的端口号 |
| spec.containers[] ports[].hostPort | String | 指定容器所在主机需要监听的端口号,默认跟上面containerPort相同,注意设置了hostPort同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突) |
| spec.containers[].ports[].protocol | String | 指定端口协议,支持TCP和UDP,默认值为 TCP |
| spec.containers[].env[] | list | 指定容器运行前需设置的环境变量列表 |
| spec.containers[].env[].name | String | 指定环境变量名称 |
| spec.containers[].env[].value | String | 指定环境变量值 |
| spec.containers[].resources | Object | 指定资源限制和资源请求的值(这里开始就是设置容器的资源上限) |
| spec.containers[].resources.limits | Object | 指定设置容器运行时资源的运行上限 |
| spec.containers[].resources.limits.cpu | String | 指定CPU的限制,单位为核心数,1=1000m |
| spec.containers[].resources.limits.memory | String | 指定MEM内存的限制,单位为MIB、GiB |
| spec.containers[].resources.requests | Object | 指定容器启动和调度时的限制设置 |
| spec.containers[].resources.requests.cpu | String | CPU请求,单位为core数,容器启动时初始化可用数量 |
| spec.containers[].resources.requests.memory | String | 内存请求,单位为MIB、GIB,容器启动的初始化可用数量 |
| spec.restartPolicy | string | 定义Pod的重启策略,默认值为Always. (1)Always: Pod-旦终止运行,无论容器是如何 终止的,kubelet服务都将重启它 (2)OnFailure: 只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束(退出码为0),则kubelet将不会重启它 (3) Never: Pod终止后,kubelet将退出码报告给Master,不会重启该 |
| spec.nodeSelector | Object | 定义Node的Label过滤标签,以key:value格式指定 |
| spec.imagePullSecrets | Object | 定义pull镜像时使用secret名称,以name:secretkey格式指定 |
| spec.hostNetwork | Boolean | 定义是否使用主机网络模式,默认值为false。设置true表示使用宿主机网络,不使用docker网桥,同时设置了true将无法在同一台宿主机 上启动第二个副本 |
5.3、如何获得资源帮助
kubectl explain pod.spec.containers
5.4、编写示例
示例1:运行简单的单个容器pod
用命令获取yaml模板
[root@k8s-master pod]# kubectl run webserver --image myapp:v1 --dry-run=client -o yaml > pod.yml
[root@k8s-master pod]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: webserver # pod标签
name: webserver # pod名称
spec:
containers:
- image: myapp:v1 # pod镜像
name: webserver # 容器名称
示例2:运行多个容器pod
[!WARNING]
注意如果多个容器运行在一个pod中,资源共享的同时在使用相同资源时也会干扰,比如端口
# 一个端口干扰示例:
[root@k8s-master pod]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: webserver
name: webserver
spec:
containers:
- image: myapp:v1
name: webserver
- image: busyboxplus
name: busybox
[root@k8s-master pod]# kubectl apply -f pod.yml
[root@k8s-master pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
webserver 1/2 CrashLoopBackOff 6 (3m15s ago) 9m8s
# 查看日志
[root@k8s-master pod]# kubectl logs webserver webserver2
[!NOTE]
在一个pod中开启多个容器时一定要确保容器彼此不能互相干扰
[root@k8s-master pod]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: webserver
name: webserver
spec:
containers:
- image: myapp:v1
name: webserver
- image: busyboxplus
name: busybox
command:
- /bin/sh
- -c
- sleep 10000
[root@k8s-master pod]# kubectl apply -f pod.yml
[root@k8s-master pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
webserver 2/2 Running 0 19s
示例3:理解pod间的网络整合
同在一个pod中的容器公用一个网络
[root@k8s-master ~]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: hxd
name: test
spec:
containers:
- image: myapp:v1
name: webserver
- image: busyboxplus
name: busybox
command:
- /bin/sh
- -c
- sleep 10000
[root@k8s-master pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
test 2/2 Running 0 3m19s
[root@k8s-master pod]# kubectl exec test -c busybox -- curl -s localhost
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
示例4:端口映射
[root@k8s-master pod]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: hxd
name: test
spec:
containers:
- image: myapp:v1
name: webserver
ports:
- name: http
containerPort: 80
hostPort: 80
protocol: TCP
# 测试
[root@k8s-master pod]# kubectl apply -f pod.yml
pod/test created
[root@k8s-master pod]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test 1/1 Running 0 60s 10.244.2.14 k8s-node2 <none> <none>
[root@k8s-master pod]# curl k8s-node2 hxd.org
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
示例5:如何设定环境变量
[root@k8s-master pod]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: hxd
name: test
spec:
containers:
- image: busybox
name: busybox
command: ["/bin/sh","-c","echo $NAME;sleep 3000000"]
env:
- name: NAME
value: dyy
[root@k8s-master pod]# kubectl apply -f pod.yml
pod/test created
[root@k8s-master pod]# kubectl logs pods/test busybox
dyy
更多推荐

所有评论(0)