一、k8s环境搭建
编号 | 主机名称 | ip | 配置 | |
1 | k8s-master | 192.168.8.177 | ||
2 | k8s-node1 | 192.168.8.178 | ||
3 | k8s-node2 | 192.168.8.168 |
1、免密登录
[root@k8s-master ~]# ssh-keygen
[root@k8s-master ~]# ssh-copy-id root@192.168.8.178
[root@k8s-master ~]# ssh-copy-id root@192.168.8.168
2、3台机器yum源配置
1. docker
2. k8s
[root@k8s-master ~]# cd /etc/yum.repos.d/
[root@k8s-master yum.repos.d]# ls
3. 清空以及创建缓存
[root@k8s-master ~]# yum clean all && yum makecache
4. 四个镜像源aliyun,epel,kubernetes,docker-ce
4、3台主机映射
[root@k8s-master ~]# vim /etc/hosts
5、3台主机安装必备工具
[root@k8s-master ~]# yum install wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git tree -y
6、3台主机关闭防火墙 selinux swap虚拟分区
[root@k8s-master ~]# systemctl disable --now firewalld
[root@k8s-master ~]# setenforce 0setenforce: SELinux is disabled
[root@k8s-master ~]# vim /etc/selinux/config
[root@k8s-master ~]# vim /etc/fstab
[root@k8s-master ~]# swapoff -a && sysctl -w vm.swappiness=0
vm.swappiness = 0
[root@k8s-master ~]# sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
7、三个节点同步时间(3台)
[root@k8s-master ~]# yum -y install ntpdate
[root@k8s-master ~]# ntpdate time2.aliyun.com
[root@k8s-master ~]# crontab -e
*/5 * * * * /usr/sbin/ntpdate time2.aliyun.com
[root@k8s-master ~]# crontab -l //查看
8、3台主机配置limit
[root@k8s-master ~]# ulimit -SHn 65535
[root@k8s-node2 ~]# 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文件和docker-compose.yaml文件相似,k8s架构搭建起来在添加功能性pod时使用
[root@k8s-master ~]# cd /root/ ; git clone https://gitee.com/dukuan/k8s-ha-install.git
10、3台主机配置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[root@k8s-master ~]# 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隧道功能的模块,使得数据可以在两个网络之间进行传输
[root@k8s-master ~]# lsmod | grep -e ip_vs -e nf_conntrack //查看
11、三台主机配置k8s内核
[root@k8s-master ~]# 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 # 用于设置系统中最大的监 听队列的长度
reboot
12、三台主机卸载podman安装docker-cd docker-ce-cli containerd
[root@k8s-master ~]# yum remove -y podman runc containerd
yum install docker-ce docker-ce-cli containerd.io -y
13、三台主机配置containerd需要的核心模块 overlay br_netfilter
[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[root@k8s-master ~]# 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
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
sysctl --system
14、三台主机 配置containerd配置文件
mkdir -p /etc/containerd //验证
containerd config default | tee /etc/containerd/config.tomlvim /etc/containerd/config.toml
63 sandbox_image = "registry.cn-hangzhou.aliyuncs.com/googl e_containers/pause:3.9" 127 SystemdCgroup = true
[root@k8s-node2 ~]# systemctl enable --now containerd.service
[root@k8s-node2 ~]# systemctl status containerd.service
15、三台主机配置crictl客户端连接的运行位置
[root@k8s-master ~]# 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组件 kubeadm kubelet kubectl
yum -y install kubeadm-1.28* kubectl-1.28* kubelet-1.28*
yum -y install kubelet-1.28*
systemctl daemon-reload
[root@k8s-node1 ~]# ls /var/lib/
systemctl enable --now kubelet
[root@k8s-master ~]# kubectl get po -A
异常处理:
如果kubelet无法正常启动,检查swap是否已经取消虚拟分区,查看/var/log/message如果没有/var/lib/kubelet/config.yaml文件,可能需要重装
yum -y remove kubelet-1.28*
yum -y install kubelet-1.28*
systemctl daemon-reload
systemctl enable --now kubelet
yum -y install kubeadm-1.28*
# kubelet 端口是10248 10250 10255三个端口
17、master主机kubernet集群初始化
1. 拉取镜像
[root@k8s-master ~]# vim 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.8.177bindPort: 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.8.177timeoutForControlPlane: 4m0s # 控制平面的超时时间,这里设置为4分钟 apiVersion: kubeadm.k8s.io/v1beta3 # 指定API Server版本 certificatesDir: /etc/kubernetes/pki # 指定了证书的存储目录 clusterName: kubernetes # 定义了集群的名称为"kubernetes" controlPlaneEndpoint: 192.168.8.177: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.localpodSubnet: 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配置文件转换为新的格式
[root@k8s-master ~]# kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml
[root@k8s-master ~]# ls[root@k8s-master ~]# kubeadm config images pull --config new.yaml
2. 初始化
[root@k8s-master ~]# kubeadm init --config /root/new.yaml --upload-certs
异常处理:
[root@k8s-master ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@k8s-master ~]# vim token //保存token
kubeadm join 192.168.8.177:6443 --token 7t2weq.bjbawausm0jaxury \--discovery-token-ca-cert-hash sha256:b646802cdd8fabb2389918d2092e6c3fffe132c9cfaf9142e740b2ea24e621da
3. 不成功
主机配置2核2G40G
kubelet 无法启动 swap 虚拟分区没关
vim /var/log/message
18、将 node节点加入集群nde1 node2
[root@k8s-node2 ~]# systemctl stop kubelet
[root@k8s-node2 ~]# kubeadm join 192.168.8.177:6443 --token 7t2weq.bjbawausm0jaxury --discovery-token-ca-cert-hash sha256:b646802cdd8fabb2389918d2092e6c3fffe132c9cfaf9142e740b2ea24e621da
修改环境变量
[root@k8s-master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
[root@k8s-master ~]# kubectl get nodes //查看节点 查看在集群中的主机状态
[root@k8s-master ~]# vim .bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf
[root@k8s-master ~]# kubectl get po -A //查看所有pod的状态
NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-6554b8b87f-4xzkp 0/1 Pending 0 43m kube-system coredns-6554b8b87f-ws7pj 0/1 Pending 0 43m kube-system etcd-k8s-master 1/1 Running 0 43m kube-system kube-apiserver-k8s-master 1/1 Running 0 43m kube-system kube-controller-manager-k8s-master 1/1 Running 0 43m kube-system kube-proxy-hgn9q 1/1 Running 0 4m36s kube-system kube-proxy-tshb8 1/1 Running 0 8m49s kube-system kube-proxy-ww7k4 1/1 Running 0 43m kube-system kube-scheduler-k8s-master 1/1 Running 0 43m
[root@k8s-master ~]# kubectl get po -Aowide //查看pod完整信息
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-system coredns-6554b8b87f-4xzkp 0/1 Pending 0 46m <none> <none> <none> <none> kube-system coredns-6554b8b87f-ws7pj 0/1 Pending 0 46m <none> <none> <none> <none> kube-system etcd-k8s-master 1/1 Running 0 46m 192.168.8.177 k8s-master <none> <none> kube-system kube-apiserver-k8s-master 1/1 Running 0 46m 192.168.8.177 k8s-master <none> <none> kube-system kube-controller-manager-k8s-master 1/1 Running 0 46m 192.168.8.177 k8s-master <none> <none> kube-system kube-proxy-hgn9q 1/1 Running 0 7m42s 192.168.8.168 k8s-node2 <none> <none> kube-system kube-proxy-tshb8 1/1 Running 0 11m 192.168.8.178 k8s-node1 <none> <none> kube-system kube-proxy-ww7k4 1/1 Running 0 46m 192.168.8.177 k8s-master <none> <none> kube-system kube-scheduler-k8s-master 1/1 Running 0 46m 192.168.8.177 k8s-master <none> <none>
status:
状态名称 | 中文 | 说明 |
Pending | 挂起 | 当前pod没有工作 |
Running | 运行中 | 当前pod正在工作 |
ContainerCreating | 正在创建中 | 正在创建容器 |
19、部署calico的pod
1. 找到配置的calico.yaml文件
[root@k8s-master ~]# cd k8s-ha-install/
[root@k8s-master k8s-ha-install]# git checkout manual-installation-v1.28.x && cd calico/
[root@k8s-master calico]# ls
calico.yaml
[root@k8s-master calico]# vim /etc/kubernetes/manifests/kube-controller-manager.yaml //19行
2. 修改配置文件,将文件中的POD_CIDR替换成172.16.0.0/16
[root@k8s-master calico]# vim calico.yaml
4801 value: "172.16.0.0/16"
3. 创建pod
[root@k8s-master calico]# kubectl apply -f calico.yaml
[root@k8s-master calico]# kubectl logs calico-node-4dfpr -n kube-system //查看日志