k8s学习 — (实践)第三章 深入Pod,2024年最新不得不服

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

k8s学习 — (实践)第三章 深入Pod

※ 各章节重要知识点

k8s学习 — 各章节重要知识点

1 Pod 配置文件

参考 k8s学习 — 第一章 核心概念 1.2 资源清单

  1. 配置文件

apiVersion: v1 # api 文档版本
kind: Pod # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
name: nginx-demo # Pod 的名称
labels: # 定义 Pod 的标签
type: app # 自定义 label 标签,名字为 type,值为 app
test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
namespace: ‘default’ # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建
containers: # 对于 Pod 中的容器描述

  • name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    command: # 指定容器启动时执行的命令
  • nginx
  • -g
  • ‘daemon off;’ # 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 # 重启策略,只有失败的情况才会重启
  1. 根据配置文件创建Pod

kubectl create -f nginx-demo.yaml

[root@k8s-master k8s]# kubectl create -f nginx-demo.yaml
pod/nginx-demo created

  1. 查看Pod和服务情况

kubectl get pod,svc

[root@k8s-master k8s]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-demo 0/1 ContainerCreating 0 43s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 443/TCP 13h

稍等片刻

[root@k8s-master k8s]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-demo 1/1 Running 0 3m50s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 443/TCP 13h

查看Pod更多信息

kubectl get pod -o wide

[root@k8s-master k8s]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-demo 1/1 Running 0 9m13s 10.244.36.72 k8s-node1

内部访问

[root@k8s-master k8s]# curl 10.244.36.72

Welcome to nginx!

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

2 探针

Pod里面,容器内应用的监控机制,根据不同的探针来判断容器应用当前的状态。

2.1 类型

2.1.1 startupProbe(启动探针)

k8s 1.16 版本新增的探针,用于判断应用程序是否已经启动了。

当配置了 startupProbe 后,会先禁用其他探针,直到 startupProbe 成功后,其他探针才会继续。

作用:由于有时候不能准确预估应用一定是多长时间启动成功。因此配置另外两种方式不方便配置初始化时长来检测,而配置了 statupProbe 后,只有在应用启动成功了,才会执行另外两种探针检测。

确保这些livenessProbe(存活)、readinessProbe(就绪)探针不会影响应用程序的启动。这可以用于对慢启动容器进行存活性检测,避免它们在启动运行之前就被杀掉。

startupProbe:
httpGet:
path: /api/startup
port: 80

2.1.2 livenessProbe(存活探针)

用于探测容器中的应用是否运行,如果探测失败(即应用停止了),kubelet 会根据配置的重启策略进行重启,若没有配置,默认就认为容器启动成功,不会执行重启策略。

livenessProbe:
failureThreshold: 5
httpGet:
path: /health
port: 8080
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5

2.1.3 readinessProbe(就绪探针)

readinessProbe可以知道容器什么时候准备好了,并可以开始接受请求流量, 当一个 Pod 内的所有容器都准备好了,才能把这个 Pod 看作就绪了。这种信号的一个用途就是控制哪个 Pod 作为 Service 的后端。在 Pod 还没有准备好的时候,会从 Service 的负载均衡器中被剔除的。

它的返回值如果返回 success,那么就认为该容器已经完全准备好了,并且该容器是可以接收外部流量的。

readinessProbe:
failureThreshold: 3 # 错误次数
httpGet:
path: /ready
port: 8181
scheme: HTTP
periodSeconds: 10 # 间隔时间
successThreshold: 1
timeoutSeconds: 1

2.2 探测方式

2.2.1 ExecAction

以执行命令的方式探测,在容器内部执行一个命令,如果返回值为 0,则任务容器时健康的。

注意:必须是可执行的命令。

livenessProbe:
exec:
command:

  • cat
  • /health
2.2.2 TCPSocketAction

以 tcp 连接的方式探测,通过 tcp 连接监测容器内端口是否开放,如果开放则证明该容器健康。

注意:必须是可访问的port

livenessProbe:
tcpSocket:
port: 80

2.2.3 HTTPGetAction

以发送 HTTP 请求到容器内是否成功的方式探测,生产环境用的较多的方式,发送 HTTP 请求到容器内的应用程序,如果接口返回的状态码在 200~400 之间,则认为容器健康。

注意:必须是可访问的pathport

livenessProbe:
failureThreshold: 5
httpGet:
path: /health
port: 8080
scheme: HTTP
httpHeaders:

  • name: xxx
    value: xxx

2.3 参数配置

  1. initialDelaySeconds: 60 # 初始化时间。
  2. timeoutSeconds: 2 # 超时时间。
  3. periodSeconds: 5 # 监测间隔时间。
  4. successThreshold: 1 # 检查 1 次成功就表示成功。
  5. failureThreshold: 2 # 监测失败 2 次就表示失败。

2.4 探针实际应用

2.4.1 (可跳过)查看已有应用的配置文件探针配置

在master节点操作

  1. 查看指定命名空间的所有deployment

kubectl get deploy -n kube-system

[root@k8s-master ~]# kubectl get deploy -n kube-system
NAME READY UP-TO-DATE AVAILABLE AGE
calico-kube-controllers 1/1 1 1 22h
coredns 2/2 2 2 22h

  1. 查看/编辑 指定命名空间指定名称的deployment配置文件(coredns

kubectl edit deploy -n kube-system coredns

Please edit the object below. Lines beginning with a ‘#’ will be ignored,

and an empty file will abort the edit. If an error occurs while saving this file will be

reopened with the relevant failures.

apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: “1”
creationTimestamp: “2023-12-27T09:36:32Z”
generation: 1
labels:
k8s-app: kube-dns
name: coredns
namespace: kube-system
resourceVersion: “18183”
uid: 541272d1-9c5b-4868-a982-3273546f2456
spec:
progressDeadlineSeconds: 600
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: kube-dns
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
k8s-app: kube-dns
spec:
containers:

  • args:
  • -conf
  • /etc/coredns/Corefile
    image: registry.aliyuncs.com/google_containers/coredns:v1.8.6
    imagePullPolicy: IfNotPresent
    livenessProbe:
    failureThreshold: 5
    httpGet:
    path: /health
    port: 8080
    scheme: HTTP
    initialDelaySeconds: 60
    periodSeconds: 10
    successThreshold: 1
    timeoutSeconds: 5
    name: coredns
    ports:
  • containerPort: 53
    name: dns
    protocol: UDP
  • containerPort: 53
    name: dns-tcp
    protocol: TCP
  • containerPort: 9153
    name: metrics
    protocol: TCP
    readinessProbe:
    failureThreshold: 3
    httpGet:
    path: /ready
    port: 8181
    scheme: HTTP
    periodSeconds: 10
    successThreshold: 1
    timeoutSeconds: 1
    resources:
    limits:
    memory: 170Mi
    requests:
    cpu: 100m
    memory: 70Mi
    securityContext:
    allowPrivilegeEscalation: false
    capabilities:
    add:
  • NET_BIND_SERVICE
    drop:
  • all
    readOnlyRootFilesystem: true
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
  • mountPath: /etc/coredns
    name: config-volume
    readOnly: true
    dnsPolicy: Default
    nodeSelector:
    kubernetes.io/os: linux
    priorityClassName: system-cluster-critical
    restartPolicy: Always
    schedulerName: default-scheduler
    securityContext: {}
    serviceAccount: coredns
    serviceAccountName: coredns
    terminationGracePeriodSeconds: 30
    tolerations:
  • key: CriticalAddonsOnly
    operator: Exists
  • effect: NoSchedule
    key: node-role.kubernetes.io/master
  • effect: NoSchedule
    key: node-role.kubernetes.io/control-plane
    volumes:
  • configMap:
    defaultMode: 420
    items:
  • key: Corefile
    path: Corefile
    name: coredns
    name: config-volume
    status:
    availableReplicas: 2
    conditions:
  • lastTransitionTime: “2023-12-27T09:36:47Z”
    lastUpdateTime: “2023-12-27T09:43:51Z”
    message: ReplicaSet “coredns-6d8c4cb4d” has successfully progressed.
    reason: NewReplicaSetAvailable
    status: “True”
    type: Progressing
  • lastTransitionTime: “2023-12-28T03:08:25Z”
    lastUpdateTime: “2023-12-28T03:08:25Z”
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: “True”
    type: Available
    observedGeneration: 1
    readyReplicas: 2
    replicas: 2
    updatedReplicas: 2
  1. 配置的探针
    存活探针

livenessProbe:
failureThreshold: 5
httpGet:
path: /health
port: 8080
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5

就绪探针

readinessProbe:
failureThreshold: 3
httpGet:
path: /ready
port: 8181
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1

2.4.2 用到的相关命令

1 Pod 配置文件 中加入探针配置,用到的相关命令:

1 查看所有Pod

kubectl get po

或查看指定名称的Pod

kubectl get po nginx-demo

[root@k8s-master ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-demo 0/1 Completed 0 9h

2 删除指定名称的Pod

kubectl delete po nginx-demo

3 查看/编辑指定名称的Pod配置文件

kubectl edit po nginx-demo

4 修改 nginx-demo.yaml 配置文件

vim /opt/k8s/nginx-demo.yaml

5 根据 nginx-demo.yaml 创建Pod应用(nginx-demo)

kubectl create -f nginx-demo.yaml

6 查看探针执行情况

kubectl describe po nginx-demo

2.4.3 startupProbe(启动探针)
  1. 先删除已创建的Pod应用(nginx-demo

删除指定名称的Pod

kubectl delete po nginx-demo

  1. 修改 nginx-demo.yaml 配置文件(加入 startupProbe 配置,探测方式:HTTPGetAction

apiVersion: v1 # api 文档版本
kind: Pod # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
name: nginx-demo # Pod 的名称
labels: # 定义 Pod 的标签
type: app # 自定义 label 标签,名字为 type,值为 app
test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
namespace: ‘default’ # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建
containers: # 对于 Pod 中的容器描述

  • name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    startupProbe: # 应用启动探针配置
    httpGet: # 探测方式,基于 http 请求探测
    path: /index.html # http 请求路径
    port: 80 # 请求端口
    failureThreshold: 3 # 请求失败多少次就表示真正失败
    periodSeconds: 10 # 监测间隔时间。
    successThreshold: 1 # 监测多少次成功就表示真正成功
    timeoutSeconds: 5 # 请求的超时时间
    command: # 指定容器启动时执行的命令
  • nginx
  • -g
  • ‘daemon off;’ # 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 # 重启策略,只有失败的情况才会重启
  1. 根据 nginx-demo.yaml 创建Pod应用(nginx-demo

kubectl create -f nginx-demo.yaml

  1. 查看探针执行情况

kubectl describe po nginx-demo

在这里插入图片描述

[root@k8s-master k8s]# kubectl describe po nginx-demo
Name: nginx-demo
Namespace: default
Priority: 0
Node: k8s-node1/192.168.3.242
Start Time: Thu, 28 Dec 2023 17:40:13 +0800
Labels: test=1.0.0
type=app
Annotations: cni.projectcalico.org/containerID: 78799c5edee21106551c37d5a75b9e0ce522d887161b1dda97ed71b0702930f9
cni.projectcalico.org/podIP: 10.244.36.74/32
cni.projectcalico.org/podIPs: 10.244.36.74/32
Status: Running
IP: 10.244.36.74
IPs:
IP: 10.244.36.74
Containers:
nginx:
Container ID: docker://21d1509903c8105cac47a49ee3f86cc3a138e6d2f0d4aa8d25c8119c20d8ca9a
Image: nginx:1.7.9
Image ID: docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451
Port: 80/TCP
Host Port: 0/TCP
Command:
nginx
-g
daemon off;
State: Running
Started: Thu, 28 Dec 2023 17:40:14 +0800
Ready: True
Restart Count: 0
Limits:
cpu: 200m
memory: 256Mi
Requests:
cpu: 100m
memory: 128Mi
Startup: http-get http://:80/index.html delay=0s timeout=5s period=10s #success=1 #failure=3
Environment:
JVM_OPTS: -Xms128m -Xmx128m
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-k84gr (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-k84gr:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional:
DownwardAPI: true

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
/serviceaccount from kube-api-access-k84gr (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-k84gr:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional:
DownwardAPI: true

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-RS85jUg3-1713328174213)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 24
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值