diff --git a/content/zh/docs/getting-started-guides/ubuntu/installation.md b/content/zh/docs/getting-started-guides/ubuntu/installation.md new file mode 100644 index 0000000000..5a936be690 --- /dev/null +++ b/content/zh/docs/getting-started-guides/ubuntu/installation.md @@ -0,0 +1,542 @@ +--- +reviewers: +- caesarxuchao +- erictune +title: 用 Juju 搭建 Kubernetes +content_template: templates/task +--- + + + + + +{% capture overview %} +Ubuntu 16.04 已公开 [Kubernetes 的 Canonical 发行版 ](https://www.ubuntu.com/cloud/kubernetes), 一套为生产环境设计的 Kubernetes 上游版本。本文将为您演示如何部署集群。 +{% endcapture %} + + + +{{% capture prerequisites %}} +- 一个可用的 [Juju 客户端](https://jujucharms.com/docs/2.3/reference-install);不一定要是 Linux 机器,也可以是 Windows 或 OSX。 +- 一个[受支持的云](#cloud-compatibility)。 + - 裸机部署可以通过 [MAAS](http://maas.io) 实现。 配置指南参见 [MAAS 文档](http://maas.io/docs/)。 + - OpenStack 部署目前只在 Icehouse 及更新版本上测试通过。 +- 下面任一一种选项: + - 可以网络访问以下站点 + - *.jujucharms.com + - gcr.io + - github.com + - 访问 Ubuntu 镜像源(公共的或私有的) + - 通过[这些](https://github.com/juju-solutions/bundle-canonical-kubernetes/wiki/Running-CDK-in-a-restricted-environment)步骤准备好离线部署。 +{{% /capture %}} + + + +{{% capture steps %}} +## 部署概述 + +开箱即用的部署由以下组件构成,部署在 9 台机器上: + +- Kubernetes (自动化部署,运营及伸缩) + - 具有一个主节点和三个工作节点的四节点 Kubernetes 集群。 + - 使用 TLS 实现组件间的安全通信。 + - Flannel 软件定义网络 (SDN) 插件 + - 一个负载均衡器以实现 kubernetes-master 的高可用 (实验阶段) + - 可选的 Ingress 控制器(在工作节点上) + - 可选的 Dashboard 插件(在主节点上),包含实现集群监控的 Heapster 插件 +- EasyRSA + - 扮演证书授权机构的角色,向集群中的组件提供自签名证书 +- ETCD (分布式键值存储) + - 三节点的集群达到高可靠性。 + + + +Juju Kubernetes 工作由 Canonical Ltd(https://www.canonical.com/) 的 Big Software 团队整理,欢迎对我们的工作给出反馈意见。 +如果发现任何问题,请提交相应的 [Issue 到跟踪系统](https://github.com/juju-solutions/bundle-canonical-kubernetes),以便我们解决。 + + + +## 支持级别 + +IaaS 提供商 | 配置管理 | 系统 | 网络 | 文档 | 符合 | 支持级别 +-------------------- | ------------ | ------ | ---------- | --------------------------------------------- | ---------| ---------------------------- +Amazon Web Services (AWS) | Juju | Ubuntu | flannel, calico* | [docs](/docs/getting-started-guides/ubuntu) | | [Commercial](https://ubuntu.com/cloud/kubernetes), [Community](https://github.com/juju-solutions/bundle-kubernetes-core) +OpenStack | Juju | Ubuntu | flannel, calico | [docs](/docs/getting-started-guides/ubuntu) | | [Commercial](https://ubuntu.com/cloud/kubernetes), [Community](https://github.com/juju-solutions/bundle-kubernetes-core) +Microsoft Azure | Juju | Ubuntu | flannel | [docs](/docs/getting-started-guides/ubuntu) | | [Commercial](https://ubuntu.com/cloud/kubernetes), [Community](https://github.com/juju-solutions/bundle-kubernetes-core) +Google Compute Engine (GCE) | Juju | Ubuntu | flannel, calico | [docs](/docs/getting-started-guides/ubuntu) | | [Commercial](https://ubuntu.com/cloud/kubernetes), [Community](https://github.com/juju-solutions/bundle-kubernetes-core) +Joyent | Juju | Ubuntu | flannel | [docs](/docs/getting-started-guides/ubuntu) | | [Commercial](https://ubuntu.com/cloud/kubernetes), [Community](https://github.com/juju-solutions/bundle-kubernetes-core) +Rackspace | Juju | Ubuntu | flannel | [docs](/docs/getting-started-guides/ubuntu) | | [Commercial](https://ubuntu.com/cloud/kubernetes), [Community](https://github.com/juju-solutions/bundle-kubernetes-core) +VMWare vSphere | Juju | Ubuntu | flannel, calico | [docs](/docs/getting-started-guides/ubuntu) | | [Commercial](https://ubuntu.com/cloud/kubernetes), [Community](https://github.com/juju-solutions/bundle-kubernetes-core) +Bare Metal (MAAS) | Juju | Ubuntu | flannel, calico | [docs](/docs/getting-started-guides/ubuntu) | | [Commercial](https://ubuntu.com/cloud/kubernetes), [Community](https://github.com/juju-solutions/bundle-kubernetes-core) + + + + +有关所有解决方案的支持级别信息,请参见[解决方案表](/docs/getting-started-guides/#table-of-solutions)。 + +## 安装选项 + +可以通过下面任一一种方式启动集群:[conjure-up](#conjure-up) or [juju 部署](#juju-deploy)。Conjure-up 只是一个对 juju 的简易封装,简化了安装的过程。正因为如此,这也是推荐的安装方法。 + +可以在 [众多不同的公有云](#cloud-compatibility),私有 OpenStack 云,或者是原始的裸机集群上部署集群软件。通过 [MAAS](http://maas.io) 实现裸机部署。 + +## Conjure-up + +通过 conjure-up 来安装 Kubernetes, 只需要运行下面的命令,然后根据提示做选择: + +``` +sudo snap install conjure-up --classic +conjure-up kubernetes +``` + +## Juju 部署 + +### 配置 Juju 使用您的云提供商 + +确定所要部署的云之后,按照[云安装界面](https://jujucharms.com/docs/devel/getting-started)来配置、部署到该云。 + +加载[云凭证](https://jujucharms.com/docs/2.3/credentials)来选择、使用相应的云。 + + + +在本例中 + +``` +juju add-credential aws +credential name: my_credentials +select auth-type [userpass, oauth, etc]: userpass +enter username: jorge +enter password: ******* +``` + +也可以通过 `juju autoload-credentials` 命令自动加载常用的云凭证,该命令将自动从每个云的默认文件和环境变量中导入凭据信息。 + + + +接下来,我们需要启动一个控制器来管理集群。您需要确定所要启动的云,地区以及控制器节点的名字: + +``` +juju update-clouds # 这个命令可以确保客户端上所有最新的区域是最新的 +juju bootstrap aws/us-east-2 +``` +或者,另外一个例子,这次是在 Azure 上: + +``` +juju bootstrap azure/westus2 +``` + + + +如果您看到下面的错误信息,很可能默认的 Azure VM (Standard D1 v2 [1 vcpu, 3.5 GB memory]) 并不在当前的 Azure 地区。 +``` +ERROR failed to bootstrap model: instance provisioning failed (Failed) +``` + + + + +您需要为部署到的每个云或区域分配一个控制器节点。更多信息参见[控制器文档](https://jujucharms.com/docs/2.3/controllers)。 + +请注意,每个控制器可以在给定的云或区域中管理多个 Kubernetes 集群。 + + + +## 启动 Kubernetes 集群 + +以下命令将部署 9-节点的初始集群。执行速度取决于您所要部署到的云的性能: + +``` +juju deploy canonical-kubernetes +``` + +执行完此命令后,云将启动实例并开始部署过程。 + + + +## 监控部署 + +`juju status` 命令提供集群中每个单元的信息。`watch -c juju status --color` 命令可以获取集群部署的实时状态。 +当所有的状态是绿色并且“空闲”时,表示集群处于待用状态: + + juju status + +输出结果: + +``` +Model Controller Cloud/Region Version SLA +conjure-canonical-kubern-f48 conjure-up-aws-650 aws/us-east-2 2.3.2 unsupported + +App Version Status Scale Charm Store Rev OS Notes +easyrsa 3.0.1 active 1 easyrsa jujucharms 27 ubuntu +etcd 2.3.8 active 3 etcd jujucharms 63 ubuntu +flannel 0.9.1 active 4 flannel jujucharms 40 ubuntu +kubeapi-load-balancer 1.10.3 active 1 kubeapi-load-balancer jujucharms 43 ubuntu exposed +kubernetes-master 1.9.3 active 1 kubernetes-master jujucharms 13 ubuntu +kubernetes-worker 1.9.3 active 3 kubernetes-worker jujucharms 81 ubuntu exposed + +Unit Workload Agent Machine Public address Ports Message +easyrsa/0* active idle 3 18.219.190.99 Certificate Authority connected. +etcd/0 active idle 5 18.219.56.23 2379/tcp Healthy with 3 known peers +etcd/1* active idle 0 18.219.212.151 2379/tcp Healthy with 3 known peers +etcd/2 active idle 6 13.59.240.210 2379/tcp Healthy with 3 known peers +kubeapi-load-balancer/0* active idle 1 18.222.61.65 443/tcp Loadbalancer ready. +kubernetes-master/0* active idle 4 18.219.105.220 6443/tcp Kubernetes master running. + flannel/3 active idle 18.219.105.220 Flannel subnet 10.1.78.1/24 +kubernetes-worker/0 active idle 2 18.219.221.98 80/tcp,443/tcp Kubernetes worker running. + flannel/1 active idle 18.219.221.98 Flannel subnet 10.1.38.1/24 +kubernetes-worker/1* active idle 7 18.219.249.103 80/tcp,443/tcp Kubernetes worker running. + flannel/2 active idle 18.219.249.103 Flannel subnet 10.1.68.1/24 +kubernetes-worker/2 active idle 8 52.15.89.16 80/tcp,443/tcp Kubernetes worker running. + flannel/0* active idle 52.15.89.16 Flannel subnet 10.1.73.1/24 + +Machine State DNS Inst id Series AZ Message +0 started 18.219.212.151 i-065eab4eabc691b25 xenial us-east-2a running +1 started 18.222.61.65 i-0b332955f028d6281 xenial us-east-2b running +2 started 18.219.221.98 i-0879ef1ed95b569bc xenial us-east-2a running +3 started 18.219.190.99 i-08a7b364fc008fc85 xenial us-east-2c running +4 started 18.219.105.220 i-0f92d3420b01085af xenial us-east-2a running +5 started 18.219.56.23 i-0271f6448cebae352 xenial us-east-2c running +6 started 13.59.240.210 i-0789ef5837e0669b3 xenial us-east-2b running +7 started 18.219.249.103 i-02f110b0ab042f7ac xenial us-east-2b running +8 started 52.15.89.16 i-086852bf1bee63d4e xenial us-east-2c running + +Relation provider Requirer Interface Type Message +easyrsa:client etcd:certificates tls-certificates regular +easyrsa:client kubeapi-load-balancer:certificates tls-certificates regular +easyrsa:client kubernetes-master:certificates tls-certificates regular +easyrsa:client kubernetes-worker:certificates tls-certificates regular +etcd:cluster etcd:cluster etcd peer +etcd:db flannel:etcd etcd regular +etcd:db kubernetes-master:etcd etcd regular +kubeapi-load-balancer:loadbalancer kubernetes-master:loadbalancer public-address regular +kubeapi-load-balancer:website kubernetes-worker:kube-api-endpoint http regular +kubernetes-master:cni flannel:cni kubernetes-cni subordinate +kubernetes-master:kube-api-endpoint kubeapi-load-balancer:apiserver http regular +kubernetes-master:kube-control kubernetes-worker:kube-control kube-control regular +kubernetes-worker:cni flannel:cni kubernetes-cni subordinate +``` + + + +## 与集群的交互 + +部署完集群后,您可以在任意一个 kubernetes-master 或 kubernetes-worker 节点取得集群的控制权。 + +如果您没有使用 conjure-up,那么您需要先将凭据和客户端程序下载到本地工作站上: + +创建 kubectl 配置信息目录。 + +``` +mkdir -p ~/.kube +``` + +将 kubeconfig 文件复制到默认位置。 + +``` +juju scp kubernetes-master/0:config ~/.kube/config +``` + + + +下一步是在本地机器上安装 kubectl 客户端。在 Ubuntu 上推荐的安装方式是使用 kubectl snap ([https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-with-snap-on-ubuntu](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-with-snap-on-ubuntu))。 + +可以运行下面的命令便可以控制 kubernetes 集群了: + +``` +sudo snap install kubectl --classic +``` + +这条命令会安装和部署 kubectl 程序。安装完成后,您可能需要重启命令窗口(因为 $PATH 已经被更新)。 + + + +查询集群: + kubectl cluster-info + +输出结果: + +``` +Kubernetes master is running at https://52.15.104.227:443 +Heapster is running at https://52.15.104.227:443/api/v1/namespaces/kube-system/services/heapster/proxy +KubeDNS is running at https://52.15.104.227:443/api/v1/namespaces/kube-system/services/kube-dns/proxy +Grafana is running at https://52.15.104.227:443/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy +InfluxDB is running at https://52.15.104.227:443/api/v1/namespaces/kube-system/services/monitoring-influxdb/proxy +``` + + + +## 为集群垂直扩容 + +需要更大的 Kubernetes 节点?通过使用 Juju 的**约束**,您可以轻松地请求到不同大小的云资源。 +通过 Juju 请求创建的任意系统,您都可以为它们增加 CPU 和内存(RAM)。 +这使您可以对 Kubernetes 集群进行调优以适应工作负载。 +藉由 bootstrap 命令的参数或使用独立的 `juju constraints` 命令都可以做到这点。详情参见[和机器相关的 Juju 文档](https://jujucharms.com/docs/2.3/charms-constraints) + + + +## 为集群集群水平扩容 + +需要更多的工作节点?只需添加一些 unit: + +```shell +juju add-unit kubernetes-worker +``` + +或者一次添加多个: + +```shell +juju add-unit -n3 kubernetes-worker +``` +您也可以为特定实例类型或者特定机器的设置约束。更多信息请参见[约束文档](https://jujucharms.com/docs/stable/reference-constraints)。 +接下来举一些例子。请注意,诸如 `cores` 和 `mem` 这样的通用约束在各云之间的可移植性是比较高的。 +在本例中,我们从 AWS 申请一个特定的实例类型: + +```shell +juju set-constraints kubernetes-worker instance-type=c4.large +juju add-unit kubernetes-worker +``` + +为提升键值存储的容错能力,您也可以扩展 etcd charm: + +```shell +juju add-unit -n3 etcd +``` + +强烈建议运行奇数个 unit 以支持法定人数票选。 + + + +## 销毁集群 + +如果您是使用 conjure-up 创建的集群,通过 `conjure-down` 便可以完成销毁过程。 +如果是直接使用的 juju,你可以通过销毁 juju 模型或控制器来销毁集群。 +使用 `juju switch` 命令获取当前控制器的名字: + +```shell +juju switch +juju destroy-controller $controllername --destroy-all-models +``` + +这将关闭并终止该云上所有正在运行的实例。 +{{% /capture %}} + +{{% capture discussion %}} + + + +{{% capture discussion %}} +## 更多信息 + +Ubuntu Kubernetes 的部署通过名为 charms 的开源运维工具实现,这类工具也称作运维即代码(Operations as Code)。 +这些 charms 以层的方式组装,从而使代码更小,更专注于 Kubernetes 及其组件的操作。 + +Kubernetes 的层和 Bundle 可以在 github.com 的 `kubernetes` 项目中找到: + +- [Bundle 的地址](https://git.k8s.io/kubernetes/cluster/juju/bundles) +- [Kubernetes charm 层的地址](https://git.k8s.io/kubernetes/cluster/juju/layers) +- [Canonical Kubernetes 主页](https://jujucharms.com/kubernetes) +- [主要的 issue tracker](https://github.com/juju-solutions/bundle-canonical-kubernetes) + +欢迎提供功能需求,错误报告,pull request和反馈意见。 +{{% /capture %}}