草庐IT

使用 Kubespray 安装 Kubernetes 集群

Pradeep Kumar 2023-03-30 原文

此页面上的分步指南将向你展示如何在 Linux 系统上使用 Kubespray 安装 Kubernetes 集群。

Kubespray 是一个自由开源的工具,它提供了 Ansible 剧本playbook

它支持一系列操作系统,包括 Ubuntu、CentOS、Rocky Linux 和 Red Hat Enterprise Linux(RHEL),它可以在各种平台上部署 Kubernetes,包括裸机、公共云和私有云。

在本指南中,我们使用以下实验室:

  • Ansible 节点(Kubespray 节点):最小安装的 Ubuntu 22.04 LTS(192.168.1.240)
  • 3 个控制器节点:最小安装的 Rocky Linux 9(192.168.1.241/242/243)
  • 2 个工作节点:最小安装的 Rocky Linux 9(192.168.1.244/245)

Kubespray 的最低系统要求

  • 主节点:1500 MB RAM、2 个 CPU 和 20 GB 可用磁盘空间
  • 工作节点:1024 MB、2 个 CPU、20 GB 可用磁盘空间
  • Ansible 节点:1024 MB、1 个 CPU 和 20 GB 磁盘空间
  • 每个节点上的互联网连接
  • 拥有 sudo 管理员权限

事不宜迟,让我们深入了解安装步骤。

步骤 1)配置 Kubespray 节点

登录到你的 Ubuntu 22.04 系统并安装 Ansible。运行以下一组命令:

$ sudo apt update
$ sudo apt install git python3 python3-pip -y
$ git clone https://github.com/kubernetes-incubator/kubespray.git
$ cd kubespray
$ pip install -r requirements.txt

验证 Ansible 版本,运行:

$ ansible --version

创建主机清单,运行以下命令,不要忘记替换适合你部署的 IP 地址:

$ cp -rfp inventory/sample inventory/mycluster
$ declare -a IPS=(192.168.1.241 192.168.1.241 192.168.1.242 192.168.1.243 192.168.1.244 192.168.1.245)
$ CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}

修改清单文件,设置 3 个控制节点和 2 个工作节点:

$ vi inventory/mycluster/hosts.yaml

保存并关闭文件。

查看并修改文件 ​​inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml​​ 中的以下参数:

kube_version: v1.26.2
kube_network_plugin: calico
kube_pods_subnet: 10.233.64.0/18
kube_service_addresses: 10.233.0.0/18
cluster_name: linuxtechi.local

要启用 Kuberenetes 仪表板和入口控制器等插件,请在文件 ​​inventory/mycluster/group_vars/k8s_cluster/addons.yml​​ 中将参数设置为已启用:

$ vi inventory/mycluster/group_vars/k8s_cluster/addons.yml
dashboard_enabled: true
ingress_nginx_enabled: true
ingress_nginx_host_network: true

保存并退出文件。

步骤 2)将 SSH 密钥从 Ansible 节点复制到所有其他节点

首先在你的 Ansible 节点上为你的本地用户生成 SSH 密钥:

$ ssh-keygen

使用 ​​ssh-copy-id​​ 命令复制 SSH 密钥:

$ ssh-copy-id sysops@192.168.1.241
$ ssh-copy-id sysops@192.168.1.242
$ ssh-copy-id sysops@192.168.1.243
$ ssh-copy-id sysops@192.168.1.244
$ ssh-copy-id sysops@192.168.1.245

还要在每个节点上运行以下命令:

$ echo "sysops ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/sysops

步骤 3)禁用防火墙并启用 IPV4 转发

要在所有节点上禁用防火墙,请从 Ansible 节点运行以下 ​​ansible​​ 命令:

$ cd kubespray
$ ansible all -i inventory/mycluster/hosts.yaml -m shell -a "sudo systemctl stop firewalld && sudo systemctl disable firewalld"

运行以下 ​​ansible​​ 命令以在所有节点上启用 IPv4 转发和禁用交换:

$ ansible all -i inventory/mycluster/hosts.yaml -m shell -a "echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf"
$ ansible all -i inventory/mycluster/hosts.yaml -m shell -a "sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab && sudo swapoff -a"

步骤 4)启动 Kubernetes 部署

现在,我们都准备好开始 Kubernetes 集群部署,从 Ansible 节点运行下面的 Ansible 剧本:

$ cd kubespray
$ ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root cluster.yml

现在监控部署,可能需要 20 到 30 分钟,具体取决于互联网速度和硬件资源。

部署完成后,我们将在屏幕上看到以下输出:

很好,上面的输出确认部署已成功完成。

步骤 5)访问 Kubernetes 集群

登录到第一个主节点,切换到 root 用户,在那里运行 ​​kubectl​​ 命令:

$ sudo su -
# kubectl get nodes
# kubectl get pods -A

输出:

完美,上面的输出确认集群中的所有节点都处于就绪状态,并且所有命名空间的 容器荚Pod

让我们尝试部署基于 Nginx 的部署并将其公开为节点端口,运行以下 ​​kubectl​​ 命令:

$ kubectl create deployment demo-nginx-kubespray --image=nginx --replicas=2
$ kubectl expose deployment demo-nginx-kubespray --type NodePort --port=80
$ kubectl get deployments.apps
$ kubectl get pods
$ kubectl get svc demo-nginx-kubespray

以上命令的输出:

现在尝试使用工作节点的 IP 地址和节点端口(30050)访问此 Nginx 应用。

使用以下 ​​curl​​ 命令或 Web 浏览器访问此应用。

$ curl 192.168.1.245:30050

或者,

完美,这证实了应用可以在我们的集群之外访问。

步骤 6)Kubernetes 仪表板(GUI)

要访问 Kubernetes 仪表板,让我们首先创建服务帐户并分配管理员权限,以便它可以使用令牌访问仪表板。

在 kube-system 命名空间中创建名为 “admin-user” 的服务帐户:

$ vi dashboard-adminuser.yml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system

保存并关闭文件。

$ kubectl apply -f dashboard-adminuser.yml
serviceaccount/admin-user created

创建集群角色绑定:

$ vi admin-role-binding.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system

保存并退出文件。

$ kubectl apply -f admin-role-binding.yml
clusterrolebinding.rbac.authorization.k8s.io/admin-user created

现在,为管理员用户创建令牌:

$ kubectl -n kube-system  create token admin-user

复制此令牌并将其放在安全的地方,因为我们将使用令牌登录 Kubernetes 仪表板。

使用以下 ​​ssh​​ 命令从你的系统连接到第一个主节点:

$ ssh -L8001:localhost:8001 sysops@192.168.1.241

注意:替换适合你环境的 IP 地址。

登录后,切换到 root 用户并运行 ​​kubectl proxy​​ 命令:

$ sudo su -
# kubectl proxy
Starting to serve on 127.0.0.1:8001

打开系统的网络浏览器,如下设置代理:

完成代理设置后,将以下网址粘贴到浏览器中:

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#/login

选择令牌登录并粘贴你在上面为管理员用户生成的令牌,然后单击“登录Sign in”。

这就是本指南的全部内容,我希望你能从中找到有用的信息。

有关使用 Kubespray 安装 Kubernetes 集群的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐