├── .gitignore ├── 000-About_This_Doc.md ├── 002-whatisk8s.md ├── 003-Creating_Kubernetes_Clusters.md ├── 004-Local-machine Solutions.md ├── 005-Local_Docker-based.md ├── 006-Vagrant.md ├── 007-Local_No-VM.md ├── 008-Hosted_Solution-Google_Container_Engine.md ├── 009-Turn-key Cloud Solutions.md ├── 010-GCE.md ├── 011-AWS.md ├── 012-Azure.md ├── 014-scratch.md ├── 015-AWS or GCE.md ├── 016-AWS or Joyent.md ├── 017-Racksepce.md ├── 019-CloudStack.md ├── 020-VMware.md ├── 021-juju.md ├── 022-libvirt_CoreOS.md ├── 023-oVirt.md ├── 024-libvirt or KVM.md ├── 025-Offline.md ├── 027-fedora_single_node.md ├── 029-centos_manual_config.md ├── 030-ubuntu.md ├── 031-docker-multinode.md ├── 032-memsos.md ├── 033-Overview and Concepts.md ├── 034-Architecture.md ├── 035-Pods.md ├── 036-Labels and Selectors.md ├── 037-Replication Controller.md ├── 038-Services.md ├── 039-Volumes.md ├── 040-Secrets.md ├── 041-Names.md ├── 042-Namespaces.md ├── 043-Annotations.md ├── 044-Overview and Concepts.md ├── 045-Quick_Walkthrough_Basics_Tutorials.md ├── 048-Configuring Containers.md ├── 049-Managing_Applications-Deploying_continuously_running_applications.md ├── 050-Managing_Applications-Connecting_applications.md ├── 051-Working with Containers.md ├── 052-Kubernetes_User_Guide-Managing_Applications-Managing_deployments.md ├── 054-Web Interface.md ├── 057-Container_Access_exec.md ├── 058-Connect with Proxies.md ├── 059-Connect with Port Forwarding.md ├── 060-Overview and Concepts.md ├── 061-Planning and Designing.md ├── 062-Security.md ├── 063-Access Management.md ├── 064-Namespaces.md ├── 065-Administering Clusters.md ├── 066-kube-apiserver Binary.md ├── 067-Authorization.md ├── 068-Authentication.md ├── 069-Accessing the API.md ├── 070-Admission Controllers.md ├── 071-Administrating Service Accounts.md ├── 073-kube-scheduler Binary.md ├── 079-networkingmd.md ├── 090-Logging.md ├── 092-Kubernetes 101.md ├── 093-Kubernetes 201.md ├── 095-Apache Cassandra Database.md ├── 096-Spark example.md ├── 097-Apache Storm.md ├── 098-Distributed Task Queue.md ├── 099-Hazelcast.md ├── 099-cloud_native_deployments_of_hazelcast_using_kubernetes.md ├── 100-Meteor_Applications.md ├── 109-Getting started with config files.md ├── 110-Environment Guide Example.md ├── 111-Downward API example.md ├── 114-Running your first containers in Kubernetes.md ├── 115-Kubernetes DNS example.md ├── 127-Exploring Pods.md ├── 128-Updating Live Pods.md ├── 129-api_basicsmd.md ├── 132-working_with_resourcesmd.md ├── 133-kubernetes_api_referencemd.md ├── 134-operations.md ├── 135-Definitions.md ├── 136-Command Reference.md ├── 137-kubectl_api-versions.md ├── 138-kubectl_cluster-info.md ├── 139-kubectl_config_set-cluster.md ├── 140-kubectl_config_set-context.md ├── 141-kubectl_config_set-credentials.md ├── 142-kubectl_config_set.md ├── 143-kubectl_config_unset.md ├── 144-kubectl_config_use-context.md ├── 145-kubectl_config.md ├── 146-kubectl_config_view.md ├── 147-kubectl_create.md ├── 148-kubectl_delete.md ├── 149-kubectl_describe.md ├── 150-kubectl_exec.md ├── 154-kubectl_logs.md ├── 164-kubectl_version.md ├── 165-Troubleshooting and Support.md ├── 166-Applications.md ├── 167-Clusters.md ├── 168-User_FAQ.md ├── 169-Debugging_FAQ.md ├── 170-Services_FAQ.md ├── 198-kubectl_annotate.md ├── 199-kubectl_apply.md ├── 200-kubectl_attach.md ├── 201-kubectl_edit.md ├── Fingerpost.txt ├── Hazelcast ├── README.md ├── SUMMARY.md ├── book.json ├── images ├── 27gf-counter.png ├── Cover.png ├── all-lines.png ├── bigquery-logging.png ├── cloud-logging-console.png ├── cloud-logging.png ├── diagram.png └── k8s-singlenode-docker.png ├── include ├── API-Definitions.html └── API-Operations.html ├── k8s-ui-explore-filter.png ├── k8s-ui-explore-groupby.png ├── k8s-ui-explore-poddetail.png ├── k8s-ui-explore.png ├── k8s-ui-nodes.png └── k8s-ui-overview.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Node rules: 2 | ## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 3 | .grunt 4 | 5 | ## Dependency directory 6 | ## Commenting this out is preferred by some people, see 7 | ## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git 8 | node_modules 9 | 10 | # Book build output 11 | _book 12 | 13 | # eBook build output 14 | *.epub 15 | *.mobi 16 | *.pdf -------------------------------------------------------------------------------- /000-About_This_Doc.md: -------------------------------------------------------------------------------- 1 | # Kubernetes文档翻译小组约定 2 | 3 | # Kubernetes文档翻译小组约定 4 | 5 | ## 文档地址 6 | 7 | 1. 翻译任务认领表:
8 | https://shimo.im/doc/YhENOgq2txyaEQF9 9 |
按章节认领,在这个表格中看中章节的“翻译”一栏添上自己的名字即可。 10 | 11 | 2. Gitbook编辑地址:
12 | https://www.gitbook.com/book/linfan1/kubernetes-chinese-docs/edit 13 |
请首先登陆Gitbook,并确保对这个文档有编辑权限。 14 | 15 | 3. Git Repo地址:
16 | 想用Git直接拉取下来编辑的话,可以用下面这个命令哦。 17 | ``` 18 | git clone https://git.gitbook.com/linfan1/kubernetes-chinese-docs.git 19 | ``` 20 | 21 | ## 翻译约定 22 | 23 | 1. 每个小章节单独建一个文件,文件名按照“__三位数标号-章节英文名.md__”命名。可以参考已经有的文件,文件名记得加上.md后缀。 24 | 25 | 2. 界面上面“Table Of Contents”部分先不管,这部分内容会不定期进行统一布局和整理。 26 | 27 | 3. 不论原本内容有没有标题,麻烦大家在每个小节的**第一行**都写个标题,方便后期整理目录。可以参考已有的文件内容。 28 | 29 | 4. 内容格式按照DockOne的[文章规范](Fingerpost.txt),基本规范列举如下: 30 | - 中文部分统一使用中文全角字符,如『』、“”、()等 31 | - Markdown格式统一使用英文字符,如[]、()、#等 32 | - 英文单词前后不需要留空格 33 | - 注意专用词汇的大小写,如Pod、ReplicationControllers 34 | 35 | 5. 内容中的链接引用,分为以下两种情况处理: 36 | - **引用到同一篇文档其他位置的链接**:可以改为叙述方式,例如『参见下文XXX部分内容』 37 | - **引用到文档以外地址,包括引用另一篇文档的链接**:统一保留原始链接地址,后续再统一进行处理 38 | 所有引用统一采用Markdown的[引用格式](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#links),不应该写成上标的方式。 39 | 40 | ##名词列表 41 | 42 | 文档中出现的下列名词统一不翻译,而且文档中全部使用单数形式: 43 | 44 | - ***Pod*** 45 | - ***Service*** 46 | - ***Replication Controller*** 47 | - ***Label*** 48 | - ***Selector*** 49 | - ***Volume*** 50 | - ***Secret*** 51 | - ***Name*** 52 | - ***Namespace*** 53 | - ***Annotation*** 54 | -------------------------------------------------------------------------------- /002-whatisk8s.md: -------------------------------------------------------------------------------- 1 | # 什么是Kubernetes? 2 | `译者:razr` `校对:iT2afL0rd` 3 | 4 | Kubernetes一个用于容器集群的自动化部署、扩容以及运维的开源平台。 5 | 6 | 使用Kubernetes,你可以快速高效地响应客户需求: 7 | 8 | - 动态地对应用进行扩容。 9 | - 无缝地发布新特性。 10 | - 仅使用需要的资源以优化硬件使用。 11 | 12 | 我们希望培育出一个组件及工具的生态,帮助大家减轻在公有云及私有云上运行应用的负担。 13 | 14 | #### Kubernetes是: 15 | 16 | * **简洁的**:轻量级,简单,易上手 17 | * **可移植的**:公有,私有,混合,多重云(multi-cloud) 18 | * **可扩展的**: 模块化, 插件化, 可挂载, 可组合 19 | * **可自愈的**: 自动布置, 自动重启, 自动复制 20 | 21 | Kubernetes项目是Google在2014年启动的。Kubernetes构建在[Google公司十几年的大规模高负载生产系统运维经验](https://research.google.com/pubs/pub43438.html)之上,同时结合了社区中各项最佳设计和实践。 22 | 23 | ##### 准备好[开始](003-getting-started-guides.md)了吗? 24 | 25 |
26 | 27 | 想了解为何要使用[容器](http://aucouranton.com/2014/06/13/linux-containers-parallels-lxc-openvz-docker-and-more/)技术? 28 | 29 | 下面是一些关键点: 30 | 31 | * **以应用程序为中心的管理**: 32 | 将抽象级别从在虚拟硬件上运行操作系统上升到了在使用特定逻辑资源的操作系统上运行应用程序。这在提供了Paas的简洁性的同时拥有IssS的灵活性,并且相对于运行[12-factor应用程序](http://12factor.net/)有过之而无不及。 33 | * **开发和运维的关注点分离**: 34 | 提供构建和部署的分离;这样也就将应用从基础设施中解耦。 35 | * **敏捷的应用创建和部署**: 36 | 相对使用虚拟机镜像,容器镜像的创建更加轻巧高效。 37 | * **持续开发,持续集成以及持续部署**: 38 | 提供频繁可靠地构建和部署容器镜像的能力,同时可以快速简单地回滚(因为镜像是固化的)。 39 | * **松耦合,分布式,弹性,自由的[微服务](http://martinfowler.com/articles/microservices.html)**: 40 | 应用被分割为若干独立的小型程序,可以被动态地部署和管理 -- 而不是一个运行在单机上的超级臃肿的大程序。 41 | * **开发,测试,生产环境保持高度一致**: 42 | 无论是再笔记本电脑还是服务器上,都采用相同方式运行。 43 | * **兼容不同的云平台或操作系统上**: 44 | 可运行与Ubuntu,RHEL,on-prem或者Google Container Engine,覆盖了开发,测试和生产的各种不同环境。 45 | * **资源分离**: 46 | 带来可预测的程序性能。 47 | * **资源利用**: 48 | 高性能,大容量。 49 | 50 | #### Kubernetes不是: 51 | 52 | Kubernetes不是PaaS(平台即服务)。 53 | 54 | * Kubernetes并不对支持的应用程序类型有任何限制。 它并不指定应用框架,限制语言类型,也不仅仅迎合 [12-factor应用程序](http://12factor.net/)模式. Kubernetes旨在支持各种多种多样的负载类型:只要一个程序能够在容器中运行,它就可以在Kubernetes中运行。 55 | * Kubernetes并不关注代码到镜像领域。它并不负责应用程序的构建。不同的用户和项目对持续集成流程都有不同的需求和偏好,所以我们分层支持持续集成但并不规定和限制它的工作方式。 56 | * 另一方面, 确实有不少PaaS系统运行在Kubernetes*之上*,比如[Openshift](https://github.com/openshift/origin)和[Deis](http://deis.io/)。同样你也可以将定制的PaaS系统,结合一个持续集成系统再Kubernetes上进行实施:只需生成容器镜像并通过Kubernetes部署。 57 | * 由于Kubernetes运行再应用层而不是硬件层,所以它提供了一些一般PaaS提供的功能,比如部署,扩容,负载均衡,日志,监控,等等。无论如何,Kubernetes不是一个单一应用,所以这些解决方案都是可选可插拔的。 58 | 59 | Kubernetes并不是单单的"编排系统";它排除了对编排的需要: 60 | 61 | * “编排”的技术定义为按照指定流程执行一系列动作:执行A,然后B,然后C。相反,Kubernetes有一系列控制进程组成,持续地控制从当前状态到指定状态的流转。无需关注你是如何从A到C:只需结果如此。这样将使得系统更加易用,强大,健壮和弹性。 62 | 63 | 64 | #### Kuberbetes这个名字是什么意思?k8s又是什么? 65 | 66 | Kubernetes这个名字源自希腊语,意思是“舵手”,也是“管理者”,“治理者”等词的源头。k8s是Kubernetes的简称(用数字『8』替代中间的8个字母『ubernete』)。 67 | -------------------------------------------------------------------------------- /004-Local-machine Solutions.md: -------------------------------------------------------------------------------- 1 | # 从本地环境起步 2 | `译者:razr` `校对:无` 3 | 4 | ----------------------- 5 | 6 | 使用以下方案创建基于单台物理机且运行一到多个Kubernetes节点的单个集群。 7 | 8 | 参考[选择合适的方案](README.md)获取更多信息。 9 | 10 | 目录: 11 | 12 | - [本地(基于Docker)](docker.md) 13 | - [Vagrant](vagrant.md) 14 | - [本地(无虚拟机)](locally.md) 15 | -------------------------------------------------------------------------------- /005-Local_Docker-based.md: -------------------------------------------------------------------------------- 1 | #基于Docker本地运行Kubernetes 2 | `译者:razr` `校对:无` 3 | 4 | 5 | **目录** 6 | 7 | - [概览](#概览) 8 | - [先决条件](#先决条件) 9 | - [第一步:运行etcd](#第一步-运行etcd) 10 | - [第二步:启动master](#第二步-启动master) 11 | - [第三步:启动service proxy](#第三步-启动service-proxy) 12 | - [测试](#测试) 13 | - [运行一个应用](#运行一个应用) 14 | - [暴露为service](#暴露为service) 15 | - [关于关闭集群的说明](#关于关闭集群的说明) 16 | 17 | ### 概览 18 | 19 | 下面的指引将高速你如何通过Docker创建一个单机、单节点的Kubernetes集群。 20 | 21 | 下图是最终的结果: 22 | ![Kubernetes Single Node on Docker](images/k8s-singlenode-docker.png) 23 | 24 | ### 先决条件 25 | 26 | 1. 你必须拥有一台安装有Docker的机器。 27 | 2. 你的内核必须支持`memory and swap accounting`。确认你的linux内核开启了如下配置: 28 | 29 | ```console 30 | CONFIG_RESOURCE_COUNTERS=y 31 | CONFIG_MEMCG=y 32 | CONFIG_MEMCG_SWAP=y 33 | CONFIG_MEMCG_SWAP_ENABLED=y 34 | CONFIG_MEMCG_KMEM=y 35 | ``` 36 | 37 | 3. 以命令行参数方式,在内核启动时开启`memory and swap accounting`选项: 38 | 39 | ```console 40 | GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1" 41 | ``` 42 | 43 | 注意:以上只适用于GRUB2。通过查看/proc/cmdline可以确认命令行参数是否已经成功传给内核: 44 | 45 | ```console 46 | $cat /proc/cmdline 47 | BOOT_IMAGE=/boot/vmlinuz-3.18.4-aufs root=/dev/sda5 ro cgroup_enable=memory 48 | swapaccount=1 49 | ``` 50 | 51 | ### 第一步:运行Etcd 52 | 53 | ```sh 54 | docker run --net=host -d gcr.io/google_containers/etcd:2.0.12 /usr/local/bin/etcd --addr=127.0.0.1:4001 --bind-addr=0.0.0.0:4001 --data-dir=/var/etcd/data 55 | ``` 56 | 57 | ### 第二步:启动master 58 | 59 | ```sh 60 | docker run \ 61 | --volume=/:/rootfs:ro \ 62 | --volume=/sys:/sys:ro \ 63 | --volume=/dev:/dev \ 64 | --volume=/var/lib/docker/:/var/lib/docker:ro \ 65 | --volume=/var/lib/kubelet/:/var/lib/kubelet:rw \ 66 | --volume=/var/run:/var/run:rw \ 67 | --net=host \ 68 | --pid=host \ 69 | --privileged=true \ 70 | -d \ 71 | gcr.io/google_containers/hyperkube:v1.0.1 \ 72 | /hyperkube kubelet --containerized --hostname-override="127.0.0.1" --address="0.0.0.0" --api-servers=http://localhost:8080 --config=/etc/kubernetes/manifests 73 | ``` 74 | 75 | 这一步实际上运行的是`kubelet`,并启动了一个包含其他master组件的[pod](../user-guide/pods.md)。 76 | 77 | ### 第三步:运行service proxy 78 | 79 | ```sh 80 | docker run -d --net=host --privileged gcr.io/google_containers/hyperkube:v1.0.1 /hyperkube proxy --master=http://127.0.0.1:8080 --v=2 81 | ``` 82 | 83 | ### 测试 84 | 85 | 此时你应该已经运行起了一个Kubernetes集群。你可以下载kubectl二进制程序进行测试: 86 | ([OS X](https://storage.googleapis.com/kubernetes-release/release/v1.0.1/bin/darwin/amd64/kubectl)) 87 | ([linux](https://storage.googleapis.com/kubernetes-release/release/v1.0.1/bin/linux/amd64/kubectl)) 88 | 89 | *注意:* 90 | 再OS/X上你需要通过ssh设置端口转发: 91 | 92 | ```sh 93 | boot2docker ssh -L8080:localhost:8080 94 | ``` 95 | 96 | 列出集群中的节点: 97 | 98 | ```sh 99 | kubectl get nodes 100 | ``` 101 | 102 | 应该输出以下内容: 103 | 104 | ```console 105 | NAME LABELS STATUS 106 | 127.0.0.1 Ready 107 | ``` 108 | 109 | 如果你运行了不同的Kubernetes集群,你可能需要指定`-s http://localhost:8080`选项来访问本地集群。 110 | 111 | ### 运行一个应用 112 | 113 | ```sh 114 | kubectl -s http://localhost:8080 run nginx --image=nginx --port=80 115 | ``` 116 | 117 | 运行`docker ps`你应该就能看到nginx在运行。下载镜像可能需要等待几分钟。 118 | 119 | ### 暴露为service 120 | 121 | ```sh 122 | kubectl expose rc nginx --port=80 123 | ``` 124 | 125 | 运行以下命令来获取刚才创建的service的IP地址。有两个IP,第一个是内部的(CLUSTER_IP),第二个是外部的负载均衡IP。 126 | 127 | ```sh 128 | kubectl get svc nginx 129 | ``` 130 | 131 | 同样你也可以通过运行以下命令只获取第一个IP(CLUSTER_IP): 132 | 133 | ```sh 134 | kubectl get svc nginx --template={{.spec.clusterIP}} 135 | ``` 136 | 137 | 通过第一个IP(CLUSTER_IP)访问服务: 138 | 139 | ```sh 140 | curl 141 | ``` 142 | 143 | 注意如果再OSX上需要再boot2docker虚拟机上运行curl。 144 | 145 | ### 关于关闭集群的说明 146 | 147 | 上面的各种容器都是运行在`kubelet`程序的管理下,它会保证容器一直运行,甚至容器意外退出时也不例外。所以,如果想关闭集群,你需要首先关闭`kubelet`容器,再关闭其他。 148 | 149 | 可以使用`docker kill $(docker ps -aq)`。注意这样会关闭Docker下运行的所有容器,请谨慎使用。 150 | -------------------------------------------------------------------------------- /007-Local_No-VM.md: -------------------------------------------------------------------------------- 1 | #从本地运行k8s开始 v1.0 2 | `译者:卢文泉` `校对:无` 3 | 4 | [原文地址](http://kubernetes.io/v1.0/docs/getting-started-guides/locally.html) 5 | 6 | ###环境需求 7 | ####Linux 8 | 没有运行Linux?考虑下使用[Vagrant](http://kubernetes.io/v1.0/docs/getting-started-guides/vagrant.html)在虚拟机中运行Linux,或者像[Google Compute Engine](http://kubernetes.io/v1.0/docs/getting-started-guides/gce.html)这样的云提供商上运行。 9 | 10 | ####Docker 11 | 至少Docker1.3+。确保Docker守护进程一直运行,并确保能交互(比如`docker ps`)。一些Kubernetes组件需要root权限运行,这样这些组件才能和Docker正常、良好地工作。 12 | 13 | ####etcd 14 | 你需要配置[etcd](https://github.com/coreos/etcd/releases)到环境变量,请确保安装etcd并且正确配置到**$PATH**中。 15 | 16 | ####go 17 | go版本至少1.3+,请确保安装好go并配置好**¥PATH**。 18 | 19 | ###启动集群 20 | 新打开一个单独的终端,运行下面的指令(由于启动/停止kubernetes守护进程需要root权限,所以使用root权限运行整个脚本会使操作更加容易): 21 | ```sh 22 | cd kubernetes 23 | hack/local-up-cluster.sh 24 | ``` 25 | 这个操作将会构建和启动一个轻量的本地集群,包含一个master和一个节点。输入ctrl+C关闭集群。 26 | 27 | ##运行容器 28 | 成功运行集群后,我想你很定迫不及待地想启动你的容器了。 29 | 30 | 现在你可以使用`cluster/kubectl.sh`脚本中的命令来和本地集群交互了: 31 | ```sh 32 | cluster/kubectl.sh get pods 33 | cluster/kubectl.sh get services 34 | cluster/kubectl.sh get replicationcontrollers 35 | cluster/kubectl.sh run my-nginx --image=nginx --replicas=2 --port=80 36 | 37 | ##在等待命令完成前,你可以打开一个新终端查看docker拉取镜像 38 | sudo docker images 39 | ##你会看到docker正在拉去nginx镜像 40 | sudo docker ps 41 | ## 你会看到你的容器正在运行 42 | exit 43 | ## end wait 44 | 45 | ## 查看kubernetes相关信息 46 | cluster/kubectl.sh get pods 47 | cluster/kubectl.sh get services 48 | cluster/kubectl.sh get replicationcontrollers 49 | ``` 50 | 51 | ##运行用户定义的pod 52 | 要注意[容器](http://kubernetes.io/v1.0/docs/user-guide/containers.html)和[pod](http://kubernetes.io/v1.0/docs/user-guide/pods.html)之前的不同。如果你只向kubernetes请求前者(容器),kubernetes会创建一个新的封装好的pod给你。但是(通过这个pod)你不能在本地主机查看到nginx的开始页面。为了验证nginx正确在容器中运行,你需要在容器中运行`curl`(通过docker exec执行)。 53 | 54 | 你可以通过用户定义的`manifest`来控制pod的信息。指定端口就可以在浏览器中访问nginx了: 55 | ```sh 56 | cluster/kubectl.sh create -f docs/user-guide/pod.yaml 57 | ``` 58 | 59 | 祝你好运 60 | 61 | ##解决问题 62 | ###我不能通过IP访问服务 63 | 一些使用`iptables`工具的防火墙软件不能很好地与kubernetes配合。如果你在网络上遇到麻烦,首先尝试关闭系统的防火墙或者其它使用`iptables`的系统。此外,通过`journalctl --since yesterday | grep avc`指令检查SELinux(【译者注】指安全增强型Linux系统)是否屏蔽了什么。 64 | 65 | 集群IPs默认范围:`10.0...`,这有可能引起docker 容器IP和集群IP冲突。如果你发现容器IP也在集群的IP范围内,编辑`hack/local-cluster-up.sh`脚本修改集群的IP范围。 66 | 67 | ###当副本控制器的副本数大于1时我无法创建副本!哪里出了问题? 68 | (也许是)你只运行一个node节点。指超过了一个给定pod支持的最大副本数。如果你对运行更大副本书感兴趣,我们鼓励你使用vagrant或者在云上操作。 69 | 70 | ###我修改Kubernetes代码后该如何运行它? 71 | ```language 72 | cd kubernetes 73 | hack/build-go.sh 74 | hack/local-up-cluster.sh 75 | ``` 76 | 77 | ###kubectl表明启动容器但是`get pod`和`docker ps`命令没有显示 78 | 本地`local-up-cluster.sh`脚本不会启动DNS服务。类似的解决方案见[这里](https://github.com/GoogleCloudPlatform/kubernetes/issues/6667)。或者你可以手动启动。相关文档见[这里](https://releases.k8s.io/v1.0.6/cluster/addons/dns#how-do-i-configure-it) 79 | 80 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /008-Hosted_Solution-Google_Container_Engine.md: -------------------------------------------------------------------------------- 1 | #容器引擎 2 | `译者:李加庆` `校对:无` 3 | 4 | ##自动化的容器管理 5 | 对于运行Docker容器来说,Googler容器引擎是一款强大的集群管理器和编排系统。容器引擎将你的容器牵引到集群中并会基于你定义的一些需求(比如CPU和内存)自动管理它们。容器引擎是基于开源的Kubernetes系统构建出来的,可以使你灵活地利用私有云、混合云或者公有云的基础设施所带来的好处。 6 | 7 | ##分分钟建立集群 8 | 几分钟就可以建立一个可管理的虚拟机容器集群,并且随时可以部署。你的集群配备了很多功能,比如日志记录和容器健康检查,使得应用管理更加容易。 9 | 10 | ##声明管理 11 | 在一个简单的JSON配置文件中声明你的容器需求,比如CPU/内存的预留量,副本数量,保活政策。容器引擎将设置你的容器为声明式的,并积极地管理你的应用程序,以确保满足要求。 12 | 13 | ##灵活&开源 14 | 随着红帽,微软,IBM,Mirantis OpenStack以及VMware(名单数量不断增加中)将Kubernetes集成到它们的平台上,你就可以更加轻易地移动工作负载,或是充分利用多个云提供商所带来的优势。 15 | 16 | ###容器引擎的特点 17 | ####全面管理 18 | 容器引擎油值得信赖的Google工程师全面管理,来确保您的集群是可用和最新的。 19 | ####私有的容器Registry 20 | Google容器Registry使得存储和访问您的私有Docker镜像更加容易。 21 | ####可伸缩 22 | 随着您的应用需求的改变,轻松调整分配给容器的集群资源或者容器集群的大小。 23 | ####Docker支持 24 | 容器引擎支持常见的Docker容器格式 25 | ####日志功能 26 | 使用复选框来启用Google云日志,更加轻松地洞察应用程序的运行情况。 27 | ####混合组网 28 | 为您的容器集群保留一组IP地址,通过Google云端VPN使得您的集群IP与私有网络IP共存。 29 | 30 | **对于我们来说,容器引擎充分发挥了Google基础设施的力量,而没有禁锢我们,它让我们平和地对待基础设施,并且让我们专注于开发伟大的软件。- Brian Fitzpatrick,Founder & CTO, Tock** 31 | -------------------------------------------------------------------------------- /009-Turn-key Cloud Solutions.md: -------------------------------------------------------------------------------- 1 | #入门指南:完整的解决方案 2 | `译者:李加庆` `校对:无` 3 | 4 | 使用这些解决方案在您的云端构建Kubernetes集群。 5 | 第一次来?更多详情参见[选择合适的解决方案]()。 6 | 目录: 7 | 8 | - GCE 9 | - AWS 10 | - Azure -------------------------------------------------------------------------------- /011-AWS.md: -------------------------------------------------------------------------------- 1 | #AWS EC2快速入门 2 | `译者:李加庆` `校对:无` 3 | 4 | 5 | ##前提条件 6 | 1.您需要一个AWS账户,访问[http://aws.amazon.com](http://aws.amazon.com/)获得。 7 | 2.安装并配置[AWS命令行界面](http://aws.amazon.com/cn/cli/)。 8 | 3.你需要一个拥有EC2全部权限的AWS[实例配置文件和角色](http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)。 9 | **注**:这个脚本默认使用“默认”的AWS实例配置文件,您可以使用`AWS_DEFAULT_PROFILE`环境变量来明确地配置AWS实例配置文件: 10 | `export AWS_DEFAULT_PROFILE=myawsprofile` 11 | 12 | ##启动集群 13 | ###支持程序:`get-kube` 14 | ``` 15 | #使用 wget 16 | export KUBERNETES_PROVIDER=aws; wget -q -O - https://get.k8s.io | bash 17 | 18 | #使用 cURL 19 | export KUBERNETES_PROVIDER=aws; curl -sS https://get.k8s.io | bash 20 | 21 | ``` 22 | **注**:这个脚本调用[cluster/kube-up.sh](https://github.com/kubernetes/kubernetes/blob/5fe3733f950028c88e35f7a21dd0aabacf84e8b8/cluster/kube-up.sh), 23 | 而cluster/kube-up.sh反过来使用[cluster/aws/config-default.sh](https://github.com/kubernetes/kubernetes/blob/5fe3733f950028c88e35f7a21dd0aabacf84e8b8/cluster/aws/config-default.sh)调用[cluster/aws/util.sh](https://github.com/kubernetes/kubernetes/blob/5fe3733f950028c88e35f7a21dd0aabacf84e8b8/cluster/aws/util.sh)。 24 | 25 | 这个过程需要约5至10分钟。一旦集群启动,你的主虚拟机和节点虚拟机的IP地址将被打印,同样地,有关运行在集群中的默认服务(监控,日志,DNS)的信息也会被打印。用户凭据和安全令牌都写在`〜/.kube/config`中,它们对使用CLI或HTTP基本认证是必要的。 26 | 27 | 默认情况下,该脚本将会使用在美国西部-2A(俄勒冈州)运行了两个t2.micro实例的ubuntu,提供一个新的VPC和一个四节点的k8s集群。您可以根据下面的文本,重写定义在[config-default.sh](https://github.com/kubernetes/kubernetes/blob/01fbe64a342aaf150ae0b9eb43dc714982d21b72/cluster/aws/config-default.sh)中的变量来改变这种默认的行为: 28 | ``` 29 | export KUBE_AWS_ZONE=eu-west-1c 30 | export NUM_MINIONS=2 31 | export MINION_SIZE=m3.medium 32 | export AWS_S3_REGION=eu-west-1 33 | export AWS_S3_BUCKET=mycompany-kubernetes-artifacts 34 | export INSTANCE_PREFIX=k8s 35 | ... 36 | ``` 37 | 该脚本也会尝试创建或者复用名为“kubernetes”的密钥对和名为“kubernetes-master”及“kubernetes-minion”的IAM文件。如果这些文件已经存在,请确保您想要在这里使用它们。 38 | **注**:如果使用已存在的“kubernetes”密钥对,那么您必须设置AWS_SSH_KEY密钥指向您的私有密钥。 39 | ###替代方案 40 | 这里提供一个[例子](http://kubernetes.io/v1.1/docs/getting-started-guides/coreos/coreos_multinode_cluster.html),可以让你使用EC2用户数据,建立一个基于CoreOS的Kubernetes集群。 41 | 42 | ##开始使用您的集群 43 | ###命令行管理工具:kubectl 44 | 集群启动脚本将会在您的工作站留下一个kubernetes目录。可以与之替代的是,您还可以从[这个页面](https://github.com/kubernetes/kubernetes/releases)下载最新的Kubernetes发行版。 45 | 接下来,在**PATH**中添加适当的二进制文件夹,以便可以访问kubectl: 46 | ``` 47 | # OS Xexport PATH=/platforms/darwin/amd64:$PATH 48 | # Linuxexport PATH=/platforms/linux/amd64:$PATH 49 | ``` 50 | 此工具的最新文档页面可以在这里找到:[kubectl manual](http://kubernetes.io/v1.1/docs/user-guide/kubectl/kubectl.html)。 51 | 默认情况下,**kubectl**将使用集群启动时生成的**kubeconfig**文件对API进行身份验证。更多相关信息,请阅读[kubeconfig文件](http://kubernetes.io/v1.1/docs/user-guide/kubeconfig-file.html)。 52 | ###示例 53 | 看一个简单的[nginx示例](http://kubernetes.io/v1.1/docs/user-guide/simple-nginx.html),尝试使用一下您的新集群。 54 | “Guestbook”应用程序是另外一个流行的Kubernetes入门示例: [guestbook 例子](http://kubernetes.io/v1.1/examples/guestbook/)。 55 | 更多完整的应用程序,请查看[示例目录](http://kubernetes.io/v1.1/examples/)。 56 | 57 | ###拆除集群 58 | 确保您用来提供给集群的环境变量仍在输出,然后调用下面kubernetes目录中的脚本: 59 | ``` 60 | cluster/kube-down.sh 61 | ``` 62 | ##补充阅读 63 | 更多关于管理和使用Kubernetes集群的细节请参见[Kubernetes文档](http://kubernetes.io/v1.1/docs/)。 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /015-AWS or GCE.md: -------------------------------------------------------------------------------- 1 | 2 | `译者:安雪艳` `校对:无` 3 | 4 | # **[CoreOS](https://coreos.com)上部署入门指南** 5 | 6 | 在[Coreos](https://coreos.com/kubernetes/docs/latest/)运行Kubernetes有多个指南: 7 | 8 | ## **CoreOS官方指南** 9 | 10 | 这些指南由CoreOs维护,“CoreOS Way”提供了TLS协议,DNS add-on等部署Kubernetes的指南。指南都通过了Kubernetes的一致性测试,当然,也鼓励自己[测试自己的部署](https://coreos.com/kubernetes/docs/latest/conformance-tests.html)。 11 | 12 | ### [Vagrant Multi-Node](https://coreos.com/kubernetes/docs/latest/kubernetes-on-vagrant.html) 13 | 14 | 这是在Vagrant上搭建多节点集群的指南。部署者可以单独配置etcd nodes,master nodes和worker nodes节点数,来调出一个完整的HA的控制板。 15 | 16 | ### [Vagrant Single-Node](https://coreos.com/kubernetes/docs/latest/kubernetes-on-vagrant-single.html) 17 | 18 | 这是一个在本地快速搭建Kubernetes开发环境的方式。简单的```git clone```,```vagrant up```和配置```kubectl```三步就可以了。 19 | 20 | 21 | 22 | ### [Full Step by Step Guide](https://coreos.com/kubernetes/docs/latest/getting-started.html) 23 | 24 | 这是在任何云或者机器上搭建一个TLS协议的HA集群的一般的指南。根据角色重复master或者worker的部署去配置更多的机器。 25 | 26 | 27 | 28 | ## **社区指南** 29 | 30 | 这些指南由社区人员维护,包括一些特殊平台,使用案例和在CoreOS使用不同的方式来配置Kubernetes的经验。 31 | 32 | ### [Multi-node Cluster](coreos/coreos_multinode_cluster.html) 33 | 34 | 在选择的平台中:AWS,GCE,或者VMware Fusion搭建一个单个master,multi-worker集群的指南。 35 | 36 | ### [Easy Multi-node Cluster on Google Compute Engine](https://github.com/rimusz/coreos-multi-node-k8s-gce/blob/master/README.md) 37 | 38 | 在GCE上通过脚本安装一个单个master,multi-worker的集群的指南。使用[fleet](https://github.com/coreos/fleet)来管理Kubernetes的部件。 39 | 40 | ### [Multi-node cluster using cloud-config and Weave on Vagrant](https://github.com/errordeveloper/weave-demos/blob/master/poseidon/README.md) 41 | 42 | 配置一个Vagrant-based集群,包括3台带有Weave网络的机器的指南。 43 | 44 | ### [Multi-node cluster using cloud-config and Vagrant](https://github.com/pires/kubernetes-vagrant-coreos-cluster/blob/master/README.md) 45 | 46 | 通过选择的虚拟管理程序:VirtualBox,Parallels或者Parallels配置一个单个master,multi-worker本地集群的指南。 47 | 48 | ### [Multi-node cluster with Vagrant and fleet units using a small OS X App](https://github.com/rimusz/coreos-osx-gui-kubernetes-cluster/blob/master/README.md) 49 | 50 | 这是通过OS X应用程序控制运行一个单个master, multi-worker集群指南。Under the hood使用Vagrant。 51 | 52 | ### [Resizable multi-node cluster on Azure with Weave](coreos/azure/README.html) 53 | 54 | 在Azure上运行一个HA etcd集群,包括一个单个master的指南。使用Azure node.js CLI去扩展集群。 55 | 56 | 57 | ### [Multi-node cluster using cloud-config, CoreOS and VMware ESXi](https://github.com/xavierbaude/VMware-coreos-multi-nodes-Kubernetes) 58 | 59 | 在VMware ESXi配置一个单个master,单个worker集群的指南。 -------------------------------------------------------------------------------- /016-AWS or Joyent.md: -------------------------------------------------------------------------------- 1 | # Juju上部署入门 2 | `译者:王乐` `校对:无` 3 | 4 | Juju使通过配置部署Kubernetes,在集群中安装和配置所有系统更加简单。可通过一个命令增加集群尺寸来简单的扩展集群 5 | 6 | 内容列表 7 | 8 | * [部署需求](#部署需求) 9 | * [Ubuntu上部署](#Ubuntu上部署) 10 | * [Docker相关部署](#Docker相关部署) 11 | * [运行Kubernetes集群](#运行Kubernetes集群) 12 | * [检测集群](#检测集群) 13 | * [运行多个容器!](#运行多个容器!) 14 | * [扩展集群](#扩展集群) 15 | * [运行“k8petsore”示例应用](#运行“k8petsore”示例应用) 16 | * [删除集群](#删除集群) 17 | * [更多信息](#更多信息) 18 | * [云兼容](#云兼容) 19 | 20 | ## **部署需求** 21 | 22 | 注意:如果你运行kube-up,在Ubuntu上——所有的依赖会为您处理。你可以跳转到这个部分:运行Kubernetes集群 23 | 24 | 25 | ### **Ubuntu上部署** 26 | 27 | 在您的本地Ubuntu系统安装Juju客户端。 28 | 29 | ``` 30 | sudo add-apt-repository ppa:juju/stable 31 | sudo apt-get update 32 | sudo apt-get install juju-core juju-quickstart 33 | ``` 34 | 35 | ### **Docker相关部署** 36 | 37 | 如果您不使用Ubuntu,而是使用Docker,您可以运行以下命令: 38 | 39 | ``` 40 | mkdir ~/.juju 41 | sudo docker run -v ~/.juju:/home/ubuntu/.juju -ti jujusolutions/jujubox:latest 42 | ``` 43 | 44 | 此时你可以在当前路径上获取```juju quickstart```命令。 45 | 46 | 为您所选择允许的云设置证书: 47 | 48 | ``` 49 | juju quickstart --constraints="mem=3.75G" -i``` 50 | 51 | 这里```constraints``` flag是可选的,当请求一个新的虚拟机时,他改变Juju生成的虚拟机尺寸。大的虚拟机相比小虚拟机运行的更快,但是花费更多。 52 | 53 | 根据对话选择```save```和```use```。快速入门将启动Juju跟节点,根据用户接口设置Juju页面。 54 | 55 | 56 | ## **运行Kubernetes集群** 57 | 58 | 59 | 启动集群之前需要导出环境变量```KUBERNETES_PROVIDER```。 60 | ``` 61 | export KUBERNETES_PROVIDER=juju 62 | cluster/kube-up.sh``` 63 | 64 | 如果这是第一次运行```kube-up.sh```脚本,它会安装Juju部署入门的所有依赖关系,另外它会根据通用配置运行一个窗口,允许你选择云服务商,输入适当的访问凭证。 65 | 66 | 下一步它会部署kubernetes master,etcd,2个带有flannel的nodes,flannel是基础软件定义网络(SDN),它可以使在不同的主机上的容器互相通信。 67 | 68 | ## **检测集群** 69 | ```juju status```命令提供了集群中每个单元的信息: 70 | ``` 71 | $ juju status --format=oneline 72 | - docker/0: 52.4.92.78 (started) 73 | - flannel-docker/0: 52.4.92.78 (started) 74 | - kubernetes/0: 52.4.92.78 (started) 75 | - docker/1: 52.6.104.142 (started) 76 | - flannel-docker/1: 52.6.104.142 (started) 77 | - kubernetes/1: 52.6.104.142 (started) 78 | - etcd/0: 52.5.216.210 (started) 4001/tcp 79 | - juju-gui/0: 52.5.205.174 (started) 80/tcp, 443/tcp 80 | - kubernetes-master/0: 52.6.19.238 (started) 8080/tcp 81 | ``` 82 | 你可 83 | 以使用```juju ssh```去访问任何一个单元: 84 | ``` 85 | juju ssh kubernetes-master/0 86 | ``` 87 | ## **运行多个容器!** 88 | 89 | 在Kubernetes主节点```kubectl```是可用的。我们ssh登录去运行一些容器,但也可以通过设置```KUBERNETES_MASTER```为“kubernetes-master/0”的ip地址来使用本地```kubectl```。 90 | 91 | 在启动一个容器前无pods可获取 92 | ``` 93 | kubectl get pods 94 | NAME READY STATUS RESTARTS AGE 95 | 96 | kubectl get replicationcontrollers 97 | CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS 98 | ``` 99 | 我们将跟随aws-coreos实例。创建一个pod清单:pod.json 100 | ``` 101 | { 102 | "apiVersion": "v1", 103 | "kind": "Pod", 104 | "metadata": { 105 | "name": "hello", 106 | "labels": { 107 | "name": "hello", 108 | "environment": "testing" 109 | } 110 | }, 111 | "spec": { 112 | "containers": [{ 113 | "name": "hello", 114 | "image": "quay.io/kelseyhightower/hello", 115 | "ports": [{ 116 | "containerPort": 80, 117 | "hostPort": 80 118 | }] 119 | }] 120 | } 121 | }``` 122 | 123 | 使用kubectl创建pod: 124 | ``` 125 | kubectl create -f pod.json``` 126 | 127 | 获取pod信息: 128 | ``` 129 | kubectl get pods``` 130 | 131 | 测试hello应用,我们需要定位容器所在的节点。使用Juju去作用于容器的更好的工具是在工作节点上,但是我们可以使用```juju run```和```juju status```去找到我们的hello应用。 132 | ``` 133 | juju run --unit kubernetes/0 "docker ps -n=1" 134 | ... 135 | juju run --unit kubernetes/1 "docker ps -n=1" 136 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 137 | 02beb61339d8 quay.io/kelseyhightower/hello:latest /hello About an hour ago Up About an hour k8s_hello....``` 138 | 我们看到“kubernetes/1”有我们的容器,我们可以打开80端口: 139 | ``` 140 | juju run --unit kubernetes/1 "open-port 80" 141 | juju expose kubernetes 142 | sudo apt-get install curl 143 | curl $(juju status --format=oneline kubernetes/1 | cut -d' ' -f3)``` 144 | 145 | 最后删除pod: 146 | ``` 147 | juju ssh kubernetes-master/0 148 | kubectl delete pods hello``` 149 | 150 | ## **扩展集群** 151 | 我们可以想这样增加节点单元: 152 | ``` 153 | juju add-unit docker # creates unit docker/2, kubernetes/2, docker-flannel/2``` 154 | 155 | 156 | ## **运行“k8petsore”示例应用** 157 | 158 | [k8petstore示例](https://github.com/kubernetes/kubernetes/tree/master/examples/k8petstore)可以像一个[juju action](https://jujucharms.com/docs/devel/actions)获取到。 159 | ``` 160 | juju action do kubernetes-master/0``` 161 | 162 | 注意:这个示例既包含curl状态来练习这个应用。这个应用自动生成“prestore”日志写到redis上,并且允许你在浏览器上可视化吞吐量。 163 | 164 | ## **删除集群** 165 | ``` 166 | ./kube-down.sh``` 167 | 168 | 或者破坏你当前的Juju环境(使用```juju env```命令) 169 | ``` 170 | juju destroy-environment --force `juju env```` 171 | 172 | ## **更多信息** 173 | Kubernetes的分支和包可以在github.com的```kubernetes```项目中找到: 174 | * [镜像包](http://releases.k8s.io/HEAD/cluster/juju/bundles) 175 | * [Kubernetes主节点分支](https://github.com/kubernetes/kubernetes/tree/master/cluster/juju/charms/trusty/kubernetes-master) 176 | * [Kubernetes节点分支](https://github.com/kubernetes/kubernetes/blob/master/cluster/juju/charms/trusty/kubernetes) 177 | * [关于Juju的更多信息](https://jujucharms.com/) 178 | 179 | ### **云兼容** 180 | 181 | Juju运行在本地和各种公共云提供商。Juju当前和[Amazon Web Service](https://jujucharms.com/docs/stable/config-aws),[Windows Azure](https://jujucharms.com/docs/stable/config-azure),[DigitalOcean](https://jujucharms.com/docs/stable/config-digitalocean),[Google Compute Engine](https://jujucharms.com/docs/stable/config-gce),[HP Public Cloud](https://jujucharms.com/docs/stable/config-hpcloud),[Joyent](https://jujucharms.com/docs/stable/config-joyent),[LXC](https://jujucharms.com/docs/stable/config-LXC),任何[OpenStack](https://jujucharms.com/docs/stable/config-openstack)部署,[Vagrant](https://jujucharms.com/docs/stable/config-vagrant),和 [Vmware vSphere](https://jujucharms.com/docs/stable/config-vmware)。 182 | 183 | 如果你没有在多个云列表看到你比较喜欢的云供应商,可以配置为[手动配置](https://jujucharms.com/docs/stable/config-manual)。 184 | 185 | Kubernetes包已经在GCE和AWS上测试,使用1.0.0版本验证通过。 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | -------------------------------------------------------------------------------- /017-Racksepce.md: -------------------------------------------------------------------------------- 1 | # Racksapec上部署入门 2 | `译者:安雪艳` `校对:无` 3 | 4 | 内容列表 5 | * [入门介绍](#入门介绍) 6 | * [部署需求](#部署需求) 7 | * [供应商:Racksapce](#供应商:Racksapce) 8 | * [编译](#编译) 9 | * [集群](#集群) 10 | * [注意点:](#注意点:) 11 | * [网络设计](#网络设计) 12 | 13 | # **入门介绍** 14 | 15 | * 支持版本: v0.18.1 16 | 17 | 一般来说,Racksapce的dev-build-and-up.sh工作流程类似于Google Compute Engine。具体实现是不同的,因为Rackspace使用CoreOS, Rackspace云文件和整体网络设计。 18 | 19 | 这些脚本应该用于部署Kubernetes的开发环境。 如果你的账号利用RackConnect或者非标准的网络,若不修改这些脚本,这些脚本将无法使用。 20 | 21 | 注意: rackspace脚本不依赖```saltstack```而依赖于配置文件cloud-init。 22 | 23 | 当前集群设计受如下启发: 24 | 25 | * [corekube](https://github.com/metral/corekube) 26 | * [Angus Lees](https://github.com/anguslees/kube-openstack) 27 | 28 | # **部署需求** 29 | 30 | 1. Python2.7 31 | 2. 需要安装 ```nova```和```swiftly```。推荐使用python virtualenv来安装这些包。 32 | 3. 确认已经有与OpenStack APIs交互的合适的环境变量。获取更详细信息请查看 [Rackspace文档](http://docs.rackspace.com/servers/api/v2/cs-gettingstarted/content/section_gs_install_nova.html)。 33 | 34 | # **供应商:Rackspace** 35 | 36 | * 使用 ``` KUBERNETES_PROVIDER=rackspace```从源码编译自己的发布版本并且运行``` bash hack/dev-build-and-up.sh``` 37 | * 注意: 我们脚本中还没有提供get.k8s.io安装方法。 38 | * 请使用 ```export KUBERNETES_PROVIDER=rackspace; wget -q -O - https://get.k8s.io | bash```来安装Kubernetes最近发布版本 39 | 40 | # **编译** 41 | 42 | 1. Kubernetes二进制文件将通过```build/```下的的通用编译脚本编译。 43 | 2. 如果已经设置了环境变量```ENV KUBERNETES_PROVIDER=rackspace```, 脚本将上传```kubernetes-server-linux-amd64.tar.gz```到云文件。 44 | 3. 通过swiftly创建一个云文件容器,且在这个对象内启用一个临时URL。 45 | 4. 编译过的```kubernetes-server-linux-amd64.tar.gz```将上传到这个容器内,当master/nodes启动时这个URL将传到master/nodes。 46 | 47 | # **集群** 48 | 49 | 有一个特殊的```cluster/rackspace```脚本目录有如下步骤: 50 | 1. 创建一个云网络并且所有的实例附属于这个网络。 51 | * flanneld使用这个网络作为下一跳路由。这些路由使每个节点上的容器和这个私有网络内其他的容器之间通信。 52 | 2. 如果需要,将创建且上传一个SSH key。这个key必须用于ssh登录机器(我们不捕获密码) 53 | 3. 通过```nova``` CLI创建主节点server和额外节点。生成一个```cloud-config.yaml```作为户数据和整个系统的配置 54 | 4. 然后,我们通过```$NUM_MINIONS```定义的数量启动节点。 55 | 56 | # **注意点** 57 | 58 | * 脚本设置```eth2```成为云网络,容器可通过它通信。 59 | * ```config-default.sh```中条目的数量可通过环境变量覆盖。 60 | * 旧版本请选择: 61 | * 使用```git chechout v0.9```同步到```v0.9``` 62 | * 下载```snapshot of v0.9``` 63 | * 使用```git checkout v0.3```同步到```v0.3``` 64 | * 下载```snapshot of v0.3``` 65 | 66 | # **网络设计** 67 | 68 | * eth0 - servers/containers访问网络的公有接口 69 | * eth1 - ServiceNet - 集群内部通信 (k8s, etcd, etc) 通过这个接口。```cloud-config```文件使用特殊CoreOS标识符```$ private_ipv4```配置服务 70 | * eth2 - Cloud Network - k8s pods使用这个和其他pods通信。服务代理通过这个接口传输流量。 71 | -------------------------------------------------------------------------------- /019-CloudStack.md: -------------------------------------------------------------------------------- 1 | # CloudStack入门指南 2 | `译者:tiger` `校对:无` 3 | 4 | **内容列表** 5 | 6 | - [介绍](#introduction) 7 | - [前提条件](#prerequisites) 8 | - [克隆脚本](#clone-the-playbook) 9 | - [创建一个 Kubernetes 集群](#create-a-kubernetes-cluster) 10 | 11 | ### 简介 12 | 13 | [CloudStack](http://cloudstack.apache.org)是一个用于构建基于硬件虚拟化的公有云和私有云(传统IaaS)的软件。在 CloudStack 上部署 Kubernetes 有好几种方法,需要根据 CloudStack 所使用的哪种云和有哪些可用镜像来决定。 例如[ Exoscale ](http://exoscale.ch)就提供了一个[ coreOS ](http://coreos.com)的可用模版,因此也可以使用在 coreOS 部署 Kubernetes 的指令来部署。 CloudStack 同样也提供了一个 Vagrant 插件,因此也可以用 Vagrant 来部署 Kubernetes ,既可以选择原有的基于 shell 脚本的部署方式,也可以选择新的基于 Salt 的部署方式。 14 | 15 | CloudStack的[ CoreOS ](http://coreos.com)模版会[每日](http://stable.release.core-os.net/amd64-usr/current/)构建。 在执行安装 Kubernetes 部署指令之前需要先将模版[注册](http://docs.cloudstack.apache.org/projects/cloudstack-administration/en/latest/templates.html)到云上。 16 | 17 | 本指引使用了[Ansible playbook](https://github.com/runseb/ansible-kubernetes)。 18 | 完全自动化构建,单个 Kubernetes 部署脚本基于 coreOS [指令](coreos/coreos_multinode_cluster.md)构建。 19 | 20 | 21 | [Ansible](http://ansibleworks.com) 脚本基于 coreOS 镜像将 Kubernetes 部署到 CloudStack 基础云上。 该脚本创建一个SSH密钥对、一个安全组和相关规则并最终通过云初始化配置来启动coreOS实例。 22 | 23 | ### 前提条件 24 | 25 | $ sudo apt-get install -y python-pip 26 | $ sudo pip install ansible 27 | $ sudo pip install cs 28 | 29 | [_cs_](https://github.com/exoscale/cs) 是一个 CloudStack API 的 python 模块。 30 | 31 | 可以通过使用API密钥和HTTP的方式来配置CloudStack终端。 32 | 33 | 你可以将它们定义成环境变量: `CLOUDSTACK_ENDPOINT`, `CLOUDSTACK_KEY`, `CLOUDSTACK_SECRET` 和 `CLOUDSTACK_METHOD`. 34 | 35 | 或者通过创建 `~/.cloudstack.ini`文件的方式: 36 | 37 | [cloudstack] 38 | endpoint = 39 | key = 40 | secret = 41 | method = post 42 | 43 | 我们需要使用 http POST 请求来将 _large_ 用户的数据上传到各个coreOS实例。 44 | 45 | ### 克隆脚本 46 | 47 | $ git clone --recursive https://github.com/runseb/ansible-kubernetes.git 48 | $ cd ansible-kubernetes 49 | 50 | [ansible-cloudstack](https://github.com/resmo/ansible-cloudstack) 模块被设置成了该仓库的一个子模块,因此需要使用`--recursive`。 51 | ### 创建一个 Kubernetes 集群 52 | 53 | 你只需要简单运行如下脚本。 54 | 55 | $ ansible-playbook k8s.yml 56 | 57 | 编辑`k8s.yml`文件中的一些变量。 58 | 59 | vars: 60 | ssh_key: k8s 61 | k8s_num_nodes: 2 62 | k8s_security_group_name: k8s 63 | k8s_node_prefix: k8s2 64 | k8s_template: Linux CoreOS alpha 435 64-bit 10GB Disk 65 | k8s_instance_type: Tiny 66 | 67 | 它将启动一个 Kubernetes 主机和一些计算节点(默认为2个)。`instance_type`和`template`默认指定的是 [exoscale](http://exoscale.ch),编辑这两个参数来指定你CloudStack云的模板和实例类型(即服务提供商)。 68 | 69 | 如果你想修改一些其他参数的话,请参照`roles/k8s`里面的任务和模版。 70 | 71 | 一旦脚本执行完成,命令行会打印出Kubernetes主机的IP地址: 72 | 73 | TASK: [k8s | debug msg='k8s master IP is {{ k8s_master.default_ip }}'] ******** 74 | 75 | 使用 _core_ 用户和刚创建的密钥通过ssh登录到主机,你可以列出集群中的所有机器: 76 | 77 | $ ssh -i ~/.ssh/id_rsa_k8s core@ 78 | $ fleetctl list-machines 79 | MACHINE IP METADATA 80 | a017c422... role=node 81 | ad13bf84... role=master 82 | e9af8293... role=node 83 | -------------------------------------------------------------------------------- /020-VMware.md: -------------------------------------------------------------------------------- 1 | #vSphere的入门指南 2 | `译者:tiger` `校对:无` 3 | 4 | 5 | 下面的示例使用了4个虚拟工作节点和1个虚拟主机(即集群中一共有5台虚拟机)来创建一个Kubernetes集群。集群是通过你的工作站(或任何你觉得方便的地方)来安装和控制的。 6 | 7 | **内容列表** 8 | 9 | - [前提条件](#prerequisites) 10 | - [安装](#setup) 11 | - [启动集群](#starting-a-cluster) 12 | - [其他:部署失败调试](#extra-debugging-deployment-failure) 13 | 14 | ### 前提条件 15 | 16 | 1. 需要有一台ESXi机器或vCenter实例的管理员权限。 17 | 2. 需要先安装Go(1.2或以上版本)。下载地址: [www.golang.org](http://www.golang.org). 18 | 3. 需要在环境变量中添加`GOPATH`并将`$GOPATH/bin` 添加到`PATH`中。 19 | 20 | ```sh 21 | export GOPATH=$HOME/src/go 22 | mkdir -p $GOPATH 23 | export PATH=$PATH:$GOPATH/bin 24 | ``` 25 | 26 | 4. 安装govc工具来和ESXi/vCenter进行交互: 27 | 28 | ```sh 29 | go get github.com/vmware/govmomi/govc 30 | ``` 31 | 32 | 5. 需要预先下载或编译[二进制版本](binary_release.md) 33 | 34 | ### Setup 35 | 36 | 下载一个预置了Debian 7.7 的VMDK,把它作为基础镜像来使用: 37 | 38 | ```sh 39 | curl --remote-name-all https://storage.googleapis.com/govmomi/vmdk/2014-11-11/kube.vmdk.gz{,.md5} 40 | md5sum -c kube.vmdk.gz.md5 41 | gzip -d kube.vmdk.gz 42 | ``` 43 | 44 | 将VMDK导入vSphere中: 45 | 46 | ```sh 47 | export GOVC_URL='user:pass@hostname' 48 | export GOVC_INSECURE=1 # If the host above uses a self-signed cert 49 | export GOVC_DATASTORE='target datastore' 50 | export GOVC_RESOURCE_POOL='resource pool or cluster with access to datastore' 51 | 52 | govc import.vmdk kube.vmdk ./kube/ 53 | ``` 54 | 55 | 验证VMDK是否已经正确上传并扩展到~3GiB: 56 | 57 | ```sh 58 | govc datastore.ls ./kube/ 59 | ``` 60 | 61 | 检查文件`cluster/vsphere/config-common.sh`是否已经配置了必填参数。该导入镜像的游客登录帐号为`kube:kube`。 62 | 63 | ### 启动集群 64 | 65 | 现在继续部署Kubernetes。整个过程需要大约10分钟。 66 | 67 | ```sh 68 | cd kubernetes # Extracted binary release OR repository root 69 | export KUBERNETES_PROVIDER=vsphere 70 | cluster/kube-up.sh 71 | ``` 72 | 73 | 参见根目录下的README和《谷歌计算引擎入门指南》。一旦你成功到达了这一步,你的vSphere Kubernetes就可以像其他Kubernetes集群一样正常工作了。 74 | 75 | **开始享受Kubernetes之旅吧!** 76 | 77 | ### 其他:部署失败调试 78 | 79 | `kube-up.sh`输出可以查看部署集群中各个虚拟机的ip地址,你可以用`kube`账户登录到任何虚拟机上查看并找出到底发生了什么状况。(通过你的SSH密钥或密码'kube'来登录) 80 | -------------------------------------------------------------------------------- /021-juju.md: -------------------------------------------------------------------------------- 1 | # 从juju开始 2 | 3 | [Juju](https://jujucharms.com/docs/stable/about-juju)可以通过扩展,安装和配置集群内的所有系统从而实现简易部署Kubernetes。 4 | 一旦部署完毕,集群可以轻松支持单命令扩展集群大小。 5 | 6 | ## 前提条件 7 | 8 | > 注意: 如果你在Ubuntu上运行kube-up,所有的相关依赖的安装都会被相对应处理。你可以放心越过章节[运行 9 | > Kubernetes集群](#运行Kubernetes集群)的阅读。 10 | 11 | ### Ubuntu上 12 | 13 | 在你的本地Ubuntu系统上安装[安装Juju客户端](https://jujucharms.com/get-started): 14 | 15 | `sudo add-apt-repository ppa:juju/stable` 16 | `sudo apt-get update` 17 | `sudo apt-get install juju-core juju-quickstart` 18 | 19 | 20 | ### 使用Docker 21 | 如果你不使用Ubuntu或者你倾向于Docker,你可以是用以下命令命令: 22 | 23 | `mkdir ~/.juju` 24 | `sudo docker run -v ~/.juju:/home/ubuntu/.juju -ti jujusolutions/jujubox:latest` 25 | 26 | 到这里你不可避免的要需要使用`juju quickstart`命令。 27 | 为你的云环境创建登入信息: 28 | 29 | `juju quickstart --constraints="mem=3.75G" -i` 30 | 31 | > `constraints`参数是可选项,它用来决定Juju所新建的虚拟机的内存大小。相比较性能越强的虚拟机会占用更多资> 源,造成更高开销。 32 | 根据接下来的提示选择`save`和`use`。Quickstart将会引导创建Juju根节点并建立Juju的用户网页界面。 33 | 34 | ## 运行Kubernetes集群 35 | 你需要在启动集群前设置`KUBERNETES_PROVIDER`的环境变量。 36 | 37 | `export KUBERNETES_PROVIDER=juju` 38 | ` cluster/kube-up.sh` 39 | 40 | 如果是你第一次运行`kube-up.sh`脚本,这个脚本会安装所依赖的程序,并运行一个配置向导来让你选择你的云服务商和登入信息。 41 | 42 | 下一步它将会部署Kubernetes主节点,etc和2个基于Flannel的Software Defined Networking (SDN)节点,从而支持容器间的相互通信。 43 | 44 | ## 发现集群 45 | `juju status`命令提供集群内每一个部署单元的信息: 46 | 47 | $ juju status --format=oneline 48 | - docker/0: 52.4.92.78 (started) 49 | - flannel-docker/0: 52.4.92.78 (started) 50 | - kubernetes/0: 52.4.92.78 (started) 51 | - docker/1: 52.6.104.142 (started) 52 | - flannel-docker/1: 52.6.104.142 (started) 53 | - kubernetes/1: 52.6.104.142 (started) 54 | - etcd/0: 52.5.216.210 (started) 4001/tcp 55 | - juju-gui/0: 52.5.205.174 (started) 80/tcp, 443/tcp 56 | - kubernetes-master/0: 52.6.19.238 (started) 8080/tcp 57 | 58 | 你可以使用`juju ssh`来访问任意单元: 59 | 60 | ` juju ssh kubernetes-master/0` 61 | 62 | 63 | ## 运行一些容器! 64 | 65 | 在主节点上你可以找到`kubectl`。我们使用ssh登入主节点来启动一些容器,当然你也可以设置`KUBERNETES_MASTER`为"kubernetes-master/0”的IP地址,从而在本地使用`kubectl`。 66 | 67 | 在启动容器前pods是不会存在的: 68 | 69 | kubectl get pods 70 | NAME READY STATUS RESTARTS AGE 71 | 72 | kubectl get replicationcontrollers 73 | CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS 74 | 75 | 我们依照aws-coreos这个例子。创建一个pod的manifest: `pod.json` 76 | 77 | ``` 78 | json 79 | { 80 | "apiVersion": "v1", 81 | "kind": "Pod", 82 | "metadata": { 83 | "name": "hello", 84 | "labels": { 85 | "name": "hello", 86 | "environment": "testing" 87 | } 88 | }, 89 | "spec": { 90 | "containers": [{ 91 | "name": "hello", 92 | "image": "quay.io/kelseyhightower/hello", 93 | "ports": [{ 94 | "containerPort": 80, 95 | "hostPort": 80 96 | }] 97 | }] 98 | } 99 | } 100 | ``` 101 | 102 | 用kubectl建立pod: 103 | 104 | `kubectl create -f pod.json` 105 | 106 | 107 | 获取pod信息: 108 | 109 | `kubectl get pods` 110 | 111 | 让我们来测试一个hello应用。首先让我们找到这个容器运行在哪个节点上。Juju是个更好和容器交互的工具,我们可以用`juju run`和`juju status` 到到这个hello应用。 112 | 113 | 退出ssh并运行: 114 | juju run --unit kubernetes/0 "docker ps -n=1" 115 | ... 116 | juju run --unit kubernetes/1 "docker ps -n=1" 117 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 118 | 02beb61339d8 quay.io/kelseyhightower/hello:latest /hello About an hour ago Up About an hour k8s_hello.... 119 | 120 | 121 | 我们可以看到容器运行在”kubernetes/1”上, 我们可以打开端口80: 122 | 123 | juju run --unit kubernetes/1 "open-port 80" 124 | juju expose kubernetes 125 | sudo apt-get install curl 126 | curl $(juju status --format=oneline kubernetes/1 | cut -d' ' -f3) 127 | 128 | 最后删除pod: 129 | 130 | juju ssh kubernetes-master/0 131 | kubectl delete pods hello 132 | 133 | 134 | ## 扩展集群 135 | 我们可以用如下命令来添加节点单元: 136 | 137 | juju add-unit docker # creates unit docker/2, kubernetes/2, docker-flannel/2 138 | 139 | ## 运行”k8petstore”示例应用 140 | 141 | 示例[k8petstore example](../../examples/k8petstore/)是一个现成的 142 | [juju action](https://jujucharms.com/docs/devel/actions)。 143 | 144 | juju action do kubernetes-master/0 145 | 146 | > 注意: 这个示例包括的curl自动生成"petstore”的商品交易,这些交易储存在Redia中,并在网页上显示交易流量 147 | > 大小。 148 | 149 | ## 拆除集群 150 | 151 | ./kube-down.sh 152 | 153 | 或者拆除目前整个Juju环境(使用`juju env`命令): 154 | 155 | juju destroy-environment --force `juju env` 156 | 157 | 158 | ## 更多信息 159 | 你可以github.com的`kubernetes`项目里找到Kubernetes的charms和bundles: 160 | 161 | - [Bundle Repository](http://releases.k8s.io/HEAD/cluster/juju/bundles) 162 | * [Kubernetes master charm](../../cluster/juju/charms/trusty/kubernetes-master/) 163 | * [Kubernetes node charm](../../cluster/juju/charms/trusty/kubernetes/) 164 | - [More about Juju](https://jujucharms.com) 165 | 166 | 167 | ### 云环境的兼容性 168 | Juju已经在不同的公有云测试过了。目前Juju测试过的云平台是[Amazon Web Service](https://jujucharms.com/docs/stable/config-aws), 169 | [Windows Azure](https://jujucharms.com/docs/stable/config-azure), 170 | [DigitalOcean](https://jujucharms.com/docs/stable/config-digitalocean), 171 | [Google Compute Engine](https://jujucharms.com/docs/stable/config-gce), 172 | [HP Public Cloud](https://jujucharms.com/docs/stable/config-hpcloud), 173 | [Joyent](https://jujucharms.com/docs/stable/config-joyent), 174 | [LXC](https://jujucharms.com/docs/stable/config-LXC), any 175 | [OpenStack](https://jujucharms.com/docs/stable/config-openstack) deployment, 176 | [Vagrant](https://jujucharms.com/docs/stable/config-vagrant), and 177 | [Vmware vSphere](https://jujucharms.com/docs/stable/config-vmware). 178 | 179 | 如果你没有在列表里发现合适你的云服务提供商,许多云服务是可以通过[manual provisioning](https://jujucharms.com/docs/stable/config-manual)手动设置的。 180 | 181 | Kubernetes 182 | Kubernetes安装集成包已经在GCE和AWS上测试过了,版本1.0.0可以正常工作。 -------------------------------------------------------------------------------- /022-libvirt_CoreOS.md: -------------------------------------------------------------------------------- 1 | # libvirt CoreOS的入门指南 2 | `译者:mr.art` `校对:无` 3 | 4 | 5 | ## 亮点 6 | 7 | 1. 超高速启动集群(几秒钟,而不是几分钟的游离状态) 8 | 2. 使用COW来节省磁盘使用空间 9 | 3. 使用KSM来节省内存占用空间 10 | 11 | ## 环境准备 12 | 13 | 1. 安装dnsmasq 14 | 2. 安装ebtables 15 | 3. 安装qemu 16 | 4. 安装libvirt 17 | 5. 启用和启动libvirt守护进程,例如: 18 | * systemctl enable libvirtd 19 | * systemctl start libvirtd 20 | 6. [开启libvirt接入的用户权限](https://libvirt.org/aclpolkit.html) 21 | 7. 确保qemu用户可以使用$HOME 22 | 在分布式环境中,libvirt的接入默认被拒绝或者每次接入需要密码。 23 | 可以使用如下命令进行测试: 24 | ```virsh -c qemu:///system pool-list``` 25 | 如果接入报错,请阅读https://libvirt.org/acl.html 和https://libvirt.org/aclpolkit.html。 26 | 简而言之,如果libvirt是在包含Polkit的环境下编译(例如:Arch, Fedora 21),可以创建内容如下/etc/polkit-1/rules.d/50-org.libvirt.unix.manage.rules文件来给libvirt接入所有用户的权限 27 | sudo /bin/sh -c "cat - > /etc/polkit-1/rules.d/50-org.libvirt.unix.manage.rules" << EOF 28 | polkit.addRule(function(action, subject) { 29 | if (action.id == "org.libvirt.unix.manage" && 30 | subject.user == "$USER") { 31 | return polkit.Result.YES; 32 | polkit.log("action=" + action); 33 | polkit.log("subject=" + subject); 34 | } 35 | }); 36 | EOF 37 | ($USER为你的登陆用户名) 38 | 如果libvirt在不包含Polkit的环境下编译(例如:14.04.1 LTS),检查libvirt unix socket的使用权限: 39 | ```$ ls -l /var/run/libvirt/libvirt-sock 40 | srwxrwx--- 1 root libvirtd 0 févr. 12 16:03 /var/run/libvirt/libvirt-sock 41 | $ usermod -a -G libvirtd $USER 42 | $USER needs to logout/login to have the new group be taken into account``` 43 | Qemu是以一个具体的用户运行,他必须能接入到VMs驱动中。 44 | 所有的虚拟机都需要磁盘驱动器(CoreOS disk image, Kubernetes binaries, cloud-init files, 等等.),这些驱动都放入到./cluster/libvirt-coreos/libvirt_storage_pool中。 45 | 如果你的$HOME是可以读的,那么一起都好。如果你的$HOME是私有的,那么脚本cluster/kube-up.sh将会报如下错误: 46 | ```error: Cannot access storage file '$HOME/.../kubernetes/cluster/libvirt-coreos/libvirt_storage_pool/kubernetes_master.img' (as uid:99, gid:78): Permission denied``` 47 | 可以通过如下方法修复这个问题: 48 | * 在cluster/libvirt-coreos/config-default.sh中设置POOL_PATH到一个目录: 49 | * 在文件系统找一个有大量空闲的磁盘空间 50 | * 这个目录你的用户具有可写权限 51 | * qemu用户可以接入 52 | * 允许你的qemu用户可以接入到所有的存储池 53 | 设置访问权限: 54 | ```setfacl -m g:kvm:--x ~``` 55 | 56 | ## 安装 57 | 在默认的情况下,libvirt-coreos将创建一个 Kubernetes master和3个Kubernetes nodes。因为VM的驱动用了COW和由于内存释放和KSM,有许多的资源被过度的分配。 58 | 开始运行你的本地cluster,打开一个shell并且运行: 59 | ```cd kubernetes 60 | export KUBERNETES_PROVIDER=libvirt-coreos 61 | cluster/kube-up.sh``` 62 | 63 | 64 | -------------------------------------------------------------------------------- /023-oVirt.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/023-oVirt.md -------------------------------------------------------------------------------- /024-libvirt or KVM.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/024-libvirt or KVM.md -------------------------------------------------------------------------------- /025-Offline.md: -------------------------------------------------------------------------------- 1 | # 离线安装(使用裸机和CoreOS系统) 2 | `译者:林帆` `校对:无` 3 | 4 | 5 | 这个部分将介绍在CoreOS上运行Kubernetes的方法。比较特别的是,我们将关注于如何在离线的情况下完成部署操作,这对于进行概念验证和在访问受限的网络环境时,都将派上用场。 6 | 7 | 内容目录: 8 | 9 | - 前提条件 10 | - 总体设计思路 11 | - 示例环境 12 | - 构建CentOS的PXELINUX服务端 13 | - 添加CoreOS系统到PXE 14 | - 配置DHCP服务 15 | - 部署Kubernetes 16 | - CoreOS的Cloudinit启动配置 17 | - master.yml 18 | - node.yml 19 | - 新建pxelinux.cfg文件 20 | - 指定pxelinux目标 21 | - 创建测试的Pod 22 | - 用于调试的指令 23 | 24 | ## 前提条件 25 | 26 | 1. 已经有一个主机安装有运行着PXE服务端的CentOS6系统 27 | 2. 至少有两个裸机主机节点 28 | 29 | ## 总体设计思路 30 | 31 | - 通过TFTP服务管理以下目录 32 | - /tftpboot/(coreos)(centos)(RHEL) 33 | - /tftpboot/pxelinux.0/(MAC) -> 链接到Linux镜像中的config文件 34 | - 将PXELinux的链接更新到正确状态 35 | - 将DHCP服务配置根据实际主机需求更新到正确状态 36 | - 构建部署CoreOS的主机节点,并运行Etcd的集群 37 | - 在不使用公有网络的情况下完成后续配置 38 | - 部署更多的CoreOS节点作为Kubernetes的Node节点 39 | 40 | ## 示例环境 41 | 42 | | 节点 | MAC | IP | 43 | | --- |:---:| ---:| 44 | | CoreOS/etcd/Kubernetes Master | d0:00:67:13:0d:00 | 10.20.30.40 | 45 | | CoreOS Slave 1 | d0:00:67:13:0d:01 | 10.20.30.41 | 46 | | CoreOS Slave 2 | d0:00:67:13:0d:02 | 10.20.30.42 | 47 | 48 | ## 构建CentOS的PXELINUX服务端 49 | 50 | 完整的构建CentOS PXELinux环境方法参见[这篇文档](http://docs.fedoraproject.org/en-US/Fedora/7/html/Installation_Guide/ap-pxe-server.html)。下面简单叙述这个流程: 51 | 52 | 1. 安装CentOS上所需的包:
53 | 54 | `sudo yum install tftp-server dhcp syslinux` 55 | 2. 编辑TFTP服务配置,将`disable`一项修改为`no`:
56 | 57 | `vi /etc/xinetd.d/tftp` 58 | 3. 拷贝所需的syslinux镜像文件
59 | 60 | ``` 61 | su - 62 | mkdir -p /tftpboot 63 | cd /tftpboot 64 | cp /usr/share/syslinux/pxelinux.0 /tftpboot 65 | cp /usr/share/syslinux/menu.c32 /tftpboot 66 | cp /usr/share/syslinux/memdisk /tftpboot 67 | cp /usr/share/syslinux/mboot.c32 /tftpboot 68 | cp /usr/share/syslinux/chain.c32 /tftpboot 69 | /sbin/service dhcpd start 70 | /sbin/service xinetd start 71 | /sbin/chkconfig tftp on 72 | ``` 73 | 4. 生成默认的启动菜单 74 | 75 | ``` 76 | mkdir /tftpboot/pxelinux.cfg 77 | touch /tftpboot/pxelinux.cfg/default 78 | ``` 79 | 5. 编辑启动菜单`vi /tftpboot/pxelinux.cfg/default`,内容如下: 80 | 81 | ``` 82 | default menu.c32 prompt 0 timeout 15 ONTIMEOUT local display boot.msg 83 | MENU TITLE Main Menu 84 | LABEL local MENU LABEL Boot local hard drive LOCALBOOT 0 85 | ``` 86 | 现在你就已经有了一个可以用于构建CoreOS节点的PXELinux服务了,可以通过本地的VirtualBox虚拟机或裸机上验证这个服务。 87 | 88 | ## 添加CoreOS系统到PXE 89 | 90 | 91 | ## 配置DHCP服务 92 | ## 部署Kubernetes 93 | ## CoreOS的Cloudinit启动配置 94 | ### master.yml 95 | ### node.yml 96 | ## 新建pxelinux.cfg文件 97 | ## 指定pxelinux目标 98 | ## 创建测试的Pod 99 | ## 用于调试的指令 100 | -------------------------------------------------------------------------------- /027-fedora_single_node.md: -------------------------------------------------------------------------------- 1 | # 从Ferdora入门Kubernetes 2 | `译者:张以法` `校对:无` 3 | 4 | -------------------------- 5 | 本节内容 6 | 7 | - [前提条件](#前提条件) 8 | - [说明](#说明) 9 | 10 | ## 前提条件 11 | 12 | 1. 你需要2台或以上安装有Fedora的机器 13 | 14 | ## 说明 15 | 本文是针对[Fedora](http://fedoraproject.org/)系统的Kubernetes入门教程。通过手动配置,你将会理解所有底层的包、服务、端口等。 16 | 17 | 本文只会让一个节点(之前称从节点)工作。多节点需要在Kubernetes之外配置一个可用的[网络环境](http://kubernetes.io/v1.0/docs/admin/networking.html),尽管这个额外的配置条件是显而易见的,(本节也不会去配置)。 18 | 19 | Kubernetes包提供了一些服务:kube-apiserver,kube-scheduler,kube-controller-manager,kubelet,kube-proxy。这些服务通过systemd进行管理,配置信息都集中存放在一个地方:/etc/kubernetes。我们将会把这些服务运行到不同的主机上。第一台主机,fed-master,将是Kubernetes的master主机。这台机器上将运行kube-apiserver,kube-controller-manager和kube-scheduler这几个服务,此外,master主机上还将运行etcd(如果etcd运行在另一台主机上,那就不需要了,本文假设etcd和Kubernetesmaster运行在同一台主机上)。其余的主机,fed-node,将是从节点,上面运行kubelet, proxy和docker。 20 | 21 | 系统信息: 22 | 23 | 主机: 24 | 25 | ```sh 26 | fed-master = 192.168.121.9 27 | fed-node = 192.168.121.65 28 | ``` 29 | 30 | 准备主机: 31 | 32 | - 在所有主机上(fed-master和fed-node)都安装Kubernetes,。这对docker也适用。在fed-master上安装etcd。本文在kubernetes-0.18及之后版本上通过测试。 33 | - yum命令之后的 [--enablerepo=update-testing](https://fedoraproject.org/wiki/QA:Updates_Testing) 参数可以保证安装最新的Kubernetes预览版。如果不加这个参数,你安装的版本将是Fedora提供的较旧的稳定版。 34 | - 如果你想获取最新的版本,你可以[从Fedora Koji上下载最新的RPM包](http://koji.fedoraproject.org/koji/packageinfo?packageID=19202),然后yum install安装。而不是用下面的命令。 35 | 36 | ```sh 37 | yum -y install --enablerepo=updates-testing kubernetes 38 | ``` 39 | 40 | - 安装etcd和iptables 41 | 42 | ```sh 43 | yum -y install etcd iptables 44 | ``` 45 | 46 | - 在所有主机的/etc/hosts文件中加入master和node节点,如果DNS中已经有了主机名,就不需要加了。需要保证fed-master和fed-node之间可以正常通信,可使用ping测试网络是否连通。 47 | 48 | ```sh 49 | echo "192.168.121.9 fed-master 50 | 192.168.121.65 fed-node" >> /etc/hosts 51 | ``` 52 | 53 | - 编辑/etc/kubernetes/config文件,加入以下内容。所有主机都是(包括master和node)。 54 | 55 | ```sh 56 | # Comma separated list of nodes in the etcd cluster 57 | KUBE_MASTER="--master=http://fed-master:8080" 58 | 59 | # logging to stderr means we get it in the systemd journal 60 | KUBE_LOGTOSTDERR="--logtostderr=true" 61 | 62 | # journal message level, 0 is debug 63 | KUBE_LOG_LEVEL="--v=0" 64 | 65 | # Should this cluster be allowed to run privileged docker containers 66 | KUBE_ALLOW_PRIV="--allow_privileged=false" 67 | ``` 68 | 69 | - 禁用master和node上的防火墙,因为如果有其他防火墙规则管理工具的话,docker会无法正常运行。请注意以默认方式安装的fedora服务器上,iptables服务并不存在。 70 | 71 | ```sh 72 | systemctl disable iptables-services firewalld 73 | systemctl stop iptables-services firewalld 74 | ``` 75 | 76 | 配置master主机上Kubernetes服务 77 | 78 | - 按照下面的示例编辑/etc/kubernetes/apiserver文件。注意--service-cluster-ip-range参数后跟的IP地址必须是在任何地方都未使用的地址段,这些地址无需路由也无需分配到任何东西上。 79 | 80 | ```sh 81 | # The address on the local server to listen to. 82 | KUBE_API_ADDRESS="--address=0.0.0.0" 83 | 84 | # Comma separated list of nodes in the etcd cluster 85 | KUBE_ETCD_SERVERS="--etcd_servers=http://127.0.0.1:4001" 86 | 87 | # Address range to use for services 88 | KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" 89 | 90 | # Add your own! 91 | KUBE_API_ARGS="" 92 | ``` 93 | 94 | - 编辑/etc/etcd/etcd.conf文件,使得etcd监听除了127.0.0.1之外的所有IP,如果没有做这步,将会产生“connection refused”这样的错误。 95 | 96 | ```sh 97 | ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:4001 98 | ``` 99 | 100 | - 启动master上恰当的服务 101 | 102 | ```sh 103 | for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler;do 104 | systemctl restart $SERVICES 105 | systemctl enable $SERVICES 106 | systemctl status $SERVICES 107 | done 108 | ``` 109 | 110 | - 添加node结点: 111 | 112 | 113 | - 在Kubernetes的master上创建下面node.json文件: 114 | 115 | ```json 116 | { 117 | "apiVersion": "v1", 118 | "kind": "Node", 119 | "metadata": { 120 | "name": "fed-node", 121 | "labels":{ "name": "fed-node-label"} 122 | }, 123 | "spec": { 124 | "externalID": "fed-node" 125 | } 126 | } 127 | ``` 128 | 129 | 现在在你的Kubernetes集群内部创建一个node对象,执行命令 130 | 131 | ```sh 132 | $ kubectl create -f ./node.json 133 | 134 | $ kubectl get nodes 135 | NAME LABELS STATUS 136 | fed-node name=fed-node-label Unknown 137 | ``` 138 | 139 | 请注意上面的命令,它只在内部创建了一个fed-node的引用(原文representation),并不会真的提供fed-node节点。同时,假定fed-node节点(在name中指定的)能够被解析并可从Kubernetes的master节点访问。下面本文将论述如何提供Kubernetes node节点(fed-node)。 140 | 141 | 配置node节点上的Kubernetes服务 142 | 143 | 我们需要在节点上配置kubelet 144 | 145 | - 按照下面的示例编辑/etc/kubernetes/kubelet文件: 146 | 147 | ```sh 148 | ### 149 | # Kubernetes kubelet (node) config 150 | 151 | # The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces) 152 | KUBELET_ADDRESS="--address=0.0.0.0" 153 | 154 | # You may leave this blank to use the actual hostname 155 | KUBELET_HOSTNAME="--hostname_override=fed-node" 156 | 157 | # location of the api-server 158 | KUBELET_API_SERVER="--api_servers=http://fed-master:8080" 159 | 160 | # Add your own! 161 | #KUBELET_ARGS="" 162 | ``` 163 | 164 | - 启动节点上(fed-node)上恰当的服务 165 | 166 | ```sh 167 | for SERVICES in kube-proxy kubelet docker; do 168 | systemctl restart $SERVICES 169 | systemctl enable $SERVICES 170 | systemctl status $SERVICES 171 | done 172 | ``` 173 | 174 | - 检测以确认现在集群中fed-master能够看到fed-node,而且状态变为Ready了 175 | 176 | ```sh 177 | kubectl get nodes 178 | NAME LABELS STATUS 179 | fed-node name=fed-node-label Ready 180 | ``` 181 | 182 | - 节点的删除 183 | 如果要想从Kubernetes集群中删除fed-node节点,需要在fed-master上执行下面命令(请别这样做,只是提示删除的方法) 184 | 185 | ```sh 186 | kubectl delete -f ./node.json 187 | ``` 188 | 189 | 你应该完成了吧! 190 | 191 | 集群现在应该在运行了,启动一个用于测试的Pod吧。 192 | 193 | 你应该有一个可用的集群,查看[101](http://kubernetes.io/v1.0/docs/user-guide/walkthrough/README.html)节! 194 | 195 | -------------------------------------------------------------------------------- /029-centos_manual_config.md: -------------------------------------------------------------------------------- 1 | # 从CentOS入门Kubernetes 2 | `译者:张以法` `校对:无` 3 | 4 | ------------------------- 5 | 本节内容 6 | 7 | - [前提条件](#前提条件) 8 | - [启动一个集群](#启动一个集群) 9 | 10 | ## 前提条件 ## 11 | 你需要2台或以上安装有[CentOS](http://centos.org/)的机器 12 | 13 | ## 启动一个集群 ## 14 | 本文是针对CentOS系统的Kubernetes入门教程。通过手动配置,你将会理解所有底层的包、服务、端口等。 15 | 16 | 本文只会让一个节点工作。多节点需要在Kubernetes之外配置一个可用的的[网络环境](http://kubernetes.io/v1.0/docs/admin/networking.html),尽管这个额外的配置条件是显而易见的,(本节也不会去配置)。 17 | 18 | Kubernetes包提供了一些服务:kube-apiserver, kube-scheduler, kube-controller-manager, kubelet, kube-proxy。这些服务通过systemd进行管理,配置信息都集中存放在一个地方:/etc/kubernetes。我们将会把这些服务运行到不同的主机上。第一台主机,centos-master,将是Kubernetes 集群的master主机。这台机器上将运行kube-apiserver, kube-controller-manager和kube-scheduler这几个服务,此外,master主机上还将运行etcd。其余的主机,fed-minion,将是从节点,将会运行kubelet, proxy和docker。 19 | 20 | 系统信息: 21 | 22 | 主机: 23 | 24 | ```sh 25 | centos-master = 192.168.121.9 26 | centos-minion = 192.168.121.65 27 | ``` 28 | 29 | 准备主机: 30 | 31 | - 添加virt7-testing源,在所有主机上(centos-master和centos-minion),使用下面信息添加源: 32 | 33 | ```sh 34 | [virt7-testing] 35 | name=virt7-testing 36 | baseurl=http://cbs.centos.org/repos/virt7-testing/x86_64/os/ 37 | gpgcheck=0 38 | ``` 39 | 40 | - 在所有主机上(centos-master和centos-minion)都安装Kubernetes。这对etcd,docker和cadvisor也适用。 41 | 42 | ```sh 43 | yum -y install --enablerepo=virt7-testing kubernetes 44 | ``` 45 | 46 | *注意使用etcd-0.4.6-7(这是该文档的临时版本) 47 | 48 | 如果你没有配套virt7-testing源安装etcd 0.4.6-7版,请用下面命令卸载它: 49 | 50 | ```sh 51 | yum erase etcd 52 | ``` 53 | 54 | 原因是在当前的的 virt7-testing源中,etcd包被更新了,会引起服务错误。 55 | 执行下面两行命令安装etcd-0.4.6-7 56 | 57 | ```sh 58 | yum install http://cbs.centos.org/kojifiles/packages/etcd/0.4.6/7.el7.centos/x86_64/etcd-0.4.6-7.el7.centos.x86_64.rpm 59 | yum -y install --enablerepo=virt7-testing kubernetes 60 | ``` 61 | 62 | - 在所有主机的/etc/hosts文件中加入master和node节点,如果DNS中已经有了主机名,就不需要加了。 63 | 64 | ```sh 65 | echo "192.168.121.9 centos-master 66 | 192.168.121.65 centos-minion" >> /etc/hosts 67 | ``` 68 | 69 | - 编辑/etc/kubernetes/config文件,加入以下内容: 70 | 71 | ```sh 72 | # Comma separated list of nodes in the etcd cluster 73 | KUBE_ETCD_SERVERS="--etcd_servers=http://centos-master:4001" 74 | 75 | # logging to stderr means we get it in the systemd journal 76 | KUBE_LOGTOSTDERR="--logtostderr=true" 77 | 78 | # journal message level, 0 is debug 79 | KUBE_LOG_LEVEL="--v=0" 80 | 81 | # Should this cluster be allowed to run privileged docker containers 82 | KUBE_ALLOW_PRIV="--allow_privileged=false" 83 | ``` 84 | 85 | - 禁用master和node上的防火墙,因为如果有其他防火墙规则管理工具的话,docker会无法正常运行。 86 | 87 | ```sh 88 | systemctl disable iptables-services firewalld 89 | systemctl stop iptables-services firewalld 90 | ``` 91 | 92 | 配置master主机上Kubernetes服务 93 | 94 | - 按照下面的示例编辑/etc/kubernetes/apiserver文件: 95 | 96 | ```sh 97 | # The address on the local server to listen to. 98 | KUBE_API_ADDRESS="--address=0.0.0.0" 99 | 100 | # The port on the local server to listen on. 101 | KUBE_API_PORT="--port=8080" 102 | 103 | # How the replication controller and scheduler find the kube-apiserver 104 | KUBE_MASTER="--master=http://centos-master:8080" 105 | 106 | # Port kubelets listen on 107 | KUBELET_PORT="--kubelet_port=10250" 108 | 109 | # Address range to use for services 110 | KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" 111 | 112 | # Add your own! 113 | KUBE_API_ARGS="" 114 | ``` 115 | 116 | 117 | - 启动master上恰当的服务 118 | 119 | ```sh 120 | for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do 121 | systemctl restart $SERVICES 122 | systemctl enable $SERVICES 123 | systemctl status $SERVICES 124 | done 125 | ``` 126 | 127 | 配置node节点上的Kubernetes服务 128 | 我们需要在节点上配置kubelet并启动kubelet和proxy 129 | 130 | 131 | - 按照下面的示例编辑/etc/kubernetes/kubelet文件: 132 | 133 | ```sh 134 | # The address for the info server to serve on 135 | KUBELET_ADDRESS="--address=0.0.0.0" 136 | 137 | # The port for the info server to serve on 138 | KUBELET_PORT="--port=10250" 139 | 140 | # You may leave this blank to use the actual hostname 141 | KUBELET_HOSTNAME="--hostname_override=centos-minion" 142 | 143 | # Add your own! 144 | KUBELET_ARGS="" 145 | ``` 146 | 147 | - 启动节点上(fed-node)上恰当的服务 148 | 149 | ```sh 150 | for SERVICES in kube-proxy kubelet docker; do 151 | systemctl restart $SERVICES 152 | systemctl enable $SERVICES 153 | systemctl status $SERVICES 154 | done 155 | ``` 156 | 157 | 你应该完成了! 158 | 159 | - 检查以确认现在集群中fed-master能够看到fed-node 160 | 161 | ```sh 162 | $ kubectl get nodes 163 | NAME LABELS STATUS 164 | centos-minion Ready 165 | ``` 166 | 167 | 集群现在应该在运行了,启动一个用于测试的pod吧。 168 | 169 | 你应该有一个功能正常的集群,查看[101](http://kubernetes.io/v1.0/docs/user-guide/walkthrough/README.html)节! 170 | 171 | -------------------------------------------------------------------------------- /030-ubuntu.md: -------------------------------------------------------------------------------- 1 | # 在Ubuntu物理节点上部署Kubernets 2 | `译者:王乐` `校对:无` 3 | 4 | 5 | ## 介绍 6 | 这片文档介绍了如何在Ubuntu节点上部署Kubernetes,这里我们用1个主节点和3个普通节点的安装来作为范例。你可以轻松变动设置扩展到**任意数量的节点**。最初的想法是受到@jainvipin的Ubuntu单节点部署工作的启发。单节点的部署介绍也涵盖在本章节中。 7 | 8 | [浙江大学云团队](https://github.com/ZJU-SEL)会维护这项工作。 9 | 10 | ## 前提条件 11 | 1. 所有节点上已经安装docker版本1.2+和用来控制Linux网桥的bridge-utils。 12 | 2. 所有的机器可相互通信。主节点需要连接到Interent去下载必须的文件。 13 | 3. 本指南介绍的步骤已经在Ubuntu 14.04 LTS 64bit server上测试过了。但在Ubuntu 15不能正常工作,这是因为Ubuntu 15使用systemd代替了upstart。 14 | 4. 本指南所依赖于etcd-2.0.12, flannel-0.5.3和k8s-1.0.6。或许能兼容这些软件的较高版本。 15 | 5. 所有的服务器能够使用ssh远程密钥认证登入,而不是用密码登入。 16 | 17 | ## 开始建立一个集群 18 | 19 | ### 建立正确的目录 20 | 复制Github上kubernetes的文件库到本地。 21 | 22 | ``` console 23 | $ git clone https://github.com/kubernetes/kubernetes.git 24 | ``` 25 | 26 | #### 配置和运行Kubernetes集群 27 | 启动过程将会首先自动下载所需的二进制安装文件。默认会下载etc版本2.0.12,Flannel版本0.5.3和k8s版本1.0.6。你可以按一下方法来设置参数`ETCD_VERSION`,`FLANNEL_VERSION`和`KUBE_VERSION`,从而来选定你想要的etc,Flannel和k8s版本。 28 | 29 | ```console 30 | $ export KUBE_VERSION=1.0.5 31 | $ export FLANNEL_VERSION=0.5.0 32 | $ export ETCD_VERSION=2.2.0 33 | ``` 34 | 35 | 请注意我们在这里使用Flannel是用来建立overlay网络,但这并不是必须的。事实上你可以不借助其他工具直接建立k8s集群,或者使用Flannel,Open vSwitch或SDN来建立网络。 36 | 37 | 这是一个集群IP地址配置的例子: 38 | 39 | | IP Address | Role | 40 | |-------------|----------| 41 | |10.10.103.223| node | 42 | |10.10.103.162| node | 43 | |10.10.103.250| both master and node| 44 | 45 | 首先cluster/ubuntu/config-default.sh文件内配置集群信息。 46 | 以下是个简单的参考。 47 | 48 | ```sh 49 | export nodes="vcap@10.10.103.250 vcap@10.10.103.162 vcap@10.10.103.223" 50 | 51 | export role="ai i i" 52 | 53 | export NUM_MINIONS=${NUM_MINIONS:-3} 54 | 55 | export SERVICE_CLUSTER_IP_RANGE=192.168.3.0/24 56 | 57 | export FLANNEL_NET=172.16.0.0/16 58 | ``` 59 | 第一个参数`nodes`定义了你所有的节点。主节点列在第一位并使用空格来做分割,比如` ` 60 | 61 | 接下来参数`role`按顺序定义了主机的角色,"ai”代表主机可以是主节点或普通节点,"a"代表主节点,"i"代表普通节点。 62 | 63 | 参数`NUM_MINIONS`定义了所有节点的数量。 64 | 65 | 参数`SERVICE_CLUSTER_IP_RANGE`定义了Kubernetes服务的IP地址范围。 66 | 67 | 请确保你所定义的私有IP地址范围是合理的,因为一些IaaS提供商会保留一些私有IP地址。根据RFC1918,一共有三个私有IP地址网段,如下所列。你最好不要选址一个和你自己私有地址网段冲突的网段。 68 | 69 | 10.0.0.0 - 10.255.255.255 (10/8 prefix) 70 | 71 | 172.16.0.0 - 172.31.255.255 (172.16/12 prefix) 72 | 73 | 192.168.0.0 - 192.168.255.255 (192.168/16 prefix) 74 | 75 | 76 | 参数`FLANNEL_NET`定义了Flannel网络所用的IP地址范围。这个地址不能和`SERVICE_CLUSTER_IP_RANGE`的地址冲突。 77 | 78 | **注意:** 在部署时,主节点需要连接到Interent去下载必须的文件。如果你的主机在私有网络里,你可以在cluster/ubuntu/config-default.sh中设置参数`PROXY_SETTING`来配置Internet代理。 79 | PROXY_SETTING="http_proxy=http://server:port https_proxy=https://server:port" 80 | 81 | 当以上所有参数正确设置后,你就可以用`cluster/`中的命令来启动整个集群了。 82 | 83 | `$ KUBERNETES_PROVIDER=ubuntu ./kube-up.sh` 84 | 这个脚本自动`scp`传输二进制安装和配置文件到所有的主机上。之后启动这个主机上的kubernetes的服务。你唯一需要做的是当有提示的时候输入所需密码。 85 | 86 | ```console 87 | Deploying node on machine 10.10.103.223 88 | ... 89 | [sudo] password to start node: 90 | ``` 91 | 如果一切运行正常,k8s集群启动后你会看见以下提示信息。 92 | 93 | ```console 94 | Cluster validation succeeded 95 | ``` 96 | 97 | ### 测试 98 | 你可以运行`kubectl`命令来检测刚升级的Kubernetes集群是否工作正常。`kubectl`运行文件放置在`cluster/ubuntu/binaries`文件夹中。你也可以设置环境变量PATH来调用`kubectl`。 99 | 100 | 比如,使用`$ kubectl get nodes`来检测你的节点是否正常运行。 101 | ```console 102 | $ kubectl get nodes 103 | NAME LABELS STATUS 104 | 10.10.103.162 kubernetes.io/hostname=10.10.103.162 Ready 105 | 10.10.103.223 kubernetes.io/hostname=10.10.103.223 Ready 106 | 10.10.103.250 kubernetes.io/hostname=10.10.103.250 Ready 107 | ``` 108 | 109 | 你也可以使用Kubernetes[guest-example](../../examples/guestbook/)来建立Redis后台集群。 110 | 111 | ### 部署插件 112 | 假设你开始运行k8s集群,这一节将会介绍如何在现有集群上部署类似DNS和UI等插件。 113 | 114 | 可以`cluster/ubuntu/config-default.sh`中配置在DNS。 115 | 116 | ```sh 117 | ENABLE_CLUSTER_DNS="${KUBE_ENABLE_CLUSTER_DNS:-true}" 118 | 119 | DNS_SERVER_IP="192.168.3.10" 120 | 121 | DNS_DOMAIN="cluster.local" 122 | 123 | DNS_REPLICAS=1 124 | ``` 125 | 126 | 参数`DNS_SERVER_IP`定义了DNS的IP,这个IP必须在`SERVICE_CLUSTER_IP_RANGE`的范围中。 127 | 参数`DNS_REPLICAS`描述了集群中运行了多少个DNS pod。 128 | 129 | 默认情况下,我额们也可以配置kube-ui插件。 130 | 131 | ```sh 132 | ENABLE_CLUSTER_UI="${KUBE_ENABLE_CLUSTER_UI:-true}" 133 | ``` 134 | 当以上参数设置完毕之后,运行以下命令。 135 | ```console 136 | $ cd cluster/ubuntu 137 | $ KUBERNETES_PROVIDER=ubuntu ./deployAddons.sh 138 | ``` 139 | 稍等之后,你可以用命令`$ kubectl get pods --namespace=kube-system`来检测这个集群中的DNS和pod的UI是否运行。 140 | 141 | ### 下一步 142 | 我们目前的工作集中在以下的功能: 143 | 1.使用[kube-in-docker](https://github.com/ZJU-SEL/kube-in-docker/tree/baremetal-kube)在Docker中运行kubernetes,从而消除不同操作系统的区别。 144 | 2.拆除部署脚本:一键式清除和重建整个部署。 145 | 146 | ### 故障排除 147 | 通常,这一步非常简单: 148 | 1.下载和复制安装和配置文件到在每个节点上。 149 | 2.根据用户的输入的IP来配置主节点上的`etcd`。 150 | 3.在每个普通节点上新建和启动Flannel网络。 151 | 152 | 如果你遇到什么问题,首先检查主节点上`etcd`的配置。 153 | 1.查看`/var/log/upstart/etcd.log`中的日志。 154 | 2.以下命令或许有帮助,第一个是停止这个集群,第二个是启动这个集群。 155 | 156 | ```console 157 | $ KUBERNETES_PROVIDER=ubuntu ./kube-down.sh 158 | $ KUBERNETES_PROVIDER=ubuntu ./kube-up.sh 159 | ``` 160 | 3.你也可以在`/etc/default/{component_name}`里做客制化设置,之后用以下命令重启服务 161 | `$ sudo service {component_name} restart`。 162 | 163 | ## 升级集群 164 | 如果你已经有了Kubernetes集群并希望升级到新的版本,你需要根据`cluster/`文件夹中的命令来升级整个或部分集群。 165 | ```console 166 | $ KUBERNETES_PROVIDER=ubuntu ./kube-push.sh [-m|-n ] 167 | ``` 168 | 默认情况下会升级全部的节点,你也可以用`-m`来升级主节点或`-n`来升级某个普通节点。如果没有给出所要升级的版本,这个脚本会尝试使用本地的二进制安装文件。你应该确认所有的文件都在`cluster/ubuntu/binaries`文件夹中准备好了。 169 | 170 | ```console 171 | $ tree cluster/ubuntu/binaries 172 | binaries/ 173 | ├── kubectl 174 | ├── master 175 | │ ├── etcd 176 | │ ├── etcdctl 177 | │ ├── flanneld 178 | │ ├── kube-apiserver 179 | │ ├── kube-controller-manager 180 | │ └── kube-scheduler 181 | └── minion 182 | ├── flanneld 183 | ├── kubelet 184 | └── kube-proxy 185 | ``` 186 | 187 | 用以下命令来获得帮助。 188 | 189 | ```console 190 | $ KUBERNETES_PROVIDER=ubuntu ./kube-push.sh -h 191 | ``` 192 | 193 | 这里有几个实例: 194 | * 把主节点升级到版本1.0.5: `$ KUBERNETES_PROVIDER=ubuntu ./kube-push.sh -m 1.0.5` 195 | * 把节点10.10.103.223升级到版本1.0.5 : `$ KUBERNETES_PROVIDER=ubuntu ./kube-push.sh -n 10.10.103.223 1.0.5` 196 | * 把主节点和其他节点升级到版本1.0.5: `$ KUBERNETES_PROVIDER=ubuntu ./kube-push.sh 1.0.5` 197 | 198 | 这个脚本不会删除你集群上的资源,只是替换了二进制安装包。 199 | 200 | ### 测试 201 | 你可以运行`kubectl`命令来检测刚升级的Kubernetes集群是否工作正常,参考[测试](ubuntu.md#测试)。 202 | 为了确保升级后的集群版本和你期望的一致,以下命令会有所帮助。 203 | * 升级主节点或所有节点: `$ kubectl version`。 检查*服务器版本*。 204 | * 升级节点10.10.102.223: `$ ssh -t vcap@10.10.102.223 'cd /opt/bin && sudo ./kubelet --version'` 205 | 206 | -------------------------------------------------------------------------------- /031-docker-multinode.md: -------------------------------------------------------------------------------- 1 | # 利用Docker安装多节点Kubernetes 2 | `译者:王乐` `校对:无` 3 | 4 | 5 | _注意_: 6 | 这个介绍一定程度上会比[single node](docker.md)里的介绍要更进一步。如果你有兴趣探索Kubernetes,我们建议你从这里开始。 7 | _注意_: 8 | Docker 1.7.0里的一个[bug](https://github.com/docker/docker/issues/14106)影响Docker上多节点的正常安装。 9 | 请安装Docker版本1.6.2或1.7.1. 10 | 11 | ## 前提条件 12 | 13 | 1. 你需要你一台安装有正确版本的Docker的主机。 14 | 15 | ## 概括介绍 16 | 17 | 本指南会指导架设有2个节点的Kubernetes集群。其中包括一个支持API服务器和编排工作的_主节点_,和一个从主节点接受任务的_从节点_。你可以按照同样的步骤添加任意数量的从节点,从而假设一个庞大的集群。 18 | 19 | 这里的图标展示了最终的结果: 20 | ![Kubernetes Single Node on Docker](k8s-docker.png) 21 | 22 | ### 引导启动Docker 23 | 24 | 本指南同样运行两个Docker后台程序实例的模式 25 | 1) 一个_引导启动_的Docker容器实例用来运行例如`flanneld`和`etcd`系统后台程序。 26 | 2) 一个_主_Docker容器实例来服务Kubernetes和用户容器。 27 | 28 | 这个模式是有必要的,因为`flannel`的后台程序是负责建立和管理Kubernetes新建的Docker容器间的相互通信。所以`flannel`必须要运行在_主_Docker后台程序之外。为了利用容器来方便部署和管理,我们使用了这个较简单的_引导启动_的Docker后台程序来实现这一点。 29 | 30 | 在安装前你可以在每个节点上选择k8s的版本: 31 | ``` 32 | export K8S_VERSION= 33 | ``` 34 | 35 | 否则, 我们会使用最新的`hyperkube`镜像当作默认k8s版本。 36 | ## 主节点 37 | 第一步是初始化主节点。 38 | 复制Kubernetes在Github上的repo,并在主节点的主机上以root身份运行脚本[master.sh](docker-multinode/master.sh): 39 | 40 | ```sh 41 | cd kubernetes/docs/getting-started-guides/docker-multinode/ 42 | ./master.sh 43 | ``` 44 | 45 | `Master done!` 46 | 47 | 参考[这里](docker-multinode/master.md) for detailed instructions explanation. 48 | 49 | ## 添加从节点 50 | 当主节点正常运行后,你可以在不同的主机上添加更多的从节点。 51 | 52 | 复制Kubernetes在Github上的repo,并在从节点的主机上以root身份运行脚本[worker.sh](docker-multinode/worker.sh): 53 | 54 | ```sh 55 | export MASTER_IP= 56 | cd kubernetes/docs/getting-started-guides/docker-multinode/ 57 | ./worker.sh 58 | ``` 59 | 60 | `Worker done!` 61 | 62 | 参考[这里](docker-multinode/worker.md) for detailed instructions explanation. 63 | 64 | ## 部署DNS 65 | 66 | 参考[这里](docker-multinode/deployDNS.md) for instructions. 67 | 68 | ## 测试你的集群 69 | 一旦你的集群创建完毕,你可以进行[测试](docker-multinode/testing.md) 70 | 71 | 请参见[examples directory](../../examples/)里更多的完整应用。 -------------------------------------------------------------------------------- /033-Overview and Concepts.md: -------------------------------------------------------------------------------- 1 | # Kubernetes概览 2 | `译者:kz` `校对:无` 3 | 4 | Kubernetes是一个能在集群中跨多主机管理容器化应用的的开源系统。Kubernetes的意在让部属容器化和基于微服务的应用变得简单但是强大。 5 | 6 | Kubernetes提供了诸多机制用来进行应用部署,调度,更新,维护和伸缩。一个Kubernetes的关键特性是能它能主动的管理容器来保证集群的状态不断地符合用户的期望状态。一个运维人员能够启动微服务,然后让调度器来找到合适的安置点。我们也想不断的改善工具和用户体验,让他们能通过如金丝雀部署等模式来放出应用。 7 | 8 | Kubernetes支持[Docker](http://www.docker.io)和[Rocket](https://coreos.com/blog/rocket/)容器, 对其他的容器镜像格式和容器runtime会在未来加入。 9 | 10 | 尽管Kubernetes目前集中关注持续运行的无状态(如web服务器和内存中的对象缓存)和云原生状态的的应用(如NoSQL数据库),在很快的将来,也会支持所有的其他的在生产集群环境能常见到的workload类型,例如批处理,流式处理,和传统的数据库。 11 | 12 | 13 | Kubernetes中,所有的容器都运行在pod中,一个pod来容纳一个单独的容器,或者多个合作的容器。在后一种情况,pod中的容器被保证放置在同一个机器上,可以共享资源。一个pod也能包含零个或者更多的的volume,volume是对一个容器私有的目录或者可以在pod中的容器间共享。对于用户每个创建的pod,系统会找一个健康运转并且有足够的容量的机器,然后开始将相应的容器在那里启动。如果一个容器失败,它会被Kubernetes的node agent自动重启,这个node agent被称作Kubelet。但是如果pod或者他的机器出故障,它不会被自动转移或者重启,除非用户也定义了一个replication controller,我们马上就会讲到它。 14 | 15 | 16 | 17 | 用户可以自己创建并管理pod,但是Kubernetes极大的简化了系统管理,它能让用户指派两个常见的跟pod相关的活动:基于相同的pod配置,部署多个pod副本,和创建替换的pod当一个pod或者它所在的机器发生故障的时候。Kubernetes的API对象用来管理这些行为的被称作replication controller,它用模板的形式定义了pod,然后系统根据模板实例化出一些pod(特别是由用户)。pod的副本集合可以共同组成一整个应用,一个微服务,或者在一个多层应用的一层。一旦pod创建好,系统会持续的监控他们的健康状态,和它们运行时所在的机器的健康状况。如果一个pod因为软件问题或者所在机器故障出现问题,replication控制器会自动在健康的机器上创建一个新的pod,来保证pod的集合处于一个期望的冗余水平。一个或者多个应用的多个pod能共享一个机器。注意一个replication控制器在点那个非副本pod的的情况下也会被需要,如果用户想在pod或者其运行所在的机器出现故障的时候能重新创建。 18 | 19 | 20 | 能够方便的指代一个pod集合是一个常见需要用到的功能。例如,需要限制一个修改型操作到一个有限制的集合里,或者限制需要查询状态的pod集合范围。作为一个常见的机制,Kubernetes绝大多是的API对象都允许用户添加任意的key-value键值对,被称作label,并且可以让用户用一系列的label选择器(对label的键值对查询)来限制API操作的目标。每一个资源也有一个字符串类型的键值可以被外部的工具来存储或者获取任意的元数据,被称作annotations(备注)。 21 | 22 | Kubernetes支持一种独特的网络模型。Kubernetes鼓励用扁平的地址空间,并且不会动态的分配端口,而是采用让用户可以选择任意合适自己的端口。为了实现这点,它给每一个pod分配了一个ip地址。 23 | 24 | 现代的Internel应用通常由层级的微服务构建而来,例如一组前端和分布式的内存内键值存储交互,和副本复制的存储服务交互。为了构建这种架构,Kubernetes提供了service的抽象,其提供了一稳定的IP地址和DNS名字,来对应一组动态的pod,例如一组构成一个微服务的pod。这个pod组是通过label选择器来定义的,因为可以指定任何的pod组。当一个运行在Kubernetes pod里的容器连接到这个地址时,这个连接会被本地的代理转发(称作kube proxy)。该代理运行在来源机器上。转发的目的地是一个相应的后端容器,确切的后端是通过round-robin的策略进行选择,以均衡负载。kube proxy也会追踪后端的pod组的动态变化,如当pod被位于新机器上的新的pod取代的时候,因而服务的IP和DNS名字不用改变。 25 | 26 | 27 | 每一个Kubernetes中的资源,如pod,都通过一个URI来被识别,并且有一个UID。URI中一个总要的组件是,对象的类型(如:pod),对象的名字,和对象的namespace(命名空间)。对于一个特定的对象类型,每一个名字在其命名空间都是独一无二的。在一个对象的名字没有带着命名空间的形式给出,那就是默认的命名空间。UID在时间和空间的范围都是唯一的。 28 | -------------------------------------------------------------------------------- /034-Architecture.md: -------------------------------------------------------------------------------- 1 | # Kubernetes架构 2 | `译者:kz` `校对:无` 3 | 4 | 5 | 6 | 一个运行着的Kubernetes集群包含node agents(即kubelet)和主要的组件(API,调度器等等),其构建于分布式存储的基础之上。这个图显示了我们的理想的最终状态,尽管我们还在对一些部分做改动,如让kubelet自身运行在容器之内,和让调度器百分之百的插件式。 7 | !p[架构图](architecture.png?raw=true "Architecture overview") 8 | 9 | 10 | 11 | ## Kubernetes Node(Kubernetes节点) 12 | 13 | 14 | 当研究系统的架构的时候,我们会将其划分成运行子worker节点上的service和那些组成集群级别控制面板的service。 15 | 16 | 17 | Kubernetes Node拥有能运行应用容器的必要服务和从主系统管理的service。 18 | 19 | 20 | 每一个node当然运行着Docker。Docker负责处理下载镜像,运行容器的细节。 21 | 22 | ### `kubelet` 23 | 24 | 25 | kubelet管理着pod和它们的容器,它们的镜像,它们的卷,等等。 26 | 27 | ### `kube-proxy` 28 | 29 | 30 | 每一个node也运行着一个简单的网络代理和负载均衡器。这反映出定义在Kubernetes API中的每个节点的service能做简单的TCP和UDP流转发(轮流的方式)到一组后端。 31 | 32 | 33 | service的端点现在是通过DNS或者通过环境变量来发现的。这些变量解析到有service代理管理着的端口。 34 | 35 | 36 | ## Kubernetes控制面板 37 | 38 | 39 | Kubernetes控制面板被分成一组组件。目前,它们都运行在一个单一的master节点上,但是这很快就会改变,以支持高可用的集群。这些节点一起工作提供了一个集群统一的视图。 40 | 41 | 42 | ### `etcd` 43 | 44 | 45 | 所有持久化的master状态保存在一个etcd的节点中。这给保存配置数据稳定性提供了很好的存储。有watch的支持,协作的组件可以在更改时很快的被通知到。 46 | 47 | ### Kubernetes API Server 48 | 49 | 50 | 51 | apiserver服务着Kubernetes API。其目标是作为简单的CRUD式的服务,然后绝大多数/所有的业务逻辑都在单独的组件或者插件里面实现。他主要处理REST操作,做数据验证,并更新对应的etcd里面的对象(然后最终其他的存储)。 52 | ### Scheduler 53 | 54 | 55 | 调度器通过bingding API将没有调度的pod绑定到node。 调度器是插件式的,我们期望支持多种集群的调度器,最终在未来甚至支持用户提供额的调度器。 56 | ### Kubernetes Controller Manager Server 57 | 58 | 59 | 所有的其他集群级别的功能目前是通过Controller Manager来执行的。例如Endpoint对象通过endpoint控制器偶来创建和更新,node是通过node控制器来发现管理和监控的。这些可能会最终被拆分到单独的组件,以让他们可以独立的插件化。 60 | 61 | replication控制器是一个在简单API的上层的机制。我们最终计划将其移植成可插入式的机制,一旦有一个被实现了。 62 | -------------------------------------------------------------------------------- /041-Names.md: -------------------------------------------------------------------------------- 1 | # Identifiers 2 | `译者:kz` `校对:无` 3 | 4 | 5 | All objects in the Kubernetes REST API are unambiguously identified by a Name and a UID. 6 | 7 | For non-unique user-provided attributes, Kubernetes provides [labels](labels.md) and [annotations](annotations.md). 8 | 9 | ## Names 10 | 11 | Names are generally client-provided. Only one object of a given kind can have a given name at a time (i.e., they are spatially unique). But if you delete an object, you can make a new object with the same name. Names are the used to refer to an object in a resource URL, such as `/api/v1/pods/some-name`. By convention, the names of Kubernetes resources should be up to maximum length of 253 characters and consist of lower case alphanumeric characters, `-`, and `.`, but certain resources have more specific restrictions. See the [identifiers design doc](../design/identifiers.md) for the precise syntax rules for names. 12 | 13 | ## UIDs 14 | 15 | UID are generated by Kubernetes. Every object created over the whole lifetime of a Kubernetes cluster has a distinct UID (i.e., they are spatially and temporally unique). 16 | -------------------------------------------------------------------------------- /042-Namespaces.md: -------------------------------------------------------------------------------- 1 | # Namespaces 2 | `译者:kz` `校对:无` 3 | 4 | 5 | Kubernetes supports multiple virtual clusters backed by the same physical cluster. 6 | These virtual clusters are called namespaces. 7 | 8 | ## When to Use Multiple Namespaces 9 | 10 | Namespaces are intended for use in environments with many users spread across multiple 11 | teams, or projects. For clusters with a few to tens of users, you should not 12 | need to create or think about namespaces at all. Start using namespaces when you 13 | need the features they provide. 14 | 15 | Namespaces provide a scope for names. Names of resources need to be unique within a namespace, but not across namespaces. 16 | 17 | Namespaces are a way to divide cluster resources between multiple uses (via [resource quota](../../docs/admin/resource-quota.md)). 18 | 19 | In future versions of Kubernetes, objects in the same namespace will have the same 20 | access control policies by default. 21 | 22 | It is not necessary to use multiple namespaces just to separate slightly different 23 | resources, such as different versions of the same software: use [labels](#labels.md) to distinguish 24 | resources within the same namespace. 25 | 26 | ## Working with Namespaces 27 | 28 | Creation and deletion of namespaces is described in the [Admin Guide documentation 29 | for namespaces](../../docs/admin/namespaces.md) 30 | 31 | ### Viewing namespaces 32 | 33 | You can list the current namespaces in a cluster using: 34 | 35 | ```console 36 | $ kubectl get namespaces 37 | NAME LABELS STATUS 38 | default Active 39 | kube-system Active 40 | ``` 41 | 42 | Kubernetes starts with two initial namespaces: 43 | * `default` The default namespace for objects with no other namespace 44 | * `kube-system` The namespace for objects created by the Kubernetes system 45 | 46 | ### Setting the namespace for a request 47 | 48 | To temporarily set the namespace for a request, use the `--namespace` flag. 49 | 50 | For example: 51 | 52 | ```console 53 | $ kubectl --namespace= run nginx --image=nginx 54 | $ kubectl --namespace= get pods 55 | ``` 56 | 57 | ### Setting the namespace preference 58 | 59 | You can permanently save the namespace for all subsequent kubectl commands in that 60 | context. 61 | 62 | First get your current context: 63 | 64 | ```console 65 | $ export CONTEXT=$(kubectl config view | grep current-context | awk '{print $2}') 66 | ``` 67 | 68 | Then update the default namespace: 69 | 70 | ```console 71 | $ kubectl config set-context $(CONTEXT) --namespace= 72 | ``` 73 | 74 | ## Namespaces and DNS 75 | 76 | When you create a [Service](services.md), it creates a corresponding [DNS entry](../admin/dns.md). 77 | This entry is of the form `..svc.cluster.local`, which means 78 | that if a container just uses `` it will resolve to the service which 79 | is local to a namespace. This is useful for using the same configuration across 80 | multiple namespaces such as Development, Staging and Production. If you want to reach 81 | across namespaces, you need to use the fully qualified domain name (FQDN). 82 | 83 | ## Not All Objects are in a Namespace 84 | 85 | Most kubernetes resources (e.g. pods, services, replication controllers, and others) are 86 | in a some namespace. However namespace resources are not themselves in a namespace. 87 | And, low-level resources, such as [nodes](../../docs/admin/node.md) and 88 | persistentVolumes, are not in any namespace. Events are an exception: they may or may not 89 | have a namespace, depending on the object the event is about. 90 | -------------------------------------------------------------------------------- /043-Annotations.md: -------------------------------------------------------------------------------- 1 | # Annotations 2 | `译者:kz` `校对:无` 3 | 4 | 5 | We have [labels](labels.md) for identifying metadata. 6 | 7 | It is also useful to be able to attach arbitrary non-identifying metadata, for retrieval by API clients such as tools, libraries, etc. This information may be large, may be structured or unstructured, may include characters not permitted by labels, etc. Such information would not be used for object selection and therefore doesn't belong in labels. 8 | 9 | Like labels, annotations are key-value maps. 10 | 11 | ```json 12 | "annotations": { 13 | "key1" : "value1", 14 | "key2" : "value2" 15 | } 16 | ``` 17 | 18 | Possible information that could be recorded in annotations: 19 | 20 | * fields managed by a declarative configuration layer, to distinguish them from client- and/or server-set default values and other auto-generated fields, fields set by auto-sizing/auto-scaling systems, etc., in order to facilitate merging 21 | * build/release/image information (timestamps, release ids, git branch, PR numbers, image hashes, registry address, etc.) 22 | * pointers to logging/monitoring/analytics/audit repos 23 | * client library/tool information (e.g. for debugging purposes -- name, version, build info) 24 | * other user and/or tool/system provenance info, such as URLs of related objects from other ecosystem components 25 | * lightweight rollout tool metadata (config and/or checkpoints) 26 | * phone/pager number(s) of person(s) responsible, or directory entry where that info could be found, such as a team website 27 | 28 | Yes, this information could be stored in an external database or directory, but that would make it much harder to produce shared client libraries and tools for deployment, management, introspection, etc. 29 | 30 | -------------------------------------------------------------------------------- /044-Overview and Concepts.md: -------------------------------------------------------------------------------- 1 | #Kubernetes用户指南:应用程序管理 2 | `译者:钟健鑫` `校对:无` 3 | 4 | 5 | 目录 6 | 7 | - [Kubernetes用户指南:应用程序管理](#Kubernetes用户指南:应用程序管理) 8 | - [实战入门](#实战入门) 9 | - [进阶路线](#进阶路线) 10 | - [概念指南](#概念指南) 11 | - [阅读延伸](#阅读延伸) 12 | 13 | 14 | 15 | >用户指南旨在为了每一个想运行程序或者服务在已有Kubernetes集群中的人。Kubernetes集群的安装和管理相关内容在[集群管理指南](http://kubernetes.io/v1.0/docs/admin/README.html)中可以找到。[开发者指南](http://kubernetes.io/v1.0/docs/devel/README.html)是为了那些想写代码直接访问Kubernetes的API,或者为Kubernetes项目共享代码的每一个人。 16 | 17 | >请确认你已经完成这个事列: [运行用户指南中实例的先决条件](http://kubernetes.io/v1.0/docs/user-guide/prereqs.html). 18 | 19 | ##实战入门 20 | 21 | * >Kubernetes 101 22 | * >Kubernetes 201 23 | 24 | ##进阶路线图 25 | 26 | 如果你对Kubernetes布什很熟悉的话, 我们建议你按顺序阅读下面的部分: 27 | 28 | * 1.快速入门: 运行并展示一个应用程序 29 | * 2.容器的配置与启动: 配置容器的公共参数 30 | * 3.部署可持续运行的容器 31 | * 4.链接应用程序: 将应用程序展示给客户和用户 32 | * 5.在生产环境中是用容器 33 | * 6.部署管理 34 | * 7.应用程序的自我检查和调试 35 | * 1.使用Kubernetes的Web用户界面 36 | * 2.日志 37 | * 3.监控 38 | * 4.通过exec命令进入容器 39 | * 5.通过代理连接容器 40 | * 6.通过接口转发连接容器 41 | 42 | ##概念指南 43 | 44 | >概论 : Kubernetes中概念的简要概述 45 | 46 | >Cluster : 集群是指由Kubernetes使用一系列的物理机、虚拟机和其他基础资源来运行你的应用程序。 47 | 48 | >Node : 一个node就是一个运行着Kubernetes的物理机或虚拟机,并且pod可以在其上面被调度。. 49 | 50 | >Pod : 一个pod对应一个由相关容器和卷组成的容器组 51 | 52 | >Label : 一个label是一个被附加到资源上的键/值对,譬如附加到一个Pod上,为它传递一个用户自定的并且可识别的属性.Label还可以被应用来组织和选择子网中的资源 53 | 54 | >selector是一个通过匹配labels来定义资源之间关系得表达式,例如为一个负载均衡的service指定所目标Pod. 55 | 56 | >Replication Controller : replication controller 是为了保证一定数量被指定的Pod的复制品在任何时间都能正常工作.它不仅允许复制的系统易于扩展,还会处理当pod在机器在重启或发生故障的时候再次创建一个 57 | 58 | >Service : 一个service定义了访问pod的方式,就像单个固定的IP地址和与其相对应的DNS名之间的关系。 59 | 60 | >Volume: 一个volume是一个目录,可能会被容器作为未见系统的一部分来访问。Kubernetes volume 构建在Docker Volumes之上,并且支持添加和配置volume目录或者其他存储设备。 61 | 62 | >Secret : Secret 存储了敏感数据,例如能允许容器接收请求的权限令牌。 63 | 64 | >Name : 用户为Kubernetes中资源定义的名字 65 | 66 | >Namespace : Namespace 好比一个资源名字的前缀。它帮助不同的项目、团队或是客户可以共享cluster,例如防止相互独立的团队间出现命名冲突 67 | 68 | >Annotation : 相对于label来说可以容纳更大的键值对,它对我们来说可能是不可读的数据,只是为了存储不可识别的辅助数据,尤其是一些被工具或系统扩展用来操作的数据 69 | 70 | ##阅读延伸 71 | 72 | ###API 相关资源 73 | 74 | >[更多可使用的API资源](http://kubernetes.io/v1.0/docs/user-guide/working-with-resources.html) 75 | 76 | ###Pods and containers 77 | 78 | >- [Pod 的生命周期和重启策略](http://kubernetes.io/v1.0/docs/user-guide/pod-states.html) 79 | - [生命周期事件钩子](http://kubernetes.io/v1.0/docs/user-guide/container-environment.html) 80 | - [计算资源,例如cpu和内存](http://kubernetes.io/v1.0/docs/user-guide/compute-resources.html) 81 | - [指定命令和请求的能力](http://kubernetes.io/v1.0/docs/user-guide/containers.html) 82 | - [Downward API(用于向下支持容器访问Pod的API,如Docker): 从pod中访问系统配置](http://kubernetes.io/v1.0/docs/user-guide/downward-api.html) 83 | - [镜像和仓库](http://kubernetes.io/v1.0/docs/user-guide/images.html) 84 | - [从使用docker-cli转向kubectl](http://kubernetes.io/v1.0/docs/user-guide/docker-cli-to-kubectl.html) 85 | - [配置集群时的提示和技巧](http://kubernetes.io/v1.0/docs/user-guide/config-best-practices.html) 86 | - [把pod分配到指定node](http://kubernetes.io/v1.0/docs/user-guide/node-selection/) 87 | - [展示为一组正在运行的pod左滚动更新](http://kubernetes.io/v1.0/docs/user-guide/update-demo/) -------------------------------------------------------------------------------- /045-Quick_Walkthrough_Basics_Tutorials.md: -------------------------------------------------------------------------------- 1 | # 基础教程 2 | `译者:White` `校对:无` 3 | 4 | 5 | 请参看后面的『Kubernetes 101』和『Kubernetes 102』部分。 6 | * [Kubernetes 101](https://www.gitbook.com/book/linfan1/kubernetes-chinese-docs/edit#/edit/master/092-Kubernetes%20101.md) 7 | * [Kubernetes 201](https://www.gitbook.com/book/linfan1/kubernetes-chinese-docs/edit#/edit/master/093-Kubernetes%20201.md) 8 | -------------------------------------------------------------------------------- /048-Configuring Containers.md: -------------------------------------------------------------------------------- 1 | # 配置kubernetes 2 | `译者:李昂` `校对:无` 3 | 4 | 5 | 除了像`kubectl run`和`kubectl expose`这些必要的命令,它们在[各种地方](http://kubernetes.io/v1.0/docs/user-guide/quick-start.html)都有介绍,kubernetes也支持可声明式的配置。配置文件也需要必要的命令,这样就可以在代码审查中检查版本控制和文件改动,而代码审查对复杂的具有鲁棒性的可靠生产系统是非常重要的。 6 | 7 | 在声明式风格中,所有的配置都保存在YAML或者JSON配置文件中,使用Kubernetes的API资源模式(schema)作为配置的模式(schema)。`kubectl`命令可以创建、更新、删除以及获取API资源。`kubectl`命令用`ApiVersion`(目前是“v1”),`kind`资源,`name`资源去创建合适的API路径来执行特殊的操作。 8 | 9 | # 使用配置文件创建一个容器 10 | 11 | Kubernetes是在*[Pod](http://kubernetes.io/v1.0/docs/user-guide/pods.html)*中来运行容器的。一个包含了一个简单的HellWorld容器的Pod可以被如下的YAML文件指定: 12 | ``` 13 | apiVersion: v1 14 | kind: Pod 15 | metadata: 16 | name: hello-world 17 | spec: # specification of the pod’s contents 18 | restartPolicy: Never 19 | containers: 20 | - name: hello 21 | image: "ubuntu:14.04" 22 | command: ["/bin/echo","hello”,”world"] 23 | ``` 24 | 25 | 26 | `metadata.name的`值`hello-world`,将会成为创建成功后Pod的名称,这个名称必须在集群中唯一,而`container[0].name`只是容器在Pod中的昵称。`image`就是Docker image的名称且Kubernetes默认会从[Docker Hub](https://registry.hub.docker.com/)中拉取镜像。 27 | 28 | `restartPolicy`: `Never`指明了我们只是想运行容器一次然后就终止Pod。 29 | 30 | `Command`覆盖了docker容器的`Entrypoint`。命令的参数(相当于Docker的`Cmd`)可以指定`args`参数,如下所示: 31 | 32 | ``` 33 | command: ["/bin/echo"] 34 | args: ["hello","world"] 35 | ``` 36 | 创建这个pod就可以使用`create`命令了 37 | 38 | ``` 39 | $ kubectl create -f ./hello-world.yaml 40 | pods/hello-world 41 | ``` 42 | 当成功创建时,`kubectl`打印出资源类型和资源名称。 43 | 44 | 45 | # 配置验证 46 | 47 | 如果你不确定指定的资源是否正确,你可以`kubectl`帮你验证。 48 | ``` 49 | $ kubectl create -f ./hello-world.yaml --validate 50 | ``` 51 | 假设我们指定的是`entrypoint`而不是`command`,你会看到如下输出: 52 | ``` 53 | I0709 06:33:05.600829 14160 schema.go:126] unknown field: entrypoint 54 | I0709 06:33:05.600988 14160 schema.go:129] this may be a false alarm, 55 | see https://github.com/GoogleCloudPlatform/kubernetes/issues/6842 56 | pods/hello-world 57 | ``` 58 | `kubectl create –validate`会警告已经检测出问题,除非缺少必须的字段或者字段值不合法,最后kubectl还是会创建出资源。一定要小心,未知的API字段会被忽略。这个pod没有`command`字段而被创建,command字段是一个可选字段,因为image镜像可以指定`Entrypoint`。访问[Pod API object](https://htmlpreview.github.io/?https://github.com/GoogleCloudPlatform/kubernetes/v1.0.1/docs/api-reference/definitions.html#_v1_pod)来查看合法字段列表。 59 | 60 | 61 | # 环境变量和增加变量 62 | 63 | Kubernetes[没有自动的在shell中的运行命令](https://github.com/GoogleCloudPlatform/kubernetes/wiki/User-FAQ#use-of-environment-variables-on-the-command-line)(不是所有镜像都有shell)。如果你想在shell中运行你的命令,例如增加环境便令(使用`env`字段),你可以按如下做法: 64 | ``` 65 | apiVersion: v1 66 | kind: Pod 67 | metadata: 68 | name: hello-world 69 | spec: # specification of the pod’s contents 70 | restartPolicy: Never 71 | containers: 72 | - name: hello 73 | image: "ubuntu:14.04" 74 | env: 75 | - name: MESSAGE 76 | value: "hello world" 77 | command: ["/bin/sh","-c"] 78 | args: ["/bin/echo \"${MESSAGE}\""] 79 | 80 | ``` 81 | 然而,一个shell需要的不仅是增加环境变量。如果你使用`$(ENVVAR)` [语法](http://kubernetes.io/v1.0/docs/design/expansion.html)Kubernetes将会为你做这些事。 82 | 83 | # 查看pod状态 84 | 85 | 使用get命令,你可以看到你已经创建的pod(事实上是集群中你的所有pod)。如果你在创建后用足够快的速度输入`get`命令,你会看到下面的内容: 86 | ``` 87 | $ kubectl get pods 88 | NAME READY STATUS RESTARTS AGE 89 | hello-world 0/1 Pending 0 0s 90 | 91 | ``` 92 | 初始化的时候,新创建的pod还未被调度,也就是还没有节点被选中去运行它。pod创建后会进行调度但是它很快,所以你正常是不会看到pods处于未被调度的状态,除非有问题产生。 93 | 94 | 在pod被调度之后,如果节点中还没有镜像那么就会先通过docker拉取响应的镜像。一切就绪后,你会看到容器在运行: 95 | ``` 96 | $ kubectl get pods 97 | NAME READY STATUS RESTARTS AGE 98 | hello-world 1/1 Running 0 5s 99 | 100 | ``` 101 | `Ready`列指示正在运行在pod中的容器数量。 102 | 103 | 而开始运行后很快这个容器将会被终止。`kubectl`会显示容器已经不再运行以及推出状态: 104 | ``` 105 | $ kubectl get pods 106 | NAME READY STATUS RESTARTS AGE 107 | hello-world 0/1 ExitCode:0 0 15s 108 | 109 | ``` 110 | 111 | # 查看pod输出 112 | 113 | 你会想要查看你运行命令的输出。像`docker logs`一样,`kubectl logs`也会显示输出: 114 | ``` 115 | $ kubectl logs hello-world 116 | hello world 117 | 118 | ``` 119 | 120 | # 删除pods 121 | 122 | 当你看完的输出,你应该删除pod: 123 | ``` 124 | $ kubectl delete pod hello-world 125 | pods/hello-world 126 | 127 | ``` 128 | 就像`create`一样,删除成功时`kubectl`也会打印出资源类型和资源名称。 129 | 130 | 你也可以使用 资源/名称格式指定一个pod: 131 | ``` 132 | $ kubectl delete pods/hello-world 133 | pods/hello-world 134 | 135 | ``` 136 | 终止pods不会自动的删除,你可以观察他们的最终状态,所以请确定清理了你的已经结束的pods。 137 | 138 | 在另一方面,为了在节点中释放磁盘空间容器和他们的日志也会被自动删除。 139 | 140 | 141 | # 下面的内容 142 | [学习部署持久运行的应用](http://kubernetes.io/v1.0/docs/user-guide/deploying-applications.html) 143 | -------------------------------------------------------------------------------- /049-Managing_Applications-Deploying_continuously_running_applications.md: -------------------------------------------------------------------------------- 1 | #管理应用:部署持续运行的应用 2 | `译者:it2afl0rd` `校对:无` 3 | 4 | 在前面的章节里,我们了解了如何用`kubectl run`快速部署一个简单的复制的应用以及如何用pods(configuring-containers.md)配置并生成单次运行的容器。本文,我们将使用基于配置的方法来部署一个持续运行的复制的应用。 5 | ##用配置文件生成复制品集合 6 | Kubernetes用`Replication Controllers`创建并管理复制的容器集合(实际上是复制的Pods)。`Replication Controller`简单地确保在任一时间里都有特定数量的pod副本在运行。如果运行的太多,它会杀掉一些;如果运行的太少,它会启动一些。这和谷歌计算引擎的Instance Group Manager以及AWS的Auto-scaling Group(不带扩展策略)类似。在[快速开始](http://kubernetes.io/v1.0/docs/user-guide/quick-start.html)章节里用`kubctl run`创建的用来跑Nginx的`Replication Controller`可以用下面的YAML描述: 7 | ``` 8 | apiVersion: v1 9 | kind: ReplicationController 10 | metadata: 11 | name: my-nginx 12 | spec: 13 | replicas: 2 14 | template: 15 | metadata: 16 | labels: 17 | app: nginx 18 | spec: 19 | containers: 20 | - name: nginx 21 | image: nginx 22 | ports: 23 | - containerPort: 80 24 | ``` 25 | 和指定一个单独的Pod相比,不同的是设置了这里的kind域为ReplicationController,设定了需要的副本(replicas)数量以及把Pod的定义放到了template域下面。pods的名字不需要显示指定,因为它们是由`replication controller`的名字生成的。要查看支持的域列表,可以看[replication controller API object](https://htmlpreview.github.io/?https://github.com/GoogleCloudPlatform/kubernetes/v1.0.1/docs/api-reference/definitions.html#_v1_replicationcontroller)。 26 | 和创建pods一样,也可以用`create`命令来创建这个replication controller: 27 | ``` 28 | $ kubectl create -f ./nginx-rc.yaml 29 | replicationcontrollers/my-nginx 30 | ``` 31 | `replication controller`会替换删除的或者因不明原因终止的(比如节点失败)pods,这和直接创建的pods的情况是不一样。基于这样的考量,对于一个需要持续运行的应用,即便你的应用只需要一个单独的pod,我们也推荐使用`replication controller`。对于单独的pod,在配置文件里可以省略`replicas`这个域,因为不设置的时候默认就只有一个副本。 32 | ##查看replication controller的状态 33 | 可以用`get`命令查看你创建的replication controller: 34 | ``` 35 | $ kubectl get rc 36 | CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS 37 | my-nginx nginx nginx app=nginx 2 38 | ``` 39 | 这说明你的controller会确保有两个nginx的副本。和直接创建的pod一样,也可以用`get`命令查看这些副本: 40 | ``` 41 | $ kubectl get pods 42 | NAME READY STATUS RESTARTS AGE 43 | my-nginx-065jq 1/1 Running 0 51s 44 | my-nginx-buaiq 1/1 Running 0 51s 45 | ``` 46 | ##删除replication controllers 47 | 如果想要结束你的应用并且删除repication controller。和在[快速开始]()里一样,用下面的命令: 48 | ``` 49 | $ kubectl delete rc my-nginx 50 | replicationcontrollers/my-nginx 51 | ``` 52 | 这个操作默认会把由replication controller管理的pods一起删除。如果pods的数量比较大,这个操作要花一些时间才能完成。如果想要pods继续运行,不被删掉,可以在delete的时候指定参数`--cascade=false`。 53 | 如果在删除replication controller之前想要删除pods,pods只是被替换了,因为replication controller会再起新的pods,确保pods的数量。 54 | ##Labels 55 | Kubernetes使用自定义的键值对(称为[Labels](http://kubernetes.io/v1.0/docs/user-guide/labels.html))分类资源集合,例如pods和replication controller。在前面的例子里,pod的模板里只设定了一个单独的label,键是`app`,值为`nginx`。所有被创建的pod都带有这个label,可以用带-L参数的命令查看: 56 | ``` 57 | $ kubectl get pods -L app 58 | NAME READY STATUS RESTARTS AGE APP 59 | my-nginx-afv12 0/1 Running 0 3s nginx 60 | my-nginx-lg99z 0/1 Running 0 3s nginx 61 | 62 | ``` 63 | pod模板带的label默认会被复制为replication controller的label。Kubernetes中所有的资源都支持labels: 64 | ``` 65 | $ kubectl get rc my-nginx -L app 66 | CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS APP 67 | my-nginx nginx nginx app=nginx 2 nginx 68 | ``` 69 | 更重要的是,pod模板的label会被用来创建`selector`,这个`selector`会匹配所有带这些labels的pods。用`kubectl get`的[go语言模板输出格式](http://kubernetes.io/v1.0/docs/user-guide/kubectl/kubectl_get.html)就可以看到这个域: 70 | ``` 71 | $ kubectl get rc my-nginx -o template --template="{{.spec.selector}}" 72 | map[app:nginx] 73 | ``` 74 | 如果你想要在pod模板里指定labels,但是又不想要被选中,可以显示指定`selector`来解决,不过需要确保`selector`能够匹配由pod模板创建出来的pod的label,并且不能匹配由其他replication controller创建的pods。对于后者,最直接最保险的方法是给replication controller分配一个独特的label,并且在pod模板和selector里都进行指定。 75 | ##后续 76 | [学习展示应用给用户和客户,以及把应用的各层拼接起来](http://kubernetes.io/v1.0/docs/user-guide/connecting-applications.html)。 77 | 78 | -------------------------------------------------------------------------------- /054-Web Interface.md: -------------------------------------------------------------------------------- 1 | # Kubernetes UI 2 | `译者:李昂` `校对:无` 3 | 4 | 5 | Kubernetes有一个基于web的用户界面,它可以图表化显示当前集群状态。 6 | 7 | ## 访问UI 8 | 9 | Kubernetes界面默认是作为集群插件部署的。要访问它需要进入`https:///ui`这个地址,之后会重定向到`https:///api/v1/proxy/namespaces/kube-system/services/kube-ui/#/dashboard/`。 10 | 11 | 如果你发现你无法访问UI,那有可能是Kubernetes UI服务在你的集群上还没有启动。如果是这样,你可以手动开启UI服务: 12 | ``` 13 | kubectl create -f cluster/addons/kube-ui/kube-ui-rc.yaml --namespace=kube-system 14 | kubectl create -f cluster/addons/kube-ui/kube-ui-svc.yaml --namespace=kube-system 15 | 16 | ``` 17 | 通常,这些应该通过`kube-addons.sh` 脚本自动地被运行在主节点上。 18 | 19 | ## 使用UI 20 | 21 | Kubernetes UI可以被用于监控你当前的集群,例如查看资源利用率或者检查错误信息。但是你不能用UI修改集群。 22 | 23 | 24 | ### 节点资源使用 25 | 26 | 访问Kubernetes UI后,你可以看到主页动态列出的你当前集群的所有节点,而且还会有相关信息列出,包括内部IP地址,CPU状态,内存状态和文件系统状态。 27 | ![](k8s-ui-overview.png) 28 | 29 | 30 | ### Dashboard视图 31 | 32 | 在页面的右上方点击“Views”按钮可以看到其他可用的视图,包括Explore,Pods,Nodes,Replication Controllers,Services和Events。 33 | 34 | ### Explore视图 35 | 36 | Explore视图允许你轻松看到当前集群的pods,replication controller和services。 37 | ![](k8s-ui-explore.png) 38 | “Group by”下拉列表允许你用类型、名称、主机等条件对资源分组。 39 | ![](k8s-ui-explore-groupby.png) 40 | 你也可以点击资源列表的下拉三角来生成一个过滤器,有多重过滤类型可供选择。 41 | ![](k8s-ui-explore-filter.png) 42 | 若是要看每项资源的更多细节,就在上面点击。 43 | ![](k8s-ui-explore-poddetail.png) 44 | 45 | ### 其他视图 46 | 47 | 其他视图(Pods, Nodes, Replication Controllers, Services, and Events)简单列出了每种资源的信息。你也可以点击其他种类获取更多细节。 48 | ![](k8s-ui-nodes.png) 49 | 50 | ## 更多信息 51 | 52 | 53 | 想了解更多信息,访问[Kubernetes UI development document](http://releases.k8s.io/v1.0.6/www/README.md) 在web目录。 54 | 55 | -------------------------------------------------------------------------------- /057-Container_Access_exec.md: -------------------------------------------------------------------------------- 1 | # 使用kubectl exec检查容器中的环境变量 2 | `译者:李昂` `校对:无` 3 | 4 | 5 | Kubernetes通过环境变量来暴露[services](http://kubernetes.io/v1.0/docs/user-guide/services.html#environment-variables)。使`用kubectl exec`去检查环境变量会很方便。 6 | 7 | 首先我们创建一个pod和一个service, 8 | ``` 9 | $ kubectl create -f examples/guestbook/redis-master-controller.yaml 10 | $ kubectl create -f examples/guestbook/redis-master-service.yaml 11 | 12 | ``` 13 | 等到pod的状态为Running和Ready, 14 | ``` 15 | $ kubectl get pod 16 | NAME READY REASON RESTARTS AGE 17 | redis-master-ft9ex 1/1 Running 0 12s 18 | 19 | ``` 20 | 然后我们就可以检查pod的环境变量了, 21 | ``` 22 | $ kubectl exec redis-master-ft9ex env 23 | ... 24 | REDIS_MASTER_SERVICE_PORT=6379 25 | REDIS_MASTER_SERVICE_HOST=10.0.0.219 26 | ... 27 | 28 | ``` 29 | 30 | # 使用kubectl exec检查挂载的数据卷(volume) 31 | 32 | 使用`kubectl exec`检查你希望挂载的数据卷(volume)同样很方便。首先还是创建一个pod并且挂载一个数据卷到这个pod的/data/redis目录, 33 | ``` 34 | kubectl create -f docs/user-guide/walkthrough/pod-redis.yaml 35 | ``` 36 | 等待pod状态为Running和Ready, 37 | ``` 38 | $ kubectl get pods 39 | NAME READY REASON RESTARTS AGE 40 | storage 1/1 Running 0 1m 41 | 42 | ``` 43 | 然后我们就可以使用`kubectl exec`去验证数据卷已经挂载到了/data/redis目录, 44 | ``` 45 | $ kubectl exec storage ls /data 46 | redis 47 | 48 | ``` 49 | 50 | # 使用kubectl exec在pod中打开一个bash终端 51 | 52 | 在pod中打开一个终端毕竟才是最直接检查pod的方式。假设pod已经在运行, 53 | ``` 54 | $ kubectl exec -ti storage -- bash 55 | root@storage:/data# 56 | 57 | ``` 58 | 如上所做,你就可以打开pod的终端了。 59 | -------------------------------------------------------------------------------- /058-Connect with Proxies.md: -------------------------------------------------------------------------------- 1 | # 应用:kubectl proxy和apiserver proxy 2 | `译者:李昂` `校对:无` 3 | 4 | 5 | 你已经看过了`kubectl proxy`和`apiserver proxy`的[基本知识](http://kubernetes.io/v1.0/docs/user-guide/accessing-the-cluster.html)。本页将为你展示如何一起使用它们去访问运行在你的工作站上的Kubernetes集群提供的服务([kube-ui](http://kubernetes.io/v1.0/docs/user-guide/ui.html))。 6 | 7 | ## 获取kube-ui的apiserver proxy URL 8 | 9 | kube-ui是作为一个集群的插件进行部署的。想要找到他的apiserver proxy URL: 10 | ``` 11 | $ kubectl cluster-info | grep "KubeUI" 12 | KubeUI is running at https://173.255.119.104/api/v1/proxy/namespaces/kube-system/services/kube-ui 13 | 14 | ``` 15 | 如果这条命令不能找到URL,试试[这些步骤](http://kubernetes.io/v1.0/docs/user-guide/ui.html#accessing-the-ui)。 16 | 17 | ## 从你的本地工作站连接到kube-ui服务 18 | 19 | 上面说的proxy URL是由apiserver提供来访问kube-ui服务的。你要是在本地想访问它仍然需要用apiserver认证。`kubectl proxy`可以处理认证。 20 | ``` 21 | $ kubectl proxy --port=8001 22 | Starting to serve on localhost:8001 23 | 24 | ``` 25 | 现在你就可以在你的本地工作站访问kube-ui服务了,使用如下地址 26 | http://localhost:8001/api/v1/proxy/namespaces/kube-system/services/kube-ui 27 | -------------------------------------------------------------------------------- /059-Connect with Port Forwarding.md: -------------------------------------------------------------------------------- 1 | # 应用:kubectl port-forward 2 | `译者:李昂` `校对:无` 3 | 4 | 5 | kubectl port-forward命令转发了本地端口到pod端口的连接。它的[手册](http://kubernetes.io/v1.0/docs/user-guide/kubectl/kubectl_port-forward.html)现在这里可以查看。相比于[kubectl proxy](http://kubernetes.io/v1.0/docs/user-guide/accessing-the-cluster.html#using-kubectl-proxy),`kubectl port-forward`也可以转发TCP流量而`kubectl proxy`只能转发HTTP流量。本页阐述了如何使用`kubectl port-forward`去连接Redis 数据库,这在数据库查错中很有用。 6 | 7 | ## 创建一个Redis主服务 8 | 9 | ``` 10 | $ kubectl create examples/redis/redis-master.yaml 11 | pods/redis-master 12 | 13 | ``` 14 | 等Redis主服务的pod状态变为Running和Ready。 15 | ``` 16 | $ kubectl get pods 17 | NAME READY STATUS RESTARTS AGE 18 | redis-master 2/2 Running 0 41s 19 | 20 | ``` 21 | 22 | ## 连接到Redis主服务 23 | 24 | Redis主服务监听在端口6379,使用下面命令可以验证, 25 | ``` 26 | $ kubectl get pods redis-master -t='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}' 27 | 6379 28 | 29 | ``` 30 | 然后我们转发redis主服务pod的端口6379到本地6379端口, 31 | ``` 32 | $ kubectl port-forward -p redis-master 6379:6379 33 | I0710 14:43:38.274550 3655 portforward.go:225] Forwarding from 127.0.0.1:6379 -> 6379 34 | I0710 14:43:38.274797 3655 portforward.go:225] Forwarding from [::1]:6379 -> 6379 35 | 36 | ``` 37 | 想要验证连接成功,我们可以在本地启动一个redis客户端, 38 | ``` 39 | $ redis-cli 40 | 127.0.0.1:6379> ping 41 | PONG 42 | 43 | ``` 44 | 现在我们就可以从本地来检查数据库了。 45 | -------------------------------------------------------------------------------- /060-Overview and Concepts.md: -------------------------------------------------------------------------------- 1 | # Kubenetes集群管理员手册 2 | `译者:李昂` `校对:无` 3 | 4 | 5 | 管理员手册适合于创建了或者正在管理Kubernetes集群的人。阅读管理员手册最好已经熟悉[用户手册](http://kubernetes.io/v1.0/docs/user-guide/README.html)中的一些概念。 6 | 7 | ## 规划一个集群 8 | 9 | 如何部署创建一个Kubernetes集群有很多不同的例子可以参考。很多例子都在这个[列表](http://kubernetes.io/v1.0/docs/getting-started-guides/README.html)中列出了。我们称在列表中每个组合为一个发行版。 10 | 11 | 在选择需要的手册之前,有些事情需要提前考虑: 12 | 13 | * 你只是想在你的笔记本上试一下Kubernetes还是创建一个多节点的高可用集群?这两种模式都是支持的,但是有些发行版只适合一种情况或其他情况。 14 | * 你是否会使用主机模式的Kubernetes集群,像是[GKE](https://cloud.google.com/container-engine)这种或是你自己启动的。 15 | * 你的集群在机房中或者云服务器上(IaaS)吗?Kubernetes不直接支持混合集群。我们推荐建立多个集群而不是跨越遥远的地点。 16 | * 你要在现实主机或者虚拟机上运行Kubernetes吗?Kubernetes都是支持的,请看不同的发行版。 17 | * 你只是想要运行一个集群还是想要为Kubernetes项目做开发?如果是后者,最好选择一个其他开发者都使用的发行版。某些发行版只有二进制可执行文件但却提供了多种选择。 18 | * 不是所有的发行版都被很好的维护着。最近版本的Kubernetes列出的一些只是为了测试。 19 | * 如果你在机房配置Kubernetes,你需要考虑最适合的[网络模型](http://kubernetes.io/v1.0/docs/admin/networking.html)。 20 | * 如果你正在设计高可用集群,你可以看看[运行在多个地点的集群](http://kubernetes.io/v1.0/docs/admin/multi-cluster.html)。 21 | * 你可以运行多种[组件](http://kubernetes.io/v1.0/docs/admin/cluster-components.html)构成的集群来使你自己变成更加熟练。 22 | 23 | ## 创建一个集群 24 | 25 | 从[列表](http://kubernetes.io/v1.0/docs/getting-started-guides/README.html)中挑选一个入门手册然后按它指导。如果没有入门指南适合你,你也可以参考入门手册中的一部分指导。 26 | 27 | 一种可选的网络模型就是*OpenVSwitch GRE/VxLAN* 网络([ovs-networking.md](http://kubernetes.io/v1.0/docs/admin/ovs-networking.html)),使用OpenVSwitch设置的网络可以使Kubernetes不同节点之间的pod通信。 28 | 29 | 如果你正在使用Salt修改已经存在指南,这篇文档会告诉你[Salt如何应用于Kubernetes项目](http://kubernetes.io/v1.0/docs/admin/salt.html)。 30 | 31 | ## 管理一个集群以及升级 32 | 33 | [管理集群](http://kubernetes.io/v1.0/docs/admin/cluster-management.html) 34 | 35 | ## 管理节点 36 | 37 | [管理节点](http://kubernetes.io/v1.0/docs/admin/cluster-management.html) 38 | 39 | ## 可选的集群服务 40 | 41 | 使用SkyDNS([dns.md](http://kubernetes.io/v1.0/docs/admin/dns.html))整合DNS:为Kubernetes服务解析DNS名字。 42 | 使用[Kibana](http://kubernetes.io/v1.0/docs/user-guide/logging.html)记录日志。 43 | 44 | ## 多租户支持 45 | 46 | 资源配额([resource-quota.md](http://kubernetes.io/v1.0/docs/admin/resource-quota.html)) 47 | 48 | ## 安全 49 | 50 | Kubernetes容器环境([docs/user-guide/container-environment.md](http://kubernetes.io/v1.0/docs/user-guide/container-environment.html)):阐述了Kubelet在管理Kubernetes节点上的容器时的环境。 51 | 52 | 安全访问API Server:[访问api](http://kubernetes.io/v1.0/docs/admin/accessing-the-api.html) 53 | 54 | 认证:[authentication](http://kubernetes.io/v1.0/docs/admin/authentication.html) 55 | 56 | 授权:[authorization](http://kubernetes.io/v1.0/docs/admin/authorization.html) 57 | 58 | 接纳控制:[admission_controllers](http://kubernetes.io/v1.0/docs/admin/admission-controllers.html) 59 | 60 | -------------------------------------------------------------------------------- /061-Planning and Designing.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/061-Planning and Designing.md -------------------------------------------------------------------------------- /062-Security.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/062-Security.md -------------------------------------------------------------------------------- /063-Access Management.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/063-Access Management.md -------------------------------------------------------------------------------- /064-Namespaces.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/064-Namespaces.md -------------------------------------------------------------------------------- /065-Administering Clusters.md: -------------------------------------------------------------------------------- 1 | # Kubernetes集群管理指南:集群组件 2 | `译者:Nancy` `校对:无` 3 | 4 | 5 | 本文概述了各种二进制组件,这些组件的运行可以提供一个有效的Kubernetes集群。 6 | 7 | ## 主组件 8 | 9 | 主组件可以提供集群的控制面板。例如,主组件负责对有关集群做全局性的决策(如,调度),以及探测和对集群事件的响应(如,当Replication Controller的‘replicas’字段不满足时,启动一个新的Pod)。 10 | 11 | 理论上,主组件可以运行在集群的任何节点上。但是,为了简单化,当前的设置脚本通常在同样的VM上启动所有的主组件,而且不会在该VM上运行用户容器。参考[high-availability.md](http://kubernetes.io/v1.1/docs/admin/high-availability.html),一个Multi-Master-VM设置的实例。 12 | 13 | 即便在未来,如果Kubernetes完全自托管,将只允许主组件调度节点的子集,以限制和运行用户Pod的合作运行,减少节点损害安全漏洞的可能范围。 14 | 15 | ### Kube-apiserver 16 | [Kube-apiserver](http://kubernetes.io/v1.1/docs/admin/kube-apiserver.html)暴漏出Kubernetes API;它是Kubernetes控制面的前端,可以横向扩展(如,可以通过运行多个API检测一个apiserver-- [high-availability.md](http://kubernetes.io/v1.1/docs/admin/high-availability.html))。 17 | 18 | ### etcd 19 | [etcd](http://kubernetes.io/v1.1/docs/admin/etcd.html)作为Kubernetes的后备存储。所有的集群数据都存储在这里。一个Kubernetes集群的适当管理包括对ETCD的数据备份计划。 20 | 21 | ### Kube控制器管理者 22 | [Kube控制器管理者](http://kubernetes.io/v1.1/docs/admin/kube-controller-manager.html)是运行控制器的一个二进制文件,处理集群中日常事务的后端进程。 逻辑上,每个控制器是独立的进程,但是为了减少系统中移动片的数量,它们都被编译成一个独立的二进制,并且运行在一个单一的进程中。 23 | 24 | 这些控制器包括: 25 | - Node Controller 26 | - 当节点异常时,负责查看和响应。 27 | - Replication Controller 28 | - 负责对系统中的每一个控制器对象,保持Pod的正确值。 29 | - Endpoints Controller 30 | - 填充端点对象(即加入Service & Pod) 31 | - Service Account & Token Controllers 32 | - 为新的Namespace创建默认账户和API接入的Token。 33 | - …等等。 34 | 35 | ### Kube调度 36 | [Kube调度](http://kubernetes.io/v1.1/docs/admin/kube-scheduler.html)观察新创建、还没有分配节点的Pod,并且从中选择一个节点运行。 37 | 38 | ### 扩展插件 39 | 扩展插件属于Pod和Service,实现了集群功能。它们不能在主VM上运行,但是目前能够调用API创建这些Pod和Service的默认启动脚本可以在主VM上运行。可参考[kube-master-addons](kube-master-addons.sh) 40 | 41 | 扩展插件对象创建在“kube-system”空间。 42 | 43 | 扩展插件实例: 44 | - [DNS](https://github.com/kubernetes/kubernetes/tree/release-1.1/cluster/addons/dns/)提供集群本地DNS。 45 | - [kube-ui](https://github.com/kubernetes/kubernetes/tree/release-1.1/cluster/addons/kube-ui/)为集群提供图形用户界面。 46 | - [fluentd-elasticsearch](https://github.com/kubernetes/kubernetes/tree/release-1.1/cluster/addons/fluentd-elasticsearch/)提供日志存储。参考[gcp version](https://github.com/kubernetes/kubernetes/tree/release-1.1/cluster/addons/fluentd-gcp/)。 47 | - [cluster-monitoring](https://github.com/kubernetes/kubernetes/tree/release-1.1/cluster/addons/cluster-monitoring/)监控集群。 48 | 49 | ## Node组件 50 | Node组件运行在每一个节点上,维护运行Pod,并给它们提供Kubernetes运行环境。 51 | 52 | ### Kubelet 53 | [Kubelet](http://kubernetes.io/v1.1/docs/admin/kubelet.html)是主节点代理。它: 54 | - 监督已经分配到节点的Pod(或者被apiserver分配,或者通过本地配置文件): 55 | - 挂载Pod需要的Volume 56 | - 下载Pod的Secret 57 | - 通过Docker(或,rkt)运行Pod容器 58 | - 定期执行任何请求的容器活性探针(container liveness probes) 59 | - 给系统的其它部分报告Pod的状态,如果有必要,可以创建“mirror pod” 60 | - 返回节点的状态给系统的其它部分。 61 | 62 | ### Kube代理 63 | [Kube代理](http://kubernetes.io/v1.1/docs/admin/kube-proxy.html)使得Kubernetes服务抽象化,在主机上维护网络规则,并且执行连接转发。 64 | 65 | ### Docker 66 | Docker主要用于运行容器。 67 | 68 | ### Rkt 69 | 70 | Rkt,实验证明,可以作为Docker的替代者。 71 | 72 | ### Monit 73 | 74 | Monit是一个轻量级进程维护系统,可以保持Kubelet和Docker正常运行。 75 | -------------------------------------------------------------------------------- /066-kube-apiserver Binary.md: -------------------------------------------------------------------------------- 1 | # Kube-API Server 2 | `译者:Nancy` `校对:无` 3 | 4 | 5 | ## 概要 6 | 7 | Kubernetes API服务器为API对象验证和配置数据,这些对象包含Pod,Service,Replication Controller等等。API Server提供REST操作以及前端到集群的共享状态,所有其它组件可以通过这些共享状态交互。 8 | ``` 9 | kube-apiserver 10 | ``` 11 | 12 | ## 选项 13 | ``` 14 | --admission-control="AlwaysAdmit":集群中资源的Admission Controller的插件的有序列表,分别使用逗号分隔,AlwaysAdmit, AlwaysDeny, DenyEscalatingExec, DenyExecOnPrivileged, InitialResources, LimitRanger, NamespaceAutoProvision, NamespaceExists, NamespaceLifecycle, ResourceQuota, SecurityContextDeny, ServiceAccount。 15 | --admission-control-config-file="": Admission Controller配置文件。 16 | --advertise-address=: 广播API Server给所有集群成员的IP地址。其它集群都可以访问该IP地址,如果为空,会使用--bind-address配置;如果该配置没有指定,会使用主机的默认接口。 17 | --allow-privileged[=false]: true,表示允许特权容器。 18 | --authorization-mode="AlwaysAllow": 安全端口授权插件的有序列表,分别以逗号分隔,AlwaysAllow,AlwaysDeny,ABAC。 19 | --authorization-policy-file="": 授权策略的CSV文件,使用于--authorization-mode=ABAC模式的配置。 20 | --basic-auth-file="": 如果配置该选项,该文件会通过HTTP基本认证允许API Server安全端口的请求。 21 | --bind-address=0.0.0.0: 服务--read-only-port和--secure-port端口的IP地址。相关接口必须是其它集群通过CLI/web客户端可访问的。默认配置0.0.0.0。 22 | --cert-dir="/var/run/kubernetes": TLS证书的目录(默认/var/run/kubernetes)。如果配置--tls-cert-file和--tls-private-key-file两个选项,会忽略该配置--cert-dir。 23 | --client-ca-file="": 如果设置,任何提交客户端证书的请求都会验证与相关客户端证书的CommonName的身份。该客户端证书是由client-ca-file中的一个认证机构重签的。 24 | --cloud-config="": 云提供商配置文件的路径,空表示没有该配置文件。 25 | --cloud-provider="": 云服务的提供商,空表示没有该提供商。 26 | --cluster-name="kubernetes": 集群实例的前缀。 27 | --cors-allowed-origins=[]: CORS的允许起源(allowed origins, 翻译待考虑)的列表,用逗号分隔。一个允许起源可以是支持子域匹配的正则表达式。如果该列表是空,则不启用CORS。 28 | --etcd-config="": ETCD客户端的配置文件,与-etcd-servers配置项互斥。 29 | --etcd-prefix="/registry": ETCD中所有资源路径的前缀。 30 | --etcd-servers=[]: ETCD服务器(http://ip:port)列表,以逗号分隔。与-etcd-config配置项互斥。 31 | --etcd-servers-overrides=[]: 每个资源ETCD服务器覆盖文件,以逗号分隔。独立覆盖格式,group/resource#servers,服务器是http://ip:port,以分号分隔。 32 | --event-ttl=1h0m0s: 保留事件的时间值,默认1小时。 33 | --experimental-keystone-url="": 如果Passed,激活Keystone认证插件。 34 | --external-hostname="": 为Master生成外部URLs使用的主机名。 35 | --google-json-key="": 用户Google Cloud Platform Service Account JSON Key认证。 36 | --insecure-bind-address=127.0.0.1:非安全端口(所有接口都设置为0.0.0.0)的服务IP地址。默认是本地地址。 37 | --insecure-port=8080: 不安全且没有认证的进程访问端口,默认8080。假设防火墙规则设置该端口从集群外部禁止访问,并且在集群的公共地址区,443端口是该端口的代理。这是nginx的默认配置。 38 | --kubelet-certificate-authority="": 证书路径。证书授权文件。 39 | --kubelet-client-certificate="": TLS客户端证书文件路径。 40 | --kubelet-client-key="": TLS客户端秘钥文件路径。 41 | --kubelet-https[=true]: 使用https建立Kubelet连接。 42 | --kubelet-port=10250: Kubelet端口。 43 | --kubelet-timeout=5s: Kubelet操作Timeout值。 44 | --log-flush-frequency=5s: 日志缓冲秒数的最大值。 45 | --long-running-request-regexp="(/|^)((watch|proxy)(/|$)|(logs?|portforward|exec|attach)/?$)": 匹配长时间运行请求的正则表达式,该请求不属于最大机请求处理。 46 | --master-service-namespace="default": Namespace,该Namespace的Kubernetes主服务应该注入Pod。 47 | --max-connection-bytes-per-sec=0: 如果非零,表示每个用户连接的最大值,字节数/秒,当前只适用于长时间运行的请求。 48 | --max-requests-inflight=400: 给定时间内运行的请求的最大值。如果超过最大值,该请求就会被拒绝。零表示没有限制。 49 | --min-request-timeout=1800: 这是个可选字段,表示一个请求处理的最短时间,单位是秒。在超时之前,这个请求必须是激活的。目前,请求处理程序会选择一个高于该数值的随机值作为连接超时的值进行分散负载。(An optional field indicating the minimum number of seconds a handler must keep a request open before timing it out. Currently only honored by the watch request handler, which picks a randomized value above this number as the connection timeout, to spread out load.-----翻译有待考虑) 50 | --oidc-ca-file="": 如果设置该选项,Oidc-ca-file中的相关机构会验证OpenID服务的证书。否则,会使用主机的根证书。 51 | --oidc-client-id="": 如果设置了oidc-issuer-url字段,该字段,OpenID连接客户端的客户ID也必须设置。 52 | --oidc-issuer-url="": OpenID发行的URL,只接受HTTPS协议。如果设置该字段,将被用来验证OIDC JSON Web Token(JWT)。 53 | --oidc-username-claim="sub": 。默认值之外的那些值,可能是不唯一的,可变的。这个标志还在尝试中,详情请参考Authentication 部分的文档。 54 | --profiling[=true]: 通过web接口进行分析 host:port/debug/pprof/。 55 | --runtime-config=: key=value键值对集,描述运行时配置,也会回传输到apiserver。apis/键值用于打开或者关闭指定的api版本。apis//用于打开、关闭指定的资源。api/all和api/legacy是特殊的值,分别控制所有和遗留的api版本。 56 | --secure-port=6443: 用于HTTPS的认证和授权。0表示不支持HTTPS服务。 57 | --service-account-key-file="": 该文件包含RPM-encoded x509 RSA的私钥和公钥,用于验证ServiceAccount的Token。如果没有指定,会使用该配置--tls-private-key-file。 58 | --service-account-lookup[=false]: true, 表示验证Service Account的Token做为Authentication一部分在ETCD中的存在性。 59 | --service-cluster-ip-range=: CIDR标记的IP范围,从中分配IP给服务集群。该范围不能与分配给Pod节点的任何IP范围重叠。 60 | --service-node-port-range=: NodePort可见性服务的端口范围,包含范围的两端。如'30000-32767',包含30000和32767端口。 61 | --ssh-keyfile="": 如果非空,使用安全SSH代理到该节点,用该秘钥文件。 62 | --ssh-user="": 如果非空,使用安全SSH代理到该节点,用该用户名。 63 | --storage-versions="extensions/v1beta1,v1": 存储资源的版本。不同的组存储在不同的版本里面,指定格式"group1/version1,group2/version2..."。该标志预计出注册在服务器中的所有组的存储版本的完整列表。它默认是所有注册组的首选版本列表,来自KUBE_API_VERSIONS变量。 64 | --tls-cert-file="": 该文件包含HTTPS的x509证书。(CA证书,如果存在,连接在服务器证书之后)。如果支持HTTPS服务,且没有配置--tls-cert-file和--tls-private-key-file选项,会为公共地址生成一个自签的证书和对应的秘钥,保存在/var/run/kubernetes中。 65 | --tls-private-key-file="": 该文件包含x509私钥匹配项--tls-cert-file. 66 | --token-auth-file="": 该文件使用Token验证保护API Server的安全端口。 67 | --watch-cache[=true]: 可以在API Server查看缓存。 68 | ``` 69 | -------------------------------------------------------------------------------- /067-Authorization.md: -------------------------------------------------------------------------------- 1 | # 授权插件 2 | `译者:Nancy` `校对:无` 3 | 4 | 授权是Kubernetes认证中的一个独立部分,参考[认证部分](http://kubernetes.io/v1.1/docs/admin/authentication.html)的文档。 5 | 6 | 授权应用在主(安全)API服务端口的所有HTTP访问请求。 7 | 8 | 任何请求的授权检查都会通过访问策略比较该请求上下文的属性,(比如用户,资源和Namespace)。API的调用必须符合一些规则,按顺序执行。 9 | 10 | 下面的选项都是可行的,可通过标志位选择: 11 | 12 | - --authorization-mode=AlwaysDeny 13 | - --authorization-mode=AlwaysAllow 14 | - --authorization-mode=ABAC 15 | 16 | AlwaysDeny会阻止所有的请求(测试中使用的)。AlwaysAllow允许所有请求,如果不需要授权,可以使用这个参数。ABAC(Attribute-Based Access Control)用于已经配置的用户授权规则。 17 | 18 | ## ABAC模式 19 | ### 请求属性 20 | 一个授权请求可配置五个参数: 21 | 22 | - 用户(用户是否是用户串) 23 | - 组(用户所属组名的列表) 24 | - 请求只读性(GETs是只读的) 25 | - 资源权限 26 | - 仅适用于API端点,例如/api/v1/namespaces/default/pods。对于杂端点(miscellaneous endpoints,翻译有待考虑),如/version,是空串。 27 | - 可访问对象的Namespace,空串的Namespace,该空串端点不支持命名对象。 28 | 29 | 我们期望增加更多的属性,允许更细粒度的访问控制,并协助策略管理。 30 | 31 | ### 策略文件格式 32 | ABAC模式,也可以指定参数:--authorization-policy-file=SOME_FILENAME 33 | 34 | 该文件格式每行有[一个JSON对象]( http://jsonlines.org/),不会有封闭列表或者映射,而仅仅每行有一个映射。 35 | 36 | 每行是一个“策略对象”。一个策略对象是包含以下属性的一个映射: 37 | 38 | - user, 字符型;来自--token-auth-file,如果指定用户,必须匹配认证用户的用户名。 39 | - group,字符型;如果指定用户组,必须匹配认证用户所属组的其中一个。 40 | - readonly,布尔型,true表示该策略仅适用于GET操作。 41 | - resource,字符型;一个资源来自一个URL,比如Pod。 42 | - namespace,字符型;一个Namespace字符串。 43 | 44 | 未设置的属性同类型设置为zero的属性(如,空串,0,false),含义是相同的。但是,没设置的属性首选是可读性。 45 | 46 | 在未来,策略可以展现在JSON格式中,并通过REST接口进行管理。 47 | 48 | ### 授权算法 49 | 一个请求属性和一个策略对象的属性是相关的。 50 | 51 | 一个请求被接受时,其属性是确定的。未知属性默认设置为0,如空串,0,false。 52 | 53 | 未设置的属性将匹配相应属性的任何值。 54 | 55 | 检查属性的元组在每一个策略文件中每个策略的匹配正确性。至少有一行匹配到该请求属性,则授权该请求(但之后的验证也许会失败)。 56 | 57 | 为了让每个用户都做些事情,编写一个策略用于用户未设置的属性。(To permit any user to do something, write a policy with the user property unset. To permit an action Policy with an unset namespace applies regardless of namespace. 翻译有待考虑) 58 | 59 | ### **示例** 60 | 1. Alice能够做任何事情: {“user”:”alice”} 61 | 2. Kubelet能够读任何pods:{"user":"kubelet", "resource": "pods", "readonly": true} 62 | 3. Kubelet能够读写事件:{“user”: "kubelet", "resource": "events"} 63 | 4. Bob只能在”projectCaribou”命名空间中读pods:{"user":"bob", "resource": "pods", "readonly": true, "ns": "projectCaribou"} 64 | 65 | [完整文件示例]( https://github.com/kubernetes/kubernetes/blob/release-1.1/pkg/auth/authorizer/abac/example_policy_file.jsonl) 66 | 67 | ### 服务账户的快速标记 68 | 一个服务账户会自动生成一个用户。该用户的名字生成是根据如下命名规范: 69 | ``` 70 | system:serviceaccount:: 71 | ``` 72 | 创建一个新的Namespace,也会附带创建一个新的服务账户,格式如下: 73 | ``` 74 | system:serviceaccount::default 75 | 76 | ``` 77 | 例如,如果你想要在Kube系统授予API默认账户的所有权限,你需要在规则文件中添加如下一行: 78 | ``` 79 | {"user":"system:serviceaccount:kube-system:default"} 80 | 81 | ``` 82 | 重启apiserver使新添加的规则生效。 83 | 84 | ## 插件开发 85 | 其余实现的开发相对容易,API服务会调用Authorizer接口: 86 | ```sh 87 | type Authorizer interface { 88 | Authorize(a Attributes) error 89 | } 90 | ``` 91 | 确认是否允许每一个API行为。 92 | 93 | 一个授权插件是实现该接口的一个模块。授权插件源码路径:pkg/auth/authorization/$MODULENAME. 94 | 95 | 一个授权模块完全是用Go语言实现的,或者可以调用一个远程授权服务。授权模块有自己的缓存,减少对相同或相似参数重复授权的成本。开发人员应该考虑缓存和权限撤销之间的相互交互。 96 | -------------------------------------------------------------------------------- /068-Authentication.md: -------------------------------------------------------------------------------- 1 | # 认证插件 2 | `译者:Nancy` `校对:无` 3 | 4 | Kubernetes使用客户端证书,令牌,或者HTTP基本身份验证用户的API调用。 5 | 6 | 在API服务器中配置—client-ca-file=SOMEFILE选项,就会启动客户端证书认证。引用文件必须包含一个或多个认证机制,通过认证机制验证传给API服务器的客户端证书。当一个客户端证书通过认证,该证书主题的名字就被作为该请求的用户名。 7 | 8 | 在API服务器中配置选项:--token-auth-file=SOMEFILE, 启动Token认证。目前,Token没有有效期,必须重启API服务,Token列表的更改才会生效。 9 | 10 | 令牌文件格式路径:plugin/pkg/auth/authenticator/token/tokenfile/...,该文件是一个CSV文件,含有三行:Token,用户名,用户uid。 11 | 12 | 当http客户端使用Token认证,apiserver需要含有Bearer Sometoken值的一个Authorization头。 13 | 14 | OpenID Connect ID Token,传递下面的参数给apiserver: 15 | - --oidc-issuer-url (必须) API Server连接到OpenID提供者的URL, 只接受HTTPS协议。 16 | - --oidc-client-id (必须) API Server用于验证Token用户,合法的[ID Token](http://openid.net/specs/openid-connect-core-1_0.html#IDToken)在它的aud参数(aud claims 翻译待考虑)中包含该client-id。 17 | - --oidc-ca-file (可选) API Server用于和OpenID提供者建立和验证安全连接。 18 | - --oidc-username-claim (可选, 实验性参数) 指定用户名对应的OpenID。默认设置为sub参数,在指定域中是唯一的,不可变的。集群管理员可以选择其它参数如email,作为用户名,但不保证其唯一性和不变性。 19 | 20 | 请注意,这个标志仍然处于试验阶段,如果我们可以处理更多关于OpenID用户和Kubernetes用户的映射关系,便可以开始使用。因此,未来的变化还是很有可能的。 21 | 22 | 目前,该ID Token会通过一些第三方应用程序获取。这意味着应用程序必须和API Server共享该配置--oidc-client-id。 23 | 24 | 如Token文件,当从HTTP客户端使用Token认证方式,API Server希望在Authorization头添加一个Bearer SOMETOKEN的值。 25 | 26 | 启动基本认证,需要在API Server配置选项—basic_auth_file=SOMEFILE。当前,基本认证凭据是无限期的,而且重启API Server,密码的修改才会生效。需要注意,基本认证方式是更安全的模式,更容易使用,更通用。 27 | 28 | 基本认证文件格式,plugin/pkg/auth/authenticator/password/passwordfile/...,该文件是一个CSV文件,含有三个值,密码,用户名和用户id。 29 | 如果在HTTP客户端使用基本认证,API Server需要一个值是Basic BASE64ENCODEDUSER:PASSWOR的Authorization头。 30 | 31 | Keystone认证会在API Server启动的时候把--experimental-keystone-url='AuthURL'参数传给API Server,该认证就会生效。该插件在plugin/pkg/auth/authenticator/request/keystone/keystone.go文件中实现。有关如何使用Keystone去管理项目和用户的详细信息,请参考[Keystone文档](http://docs.openstack.org/developer/keystone/)。请注意,该插件还处于试验阶段,很可能还会变化。请参考有关该插件的[讨论](https://github.com/kubernetes/kubernetes/pull/11798#issuecomment-129655212)和[计划](https://github.com/kubernetes/kubernetes/issues/11626)了解更多细节。 32 | 33 | ## 插件开发 34 | 我们计划给Kubernetes API Server解决Token问题。使用“bedrock”认证用户,外部提供者给Kubernetes。我们计划使Kubernetes和一个Bedrock认证提供者(如github.com,google.com,Enterprise Directory, Kerberos等等)之间的接口开发更容易。 35 | 36 | ## 附录 37 | ### 创建证书 38 | 客户端证书认证,用户可以手动产生证书,也可以使用已经存在的脚本部署。 39 | 40 | 部署脚本路径在cluster/saltbase/salt/generate-cert/make-ca-cert.sh。执行该脚本需要两个参数,一个是API Server的IP地址,另一个是IP:或者DNS:主题备用名称的列表。该脚本会产生三个文件,ca.crt,server.crt和server.key。最后,添加下面的参数作为API Server的启动参数, --client-ca-file=/srv/kubernetes/ca.crt,--tls-cert-file=/srv/kubernetes/server.cert,--tls-private-key-file=/srv/kubernetes/server.key。 41 | 42 | Easyrsa可以用来为你的集群手动生成证书。 43 | 44 | 1. 下载,解压,初始化Easyrsa3的补丁版本。 45 | ``` 46 | curl -L -O https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz 47 | tar xzf easy-rsa.tar.gz 48 | cd easy-rsa-master/easyrsa3 49 | ./easyrsa init-pki 50 | ``` 51 | 2. 产生一个CA. (--batch设置自动模式。--req-cn使用默认CN。) 52 | ``` 53 | ./easyrsa --batch "--req-cn=${MASTER_IP}@date +%s" build-ca nopass 54 | ``` 55 | 3. 产生服务器证书和秘钥。(build-server-full [文件名]:给客户端和服务器生成一个本地的秘钥对和信号) 56 | ``` 57 | ./easyrsa --subject-alt-name="IP:${MASTER_IP}" build-server-full kubernetes-master nopass 58 | ``` 59 | 4. 复制pki/ca.crt,pki/issued/kubernetes-master.crt,pki/private/kubernetes-master.key到你的目录。 60 | 5. 记得填写参数--client-ca-file=/yourdirectory/ca.crt,--tls-cert-file=/yourdirectory/server.cert,--tls-private-key-file=/yourdirectory/server.key,并作为API Server的启动参数。 61 | 62 | Openssl也可以用来给你的集群手动生成证书。 63 | 1. 使用2048bit生成ca.key:openssl genrsa -out ca.key 2048 64 | 2. 根据ca.key生成ca.crt。(-days设置证书的有效时间)。 65 | ``` 66 | openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 10000 -out ca.crt 67 | ``` 68 | 3. 使用2048bit生成server.key:openssl genrsa -out server.key 2048 69 | 4. 根据server.key生成server.csr。 70 | ``` 71 | openssl req -new -key server.key -subj "/CN=${MASTER_IP}" -out server.csr 72 | ``` 73 | 5. 根据ca.key,ca.crt和server.csr生成server.crt。 74 | ``` 75 | openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 10000 76 | ``` 77 | 6. 查看证书:openssl x509 -noout -text -in ./server.crt。 最后,记得填写参数,并作为API Server的启动参数。 78 | -------------------------------------------------------------------------------- /069-Accessing the API.md: -------------------------------------------------------------------------------- 1 | # API Server端口配置 2 | `译者:Nancy` `校对:无` 3 | 4 | 5 | 本文档介绍Kubernetes apiserver服务的端口以及如何访问这些端口。观众都是集群管理员,都想定制他们自己的集群或者了解细节。 6 | 7 | 有关集群访问的更多问题,在[Accessing the cluster](http://kubernetes.io/v1.1/docs/user-guide/accessing-the-cluster.html)都有覆盖。 8 | 9 | ## 服务的Ports和IPs 10 | Kubernets API Server进程提供Kuvernetes API。通常情况下,有一个进程运行在单一kubernetes-master节点上。 11 | 12 | 默认情况,Kubernetes API Server提供HTTP的两个端口: 13 | 14 | 1.本地主机端口 15 | - HTTP服务 16 | - 默认端口8080,修改标识--insecure-port 17 | - 默认IP是本地主机,修改标识—insecure-bind-address 18 | - 在HTTP中没有认证和授权检查 19 | - 主机访问受保护 20 | 21 | 2.Secure Port 22 | - 默认端口6443,修改标识—secure-port 23 | - 默认IP是首个非本地主机的网络接口,修改标识—bind-address 24 | - HTTPS服务。设置证书和秘钥的标识,--tls-cert-file,--tls-private-key-file 25 | - [认证方式](http://kubernetes.io/v1.1/docs/admin/authentication.html),令牌文件或者客户端证书 26 | - 使用基于策略的[授权方式](http://kubernetes.io/v1.1/docs/admin/authorization.html) 27 | 28 | 3.移除:只读端口 29 | - 基于安全考虑,会移除只读端口,使用[Service Account](http://kubernetes.io/v1.1/docs/user-guide/service-accounts.html)代替。 30 | 31 | ## 代理和防火墙规则 32 | 此外,在某些配置文件中有一个代理(nginx)作为API Server进程运行在同一台机器上。该代理是HTTPS服务,认证端口是443,访问API Server是本地主机8080端口。在这些配置文件里,Secure Port通常设置为6443。 33 | 34 | 防火墙规则,通常配置运行外部HTTPS通过443端口访问。 35 | 36 | 上面的都是默认配置,反应了Kubernetes使用kube-up.sh如何部署到Google Compute Engine。其它的云提供商可能会有所不同。 37 | 38 | ## 用例和IP:Ports 39 | 有关服务端口,有三种不同的配置,有各自的应用场景。 40 | 1. Kubernetes集群之外的客户端,例如在台式机上运行kubectl命令的人员。目前,通过运行在kubernetes-master机器上面的代理(nginx)访问本地主机端口。该代理可以使用证书认证或者Token认证方式。 41 | 2. 运行在Kuvernetes的Container里面的进程需要从API Server中读取。目前,这些进程都是用[Service Account](http://kubernetes.io/v1.1/docs/user-guide/service-accounts.html) 42 | 3. 调度器和Controller管理进程,需要对API做读写操作。目前,这些都必须运行在API Server同样的主机上面,使用本地主机。未来,这些进程将会使用Service Account服务,避免共存的必要。 43 | 4. Kubelets,需要对API做读写操作,并且同API Server相比,它必须运行在不同的机器上面。Kubelet使用Secure Port获取Pod,发现Pod可以看到的服务,并且记录这些事件。在集群启动事件内,分布设置Kubelet凭证。Kubelet和Kube-proxy可以使用证书认证和Token认证方式。 44 | 45 | ## 预期变化 46 | - Policy会限制Kubelet通过身份认证端口实行的一些操作。 47 | - 调度器和Controller管理也会使用Secure Port。他们可以运行在不同的机器上。 48 | -------------------------------------------------------------------------------- /070-Admission Controllers.md: -------------------------------------------------------------------------------- 1 | # Admission Controller 2 | `译者:Nancy` `校对:无` 3 | 4 | 5 | 目录 6 | - Admission Controller『参见以下内容』 7 | - Admission Controller是什么?『参见下文“什么是Admission Controller”』 8 | - 为什么使用Admission Controller?『参见下文“为什么使用Admission Controller”』 9 | - 如何使用接入控制插件?『参见下文“如何接入该插件”』 10 | - 每个插件的功能『参见下文“每个插件的功能是什么”』 11 | - AlwaysAdmit『参见下文“AlwaysAdmin插件”』 12 | - AlwaysDeny『参见下文“AlwaysDeny插件”』 13 | - DenyExecOnPrivileged (废弃)『参见下文“DenyExecOnPrivileged (废弃)插件”』 14 | - DenyEscalatingExec『参见下文“DenyEscalatingExec插件”』 15 | - ServiceAccount『参见下文“ServiceAccount插件”』 16 | - SecurityContextDeny『参见下文“SecurityContextDeny插件”』 17 | - ResourceQuota『参见下文“ResourceQuota插件”』 18 | - LimitRanger『参见下文“LimitRanger插件”』 19 | - NamespaceExists (废弃)『参见下文“NamespaceExists(废弃)插件”』 20 | - NamespaceAutoProvision (废弃)『参见下文“NamespaceAutoProvision (废弃)插件”』 21 | - NamespaceLifecycle『参见下文“NamespaceLifecycle插件”』 22 | - 是否有推荐的插件集合?『参见下文“是否有推荐的插件集合”』 23 | 24 | ## 什么是Admission Controller? 25 | Admission Controller插件是一段代码,其拦截Kubernetes API服务的请求早于对象的持久性,但是在请求的认证和授权之后。插件代码位于API服务进程中,会编译成二进制以便此时使用。 26 | 27 | 集群在接受一个请求之前,每一个Admission Controller插件都会按序运行。如果这个序列中的某个插件拒绝该请求,则整个的请求都会被立刻拒绝,返回一个错误给用户。 28 | 29 | Admission Controller插件在某些情况下也许会改变传进来的对象,配置系统默认值。此外,Admission Controller插件也许会改变请求处理中的部分相关资源去做些事情,比如增量配额的使用。 30 | 31 | ## 为什么使用Admission Controller? 32 | Kubernetes中许多高级功能需要激活Admission Controller插件,以便更好的支持该功能。总之,没有正确配置Admission Controller插件的Kubernetes API服务是不完整的服务,很多用户期望的服务是不支持的。 33 | 34 | ## 如何接入该插件? 35 | Kubernetes API 服务器提供了一个参数,admission-control,用逗号分隔,在集群中修改对象之前,调用许可控制选项的有序列表。 36 | 37 | ## 每个插件的功能是什么? 38 | ### AlwaysAdmin插件**** 39 | 使用插件本身处理所有请求。 40 | 41 | ### AlwaysDeny插件**** 42 | 拒绝所有请求,主要用于测试。 43 | 44 | ### DenyExecOnPrivileged (废弃)插件**** 45 | 如果一个Pod有一个特权Container,该插件就会拦截所有的请求,在该Pod中执行一个命令。 46 | 47 | 如果你的集群支持特权Container,而且你想要限制终端用户在那些Container中执行命令的权限,我们强烈建议使用该插件。 48 | 49 | 该功能已经合并到DenyEscalatingExec插件『参见下文“DenyEscalatingExec插件”』) 50 | 51 | ### DenyEscalatingExec插件**** 52 | 该插件拒绝执行和附加令到允许主机访问的且有升级特权的Pod。包含含有运行特权的Pod,有访问主机PID Namespace的权限。 53 | 54 | 如果你的集群支持含有升级特权的Container,而且你想要限制终端用户在这些Container中执行命令的能力,我们强烈建议使用该插件。 55 | 56 | ### ServiceAccount插件**** 57 | 这个插件实现了[serviceAccounts](http://kubernetes.io/v1.1/docs/user-guide/service-accounts.html)的自动化。如果你打算使用Kubernetes ServiceAccount对象,我们强烈建议使用该插件。 58 | 59 | ### SecurityContextDeny插件**** 60 | 61 | [SecurityContext](http://kubernetes.io/v1.1/docs/user-guide/security-context.html)定义了一些不适用于Container的选项,这个插件将会拒绝任何含有该SecurityContext的Pod。 62 | 63 | ### ResourceQuota插件**** 64 | 65 | 该插件会检查传入的请求,确保其不违反任何Namespace中ResourceQuota对象枚举的约束条件。如果你在Kubernetes开发中正在使用ResourceQuota对象,你必须使用该插件实现配额约束条件。 66 | 67 | 查看[resourceQuota设计文档](http://kubernetes.io/v1.1/docs/design/admission_control_resource_quota.html)和[Resource Quota示例](http://kubernetes.io/v1.1/docs/admin/resourcequota/README.html)了解更多细节。 68 | 69 | 强烈建议配置该插件在Admission Controller插件的序列中。This is so that quota is not prematurely incremented only for the request to be rejected later in admission control。(该句话翻译有待考虑) 70 | 71 | ### LimitRanger插件**** 72 | 该插件会检查传入的请求,确保其不违反任何Namespace中LimitRange对象枚举的约束条件。如果你在Kubernetes开发中正在使用LimitRange对象,你必须使用该插件实现约束条件。LimitRange也经常用于Pod中默认资源请求,不会指定哪一个请求。目前,默认LimitRange,在默认的Namespace中对所有的Pod,需要0.1CPU。 73 | 74 | 查阅[LimitRange设计文档](http://kubernetes.io/v1.1/docs/design/admission_control_limit_range.html)和[用例](http://kubernetes.io/v1.1/docs/admin/limitrange/),了解更多详细信息。 75 | 76 | ### NamespaceExists(废弃)插件**** 77 | 该插件会检查所有传入的请求,尝试在Kubernetes Namespace中创建资源,如果该Namespace不是当前创建的,该插件会拒绝这个请求。我们强烈建议使用该插件,确保数据的完整性。 78 | 79 | Admission Controller的该功能已经并入NamespaceLifecycle插件。 80 | 81 | ### NamespaceAutoProvision (废弃)插件**** 82 | 该插件会检查所有传入的请求,尝试在Kubernetes Namespace中创建资源,如果Namespace不存在,会创建一个新的Namespace。 83 | 84 | 我们强烈建议NamespaceExists插件优先级高于NamespaceAutoProvision插件。 85 | 86 | ### NamespaceLifecycle插件**** 87 | 如果Namespace已经终止,则不能在其中创建新的Namespace,该插件会强制该操作。 88 | 89 | 删除一个Namespace会终止一系列操作,移除该Namespace中所有对象(Pod,服务等等)。为了加强该过程的完整性,我们建议使用该插件。 90 | 91 | ## 是否有推荐的插件集合? 92 | 是的。 93 | 94 | Kubernetes1.0,我们强烈建议使用如下的许可控制插件集合(按顺序排列): 95 | ``` 96 | --admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota 97 | ``` 98 | -------------------------------------------------------------------------------- /071-Administrating Service Accounts.md: -------------------------------------------------------------------------------- 1 | # Service Accounts集群管理指南 2 | `译者:Nancy` `校对:无` 3 | 4 | 5 | *这是对Service Accounts的集群管理指南,详情[Service Accounts用户指南](http://kubernetes.io/v1.1/docs/user-guide/service-accounts.html).* 6 | 7 | *对用户授权和用户账户的支持正在计划中,还没有完全完成。有时候,不完整的一些特性,可以更好的描述Service Accounts。* 8 | 9 | ## User Accounts和Service Accounts 10 | 11 | 基于以下原因,Kubernetes区分了User Accounts和Service Accounts: 12 | - User Accounts针对人,Service Accounts针对运行在Pod的进程; 13 | - User Accounts是全局的,其名字必须在一个集群的所有Namespace中是唯一的。未来的用户资源将不被命令,但是Service Accounts是可以被命名的。 14 | - 通常情况下,集群的User Accounts可以从一个企业数据库同步。在企业数据库中,新建的账户需要特殊权限,而且绑定到复杂业务流程。新建Service Accounts可以更加轻量级,允许集群用户为特殊任务创建Service Accounts(比如,最小权限规则)。 15 | - 对人类和Service Accounts的审核注意事项是不同的。 16 | - 复杂系统的配置包含对系统组件的各种Service Accounts的定义。因为Service Accounts可以创建ad-hoc,可以命名,配置是便携式的。 17 | 18 | ## Service Accounts自动化 19 | 20 | 三个独立的组件合作实现对Service Accounts的自动化。 21 | - Service账户Admission Controller 22 | - Token控制器 23 | - Service Accounts控制器 24 | 25 | ### Service Accounts Admission Controller 26 | Pod的修改是[Admission Controller](http://kubernetes.io/v1.1/docs/admin/admission-controllers.html)插件实现的,该插件是apiserver的一部分。插件的创建和更新,会同步修改Pod。当插件状态是active(大多版本中,默认是active),创建或者修改Pod会遵循以下流程: 27 | 28 | 1. 如果该Pod没有ServiceAccount集,将ServiceAccount设为default 29 | 2. ServiceAccount必须有存在的Pod引用,否则拒绝该ServiceAccount 30 | 3. 如果该Pod不包含任何ImagePullSecrets,然后该ServiceAccount的ImagesPullSecrets会被加入Pod。 31 | 4. 添加一个volume到该Pod,包含API访问的令牌。 32 | 5. 添加一个volume到该Pod的每一个容器,挂载在/var/run/secrets/kubernetes.io/serviceaccount 33 | 34 | ###** Token Controller** 35 | 36 | TokenController做为controller-manager的一部分异步运行。 37 | - 检查serviceAccount的创建,并且创建一个关联的Secret,允许API访问。 38 | - 检查serviceAccount的删除,并且删除所有相关ServiceAccountToken Secrets 39 | - 检查额外Secret,确保引用的ServiceAccount的存在,并且如果有必要则添加一个Token到该Secret。 40 | - 检查Secret的删除,如果有必要,从相关的ServiceAccount中移除参考信息。 41 | 42 | #### 创建额外的API Token 43 | 一个控制循坏要确保每一个Service Accounts存在一个API Token。为一个Service Accounts创建一个额外的API Token,类型是ServiceAccountToken,含有一个注释去引用到对应的个Service Accounts。该控制器使用如下的Token去更新: 44 | ```Json 45 | secret.json: 46 | { 47 | "kind": "Secret", 48 | "apiVersion": "v1", 49 | "metadata": { 50 | "name": "mysecretname", 51 | "annotations": { 52 | "kubernetes.io/service-account.name": "myserviceaccount" 53 | } 54 | }, 55 | "type": "kubernetes.io/service-account-token" 56 | } 57 | 58 | kubectl create -f ./secret.json 59 | kubectl describe secret mysecretname 60 | ``` 61 | #### 删除、废弃一个个Service Accounts Token 62 | ``` 63 | kubectl delete secret mysecretname 64 | ``` 65 | ### 服务账户控制器(Service Account Controller)(考虑可以不翻译) 66 | 67 | Service Account Controller管理Namespace中的ServiceAccount,确保每一个“default”的ServiceAccount存在于每一个活动空间中。 68 | -------------------------------------------------------------------------------- /073-kube-scheduler Binary.md: -------------------------------------------------------------------------------- 1 | # Kube调度器 2 | `译者:Nancy` `校对:无` 3 | 4 | 5 | ## 概要 6 | Kubernetes调度器是一个函数,policy-rich,topology-aware和workload-specific(三个形容词,翻译待考虑),显著影响可用性、性能和容量。该调度器需要考虑个人和集体的资源需求,服务质量需求,硬件、软件、策略约束,亲和力和非亲和力规范,数据局部性,内部工作负载干扰,截止日期等等。特定工作负载需求在必要时会通过API暴露。 7 | ``` 8 | kube-scheduler 9 | ``` 10 | ## 选项 11 | ``` 12 | --address=127.0.0.1:服务的IP地址 (所有的接口,设置为0.0.0.0) 13 | --algorithm-provider="DefaultProvider":提供的调度算法,DfaultProvider是其中一种。 14 | --bind-pods-burst=100:爆发期间每秒允许绑定的调度数量。 15 | --bind-pods-qps=50: 可以继续工作的每秒允许绑定的调度数量。 16 | --google-json-key="":用户认证的Google Cloud Platform Service Account JSON Key。 17 | --kubeconfig="": 含有授权和主位置信息的Kube配置文件路径。 18 | --log-flush-frequency=5s:日志缓冲最大值,单位是秒。 19 | --master="":Kubernetes API服务器地址(Kube配置文件里都有说明) 20 | --policy-config-file="":含有调度策略的配置文件。 21 | --port=10251:调度的HTTP协议服务端口。 22 | --profiling[=true]:通过Web接口host:port/debug/pprof/,激活Profiling(翻译待考虑)。 23 | ``` 24 | -------------------------------------------------------------------------------- /079-networkingmd.md: -------------------------------------------------------------------------------- 1 | # 网络 2 | `译者:何炜` `校对:无` 3 | 4 | 5 | Kubernetes网络需要解决下面四类不同的问题: 6 | 7 | 1. 高耦合容器和容器间通信 8 | 2. Pod和Pod间通信 9 | 3. Pod和Service间通信 10 | 4. 外部和内部通信 11 | 12 | ## 模型和动机 13 | Kubernetes从默认的Docker网络模型中脱离出来(尽管和Docker 1.8的网络插件已经很接近了)。在一个共享网络命名空间的平面内,目标是一个pod一个IP,每个pod都可以和其它物理机或者容器实现跨网络通信。每个pod一个IP创建了一个简洁的,后向兼容的模型,在这个模型里,无论从哪个角度来看,包括端口分配,组网,命名,服务发现,负载均衡,应用配置和迁移,pod都可以被当作虚拟机或者物理主机。 14 | 15 | 另一方面,动态端口分配,要求同时支持静态端口(如对外部可接入的服务)和动态分配的端口;需要对中心型分配和本地获取动态端口做区分,复杂的调度(应为端口是稀缺资源)对用户来说是非常不方便的;复杂的应用配置,造成用户会被端口冲突、重用和耗尽所困扰;要求非标准的方式来命名(如consul和etcd而不是DNS);需要代理或者重定向才能让程序使用标准的命名和寻址技术(如web浏览器);如果还希望监控整个组成员的变化,并且阻碍容器或pod迁移(使用CRIU),就需要监控和缓存无效的地址和端口变化。其它问题中,NAT分隔地址空间引入了额外的复杂度,打破了自注册机制。 16 | 17 | ## 容器到容器 18 | 19 | 所有容器在一个pod中表现为它们在同一个主机上并且不受网络限制。它们可以通过端口在本地实现互相通信。这提供了简单(已知静态端口),安全(端口绑定在localhost,可以被pod中其他容器发现但不会被外部看到),还有性能提升。这同样减少了物理机获虚拟机上非容器化应用的迁移。人们运行应用都堆砌到统一个主机上,它已经解决了如何让端口不冲突和已经安排了如何让客户端去找到它。 20 | 21 | 这个方法确实减少了一个pod中容器的隔离性(端口可能冲突),并且可以没有容器私有化端口,但这些看起来都是未来才会面对的相对比较小的问题。另外,本地化pod是容器在pod中共享同样的资源(如volumes,cpu,内存等),所以希望并且可以容忍隔离性的减少。通常情况,用户可以控制哪些容器属于同一个pod,而不能控制哪些pod一起运行在一个主机上。 22 | 23 | ## Pod到Pod 24 | 25 | 因为每个pod都有一个“真”(非机器私有的)的IP地址,pods间可以相互通信,不依赖于代理和转换。Pod可以使用一个常见的端口号,还可以防止更高层次的服务发现系统像DNS-SD,Consul或者Etcd。 26 | 27 | 当任何容器调用ioctl(SIOCGIFADDR)(获取接口的地址),可以看到相同的IP,任何同级别的容器都可以看到这个IP,就是说每一个pod有自己的IP地址,并且这个IP地址其他pods也可以知道。在容器内外通过生成相同IP地址和端口,我们创造了一个非NAT模式,扁平化的地址空间。运行```ip addr show```应该可以看到期待的值。这会让所有现在的命名或发现机制到盒子外面去实现,包括自注册机制和应用分发IP地址。我们应该对pod间网络通信持乐观态度。在一个pod内,容器间更像是通过volumes(如tmpfs)或者IPC来通信。 28 | 29 | 这种方式和标准的Docker模式有所不同。在Docker模式下,每一个容器有一个IP,IP是在172.x.x.x的网段内,并且只能从SIOCGIFADDR看到172.x.x.x的地址。如果这些容器连接了另一个容器,那同级别容器会看到这个连接来自于一个不同的IP而不是容器自己知道的IP。简而言之,永远不能自注册同一个容器内的任何东西,因为一个容器不能被自己私有的IP获取到。 30 | 31 | 另一个解决方案我们考虑增加一个寻址层:每个容器一个中心化pod的IP。每个容器有自己本地的IP地址,这个IP只在pod内可见。这种方案可能会让在物理机或虚拟机上的容器化应用移动到pod中更容易,但会使实现变得更复杂(如需要每个pod一个桥,水平分割的DNS)。造成额外的地址转换,而且会破话自注册和IP分配机制。 32 | 33 | 像Docker,端口仍可以向主机节点的接口公开,但这样的需求应该从根本上减少。 34 | 35 | ## 实现 36 | 37 | For the Google Compute Engine cluster configuration scripts, we use advanced routing rules and ip-forwarding-enabled VMs so that each VM has an extra 256 IP addresses that get routed to it. This is in addition to the 'main' IP address assigned to the VM that is NAT-ed for Internet access. The container bridge (called cbr0 to differentiate it from docker0) is set up outside of Docker proper. 38 | 39 | 例如,GCE的高级路由规则: 40 | ``` 41 | gcloud compute routes add "${MINION_NAMES[$i]}" \ 42 | --project "${PROJECT}" \ 43 | --destination-range "${MINION_IP_RANGES[$i]}" \ 44 | --network "${NETWORK}" \ 45 | --next-hop-instance "${MINION_NAMES[$i]}" \ 46 | --next-hop-instance-zone "${ZONE}" & 47 | ``` 48 | 49 | 50 | GCE itself does not know anything about these IPs, though. This means that when a pod tries to egress beyond GCE's project the packets must be SNAT'ed (masqueraded) to the VM's IP, which GCE recognizes and allows. 51 | 52 | 53 | ### 其他实现 54 | 55 | With the primary aim of providing IP-per-pod-model, other implementations exist to serve the purpose outside of GCE. 56 | 57 | OpenVSwitch with GRE/VxLAN 58 | Flannel 59 | L2 networks ("With Linux Bridge devices" section) 60 | Weave is yet another way to build an overlay network, primarily aiming at Docker integration. 61 | Calico uses BGP to enable real container IPs. 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /092-Kubernetes 101.md: -------------------------------------------------------------------------------- 1 | # Kubernetes 101 - Kubectl CLI和Pods 2 | `译者:张迪` `校对:无` 3 | 4 | Kubernetes 101 - Kubectl CLI and Pods 5 | 6 | 对于Kubernetes 101,我们将覆盖的内容包括kubectl, pods, volumes, 以及多容器。 7 | 8 | 为了kubectl使用率示例可以正常运行,请确保你已经在本地有示例目录,可以从https://github.com/kubernetes/kubernetes/releases中或者从https://github.com/kubernetes/kubernetes中得到的。 9 | 10 | 内容列表 11 | * Kubernetes 101 - Kubectl CLI 和 Pods 12 | * Kubectl CLI 13 | * Pods 14 | * Pod 定义 15 | * Pod 管理 16 | * Volumes 17 | * Volume 类型 18 | * 多容器 19 | * 下面是什么? 20 | 21 | Kubectl CLI 22 | 23 | 同Kubernetes交互的最简单方法是通过kubectl命令行界面 24 | 25 | 对于kubectl的更多信息,包括它的使用率,命令,参数,请阅读kubectl CLI参考手册http://kubernetes.io/v1.1/docs/user-guide/kubectl/kubectl.html。 26 | 27 | 如果你没有安装好或者配置好kubectl,在继续阅读之前按照http://kubernetes.io/v1.1/docs/user-guide/prereqs.html把预置条件完成。 28 | 29 | Pods 30 | 31 | 在Kubernetes,一组单个或者多个容器叫做pod。Pod中的容器是部署在一起的,并且作为一组来启动,停止和复制。 32 | 33 | 点击pods链接http://kubernetes.io/v1.1/docs/user-guide/pods.html得到更多细节信息。 34 | 35 | Pod定义 36 | 37 | 最简单的pod定义描述了单个容器的部署。比如,一个nginx web服务器的pod可以定义如下: 38 | apiVersion: v1 39 | kind: Pod 40 | metadata: 41 | name: nginx 42 | spec: 43 | containers: 44 | - name: nginx 45 | image: nginx 46 | ports: 47 | - containerPort: 80 48 | 49 | Pod的定义声明了某个预期状态。预期状态是Kubernetes模型中非常重要的概念。很多事情在系统中体现为预期状态,而Kubernetes有责任确保当前状态匹配预期状态。举个例子,当你创建一个Pod,你指明其中的容器进入运行。如果容器没有运行(例如程序错误,...),为了驱使容器进入预期状态,Kubernetes将持续为你(再)创建这些容器。这个过程将一直持续到该Pod被删除。 50 | 51 | 获取更多细节信息,请查阅设计文档http://kubernetes.io/v1.1/docs/design/README.html。 52 | 53 | Pod管理 54 | 55 | 创建一个包含nginx server的pod(pod-nginx.yaml http://kubernetes.io/v1.1/docs/user-guide/walkthrough/pod-nginx.yaml): 56 | 57 | ``` 58 | $ kubectl create -f docs/user-guide/walkthrough/pod-nginx.yaml 59 | ``` 60 | 61 | 列出所有pods: 62 | 63 | ``` 64 | $ kubectl get pods 65 | ``` 66 | 67 | 在Pod部署的大部分环境里,Pod的IP都是外部不可见的。最便捷的测试Pod是否工作的方法是创建一个BusyBoxPod并且在上面远程运行命令。请查看可执行命令文档http://kubernetes.io/v1.1/docs/user-guide/kubectl/kubectl_exec.html以找到更多细节。 68 | 69 | 如果Pod IP可以访问,你应该可以利用curl访问在80端口访问http端点。 70 | 71 | ``` 72 | $ curl http://$(kubectl get pod nginx -o=template -t={{.status.podIP}}) 73 | ``` 74 | 75 | 通过名字删除pod: 76 | 77 | ``` 78 | $ kubectl delete pod nginx 79 | ``` 80 | 81 | Volumes 82 | 83 | 这对于一个简单的静态网站服务器很不错,那么对于需要持续性存储情况如何? 84 | 85 | 容器文件系统仅仅存在于容器的生存周期。所以,如果你的应用状态需要忍受迁移、重启和崩溃,你需要配置一些持续性存储。 86 | 87 | 在下面的例子中,我们将创建一个Redis Pod,这个Pod包括一个named Volume和包含Volume安装路径的Volume安装点。 88 | 89 | 1、定义一个Volume: 90 | ``` 91 | volumes: 92 | - name: redis-persistent-storage 93 | emptyDir: {} 94 | ``` 95 | 96 | 1. 在容器定义内定义一个Volume安装点 97 | 98 | ``` 99 | volumeMounts: 100 | # 名字必须与下面的Volume名字一致 101 | - name: redis-persistent-storage 102 | # 容器中的安装点 103 | mountPath: /data/redis 104 | ``` 105 | 106 | 带有持续存储Volume的Redis Pod定义举例(pod-redis.yamlhttp://kubernetes.io/v1.1/docs/user-guide/walkthrough/pod-redis.yaml): 107 | 108 | ``` 109 | apiVersion: v1 110 | kind: Pod 111 | metadata: 112 | name: redis 113 | spec: 114 | containers: 115 | - name: redis 116 | image: redis 117 | volumeMounts: 118 | - name: redis-persistent-storage 119 | mountPath: /data/redis 120 | volumes: 121 | - name: redis-persistent-storage 122 | emptyDir: {} 123 | ``` 124 | 125 | 案例下载http://kubernetes.io/v1.1/docs/user-guide/walkthrough/pod-redis.yaml 126 | 127 | 注: 128 | •volume安装点名字是一个指向一个特定空目录volume的指针。 129 | •volume安装目录是容器内安装特定空目录volume的路径。 130 | 131 | Volume 类型 132 | •EmptyDir:创建一个在容器失效和重启情况下可以持续的新目录 133 | •HostPath:将已经存在的目录安装在节点文件系统上 (e.g. /var/logs). 134 | 135 | 查阅 volumes http://kubernetes.io/v1.1/docs/user-guide/volumes.html可以得到更多细节。 136 | 137 | 多容器 138 | 139 | *注:下面的例子在语义上正确,但是某些镜像(比如 kubernetes/git-monitor)目前还不存在。我们正在努力将这些内容加入到可以工作的例子中。* 140 | 141 | However, often you want to have two different containers that work together. An example of this would be a web server, and a helper job that polls a git repository for new updates: 142 | 然而,通常你会希望存在两种容器在一起工作。一个例子是网站服务器,和一个可以从git仓库中拉出更新的帮助任务。 143 | 144 | ``` 145 | apiVersion: v1 146 | kind: Pod 147 | metadata: 148 | name: www 149 | spec: 150 | containers: 151 | - name: nginx 152 | image: nginx 153 | volumeMounts: 154 | - mountPath: /srv/www 155 | name: www-data 156 | readOnly: true 157 | - name: git-monitor 158 | image: kubernetes/git-monitor 159 | env: 160 | - name: GIT_REPO 161 | value: http://github.com/some/repo.git 162 | volumeMounts: 163 | - mountPath: /data 164 | name: www-data 165 | volumes: 166 | - name: www-data 167 | emptyDir: {} 168 | ``` 169 | 170 | 注意我们也在这里增加了一个volume。在这个例子里,这个volume同时被安装在两个容器中。在网页服务器容器中,由于并不需要写这个目录,因此被标注为**只读**。 171 | 172 | 最后,我们也引入了一个给**git-monitor**容器使用的环境变量,这个变量允许我们将我们希望跟踪的特定git仓库作为参数使用 173 | 174 | 后续是什么? 175 | 176 | 继续学习Kubernetes 201http://kubernetes.io/v1.1/docs/user-guide/walkthrough/k8s201.html或者阅读guestbook examplehttp://kubernetes.io/v1.1/examples/guestbook/README.html,这可以得到一个完整的用例。 177 | -------------------------------------------------------------------------------- /097-Apache Storm.md: -------------------------------------------------------------------------------- 1 | # Storm 示例 2 | `译者:White` `校对:无` 3 | 4 | 5 | 接下来的例子中,你将会使用Kubernetes和[Docker](http://docker.io/)来创建一个多功能的[Apache Storm](http://storm.apache.org/)集群。 6 | 7 | 你将会设置一个[Apache ZooKeeper](http://zookeeper.apache.org/)服务,一个Storm master服务(又名Nimbus主机),以及一个Storm工作者集合(又名监管者)。 8 | 9 | 如果你已经熟悉这个部分,请直接跳到[tl;dr](http://kubernetes.io/v1.0/examples/storm/README.html#tldr)章节。 10 | 11 | ### 资源 12 | 13 | 可以自由获取这些资源文件: 14 | 15 | * Docker镜像 - [https://github.com/mattf/docker-storm](https://github.com/mattf/docker-storm) 16 | * Docker受信的构建文件 - [https://registry.hub.docker.com/search?q=mattf/storm](https://registry.hub.docker.com/search?q=mattf/storm) 17 | 18 | 19 | ## **步骤零:前期准备** 20 | 21 | 这个示例假设你已经安装运行了一个Kubernetes集群,环境路径下已经安装了`kubectl`命令行工具。请查看不同平台的安装说明[开始](http://kubernetes.io/v1.0/docs/getting-started-guides/)。 22 | 23 | ## **步骤一:启动ZooKeeper服务** 24 | 25 | ZooKeeper是一个分布式协调者[服务](http://kubernetes.io/v1.0/docs/user-guide/services.html),Storm使用它来作为引导程序和存储运行转态数据。 26 | 27 | 使用这个[examples/storm/zookeeper.json](http://kubernetes.io/v1.0/examples/storm/zookeeper.json)文件来创建一个运行ZooKeeper服务的[pod](http://kubernetes.io/v1.0/docs/user-guide/pods.html)。 28 | 29 | ```bash 30 | $ kubectl create -f examples/storm/zookeeper.json 31 | ``` 32 | 33 | 然后使用[examples/storm/zookeeper-service.json](http://kubernetes.io/v1.0/examples/storm/zookeeper-service.json)文件创建一个逻辑服务终端节点用来给Storm访问ZooKeeper pod。 34 | 35 | ```bash 36 | $ kubectl create -f examples/storm/zookeeper-service.json 37 | ``` 38 | 39 | 在这之前,你需要确保ZooKeeper pod处于运行态并且可以被访问。 40 | 41 | ### **查看ZooKeeper是否运行** 42 | 43 | ```bash 44 | $ kubectl get pods 45 | NAME READY STATUS RESTARTS AGE 46 | zookeeper 1/1 Running 0 43s 47 | ``` 48 | 49 | ### **查看ZooKeeper是否可以访问** 50 | 51 | ```bash 52 | $ kubectl get services 53 | NAME LABELS SELECTOR IP(S) PORT(S) 54 | kubernetes component=apiserver,provider=kubernetes 10.254.0.2 443 55 | zookeeper name=zookeeper name=zookeeper 10.254.139.141 2181 56 | 57 | $ echo ruok | nc 10.254.139.141 2181; echo 58 | imok 59 | ``` 60 | 61 | ## **步骤二:启动Nimbus服务** 62 | 63 | Nimbus服务是Storm集群的主节点(或者首要)服务。Nimbus依赖于多种功能的ZooKeeper服务。 64 | 65 | 使用[examples/storm/storm-nimbus.json](http://kubernetes.io/v1.0/examples/storm/storm-nimbus.json)文件创建一个运行Nimbus服务的pod。 66 | 67 | ```bash 68 | $ kubectl create -f examples/storm/storm-nimbus.json 69 | ``` 70 | 71 | 然后使用[examples/storm/storm-nimbus-service.json](http://kubernetes.io/v1.0/examples/storm/storm-nimbus-service.json)文件创建一个逻辑服务终端节点用来给Storm工作者访问Nimbus pod。 72 | 73 | ```bash 74 | $ kubectl create -f examples/storm/storm-nimbus-service.json 75 | ``` 76 | 77 | 确保Nimbus服务运行正常。 78 | 79 | ### **查看Nimbus节点是否运行以及可以访问** 80 | 81 | ```bash 82 | $ kubectl get services 83 | NAME LABELS SELECTOR IP(S) PORT(S) 84 | kubernetes component=apiserver,provider=kubernetes 10.254.0.2 443 85 | zookeeper name=zookeeper name=zookeeper 10.254.139.141 2181 86 | nimbus name=nimbus name=nimbus 10.254.115.208 6627 87 | 88 | $ sudo docker run -it -w /opt/apache-storm mattf/storm-base sh -c '/configure.sh 10.254.139.141 10.254.115.208; ./bin/storm list' 89 | ... 90 | No topologies running. 91 | ``` 92 | 93 | ## **步骤三:启动Storm工作者** 94 | 95 | 在Storm集群中,Storm工作者(或者监督者)用来完成繁重的工作。Nimbus服务管理这些运行流处理拓扑应用的工人。 96 | 97 | Storm工作者需要保证ZooKeeper和Nimbus服务处于运行态。 98 | 99 | 使用[examples/storm/storm-worker-controller.json](http://kubernetes.io/v1.0/examples/storm/storm-worker-controller.json)文件来创建[副本控制器](http://kubernetes.io/v1.0/docs/user-guide/replication-controller.html)来管理工作者pods。 100 | 101 | ```bash 102 | $ kubectl create -f examples/storm/storm-worker-controller.json 103 | ``` 104 | 105 | ### **查看工作者们是否在运行** 106 | 107 | 一种查看工作者信息的方式是,通过ZooKeeper服务查看有多少客户端在运行。 108 | 109 | ```bash 110 | $ echo stat | nc 10.254.139.141 2181; echo 111 | Zookeeper version: 3.4.6--1, built on 10/23/2014 14:18 GMT 112 | Clients: 113 | /192.168.48.0:44187[0](queued=0,recved=1,sent=0) 114 | /192.168.45.0:39568[1](queued=0,recved=14072,sent=14072) 115 | /192.168.86.1:57591[1](queued=0,recved=34,sent=34) 116 | /192.168.8.0:50375[1](queued=0,recved=34,sent=34) 117 | /192.168.45.0:39576[1](queued=0,recved=34,sent=34) 118 | 119 | Latency min/avg/max: 0/2/2570 120 | Received: 23199 121 | Sent: 23198 122 | Connections: 5 123 | Outstanding: 0 124 | Zxid: 0xa39 125 | Mode: standalone 126 | Node count: 13 127 | ``` 128 | 129 | Nimbus服务和每个工作者都对应着一个客户端。理想情况下,应该可以在副本控制器创建前后从ZooKeeper获取`stat`输出。 130 | 131 | (欢迎提交pull requests使用不同的方式来验证workers) 132 | 133 | ### **tl;dr** 134 | 135 | kubectl create -f zookeeper.json 136 | 137 | kubectl create -f zookeeper-service.json 138 | 139 | 确保ZooKeeper Pod正在运行(使用:`kubectl get pods`)。 140 | 141 | kubectl create -f storm-nimbus.json 142 | 143 | kubectl create -f storm-nimbus-service.json 144 | 145 | 确保Nimbus Pod正在运行。 146 | 147 | kubectl create -f storm-worker-controller.json 148 | -------------------------------------------------------------------------------- /100-Meteor_Applications.md: -------------------------------------------------------------------------------- 1 | #Meteor on Kuberenetes 2 | `译者:贾澜鹏` `校对:无` 3 | 4 | 5 | 这个例子将会向你展示如何在Kubernetes上打包运行一个[Meteor](https://www.meteor.com/) app。 6 | 7 | ##从谷歌的计算引擎开始 8 | Meteor使用MongoDB,并且我们使用GCEPersistentDisk类型的卷作为永久存储介质。所以,这个实例只使用于[谷歌的计算引擎](https://cloud.google.com/compute/)。如果想选用其它的方式,可以去查看一下[卷使用文档](http://kubernetes.io/v1.1/docs/user-guide/volumes.html)。 9 | 10 | 首先,你需要完成如下操作: 11 | 12 | 1. [建立](https://cloud.google.com/compute/docs/quickstart)一个谷歌[云平台](https://cloud.google.com/)的项目。 13 | 14 | 2. 启用Google的[付费API](https://developers.google.com/console/help/new/#billing)?? 15 | 16 | 3. 安装[谷歌云的SDK](https://cloud.google.com/sdk/)。 17 | 18 | 认证谷歌云并且将谷歌云的默认项目名称指向你希望部署Kubernetes集群的项目: 19 | 20 | gcloud auth login 21 | gcloud config set project 22 | 23 | 之后,开启一个Kubernetes集群 24 | 25 | wget -q -O - https://get.k8s.io | bash 26 | 27 | 所有细节和其它方式下启动集群的方法,请参考[谷歌GCE平台的Kubernetes入门指导](http://kubernetes.io/v1.1/docs/getting-started-guides/gce.html)。 28 | 29 | ## 为你的Meteor APP创建一个容器 30 | 31 | 为了使一个Meteor APP能运行再Kubernetes上,你首先需要建立一个Docker容器。在建立之前你需要安装[DOCKER](https://www.docker.com/)。一旦这些都具备了,你需要将`Dockerfile`和`.dockerignore`这2个文件添加到当前的Meteor工程中。 32 | 33 | Dockerfile文件中应该包含下面的语句。其中的`ROOT_URL`你应该替换为当前APP的主机名。 34 | 35 | FROM chees/meteor-kubernetes 36 | ENV ROOT_URL http://myawesomeapp.com 37 | 38 | 对于`.dockerignore`文件,应该包含下面的语句。它是为了告诉Docker,再建立你的容器时忽略以下指定路径的文件。 39 | 40 | .meteor/local 41 | packages/*/.build* 42 | 43 | 你可以在下面的链接中看到一个已经建立起来的Meteor工程:[meteor-gke-example](https://github.com/Q42/meteor-gke-example)。你可以随意的使用这个例子中的APP。 44 | 如果你已经在你的Meteor工程中添加了移动平台,那么下面的步骤将不起作用。所以替换你的平台为 `meteor list-platforms`。 45 | 46 | 现在,你就可以在你的Meteor工程中运行下面的语句来建立一个容器: 47 | 48 | docker build -t my-meteor . 49 | 50 | ## 推送一个注册表 51 | 52 | 对于[Docker Hub](https://hub.docker.com/),你需要利用下面的命令向Hub推送一个携带了你的用户名的APP图片,请注意替换``为你对应的Hub 用户名。命令如下: 53 | 54 | docker tag my-meteor /my-meteor 55 | docker push /my-meteor 56 | 57 | 对于[Google Container Registry](https://cloud.google.com/tools/container-registry/),你需要向GCR推送一个携带你的工程ID的APP图片,同时,请注意替换``为你的对应工程ID。 58 | 59 | docker tag my-meteor gcr.io//my-meteor 60 | gcloud docker push gcr.io//my-meteor 61 | 62 | ## 运行 63 | 64 | 现在,你已经容器化了你的Meteor APP,是时候开始建立你的集群了。编辑`meteor-controller.json` 同时确保`image:`与你刚刚推送到Docker Hub或者GCR的容器是相对应的。 65 | 我们将需要一个MongoDB作为一个永久的Kubernetes卷来存放数据。相关的选项可以参考[volumes documentation](http://kubernetes.io/v1.1/docs/user-guide/volumes.html)。我们将利用谷歌的计算引擎永久磁盘。创建MongoDB磁盘的命令如下: 66 | 67 | gcloud compute disks create --size=200GB mongo-disk 68 | 69 | 你可以开启Mongo去使用那些磁盘,命令如下: 70 | 71 | kubectl create -f examples/meteor/mongo-pod.json 72 | kubectl create -f examples/meteor/mongo-service.json 73 | 74 | 等待Mongo完全启动,之后你就可以开启自己的Meteor APP: 75 | 76 | kubectl create -f examples/meteor/meteor-service.json 77 | kubectl create -f examples/meteor/meteor-controller.json 78 | 79 | 需要注意的是,`meteor-service.json`创建了一个负载均衡器,所以你的APP要求能在Meteor Pods启动时,有效的通过负载均衡器的IP。我们会再建立RC之前建立一个服务,该服务会提供反向关联(或者其它的什么)用以帮助调度程序去排列pod,从而帮助调度程序匹配对应的pods。你可以通过下面的命令获得你的负载均衡器的IP: 80 | 81 | kubectl get service meteor --template="{{range .status.loadBalancer.ingress}} {{.ip}} {{end}}" 82 | 83 | 之后,你需要在你的环境上开启你的80号端口。如果是使用谷歌计算引擎的用户,你需要运行下面的命令: 84 | 85 | gcloud compute firewall-rules create meteor-80 --allow=tcp:80 --target-tags kubernetes-minion 86 | 87 | ## 接下来呢? 88 | 89 | 首先,在`Dockerfile`中的`FROM chees/meteor-kubernetes`语句会指定Meteor APP的基础镜像。这个镜像的构建代码放置在示例代码工程的`dockerbase/`子目录下。你可以通过阅读`Dockerfile`文件中的代码来了解`docker build`的步骤。这个镜像是基于Node.js官方镜像构建的。它会安装Meteor并将用户的程序拷贝进去。其中的最后一行的命令指出了你的app需要通过怎样的命令在容器中运行起来。 90 | 91 | ENTRYPOINT MONGO_URL=mongodb://$MONGO_SERVICE_HOST:$MONGO_SERVICE_PORT /usr/local/bin/node main.js 92 | 93 | 在上面的命令中,我们能看到传递到Meteor App的MongoDB主机和端口信息。`MONGO_SERVICE...`这个环境变量是由Kubernetes设置的,同时,由`mongo-service.json`指定了名为`mongo`的服务器的详细信息。更多细节可以参考[environment documentation](http://kubernetes.io/v1.1/docs/user-guide/container-environment.html)。 94 | 95 | 也许你已经了解,Meteor需要使用TCP长连接,以及持续性的Session(Sticky Sessions)。通过Kubernetes用户能够轻松的在集群Scale out时保持节点的Session相关性。在meteor-service.json文件中所包含的`"sessionAffinity"* : *"ClientIP"`,就向我们提供了这些。更多的信息请参考 [service documentation](http://kubernetes.io/v1.1/docs/user-guide/services.html#virtual-ips-and-service-proxies)。 96 | 97 | 就向之前所提到的,mongo容器使用了一个被Kubernetes映射到永久磁盘的卷。在`mongo-pod.json`中,容器对指定的卷进行了划分: 98 | 99 | { 100 | "volumeMounts": [ 101 | { 102 | "name": "mongo-disk", 103 | "mountPath": "/data/db" 104 | } 105 | 106 | mongo-disk是指超出容器范围的卷: 107 | 108 | { 109 | "volumes": [ 110 | { 111 | "name": "mongo-disk", 112 | "gcePersistentDisk": { 113 | "pdName": "mongo-disk", 114 | "fsType": "ext4" 115 | } 116 | } 117 | ], -------------------------------------------------------------------------------- /109-Getting started with config files.md: -------------------------------------------------------------------------------- 1 | #配置文件使用入门 2 | `译者:钟健鑫` `校对:无` 3 | 4 | 5 | >除了其他地方所描述的命令行式风格的命令以外,Kubernetes还支持以YAML或者JSON格式的配置方式,很多时候,配置文件是优于纯命令方式的,一旦他们能够被签入版本管理,文件的变化也能够像代码文件一样被回顾和管理,就能生产出更健壮,可靠和可存档系统。 6 | 7 | 8 | ##通过pod的配置文件来运行容器 9 | 10 | ``` 11 | $ cd kubernetes 12 | $ kubectl create -f ./pod.yaml 13 | Where pod.yaml contains something like: 14 | 15 | apiVersion: v1 16 | kind: Pod 17 | metadata: 18 | name: nginx 19 | labels: 20 | app: nginx 21 | spec: 22 | containers: 23 | - name: nginx 24 | image: nginx 25 | ports: 26 | - containerPort: 80 27 | ``` 28 | 29 | 通过以下命令来查看集群中pod的信息: 30 | 31 | ``` 32 | $ kubectl get pods 33 | and delete the pod you just created: 34 | 35 | $ kubectl delete pods nginx 36 | ``` 37 | 38 | ##通过配置文件来运行容器的复制集 39 | 40 | 要让被复制的容器运行,你需要一Replication Controller品。一个Replication Controller负责保证规定数量的pod会一直存在于所在集群当中 41 | 42 | ``` 43 | $ cd kubernetes 44 | $ kubectl create -f ./replication.yaml 45 | ``` 46 | 47 | 一般replication.yaml会包含: 48 | ``` 49 | apiVersion: v1 50 | kind: ReplicationController 51 | metadata: 52 | name: nginx 53 | spec: 54 | replicas: 3 55 | selector: 56 | app: nginx 57 | template: 58 | metadata: 59 | name: nginx 60 | labels: 61 | app: nginx 62 | spec: 63 | containers: 64 | - name: nginx 65 | image: nginx 66 | ports: 67 | - containerPort: 80 68 | 69 | ``` 70 | 71 | 删除Replication Controller品(还包括她所创建的pod) 72 | 73 | ``` 74 | $ kubectl delete rc nginx 75 | ``` -------------------------------------------------------------------------------- /110-Environment Guide Example.md: -------------------------------------------------------------------------------- 1 | # 环境向导示例 2 | `译者:丁麒玮` `校对:无` 3 | 4 | 5 | 这个示例展示了pod,replication controller 和 service是如何运行的。示例给出了两种pod:前端pod和后端pod,在这两种pod的前面都有service与之连接。访问前端pod将返回他自己的环境变量信息,以及该pod通过service可以访问的后端pod。这个示例主要目的是说明在k8s集群里运行的容器时,可利用的环境变量元数据。k8s环境变量文档在 [这里](../../../docs/user-guide/container-environment.md)。 6 | 7 | ![Diagram](images/diagram.png) 8 | 9 | 前提条件 10 | ------------- 11 | 这个示例假设你已经安装了可运行的k8s集群,并且安装了kubectl命令行工具且已经添加到了环境变量。安装k8s环境请阅读[getting 12 | started](../../../docs/getting-started-guides/)文档。 13 | 14 | 可选择:构建自己的容器 15 | ----------------------------------- 16 | 容器的代码在这里 17 | [containers/](containers/)。 18 | 19 | 开始运行 20 | ---------------------- 21 | 22 | kubectl create -f ./backend-rc.yaml 23 | kubectl create -f ./backend-srv.yaml 24 | kubectl create -f ./show-rc.yaml 25 | kubectl create -f ./show-srv.yaml 26 | 27 | 查询service 28 | ----------------- 29 | 用 `kubectl describe service show-srv` 来确认你的service 的public ip。 30 | 31 | > 注意:如果你的平台不支持外网负载均衡,你需要在内网开一个合适的端口,并且直接连内网ip,用以上的命令来输出给前端的service。 32 | 33 | 运行 `curl :80` 来查询service。 你应该得到返回信息: 34 | 35 | ``` 36 | Pod Name: show-rc-xxu6i 37 | Pod Namespace: default 38 | USER_VAR: important information 39 | 40 | Kubernetes environment variables 41 | BACKEND_SRV_SERVICE_HOST = 10.147.252.185 42 | BACKEND_SRV_SERVICE_PORT = 5000 43 | KUBERNETES_RO_SERVICE_HOST = 10.147.240.1 44 | KUBERNETES_RO_SERVICE_PORT = 80 45 | KUBERNETES_SERVICE_HOST = 10.147.240.2 46 | KUBERNETES_SERVICE_PORT = 443 47 | KUBE_DNS_SERVICE_HOST = 10.147.240.10 48 | KUBE_DNS_SERVICE_PORT = 53 49 | 50 | Found backend ip: 10.147.252.185 port: 5000 51 | Response from backend 52 | Backend Container 53 | Backend Pod Name: backend-rc-6qiya 54 | Backend Namespace: default 55 | ``` 56 | 57 | 首先,打印前端pod的信息,其name和 58 | [namespace](../../../docs/design/namespaces.md)是从 59 | [Downward API](../../../docs/user-guide/downward-api.md)检索出来的. 其次, `USER_VAR` 是我们定义在pod里的环境变量名字,然后,扫描动态的k8s环境变量并且打印,这些都是用来找出名字是`backend-srv`的后端的service。最后前端的pod向后端service请求并打印返回的信息。然后后端的pod返回他的pod的name和namespace。 60 | 61 | 尝试多次运行 `curl` 命令, 并且注意变化。例如: `watch -n 1 curl -s ` 首先,前端的Service每次将你的请求分配到不同的前端pod,前端的pod通过后端的service与后端的pod连接,因此,每个的后端pod都可以处理各个请求。 62 | 63 | 清除工作 64 | ------- 65 | kubectl delete rc,service -l type=show-type 66 | kubectl delete rc,service -l type=backend-type 67 | 68 | ![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/environment-guide/README.md?pixel) 69 | 70 | -------------------------------------------------------------------------------- /111-Downward API example.md: -------------------------------------------------------------------------------- 1 | #Downward API 范例 2 | `译者:钟健鑫` `校对:无` 3 | 4 | 5 | 接下来的例子,你会创建一个pod, 它包含了一个通过访问[downward API](http://kubernetes.io/v1.0/docs/user-guide/downward-api.html)来使用这个pod名字和命名空的容器 6 | 7 | #步骤 0: 前提条件 8 | 9 | 这个例子会假设你有一个安装好并正在运行的Kubernetes集群,也已经在系统的某个路径下安装好了kubectl命令行工具。具体安装步骤请在[安装入门](http://kubernetes.io/v1.0/docs/getting-started-guides/)中找到与你平台对应的安装说明。 10 | 11 | #步骤 1: 创建一个pod 12 | 13 | 容器可以通过环境变量来消费downward API,而且downward API允许容器通过被注入的方来式使用所在pod的name和namespace等信息 14 | 15 | 下面我们使用examples/downward-api/dapi-pod.yaml来创建一个pod,并让它其中的容器通过downward API获取了所属pod的信息: 16 | 17 | ``` 18 | $ kubectl create -f docs/user-guide/downward-api/dapi-pod.yaml 19 | ``` 20 | 21 | #检查日志 22 | 这个pod在一个容器中运行env命令,来调用downward API。 接下来你就能通过过滤pod的日志来看到这个pod被注入的确切的值: 23 | 24 | ``` 25 | $ kubectl logs dapi-test-pod | grep POD_ 26 | 2015-04-30T20:22:18.568024817Z POD_NAME=dapi-test-pod 27 | 2015-04-30T20:22:18.568087688Z POD_NAMESPACE=default 28 | ``` 29 | -------------------------------------------------------------------------------- /114-Running your first containers in Kubernetes.md: -------------------------------------------------------------------------------- 1 | #在Kubernetes上运行你的第一个容器 2 | `译者:钟健鑫` `校对:无` 3 | 4 | 5 | 好了,如果你已经开始了任何一个入门指南,并且启动了一个Kubernetes集群。那么接下来呢? 这个片指南会帮助你正对KUbernetes,在其集群上运行第一个容器。 6 | 7 | ##运行一个容器 (简单版) 8 | 9 | >从这时开始,我假设你已经根据其它入门指南安装了kubectl。 10 | 11 | >下面这行kubectl命令会穿件两个监听80端口的nginx pod. 还会创建一名为my-nginx个replication controller,用来保证始终会有两个pod在运行。 12 | 13 | ``` 14 | kubectl run my-nginx --image=nginx --replicas=2 --port=80 15 | ``` 16 | 17 | >一旦这些pod被创建好了, 你可以列出他们并查看他们的启动和运行。 18 | 19 | ``` 20 | kubectl get pods 21 | ``` 22 | 23 | >你也能够看见replication controller被创建了: 24 | 25 | ``` 26 | kubectl get rc 27 | ``` 28 | To stop the two replicated containers, stop the replication controller: 29 | 如果要停止这两个被复制的容器,你可以通过停止replication: controller 30 | 31 | ``` 32 | kubectl stop rc my-nginx 33 | ``` 34 | 35 | ##让你的的pod可以被外网方位. 36 | 37 | 在一些平台上(例如Google Compute Engine),kubectl命令能够集成云端提供的API来给pod条件公有IP地址,可以通过以下命令来实现: 38 | 39 | ``` 40 | kubectl expose rc my-nginx --port=80 --type=LoadBalancer 41 | ``` 42 | 43 | >这个命令会打印出被创建了的service,以及一个外部IP地址映射到service. 对外的IP地址根你实际运行环境有关。例如,对于Google Compute Engine的外部IP地址会被列为新创建的服务的一部分,还可以通在运行时检索。 44 | 45 | ``` 46 | kubectl get services 47 | ``` 48 | 49 | >为了访问你的nginx初始页面,你还不得不保证通过外部IP的通信是被允许的。那么就要通过让防火墙允许80端口通信才可以做到 50 | 51 | ##接下来: 配置文件 52 | 53 | Most people will eventually want to use declarative configuration files for creating/modifying their applications. A simplified introduction is given in a different document. 54 | 55 | 大多数人最终都会响使用声明式的配置文件来创建或修改他们的应用程勋。另外一个文档给出了一个[简单介绍](http://kubernetes.io/v1.0/docs/user-guide/simple-yaml.html)。 56 | -------------------------------------------------------------------------------- /127-Exploring Pods.md: -------------------------------------------------------------------------------- 1 | # 滚动升级示例 2 | `译者:赵帅龙` `校对:无` 3 | 4 | 5 | 本例展示了如何使用Kubernetes对一组正在运行的[pods](../../../docs/user-guide/pods.md)做[滚动升级 rolling update](../kubectl/kubectl_rolling-update.md)。如果你还不知道为什么需要滚动升级,或者什么时候做滚动升级,请查看[这里](../managing-deployments.md#updating-your-application-without-a-service-outage)。更多信息查看[滚动升级设计文档](../../design/simple-rolling-update.md)。 6 | 7 | ### 第一步: 前提条件 8 | 9 | 本例子假设你已经fork了一份Kubernetes代码,并且创建了一个[Kubernetes集群](../../../docs/getting-started-guides/): 10 | 11 | ```控制台 12 | $ cd kubernetes 13 | $ ./cluster/kube-up.sh 14 | ``` 15 | 16 | ### Step One: Turn up the UX for the demo 17 | 18 | You can use bash job control to run this in the background (note that you must use the default port -- 8001 -- for the following demonstration to work properly). 19 | This can sometimes spew to the output so you could also run it in a different terminal. You have to run `kubectl proxy` in the root of the 20 | Kubernetes repository. Otherwise you will get "404 page not found" errors as the paths will not match. You can find more information about `kubectl proxy` 21 | [here](../../../docs/user-guide/kubectl/kubectl_proxy.md). 22 | 23 | ```console 24 | $ kubectl proxy --www=docs/user-guide/update-demo/local/ & 25 | I0218 15:18:31.623279 67480 proxy.go:36] Starting to serve on localhost:8001 26 | ``` 27 | 28 | Now visit the the [demo website](http://localhost:8001/static). You won't see anything much quite yet. 29 | 30 | ### Step Two: Run the replication controller 31 | 32 | Now we will turn up two replicas of an [image](../images.md). They all serve on internal port 80. 33 | 34 | ```console 35 | $ kubectl create -f docs/user-guide/update-demo/nautilus-rc.yaml 36 | ``` 37 | 38 | After pulling the image from the Docker Hub to your worker nodes (which may take a minute or so) you'll see a couple of squares in the UI detailing the pods that are running along with the image that they are serving up. A cute little nautilus. 39 | 40 | ### Step Three: Try scaling the replication controller 41 | 42 | Now we will increase the number of replicas from two to four: 43 | 44 | ```console 45 | $ kubectl scale rc update-demo-nautilus --replicas=4 46 | ``` 47 | 48 | If you go back to the [demo website](http://localhost:8001/static/index.html) you should eventually see four boxes, one for each pod. 49 | 50 | ### Step Four: Update the docker image 51 | 52 | We will now update the docker image to serve a different image by doing a rolling update to a new Docker image. 53 | 54 | ```console 55 | $ kubectl rolling-update update-demo-nautilus --update-period=10s -f docs/user-guide/update-demo/kitten-rc.yaml 56 | ``` 57 | 58 | The rolling-update command in kubectl will do 2 things: 59 | 60 | 1. Create a new [replication controller](../../../docs/user-guide/replication-controller.md) with a pod template that uses the new image (`gcr.io/google_containers/update-demo:kitten`) 61 | 2. Scale the old and new replication controllers until the new controller replaces the old. This will kill the current pods one at a time, spinning up new ones to replace them. 62 | 63 | Watch the [demo website](http://localhost:8001/static/index.html), it will update one pod every 10 seconds until all of the pods have the new image. 64 | Note that the new replication controller definition does not include the replica count, so the current replica count of the old replication controller is preserved. 65 | But if the replica count had been specified, the final replica count of the new replication controller will be equal this number. 66 | 67 | ### Step Five: Bring down the pods 68 | 69 | ```console 70 | $ kubectl delete rc update-demo-kitten 71 | ``` 72 | 73 | This first stops the replication controller by turning the target number of replicas to 0 and then deletes the controller. 74 | 75 | ### Step Six: Cleanup 76 | 77 | To turn down a Kubernetes cluster: 78 | 79 | ```console 80 | $ ./cluster/kube-down.sh 81 | ``` 82 | 83 | Kill the proxy running in the background: 84 | After you are done running this demo make sure to kill it: 85 | 86 | ```console 87 | $ jobs 88 | [1]+ Running ./kubectl proxy --www=local/ & 89 | $ kill %1 90 | [1]+ Terminated: 15 ./kubectl proxy --www=local/ 91 | ``` 92 | 93 | ### Updating the Docker images 94 | 95 | If you want to build your own docker images, you can set `$DOCKER_HUB_USER` to your Docker user id and run the included shell script. It can take a few minutes to download/upload stuff. 96 | 97 | ```console 98 | $ export DOCKER_HUB_USER=my-docker-id 99 | $ ./docs/user-guide/update-demo/build-images.sh 100 | ``` 101 | 102 | To use your custom docker image in the above examples, you will need to change the image name in `docs/user-guide/update-demo/nautilus-rc.yaml` and `docs/user-guide/update-demo/kitten-rc.yaml`. 103 | 104 | ### Image Copyright 105 | 106 | Note that the images included here are public domain. 107 | 108 | * [kitten](http://commons.wikimedia.org/wiki/File:Kitten-stare.jpg) 109 | * [nautilus](http://commons.wikimedia.org/wiki/File:Nautilus_pompilius.jpg) 110 | 111 | 112 | 113 | [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/update-demo/README.md?pixel)]() 114 | 115 | -------------------------------------------------------------------------------- /128-Updating Live Pods.md: -------------------------------------------------------------------------------- 1 | ### explorer 2 | `译者:赵帅龙` `校对:无` 3 | 4 | 5 | Explorer is a little container for examining the runtime environment kubernetes produces for your pods. 6 | 7 | The intended use is to substitute gcr.io/google_containers/explorer for your intended container, and then visit it via the proxy. 8 | 9 | Currently, you can look at: 10 | * The environment variables to make sure kubernetes is doing what you expect. 11 | * The filesystem to make sure the mounted volumes and files are also what you expect. 12 | * Perform DNS lookups, to see how DNS works. 13 | 14 | `pod.yaml` is supplied as an example. You can control the port it serves on with the -port flag. 15 | 16 | Example from command line (the DNS lookup looks better from a web browser): 17 | 18 | ```console 19 | $ kubectl create -f examples/explorer/pod.yaml 20 | $ kubectl proxy & 21 | Starting to serve on localhost:8001 22 | 23 | $ curl localhost:8001/api/v1/proxy/namespaces/default/pods/explorer:8080/vars/ 24 | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 25 | HOSTNAME=explorer 26 | KIBANA_LOGGING_PORT_5601_TCP_PORT=5601 27 | KUBERNETES_SERVICE_HOST=10.0.0.2 28 | MONITORING_GRAFANA_PORT_80_TCP_PROTO=tcp 29 | MONITORING_INFLUXDB_UI_PORT_80_TCP_PROTO=tcp 30 | KIBANA_LOGGING_SERVICE_PORT=5601 31 | MONITORING_HEAPSTER_PORT_80_TCP_PORT=80 32 | MONITORING_INFLUXDB_UI_PORT_80_TCP_PORT=80 33 | KIBANA_LOGGING_SERVICE_HOST=10.0.204.206 34 | KIBANA_LOGGING_PORT_5601_TCP=tcp://10.0.204.206:5601 35 | KUBERNETES_PORT=tcp://10.0.0.2:443 36 | MONITORING_INFLUXDB_PORT=tcp://10.0.2.30:80 37 | MONITORING_INFLUXDB_PORT_80_TCP_PROTO=tcp 38 | MONITORING_INFLUXDB_UI_PORT=tcp://10.0.36.78:80 39 | KUBE_DNS_PORT_53_UDP=udp://10.0.0.10:53 40 | MONITORING_INFLUXDB_SERVICE_HOST=10.0.2.30 41 | ELASTICSEARCH_LOGGING_PORT=tcp://10.0.48.200:9200 42 | ELASTICSEARCH_LOGGING_PORT_9200_TCP_PORT=9200 43 | KUBERNETES_PORT_443_TCP=tcp://10.0.0.2:443 44 | ELASTICSEARCH_LOGGING_PORT_9200_TCP_PROTO=tcp 45 | KIBANA_LOGGING_PORT_5601_TCP_ADDR=10.0.204.206 46 | KUBE_DNS_PORT_53_UDP_ADDR=10.0.0.10 47 | MONITORING_HEAPSTER_PORT_80_TCP_PROTO=tcp 48 | MONITORING_INFLUXDB_PORT_80_TCP_ADDR=10.0.2.30 49 | KIBANA_LOGGING_PORT=tcp://10.0.204.206:5601 50 | MONITORING_GRAFANA_SERVICE_PORT=80 51 | MONITORING_HEAPSTER_SERVICE_PORT=80 52 | MONITORING_HEAPSTER_PORT_80_TCP=tcp://10.0.150.238:80 53 | ELASTICSEARCH_LOGGING_PORT_9200_TCP=tcp://10.0.48.200:9200 54 | ELASTICSEARCH_LOGGING_PORT_9200_TCP_ADDR=10.0.48.200 55 | MONITORING_GRAFANA_PORT_80_TCP_PORT=80 56 | MONITORING_HEAPSTER_PORT=tcp://10.0.150.238:80 57 | MONITORING_INFLUXDB_PORT_80_TCP=tcp://10.0.2.30:80 58 | KUBE_DNS_SERVICE_PORT=53 59 | KUBE_DNS_PORT_53_UDP_PORT=53 60 | MONITORING_GRAFANA_PORT_80_TCP_ADDR=10.0.100.174 61 | MONITORING_INFLUXDB_UI_SERVICE_HOST=10.0.36.78 62 | KIBANA_LOGGING_PORT_5601_TCP_PROTO=tcp 63 | MONITORING_GRAFANA_PORT=tcp://10.0.100.174:80 64 | MONITORING_INFLUXDB_UI_PORT_80_TCP_ADDR=10.0.36.78 65 | KUBE_DNS_SERVICE_HOST=10.0.0.10 66 | KUBERNETES_PORT_443_TCP_PORT=443 67 | MONITORING_HEAPSTER_PORT_80_TCP_ADDR=10.0.150.238 68 | MONITORING_INFLUXDB_UI_SERVICE_PORT=80 69 | KUBE_DNS_PORT=udp://10.0.0.10:53 70 | ELASTICSEARCH_LOGGING_SERVICE_HOST=10.0.48.200 71 | KUBERNETES_SERVICE_PORT=443 72 | MONITORING_HEAPSTER_SERVICE_HOST=10.0.150.238 73 | MONITORING_INFLUXDB_SERVICE_PORT=80 74 | MONITORING_INFLUXDB_PORT_80_TCP_PORT=80 75 | KUBE_DNS_PORT_53_UDP_PROTO=udp 76 | MONITORING_GRAFANA_PORT_80_TCP=tcp://10.0.100.174:80 77 | ELASTICSEARCH_LOGGING_SERVICE_PORT=9200 78 | MONITORING_GRAFANA_SERVICE_HOST=10.0.100.174 79 | MONITORING_INFLUXDB_UI_PORT_80_TCP=tcp://10.0.36.78:80 80 | KUBERNETES_PORT_443_TCP_PROTO=tcp 81 | KUBERNETES_PORT_443_TCP_ADDR=10.0.0.2 82 | HOME=/ 83 | 84 | $ curl localhost:8001/api/v1/proxy/namespaces/default/pods/explorer:8080/fs/ 85 | mount/ 86 | var/ 87 | .dockerenv 88 | etc/ 89 | dev/ 90 | proc/ 91 | .dockerinit 92 | sys/ 93 | README.md 94 | explorer 95 | 96 | $ curl localhost:8001/api/v1/proxy/namespaces/default/pods/explorer:8080/dns?q=elasticsearch-logging 97 | 98 |
99 | 100 | 101 |
102 |

LookupNS(elasticsearch-logging):
103 | Result: ([]*net.NS)
104 | Error: <*>lookup elasticsearch-logging: no such host
105 | 
106 | LookupTXT(elasticsearch-logging):
107 | Result: ([]string)
108 | Error: <*>lookup elasticsearch-logging: no such host
109 | 
110 | LookupSRV("", "", elasticsearch-logging):
111 | cname: elasticsearch-logging.default.svc.cluster.local.
112 | Result: ([]*net.SRV)[<*>{Target:(string)elasticsearch-logging.default.svc.cluster.local. Port:(uint16)9200 Priority:(uint16)10 Weight:(uint16)100}]
113 | Error: 
114 | 
115 | LookupHost(elasticsearch-logging):
116 | Result: ([]string)[10.0.60.245]
117 | Error: 
118 | 
119 | LookupIP(elasticsearch-logging):
120 | Result: ([]net.IP)[10.0.60.245]
121 | Error: 
122 | 
123 | LookupMX(elasticsearch-logging):
124 | Result: ([]*net.MX)
125 | Error: <*>lookup elasticsearch-logging: no such host
126 | 
127 | 
128 | 129 | 130 | ``` 131 | 132 | 133 | 134 | [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/examples/explorer/README.md?pixel)]() 135 | 136 | -------------------------------------------------------------------------------- /129-api_basicsmd.md: -------------------------------------------------------------------------------- 1 | 2 | `译者:安雪艳` `校对:无` 3 | 4 | # **Kubernetes API** 5 | 6 | [用户指南](https://github.com/kubernetes/kubernetes/blob/master/docs/user-guide/README.md)记录了主系统和API概念。 7 | 8 | [API规范文档](https://github.com/kubernetes/kubernetes/blob/master/docs/devel/api-conventions.md)描述了API整体规范。 9 | 10 | Kubernetes通过[Swagger](http://swagger.io/)记录API所有细节。Kubernetes apiserver (aka "master")提供了一个API接口用于获取Kubernetes API的[Swagger spec](https://github.com/swagger-api/swagger-spec/tree/master/schemas/v1.2),默认在路径```/swaggerapi```下,```/swagger-ui```是可以使用浏览器查看API文档的UI 11 | 。我们会定期更新[静态生成UI](http://kubernetes.io/third_party/swagger-ui/)。 12 | 13 | 远程访问API在[访问文档](/kubernetes/kubernetes/blob/master/docs/admin/accessing-the-api.md)有讨论。 14 | 15 | Kubernetes API是系统描述性配置的基础。 [Kubectl](/kubernetes/kubernetes/blob/master/docs/user-guide/kubectl/kubectl.md)命令行工具被用于创建,更新,删除,获取API对象。 16 | 17 | Kubernete通过API资源存储自己序列化状态(现在存储在[etcd](https://coreos.com/docs/distributed-configuration/getting-started-with-etcd/))。 18 | 19 | Kubernetes被分成多个组件,各部分通过API相互交互。 20 | 21 | ##API更改 22 | 23 | 根据经验,任何成功的系统都需要成长和改变,可能是一个新的示例出现,也可能是对已有系统进行更改。因此,我们希望Kubernetes API也可以持续的改变和成长。在较长一段时间内,我们不打算中断已有客户端。一般情况,经常会有新的API资源和新的资源字段增加。删除资源或者字段会有一个跟踪废弃流程。删除功能有一个小的废弃策略叫做TBD,但是Kubernetes到达1.0版本时,将会有一个详细的策略代替。 24 | 25 | 如何构成一个兼容性的改变以及如何更改API的详细信息都在[API变化文档](/kubernetes/kubernetes/blob/master/docs/devel/api_changes.md) 26 | 27 | ##API版本 28 | 29 | 为了使删除字段或者重构资源表示更加容易,Kubernetes支持多个API版本。每一个版本都在不同API路径下,例如 ```/api/v1``` 或者```/apis/extensions/v1beta1```. 30 | 31 | 我们选择版本时时根据API而不是根据资源或者字段来确认的,API为系统资源和行为提供了一个清晰的,一致性的视图,并且可以控制访问生命周期结束和/或测试的APIs。 32 | 33 | 34 | 注意API版本控制和软件版本控制只能间接的相关联。文档[API and release versioning proposal](/kubernetes/kubernetes/blob/master/docs/design/versioning.md) 描述了API版本控制和软件版本控制两者之间的关系。 35 | 36 | 不同的API版本会有不同级别的稳定性和支持。每个级别的详细描述包含在文档[API Changes documentation](/kubernetes/kubernetes/blob/master/docs/devel/api_changes.md#alpha-beta-and-stable-versions)中。 内容主要概括如下: 37 | 38 | * Alpha 级别: 39 | * 版本名称包含了 ```alpha``` (e.g. ```v1alpha1``). 40 | * 可能是有问题的。实现的功能可能隐含问题,功能默认是不可用的。 41 | * 支持的功能可能在没有通知的情况下随时删除。 42 | * API的更改可能存在冲突,但是在后续的软件发布中不会有任何通知。 43 | * 由于bugs风险的增加和缺乏长期的支持,推荐在短暂的集群测试中使用。 44 | * Beta 级别: 45 | * 版本名称包含了 ```beta``` (e.g. ```v2beta3```). 46 | * 代码已经测试过。实现的功能认为是安全的,功能默认是可用的。 47 | * 所有已支持的功能不会被删除,细节可能会发生变化。 48 | * 对象的模式和/或定义在随后的beta版本或者稳定版本可能以不兼容的方式改变。在这种情况下,Kubernetes会提供合并到下一个版本的指南。这一过程中可能会要求删除,编译和重新创建API对象。编译过程中可能会要求一些选择。根据不同的功能可能会需要一些应用的下载时间。 49 | * 在随后的发布中存在一些非兼容性的更改,所已推荐在不重要的非商业化的情况下使用。如果你已经有多个集群,并且可以单独更新,你可以放宽这个限制。 50 | * **请尝试我们的bete版本功能并且给出反馈!因为已经是beta版本,对于我们来说太多的更改可能不太实用 ** 51 | * Stable 级别: 52 | * 版本名称中包含 vX 这里的X是一个整数. 53 | * 稳定版本的功能在后续的版本发布中会一直存在。 54 | 55 | ##API群组 56 | 57 | 为了使扩展Kubernetes API更加简单,我们正在实现[API groups](/kubernetes/kubernetes/blob/master/docs/proposals/api-group.md). API群组是一些可以读和/或更改相同基础资源的简单的不同的接口。API群组被定义在一个REST路径下,在```apiVersion```的一个序列化对象的字段。 58 | 59 | 当前有两个API群组在使用: 60 | 61 | 1. "core"群组,在REST路径```/api/v1```下,但不是apiVersion字段的一部分。e.g. ```apiVersion: v1 ```。 62 | 2. "extensions"群组, 在REST路径```/apis/extensions/$VERSION```下, 并且使用```apiVersion: extensions/$VERSION ```(e.g. 当前是```apiVersion: extensions/v1beta1```). 63 | 64 | 未来我们希望有更多的API群组,并且所有的群组都在REST路径 65 | ```/apis/$API_GROUP```下,并且使用```apiVersion: $API_GROUP/$VERSION```。我们希望将来有一种方式支持三方可以创建自己的[API groups](design/extending-api.md),并且可以避免命名冲突。 66 | 67 | ## 扩展资源 68 | 69 | 默认情况下Jobs, Ingress和HorizontalPodAutoscalers都是可用的。其他的扩展资源通过设置apiserver的runtime-config使其可用。runtime-config多个值可通过都逗号分开。例如:设置部署可用,jobs不可用命令,```--runtime-config=extensions/v1beta1/deployments=true,extensions/v1beta1/jobs=false``` 70 | 71 | ##v1beta1, v1beta2, and v1beta3已经废弃;请转到v1 ASAP 72 | 73 | 2015年6月4日,Kubernetes v1 API已经默认可以使用。v1beta1和v1beta2 APIs在2015年6月1日删除。v1beta3计划会在2015年6月6日删除。 74 | 75 | ###v1转换技巧(从v1beta3) 76 | 77 | 我们已经将所有文档和例子转换成v1版本。并且写了一个简单的 [API转换工具](/kubernetes/kubernetes/blob/master/docs/admin/cluster-management.md#switching-your-config-files-to-a-new-api-version)来进行简单的转换。使用```kubectl create --validate```命令可以使你的json或者yaml按照Swagger spec规范有效。 78 | 79 | v1beta3和v1版本之间最重要的不同是服务的改变。 80 | 81 | * ```service.spec.portalIP```属性重命名为```service.spec.clusterIP```。 82 | * ```service.spec.createExternalLoadBalancer```已经被删除。 定义了```service.spec.type: "LoadBalancer"```来代替,用于创建外部负载均衡。 83 | * ```service.spec.publicIPs```属性已经被废弃,现在叫做```service.spec.deprecatedPublicIPs```。当v1beta3删除时,这个属性也会被完全删除。这个字段的多数用户使用这个字段来公开nodes上的services端口。现在这些用户应该使用```service.spec.type: "NodePort"```来代替。 获取更多信息可阅读[External Services](/kubernetes/kubernetes/blob/master/docs/user-guide/services.md#external-services)。如果这些还是不能满足你的需求,请提交issue或者联系@thockin。 84 | 85 | v1beta3和v1版本之间其他的不同: 86 | 87 | * ```pod.spec.containers[*].privileged```和```pod.spec.containers[*].capabilities```属性已经合并到```pod.spec.containers[*].securityContext```属性。可以查看文档[Security Contexts](/kubernetes/kubernetes/blob/master/docs/user-guide/security-context.md)。 88 | * ```pod.spec.host```属性被重命名为```pod.spec.nodeName```。 89 | * ```endpoints.subsets[*].addresses.IP```被重命名为```endpoints.subsets[*].addresses.ip```。 90 | * ```pod.status.containerStatuses[*].state.termination```和```pod.status.containerStatuses[*].lastState.termination```属性被分别重命名为```pod.status.containerStatuses[*].state.terminated```和```pod.status.containerStatuses[*].lastState.terminated```。 91 | * ```pod.status.Condition```属性被重命名为```pod.status.conditions```。 92 | * ```status.details.id```属性被重命名为```status.details.name```。 93 | 94 | v1beta3转换技巧(从v1beta1/2) 95 | 96 | v1beta1/2和v1beta3重要不同点: 97 | 98 | * 资源```id```现在称作``name```. 99 | * ```name```,```labels```,```annotations```,和其他元数据现在内嵌在一个称作```metadata```的map中 100 | * ```desiredState``` 现在称作```spec```,```currentState``` 现在称作```status`` 101 | * ```/minions``` 已经被移到```/nodes```, 且资源包括各种 ```Node``` 102 | * namesapce是必要条件(对于所有资源namesapce)且已经从一个URL参数改为路径:```/api/v1beta3/namespaces/{namespace}/{resource_collection}/{resource_name}```. 如果之前你没有使用过namespace,在这可以使用```default```. 103 | * 所有资源收集器的名字已经小写 - 已经废弃 ```replicationControllers```,使用 ```replicationcontrollers``来代替。 104 | * 查看某个资源的改变,可打开一个HTTP或者Websocket连接查询,并且提供```?watch=true ```请求参数和```resourceVersion```参数进行查询。 105 | * ```labels```查询参数已经被重命名为```labelSelector```。 106 | * ```fields```查询参数已经被重命名为```fieldSelector```。 107 | * Container中的```entrypoint```已经被重命名为```command```,而```command```被重命名为```args```. 108 | * Container, volume, and node资源的定义已经被内嵌到一个maps (e.g., ```resources{cpu:1}```)并没有作为独立的字段,并且资源数值支持[后缀](user-guide/compute-resources.html#specifying-resource-quantities)而不是固定的(e.g., milli-cores)。 109 | * 重新启动策略简单的表示为字串(e.g., ```"Always"```)而不是作为一个内嵌的map(```always{}```). 110 | * Pull策略从```PullAlways```, ```PullNever```,和```PullIfNotPresent```变成了```Always```,```Never```,和```IfNotPresent```。 111 | * volume ```source```被内联到```volume```而非嵌套。 112 | * 宿主机volumes已经从```hostDir```变成了```hostPath```,这样做的好处是,挂载的可以是一个文件也可以是一个路径。 -------------------------------------------------------------------------------- /132-working_with_resourcesmd.md: -------------------------------------------------------------------------------- 1 | 2 | `译者:安雪艳` `校对:无` 3 | 4 | # **资源管理** 5 | 6 | 本篇文章的目的是为了那些已经使用过一些示例并且想学习更多关于kubectl管理资源pod或者services的用户。想直接通过REST API访问的用户和想扩展Kubernetes API的开发者都应该参考文档 [api conventions](../devel/api-conventions.html)和[api document](../api.html). 7 | 8 | # **资源自动更新** 9 | 10 | 当创建一个资源例如pod,随后会收到被创建和资源已添加的的多个字段。可以参考下面的工作示例: 11 | ``` 12 | $ cat > /tmp/original.yaml < /tmp/current.yaml 26 | pods/original 27 | $ wc -l /tmp/original.yaml /tmp/current.yaml 28 | 51 /tmp/current.yaml 29 | 9 /tmp/original.yaml 30 | 60 total 31 | ``` 32 | 我们提交的资源只有9行,但是我们收到了51行。如果你执行```diff -u /tmp/original.yaml /tmp/current.yaml```,你可以看到pod增加的字段。系统通过如下几种方式增加字段: 33 | * 一些字段时在资源创建时同步设置的,一些异步设置的。 34 | * 例如:```metadata.uid```同步设置. (获取更多信息请看 [metadata](../devel/api-conventions.html#metadata)). 35 | * 例如,```status.hostIP```是在pod被调度后设置。这些谁都发生的比较快。但是你可以注意到还没有设置的pods。这叫做初始化。 (获取更多信息请看[status](../devel/api-conventions.html#spec-and-status)和[late initialization](../devel/api-conventions.html#late-initialization) )。 36 | * 一些字段被设置了默认值。一些默认值是根据cluster设置,一些默认值是API特定版本固定的。(获取更多信息请看 [defaulting](../devel/api-conventions.html#late-initialization)). 37 | * 例如, ```spec.containers[0].imagePullPolicy``` 在api v1版本的默认值一直时```IfNotPresent```。 38 | * 例如,```spec.containers[0].resources.limits.cpu``` 在一些cluster可能默认设置为```100m```,其他clueter中是其他的值,并且不是在所有的clueter中都默认设置。API一般不会改变你已经设置的字段;它只会设置那些你没有定义的字段。 39 | 40 | # **资源文档** 41 | 42 | 你可以在[project website](http://kubernetes.io/v1.1/api-ref.html)或者[github](https://releases.k8s.io/release-1.1/docs/api-reference)上浏览自动生成的API问文档. 43 | 44 | -------------------------------------------------------------------------------- /133-kubernetes_api_referencemd.md: -------------------------------------------------------------------------------- 1 | 2 | `译者:安雪艳` `校对:无` 3 | 4 | 5 | # **Kubernetes API参考** 6 | 7 | 使用这些参考文档可学习如何通过REST API与Kubernetes交互。 8 | 9 | 你可以通过文档[API versioning](docs/api.html)看到关于扩展API的详细信息. 10 | 11 | 内容列表: 12 | 13 | * [Operations](http://kubernetes.io/v1.1/docs/api-reference/v1/operations.html) 14 | * [Definitions](http://kubernetes.io/v1.1/docs/api-reference/v1/definitions.html) 15 | * Extensions API: 16 | * [Extensions: Operations](http://kubernetes.io/v1.1/docs/api-reference/extensions/v1beta1/operations.html) 17 | * [Extensions: Definitions](http://kubernetes.io/v1.1/docs/api-reference/extensions/v1beta1/definitions.html) -------------------------------------------------------------------------------- /134-operations.md: -------------------------------------------------------------------------------- 1 | # 运维API 2 | `译者:丁麒玮` `校对:无` 3 | 4 | 5 | {% include "include/API-Operations.html" %} 6 | -------------------------------------------------------------------------------- /135-Definitions.md: -------------------------------------------------------------------------------- 1 | # 参数说明 2 | `译者:赵帅龙` `校对:无` 3 | 4 | 5 | {% include "include/API-Definitions.html" %} 6 | 7 | -------------------------------------------------------------------------------- /136-Command Reference.md: -------------------------------------------------------------------------------- 1 | ## kubectl 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 使用kubectl来管理Kubernetes集群。 6 | 7 | ### 摘要 8 | 9 | 使用kubectl来管理Kubernetes集群。 10 | 11 | 可以在https://github.com/kubernetes/kubernetes找到更多的信息。 12 | 13 | ``` 14 | kubectl 15 | ``` 16 | 17 | ### 选项 18 | 19 | ``` 20 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 21 | --api-version="": 和服务端交互使用的API版本。 22 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 23 | --client-certificate="": TLS使用的客户端证书路径。 24 | --client-key="": TLS使用的客户端密钥路径。 25 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 26 | --context="": 指定使用的kubeconfig配置文件中的环境名。 27 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 28 | --kubeconfig="": 命令行请求使用的配置文件路径。 29 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 30 | --log-dir="": 如果不为空,将日志文件写入此目录。 31 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 32 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 33 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 34 | --namespace="": 如果不为空,命令将使用此namespace。 35 | --password="": API Server进行简单认证使用的密码。 36 | -s, --server="": Kubernetes API Server的地址和端口号。 37 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 38 | --token="": 认证到API Server使用的令牌。 39 | --user="": 指定使用的kubeconfig配置文件中的用户名。 40 | --username="": API Server进行简单认证使用的用户名。 41 | --v=0: 指定输出日志的级别。 42 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 43 | ``` 44 | 45 | ### 参见 46 | 47 | * [kubectl annotate](kubectl_annotate.md) - 更新资源的注解。 48 | * [kubectl api-versions](kubectl_api-versions.md) - 以“组/版本”的格式输出服务端支持的API版本。 49 | * [kubectl apply](kubectl_apply.md) - 通过文件名或控制台输入,对资源进行配置。 50 | * [kubectl attach](kubectl_attach.md) - 连接到一个正在运行的容器。 51 | * [kubectl autoscale](kubectl_autoscale.md) - 对replication controller进行自动伸缩。 52 | * [kubectl cluster-info](kubectl_cluster-info.md) - 输出集群信息。 53 | * [kubectl config](kubectl_config.md) - 修改kubeconfig配置文件。 54 | * [kubectl create](kubectl_create.md) - 通过文件名或控制台输入,创建资源。 55 | * [kubectl delete](kubectl_delete.md) - 通过文件名、控制台输入、资源名或者label selector删除资源。 56 | * [kubectl describe](kubectl_describe.md) - 输出指定的一个/多个资源的详细信息。 57 | * [kubectl edit](kubectl_edit.md) - 编辑服务端的资源。 58 | * [kubectl exec](kubectl_exec.md) - 在容器内部执行命令。 59 | * [kubectl expose](kubectl_expose.md) - 输入replication controller,service或者pod,并将其暴露为新的kubernetes service。 60 | * [kubectl get](kubectl_get.md) - 输出一个/多个资源。 61 | * [kubectl label](kubectl_label.md) - 更新资源的label。 62 | * [kubectl logs](kubectl_logs.md) - 输出pod中一个容器的日志。 63 | * [kubectl namespace](kubectl_namespace.md) -(已停用)设置或查看当前使用的namespace。 64 | * [kubectl patch](kubectl_patch.md) - 通过控制台输入更新资源中的字段。 65 | * [kubectl port-forward](kubectl_port-forward.md) - 将本地端口转发到Pod。 66 | * [kubectl proxy](kubectl_proxy.md) - 为Kubernetes API server启动代理服务器。 67 | * [kubectl replace](kubectl_replace.md) - 通过文件名或控制台输入替换资源。 68 | * [kubectl rolling-update](kubectl_rolling-update.md) - 对指定的replication controller执行滚动升级。 69 | * [kubectl run](kubectl_run.md) - 在集群中使用指定镜像启动容器。 70 | * [kubectl scale](kubectl_scale.md) - 为replication controller设置新的副本数。 71 | * [kubectl stop](kubectl_stop.md) - (已停用)通过资源名或控制台输入安全删除资源。 72 | * [kubectl version](kubectl_version.md) - 输出服务端和客户端的版本信息。 -------------------------------------------------------------------------------- /137-kubectl_api-versions.md: -------------------------------------------------------------------------------- 1 | ## kubectl api-versions 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 以“组/版本”的格式输出服务端支持的API版本。 6 | 7 | ### 摘要 8 | 9 | 以“组/版本”的格式输出服务端支持的API版本。 10 | 11 | ``` 12 | kubectl api-versions 13 | ``` 14 | 15 | ### 继承自父命令的选项 16 | ``` 17 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 18 | --api-version="": 和服务端交互使用的API版本。 19 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 20 | --client-certificate="": TLS使用的客户端证书路径。 21 | --client-key="": TLS使用的客户端密钥路径。 22 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 23 | --context="": 指定使用的kubeconfig配置文件中的环境名。 24 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 25 | --kubeconfig="": 命令行请求使用的配置文件路径。 26 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 27 | --log-dir="": 如果不为空,将日志文件写入此目录。 28 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 29 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 30 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 31 | --namespace="": 如果不为空,命令将使用此namespace。 32 | --password="": API Server进行简单认证使用的密码。 33 | -s, --server="": Kubernetes API Server的地址和端口号。 34 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 35 | --token="": 认证到API Server使用的令牌。 36 | --user="": 指定使用的kubeconfig配置文件中的用户名。 37 | --username="": API Server进行简单认证使用的用户名。 38 | --v=0: 指定输出日志的级别。 39 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 40 | ``` 41 | 42 | ### 参见 43 | 44 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 -------------------------------------------------------------------------------- /138-kubectl_cluster-info.md: -------------------------------------------------------------------------------- 1 | ## kubectl cluster-info 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 显示集群信息。 6 | 7 | ### 摘要 8 | 9 | 显示master节点的地址和包含kubernetes.io/cluster-service=true的service(系统service)。 10 | 11 | ``` 12 | kubectl cluster-info 13 | ``` 14 | 15 | ### 继承自父命令的选项 16 | ``` 17 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 18 | --api-version="": 和服务端交互使用的API版本。 19 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 20 | --client-certificate="": TLS使用的客户端证书路径。 21 | --client-key="": TLS使用的客户端密钥路径。 22 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 23 | --context="": 指定使用的kubeconfig配置文件中的环境名。 24 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 25 | --kubeconfig="": 命令行请求使用的配置文件路径。 26 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 27 | --log-dir="": 如果不为空,将日志文件写入此目录。 28 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 29 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 30 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 31 | --namespace="": 如果不为空,命令将使用此namespace。 32 | --password="": API Server进行简单认证使用的密码。 33 | -s, --server="": Kubernetes API Server的地址和端口号。 34 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 35 | --token="": 认证到API Server使用的令牌。 36 | --user="": 指定使用的kubeconfig配置文件中的用户名。 37 | --username="": API Server进行简单认证使用的用户名。 38 | --v=0: 指定输出日志的级别。 39 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 40 | ``` 41 | 42 | ### 参见 43 | 44 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 -------------------------------------------------------------------------------- /139-kubectl_config_set-cluster.md: -------------------------------------------------------------------------------- 1 | ## kubectl config set-cluster 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 在kubeconfig配置文件中设置一个集群项。 6 | 7 | ### 摘要 8 | 9 | 在kubeconfig配置文件中设置一个集群项。 10 | 如果指定了一个已存在的名字,将合并新字段并覆盖旧字段。 11 | 12 | ``` 13 | kubectl config set-cluster NAME [--server=server] [--certificate-authority=path/to/certficate/authority] [--api-version=apiversion] [--insecure-skip-tls-verify=true] 14 | ``` 15 | 16 | ### 示例 17 | 18 | ``` 19 | # 仅设置e2e集群项中的server字段,不影响其他字段 20 | $ kubectl config set-cluster e2e --server=https://1.2.3.4 21 | 22 | # 向e2e集群项中添加认证鉴权数据 23 | $ kubectl config set-cluster e2e --certificate-authority=~/.kube/e2e/kubernetes.ca.crt 24 | 25 | # 取消dev集群项中的证书检查 26 | $ kubectl config set-cluster e2e --insecure-skip-tls-verify=true 27 | ``` 28 | 29 | ### 选项 30 | 31 | ``` 32 | --api-version="": 设置kuebconfig配置文件中集群选项中的api-version。 33 | --certificate-authority="": 设置kuebconfig配置文件中集群选项中的certificate-authority路径。 34 | --embed-certs=false: 设置kuebconfig配置文件中集群选项中的embed-certs开关。 35 | --insecure-skip-tls-verify=false: 设置kuebconfig配置文件中集群选项中的insecure-skip-tls-verify开关。 36 | --server="": 设置kuebconfig配置文件中集群选项中的server。 37 | ``` 38 | 39 | ### 继承自父命令的选项 40 | ``` 41 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 42 | --api-version="": 和服务端交互使用的API版本。 43 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 44 | --client-certificate="": TLS使用的客户端证书路径。 45 | --client-key="": TLS使用的客户端密钥路径。 46 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 47 | --context="": 指定使用的kubeconfig配置文件中的环境名。 48 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 49 | --kubeconfig="": 命令行请求使用的配置文件路径。 50 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 51 | --log-dir="": 如果不为空,将日志文件写入此目录。 52 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 53 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 54 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 55 | --namespace="": 如果不为空,命令将使用此namespace。 56 | --password="": API Server进行简单认证使用的密码。 57 | -s, --server="": Kubernetes API Server的地址和端口号。 58 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 59 | --token="": 认证到API Server使用的令牌。 60 | --user="": 指定使用的kubeconfig配置文件中的用户名。 61 | --username="": API Server进行简单认证使用的用户名。 62 | --v=0: 指定输出日志的级别。 63 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 64 | ``` 65 | 66 | ### 参见 67 | 68 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 -------------------------------------------------------------------------------- /140-kubectl_config_set-context.md: -------------------------------------------------------------------------------- 1 | ## kubectl config set-context 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 在kubeconfig配置文件中设置一个环境项。 6 | 7 | ### 摘要 8 | 9 | 在kubeconfig配置文件中设置一个环境项。 10 | 如果指定了一个已存在的名字,将合并新字段并覆盖旧字段。 11 | 12 | ``` 13 | kubectl config set-context NAME [--cluster=cluster_nickname] [--user=user_nickname] [--namespace=namespace] 14 | ``` 15 | 16 | ### 示例 17 | 18 | ``` 19 | # 设置gce环境项中的user字段,不影响其他字段。 20 | $ kubectl config set-context gce --user=cluster-admin 21 | ``` 22 | 23 | ### 选项 24 | 25 | ``` 26 | --cluster="": 设置kuebconfig配置文件中环境选项中的集群。 27 | --namespace="": 设置kuebconfig配置文件中环境选项中的命名空间。 28 | --user="": 设置kuebconfig配置文件中环境选项中的用户。 29 | ``` 30 | 31 | ### 继承自父命令的选项 32 | ``` 33 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 34 | --api-version="": 和服务端交互使用的API版本。 35 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 36 | --client-certificate="": TLS使用的客户端证书路径。 37 | --client-key="": TLS使用的客户端密钥路径。 38 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 39 | --context="": 指定使用的kubeconfig配置文件中的环境名。 40 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 41 | --kubeconfig="": 命令行请求使用的配置文件路径。 42 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 43 | --log-dir="": 如果不为空,将日志文件写入此目录。 44 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 45 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 46 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 47 | --namespace="": 如果不为空,命令将使用此namespace。 48 | --password="": API Server进行简单认证使用的密码。 49 | -s, --server="": Kubernetes API Server的地址和端口号。 50 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 51 | --token="": 认证到API Server使用的令牌。 52 | --user="": 指定使用的kubeconfig配置文件中的用户名。 53 | --username="": API Server进行简单认证使用的用户名。 54 | --v=0: 指定输出日志的级别。 55 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 56 | ``` 57 | 58 | ### 参见 59 | 60 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 -------------------------------------------------------------------------------- /141-kubectl_config_set-credentials.md: -------------------------------------------------------------------------------- 1 | ## kubectl config set-credentials 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 在kubeconfig配置文件中设置一个用户项。 6 | 7 | ### 摘要 8 | 9 | 在kubeconfig配置文件中设置一个用户项。 10 | 如果指定了一个已存在的名字,将合并新字段并覆盖旧字段。 11 | 12 | 客户端证书设置: 13 | --client-certificate=certfile --client-key=keyfile 14 | 15 | 不记名令牌设置: 16 | --token=bearer_token 17 | 18 | 基础认证设置: 19 | --username=basic_user --password=basic_password 20 | 21 | 不记名令牌和基础认证不能同时使用。 22 | 23 | ``` 24 | kubectl config set-credentials NAME [--client-certificate=path/to/certfile] [--client-key=path/to/keyfile] [--token=bearer_token] [--username=basic_user] [--password=basic_password] 25 | ``` 26 | 27 | ### 示例 28 | 29 | ``` 30 | # 仅设置cluster-admin用户项下的client-key字段,不影响其他值 31 | $ kubectl config set-credentials cluster-admin --client-key=~/.kube/admin.key 32 | 33 | # 为cluster-admin用户项设置基础认证选项 34 | $ kubectl config set-credentials cluster-admin --username=admin --password=uXFGweU9l35qcif 35 | 36 | # 为cluster-admin用户项开启证书验证并设置证书文件路径 37 | $ kubectl config set-credentials cluster-admin --client-certificate=~/.kube/admin.crt --embed-certs=true 38 | ``` 39 | 40 | ### 选项 41 | 42 | ``` 43 | --client-certificate="": 设置kuebconfig配置文件中用户选项中的证书文件路径。 44 | --client-key="": 设置kuebconfig配置文件中用户选项中的证书密钥路径。 45 | --embed-certs=false: 设置kuebconfig配置文件中用户选项中的embed-certs开关。 46 | --password="": 设置kuebconfig配置文件中用户选项中的密码。 47 | --token="": 设置kuebconfig配置文件中用户选项中的令牌。 48 | --username="": 设置kuebconfig配置文件中用户选项中的用户名。 49 | ``` 50 | 51 | ### 继承自父命令的选项 52 | ``` 53 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 54 | --api-version="": 和服务端交互使用的API版本。 55 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 56 | --client-certificate="": TLS使用的客户端证书路径。 57 | --client-key="": TLS使用的客户端密钥路径。 58 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 59 | --context="": 指定使用的kubeconfig配置文件中的环境名。 60 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 61 | --kubeconfig="": 命令行请求使用的配置文件路径。 62 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 63 | --log-dir="": 如果不为空,将日志文件写入此目录。 64 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 65 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 66 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 67 | --namespace="": 如果不为空,命令将使用此namespace。 68 | --password="": API Server进行简单认证使用的密码。 69 | -s, --server="": Kubernetes API Server的地址和端口号。 70 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 71 | --token="": 认证到API Server使用的令牌。 72 | --user="": 指定使用的kubeconfig配置文件中的用户名。 73 | --username="": API Server进行简单认证使用的用户名。 74 | --v=0: 指定输出日志的级别。 75 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 76 | ``` 77 | 78 | ### 参见 79 | 80 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 -------------------------------------------------------------------------------- /142-kubectl_config_set.md: -------------------------------------------------------------------------------- 1 | ## kubectl config set 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 在kubeconfig配置文件中设置一个单独的值。 6 | 7 | ### 摘要 8 | 9 | 在kubeconfig配置文件中设置一个单独的值 10 | 11 | PROPERTY_NAME 使用“.”进行分隔,每段代表一个属性名或者map的键,map的键不能包含“.”。 12 | PROPERTY_VALUE 需要设置的新值。 13 | 14 | ``` 15 | kubectl config set PROPERTY_NAME PROPERTY_VALUE 16 | ``` 17 | 18 | ### 继承自父命令的选项 19 | ``` 20 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 21 | --api-version="": 和服务端交互使用的API版本。 22 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 23 | --client-certificate="": TLS使用的客户端证书路径。 24 | --client-key="": TLS使用的客户端密钥路径。 25 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 26 | --context="": 指定使用的kubeconfig配置文件中的环境名。 27 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 28 | --kubeconfig="": 命令行请求使用的配置文件路径。 29 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 30 | --log-dir="": 如果不为空,将日志文件写入此目录。 31 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 32 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 33 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 34 | --namespace="": 如果不为空,命令将使用此namespace。 35 | --password="": API Server进行简单认证使用的密码。 36 | -s, --server="": Kubernetes API Server的地址和端口号。 37 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 38 | --token="": 认证到API Server使用的令牌。 39 | --user="": 指定使用的kubeconfig配置文件中的用户名。 40 | --username="": API Server进行简单认证使用的用户名。 41 | --v=0: 指定输出日志的级别。 42 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 43 | ``` 44 | 45 | ### 参见 46 | 47 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 48 | -------------------------------------------------------------------------------- /143-kubectl_config_unset.md: -------------------------------------------------------------------------------- 1 | ## kubectl config unset 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 在kubeconfig配置文件中清除一个单独的值。 6 | 7 | ### 摘要 8 | 9 | 在kubeconfig配置文件中清除一个单独的值。 10 | PROPERTY_NAME 使用“.”进行分隔,每段代表一个属性名或者map的键,map的键不能包含“.”。 11 | 12 | ``` 13 | kubectl config unset PROPERTY_NAME 14 | ``` 15 | 16 | ### 继承自父命令的选项 17 | ``` 18 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 19 | --api-version="": 和服务端交互使用的API版本。 20 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 21 | --client-certificate="": TLS使用的客户端文件路径。 22 | --client-key="": TLS使用的客户端密钥路径。 23 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 24 | --context="": 指定使用的kubeconfig配置文件中的环境名。 25 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 26 | --kubeconfig="": 命令行请求使用的配置文件路径。 27 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 28 | --log-dir="": 如果不为空,将日志文件写入此目录。 29 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 30 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 31 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 32 | --namespace="": 如果不为空,命令将使用此namespace。 33 | --password="": API Server进行简单认证使用的密码。 34 | -s, --server="": Kubernetes API Server的地址和端口号。 35 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 36 | --token="": 认证到API Server使用的令牌。 37 | --user="": 指定使用的kubeconfig配置文件中的用户名。 38 | --username="": API Server进行简单认证使用的用户名。 39 | --v=0: 指定输出日志的级别。 40 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 41 | ``` 42 | 43 | ### 参见 44 | 45 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 -------------------------------------------------------------------------------- /144-kubectl_config_use-context.md: -------------------------------------------------------------------------------- 1 | ## kubectl config use-context 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 使用kubeconfig中的一个环境项作为当前配置。 6 | 7 | ### 摘要 8 | 9 | 使用kubeconfig中的一个环境项作为当前配置。 10 | 11 | ``` 12 | kubectl config use-context CONTEXT_NAME 13 | ``` 14 | 15 | ### 继承自父命令的选项 16 | ``` 17 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 18 | --api-version="": 和服务端交互使用的API版本。 19 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 20 | --client-certificate="": TLS使用的客户端证书路径。 21 | --client-key="": TLS使用的客户端密钥路径。 22 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 23 | --context="": 指定使用的kubeconfig配置文件中的环境名。 24 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 25 | --kubeconfig="": 命令行请求使用的配置文件路径。 26 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 27 | --log-dir="": 如果不为空,将日志文件写入此目录。 28 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 29 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 30 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 31 | --namespace="": 如果不为空,命令将使用此namespace。 32 | --password="": API Server进行简单认证使用的密码。 33 | -s, --server="": Kubernetes API Server的地址和端口号。 34 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 35 | --token="": 认证到API Server使用的令牌。 36 | --user="": 指定使用的kubeconfig配置文件中的用户名。 37 | --username="": API Server进行简单认证使用的用户名。 38 | --v=0: 指定输出日志的级别。 39 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 40 | ``` 41 | 42 | ### 参见 43 | 44 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 -------------------------------------------------------------------------------- /145-kubectl_config.md: -------------------------------------------------------------------------------- 1 | ## kubectl config 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 修改kubeconfig配置文件。 6 | 7 | ### 摘要 8 | 9 | 使用config的子命令修改kubeconfig配置文件,如“kubectl config set current-context my-context”。 10 | 11 | 配置文件的读取遵循如下规则: 12 | 13 | The loading order follows these rules: 14 | 1. 如果指定了--kubeconfig选项,那么只有指定的文件被加载。此选项只能被设置一次,并且不会合并其他文件。If the --kubeconfig flag is set, then only that file is loaded. The flag may only be set once and no merging takes place. 15 | 2. 如果设置了$KUBECONFIG环境变量,将同时使用此环境变量指定的所有文件列表(使用操作系统默认的顺序),所有文件将被合并。当修改一个值时,将修改设置了该值的文件。当创建一个值时,将在列表的首个文件创建该值。若列表中所有的文件都不存在,将创建列表中的最后一个文件。 16 | 3. 如果前两项都没有设置,将使用 ${HOME}/.kube/config,并且不会合并其他文件。 17 | 18 | 19 | ``` 20 | kubectl config SUBCOMMAND 21 | ``` 22 | 23 | ### 选项 24 | 25 | ``` 26 | --kubeconfig="": 使用特定的配置文件。 27 | ``` 28 | 29 | ### 继承自父命令的选项 30 | ``` 31 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 32 | --api-version="": 和服务端交互使用的API版本。 33 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 34 | --client-certificate="": TLS使用的客户端证书路径。 35 | --client-key="": TLS使用的客户端密钥路径。 36 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 37 | --context="": 指定使用的kubeconfig配置文件中的环境名。 38 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 39 | --kubeconfig="": 命令行请求使用的配置文件路径。 40 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 41 | --log-dir="": 如果不为空,将日志文件写入此目录。 42 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 43 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 44 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 45 | --namespace="": 如果不为空,命令将使用此namespace。 46 | --password="": API Server进行简单认证使用的密码。 47 | -s, --server="": Kubernetes API Server的地址和端口号。 48 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 49 | --token="": 认证到API Server使用的令牌。 50 | --user="": 指定使用的kubeconfig配置文件中的用户名。 51 | --username="": API Server进行简单认证使用的用户名。 52 | --v=0: 指定输出日志的级别。 53 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 54 | ``` 55 | 56 | ### 参见 57 | 58 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 59 | * [kubectl config set](kubectl_config_set.md) - 在kubeconfig配置文件中设置一个单独的值。 60 | * [kubectl config set-cluster](kubectl_config_set-cluster.md) - 在kubeconfig配置文件中设置一个集群项。 61 | * [kubectl config set-context](kubectl_config_set-context.md) - 在kubeconfig配置文件中设置一个环境项。 62 | * [kubectl config set-credentials](kubectl_config_set-credentials.md) - 在kubeconfig配置文件中设置一个用户项。 63 | * [kubectl config unset](kubectl_config_unset.md) - 在kubeconfig配置文件中清除一个单独的值。 64 | * [kubectl config use-context](kubectl_config_use-context.md) - 使用kubeconfig中的一个环境项作为当前配置。 65 | * [kubectl config view](kubectl_config_view.md) - 显示合并后的kubeconfig设置,或者一个指定的kubeconfig配置文件。 -------------------------------------------------------------------------------- /146-kubectl_config_view.md: -------------------------------------------------------------------------------- 1 | ## kubectl config view 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 显示合并后的kubeconfig设置,或者一个指定的kubeconfig配置文件。 6 | 7 | ### 摘要 8 | 9 | 显示合并后的kubeconfig设置,或者一个指定的kubeconfig配置文件。 10 | 用户可使用--output=template --template=TEMPLATE来选择输出指定的值。 11 | 12 | ``` 13 | kubectl config view 14 | ``` 15 | 16 | ### 示例 17 | 18 | ``` 19 | # 显示合并后的kubeconfig设置 20 | $ kubectl config view 21 | 22 | # 获取e2e用户的密码 23 | $ kubectl config view -o template --template='{{range .users}}{{ if eq .name "e2e" }}{{ index .user.password }}{{end}}{{end}}' 24 | ``` 25 | 26 | ### 选项 27 | 28 | ``` 29 | --flatten[=false]: 将读取的kubeconfig配置文件扁平输出为自包含的结构(对创建可迁移的kubeconfig配置文件有帮助) 30 | --merge=true: 按照继承关系合并所有的kubeconfig配置文件。 31 | --minify[=false]: 如果为true,不显示目前环境未使用到的任何信息。 32 | --no-headers[=false]: 当使用默认输出格式时不打印标题栏。 33 | -o, --output="": 输出格式,只能使用json|yaml|wide|name|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=...中的一种。参见golang模板[http://golang.org/pkg/text/template/#pkg-overview]和jsonpath模板[http://releases.k8s.io/release-1.1/docs/user-guide/jsonpath.md]。 34 | --output-version="": 输出资源使用的API版本(默认使用api-version)。 35 | --raw[=false]: 显示未经格式化的字节信息。 36 | -a, --show-all[=false]: 打印输出时,显示所有的资源(默认隐藏状态为terminated的pod)。 37 | --sort-by="": 如果不为空,对输出的多个结果根据指定字段进行排序。该字段使用jsonpath表达式(如“ObjectMeta.Name”)描述,并且该字段只能为字符串或者整数类型。 38 | --template="": 当指定了-o=go-template或-o=go-template-file时使用的模板字符串或者模板文件。模板的格式为golang模板[http://golang.org/pkg/text/template/#pkg-overview]。 39 | ``` 40 | 41 | ### 继承自父命令的选项 42 | ``` 43 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 44 | --api-version="": 和服务端交互使用的API版本。 45 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 46 | --client-certificate="": TLS使用的客户端证书路径。 47 | --client-key="": TLS使用的客户端密钥路径。 48 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 49 | --context="": 指定使用的kubeconfig配置文件中的环境名。 50 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 51 | --kubeconfig="": 命令行请求使用的配置文件路径。 52 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 53 | --log-dir="": 如果不为空,将日志文件写入此目录。 54 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 55 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 56 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 57 | --namespace="": 如果不为空,命令将使用此namespace。 58 | --password="": API Server进行简单认证使用的密码。 59 | -s, --server="": Kubernetes API Server的地址和端口号。 60 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 61 | --token="": 认证到API Server使用的令牌。 62 | --user="": 指定使用的kubeconfig配置文件中的用户名。 63 | --username="": API Server进行简单认证使用的用户名。 64 | --v=0: 指定输出日志的级别。 65 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 66 | ``` 67 | 68 | ### 参见 69 | 70 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 71 | -------------------------------------------------------------------------------- /147-kubectl_create.md: -------------------------------------------------------------------------------- 1 | ## kubectl create 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 通过文件名或控制台输入,创建资源。 6 | 7 | ### 摘要 8 | 9 | 通过文件名或控制台输入,创建资源。 10 | 11 | 接受JSON和YAML格式的描述文件。 12 | 13 | ``` 14 | kubectl create -f FILENAME 15 | ``` 16 | 17 | ### 示例 18 | 19 | ``` 20 | # 使用pod.json文件创建一个pod 21 | $ kubectl create -f ./pod.json 22 | 23 | # 通过控制台输入的JSON创建一个pod 24 | $ cat pod.json | kubectl create -f - 25 | ``` 26 | 27 | ### 选项 28 | 29 | ``` 30 | -f, --filename=[]: 用以创建资源的文件名,目录名或者URL。 31 | -o, --output="": 输出格式,使用“-o name”来输出简短格式(资源类型/资源名)。 32 | --schema-cache-dir="/tmp/kubectl.schema": 如果不为空,将API schema缓存为指定文件,默认缓存到“/tmp/kubectl.schema”。 33 | --validate[=true]: 如果为true,在发送到服务端前先使用schema来验证输入。 34 | ``` 35 | 36 | ### 继承自父命令的选项 37 | ``` 38 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 39 | --api-version="": 和服务端交互使用的API版本。 40 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 41 | --client-certificate="": TLS使用的客户端证书路径。 42 | --client-key="": TLS使用的客户端密钥路径。 43 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 44 | --context="": 指定使用的kubeconfig配置文件中的环境名。 45 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 46 | --kubeconfig="": 命令行请求使用的配置文件路径。 47 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 48 | --log-dir="": 如果不为空,将日志文件写入此目录。 49 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 50 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 51 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 52 | --namespace="": 如果不为空,命令将使用此namespace。 53 | --password="": API Server进行简单认证使用的密码。 54 | -s, --server="": Kubernetes API Server的地址和端口号。 55 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 56 | --token="": 认证到API Server使用的令牌。 57 | --user="": 指定使用的kubeconfig配置文件中的用户名。 58 | --username="": API Server进行简单认证使用的用户名。 59 | --v=0: 指定输出日志的级别。 60 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 61 | ``` 62 | 63 | ### 参见 64 | 65 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 -------------------------------------------------------------------------------- /148-kubectl_delete.md: -------------------------------------------------------------------------------- 1 | ## kubectl delete 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 通过文件名、控制台输入、资源名或者label selector删除资源。 6 | 7 | ### 摘要 8 | 9 | 通过文件名、控制台输入、资源名或者label selector删除资源。 10 | 接受JSON和YAML格式的描述文件。 11 | 12 | 只能指定以下参数类型中的一种:文件名、资源类型和名称、资源类型和label selector。 13 | 注意:delete命令不检查资源版本,如果有人在你进行删除操作的同时进行更新操作,他所做的更新将随资源同时被删除。 14 | 15 | ``` 16 | kubectl delete ([-f FILENAME] | TYPE [(NAME | -l label | --all)]) 17 | ``` 18 | 19 | ### 示例 20 | 21 | ``` 22 | # 通过pod.json文件中指定的资源类型和名称删除一个pod 23 | $ kubectl delete -f ./pod.json 24 | 25 | # 通过控制台输入的JSON所指定的资源类型和名称删除一个pod 26 | $ cat pod.json | kubectl delete -f - 27 | 28 | # 删除所有名为“baz”和“foo”的pod和service 29 | $ kubectl delete pod,service baz foo 30 | 31 | # 删除所有带有lable name=myLabel的pod和service 32 | $ kubectl delete pods,services -l name=myLabel 33 | 34 | # 删除UID为1234-56-7890-234234-456456的pod 35 | $ kubectl delete pod 1234-56-7890-234234-456456 36 | 37 | # 删除所有的pod 38 | $ kubectl delete pods --all 39 | ``` 40 | 41 | ### 选项 42 | 43 | ``` 44 | --all[=false]: 使用[-all]选择所有指定的资源。 45 | --cascade[=true]: 如果为true,级联删除指定资源所管理的其他资源(例如:被replication controller管理的所有pod)。默认为true。 46 | -f, --filename=[]: 用以指定待删除资源的文件名,目录名或者URL。 47 | --grace-period=-1: 安全删除资源前等待的秒数。如果为负值则忽略该选项。 48 | --ignore-not-found[=false]: 当待删除资源未找到时,也认为删除成功。如果设置了--all选项,则默认为true。 49 | -o, --output="": 输出格式,使用“-o name”来输出简短格式(资源类型/资源名)。 50 | -l, --selector="": 用于过滤资源的Label。 51 | --timeout=0: 删除资源的超时设置,0表示根据待删除资源的大小由系统决定。 52 | ``` 53 | 54 | ### 继承自父命令的选项 55 | ``` 56 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 57 | --api-version="": 和服务端交互使用的API版本。 58 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 59 | --client-certificate="": TLS使用的客户端证书路径。 60 | --client-key="": TLS使用的客户端密钥路径。 61 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 62 | --context="": 指定使用的kubeconfig配置文件中的环境名。 63 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 64 | --kubeconfig="": 命令行请求使用的配置文件路径。 65 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 66 | --log-dir="": 如果不为空,将日志文件写入此目录。 67 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 68 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 69 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 70 | --namespace="": 如果不为空,命令将使用此namespace。 71 | --password="": API Server进行简单认证使用的密码。 72 | -s, --server="": Kubernetes API Server的地址和端口号。 73 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 74 | --token="": 认证到API Server使用的令牌。 75 | --user="": 指定使用的kubeconfig配置文件中的用户名。 76 | --username="": API Server进行简单认证使用的用户名。 77 | --v=0: 指定输出日志的级别。 78 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 79 | ``` 80 | 81 | ### 参见 82 | 83 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 -------------------------------------------------------------------------------- /149-kubectl_describe.md: -------------------------------------------------------------------------------- 1 | ## kubectl describe 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 输出指定的一个/多个资源的详细信息。 6 | 7 | ### 摘要 8 | 9 | 输出指定的一个/多个资源的详细信息。 10 | 11 | 此命令组合调用多条API,输出指定的一个或者一组资源的详细描述。 12 | 13 | $ kubectl describe TYPE NAME_PREFIX 14 | 15 | 首先检查是否有精确匹配TYPE和NAME_PREFIX的资源,如果没有,将会输出所有名称以NAME_PREFIX开头的资源详细信息。 16 | 17 | 支持的资源包括但不限于(大小写不限):pods (po)、services (svc)、 18 | replicationcontrollers (rc)、nodes (no)、events (ev)、componentstatuses (cs)、 19 | limitranges (limits)、persistentvolumes (pv)、persistentvolumeclaims (pvc)、 20 | resourcequotas (quota)和secrets。 21 | 22 | ``` 23 | kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | -l label] | TYPE/NAME) 24 | ``` 25 | 26 | ### 示例 27 | 28 | ``` 29 | # 描述一个node 30 | $ kubectl describe nodes kubernetes-minion-emt8.c.myproject.internal 31 | 32 | # 描述一个pod 33 | $ kubectl describe pods/nginx 34 | 35 | # 描述pod.json中的资源类型和名称指定的pod 36 | $ kubectl describe -f pod.json 37 | 38 | # 描述所有的pod 39 | $ kubectl describe pods 40 | 41 | # 描述所有包含label name=myLabel的pod 42 | $ kubectl describe po -l name=myLabel 43 | 44 | # 描述所有被replication controller “frontend”管理的pod(rc创建的pod都以rc的名字作为前缀) 45 | $ kubectl describe pods frontend 46 | ``` 47 | 48 | ### 选项 49 | 50 | ``` 51 | -f, --filename=[]: 用来指定待描述资源的文件名,目录名或者URL。 52 | -l, --selector="": 用于过滤资源的Label。 53 | ``` 54 | 55 | ### 继承自父命令的选项 56 | ``` 57 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 58 | --api-version="": 和服务端交互使用的API版本。 59 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 60 | --client-certificate="": TLS使用的客户端证书路径。 61 | --client-key="": TLS使用的客户端密钥路径。 62 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 63 | --context="": 指定使用的kubeconfig配置文件中的环境名。 64 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 65 | --kubeconfig="": 命令行请求使用的配置文件路径。 66 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 67 | --log-dir="": 如果不为空,将日志文件写入此目录。 68 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 69 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 70 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 71 | --namespace="": 如果不为空,命令将使用此namespace。 72 | --password="": API Server进行简单认证使用的密码。 73 | -s, --server="": Kubernetes API Server的地址和端口号。 74 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 75 | --token="": 认证到API Server使用的令牌。 76 | --user="": 指定使用的kubeconfig配置文件中的用户名。 77 | --username="": API Server进行简单认证使用的用户名。 78 | --v=0: 指定输出日志的级别。 79 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 80 | ``` 81 | 82 | ### 参见 83 | 84 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 -------------------------------------------------------------------------------- /150-kubectl_exec.md: -------------------------------------------------------------------------------- 1 | ## kubectl exec 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 在容器内部执行命令。 6 | 7 | ### 摘要 8 | 9 | 在容器内部执行命令。 10 | 11 | ``` 12 | kubectl exec POD [-c CONTAINER] -- COMMAND [args...] 13 | ``` 14 | 15 | ### 示例 16 | 17 | ``` 18 | # 默认在pod 123456-7890的第一个容器中运行“date”并获取输出 19 | $ kubectl exec 123456-7890 date 20 | 21 | # 在pod 123456-7890的容器ruby-container中运行“date”并获取输出 22 | $ kubectl exec 123456-7890 -c ruby-container date 23 | 24 | # 切换到终端模式,将控制台输入发送到pod 123456-7890的ruby-container的“bash”命令,并将其输出到控制台/ 25 | # 错误控制台的信息发送回客户端。 26 | $ kubectl exec 123456-7890 -c ruby-container -i -t -- bash -il 27 | ``` 28 | 29 | ### 选项 30 | 31 | ``` 32 | -c, --container="": 容器名。如果未指定,使用pod中的一个容器。 33 | -p, --pod="": Pod名。 34 | -i, --stdin[=false]: 将控制台输入发送到容器。 35 | -t, --tty[=false]: 将标准输入控制台作为容器的控制台输入。 36 | ``` 37 | 38 | ### 继承自父命令的选项 39 | ``` 40 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 41 | --api-version="": 和服务端交互使用的API版本。 42 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 43 | --client-certificate="": TLS使用的客户端证书路径。 44 | --client-key="": TLS使用的客户端密钥路径。 45 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 46 | --context="": 指定使用的kubeconfig配置文件中的环境名。 47 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 48 | --kubeconfig="": 命令行请求使用的配置文件路径。 49 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 50 | --log-dir="": 如果不为空,将日志文件写入此目录。 51 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 52 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 53 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 54 | --namespace="": 如果不为空,命令将使用此namespace。 55 | --password="": API Server进行简单认证使用的密码。 56 | -s, --server="": Kubernetes API Server的地址和端口号。 57 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 58 | --token="": 认证到API Server使用的令牌。 59 | --user="": 指定使用的kubeconfig配置文件中的用户名。 60 | --username="": API Server进行简单认证使用的用户名。 61 | --v=0: 指定输出日志的级别。 62 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 63 | ``` 64 | 65 | ### 参见 66 | 67 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 68 | -------------------------------------------------------------------------------- /154-kubectl_logs.md: -------------------------------------------------------------------------------- 1 | ## kubectl logs 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 输出pod中一个容器的日志。 6 | 7 | ### 摘要 8 | 9 | 输出pod中一个容器的日志。如果pod只包含一个容器则可以省略容器名。 10 | 11 | ``` 12 | kubectl logs [-f] [-p] POD [-c CONTAINER] 13 | ``` 14 | 15 | ### 示例 16 | 17 | ``` 18 | # 返回仅包含一个容器的pod nginx的日志快照 19 | $ kubectl logs nginx 20 | 21 | # 返回pod ruby中已经停止的容器web-1的日志快照 22 | $ kubectl logs -p -c ruby web-1 23 | 24 | # 持续输出pod ruby中的容器web-1的日志 25 | $ kubectl logs -f -c ruby web-1 26 | 27 | # 仅输出pod nginx中最近的20条日志 28 | $ kubectl logs --tail=20 nginx 29 | 30 | # 输出pod nginx中最近一小时内产生的所有日志 31 | $ kubectl logs --since=1h nginx 32 | ``` 33 | 34 | ### 选项 35 | 36 | ``` 37 | -c, --container="": 容器名。 38 | -f, --follow[=false]: 指定是否持续输出日志。 39 | --interactive[=true]: 如果为true,当需要时提示用户进行输入。默认为true。 40 | --limit-bytes=0: 输出日志的最大字节数。默认无限制。 41 | -p, --previous[=false]: 如果为true,输出pod中曾经运行过,但目前已终止的容器的日志。 42 | --since=0: 仅返回相对时间范围,如5s、2m或3h,之内的日志。默认返回所有日志。只能同时使用since和since-time中的一种。 43 | --since-time="": 仅返回指定时间(RFC3339格式)之后的日志。默认返回所有日志。只能同时使用since和since-time中的一种。 44 | --tail=-1: 要显示的最新的日志条数。默认为-1,显示所有的日志。 45 | --timestamps[=false]: 在日志中包含时间戳。 46 | ``` 47 | 48 | ### 继承自父命令的选项 49 | ``` 50 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 51 | --api-version="": 和服务端交互使用的API版本。 52 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 53 | --client-certificate="": TLS使用的客户端证书路径。 54 | --client-key="": TLS使用的客户端密钥路径。 55 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 56 | --context="": 指定使用的kubeconfig配置文件中的环境名。 57 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 58 | --kubeconfig="": 命令行请求使用的配置文件路径。 59 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 60 | --log-dir="": 如果不为空,将日志文件写入此目录。 61 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 62 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 63 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 64 | --namespace="": 如果不为空,命令将使用此namespace。 65 | --password="": API Server进行简单认证使用的密码。 66 | -s, --server="": Kubernetes API Server的地址和端口号。 67 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 68 | --token="": 认证到API Server使用的令牌。 69 | --user="": 指定使用的kubeconfig配置文件中的用户名。 70 | --username="": API Server进行简单认证使用的用户名。 71 | --v=0: 指定输出日志的级别。 72 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 73 | ``` 74 | 75 | ### 参见 76 | 77 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 -------------------------------------------------------------------------------- /164-kubectl_version.md: -------------------------------------------------------------------------------- 1 | ## kubectl version 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 输出服务端和客户端的版本信息。 6 | 7 | ### 摘要 8 | 9 | 输出服务端和客户端的版本信息。 10 | 11 | ``` 12 | kubectl version 13 | ``` 14 | 15 | ### 选项 16 | 17 | ``` 18 | -c, --client[=false]: 仅输出客户端版本(无需连接服务器)。 19 | ``` 20 | 21 | ### 继承自父命令的选项 22 | ``` 23 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 24 | --api-version="": 和服务端交互使用的API版本。 25 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 26 | --client-certificate="": TLS使用的客户端证书路径。 27 | --client-key="": TLS使用的客户端密钥路径。 28 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 29 | --context="": 指定使用的kubeconfig配置文件中的环境名。 30 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 31 | --kubeconfig="": 命令行请求使用的配置文件路径。 32 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 33 | --log-dir="": 如果不为空,将日志文件写入此目录。 34 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 35 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 36 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 37 | --namespace="": 如果不为空,命令将使用此namespace。 38 | --password="": API Server进行简单认证使用的密码。 39 | -s, --server="": Kubernetes API Server的地址和端口号。 40 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 41 | --token="": 认证到API Server使用的令牌。 42 | --user="": 指定使用的kubeconfig配置文件中的用户名。 43 | --username="": API Server进行简单认证使用的用户名。 44 | --v=0: 指定输出日志的级别。 45 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 46 | ``` 47 | 48 | ### 参见 49 | 50 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 -------------------------------------------------------------------------------- /165-Troubleshooting and Support.md: -------------------------------------------------------------------------------- 1 | # 故障排查 2 | `译者:林帆` `校对:无` 3 | 4 | 5 | 在使用Kubernetes时,用户常常会遇到一些错误和迷惑,这个小节的内容将针对常见的问题进行解答。我们将这些问题分为以下两个部分: 6 | 7 | - 应用程序相关的故障排查:当遇到将代码部署到Kubernetes时发生的各类错误时,请参考这部分内容。 8 | - 集群相关的故障排查:当集群系统的管理者发现Kubernetes的集群工作不正常时,请参考这部分内容。 9 | 10 | 用户也可以查看[已知问题列表](https://github.com/kubernetes/kubernetes/blob/master/docs/user-guide/known-issues.md)来了解当前所使用的版本中有哪些我们已经发现的系统问题。 11 | 12 | # 寻求帮助 13 | 14 | 如果以上的故障排查文档不能解决你所遇到的问题,还可以通过下面这几种方式寻求社区的帮助。 15 | 16 | ## 疑问 17 | 18 | 如果你对Kubernetes还不熟悉,文档的“用户指引”部分也许能帮助到你。 19 | 20 | 我们总结了一些用户经常遇到的问题,并分成下面几个方面记录下来了。 21 | 22 | - 日常使用的常见问题 23 | - 开发和调试的常见问题 24 | - 服务相关的常见问题 25 | 26 | 此外,在Stack Overflow网站上也有相关的主题通道可供提问和参考。 27 | 28 | - [Kubernetes相关的提问](http://stackoverflow.com/questions/tagged/kubernetes) 29 | - [谷歌容器引擎GKE相关的提问](http://stackoverflow.com/questions/tagged/google-container-engine) 30 | 31 | ## 更多的帮助内容 32 | 33 | 如果已经提到的这些途径还不足以解答你所遇到的问题,下面提供了其他的一些获取答案的途径。 34 | 35 | ### Stack Overflow 36 | 37 | 社区中的其他人也许遇到过和你相同的问题,Kubernetes的开发者小组会订阅并定期的解答Stack Overflow上[包含有kubernetes标签的提问](http://stackoverflow.com/questions/tagged/kubernetes)。如果所有的这些提问都没有包含你所遇到的问题,你可以通过[这个链接](http://stackoverflow.com/questions/ask?tags=kubernetes)把问题告诉我们。 38 | 39 | ### Slack 40 | 41 | Kubernetes开发小组的成员常常会出没在Slack的`#kubernetes-users`频道中,用户可以在这里直接将问题抛给第一线的开发者,并进行交流。Kubernetes的Slack开发者频道入口地址是[这里](https://kubernetes.slack.com/),第一次进入频道前,用户需要先到[这里](http://slack.kubernetes.io/)进行注册。我们欢迎倾听到各种不同的声音和问题。 42 | 43 | ### 邮件组 44 | 45 | 谷歌容器引擎小组有个专用的邮件群组,地址是:[google-containers@googlegroups.com](https://groups.google.com/forum/#!forum/google-containers) 46 | 47 | ### Bug和需求 48 | 49 | 如果你发现的问题看起来像是一个潜在的Bug,或者你希望为Kubernetes的开发提出一些需求,请直接提交到Kubernetes在GitHub的[问题追踪页面](https://github.com/kubernetes/kubernetes/issues)里。 50 | 51 | 需要注意的是,在你到这个页面提出任何问题之前,请先在页面中搜索一下,确认没有其他人已经提过类似的问题。 52 | 53 | 当提出Bug时,请务必包含以下信息,以便我们能够尽快的重现并定位故障: 54 | 55 | - Kubernetes的版本:`kubectl version`命令会告知你所需的信息 56 | - 运行的环境(云服务商名称),操作系统发行版类型和版本,网络配置以及所用容器(例如Docker)的版本 57 | - 重现故障的步骤 -------------------------------------------------------------------------------- /166-Applications.md: -------------------------------------------------------------------------------- 1 | # 应用程序相关的故障排查 2 | `译者:林帆` `校对:无` 3 | 4 | 5 | 这个小节将帮助读者调试部署在Kubernetes的应用程序运行不正常的情况。本篇并不会包含如何调试集群组建过程中出现错误的问题,这些内容在文档的下一节中进行介绍。 6 | 7 | ## 内容提要 8 | 9 | - 应用程序故障排查 10 | - 常见问题 11 | - 故障诊断 12 | - 排查Pods的故障 13 | - Pod始终处于Pending状态 14 | - Pod始终处于Waiting状态 15 | - Pod一直崩溃或运行不正常 16 | - Pod在运行但没有如预期工作 17 | - 排查Replication Controllers的故障 18 | - 排查Services的故障 19 | - 服务没有端点信息 20 | - 网络流量没有正确的转发 21 | - 其他问题 22 | 23 | ## 常见问题 24 | 25 | 一些经常被提到的问题都更新在Kubernetes项目GitHub的[常见问题](https://github.com/kubernetes/kubernetes/wiki/User-FAQ)页面。 26 | 27 | ## 故障诊断 28 | 29 | 故障排查的第一步是对故障进行分类。一般来说,应用程序的故障可以分为下面几个方面: 30 | 31 | - Pods的故障 32 | - ReplicationControllers的故障 33 | - Services的故障 34 | 35 | ### 排查Pods的故障 36 | 37 | 检查Pod的问题首先应该了解Pod所处的状况。下面这个命令能够获得Pod当前的状态和近期的事件列表: 38 | 39 | ``` 40 | $ kubectl describe pods ${POD_NAME} 41 | ``` 42 | 43 | 确认清楚在Pod以及其中每一个容器的状态,是否都处于`Runing`?通过观察容器的已运行时间判断它是否刚刚才重新启动过? 44 | 45 | 根据不同的运行状态,用户应该采取不同的调查措施。 46 | 47 | #### Pod始终处于Pending状态 48 | 49 | 如果Pod保持在`Pending`的状态,这意味着它无法被正常的调度到一个节点上。通常来说,这是由于某种系统资源无法满足Pod运行的需求。观察刚才`kubectl describe`命令的输出内容,其中应该包括了能够判断错误原因的消息。常见的原因有以下这些: 50 | 51 | - **系统没有足够的资源**:你也许已经用尽了集群中所有的CPU或内存资源。对于这种情况,你需要清理一些不在需要的Pod,调整它们所需的资源量,或者向集群中增加新的节点。在[计算资源文档](https://github.com/kubernetes/kubernetes/blob/master/docs/user-guide/compute-resources.md#my-pods-are-pending-with-event-message-failedscheduling)有更详细的说明。 52 | 53 | - **用户指定了`hostPort`**:通过`hostPort`用户能够将服务暴露到指定的主机端口上,但这样会限制Pod能够被调度运行的节点。在大多数情况下,`hostPort`配置都是没有必要的,用户应该采用Service的方式暴露其对外的服务。如果用户确实必须使用`hostPort`的功能,那么此Pod最多只能部署到和集群节点相同的数目。 54 | 55 | #### Pod始终处于Waiting状态 56 | 57 | Pod处在`Waiting`的状态,说明它已经被调度分配到了一个工作节点,然而它无法在那个节点上运行。同样的,在刚才`kubectl describe`命令的输出内容中,应该包含有更详细的错误信息。最经常导致Pod始终`Waiting`的原因是无法下载所需的镜像(译者注:由于国内特殊的网络环境,这类问题出现得特别普遍)。用户可以从下面三个方面进行排查: 58 | 59 | - 请确保正确书写了镜像的名称 60 | - 请检查所需镜像是否已经推送到了仓库中 61 | - 手工的在节点上运行一次`docker pull <镜像名称>`检测镜像能否被正确的拉取下来 62 | 63 | #### Pod一直崩溃或运行不正常 64 | 65 | 首先,查看正在运行容器的日志。 66 | 67 | ``` 68 | $ kubectl logs 69 | ``` 70 | 71 | 如果容器之前已经崩溃过,通过以下命令可以获得容器前一次运行的日志内容。 72 | 73 | ``` 74 | $ kubectl logs --previous 75 | ``` 76 | 77 | 此外,还可以使用`exec`命令在指定的容器中运行任意的调试命令。 78 | 79 | ``` 80 | $ kubectl exec -c -- <任意命令> <命令参数列表...> 81 | ``` 82 | 83 | 值得指出的是,对于只有一个容器的Pod情况,`-c `这个参数是可以省略的。 84 | 85 | 例如查看一个运行中的Cassandra日志文件内容,可以参考下面这个命令: 86 | 87 | ``` 88 | $ kubectl exec cassandra -- cat /var/log/cassandra/system.log 89 | ``` 90 | 91 | 要是上面的这些办法都不奏效,你也可以找到正在运行该Pod的主机地址,然后使用SSH登陆进去检测。但这是在确实迫不得已的情况下才会采用的措施,通常使用Kubernetes暴露的API应该足够获得所需的环境信息。因此,如果当你发现自己不得不登陆到主机上去获取必要的信息数据时,不妨到Kubernetes的GitHub页面中给我们提一个功能需求(Feature Request),在需求中附上详细的使用场景以及为什么当前Kubernetes所提供的工具不能够满足需要。 92 | 93 | #### Pod在运行但没有如预期工作 94 | 95 | 如果Pod没有按照预期的功能运行,有可能是由于在Pod描述文件中(例如你本地机器的`mypod.yaml`文件)存在一些错误,这些配置中的错误在Pod时创建并没有引起致命的故障。这些错误通常包括Pod描述的某些元素嵌套层级不正确,或是属性的名称书写有误(这些错误属性在运行时会被忽略掉)。举例来说,如果你把`command`属性误写为了`commnd`,Pod仍然会启动,但用户所期待运行的命令则不会被执行。 96 | 97 | 对于这种情况,首先应该尝试删掉正在运行的Pod,然后使用`--validate`参数重新运行一次。继续之前的例子,当执行`kubectl create --validate -f mypod.yaml`命令时,被误写为`commnd`的`command`指令会导致下面这样的错误: 98 | 99 | ``` 100 | I0805 10:43:25.129850 46757 schema.go:126] unknown field: commnd 101 | I0805 10:43:25.129973 46757 schema.go:129] this may be a false alarm, see https://github.com/kubernetes/kubernetes/issues/6842 102 | pods/mypod 103 | ``` 104 | 105 | 下一件事是检查当前apiserver运行Pod所使用的Pod描述文件内容是否与你想要创建的Pod内容(用户本地主机的那个yaml文件)一致。比如,执行`kubectl get pods/mypod -o yaml > mypod-on-apiserver.yaml`命令将正在运行的Pod描述文件内容导出来保存为`mypod-on-apiserver.yaml`,并将它和用户自己的Pod描述文件`mypod.yaml`进行对比。由于apiserver会尝试自动补全一些缺失的Pod属性,在apiserver导出的Pod描述文件中有可能比本地的Pod描述文件多出若干行,这是正常的,但反之如果本地的Pod描述文件比apiserver导出的Pod描述文件多出了新的内容,则很可能暗示着当前运行的Pod使用了不正确的内容。 106 | 107 | ### 排查Replication Controllers的故障 108 | 109 | Replication Controllers的逻辑十分直白,它的作用只是创建新的Pod副本,仅仅可能出现的错误便是它无法创建正确的Pod,对于这种情况,应该参考上面的『排查Pods的故障』部分进行检查。 110 | 111 | 也可以使用`kubectl describe rc <控制器名称>`来显示与指定Replication Controllers相关的事件信息。 112 | 113 | ### 排查Services的故障 114 | 115 | Service为一系列后端Pod提供负载均衡的功能。有些十分常见的故障都可能导致Service无法正常工作,以下将提供对调试Service相关问题的参考。 116 | 117 | 首先,检查Service连接的服务提供端点(endpoint),对于任意一个Service对象,apiserver都会为其创建一个端点资源(译者注:即提供服务的IP地址和端口号)。 118 | 119 | 这个命令可以查看到Service的端口资源: 120 | 121 | ``` 122 | $ kubectl get endpoints 123 | ``` 124 | 125 | 请检查这个命令输出端点信息中的端口号与实际容器提供服务的端口号是否一致。例如,如果你的Service使用了三个Nginx容器的副本(replicas),这个命令应该输出三个不同的IP地址的端点信息。 126 | 127 | #### 服务没有端点信息 128 | 129 | 如果刚刚的命令显示Service没有端点信息,请尝试通过Service的选择器找到具有相应标签的所有Pod。假设你的Service描述选择器内容如下: 130 | 131 | ``` 132 | ... 133 | spec: 134 | - selector: 135 | name: nginx 136 | type: frontend 137 | ``` 138 | 139 | 可以使用以下命令找出相应的Pod: 140 | 141 | ``` 142 | $ kubectl get pods --selector=name=nginx,type=frontend 143 | ``` 144 | 145 | 找到了符合标签的Pod后,首先确认这些被选中的Pod是正确,有无错选、漏选的情况。 146 | 147 | 如果被选中的Pod没有问题,则问题很可能出在这些Pod暴露的端口没有被正确的配置好。要是一个Service指定了`containerPort`,但被选中的Pod并没有在配置中列出相应的端口,它们就不会出现在端点列表中。 148 | 149 | 请确保所用Pod的`containerPort`与Service的`containerPort`配置信息是一致的。 150 | 151 | #### 网络流量没有正确的转发 152 | 153 | 如果你能够连接到Service,但每次连接上就立即被断开,同时Service的端点列表内容是正确的,很可能是因为Kubernetes的kube-proxy服务无法连接到相应的Pod。 154 | 155 | 请检查以下几个方面: 156 | 157 | - Pod是否在正常工作?从每个Pod的自动重启动次数可以作为有用的参考信息,前面介绍过的Pod错误排查也介绍了更详细的方法 158 | - 能够直接连接到Pod提供的服务端口上吗?不妨获取到Pod的IP地址,然后尝试直接连接它,以验证Pod本身十分运行正确。 159 | - 容器中的应用程序是否监听在Pod和Service中配置的那个端口?Kubernetes不会自动的映射端口号,因此如果应用程序监听在8080端口,务必保证Service和Pod的`containerPort`都配置为了8080。 160 | 161 | #### 其他问题 162 | 163 | 如果上述的这些步骤还不足以解答你所遇到的问题,也就是说你已经确认了相应的Service正在运行,并且具有恰当的端点资源,相应的Pod能够提供正确的服务,集群的DNS域名服务没有问题,IPtable的防火墙配置没有问题,kube-proxy服务也都运转正常。 164 | 165 | 请参看本文档故障排除部分的其他小节,以获取更加全面的故障处理信息。 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | -------------------------------------------------------------------------------- /167-Clusters.md: -------------------------------------------------------------------------------- 1 | # 集群相关的故障排查 2 | `译者:林帆` `校对:无` 3 | 4 | -------------------------------------------------------------------------------- /168-User_FAQ.md: -------------------------------------------------------------------------------- 1 | # 日常使用的常见问题 2 | `译者:林帆` `校对:无` 3 | 4 | -------------------------------------------------------------------------------- /169-Debugging_FAQ.md: -------------------------------------------------------------------------------- 1 | # 开发和调试的常见问题 2 | `译者:林帆` `校对:无` 3 | 4 | -------------------------------------------------------------------------------- /170-Services_FAQ.md: -------------------------------------------------------------------------------- 1 | # 服务相关的常见问题 2 | `译者:林帆` `校对:无` 3 | 4 | -------------------------------------------------------------------------------- /198-kubectl_annotate.md: -------------------------------------------------------------------------------- 1 | ## kubectl annotate 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 更新某个资源的注解 6 | 7 | ### 摘要 8 | 9 | 更新一个活多个资源的注解。 10 | 注解是一个键值对,它可以包含比label更多的信息,并且可能是机读数据。 11 | 注解用来存储那些辅助的,非区分性的信息,特别是那些为外部工具或系统扩展插件使用的数据。 12 | 如果--overwrite设为true,将会覆盖现有的注解,否则试图修改一个注解的值将会抛出错误。 13 | 如果设置了--resource-version,那么将会使用指定的这个版本,否则将使用当前版本。 14 | 15 | 支持的资源包括但不限于(大小写不限):pods (po)、services (svc)、 16 | replicationcontrollers (rc)、nodes (no)、events (ev)、componentstatuses (cs)、 17 | limitranges (limits)、persistentvolumes (pv)、persistentvolumeclaims (pvc)、 18 | resourcequotas (quota)和secrets。 19 | 20 | ``` 21 | kubectl annotate [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version] 22 | ``` 23 | 24 | ### 示例 25 | 26 | ``` 27 | # 更新pod “foo”,设置其注解description的值为my frontend。 28 | # 如果同一个注解被赋值了多次,只保存最后一次设置的值。 29 | $ kubectl annotate pods foo description='my frontend' 30 | 31 | # 更新“pod.json”文件中type和name字段指定的pod的注解。 32 | $ kubectl annotate -f pod.json description='my frontend' 33 | 34 | # 更新pod “foo”,设置其注解description的值为my frontend running nginx,已有的值将被覆盖。 35 | $ kubectl annotate --overwrite pods foo description='my frontend running nginx' 36 | 37 | # 更新同一namespace下所有的pod。 38 | $ kubectl annotate pods --all description='my frontend running nginx' 39 | 40 | # 仅当pod “foo”当前版本为1时,更新其注解 41 | $ kubectl annotate pods foo description='my frontend running nginx' --resource-version=1 42 | 43 | # 更新pod “foo”,删除其注解description。 44 | # 不需要--override选项。 45 | $ kubectl annotate pods foo description- 46 | ``` 47 | 48 | ### 选项 49 | 50 | ``` 51 | --all[=false]: 选择namespace中所有指定类型的资源。 52 | -f, --filename=[]: 用来指定待升级资源的文件名,目录名或者URL。 53 | --overwrite[=false]: 如果设置为true,允许覆盖更新注解,否则拒绝更新已存在的注解。 54 | --resource-version="": 如果不为空,仅当资源当前版本和指定版本相同时才能更新注解。仅当更新单个资源时有效。 55 | ``` 56 | 57 | ### 继承自父命令的选项 58 | ``` 59 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 60 | --api-version="": 和服务端交互使用的API版本。 61 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 62 | --client-certificate="": TLS使用的客户端证书路径。 63 | --client-key="": TLS使用的客户端密钥路径。 64 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 65 | --context="": 指定使用的kubeconfig配置文件中的环境名。 66 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 67 | --kubeconfig="": 命令行请求使用的配置文件路径。 68 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 69 | --log-dir="": 如果不为空,将日志文件写入此目录。 70 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 71 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 72 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 73 | --namespace="": 如果不为空,命令将使用此namespace。 74 | --password="": API Server进行简单认证使用的密码。 75 | -s, --server="": Kubernetes API Server的地址和端口号。 76 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 77 | --token="": 认证到API Server使用的令牌。 78 | --user="": 指定使用的kubeconfig配置文件中的用户名。 79 | --username="": API Server进行简单认证使用的用户名。 80 | --v=0: 指定输出日志的级别。 81 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 82 | ``` 83 | 84 | ### 参见 85 | 86 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 -------------------------------------------------------------------------------- /199-kubectl_apply.md: -------------------------------------------------------------------------------- 1 | ## kubectl apply 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 通过文件名或控制台输入,对资源进行配置。 6 | 7 | ### 摘要 8 | 9 | 10 | 通过文件名或控制台输入,对资源进行配置。 11 | 12 | 接受JSON和YAML格式的描述文件。 13 | 14 | ``` 15 | kubectl apply -f FILENAME 16 | ``` 17 | 18 | ### 示例 19 | 20 | ``` 21 | # 将pod.json中的配置应用到pod 22 | $ kubectl apply -f ./pod.json 23 | 24 | # 将控制台输入的JSON配置应用到Pod 25 | $ cat pod.json | kubectl apply -f - 26 | ``` 27 | 28 | ### 选项 29 | 30 | ``` 31 | -f, --filename=[]: 包含配置信息的文件名,目录名或者URL。 32 | -o, --output="": 输出格式,使用“-o name”来输出简短格式(资源类型/资源名)。 33 | --schema-cache-dir="/tmp/kubectl.schema": 如果不为空,将API schema缓存为指定文件,默认缓存到“/tmp/kubectl.schema”。 34 | --validate[=true]: 如果为true,在发送到服务端前先使用schema来验证输入。 35 | ``` 36 | 37 | ### 继承自父命令的选项 38 | ``` 39 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 40 | --api-version="": 和服务端交互使用的API版本。 41 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 42 | --client-certificate="": TLS使用的客户端证书路径。 43 | --client-key="": TLS使用的客户端密钥路径。 44 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 45 | --context="": 指定使用的kubeconfig配置文件中的环境名。 46 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 47 | --kubeconfig="": 命令行请求使用的配置文件路径。 48 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 49 | --log-dir="": 如果不为空,将日志文件写入此目录。 50 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 51 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 52 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 53 | --namespace="": 如果不为空,命令将使用此namespace。 54 | --password="": API Server进行简单认证使用的密码。 55 | -s, --server="": Kubernetes API Server的地址和端口号。 56 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 57 | --token="": 认证到API Server使用的令牌。 58 | --user="": 指定使用的kubeconfig配置文件中的用户名。 59 | --username="": API Server进行简单认证使用的用户名。 60 | --v=0: 指定输出日志的级别。 61 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 62 | ``` 63 | 64 | ### 参见 65 | 66 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 -------------------------------------------------------------------------------- /200-kubectl_attach.md: -------------------------------------------------------------------------------- 1 | ## kubectl attach 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 连接到一个正在运行的容器。 6 | 7 | ### 摘要 8 | 9 | 连接到现有容器中一个正在运行的进程。 10 | 11 | ``` 12 | kubectl attach POD -c CONTAINER 13 | ``` 14 | 15 | ### 示例 16 | 17 | ``` 18 | # 获取正在运行中的pod 123456-7890的输出,默认连接到第一个容器 19 | $ kubectl attach 123456-7890 20 | 21 | # 获取pod 123456-7890中ruby-container的输出 22 | $ kubectl attach 123456-7890 -c ruby-container date 23 | 24 | # 切换到终端模式,将控制台输入发送到pod 123456-7890的ruby-container的“bash”命令,并将其输出到控制台/ 25 | # 错误控制台的信息发送回客户端。 26 | $ kubectl attach 123456-7890 -c ruby-container -i -t 27 | ``` 28 | 29 | ### 选项 30 | 31 | ``` 32 | -c, --container="": 容器名。 33 | -i, --stdin[=false]: 将控制台输入发送到容器。 34 | -t, --tty[=false]: 将标准输入控制台作为容器的控制台输入。 35 | ``` 36 | 37 | ### 继承自父命令的选项 38 | ``` 39 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 40 | --api-version="": 和服务端交互使用的API版本。 41 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 42 | --client-certificate="": TLS使用的客户端证书路径。 43 | --client-key="": TLS使用的客户端密钥路径。 44 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 45 | --context="": 指定使用的kubeconfig配置文件中的环境名。 46 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 47 | --kubeconfig="": 命令行请求使用的配置文件路径。 48 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 49 | --log-dir="": 如果不为空,将日志文件写入此目录。 50 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 51 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 52 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 53 | --namespace="": 如果不为空,命令将使用此namespace。 54 | --password="": API Server进行简单认证使用的密码。 55 | -s, --server="": Kubernetes API Server的地址和端口号。 56 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 57 | --token="": 认证到API Server使用的令牌。 58 | --user="": 指定使用的kubeconfig配置文件中的用户名。 59 | --username="": API Server进行简单认证使用的用户名。 60 | --v=0: 指定输出日志的级别。 61 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 62 | ``` 63 | 64 | ### 参见 65 | 66 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 -------------------------------------------------------------------------------- /201-kubectl_edit.md: -------------------------------------------------------------------------------- 1 | ## kubectl edit 2 | `译者:hurf` `校对:无` 3 | 4 | 5 | 编辑服务端的资源。 6 | 7 | ### 摘要 8 | 9 | 使用系统默认编辑器编辑服务端的资源。 10 | 11 | edit命令允许你直接编辑使用命令行工具获取的任何资源。此命令将打开你通过KUBE_EDITOR,GIT_EDITOR 12 | 或者EDITOR环境变量定义的编辑器,或者直接使用“vi”。你可以同时编辑多个资源,但所有的变更都只会一次性 13 | 提交。除了命令行参数外,此命令也接受文件名,但所直指定的文件必须使用早于当前的资源版本。 14 | 15 | 所编辑的文件将使用默认的API版本输出,或者通过--output-version选项显式指定。默认的输出格式是YAML, 16 | 如果你需要使用JSON格式编辑,使用-o json选项。 17 | 18 | 如果当更新资源的时候出现错误,将会在磁盘上创建一个临时文件,记录未成功的更新。更新资源时最常见的错误 19 | 是其他人也在更新服务端的资源。当这种情况发生时,你需要将你所作的更改应用到最新版本的资源上,或者编辑 20 | 保存的临时文件,使用最新的资源版本。 21 | 22 | ``` 23 | kubectl edit (RESOURCE/NAME | -f FILENAME) 24 | ``` 25 | 26 | ### 示例 27 | 28 | ``` 29 | # 编辑名为“docker-registry”的service 30 | $ kubectl edit svc/docker-registry 31 | 32 | # 使用一个不同的编辑器 33 | $ KUBE_EDITOR="nano" kubectl edit svc/docker-registry 34 | 35 | # 编辑名为“docker-registry”的service,使用JSON格式、v1 API版本 36 | $ kubectl edit svc/docker-registry --output-version=v1 -o json 37 | ``` 38 | 39 | ### 选项 40 | 41 | ``` 42 | -f, --filename=[]: 用来指定待编辑资源的文件名,目录名或者URL。 43 | -o, --output="yaml": 输出格式,可选yaml或者json中的一种。 44 | --output-version="": 输出资源使用的API版本(默认使用api-version)。 45 | ``` 46 | 47 | ### 继承自父命令的选项 48 | ``` 49 | --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 50 | --api-version="": 和服务端交互使用的API版本。 51 | --certificate-authority="": 用以进行认证授权的.cert文件路径。 52 | --client-certificate="": TLS使用的客户端证书路径。 53 | --client-key="": TLS使用的客户端密钥路径。 54 | --cluster="": 指定使用的kubeconfig配置文件中的集群名。 55 | --context="": 指定使用的kubeconfig配置文件中的环境名。 56 | --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 57 | --kubeconfig="": 命令行请求使用的配置文件路径。 58 | --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 59 | --log-dir="": 如果不为空,将日志文件写入此目录。 60 | --log-flush-frequency=5s: 刷新日志的最大时间间隔。 61 | --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 62 | --match-server-version[=false]: 要求服务端和客户端版本匹配。 63 | --namespace="": 如果不为空,命令将使用此namespace。 64 | --password="": API Server进行简单认证使用的密码。 65 | -s, --server="": Kubernetes API Server的地址和端口号。 66 | --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 67 | --token="": 认证到API Server使用的令牌。 68 | --user="": 指定使用的kubeconfig配置文件中的用户名。 69 | --username="": API Server进行简单认证使用的用户名。 70 | --v=0: 指定输出日志的级别。 71 | --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。 72 | ``` 73 | 74 | ### 参见 75 | 76 | * [kubectl](kubectl.md) - 使用kubectl来管理Kubernetes集群。 -------------------------------------------------------------------------------- /Fingerpost.txt: -------------------------------------------------------------------------------- 1 | # DockOne 文章排版指南 2 | 3 | ## 1.文章排版 4 | 5 | ### 1.1 正确排版如下: 6 | 7 | #### Docker 公司首席布道师谈容器和下一代虚拟化 8 | 9 | 【编者的话】本文为LinuxCon 讲师采访的一部分,Docker 公司的Jerome 分享了Docker 与其它容器技术的区别、Docker 容器的存储和数据迁移、Docker 在企业中的应用等话题。(编者的话主要概括总结文章大意,方便读者阅读)。 10 | 11 | Jerome 是Docker 公司的首席布道师,也是老员工。对社区运营和容器非常了解。本文根据对他的采访整理而成。 12 | 13 | 在这次的访谈中,Jerome 深入分析了Docker 并解释了如何管理Docker 容器的存储,以及如何随着Docker 容器迁移数据。 14 | 15 | __原文链接:Docker containers and the next generation of virtualization (翻译:译者姓名)__ 16 | 17 | ---- 18 | 19 | **译者介绍** 20 | 21 | 译者姓名,北京理工大学计算机学院在读博士,研究方向是自然语言处理在企业网络信誉评价方面的应用,平时也乐于去实现一些突发的想法。 22 | 23 | ## 2.标点符号 24 | 25 | ### 2.1 不重复使用标点符号 26 | 27 | #### 正确: 28 | 29 | - 德国队竟然战胜了巴西队! 30 | - 她竟然对你说“喵”?! 31 | 32 | #### 错误: 33 | 34 | - 德国队竟然战胜了巴西队!! 35 | - 德国队竟然战胜了巴西队!!!! 36 | - 德国队竟然战胜了巴西队!!!!!!!! 37 | - 她竟然对你说“喵”??!! 38 | - 她竟然对你说“喵”?!?!??!! 39 | 40 | ### 2.2 使用全形中文标点 41 | 42 | #### 正确: 43 | 44 | - 嗨!你知道嘛?今天前台的小妹跟我说“喵”了哎! 45 | - 核磁共振成像(NMRI)是什么原理都不知道?JFGI! 46 | 47 | #### 错误: 48 | 49 | - 嗨! 你知道嘛? 今天前台的小妹跟我说"喵" 了哎! 50 | - 嗨!你知道嘛?今天前台的小妹跟我说"喵"了哎! 51 | - 核磁共振成像(NMRI) 是什么原理都不知道? JFGI! 52 | - 核磁共振成像(NMRI)是什么原理都不知道?JFGI! 53 | 54 | #### 注意: 55 | 56 | 对于拿不准的词组或者觉得读者可能会有疑问的翻译,请在中文后面的括号里加上英文原词组。第一次使用括号之后,后文无需再使用括号。注意:括号请使用中文的标点符号。 57 | 58 | ### 2.3 数字使用半角字符 59 | 60 | #### 正确: 61 | 62 | - 这件蛋糕只卖1000 元。 63 | 64 | #### 错误: 65 | 66 | - 这件蛋糕只卖1000元。 67 | 68 | ### 2.4 英文前后不加空格 69 | 70 | #### 正确: 71 | 72 | - 我是DockOne社区的译者,我喜欢Docker和Kubernetes。 73 | 74 | #### 错误: 75 | 76 | - 我是DockOne 社区的译者,我喜欢Docker 和 Kubernetes。 77 | 78 | #### 2.5 遇到完整的英文整句、特殊名词,其内容使用半角标点 79 | 80 | #### 正确: 81 | 82 | - 乔帮主那句话是怎么说的?“Stay hungry, stay foolish.”。 83 | - 推荐你阅读『Hackers & Painters: Big Ideas from the Computer Age』,非常的有趣。 84 | 85 | #### 错误: 86 | 87 | - 乔帮主那句话是怎么说的?“Stay hungry,stay foolish。”。 88 | - 推荐你阅读『Hackers&Painters:Big Ideas from the Computer Age』,非常的有趣。 89 | 90 | ## 3.大小写 91 | 92 | ### 3.1 专有名词使用正确的大小写 93 | 94 | #### 正确: 95 | 96 | - 使用GitHub 登录 97 | - 我们的客户有GitHub、Foursquare、Microsoft Corporation、Google、Facebook, Inc.。 98 | 99 | #### 错误: 100 | 101 | - 使用github 登录 102 | - 使用GITHUB 登录 103 | - 使用Github 登录 104 | - 使用gitHub 登录 105 | - 我们的客户有github、foursquare、microsoft corporation、google、facebook, inc.。 106 | - 我们的客户有GITHUB、FOURSQUARE、MICROSOFT CORPORATION、GOOGLE、FACEBOOK, INC.。 107 | - 我们的客户有Github、FourSquare、MicroSoft Corporation、Google、FaceBook, Inc.。 108 | 109 | #### 注意: 110 | 111 | 默认状态下,技术名称、产品名称的首字母大写,如Java,Web 等。如该技术术语有自己的默认大小写状态,如HTML5、.NET、IntelliJ IDEA 等,请确保译文中的大小写与其一致。 112 | -------------------------------------------------------------------------------- /Hazelcast: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/Hazelcast -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Kubernetes中文文档 2 | ======= 3 | 4 | Kubernetes文档的中文译本。 5 | 6 | 由DockOne社区组织翻译。 7 | 8 | # 版本 1.1 9 | 10 | --- 11 | - 原始文档链接:http://kubernetes.io/v1.1/index.html 12 | - 最新文档GitHub目录:https://github.com/kubernetes/kubernetes/tree/master/docs 13 | 14 | ![Kubernetes文档](images/Cover.png) 15 | -------------------------------------------------------------------------------- /book.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Kubernetes中文文档", 3 | "description": "Kubernetes文档的中文译本,由DockOne社区组织翻译。", 4 | "language": "zh", 5 | "plugins": ["splitter"] 6 | } 7 | -------------------------------------------------------------------------------- /images/27gf-counter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/images/27gf-counter.png -------------------------------------------------------------------------------- /images/Cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/images/Cover.png -------------------------------------------------------------------------------- /images/all-lines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/images/all-lines.png -------------------------------------------------------------------------------- /images/bigquery-logging.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/images/bigquery-logging.png -------------------------------------------------------------------------------- /images/cloud-logging-console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/images/cloud-logging-console.png -------------------------------------------------------------------------------- /images/cloud-logging.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/images/cloud-logging.png -------------------------------------------------------------------------------- /images/diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/images/diagram.png -------------------------------------------------------------------------------- /images/k8s-singlenode-docker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/images/k8s-singlenode-docker.png -------------------------------------------------------------------------------- /k8s-ui-explore-filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/k8s-ui-explore-filter.png -------------------------------------------------------------------------------- /k8s-ui-explore-groupby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/k8s-ui-explore-groupby.png -------------------------------------------------------------------------------- /k8s-ui-explore-poddetail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/k8s-ui-explore-poddetail.png -------------------------------------------------------------------------------- /k8s-ui-explore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/k8s-ui-explore.png -------------------------------------------------------------------------------- /k8s-ui-nodes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/k8s-ui-nodes.png -------------------------------------------------------------------------------- /k8s-ui-overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linfan/kubernetes-chinese-docs/d1685abd5ce830e918a6cde337d825e73d6c0c4c/k8s-ui-overview.png --------------------------------------------------------------------------------