- 格式如下:
apiVersion: group/version //指明api资源属于哪个群组和版本,同一个组可以有多个版本
$ kubectl api-versions //查询命令
kind: //标记创建的资源类型,k8s主要支持以下资源类别
Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob
metadata: //元数据
name: //对像名称
namespace: //对象属于哪个命名空间
labels: //指定资源标签,标签是一种键值数据
spec: //定义目标资源的期望状态
$ kubectl explain pod //查询帮助文档
## 方法一:书写时候的查找方法,可以直接通过explain一步一步查找参数内容用法
[root@server2 ~]# kubectl explain pod ##查看pod所有参数,-required-带有required是必须存在的参数
[root@server2 ~]# kubectl explain pod.apiVersion ##查看api对应需要添加的参数
## 方法二: 直接打开一个已经有的deployment,然后生成相应的yaml文件,进行参考
[root@server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 3h51m
[root@server2 ~]# kubectl get pod demo -o yaml ##生成一个yaml文件
获取帮助:spec.containers针对容器的参数
[root@server2 pod]# kubectl explain pod.spec.containers
获取yaml模板
[root@server2 pod]# kubectl run demo --image nginx --dry-run=client -o yaml > pod.yaml
注:上面容器不是真的运行
##如果俩个镜像使用的是同一个端口,只有一个可以成功
[root@server2 ~]# kubectl delete deployments.apps nginx ##删除原来pod,为了下面进行实验
[root@server2 ~]# vim pod.yml ##编写yml文件,可用性较高
[root@server2 ~]# cat pod.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: demo
name: demo
spec:
hostNetwork: true ##true让节点使用宿主机网络;占用宿主机的端口
nodeSelector: ##节点选择(选择标签)标签可以给多个节点加,主机名不推荐
kubernetes.io/hostname: k8s3 ##标签
containers:
- image: myapp:v1
name: demo
imagePullPolicy: IfNotPresent ##本地没有再去拉取
#ports: #端口映射
#- name: http
# containerPort: 80 ##容器内端口
# hostPort: 80 ##主机端口
#resources: #资源限制 ##资源控制决定pod的QoS Class(质量控制),资源不够的情况下,保障资源敏感性高资源的正常运行;
# limits: ##最多资源 ##QoS Class(质量控制)只能通过resources控制
# cpu: 1 ##1=1000m
# memory: 200Mi
# requests: ##最少资源
# cpu: 0.5
# memory: 100Mi
#- name: demo2 #定义多个容器
# image: busyboxplus
# command: ["/bin/sh", "-c", "sleep 3600"] ##运行3600秒
[root@server2 ~]# kubectl apply -f pod.yml ##deployment使用apply,会自动更新修改内容
## $ kubectl create -f demo.yaml ##不是deployment使用create,不会自动更新修改内容
deployment.apps/nginx created
[root@server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 4h47m
nginx-79cc587f-fs8l5 1/1 Running 0 2
查看详情
[root@server2 pod]# kubectl get pod -o wide
[root@server2 pod]# kubectl describe pod demo
[root@server2 pod]# kubectl get pod demo -o yaml
[root@server2 pod]# kubectl delete -f pod.yml
资源控制的意义:资源不够的情况下,保障资源敏感性高资源的正常运行;QoS Class(质量控制)只能通过resources控制;resources的值:不同、相同、注释,这3中方式
k8s官网:https://kubernetes.io/zh-cn/docs/home/
- Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。
- Init 容器与普通的容器非常像,除了如下两点:
它们总是运行到完成。
Init 容器不支持 Readiness,因为它们必须在 Pod 就绪之前运行完成,每个 Init 容器必须运行成功,下一个才能够运行。
- 如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。
- Init 容器能做什么?
Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。
Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。
应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。
Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。
由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。
- 探针 是由 kubelet 对容器执行的定期诊断:
ExecAction:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
TCPSocketAction:对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的。
HTTPGetAction:对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的。
每次探测都将获得以下三种结果之一:
成功:容器通过了诊断。
失败:容器未通过诊断。
未知:诊断失败,因此不会采取任何行动
- Kubelet 可以选择是否执行在容器上运行的三种探针执行和做出反应:
livenessProbe:指示容器是否正在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态为 Success。
readinessProbe:指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态为 Success。
startupProbe: 指示容器中的应用是否已经启动。如果提供了启动探测(startup probe),则禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet 将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探测,则默认状态为成功Success。
- 重启策略
PodSpec 中有一个 restartPolicy 字段,可能的值为 Always、OnFailure 和 Never。默认为 Always。
- Pod 的生命
一般Pod 不会消失,直到人为销毁他们,这可能是一个人或控制器。
建议创建适当的控制器来创建 Pod,而不是直接自己创建 Pod。因为单独的 Pod 在机器故障的情况下没有办法自动复原,而控制器却可以。
三种可用的控制器:
1.使用 Job 运行预期会终止的 Pod,例如批量计算。Job 仅适用于重启策略为 OnFailure 或 Never 的 Pod。
2.对预期不会终止的 Pod 使用 ReplicationController、ReplicaSet 和 Deployment ,例如 Web 服务器。 ReplicationController 仅适用于具有 restartPolicy 为 Always 的 Pod。
3.提供特定于机器的系统服务,使用 DaemonSet 为每台机器运行一个 Pod
[root@k8s2 pod]# vim init-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app.kubernetes.io/name: MyApp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox
command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
[root@k8s2 pod]# kubectl apply -f init-pod.yaml
[root@k8s2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/1 0 41s
在init容器没有成功运行之前,主容器不会被运行
添加svc定义
[root@k8s2 pod]# vim myservice.yaml
---
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
[root@k8s2 pod]# kubectl apply -f myservice.yaml
[root@k8s2 pod]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 3d1h
myservice ClusterIP 10.103.221.131 80/TCP 2s
svc解析成功后,init容器退出,主容器运行
[root@k8s2 pod]# yum install -y bind-utils
[root@k8s2 pod]# dig -t A myservice.default.svc.cluster.local. @10.96.0.10
[root@k8s2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 3m35s
回收资源
[root@k8s2 pod]# kubectl delete -f init-pod.yml
[root@k8s2 pod]# kubectl delete -f myservice.yml
[root@k8s2 pod]# vim liveness-pod.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: nginx
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 3
periodSeconds: 3
[root@k8s2 pod]# kubectl apply -f liveness-pod.yaml
在存活探针检测失败导致容器不断被重启
[root@k8s2 pod]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
liveness-http 1/1 Running 0 5s
liveness-http 1/1 Running 1 (0s ago) 13s
liveness-http 1/1 Running 2 (0s ago) 22s
[root@k8s2 pod]# kubectl describe pod liveness-http
[root@k8s2 pod]# kubectl delete -f liveness-pod.yaml
[root@k8s2 pod]# vim liveness-pod.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: nginx
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 3
periodSeconds: 3
readinessProbe:
httpGet:
path: /test.html
port: 80
initialDelaySeconds: 5
periodSeconds: 5
[root@k8s2 pod]# kubectl apply -f liveness-pod.yaml
就绪探针失败导致容器一直未就绪
[root@k8s2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
liveness-http 0/1 Running 0 34s
[root@k8s2 pod]# kubectl describe pod liveness-http
创建测试页面
[root@k8s2 pod]# kubectl exec liveness-http -- touch /usr/share/nginx/html/test.html
就绪探针成功
[root@k8s2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
liveness-http 1/1 Running 0 100s
创建svc
[root@k8s2 pod]# kubectl expose pod liveness-http --port 80 --target-port 80
就绪容器自动上线
[root@k8s2 pod]# kubectl describe svc liveness-http
Name: liveness-http
Namespace: default
Labels: test=liveness
Annotations:
Selector: test=liveness
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.108.21.178
IPs: 10.108.21.178
Port: 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.33:80 ##有值
Session Affinity: None
Events:
删除测试页面
[root@k8s2 pod]# kubectl exec liveness-http -- rm /usr/share/nginx/html/test.html
就绪探针失败,容器未就绪
[root@k8s2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
liveness-http 0/1 Running 0 6m15s
在svc中容器自动下线
[root@k8s2 pod]# kubectl describe svc liveness-http
Name: liveness-http
Namespace: default
Labels: test=liveness
Annotations:
Selector: test=liveness
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.108.21.178
IPs: 10.108.21.178
Port: 80/TCP
TargetPort: 80/TCP
Endpoints: ##为空
Session Affinity: None
Events:
回收
[root@k8s2 pod]# kubectl delete -f liveness-pod.yaml