目录
- 概述
- 创建Pod
- 编写一个简单的Pod
- 添加常用参数
- 为Pod的容器分配资源
- 网络相关
- Pod健康检查
- 启动探针
- 存活探针
- 就绪探针
- 作用整个Pod参数配置
- 创建docker-registry
- 卷挂载
- 结束
概述
k8s中的pod参数详解。官方文档
版本 k8s 1.27.x 、busybox:stable-musl、nginx:stable-alpine3.19-perl
创建Pod
编写一个简单的Pod
apiVersion: v1
kind: Pod
# 元数据
metadata:
# pod 名称 唯一
name: busybox
# 命名空间
namespace: test
# 标签
labels:
app: busybox
spec:
containers:
- name: busybox
image: harbor.easzlab.io.local:8443/library/busybox:stable-musl
imagePullPolicy: IfNotPresent
command:
- sleep
- "3600"
restartPolicy: Always
[root@hadoop01 pod]# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 0 25s
tomcat-demo-7ddd4cf4f5-bpskf 1/1 Running 0 7d20h
[root@hadoop01 pod]# kubectl exec -it -n test busybox -- sh
/ #
/ # ls
bin dev etc home proc root sys tmp usr var
/ #
添加常用参数
apiVersion: v1
kind: Pod
# 元数据
metadata:
# pod 名称 唯一
name: busybox
# 命名空间
namespace: test
# 标签
labels:
app: busybox
spec:
containers:
- name: busybox
image: harbor.easzlab.io.local:8443/library/busybox:stable-musl
# 可选值: Always|IfNotPresent|Never
imagePullPolicy: IfNotPresent
# 环境变量
env:
- name: app
value: busybox
# 运行终端 守护进程,不会运行完就结束
tty: true
# 特权模式 对宿主机有 root 权限
securityContext:
privileged: true
# 工作目录
workingDir: /test
# 命令
command: ["/bin/sh"]
# 参数
args: ["-c", "while true; do echo hello;sleep 10;done"]
restartPolicy: Always
[root@hadoop01 pod]# kubectl apply -f arg-busbox-pod.yaml
pod/busybox created
[root@hadoop01 pod]# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 0 7s
tomcat-demo-7ddd4cf4f5-bpskf 1/1 Running 0 7d22h
[root@hadoop01 pod]# kubectl logs -f busybox -n test
hello
hello
hello
hello
hello
hello
hello
为Pod的容器分配资源
apiVersion: v1
kind: Pod
# 元数据
metadata:
# pod 名称 唯一
name: busybox
# 命名空间
namespace: test
# 标签
labels:
app: busybox
spec:
restartPolicy: Always
containers:
- name: busybox
image: harbor.easzlab.io.local:8443/library/busybox:stable-musl
imagePullPolicy: IfNotPresent
command:
- sleep
- "3600"
resources:
# 注意MiB 和 Mb 有区别,1MiB=1024k,而1Mb=100k k8s 使用 Mi 大的
# cpu的单位 ,1c=1000m
# 最小需要
requests:
memory: "100Mi"
cpu: "1000m"
# 最大限制
limits:
memory: "200Mi"
cpu: "1000m"
注意:因为安装的不是 docker ,所以 crictl stats 并不详细
如 docker stats 能看出资源限制后的变化。
网络相关
网络默认配置使用的是 k8s 集群的配置。
自定义网络配置如下:
apiVersion: v1
kind: Pod
# 元数据
metadata:
# pod 名称 唯一
name: nginx
# 命名空间
namespace: test
# 标签
labels:
app: nginx
spec:
# 使用宿主机的网络,与宿主机共享局域网
hostNetwork: false
# 可选值:Default | ClusterFirst | ClusterFirstWithHostNet | None
dnsPolicy: "None"
dnsConfig:
nameservers:
- 8.8.8.8
# 域名映射
hostAliases:
- ip: 192.168.1.18
hostnames:
- "foo.local"
- "bar.local"
containers:
- name: nginx
image: harbor.easzlab.io.local:8443/library/nginx:stable-alpine3.19-perl
imagePullPolicy: IfNotPresent
ports:
- name: default
containerPort: 80
# 如果使用hostnetwork 那这里就不能指定端口,配置了也不会生效
hostPort: 8080
Pod健康检查
有一种情况,容器还是正常运行的,但是服务无法使用;这种场景,一般称之为容器死锁,为了能够迟早的发现这种问题,可以通过对容器做健康检查来迟早发现问题。
-
启动探针:启动成功之后才是就绪与存活探针,启动失败,会根据策略重启
-
就绪探针:如初始化 mysql 等,不会重启,会让服务不可用
-
存活探针:通过 http tcp grpc 等方式验证容器是否可用
-
探针示例,后续补充
启动探针
spec:
containers:
- name: your-container
startupProbe:
httpGet:
path: /healthz
port: 8080
failureThreshold: 30
initialDelaySeconds: 120
periodSeconds: 10
timeoutSeconds: 1
successThreshold: 1
存活探针
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: myapp:latest
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 5
periodSeconds: 10
Liveness探针每10秒检查一次http://myapp-pod:8080/healthz,initialDelaySeconds用于指定探针初次执行前的延迟时间。
就绪探针
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: myapp:latest
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /readyz
port: 80
initialDelaySeconds: 5
periodSeconds: 10
Readiness探针每5秒检查一次http://myapp-pod:8080/readyz,initialDelaySeconds用于指定探针初次执行前的延迟时间。
作用整个Pod参数配置
创建docker-registry
kubectl create secret docker-registry regcred \
--docker-server=<你的镜像仓库服务器> \
--docker-username=<你的用户名> \
--docker-password=<你的密码> \
--docker-email=<你的邮箱地址> \
-n test