【云原生】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,需要自己装。
-
卸载旧版本(如果有)
bashsudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
-
安装必要依赖
bashsudo yum install -y yum-utils device-mapper-persistent-data lvm2
-
添加 Docker 官方源
bashsudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
-
安装 Docker CE
bashsudo yum install -y docker-ce docker-ce-cli containerd.io
-
配置 Docker 的镜像加速源和 cgroup 驱动
bashcat > /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
-
启动并设置开机启动
bashsystemctl start docker && systemctl enable docker
-
验证,显示版本信息为安装成功
bashdocker --version
2. 安装 kubeadm、kubelet、kubectl
- 所有节点必须执行!!!
- Kubernetes 官方源默认被墙,我们用阿里云镜像仓库。
-
添加 K8s 阿里云 repo
bashcat <<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
-
安装 kubeadm、kubelet、kubectl
bashsudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
-
kubeadm 和 kubectl 仅是一个集群搭建工具和管理工具,不涉及启动。而 kubelet 是一个守护进程程序,由 kubeadm 在搭建过程中自动启动,这里仅设置开机启动即可
bashsudo systemctl enable kubelet
3. 系统配置
- 所有节点必须执行!!!
- k8s 要求,不然容易报错
-
关闭防火墙
bashsudo systemctl stop firewalld sudo systemctl disable firewalld
-
关闭 SELinux,SELinux是Linux的一个安全机制,但使用复杂和存在兼容性问题,通常选择关闭它。
bashsudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
-
关闭 Swap,Swap是一种虚拟内存技术,它允许系统将部分内存数据写到硬盘上的特定分区,从而释放更多物理内存。由于硬盘读写性能相比物理内存低,因此使用Swap会影响系统处理性能。并且Kubelet组件默认要求关闭Swap,以提高系统的稳定性和可靠性。
bashsudo swapoff -a sudo sed -i '/ swap / s/^/#/' /etc/fstab
-
设置主机名
bashhostnamectl set-hostname xxx
-
添加 hosts,可以在每个节点中都添加上,方便后面使用
bashcat >> /etc/hosts << EOF 192.168.111.129 master 192.168.111.128 slave1 192.168.111.130 slave2 EOF
-
配置内核参数
bashcat <<EOF | sudo tee /etc/modules-load.d/k8s.conf br_netfilter EOF sudo modprobe br_netfilter
-
配置 iptables 转发
bashcat <<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
-
时间同步(避免节点时间不一致)
bashsudo yum install -y chrony sudo systemctl start chronyd && sudo systemctl enable chronyd
4. 安装 cri-docker
- 所有节点必须安装!!!
- 前面提到过 docker 和 k8s 的关系,所以这个是必须安装的,否则跑不起来。
-
下载安装包:github / Mirantis / cri-dockerd,我下载的 0.3.14,版本过高容易报莫名其妙的错误
-
下载好后,拖到虚拟机中
-
安装,跳转目录就不说了
bashrpm -ivh cri-dockerd-0.3.14-3.el7.x86_64.rpm
-
安装完成后,修改Systemd服务文件指定依赖的Pause镜像为国内镜像地址
bashvi /usr/lib/systemd/system/cri-docker.service
复制进去
bashExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
-
刷新配置和启动服务
bashsystemctl daemon-reload systemctl start cri-docker && systemctl enable cri-docker
5. 初始化 Master 节点
- 也就是只在 master 执行!
-
在 Master 节点执行以下命令初始化 Kubernetes 管理节点,注意
apiserver-advertise-address
填上自己电脑的管理节点 IP 地址 ,pod-network-cidr
是一个很重要的参数整个集群只此一个:bashkubeadm 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
-
安装完成会有 successfully 标记,以及后续需要执行的操作,上面的是在 master 执行的,下面的是在 slave 执行的(记住就行,复制到一边),我在安装的时候没截图,这里用的别人的图
-
配置 kubectl
bashmkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
-
验证
bashkubectl get nodes
6. 初始化 Slave 节点
- 也就是只在 Slave 执行!
-
在两台工作节点执行上述返回的
kubeadm join
命令,并添加--cri-socket
参数,以将这些工作节点加入到集群中,如果报错再添加--ignore-preflight-errors
bashkubeadm 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
-
验证
bashkubectl get nodes
7. 安装 CNI 网络插件
- 本操作只需要在 master 执行!!!
- 完成上述操作后,节点状态显示为"NotReady",表示节点尚未准备就绪,这是由于kubelet服务未发现网络插件导致的。因此需要安装网络插件。
- 常见的网络插件包括Calico、Flannel、Cilium 等,这里用 Calico
-
下载 calico.yaml,访问不了就科学上网,下载完然后复制到虚拟机
-
安装Calico网络插件,跳转目录就不说了
bashkubectl apply -f calico.yaml
-
排错:如果一直下载不好,或者报错,可以试试下面的方法
-
查看单个容器情况
bashkubectl 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
-
-
可能要等很久,验证是否安装成功
bashkubectl get pods -n kube-system
状态全是 Running 就是成功
8. 安装 Dashboard
- 本操作只需要在 master 执行!!!
- Dashboard是官方开发的一个Web管理系统,通过它可以管理集群资源、查看应用概览、查看容器日志和进入容器等操作。
-
下载 recommended.yaml,访问不了就科学上网,下载完然后复制到虚拟机
-
将Service的类型设置为"NodePort"类型并指定访问端口,以便将其暴露到集群外部访问,新增两行:
bashvim recommended.yaml
-
安装面板插件,依旧是要等很长一段时间
bashkubectl apply -f recommended.yaml
-
验证,查看 Pod 对象,全部 Running 时为安装成功
bashkubectl get pods -n kubernetes-dashboard
然后访问
https://<节点IP地址>:30001
就能看到登录页面
9. Dashboard 登录和免密登录
- 本操作只需要在 master 执行!!!
- 先说安全登录:
-
创建一个服务账号并授予集群管理员权限:
bashkubectl create serviceaccount admin-user -n kubernetes-dashboard kubectl create clusterrolebinding admin-user --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin-user
-
根据服务账号创建Token:
bashkubectl create token admin-user -n kubernetes-dashboard
-
把 Token 复制到文本框中点击登录
- 免密登录:
-
编辑 dashboard 的 Deployment
bashkubectl -n kubernetes-dashboard edit deployment kubernetes-dashboard
添加参数
--enable-skip-login
,配置文件比较长,建议搜索附近文字
-
给 Dashboard 管理员权限,否则看不到配置。这时刷新 Dashboard 页面就可以看到 "跳过" 按钮
bashkubectl create clusterrolebinding kubernetes-dashboard \ --clusterrole=cluster-admin \ --serviceaccount=kubernetes-dashboard:kubernetes-dashboard
-
如果报错就删掉原来的,然后重新执行第 2 步
bashkubectl delete clusterrolebinding kubernetes-dashboard
四、安装 Jenkins
- 本操作只需要在 master 执行!!!
1. 下载 Helm
- Helm 是 Kubernetes 的包管理工具,被称为 "Kubernetes 的 apt/yum",用于简化 Kubernetes 应用的部署、升级、回滚和管理。它的核心作用是将 Kubernetes 应用的一系列资源(如 Deployment、Service、ConfigMap 等 YAML 配置文件)打包成一个称为 "Chart" 的标准化单元,使得应用分发和部署更加便捷。
-
下载 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
-
安装 Helm 到系统目录,将解压后的
helm
二进制文件移动到/usr/local/bin
(系统可执行路径),确保全局可调用:bash# 移动二进制文件 sudo mv linux-amd64/helm /usr/local/bin/ # 验证安装(查看 Helm 版本,出现版本信息即安装成功) helm version
-
配置 Helm 国内镜像源(加速仓库访问)
bash# 添加阿里云 Helm 镜像源 helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts # 更新 Helm 仓库索引(确保获取最新的 Chart 信息) helm repo update
-
验证仓库是否添加成功
bashhelm repo list
2. 安装 Jenkins
-
添加 Jenkins Helm 仓库
bashhelm repo add jenkinsci https://charts.jenkins.io helm repo update
-
创建命名空间
bashkubectl create namespace jenkins
-
下载并安装
bashhelm 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. 配置持久卷
-
这里用 Local Path Provisioner
bashkubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
如果报错,就自己下载后 local-path-storage.yaml 复制到虚拟机中
bashkubectl apply -f local-path-storage.yaml
-
设置默认 StorageClass
bashkubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
4. 配置端口
-
验证:完成上述操作后,验证是否安装成功,一样的,Running 就是正常的。
bashkubectl get pods -n jenkins
-
查看 Jenkins Service
bashkubectl -n jenkins get svc
ClusterIP 只能在集群内部访问,外部访问不到。NodePort 外部可以访问。
-
改成 NodePort
bashkubectl patch svc jenkins -n jenkins -p '{"spec": {"type": "NodePort"}}'
然后执行第 2 步获取端口
-
获取登录密码,账号默认是 admin
bashkubectl -n jenkins get secret jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode
-
访问测试
bashhttp://<任意节点IP>:<外部端口> 用户名:admin 密码:上面命令输出的密码