[云原生专题-30]:K8S - 核心概念 - K8S服务的最小管理单元Pods(Scrum Team)与常见操作方法

Posted 文火冰糖的硅基工坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[云原生专题-30]:K8S - 核心概念 - K8S服务的最小管理单元Pods(Scrum Team)与常见操作方法相关的知识,希望对你有一定的参考价值。

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122794334  


目录

第1章 Pods概述

1.1 官网链接

1.2 什么是Pods

1.3 为什么需要Pods

1.4 Pods的本质是Scurm Team

1.5 Pods如何管理多个容器

1.6 由Pods组成的集群

1.7 Pods的状态与阶段

1.8 Pod中容器的状态

第2章 Pods管理的主要手段与方法

2.1 kubectl 命令行操作

2.2 yaml配置的方式操作

2.3 dashboard UI操作

第3章 Pods服务的主要操作方法

3.1 获取当前Pods服务

3.2 Pod的详细信息查询

3.3 创建新只有一个容器的Pod

3.4 创建新包含多个容器的Pod

3.5 命令方式进入Pods内部

3.6 Pod内部不同容器之间的相互访问

3.7 集群内部不同节点之间访问Pods

3.8 集群外部访问集群内部的Pods

3.9 删除Pods服务

第4章 Pod服务的主要优良特征


第1章 Pods概述

1.1 官网链接

Pods | Kuberneteshttps://kubernetes.io/zh/docs/concepts/workloads/pods/

1.2 什么是Pods

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算/应用单元。

Pod 是由一组(一个或多个) 容器组成; 这些容器共享存储、网络、以及怎样运行这些容器的声明。

Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行

Pod 所建模的是特定于应用的“逻辑主机”,其中包含一个或多个应用容器, 这些容器是相对紧密的耦合在一起的。

在非云环境中,在相同的物理机或虚拟机上运行的应用类似于在同一逻辑主机上运行的云应用。

Pod 的共享上下文包括一组 Linux 名字空间、控制组(cgroup)和可能一些其他的隔离 方面,即用来隔离 Docker 容器的技术。 在 Pod 的上下文中,每个独立的应用可能会进一步实施隔离。

1.3 为什么需要Pods

容器是微服务的最小管理单元,每个容器承载一个微服务,微服务通过IP:端口号提供对外的网络服务。

微服务的粒度太小,且每个微服务是相互独立的,然后,大多数应用中,多个紧密相关联的微服务组成一个整体,完成某种功能,因此,需要一种机制,把多个紧密相关联的微服务整合在一起,这些微服务是一起部署的,这就是Pods。

1.4 Pods的本质是Scurm Team

如果把每个微服务比成是敏捷团队的一个个开发程序员的话,那么Pod就是一个个敏捷团队Scurm Team。在端到端的软件开发中,Scurm Team作为一个整体,承担任务Task的开发 。

1.5 Pods如何管理多个容器

Pod 被设计成支持形成高内聚的微服务单元的多个协作过程(形式为容器)。

Pod 中的容器被自动安排到集群中的同一物理机或虚拟机上,并可以一起进行调度

容器之间可以共享资源和依赖、彼此通信、协调何时以及何种方式终止自身。

例如,你可能有一个容器,为共享卷中的文件提供 Web 服务器支持,以及一个单独的 “sidecar(挂斗)”容器负责从远端更新这些文件,如下图所示:

1.6 由Pods组成的集群

1.7 Pods的状态与阶段

1.8 Pod中容器的状态

第2章 Pods管理的主要手段与方法

2.1 kubectl 命令行操作

kubectl get pod

2.2 yaml配置的方式操作

(1)vi 创建配置文件xxx.yaml

(2)配置文件解读

# 声明api的版本。
apiVersion: v1
# kind代表资源的类型,资源是Pod。
kind: Pod
# 资源叫什么名字,是在其属性metadata里面的。
metadata:
  # 第一个属性name的值是nginx,即Pod的名字就叫做Nginx。
  name: nginx
  # 给Pod贴上了一个标签,标签是app: web,标签是有一定的作用的。
  labels:
    app: web
# spec是详细,详细里面定义了一个容器。
spec:
  # 定义一个容器,可以声明多个容器的。
  containers:
    # 容器的名称叫做nginx
    - name: nginx
      # 使用了什么镜像,可以使用官方公有的,也可以使用私有的。
      image: nginx:1.13
      # ports定义容器的端口。
      ports:
        # 容器的端口是80,如果容器有多个端口,可以在后面接着写一行即可。
        - containerPort: 80

(3)实施/应用配置文件

kubectl create -f xxx.yaml 
kubectl apply  -f xxx.yaml 

2.3 dashboard UI操作

本文以命令行操作为主,UI方式为辅。

第3章 Pods服务的主要操作方法

3.1 获取当前Pods服务

# 获取指定pod的部署信息
$ kubectl get pod nginx

# 获取默认名字空间的pods部署
$ kubectl get pods

# 显示详细详细
$ kubectl get pods -owide

# 获取所有名字空间的pods部署
$ kubectl get pods -A


# 获得当前已经创建的名字空间
$ kubectl  get ns
$ kubectl  get namespace

# 获取指定名字空间的pods部署
$ kubectl get pods --namespace xxxx
$ kubectl get pods -n xxx

3.2 Pod的详细信息查询

$ kubectl describe pod XXXX

3.3 创建新只有一个容器的Pod

创建Pods服务时,并不需要指定Pods部署在哪个Node上,K8S会自动选择一个Node部署Pods服务。

$ kubectl run xxxpod-name --image=yyy-image-name

xxxpod-name:pod的名字

yyy-image-name:容器镜像名称

如果本地无yyy-image-name,该名会自动从docker仓库中下载。

3.4 创建新包含多个容器的Pod

 (1)通过yaml文件

apiVersion: v1
kind: Pod
metadata:
  name: my-app
  labels:
    name: my-app
spec:
  containers:
  - name: tomcat
    image: tomcat:latest
    ports:
    - containerPort: 8080
  - name: mysql
    image: mysql:latest
    ports:
    - containerPort: 3306
  - name: mynginx
    image: nginx:latest
    ports:
    - containerPort: 80

在该pod中,包括三个容器镜像:tomcat, mysql,nginx

3.5 命令方式进入Pods内部

$ kubectl exec -it pod-name bash
$ kubectl exec -it nginx-pod -n xxx --/bin/bash
$ kubectl exec -it nginx-pod -n xxx --/bin/sh

3.6 Pod内部不同容器之间的相互访问

相当于传统的一个物理机内部不同线程或进程之间的网络访问,可以通过127.0.0.1:port来访问。

$ curl 127.0.0.0:port

3.7 集群内部不同节点之间访问Pods

相同于传统的不同物理机器的进程或线程之间的网络访问,可以Pod私有网络IP地址:port来访问。

$ curl ip-address:port

3.8 集群外部访问集群内部的Pods 

需要进行特定的端口映射,后续再继续讨论。

3.9 删除Pods服务

(1)通过kubectl delete删除指定Pod

# 默认名字空间
$ kubectl delete pod XXX

# 指定名字空间
$ kubectl delete pod XXX -n YYY

(2)通过kubectl delete批量删除全部Pod

$ kubectl delete pod --all

(3)根据配置文件的要求删除

$ kubectl delete -f xxx.yaml

第4章 Pod服务的主要优良特征

(1)自动Node节点选择

不需要创建者指定Pod部署在集群中的哪个节点上,K8S会根据当前部署的实际情况,自动选择部署Pod的节点。

(2)资源共享:IP和Volume

一个Pod里的多个容器可以看作一个逻辑的主机,可以共享的资源有:

  • 存储
  • IP网络
  • namespace,
  • cgroups
  • 或者其他的隔离资源。

多个容器共享同一个network namespace,由此在一个Pod里的多个容器共享Pod的IP和端口namespace,所以一个Pod内的多个容器之间可以通过localhost来进行通信,所需要注意的是不同容器要注意不要有端口冲突即可。不同的Pod有不同的IP,不同Pod内的多个容器之前通信,不可以使用IPC(如果没有特殊指定的话)通信,通常情况下使用Pod的IP进行通信。

k8s要求底层网络支持集群内任意两个pod直接的TCP/IP直接通信,这通常才有虚拟二层网络技术来实现,例如Flannel,Openswitch等。

一个Pod里的多个容器可以共享存储卷,这个存储卷会被定义为Pod的一部分,并且可以挂载到该Pod里的所有容器的文件系统上。

(3)自动重新部署

Pod属于生命周期比较短暂的组件,比如,当Pod所在节点发生故障,那么该节点上的Pod会被调度到其他节点,但需要注意的是,被重新调度的Pod是一个全新的Pod,跟之前的Pod没有半毛钱关系。

(4)平坦的网络

K8s集群中的所有Pod都在同一个共享网络地址空间中,也就是说每个Pod都可以通过其他Pod的IP地址来实现访问。


作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122794334

以上是关于[云原生专题-30]:K8S - 核心概念 - K8S服务的最小管理单元Pods(Scrum Team)与常见操作方法的主要内容,如果未能解决你的问题,请参考以下文章

[云原生专题-43]:K8S - 核心概念 - placeholder - 加密数据

[云原生专题-42]:K8S - 核心概念 - placeholder-有状态服务

[云原生专题-38]:K8S - 核心概念 - 存储抽象- 空间大小可配置的目录挂载PV+PVC

[云原生专题-40]:K8S - 核心概念 - 网络模型网络通信集群内负载均衡机制(重要重要重要)

[云原生专题-33]:K8S - 核心概念 - 服务Service管理服务发现负载均衡

[云原生专题-39]:K8S - 核心概念 - 存储抽象- pod配置文件的挂载ConfigMap