k8s集群安装学习笔记二——资源清单

简介:

Kubernetes 资源清单
Pod生命周期
探针

Kubernetes 资源清单

 
在 k8s 中,一般使用 yaml 格式的文件来创建符合我们预期期望的 pod ,这样的 yaml 文件我们一般
称为资源清单
 
资源清单格式
复制代码
apiVersion: group/apiversion # 如果没有给定 group 名称,那么默认为 core,可以使用 kubectl api- versions # 获取当前 k8s 版本上所有的 apiVersion 版本信息( 每个版本可能不同 )
kind: #资源类别 
metadata: #资源元数据 
  name 
  namespace 
  lables 
  annotations # 主要目的是方便用户阅读查找 
spec: # 期望的状态(disired state) 
status:# 当前状态,本字段有 Kubernetes 自身维护,用户不能去定义
复制代码

 

资源清单常用命令

获取 apiversion 版本信息
[root@k8s-master01 ~]# kubectl api-versions admissionregistration.k8s.io/v1beta1 
apiextensions.k8s.io/v1beta1 
apiregistration.k8s.io/v1 
apiregistration.k8s.io/v1beta1 
apps/v1 ......(以下省略)
获取资源的 apiVersion 版本信息
[root@k8s-master01 ~]# kubectl explain pod 
KIND: Pod 
VERSION: v1 .....(以下省略) 
[root@k8s-master01 ~]# kubectl explain Ingress 
KIND: Ingress 
VERSION: extensions/v1beta1
获取字段设置帮助文档
复制代码
[root@k8s-master01 ~]# kubectl explain pod 
KIND: Pod 
VERSION: v1 
DESCRIPTION: 
          Pod is a collection of containers that can run on a host. This resource is created by clients and scheduled onto hosts. 
FIELDS: 
     apiVersion <string> 
       ........ 
       ........
复制代码
字段配置格式
apiVersion <string> #表示字符串类型 
metadata <Object> #表示需要嵌套多层字段 
labels <map[string]string> #表示由k:v组成的映射 
finalizers <[]string> #表示字串列表 
ownerReferences <[]Object> #表示对象列表 
hostPID <boolean> #布尔类型 
priority <integer> #整型 
name <string> -required- #如果类型后面接 -required-,表示为必填字段

 

示例:通过定义清单文件创建 Pod

复制代码
apiVersion: v1 
kind: Pod 
metadata: 
    name: pod-demo 
    namespace: default 
    labels: 
       app: myapp 
spec: 
    containers: 
    - name: myapp-1 
      image: hub.atguigu.com/library/myapp:v1 
    - name: busybox-1 
      image: busybox:latest 
      command: 
      - "/bin/sh" 
      - "-c" 
      - "sleep 3600"
复制代码
 
运行创建上面pod.yaml文件
$ kubectl apply -f pod.yaml
pod/pod-demo created

或者

$ kubectl create -f pod.yaml
pod/pod-demo created

 

查看pod状态

kubectl get pod

查看运行的pod详情

kubectl describe pod pod-demo

查看容器日志(pod-demo pod名,-c 指定容器名,如果该pod里面只有一个容器,可不加-c)

kubectl log pod-demo -c myapp-1

 

注:当容器报错了,先用 kubectl describe pod pod-demo 查看pod详情,找到异常容器,再查看异常容器日志排查

 
kubectl get pod xx.xx.xx -o yaml
<!--使用 -o 参数 加 yaml,可以将资源的配置以 yaml的格式输出出来,也可以使用json,输出为json格式-->

 

 

Pod生命周期

init容器

Pod 能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的 Init容器
Init 容器与普通的容器非常像,除了如下两点:
  Init 容器总是运行到成功完成为止
  每个 Init 容器都必须在下一个 Init 容器启动之前成功完成
 
如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,
如果 Pod 对应的 restartPolicy 为 Never,它不会重新启动。
Init 容器具有与应用程序容器分离的单独镜像
 
 
init模板
 
 $ vim init-pod.yaml
复制代码
apiVersion: v1 
kind: Pod #pod类型
metadata: 
  name: myapp-pod #pod名称
  labels: #标签
    app: myapp 
spec: #详细描述信息
  containers: 
  - name: myapp-container #容器名
    image: busybox #用的镜像
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']  #启动时执行命令,取代CMD       
  initContainers:  #初始化上面的容器
  - name: init-myservice  #定义第一个初始化容器
    image: busybox 
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']  #until: 当条件为真时,退出循环. nslookup myservice:解析域名
  - name: init-mydb  #定义第二个初始化容器
    image: busybox 
    command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;'] 
复制代码

创建pod

kubectl create -f init-pod.yaml

查看网络

kubectl get svc

可以查看日志看到上面会一直重新解析,是因为没有该解析,就会一直尝试解析

创建svc (service简称)

复制代码
$vim myservice.yaml
kind: Service 
apiVersion: v1 
metadata: 
  name: myservice 
spec: 
  ports: 
    - protocol: TCP 
      port: 80 
      targetPort: 9376  #暴露到svc的端口
复制代码
复制代码
$ vim mydb.yaml
kind: Service 
apiVersion: v1 
metadata: 
  name: mydb 
spec: 
  ports: 
    - protocol: TCP 
      port: 80 
      targetPort: 9377
复制代码

创建pod

$ kubectl create -f myservice.yaml
$ kubectl create -f mydb.yaml

 

然后查看,即可看到初始化成功

$ kubectl get pod

查看svc状态(可看到已添加解析)

$ kubectl get svc

 

 

 探针

 

探针是由 
kubelet 对容器执行的定期诊断。要执行诊断,kubelet 调用由容器实现的 Handler。有三种类型的处理程序:
  ExecAction:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
  TCPSocketAction:对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的。
  HTTPGetAction:对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的
 
检测探针 - 就绪检测
复制代码
$ vim read.yaml
apiVersion: v1 
kind: Pod 
metadata: #元数据信息
  name: readiness-httpget-pod 
  namespace: default 
spec:  #详细描述
  containers: 
  - name: readiness-httpget-container 
    image: wangyanglinux/myapp:v1 
    imagePullPolicy: IfNotPresent #镜像下载策略,如果有就不下载
    readinessProbe:  #就绪检测
      httpGet:  #检测方案
        port: 80 
        path: /index1.html 
      initialDelaySeconds: 1  #初始化检测延时,这个容器在启动1秒以后,启用初始化检测
      periodSeconds: 3 #重试时间
复制代码

创建pod

kubectl create -f read.yaml

 

进入容器

kubectl get pod
kubectl exec readiness-httpget-pod -c readiness-httpget-container -it -- /bin/sh #如果pod中只有一个容器,可不指定-c

 

检测探针 - 存活检测 

 

livenessProbe-exec

复制代码
$ vim  live-exec.yaml
apiVersion: v1 
kind: Pod 
metadata: 
  name: liveness-exec-pod 
  namespace: default 
spec: 
  containers: 
  - name: liveness-exec-container 
    image: hub.atguigu.com/library/busybox 
    imagePullPolicy: IfNotPresent 
    command: ["/bin/sh","-c","touch /tmp/live ; sleep 60; rm -rf /tmp/live; sleep 3600"]
    livenessProbe: 
      exec: 
        command: ["test","-e","/tmp/live"]  #检测这个文件是否存在
    initialDelaySeconds: 1 
    periodSeconds: 3
复制代码
kubectl create -f live-exec.yaml

 

livenessProbe-httpget
复制代码
$ vim live-http.yaml
apiVersion: v1 
kind: Pod 
metadata: 
  name: liveness-httpget-pod 
  namespace: default 
spec:
  containers: 
  - name: liveness-httpget-container 
    image: hub.atguigu.com/library/myapp:v1 
    imagePullPolicy: IfNotPresent 
    ports: 
    - name: http 
      containerPort: 80 
    livenessProbe: 
      httpGet: 
        port: http 
        path: /index.html  #检测能否通过http的方式获取到这个文件
      initialDelaySeconds: 1 
      periodSeconds: 3 
      timeoutSeconds: 10
复制代码
kubectl create -f live-http.yaml

 

livenessProbe-tcp
复制代码
$ vim live-tcp.yaml
apiVersion: v1 
kind: Pod 
metadata: 
  name: probe-tcp 
spec: 
  containers: 
  - name: nginx 
    image: hub.atguigu.com/library/myapp:v1 
    livenessProbe: 
      initialDelaySeconds: 5 
      timeoutSeconds: 1 
      tcpSocket: 
        port: 80
复制代码
kubectl create -f live-tcp.yaml

 

启动、退出动作
复制代码
$ vim post.yaml
apiVersion: v1 
kind: Pod 
metadata: 
  name: lifecycle-demo 
spec: 
  containers: 
  - name: lifecycle-demo-container 
    image: nginx 
    lifecycle: 
      postStart: 
        exec: 
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"] 
      preStop: 
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStop handler > /usr/share/message"]
复制代码
kubectl create -f post.yaml

 

 

posted @   叮伱格斐呃  阅读(104)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
Live2D
欢迎阅读『k8s集群安装学习笔记二——资源清单』
点击右上角即可分享
微信分享提示