在前一篇文章中,我们介绍了 Debian Stretch 环境下,Kubernetes 集群安装的准备工作。本文我们将继续介绍 k8s集群 的安装配置工作。

第4步 - 设置主节点
在本节中,您将设置主节点。 但是,在创建任何Playbooks之前,值得介绍一些概念,例如Pod和Pod网络插件 ,因为您的群集将同时包含这两个概念。
pod是运行一个或多个容器的原子单元。 这些容器共享资源,例如文件卷和网络接口。 Pod是Kubernetes中的基本调度单元:pod中的所有容器都保证在调度pod的同一节点上运行。
每个pod都有自己的IP地址,一个节点上的pod应该能够使用pod的IP访问另一个节点上的pod。 单个节点上的容器可以通过本地接口轻松进行通信。 然而,pod之间的通信更复杂,并且需要单独的网络组件,该组件可以透明地将来自一个节点上的pod的流量路由到另一个节点上的pod。
此功能由pod网络插件提供。 对于这个群集,您将使用Flannel ,一个稳定且高性能的选项。
在本地计算机上创建一个名为master.yml的Ansible playbook:
nano ~/kube-cluster/master.yml
将以下播放添加到文件以初始化集群并安装Flannel:〜/ KUBE群集/ master.yml
- hosts: master
become: yes
tasks:
- name: initialize the cluster
shell: kubeadm init --pod-network-cidr=10.244.0.0/16 >> cluster_initialized.txt
args:
chdir: $HOME
creates: cluster_initialized.txt
- name: create .kube directory
become: yes
become_user: sammy
file:
path: $HOME/.kube
state: directory
mode: 0755
- name: copy admin.conf to user's kube config
copy:
src: /etc/kubernetes/admin.conf
dest: /home/sammy/.kube/config
remote_src: yes
owner: sammy
- name: install Pod network
become: yes
become_user: sammy
shell: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml >> pod_network_setup.txt
args:
chdir: $HOME
creates: pod_network_setup.txt
这是这个戏剧的细分:
- 第一个任务是通过运行
kubeadm init初始化集群。 传递参数--pod-network-cidr=10.244.0.0/16指定将从中分配pod IP的私有子网。 法兰绒默认使用上述子网; 我们告诉kubeadm使用相同的子网。 - 第二个任务在
/home/sammy创建一个.kube目录。 此目录将保存配置信息,例如连接到群集所需的管理密钥文件以及群集的API地址。 - 第三个任务将从
kubeadm init生成的/etc/kubernetes/admin.conf文件复制到非root用户的主目录。 这将允许您使用kubectl访问新创建的集群。 - 最后一个任务运行
kubectl apply安装Flannel。kubectl apply -f descriptor.[yml|json]是告诉kubectl创建描述descriptor.[yml|json]文件中descriptor.[yml|json]的对象的语法。kube-flannel.yml文件包含在集群中设置Flannel所需的对象的描述。
完成后保存并关闭文件。
通过运行本地执行Playbook:
ansible-playbook -i hosts ~/kube-cluster/master.yml
完成后,您将看到类似于以下内容的输出:
Output PLAY [master] **** TASK [Gathering Facts] **** ok: [master] TASK [initialize the cluster] **** changed: [master] TASK [create .kube directory] **** changed: [master] TASK [copy admin.conf to user's kube config] ***** changed: [master] TASK [install Pod network] ***** changed: [master] PLAY RECAP **** master : ok=5 changed=4 unreachable=0 failed=0
要检查主节点的状态,请使用以下命令通过SSH连接到该节点:
ssh sammy@master_ip
进入主节点后,执行:
kubectl get nodes
您现在将看到以下输出:
OutputNAME STATUS ROLES AGE VERSION master Ready master 1d v1.14.0
输出指出master节点已完成所有初始化任务并处于Ready状态,从该状态开始,它可以开始接受工作节点并执行发送到API服务器的任务。 您现在可以从本地计算机添加工作程序。
第5步 - 设置工作节点
将工作程序添加到集群涉及在每个集群上执行单个命令。 此命令包括必要的群集信息,例如主服务器API服务器的IP地址和端口以及安全令牌。 只有传入安全令牌的节点才能加入群集。
导航回您的工作区并创建一个名为workers.yml的剧本:
nano ~/kube-cluster/workers.yml
将以下文本添加到文件中以将工作程序添加到集群:〜/ KUBE群集/ workers.yml
- hosts: master
become: yes
gather_facts: false
tasks:
- name: get join command
shell: kubeadm token create --print-join-command
register: join_command_raw
- name: set join command
set_fact:
join_command: "{{ join_command_raw.stdout_lines[0] }}"
- hosts: workers
become: yes
tasks:
- name: join cluster
shell: "{{ hostvars['master'].join_command }} >> node_joined.txt"
args:
chdir: $HOME
creates: node_joined.txt
这是剧本的作用:
- 第一个play获取需要在worker节点上运行的join命令。 此命令将采用以下格式:
kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>。 一旦它获得具有适当的令牌和哈希值的实际命令,该任务就将其设置为事实,以便下一个游戏将能够访问该信息。 - 第二个游戏有一个任务,它在所有工作节点上运行join命令。 完成此任务后,两个工作节点将成为群集的一部分。
完成后保存并关闭文件。
通过本地运行执行playbook:
ansible-playbook -i hosts ~/kube-cluster/workers.yml
完成后,您将看到类似于以下内容的输出:
OutputPLAY [master] **** TASK [get join command] **** changed: [master] TASK [set join command] ***** ok: [master] PLAY [workers] ***** TASK [Gathering Facts] ***** ok: [worker1] ok: [worker2] TASK [join cluster] ***** changed: [worker1] changed: [worker2] PLAY RECAP ***** master : ok=2 changed=1 unreachable=0 failed=0 worker1 : ok=2 changed=1 unreachable=0 failed=0 worker2 : ok=2 changed=1 unreachable=0 failed=0
通过添加工作节点,您的群集现在已完全设置并正常运行,工作人员可以准备好运行工作负载。 在安排应用程序之前,让我们验证群集是否按预期工作。
第6步 - 验证群集
集群有时可能在安装过程中失败,因为节点已关闭或主服务器与工作服务器之间的网络连接无法正常工作。 让我们验证集群并确保节点正常运行。
您需要从主节点检查群集的当前状态,以确保节点已准备就绪。 如果从主节点断开连接,则可以使用以下命令通过SSH将其重新连接到主节点:
ssh sammy@master_ip
然后执行以下命令以获取集群的状态:
kubectl get nodes
您将看到类似于以下内容的输出:
OutputNAME STATUS ROLES AGE VERSION master Ready master 1d v1.14.0 worker1 Ready1d v1.14.0 worker2 Ready 1d v1.14.0
如果所有节点都具有Ready for STATUS值,则表示它们是群集的一部分并准备好运行工作负载。
但是,如果一些节点将NotReady作为STATUS ,则可能意味着工作节点尚未完成其设置。 等待大约五到十分钟,然后重新运行kubectl get nodes并检查新输出。 如果少数节点仍具有NotReady作为状态,则可能必须验证并重新运行前面步骤中的命令。
现在您的集群已成功验证,让我们在集群上安排一个示例Nginx应用程序。
第7步 - 在群集上运行应用程序
您现在可以将任何容器化应用程序部署到您的群集。 为了保持熟悉,让我们使用部署和服务部署Nginx,以了解如何将此应用程序部署到集群。 如果更改Docker映像名称和任何相关标志(如ports和volumes ),也可以将以下命令用于其他容器化应用程序。
仍在主节点内,执行以下命令以创建名为nginx的部署:
kubectl create deployment nginx --image=nginx
部署是一种Kubernetes对象,可确保始终根据已定义的模板运行指定数量的pod,即使pod在群集生命周期内崩溃也是如此。 上面的部署将使用Docker注册表的Nginx Docker Image创建一个包含一个容器的pod。
接下来,运行以下命令以创建名为nginx的服务,该服务将公开公开该应用程序。 它将通过NodePort实现 ,该方案将通过在群集的每个节点上打开的任意端口访问pod:
kubectl expose deploy nginx --port 80 --target-port 80 --type NodePort
服务是另一种类型的Kubernetes对象,它向内部和外部客户端公开集群内部服务。 它们还能够对多个pod进行负载均衡请求,并且是Kubernetes中不可或缺的组件,经常与其他组件交互。
运行以下命令:
kubectl get services
这将输出类似于以下内容的文本:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1443/TCP 1d nginx NodePort 10.109.228.209 80:nginx_port/TCP 40m
从上面输出的第三行,您可以检索运行Nginx的端口。 Kubernetes将自动分配一个大于30000的随机端口,同时确保该端口尚未受到其他服务的约束。
要测试一切是否正常,请通过本地计算机上的浏览器访问http:// worker_1_ip : nginx_port或http://worker_2_ip : nginx_port 。 您将看到Nginx熟悉的欢迎页面。
如果要删除Nginx应用程序,请先从主节点删除nginx服务:
kubectl delete service nginx
运行以下命令以确保已删除该服务:
kubectl get services
您将看到以下输出:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1443/TCP 1d
然后删除部署:
kubectl delete deployment nginx
运行以下命令以确认这是否有效:
kubectl get deployments
OutputNo resources found.
结论
在本指南中,您已使用Kubeadm和Ansible成功在Debian 9上设置Kubernetes集群以实现自动化。
如果您想知道如何在群集设置的情况下对群集进行操作,那么下一步就是将自己的应用程序和服务部署到群集上。 这是一个链接列表,其中包含可以指导您完成此过程的更多信息:
- Dockerizing应用程序 - 列出了详细说明如何使用Docker对应用程序进行容器化的示例。
- Pod概述 - 详细描述了Pod如何工作以及它们与其他Kubernetes对象的关系。 豆荚在Kubernetes中无处不在,因此了解它们将有助于您的工作。
- 部署概述 - 提供部署概述 。 了解部署控制器如何工作非常有用,因为它们在无状态应用程序中经常用于扩展和不健康应用程序的自动修复。
- 服务概述 - 涵盖服务,Kubernetes集群中另一个常用对象。 了解服务类型及其选项对于运行无状态和有状态应用程序至关重要。
您可以研究的其他重要概念是Volumes , Ingresses和Secrets ,所有这些在部署生产应用程序时都会派上用场。
Kubernetes提供了许多功能和特性。 Kubernetes官方文档是了解概念,查找特定于任务的指南以及查找各种对象的API参考的最佳位置。
