K8S的Pod资源和命令

发布时间 2023-10-08 15:42:16作者: 普里莫

K8S的Pod资源

资源清单写法

http://k8s.driverzeng.com/v1.19/

K8S命令

选项 作用
-n 指定名称空间
-f 指定资源清单
-o 指定输出格式
-c 指定连接 POD 中的容器
-w 动态查看,在查看日志或详细信息时

查看

1)查看资源
kubectl get 资源名

kubectl get namespace      // 列出所有的命名空间
kubectl get ns

kubectl get pod            // 查看默认命名空间下的资源
kubectl get pod -n my-namespace     // -n 查看指定的命名空间
kubectl get pod -l app=my-app       // -l 查看指定标签

kubectl get node            // 查看所有节点信息
kubectl get node -l environment=production   // 查看具有这个标签的节点
kubectl get node -o wide                     // 显示节点详细信息

kubectl get deployments      // 查看手动启动的容器

2) 查看pod指定格式信息
[root@master-1 ~]# kubectl get pod -o wide     // Pod 的广泛信息,包括名称、状态、IP 地址、节点、所属命名空间等
[root@master-1 ~]# kubectl get pod -o name     // 只显示 Pod 的名称
[root@master-1 ~]# kubectl get pod -o json     // 以 JSON 格式显示所有 Pod 的详细信息
[root@master-1 ~]# kubectl get pod -o yaml     // 以 YAML 格式显示所有 Pod 的详细信息

5)查看资源相信信息(排错)
kubectl describe 资源名
kubectl describe pod nginx-565785f75c-pqtxf    // 查看默认命名空间下的具体的这个资源的详细信息

6)查看日志
kubectl logs pod pod名字
kubectl logs nginx-565785f75c-pqtxf     // 查看默认pod下的资源日志
kubectl logs -n he nginx                // 查看he这个命名空间下的nginx资源的日志
kubectl logs -n he -f nginx             // -f 实时查看

创建

2)创建资源
kubectl create 资源名
kubectl create ns 名称空间名字

# 手动创建一个pod名叫nginx镜像为nginx:alpine
[root@master-1 ~]# kubectl create deployment nginx --image=nginx:alpine
# 创建一个名为 nginx10 的 Deployment,其中包含 10 个副本,并使用 nginx:alpine 镜像
[root@master-1 ~]# kubectl create deployment nginx10 --image=nginx:alpine --replicas=10

kubectl run
kubectl exec -it pod名字 /bin/bash      // 登录容器
[root@master-1 ~]# kubectl exec -it nginx2 -- /bin/sh
[root@master-1 ~]# kubectl exec -it nginx -c nginx1 -- /bin/sh

## 登录资源清单里不同的资源
kubectl exec -it pod -n wordpress wordpress-f5f9f7c97-f727h /bin/sh

标签

3)给资源打标签
kubectl label 资源名
kubectl label pod key=value
kubectl label node key=value

# 查看标签
kubectl get pod -n zls --show-labels

## 打标签(node)
[root@master-1 ~]# kubectl label node node-1 CPU=Xeon

## 打标签(pod)
[root@master-1 ~]# kubectl label pod nginx MEM=Kinston

## 删除标签
[root@master-1 ~]# kubectl label pod nginx MEM-

删除

4)删除资源
kubectl delete 资源名
kubectl delete ns 名称空间

# 删除不在从新拉起
kubectl delete -f /tmp/yyy.yaml             // 资源清单拉启的服务
kubectl delete deployments.apps nginx1      // 手动拉起的服务

pod沉浸式体验

[root@master-1 ~]# kubectl create deployment nginx --image=nginx:alpine
[root@master-1 ~]# kubectl create deployment nginx10 --image=nginx:alpine --replicas=10

## 查看pod指定格式信息
[root@master-1 ~]# kubectl get pod -o wide
[root@master-1 ~]# kubectl get pod -o name
[root@master-1 ~]# kubectl get pod -o json
[root@master-1 ~]# kubectl get pod -o yaml

[root@master-1 ~]# kubectl get pod nginx-565785f75c-7q7mw -o yaml

## 使用资源清单启动pod
[root@master-1 ~]# vim test_nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-test
  namespace: default
spec:
  containers:
  - image: nginx:alpine
    imagePullPolicy: IfNotPresent
    name: nginx-test
    
imagePullPolicy:镜像拉取策略:
Always:总是拉取镜像 nginx:latest
Never:永远不拉镜像
IfNotPresent:如果镜像在机器上不存在,则拉,否则不拉

## 如果配置发生变化,可以自动更新
[root@master-1 ~]# kubectl apply -f suibian.yaml
## 第二次运行,会报错,因为已经创建过了
[root@master-1 ~]# kubectl create -f suibian.yaml

apiVersion: "v1"                           // 接口
kind: "Pod"                                // 资源类型
metadata:                                  // 资源元数据定义
  name: nginx-pod                          // pod名字
  namespace: zls                           // 给pod启动在哪个名称空间
  labels:                                  // 打标签
    hht: 1cm                               // 标签名 key:value
spec:                                      // 定义pod中容器的内容
  containers:                              // 容器内容
  - image: nginx:1.20.2                    // 指定镜像名
    imagePullPolicy: IfNotPresent          // 镜像拉取规则
    name: nginx-container                  // 容器名
    
## 一个pod中启动多个容器
apiVersion : "v1"
kind : "Namespace"
metadata:
  name: zls

---
apiVersion: "v1"
kind: "Pod"
metadata:
  name: nginx-pod
  namespace: zls
  labels:
    hht: 1cm
spec:
  containers:
  - name: nginx-container
    image: nginx:1.20.2
    imagePullPolicy: IfNotPresent

  - name: busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['/bin/tail','-f','/etc/hosts']
    #command:
    #- tail
    #- -f
    #- /etc/hosts

k8s标签使用

## 查看标签
[root@master-1 ~]# kubectl get pod -n he --show-labels 
NAME    READY   STATUS    RESTARTS   AGE   LABELS
nginx   1/1     Running   0          62m   <none>

## 打标签(node)
[root@master-1 ~]# kubectl label node node-1 CPU=Xeon

## 打标签(pod)
[root@master-1 ~]# kubectl label pod -n he nginx cpu=Xeon
pod/nginx labeled
[root@master-1 ~]# kubectl get pod -n he --show-labels 
NAME    READY   STATUS    RESTARTS   AGE   LABELS
nginx   1/1     Running   0          66m   cpu=Xeon

# 打多个标签
[root@master-1 ~]# kubectl label pod -n he nginx app=nginx
pod/nginx labeled
[root@master-1 ~]# kubectl get pod -n he --show-labels 
NAME    READY   STATUS    RESTARTS   AGE   LABELS
nginx   1/1     Running   0          68m   app=nginx,cpu=Xeon

# 默认命名空间下的,打标签
[root@master-1 ~]# kubectl label pod nginx MEM=Kinston

## 使用资源清单打标签
metadata:
  labels:
    hht: 1cm
    
## 删除标签
[root@master-1 ~]# kubectl label pod nginx MEM-

## 根据标签找pod
[root@master-1 ~]# kubectl get pod -l app=nginx
NAME                     READY   STATUS    RESTARTS   AGE
nginx-565785f75c-pqtxf   1/1     Running   0          62m

## 根据标签删除
kubectl delete pod -l app=nginx2

重新认识POD

共享网络

image-20230920151129053

POD内的容器使用Container模式共享根容器的网络
容器看到的网络设备信息和根容器完全相同
POD内的多个容器可以使用localhost进行网络通讯
POD内的多个容器不能绑定相同的端口
POD的生命周期和根容器一样,如果根容器退出了,POD就退出了

# 测试一个pod中运行两个容器
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - image: nginx
    ports:
    - name: nginx1
      containerPort: 80
    imagePullPolicy: IfNotPresent
  containers:
  - image: nginx
    ports:
    - name: nginx2
      containerPort: 8080
    imagePullPolicy: IfNotPresent

## 指定pod启动在某个节点上
spec:
  nodeName: node-1   // 根据node名,启动pod   (二选一,俩都放上去就是,和)
  nodeSelector:      // 根据node标签,启动pod
    CPU: Xeon
  containers:
  - name: nginx-container
    image: nginx:alpine
    imagePullPolicy: IfNotPresent

  - name: busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['/bin/tail','-f','/etc/hosts']

共享存储(挂载)

image-20230920151757351

默认情况下一个POD内的容器文件系统是互相隔离的
如果想让一个POD容器共享文件那么只需要定义一个Volume,然后两个容器分别挂载到这个Volume中

hostPath:将容器中的目录挂载到宿主上指定的目录
emptyDir:在宿主机找个临时目录挂载,只为容器之间共享存储,无法数据持久化

## hostPath
apiVersion: "v1"
kind: "Pod"
metadata:
  name: nginx-pod
  labels:
    hht: 1cm
spec:
  volumes:
  - name: guazaidian
    hostPath:
      path: /data/test
  - name: dierguazaidian
    hostPath:
      path: /data/test2
  containers:
  - name: nginx-container
    image: nginx:alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: guazaidian
      mountPath: /var/log/nginx/

  - name: busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['/bin/tail','-f','/etc/hosts']
    volumeMounts:
    - name: guazaidian
      mountPath: /opt/test/

## emptyDir
apiVersion: "v1"
kind: "Pod"
metadata:
  name: nginx-pod
  labels:
    hht: 1cm
spec:
  volumes:
  - name: guazaidian
    hostPath:
      path: /data/test
  - name: dierguazaidian
    emptyDir: {}
  containers:
  - name: nginx-container
    image: nginx:alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: dierguazaidian
      mountPath: /var/log/nginx/
  - name: busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['/bin/tail','-f','/etc/hosts']
    volumeMounts:
    - name: dierguazaidian
      mountPath: /opt/test/

作业:
1)写一个启动MySQL资源清单
env -e
指定字符集,校验规则
2)wordpress
3)coreDNS

Pod对容器的封装和应用

第一种:全部放一个pod里

img

第二种:Wordpress和MySQL分开

img

那么如何扩容呢?如果第一种方案大家会发现没有办法很好的扩容,因为数据库和wordpress已经绑定成一个整体了,扩容wordpress就得扩容mysql。而第二种方案就要灵活的多。

img

POD的生命周期

img

initContainers 初始化容器

初始化容器是指,在主容器启动之前,我们可以让他做一些准备工作。
比如:
1.两个容器做了共享存储,那么我们可以让它先启动一个容器,来对目录进行更改用户和授权
2.容器需要连接数据库,那么可以让初始化容器检测数据库是否可以正常连接,如果可以再启动主容器

[root@master-1 nginx]# cat nginx.yaml 
apiVersion: "v1"
kind: "Pod"
metadata:
  name: nginx-67
spec:
  volumes:
  - name: guazai
    emptyDir: {}
  initContainers:
  - name: ches
    image: nginx:alpine
    imagePullPolicy: IfNotPresent
    args: ["/bin/sh", "-c", "echo k8s >> /usr/share/nginx/html/index.html"]
    volumeMounts:
    - name: guazai
      mountPath: /usr/share/nginx/html
  containers:
  - name: nginx-fw
    image: nginx:alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: guazai
      mountPath: /usr/share/nginx/html

hook 钩子

# 钩子位置
cpec > containers > lifecycle

PostStart:在容器启动创建后,立即执行,但时间不能太长,否则容器不会是running状态
exec:执行命令
httpGet:检测http
tcpSocket:检测端口

[root@master-1 nginx]# cat hook.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: myhook
spec:
  containers:
  - name: myhook01
    image: nginx:alpine
    imagePullPolicy: IfNotPresent
    lifecycle:
      postStart:
        exec:
          command:
            - "/bin/sh"
            - "-c"
            - "echo k8s postStart > /usr/share/nginx/html/index.html"

PreStop:在容器停止前,执行一些命令,主要用于优雅关闭程序
exec:执行命令
httpGet:检测http
tcpSocket:检测端口

[root@master-1 nginx]# cat hook2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: myhook02
spec:
  volumes:
  - name: test
    hostPath:
      path: /data/nginx
  containers:
  - name: myhook02
    image: nginx:alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: test
      mountPath: /usr/share/nginx/html/
    lifecycle:
      postStart:
        exec:
          command:
            - "/bin/sh"
            - "-c"
            - "echo k8s postStart > /usr/share/nginx/html/index.html"
      preStop:
        exec:
          command:
            - "/bin/sh"
            - "-c"
            - "echo bye > /usr/share/nginx/html/1.txt"

健康检查探针

# 探针位置
cpec > containers > livenessProbe

# 存活态探针(存活性探针):检测pod中容器的应用是否存活
exec:执行命令检测
httpGet:检测http
tcpSocket:检测端口

## exec
[root@master-1 nginx]# cat tan.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: liveness
  labels:
    name: liveness
spec:
  volumes:
    - name: test
      hostPath:
        path: /data/test
  containers:
    - name: liveness
      image: nginx:alpine
      imagePullPolicy: IfNotPresent
      volumeMounts:
      - name: test
        mountPath: /usr/share/nginx/html/
      lifecycle:
        postStart:
          exec:
            command:
              - "/bin/sh"
              - "-c"
              - "echo test liveness > /usr/share/nginx/html/index.html"
      livenessProbe:
        exec:
          command:
            - "/bin/sh"
            - "-c"
            - "cat /usr/share/nginx/html/index.html"
        initialDelaySeconds: 3
        periodSeconds: 1
## httpget
[root@master-1 nginx]# cat tan02.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: liveness
  labels:
    name: liveness
spec:
  volumes:
    - name: test
      hostPath:
        path: /data/test
  containers:
    - name: liveness
      image: nginx:alpine
      imagePullPolicy: IfNotPresent
      volumeMounts:
      - name: test
        mountPath: /usr/share/nginx/html/
      lifecycle:
        postStart:
          exec:
            command:
              - "/bin/sh"
              - "-c"
              - "echo test liveness > /usr/share/nginx/html/index.html"
      livenessProbe:
        httpGet:
          path: /
          port: 80
        initialDelaySeconds: 3
        periodSeconds: 1

就绪态探针

# 位置
cpec > containers > lifecycle

# 就绪态探针(就绪性探针):检测pod内容器应用是否都准备就绪,如果没有准备就绪,就不对外提供
服务(不开放流量)
exec:执行命令检测
httpGet:检测http
tcpSocket:检测端口

readinessProbe
initialDelaySeconds: 第一次执行探针需要在容器启动后等待的时候时间
periodSeconds: 容器启动后每隔多少秒执行一次存活探针
timeoutSeconds: 探针超时时间,默认1秒,最小1秒
successThreshold: 探针失败后最少连续探测成功多少次才被认定成功,默认1次,如果是liveness必须为1
failureThreshold: 探针成功后被视为失败的探测的最小连续失败次数。默认3次。最小值为1

# exec
[root@master-1 nginx]# cat hook.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: myhook
spec:
  containers:
  - name: myhook01
    image: nginx:alpine
    imagePullPolicy: IfNotPresent
    lifecycle:
      postStart:
        exec:
          command:
            - "/bin/sh"
            - "-c"
            - "echo k8s postStart > /usr/share/nginx/html/index.html"
    readinessProbe:
      exec:
        command:
        - "ls"
        - "/root"
      initialDelaySeconds: 1
      periodSeconds: 1
      timeoutSeconds: 1
      successThreshold: 1
      failureThreshold: 1

# http
[root@master-1 nginx]# cat hook.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: myhook
spec:
  containers:
  - name: myhook01
    image: nginx:alpine
    imagePullPolicy: IfNotPresent
    lifecycle:
      postStart:
        exec:
          command:
            - "/bin/sh"
            - "-c"
            - "echo k8s postStart > /usr/share/nginx/html/index.html"
    readinessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 1
      periodSeconds: 1
      timeoutSeconds: 1
      successThreshold: 1
      failureThreshold: 1

存活态探针测试(健康检查探针)

连接

image-20230921182359338

# 删除配置文件
root@wordpress-7897cdc46d-wm6mc:/var/www/html# rm -fr wp-config.php  

image-20230921192629375

过后会自动拉起

image-20230920182306171

clusterIP

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP

# 启动
kubectl apply -f service.yaml

# 查看
kubectl get service <service-name>
## 代码翻译
apiVersion: v1:指定 Kubernetes API 的版本为 v1。
kind: Service:指定要创建的资源类型为 Service。
metadata.name: my-service:指定该服务的名称为 "my-service"。
spec.selector.app: my-app:通过标签选择器指定将流量路由到带有标签 app: my-app 的 Pod 上。
spec.ports:指定要在服务上监听的端口和目标端口。
protocol: TCP:指定使用 TCP 协议进行通信。
port: 80:将服务暴露在集群内部的 80 端口上。
targetPort: 8080:将流量转发到后端 Pod 上的 8080 端口。
type: ClusterIP:指定服务的类型为 ClusterIP,这意味着服务只能在集群内部访问。

在pod前加一个clusterIP

[root@master-1 opt]# kubectl expose pod liveness-pod --port=80 --target-port=80 --type=ClusterIP

POD资源限制

apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: resource-demo
    image: nginx
    ports:
    - containerPort: 80
    resources:
      requests:
        memory: 50Mi
        cpu: 1500m
      limits:
        memory: 100Mi
        cpu: 200m

参数解释:
requests :节点所需的最小计算资源量,k8s调度的时候的依据值
limits :限制允许的最大计算资源量,真正的资源限制参数

数值的转换:
1 CPU = 1000m
0.5 CPU = 500m
1 Mib = 1024 Kib
1 MB = 1000 KB

# 宿主机上位置
/sys/fs/cgroup/cpu/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podd29f3eee_bf6a_4747_b3bf_c6f2bd5bf561.slice