十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

k8s的部署

k8s的部署 我每条代码的都有知识拓展能让大家在实验中理解底层逻辑一.实验主机配置harbor主机eth0-172.25.254.254master主机eth0-172.25.254.100node1主机eth0-172.25.254.10node2主机eth0-172.25.254.201.创建 docker.repo 阿里云源[rootharbor ~]# cat /etc/yum.repos.d/docker.repo EOF[docker]name dockerbaseurl https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/gpgcheck 0EOF#创建 docker.repo 阿里云源 dnf 才有 docker 软件仓库[rootharbor ~]# dnf install httpd createrepo-y#安装httpd、createrepo[rootharbor ~]# mkdir /var/www/html/docker/ -p#创建仓库存放目录[rootharbor ~]# vim /etc/httpd/conf/httpd.confListen 4444#将 httpd 监听端口由默认 80 改为 4444搭建本地 HTTP 私有 dnf 源仓库把 docker 的 rpm 包做成内网 yum 源httpd 提供网页访问端口 4444[rootharbor ~]# systemctl enable --now httpd[rootharbor ~]# dnf install docker-ce --downloadonly --destdir /mnt/ -y#如果直接 dnf install docker-ce本机 harbor 自己装上 dockerrpm 包下载完系统缓存会被清理别的机器拿不到 rpm 文件收集 rpm 包搭建离线源给别的机器用[rootharbor ~]# mv /mnt/*.rpm /var/www/html/docker/# 将下载好的rpm移动到http网页仓库目录rpm 包一开始下载到 /mnt 目录/mnt 这个目录httpd 网页服务访问不到内网其他机器无法通过 http 拿到里面的 rpm 文件[rootharbor ~]# createrepo -v /var/www/html/docker/#-v verbose 输出详细过程生成仓库元数据createrepo 扫描目录下全部 rpm生成一堆 xml 索引文件存放在提前建好的索引目录repodata/这样才是可用软件仓库执行 dnf 安装[rootharbor ~]# cat /etc/yum.repos.d/docker.repo EOF[docker]name dockerbaseurl http://172.25.254.254:4444/docker#地址指向本机 httpd 服务提供的本地仓库harbor 本机后续 dnf 不再访问阿里云改为访问本机 http://172.25.254.254:4444/dockergpgcheck 0EOF下载完 rpm 包之后模拟 “不再依赖外网”本机也使用离线源harbor 本机自己写这个 repo本机就会从自己的 http 源安装 dockerharbor可以访问外网就可以不用配置这个但内网其他节点必须配置这个 repo因为内网节点没有外网访问不了公网 docker 仓库同时rpm 包不在内网节点本地磁盘上只能通过网络 HTTP 协议去 harbor 机器拿 rpm 包如果用本地包还可以直接用 file:// 本地源baseurlfile:///var/www/html/docker[rootharbor ~]# dnf install docker-ce -ytips:所有主机都要配置开机自动加载br_netfilter内核模块2.安装docker在harbor仓库节点[rootharbor ~]# echo br_netfilter /etc/modules-load.d/docker_mod.conf# 配置开机自动加载br_netfilter内核模块[rootharbor ~]# modprobe -a br_netfilter#立即加载br_netfilter模块不用重启机器[rootharbor ~]# vim /etc/sysctl.d/docker.confnet.bridge.bridge-nf-call-iptables 1# 网桥流量交给iptables处理k8s/容器网络必须net.bridge.bridge-nf-call-ip6tables 1# ipv6网桥交给ip6tablesnet.ipv4.ip_forward 1# 开启ip转发容器之间、容器访问外网需要[rootharbor ~]# systemctl restart systemd-modules-load.service # 重新加载模块配置文件[rootharbor ~]# sysctl --system# 加载所有sysctl.d下面的内核参数生效[rootharbor ~]# vim /lib/systemd/system/docker.service# 修改docker.service启动参数ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock --iptablestrue[rootharbor ~]# systemctl daemon-reload# 重载systemd单元配置[rootharbor ~]# systemctl enable --now docker3.生成key[rootharbor ~]# mkdir /data/certs -p[rootharbor ~]# mkdir /data/certs -p[rootharbor ~]# openssl req -newkey rsa:4096 \-nodes -sha256 -keyout /data/certs/LLJtiminglee.org.key \-addext subjectAltName DNS:reg.LLJ.org \-x509 -days 365 -out /data/certs/LLJ.org.crt[rootharbor harbor]# ./install.sh --with-chartmuseum4.编辑harbor配置文件[rootharbor ~]# tar zxf harbor-offline-installer-v2.5.4.tgz -C /opt/[rootharbor ~]# cd /opt/harbor/[rootharbor harbor]# lscommon.sh harbor.v2.5.4.tar.gz harbor.yml.tmpl install.sh LICENSE prepare[rootharbor harbor]# cp harbor.yml.tmpl harbor.yml[rootharbor harbor]# vim harbor.ymlhostname: reg.LLJ.orgcertificate: /data/certs/LLJ.org.crtprivate_key: /data/certs/LLJ.org.keyharbor_admin_password: llj[rootharbor harbor]# ./install.sh --with-chartmuseum5.编写启动脚本[rootharbor ~]# vim /lib/systemd/system/harbor.service[Unit]Descriptionharbor with Docker ComposeDocumentationhttps://reg.LLJ.com/compose/Afterdocker.service network-online.targetRequiresdocker.service[Service]TypeoneshotWorkingDirectory/opt/harborExecStart/usr/bin/docker compose up -dExecStop/usr/bin/docker compose downRemainAfterExityes[Install]WantedBymulti-user.target[rootharbor harbor]# docker compose down[rootharbor ~]# systemctl enable --now harborCreated symlink /etc/systemd/system/multi-user.target.wants/harbor.service → /usr/lib/systemd/system/harbor.service.[rootharbor harbor]# docker compose ps6.关闭swap只要节点开启 swap后续执行 kubeadm init / kubeadm join 会报错、集群启动异常。1. 立刻关闭当前所有swap实时生效你之前漏掉这条swapoff -a2. 注释fstab禁止开机挂载sed -i /^[[:space:]]*[^#].*swap/s/^/#/ /etc/fstab3. 查看真实swap设备单元名称systemctl --type swap输出类似dev-dm\x2d1.swap4. mask真实swap单元重中之重只mask swap.target不够systemctl mask dev-dm\x2d1.swap5. 重载systemd配置systemctl daemon-reload临时关闭立刻生效swapoff -a永久禁止开机自动启用注释 fstab mask 对应.swap单元7.给 Docker 配置 HTTPS 私有仓库证书信任mkdir /etc/docker/certs.d/reg.LLJ.org/ -p[rootharbor ~]# for i in 100 10 20#在harbor主机中分发证书到所有主机 do scp /data/certs/LLJ.org.crt root172.25.254.$i:/etc/docker/certs.d/reg.LLJ.org/ca.crt done#文件名必须叫 ca.crtdocker 固定识别这个文件名systemctl enable dockersystemctl restart dockertipsHarbor 是自签名证书docker 默认不信任把签发 Harbor 的 CA 根证书给到每一台机器 dockerdocker 就认为这个 HTTPS 仓库是合法可信这是 HTTPS 自签仓库标准配置与insecure‑registries 的 HTTP 跳过校验方案有区别8.配置docker加速器所有主机#配置 mirrors 之后docker 会优先访问这个镜像代理地址去拉取镜像加速下载cat /etc/docker/daemon.json EOF{registry-mirrors:[https://reg.LLJ.org]}EOFsystemctl restart docker8.所有主机彼此建立解析vim /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6172.25.254.100 k8s-master172.25.254.10 node1172.25.254.20 node2172.25.254.254 reg.LLJ.org9.配置kubernetes安装源所有主机vim /etc/yum.repos.d/kubernetes.repo[kubernetes]name kubernetesbaseurl https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm/gpgcheck 0dnf list kubelet#检测以上操作完成后重启主机检测swap分区swapon -s 没有任何输出表示ok二.kubernetes的部署1.安装cri-dockerd所有主机中安装[rootdocker-node1 ~]# wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.4.4/cri-dockerd-0.4.4.amd64.tgz[rootdocker-node1 ~]# tar zxf cri-dockerd-0.4.4.amd64.tgz [rootdocker-node1 ~]# cd cri-dockerd/[rootdocker-node1 cri-dockerd]# lscri-dockerd cri-docker.service cri-docker.socket[rootdocker-node1 cri-dockerd]install -o root -g root -m 0755 cri-dockerd /usr/local/bin/cri-dockerd #把编译 / 下载好的二进制程序 cri‑dockerd 安装到系统可执行目录 /usr/local/bin/同时设置属主、属组、权限[rootdocker-node1 cri-dockerd]vim /etc/systemd/system/cri-docker.service[Service]TypenotifyExecStart/usr/local/bin/cri-dockerd --network-plugincni --pod-infra-container-imagereg.LLJ.org/k8s/pause:3.10.1 --container-runtime-endpoint fd://ExecReload/bin/kill -s HUP $MAINPIDTimeoutSec0RestartSec2Restartalways[rootdocker-node1 cri-dockerd]# systemctl daemon-reload [rootdocker-node1 cri-dockerd]# systemctl enable --now cri-docker.service2.安装构建kubernetes 集群所需软件master节点 dnf install kubelet kubeadm kubectl -ysystemctl enable --now kubelet.service node节点 dnf install kubelet kubeadm -ysystemctl enable --now kubelet.service master节点中 kubectl 和kubeadm 补齐 [rootmaster ~]# echo source (kubectl completion bash) ~/.bashrc[rootmaster ~]# echo source (kubeadm completion bash) ~/.bashrc[rootmaster ~]# source ~/.bashrc3.下载kubernetes集群所需镜像[rootmaster ~]# kubeadm config images pull \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.35.7 \--cri-socketunix:///var/run/cri-dockerd.sock[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.35.3[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.35.3[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.35.3[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.35.3[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:v1.13.1[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.10.1[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.6.6-0[rootmaster ~]# docker login reg.LLJ.org -u admin[rootmaster ~]# docker images --format {{.Repository}}:{{.Tag}} | awk -F / /google/{system(docker tag $0 reg.LLJ.org/k8s/$3)}[rootmaster ~]# docker images --format {{.Repository}}:{{.Tag}} | awk -F / /LLJ/{system(docker push $0)}4.在master中初始化kubernetes集群[rootk8s-master .docker]# kubeadm init --pod-network-cidr10.244.0.0/16 \--image-repository reg.LLJ.org/k8s \--kubernetes-version v1.35.7 \--cri-socketunix:///var/run/cri-dockerd.sock上述有警告可以忽略[rootk8s-master .docker]# kubeadm token create --print-join-command#查看节点kubeadm join 172.25.254.100:6443 --token jlhgvo.644uzakl2upno99y --discovery-token-ca- cert-hash sha256:fd60ad5adf7aa93ef0e845d0b1230f786bb2f08c387f5d3b5db0c56f505679e2#如果初始化出问题可以重置集群设定kubeadm reset在多 CRI 环境偶尔清理不干净需要手动删残余 kubeadm reset --cri-socketunix:///var/run/cri-dockerd.sock rm -rf /etc/kubernetes/*rm -rf /var/lib/kubelet/*docker ps -a | grep k8s | awk {print $1} | xargs -r docker rm -f#列出所有容器筛选出 k8s 创建的容器pause、业务 pod、组件只打印第一列也就是容器 ID把前面输出的容器 ID 传给 docker rm 强制删除-r如果前面没有输出没有 k8s 容器就不执行 rm避免报错5.其他主机加入凭证每个人的值不一样接下来其他主机要加入本集群的凭证 [rootk8s-node1 ~]# kubeadm join 172.25.254.100:6443 --token jlhgvo.644uzakl2upno99y --discovery-token-ca-cert-hash sha256:fd60ad5adf7aa93ef0e845d0b1230f786bb2f08c387f5d3b5 db0c56f505679e2 --cri-socketunix:///run/cri-dockerd.sock[rootk8s-node2 ~]# kubeadm join 172.25.254.100:6443 --token jlhgvo.644uzakl2upno99y --discovery-token-ca-cert-hash sha256:fd60ad5adf7aa93ef0e845d0b1230f786bb2f08c387f5d3b5 db0c56f505679e2 --cri-socketunix:///run/cri-dockerd.sockcat /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf #kubelet必须是连接cri‑dockerd 套接字6.添加kubernets环境变量到本机[rootk8s-master .docker]# echo export KUBECONFIG/etc/kubernetes/admin.conf ~/.bash_profile [rootk8s-master .docker]# source ~/.bash_profile#source 让当前终端立刻加载生效#kubectl 寻找认证配置文件优先读取环境变量 KUBECONFIG 指定的路径(强制命名大写kubectl只读这个)配置环境变量就是为省去每次敲长长的--kubeconfig指定文件参数tips如果新开一个 ssh 窗口要确保加载.bash_profile有些系统 root 登录加载.bashrc会导致环境变量失效kubectl 又报错更推荐kubeadm init 成功后复制 admin.conf k8s 超级管理员的 kubeconfig 配置文件是/etc/kubernetes/admin.conf有了这套东西kubectl 才知道去哪里访问 API、用什么证书身份去登录集群/etc/kubernetes/admin.conf是kubeadm init 初始化完成后自动生成是 k8s 集群最高权限的认证配置文件kubectl 工具必须读取这个配置文件才能连接、操作kube‑apiserver7.复制管理员 kubeconfigmkdir -p /root/.kubecp -i /etc/kubernetes/admin.conf /root/.kube/configchown root:root /root/.kube/config原理 kubectl 默认读取路径~/.kube/config当前用户家目录下kubeadm init 只会把 admin.conf 生成到 /etc/kubernetes/admin.conf不会自动拷贝到 root 家目录。root 用户家目录 /root/.kube/ 默认是空没有 config 文件。执行 kubectl get ns → kubectl 找不到配置文件直接报错[rootk8s-master .docker]# kubectl get nodes#查看集群中所有节点的简要信息(NotReady 是正常现象CNI 网络插件 flannel 还没部署)[rootk8s-master ~]# tar zxf kube-flannel-v0.28.9.tar.gz[rootk8s-master ~]# ls公共 图片 音乐 cri-dockerd kube-flannel-v0.28.9.tar.gz模板 文档 桌面 cri-dockerd-0.4.4.amd64.tgz视频 下载 anaconda-ks.cfg flannel[rootk8s-master ~]# cd flannel/[rootk8s-master flannel]# docker load -i kube-flannel-v0.28.9.tar#写的相对路径[rootk8s-master flannel]# docker login reg.LLJ.org -u admin -pllj [rootk8s-master flannel]# docker tag ghcr.io/flannel-io/flannel-cni-plugin:v1.9.1-flannel3 reg.LLJ.org/flannel/flannel-cni-plugin:v1.9.1-flannel3 [rootk8s-master flannel]# docker push reg.LLJ.org/flannel/flannel-cni-plugin:v1.9.1-flannel3 [rootk8s-master flannel]# docker tag ghcr.io/flannel-io/flannel:v0.28.9 reg.LLJ.org/flannel/ flannel:v0.28.9[rootk8s-master flannel]# docker push reg.LLJ.org/flannel/flannel:v0.28.9#打标签起别名push到私有仓库tips版本号必须load把离线 tar 格式的镜像包一样然后导入到本机 Docker 本地镜像库load使用一般要么是本地有tar包要么就是正常联网机器用 docker pull 镜像地址从外网仓库拉镜像docker pull ghcr.io/flannel‑io/flannel‑cni‑plugin -- docker save -o kube‑flannel‑v0.28.9.tar 镜像名-- scp 把 tar 传到内网 k8s‑master -- docker load -i这个包8.为k8s声明拉取镜像地址改成你自己 Harbor 地址修改 yaml 的 image 字段告诉 k8s不要去外网 ghcr.io 拉去我们内网 harbor 仓库拉取镜像我的 Harbor 域名reg.LLJ.org项目名flannel[rootk8s-master flannel]# vim kube-flannel.yml[rootk8s-master flannel]# kubectl apply -f kube-flannel.yml#通过kubectl apply -f声明指定在文件里描述 “我期望集群最终是什么样子”[rootk8s-master flannel]# kubectl get nodes#查看集群全部节点状态tips节点 Ready 的几个关键条件1.kubelet 定期上报全部满足才是 Ready2.kubelet 自身正常运行能够和 apiserver 通信内存、磁盘没有压力磁盘没满3.CNI 网络插件就绪最重要4.节点时间正常
返回列表