欢迎你们前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~html
介绍linux
Kubernetes(常简称为K8s)是用于自动部署、扩展和管理容器化(containerized)应用程序的开源系统。Google设计并捐赠给Linux基金会来使用的。它旨在提供“跨主机集群的自动部署、扩展以及运行应用程序容器的平台”。它支持一系列容器工具, 包括Docker等。nginx
Kubeadm是 Kubernetes 官方推出的部署工具 ,例如API服务器,Controller Manager和Kube DNS,该工具实做相似Docker swarm 同样的部署方式,透过初始化Master 节点来提供给Node快速加入。可是,它的缺点也很明显,它不会建立用户或处理操做系统级依赖关系及其配置的安装。对于这些步骤,可使用Ansible或SaltStack等配置管理工具。使用这些工具能够更轻松地更改其余集群或从新建立现有集群。git
在本教程中,您将使用Ansible和Kubeadm从头开始设置Kubernetes集群,而后给它部署一个容器化的Nginx程序。github
您的群集将包含如下物理资源:docker
主节点(Kubernetes中的节点指的是服务器)负责管理集群的状态。咱们将用它运行Etcd,该服务器目的是将工做负载调度到工做节点的组件之间存储集群数据。shell
工做节点是运行工做负载(即容器化应用程序和服务)的服务器。一旦工做节点分配了工做负载,工做节点将继续运行您的工做负载,即便计划在调度完成后中止工做也是如此。经过添加工做节点能够增长群集的容量。数据库
完成本教程后,您将拥有一个能够运行容器化应用程序的集群,前提是集群中的服务器具备足够的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
输出代表master
节点已完成全部初始化任务,而且处于Ready
能够开始接受工做节点并执行发送到API服务器的任务的状态。您如今能够从本地计算机添加工做程序。
将工做程序添加到集群涉及在每一个集群上执行单个命令。此命令包括必要的群集信息,例如主服务器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
如下是配置的做用:
kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>
一旦它得到具备的令牌和哈希值的命令,该任务就将其设置为可用,以便下一个配置可以访问该信息。完成后保存并关闭文件。执行配置:
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
经过添加工做节点,您的群集如今已彻底设置并正常运行,工做节点能够随时运行工做负载。让咱们验证群集是否按预期工做。
集群有时可能在安装过程当中失败,由于节点已关闭或主服务器与工做服务器之间的网络链接没法正常工做。让咱们验证集群并确保节点正常运行。
您须要从主节点检查群集的当前状态,以确保节点已准备就绪。若是从主节点断开链接,则可使用如下命令经过SSH将其从新链接到主节点:
ssh centos@master_ip
而后执行如下命令以获取集群的状态:
kubectl get nodes
您将看到相似于如下内容的输出:
NAME STATUS ROLES AGE VERSION master Ready master 1d v1.10.1 worker1 Ready <none> 1d v1.10.1 worker2 Ready <none> 1d v1.10.1
若是全部的节点都具备Ready
的STATUS
(状态),这意味着它们是集群的一部分,并准备运行工做负载。
可是,若是几个节点拥有NotReady
的STATUS
(状态),它可能意味着工做节点尚未完成本身的设置。等待大约五到十分钟再从新运行kubectl get node
并检查新输出。若是一些节点仍具备NotReady
状态,则须要验证并从新运行前面步骤中的命令。
如今您的集群已成功验证,让咱们在集群上部署一个示例Nginx应用程序。
您如今能够将任何容器化应用程序部署到您的群集。让咱们使用部署和服务部署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) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1d nginx NodePort 10.109.228.209 <none> 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) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1d
而后删除部署:
kubectl delete deployment nginx
运行如下命令以确认这是否有效:
kubectl get deployments
No resources found.
在本教程中,您已使用Kubeadm和Ansible成功在CentOS 7上设置Kubernetes集群以实现自动化。
若是您想知道要在集群设置的状况下如何处理集群,那么下一步就是将本身的应用程序和服务部署到集群上。这是一个连接列表,其中包含能够指导您完成此过程的更多信息:
其余重要概念是Volumes,Ingresses和Secrets,全部这些在部署生产应用程序时都派上用场。Kubernetes提供了许多功能和特性。Kubernetes官方文档是了解概念,查找特定于任务的教程以及查找各类对象的API参考的最佳位置。更多Linux教程请前往腾讯云+社区学习更多知识。
参考文献: 《How To Create a Kubernetes 1.10 Cluster Using Kubeadm on CentOS 7》 《只要用 kubeadm 小朋友都能部署 Kubernetes》
问答
相关阅读
安全报告 | 2018上半年互联网恶意爬虫分析:从全景视角看爬虫与反爬虫
此文已由做者受权腾讯云+社区发布,原文连接:https://cloud.tencent.com/developer/article/1177930?fromSource=waitui
欢迎你们前往腾讯云+社区或关注云加社区微信公众号(QcloudCommunity),第一时间获取更多海量技术实践干货哦~
海量技术实践经验,尽在云加社区!