【云原生】CentOS安装Kubernetes+Jenkins

【云原生】CentOS安装Kubernetes+Jenkins

  • 一、软件概述
    • [1. Kubernetes](#1. Kubernetes)
    • [2. Docker](#2. Docker)
    • [3. Jenkins](#3. Jenkins)
  • 二、主机配置
  • [三、安装 Kubernetes](#三、安装 Kubernetes)
    • [1. 安装 Docker](#1. 安装 Docker)
    • [2. 安装 kubeadm、kubelet、kubectl](#2. 安装 kubeadm、kubelet、kubectl)
    • [3. 系统配置](#3. 系统配置)
    • [4. 安装 cri-docker](#4. 安装 cri-docker)
    • [5. 初始化 Master 节点](#5. 初始化 Master 节点)
    • [6. 初始化 Slave 节点](#6. 初始化 Slave 节点)
    • [7. 安装 CNI 网络插件](#7. 安装 CNI 网络插件)
    • [8. 安装 Dashboard](#8. 安装 Dashboard)
    • [9. Dashboard 登录和免密登录](#9. Dashboard 登录和免密登录)
  • [四、安装 Jenkins](#四、安装 Jenkins)
    • [1. 下载 Helm](#1. 下载 Helm)
    • [2. 安装 Jenkins](#2. 安装 Jenkins)
    • [3. 配置持久卷](#3. 配置持久卷)
    • [4. 配置端口](#4. 配置端口)
  • 五、参考文章

一、软件概述

1. Kubernetes

  • Kubernetes,简称 K8s("K"与"s"间8个字符缩写),是CNCF托管的开源容器编排平台,核心作用是自动化管理大规模容器化应用------无论是部署、扩缩容、故障自愈,还是版本更新,都能通过它实现"无需手动干预"的集群管理,让成百上千个容器像"一个整体"般高效运行,解决了微服务架构下容器数量激增后的管理难题。

  • 它的集群由控制平面 (负责决策,如调度、监控)和工作节点 (负责运行容器)两部分组成,关键组件分工明确,确保集群稳定运转。

    组件类别 核心组件 核心作用
    控制平面(决策) kube-apiserver 集群唯一入口,所有操作(部署/查询)均通过其REST API执行
    etcd 集群"数据库",存储所有配置和状态数据(如容器部署信息)
    kube-scheduler 调度容器到合适的工作节点(如按CPU/内存需求分配)
    工作节点(执行) kubelet 确保容器按配置在节点上运行,实时向控制平面汇报状态
    Container Runtime 实际运行容器的引擎(如containerd),是K8s与容器的"连接层"
  • Kubernetes 集群部署与运维的核心工具 kubeadm、kubectl、kubelet,分工明确且协同工作 ------ kubeadm 负责 "搭建集群",kubelet 负责 "运行容器",kubectl 负责 "操作集群" ,共同支撑 K8s 集群从创建到日常管理的全流程。

    工具名称 核心定位 关键作用 使用场景举例
    kubeadm K8s 集群"搭建工具" 自动化初始化控制平面(如创建 etcd、kube-apiserver)、添加工作节点、升级集群,简化集群部署流程(避免手动配置复杂组件)。 1. 初始化 Master 节点(kubeadm init); 2. 将 Node 节点加入集群(kubeadm join); 3. 升级 K8s 版本(kubeadm upgrade)。
    kubectl K8s 集群"命令行客户端" 作为用户与集群的交互入口,通过调用 kube-apiserver 的 API,实现对集群资源(Pod、Deployment、Service 等)的创建、查询、更新、删除。 1. 查看 Pod 状态(kubectl get pods); 2. 部署应用(kubectl apply -f 配置文件.yaml); 3. 查看集群事件(kubectl get events)。
    kubelet 工作节点"容器管家" 运行在每一个工作节点(Node) 上,监听 kube-apiserver 的指令,确保节点上的容器按配置(如资源需求、健康检查)正常运行,并实时向控制平面汇报节点/容器状态。 1. 启动 Pod 中的容器; 2. 监控容器健康状态,重启崩溃的容器; 3. 上报节点的 CPU、内存使用情况。

2. Docker

  • Docker 是开源的容器化平台,核心是通过 "容器" 技术将应用及其依赖(如库、配置文件)打包成标准化的 "Docker 镜像",确保应用在任何支持 Docker 的环境中(开发机、服务器、云平台)都能 "一次打包,到处运行",解决了传统应用 "在我这能跑,到你那跑不起来" 的环境一致性问题。
  • 目前 Kubernetes 推出了统一的容器运行时接口(CRI ),要求容器运行时必须符合该标准才能接入。而 Docker 本身不直接支持 CRI,需通过 cri-dockerd 中间件适配;同时,更轻量、更贴合 CRI 标准的 containerd(原是 Docker 内部组件,后独立)、CRI-O 等逐渐成为主流,Docker 作为 Kubernetes 容器运行时的场景已减少,但 Docker 构建的镜像仍可在 Kubernetes 中正常使用(镜像格式是通用标准)。
  • Docker 是"打包和运行单个容器"的工具,Kubernetes 是"管理大规模容器集群"的平台------前者解决"容器怎么跑",后者解决"大量容器怎么管",两者曾深度协同,如今虽在运行时层面适配方式变化,但 Docker 镜像仍能与 Kubernetes 兼容。

3. Jenkins

  • Jenkins 是一款开源的自动化工具,主要用于实现软件开发生命周期中的持续集成(CI)和持续部署(CD)。
  • 它通过可视化界面和丰富的插件生态,能够 自动化完成代码编译、测试、构建、部署等一系列流程。例如,当开发者向代码仓库提交代码后,Jenkins 可以自动触发构建流程,运行单元测试,生成可部署的软件包,甚至自动将其部署到测试或生产环境,从而减少人工操作,提高开发效率,缩短交付周期。
  • Jenkins 支持与 Git、Docker、Kubernetes 等众多工具集成,广泛应用于各种规模的软件开发团队中。

二、主机配置

  • 三台虚拟机,分别配置为(注意 IP 有点奇怪)

    名称 操作系统 核 内存 硬盘 IP
    master CentOS7.9.2009_x64 2C 4G 20G 192.168.111.129
    slave1 CentOS7.9.2009_x64 2C 4G 20G 192.168.111.128
    slave2 CentOS7.9.2009_x64 2C 4G 20G 192.168.111.130
  • 感觉性能优点吃紧,建议多加一些核心和内存。

三、安装 Kubernetes

1. 安装 Docker

  • 所有节点都要安装并启动!!!
  • Kubernetes 需要容器运行时,推荐用 containerd 或 Docker。CentOS 7 默认没有 Docker,需要自己装。

  1. 卸载旧版本(如果有)

    bash 复制代码
    sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
  2. 安装必要依赖

    bash 复制代码
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  3. 添加 Docker 官方源

    bash 复制代码
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  4. 安装 Docker CE

    bash 复制代码
    sudo yum install -y docker-ce docker-ce-cli containerd.io
  5. 配置 Docker 的镜像加速源和 cgroup 驱动

    bash 复制代码
    cat > /etc/docker/daemon.json << EOF
    {
      "registry-mirrors": ["https://docker.ketches.cn","https://docker.1ms.run","https://hub1.nat.tf"],
      "exec-opts": ["native.cgroupdriver=systemd"]
    }
    EOF
  6. 启动并设置开机启动

    bash 复制代码
    systemctl start docker && systemctl enable docker
  7. 验证,显示版本信息为安装成功

    bash 复制代码
    docker --version

2. 安装 kubeadm、kubelet、kubectl

  • 所有节点必须执行!!!
  • Kubernetes 官方源默认被墙,我们用阿里云镜像仓库。
  1. 添加 K8s 阿里云 repo

    bash 复制代码
    cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/
    enabled=1
    gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/repodata/repomd.xml.key
    EOF
  2. 安装 kubeadm、kubelet、kubectl

    bash 复制代码
    sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
  3. kubeadm 和 kubectl 仅是一个集群搭建工具和管理工具,不涉及启动。而 kubelet 是一个守护进程程序,由 kubeadm 在搭建过程中自动启动,这里仅设置开机启动即可

    bash 复制代码
    sudo systemctl enable kubelet

3. 系统配置

  • 所有节点必须执行!!!
  • k8s 要求,不然容易报错
  1. 关闭防火墙

    bash 复制代码
    sudo systemctl stop firewalld
    sudo systemctl disable firewalld
  2. 关闭 SELinux,SELinux是Linux的一个安全机制,但使用复杂和存在兼容性问题,通常选择关闭它。

    bash 复制代码
    sudo setenforce 0
    sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
  3. 关闭 Swap,Swap是一种虚拟内存技术,它允许系统将部分内存数据写到硬盘上的特定分区,从而释放更多物理内存。由于硬盘读写性能相比物理内存低,因此使用Swap会影响系统处理性能。并且Kubelet组件默认要求关闭Swap,以提高系统的稳定性和可靠性。

    bash 复制代码
    sudo swapoff -a
    sudo sed -i '/ swap / s/^/#/' /etc/fstab
  4. 设置主机名

    bash 复制代码
    hostnamectl set-hostname  xxx
  5. 添加 hosts,可以在每个节点中都添加上,方便后面使用

    bash 复制代码
    cat >> /etc/hosts << EOF
    192.168.111.129 master
    192.168.111.128 slave1
    192.168.111.130 slave2
    EOF
  6. 配置内核参数

    bash 复制代码
    cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    br_netfilter
    EOF
    
    sudo modprobe br_netfilter
  7. 配置 iptables 转发

    bash 复制代码
    cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-iptables  = 1
    net.ipv4.ip_forward                 = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    EOF
    
    sudo sysctl --system
  8. 时间同步(避免节点时间不一致)

    bash 复制代码
    sudo yum install -y chrony
    sudo systemctl start chronyd && sudo systemctl enable chronyd

4. 安装 cri-docker

  • 所有节点必须安装!!!
  • 前面提到过 docker 和 k8s 的关系,所以这个是必须安装的,否则跑不起来。
  1. 下载安装包:github / Mirantis / cri-dockerd,我下载的 0.3.14,版本过高容易报莫名其妙的错误

  2. 下载好后,拖到虚拟机中

  3. 安装,跳转目录就不说了

    bash 复制代码
    rpm -ivh cri-dockerd-0.3.14-3.el7.x86_64.rpm
  4. 安装完成后,修改Systemd服务文件指定依赖的Pause镜像为国内镜像地址

    bash 复制代码
    vi /usr/lib/systemd/system/cri-docker.service

    复制进去

    bash 复制代码
    ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
  5. 刷新配置和启动服务

    bash 复制代码
    systemctl daemon-reload
    systemctl start cri-docker && systemctl enable cri-docker

5. 初始化 Master 节点

  • 也就是只在 master 执行!
  1. 在 Master 节点执行以下命令初始化 Kubernetes 管理节点,注意 apiserver-advertise-address填上自己电脑的管理节点 IP 地址pod-network-cidr 是一个很重要的参数整个集群只此一个:

    bash 复制代码
    kubeadm init \
      --apiserver-advertise-address=192.168.111.129 \
      --image-repository=registry.aliyuncs.com/google_containers \
      --kubernetes-version=v1.32.0 \
      --pod-network-cidr=10.244.0.0/16 \
      --service-cidr=10.96.0.0/12 \
      --cri-socket=unix:///var/run/cri-dockerd.sock \
      --ignore-preflight-errors=all
  2. 安装完成会有 successfully 标记,以及后续需要执行的操作,上面的是在 master 执行的,下面的是在 slave 执行的(记住就行,复制到一边),我在安装的时候没截图,这里用的别人的图

  3. 配置 kubectl

    bash 复制代码
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  4. 验证

    bash 复制代码
    kubectl get nodes

6. 初始化 Slave 节点

  • 也就是只在 Slave 执行!
  1. 在两台工作节点执行上述返回的 kubeadm join 命令,并添加 --cri-socket 参数,以将这些工作节点加入到集群中,如果报错再添加 --ignore-preflight-errors

    bash 复制代码
    kubeadm join 192.168.111.129:6443 --token 4if29v.5fx0jcx9kqtumz1e --discovery-token-ca-cert-hash sha256:f80f75157bddd6e1d2894bd93a4b36f6a99484fad0f562608f524e7bcb52920f --cri-socket=unix:///var/run/cri-dockerd.sock --ignore-preflight-errors=all
  2. 验证

    bash 复制代码
    kubectl get nodes

7. 安装 CNI 网络插件

  • 本操作只需要在 master 执行!!!
  • 完成上述操作后,节点状态显示为"NotReady",表示节点尚未准备就绪,这是由于kubelet服务未发现网络插件导致的。因此需要安装网络插件。
  • 常见的网络插件包括Calico、Flannel、Cilium 等,这里用 Calico
  1. 下载 calico.yaml,访问不了就科学上网,下载完然后复制到虚拟机

  2. 安装Calico网络插件,跳转目录就不说了

    bash 复制代码
    kubectl apply -f calico.yaml
  3. 排错:如果一直下载不好,或者报错,可以试试下面的方法

    • 查看单个容器情况

      bash 复制代码
      kubectl describe pod <pod-name> -n <name-space>
    • 更改 cidr,然后重新 apply

      bash 复制代码
      # 编辑部署文件
      vim calico.yaml
      
      # 找到 CALICO_IPV4POOL_CIDR 配置,修改为你的 Pod 网段
      # 例如:
      - name: CALICO_IPV4POOL_CIDR
        value: "10.244.0.0/16"  # 与 kubeadm init 时的 --pod-network-cidr 一致
    • 换国内镜像源,然后重新 apply

      bash 复制代码
      # 在 calico.yaml 中替换所有镜像地址
      sed -i 's#docker.io/calico/#registry.cn-hangzhou.aliyuncs.com/calico-oss/#g' calico.yaml
  4. 可能要等很久,验证是否安装成功

    bash 复制代码
    kubectl get pods -n kube-system

    状态全是 Running 就是成功

8. 安装 Dashboard

  • 本操作只需要在 master 执行!!!
  • Dashboard是官方开发的一个Web管理系统,通过它可以管理集群资源、查看应用概览、查看容器日志和进入容器等操作。
  1. 下载 recommended.yaml,访问不了就科学上网,下载完然后复制到虚拟机

  2. 将Service的类型设置为"NodePort"类型并指定访问端口,以便将其暴露到集群外部访问,新增两行:

    bash 复制代码
    vim recommended.yaml
  3. 安装面板插件,依旧是要等很长一段时间

    bash 复制代码
    kubectl apply -f recommended.yaml
  4. 验证,查看 Pod 对象,全部 Running 时为安装成功

    bash 复制代码
    kubectl get pods -n kubernetes-dashboard

    然后访问 https://<节点IP地址>:30001 就能看到登录页面

9. Dashboard 登录和免密登录

  • 本操作只需要在 master 执行!!!

  • 先说安全登录:
  1. 创建一个服务账号并授予集群管理员权限:

    bash 复制代码
    kubectl create serviceaccount admin-user -n kubernetes-dashboard
    kubectl create clusterrolebinding admin-user --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin-user
  2. 根据服务账号创建Token:

    bash 复制代码
    kubectl create token admin-user -n kubernetes-dashboard
  3. 把 Token 复制到文本框中点击登录


  • 免密登录:
  1. 编辑 dashboard 的 Deployment

    bash 复制代码
    kubectl -n kubernetes-dashboard edit deployment kubernetes-dashboard

    添加参数 --enable-skip-login,配置文件比较长,建议搜索附近文字

  2. 给 Dashboard 管理员权限,否则看不到配置。这时刷新 Dashboard 页面就可以看到 "跳过" 按钮

    bash 复制代码
    kubectl create clusterrolebinding kubernetes-dashboard \
      --clusterrole=cluster-admin \
      --serviceaccount=kubernetes-dashboard:kubernetes-dashboard
  3. 如果报错就删掉原来的,然后重新执行第 2 步

    bash 复制代码
    kubectl delete clusterrolebinding kubernetes-dashboard

四、安装 Jenkins

  • 本操作只需要在 master 执行!!!

1. 下载 Helm

  • Helm 是 Kubernetes 的包管理工具,被称为 "Kubernetes 的 apt/yum",用于简化 Kubernetes 应用的部署、升级、回滚和管理。它的核心作用是将 Kubernetes 应用的一系列资源(如 Deployment、Service、ConfigMap 等 YAML 配置文件)打包成一个称为 "Chart" 的标准化单元,使得应用分发和部署更加便捷。
  1. 下载 Helm 二进制文件(推荐 v3 版本,无 Tiller 依赖)

    bash 复制代码
    # 1. 定义要安装的 Helm 版本(以 v3.14.0 为例,可替换为最新版,查看最新版:https://github.com/helm/helm/releases)
    HELM_VERSION="v3.14.0"
    
    # 2. 下载对应系统架构的二进制包(x86_64 架构)
    wget https://get.helm.sh/helm-${HELM_VERSION}-linux-amd64.tar.gz
    
    # 3. 解压压缩包
    tar -zxvf helm-${HELM_VERSION}-linux-amd64.tar.gz
  2. 安装 Helm 到系统目录,将解压后的 helm 二进制文件移动到 /usr/local/bin(系统可执行路径),确保全局可调用:

    bash 复制代码
    # 移动二进制文件
    sudo mv linux-amd64/helm /usr/local/bin/
    
    # 验证安装(查看 Helm 版本,出现版本信息即安装成功)
    helm version
  3. 配置 Helm 国内镜像源(加速仓库访问)

    bash 复制代码
    # 添加阿里云 Helm 镜像源
    helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    
    # 更新 Helm 仓库索引(确保获取最新的 Chart 信息)
    helm repo update
  4. 验证仓库是否添加成功

    bash 复制代码
    helm repo list

2. 安装 Jenkins

  1. 添加 Jenkins Helm 仓库

    bash 复制代码
    helm repo add jenkinsci https://charts.jenkins.io
    helm repo update
  2. 创建命名空间

    bash 复制代码
    kubectl create namespace jenkins
  3. 下载并安装

    bash 复制代码
    helm install jenkins jenkinsci/jenkins -n jenkins

    如果报错,就手动下载然后安装

    bash 复制代码
    # 手动下载到本地
    wget https://github.com/jenkinsci/helm-charts/releases/download/jenkins-5.8.83/jenkins-5.8.83.tgz
    
    # 然后用本地包安装
    helm install jenkins ./jenkins-5.8.83.tgz -n jenkins

3. 配置持久卷

  1. 这里用 Local Path Provisioner

    bash 复制代码
    kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml

    如果报错,就自己下载后 local-path-storage.yaml 复制到虚拟机中

    bash 复制代码
    kubectl apply -f local-path-storage.yaml
  2. 设置默认 StorageClass

    bash 复制代码
    kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

4. 配置端口

  1. 验证:完成上述操作后,验证是否安装成功,一样的,Running 就是正常的。

    bash 复制代码
    kubectl get pods -n jenkins
  2. 查看 Jenkins Service

    bash 复制代码
    kubectl -n jenkins get svc

    ClusterIP 只能在集群内部访问,外部访问不到。NodePort 外部可以访问。

  3. 改成 NodePort

    bash 复制代码
    kubectl patch svc jenkins -n jenkins -p '{"spec": {"type": "NodePort"}}'

    然后执行第 2 步获取端口

  4. 获取登录密码,账号默认是 admin

    bash 复制代码
    kubectl -n jenkins get secret jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode
  5. 访问测试

    bash 复制代码
    http://<任意节点IP>:<外部端口>
    用户名:admin
    密码:上面命令输出的密码

五、参考文章

相关推荐
花小璇学linux10 分钟前
imx6ull-驱动开发篇42——Linux I2C 驱动框架简介
linux·驱动开发·嵌入式软件
凌肖战12 分钟前
编写Linux下设备驱动时两种方案:内核态驱动开发和用户态驱动开发
linux·驱动开发
Wy_编程3 小时前
VS中创建Linux项目
linux
luck_lin3 小时前
linux添加新硬盘挂载分区和数据迁移
linux·运维·分区扩容
程序员杰哥4 小时前
Jmeter+Jenkins接口压力测试持续集成
自动化测试·软件测试·python·测试工具·jmeter·jenkins·压力测试
喜欢你,还有大家5 小时前
Linux笔记10——shell编程基础-4
linux·运维·服务器·笔记
不懂机器人5 小时前
linux编程----网络通信(TCP)
linux·服务器·tcp/ip
wjm05195 小时前
jenkins使用publishover ssh 进行远程连接
运维·ssh·jenkins
会飞的鱼_1236 小时前
CentOS 7服务器初始化全攻略:从基础配置到安全加固
服务器·安全·centos