k8s环境搭建

创建一个新的model虚拟机,处理器为2,硬盘为40G

使用model主机克隆三台新的主机,名称分别为k8s_master,k8s_node01,k8s_node02,运行环境脚本,设置ip地址和名称,IP地址分别为66、77、88,并设置免密登录。

编号

主机名称

ip

配置

1

k8s-master

192.168.2.66

2

k8s-node01

192.168.2.77

3

k8s-node02

192.168.2.88

步骤:

  1. 创建主机,设置ip,hostname,关闭firewalld,selinux,Netmanager
  2. 设置主机之间的ssh免密

k8s-master:

ssh-keygen

ssh-copy-id root@node01的ip x.x.x.77

ssh-copy-id root@node02的ip x.x.x.88

  1. yum源配置

直接将文件放到/etc/yum.repos.d/下面,三个主机都需要这一步

  1. docekr-ce.repo
  2. kuberntes.repo
  3. 清空以及创建缓存

yum clean all && yum makecache

4.主机映射

    三台主机都需要做

vim /etc/hosts

    192.168.2.66 k8s-master

    192.168.2.77 k8s-node01

    192.168.2.88 k8s-node02

    主机之间可使用主机名进行互相ping通

5.三个节点安装必备工具

yum install wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git tree -y

6.三个节点关闭firewalld NetworkManager Selinux SWAP虚拟分区

    systemctl disable --now firewalld

    systemctl disable --now NetworkManager

    setenforce 0

    swapoff -a && sysctl -w vm.swappiness=0

    sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

7.三个节点同步时间,同时设置计划任务

yum -y install ntpdate

ntpdate time2.aliyun.com

设置计划任务

crontab -e

* /5 * * * * /usr/sbin/ntpdate time2.aliyun.com

which ntpdate

crontab -l

8.配置limit访问极限

三个主机都配置允许的最大访问数

ulimit -SHn 65535

    vim /etc/security/limits.conf

    在末尾添加如下内容:

    * soft nofile 65536

* hard nofile 131072

* soft nproc 65535

* hard nproc 655350

* soft memlock unlimited

* hard memlock unlimited

9.三个节点下载yaml文件(从gitee上下载),配置pod的yaml文件和docekr-compose.yaml的文件相似,等我k8s架构搭建完成之后,添加功能性pod时候使用。

这个仓库里面全都是配置文件

    cd /root/ ; git clone k8s-ha-install: 高可用安装k8s集群文件,参考https://edu.51cto.com/course/23845.html

10.三个节点配置ipvs

    yum install ipvsadm ipset sysstat conntrack libseccomp -y

    加载内核模块

modprobe -- ip_vs

    modprobe -- ip_vs_rr

    modprobe -- ip_vs_wrr

    modprobe -- ip_vs_sh

    modprobe -- nf_conntrack

    vim /etc/modules-load.d/ipvs.conf

# 在系统启动时加载下列 IPVS 和相关功能所需的模块
ip_vs # 负载均衡模块
ip_vs_lc # 用于实现基于连接数量的负载均衡算法
ip_vs_wlc # 用于实现带权重的最少连接算法的模块
ip_vs_rr # 负载均衡rr算法模块
ip_vs_wrr # 负载均衡wrr算法模块
ip_vs_lblc # 负载均衡算法,它结合了最少连接(LC)算法和基于偏置的轮询(Round Robin with Bias)算法
ip_vs_lblcr # 用于实现基于链路层拥塞状况的最少连接负载调度算法的模块
ip_vs_dh # 用于实现基于散列(Hashing)的负载均衡算法的模块
ip_vs_sh # 用于源端负载均衡的模块
ip_vs_fo # 用于实现基于本地服务的负载均衡算法的模块
ip_vs_nq # 用于实现NQ算法的模块
ip_vs_sed # 用于实现随机早期检测(Random Early Detection)算法的模块
ip_vs_ftp # 用于实现FTP服务的负载均衡模块
ip_vs_sh
nf_conntrack # 用于跟踪网络连接的状态的模块
ip_tables # 用于管理防护墙的机制
ip_set # 用于创建和管理IP集合的模块
xt_set # 用于处理IP数据包集合的模块,提供了与iptables等网络工具的接口
ipt_set # 用于处理iptables规则集合的模块
ipt_rpfilter # 用于实现路由反向路径过滤的模块
ipt_REJECT # iptables模块之一,用于将不符合规则的数据包拒绝,并返回特定的错误码
ipip # 用于实现IP隧道功能的模块,使得数据可以在两个网络之间进行传输

systemctl enable --now systemd-modules-load.service      # 开机自启systemd默认提供的网络管理服务

The unit files have no installation config (WantedBy, RequiredBy, Also, Alias
settings in the [Install] section, and DefaultInstance for template units).
This means they are not meant to be enabled using systemctl.
Possible reasons for having this kind of units are:
1) A unit may be statically enabled by being symlinked from another unit's
   .wants/ or .requires/ directory.

   

lsmod | grep -e ip_vs -e nf_conntrack     # 查看已写入加载的模块

ip_vs_sh               16384  0
ip_vs_wrr              16384  0
ip_vs_rr               16384  0
ip_vs                 172032  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          172032  4 xt_conntrack,nf_nat,ipt_MASQUERADE,ip_vs
nf_defrag_ipv6         20480  2 nf_conntrack,ip_vs
nf_defrag_ipv4         16384  1 nf_conntrack
libcrc32c              16384  5 nf_conntrack,nf_nat,nf_tables,xfs,ip_vs

11.三个节点k8s的内核加载

vim /etc/sysctl.d/k8s.conf
# 写入k8s所需内核模块
net.bridge.bridge-nf-call-iptables = 1 # 控制网络桥接与iptables之间的网络转发行为
net.bridge.bridge-nf-call-ip6tables = 1 # 用于控制网络桥接(bridge)的IP6tables过滤规则。当该参数设置为1时,表示启用对网络桥接的IP6tables过滤规则
fs.may_detach_mounts = 1 # 用于控制文件系统是否允许分离挂载,1表示允许
net.ipv4.conf.all.route_localnet = 1 # 允许本地网络上的路由。设置为1表示允许,设置为0表示禁止。
vm.overcommit_memory=1 # 控制内存分配策略。设置为1表示允许内存过量分配,设置为0表示不允许。
vm.panic_on_oom=0 # 决定当系统遇到内存不足(OOM)时是否产生panic。设置为0表示不产生panic,设置为1表示产生panic。
fs.inotify.max_user_watches=89100 # inotify可以监视的文件和目录的最大数量。
fs.file-max=52706963 # 系统级别的文件描述符的最大数量。
fs.nr_open=52706963 # 单个进程可以打开的文件描述符的最大数量。
net.netfilter.nf_conntrack_max=2310720 # 网络连接跟踪表的最大大小。
net.ipv4.tcp_keepalive_time = 600 # TCP保活机制发送探测包的间隔时间(秒)。
net.ipv4.tcp_keepalive_probes = 3 # TCP保活机制发送探测包的最大次数。
net.ipv4.tcp_keepalive_intvl =15 # TCP保活机制在发送下一个探测包之前等待响应的时间(秒)。
net.ipv4.tcp_max_tw_buckets = 36000 # TCP TIME_WAIT状态的bucket数量。
net.ipv4.tcp_tw_reuse = 1 # 允许重用TIME_WAIT套接字。设置为1表示允许,设置为0表示不允许。
net.ipv4.tcp_max_orphans = 327680 # 系统中最大的孤套接字数量。
net.ipv4.tcp_orphan_retries = 3 # 系统尝试重新分配孤套接字的次数。
net.ipv4.tcp_syncookies = 1 # 用于防止SYN洪水攻击。设置为1表示启用SYN cookies,设置为0表示禁用。
net.ipv4.tcp_max_syn_backlog = 16384 # SYN连接请求队列的最大长度。
net.ipv4.ip_conntrack_max = 65536 # IP连接跟踪表的最大大小。
net.ipv4.tcp_max_syn_backlog = 16384 # 系统中最大的监听队列的长度。
net.ipv4.tcp_timestamps = 0 # 用于关闭TCP时间戳选项。
net.core.somaxconn = 16384 # 用于设置系统中最大的监听队列的长度
 

[root@k8s-master ~]# reboot
# 保存后,所有节点重启,保证重启后内核依然加载
使用MobaXterm工具,按r重新连接一次

[root@k8s-master ~]# lsmod | grep --color=auto -e ip_vs -e nf_conntrack
ip_vs_ftp              16384  0
nf_nat                 45056  3 ipt_MASQUERADE,nft_chain_nat,ip_vs_ftp
ip_vs_sed              16384  0
ip_vs_nq               16384  0
ip_vs_fo               16384  0
ip_vs_sh               16384  0
ip_vs_dh               16384  0
ip_vs_lblcr            16384  0
ip_vs_lblc             16384  0
ip_vs_wrr              16384  0
ip_vs_rr               16384  0
ip_vs_wlc              16384  0
ip_vs_lc               16384  0
ip_vs                 172032  25 ip_vs_wlc,ip_vs_rr,ip_vs_dh,ip_vs_lblcr,ip_vs_sh,ip_vs_fo,ip_vs_nq,ip_vs_lblc,ip_vs_wrr,ip_vs_lc,ip_vs_sed,ip_vs_ftp
nf_conntrack          172032  4 xt_conntrack,nf_nat,ipt_MASQUERADE,ip_vs
nf_defrag_ipv6         20480  2 nf_conntrack,ip_vs
nf_defrag_ipv4         16384  1 nf_conntrack
libcrc32c              16384  5 nf_conntrack,nf_nat,nf_tables,xfs,ip_vs

12.三个节点下载podman、安装docker-ce、docker-ce-cli、containerd.io

    卸载之前的

yum -y remove podman containerd

重新安装新的

    yum -y install docker-ce docker-ce-cli containerd.io

13.三个节点配置containerd需要的核心模块overlay、br_netfilter

    cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf

    >overlay

    >br_netfilter

    >EOF

[root@k8s-master ~]# modprobe -- overlay
[root@k8s-master ~]# modprobe -- br_netfilter

   

cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf

> net.bridge.bridge-nf-call-iptables  = 1 # 用于控制网络桥接是否调用iptables进行包过滤和转发。
> net.ipv4.ip_forward                 = 1 # 路由转发,1为开启
> net.bridge.bridge-nf-call-ip6tables = 1 # 控制是否在桥接接口上调用IPv6的iptables进行数据包过滤和转发。
> EOF
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@k8s-master ~]# sysctl --system

14.三个节点配置contained配置文件

containerd config default | tee /etc/containerd/config.toml

vim /etc/containerd/config.toml

63 sandbox_image = “registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9”

127 SystemdCgroup = true

保存退出

启动containerd

systemctl enable --now containerd.service

查看状态

systemctl status containerd.service

15.三个节点配置crictl客户端连接的运行位置

    cat > /etc/crictl.yaml <<EOF

    >runtime-endpoint: unix:///run/containerd/containerd.sock

    >image-endpoint: unix:///run/containerd/containerd.sock

    >timeout: 10

    >debug:false

    >EOF

16.三个节点安装kubernetes组件

    yum -y install kubeadm-1.28* kubectl-1.28* kublet-1.28*

    systemctl daemon-reload

    systemctl enable --now kubelet

如果kubelet无法正常启动,检查swap是否已经取消虚拟分区,查看/var/log/message如果是没有/var/lib/kublet/config.yaml文件,可能需要重新安装。

yum -y remove kubel-1.28*

yum -y install kubel-1.28*

systemctl daemon-reload

systemctl enable --now kubelet

kubelet端口是10248、10255、10250

17.集群初始化

Master主机:

    1.拉取镜像

    创建一个kubeadm-config.yaml文件并写入以下内容

[root@k8s-master ~]# vim kubeadm-config.yaml # 修改kubeadm配置文件
apiVersion: kubeadm.k8s.io/v1beta3 # 指定Kubernetes配置文件的版本,使用的是kubeadm API的v1beta3版本
bootstrapTokens: # 定义bootstrap tokens的信息。这些tokens用于在Kubernetes集群初始化过程中进行身份验证
- groups: # 定义了与此token关联的组
  - system:bootstrappers:kubeadm:default-node-token 
  token: 7t2weq.bjbawausm0jaxury # bootstrap token的值
  ttl: 24h0m0s # token的生存时间,这里设置为24小时
  usages: # 定义token的用途
  - signing # 数字签名
  - authentication # 身份验证
kind: InitConfiguration # 指定配置对象的类型,InitConfiguration:表示这是一个初始化配置
localAPIEndpoint: # 定义本地API端点的地址和端口
  advertiseAddress: 192.168.15.11
  bindPort: 6443
nodeRegistration: # 定义节点注册时的配置
  criSocket: unix:///var/run/containerd/containerd.sock # 容器运行时(CRI)的套接字路径
  name: k8s-master # 节点的名称
  taints: # 标记
  - effect: NoSchedule # 免调度节点
    key: node-role.kubernetes.io/control-plane # 该节点为控制节点
---
apiServer: # 定义了API服务器的配置
  certSANs: # 为API服务器指定了附加的证书主体名称(SAN),指定IP即可
  - 192.168.15.11
  timeoutForControlPlane: 4m0s # 控制平面的超时时间,这里设置为4分钟
apiVersion: kubeadm.k8s.io/v1beta3 # 指定API Server版本
certificatesDir: /etc/kubernetes/pki # 指定了证书的存储目录
clusterName: kubernetes # 定义了集群的名称为"kubernetes"
controlPlaneEndpoint: 192.168.15.11:6443 # 定义了控制节点的地址和端口
controllerManager: {} # 控制器管理器的配置,为空表示使用默认配置
etcd: # 定义了etcd的配置
  local: # 本地etcd实例
    dataDir: /var/lib/etcd # 数据目录
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 指定了Kubernetes使用的镜像仓库的地址,阿里云的镜像仓库。
kind: ClusterConfiguration # 指定了配置对象的类型,ClusterConfiguration:表示这是一个集群配置
kubernetesVersion: v1.28.2 # 指定了kubernetes的版本
networking: # 定义了kubernetes集群网络设置
  dnsDomain: cluster.local # 定义了集群的DNS域为:cluster.local
  podSubnet: 172.16.0.0/16 # 定义了Pod的子网
  serviceSubnet: 10.96.0.0/16 # 定义了服务的子网
scheduler: {} # 使用默认的调度器行为
[root@k8s-master ~]# kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml
# 将旧的kubeadm配置文件转换为新的格式

    2.初始化

    kubeadm init --config /root/new.yaml  --upload-certs

    保存最后一段内容,如果以后谁想加入集群就写这段内容

vim token

初始化不成功原因:

1.主机配置2核2G40G

2.echo 1 >/proc/net/ipv4/ip_forward

3.kubelet无法启动

    1.swap虚拟分区没关

    2.没有配置文件

    4.关注错误日志文件vim /var/log/message

18.将工作节点加入集群

加入节点,将node01和node02两个子节点加入过来

停止kubelet

在node01和node02:

systemctl stop kubelet.service

master主机:

查看集群状态

    kubectl get nodes

获取失败时,运行下面命令,临时修改环境变量

export KUBECONFIG=/etc/kubernetes/admin.conf

长期修改:

    查看所有pod状态:

kubectl get po -A

[root@k8s-master ~]# kubectl get po -Aowide

添加不成功的原因:

1.kubelet没有stop

2.ip没有转发

3.token 重新初始化或者生成token

4.node节点中containerd是否正常

状态status:

状态名称

中文

说明

Pending

挂起

当前pod没有工作

Running

运行中

当前pod正常工作

containercreating

正在创建容器

正在创建容器

19.部署calico的pod

    跳转分支

git checkout manual-installation-v1.28.x && cd calico/

修改网段

创建calico的pod

kubectl apply -f calico.yaml

查看容器和节点状态:

kubectl get po -A

查看日志:

这里遇到了一个问题:

Node01和node02中仓库的配置出错了

20.使用ifconfig或者ip a s指令查看虚拟网卡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值