企业入门实战--k8s之pod管理、构建资源清单、pod生命周期详解、控制器详解

pod简单管理

创建pod应用
查看ns

kubectl get namespaces

请添加图片描述
拉起一个名为demo的容器

kubectl run demo --image=myapp:v1

请添加图片描述
查看demo的描述

kubectl describe pod demo## 描述

请添加图片描述

查看开放的端口

kubectl get pod -o wide## 查看端口

请添加图片描述
curl 10.244.2.2 ##测试
请添加图片描述

删除pod

kubectl delete pod demo
kubectl get pod

请添加图片描述

创建service

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

请添加图片描述

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

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

请添加图片描述
暴露端口,使得外部可以访问到pod副本

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

请添加图片描述

curl 10.102.88.164/hostname.html ## 测试负载均衡

请添加图片描述
后端节点Endpoints信息查看
请添加图片描述
查看svc节点信息

kubectl describe svc demo

请添加图片描述
Pod中的副本扩容

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

请添加图片描述

kubectl describe svc demo

请添加图片描述

Pod中的副本缩容

kubectl scale deployment demo --replicas=2
kubectl get all
kubectl describe svc demo

请添加图片描述

更新pod镜像

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

请添加图片描述

回退pod镜像

kubectl rollout undo deployment demo --to-revision=1kubectl get pod
curl 10.102.88.164

请添加图片描述
查看rs信息

kubectl get rs

请添加图片描述

资源清单构建与应用

编辑清单,文件格式为.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: busybox:latest
    tty: true
    stdin: true

kubectl describe pod pod-example
kubectl get pod -o wide


在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述
使用资源清单设定监听端口

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

在这里插入图片描述
可以看到节点分配到了server4上,server4中查看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

在这里插入图片描述
server4中查看端口
在这里插入图片描述
使用清单限制内存和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

在这里插入图片描述
指定server安装

vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
#hostNetwork: true
nodeName: server3
#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 get pod
 kubectl get pod pod-example 
 kubectl describe pod pod-example

在这里插入图片描述

Pod生命周期

在这里插入图片描述

init初始化容器

Init 容器能做什么?
• Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化
代码。
• Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性
降低。
• 应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个
单独的应用镜像。
• Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器
可具有访问 Secrets 的权限,而应用容器不能够访问。
• 由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一
种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前
置条件满足,Pod内的所有的应用容器会并行启动。

 vim init.yaml
 apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox
command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do
echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busybox
command: ['sh', '-c', "until nslookup mydb.default.svc.cluster.local; do echo
waiting for mydb; sleep 2; done"]
---
apiVersion: v1
kubectl apply -f init.yaml
kubectl get pod -w
root@server2 pod]# kubectl run -i -t busybox --image=busybox --restart=Never
If you don't see a command prompt, try pressing enter.
/ # nslookup my.service.default.svc.cluster.local
Server: 10.96.0.10
Address: 10.96.0.10:53
探针
Kubelet 可以选择是否执行在容器上运行的三种探针执行和做出反应:
• livenessProbe:指示容器是否正在运行。如果存活探测失败,则 kubelet
会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探
针,则默认状态为 Success。
• readinessProbe:指示容器是否准备好服务请求。如果就绪探测失败,端
点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。
初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默
认状态为 Success。
• startupProbe: 指示容器中的应用是否已经启动。如果提供了启动探测
(startup probe),则禁用所有其他探测,直到它成功为止。如果启动探测
失败,kubelet 将杀死容器,容器服从其重启策略进行重启。如果容器没有
提供启动探测,则默认状态为成功Success。
vim pop.yaml
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

kubectl apply -f init.yaml
kubectl get pod -w
root@server2 pod]# kubectl run -i -t busybox --image=busybox --restart=Never
If you don't see a command prompt, try pressing enter.
/ # nslookup my.service.default.svc.cluster.local
Server: 10.96.0.10
Address: 10.96.0.10:53

在这里插入图片描述
在这里插入图片描述
探针
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.2.19/test.html

在这里插入图片描述

重启策略:

estartPolicy 默认为true

控制器

ReplicaSet–rs控制器

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

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


在这里插入图片描述

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

在这里插入图片描述
覆盖节点标签,但不会影响原来的集群

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

在这里插入图片描述
回收所有节点

kubectl delete -f rs.yaml

deployment

拉伸

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

在这里插入图片描述
查看标签

kubectl get pod --show-labels

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

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

拉起容器查看更新过程

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控制器

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

测试:

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

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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值