1、部署 K8s 1.28 版本
1-1 环境准备
先准备3台服务器,通过二进制部署的方式安装 k8s 1.28 。同时要保证这些服务器之间可以通信,并且能够连接互联网
集群角色 | 主机名称 | 操作系统 | IP地址 |
Master | k8s-master | CentOS7.9_x64 | 192.168.10.71 |
Node | k8s-node1 | CentOS7.9_x64 | 192.168.10.72 |
Node | k8s-node2 | CentOS7.9_x64 | 192.168.10.73 |
1-2 系统初始化配置
在开始配置k8s集权之前,还需要配置系统检查各方面是否满足条件,检查服务器能否连接互联网,相互通信等等。此处克隆自已升级内核的模板机,不再详细写。所有命令都该在三台主机上操作,这里为了省时就在k8s-master上操作,其它两台node同理
1-2-1 检查系统内核版本
检查系统内核版本,内核版本过低可能会导致集群不够稳定或出现各种问题,升级内核方式参考主页其它教程。
[root@k8s-master ~]# uname -r
6.8.5-1.el7.elrepo.x86_64
………………
其它主机同理查看内核版本,k8s最低支持 3.10 但最好6.0 以上
1-2-2 禁用防火墙、清空iptables
iptables会生成一些默认的规则,配置不正确影响节点之间正常通信,直接清空这些规则
[root@k8s-master ~]# systemctl status firewalld.service
查看防火墙状态,这里模板机已经关闭且禁用
[root@k8s-master ~]# iptables -L
查看 iptables 的规则,此处也是模板及已经清了
[root@k8s-master ~]# iptables -F
如果你的 iptables 还有规则,则用以上命令清空后再查看
1-2-3 关闭 selinux
Linux的一种安全机制,使用起来比较负责且存在兼容问题,所以通常关闭它
[root@k8s-master ~]# getenforce
Disabled
[root@k8s-master ~]# sestatus
SELinux status: disabled
查看 selinux 的状态的两个命令,此处就是模板机永久禁用了
[root@k8s-master ~]# setenforce 0
setenforce: SELinux is disabled
临时关闭 selinux ,服务器重启后会重新开启
永久关闭 selinux,在配置文件中写,推荐的做法
[root@k8s-master ~]# vim /etc/selinux/config
…… …… ……
SELINUX=disabled ## 此处 enforcing 改成 disabled 。默认是 enforcing
…… …… ……
SELINUXTYPE=targeted
1-2-4 关闭 swap分区
swap 是一种虚拟技术,允许系统将部分内存数据写入磁盘的特定分区,从而释放更多物理内存。 kubelet 组件默认要求关闭 swap,以提高系统的稳定性和可靠性。
root@k8s-master ~]# free -m
total used free shared buff/cache available
Mem: 1946 123 1734 8 88 1700
Swap: 0 0 0
查看 swap 是否开启,swap 行的 used 列为 0 则说明 swap 已被禁用
[root@k8s-master ~]# swapoff -a
临时禁用,系统重启后仍会开启
[root@k8s-master ~]# vim /etc/fstab
……
用 # 注释掉文件系统类型位 “swap” 的行,此方法是永久禁用
1-2-5 设置主机名称,相互解析
分别设置好这些主机的主机名称,然后编辑 /etc/hosts 文件让它们相互解析,再通过 ssh 分发到各个主机上。
[root@k8s-master ~]# hostnamectl set-hostname k8s-master
主机名称已经提前设置好
[root@k8s-master ~]# vim /etc/hostname
修改主机名称的另一种方法
[root@k8s-master ~]# vim /etc/hosts
192.168.10.71 k8s-master
192.168.10.72 k8s-node1
192.168.10.73 k8s-node2
配置域名解析,让它们能够相互解析通信
[root@k8s-master ~]# scp /etc/hosts 192.168.10.72:/etc/hosts
……
yes 然后输入 root 的密码
[root@k8s-master ~]# scp /etc/hosts 192.168.10.73:/etc/hosts
……
通过 scp 同步master的 /etc/hosts 给其它两个节点
1-2-6 开启核心路由转发,配置网桥
某些 k8s 组件可能使用网络桥接(Bride),为了确保网络桥接数据包经过iptables处理,需要启用内核相关参数。
[root@k8s-master ~]# vim /etc/sysctl.conf
…… 最后一行打开注释添加
net.ipv4.ip_forward = 1
[root@k8s-master ~]# sysctl -p
net.ipv4.ip_forward = 1
开启核心路由转发
加载 br_netfilter 模块到内核中,这个模块适用于在网桥上启用 iptables 规则的,它允许规则应用于经过网桥的数据包
[root@k8s-master ~]# modprobe br_netfilter
加载模块
[root@k8s-master ~]# sysctl net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-ip6tables = 1
[root@k8s-master ~]# sysctl net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-iptables = 1
加载模块后启用这些内核参数
[root@k8s-master /etc/sysctl.d]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=
重启失效,写进文件即可永久生效。以上内容也可以直接写在 /etc/sysctl.conf 里
[root@k8s-master /etc/sysctl.d]# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
验证
2、安装Docker
接下来在所有节点上安装相同版本的 docker 并启动
2-1 添加阿里云的源和 docke仓库
docker 新版本包未被包含在系统默认的软件源中,需要额外配置 yum 软件源,首先添加阿里云的仓库配置文件
[root@k8s-master /etc/yum.repos.d]# vim aliyun.repo
[aliyun-os]
name=aliyun-os
baseurl=https://mirrors.aliyun.com/centos/7/os/x86_64/
enabled=1
gpgcheck=0
[aliyun-epel]
name=aliyun-epel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
enabled=1
gpgcheck=0
[aliyun-extra]
name=aliyun-extra
baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/
enabled=1
gpgcheck=0
新一下仓库缓存,然后通过阿里云补充一些命令和依赖包,然后获取 docker-ce 的源
[root@k8s-master /etc/yum.repos.d]# yum clean all
……
[root@k8s-master /etc/yum.repos.d]# yum makecache
……
更新yum缓存
[root@k8s-master /etc/yum.repos.d]# yum install -y yum-utils device-mapper-persistent-data lvm2
补充命令
[root@k8s-master /etc/yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
获取 docker-ce 的仓库
[root@k8s-master /etc/yum.repos.d]# ls
aliyun.repo docker-ce.repo
查看仓库中的仓库配置文件
2-2 安装指定版本Docker
此处安装的是 24.0.0 的 Docker 版本,如果指定安装的版本,则默认下载最新的版本
[root@k8s-master /etc/yum.repos.d]# yum install -y docker-ce-24.0.0
……
下载 24.0.0 版本的docker
2-3 安装 cri-docker
早期k8s用docker作为底层容器时,有一个名为 “Dcokershim” 的代理程序,负责 kubelet 和 docker 之间的通信。随着 k8s 生态的发展和越来越多的底层容器出现 , containerd、cri-o、rkt 等,为了支持这些容器运行,k8s引入了 CRI 标准,该标准允许第三方容器运行时只需要与 CRI 对接即可与 k8s 进行集成。
后来k8s在1.20版本宣布,为了优化核心代码,减少维护负担,将在 1.24版本中正式移除 Dockershim , 而当时 Docker 当时还不支持 CRI ,这就意味着以后 k8s 再也无法将 Docker 作为底层容器使用。 Docker 官方为了解决这个问题,与 Mirantis 公司合作,开发了一个名为 "cri-dockerd" 的代理程序,负责与 k8s 之间的通信。
因此,从 k8s 1.24 版本开始,使用 Docker 作为容器运行时,需要安装 cri-dockerd。可以在 GitHub Releases 页面 (https://github.com/Mirantis/cri-dockerd/releases)上找到适用于你系统平台版本的安装包,下载该安装包,然后将其上传到所有节点上进行安装。
[root@k8s-master ~]# wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.2/cri-dockerd-0.3.2-3.el7.x86_64.rpm
[root@k8s-master ~]# ls
cri-dockerd-0.3.2-3.el7.x86_64.rpm ……
直接从 github 下载 cri-dockerd 到本地
这里是直接从github的官网页面直接下载,可以把这个包保存到自己的电脑,以后直接上传到服务器上速度会快一些。
接下来安装 cri-docker ,将以来的 Pause 镜像指定为阿里云镜像地址
anaconda-ks.cfg cri-dockerd-0.3.2-3.el7.x86_64.rpm index.html
[root@k8s-master ~]# rpm -ivh cri-dockerd-0.3.2-3.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:cri-dockerd-3:0.3.2-3.el7 ################################# [100%]
安装 cri-docker
[root@k8s-master ~]# vim /usr/lib/systemd/system/cri-docker.service
9 ……
10 ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
11 ……
修改 Pause 镜像地址
启动 docker 再启动 cri-docker 否则 cri-docker 启动会报错,将他们设置开机自启
[root@k8s-master ~]# systemctl start docker
[root@k8s-master ~]# systemctl enable docker
……
[root@k8s-master ~]# systemctl status docker
……
启动 docker 设置开机自启
[root@k8s-master ~]# systemctl start cri-docker
[root@k8s-master ~]# systemctl enable cri-docker
……
[root@k8s-master ~]# systemctl status cri-docker
……
启动 cri-docker 设置开机自启
2-4 node节点部署 Docker
k8s-node1 和 k8s-node2 两个节点,参考以上 1-2 ~ 2-3 步骤,安装相同版本的 Docker 和 cir-docker,启动设置好开机自启。
检查环境 - 开启核心路由转发和网桥 - 添加阿里云网络源 - 补充依赖安装相同版本的 Docker - 安装 配置 cri-docker - 启动 Docker 和 cri-docker - 开机自启
……
环境检查省略
[root@k8s-master ~]# scp cri-dockerd-0.3.2-3.el7.x86_64.rpm k8s-node1:/root/
……
[root@k8s-master ~]# scp cri-dockerd-0.3.2-3.el7.x86_64.rpm k8s-node2:/root/
……
scp cri-docker的rpm包给其它节点
[root@k8s-master ~]# scp /etc/yum.repos.d/aliyun.repo 192.168.10.72:/etc/yum.repos.d/
……
[root@k8s-master ~]# scp /etc/yum.repos.d/aliyun.repo k8s-node2:/etc/yum.repos.d/
……
通过 scp 分发阿里云网络源
……
两个节点分别更新缓存,补充依赖,然后安装相同版本 Docker
然后安装 cri-docker ,修改配置文件中 Pauses 镜像地址
参考 k8s-master 完成后续步骤,成功启动并设置开机自己 docker 和 cri-docekr
3、安装 kubeadm 和 kubelet
所有节点上都要安装 kubeadm 和 kubelet 组件,但是系统默认软件源中并没有,需要配置额外的软件源,这里依旧使用阿里云的软件源。
3-1 配置好阿里云的 k8s 源
这里的k8s相关组件都是从阿里云下载,直接配置阿里云的网络源
[root@k8s-master /etc/yum.repos.d]# vim kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
写好 k8s 的源
[root@k8s-master /etc/yum.repos.d]# yum makecache fast
……
重新更新缓存
3-2 安装 kubeadm 和 kubelet
组件的版本都是可选择的,如果不指定安装的版本那么就会默认下载最新的版本,这里演示的是 1.28(当前最新的版本) ,也可以利用 yum list 查看当前的最新版本
[root@k8s-master /etc/yum.repos.d]# yum list --showduplicates kubeadm | tail
……
查看 yum list 列出的可以用包,最后10行,最后一行应该就是最新了
安装 1.28.0版本的 kubeadm 和 kubelet
[root@k8s-master /etc/yum.repos.d]# yum install -y kubeadm-1.28.0 kubelet-1.28.0
……
下载指定版本的 k8s 组件
kubeadm 仅是一个集群搭建工具,不涉及启动。kubelet 是一个守护进程,由 kubeadm 在搭建过程中自动启动,设置开机自启即可
[root@k8s-master /etc/yum.repos.d]# systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
设置 kubelet 开机自启
3-3 两个 node 也安装好相关组件
两个 node 节点依旧参考上述步骤,scp 阿里云的 k8s 源到本地,然后安装相同版本的 kubeadm 和 kubelet
部署过程省略……
同样都设置 kubelet 开机自启
3-4 在 master 节点上初始化集群
按照以下命令,初始化k8s集群。此步骤会稍久,会执行一系列的检查,查看当前系统环境是否满足 kubernetes 的安装要求,包括cpu 内存是否满足最低要求、网络是否正常、操作系统是否支持等等。
[root@k8s-master ~]# kubectl init \
> --apiserver-advertise-address=192.168.10.71 \
> --image-repository=registry.aliyuncs.com/google_containers \
> --kubernetes-version=v1.28.0 \
> --pod-network-cidr=10.244.0.0/16 \
> --service-cidr=10.96.0.0/12 \
> --cri-socket=unix:///var/run/cri-dockerd.sock
初始化代码,每个字段的详细意思自行查看相关书籍
耐心等待,初始化成功后会出现如下界面,如果是错误信息也会具体指出。
根据提示,复制管理员密钥到用户的加目录中,以便kubectl 根据该配置文件连接和管理 kubernetes 集群。
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
根据初始化结果中给的提示执行上面的命令
3-5 node节点加入集群
k8s-node1 和 k8s-node2 节点都通过返回的 "kubeadm join ……" 命令,并添加 "--cri-socket" 参数,以将这些节点工作节点都添加到集群中。
[root@k8s-node1 ~]# kubeadm join 192.168.10.71:6443 --token 7x9fgi.wyuhm3sjeh6a5zo7 \
> --discovery-token-ca-cert-hash sha256:3e07aa5b587878ce30104dd3b00ca8037b554d793ef944ab853df73c2c5371e5 \
> --cri-socket=unix:///var/run/cri-dockerd.sock
……
[root@k8s-node2 ~]# kubeadm join 192.168.10.71:6443 --token 7x9fgi.wyuhm3sjeh6a5zo7 \
> --discovery-token-ca-cert-hash sha256:3e07aa5b587878ce30104dd3b00ca8037b554d793ef944ab853df73c2c5371e5 \
> --cri-socket=unix:///var/run/cri-dockerd.sock
……
命令执行后,会出现以下内容
回到 k8s-master 节点上运行 kubectl get nodes 查看结果
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 31m v1.28.0
k8s-node1 NotReady <none> 5m12s v1.28.0
k8s-node2 NotReady <none> 3m49s v1.28.0
两个节点均已成功添加到集群中,kubeadm 默认根据主机名来设置节点名称,kubeadm join …… 的后边添加 --node-name xxxx 来自己设置节点名称。
4、 部署网络插件
4-1 网络插件的作用
现在两个节点都加入到集群中了,但是他们的状态是 NotReady ,表示该节点未准备就绪,这是由于 kublet 服务未发现网络插件导致的,kubelet 日志中也说明了。
kubernetes 网络插件主要用于时间集群内部 Pod 通信,负责配置和管理 Pod 的网络。常见的网络插件有 Calico、Flannel、Cilium 等,这里选择使用 Calico 作为 kubernetes 网络插件。
部署 Tigera 操作符,Tigera 操作符是 Calico 项目中一个关键组件,它是一个 k8s 操作符,用于自动化 Calico 的部署和管理,Tigera 能够自动化部署 Calico 的所有组件,配置管理,监控集群状态,升级和维护等功能。
4-2 部署 Calico 网络插件
先部署 Tigera 操作符。
[root@k8s-master ~]# kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/tigera-operator.yaml
namespace/tigera-operator created
先创建一个文件夹,专门存放个各种yaml资源文件,方便管理,然后获取 Calico 的资源文件。
[root@k8s-master ~]# mkdir yaml
[root@k8s-master ~]# cd yaml/
[root@k8s-master ~/yaml]# wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/custom-resources.yaml
……
修改 Calico 中 calicoNetwork 下 cidr 的值,让其与 " kubeadm init " 初始化的时候保持一致,修改完成后记得应用。
[root@k8s-master ~/yaml]# vim custom-resources.yaml
……
12 - blockSize: 26
13 cidr: 10.244.0.0/16
14 encapsulation: VXLANCrossSubnet
……
[root@k8s-master ~/yaml]# kubectl apply -f custom-resources.yaml
应用后会下载相关 Pod 的镜像,通过 kubectl get pods -n calico-system 查看,等待镜像下载完成,所有的 Pod 都启动。
[root@k8s-master ~/yaml]# kubectl get pods -n calico-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-78676d4878-c2g8t 1/1 Running 0 19m
calico-node-5mhst 1/1 Running 0 19m
calico-node-jsmxr 1/1 Running 0 19m
calico-node-ltbrf 1/1 Running 0 19m
calico-typha-67dc4c7595-4cmnl 1/1 Running 0 19m
calico-typha-67dc4c7595-nd2dq 1/1 Running 0 19m
csi-node-driver-msfwx 2/2 Running 0 19m
csi-node-driver-vk4zs 2/2 Running 0 19m
csi-node-driver-vnv48 2/2 Running 0 19m
4-3 完成部署,检查
所有的 Pod 状态都为 running 的时候,说明 Calico 安装成功,此时再查看 node 节点状态就变成 Ready 了 ,表示节点已经准备就绪了。
[root@k8s-master ~/yaml]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 76m v1.28.0
k8s-node1 Ready <none> 51m v1.28.0
k8s-node2 Ready <none> 49m v1.28.0
需要注意的是,k8s 考虑安全性, "kubeadm join" 命令中 token 有效时间为 24 小时,过期后不可以再使用,但是可以使用 " kubeadm token create --print-join-command " 命令来创建新的 Token ,以添加新的 node 节点。
5、部署 Dashbord
Dashboard 是官方开发的一个 Web 管理系统,通过它可以管理集群资源、查看应用概况、查看容器日志和访问容器等操作。
5-1 下载 Dahsboard 的资源文件
从官网下载资源文件到本地的 yaml 目录下。
[root@k8s-master ~]# cd yaml/
[root@k8s-master ~/yaml]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
修改 Service 的类型为 " NodePort " 并指定访问端口,以便将其暴露到集群外部进行访问。
[root@k8s-master ~/yaml]# vim recommended.yaml
……
39 spec:
40 type: NodePort ## 新增type,指定 NodePort 类型
41 ports:
42 - port: 443
43 targetPort: 8443
44 nodePort: 30001 ## 新增指定访问端口
45 selector:
……
5-2 应用文件,创建相关资源
修改完成后保存推出,应用 yaml 文件,在集群中创建相关资源
[root@k8s-master ~/yaml]# kubectl apply -f recommended.yaml
在 kubernetes-dashboard 中查看 Pod 对象
[root@k8s-master ~/yaml]# kubectl get pods -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-5657497c4c-tt5h6 1/1 Running 0 6m38s
kubernetes-dashboard-78f87ddfc-d7kmg 1/1 Running 0 6m38s
Pod 的状态都显示为 " runnning " 了就说明 Dashboard 安装完成了。
5-3 浏览器登录访问
Pod 都准备完成后,在浏览器中访问 " https://<节点IP地址>:30001 " 将看到如下登录界面
回到 k8s-master 上来,创建一个服务账号并授予集群管理员权限
命令内容详情后边学到 角色基于访问控制(RBAC) 就明白了,简单来说第一条命令创建一个新的服务账号 admin-user ,第二条命令将这个服务账号和集群中的预制角色 cluster-admin 绑定在一起,cluster-admin 类似与超级管理员,这就使得了创建的服务账户有了更高管理权限
[root@k8s-master ~/yaml]# kubectl create serviceaccount admin-user -n kubernetes-dashboard
serviceaccount/admin-user created
[root@k8s-master ~/yaml]# kubectl create clusterrolebinding admin-user --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin-user
clusterrolebinding.rbac.authorization.k8s.io/admin-user created
根据服务账号创建一个 Token
[root@k8s-master ~/yaml]# kubectl create token admin-user -n kubernetes-dashboard
…… # 获得一长串的 token
将输出的 token 复制到输入框中,然后点击登录,就可以进入 dashboard 的首页。
5-4 清空/恢复集群环境
如果需要重新部署或者卸载 kubernetes 集群环境,使用以下命令,该命令将清空当前节点上由 kubeadm 生成的所有操作和配置。
[root@k8s-master ~/yaml]# kubeadm reset --cri-socket=unix:///var/run/cri-docker.sock
至此集群准备完毕,下一章节学习如何部署应用程序。