--- title: 运维注意事项 content_template: templates/task --- {{% capture overview %}} 本文为管理维护长期运行的集群的工程师提供一些建议和提示。 {{% /capture %}} {{% capture prerequisites %}} 本文假定您对 Juju 和 Kubernetes 已经有了基本的了解。 {{% /capture %}} {{% capture steps %}} ## 管理 Juju ### 确定控制节点规模 Juju 控制器: * 运行需要大概 2 到 2.5 GB 的 RAM。 * 用 MongoDB 数据库作为集群配置和状态的存储后端。这个数据库可能增长很快,也可能是实例中 CPU 周期的最大消费者。 * 汇总和存储所有服务和单位的日志数据。因此,长期运行的模型需要大量的存储。如果您的目的是保持集群运行,请确保为日志配置至少 64 GB 的存储空间。 指定参数创建一个控制器(命令行如下): ``` juju bootstrap --constraints "mem=8GB cpu-cores=4 root-disk=128G" ``` Juju 将会选择与目标云上的约束匹配的最便宜的实例类型。 还可以通过将 ```instance-type``` 与 ```root-disk``` 两个约束结合使用来进行严格控制。 对于可用的约束信息,请参阅 [官方文档](https://jujucharms.com/docs/stable/reference-constraints) 关于日志记录的更多信息,请参阅 [日志章节](/docs/getting-started-guides/ubuntu/logging) ### SSH 到控制节点上 默认情况下,Juju 将创建一对 SSH 密钥,用于自动化单元之间的连接。 这对密钥保存在客户端节点的 ```~/.local/share/juju/ssh/``` 路径下。 部署完后,Juju 控制器是一个 "无声单元", 其充当客户端和已部署应用程序之间的代理。 尽管如此,SSH 到控制器上还是很有用的。 首先,你需要了解你的运行环境,特别是如果你运行了几个 Juju 模型和控制器。 运行下面的命令行: ``` juju list-models --all $ juju models --all Controller: k8s Model Cloud/Region Status Machines Cores Access Last connection admin/controller lxd/localhost available 1 - admin just now admin/default lxd/localhost available 0 - admin 2017-01-23 admin/whale* lxd/localhost available 6 - admin 3 minutes ago ``` 第一行的 ```Controller: k8s``` 表明是如何引导创建的控制器。 接着可以看见下面列了 2 个,3 个或更多的类型。 * admin/controller 是托管 juju 所有控制器单元的默认模型 * admin/default 默认情况下,作为托管用户应用程序的主要模型,例如 Kubernetes 集群 * admin/whale 是一个额外的模型,如在 Juju 之上,叠加使用 conjure-up 的话 现在开始 ssh 到控制节点上,首先是让 Juju 切换上下文,然后是像一般单元那样 ssh 到控制节点上: ``` juju switch controller ``` 在这个阶段,也可以查询控制器模型: ``` juju status Model Controller Cloud/Region Version controller k8s lxd/localhost 2.0.2 App Version Status Scale Charm Store Rev OS Notes Unit Workload Agent Machine Public address Ports Message Machine State DNS Inst id Series AZ 0 started 10.191.22.15 juju-2a5ed8-0 xenial ``` 请注意,如果是在 HA 模式下进行的引导, 会在列表中看到几台机器。 现在 ssh 到控制器节点上,遵循和经典 Juju 命令相同的语义: ``` $ juju ssh 0 Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.8.0-34-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage Get cloud support with Ubuntu Advantage Cloud Guest: http://www.ubuntu.com/business/services/cloud 0 packages can be updated. 0 updates are security updates. Last login: Tue Jan 24 16:38:13 2017 from 10.191.22.1 ubuntu@juju-2a5ed8-0:~$ ``` 在结束完操作,想要返回到最初的模型,退出控制器即可。 如果,还想要切换回集群,ssh 到其他单元上,运行下面的命令行进行切换: ``` juju switch default ``` ## 管理 Kubernetes 集群 ### 运行特权容器 默认情况下,juju 部署的集群不支持在带有 GPU 的节点上运行特权容器。 如果需要在其它节点上运行特权容器,只能是在 kubernetes-master 和 kubernetes-worker 节点上 使能 ```allow-privileged``` 参数: ``` juju config kubernetes-master allow-privileged=true juju config kubernetes-worker allow-privileged=true ``` ### 私有仓库 通过 registry 操作,您可以很容易地创建一个使用 TLS 身份验证的私有 docker 仓库。 但是请注意,通过这些功能部署的仓库不是高可用性的; 它使用的存储绑定到运行 pod 的 kubernetes 节点上。 因此,如果仓库所在的 pod 从一个节点迁移到另一个节点上, 那么你需要重新发布镜像。 #### 使用示例 创建相关的身份验证文件。 例如用户为 ```userA``` 密码为 ```passwordA``` 用来进行身份验证, 命令行如下: ``` echo "userA:passwordA" > htpasswd-plain htpasswd -c -b -B htpasswd userA passwordA ``` (`htpasswd` 程序通过 ```apache2-utils``` 包获得) 假设您的仓库可以通过 ```myregistry.company.com``` 访问, 您已经在 ```registry.key``` 文件中拥有了您的 TLS 密钥, 并且您的 TLS 身份验证(以 ```myregistry.company.com``` 作为 Common Name)在 ```registry.crt``` 文件中,那么您可以运行: ``` juju run-action kubernetes-worker/0 registry domain=myregistry.company.com htpasswd="$(base64 -w0 htpasswd)" htpasswd-plain="$(base64 -w0 htpasswd-plain)" tlscert="$(base64 -w0 registry.crt)" tlskey="$(base64 -w0 registry.key)" ingress=true ``` 如果决定删除镜像仓库,命令行如下: ``` juju run-action kubernetes-worker/0 registry delete=true ingress=true ``` {{% /capture %}}