登录  | 加入社区

黑狼游客您好!登录后享受更多精彩

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

查看: 616|回复: 0

如安在CentOS上创建Kubernetes集群

[复制链接]

187

主题

187

帖子

0

现金

黑狼菜鸟

Rank: 1

积分
0
发表于 2019-2-9 00:36:02 | 显示全部楼层 |阅读模式 来自 中国
先容
Kubernetes(常简称为K8s)是用于主动摆设、扩展和管理容器化(containerized)应用步伐的开源体系。Google计划并捐赠给Linux基金会来利用的。它旨在提供“跨主机集群的主动摆设、扩展以及运行应用步伐容器的平台”。它支持一系列容器工具, 包罗Docker等。
Kubeadm是 Kubernetes 官方推出的摆设工具 ,比方API服务器,Controller Manager和Kube DNS,该工具实作雷同Docker swarm 一样的摆设方式,透过初始化Master 节点来提供给Node快速参加。但是,它的缺点也很显着,它不会创建用户或处置惩罚操纵体系级依靠关系及其设置的安装。对于这些步调,可以利用Ansible或SaltStack等设置管理工具。利用这些工具可以更轻松地更改其他集群或重新创建现有集群。
在本教程中,您将利用Ansible和Kubeadm重新开始设置Kubernetes集群,然后给它摆设一个容器化的Nginx步伐。
目的

您的聚集将包罗以下物理资源:

  • 一个主节点
主节点(Kubernetes中的节点指的是服务器)负责管理集群的状态。我们将用它运行Etcd,该服务器目标是将工作负载调理到工作节点的组件之间存储集群数据。

  • 两个工作节点
工作节点是运行工作负载(即容器化应用步伐和服务)的服务器。一旦工作节点分配了工作负载,工作节点将继承运行您的工作负载,纵然筹划在调理完成后制止工作也是云云。通过添加工作节点可以增长聚集的容量。
完本钱教程后,您将拥有一个可以运行容器化应用步伐的集群,条件是集群中的服务用具有充足的CPU和RAM资源供应用步伐利用。险些任何传统的Unix应用步伐(包罗Web应用步伐,数据库,保卫步伐和下令行工具)都可以举行容器化,并在集群上运行。聚集自己将在每个节点上斲丧约莫300-500MB的内存和10%的CPU。
设置聚集后,您将摆设Web服务器Nginx以确保它精确运行。
预备


  • 当地Linux / macOS /BSD盘算机上的SSH密钥对。假如您之前没有利用过SSH密钥,同时利用的是腾讯云的服务器的话,请参考创建 SSH 密钥文档。假如您利用的不是腾讯云的服务器,请自行搜刮,本文暂不涉及。本教程的当地盘算机是Linux操纵体系,请勿利用Windows举行试验。
  • 运行CentOS 7的三台服务器,内存至少为1GB。没有服务器的同砚可以在这里购买,不外我个人更保举您利用免费的腾讯云开辟者实行室举行试验,学会安装后在购买服务器。您应该可以或许以SSH密钥对的root用户身份SSH到每个服务器。请务必将您的公钥添加到主节点上的centos用户帐户。假如您必要有关向特定用户帐户添加SSH密钥的引导,请参阅密钥绑定/解绑服务器文档。
  • Ansible必要安装在您的当地盘算机上。有关安装阐明,请按照Ansible官方安装文档。
  • 相识怎样从Docker镜像启动容器。假如必要复习,请参阅怎样安装利用Docker的“第5步 - 运行Docker容器” 。
第1步 - 设置工作区目次和Ansible设置

在本节中,您将在当地盘算机上创建一个用作工作区的目次。您还将在当地设置Ansible,以便它可以与长途服务器上的下令举行通讯。为此,您将创建一个hosts文件包,其包罗比方服务器的IP地点和每个服务器所属的组等信息。
在三台服务器中,一台服务器将作为主服务器master_ip。别的两台服务器则是是工作节点,并拥有IPworker_1_ip和worker_2_ip。
在当地盘算机的主目次中创建一个名为~/kube-cluster/hosts的目次并进入此中:
mkdir ~/kube-clustercd ~/kube-cluster该目次将是本教程的工作区,包罗全部Ansible设置。它也将是您运行全部当地下令的目次。
利用vi下令创建一个名为~/kube-cluster/hosts的文件或用您最喜好的文本编辑器:
vi ~/kube-cluster/hosts按i将以下文本插入到文件中,该文件将指定有关聚集逻辑布局的信息:
[masters]master ansible_host=master_ip ansible_user=root[workers]worker1 ansible_host=worker_1_ip ansible_user=rootworker2 ansible_host=worker_2_ip ansible_user=root完成后,按,ESC然后输入:wq将更改写入文件并退出。
您大概还记得在Ansible中用于指定服务器信息的库存文件,比方IP地点,长途用户和服务器分组,以作为实行下令的单个单位举行目的。~/kube-cluster/hosts将是您的库存文件,而且您已向其添加了两个Ansible组(主服务器和工作服务器),用于指定集群的逻辑布局。
在主服务器组中,有一个名为“master”的服务器,此中列出了主节点的IP(master_ip),并指定Ansible应以根用户身份运行长途下令。
同样,在workers组中,有两个工作服务器(worker_1_ip和worker_2_ip),它们也必要指定ansible_user为root用户。
在设置服务器清单之后,让我们继承安装操纵体系级依靠关系并创建设置设置。
第2步 - 安装Kubernetes的依靠项

在本节中,您将利用CentOS的yum软件包管理器安装Kubernetes所需的软件包。这些包是:

  • Docker - 容器运行时。这是运行容器的组件。Kubernetes正在积极开辟对rkt等其他运行容器服务的支持。
  • kubeadm - CLI工具,以尺度方式安装和设置聚集的各个组件。
  • kubelet - 在全部节点上运行并处置惩罚节点级操纵的体系服务/步伐。
  • kubectl- 通过其API服务器向集群发出下令的CLI工具。
创建工作空间中指定的文件vi ~/kube-cluster/kube-dependencies.yml:
vi ~/kube-cluster/kube-dependencies.yml将下面的内容插到文件内:
- hosts: all  become: yes  tasks:   - name: install Docker     yum:       name: docker       state: present       update_cache: true   - name: start Docker     service:       name: docker       state: started   - name: disable SELinux     command: setenforce 0   - name: disable SELinux on reboot     selinux:       state: disabled   - name: ensure net.bridge.bridge-nf-call-ip6tables is set to 1     sysctl:      name: net.bridge.bridge-nf-call-ip6tables      value: 1      state: present   - name: ensure net.bridge.bridge-nf-call-iptables is set to 1     sysctl:      name: net.bridge.bridge-nf-call-iptables      value: 1      state: present   - name: add Kubernetes' YUM repository     yum_repository:      name: Kubernetes      description: Kubernetes YUM repository      baseurl: https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64      gpgkey: https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg      gpgcheck: yes   - name: install kubelet     yum:        name: kubelet        state: present        update_cache: true   - name: install kubeadm     yum:        name: kubeadm        state: present   - name: start kubelet     service:       name: kubelet       enabled: yes       state: started- hosts: master  become: yes  tasks:   - name: install kubectl     yum:        name: kubectl        state: present文件中的的第一部门内容如下:

  • 容器运行时,安装Docker。
  • 启动Docker服务。
  • 请禁用SELinux,由于Kubernetes尚未完全支持它。
  • 设置网络所需的一些与netfilter相干的sysctl值。这将答应Kubernetes设置iptables规则,以便在节点上吸收桥接的IPv4和IPv6网络流量。
  • 将Kubernetes YUM存储库添加到长途服务器的存储库列表中。
  • 安装kubelet和kubeadm。
第二部门意思是在主节点上设置一下kubectl的使命。
完成后生存并关闭文件。
接下来,实行playbook:
ansible-playbook -i hosts ~/kube-cluster/kube-dependencies.yml完成后,您将看到雷同于以下内容的输出:
PLAY [all] ****TASK [Gathering Facts] ****ok: [worker1]ok: [worker2]ok: [master]TASK [install Docker] ****changed: [master]changed: [worker1]changed: [worker2]TASK [disable SELinux] ****changed: [master]changed: [worker1]changed: [worker2]TASK [disable SELinux on reboot] ****changed: [master]changed: [worker1]changed: [worker2]TASK [ensure net.bridge.bridge-nf-call-ip6tables is set to 1] ****changed: [master]changed: [worker1]changed: [worker2]TASK [ensure net.bridge.bridge-nf-call-iptables is set to 1] ****changed: [master]changed: [worker1]changed: [worker2]TASK [start Docker] ****changed: [master]changed: [worker1]changed: [worker2]TASK [add Kubernetes' YUM 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]TASK [start kubelet] ****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下令。
如今安装了全部体系依靠项。让我们设置主节点并初始化集群。
第3步 - 设置主节点

在本节中,您将设置主节点。然而在创建设置之前,我们必要认识几个概念,如Pods和Pod 网络插件。
Kubernetes的根本调理单位称为“pods”。它可以把更高级别的抽象内容增长到容器化组件。一个pod一样平常包罗一个或多个容器,如许可以包管它们不停位于主机上,而且可以共享资源。Kubernetes中的每个pod都被分配一个唯一的(在集群内的)IP地点如许就可以答应应用步伐利用端口,而不会有辩论的风险。Pod可以界说一个卷,比方当地磁盘目次或网络磁盘,并将其袒露在pod中的一个容器之中。pod可以通过Kubernetes API手动管理,也可以委托给控制器来管理。
每个pod都有本身的IP地点,一个节点上的pod应该可以或许利用pod的IP访问另一个节点上的pod。单个节点上的容器可以通过当地接口轻松举行通讯。然而,pod之间的通讯更复杂,而且必要单独的网络组件,该组件可以透明地将流量从一个节点上的pod传送到另一个节点上的pod。此功能由pod网络插件提供。对于这个聚集,发起您将利用Flannel选项。
在当地盘算机上创建一个定名为master.yml的Ansible playbook :
vi ~/kube-cluster/master.yml将以下内容添加到文件中以初始化集群并安装Flannel:
- 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: centos      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/centos/.kube/config        remote_src: yes        owner: centos    - name: install Pod network      become: yes      become_user: centos      shell: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/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的私有子网。Flannel默认利用上述子网,我们告诉kubeadm利用雷同的子网。
  • 第二个使命创建一个.kube目次在/home/centos。此目次将生存设置信息,比方毗连到聚集所需的管理密钥文件以及聚集的API地点。
  • 第三个使命将/etc/kubernetes/admin.conf天生的文件复制kubeadm init到centos用户的主目次。这将答应您用kubectl访问新创建的聚集。
  • 末了一个使命运行kubectl apply安装Flannel。kubectl apply -f descriptor.[yml|json]是告诉kubectl创建descriptor.[yml|json]文件中形貌的对象的语法。kube-flannel.yml文件包罗Flannel在群会合设置所需的对象的阐明。
完成后生存并关闭文件。实行设置:
ansible-playbook -i hosts ~/kube-cluster/master.yml完成后,您将看到雷同于以下内容的输出:
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 centos@master_ip进入主节点后,实行:
kubectl get nodes您如今将看到以下输出:
NAME      STATUS    ROLES     AGE       VERSIONmaster    Ready     master    1d        v1.10.1输出表明master节点已完成全部初始化使命,而且处于Ready可以开始担当工作节点并实行发送到API服务器的使命的状态。您如今可以从当地盘算机添加工作步伐。
第4步 - 设置工作节点

将工作步伐添加到集群涉及在每个集群上实行单个下令。此下令包罗须要的聚集信息,比方主服务器API服务器的IP地点和端口以及安全令牌。只有传入安全令牌的节点才气参加聚集。
f反回您的工作区并创建一个名为workers.yml的设置:
vi ~/kube-cluster/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以下是设置的作用:

  • 第一个设置获取join下令,以便在worker节点上运行。该下令将接纳以下格式:kubeadm join --token  : --discovery-token-ca-cert-hash sha256:一旦它得到具有的令牌和哈希值的下令,该使命就将其设置为可用,以便下一个设置可以或许访问该信息。
  • 第二个设置有一个使命,它在全部工作节点上运行join下令。完成此使命后,两个工作节点将成为聚集的一部门。
完成后生存并关闭文件。实行设置:
ansible-playbook -i hosts ~/kube-cluster/workers.yml完成后,您将看到雷同于以下内容的输出:
PLAY [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  通过添加工作节点,您的聚集如今已完全设置并正常运行,工作节点可以随时运行工作负载。让我们验证聚集是否按预期工作。
第5步 - 验证聚集

集群偶然大概在安装过程中失败,由于节点已关闭或主服务器与工作服务器之间的网络毗连无法正常工作。让我们验证集群并确保节点正常运行。
您必要从主节点查抄聚集的当前状态,以确保节点已预备停当。假如从主节点断开毗连,则可以利用以下下令通过SSH将其重新毗连到主节点:
ssh centos@master_ip然后实行以下下令以获取集群的状态:
kubectl get nodes您将看到雷同于以下内容的输出:
NAME      STATUS    ROLES     AGE       VERSIONmaster    Ready     master    1d        v1.10.1worker1   Ready         1d        v1.10.1 worker2   Ready         1d        v1.10.1假如全部的节点都具有Ready的STATUS(状态),这意味着它们是集群的一部门,并预备运行工作负载。
但是,假如几个节点拥有NotReady的STATUS(状态),它大概意味着工作节点还没有完成本身的设置。等候约莫五到非常钟再重新运行kubectl get node并查抄新输出。假如一些节点仍具有NotReady状态,则必要验证并重新运行前面步调中的下令。
如今您的集群已乐成验证,让我们在集群上摆设一个示例Nginx应用步伐。
第6步 - 在聚集上运行应用步伐

您如今可以将任何容器化应用步伐摆设到您的聚集。让我们利用摆设和服务摆设Nginx,以相识怎样将此应用步伐摆设到集群。假如更改Docker镜像名称和任何相干标记(比方ports和volumes),您也可以利用以下下令用于其他容器化应用步伐。
在主节点内,实行以下下令以创建名为nginx的摆设:
kubectl run nginx --image=nginx --port 80摆设是一种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这将输出雷同于以下内容的文本:
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP           PORT(S)        AGEkubernetes   ClusterIP   10.96.0.1                        443/TCP        1dnginx        NodePort    10.109.228.209                   80:nginx_port/TCP   40m从上面输出的第三行,您可以检索运行Nginx的端口。Kubernetes将分配一个大于30000主动的随机端口,同时确保该端口尚未受到其他服务的束缚。
要测试统统正常,请访问或通过当地盘算机上的欣赏器。您将看到Nginx认识的接待页面。http://worker_1_ip:nginx_port大概http://worker_2_ip:nginx_port。
假如要删除Nginx应用步伐,请先nginx从主节点删除该服务:
kubectl delete service nginx运行以下下令以确保已删除该服务:
kubectl get services您将看到以下输出:
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP           PORT(S)        AGEkubernetes   ClusterIP   10.96.0.1                        443/TCP        1d然后删除摆设:
kubectl delete deployment nginx运行以下下令以确认这是否有用:
kubectl get deploymentsNo resources found.结论

在本教程中,您已利用Kubeadm和Ansible乐成在CentOS 7上设置Kubernetes集群以实现主动化。
假如您想知道要在集群设置的环境下怎样处置惩罚集群,那么下一步就是将本身的应用步伐和服务摆设到集群上。这是一个链接列表,此中包罗可以引导您完成此过程的更多信息:

  • Dockerizing应用步伐 - 列出了具体阐明怎样利用Docker对应用步伐举行容器化的示例。
  • Pod概述 - 具体形貌了Pod怎样工作以及它们与其他Kubernetes对象的关系。Pods在Kubernetes中无处不在,因此相识它们将有助于您的工作。
  • 摆设概述 - 这提供了摆设的概述。相识摆设之类的控制器怎样有用地工作,由于它们常常在无状态应用步伐中用于扩展和不康健应用步伐的主动修复。
  • 服务概述 - 这包罗服务,Kubernetes集群中另一个常用对象。相识服务范例及其选项对于运行无状态和有状态应用步伐至关紧张。
其他紧张概念是Volumes,Ingresses和Secrets,全部这些在摆设生产应用步伐时都派上用场。Kubernetes提供了很多功能和特性。Kubernetes官方文档是相识概念,查找特定于使命的教程以及查找各种对象的API参考的最佳位置。更多Linux教程请前去腾讯云+社区学习更多知识。假如您以为搭建起来过于繁琐,您也可以利用腾讯云容器服务,腾讯云容器服务基于原生 kubernetes 提供以容器为焦点的、高度可扩展的高性能容器管理服务。腾讯云容器服务完全兼容原生 kubernetes API ,扩展了腾讯云的 CBS、CLB 等 kubernetes 插件,为容器化的应用提供高效摆设、资源调理、服务发现和动态伸缩等一系列完备功能,办理用户开辟、测试及运维过程的情况同等性题目,进步了大规模容器集群管理的便捷性,资助用户低落本钱,进步服从。容器服务提供免费利用,涉及的其他云产物别的单独计费。 更多Linux教程请前去腾讯云+社区学习更多知识。




上一篇:linux安装kvm假造机软件
下一篇:Linux底子教程之一VMware安装Centos7操纵体系
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

 

QQ|申请友链|小黑屋|手机版|Hlshell Inc. ( 豫ICP备16002110号-5 )

GMT+8, 2024-5-9 09:13 , Processed in 0.068692 second(s), 44 queries .

HLShell有权修改版权声明内容,如有任何爭議,HLShell將保留最終決定權!

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表