企业实战-Kubernetes(三)资源清单、Pod生命周期、控制器

本文详细介绍了Kubernetes中资源清单的创建与管理,包括Pod的生命周期,如init初始化容器、探针和重启策略。接着,讨论了不同类型的控制器,如RS、Deployment、DaemonSet、Job和CronJob,及其在Pod管理中的作用。
摘要由CSDN通过智能技术生成

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		      #查询帮助文档

创建pod目录

[root@server2 ~]# mkdir pod
[root@server2 ~]# cd pod/
[root@server2 ~]# kubectl get pod 
NAME                    READY   STATUS    RESTARTS   AGE
demo-5b4fc8bb88-h9cvt   1/1     Running   0          94m
demo-5b4fc8bb88-tvw5d   1/1     Running   0          94m
[root@server2 ~]# kubectl delete deployments.apps demo  #删掉不用的pod
[root@server2 ~]# kubectl run demo --image=myapp:v1     #重新创建pod,使用镜像为myapp,版本为v1

在这里插入图片描述
编写pod.yml文件

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
spec:
  containers:
  - name: myapp
    image: myapp:v1

在这里插入图片描述
应用yaml文件,创建pod

[root@server2 pod]# kubectl apply -f pod.yaml 
pod/pod-example created
[root@server2 pod]# kubectl get pod
NAME          READY   STATUS    RESTARTS   AGE
demo          1/1     Running   0          83m
pod-example   1/1     Running   0          11s

查看后发现生成pod-example
在这里插入图片描述

删除掉不需要的demo与pod-example。
注意!使用yml文件时一定要先删掉之前的pod再创建

[root@server2 pod]# kubectl delete pod demo 
pod "demo" deleted
[root@server2 pod]# kubectl delete pod pod-example
pod "pod-example" deleted

再次编辑yaml文件,容器增加为两个

[root@server2 pod]# vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
spec:
  containers:
  - name: myapp
    image: myapp:v1

  - name: busybox
    image: busyboxplus:latest
    tty: true
    stdin: true

在这里插入图片描述
应用后查看,发现有两个容器为ready状态

[root@server2 pod]# kubectl apply -f pod.yaml 
pod/pod-example created
[root@server2 pod]# kubectl get pod
NAME          READY   STATUS    RESTARTS   AGE
pod-example   2/2     Running   0          28s

在这里插入图片描述

查看pod的状态

[root@server2 pod]# kubectl get pod -o wide

在这里插入图片描述
进入busybox终端内,-c指定容器 、-i打开输入端口、-t打开伪终端

[root@server2 pod]# kubectl attach pod-example -c busybox -it
If you don't see a command prompt, try pressing enter.
/ # ip addr
/ # curl localhost
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

发现访问localhost成功,而busybox是没有80端口的,可见pod内的资源是共享的,访问到了同一pod内的myapp上的80端口。
在这里插入图片描述
删除掉已经存在的pod-example后再次编写文件

[root@server2 pod]# kubectl delete pod pod-example
[root@server2 pod]# vim pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
spec:
  containers:
  - name: myapp
    image: myapp:v1
    imagePullPolicy: IfNotPresent 
    #本地存在镜像,则不拉取;本地不存在镜像

  - name: busybox
    image: busyboxplus:latest
    imagePullPolicy: IfNotPresent
    tty: true
    stdin: true

在这里插入图片描述

使用资源清单设定监听端口

[root@server2 pod]# kubectl delete -f pod.yaml 
pod "pod-example" deleted
[root@server2 pod]# vim pod.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
spec:
  containers:
  - name: myapp
    image: myapp:v1
    imagePullPolicy: IfNotPresent
    #指定容器所在主机需要监听的端口号
    ports:
      - containerPort: 80
        hostPort: 80
[root@server2 pod]# kubectl apply -f pod.yaml 
pod/pod-example created

在这里插入图片描述
服务分到server3上,查看server3上的iptables策略
在这里插入图片描述
在这里插入图片描述

使用清单锁定IP

[root@server2 pod]# vim pod1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
spec:
  hostNetwork: true #使用主机ip
  containers:
  - name: myapp
    image: myapp:v1
[root@server2 pod]# kubectl apply -f pod1.yaml 
pod/pod-example created
[root@server2 pod]# kubectl get pod -o wide

在这里插入图片描述

使用清单限制内存和CPU

[root@server2 pod]# vi pod1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
spec:
  containers:
  - name: myapp
    image: myapp:v1
    imagePullPolicy: IfNotPresent 
    #如果本地存在镜像,则不拉取
    #本地不存在镜像,再拉取
    
# 限制内存和cpu使用量,requests为最低限制,limit为最高限制
    resources:
      requests:
        cpu: "100m"
        memory: "50Mi"
      limits:
        cpu: "200m"
        memory: "100Mi"

[root@server2 pod]# kubectl apply -f pod1.yaml 
pod/pod-example created

查看pod-example信息,发现关于内存与cpu的最大最小设置成功

[root@server2 pod]# kubectl describe pod pod-example

在这里插入图片描述

容器副本默认为退出后会自动重启, --restart=Never设置不重启,发现busybox容器副本不重启

kubectl run -it busybox --image=busyboxplus --restart=Never

在这里插入图片描述

2Pod生命周期

Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。

Init 容器与普通的容器非常像,除了如下两点:
1.它们总是运行到完成。
2.Init 容器必须在 Pod 就绪之前运行完成,每个 Init 容器必须运行成功,下一个才能够运行。
如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。

init初始化容器

初始化包括一些安装过程中应用容器中不存在的工具或服务,定义初始化服务后,必须要添加服务,初始化才能完成。

[root@server2 ~]# vim init.yml
[root@server2 ~]# cat init.yml
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busyboxplus
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busyboxplus
    command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
  - name: init-mydb
    image: busyboxplus
    command: ['sh', '-c', "until nslookup mydb.default.svc.cluster.local; do echo waiting for mydb; sleep 2; done"]

---
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376
---
apiVersion: v1
kind: Service
metadata:
  name: mydb
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9377

注释掉其中一个服务,初始化未成功,会不停重启进行初始化。

在这里插入图片描述
查看STATUS发现一直处于Init:0/2初始化中

[root@server2 pod]# vim pod1.yaml 
[root@server2 pod]# kubectl apply -f pod1.yaml 
pod/myapp-pod created
service/mydb created
[root@server2 pod]# kubectl get pod -w

在这里插入图片描述
将注释掉的服务打开,再次应用才会初始化成功.
STATUS已经变为running
在这里插入图片描述

查看容器解析
在这里插入图片描述

探针

探针包括下列三种:

  • livenessProbe:存活探针,jiance容器是否正在运行。若运行失败会杀掉失败进程,通过重启策略重新拉起容器并再次进行检测。默认开启。
  • readinessProbe:就绪探针,指示容器是否准备好服务请求。
  • startupProbe: 指示容器中的应用是否已经启动。
    由 kubelet 对容器执行的定期诊断

每次探测都将获得以下三种结果之一:
• 成功:容器通过了诊断。
• 失败:容器未通过诊断。
• 未知:诊断失败,因此不会采取任何行动。

vim svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysvc
spec:
  ports:

  - protocol: TCP
    port: 80
    targetPort: 80
      selector:
    app: nginx

vim pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: myapp
spec:
  #hostNetwork: true
  #nodeName: server4
  #imagePullSecrets: 
  containers:
  - name: myapp
    image: myapp:v1
    imagePullPolicy: IfNotPresent
    resources:
      requests:
        cpu: "100m"
        memory: "50Mi"
      limits:
        cpu: "200m"
        memory: "100Mi"
    livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 1
    readinessProbe:
      httpGet:
        path: /test.html
        port: 80
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 1

拉起容器查看标签
在这里插入图片描述
进入容器,添加测试页

kubectl exec pod-example -i -t -- sh

cd /usr/share/nginx/html/
echo www.westos.org > test.html

在这里插入图片描述

再次查看发现pod-example已经Ready
在这里插入图片描述
访问给定ip,访问到给定内容
在这里插入图片描述

重启策略

PodSpec 中有一个 restartPolicy 字段,可能的值为 Always、OnFailure 和Never。默认为 Always。

3控制器

Pod 的分类:

  • 自主式 Pod:Pod 退出后不会被创建
  • 控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目

控制器类型:

  • Replication Controller和ReplicaSet
  • Deployment
  • DaemonSet
  • StatefulSet
  • Job
  • CronJob
  • HPA全称Horizontal Pod Autoscaler

RS控制器

只控制副本,不能控制其他

[root@server2 pod]# vim rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-example
spec:
  replicas: 3  #副本数为3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: myapp:v1

[root@server2 pod]# kubectl apply -f rs.yaml 
replicaset.apps/replicaset-example configured
[root@server2 pod]# kubectl get pod

查看pod,副本数为3
在这里插入图片描述
查看具体ip
在这里插入图片描述
在这里插入图片描述
修改副本数为6并再次应用
在这里插入图片描述
查看标签为app=nginx
在这里插入图片描述
将第一个副本的标签改为app=myapp,再次查看标签后发现自动拉起一个副本标签为app=nginx,保持副本总数为6
在这里插入图片描述

此时删掉标签为app=myapp的副本,不影响其他六个副本
在这里插入图片描述

Deployment控制器

Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法。
典型的应用场景:

  • 用来创建Pod和ReplicaSet
  • 滚动更新和回滚
  • 扩容和缩容
  • 暂停与恢复
[root@server2 pod]# vim deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: myapp:v2
[root@server2 pod]# kubectl apply -f deployment.yaml 
[root@server2 pod]# kubectl get pod
[root@server2 pod]# kubectl get pod -o wide
[root@server2 pod]# curl 10.244.1.17

在这里插入图片描述

修改镜像为v1后

[root@server2 pod]# vim deployment.yaml 
        image: myapp:v1
[root@server2 pod]# kubectl apply -f deployment.yaml 
nginx-deployment-7ccb664b59   0         0         0       9m13s
nginx-deployment-c5fbbb494    3         3         3       5m15s

生成新的RS,同时旧的RS为了方便版本回滚也不会被删除

DaemonSet控制器

每个集群节点都需要创建,保证每个集群节点有且只有一个的操作。

[root@server2 pod]# vim daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-example
  labels:
    k8s-app: nginx
spec:
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
[root@server2 pod]# kubectl apply -f daemonset.yaml
[root@server2 pod]# kubectl get pod -o wide

在这里插入图片描述

job控制器

运行一次,运行完毕直接回收

[root@server2 pod]# vim job.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

[root@server2 pod]# kubectl apply -f job.yaml 

在这里插入图片描述
日志中查看
在这里插入图片描述

CronJob控制器

CronJob创建基于时间调度的 Jobs。

一个 CronJob 对象就像 crontab (cron table) 文件中的一行,它用 Cron
格式进行编写,并周期性地在给定的调度时间执行 Job。

[root@server2 pod]# vim cronjob.yaml 
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob-example
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cronjob
            image: busyboxplus
            args:
            - /bin/sh
            - -c
            - date; echo Hello from k8s cluster
          restartPolicy: OnFailure

[root@server2 pod]# kubectl apply -f cronjob.yaml 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热到想喝冰阔落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值