2017-08-21 17:44:43 +08:00
<!DOCTYPE HTML>
< html lang = "zh-cn" >
< head >
< meta charset = "UTF-8" >
< meta content = "text/html; charset=utf-8" http-equiv = "Content-Type" >
< title > 2.2.1.1 Pod解析 · Kubernetes Handbook< / title >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" / >
< meta name = "description" content = "" >
< meta name = "generator" content = "GitBook 3.2.2" >
< meta name = "author" content = "Jimmy Song" >
< link rel = "stylesheet" href = "../gitbook/style.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-splitter/splitter.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-page-toc-button/plugin.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-image-captions/image-captions.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-page-footer-ex/style/plugin.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-search-plus/search.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-highlight/website.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-fontsettings/website.css" >
< meta name = "HandheldFriendly" content = "true" / >
< meta name = "viewport" content = "width=device-width, initial-scale=1, user-scalable=no" >
< meta name = "apple-mobile-web-app-capable" content = "yes" >
< meta name = "apple-mobile-web-app-status-bar-style" content = "black" >
< link rel = "apple-touch-icon-precomposed" sizes = "152x152" href = "../gitbook/images/apple-touch-icon-precomposed-152.png" >
< link rel = "shortcut icon" href = "../gitbook/images/favicon.ico" type = "image/x-icon" >
< link rel = "next" href = "node.html" / >
< link rel = "prev" href = "pod-overview.html" / >
< / head >
< body >
< div class = "book" >
< div class = "book-summary" >
< div id = "book-search-input" role = "search" >
< input type = "text" placeholder = "輸入並搜尋" / >
< / div >
< nav role = "navigation" >
< ul class = "summary" >
< li class = "chapter " data-level = "1.1" data-path = "../" >
< a href = "../" >
1. 前言
< / a >
< / li >
< li class = "chapter " data-level = "1.2" data-path = "./" >
< a href = "./" >
2. 概念原理
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.2.1" data-path = "concepts.html" >
< a href = "concepts.html" >
2.1 设计理念
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2" data-path = "objects.html" >
< a href = "objects.html" >
2.2 主要概念
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.2.2.1" data-path = "pod-overview.html" >
< a href = "pod-overview.html" >
2.2.1 Pod
< / a >
< ul class = "articles" >
< li class = "chapter active" data-level = "1.2.2.1.1" data-path = "pod.html" >
< a href = "pod.html" >
2.2.1.1 Pod解析
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.2.2.2" data-path = "node.html" >
< a href = "node.html" >
2.2.2 Node
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2.3" data-path = "namespace.html" >
< a href = "namespace.html" >
2.2.3 Namespace
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2.4" data-path = "service.html" >
< a href = "service.html" >
2.2.4 Service
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2.5" data-path = "volume.html" >
< a href = "volume.html" >
2.2.5 Volume和Persistent Volume
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2.6" data-path = "deployment.html" >
< a href = "deployment.html" >
2.2.6 Deployment
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2.7" data-path = "secret.html" >
< a href = "secret.html" >
2.2.7 Secret
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2.8" data-path = "statefulset.html" >
< a href = "statefulset.html" >
2.2.8 StatefulSet
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2.9" data-path = "daemonset.html" >
< a href = "daemonset.html" >
2.2.9 DaemonSet
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2.10" data-path = "serviceaccount.html" >
< a href = "serviceaccount.html" >
2.2.10 ServiceAccount
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2.11" data-path = "replicaset.html" >
< a href = "replicaset.html" >
2.2.11 ReplicationController和ReplicaSet
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2.12" data-path = "job.html" >
< a href = "job.html" >
2.2.12 Job
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2.13" data-path = "cronjob.html" >
< a href = "cronjob.html" >
2.2.13 CronJob
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2.14" data-path = "ingress.html" >
< a href = "ingress.html" >
2.2.14 Ingress
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2.15" data-path = "configmap.html" >
< a href = "configmap.html" >
2.2.15 ConfigMap
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2.16" data-path = "horizontal-pod-autoscaling.html" >
< a href = "horizontal-pod-autoscaling.html" >
2.2.16 Horizontal Pod Autoscaling
< / a >
< / li >
< li class = "chapter " data-level = "1.2.2.17" data-path = "label.html" >
< a href = "label.html" >
2.2.17 Label
< / a >
< / li >
< / ul >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.3" data-path = "../guide/" >
< a href = "../guide/" >
3. 用户指南
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.3.1" data-path = "../guide/resource-configuration.html" >
< a href = "../guide/resource-configuration.html" >
3.1 资源配置
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.3.1.1" data-path = "../guide/configure-liveness-readiness-probes.html" >
< a href = "../guide/configure-liveness-readiness-probes.html" >
3.1.1 配置Pod的liveness和readiness探针
< / a >
< / li >
< li class = "chapter " data-level = "1.3.1.2" data-path = "../guide/configure-pod-service-account.html" >
< a href = "../guide/configure-pod-service-account.html" >
3.1.2 配置Pod的Service Account
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.3.2" data-path = "../guide/command-usage.html" >
< a href = "../guide/command-usage.html" >
3.2 命令使用
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.3.2.1" data-path = "../guide/using-kubectl.html" >
< a href = "../guide/using-kubectl.html" >
3.2.1 使用kubectl
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.3.3" data-path = "../guide/cluster-management.html" >
< a href = "../guide/cluster-management.html" >
3.3 集群管理
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.3.3.1" data-path = "../guide/managing-tls-in-a-cluster.html" >
< a href = "../guide/managing-tls-in-a-cluster.html" >
3.3.1 管理集群中的TLS
< / a >
2017-08-21 18:44:34 +08:00
< / li >
< li class = "chapter " data-level = "1.3.3.2" data-path = "../guide/kubelet-authentication-authorization.html" >
< a href = "../guide/kubelet-authentication-authorization.html" >
3.3.2 kubelet的认证授权
< / a >
< / li >
< li class = "chapter " data-level = "1.3.3.3" data-path = "../guide/tls-bootstrapping.html" >
< a href = "../guide/tls-bootstrapping.html" >
3.3.3 TLS bootstrap
< / a >
2017-08-21 17:44:43 +08:00
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.3.4" data-path = "../guide/access-kubernetes-cluster.html" >
< a href = "../guide/access-kubernetes-cluster.html" >
3.4 访问 Kubernetes 集群
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.3.4.1" data-path = "../guide/access-cluster.html" >
< a href = "../guide/access-cluster.html" >
3.4.1 访问集群
< / a >
< / li >
< li class = "chapter " data-level = "1.3.4.2" data-path = "../guide/authenticate-across-clusters-kubeconfig.html" >
< a href = "../guide/authenticate-across-clusters-kubeconfig.html" >
3.4.2 使用 kubeconfig 文件配置跨集群认证
< / a >
< / li >
< li class = "chapter " data-level = "1.3.4.3" data-path = "../guide/connecting-to-applications-port-forward.html" >
< a href = "../guide/connecting-to-applications-port-forward.html" >
3.4.3 通过端口转发访问集群中的应用程序
< / a >
< / li >
< li class = "chapter " data-level = "1.3.4.4" data-path = "../guide/service-access-application-cluster.html" >
< a href = "../guide/service-access-application-cluster.html" >
3.4.4 使用 service 访问群集中的应用程序
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.3.5" data-path = "../guide/application-development-deployment-flow.html" >
< a href = "../guide/application-development-deployment-flow.html" >
3.5 在kubernetes中开发部署应用
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.3.5.1" data-path = "../guide/deploy-applications-in-kubernetes.html" >
< a href = "../guide/deploy-applications-in-kubernetes.html" >
3.5.1 适用于kubernetes的应用开发部署流程
< / a >
2017-08-21 18:44:34 +08:00
< / li >
< li class = "chapter " data-level = "1.3.5.2" data-path = "../guide/migrating-hadoop-yarn-to-kubernetes.html" >
< a href = "../guide/migrating-hadoop-yarn-to-kubernetes.html" >
3.5.2 迁移传统应用到kubernetes中——以Hadoop YARN为例
< / a >
2017-08-21 17:44:43 +08:00
< / li >
< / ul >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.4" data-path = "../practice/" >
< a href = "../practice/" >
4. 最佳实践
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.4.1" data-path = "../practice/install-kbernetes1.6-on-centos.html" >
< a href = "../practice/install-kbernetes1.6-on-centos.html" >
4.1 在CentOS上部署kubernetes1.6集群
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.4.1.1" data-path = "../practice/create-tls-and-secret-key.html" >
< a href = "../practice/create-tls-and-secret-key.html" >
4.1.1 创建TLS证书和秘钥
< / a >
< / li >
< li class = "chapter " data-level = "1.4.1.2" data-path = "../practice/create-kubeconfig.html" >
< a href = "../practice/create-kubeconfig.html" >
4.1.2 创建kubeconfig文件
< / a >
< / li >
< li class = "chapter " data-level = "1.4.1.3" data-path = "../practice/etcd-cluster-installation.html" >
< a href = "../practice/etcd-cluster-installation.html" >
4.1.3 创建高可用etcd集群
< / a >
< / li >
< li class = "chapter " data-level = "1.4.1.4" data-path = "../practice/kubectl-installation.html" >
< a href = "../practice/kubectl-installation.html" >
4.1.4 安装kubectl命令行工具
< / a >
< / li >
< li class = "chapter " data-level = "1.4.1.5" data-path = "../practice/master-installation.html" >
< a href = "../practice/master-installation.html" >
4.1.5 部署master节点
< / a >
< / li >
< li class = "chapter " data-level = "1.4.1.6" data-path = "../practice/node-installation.html" >
< a href = "../practice/node-installation.html" >
4.1.6 部署node节点
< / a >
< / li >
< li class = "chapter " data-level = "1.4.1.7" data-path = "../practice/kubedns-addon-installation.html" >
< a href = "../practice/kubedns-addon-installation.html" >
4.1.7 安装kubedns插件
< / a >
< / li >
< li class = "chapter " data-level = "1.4.1.8" data-path = "../practice/dashboard-addon-installation.html" >
< a href = "../practice/dashboard-addon-installation.html" >
4.1.8 安装dashboard插件
< / a >
< / li >
< li class = "chapter " data-level = "1.4.1.9" data-path = "../practice/heapster-addon-installation.html" >
< a href = "../practice/heapster-addon-installation.html" >
4.1.9 安装heapster插件
< / a >
< / li >
< li class = "chapter " data-level = "1.4.1.10" data-path = "../practice/efk-addon-installation.html" >
< a href = "../practice/efk-addon-installation.html" >
4.1.10 安装EFK插件
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.4.2" data-path = "../practice/service-discovery-and-loadbalancing.html" >
< a href = "../practice/service-discovery-and-loadbalancing.html" >
4.2 服务发现与负载均衡
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.4.2.1" data-path = "../practice/traefik-ingress-installation.html" >
< a href = "../practice/traefik-ingress-installation.html" >
4.2.1 安装Traefik ingress
< / a >
< / li >
< li class = "chapter " data-level = "1.4.2.2" data-path = "../practice/distributed-load-test.html" >
< a href = "../practice/distributed-load-test.html" >
4.2.2 分布式负载测试
< / a >
< / li >
< li class = "chapter " data-level = "1.4.2.3" data-path = "../practice/network-and-cluster-perfermance-test.html" >
< a href = "../practice/network-and-cluster-perfermance-test.html" >
4.2.3 网络和集群性能测试
< / a >
< / li >
< li class = "chapter " data-level = "1.4.2.4" data-path = "../practice/edge-node-configuration.html" >
< a href = "../practice/edge-node-configuration.html" >
4.2.4 边缘节点配置
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.4.3" data-path = "../practice/operation.html" >
< a href = "../practice/operation.html" >
4.3 运维管理
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.4.3.1" data-path = "../practice/service-rolling-update.html" >
< a href = "../practice/service-rolling-update.html" >
4.3.1 服务滚动升级
< / a >
< / li >
< li class = "chapter " data-level = "1.4.3.2" data-path = "../practice/app-log-collection.html" >
< a href = "../practice/app-log-collection.html" >
4.3.2 应用日志收集
< / a >
< / li >
< li class = "chapter " data-level = "1.4.3.3" data-path = "../practice/configuration-best-practice.html" >
< a href = "../practice/configuration-best-practice.html" >
4.3.3 配置最佳实践
< / a >
< / li >
< li class = "chapter " data-level = "1.4.3.4" data-path = "../practice/monitor.html" >
< a href = "../practice/monitor.html" >
4.3.4 集群及应用监控
< / a >
< / li >
< li class = "chapter " data-level = "1.4.3.5" data-path = "../practice/jenkins-ci-cd.html" >
< a href = "../practice/jenkins-ci-cd.html" >
4.3.5 使用Jenkins进行持续构建与发布
< / a >
< / li >
< li class = "chapter " data-level = "1.4.3.6" data-path = "../practice/data-persistence-problem.html" >
< a href = "../practice/data-persistence-problem.html" >
4.3.6 数据持久化问题
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.4.4" data-path = "../practice/storage.html" >
< a href = "../practice/storage.html" >
4.4 存储管理
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.4.4.1" data-path = "../practice/glusterfs.html" >
< a href = "../practice/glusterfs.html" >
4.4.1 GlusterFS
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.4.4.1.1" data-path = "../practice/using-glusterfs-for-persistent-storage.html" >
< a href = "../practice/using-glusterfs-for-persistent-storage.html" >
4.4.1.1 使用GlusterFS做持久化存储
< / a >
< / li >
< li class = "chapter " data-level = "1.4.4.1.2" data-path = "../practice/storage-for-containers-using-glusterfs-with-openshift.html" >
< a href = "../practice/storage-for-containers-using-glusterfs-with-openshift.html" >
4.4.1.2 在OpenShift中使用GlusterFS做持久化存储
< / a >
< / li >
< / ul >
< / li >
< / ul >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.5" data-path = "../usecases/" >
< a href = "../usecases/" >
5. 领域应用
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.5.1" data-path = "../usecases/microservices.html" >
< a href = "../usecases/microservices.html" >
5.1 微服务架构
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.5.1.1" data-path = "../usecases/istio.html" >
< a href = "../usecases/istio.html" >
5.1.1 Istio
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.5.1.1.1" data-path = "../usecases/istio-installation.html" >
< a href = "../usecases/istio-installation.html" >
5.1.1.1 安装istio
< / a >
< / li >
< li class = "chapter " data-level = "1.5.1.1.2" data-path = "../usecases/configuring-request-routing.html" >
< a href = "../usecases/configuring-request-routing.html" >
5.1.1.2 配置请求的路由规则
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.5.1.2" data-path = "../usecases/linkerd.html" >
< a href = "../usecases/linkerd.html" >
5.1.2 Linkerd
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.5.1.2.1" data-path = "../usecases/linkerd-user-guide.html" >
< a href = "../usecases/linkerd-user-guide.html" >
5.1.2.1 Linkerd 使用指南
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.5.1.3" data-path = "../usecases/service-discovery-in-microservices.html" >
< a href = "../usecases/service-discovery-in-microservices.html" >
5.1.3 微服务中的服务发现
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.5.2" data-path = "../usecases/big-data.html" >
< a href = "../usecases/big-data.html" >
5.2 大数据
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.5.2.1" data-path = "../usecases/spark-on-kubernetes.html" >
< a href = "../usecases/spark-on-kubernetes.html" >
5.2.1 Spark on Kubernetes
< / a >
< / li >
< / ul >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.6" data-path = "../develop/" >
< a href = "../develop/" >
6. 开发指南
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.6.1" data-path = "../develop/developing-environment.html" >
< a href = "../develop/developing-environment.html" >
6.1 开发环境搭建
< / a >
< / li >
< li class = "chapter " data-level = "1.6.2" data-path = "../develop/testing.html" >
< a href = "../develop/testing.html" >
6.2 单元测试和集成测试
< / a >
< / li >
< li class = "chapter " data-level = "1.6.3" data-path = "../develop/client-go-sample.html" >
< a href = "../develop/client-go-sample.html" >
6.3 client-go示例
< / a >
< / li >
< li class = "chapter " data-level = "1.6.4" data-path = "../develop/contribute.html" >
< a href = "../develop/contribute.html" >
6.4 社区贡献
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1.7" data-path = "../appendix/" >
< a href = "../appendix/" >
7. 附录
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.7.1" data-path = "../appendix/docker-best-practice.html" >
< a href = "../appendix/docker-best-practice.html" >
7.1 Docker最佳实践
< / a >
< / li >
< li class = "chapter " data-level = "1.7.2" data-path = "../appendix/issues.html" >
< a href = "../appendix/issues.html" >
7.2 问题记录
< / a >
< / li >
< li class = "chapter " data-level = "1.7.3" data-path = "../appendix/tricks.html" >
< a href = "../appendix/tricks.html" >
7.3 使用技巧
< / a >
< / li >
< / ul >
< / li >
< li class = "divider" > < / li >
< li >
< a href = "https://www.gitbook.com" target = "blank" class = "gitbook-link" >
本書使用 GitBook 釋出
< / a >
< / li >
< / ul >
< / nav >
< / div >
< div class = "book-body" >
< div class = "body-inner" >
< div class = "book-header" role = "navigation" >
<!-- Title -->
< h1 >
< i class = "fa fa-circle-o-notch fa-spin" > < / i >
< a href = ".." > 2.2.1.1 Pod解析< / a >
< / h1 >
< / div >
< div class = "page-wrapper" tabindex = "-1" role = "main" >
< div class = "page-inner" >
< div class = "search-plus" id = "book-search-results" >
< div class = "search-noresults" >
< section class = "normal markdown-section" >
< h1 id = "pod解析" > Pod解 析 < / h1 >
< p > Pod是 kubernetes中 可 以 创 建 的 最 小 部 署 单 元 。 < / p >
< p > V1 core版 本 的 Pod的 配 置 模 板 见 < a href = "../manifests/template/pod-v1-template.yaml" > Pod template< / a > 。 < / p >
< h2 id = "什么是pod?" > 什 么 是 Pod? < / h2 >
< p > Pod就 像 是 豌 豆 荚 一 样 , 它 由 一 个 或 者 多 个 容 器 组 成 ( 例 如 Docker容 器 ) , 它 们 共 享 容 器 存 储 、 网 络 和 容 器 运 行 配 置 项 。 Pod中 的 容 器 总 是 被 同 时 调 度 , 有 共 同 的 运 行 环 境 。 你 可 以 把 单 个 Pod想 象 成 是 运 行 独 立 应 用 的 “ 逻 辑 主 机 ” — — 其 中 运 行 着 一 个 或 者 多 个 紧 密 耦 合 的 应 用 容 器 — — 在 有 容 器 之 前 , 这 些 应 用 都 是 运 行 在 几 个 相 同 的 物 理 机 或 者 虚 拟 机 上 。 < / p >
< p > 尽 管 kubernetes支 持 多 种 容 器 运 行 时 , 但 是 docker依 然 是 最 常 用 的 运 行 时 环 境 , 我 们 可 以 使 用 docker的 术 语 和 规 则 来 定 义 Pod。 < / p >
< p > Pod中 共 享 的 环 境 包 括 Linux的 namespace, cgroup和 其 他 可 能 的 隔 绝 环 境 , 这 一 点 跟 docker容 器 一 致 。 在 Pod的 环 境 中 , 每 个 容 器 中 可 能 还 有 更 小 的 子 隔 离 环 境 。 < / p >
< p > Pod中 的 容 器 共 享 IP地 址 和 端 口 号 , 它 们 之 间 可 以 通 过 < code > localhost< / code > 互 相 发 现 。 它 们 之 间 可 以 通 过 进 程 间 通 信 , 例 如 < a href = "https://en.wikipedia.org/wiki/UNIX_System_V" target = "_blank" > SystemV< / a > 信 号 或 者 POSIX共 享 内 存 。 不 同 Pod之 间 的 容 器 具 有 不 同 的 IP地 址 , 不 能 直 接 通 过 IPC通 信 。 < / p >
< p > Pod中 的 容 器 也 有 访 问 共 享 volume的 权 限 , 这 些 volume会 被 定 义 成 pod的 一 部 分 并 挂 载 到 应 用 容 器 的 文 件 系 统 中 。 < / p >
< p > 根 据 docker的 结 构 , Pod中 的 容 器 共 享 namespace和 volume, 不 支 持 共 享 PID的 namespace。 < / p >
< p > 就 像 每 个 应 用 容 器 , pod被 认 为 是 临 时 ( 非 持 久 的 ) 实 体 。 在 Pod的 生 命 周 期 中 讨 论 过 , pod被 创 建 后 , 被 分 配 一 个 唯 一 的 UI( UID) , 调 度 到 节 点 上 , 并 一 致 维 持 期 望 的 状 态 知 道 被 终 结 ( 根 据 重 启 策 略 ) 或 者 被 删 除 。 如 果 node死 掉 了 , 分 配 到 了 这 个 node上 的 pod, 在 经 过 一 个 超 时 时 间 后 会 被 重 新 调 度 到 其 他 node节 点 上 。 一 个 给 定 的 pod( 如 UID定 义 的 ) 不 会 被 “ 重 新 调 度 ” 到 新 的 节 点 上 , 而 是 被 一 个 同 样 的 pod取 代 , 如 果 期 望 的 话 甚 至 可 以 是 相 同 的 名 字 , 但 是 会 有 一 个 新 的 UID( 查 看 replication controller获 取 详 情 ) 。 ( 未 来 , 一 个 更 高 级 别 的 API将 支 持 pod迁 移 ) 。 < / p >
< p > Volume跟 pod有 相 同 的 生 命 周 期 ( 当 其 UID存 在 的 时 候 ) 。 当 Pod因 为 某 种 原 因 被 删 除 或 者 被 新 创 建 的 相 同 的 Pod取 代 , 它 相 关 的 东 西 ( 例 如 volume) 也 会 被 销 毁 和 再 创 建 一 个 新 的 volume。 < / p >
< figure id = "fig1.2.2.1.1.1" > < img src = "../images/pod-overview.png" alt = "Pod示意图" > < figcaption > Figure: Pod示 意 图 < / figcaption > < / figure >
< p > < em > A multi-container pod that contains a file puller and a web server that uses a persistent volume for shared storage between the containers.< / em > < / p >
< h2 id = "pod的动机" > Pod的 动 机 < / h2 >
< h3 id = "管理" > 管 理 < / h3 >
< p > Pod是 一 个 服 务 的 多 个 进 程 的 聚 合 单 位 , pod提 供 这 种 模 型 能 够 简 化 应 用 部 署 管 理 , 通 过 提 供 一 个 更 高 级 别 的 抽 象 的 方 式 。 Pod作 为 一 个 独 立 的 部 署 单 位 , 支 持 横 向 扩 展 和 复 制 。 共 生 ( 协 同 调 度 ) , 命 运 共 同 体 ( 例 如 被 终 结 ) , 协 同 复 制 , 资 源 共 享 , 依 赖 管 理 , Pod都 会 自 动 的 为 容 器 处 理 这 些 问 题 。 < / p >
< h3 id = "资源共享和通信" > 资 源 共 享 和 通 信 < / h3 >
< p > Pod中 的 应 用 可 以 共 享 网 络 空 间 ( IP地 址 和 端 口 ) , 因 此 可 以 通 过 < code > localhost< / code > 互 相 发 现 。 因 此 , pod中 的 应 用 必 须 协 调 端 口 占 用 。 每 个 pod都 有 一 个 唯 一 的 IP地 址 , 跟 物 理 机 和 其 他 pod都 处 于 一 个 扁 平 的 网 络 空 间 中 , 它 们 之 间 可 以 直 接 连 通 。 < / p >
< p > Pod中 应 用 容 器 的 hostname被 被 设 置 成 Pod的 名 字 。 < / p >
< p > Pod中 的 应 用 容 器 可 以 共 享 volume。 Volume能 够 保 证 pod重 启 时 使 用 的 数 据 不 丢 失 。 < / p >
< h2 id = "pod的使用" > Pod的 使 用 < / h2 >
< p > Pod也 可 以 用 于 垂 直 应 用 栈 ( 例 如 LAMP) , 这 样 使 用 的 主 要 动 机 是 为 了 支 持 共 同 调 度 和 协 调 管 理 应 用 程 序 , 例 如 : < / p >
< ul >
< li > content management systems, file and data loaders, local cache managers, etc.< / li >
< li > log and checkpoint backup, compression, rotation, snapshotting, etc.< / li >
< li > data change watchers, log tailers, logging and monitoring adapters, event publishers, etc.< / li >
< li > proxies, bridges, and adapters< / li >
< li > controllers, managers, configurators, and updaters< / li >
< / ul >
< p > 通 常 单 个 pod中 不 会 同 时 运 行 一 个 应 用 的 多 个 实 例 。 < / p >
< p > 详 细 说 明 请 看 : < a href = "http://blog.kubernetes.io/2015/06/the-distributed-system-toolkit-patterns.html" target = "_blank" > The Distributed System ToolKit: Patterns for Composite Containers< / a > .< / p >
< h2 id = "其他替代选择" > 其 他 替 代 选 择 < / h2 >
< p > < strong > 为 什 么 不 直 接 在 一 个 容 器 中 运 行 多 个 应 用 程 序 呢 ? < / strong > < / p >
< ol >
< li > 透 明 。 让 Pod中 的 容 器 对 基 础 设 施 可 见 , 以 便 基 础 设 施 能 够 为 这 些 容 器 提 供 服 务 , 例 如 进 程 管 理 和 资 源 监 控 。 这 可 以 为 用 户 带 来 极 大 的 便 利 。 < / li >
< li > 解 耦 软 件 依 赖 。 每 个 容 器 都 可 以 进 行 版 本 管 理 , 独 立 的 编 译 和 发 布 。 未 来 kubernetes甚 至 可 能 支 持 单 个 容 器 的 在 线 升 级 。 < / li >
< li > 使 用 方 便 。 用 户 不 必 运 行 自 己 的 进 程 管 理 器 , 还 要 担 心 错 误 信 号 传 播 等 。 < / li >
< li > 效 率 。 因 为 由 基 础 架 构 提 供 更 多 的 职 责 , 所 以 容 器 可 以 变 得 更 加 轻 量 级 。 < / li >
< / ol >
< p > < strong > 为 什 么 不 支 持 容 器 的 亲 和 性 的 协 同 调 度 ? < / strong > < / p >
< p > 这 种 方 法 可 以 提 供 容 器 的 协 同 定 位 , 能 够 根 据 容 器 的 亲 和 性 进 行 调 度 , 但 是 无 法 实 现 使 用 pod带 来 的 大 部 分 好 处 , 例 如 资 源 共 享 , IPC, 保 持 状 态 一 致 性 和 简 化 管 理 等 。 < / p >
< h2 id = "pod的持久性(或者说缺乏持久性)" > Pod的 持 久 性 ( 或 者 说 缺 乏 持 久 性 ) < / h2 >
< p > Pod在 设 计 支 持 就 不 是 作 为 持 久 化 实 体 的 。 在 调 度 失 败 、 节 点 故 障 、 缺 少 资 源 或 者 节 点 维 护 的 状 态 下 都 会 死 掉 会 被 驱 逐 。 < / p >
< p > 通 常 , 用 户 不 需 要 手 动 直 接 创 建 Pod, 而 是 应 该 使 用 controller( 例 如 < a href = "deployment.html" > Deployments< / a > ) , 即 使 时 创 建 单 个 Pod的 情 况 下 。 Controller可 以 提 供 集 群 级 别 的 自 愈 功 能 、 复 制 和 升 级 管 理 。 < / p >
< p > The use of collective APIs as the primary user-facing primitive is relatively common among cluster scheduling systems, including < a href = "https://research.google.com/pubs/pub43438.html" target = "_blank" > Borg< / a > , < a href = "https://mesosphere.github.io/marathon/docs/rest-api.html" target = "_blank" > Marathon< / a > , < a href = "http://aurora.apache.org/documentation/latest/reference/configuration/#job-schema" target = "_blank" > Aurora< / a > , and < a href = "http://www.slideshare.net/Docker/aravindnarayanan-facebook140613153626phpapp02-37588997" target = "_blank" > Tupperware< / a > .< / p >
< p > Pod is exposed as a primitive in order to facilitate:< / p >
< ul >
< li > scheduler and controller pluggability< / li >
< li > support for pod-level operations without the need to " proxy" them via controller APIs< / li >
< li > decoupling of pod lifetime from controller lifetime, such as for bootstrapping< / li >
< li > decoupling of controllers and services — the endpoint controller just watches pods< / li >
< li > clean composition of Kubelet-level functionality with cluster-level functionality — Kubelet is effectively the " pod controller" < / li >
< li > high-availability applications, which will expect pods to be replaced in advance of their termination and certainly in advance of deletion, such as in the case of planned evictions, image prefetching, or live pod migration < a href = "http://issue.k8s.io/3949" target = "_blank" > #3949< / a > < / li >
< / ul >
< p > < a href = "statefulset.html" > StatefulSet< / a > controller( 目 前 还 是 beta状 态 ) 支 持 有 状 态 的 Pod。 在 1.4版 本 中 被 称 为 PetSet。 在 kubernetes之 前 的 版 本 中 创 建 有 状 态 pod的 最 佳 方 式 是 创 建 一 个 replica为 1的 replication controller。 < / p >
< h2 id = "pod的终止" > Pod的 终 止 < / h2 >
< p > 因 为 Pod作 为 在 集 群 的 节 点 上 运 行 的 进 程 , 所 以 在 不 再 需 要 的 时 候 能 够 优 雅 的 终 止 掉 是 十 分 必 要 的 ( 比 起 使 用 发 送 KILL信 号 这 种 暴 力 的 方 式 ) 。 用 户 需 要 能 够 放 松 删 除 请 求 , 并 且 知 道 它 们 何 时 会 被 终 止 , 是 否 被 正 确 的 删 除 。 用 户 想 终 止 程 序 时 发 送 删 除 pod的 请 求 , 在 pod可 以 被 强 制 删 除 前 会 有 一 个 优 雅 删 除 的 时 间 , 会 发 送 一 个 TERM请 求 到 每 个 容 器 的 主 进 程 。 一 旦 超 时 , 将 向 主 进 程 发 送 KILL信 号 并 从 API server中 删 除 。 如 果 kubelet或 者 container manager在 等 待 进 程 终 止 的 过 程 中 重 启 , 在 重 启 后 仍 然 会 重 试 完 整 的 优 雅 删 除 阶 段 。 < / p >
< p > 示 例 流 程 如 下 : < / p >
< ol >
< li > 用 户 发 送 删 除 pod的 命 令 , 默 认 优 雅 删 除 时 期 是 30秒 ; < / li >
< li > 在 Pod超 过 该 优 雅 删 除 期 限 后 API server就 会 更 新 Pod的 状 态 为 “ dead” ; < / li >
< li > 在 客 户 端 命 令 行 上 显 示 的 Pod状 态 为 “ terminating” ; < / li >
< li > 跟 第 三 步 同 时 , 当 kubelet发 现 pod被 标 记 为 “ terminating” 状 态 时 , 开 始 停 止 pod进 程 : < ol >
< li > 如 果 在 pod中 定 义 了 preStop hook, 在 停 止 pod前 会 被 调 用 。 如 果 在 优 雅 删 除 期 限 过 期 后 , preStop hook依 然 在 运 行 , 第 二 步 会 再 增 加 2秒 的 优 雅 时 间 ; < / li >
< li > 向 Pod中 的 进 程 发 送 TERM信 号 ; < / li >
< / ol >
< / li >
< li > 跟 第 三 步 同 时 , 该 Pod将 从 该 service的 端 点 列 表 中 删 除 , 不 再 是 replication controller的 一 部 分 。 关 闭 的 慢 的 pod将 继 续 处 理 load balancer转 发 的 流 量 ; < / li >
< li > 过 了 优 雅 周 期 后 , 将 向 Pod中 依 然 运 行 的 进 程 发 送 SIGKILL信 号 而 杀 掉 进 程 。 < / li >
< li > Kublete会 在 API server中 完 成 Pod的 的 删 除 , 通 过 将 优 雅 周 期 设 置 为 0( 立 即 删 除 ) 。 Pod在 API中 消 失 , 并 且 在 客 户 端 也 不 可 见 。 < / li >
< / ol >
< p > 删 除 优 雅 周 期 默 认 是 30秒 。 < code > kubectl delete< / code > 命 令 支 持 < code > — grace-period=< seconds> < / code > 选 项 , 允 许 用 户 设 置 自 己 的 优 雅 周 期 时 间 。 如 果 设 置 为 0将 强 制 删 除 pod。 在 kubectl> =1.5版 本 的 命 令 中 , 你 必 须 同 时 使 用 < code > --force< / code > 和 < code > --grace-period=0< / code > 来 强 制 删 除 pod。 < / p >
< h3 id = "强制删除pod" > 强 制 删 除 Pod< / h3 >
< p > Pod的 强 制 删 除 是 通 过 在 集 群 和 etcd中 将 其 定 义 为 删 除 状 态 。 当 执 行 强 制 删 除 命 令 时 , API server不 会 等 待 该 pod所 运 行 在 节 点 上 的 kubelet确 认 , 就 会 立 即 将 该 pod从 API server中 移 除 , 这 时 就 可 以 创 建 跟 原 pod同 名 的 pod了 。 这 时 , 在 节 点 上 的 pod会 被 立 即 设 置 为 terminating状 态 , 不 过 在 被 强 制 删 除 之 前 依 然 有 一 小 段 优 雅 删 除 周 期 。 < / p >
< p > 强 制 删 除 对 于 某 些 pod具 有 潜 在 危 险 性 , 请 谨 慎 使 用 。 使 用 StatefulSet pod的 情 况 下 , 请 参 考 删 除 StatefulSet中 的 pod文 章 。 < / p >
< h2 id = "pod中容器的特权模式" > Pod中 容 器 的 特 权 模 式 < / h2 >
< p > 从 kubernetes1.1版 本 开 始 , pod中 的 容 器 就 可 以 开 启 previleged模 式 , 在 容 器 定 义 文 件 的 < code > SecurityContext< / code > 下 使 用 < code > privileged< / code > flag。 这 在 使 用 linux的 网 络 操 作 和 访 问 设 备 的 能 力 时 是 很 用 的 。 同 时 开 启 的 特 权 模 式 的 Pod中 的 容 器 也 可 以 访 问 到 容 器 外 的 进 程 和 应 用 。 在 不 需 要 修 改 和 重 新 编 译 kubelet的 情 况 下 就 可 以 使 用 pod来 开 发 节 点 的 网 络 和 存 储 插 件 。 < / p >
< p > 如 果 master节 点 运 行 的 是 kuberentes1.1.或 更 高 版 本 , 而 node节 点 的 版 本 低 于 1.1版 本 , 则 API server将 也 可 以 接 受 新 的 特 权 模 式 的 pod, 但 是 无 法 启 动 , pod将 处 于 pending状 态 。 < / p >
< p > 执 行 < code > kubectl describe pod FooPodName< / code > , 可 以 看 到 为 什 么 pod处 于 pending状 态 。 输 出 的 event列 表 中 将 显 示 :
< code > Error validating pod " FooPodName" ." FooPodNamespace" from api, ignoring: spec.containers[0].securityContext.privileged: forbidden ' < *> (0xc2089d3248)true' < / code > < / p >
< p > 如 果 master节 点 的 版 本 低 于 1.1, 无 法 创 建 特 权 模 式 的 pod。 如 果 你 仍 然 试 图 去 创 建 的 话 , 你 得 到 如 下 错 误 : < / p >
< p > < code > The Pod " FooPodName" is invalid. spec.containers[0].securityContext.privileged: forbidden ' < *> (0xc20b222db0)true' < / code > < / p >
< h2 id = "api-object" > API Object< / h2 >
< p > Pod是 kubernetes REST API中 的 顶 级 资 源 类 型 。 < / p >
< p > 在 kuberentes1.6的 V1 core API版 本 中 的 Pod的 数 据 结 构 如 下 图 所 示 : < / p >
< figure id = "fig1.2.2.1.1.2" > < img src = "../images/kubernetes-pod-cheatsheet.png" alt = "Pod Cheatsheet" > < figcaption > Figure: Pod Cheatsheet< / figcaption > < / figure >
< footer class = "page-footer-ex" > < span class = "page-footer-ex-copyright" > for GitBook< / span >                       < span class = "page-footer-ex-footer-update" > update
2017-08-21 18:44:34 +08:00
2017-08-21 18:23:34
2017-08-21 17:44:43 +08:00
< / span > < / footer >
< / section >
< / div >
< div class = "search-results" >
< div class = "has-results" >
< h1 class = "search-results-title" > < span class = 'search-results-count' > < / span > results matching "< span class = 'search-query' > < / span > "< / h1 >
< ul class = "search-results-list" > < / ul >
< / div >
< div class = "no-results" >
< h1 class = "search-results-title" > No results matching "< span class = 'search-query' > < / span > "< / h1 >
< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
< a href = "pod-overview.html" class = "navigation navigation-prev " aria-label = "Previous page: 2.2.1 Pod" >
< i class = "fa fa-angle-left" > < / i >
< / a >
< a href = "node.html" class = "navigation navigation-next " aria-label = "Next page: 2.2.2 Node" >
< i class = "fa fa-angle-right" > < / i >
< / a >
< / div >
< script >
var gitbook = gitbook || [];
gitbook.push(function() {
2017-08-23 17:48:49 +08:00
gitbook.page.hasChanged({"page":{"title":"2.2.1.1 Pod解析","level":"1.2.2.1.1","depth":4,"next":{"title":"2.2.2 Node","level":"1.2.2.2","depth":3,"path":"concepts/node.md","ref":"concepts/node.md","articles":[]},"previous":{"title":"2.2.1 Pod","level":"1.2.2.1","depth":3,"path":"concepts/pod-overview.md","ref":"concepts/pod-overview.md","articles":[{"title":"2.2.1.1 Pod解析","level":"1.2.2.1.1","depth":4,"path":"concepts/pod.md","ref":"concepts/pod.md","articles":[]}]},"dir":"ltr"},"config":{"plugins":["github","codesnippet","splitter","page-toc-button","image-captions","page-footer-ex","editlink","-lunr","-search","search-plus"],"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"github":{"url":"https://github.com/rootsongjc/kubernetes-handbook"},"editlink":{"label":"编辑本页","multilingual":false,"base":"https://github.com/rootsongjc/kubernetes-handbook/blob/master/"},"page-footer-ex":{"copyright":"for GitBook","update_format":"YYYY-MM-DD HH:mm:ss","update_label":"update"},"splitter":{},"codesnippet":{},"fontsettings":{"theme":"white","family":"sans","size":2},"highlight":{},"page-toc-button":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false},"search-plus":{},"image-captions":{"variable_name":"_pictures"}},"page-footer-ex":{"copyright":"Jimmy Song","update_label":"最后更新:","update_format":"YYYY-MM-DD HH:mm:ss"},"theme":"default","author":"Jimmy Song","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{"_pictures":[{"backlink":"index.html#fig1.1.1","level":"1.1","list_caption":"Figure: wercker status","alt":"wercker status","nro":1,"url":"https://app.wercker.com/status/b8b69e593784e17ddcfd1286adfd8f3c/s/master","index":1,"caption_template":"Figure: _CAPTION_","label":"wercker status","attributes":{},"title":"wercker status","skip":false,"key":"1.1.1"},{"backlink":"concepts/index.html#fig1.2.1","level":"1.2","list_caption":"Figure: Borg架构","alt":"Borg架构","nro":2,"url":"../images/borg.png","index":1,"caption_template":"Figure: _CAPTION_","label":"Borg架构","attributes":{},"skip":false,"key":"1.2.1"},{"backlink":"concepts/index.html#fig1.2.2","level":"1.2","list_caption":"Figure: Kubernetes架构","alt":"Kubernetes架构","nro":3,"url":"../images/architecture.png","index":2,"caption_template":"Figure: _CAPTION_","label":"Kubernetes架构","attributes":{},"skip":false,"key":"1.2.2"},{"backlink":"concepts/index.html#fig1.2.3","level":"1.2","list_caption":"Figure: kubernetes整体架构示意图","alt":"kubernetes整体架构示意图","nro":4,"url":"../images/kubernetes-whole-arch.png","index":3,"caption_template":"Figure: _CAPTION_","label":"kubernetes整体架构示意图","attributes":{},"skip":false,"key":"1.2.3"},{"backlink":"concepts/index.html#fig1.2.4","level":"1.2","list_caption":"Figure: Kubernetes master架构示意图","alt":"Kubernetes master架构示意图","nro":5,"url":"../images/kubernetes-master-arch.png","index":4,"caption_template":"Figure: _CAPTION_","label":"Kubernetes master架构示意图","attributes":{},"skip":false,"key":"1.2.4"},{"backlink":"concepts/index.html#fig1.2.5","level":"1.2","list_caption":"Figure: kubernetes node架构示意图","alt":"kubernetes node架构示意图","nro":6,"url":"../images/kubernetes-node-arch.png","index":5,"caption_template":"Figure: _CAPTION_","label":"kubernetes node架构示意图","attributes":{},"skip":false,"key":"1.2.5"},{"backlink":"con
2017-08-21 17:44:43 +08:00
});
< / script >
< / div >
< script src = "../gitbook/gitbook.js" > < / script >
< script src = "../gitbook/theme.js" > < / script >
< script src = "../gitbook/gitbook-plugin-github/plugin.js" > < / script >
< script src = "../gitbook/gitbook-plugin-splitter/splitter.js" > < / script >
< script src = "../gitbook/gitbook-plugin-page-toc-button/plugin.js" > < / script >
< script src = "../gitbook/gitbook-plugin-editlink/plugin.js" > < / script >
< script src = "../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js" > < / script >
< script src = "../gitbook/gitbook-plugin-search-plus/search.js" > < / script >
< script src = "../gitbook/gitbook-plugin-sharing/buttons.js" > < / script >
< script src = "../gitbook/gitbook-plugin-fontsettings/fontsettings.js" > < / script >
< / body >
< / html >