云计算-Kubernetes入门部署
目录
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.5 所有Master节点启动Keepalived及Haproxy
2.5.1-1 初始化yaml文件(Master01)(使用docker-ce作为容器运行时操作)
2.5.1-2 初始化yaml文件(Master01)(使用containerd作为容器运行时操作)
2.8 生成新的token key值(Master01)(略)
2.9 Metrics server部署(Master01)
2.10 修改Kube-proxy改为ipvs模式(master01)
一、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 地址网段区分开;防止后期由于业务增长,节点资源需要扩充,方便运维管理。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2.1 所有节点初始化环境
#>>> 所有节点修改主机名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-master02
hostnamectl set-hostname k8s-master03
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02
#>>> 所有节点关闭防火墙及安全策略
systemctl disable --now firewalld NetworkManager
sed -ri "s/^SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
sed -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 << EOF
192.168.174.122 k8s-lb
192.168.174.30 k8s-master01
192.168.174.31 k8s-master02
192.168.174.32 k8s-master03
192.168.174.40 k8s-node01
192.168.174.41 k8s-node02
EOF
#>>> 所有节点修改YUM源并且安装epel源
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
#>>> 所有节点安装docker-ce源
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
#>>> 所有节点安装kubernetes的YUM源(阿里云)
cat >> /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF
#>>> 所有节点更新系统内rpm软件包(除内核外)
yum -y update --exclude=kernel*
#>>> 生成公钥和私钥,传送公钥(k8s-master01操作)
ssh-keygen
for 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_64
kernel-lt-devel-5.4.261-1.el7.elrepo.x86_64
+++++++++++++++++++++++++++++++++++++++++++
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
grubby --default-kernel
#>>> 所有节点安装所需要的服务及依赖(安装Docker是需到github.com/kubernetes中查看当版本适应什么版本的Docker)
#>>> 这里没有安装Docker
yum -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/root
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'ASia/Shanghai' > /etc/timezone
#>>> 所有节点设置最大文件打开数
ulimit -SHn 65535
#参数
+++++++++++++++++++++++++++++++++++++++++++++
-H:设定资源的硬性限制,也就是管理员所设下的限制
-S:设定资源的弹性限制;
-n <文件数目>:指定同一时间最多可开启的文件数;
+++++++++++++++++++++++++++++++++++++++++++++
cat >>/etc/security/limits.conf << EOF
* soft nofile 655360
* hard nofile 131072
* soft nproc 655350
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited
EOF
# 参数解释:
soft nofile 655360 # nofile 表示每个进程可以打开的最大文件描述符数(即最大可打开的文件数)。soft 表示这是软限制,用户可以在不超过硬限制的情况下通过 ulimit 命令调整此值。适用于需要大量文件句柄的应用,如大型数据库、Web 服务器等。
hard nofile 131072 # hard 表示这是硬限制,用户无法通过 ulimit 命令将其值调得超过此限制。适用于限制系统上所有进程的资源使用,以防止过度消耗系统资源。
soft nproc 655350 # nproc 表示每个用户可创建的最大进程数。soft 限制可以通过 ulimit 命令在运行时调整,但不能超过硬限制。适用于需要大量进程的应用或服务,如批处理作业、高并发应用等。
hard nproc 655350 # hard 限制是不能被用户通过 ulimit 命令调整的最大进程数限制。防止单个用户启动过多的进程,影响系统稳定性。
soft memlock unlimited # memlock 表示进程可以锁定在物理内存中的最大内存大小。soft 限制指可以在不超过硬限制的情况下调整锁定内存大小。对于需要频繁访问内存的应用,锁定内存可以减少分页操作的开销,提高性能。
hard memlock unlimited # hard 限制表示进程能锁定的内存大小的最大限制,用户不能超出此限制。
#>>> 所有节点生成ipvs内核配置 方便后面把kubernetes的service的proxy换成ipvs
modprobe -- 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 << EOF
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF
# 参数解释:
ip_vs # 通过将客户端请求转发到多台后端服务器上来实现负载均衡。ip_vs 是负载均衡模块的核心部分。
ip_vs_lc # lc 是 IPVS 的一个负载均衡算法,即 Least Connection(最少连接数)。它将流量转发到当前连接数最少的后端服务器。
ip_vs_wlc # wlc 是 IPVS 的一种负载均衡算法,即 Weighted Least Connection(加权最少连接数)。它基于每个后端服务器的连接数和权重来决定流量的分配。
ip_vs_rr # rr 是 IPVS 的一种负载均衡算法,即 Round Robin(轮询)。该算法按照轮询的方式将请求分配给每个后端服务器。
ip_vs_wrr # wrr 是 IPVS 的一种负载均衡算法,即 Weighted Round Robin(加权轮询)。它在轮询的基础上增加了权重,允许按权重分配流量。
ip_vs_lblc # lblc 是 IPVS 的一种负载均衡算法,即 Locality-Based Least Connection(基于区域的最少连接)。此算法会尝试将请求转发到与客户端最近的服务器,并且选择连接数最少的服务器。
ip_vs_lblcr # lblcr 是 IPVS 的一种负载均衡算法,即 Locality-Based Least Connection with Replication(基于区域的最少连接和复制)。与 lblc 类似,但它增加了复制机制,确保请求的处理有冗余。
ip_vs_dh # dh 是 IPVS 的一种负载均衡算法,即 Destination Hashing(目标哈希)。该算法基于客户端的目标地址进行哈希计算,将请求分配给相应的后端服务器。适用于根据目标地址进行流量分配的场景。
ip_vs_sh # sh 是 IPVS 的一种负载均衡算法,即 Source Hashing(源地址哈希)。该算法通过计算客户端的源地址的哈希值来决定请求的后端服务器。适用于需要根据客户端来源地址进行流量分配的场景。
ip_vs_fo # fo 是 IPVS 的一种负载均衡算法,即 Full Random(完全随机)。此算法将请求随机地分配到后端服务器。适用于负载均衡效果不要求过于精确的场景,尤其是在负载相对均衡时。
ip_vs_nq # nq 是 IPVS 的一种负载均衡算法,即 No Queue(无队列)。该算法不使用队列调度,而是直接将请求分配给服务器。适用于不需要复杂调度的场景。
ip_vs_sed # sed 是 IPVS 的一种负载均衡算法,即 Shortest Expected Delay(最短预期延迟)。该算法优先将流量分配给预计延迟最短的服务器。适用于需要减少延迟的实时应用,如视频流、在线游戏等。
ip_vs_ftp # ftp 是 IPVS 的一种负载均衡算法,专门用于处理 FTP(文件传输协议)流量。它确保 FTP 流量的会话正确地转发。专用于处理 FTP 协议流量的负载均衡。
nf_conntrack # nf_conntrack 是 Linux 的一个网络连接跟踪模块,用于跟踪所有活动的网络连接的状态(如 NAT、状态防火墙等)。在防火墙、路由器以及需要监控连接状态的网络环境中使用。
ip_tables # ip_tables 是 Linux 防火墙模块,负责处理基于 IP 地址的包过滤。它包含多个子模块,用于定义流量的规则(如允许或拒绝某些流量)。
ip_set # ip_set 是用于创建和管理 IP 地址、端口、网络等集合的模块。它优化了防火墙规则的执行,使得基于集合的匹配更加高效。用于处理大量 IP 地址或端口集的防火墙规则。
xt_set # xt_set 是 iptables 扩展模块,允许防火墙基于 ip_set 中的集合进行匹配。提升基于集合的过滤规则效率,常用于大规模 IP 集合的匹配。
ipt_set # ipt_set 是一个与 ip_set 类似的模块,但它直接用于 iptables 防火墙规则中。用于优化防火墙规则,减少性能开销。
ipt_rpfilter # ipt_rpfilter 是 iptables 中的反向路径过滤模块。它通过检查包的源地址与路由表的一致性来阻止伪造源地址的包。防止 IP 欺骗攻击(如反射 DDoS 攻击)。
ipt_REJECT # ipt_REJECT 是 iptables 中的一个目标模块,表示拒绝数据包并发送错误信息给发送者。当某个连接不符合防火墙规则时,直接拒绝并告知发送方。
ipip # ipip 是一种隧道协议,它允许将 IPv4 数据包封装在其他 IPv4 数据包中,从而在 IPv4 网络上传输 IPv4 数据。用于在 IPv4 网络之间进行封装传输,通常用于创建虚拟专用网络(VPN)或跨越 NAT 的连接。
#>>> 所有节点k8s内核配置项
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
net.ipv4.conf.all.route_localnet = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF
sysctl --system
# 参数解释:
net.ipv4.ip_forward = 1 # 启用IPV4转发,允许系统将网络数据包从一个接口转发到另一个接口
net.bridge.bridge-nf-call-iptables = 1 # 启用网桥(bridge)上调用iptables进行数据包过滤。
fs.may_detach_mounts = 1 # 控制进程可以拆卸挂载点(例如卸载文件系统)。允许进程拆卸挂载。在某些容器环境或特殊系统中,可能需要允许进程卸载某些挂载。
vm.overcommit_memory = 1 # 控制内存超分配的行为。内核会允许系统分配更多的内存。
vm.panic_on_oom = 0 # 当系统内存不足时,是否触发内核 panic。不希望因内存不足而导致系统崩溃的场景。
fs.inotify.max_user_watches = 89100 # 控制单个用户可以监视的最大文件数(最大文件系统监视数)。
fs.file-max = 52706963 # 指定系统允许的最大文件句柄数。每个打开的文件和套接字都占用一个文件句柄。
fs.nr_open = 52706963 # 指定系统中可以同时打开的最大文件描述符数。
net.netfilter.nf_conntrack_max = 2310720 # 设置连接追踪表的最大条目数。连接追踪表用于跟踪每个网络连接的状态。适用于大规模网络环境,防火墙或NAT配置中需要跟踪大量并发连接时。
net.ipv4.tcp_keepalive_time = 600 # 设置TCP连接保持活动的时间,单位为秒。在该时间后,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连接数。TIME-WAIT状态的连接在关闭后会保留一段时间,以确保对方收到确认。适用于高并发系统,防止过多的TIME-WAIT连接占用资源。
net.ipv4.tcp_tw_reuse = 1 # 允许重新使用TIME-WAIT状态的连接。适用于高并发场景,减少TIME-WAIT连接的资源占用。
net.ipv4.tcp_max_orphans = 327680 # 允许系统同时存在的最大孤立连接数(即没有关联到任何进程的连接)。适用于高负载服务器,确保系统可以处理大量连接。
net.ipv4.tcp_orphan_retries = 3 # 定义系统在关闭孤立连接之前,重试的最大次数。用于优化TCP连接管理,避免长时间无效连接占用资源。
net.ipv4.tcp_syncookies = 1 # 用TCP同步cookie(SYN cookies)来防止SYN洪水攻击。该机制可以在受到DDoS攻击时帮助缓解连接请求的压力。防止SYN洪水攻击,提高系统的抗攻击能力。
net.ipv4.tcp_max_syn_backlog = 16384 # TCP连接请求的最大排队数。当SYN请求到达时,如果队列满了,则会丢弃请求。适用于高并发服务器,以增加接收SYN请求的能力。
net.ipv4.ip_conntrack_max = 65536 # 设置连接追踪表(conntrack)的最大连接数。适用于大量并发连接的环境,比如防火墙、路由器等。
net.ipv4.tcp_timestamps = 0 # 禁用TCP时间戳。TCP时间戳可以用于计算往返时延,但它也会增加额外的开销。提高性能,减少不必要的开销。
net.core.somaxconn = 16384 # 定义系统能够接受的最大连接请求队列长度。该值影响listen()系统调用的最大队列大小。适用于高并发服务器,确保可以处理大量连接请求。
#>>> 重启查看调优参数是否加载
reboot
lsmod | 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-ce
yum 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 << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [ "http://hub-mirror.c.163.com",
"https://kr1xs9ba.mirror.aliyuncs.com",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://noohub.run",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://registry.docker-cn.com",
"https://yfw3r2c6.mirror.aliyuncs.com",
"http://hub-mirror.c.163.com",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"]
}
EOF
#>>> 所有节点重新加载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.service
vim /etc/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=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/docker
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
# cri-docker.socket文件内容链接:
#https://github.com/Mirantis/cri-dockerd/blob/master/packaging/systemd/cri-docker.socket
vim /etc/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
#ListenStream=%t/cri-dockerd.sock
ListenStream=/var/run/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=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-dockerd
systemctl daemon-reload
systemctl enable --now cri-docker.service
systemctl status cri-docker.service

2.2-2 所有节点配置containerd相关配置(使用containerd作为容器运行时操作)
#>>> 所有节点安装containerd
yum install docker-ce-20.10.* docker-ce-cli-20.10.* containerd.io -y
#>>> 所有节点配置 Containerd 所需的模块
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
#>>> 所有节点加载内核
sysctl --system
#>>> 所有节点配置Containerd的配置文件
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml
#>>> 所有节点将 Containerd 的 Cgroup 改为 Systemd
vim /etc/containerd/config.toml
SystemdCgroup = true

#>>> 所有节点将 sandbox_image 的 Pause 镜像改成符合自己版本的地址
vim /etc/containerd/config.toml
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9"

#>>> 所有节点启动Containerd,并配置开机自启动
systemctl daemon-reload
systemctl enable --now containerd

#>>> 所有节点配置 crictl 客户端连接的运行时位置
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
2.3 所有 Master 安装 keepalived 以及 HAproxy
yum -y install keepalived haproxy
2.3.1 配置 Master 节点 HAproxy 配置文件
vim /etc/haproxy/haproxy.cfg
global
maxconn 2000
ulimit-n 16384
log 127.0.0.1 local0 err
stats timeout 30s
defaults
log global
mode http
option httplog
timeout connect 5000
timeout client 50000
timeout server 50000
timeout http-request 15s
timeout http-keep-alive 15s
frontend monitor-in
bind *:33305
mode http
option httplog
monitor-uri /monitor
frontend 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-master01 192.168.9.150:6443 check
server prod-k8s-master02 192.168.9.151:6443 check
server prod-k8s-master03 192.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 keepalived
global_defs {
router_id LVS_DEVEL
script_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 keepalived
global_defs {
router_id LVS_DEVEL
script_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 keepalived
global_defs {
router_id LVS_DEVEL
script_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/bash
err=0
for 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
fi
done
if [[ $err != "0" ]]; then
echo "systemctl stop keepalived"
/usr/bin/systemctl stop keepalived
exit 1
else
exit 0
fi
# 给与执行权限
chmod +x /etc/keepalived/check_apiserver.sh
2.3.2.5 所有Master节点启动Keepalived及Haproxy
systemctl daemon-reload
systemctl enable --now keepalived haproxy
ping 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 << EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF
#`Kubernetes`默认设置`cgroup驱动(cgroupdriver)` 为“`systemd`”,而`Docker`服务的`cgroup`驱动默认值为“`cgroupfs`,建议将其修改为“`systemd`”,与`Kubernetes`保持一致。
#>>> 所有节点启动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/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: 7t2weq.bjbawausm0jaxury
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.9.150
bindPort: 6443
nodeRegistration:
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: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.9.222:16443
controllerManager: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.28.15 # 更改此处的版本号和kubeadm version一致
networking:
dnsDomain: cluster.local
podSubnet: 172.16.0.0/16
serviceSubnet: 10.96.0.0/16
scheduler: {}
⚠️:配置文件参数需要修改,修改前备份,或者直接用命令行直接生成新的配置文件,但是仍需要修改配置文件中的参数
⚠️配置文件需改参数
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_containers
kind: 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/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: 7t2weq.bjbawausm0jaxury
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.174.30
bindPort: 6443
nodeRegistration:
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: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.174.99:16443
controllerManager: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.28.15 # 更改此处的版本号和kubeadm version一致
networking:
dnsDomain: cluster.local
podSubnet: 172.16.0.0/16
serviceSubnet: 10.96.0.0/16
scheduler: {}
⚠️:配置文件参数需要修改,修改前备份,或者直接用命令行直接生成新的配置文件,但是仍需要修改配置文件中的参数
⚠️配置文件需改参数
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/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo 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
⚠️ :注意kubernetes和calico之间的版本关联;详细信息去官网查看:System requirements | Calico Documentation
cd /root/ && git clone https://gitee.com/BRWYZ/kubernetes_install.git
cd /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.crt
scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node02:/etc/kubernetes/pki/front-proxy-ca.crt
scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-master02:/etc/kubernetes/pki/front-proxy-ca.crt
scp /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的Pod
kubectl patch daemonset kube-proxy -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}" -n kube-system
#>>> 验证Kube-Proxy模式
curl 127.0.0.1:10249/proxyMode
ipvs
2.11 集群可用性验证
#>>> 安装pod,测试集群连通性
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- name: busybox
image: registry.cn-hangzhou.aliyuncs.com/hujiaming/busybox:latest
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Always
EOF
#>>> 查看kubernetes下的service
kubectl get svc
#>>> busybox解析同namespace下的service
kubectl exec busybox -n default -- nslookup kubernetes.default.svc.cluster.local
# 执行结果:(成功)
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
#>>> busybox跨namespace解析kube-system下的namespace
kubectl exec busybox -n default -- nslookup kube-dns.kube-system.svc.cluster.local
Server: 10.96.0.10
Address: 10.96.0.10:53
Name: kube-dns.kube-system.svc.cluster.local
Address: 10.96.0.10
#>>> 每个节点都必须要访问kubernetes的service:443和kube-dns的service:53
telnet 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 SELECTOR
nginx 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
#>>> 创建Dashboard
kubectl create -f .
#>>> 查看Dashborad
kubectl get po -n kubernetes-dashboard
#>>> 查看Dashdoard暴露的端口号
kubectl get svc -n kubernetes-dashboard
#>>> 创建Token值
kubectl create token admin-user -n kube-system
火狐浏览器访问:https://宿主机 IP:30164


更多推荐
所有评论(0)