时间: 2020-09-03 00:08:26 人气: 2278 评论: 0
介绍
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以确保它正确运行。
在本节中,您将在本地计算机上创建一个用作工作区的目录。您还将在本地配置Ansible,以便它可以与远程服务器上的命令进行通信。为此,您将创建一个hosts文件包,其包含例如服务器的IP地址和每个服务器所属的组等信息。
在三台服务器中,一台服务器将作为主服务器master_ip。另外两台服务器则是是工作节点,并拥有IPworker_1_ip和worker_2_ip。
在本地计算机的主目录中创建一个名为~/kube-cluster/hosts的目录并进入其中:
mkdir ~/kube-cluster cd ~/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=root worker2 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用户。
在设置服务器清单之后,让我们继续安装操作系统级依赖关系并创建配置设置。
在本节中,您将使用CentOS的yum软件包管理器安装Kubernetes所需的软件包。这些包是:
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
文件中的的第一部分内容如下:
sysctl值。这将允许Kubernetes设置iptables规则,以便在节点上接收桥接的IPv4和IPv6网络流量。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命令。
现在安装了所有系统依赖项。让我们设置主节点并初始化集群。
在本节中,您将设置主节点。然而在创建配置之前,我们需要熟悉几个概念,如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 VERSION master Ready master 1d v1.10.1