什么是Pod
Pod是一个或多个容器的组合。这些容器共享存储、网络和命名空间,以及运行规范。在Pod 中,所有容器都被统一安排和调度,并运行在共享的上下文中。对于具体应用而言,Pod是它们 的逻辑主机,Pod包含业务相关的多个应用容器。所以,Pod是一组具有共享命名空间、IP地址 和端口的容器的集合。
Pod 的特点:每个 Pod 还包含一个 Pause 容器,Pause 容器是 Pod 的父容器,主要负责僵尸进程的回收管理。通过 Pause 容器可以使同一个 Pod 里面的不同容器共享存储、网络、PID、IPC 等,可以使用 volume 实现数据共享。
Pod 的状态:Pod 的状态有 Running、Pending、Succeeded、Failed、Unknown、ImagePullBackOff、ErrImagePull、CrashLoopBackoff、OOMKilled、Terminating、SysctlForbidden、Completed、ContainerCreating 等。
Pod 探针:Pod 提供的探针可以很方便地用来检测容器的应用是否正常,目前探针有 3 种检测方式,分别是 ExecAction、TCPSocketAction、HTTPGetAction。Pod 探针有三类,分别是 livenessProbe(存活探针)、readinessProbe(就绪探针)、startupProbe(启动探针)。7
Pod 镜像拉取策略和重启策略:镜像拉取策略有 Always、Never、IfNotPresent 三种。重启策略有 Always、OnFailure、Never 三种。
创建一个简单的 Pod:编写 Pod 配置文件,通过 kubectl create 命令创建此 Pod,查看已经创建的 Pod 和 Pod 详细创建信息,最后删除 pod。
Pod 的基本用法:编写 pod 文件,将两个容器放在同一个 pod 中,部署 pod 文件,查看 pod 的详细信息,暴露端口,查看端口映射,测试访问,最后删除 pod。
kubect1 get pod nginx -o wide
Pod的状态
kubectl命令创建pod
kubectl run nginx--image=nginx:1.7.9--1abels="app=nginx"
查看pod
kubectl get pods -n default
显示Pod的更多信息
kubect1 get pod nginx -o wide
查看pod日志
cur1 10.244.58.195
kubect1 logs nginx
以yaml格式显示Pod详细信息
kubect1 describe pod nginx
在Pod的容器中执行命令
kubect1 exec nginx-cnginx--date
备注:
kubectl exec -it nginx--bash
如果登录的时候不指定容器,就登录到Pod中的第一个容器中。
在线编辑运行中的资源对象
kubect1 edit pod nginx
将pod的端口映射到宿主机
kubectl port-forward--address 0.0.0.0pod/nginx 8080:80
注意:
此命令会在前台运行,此时就可以在其他客户端用该k8s主机的IP地址和8080的端口号进行访 问了,Ctr1+c停止,但停止后就没有这个映射了。
在宿主机和Pod的容器之间拷贝文件
kubect1 cp nginx:etc/fstab /opt/aaa.txt
kubectl cp /opt/aaa.txt nginx:etc/bbb.txt
Pod的状态
kubectl get pods -n default
删除Pod
kubect1 delete pod nginx
Pod探针
在生产环境中,进程正常启动并不代表应用能正常处理请求,所以合理的设计应用的健康检 查尤其重要。在使用裸机或裸容器部署时,一般很难对应用做很完善的健康检查,而Pod提供的在生产环境中,进程正常启动并不代表应用能正常处理请求,所以合理的设计应用的健康检 查尤其重要。
实现方式
ExecAction 在容器内执行一个指定的命令,如果命令返回值为0,则认为容器健康
TCPSocketAction 通过TCP连接检查容器指定的端口,如果端口开放,则认为容器健康
HTTPGetAction 对指定的URL进行Get请求,如果状态码在200-400之间,则认为容 器健康
Pod镜像拉取策略和重启策略
指定拉取策略:
kubect1 run nginx--image=nginx:1.7.9--1abels="app=nginx"--iage-pu11-policy=Never
指定重启策略:
kubect1 delete pod nginx
kubect1 run nginx--image=nginx:1.7.9--1abe1s="app=nginx--estrtOnFailure
创建一个简单的Pod
编写一个简单的Pod
vim nginx-pod.yam1
apiVersion: v1
kind:Pod
metadata:
name:nginx
1abels:
name:nginx
spec:
containers :
-name:nginx
image:nginx:1.7.9
ports:
containerPort:80
编写Pod配置文件frontend-localredis-pod.yaml
cat <<EOF>frontend-1ocalredis-pod.yam1
apiVersion: v1
kind:Pod
metadata:
name:redis-php
labels:
name:redis-php
spec:
containers:
-name:frontend
image: kubeguide/guestbook-php-frontend:1ocalredis
imagePul1Policy:IfNotPresent
1ivenessProbe:
tcpSocket:
port:80
initialDelaySeconds: 1
periodSeconds:3
timeoutSeconds:1
ports:
- containerPort:80
- name:redis
image: kubeguide/redis-master
imagePul1Policy: IfNotPresent
ports:
containerPort:6379
restartPolicy:OnFailure
EOF
Pod的基本用法
编写pod文件,将两个容器放在同一个pod中
cat<<EOF>nginx-php.yam1
apiVersion:v1
kind:Pod
metadata:
name:nginx-php
1abels:
name:nginx-php
spec:
containers:
-name:nginx-app
image:nginx:1.7.9
ports:
containerPort:80
name:php-app
image:bitnami/php-fpm
imagePullPolicy: Never
ports:
containerPort:9000
EOF
部署nginx的pod文件
kubect1 apply -f nginx-php.yam1
kubectl get pods
此时可以看到pod中有两个容器处于running状态中
查看pod的详细信息
kubect1 describe pod nginx-php
暴露端口
kubect1 expose pod nginx-php--port=88--target-port=80--type=NodePort--name=nginx-php
查看端口映射
kubectl get pod,svc nginx-php -o wide
测试访问
用外部主机,访问master的ip地址:映射的端口
删除pod
kubect1 delete -f nginx-php.yam1
静态pod
静态Pod是由kubelet进行管理的仅存在于各个Node上的Pod。他们不能通过API Server 进行管理,无法于ReplicationController、Deployment或者DaemonSet进行关联,并且 kubelet无法对他们进行健康检查。静态Pod总是由kubelet创建的,并且总在kubelet所在 的Node上运行。
编写yamal文件
cat<<EOF>/etc/kubernetes/manifests/nginx-pod.yam1
apiVersion:v1
kind:Pod
metadata:
name:static-web
1abels:
name:static-web
spec:
containers:
- name:static-web
image:nginx:1.7.9
ports:
-name:nginx
containerPort:80
EOF
不需执行部署命令,过一会,查看pod
kubectl get pod
删除静态pod的方法
rm -rf /etc/kubernetes/manifests/nginx-pod.yam1
不能用如下语句删除
kubectl delete pod static-web-k8s-master01
这样删除,会让pod处于pending状态,但无法删除