云计算-Kubernetes入门部署_kubernetes需要部署什么
目录
一、kubernetes组件信息
1.1 Master节点组件
1.2 Node节点组件
二、安装初始化
2.1 所有节点初始化环境
2.2-1 安装 CRI-dockerd 插件以及配置
2.2-2 所有节点配置containerd相关配置(使用containerd作为容器运行时操作)
2.3 所有 Master 安装 keepalived 以及 HAproxy
2.3.1 配置 Master 节点 HAproxy 配置文件
2.3.2 配置 Master 节点 keepalived 文件
2.3.2.1 prod-k8s-master01 配置文件修改
2.3.2.2 prod-k8s-master02 配置文件修改
2.3.2.3 prod-k8s-master03 配置文件修改
2.3.2.4 配置 Master 节点健康检查脚本
2.3.2.5 所有Master节点启动Keepalived及Haproxy
2.4 安装 kubernetes 组件
2.5 集群初始化
2.5.1-1 初始化yaml文件(Master01)(使用docker-ce作为容器运行时操作)
2.5.1-2 初始化yaml文件(Master01)(使用containerd作为容器运行时操作)
2.6 拉取 kubuernetes 组件镜像
2.7 Calico网络插件安装(Master01)
2.8 生成新的token key值(Master01)(略)
2.9 Metrics server部署(Master01)
2.10 修改Kube-proxy改为ipvs模式(master01)
2.11 集群可用性验证
2.12 部署Dashboard
一、kubernetes
组件信息
1.1 Master
节点组件
kube-APIServer
:是整个集群的控制中枢,提供集群中各个模块之间的数据交换,并将集群状态和信息存储到分布式键-值(key-value
)存储系统Etcd集群中。同时它也是集群管理、资源配额、提供完备的集群安全机制的入口,为集群各类资源对象提供增删改查以及watch的REST API接口。kube-Scheduler
:是集群Pod的调度中心,主要是通过调度算法将Pod分配到最佳的Node节点,它通过APIServer监听所有Pod的状态,一旦发现新的未被调度到任何Node节点的Pod( PodSpec.NodeName为空),就会根据一系列策略选择最佳节点进行调度。kube-ControllerManager
:是集群状态管理器,以保证Pod或其他资源达到期望值。当集群中某个Pod的副本数或其他资源因故障和错误导致无法正常运行,没有达到设定的值时,Controller Manager会尝试自动修复并使其达到期望状态。Etcd
:由Coreos开发,用于可靠地存储集群的配置数据,是一种持久性、轻量型、分布式的键-值(key-value)数据存储组件,作为Kubernetes集群的持久化存储系统。
1.2 Node
节点组件
Kubelet
:负责与Master通信协作,管理该节点上的Pod,对容器进行健康检查及监控,同时负责上报节点和节点上面Pod的状态。Kube-Proxy
:负责各Pod之间的通信和负载均衡,将指定的流量分发到后端正确的机器上。Runtime:负责容器的管理。CoreDNS
:用于Kubernetes集群内部Service的解析,可以让Pod把Service名称解析成Service的IP,然后通过service的IP地址进行连接到对应的应用上。Calico
:符合CNI标准的一个网络插件,它负责给每个Pod分配一个不会重复的IP,并且把每个节点当做一各“路由器”,这样一个节点的Pod就可以通过IP地址访问到其他节点的Pod。
二、安装初始化
📌生产环境中一般是三台 Master 节点。
Master 节点喝 Worker 节点的 IP 地址网段区分开;防止后期由于业务增长,节点资源需要扩充,方便运维管理。
role
ipaddress
configure
k8s-lb
192.168.9.222
VIP
k8s-master01(etcd )
192.168.9.150
4 core, 4Gb; 50GBS, CentOS 7.9
k8s-master02(etcd )
192.168.9.151
4 core, 4Gb; 50GBS, CentOS 7.9
k8s-master03(etcd )
192.168.9.152
4 core, 4Gb; 50GBS, CentOS 7.9
k8s-node01
192.168.9.153
4 core, 16Gb; 100GBS, CentOS 7.9
k8s-node02
192.168.9.154
4 core, 16Gb; 100GBS, CentOS 7.9
2.1 所有节点初始化环境
#>>> 所有节点修改主机名hostnamectl set-hostname k8s-master01hostnamectl set-hostname k8s-master02hostnamectl set-hostname k8s-master03hostnamectl set-hostname k8s-node01hostnamectl set-hostname k8s-node02#>>> 所有节点关闭防火墙及安全策略systemctl disable --now firewalld NetworkManagersed -ri \"s/^SELINUX=enforcing/SELINUX=disabled/\" /etc/selinux/configsed -i \'s#SELINUX=enforcing#SELINUX=disabled#g\' /etc/sysconfig/selinux setenforce 0#>>> 所有节点禁用swap分区swapoff -a && sysctl -w vm.swappiness=0 && sed -ri \'/^[^#]*swap/s@^@#@\' /etc/fstab#>>> 所有节点修改本地解析cat >> /etc/hosts <>> 所有节点修改YUM源并且安装epel源rm -rf /etc/yum.repos.d/*curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repocurl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo#>>> 所有节点安装docker-ce源yum install -y yum-utilsyum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum makecache fast#>>> 所有节点安装kubernetes的YUM源(阿里云)cat >> /etc/yum.repos.d/kubernetes.repo <>> 所有节点更新系统内rpm软件包(除内核外)yum -y update --exclude=kernel*#>>> 生成公钥和私钥,传送公钥(k8s-master01操作)ssh-keygenfor i in k8s-master02 k8s-master03 k8s-node01 k8s-node02;do ssh-copy-id -i .ssh/id_rsa.pub $i;done#>>> 传输内核包(k8s-master01操作)for i in k8s-master02 k8s-master03 k8s-node01 k8s-node02;do scp kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm $i:/root/ ; done#>>> 所有节点升级的内核(v5.4+),Kubernetes官网推荐内核版本+++++++++++++++++++++++++++++++++++++++++++### 自己安装kernel包然后yum下载kernel-lt-5.4.261-1.el7.elrepo.x86_64kernel-lt-devel-5.4.261-1.el7.elrepo.x86_64+++++++++++++++++++++++++++++++++++++++++++grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfggrubby --args=\"user_namespace.enable=1\" --update-kernel=\"$(grubby --default-kernel)\"grubby --default-kernel #>>> 所有节点安装所需要的服务及依赖(安装Docker是需到github.com/kubernetes中查看当版本适应什么版本的Docker)#>>> 这里没有安装Dockeryum -y install wget jq psmisc vim net-tools telnet yum-utils \\ device-mapper-persistent-data lvm2 git ntpdate \\ ipvsadm ipset sysstat conntrack libseccomp #>>> 所有节点校准时间修改上海时区并且加到开机自启echo \"*/5 * * * * ntpdate -b ntp.aliyun.com\" >>/var/spool/cron/rootln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeecho \'ASia/Shanghai\' > /etc/timezone#>>> 所有节点设置最大文件打开数ulimit -SHn 65535#参数+++++++++++++++++++++++++++++++++++++++++++++-H:设定资源的硬性限制,也就是管理员所设下的限制-S:设定资源的弹性限制;-n :指定同一时间最多可开启的文件数;+++++++++++++++++++++++++++++++++++++++++++++cat >>/etc/security/limits.conf <>> 所有节点生成ipvs内核配置 方便后面把kubernetes的service的proxy换成ipvsmodprobe -- ip_vs # 核心的 IPVS 模块modprobe -- ip_vs_rr # Round-Robin(轮询)调度算法模块modprobe -- ip_vs_wrr # Weighted Round-Robin(加权轮询)modprobe -- ip_vs_sh # Source Hashing(源地址哈希)modprobe -- nf_conntrack # 连接跟踪模块,IPVS 基于连接跟踪工作# /etc/module-load.d 创建.conf文件,开机自动加载cat >>/etc/modules-load.d/ipvs.conf <>> 所有节点k8s内核配置项cat > /etc/sysctl.d/k8s.conf <>> 重启查看调优参数是否加载rebootlsmod | grep --color=auto -e ip_vs -e nf_conntrack
2.2-1 安装 CRI-dockerd 插件以及配置
#因为 kubernetes 从 v1.24 版本开始就不能直接支持 docker 容器运行,所以我们需要下载 CRI-dockerd 插件作为一个垫片/接口来继续使用 Docker 作为容器继续使用。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++Kubelet | | ←—— CRI 接口 ——→ CRI-dockerd | | ←—— Docker API ——→ dockerd+++++++++++++++++++++++++++++++++++++++++++++++++++++++
docker
与Kubernetes
版本依赖:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.27.md
#>>> 所有节点安装docker-ceyum install -y docker-ce-20.10.* docker-ce-cli-20.10.* containerd.io #>>> 所有节点启动docker(如果使用containerd作为容器运行时,不需要启动docker)systemctl enable --now docker.service#>>> 所有节点设置Docker镜像加速器并且修改systemd作为cgroug的驱动(如果使用containerd作为容器运行时,不需要配置)cat >/etc/docker/daemon.json <>> 所有节点重新加载Docker的配置文件且重启(如果使用containerd作为容器运行时,不需要启动docker)systemctl daemon-reload && systemctl restart docker#>>> 下载cri-dockerd驱动(Master01)wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.14/cri-dockerd-0.3.14.amd64.tgz#>>> 解压安装包(Master01)tar -xvf cri-dockerd-0.3.14.amd64.tgz --strip-components=1 -C /usr/local/bin/#>>> 下载cri-docker.service和cri-docker.socket文件(Master01)# cri-docker.service文件内容链接:https://github.com/Mirantis/cri-dockerd/blob/master/packaging/systemd/cri-docker.servicevim /etc/systemd/system/cri-docker.service[Unit]Description=CRI Interface for Docker Application Container EngineDocumentation=https://docs.mirantis.comAfter=network-online.target firewalld.service docker.serviceWants=network-online.targetRequires=cri-docker.socket[Service]Type=notify# ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --cri-dockerd-root-directory=/var/lib/dockerExecReload=/bin/kill -s HUP $MAINPIDTimeoutSec=0RestartSec=2Restart=alwaysStartLimitBurst=3StartLimitInterval=60sLimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinityTasksMax=infinityDelegate=yesKillMode=process[Install]WantedBy=multi-user.target# cri-docker.socket文件内容链接:#https://github.com/Mirantis/cri-dockerd/blob/master/packaging/systemd/cri-docker.socketvim /etc/systemd/system/cri-docker.socket[Unit]Description=CRI Docker Socket for the APIPartOf=cri-docker.service[Socket]#ListenStream=%t/cri-dockerd.sockListenStream=/var/run/cri-dockerd.sockSocketMode=0660SocketUser=rootSocketGroup=docker[Install]WantedBy=sockets.target
#>>> 将 cri-dockerd-0.3.14.amd64.tgz 拷贝至其他全部节点(Master01)Nodes=\'k8s-master02 k8s-master03 k8s-node01 k8s-node02\'for NODE in $Nodes; do echo $NODE; scp cri-dockerd-0.3.14.amd64.tgz $NODE:~; done#>>> 其他所有的节点将 cri-dockerd-0.3.14.amd64.tgz 解压到指定目录tar -xvf cri-dockerd-0.3.14.amd64.tgz --strip-components=1 -C /usr/local/bin/#>>> 将 cri-docker.service 和 cri-docker.socket 文件拷贝至其他所有主机(Master01)for NODE in $Nodes; do scp /etc/systemd/system/cri-docker.service $NODE:/etc/systemd/system/; scp /etc/systemd/system/cri-docker.socket $NODE:/etc/systemd/system; done#>>> 所有节点启动cri-dockerdsystemctl daemon-reload systemctl enable --now cri-docker.servicesystemctl status cri-docker.service
2.2-2 所有节点配置containerd
相关配置(使用containerd
作为容器运行时操作)
#>>> 所有节点安装containerdyum install docker-ce-20.10.* docker-ce-cli-20.10.* containerd.io -y #>>> 所有节点配置 Containerd 所需的模块cat <>> 所有节点加载内核sysctl --system#>>> 所有节点配置Containerd的配置文件mkdir -p /etc/containerdcontainerd config default | tee /etc/containerd/config.toml#>>> 所有节点将 Containerd 的 Cgroup 改为 Systemdvim /etc/containerd/config.tomlSystemdCgroup = true
#>>> 所有节点将 sandbox_image 的 Pause 镜像改成符合自己版本的地址vim /etc/containerd/config.tomlsandbox_image = \"registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9\"
#>>> 所有节点启动Containerd,并配置开机自启动systemctl daemon-reloadsystemctl enable --now containerd
#>>> 所有节点配置 crictl 客户端连接的运行时位置cat > /etc/crictl.yaml <<EOFruntime-endpoint: unix:///run/containerd/containerd.sockimage-endpoint: unix:///run/containerd/containerd.socktimeout: 10debug: falseEOF
2.3 所有 Master 安装 keepalived 以及 HAproxy
yum -y install keepalived haproxy
2.3.1 配置 Master 节点 HAproxy 配置文件
vim /etc/haproxy/haproxy.cfgglobal maxconn 2000 ulimit-n 16384 log 127.0.0.1 local0 err stats timeout 30sdefaults log global mode http option httplog timeout connect 5000 timeout client 50000 timeout server 50000 timeout http-request 15s timeout http-keep-alive 15sfrontend monitor-in bind *:33305 mode http option httplog monitor-uri /monitorfrontend prod-k8s-master # 和主机名保持一致 bind 0.0.0.0:16443 bind 127.0.0.1:16443 mode tcp option tcplog tcp-request inspect-delay 5s default_backend prod-k8s-master # 和主机名保持一致backend prod-k8s-master # 和主机名保持一致 mode tcp option tcplog option tcp-check balance roundrobin default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100 # 和你的master节点保持一致 server prod-k8s-master01192.168.9.150:6443 check server prod-k8s-master02192.168.9.151:6443 check server prod-k8s-master03192.168.9.152:6443 check
2.3.2 配置 Master 节点 keepalived 文件
2.3.2.1 prod-k8s-master01 配置文件修改
vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs { router_id LVS_DEVELscript_user root enable_script_security}vrrp_script chk_apiserver { script \"/etc/keepalived/check_apiserver.sh\" # 自己配置的健康检查脚本 interval 5 weight -5 fall 2 rise 1}vrrp_instance VI_1 { state MASTER interface ens33 mcast_src_ip 192.168.98.21 # 本机IP virtual_router_id 51 priority 101 advert_int 2 authentication { auth_type PASS auth_pass K8SHA_KA_AUTH } virtual_ipaddress { 192.168.98.222 # VIP地址 } track_script { chk_apiserver }}
2.3.2.2 prod-k8s-master02 配置文件修改
vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs { router_id LVS_DEVELscript_user root enable_script_security}vrrp_script chk_apiserver { script \"/etc/keepalived/check_apiserver.sh\" # 自己配置的健康检查脚本 interval 5 weight -5 fall 2 rise 1}vrrp_instance VI_1 { state MASTER interface ens33 mcast_src_ip 192.168.9.151 # 本机IP virtual_router_id 51 priority 100 advert_int 2 authentication { auth_type PASS auth_pass K8SHA_KA_AUTH } virtual_ipaddress { 192.168.9.222 # VIP地址 } track_script { chk_apiserver }}
2.3.2.3 prod-k8s-master03 配置文件修改
vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs { router_id LVS_DEVELscript_user root enable_script_security}vrrp_script chk_apiserver { script \"/etc/keepalived/check_apiserver.sh\" # 自己配置的健康检查脚本 interval 5 weight -5 fall 2 rise 1}vrrp_instance VI_1 { state MASTER interface ens33 mcast_src_ip 192.168.9.152 # 本机IP virtual_router_id 51 priority 100 advert_int 2 authentication { auth_type PASS auth_pass K8SHA_KA_AUTH } virtual_ipaddress { 192.168.9.222 # VIP地址 } track_script { chk_apiserver }}
2.3.2.4 配置 Master 节点健康检查脚本
vim /etc/keepalived/check_apiserver.sh #!/bin/basherr=0for k in $(seq 1 3)do check_code=$(pgrep haproxy) if [[ $check_code == \"\" ]]; then err=$(expr $err + 1) sleep 1 continue else err=0 break fidoneif [[ $err != \"0\" ]]; then echo \"systemctl stop keepalived\" /usr/bin/systemctl stop keepalived exit 1else exit 0fi# 给与执行权限chmod +x /etc/keepalived/check_apiserver.sh
2.3.2.5 所有Master
节点启动Keepalived
及Haproxy
systemctl daemon-reloadsystemctl enable --now keepalived haproxyping 192.168.9.222
2.4 安装 kubernetes 组件
#>>> Master节点执行yum install kubeadm-1.28* kubelet-1.28* kubectl-1.28* -y#>>> Node节点执行yum install kubeadm-1.28* kubelet-1.28* -y#>>> 查看kubeadm版本(Master01)kubeadm version#>>> 将所有kubelet配置成systemd作为cgroug驱动,保持系统稳定。(如果使用containerd作为容器运行时,不需要配置)cat >/etc/sysconfig/kubelet <>> 所有节点启动kubelet(查看状态时,失败正常,因为此时 kubelet 没有配置文件)systemctl daemon-reload && systemctl enable --now kubelet
2.5 集群初始化
2.5.1-1 初始化yaml
文件(Master01
)(使用docker-ce
作为容器运行时操作)
kubeadm
的初始化控制平面(init
)命令和加入节点(join
)命令均可以通过指定的配置文件修改默认参数的值。kubeadm
将配置文件以ConfigMap
形式保存到集群中,便于后续的查询和升级工作。
kubeadm config
子命令提供了对这组功能的支持。
kubeadm config print init-defaults
:输出kubeadm init
命令默认参数的内容。kubeadm config print join-defaults
:输出kubeadm join
命令默认参数的内容。kubeadm config migrate
:在新旧版本之间进行配置转换。kubeadm config images list
:列出所需的镜像列表。kubeadm config images pull
:拉取镜像到本地。
$ vim /root/kubeadm-config.yaml---apiVersion: kubeadm.k8s.io/v1beta3bootstrapTokens:- groups: - system:bootstrappers:kubeadm:default-node-token token: 7t2weq.bjbawausm0jaxury ttl: 24h0m0s usages: - signing - authenticationkind: InitConfigurationlocalAPIEndpoint: advertiseAddress: 192.168.9.150 bindPort: 6443nodeRegistration: criSocket: unix:///var/run/cri-dockerd.sock name: k8s-master01 taints: - effect: NoSchedule key: node-role.kubernetes.io/control-plane---apiServer: certSANs: - 192.168.9.222 timeoutForControlPlane: 4m0sapiVersion: kubeadm.k8s.io/v1beta3certificatesDir: /etc/kubernetes/pkiclusterName: kubernetescontrolPlaneEndpoint: 192.168.9.222:16443controllerManager: {}etcd: local: dataDir: /var/lib/etcdimageRepository: registry.cn-hangzhou.aliyuncs.com/google_containerskind: ClusterConfigurationkubernetesVersion: v1.28.15 # 更改此处的版本号和kubeadm version一致networking: dnsDomain: cluster.local podSubnet: 172.16.0.0/16 serviceSubnet: 10.96.0.0/16scheduler: {}⚠️:配置文件参数需要修改,修改前备份,或者直接用命令行直接生成新的配置文件,但是仍需要修改配置文件中的参数 ⚠️配置文件需改参数 advertiseAddress: 192.168.174.30 # Master01 的ip地址 name: k8s-master01 # Master01 的主机名 - 192.168.174.99 # VIP ip地址 controlPlaneEndpoint: 192.168.174.99:16443 # VIP ip地址:端口 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #镜像仓库地址(阿里) kubernetesVersion: v1.28.15 # kubernetes的版本号 podSubnet: 172.16.0.0/16 # Pod 的网段地址 serviceSubnet: 10.96.0.0/16 # service 的网段地址 #>>> 上述配置文件解析---# 指定 Kubernetes 配置文件的 API 版本,v1beta3 代表是 Kubernetes v1.28.x 版本的 kubeadm 配置。apiVersion: kubeadm.k8s.io/v1beta3# 用于集群引导时的身份认证信息。bootstrapTokens:# 指定 token 属于哪个组。- groups: # system:bootstrappers:kubeadm:default-node-token 是默认的引导令牌组。 - system:bootstrappers:kubeadm:default-node-token # 指定引导令牌,它的格式是 xxxxxx.xxxxxxxx。此 token 用于在集群中认证节点。 token: 7t2weq.bjbawausm0jaxury # token 的过期时间,24h0m0s 表示 24 小时后过期。 ttl: 24h0m0s # token 的使用场景,包括 signing 和 authentication,表示用于签名和身份验证。 usages: - signing - authentication# 资源类型。初始化配置kind: InitConfiguration# 本地 API 服务端点配置。也是就是当前主机apiserver的IP地址和端口,非VIP地址localAPIEndpoint: # Kubernetes 控制平面节点(主节点)对外提供服务的 IP 地址,这里指定为 192.168.174.30。 advertiseAddress: 192.168.174.30 # API 服务器绑定的端口号,默认为 6443。 bindPort: 6443# 节点注册的相关配置。nodeRegistration: # 指定容器运行时接口(CRI)socket,这里使用的是 cri-dockerd,它是 Docker 的 CRI 插件,路径为 unix:///var/run/cri-dockerd.sock。 criSocket: unix:///var/run/cri-dockerd.sock # 节点的名称,这里是 k8s-master01,通常是主节点(控制平面)的名称。 name: k8s-master01 # 用于标记节点的污点。这里使用 NoSchedule 的效果,表示该节点只能调度控制平面组件,而不能调度其他类型的工作负载(如 pod)。key 表示污点的键值对,node-role.kubernetes.io/control-plane 是 Kubernetes 默认的控制平面标识。 taints: - effect: NoSchedule key: node-role.kubernetes.io/control-plane---# Kubernetes API 服务器的配置。apiServer: # 指定 API 服务器的 Subject Alternative Names(SANs),用于证书验证。这里设置了 192.168.174.99,即该 IP 地址将用于访问 API 服务器。 certSANs: - 192.168.174.99 # 设置控制平面组件的超时时间,4m0s 表示 4 分钟。该值控制控制平面组件启动的超时。 timeoutForControlPlane: 4m0s# api版本apiVersion: kubeadm.k8s.io/v1beta3# 证书存放的目录,这里是 /etc/kubernetes/pki。Kubernetes 集群的各种证书(如 API 服务器证书、etcd 证书等)都会存储在此目录下。certificatesDir: /etc/kubernetes/pki# 集群的名称。这里指定为 kubernetes。clusterName: kubernetes# 控制平面的外部访问端点,指定了 API 服务器的地址和端口。这里设置为 192.168.174.99:16443,表示集群的 API 服务器可以通过这个 IP 地址和端口进行访问。controlPlaneEndpoint: 192.168.174.99:16443# 控制器管理器的配置项,当前为空 {},表示使用默认配置。controllerManager: {}# etcd 配置,etcd 是 Kubernetes 的键值存储,存储了所有的集群状态。etcd: # local:表示使用本地 etcd 实例。 local: # 指定 etcd 数据目录,这里是 /var/lib/etcd。 dataDir: /var/lib/etcd# 指定 Kubernetes 控制平面组件(如 API 服务器、控制器管理器、调度器)镜像的仓库地址。这里使用的是阿里云的镜像仓库 registry.cn-hangzhou.aliyuncs.com/google_containers。imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containerskind: ClusterConfiguration# 指定 Kubernetes 的版本。这里是 v1.28.15,需要与 kubeadm 的版本一致。kubernetesVersion: v1.28.15 # 更改此处的版本号和kubeadm version一致# 集群网络配置。networking: # DNS 域名,用于集群内部服务的 DNS 名称。这里是 cluster.local。 dnsDomain: cluster.local # Pod 网络子网,指定为 172.16.0.0/16,表示 Pod IP 地址范围。 podSubnet: 172.16.0.0/16 # 服务网络子网,指定为 10.96.0.0/16,表示服务 IP 地址范围。 serviceSubnet: 10.96.0.0/16# 调度器的配置项,当前为空 {},表示使用默认配置。scheduler: {}#>>> 更新的初始化文件(Master01)$ kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml#>>> 将new.yaml 拷贝至其他master节点(Master01)$ for i in k8s-master02 k8s-master03; do scp new.yaml $i:/root/; done
2.5.1-2 初始化yaml
文件(Master01
)(使用containerd
作为容器运行时操作)
$ vim /root/kubeadm-config.yaml---apiVersion: kubeadm.k8s.io/v1beta3bootstrapTokens:- groups: - system:bootstrappers:kubeadm:default-node-token token: 7t2weq.bjbawausm0jaxury ttl: 24h0m0s usages: - signing - authenticationkind: InitConfigurationlocalAPIEndpoint: advertiseAddress: 192.168.174.30 bindPort: 6443nodeRegistration: criSocket: unix:///var/run/containerd/containerd.sock name: k8s-master01 taints: - effect: NoSchedule key: node-role.kubernetes.io/control-plane---apiServer: certSANs: - 192.168.174.99 timeoutForControlPlane: 4m0sapiVersion: kubeadm.k8s.io/v1beta3certificatesDir: /etc/kubernetes/pkiclusterName: kubernetescontrolPlaneEndpoint: 192.168.174.99:16443controllerManager: {}etcd: local: dataDir: /var/lib/etcdimageRepository: registry.cn-hangzhou.aliyuncs.com/google_containerskind: ClusterConfigurationkubernetesVersion: v1.28.15 # 更改此处的版本号和kubeadm version一致networking: dnsDomain: cluster.local podSubnet: 172.16.0.0/16 serviceSubnet: 10.96.0.0/16scheduler: {}⚠️:配置文件参数需要修改,修改前备份,或者直接用命令行直接生成新的配置文件,但是仍需要修改配置文件中的参数 ⚠️配置文件需改参数 advertiseAddress: 192.168.174.30 # Master01 的ip地址 name: k8s-master01 # Master01 的主机名 - 192.168.174.99 # VIP ip地址 controlPlaneEndpoint: 192.168.174.99:16443 # VIP ip地址:端口 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #镜像仓库地址(阿里) kubernetesVersion: v1.28.15 # kubernetes的版本号 podSubnet: 172.16.0.0/16 # Pod 的网段地址 serviceSubnet: 10.96.0.0/16 # service 的网段地址 #>>> 更新的初始化文件(Master01)$ kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml#>>> 将new.yaml 拷贝至其他master节点(Master01)$ for i in k8s-master02 k8s-master03; do scp new.yaml $i:/root/; done
2.6 拉取 kubuernetes 组件镜像
#>>> 拉取初始化所需要的镜像文件(根据当前配置文件拉去所需要的镜像)(所有Master节点)kubeadm config images pull --config new.yaml#>>> 初始化集群(生成安全证书并且生成node节点加入集群中的哈希码)(Master01)kubeadm init --config new.yaml --upload-certs#>>> 如果初始化失败,重置后再次初始化,命令如下(没有失败不要执行)$ kubeadm reset -f ; ipvsadm --clear ; rm -rf ~/.kube#>>> 另外两个 master 节点执行kubeadm join 192.168.174.122:16443 --token 7t2weq.bjbawausm0jaxury \\--discovery-token-ca-cert-hash sha256:d30b11256f574adc45ee1c9cbf1925054bd28c53b39044316ba5f41c38c9829d \\--control-plane --certificate-key e7947922e80dcef1a21b6eec92ddd44c2e05eacff88c61eab648cfb8afbd1662 --cri-socket=unix:///var/run/cri-dockerd.sock#>>> 所有 Node节点执行kubeadm join 192.168.174.122:16443 --token 7t2weq.bjbawausm0jaxury \\--discovery-token-ca-cert-hash sha256:d30b11256f574adc45ee1c9cbf1925054bd28c53b39044316ba5f41c38c9829d --cri-socket=unix:///var/run/cri-dockerd.sock#>>> k8s-master01执行mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config#>>> Master01执行查看node状态$ kubectl get nodes
2.7 Calico网络插件安装(Master01)
Calico
官方链接:Calico Documentation | Calico Documentation
Calico
资源清单:https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/calico.yaml
Calico
安装方式:https://docs.tigera.io/calico/3.28/getting-started/kubernetes/self-managed-onprem/onpremises#install-calico
⚠️ :注意kubernetes
和calico
之间的版本关联;详细信息去官网查看:System requirements | Calico Documentation
cd /root/ && git clone https://gitee.com/BRWYZ/kubernetes_install.gitcd /root/kubernetes_install && git checkout v1.28+ && cd calico/#>>> 修改calico配置文件中Pod的网段POD_SUBNET=`cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep cluster-cidr= | awk -F= \'{print $NF}\'`sed -i \"s#POD_CIDR#${POD_SUBNET}#g\" calico.yaml#>>> 创建calico容器kubectl apply -f calico.yaml#>>> 查看Pod的信息kubectl get po -n kube-system
#>>> 取消所有master节点污点kubectl taint node k8s-master01 k8s-master02 k8s-master03 node-role.kubernetes.io/control-plane-
2.8 生成新的token key
值(Master01
)(略)
⚠️:由于生成的token
值有效期较短,或者有新的master
或者node
节点需要添加集群当中,所以需要获取新的token
值
#>>> 生成新的master的token值(一般不需要,三台master足够支撑)kubeadm init phase upload-cers --upload-certs#>>> 生成新的node的token值kubeadm token create --print-join-command#>>> 查看token值过期时间(在/root/new.yaml文件中token: abcdef.0123456789abcdef对应bootstrap-token-abcdef)$ kubectl get secret -n kube-system bootstrap-token-abcdef$ kubectl get secret bootstrap-token-abcdef -n kube-system -oyaml 找到 expiration: MjAyMi0xMS0yM1QxNDowNjowOFo=$ echo \"MjAyMi0xMS0yM1QxNDowNjowOFo=\" | base64 --decode
2.9 Metrics server
部署(Master01
)
#>>> 将Master01节点的front-proxy-ca.crt复制到所有节点(master01)scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node01:/etc/kubernetes/pki/front-proxy-ca.crtscp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node02:/etc/kubernetes/pki/front-proxy-ca.crtscp /etc/kubernetes/pki/front-proxy-ca.crt k8s-master02:/etc/kubernetes/pki/front-proxy-ca.crtscp /etc/kubernetes/pki/front-proxy-ca.crt k8s-master03:/etc/kubernetes/pki/front-proxy-ca.crt#>>> 安装Metrics server(master01)cd ~/kubernetes_install/kubeadm-metrics-server/ && kubectl create -f comp.yaml#>>> 查看Metrics server状态(master01)kubectl get po -n kube-system -l k8s-app=metrics-server#>>> 查看节点状态(master01)kubectl top node #>>> 查看pod的状态(master01)kubectl top po -A
2.10 修改Kube-proxy
改为ipvs
模式(master01
)
初始化集群的时注释了ipvs
配置(Master01
),将 kube-proxy
模式从 iptables
修改为 ipvs
是为了提升性能和功能。
- 性能优势:
ipvs
可以更有效地处理大量并发连接。这使得它在高流量场景下表现更佳。更好地扩展以处理更多的服务和后端pod
,而iptables
在规则数量非常多时,性能可能会显著下降。 - 低延迟和高吞吐量:
ipvs
通过在内核空间处理数据包,减少了用户空间和内核空间之间的切换,从而提高了数据包处理的效率,带来更低的延迟和更高的吞吐量。 - 快速规则应用:
ipvs
在处理和应用网络规则时速度更快,特别是在规则变更频繁的情况下。 - 多种调度算法:
ipvs
提供了多种负载均衡算法(如轮询、最小连接、最短延迟等),可以根据具体需求选择最合适的算法,而iptables
则缺乏这种灵活性。 - 稳定性:
ipvs
的实现更加稳定,尤其是在大型集群中,它能更好地应对复杂的网络环境和高负载。 - 简化的规则管理:
ipvs
使用专用的内核模块管理规则,相比iptables
更加简洁和高效。iptables
规则在处理和管理上会更加复杂,特别是当规则数量增多时。 - 维护方便:
ipvs
的规则结构更清晰,维护起来更为方便,不像iptables
那样需要处理大量的规则链和复杂的规则匹配逻辑。
kubectl edit cm kube-proxy -n kube-system # 找到mode字段添加ipvs#>>> 更新Kube-Proxy的Podkubectl patch daemonset kube-proxy -p \"{\\\"spec\\\":{\\\"template\\\":{\\\"metadata\\\":{\\\"annotations\\\":{\\\"date\\\":\\\"`date +\'%s\'`\\\"}}}}}\" -n kube-system#>>> 验证Kube-Proxy模式curl 127.0.0.1:10249/proxyModeipvs
2.11 集群可用性验证
#>>> 安装pod,测试集群连通性cat <>> 查看kubernetes下的servicekubectl get svc#>>> busybox解析同namespace下的servicekubectl exec busybox -n default -- nslookup kubernetes.default.svc.cluster.local # 执行结果:(成功) Server: 10.96.0.10Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Name: kubernetesAddress 1: 10.96.0.1 kubernetes.default.svc.cluster.local#>>> busybox跨namespace解析kube-system下的namespacekubectl exec busybox -n default -- nslookup kube-dns.kube-system.svc.cluster.localServer: 10.96.0.10Address: 10.96.0.10:53Name: kube-dns.kube-system.svc.cluster.localAddress: 10.96.0.10#>>> 每个节点都必须要访问kubernetes的service:443和kube-dns的service:53telnet 10.96.0.1 443 #kubernetes下的service(kubectl get svc) # 返回结果:Trying 10.96.0.1...Connected to 10.96.0.1.Escape character is \'^]\'.telnet 10.96.0.10 53 #kube-system下的service (kubectl get svc -n kube-system) # 执行结果:Trying 10.96.0.10...Connected to 10.96.0.10.Escape character is \'^]\'.Connection closed by foreign host.#>>> Pod和Pod之间通信测试 #>>> 进入一个Pod当中 kubectl exec -it busybox -- sh #>>> ping其他Pod / # ping 172.25.244.193 #>>> ping宿主机 / # ping 192.168.174.30#>>> 创建一个deployment副本kubectl create deploy nginx --image=registry.cn-hangzhou.aliyuncs.com/hujiaming/nginx:1.24.0 --replicas=1#>>> 查看创建的副本kubectl get deploy执行结果: NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTORnginx 0/1 1 0 7m35s nginx nginx:v1.21 app=nginx#>>> 删除创建的deployment副本kubectl delete deploy nginx
集群验证步骤:
Pod
必须解析service
,Pod
必须能解析跨namespace
的service
- 每个节点都必须要访问
kubernetes
的service:443
和kube-dns
的service:53
- 每个
Pod
和Pod
之间能通信(同namespace
能通信,跨namespace
能通信,跨主机通信)
2.12 部署Dashboard
#>>> 切换目录cd /root/kubernetes_install/dashboard#>>> 创建Dashboardkubectl create -f . #>>> 查看Dashboradkubectl get po -n kubernetes-dashboard#>>> 查看Dashdoard暴露的端口号kubectl get svc -n kubernetes-dashboard#>>> 创建Token值kubectl create token admin-user -n kube-system
火狐浏览器访问:https://宿主机 IP:30164