企业运维实战--k8s学习笔记2.pod管理、构建资源清单、pod生命周期详解、控制器详解


豌豆荚–pod简单管理

Pod好似一个豌豆荚,里面包含着一个或多个容器 。
本节通过命令学习管理pod。

创建pod应用,指定镜像为myapp:v1

kubectl run nginx --image=myapp:v1

查看节点信息

kubectl get pod

在这里插入图片描述

查看pod节点详细信息

kubectl describe pod nginx

在这里插入图片描述

获取节点和服务版本信息,并查看附加信息

kubectl get pod -o wide

在这里插入图片描述

配置分配网络信息所在目录查看

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

在这里插入图片描述
在这里插入图片描述

通过访问pod节点,测试

curl 10.244.1.2

在这里插入图片描述

删除pod节点

kubectl delete pod nginx
kubectl get pod

在这里插入图片描述

创建service,定义一个微服务
一个服务的多个pod逻辑合集,此时pod可以通过service的名称访问后端的两个容器。

kubectl create deployment demo --image=myapp:v1 --replicas=2
kubectl get pod

在这里插入图片描述

kubectl get pod -o wide

在这里插入图片描述

查看节点所信息

kubectl get all

在这里插入图片描述

删除任意一个pod节点会自动补充副本

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

在这里插入图片描述

暴露端口,使得外部可以访问到pod副本

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

在这里插入图片描述

测试通过ip访问容器,可以看到已经负载均衡了

curl 10.105.30.70/hostname.html

在这里插入图片描述
后端节点Endpoints信息查看
在这里插入图片描述

查看svc节点信息

kubectl describe svc demo

在这里插入图片描述

Pod扩容

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

在这里插入图片描述

kubectl describe svc demo

在这里插入图片描述

缩容

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

在这里插入图片描述

kubectl describe svc demo

在这里插入图片描述

更新pod镜像

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

在这里插入图片描述

查看更新版本

curl 10.244.1.12

在这里插入图片描述
更新后以前的rs不会消失,为了方便回滚

kubectl get all

在这里插入图片描述

查看版本迭代历史信息

kubectl rollout history deployment demo

在这里插入图片描述

回滚

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

在这里插入图片描述

查看rs信息

kubectl get rs

在这里插入图片描述

资源清单构建与应用

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

编辑清单,文件格式为.yaml

vim pod.yaml
cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
spec:
  containers:

  - name: myapp
    image: myapp:v1


在这里插入图片描述

此处的清单作用为创建名为pod-example的pod,选取镜像为myapp:v1

执行后,查看pod信息

kubectl apply -f pod.yaml
kubectl get pod

在这里插入图片描述

使用资源清单创建一个pod节点,包含myapp容器和busybox容器

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

# busybox需要打开输入端口并为其分配伪终端
  - name: busybox
    image: busyboxplus:latest
    tty: true
    stdin: true
kubectl describe pod pod-example
kubectl get pod -o wide

在这里插入图片描述
可以看到,pod-example中有两个容器处于READY状态。

进入busybox终端,-c指定容器 -i打开输入端口 -t打开伪终端

kubectl attach pod-example -c busybox -i -t #进入busybox终端 -c指定容器 -i打开输入端口 -t打开伪终端

在这里插入图片描述

终端内访问localhost

curl localhost

在这里插入图片描述

我们知道,localhost是访问本地标准80端口的一个域名,而busybox自身是不带localhost的访问的,但是此时我们却可以访问到pod另一个容器myapp的内容,说明pod节点内二者资源共享

退出后可继续进入,pod节点会重启。

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

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
spec:
  #hostNetwork: true
  #nodeName: server4
  #imagePullSecrets: 
  containers:
  - name: myapp
    image: myapp:v1
 #指定容器所在主机需要监听的端口号,设置了hostPort同一台主机无法启动该容器的相同副本,因为主机的端口号不能相同,会写到iptables中
    ports:
      - containerPort: 80
        hostPort: 80

按照清单拉起容器

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

在这里插入图片描述

可以看到节点分配到了server3上,server3中查看iptables策略

iptables -t nat -nL |grep :80

在这里插入图片描述

使用清单锁定IP(与主机共享)

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

kubectl get pod -o wide #查看podip

在这里插入图片描述
server3中查看端口
在这里插入图片描述

使用清单限制内存和CPU

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
spec:
  #hostNetwork: true
  #nodeName: server4
  #imagePullSecrets: 
  containers:
  - name: myapp
    image: myapp:v1
    imagePullPolicy: IfNotPresent ##如果本地存在镜像,则不拉取;本地不存在镜像,再拉取;默认会一直拉取镜像
    
# 限制内存和cpu使用量,requests为最低限制,limit为最高限制
    resources:
      requests:
        cpu: "100m"
        memory: "50Mi"
      limits:
        cpu: "200m"
        memory: "100Mi"
kubectl apply -f pod.yaml
kubectl describe pod pod-example

在这里插入图片描述

默认容器副本退出后会自动重启,这里可以设置不重启

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

在这里插入图片描述

使用后退出,该节点显示已完成,且不会自动重启

kubectl describe pod busybox

在这里插入图片描述

大致总结资源清单用法及各条语句的含义:

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
spec:
  #hostNetwork: true #
  #nodeName: server4 #锁定pod节点
  #imagePullSecrets: 
  containers:
  - name: myapp
    image: westos/game2048:latest
    imagePullPolicy: IfNotPresent ##如果本地存在镜像,则不拉取;本地不存在镜像,再拉取;默认会一直拉取镜像
    
# 限制内存和cpu使用量,requests为最低限制,limit为最高限制
    resources:
      requests:
        cpu: "100m"
        memory: "50Mi"
      limits:
        cpu: "200m"
        memory: "100Mi"
    #ports:
    #  - containerPort: 80 
    #    hostPort: 80 #指定容器所在主机需要监听的端口号,设置了hostPort同一台主机无法启动该容器的相同副本,因为主机的端口号不能相同,会写到iptables中
#  - name: busybox
#    image: busyboxplus:latest
#    imagePullPolicy: IfNotPresent #如果本地存在镜像,则不拉取;本地不存在镜像,再拉取;默认会一直拉取镜像
#    tty: true
#    stdin: true

标签:后续会学

Pod生命周期

Pod生命周期图:
在这里插入图片描述
Pod中可以包含多个容器。
在容器环境初始化完成之后,pod也可以有一个或多个先于容器启动的Init初始化容器。初始化容器之后,容器运行,在运行的过程做包含多个探针对容器进行探测监控。包括livenessProbe存活探针,readinessProbe:就绪探针等。

init初始化容器

初始化容器,在容器运行之前进行初始化,故初始化容器不包括readiness就绪探针。

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

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
---
apiVersion: v1
kind: Service
metadata:
  name: mydb
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9377

首先,注释掉一个服务,初始化未成功,会不停重启进行初始化。
在这里插入图片描述

在这里插入图片描述

添加所有完整的初始化服务之后,才会初始化成功,拉起容器。
在这里插入图片描述
在这里插入图片描述

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

探针

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

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

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

注意:当存活和就绪探针同时存在,但只有存活探针通过时,容器会运行,但只能内部运行,无法对外访问。只有两个探针都运行成功,才可以对外访问。

探针只会有三种结果反馈:
成功:容器通过诊断
失败:容器未通过诊断
未知:诊断过程失败,不会采取行动。

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

cat 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

拉起容器后查看标签
在这里插入图片描述

访问后依然失败,因为容器的nginx中没有test.html

进入容器,添加测试页

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

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

在这里插入图片描述

查看pod-example已READY

kubectl get pod -w

在这里插入图片描述

访问给定IP

kubectl get pod -o wide
curl 10.244.1.25/test.html

在这里插入图片描述

重启策略:

默认pod中副本down到后会重启,表现在PodSpec中有一个restartPolicy字段。

控制器

ReplicaSet–rs控制器

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

vim rs.yaml
cat rs.yaml

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

拉起容器,查看节点

kubectl apply -f rs.yaml
kubectl get pod

在这里插入图片描述

查看扩展信息和rs信息

kubectl get pod -o wide
kubectl get rs

在这里插入图片描述

查看节点标签

kubectl get pod --show-labels

在这里插入图片描述

覆盖节点标签,但不会影响原来的集群

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

在这里插入图片描述

kubectl get rs

在这里插入图片描述

删除节点不影响原来的rs控制器建立的容器

kubectl delete pod replicaset-example-9b9gz
kubectl get pod

在这里插入图片描述

回收所有节点

kubectl delete -f rs.yaml

deployments控制器

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

根据rs来方便回滚,一个版本对应一个rs

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: nginx

拉起容器,查看节点

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

在这里插入图片描述

可以看到rs和deployment都已创建

查看标签

kubectl get pod --show-labels

在这里插入图片描述

修改yaml文件,更新容器
vim deployment.yaml
在这里插入图片描述

kubectl apply -f deployment.yaml

查看更新过程

kubectl get pod
kubectl get pod --show-labels

在这里插入图片描述

查看rs,旧的rs不会被删掉,方便回滚。
所以一个rs节点对应一个版本。

kubectl get rs

DaemonSet控制器

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

cat daemonset.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-example
  labels:
    k8s-app: zabbix-agent
spec:
  selector:
    matchLabels:
      name: zabbix-agent
  template:
    metadata:
      labels:
        name: zabbix-agent
    spec:
      containers:
      - name: zabbix-agent
        image: zabbix/zabbix-agent

Job控制器

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

测试:计算Pi

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

计算结果位于日志中。

定时job

cat 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值