三.构建k8s多master多node

1、基本信息

创建三个主节点和2个从节点、在master-01和master-02上面部署nginx+keepalive实现节点高可用

用户访问的时候要访问vip地址、然后vip地址通过负载均衡转发到master、再到对应的pod

角色IP主机名组件硬件
控制节点192.168.0.11k8s-master-01apiserver
controller-manage
scheduler
etcd
containerd
keepalived+nginx
calico
kubelet
kube-proxy
CPU: 4vVPU
硬盘:100GB
内存:4GB
开启虚拟化
控制节点192.168.0.12k8s-master-02apiserver
controller-manage
scheduler
etcd
containerd
keepalived+nginx
calico
kubelet
kube-proxy
CPU: 4vVPU
硬盘:100GB
内存:4GB
开启虚拟化
控制节点192.168.0.13k8s-master-03apiserver
controller-manage
scheduler
etcd
containerd
calico
kubelet
kube-proxy
CPU: 4vVPU
硬盘:100GB
内存:4GB
开启虚拟化
工作节点192.168.0.21k8s-node-01kubelet
kube-proxy
containerd
calico
coredns
CPU: 6vVPU
硬盘:100GB
内存:6GB
开启虚拟化
工作节点192.168.0.22k8s-node-02kubelet
kube-proxy
containerd
calico
coredns
CPU: 6vVPU
硬盘:100GB
内存:6GB
开启虚拟化

2、安装k8s前的准备工作

0.给机器固定一个ip地址

vi /etc/sysconfig/network-scripts/ifcfg-ens33

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
IPV6_AUTOCONF=no
IPV6_DEFROUTE=no
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=9a45b75e-bb43-413e-b643-ee9c0365d04d
DEVICE=ens33
ONBOOT=yes

IPADDR=192.168.0.11
NETMASK=255.255.255.0
GATEWAY=192.168.0.1  \\这里的网关、子网掩码、dns要跟宿主机的一样
DNS1=192.168.1.1
DNS2=192.168.0.1
DNS3=8.8.8.8

1.配置机器主机名

// 分别在对应的机器上执行对应的指令更改机器主机名
hostnamectl set-hostname k8s-master-01 && bash
hostnamectl set-hostname k8s-master-02 && bash
hostnamectl set-hostname k8s-master-03 && bash
hostnamectl set-hostname k8s-node-01 && bash
hostnamectl set-hostname k8s-node-02 && bash

2.配置hosts解析

vi /etc/hosts
 192.168.0.11 k8s-master-01
 192.168.0.12 k8s-master-02
 192.168.0.13 k8s-master-03
 192.168.128.21 k8s-node-01
 192.168.128.22 k8s-node-02
 // 这里要重启一下

3.配置主机之间无密码登录

[root@k8s-master01~]#ssh-keygen
[root@k8s-master01~]#ssh-copy-id k8s-master-01
[root@k8s-master01~]#ssh-copy-id k8s-master-02
[root@k8s-master01~]#ssh-copy-id k8s-master-03
[root@k8s-master01~]#ssh-copy-id k8s-node-01
[root@k8s-master01~]#ssh-copy-id k8s-node-02

4.关闭交换分区swap、提升性能

1.临时关闭Swap(立即生效)​
sudo swapoff -a  # 关闭所有活跃的Swap分区或文件
2.​永久禁用Swap挂载
sudo sed -i '/swap/s/^/#/' /etc/fstab  # 一键注释所有包含"swap"的行
​手动操作:若需精细控制,可用文本编辑器(如vim)打开文件,找到类似 /dev/mapper/cl-swap swap swap defaults 0 0 的行,行首添加#注释。
3.​重启系统生效
sudo reboot  # 重启后Swap将不再自动启用
4.验证
free -m | grep Swap  # 输出应为 "Swap: 0 0 0"
swapon --show        # 无输出表示无活跃Swap

为什么要关闭swap交换分区

swap是交换分区,如果机器内存不够,会使用swap分区,但是swap分区 的性能较低,k8s设计的时候为了能提升性能,默认是不允许使用swap分区的。 kubeadm初始化的时候会检测swap是否关闭,如果没关闭,那就初始化失败。 如果不想要关闭交换分区,安装k8s的时候可以指定--ignore-preflight-errors=swap来解决。

5.修改机器内核参数

# 1. 加载内核模块(立即生效)
modprobe br_netfilter
modprobe overlay
modprobe nf_conntrack

# 2. 配置模块开机自动加载(替代写入/etc/profile的方案)
cat > /etc/modules-load.d/k8s.conf <<EOF
br_netfilter
overlay
nf_conntrack
EOF

# 3. 配置内核参数文件
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
EOF

# 4. 应用内核参数(需先加载模块,否则会报错)
sysctl --system

这三条内核参数配置必须设置、否则在初始化k8s集群的时候、会报错

6.关闭firewalld防火墙

 systemctl stop firewalld;systemctl disable firewalld

7.关闭selinux

sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

8.配置阿里云repo源

备份原有仓库文件
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

下载阿里云centos7仓库文件
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

清理缓存并重建元数据
yum clean all
yum makecache

安装必要工具(如 wget)
yum install -y wget
yum -y install lrzsz net-tools

9.配置时间同步

# 设置时区
timedatectl set-timezone Asia/Shanghai

# 安装 Chrony
yum -y install chrony

# 配置 Chrony(使用阿里云 NTP 源)
cat > /etc/chrony.conf <<EOF
server time1.aliyun.com iburst
server time2.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
EOF

# 重启服务并验证
systemctl restart chronyd
systemctl enable chronyd

# 验证配置
chronyc sources -v

//这里能看到具体的时间
systemctl status chronyd

10.开启ipvs

// 直接把下面的一大段复制到命令行运行就可以了
#!/bin/bash

# 定义IPVS模块及依赖检查项
ipvs_modules=(ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack)
check_modules=(ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack libcrc32c)

# 加载模块
for module in "${ipvs_modules[@]}"; do
    if ! lsmod | grep -q "^${module}"; then
        if modprobe -v "$module"; then
            echo "[OK] Module $module loaded"
        else
            echo "[ERROR] Failed to load $module. Check dmesg:"
            dmesg | grep -i "$module" | tail -n 3
            exit 1
        fi
    else
        echo "[INFO] $module already loaded"
    fi
done

# 持久化配置
echo "Persisting modules..."
echo -e "ip_vs\nip_vs_rr\nip_vs_wrr\nip_vs_sh\nnf_conntrack" | sudo tee /etc/modules-load.d/ipvs.conf >/dev/null

# 综合校验
echo "=== Validation Report ==="
echo "1. Loaded Modules:"
lsmod | grep -E '^ip_vs|^nf_conntrack|^libcrc32c'

echo "2. Dependency Check:"
for mod in "${check_modules[@]}"; do
    lsmod | grep -q "^$mod" && status="✔" || status="✘"
    echo "  $mod $status"
done

echo "3. Kernel Log Summary:"
dmesg | grep -i -A2 -B2 'ip_vs\|nf_conntrack'

ipvs是什么

** **ipvs(IP Virtual Server)实现了传输层负载均衡,也就是我们常说的4 层LAN交换,作为Linux内核的一部分。ipvs运行在主机上,在真实服务器集 群前充当负载均衡器。ipvs可以将基于TCP和UDP的服务请求转发到真实服务 器上,并使真实服务器的服务在单个IP地址上显示为虚拟服务。

ipvs和iptable对比

ipvs模式,在v1.9中处于beta阶段,在v1.11中已经正式可用了。iptables 模式在v1.1中就添加支持了,从v1.2版本开始iptables就是kube-proxy默认 的操作模式,ipvs和iptables都是基于netfilter的,但是ipvs采用的是hash 表,因此当service数量达到一定规模时,hash查表的速度优势就会显现出来, 从而提高service的服务性能。那么ipvs模式和iptables模式之间有哪些差异 呢?

  1. ipvs 为大型集群提供了更好的可扩展性和性能
  2. ipvs 支持比iptables更复杂的复制均衡算法(最小负载、最少连接、 加权等等)
  3. ipvs 支持服务器健康检查和连接重试等功能

11.安装基础软件包

# 安装基础工具
sudo yum install -y wget net-tools nfs-utils lrzsz vim ncurses-devel telnet unzip

# 安装开发工具链(替代手动枚举 gcc/make 等)
sudo yum groupinstall -y "Development Tools"

# 安装依赖库与安全组件
sudo yum install -y libxml2-devel openssl-devel curl-devel zlib-devel libaio-devel openssh-server socat

# 安装容器与集群工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 ipvsadm conntrack

# 启用 EPEL 仓库
sudo yum install -y epel-release

# 重建缓存(避免后续安装报错)
sudo yum clean all && sudo yum makecache

3、构建k8s多masrer多node集群

1.安装k8s 需要的软件包源


#更换repo源(这个是1.28版本的k8s、新版本可以去https://developer.aliyun.com/mirror/kubernetes网页查看)
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
setenforce 0

// 安装 k8s需要的软件包  (下面的kuberlet kubeadm kubectl都是1.28.2版本的)
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet


# 清理缓存并重建元数据(顺序不可颠倒)
yum clean all && yum makecache

# 验证仓库列表(检查是否包含 Kubernetes)
yum repolist | grep -i kubernetes

每个软件包的作用

  1. kubelet:kubelet是Kubernetes集群中的一个核心组件,是每个节点上的 代理服务,负责与主控制节点通信,管理节点上的Pod和容器。kubelet的主要职责包括: 监控pod的状态并按需启动或停止容器、检查容器是否正常运行、与主控制 节点通信,将节点状态和Pod状态上报给主控制节点、管理容器的生命周期,包 括启动、停止、重启等、拉取镜像。
  2. kubeadm kubeadm:用于初始化、升级k8s集群的命令行工具。
  3. kubectl kubectl:用于和集群通信的命令行,通过kubectl可以部署和管理应用, 查看各种资源,创建、删除和更新各种组件

2.部署containerd容器

//安装containerd
sudo yum install -y containerd


//设置容器运行时为containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
//修改containerd配置文件
vi /etc/containerd/config.toml


//下面有三个需要修改的地方、修改用蓝色、增加用紫色
 //1.配置 Sandbox 镜像为国内镜像源(Kubernetes Pod 基础容器)
  sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
 
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
// 2.下面是是新增加的docker镜像加速和k8s镜像加速
       [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  endpoint = [
    "https://docker.1ms.run",        
    "https://registry.cn-hangzhou.aliyuncs.com",  
    "https://hub-mirror.c.163.com"   
  ]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
  endpoint = [
    "registry.aliyuncs.com/google_containers",  
    "docker.nju.edu.cn/google_containers",      
    "registry.cn-hangzhou.aliyuncs.com/google_containers"  
  ] 

3.修改SystemdCgroup = true、原值为false
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
            BinaryName = ""
            CriuImagePath = ""
            CriuPath = ""
            CriuWorkPath = ""
            IoGid = 0
            IoUid = 0
            NoNewKeyring = false
            NoPivotRoot = false
            Root = ""
            ShimCgroup = ""
            SystemdCgroup = true



//应用
systemctl restart containerd && systemctl enable containerd && systemctl status containerd
  

3.keepalive+nginx实现k8s apiserver节点高可用(在三个主节点都执行)/也可以按需要只在master-01和master-02中执行

需要注意的是在keepalive的配置中、三个master节点依然需要区分为一个主节点和两个备节点、以确保vip的单一持有者、因此某些参数是不同的、比如优先级

需要注意的参数在代码块中用红色标识、新增的代码用蓝色标识

// 安装keepalive+nginx
yum install -y keepalived nginx nginx-mod-stream

//配置nginx代理
vi /etc/nginx/nginx.conf

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

stream {
    log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
    access_log /var/log/nginx/k8s-access.log main;

    upstream k8s-apiserver {
        server 192.168.0.11:6443 max_fails=3 fail_timeout=30s;
        server 192.168.0.12:6443 max_fails=3 fail_timeout=30s;
        server 192.168.0.13:6443 max_fails=3 fail_timeout=30s;
    }

    server {
        listen 16443;
        proxy_pass k8s-apiserver;
        proxy_timeout 60s;
        proxy_connect_timeout 2s;
    }
}


//keepalive配置
vi /etc/keepalived/keepalived.conf

global_defs {
    router_id NGINX_MASTER_01  # 主备节点名称不能一样
    vrrp_skip_check_adv_addr
    script_user nobody
    enable_script_security
}

vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -20
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    state MASTER            # 备节点改为 BACKUP
    interface ens33
    virtual_router_id 79    # 确保同一集群内的值是相同的、不同集群的值是不同的
    priority 100            # 备节点设为 90
    advert_int 1
    #nopreempt               # 备节点注释掉这个

    authentication {
        auth_type PASS
        auth_pass 9T$9q#L9v!9m
    }

    virtual_ipaddress {
        192.168.0.100/24 dev ens33
    }

    track_script {
        check_nginx
    }
}


//keepalived故障检测脚本

yum install -y nc      # CentOS/RHEL 脚本里面使用了nc所以要安装一下
# 创建日志文件并设置权限
sudo touch /var/log/keepalived_nginx_check.log
sudo chown nobody:nobody /var/log/keepalived_nginx_check.log
sudo chmod 644 /var/log/keepalived_nginx_check.log

vi /etc/keepalived/check_nginx.sh

#!/bin/bash
LOG_FILE="/var/log/keepalived_nginx_check.log"

# 检查Nginx进程和端口
count=$(ps -C nginx --no-header | wc -l)
if [ $count -eq 0 ] || ! nc -z localhost 6443; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Nginx异常,尝试重启..." >> $LOG_FILE
    systemctl restart nginx
    sleep 2

    # 二次检查
    counter=$(ps -C nginx --no-header | wc -l)
    if [ $counter -eq 0 ] || ! nc -z localhost 6443; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 重启失败,停止Keepalived..." >> $LOG_FILE
        systemctl stop keepalived
        exit 1
    fi
fi
exit 0


//权限设置
chmod +x /etc/keepalived/check_nginx.sh

//启动服务并设置开机自启
systemctl restart nginx && systemctl enable nginx && systemctl status nginx
systemctl restart keepalived && systemctl enable keepalived && systemctl status keepalived

//查看ip是否生成
ip a

4.生成并修改初始化集群文件、初始化集群(从这里开始只是在master-01执行

这里需要注意certSANs用于指定允许访问 API Server 的 IP 地址和域名列表。证书中必须包含所有可能的访问入口,否则客户端会因证书校验失败无法连接

一般是4种ip:所有 Master 节点的 IP、VIP(虚拟 IP)、Service 网段首个 IP、DNS 名称可选

kubeadm config print init-defaults > init.default.yaml  //生成初始化文件

 vi init.default.yaml  //修改这个文件


// 需要修改的地方用蓝色、增加的地方用紫色

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.0.11  //主节点、IP需与物理IP一致
  bindPort: 6443        //kube-apiserver监听的地址
nodeRegistration:
  criSocket: unix:///run/containerd/containerd.sock  //路径需与容器运行时(containerd)的 socket 文件一致
  imagePullPolicy: IfNotPresent
  name: k8s-master-01   //主节点名称、需唯一,
  taints: null
---
apiServer:                
  certSANs:              //证书受信任的ip地址、可以多谢几个、方便后期扩展node节点
   //虚拟ip(vip)
  -192.168.0.100
  
  //master节点ip
  -192.168.0.11
  -192.168.0.12
  -192.168.0.13
  //服务网段首个ip
  -10.10.0.1        // 这里要确认一下服务网段的首个IP、Kubernetes 内部服务依赖此ip、缺失可能导致内部服务访问失败
  //可选 DNS 名称、
  - kubernetes
  - kubernetes.default
  - kubernetes.default.svc
  - kubernetes.default.svc.cluster.local
  - localhost
  - 127.0.0.1 
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki  //证书生成的位置
clusterName: kubernetes  //集群名称
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd   // etcd的集群目录
imageRepository: registry.aliyuncs.com/google_containers  //阿里云镜像加速避免拉取失败
kind: ClusterConfiguration
kubernetesVersion: 1.28.2       //需与 kubeadm、kubelet版本匹配
controlPlanEndpoint: 192.168.0.100:6443  //nginx负载均衡到kube-apiserver的入口地
networking:i
  dnsDomain: cluster.local
  serviceSubnet: 10.10.0.0/16    //需与网络插件(如 Calico/Flannel)配置一致
  podSubnet: 10.244.0.0/16      
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs                              //使用IPVS负载均衡模式(需提前加载ip_vs模块
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd                //  # 必须与容器运行时配置的 cgroup 驱动(systemd)一致



//预拉取镜像
kubeadm config images pull --config init.default.yaml

// 初始化集群、镜像不存在会拉取
kubeadm init --config=init.default.yaml

说明安装完成、需要把这三行语句执行一下、 配置kubectl的配置文件config,相当于对kubectl进行授权,这样kubectl 命令可以使用这个证书对k8s集群进行管理

kubeadm inir初始化流程分析

kubeadm在执行安装之前进行了相当细致的环境检测,下面看一看:
(1)检查执行init命令的用户是否为root,如果不是root,直接快速失败(failfast)。
(2)检查待安装的k8s版本是否被当前版本的kubeadm支持(kubeadm版本>=待安装
k8s版本)。
(3)检查防火墙,如果防火墙未关闭,提示开放端口10250。
(4)检查端口是否已被占用,6443(或你指定的监听端口)、10257、10259。
(5)检查文件是否已经存在,/etc/kubernetes/manifests/*.yaml。
(6)检查是否存在代理,连接本机网络、服务网络、Pod网络,都会检查,目前不允
许代理。
(7)检查容器运行时,使用CRI还是Docker,如果是Docker,进一步检查Docker服
务是否已启动,是否设置了开机自启动。
(8)对于Linux系统,会额外检查以下内容:
(8.1)检查以下命令是否存在:crictl、ip、iptables、mount、nsenter、ebtables、
ethtool、socat、tc、touch。
(8.2)检查/proc/sys/net/bridge/bridge-nf-call-iptables、
/proc/sys/net/ipv4/ip-forward内容是否为1。
(8.3)检查swap是否是关闭状态。
(9)检查内核是否被支持,Docker版本及后端存储GraphDriver是否被支持。对于
Linux系统,还需检查OS版本和cgroup支持程度(支持哪些资源的隔离)。
(10)检查主机名访问可达性。
(11)检查kubelet版本,要高于kubeadm需要的最低版本,同时不高于待安装的k8s
版本。
(12)检查kubelet服务是否开机自启动。
(13)检查10250端口是否被占用。
(14)如果开启IPVS功能,检查系统内核是否加载了ipvs模块。
(15)对于etcd,如果使用Localetcd,则检查2379端口是否被占用,/var/lib/etcd/
是否为空目录。如果使用Externaletcd,则检查证书文件是否存在(CA、key、cert),验
证etcd服务版本是否符合要求。
(16)如果使用IPv6,检查/proc/sys/net/bridge/bridge-nf-call-iptables、
/proc/sys/net/ipv6/conf/default/forwarding内容是否为1。
以上就是kubeadminit需要检查的所有项目了!

5.安装网络工具nerdctl-2.0.3-linux-amd64.tar.gz、节点加入集群并设置角色


1.先rz上传文件、安装nerdctl
tar xf nerdctl-2.0.2-linux-amd64.tar.gz  //解压
mv nerdctl /usr/local/bin/

// 2.生成加入集群的token
kubeadm token create --print-join-command  

//3拿得到的命令在node节点运行、就能加入集群了下面这句是例子、不要执行
kubeadm join 192.168.0.11:6443 --token ylqufq.192cv46r6g25b8c1 --discovery-token-ca-cert-hash sha256:2d22fa14e53e660c212e08df2e6ee2c7b15d069104081c52f76a1727f8b7b8e6

kubectl get nodes   //1.查看集群节点

//4.设置role:、下面也是例子、不要执行、
kubectl label node [NAME] node-role.kubernetes.io/[ROLES]=
取消role:
kubectl label node [NAME] node-role.kubernetes.io/[ROLES]-
查询role:
kubectl get nodes

例子
kubectl label node k8s-node01 node-role.kubernetes.io/worker=worker

kubectl label node k8s-node01 node-role.kubernetes.io/worker-

6.安装helm

下载helm并上传到master节点、解压、安装

安装 Helm 
tar -zxvf helm-v3.16.4-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/
[root@k8s-master01 ~]# # 检查版本号
[root@k8s-master01 ~]# helm version
version.BuildInfo{Version:"v3.16.4", GitCommit:"7877b45b63f95635153b29a42c0c2f4273ec45ca", GitTreeState:"clean", GoVersion:"go1.22.7"}

7.安装calico

查看calico组件对kubernetes集群版本的要求、(查看一下对应关系)、下载tgz格式的文件

# 下载 calico

#这里改成 Cross-Subnet IPIP 模式
wget  https://docs.projectcalico.org/manifests/calico.yaml
sed -i s/Always/CrossSubnet/g calico.yaml
kubectl  apply -f calico.yaml

# 验证安装状态
kubectl get pods -A  # 检查 POD状态(等待 30 秒)
kubectl get pods -n calico-system    # 检查 Calico 核心组件(等待 2 分钟)
kubectl get nodes -o wide            # 确认所有节点状态为 Ready

测试在k8s安装pod是否可以正常访问网络

# 1. 启动临时调试容器(参数标准化)
kubectl run busybox --image=busybox:latest --restart=Never --rm -it -- /bin/sh

# 2. 容器内执行网络测试(双维度验证)
ping www.baidu.com -c 4            # 测试公网连通性[1,2](@ref)
nslookup kubernetes.default.svc.cluster.local  # 测试集群内 DNS 解析[1](@ref)

# 3. 退出后自动清理容器
exit

8.测试k8s集群中部署tomcat服务

在master01节点执行

//编辑一个tomcat的yaml文件
vi tomcat.yaml


apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
  namespace: default
  labels:
    app: myapp
    env: dev
spec:
  containers:
    - name: tomcat-pod-java
      image: tomcat:8.5-jre8-alpine  # 关键修复:image 应与 ports 同级
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 8080        # 缩进对齐
---
apiVersion: v1
kind: Service
metadata:
  name: tomcat
spec:
  type: NodePort
  ports:
    - port: 8080                     # 添加空格,且缩进对齐
      targetPort: 8080               # 必须补充的目标端口(指向容器端口)
      nodePort: 30080                # 缩进对齐
  selector:
    app: myapp                       # 修复:冒号后必须加空格
    env: dev

//然后执行下面命令创建pod
kubectl apply -f tomcat.yaml

//查看pod状态
kubetcl get pods

在浏览器访问任意节点的ip+30080端口即可请求到服务。

测试coredns是否正常

kubectl run dns-test --rm -it --restart=Never --image=azukiapp/dig -- /bin/sh -c "nslookup kubernetes.default.svc.cluster.local && nslookup www.baidu.com"

10.10.0.10就是我们coreDNS的clusterIP、说明coreDNS配置好了