本教程使用的是 Kubernetes 1.14版,这是本文发布时的官方支持版本。 有关最新版本的最新信息,请参阅官方Kubernetes文档中的当前发行说明 。
Kubeadm自动安装和配置Kubernetes组件,例如API服务器,Controller Manager和Kube DNS。 但是,它不会创建用户或处理操作系统级依赖关系及其配置的安装。 对于这些初步任务,可以使用Ansible或SaltStack等配置管理工具。使用这些工具可以更加简单地创建其他集群或重新创建现有集群,并且不易出错。
在本指南中,您将使用Ansible和Kubeadm从头开始设置Kubernetes集群,然后将容器化的Nginx应用程序部署到它。
目标
您的群集将包含以下物理资源:
- 一个主节点
主节点(Kubernetes中的节点指服务器)负责管理集群的状态。 它运行Etcd ,它在将工作负载调度到工作节点的组件之间存储集群数据。
- 两个工人节点
工作节点是运行工作负载 (即容器化应用程序和服务)的服务器。 一旦工作人员分配了工作负载,工作人员将继续运行您的工作负载,即使主计划在调度完成后停止工作也是如此。 通过添加工作人员可以增加群集的容量。
完成本指南后,如果群集中的服务器具有足够的CPU和RAM资源供应用程序使用,您将拥有一个可以运行容器化应用程序的集群。 几乎任何传统的Unix应用程序(包括Web应用程序,数据库,守护程序和命令行工具)都可以进行容器化,并在集群上运行。 群集本身将在每个节点上消耗大约300-500MB的内存和10%的CPU。
设置群集后,您将向其部署Web服务器Nginx ,以确保它正确运行工作负载。
先决条件
- 本地Linux / macOS / BSD计算机上的SSH密钥对。 如果您之前没有使用过SSH密钥,可以按照如何在本地计算机上设置SSH密钥的说明来学习如何设置它们。
- 运行Debian 9的三台服务器,每台至少有2GB RAM和2个vCPU。 您应该能够以SSH密钥对的root用户身份SSH到每个服务器。
- Ansible安装在您的本地计算机上。 有关安装说明,请按照Ansible官方安装文档进行操作 。
- 熟悉Ansible Playbook。 有关查看,请查看配置管理101:编写Ansible Playbooks 。
- 了解如何从Docker镜像启动容器。 如果需要复习,请参阅如何在Debian 9上安装和使用Docker的 “第5步 - 运行Docker容器”。
第1步 - 设置工作区目录和Ansible清单文件
在本节中,您将在本地计算机上创建一个用作工作区的目录。 您将在本地配置Ansible,以便它可以与远程服务器上的命令通信并执行命令。 完成后,您将创建一个包含库存信息的hosts
文件,例如服务器的IP地址和每个服务器所属的组。
在三台服务器中,一台服务器将成为主服务器,其IP显示为master_ip
。 其他两个服务器将是worker,并且将具有IP worker_1_ip
和worker_2_ip
。
在本地计算机的主目录中创建一个名为~/kube-cluster
的目录并将其cd
入其中:
mkdir ~/kube-cluster cd ~/kube-cluster
该目录将成为本教程其余部分的工作区,并包含所有Ansible Playbook。 它也将是您将在其中运行所有本地命令的目录。
使用nano
或您喜欢的文本编辑器创建名为~/kube-cluster/hosts
文件:
nano ~/kube-cluster/hosts
将以下文本添加到文件中,该文件将指定有关群集逻辑结构的信息:〜/ KUBE群集/主机
[masters] master ansible_host=master_ip ansible_user=root [workers] worker1 ansible_host=worker_1_ip ansible_user=root worker2 ansible_host=worker_2_ip ansible_user=root [all:vars] ansible_python_interpreter=/usr/bin/python3
您可能还记得Ansible中的库存文件用于指定服务器信息,例如IP地址,远程用户和服务器分组,以作为执行命令的单个单元进行目标。 ~/kube-cluster/hosts
将是您的库存文件,并且您已向其添加了两个Ansible组( 主服务器和工作者 ),用于指定集群的逻辑结构。
在主服务器组中,有一个名为“master”的服务器条目,列出主节点的IP( master_ip
),并指定Ansible应以root用户身份运行远程命令。
同样,在workers组中,有两个工作服务器条目( worker_1_ip
和worker_2_ip
),它们也将ansible_user
指定为root。
该文件的最后一行告诉Ansible使用远程服务器的Python 3解释器进行管理操作。
添加文本后保存并关闭文件。
使用组设置服务器清单后,我们继续安装操作系统级依赖关系并创建配置设置。
第2步 - 在所有远程服务器上创建非root用户
在本节中,您将在所有服务器上创建一个具有sudo权限的非root用户,以便您可以作为非特权用户手动SSH连接到这些用户。 例如,如果您希望使用top/htop
等命令查看系统信息,查看正在运行的容器列表或更改root拥有的配置文件,这将非常有用。 这些操作通常在维护群集期间执行,并且使用非root用户执行此类任务可以最大程度地降低修改或删除重要文件或无意中执行其他危险操作的风险。
在工作区中创建名为~/kube-cluster/initial.yml
的文件:
nano ~/kube-cluster/initial.yml
接下来,将以下播放添加到该文件以创建在所有服务器上具有sudo权限的非root用户。 Ansible中的游戏是针对特定服务器和组执行的一系列步骤。 以下播放将创建一个非root sudo用户:〜/ KUBE群集/ initial.yml
- hosts: all become: yes tasks: - name: create the 'sammy' user user: name=sammy append=yes state=present createhome=yes shell=/bin/bash - name: allow 'sammy' to have passwordless sudo lineinfile: dest: /etc/sudoers line: 'sammy ALL=(ALL) NOPASSWD: ALL' validate: 'visudo -cf %s' - name: set up authorized keys for the sammy user authorized_key: user=sammy key="{{item}}" with_file: - ~/.ssh/id_rsa.pub
这是这个剧本的作用细分:
- 创建非root用户
sammy
。 - 配置
sudoers
文件以允许sammy
用户在没有密码提示的情况下运行sudo
命令。 - 将本地计算机中的
~/.ssh/id_rsa.pub
(通常为~/.ssh/id_rsa.pub
)添加到远程sammy
用户的授权密钥列表中。 这将允许您以sammy
用户身份SSH到每个服务器。
添加文本后保存并关闭文件。
接下来,通过本地运行执行playbook:
ansible-playbook -i hosts ~/kube-cluster/initial.yml
该命令将在两到五分钟内完成。 完成后,您将看到类似于以下内容的输出:
OutputPLAY [all] **** TASK [Gathering Facts] **** ok: [master] ok: [worker1] ok: [worker2] TASK [create the 'sammy' user] **** changed: [master] changed: [worker1] changed: [worker2] TASK [allow 'sammy' user to have passwordless sudo] **** changed: [master] changed: [worker1] changed: [worker2] TASK [set up authorized keys for the sammy user] **** changed: [worker1] => (item=ssh-rsa AAAAB3...) changed: [worker2] => (item=ssh-rsa AAAAB3...) changed: [master] => (item=ssh-rsa AAAAB3...) PLAY RECAP **** master : ok=5 changed=4 unreachable=0 failed=0 worker1 : ok=5 changed=4 unreachable=0 failed=0 worker2 : ok=5 changed=4 unreachable=0 failed=0
现在初步设置已完成,您可以继续安装特定于Kubernetes的依赖项。
第3步 - 安装Kubernetes依赖项
在本节中,您将使用Debian的软件包管理器安装Kubernetes所需的操作系统级软件包。 这些包是:
- Docker - 容器运行时。 它是运行容器的组件。 Kubernetes正在积极开发对rkt等其他运行时的支持。
kubeadm
- 一个CLI工具,它将以标准方式安装和配置集群的各个组件。kubelet
- 一个在所有节点上运行并处理节点级操作的系统服务/程序。kubectl
- 一种CLI工具,用于通过其API服务器向集群发出命令。
在工作区中创建一个名为~/kube-cluster/kube-dependencies.yml
的文件:
nano ~/kube-cluster/kube-dependencies.yml
将以下播放添加到文件以将这些包安装到您的服务器:〜/ KUBE群集/ KUBE-dependencies.yml
- hosts: all become: yes tasks: - name: install remote apt deps apt: name: "{{ item }}" state: present with_items: - apt-transport-https - ca-certificates - gnupg2 - software-properties-common - name: add Docker apt-key apt_key: url: https://download.docker.com/linux/debian/gpg state: present - name: add Docker's APT repository apt_repository: repo: deb https://download.docker.com/linux/debian stretch stable state: present filename: 'docker' - name: install Docker apt: name: docker-ce state: present update_cache: true - name: add Kubernetes apt-key apt_key: url: https://packages.cloud.google.com/apt/doc/apt-key.gpg state: present - name: add Kubernetes' APT repository apt_repository: repo: deb http://apt.kubernetes.io/ kubernetes-xenial main state: present filename: 'kubernetes' - name: install kubelet apt: name: kubelet=1.14.0-00 state: present update_cache: true - name: install kubeadm apt: name: kubeadm=1.14.0-00 state: present - hosts: master become: yes tasks: - name: install kubectl apt: name: kubectl=1.14.0-00 state: present force: yes
剧本中的第一部戏剧如下:
- 添加依赖项以添加,验证和安装远程存储库中的包。
- 添加Docker APT存储库的apt-key以进行密钥验证。
- 安装Docker,容器运行时。
- 添加Kubernetes APT存储库的apt-key进行密钥验证。
- 将Kubernetes APT存储库添加到远程服务器的APT源列表中。
- 安装
kubelet
和kubeadm
。
第二个游戏包含一个在主节点上安装kubectl
任务。
注意:虽然Kubernetes文档建议您为您的环境使用最新的Kubernetes稳定版本,但本教程使用特定版本。 这将确保您可以成功地执行这些步骤,因为Kubernetes快速更改,并且最新版本可能无法与本教程一起使用。
完成后保存并关闭文件。
接下来,通过本地运行执行playbook:
ansible-playbook -i hosts ~/kube-cluster/kube-dependencies.yml
完成后,您将看到类似于以下内容的输出:
OutputPLAY [all] **** TASK [Gathering Facts] **** ok: [worker1] ok: [worker2] ok: [master] TASK [install Docker] **** changed: [master] changed: [worker1] changed: [worker2] TASK [install APT Transport HTTPS] ***** ok: [master] ok: [worker1] changed: [worker2] TASK [add Kubernetes apt-key] ***** changed: [master] changed: [worker1] changed: [worker2] TASK [add Kubernetes' APT repository] ***** changed: [master] changed: [worker1] changed: [worker2] TASK [install kubelet] ***** changed: [master] changed: [worker1] changed: [worker2] TASK [install kubeadm] ***** changed: [master] changed: [worker1] changed: [worker2] PLAY [master] ***** TASK [Gathering Facts] ***** ok: [master] TASK [install kubectl] ****** ok: [master] PLAY RECAP **** master : ok=9 changed=5 unreachable=0 failed=0 worker1 : ok=7 changed=5 unreachable=0 failed=0 worker2 : ok=7 changed=5 unreachable=0 failed=0
执行后,Docker, kubeadm
和kubelet
将安装在所有远程服务器上。 kubectl
不是必需组件,仅用于执行集群命令。 在此上下文中仅在主节点上安装它是有意义的,因为您将kubectl
主服务器运行kubectl
命令。 但是,请注意, kubectl
命令可以从任何工作节点运行,也可以从可以安装和配置为指向集群的任何计算机运行。
现在已安装所有系统依赖项。 继续阅读本文下半部分,完成主节点的设置并初始化集群。