Kubernetes(四) - Pod和Deployment

简介: Kubernetes中有各种各样的组件,对于容器来说Kubernetes最小的单元是由Pod进行组成的,但是我们在使用过程中经常会使用到Deployment来部署我们的应用,其中究竟区别在哪里,我们今天就来一同探索 Kubernetes官方文档:https://kubernetes.

Kubernetes中有各种各样的组件,对于容器来说Kubernetes最小的单元是由Pod进行组成的,但是我们在使用过程中经常会使用到Deployment来部署我们的应用,其中究竟区别在哪里,我们今天就来一同探索


Kubernetes官方文档:https://kubernetes.io/docs/reference/

Kubernetes官方Git地址:https://github.com/kubernetes/kubernetes

PS:本系列中使用 KubernetesV1.8 RancherV1.6.14

1.Pod最小的单元

Pod封装了一个或多个应用程序的容器(比如nginx等),存储资源,唯一的网络IP以及管理容器的一些选项 Pod标示的是一个部署单元,可以理解为Kubernetes中的应用程序的单个实例,它可能由单个容器组成,也可能由少量紧密耦合并共享资源的容器组成。

如果多个容器在同一Pod下他们公用一个IP所以不能出现重复的端口号,比如在一个Pod下运行两个nginx就会有一个容器异常,一个Pod下的多个容器可以使用localhost来访问对方端口

应为Pod是最小的单元如果在Pod中容器出现异常终止了是不会重启,在实际使用场景下基本不会直接使用Pod而是使用Deployment部署自己的应用

例子:

> vim myapp-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']

> kubectl create -f myapp-pod.yaml
> kubectl get pod
NAME        READY     STATUS    RESTARTS   AGE
myapp-pod   1/1       Running   0          8s

可以在web页面中查看到具体的pod(UI上称为容器组)  查看日志可以看到  删除Pod

> kubectl delete -f myapp-pod.yaml
pod "myapp-pod" deleted

向上述所说的我们也可以在一个Pod下运行多个容器(注意不要端口冲突)

> vim nginx-mysql-pod.yaml
apiVersion: v1                          # api版本
kind: Pod                               # 组件类型
metadata:
  name: nginx-mysql-pod
  labels:                               # 标签
    app: nginx-mysql
spec:
  containers:
  - name: nginx                         # 名称
    image: nginx                        # image地址
  - name: mysql                         
    image: mysql                        
    env:                                # 环境变量
    - name: MYSQL_ROOT_PASSWORD
      value: mysql

> kubectl create -f nginx-mysql-pod.yaml
> kubectl get pod
NAME              READY     STATUS    RESTARTS   AGE
nginx-mysql-pod   2/2       Running   0          1m

在ui中就可以看到一个Pod下运行着两个容器

通过运行命令可以进入到那个容器的终端,这里选择mysql容器

这里系统没有curl这里安装好了curl访问本地80端口,能访问到nginx容器的内容(这里证明了在一个Pod下的网络是共享的)

2.Deployment部署

在早期版本使用Replication Controller对Pod副本数量进行管理,在新的版本中官方推荐使用Deployment来代替RC,Deployment相对RC有这些好处

  • Deployment拥有更加灵活强大的升级、回滚功能,并且支持滚动更新
  • 使用Deployment升级Pod只需要定义Pod的最终状态,k8s会为你执行必要的操作(RC要自己定义如何操作)

不管是RC还是Deployment解决的主要问题是,每个Pod都运行给定应用程序的单个实例。如果您想水平扩展应用程序(例如,运行多个同样的实例),则应该使用多个Pod。这里带来的Pod管理成本

> vim nginx-deployment.yaml

apiVersion: extensions/v1beta1                  # K8S对应的API版本
kind: Deployment                                # 对应的类型
metadata:
  name: nginx-deployment
  labels:
    name: nginx-deployment
spec:
  replicas: 1                                   # 镜像副本数量
  template:
    metadata:
      labels:                                   # 容器的标签 可和service关联
        app: nginx
    spec:
      containers:
        - name: nginx                          # 容器名和镜像
          image: nginx
          imagePullPolicy: Always

> kubectl create -f nginx-deployment.yaml
> kubectl get pod
NAME                                READY     STATUS    RESTARTS   AGE
nginx-deployment-68fcbc9696-tr5fm   1/1       Running   0          6s
nginx-mysql-pod                     2/2       Running   0          15m
> kubectl get deployment
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   1         1         1            1           2m

因为使用deployment会部署很多个Pod所以Pod的名字后面会带一串随机数避免重复

扩容

> kubectl scale deployment nginx-deployment --replicas=3
> kubectl get pod
NAME                                READY     STATUS    RESTARTS   AGE
nginx-deployment-68fcbc9696-9r4p8   1/1       Running   0          22s
nginx-deployment-68fcbc9696-lkff2   1/1       Running   0          22s
nginx-deployment-68fcbc9696-tr5fm   1/1       Running   0          5m
nginx-mysql-pod                     2/2       Running   0          21m

恢复一个

> kubectl scale deployment nginx-deployment --replicas=1
> kubectl get pod
NAME                                READY     STATUS    RESTARTS   AGE
nginx-deployment-68fcbc9696-tr5fm   1/1       Running   0          6m
nginx-mysql-pod                     2/2       Running   0          21m

最关键的功能就是可以弹性扩容根据CPU的占用率(需要结合资源限制一同使用),后面会进行实际演示

> kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=80

Deployment回保障你的容器的运行状态,如果删除Pod,Deployment会立即重启一个

> kubectl delete pod nginx-deployment-68fcbc9696-tr5fm
pod "nginx-deployment-68fcbc9696-tr5fm" deleted

> kubectl get pod
NAME                                READY     STATUS    RESTARTS   AGE
nginx-deployment-68fcbc9696-ndfzj   1/1       Running   0          12s
nginx-mysql-pod                     2/2       Running   0          32m

Deployment会配合RC调度启动新的Pod从而保障定量的Pod数量

3.环境变量配置和执行命令参数配置

3.1 环境变量配置

环境变量在上述使用多Pod的时候已经提到了,但是这里面有一个坑就是Value值不能数字开头,否则会报错无法创建,需要使用引号应用起来

> vim mysql-pod.yaml
apiVersion: v1                          # api版本
kind: Pod                               # 组件类型
metadata:
  name: mysql-pod
  labels:                               # 标签
    app: mysql
spec:
  containers:
  - name: mysql                         # 名称
    image: mysql                        # image地址
    env:                                # 环境变量
    - name: MYSQL_ROOT_PASSWORD
      value: "666666"

> kubectl create -f mysql-pod.yaml
Error from server (BadRequest): error when creating "mysql-pod.yaml": Pod in version "v1" cannot be handled as a Pod: v1.Pod: Spec: v1.PodSpec: Containers: []v1.Container: v1.Container: Env: []v1.EnvVar: v1.EnvVar: Value: ReadString: expects " or n,parsing 180 ...,"value":6... at {"apiVersion":"v1","kind":"Pod","metadata":{"labels":{"app":"mysql"},"name":"mysql-pod","namespace":"default"},"spec":{"containers":[{"env":[{"name":"MYSQL_ROOT_PASSWORD","value":666666}],"image":"mysql","name":"mysql"}]}}

# 修改
    env:                                # 环境变量
    - name: MYSQL_ROOT_PASSWORD
      value: "666666"

> kubectl create -f mysql-pod.yaml
pod "mysql-pod" created

> kubectl get pod
NAME                                READY     STATUS    RESTARTS   AGE
mysql-pod                           1/1       Running   0          12s
nginx-deployment-68fcbc9696-ndfzj   1/1       Running   0          10m
nginx-mysql-pod                     2/2       Running   0          42m

3.2 执行命令参数

我们在使用Docker的时候为了运行具体的程序一般会在Dockerfile中使用CMD预设好需要执行的命令,当然也可以在运行的时候替换为你希望执行的命名,比如之前我们运行的输出程序就使用了command执行我们希望的命令

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']

但是除了CMD的方式有很多复杂组件的Docker使用的是ENTRYPOINT的方式(使用sh文件接收参数运行复杂程序),这个使用又有一个坑,如果使用command配置参数会出现设置的参数无效(docker-composer是可以使用cmd来传参的),在这里需要使用args的方式指定参数,举个例子(以下例子无法正常运行只是展示):

apiVersion: extensions/v1beta1                  # K8S对应的API版本
kind: Deployment                                # 对应的类型
metadata:
  name: kong-deployment
  labels:
    name: kong-deployment
spec:
  replicas: 1                                   # 镜像副本数量
  template:
    metadata:
      labels:                                   # 容器的标签 可和service关联
        app: kong
    spec:
      containers:
        - name: kong                            # 容器名和镜像
          image: kong:0.11.2
          imagePullPolicy: Always
          args: ["kong","migrations","up"]      # 执行数据库初始化

本文转自开源中国-Kubernetes(四) - Pod和Deployment

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
711 25
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
665 12
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
402 1
【赵渝强老师】Kubernetes中Pod的基础容器
|
Kubernetes 应用服务中间件 nginx
【赵渝强老师】K8s中的Deployment控制器
Kubernetes中的Deployment用于部署无状态应用程序,管理Pod的数量、更新方式和资源限制。通过创建和管理ReplicaSet,Deployment可以实现Pod的自动扩缩容、滚动更新和回滚。本文介绍了Deployment的基本概念,并通过一个具体的示例演示了如何使用Deployment创建、更新和管理Pod。
428 1
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
500 1
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 "busybox-container" 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
381 1
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。
860 0
|
存储 Kubernetes NoSQL
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(六)
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(六)
426 0
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(六)
|
监控 应用服务中间件 nginx
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(五)
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(五)
391 0
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(五)

推荐镜像

更多