k8s-集群环境搭建(二)

发布时间:2026/8/21 8:16:54
k8s-集群环境搭建(二) 目录1. 环境规划集群类型安装方式主机规划2.环境搭建主机安装环境初始化安装docker安装k8s的三个组件准备集群镜像集群初始化-master初始化安装网络插件安装kubectl命令补全工具3.环境部署1. 环境规划集群类型kubernetes集群大体上分为两类一主多从和多主多从。一主多从一台Master节点和多台Node节点搭建简单但是有单机故障风险适合用于测试环境多主多从多台Master节点和多台Node节点搭建麻烦安全性高适合用于生产环境本文章搭建的是一主两从类型的集群安装方式kubernetes有多种部署方式目前主流的方式有kubeadm、minikube、二进制包minikube一个用于快速搭建单节点kubernetes的工具kubeadm一个用于快速搭建kubernetes集群的工具二进制包 从官网下载每个组件的二进制包依次去安装此方式对于理解kubernetes组件更加有效本文章使用的是kubeadm部署方式网上看了很多貌似kubeadm是最常用的了主机规划作用 IP地址 操作系统 配置Master 192.168.109.101 Centos7.5 基础设施服务器 2核 2G内存 50G硬盘Node1 192.168.109.102 Centos7.5 基础设施服务器 2核 2G内存 50G硬盘Node2 192.168.109.103 Centos7.5 基础设施服务器 2核 2G内存 50G硬盘记住操作系统必须选用7.5及7.5以上的后续会有解释2.环境搭建镜像下载地址CentOS/7.9.2009本次环境搭建需要安装三台centos服务器(一主二从)然后在每台服务器中分别安装docker、kubeadm、kubelet、kubectl程序主机安装安装虚拟机过程注意下面选项的设置操作系统环境CPU2G 内存2G 硬盘50G软件选择基础设施服务器分区选择自动分区网络配置按照下面配置网路地址信息网络地址192.168.109.100三台主机分别为100-102子网掩码255.255.255.0默认网关192.168.109.2DNS223.5.5.5主机名设置master节点masternode节点node1/node2环境初始化注意三台主机都要进行如下操作1.检查操作系统的版本# 此方式下安装kubernetes集群要求Centos版本要在7.5或之上[rootmaster ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)2.主机名解析为了方便后面集群节点间的直接调用在这配置一下主机名解析# 编辑三台服务器的/etc/hosts文件vi /etc/hosts# 添加下面内容,注意如果你的ip跟我不一样对应的改一下即可192.168.109.100 master192.168.109.101 node1192.168.109.102 node23.时间同步kubernetes要求集群中的节点时间必须精确一致这里直接使用chronyd服务从网络同步时间。# 启动chronyd服务 [rootmaster ~]# systemctl start chronyd # 设置chronyd服务开机自启 [rootmaster ~]# systemctl enable chronyd # chronyd服务启动稍等几秒钟就可以使用date命令验证时间了 [rootmaster ~]# date 2022年 02月 28日 星期一 15:24:30 CST4.禁用iptables和firewalld服务kubernetes和docker在运行中会产生大量的iptables规则为了不让系统规则跟它们混淆直接关闭系统的规则# 1 关闭firewalld服务 [rootmaster ~]# systemctl stop firewalld [rootmaster ~]# systemctl disable firewalld # 2 关闭iptables服务 [rootmaster ~]# systemctl stop iptables [rootmaster ~]# systemctl disable iptables5.禁用selinuxselinux是linux系统下的一个安全服务如果不关闭它在安装集群中会产生各种各样的奇葩问题# 编辑 /etc/selinux/config 文件修改SELINUX的值为disabled # 注意修改完毕之后需要重启linux服务稍后重启 vi /etc/selinux/config # 找到SELINUXenforcing改成SELINUXdisabled # 测试是否关闭显示Disabled为关闭成功即重启之后才会成功 [rootmaster ~]# getenforce Disabled6.禁用swap分区swap分区指的是虚拟内存分区它的作用是在物理内存使用完之后将磁盘空间虚拟成内存来使用。启用swap设备会对系统的性能产生非常负面的影响因此kubernetes要求每个节点都要禁用swap设备。但是如果因为某些原因确实不能关闭swap分区就需要在集群安装过程中通过明确的参数进行配置说明。# 编辑分区配置文件/etc/fstab注释掉swap分区一行 # 注意修改完毕之后需要重启linux服务 vi etc/fstab # 将下面这一行可以看到是swap前面加个#注释掉 /dev/mapper/centos-swap swap swap defaults 0 0 # 变成下面这样子就完成了稍后再重启 # /dev/mapper/centos-swap swap swap defaults 0 07.修改linux的内核参数# 修改linux的内核参数添加网桥过滤和地址转发功能 # 编辑/etc/sysctl.d/kubernetes.conf文件 vi etc/sysctl.d/kubernetes.conf #添加如下配置: net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 # 重新加载配置 [rootmaster ~]# sysctl -p # 加载网桥过滤模块 [rootmaster ~]# modprobe br_netfilter # 查看网桥过滤模块是否加载成功 [rootmaster ~]# lsmod | grep br_netfilter br_netfilter 22256 0 bridge 146976 1 br_netfilter8.配置ipvs功能在kubernetes中service有两种代理模型一种是基于iptables的一种是基于ipvs的。两者比较的话ipvs的性能明显要高一些但是如果要使用它需要手动载入ipvs模块# 1 安装ipset和ipvsadm [rootmaster ~]# yum install ipset ipvsadmin -y # 2 添加需要加载的模块写入脚本文件 [rootmaster ~]# cat EOF /etc/sysconfig/modules/ipvs.modules #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF # 3 为脚本文件添加执行权限 [rootmaster ~]# chmod x /etc/sysconfig/modules/ipvs.modules # 4 执行脚本文件 [rootmaster ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules # 5 查看对应的模块是否加载成功 [rootmaster ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4 nf_conntrack_ipv4 15053 9 nf_defrag_ipv4 12729 1 nf_conntrack_ipv4 ip_vs_sh 12688 0 ip_vs_wrr 12697 0 ip_vs_rr 12600 0 ip_vs 141432 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr nf_conntrack 133053 9 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_nat_masquerade_ipv4,nf_nat_masquerade_ipv6,nf_conntrack_ipv4,nf_conntrack_ipv6 libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack重启服务器上面步骤完成之后需要重新启动linux系统[rootmaster ~]# reboot安装docker注意三台主机都要安装docker# 1 切换镜像源,换成阿里的 [rootmaster ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo # 2 安装docker我这里直接安装最新版的不多bb [rootmaster ~]# yum install docker -y # 3 修改配置文件Docker在默认情况下使用的Cgroup Driver为cgroupfs # 而kubernetes推荐使用systemd来代替cgroupfs [rootmaster ~]# cd /etc/docker [rootmaster ~]# cat EOF /etc/docker/daemon.json { exec-opts: [native.cgroupdriversystemd], registry-mirrors: [https://kn0t2bca.mirror.aliyuncs.com] } EOF # 注意了这里直接启动docker会报错因为docker.service里有一条配置 # 和刚才添加的exec-opts冲突了下面是解决方案 # 4 解决报错 # vi /lib/systemd/system/docker.service # 找到并删除下面这句话保存退出即可解决 # --exec-opt native.cgroupdrivercgroupfs \ # 5 启动docker [rootmaster ~]# systemctl daemon-reload [rootmaster ~]# systemctl restart docker [rootmaster ~]# systemctl enable docker # 6 检查docker状态和版本能检查到就说明你安装启动好了 [rootmaster ~]# docker version [rootmaster ~]# systemctl status docker安装k8s的三个组件注意三台主机都要安装k8s的三个组件# 由于kubernetes的镜像源在国外速度比较慢这里切换成国内的镜像源 # 编辑/etc/yum.repos.d/kubernetes.repo vi /etc/yum.repos.d/kubernetes.repo #添加下面的配置 [kubernetes] nameKubernetes baseurlhttp://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled1 gpgcheck0 repo_gpgcheck0 gpgkeyhttp://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg # 安装kubeadm、kubelet和kubectl [rootmaster ~]# yum install kubeadm kubelet kubectl -y # 配置kubelet的cgroup # 编辑/etc/sysconfig/kubelet vi /etc/sysconfig/kubelet # 添加下面的配置 KUBELET_CGROUP_ARGS--cgroup-driversystemd KUBE_PROXY_MODEipvs # 设置kubelet开机自启 [rootmaster ~]# systemctl enable kubelet准备集群镜像注意三台主机都要准备集群镜像# 在安装kubernetes集群之前必须要提前准备好集群需要的镜像所需镜像可以通过下面命令查看 [rootmaster ~]# kubeadm config images list k8s.gcr.io/kube-apiserver:v1.23.4 k8s.gcr.io/kube-controller-manager:v1.23.4 k8s.gcr.io/kube-scheduler:v1.23.4 k8s.gcr.io/kube-proxy:v1.23.4 k8s.gcr.io/pause:3.6 k8s.gcr.io/etcd:3.5.1-0 k8s.gcr.io/coredns/coredns:v1.8.6 # 下载镜像 # 此镜像在kubernetes的仓库中,由于网络原因,无法连接下面提供了一种替代方案 # 下载国内的镜像然后给镜像改名如果你看到此博文安装时 # list里面的版本与我不同直接修改下面的image的版本即可其他不要动 # 直接在bash里面复制粘贴下面的语句即可 images( kube-apiserver:v1.23.4 kube-controller-manager:v1.23.4 kube-scheduler:v1.23.4 kube-proxy:v1.23.4 pause:3.6 etcd:3.5.1-0 coredns:v1.8.6 ) for imageName in ${images[]} ; do docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName done # 注意coredns组件路径是k8s.gcr.io/coredns/coredns:v1.8.6而不是k8s.gcr.io/coredns:v1.8.6 # 所以这一个手动修改一下 docker tag k8s.gcr.io/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6 docker rmi k8s.gcr.io/coredns:v1.8.6集群初始化-master初始化注意下面的操作只在master主机上操作# 创建集群 # 第一个参数是k8s的版本第二个是pod的网段第三个是service的网段第四个是master的地址 [rootmaster ~]# kubeadm init \ --kubernetes-versionv1.23.4 \ --pod-network-cidr10.244.0.0/16 \ --service-cidr10.96.0.0/12 \ --apiserver-advertise-address192.168.109.100 # 出现下面这句话就说明安装成功了 Your Kubernetes control-plane has initialized successfully ! #注意安装完成后的提示信息最后几行有个tokennode加入集群时会用到 kubeadm join 192.168.109.100:6443 --token jh2hn8.hvebbwqlp9rqd5ri \ --discovery-token-ca-cert-hash sha256:d4c63e4449affefd5755ce880bfbd3ae66cc2f8ac8b9b28408f038c622d53000 # 创建必要文件 [rootmaster ~]# mkdir -p $HOME/.kube [rootmaster ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [rootmaster ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/confignode加入集群注意下面的操作只在node主机上操作# 将node节点加入集群 [rootmaster ~]# kubeadm join 192.168.109.100:6443 --token jh2hn8.hvebbwqlp9rqd5ri \ --discovery-token-ca-cert-hash sha256:d4c63e4449affefd5755ce880bfbd3ae66cc2f8ac8b9b28408f038c622d53000 # 查看集群状态 此时的集群状态为NotReady这是因为还没有配置网络插件 [rootmaster ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 6m43s v1.17.4 node1 NotReady none 22s v1.17.4 node2 NotReady none 19s v1.17.4安装网络插件注意下面的操作只在master主机上操作kubernetes支持多种网络插件比如flannel、calico、canal等等任选一种使用即可本次选择flannel插件使用的是DaemonSet的控制器它会在每个节点上都运行# 获取fannel的配置文件 [rootmaster ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # 使用配置文件启动fannel [rootmaster ~]# kubectl apply -f kube-flannel.yml # 稍等片刻再次查看集群节点的状态 [rootmaster ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready control-plane,master 4h49m v1.23.4 node1 Ready none 4h48m v1.23.4 node2 Ready none 4h47m v1.23.4安装kubectl命令补全工具在日常管理k8s集群的时候时刻都会使用到Kubectl命令行工具但是该命令还是挺复杂的使用中也记不住那么多的api选项所以这里介绍一下Kubectl命令补全工具其实是Linux中bash命令自动补全工具的安装。[rootmaster ~]# yum -y install bash-completion [rootmaster ~]# source /usr/share/bash-completion/bash_completion [rootmaster ~]# source (kubectl completion bash) [rootmaster ~]# echo source (kubectl completion bash) ~/.bashrc3.环境部署环境测试接下来在kubernetes集群中部署一个nginx程序测试下集群是否在正常工作。# 部署nginx [rootmaster ~]# kubectl create deployment nginx --imagenginx deployment.apps/nginx created # 暴露端口 [rootmaster ~]# kubectl expose deployment nginx --port80 --typeNodePort service/nginx exposed # 查看服务状态 [rootmaster ~]# kubectl get pods,service NAME READY STATUS RESTARTS AGE pod/nginx-85b98978db-sh6cs 1/1 Running 0 38s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 none 443/TCP 4h55m service/nginx NodePort 10.108.112.185 none 80:31325/TCP 10s最后在电脑上访问下部署的nginx服务至此kubernetes的集群环境搭建完成