K8S Pod 简介

2019-03-12 container

K8S 中有各种各样的组件,对于容器来说 K8S 的最小单元由 Pod 进行组成,它封装了一个或多个应用程序的容器、存储资源、网络 IP 以及管理容器的选项。

简介

Pod 标示的是一个部署单元,可以理解为 K8S 中应用程序的单个实例,它可能由单个容器组成,也可能由少量紧密耦合并共享资源的容器组成。

创建 Pod

这里通过创建一个简单的 Alpine 服务为例,可以提前通过 docker pull alipine 下载镜像,然后创建 pod.yaml 文件。

apiVersion: v1
kind: Pod                   # 类别信息
metadata:                   # 基本信息
  namespace: demons
  name: foobar
  labels:
    os: alpine
spec:                       # 容器信息,可以包含多个容器
  containers:
  - name: hello
    image: alpine
    env:
    - name: Test
      value: "123456"
    resources:
      requests:
        cpu: 2
        memory: 1Gi
      limits:
        cpu: 2
        memory: 1Gi
    command: ["sh","-c","while true;do date;sleep 1;done"]

QoS

在资源配置可通过:A) requests 对资源基本保底要求;B) limits 可用资源上限。通过这两个配置,可隐式指定 QoS 的类型:

  • Guaranteed 优先级高,需要保证资源的配置。
  • Burstable 中等,希望有弹性能力的资源。
  • BestEffort 最低,尽力而为。

常用操作

如下是基本的操作。

----- 创建、删除Pod
# kubectl create -f pod.yaml
# kubectl delete -f pod.yaml

----- 当前状态信息
# kubectl get pods foobar

----- 描述信息
# kubectl describe pod foobar

Deployment

在早期版本使用 Replication Controller 对 Pod 副本数量进行管理,在新的版本中官方推荐使用 Deployment 来代替 RC 。相比来说,Deployment 拥有更加灵活强大的升级、回滚功能,并且支持滚动更新;在升级 Pod 时,只需要定义 Pod 的最终状态,K8S 会执行必要的操作,而 RC 要自己定义如何操作。

定义 deploy.yaml 配置文件。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: foobar
  labels:
    app: alpine
spec:
  replicas: 1                 # 副本数量
  selector:
    matchLabels:
      app: alpine
  template:
    metadata:
      labels:
        app: alpine
    spec:
      containers:
      - name: hello
        image: alpine         # 也可以通过URL/NAME:Tag方式指定
        ports:                # 暴露容器的2000端口
        - containerPort: 2000
        command: ["nc", "-lk", "-p", "2000"]

K8S 里的 Service 是用来访问 Pod 的,由于 Pod 可能被重启,重启之后 IP 就变了,而 Service 具有名字,可以直接通过名字来访问 Service 所代表的 Pod 。

同样,创建如下的 service.yaml 文件。

apiVersion: v1
kind: Service
metadata:
  name: foobar
spec:
  selector:
    app: alpine
  type: NodePort
  ports:
  - protocol: TCP
    port: 2000
    nodePort: 30000
----- 创建Deployment
# kubectl apply -f deploy.yaml
# kubectl get deployments foobar

----- 如果设置了多个副本,则不止创建Deployment资源,还包括ReplicaSet以及Pod对象
# kubectl get deployments
# kubectl get replicasets
# kubectl get pods --show-labels

其它

当测试时,还可以只启动 alpine 镜像,其中在 containers 可以增加如下配置。

command: ["/bin/sh", "-c", "sleep 60m"]

此时无法通过 kubectl attach POD-NAME -it 方式连接,需要修改为如下配置。

tty: true
stdin: true

注意,同样是在 containers 配置下,而且需要将 command 配置删除。

常用命令

----- 查看当前所有POD状态信息
# kubectl get pods

----- 确认某个Pod的具体失败原因
# kubectl describe pod alpine-96cdb678c-cm4l7

----- 查看、删除已经部署的容器
# kubectl get deployments
# kubectl delete deployment alpine-service

参考