k8s学习(六)

Pod生命周期

我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程:

  • pod创建过程
  • 运行初始化容器(init container)过程
  • 运行主容器(main container)过程

       容器启动后钩子(post start)、容器终止前钩子(pre stop)
       容器的存活性探测(liveness probe)、就绪性探测(readiness probe)

  • pod终止过程

初始化容器

初始化容器是在pod的主容器启动之前要运行的容器,主要是做一些主容器的前置工作,它具有两大特征:
1.初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么kubernetes需要重启它直到成功完成
2.初始化容器必须按照定义的顺序执行,当且仅当前一个成功之后,后面的一个才能运行初始化容器有很多的应用场景,下面列出的是最常见的几个:

  • 提供主容器镜像中不具备的工具程序或自定义代码
  • 初始化容器要先于应用容器串行启动并运行完成,因此可用于延后应用容器的启动直至其依赖的条件得到满足接下来做一个案例,模拟下面这个需求:

假设要以主容器来运行nginx,但是要求在运行nginx之前先要能够连接上mysql和redis所在服务器
为了简化测试,事先规定好mysql(192.168.xx.xx)和redis(192.168.xx.xx)服务器的地址
创建pod-initcontainer.yaml,内容如下:

apiVersion: v1
kind: Pod
metadata:
 name: pod-initcontainer
 namespace: dev
spec :
 containers:
 - name: main-container
   image: nginx:1.17.1
   ports:
   - name:nginx-port
     containerPort: 88
 initContainers:
 - name: test-mysql
   image: busybox:1.30
   command:['sh','-c','until ping 192.168.xx.xx -c 1 ; do echo waiting for mysql...;
sleep 2; done;']
 - name: test-redis
   image: busybox:1.30
   command: ['sh','-c','until ping 192.168.xx.xx -c 1 ; do echo waiting for reids...;
sleep 2; done;']

创建测试网络:

ifconfig ens33:1 192.168.xx.xx netmask 255.255.255.0 up

为了方便观察效果,加上-w滚动查看

kubectl get pod pod-initcontainer -n dev -w

钩子函数

kubernetes在主容器的启动之后和停止之前提供了两个钩子函数:

  • post start:容器创建之后执行,如果失败了会重启容器
  • pre stop :容器终止之前执行,执行完成之后容器将成功终止,在其完成之前会阻塞删除容器的操作

钩子处理器支持使用下面三种方式定义动作:

  • Exec命令:在容器内执行一次命令

lifecycle :
 postStart:
  exec:
   command:
   - cat
   - /tmp/healthy

  • TCPSocket:在当前容器尝试访问指定的socket

lifecycle:
 postStart: 
  tcpSocket: 
   port: 8080

  • HttpGet:在当前容器中向某url发起http请求

lifecycle :
 postStart:
  httpGet :
   path: /#URI地址
   port: 80 #端口号
   host: 192.168.xx.xx #主机地址
   scheme: HTTP #支持的协议,http或者https

创建pod-hook-exec.yaml文件

apiVersion: v1
kind: Pod
metadata:
 name: pod-hook-exec
 namespace: dev
spec :
 containers:
 - name: main-container
   image: nginx:1.17.1
   ports:
   - name: nginx-port
     containerPort: 88
   lifecycle :
    postStart:
     exec:# 在容器启动的时候执行一个命令,修改掉nginx的默认首页内容
      command: ["/bin/sh","-c", "echo postStart...> /usr/share/nginx/html/index.htm]"]
    preStop:
     exec:#在容器停止之前停止nginx服务
      command:["/usr/sbin/nginx","-s","quit"]

容器探测

容器探测用于检测容器中的应用实例是否正常工作,是保障业务可用性的一种传统机制。如果经过探测,实例的状态不符合预期,那么kubernetes就会把该问题实例" 摘除",不承担业务流量。kubernetes提供了两种探针来实现容器探测,分别是:

  • liveness probes:存活性探针,用于检测应用实例当前是否处于正常运行状态,如果不是,k8s会重启容器·
  • readiness probes:就绪性探针,用于检测应用实例当前是否可以接收请求,如果不能,k8s不会转发流量

livenessProbe 决定是否重启容器,readinessProbe 决定是否将请求转发给容器。

支持三种探测方式exec、tcpsocket、httpget,跟上面命令一样,直接看实例

创建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
   livenessProbe :
    exec :
     command: ["/bin/cat","/tmp/hello.txt"]# 执行一个查看文件的命令

至此,已经使用liveness Probe演示了三种探测方式,但是查看livenessProbe的子属性,会发现除了这三种方式,还有一些其他的配置,在这里一并解释下:
[root@master ~]# kubectl explain pod.spec.containers.livenessProbeFIELDS:
exec <Object>
tcpSocket<0bject>
httpGet<0bject>
initialDelaySeconds <integer> #容器启动后等待多少秒执行第一次探测
timeoutSeconds<integer>       #探测超时时间。默认1秒,最小1秒
periodSeconds<integer>        #执行探测的频率。默认是10秒,最小1秒
failureThreshold<integer>     # 连续探测失败多少次才被认定为失败。默认是3。最小值是1
successThreshold<integer>     # 连续探测成功多少次才被认定为成功。默认是1

重启策略

在上一节中,一旦容器探测出现了问题,kubernetes就会对容器所在的Pod进行重启,其实这是由pod的重启策略决定的,pod的重启策略有3种,分别如下:

  • Always:容器失效时,自动重启该容器,这也是默认值,
  • OnFailure : 容器终止运行且退出码不为0时重启
  • Never: 不论状态为何,都不重启该容器

重启策略适用于pod对象中的所有容器,首次需要重启的容器,将在其需要时立即进行重启,随后再次需要重启的操作将由kubelet延迟一段时间后进行,且反复的重启操作的延迟时长以此为10s、20s、40s、80s、160s和300s,300s是最大延迟时长。

创建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
   livenessProbe :
    httpGet :
     scheme : HTTP
     port: 80
     path: /he110
 restartPolicy:Never # 设置重启策略为Never

<think>嗯,用户想了解KubernetesK8S)的学习,首先我得考虑他们的背景。可能是个刚接触容器技术的开发者,或者是有一定运维经验的人士?不管怎样,得从基础开始讲起,确保他们理解K8S的核心概念。 首先得解释K8S是什么,为什么重要。然后分阶段学习,这样用户有明确的路径。第一阶段应该是基础,包括容器和Docker,毕竟K8S容器编排工具。然后介绍K8S的架构,组件如Master Node、Worker Node,这些关键部分得讲清楚,不然之后的使用会困惑。 接下来是核心概念,比如Pod、Service、Deployment这些资源对象。用户需要知道它们的作用和区别。可能还需要简单演示一个部署应用的例子,用YAML文件,这样他们能直观看到怎么操作。 第二阶段深入,得覆盖网络、存储、配置管理。这部分比较难,比如Service和Ingress的区别,Persistent Volume的作用。用户可能会在这里遇到问题,需要详细说明。 第三阶段是高级主题,比如自动伸缩、监控、安全。这时候用户已经有一定基础,可以学习如何优化和保障集群安全。同时,生态工具如Helm、Prometheus也是必须的,这些工具能提升效率。 实践建议部分,搭建实验环境很重要,MiniKube和K3s适合本地学习。官方文档和社区资源是宝贵的学习资料,推荐他们多参与社区,解决问题。持续实践是关键,通过项目来巩固知识。 最后,学习资源推荐官方文档、书籍和在线课程,覆盖不同学习偏好的人。可能用户需要这些资源来进一步自学。 需要注意避免使用复杂术语,保持解释简单明了。同时,检查是否所有技术名词都正确,比如确保K8S架构的组件名称准确,YAML示例语法正确。另外,用户可能对某些概念混淆,比如Pod和容器的关系,需要明确说明。 总之,结构要清晰,分阶段引导,结合理论和实践,帮助用户逐步掌握K8S。确保回答逻辑顺畅,覆盖用户可能关心的各个方面,并激发他们继续学习的兴趣。</think>### KubernetesK8S学习指南 Kubernetes(简称K8S)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。它是云原生生态系统的核心组件,适用于构建可扩展、高可用的分布式系统。以下是学习K8S的逐步指导: --- #### **第一阶段:基础概念** 1. **容器技术基础** - 先决条件:理解容器(如Docker)的概念,包括镜像、容器、仓库等。 - 学习目标:掌握容器生命周期管理、镜像构建(Dockerfile)及容器网络/存储配置。 2. **K8S核心架构** - **Master Node**:负责集群管理,包含以下组件: - **API Server**:集群操作的入口。 - **Scheduler**:分配Pod到Node。 - **Controller Manager**:维护集群状态(如副本数、节点故障恢复)。 - **etcd**:分布式键值存储,保存集群所有配置数据。 - **Worker Node**:运行容器化应用,包含: - **Kubelet**:与Master通信,管理Pod生命周期。 - **Kube Proxy**:处理网络规则和负载均衡。 - **容器运行时**(如Docker、containerd)。 3. **核心概念** - **Pod**:最小部署单元,包含一个或多个共享资源的容器。 - **Service**:定义如何访问一组Pod(如负载均衡、服务发现)。 - **Deployment**:声明式管理Pod副本和滚动更新。 - **Namespace**:逻辑隔离集群资源(如开发、测试环境)。 --- #### **第二阶段:核心操作与实践** 1. **集群部署** - 工具选择: - **Minikube**:本地单节点学习环境。 - **kubeadm**:生产级集群部署工具。 - **托管服务**(如AWS EKS、Google GKE)。 2. **YAML文件编写** - 语法规则:定义资源类型(如`Deployment`、`Service`)、元数据(`metadata`)、规格(`spec`)。 - 示例:部署一个Nginx应用 ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 ``` 3. **常用命令** - 查看资源:`kubectl get pods -n <namespace>` - 调试Pod:`kubectl logs <pod-name>` - 进入容器:`kubectl exec -it <pod-name> -- /bin/bash` --- #### **第三阶段:进阶主题** 1. **网络与存储** - **网络模型**:Pod间通信(CNI插件如Calico、Flannel)。 - **持久化存储**:`PersistentVolume(PV)`和`PersistentVolumeClaim(PVC)`。 2. **配置与密钥管理** - **ConfigMap**:存储非敏感配置(如环境变量)。 - **Secret**:加密存储敏感数据(如密码、证书)。 3. **自动扩展与监控** - **HPA(Horizontal Pod Autoscaler)**:基于CPU/内存指标自动扩展Pod。 - **监控工具**:Prometheus + Grafana监控集群状态。 4. **安全机制** - **RBAC(基于角色的访问控制)**:限制用户/服务的权限。 - **Pod安全策略**:定义Pod运行的安全约束。 --- #### **学习资源推荐** 1. **官方文档** - [Kubernetes官方文档](https://kubernetes.io/docs/home/):最权威的学习指南。 2. **书籍** - 《Kubernetes权威指南》 - 《Kubernetes in Action》 3. **在线课程** - Coursera:[Google Cloud Fundamentals: Core Infrastructure](https://www.coursera.org/) - Udemy:[Kubernetes for the Absolute Beginners](https://www.udemy.com/) --- #### **实践建议** 1. **动手实验** - 使用Minikube搭建本地集群,尝试部署多类型应用(如Web服务、数据库)。 2. **参与社区** - 关注GitHub上的K8S项目,参与SIG(特别兴趣小组)讨论。 3. **项目实战** - 尝试将现有应用容器化并通过K8S管理,逐步优化为高可用架构。 通过系统性学习和持续实践,可以逐步掌握K8S的核心能力,适应云原生开发与运维的需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值