Linux 安装 K8S 之 kubeadm
摘要
-
本文介绍 Linux 下 使用 kubeadm 安装 K8S 的方法,本文以 CentOS 8 为例。
安装前设置(所有节点)
修正系统的时间
1 | # 安装chrony |
安装 docker(可选)
-
k8s 使用
docker作为容器运行时才需要安装,安装方法参见 Linux 安装 Docker
创建用户
-
避免使用root用户,这里创建一个
centos用户,要求该用户具有sudo权限,如果使用docker运行时,则需要将该用户添加到docker用户组
1 | # 1.创建用户 |
升级内核
-
由 kubeadm 创建的 Kubernetes 集群依赖于使用内核特性的相关软件。
-
Kubernetes 集群的节点对于使用 Linux 内核版本要求参加Linux 内核版本要求
-
kubeadm 项目支持 LTS 内核。参阅 LTS 内核列表。
1 | # 查看当前内核版本,可以看到当前内核版本为 4.18.0 |
将 SELinux 设置为 permissive 模式(相当于将其禁用)
1 | $ sudo setenforce 0 |
禁用Firewalld
1 | # 为了方便,这里可以禁用 firewalld |
不关 Firewalld 应该开放哪些端口?(实测还是会遇到各种各样的问题)
-
Master 节点需要开放的端口
| 端口 | 协议 | 说明 |
|---|---|---|
| 6443 | TCP | kube-apiserver,用于 kubectl 与集群通信 |
| 2379-2380 | TCP | etcd 集群通信(仅在你自己部署 etcd 时) |
| 10250 | TCP | kubelet 监听端口,供 apiserver 与节点通信 |
| 10259 | TCP | kube-scheduler |
| 10257 | TCP | kube-controller-manager |
-
Worker 节点需要开放的端口
| 端口 | 协议 | 说明 |
|---|---|---|
| 10250 | TCP | kubelet 与 apiserver 通信 |
| 30000-32767 | TCP | NodePort 服务默认端口范围 |
| 10255 | TCP | kubelet 只读端口(默认关闭,可不开放) |
-
如果你使用的是 Calico 网络插件
| 端口 | 协议 | 说明 |
|---|---|---|
| 179 | TCP | BGP 通信端口,用于 Calico 节点间路由(若使用 BGP 模式) |
-
如果你使用的是 Flannel(VXLAN 模式)
| 端口 | 协议 | 说明 |
|---|---|---|
| 8472 | UDP | VXLAN 数据通信 |
-
Ingress 控制器(比如 NGINX Ingress)
| 端口 | 协议 | 说明 |
|---|---|---|
| 80 / 443 | TCP | 提供 HTTP/HTTPS 服务访问(Ingress 服务) |
-
示例命令:使用 firewall-cmd 开放端口
1 | # 启动 firewalld |
关闭swap
1 | sudo swapoff -a |
加载内核模块
1 | sudo modprobe overlay |
设置内核参数
1 | cat <<EOF | sudo tee /etc/sysctl.d/kubernetes.conf |
安装containerd
1 | sudo yum install -y yum-utils device-mapper-persistent-data lvm2 |
-
如果是国内环境,可以在
/etc/containerd/config.toml添加镜像加速器配置
1 | sudo vim /etc/containerd/config.toml |
安装cri-dockerd(可选)
-
如果使用 containerd,则不需要安装 cri-dockerd
-
Kubernetes 1.24+ 默认移除了 dockershim,所以你必须安装 cri-dockerd 才能继续使用 Docker
1 | # 下载并安装 cri-dockerd RPM,目前最新版是 0.3.19,fc35: Fedora 35 构建,适配 RHEL/CentOS 8 系统的 glibc 和 libstdc++ |
安装 kubelet, kubeadm, kubectl
-
添加 Kubernetes YUM 源,k8s 的版本从官网获取
1 | $ cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo |
-
安装 kubelet, kubeadm, kubectl
1 | # 查看kubeadm有什么版本 |
-
启用 shell 自动补全功能
1 | # 1.安装 bash-completion |
创建集群(master节点)
-
master节点: [hostname: k8s-master, IP: 10.211.55.11]
-
初始化master节点的控制面板,容器运行时基于
containerd
1 | # kubeadm init --help可以查看命令的具体参数用法 |
-
查看集群状态
1 | # 集群信息 |
-
为当前用户授予连接集群的权限
1 | $ mkdir -p $HOME/.kube |
-
安装网络插件:k8s支持的网络插件,
1 | # 安装calico前查看pod,-A 查看所有命名空间 |
calica 安装后可能出现不正常的情况,比如
calico-node-xxx的pod始终无法正常运行,此时可以尝试重新安装 calica
1 | # 删除 calico |
添加节点(worker节点)
-
worker节点: [hostname: k8s-worker1, IP: 10.211.55.15]
1 | # 在待加入的节点上执行如下命令,如果忘记token,则使用下文的命令重新获取 |
-
如果上面的令牌忘记了,或者新的 worker 节点加入,在 master 上执行下面的命令,生成新的令牌
1 | $ kubeadm token create --print-join-command |
-
在 master 节点上查看新创建的资源,默认情况下 work 节点不支持管理 k8s
1 | # 查看节点 |
-
使 work 节点支持管理 k8s(可选):远程管理
1 | # 将 master 节点中的 ~/.kube/config 复制到 work 节点的 ~/.kube/config 即可 |
-
删除work节点
1 | # master, 删除节点前先清空节点上的所有 Pod,使其调度到其他节点 |
测试:用K8S部署Nginx
1 | # 创建deployment |
通过 kubeadm 卸载 Kubernetes
1 | # 停止 kubelet 相关组件,删除 /etc/kubernetes 配置,清除证书、状态目录等,取消 iptables 规则,清除容器运行时中的 Pod、镜像信息等 |
停止和禁用 kubelet 服务
1 | sudo systemctl stop kubelet |
升级 kubeadm 集群
-
将 kubeadm 创建的 Kubernetes 集群从 1.32.x 版本 升级到 1.33.x 版本以及从 1.33.x 升级到 1.33.y(其中 y > x),略过次版本号的升级是 不被支持的。
升级步骤
升级 master 节点
-
如果要从
v1.33升级到v1.34,则需要先修改 Kubernetes YUM 源,因为我上面配置 yum 源时配置的是v1.33 -
如果只是从
v1.33.2升级到v1.33.3,则不需要修改 Kubernetes YUM 源
1 | # 查看 kubeadm 可以升级的版本 |
-
手动升级你的 CNI 驱动插件,比如 Calico
-
升级 kubelet 和 kubectl
1 | # 安装指定的版本 |
升级 worker 节点
-
如果要从
v1.33升级到v1.34,则需要先修改 Kubernetes YUM 源,因为我上面配置 yum 源时配置的是v1.33 -
如果只是从
v1.33.2升级到v1.33.3,则不需要修改 Kubernetes YUM 源
1 | # 查看 kubeadm 可以升级的版本 |
-
腾空节点:如果有多个 worker 节点,可以选择先腾空节点。如果只有一个 worker 节点,则不需要。
drain 是为了在升级期间 避免该节点上正在运行的业务容器受到影响
1 | # 在控制平面节点上执行此命令 |
-
升级 node 节点
1 | $ sudo kubeadm upgrade node |
-
升级 kubelet 和 kubectl
1 | # 安装指定的版本 |
-
如果前面对节点做了 腾空节点 操作,则需要取消对节点的保护,将节点标记为可调度,让节点重新上线
1 | # 在控制平面节点上执行此命令 |
更新证书
-
kubeadm 创建的证书存放在
/etc/kubernetes/pki/下,默认客户端证书有效期为 1 年 -
可以通过如下命令查看证书信息
1 | kubectl -n kube-system get cm kubeadm-config -o yaml |
-
查看证书到期时间
1 | sudo kubeadm certs check-expiration |
-
更新客户端证书
1 | # 更新前备份 |
Kubernetes 节点组件
| 角色 | 组件名 | 说明 |
|---|---|---|
| Master Node | kube-apiserver |
Kubernetes 的 API 请求入口,处理所有 REST 请求,协调各组件。 |
kube-scheduler |
调度器,决定将 Pod 调度到哪个合适的 Node。 | |
kube-controller-manager |
包含多个控制器(如 NodeController、ReplicationController、DeploymentController 等),用于控制和调整集群状态。 | |
etcd |
分布式 KV 存储系统,存储 Kubernetes 所有状态数据。只有 API Server 能直接访问。 | |
| Worker Node | kubelet |
负责与 Master 通信,执行其下发的 Pod 管理任务,控制容器生命周期。 |
kube-proxy |
负责维护 Node 上的网络规则,支持服务负载均衡和网络通信。 | |
container runtime |
容器运行时,比如 Docker、containerd、CRI-O,负责实际运行容器。 |