文档章节

Kubernetes(四) - Pod和Deployment

喵了_个咪
 喵了_个咪
发布于 06/11 10:43
字数 1682
阅读 261
收藏 4
点赞 0
评论 2

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"]      # 执行数据库初始化

© 著作权归作者所有

共有 人打赏支持
喵了_个咪
粉丝 235
博文 133
码字总数 173973
作品 4
杨浦
技术主管
加载中

评论(2)

暗夜在火星
暗夜在火星
喵咪一直在写文章,一直被推荐,赞!
紫薯和白薯
紫薯和白薯
拜读了, 好文章。 希望持续出
kubernetes 1.6版以上1.8版以下弹性伸缩HPA-Memory

一:前言 在kubernetes中,Pod是最基础的调度单位,多个pod 可以组成一个集合,这个集合向外提供服务。这时候,我们需要以下两种情形需要关注: 1)集合中的Pod可能会由于某种原因Fail,这时...

ximenghappy ⋅ 2017/12/04 ⋅ 0

Kubernetes 入门:运行无状态服务

本文以 ANOYI-BLOG 这个博客系统为例,演示在 Kubernetes 集群中运行无状态服务,以及相关命令的用法介绍。 先决条件 确保 kubernetes 集群处于运行状态 【Kubernetes 环境搭建 - MacOS】 输...

Anoyi ⋅ 05/09 ⋅ 0

伸缩APP-运行多个APP实例

原文地址:https://kubernetes.io/docs/tutorials/kubernetes-basics/scale-intro/ 目标: 使用kubectl扩展应用 在之前的单元里我们创建了一个Deployment,然后紧接着通过Service公开曝光了出...

趁你还年轻233 ⋅ 03/12 ⋅ 0

漫画 | 小黄人学 Kubernetes 对象

Kubernetes中是有很多积木(Building Blocks),比如object model,pod,rs,deployment,namespace之类,这些都是Kubernetes中很重要的东西,学习Kubernetes,这些基础必须要掌握理解。 Ku...

Docker ⋅ 02/17 ⋅ 0

Kubernetes 核心概念简介

Kubernets 中的Node, Pod,Replication Controller, Service 等都可以看作一种资源对象,这些资源几乎都可以通过使用Kubernetes提供的kubectl 工具执行增删改查,并将其保存在etcd中持久化储...

酥心糖 ⋅ 05/22 ⋅ 0

Kubernetes核心概念总结(转载)

转载一篇不错的文章:https://www.cnblogs.com/WayneZeng/p/7680597.html 1、基础架构 1.1 Master   Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd。...

yushanjin0767 ⋅ 05/29 ⋅ 0

K8S集群基于heapster的HPA测试

本文将介绍基于heapster获取metric的HPA配置。在开始之前,有必要先了解一下K8S的HPA特性。 1、HPA全称Horizontal Pod Autoscaling,即pod的水平自动扩展。 自动扩展主要分为两种,其一为水平...

ylw6006 ⋅ 05/08 ⋅ 0

client-go的使用及源码分析

本文个人博客地址:http://www.huweihuang.com/article/source-analysis/client-go-source-analysis/ 1. client-go简介 1.1 client-go说明 client-go是一个调用kubernetes集群资源对象API的客......

huwh_ ⋅ 2017/12/16 ⋅ 0

Kubernetes核心概念总结

1、基础架构 1.1 Master   Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd。     APIServer。APIServer负责对外提供RESTful的Kubernetes API服务...

zwqjoy ⋅ 2017/12/13 ⋅ 0

利用 Kubernetes Service 的 selector 无痛运维在线 pod

Kubernetes 有一个叫做 service 的功能,这个功能为 pod 提供负载均衡器的服务。当 pod 运行出现错误,或者停止工作的时候,有时候你想要从 service 上删除 pod 而不终止 pod。 Service&Endp...

Caicloud ⋅ 2016/10/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

浅谈springboot Web模式下的线程安全问题

我们在@RestController下,一般都是@AutoWired一些Service,由于这些Service都是单例,所以并不存在线程安全问题。 由于Controller本身是单例模式 (非线程安全的), 这意味着每个request过来,...

算法之名 ⋅ 今天 ⋅ 0

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部