• kubernetes搭建笔记(一)——安装kubeadm


    前言

    其实想折腾kubernetes很久了,但是由于早期官网写的基础性能要求很高,一直没有这么一台满足性能要求的机器,也就没提上日程。后来机器升级了些,但也不是很高,加上kubernetes概念多,系统复杂,可能也是我自己能力还不足,驾驭不了这么一个系统,所以一直没有提上日程。这几天成都疫情被封印在家,下了决心,把这个栈折腾一下。因为这块板子短,很多方面已经露出弊端了。

    准备

    环境

    手上有个AMD的台式机,被我加过内存,勉强拿来用吧,基本环境如下:

    • CPU:3600x(6核12线程)
    • 内存:48GB
    • 机器操作系统:esxi6.7
    • 硬盘:nvme 256GB1,机械硬盘1T1,机械硬盘500G*1

    安装工具

    在官网教程,任务-安装工具 记忆而中,似乎是推荐用kubectl进行安装的,我估计这个安装过程可以让我更了解搭建的过程。但是,在入门-生产环境中,却没有这个选项,取而代之的是kubiadm。由于本次搭建就是面向生产的,所以我们就直接怼kubiadm了。如果后续还有什么需要,我们在返回来补一个kubectl的搭建过程。

    部署规划

    硬件规划

    在硬件配置上,我规划的是一个控制面板节点,三个数据节点。

    注意事项

    • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。
    • 每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)。
      CPU 2 核心及以上。
    • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)。
    • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
    • 开启机器上的某些端口。请参见这里了解更多详细信息。
    • 禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。

    准备机器

    准备了四台虚拟机,配置均为centos7,4核8G,分别是

    • k8s-node1-3.21:192.168.3.21
    • k8s-node2-3.22:192.168.3.22
    • k8s-node3-3.23:192.168.3.23
    • k8s-node4-3.24:192.168.3.24

    初始化配置采用了我以往记录的一片centos7的初始化操作:centos7基础操作

    安装kubiadm

    确保每个节点上MAC地址和product_uuid的唯一性

    • 可以通过ip link 或 ifconfig -a指令查看MAC地址,我这默认没装ifconfig,所以用的ip link
    • 通过sudo cat /sys/class/dmi/id/product_uuid查看product_uuid

    检查网络适配器

    如果机器之间默认网络路由不通的话,需要先搞通,比如添加路由啥的,我这里网络环境很简单,就没有这个步骤了

    检查所需端口

    不过由于我直接把防火墙关了,所以这一步其实也是不需要的,不过还是把需要的端口记录下来。下面是官网连接,所需端口的内容就源自于该链接
    端口和协议

    禁用交换分区

    临时

    journalctl -xeu kubelet
    
    • 1

    永久
    注释/etc/fstab关于swap那行的配置,然后执行下面的指令

    echo vm.swappiness=0 >> /etc/sysctl.conf
    reboot
    
    • 1
    • 2

    将这个参数设置为0后,交换分区就被关掉了,在内存不足时,擦偶偶系统将会杀进程。为了避免这件事,有的也会推荐配置为一个很低的值,1。不够kubbernetes官网没有推荐这个事,我还是改为了0。

    控制面板所需端口
    协议方向端口范围目的使用者
    TCP入站6443Kubernetes API server所有
    TCP入站2379-2380etcd server client APIkube-apiserver, etcd
    TCP入站10250Kubelet API自身, 控制面
    TCP入站10259kube-scheduler自身
    TCP入站10257kube-controller-manager自身
    尽管 etcd 的端口也列举在控制面的部分,但你也可以在外部自己托管 etcd 集群或者自定义端口。
    工作节点
    协议方向端口范围目的使用者
    TCP入站10250Kubelet API自身, 控制面
    TCP入站30000-32767NodePort Services所有

    安装容器运行时

    我这里还是实用docker作为容器运行时。但是,由于Docker Engine没有实现CRI,所以如果要用还必须安装cir-dockerd服务才可以。CRI是Container Runtime Interface的所限,中文为容器运行时接口,kubernetes默认实用该接口与容器交互。所以,每台机器上都需要安装Docker Engine和cri-dockerd

    安装Docker Engine

    官方链接
    移除旧版本Docker

    sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    安装仓库

    sudo yum install -y yum-utils
    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    
    • 1
    • 2
    • 3
    • 4

    安装docker

    sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
    
    • 1

    操作docker服务

    sudo systemctl status/start/stop/enable docker
    
    • 1
    安装cri-dockerd

    官方链接
    这是一个github的项目,项目上说的也很简略,反正最后给了个有DockerEngine的安装脚本,照着跑就行了。
    然而,这个脚本的执行过程要翻墙。虽然我可以翻墙,但是我不想以后总是解决服务器这个问题,所以,我找到了另一个办法,安装打包好的包。官方下载链接
    最新版本到了0.2.5,我就下这个吧,存一个,防止以后找不到。

    yum install cri-dockerd-0.2.5-3.el7.x86_64.rpm -y
    
    • 1

    修改启动文件

    sed -i 's,^ExecStart.*,& --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7,' /usr/lib/systemd/system/cri-docker.service
    
    • 1

    启动cri-dockerd

    systemctl daemon-reload
    systemctl enable --now cri-docker.service
    systemctl enable --now cri-docker.socket
    
    • 1
    • 2
    • 3

    有个注意事项,这个cri-docker不仅安装依赖docker,启动也依赖docker,所以启动之前要县启动docker的服务。所以,两个都弄成开机启动吧

    安装 kubeadm、kubelet 和 kubectl

    这三个东西每天机器上都要装:

    • kubeadm:用来初始化集群的指令。
    • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
    • kubectl:用来与集群通信的命令行工具。
      这里有个注意事项,就是版本要兼容。不仅仅是三个软件之间,还有机器之间。因为涉及多台机器的嘛。我这次是新装,相对简单,都用相同的版本就是了。
      以下脚本可以把三个软件都装了,但是,要翻墙 好烦呀。
    cat <
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    原文上有段设置selinux的代码。由于我之前设置过了,这里就移除了。
    虽然要翻墙,但还是记在这吧,下面我们看看不翻墙怎么弄。
    后来是在受不了了,找了下有个阿里的仓库,如下:

    cat < /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
            http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    听说版本有一点点滞后,以及check一定不要打开。

    配置好后就很简单了

    sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
    
    sudo systemctl enable --now kubelet
    
    • 1
    • 2
    • 3

    执行以上指令就安装完成了
    现在kubelet是无法启动成功的,他在等待kubeadm的指令

  • 相关阅读:
    【数据结构】栈和队列专题
    【HarmonyOS】鸿蒙应用开发基础认证题目
    网易数帆黄久远:大规模Kubernetes监控体系建设之路
    SpringSecurity结构分析
    网络编程--高并发服务器(二)
    6160. 和有限的最长子序列
    Java核心知识:重写(Override)与重载(Overload)
    代码随想录算法训练营 动态规划part16
    十一 数据库系统
    【LeetCode】刷题模版/套路合集(持续更新)
  • 原文地址:https://blog.csdn.net/linghuanxu/article/details/126686323