_ 作者选择了 免费和开源基金作为 写给捐款计划的一部分接受捐款。
介绍
Kubernetes是一个集装箱管制系统,以规模管理集装箱. 最初由谷歌开发,基于其在生产中运行集装箱的经验,Kubernetes是开源的,并积极由世界各地的社区开发。
<$>[注] 注: 本教程使用了 Kubernetes 1.14 版本,这是本文发布时官方支持的版本。有关最新版本的最新信息,请参阅 当前发布的注释在官方 Kubernetes 文档中。
[Kubeadm] (https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/) 将Kubernetes组件的安装和配置自动化,如API服务器,Controller管理器,和Kube DNS等. 然而,它并不创建用户或处理操作系统级依赖及其配置的安装. 对于这些初步任务,可以使用Ansible或SaltStack等配置管理工具. 使用这些工具使创建额外的集群或重新创建现有的集群变得简单得多,更不会出错.
在本指南中,您将使用 Ansible 和 Kubeadm 从头开始设置一个 Kubernetes 集群,然后部署一个集装箱化的 Nginx 应用程序。
如果您正在寻找一个管理的Kubernetes托管服务,请查看我们的简单的,用于增长的管理的Kubernetes服务(https://www.digitalocean.com/products/kubernetes)。
目标
您的集群将包括以下物理资源:
- 一个主节点* 主节点(Kubernetes中a_node_指服务器)负责管理集群状态. 它运行[Etcd] (https://github.com/coreos/etcd),将集群数据存储在将工作量排入工人节点的组件之间. *两个工人节点 工人节点是您所运行的 workloads(即容器化的应用程序和服务)的服务器. 一个工人会继续承担你的工作量 一旦他们被分配到它, 即使主人下去,一旦时间安排完成。 一个集群的能力可以通过增加工人来提高. .
完成本指南后,您将有一个集群准备运行容器化应用程序,只要集群中的服务器有足够的 CPU 和 RAM 资源来消耗您的应用程序. 几乎任何传统的 Unix 应用程序,包括 Web 应用程序,数据库,戴蒙和命令行工具,都可以集群化并在集群上运行。
一旦集群已设置,您将部署 Web 服务器 Nginx以确保它正确运行工作负载。
前提条件
- 联合国 您本地的 Linux/macOS/ BSD 机器上的 SSH 密钥对 。 如果您之前没有使用过SSH密钥,您可以通过遵循此解释来学习如何设置这些密钥如何在本地机上设置SSH密钥.
- 联合国 三台服务器运行 CentOS 7,每个服务器至少有2GB RAM和2 vCPU. 您应该能够以 SSH 密钥对的根用户身份进入每个服务器 。 请务必同时将您的公钥添加到主节点上的 centos** 用户账户中. 如果您需要向特定用户账户添加一个 SSH 密钥的指导,请参见 [How To Set Up SSH keys on CentOS7] (https://andsky.com/tech/tutorials/how-to-set-up-ssh-keys-on-centos7) 上的此教程.
- 安装在本地机器上的安眠药。 对于安装指令,请遵循正式的Ansible安装文档.
- 熟悉Ansible游戏本。 请检查access-date=中的日期值 (帮助) [配置管理 101:写Ansible Playbooks] (https://andsky.com/tech/tutorials/configuration-management-101-writing-ansible-playbooks).
- 如何从多克图像发射容器的知识。 请看"第5步——运行一个多克容器",载于"How to Instruction and use Docker on CentOS 7" (https://andsky.com/tech/tutorials/how-to-install-and-use-docker-on-centos-7# step-5-%E2%80%94-running-a-docker-container),如果需要复习. .
步骤 1 — 设置工作区目录和 Ansible 库存文件
在本节中,您将在本地机器上创建一个目录,该目录将作为您的工作空间。您还将本地配置 Ansible,以便它可以与您的远程服务器进行通信和执行命令。
在你的三個伺服器中,一個將是主機, IP 顯示為「master_ip」;其他兩個伺服器將是工人,將有「worker_1_ip」和「worker_2_ip」的 IP。
在本地机器的主目录中创建一个名为~/cube-cluster
的目录,并将其cd
放入其中:
1[environment local]
2mkdir ~/kube-cluster
3cd ~/kube-cluster
此目录将是您在本教程的剩余时间工作空间,并将包含您的所有Ansible播放簿,它也将是您将运行所有本地命令的目录。
使用vi
或您最喜欢的文本编辑器创建名为~/kube-cluster/hosts
的文件:
1[environment local]
2vi ~/kube-cluster/hosts
点击i
,将下列文本插入到文件中,其中会指定有关群集的逻辑结构的信息:
1[environment local]
2[label ~/kube-cluster/hosts]
3[masters]
4master ansible_host=master_ip ansible_user=root
5
6[workers]
7worker1 ansible_host=worker_1_ip ansible_user=root
8worker2 ansible_host=worker_2_ip ansible_user=root
当你完成时,按ESC
,然后按:wq
,写入文件的更改,然后停止。
您可能还记得,在 Ansible 中, inventory files用于指定服务器信息,如 IP 地址,远程用户和服务器组合,以作为执行命令的单个单位进行目标。
在 masters 组中,有一个名为),并指定 Ansible 应该作为 root 用户运行远程命令。
同样,在工作者组中,有两个工作者服务器的条目()也指定了ansible_user
作为根。
设置服务器库存组之后,让我们继续安装操作系统级依赖并创建配置设置。
第2步:安装Kubernetes依赖
在本节中,您将安装 Kubernetes 使用 CentOS 的「yum」包管理器所需的操作系统级包。
- Docker - 一个容器运行时间. 这是运行您的容器的组件. 支持其他运行时间,如 rkt正在 Kubernetes 积极开发中。 *
kubeadm
- 一个 CLI 工具,将以标准的方式安装和配置群集的各个组件。 *kubelet
- 一个系统服务 / 程序,在所有节点上运行并处理节点级操作。 *kubectl
- 一个用于通过其 API 服务器发出命令的 CLI 工具。
在工作区中创建名为 `~/kube-cluster/kube-dependencies.yml 的文件:
1[environment local]
2vi ~/kube-cluster/kube-dependencies.yml
将以下播放添加到文件中,以便将这些包安装到您的服务器上:
1[environment local]
2[label ~/kube-cluster/kube-dependencies.yml]
3- hosts: all
4 become: yes
5 tasks:
6 - name: install Docker
7 yum:
8 name: docker
9 state: present
10 update_cache: true
11
12 - name: start Docker
13 service:
14 name: docker
15 state: started
16
17 - name: disable SELinux
18 command: setenforce 0
19
20 - name: disable SELinux on reboot
21 selinux:
22 state: disabled
23
24 - name: ensure net.bridge.bridge-nf-call-ip6tables is set to 1
25 sysctl:
26 name: net.bridge.bridge-nf-call-ip6tables
27 value: 1
28 state: present
29
30 - name: ensure net.bridge.bridge-nf-call-iptables is set to 1
31 sysctl:
32 name: net.bridge.bridge-nf-call-iptables
33 value: 1
34 state: present
35
36 - name: add Kubernetes' YUM repository
37 yum_repository:
38 name: Kubernetes
39 description: Kubernetes YUM repository
40 baseurl: https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
41 gpgkey: https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
42 gpgcheck: yes
43
44 - name: install kubelet
45 yum:
46 name: kubelet-1.14.0
47 state: present
48 update_cache: true
49
50 - name: install kubeadm
51 yum:
52 name: kubeadm-1.14.0
53 state: present
54
55 - name: start kubelet
56 service:
57 name: kubelet
58 enabled: yes
59 state: started
60
61- hosts: master
62 become: yes
63 tasks:
64 - name: install kubectl
65 yum:
66 name: kubectl-1.14.0
67 state: present
68 allow_downgrade: yes
剧本中的第一场戏做得如下:
- 安装 Docker,容器运行时间 * 启动 Docker 服务 * 禁用 SELinux,因为 Kubernetes 尚未完全支持它 * 设置网络所需的几个 netfilter 相关的
sysctl
值 这将允许 Kubernetes 设置 iptables 规则,以便在节点上接收连接 IPv4 和 IPv6 网络流量 * 将 Kubernetes YUM 存储库添加到您的远程服务器的存储列表 * 安装kubelet
和 `kubeadm'。
第二个游戏由一个单一的任务组成,在您的主节点上安装kubectl
。
注意:虽然Kubernetes文档建议您为您的环境使用最新稳定版本的Kubernetes,但本教程使用的是特定版本。
保存并关闭文件,当你完成。
接下来,执行 playbook:
1[environment local]
2ansible-playbook -i hosts ~/kube-cluster/kube-dependencies.yml
完成后,您将看到类似于以下的输出:
1[environment local]
2[secondary_label Output]
3PLAY [all] ****
4
5TASK [Gathering Facts] ****
6ok: [worker1]
7ok: [worker2]
8ok: [master]
9
10TASK [install Docker] ****
11changed: [master]
12changed: [worker1]
13changed: [worker2]
14
15TASK [disable SELinux] ****
16changed: [master]
17changed: [worker1]
18changed: [worker2]
19
20TASK [disable SELinux on reboot] ****
21changed: [master]
22changed: [worker1]
23changed: [worker2]
24
25TASK [ensure net.bridge.bridge-nf-call-ip6tables is set to 1] ****
26changed: [master]
27changed: [worker1]
28changed: [worker2]
29
30TASK [ensure net.bridge.bridge-nf-call-iptables is set to 1] ****
31changed: [master]
32changed: [worker1]
33changed: [worker2]
34
35TASK [start Docker] ****
36changed: [master]
37changed: [worker1]
38changed: [worker2]
39
40TASK [add Kubernetes' YUM repository] *****
41changed: [master]
42changed: [worker1]
43changed: [worker2]
44
45TASK [install kubelet] *****
46changed: [master]
47changed: [worker1]
48changed: [worker2]
49
50TASK [install kubeadm] *****
51changed: [master]
52changed: [worker1]
53changed: [worker2]
54
55TASK [start kubelet] ****
56changed: [master]
57changed: [worker1]
58changed: [worker2]
59
60PLAY [master] *****
61
62TASK [Gathering Facts] *****
63ok: [master]
64
65TASK [install kubectl] ******
66ok: [master]
67
68PLAY RECAP ****
69master : ok=9 changed=5 unreachable=0 failed=0
70worker1 : ok=7 changed=5 unreachable=0 failed=0
71worker2 : ok=7 changed=5 unreachable=0 failed=0
執行後,Docker、kubeadm 和 kubelet 會安裝在所有遠端伺服器上。「kubectl」並不是必需的組件,只需要執行集群命令。在這種情況下,只在主節點上安裝它是有意義的,因為你只會從主節點執行「kubectl」命令。 但是,請注意,「kubectl」命令可以從任何工作節點或任何可以安裝和配置到集群的機器上執行。
现在安装了所有系统依赖性,让我们设置主节点并初始化集群。
第4步:设置主节点
然而,在创建任何播放书之前,值得涵盖一些概念,如 Pods 和 _Pod 网络插件,因为您的集群将包括两者。
Pod 是运行一个或多个集装箱的原子单位,这些集装箱共享文件卷和网络接口等共同的资源。Pod 是 Kubernetes 编程的基本单元:一个集装箱中的所有集装箱都保证在一个节点上运行。
每个pod都有自己的IP地址,一个节点上的pod应该能够使用pod的IP访问另一个节点上的pod。单个节点上的容器可以通过本地接口轻松通信。
此功能由 pod 网络插件提供. 对于此集群,您将使用 Flannel,一个稳定且高性能的选项。
在本地机器上创建一个名为master.yml
的Ansible播放簿:
1[environment local]
2vi ~/kube-cluster/master.yml
将下列播放添加到文件中,以初始化集群并安装 Flannel:
1[environment local]
2[label ~/kube-cluster/master.yml]
3- hosts: master
4 become: yes
5 tasks:
6 - name: initialize the cluster
7 shell: kubeadm init --pod-network-cidr=10.244.0.0/16 >> cluster_initialized.txt
8 args:
9 chdir: $HOME
10 creates: cluster_initialized.txt
11
12 - name: create .kube directory
13 become: yes
14 become_user: centos
15 file:
16 path: $HOME/.kube
17 state: directory
18 mode: 0755
19
20 - name: copy admin.conf to user's kube config
21 copy:
22 src: /etc/kubernetes/admin.conf
23 dest: /home/centos/.kube/config
24 remote_src: yes
25 owner: centos
26
27 - name: install Pod network
28 become: yes
29 become_user: centos
30 shell: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml >> pod_network_setup.txt
31 args:
32 chdir: $HOME
33 creates: pod_network_setup.txt
以下是这场戏的分裂:
- 联合国 第一个任务通过运行
kubeadm init
来初始化集群。 通过`-pod-network-cidr=10.244.0.0/16'这一论点,可以确定将分配给IP的私人子网。 Flannel默认使用上面的子网;我们告诉"kubeadm"使用同一个子网. - 联合国 第二项任务在
/home/centos'创建了
.kube'目录。 此目录将持有配置信息, 如连接集群所需的管理员密钥文件, 以及集群的 API 地址 。 - **联合国 第三项任务复制了
/etc/kubernetes/admin.conf'。 从
kubeadm init到您的非根** centos** 用户主目录生成的文件。 这将允许您使用
kubectl` 访问新创建的集群 。 - 联合国 最后一项任务为安装 " Flannel " 。
kubetl适用-f 描述符。 是命令
kubectl创建
描述符文件所描述的对象的语法。[yml|json]。
kube-flannel.yml'文件载有在集群中设置`Flannel'所需对象的说明。 .
保存并关闭文件,当你完成。
运行 Playbook:
1[environment local]
2ansible-playbook -i hosts ~/kube-cluster/master.yml
完成后,您将看到类似于以下的输出:
1[environment local]
2[secondary_label Output]
3
4PLAY [master] ****
5
6TASK [Gathering Facts] ****
7ok: [master]
8
9TASK [initialize the cluster] ****
10changed: [master]
11
12TASK [create .kube directory] ****
13changed: [master]
14
15TASK [copy admin.conf to user's kube config] *****
16changed: [master]
17
18TASK [install Pod network] *****
19changed: [master]
20
21PLAY RECAP ****
22master : ok=5 changed=4 unreachable=0 failed=0
要检查主节点的状态,用以下命令 SSH 进入它:
1[environment local]
2ssh centos@master_ip
一旦进入主节点,执行:
1kubectl get nodes
您现在将看到以下结果:
1[secondary_label Output]
2NAME STATUS ROLES AGE VERSION
3master Ready master 1d v1.14.0
输出表示主
节点已经完成了所有初始化任务,并且处于准备
状态,可以开始接受工人节点并执行发送到API服务器的任务。
步骤5 - 设置工人节点
将工人添加到群集中涉及在每个群集上执行一个单一的命令. 此命令包含必要的群集信息,如主 API Server 的 IP 地址和端口,以及一个安全的代币。
返回工作区,创建一个名为workers.yml
的播放簿:
1[environment local]
2vi ~/kube-cluster/workers.yml
将下列文本添加到文件中,以将工人添加到集群中:
1[environment local]
2[label ~/kube-cluster/workers.yml]
3- hosts: master
4 become: yes
5 gather_facts: false
6 tasks:
7 - name: get join command
8 shell: kubeadm token create --print-join-command
9 register: join_command_raw
10
11 - name: set join command
12 set_fact:
13 join_command: "{{ join_command_raw.stdout_lines[0] }}"
14
15- hosts: workers
16 become: yes
17 tasks:
18 - name: join cluster
19 shell: "{{ hostvars['master'].join_command }} --ignore-preflight-errors all >> node_joined.txt"
20 args:
21 chdir: $HOME
22 creates: node_joined.txt
以下是《剧本》所做的:
- 联合国 第一种游戏获得需要运行在工人节点上的联合命令. 此命令将采用以下格式:
kubeadm join -- token <token > <master- ip> : <master- port> --发现-token-ca-cert-hash sha256:<hash>
. 一旦它得到带有适当的 token** 和** hash** 值的实际命令,任务就将其设定为事实,以便下一场游戏能够访问该信息. - 联合国 第二出戏有一个单一的任务,在所有工人节点上运行联合指令. 在完成这项任务后,两个工人节点将成为集群的一部分. .
保存并关闭文件,当你完成。
运行 Playbook:
1[environment local]
2ansible-playbook -i hosts ~/kube-cluster/workers.yml
完成后,您将看到类似于以下的输出:
1[environment local]
2[secondary_label Output]
3PLAY [master] ****
4
5TASK [get join command] ****
6changed: [master]
7
8TASK [set join command] *****
9ok: [master]
10
11PLAY [workers] *****
12
13TASK [Gathering Facts] *****
14ok: [worker1]
15ok: [worker2]
16
17TASK [join cluster] *****
18changed: [worker1]
19changed: [worker2]
20
21PLAY RECAP *****
22master : ok=2 changed=1 unreachable=0 failed=0
23worker1 : ok=2 changed=1 unreachable=0 failed=0
24worker2 : ok=2 changed=1 unreachable=0 failed=0
随着工人节点的添加,您的集群现在已经完全设置和功能,工人准备运行工作负载。
步骤6 - 验证集群
集群在设置过程中有时会失败,因为节点处于停机状态或主机和工人之间的网络连接不正常工作,让我们检查集群并确保节点正常工作。
您将需要从主节点检查集群的当前状态,以确保节点已经准备好. 如果您从主节点中断连接,您可以使用以下命令将 SSH 返回其中:
1[environment local]
2ssh centos@master_ip
然后执行以下命令来获取集群的状态:
1kubectl get nodes
您将看到类似于以下的输出:
1[secondary_label Output]
2NAME STATUS ROLES AGE VERSION
3master Ready master 1d v1.14.0
4worker1 Ready <none> 1d v1.14.0
5worker2 Ready <none> 1d v1.14.0
如果您的所有节点都具有状态
的准备
值,则意味着它们是集群的一部分,并准备运行工作负载。
但是,如果一些节点有NotReady
作为STATUS
,这可能意味着工人节点尚未完成设置。在重新运行kubectl get node
并检查新输出之前,请等待大约五到十分钟。
现在,您的集群已成功验证,让我们在集群上安排一个 Nginx 应用示例。
第7步:在集群上运行应用程序
现在您可以将任何集装箱应用程序部署到您的集群中。 为了让事情熟悉,让我们使用 Deployments 和 Services 部署 Nginx,看看该应用程序如何部署到集群中。
仍然在主节点中,执行以下命令创建一个名为nginx
的部署:
1kubectl create deployment nginx --image=nginx
部署是一种类型的 Kubernetes 对象,可确保根据定义的模板始终有特定数量的 pods 运行,即使在集群的生命周期中,pod 会崩溃。
接下来,运行以下命令来创建一个名为nginx
的服务,它将通过一个 NodePort 来公开曝光应用程序。
1kubectl expose deploy nginx --port 80 --target-port 80 --type NodePort
服务是另一种类型的Kubernetes对象,它们向内部和外部客户端暴露集群内部服务,它们还能够对多个Pod进行负载平衡请求,并且是Kubernetes的组成部分,经常与其他组件相互作用。
运行以下命令:
1kubectl get services
这将输出类似于以下的文本:
1[secondary_label Output]
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1d
4nginx NodePort 10.109.228.209 <none> 80:nginx_port/TCP 40m
从上述输出的第三行,您可以获取 Nginx 正在运行的端口,Kubernetes 将自动分配一个大于30000
的随机端口,同时确保该端口尚未被另一个服务绑定。
要测试一切是否正常工作,请通过本地机器的浏览器访问http://worker_1_ip:nginx_port或http://worker_2_ip:nginx_port。您将看到 Nginx 熟悉的欢迎页面。
如果您想删除 Nginx 应用程序,请先从主节点中删除nginx
服务:
1kubectl delete service nginx
执行以下操作以确保该服务已被删除:
1kubectl get services
您将看到以下结果:
1[secondary_label Output]
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1d
然后删除部署:
1kubectl delete deployment nginx
运行以下操作来确认这是有效的:
1kubectl get deployments
1[secondary_label Output]
2No resources found.
结论
在本指南中,您已成功在 CentOS 7 上设置了 Kubernetes 集群,使用 Kubeadm 和 Ansible 进行自动化。
如果您想知道如何使用集群现在它已经设置了,一个好的下一步将是方便地部署自己的应用程序和服务到集群中。
- [Dockersizing applications] (https://docs.docker.com/engine/examples/]] - 列出详细使用Docker将应用程序容器化的例子.
- [Pod Overview] (https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/)- 详细描述Pods是如何工作的及其与其他Kubernetes对象的关系. Pods在Kubernetes中是无所不在的,所以理解它们会促进你的工作.
- 部署概况 -- -- 这概述了部署情况。 有必要了解诸如部署等控制器是如何起作用的,因为这些控制器经常被用于无国籍的应用程序中,用于缩放和自动治愈不健康的应用程序。
- [服务概况] (https://kubernetes.io/docs/concepts/services-networking/service/) - 这涵盖服务,这是Kubernetes集群中另一个常用的对象. 了解服务类型及其选择对于处理无国籍和状态申请都至关重要。 .
您可以查看的其他重要概念是 Volumes, Ingresses和 Secrets,所有这些都是在部署生产应用程序时非常有用的。
Kubernetes 有很多功能和功能可供提供。 Kubernetes 官方文档是了解概念,找到特定任务的指南和搜索各种对象的 API 参考的最佳场所。