系列综述:
💞目的:本系列是个人整理为了云计算学习
的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
🥰来源:材料主要源于–Kubernetes 官方文档–进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。
🤭结语:如果有帮到你的地方,就点个赞和关注一下呗,谢谢🎈🎄🌷!!!
请先收藏!!!,后续继续完善和扩充👍(●’◡’●)
文章目录
零、kubectl基础
基本命令
- 通用公式:
kubectl + [Command] + [Type] + [ResourceName]+ [Flags]
- [Command]:指定要执行的基本的CRUD操作,如create、get、describe、delete等
- [Type]:指定资源类型,注意区分大小写,如pod(po)、node(no)、Service(svc)、Deployment(dep)、ReplicaSet(rs) 等
- [ResourceName]:指定资源的名称。名称区分大小写,如 <pod-name>、 <service-name>
- [Flags]:指定可选的参数,用于进一步定制命令的行为
- kubectl的增删改查
- 创建资源:
kubectl create -f ResourceName.yaml/json
- create仅用于创建新的资源对象,若对象已存在则报错
- apply也可用于创建新资源对象时,若资源对象已存在会进行更新。
- 删除资源:
kubectl delete [Type] [ResourceName]
- 更新资源配置:
kubectl apply -f [ResourceName.yaml/json]
- 查看资源基本信息:
kubectl get [Type]s
-w
可以进行持续监听资源状态--show-labels
:显示lables标签-l key1=value1, key2=value2
:进行资源的匹配-l 'key in (value1, value2, value3)'
:在值集合中进行匹配
- 查看资源的事件:
kubectl describe [Type] [ResourceName]
- 查看Pod的日志:
kubectl logs [PodName]
- 持久修改配置文件:
kubectl edit [Type] [ResourceName]
,可以通过外部命令行形式进行临时加标签,但是临时标签可能因更新而失效
- 创建资源:
- 在Pod中执行命令:
kubectl exec -it [PodName] -- [Command]
- 将本地端口和Pod端口进行映射
kubectl port-forward [PodName] <local-port>:<pod-port>
- 用于调整Deployment的副本数量:
kubectl scale deployment <deployment-name> --replicas=<replica-count>
- 资源对象内的容器执行命令:
kubectl exec -it [ResourceName] -c [ContainerName] -- [Command]
- 滚动更新和回滚
- 查看滚动更新状态:
kubectl rollout status [Type] [ResourceName]
- 回滚到先前的版本:
kubectl rollout undo [Type] [ResourceName]
- 暂停滚动更新:
kubectl rollout pause [Type] [ResourceName]
- 恢复滚动更新:
kubectl rollout resume [Type] [ResourceName]
- 查看滚动更新历史:
- 查看所有历史版本:
kubectl rollout history [Type] [ResourceName]
- 查看指定历史版本:
kubectl rollout history [Type] [ResourceName] --revision=[1~100]
- 查看所有历史版本:
- 查看滚动更新状态:
kubectl get svc
的查询结果- NAME:标识集群中服务实例的名称
- TYPE
- ClusterIP: 最常见的类型,为服务分配一个只允许集群内部的Pod访问的虚拟IP
- NodePort:客户端访问
EXTERNAL-IP : nodePort
,每个节点的kube-proxy会将请求转发到Service的targetPort
实际进行处理 - LoadBalancer:客户端访问
EXTERNAL-IP : port
,负载均衡器会将EXTERNAL-IP
更新为负载均衡器的IP地址,所以可以使用内部的port
去访问Service - ExternalName: 此类型将服务映射到外部DNS名称,不分配集群内部的IP地址,而是通过DNS解析来访问外部服务。
- CLUSTER-IP:用于在集群内部Pod之间进行通信的虚拟IP地址
- EXTERNAL-IP:允许外部访问集群内部服务的IP地址,外部主机需要通过VPN或绑定才能访问
- AGE:表示Service已经创建的时间
- 注意:集群外部访问
外网IP : 外部代理端口
,会通过LoadBalancer机制
将外部请求负载均衡到集群内部的多个Pod上,每个节点的内部分发端口会接收LB代理
转发过来的请求
NAME | TYPE | CLUSTER-IP | EXTERNAL-IP | PORT(S) | AGE |
---|---|---|---|---|---|
kube-node-service-lb | LoadBalancer | 10.99.201.198 | 外网IP1, 外网IP2 | port : nodePort/TCP | 29d |
kube-node-service | NodePort | 10.97.114.36 | 外网IP1, 外网IP2 | port : nodePort/TCP | 29d |
- 两种port的作用
- targetport:在多容器Pod中,可以将Pod内不同容器的服务端口统一为targetPort,但可以将流量路由到不同的容器端口
- port:指定服务在集群内部的监听端口
一、深入Pods
Pod探针
- 定义:根据不同的探针探测
容器当前状态
,如果Pod状态异常,会执行对应的修复策略,从而提高系统稳定性 - 探针类型
- StartupProbe(启动探针):探测容器内是否
已完成所有初始化操作
,能够进行用户请求的处理 - ReadinessProbe(就绪探针):检测Pod内的是否
所有容器已就绪
,如果都通过检查,则会将该Pod加入Endpoint服务列表中 - LivenessProbe(存活探针):检测容器内部是否
应用进程还存活
,若探测到进程不存在或终止,则会执行相应的容器重启策略
- StartupProbe(启动探针):探测容器内是否
- 探测方式
- TCPSocketAction(TCP检查):通过尝试与容器内的特定端口
建立TCP连接
来判断应用是否运行。 - HTTPGetAction(HTTP请求):向容器内的特定URL发送HTTP请求,根据
HTTP响应状态码
判断应用是否健康。 - ExecAction(执行命令):在容器内部执行一个命令,根据
命令退出状态码
判断应用状态 - 具体应用:根据不同的应用场景,灵活使用三种方式进行探测,yaml文件示例如下
apiVersion: v1 kind: Pod metadata: name: startup-probe-example spec: containers: - name: app-container image: my-app-image:latest # 1. StartupProbe + TCPSocketAction探测配置 startupProbe: # 应用启动探针配置 tcpSocket: # 基于TCP的测试方式,若无法访问80端口则失败 port:80 # 请求端口 # 2. ReadinessProbe + HTTPGetAction探测配置 livenessProbe: # 应用存活探针配置 httpGet: # 基于 http 请求探测,若是无法访问Path的内容则失败 path: /api/path # http 请求路径 port: 80 # 请求端口 # 3. ExecAction + ExecAction探测配置 redinessProbe: # 应用就绪探针配置 exec: # 基于exec命令执行进行探测 command : - sh - -C - "sleep 5; echo 'success' > /inited" # 输出success字符到inited文件中 failureThreshold: 3 # 失败多少次才算真正失败 periodSeconds: 10 # 间隔时间 successThreshold: 1 # 多少次监测成功算成功 timeoutSeconds: 3 # 请求的超时时间
- TCPSocketAction(TCP检查):通过尝试与容器内的特定端口
- 创建Pod
- 创建并进入
pods
文件:mkdir pods && cd pods
- 创建yaml文件:
vim [name]-pod.yaml
- 编写yaml文件,示例如下
- 根据yaml文件创建Pod:
kubectl create -f [name]-pod.yaml
apiVersion: v1 # api文档版本 kind: Pod # 资源对象类型,如Pod、Deployment、StatuefulSet等 metadata: # 资源元数据描述 name: nginx-po # 自定义的Pod名称 labels: # Pod的描述信息,内容为自定义的多个键值对 type: app # 自定义label标签,名字为type,值为app version: "1.0.0" # 自定义label标签,描述Pod版本号 namespace: default # 命名空间的配置 spec: # 期望Pod按照这里面的描述进行创建 terminationGracePeriodSeconds:#当pod执行delete操作时间,宽限的时间 containers: # 对于Pod中的容器描述 - name: nginx # 容器的名称 image: nginx:1.7.9 # 指定容器的镜像 imagePullPolicy: IfNotPresent # 镜像拉取策略:本地不存在就从镜像仓库拉取 lifecycle: # 生命周期的配置 poststart: # 生命周期启动阶段做的事情,不一定在容器的command 之前运行 exec: command : - sh - -c - "echo '<hl>prestop</h1>'> /usr/share/nginx/html/prestop.html" preStop: # 在容器被终止之前执行的操作 exec: command : - sh - -c - "echo '<hl>finished...</h1>'> /usr/share/nginx/html/prestop.html" command: # 指定容器启动时执行的命令 - nginx - -g - 'daemon off;' workingDir: "/usr/share/nginx/html" # 定义容器启动后的工作目录 ports: # 端口配置 - name: http # 端口名称 containerPort: 80 # 描述容器内要暴露的端口 protocol: TCP # 描述该端口是基于哪种协议通信的 env: # 环境变量 - name: JVM_OPTS # 环境变量名称 value: "-Xms128m -Xmx128m" # 环境变量的值 resources: # 资源限制 requests: # 最少需要多少资源 cpu: "100m" # 限制cpu最少使用0.1个核心 memory: "128Mi" # 限制内存最少使用128兆 limits: # 最多可以用多少资源 cpu: "200m" # 限制cpu最多使用0.2个核心 memory: "256Mi" # 限制最多使用256兆 restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启
- 创建并进入
- Pod生命周期示例
- 初始化阶段:
按序
对Pod内所有容器进行初始化操作 - 容器生命周期钩子函数(回调函数)
- PostStart:在
容器创建后
立即执行的操作,常用于加载配置、预热缓存等 - PreStop:
容器将结束时
执行的操作,常用于注册中心下线、数据销毁、数据清理等
- PostStart:在
- 探针执行顺序:
就绪探针
和存活探针
会在启动探针
执行成功后开始运行,进行持续的就绪和存活状态探查 - Pause容器:为同一Pod中所有的容器提供共享的网络资源、存储资源,并管理整个Pod的生命周期
- 初始化阶段: