* `http://kubernetes.io/docs/` -> `/docs/` * `https://kubernetes.io/docs/` -> `/docs/`
28 KiB
reviewers, title, content_template
| reviewers | title | content_template | ||
|---|---|---|---|---|
|
用 Juju 搭建 Kubernetes | templates/task |
{% capture overview %} Ubuntu 16.04 已公开 Kubernetes 的 Canonical 发行版 , 一套为生产环境设计的 Kubernetes 上游版本。本文将为您演示如何部署集群。 {% endcapture %}
{{% capture prerequisites %}}
- 一个可用的 Juju 客户端;不一定要是 Linux 机器,也可以是 Windows 或 OSX。
- 一个受支持的云。
- 下面任一一种选项:
- 可以网络访问以下站点
- *.jujucharms.com
- gcr.io
- github.com
- 访问 Ubuntu 镜像源(公共的或私有的)
- 通过这些步骤准备好离线部署。 {{% /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 到跟踪系统,以便我们解决。
支持级别
| IaaS 提供商 | 配置管理 | 系统 | 网络 | 文档 | 符合 | 支持级别 |
|---|---|---|---|---|---|---|
| Amazon Web Services (AWS) | Juju | Ubuntu | flannel, calico* | docs | Commercial, Community | |
| OpenStack | Juju | Ubuntu | flannel, calico | docs | Commercial, Community | |
| Microsoft Azure | Juju | Ubuntu | flannel | docs | Commercial, Community | |
| Google Compute Engine (GCE) | Juju | Ubuntu | flannel, calico | docs | Commercial, Community | |
| Joyent | Juju | Ubuntu | flannel | docs | Commercial, Community | |
| Rackspace | Juju | Ubuntu | flannel | docs | Commercial, Community | |
| VMWare vSphere | Juju | Ubuntu | flannel, calico | docs | Commercial, Community | |
| Bare Metal (MAAS) | Juju | Ubuntu | flannel, calico | docs | Commercial, Community |
有关所有解决方案的支持级别信息,请参见解决方案表。
安装选项
可以通过下面任一一种方式启动集群:conjure-up or juju 部署。Conjure-up 只是一个对 juju 的简易封装,简化了安装的过程。正因为如此,这也是推荐的安装方法。
可以在 众多不同的公有云,私有 OpenStack 云,或者是原始的裸机集群上部署集群软件。通过 MAAS 实现裸机部署。
Conjure-up
通过 conjure-up 来安装 Kubernetes, 只需要运行下面的命令,然后根据提示做选择:
sudo snap install conjure-up --classic
conjure-up kubernetes
Juju 部署
配置 Juju 使用您的云提供商
确定所要部署的云之后,按照云安装界面来配置、部署到该云。
加载云凭证来选择、使用相应的云。
在本例中
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)
您需要为部署到的每个云或区域分配一个控制器节点。更多信息参见控制器文档。
请注意,每个控制器可以在给定的云或区域中管理多个 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 (/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 文档
为集群集群水平扩容
需要更多的工作节点?只需添加一些 unit:
juju add-unit kubernetes-worker
或者一次添加多个:
juju add-unit -n3 kubernetes-worker
您也可以为特定实例类型或者特定机器的设置约束。更多信息请参见约束文档。
接下来举一些例子。请注意,诸如 cores 和 mem 这样的通用约束在各云之间的可移植性是比较高的。
在本例中,我们从 AWS 申请一个特定的实例类型:
juju set-constraints kubernetes-worker instance-type=c4.large
juju add-unit kubernetes-worker
为提升键值存储的容错能力,您也可以扩展 etcd charm:
juju add-unit -n3 etcd
强烈建议运行奇数个 unit 以支持法定人数票选。
销毁集群
如果您是使用 conjure-up 创建的集群,通过 conjure-down 便可以完成销毁过程。
如果是直接使用的 juju,你可以通过销毁 juju 模型或控制器来销毁集群。
使用 juju switch 命令获取当前控制器的名字:
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 项目中找到:
欢迎提供功能需求,错误报告,pull request和反馈意见。 {{% /capture %}}