pod进阶
- limits.cup:cpu上限
- limits.memory:内存上限
- requests.cpu:创建时分配的基本CPU资源
- requests.memory:创建时分配的基本内存资源
例如:
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: db
image: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: wp
image: wordpress
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
[root@localhost demo]# kubectl apply -f pod2.yaml
pod/frontend created
#查看具体事件
[root@localhost demo]# kubectl describe pod frontend
[root@localhost demo]# kubectl describe nodes 192.168.241.4
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits
--------- ---- ------------ ---------- --------------- -------------
default frontend 500m (50%) 1 (100%) 128Mi (3%) 256Mi (6%)
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 550m (55%) 1100m (110%)
memory 228Mi (5%) 556Mi (14%)
#成功部署好后查看状态
[root@localhost demo]# kubectl get pods
NAME READY STATUS RESTARTS AGE
frontend 2/2 Running 1 3m21s
#查看node节点资源状态
[root@localhost demo]# kubectl describe nodes 192.168.241.4
# 查看命名空间
[root@localhost demo]# kubectl get ns
NAME STATUS AGE
default Active 17d
kube-public Active 17d
kube-system Active 17d
pod重启策略
Pod在遇到故障之后重启的动作
- Always:当容器终止退出后,总是重启容器,默认策略
- OnFailure:当容器异常退出(退出状态码非0)时,重启容器
- Never:当容器终止退出,从不重启容器。
注意:k8s中不支持重启Pod资源,只有删除重建
[root@localhost demo]# kubectl edit deploy
restartPolicy: Always #默认策略
例如
[root@localhost demo]# vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c
- sleep 30; exit 3
[root@localhost demo]# kubectl apply -f pod3.yaml
pod/foo created
#查看重启次数加1
[root@localhost demo]# kubectl get pods
NAME READY STATUS RESTARTS AGE
foo 1/1 Running 1 50s
[root@localhost demo]# vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c
- sleep 10;exit 3
restartPolicy: Never #设置从不重启,跟container同一个级别
[root@localhost demo]# kubectl get pods
NAME READY STATUS RESTARTS AGE
foo 0/1 Completed 0 29s
健康检查——探针
探针的三种检查方法
- httpGet 发送http请求,返回200-400范围状态码为成功。
- exec 执行Shell命令返回状态码是0为成功。
- tcpSocket 发起TCP Socket建立成功
探针的两种规则 - livenessProbe 如果检查失败,将杀死容器,根据Pod的restartPolicy来操作。
- ReadinessProbe 如果检查失败,kubernetes会把Pod从service endpoints中剔除。
例如:exec方式
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy;sleep 30
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
[root@localhost demo]# kubectl get pods
liveness-exec 1/1 Running 4 4m11s
例如:httpGet方式
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: k8s.gcr.io/liveness
args:
- /server
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
例如:tcpSocket方式
apiVersion: v1
kind: Pod
metadata:
name: goproxy
labels:
app: goproxy
spec:
containers:
- name: goproxy
image: k8s.gcr.io/goproxy:0.1
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
调度约束
Kubernetes通过watch的机制进行每个组件的协作,每个组件之间的设计实现了解耦。
调度方式
- nodeName用于将Pod调度到指定的Node名称上(跳过调度器直接分配)
- nodeSelector用于将Pod调度到匹配Label的Node上
例如:nodeName
apiVersion: v1
kind: Pod
metadata:
name: pod-example
labels:
app: nginx
spec:
nodeName: 192.168.241.4
containers:
- name: nginx
image: nginx:1.15
[root@localhost demo]# kubectl create -f pod5.yaml
pod/pod-example created
[root@localhost demo]# kubectl get pods
pod-example 1/1 Running 0 86s
//查看网络
[root@localhost demo]# kubectl get pods -o wide
pod-example 1/1 Running 0 2m9s 172.17.47.7 192.168.241.4 <none>
查看详细事件(发现未经过调度器)
[root@localhost demo]# kubectl describe pod pod-example
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Pulled 97s kubelet, 192.168.241.4 Container image "nginx:1.15" already present on machine
Normal Created 97s kubelet, 192.168.241.4 Created container
Normal Started 97s kubelet, 192.168.241.4 Started container
清空所有pod
[root@localhost demo]# kubectl delete -f .
[root@localhost demo]# kubectl get pods
No resources found.
例如:nodeSelector
//获取标签帮助
[root@localhost demo]# kubectl label --help
Usage:
kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N
[--resource-version=version] [options]
需要获取node上的NAME名称
[root@localhost demo]# kubectl get node
NAME STATUS ROLES AGE VERSION
192.168.241.3 Ready <none> 14d v1.12.3
192.168.241.4 Ready <none> 14d v1.12.3
给对应的node设置标签分别为hzh=a和hzh=b
[root@localhost demo]# kubectl label nodes 192.168.241.4 hzh=a
node/192.168.241.4 labeled
[root@localhost demo]# kubectl label nodes 192.168.241.3 hzh=b
node/192.168.241.3 labeled
查看标签
[root@localhost demo]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
192.168.241.4 Ready <none> 14d v1.12.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,hzh=a,kubernetes.io/hostname=192.168.241.4
192.168.241.3 Ready <none> 14d v1.12.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,hzh=b,kubernetes.io/hostname=192.168.241.4
[root@localhost demo]# vim pod5.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
labels:
app: nginx
spec:
nodeSelector:
kgc: b
containers:
- name: nginx
image: nginx:1.15
[root@localhost demo]# kubectl apply -f pod5.yaml
pod/pod-example created
#查看详细事件(通过事件可以观察经过调度器分配)
[root@localhost demo]# kubectl describe pod pod-example
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 67s default-scheduler Successfully assigned default/pod-example to 192.168.241.4
Normal Pulling 66s kubelet, 192.168.241.4 pulling image "nginx:1.15"
Normal Pulled 24s kubelet, 192.168.241.4 Successfully pulled image "nginx:1.15"
Normal Created 24s kubelet, 192.168.241.4 Created container
Normal Started 24s kubelet, 192.168.241.4 Started container
故障排除
值 | 描述 |
---|
pending | pod创建已经提交到kubernetes,但是,因为某种原因而不能顺利创建,例如下载镜像慢,调度不成功 |
Running | pod已经绑定到一个节点,并且已经创建了所有容器,至少有一个容器正在运行中,或正在启动或重新启动 |
Succeeded | pod中的所有容器都已经成功终止,不会重新启动 |
Failed | Pod的所有容器均已终止,且至少有一个容器已经故障中终止,也就是说,容器要么以非零状态退出,要么被系统终止 |
Unknown | 由于某种原因apiserver无法获得pod的状态,通常是由于master与pod所在主机kubelet通信时出错 |
查看pod事件
kubectl describe TYPE NAME_PREFIX
查看pod日志(Failed状态下)
kubectl logs POD_NAME
进入pod(状态为running,但是服务没有提供)
kubectl exec –it POD_NAME bash
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)