k8s安装kubeadm
使用kubeadm安装部署k8s集群
目前生产部署Kubernetes 集群主要有两种方式:
kubeadm
Kubeadm 是一个K8s 部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes 集群。
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
二进制包
从github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。
Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。
本篇介绍使用kubaadm安装部署集群,本篇安装是k8s:1.32.17版本的,之前升级内核也是为了安装版本,(之前内核太低的时候也安装过,但是集群出现问题,出现连接不上命令行的问题,因此进行内核升级处理),本篇会介绍安装时候,遇到的问题,恳请各位大佬批评指正。下面进行安装部署
k8s是基于docker为底层的逻辑在运行,安装的是1.32.17因此docker的版本也不能偏低(否测会出现不兼容等等的一些问题),下面开始安装部署以及环境准备
一、环境介绍
角色 | ip | 组件 |
---|---|---|
master | 192.168.10.10 | docker、kubeadm、kubectl、kubelet |
node1 | 192.168.10.20 | docker、kubeadm、kubectl、kubelet |
node2 | 192.168.10.30 | docker、kubeadm、kubectl、kubelet |
1.1节点准备
(所有节点升级内核)https://blog.csdn.net/mfq0622/article/details/147167939?spm=1001.2014.3001.5502
hostnamectl #确保所有节点的内核版本要进行升级,不低于这个版本
1.2主机名解析
vim /etc/hosts
1.3 时间同步
systemctl start chonyd
systemctl enable chronyd
date
要确保时间是一致的
1.4禁用iptables和firewalld服务
kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
systemctl stop firewalld
systemctl disable firewalld
#关闭iptables服务
systemctl stop iptables
systemctl disable iptables
1.5 禁用selinux
selinux是liunx系统下面的一个安全服务,如果不关闭它,会在集群安装中出现问题
#编辑 /etc/selinux/config 文件,修改selinux的值为disable
#注意修改完毕之后需要重启linux服务
SELINUX=disable
1.6 禁用swap分区
swap分区指的是虚拟内存分区,他的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernets要求每个节点都要禁用swap设备,但是如果因为某些原因不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
# 编辑分区配置文件/etc/fstab,注释掉swap分区一行
# 注意修改完毕之后需要重启linux服务
vim /etc/fstab
注释掉 /dev/mapper/centos-swap swap
# /dev/mapper/centos-swap swap
1.7修改linux内核参数
//调整内核参数
cat > /etc/sysctl.d/kubernetes.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF//生效参数
sysctl --system
1.8添加内核参数
vim /etc/security/limits.conf 内核限制配置
尾部添加
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
* soft memlock unlimited
* hard memlock unlimited
二、安装docker
#1、切换镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 2、查看当前镜像源中支持的docker版本
[root@master ~]# yum list docker-ce --showduplicates# 3、安装特定版本的docker-ce
# 必须制定--setopt=obsoletes=0,否则yum会自动安装更高版本
[root@master ~]# yum install docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io
添加镜像地址
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://hub-mirror.c.163.com","https://docker.m.daocloud.io","https://ghcr.io","https://mirror.baidubce.com","https://docker.nju.edu.cn","https://uy760d98.mirror.aliyuncs.com","https://docker.hpcloud.cloud","https://docker.unsee.tech","https://docker.1panel.live","http://mirrors.ustc.edu.cn","https://docker.chenby.cn","http://mirror.azure.cn","https://dockerpull.org","https://dockerhub.icu","https://hub.rat.dev"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"}
}EOF
#使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。
#日志使用json-file格式类型存储,大小为500M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。
4、重启加载并启动docker
systemctl daemon-reload
systemctl restart docker
现在docker安装好了我们安装k8s
三、安装k8s
1.1由于k8s镜像站在国外,我们换成国内的镜像源
//定义kubernetes源
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
#开始安装yum install --setopt=obsoletes=0 kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0 -y
#设置开机自启
systemctl enable kubelet.service
1.2下面在进行集群初始化
kubeadm init \--apiserver-advertise-address=192.168.10.10 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version=v1.23.17 \--service-cidr=10.96.0.0/12 \--pod-network-cidr=10.244.0.0/16# 创建必要文件
[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/conf
1.3下面的操作在node节点进行操作
kubeadm join 192.168.10.10:6443 --token 6u9k6k.i5u81qay5i1a03o5 \--discovery-token-ca-cert-hash sha256:3b26da02aa942983d08f3c0e7cf2b65d551ff6e367b3a2c4aade023f1fc5b722
1.4然后在主节点查看会出现NotReady的信息
kubectl get nodes
1.5下面需要安装网络插件,在主节点操作即可
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.17.0/Documentation/kube-flannel.yml
这个外网不好访问,可以将yaml文件下载下来
https://github.com/flannel-io/flannel/tree/master/Documentation/kube-flannel.yml
手动拉取
也可手动拉取指定版本
docker pull quay.io/coreos/flannel:v0.14.0 #拉取flannel网络,三台主机
docker images #查看仓库是否拉去下来
四、集群测试
#查看集群状态
kubectl get nodes
创建nginx服务
kubectl create deployment nginx --image=nginx:1.14-alpine
暴露端口
kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort
查看服务
kubectl get pod,svc
1.1验证服务
五、命令补全
1.1这个集群安装好了,但是使用tab补全不了命令这里需要进行安装设置
yum -y install bash-completion
source /usr/share/bash-completion/bash_completion
echo "source <(kubectl completion bash)" >> ~/.bashrc
六、故障排查和处理
故障1
安装k8s的时候遇见一个https的问题,(忘记截图了)这里面找了一个证书,放上去了加权限,并且运行了,发现还是没有效果,然后进行了重置集群的操作就正常了(根因没找出来,希望大佬指点一二)
kubeadm reset
故障2
在安装flannel插件的时候遇见一个pod起不来,然后本地有镜像,kubectl describe的时候发现还是去远程拉取
解决方法,在从节点都将镜像下载下来了,后面正常启动了
故障3
在进行验证服务的时候也出现了本地有这个nginx1.14版本的镜像还是回去远程拉取镜像(从节点也下载了)
解决办法:通过询问ai,说是nginx:1.14和nginx1.14是两个版本
然后去修改了pod需要的镜像版本就好了
kubectl edit deploy -n default
escribe的时候发现还是去远程拉取
解决方法,在从节点都将镜像下载下来了,后面正常启动了
[外链图片转存中…(img-PpqtBH03-1745074383624)]
故障3
在进行验证服务的时候也出现了本地有这个nginx1.14版本的镜像还是回去远程拉取镜像(从节点也下载了)
解决办法:通过询问ai,说是nginx:1.14和nginx1.14是两个版本
然后去修改了pod需要的镜像版本就好了
kubectl edit deploy -n default