Pod 是 Kubernetes 中能够创建和管理的最小单位。Kubernetes 直接管理的是 Pod,而不是容器。
Pause 容器(基础容器、父容器、根容器)
应用容器(业务容器、用户容器、Main Container)
Init 容器(初始化容器)
共享资源:
localhost
互相通信,共享同一个 IP 和端口范围。Pod 的 3 种类型:
自主式 Pod:
kubectl run ...
控制器管理的 Pod:
kubectl create deployment ...
静态 Pod:
/etc/kubernetes/manifests/
目录中。通过 imagePullPolicy
字段定义:
IfNotPresent:
latest
的镜像。Always:
latest
或无标签的镜像。Never:
通过 restartPolicy
字段定义:
Always:
OnFailure:
Never:
注:deployment、statefulset、daemonset 控制器的Pod容器重启策略只能设置为 Always
# pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c
- sleep 30; exit 3 # 命令让容器睡眠30秒后退出,退出状态码为3
# 默认情况下,如果不指定restartPolicy,Pod的重启策略为Always(仅适用于单独的Pod定义,不适用于由控制器管理的Pod)
# 但在这里我们稍后会显式设置restartPolicy为Never来演示其效果
# 应用YAML文件创建Pod
# kubectl apply -f pod3.yaml
# 查看Pod状态,初始时Pod应该是Running状态
# 等容器启动后30秒执行exit退出进程,Pod会进入Error状态(如果restartPolicy为Always,则Pod会重启;如果为Never,则不会重启)
# kubectl get pods
# NAME READY STATUS RESTARTS AGE
# foo 1/1 Running 1 (时间) # 这里的RESTARTS可能会根据restartPolicy的值而变化
# 删除Pod
# kubectl delete -f pod3.yaml
# 修改YAML文件,设置restartPolicy为Never
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c
- sleep 30; exit 3 # 命令保持不变
restartPolicy: Never # 显式设置Pod的重启策略为Never
# 再次应用YAML文件创建Pod
# kubectl apply -f pod3.yaml
# 使用-w选项实时观察Pod的状态变化
# 当容器睡眠30秒后退出,由于restartPolicy设置为Never,Pod将保持在Error状态而不会重启
# kubectl get pods -w
# NAME READY STATUS RESTARTS AGE
# foo 1/1 Running 0 (时间) # 初始状态
# foo 0/1 Error 0 (稍后的时间) # 容器退出后,Pod进入Error状态且RESTARTS保持为0(因为restartPolicy为Never)
静态 Pod 是由 kubelet 直接管理的一类特殊 Pod,它们不通过常规的 API Server 进行控制。
静态 Pod 的配置文件存放在特定的目录(一般为:/etc/kubernetes/manifests/
),kubelet 会周期性地扫描该目录,根据其中的配置文件自动创建、更新或删除 Pod。
首先,确认 kubelet 当前配置的静态 Pod 路径:
cat /var/lib/kubelet/config.yaml | grep staticPodPath
示例:
staticPodPath: /etc/kubernetes/manifests
通常,kubelet 的启动配置文件位于 /usr/lib/systemd/system/kubelet.service.d/
目录下,常见文件为 10-kubeadm.conf
。
systemctl status kubelet
示例输出片段:
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
Drop-In: /usr/lib/systemd/system/kubelet.service.d
└─10-kubeadm.conf
使用 vim
或其他文本编辑器打开 10-kubeadm.conf
文件,添加或修改 --pod-manifest-path
参数:
vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
示例配置:
[Service]
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allowprivileged=true"
注意: 如果该行已存在,确保 --pod-manifest-path
指向正确的目录(通常是 /etc/kubernetes/manifests
)。
systemctl daemon-reload
systemctl restart kubelet
在静态 Pod 的管理目录下准备 Pod 的 YAML 文件。例如,创建一个简单的 Nginx Web 服务器 Pod:
vim /etc/kubernetes/manifests/static-web.yaml
示例内容:
apiVersion: v1
kind: Pod
metadata:
name: static-web
labels:
app: static
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
kubelet 会自动检测到 /etc/kubernetes/manifests/
目录下的新配置文件,并根据该文件创建相应的 Pod。
查看 Pod 状态:
kubectl get pods -A | grep static-web
示例输出:
kube-system static-web 1/1 Running 0 1m
kubectl delete
删除静态 Pod静态 Pod 由 kubelet 直接管理,而不是通过 API Server。因此,使用 kubectl delete pod
命令无法删除静态 Pod。尝试删除时,可能会发生:
kubectl delete pod static-web -n kube-system
示例:
error: pods "static-web" not found
删除静态 Pod,直接删除其配置文件即可
rm /etc/kubernetes/manifests/static-web.yaml
随后,kubelet 会检测到配置文件的删除,并自动停止并删除相应的 Pod。
kubectl get pods -A | grep static-web
注意
/etc/kubernetes/manifests/
目录及其文件具有适当的读写权限。--pod-manifest-path
的节点上运行。因此,确保关键服务的静态 Pod 配置在多个节点上,以实现高可用性。官方示例:
kubectl apply -f - <apiVersion: v1
kind: Pod
metadata:
name: private-image-test-1
spec:
containers:
- name: uses-private-image
image: $PRIVATE_IMAGE_NAME
imagePullPolicy: Always
command: [ "echo", "SUCCESS" ]
EOF
image
: 指定私有镜像名称imagePullPolicy
: 设置为 Always
,表示每次启动容器时都尝试拉取最新镜像command
: 容器启动时执行的命令,此处为 echo SUCCESS
步骤:
kubectl edit deployment/nginx-deployment
imagePullPolicy
: 设为 IfNotPresent
,表示仅在本地不存在镜像时才拉取。restartPolicy
: 设为 Always
,确保容器异常退出后自动重启。步骤:
创建 Pod 配置文件 pod1.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: pod-test1
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: Always
command: [ "echo", "SUCCESS" ]
应用配置并查看 Pod 状态:
kubectl create -f pod1.yaml
kubectl get pods -o wide
CrashLoopBackOff
状态:容器执行完 echo SUCCESS
后退出,导致容器生命周期结束。查看 Pod 事件详情:
kubectl describe pod pod-test1
修改 Pod 配置以保持容器运行:
pod1.yaml
,移除 command
并指定具体的镜像版本:apiVersion: v1
kind: Pod
metadata:
name: pod-test1
spec:
containers:
- name: nginx
image: nginx:1.14
imagePullPolicy: Always
kubectl delete -f pod1.yaml
kubectl apply -f pod1.yaml
kubectl get pods -o wide
Running
,表示容器正常。测试容器服务:
curl
访问容器服务:curl -I http://172.17.36.4
HTTP/1.1 200 OK
Server: nginx/1.14.2
...
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce
systemctl start docker.service
systemctl enable docker.service
docker version
cd /opt
chmod +x docker-compose
mv docker-compose /usr/local/bin/
tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/
vim /usr/local/harbor/harbor.cfg
# 修改 hostname 为 Harbor 服务器的 IP 地址或域名
cd /usr/local/harbor/
./install.sh
http://
(例如 http://192.168.80.30
),使用默认的管理员用户名和密码(admin/Harbor12345)登录。kgc-project
。cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://"],
"insecure-registries":["192.168.80.30"]
}
EOF
systemctl daemon-reload
systemctl restart docker
docker login -u admin -p Harbor12345 http://192.168.80.30
docker pull tomcat:8.0.52
docker tag tomcat:8.0.52 192.168.80.30/kgc-project/tomcat:v1
docker push 192.168.80.30/kgc-project/tomcat:v1
docker rmi tomcat:8.0.52
docker rmi 192.168.80.30/kgc-project/tomcat:v1
vim harbor-pull-secret.yaml
# 复制粘贴之前查看的登录凭据(base64 编码)
kubectl create -f harbor-pull-secret.yaml
cd /opt/demo
vim tomcat-deployment.yaml
# 定义 Deployment 和 Service,指定 imagePullSecrets
kubectl create -f tomcat-deployment.yaml
kubectl get pods
查看 Pod 状态。kubectl describe pod
查看 Pod 描述信息,确认镜像是从 Harbor 下载的。