# 在 CenturyLink Cloud 上运行 k8s
这些脚本处理 CenturyLink Cloud 上 k8s 集群的创建,删除和扩展。
您可以使用单个命令完成所有这些任务。我们已经可以使用 Ansible playbooks 执行这些任务,请参考 这里。
# 寻求帮助
如果遇到任何问题或需要任何帮助,我们都会帮助您。您可以通过以下任何方式联系我们:
- 提交一个 github 问题
- 发送电子邮件给 Kubernetes@ctl.io
- 访问 http://info.ctl.io/kubernetes
# 您可以任意选择虚拟机或物理服务器组成集群。
- 无论虚拟机还是物理服务器均支持 k8s 集群。如果工作节点(minion)使用物理服务器,请使用 –minion_type=bareMetal 标志。
- 物理服务仅在 VA1 和 GB3 数据中心提供。
- 所有 13 个公有云位置均提供虚拟机
# 要求
运行这个脚本的要求是:
运行这个脚本的要求是:
- 一个 Linux 管理主机(在 Ubuntu 和 OSX 测试过)
- python 2(在 2.7.11 上测试过)
- pip(安装 Python 2.7.9)
- git
- 具有创建新主机权限的 CenturyLink Cloud 帐户
- 从您的 Linux 主机到 CenturyLink Cloud 的 VPN 连接
# 脚本安装
满足所有要求后,请按照以下说明运行安装脚本。
\1) 克隆这个仓库,并 cd 到这个目录中。
git clone https://github.com/CenturyLinkCloud/adm-kubernetes-on-clc
\2) 安装所有要求,包括
- Ansible
- CenturyLink Cloud SDK
- Ansible 模块
sudo pip install -r ansible/requirements.txt
\3) 从模板创建凭证文件,并使用它来设置您的 ENV 变量
cp ansible/credentials.sh.template ansible/credentials.sh
vi ansible/credentials.sh
source ansible/credentials.sh
\4) 使用网络内的虚拟机或 配置连接到 CenturyLink Cloud 网络的 VPN 来从您的机器访问 CenturyLink Cloud 网络。
# 脚本安装示例:Ubuntu 14 演练
如果您使用的是 Ubuntu 14,方便起见,我们已经提供了一个安装依赖和脚本的分步指导。
# system
apt-get update
apt-get install -y git python python-crypto
curl -O https://bootstrap.pypa.io/get-pip.py
python get-pip.py
# installing this repository
mkdir -p ~home/k8s-on-clc
cd ~home/k8s-on-clc
git clone https://github.com/CenturyLinkCloud/adm-kubernetes-on-clc.git
cd adm-kubernetes-on-clc/
pip install -r requirements.txt
# getting started
cd ansible
cp credentials.sh.template credentials.sh; vi credentials.sh
source credentials.sh
# 集群创建
要创建一个新的 k8s 集群,只需运行 kube-up.sh 脚本。以下列出了脚本选项和一些示例的完整列表。
CLC_CLUSTER_NAME=[name of kubernetes cluster]
cd ./adm-kubernetes-on-clc
bash kube-up.sh -c="$CLC_CLUSTER_NAME"
大约需要 15 分钟来创建集群。一旦脚本完成,它会输出一些命令来帮助您在机器上设置 kubectl 以指向新的集群。
集群创建完成后,会将其配置文件本地保存在您管理主机的以下目录中
> CLC_CLUSTER_HOME=$HOME/.clc_kube/$CLC_CLUSTER_NAME/
# 集群创建:脚本选项
Usage: kube-up.sh [OPTIONS]
Create servers in the CenturyLinkCloud environment and initialize a Kubernetes cluster
Environment variables CLC_V2_API_USERNAME and CLC_V2_API_PASSWD must be set in
order to access the CenturyLinkCloud API
All options (both short and long form) require arguments, and must include "="
between option name and option value.
-h (--help) display this help and exit
-c= (--clc_cluster_name=) set the name of the cluster, as used in CLC group names
-t= (--minion_type=) standard -> VM (default), bareMetal -> physical]
-d= (--datacenter=) VA1 (default)
-m= (--minion_count=) number of kubernetes minion nodes
-mem= (--vm_memory=) number of GB ram for each minion
-cpu= (--vm_cpu=) number of virtual cps for each minion node
-phyid= (--server_conf_id=) physical server configuration id, one of
physical_server_20_core_conf_id
physical_server_12_core_conf_id
physical_server_4_core_conf_id (default)
-etcd_separate_cluster=yes create a separate cluster of three etcd nodes,
otherwise run etcd on the master node
# 集群扩展
要扩展现有的 k8s 集群,运行 add-kube-node.sh 脚本。脚本选项和一些例子的完整列表在 下面 列出。 此脚本必须从创建集群的同一台主机(或者在 ~/.clc_kube/$cluster_name 路径保存了集群 artifact 文件的主机)运行。
cd ./adm-kubernetes-on-clc
bash add-kube-node.sh -c="name_of_kubernetes_cluster" -m=2
# 集群扩展:脚本选项
Usage: add-kube-node.sh [OPTIONS]
Create servers in the CenturyLinkCloud environment and add to an
existing CLC kubernetes cluster
Environment variables CLC_V2_API_USERNAME and CLC_V2_API_PASSWD must be set in
order to access the CenturyLinkCloud API
-h (--help) display this help and exit
-c= (--clc_cluster_name=) set the name of the cluster, as used in CLC group names
-m= (--minion_count=) number of kubernetes minion nodes to add
# 集群删除
有两种方法可以删除现有的集群:
\1) 使用我们的 Python 脚本:
python delete_cluster.py --cluster=clc_cluster_name --datacenter=DC1
\2) 使用 CenturyLink Cloud 用户界面。 要删除集群,请登录到 CenturyLink Cloud 控制门户并删除包含该的父服务器组 Kubernetes 集群。 我们希望添加一个脚本化的选项来尽快做到这一点。
# 例子
在 VA1 中创建名称为 k8s_1,1 个 master 节点和 3 个 worker(在物理机上)的集群
bash kube-up.sh --clc_cluster_name=k8s_1 --minion_type=bareMetal --minion_count=3 --datacenter=VA1
在 VA1 中创建一个名为 k8s_2 的集群,一个在 3 个虚拟机和 6 个 worker minion(在虚拟机上)的 HA etcd 集群
bash kube-up.sh --clc_cluster_name=k8s_2 --minion_type=standard --minion_count=6 --datacenter=VA1 --etcd_separate_cluster=yes
在 UC1 中创建一个名为 k8s_3,1 个 master 节点和 10 个具有更高 mem/cpu 的 worker minion(在 VM 上)的集群:
bash kube-up.sh --clc_cluster_name=k8s_3 --minion_type=standard --minion_count=10 --datacenter=VA1 -mem=6 -cpu=4
# 集群功能和体系结构
我们使用以下功能配置 k8s 集群:
- KubeDNS:DNS 解析和服务发现
- Heapster/InfluxDB:用于 metric 收集。需要 Grafana 和 auto-scaling。
- Grafana:k8s/Docker metric 面板
- KubeUI:简单的界面来查看 k8s 状态
- Kube Dashboard:新的用于与您的集群交互的 Web 界面
我们使用这些组件创建 k8s 集群:
- Kubernetes 1.1.7
- Ubuntu 14.04
- Flannel 0.5.4
- Docker 1.9.1-0~trusty
- Etcd 2.2.2
# 可选插件
- 日志记录:我们提供一个集成的集中日志记录 ELK 平台,以便所有 k8s 和 docker 日志被发送到 ELK 堆栈。要安装 ELK 堆栈并配置 k8s 发送日志,遵循 日志聚合文档。 注意:我们不会默认安装这个,因为它占用的空间并不小。
# 集群管理
管理 k8s 集群的最广泛使用的工具是命令行 kubectl。 如果您的管理主机上还没有这个二进制文件,可以运行 install_kubectl.sh,这个脚本会将它下载并安装到 /usr/bin/local 中。
该脚本要求定义环境变量 CLC_CLUSTER_NAME
install_kubectl.sh 也写一个配置文件,它将嵌入必要的特定集群的身份验证证书。 配置文件会写到 ${CLC_CLUSTER_HOME}/kube 目录
export KUBECONFIG=${CLC_CLUSTER_HOME}/kube/config
kubectl version
kubectl cluster-info
# 以编程方式访问集群
可以使用本地存储的客户端证书来访问 apiserver。例如,您可能希望使用任何 k8s API 客户端库,并以您选择的编程语言对您的 k8s 集群进行编程。
为了演示如何使用这些本地存储的证书,我们提供了以下例子,使用 `curl 通过 https 与主 apiserver 进行通信:
curl \
--cacert ${CLC_CLUSTER_HOME}/pki/ca.crt \
--key ${CLC_CLUSTER_HOME}/pki/kubecfg.key \
--cert ${CLC_CLUSTER_HOME}/pki/kubecfg.crt https://${MASTER_IP}:6443
但请注意,这不适用于 OSX 版本的 curl 二进制文件。
# 使用浏览器访问集群
我们在 k8s 上安装两个 UI。原来的 KubeUI 和 新的 Kube dashboard。 当你创建一个集群时,脚本应该输出这些接口 URL,像这样:
KubeUI is running at https://${MASTER_IP}:6443/api/v1/namespaces/kube-system/services/kube-ui/proxy.
kubernetes-dashboard is running at https://${MASTER_IP}:6443/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy.
关于用户界面身份验证的注意事项:集群设置为使用基本用户 admin 的身份验证。打在网址 https://${MASTER_IP}:6443 需要接受 apiserver 的自签名证书,然后提交管理员密码文件,位于:
${CLC_CLUSTER_HOME}/kube/admin_password.txt
# 配置文件
各种配置文件被写入主目录 CLC_CLUSTER_HOME 下的 .clc_kube/${CLC_CLUSTER_NAME} 几个子目录中。 你可以使用这些文件从您创建集群的位置以外的机器访问集群。
- config/: Ansible 变量文件,包含描述主控和主控主机的参数
- hosts/: 主机文件列出了可靠的剧本的访问信息
- kube/: kubectl 配置文件,以及管理员访问 k8s API 的基本认证密码
- pki/: 在集群中启用 TLS 通信的公共基础设施文件
- ssh/: 用于 root 访问主机的 SSH 密钥
# kubectl 使用例子
kubectl 有很多功能。下面是一些例子
列出所有名称空间中的现有 node、Pod、service 等等,或者只列出一个:
kubectl get nodes
kubectl get --all-namespaces services
kubectl get --namespace=kube-system replicationcontrollers
k8s API 服务器在 web URL 上提供服务,通过校验客户证书保护这些 URL。 如果你在本地运行一个 kubectl 代理,kubectl 将会提供必要的证书并通过 http 服务于本地。
kubectl proxy -p 8001
然后,您可以在浏览器中访问像 http://127.0.0.1:8001/api/v1/namespaces/kube-system/services/kube-ui/proxy/ 这样的 URL 而不需要客户端证书。
# 哪些 k8s 特性在 CenturyLink Cloud 上不起作用
这些是在 CenturyLink Cloud 上不起作用的已知项,但可以在其他云上工作:
- 目前没有 LoadBalancer 类型的支持服务。我们正在积极努力,希望在 2016 年 4 月左右发布这些变化。
- 目前,CenturyLink Cloud 不支持持久性存储卷。但是,客户可以使用自己选中的持久存储。我们自己使用 Gluster。