k8s搭建记
有没有那么一首歌会让你轻轻跟着和
牵动我们共同过去记忆它不会沉默
有没有那么一首歌会让你心里记着我
就算日子匆匆过去我们曾走过
安装环境
操作系统
CentOS 10
master | node1 | node2 |
---|---|---|
192.168.222.155/24 | 192.168.222.156/24 | 192.168.222.157/24 |
环境准备
这里我用MobaXterm连接三台虚拟机
MobaXterm的Multi-execution mode 可以同时操纵三台机器
关闭防火墙与selinux
关闭防火墙
1 | systemctl stop firewalld && systemctl disabale firewalld && iptables -F |
关闭selinux
1 | sed -i 's/enforcing/disabled/' /etc/selinux/config && setenforce 0 |
关闭swap分区
临时关闭
1 | swapoff -a |
永久关闭swap
1 | sed -ri 's/.*swap.*/#&/' /etc/fstab |
永久关闭是需要 重启才能生效的
修改hosts文件
设置主机名
这里mater、node1、node2节点主机名我就分别设置为mater、node1、node2了。
1 | #master 节点 |
修改hosts文件
加入
1 | 192.168.222.155 master |
修改内核参数
1 | cat > /etc/sysctl.d/k8s.conf << EOF |
加载ip_vs内核模块
1 | modprobe ip_vs |
设置开机自启动
1 | cat > /etc/modules-load.d/ip_vs.conf << EOF |
安装docker
配置yum源
1 | #下载 wget |
安装docker
1 | yum install docker-ce docker-ce-cli -y |
编辑/etc/docker/daemon.json
1 | mkdir /etc/docker/ |
启动docker服务
1 | systemctl daemon-reload && systemctl enable docker && systemctl start docker |
安装Kubernetes
配置yum源
1 | cat > /etc/yum.repos.d/kubernetes.repo << EOF |
安装kubeadm、kubelet、kubectl
1 | #列出所有版本 |
配置CRI
配置containerd
导出containerd默认配置到/etc/containerd/config.toml
1 | containerd config default > /etc/containerd/config.toml 该方式已弃用 |
sandbox_image
是 Kubernetes 用来作为 Pod “沙箱”的 pause 容器镜像。里指定了一个国内阿里云镜像地址
1 | [plugins."io.containerd.grpc.v1.cri"] |
让 containerd 使用 systemd 管理 cgroup,和现代 Linux 系统及 Kubernetes 要求保持一致,避免资源管理问题。
1 | [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] |
配置镜像加速器
创建目录 /etc/containerd/certs.d/docker.io/
1 | mkdir -p /etc/containerd/certs.d/docker.io |
创建配置文件/etc/containerd/certs.d/docker.io/hosts.toml
1 | server = "https://docker.io" |
重启 containerd
1 | systemctl daemon-reexec && systemctl restart containerd && systemctl enable containerd |
验证 CRI 是否启用
1 | ctr plugins list | grep cri |
输出应包含
1 | io.containerd.grpc.v1.cri - ok |
确保 containerd 启动成功并监听 CRI socket
确认是否有以下文件存在
1 | ls /run/containerd/containerd.sock |
如果存在,尝试运行:
1 | crictl --runtime-endpoint=unix:///run/containerd/containerd.sock ps -a |
部署Kubernetes Master节点
初始化master节点
1 | kubeadm init \ |
参数 | 含义 |
---|---|
kubeadm init |
初始化 Kubernetes 主节点(control-plane),启动控制平面组件和 etcd |
--kubernetes-version=1.28.2 |
指定安装的 Kubernetes 版本为 v1.28.2 |
--apiserver-advertise-address=192.168.222.155 |
指定 kube-apiserver 对外通告的 IP 地址,通常为主节点的内网 IP |
--service-cidr=10.96.0.0/16 |
指定 Service 虚拟 IP 地址的网段,集群内部用于服务发现 |
--pod-network-cidr=10.244.0.0/16 |
指定 Pod 网络地址范围,需与所选网络插件(如 Flannel)兼容 |
--image-repository=registry.aliyuncs.com/google_containers |
替换默认镜像仓库地址,使用阿里云镜像源加速国内拉取 |
--ignore-preflight-errors=Mem |
忽略内存预检错误(比如内存小于推荐值),常用于低配测试环境 |
配置kubectl
执行初始化成功之后给出的三条命令
1 | mkdir -p $HOME/.kube |
查看节点信息
只能看到master节点信息等其他节点加入进来之后就能看到其他节点的信息了
安装flannel
1 | kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml |
为 Kubernetes 集群安装 Flannel 网络插件。Flannel 是一种常用的 Kubernetes 容器网络插件(CNI),用于实现 Pod 之间的网络通信。
Node节点加入集群
在node1、node2上面都执行
1 | kubeadm join 192.168.222.155:6443 --token 18d5th.zv9sunrhfwz4ftip \ |
然后再次在master节点上使用kubectl get nodes
命令就能看到node节点的信息
然后也可以给node1与node2打上角色标签
1 | kubectl label node node1 node-role.kubernetes.io/worker=worker |
简单部署一个应用
部署一个nginx应用
1 | #这个命令会创建一个名为 `nginx-test` 的 Deployment,里面运行官方的 Nginx 镜像。 |
查看服务详细
1 | kubectl get svc nginx-test |
在集群外部
使用浏览器访问 <节点ip>:30381
就能访问到nginx
三个节点的ip全能够访问