kubeadm方式搭建Kubernetes集群(k8s v1.18)
kubeadm方式搭建k8s集群
流程介绍
【环境准备】准备三台虚拟机,并安装操作系统 CentOS 7.x
【系统初始化】对三个刚安装好的操作系统进行初始化操作
【安装工具】在三个节点安装 docker kubelet kubeadm kubectl
【集群部署-master】在 master 节点执行kubeadm init命令初始化
【集群部署-node】在 node 节点上执行 kubeadm join命令,把 node 节点添加到当前集群
【安装网络插件】配置 CNI 网络插件,用于节点之间的连通
【测试集群】通过拉取一个 nginx 进行测试,能否进行外网测试
环境准备
注:本次部署是单master节点
master 192.168.1.50 node1 192.168.1.51 node2 192.168.1.52
在开始之前,部署 Kubernetes 集群机器需要满足以下几个条件:
一台或多台机器,操作系统 CentOS7.x-86_x64
硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多
【注意】【注意】【注意】【master 需要两核】
可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
禁止 swap 分区
系统初始化
注:未特殊说明,则三台设备均需操作
禁用iptable和firewalld服务
kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
# 关闭防火墙
systemctl stop firewalld
# 禁用 firewalld 服务
systemctl disable firewalld
禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
# 关闭 selinux # 临时关闭【立即生效】 setenforce 0 # 永久关闭【重启生效】 sed -i 's/SELINUX=enforcing/\SELINUX=disabled/' /etc/selinux/config
# 关闭 swap
禁用swap分区
swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,
因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明。
# 临时关闭【立即生效】 swapoff -a # 永久关闭【重启生效】 sed -ri 's/.*swap.*/#&/' /etc/fstab
主机名解析
# 根据规划设置主机名【master节点上操作】 hostnamectl set-hostname master # 根据规划设置主机名【node1 节点上操作】 hostnamectl set-hostname node1 # 根据规划设置主机名【node2 节点操作】 hostnamectl set-hostname node2 # 主机master、node静态查询表中添加 hosts 为了方便集群节点间的直接调用,在这个配置一下主机名解析,企业中推荐使用内部DNS服务器 cat >> /etc/hosts << EOF 192.168.1.50 master 192.168.1.51 node1 192.168.1.52 node2 EOF
修改linux的内核参数
# 将桥接的 IPv4 流量传递到 iptables 的链(master、node都需要设置)
# 修改linux的内核参数,添加网桥过滤和地址转发功能 # 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置: cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF
# 重新加载配置
sysctl -p # 加载网桥过滤模块 modprobe br_netfilter # 查看网桥过滤模块是否加载成功 lsmod | grep br_netfilter
时间同步
# 时间同步(master、node都需要设置)
kubernetes要求集群中的节点时间必须精确一直,这里使用chronyd服务从网络同步时间
企业中建议配置内部的会建同步服务器
# 启动chronyd服务 yum -y install chrony systemctl enable chronyd --now date
配置ipvs功能
在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
# 1.安装ipset和ipvsadm yum install ipset ipvsadm -y # 2.添加需要加载的模块写入脚本文件 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.为脚本添加执行权限 chmod +x /etc/sysconfig/modules/ipvs.modules # 4.执行脚本文件 /bin/bash /etc/sysconfig/modules/ipvs.modules # 5.查看对应的模块是否加载成功 lsmod | grep -e ip_vs -e nf_conntrack_ipv4
安装组件Docker/kubeadm/kubelet
所有节点安装 Docker/kubeadm/kubelet
Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker。
安装 Docker
yum -y install wget 添加阿里docker yum源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo 安装docker yum -y install docker-ce-18.06.1.ce-3.el7 开机自启并启动 systemctl enable docker --now 查看版本 docker version 添加阿里云 YUM 软件源 设置仓库地址 注:这里请用自己的阿里加速地址 cat >/etc/docker/daemon.json << EOF { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"] } EOF 添加 阿里k8s yum 源 cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
安装 kubelet、kubeadm、kubectl
安装kubelet、kubeadm、kubectl,这里指定版本为1.18.0 yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 配置kubelet的cgroup 为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建议修改"/etc/sysconfig/kubelet"文件的内容: #编辑/etc/sysconfig/kubelet vim /etc/sysconfig/kubelet KUBELET_CGROUP_ARGS="--cgroup-driver=systemd" KUBE_PROXY_MODE="ipvs" # 设置开机自启【这里暂时先不启动 kubelet】 systemctl enable kubelet
集群部署master
在master(1.50)执行初始化操作
# 在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看 [root@master ~]# kubeadm config images list 在 192.168.1.50 上执行【集群初始化命令】,也就是master节点 [root@master ~]# kubeadm init --apiserver-advertise-address=192.168.1.50 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 注: --pod-network-cidr=10.244.0.0/16 指定pod分配ip的范围(pod网络的范围域) --service-cidr=10.96.0.0/12 指定service分配ip的范围(service网络的范围域) apiserver-advertise-address=192.168.1.50 是自己master的ip
由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址,【执行上述命令会比较慢,其实后台已经在拉取镜像了】,
使用docker images 命令即可查看已经拉取的镜像。共计拉取七个镜像
提示初始化成功
Your Kubernetes control-plane has initialized successfully!
部署成功后,【系统提示】运行以下命令使用 kubectl
To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.1.50:6443 --token 1p1n1s.v9ig618gqxb6pniy \ --discovery-token-ca-cert-hash sha256:224a4ee5a62b4c4e283dc7c0165a68608cc70ba7ac759f6c932607aaf70093d7
在master.50上执行
[root@master ~]# mkdir -p $HOME/.kube [root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config [root@master ~]# kubectl get nodes
集群部署node节点
在两个node节点分别执行
以下的命令是在 master 初始化完成后给出的,每个人的都不一样!!!需要复制自己生成的
kubeadm join 192.168.1.50:6443 --token 1p1n1s.v9ig618gqxb6pniy \ --discovery-token-ca-cert-hash sha256:224a4ee5a62b4c4e283dc7c0165a68608cc70ba7ac759f6c932607aaf70093d7
再次查看node状态
[root@master ~]# kubectl get nodes
注:默认的token有效期为24小时,当过期之后,该token就不能用了,这时可以使用如下的命令创建token:
kubeadm token create --print-join-command # 生成一个永不过期的token kubeadm token create --ttl 0 --print-join-command
部署CNI网络插件
上面的状态还是 NotReady,下面我们需要网络插件,来进行联网访问
# 下载网络插件配置(若不成功,多试几次) 只在master上操作 [root@master ~]#wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # 添加 [root@master ~]#kubectl apply -f kube-flannel.yml # 等一会! # ...... # 查看状态 【kube-system 是 k8s 中的最小单元】 [root@master ~]# kubectl get pods -n kube-system 等status均为running且ready都是1/1后 再次查看node状态 [root@master ~]]# kubectl get nodes status状态为running
测试 kubernetes 集群
在 Kubernetes 集群中创建一个 pod,验证是否正常运行
下载 nginx 【会联网拉取 nginx 镜像】 [root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine # 查看状态 [root@master ~]# kubectl get pod ContainerCreating是正在创建 如果出现 Running 状态的时候,表示已经成功运行了 下面就需要将端口暴露出去,让外界能够访问 [root@master ~]# kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort # 查看一下对外的端口 [root@master ~]# kubectl get pod,svc 此时可通过节点ip:端口访问镜像,看到nginx界面即为测试成功 访问地址:http://节点IP:Port http://192.168.1.51:31598/
参考
黑马B站k8s课程https://www.bilibili.com/video/BV1Qv41167ck/ https://gitee.com/yooome/golang/blob/main/k8s%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B-%E8%B0%83%E6%95%B4%E7%89%88/k8s%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B.md https://www.yuque.com/fairy-era/yg511q/xyqxge
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)