2024年9月11日(k8s环境配置)
| 编号 | 主机名称 | ip |
|---|---|---|
| 1 | k8s-master | 192.168.8.202 |
| 2 | k8s-node1 | 192.168.8.203 |
| 3 | k8s-node2 | 192.168.8.204 |
1、做免密
[root@k8s-master ~]# ssh-keygen
[root@k8s-master ~]# ssh-copy-id root@192.168.8.204[root@k8s-master ~]# ssh-copy-id root@192.168.8.203
2、yum源(三台主机上传docker-ce.repo kubernetes.repo)

3、清理以及创建缓存(三台主机)
[root@k8s-master ~]# yum clean all && yum makecache
4、主机映射
三台主机都做主机映射
vim /etc/hosts
192.168.8.202 k8s-master
192.168.8.203 k8s-node1
192.168.8.204 k8s-node2
5、安装必备工具
为三台主机安装一系列必要的软件包以支持其功能。包括但不限于yum工具包、wget工具、psmisc工具、vim文本编辑器、网络工具集以及telnet、yum utilities、设备映射持久化数据管理工具、lvm2存储逻辑 volumes和git版本控制系统等。具体操作命令如下: yum install wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git tree -y
6、关闭防火墙 networkmanger selinux swap虚拟分区
注
注
7、同步时间
所有三台主机必须实现时间同步
> */5 * * * * /usr/sbin/ntpdate time2.aliyun.com
>
> ```
>
>
##### 8、配置limit
>
>
> **三台主机都执行**
>
>
>
> [root@k8s-master ~]# ulimit -SHn 65535
>
>
>
> [root@k8s-node1 ~]# vim /etc/security/limits.conf
>
>
1. * soft nofile 65536
2. * hard constraint for nofile with a setting of 131,072 3. * soft policy for nproc capped at a limit of 65,534 units 4. * hard constraint for nproc configured at a level of 649,999 5. * soft memlock policy allowing maximum size unbounded 6. * hard memlock enforced at maximum size unbounded conditionally
9、从Gitee上获取yaml文件,并将pod设置为由单个集群或多个集群组成的较小单元与docker-compose.yaml类似的结构,在K8s架构完成搭建后,在添加功能性pod时使用此配置。
[root@k8s-master ~]# cd /root; git clone https://gitee.com/dukuan/k8s-ha-install.git
[root@k8s-master ~]# 列出当前目录下的文件

10、配置ipvs模块
都需要安装三台主机
执行以下操作以完成网络接口设置
分别进行网络接口设置
启用IPVS静态路由
手动编辑配置文件 /etc/modules-load.d/ipvs.conf 进行相关设置
> 1. # 在系统启动时加载下列 IPVS 和相关功能所需的模块
>
> 2. ip_vs # 负载均衡模块
>
> 3. ip_vs_lc # 用于实现基于连接数量的负载均衡>算法
>
> 4. ip_vs_wlc # 用于实现带权重的最少连接算法的>模块
>
> 5. ip_vs_rr # 负载均衡rr算法模块
>
> 6. ip_vs_wrr # 负载均衡wrr算法模块
>
> 7. ip_vs_lblc # 负载均衡算法,它结合了最少连接(LC)算>法和基于偏置的轮询(Round Robin with Bias)算法
>
> 8. ip_vs_lblcr # 用于实现基于链路层拥塞状况的最少连接负>载调度算法的模块
>
> 9. ip_vs_dh # 用于实现基于散列(Hashing)的负
>
> 10. 载均衡算法的模块
>
> 11. ip_vs_sh # 用于源端负载均衡的模块
>
> 12. ip_vs_fo # 用于实现基于本地服务的负载均衡>算法的模块
>
> 13. ip_vs_nq # 用于实现NQ算法的模块
>
> 14. ip_vs_sed # 用于实现随机早期检测(Random Early Detection)算法的模块
>
> 15. ip_vs_ftp # 用于实现FTP服务的负载均衡模块
>
> 16. ip_vs_sh
>
> 17. nf_conntrack # 用于跟踪网络连接的状态的模块
>
> 18. ip_tables # 用于管理防护墙的机制
>
> 19. ip_set # 用于创建和管理IP集合的模块
>
> 20. xt_set # 用于处理IP数据包集合的模块,提>供了与iptables等网络工具的接口
>
> 21. ipt_set # 用于处理iptables规则集合的模块
>
> 22. ipt_rpfilter # 用于实现路由反向路径过滤的模块
>
> 23. ipt_REJECT # iptables模块之一,用于将不符合规则的数>据包拒绝,并返回特定的错误码
>
> 24. ipip # 用于实现IP隧道功能的模>块,使得数据可以在两个网络之间进行传输
>
>
>
>
> bash
>
> 
lsmod | grep -e ip_vs -e nf_conntrack
11、配置k8s内核
三台主机都配置
vim /etc/sysctl.d/k8s.conf
> 1. # 写入k8s所需内核模块
>
> 2. net.bridge.bridge-nf-call-iptables = 1 # 控制网络桥接与iptables之间的网络转发行为
>
> 3. net.bridge.bridge-nf-call-ip6tables = 1 # 用于控>制网络桥接(bridge)的IP6tables过滤规则。当该参数设置为1时,表示>启用对网络桥接的IP6tables过滤规则
>
> 4. fs.may_detach_mounts = 1 # 用于控制文件系统是否允>许分离挂载,1表示允许
>
> 5. net.ipv4.conf.all.route_localnet = 1 # 允许本地网络上>的路由。设置为1表示允许,设置为0表示禁止。
>
> 6. vm.overcommit_memory=1 # 控制内存分配策略。设置为1表示允
>
> 7. 许内存过量分配,设置为0表示不允许。
>
> 8. vm.panic_on_oom=0 # 决定当系统遇到内存不足(OOM)时
>
> 9. 是否产生panic。设置为0表示不产生panic,设置为1表示产生panic。
>
> 10. fs.inotify.max_user_watches=89100 # inotify可以监视
>
> 11. 的文件和目录的最大数量。
>
> 12. fs.file-max=52706963 # 系统级别的文件描述符的最大数量>。
>
> 13. fs.nr_open=52706963 # 单个进程可以打开的文件>描述符的最大数量。
>
> 14. net.netfilter.nf_conntrack_max=2310720 # 网络连接跟踪表>的最大大小。
>
> 15. net.ipv4.tcp_keepalive_time = 600 # TCP保活机制发送
>
> 16. 探测包的间隔时间(秒)。
>
> 17. net.ipv4.tcp_keepalive_probes = 3 # TCP保活机制发送
>
> 18. 探测包的最大次数。
>
> 19. net.ipv4.tcp_keepalive_intvl =15 # TCP保活机制在发
>
> 20. 送下一个探测包之前等待响应的时间(秒)。
>
> 21. net.ipv4.tcp_max_tw_buckets = 36000 # TCP TIME_WAIT状态的bucket数量。
>
> 22. net.ipv4.tcp_tw_reuse = 1 # 允许重用TIME_WAIT套接字
>
> 23. 。设置为1表示允许,设置为0表示不允许。
>
> 24. net.ipv4.tcp_max_orphans = 327680 # 系统中最大的孤>套接字数量。
>
> 25. net.ipv4.tcp_orphan_retries = 3 # 系统尝>试重新分配孤套接字的次数。
>
> 26. net.ipv4.tcp_syncookies = 1 # 用于防止SYN洪水攻击。设
>
> 27. 置为1表示启用SYN cookies,设置为0表示禁用。
>
> 28. net.ipv4.tcp_max_syn_backlog = 16384 # SYN连接请求队列
>
> 29. 的最大长度。
>
> 30. net.ipv4.ip_conntrack_max = 65536 # IP连接跟踪表的>最大大小。
>
> 31. net.ipv4.tcp_max_syn_backlog = 16384 # 系统中最大的监>听队列的长度。
>
> 32. net.ipv4.tcp_timestamps = 0 # 用于关闭TCP时间戳选项。
>
> 33. net.core.somaxconn = 16384 # 用于设置系统中最大的监>听队列的长度
>
>
>
>
> bash
>
> 
reboot重启
12、卸载podman 安装docker-ce docker-ce-cli containerd
对三台主机进行操作
删除podman容器运行器
安装docker-ce及其相关组件
13、配置containerd
三台主机都操作
[root@k8s-master ~]# cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
overlay
br_netfilter
[root@k8s-master ~]# modprobe overlay
[root@k8s-master ~]# modprobe br_netfilter配置contained需要的内核模块,overlay br_netfilter
三台机器都要
[root@k8s-node2 ~]# cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
14、Containerd 配置⽂件
三台主机都需要
创建父目录:
mkdir -p /etc/containerd
配置容器化环境:
containerd config default | tee /etc/containerd/config.toml
编辑配置文件:
vim /etc/containerd/config.toml
> 1. 63 sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9"
>
> 2. 127 SystemdCgroup = true
>
>
>
>
> bash
立即启动containerd.service服务
15、配置crictl客户端连接的位置
所有三台主机都必须进行配置设置以确保正常运行
16、安装kubernetes组件
三台主机
yum -y install kubeadm-1.28* kubectl-1.28* kubelet-1.28*
systemctl daemon-reload
systemctl enable --now kubelet
如果kubelet无法正常启动,检查swap是否已经取消虚拟分区,查看日志/var/logg/massagesr如果没有/var/lib/kubelet/config.yaml文件,可能需要重新安装
yum -y remove kubelet-1.28*
yum -y install kubelet-1.28*
systemctl daemon-reloadsystemctl enable --now kubelet
systemctl status kubelet
yum -y install kubeadm-1.28*
kubelet端口是10248 10250 10255三个端口
17、Kubeadm 配置⽂件
1.拉取镜像
[root@k8s-master ~]# vim kubeadm-config.yaml
> 1. apiVersion: kubeadm.k8s.io/v1beta3 # 指定Kubernetes>配置文件的版本,使用的是kubeadm API的v1beta3版本
>
> 2. bootstrapTokens: # 定义bootstrap tokens的信息。这>些tokens用于在Kubernetes集群初始化过程中进行身份验证
>
> 3. - groups: # 定义了与此token关联的组
>
> 4. - system:bootstrappers:kubeadm:default-node-token
>
> 5. token: 7t2weq.bjbawausm0jaxury # bootstrap token的值
>
> 6. ttl: 24h0m0s # token的生存时间,这里设置为24小时
>
> 7. usages: # 定义token的用途
>
> 8. - signing # 数字签名
>
> 9. - authentication # 身份验证
>
> 10. kind: InitConfiguration # 指定配置对象的类型,InitConfiguration:表示这是一个初始化配置
>
> 11. localAPIEndpoint: # 定义本地API端点的地址和端口
>
> 12. advertiseAddress: 192.168.8.202
>
> 13. bindPort: 6443
>
> 14. nodeRegistration: # 定义节点注册时的配置
>
> 15. criSocket: unix:///var/run/containerd/containerd.sock # 容器时(CRI)的套接字路径
>
> 16. name: k8s-master # 节点的名称
>
> 17. taints: # 标记
>
> 18. - effect: NoSchedule # 免调度节点
>
> 19. key: node-role.kubernetes.io/control-plane # 该节点>为控制节点
>
> 20. ---
>
> 21. apiServer: # 定义了API服务器的配置
>
> 22. certSANs: # 为API服务器指定了附加的证书主体名称(SAN),指定IP即可
>
> 23. - 192.168.8.202
>
> 24. timeoutForControlPlane: 4m0s # 控制平面的超时时间,这>里设置为4分钟
>
> 25. apiVersion: kubeadm.k8s.io/v1beta3 # 指定API Server>版本
>
> 26. certificatesDir: /etc/kubernetes/pki # 指定了证书的存储目录
>
> 27. clusterName: kubernetes # 定义了集群的名称为"kubernetes"
>
> 28. controlPlaneEndpoint: 192.168.8.202:6443 # 定义了>控制节点的地址和端口
>
> 29. controllerManager: {} # 控制器管理器的配置,为空表示使>用默认配置
>
> 30. etcd: # 定义了etcd的配置
>
> 31. local: # 本地etcd实例
>
> 32. dataDir: /var/lib/etcd # 数据目录
>
> 33. imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 指定了Kubernetes使用的镜像仓库的地址,阿里云的镜
>
> 34. 像仓库。
>
> 35. kind: ClusterConfiguration # 指定了配置对象的类型,ClusterConfiguration:表示这是一个集群配置
>
> 36. kubernetesVersion: v1.28.2 # 指定了kubernetes的版本
>
> 37. networking: # 定义了kubernetes集群网络设置
>
> 38. dnsDomain: cluster.local # 定义了集群的DNS域为:cluster.local
>
> 39. podSubnet: 172.16.0.0/16 # 定义了Pod的子网
>
> 40. serviceSubnet: 10.96.0.0/16 # 定义了服务的子网
>
> 41. scheduler: {} # 使用默认的调度器行为
>
>
>
>
> bash
>
> 
[root@k8s-master ~]# kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml
[root@k8s-master ~]# kubeadm config images pull --config new.yaml
2.集群初始化
[root@k8s-master ~]# systemctl stop kubelet
[root@k8s-master ~]# kubeadm init --config /root/new.yaml --upload-certs如果报错
**

执行以下操作:首先运行命令 echo 1 > /proc/sys/net/ipv4/ip_forward以启用IP前向功能;随后重新配置相关参数;最后使用vim编辑器查看并确认token变量的内容以确保配置完成无误
> 1. kubeadm join 192.168.8.202:6443 --token 7t2weq.bjbawausm0jaxury \
>
> 2. --discovery-token-ca-cert-hash sha256:582e73858f215e7dcf35fb99c0e5262e86668e866a50b2a725df4f673060d3e1
>
>
>
>
> bash
18、加入子节点两个node都需要
[root@k8s-node1 ~]# systemctl stop kubelet
[root@k8s-node1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@k8s-node1 ~]# kubeadm join 192.168.8.202:6443 --token 7t2weq.bjbawausm0jaxury --discovery-token-ca-cert-hash sha256:582e73858f215e7dcf35fb99c0e5262e86668e866a50b2a725df4f673060d3e1[root@k8s-node2 ~]# systemctl stop kubelet
[root@k8s-node2 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@k8s-node2 ~]# kubeadm join 192.168.8.202:6443 --token 7t2weq.bjbawausm0jaxury --discovery-token-ca-cert-hash sha256:582e73858f215e7dcf35fb99c0e5262e86668e866a50b2a725df4f673060d3e1主上面修改并查看集群
[root@k8s-master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
[root@k8s-master ~]# kubectl get nodes #查看节点 查看再集群中的主机的状态
> 1. NAME STATUS ROLES AGE VERSION
>
> 2. k8s-master NotReady control-plane 36m v1.28.2
>
> 3. k8s-node1 NotReady <none> 2m48s v1.28.2
>
> 4. k8s-node2 NotReady <none> 2m23s v1.28.2
>
>
>
>
> bash
[root@k8s-master ~]# vim .bashrc
> export KUBECONFIG=/etc/kubernetes/admin.conf
>
> bash
[root@k8s-master ~]# kubectl get po -A #查看所有的pod的状态
> 1. NAMESPACE NAME READY STATUS RESTARTS AGE
>
> 2. kube-system coredns-6554b8b87f-m7ml8 0/1 Pending 0 41m
>
> 3. kube-system coredns-6554b8b87f-rmb5q 0/1 Pending 0 41m
>
> 4. kube-system etcd-k8s-master 1/1 Running 0 42m
>
> 5. kube-system kube-apiserver-k8s-master 1/1 Running 0 42m
>
> 6. kube-system kube-controller-manager-k8s-master 1/1 Running 0 42m
>
> 7. kube-system kube-proxy-phlcm 1/1 Running 0 7m42s
>
> 8. kube-system kube-proxy-qjxpz 1/1 Running 0 8m7s
>
> 9. kube-system kube-proxy-r5rd8 1/1 Running 0 41m
>
> 10. kube-system kube-scheduler-k8s-master 1/1 Running 0 42m
>
>
>
>
> bash
>
> 
[root@k8s-master ~]# kubectl get po -Aowide #查看pod的完整信息
> 1. NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
>
> 2. kube-system coredns-6554b8b87f-m7ml8 0/1 Pending 0 43m <none> <none> <none> <none>
>
> 3. kube-system coredns-6554b8b87f-rmb5q 0/1 Pending 0 43m <none> <none> <none> <none>
>
> 4. kube-system etcd-k8s-master 1/1 Running 0 43m 192.168.8.202 k8s-master <none> <none>
>
> 5. kube-system kube-apiserver-k8s-master 1/1 Running 0 43m 192.168.8.202 k8s-master <none> <none>
>
> 6. kube-system kube-controller-manager-k8s-master 1/1 Running 0 43m 192.168.8.202 k8s-master <none> <none>
>
> 7. kube-system kube-proxy-phlcm 1/1 Running 0 9m20s 192.168.8.204 k8s-node2 <none> <none>
>
> 8. kube-system kube-proxy-qjxpz 1/1 Running 0 9m45s 192.168.8.203 k8s-node1 <none> <none>
>
> 9. kube-system kube-proxy-r5rd8 1/1 Running 0 43m 192.168.8.202 k8s-master <none> <none>
>
> 10. kube-system kube-scheduler-k8s-master 1/1 Running 0 43m 192.168.8.202 k8s-master <none> <none>
>
>
>
>
> bash
>
> 
| 状态名称 | 中文 | 说明 |
|---|---|---|
| pending | 等待中 | 当前pod处于等待状态 |
| running | 运行中 | 当前pod正常运行 |
| conttainerCreating | 正在进行中 | 当前正在创建容器 |
19、部署calico的pod
1. 找到配置的calico.yaml文件
[root@k8s-master ~]# cd into k8s-ha-install/
[root@k8s-master k8s-ha-instance]# git checkout manual安装版本,并执行calico目录切换/
[root@k8s-master calico]# 使用vim编辑器打开kube-controller-manager.yaml文件
> 19 - --cluster-cidr=172.16.0.0/16
>
>
> bash
2. 修改配置文件,将文件中的POD_CIDR替换成172.16.0.0/16
[root@k8s-master calico]# vim calico.yaml
> 4801 value: "172.16.0.0/16"
>
> bash
[root@k8s-master calico]# kubectl apply -f calico.yaml

[root@k8s-master calico]# kubectl logs calico-node-blmpr -n kube-system
