Kubeadm部署K8s

Kubeadm部署K8s

集群规划:

Master节点规划:

Node节点规划:

安装要求

bash 复制代码
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
操作系统 CentOS7.x-86_x64
硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
集群中所有机器之间网络互通
可以访问外网,需要拉取镜像
禁止swap分区

此实验机器规划如下:

bash 复制代码
k8s-master  42.51.227.113    Centos 7.x-X86_64
k8s-node1   42.51.227.114  Centos 7.x-X86_64
k8s-node2   42.51.227.115  Centos 7.x-X86_64
k8s-node3   42.51.227.116  Centos 7.x-X86_64

在各节点执行---修改主机名

bash 复制代码
hostnamectl --static set-hostname k8s-master
hostnamectl --static set-hostname k8s-node1
hostnamectl --static set-hostname k8s-node2
hostnamectl --static set-hostname k8s-node3

在各节点执行---修改hosts文件

bash 复制代码
cat <<EOF > /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
42.51.227.113  k8s-master
42.51.227.114  k8s-node1
42.51.227.115  k8s-node2
42.51.227.116  k8s-node3
EOF

在各节点执行---修改DNS

bash 复制代码
cat <<EOF> /etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8
EOF

在各节点执行---设置个性主机名:

bash 复制代码
带时间的个性主机名
echo "PS1='\[\e[37;1m\][\[\e[36;40m\]\t\[\e[32;40m\]\u\[\e[33;40m\]@\[\e[31;40m\]\h \[\e[34;40m\]\w\[\e[37;1m\]]\\$\[\e[m\]'" >>.bashrc

不带时间的个性主机名
echo "PS1='\[\e[37;1m\][\[\e[36;40m\]\[\e[32;40m\]\u\[\e[33;40m\]@\[\e[31;40m\]\h \[\e[34;40m\]\w\[\e[37;1m\]]\\$\[\e[m\]'" >>.bashrc

在各节点执行---关闭CentOS7自带的防火墙服务

bash 复制代码
systemctl disable firewalld && systemctl stop firewalld

在各节点执行---关闭selinux

bash 复制代码
sed -i 's/enforcing/disabled/' /etc/selinux/config && setenforce 0

在各节点执行---互相信任

bash 复制代码
ssh-keygen
ssh-copy-id xxx

在各节点都采用网络时间服务器

安装时间服务器软件

bash 复制代码
yum install -y chrony

修改配置文件/etc/chrony.conf

bash 复制代码
sed -i -e '/^server/d' -e '1aserver ntp.aliyun.com iburst\nserver tw.pool.ntp.org iburst' -e '/local stratum 10/clocal stratum 10\nbindcmdaddress 127.0.0.1\nbindcmdaddress ::1' /etc/chrony.conf

chronyd服务启动并自启

bash 复制代码
systemctl enable chronyd --now && systemctl restart chronyd

检查323 udp端口的监听是否是*:323

bash 复制代码
ss -ntlup | grep 323

检查时间同步状态

bash 复制代码
chronyc sources

在各节点执行---安装基础软件:ebtables ethtool否则执行 kubeadm init会报错

bash 复制代码
yum install vim wget yum-utils device-mapper-persistent-data lvm2 ebtables ethtool -y

在各节点执行---添加阿里yum源

bash 复制代码
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && yum clean all && yum makecache

在各节点执行---添加docker阿里yum源--选一项即可

bash 复制代码
1.
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo && yum makecache fast

在各节点执行---配置kubernetes国内阿里yum源

bash 复制代码
cat <<EOF > /etc/yum.repos.d/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 
EOF

在各节点执行---生成缓存

bash 复制代码
yum makecache fast -y

在各节点执行---生成系统及软件包

bash 复制代码
yum update -y

在各节点执行---安装docker-ce---不指定版本将安装最新版本

bash 复制代码
yum -y install docker-ce

如果指定版本:

bash 复制代码
1.列出所有版本的 Docker CE
yum list docker-ce --showduplicates | sort -r
2.可以安装特定版本
yum install docker-ce-18.06.2.ce-3.el7 containerd.io -y

在各节点执行---启动docker并设置为开机启动

bash 复制代码
systemctl enable docker --now

在各节点执行---配置镜像加速器和日志驱动和修改docker cgroup驱动,与k8s一致,使用systemd方式

bash 复制代码
sudo tee /etc/docker/daemon.json <<-'EOF' 
{ 
    "registry-mirrors": ["https://nty7c4os.mirror.aliyuncs.com"],
    "live-restore":true,
    "exec-opts":["native.cgroupdriver=systemd"],
    "log-driver":"json-file",
    "log-opts":{
         "max-size":"100m",
         "max-file":"3"
    }
}
EOF

Ps:备注:systemd是系统自带的cgroup管理器, 系统初始化就存在的, 和cgroups联系紧密,为每一个进程分配cgroups, 用它管理就行了. 如果设置成cgroupfs就存在2个cgroup控制管理器, 实验证明在资源有压力的情况下,会存在不稳定的情况.cgroupfs是docker自带的

热加载配置和重启docker

bash 复制代码
systemctl daemon-reload && systemctl restart docker

在各节点执行---升级内核到5.7

bash 复制代码
自带3.10内核存在BUG,建议升级到4.10.x及以上版本
BUG介绍:https://myit.icu/index.php/archives/389/
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
rpm -import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
在各节点执行---安装kernel-ml内核   lt:长期维护版本,ml:长期稳定版本
yum -y --enablerepo=elrepo-kernel install kernel-ml.x86_64 kernel-ml-devel.x86_64
在各节点执行---查看启动器
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
在各节点执行---设置默认启动为新内核---0后边内核为5.x,根据实际情况选择
grub2-set-default 0
在各节点执行---重启系统
reboot
Ps:重启后查看内核是否为:5.8.xxx,按当时装的最新版本为准

在各节点执行---永久关闭swap

bash 复制代码
swapoff -a && sed -i 's/.*swap.*/#&/' /etc/fstab

kubernetes的想法是将实例紧密包装到尽可能接近100%。 所有的部署应该与CPU /内存限制固定在一起。 所以如果调度程序发送一个pod到一台机器,它不应该使用交换,设计者不想交换,因为它会减慢速度,所以关闭swap主要是为了性能考虑。

在各节点执行---加载 ipvs 模块,保证在节点重启后能自动加载所需模块---kube-proxy开启ipvs的前置条件

bash 复制代码
yum install ipset ipvsad -y


cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
#开启ipvs,最新支持的负载均衡(SLB)
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4   # 内核新版本改为nf_conntrack
modprobe -- br_netfilter
EOF

在各节点执行---赋值权限并执行生效

bash 复制代码
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules

加载生效出现报错,请修改

bash 复制代码
内核使用最新版本4.19.1,无法加载nf_conntrack_ipv4模块 
4.19.1最新版本的内核,nf_conntrack_ipv4已经修改为nf_conntrack。

在各节点执行---查看是否已经正确加载所需的内核模块

bash 复制代码
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

在各节点执行---关闭邮箱服务(节省内存,根据自己实际来定)

bash 复制代码
systemctl stop postfix.service && systemctl disable postfix.service

在各节点执行---查看kubernetes源当前状态

bash 复制代码
yum repolist all | grep kubernetes

如果源状态为disable则需要开启---执行如下命令使kubernetes源生效。

对于CentOS,执行yum-config-manager --enable 时,"repo_name"是执行yum repolist all | grep kubernetes时回显的第二个字段"Kubernetes","K"为大写

在各节点执行---安装kubelet,不指定版本将安装最新版本

bash 复制代码
yum -y install kubelet kubeadm kubectl --disableexcludes=kubernetes

参数解析:"--disableexcludes=kubernetes"表示在查找包的时候禁止排除kubernetes这个源

查看当前系统存在的kubernetes的版本号

bash 复制代码
yum list all | grep kubernetes

可选:也可以指定版本号:kubelet-1.18.2

bash 复制代码
yum -y install kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2 --disableexcludes=kubernetes

链接:https://github.com/kubernetes/kubernetes/releases

在各节点执行---查看k8s版本号

bash 复制代码
kubelet --version

在各节点执行---查看配置文件目录

bash 复制代码
# rpm -ql kubelet
/etc/kubernetes/manifests  #清单目录
/etc/sysconfig/kubelet  #配置文件
/usr/bin/kubelet  #主程序
/usr/lib/systemd/system/kubelet.service

在各节点执行---设置开机自启

bash 复制代码
systemctl enable kubelet

查看kubenets需要哪些镜像

bash 复制代码
[root@k8s-master ~]# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.18.2
k8s.gcr.io/kube-controller-manager:v1.18.2
k8s.gcr.io/kube-scheduler:v1.18.2
k8s.gcr.io/kube-proxy:v1.18.2
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7

我们可以先提前下载这些镜像---但是要确认是否使用了代理,因为国内无法访问k8s.gcr.io

bash 复制代码
kubeadm config images pull

如果没有国外代理机器,就使用以下脚本来使用阿里源镜像仓库下载后更改标签为k8s.gcr.io

方法:

bash 复制代码
vim /root/pullimages.sh
#!/bin/bash
#https://deanit.cn
#使用阿里镜像仓库
#查看版本号并替换为阿里镜像仓库源下载
kubeadm config images list | sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g' | sh -x
#将镜像名字更改为原来的k8s.gcr.io
docker images | grep registry.cn-hangzhou.aliyuncs.com/google_containers | awk '{print "docker tag",$1":"$2,$1":"$2}' | sed -e 's/registry.cn-hangzhou.aliyuncs.com\/google_containers/k8s.gcr.io/2' | sh -x
#将从阿里镜像仓库下载的镜像删除
docker images | grep registry.cn-hangzhou.aliyuncs.com/google_containers | awk '{print "docker rmi """$1""":"""$2}' | sh -x

赋值脚本权限并执行

bash 复制代码
chmod a+x /root/pullimages.sh && sh /root/pullimages.sh

Node节点:

Node节点仅需要这两个镜像,所以使用上边办法单独下载这两个镜像即可。

bash 复制代码
k8s.gcr.io/kube-proxy:v1.18.2
k8s.gcr.io/pause:3.2

在k8s-master节点执行---使用kubeadm初始化集群

指定版本:需要与我们上边安装的版本一致:--kubernetes-version=v1.18.2

不指定版本:不指定版本,不添加--kubernetes-version=v1.18.2参数即可

bash 复制代码
kubeadm init  --kubernetes-version=v1.18.2 --apiserver-advertise-address=42.51.227.113 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap --dry-run

重要提示:--dry-run:试运行不应用任何变化;输出将要完成的工作,测试没问题后将该参数去掉执行即可!

Ps:由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。如果使用以上的两个方法拉取镜像,这里就不用再次指定镜像仓库地址就行了。

在k8s-master节点执行---初始化完成后,根据提示执行以下三步

bash 复制代码
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

保存以下内容:用于添加节点时需要

bash 复制代码
kubeadm join 42.51.227.113:6443 --token p1vfu6.qt4hypzpvoyxfuaf \
--discovery-token-ca-cert-hash sha256:6534570565aa1a8b66539287f2e478201bad41fa8c0fe2811533442e51f882f5 

在k8s-master节点执行安装Pod网络插件---加入flannel

bash 复制代码
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Ps:确保能够访问到quay.io这个registery,有时会出现连接失败,我们可以先通过wget下载yml文件,再进行安装。

在k8s-master节点执行---查看flannel镜像

可以通过docker image list镜像列表看到quay.io/coreos/flannel镜像被下载,大小为52.8MB,因网络原因下载镜像慢可以等一会即可查看到flannel镜像

root@k8s-master \~\]# docker images ![在这里插入图片描述](https://file.jishuzhan.net/article/1766703109209329665/81f98ece301c0d05d1ac63905fa295c2.webp) 执行了加入flannel命令并不代表就可以使用,我们可以通过kubectl get pods -n kube-system来获取当前系统上正在运行的pods,我们看到flannel处于正在运行的状态才算正常 待测试方法: ```bash 使用pod的网络通讯(这里使用七牛云镜像,七牛云相当于CDN资源) #下载flannel curl -o kube-flannel.yml https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml #替换为七牛云镜像 sed -i "s/quay.io\/coreos\/flannel/quay-mirror.qiniu.com\/coreos\/flannel/g" kube-flannel.yml #加入 kubectl apply -f kube-flannel.yml #删除 rm -f kube-flannel.yml ``` 在k8s-master节点执行---验证pod信息---查看system名称空间下的所有pod\*\* \[root@k8s-master \~\]# kubectl get pod -n kube-system ```bash kubectl get pods -o wide -A #查看所有pod详细信息 ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1766703109209329665/be32ad9171d3515f4d2a5e99b2fcc54c.webp) 以上信息我们看到kube-flannel-ds-amd64-ckp6m已经处于运行中 *****验证集群节点***** 上面执行完命令后,集群不会马上变成ready状态,因为系统需要去下载docker镜像,稍等片刻后我们可以执行一下命令验证集群状态。 -o wide:表示查看消息信息 ```bash kubectl get node效果等于kubectl get nodes [root@k8s-master ~]# kubectl get node -o wide ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1766703109209329665/3a46bc6393a024271aec48e7beace2f0.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1766703109209329665/68edbc5d711062c927d50401f3d6376d.webp) 验证pod信息查看system命名空间下的所有pods ```bash [root@k8s-master ~]# kubectl get pod -n kube-system ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1766703109209329665/da765fe1c4f468d13f8701b05705fc2e.webp) Ps:当所有节点都变成ready后,所有pod的ready都变成1/1,表示集群搭建完成!!!

相关推荐
2501_9240641131 分钟前
2025年优测平台:微服务全链路性能瓶颈分析与最佳实践
微服务·云原生·架构·性能瓶颈·全链路性能
石小千1 小时前
Ubuntu24.04 安装Docker
运维·docker·容器
scriptsboy2 小时前
Halo Docker 迁移方法
运维·docker·容器
隐语SecretFlow2 小时前
【隐语Secretflow】一文速通基于可信执行环境 (TEE) 的零信任计算系统
云原生·kubernetes·开源
R.lin2 小时前
Docker核心原理详解
运维·docker·容器
MarkHD2 小时前
车辆TBOX科普 第70次 AUTOSAR Adaptive、容器化与云原生的融合革命
云原生·wpf
Dobby_052 小时前
【k8s】集群安全机制(一):认证
运维·安全·kubernetes
测试人社区-小明3 小时前
测试领域的“云原生”进化:Serverless Testing
人工智能·科技·云原生·面试·金融·serverless·github
阿基米东3 小时前
Traefik:为云原生而生的自动化反向代理
运维·云原生·自动化
纷飞梦雪3 小时前
排查k8s连接mysql的pod
云原生·容器·kubernetes