k8s查看资源属性命令explain
[root@master ~]# kubectl explain pod`
[root@master ~]# kubectl explain pod.metadata
k8s资源各级属性
pod各属性详解
在一个pod中定义多个容器(不包括根容器)
[root@master ~]# vim pod_base.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-base
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
- name: busybox
image: busybox:1.30
[root@master ~]# kubectl create -f pod_base.yaml
pod/pod-base created
[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pod-base 1/2 CrashLoopBackOff 1 24s
pod的containers的镜像拉取策略
[root@master ~]# vim podimagepullpolicy.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-imagepullpolicy
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.3
imagePullPolicy: Never
- name: busybox
image: busybox:1.30
[root@master ~]# kubectl create -f podimagepullpolicy.yaml
pod/pod-imagepullpolicy created
[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pod-imagepullpolicy 0/2 CrashLoopBackOff 1 11s
[root@master ~]# vim podimagepullpolicy.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-imagepullpolicy
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.3
imagePullPolicy: IfNotPresent
- name: busybox
image: busybox:1.30
[root@master ~]# kubectl delete -f podimagepullpolicy.yaml
pod "pod-imagepullpolicy" deleted
[root@master ~]# kubectl create -f podimagepullpolicy.yaml
pod/pod-imagepullpolicy created
[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pod-imagepullpolicy 1/2 CrashLoopBackOff 1 26s
pod的containers属性command、args
[root@master ~]# vim pod-command.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-command
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
imagePullPolicy: IfNotPresent
- name: busybox
image: busybox:1.30
command: ["/bin/sh","-c","touch /tmp/hello.txt;while true;do /bin/echo $(date +%T) >> /tmp/hello.txt;sleep 3;done;"]
[root@master ~]# kubectl create -f pod-command.yaml
pod/pod-command created
[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pod-command 2/2 Running 0 12s
[root@master ~]# kubectl exec pod-command -n dev -it -c busybox /bin/sh
/ # tail -f /tmp/hello.txt
13:15:35
13:15:38
13:15:41
pod的containers属性ports
[root@master ~]# vim pod-ports.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-ports
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80 #容器要监听的端口
protocol: TCP
[root@master ~]# kubectl create -f pod-ports.yaml
pod/pod-ports created
[root@master ~]# kubectl get pods pod-ports -n dev -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2023-02-13T13:51:21Z"
name: pod-ports
namespace: dev
resourceVersion: "88905"
selfLink: /api/v1/namespaces/dev/pods/pod-ports
uid: 5a04086e-c5bc-4d72-9db4-bf730b7a9564
spec:
containers:
- image: nginx:1.17.1
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
name: nginx-port
protocol: TCP
......
注:要访问pod中的程序需要使用的是podIP:containerPort
pod的containers属性resources
[root@master ~]# vim pod-resources.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-resources
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
resources:
limits: #资源上限
cpu: "2"
memory: "10Gi"
requests: #资源下限
cpu: "1"
memory: "10Mi"
[root@master ~]# kubectl create -f pod-resources.yaml
pod/pod-resources created
[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pod-ports 1/1 Running 0 22m
pod-resources 1/1 Running 0 19s
[root@master ~]# vim pod-resources.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-resources
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
resources:
limits: #资源上限
cpu: "2"
memory: "100Gi"
requests: #资源下限
cpu: "1"
memory: "100Gi"
[root@master ~]# kubectl create -f pod-resources.yaml
pod/pod-resources created
[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pod-ports 1/1 Running 0 25m
pod-resources 0/1 Pending 0 5s
pod生命周期
pod创建和终止
初始化容器
[root@master ~]# vim pod-initcontainer.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-initcontainer
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80 #容器要监听的端口
protocol: TCP
initContainers:
- name: test-mysql
image: busybox:1.30
command: ['sh','-c','until ping 192.168.109.201 -c 1 ; do echo waiting for mysql...;sleep 2;done;']
- name: test-redis
image: busybox:1.30
command: ['sh','-c','until ping 192.168.109.202 -c 1 ; do echo waiting for redis...;sleep 2;done;']
[root@master ~]# kubectl create -f pod-initcontainer.yaml
pod/pod-initcontainer created
[root@master ~]# kubectl get pods pod-initcontainer -n dev
NAME READY STATUS RESTARTS AGE
pod-initcontainer 0/1 Init:0/2 0 34s
[root@master ~]# ifconfig ens33:1 192.168.109.201 netmask 255.255.255.0 up
[root@master ~]# ifconfig ens33:2 192.168.109.202 netmask 255.255.255.0 up
钩子函数
[root@master ~]# vim pod-hook-exec.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-hook-exec
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80 #容器要监听的端口
protocol: TCP
lifecycle:
postStart:
exec: #在容器启动时执行一个命令,修改掉Nginx的默认首页内容
command: ["/bin/sh","-c","echo postStart... > /usr/share/nginx/html/index.html"]
[root@master ~]# kubectl create -f pod-hook-exec.yaml
pod/pod-hook-exec created
[root@master ~]# kubectl get pods pod-hook-exec -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-hook-exec 1/1 Running 0 39s 10.244.1.34 node2 <none> <none>
[root@master ~]# curl 10.244.1.34:80
postStart...
容器探测
[root@master ~]# vim pod-liveness-exec.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-liveness-exec
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80 #容器要监听的端口
protocol: TCP
livenessProbe:
exec:
command: ["/bin/cat","/tmp/hello.txt"]
[root@master ~]# kubectl create -f pod-liveness-exec.yaml
pod/pod-liveness-exec created
[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pod-liveness-exec 1/1 Running 6 4m5s
[root@master ~]# vim pod-liveness-tcpsocket.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-liveness-tcpsocket
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80 #容器要监听的端口
protocol: TCP
livenessProbe:
tcpSocket:
port: 8080 #尝试访问8080端口
[root@master ~]# kubectl create -f pod-liveness-tcpsocket.yaml
pod/pod-liveness-tcpsocket created
[root@master ~]# kubectl get pods pod-liveness-tcpsocket -n dev
NAME READY STATUS RESTARTS AGE
pod-liveness-tcpsocket 1/1 Running 1 39s
[root@master ~]# vim pod-liveness-httpget.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-liveness-exec
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80 #容器要监听的端口
protocol: TCP
livenessProbe:
httpGet:
path: /hello
port: 80
host: 127.0.0.1
scheme: HTTP
[root@master ~]# kubectl create -f pod-liveness-httpget.yaml
pod/pod-liveness-httpget created
[root@master ~]# kubectl get pods pod-liveness-httpget -n dev
NAME READY STATUS RESTARTS AGE
pod-liveness-httpget 1/1 Running 1 28s
pod重启策略
[root@master ~]# vim pod-restartpolicy.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-restartpolicy
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80 #容器要监听的端口
protocol: TCP
livenessProbe:
httpGet:
path: /hello
port: 80
host: 127.0.0.1
scheme: HTTP
restartPolicy: Never
[root@master ~]# kubectl create -f pod-restartpolicy.yaml
pod/pod-restartpolicy created
[root@master ~]# kubectl get pods pod-restartpolicy -n dev
NAME READY STATUS RESTARTS AGE
pod-restartpolicy 1/1 Running 0 19s
[root@master ~]# kubectl describe pods pod-restartpolicy -n dev
pod调度
定向调度
[root@master ~]# vim pod-nodename.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-restartpolicy
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
nodeName: node1
[root@master ~]# kubectl create -f pod-nodename.yaml
pod/pod-nodename created
[root@master ~]# kubectl get pods pod-nodename -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-nodename 1/1 Running 0 37s 10.244.2.19 node1 <none> <none>
[root@master ~]# kubectl delete -f pod-nodename.yaml
pod "pod-nodename" deleted
[root@master ~]# vim pod-nodename.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-pod-nodename
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
nodeName: node3
[root@master ~]# kubectl create -f pod-nodename.yaml
pod/pod-nodename created
[root@master ~]# kubectl get pods pod-nodename -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-nodename 0/1 Pending 0 4s <none> node3 <none> <none>
[root@master ~]# kubectl label nodes node1 nodeenv=pro
node/node1 labeled
[root@master ~]# kubectl label nodes node2 nodeenv=test
node/node2 labeled
[root@master ~]# vim pod-nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-nodeselector
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
nodeSelector:
nodeenv: pro
[root@master ~]# kubectl create -f pod-nodeselector.yaml
pod/pod-nodeselector created
[root@master ~]# kubectl get pods pod-nodeselector -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-nodeselector 1/1 Running 0 40s 10.244.2.20 node1 <none> <none>
亲和性调度
[root@master ~]# vim pod-nodeaffinity-required.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-nodeaffinity-required
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
matchExpressions:
- key: nodeenv
operator: In
values: ["xxx","yyy"]
[root@master ~]# kubectl create -f pod-nodeaffinity-required.yaml
pod/pod-nodeaffinity-required created
[root@master ~]# kubectl get pods pod-nodeaffinity-required -n dev
NAME READY STATUS RESTARTS AGE
pod-nodeaffinity-required 0/1 Pending 0 36s
[root@master ~]# kubectl delete -f pod-nodeaffinity-required.yaml
pod "pod-nodeaffinity-required" deleted
[root@master ~]# vim pod-nodeaffinity-required.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-nodeaffinity-required
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
matchExpressions:
- key: nodeenv
operator: In
values: ["pro","yyy"]
[root@master ~]# kubectl create -f pod-nodeaffinity-required.yaml
pod/pod-nodeaffinity-required created
[root@master ~]# kubectl get pods pod-nodeaffinity-required -n dev
NAME READY STATUS RESTARTS AGE
pod-nodeaffinity-required 1/1 Running 0 7s
[root@master ~]# vim pod-nodeaffinity-preferred.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-nodeaffinity-preferred
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: nodeenv
operator: In
values: ["xxx","yyy"]
[root@master ~]# kubectl create -f pod-nodeaffinity-preferred.yaml
pod/pod-nodeaffinity-preferred created
[root@master ~]# kubectl get pods pod-nodeaffinity-preferred -n dev
NAME READY STATUS RESTARTS AGE
pod-nodeaffinity-preferred 1/1 Running 0 20s
[root@master ~]# vim pod-podaffinity-target.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-podaffinity-target
namespace: dev
labels:
podenv: pro
spec:
containers:
- name: nginx
image: nginx:1.17.1
nodeName: node1
[root@master ~]# kubectl create -f pod-podaffinity-target.yaml
pod/pod-podaffinity-target created
[root@master ~]# vim pod-podaffinity-required.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-podaffinity-required
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: podenv
operator: In
values: ["xxx","yyy"]
topologyKey: kubenetes.io/hostname #作用域
[root@master ~]# kubectl create -f pod-podaffinity-required.yaml
pod/pod-podaffinity-required created
[root@master ~]# kubectl get pods pod-podaffinity-required -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-podaffinity-required 0/1 Pending 0 5s <none> <none> <none> <none>
[root@master ~]# vim pod-podantiaffinity-required.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-podantiaffinity-required
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: podenv
operator: In
values: ["pro"]
topologyKey: kubenetes.io/hostname #作用域
[root@master ~]# kubectl create -f pod-podantiaffinity-required.yaml
pod/pod-podantiaffinity-required created
[root@master ~]# kubectl get pods pod-podantiaffinity-required -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-podantiaffinity-required 1/1 Running 0 19s 10.244.1.44 node2 <none> <none>
污点和容忍
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 7d1h v1.17.4
node1 Ready <none> 7d1h v1.17.4
node2 NotReady <none> 7d1h v1.17.4
[root@master ~]# kubectl taint nodes node1 tag=heima:PreferNoSchedule
node/node1 tainted
[root@master ~]# kubectl run taint1 --image=nginx:1.17.1 -n dev
deployment.apps/taint1 created
[root@master ~]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
taint1-766c47bf55-xxbf4 1/1 Running 0 11s 10.244.2.28 node 1 <none> <none>
[root@master ~]# kubectl taint nodes node1 tag:PreferNoSchedule-
node/node1 untainted
[root@master ~]# kubectl taint nodes node1 tag=heima:NoSchedule
node/node1 tainted
[root@master ~]# kubectl run taint2 --image=nginx:1.17.1 -n dev
deployment.apps/taint2 created
[root@master ~]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
taint1-766c47bf55-xxbf4 1/1 Running 0 2m36s 10.244.2.28 node1 <none> <none>
taint2-84946958cf-lz9ld 0/1 Pending 0 8s <none> <none> <none> <none>
[root@master ~]# kubectl taint nodes node1 tag:NoSchedule-
node/node1 untainted
[root@master ~]# kubectl taint nodes node1 tag=heima:NoExecute
node/node1 tainted
[root@master ~]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
taint1-766c47bf55-kw8w8 0/1 Pending 0 10s <none> <none> <none> <none>
taint2-84946958cf-g2wzn 0/1 Pending 0 10s <none> <none> <none> <none>
[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
taint1-766c47bf55-kw8w8 0/1 Pending 0 13m
taint2-84946958cf-g2wzn 0/1 Pending 0 13m
[root@master ~]# vim pod-toleration.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-toleration
namespace: dev
labels:
podenv: pro
spec:
containers:
- name: nginx
image: nginx:1.17.1
tolerations:
- key: "tag"
operator: "Equal"
value: "heima"
effect: "NoExecute"
[root@master ~]# kubectl create -f pod-toleration.yaml
pod/pod-toleration created
[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
pod-toleration 1/1 Running 0 5s
taint1-766c47bf55-kw8w8 0/1 Pending 0 16m
taint2-84946958cf-g2wzn 0/1 Pending 0 16m