Kubernetes-pod管理、资源清单的使用、Pod生命周期、控制器

一. pod基本操作

首先确保k8s的部署成功!

kubectl get pod -n kube-system

都是running就代表成功/!
请添加图片描述

1.创建pod节点

运行镜像:myapp:v1,并查看节点信息!

kubectl run nginx --image=myapp:v1
kubectl get pod

请添加图片描述我们可以查看pod信息,可以看到信息中表示创建成功!

kubectl describe pod nginx

请添加图片描述

我们还可以查看pod 的附加信息!
可以看到比kubectl get pod 多了IP,NODE,NOMINATED NODE信息!

kubectl get pod -o wide

请添加图片描述

我们还可以在系统的目录下查看到分配的网络信息!

cd /var/run/flannel/
cat subnet.env

请添加图片描述

当然在server3,4上都可以看到!
请添加图片描述
测试:
访问pod生成的ip地址,我们可以看到myapp:v1的信息!

curl 10.244.1.2

请添加图片描述

2.删除pod

kubectl delete pod nginx
kubectl get pod

请添加图片描述

3.创建指定数量的pod

创建两个后端的容器,并访问生成的ip地址

kubectl create deployment demo --image=myapp:v1 --replicas=2
kubectl get pod -o wide
curl 10.244.1.3

请添加图片描述
查看标签,查看所有结点的信息
可以看到标签app=demo!!

kubectl get pod --show-labels
kubectl get all

请添加图片描述
请添加图片描述

若是删除pod节点中的任何一个,都会自动生成一个!如下图

kubectl get pod
kubectl delete pod demo-5b4fc8bb88-g8r58
kubectl get pod

请添加图片描述

4.暴露端口

将指定端口80暴露,使得外部可以访问:

kubectl expose deployment demo --port=80 --target-port=80
kubectl get all

请添加图片描述

可以看到生成了cluster ip如图的IP
访问这个IP,可以看到已经负载均衡了

curl 10.98.122.128/hostname.html

请添加图片描述

可以查看svc节点信息.
后端节点Endpoints:必须能看到生成的IP地址才能访问成功!

kubectl describe svc demo

请添加图片描述

但是我们kubectl get pod -o wide可以看到都是运行在server4上的!
我们将其中一个节点删掉,它会自动运行在server3上,如下图:

kubectl get pod -o wide
kubectl delete pod demo-5**********
kubectl get pod -o wide

请添加图片描述

当然看svc节点信息,后端节点Endpoints的IP也会发生变化!

kubectl describe svc demo

请添加图片描述
只要查看pod信息,节点信息都是running而且都是ready即表示成功!

kubectl get pod

请添加图片描述

5.Pod扩容

kubectl scale deployment demo --replicas=6 
kubectl get pod

我们可以看到现在的pod已经变成了6个节点!
请添加图片描述
查看svc节点信息,可以看到endpoints的IP地址也变为了6个!

kubectl describe svc demo

请添加图片描述

当然生成的6个pod节点也都是可以访问实现负载均衡的!
请添加图片描述

6.pod缩容

kubectl scale  deployment demo --replicas=2
kubectl get pod
kubectl get pod -o wide

请添加图片描述

7.更新pod镜像

我们刚才使用的镜像是myapp:v1,如果我们需要更新镜像为myapp:v2就可以如下操作:

kubectl set image deployment demo myapp=myapp:v2
kubectl get pod

我们可以看到kubectl get pod查看的时候,出现了terminationg状态,表示正在替换中,过一会就好了!
请添加图片描述

访问更新之后的IP

curl 10.244.1.7

请添加图片描述

更新后以前的rs不会消失,为了回滚更新!

kubectl get all

请添加图片描述

我们可以查看版本迭代的历史信息:

kubectl rollout history deployment demo

请添加图片描述

8.版本回滚

将版本返回第一个版本!

kubectl rollout undo deployment demo --to-revision=1
kubectl get pod -o wide

请添加图片描述
测试:访问一下IP

curl 10.244.27

可以看到版本变回了v1
请添加图片描述

我们查看rs信息,可以看到如下图
请添加图片描述

回滚之前是下图所示,说明版本更新和回退会在这两个rs中变化!请添加图片描述

二.资源清单

在我们的日常工作中,可能要重复简历或者对pod节点进行操作,如果一直使用命令行来实现的话是不高效的工作方法。
资源清单就好比shell脚本一样,会按照你的清单执行命令,相比较命令行更加方便,也易于修改。

1.生成模板

书写时候的查找方法,可以之直接通过explain一步一步查找参数内容用法

[root@server2 ~]# kubectl explain pod      ##查看pod所有参数,-required-带有required是必须存在的参数

请添加图片描述

直接打开一个已经有的deployment,然后生成相应的yaml文件

[root@server2 ~]# kubectl run demo --image=myapp:v1
[root@server2 ~]# kubectl get pod
[root@server2 ~]# kubectl get pod demo
[root@server2 ~]# kubectl get pod demo -o yaml   ##生成一个yaml文件

请添加图片描述

请添加图片描述

2.自主式Pod资源清单

编辑清单,文件格式为.yaml
创建名为pod-example的pod,选取镜像为myapp:v1

cd
mkdir pod
cd pod/
vim pod.yaml

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

  - name: myapp
    image: myapp:v1

请添加图片描述

请添加图片描述
执行清单,并查看pod信息!

kubectl apply -f pod.yaml
kubectl get pod

请添加图片描述

在sesrver1:
将busyboxplus镜像上传私有仓库:

docker tag busyboxplus:latest reg.westos.org/library/busyboxplus:latest
docker push reg.westos.org/library/busyboxplus:latest

请添加图片描述
将刚才的pod.yaml删除

[root@server2 ~]# kubectl delete -f pod.yml 

请添加图片描述
使用资源清单创建一个pod节点,包含myapp容器和busyboxplus容器为其分配伪终端

cat 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

请添加图片描述
应用pod.yaml文件,并查看信息!

kubectl apply -f pod.yaml
kubectl get pod

pod-example中有两个容器处于READY状态。
请添加图片描述
进入busybox终端,-c指定容器 -i打开输入端口 -t打开伪终端
终端内访问localhost

kubectl attach pod-example -c busybox -i -t 
ip addr
curl localhost

请添加图片描述

退出后可继续进入,pod节点会重启。
ctrl+d退出终端,但是再次查看可以看到还是running状态

kubectl get pod

请添加图片描述

删除pod.yaml节点

kubectl delete -f pod.yaml

请添加图片描述

默认值,IfNotPresent:本地有则使用本地镜像,不拉取

vim pod.yaml
imagePullPolicy: IfNotPresent

请添加图片描述

可以看到详细信息:直接创建,开启容器,没有拉取动作!

kubectl describe pod pod-example

请添加图片描述

3.设定监听端口

再次删除,重新修改文件内容:

指定容器所在主机需要监听的端口号,设置了hostPort同一台主机无法启动该容器的相同副本,因为主机的端口号不能相同,只会写到iptables中

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

    ports:
      - containerPort: 80
        hostPort: 80

请添加图片描述

运行清单
可以看到分配到了server3上,访问server3

kubectl apply -f pod.yaml
kubectl get pod -o wide

请添加图片描述

在server3上查看端口netstat -antlp没有80!
但是在路由策略里面有80!!

netstat -antlp
iptables -t nat -nL |grep :80

请添加图片描述

请添加图片描述

4.使用清单锁定IP

将前面的pod删掉修改文件:
kubectl delete pod.yaml
锁定为与主机共用ip:
hostNetwork: true

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
spec:
  hostNetwork: true #直接锁定为与主机共用ip
  containers:
  - name: myapp
    image: myapp:v1

请添加图片描述
查看podip,发现已经变为了server3的IP!!

kubectl apply -f pod.yaml
kubectl get pod -o wide #查看podip

请添加图片描述

到server3上查看端口80:
请添加图片描述

5.限制内存和CPU

删除pod节点修改文件:
限制内存和cpu使用量,requests为最低限制,limit为最高限制

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
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"

请添加图片描述

kubectl apply -f pod.yaml
kubectl describe pod pod-example

请添加图片描述

我们可以看到限制cpu的信息!
请添加图片描述

6.容器退出后不重启

前面我们说了,容器推出后,会自动重新!
我们现在加上参数–restart=Never实现退出后不重启

kubectl run -it busybox --image=busyboxplus --restart=Never
ip addr
退出
kubectl get pod

使用后退出,该节点显示已完成,且不会自动重启
状态处于0/1!!
请添加图片描述

不加参数就会重新启动容器:
删除刚才的容器busybox!重新创建容器,不加参数!

kubectl delete pod busybox
kubectl run -i -t busybox --image=busyboxplus
ip addr

kubectl get pod

请添加图片描述

重启成功!
请添加图片描述

删除busybox容器,删除pod节点
查看标签!

kubectl delete pod busbox
kubectl delete -f pod,yaml
kubectl get node --show-labels

请添加图片描述

请添加图片描述

7.锁定pod节点

锁定pod节点在server4上!

 #hostNetwork: true 
nodeName: server4 #锁定pod节点

请添加图片描述

kubectl apply -f pod.yaml
kubectl get pod -o wide

请添加图片描述

可以看到在节点server4上!
请添加图片描述

若是指定下载的仓库不是公开的就会报错!
我们先删除pod节点,重新修改文件:

image: westos/game2048:latest

请添加图片描述

在仓库中将westos设置为不公开!!
请添加图片描述

请添加图片描述

接着执行清单

kubectl apply -f pod.yaml
kubectl describe pod pod-example

请添加图片描述

都是报错信息!
请添加图片描述

删除pod节点

请添加图片描述

三.Pod生命周期

请添加图片描述

Pod中可以包含多个容器。
在容器环境初始化完成之后,pod也可以有一个或多个先于容器启动的Init初始化容器。初始化容器之后,容器运行。

先查看一下有无pod节点,有的话删掉!
请添加图片描述

1.init初始化容器

编写初始化文件
cd pod
vim init.yaml
内容如下:

vim init.yaml

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

请添加图片描述

执行初始化文件,删除svc中的demo
因为初始化需要时间,所以不会很快完成,需要等待!

kubectl get svc
kubectl delete svc demo
kubectl apply -f init.yaml

请添加图片描述

只有一个服务,初始化未成功,会不停重启进行初始化。
请添加图片描述

2.添加服务

我们在初始化文件中再多添加一个服务

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

请添加图片描述

kubectl get pod -w 可以查看执行的动态过程!
我这里有busbox,删掉它,因为没有用!
1/1表示初始化成功!

kubectl get pod
kubectl get pod -w
kubectl get pod

请添加图片描述
查看容器解析:

请添加图片描述

删除初始化:

kubectl delete -f init.yaml

请添加图片描述

四.探针

livenessProbe:存活探针,指示容器是否正在运行。如果为运行会杀掉失败进程,受到重启策略影响重新拉起容器进行检测。默认开启。

readinessProbe:就绪探针,指示容器是否准备好服务请求。

startupProbe: 指示容器中的应用是否已经启动。

1.存活探针

将文件前面修改的imgae镜像改回来!

vim pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:   ###添加标签!
    app: myapp
spec:
  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


请添加图片描述

请添加图片描述
运行pod文件,并查看pod状态

kubectl apply -f pod.yaml
kubectl get pod
kubectl describe pod pod-example

请添加图片描述

请添加图片描述
可以看到存活探针的信息:

请添加图片描述

2.就绪探针

删除pod节点,修改文件,加入就绪探针

vim pod.yaml

 readinessProbe:
      httpGet:
        path: /test.html
        port: 80
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 1

请添加图片描述
运行pod清单
请添加图片描述
访问生成的IP地址:

kubectl get pod -o wide
curl 10.244.1.16

请添加图片描述

3.添加标签将svc和pod联系

添加标签,通过标签将svc和pod联系起来,供外网访问。

vim svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysvc
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

请添加图片描述

请添加图片描述

执行svc.yaml清单,并查看mysvc的状态

kubectl apply -f svc.yaml
kubectl get svc
kubectl describe svc mysvc

请添加图片描述

但是可以看到endpoints还是没有就绪!
请添加图片描述

因为pod.yaml指定了文件为test.html
容器的nginx中没有test.html
进入容器,添加测试页

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

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

请添加图片描述

添加测试页之后。很快pod-example已READY状态!
查看状态并访问IP

kubectl get pod -w
kubectl get pod -o wide
curl 10.244.1.17/test.html

请添加图片描述
此时查看mysvc的详细信息,可以看到endpoints也出现了ip地址!

kubectl describe svc mysvc

请添加图片描述

当把nginx下的文件test.html删除掉之后,立马状态小时,且endpoints也不存在IP了!如下图::
请添加图片描述

请添加图片描述

请添加图片描述

五.控制器

1.ReplicaSet–rs控制器

rs控制器:控制副本,确定任何时间都有指定数量的Pod副本在运行,根据标签匹配。

cd pod
vim rs.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-example
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

请添加图片描述

执行清单rs.yaml

kubectl apply -f rs.yaml
kubectl get pod

请添加图片描述

将前面实验的pod-example节点删除掉
查看扩展信息和rs信息

kubectl delete pod pod-example
kubectl get pod -o wide
kubectl get rs

请添加图片描述

请添加图片描述
查看节点标签

kubectl get pod --show-labels

请添加图片描述

修改节点标签,–overwrite:覆盖节点标签

kubectl label pod replicaset-example-*** app=myapp --overwrite
kubectl get pod --show-labels

请添加图片描述
删除节点不影响原来的rs控制器建立的容器
下图出现6个节点是因为把rs文件的节点数replicas改为6了!

kubectl delete pod replicaset-example-****
kubectl get pod

请添加图片描述

2.deployments控制器

deployments控制器:用来创建pod和ReplicaSet,依靠标签显示,相比较rs可更新容器,可扩容,可暂停和恢复

cd 
cd 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:v1

请添加图片描述

请添加图片描述

将前面的rs.yaml删除,执行deployment.yaml

kubectl delete -f rs.yaml
kubectl apply -f deployment.yaml
kubectl get pod
kubectl get all

请添加图片描述

请添加图片描述

可以看到deployment已创建
请添加图片描述

2.1节点数增

修改yaml文件,更新容器
节点数增加为6个!

vim deployment.yaml
replicas: 6

请添加图片描述
和前面不一样,不需要删除deployment.yaml,再次运行清单deployment.yaml就可以更新!

kubectl apply -f deployment.yaml
kubectl get pod

请添加图片描述

查看标签

kubectl get pod --show-labels

请添加图片描述

2.2 更改标签:

kubectl label pod nginx-deloyment-****** app=myapp --overwrite

kubectl get pod --show-labels

请添加图片描述

标签已经改变!
请添加图片描述
删除其中一个节点,也会重新加载出来一个新的!
请添加图片描述

2.3 版本更新

修改文件deployment.yaml使得版本更新!

请添加图片描述

kubectl apply -f deployment.yaml
kubectl get pod -o wide
curl 10.244.2.23

请添加图片描述

2.4 版本回退

版本回滚:v1
请添加图片描述
可以看到访问的时候,版本是v1

kubectl apply -f deployment.yaml
kubectl get pod -o wide
curl 10.244.2.26
kubectl get rs

请添加图片描述

请添加图片描述

版本切换结构图示:

请添加图片描述

3.DaemonSet控制器

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

请添加图片描述

执行清单

kubectl apply -f daemonset.yaml
kun=bectl get pod -o wide

请添加图片描述
删除节点:

kubectl delete -f daemonset.yaml

请添加图片描述

4.Job控制器

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

请添加图片描述

在server1上拉取镜像perl.tar,并上传到私有仓库中!

请添加图片描述

执行清单job.yaml

kubectl apply -f job.yaml

请添加图片描述
我们可以看到pod节点先是运行之后又停止了!

请添加图片描述

我们可以查看日志:

kubectl logs pi-sd527

请添加图片描述

删除掉节点job.yaml
请添加图片描述

写一个定时清单:

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

请添加图片描述
执行定时清单,并查看节点和日志::

kubectl apply -f cronjob.yaml
kubectl get pod
kubectl logs cronjob-example-****

请添加图片描述

我们可以看到过60s,就会再次执行,创建一个节点!
请添加图片描述

完成之后,删除cronjob.yaml清单即可!

请添加图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dudududu--

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

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

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

打赏作者

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

抵扣说明:

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

余额充值