为什么需要 Kubernetes 容器编排
传统部署的核心问题
① 环境不一致:多环境差异大,上线易出错,排查成本高
② 扩展性差:手动扩容,应对突发流量慢、成本高
③ 资源利用率低:应用独占硬件,服务器闲置严重
④ 部署升级复杂:人工操作,易出错、耗时久
⑤ 运维成本高:手动管理,运维压力大,难保证高可用
**总结:**传统部署核心问题集中在环境、扩展、资源、部署、运维上,无法满足现代业务高可用、弹性、快速迭代需求。

Kubernetes 编排的核心优势
① 自动化部署:自动调度容器,支持滚动升级、回滚,减少人工
② 弹性伸缩:按CPU/请求量等自动扩缩容,解决扩展难题
③ 高可用:自动检测故障,容器重启+多副本,保障服务不中断
④ 资源优化:集群统一调度,容器共享资源,提高服务器利用率
⑤ 多环境一致:容器镜像保证开发、测试、生产环境统一
小结
老式部署全是人工短板,k8s就是自动化管家,专门解决传统部署的核心痛点 ,这是咱们学习k8s的原因
Kubernetes 概述
什么是 Kubernetes*
Kubernetes**(简称 K8s)是一个开源的容器编排**平台,用于自动化部署、扩展和管理容器化应用。
它最初由 Google 开发,并由 Cloud Native Computing Foundation(CNCF)维护。
Kubernetes 为什么简称 K8s ?
K**(uber nete)**s,中文意思是 舵手。舵手不直接生产集装箱(容器),只负责指挥、调度、管理集群,是 “容器集群的掌舵者”。

核心功能*
- 容器调度:自动将容器部署到最合适的节点上
- 自动伸缩:根据负载自动扩容或缩容容器实例
- 服务发现与****负载均衡:内置服务发现机制和请求分发
- 自愈能力:检测失败容器,自动重启或替换
- 滚动更新与回滚:支持平滑升级和快速回滚
- 配置与****密钥管理:通过 ConfigMap 和 Secret 管理应用配置
- 存储管理:支持持久化存储(PV/PVC),挂载到 Pod,容器重启或迁移时数据保持不丢失,支持多种存储后端(本地、网络、云存储)
Kubernetes 架构图

Kubernetes 核心组件
控制平面组件(Control Plane)*
控制整个集群的大脑,负责调度、管理和协调。
API Server
- 集群的入口,所有操作(kubectl、Dashboard、程序调用)都要通过它
- 提供 REST API,负责认证、鉴权和数据校验
etcd
- 分布式键值存储,用来保存集群所有配置和状态数据
- 相当于 K8s 的“数据库”
Controller Manager
- 运行各种控制器,确保集群状态与期望状态一致
Scheduler
- 调度器,负责把 Pod 分配到合适的 Node
- 考虑资源使用率、亲和性/反亲和性、污点容忍等规则
工作节点组件(Node Components)
运行实际应用容器的地方。
kubelet
- 每个 Node 上的代理,负责与 API Server 通信
- 接收调度下来的 Pod 任务,并保证容器按要求运行
kube-proxy
- 负责 Node 上的网络代理
- 实现 Service 的负载均衡和网络转发
容器运行时(Container Runtime)
- 实际运行容器的软件,比如 Docker、containerd、CRI-O
- K8s 通过 CRI(Container Runtime Interface)与它交互
附加组件(Add-ons)
增强集群功能,通常在生产环境必备。
- DNS**(CoreDNS)**:为 Pod 和 Service 提供域名解析
- Dashboard:K8s 集群的可视化 Web 界面
- Metrics Server:资源指标采集,用于自动伸缩(HPA)
- Ingress Controller:提供 HTTP/HTTPS 访问入口
- CNI (容器网络接口) 插件: 必需组件,用于为 Pod 分配 IP 地址并实现集群网络通信。
Calico(卡里口): 提供网络和网络策略(Network Policy),性能强大,支持 BGP。
Flannel(弗莱农): 简单易用的 overlay 网络,提供最基本的网络功能。
Cilium(西里厄姆): 基于 eBPF,提供高性能网络、可观测性和安全策略。
Weave Net: 提供简单的网络模型和自动发现功能
案例说明-容器创建过程
以部署一个 Nginx 服务来说明 kubernetes 系统各个组件调用关系:
- kubernetes集群启动之后,master和node都会将自身的信息存储到etcd数据库中;
- 一个Nginx服务的【安装】请求,会首先被发送到master节点的apiServer组件;
- apiServer组件会调用scheduler组件来决定到底将服务安装到哪个node节点上;
- apiServer调用controller-manager去调度Node节点安装nginx服务 对比pod实际状态与期望状态是否一致
- kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的 Pod

至此,一个nginx服务就运行了。
如果需要外部来访问Nginx,就需要通过kube-proxy来对pod产生访问的代理。这样,外界用户就可以访问集群中的nginx服务了
Pod 是kubernetes的最小操作单元,容器必须跑在 Pod 中

Kubernetes 集群安装部署 (单主集群)
单主集群,也就是控制面板为一台 MASTER 的 K8s 集群(测试环境)
硬件规划
每台机器最少 2U2G,50G(虚拟机用多少会开辟多少)。
| IP地址 | 角色 | 用途 |
|---|---|---|
| 192.168.88.170 | master01 | 控制平面 |
| 192.168.88.171 | worker01 | 工作节点 |
| 192.168.88.172 | worker02 | 工作节点 |
环境准备
主机准备
先打一个快照,然后再后续操作。
#所有节点都要设置主机名
hostnamectl set-hostname master01.itcast.cn
su
# 打开主机名文件,把master01、worker01、work02添加上
vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.88.170 master01.itcast.cn master01
192.168.88.171 worker01.itcast.cn worker01
192.168.88.172 worker02.itcast.cn worker02
# 临时关闭
setenforce 0
getenforce
# 永久关闭 SELinux,需要编辑配置文件
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
# 停止 firewalld 服务,禁止 firewalld 服务开机自启
systemctl stop firewalld
systemctl disable firewalld
# 安装 iptables 和 iptables-services,清空 iptables 规则并保存
dnf install iptables iptables-services -y
iptables -F
iptables -X
iptables -Z
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# 保存规则
iptables-save
# 所有节点时间同步
dnf -y install chrony
systemctl enable chronyd --now
# 加载 br_netfilter 和 overlay 内核模块
modprobe br_netfilter
modprobe overlay
cat <<EOF | tee /etc/sysctl.d/k8s.conf > /dev/null
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
echo "br_netfilter" | tee /etc/modules-load.d/k8s.conf
# 生效命令
sysctl --system
# 临时关闭交换区
swapoff -a
#永久关闭交换区
sed -i 's/.*swap.*/#&/g' /etc/fstab
reboot
如果 dnf 安装比较慢,把 CentOS Stream 的镜像换一下
# 更换 yum 源
cat >/etc/yum.repos.d/aliyun.repo<<EOF
[baseos]
name=CentOS Stream \$releasever - BaseOS
baseurl=https://mirrors.aliyun.com/centos-stream/\$stream/BaseOS/\$basearch/os/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
countme=1
enabled=1
[baseos-debug]
name=CentOS Stream \$releasever - BaseOS - Debug
baseurl=https://mirrors.aliyun.com/centos-stream/\$stream/BaseOS/\$basearch/debug/tree/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
enabled=0
[baseos-source]
name=CentOS Stream \$releasever - BaseOS - Source
baseurl=https://mirrors.aliyun.com/centos-stream/\$stream/BaseOS/source/tree/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
enabled=0
[appstream]
name=CentOS Stream \$releasever - AppStream
baseurl=https://mirrors.aliyun.com/centos-stream/\$stream/AppStream/\$basearch/os/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
countme=1
enabled=1
[appstream-debug]
name=CentOS Stream \$releasever - AppStream - Debug
baseurl=https://mirrors.aliyun.com/centos-stream/\$stream/AppStream/\$basearch/debug/tree/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
enabled=0
[appstream-source]
name=CentOS Stream \$releasever - AppStream - Source
baseurl=https://mirrors.aliyun.com/centos-stream/\$stream/AppStream/\$basearch/debug/tree/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgcheck=1
repo_gpgcheck=0
metadata_expire=6h
enabled=0
EOF
更新 Yum 源
# 安装 wget vim net-tools telnet epel-release
dnf install -y wget vim net-tools telnet epel-release tree
# 添加 阿里云 Containerd 源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 添加 k8s 源
cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes-tencent]
name=Kubernetes Tencent Mirror
baseurl=https://mirrors.cloud.tencent.com/kubernetes_new/core:/stable:/v1.34/rpm/
enabled=1
gpgcheck=0
[kubernetes-aliyun]
name=Kubernetes Aliyun Mirror
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/rpm/
enabled=1
gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/rpm/repodata/repomd.xml.key
EOF
安装 K8s
安装 Containerd
在所有机器上,执行
网络比较差的时候,可以考虑在一台先执行完,再克隆出来两台。
#安装底层容器运行时和k8s命令行核心组件
dnf install -y containerd.io
#生成containerd配置文件
containerd config default > /etc/containerd/config.toml
# 1 修改 SystemdCgroup 参数为 true,表示 containerd 使用 systemd 作为 cgroup 驱动程序。
sed -ri 's#SystemdCgroup = false#SystemdCgroup = true#' /etc/containerd/config.toml
# 2 修改sandbox沙箱镜像,registry.k8s.io 在某些网络环境下可能访问不稳定或受到限制,
# 而阿里云的镜像仓库 registry.aliyuncs.com 在国内网络环境下通常具有更好的访问速度和稳定性。
sed -ri 's#registry.k8s.io/pause:3.10.1#registry.aliyuncs.com/google_containers/pause:3.10#' /etc/containerd/config.toml
# 新增镜像源
sed -i "s/config_path = ''/config_path = '\/etc\/containerd\/certs.d\/'/g" /etc/containerd/config.toml
mkdir -p /etc/containerd/certs.d/docker.io
cat > /etc/containerd/certs.d/docker.io/hosts.toml << 'EOF'
server = "https://docker.io" # 源镜像地址
[host."https://docker.m.daocloud.io"] # 道客-镜像加速地址
capabilities = ["pull","resolve"]
[host."https://dockerproxy.com"] # 镜像加速地址
capabilities = ["pull", "resolve"]
[host."https://docker.mirrors.sjtug.sjtu.edu.cn"] # 上海交大-镜像加速地址
capabilities = ["pull","resolve"]
[host."https://docker.mirrors.ustc.edu.cn"] # 中科大-镜像加速地址
capabilities = ["pull","resolve"]
[host."https://docker.nju.edu.cn"] # 南京大学-镜像加速地址
capabilities = ["pull","resolve"]
[host."https://registry.docker-cn.com"]
capabilities = ["pull","resolve","push"]
[host."https://cf-workers-docker-io-38g.pages.dev"]
capabilities = ["pull","resolve","push"]
EOF
# 启动底层容器运行时并开机自启动
systemctl enable containerd
systemctl start containerd
# 查看运行状态
systemctl status containerd
安装 kubeadm kubectl kubelet
在所有机器上,执行
dnf install -y kubelet kubeadm kubectl
重点:打快照
打完快照,启动机器,执行开机自启的命令
#配置kubelet随机启动但是不进行手动启动,通过kubeadm进行初始化和启动
systemctl enable kubelet --now
systemctl stop kubelet
初始化 Master 节点
在 Master 机器上,执行
#集群master01主节点初始化
kubeadm init --apiserver-advertise-address=192.168.88.101 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint=master01.itcast.cn --v=5
kubeadm reset -f #重置初始化 如果报错的
说明
--apiserver-advertise-address=192.168.88.170 # 这里的地址,改成自己master节点的IP地址
--image-repository registry.aliyuncs.com/google_containers #使用阿里云镜像站
--pod-network-cidr=10.244.0.0/16 # 这里就这么写,是对应上后面flannel网络插件的默认值
--control-plane-endpoint=master01.itcast.cn # 当部署高可用(多台)控制平面时,其他节点或 kubeadm join 会访问这个 endpoint。单 master 情况可以是主机名或 IP。

# 1 按照初始化结束提示进行kubectl命令行配置
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 2 重点注意: 请将最后这个命令保存下来,后面node节点加入集群需要使用。每个人的token不一样,不要复制笔记的。
kubeadm join lb.heimak8s.com:6443 --token a7t18p.s20fr0u05nfed8ff \
--discovery-token-ca-cert-hash sha256:477505d01c6c26903951cc25e448dbac584d0983e5ae5bf0b801b42b6ccf887c
注意:拷贝kubeadm join ...的时候注意空格和连接点
error: accepts at most 1 arg(s), received 2
To see the stack trace of this error execute with --v=5 or higher
验证主节点
#验证master节点安装结果
kubectl get node
安装网络插件
方案一:安装 Calico
#拉取网络插件calico配置文件或者从资料文件夹里面上传calico.yaml
wget https://docs.projectcalico.org/v3.25/manifests/calico.yaml --no-check-certificate
#修改镜像地址,如下三行,改成对应的镜像仓库地址
sed -i 's#docker.io/calico/cni:v3.25.0#swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/cni:v3.25.0#g' calico.yaml
sed -i 's#docker.io/calico/node:v3.25.0#swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/node:v3.25.0#g' calico.yaml
sed -i 's#docker.io/calico/kube-controllers:v3.25.0#swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/kube-controllers:v3.25.0#g' calico.yaml
grep -rn '3.25.0' calico.yaml

#部署 网络插件
kubectl apply -f calico.yaml
# 验证安装结果(当前阶段,直接复制这个命令即可)
[root@node1 ~]# kubectl get pod -n kube-system | grep calico
calico-kube-controllers-5b9b456c66-g6rpv 1/1 Running 0 96m
calico-node-lzkpp 1/1 Running 0 96m
calico-node-pzxfd 1/1 Running 0 96m
calico-node-v2d79 1/1 Running 0 96m

如果等了10分钟还是没有成功,甚至报错了,怎么办?可以删除资源,重新拉取。
[root@master01 ~]# kubectl delete -f calico.yaml
[root@master01 ~]# kubectl apply -f calico.yaml
方案二:安装 Cilium(生产推荐)
cilium(西利厄姆),中文是睫毛,纤毛的意思。
生物学中,cilium指细胞表面纤细、可摆动的毛发状结构,负责感知周围网络环境。
需要先把Calico先卸载,网络插件只能选一种部署
参考:https://www.cnblogs.com/yinzhengjie/p/18760212#4ebpf%E5%92%8Cxdp
在 Master 机器上,执行
[root@master01 ~]# kubectl delete -f calico.yaml

通过window下载最新版并上传到服务器
https://github.com/cilium/cilium-cli/releases/tag/v0.18.8

安装
#解压
[root@master01 ~]# tar xzvf cilium-linux-amd64.tar.gz -C /usr/local/bin/
[root@master01 ~]# cilium version
#安装
[root@master01 ~]# cilium install \
--set kubeProxyReplacement=true \
--set ipam.mode=kubernetes \
--set routingMode=native \
--set autoDirectNodeRoutes=true \
--set ipam.operator.clusterPoolIPv4PodCIDRList=10.100.0.0/16 \
--set ipam.operator.clusterPoolIPv4MaskSize=24 \
--set ipv4NativeRoutingCIDR=10.100.0.0/16 \
--set bpf.masquerade=true
# 验证安装
[root@master01 yum.repos.d]# kubectl get pods -A | grep cilium
cilium-4rm2l 1/1 Running 0 2m59s
cilium-envoy-fh97p 1/1 Running 0 2m59s
cilium-envoy-nc22g 1/1 Running 0 2m59s
cilium-envoy-pxnbc 1/1 Running 0 2m59s
cilium-operator-679dff6dc4-t6btn 1/1 Running 0 2m59s
cilium-qvtch 1/1 Running 0 2m59s
cilium-vxdtq 1/1 Running 0 2m59s
# 查看状态(目前了解就行)
[root@master01 yum.repos.d]# kubectl describe pod -n kube-system cilium-4bdms
#或者
[root@master01 ~]# cilium status
/¯¯\
/¯¯\__/¯¯\ Cilium: OK
\__/¯¯\__/ Operator: OK
/¯¯\__/¯¯\ Envoy DaemonSet: OK
\__/¯¯\__/ Hubble Relay: disabled
\__/ ClusterMesh: disabled
DaemonSet cilium Desired: 3, Ready: 3/3, Available: 3/3
DaemonSet cilium-envoy Desired: 3, Ready: 3/3, Available: 3/3
Deployment cilium-operator Desired: 1, Ready: 1/1, Available: 1/1
Containers: cilium Running: 3
cilium-envoy Running: 3
cilium-operator Running: 1
clustermesh-apiserver
hubble-relay
Cluster Pods: 2/2 managed by Cilium
Helm chart version: 1.18.2
Image versions cilium quay.io/cilium/cilium:v1.18.2@sha256:858f807ea4e20e85e3ea3240a762e1f4b29f1cb5bbd0463b8aa77e7b097c0667: 3
cilium-envoy quay.io/cilium/cilium-envoy:v1.34.7-1757592137-1a52bb680a956879722f48c591a2ca90f7791324@sha256:7932d656b63f6f866b6732099d33355184322123cfe1182e6f05175a3bc2e0e0: 3
cilium-operator quay.io/cilium/operator-generic:v1.18.2@sha256:cb4e4ffc5789fd5ff6a534e3b1460623df61cba00f5ea1c7b40153b5efb81805: 1


启用Cilium界面
#启用 UI
[root@master01 containerd]# cilium hubble enable --ui
#直接修改 Service 为 NodePort
[root@master01 containerd]# kubectl patch svc hubble-ui -n kube-system -p '{"spec": {"type": "NodePort"}}'
#查看暴漏端口
[root@master01 containerd]# kubectl get svc -n kube-system hubble-ui
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hubble-ui NodePort 10.109.18.67 <none> 80:32699/TCP 15s
Hubble 哈勃
美国著名天文学家,发现了宇宙膨胀。
Cilium 里的网络观测工具也叫 Hubble(哈勃),是为了纪念他。

通过浏览器访问


卸载
# 在主节点上,卸载
[root@master01 ~]# cilium uninstall
# 在所有节点上,卸载残存
[root@所有节点 ~]# rm -rf /etc/cni/net.d/*
[root@所有节点 ~]# rm -rf /var/lib/calico/
[root@所有节点 ~]# rm -rf /var/lib/cilium/
[root@所有节点 ~]# rm -rf /var/run/cilium
[root@所有节点 ~]# rm -rf /opt/cni/bin/cilium*
加入 Worker 节点
加入worker节点,根据在master节点初始化结束提示进行命令复制,在worker01和work02执行
#加入集群命令
kubeadm join lb.heimak8s.com:6443 --token a7t18p.s20fr0u05nfed8ff \
--discovery-token-ca-cert-hash sha256:477505d01c6c26903951cc25e448dbac584d0983e5ae5bf0b801b42b6ccf887c
验证集群
# 在master节点上,执行操作,验证节点状态
kubectl get node
kubectl get pod -A # -A 表示 all,全部的

初始化的常见问题
1 查看节点,提示8080连接被拒绝,报错


2 再次初始化,提示端口占用

#如果初始化 init 不成功,解决方法:
kubeadm reset -f
再初始化
3 忘记复制 token
token有时效性(大家可以查一下是24h还是多久),超期后,需要手动重新生成一个。
#如果你忘了复制,也没关系,在master节点执行以下命令,重新生成一个
kubeadm token create --print-join-command
4 找不到 Containerd 的 sock

查看服务是否启动
dnf list installed | grep containerd
systemctl status containerd
systemctl enable containerd
systemctl start containerd
5 防火墙产生告警

关闭防火墙
systemctl disable firewalld.service
systemctl stop firewalld.service

6 swap 告警

解决办法:
# 临时关闭交换区
swapoff -a
#永久关闭交换区,注释掉
sed -i 's/.*swap.*/#&/g' /etc/fstab
7 域名告警

echo '192.168.88.170 master01.itcast.cn master01' >> /etc/hosts
8 kubelet 开机自启的告警

解决办法:
[root@master01 ~]# systemctl status kubelet
[root@master01 ~]# systemctl enable kubelet.service

9 ipv4 转发未开启的报错

解决办法:
# 加载 br_netfilter 和 overlay 内核模块
modprobe br_netfilter
modprobe overlay
cat <<EOF | tee /etc/sysctl.d/k8s.conf > /dev/null
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
echo "br_netfilter" | tee /etc/modules-load.d/k8s.conf
# 生效命令
sysctl --system
10 kubelet等服务不健康

修改沙箱镜像
#生成containerd配置文件
containerd config default > /etc/containerd/config.toml
# 1 修改sandbox沙箱镜像,registry.k8s.io 在某些网络环境下可能访问不稳定或受到限制,
# 而阿里云的镜像仓库 registry.aliyuncs.com 在国内网络环境下通常具有更好的访问速度和稳定性。
sed -ri 's#registry.k8s.io/pause:3.10.1#registry.aliyuncs.com/google_containers/pause:3.10#' /etc/containerd/config.toml
systemctl restart containerd
部署 Nginx 应用
在 Master01 上执行即可
定义配置
# 定义nginx-deployment.yaml和nginx-service.yaml文件
[root@master01 ~]# cat > nginx-deployment.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
spec:
replicas: 2 # 副本数量
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/nginx:1.24.0-alpine
ports:
- containerPort: 80
EOF
[root@master01 ~]# cat > nginx-service.yaml << 'EOF'
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport
namespace: default
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80 # Pod 内部端口
targetPort: 80 # 映射到容器的端口
nodePort: 30080 # 暴露给节点的端口(30000-32767 之间)
EOF
#部署Nginx应用
[root@master01 ~]# kubectl apply -f nginx-deployment.yaml -f nginx-service.yaml
#查看部署结果
[root@master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-576c6b7b6-gxmzr 1/1 Running 0 18m
nginx-deployment-576c6b7b6-pbhbw 1/1 Running 0 18m
redis-9495fd5f8-mltd2 1/1 Running 0 8h
验证测试
通过浏览器,访问集群的任一IP地址,带上暴漏的30080端口,http://ip:30080,看到页面,说明集群部署成功

课上思考题:
为什么访问任一集群节点的 30080 端口,都可以成功?
内在的机制是怎样的?
集群容器管理工具
集群管理工具kubectl
kubectl 是 Kubernetes 的命令行客户端工具,核心作用是与 kube-apiserver 进行通信,向 Kubernetes 集群发送各类操作命令。
类比
Linux 系统中,通过 bash 工具管理操作系统;
Kubernetes 集群中,通过 kubectl 工具管理整个集群。
基本作用
kubectl 是 Kubernetes 的 命令行客户端工具。
它的作用是与 kube-apiserver 通信,向集群发送命令。
通过它你可以 部署应用、查看资源、排查问题、管理集群。
工作原理
kubectl读取配置文件(通常是~/.kube/config),里面保存了 API Server 的地址、用户凭证、集群信息等。- 它把用户的命令转成 RESTful API 请求,发送到 API Server。
- API Server 验证请求并执行操作,比如创建 Pod、查询 Service、更新 Deployment 等。
- API Server 返回结果,kubectl 将结果展示给用户。
常用命令
kubectl 常用命令速查表
分类命令作用集群信息kubectl version查看 kubectl 和集群 API 版本kubectl cluster-info查看集群信息(API Server、DNS 等)kubectl get nodes查看所有节点状态kubectl describe node 查看节点详细信息资源查看kubectl get pods查看 Pod 列表kubectl get pods -o wide查看 Pod 列表 + IP/节点等信息kubectl get svc查看 Service 列表kubectl get deployments查看 Deployment 列表kubectl describe pod 查看 Pod 详情(事件、调度情况等)kubectl get all查看命名空间内所有资源应用部署与管理kubectl apply -f app.yaml按配置文件创建或更新资源kubectl create deployment nginx --image=nginx创建 Deploymentkubectl delete pod 删除 Podkubectl delete -f app.yaml删除配置文件定义的资源kubectl scale deployment nginx --replicas=3扩缩容kubectl rollout status deployment/nginx查看滚动更新状态kubectl rollout undo deployment/nginx回滚到上一个版本日志与调试kubectl logs 查看 Pod 日志kubectl logs -f 实时输出日志kubectl logs -c 查看 Pod 中指定容器日志kubectl exec -it -- /bin/sh进入容器kubectl exec -it -c -- /bin/bash进入 Pod 指定容器kubectl get events --sort-by=.metadata.creationTimestamp查看事件按时间排序资源监控kubectl top nodes查看节点 CPU/内存使用情况(需安装 metrics-server)kubectl top pods查看 Pod CPU/内存使用情况命名空间管理kubectl get ns查看所有命名空间kubectl config set-context --current --namespace=kube-system切换默认命名空间kubectl get pods -n kube-system查看 kube-system 下的 Pod临时调试 Podkubectl run test --image=busybox -it --rm -- sh创建一个临时 Pod 并进入 shellYAML 输出与编辑kubectl get pod -o yaml查看 Pod YAML 配置kubectl edit deployment nginx在线编辑 Deploymentkubectl explain pod查看 Pod 的 API 定义和字段说明
K8s容器管理工具crictl (了解)
crictl 简介
crictl (克瑞 肯抽)是一个命令行工具,用来与 Kubernetes 容器运行时接口(CRI, Container Runtime Interface) 交互。
kubectl 管 Pod 的 API 资源;
crictl 管理 底层容器与镜像;
👉 它能替代 docker ps / docker logs / docker exec 等功能(但适配 CRI,而不是 Docker API)
crictl 常用命令分类
分类命令说明版本/运行时信息crictl --version查看 crictl 版本crictl info查看容器运行时信息(如 containerd 配置)Pod 管理crictl pods查看所有 Pod(底层 Runtime 视角)crictl inspectp 查看 Pod 详情crictl stopp 停止 Podcrictl rmp 删除 Pod容器管理crictl ps查看运行中的容器crictl ps -a查看所有容器(包括已退出)crictl inspect 查看容器详细信息crictl exec -it sh进入容器crictl stop 停止容器crictl rm 删除容器镜像管理crictl images查看本地镜像列表crictl pull nginx:latest拉取镜像crictl rmi nginx:latest删除镜像crictl inspecti 查看镜像详情日志调试crictl logs 查看容器日志crictl logs -f 实时查看日志
crictl 使用场景
Pod Pending/ContainerCreating 卡住时
kubectl describe pod只能看到高层信息- 用
crictl ps+crictl logs可以直接看容器启动日志
镜像拉取失败
crictl pull <image>手动拉镜像,确认是否能成功
容器异常退出
crictl ps -a找容器crictl inspect <id>看退出码、启动参数
替代 docker 命令
- 在 containerd 或 CRI-O 环境 下,
docker命令不可用,此时必须用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
K8S集群后台管理-Kuboard
参考文档
https://kuboard.cn/install/v3/install-built-in.html#%E9%83%A8%E7%BD%B2%E8%AE%A1%E5%88%92

#在master01节点上面安装docker-ce
[root@master01 .kube]# dnf install -y docker-ce
[root@master01 .kube]# systemctl start docker && systemctl enable docker
[root@harbor ~]# docker run -d \
--restart=unless-stopped \
--privileged \
--name=kuboard \
-p 8080:80/tcp \
-p 10081:10081/tcp \
-e KUBOARD_ENDPOINT="http://192.168.88.170:8080" \
-e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \
-v /root/kuboard-data:/data \
swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3
#安装完进行验证是否安装成功
[root@harbor ~]# docker ps |grep kuboard
c247872192a1 swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3 "/entrypoint.sh" 35 hours ago Up 35 hours 443/tcp, 0.0.0.0:10081->10081/tcp, [::]:10081->10081/tcp, 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp kuboard

服务访问
登录后台,通过服务器地址访问 http://ip:8080
默认用户名: admin,密码:Kuboard123



从master主控节点上面复制集群的连接信息
[root@node1 ~]# cd /root/.kube/
[root@node1 .kube]# cat config


比如

最后点击确定


