目录
1. 资源清单
- 格式如下: apiVersion: group/version //指明api资源属于哪个群组和版本,同一个组可以有多个版本 $ kubectl api-versions //查询命令 kind: //标记创建的资源类型,k8s主要支持以下资源类别 Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob metadata: //元数据 name: //对像名称 namespace: //对象属于哪个命名空间 labels: //指定资源标签,标签是一种键值数据 spec: //定义目标资源的期望状态 $ kubectl explain pod //查询帮助文档
1.
1
格式和内容的书写方法## 方法一:书写时候的查找方法,可以之直接通过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文件
方法一
方法二
1.2 示例及执行操作
##如果俩个镜像使用的是同一个端口,只有一个可以成功 [root@server2 ~]# kubectl delete deployments.apps nginx ##删除原来pod,为了下面进行实验 [root@server2 ~]# vim pod.yml ##编写yml文件,可用性较高 [root@server2 ~]# cat pod.yml apiVersion: apps/v1 kind: Deployment ##设置为deployment metadata: name: nginx namespace: default ##设置命名空间 spec: replicas: 1 selector: matchLabels: run: nginx template: ##模板 metadata: labels: ##标签 run: nginx spec: #nodeSelector: ##指定运行节点的俩种方法(方法一) # kubernetes.io/hostname: server4 #nodeName: server3 ##指定运行节点的俩种方法(方法二) #hostNetwork: true ##可以通过直接访问节点ip的方式访问,[root@westos Desktop]# curl 172.25.13.4 containers: - name: nginx image: myapp:v1 imagePullPolicy: IfNotPresent resources: ##资源限制 requests: cpu: 100m memeory: 100Mi limits: cpu: 0.5 memory: 512Mi #- name: busyboxplus # image: busyboxplus # imagePullPolicy: IfNotPresent ##本地有镜像,优先本地拉取,没有就需要联网拉取 # stdin: true ##stdin和tty是为了保证交互式,相当于执行参数-it # tty: true [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
2.pod生命周期
2.1 简介
- 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
2.2 示例
2.2.1 多层
server1上将buxybox上传到私有仓库 docker search busyboxplus docker pull radial/busyboxplus docker tag radial/busyboxplus:latest reg.westos.org/library/busyboxplus:latest docker push reg.westos.org/library/busyboxplus:latest [root@server2 pod]# vim pod.yml [root@server2 pod]# cat pod.yml apiVersion: v1 kind: Pod metadata: name: pod-example spec: containers: - name: myapp1 image: myapp:v1 imagePullPolicy: IfNotPresent - name: myapp2 image: busyboxplus imagePullPolicy: IfNotPresent stdin: true tty: true [root@server2 pod]# kubectl apply -f pod.yml [root@server2 pod]# kubectl describe pod pod-example
2.2.2 Init 容器
[root@server2 pod]# vim pod.yml [root@server2 pod]# cat pod.yml apiVersion: v1 kind: Pod metadata: name: pod-example spec: containers: - name: myapp1 image: myapp:v1 imagePullPolicy: IfNotPresent initContainers: - name: busybox image: busybox imagePullPolicy: IfNotPresent command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done;"] [root@server2 pod]# kubectl delete -f pod.yml pod "pod-example" deleted [root@server2 pod]# kubectl apply -f pod.yml pod/pod-example created
[root@server2 pod]# vim pod.yml [root@server2 pod]# cat pod.yml apiVersion: v1 kind: Pod metadata: name: pod-example spec: containers: - name: myapp1 image: myapp:v1 imagePullPolicy: IfNotPresent initContainers: - name: busybox image: busybox imagePullPolicy: IfNotPresent command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done;"] --- apiVersion: v1 kind: Service metadata: name: myservice spec: ports: - protocol: TCP port: 80 targetPort: 80 [root@server2 pod]# kubectl apply -f pod.yml pod/pod-example created service/myservice created [root@server2 pod]# kubectl logs pod-example -c busybox [root@server2 pod]# kubectl get pod NAME READY STATUS RESTARTS AGE pod-example 1/1 Running 0 25s [root@server2 pod]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-example 1/1 Running 0 30s 10.244.2.21 server4 <none> <none> [root@server2 pod]# curl 10.244.2.21 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
2.2.3 探针livenessProbe
[root@server2 pod]# cat pod1.yaml apiVersion: v1 kind: Pod metadata: labels: test: liveness name: liveness-http spec: containers: - name: liveness image: nginx imagePullPolicy: IfNotPresent livenessProbe: tcpSocket: port: 80 initialDelaySeconds: 1 periodSeconds: 3 timeoutSeconds: 1 readinessProbe: httpGet: path: /test.html port: 80 initialDelaySeconds: 1 periodSeconds: 3 timeoutSeconds: 1 kubectl expose pod liveness-http --port=80 --target-port=80 kubectl get svc kubectl describe svc liveness-http kubectl exec -it liveness-http -- bash kubectl describe svc liveness-http kubectl exec -it liveness-http -- rm -f /usr/share/nginx/html/test.html kubectl describe svc liveness-http