1768 lines
91 KiB
HTML
1768 lines
91 KiB
HTML
|
|
||
|
<!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.2 Init容器 · 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.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 " data-level="1.2.2.1.1" data-path="pod.html">
|
||
|
|
||
|
<a href="pod.html">
|
||
|
|
||
|
|
||
|
2.2.1.1 Pod解析
|
||
|
|
||
|
</a>
|
||
|
|
||
|
|
||
|
|
||
|
</li>
|
||
|
|
||
|
<li class="chapter active" data-level="1.2.2.1.2" data-path="init-containers.html">
|
||
|
|
||
|
<a href="init-containers.html">
|
||
|
|
||
|
|
||
|
2.2.1.2 Init容器
|
||
|
|
||
|
</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>
|
||
|
|
||
|
|
||
|
|
||
|
</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>
|
||
|
|
||
|
|
||
|
|
||
|
</li>
|
||
|
|
||
|
<li class="chapter " data-level="1.3.3.4" data-path="../guide/kubectl-user-authentication-authorization.html">
|
||
|
|
||
|
<a href="../guide/kubectl-user-authentication-authorization.html">
|
||
|
|
||
|
|
||
|
3.3.4 kubectl的用户认证授权
|
||
|
|
||
|
</a>
|
||
|
|
||
|
|
||
|
|
||
|
</li>
|
||
|
|
||
|
<li class="chapter " data-level="1.3.3.5" data-path="../guide/rbac.html">
|
||
|
|
||
|
<a href="../guide/rbac.html">
|
||
|
|
||
|
|
||
|
3.3.5 RBAC——基于角色的访问控制
|
||
|
|
||
|
</a>
|
||
|
|
||
|
|
||
|
|
||
|
</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>
|
||
|
|
||
|
|
||
|
|
||
|
</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>
|
||
|
|
||
|
|
||
|
|
||
|
</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-standalone-on-kubernetes.html">
|
||
|
|
||
|
<a href="../usecases/spark-standalone-on-kubernetes.html">
|
||
|
|
||
|
|
||
|
5.2.1 Spark standalone on Kubernetes
|
||
|
|
||
|
</a>
|
||
|
|
||
|
|
||
|
|
||
|
</li>
|
||
|
|
||
|
<li class="chapter " data-level="1.5.2.2" data-path="../usecases/support-spark-natively-in-kubernetes.html">
|
||
|
|
||
|
<a href="../usecases/support-spark-natively-in-kubernetes.html">
|
||
|
|
||
|
|
||
|
5.2.2 运行支持kubernetes原生调度的Spark程序
|
||
|
|
||
|
</a>
|
||
|
|
||
|
|
||
|
|
||
|
</li>
|
||
|
|
||
|
|
||
|
</ul>
|
||
|
|
||
|
</li>
|
||
|
|
||
|
<li class="chapter " data-level="1.5.3" data-path="../usecases/serverless.html">
|
||
|
|
||
|
<a href="../usecases/serverless.html">
|
||
|
|
||
|
|
||
|
5.3 Serverless架构
|
||
|
|
||
|
</a>
|
||
|
|
||
|
|
||
|
|
||
|
</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.2 Init容器</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="init-容器">Init 容器</h1>
|
||
|
<p>该特性在 1.6 版本已经退出 beta 版本。Init 容器可以在 PodSpec 中同应用程序的 <code>containers</code> 数组一起来指定。 beta 注解的值将仍需保留,并覆盖 PodSpec 字段值。</p>
|
||
|
<p>本文讲解 Init 容器的基本概念,它是一种专用的容器,在应用程序容器启动之前运行,并包括一些应用镜像中不存在的实用工具和安装脚本。</p>
|
||
|
<h2 id="理解-init-容器">理解 Init 容器</h2>
|
||
|
<p><a href="https://kubernetes.io/docs/concepts/abstractions/pod/" target="_blank">Pod</a> 能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的 Init 容器。</p>
|
||
|
<p>Init 容器与普通的容器非常像,除了如下两点:</p>
|
||
|
<ul>
|
||
|
<li>Init 容器总是运行到成功完成为止。</li>
|
||
|
<li>每个 Init 容器都必须在下一个 Init 容器启动之前成功完成。</li>
|
||
|
</ul>
|
||
|
<p>如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 <code>restartPolicy</code> 为 Never,它不会重新启动。</p>
|
||
|
<p>指定容器为 Init 容器,在 PodSpec 中添加 <code>initContainers</code> 字段,以 <a href="https://kubernetes.io/docs/api-reference/v1.6/#container-v1-core" target="_blank">v1.Container</a> 类型对象的 JSON 数组的形式,还有 app 的 <code>containers</code> 数组。 Init 容器的状态在 <code>status.initContainerStatuses</code> 字段中以容器状态数组的格式返回(类似 <code>status.containerStatuses</code> 字段)。</p>
|
||
|
<h3 id="与普通容器的不同之处">与普通容器的不同之处</h3>
|
||
|
<p>Init 容器支持应用容器的全部字段和特性,包括资源限制、数据卷和安全设置。 然而,Init 容器对资源请求和限制的处理稍有不同,在下面 <a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/#resources" target="_blank">资源</a> 处有说明。 而且 Init 容器不支持 Readiness Probe,因为它们必须在 Pod 就绪之前运行完成。</p>
|
||
|
<p>如果为一个 Pod 指定了多个 Init 容器,那些容器会按顺序一次运行一个。 每个 Init 容器必须运行成功,下一个才能够运行。 当所有的 Init 容器运行完成时,Kubernetes 初始化 Pod 并像平常一样运行应用容器。</p>
|
||
|
<h2 id="init-容器能做什么?">Init 容器能做什么?</h2>
|
||
|
<p>因为 Init 容器具有与应用程序容器分离的单独镜像,所以它们的启动相关代码具有如下优势:</p>
|
||
|
<ul>
|
||
|
<li>它们可以包含并运行实用工具,但是出于安全考虑,是不建议在应用程序容器镜像中包含这些实用工具的。</li>
|
||
|
<li>它们可以包含使用工具和定制化代码来安装,但是不能出现在应用程序镜像中。例如,创建镜像没必要 <code>FROM</code> 另一个镜像,只需要在安装过程中使用类似 <code>sed</code>、 <code>awk</code>、 <code>python</code> 或 <code>dig</code> 这样的工具。</li>
|
||
|
<li>应用程序镜像可以分离出创建和部署的角色,而没有必要联合它们构建一个单独的镜像。</li>
|
||
|
<li>Init 容器使用 Linux Namespace,所以相对应用程序容器来说具有不同的文件系统视图。因此,它们能够具有访问 Secret 的权限,而应用程序容器则不能。</li>
|
||
|
<li>它们必须在应用程序容器启动之前运行完成,而应用程序容器是并行运行的,所以 Init 容器能够提供了一种简单的阻塞或延迟应用容器的启动的方法,直到满足了一组先决条件。</li>
|
||
|
</ul>
|
||
|
<h3 id="示例">示例</h3>
|
||
|
<p>下面是一些如何使用 Init 容器的想法:</p>
|
||
|
<ul>
|
||
|
<li><p>等待一个 Service 创建完成,通过类似如下 shell 命令:</p>
|
||
|
<pre><code> for i in {1..100}; do sleep 1; if dig myservice; then exit 0; fi; exit 1
|
||
|
</code></pre></li>
|
||
|
<li><p>将 Pod 注册到远程服务器,通过在命令中调用 API,类似如下:</p>
|
||
|
<pre><code> curl -X POST http://$MANAGEMENT_SERVICE_HOST:$MANAGEMENT_SERVICE_PORT/register -d 'instance=$(<POD_NAME>)&ip=$(<POD_IP>)'
|
||
|
</code></pre></li>
|
||
|
<li><p>在启动应用容器之前等一段时间,使用类似 <code>sleep 60</code> 的命令。</p>
|
||
|
</li>
|
||
|
<li><p>克隆 Git 仓库到数据卷。</p>
|
||
|
</li>
|
||
|
<li><p>将配置值放到配置文件中,运行模板工具为主应用容器动态地生成配置文件。例如,在配置文件中存放 POD_IP 值,并使用 Jinja 生成主应用配置文件。</p>
|
||
|
</li>
|
||
|
</ul>
|
||
|
<p>更多详细用法示例,可以在 <a href="https://kubernetes.io/docs/concepts/abstractions/controllers/statefulsets/" target="_blank">StatefulSet 文档</a> 和 <a href="https://kubernetes.io/docs/user-guide/production-pods.md#handling-initialization" target="_blank">生产环境 Pod 指南</a> 中找到。</p>
|
||
|
<h3 id="使用-init-容器">使用 Init 容器</h3>
|
||
|
<p>下面是 Kubernetes 1.5 版本 yaml 文件,展示了一个具有 2 个 Init 容器的简单 Pod。 第一个等待 <code>myservice</code> 启动,第二个等待 <code>mydb</code> 启动。 一旦这两个 Service 都启动完成,Pod 将开始启动。</p>
|
||
|
<pre><code class="lang-yaml"><span class="hljs-attr">apiVersion:</span> v1
|
||
|
<span class="hljs-attr">kind:</span> Pod
|
||
|
<span class="hljs-attr">metadata:</span>
|
||
|
<span class="hljs-attr"> name:</span> myapp-pod
|
||
|
<span class="hljs-attr"> labels:</span>
|
||
|
<span class="hljs-attr"> app:</span> myapp
|
||
|
<span class="hljs-attr"> annotations:</span>
|
||
|
pod.beta.kubernetes.io/init-containers: <span class="hljs-string">'[
|
||
|
{
|
||
|
"name": "init-myservice",
|
||
|
"image": "busybox",
|
||
|
"command": ["sh", "-c", "until nslookup myservice; do echo waiting for myservice; sleep 2; done;"]
|
||
|
},
|
||
|
{
|
||
|
"name": "init-mydb",
|
||
|
"image": "busybox",
|
||
|
"command": ["sh", "-c", "until nslookup mydb; do echo waiting for mydb; sleep 2; done;"]
|
||
|
}
|
||
|
]'</span>
|
||
|
<span class="hljs-attr">spec:</span>
|
||
|
<span class="hljs-attr"> containers:</span>
|
||
|
<span class="hljs-attr"> - name:</span> myapp-container
|
||
|
<span class="hljs-attr"> image:</span> busybox
|
||
|
<span class="hljs-attr"> command:</span> [<span class="hljs-string">'sh'</span>, <span class="hljs-string">'-c'</span>, <span class="hljs-string">'echo The app is running! && sleep 3600'</span>]
|
||
|
</code></pre>
|
||
|
<p>这是 Kubernetes 1.6 版本的新语法,尽管老的 annotation 语法仍然可以使用。我们已经把 Init 容器的声明移到 <code>spec</code> 中:</p>
|
||
|
<pre><code class="lang-yaml"><span class="hljs-attr">apiVersion:</span> v1
|
||
|
<span class="hljs-attr">kind:</span> Pod
|
||
|
<span class="hljs-attr">metadata:</span>
|
||
|
<span class="hljs-attr"> name:</span> myapp-pod
|
||
|
<span class="hljs-attr"> labels:</span>
|
||
|
<span class="hljs-attr"> app:</span> myapp
|
||
|
<span class="hljs-attr">spec:</span>
|
||
|
<span class="hljs-attr"> containers:</span>
|
||
|
<span class="hljs-attr"> - name:</span> myapp-container
|
||
|
<span class="hljs-attr"> image:</span> busybox
|
||
|
<span class="hljs-attr"> command:</span> [<span class="hljs-string">'sh'</span>, <span class="hljs-string">'-c'</span>, <span class="hljs-string">'echo The app is running! && sleep 3600'</span>]
|
||
|
<span class="hljs-attr"> initContainers:</span>
|
||
|
<span class="hljs-attr"> - name:</span> init-myservice
|
||
|
<span class="hljs-attr"> image:</span> busybox
|
||
|
<span class="hljs-attr"> command:</span> [<span class="hljs-string">'sh'</span>, <span class="hljs-string">'-c'</span>, <span class="hljs-string">'until nslookup myservice; do echo waiting for myservice; sleep 2; done;'</span>]
|
||
|
<span class="hljs-attr"> - name:</span> init-mydb
|
||
|
<span class="hljs-attr"> image:</span> busybox
|
||
|
<span class="hljs-attr"> command:</span> [<span class="hljs-string">'sh'</span>, <span class="hljs-string">'-c'</span>, <span class="hljs-string">'until nslookup mydb; do echo waiting for mydb; sleep 2; done;'</span>]
|
||
|
</code></pre>
|
||
|
<p>1.5 版本的语法在 1.6 版本仍然可以使用,但是我们推荐使用 1.6 版本的新语法。 在 Kubernetes 1.6 版本中,Init 容器在 API 中新建了一个字段。 虽然期望使用 beta 版本的 annotation,但在未来发行版将会被废弃掉。</p>
|
||
|
<p>下面的 yaml 文件展示了 <code>mydb</code> 和 <code>myservice</code> 两个 Service:</p>
|
||
|
<pre><code class="lang-yaml"><span class="hljs-attr">kind:</span> Service
|
||
|
<span class="hljs-attr">apiVersion:</span> v1
|
||
|
<span class="hljs-attr">metadata:</span>
|
||
|
<span class="hljs-attr"> name:</span> myservice
|
||
|
<span class="hljs-attr">spec:</span>
|
||
|
<span class="hljs-attr"> ports:</span>
|
||
|
<span class="hljs-attr"> - protocol:</span> TCP
|
||
|
<span class="hljs-attr"> port:</span> <span class="hljs-number">80</span>
|
||
|
<span class="hljs-attr"> targetPort:</span> <span class="hljs-number">9376</span>
|
||
|
<span class="hljs-meta">---</span>
|
||
|
<span class="hljs-attr">kind:</span> Service
|
||
|
<span class="hljs-attr">apiVersion:</span> v1
|
||
|
<span class="hljs-attr">metadata:</span>
|
||
|
<span class="hljs-attr"> name:</span> mydb
|
||
|
<span class="hljs-attr">spec:</span>
|
||
|
<span class="hljs-attr"> ports:</span>
|
||
|
<span class="hljs-attr"> - protocol:</span> TCP
|
||
|
<span class="hljs-attr"> port:</span> <span class="hljs-number">80</span>
|
||
|
<span class="hljs-attr"> targetPort:</span> <span class="hljs-number">9377</span>
|
||
|
</code></pre>
|
||
|
<p>这个 Pod 可以使用下面的命令进行启动和调试:</p>
|
||
|
<pre><code class="lang-bash">$ kubectl create <span class="hljs-_">-f</span> myapp.yaml
|
||
|
pod <span class="hljs-string">"myapp-pod"</span> created
|
||
|
$ kubectl get <span class="hljs-_">-f</span> myapp.yaml
|
||
|
NAME READY STATUS RESTARTS AGE
|
||
|
myapp-pod 0/1 Init:0/2 0 6m
|
||
|
$ kubectl describe <span class="hljs-_">-f</span> myapp.yaml
|
||
|
Name: myapp-pod
|
||
|
Namespace: default
|
||
|
[...]
|
||
|
Labels: app=myapp
|
||
|
Status: Pending
|
||
|
[...]
|
||
|
Init Containers:
|
||
|
init-myservice:
|
||
|
[...]
|
||
|
State: Running
|
||
|
[...]
|
||
|
init-mydb:
|
||
|
[...]
|
||
|
State: Waiting
|
||
|
Reason: PodInitializing
|
||
|
Ready: False
|
||
|
[...]
|
||
|
Containers:
|
||
|
myapp-container:
|
||
|
[...]
|
||
|
State: Waiting
|
||
|
Reason: PodInitializing
|
||
|
Ready: False
|
||
|
[...]
|
||
|
Events:
|
||
|
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
|
||
|
--------- -------- ----- ---- ------------- -------- ------ -------
|
||
|
16s 16s 1 {default-scheduler } Normal Scheduled Successfully assigned myapp-pod to 172.17.4.201
|
||
|
16s 16s 1 {kubelet 172.17.4.201} spec.initContainers{init-myservice} Normal Pulling pulling image <span class="hljs-string">"busybox"</span>
|
||
|
13s 13s 1 {kubelet 172.17.4.201} spec.initContainers{init-myservice} Normal Pulled Successfully pulled image <span class="hljs-string">"busybox"</span>
|
||
|
13s 13s 1 {kubelet 172.17.4.201} spec.initContainers{init-myservice} Normal Created Created container with docker id 5ced34a04634; Security:[seccomp=unconfined]
|
||
|
13s 13s 1 {kubelet 172.17.4.201} spec.initContainers{init-myservice} Normal Started Started container with docker id 5ced34a04634
|
||
|
$ kubectl logs myapp-pod -c init-myservice <span class="hljs-comment"># Inspect the first init container</span>
|
||
|
$ kubectl logs myapp-pod -c init-mydb <span class="hljs-comment"># Inspect the second init container</span>
|
||
|
</code></pre>
|
||
|
<p>一旦我们启动了 <code>mydb</code> 和 <code>myservice</code> 这两个 Service,我们能够看到 Init 容器完成,并且 <code>myapp-pod</code> 被创建:</p>
|
||
|
<pre><code class="lang-Bash">$ kubectl create <span class="hljs-_">-f</span> services.yaml
|
||
|
service <span class="hljs-string">"myservice"</span> created
|
||
|
service <span class="hljs-string">"mydb"</span> created
|
||
|
$ kubectl get <span class="hljs-_">-f</span> myapp.yaml
|
||
|
NAME READY STATUS RESTARTS AGE
|
||
|
myapp-pod 1/1 Running 0 9m
|
||
|
</code></pre>
|
||
|
<p>这个例子非常简单,但是应该能够为我们创建自己的 Init 容器提供一些启发。</p>
|
||
|
<h2 id="具体行为">具体行为</h2>
|
||
|
<p>在 Pod 启动过程中,Init 容器会按顺序在网络和数据卷初始化之后启动。 每个容器必须在下一个容器启动之前成功退出。 如果由于运行时或失败退出,导致容器启动失败,它会根据 Pod 的 <code>restartPolicy</code> 指定的策略进行重试。 然而,如果 Pod 的 <code>restartPolicy</code> 设置为 Always,Init 容器失败时会使用 <code>RestartPolicy</code> 策略。</p>
|
||
|
<p>在所有的 Init 容器没有成功之前,Pod 将不会变成 <code>Ready</code> 状态。 Init 容器的端口将不会在 Service 中进行聚集。 正在初始化中的 Pod 处于 <code>Pending</code> 状态,但应该会将条件 <code>Initializing</code> 设置为 true。</p>
|
||
|
<p>如果 Pod <a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/#pod-restart-reasons" target="_blank">重启</a>,所有 Init 容器必须重新执行。</p>
|
||
|
<p>对 Init 容器 spec 的修改,被限制在容器 image 字段中。 更改 Init 容器的 image 字段,等价于重启该 Pod。</p>
|
||
|
<p>因为 Init 容器可能会被重启、重试或者重新执行,所以 Init 容器的代码应该是幂等的。 特别地,被写到 <code>EmptyDirs</code> 中文件的代码,应该对输出文件可能已经存在做好准备。</p>
|
||
|
<p>Init 容器具有应用容器的所有字段。 除了 <code>readinessProbe</code>,因为 Init 容器无法定义不同于完成(completion)的就绪(readiness)的之外的其他状态。 这会在验证过程中强制执行。</p>
|
||
|
<p>在 Pod 上使用 <code>activeDeadlineSeconds</code>,在容器上使用 <code>livenessProbe</code>,这样能够避免 Init 容器一直失败。 这就为 Init 容器活跃设置了一个期限。</p>
|
||
|
<p>在 Pod 中的每个 app 和 Init 容器的名称必须唯一;与任何其它容器共享同一个名称,会在验证时抛出错误。</p>
|
||
|
<h3 id="资源">资源</h3>
|
||
|
<p>为 Init 容器指定顺序和执行逻辑,下面对资源使用的规则将被应用:</p>
|
||
|
<ul>
|
||
|
<li>在所有 Init 容器上定义的,任何特殊资源请求或限制的最大值,是 <em>有效初始请求/限制</em></li>
|
||
|
<li><p>Pod 对资源的有效请求/限制要高于:</p>
|
||
|
<ul>
|
||
|
<li>所有应用容器对某个资源的请求/限制之和</li>
|
||
|
<li>对某个资源的有效初始请求/限制</li>
|
||
|
</ul>
|
||
|
</li>
|
||
|
<li><p>基于有效请求/限制完成调度,这意味着 Init 容器能够为初始化预留资源,这些资源在 Pod 生命周期过程中并没有被使用。</p>
|
||
|
</li>
|
||
|
<li><p>Pod 的 <em>有效 QoS 层</em>,是 Init 容器和应用容器相同的 QoS 层。</p>
|
||
|
</li>
|
||
|
</ul>
|
||
|
<p>基于有效 Pod 请求和限制来应用配额和限制。 Pod 级别的 cgroups 是基于有效 Pod 请求和限制,和调度器相同。</p>
|
||
|
<h3 id="pod-重启的原因">Pod 重启的原因</h3>
|
||
|
<p>Pod 能够重启,会导致 Init 容器重新执行,主要有如下几个原因:</p>
|
||
|
<ul>
|
||
|
<li>用户更新 PodSpec 导致 Init 容器镜像发生改变。应用容器镜像的变更只会重启应用容器。</li>
|
||
|
<li>Pod 基础设施容器被重启。这不多见,但某些具有 root 权限可访问 Node 的人可能会这样做。</li>
|
||
|
<li>当 <code>restartPolicy</code> 设置为 Always,Pod 中所有容器会终止,强制重启,由于垃圾收集导致 Init 容器完成的记录丢失。</li>
|
||
|
</ul>
|
||
|
<h2 id="支持与兼容性">支持与兼容性</h2>
|
||
|
<p>Apiserver 版本为 1.6 或更高版本的集群,通过使用 <code>spec.initContainers</code> 字段来支持 Init 容器。 之前的版本可以使用 alpha 和 beta 注解支持 Init 容器。 <code>spec.initContainers</code> 字段也被加入到 alpha 和 beta 注解中,所以 Kubernetes 1.3.0 版本或更高版本可以执行 Init 容器,并且 1.6 版本的 apiserver 能够安全的回退到 1.5.x 版本,而不会使存在的已创建 Pod 失去 Init 容器的功能。</p>
|
||
|
<p>原文地址:<a href="https://k8smeetup.github.io/docs/concepts/workloads/pods/init-containers/" target="_blank">https://k8smeetup.github.io/docs/concepts/workloads/pods/init-containers/</a></p>
|
||
|
<p>译者:<a href="https://github.com/shirdrn" target="_blank">shirdrn</a> </p>
|
||
|
<footer class="page-footer-ex"> <span class="page-footer-ex-copyright">for GitBook</span>           <span class="page-footer-ex-footer-update">update
|
||
|
2017-08-31 23:26:43
|
||
|
</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.html" class="navigation navigation-prev " aria-label="Previous page: 2.2.1.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() {
|
||
|
gitbook.page.hasChanged({"page":{"title":"2.2.1.2 Init容器","level":"1.2.2.1.2","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.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":"concepts/index.html#fig1.2.1","level":"1.2","list_caption":"Figure: Borg架构","alt":"Borg架构","nro":1,"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":2,"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":3,"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":4,"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":5,"url":"../images/kubernetes-node-arch.png","index":5,"caption_template":"Figure: _CAPTION_","label":"kubernetes node架构示意图","attributes":{},"skip":false,"key":"1.2.5"},{"backlink":"concepts/index.html#fig1.2.6","level":"1.2","list_caption":"Figure: Kubernetes分层架构示意图","alt":"Kubernetes分层架构示意图","nro":6,"url":"../images/kubernetes-layers-arch.jpg","index":6,"caption_template":"Figure: _CAPTION_","label":"Kubernetes分层架构示意图","attributes":{},"skip":false,"key":"1.2.6"},{"backlink":"concepts/concepts.html#fig1.2.1.1","level":"1.2.1","list_caption":"Figure: 分层架构示意图","alt":"分层架构示意图","nro"
|
||
|
});
|
||
|
</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>
|
||
|
|