k8s中Pod基本使用
Pod常用命令,以及钩子函数
·
1、Pod常用命令
#查看node
kubectl get nodes
#查看pod
kubectl get pods --all-namespaces
#查看指定namespace下的pod
kubectl get pods -n namespace
#执行yaml文件
kubectl apply -f xxx.yaml
#查看service
kubectl get svc --all-namespaces
#查看描述信息
kubectl describe pod kube-flannel-ds-jffqd -n kube-system
#查看pod所在节点
kubectl get pods -o wide --all-namespaces
#查看apiVersion对应版本
kubectl explain pod
#进入pod
kubectl exec -it "podName" /bin/bash
#强制删除Pod,例如僵尸pod
kubectl delete pod "podName" --grace-period=0 --force
#使用yaml文件删除pod
kubectl delete -f "xxx.yaml"
2、静态pod
创建静态pod的方式
1、通过配置文件放在特定目录下的标准的 JSON 或 YAML 格式的 pod 定义文件,kubelet 定期的去扫描这个目录,需要在kubelet的启动配置文件中加入如下环境变量
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"
cat /etc/kubernetes/manifests/static.yaml
apiVersion: v1
kind: Pod
metadata:
name: static-pod
labels:
app: static-web
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
3、钩子函数
两种钩子函数
- POSTStart:在容器创建后立即执行,但是并不能保证钩子在容器ENTRYPOINT之前允许,因为没有参数传递给处理程序,主要用于资源部署,环境准备等,如果钩子耗时太长时间,容器将不能达到running状态
apiVersion: v1
kind: Pod
metadata:
name: hook-demo1
labels:
app: hook
spec:
containers:
- name: hook-demo1
image: nginx
ports:
- name: webport
containerPort: 80
lifecycle:
postStart:
exec:
command: ["/bin/sh","-c","echo Hello hook > /usr/share/message"]
- PreStop:在容器终止之前立即被调用,他是阻塞的,意味着他是同步的,所以他必须在删除容器的调用发出之前完成,如果在钩子执行期间挂起,Pod阶段将停留在running状态并且永不会达到failed状态
apiVersion: v1
kind: Pod
metadata:
name: hook-demo2
labels:
app: hook
spec:
containers:
- name: hook-demo2
image: nginx
ports:
- name: webport
containerPort: 80
volumeMounts:
- name: message
mountPath: /usr/share
lifecycle:
preStop:
exec:
command: ['/bin/sh', '-c', 'echo Hello from the preStop Handler > /usr/share/message']
volumes:
- name: message
hostPath:
path: /data
实现钩子函数的两种方式
- Exec - 用于执行一段特定的命令,该命令消耗的资源会被计入容器
- HTTP - 对容器上特定的端点执行HTTP请求
4、健康检查
1、Pod的生命周期
- kubelet 通过使用 liveness probe 来确定你的应用程序是否正在运行,如果你的程序一旦崩溃了, Kubernetes 就会立刻知道这个程序已经终止了,然后就会重启这个程序。
- kubelet 使用 readiness probe 来确定容器是否已经就绪可以接收流量过来了。只有当 Pod 中的容器都处于就绪状态的时候 kubelet 才会认定该 Pod 处于就绪状态,因为一个 Pod 下面可能会有多个容器。当然 Pod 如果处于非就绪状态,那么我们就会将他从我们的工作队列,这样我们的流量就不会被路由到这个 Pod 里面来了。
2、探针的配置方式
- exec 执行一段命令
###存活探针
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec
labels:
app: liveness
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 5; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 #5秒后开始探测
periodSeconds: 5 #每隔5秒探测一次
- http 检测某个http请求
- tcpsocket kubelet 将尝试在指定端口上打开容器的套接字。如果可以建立连接,容器被认为是健康的,如果不能就认为是失败的。实际上就是检查端口
5、初始化容器
Init Container就是用来做初始化工作的容器,可以是一个或者多个,如果有多个的话,这些容器会按定义的顺序依次执行,只有所有的Init Container执行完后,主容器才会被启动。一个Pod里面的所有容器是共享数据卷和网络命名空间的,所以Init Container里面产生的数据可以被主容器使用到的。
Init Container的使用场景
- 等待其他模块Ready:这个可以用来解决服务之间的依赖问题,比如我们有一个 Web 服务,该服务又依赖于另外一个数据库服务,但是在我们启动这个 Web 服务的时候我们并不能保证依赖的这个数据库服务就已经启动起来了,所以可能会出现一段时间内 Web 服务连接数据库异常
- 做初始化配置:比如集群里检测所有已经存在的成员节点,为主容器准备好集群的配置信息,这样主容器起来后就能用这个配置信息加入集群
- 其它场景:如将 pod 注册到一个中央数据库、配置中心等。
试例
apiVersion: v1
kind: Pod
metadata:
name: init-demo
spec:
initContainers:
- name: install
image: busybox
command:
- wget
- "-O"
- "/work-dir/index.html"
- http://www.baidu.com
volumeMounts:
- name: workdir
mountPath: "/work-dir"
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
volumes:
- name: workdir
emptyDir: {}
更多推荐
已为社区贡献2条内容
所有评论(0)