Debian 9 使用kubeadm创建 k8s 集群(上)

· · 1627 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

本教程使用的是 Kubernetes 1.14版,这是本文发布时的官方支持版本。 有关最新版本的最新信息,请参阅官方Kubernetes文档中的当前发行说明 。

Debian 9 使用kubeadm创建 k8s 集群(上)

Kubeadm自动安装和配置Kubernetes组件,例如API服务器,Controller Manager和Kube DNS。 但是,它不会创建用户或处理操作系统级依赖关系及其配置的安装。 对于这些初步任务,可以使用AnsibleSaltStack等配置管理工具。使用这些工具可以更加简单地创建其他集群或重新创建现有集群,并且不易出错。

在本指南中,您将使用Ansible和Kubeadm从头开始设置Kubernetes集群,然后将容器化的Nginx应用程序部署到它。

目标

您的群集将包含以下物理资源:

  • 一个主节点

主节点(Kubernetes中的节点指服务器)负责管理集群的状态。 它运行Etcd ,它在将工作负载调度到工作节点的组件之间存储集群数据。

  • 两个工人节点

工作节点是运行工作负载 (即容器化应用程序和服务)的服务器。 一旦工作人员分配了工作负载,工作人员将继续运行您的工作负载,即使主计划在调度完成后停止工作也是如此。 通过添加工作人员可以增加群集的容量。

完成本指南后,如果群集中的服务器具有足够的CPU和RAM资源供应用程序使用,您将拥有一个可以运行容器化应用程序的集群。 几乎任何传统的Unix应用程序(包括Web应用程序,数据库,守护程序和命令行工具)都可以进行容器化,并在集群上运行。 群集本身将在每个节点上消耗大约300-500MB的内存和10%的CPU。

设置群集后,您将向其部署Web服务器Nginx ,以确保它正确运行工作负载。

先决条件

第1步 - 设置工作区目录和Ansible清单文件

在本节中,您将在本地计算机上创建一个用作工作区的目录。 您将在本地配置Ansible,以便它可以与远程服务器上的命令通信并执行命令。 完成后,您将创建一个包含库存信息的hosts文件,例如服务器的IP地址和每个服务器所属的组。

在三台服务器中,一台服务器将成为主服务器,其IP显示为master_ip 。 其他两个服务器将是worker,并且将具有IP worker_1_ipworker_2_ip 。

在本地计算机的主目录中创建一个名为~/kube-cluster的目录并将其cd入其中:

mkdir ~/kube-cluster
cd ~/kube-cluster

该目录将成为本教程其余部分的工作区,并包含所有Ansible Playbook。 它也将是您将在其中运行所有本地命令的目录。

使用nano或您喜欢的文本编辑器创建名为~/kube-cluster/hosts文件:

nano ~/kube-cluster/hosts

将以下文本添加到文件中,该文件将指定有关群集逻辑结构的信息:〜/ KUBE群集/主机

[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

[all:vars]
ansible_python_interpreter=/usr/bin/python3

您可能还记得Ansible中的库存文件用于指定服务器信息,例如IP地址,远程用户和服务器分组,以作为执行命令的单个单元进行目标。 ~/kube-cluster/hosts将是您的库存文件,并且您已向其添加了两个Ansible组( 主服务器工作者 ),用于指定集群的逻辑结构。

服务器组中,有一个名为“master”的服务器条目,列出主节点的IP( master_ip ),并指定Ansible应以root用户身份运行远程命令。

同样,在workers组中,有两个工作服务器条目( worker_1_ipworker_2_ip ),它们也将ansible_user指定为root。

该文件的最后一行告诉Ansible使用远程服务器的Python 3解释器进行管理操作。

添加文本后保存并关闭文件。

使用组设置服务器清单后,我们继续安装操作系统级依赖关系并创建配置设置。

第2步 - 在所有远程服务器上创建非root用户

在本节中,您将在所有服务器上创建一个具有sudo权限的非root用户,以便您可以作为非特权用户手动SSH连接到这些用户。 例如,如果您希望使用top/htop等命令查看系统信息,查看正在运行的容器列表或更改root拥有的配置文件,这将非常有用。 这些操作通常在维护群集期间执行,并且使用非root用户执行此类任务可以最大程度地降低修改或删除重要文件或无意中执行其他危险操作的风险。

在工作区中创建名为~/kube-cluster/initial.yml的文件:

nano ~/kube-cluster/initial.yml

接下来,将以下播放添加到该文件以创建在所有服务器上具有sudo权限的非root用户。 Ansible中的游戏是针对特定服务器和组执行的一系列步骤。 以下播放将创建一个非root sudo用户:〜/ KUBE群集/ initial.yml

- hosts: all
  become: yes
  tasks:
    - name: create the 'sammy' user
      user: name=sammy append=yes state=present createhome=yes shell=/bin/bash

    - name: allow 'sammy' to have passwordless sudo
      lineinfile:
        dest: /etc/sudoers
        line: 'sammy ALL=(ALL) NOPASSWD: ALL'
        validate: 'visudo -cf %s'

    - name: set up authorized keys for the sammy user
      authorized_key: user=sammy key="{{item}}"
      with_file:
        - ~/.ssh/id_rsa.pub

这是这个剧本的作用细分:

  • 创建非root用户sammy 。
  • 配置sudoers文件以允许sammy用户在没有密码提示的情况下运行sudo命令。
  • 将本地计算机中的~/.ssh/id_rsa.pub (通常为~/.ssh/id_rsa.pub )添加到远程sammy用户的授权密钥列表中。 这将允许您以sammy用户身份SSH到每个服务器。

添加文本后保存并关闭文件。

接下来,通过本地运行执行playbook:

ansible-playbook -i hosts ~/kube-cluster/initial.yml

该命令将在两到五分钟内完成。 完成后,您将看到类似于以下内容的输出:

OutputPLAY [all] ****

TASK [Gathering Facts] ****
ok: [master]
ok: [worker1]
ok: [worker2]

TASK [create the 'sammy' user] ****
changed: [master]
changed: [worker1]
changed: [worker2]

TASK [allow 'sammy' user to have passwordless sudo] ****
changed: [master]
changed: [worker1]
changed: [worker2]

TASK [set up authorized keys for the sammy user] ****
changed: [worker1] => (item=ssh-rsa AAAAB3...)
changed: [worker2] => (item=ssh-rsa AAAAB3...)
changed: [master] => (item=ssh-rsa AAAAB3...)

PLAY RECAP ****
master                     : ok=5    changed=4    unreachable=0    failed=0   
worker1                    : ok=5    changed=4    unreachable=0    failed=0   
worker2                    : ok=5    changed=4    unreachable=0    failed=0   

现在初步设置已完成,您可以继续安装特定于Kubernetes的依赖项。

第3步 - 安装Kubernetes依赖项

在本节中,您将使用Debian的软件包管理器安装Kubernetes所需的操作系统级软件包。 这些包是:

  • Docker - 容器运行时。 它是运行容器的组件。 Kubernetes正在积极开发对rkt等其他运行时的支持。
  • kubeadm - 一个CLI工具,它将以标准方式安装和配置集群的各个组件。
  • kubelet - 一个在所有节点上运行并处理节点级操作的系统服务/程序。
  • kubectl - 一种CLI工具,用于通过其API服务器向集群发出命令。

在工作区中创建一个名为~/kube-cluster/kube-dependencies.yml的文件:

nano ~/kube-cluster/kube-dependencies.yml

将以下播放添加到文件以将这些包安装到您的服务器:〜/ KUBE群集/ KUBE-dependencies.yml

- hosts: all
  become: yes
  tasks:
   - name: install remote apt deps
     apt:
       name: "{{ item }}"
       state: present
     with_items:
       - apt-transport-https
       - ca-certificates
       - gnupg2
       - software-properties-common

   - name: add Docker apt-key
     apt_key:
       url: https://download.docker.com/linux/debian/gpg
       state: present

   - name: add Docker's APT repository
     apt_repository:
      repo: deb https://download.docker.com/linux/debian stretch stable
      state: present
      filename: 'docker'

   - name: install Docker
     apt:
       name: docker-ce
       state: present
       update_cache: true

   - name: add Kubernetes apt-key
     apt_key:
       url: https://packages.cloud.google.com/apt/doc/apt-key.gpg
       state: present

   - name: add Kubernetes' APT repository
     apt_repository:
      repo: deb http://apt.kubernetes.io/ kubernetes-xenial main
      state: present
      filename: 'kubernetes'

   - name: install kubelet
     apt:
       name: kubelet=1.14.0-00
       state: present
       update_cache: true

   - name: install kubeadm
     apt:
       name: kubeadm=1.14.0-00
       state: present

- hosts: master
  become: yes
  tasks:
   - name: install kubectl
     apt:
       name: kubectl=1.14.0-00
       state: present
       force: yes

剧本中的第一部戏剧如下:

  • 添加依赖项以添加,验证和安装远程存储库中的包。
  • 添加Docker APT存储库的apt-key以进行密钥验证。
  • 安装Docker,容器运行时。
  • 添加Kubernetes APT存储库的apt-key进行密钥验证。
  • 将Kubernetes APT存储库添加到远程服务器的APT源列表中。
  • 安装kubeletkubeadm 。

第二个游戏包含一个在主节点上安装kubectl任务。

注意:虽然Kubernetes文档建议您为您的环境使用最新的Kubernetes稳定版本,但本教程使用特定版本。 这将确保您可以成功地执行这些步骤,因为Kubernetes快速更改,并且最新版本可能无法与本教程一起使用。

完成后保存并关闭文件。

接下来,通过本地运行执行playbook:

ansible-playbook -i hosts ~/kube-cluster/kube-dependencies.yml

完成后,您将看到类似于以下内容的输出:

OutputPLAY [all] ****

TASK [Gathering Facts] ****
ok: [worker1]
ok: [worker2]
ok: [master]

TASK [install Docker] ****
changed: [master]
changed: [worker1]
changed: [worker2]

TASK [install APT Transport HTTPS] *****
ok: [master]
ok: [worker1]
changed: [worker2]

TASK [add Kubernetes apt-key] *****
changed: [master]
changed: [worker1]
changed: [worker2]

TASK [add Kubernetes' APT 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]

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, kubeadmkubelet将安装在所有远程服务器上。 kubectl不是必需组件,仅用于执行集群命令。 在此上下文中仅在主节点上安装它是有意义的,因为您将kubectl主服务器运行kubectl命令。 但是,请注意, kubectl命令可以从任何工作节点运行,也可以从可以安装和配置为指向集群的任何计算机运行。

现在已安装所有系统依赖项。 继续阅读本文下半部分,完成主节点的设置并初始化集群。

关注本站微信公众号(和以上内容无关)InfraPub ,扫码关注:InfraPub

1627 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传