sách gpt4 ăn đã đi

Ubuntu安装部署Kubernetes(k8s)集群

In lại Tác giả: Tôi là chú chim nhỏ 更新时间:2023-08-16 06:31:06 31 4
mua khóa gpt4 giày nike

Mục lục
  • 1. Môi trường hệ thống
  • 2. Lời nói đầu
  • 三.Kubernetes
    • 3.1 概述
    • 3.2 Kubernetes 组件
      • 3.2.1 控制平面组件
      • 3.2.2 Node组件
  • 四.配置节点的基本环境
  • 五.节点安装docker,并进行相关配置
  • 六.安装kubelet,kubeadm,kubectl
  • 七.kubeadm初始化
  • 八.添加worker节点到k8s集群
  • 九.部署CNI网络插件calico
  • 十.配置kubectl命令tab键自动补全
  • 十一.总结

1. Môi trường hệ thống

本文主要基于Kubernetes1.22.2和Linux操作系统Ubuntu 18.04.

Phiên bản máy chủ phiên bản phần mềm docker Phiên bản cụm Kubernetes (k8s) Kiến trúc CPU
Ubuntu 18.04.5 LTS Docker version 20.10.14 v1.22.2 x86_64

Kubernetes集群架构:k8scludes1作为master节点,k8scludes2,k8scludes3作为worker节点.

máy chủ Phiên bản hệ điều hành Kiến trúc CPU quá trình Mô tả chức năng
k8scludes1/192.168.110.128 Ubuntu 18.04.5 LTS x86_64 docker, kube-apiserver, etcd, kube-scheduler, kube-controller-manager, kubelet, kube-proxy, coredns, calico nút chính k8s
k8scludes2/192.168.110.129 Ubuntu 18.04.5 LTS x86_64 docker, kubelet, proxy kube, calico nút công nhân k8s
k8scludes3/192.168.110.130 Ubuntu 18.04.5 LTS x86_64 docker, kubelet, proxy kube, calico nút công nhân k8s

2. Lời nói đầu

下图描述了软件部署方式的变迁: 传统部署时代 , 虚拟化部署时代 , 容器部署时代 .

image-20220909014039574

传统部署时代 :

早期,各个组织是在物理服务器上运行应用程序。 由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题。 例如,如果在同一台物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。 一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程式资源利用率不高时,剩余资源无法被分配给其他应用程式, 而且维护许多物理服务器的成本很高.

虚拟化部署时代 :

因此,虚拟化技术被引入了。虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机(VM)。 虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性, 因为一个应用程序的信息不能被另一应用程序随意访问.

虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可扩缩性,以及降低硬件成本等等的好处。 通过虚拟化,你可以将一组物理资源呈现为可丢弃的虚拟机集群.

每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统.

容器部署时代 :

容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)。 因此,容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植.

容器因具有许多优势而变得流行起来,例如:

  • 敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
  • 持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性), 提供可靠且频繁的容器镜像构建和部署。
  • 关注开发与运维的分离:在构建、发布时创建应用程序容器镜像,而不是在部署时, 从而将应用程序与基础架构分离。
  • 可观察性:不仅可以显示 OS 级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
  • 跨开发、测试和生产的环境一致性:在笔记本计算机上也可以和在云中运行一样的应用程序。
  • 跨云和操作系统发行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方运行。
  • 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
  • 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分, 并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。
  • 资源隔离:可预测的应用程序性能。
  • 资源利用:高效率和高密度。

在这篇博客中,我们将详细介绍如何在Ubuntu 18.04上安装和部署Kubernetes 1.22.2集群。我们将使用kubeadm工具,这是Kubernetes官方推荐的用于快速部署Kubernetes集群的工具.

如果您的平台在Centos系统上,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Centos7 安装部署Kubernetes(k8s)集群》 https://www.cnblogs.com/renshengdezheli/p/16686769.html.

如果您对Ubuntu系统不熟悉,Ubuntu系统的详细操作,请查看博客《 centos系统和Ubuntu系统命令区别以及常见操作 》.

三.Kubernetes

3.1 概述

Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛.

Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在 Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践.

Kubernetes 为你提供的功能如下:

  1. 服务发现和负载均衡 :Kubernetes 可以使用 DNS 名称或自己的 IP 地址来曝露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
  2. 存储编排 :Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
  3. 自动部署和回滚 :你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
  4. 自动完成装箱计算 :你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。
  5. 自我修复 :Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。
  6. 密钥与配置管理 :Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

3.2 Kubernetes 组件

Kubernetes 集群架构如下:

image-20220911185505198

Kubernetes 集群组件如下:

image-20220909015606030

Kubernetes有两种节点类型:master节点,worker节点 。master节点又称为控制平面(Control Plane)。控制平面有很多组件,控制平面组件会为集群做出全局决策,比如资源的调度。 以及检测和响应集群事件,例如当不满足部署的 replicas 字段时, 要启动新的 pod).

控制平面组件可以在集群中的任何节点上运行。 然而,为了简单起见,设置脚本通常会在同一个计算机上启动所有控制平面组件, 并且不会在此计算机上运行用户容器.

3.2.1 控制平面组件

控制平面组件如下 :

  1. kube-apiserver :API 服务器是 Kubernetes 控制平面的组件, 该组件负责公开了 Kubernetes API,负责处理接受请求的工作。 API 服务器是 Kubernetes 控制平面的前端。
    Kubernetes API 服务器的主要实现是 kube-apiserver。 kube-apiserver 设计上考虑了水平扩缩,也就是说,它可通过部署多个实例来进行扩缩。 你可以运行 kube-apiserver 的多个实例,并在这些实例之间平衡流量。
  2. etcd :etcd 是兼顾一致性与高可用性的键值对数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。你的 Kubernetes 集群的 etcd 数据库通常需要有个备份计划。
  3. kube-scheduler :kube-scheduler 是控制平面的组件, 负责监视新创建的、未指定运行节点(node)的 Pods, 并选择节点来让 Pod 在上面运行。调度决策考虑的因素包括单个 Pod 及 Pods 集合的资源需求、软硬件及策略约束、 亲和性及反亲和性规范、数据位置、工作负载间的干扰及最后时限。
  4. kube-controller-manager :kube-controller-manager 是控制平面的组件, 负责运行控制器进程。从逻辑上讲, 每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在同一个进程中运行。
    这些控制器包括:
    节点控制器(Node Controller):负责在节点出现故障时进行通知和响应
    任务控制器(Job Controller):监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
    端点控制器(Endpoints Controller):填充端点(Endpoints)对象(即加入 Service 与 Pod)
    服务帐户和令牌控制器(Service Account & Token Controllers):为新的命名空间创建默认帐户和 API 访问令牌
  5. cloud-controller-manager :一个 Kubernetes 控制平面组件, 嵌入了特定于云平台的控制逻辑。 云控制器管理器(Cloud Controller Manager)允许你将你的集群连接到云提供商的 API 之上, 并将与该云平台交互的组件同与你的集群交互的组件分离开来。cloud-controller-manager 仅运行特定于云平台的控制器。 因此如果你在自己的环境中运行 Kubernetes,或者在本地计算机中运行学习环境, 所部署的集群不需要有云控制器管理器。
    与 kube-controller-manager 类似,cloud-controller-manager 将若干逻辑上独立的控制回路组合到同一个可执行文件中, 供你以同一进程的方式运行。 你可以对其执行水平扩容(运行不止一个副本)以提升性能或者增强容错能力。
    下面的控制器都包含对云平台驱动的依赖:
    节点控制器(Node Controller):用于在节点终止响应后检查云提供商以确定节点是否已被删除
    路由控制器(Route Controller):用于在底层云基础架构中设置路由
    服务控制器(Service Controller):用于创建、更新和删除云提供商负载均衡器

3.2.2 Node组件

节点组件会在每个节点上运行,负责维护运行的 Pod 并提供 Kubernetes 运行环境.

node组件如下 :

  1. kubelet:kubelet 会在集群中每个节点(node)上运行。 它保证容器(containers)都运行在 Pod 中。kubelet 接收一组通过各类机制提供给它的 PodSpecs, 确保这些 PodSpecs 中描述的容器处于运行状态且健康。 kubelet 不会管理不是由 Kubernetes 创建的容器。
  2. kube-proxy:kube-proxy 是集群中每个节点(node)所上运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。kube-proxy 维护节点上的一些网络规则, 这些网络规则会允许从集群内部或外部的网络会话与 Pod 进行网络通信。如果操作系统提供了可用的数据包过滤层,则 kube-proxy 会通过它来实现网络规则。 否则,kube-proxy 仅做流量转发。

四.配置节点的基本环境

先配置节点的基本环境,3个节点都要同时设置,在此以k8scludes1作为示例.

查看Ubuntu系统版本.

                        
                          root@localhost:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS Release: 18.04 Codename: bionic

                        
                      

首先设置主机名.

                        
                          root@localhost:~# vim /etc/hostname root@localhost:~# cat /etc/hostname k8scludes1

                        
                      

配置节点静态IP地址(可选).

                        
                          root@localhost:~# vim /etc/netplan/01-netcfg.yaml root@localhost:~# cat /etc/netplan/01-netcfg.yaml network: version: 2 renderer: networkd ethernets: ens32: dhcp4: no addresses: [192.168.110.128/24] gateway4: 192.168.110.2 nameservers: addresses: [192.168.110.2,114.114.114.114]

                        
                      

使配置生效.

                        
                          root@localhost:~# netplan apply 

                        
                      

测试机器是否可以访问网络.

                        
                          root@localhost:~# ping www.baidu.com PING www.baidu.com (14.215.177.39) 56(84) bytes of data. 64 bytes from www.baidu.com (14.215.177.39): icmp_seq=1 ttl=128 time=48.0 ms 64 bytes from www.baidu.com (14.215.177.39): icmp_seq=2 ttl=128 time=52.9 ms 64 bytes from www.baidu.com (14.215.177.39): icmp_seq=3 ttl=128 time=39.8 ms ^C --- www.baidu.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2009ms rtt min/avg/max/mdev = 39.843/46.940/52.968/5.417 ms

                        
                      

配置IP地址和主机名映射.

                        
                          root@localhost:~# ifconfig ens32: flags=4163 mtu 1500 inet 192.168.110.128 netmask 255.255.255.0 broadcast 192.168.110.255 inet6 fe80::20c:29ff:fe92:3462 prefixlen 64 scopeid 0x20 ether 00:0c:29:92:34:62 txqueuelen 1000 (Ethernet) RX packets 3600 bytes 909889 (909.8 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 2327 bytes 225443 (225.4 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73 mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1000 (Local Loopback) RX packets 54 bytes 6421 (6.4 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 54 bytes 6421 (6.4 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 root@localhost:~# vim /etc/hosts root@localhost:~# cat /etc/hosts 127.0.0.1 localhost 127.0.1.1 tom 192.168.110.128 k8scludes1 192.168.110.129 k8scludes2 192.168.110.130 k8scludes3 # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters

                        
                      

重启机器之后,主机名变为k8scludes1,另外两台机器也进行相同操作.

k8scludes1可以ping通其他两个节点则成功.

                        
                          root@k8scludes1:~# ping k8scludes1 PING k8scludes1 (192.168.110.128) 56(84) bytes of data. 64 bytes from k8scludes1 (192.168.110.128): icmp_seq=1 ttl=64 time=0.014 ms 64 bytes from k8scludes1 (192.168.110.128): icmp_seq=2 ttl=64 time=0.040 ms 64 bytes from k8scludes1 (192.168.110.128): icmp_seq=3 ttl=64 time=0.058 ms ^C --- k8scludes1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2048ms rtt min/avg/max/mdev = 0.014/0.037/0.058/0.018 ms root@k8scludes1:~# ping k8scludes2 PING k8scludes2 (192.168.110.129) 56(84) bytes of data. 64 bytes from k8scludes2 (192.168.110.129): icmp_seq=1 ttl=64 time=0.465 ms 64 bytes from k8scludes2 (192.168.110.129): icmp_seq=2 ttl=64 time=2.98 ms 64 bytes from k8scludes2 (192.168.110.129): icmp_seq=3 ttl=64 time=2.34 ms ^C --- k8scludes2 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2048ms rtt min/avg/max/mdev = 0.465/1.932/2.983/1.069 ms root@k8scludes1:~# ping k8scludes3 PING k8scludes3 (192.168.110.130) 56(84) bytes of data. 64 bytes from k8scludes3 (192.168.110.130): icmp_seq=1 ttl=64 time=0.450 ms 64 bytes from k8scludes3 (192.168.110.130): icmp_seq=2 ttl=64 time=3.71 ms ^C --- k8scludes3 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1022ms rtt min/avg/max/mdev = 0.450/2.083/3.717/1.634 ms

                        
                      

配置Ubuntu软件源,软件源如下,最后三行是k8s源.

                        
                          root@localhost:~# cat /etc/apt/sources.list deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic stable # deb-src [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic stable

                        
                      

apt-key.gpg是k8s的deb源公钥,加载k8s的deb源公钥命令为:apt-key add apt-key.gpg,下载并加载k8s的deb源公钥命令为:curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - ; apt-get update,但是谷歌的网址访问不了,我们直接去网上下载apt-key.gpg文件.

                        
                          #apt-key.gpg文件下载好了 root@localhost:~# ls apt-key.gpg  

                        
                      

加载k8s的deb源公钥.

                        
                          root@localhost:~# cat apt-key.gpg | apt-key add - OK

                        
                      

更新软件源.

                        
                          root@localhost:~# apt-get update Hit:1 http://mirrors.aliyun.com/ubuntu bionic InRelease Hit:2 http://mirrors.aliyun.com/ubuntu bionic-security InRelease Hit:3 http://mirrors.aliyun.com/ubuntu bionic-updates InRelease Get:4 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease [9,383 B] Hit:5 http://mirrors.aliyun.com/ubuntu bionic-proposed InRelease Hit:6 http://mirrors.aliyun.com/ubuntu bionic-backports InRelease Hit:7 https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic InRelease Ign:8 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages Get:8 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages [54.7 kB] Fetched 54.7 kB in 2s (33.3 kB/s) Reading package lists... Done

                        
                      

关闭防火墙.

                        
                          root@k8scludes1:~# ufw disable Firewall stopped and disabled on system startup

                        
                      

Linux swapoff命令用于关闭系统交换分区(swap area).

注意 :如果不关闭swap,就会在kubeadm初始化Kubernetes的时候报错:“[ERROR Swap]: running with swap on is not supported. Please disable swap”.

                        
                          root@k8scludes1:~# swapoff -a ;sed -i '/swap/d' /etc/fstab root@k8scludes1:~# cat /etc/fstab # /etc/fstab: static file system information. # # Use 'blkid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # #       /dev/mapper/tom--vg-root / ext4 errors=remount-ro 0 1

                        
                      

此时基本环境就配置完毕了.

五.节点安装docker,并进行相关配置

k8s是容器编排工具,需要容器管理工具,所以三个节点同时安装docker,还是以k8scludes1为例.

安装docker.

                        
                          root@k8scludes1:~# apt-get install docker-ce Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: containerd.io dbus-user-session docker-ce-cli docker-ce-rootless-extras docker-scan-plugin libltdl7 pigz ...... Processing triggers for libc-bin (2.27-3ubuntu1.2) ...

                        
                      

查看docker安装包.

                        
                          root@k8scludes 1:~# dpkg -l | grep docker ii docker-ce 5:20.10.14~3-0~ubuntu-bionic amd64 Docker: the open-source application container engine ii docker-ce-cli 5:20.10.14~3-0~ubuntu-bionic amd64 Docker CLI: the open-source application container engine ii docker-ce-rootless-extras 5:20.10.14~3-0~ubuntu-bionic amd64 Rootless support for Docker. ii docker-scan-plugin 0.17.0~ubuntu-bionic amd64 Docker scan cli plugin.

                        
                      

设置docker开机自启动并现在启动docker.

                        
                          root@k8scludes1:~# systemctl enable docker --now Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable docker

                        
                      

查看docker状态.

                        
                          root@k8scludes1:~# systemctl status docker ● docker.service - Docker Application Container Engine Đã tải: đã tải (/lib/systemd/system/docker.service; đã bật; cài đặt trước của nhà cung cấp: đã bật) Đang hoạt động: đang hoạt động (đang chạy) kể từ Thứ bảy 2022-04-16 21:39:46 CST; 3 phút 21 giây trước Tài liệu: https://docs.docker.com PID chính: 1822 (dockerd) Nhiệm vụ: 9 CGroup: /system.slice/docker.service └─1822 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

                        
                      

Kiểm tra phiên bản docker.

                        
                          root@k8scludes1:~# docker --version Phiên bản Docker 20.10.14, bản dựng a224086

                        
                      

Lưu ý rằng kubernetes V1.22.2 và các phiên bản mới hơn yêu cầu trình điều khiển cgroup của container phải là systemd, nhưng trình điều khiển cgroup mặc định của docker là cgroupfs. Đối với kubernetes phiên bản 1.21 trở về trước, không cần sửa đổi trình điều khiển cgroup.

Bạn có thể sử dụng docker info | grep -i cgroup để xem trình điều khiển cgroup.

                        
                          root@k8scludes1:~# docker info | grep -i cgroup CẢNH BÁO: Không hỗ trợ giới hạn hoán đổi Trình điều khiển Cgroup: cgroupfs Phiên bản Cgroup: 1

                        
                      

Định cấu hình trình tăng tốc hình ảnh docker và đặt trình điều khiển cgroup docker thành systemd.

                        
                          root@k8scludes1:~# cat > /etc/docker/daemon.json < { > "registry-mirrors": ["https://frz7i079.mirror.aliyuncs.com"], > "exec-opts": ["native.cgroupdriver=systemd"] > } > EOF root@k8scludes1:~# cat /etc/docker/daemon.json { "registry-mirrors": ["https://frz7i079.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"] }

                        
                      

Khởi động lại docker.

                        
                          root@k8scludes1:~# systemctl restart docker root@k8scludes1:~# systemctl status docker ● docker.service - Docker Application Container Engine Đã tải: đã tải (/lib/systemd/system/docker.service; đã bật; cài đặt trước của nhà cung cấp: đã bật) Đang hoạt động: đang hoạt động (đang chạy) kể từ Thứ bảy 2022-04-16 21:51:29 CST; 8 giây trước Tài liệu: https://docs.docker.com PID chính: 3541 (dockerd) Nhiệm vụ: 9 CGroup: /system.slice/docker.service └─3541 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

                        
                      

Lúc này, Cgroup Driver trở thành systemd.

                        
                          root@k8scludes1:~# docker info | grep -i cgroup Trình điều khiển Cgroup: systemd Phiên bản Cgroup: 1 CẢNH BÁO: Không hỗ trợ giới hạn hoán đổi

                        
                      

Đặt iptables không xử lý dữ liệu cầu nối và kích hoạt chức năng định tuyến và chuyển tiếp IP.

                        
                          root@k8scludes1:~# cat < /etc/sysctl.d/k8s.conf > net.bridge.bridge-nf-call-ip6tables = 1 > net.bridge.bridge-nf-call-iptables = 1 > net.ipv4.ip_forward = 1 > EOF

                        
                      

使配置生效.

                        
                          root@k8scludes1:~# sysctl -p /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1

                        
                      

六.安装kubelet,kubeadm,kubectl

Cài đặt kubelet, kubeadm và kubectl trên cả ba nút. Lấy k8scludes1 làm ví dụ:

  • Kubelet là thành phần proxy trên nút công nhân kubernetes, chạy trên mỗi nút
  • Kubeadm là một công cụ cài đặt để nhanh chóng xây dựng kubernetes (k8s). Nó cung cấp hai lệnh, kubeadm init và kubeadm join, để nhanh chóng tạo một cụm kubernetes khởi động và chạy một cụm có sẵn ở mức tối thiểu bằng cách thực hiện các thao tác cần thiết.
  • kubectl là một công cụ dòng lệnh cho các cụm Kubernetes. kubectl có thể tự quản lý cụm đó cũng như cài đặt và triển khai các ứng dụng được chứa trong bộ chứa trên cụm.
                        
                          root@k8scludes1:~# apt-get -y install kubelet=1.22.2-00 kubeadm=1.22.2-00 kubectl=1.22.2-00 Đang đọc danh sách các gói... Hoàn tất Đang xây dựng cây phụ thuộc Đang đọc thông tin trạng thái... Hoàn tất Các gói bổ sung sau sẽ được cài đặt: conntrack cri-tools kubernetes-cni socat ...... Đang giải nén kubeadm (1.22.2-00) ... Đang thiết lập conntrack (1:1.4.4+snapshot20161117-6ubuntu2) ... Đang thiết lập kubernetes-cni (0.8.7-00) ... Đang thiết lập cri-tools (1.23.0-00) ... Đang thiết lập socat (1.7.3.2-2ubuntu2) ... Đang thiết lập kubelet (1.22.2-00) ... Đã tạo liên kết tượng trưng /etc/systemd/system/multi-user.target.wants/kubelet.service → /lib/systemd/system/kubelet.service. Thiết lập kubectl (1.22.2-00) ... Thiết lập kubeadm (1.22.2-00) ... Xử lý các kích hoạt cho man-db (2.8.3-2ubuntu0.1) ...

                        
                      

Đặt kubelet tự động khởi động khi khởi động và khởi động kubelet ngay bây giờ.

                        
                          root@k8scludes1:~# systemctl enable kubelet --now

                        
                      

Kubelet không thể khởi động bây giờ.

                        
                          root@k8scludes1:~# systemctl status kubelet ● kubelet.service - kubelet: Kubernetes Node Agent Đã tải: đã tải (/lib/systemd/system/kubelet.service; đã bật; cài đặt trước của nhà cung cấp: đã bật) Drop-In: /etc/systemd/system/kubelet.service.d └─10-kubeadm.conf Đang hoạt động: đang kích hoạt (tự động khởi động lại) (Kết quả: mã thoát) kể từ Thứ bảy, ngày 16 tháng 4 năm 2022 lúc 22:07:09 CST; 7 giây trước Tài liệu: https://kubernetes.io/docs/home/ Tiến trình: 5282 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (mã=thoát, trạng thái=1/THẤT BẠI) PID chính: 5282 (mã=thoát, trạng thái=1/THẤT BẠI)

                        
                      

七.kubeadm初始化

更新软件源.

                        
                          root@k8scludes1:~# cập nhật apt

                        
                      

Kiểm tra các phiên bản gói kubeadm có sẵn.

                        
                          root@k8scludes1:~# apt-cache madison kubeadm | grep 1.22 kubeadm | 1.22.8-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Các gói kubeadm | 1.22.7-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Các gói kubeadm | 1.22.6-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Các gói kubeadm | 1.22.5-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Các gói kubeadm | 1.22.4-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Các gói kubeadm | 1.22.3-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Các gói kubeadm | 1.22.2-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Các gói kubeadm | 1.22.1-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Các gói kubeadm | 1.22.0-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Các gói

                        
                      

kubeadm init: Khởi tạo nút mặt phẳng điều khiển Kubernetes trên nút chính k8scludes1.

  • --image-repository register.aliyuncs.com/google_containers: cho biết việc sử dụng kho hình ảnh của Đám mây Alibaba, nếu không thì không thể tải xuống một số hình ảnh;
  • --kubernetes-version=v1.22.2: Chỉ định phiên bản kubernetes;
  • --pod-network-cidr=10.244.0.0/16: Chỉ định phân đoạn mạng của nhóm;
  • coredns là một dịch vụ DNS nguồn mở được viết bằng ngôn ngữ go.
                        
                          root@k8scludes1:~# kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.22.2 --pod-network-cidr=10.244.0.0/16 [init] Sử dụng phiên bản Kubernetes: v1.22.2 [preflight] Đang chạy các kiểm tra trước khi bay ...... [bootstrap-token] Tạo ConfigMap "cluster-info" trong không gian tên "kube-public" [kubelet-finalize] Đang cập nhật "/etc/kubernetes/kubelet.conf" để trỏ đến chứng chỉ và khóa máy khách kubelet có thể xoay [addons] Đã áp dụng addon cần thiết: CoreDNS [addons] Đã áp dụng addon cần thiết: kube-proxy Mặt phẳng điều khiển Kubernetes của bạn đã khởi tạo thành công! Để bắt đầu sử dụng cụm của bạn, bạn cần chạy lệnh sau với tư cách là người dùng thông thường: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Ngoài ra, nếu bạn là người dùng root, bạn có thể chạy lệnh: export KUBECONFIG=/etc/kubernetes/admin.conf Bây giờ bạn nên triển khai mạng pod vào cụm. Chạy "kubectl apply -f [podnetwork].yaml" với một trong các tùy chọn được liệt kê tại: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Sau đó, bạn có thể tham gia bất kỳ số lượng nút công nhân nào bằng cách chạy lệnh sau trên mỗi nút với tư cách là root: kubeadm join 192.168.110.128:6443 --token ju8p1y.8gjm5q00l6u5y1rp \ --discovery-token-ca-cert-hash sha256:3f401b6187ed44ff8f4b50aa6453cf3eacc3b86d6a72e3bf2caba02556cb918e 

                        
                      

Khi kubeadm được khởi chạy, nhiều hình ảnh khác nhau sẽ được tải xuống và có thể xem được bằng hình ảnh docker.

                        
                          root@k8scludes1:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.aliyuncs.com/google_containers/kube-apiserver v1.22.2 e64579b7d886 7 tháng trước 128MB registry.aliyuncs.com/google_containers/kube-controller-manager v1.22.2 5425bcbd23c5 7 tháng trước 122MB registry.aliyuncs.com/google_containers/kube-proxy v1.22.2 873127efbc8a 7 tháng trước 104MB registry.aliyuncs.com/google_containers/kube-scheduler v1.22.2 b51ddc1014b0 7 tháng trước 52.7MB registry.aliyuncs.com/google_containers/etcd 3.5.0-0 004811815584 10 tháng trước 295MB registry.aliyuncs.com/google_containers/coredns v1.8.4 8d147537fb7d 10 tháng trước 47.6MB registry.aliyuncs.com/google_containers/pause 3.5 ed210e3e4a5b 13 tháng trước 683kB

                        
                      

Làm theo lời nhắc để tạo thư mục và tệp cấu hình.

                        
                          root@k8scludes1:~# mkdir -p $HOME/.kube root@k8scludes1:~# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config root@k8scludes1:~# sudo chown $(id -u):$(id -g) $HOME/.kube/config

                        
                      

Nút chính bây giờ có thể được nhìn thấy.

                        
                          root@k8scludes1:~# kubectl get node TÊN TRẠNG THÁI VAI TRÒ TUỔI PHIÊN BẢN k8scludes1 Chưa sẵn sàng mặt phẳng điều khiển,master 178m v1.22.2

                        
                      

八.添加worker节点到k8s集群

Tiếp theo, thêm hai nút công nhân khác vào cụm k8s.

Câu sau đây được xuất ra trong quá trình init kubeadm.

                        
                          kubeadm tham gia 192.168.110.128:6443 --token ju8p1y.8gjm5q00l6u5y1rp \ --discovery-token-ca-cert-hash sha256:3f401b6187ed44ff8f4b50aa6453cf3eacc3b86d6a72e3bf2caba02556cb918e 

                        
                      

Thực hiện lệnh này trên hai nút công nhân còn lại để thêm các nút vào cụm k8s.

Nếu bạn quên mã thông báo để tham gia cụm, bạn có thể sử dụng lệnh sau để lấy mã thông báo lệnh tham gia mới nhất.

                        
                          root@k8scludes1:~# kubeadm token create --print-join-command kubeadm join 192.168.110.128:6443 --token 4xk96a.qizykuirhn8ccvcw --discovery-token-ca-cert-hash sha256:3f401b6187ed44ff8f4b50aa6453cf3eacc3b86d6a72e3bf2caba02556cb918e 

                        
                      

Thực hiện lệnh mã thông báo để tham gia cụm trên k8scludes2.

                        
                          root@k8scludes2:~# kubeadm join 192.168.110.128:6443 --token 4xk96a.qizykuirhn8ccvcw --discovery-token-ca-cert-hash sha256:3f401b6187ed44ff8f4b50aa6453cf3eacc3b86d6a72e3bf2caba02556cb918e [kiểm tra trước] Đang chạy các kiểm tra trước [kiểm tra trước] Đang đọc cấu hình từ cụm... [kiểm tra trước] FYI: Bạn có thể xem tệp cấu hình này bằng 'kubectl -n kube-system get cm kubeadm-config -o yaml' [kubelet-start] Đang ghi cấu hình kubelet vào tệp "/var/lib/kubelet/config.yaml" [kubelet-start] Đang ghi tệp môi trường kubelet có cờ để lưu trữ "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Đang khởi động kubelet [kubelet-start] Đang chờ kubelet thực hiện TLS Bootstrap... Nút này đã tham gia cụm: * Yêu cầu ký chứng chỉ đã được gửi đến apiserver và đã nhận được phản hồi. * Kubelet đã được thông báo về thông tin chi tiết về kết nối bảo mật mới. Chạy 'kubectl get nodes' trên mặt phẳng điều khiển để xem nút này tham gia cụm.

                        
                      

Bạn có thể thấy rằng sau khi nút worker được thêm vào cụm k8s, sẽ có thêm hai hình ảnh nữa.

                        
                          root@k8scludes2:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.aliyuncs.com/google_containers/pause 3.5 ed210e3e4a5b 13 tháng trước 683kB registry.aliyuncs.com/google_containers/kube-proxy v1.22.2 873127efbc8a 7 tháng trước 104MB

                        
                      

Thực hiện lệnh mã thông báo để tham gia cụm trên k8scludes3.

                        
                          root@k8scludes3:~# kubeadm join 192.168.110.128:6443 --token 4xk96a.qizykuirhn8ccvcw --discovery-token-ca-cert-hash sha256:3f401b6187ed44ff8f4b50aa6453cf3eacc3b86d6a72e3bf2caba02556cb918e [kiểm tra trước] Đang chạy các kiểm tra trước [kiểm tra trước] Đang đọc cấu hình từ cụm... [kiểm tra trước] FYI: Bạn có thể xem tệp cấu hình này bằng 'kubectl -n kube-system get cm kubeadm-config -o yaml' [kubelet-start] Đang ghi cấu hình kubelet vào tệp "/var/lib/kubelet/config.yaml" [kubelet-start] Đang ghi tệp môi trường kubelet có cờ để lưu trữ "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Đang khởi động kubelet [kubelet-start] Đang chờ kubelet thực hiện TLS Bootstrap... Nút này đã tham gia cụm: * Yêu cầu ký chứng chỉ đã được gửi đến apiserver và đã nhận được phản hồi. * Kubelet đã được thông báo về thông tin chi tiết về kết nối bảo mật mới. Chạy 'kubectl get nodes' trên mặt phẳng điều khiển để xem nút này tham gia cụm.

                        
                      

Bạn có thể thấy rằng sau khi nút worker được thêm vào cụm k8s, sẽ có thêm hai hình ảnh nữa.

                        
                          root@k8scludes3:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.aliyuncs.com/google_containers/kube-proxy v1.22.2 873127efbc8a 7 tháng trước 104MB registry.aliyuncs.com/google_containers/pause 3.5 ed210e3e4a5b 13 tháng trước 683kB

                        
                      

Kiểm tra trạng thái nút trong k8scludes1 và bạn có thể thấy rằng cả hai nút công nhân đã được thêm vào cụm k8s.

                        
                          root@k8scludes1:~# kubectl get nodes TÊN TRẠNG THÁI VAI TRÒ TUỔI PHIÊN BẢN k8scludes1 Chưa sẵn sàng mặt phẳng điều khiển, chủ 3 giờ 2 phút v1.22.2 k8scludes2 Chưa sẵn sàng  60 giây v1.22.2 k8scludes3 Chưa sẵn sàng  57 giây v1.22.2

                        
                      

九.部署CNI网络插件calico

Mặc dù cụm kubernetes hiện có 1 nút chính và 2 nút công nhân, nhưng trạng thái của ba nút tại thời điểm này là Chưa sẵn sàng. Lý do là không có plug-in mạng CNI để liên lạc giữa các nút, plug-in mạng cni. cần được cài đặt. Thường được sử dụng Các plug-in mạng cni bao gồm calico và flannel. Sự khác biệt giữa hai loại này là: flannel không hỗ trợ các chính sách mạng phức tạp, trong khi calico hỗ trợ các chính sách mạng. Vì chính sách mạng kubernetes sẽ cần phải được định cấu hình. trong tương lai, plug-in mạng cni được chọn cho bài viết này là calico! .

Bây giờ hãy truy cập trang web chính thức để tải xuống tệp calico.yaml:

Trang web chính thức: https://projectcalico.docs.tigera.io/about/about-calico.

hình ảnh-20220911190918361

Tìm kiếm calico.yaml trực tiếp trong hộp tìm kiếm.

hình ảnh-20220911190949598

Tìm lệnh tải calico.yaml.

hình ảnh-20220911191022325

Tải xuống tệp calico.yaml.

                        
                          root@k8scludes1:~# curl https://docs.projectcalico.org/manifests/calico.yaml -O % Tổng % Đã nhận % Xferd Tốc độ trung bình Thời gian Thời gian Thời gian Tải xuống hiện tại Tải lên Tổng đã sử dụng Còn lại Tốc độ 100 212k 100 212k 0 0 8736 0 0:00:24 0:00:24 --:--:-- 18568 root@k8scludes1:~# ls aa.txt apt-key.gpg calico.yaml set.sh

                        
                      

Xem hình ảnh calico cần được tải xuống.

                        
                          root@k8scludes1:~# grep image calico.yaml image: docker.io/calico/cni:v3.22.2 image: docker.io/calico/cni:v3.22.2 image: docker.io/calico/pod2daemon-flexvol:v3.22.2 image: docker.io/calico/node:v3.22.2 image: docker.io/calico/kube-controllers:v3.22.2

                        
                      

Bốn hình ảnh này cần được tải xuống trên tất cả các nút, lấy k8scloudes1 làm ví dụ.

                        
                          root@k8scludes1:~# docker pull docker.io/calico/cni:v3.22.2 root@k8scludes1:~# docker pull docker.io/calico/pod2daemon-flexvol:v3.22.2 root@k8scludes1:~# docker pull docker.io/calico/node:v3.22.2 root@k8scludes1:~# docker pull docker.io/calico/kube-controllers:v3.22.2

                        
                      

Tại thời điểm này, cả ba nút đều có hình ảnh calico.

                        
                          root@k8scludes1:~# hình ảnh docker | grep calico calico/kube-controllers v3.22.2 a1a88662416b 2 ngày trước 132MB calico/cni v3.22.2 be7dfc21ba2e 2 ngày trước 236MB calico/pod2daemon-flexvol v3.22.2 d6660bf471e1 2 ngày trước 19,7MB calico/node v3.22.2 fd1608dbbc19 2 ngày trước 198MB root@k8scludes2:~# hình ảnh docker | grep calico calico/kube-controllers v3.22.2 a1a88662416b 2 ngày trước 132MB calico/cni v3.22.2 be7dfc21ba2e 2 ngày trước 236MB calico/pod2daemon-flexvol v3.22.2 d6660bf471e1 2 ngày trước 19,7MB calico/node v3.22.2 fd1608dbbc19 2 ngày trước 198MB root@k8scludes3:~# docker images | grep calico calico/kube-controllers v3.22.2 a1a88662416b 2 ngày trước 132MB calico/cni v3.22.2 be7dfc21ba2e 2 ngày trước 236MB calico/pod2daemon-flexvol v3.22.2 d6660bf471e1 2 ngày trước 19,7MB calico/node v3.22.2 fd1608dbbc19 2 ngày trước 198MB

                        
                      

Sửa đổi tệp calico.yaml. Phân đoạn IP của CALICO_IPV4POOL_CIDR phải nhất quán với phân đoạn mạng pod khi khởi chạy kubeadm. Lưu ý rằng định dạng phải được căn chỉnh, nếu không sẽ xảy ra lỗi.

                        
                          root@k8scludes1:~# vim calico.yaml root@k8scludes1:~# cat calico.yaml | egrep "CALICO_IPV4POOL_CIDR|"10.244"" - tên: CALICO_IPV4POOL_CIDR giá trị: "10.244.0.0/16"

                        
                      

Nếu không trực quan thì xem hình: Sửa file calico.yaml.

hình ảnh-20220911191155083

Áp dụng tệp calico.yaml.

                        
                          root@k8scludes1:~# kubectl apply -f calico.yaml configmap/calico-config đã tạo customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org đã tạo customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org đã tạo ...... clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers đã tạo clusterrole.rbac.authorization.k8s.io/calico-node đã tạo clusterrolebinding.rbac.authorization.k8s.io/calico-node đã tạo daemonset.apps/calico-node đã tạo serviceaccount/calico-node đã tạo implementation.apps/calico-kube-controllers đã tạo serviceaccount/calico-kube-controllers đã tạo Cảnh báo: policy/v1beta1 PodDisruptionBudget đã lỗi thời trong v1.21+, không khả dụng trong v1.25+; sử dụng chính sách/v1 PodDisruptionBudget poddisruptionbudget.policy/calico-kube-controllers đã tạo

                        
                      

Kiểm tra vỏ calico.

                        
                          root@k8scludes1:~# kubectl get pod -A | grep calico kube-system calico-kube-controllers-65898446b5-gtsz6 1/1 Đang chạy 0 58 giây kube-system calico-node-d6564 1/1 Đang chạy 0 59 giây kube-system calico-node-jgvjb 0/1 Đang chạy 0 59 giây kube-system calico-node-snkxp 1/1 Đang chạy 0 59 giây

                        
                      

Lúc này, người ta nhận thấy cả ba nút đều ở trạng thái Sẵn sàng.

                        
                          root@k8scludes1:~# kubectl get node TÊN TRẠNG THÁI VAI TRÒ TUỔI PHIÊN BẢN k8scludes1 Sẵn sàng mặt phẳng điều khiển, chủ 3h44m v1.22.2 k8scludes2 Sẵn sàng  42m v1.22.2 k8scludes3 Sẵn sàng  42m v1.22.2

                        
                      

十.配置kubectl命令tab键自动补全

Xem các lệnh tự động hoàn thành kubectl.

                        
                          root@k8scludes1:~# kubectl --help | grep bash completion Xuất mã hoàn thành shell cho shell được chỉ định (bash hoặc zsh)

                        
                      

Thêm source <(kubectl Completed bash) vào /etc/profile và làm cho cấu hình có hiệu lực.

                        
                          root@k8scludes1:~# vim /etc/profile root@k8scludes1:~# cat /etc/profile | head -3 # /etc/profile: tệp .profile trên toàn hệ thống cho shell Bourne (sh(1)) # và các shell tương thích với Bourne (bash(1), ksh(1), ash(1), ...). source <(kubectl completion bash) root@k8scludes1:~# source /etc/profile

                        
                      

Tại thời điểm này, phím tab lệnh kubectl có thể được tự động hoàn thành.

                        
                          root@k8scludes1:~# kubectl get nodes TÊN TRẠNG THÁI VAI TRÒ TUỔI PHIÊN BẢN k8scludes1 Sẵn sàng mặt phẳng điều khiển, chủ 3h46m v1.22.2 k8scludes2 Sẵn sàng  45m v1.22.2 k8scludes3 Sẵn sàng  45m v1.22.2

                        
                      

十一.总结

Tại thời điểm này, chúng tôi đã cài đặt và triển khai thành công cụm Kubernetes 1.22.2 trên Ubuntu 18.04. Bây giờ bạn có thể bắt đầu tạo và quản lý tài nguyên Kubernetes của mình.

Cuối cùng, bài viết này về cách cài đặt và triển khai cụm Kubernetes (k8s) trong Ubuntu kết thúc tại đây. Nếu bạn muốn biết thêm về cách cài đặt và triển khai cụm Kubernetes (k8s) trong Ubuntu, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt qua các bài viết liên quan. Tôi hy vọng tất cả các bạn ủng hộ blog của tôi trong tương lai! .

31 4 0
tôi là một con chim nhỏ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress