ARTICLE · 1111835
K8S安装部署指南
K8S安装部署指南K8S全名kubernetes,因首尾字母中间有8个字母,简写为K8S。 K8S是docker容器的编排部署工具,目标是让部署容器化应用更简单高效,提供应用部署、规划、更新、维护的一组机制。最新稳定版本1.37.1 源码地址:https://github.com/kubernetes/kubernetes K8S功能包括:自动装箱/自动修复/水平扩展/服务发现/滚动更新/版本回退/密钥和配置管理/存储编排 自动装箱:基于容器对应用运行环境的资源配置要求,自动部署应用容器 自动修复:启动失败自动重启/Node故障重新部署和调度/容器健康检查失败自动关闭 水平扩展:通过简单命令、UI界面或资源使用情况对应用进行扩容或缩减 服务发现:用户不需要使用额外的服务发现机制,能够基于K8S能力实现服务发现和负载均衡 滚动更新:根据应用的变化,对容器运行的应用进行一次性或批量更新 版本回退:根据应用部署情况,对应用容器中运行的应用进行历史版本的即时回退 密钥和配置管理:不需要重新构建镜像即可部署和更新密钥和应用配置,类似热部署 存储编排:自动实现存储系统(本地目录/NFS/Gluster/Ceph/Cinder)挂载和应用,对有状态应用实现数据持久化很重要 支持Node数:2000台 支持Pod数:150000个 K8S架构 
MasterNode:集群控制节点,对集群进行调度管理,接受管理员对集群进行操作,由ApiServer、Scheduler、ClusterStateStore和ControllerManager组成。 WorkerNode:工作节点,运行容器,由kubelet、kubeproxy和container runtime组成。 部署步骤 安装软件清单:kubeadm、kubectl、kubelet 初始化集群 添加node到集群 生成证书 *集群管理应用以容器形式运行在masterNode 主机准备 配置hostname 如ip设置是dhcp分配或未分配,需规划ip地址,使用静态IP,配置子网掩码和网关,确保能够访问公网以及暴露端口能够被访问。 修改/etc/hosts 主机配置 关闭防火墙 关闭selinux 时钟同步 关闭swap分区 添加网桥过滤 开启ipvs(Linux 内核内置的四层(L4)负载均衡器) 在全部节点安装docker 配置docker 安装kubeadm kubelet kubectl kubelet配置 准备镜像 
在workerNode导入镜像 集群初始化 安装网络插件 查看workerNode加入MasterNode命令 workerNode加入MasterNode

hostname set-hostname Nameip masterip worker1ip worker2....
systemctl stop firewalldsystemctl disable firewalldfirewall-cmd --state //测试防火墙状态
set -ri 's/SELINUX=enforing/SELINUX=disabled/' /etc/selinux/configrebootgetenforce //验证是否关闭
yum install ntpdate //centos7或rhel7支持crontab -l0 */1 * * * ntpdate time1.aliyun.comyum install chrony //centos8或rhel8及更高版本支持vim /etc/chrony.confserver time1.aliyun.com minpoll 4 maxpoll 10 iburst// minpoll 4=2^4(s) , maxpoll 10=2^10(s) iburst=启动或重连时连续4次同步
//使用kubeadm必须关闭swap分区vim /etc/fstab# /dev/mapper/centos-swap swap //注释此行关闭swap分区
// 加载内核modprobe overlaymodprobe br_netfilter// 开机启动cat > /etc/modules-load/k8s.conf <<EOFoverlaybr_netfilterEOF// 写入内核参数cat > /etc/systcl.d/k8s.conf <<EOFnet.bridge.bridge-nf-call-ip6tables=1net.bridge.bridge-nf-call-iptables=1net.ipv4.ip_forward=1vm.swappiness=0EOF//应用并验证sysctl -p /etc/sysctl.d/k8s.confsysctl --systemlsmod | grep br_netfiltersysctl net.bridge.bridge-nf-call-iptablessysctl net.ipv4.ip_forward
yum install ipset ipvsadmcat > /etc/sysconfig/modules/ipvs.modules <<EOF#!/bin/bashmodprobe --ip_vsmodprobe --ip_vs_rrmodprobe --ip_vs_wrrmodprobe --ip_vs_shmodprobe --nf_conntrack_ipv4EOFchmod 755 /etc/sysconfig/modules/ipvs.modulesbash /etc/sysconfig/modules/ipvs.moduleslsmod | grep -e ip_vs -e nf_conntrack_ipv4
//获取源wget -o /etc/yum.repo.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum install -y docker-ce docker-ce-cli containerd.iosystemctl start docker && systemctl enable docker
mkdir /etc/dockercat > /etc/docker/daemon.json <<EOF{"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m", "max-file": "3"},"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]}EOFsystemctl daemon-reload && systemctl restart dockerdocker info | grep -i cgroup
//安装yum源vim /etc/yum.reps.d/k8s.repo[kubernetes]name=kubernetesenabled=1baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/gpgcheck=1gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpgyum install kubeadm kubelet kubectl
vim /etc/sysconfig/kubeletKUBELET_EXTRA_ARGS="--cgroup-driver=systemd"// 开机启动systemctl enable kubelet
//查看镜像列表kubeadm config images list

// 导出镜像清单kubeadm config images list >> image.list// 编写脚本批量下载镜像cat image.pull.sh#!/bin/bashimagelist='...镜像清单,一行一条...'for img in $imagelistdodocker pull $imgdonechmod 775 image.pull.shsh image.pull.sh
//MasterNode导出镜像docker save -o kube-proxy.tar k8s.gcr.io/kube-proxy:versiondocker save -o pause.tar k8s.gcr.io/pause:versionscp kube-proxy.tar pause.tar workerNode:/目标路径//WorkerNode导入镜像docker load - i *.tar
//只在MasterNode进行kubeadm init--kubernetes-version=v1.36.2--image-repository registry.aliyuncs.com/google_containers--apiserver-advertise-address=<master内网IP>--pod-network-cidr=<pod网段>--cri-socket /run/containerd/containerd.sock
//完成后mkdir -p $HOME/.kubecp -i /etc/kubernetes/admin.conf $HOME/.kube/configchown $(id -u):$(id -g) $HOME/.kube/config //这一句可以不做
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.28/manifests/calico.yaml//这个命令在kubeadmin init完成时会输出一遍,以后增加workerNode执行下面命令可重新输出kubeadm token create --print-join-command
kubeadm join <masterIP>:<port> --token .... --discovery-token-ca-cart-hash sha256:...