kubeadm搭建生产环境的单master节点的k8s集群

1.kubeadm搭建生产环境的单master节点的k8s集群

1.1 初始化集群环境

虚拟机基于Rocky Linux

准备三台linux机器,每台机器配置:4VCPU/4G内存/60G硬盘

环境说明:

IP 主机名 角色 内存 cpu

192.168.126.63 xuegod63 master 4G 4VCPU

192.168.126.64 xuegod64 worker 4G 4VCPU

192.168.126.62 xuegod62 worker 4G 4VCPU

1.配置静态ip 每台机器网络模式保持一直,能互相通信,机器网卡名字统一

目录:vim /etc/NetworkManager/system-connections/ens33.nmconnection

在这里插入图片描述

2.永久关闭selinux

cd /etc/selinux/config

sed -i 's/SELINUX-enforcing/SELINUX-disanled/g' /etc/selinux/config

#注意:修改selinux配置文件后,重启机器,selinux才能生效

查看是否成功: getenforce

在安装k8s时,关闭SELinux是因为默认情况下,SELinux会阻止Kubernetes一些操作,如kubelet对容器文件的访问等。为了避免由于SELinux导致Kubernetes 运行不正常,建议在安装Kubernetes之前关闭:SELinux。
如果启用了·SELinux,需要针对·Kubernetes·进行特定的·SELinux·配置,以确保·Kubernetes正常工作。具体的操作如下:
安装policycoreutils-python·工具: yum install -y policycoreutils-python

为·kubelet、kube-proxy·和· container·runtime·的进程添加· SELinux·策略。例如,为kubelet·添加策略的命令为:

semanage fcontext -a -t container_runtime_exec_t /usr/local/bin/kubelet

重载SELinux策略:

restorecon -R /usr/local/bin/kubelet

3.配置主机名

在3台主机上分别配置对应的主机名称:

hostnamectl set-hostname xuegod63 && bash
hostnamectl set-hostname xuegod64 && bash
hostnamectl set-hostname xuegod62 && bash

4.配置Hosts文件

修改每台机器的/etc/hosts文件:为了让3台机器互相通信

192.168.126.63 xuegod63

192.168.126.64 xuegod64

192.168.126.62 xuegod62

5.安装基本的软件包(3台)

yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo libaio-devel vim ncurses-devel autoconf automake zlib-devel epel-release openssh-server socat conntrack telnet ipvsadm

6.配置主机之间无密码登录

配置xuegod63到其它机器免密登录
ssh-keygen #一路回车,不输入密码
把本地的ssh公钥文件安装到远程主机对应的账户
ssh-copy-id xuegod63
ssh-copy-id xuegod64
ssh-copy-id xuegod62

7.关闭防火墙

systemctl stop firewalld; systemctl disable firewalld

[root@xuegod62~]#systemctl stop firewalld; systemctl disable firewalld
如果生产机器,防火墙开启,不能关,也可以,但是要放行一些端口:
6443:Kubernetes·APl Server
2379、2380:etcd服务
10250、10255:kubelet服务
10257:kube-controller-manager 服务
10259:kube-scheduler服务
30000-32767:在物理机映射的NodePort 端口
179、473、4789、9099:Calico服务端口
如何在防火墙规则里放行端口:
firewall-cmd --zone=public --add-port=6443/tcp --permanent
#–zone 指定了防火墙规则所属的区域,–add-port 指定了要开放的端口号和协议,–permanent·表示在重启后也会保留这个规则。“

8.关闭交换分区 swap

安装k8s 会检查交换分区,如果存在会报错,可以设置跳过检查交换分区 官方建议关掉 影响性能

swapoff -a

永久关闭 注释swap挂载

vim /etc/fstab #给swap这行开头加一下注释

交换分区(Swap)是为了在内存不足时,把部分内存的数据交换到硬盘上,以释放内存空间的一种机制。这样,即使物理内存不足,也可以保证系统运行的稳定性和正常性。在安装 Kubernetes 时,需要禁用交换分区。这是因为Kubernetes 在运行时需要使用大量的内存和 CPU资源,如果系统开始使用交换分区,会导致性能下降,严重影响Kubernetes的正常运行。因此,为了保证Kubernetes 的性能和稳定性,建议在安装Kubernetes 时禁用交换分区

9.修改内核参数

modprobe br_netfilter

modprobe是一个Linux命令,它用于动态加载内核模块到linux内核中。br_netfilter是linux内核模块之一,它提供了桥接网络设备和Netfilter之间的接口。Netfilter是Linux内核中的一个框架,它可以在数据包中通过网络协议栈时进行修改或过滤。

在kubernetes中,br_netfilter模块用于实现kubernetes集群中的网络功能。通过加载br_netfilter模块,我们可以确保在kubernetes集群中使用的iptables规则正确应用。

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 /etc/sysctl.d/k8s.conf

在这里插入图片描述

10、配置安装 docker 和 containerd 的需要的阿里云 yum 源

[root@xuegod63 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

[root@xuegod64 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

[root@xuegod62 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

11.配置安装k8s命令行工具需要的阿里云yum源

[root@xuegod63 ~] 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
EOF

然后在执行下面命令,使用在线Yum源安装kubeadm和kubelet

将xuegod63上kubernetes的yum源复制给xuegod64,xuegod62

[root@xuegod63 ~] scp /etc/yum.repos.d/kubernetes.repo xuegod64:/etc/yum.repos.d/

[root@xuegod63 ~] scp /etc/yum.repos.d/kubernetes.repo xuegod62:/etc/yum.repos.d/

12.配置时间同步

基于chrony配置服务器时间跟网络时间同步

以前使用ntpdate来同步系统时间,但是它是立即同步,在生产环境下,系统时间大范围的跳动,是非常严重的事件。

chrony 是网络时间协议(NTP)的另一种实现,与网络时间协议后台程序(ntpd)不同,它可以更快地且更准确地同步系统时钟。“
两个主要程序:chronyd和chronyc
chronyd:后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算机增减时间的比率,并对此进行补偿
chronyc:命令行用户工具,用于监控性能并进行多样化的配置。它在chronyd 实例控制的计算机上工作
服务unit 文件:·/usr/lib/systemd/system/chronyd.service
监听端口:·323/udp,123/udp
配置文件:/etc/chrony.conf
ntpdate 和 chrony是服务器时间同步的主要工具,两者的主要区别就是:
1、执行 ntpdate 后,时间是立即修整,中间会出现时间断档;“
2、而执行 chrony 后,时间也会修正,但是是缓慢将时间追回,并不会断档。

在这里插入图片描述

生效:

systemctl restart chronyd

写个计划任务:

在这里插入图片描述

crontab -e

* * * * /usr/bin/systemctl restart chronyd

systemctl restart crond

在Kubernetes集群中,各个组件之间的通信和协调都需要依赖时间的同步,如果集群中各节点时间不一致,可能会导致各种奇怪的问题,例如节点之间无法进行正确的TLS握手等。因此,建议在安装Kubernetes集群之前,将集群中各个节点的时间同步到相同的时间源,保持时间的一致性。

13.安装containerd 1.24废弃docker(3台都装)

在Kubernetes集群中,containerd是容器运行时,它的主要作用是负责管理节点上的容器,实现容器的创建、销毁、运行、暂停、恢复等操作。而Pod是Kubernetes中最基本的调度单元,一个Pod包含一个或多个紧密关联的容器,在Kubernetes集群中,当一个Pod被调度到一个节点上时Kubernetes就会基于containerd在pod里运行容器。

在xuegod63 上安装 containerd
[root@xuegod63~]# yum install containerd.io-1.6.22 --allowerasing -y
Containerd 版本要按照我这个版本,其他版本有问题。
生成containerd的配置文件:
[root@xuegod63~]# mkdir -p /etc/containerd
[root@xuegod63~] containerd config default > /etc/containerd/config.toml
[root@xuegod63~]# cd /etc/containerd/

修改配置文件:

阿里云镜像
sandbox_image = "registry.k8s.io/pause:3.8"
改为
sandbox_image = "registry.aliyuncs.com/k8sxio/pause:3.8" (registry.aliyuncs.com/google_containers/pause:3.7)

SystemdCgroup = false
修改为
SystemdCgroup = true
配置镜像加速 上下级配置,缩进两个空格
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
    endpoint = ["https://bqr1dr1n.mirror.aliyuncs.com"]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
    endpoint = ["https://registry.aliyuncs.com/k8sxio"]

启动 containerd、并设置开启自启动
[root@xuegod63.~]# systemctl enable containerd --now

查看启动情况:
systemctl status containerd

**配置harbor:**

[plugins."io.containerd.grpc.vl.cri".registry.configs][plugins."io.containerd.grpc.vl.cri".registry.configs."192.168.40.62".tls]
	[plugins."io.containerd.grpc.vl.cri".registry.configs."192.168.126.62".tls]
			insecure_skip_verify = true
	[plugins."io.containerd.grpc.vl.cri".registry.configs."192.168.126.62".auth]
			username = "admin"
			password  =  "Harbor12345"

在这里插入图片描述

14.安装docker-ce(3台都装)

在这里插入图片描述

15.安装初始化k8s需要的组件

[root@xuegod63~]# yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
[root@xuegod63~]#systemctl enable kubelet
[root@xuegod64~]# yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
[root@xuegod64~]#systemctl enable kubelet
[root@xuegod62~]# yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
[root@xuegod62~]#systemctl enable kubelet

查看版本:

yum install kubelet-1.26*

注:每个软件包的作用
kubelet: kubelet是Kubernetes 集群中的一个核心组件,是每个节点上的代理服务,负责与主控制节点通信,管理节点上的 Pod 和容器。
kubelet 的主要职责包括:
监控 pod 的状态并按需启动或停止容器、检查容器是否正常运行、与主控制节点通信,将节点状态和 Pod 状态上报给主控制节点、通过各种插件(如 volume 插件)与其他组件协同工作、管理容器的生命周期,包括启动、停止、重启等、拉取镜像
kubeadm:用于初始化 k8s 集群的命令行工具
kubectl:·用于和集群通信的命令行,通过 kubectl 可以部署和管理应用,查看各种资源,创建.删除和更新各种组件

安装k8s几种方式:

1.kubeadm

2.二进制

都是官网提供的方式,也是生产环境用的

还可以借助第三方平台:rancher,kubesphere 安装k8s (不太稳定)

1.2 初始化集群

备注: 安装k8s,物理机网段,pod网段,service网段不能冲突
使用kubeadm初始化k8s集群 配置文件
[root@xuegod63~]#kubeadm config print init-defaults > kubeadm.yaml
需要修改kubeadm.yaml文件:
查看containerd.sock的路径:
find / -name "containerd.sock"

在这里插入图片描述

镜像地址修改:

在这里插入图片描述

在这里插入图片描述

特别提醒:

1、nodeRegistration:criSocket: unix:///var/run/containerd/containerd.sock
nodeRegistration 是在Kubernetes集群中注册节点的一种方式。在这个配置中,crisocket 表示与此节点相关的容器运行时的地址,此处指的是使用Containerd作为容器运行时。
2、–image-repository·registry.cn-hangzhou.aliyuncs.com/google_containers 表示从阿里云镜像仓库的的名为"google_containers"的命名空间中拉取容器镜像,因为kubeadm 安装 k8s,控制节点的组件基于 pod 运行,所以需要镜像,默认的镜像仓库国内无法访问,所以需要指定阿里云镜像仓库,也可以把安装k8s1.26 需要的镜像用 ctr -n=k8s.io images import 解压,这样就可以直接在本地找镜像了。
3、podsubnet: 10.244.0.0/12 #指定 pod 网段
serviceSubnet: 10.96.0.0/12 #指定Service 网段
在k8s 集群中,pod网段,service网络,物理机网段不能冲突。
4、mode: ipvs 表示kube-proxy 代理模式是ipvs,如果不指定ipvs,会默认使用iptables,但是iptables 效率低,所以我们生产环境建议开启pvs,阿里云托管的K8s,也提供ipvs 模式

kubeadm安装k8s时,控制节点和工作节点的组件都是基于pod运行的
控制节点组件:apiserver,scheduler,controller-manager,etcd,容器,kubelet,kube-proxy,calico(网络组件)
工作节点: calico,容器运行时,kube-proxy,coredns,kubelet

**基于kubeadm.yaml文件初始化k8s **

[root@xuegod63~]#ctr -n=k8s.io images import k8s_1.26.0.tar.gz
[root@xuegod64~]#ctr -n=k8s.io images import k8s_1.26.0.tar.gz
[root@xuegod62~]#ctr -n=k8s.io images import k8s_1.26.0.tar.gz

备注:

1.k8s_1.26.0.tar.gz是什么?
k8s_1.26.0.tar.gz 是基于 ctr -n=k8s.io images export <安装 k8s 组件需要的 k8s 镜像>
k8s_1.26.0.tar.gz生成的,这个压缩包里面包含的镜像只适合安装k8s1.26 这个版本,如何安装其他版本,第一次安装不需要 ctr -n=k8s.io images import k8s_1.26.0.tar.gz解压镜像,执行kubeadm init 会自动把安装 k8s 组件需要的镜像拉下来,然后可以基于 ctr n=k8s.io images import 命令把这个版本镜像打包,下次再安装此版本,就可以基于ctr -n=k8s.io images import 解压了。

2.ctr·解压镜像为何加-n=k8s.io?
n=k8s.io 参数指定将镜像导入到k8s.io命名空间下,这通常是一个虚构的命名空间,用于导入Kubernetes官方发布的容器镜像。只要放到这个名称空间的镜像,才会被k8s·pod 找到。

[root@xuegod63 ~]#kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification

可能遇到的报错信息:

在这里插入图片描述

在/usr/lib/systemd/system/kubelet.service文件中加上报错的信息

在这里插入图片描述

重载下配置:
systemctl daemon-reload

已经装过一次了,kubeadm reset 删除下

有可能还是不行,systemd驱动不用升级:

systemctl daemon-reexec

安装完成后,如图所示:

在这里插入图片描述

粘贴图中的mkdir -p 这3段后就可以使用kubectl get nodes命令了。

1.3 实战-工作节点加入k8s集群

把xuegod64,62作为工作节点加入到k8s集群中
在xuegod63上查看加入节点的命令:

[root@xuegod63 ~]#kubeadm token create --print-join-command
kubeadm join 192.168.1.63:6443 --token s6f1ab.g6s71a2gn4d9pg5v \ --discovery-token-ca-cert-hash sha256:30092f3fd915c48b67695b8242a6196aebdde3a21c3bc521a8936bd628e30b0f

把 xuegod64 加入k8s 集群:

[root@xuegod64~]#kubeadm join 192.168.126.63:6443 --token s6f1ab.g6s71a2gn4d9pg5v \
--discovery-token-ca-cert-hash sha256:30092f3fd915c4866769568242a6196aebdde3a21c3bc521a8936bd628e30b0f --ignore-preflight-errors=SystemVerification

[root@xuegod63 ~]#kubectl get nodes

查看kubelet日志:

journalctl -xeu kubelet

1.4 安装kubernetes 网络组件-Calico

Calico·是一个开源的-Kubernetes 网络插件。
Calico·的设计理念是基于 Linux 系统网络的,使用标准的 Linux·路由和·iptables 规则,以实现高性能的网络互联和安全隔离。它支持·Pv4 和·IPv6 双栈网络,并且可以轻松地与现有的数据中心网络集成,提供了丰富的网络策略功能,可以通过简单的标签选择器来定义容器间的网络隔离和通信规则。
Calico·的架构采用了一种分布式的方式,其中每个节点都运行一个·Calico·的网络代理组件,称为Felix,Felix·负责监听·Kubernetes·APl·Server,获取节点和网络信息,并在本地维护一个路由表和iptables规则集,用于控制容器的网络访问。当容器发生变化时,Felix·会自动更新路由表和·iptables规则,确保网络互联和隔离的正确性。
Calico·还支持·BGP.协议,可以将·Kubernetes·集群扩展到跨数据中心和云提供商的多个节点上,从而实现灵活、可扩展的容器网络解决方案。

[root@xuegod63 ~]#ctr -n=k8s.io images import calico.tar.gz
[root@xuegod64 ~]#ctr -n=k8s.io images import calico.tar.gz
[root@xuegod62 ~]#ctr -n=k8s.io images import calico.tar.gz

上传 calico.yaml到xuegod63 中,使用yamL 文件安装 calico 网络插件。
备注:
修改 calico.yaml 文件:
如果机器有多个网卡,需要在 calico 配置文件里指定可以联网的网卡,假如机器只有一个网卡,也要指定下,这样就直接找到可以用的网卡了。
找到 3645 行:增加如下配置:

- name: IP_AUTODETECTION_METHOD
  value: "interface=ens33"

查看节点信息:

kubectl get pods -n kube-system

在这里插入图片描述

calico-kube-controlers-d886b8fff-s8zd 0/1 Pending状态,是因为现在只有一个控制节点,calico-kube-controllers-d886b8fff-s8lzd不能调度到控制节点,所以是pending,等到工作节点创建好之后,pod 就会调度到工作节点上.

扩展

kubernetes知识学习
k8s常用命令

#部署yaml文件:
kubectl apply -f xxx.yaml

#获取节点和服务版本信息,并查看附加信息
kubectl get nodes -o wide

#获取pod信息,默认是default名称空间
kubectl get pod

#获取pod信息,默认是default名称空间,并查看附加信息
#kubectl get pod -o wide

#获取指定名称空间的pod
kubectl get pod -n kube-system

#获取指定名称空间中的指定pod
kubectl get pod -n kube-system podName

#获取所有名称空间的pod
kubectl get pod -A

#查看所有名称空间的service信息
kubectl get svc -A

#查看componentstatuses信息
kubectl get cs

#查看所有deployments信息
kubectl get deploy -A

#查看所有replicasets信息
kubectl get rs -A

#查看所有statefulsets信息
kubectl get sts -A

#查看所有jobs信息
kubectl get jobs -A
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值